From 8dce24ed5fc3f77f1e3caddcbfa88cf0fcd17a70 Mon Sep 17 00:00:00 2001 From: No Author Date: Mon, 29 Oct 2001 12:42:33 +0000 Subject: [PATCH 0001/1313] New repository initialized by cvs2svn. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152685 13f79535-47bb-0310-9956-ffa450edef68 -- GitLab From 32e0972903c55452f01defb3322dc0ce9ef0dd58 Mon Sep 17 00:00:00 2001 From: Sam Ruby Date: Mon, 29 Oct 2001 12:42:33 +0000 Subject: [PATCH 0002/1313] Initial revision git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152686 13f79535-47bb-0310-9956-ffa450edef68 --- LICENSE | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..66e71199 --- /dev/null +++ b/LICENSE @@ -0,0 +1,53 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ -- GitLab From 96ac0670cf9944d4912ab25ec885a4bea651443d Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Mon, 29 Oct 2001 19:59:54 +0000 Subject: [PATCH 0003/1313] Initial revision git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152690 13f79535-47bb-0310-9956-ffa450edef68 --- .cvsignore | 3 + README | 62 + README.JustIce | 40 + TODO.JustIce | 35 + build.xml | 157 + docs/Faculty.java | 28 + docs/HelloWorld.java | 16 + docs/Peephole.java | 82 + docs/appendix.tex | 193 + docs/bool.java | 24 + docs/classfile.mdl | 2134 +++++++ docs/diagrams.tex | 19 + docs/eps/classfile.eps | 378 ++ docs/eps/classfile.fig | 173 + docs/eps/classgen.eps | 499 ++ docs/eps/classgen.fig | 302 + docs/eps/classloader.eps | 160 + docs/eps/classloader.fig | 47 + docs/eps/constantpool.eps | 399 ++ docs/eps/constantpool.fig | 211 + docs/eps/diagram.fig | 351 ++ docs/eps/il.eps | 513 ++ docs/eps/il.fig | 225 + docs/eps/instructions.eps | 445 ++ docs/eps/instructions.fig | 245 + docs/eps/javaclass.eps | 525 ++ docs/eps/javaclass.fig | 353 ++ docs/eps/jvm.eps | 218 + docs/eps/jvm.fig | 62 + docs/generic.mdl | 2860 ++++++++++ docs/manual.bib | 185 + docs/manual.ps | 4988 +++++++++++++++++ docs/manual.tex | 1079 ++++ docs/opt | 24 + docs/unopt | 24 + examples/HelloWorldBuilder.java | 157 + examples/JasminVisitor.java | 281 + examples/Mini/ASCII_CharStream.java | 381 ++ examples/Mini/ASTExpr.java | 292 + examples/Mini/ASTFactor.java | 37 + examples/Mini/ASTFunAppl.java | 221 + examples/Mini/ASTFunDecl.java | 395 ++ examples/Mini/ASTIdent.java | 118 + examples/Mini/ASTIfExpr.java | 156 + examples/Mini/ASTInteger.java | 73 + examples/Mini/ASTLetExpr.java | 159 + examples/Mini/ASTProgram.java | 301 + examples/Mini/ASTTerm.java | 37 + examples/Mini/EnvEntry.java | 13 + examples/Mini/Environment.java | 184 + examples/Mini/Function.java | 63 + examples/Mini/JJTMiniParserState.java | 123 + examples/Mini/Mini.bnf | 75 + examples/Mini/Mini.jj | 576 ++ examples/Mini/Mini.jjt | 293 + examples/Mini/MiniC.java | 154 + examples/Mini/MiniParser$JJCalls | Bin 0 -> 363 bytes examples/Mini/MiniParser.java | 991 ++++ examples/Mini/MiniParserConstants.java | 85 + examples/Mini/MiniParserTokenManager.java | 721 +++ examples/Mini/MiniParserTreeConstants.java | 33 + examples/Mini/Node.java | 35 + examples/Mini/ParseException.java | 191 + examples/Mini/README | 54 + examples/Mini/SimpleNode.java | 81 + examples/Mini/Token.java | 81 + examples/Mini/TokenMgrError.java | 133 + examples/Mini/Variable.java | 50 + examples/Mini/fac.mini | 10 + examples/Mini/fib.mini | 11 + examples/Mini/max.mini | 21 + examples/Package.java | 243 + examples/Peephole.java | 88 + examples/ProxyCreator.java | 105 + examples/helloify.java | 109 + examples/id.java | 47 + examples/listclass.java | 225 + examples/maxstack.java | 61 + examples/patchclass.java | 90 + lib/CCK.jar | Bin 0 -> 473400 bytes lib/Regex.jar | Bin 0 -> 29871 bytes src/java/org/apache/bcel/Constants.java | 768 +++ .../org/apache/bcel/ExceptionConstants.java | 123 + src/java/org/apache/bcel/Repository.java | 295 + .../apache/bcel/classfile/AccessFlags.java | 159 + .../org/apache/bcel/classfile/Attribute.java | 274 + .../apache/bcel/classfile/ClassParser.java | 329 ++ src/java/org/apache/bcel/classfile/Code.java | 373 ++ .../apache/bcel/classfile/CodeException.java | 227 + .../org/apache/bcel/classfile/Constant.java | 148 + .../org/apache/bcel/classfile/ConstantCP.java | 154 + .../apache/bcel/classfile/ConstantClass.java | 153 + .../apache/bcel/classfile/ConstantDouble.java | 142 + .../bcel/classfile/ConstantFieldref.java | 104 + .../apache/bcel/classfile/ConstantFloat.java | 141 + .../bcel/classfile/ConstantInteger.java | 148 + .../classfile/ConstantInterfaceMethodref.java | 104 + .../apache/bcel/classfile/ConstantLong.java | 139 + .../bcel/classfile/ConstantMethodref.java | 104 + .../bcel/classfile/ConstantNameAndType.java | 171 + .../apache/bcel/classfile/ConstantObject.java | 69 + .../apache/bcel/classfile/ConstantPool.java | 369 ++ .../apache/bcel/classfile/ConstantString.java | 147 + .../apache/bcel/classfile/ConstantUtf8.java | 143 + .../apache/bcel/classfile/ConstantValue.java | 204 + .../org/apache/bcel/classfile/Deprecated.java | 170 + .../bcel/classfile/DescendingVisitor.java | 351 ++ .../apache/bcel/classfile/EmptyVisitor.java | 104 + .../apache/bcel/classfile/ExceptionTable.java | 202 + src/java/org/apache/bcel/classfile/Field.java | 157 + .../apache/bcel/classfile/FieldOrMethod.java | 223 + .../org/apache/bcel/classfile/InnerClass.java | 221 + .../apache/bcel/classfile/InnerClasses.java | 181 + .../org/apache/bcel/classfile/JavaClass.java | 611 ++ .../org/apache/bcel/classfile/LineNumber.java | 164 + .../bcel/classfile/LineNumberTable.java | 234 + .../apache/bcel/classfile/LocalVariable.java | 257 + .../bcel/classfile/LocalVariableTable.java | 196 + .../org/apache/bcel/classfile/Method.java | 216 + src/java/org/apache/bcel/classfile/Node.java | 65 + .../org/apache/bcel/classfile/PMGClass.java | 189 + .../org/apache/bcel/classfile/Signature.java | 295 + .../org/apache/bcel/classfile/SourceFile.java | 165 + .../org/apache/bcel/classfile/StackMap.java | 185 + .../apache/bcel/classfile/StackMapEntry.java | 209 + .../apache/bcel/classfile/StackMapType.java | 172 + .../org/apache/bcel/classfile/Synthetic.java | 171 + .../org/apache/bcel/classfile/Unknown.java | 205 + .../org/apache/bcel/classfile/Utility.java | 1355 +++++ .../org/apache/bcel/classfile/Visitor.java | 100 + src/java/org/apache/bcel/classfile/lic | 53 + .../org/apache/bcel/classfile/package.html | 14 + src/java/org/apache/bcel/generic/AALOAD.java | 87 + src/java/org/apache/bcel/generic/AASTORE.java | 87 + .../org/apache/bcel/generic/ACONST_NULL.java | 94 + src/java/org/apache/bcel/generic/ALOAD.java | 92 + .../org/apache/bcel/generic/ANEWARRAY.java | 114 + src/java/org/apache/bcel/generic/ARETURN.java | 88 + .../org/apache/bcel/generic/ARRAYLENGTH.java | 92 + src/java/org/apache/bcel/generic/ASTORE.java | 92 + src/java/org/apache/bcel/generic/ATHROW.java | 92 + .../bcel/generic/AllocationInstruction.java | 64 + .../bcel/generic/ArithmeticInstruction.java | 106 + .../apache/bcel/generic/ArrayInstruction.java | 106 + .../org/apache/bcel/generic/ArrayType.java | 156 + src/java/org/apache/bcel/generic/BALOAD.java | 87 + src/java/org/apache/bcel/generic/BASTORE.java | 87 + src/java/org/apache/bcel/generic/BIPUSH.java | 132 + .../org/apache/bcel/generic/BREAKPOINT.java | 80 + .../org/apache/bcel/generic/BasicType.java | 101 + .../org/apache/bcel/generic/BranchHandle.java | 151 + .../bcel/generic/BranchInstruction.java | 246 + src/java/org/apache/bcel/generic/CALOAD.java | 87 + src/java/org/apache/bcel/generic/CASTORE.java | 87 + .../org/apache/bcel/generic/CHECKCAST.java | 117 + .../apache/bcel/generic/CPInstruction.java | 166 + .../org/apache/bcel/generic/ClassGen.java | 434 ++ .../bcel/generic/ClassGenException.java | 68 + .../apache/bcel/generic/ClassObserver.java | 67 + .../apache/bcel/generic/CodeExceptionGen.java | 201 + .../bcel/generic/CompoundInstruction.java | 76 + .../apache/bcel/generic/ConstantPoolGen.java | 782 +++ .../bcel/generic/ConstantPushInstruction.java | 70 + .../bcel/generic/ConversionInstruction.java | 102 + src/java/org/apache/bcel/generic/D2F.java | 87 + src/java/org/apache/bcel/generic/D2I.java | 87 + src/java/org/apache/bcel/generic/D2L.java | 87 + src/java/org/apache/bcel/generic/DADD.java | 88 + src/java/org/apache/bcel/generic/DALOAD.java | 87 + src/java/org/apache/bcel/generic/DASTORE.java | 87 + src/java/org/apache/bcel/generic/DCMPG.java | 93 + src/java/org/apache/bcel/generic/DCMPL.java | 92 + src/java/org/apache/bcel/generic/DCONST.java | 112 + src/java/org/apache/bcel/generic/DDIV.java | 88 + src/java/org/apache/bcel/generic/DLOAD.java | 92 + src/java/org/apache/bcel/generic/DMUL.java | 88 + src/java/org/apache/bcel/generic/DNEG.java | 85 + src/java/org/apache/bcel/generic/DREM.java | 88 + src/java/org/apache/bcel/generic/DRETURN.java | 87 + src/java/org/apache/bcel/generic/DSTORE.java | 92 + src/java/org/apache/bcel/generic/DSUB.java | 88 + src/java/org/apache/bcel/generic/DUP.java | 84 + src/java/org/apache/bcel/generic/DUP2.java | 84 + src/java/org/apache/bcel/generic/DUP2_X1.java | 82 + src/java/org/apache/bcel/generic/DUP2_X2.java | 82 + src/java/org/apache/bcel/generic/DUP_X1.java | 82 + src/java/org/apache/bcel/generic/DUP_X2.java | 82 + .../org/apache/bcel/generic/EmptyVisitor.java | 244 + .../apache/bcel/generic/ExceptionThrower.java | 79 + src/java/org/apache/bcel/generic/F2D.java | 87 + src/java/org/apache/bcel/generic/F2I.java | 87 + src/java/org/apache/bcel/generic/F2L.java | 87 + src/java/org/apache/bcel/generic/FADD.java | 87 + src/java/org/apache/bcel/generic/FALOAD.java | 87 + src/java/org/apache/bcel/generic/FASTORE.java | 87 + src/java/org/apache/bcel/generic/FCMPG.java | 91 + src/java/org/apache/bcel/generic/FCMPL.java | 91 + src/java/org/apache/bcel/generic/FCONST.java | 114 + src/java/org/apache/bcel/generic/FDIV.java | 87 + src/java/org/apache/bcel/generic/FLOAD.java | 92 + src/java/org/apache/bcel/generic/FMUL.java | 87 + src/java/org/apache/bcel/generic/FNEG.java | 85 + src/java/org/apache/bcel/generic/FREM.java | 87 + src/java/org/apache/bcel/generic/FRETURN.java | 87 + src/java/org/apache/bcel/generic/FSTORE.java | 92 + src/java/org/apache/bcel/generic/FSUB.java | 87 + .../org/apache/bcel/generic/FieldGen.java | 310 + .../bcel/generic/FieldGenOrMethodGen.java | 129 + .../apache/bcel/generic/FieldInstruction.java | 116 + .../apache/bcel/generic/FieldObserver.java | 67 + .../apache/bcel/generic/FieldOrMethod.java | 117 + .../org/apache/bcel/generic/GETFIELD.java | 117 + .../org/apache/bcel/generic/GETSTATIC.java | 113 + src/java/org/apache/bcel/generic/GOTO.java | 122 + src/java/org/apache/bcel/generic/GOTO_W.java | 110 + .../apache/bcel/generic/GotoInstruction.java | 75 + src/java/org/apache/bcel/generic/I2B.java | 87 + src/java/org/apache/bcel/generic/I2C.java | 87 + src/java/org/apache/bcel/generic/I2D.java | 87 + src/java/org/apache/bcel/generic/I2F.java | 87 + src/java/org/apache/bcel/generic/I2L.java | 87 + src/java/org/apache/bcel/generic/I2S.java | 85 + src/java/org/apache/bcel/generic/IADD.java | 87 + src/java/org/apache/bcel/generic/IALOAD.java | 88 + src/java/org/apache/bcel/generic/IAND.java | 85 + src/java/org/apache/bcel/generic/IASTORE.java | 88 + src/java/org/apache/bcel/generic/ICONST.java | 110 + src/java/org/apache/bcel/generic/IDIV.java | 94 + src/java/org/apache/bcel/generic/IFEQ.java | 98 + src/java/org/apache/bcel/generic/IFGE.java | 98 + src/java/org/apache/bcel/generic/IFGT.java | 98 + src/java/org/apache/bcel/generic/IFLE.java | 98 + src/java/org/apache/bcel/generic/IFLT.java | 98 + src/java/org/apache/bcel/generic/IFNE.java | 98 + .../org/apache/bcel/generic/IFNONNULL.java | 97 + src/java/org/apache/bcel/generic/IFNULL.java | 98 + .../org/apache/bcel/generic/IF_ACMPEQ.java | 97 + .../org/apache/bcel/generic/IF_ACMPNE.java | 98 + .../org/apache/bcel/generic/IF_ICMPEQ.java | 98 + .../org/apache/bcel/generic/IF_ICMPGE.java | 98 + .../org/apache/bcel/generic/IF_ICMPGT.java | 98 + .../org/apache/bcel/generic/IF_ICMPLE.java | 98 + .../org/apache/bcel/generic/IF_ICMPLT.java | 98 + .../org/apache/bcel/generic/IF_ICMPNE.java | 98 + src/java/org/apache/bcel/generic/IINC.java | 179 + src/java/org/apache/bcel/generic/ILOAD.java | 92 + src/java/org/apache/bcel/generic/IMPDEP1.java | 80 + src/java/org/apache/bcel/generic/IMPDEP2.java | 80 + src/java/org/apache/bcel/generic/IMUL.java | 87 + src/java/org/apache/bcel/generic/INEG.java | 85 + .../org/apache/bcel/generic/INSTANCEOF.java | 106 + .../apache/bcel/generic/INVOKEINTERFACE.java | 163 + .../apache/bcel/generic/INVOKESPECIAL.java | 113 + .../org/apache/bcel/generic/INVOKESTATIC.java | 110 + .../apache/bcel/generic/INVOKEVIRTUAL.java | 112 + src/java/org/apache/bcel/generic/IOR.java | 85 + src/java/org/apache/bcel/generic/IREM.java | 94 + src/java/org/apache/bcel/generic/IRETURN.java | 87 + src/java/org/apache/bcel/generic/ISHL.java | 85 + src/java/org/apache/bcel/generic/ISHR.java | 85 + src/java/org/apache/bcel/generic/ISTORE.java | 92 + src/java/org/apache/bcel/generic/ISUB.java | 87 + src/java/org/apache/bcel/generic/IUSHR.java | 85 + src/java/org/apache/bcel/generic/IXOR.java | 85 + .../apache/bcel/generic/IfInstruction.java | 82 + .../bcel/generic/IndexedInstruction.java | 68 + .../org/apache/bcel/generic/Instruction.java | 276 + .../bcel/generic/InstructionConstants.java | 326 ++ .../bcel/generic/InstructionFactory.java | 593 ++ .../bcel/generic/InstructionHandle.java | 284 + .../apache/bcel/generic/InstructionList.java | 1287 +++++ .../bcel/generic/InstructionListObserver.java | 67 + .../bcel/generic/InstructionTargeter.java | 70 + .../bcel/generic/InvokeInstruction.java | 146 + src/java/org/apache/bcel/generic/JSR.java | 119 + src/java/org/apache/bcel/generic/JSR_W.java | 110 + .../apache/bcel/generic/JsrInstruction.java | 116 + src/java/org/apache/bcel/generic/L2D.java | 85 + src/java/org/apache/bcel/generic/L2F.java | 85 + src/java/org/apache/bcel/generic/L2I.java | 85 + src/java/org/apache/bcel/generic/LADD.java | 86 + src/java/org/apache/bcel/generic/LALOAD.java | 87 + src/java/org/apache/bcel/generic/LAND.java | 86 + src/java/org/apache/bcel/generic/LASTORE.java | 87 + src/java/org/apache/bcel/generic/LCMP.java | 82 + src/java/org/apache/bcel/generic/LCONST.java | 112 + src/java/org/apache/bcel/generic/LDC.java | 172 + src/java/org/apache/bcel/generic/LDC2_W.java | 116 + src/java/org/apache/bcel/generic/LDC_W.java | 87 + src/java/org/apache/bcel/generic/LDIV.java | 91 + src/java/org/apache/bcel/generic/LLOAD.java | 89 + src/java/org/apache/bcel/generic/LMUL.java | 86 + src/java/org/apache/bcel/generic/LNEG.java | 85 + .../org/apache/bcel/generic/LOOKUPSWITCH.java | 133 + src/java/org/apache/bcel/generic/LOR.java | 85 + src/java/org/apache/bcel/generic/LREM.java | 88 + src/java/org/apache/bcel/generic/LRETURN.java | 85 + src/java/org/apache/bcel/generic/LSHL.java | 85 + src/java/org/apache/bcel/generic/LSHR.java | 85 + src/java/org/apache/bcel/generic/LSTORE.java | 89 + src/java/org/apache/bcel/generic/LSUB.java | 86 + src/java/org/apache/bcel/generic/LUSHR.java | 85 + src/java/org/apache/bcel/generic/LXOR.java | 85 + .../apache/bcel/generic/LineNumberGen.java | 130 + .../org/apache/bcel/generic/LoadClass.java | 86 + .../apache/bcel/generic/LoadInstruction.java | 101 + .../apache/bcel/generic/LocalVariableGen.java | 191 + .../generic/LocalVariableInstruction.java | 227 + .../org/apache/bcel/generic/MONITORENTER.java | 88 + .../org/apache/bcel/generic/MONITOREXIT.java | 88 + .../apache/bcel/generic/MULTIANEWARRAY.java | 172 + .../org/apache/bcel/generic/MethodGen.java | 938 ++++ .../apache/bcel/generic/MethodObserver.java | 67 + src/java/org/apache/bcel/generic/NEW.java | 111 + .../org/apache/bcel/generic/NEWARRAY.java | 141 + src/java/org/apache/bcel/generic/NOP.java | 80 + .../apache/bcel/generic/NamedAndTyped.java | 71 + .../org/apache/bcel/generic/ObjectType.java | 136 + src/java/org/apache/bcel/generic/POP.java | 85 + src/java/org/apache/bcel/generic/POP2.java | 85 + src/java/org/apache/bcel/generic/PUSH.java | 196 + .../org/apache/bcel/generic/PUTFIELD.java | 114 + .../org/apache/bcel/generic/PUTSTATIC.java | 114 + .../apache/bcel/generic/PopInstruction.java | 68 + .../apache/bcel/generic/PushInstruction.java | 73 + src/java/org/apache/bcel/generic/RET.java | 161 + src/java/org/apache/bcel/generic/RETURN.java | 85 + .../apache/bcel/generic/ReferenceType.java | 258 + .../bcel/generic/ReturnInstruction.java | 104 + .../bcel/generic/ReturnaddressType.java | 102 + src/java/org/apache/bcel/generic/SALOAD.java | 85 + src/java/org/apache/bcel/generic/SASTORE.java | 85 + src/java/org/apache/bcel/generic/SIPUSH.java | 129 + src/java/org/apache/bcel/generic/SWAP.java | 84 + src/java/org/apache/bcel/generic/SWITCH.java | 183 + src/java/org/apache/bcel/generic/Select.java | 256 + .../apache/bcel/generic/StackConsumer.java | 68 + .../apache/bcel/generic/StackInstruction.java | 83 + .../apache/bcel/generic/StackProducer.java | 69 + .../apache/bcel/generic/StoreInstruction.java | 102 + .../org/apache/bcel/generic/TABLESWITCH.java | 147 + .../bcel/generic/TargetLostException.java | 100 + src/java/org/apache/bcel/generic/Type.java | 232 + .../apache/bcel/generic/TypedInstruction.java | 67 + .../bcel/generic/UnconditionalBranch.java | 67 + .../generic/VariableLengthInstruction.java | 70 + src/java/org/apache/bcel/generic/Visitor.java | 247 + src/java/org/apache/bcel/generic/package.html | 16 + src/java/org/apache/bcel/package.html | 17 + .../org/apache/bcel/util/AttributeHTML.java | 256 + .../org/apache/bcel/util/ByteSequence.java | 82 + src/java/org/apache/bcel/util/Class2HTML.java | 262 + .../org/apache/bcel/util/ClassLoader.java | 200 + src/java/org/apache/bcel/util/ClassPath.java | 322 ++ src/java/org/apache/bcel/util/ClassQueue.java | 78 + src/java/org/apache/bcel/util/ClassStack.java | 73 + .../org/apache/bcel/util/ClassVector.java | 79 + src/java/org/apache/bcel/util/CodeHTML.java | 618 ++ .../org/apache/bcel/util/ConstantHTML.java | 262 + .../apache/bcel/util/InstructionFinder.java | 440 ++ .../org/apache/bcel/util/JavaWrapper.java | 152 + src/java/org/apache/bcel/util/MethodHTML.java | 199 + src/java/org/apache/bcel/util/package.html | 25 + .../bcel/verifier/GraphicalVerifier.java | 109 + .../apache/bcel/verifier/NativeVerifier.java | 116 + .../apache/bcel/verifier/PassVerifier.java | 143 + .../apache/bcel/verifier/TransitiveHull.java | 138 + .../bcel/verifier/VerificationResult.java | 138 + .../org/apache/bcel/verifier/Verifier.java | 283 + .../bcel/verifier/VerifierAppFrame.java | 390 ++ .../apache/bcel/verifier/VerifierFactory.java | 142 + .../verifier/VerifierFactoryListModel.java | 107 + .../verifier/VerifierFactoryObserver.java | 76 + .../apache/bcel/verifier/VerifyDialog.java | 559 ++ .../exc/AssertionViolatedException.java | 115 + .../exc/ClassConstraintException.java | 83 + .../verifier/exc/CodeConstraintException.java | 77 + .../verifier/exc/InvalidMethodException.java | 71 + .../exc/LinkingConstraintException.java | 74 + .../bcel/verifier/exc/LoadingException.java | 82 + ...ocalVariableInfoInconsistentException.java | 81 + .../exc/StaticCodeConstraintException.java | 71 + ...ticCodeInstructionConstraintException.java | 74 + ...InstructionOperandConstraintException.java | 74 + .../StructuralCodeConstraintException.java | 82 + .../org/apache/bcel/verifier/exc/Utility.java | 76 + .../verifier/exc/VerificationException.java | 82 + .../VerifierConstraintViolatedException.java | 107 + .../org/apache/bcel/verifier/exc/package.html | 24 + .../org/apache/bcel/verifier/package.html | 25 + .../bcel/verifier/statics/DOUBLE_Upper.java | 79 + .../apache/bcel/verifier/statics/IntList.java | 85 + .../bcel/verifier/statics/LONG_Upper.java | 79 + .../verifier/statics/LocalVariableInfo.java | 145 + .../verifier/statics/LocalVariablesInfo.java | 113 + .../bcel/verifier/statics/Pass1Verifier.java | 214 + .../bcel/verifier/statics/Pass2Verifier.java | 1334 +++++ .../bcel/verifier/statics/Pass3aVerifier.java | 1070 ++++ .../statics/StringRepresentation.java | 202 + .../apache/bcel/verifier/statics/package.html | 26 + .../structurals/ControlFlowGraph.java | 466 ++ .../structurals/ExceptionHandler.java | 93 + .../structurals/ExceptionHandlers.java | 107 + .../structurals/ExecutionVisitor.java | 1126 ++++ .../bcel/verifier/structurals/Frame.java | 153 + .../verifier/structurals/GenericArray.java | 66 + .../structurals/InstConstraintVisitor.java | 2652 +++++++++ .../structurals/InstructionContext.java | 141 + .../verifier/structurals/LocalVariables.java | 229 + .../verifier/structurals/OperandStack.java | 275 + .../verifier/structurals/Pass3bVerifier.java | 366 ++ .../bcel/verifier/structurals/Subroutine.java | 126 + .../verifier/structurals/Subroutines.java | 668 +++ .../structurals/UninitializedObjectType.java | 97 + .../bcel/verifier/structurals/package.html | 27 + 415 files changed, 78788 insertions(+) create mode 100644 .cvsignore create mode 100644 README create mode 100644 README.JustIce create mode 100644 TODO.JustIce create mode 100644 build.xml create mode 100644 docs/Faculty.java create mode 100644 docs/HelloWorld.java create mode 100644 docs/Peephole.java create mode 100644 docs/appendix.tex create mode 100644 docs/bool.java create mode 100644 docs/classfile.mdl create mode 100644 docs/diagrams.tex create mode 100644 docs/eps/classfile.eps create mode 100644 docs/eps/classfile.fig create mode 100644 docs/eps/classgen.eps create mode 100644 docs/eps/classgen.fig create mode 100644 docs/eps/classloader.eps create mode 100644 docs/eps/classloader.fig create mode 100644 docs/eps/constantpool.eps create mode 100644 docs/eps/constantpool.fig create mode 100644 docs/eps/diagram.fig create mode 100644 docs/eps/il.eps create mode 100644 docs/eps/il.fig create mode 100644 docs/eps/instructions.eps create mode 100644 docs/eps/instructions.fig create mode 100644 docs/eps/javaclass.eps create mode 100644 docs/eps/javaclass.fig create mode 100644 docs/eps/jvm.eps create mode 100644 docs/eps/jvm.fig create mode 100644 docs/generic.mdl create mode 100644 docs/manual.bib create mode 100644 docs/manual.ps create mode 100644 docs/manual.tex create mode 100644 docs/opt create mode 100644 docs/unopt create mode 100644 examples/HelloWorldBuilder.java create mode 100644 examples/JasminVisitor.java create mode 100644 examples/Mini/ASCII_CharStream.java create mode 100644 examples/Mini/ASTExpr.java create mode 100644 examples/Mini/ASTFactor.java create mode 100644 examples/Mini/ASTFunAppl.java create mode 100644 examples/Mini/ASTFunDecl.java create mode 100644 examples/Mini/ASTIdent.java create mode 100644 examples/Mini/ASTIfExpr.java create mode 100644 examples/Mini/ASTInteger.java create mode 100644 examples/Mini/ASTLetExpr.java create mode 100644 examples/Mini/ASTProgram.java create mode 100644 examples/Mini/ASTTerm.java create mode 100644 examples/Mini/EnvEntry.java create mode 100644 examples/Mini/Environment.java create mode 100644 examples/Mini/Function.java create mode 100644 examples/Mini/JJTMiniParserState.java create mode 100644 examples/Mini/Mini.bnf create mode 100644 examples/Mini/Mini.jj create mode 100644 examples/Mini/Mini.jjt create mode 100644 examples/Mini/MiniC.java create mode 100644 examples/Mini/MiniParser$JJCalls create mode 100644 examples/Mini/MiniParser.java create mode 100644 examples/Mini/MiniParserConstants.java create mode 100644 examples/Mini/MiniParserTokenManager.java create mode 100644 examples/Mini/MiniParserTreeConstants.java create mode 100644 examples/Mini/Node.java create mode 100644 examples/Mini/ParseException.java create mode 100644 examples/Mini/README create mode 100644 examples/Mini/SimpleNode.java create mode 100644 examples/Mini/Token.java create mode 100644 examples/Mini/TokenMgrError.java create mode 100644 examples/Mini/Variable.java create mode 100644 examples/Mini/fac.mini create mode 100644 examples/Mini/fib.mini create mode 100644 examples/Mini/max.mini create mode 100644 examples/Package.java create mode 100644 examples/Peephole.java create mode 100644 examples/ProxyCreator.java create mode 100644 examples/helloify.java create mode 100644 examples/id.java create mode 100644 examples/listclass.java create mode 100644 examples/maxstack.java create mode 100644 examples/patchclass.java create mode 100644 lib/CCK.jar create mode 100644 lib/Regex.jar create mode 100644 src/java/org/apache/bcel/Constants.java create mode 100644 src/java/org/apache/bcel/ExceptionConstants.java create mode 100644 src/java/org/apache/bcel/Repository.java create mode 100644 src/java/org/apache/bcel/classfile/AccessFlags.java create mode 100644 src/java/org/apache/bcel/classfile/Attribute.java create mode 100644 src/java/org/apache/bcel/classfile/ClassParser.java create mode 100644 src/java/org/apache/bcel/classfile/Code.java create mode 100644 src/java/org/apache/bcel/classfile/CodeException.java create mode 100644 src/java/org/apache/bcel/classfile/Constant.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantCP.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantClass.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantDouble.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantFieldref.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantFloat.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantInteger.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantLong.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantMethodref.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantNameAndType.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantObject.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantPool.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantString.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantUtf8.java create mode 100644 src/java/org/apache/bcel/classfile/ConstantValue.java create mode 100644 src/java/org/apache/bcel/classfile/Deprecated.java create mode 100644 src/java/org/apache/bcel/classfile/DescendingVisitor.java create mode 100644 src/java/org/apache/bcel/classfile/EmptyVisitor.java create mode 100644 src/java/org/apache/bcel/classfile/ExceptionTable.java create mode 100644 src/java/org/apache/bcel/classfile/Field.java create mode 100644 src/java/org/apache/bcel/classfile/FieldOrMethod.java create mode 100644 src/java/org/apache/bcel/classfile/InnerClass.java create mode 100644 src/java/org/apache/bcel/classfile/InnerClasses.java create mode 100644 src/java/org/apache/bcel/classfile/JavaClass.java create mode 100644 src/java/org/apache/bcel/classfile/LineNumber.java create mode 100644 src/java/org/apache/bcel/classfile/LineNumberTable.java create mode 100644 src/java/org/apache/bcel/classfile/LocalVariable.java create mode 100644 src/java/org/apache/bcel/classfile/LocalVariableTable.java create mode 100644 src/java/org/apache/bcel/classfile/Method.java create mode 100644 src/java/org/apache/bcel/classfile/Node.java create mode 100644 src/java/org/apache/bcel/classfile/PMGClass.java create mode 100644 src/java/org/apache/bcel/classfile/Signature.java create mode 100644 src/java/org/apache/bcel/classfile/SourceFile.java create mode 100644 src/java/org/apache/bcel/classfile/StackMap.java create mode 100644 src/java/org/apache/bcel/classfile/StackMapEntry.java create mode 100644 src/java/org/apache/bcel/classfile/StackMapType.java create mode 100644 src/java/org/apache/bcel/classfile/Synthetic.java create mode 100644 src/java/org/apache/bcel/classfile/Unknown.java create mode 100644 src/java/org/apache/bcel/classfile/Utility.java create mode 100644 src/java/org/apache/bcel/classfile/Visitor.java create mode 100644 src/java/org/apache/bcel/classfile/lic create mode 100644 src/java/org/apache/bcel/classfile/package.html create mode 100644 src/java/org/apache/bcel/generic/AALOAD.java create mode 100644 src/java/org/apache/bcel/generic/AASTORE.java create mode 100644 src/java/org/apache/bcel/generic/ACONST_NULL.java create mode 100644 src/java/org/apache/bcel/generic/ALOAD.java create mode 100644 src/java/org/apache/bcel/generic/ANEWARRAY.java create mode 100644 src/java/org/apache/bcel/generic/ARETURN.java create mode 100644 src/java/org/apache/bcel/generic/ARRAYLENGTH.java create mode 100644 src/java/org/apache/bcel/generic/ASTORE.java create mode 100644 src/java/org/apache/bcel/generic/ATHROW.java create mode 100644 src/java/org/apache/bcel/generic/AllocationInstruction.java create mode 100644 src/java/org/apache/bcel/generic/ArithmeticInstruction.java create mode 100644 src/java/org/apache/bcel/generic/ArrayInstruction.java create mode 100644 src/java/org/apache/bcel/generic/ArrayType.java create mode 100644 src/java/org/apache/bcel/generic/BALOAD.java create mode 100644 src/java/org/apache/bcel/generic/BASTORE.java create mode 100644 src/java/org/apache/bcel/generic/BIPUSH.java create mode 100644 src/java/org/apache/bcel/generic/BREAKPOINT.java create mode 100644 src/java/org/apache/bcel/generic/BasicType.java create mode 100644 src/java/org/apache/bcel/generic/BranchHandle.java create mode 100644 src/java/org/apache/bcel/generic/BranchInstruction.java create mode 100644 src/java/org/apache/bcel/generic/CALOAD.java create mode 100644 src/java/org/apache/bcel/generic/CASTORE.java create mode 100644 src/java/org/apache/bcel/generic/CHECKCAST.java create mode 100644 src/java/org/apache/bcel/generic/CPInstruction.java create mode 100644 src/java/org/apache/bcel/generic/ClassGen.java create mode 100644 src/java/org/apache/bcel/generic/ClassGenException.java create mode 100644 src/java/org/apache/bcel/generic/ClassObserver.java create mode 100644 src/java/org/apache/bcel/generic/CodeExceptionGen.java create mode 100644 src/java/org/apache/bcel/generic/CompoundInstruction.java create mode 100644 src/java/org/apache/bcel/generic/ConstantPoolGen.java create mode 100644 src/java/org/apache/bcel/generic/ConstantPushInstruction.java create mode 100644 src/java/org/apache/bcel/generic/ConversionInstruction.java create mode 100644 src/java/org/apache/bcel/generic/D2F.java create mode 100644 src/java/org/apache/bcel/generic/D2I.java create mode 100644 src/java/org/apache/bcel/generic/D2L.java create mode 100644 src/java/org/apache/bcel/generic/DADD.java create mode 100644 src/java/org/apache/bcel/generic/DALOAD.java create mode 100644 src/java/org/apache/bcel/generic/DASTORE.java create mode 100644 src/java/org/apache/bcel/generic/DCMPG.java create mode 100644 src/java/org/apache/bcel/generic/DCMPL.java create mode 100644 src/java/org/apache/bcel/generic/DCONST.java create mode 100644 src/java/org/apache/bcel/generic/DDIV.java create mode 100644 src/java/org/apache/bcel/generic/DLOAD.java create mode 100644 src/java/org/apache/bcel/generic/DMUL.java create mode 100644 src/java/org/apache/bcel/generic/DNEG.java create mode 100644 src/java/org/apache/bcel/generic/DREM.java create mode 100644 src/java/org/apache/bcel/generic/DRETURN.java create mode 100644 src/java/org/apache/bcel/generic/DSTORE.java create mode 100644 src/java/org/apache/bcel/generic/DSUB.java create mode 100644 src/java/org/apache/bcel/generic/DUP.java create mode 100644 src/java/org/apache/bcel/generic/DUP2.java create mode 100644 src/java/org/apache/bcel/generic/DUP2_X1.java create mode 100644 src/java/org/apache/bcel/generic/DUP2_X2.java create mode 100644 src/java/org/apache/bcel/generic/DUP_X1.java create mode 100644 src/java/org/apache/bcel/generic/DUP_X2.java create mode 100644 src/java/org/apache/bcel/generic/EmptyVisitor.java create mode 100644 src/java/org/apache/bcel/generic/ExceptionThrower.java create mode 100644 src/java/org/apache/bcel/generic/F2D.java create mode 100644 src/java/org/apache/bcel/generic/F2I.java create mode 100644 src/java/org/apache/bcel/generic/F2L.java create mode 100644 src/java/org/apache/bcel/generic/FADD.java create mode 100644 src/java/org/apache/bcel/generic/FALOAD.java create mode 100644 src/java/org/apache/bcel/generic/FASTORE.java create mode 100644 src/java/org/apache/bcel/generic/FCMPG.java create mode 100644 src/java/org/apache/bcel/generic/FCMPL.java create mode 100644 src/java/org/apache/bcel/generic/FCONST.java create mode 100644 src/java/org/apache/bcel/generic/FDIV.java create mode 100644 src/java/org/apache/bcel/generic/FLOAD.java create mode 100644 src/java/org/apache/bcel/generic/FMUL.java create mode 100644 src/java/org/apache/bcel/generic/FNEG.java create mode 100644 src/java/org/apache/bcel/generic/FREM.java create mode 100644 src/java/org/apache/bcel/generic/FRETURN.java create mode 100644 src/java/org/apache/bcel/generic/FSTORE.java create mode 100644 src/java/org/apache/bcel/generic/FSUB.java create mode 100644 src/java/org/apache/bcel/generic/FieldGen.java create mode 100644 src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java create mode 100644 src/java/org/apache/bcel/generic/FieldInstruction.java create mode 100644 src/java/org/apache/bcel/generic/FieldObserver.java create mode 100644 src/java/org/apache/bcel/generic/FieldOrMethod.java create mode 100644 src/java/org/apache/bcel/generic/GETFIELD.java create mode 100644 src/java/org/apache/bcel/generic/GETSTATIC.java create mode 100644 src/java/org/apache/bcel/generic/GOTO.java create mode 100644 src/java/org/apache/bcel/generic/GOTO_W.java create mode 100644 src/java/org/apache/bcel/generic/GotoInstruction.java create mode 100644 src/java/org/apache/bcel/generic/I2B.java create mode 100644 src/java/org/apache/bcel/generic/I2C.java create mode 100644 src/java/org/apache/bcel/generic/I2D.java create mode 100644 src/java/org/apache/bcel/generic/I2F.java create mode 100644 src/java/org/apache/bcel/generic/I2L.java create mode 100644 src/java/org/apache/bcel/generic/I2S.java create mode 100644 src/java/org/apache/bcel/generic/IADD.java create mode 100644 src/java/org/apache/bcel/generic/IALOAD.java create mode 100644 src/java/org/apache/bcel/generic/IAND.java create mode 100644 src/java/org/apache/bcel/generic/IASTORE.java create mode 100644 src/java/org/apache/bcel/generic/ICONST.java create mode 100644 src/java/org/apache/bcel/generic/IDIV.java create mode 100644 src/java/org/apache/bcel/generic/IFEQ.java create mode 100644 src/java/org/apache/bcel/generic/IFGE.java create mode 100644 src/java/org/apache/bcel/generic/IFGT.java create mode 100644 src/java/org/apache/bcel/generic/IFLE.java create mode 100644 src/java/org/apache/bcel/generic/IFLT.java create mode 100644 src/java/org/apache/bcel/generic/IFNE.java create mode 100644 src/java/org/apache/bcel/generic/IFNONNULL.java create mode 100644 src/java/org/apache/bcel/generic/IFNULL.java create mode 100644 src/java/org/apache/bcel/generic/IF_ACMPEQ.java create mode 100644 src/java/org/apache/bcel/generic/IF_ACMPNE.java create mode 100644 src/java/org/apache/bcel/generic/IF_ICMPEQ.java create mode 100644 src/java/org/apache/bcel/generic/IF_ICMPGE.java create mode 100644 src/java/org/apache/bcel/generic/IF_ICMPGT.java create mode 100644 src/java/org/apache/bcel/generic/IF_ICMPLE.java create mode 100644 src/java/org/apache/bcel/generic/IF_ICMPLT.java create mode 100644 src/java/org/apache/bcel/generic/IF_ICMPNE.java create mode 100644 src/java/org/apache/bcel/generic/IINC.java create mode 100644 src/java/org/apache/bcel/generic/ILOAD.java create mode 100644 src/java/org/apache/bcel/generic/IMPDEP1.java create mode 100644 src/java/org/apache/bcel/generic/IMPDEP2.java create mode 100644 src/java/org/apache/bcel/generic/IMUL.java create mode 100644 src/java/org/apache/bcel/generic/INEG.java create mode 100644 src/java/org/apache/bcel/generic/INSTANCEOF.java create mode 100644 src/java/org/apache/bcel/generic/INVOKEINTERFACE.java create mode 100644 src/java/org/apache/bcel/generic/INVOKESPECIAL.java create mode 100644 src/java/org/apache/bcel/generic/INVOKESTATIC.java create mode 100644 src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java create mode 100644 src/java/org/apache/bcel/generic/IOR.java create mode 100644 src/java/org/apache/bcel/generic/IREM.java create mode 100644 src/java/org/apache/bcel/generic/IRETURN.java create mode 100644 src/java/org/apache/bcel/generic/ISHL.java create mode 100644 src/java/org/apache/bcel/generic/ISHR.java create mode 100644 src/java/org/apache/bcel/generic/ISTORE.java create mode 100644 src/java/org/apache/bcel/generic/ISUB.java create mode 100644 src/java/org/apache/bcel/generic/IUSHR.java create mode 100644 src/java/org/apache/bcel/generic/IXOR.java create mode 100644 src/java/org/apache/bcel/generic/IfInstruction.java create mode 100644 src/java/org/apache/bcel/generic/IndexedInstruction.java create mode 100644 src/java/org/apache/bcel/generic/Instruction.java create mode 100644 src/java/org/apache/bcel/generic/InstructionConstants.java create mode 100644 src/java/org/apache/bcel/generic/InstructionFactory.java create mode 100644 src/java/org/apache/bcel/generic/InstructionHandle.java create mode 100644 src/java/org/apache/bcel/generic/InstructionList.java create mode 100644 src/java/org/apache/bcel/generic/InstructionListObserver.java create mode 100644 src/java/org/apache/bcel/generic/InstructionTargeter.java create mode 100644 src/java/org/apache/bcel/generic/InvokeInstruction.java create mode 100644 src/java/org/apache/bcel/generic/JSR.java create mode 100644 src/java/org/apache/bcel/generic/JSR_W.java create mode 100644 src/java/org/apache/bcel/generic/JsrInstruction.java create mode 100644 src/java/org/apache/bcel/generic/L2D.java create mode 100644 src/java/org/apache/bcel/generic/L2F.java create mode 100644 src/java/org/apache/bcel/generic/L2I.java create mode 100644 src/java/org/apache/bcel/generic/LADD.java create mode 100644 src/java/org/apache/bcel/generic/LALOAD.java create mode 100644 src/java/org/apache/bcel/generic/LAND.java create mode 100644 src/java/org/apache/bcel/generic/LASTORE.java create mode 100644 src/java/org/apache/bcel/generic/LCMP.java create mode 100644 src/java/org/apache/bcel/generic/LCONST.java create mode 100644 src/java/org/apache/bcel/generic/LDC.java create mode 100644 src/java/org/apache/bcel/generic/LDC2_W.java create mode 100644 src/java/org/apache/bcel/generic/LDC_W.java create mode 100644 src/java/org/apache/bcel/generic/LDIV.java create mode 100644 src/java/org/apache/bcel/generic/LLOAD.java create mode 100644 src/java/org/apache/bcel/generic/LMUL.java create mode 100644 src/java/org/apache/bcel/generic/LNEG.java create mode 100644 src/java/org/apache/bcel/generic/LOOKUPSWITCH.java create mode 100644 src/java/org/apache/bcel/generic/LOR.java create mode 100644 src/java/org/apache/bcel/generic/LREM.java create mode 100644 src/java/org/apache/bcel/generic/LRETURN.java create mode 100644 src/java/org/apache/bcel/generic/LSHL.java create mode 100644 src/java/org/apache/bcel/generic/LSHR.java create mode 100644 src/java/org/apache/bcel/generic/LSTORE.java create mode 100644 src/java/org/apache/bcel/generic/LSUB.java create mode 100644 src/java/org/apache/bcel/generic/LUSHR.java create mode 100644 src/java/org/apache/bcel/generic/LXOR.java create mode 100644 src/java/org/apache/bcel/generic/LineNumberGen.java create mode 100644 src/java/org/apache/bcel/generic/LoadClass.java create mode 100644 src/java/org/apache/bcel/generic/LoadInstruction.java create mode 100644 src/java/org/apache/bcel/generic/LocalVariableGen.java create mode 100644 src/java/org/apache/bcel/generic/LocalVariableInstruction.java create mode 100644 src/java/org/apache/bcel/generic/MONITORENTER.java create mode 100644 src/java/org/apache/bcel/generic/MONITOREXIT.java create mode 100644 src/java/org/apache/bcel/generic/MULTIANEWARRAY.java create mode 100644 src/java/org/apache/bcel/generic/MethodGen.java create mode 100644 src/java/org/apache/bcel/generic/MethodObserver.java create mode 100644 src/java/org/apache/bcel/generic/NEW.java create mode 100644 src/java/org/apache/bcel/generic/NEWARRAY.java create mode 100644 src/java/org/apache/bcel/generic/NOP.java create mode 100644 src/java/org/apache/bcel/generic/NamedAndTyped.java create mode 100644 src/java/org/apache/bcel/generic/ObjectType.java create mode 100644 src/java/org/apache/bcel/generic/POP.java create mode 100644 src/java/org/apache/bcel/generic/POP2.java create mode 100644 src/java/org/apache/bcel/generic/PUSH.java create mode 100644 src/java/org/apache/bcel/generic/PUTFIELD.java create mode 100644 src/java/org/apache/bcel/generic/PUTSTATIC.java create mode 100644 src/java/org/apache/bcel/generic/PopInstruction.java create mode 100644 src/java/org/apache/bcel/generic/PushInstruction.java create mode 100644 src/java/org/apache/bcel/generic/RET.java create mode 100644 src/java/org/apache/bcel/generic/RETURN.java create mode 100644 src/java/org/apache/bcel/generic/ReferenceType.java create mode 100644 src/java/org/apache/bcel/generic/ReturnInstruction.java create mode 100644 src/java/org/apache/bcel/generic/ReturnaddressType.java create mode 100644 src/java/org/apache/bcel/generic/SALOAD.java create mode 100644 src/java/org/apache/bcel/generic/SASTORE.java create mode 100644 src/java/org/apache/bcel/generic/SIPUSH.java create mode 100644 src/java/org/apache/bcel/generic/SWAP.java create mode 100644 src/java/org/apache/bcel/generic/SWITCH.java create mode 100644 src/java/org/apache/bcel/generic/Select.java create mode 100644 src/java/org/apache/bcel/generic/StackConsumer.java create mode 100644 src/java/org/apache/bcel/generic/StackInstruction.java create mode 100644 src/java/org/apache/bcel/generic/StackProducer.java create mode 100644 src/java/org/apache/bcel/generic/StoreInstruction.java create mode 100644 src/java/org/apache/bcel/generic/TABLESWITCH.java create mode 100644 src/java/org/apache/bcel/generic/TargetLostException.java create mode 100644 src/java/org/apache/bcel/generic/Type.java create mode 100644 src/java/org/apache/bcel/generic/TypedInstruction.java create mode 100644 src/java/org/apache/bcel/generic/UnconditionalBranch.java create mode 100644 src/java/org/apache/bcel/generic/VariableLengthInstruction.java create mode 100644 src/java/org/apache/bcel/generic/Visitor.java create mode 100644 src/java/org/apache/bcel/generic/package.html create mode 100644 src/java/org/apache/bcel/package.html create mode 100644 src/java/org/apache/bcel/util/AttributeHTML.java create mode 100644 src/java/org/apache/bcel/util/ByteSequence.java create mode 100644 src/java/org/apache/bcel/util/Class2HTML.java create mode 100644 src/java/org/apache/bcel/util/ClassLoader.java create mode 100644 src/java/org/apache/bcel/util/ClassPath.java create mode 100644 src/java/org/apache/bcel/util/ClassQueue.java create mode 100644 src/java/org/apache/bcel/util/ClassStack.java create mode 100644 src/java/org/apache/bcel/util/ClassVector.java create mode 100644 src/java/org/apache/bcel/util/CodeHTML.java create mode 100644 src/java/org/apache/bcel/util/ConstantHTML.java create mode 100644 src/java/org/apache/bcel/util/InstructionFinder.java create mode 100644 src/java/org/apache/bcel/util/JavaWrapper.java create mode 100644 src/java/org/apache/bcel/util/MethodHTML.java create mode 100644 src/java/org/apache/bcel/util/package.html create mode 100644 src/java/org/apache/bcel/verifier/GraphicalVerifier.java create mode 100644 src/java/org/apache/bcel/verifier/NativeVerifier.java create mode 100644 src/java/org/apache/bcel/verifier/PassVerifier.java create mode 100644 src/java/org/apache/bcel/verifier/TransitiveHull.java create mode 100644 src/java/org/apache/bcel/verifier/VerificationResult.java create mode 100644 src/java/org/apache/bcel/verifier/Verifier.java create mode 100644 src/java/org/apache/bcel/verifier/VerifierAppFrame.java create mode 100644 src/java/org/apache/bcel/verifier/VerifierFactory.java create mode 100644 src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java create mode 100644 src/java/org/apache/bcel/verifier/VerifierFactoryObserver.java create mode 100644 src/java/org/apache/bcel/verifier/VerifyDialog.java create mode 100644 src/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/ClassConstraintException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/CodeConstraintException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/LoadingException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/Utility.java create mode 100644 src/java/org/apache/bcel/verifier/exc/VerificationException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java create mode 100644 src/java/org/apache/bcel/verifier/exc/package.html create mode 100644 src/java/org/apache/bcel/verifier/package.html create mode 100644 src/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java create mode 100644 src/java/org/apache/bcel/verifier/statics/IntList.java create mode 100644 src/java/org/apache/bcel/verifier/statics/LONG_Upper.java create mode 100644 src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java create mode 100644 src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java create mode 100644 src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java create mode 100644 src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java create mode 100644 src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java create mode 100644 src/java/org/apache/bcel/verifier/statics/StringRepresentation.java create mode 100644 src/java/org/apache/bcel/verifier/statics/package.html create mode 100644 src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/Frame.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/GenericArray.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/InstructionContext.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/LocalVariables.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/OperandStack.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/Subroutine.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/Subroutines.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java create mode 100644 src/java/org/apache/bcel/verifier/structurals/package.html diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 00000000..534d47ab --- /dev/null +++ b/.cvsignore @@ -0,0 +1,3 @@ +bin +velocity.log +*~ diff --git a/README b/README new file mode 100644 index 00000000..2b754740 --- /dev/null +++ b/README @@ -0,0 +1,62 @@ +********** A lot to do here ... ******************** + +I took the chance to make some changes when moving to Apache. In particular: + +* The package names have changed, just rename the prefix + de.fub.bytecode -> org.apache.bcel +* All deprecated classes and methods have been removed (e.g., + Instruction.getTag() == getOpcode()) +* The FindPattern class has been removed in favor of + org.apache.bcel.util.InstructionFinder which offers an improved API +* The Regex package from Jakarta is used instead of GNU regexp +* BCEL now relies on JDK1.2 classes, collection classes in particular, this + may even speed up BCEL a bit since no more synchronization locks are used +* BCEL is compiled using ANT instead of make + +However, for 99% of the users they will just have to rename the +packages and it will work. + + +There are also some new parts of BCEL, which have been distributed as +separate packages before: + +BCEL Manual +----------- + +The BCEL manual (the former Technical report) is added to the distribution. + + +Class Construction Kit (CCK) +---------------------------- + +The sources can be obtained upon request, however they've been developed +with IBM's VisualAge, thus they're hard to read at best. You can request +and Visual Age repository file as well. CCK has been developed by +Markus Dahm (markus.dahm@berlin.de) + +You can run CCK with java -jar lib/CCK.jar + +JustIce verifier +---------------- + +The JustIce bytecode verifier has been developed by Enver Haase +(enver@convergence.de) and is now an integral part of BCEL. + +Mini +---- + +The Mini programming language is now distributed together with BCEL. + + +New versions +------------ + + http://jakarta.apache.org/bcel/ + +Author +------ + +The BCEL is copyright (2001) Markus Dahm. Send bug reports and +suggestions to markus.dahm@berlin.de (Markus Dahm), please tell me +also if you find this tool helpful and in what kind of projects you +use it. diff --git a/README.JustIce b/README.JustIce new file mode 100644 index 00000000..de6c4423 --- /dev/null +++ b/README.JustIce @@ -0,0 +1,40 @@ + +-------------------------------- +RUNNING A CONSOLE-BASED VERIFIER +-------------------------------- + +A command like + + java org.apache.bcel.verifier.Verifier fully.qualified.class.Name + +lets JustIce work standalone. + + +If you get a "java.lang.OutOfMemoryError", you should increase the +maximum Java heap space. A command like + + java -Xmx1887436800 org.apache.bcel.verifier.Verifier f.q.c.Name + +will usually resolve the problem. The value above is suitable for +big server machines; if your machine starts swapping to disk, try +to lower the value. + + +--------------------------------- +RUNNING A GRAPHICS-BASED VERIFIER +--------------------------------- + +If you prefer a graphical application, you should use a command like + + java org.apache.bcel.verifier.GraphicalVerifier + +to launch one. Again, you may have to resolve a memory issue depending +on the classes to verify. + + +------------------ +CONTACT THE AUTHOR +------------------ + +If you do something useful with JustIce, I'd like to hear about it! +Enver Haase diff --git a/TODO.JustIce b/TODO.JustIce new file mode 100644 index 00000000..a60343ee --- /dev/null +++ b/TODO.JustIce @@ -0,0 +1,35 @@ + +$Id$ + +"TODO" list for JustIce, the Java Class File Verifier by Enver Haase. + +- JustIce uses object generalization during pass 3b, as supposed by +Sun. However, there are better methods such as the idea proposed by +Staerk et al.: using sets of object types. + +- There are a few bugs concerning access rights of referenced method +and probably fields. The tests for access rights that Sun defines +should happen in pass four (which JustIce performs during pass 3a) are +unintentionally omitted. This also happened to Sun and IBM with some +of their version 1.3 JVMs. Thanks Markus Dahm. + +- There are bugs because of an ambiguity in the Java Virtual Machine +Specification, Second Edition. These have to do with inheritance: A +method invocation like MyObject::equals(Object) is considered illegal, +if MyObject has no overriding definition of equals(Object). Sun +clarified this issue via electronic mail: the invocation is legal, +because MyObject inherits the member function equals(Object) from +Object::equals(Object). The search algorithms don't seem to be trivial +because interfaces can not only specify methods, but also declare +fields. Also, access modifiers have to be honoured (see above). + +- It is not verified if classes that propose they would implement an +interface _really_ implement all the methods. + +- The InstructionContext.getSuccessors() method may return the same +successor more than one time. For performance reasons the ControlFlow- +Graph.InstructionContextImpl class should return an array where the +successors are pairwise disjoint. It should also be cached so that we +don't have to do this calculation every time. + +***End of File*** diff --git a/build.xml b/build.xml new file mode 100644 index 00000000..8b03bcbd --- /dev/null +++ b/build.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/Faculty.java b/docs/Faculty.java new file mode 100644 index 00000000..c8e7d956 --- /dev/null +++ b/docs/Faculty.java @@ -0,0 +1,28 @@ +import java.io.*; + +public class Faculty { + private static BufferedReader in = new BufferedReader(new + InputStreamReader(System.in)); + + public static final int fac(int n) { + return(n == 0)? 1 : n * fac(n - 1); + } + + public static final int readInt() { + int n = 4711; + + try { + System.out.print("Please enter a number> "); + n = Integer.parseInt(in.readLine()); + } + catch(IOException e1) { System.err.println(e1); } + catch(NumberFormatException e2) { System.err.println(e2); } + + return n; + } + + public static void main(String[] args) { + int n = readInt(); + System.out.println("Faculty of " + n + " is " + fac(n)); + } +} diff --git a/docs/HelloWorld.java b/docs/HelloWorld.java new file mode 100644 index 00000000..1630e21f --- /dev/null +++ b/docs/HelloWorld.java @@ -0,0 +1,16 @@ +import java.io.*; + +public class HelloWorld { + public static void main(String[] argv) { + BufferedReader in = new BufferedReader(new + InputStreamReader(System.in)); + String name = null; + + try { + System.out.print("Please enter your name> "); + name = in.readLine(); + } catch(IOException e) { return; } + + System.out.println("Hello, " + name); + } +} diff --git a/docs/Peephole.java b/docs/Peephole.java new file mode 100644 index 00000000..c8806aed --- /dev/null +++ b/docs/Peephole.java @@ -0,0 +1,82 @@ +import java.io.*; + +import java.util.Iterator; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.Repository; +import org.apache.bcel.util.InstructionFinder; + +public class Peephole { + public static void main(String[] argv) { + try { + /* Load the class from CLASSPATH. + */ + JavaClass clazz = Repository.lookupClass(argv[0]); + Method[] methods = clazz.getMethods(); + ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); + + for(int i=0; i < methods.length; i++) { + if(!(methods[i].isAbstract() || methods[i].isNative())) { + MethodGen mg = new MethodGen(methods[i], + clazz.getClassName(), cp); + Method stripped = removeNOPs(mg); + + if(stripped != null) // Any NOPs stripped? + methods[i] = stripped; // Overwrite with stripped method + } + } + + /* Dump the class to _.class + */ + clazz.setConstantPool(cp.getFinalConstantPool()); + clazz.dump(clazz.getClassName() + "_.class"); + } catch(Exception e) { e.printStackTrace(); } + } + + private static final Method removeNOPs(MethodGen mg) { + InstructionList il = mg.getInstructionList(); + InstructionFinder f = new InstructionFinder(il); + String pat = "NOP+"; // Find at least one NOP + InstructionHandle next = null; + int count = 0; + + for(Iterator i = f.search(pat); i.hasNext(); ) { + InstructionHandle[] match = (InstructionHandle[])e.next(); + InstructionHandle first = match[0]; + InstructionHandle last = match[match.length - 1]; + + /* Some nasty Java compilers may add NOP at end of method. + */ + if((next = last.getNext()) == null) + break; + + count += match.length; + + /* Delete NOPs and redirect any references to them to the following + * (non-nop) instruction. + */ + try { + il.delete(first, last); + } catch(TargetLostException e) { + InstructionHandle[] targets = e.getTargets(); + for(int i=0; i < targets.length; i++) { + InstructionTargeter[] targeters = targets[i].getTargeters(); + + for(int j=0; j < targeters.length; j++) + targeters[j].updateTarget(targets[i], next); + } + } + } + + Method m = null; + + if(count > 0) { + System.out.println("Removed " + count + " NOP instructions from method " + + mg.getName()); + m = mg.getMethod(); + } + + il.dispose(); // Reuse instruction handles + return m; + } +} diff --git a/docs/appendix.tex b/docs/appendix.tex new file mode 100644 index 00000000..26cfc74b --- /dev/null +++ b/docs/appendix.tex @@ -0,0 +1,193 @@ +\section{Code examples for the BCEL API}\label{sec:apicg} + +\subsection{HelloWorldBuilder.java} +The following Java program reads a name from the standard input and +prints a friendly ``Hello''. Since the \texttt{readLine()} method may +throw an \texttt{IOException} it is enclosed by a \texttt{try-catch} block. + +{\small \verbatimtabinput{HelloWorld.java}\label{sec:hello}} + +\subsection{HelloWorldBuilder.java} + +We will sketch here how the above Java class can be created from the +scratch using the \jc API. For ease of reading we will +use textual signatures and not create them dynamically. For example, +the signature + +\begin{verbatim} + "(Ljava/lang/String;)Ljava/lang/StringBuffer;" +\end{verbatim} + +would actually be created with + +\begin{verbatim} + Type.getMethodSignature(Type.STRINGBUFFER, new Type[] { Type.STRING }); +\end{verbatim} + +\subsubsection{Initialization:} + +First we create an empty class and an instruction list: + +{\small\begin{verbatim} + ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", + "", ACC_PUBLIC | ACC_SUPER, + null); + ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool + InstructionList il = new InstructionList(); +\end{verbatim}} + +We then create the main method, supplying the method's name and the +symbolic type signature encoded with \texttt{Type} objects. + +{\small\begin{verbatim} + MethodGen mg = new MethodGen(ACC_STATIC | ACC_PUBLIC,// access flags + Type.VOID, // return type + new Type[] { // argument types + new ArrayType(Type.STRING, 1) }, + new String[] { "argv" }, // arg names + "main", "HelloWorld", // method, class + il, cp); + InstructionFactory factory = new InstructionFactory(cg); +\end{verbatim}} + +We define some often use types: + +{\small\begin{verbatim} + ObjectType i_stream = new ObjectType("java.io.InputStream"); + ObjectType p_stream = new ObjectType("java.io.PrintStream"); +\end{verbatim}} + +\subsubsection{Create variables \texttt{in} and \texttt{name}:} + +We call the constructors, i.e. execute +\texttt{BufferedReader(Input\-Stream\-Reader(System.in))}. The reference +to the \texttt{BufferedReader} object stays on top of the stack and is +stored in the newly allocated \texttt{in} variable. + +{\small\begin{verbatim} + il.append(factory.createNew("java.io.BufferedReader")); + il.append(InstructionConstants.DUP); // Use predefined constant + il.append(factory.createNew("java.io.InputStreamReader")); + il.append(InstructionConstants.DUP); + il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, + Constants.GETSTATIC)); + il.append(factory.createInvoke("java.io.InputStreamReader", "", + Type.VOID, new Type[] { i_stream }, + Constants.INVOKESPECIAL)); + il.append(factory.createInvoke("java.io.BufferedReader", "", Type.VOID, + new Type[] {new ObjectType("java.io.Reader")}, + Constants.INVOKESPECIAL)); + + LocalVariableGen lg = + mg.addLocalVariable("in", + new ObjectType("java.io.BufferedReader"), null, null); + int in = lg.getIndex(); + lg.setStart(il.append(new ASTORE(in))); // `i' valid from here +\end{verbatim}} + +Create local variable \texttt{name} and initialize it to \texttt{null}. + +{\small\begin{verbatim} + lg = mg.addLocalVariable("name", Type.STRING, null, null); + int name = lg.getIndex(); + il.append(InstructionConstants.ACONST_NULL); + lg.setStart(il.append(new ASTORE(name))); // `name' valid from here +\end{verbatim}} + +\subsubsection{Create try-catch block} + +We remember the start of the block, read a line from the standard +input and store it into the variable \texttt{name}. + +{\small\begin{verbatim} + InstructionHandle try_start = + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, + Constants.GETSTATIC)); + + il.append(new PUSH(cp, "Please enter your name> ")); + il.append(factory.createInvoke("java.io.PrintStream", "print", Type.VOID, + new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(new ALOAD(in)); + il.append(factory.createInvoke("java.io.BufferedReader", "readLine", + Type.STRING, Type.NO_ARGS, + Constants.INVOKEVIRTUAL)); + il.append(new ASTORE(name)); +\end{verbatim}} + +Upon normal execution we jump behind exception handler, the target +address is not known yet. + +{\small\begin{verbatim} + GOTO g = new GOTO(null); + InstructionHandle try_end = il.append(g); +\end{verbatim}} + +We add the exception handler which simply returns from the method. + +{\small\begin{verbatim} + InstructionHandle handler = il.append(InstructionConstants.RETURN); + mg.addExceptionHandler(try_start, try_end, handler, "java.io.IOException"); +\end{verbatim}} + +``Normal'' code continues, now we can set the branch target of the GOTO. + +{\small\begin{verbatim} + InstructionHandle ih = + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, + Constants.GETSTATIC)); + g.setTarget(ih); +\end{verbatim}} + +\subsubsection{Printing "Hello"} + +String concatenation compiles to \texttt{StringBuffer} operations. + +{\small\begin{verbatim} + il.append(factory.createNew(Type.STRINGBUFFER)); + il.append(InstructionConstants.DUP); + il.append(new PUSH(cp, "Hello, ")); + il.append(factory.createInvoke("java.lang.StringBuffer", "", + Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKESPECIAL)); + il.append(new ALOAD(name)); + il.append(factory.createInvoke("java.lang.StringBuffer", "append", + Type.STRINGBUFFER, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(factory.createInvoke("java.lang.StringBuffer", "toString", + Type.STRING, Type.NO_ARGS, + Constants.INVOKEVIRTUAL)); + + il.append(factory.createInvoke("java.io.PrintStream", "println", + Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(InstructionConstants.RETURN); +\end{verbatim}} + +\subsubsection{Finalization} + +Finally, we have to set the stack size, which normally would be +computed on the fly and add a default constructor method to the class, +which is empty in this case. + +{\small\begin{verbatim} + mg.setMaxStack(5); + cg.addMethod(mg.getMethod()); + il.dispose(); // Allow instruction handles to be reused + cg.addEmptyConstructor(ACC_PUBLIC); +\end{verbatim}} + +Last but not least we dump the \texttt{JavaClass} object to a file. + +{\small\begin{verbatim} + try { + cg.getJavaClass().dump("HelloWorld.class"); + } catch(java.io.IOException e) { System.err.println(e); } +\end{verbatim}} + +\subsection{Peephole.java} + +This class implements a simple peephole optimizer that removes any NOP +instructions from the given class. + +{\small\verbatimtabinput{Peephole.java}}\label{sec:nop} diff --git a/docs/bool.java b/docs/bool.java new file mode 100644 index 00000000..cf517ea0 --- /dev/null +++ b/docs/bool.java @@ -0,0 +1,24 @@ + InstructionList il = new InstructionList(); + ... + CodeConstraint constraint = new CodeConstraint() { + public boolean checkCode(InstructionHandle[] match) { + IfInstruction if1 = (IfInstruction)match[0].getInstruction(); + GOTO g = (GOTO)match[2].getInstruction(); + return (if1.getTarget() == match[3]) && + (g.getTarget() == match[4]); + } + }; + FindPattern f = new FindPattern(il); + String pat = "`IfInstruction'`ICONST_0'`GOTO'`ICONST_1'" + + "`NOP'(`IFEQ'|`IFNE')"; + InstructionHandle[] match; + for(InstructionHandle ih = f.search(pat, constraint); + ih != null; ih = f.search(pat, match[0], constraint)) { + match = f.getMatch(); // Constraint already checked + ... + match[0].setTarget(match[5].getTarget()); // Update target + ... + try { + il.delete(match[1], match[5]); + } catch(TargetLostException e) { ... } + } diff --git a/docs/classfile.mdl b/docs/classfile.mdl new file mode 100644 index 00000000..8035b380 --- /dev/null +++ b/docs/classfile.mdl @@ -0,0 +1,2134 @@ + +(object Petal + version 42 + _written "Rose 4.5.8054a" + charSet 0) + +(object Design "Logical View" + is_unit TRUE + is_loaded TRUE + defaults (object defaults + rightMargin 0.000000 + leftMargin 0.000000 + topMargin 0.000000 + bottomMargin 0.000000 + pageOverlap 0.000000 + clipIconLabels TRUE + autoResize TRUE + snapToGrid TRUE + gridX 16 + gridY 16 + defaultFont (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + showMessageNum 1 + showClassOfObject TRUE + notation "Unified") + root_usecase_package (object Class_Category "Use Case View" + quid "36597149004C" + exportControl "Public" + global TRUE + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list + (object UseCaseDiagram "Main" + quid "3659714A03A0" + title "Main" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)))) + root_category (object Class_Category "Logical View" + quid "36597149004B" + exportControl "Public" + global TRUE + subsystem "Component View" + quidu "365971490054" + logical_models (list unit_reference_list + (object Class "JavaClass" + quid "3659716E02C4" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3783415D015E" + supplier "Logical View::AccessFlags" + quidu "3783404E0032")) + operations (list Operations + (object Operation "getInterfaceNames" + quid "365973DC00DE" + result "String[]" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "getSuperclassName" + quid "365974050213" + result "String" + concurrency "Sequential" + opExportControl "Public" + uid 0))) + (object Class "Field" + quid "3659719C025C" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "378340240028" + supplier "Logical View::FieldOrMethod" + quidu "37833DF6035A"))) + (object Class "Method" + quid "365971AB002D" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3783403702BA" + supplier "Logical View::FieldOrMethod" + quidu "37833DF6035A"))) + (object Class "Attribute" + quid "365974430259") + (object Class "Code" + quid "3659744C02AC" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "36597457033E" + stereotype "Method attribute" + supplier "Logical View::Attribute" + quidu "365974430259")) + operations (list Operations + (object Operation "getCode" + quid "365977B9022A" + result "byte[]" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + class_attributes (list class_attribute_list + (object ClassAttribute "max_stack" + quid "3659775703CE" + type "int") + (object ClassAttribute "max_locals" + quid "36597761015C" + type "int") + (object ClassAttribute "exception_handlers" + quid "3659837E02EB"))) + (object Class "LineNumberTable" + quid "365974D401FD" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659752A01B0" + stereotype "Code attribute" + supplier "Logical View::Attribute" + quidu "365974430259"))) + (object Class "LocalVariableTable" + quid "365974E4034A" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365975320072" + stereotype "Code attribute" + supplier "Logical View::Attribute" + quidu "365974430259"))) + (object Class "SourceFile" + quid "365974F201D8" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659753B002E" + stereotype "Class attribute" + supplier "Logical View::Attribute" + quidu "365974430259"))) + (object Class "InnerClasses" + quid "3659751A0398" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659756B010A" + stereotype "Class attribute" + supplier "Logical View::Attribute" + quidu "365974430259"))) + (object Class "ConstantPool" + quid "365976440134" + operations (list Operations + (object Operation "getConstant" + quid "365987690117" + result "Constant" + concurrency "Sequential" + opExportControl "Public" + uid 0))) + (object Class "Constant" + quid "3659764E01CE") + (object Class "ConstantCP" + quid "365976530348" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "36597AFA0160" + supplier "Logical View::Constant" + quidu "3659764E01CE"))) + (object Class "ExceptionTable" + quid "365976ED0187" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659781D03A1" + stereotype "Method attribute" + supplier "Logical View::Attribute" + quidu "365974430259"))) + (object Class "ConstantInterfaceMethodref" + quid "36597B2E03DC" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A9E870042" + supplier "Logical View::ConstantCP" + quidu "365976530348"))) + (object Class "ConstantMethodref" + quid "36597B3F01C3" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A9E8D0091" + supplier "Logical View::ConstantCP" + quidu "365976530348"))) + (object Class "ConstantFieldref" + quid "36597B460340" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A9E84020B" + supplier "Logical View::ConstantCP" + quidu "365976530348"))) + (object Class "Deprecated" + quid "36597C6901C2" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "36597CC90075" + stereotype "Method attribute" + supplier "Logical View::Attribute" + quidu "365974430259"))) + (object Class "Unknown" + quid "36597C7100E7" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "36597CB500BD" + supplier "Logical View::Attribute" + quidu "365974430259"))) + (object Class "Synthetic" + quid "36597C7B00CD" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "36597CAF01A4" + stereotype "Class attribute" + supplier "Logical View::Attribute" + quidu "365974430259"))) + (object Class "ConstantValue" + quid "36597D720032" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "36597D8000D3" + stereotype "Field attribute" + supplier "Logical View::Attribute" + quidu "365974430259"))) + (object Class_Utility "ClassParser" + quid "365982D0039F" + used_nodes (list uses_relationship_list + (object Uses_Relationship + quid "365982F50013" + stereotype "creates" + supplier "Logical View::JavaClass" + quidu "3659716E02C4")) + operations (list Operations + (object Operation "parse" + quid "36598B7B03D2" + result "JavaClass" + concurrency "Sequential" + opExportControl "Public" + uid 0))) + (object Class "Visitor" + quid "3659848103DE" + stereotype "Interface") + (object Class "ConstantString" + quid "365A9EE901C0" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A9F9D0010" + supplier "Logical View::Constant" + quidu "3659764E01CE"))) + (object Class "ConstantClass" + quid "365A9EFB005D" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A9F8A00C7" + supplier "Logical View::Constant" + quidu "3659764E01CE"))) + (object Class "ConstantInteger" + quid "365A9F020374" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365AA0090278" + supplier "Logical View::Constant" + quidu "3659764E01CE"))) + (object Class "ConstantDouble" + quid "365A9F0902C0" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A9FA002A9" + supplier "Logical View::Constant" + quidu "3659764E01CE"))) + (object Class "ConstantFloat" + quid "365A9F1003E3" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A9FA302D6" + supplier "Logical View::Constant" + quidu "3659764E01CE"))) + (object Class "ConstantLong" + quid "365A9F3F0228" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A9FAB016F" + supplier "Logical View::Constant" + quidu "3659764E01CE"))) + (object Class "ConstantUnicode" + quid "365A9F4E01CF" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A9FA80110" + supplier "Logical View::Constant" + quidu "3659764E01CE"))) + (object Class "ConstantNameAndType" + quid "365A9F5B00A1" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A9FAE01FF" + supplier "Logical View::Constant" + quidu "3659764E01CE"))) + (object Class "ConstantUtf8" + quid "365A9F7400A7" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A9FB1031C" + supplier "Logical View::Constant" + quidu "3659764E01CE"))) + (object Class "FieldOrMethod" + quid "37833DF6035A" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3783415403D2" + supplier "Logical View::AccessFlags" + quidu "3783404E0032")) + operations (list Operations + (object Operation "getName" + quid "37833E050063" + result "String" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + abstract TRUE) + (object Class "AccessFlags" + quid "3783404E0032" + operations (list Operations + (object Operation "isPublic" + quid "3783405602D2" + result "boolean" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + abstract TRUE) + (object Association "$UNNAMED$0" + quid "3659721C01B6" + roles (list role_list + (object Role "$UNNAMED$1" + quid "3659721C03DD" + supplier "Logical View::JavaClass" + quidu "3659716E02C4" + client_cardinality (value cardinality "1") + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$2" + quid "3659721D0009" + supplier "Logical View::Method" + quidu "365971AB002D" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$3" + quid "36597228027C" + roles (list role_list + (object Role "$UNNAMED$4" + quid "365972290129" + supplier "Logical View::JavaClass" + quidu "3659716E02C4" + client_cardinality (value cardinality "1") + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$5" + quid "36597229013D" + supplier "Logical View::Field" + quidu "3659719C025C" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$6" + quid "3659760E010E" + roles (list role_list + (object Role "$UNNAMED$7" + quid "36597610005D" + supplier "Logical View::JavaClass" + quidu "3659716E02C4" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$8" + quid "365976100071" + supplier "Logical View::Attribute" + quidu "365974430259" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$9" + quid "365979BF00B3" + roles (list role_list + (object Role "$UNNAMED$10" + quid "365979C0001E" + supplier "Logical View::Method" + quidu "365971AB002D" + client_cardinality (value cardinality "1") + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$11" + quid "365979C00028" + supplier "Logical View::Code" + quidu "3659744C02AC" + client_cardinality (value cardinality "0..1") + is_navigable TRUE))) + (object Association "$UNNAMED$12" + quid "365979F60198" + roles (list role_list + (object Role "$UNNAMED$13" + quid "365979F803B8" + supplier "Logical View::Method" + quidu "365971AB002D" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$14" + quid "365979F803B9" + supplier "Logical View::ExceptionTable" + quidu "365976ED0187" + client_cardinality (value cardinality "0..1") + is_navigable TRUE))) + (object Association "$UNNAMED$15" + quid "36597A20015D" + roles (list role_list + (object Role "$UNNAMED$16" + quid "36597A2101E0" + supplier "Logical View::Code" + quidu "3659744C02AC" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$17" + quid "36597A2101EA" + supplier "Logical View::LineNumberTable" + quidu "365974D401FD" + client_cardinality (value cardinality "1") + is_navigable TRUE))) + (object Association "$UNNAMED$18" + quid "36597A2A0233" + roles (list role_list + (object Role "$UNNAMED$19" + quid "36597A2B0203" + supplier "Logical View::Code" + quidu "3659744C02AC" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$20" + quid "36597A2B020D" + supplier "Logical View::LocalVariableTable" + quidu "365974E4034A" + client_cardinality (value cardinality "1") + is_navigable TRUE))) + (object Association "$UNNAMED$21" + quid "36597A4703BB" + roles (list role_list + (object Role "$UNNAMED$22" + quid "36597A49001B" + supplier "Logical View::JavaClass" + quidu "3659716E02C4" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$23" + quid "36597A49002F" + supplier "Logical View::InnerClasses" + quidu "3659751A0398" + client_cardinality (value cardinality "0..1") + is_navigable TRUE))) + (object Association "$UNNAMED$24" + quid "36597A54005D" + roles (list role_list + (object Role "$UNNAMED$25" + quid "36597A5403CE" + supplier "Logical View::JavaClass" + quidu "3659716E02C4" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$26" + quid "36597A5403E2" + supplier "Logical View::SourceFile" + quidu "365974F201D8" + client_cardinality (value cardinality "1") + is_navigable TRUE))) + (object Association "$UNNAMED$27" + quid "36597ADA000F" + roles (list role_list + (object Role "$UNNAMED$28" + quid "36597ADA0327" + supplier "Logical View::ConstantPool" + quidu "365976440134" + client_cardinality (value cardinality "1") + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$29" + quid "36597ADA0331" + supplier "Logical View::Constant" + quidu "3659764E01CE" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$30" + quid "36597D490047" + roles (list role_list + (object Role "$UNNAMED$31" + quid "36597D4903B9" + supplier "Logical View::JavaClass" + quidu "3659716E02C4" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$32" + quid "36597D4903C3" + supplier "Logical View::Attribute" + quidu "365974430259" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$33" + quid "36597D8E01EB" + roles (list role_list + (object Role "$UNNAMED$34" + quid "36597D8F0124" + supplier "Logical View::Field" + quidu "3659719C025C" + client_cardinality (value cardinality "1") + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$35" + quid "36597D8F012E" + supplier "Logical View::Attribute" + quidu "365974430259" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$36" + quid "36597D930315" + roles (list role_list + (object Role "$UNNAMED$37" + quid "36597D9500B5" + supplier "Logical View::Method" + quidu "365971AB002D" + client_cardinality (value cardinality "1") + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$38" + quid "36597D9500BF" + supplier "Logical View::Attribute" + quidu "365974430259" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$39" + quid "36597F6600FA" + roles (list role_list + (object Role "$UNNAMED$40" + quid "36597F680070" + supplier "Logical View::JavaClass" + quidu "3659716E02C4" + client_cardinality (value cardinality "1") + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$41" + quid "36597F68007A" + supplier "Logical View::Attribute" + quidu "365974430259" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$42" + quid "36598570008E" + roles (list role_list + (object Role "$UNNAMED$43" + quid "365985700265" + supplier "Logical View::JavaClass" + quidu "3659716E02C4" + client_cardinality (value cardinality "1") + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$44" + quid "36598570026F" + supplier "Logical View::ConstantPool" + quidu "365976440134" + client_cardinality (value cardinality "1") + is_navigable TRUE))) + (object Association "$UNNAMED$45" + quid "365985A101F7" + roles (list role_list + (object Role "$UNNAMED$46" + quid "365985A10392" + supplier "Logical View::JavaClass" + quidu "3659716E02C4" + is_navigable TRUE) + (object Role "$UNNAMED$47" + quid "365985A1039C" + supplier "Logical View::ConstantPool" + quidu "365976440134" + is_navigable TRUE)))) + logical_presentations (list unit_reference_list + (object ClassDiagram "Java class" + quid "3659714A03C7" + title "Java class" + zoom 90 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 414 + items (list diagram_item_list + (object ClassView "Class" "Logical View::ExceptionTable" @1 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1104, 1920) + label (object ItemLabel + Parent_View @1 + location (949, 1869) + fill_color 13434879 + nlines 1 + max_width 310 + justify 0 + label "ExceptionTable") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365976ED0187" + width 328 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::LineNumberTable" @2 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2144, 1936) + label (object ItemLabel + Parent_View @2 + location (1970, 1885) + fill_color 13434879 + nlines 1 + max_width 348 + justify 0 + label "LineNumberTable") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365974D401FD" + width 366 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::Code" @3 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1584, 2032) + label (object ItemLabel + Parent_View @3 + location (1382, 1876) + fill_color 13434879 + nlines 1 + max_width 404 + justify 0 + label "Code") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659744C02AC" + compartment (object Compartment + Parent_View @3 + location (1382, 1931) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 5 + max_width 409) + width 422 + height 336 + annotation 8 + autoResize TRUE) + (object AssociationViewNew "$UNNAMED$15" @4 + location (1877, 1981) + stereotype TRUE + line_color 3342489 + quidu "36597A20015D" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$16" @5 + Parent_View @4 + location (197, 877) + stereotype TRUE + line_color 3342489 + quidu "36597A2101E0" + client @4 + supplier @3 + line_style 0) + (object RoleView "$UNNAMED$17" @6 + Parent_View @4 + location (197, 877) + stereotype TRUE + line_color 3342489 + quidu "36597A2101EA" + client @4 + supplier @2 + line_style 0 + label (object SegLabel @7 + Parent_View @6 + location (1943, 1915) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "1" + pctDist 0.900000 + height 54 + orientation 0)))) + (object ClassView "Class" "Logical View::LocalVariableTable" @8 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2496, 2144) + label (object ItemLabel + Parent_View @8 + location (2311, 2093) + fill_color 13434879 + nlines 1 + max_width 370 + justify 0 + label "LocalVariableTable") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365974E4034A" + width 388 + height 126 + annotation 8 + autoResize TRUE) + (object AssociationViewNew "$UNNAMED$18" @9 + location (2048, 2088) + stereotype TRUE + line_color 3342489 + quidu "36597A2A0233" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$19" @10 + Parent_View @9 + location (-183, 852) + stereotype TRUE + line_color 3342489 + quidu "36597A2B0203" + client @9 + supplier @3 + line_style 0) + (object RoleView "$UNNAMED$20" @11 + Parent_View @9 + location (-183, 852) + stereotype TRUE + line_color 3342489 + quidu "36597A2B020D" + client @9 + supplier @8 + line_style 0 + label (object SegLabel @12 + Parent_View @11 + location (2269, 2170) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "1" + pctDist 0.900000 + height 54 + orientation 1)))) + (object ClassView "Class" "Logical View::InnerClasses" @13 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2224, 1552) + label (object ItemLabel + Parent_View @13 + location (2088, 1501) + fill_color 13434879 + nlines 1 + max_width 272 + justify 0 + label "InnerClasses") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659751A0398" + width 290 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::SourceFile" @14 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2576, 1552) + label (object ItemLabel + Parent_View @14 + location (2461, 1501) + fill_color 13434879 + nlines 1 + max_width 230 + justify 0 + label "SourceFile") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365974F201D8" + width 248 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::Deprecated" @15 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (720, 1920) + label (object ItemLabel + Parent_View @15 + location (602, 1869) + fill_color 13434879 + nlines 1 + max_width 236 + justify 0 + label "Deprecated") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "36597C6901C2" + width 254 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::Unknown" @16 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2816, 1936) + label (object ItemLabel + Parent_View @16 + location (2717, 1885) + fill_color 13434879 + nlines 1 + max_width 198 + justify 0 + label "Unknown") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "36597C7100E7" + width 216 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::Synthetic" @17 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2896, 1552) + label (object ItemLabel + Parent_View @17 + location (2791, 1501) + fill_color 13434879 + nlines 1 + max_width 210 + justify 0 + label "Synthetic") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "36597C7B00CD" + width 228 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantValue" @18 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (848, 1552) + label (object ItemLabel + Parent_View @18 + location (697, 1501) + fill_color 13434879 + nlines 1 + max_width 302 + justify 0 + label "ConstantValue") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "36597D720032" + width 320 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "ClassUtility" "Logical View::ClassParser" @19 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (784, 912) + label (object ItemLabel + Parent_View @19 + location (657, 839) + fill_color 13434879 + nlines 1 + max_width 254 + justify 0 + label "ClassParser") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365982D0039F" + compartment (object Compartment + Parent_View @19 + location (657, 894) + icon_style "Icon" + fill_color 16777215 + anchor 2 + nlines 2 + max_width 148) + width 272 + height 168 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::Attribute" @20 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1648, 1536) + label (object ItemLabel + Parent_View @20 + location (1552, 1484) + fill_color 13434879 + nlines 1 + max_width 192 + justify 0 + label "Attribute") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365974430259" + width 210 + height 126 + annotation 8 + autoResize TRUE) + (object InheritTreeView "" @21 + location (1620, 1691) + line_color 3342489 + fill_color 13434879 + supplier @20 + vertices (list Points + (1620, 1691) + (1620, 1599))) + (object InheritView "" @22 + stereotype (object SegLabel @23 + Parent_View @22 + location (1625, 1778) + anchor 10 + anchor_loc 1 + nlines 1 + max_width 450 + justify 0 + label "<>" + pctDist 0.505747 + height 52 + orientation 1) + line_color 3342489 + quidu "36597457033E" + client @3 + supplier @20 + line_style 3 + origin_attachment (1573, 1864) + terminal_attachment (1573, 1691) + drawSupplier @21) + (object InheritView "" @24 + stereotype (object SegLabel @25 + Parent_View @24 + location (2121, 1847) + anchor 10 + anchor_loc 1 + nlines 1 + max_width 450 + justify 0 + label "<>" + pctDist 0.143488 + height 3 + orientation 1) + line_color 3342489 + quidu "3659752A01B0" + client @2 + supplier @20 + line_style 3 + origin_attachment (2118, 1873) + terminal_attachment (2118, 1691) + drawSupplier @21) + (object InheritView "" @26 + stereotype (object SegLabel @27 + Parent_View @26 + location (2579, 1653) + anchor 10 + anchor_loc 1 + nlines 1 + max_width 450 + justify 0 + label "<>" + pctDist 0.497717 + height 13 + orientation 0) + line_color 3342489 + quidu "3659753B002E" + client @14 + supplier @20 + line_style 3 + origin_attachment (2566, 1615) + terminal_attachment (2566, 1691) + drawSupplier @21) + (object InheritView "" @28 + stereotype (object SegLabel @29 + Parent_View @28 + location (1145, 1774) + anchor 10 + anchor_loc 1 + nlines 1 + max_width 450 + justify 0 + label "<>" + pctDist 0.497006 + height 34 + orientation 1) + line_color 3342489 + quidu "3659781D03A1" + client @1 + supplier @20 + line_style 3 + origin_attachment (1111, 1857) + terminal_attachment (1111, 1691) + drawSupplier @21) + (object InheritView "" @30 + stereotype TRUE + line_color 3342489 + quidu "36597CB500BD" + client @16 + supplier @20 + line_style 3 + origin_attachment (2819, 1873) + terminal_attachment (2819, 1691) + drawSupplier @21) + (object InheritView "" @31 + stereotype (object SegLabel @32 + Parent_View @31 + location (732, 1774) + anchor 10 + anchor_loc 1 + nlines 1 + max_width 450 + justify 0 + label "<>" + pctDist 0.497006 + height 34 + orientation 1) + line_color 3342489 + quidu "36597CC90075" + client @15 + supplier @20 + line_style 3 + origin_attachment (698, 1857) + terminal_attachment (698, 1691) + drawSupplier @21) + (object ClassView "Class" "Logical View::Method" @33 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2064, 1408) + label (object ItemLabel + Parent_View @33 + location (1983, 1362) + fill_color 13434879 + nlines 1 + max_width 162 + justify 0 + label "Method") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365971AB002D" + height 114 + annotation 8 + autoResize TRUE) + (object AssociationViewNew "$UNNAMED$36" @34 + location (1863, 1469) + stereotype TRUE + line_color 3342489 + quidu "36597D930315" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$37" @35 + Parent_View @34 + location (-57, 797) + stereotype TRUE + line_color 3342489 + quidu "36597D9500B5" + client @34 + supplier @33 + line_style 0 + label (object SegLabel @36 + Parent_View @35 + location (1978, 1491) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "1" + pctDist 0.900000 + height 54 + orientation 1)) + (object RoleView "$UNNAMED$38" @37 + Parent_View @34 + location (-57, 797) + stereotype TRUE + line_color 3342489 + quidu "36597D9500BF" + client @34 + supplier @20 + line_style 0 + label (object SegLabel @38 + Parent_View @37 + location (1781, 1551) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "*" + pctDist 0.900000 + height 54 + orientation 0)))) + (object ClassView "Class" "Logical View::Field" @39 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1232, 1408) + label (object ItemLabel + Parent_View @39 + location (1151, 1362) + fill_color 13434879 + nlines 1 + max_width 162 + justify 0 + label "Field") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659719C025C" + height 114 + annotation 8 + autoResize TRUE) + (object AssociationViewNew "$UNNAMED$33" @40 + location (1432, 1469) + stereotype TRUE + line_color 3342489 + quidu "36597D8E01EB" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$34" @41 + Parent_View @40 + location (-488, 797) + stereotype TRUE + line_color 3342489 + quidu "36597D8F0124" + client @40 + supplier @39 + line_style 0 + label (object SegLabel @42 + Parent_View @41 + location (1319, 1491) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "1" + pctDist 0.900000 + height 54 + orientation 0)) + (object RoleView "$UNNAMED$35" @43 + Parent_View @40 + location (-488, 797) + stereotype TRUE + line_color 3342489 + quidu "36597D8F012E" + client @40 + supplier @20 + line_style 0 + label (object SegLabel @44 + Parent_View @43 + location (1546, 1448) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "*" + pctDist 0.900000 + height 54 + orientation 0)))) + (object ClassView "Class" "Logical View::ConstantPool" @45 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2448, 1152) + label (object ItemLabel + Parent_View @45 + location (2300, 1070) + fill_color 13434879 + nlines 1 + max_width 296 + justify 0 + label "ConstantPool") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365976440134" + compartment (object Compartment + Parent_View @45 + location (2300, 1125) + icon_style "Icon" + fill_color 16777215 + anchor 2 + nlines 2 + max_width 303) + width 314 + height 186 + annotation 8 + autoResize TRUE) + (object InheritView "" @46 + stereotype (object SegLabel @47 + Parent_View @46 + location (2476, 2035) + anchor 10 + anchor_loc 1 + nlines 1 + max_width 450 + justify 0 + label "<>" + pctDist 0.118199 + height 4 + orientation 1) + line_color 3342489 + quidu "365975320072" + client @8 + supplier @20 + line_style 3 + origin_attachment (2472, 2081) + terminal_attachment (2472, 1691) + drawSupplier @21) + (object InheritView "" @48 + stereotype (object SegLabel @49 + Parent_View @48 + location (2206, 1653) + anchor 10 + anchor_loc 1 + nlines 1 + max_width 450 + justify 0 + label "<>" + pctDist 0.497717 + height 7 + orientation 1) + line_color 3342489 + quidu "3659756B010A" + client @13 + supplier @20 + line_style 3 + origin_attachment (2212, 1615) + terminal_attachment (2212, 1691) + drawSupplier @21) + (object InheritView "" @50 + label (object ItemLabel + Parent_View @50 + location (2892, 1653) + anchor_loc 1 + nlines 1 + max_width 264 + justify 0 + label "") + stereotype (object SegLabel @51 + Parent_View @50 + location (2902, 1653) + anchor 10 + anchor_loc 1 + nlines 1 + max_width 450 + justify 0 + label "<>" + pctDist 0.497717 + height 10 + orientation 0) + line_color 3342489 + quidu "36597CAF01A4" + client @17 + supplier @20 + line_style 3 + origin_attachment (2892, 1615) + terminal_attachment (2892, 1691) + drawSupplier @21) + (object InheritView "" @52 + stereotype (object SegLabel @53 + Parent_View @52 + location (871, 1651) + anchor 10 + anchor_loc 1 + nlines 1 + max_width 450 + justify 0 + label "<>" + pctDist 0.480000 + height 27 + orientation 0) + line_color 3342489 + quidu "36597D8000D3" + client @18 + supplier @20 + line_style 3 + origin_attachment (844, 1615) + terminal_attachment (844, 1691) + drawSupplier @21) + (object ClassView "Class" "Logical View::FieldOrMethod" @54 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1648, 1200) + font (object Font + italics TRUE) + label (object ItemLabel + Parent_View @54 + location (1502, 1127) + fill_color 13434879 + nlines 1 + max_width 292 + justify 0 + label "FieldOrMethod") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "37833DF6035A" + compartment (object Compartment + Parent_View @54 + location (1502, 1182) + font (object Font + italics TRUE) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 2 + max_width 208) + width 310 + height 168 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::AccessFlags" @55 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (896, 1200) + font (object Font + italics TRUE) + label (object ItemLabel + Parent_View @55 + location (762, 1127) + fill_color 13434879 + nlines 1 + max_width 268 + justify 0 + label "AccessFlags") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3783404E0032" + compartment (object Compartment + Parent_View @55 + location (762, 1182) + font (object Font + italics TRUE) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 2 + max_width 192) + width 286 + height 168 + annotation 8 + autoResize TRUE) + (object InheritView "" @56 + stereotype TRUE + line_color 3342489 + quidu "3783415403D2" + client @54 + supplier @55 + line_style 0) + (object InheritTreeView "" @57 + location (1635, 1379) + line_color 3342489 + fill_color 13434879 + supplier @54 + vertices (list Points + (1635, 1379) + (1635, 1284))) + (object InheritView "" @58 + stereotype TRUE + line_color 3342489 + quidu "3783403702BA" + client @33 + supplier @54 + line_style 3 + origin_attachment (1979, 1358) + terminal_attachment (1979, 1379) + drawSupplier @57) + (object InheritView "" @59 + stereotype TRUE + line_color 3342489 + quidu "378340240028" + client @39 + supplier @54 + line_style 3 + origin_attachment (1312, 1410) + terminal_attachment (1312, 1379) + drawSupplier @57) + (object ClassView "Class" "Logical View::JavaClass" @60 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1648, 912) + label (object ItemLabel + Parent_View @60 + location (1446, 816) + fill_color 13434879 + nlines 1 + max_width 404 + justify 0 + label "JavaClass") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659716E02C4" + compartment (object Compartment + Parent_View @60 + location (1446, 871) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 3 + max_width 450) + width 422 + height 214 + annotation 8 + autoResize TRUE) + (object AssociationViewNew "$UNNAMED$0" @61 + location (1876, 1184) + stereotype TRUE + line_color 3342489 + quidu "3659721C01B6" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$1" @62 + Parent_View @61 + location (1508, 768) + stereotype TRUE + line_color 3342489 + quidu "3659721C03DD" + client @61 + supplier @60 + line_style 0 + label (object SegLabel @63 + Parent_View @62 + location (1712, 1071) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "1" + pctDist 0.900000 + height 54 + orientation 0)) + (object RoleView "$UNNAMED$2" @64 + Parent_View @61 + location (1508, 768) + stereotype TRUE + line_color 3342489 + quidu "3659721D0009" + client @61 + supplier @33 + line_style 0 + label (object SegLabel @65 + Parent_View @64 + location (2042, 1299) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "*" + pctDist 0.900000 + height 54 + orientation 0)))) + (object UsesView "" @66 + label (object ItemLabel + Parent_View @66 + location (1178, 912) + anchor_loc 1 + nlines 1 + max_width 60 + justify 0 + label "") + stereotype (object SegLabel @67 + Parent_View @66 + location (1228, 869) + anchor 10 + anchor_loc 1 + nlines 1 + max_width 450 + justify 0 + label "<>" + pctDist 0.598000 + height 44 + orientation 0) + line_color 3342489 + quidu "365982F50013" + client @19 + supplier @60 + line_style 0) + (object AssociationViewNew "$UNNAMED$45" @68 + location (2074, 1039) + stereotype TRUE + line_color 3342489 + quidu "365985A101F7" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$46" @69 + Parent_View @68 + location (-278, 847) + stereotype TRUE + line_color 3342489 + quidu "365985A10392" + client @68 + supplier @60 + line_style 0) + (object RoleView "$UNNAMED$47" @70 + Parent_View @68 + location (-278, 847) + stereotype TRUE + line_color 3342489 + quidu "365985A1039C" + client @68 + supplier @45 + line_style 0))) + (object InheritView "" @71 + stereotype TRUE + line_color 3342489 + quidu "3783415D015E" + client @60 + supplier @55 + line_style 0) + (object AssociationViewNew "$UNNAMED$3" @72 + location (1418, 1184) + stereotype TRUE + line_color 3342489 + quidu "36597228027C" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$4" @73 + Parent_View @72 + location (426, 400) + stereotype TRUE + line_color 3342489 + quidu "365972290129" + client @72 + supplier @60 + line_style 0 + label (object SegLabel @74 + Parent_View @73 + location (1583, 1071) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "1" + pctDist 0.900000 + height 54 + orientation 1)) + (object RoleView "$UNNAMED$5" @75 + Parent_View @72 + location (426, 400) + stereotype TRUE + line_color 3342489 + quidu "36597229013D" + client @72 + supplier @39 + line_style 0 + label (object SegLabel @76 + Parent_View @75 + location (1334, 1368) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "*" + pctDist 0.900000 + height 54 + orientation 0)))))) + (object ClassDiagram "Constant pool" + quid "36597BC201E0" + title "Constant pool" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 995 + origin_y 0 + items (list diagram_item_list + (object ClassView "Class" "Logical View::ConstantCP" @77 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2192, 800) + label (object ItemLabel + Parent_View @77 + location (2065, 751) + fill_color 13434879 + nlines 1 + max_width 254 + justify 0 + label "ConstantCP") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365976530348" + width 272 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantInterfaceMethodref" @78 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2160, 1104) + label (object ItemLabel + Parent_View @78 + location (1894, 1055) + fill_color 13434879 + nlines 1 + max_width 532 + justify 0 + label "ConstantInterfaceMethodref") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "36597B2E03DC" + width 550 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantMethodref" @79 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2688, 1104) + label (object ItemLabel + Parent_View @79 + location (2504, 1055) + fill_color 13434879 + nlines 1 + max_width 368 + justify 0 + label "ConstantMethodref") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "36597B3F01C3" + width 386 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantFieldref" @80 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1648, 1104) + label (object ItemLabel + Parent_View @80 + location (1484, 1055) + fill_color 13434879 + nlines 1 + max_width 328 + justify 0 + label "ConstantFieldref") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "36597B460340" + width 346 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantPool" @81 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2368, 176) + label (object ItemLabel + Parent_View @81 + location (2220, 97) + fill_color 13434879 + nlines 1 + max_width 296 + justify 0 + label "ConstantPool") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365976440134" + width 314 + height 186 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::Constant" @82 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2368, 448) + label (object ItemLabel + Parent_View @82 + location (2270, 399) + fill_color 13434879 + nlines 1 + max_width 196 + justify 0 + label "Constant") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659764E01CE" + width 214 + height 126 + annotation 8 + autoResize TRUE) + (object AssociationViewNew "$UNNAMED$27" @83 + location (2368, 326) + stereotype TRUE + line_color 3342489 + quidu "36597ADA000F" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$28" @84 + Parent_View @83 + location (1968, -2298) + stereotype TRUE + line_color 3342489 + quidu "36597ADA0327" + client @83 + supplier @81 + line_style 0 + label (object SegLabel @85 + Parent_View @84 + location (2422, 276) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "1" + pctDist 0.900000 + height 54 + orientation 1)) + (object RoleView "$UNNAMED$29" @86 + Parent_View @83 + location (1968, -2298) + stereotype TRUE + line_color 3342489 + quidu "36597ADA0331" + client @83 + supplier @82 + line_style 0 + label (object SegLabel @87 + Parent_View @86 + location (2422, 378) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "*" + pctDist 0.900000 + height 54 + orientation 0)))) + (object InheritTreeView "" @88 + location (2181, 956) + line_color 3342489 + fill_color 13434879 + supplier @77 + vertices (list Points + (2181, 956) + (2181, 863))) + (object InheritView "" @89 + stereotype TRUE + line_color 3342489 + quidu "365A9E84020B" + client @80 + supplier @77 + line_style 3 + origin_attachment (1640, 1041) + terminal_attachment (1640, 956) + drawSupplier @88) + (object ClassView "Class" "Logical View::ConstantString" @90 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2704, 800) + label (object ItemLabel + Parent_View @90 + location (2552, 751) + fill_color 13434879 + nlines 1 + max_width 304 + justify 0 + label "ConstantString") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A9EE901C0" + width 322 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantClass" @91 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1360, 800) + label (object ItemLabel + Parent_View @91 + location (1208, 751) + fill_color 13434879 + nlines 1 + max_width 304 + justify 0 + label "ConstantClass") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A9EFB005D" + width 322 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantInteger" @92 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1968, 432) + label (object ItemLabel + Parent_View @92 + location (1812, 383) + fill_color 13434879 + nlines 1 + max_width 312 + justify 0 + label "ConstantInteger") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A9F020374" + width 330 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantDouble" @93 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1568, 432) + label (object ItemLabel + Parent_View @93 + location (1406, 383) + fill_color 13434879 + nlines 1 + max_width 324 + justify 0 + label "ConstantDouble") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A9F0902C0" + width 342 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantFloat" @94 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1760, 800) + label (object ItemLabel + Parent_View @94 + location (1617, 751) + fill_color 13434879 + nlines 1 + max_width 286 + justify 0 + label "ConstantFloat") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A9F1003E3" + width 304 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantLong" @95 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1184, 432) + label (object ItemLabel + Parent_View @95 + location (1041, 383) + fill_color 13434879 + nlines 1 + max_width 286 + justify 0 + label "ConstantLong") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A9F3F0228" + width 304 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantUnicode" @96 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (3136, 800) + label (object ItemLabel + Parent_View @96 + location (2964, 751) + fill_color 13434879 + nlines 1 + max_width 344 + justify 0 + label "ConstantUnicode") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A9F4E01CF" + width 362 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantNameAndType" @97 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2848, 432) + label (object ItemLabel + Parent_View @97 + location (2620, 383) + fill_color 13434879 + nlines 1 + max_width 456 + justify 0 + label "ConstantNameAndType") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A9F5B00A1" + width 474 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConstantUtf8" @98 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (3312, 432) + label (object ItemLabel + Parent_View @98 + location (3178, 383) + fill_color 13434879 + nlines 1 + max_width 268 + justify 0 + label "ConstantUtf8") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A9F7400A7" + width 286 + height 126 + annotation 8 + autoResize TRUE) + (object InheritTreeView "" @99 + location (2374, 625) + line_color 3342489 + fill_color 13434879 + supplier @82 + vertices (list Points + (2374, 625) + (2374, 511))) + (object InheritView "" @100 + stereotype TRUE + line_color 3342489 + quidu "365A9F8A00C7" + client @91 + supplier @82 + line_style 3 + origin_attachment (1362, 737) + terminal_attachment (1362, 625) + drawSupplier @99) + (object InheritView "" @101 + stereotype TRUE + line_color 3342489 + quidu "365A9F9D0010" + client @90 + supplier @82 + line_style 3 + origin_attachment (2698, 737) + terminal_attachment (2698, 625) + drawSupplier @99) + (object InheritView "" @102 + stereotype TRUE + line_color 3342489 + quidu "365A9FA002A9" + client @93 + supplier @82 + line_style 3 + origin_attachment (1559, 495) + terminal_attachment (1559, 625) + drawSupplier @99) + (object InheritView "" @103 + stereotype TRUE + line_color 3342489 + quidu "365A9FA80110" + client @96 + supplier @82 + line_style 3 + origin_attachment (3133, 737) + terminal_attachment (3133, 625) + drawSupplier @99) + (object InheritView "" @104 + stereotype TRUE + line_color 3342489 + quidu "365A9FAB016F" + client @95 + supplier @82 + line_style 3 + origin_attachment (1181, 495) + terminal_attachment (1181, 625) + drawSupplier @99) + (object InheritView "" @105 + stereotype TRUE + line_color 3342489 + quidu "365A9FB1031C" + client @98 + supplier @82 + line_style 3 + origin_attachment (3312, 495) + terminal_attachment (3312, 625) + drawSupplier @99) + (object InheritView "" @106 + stereotype TRUE + line_color 3342489 + quidu "36597AFA0160" + client @77 + supplier @82 + line_style 3 + origin_attachment (2190, 737) + terminal_attachment (2190, 625) + drawSupplier @99) + (object InheritView "" @107 + stereotype TRUE + line_color 3342489 + quidu "365AA0090278" + client @92 + supplier @82 + line_style 3 + origin_attachment (1950, 495) + terminal_attachment (1950, 625) + drawSupplier @99) + (object InheritView "" @108 + stereotype TRUE + line_color 3342489 + quidu "365A9FA302D6" + client @94 + supplier @82 + line_style 3 + origin_attachment (1753, 737) + terminal_attachment (1753, 625) + drawSupplier @99) + (object InheritView "" @109 + stereotype TRUE + line_color 3342489 + quidu "365A9FAE01FF" + client @97 + supplier @82 + line_style 3 + origin_attachment (2812, 495) + terminal_attachment (2812, 625) + drawSupplier @99) + (object InheritView "" @110 + stereotype TRUE + line_color 3342489 + quidu "365A9E870042" + client @78 + supplier @77 + line_style 3 + origin_attachment (2143, 1041) + terminal_attachment (2143, 956) + drawSupplier @88) + (object InheritView "" @111 + stereotype TRUE + line_color 3342489 + quidu "365A9E8D0091" + client @79 + supplier @77 + line_style 3 + origin_attachment (2668, 1041) + terminal_attachment (2668, 956) + drawSupplier @88))))) + root_subsystem (object SubSystem "Component View" + quid "365971490054" + physical_models (list unit_reference_list) + physical_presentations (list unit_reference_list + (object Module_Diagram "Main" + quid "3659714A039F" + title "Main" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)))) + process_structure (object Processes + quid "365971490055" + ProcsNDevs (list + (object Process_Diagram "Deployment View" + quid "36597149005E" + title "Deployment View" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)))) + properties (object Properties + quid "365971490056")) diff --git a/docs/diagrams.tex b/docs/diagrams.tex new file mode 100644 index 00000000..454b7242 --- /dev/null +++ b/docs/diagrams.tex @@ -0,0 +1,19 @@ + +\begin{figure}[htbp] + \begin{center} + \leavevmode + \epsfysize0.93\textheight + \epsfbox{eps/constantpool.eps} + \caption{UML diagram for the ConstantPool API}\label{fig:umlcp} + \end{center} +\end{figure} + +\begin{figure}[ht] + \begin{center} + \leavevmode + \epsfysize0.93\textheight + \epsfbox{eps/instructions.eps} + \caption{UML diagram for the Instruction API}\label{fig:umlinstr} + \end{center} +\end{figure} + diff --git a/docs/eps/classfile.eps b/docs/eps/classfile.eps new file mode 100644 index 00000000..5896e457 --- /dev/null +++ b/docs/eps/classfile.eps @@ -0,0 +1,378 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: classfile.eps +%%Creator: fig2dev Version 3.2 Patchlevel 1 +%%CreationDate: Mon Nov 30 16:01:26 1998 +%%For: dahm@che (Markus Dahm,,,,,) +%%Orientation: Portrait +%%BoundingBox: 0 0 520 460 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +-17.0 540.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n -1000 10000 m -1000 -1000 l 9937 -1000 l 9937 10000 l cp clip + 0.06000 0.06000 sc +% Polyline +7.500 slw +n 2999 6599 m 2400 6599 l 2400 6749 l 2999 6749 l cp gs col0 s gr +% Polyline +n 2400 6749 m 2999 6749 l 2999 6899 l 2400 6899 l cp gs col0 s gr +% Polyline +n 2999 6899 m 2400 6899 l 2400 7049 l 2999 7049 l cp gs col0 s gr +% Polyline +n 2400 7049 m 2999 7049 l 2999 7200 l 2400 7200 l cp gs col0 s gr +% Polyline +n 2400 7200 m 2999 7200 l 2999 7349 l 2400 7349 l cp gs col0 s gr +% Polyline +30.000 slw + [15 45] 45 sd +n 2699 7424 m 2699 7724 l gs col0 s gr [] 0 sd +% Polyline +7.500 slw +n 299 6449 m 3299 6449 l 3299 7949 l 299 7949 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 6824 m +gs 1 -1 sc (Methods) col0 sh gr +% Polyline +n 2999 5099 m 2400 5099 l 2400 5249 l 2999 5249 l cp gs col0 s gr +% Polyline +n 2400 5249 m 2999 5249 l 2999 5399 l 2400 5399 l cp gs col0 s gr +% Polyline +n 2999 5399 m 2400 5399 l 2400 5549 l 2999 5549 l cp gs col0 s gr +% Polyline +n 2400 5549 m 2999 5549 l 2999 5699 l 2400 5699 l cp gs col0 s gr +% Polyline +n 2400 5699 m 2999 5699 l 2999 5849 l 2400 5849 l cp gs col0 s gr +% Polyline +30.000 slw + [15 45] 45 sd +n 2699 5924 m 2699 6224 l gs col0 s gr [] 0 sd +% Polyline +7.500 slw +n 299 4949 m 3299 4949 l 3299 6449 l 299 6449 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 5399 m +gs 1 -1 sc (Fields) col0 sh gr +% Polyline +n 299 4199 m 3299 4199 l 3299 4949 l 299 4949 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 4649 m +gs 1 -1 sc (Implemented interfaces) col0 sh gr +% Polyline +n 299 3449 m 3299 3449 l 3299 4199 l 299 4199 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 3899 m +gs 1 -1 sc (Access rights) col0 sh gr +% Polyline +n 299 1349 m 3299 1349 l 3299 2099 l 299 2099 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 1799 m +gs 1 -1 sc (Header) col0 sh gr +% Polyline +n 2999 2249 m 2400 2249 l 2400 2400 l 2999 2400 l cp gs col0 s gr +% Polyline +n 2400 2400 m 2999 2400 l 2999 2549 l 2400 2549 l cp gs col0 s gr +% Polyline +n 2999 2549 m 2400 2549 l 2400 2699 l 2999 2699 l cp gs col0 s gr +% Polyline +n 2400 2699 m 2999 2699 l 2999 2849 l 2400 2849 l cp gs col0 s gr +% Polyline +n 2400 2849 m 2999 2849 l 2999 2999 l 2400 2999 l cp gs col0 s gr +% Polyline +30.000 slw + [15 45] 45 sd +n 2699 3074 m 2699 3374 l gs col0 s gr [] 0 sd +% Polyline +7.500 slw +n 299 2099 m 3299 2099 l 3299 3449 l 299 3449 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 2549 m +gs 1 -1 sc (Constant pool) col0 sh gr +% Polyline +n 299 7949 m 3299 7949 l 3299 8699 l 299 8699 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 8400 m +gs 1 -1 sc (Class attributes) col0 sh gr +% Polyline +n 4800 2999 m 7499 2999 l 7499 4349 l 4800 4349 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +5099 3299 m +gs 1 -1 sc (ConstantFieldref) col0 sh gr +/Helvetica ff 210.00 scf sf +5099 3600 m +gs 1 -1 sc ("aVariable") col0 sh gr +/Helvetica ff 210.00 scf sf +5099 3884 m +gs 1 -1 sc ("[Ljava/lang/Object;") col0 sh gr +/Helvetica ff 210.00 scf sf +5099 4199 m +gs 1 -1 sc ("HelloWorld") col0 sh gr +% Polyline +n 5024 2624 m 7124 2624 l 7124 2924 l 5024 2924 l cp gs col0 s gr +/Helvetica ff 210.00 scf sf +5099 2849 m +gs 1 -1 sc ("java/io/PrintStream") col0 sh gr +% Polyline +n 4800 1649 m 7499 1649 l 7499 2999 l 4800 2999 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +5099 1949 m +gs 1 -1 sc (ConstantMethodRef) col0 sh gr +/Helvetica ff 210.00 scf sf +5099 2249 m +gs 1 -1 sc ("println") col0 sh gr +/Helvetica ff 210.00 scf sf +5099 2534 m +gs 1 -1 sc ("\(Ljava/lang/String;\)V") col0 sh gr +% Polyline +n 4800 4349 m 7499 4349 l 7499 5099 l 4800 5099 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +5099 4649 m +gs 1 -1 sc (ConstantClass) col0 sh gr +/Helvetica ff 210.00 scf sf +5099 4949 m +gs 1 -1 sc ("java/io/PrintStream") col0 sh gr +% Polyline +n 4080 6500 m 3975 6500 3975 7770 105 arcto 4 {pop} repeat + 3975 7875 8820 7875 105 arcto 4 {pop} repeat + 8925 7875 8925 6605 105 arcto 4 {pop} repeat + 8925 6500 4080 6500 105 arcto 4 {pop} repeat + cp gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3855 6725 m 3750 6725 3750 7995 105 arcto 4 {pop} repeat + 3750 8100 8595 8100 105 arcto 4 {pop} repeat + 8700 8100 8700 6830 105 arcto 4 {pop} repeat + 8700 6725 3855 6725 105 arcto 4 {pop} repeat + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +30.000 slw + [15 45] 45 sd +n 6150 7800 m 6150 7950 l gs col0 s gr [] 0 sd +% Polyline +7.500 slw +n 5550 7200 m 7200 7200 l 7200 7425 l 5550 7425 l cp gs col0 s gr +% Polyline +n 5550 7500 m 8625 7500 l 8625 7725 l 5550 7725 l cp gs col0 s gr +/Courier-Bold ff 180.00 scf sf +4050 7050 m +gs 1 -1 sc (getstatic java.lang.System.out) col0 sh gr +/Courier-Bold ff 180.00 scf sf +4050 7650 m +gs 1 -1 sc (invokevirtual java.io.PrintStream.println) col0 sh gr +/Courier-Bold ff 180.00 scf sf +4050 7350 m +gs 1 -1 sc (ldc "Hello, world") col0 sh gr +% Polyline + [15 45] 45 sd +n 2400 2249 m 4800 1649 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 2400 2849 m 4800 5849 l gs col0 s gr [] 0 sd +% Polyline +gs clippath +4693 3661 m 4800 3600 l 4734 3705 l 4832 3611 l 4790 3568 l cp +clip +n 2999 5324 m 4800 3600 l gs col0 s gr gr + +% arrowhead +n 4693 3661 m 4800 3600 l 4734 3705 l 4713 3683 l 4693 3661 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +3669 7107 m 3750 7200 l 3635 7156 l 3745 7233 l 3779 7184 l cp +clip +n 2999 6674 m 3750 7200 l gs col0 s gr gr + +% arrowhead +n 3669 7107 m 3750 7200 l 3635 7156 l 3652 7131 l 3669 7107 l cp gs 0.00 setgray ef gr col0 s +% Polyline +n 5099 1649 m 5099 1349 l 7799 1349 l 7799 5549 l 7499 5549 l 7499 1649 l + 5099 1649 l cp gs 0.00 setgray ef gr gs col0 s gr +% Polyline + [15 45] 45 sd +n 2999 2849 m 4800 4049 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 2999 2249 m 4800 2024 l gs col0 s gr [] 0 sd +% Polyline +gs clippath +7609 2533 m 7500 2475 l 7624 2475 l 7493 2442 l 7478 2500 l cp +clip +n 7800 2550 m 7500 2475 l gs col7 s gr gr + +% arrowhead +n 7609 2533 m 7500 2475 l 7624 2475 l 7616 2504 l 7609 2533 l cp gs col7 1.00 shd ef gr col7 s +% Polyline +n 4800 5099 m 7499 5099 l 7499 5849 l 4800 5849 l cp gs col0 s gr +% Polyline +n 7800 7500 m 7801 7499 l 7804 7496 l 7809 7491 l 7816 7483 l 7826 7472 l + 7840 7457 l 7856 7440 l 7875 7419 l 7897 7395 l 7921 7368 l + 7946 7340 l 7973 7310 l 7999 7279 l 8026 7247 l 8052 7216 l + 8078 7184 l 8102 7152 l 8125 7121 l 8147 7090 l 8167 7059 l + 8186 7029 l 8203 6998 l 8220 6966 l 8235 6934 l 8250 6900 l + 8261 6873 l 8272 6845 l 8282 6816 l 8292 6786 l 8303 6756 l + 8313 6724 l 8323 6692 l 8333 6659 l 8343 6626 l 8353 6592 l + 8363 6557 l 8373 6522 l 8382 6487 l 8392 6451 l 8402 6415 l + 8412 6379 l 8421 6342 l 8431 6305 l 8440 6268 l 8449 6231 l + 8458 6194 l 8467 6157 l 8476 6120 l 8484 6082 l 8492 6045 l + 8500 6007 l 8508 5969 l 8515 5932 l 8522 5894 l 8528 5856 l + 8535 5817 l 8540 5778 l 8545 5739 l 8550 5700 l 8554 5664 l + 8557 5628 l 8560 5591 l 8563 5554 l 8565 5517 l 8567 5479 l + 8568 5440 l 8570 5401 l 8571 5362 l 8572 5322 l 8572 5281 l + 8573 5241 l 8573 5200 l 8573 5159 l 8573 5117 l 8573 5076 l + 8572 5034 l 8572 4992 l 8571 4950 l 8570 4908 l 8570 4866 l + 8569 4824 l 8568 4783 l 8567 4741 l 8566 4700 l 8565 4659 l + 8564 4619 l 8563 4578 l 8562 4538 l 8561 4499 l 8560 4460 l + 8559 4421 l 8558 4383 l 8557 4346 l 8555 4309 l 8554 4272 l + 8552 4236 l 8550 4200 l 8548 4161 l 8545 4121 l 8542 4083 l + 8540 4044 l 8537 4006 l 8534 3968 l 8531 3930 l 8528 3892 l + 8526 3854 l 8523 3815 l 8520 3777 l 8517 3739 l 8515 3702 l + 8512 3664 l 8509 3626 l 8506 3588 l 8503 3551 l 8500 3514 l + 8497 3477 l 8493 3440 l 8490 3404 l 8486 3368 l 8481 3333 l + 8477 3298 l 8471 3264 l 8466 3231 l 8460 3199 l 8453 3167 l + 8446 3136 l 8438 3107 l 8430 3078 l 8421 3051 l 8411 3025 l + 8400 3000 l 8385 2969 l 8368 2941 l 8349 2913 l 8328 2887 l + 8305 2862 l 8279 2838 l 8251 2814 l 8220 2790 l 8187 2767 l + 8153 2744 l 8117 2721 l 8080 2699 l 8043 2678 l 8006 2657 l + 7970 2638 l 7937 2620 l 7907 2604 l 7879 2590 l 7856 2578 l + 7837 2568 l 7823 2561 l 7812 2556 l 7805 2553 l 7802 2551 l + 7800 2550 l gs col0 s gr +% Polyline +gs clippath +4723 4703 m 4800 4800 l 4687 4750 l 4794 4833 l 4830 4785 l cp +clip +n 5025 2775 m 5024 2776 l 5020 2779 l 5015 2784 l 5006 2792 l 4993 2804 l + 4977 2818 l 4957 2836 l 4934 2857 l 4908 2881 l 4879 2907 l + 4849 2935 l 4818 2964 l 4786 2994 l 4754 3023 l 4723 3053 l + 4693 3082 l 4664 3110 l 4637 3137 l 4612 3163 l 4589 3188 l + 4568 3212 l 4549 3235 l 4531 3257 l 4515 3278 l 4500 3300 l + 4485 3324 l 4471 3347 l 4457 3371 l 4444 3396 l 4432 3420 l + 4419 3445 l 4408 3470 l 4396 3495 l 4385 3520 l 4374 3546 l + 4363 3571 l 4352 3596 l 4342 3622 l 4332 3647 l 4323 3673 l + 4314 3698 l 4306 3724 l 4299 3749 l 4292 3775 l 4286 3800 l + 4281 3825 l 4278 3850 l 4276 3875 l 4275 3900 l 4276 3925 l + 4278 3950 l 4282 3975 l 4287 4001 l 4293 4027 l 4301 4053 l + 4309 4080 l 4319 4106 l 4329 4133 l 4340 4160 l 4351 4187 l + 4363 4214 l 4375 4241 l 4387 4268 l 4399 4294 l 4411 4320 l + 4423 4345 l 4434 4370 l 4446 4394 l 4457 4417 l 4468 4439 l + 4478 4460 l 4489 4481 l 4500 4500 l 4513 4522 l 4528 4543 l + 4543 4563 l 4559 4583 l 4578 4603 l 4597 4623 l 4618 4643 l + 4640 4664 l 4663 4685 l 4686 4705 l 4709 4724 l 4730 4742 l + 4749 4758 l 4765 4772 l 4778 4783 l 4800 4800 l gs col0 s gr gr + +% arrowhead +n 4723 4703 m 4800 4800 l 4687 4750 l 4705 4727 l 4723 4703 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +7591 5782 m 7499 5699 l 7619 5728 l 7500 5665 l 7472 5719 l cp +clip +n 7200 7275 m 7203 7274 l 7208 7271 l 7219 7265 l 7235 7257 l 7256 7246 l + 7282 7233 l 7312 7217 l 7346 7200 l 7381 7182 l 7417 7163 l + 7453 7144 l 7487 7126 l 7520 7109 l 7551 7092 l 7580 7076 l + 7607 7061 l 7631 7048 l 7654 7034 l 7676 7022 l 7696 7010 l + 7714 6998 l 7733 6986 l 7750 6975 l 7770 6961 l 7790 6947 l + 7810 6933 l 7829 6918 l 7847 6903 l 7866 6887 l 7883 6871 l + 7901 6855 l 7917 6837 l 7933 6820 l 7947 6802 l 7961 6784 l + 7973 6766 l 7984 6748 l 7994 6729 l 8003 6711 l 8010 6693 l + 8016 6675 l 8021 6656 l 8025 6638 l 8028 6618 l 8030 6598 l + 8031 6578 l 8031 6556 l 8030 6534 l 8029 6511 l 8026 6487 l + 8023 6462 l 8019 6438 l 8015 6412 l 8009 6387 l 8004 6362 l + 7997 6338 l 7991 6314 l 7984 6291 l 7977 6269 l 7971 6247 l + 7964 6226 l 7957 6207 l 7950 6187 l 7942 6167 l 7934 6146 l + 7926 6126 l 7918 6106 l 7909 6086 l 7900 6066 l 7891 6046 l + 7881 6027 l 7871 6008 l 7861 5990 l 7850 5972 l 7840 5956 l + 7829 5940 l 7818 5925 l 7807 5911 l 7797 5898 l 7785 5886 l + 7774 5874 l 7762 5863 l 7750 5852 l 7737 5841 l 7722 5830 l + 7707 5819 l 7689 5807 l 7670 5795 l 7648 5782 l 7625 5769 l + 7602 5755 l 7578 5742 l 7555 5729 l 7535 5718 l 7499 5699 l gs col0 s gr gr + +% arrowhead +n 7591 5782 m 7499 5699 l 7619 5728 l 7605 5755 l 7591 5782 l cp gs 0.00 setgray ef gr col0 s +/Helvetica ff 210.00 scf sf +975 9000 m +gs 1 -1 sc (HelloWorld.class) col0 sh gr +/Helvetica ff 210.00 scf sf +5099 5699 m +gs 1 -1 sc ("Hello, world") col0 sh gr +/Helvetica-Bold ff 210.00 scf sf +5099 5399 m +gs 1 -1 sc (ConstantString) col0 sh gr +$F2psEnd +rs diff --git a/docs/eps/classfile.fig b/docs/eps/classfile.fig new file mode 100644 index 00000000..e52815ce --- /dev/null +++ b/docs/eps/classfile.fig @@ -0,0 +1,173 @@ +#FIG 3.2 +Portrait +Center +Inches +A4 +100.00 +Single +-2 +1200 2 +6 299 1349 3299 8699 +6 299 1349 3299 7949 +6 299 6449 3299 7949 +6 2400 6599 2999 7799 +6 2400 6599 2999 7349 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2999 6599 2400 6599 2400 6749 2999 6749 2999 6599 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2400 6749 2999 6749 2999 6899 2400 6899 2400 6749 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2999 6899 2400 6899 2400 7049 2999 7049 2999 6899 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2400 7049 2999 7049 2999 7200 2400 7200 2400 7049 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2400 7200 2999 7200 2999 7349 2400 7349 2400 7200 +-6 +2 1 2 3 0 7 100 0 -1 3.000 0 0 -1 0 0 2 + 2699 7424 2699 7724 +-6 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 299 6449 3299 6449 3299 7949 299 7949 299 6449 +4 0 0 100 0 18 14 0.0000 4 165 900 599 6824 Methods\001 +-6 +6 299 4949 3299 6449 +6 2400 5099 2999 6299 +6 2400 5099 2999 5849 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2999 5099 2400 5099 2400 5249 2999 5249 2999 5099 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2400 5249 2999 5249 2999 5399 2400 5399 2400 5249 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2999 5399 2400 5399 2400 5549 2999 5549 2999 5399 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2400 5549 2999 5549 2999 5699 2400 5699 2400 5549 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2400 5699 2999 5699 2999 5849 2400 5849 2400 5699 +-6 +2 1 2 3 0 7 100 0 -1 3.000 0 0 -1 0 0 2 + 2699 5924 2699 6224 +-6 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 299 4949 3299 4949 3299 6449 299 6449 299 4949 +4 0 0 100 0 18 14 0.0000 4 165 630 599 5399 Fields\001 +-6 +6 299 4199 3299 4949 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 299 4199 3299 4199 3299 4949 299 4949 299 4199 +4 0 0 100 0 18 14 0.0000 4 210 2400 599 4649 Implemented interfaces\001 +-6 +6 299 3449 3299 4199 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 299 3449 3299 3449 3299 4199 299 4199 299 3449 +4 0 0 100 0 18 14 0.0000 4 210 1410 599 3899 Access rights\001 +-6 +6 299 1349 3299 2099 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 299 1349 3299 1349 3299 2099 299 2099 299 1349 +4 0 0 100 0 18 14 0.0000 4 165 720 599 1799 Header\001 +-6 +6 2400 2249 2999 3449 +6 2400 2249 2999 2999 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2999 2249 2400 2249 2400 2400 2999 2400 2999 2249 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2400 2400 2999 2400 2999 2549 2400 2549 2400 2400 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2999 2549 2400 2549 2400 2699 2999 2699 2999 2549 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2400 2699 2999 2699 2999 2849 2400 2849 2400 2699 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 2400 2849 2999 2849 2999 2999 2400 2999 2400 2849 +-6 +2 1 2 3 0 7 100 0 -1 3.000 0 0 -1 0 0 2 + 2699 3074 2699 3374 +-6 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 299 2099 3299 2099 3299 3449 299 3449 299 2099 +4 0 0 100 0 18 14 0.0000 4 210 1470 599 2549 Constant pool\001 +-6 +6 299 7949 3299 8699 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 299 7949 3299 7949 3299 8699 299 8699 299 7949 +4 0 0 100 0 18 14 0.0000 4 165 1620 599 8400 Class attributes\001 +-6 +-6 +6 4800 2999 7499 4349 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 4800 2999 7499 2999 7499 4349 4800 4349 4800 2999 +4 0 0 100 0 18 14 0.0000 4 165 1725 5099 3299 ConstantFieldref\001 +4 0 0 100 0 16 14 0.0000 4 165 1050 5099 3600 "aVariable"\001 +4 0 0 100 0 16 14 0.0000 4 210 1920 5099 3884 "[Ljava/lang/Object;"\001 +4 0 0 100 0 16 14 0.0000 4 165 1185 5099 4199 "HelloWorld"\001 +-6 +6 4800 1649 7499 2999 +6 5024 2624 7124 2924 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 5024 2624 7124 2624 7124 2924 5024 2924 5024 2624 +4 0 0 100 0 16 14 0.0000 4 210 1950 5099 2849 "java/io/PrintStream"\001 +-6 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 4800 1649 7499 1649 7499 2999 4800 2999 4800 1649 +4 0 0 100 0 18 14 0.0000 4 165 2070 5099 1949 ConstantMethodRef\001 +4 0 0 100 0 16 14 0.0000 4 210 735 5099 2249 "println"\001 +4 0 0 100 0 16 14 0.0000 4 210 2085 5099 2534 "(Ljava/lang/String;)V"\001 +-6 +6 4800 4349 7499 5099 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 4800 4349 7499 4349 7499 5099 4800 5099 4800 4349 +4 0 0 100 0 18 14 0.0000 4 165 1515 5099 4649 ConstantClass\001 +4 0 0 100 0 16 14 0.0000 4 210 1950 5099 4949 "java/io/PrintStream"\001 +-6 +6 3750 6450 8925 8100 +2 4 0 1 0 0 100 0 20 0.000 0 0 7 0 0 5 + 8925 7875 3975 7875 3975 6500 8925 6500 8925 7875 +2 4 0 1 0 7 100 0 20 0.000 0 0 7 0 0 5 + 8700 8100 3750 8100 3750 6725 8700 6725 8700 8100 +-6 +6 4050 6900 8625 8025 +2 1 2 3 0 7 100 0 -1 3.000 0 0 -1 0 0 2 + 6150 7800 6150 7950 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 5550 7200 7200 7200 7200 7425 5550 7425 5550 7200 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 5550 7500 8625 7500 8625 7725 5550 7725 5550 7500 +4 0 0 100 0 14 12 0.0000 4 180 3570 4050 7050 getstatic java.lang.System.out\001 +4 0 0 100 0 14 12 0.0000 4 180 4305 4050 7650 invokevirtual java.io.PrintStream.println\001 +4 0 0 100 0 14 12 0.0000 4 150 2940 4050 7350 ldc "Hello, world"\001 +-6 +2 1 2 1 0 7 100 0 -1 3.000 0 0 -1 0 0 2 + 2400 2249 4800 1649 +2 1 2 1 0 7 100 0 -1 3.000 0 0 -1 0 0 2 + 2400 2849 4800 5849 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2999 5324 4800 3600 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2999 6674 3750 7200 +2 1 0 1 0 0 100 0 20 0.000 0 0 -1 0 0 7 + 5099 1649 5099 1349 7799 1349 7799 5549 7499 5549 7499 1649 + 5099 1649 +2 1 2 1 0 7 100 0 -1 3.000 0 0 -1 0 0 2 + 2999 2849 4800 4049 +2 1 2 1 0 7 100 0 -1 3.000 0 0 -1 0 0 2 + 2999 2249 4800 2024 +2 1 0 1 7 7 100 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7800 2550 7500 2475 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 4800 5099 7499 5099 7499 5849 4800 5849 4800 5099 +3 2 0 1 0 7 100 0 -1 0.000 0 0 0 6 + 7800 7500 8250 6900 8550 5700 8550 4200 8400 3000 7800 2550 + 0.000 -1.000 -1.000 -1.000 -1.000 0.000 +3 2 0 1 0 7 100 0 -1 0.000 0 1 0 5 + 1 1 1.00 60.00 120.00 + 5025 2775 4500 3300 4275 3900 4500 4500 4800 4800 + 0.000 -1.000 -1.000 -1.000 0.000 +3 0 0 1 0 7 100 0 -1 0.000 0 1 0 6 + 1 1 1.00 60.00 120.00 + 7200 7275 7800 6975 8100 6675 7950 6150 7799 5849 7499 5699 + 0.000 1.000 1.000 1.000 1.000 0.000 +4 0 0 100 0 16 14 0.0000 4 165 1575 975 9000 HelloWorld.class\001 +4 0 0 100 0 16 14 0.0000 4 195 1260 5099 5699 "Hello, world"\001 +4 0 0 100 0 18 14 0.0000 4 210 1560 5099 5399 ConstantString\001 diff --git a/docs/eps/classgen.eps b/docs/eps/classgen.eps new file mode 100644 index 00000000..4d7052b1 --- /dev/null +++ b/docs/eps/classgen.eps @@ -0,0 +1,499 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: Rose Diagram(s) +%%Creator: AdobePS5.dll Version 5.0 +%%CreationDate: 7/7/1999 17:42:13 +%%Pages: 1 +%%Orientation: Portrait +%%PageOrder: Ascend +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%DocumentData: Clean7Bit +%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 +%%LanguageLevel: 2 +%%BoundingBox: 13 12 535 830 +%%EndComments +%%BeginProcSet: epsffit 1 0 +gsave +1249.738 -7.476 translate +90 rotate +1.623 1.623 scale +%%EndProcSet + + +%%BeginDefaults +%%PageBoundingBox: 13 12 582 830 +%%EndDefaults + +%%BeginProlog +%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 +/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false +setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype +ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch +def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 +rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def +/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def +typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 +def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp +exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def +/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype +{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} +readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop +(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def +/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) +tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup +xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint +tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck +{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) +tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup +rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} +forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier +/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin +$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 +ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto +(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt +$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} +repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print +(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup +0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop +/setpacking where{pop oldpack setpacking}if}if +%%EndResource +userdict /Pscript_WinNT_Incr 230 dict dup begin put +%%BeginResource: file Pscript_FatalError 5.0 0 +/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div +cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def +%%EndResource +/VM?{vmstatus exch sub exch pop gt{[ +(This job requires more memory than is available in this printer.)100 500 +(Try one or more of the following, and then print again:)100 485 +(For the output format, choose Optimize For Portability.)115 470 +(In the Device Settings page, make sure the Available PostScript Memory is accurate.) +115 455(Reduce the number of fonts in the document.)115 440 +(Print the document in parts.)115 425 12/Times-Roman showpage +(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def +%%BeginResource: file Pscript_Win_Basic 5.0 0 +/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ +/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- +/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , +d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C +/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M +/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d +/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage +, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false +/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d +/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, +d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx +matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit +/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} +b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U +/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d +reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d +/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 +sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} +b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b +/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b +/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} +b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b +%%EndResource +%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 +/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge +{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ +snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F +setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d +/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b +%%EndResource +end +%%EndProlog + +%%BeginSetup +[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec +1 setlinecap 1 setlinejoin +/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def +%%EndSetup + +%%Page: 1 1 +%%PageBoundingBox: 13 12 582 830 +%%EndPageComments +%%BeginPageSetup +/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh +%%EndPageSetup + +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Win_GdiObject 5.0 0 +/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore +{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d +/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps +L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType +1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d +/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal +{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep +gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b +/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M +MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep +M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 ++}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d +/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix +GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 +/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal +makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 +/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d +/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] +d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 +0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne +{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd +aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx +PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save +8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 +Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx +matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` +xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill +{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot +concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap +YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 +-0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix +currentmatrix readonly d ; ;}if}b +%%EndResource +%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 +/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} +{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 +d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d +20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d +/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ +/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict +~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} +? ;}b +%%EndResource +end reinitialize +: N 234 594 236 124 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 470 593 M 233 593 I 233 718 I 470 718 I C +K +0 0 0 1 scol Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Text 5.0 0 +/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d +/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ +length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets +{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& +/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} +if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ +{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get +StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ +{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ +length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ +put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M +currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d +/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N +/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix +astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get +length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d +/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS +{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 +copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for +& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ +4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 +add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for +/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 +Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName +length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length +string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ +putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 +$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? +{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName +get undefinefont}forall undefinefont}b +%%EndResource +end reinitialize +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Encoding256 5.0 0 +/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction +/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign +/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma +/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon +/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S +/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave +/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright +/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis +/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef +/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet +/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef +/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section +/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered +/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph +/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter +/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis +/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute +/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls +/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute +/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve +/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex +/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put +%%EndResource +end reinitialize + +%%IncludeResource: font Helvetica +F /F0 0 /256 T /Helvetica mF +/F0S29 F0 [41 0 0 -41 0 0 ] mFS +F0S29 Ji +257 643 M (BasicType)[27 23 20 8 21 26 19 23 0]xS +0.602 0 0.199 1 scol N 470 659 M 233 659 I 233 718 I 470 718 I C +K +N 470 682 M 233 682 I 233 718 I 470 718 I C +K +: N 252 292 360 184 rp C +1 1 0.801 1 scol L ; N 612 291 M 251 291 I 251 476 I 612 476 I C +K +0 0 0 1 scol 326 341 M (ObjectType)[32 23 10 23 21 11 26 19 23 0]xS +0.602 0 0.199 1 scol N 612 357 M 251 357 I 251 476 I 612 476 I C +K +N 612 380 M 251 380 I 251 476 I 612 476 I C +K +0 0 0 1 scol 310 448 M (getClassName\(\))[23 23 11 30 10 23 20 20 30 23 36 23 14 0]xS +: N 699 292 362 184 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1061 291 M 698 291 I 698 476 I 1061 476 I C +K +0 0 0 1 scol 786 341 M (ArrayType)[27 14 14 23 19 26 19 23 0]xS +0.602 0 0.199 1 scol N 1061 357 M 698 357 I 698 476 I 1061 476 I C +K +N 1061 380 M 698 380 I 698 476 I 1061 476 I C +K +0 0 0 1 scol 757 448 M (getDimensions\(\))[23 23 11 30 8 36 23 23 20 8 23 23 20 14 0]xS +: N 532 594 312 124 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 844 593 M 531 593 I 531 718 I 844 718 I C +K +0 0 0 1 scol 546 643 M (ReferenceType)[30 23 12 23 14 23 23 21 23 26 19 23 0]xS +0.602 0 0.199 1 scol N 844 659 M 531 659 I 531 718 I 844 718 I C +K +N 844 682 M 531 682 I 531 718 I 844 718 I C +K +: N 1202 295 284 178 rp C +1 1 0.801 1 scol L ; N 1486 294 M 1201 294 I 1201 473 I 1486 473 I C +K +0 0 0 1 scol +%%IncludeResource: font Helvetica-Oblique +F /F1 0 /256 T /Helvetica-Oblique mF +/F1S29 F1 [41 0 0 -41 0 0 ] mFS +F1S29 Ji +1226 343 M (AccessFlags)[27 21 21 23 21 21 25 9 23 23 0]xS +0.602 0 0.199 1 scol N 1486 360 M 1201 360 I 1201 473 I 1486 473 I C +K +N 1486 383 M 1201 383 I 1201 473 I 1486 473 I C +K +0 0 0 1 scol 1260 450 M (isPublic\(\))[9 21 27 23 23 9 9 21 14 0]xS +0.602 0 0.199 1 scol N 1344 602 M 1344 474 I K +N 1059 602 M 1634 602 I K +N 1344 474 M 1366 534 I 1322 534 I C +: 1 1 1 1 scol O ; K +N 678 500 M 678 593 I K +N 369 500 M 881 500 I K +N 678 593 M 700 533 I 656 533 I C +: 1 1 1 1 scol O ; K +N 369 477 M 369 500 I K +N 881 477 M 881 500 I K +: N 919 683 306 234 rp C +1 1 0.801 1 scol L ; N 1225 682 M 918 682 I 918 917 I 1225 917 I C +K +0 0 0 1 scol F0S29 Ji +988 732 M (FieldGen)[25 8 23 10 23 32 23 0]xS +0.602 0 0.199 1 scol N 1225 748 M 918 748 I 918 917 I 1225 917 I C +K +N 1225 771 M 918 771 I 918 917 I 1225 917 I C +K +0 0 0 1 scol 977 839 M (getField\(\))[23 23 11 25 8 23 10 23 14 0]xS +977 886 M (setInitValue\(\))[20 23 11 10 23 8 11 27 23 10 23 23 14 0]xS +0.602 0 0.199 1 scol N 1059 682 M 1059 602 I K +: N 543 1283 386 122 rp C +1 1 0.801 1 scol L ; N 929 1282 M 542 1282 I 542 1405 I 929 1405 I C +K +0 0 0 1 scol 571 1332 M (LocalVariableGen)[23 23 21 23 10 27 23 14 8 23 23 10 23 32 23 0]xS +0.602 0 0.199 1 scol N 929 1348 M 542 1348 I 542 1405 I 929 1405 I C +K +N 929 1371 M 542 1371 I 542 1405 I 929 1405 I C +K +: N 538 1106 396 124 rp C +1 1 0.801 1 scol L ; N 934 1105 M 537 1105 I 537 1230 I 934 1230 I C +K +0 0 0 1 scol 559 1155 M (CodeExceptionGen)[30 23 23 23 27 18 21 23 23 11 8 23 23 32 23 0]xS +0.602 0 0.199 1 scol N 934 1171 M 537 1171 I 537 1230 I 934 1230 I C +K +N 934 1194 M 537 1194 I 537 1230 I 934 1230 I C +K +: N 351 836 322 184 rp C +1 1 0.801 1 scol L ; N 673 835 M 350 835 I 350 1020 I 673 1020 I C +K +0 0 0 1 scol 466 885 M (Type)[26 19 23 0]xS +0.602 0 0.199 1 scol N 673 901 M 350 901 I 350 1020 I 673 1020 I C +K +N 673 924 M 350 924 I 350 1020 I 673 1020 I C +K +0 0 0 1 scol 409 992 M (getSignature\(\))[23 23 11 27 8 23 23 23 11 23 14 23 14 0]xS +0.602 0 0.199 1 scol N 512 745 M 512 835 I K +N 347 745 M 669 745 I K +N 512 835 M 534 775 I 490 775 I C +: 1 1 1 1 scol O ; K +N 795 862 M 674 889 I K +N 795 862 M 917 833 I K +N 347 719 M 347 745 I K +N 669 719 M 669 745 I K +: N 538 1457 364 126 rp C +1 1 0.801 1 scol L ; N 902 1456 M 537 1456 I 537 1583 I 902 1583 I C +K +0 0 0 1 scol 561 1506 M (BranchInstruction)[27 14 23 23 21 23 10 23 20 11 14 23 21 11 8 23 0]xS +0.602 0 0.199 1 scol N 902 1522 M 537 1522 I 537 1583 I 902 1583 I C +K +N 902 1545 M 537 1545 I 537 1583 I 902 1583 I C +K +: N 1157 1012 342 184 rp C +1 1 0.801 1 scol L ; N 1499 1011 M 1156 1011 I 1156 1196 I 1499 1196 I C +K +0 0 0 1 scol 1221 1061 M (MethodGen)[33 23 11 23 23 23 32 23 0]xS +0.602 0 0.199 1 scol N 1499 1077 M 1156 1077 I 1156 1196 I 1499 1196 I C +K +N 1499 1100 M 1156 1100 I 1156 1196 I 1499 1196 I C +K +0 0 0 1 scol 1215 1168 M (addException\(\))[23 23 23 27 18 21 23 23 11 8 23 23 14 0]xS +0.602 0 0.199 1 scol N 1022 1227 M 1155 1172 I K +N 1155 1172 M 1136 1196 I 1105 1193 I 1124 1168 I 1155 1172 I C +: 1 1 1 1 scol O ; K +N 1022 1227 M 886 1281 I K +N 913 1302 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 913 1340 M (*)S +N 913 1302 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 913 1340 M (*)S +0.602 0 0.199 1 scol N 1045 1134 M 1155 1121 I K +N 1155 1121 M 1130 1139 I 1101 1127 I 1126 1109 I 1155 1121 I C +: 1 1 1 1 scol O ; K +N 1045 1134 M 935 1145 I K +N 934 1068 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 934 1106 M (*)S +N 934 1068 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 934 1106 M (*)S +0.602 0 0.199 1 scol N 914 1014 M 674 962 I K +N 914 1014 M 1155 1066 I K +N 1344 1011 M 1344 602 I K +: N 1751 1012 306 184 rp C +1 1 0.801 1 scol L ; N 2057 1011 M 1750 1011 I 1750 1196 I 2057 1196 I C +K +0 0 0 1 scol 1779 1061 M (InstructionList)[10 23 20 11 14 23 21 11 8 23 23 23 8 20 0]xS +0.602 0 0.199 1 scol N 2057 1077 M 1750 1077 I 1750 1196 I 2057 1196 I C +K +N 2057 1100 M 1750 1100 I 1750 1196 I 2057 1196 I C +K +0 0 0 1 scol 1809 1168 M (append\(\))[23 23 23 23 23 23 14 0]xS +0.602 0 0.199 1 scol N 1624 1104 M 1749 1104 I K +N 1624 1104 M 1500 1104 I K +: N 1201 1313 222 190 rp C +1 1 0.801 1 scol L ; N 1423 1312 M 1200 1312 I 1200 1503 I 1423 1503 I C +K +0 0 0 1 scol 1219 1362 M (Instruction)[10 23 20 11 14 23 21 11 8 23 0]xS +0.602 0 0.199 1 scol N 1423 1378 M 1200 1378 I 1200 1503 I 1423 1503 I C +K +N 1423 1495 M 1200 1495 I 1200 1503 I 1423 1503 I C +K +0 0 0 1 scol 1259 1422 M (tag)[11 23 0]xS +1259 1469 M (length)[10 23 23 23 11 0]xS +0.602 0 0.199 1 scol N 903 1485 M 1199 1429 I K +N 1199 1429 M 1144 1462 I 1136 1418 I C +: 1 1 1 1 scol O ; K +: N 1722 1345 364 126 rp C +1 1 0.801 1 scol L ; N 2086 1344 M 1721 1344 I 1721 1471 I 2086 1471 I C +K +0 0 0 1 scol 1744 1394 M (InstructionHandle)[10 23 20 11 14 23 21 11 8 23 23 30 23 23 23 10 0]xS +0.602 0 0.199 1 scol N 2086 1410 M 1721 1410 I 1721 1471 I 2086 1471 I C +K +N 2086 1433 M 1721 1433 I 1721 1471 I 2086 1471 I C +K +N 1904 1270 M 1904 1197 I K +N 1947 1181 23 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1947 1219 M (1)S +0.602 0 0.199 1 scol N 1904 1197 M 1919 1224 I 1904 1251 I 1889 1224 I 1904 1197 I C +: 1 1 1 1 scol O ; K +N 1904 1270 M 1904 1343 I K +N 1950 1313 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1950 1351 M (*)S +N 1947 1181 23 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1947 1219 M (1)S +N 1950 1313 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1950 1351 M (*)S +0.602 0 0.199 1 scol N 1572 1408 M 1424 1408 I K +N 1429 1439 23 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1429 1477 M (1)S +0.602 0 0.199 1 scol N 1572 1408 M 1720 1408 I K +N 1693 1439 23 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1693 1477 M (1)S +N 1429 1439 23 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1429 1477 M (1)S +N 1693 1439 23 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1693 1477 M (1)S +: N 0 1224 384 240 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol : 0 1223 385 242 rc N 384 1223 M -1 1223 I -1 1464 I 384 1464 I C +K +; 0 0 0 1 scol 20 1323 M (InstructionTargeter)[10 23 20 11 14 23 21 11 8 23 23 26 23 14 23 23 11 23 0]xS +0.602 0 0.199 1 scol : 0 1339 385 126 rc N 384 1339 M -1 1339 I -1 1464 I 384 1464 I C +K +; : 0 1362 385 103 rc N 384 1362 M -1 1362 I -1 1464 I 384 1464 I C +K +; 0 0 0 1 scol 58 1430 M (updateTarget\(\))[23 23 23 23 11 23 26 23 14 23 23 11 14 0]xS +64 1273 M (<>)[24 24 10 23 11 23 14 12 23 21 23 24 0]xS +1 1 1 1 scol [ 72 24 ] 0 sd N 540 1231 M 385 1280 I K +0 0 0 1 scol [ 72 24 ] 0 sd N 540 1231 M 385 1280 I K +0.602 0 0.199 1 scol solid N 385 1280 M 449 1283 I 435 1241 I C +: 1 1 1 1 scol O ; K +1 1 1 1 scol [ 72 24 ] 0 sd N 541 1344 M 385 1344 I K +0 0 0 1 scol [ 72 24 ] 0 sd N 541 1344 M 385 1344 I K +0.602 0 0.199 1 scol solid N 385 1344 M 445 1366 I 445 1322 I C +: 1 1 1 1 scol O ; K +N 1043 1616 M 1903 1616 I K +N 1903 1616 M 1903 1472 I K +N 1949 1550 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1949 1588 M (*)S +0.602 0 0.199 1 scol N 1043 1616 M 191 1616 I K +N 191 1616 M 191 1465 I K +N 237 1542 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 237 1580 M (*)S +N 1949 1550 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1949 1588 M (*)S +N 237 1542 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 237 1580 M (*)S +N 1186 1556 221 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1186 1594 M (<>)[24 24 11 23 14 23 23 11 20 24 0]xS +: N 1707 306 362 284 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2069 305 M 1706 305 I 1706 590 I 2069 590 I C +K +0 0 0 1 scol 1725 355 M (ConstantPoolGen)[30 23 23 20 11 23 23 11 27 23 23 10 32 23 0]xS +0.602 0 0.199 1 scol N 2069 371 M 1706 371 I 1706 590 I 2069 590 I C +K +N 2069 394 M 1706 394 I 1706 590 I 2069 590 I C +K +0 0 0 1 scol 1765 462 M (addClass\(\))[23 23 23 30 10 23 20 20 14 0]xS +1765 509 M (addMethodRef\(\))[23 23 23 33 23 11 23 23 23 30 23 12 14 0]xS +1765 556 M (addInteger\(\))[23 23 23 10 23 11 23 23 23 14 14 0]xS +: N 1475 683 314 234 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1789 682 M 1474 682 I 1474 917 I 1789 917 I C +K +0 0 0 1 scol 1541 732 M (ClassGen)[30 10 23 20 20 32 23 0]xS +0.602 0 0.199 1 scol N 1789 748 M 1474 748 I 1474 917 I 1789 917 I C +K +N 1789 771 M 1474 771 I 1474 917 I 1789 917 I C +K +0 0 0 1 scol 1533 839 M (addInterface\(\))[23 23 23 10 23 11 23 14 12 23 21 23 14 0]xS +1533 886 M (addMethod\(\))[23 23 23 33 23 11 23 23 23 14 0]xS +0.602 0 0.199 1 scol N 1634 682 M 1634 602 I K +N 1751 636 M 1782 591 I K +N 1751 636 M 1717 681 I K +1 1 1 1 scol [ 72 24 ] 0 sd N 536 1458 M 385 1408 I K +0 0 0 1 scol [ 72 24 ] 0 sd N 536 1458 M 385 1408 I K +0.602 0 0.199 1 scol solid N 385 1408 M 449 1406 I 435 1448 I C +: 1 1 1 1 scol O ; K +LH +%%PageTrailer + +%%Trailer +%%DocumentNeededResources: +%%+ font Helvetica-Oblique +%%+ font Helvetica +%%DocumentSuppliedResources: +Pscript_WinNT_Incr dup /terminate get exec +%%EOF +grestore diff --git a/docs/eps/classgen.fig b/docs/eps/classgen.fig new file mode 100644 index 00000000..0bb425ff --- /dev/null +++ b/docs/eps/classgen.fig @@ -0,0 +1,302 @@ +#FIG 3.2 +Portrait +Center +Inches +A4 +100.00 +Single +-2 +1200 2 +0 32 #f9f9f9 +0 33 #303030 +6 165 2157 5761 10157 +2 1 0 0 32 32 998 0 20 4.000 0 0 0 0 0 4 + 4717 10153 4717 8621 5673 8621 5673 10153 +2 1 0 1 33 33 997 0 -1 4.000 0 0 0 0 0 5 + 4713 10157 4713 8617 5677 8617 5677 10157 4713 10157 +2 1 0 1 33 33 995 0 -1 4.000 0 0 0 0 0 5 + 5177 10157 5177 8617 5677 8617 5677 10157 5177 10157 +2 1 0 1 33 33 994 0 -1 4.000 0 0 0 0 0 5 + 5269 10157 5269 8617 5677 8617 5677 10157 5269 10157 +2 1 0 0 32 32 991 0 20 4.000 0 0 0 0 0 4 + 2325 9277 2325 8345 2817 8345 2817 9277 +2 1 0 1 33 33 990 0 -1 4.000 0 0 0 0 0 5 + 2321 9281 2321 8341 2821 8341 2821 9281 2321 9281 +2 1 0 1 33 33 988 0 -1 4.000 0 0 0 0 0 5 + 2585 9281 2585 8341 2821 8341 2821 9281 2585 9281 +2 1 0 1 33 33 987 0 -1 4.000 0 0 0 0 0 5 + 2677 9281 2677 8341 2821 8341 2821 9281 2677 9281 +2 1 0 0 32 32 986 0 20 4.000 0 0 0 0 0 4 + 925 9721 925 8285 1657 8285 1657 9721 +2 1 0 1 33 33 985 0 -1 4.000 0 0 0 0 0 5 + 921 9725 921 8281 1661 8281 1661 9725 921 9725 +2 1 0 1 33 33 983 0 -1 4.000 0 0 0 0 0 5 + 1185 9725 1185 8281 1661 8281 1661 9725 1185 9725 +2 1 0 1 33 33 982 0 -1 4.000 0 0 0 0 0 5 + 1277 9725 1277 8281 1661 8281 1661 9725 1277 9725 +2 1 0 0 32 32 980 0 20 4.000 0 0 0 0 0 4 + 925 8061 925 6617 1657 6617 1657 8061 +2 1 0 1 33 33 979 0 -1 4.000 0 0 0 0 0 5 + 921 8065 921 6613 1661 6613 1661 8065 921 8065 +2 1 0 1 33 33 977 0 -1 4.000 0 0 0 0 0 5 + 1185 8065 1185 6613 1661 6613 1661 8065 1185 8065 +2 1 0 1 33 33 976 0 -1 4.000 0 0 0 0 0 5 + 1277 8065 1277 6613 1661 6613 1661 8065 1277 8065 +2 1 0 0 32 32 974 0 20 4.000 0 0 0 0 0 4 + 169 6461 169 4889 1901 4889 1901 6461 +2 1 0 1 33 33 973 0 -1 4.000 0 0 0 0 0 5 + 165 6465 165 4885 1905 4885 1905 6465 165 6465 +2 1 0 1 33 33 971 0 -1 4.000 0 0 0 0 0 5 + 429 6465 429 4885 1905 4885 1905 6465 429 6465 +2 1 0 1 33 33 970 0 -1 4.000 0 0 0 0 0 5 + 521 6465 521 4885 1905 4885 1905 6465 521 6465 +2 1 0 0 32 32 963 0 20 4.000 0 0 0 0 0 4 + 2325 8089 2325 6845 2817 6845 2817 8089 +2 1 0 1 33 33 962 0 -1 4.000 0 0 0 0 0 5 + 2321 8093 2321 6841 2821 6841 2821 8093 2321 8093 +2 1 0 1 33 33 960 0 -1 4.000 0 0 0 0 0 5 + 2585 8093 2585 6841 2821 6841 2821 8093 2585 8093 +2 1 0 1 33 33 959 0 -1 4.000 0 0 0 0 0 5 + 2677 8093 2677 6841 2821 6841 2821 8093 2677 8093 +2 1 0 1 33 33 958 0 -1 4.000 0 0 0 0 0 2 + 1953 7605 2321 7605 +2 1 0 1 33 33 957 0 -1 4.000 0 0 0 0 0 2 + 1953 9229 1953 7329 +2 1 0 0 7 7 956 0 20 4.000 0 0 0 0 0 4 + 2321 7605 2081 7517 2081 7693 2321 7605 +2 1 0 1 33 33 955 0 -1 4.000 0 0 0 0 0 4 + 2321 7605 2081 7517 2081 7693 2321 7605 +2 1 0 1 33 33 954 0 -1 4.000 0 0 0 0 0 2 + 1665 9229 1953 9229 +2 1 0 0 32 32 953 0 20 4.000 0 0 0 0 0 4 + 5273 8045 5273 6505 5757 6505 5757 8045 +2 1 0 1 33 33 952 0 -1 4.000 0 0 0 0 0 5 + 5269 8049 5269 6501 5761 6501 5761 8049 5269 8049 +2 1 0 1 33 33 950 0 -1 4.000 0 0 0 0 0 5 + 5533 8049 5533 6501 5761 6501 5761 8049 5533 8049 +2 1 0 1 33 33 949 0 -1 4.000 0 0 0 0 0 5 + 5625 8049 5625 6501 5761 6501 5761 8049 5625 8049 +2 1 1 1 7 7 948 0 -1 4.000 0 0 0 0 0 2 + 5397 8053 5313 8613 +2 1 1 1 0 0 947 0 -1 4.000 0 0 0 0 0 2 + 5397 8053 5313 8613 +2 1 0 0 7 7 946 0 20 4.000 0 0 0 0 0 4 + 5313 8613 5261 8365 5437 8389 5313 8613 +2 1 0 1 33 33 945 0 -1 4.000 0 0 0 0 0 4 + 5313 8613 5261 8365 5437 8389 5313 8613 +2 1 0 0 32 32 944 0 20 4.000 0 0 0 0 0 4 + 4565 8065 4565 6485 5057 6485 5057 8065 +2 1 0 1 33 33 943 0 -1 4.000 0 0 0 0 0 5 + 4561 8069 4561 6481 5061 6481 5061 8069 4561 8069 +2 1 0 1 33 33 941 0 -1 4.000 0 0 0 0 0 5 + 4825 8069 4825 6481 5061 6481 5061 8069 4825 8069 +2 1 0 1 33 33 940 0 -1 4.000 0 0 0 0 0 5 + 4917 8069 4917 6481 5061 6481 5061 8069 4917 8069 +2 1 1 1 7 7 939 0 -1 4.000 0 0 0 0 0 2 + 4957 8073 5053 8613 +2 1 1 1 0 0 938 0 -1 4.000 0 0 0 0 0 2 + 4957 8073 5053 8613 +2 1 0 0 7 7 937 0 20 4.000 0 0 0 0 0 4 + 5053 8613 5097 8361 4921 8393 5053 8613 +2 1 0 1 33 33 936 0 -1 4.000 0 0 0 0 0 4 + 5053 8613 5097 8361 4921 8393 5053 8613 +2 1 0 0 32 32 935 0 20 4.000 0 0 0 0 0 4 + 4401 5873 4401 4325 5733 4325 5733 5873 +2 1 0 1 33 33 934 0 -1 4.000 0 0 0 0 0 5 + 4397 5877 4397 4321 5737 4321 5737 5877 4397 5877 +2 1 0 1 33 33 932 0 -1 4.000 0 0 0 0 0 5 + 4661 5877 4661 4321 5737 4321 5737 5877 4661 5877 +2 1 0 1 33 33 931 0 -1 4.000 0 0 0 0 0 5 + 5129 5877 5129 4321 5737 4321 5737 5877 5129 5877 +2 1 0 1 33 33 926 0 -1 4.000 0 0 0 0 0 2 + 5289 6189 5229 5881 +2 1 0 0 7 7 925 0 20 4.000 0 0 0 0 0 5 + 5229 5881 5309 5977 5269 6093 5189 6001 5229 5881 +2 1 0 1 33 33 924 0 -1 4.000 0 0 0 0 0 5 + 5229 5881 5309 5977 5269 6093 5189 6001 5229 5881 +2 1 0 1 33 33 923 0 -1 4.000 0 0 0 0 0 2 + 5289 6189 5353 6497 +2 1 0 0 7 7 922 0 20 4.000 0 0 0 0 0 4 + 5465 6453 5465 6389 5653 6389 5653 6453 +2 1 0 0 7 7 920 0 20 4.000 0 0 0 0 0 4 + 5465 6453 5465 6389 5653 6389 5653 6453 +2 1 0 1 33 33 918 0 -1 4.000 0 0 0 0 0 2 + 4941 6181 4977 5881 +2 1 0 0 7 7 917 0 20 4.000 0 0 0 0 0 5 + 4977 5881 4905 5981 4953 6097 5025 5997 4977 5881 +2 1 0 1 33 33 916 0 -1 4.000 0 0 0 0 0 5 + 4977 5881 4905 5981 4953 6097 5025 5997 4977 5881 +2 1 0 1 33 33 915 0 -1 4.000 0 0 0 0 0 2 + 4941 6181 4905 6477 +2 1 0 0 7 7 914 0 20 4.000 0 0 0 0 0 4 + 4605 6449 4605 6385 4793 6385 4793 6449 +2 1 0 0 7 7 912 0 20 4.000 0 0 0 0 0 4 + 4605 6449 4605 6385 4793 6385 4793 6449 +2 1 0 0 32 32 910 0 20 4.000 0 0 0 0 0 4 + 1465 3517 1465 2201 2397 2201 2397 3517 +2 1 0 1 33 33 909 0 -1 4.000 0 0 0 0 0 5 + 1461 3521 1461 2197 2401 2197 2401 3521 1461 3521 +2 1 0 1 33 33 907 0 -1 4.000 0 0 0 0 0 5 + 1725 3521 1725 2197 2401 2197 2401 3521 1725 3521 +2 1 0 1 33 33 906 0 -1 4.000 0 0 0 0 0 5 + 1817 3521 1817 2197 2401 2197 2401 3521 1817 3521 +2 1 0 1 33 33 903 0 -1 4.000 0 0 0 0 0 2 + 1501 4205 1717 3525 +2 1 0 0 7 7 902 0 20 4.000 0 0 0 0 0 5 + 1717 3525 1629 3609 1653 3729 1741 3645 1717 3525 +2 1 0 1 33 33 901 0 -1 4.000 0 0 0 0 0 5 + 1717 3525 1629 3609 1653 3729 1741 3645 1717 3525 +2 1 0 1 33 33 900 0 -1 4.000 0 0 0 0 0 2 + 1501 4205 1289 4881 +2 1 0 0 7 7 899 0 20 4.000 0 0 0 0 0 4 + 1429 4913 1429 4821 1617 4821 1617 4913 +2 1 0 0 7 7 897 0 20 4.000 0 0 0 0 0 4 + 1429 4913 1429 4821 1617 4821 1617 4913 +2 1 0 1 33 33 895 0 -1 4.000 0 0 0 0 0 2 + 3397 3913 2405 3201 +2 1 0 0 7 7 894 0 20 4.000 0 0 0 0 0 5 + 2405 3201 2529 3217 2581 3325 2457 3313 2405 3201 +2 1 0 1 33 33 893 0 -1 4.000 0 0 0 0 0 5 + 2405 3201 2529 3217 2581 3325 2457 3313 2405 3201 +2 1 0 1 33 33 892 0 -1 4.000 0 0 0 0 0 2 + 3397 3913 4393 4621 +2 1 0 0 7 7 891 0 20 4.000 0 0 0 0 0 4 + 4321 4405 4321 4341 4509 4341 4509 4405 +2 1 0 0 7 7 889 0 20 4.000 0 0 0 0 0 4 + 4321 4405 4321 4341 4509 4341 4509 4405 +2 1 0 0 32 32 887 0 20 4.000 0 0 0 0 0 4 + 3385 8813 3385 7529 4317 7529 4317 8813 +2 1 0 1 33 33 886 0 -1 4.000 0 0 0 0 0 5 + 3381 8817 3381 7525 4321 7525 4321 8817 3381 8817 +2 1 0 1 33 33 884 0 -1 4.000 0 0 0 0 0 5 + 3645 8817 3645 7525 4321 7525 4321 8817 3645 8817 +2 1 0 1 33 33 883 0 -1 4.000 0 0 0 0 0 5 + 3737 8817 3737 7525 4321 7525 4321 8817 3737 8817 +2 1 0 1 33 33 880 0 -1 4.000 0 0 0 0 0 2 + 2977 8181 3381 8181 +2 1 0 1 33 33 879 0 -1 4.000 0 0 0 0 0 2 + 2977 8805 2977 7517 +2 1 0 0 7 7 878 0 20 4.000 0 0 0 0 0 4 + 3381 8181 3141 8093 3141 8269 3381 8181 +2 1 0 1 33 33 877 0 -1 4.000 0 0 0 0 0 4 + 3381 8181 3141 8093 3141 8269 3381 8181 +2 1 0 1 33 33 876 0 -1 4.000 0 0 0 0 0 2 + 4429 6701 4105 7521 +2 1 0 1 33 33 875 0 -1 4.000 0 0 0 0 0 2 + 4429 6701 4753 5881 +2 1 0 0 32 32 874 0 20 4.000 0 0 0 0 0 4 + 2261 6321 2261 4773 3393 4773 3393 6321 +2 1 0 1 33 33 873 0 -1 4.000 0 0 0 0 0 5 + 2257 6325 2257 4769 3397 4769 3397 6325 2257 6325 +2 1 0 1 33 33 871 0 -1 4.000 0 0 0 0 0 5 + 2521 6325 2521 4769 3397 4769 3397 6325 2521 6325 +2 1 0 1 33 33 870 0 -1 4.000 0 0 0 0 0 5 + 2801 6325 2801 4769 3397 4769 3397 6325 2801 6325 +2 1 0 1 33 33 866 0 -1 4.000 0 0 0 0 0 2 + 2357 4145 2153 3525 +2 1 0 0 7 7 865 0 20 4.000 0 0 0 0 0 5 + 2153 3525 2245 3609 2221 3729 2129 3645 2153 3525 +2 1 0 1 33 33 864 0 -1 4.000 0 0 0 0 0 5 + 2153 3525 2245 3609 2221 3729 2129 3645 2153 3525 +2 1 0 1 33 33 863 0 -1 4.000 0 0 0 0 0 2 + 2357 4145 2565 4765 +2 1 0 0 7 7 862 0 20 4.000 0 0 0 0 0 4 + 2657 4665 2657 4601 2845 4601 2845 4665 +2 1 0 0 7 7 860 0 20 4.000 0 0 0 0 0 4 + 2657 4665 2657 4601 2845 4601 2845 4665 +2 1 0 1 33 33 858 0 -1 4.000 0 0 0 0 0 2 + 3365 6925 3593 7521 +2 1 0 1 33 33 857 0 -1 4.000 0 0 0 0 0 2 + 3365 6925 3129 6329 +2 1 0 1 33 33 856 0 -1 4.000 0 0 0 0 0 2 + 2825 8805 2977 8805 +2 1 0 1 33 33 855 0 -1 4.000 0 0 0 0 0 2 + 2825 7517 2977 7517 +2 1 0 1 33 33 854 0 -1 4.000 0 0 0 0 0 2 + 1665 7329 1953 7329 +2 1 0 0 32 32 853 0 20 4.000 0 0 0 0 0 4 + 3413 3533 3413 2313 3905 2313 3905 3533 +2 1 0 1 33 33 852 0 -1 4.000 0 0 0 0 0 5 + 3409 3537 3409 2309 3909 2309 3909 3537 3409 3537 +2 1 0 1 33 33 850 0 -1 4.000 0 0 0 0 0 5 + 3673 3537 3673 2309 3909 2309 3909 3537 3673 3537 +2 1 0 1 33 33 849 0 -1 4.000 0 0 0 0 0 5 + 3765 3537 3765 2309 3909 2309 3909 3537 3765 3537 +2 1 1 1 7 7 848 0 -1 4.000 0 0 0 0 0 2 + 4561 4317 3913 3313 +2 1 1 1 0 0 847 0 -1 4.000 0 0 0 0 0 2 + 4561 4317 3913 3313 +2 1 0 1 0 0 846 0 -1 4.000 0 0 0 0 0 2 + 3913 3313 4045 3401 +2 1 0 1 0 0 845 0 -1 4.000 0 0 0 0 0 2 + 3913 3313 3941 3465 +2 1 0 0 32 32 844 0 20 4.000 0 0 0 0 0 4 + 4665 3685 4665 2161 5597 2161 5597 3685 +2 1 0 1 33 33 843 0 -1 4.000 0 0 0 0 0 5 + 4661 3689 4661 2157 5601 2157 5601 3689 4661 3689 +2 1 0 1 33 33 841 0 -1 4.000 0 0 0 0 0 5 + 4925 3689 4925 2157 5601 2157 5601 3689 4925 3689 +2 1 0 1 33 33 840 0 -1 4.000 0 0 0 0 0 5 + 5393 3689 5393 2157 5601 2157 5601 3689 5393 3689 +2 1 0 1 33 33 837 0 -1 4.000 0 0 0 0 0 2 + 4285 2921 3913 2921 +2 1 0 0 7 7 836 0 20 4.000 0 0 0 0 0 5 + 3913 2921 4021 2861 4129 2921 4021 2981 3913 2921 +2 1 0 1 33 33 835 0 -1 4.000 0 0 0 0 0 5 + 3913 2921 4021 2861 4129 2921 4021 2981 3913 2921 +2 1 0 1 33 33 834 0 -1 4.000 0 0 0 0 0 2 + 4285 2921 4657 2921 +2 1 0 0 7 7 833 0 20 4.000 0 0 0 0 0 4 + 4525 2737 4525 2673 4713 2673 4713 2737 +2 1 0 0 7 7 831 0 20 4.000 0 0 0 0 0 4 + 4525 2737 4525 2673 4713 2673 4713 2737 +4 0 0 996 -1 16 10 1.5708 4 150 1305 5113 10073 InstructionTargeter\001 +4 0 0 993 -1 16 10 1.5708 4 150 1035 5541 9921 updateTarget()\001 +4 0 0 992 -1 16 10 1.5708 4 120 975 4913 9897 <>\001 +4 0 0 989 -1 16 10 1.5708 4 150 720 2521 9189 BasicType\001 +4 0 0 984 -1 16 10 1.5708 4 150 795 1121 9425 ObjectType\001 +4 0 0 981 -1 16 10 1.5708 4 150 1095 1549 9489 getClassName()\001 +4 0 0 978 -1 16 10 1.5708 4 135 705 1121 7713 ArrayType\001 +4 0 0 975 -1 16 10 1.5708 4 150 1110 1549 7829 getDimensions()\001 +4 0 0 972 -1 16 10 1.5708 4 120 1245 365 6325 ConstantPoolGen\001 +4 0 0 969 -1 16 10 1.5708 4 150 1260 793 6229 getConstantPool()\001 +4 0 0 968 -1 16 10 1.5708 4 150 735 981 6229 addClass()\001 +4 0 0 967 -1 16 10 1.5708 4 150 765 1169 6229 addString()\001 +4 0 0 966 -1 16 10 1.5708 4 150 930 1357 6229 addFieldRef()\001 +4 0 0 965 -1 16 10 1.5708 4 150 1125 1545 6229 addMethodRef()\001 +4 0 0 964 -1 16 10 1.5708 4 150 855 1733 6229 addInteger()\001 +4 0 0 961 -1 16 10 1.5708 4 150 1065 2521 8033 ReferenceType\001 +4 0 0 951 -1 16 10 1.5708 4 120 1245 5469 7933 LocalVariableGen\001 +4 0 0 942 -1 16 10 1.5708 4 150 1365 4761 7981 CodeExceptionGen\001 +4 0 0 933 -1 16 10 1.5708 4 120 825 4597 5525 MethodGen\001 +4 0 0 930 -1 16 10 1.5708 4 150 1200 4837 5641 access_flags : int\001 +4 0 0 929 -1 16 10 1.5708 4 150 1065 5025 5641 max_locals : int\001 +4 0 0 928 -1 16 10 1.5708 4 150 840 5401 5641 getMethod()\001 +4 0 0 927 -1 16 10 1.5708 4 150 1050 5589 5641 addException()\001 +4 0 0 921 -1 16 10 1.5708 4 60 60 5617 6453 *\001 +4 0 0 919 -1 16 10 1.5708 4 60 60 5617 6453 *\001 +4 0 0 913 -1 16 10 1.5708 4 60 60 4757 6449 *\001 +4 0 0 911 -1 16 10 1.5708 4 60 60 4757 6449 *\001 +4 0 0 908 -1 16 10 1.5708 4 120 675 1661 3221 ClassGen\001 +4 0 0 905 -1 16 10 1.5708 4 150 1020 2089 3285 getJavaClass()\001 +4 0 0 904 -1 16 10 1.5708 4 150 975 2277 3285 addInterface()\001 +4 0 0 898 -1 16 10 1.5708 4 105 90 1581 4913 1\001 +4 0 0 896 -1 16 10 1.5708 4 105 90 1581 4913 1\001 +4 0 0 890 -1 16 10 1.5708 4 60 60 4473 4405 *\001 +4 0 0 888 -1 16 10 1.5708 4 60 60 4473 4405 *\001 +4 0 0 885 -1 16 10 1.5708 4 135 345 3581 8353 Type\001 +4 0 0 882 -1 16 10 1.5708 4 135 660 4009 8581 getType()\001 +4 0 0 881 -1 16 10 1.5708 4 150 990 4197 8581 getSignature()\001 +4 0 0 872 -1 16 10 1.5708 4 120 630 2457 5881 FieldGen\001 +4 0 0 869 -1 16 10 1.5708 4 150 1200 2697 6089 access_flags : int\001 +4 0 0 868 -1 16 10 1.5708 4 150 645 3073 6089 getField()\001 +4 0 0 867 -1 16 10 1.5708 4 150 915 3261 6089 setInitValue()\001 +4 0 0 861 -1 16 10 1.5708 4 60 60 2809 4665 *\001 +4 0 0 859 -1 16 10 1.5708 4 60 60 2809 4665 *\001 +4 0 0 851 -1 16 10 1.5708 4 120 960 3609 3421 InstructionList\001 +4 0 0 842 -1 16 10 1.5708 4 120 720 4861 3297 Instruction\001 +4 0 0 839 -1 16 10 1.5708 4 150 660 5101 3453 tag : byte\001 +4 0 0 838 -1 16 10 1.5708 4 150 1215 5289 3453 length, offset : int\001 +4 0 0 832 -1 16 10 1.5708 4 60 60 4677 2737 *\001 +4 0 0 830 -1 16 10 1.5708 4 60 60 4677 2737 *\001 +-6 diff --git a/docs/eps/classloader.eps b/docs/eps/classloader.eps new file mode 100644 index 00000000..4c3a3f3f --- /dev/null +++ b/docs/eps/classloader.eps @@ -0,0 +1,160 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: classloader.eps +%%Creator: fig2dev Version 3.2 Patchlevel 0-beta3 +%%CreationDate: Thu Mar 18 16:45:56 1999 +%%For: dahm@gromit (Markus Dahm) +%%Orientation: Portrait +%%BoundingBox: 0 0 683 144 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +-55.0 171.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n -1000 3712 m -1000 -1000 l 12712 -1000 l 12712 3712 l cp clip + 0.06299 0.06299 sc +% Polyline +7.500 slw +n 1005 450 m 900 450 900 1020 105 arcto 4 {pop} repeat + 900 1125 3045 1125 105 arcto 4 {pop} repeat + 3150 1125 3150 555 105 arcto 4 {pop} repeat + 3150 450 1005 450 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Helvetica ff 210.00 scf sf +1350 900 m +gs 1 -1 sc (Java class file) col0 sh gr +% Polyline +n 3600 450 m 5850 450 l 5850 1125 l 3600 1125 l cp gs col0 s gr +/Helvetica ff 210.00 scf sf +4140 855 m +gs 1 -1 sc (Class loader) col0 sh gr +% Polyline +n 6750 450 m 9000 450 l 9000 1125 l 6750 1125 l cp gs col0 s gr +/Helvetica ff 210.00 scf sf +7020 855 m +gs 1 -1 sc (Byte code verifier) col0 sh gr +% Polyline +n 9450 450 m 11700 450 l 11700 1125 l 9450 1125 l cp gs col0 s gr +/Helvetica ff 210.00 scf sf +9900 900 m +gs 1 -1 sc (Interpreter/JIT) col0 sh gr +% Polyline +n 4950 1575 m 7875 1575 l 7875 2700 l 4950 2700 l cp gs col0 s gr +/Helvetica ff 210.00 scf sf +5175 2475 m +gs 1 -1 sc (Byte code transformations) col0 sh gr +/Courier-Bold ff 210.00 scf sf +5850 2025 m +gs 1 -1 sc (JavaClass) col0 sh gr +% Polyline +gs clippath +3453 735 m 3573 765 l 3453 795 l 3615 795 l 3615 735 l cp +clip +n 3150 765 m 3600 765 l gs col0 s gr gr + +% arrowhead +n 3453 735 m 3573 765 l 3453 795 l 3453 765 l 3453 735 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +9303 735 m 9423 765 l 9303 795 l 9465 795 l 9465 735 l cp +clip +n 9000 765 m 9450 765 l gs col0 s gr gr + +% arrowhead +n 9303 735 m 9423 765 l 9303 795 l 9303 765 l 9303 735 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6105 1428 m 6075 1548 l 6045 1428 l 6045 1590 l 6105 1590 l cp +clip +n 5850 765 m 6075 765 l 6075 1575 l gs col0 s gr gr + +% arrowhead +n 6105 1428 m 6075 1548 l 6045 1428 l 6075 1428 l 6105 1428 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6603 735 m 6723 765 l 6603 795 l 6765 795 l 6765 735 l cp +clip +n 6525 1575 m 6525 765 l 6750 765 l gs col0 s gr gr + +% arrowhead +n 6603 735 m 6723 765 l 6603 795 l 6603 765 l 6603 735 l cp gs 0.00 setgray ef gr col0 s +$F2psEnd +rs diff --git a/docs/eps/classloader.fig b/docs/eps/classloader.fig new file mode 100644 index 00000000..729d7749 --- /dev/null +++ b/docs/eps/classloader.fig @@ -0,0 +1,47 @@ +#FIG 3.2 +Portrait +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 900 450 3150 1125 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 3150 1125 3150 450 900 450 900 1125 3150 1125 +4 0 0 100 0 16 14 0.0000 4 165 1380 1350 900 Java class file\001 +-6 +6 3600 450 5850 1125 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 3600 450 5850 450 5850 1125 3600 1125 3600 450 +4 0 0 100 0 16 14 0.0000 4 165 1215 4140 855 Class loader\001 +-6 +6 6750 450 9000 1125 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 6750 450 9000 450 9000 1125 6750 1125 6750 450 +4 0 0 100 0 16 14 0.0000 4 210 1665 7020 855 Byte code verifier\001 +-6 +6 9450 450 11700 1125 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 9450 450 11700 450 11700 1125 9450 1125 9450 450 +4 0 0 100 0 16 14 0.0000 4 210 1410 9900 900 Interpreter/JIT\001 +-6 +6 4950 1575 7875 2700 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 4950 1575 7875 1575 7875 2700 4950 2700 4950 1575 +4 0 0 100 0 16 14 0.0000 4 210 2505 5175 2475 Byte code transformations\001 +4 0 0 100 0 14 14 0.0000 4 150 1215 5850 2025 JavaClass\001 +-6 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3150 765 3600 765 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 9000 765 9450 765 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 3 + 1 1 1.00 60.00 120.00 + 5850 765 6075 765 6075 1575 +2 1 0 1 0 7 0 0 -1 0.000 0 0 -1 1 0 3 + 1 1 1.00 60.00 120.00 + 6525 1575 6525 765 6750 765 diff --git a/docs/eps/constantpool.eps b/docs/eps/constantpool.eps new file mode 100644 index 00000000..4d3d5bd7 --- /dev/null +++ b/docs/eps/constantpool.eps @@ -0,0 +1,399 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: Rose Diagram(s) +%%Creator: AdobePS5.dll Version 5.0 +%%CreationDate: 7/7/1999 17:45:21 +%%Pages: 1 +%%Orientation: Portrait +%%PageOrder: Ascend +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%DocumentData: Clean7Bit +%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 +%%LanguageLevel: 2 +%%BoundingBox: 13 12 383 830 +%%EndComments +%%BeginProcSet: epsffit 1 0 +gsave +1677.488 -356.303 translate +90 rotate +2.035 2.035 scale +%%EndProcSet + + +%%BeginDefaults +%%PageBoundingBox: 13 12 582 830 +%%EndDefaults + +%%BeginProlog +%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 +/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false +setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype +ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch +def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 +rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def +/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def +typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 +def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp +exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def +/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype +{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} +readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop +(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def +/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) +tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup +xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint +tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck +{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) +tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup +rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} +forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier +/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin +$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 +ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto +(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt +$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} +repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print +(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup +0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop +/setpacking where{pop oldpack setpacking}if}if +%%EndResource +userdict /Pscript_WinNT_Incr 230 dict dup begin put +%%BeginResource: file Pscript_FatalError 5.0 0 +/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div +cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def +%%EndResource +/VM?{vmstatus exch sub exch pop gt{[ +(This job requires more memory than is available in this printer.)100 500 +(Try one or more of the following, and then print again:)100 485 +(For the output format, choose Optimize For Portability.)115 470 +(In the Device Settings page, make sure the Available PostScript Memory is accurate.) +115 455(Reduce the number of fonts in the document.)115 440 +(Print the document in parts.)115 425 12/Times-Roman showpage +(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def +%%BeginResource: file Pscript_Win_Basic 5.0 0 +/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ +/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- +/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , +d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C +/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M +/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d +/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage +, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false +/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d +/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, +d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx +matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit +/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} +b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U +/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d +reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d +/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 +sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} +b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b +/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b +/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} +b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b +%%EndResource +%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 +/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge +{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ +snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F +setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d +/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b +%%EndResource +end +%%EndProlog + +%%BeginSetup +[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec +1 setlinecap 1 setlinejoin +/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def +%%EndSetup + +%%Page: 1 1 +%%PageBoundingBox: 13 12 582 830 +%%EndPageComments +%%BeginPageSetup +/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh +%%EndPageSetup + +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Win_GdiObject 5.0 0 +/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore +{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d +/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps +L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType +1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d +/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal +{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep +gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b +/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M +MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep +M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 ++}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d +/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix +GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 +/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal +makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 +/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d +/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] +d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 +0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne +{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd +aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx +PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save +8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 +Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx +matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` +xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill +{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot +concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap +YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 +-0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix +currentmatrix readonly d ; ;}if}b +%%EndResource +%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 +/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} +{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 +d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d +20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d +/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ +/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict +~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} +? ;}b +%%EndResource +end reinitialize +: N 1409 506 185 84 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 1594 505 M 1408 505 I 1408 590 I 1594 590 I C +K +0 0 0 1 scol Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Text 5.0 0 +/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d +/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ +length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets +{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& +/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} +if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ +{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get +StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ +{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ +length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ +put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M +currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d +/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N +/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix +astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get +length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d +/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS +{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 +copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for +& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ +4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 +add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for +/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 +Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName +length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length +string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ +putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 +$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? +{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName +get undefinefont}forall undefinefont}b +%%EndResource +end reinitialize +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Encoding256 5.0 0 +/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction +/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign +/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma +/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon +/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S +/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave +/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright +/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis +/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef +/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet +/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef +/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section +/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered +/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph +/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter +/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis +/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute +/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls +/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute +/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve +/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex +/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put +%%EndResource +end reinitialize + +%%IncludeResource: font Helvetica +F /F0 0 /256 T /Helvetica mF +/F0S18 F0 [24.66 0 0 -24.66 0 0 ] mFS +F0S18 Ji +1433 537 M (ConstantCP)[18 14 14 13 7 14 14 7 18 0]xS +0.602 0 0.199 1 scol N 1594 551 M 1408 551 I 1408 590 I 1594 590 I C +K +N 1594 565 M 1408 565 I 1408 590 I 1594 590 I C +K +: N 1292 714 375 85 rp C +1 1 0.801 1 scol L ; N 1667 713 M 1291 713 I 1291 799 I 1667 799 I C +K +0 0 0 1 scol 1324 745 M (ConstantInterfaceMethodref)[18 14 14 13 7 14 14 7 6 14 7 14 8 7 14 13 14 21 14 7 14 14 14 8 14 0]xS +0.602 0 0.199 1 scol N 1667 759 M 1291 759 I 1291 799 I 1667 799 I C +K +N 1667 773 M 1291 773 I 1291 799 I 1667 799 I C +K +: N 1710 714 262 85 rp C +1 1 0.801 1 scol L ; N 1972 713 M 1709 713 I 1709 799 I 1972 799 I C +K +0 0 0 1 scol 1734 745 M (ConstantMethodref)[18 14 14 13 7 14 14 7 21 14 7 14 14 14 8 14 0]xS +0.602 0 0.199 1 scol N 1972 759 M 1709 759 I 1709 799 I 1972 799 I C +K +N 1972 773 M 1709 773 I 1709 799 I 1972 799 I C +K +: N 1011 714 235 85 rp C +1 1 0.801 1 scol L ; N 1246 713 M 1010 713 I 1010 799 I 1246 799 I C +K +0 0 0 1 scol 1036 745 M (ConstantFieldref)[18 14 14 13 7 14 14 7 15 6 14 6 14 8 14 0]xS +0.602 0 0.199 1 scol N 1246 759 M 1010 759 I 1010 799 I 1246 799 I C +K +N 1246 773 M 1010 773 I 1010 799 I 1246 799 I C +K +: N 1516 58 213 125 rp C +1 1 0.801 1 scol L ; N 1729 57 M 1515 57 I 1515 183 I 1729 183 I C +K +0 0 0 1 scol 1546 89 M (ConstantPool)[18 14 14 13 7 14 14 7 17 14 14 0]xS +0.602 0 0.199 1 scol N 1729 103 M 1515 103 I 1515 183 I 1729 183 I C +K +N 1729 116 M 1515 116 I 1515 183 I 1729 183 I C +K +0 0 0 1 scol 1555 158 M (getConstant\(\))[14 14 7 18 14 14 13 7 14 14 7 8 0]xS +: N 1550 265 144 84 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1694 264 M 1549 264 I 1549 349 I 1694 349 I C +K +0 0 0 1 scol 1571 296 M (Constant)[18 14 14 13 7 14 14 0]xS +0.602 0 0.199 1 scol N 1694 310 M 1549 310 I 1549 349 I 1694 349 I C +K +N 1694 323 M 1549 323 I 1549 349 I 1694 349 I C +K +N 1622 223 M 1622 184 I K +N 1652 175 14 29 rp C +1 1 1 1 scol L 0 0 0 1 scol 1652 198 M (1)S +0.602 0 0.199 1 scol N 1622 184 M 1632 203 I 1622 221 I 1612 203 I 1622 184 I C +: 1 1 1 1 scol O ; K +N 1622 223 M 1622 263 I K +N 1654 245 11 28 rp C +1 1 1 1 scol L 0 0 0 1 scol 1654 268 M (*)S +N 1652 175 14 29 rp C +1 1 1 1 scol L 0 0 0 1 scol 1652 198 M (1)S +N 1654 245 11 28 rp C +1 1 1 1 scol L 0 0 0 1 scol 1654 268 M (*)S +0.602 0 0.199 1 scol N 1494 655 M 1494 591 I K +N 1123 655 M 1828 655 I K +N 1494 591 M 1509 632 I 1479 632 I C +: 1 1 1 1 scol O ; K +N 1123 713 M 1123 655 I K +: N 1743 506 219 84 rp C +1 1 0.801 1 scol L ; N 1962 505 M 1742 505 I 1742 590 I 1962 590 I C +K +0 0 0 1 scol 1769 537 M (ConstantString)[18 14 14 13 7 14 14 7 17 7 8 6 14 0]xS +0.602 0 0.199 1 scol N 1962 551 M 1742 551 I 1742 590 I 1962 590 I C +K +N 1962 565 M 1742 565 I 1742 590 I 1962 590 I C +K +: N 822 506 219 84 rp C +1 1 0.801 1 scol L ; N 1041 505 M 821 505 I 821 590 I 1041 590 I C +K +0 0 0 1 scol 849 537 M (ConstantClass)[18 14 14 13 7 14 14 7 18 6 14 13 0]xS +0.602 0 0.199 1 scol N 1041 551 M 821 551 I 821 590 I 1041 590 I C +K +N 1041 565 M 821 565 I 821 590 I 1041 590 I C +K +: N 1236 254 224 84 rp C +1 1 0.801 1 scol L ; N 1460 253 M 1235 253 I 1235 338 I 1460 338 I C +K +0 0 0 1 scol 1259 285 M (ConstantInteger)[18 14 14 13 7 14 14 7 6 14 7 14 14 14 0]xS +0.602 0 0.199 1 scol N 1460 299 M 1235 299 I 1235 338 I 1460 338 I C +K +N 1460 312 M 1235 312 I 1235 338 I 1460 338 I C +K +: N 958 254 232 84 rp C +1 1 0.801 1 scol L ; N 1190 253 M 957 253 I 957 338 I 1190 338 I C +K +0 0 0 1 scol 984 285 M (ConstantDouble)[18 14 14 13 7 14 14 7 18 14 14 14 6 0]xS +0.602 0 0.199 1 scol N 1190 299 M 957 299 I 957 338 I 1190 338 I C +K +N 1190 312 M 957 312 I 957 338 I 1190 338 I C +K +: N 1102 506 207 84 rp C +1 1 0.801 1 scol L ; N 1309 505 M 1101 505 I 1101 590 I 1309 590 I C +K +0 0 0 1 scol 1127 537 M (ConstantFloat)[18 14 14 13 7 14 14 7 15 6 14 14 0]xS +0.602 0 0.199 1 scol N 1309 551 M 1101 551 I 1101 590 I 1309 590 I C +K +N 1309 565 M 1101 565 I 1101 590 I 1309 590 I C +K +: N 708 254 206 84 rp C +1 1 0.801 1 scol L ; N 914 253 M 707 253 I 707 338 I 914 338 I C +K +0 0 0 1 scol 732 285 M (ConstantLong)[18 14 14 13 7 14 14 7 14 14 14 0]xS +0.602 0 0.199 1 scol N 914 299 M 707 299 I 707 338 I 914 338 I C +K +N 914 312 M 707 312 I 707 338 I 914 338 I C +K +: N 2025 506 246 84 rp C +1 1 0.801 1 scol L ; N 2271 505 M 2024 505 I 2024 590 I 2271 590 I C +K +0 0 0 1 scol 2051 537 M (ConstantUnicode)[18 14 14 13 7 14 14 7 18 14 6 13 14 14 0]xS +0.602 0 0.199 1 scol N 2271 545 M 2024 545 I 2024 590 I 2271 590 I C +K +N 2271 558 M 2024 558 I 2024 590 I 2271 590 I C +K +: N 1790 254 322 84 rp C +1 1 0.801 1 scol L ; N 2112 253 M 1789 253 I 1789 338 I 2112 338 I C +K +0 0 0 1 scol 1817 285 M (ConstantNameAndType)[18 14 14 13 7 14 14 7 18 14 22 14 17 14 14 14 12 14 0]xS +0.602 0 0.199 1 scol N 2112 299 M 1789 299 I 1789 338 I 2112 338 I C +K +N 2112 312 M 1789 312 I 1789 338 I 2112 338 I C +K +: N 2172 254 194 84 rp C +1 1 0.801 1 scol L ; N 2366 253 M 2171 253 I 2171 338 I 2366 338 I C +K +0 0 0 1 scol 2195 285 M (ConstantUtf8)[18 14 14 13 7 14 14 7 18 7 7 0]xS +0.602 0 0.199 1 scol N 2366 293 M 2171 293 I 2171 338 I 2366 338 I C +K +N 2366 306 M 2171 306 I 2171 338 I 2366 338 I C +K +N 1626 428 M 1626 350 I K +N 809 428 M 2269 428 I K +N 1626 350 M 1641 391 I 1611 391 I C +: 1 1 1 1 scol O ; K +N 933 505 M 933 428 I K +N 1848 505 M 1848 428 I K +N 1068 339 M 1068 428 I K +N 2146 505 M 2146 428 I K +N 809 339 M 809 428 I K +N 2269 339 M 2269 428 I K +N 1500 505 M 1500 428 I K +N 1336 339 M 1336 428 I K +N 1201 505 M 1201 428 I K +N 1926 339 M 1926 428 I K +N 1468 713 M 1468 655 I K +N 1828 713 M 1828 655 I K +LH +%%PageTrailer + +%%Trailer +%%DocumentNeededResources: +%%+ font Helvetica +%%DocumentSuppliedResources: +Pscript_WinNT_Incr dup /terminate get exec +%%EOF +grestore diff --git a/docs/eps/constantpool.fig b/docs/eps/constantpool.fig new file mode 100644 index 00000000..1c7b738c --- /dev/null +++ b/docs/eps/constantpool.fig @@ -0,0 +1,211 @@ +#FIG 3.2 +Portrait +Center +Inches +A4 +100.00 +Single +-2 +1200 2 +0 32 #f9f9f9 +0 33 #303030 +6 75 0 4500 9825 +2 1 0 0 32 32 998 0 20 4.000 0 0 0 0 0 4 + 2747 5661 2747 4585 3239 4585 3239 5661 +2 1 0 1 33 33 997 0 -1 4.000 0 0 0 0 0 5 + 2743 5665 2743 4581 3243 4581 3243 5665 2743 5665 +2 1 0 1 33 33 995 0 -1 4.000 0 0 0 0 0 5 + 3015 5665 3015 4581 3243 4581 3243 5665 3015 5665 +2 1 0 1 33 33 994 0 -1 4.000 0 0 0 0 0 5 + 3107 5665 3107 4581 3243 4581 3243 5665 3107 5665 +2 1 0 0 32 32 993 0 20 4.000 0 0 0 0 0 4 + 3963 6345 3963 4157 4455 4157 4455 6345 +2 1 0 1 33 33 992 0 -1 4.000 0 0 0 0 0 5 + 3959 6349 3959 4153 4459 4153 4459 6349 3959 6349 +2 1 0 1 33 33 990 0 -1 4.000 0 0 0 0 0 5 + 4231 6349 4231 4153 4459 4153 4459 6349 4231 6349 +2 1 0 1 33 33 989 0 -1 4.000 0 0 0 0 0 5 + 4323 6349 4323 4153 4459 4153 4459 6349 4323 6349 +2 1 0 0 32 32 988 0 20 4.000 0 0 0 0 0 4 + 3963 3905 3963 2373 4455 2373 4455 3905 +2 1 0 1 33 33 987 0 -1 4.000 0 0 0 0 0 5 + 3959 3909 3959 2369 4459 2369 4459 3909 3959 3909 +2 1 0 1 33 33 985 0 -1 4.000 0 0 0 0 0 5 + 4231 3909 4231 2369 4459 2369 4459 3909 4231 3909 +2 1 0 1 33 33 984 0 -1 4.000 0 0 0 0 0 5 + 4323 3909 4323 2369 4459 2369 4459 3909 4323 3909 +2 1 0 0 32 32 983 0 20 4.000 0 0 0 0 0 4 + 3963 7985 3963 6613 4455 6613 4455 7985 +2 1 0 1 33 33 982 0 -1 4.000 0 0 0 0 0 5 + 3959 7989 3959 6609 4459 6609 4459 7989 3959 7989 +2 1 0 1 33 33 980 0 -1 4.000 0 0 0 0 0 5 + 4231 7989 4231 6609 4459 6609 4459 7989 4231 7989 +2 1 0 1 33 33 979 0 -1 4.000 0 0 0 0 0 5 + 4323 7989 4323 6609 4459 6609 4459 7989 4323 7989 +2 1 0 0 32 32 978 0 20 4.000 0 0 0 0 0 4 + 131 5041 131 3797 863 3797 863 5041 +2 1 0 1 33 33 977 0 -1 4.000 0 0 0 0 0 5 + 127 5045 127 3793 867 3793 867 5045 127 5045 +2 1 0 1 33 33 975 0 -1 4.000 0 0 0 0 0 5 + 399 5045 399 3793 867 3793 867 5045 399 5045 +2 1 0 1 33 33 974 0 -1 4.000 0 0 0 0 0 5 + 491 5045 491 3793 867 3793 867 5045 491 5045 +2 1 0 0 32 32 972 0 20 4.000 0 0 0 0 0 4 + 1339 4841 1339 3997 1831 3997 1831 4841 +2 1 0 1 33 33 971 0 -1 4.000 0 0 0 0 0 5 + 1335 4845 1335 3993 1835 3993 1835 4845 1335 4845 +2 1 0 1 33 33 969 0 -1 4.000 0 0 0 0 0 5 + 1607 4845 1607 3993 1835 3993 1835 4845 1607 4845 +2 1 0 1 33 33 968 0 -1 4.000 0 0 0 0 0 5 + 1699 4845 1699 3993 1835 3993 1835 4845 1699 4845 +2 1 0 1 33 33 967 0 -1 4.000 0 0 0 0 0 2 + 1099 4417 871 4417 +2 1 0 0 7 7 966 0 20 4.000 0 0 0 0 0 4 + 807 4245 807 4153 995 4153 995 4245 +2 1 0 0 7 7 964 0 20 4.000 0 0 0 0 0 5 + 871 4417 979 4357 1087 4417 979 4477 871 4417 +2 1 0 1 33 33 963 0 -1 4.000 0 0 0 0 0 5 + 871 4417 979 4357 1087 4417 979 4477 871 4417 +2 1 0 1 33 33 962 0 -1 4.000 0 0 0 0 0 2 + 1099 4417 1331 4417 +2 1 0 0 7 7 961 0 20 4.000 0 0 0 0 0 4 + 1215 4233 1215 4169 1403 4169 1403 4233 +2 1 0 0 7 7 959 0 20 4.000 0 0 0 0 0 4 + 807 4245 807 4153 995 4153 995 4245 +2 1 0 0 7 7 957 0 20 4.000 0 0 0 0 0 4 + 1215 4233 1215 4169 1403 4169 1403 4233 +2 1 0 1 33 33 955 0 -1 4.000 0 0 0 0 0 2 + 3619 5165 3247 5165 +2 1 0 1 33 33 954 0 -1 4.000 0 0 0 0 0 2 + 3619 7329 3619 3217 +2 1 0 0 7 7 953 0 20 4.000 0 0 0 0 0 4 + 3247 5165 3487 5077 3487 5253 3247 5165 +2 1 0 1 33 33 952 0 -1 4.000 0 0 0 0 0 4 + 3247 5165 3487 5077 3487 5253 3247 5165 +2 1 0 1 33 33 951 0 -1 4.000 0 0 0 0 0 2 + 3959 7329 3619 7329 +2 1 0 0 32 32 950 0 20 4.000 0 0 0 0 0 4 + 2747 3713 2747 2437 3239 2437 3239 3713 +2 1 0 1 33 33 949 0 -1 4.000 0 0 0 0 0 5 + 2743 3717 2743 2433 3243 2433 3243 3717 2743 3717 +2 1 0 1 33 33 947 0 -1 4.000 0 0 0 0 0 5 + 3015 3717 3015 2433 3243 2433 3243 3717 3015 3717 +2 1 0 1 33 33 946 0 -1 4.000 0 0 0 0 0 5 + 3107 3717 3107 2433 3243 2433 3243 3717 3107 3717 +2 1 0 0 32 32 945 0 20 4.000 0 0 0 0 0 4 + 2747 9089 2747 7813 3239 7813 3239 9089 +2 1 0 1 33 33 944 0 -1 4.000 0 0 0 0 0 5 + 2743 9093 2743 7809 3243 7809 3243 9093 2743 9093 +2 1 0 1 33 33 942 0 -1 4.000 0 0 0 0 0 5 + 3015 9093 3015 7809 3243 7809 3243 9093 3015 9093 +2 1 0 1 33 33 941 0 -1 4.000 0 0 0 0 0 5 + 3107 9093 3107 7809 3243 7809 3243 9093 3107 9093 +2 1 0 0 32 32 940 0 20 4.000 0 0 0 0 0 4 + 1275 6673 1275 5365 1767 5365 1767 6673 +2 1 0 1 33 33 939 0 -1 4.000 0 0 0 0 0 5 + 1271 6677 1271 5361 1771 5361 1771 6677 1271 6677 +2 1 0 1 33 33 937 0 -1 4.000 0 0 0 0 0 5 + 1543 6677 1543 5361 1771 5361 1771 6677 1543 6677 +2 1 0 1 33 33 936 0 -1 4.000 0 0 0 0 0 5 + 1635 6677 1635 5361 1771 5361 1771 6677 1635 6677 +2 1 0 0 32 32 935 0 20 4.000 0 0 0 0 0 4 + 1275 8297 1275 6941 1767 6941 1767 8297 +2 1 0 1 33 33 934 0 -1 4.000 0 0 0 0 0 5 + 1271 8301 1271 6937 1771 6937 1771 8301 1271 8301 +2 1 0 1 33 33 932 0 -1 4.000 0 0 0 0 0 5 + 1543 8301 1543 6937 1771 6937 1771 8301 1543 8301 +2 1 0 1 33 33 931 0 -1 4.000 0 0 0 0 0 5 + 1635 8301 1635 6937 1771 6937 1771 8301 1635 8301 +2 1 0 0 32 32 930 0 20 4.000 0 0 0 0 0 4 + 2747 7453 2747 6249 3239 6249 3239 7453 +2 1 0 1 33 33 929 0 -1 4.000 0 0 0 0 0 5 + 2743 7457 2743 6245 3243 6245 3243 7457 2743 7457 +2 1 0 1 33 33 927 0 -1 4.000 0 0 0 0 0 5 + 3015 7457 3015 6245 3243 6245 3243 7457 3015 7457 +2 1 0 1 33 33 926 0 -1 4.000 0 0 0 0 0 5 + 3107 7457 3107 6245 3243 6245 3243 7457 3107 7457 +2 1 0 0 32 32 925 0 20 4.000 0 0 0 0 0 4 + 1275 9757 1275 8553 1767 8553 1767 9757 +2 1 0 1 33 33 924 0 -1 4.000 0 0 0 0 0 5 + 1271 9761 1271 8549 1771 8549 1771 9761 1271 9761 +2 1 0 1 33 33 922 0 -1 4.000 0 0 0 0 0 5 + 1543 9761 1543 8549 1771 8549 1771 9761 1543 9761 +2 1 0 1 33 33 921 0 -1 4.000 0 0 0 0 0 5 + 1635 9761 1635 8549 1771 8549 1771 9761 1635 9761 +2 1 0 0 32 32 920 0 20 4.000 0 0 0 0 0 4 + 2747 2065 2747 630 3239 630 3239 2065 +2 1 0 1 33 33 919 0 -1 4.000 0 0 0 0 0 5 + 2743 2069 2743 626 3243 626 3243 2069 2743 2069 +2 1 0 1 33 33 917 0 -1 4.000 0 0 0 0 0 5 + 3015 2069 3015 626 3243 626 3243 2069 3015 2069 +2 1 0 1 33 33 916 0 -1 4.000 0 0 0 0 0 5 + 3107 2069 3107 626 3243 626 3243 2069 3107 2069 +2 1 0 0 32 32 915 0 20 4.000 0 0 0 0 0 4 + 1275 3441 1275 1557 1767 1557 1767 3441 +2 1 0 1 33 33 914 0 -1 4.000 0 0 0 0 0 5 + 1271 3445 1271 1553 1771 1553 1771 3445 1271 3445 +2 1 0 1 33 33 912 0 -1 4.000 0 0 0 0 0 5 + 1543 3445 1543 1553 1771 1553 1771 3445 1543 3445 +2 1 0 1 33 33 911 0 -1 4.000 0 0 0 0 0 5 + 1635 3445 1635 1553 1771 1553 1771 3445 1635 3445 +2 1 0 0 32 32 910 0 20 4.000 0 0 0 0 0 4 + 1275 1209 1275 78 1767 78 1767 1209 +2 1 0 1 33 33 909 0 -1 4.000 0 0 0 0 0 5 + 1271 1213 1271 74 1771 74 1771 1213 1271 1213 +2 1 0 1 33 33 907 0 -1 4.000 0 0 0 0 0 5 + 1543 1213 1543 74 1771 74 1771 1213 1543 1213 +2 1 0 1 33 33 906 0 -1 4.000 0 0 0 0 0 5 + 1635 1213 1635 74 1771 74 1771 1213 1635 1213 +2 1 0 1 33 33 905 0 -1 4.000 0 0 0 0 0 2 + 2295 4393 1839 4393 +2 1 0 1 33 33 904 0 -1 4.000 0 0 0 0 0 2 + 2295 9165 2295 642 +2 1 0 0 7 7 903 0 20 4.000 0 0 0 0 0 4 + 1839 4393 2079 4305 2079 4481 1839 4393 +2 1 0 1 33 33 902 0 -1 4.000 0 0 0 0 0 4 + 1839 4393 2079 4305 2079 4481 1839 4393 +2 1 0 1 33 33 901 0 -1 4.000 0 0 0 0 0 2 + 2743 8441 2295 8441 +2 1 0 1 33 33 900 0 -1 4.000 0 0 0 0 0 2 + 2743 3097 2295 3097 +2 1 0 1 33 33 899 0 -1 4.000 0 0 0 0 0 2 + 1775 7653 2295 7653 +2 1 0 1 33 33 898 0 -1 4.000 0 0 0 0 0 2 + 2743 1357 2295 1357 +2 1 0 1 33 33 897 0 -1 4.000 0 0 0 0 0 2 + 1775 9165 2295 9165 +2 1 0 1 33 33 896 0 -1 4.000 0 0 0 0 0 2 + 1775 642 2295 642 +2 1 0 1 33 33 895 0 -1 4.000 0 0 0 0 0 2 + 2743 5129 2295 5129 +2 1 0 1 33 33 894 0 -1 4.000 0 0 0 0 0 2 + 1775 6089 2295 6089 +2 1 0 1 33 33 893 0 -1 4.000 0 0 0 0 0 2 + 2743 6877 2295 6877 +2 1 0 1 33 33 892 0 -1 4.000 0 0 0 0 0 2 + 1775 2641 2295 2641 +2 1 0 1 33 33 891 0 -1 4.000 0 0 0 0 0 2 + 3959 5317 3619 5317 +2 1 0 1 33 33 890 0 -1 4.000 0 0 0 0 0 2 + 3959 3217 3619 3217 +4 0 0 996 -1 16 10 1.5708 4 105 840 2951 5565 ConstantCP\001 +4 0 0 991 -1 16 10 1.5708 4 120 1950 4167 6269 ConstantInterfaceMethodref\001 +4 0 0 986 -1 16 10 1.5708 4 120 1335 4167 3837 ConstantMethodref\001 +4 0 0 981 -1 16 10 1.5708 4 120 1140 4167 7901 ConstantFieldref\001 +4 0 0 976 -1 16 10 1.5708 4 120 945 335 4913 ConstantPool\001 +4 0 0 973 -1 16 10 1.5708 4 135 945 763 4809 getConstant()\001 +4 0 0 970 -1 16 10 1.5708 4 105 630 1543 4745 Constant\001 +4 0 0 965 -1 16 10 1.5708 4 105 90 959 4245 1\001 +4 0 0 960 -1 16 10 1.5708 4 60 60 1367 4233 *\001 +4 0 0 958 -1 16 10 1.5708 4 105 90 959 4245 1\001 +4 0 0 956 -1 16 10 1.5708 4 60 60 1367 4233 *\001 +4 0 0 948 -1 16 10 1.5708 4 150 1035 2951 3613 ConstantString\001 +4 0 0 943 -1 16 10 1.5708 4 120 1005 2951 8985 ConstantClass\001 +4 0 0 938 -1 16 10 1.5708 4 135 1125 1479 6601 ConstantInteger\001 +4 0 0 933 -1 16 10 1.5708 4 120 1125 1479 8209 ConstantDouble\001 +4 0 0 928 -1 16 10 1.5708 4 120 975 2951 7361 ConstantFloat\001 +4 0 0 923 -1 16 10 1.5708 4 135 990 1479 9665 ConstantLong\001 +4 0 0 918 -1 16 10 1.5708 4 120 1200 2951 1977 ConstantUnicode\001 +4 0 0 913 -1 16 10 1.5708 4 150 1665 1479 3377 ConstantNameAndType\001 +4 0 0 908 -1 16 10 1.5708 4 120 915 1479 1121 ConstantUtf8\001 +-6 diff --git a/docs/eps/diagram.fig b/docs/eps/diagram.fig new file mode 100644 index 00000000..cc81536b --- /dev/null +++ b/docs/eps/diagram.fig @@ -0,0 +1,351 @@ +#FIG 3.2 +Portrait +Center +Inches +A4 +100.00 +Single +-2 +1200 2 +0 32 #f9f9f9 +0 33 #303030 +0 34 #7e7e7e +6 600 300 5925 10575 +2 1 0 0 32 32 998 0 20 4.000 0 0 0 0 0 4 + 4527 8915 4527 7615 5019 7615 5019 8915 +2 1 0 1 33 33 997 0 -1 4.000 0 0 0 0 0 5 + 4523 8919 4523 7611 5023 7611 5023 8919 4523 8919 +2 1 0 1 33 33 995 0 -1 4.000 0 0 0 0 0 5 + 4763 8919 4763 7611 5023 7611 5023 8919 4763 8919 +2 1 0 1 33 33 994 0 -1 4.000 0 0 0 0 0 5 + 4855 8919 4855 7611 5023 7611 5023 8919 4855 8919 +2 1 0 0 32 32 993 0 20 4.000 0 0 0 0 0 4 + 4591 4831 4591 3379 5083 3379 5083 4831 +2 1 0 1 33 33 992 0 -1 4.000 0 0 0 0 0 5 + 4587 4835 4587 3375 5087 3375 5087 4835 4587 4835 +2 1 0 1 33 33 990 0 -1 4.000 0 0 0 0 0 5 + 4827 4835 4827 3375 5087 3375 5087 4835 4827 4835 +2 1 0 1 33 33 989 0 -1 4.000 0 0 0 0 0 5 + 4919 4835 4919 3375 5087 3375 5087 4835 4919 4835 +2 1 0 0 32 32 988 0 20 4.000 0 0 0 0 0 4 + 4555 7183 4555 5507 5887 5507 5887 7183 +2 1 0 1 33 33 987 0 -1 4.000 0 0 0 0 0 5 + 4551 7187 4551 5503 5891 5503 5891 7187 4551 7187 +2 1 0 1 33 33 985 0 -1 4.000 0 0 0 0 0 5 + 4791 7187 4791 5503 5891 5503 5891 7187 4791 7187 +2 1 0 1 33 33 984 0 -1 4.000 0 0 0 0 0 5 + 5447 7187 5447 5503 5891 5503 5891 7187 5447 7187 +2 1 0 1 33 33 979 0 -1 4.000 0 0 0 0 0 2 + 5019 5171 5075 5499 +2 1 0 0 7 7 978 0 20 4.000 0 0 0 0 0 5 + 5075 5499 5115 5379 5039 5287 4995 5403 5075 5499 +2 1 0 1 33 33 977 0 -1 4.000 0 0 0 0 0 5 + 5075 5499 5115 5379 5039 5287 4995 5403 5075 5499 +2 1 0 1 33 33 976 0 -1 4.000 0 0 0 0 0 2 + 5019 5171 4963 4839 +2 1 0 0 7 7 975 0 20 4.000 0 0 0 0 0 4 + 4667 4947 4667 4855 4855 4855 4855 4947 +2 1 0 0 7 7 973 0 20 4.000 0 0 0 0 0 4 + 4667 4947 4667 4855 4855 4855 4855 4947 +2 1 0 0 32 32 971 0 20 4.000 0 0 0 0 0 4 + 5423 3467 5423 1927 5915 1927 5915 3467 +2 1 0 1 33 33 970 0 -1 4.000 0 0 0 0 0 5 + 5419 3471 5419 1923 5919 1923 5919 3471 5419 3471 +2 1 0 1 33 33 968 0 -1 4.000 0 0 0 0 0 5 + 5659 3471 5659 1923 5919 1923 5919 3471 5659 3471 +2 1 0 1 33 33 967 0 -1 4.000 0 0 0 0 0 5 + 5751 3471 5751 1923 5919 1923 5919 3471 5751 3471 +2 1 0 1 33 33 966 0 -1 4.000 0 0 0 0 0 2 + 5447 4487 5323 5499 +2 1 0 0 7 7 965 0 20 4.000 0 0 0 0 0 5 + 5323 5499 5275 5383 5351 5283 5395 5399 5323 5499 +2 1 0 1 33 33 964 0 -1 4.000 0 0 0 0 0 5 + 5323 5499 5275 5383 5351 5283 5395 5399 5323 5499 +2 1 0 1 33 33 963 0 -1 4.000 0 0 0 0 0 2 + 5447 4487 5571 3475 +2 1 0 0 7 7 962 0 20 4.000 0 0 0 0 0 4 + 5683 3647 5683 3555 5871 3555 5871 3647 +2 1 0 0 7 7 960 0 20 4.000 0 0 0 0 0 4 + 5683 3647 5683 3555 5871 3555 5871 3647 +2 1 0 0 32 32 958 0 20 4.000 0 0 0 0 0 4 + 3055 4359 3055 3211 3547 3211 3547 4359 +2 1 0 1 33 33 957 0 -1 4.000 0 0 0 0 0 5 + 3051 4363 3051 3207 3551 3207 3551 4363 3051 4363 +2 1 0 1 33 33 955 0 -1 4.000 0 0 0 0 0 5 + 3291 4363 3291 3207 3551 3207 3551 4363 3291 4363 +2 1 0 1 33 33 954 0 -1 4.000 0 0 0 0 0 5 + 3383 4363 3383 3207 3551 3207 3551 4363 3383 4363 +2 1 0 0 32 32 953 0 20 4.000 0 0 0 0 0 4 + 3055 2867 3055 1887 3547 1887 3547 2867 +2 1 0 1 33 33 952 0 -1 4.000 0 0 0 0 0 5 + 3051 2871 3051 1883 3551 1883 3551 2871 3051 2871 +2 1 0 1 33 33 950 0 -1 4.000 0 0 0 0 0 5 + 3291 2871 3291 1883 3551 1883 3551 2871 3291 2871 +2 1 0 1 33 33 949 0 -1 4.000 0 0 0 0 0 5 + 3383 2871 3383 1883 3551 1883 3551 2871 3383 2871 +2 1 0 0 32 32 948 0 20 4.000 0 0 0 0 0 4 + 4527 10303 4527 9299 5019 9299 5019 10303 +2 1 0 1 33 33 947 0 -1 4.000 0 0 0 0 0 5 + 4523 10307 4523 9295 5023 9295 5023 10307 4523 10307 +2 1 0 1 33 33 945 0 -1 4.000 0 0 0 0 0 5 + 4763 10307 4763 9295 5023 9295 5023 10307 4763 10307 +2 1 0 1 33 33 944 0 -1 4.000 0 0 0 0 0 5 + 4855 10307 4855 9295 5023 9295 5023 10307 4855 10307 +2 1 0 0 32 32 943 0 20 4.000 0 0 0 0 0 4 + 4591 1843 4591 991 5083 991 5083 1843 +2 1 0 1 33 33 942 0 -1 4.000 0 0 0 0 0 5 + 4587 1847 4587 987 5087 987 5087 1847 4587 1847 +2 1 0 1 33 33 940 0 -1 4.000 0 0 0 0 0 5 + 4827 1847 4827 987 5087 987 5087 1847 4827 1847 +2 1 0 1 33 33 939 0 -1 4.000 0 0 0 0 0 5 + 4919 1847 4919 987 5087 987 5087 1847 4919 1847 +2 1 0 0 32 32 938 0 20 4.000 0 0 0 0 0 4 + 3055 1547 3055 647 3547 647 3547 1547 +2 1 0 1 33 33 937 0 -1 4.000 0 0 0 0 0 5 + 3051 1551 3051 643 3551 643 3551 1551 3051 1551 +2 1 0 1 33 33 935 0 -1 4.000 0 0 0 0 0 5 + 3291 1551 3291 643 3551 643 3551 1551 3291 1551 +2 1 0 1 33 33 934 0 -1 4.000 0 0 0 0 0 5 + 3383 1551 3383 643 3551 643 3551 1551 3383 1551 +2 1 0 0 32 32 933 0 20 4.000 0 0 0 0 0 4 + 3055 9923 3055 8655 3547 8655 3547 9923 +2 1 0 1 33 33 932 0 -1 4.000 0 0 0 0 0 5 + 3051 9927 3051 8651 3551 8651 3551 9927 3051 9927 +2 1 0 1 33 33 930 0 -1 4.000 0 0 0 0 0 5 + 3291 9927 3291 8651 3551 8651 3551 9927 3291 9927 +2 1 0 1 33 33 929 0 -1 4.000 0 0 0 0 0 5 + 3383 9927 3383 8651 3551 8651 3551 9927 3383 9927 +2 1 0 0 32 32 928 0 20 4.000 0 0 0 0 0 4 + 859 9827 859 8751 1519 8751 1519 9827 +2 1 0 1 33 33 927 0 -1 4.000 0 0 0 0 0 5 + 855 9831 855 8747 1523 8747 1523 9831 855 9831 +2 1 0 2 34 34 926 0 -1 4.000 0 0 0 0 0 3 + 1499 9803 1499 8771 883 8771 +2 1 0 1 33 33 924 0 -1 4.000 0 0 0 0 0 5 + 1095 9831 1095 8747 1523 8747 1523 9831 1095 9831 +2 1 0 1 33 33 923 0 -1 4.000 0 0 0 0 0 5 + 1187 9831 1187 8747 1523 8747 1523 9831 1187 9831 +2 1 0 0 32 32 921 0 20 4.000 0 0 0 0 0 4 + 2991 6375 2991 5547 3483 5547 3483 6375 +2 1 0 1 33 33 920 0 -1 4.000 0 0 0 0 0 5 + 2987 6379 2987 5543 3487 5543 3487 6379 2987 6379 +2 1 0 1 33 33 918 0 -1 4.000 0 0 0 0 0 5 + 3227 6379 3227 5543 3487 5543 3487 6379 3227 6379 +2 1 0 1 33 33 917 0 -1 4.000 0 0 0 0 0 5 + 3319 6379 3319 5543 3487 5543 3487 6379 3319 6379 +2 1 0 1 33 33 916 0 -1 4.000 0 0 0 0 0 2 + 3855 5959 3491 5959 +2 1 0 1 33 33 915 0 -1 4.000 0 0 0 0 0 2 + 3855 9887 3855 1111 +2 1 0 0 7 7 914 0 20 4.000 0 0 0 0 0 4 + 3491 5959 3731 5871 3731 6047 3491 5959 +2 1 0 1 33 33 913 0 -1 4.000 0 0 0 0 0 4 + 3491 5959 3731 5871 3731 6047 3491 5959 +2 1 0 1 33 33 912 0 -1 4.000 0 0 0 0 0 2 + 4551 6387 3855 6387 +2 1 0 0 7 7 911 0 20 4.000 0 0 0 0 0 4 + 4107 6959 4107 5399 4295 5399 4295 6959 +2 1 0 1 33 33 909 0 -1 4.000 0 0 0 0 0 2 + 4587 4207 3855 4207 +2 1 0 0 7 7 908 0 20 4.000 0 0 0 0 0 4 + 4391 4899 4391 3487 4579 3487 4579 4899 +2 1 0 1 33 33 906 0 -1 4.000 0 0 0 0 0 2 + 3555 2415 3855 2415 +2 1 0 0 7 7 905 0 20 4.000 0 0 0 0 0 4 + 3611 3075 3611 1647 3799 1647 3799 3075 +2 1 0 1 33 33 903 0 -1 4.000 0 0 0 0 0 2 + 4523 8235 3855 8235 +2 1 0 0 7 7 902 0 20 4.000 0 0 0 0 0 4 + 4099 8879 4099 7319 4287 7319 4287 8879 +2 1 0 1 33 33 900 0 -1 4.000 0 0 0 0 0 2 + 4587 1403 3855 1403 +2 1 0 1 33 33 899 0 -1 4.000 0 0 0 0 0 2 + 4523 9887 3855 9887 +2 1 0 0 7 7 898 0 20 4.000 0 0 0 0 0 4 + 4099 10531 4099 8971 4287 8971 4287 10531 +2 1 0 0 32 32 896 0 20 4.000 0 0 0 0 0 4 + 1747 4367 1747 2819 2679 2819 2679 4367 +2 1 0 1 33 33 895 0 -1 4.000 0 0 0 0 0 5 + 1743 4371 1743 2815 2683 2815 2683 4371 1743 4371 +2 1 0 1 33 33 893 0 -1 4.000 0 0 0 0 0 5 + 1983 4371 1983 2815 2683 2815 2683 4371 1983 4371 +2 1 0 1 33 33 892 0 -1 4.000 0 0 0 0 0 5 + 2451 4371 2451 2815 2683 2815 2683 4371 2451 4371 +2 1 0 1 33 33 889 0 -1 4.000 0 0 0 0 0 2 + 2803 4959 2551 4375 +2 1 0 0 7 7 888 0 20 4.000 0 0 0 0 0 4 + 2683 4395 2683 4303 2871 4303 2871 4395 +2 1 0 0 7 7 886 0 20 4.000 0 0 0 0 0 5 + 2551 4375 2651 4451 2635 4575 2539 4499 2551 4375 +2 1 0 1 33 33 885 0 -1 4.000 0 0 0 0 0 5 + 2551 4375 2651 4451 2635 4575 2539 4499 2551 4375 +2 1 0 1 33 33 884 0 -1 4.000 0 0 0 0 0 2 + 2803 4959 3055 5539 +2 1 0 0 7 7 883 0 20 4.000 0 0 0 0 0 4 + 3135 5419 3135 5355 3323 5355 3323 5419 +2 1 0 0 32 32 881 0 20 4.000 0 0 0 0 0 4 + 1683 9167 1683 7619 2615 7619 2615 9167 +2 1 0 1 33 33 880 0 -1 4.000 0 0 0 0 0 5 + 1679 9171 1679 7615 2619 7615 2619 9171 1679 9171 +2 1 0 1 33 33 878 0 -1 4.000 0 0 0 0 0 5 + 1919 9171 1919 7615 2619 7615 2619 9171 1919 9171 +2 1 0 1 33 33 877 0 -1 4.000 0 0 0 0 0 5 + 2387 9171 2387 7615 2619 7615 2619 9171 2387 9171 +2 1 0 1 33 33 874 0 -1 4.000 0 0 0 0 0 2 + 2771 6999 2499 7611 +2 1 0 0 7 7 873 0 20 4.000 0 0 0 0 0 4 + 2631 7675 2631 7583 2819 7583 2819 7675 +2 1 0 0 7 7 871 0 20 4.000 0 0 0 0 0 5 + 2499 7611 2487 7487 2587 7415 2599 7535 2499 7611 +2 1 0 1 33 33 870 0 -1 4.000 0 0 0 0 0 5 + 2499 7611 2487 7487 2587 7415 2599 7535 2499 7611 +2 1 0 1 33 33 869 0 -1 4.000 0 0 0 0 0 2 + 2771 6999 3047 6383 +2 1 0 0 7 7 868 0 20 4.000 0 0 0 0 0 4 + 2735 6391 2735 6327 2923 6327 2923 6391 +2 1 0 0 7 7 866 0 20 4.000 0 0 0 0 0 4 + 2735 6391 2735 6327 2923 6327 2923 6391 +2 1 0 0 32 32 864 0 20 4.000 0 0 0 0 0 4 + 623 6879 623 5043 1755 5043 1755 6879 +2 1 0 1 33 33 863 0 -1 4.000 0 0 0 0 0 5 + 619 6883 619 5039 1759 5039 1759 6883 619 6883 +2 1 0 1 33 33 861 0 -1 4.000 0 0 0 0 0 5 + 859 6883 859 5039 1759 5039 1759 6883 859 6883 +2 1 0 1 33 33 860 0 -1 4.000 0 0 0 0 0 5 + 1139 6883 1139 5039 1759 5039 1759 6883 1139 6883 +2 1 0 1 33 33 856 0 -1 4.000 0 0 0 0 0 2 + 1731 4707 1591 5035 +2 1 0 0 7 7 855 0 20 4.000 0 0 0 0 0 4 + 1715 5127 1715 5035 1903 5035 1903 5127 +2 1 0 0 7 7 853 0 20 4.000 0 0 0 0 0 5 + 1591 5035 1579 4911 1675 4835 1691 4959 1591 5035 +2 1 0 1 33 33 852 0 -1 4.000 0 0 0 0 0 5 + 1591 5035 1579 4911 1675 4835 1691 4959 1591 5035 +2 1 0 1 33 33 851 0 -1 4.000 0 0 0 0 0 2 + 1731 4707 1875 4375 +2 1 0 0 7 7 850 0 20 4.000 0 0 0 0 0 4 + 1571 4363 1571 4299 1759 4299 1759 4363 +2 1 0 0 7 7 848 0 20 4.000 0 0 0 0 0 4 + 1571 4363 1571 4299 1759 4299 1759 4363 +2 1 0 1 33 33 846 0 -1 4.000 0 0 0 0 0 2 + 1695 7251 1551 6887 +2 1 0 0 7 7 845 0 20 4.000 0 0 0 0 0 4 + 1675 6891 1675 6799 1863 6799 1863 6891 +2 1 0 0 7 7 843 0 20 4.000 0 0 0 0 0 5 + 1551 6887 1647 6963 1631 7087 1535 7011 1551 6887 +2 1 0 1 33 33 842 0 -1 4.000 0 0 0 0 0 5 + 1551 6887 1647 6963 1631 7087 1535 7011 1551 6887 +2 1 0 1 33 33 841 0 -1 4.000 0 0 0 0 0 2 + 1695 7251 1839 7611 +2 1 0 0 7 7 840 0 20 4.000 0 0 0 0 0 4 + 1931 7523 1931 7459 2119 7459 2119 7523 +2 1 0 0 7 7 838 0 20 4.000 0 0 0 0 0 4 + 1675 6891 1675 6799 1863 6799 1863 6891 +2 1 0 0 7 7 836 0 20 4.000 0 0 0 0 0 4 + 1931 7523 1931 7459 2119 7459 2119 7523 +2 1 1 1 7 7 834 0 -1 4.000 0 0 0 0 0 2 + 1191 8743 1191 6887 +2 1 1 1 0 0 833 0 -1 4.000 0 0 0 0 0 2 + 1191 8743 1191 6887 +2 1 0 1 0 0 832 0 -1 4.000 0 0 0 0 0 2 + 1191 6887 1251 7031 +2 1 0 1 0 0 831 0 -1 4.000 0 0 0 0 0 2 + 1191 6887 1131 7031 +2 1 0 0 7 7 830 0 20 4.000 0 0 0 0 0 4 + 923 8275 923 7351 1111 7351 1111 8275 +2 1 0 0 32 32 828 0 20 4.000 0 0 0 0 0 4 + 823 2295 823 1051 1555 1051 1555 2295 +2 1 0 1 33 33 827 0 -1 4.000 0 0 0 0 0 5 + 819 2299 819 1047 1559 1047 1559 2299 819 2299 +2 1 0 1 33 33 825 0 -1 4.000 0 0 0 0 0 5 + 1059 2299 1059 1047 1559 1047 1559 2299 1059 2299 +2 1 0 1 33 33 824 0 -1 4.000 0 0 0 0 0 5 + 1151 2299 1151 1047 1559 1047 1559 2299 1151 2299 +2 1 0 1 33 33 822 0 -1 4.000 0 0 0 0 0 2 + 1191 3671 1191 5035 +2 1 0 1 33 33 821 0 -1 4.000 0 0 0 0 0 2 + 1191 3671 1191 2303 +2 1 0 1 33 33 820 0 -1 4.000 0 0 0 0 0 2 + 5419 2791 3855 2791 +2 1 0 0 7 7 819 0 20 4.000 0 0 0 0 0 4 + 5143 3479 5143 2067 5331 2067 5331 3479 +2 1 0 1 33 33 817 0 -1 4.000 0 0 0 0 0 2 + 3555 3831 3855 3831 +2 1 0 0 7 7 816 0 20 4.000 0 0 0 0 0 4 + 3611 4567 3611 3139 3799 3139 3799 4567 +2 1 0 1 33 33 814 0 -1 4.000 0 0 0 0 0 2 + 3555 1111 3855 1111 +2 1 0 0 7 7 813 0 20 4.000 0 0 0 0 0 4 + 3611 1783 3611 355 3799 355 3799 1783 +2 1 0 1 33 33 811 0 -1 4.000 0 0 0 0 0 2 + 3555 9303 3855 9303 +2 1 0 0 7 7 810 0 20 4.000 0 0 0 0 0 4 + 3607 9879 3607 8507 3795 8507 3795 9879 +2 1 0 0 7 7 808 0 20 4.000 0 0 0 0 0 4 + 2683 4395 2683 4303 2871 4303 2871 4395 +2 1 0 0 7 7 806 0 20 4.000 0 0 0 0 0 4 + 2631 7675 2631 7583 2819 7583 2819 7675 +2 1 0 0 7 7 804 0 20 4.000 0 0 0 0 0 4 + 3135 5419 3135 5355 3323 5355 3323 5419 +2 1 0 0 7 7 802 0 20 4.000 0 0 0 0 0 4 + 1715 5127 1715 5035 1903 5035 1903 5127 +4 0 0 996 -1 16 10 1.5708 4 150 1080 4719 8827 ExceptionTable\001 +4 0 0 991 -1 16 10 1.5708 4 120 1230 4783 4767 LineNumberTable\001 +4 0 0 986 -1 16 10 1.5708 4 120 375 4747 6543 Code\001 +4 0 0 983 -1 16 10 1.5708 4 150 1035 4967 6951 max_stack : int\001 +4 0 0 982 -1 16 10 1.5708 4 150 1065 5155 6951 max_locals : int\001 +4 0 0 981 -1 16 10 1.5708 4 150 1365 5343 6951 exception_handlers\001 +4 0 0 980 -1 16 10 1.5708 4 150 690 5719 6951 getCode()\001 +4 0 0 974 -1 16 10 1.5708 4 105 90 4819 4947 1\001 +4 0 0 972 -1 16 10 1.5708 4 105 90 4819 4947 1\001 +4 0 0 969 -1 16 10 1.5708 4 120 1335 5615 3407 LocalVariableTable\001 +4 0 0 961 -1 16 10 1.5708 4 105 90 5835 3647 1\001 +4 0 0 959 -1 16 10 1.5708 4 105 90 5835 3647 1\001 +4 0 0 956 -1 16 10 1.5708 4 120 900 3247 4263 InnerClasses\001 +4 0 0 951 -1 16 10 1.5708 4 120 735 3247 2771 SourceFile\001 +4 0 0 946 -1 16 10 1.5708 4 150 810 4719 10227 Deprecated\001 +4 0 0 941 -1 16 10 1.5708 4 120 645 4783 1759 Unknown\001 +4 0 0 936 -1 16 10 1.5708 4 150 645 3247 1427 Synthetic\001 +4 0 0 931 -1 16 10 1.5708 4 120 1035 3247 9827 ConstantValue\001 +4 0 0 925 -1 16 10 1.5708 4 120 825 1051 9735 ClassParser\001 +4 0 0 922 -1 16 10 1.5708 4 135 480 1459 9595 parse()\001 +4 0 0 919 -1 16 10 1.5708 4 120 585 3183 6263 Attribute\001 +4 0 0 910 -1 16 10 1.5708 4 120 1500 4259 6959 <>\001 +4 0 0 907 -1 16 10 1.5708 4 120 1350 4543 4899 <>\001 +4 0 0 904 -1 16 10 1.5708 4 120 1350 3763 3075 <>\001 +4 0 0 901 -1 16 10 1.5708 4 120 1500 4251 8879 <>\001 +4 0 0 897 -1 16 10 1.5708 4 120 1500 4251 10531 <>\001 +4 0 0 894 -1 16 10 1.5708 4 120 525 1939 3863 Method\001 +4 0 0 891 -1 16 10 1.5708 4 150 1200 2159 4135 access_flags : int\001 +4 0 0 890 -1 16 10 1.5708 4 150 1185 2347 4135 signature : String\001 +4 0 0 887 -1 16 10 1.5708 4 105 90 2835 4395 1\001 +4 0 0 882 -1 16 10 1.5708 4 60 60 3287 5419 *\001 +4 0 0 879 -1 16 10 1.5708 4 120 330 1875 8571 Field\001 +4 0 0 876 -1 16 10 1.5708 4 150 1200 2095 8935 access_flags : int\001 +4 0 0 875 -1 16 10 1.5708 4 150 1185 2283 8935 signature : String\001 +4 0 0 872 -1 16 10 1.5708 4 105 90 2783 7675 1\001 +4 0 0 867 -1 16 10 1.5708 4 60 60 2887 6391 *\001 +4 0 0 865 -1 16 10 1.5708 4 60 60 2887 6391 *\001 +4 0 0 862 -1 16 10 1.5708 4 120 705 815 6339 JavaClass\001 +4 0 0 859 -1 16 10 1.5708 4 150 1200 1035 6647 access_flags : int\001 +4 0 0 858 -1 16 10 1.5708 4 150 1410 1411 6647 getInterfaceNames()\001 +4 0 0 857 -1 16 10 1.5708 4 150 1485 1599 6647 getSuperclassName()\001 +4 0 0 854 -1 16 10 1.5708 4 105 90 1867 5127 1\001 +4 0 0 849 -1 16 10 1.5708 4 60 60 1723 4363 *\001 +4 0 0 847 -1 16 10 1.5708 4 60 60 1723 4363 *\001 +4 0 0 844 -1 16 10 1.5708 4 105 90 1827 6891 1\001 +4 0 0 839 -1 16 10 1.5708 4 60 60 2083 7523 *\001 +4 0 0 837 -1 16 10 1.5708 4 105 90 1827 6891 1\001 +4 0 0 835 -1 16 10 1.5708 4 60 60 2083 7523 *\001 +4 0 0 829 -1 16 10 1.5708 4 90 870 1075 8275 <>\001 +4 0 0 826 -1 16 10 1.5708 4 120 945 1015 2167 ConstantPool\001 +4 0 0 823 -1 16 10 1.5708 4 135 945 1423 2063 getConstant()\001 +4 0 0 818 -1 16 10 1.5708 4 120 1350 5295 3479 <>\001 +4 0 0 815 -1 16 10 1.5708 4 120 1350 3763 4567 <>\001 +4 0 0 812 -1 16 10 1.5708 4 120 1350 3763 1783 <>\001 +4 0 0 809 -1 16 10 1.5708 4 120 1305 3759 9879 <>\001 +4 0 0 807 -1 16 10 1.5708 4 105 90 2835 4395 1\001 +4 0 0 805 -1 16 10 1.5708 4 105 90 2783 7675 1\001 +4 0 0 803 -1 16 10 1.5708 4 60 60 3287 5419 *\001 +4 0 0 801 -1 16 10 1.5708 4 105 90 1867 5127 1\001 +-6 diff --git a/docs/eps/il.eps b/docs/eps/il.eps new file mode 100644 index 00000000..f2ab8d92 --- /dev/null +++ b/docs/eps/il.eps @@ -0,0 +1,513 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: il.eps +%%Creator: fig2dev Version 3.2 Patchlevel 1 +%%CreationDate: Wed Dec 2 15:26:46 1998 +%%For: dahm@che (Markus Dahm,,,,,) +%%Orientation: Portrait +%%BoundingBox: 0 0 583 386 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +-84.0 526.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n -1000 9337 m -1000 -1000 l 11587 -1000 l 11587 9337 l cp clip + 0.06299 0.06299 sc +% Polyline +7.500 slw + [60] 0 sd +gs clippath +5205 7530 m 5175 7650 l 5145 7530 l 5145 7665 l 5205 7665 l cp +clip +n 5175 6975 m 5175 7650 l gs col0 s gr gr + [] 0 sd +% arrowhead +n 5205 7530 m 5175 7650 l 5145 7530 l col0 s +% Polyline + [60] 0 sd +gs clippath +5595 7095 m 5625 6975 l 5655 7095 l 5655 6960 l 5595 6960 l cp +clip +n 5625 7650 m 5625 6975 l gs col0 s gr gr + [] 0 sd +% arrowhead +n 5595 7095 m 5625 6975 l 5655 7095 l col0 s +% Polyline + [60] 0 sd +gs clippath +5205 3930 m 5175 4050 l 5145 3930 l 5145 4065 l 5205 4065 l cp +clip +n 5175 3375 m 5175 4050 l gs col0 s gr gr + [] 0 sd +% arrowhead +n 5205 3930 m 5175 4050 l 5145 3930 l col0 s +% Polyline + [60] 0 sd +gs clippath +5595 3495 m 5625 3375 l 5655 3495 l 5655 3360 l 5595 3360 l cp +clip +n 5625 4050 m 5625 3375 l gs col0 s gr gr + [] 0 sd +% arrowhead +n 5595 3495 m 5625 3375 l 5655 3495 l col0 s +% Polyline +n 4380 6750 m 4275 6750 4275 6870 105 arcto 4 {pop} repeat + 4275 6975 6420 6975 105 arcto 4 {pop} repeat + 6525 6975 6525 6855 105 arcto 4 {pop} repeat + 6525 6750 4380 6750 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 6930 m +gs 1 -1 sc (goto) col0 sh gr +% Polyline +n 4380 6300 m 4275 6300 4275 6420 105 arcto 4 {pop} repeat + 4275 6525 6420 6525 105 arcto 4 {pop} repeat + 6525 6525 6525 6405 105 arcto 4 {pop} repeat + 6525 6300 4380 6300 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4455 6480 m +gs 1 -1 sc (invokevirtual) col0 sh gr +% Polyline +n 4380 5850 m 4275 5850 4275 5970 105 arcto 4 {pop} repeat + 4275 6075 6420 6075 105 arcto 4 {pop} repeat + 6525 6075 6525 5955 105 arcto 4 {pop} repeat + 6525 5850 4380 5850 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 6030 m +gs 1 -1 sc (aload) col0 sh gr +% Polyline +n 4380 5400 m 4275 5400 4275 5520 105 arcto 4 {pop} repeat + 4275 5625 6420 5625 105 arcto 4 {pop} repeat + 6525 5625 6525 5505 105 arcto 4 {pop} repeat + 6525 5400 4380 5400 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 5580 m +gs 1 -1 sc (getstatic) col0 sh gr +% Polyline +n 4380 4950 m 4275 4950 4275 5070 105 arcto 4 {pop} repeat + 4275 5175 6420 5175 105 arcto 4 {pop} repeat + 6525 5175 6525 5055 105 arcto 4 {pop} repeat + 6525 4950 4380 4950 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 5130 m +gs 1 -1 sc (astore) col0 sh gr +% Polyline +n 4380 4500 m 4275 4500 4275 4620 105 arcto 4 {pop} repeat + 4275 4725 6420 4725 105 arcto 4 {pop} repeat + 6525 4725 6525 4605 105 arcto 4 {pop} repeat + 6525 4500 4380 4500 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 4680 m +gs 1 -1 sc (goto) col0 sh gr +% Polyline +n 4380 4050 m 4275 4050 4275 4170 105 arcto 4 {pop} repeat + 4275 4275 6420 4275 105 arcto 4 {pop} repeat + 6525 4275 6525 4155 105 arcto 4 {pop} repeat + 6525 4050 4380 4050 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4455 4230 m +gs 1 -1 sc (istore) col0 sh gr +% Polyline +gs clippath +5595 4395 m 5625 4275 l 5655 4395 l 5655 4260 l 5595 4260 l cp +clip +n 5625 4500 m 5625 4275 l gs col0 s gr gr + +% arrowhead +n 5595 4395 m 5625 4275 l 5655 4395 l col0 s +% Polyline +gs clippath +5205 4380 m 5175 4500 l 5145 4380 l 5145 4515 l 5205 4515 l cp +clip +n 5175 4275 m 5175 4500 l gs col0 s gr gr + +% arrowhead +n 5205 4380 m 5175 4500 l 5145 4380 l col0 s +% Polyline +gs clippath +5595 4845 m 5625 4725 l 5655 4845 l 5655 4710 l 5595 4710 l cp +clip +n 5625 4950 m 5625 4725 l gs col0 s gr gr + +% arrowhead +n 5595 4845 m 5625 4725 l 5655 4845 l col0 s +% Polyline +gs clippath +5205 4830 m 5175 4950 l 5145 4830 l 5145 4965 l 5205 4965 l cp +clip +n 5175 4725 m 5175 4950 l gs col0 s gr gr + +% arrowhead +n 5205 4830 m 5175 4950 l 5145 4830 l col0 s +% Polyline +gs clippath +5595 5295 m 5625 5175 l 5655 5295 l 5655 5160 l 5595 5160 l cp +clip +n 5625 5400 m 5625 5175 l gs col0 s gr gr + +% arrowhead +n 5595 5295 m 5625 5175 l 5655 5295 l col0 s +% Polyline +gs clippath +5205 5280 m 5175 5400 l 5145 5280 l 5145 5415 l 5205 5415 l cp +clip +n 5175 5175 m 5175 5400 l gs col0 s gr gr + +% arrowhead +n 5205 5280 m 5175 5400 l 5145 5280 l col0 s +% Polyline +gs clippath +5595 5745 m 5625 5625 l 5655 5745 l 5655 5610 l 5595 5610 l cp +clip +n 5625 5850 m 5625 5625 l gs col0 s gr gr + +% arrowhead +n 5595 5745 m 5625 5625 l 5655 5745 l col0 s +% Polyline +gs clippath +5205 5730 m 5175 5850 l 5145 5730 l 5145 5865 l 5205 5865 l cp +clip +n 5175 5625 m 5175 5850 l gs col0 s gr gr + +% arrowhead +n 5205 5730 m 5175 5850 l 5145 5730 l col0 s +% Polyline +gs clippath +5595 6195 m 5625 6075 l 5655 6195 l 5655 6060 l 5595 6060 l cp +clip +n 5625 6300 m 5625 6075 l gs col0 s gr gr + +% arrowhead +n 5595 6195 m 5625 6075 l 5655 6195 l col0 s +% Polyline +gs clippath +5205 6180 m 5175 6300 l 5145 6180 l 5145 6315 l 5205 6315 l cp +clip +n 5175 6075 m 5175 6300 l gs col0 s gr gr + +% arrowhead +n 5205 6180 m 5175 6300 l 5145 6180 l col0 s +% Polyline +gs clippath +5595 6645 m 5625 6525 l 5655 6645 l 5655 6510 l 5595 6510 l cp +clip +n 5625 6750 m 5625 6525 l gs col0 s gr gr + +% arrowhead +n 5595 6645 m 5625 6525 l 5655 6645 l col0 s +% Polyline +gs clippath +5205 6630 m 5175 6750 l 5145 6630 l 5145 6765 l 5205 6765 l cp +clip +n 5175 6525 m 5175 6750 l gs col0 s gr gr + +% arrowhead +n 5205 6630 m 5175 6750 l 5145 6630 l col0 s +% Polyline +n 4380 7650 m 4275 7650 4275 7770 105 arcto 4 {pop} repeat + 4275 7875 6420 7875 105 arcto 4 {pop} repeat + 6525 7875 6525 7755 105 arcto 4 {pop} repeat + 6525 7650 4380 7650 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4455 7830 m +gs 1 -1 sc (iload) col0 sh gr +% Polyline +n 4380 8100 m 4275 8100 4275 8220 105 arcto 4 {pop} repeat + 4275 8325 6420 8325 105 arcto 4 {pop} repeat + 6525 8325 6525 8205 105 arcto 4 {pop} repeat + 6525 8100 4380 8100 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4455 8280 m +gs 1 -1 sc (ireturn) col0 sh gr +% Polyline +gs clippath +5595 7995 m 5625 7875 l 5655 7995 l 5655 7860 l 5595 7860 l cp +clip +n 5625 8100 m 5625 7875 l gs col0 s gr gr + +% arrowhead +n 5595 7995 m 5625 7875 l 5655 7995 l col0 s +% Polyline +gs clippath +5205 7980 m 5175 8100 l 5145 7980 l 5145 8115 l 5205 8115 l cp +clip +n 5175 7875 m 5175 8100 l gs col0 s gr gr + +% arrowhead +n 5205 7980 m 5175 8100 l 5145 7980 l col0 s +% Polyline +gs clippath +5595 2595 m 5625 2475 l 5655 2595 l 5655 2460 l 5595 2460 l cp +clip +n 5625 2700 m 5625 2475 l gs col0 s gr gr + +% arrowhead +n 5595 2595 m 5625 2475 l 5655 2595 l col0 s +% Polyline +gs clippath +5205 2580 m 5175 2700 l 5145 2580 l 5145 2715 l 5205 2715 l cp +clip +n 5175 2475 m 5175 2700 l gs col0 s gr gr + +% arrowhead +n 5205 2580 m 5175 2700 l 5145 2580 l col0 s +% Polyline +n 4380 3150 m 4275 3150 4275 3270 105 arcto 4 {pop} repeat + 4275 3375 6420 3375 105 arcto 4 {pop} repeat + 6525 3375 6525 3255 105 arcto 4 {pop} repeat + 6525 3150 4380 3150 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 3330 m +gs 1 -1 sc (getstatic) col0 sh gr +% Polyline +n 4380 2700 m 4275 2700 4275 2820 105 arcto 4 {pop} repeat + 4275 2925 6420 2925 105 arcto 4 {pop} repeat + 6525 2925 6525 2805 105 arcto 4 {pop} repeat + 6525 2700 4380 2700 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4455 2880 m +gs 1 -1 sc (istore) col0 sh gr +% Polyline +n 4380 2250 m 4275 2250 4275 2370 105 arcto 4 {pop} repeat + 4275 2475 6420 2475 105 arcto 4 {pop} repeat + 6525 2475 6525 2355 105 arcto 4 {pop} repeat + 6525 2250 4380 2250 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 2430 m +gs 1 -1 sc (sipush) col0 sh gr +% Polyline +gs clippath +5595 3045 m 5625 2925 l 5655 3045 l 5655 2910 l 5595 2910 l cp +clip +n 5625 3150 m 5625 2925 l gs col0 s gr gr + +% arrowhead +n 5595 3045 m 5625 2925 l 5655 3045 l col0 s +% Polyline +gs clippath +5205 3030 m 5175 3150 l 5145 3030 l 5145 3165 l 5205 3165 l cp +clip +n 5175 2925 m 5175 3150 l gs col0 s gr gr + +% arrowhead +n 5205 3030 m 5175 3150 l 5145 3030 l col0 s +% Polyline +n 1350 5175 m 3600 5175 l 3600 5625 l 1350 5625 l cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +1575 5400 m +gs 1 -1 sc (IOException e1) col0 sh gr +% Polyline +n 1575 5175 m 1575 4950 l 3825 4950 l 3825 5400 l 3600 5400 l 3600 5175 l + 1575 5175 l cp gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 1350 3600 m 3600 3600 l 3600 4050 l 1350 4050 l cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +1575 3825 m +gs 1 -1 sc (int n) col0 sh gr +% Polyline +n 1575 3600 m 1575 3375 l 3825 3375 l 3825 3825 l 3600 3825 l 3600 3600 l + 1575 3600 l cp gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 7200 4050 m 10350 4050 l 10350 4500 l 7200 4500 l cp gs col0 s gr +% Polyline +n 7425 4050 m 7425 3825 l 10575 3825 l 10575 4275 l 10350 4275 l 10350 4050 l + 8325 4050 l gs 0.00 setgray ef gr gs col0 s gr +/Courier-Bold ff 210.00 scf sf +7425 4275 m +gs 1 -1 sc (Exception handler 1) col0 sh gr +% Polyline +gs clippath +4152 5071 m 4275 5085 l 4160 5131 l 4294 5113 l 4286 5053 l cp +clip +n 3600 5175 m 4275 5085 l gs col0 s gr gr + +% arrowhead +n 4152 5071 m 4275 5085 l 4160 5131 l 4156 5101 l 4152 5071 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +4190 2475 m 4275 2385 l 4243 2504 l 4309 2386 l 4256 2357 l cp +clip +n 3600 3600 m 4275 2385 l gs col0 s gr gr + +% arrowhead +n 4190 2475 m 4275 2385 l 4243 2504 l 4217 2490 l 4190 2475 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +4221 6324 m 4275 6435 l 4175 6362 l 4262 6466 l 4308 6427 l cp +clip +n 3600 5625 m 4275 6435 l gs col0 s gr gr + +% arrowhead +n 4221 6324 m 4275 6435 l 4175 6362 l 4198 6343 l 4221 6324 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6635 5029 m 6525 5085 l 6596 4984 l 6494 5072 l 6533 5117 l cp +clip +n 7200 4500 m 6525 5085 l gs col0 s gr gr + +% arrowhead +n 6635 5029 m 6525 5085 l 6596 4984 l 6616 5006 l 6635 5029 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6645 4215 m 6525 4185 l 6645 4155 l 6510 4155 l 6510 4215 l cp +clip +n 7200 4185 m 6525 4185 l gs col0 s gr gr + +% arrowhead +n 6645 4215 m 6525 4185 l 6645 4155 l 6645 4185 l 6645 4215 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6582 3395 m 6525 3285 l 6627 3355 l 6538 3254 l 6493 3294 l cp +clip +n 7200 4050 m 6525 3285 l gs col0 s gr gr + +% arrowhead +n 6582 3395 m 6525 3285 l 6627 3355 l 6604 3375 l 6582 3395 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +4329 7977 m 4320 8100 l 4269 7987 l 4293 8120 l 4352 8110 l cp +clip +n 3600 4050 m 4320 8100 l gs col0 s gr gr + +% arrowhead +n 4329 7977 m 4320 8100 l 4269 7987 l 4299 7982 l 4329 7977 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6649 7784 m 6525 7785 l 6633 7726 l 6503 7760 l 6518 7818 l cp +clip +n 6525 4635 m 6527 4636 l 6532 4640 l 6542 4646 l 6556 4655 l 6575 4667 l + 6600 4683 l 6628 4702 l 6661 4723 l 6695 4746 l 6731 4771 l + 6768 4796 l 6804 4821 l 6838 4845 l 6871 4869 l 6902 4892 l + 6931 4915 l 6958 4936 l 6983 4957 l 7005 4977 l 7026 4996 l + 7045 5015 l 7063 5034 l 7080 5054 l 7095 5073 l 7110 5093 l + 7124 5113 l 7137 5133 l 7150 5154 l 7162 5176 l 7174 5199 l + 7185 5223 l 7196 5247 l 7207 5273 l 7216 5299 l 7226 5326 l + 7235 5353 l 7243 5381 l 7251 5409 l 7258 5438 l 7265 5467 l + 7271 5496 l 7276 5525 l 7281 5554 l 7286 5582 l 7290 5611 l + 7293 5639 l 7296 5667 l 7299 5694 l 7301 5721 l 7303 5748 l + 7305 5775 l 7306 5802 l 7308 5829 l 7309 5857 l 7310 5885 l + 7310 5914 l 7311 5944 l 7311 5974 l 7311 6004 l 7311 6035 l + 7310 6067 l 7310 6099 l 7309 6131 l 7308 6163 l 7307 6195 l + 7306 6227 l 7305 6258 l 7304 6289 l 7302 6320 l 7301 6350 l + 7299 6379 l 7298 6407 l 7296 6435 l 7295 6462 l 7293 6489 l + 7292 6514 l 7290 6540 l 7288 6567 l 7287 6595 l 7285 6622 l + 7283 6650 l 7281 6677 l 7279 6706 l 7277 6734 l 7275 6762 l + 7273 6791 l 7270 6820 l 7268 6848 l 7265 6877 l 7263 6905 l + 7260 6932 l 7257 6959 l 7255 6986 l 7252 7011 l 7249 7036 l + 7246 7060 l 7243 7084 l 7240 7106 l 7237 7128 l 7233 7149 l + 7230 7170 l 7226 7195 l 7221 7219 l 7216 7243 l 7211 7268 l + 7205 7292 l 7198 7317 l 7191 7342 l 7183 7366 l 7174 7390 l + 7165 7414 l 7155 7436 l 7144 7459 l 7133 7480 l 7121 7500 l + 7108 7519 l 7095 7537 l 7081 7553 l 7066 7569 l 7051 7584 l + 7035 7598 l 7020 7609 l 7003 7621 l 6985 7632 l 6966 7642 l + 6945 7653 l 6921 7663 l 6895 7674 l 6867 7684 l 6836 7695 l + 6803 7706 l 6767 7717 l 6730 7728 l 6693 7739 l 6656 7750 l + 6622 7759 l 6592 7767 l 6567 7774 l 6525 7785 l gs col0 s gr gr + +% arrowhead +n 6649 7784 m 6525 7785 l 6633 7726 l 6641 7755 l 6649 7784 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6619 7615 m 6525 7695 l 6570 7580 l 6492 7690 l 6541 7725 l cp +clip +n 6525 6840 m 6526 6843 l 6529 6850 l 6533 6863 l 6540 6882 l 6549 6908 l + 6560 6938 l 6572 6973 l 6585 7010 l 6598 7048 l 6610 7086 l + 6622 7122 l 6632 7157 l 6642 7189 l 6650 7219 l 6657 7246 l + 6663 7271 l 6667 7294 l 6671 7315 l 6673 7335 l 6675 7354 l + 6675 7373 l 6674 7394 l 6672 7415 l 6669 7435 l 6663 7455 l + 6656 7476 l 6648 7498 l 6637 7520 l 6624 7544 l 6610 7568 l + 6595 7593 l 6579 7617 l 6564 7640 l 6550 7660 l 6525 7695 l gs col0 s gr gr + +% arrowhead +n 6619 7615 m 6525 7695 l 6570 7580 l 6595 7597 l 6619 7615 l cp gs 0.00 setgray ef gr col0 s +$F2psEnd +rs diff --git a/docs/eps/il.fig b/docs/eps/il.fig new file mode 100644 index 00000000..706e51ce --- /dev/null +++ b/docs/eps/il.fig @@ -0,0 +1,225 @@ +#FIG 3.2 +Portrait +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +6 4275 2250 6525 8325 +6 5130 6975 5670 7650 +6 5130 6975 5220 7650 +2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5175 6975 5175 7650 +-6 +2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5625 7650 5625 6975 +-6 +6 5130 3375 5670 4050 +2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5175 3375 5175 4050 +2 1 1 1 0 7 100 0 -1 4.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5625 4050 5625 3375 +-6 +6 4275 4050 6525 6975 +6 4275 6750 6525 6975 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 6525 6975 6525 6750 4275 6750 4275 6975 6525 6975 +4 0 0 100 0 14 14 0.0000 4 195 540 4500 6930 goto\001 +-6 +6 4275 6300 6525 6525 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 6525 6525 6525 6300 4275 6300 4275 6525 6525 6525 +4 0 0 100 0 14 14 0.0000 4 150 1755 4455 6480 invokevirtual\001 +-6 +6 4275 5850 6525 6075 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 6525 6075 6525 5850 4275 5850 4275 6075 6525 6075 +4 0 0 100 0 14 14 0.0000 4 150 675 4500 6030 aload\001 +-6 +6 4275 5400 6525 5625 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 6525 5625 6525 5400 4275 5400 4275 5625 6525 5625 +4 0 0 100 0 14 14 0.0000 4 195 1215 4500 5580 getstatic\001 +-6 +6 4275 4950 6525 5175 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 6525 5175 6525 4950 4275 4950 4275 5175 6525 5175 +4 0 0 100 0 14 14 0.0000 4 150 810 4500 5130 astore\001 +-6 +6 4275 4500 6525 4725 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 6525 4725 6525 4500 4275 4500 4275 4725 6525 4725 +4 0 0 100 0 14 14 0.0000 4 195 540 4500 4680 goto\001 +-6 +6 4275 4050 6525 4275 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 6525 4275 6525 4050 4275 4050 4275 4275 6525 4275 +4 0 0 100 0 14 14 0.0000 4 150 810 4455 4230 istore\001 +-6 +6 4950 4275 5850 4500 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5625 4500 5625 4275 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5175 4275 5175 4500 +-6 +6 4950 4725 5850 4950 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5625 4950 5625 4725 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5175 4725 5175 4950 +-6 +6 4950 5175 5850 5400 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5625 5400 5625 5175 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5175 5175 5175 5400 +-6 +6 4950 5625 5850 5850 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5625 5850 5625 5625 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5175 5625 5175 5850 +-6 +6 4950 6075 5850 6300 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5625 6300 5625 6075 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5175 6075 5175 6300 +-6 +6 4950 6525 5850 6750 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5625 6750 5625 6525 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5175 6525 5175 6750 +-6 +-6 +6 4275 7650 6525 8325 +6 4275 7650 6525 7875 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 6525 7875 6525 7650 4275 7650 4275 7875 6525 7875 +4 0 0 100 0 14 14 0.0000 4 150 675 4455 7830 iload\001 +-6 +6 4275 8100 6525 8325 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 6525 8325 6525 8100 4275 8100 4275 8325 6525 8325 +4 0 0 100 0 14 14 0.0000 4 150 945 4455 8280 ireturn\001 +-6 +6 4950 7875 5850 8100 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5625 8100 5625 7875 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5175 7875 5175 8100 +-6 +-6 +6 4275 2250 6525 3375 +6 4950 2475 5850 2700 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5625 2700 5625 2475 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5175 2475 5175 2700 +-6 +6 4275 3150 6525 3375 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 6525 3375 6525 3150 4275 3150 4275 3375 6525 3375 +4 0 0 100 0 14 14 0.0000 4 195 1215 4500 3330 getstatic\001 +-6 +6 4275 2700 6525 2925 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 6525 2925 6525 2700 4275 2700 4275 2925 6525 2925 +4 0 0 100 0 14 14 0.0000 4 150 810 4455 2880 istore\001 +-6 +6 4275 2250 6525 2475 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 6525 2475 6525 2250 4275 2250 4275 2475 6525 2475 +4 0 0 100 0 14 14 0.0000 4 195 810 4500 2430 sipush\001 +-6 +6 4950 2925 5850 3150 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5625 3150 5625 2925 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 5175 2925 5175 3150 +-6 +-6 +-6 +6 1350 4950 3825 5625 +6 1350 5175 3600 5625 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 1350 5175 3600 5175 3600 5625 1350 5625 1350 5175 +4 0 0 100 0 14 14 0.0000 4 195 1890 1575 5400 IOException e1\001 +-6 +2 1 0 1 0 0 100 0 20 0.000 0 0 -1 0 0 7 + 1575 5175 1575 4950 3825 4950 3825 5400 3600 5400 3600 5175 + 1575 5175 +-6 +6 1350 3375 3825 4050 +6 1350 3600 3600 4050 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 1350 3600 3600 3600 3600 4050 1350 4050 1350 3600 +4 0 0 100 0 14 14 0.0000 4 150 675 1575 3825 int n\001 +-6 +2 1 0 1 0 0 100 0 20 0.000 0 0 -1 0 0 7 + 1575 3600 1575 3375 3825 3375 3825 3825 3600 3825 3600 3600 + 1575 3600 +-6 +6 7200 3825 10575 4500 +2 2 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 5 + 7200 4050 10350 4050 10350 4500 7200 4500 7200 4050 +2 1 0 1 0 0 100 0 20 0.000 0 0 -1 0 0 7 + 7425 4050 7425 3825 10575 3825 10575 4275 10350 4275 10350 4050 + 8325 4050 +4 0 0 100 0 14 14 0.0000 4 195 2565 7425 4275 Exception handler 1\001 +-6 +2 1 0 1 0 7 100 0 -1 0.000 0 0 7 1 0 2 + 1 1 1.00 60.00 120.00 + 3600 5175 4275 5085 +2 1 0 1 0 7 100 0 -1 0.000 0 0 7 1 0 2 + 1 1 1.00 60.00 120.00 + 3600 3600 4275 2385 +2 1 0 1 0 7 100 0 -1 0.000 0 0 7 1 0 2 + 1 1 1.00 60.00 120.00 + 3600 5625 4275 6435 +2 1 0 1 0 7 100 0 -1 0.000 0 0 7 1 0 2 + 1 1 1.00 60.00 120.00 + 7200 4500 6525 5085 +2 1 0 1 0 7 100 0 -1 0.000 0 0 7 1 0 2 + 1 1 1.00 60.00 120.00 + 7200 4185 6525 4185 +2 1 0 1 0 7 100 0 -1 0.000 0 0 7 1 0 2 + 1 1 1.00 60.00 120.00 + 7200 4050 6525 3285 +2 1 0 1 0 7 100 0 -1 0.000 0 0 7 1 0 2 + 1 1 1.00 60.00 120.00 + 3600 4050 4320 8100 +3 0 0 1 0 7 100 0 -1 0.000 0 1 0 7 + 1 1 1.00 60.00 120.00 + 6525 4635 7200 5040 7335 5760 7290 6570 7245 7200 7110 7650 + 6525 7785 + 0.000 1.000 1.000 1.000 1.000 1.000 0.000 +3 0 0 1 0 7 100 0 -1 0.000 0 1 0 3 + 1 1 1.00 60.00 120.00 + 6525 6840 6750 7425 6525 7695 + 0.000 1.000 0.000 diff --git a/docs/eps/instructions.eps b/docs/eps/instructions.eps new file mode 100644 index 00000000..2ed46dc5 --- /dev/null +++ b/docs/eps/instructions.eps @@ -0,0 +1,445 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: Rose Diagram(s) +%%Creator: AdobePS5.dll Version 5.0 +%%CreationDate: 7/7/1999 17:43:39 +%%Pages: 1 +%%Orientation: Portrait +%%PageOrder: Ascend +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%DocumentData: Clean7Bit +%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 +%%LanguageLevel: 2 +%%BoundingBox: 13 12 410 830 +%%EndComments +%%BeginProcSet: epsffit 1 0 +gsave +1409.418 -167.686 translate +90 rotate +1.711 1.711 scale +%%EndProcSet + + +%%BeginDefaults +%%PageBoundingBox: 13 12 582 830 +%%EndDefaults + +%%BeginProlog +%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 +/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false +setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype +ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch +def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 +rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def +/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def +typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 +def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp +exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def +/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype +{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} +readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop +(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def +/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) +tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup +xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint +tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck +{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) +tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup +rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} +forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier +/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin +$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 +ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto +(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt +$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} +repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print +(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup +0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop +/setpacking where{pop oldpack setpacking}if}if +%%EndResource +userdict /Pscript_WinNT_Incr 230 dict dup begin put +%%BeginResource: file Pscript_FatalError 5.0 0 +/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div +cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def +%%EndResource +/VM?{vmstatus exch sub exch pop gt{[ +(This job requires more memory than is available in this printer.)100 500 +(Try one or more of the following, and then print again:)100 485 +(For the output format, choose Optimize For Portability.)115 470 +(In the Device Settings page, make sure the Available PostScript Memory is accurate.) +115 455(Reduce the number of fonts in the document.)115 440 +(Print the document in parts.)115 425 12/Times-Roman showpage +(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def +%%BeginResource: file Pscript_Win_Basic 5.0 0 +/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ +/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- +/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , +d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C +/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M +/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d +/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage +, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false +/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d +/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, +d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx +matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit +/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} +b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U +/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d +reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d +/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 +sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} +b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b +/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b +/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} +b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b +%%EndResource +%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 +/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge +{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ +snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F +setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d +/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b +%%EndResource +end +%%EndProlog + +%%BeginSetup +[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec +1 setlinecap 1 setlinejoin +/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def +%%EndSetup + +%%Page: 1 1 +%%PageBoundingBox: 13 12 582 830 +%%EndPageComments +%%BeginPageSetup +/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh +%%EndPageSetup + +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Win_GdiObject 5.0 0 +/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore +{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d +/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps +L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType +1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d +/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal +{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep +gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b +/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M +MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep +M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 ++}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d +/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix +GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 +/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal +makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 +/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d +/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] +d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 +0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne +{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd +aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx +PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save +8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 +Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx +matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` +xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill +{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot +concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap +YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 +-0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix +currentmatrix readonly d ; ;}if}b +%%EndResource +%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 +/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} +{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 +d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d +20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d +/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ +/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict +~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} +? ;}b +%%EndResource +end reinitialize +: N 1432 65 209 154 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 1641 64 M 1431 64 I 1431 219 I 1641 219 I C +K +0 0 0 1 scol Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Text 5.0 0 +/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d +/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ +length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets +{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& +/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} +if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ +{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get +StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ +{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ +length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ +put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M +currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d +/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N +/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix +astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get +length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d +/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS +{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 +copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for +& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ +4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 +add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for +/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 +Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName +length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length +string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ +putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 +$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? +{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName +get undefinefont}forall undefinefont}b +%%EndResource +end reinitialize +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Encoding256 5.0 0 +/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction +/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign +/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma +/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon +/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S +/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave +/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright +/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis +/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef +/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet +/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef +/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section +/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered +/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph +/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter +/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis +/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute +/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls +/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute +/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve +/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex +/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put +%%EndResource +end reinitialize + +%%IncludeResource: font Helvetica +F /F0 0 /256 T /Helvetica mF +/F0S21 F0 [33.09 0 0 -33.09 0 0 ] mFS +F0S21 Ji +1461 104 M (Instruction)[9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 1641 117 M 1431 117 I 1431 219 I 1641 219 I C +K +N 1641 212 M 1431 212 I 1431 219 I 1641 219 I C +K +0 0 0 1 scol 1478 153 M (tag)[9 17 0]xS +1478 191 M (length)[7 17 18 18 9 0]xS +: N 575 326 321 98 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 896 325 M 574 325 I 574 424 I 896 424 I C +K +0 0 0 1 scol 609 365 M (BranchInstruction)[22 11 17 18 17 18 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 896 378 M 574 378 I 574 424 I 896 424 I C +K +N 896 396 M 574 396 I 574 424 I 896 424 I C +K +: N 822 556 164 154 rp C +1 1 0.801 1 scol L ; N 986 555 M 821 555 I 821 710 I 986 710 I C +K +0 0 0 1 scol 859 595 M (Select)[22 17 7 17 17 0]xS +0.602 0 0.199 1 scol N 986 608 M 821 608 I 821 710 I 986 710 I C +K +N 986 702 M 821 702 I 821 710 I 986 710 I C +K +0 0 0 1 scol 868 644 M (targets)[9 17 11 18 17 9 0]xS +868 682 M (keys)[16 17 15 0]xS +: N 584 815 303 100 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 887 814 M 583 814 I 583 915 I 887 915 I C +K +0 0 0 1 scol 599 855 M (LOOKUPSWITCH)[18 26 26 22 24 22 22 34 9 21 24 0]xS +0.602 0 0.199 1 scol N 887 868 M 583 868 I 583 915 I 887 915 I C +K +N 887 886 M 583 886 I 583 915 I 887 915 I C +K +: N 964 815 267 100 rp C +1 1 0.801 1 scol L ; N 1231 814 M 963 814 I 963 915 I 1231 915 I C +K +0 0 0 1 scol 978 855 M (TABLESWITCH)[21 22 22 18 22 22 34 9 21 24 0]xS +0.602 0 0.199 1 scol N 1231 868 M 963 868 I 963 915 I 1231 915 I C +K +N 1231 886 M 963 886 I 963 915 I 1231 915 I C +K +: N 567 557 208 100 rp C +1 1 0.801 1 scol L ; N 775 556 M 566 556 I 566 657 I 775 657 I C +K +0 0 0 1 scol 587 597 M (IfInstruction)[9 10 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 775 609 M 566 609 I 566 657 I 775 657 I C +K +N 775 628 M 566 628 I 566 657 I 775 657 I C +K +: N 393 557 143 100 rp C +1 1 0.801 1 scol L ; N 536 556 M 392 556 I 392 657 I 536 657 I C +K +0 0 0 1 scol 415 597 M (GOTO)[26 26 21 0]xS +0.602 0 0.199 1 scol N 536 609 M 392 609 I 392 657 I 536 657 I C +K +N 536 628 M 392 628 I 392 657 I 536 657 I C +K +N 730 499 M 730 425 I K +N 469 499 M 910 499 I K +N 730 425 M 748 473 I 712 473 I C +: 1 1 1 1 scol O ; K +N 469 556 M 469 499 I K +: N 1843 118 290 100 rp C +1 1 0.801 1 scol L ; N 2133 117 M 1842 117 I 1842 218 I 2133 218 I C +K +0 0 0 1 scol 1865 158 M (ReturnInstruction)[24 17 9 18 11 18 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 2133 168 M 1842 168 I 1842 218 I 2133 218 I C +K +N 2133 186 M 1842 186 I 1842 218 I 2133 218 I C +K +: N 1004 325 264 99 rp C +1 1 0.801 1 scol L ; N 1268 324 M 1003 324 I 1003 424 I 1268 424 I C +K +0 0 0 1 scol 1023 364 M (ArrayInstruction)[22 11 11 17 15 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 1268 377 M 1003 377 I 1003 424 I 1268 424 I C +K +N 1268 396 M 1003 396 I 1003 424 I 1268 424 I C +K +: N 1704 332 232 188 rp C +1 1 0.801 1 scol L ; N 1936 331 M 1703 331 I 1703 520 I 1936 520 I C +K +0 0 0 1 scol 1722 372 M (CPInstruction)[24 22 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 1936 382 M 1703 382 I 1703 520 I 1936 520 I C +K +N 1936 438 M 1703 438 I 1703 520 I 1936 520 I C +K +0 0 0 1 scol 1751 418 M (index)[7 18 18 17 0]xS +1751 494 M (getType\(\))[18 17 9 21 15 18 17 11 0]xS +: N 1038 118 274 100 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1312 117 M 1037 117 I 1037 218 I 1312 218 I C +K +0 0 0 1 scol 1059 158 M (StackInstruction)[22 9 17 17 16 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 1312 170 M 1037 170 I 1037 218 I 1312 218 I C +K +N 1312 189 M 1037 189 I 1037 218 I 1312 218 I C +K +: N 1312 325 345 99 rp C +1 1 0.801 1 scol L ; N 1657 324 M 1311 324 I 1311 424 I 1657 424 I C +K +0 0 0 1 scol 1329 364 M (ConversionInstruction)[24 17 18 15 17 11 17 7 17 18 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 1657 377 M 1311 377 I 1311 424 I 1657 424 I C +K +N 1657 396 M 1311 396 I 1311 424 I 1657 424 I C +K +N 675 556 M 675 499 I K +: N 619 118 337 100 rp C +1 1 0.801 1 scol L ; N 956 117 M 618 117 I 618 218 I 956 218 I C +K +0 0 0 1 scol 641 158 M (ArithmeticInstruction)[22 11 7 9 18 27 17 9 7 17 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 956 170 M 618 170 I 618 218 I 956 218 I C +K +N 956 189 M 618 189 I 618 218 I 956 218 I C +K +: N 1974 326 390 148 rp C +1 1 0.801 1 scol L ; N 2364 325 M 1973 325 I 1973 474 I 2364 474 I C +K +0 0 0 1 scol 1998 366 M (LocalVariableInstruction)[18 17 17 17 7 22 17 11 7 17 18 7 17 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 2364 376 M 1973 376 I 1973 474 I 2364 474 I C +K +N 2364 433 M 1973 433 I 1973 474 I 2364 474 I C +K +0 0 0 1 scol 2020 412 M (index)[7 18 18 17 0]xS +: N 1392 869 263 148 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1655 868 M 1391 868 I 1391 1017 I 1655 1017 I C +K +0 0 0 1 scol 1414 908 M (FieldInstruction)[20 7 17 7 18 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 1655 921 M 1391 921 I 1391 1017 I 1655 1017 I C +K +N 1655 940 M 1391 940 I 1391 1017 I 1655 1017 I C +K +0 0 0 1 scol 1439 995 M (getFieldType\(\))[18 17 9 20 7 17 7 18 21 15 18 17 11 0]xS +: N 1735 869 351 148 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2086 868 M 1734 868 I 1734 1017 I 2086 1017 I C +K +0 0 0 1 scol 1790 908 M (InvokeInstruction)[9 18 15 17 16 17 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 2086 919 M 1734 919 I 1734 1017 I 2086 1017 I C +K +N 2086 937 M 1734 937 I 1734 1017 I 2086 1017 I C +K +0 0 0 1 scol 1781 992 M (getArgumentTypes\(\))[18 17 9 22 11 18 18 27 17 18 9 21 15 18 17 17 11 0]xS +0.602 0 0.199 1 scol N 1539 293 M 1539 220 I K +N 703 293 M 2171 293 I K +N 1539 220 M 1557 269 I 1522 269 I C +: 1 1 1 1 scol O ; K +N 2171 325 M 2171 293 I K +N 1826 331 M 1826 293 I K +N 898 784 M 898 711 I K +N 737 784 M 1069 784 I K +N 898 711 M 916 760 I 880 760 I C +: 1 1 1 1 scol O ; K +N 737 814 M 737 784 I K +N 1116 324 M 1116 293 I K +N 792 219 M 792 293 I K +N 1487 324 M 1487 293 I K +N 1984 219 M 1984 293 I K +N 1166 219 M 1166 293 I K +: N 1554 623 248 148 rp C +1 1 0.801 1 scol L ; N 1802 622 M 1553 622 I 1553 771 I 1802 771 I C +K +0 0 0 1 scol 1572 663 M (FieldOrMethod)[20 7 17 7 18 26 11 27 17 9 18 17 0]xS +0.602 0 0.199 1 scol N 1802 676 M 1553 676 I 1553 771 I 1802 771 I C +K +N 1802 694 M 1553 694 I 1553 771 I 1802 771 I C +K +0 0 0 1 scol 1601 749 M (getName\(\))[18 17 9 24 17 27 17 11 0]xS +: N 2179 635 186 99 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2365 634 M 2178 634 I 2178 734 I 2365 734 I C +K +0 0 0 1 scol 2232 674 M (NEW)[24 22 0]xS +0.602 0 0.199 1 scol N 2365 684 M 2178 684 I 2178 734 I 2365 734 I C +K +N 2365 703 M 2178 703 I 2178 734 I 2365 734 I C +K +N 703 325 M 703 293 I K +N 1820 594 M 1820 521 I K +N 1657 594 M 2249 594 I K +N 1820 521 M 1838 570 I 1802 570 I C +: 1 1 1 1 scol O ; K +: N 1889 635 250 99 rp C +1 1 0.801 1 scol L ; N 2139 634 M 1888 634 I 1888 734 I 2139 734 I C +K +0 0 0 1 scol 1907 674 M (INSTANCEOF)[9 24 22 21 22 24 24 22 26 0]xS +0.602 0 0.199 1 scol N 2139 684 M 1888 684 I 1888 734 I 2139 734 I C +K +N 2139 703 M 1888 703 I 1888 734 I 2139 734 I C +K +N 2014 634 M 2014 594 I K +N 2249 634 M 2249 594 I K +N 1657 622 M 1657 594 I K +N 1069 814 M 1069 784 I K +N 1677 845 M 1677 772 I K +N 1511 845 M 1907 845 I K +N 1677 772 M 1695 821 I 1660 821 I C +: 1 1 1 1 scol O ; K +N 1907 868 M 1907 845 I K +N 1511 868 M 1511 845 I K +N 910 555 M 910 499 I K +LH +%%PageTrailer + +%%Trailer +%%DocumentNeededResources: +%%+ font Helvetica +%%DocumentSuppliedResources: +Pscript_WinNT_Incr dup /terminate get exec +%%EOF +grestore diff --git a/docs/eps/instructions.fig b/docs/eps/instructions.fig new file mode 100644 index 00000000..5c88fb55 --- /dev/null +++ b/docs/eps/instructions.fig @@ -0,0 +1,245 @@ +#FIG 3.2 +Portrait +Center +Inches +A4 +100.00 +Single +-2 +1200 2 +0 32 #f9f9f9 +0 33 #303030 +6 75 75 5475 9975 +2 1 0 0 32 32 998 0 20 4.000 0 0 0 0 0 4 + 95 5002 95 3478 1027 3478 1027 5002 +2 1 0 1 33 33 997 0 -1 4.000 0 0 0 0 0 5 + 91 5006 91 3474 1031 3474 1031 5006 91 5006 +2 1 0 1 33 33 995 0 -1 4.000 0 0 0 0 0 5 + 355 5006 355 3474 1031 3474 1031 5006 355 5006 +2 1 0 1 33 33 994 0 -1 4.000 0 0 0 0 0 5 + 823 5006 823 3474 1031 3474 1031 5006 823 5006 +2 1 0 0 32 32 991 0 20 4.000 0 0 0 0 0 4 + 1667 9186 1667 7102 2399 7102 2399 9186 +2 1 0 1 33 33 990 0 -1 4.000 0 0 0 0 0 5 + 1663 9190 1663 7098 2403 7098 2403 9190 1663 9190 +2 1 0 1 33 33 988 0 -1 4.000 0 0 0 0 0 5 + 1927 9190 1927 7098 2403 7098 2403 9190 1927 9190 +2 1 0 1 33 33 987 0 -1 4.000 0 0 0 0 0 5 + 2207 9190 2207 7098 2403 7098 2403 9190 2207 9190 +2 1 0 0 32 32 985 0 20 4.000 0 0 0 0 0 4 + 3295 7806 3295 5538 4227 5538 4227 7806 +2 1 0 1 33 33 984 0 -1 4.000 0 0 0 0 0 5 + 3291 7810 3291 5534 4231 5534 4231 7810 3291 7810 +2 1 0 1 33 33 982 0 -1 4.000 0 0 0 0 0 5 + 3555 7810 3555 5534 4231 5534 4231 7810 3555 7810 +2 1 0 1 33 33 981 0 -1 4.000 0 0 0 0 0 5 + 4023 7810 4023 5534 4231 5534 4231 7810 4023 7810 +2 1 0 0 32 32 978 0 20 4.000 0 0 0 0 0 4 + 4923 8254 4923 6754 5415 6754 5415 8254 +2 1 0 1 33 33 977 0 -1 4.000 0 0 0 0 0 5 + 4919 8258 4919 6750 5419 6750 5419 8258 4919 8258 +2 1 0 1 33 33 975 0 -1 4.000 0 0 0 0 0 5 + 5183 8258 5183 6750 5419 6750 5419 8258 5183 8258 +2 1 0 1 33 33 974 0 -1 4.000 0 0 0 0 0 5 + 5275 8258 5275 6750 5419 6750 5419 8258 5275 8258 +2 1 0 0 32 32 973 0 20 4.000 0 0 0 0 0 4 + 4923 6502 4923 5178 5415 5178 5415 6502 +2 1 0 1 33 33 972 0 -1 4.000 0 0 0 0 0 5 + 4919 6506 4919 5174 5419 5174 5419 6506 4919 6506 +2 1 0 1 33 33 970 0 -1 4.000 0 0 0 0 0 5 + 5183 6506 5183 5174 5419 5174 5419 6506 5183 6506 +2 1 0 1 33 33 969 0 -1 4.000 0 0 0 0 0 5 + 5275 6506 5275 5174 5419 5174 5419 6506 5275 6506 +2 1 0 0 32 32 968 0 20 4.000 0 0 0 0 0 4 + 3859 3986 3859 2446 4815 2446 4815 3986 +2 1 0 1 33 33 967 0 -1 4.000 0 0 0 0 0 5 + 3855 3990 3855 2442 4819 2442 4819 3990 3855 3990 +2 1 0 1 33 33 965 0 -1 4.000 0 0 0 0 0 5 + 4319 3990 4319 2442 4819 2442 4819 3990 4319 3990 +2 1 0 1 33 33 964 0 -1 4.000 0 0 0 0 0 5 + 4411 3990 4411 2442 4819 2442 4819 3990 4411 3990 +2 1 0 0 32 32 961 0 20 4.000 0 0 0 0 0 4 + 3323 9042 3323 8014 3815 8014 3815 9042 +2 1 0 1 33 33 960 0 -1 4.000 0 0 0 0 0 5 + 3319 9046 3319 8010 3819 8010 3819 9046 3319 9046 +2 1 0 1 33 33 958 0 -1 4.000 0 0 0 0 0 5 + 3583 9046 3583 8010 3819 8010 3819 9046 3583 9046 +2 1 0 1 33 33 957 0 -1 4.000 0 0 0 0 0 5 + 3675 9046 3675 8010 3819 8010 3819 9046 3675 9046 +2 1 0 0 32 32 956 0 20 4.000 0 0 0 0 0 4 + 3323 9970 3323 9262 3815 9262 3815 9970 +2 1 0 1 33 33 955 0 -1 4.000 0 0 0 0 0 5 + 3319 9974 3319 9258 3819 9258 3819 9974 3319 9974 +2 1 0 1 33 33 953 0 -1 4.000 0 0 0 0 0 5 + 3583 9974 3583 9258 3819 9258 3819 9974 3583 9974 +2 1 0 1 33 33 952 0 -1 4.000 0 0 0 0 0 5 + 3675 9974 3675 9258 3819 9258 3819 9974 3675 9974 +2 1 0 1 33 33 951 0 -1 4.000 0 0 0 0 0 2 + 2943 8142 2407 8142 +2 1 0 1 33 33 950 0 -1 4.000 0 0 0 0 0 2 + 2943 9606 2943 6742 +2 1 0 0 7 7 949 0 20 4.000 0 0 0 0 0 4 + 2407 8142 2647 8054 2647 8230 2407 8142 +2 1 0 1 33 33 948 0 -1 4.000 0 0 0 0 0 4 + 2407 8142 2647 8054 2647 8230 2407 8142 +2 1 0 1 33 33 947 0 -1 4.000 0 0 0 0 0 2 + 3291 6742 2943 6742 +2 1 0 1 33 33 946 0 -1 4.000 0 0 0 0 0 2 + 3319 9606 2943 9606 +2 1 0 0 32 32 945 0 20 4.000 0 0 0 0 0 4 + 379 2718 379 1282 871 1282 871 2718 +2 1 0 1 33 33 944 0 -1 4.000 0 0 0 0 0 5 + 375 2722 375 1278 875 1278 875 2722 375 2722 +2 1 0 1 33 33 942 0 -1 4.000 0 0 0 0 0 5 + 639 2722 639 1278 875 1278 875 2722 639 2722 +2 1 0 1 33 33 941 0 -1 4.000 0 0 0 0 0 5 + 731 2722 731 1278 875 1278 875 2722 731 2722 +2 1 0 0 32 32 940 0 20 4.000 0 0 0 0 0 4 + 1659 6878 1659 5570 2151 5570 2151 6878 +2 1 0 1 33 33 939 0 -1 4.000 0 0 0 0 0 5 + 1655 6882 1655 5566 2155 5566 2155 6882 1655 6882 +2 1 0 1 33 33 937 0 -1 4.000 0 0 0 0 0 5 + 1919 6882 1919 5566 2155 5566 2155 6882 1919 6882 +2 1 0 1 33 33 936 0 -1 4.000 0 0 0 0 0 5 + 2011 6882 2011 5566 2155 5566 2155 6882 2011 6882 +2 1 0 0 32 32 935 0 20 4.000 0 0 0 0 0 4 + 1667 3406 1667 2258 2399 2258 2399 3406 +2 1 0 1 33 33 934 0 -1 4.000 0 0 0 0 0 5 + 1663 3410 1663 2254 2403 2254 2403 3410 1663 3410 +2 1 0 1 33 33 932 0 -1 4.000 0 0 0 0 0 5 + 1927 3410 1927 2254 2403 2254 2403 3410 1927 3410 +2 1 0 1 33 33 931 0 -1 4.000 0 0 0 0 0 5 + 2207 3410 2207 2254 2403 2254 2403 3410 2207 3410 +2 1 0 0 32 32 929 0 20 4.000 0 0 0 0 0 4 + 379 6710 379 5354 871 5354 871 6710 +2 1 0 1 33 33 928 0 -1 4.000 0 0 0 0 0 5 + 375 6714 375 5350 875 5350 875 6714 375 6714 +2 1 0 1 33 33 926 0 -1 4.000 0 0 0 0 0 5 + 639 6714 639 5350 875 5350 875 6714 639 6714 +2 1 0 1 33 33 925 0 -1 4.000 0 0 0 0 0 5 + 731 6714 731 5350 875 5350 875 6714 731 6714 +2 1 0 0 32 32 924 0 20 4.000 0 0 0 0 0 4 + 1659 5350 1659 3642 2151 3642 2151 5350 +2 1 0 1 33 33 923 0 -1 4.000 0 0 0 0 0 5 + 1655 5354 1655 3638 2155 3638 2155 5354 1655 5354 +2 1 0 1 33 33 921 0 -1 4.000 0 0 0 0 0 5 + 1919 5354 1919 3638 2155 3638 2155 5354 1919 5354 +2 1 0 1 33 33 920 0 -1 4.000 0 0 0 0 0 5 + 2011 5354 2011 3638 2155 3638 2155 5354 2011 5354 +2 1 0 1 33 33 919 0 -1 4.000 0 0 0 0 0 2 + 3319 8490 2943 8490 +2 1 0 0 32 32 918 0 20 4.000 0 0 0 0 0 4 + 379 8786 379 7118 871 7118 871 8786 +2 1 0 1 33 33 917 0 -1 4.000 0 0 0 0 0 5 + 375 8790 375 7114 875 7114 875 8790 375 8790 +2 1 0 1 33 33 915 0 -1 4.000 0 0 0 0 0 5 + 639 8790 639 7114 875 7114 875 8790 639 8790 +2 1 0 1 33 33 914 0 -1 4.000 0 0 0 0 0 5 + 731 8790 731 7114 875 7114 875 8790 731 8790 +2 1 0 0 32 32 913 0 20 4.000 0 0 0 0 0 4 + 1667 1994 1667 86 2399 86 2399 1994 +2 1 0 1 33 33 912 0 -1 4.000 0 0 0 0 0 5 + 1663 1998 1663 82 2403 82 2403 1998 1663 1998 +2 1 0 1 33 33 910 0 -1 4.000 0 0 0 0 0 5 + 1927 1998 1927 82 2403 82 2403 1998 1927 1998 +2 1 0 1 33 33 909 0 -1 4.000 0 0 0 0 0 5 + 2207 1998 2207 82 2403 82 2403 1998 2207 1998 +2 1 0 0 32 32 907 0 20 4.000 0 0 0 0 0 4 + 2939 4314 2939 3014 3431 3014 3431 4314 +2 1 0 1 33 33 906 0 -1 4.000 0 0 0 0 0 5 + 2935 4318 2935 3010 3435 3010 3435 4318 2935 4318 +2 1 0 1 33 33 904 0 -1 4.000 0 0 0 0 0 5 + 3199 4318 3199 3010 3435 3010 3435 4318 3199 4318 +2 1 0 1 33 33 903 0 -1 4.000 0 0 0 0 0 5 + 3291 4318 3291 3010 3435 3010 3435 4318 3291 4318 +2 1 0 0 32 32 902 0 20 4.000 0 0 0 0 0 4 + 2939 2758 2939 1370 3431 1370 3431 2758 +2 1 0 1 33 33 901 0 -1 4.000 0 0 0 0 0 5 + 2935 2762 2935 1366 3435 1366 3435 2762 2935 2762 +2 1 0 1 33 33 899 0 -1 4.000 0 0 0 0 0 5 + 3199 2762 3199 1366 3435 1366 3435 2762 3199 2762 +2 1 0 1 33 33 898 0 -1 4.000 0 0 0 0 0 5 + 3291 2762 3291 1366 3435 1366 3435 2762 3291 2762 +2 1 0 1 33 33 897 0 -1 4.000 0 0 0 0 0 2 + 1395 4238 1035 4238 +2 1 0 1 33 33 896 0 -1 4.000 0 0 0 0 0 2 + 1395 8142 1395 1042 +2 1 0 0 7 7 895 0 20 4.000 0 0 0 0 0 4 + 1035 4238 1275 4150 1275 4326 1035 4238 +2 1 0 1 33 33 894 0 -1 4.000 0 0 0 0 0 4 + 1035 4238 1275 4150 1275 4326 1035 4238 +2 1 0 1 33 33 893 0 -1 4.000 0 0 0 0 0 2 + 1663 1042 1395 1042 +2 1 0 1 33 33 892 0 -1 4.000 0 0 0 0 0 2 + 1663 2866 1395 2866 +2 1 0 1 33 33 891 0 -1 4.000 0 0 0 0 0 2 + 2767 2894 2407 2894 +2 1 0 1 33 33 890 0 -1 4.000 0 0 0 0 0 2 + 2767 3818 2767 2094 +2 1 0 0 7 7 889 0 20 4.000 0 0 0 0 0 4 + 2407 2894 2647 2806 2647 2982 2407 2894 +2 1 0 1 33 33 888 0 -1 4.000 0 0 0 0 0 4 + 2407 2894 2647 2806 2647 2982 2407 2894 +2 1 0 1 33 33 887 0 -1 4.000 0 0 0 0 0 2 + 4683 6718 4235 6718 +2 1 0 1 33 33 886 0 -1 4.000 0 0 0 0 0 2 + 4683 7542 4683 5942 +2 1 0 0 7 7 885 0 20 4.000 0 0 0 0 0 4 + 4235 6718 4475 6630 4475 6806 4235 6718 +2 1 0 1 33 33 884 0 -1 4.000 0 0 0 0 0 4 + 4235 6718 4475 6630 4475 6806 4235 6718 +2 1 0 1 33 33 883 0 -1 4.000 0 0 0 0 0 2 + 4919 7542 4683 7542 +2 1 0 1 33 33 882 0 -1 4.000 0 0 0 0 0 2 + 1663 8142 1395 8142 +2 1 0 1 33 33 881 0 -1 4.000 0 0 0 0 0 2 + 1655 6278 1395 6278 +2 1 0 1 33 33 880 0 -1 4.000 0 0 0 0 0 2 + 879 7930 1395 7930 +2 1 0 1 33 33 879 0 -1 4.000 0 0 0 0 0 2 + 1655 4494 1395 4494 +2 1 0 1 33 33 878 0 -1 4.000 0 0 0 0 0 2 + 879 2018 1395 2018 +2 1 0 1 33 33 877 0 -1 4.000 0 0 0 0 0 2 + 2935 3818 2767 3818 +2 1 0 1 33 33 876 0 -1 4.000 0 0 0 0 0 2 + 2935 2094 2767 2094 +2 1 0 1 33 33 875 0 -1 4.000 0 0 0 0 0 2 + 4919 5942 4683 5942 +2 1 1 1 7 7 874 0 -1 4.000 0 0 0 0 0 2 + 2407 7350 3975 3994 +2 1 1 1 0 0 873 0 -1 4.000 0 0 0 0 0 2 + 2407 7350 3975 3994 +2 1 0 0 7 7 872 0 20 4.000 0 0 0 0 0 4 + 3975 3994 3795 4174 3955 4246 3975 3994 +2 1 0 1 33 33 871 0 -1 4.000 0 0 0 0 0 4 + 3975 3994 3795 4174 3955 4246 3975 3994 +2 1 0 1 33 33 870 0 -1 4.000 0 0 0 0 0 2 + 879 6074 1395 6074 +4 0 0 996 -1 16 10 1.5708 4 120 720 291 4614 Instruction\001 +4 0 0 993 -1 16 10 1.5708 4 150 660 531 4770 tag : byte\001 +4 0 0 992 -1 16 10 1.5708 4 150 1215 719 4770 length, offset : int\001 +4 0 0 989 -1 16 10 1.5708 4 120 1215 1863 8778 BranchInstruction\001 +4 0 0 986 -1 16 10 1.5708 4 150 1755 2103 8954 target : InstructionHandle\001 +4 0 0 983 -1 16 10 1.5708 4 120 435 3491 6902 Select\001 +4 0 0 980 -1 16 10 1.5708 4 150 1920 3731 7574 targets : InstructionHandle[]\001 +4 0 0 979 -1 16 10 1.5708 4 150 705 3919 7574 keys : int[]\001 +4 0 0 976 -1 16 10 1.5708 4 105 1230 5119 8170 LOOKUPSWITCH\001 +4 0 0 971 -1 16 10 1.5708 4 105 1080 5119 6426 TABLESWITCH\001 +4 0 0 966 -1 16 10 1.5708 4 150 1305 4255 3902 InstructionTargeter\001 +4 0 0 963 -1 16 10 1.5708 4 150 1035 4683 3754 updateTarget()\001 +4 0 0 962 -1 16 10 1.5708 4 120 975 4055 3726 <>\001 +4 0 0 959 -1 16 10 1.5708 4 120 810 3519 8946 IfInstruction\001 +4 0 0 954 -1 16 10 1.5708 4 105 450 3519 9858 GOTO\001 +4 0 0 943 -1 16 10 1.5708 4 120 1185 575 2622 ReturnInstruction\001 +4 0 0 938 -1 16 10 1.5708 4 150 1080 1855 6790 ArrayInstruction\001 +4 0 0 933 -1 16 10 1.5708 4 120 930 1863 3318 CPInstruction\001 +4 0 0 930 -1 16 10 1.5708 4 120 675 2103 3174 index : int\001 +4 0 0 927 -1 16 10 1.5708 4 120 1110 575 6610 StackInstruction\001 +4 0 0 922 -1 16 10 1.5708 4 120 1500 1855 5282 ConversionInstruction\001 +4 0 0 916 -1 16 10 1.5708 4 120 1395 575 8690 ArithmeticInstruction\001 +4 0 0 911 -1 16 10 1.5708 4 120 1665 1863 1914 LocalVariableInstruction\001 +4 0 0 908 -1 16 10 1.5708 4 120 675 2103 1762 index : int\001 +4 0 0 905 -1 16 10 1.5708 4 120 1050 3135 4214 FieldInstruction\001 +4 0 0 900 -1 16 10 1.5708 4 120 1185 3135 2674 InvokeInstruction\001 +-6 diff --git a/docs/eps/javaclass.eps b/docs/eps/javaclass.eps new file mode 100644 index 00000000..cbfa8924 --- /dev/null +++ b/docs/eps/javaclass.eps @@ -0,0 +1,525 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: Rose Diagram(s) +%%Creator: AdobePS5.dll Version 5.0 +%%CreationDate: 7/7/1999 17:45:7 +%%Pages: 1 +%%Orientation: Portrait +%%PageOrder: Ascend +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%DocumentData: Clean7Bit +%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 +%%LanguageLevel: 2 +%%BoundingBox: 13 12 471 830 +%%EndComments +%%BeginProcSet: epsffit 1 0 +gsave +1233.763 -187.599 translate +90 rotate +1.782 1.782 scale +%%EndProcSet + + +%%BeginDefaults +%%PageBoundingBox: 13 12 582 830 +%%EndDefaults + +%%BeginProlog +%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 +/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false +setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype +ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch +def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 +rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def +/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def +typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 +def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp +exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def +/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype +{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} +readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop +(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def +/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) +tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup +xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint +tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck +{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) +tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup +rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} +forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier +/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin +$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 +ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto +(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt +$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} +repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print +(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup +0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop +/setpacking where{pop oldpack setpacking}if}if +%%EndResource +userdict /Pscript_WinNT_Incr 230 dict dup begin put +%%BeginResource: file Pscript_FatalError 5.0 0 +/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div +cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def +%%EndResource +/VM?{vmstatus exch sub exch pop gt{[ +(This job requires more memory than is available in this printer.)100 500 +(Try one or more of the following, and then print again:)100 485 +(For the output format, choose Optimize For Portability.)115 470 +(In the Device Settings page, make sure the Available PostScript Memory is accurate.) +115 455(Reduce the number of fonts in the document.)115 440 +(Print the document in parts.)115 425 12/Times-Roman showpage +(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def +%%BeginResource: file Pscript_Win_Basic 5.0 0 +/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ +/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- +/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , +d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C +/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M +/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d +/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage +, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false +/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d +/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, +d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx +matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit +/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} +b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U +/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d +reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d +/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 +sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} +b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b +/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b +/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} +b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b +%%EndResource +%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 +/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge +{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ +snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F +setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d +/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b +%%EndResource +end +%%EndProlog + +%%BeginSetup +[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec +1 setlinecap 1 setlinejoin +/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def +%%EndSetup + +%%Page: 1 1 +%%PageBoundingBox: 13 12 582 830 +%%EndPageComments +%%BeginPageSetup +/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh +%%EndPageSetup + +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Win_GdiObject 5.0 0 +/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore +{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d +/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps +L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType +1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d +/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal +{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep +gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b +/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M +MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep +M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 ++}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d +/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix +GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 +/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal +makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 +/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d +/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] +d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 +0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne +{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd +aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx +PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save +8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 +Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx +matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` +xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill +{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot +concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap +YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 +-0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix +currentmatrix readonly d ; ;}if}b +%%EndResource +%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 +/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} +{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 +d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d +20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d +/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ +/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict +~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} +? ;}b +%%EndResource +end reinitialize +: N 712 1406 246 93 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 958 1405 M 711 1405 I 711 1499 I 958 1499 I C +K +0 0 0 1 scol Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Text 5.0 0 +/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d +/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ +length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets +{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& +/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} +if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ +{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get +StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ +{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ +length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ +put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M +currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d +/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N +/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix +astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get +length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d +/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS +{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 +copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for +& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ +4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 +add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for +/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 +Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName +length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length +string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ +putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 +$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? +{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName +get undefinefont}forall undefinefont}b +%%EndResource +end reinitialize +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Encoding256 5.0 0 +/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction +/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign +/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma +/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon +/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S +/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave +/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright +/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis +/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef +/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet +/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef +/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section +/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered +/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph +/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter +/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis +/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute +/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls +/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute +/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve +/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex +/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put +%%EndResource +end reinitialize + +%%IncludeResource: font Helvetica +F /F0 0 /256 T /Helvetica mF +/F0S1C F0 [28.75 0 0 -28.75 0 0 ] mFS +F0S1C Ji +735 1441 M (ExceptionTable)[19 13 15 16 16 8 7 16 16 19 16 16 7 0]xS +0.602 0 0.199 1 scol N 958 1456 M 711 1456 I 711 1499 I 958 1499 I C +K +N 958 1473 M 711 1473 I 711 1499 I 958 1499 I C +K +: N 1484 1418 275 93 rp C +1 1 0.801 1 scol L ; N 1759 1417 M 1483 1417 I 1483 1511 I 1759 1511 I C +K +0 0 0 1 scol 1505 1453 M (LineNumberTable)[16 7 16 16 21 16 25 16 16 10 19 16 16 7 0]xS +0.602 0 0.199 1 scol N 1759 1469 M 1483 1469 I 1483 1511 I 1759 1511 I C +K +N 1759 1485 M 1483 1485 I 1483 1511 I 1759 1511 I C +K +: N 1039 1411 318 253 rp C +1 1 0.801 1 scol L ; N 1357 1410 M 1038 1410 I 1038 1664 I 1357 1664 I C +K +0 0 0 1 scol 1163 1446 M (Code)[21 16 16 0]xS +0.602 0 0.199 1 scol N 1357 1462 M 1038 1462 I 1038 1664 I 1357 1664 I C +K +N 1357 1578 M 1038 1578 I 1038 1664 I 1357 1664 I C +K +0 0 0 1 scol 1083 1493 M (max_stack : int)[25 16 13 16 15 8 16 15 14 8 8 8 7 16 0]xS +1083 1527 M (max_locals : int)[25 16 13 16 7 16 15 16 7 15 8 8 8 7 16 0]xS +1083 1560 M (exception_handlers)[16 13 15 16 16 8 7 16 16 16 16 16 16 16 7 16 10 0]xS +1083 1626 M (getCode\(\))[16 16 8 21 16 16 16 10 0]xS +0.602 0 0.199 1 scol N 1420 1499 M 1358 1508 I K +N 1358 1508 M 1380 1516 I 1398 1502 I 1377 1494 I 1358 1508 I C +: 1 1 1 1 scol O ; K +N 1420 1499 M 1482 1487 I K +N 1462 1432 16 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 1462 1459 M (1)S +N 1462 1432 16 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 1462 1459 M (1)S +: N 1742 1576 291 93 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2033 1575 M 1741 1575 I 1741 1669 I 2033 1669 I C +K +0 0 0 1 scol 1762 1611 M (LocalVariableTable)[16 16 15 16 7 19 16 10 7 16 16 7 16 19 16 16 7 0]xS +0.602 0 0.199 1 scol N 2033 1626 M 1741 1626 I 1741 1669 I 2033 1669 I C +K +N 2033 1643 M 1741 1643 I 1741 1669 I 2033 1669 I C +K +N 1549 1580 M 1358 1556 I K +N 1358 1556 M 1380 1547 I 1398 1562 I 1377 1570 I 1358 1556 I C +: 1 1 1 1 scol O ; K +N 1549 1580 M 1740 1603 I K +: N 1709 1625 15 34 rp C +1 1 1 1 scol L ; N 1709 1625 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1709 1652 M (1)S +: N 1709 1625 15 34 rp C +1 1 1 1 scol L ; N 1709 1625 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1709 1652 M (1)S +: N 1573 1128 218 93 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1791 1127 M 1572 1127 I 1572 1221 I 1791 1221 I C +K +0 0 0 1 scol 1597 1163 M (InnerClasses)[7 16 16 16 10 21 7 16 15 15 16 0]xS +0.602 0 0.199 1 scol N 1791 1178 M 1572 1178 I 1572 1221 I 1791 1221 I C +K +N 1791 1195 M 1572 1195 I 1572 1221 I 1791 1221 I C +K +: N 1855 1128 186 93 rp C +1 1 0.801 1 scol L ; N 2041 1127 M 1854 1127 I 1854 1221 I 2041 1221 I C +K +0 0 0 1 scol 1878 1163 M (SourceFile)[19 16 16 10 15 16 18 7 7 0]xS +0.602 0 0.199 1 scol N 2041 1178 M 1854 1178 I 1854 1221 I 2041 1221 I C +K +N 2041 1195 M 1854 1195 I 1854 1221 I 2041 1221 I C +K +: N 450 1406 190 93 rp C +1 1 0.801 1 scol L ; N 640 1405 M 449 1405 I 449 1499 I 640 1499 I C +K +0 0 0 1 scol 470 1441 M (Deprecated)[21 16 16 10 16 15 16 8 16 0]xS +0.602 0 0.199 1 scol N 640 1456 M 449 1456 I 449 1499 I 640 1499 I C +K +N 640 1473 M 449 1473 I 449 1499 I 640 1499 I C +K +: N 2049 1418 161 93 rp C +1 1 0.801 1 scol L ; N 2210 1417 M 2048 1417 I 2048 1511 I 2210 1511 I C +K +0 0 0 1 scol 2069 1453 M (Unknown)[21 16 14 16 16 21 0]xS +0.602 0 0.199 1 scol N 2210 1469 M 2048 1469 I 2048 1511 I 2210 1511 I C +K +N 2210 1485 M 2048 1485 I 2048 1511 I 2210 1511 I C +K +: N 2105 1128 171 93 rp C +1 1 0.801 1 scol L ; N 2276 1127 M 2104 1127 I 2104 1221 I 2276 1221 I C +K +0 0 0 1 scol 2131 1163 M (Synthetic)[19 13 16 8 16 16 8 7 0]xS +0.602 0 0.199 1 scol N 2276 1178 M 2104 1178 I 2104 1221 I 2276 1221 I C +K +N 2276 1195 M 2104 1195 I 2104 1221 I 2276 1221 I C +K +: N 521 1128 240 93 rp C +1 1 0.801 1 scol L ; N 761 1127 M 520 1127 I 520 1221 I 761 1221 I C +K +0 0 0 1 scol 546 1163 M (ConstantValue)[21 16 16 15 8 16 16 8 19 16 7 16 0]xS +0.602 0 0.199 1 scol N 761 1177 M 520 1177 I 520 1221 I 761 1221 I C +K +N 761 1193 M 520 1193 I 520 1221 I 761 1221 I C +K +: N 491 628 204 125 rp C +1 1 0.801 1 scol L ; N 695 627 M 490 627 I 490 753 I 695 753 I C +K +0.496 0.496 0.496 1 scol 1 Lj 1 Lc 12 Lw solid N 495 748 M 691 748 I 691 632 I : 0.754 0.754 +S K +; 0 0 0 1 scol 513 663 M (ClassParser)[21 7 16 15 15 19 16 10 15 16 0]xS +0.602 0 0.199 1 scol 1 Lw solid N 695 676 M 490 676 I 490 753 I 695 753 I C +K +N 695 693 M 490 693 I 490 753 I 695 753 I C +K +0 0 0 1 scol 535 741 M (parse\(\))[16 16 10 15 16 10 0]xS +: N 1168 1116 157 93 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1325 1115 M 1167 1115 I 1167 1209 I 1325 1209 I C +K +0 0 0 1 scol 1192 1151 M (Attribute)[19 8 8 10 7 16 16 8 0]xS +0.602 0 0.199 1 scol N 1325 1164 M 1167 1164 I 1167 1209 I 1325 1209 I C +K +N 1325 1181 M 1167 1181 I 1167 1209 I 1325 1209 I C +K +N 1225 1279 M 1225 1210 I K +N 528 1279 M 2187 1279 I K +N 1225 1210 M 1242 1255 I 1209 1255 I C +: 1 1 1 1 scol O ; K +N 1190 1410 M 1190 1279 I K +N 1091 1329 276 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1091 1356 M (<>)[17 17 23 16 8 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 1602 1417 M 1602 1279 I K +N 1479 1381 251 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1479 1408 M (<>)[17 17 21 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 1941 1222 M 1941 1279 I K +N 1823 1234 255 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1823 1261 M (<>)[17 17 21 7 16 15 15 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 840 1405 M 840 1279 I K +N 728 1326 276 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 728 1353 M (<>)[17 17 23 16 8 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 2132 1417 M 2132 1279 I K +N 528 1405 M 528 1279 I K +N 416 1326 276 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 416 1353 M (<>)[17 17 23 16 8 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 1870 1575 M 1870 1279 I K +N 1748 1523 250 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1748 1550 M (<>)[17 17 21 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 1673 1222 M 1673 1279 I K +N 1541 1234 255 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1541 1261 M (<>)[17 17 21 7 16 15 15 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 2187 1222 M 2187 1279 I K +N 2068 1234 255 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 2068 1261 M (<>)[17 17 21 7 16 15 15 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 638 1222 M 638 1279 I K +N 536 1233 245 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 536 1260 M (<>)[17 17 18 7 16 7 16 8 16 8 8 10 7 16 16 8 16 17 0]xS +: N 1130 845 233 126 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1363 844 M 1129 844 I 1129 971 I 1363 971 I C +K +0 0 0 1 scol +%%IncludeResource: font Helvetica-Oblique +F /F1 0 /256 T /Helvetica-Oblique mF +/F1S1C F1 [28.75 0 0 -28.75 0 0 ] mFS +F1S1C Ji +1150 880 M (FieldOrMethod)[18 7 16 7 16 23 10 24 16 8 16 16 0]xS +0.602 0 0.199 1 scol N 1363 894 M 1129 894 I 1129 971 I 1363 971 I C +K +N 1363 911 M 1129 911 I 1129 971 I 1363 971 I C +K +0 0 0 1 scol 1174 960 M (getName\(\))[16 16 8 21 16 24 16 10 0]xS +: N 571 845 214 126 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 785 844 M 570 844 I 570 971 I 785 971 I C +K +0 0 0 1 scol 594 880 M (AccessFlags)[19 15 15 16 15 15 18 7 16 16 0]xS +0.602 0 0.199 1 scol N 785 894 M 570 894 I 570 971 I 785 971 I C +K +N 785 911 M 570 911 I 570 971 I 785 971 I C +K +0 0 0 1 scol 614 960 M (isPublic\(\))[7 15 19 16 16 7 7 15 10 0]xS +0.602 0 0.199 1 scol N 1128 908 M 786 908 I K +N 786 908 M 831 925 I 831 891 I C +: 1 1 1 1 scol O ; K +N 1237 1043 M 1237 972 I K +N 992 1043 M 1497 1043 I K +N 1237 972 M 1253 1017 I 1220 1017 I C +: 1 1 1 1 scol O ; K +: N 1494 1023 134 84 rp C +1 1 0.801 1 scol L ; N 1628 1022 M 1493 1022 I 1493 1107 I 1628 1107 I C +K +0 0 0 1 scol F0S1C Ji +1513 1058 M (Method)[23 16 8 16 16 0]xS +0.602 0 0.199 1 scol N 1628 1074 M 1493 1074 I 1493 1107 I 1628 1107 I C +K +N 1628 1090 M 1493 1090 I 1493 1107 I 1628 1107 I C +K +N 1409 1111 M 1492 1085 I K +N 1488 1110 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1488 1137 M (1)S +0.602 0 0.199 1 scol N 1492 1085 M 1476 1102 I 1454 1097 I 1470 1080 I 1492 1085 I C +: 1 1 1 1 scol O ; K +N 1409 1111 M 1326 1136 I K +N 1341 1157 11 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1341 1184 M (*)S +N 1488 1110 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1488 1137 M (1)S +N 1341 1157 11 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1341 1184 M (*)S +0.602 0 0.199 1 scol N 1497 1028 M 1497 1043 I K +: N 1734 802 235 139 rp C +1 1 0.801 1 scol L ; N 1969 801 M 1733 801 I 1733 941 I 1969 941 I C +K +0 0 0 1 scol 1764 837 M (ConstantPool)[21 16 16 15 8 16 16 8 19 16 16 0]xS +0.602 0 0.199 1 scol N 1969 853 M 1733 853 I 1733 941 I 1969 941 I C +K +N 1969 869 M 1733 869 I 1733 941 I 1969 941 I C +K +0 0 0 1 scol 1777 918 M (getConstant\(\))[16 16 8 21 16 16 15 8 16 16 8 10 0]xS +: N 1088 610 317 160 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1405 609 M 1087 609 I 1087 770 I 1405 770 I C +K +0 0 0 1 scol 1179 645 M (JavaClass)[15 16 13 16 21 7 16 15 0]xS +0.602 0 0.199 1 scol N 1405 659 M 1087 659 I 1087 770 I 1405 770 I C +K +N 1405 676 M 1087 676 I 1087 770 I 1405 770 I C +K +0 0 0 1 scol 1131 724 M (getInterfaceNames\(\))[16 16 8 7 16 8 16 10 8 16 15 16 21 16 25 16 15 10 0]xS +1131 757 M (getSuperclassName\(\))[16 16 8 19 16 16 16 10 15 7 16 15 15 21 16 25 16 10 0]xS +0.602 0 0.199 1 scol N 1419 896 M 1314 771 I K +N 1287 794 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1287 821 M (1)S +0.602 0 0.199 1 scol N 1314 771 M 1336 779 I 1340 802 I 1318 794 I 1314 771 I C +: 1 1 1 1 scol O ; K +N 1419 896 M 1524 1021 I K +N 1539 966 11 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 1539 993 M (*)S +N 1287 794 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1287 821 M (1)S +N 1539 966 11 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 1539 993 M (*)S +1 1 1 1 scol [ 72 24 ] 0 sd N 696 690 M 1086 690 I K +0 0 0 1 scol [ 72 24 ] 0 sd N 696 690 M 1086 690 I K +3 Lw solid N 1086 690 M 1059 701 I : 0.754 0.754 +S K +; N 1086 690 M 1059 679 I : 0.754 0.754 +S K +; N 847 641 164 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 847 668 M (<>)[17 17 15 10 16 16 8 16 15 17 0]xS +0.602 0 0.199 1 scol 1 Lw solid N 1569 786 M 1406 737 I K +N 1569 786 M 1732 835 I K +N 1086 751 M 786 866 I K +N 786 866 M 834 866 I 822 834 I C +: 1 1 1 1 scol O ; K +: N 865 1023 134 84 rp C +1 1 0.801 1 scol L ; N 999 1022 M 864 1022 I 864 1107 I 999 1107 I C +K +0 0 0 1 scol 899 1058 M (Field)[18 7 16 7 0]xS +0.602 0 0.199 1 scol N 999 1072 M 864 1072 I 864 1107 I 999 1107 I C +K +N 999 1089 M 864 1089 I 864 1107 I 999 1107 I C +K +N 1083 1111 M 1000 1086 I K +N 990 1111 16 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 990 1138 M (1)S +0.602 0 0.199 1 scol N 1000 1086 M 1023 1081 I 1039 1098 I 1017 1102 I 1000 1086 I C +: 1 1 1 1 scol O ; K +N 1083 1111 M 1166 1136 I K +N 1165 1079 11 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1165 1106 M (*)S +N 990 1111 16 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 990 1138 M (1)S +N 1165 1079 11 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1165 1106 M (*)S +0.602 0 0.199 1 scol N 992 1067 M 992 1043 I K +N 1072 896 M 1177 771 I K +N 1190 794 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1190 821 M (1)S +0.602 0 0.199 1 scol N 1177 771 M 1173 794 I 1150 802 I 1155 779 I 1177 771 I C +: 1 1 1 1 scol O ; K +N 1072 896 M 967 1021 I K +N 1004 1018 11 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 1004 1045 M (*)S +N 1190 794 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1190 821 M (1)S +N 1004 1018 11 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 1004 1045 M (*)S +LH +%%PageTrailer + +%%Trailer +%%DocumentNeededResources: +%%+ font Helvetica-Oblique +%%+ font Helvetica +%%DocumentSuppliedResources: +Pscript_WinNT_Incr dup /terminate get exec +%%EOF +grestore diff --git a/docs/eps/javaclass.fig b/docs/eps/javaclass.fig new file mode 100644 index 00000000..380a6537 --- /dev/null +++ b/docs/eps/javaclass.fig @@ -0,0 +1,353 @@ +#FIG 3.2 +Portrait +Center +Inches +A4 +100.00 +Single +-2 +1200 2 +0 32 #f9f9f9 +0 33 #303030 +0 34 #7e7e7e +6 1939 6082 2499 7310 +2 1 0 1 33 33 866 0 -1 4.000 0 0 0 0 0 5 + 1951 7310 1939 7186 2039 7114 2051 7234 1951 7310 +2 1 0 1 33 33 865 0 -1 4.000 0 0 0 0 0 2 + 2227 6698 2499 6082 +-6 +2 1 0 0 32 32 998 0 20 4.000 0 0 0 0 0 4 + 3983 8614 3983 7314 4475 7314 4475 8614 +2 1 0 1 33 33 997 0 -1 4.000 0 0 0 0 0 5 + 3979 8618 3979 7310 4479 7310 4479 8618 3979 8618 +2 1 0 1 33 33 995 0 -1 4.000 0 0 0 0 0 5 + 4243 8618 4243 7310 4479 7310 4479 8618 4243 8618 +2 1 0 1 33 33 994 0 -1 4.000 0 0 0 0 0 5 + 4335 8618 4335 7310 4479 7310 4479 8618 4335 8618 +2 1 0 0 32 32 993 0 20 4.000 0 0 0 0 0 4 + 4047 4530 4047 3078 4539 3078 4539 4530 +2 1 0 1 33 33 992 0 -1 4.000 0 0 0 0 0 5 + 4043 4534 4043 3074 4543 3074 4543 4534 4043 4534 +2 1 0 1 33 33 990 0 -1 4.000 0 0 0 0 0 5 + 4307 4534 4307 3074 4543 3074 4543 4534 4307 4534 +2 1 0 1 33 33 989 0 -1 4.000 0 0 0 0 0 5 + 4399 4534 4399 3074 4543 3074 4543 4534 4399 4534 +2 1 0 0 32 32 988 0 20 4.000 0 0 0 0 0 4 + 4011 6882 4011 5206 5343 5206 5343 6882 +2 1 0 1 33 33 987 0 -1 4.000 0 0 0 0 0 5 + 4007 6886 4007 5202 5347 5202 5347 6886 4007 6886 +2 1 0 1 33 33 985 0 -1 4.000 0 0 0 0 0 5 + 4271 6886 4271 5202 5347 5202 5347 6886 4271 6886 +2 1 0 1 33 33 984 0 -1 4.000 0 0 0 0 0 5 + 4927 6886 4927 5202 5347 5202 5347 6886 4927 6886 +2 1 0 1 33 33 979 0 -1 4.000 0 0 0 0 0 2 + 4475 4870 4523 5198 +2 1 0 0 7 7 978 0 20 4.000 0 0 0 0 0 5 + 4523 5198 4567 5082 4491 4986 4447 5098 4523 5198 +2 1 0 1 33 33 977 0 -1 4.000 0 0 0 0 0 5 + 4523 5198 4567 5082 4491 4986 4447 5098 4523 5198 +2 1 0 1 33 33 976 0 -1 4.000 0 0 0 0 0 2 + 4475 4870 4411 4538 +2 1 0 0 7 7 975 0 20 4.000 0 0 0 0 0 4 + 4119 4650 4119 4558 4307 4558 4307 4650 +2 1 0 0 7 7 973 0 20 4.000 0 0 0 0 0 4 + 4119 4650 4119 4558 4307 4558 4307 4650 +2 1 0 0 32 32 971 0 20 4.000 0 0 0 0 0 4 + 4879 3166 4879 1626 5371 1626 5371 3166 +2 1 0 1 33 33 970 0 -1 4.000 0 0 0 0 0 5 + 4875 3170 4875 1622 5375 1622 5375 3170 4875 3170 +2 1 0 1 33 33 968 0 -1 4.000 0 0 0 0 0 5 + 5139 3170 5139 1622 5375 1622 5375 3170 5139 3170 +2 1 0 1 33 33 967 0 -1 4.000 0 0 0 0 0 5 + 5231 3170 5231 1622 5375 1622 5375 3170 5231 3170 +2 1 0 1 33 33 966 0 -1 4.000 0 0 0 0 0 2 + 4903 4186 4779 5198 +2 1 0 0 7 7 965 0 20 4.000 0 0 0 0 0 5 + 4779 5198 4731 5082 4807 4982 4851 5098 4779 5198 +2 1 0 1 33 33 964 0 -1 4.000 0 0 0 0 0 5 + 4779 5198 4731 5082 4807 4982 4851 5098 4779 5198 +2 1 0 1 33 33 963 0 -1 4.000 0 0 0 0 0 2 + 4903 4186 5027 3174 +2 1 0 0 7 7 962 0 20 4.000 0 0 0 0 0 4 + 5139 3346 5139 3254 5327 3254 5327 3346 +2 1 0 0 7 7 960 0 20 4.000 0 0 0 0 0 4 + 5139 3346 5139 3254 5327 3254 5327 3346 +2 1 0 0 32 32 958 0 20 4.000 0 0 0 0 0 4 + 2511 4058 2511 2910 3003 2910 3003 4058 +2 1 0 1 33 33 957 0 -1 4.000 0 0 0 0 0 5 + 2507 4062 2507 2906 3007 2906 3007 4062 2507 4062 +2 1 0 1 33 33 955 0 -1 4.000 0 0 0 0 0 5 + 2771 4062 2771 2906 3007 2906 3007 4062 2771 4062 +2 1 0 1 33 33 954 0 -1 4.000 0 0 0 0 0 5 + 2863 4062 2863 2906 3007 2906 3007 4062 2863 4062 +2 1 0 0 32 32 953 0 20 4.000 0 0 0 0 0 4 + 2511 2566 2511 1586 3003 1586 3003 2566 +2 1 0 1 33 33 952 0 -1 4.000 0 0 0 0 0 5 + 2507 2570 2507 1582 3007 1582 3007 2570 2507 2570 +2 1 0 1 33 33 950 0 -1 4.000 0 0 0 0 0 5 + 2751 2570 2751 1582 3007 1582 3007 2570 2751 2570 +2 1 0 1 33 33 949 0 -1 4.000 0 0 0 0 0 5 + 2843 2570 2843 1582 3007 1582 3007 2570 2843 2570 +2 1 0 0 32 32 948 0 20 4.000 0 0 0 0 0 4 + 3983 10002 3983 8998 4475 8998 4475 10002 +2 1 0 1 33 33 947 0 -1 4.000 0 0 0 0 0 5 + 3979 10006 3979 8994 4479 8994 4479 10006 3979 10006 +2 1 0 1 33 33 945 0 -1 4.000 0 0 0 0 0 5 + 4243 10006 4243 8994 4479 8994 4479 10006 4243 10006 +2 1 0 1 33 33 944 0 -1 4.000 0 0 0 0 0 5 + 4335 10006 4335 8994 4479 8994 4479 10006 4335 10006 +2 1 0 0 32 32 943 0 20 4.000 0 0 0 0 0 4 + 4047 1542 4047 690 4539 690 4539 1542 +2 1 0 1 33 33 942 0 -1 4.000 0 0 0 0 0 5 + 4043 1546 4043 686 4543 686 4543 1546 4043 1546 +2 1 0 1 33 33 940 0 -1 4.000 0 0 0 0 0 5 + 4287 1546 4287 686 4543 686 4543 1546 4287 1546 +2 1 0 1 33 33 939 0 -1 4.000 0 0 0 0 0 5 + 4379 1546 4379 686 4543 686 4543 1546 4379 1546 +2 1 0 0 32 32 938 0 20 4.000 0 0 0 0 0 4 + 2511 1246 2511 346 3003 346 3003 1246 +2 1 0 1 33 33 937 0 -1 4.000 0 0 0 0 0 5 + 2507 1250 2507 342 3007 342 3007 1250 2507 1250 +2 1 0 1 33 33 935 0 -1 4.000 0 0 0 0 0 5 + 2751 1250 2751 342 3007 342 3007 1250 2751 1250 +2 1 0 1 33 33 934 0 -1 4.000 0 0 0 0 0 5 + 2843 1250 2843 342 3007 342 3007 1250 2843 1250 +2 1 0 0 32 32 933 0 20 4.000 0 0 0 0 0 4 + 2511 9622 2511 8354 3003 8354 3003 9622 +2 1 0 1 33 33 932 0 -1 4.000 0 0 0 0 0 5 + 2507 9626 2507 8350 3007 8350 3007 9626 2507 9626 +2 1 0 1 33 33 930 0 -1 4.000 0 0 0 0 0 5 + 2771 9626 2771 8350 3007 8350 3007 9626 2771 9626 +2 1 0 1 33 33 929 0 -1 4.000 0 0 0 0 0 5 + 2863 9626 2863 8350 3007 8350 3007 9626 2863 9626 +2 1 0 0 32 32 928 0 20 4.000 0 0 0 0 0 4 + 315 9526 315 8450 975 8450 975 9526 +2 1 0 1 33 33 927 0 -1 4.000 0 0 0 0 0 5 + 311 9530 311 8446 979 8446 979 9530 311 9530 +2 1 0 2 34 34 926 0 -1 4.000 0 0 0 0 0 3 + 955 9502 955 8470 339 8470 +2 1 0 1 33 33 924 0 -1 4.000 0 0 0 0 0 5 + 575 9530 575 8446 979 8446 979 9530 575 9530 +2 1 0 1 33 33 923 0 -1 4.000 0 0 0 0 0 5 + 667 9530 667 8446 979 8446 979 9530 667 9530 +2 1 0 0 32 32 921 0 20 4.000 0 0 0 0 0 4 + 2447 6074 2447 5246 2939 5246 2939 6074 +2 1 0 1 33 33 920 0 -1 4.000 0 0 0 0 0 5 + 2443 6078 2443 5242 2943 5242 2943 6078 2443 6078 +2 1 0 1 33 33 918 0 -1 4.000 0 0 0 0 0 5 + 2707 6078 2707 5242 2943 5242 2943 6078 2707 6078 +2 1 0 1 33 33 917 0 -1 4.000 0 0 0 0 0 5 + 2799 6078 2799 5242 2943 5242 2943 6078 2799 6078 +2 1 0 1 33 33 916 0 -1 4.000 0 0 0 0 0 2 + 3311 5658 2947 5658 +2 1 0 1 33 33 915 0 -1 4.000 0 0 0 0 0 2 + 3311 9586 3311 810 +2 1 0 0 7 7 914 0 20 4.000 0 0 0 0 0 4 + 2947 5658 3187 5570 3187 5746 2947 5658 +2 1 0 1 33 33 913 0 -1 4.000 0 0 0 0 0 4 + 2947 5658 3187 5570 3187 5746 2947 5658 +2 1 0 1 33 33 912 0 -1 4.000 0 0 0 0 0 2 + 4007 6086 3311 6086 +2 1 0 0 7 7 911 0 20 4.000 0 0 0 0 0 4 + 3563 6658 3563 5098 3751 5098 3751 6658 +2 1 0 1 33 33 909 0 -1 4.000 0 0 0 0 0 2 + 4043 3906 3311 3906 +2 1 0 0 7 7 908 0 20 4.000 0 0 0 0 0 4 + 3847 4598 3847 3186 4035 3186 4035 4598 +2 1 0 1 33 33 906 0 -1 4.000 0 0 0 0 0 2 + 3011 2114 3311 2114 +2 1 0 0 7 7 905 0 20 4.000 0 0 0 0 0 4 + 3067 2774 3067 1346 3255 1346 3255 2774 +2 1 0 1 33 33 903 0 -1 4.000 0 0 0 0 0 2 + 3979 7934 3311 7934 +2 1 0 0 7 7 902 0 20 4.000 0 0 0 0 0 4 + 3555 8578 3555 7018 3743 7018 3743 8578 +2 1 0 1 33 33 900 0 -1 4.000 0 0 0 0 0 2 + 4043 1102 3311 1102 +2 1 0 1 33 33 899 0 -1 4.000 0 0 0 0 0 2 + 3979 9586 3311 9586 +2 1 0 0 7 7 898 0 20 4.000 0 0 0 0 0 4 + 3555 10230 3555 8670 3743 8670 3743 10230 +2 1 0 0 32 32 896 0 20 4.000 0 0 0 0 0 4 + 1203 4066 1203 2518 2135 2518 2135 4066 +2 1 0 1 33 33 895 0 -1 4.000 0 0 0 0 0 5 + 1199 4070 1199 2514 2139 2514 2139 4070 1199 4070 +2 1 0 1 33 33 893 0 -1 4.000 0 0 0 0 0 5 + 1463 4070 1463 2514 2139 2514 2139 4070 1463 4070 +2 1 0 1 33 33 892 0 -1 4.000 0 0 0 0 0 5 + 1931 4070 1931 2514 2139 2514 2139 4070 1931 4070 +2 1 0 1 33 33 889 0 -1 4.000 0 0 0 0 0 2 + 2259 4658 2003 4074 +2 1 0 0 7 7 888 0 20 4.000 0 0 0 0 0 4 + 2135 4090 2135 3998 2323 3998 2323 4090 +2 1 0 0 7 7 886 0 20 4.000 0 0 0 0 0 5 + 2003 4074 2103 4150 2091 4270 1991 4198 2003 4074 +2 1 0 1 33 33 885 0 -1 4.000 0 0 0 0 0 5 + 2003 4074 2103 4150 2091 4270 1991 4198 2003 4074 +2 1 0 1 33 33 884 0 -1 4.000 0 0 0 0 0 2 + 2259 4658 2503 5238 +2 1 0 0 7 7 883 0 20 4.000 0 0 0 0 0 4 + 2583 5122 2583 5058 2771 5058 2771 5122 +2 1 0 0 7 7 881 0 20 4.000 0 0 0 0 0 4 + 2135 4090 2135 3998 2323 3998 2323 4090 +2 1 0 0 7 7 879 0 20 4.000 0 0 0 0 0 4 + 2583 5122 2583 5058 2771 5058 2771 5122 +2 1 0 0 32 32 877 0 20 4.000 0 0 0 0 0 4 + 1139 8866 1139 7318 2071 7318 2071 8866 +2 1 0 1 33 33 876 0 -1 4.000 0 0 0 0 0 5 + 1135 8870 1135 7314 2075 7314 2075 8870 1135 8870 +2 1 0 1 33 33 874 0 -1 4.000 0 0 0 0 0 5 + 1399 8870 1399 7314 2075 7314 2075 8870 1399 8870 +2 1 0 1 33 33 873 0 -1 4.000 0 0 0 0 0 5 + 1867 8870 1867 7314 2075 7314 2075 8870 1867 8870 +2 1 0 1 33 33 870 0 -1 4.000 0 0 0 0 0 2 + 2227 6698 1951 7310 +2 1 0 0 7 7 869 0 20 4.000 0 0 0 0 0 4 + 2083 7378 2083 7286 2271 7286 2271 7378 +2 1 0 0 7 7 867 0 20 4.000 0 0 0 0 0 5 + 1951 7310 1939 7186 2039 7114 2051 7234 1951 7310 +2 1 0 0 7 7 864 0 20 4.000 0 0 0 0 0 4 + 2187 6090 2187 6026 2375 6026 2375 6090 +2 1 0 0 7 7 862 0 20 4.000 0 0 0 0 0 4 + 2083 7378 2083 7286 2271 7286 2271 7378 +2 1 0 0 7 7 860 0 20 4.000 0 0 0 0 0 4 + 2187 6090 2187 6026 2375 6026 2375 6090 +2 1 0 0 32 32 858 0 20 4.000 0 0 0 0 0 4 + 79 6578 79 4742 1211 4742 1211 6578 +2 1 0 1 33 33 857 0 -1 4.000 0 0 0 0 0 5 + 75 6582 75 4738 1215 4738 1215 6582 75 6582 +2 1 0 1 33 33 855 0 -1 4.000 0 0 0 0 0 5 + 339 6582 339 4738 1215 4738 1215 6582 339 6582 +2 1 0 1 33 33 854 0 -1 4.000 0 0 0 0 0 5 + 619 6582 619 4738 1215 4738 1215 6582 619 6582 +2 1 0 1 33 33 850 0 -1 4.000 0 0 0 0 0 2 + 1187 4406 1043 4734 +2 1 0 0 7 7 849 0 20 4.000 0 0 0 0 0 4 + 1163 4826 1163 4734 1351 4734 1351 4826 +2 1 0 0 7 7 847 0 20 4.000 0 0 0 0 0 5 + 1043 4734 1031 4610 1131 4538 1143 4658 1043 4734 +2 1 0 1 33 33 846 0 -1 4.000 0 0 0 0 0 5 + 1043 4734 1031 4610 1131 4538 1143 4658 1043 4734 +2 1 0 1 33 33 845 0 -1 4.000 0 0 0 0 0 2 + 1187 4406 1331 4074 +2 1 0 0 7 7 844 0 20 4.000 0 0 0 0 0 4 + 1027 4062 1027 3998 1215 3998 1215 4062 +2 1 0 0 7 7 842 0 20 4.000 0 0 0 0 0 4 + 1163 4826 1163 4734 1351 4734 1351 4826 +2 1 0 0 7 7 840 0 20 4.000 0 0 0 0 0 4 + 1027 4062 1027 3998 1215 3998 1215 4062 +2 1 0 1 33 33 838 0 -1 4.000 0 0 0 0 0 2 + 1151 6950 1003 6586 +2 1 0 0 7 7 837 0 20 4.000 0 0 0 0 0 4 + 1127 6590 1127 6498 1315 6498 1315 6590 +2 1 0 0 7 7 835 0 20 4.000 0 0 0 0 0 5 + 1003 6586 1099 6662 1083 6786 987 6710 1003 6586 +2 1 0 1 33 33 834 0 -1 4.000 0 0 0 0 0 5 + 1003 6586 1099 6662 1083 6786 987 6710 1003 6586 +2 1 0 1 33 33 833 0 -1 4.000 0 0 0 0 0 2 + 1151 6950 1291 7310 +2 1 0 0 7 7 832 0 20 4.000 0 0 0 0 0 4 + 1383 7222 1383 7158 1571 7158 1571 7222 +2 1 0 0 7 7 830 0 20 4.000 0 0 0 0 0 4 + 1127 6590 1127 6498 1315 6498 1315 6590 +2 1 0 0 7 7 828 0 20 4.000 0 0 0 0 0 4 + 1383 7222 1383 7158 1571 7158 1571 7222 +2 1 1 1 7 7 826 0 -1 4.000 0 0 0 0 0 2 + 647 8442 647 6586 +2 1 1 1 0 0 825 0 -1 4.000 0 0 0 0 0 2 + 647 8442 647 6586 +2 1 0 1 0 0 824 0 -1 4.000 0 0 0 0 0 2 + 647 6586 707 6730 +2 1 0 1 0 0 823 0 -1 4.000 0 0 0 0 0 2 + 647 6586 587 6730 +2 1 0 0 7 7 822 0 20 4.000 0 0 0 0 0 4 + 379 7974 379 7050 567 7050 567 7974 +2 1 0 0 32 32 820 0 20 4.000 0 0 0 0 0 4 + 279 1994 279 750 1011 750 1011 1994 +2 1 0 1 33 33 819 0 -1 4.000 0 0 0 0 0 5 + 275 1998 275 746 1015 746 1015 1998 275 1998 +2 1 0 1 33 33 817 0 -1 4.000 0 0 0 0 0 5 + 519 1998 519 746 1015 746 1015 1998 519 1998 +2 1 0 1 33 33 816 0 -1 4.000 0 0 0 0 0 5 + 611 1998 611 746 1015 746 1015 1998 611 1998 +2 1 0 1 33 33 814 0 -1 4.000 0 0 0 0 0 2 + 647 3370 647 4734 +2 1 0 1 33 33 813 0 -1 4.000 0 0 0 0 0 2 + 647 3370 647 2002 +2 1 0 1 33 33 812 0 -1 4.000 0 0 0 0 0 2 + 4875 2490 3311 2490 +2 1 0 1 33 33 809 0 -1 4.000 0 0 0 0 0 2 + 3011 3530 3311 3530 +2 1 0 0 7 7 808 0 20 4.000 0 0 0 0 0 4 + 3067 4266 3067 2838 3255 2838 3255 4266 +2 1 0 1 33 33 806 0 -1 4.000 0 0 0 0 0 2 + 3011 810 3311 810 +2 1 0 0 7 7 805 0 20 4.000 0 0 0 0 0 4 + 3067 1482 3067 54 3255 54 3255 1482 +2 1 0 1 33 33 803 0 -1 4.000 0 0 0 0 0 2 + 3011 9002 3311 9002 +2 1 0 0 7 7 802 0 20 4.000 0 0 0 0 0 4 + 3063 9578 3063 8206 3251 8206 3251 9578 +2 1 0 1 0 0 866 0 -1 0.000 0 0 0 0 0 5 + 1224 5762 1331 5699 1439 5760 1335 5821 1224 5762 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 2 + 1451 5759 2426 5759 +4 0 0 996 -1 16 10 1.5708 4 150 1080 4179 8526 ExceptionTable\001 +4 0 0 991 -1 16 10 1.5708 4 120 1230 4243 4466 LineNumberTable\001 +4 0 0 986 -1 16 10 1.5708 4 120 375 4207 6242 Code\001 +4 0 0 983 -1 16 10 1.5708 4 150 1035 4447 6650 max_stack : int\001 +4 0 0 982 -1 16 10 1.5708 4 150 1065 4635 6650 max_locals : int\001 +4 0 0 981 -1 16 10 1.5708 4 150 1365 4823 6650 exception_handlers\001 +4 0 0 980 -1 16 10 1.5708 4 150 690 5199 6650 getCode()\001 +4 0 0 974 -1 16 10 1.5708 4 105 90 4271 4650 1\001 +4 0 0 972 -1 16 10 1.5708 4 105 90 4271 4650 1\001 +4 0 0 969 -1 16 10 1.5708 4 120 1335 5075 3106 LocalVariableTable\001 +4 0 0 961 -1 16 10 1.5708 4 105 90 5291 3346 1\001 +4 0 0 959 -1 16 10 1.5708 4 105 90 5291 3346 1\001 +4 0 0 956 -1 16 10 1.5708 4 120 900 2707 3962 InnerClasses\001 +4 0 0 951 -1 16 10 1.5708 4 120 735 2707 2470 SourceFile\001 +4 0 0 946 -1 16 10 1.5708 4 150 810 4179 9926 Deprecated\001 +4 0 0 941 -1 16 10 1.5708 4 120 645 4243 1458 Unknown\001 +4 0 0 936 -1 16 10 1.5708 4 150 645 2707 1126 Synthetic\001 +4 0 0 931 -1 16 10 1.5708 4 120 1035 2707 9526 ConstantValue\001 +4 0 0 925 -1 16 10 1.5708 4 120 825 511 9434 ClassParser\001 +4 0 0 919 -1 16 10 1.5708 4 120 585 2643 5962 Attribute\001 +4 0 0 910 -1 16 10 1.5708 4 120 1500 3715 6658 <>\001 +4 0 0 904 -1 16 10 1.5708 4 120 1350 3219 2774 <>\001 +4 0 0 901 -1 16 10 1.5708 4 120 1500 3707 8578 <>\001 +4 0 0 897 -1 16 10 1.5708 4 120 1500 3707 10230 <>\001 +4 0 0 894 -1 16 10 1.5708 4 120 525 1399 3562 Method\001 +4 0 0 891 -1 16 10 1.5708 4 150 1200 1639 3834 access_flags : int\001 +4 0 0 890 -1 16 10 1.5708 4 150 1185 1827 3834 signature : String\001 +4 0 0 887 -1 16 10 1.5708 4 105 90 2287 4090 1\001 +4 0 0 882 -1 16 10 1.5708 4 60 60 2735 5122 *\001 +4 0 0 880 -1 16 10 1.5708 4 105 90 2287 4090 1\001 +4 0 0 878 -1 16 10 1.5708 4 60 60 2735 5122 *\001 +4 0 0 875 -1 16 10 1.5708 4 120 330 1335 8270 Field\001 +4 0 0 872 -1 16 10 1.5708 4 150 1200 1575 8634 access_flags : int\001 +4 0 0 871 -1 16 10 1.5708 4 150 1185 1763 8634 signature : String\001 +4 0 0 868 -1 16 10 1.5708 4 105 90 2235 7378 1\001 +4 0 0 863 -1 16 10 1.5708 4 60 60 2339 6090 *\001 +4 0 0 861 -1 16 10 1.5708 4 105 90 2235 7378 1\001 +4 0 0 859 -1 16 10 1.5708 4 60 60 2339 6090 *\001 +4 0 0 856 -1 16 10 1.5708 4 120 705 275 6038 JavaClass\001 +4 0 0 853 -1 16 10 1.5708 4 150 1200 515 6346 access_flags : int\001 +4 0 0 852 -1 16 10 1.5708 4 150 1410 891 6346 getInterfaceNames()\001 +4 0 0 851 -1 16 10 1.5708 4 150 1485 1079 6346 getSuperclassName()\001 +4 0 0 848 -1 16 10 1.5708 4 105 90 1315 4826 1\001 +4 0 0 843 -1 16 10 1.5708 4 60 60 1179 4062 *\001 +4 0 0 841 -1 16 10 1.5708 4 105 90 1315 4826 1\001 +4 0 0 839 -1 16 10 1.5708 4 60 60 1179 4062 *\001 +4 0 0 836 -1 16 10 1.5708 4 105 90 1279 6590 1\001 +4 0 0 831 -1 16 10 1.5708 4 60 60 1535 7222 *\001 +4 0 0 829 -1 16 10 1.5708 4 105 90 1279 6590 1\001 +4 0 0 827 -1 16 10 1.5708 4 60 60 1535 7222 *\001 +4 0 0 821 -1 16 10 1.5708 4 90 870 531 7974 <>\001 +4 0 0 818 -1 16 10 1.5708 4 120 945 475 1866 ConstantPool\001 +4 0 0 815 -1 16 10 1.5708 4 135 945 883 1762 getConstant()\001 +4 0 0 807 -1 16 10 1.5708 4 120 1350 3219 4266 <>\001 +4 0 0 804 -1 16 10 1.5708 4 120 1350 3219 1482 <>\001 +4 0 0 801 -1 16 10 1.5708 4 120 1305 3215 9578 <>\001 +4 0 0 922 -1 16 10 1.5708 4 135 480 864 9294 parse()\001 +4 0 0 907 -1 16 10 1.5708 4 120 1350 3924 4583 <>\001 +4 0 0 810 -1 16 10 1.5708 4 120 1350 4725 3075 <>\001 diff --git a/docs/eps/jvm.eps b/docs/eps/jvm.eps new file mode 100644 index 00000000..c85c7617 --- /dev/null +++ b/docs/eps/jvm.eps @@ -0,0 +1,218 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: jvm.eps +%%Creator: fig2dev Version 3.2 Patchlevel 1 +%%CreationDate: Thu Nov 19 11:55:18 1998 +%%For: dahm@che (Markus Dahm,,,,,) +%%Orientation: Portrait +%%BoundingBox: 0 0 439 199 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +-17.0 217.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n -1000 4612 m -1000 -1000 l 8588 -1000 l 8588 4612 l cp clip + 0.06000 0.06000 sc +/Courier ff 285.00 scf sf +6600 1575 m +gs 1 -1 sc (java) col0 sh gr +/Courier ff 285.00 scf sf +2550 1575 m +gs 1 -1 sc (javac) col0 sh gr +/Courier-Bold ff 150.00 scf sf +4290 1155 m +gs 1 -1 sc (08 1a 42 ...) col0 sh gr +/Courier-Bold ff 150.00 scf sf +4290 990 m +gs 1 -1 sc (ca fe ba be) col0 sh gr +% Polyline +7.500 slw +n 6405 1200 m 6300 1200 6300 1695 105 arcto 4 {pop} repeat + 6300 1800 7395 1800 105 arcto 4 {pop} repeat + 7500 1800 7500 1305 105 arcto 4 {pop} repeat + 7500 1200 6405 1200 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +n 2505 1200 m 2400 1200 2400 1695 105 arcto 4 {pop} repeat + 2400 1800 3495 1800 105 arcto 4 {pop} repeat + 3600 1800 3600 1305 105 arcto 4 {pop} repeat + 3600 1200 2505 1200 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +30.000 slw +gs clippath +2280 1470 m 2400 1500 l 2280 1530 l 2445 1530 l 2445 1470 l cp +clip +n 1800 1500 m 2400 1500 l gs col0 s gr gr + +% arrowhead +7.500 slw +n 2280 1470 m 2400 1500 l 2280 1530 l 2280 1500 l 2280 1470 l cp gs 0.00 setgray ef gr col0 s +% Polyline +30.000 slw +gs clippath +4080 1470 m 4200 1500 l 4080 1530 l 4245 1530 l 4245 1470 l cp +clip +n 3600 1500 m 4200 1500 l gs col0 s gr gr + +% arrowhead +7.500 slw +n 4080 1470 m 4200 1500 l 4080 1530 l 4080 1500 l 4080 1470 l cp gs 0.00 setgray ef gr col0 s +% Polyline +30.000 slw +gs clippath +6180 1470 m 6300 1500 l 6180 1530 l 6345 1530 l 6345 1470 l cp +clip +n 5700 1500 m 6300 1500 l gs col0 s gr gr + +% arrowhead +7.500 slw +n 6180 1470 m 6300 1500 l 6180 1530 l 6180 1500 l 6180 1470 l cp gs 0.00 setgray ef gr col0 s +% Polyline +30.000 slw +n 5415 615 m 5415 915 l 5715 915 l gs col0 s gr +% Polyline +n 4215 615 m 4215 2415 l 5715 2415 l 5715 915 l 5415 615 l 4215 615 l cp gs col0 s gr +% Polyline +gs clippath +7006 1136 m 6900 1200 l 6964 1094 l 6847 1211 l 6889 1253 l cp +clip +n 7500 600 m 6900 1200 l gs col0 s gr gr + +% arrowhead +7.500 slw +n 7006 1136 m 6900 1200 l 6964 1094 l 6985 1115 l 7006 1136 l cp gs 0.00 setgray ef gr col0 s +% Polyline +30.000 slw +gs clippath +6630 1080 m 6600 1200 l 6570 1080 l 6570 1245 l 6630 1245 l cp +clip +n 6600 1200 m 6600 600 l gs col0 s gr gr + +% arrowhead +7.500 slw +n 6630 1080 m 6600 1200 l 6570 1080 l 6600 1080 l 6630 1080 l cp gs 0.00 setgray ef gr col0 s +% Polyline +n 300 3000 m 3600 3000 l 3600 3600 l 300 3600 l cp gs 0.90 setgray ef gr gs col0 s gr +% Polyline +n 4200 3000 m 7500 3000 l 7500 3600 l 4200 3600 l cp gs 0.90 setgray ef gr gs col0 s gr +% Polyline +n 1500 600 m 1500 900 l 1800 900 l gs col0 s gr +% Polyline +n 300 600 m 300 2400 l 1800 2400 l 1800 900 l 1500 600 l 300 600 l cp gs col0 s gr +/Helvetica ff 180.00 scf sf +6450 450 m +gs 1 -1 sc (Other classes) col0 sh gr +/Courier ff 150.00 scf sf +375 975 m +gs 1 -1 sc (public class) col0 sh gr +/Courier ff 150.00 scf sf +375 1140 m +gs 1 -1 sc (HelloWorld {) col0 sh gr +/Courier ff 150.00 scf sf +375 1305 m +gs 1 -1 sc ( ...) col0 sh gr +/Courier ff 150.00 scf sf +375 1635 m +gs 1 -1 sc ( void hello\(\) {) col0 sh gr +/Courier ff 150.00 scf sf +375 1800 m +gs 1 -1 sc ( ...) col0 sh gr +/Courier ff 150.00 scf sf +375 1965 m +gs 1 -1 sc ( }) col0 sh gr +/Courier ff 150.00 scf sf +375 2130 m +gs 1 -1 sc (}) col0 sh gr +/Helvetica ff 180.00 scf sf +4275 2625 m +gs 1 -1 sc (HelloWorld.class) col0 sh gr +/Helvetica-Bold ff 300.00 scf sf +900 3375 m +gs 1 -1 sc (Java language) col0 sh gr +/Helvetica-Bold ff 300.00 scf sf +4350 3375 m +gs 1 -1 sc (Java Virtual Machine) col0 sh gr +/Helvetica ff 180.00 scf sf +375 2625 m +gs 1 -1 sc (HelloWorld.java) col-1 sh gr +$F2psEnd +rs diff --git a/docs/eps/jvm.fig b/docs/eps/jvm.fig new file mode 100644 index 00000000..b8688c64 --- /dev/null +++ b/docs/eps/jvm.fig @@ -0,0 +1,62 @@ +#FIG 3.2 +Portrait +Center +Inches +A4 +100.00 +Single +-2 +1200 2 +6 2400 1200 3600 1800 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 3600 1800 3600 1200 2400 1200 2400 1800 3600 1800 +4 0 0 836 -1 12 19 0.0000 4 225 825 2550 1575 javac\001 +-6 +6 4215 840 5415 1290 +4 0 0 100 0 14 10 0.0000 4 105 1080 4290 1155 08 1a 42 ...\001 +4 0 0 100 0 14 10 0.0000 4 105 990 4290 990 ca fe ba be\001 +-6 +6 6300 1200 7500 1800 +2 4 0 1 0 7 100 0 -1 0.000 0 0 7 0 0 5 + 7500 1800 7500 1200 6300 1200 6300 1800 7500 1800 +4 0 0 837 -1 12 19 0.0000 4 225 660 6600 1575 java\001 +-6 +2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1800 1500 2400 1500 +2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 3600 1500 4200 1500 +2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 5700 1500 6300 1500 +2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 0 0 3 + 5415 615 5415 915 5715 915 +2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 0 0 6 + 4215 615 4215 2415 5715 2415 5715 915 5415 615 4215 615 +2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7500 600 6900 1200 +2 1 0 3 0 7 100 0 -1 0.000 0 0 -1 0 1 2 + 1 1 1.00 60.00 120.00 + 6600 1200 6600 600 +2 2 0 1 0 0 100 0 2 0.000 0 0 -1 0 0 5 + 300 3000 3600 3000 3600 3600 300 3600 300 3000 +2 2 0 1 0 0 100 0 2 0.000 0 0 -1 0 0 5 + 4200 3000 7500 3000 7500 3600 4200 3600 4200 3000 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 3 + 1500 600 1500 900 1800 900 +2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 0 0 6 + 300 600 300 2400 1800 2400 1800 900 1500 600 300 600 +4 0 0 100 0 16 12 0.0000 4 135 1110 6450 450 Other classes\001 +4 0 0 100 0 5 10 0.0000 0 135 1080 375 975 public class\001 +4 0 0 100 0 5 10 0.0000 0 135 1080 375 1140 HelloWorld {\001 +4 0 0 100 0 5 10 0.0000 0 15 450 375 1305 ...\001 +4 0 0 100 0 5 10 0.0000 0 135 1440 375 1635 void hello() {\001 +4 0 0 100 0 5 10 0.0000 0 15 630 375 1800 ...\001 +4 0 0 100 0 5 10 0.0000 0 135 270 375 1965 }\001 +4 0 0 100 0 5 10 0.0000 0 135 90 375 2130 }\001 +4 0 -1 0 0 16 12 0.0000 4 180 1305 375 2625 HelloWorld.java\001 +4 0 0 100 0 16 12 0.0000 4 135 1380 4275 2625 HelloWorld.class\001 +4 0 0 100 0 18 20 0.0000 4 285 2055 900 3375 Java language\001 +4 0 0 100 0 18 20 0.0000 4 255 2985 4350 3375 Java Virtual Machine\001 diff --git a/docs/generic.mdl b/docs/generic.mdl new file mode 100644 index 00000000..24dbc853 --- /dev/null +++ b/docs/generic.mdl @@ -0,0 +1,2860 @@ + +(object Petal + version 42 + _written "Rose 4.5.8054a" + charSet 0) + +(object Design "Logical View" + is_unit TRUE + is_loaded TRUE + defaults (object defaults + rightMargin 0.000000 + leftMargin 0.000000 + topMargin 0.000000 + bottomMargin 0.000000 + pageOverlap 0.000000 + clipIconLabels TRUE + autoResize TRUE + snapToGrid TRUE + gridX 16 + gridY 16 + defaultFont (object Font + size 10 + face "Arial" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + showMessageNum 1 + showClassOfObject TRUE + notation "Unified") + root_usecase_package (object Class_Category "Use Case View" + quid "3659ABB20065" + exportControl "Public" + global TRUE + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list + (object UseCaseDiagram "Main" + quid "3659ABB60100" + title "Main" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)))) + root_category (object Class_Category "Logical View" + quid "3659ABB20064" + exportControl "Public" + global TRUE + subsystem "Component View" + quidu "3659ABB2006D" + logical_models (list unit_reference_list + (object Class "ClassGen" + quid "3659ABD700A2" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3783462E016B" + supplier "Logical View::AccessFlags" + quidu "378345EC0044")) + operations (list Operations + (object Operation "addInterface" + quid "3659AD040069" + parameters (list Parameters + (object Parameter "String name")) + result "void" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "addMethod" + quid "378349A800F3" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + module "Component View::ClassGen" + quidu "3659AD9C02CB" + language "Java") + (object Class "ConstantPoolGen" + quid "3659AC570165" + operations (list Operations + (object Operation "addClass" + quid "3659ADC40188" + parameters (list Parameters + (object Parameter "String name")) + result "int" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "addMethodRef" + quid "3659AEE40132" + parameters (list Parameters + (object Parameter "String class_name") + (object Parameter "String method_name") + (object Parameter "String signature")) + result "int" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "addInteger" + quid "3659AF0D00EB" + parameters (list Parameters + (object Parameter "int i")) + result "int" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + language "Java") + (object Class "FieldGen" + quid "3659AC6101C3" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3783462A0025" + supplier "Logical View::AccessFlags" + quidu "378345EC0044")) + operations (list Operations + (object Operation "getField" + quid "3659ACAE020A" + result "Field" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "setInitValue" + quid "3659AF4200BF" + result "void" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + language "Java") + (object Class "MethodGen" + quid "3659AC6A014E" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "378346310292" + supplier "Logical View::AccessFlags" + quidu "378345EC0044")) + operations (list Operations + (object Operation "addException" + quid "3659AFD703D0" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + language "Java") + (object Class "Instruction" + quid "3659B1E8013C" + class_attributes (list class_attribute_list + (object ClassAttribute "tag" + quid "3659B221030A") + (object ClassAttribute "length" + quid "3659B24C00D1")) + language "Java") + (object Class "BranchInstruction" + quid "3659B29302BE" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659B3CC01E2" + supplier "Logical View::Instruction" + quidu "3659B1E8013C")) + realized_interfaces (list realize_rel_list + (object Realize_Relationship + quid "3659B46B028B" + supplier "Logical View::InstructionTargeter" + quidu "3659B40603BC")) + language "Java") + (object Class "Select" + quid "3659B30602D8" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659B3C5014C" + supplier "Logical View::BranchInstruction" + quidu "3659B29302BE")) + class_attributes (list class_attribute_list + (object ClassAttribute "targets" + quid "3659B3670056") + (object ClassAttribute "keys" + quid "3659B3740073")) + language "Java") + (object Class "LOOKUPSWITCH" + quid "3659B38B0315" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659B3B503CA" + supplier "Logical View::Select" + quidu "3659B30602D8")) + language "Java") + (object Class "TABLESWITCH" + quid "3659B3A200BF" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659B3BC013F" + supplier "Logical View::Select" + quidu "3659B30602D8")) + language "Java") + (object Class "InstructionTargeter" + quid "3659B40603BC" + stereotype "Interface" + operations (list Operations + (object Operation "updateTarget" + quid "3659B42302EB" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + language "Java") + (object Class "CodeExceptionGen" + quid "3659B4D200E4" + realized_interfaces (list realize_rel_list + (object Realize_Relationship + quid "3659B54B016B" + supplier "Logical View::InstructionTargeter" + quidu "3659B40603BC")) + language "Java") + (object Class "IfInstruction" + quid "3659B617007E" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659B63001F6" + supplier "Logical View::BranchInstruction" + quidu "3659B29302BE")) + language "Java") + (object Class "GOTO" + quid "3659B6220174" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659B63700D4" + supplier "Logical View::BranchInstruction" + quidu "3659B29302BE")) + realized_interfaces (list realize_rel_list + (object Realize_Relationship + quid "365A91AE021A" + supplier "Logical View::UnconditionalBranch" + quidu "365A919F0395")) + language "Java") + (object Class "Type" + quid "3659B87D0135" + operations (list Operations + (object Operation "getSignature" + quid "3659B8FB00F0" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + language "Java") + (object Class "BasicType" + quid "3659B90B02AB" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659B99402DA" + supplier "Logical View::Type" + quidu "3659B87D0135")) + language "Java") + (object Class "ReferenceType" + quid "3659B91D0030" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659B9990043" + supplier "Logical View::Type" + quidu "3659B87D0135")) + language "Java") + (object Class "ObjectType" + quid "3659B927039C" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659B9B0028B" + supplier "Logical View::ReferenceType" + quidu "3659B91D0030")) + operations (list Operations + (object Operation "getClassName" + quid "3659B95401E8" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + language "Java") + (object Class "ArrayType" + quid "3659B931024C" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3659B9B30181" + supplier "Logical View::ReferenceType" + quidu "3659B91D0030")) + operations (list Operations + (object Operation "getDimensions" + quid "3659B979012D" + result "int" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + language "Java") + (object Class "InstructionList" + quid "3659BAA803D2" + operations (list Operations + (object Operation "append" + quid "37834B1C0057" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + language "Java") + (object Class "LocalVariableGen" + quid "3659BC2A02C8" + realized_interfaces (list realize_rel_list + (object Realize_Relationship + quid "3659BC390248" + supplier "Logical View::InstructionTargeter" + quidu "3659B40603BC")) + language "Java") + (object Class "ReturnInstruction" + quid "365A9132032A" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A98DC03CB" + supplier "Logical View::Instruction" + quidu "3659B1E8013C"))) + (object Class "ArrayInstruction" + quid "365A913A02DB" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A98E5007B" + supplier "Logical View::Instruction" + quidu "3659B1E8013C"))) + (object Class "CPInstruction" + quid "365A91430360" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A98BE016F" + supplier "Logical View::Instruction" + quidu "3659B1E8013C")) + operations (list Operations + (object Operation "getType" + quid "37836CEF008A" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + class_attributes (list class_attribute_list + (object ClassAttribute "index" + quid "365A926F02D6"))) + (object Class "StackInstruction" + quid "365A91560097" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365AB1A8029D" + supplier "Logical View::Instruction" + quidu "3659B1E8013C"))) + (object Class "ConversionInstruction" + quid "365A91690116" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A98EA0295" + supplier "Logical View::Instruction" + quidu "3659B1E8013C"))) + (object Class "UnconditionalBranch" + quid "365A919F0395" + stereotype "Interface") + (object Class "ArithmeticInstruction" + quid "365A921A03E2" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A98B0025F" + supplier "Logical View::Instruction" + quidu "3659B1E8013C"))) + (object Class "LocalVariableInstruction" + quid "365A926500FA" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "365A98B8008A" + supplier "Logical View::Instruction" + quidu "3659B1E8013C")) + class_attributes (list class_attribute_list + (object ClassAttribute "index" + quid "365A988E01E8"))) + (object Class "FieldInstruction" + quid "365A92F300CD" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "37836FAF0231" + supplier "Logical View::FieldOrMethod" + quidu "37836D4602A2")) + operations (list Operations + (object Operation "getFieldType" + quid "37836D250377" + result "Type" + concurrency "Sequential" + opExportControl "Public" + uid 0))) + (object Class "InvokeInstruction" + quid "365A931601C7" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "37836FB302A5" + supplier "Logical View::FieldOrMethod" + quidu "37836D4602A2")) + operations (list Operations + (object Operation "getArgumentTypes" + quid "37836D890190" + result "Type[]" + concurrency "Sequential" + opExportControl "Public" + uid 0))) + (object Class "AccessFlags" + quid "378345EC0044" + operations (list Operations + (object Operation "isPublic" + quid "378345EC0045" + result "boolean" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + abstract TRUE) + (object Class "InstructionHandle" + quid "3783485F01C2") + (object Class "FieldOrMethod" + quid "37836D4602A2" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "37836E8702CC" + supplier "Logical View::CPInstruction" + quidu "365A91430360")) + operations (list Operations + (object Operation "getName" + quid "37836D5003D3" + concurrency "Sequential" + opExportControl "Public" + uid 0))) + (object Class "NEW" + quid "37836DE502D3" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "37836E5F03A1" + supplier "Logical View::CPInstruction" + quidu "365A91430360"))) + (object Class "INSTANCEOF" + quid "37836EC1013F" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "37836ED7023B" + supplier "Logical View::CPInstruction" + quidu "365A91430360"))) + (object Class "NewInterface" + quid "378370F400C6" + stereotype "Interface") + (object Association "$UNNAMED$0" + quid "3659BBA60048" + roles (list role_list + (object Role "$UNNAMED$1" + quid "3659BBA60250" + supplier "Logical View::ClassGen" + quidu "3659ABD700A2" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$2" + quid "3659BBA60264" + supplier "Logical View::ConstantPoolGen" + quidu "3659AC570165" + client_cardinality (value cardinality "1") + is_navigable TRUE))) + (object Association "$UNNAMED$3" + quid "3659BBC8024F" + roles (list role_list + (object Role "$UNNAMED$4" + quid "3659BBC803C2" + supplier "Logical View::ClassGen" + quidu "3659ABD700A2" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$5" + quid "3659BBC803CC" + supplier "Logical View::MethodGen" + quidu "3659AC6A014E" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$6" + quid "3659BBD40076" + roles (list role_list + (object Role "$UNNAMED$7" + quid "3659BBD402BB" + supplier "Logical View::ClassGen" + quidu "3659ABD700A2" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$8" + quid "3659BBD402CF" + supplier "Logical View::FieldGen" + quidu "3659AC6101C3" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$9" + quid "3659BCA400E3" + roles (list role_list + (object Role "$UNNAMED$10" + quid "3659BCA40292" + supplier "Logical View::MethodGen" + quidu "3659AC6A014E" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$11" + quid "3659BCA402A6" + supplier "Logical View::LocalVariableGen" + quidu "3659BC2A02C8" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$12" + quid "3659BCB20350" + roles (list role_list + (object Role "$UNNAMED$13" + quid "3659BCB3017B" + supplier "Logical View::MethodGen" + quidu "3659AC6A014E" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$14" + quid "3659BCB3018F" + supplier "Logical View::CodeExceptionGen" + quidu "3659B4D200E4" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$15" + quid "3659BDBE03D8" + roles (list role_list + (object Role "$UNNAMED$16" + quid "3659BDBF02FD" + supplier "Logical View::Type" + quidu "3659B87D0135" + is_navigable TRUE) + (object Role "$UNNAMED$17" + quid "3659BDBF0311" + supplier "Logical View::FieldGen" + quidu "3659AC6101C3" + is_navigable TRUE))) + (object Association "$UNNAMED$18" + quid "3659BDC7022C" + roles (list role_list + (object Role "$UNNAMED$19" + quid "3659BDC8030A" + supplier "Logical View::Type" + quidu "3659B87D0135" + is_navigable TRUE) + (object Role "$UNNAMED$20" + quid "3659BDC80314" + supplier "Logical View::MethodGen" + quidu "3659AC6A014E" + is_navigable TRUE))) + (object Association "$UNNAMED$21" + quid "365A9D0C02A0" + roles (list role_list + (object Role "$UNNAMED$22" + quid "365A9D0D008F" + supplier "Logical View::InstructionList" + quidu "3659BAA803D2" + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$23" + quid "365A9D0D0099" + supplier "Logical View::Instruction" + quidu "3659B1E8013C" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$24" + quid "37834AD601AB" + roles (list role_list + (object Role "$UNNAMED$25" + quid "37834AD60346" + supplier "Logical View::InstructionList" + quidu "3659BAA803D2" + client_cardinality (value cardinality "1") + is_navigable TRUE + is_aggregate TRUE) + (object Role "$UNNAMED$26" + quid "37834AD60347" + supplier "Logical View::InstructionHandle" + quidu "3783485F01C2" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$27" + quid "37834B0902D1" + roles (list role_list + (object Role "$UNNAMED$28" + quid "37834B0A0246" + supplier "Logical View::InstructionList" + quidu "3659BAA803D2" + is_navigable TRUE) + (object Role "$UNNAMED$29" + quid "37834B0A0250" + supplier "Logical View::MethodGen" + quidu "3659AC6A014E" + is_navigable TRUE))) + (object Association "$UNNAMED$30" + quid "37834B7A02FB" + roles (list role_list + (object Role "$UNNAMED$31" + quid "37834B7B0271" + supplier "Logical View::Instruction" + quidu "3659B1E8013C" + client_cardinality (value cardinality "1") + is_navigable TRUE) + (object Role "$UNNAMED$32" + quid "37834B7B028F" + supplier "Logical View::InstructionHandle" + quidu "3783485F01C2" + client_cardinality (value cardinality "1") + is_navigable TRUE))) + (object Association "$UNNAMED$33" + quid "37834BAE0382" + stereotype "targets" + roles (list role_list + (object Role "targets" + quid "37834BB001C3" + label "targets" + supplier "Logical View::InstructionHandle" + quidu "3783485F01C2" + client_cardinality (value cardinality "n") + is_navigable TRUE) + (object Role "$UNNAMED$34" + quid "37834BB001CD" + supplier "Logical View::InstructionTargeter" + quidu "3659B40603BC" + client_cardinality (value cardinality "n") + is_navigable TRUE))) + (object Association "$UNNAMED$35" + quid "37834DCC011F" + roles (list role_list + (object Role "$UNNAMED$36" + quid "37834DCC0300" + supplier "Logical View::ConstantPoolGen" + quidu "3659AC570165" + is_navigable TRUE) + (object Role "$UNNAMED$37" + quid "37834DCC030A" + supplier "Logical View::ClassGen" + quidu "3659ABD700A2" + is_navigable TRUE)))) + logical_presentations (list unit_reference_list + (object ClassDiagram "ClassGen" + quid "3659ABB6013B" + title "ClassGen" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list + (object ClassView "Class" "Logical View::BasicType" @1 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (352, 656) + label (object ItemLabel + Parent_View @1 + location (242, 605) + fill_color 13434879 + nlines 1 + max_width 220 + justify 0 + label "BasicType") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B90B02AB" + width 238 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ObjectType" @2 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (432, 384) + label (object ItemLabel + Parent_View @2 + location (260, 303) + fill_color 13434879 + nlines 1 + max_width 344 + justify 0 + label "ObjectType") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B927039C" + compartment (object Compartment + Parent_View @2 + location (260, 363) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 2 + max_width 350) + width 362 + height 186 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ArrayType" @3 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (880, 384) + label (object ItemLabel + Parent_View @3 + location (707, 303) + fill_color 13434879 + nlines 1 + max_width 346 + justify 0 + label "ArrayType") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B931024C" + compartment (object Compartment + Parent_View @3 + location (707, 363) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 2 + max_width 353) + width 364 + height 186 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ReferenceType" @4 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (688, 656) + label (object ItemLabel + Parent_View @4 + location (540, 605) + fill_color 13434879 + nlines 1 + max_width 296 + justify 0 + label "ReferenceType") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B91D0030" + width 314 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::FieldGen" @5 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1072, 800) + label (object ItemLabel + Parent_View @5 + location (927, 694) + fill_color 13434879 + nlines 1 + max_width 290 + justify 0 + label "FieldGen") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659AC6101C3" + compartment (object Compartment + Parent_View @5 + location (927, 754) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 3 + max_width 296) + width 308 + height 236 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::AccessFlags" @6 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1344, 384) + font (object Font + italics TRUE) + label (object ItemLabel + Parent_View @6 + location (1210, 306) + fill_color 13434879 + nlines 1 + max_width 268 + justify 0 + label "AccessFlags") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "378345EC0044" + compartment (object Compartment + Parent_View @6 + location (1210, 366) + font (object Font + italics TRUE) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 2 + max_width 231) + width 286 + height 180 + annotation 8 + autoResize TRUE) + (object InheritTreeView "" @7 + location (1344, 602) + line_color 3342489 + fill_color 13434879 + supplier @6 + vertices (list Points + (1344, 602) + (1344, 474))) + (object InheritView "" @8 + stereotype TRUE + line_color 3342489 + quidu "3783462A0025" + client @5 + supplier @6 + line_style 3 + origin_attachment (1059, 682) + terminal_attachment (1059, 602) + drawSupplier @7) + (object InheritTreeView "" @9 + location (678, 500) + line_color 3342489 + fill_color 13434879 + supplier @4 + vertices (list Points + (678, 500) + (678, 593))) + (object InheritView "" @10 + stereotype TRUE + line_color 3342489 + quidu "3659B9B0028B" + client @2 + supplier @4 + line_style 3 + origin_attachment (369, 477) + terminal_attachment (406, 500) + drawSupplier @9) + (object InheritView "" @11 + stereotype TRUE + line_color 3342489 + quidu "3659B9B30181" + client @3 + supplier @4 + line_style 3 + origin_attachment (881, 477) + terminal_attachment (918, 500) + drawSupplier @9) + (object ClassView "Class" "Logical View::LocalVariableGen" @12 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (736, 1344) + label (object ItemLabel + Parent_View @12 + location (551, 1294) + fill_color 13434879 + nlines 1 + max_width 370 + justify 0 + label "LocalVariableGen") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659BC2A02C8" + width 388 + height 125 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::CodeExceptionGen" @13 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (736, 1168) + label (object ItemLabel + Parent_View @13 + location (546, 1117) + fill_color 13434879 + nlines 1 + max_width 380 + justify 0 + label "CodeExceptionGen") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B4D200E4" + width 398 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::Type" @14 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (512, 928) + label (object ItemLabel + Parent_View @14 + location (359, 847) + fill_color 13434879 + nlines 1 + max_width 306 + justify 0 + label "Type") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B87D0135" + compartment (object Compartment + Parent_View @14 + location (359, 907) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 2 + max_width 312) + width 324 + height 186 + annotation 8 + autoResize TRUE) + (object InheritTreeView "" @15 + location (512, 745) + line_color 3342489 + fill_color 13434879 + supplier @14 + vertices (list Points + (512, 745) + (512, 835))) + (object AssociationViewNew "$UNNAMED$15" @16 + location (795, 862) + stereotype TRUE + line_color 3342489 + quidu "3659BDBE03D8" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$16" @17 + Parent_View @16 + location (-869, -50) + stereotype TRUE + line_color 3342489 + quidu "3659BDBF02FD" + client @16 + supplier @14 + line_style 0) + (object RoleView "$UNNAMED$17" @18 + Parent_View @16 + location (-869, -50) + stereotype TRUE + line_color 3342489 + quidu "3659BDBF0311" + client @16 + supplier @5 + line_style 0))) + (object InheritView "" @19 + stereotype TRUE + line_color 3342489 + quidu "3659B99402DA" + client @1 + supplier @14 + line_style 3 + origin_attachment (347, 719) + terminal_attachment (347, 745) + drawSupplier @15) + (object InheritView "" @20 + stereotype TRUE + line_color 3342489 + quidu "3659B9990043" + client @4 + supplier @14 + line_style 3 + origin_attachment (669, 719) + terminal_attachment (669, 745) + drawSupplier @15) + (object ClassView "Class" "Logical View::MethodGen" @21 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1328, 1104) + label (object ItemLabel + Parent_View @21 + location (1165, 1023) + fill_color 13434879 + nlines 1 + max_width 326 + justify 0 + label "MethodGen") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659AC6A014E" + compartment (object Compartment + Parent_View @21 + location (1165, 1083) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 2 + max_width 322) + width 344 + height 186 + annotation 8 + autoResize TRUE) + (object AssociationViewNew "$UNNAMED$9" @22 + location (1022, 1227) + stereotype TRUE + line_color 3342489 + quidu "3659BCA400E3" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$10" @23 + Parent_View @22 + location (254, -597) + stereotype TRUE + line_color 3342489 + quidu "3659BCA40292" + client @22 + supplier @21 + line_style 0) + (object RoleView "$UNNAMED$11" @24 + Parent_View @22 + location (254, -597) + stereotype TRUE + line_color 3342489 + quidu "3659BCA402A6" + client @22 + supplier @12 + line_style 0 + label (object SegLabel @25 + Parent_View @24 + location (922, 1326) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "*" + pctDist 0.900000 + height 54 + orientation 0)))) + (object AssociationViewNew "$UNNAMED$12" @26 + location (1045, 1134) + stereotype TRUE + line_color 3342489 + quidu "3659BCB20350" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$13" @27 + Parent_View @26 + location (-235, -722) + stereotype TRUE + line_color 3342489 + quidu "3659BCB3017B" + client @26 + supplier @21 + line_style 0) + (object RoleView "$UNNAMED$14" @28 + Parent_View @26 + location (-235, -722) + stereotype TRUE + line_color 3342489 + quidu "3659BCB3018F" + client @26 + supplier @13 + line_style 0 + label (object SegLabel @29 + Parent_View @28 + location (942, 1092) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "*" + pctDist 0.900000 + height 54 + orientation 1)))) + (object AssociationViewNew "$UNNAMED$18" @30 + location (914, 1014) + stereotype TRUE + line_color 3342489 + quidu "3659BDC7022C" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$19" @31 + Parent_View @30 + location (-1390, 6) + stereotype TRUE + line_color 3342489 + quidu "3659BDC8030A" + client @30 + supplier @14 + line_style 0) + (object RoleView "$UNNAMED$20" @32 + Parent_View @30 + location (-1390, 6) + stereotype TRUE + line_color 3342489 + quidu "3659BDC80314" + client @30 + supplier @21 + line_style 0))) + (object InheritView "" @33 + stereotype TRUE + line_color 3342489 + quidu "378346310292" + client @21 + supplier @6 + line_style 3 + origin_attachment (1344, 1011) + terminal_attachment (1344, 602) + drawSupplier @7) + (object ClassView "Class" "Logical View::BranchInstruction" @34 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (720, 1520) + label (object ItemLabel + Parent_View @34 + location (546, 1468) + fill_color 13434879 + nlines 1 + max_width 348 + justify 0 + label "BranchInstruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B29302BE" + width 366 + height 128 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::InstructionList" @35 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1904, 1104) + label (object ItemLabel + Parent_View @35 + location (1759, 1023) + fill_color 13434879 + nlines 1 + max_width 290 + justify 0 + label "InstructionList") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659BAA803D2" + compartment (object Compartment + Parent_View @35 + location (1759, 1083) + icon_style "Icon" + fill_color 16777215 + anchor 2 + nlines 2 + max_width 215) + width 308 + height 186 + annotation 8 + autoResize TRUE) + (object AssociationViewNew "$UNNAMED$27" @36 + location (1624, 1104) + stereotype TRUE + line_color 3342489 + quidu "37834B0902D1" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$28" @37 + Parent_View @36 + location (328, -64) + stereotype TRUE + line_color 3342489 + quidu "37834B0A0246" + client @36 + supplier @35 + line_style 0) + (object RoleView "$UNNAMED$29" @38 + Parent_View @36 + location (328, -64) + stereotype TRUE + line_color 3342489 + quidu "37834B0A0250" + client @36 + supplier @21 + line_style 0))) + (object ClassView "Class" "Logical View::Instruction" @39 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1312, 1408) + label (object ItemLabel + Parent_View @39 + location (1209, 1324) + fill_color 13434879 + nlines 1 + max_width 207 + justify 0 + label "Instruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B1E8013C" + compartment (object Compartment + Parent_View @39 + location (1209, 1384) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 3 + max_width 159) + width 225 + height 193 + annotation 8 + autoResize TRUE) + (object InheritView "" @40 + stereotype TRUE + line_color 3342489 + quidu "3659B3CC01E2" + client @34 + supplier @39 + line_style 0) + (object ClassView "Class" "Logical View::InstructionHandle" @41 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1904, 1408) + label (object ItemLabel + Parent_View @41 + location (1730, 1356) + fill_color 13434879 + nlines 1 + max_width 348 + justify 0 + label "InstructionHandle") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3783485F01C2" + width 366 + height 128 + annotation 8 + autoResize TRUE) + (object AssociationViewNew "$UNNAMED$24" @42 + location (1904, 1270) + stereotype TRUE + line_color 3342489 + quidu "37834AD601AB" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$25" @43 + Parent_View @42 + location (48, -266) + stereotype TRUE + line_color 3342489 + quidu "37834AD60346" + client @42 + supplier @35 + line_style 0 + label (object SegLabel @44 + Parent_View @43 + location (1958, 1204) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "1" + pctDist 0.900000 + height 54 + orientation 1)) + (object RoleView "$UNNAMED$26" @45 + Parent_View @42 + location (48, -266) + stereotype TRUE + line_color 3342489 + quidu "37834AD60347" + client @42 + supplier @41 + line_style 0 + label (object SegLabel @46 + Parent_View @45 + location (1958, 1336) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "*" + pctDist 0.900000 + height 54 + orientation 0)))) + (object AssociationViewNew "$UNNAMED$30" @47 + location (1572, 1408) + stereotype TRUE + line_color 3342489 + quidu "37834B7A02FB" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$31" @48 + Parent_View @47 + location (-332, 48) + stereotype TRUE + line_color 3342489 + quidu "37834B7B0271" + client @47 + supplier @39 + line_style 0 + label (object SegLabel @49 + Parent_View @48 + location (1440, 1462) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "1" + pctDist 0.900000 + height 54 + orientation 0)) + (object RoleView "$UNNAMED$32" @50 + Parent_View @47 + location (-332, 48) + stereotype TRUE + line_color 3342489 + quidu "37834B7B028F" + client @47 + supplier @41 + line_style 0 + label (object SegLabel @51 + Parent_View @50 + location (1704, 1462) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "1" + pctDist 0.900000 + height 54 + orientation 1)))) + (object ClassView "Class" "Logical View::InstructionTargeter" @52 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (192, 1344) + label (object ItemLabel + Parent_View @52 + location (8, 1285) + fill_color 13434879 + nlines 1 + max_width 368 + justify 0 + label "InstructionTargeter") + stereotype (object ItemLabel + Parent_View @52 + location (8, 1235) + fill_color 13434879 + anchor 10 + nlines 1 + max_width 368 + justify 0 + label "<>") + icon "Interface" + icon_style "Label" + line_color 3342489 + fill_color 13434879 + quidu "3659B40603BC" + compartment (object Compartment + Parent_View @52 + location (8, 1345) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 2 + max_width 318) + width 386 + height 242 + annotation 8 + autoResize TRUE) + (object RealizeView "" @53 + stereotype TRUE + line_color 3342489 + quidu "3659B54B016B" + client @13 + supplier @52 + line_style 0) + (object RealizeView "" @54 + stereotype TRUE + line_color 3342489 + quidu "3659BC390248" + client @12 + supplier @52 + line_style 0) + (object AssociationViewNew "$UNNAMED$33" @55 + location (1043, 1616) + stereotype (object SegLabel @56 + Parent_View @55 + location (1296, 1579) + anchor 10 + anchor_loc 1 + nlines 1 + max_width 450 + justify 0 + label "<>" + pctDist 4.733333 + height 38 + orientation 0) + line_color 3342489 + quidu "37834BAE0382" + roleview_list (list RoleViews + (object RoleView "targets" @57 + Parent_View @55 + location (323, 96) + stereotype TRUE + line_color 3342489 + quidu "37834BB001C3" + client @55 + supplier @41 + vertices (list Points + (1043, 1616) + (1903, 1616) + (1903, 1472)) + line_style 0 + label (object SegLabel @58 + Parent_View @57 + location (1957, 1573) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "*" + pctDist 0.900000 + height 54 + orientation 1)) + (object RoleView "$UNNAMED$34" @59 + Parent_View @55 + location (323, 96) + stereotype TRUE + line_color 3342489 + quidu "37834BB001CD" + client @55 + supplier @52 + vertices (list Points + (1043, 1616) + (191, 1616) + (191, 1465)) + line_style 0 + label (object SegLabel @60 + Parent_View @59 + location (245, 1565) + anchor 2 + anchor_loc 1 + nlines 1 + max_width 15 + justify 0 + label "*" + pctDist 0.900000 + height 54 + orientation 1)))) + (object ClassView "Class" "Logical View::ConstantPoolGen" @61 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1888, 448) + label (object ItemLabel + Parent_View @61 + location (1715, 317) + fill_color 13434879 + nlines 1 + max_width 346 + justify 0 + label "ConstantPoolGen") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659AC570165" + compartment (object Compartment + Parent_View @61 + location (1715, 377) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 4 + max_width 343) + width 364 + height 286 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ClassGen" @62 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1632, 800) + label (object ItemLabel + Parent_View @62 + location (1483, 694) + fill_color 13434879 + nlines 1 + max_width 298 + justify 0 + label "ClassGen") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659ABD700A2" + compartment (object Compartment + Parent_View @62 + location (1483, 754) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 3 + max_width 303) + width 316 + height 236 + annotation 8 + autoResize TRUE) + (object InheritView "" @63 + stereotype TRUE + line_color 3342489 + quidu "3783462E016B" + client @62 + supplier @6 + line_style 3 + origin_attachment (1634, 682) + terminal_attachment (1634, 602) + drawSupplier @7) + (object AssociationViewNew "$UNNAMED$35" @64 + location (1751, 636) + stereotype TRUE + line_color 3342489 + quidu "37834DCC011F" + roleview_list (list RoleViews + (object RoleView "$UNNAMED$36" @65 + Parent_View @64 + location (119, -164) + stereotype TRUE + line_color 3342489 + quidu "37834DCC0300" + client @64 + supplier @61 + line_style 0) + (object RoleView "$UNNAMED$37" @66 + Parent_View @64 + location (119, -164) + stereotype TRUE + line_color 3342489 + quidu "37834DCC030A" + client @64 + supplier @62 + line_style 0))) + (object RealizeView "" @67 + stereotype TRUE + line_color 3342489 + quidu "3659B46B028B" + client @34 + supplier @52 + line_style 0))) + (object ClassDiagram "Instructions" + quid "3659B32A024D" + title "Instructions" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 216 + origin_y 0 + items (list diagram_item_list + (object ClassView "Class" "Logical View::Instruction" @68 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1904, 176) + label (object ItemLabel + Parent_View @68 + location (1782, 91) + fill_color 13434879 + nlines 1 + max_width 244 + justify 0 + label "Instruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B1E8013C" + compartment (object Compartment + Parent_View @68 + location (1782, 151) + icon_style "Icon" + fill_color 16777215 + anchor 2 + nlines 3 + max_width 159) + width 262 + height 194 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::BranchInstruction" @69 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (912, 464) + label (object ItemLabel + Parent_View @69 + location (721, 414) + fill_color 13434879 + nlines 1 + max_width 382 + justify 0 + label "BranchInstruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B29302BE" + width 400 + height 125 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::Select" @70 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1120, 784) + label (object ItemLabel + Parent_View @70 + location (1026, 699) + fill_color 13434879 + nlines 1 + max_width 188 + justify 0 + label "Select") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B30602D8" + compartment (object Compartment + Parent_View @70 + location (1026, 759) + icon_style "Icon" + fill_color 16777215 + anchor 2 + nlines 3 + max_width 175) + width 206 + height 194 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::LOOKUPSWITCH" @71 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (912, 1072) + label (object ItemLabel + Parent_View @71 + location (732, 1021) + fill_color 13434879 + nlines 1 + max_width 360 + justify 0 + label "LOOKUPSWITCH") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B38B0315" + width 378 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::TABLESWITCH" @72 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1360, 1072) + label (object ItemLabel + Parent_View @72 + location (1202, 1021) + fill_color 13434879 + nlines 1 + max_width 316 + justify 0 + label "TABLESWITCH") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B3A200BF" + width 334 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::IfInstruction" @73 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (832, 752) + label (object ItemLabel + Parent_View @73 + location (711, 701) + fill_color 13434879 + nlines 1 + max_width 242 + justify 0 + label "IfInstruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B617007E" + width 260 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::GOTO" @74 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (576, 752) + label (object ItemLabel + Parent_View @74 + location (495, 701) + fill_color 13434879 + nlines 1 + max_width 162 + justify 0 + label "GOTO") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "3659B6220174" + height 126 + annotation 8 + autoResize TRUE) + (object InheritTreeView "" @75 + location (905, 618) + line_color 3342489 + fill_color 13434879 + supplier @69 + vertices (list Points + (905, 618) + (905, 526))) + (object InheritView "" @76 + stereotype TRUE + line_color 3342489 + quidu "3659B63700D4" + client @74 + supplier @69 + line_style 3 + origin_attachment (581, 689) + terminal_attachment (581, 618) + drawSupplier @75) + (object ClassView "Class" "Logical View::ReturnInstruction" @77 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2464, 208) + label (object ItemLabel + Parent_View @77 + location (2292, 157) + fill_color 13434879 + nlines 1 + max_width 344 + justify 0 + label "ReturnInstruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A9132032A" + width 362 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ArrayInstruction" @78 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1408, 464) + label (object ItemLabel + Parent_View @78 + location (1252, 413) + fill_color 13434879 + nlines 1 + max_width 312 + justify 0 + label "ArrayInstruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A913A02DB" + width 330 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::CPInstruction" @79 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2256, 528) + label (object ItemLabel + Parent_View @79 + location (2120, 422) + fill_color 13434879 + nlines 1 + max_width 272 + justify 0 + label "CPInstruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A91430360" + compartment (object Compartment + Parent_View @79 + location (2120, 482) + icon_style "Icon" + fill_color 16777215 + anchor 2 + nlines 3 + max_width 219) + width 290 + height 236 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::StackInstruction" @80 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1456, 208) + label (object ItemLabel + Parent_View @80 + location (1294, 157) + fill_color 13434879 + nlines 1 + max_width 324 + justify 0 + label "StackInstruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A91560097" + width 342 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::ConversionInstruction" @81 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1840, 464) + label (object ItemLabel + Parent_View @81 + location (1634, 413) + fill_color 13434879 + nlines 1 + max_width 412 + justify 0 + label "ConversionInstruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A91690116" + width 430 + height 126 + annotation 8 + autoResize TRUE) + (object InheritView "" @82 + stereotype TRUE + line_color 3342489 + quidu "3659B63001F6" + client @73 + supplier @69 + line_style 3 + origin_attachment (837, 689) + terminal_attachment (837, 618) + drawSupplier @75) + (object ClassView "Class" "Logical View::ArithmeticInstruction" @83 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (976, 208) + label (object ItemLabel + Parent_View @83 + location (775, 157) + fill_color 13434879 + nlines 1 + max_width 402 + justify 0 + label "ArithmeticInstruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A921A03E2" + width 420 + height 126 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::LocalVariableInstruction" @84 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2688, 496) + label (object ItemLabel + Parent_View @84 + location (2454, 415) + fill_color 13434879 + nlines 1 + max_width 468 + justify 0 + label "LocalVariableInstruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A926500FA" + compartment (object Compartment + Parent_View @84 + location (2454, 475) + icon_style "Icon" + fill_color 16777215 + anchor 2 + nlines 2 + max_width 147) + width 486 + height 186 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::FieldInstruction" @85 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (1888, 1168) + label (object ItemLabel + Parent_View @85 + location (1733, 1087) + fill_color 13434879 + nlines 1 + max_width 310 + justify 0 + label "FieldInstruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A92F300CD" + compartment (object Compartment + Parent_View @85 + location (1733, 1147) + icon_style "Icon" + fill_color 16777215 + anchor 2 + nlines 2 + max_width 306) + width 328 + height 186 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::InvokeInstruction" @86 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2368, 1168) + label (object ItemLabel + Parent_View @86 + location (2158, 1087) + fill_color 13434879 + nlines 1 + max_width 420 + justify 0 + label "InvokeInstruction") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "365A931601C7" + compartment (object Compartment + Parent_View @86 + location (2158, 1147) + icon_style "Icon" + fill_color 16777215 + anchor 2 + nlines 2 + max_width 416) + width 438 + height 186 + annotation 8 + autoResize TRUE) + (object InheritTreeView "" @87 + location (1908, 363) + line_color 3342489 + fill_color 13434879 + supplier @68 + vertices (list Points + (1908, 363) + (1908, 273))) + (object InheritView "" @88 + stereotype TRUE + line_color 3342489 + quidu "365A98B8008A" + client @84 + supplier @68 + line_style 3 + origin_attachment (2691, 403) + terminal_attachment (2691, 363) + drawSupplier @87) + (object InheritView "" @89 + stereotype TRUE + line_color 3342489 + quidu "365A98BE016F" + client @79 + supplier @68 + line_style 3 + origin_attachment (2263, 410) + terminal_attachment (2263, 363) + drawSupplier @87) + (object InheritTreeView "" @90 + location (1113, 971) + line_color 3342489 + fill_color 13434879 + supplier @70 + vertices (list Points + (1113, 971) + (1113, 881))) + (object InheritView "" @91 + stereotype TRUE + line_color 3342489 + quidu "3659B3B503CA" + client @71 + supplier @70 + line_style 3 + origin_attachment (913, 1009) + terminal_attachment (913, 971) + drawSupplier @90) + (object InheritView "" @92 + stereotype TRUE + line_color 3342489 + quidu "365A98E5007B" + client @78 + supplier @68 + line_style 3 + origin_attachment (1383, 401) + terminal_attachment (1383, 363) + drawSupplier @87) + (object InheritView "" @93 + stereotype TRUE + line_color 3342489 + quidu "365A98B0025F" + client @83 + supplier @68 + line_style 3 + origin_attachment (981, 271) + terminal_attachment (981, 363) + drawSupplier @87) + (object InheritView "" @94 + stereotype TRUE + line_color 3342489 + quidu "365A98EA0295" + client @81 + supplier @68 + line_style 3 + origin_attachment (1843, 401) + terminal_attachment (1843, 363) + drawSupplier @87) + (object InheritView "" @95 + stereotype TRUE + line_color 3342489 + quidu "365A98DC03CB" + client @77 + supplier @68 + line_style 3 + origin_attachment (2459, 271) + terminal_attachment (2459, 363) + drawSupplier @87) + (object InheritView "" @96 + stereotype TRUE + line_color 3342489 + quidu "365AB1A8029D" + client @80 + supplier @68 + line_style 3 + origin_attachment (1445, 271) + terminal_attachment (1445, 363) + drawSupplier @87) + (object ClassView "Class" "Logical View::FieldOrMethod" @97 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2080, 864) + label (object ItemLabel + Parent_View @97 + location (1934, 783) + fill_color 13434879 + nlines 1 + max_width 292 + justify 0 + label "FieldOrMethod") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "37836D4602A2" + compartment (object Compartment + Parent_View @97 + location (1934, 843) + icon_style "Icon" + fill_color 13434879 + anchor 2 + nlines 2 + max_width 237) + width 310 + height 186 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::NEW" @98 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2816, 848) + label (object ItemLabel + Parent_View @98 + location (2709, 797) + fill_color 13434879 + nlines 1 + max_width 214 + justify 0 + label "NEW") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "37836DE502D3" + width 232 + height 126 + annotation 8 + autoResize TRUE) + (object InheritView "" @99 + stereotype TRUE + line_color 3342489 + quidu "3659B3CC01E2" + client @69 + supplier @68 + line_style 3 + origin_attachment (871, 402) + terminal_attachment (871, 363) + drawSupplier @87) + (object InheritTreeView "" @100 + location (2256, 736) + line_color 3342489 + fill_color 13434879 + supplier @79 + vertices (list Points + (2256, 736) + (2256, 646))) + (object ClassView "Class" "Logical View::INSTANCEOF" @101 + ShowCompartmentStereotypes TRUE + IncludeAttribute TRUE + IncludeOperation TRUE + location (2496, 848) + label (object ItemLabel + Parent_View @101 + location (2349, 797) + fill_color 13434879 + nlines 1 + max_width 294 + justify 0 + label "INSTANCEOF") + icon_style "Icon" + line_color 3342489 + fill_color 13434879 + quidu "37836EC1013F" + width 312 + height 126 + annotation 8 + autoResize TRUE) + (object InheritView "" @102 + stereotype TRUE + line_color 3342489 + quidu "37836ED7023B" + client @101 + supplier @79 + line_style 3 + origin_attachment (2496, 785) + terminal_attachment (2496, 736) + drawSupplier @100) + (object InheritView "" @103 + stereotype TRUE + line_color 3342489 + quidu "37836E5F03A1" + client @98 + supplier @79 + line_style 3 + origin_attachment (2787, 785) + terminal_attachment (2787, 736) + drawSupplier @100) + (object InheritView "" @104 + stereotype TRUE + line_color 3342489 + quidu "37836E8702CC" + client @97 + supplier @79 + line_style 3 + origin_attachment (2054, 771) + terminal_attachment (2054, 736) + drawSupplier @100) + (object InheritView "" @105 + stereotype TRUE + line_color 3342489 + quidu "3659B3BC013F" + client @72 + supplier @70 + line_style 3 + origin_attachment (1325, 1009) + terminal_attachment (1325, 971) + drawSupplier @90) + (object InheritTreeView "" @106 + location (2079, 1047) + line_color 3342489 + fill_color 13434879 + supplier @97 + vertices (list Points + (2079, 1047) + (2079, 957))) + (object InheritView "" @107 + stereotype TRUE + line_color 3342489 + quidu "37836FB302A5" + client @86 + supplier @97 + line_style 3 + origin_attachment (2363, 1075) + terminal_attachment (2363, 1047) + drawSupplier @106) + (object InheritView "" @108 + stereotype TRUE + line_color 3342489 + quidu "37836FAF0231" + client @85 + supplier @97 + line_style 3 + origin_attachment (1873, 1075) + terminal_attachment (1873, 1047) + drawSupplier @106) + (object InheritView "" @109 + stereotype TRUE + line_color 3342489 + quidu "3659B3C5014C" + client @70 + supplier @69 + line_style 3 + origin_attachment (1128, 687) + terminal_attachment (1128, 618) + drawSupplier @75))))) + root_subsystem (object SubSystem "Component View" + quid "3659ABB2006D" + physical_models (list unit_reference_list + (object module "ClassGen" "NotAModuleType" "NotAModulePart" + quid "3659AD9C02CB" + stereotype "" + language "Java")) + physical_presentations (list unit_reference_list + (object Module_Diagram "Main" + quid "3659ABB600FF" + title "Main" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)))) + process_structure (object Processes + quid "3659ABB2006E" + ProcsNDevs (list + (object Process_Diagram "Deployment View" + quid "3659ABB20077" + title "Deployment View" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)))) + properties (object Properties + attributes (list Attribute_Set + (object Attribute + tool "DDL" + name "propertyId" + value "809135966") + (object Attribute + tool "DDL" + name "default__Project" + value (list Attribute_Set + (object Attribute + tool "DDL" + name "DataBase" + value ("DataBaseSet" 800)) + (object Attribute + tool "DDL" + name "DataBaseSet" + value (list Attribute_Set + (object Attribute + tool "DDL" + name "ANSI" + value 800) + (object Attribute + tool "DDL" + name "Oracle" + value 801) + (object Attribute + tool "DDL" + name "SQLServer" + value 802) + (object Attribute + tool "DDL" + name "Sybase" + value 803) + (object Attribute + tool "DDL" + name "Watcom" + value 804))) + (object Attribute + tool "DDL" + name "PrimaryKeyColumnName" + value "Id") + (object Attribute + tool "DDL" + name "PrimaryKeyColumnType" + value "NUMBER(5)") + (object Attribute + tool "DDL" + name "ViewName" + value "V_") + (object Attribute + tool "DDL" + name "TableName" + value "T_") + (object Attribute + tool "DDL" + name "InheritSuffix" + value "_V") + (object Attribute + tool "DDL" + name "DropClause" + value FALSE) + (object Attribute + tool "DDL" + name "BaseViews" + value FALSE) + (object Attribute + tool "DDL" + name "DDLScriptFilename" + value "DDL1.SQL"))) + (object Attribute + tool "DDL" + name "default__Attribute" + value (list Attribute_Set + (object Attribute + tool "DDL" + name "ColumnType" + value "VARCHAR") + (object Attribute + tool "DDL" + name "Length" + value "") + (object Attribute + tool "DDL" + name "NullsOK" + value TRUE) + (object Attribute + tool "DDL" + name "PrimaryKey" + value FALSE) + (object Attribute + tool "DDL" + name "Unique" + value FALSE) + (object Attribute + tool "DDL" + name "CompositeUnique" + value FALSE) + (object Attribute + tool "DDL" + name "CheckConstraint" + value ""))) + (object Attribute + tool "DDL" + name "HiddenTool" + value FALSE) + (object Attribute + tool "IDL" + name "propertyId" + value "809135966") + (object Attribute + tool "IDL" + name "default__Project" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "CreateMissingDirectories" + value TRUE) + (object Attribute + tool "IDL" + name "StopOnError" + value TRUE) + (object Attribute + tool "IDL" + name "Directory" + value "AUTO GENERATE") + (object Attribute + tool "IDL" + name "GeneratePreserveRegions" + value TRUE))) + (object Attribute + tool "IDL" + name "default__Class" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "ImplementationType" + value "") + (object Attribute + tool "IDL" + name "ConstValue" + value "") + (object Attribute + tool "IDL" + name "GenerateDefaultSpecifier" + value FALSE) + (object Attribute + tool "IDL" + name "DefaultSpecifier" + value "") + (object Attribute + tool "IDL" + name "IDLElement" + value TRUE) + (object Attribute + tool "IDL" + name "IDLSpecificationType" + value ("IDLSpecSet" 22)) + (object Attribute + tool "IDL" + name "IDLSpecSet" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "Interface" + value 22) + (object Attribute + tool "IDL" + name "Typedef" + value 54) + (object Attribute + tool "IDL" + name "Enumeration" + value 8) + (object Attribute + tool "IDL" + name "Const" + value 71) + (object Attribute + tool "IDL" + name "Exception" + value 61) + (object Attribute + tool "IDL" + name "Struct" + value 51) + (object Attribute + tool "IDL" + name "Union" + value 81))))) + (object Attribute + tool "IDL" + name "default__Module-Spec" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "Generate" + value TRUE) + (object Attribute + tool "IDL" + name "CmIdentification" + value (value Text " %X% %Q% %Z% %W%")) + (object Attribute + tool "IDL" + name "CopyrightNotice" + value (value Text "")) + (object Attribute + tool "IDL" + name "FileName" + value "AUTO GENERATE") + (object Attribute + tool "IDL" + name "GenerateIDLModule" + value FALSE) + (object Attribute + tool "IDL" + name "InclusionProtectionSymbol" + value "AUTO GENERATE") + (object Attribute + tool "IDL" + name "AdditionalIncludes" + value (value Text "")) + (object Attribute + tool "IDL" + name "IncludeBySimpleName" + value FALSE))) + (object Attribute + tool "IDL" + name "default__Module-Body" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "CmIdentification" + value (value Text " %X% %Q% %Z% %W%")) + (object Attribute + tool "IDL" + name "CopyrightNotice" + value (value Text "")) + (object Attribute + tool "IDL" + name "FileName" + value "AUTO GENERATE") + (object Attribute + tool "IDL" + name "AdditionalIncludes" + value (value Text "")) + (object Attribute + tool "IDL" + name "IncludeBySimpleName" + value FALSE))) + (object Attribute + tool "IDL" + name "default__Operation" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "OperationIsOneWay" + value FALSE) + (object Attribute + tool "IDL" + name "Context" + value "") + (object Attribute + tool "IDL" + name "Raises" + value ""))) + (object Attribute + tool "IDL" + name "default__Attribute" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "CaseSpecifier" + value "") + (object Attribute + tool "IDL" + name "GenerateDataMember" + value TRUE) + (object Attribute + tool "IDL" + name "DataMemberName" + value "$relationship") + (object Attribute + tool "IDL" + name "IsReadOnly" + value FALSE) + (object Attribute + tool "IDL" + name "IsConst" + value FALSE) + (object Attribute + tool "IDL" + name "ConstValue" + value ""))) + (object Attribute + tool "IDL" + name "default__Has" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "NameIfUnlabeled" + value "the_$supplier") + (object Attribute + tool "IDL" + name "GenerateDataMember" + value TRUE) + (object Attribute + tool "IDL" + name "DataMemberName" + value "$relationship") + (object Attribute + tool "IDL" + name "GenerateForwardReference" + value FALSE) + (object Attribute + tool "IDL" + name "IsReadOnly" + value FALSE) + (object Attribute + tool "IDL" + name "BoundedHasRelType" + value ("HasRelTypeSet" 47)) + (object Attribute + tool "IDL" + name "HasRelTypeSet" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "Array" + value 24) + (object Attribute + tool "IDL" + name "Sequence" + value 47))))) + (object Attribute + tool "IDL" + name "default__Role" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "NameIfUnlabeled" + value "the_$supplier") + (object Attribute + tool "IDL" + name "GenerateDataMember" + value TRUE) + (object Attribute + tool "IDL" + name "DataMemberName" + value "$relationship") + (object Attribute + tool "IDL" + name "GenerateForwardReference" + value FALSE) + (object Attribute + tool "IDL" + name "IsReadOnly" + value FALSE) + (object Attribute + tool "IDL" + name "BoundedRoleType" + value ("AssocTypeSet" 47)) + (object Attribute + tool "IDL" + name "AssocTypeSet" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "Array" + value 24) + (object Attribute + tool "IDL" + name "Sequence" + value 47))))) + (object Attribute + tool "IDL" + name "default__Uses" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "GenerateForwardReference" + value FALSE))) + (object Attribute + tool "IDL" + name "default__Subsystem" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "Directory" + value "AUTO GENERATE"))) + (object Attribute + tool "IDL" + name "HiddenTool" + value FALSE) + (object Attribute + tool "Java" + name "propertyId" + value "809135966") + (object Attribute + tool "Java" + name "default__Project" + value (list Attribute_Set + (object Attribute + tool "Java" + name "CreateMissingDirectories" + value TRUE) + (object Attribute + tool "Java" + name "StopOnError" + value FALSE) + (object Attribute + tool "Java" + name "Directory" + value "AUTO GENERATE") + (object Attribute + tool "Java" + name "UsePrefixes" + value FALSE) + (object Attribute + tool "Java" + name "InstanceVariablePrefix" + value "m_") + (object Attribute + tool "Java" + name "ClassVariablePrefix" + value "s_") + (object Attribute + tool "Java" + name "DefaultAttributeDataType" + value "int") + (object Attribute + tool "Java" + name "DefaultOperationReturnType" + value "void"))) + (object Attribute + tool "Java" + name "default__Class" + value (list Attribute_Set + (object Attribute + tool "Java" + name "Final" + value FALSE) + (object Attribute + tool "Java" + name "GenerateDefaultConstructor" + value TRUE) + (object Attribute + tool "Java" + name "ConstructorIs" + value ("Ctor_Set" 62)) + (object Attribute + tool "Java" + name "Ctor_Set" + value (list Attribute_Set + (object Attribute + tool "Java" + name "Public" + value 62) + (object Attribute + tool "Java" + name "Protected" + value 63) + (object Attribute + tool "Java" + name "Private" + value 64))) + (object Attribute + tool "Java" + name "GenerateFinalizer" + value FALSE) + (object Attribute + tool "Java" + name "GenerateStaticInitializer" + value FALSE) + (object Attribute + tool "Java" + name "GenerateInstanceInitializer" + value FALSE))) + (object Attribute + tool "Java" + name "default__Module-Spec" + value (list Attribute_Set + (object Attribute + tool "Java" + name "Generate" + value TRUE) + (object Attribute + tool "Java" + name "CmIdentification" + value (value Text "")) + (object Attribute + tool "Java" + name "CopyrightNotice" + value (value Text "")) + (object Attribute + tool "Java" + name "AdditionalImports" + value (value Text "")))) + (object Attribute + tool "Java" + name "default__Module-Body" + value (list Attribute_Set + (object Attribute + tool "Java" + name "Generate" + value TRUE) + (object Attribute + tool "Java" + name "CmIdentification" + value (value Text "")) + (object Attribute + tool "Java" + name "CopyrightNotice" + value (value Text "")) + (object Attribute + tool "Java" + name "AdditionalImports" + value (value Text "")))) + (object Attribute + tool "Java" + name "default__Operation" + value (list Attribute_Set + (object Attribute + tool "Java" + name "Abstract" + value FALSE) + (object Attribute + tool "Java" + name "Static" + value FALSE) + (object Attribute + tool "Java" + name "Final" + value FALSE) + (object Attribute + tool "Java" + name "Native" + value FALSE) + (object Attribute + tool "Java" + name "Synchronized" + value FALSE))) + (object Attribute + tool "Java" + name "default__Attribute" + value (list Attribute_Set + (object Attribute + tool "Java" + name "GenerateDataMember" + value TRUE) + (object Attribute + tool "Java" + name "Final" + value FALSE) + (object Attribute + tool "Java" + name "Transient" + value FALSE) + (object Attribute + tool "Java" + name "Volatile" + value FALSE))) + (object Attribute + tool "Java" + name "default__Role" + value (list Attribute_Set + (object Attribute + tool "Java" + name "GenerateDataMember" + value TRUE) + (object Attribute + tool "Java" + name "ContainerClass" + value "") + (object Attribute + tool "Java" + name "InitialValue" + value "") + (object Attribute + tool "Java" + name "Final" + value FALSE) + (object Attribute + tool "Java" + name "Transient" + value FALSE) + (object Attribute + tool "Java" + name "Volatile" + value FALSE))) + (object Attribute + tool "Java" + name "HiddenTool" + value FALSE) + (object Attribute + tool "SCC" + name "HiddenTool" + value FALSE)) + quid "3659ABB2006F")) diff --git a/docs/manual.bib b/docs/manual.bib new file mode 100644 index 00000000..57baa038 --- /dev/null +++ b/docs/manual.bib @@ -0,0 +1,185 @@ +@InProceedings{ada, + author = {Tucker Taft}, + title = {\protect{Programming the Internet in Ada95}}, + booktitle = {Proceedings Ada-Europe International Conference on + Reliable Software Technologies}, + year = {1996} +} + +@InProceedings{agesen, + author = {O. Agesen and S. N. Freund and J. C. Mitchell}, + title = {\protect{Adding Type Parameterization to the Java + Language}}, + booktitle = {Proceedings OOPSLA'97}, + year = {1997}, + address = {Atlanta, GA} +} + +@TechReport{aspect, + author = {Gregor Kiczales and John Lamping and Anurag + Mendhekar and Chris Maeda and Cristina Lopes and + Jean-Marc Loingtier and John Irwin}, + title = {\protect{Aspect-Oriented Programming}}, + institution = {Xerox Palo Alto Research Center}, + year = {1997}, + key = {SPL97-008 P9710042} +} + +@TechReport{barat, + author = {B. Bokowski and A. Spiegel}, + title = {\protect{Barat -- A Front-End for Java}}, + institution = {Freie Universit\"at Berlin}, + year = {1998}, + key = {B-98-09} +} + +@InProceedings{bca, + author = {Ralph Keller and Urs H{\"o}lzle}, + title = {\protect{Binary Component Adaptation}}, + booktitle = {Proceedings ECOOP'98}, + publisher = {Springer}, + editor = {Eric Jul}, + year = {1998} +} + +@InProceedings{bit, + author = {Han Bok Lee and Benjamin G. Zorn}, + title = {\protect{BIT: A Tool for Instrumenting Java + Bytecodes}}, + booktitle = {Proceedings USENIX Symposium on Internet + Technologies and Systems}, + year = {1998} +} + +@Manual{classfile, + title = {The classfile API}, + author = {Shawn Silverman}, + organization = {University of Manitoba}, + address = {\url{http://Meurrens.ML.org/ip-Links/java/codeEngineering/viewers.html}}, + year = {1998} +} + +@Manual{classfilters, + title = {The ClassFilters package}, + author = {Pascal Costanza}, + organization = {Universit{\"a}t Bonn}, + address = {\url{http://www.cs.uni-bonn.de/~costanza/ClassFilters/}}, + year = {1998} +} + +@InProceedings{classloader, + author = {Sheng Lian and Gilad Bracha}, + title = {\protect{Dynamic Class Loading in the Java Virtual + Machine}}, + booktitle = {Proceedings OOPSLA'98}, + year = {1998} +} + +@Book{design, + author = {E. Gamma and R. Helm and R. Johnson and + J. Vlissides}, + title = {Design Patterns: Elements of Reusable + Object-Oriented Software}, + publisher = {Addison-Wesley}, + year = {1995} +} + +@InProceedings{eiffel, + author = {Suzanne Collin and Dominique Colnet and Olivier + Zendra}, + title = {\protect{Type Inference for Late Binding. The + SmallEiffel Compiler}}, + booktitle = {Proceedings JMLC'97}, + year = {1997} +} + +@Book{gosling, + author = {J. Gosling and B. Joy and G. Steele}, + title = {The Java Language Specification}, + publisher = {Addison-Wesley}, + year = {1996} +} + +@Manual{inside, + title = {Inside Java Class Files}, + author = {Matt T. Yourst}, + organization = {Laserstars Technologies}, + address = + {\url{http://www.laserstars.com/articles/ddj/insidejcf/}}, + year = {1998} +} + +@Book{jasmin, + author = {J. Meyer and T. Downing}, + title = {Java Virtual Machine}, + publisher = {O'Reilly}, + year = {1997} +} + +@InProceedings{jawa, + author = {C. Fischer and D. Meemken}, + title = {\protect{JaWa: Java with Assertions}}, + editor = {Clemens Cap}, + booktitle = {Proceedings JIT'98}, + publisher = {Springer}, + year = {1998} +} + +@InProceedings{joie, + author = {Geoff Cohen and Jeff Chase and David Kaminsky}, + title = {\protect{Automatic Program Transformation with + JOIE}}, + booktitle = {Proceedings USENIX Annual Technical Symposium}, + year = {1998} +} + +@Book{jvm, + author = {Tim Lindholm and Frank Yellin}, + title = {The Java Virtual Machine Specification}, + publisher = {Addison-Wesley}, + year = {1997} +} + +@InProceedings{myers, + author = {A.C. Myers and J. A. Bank and B. Liskov}, + title = {\protect{Parameterized Types for Java}}, + booktitle = {Proceedings POPL'97}, + year = {1997}, + address = {Paris, France} +} + +@InProceedings{pmg, + author = {B. Bokowski and M. Dahm}, + title = {\protect{Poor Man's Genericity for Java}}, + publisher = {Springer}, + editor = {Clemens Cap}, + booktitle = {Proceedings JIT'98}, + year = {1998} +} + +@Manual{reflection, + title = {Reflection API}, + author = {JavaSoft}, + address = {\url{http://java.sun.com/products/jdk/1.1/docs/guide/reflection/}}, + year = {1998} +} + +@InProceedings{statistic, + author = {D. Antonioli and M. Pilz}, + title = {\protect{Statistische Analyse von Java-Classfiles}}, + publisher = {Springer}, + editor = {Clemens Cap}, + booktitle = {Proceedings JIT'98}, + year = {1998} +} + +@InProceedings{thies, + author = {M. Thies and U. Kastens}, + title = {\protect{Statische Analyse von Bibliotheken als + Grundlage dynamischer Optimierung}}, + publisher = {Springer}, + editor = {Clemens Cap}, + booktitle = {Proceedings JIT'98}, + year = {1998}, +} + diff --git a/docs/manual.ps b/docs/manual.ps new file mode 100644 index 00000000..c6024074 --- /dev/null +++ b/docs/manual.ps @@ -0,0 +1,4988 @@ +%!PS-Adobe-2.0 +%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software +%%Title: manual.dvi +%%Pages: 31 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%DocumentFonts: Palatino-Roman Palatino-Bold Courier Palatino-Italic +%%+ Helvetica Helvetica-Oblique Courier-Bold +%%DocumentPaperSizes: a4 +%%EndComments +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: /usr/bin/dvips manual.dvi +%DVIPSParameters: dpi=600, compressed +%DVIPSSource: TeX output 2001.10.08:1345 +%%BeginProcSet: texc.pro +%! +/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S +N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 +mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 +0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ +landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize +mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ +matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round +exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ +statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] +N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin +/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array +/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 +array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N +df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A +definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get +}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} +B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr +1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 +1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx +0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx +sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ +rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp +gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B +/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ +/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ +A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy +get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} +ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp +fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 +{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add +chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ +1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} +forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn +/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put +}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ +bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A +mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ +SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ +userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X +1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 +index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N +/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ +/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) +(LaserWriter 16/600)]{A length product length le{A length product exch 0 +exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse +end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask +grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} +imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round +exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto +fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p +delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} +B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ +p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S +rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end + +%%EndProcSet +%%BeginProcSet: 8r.enc +% @@psencodingfile@{ +% author = "S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry", +% version = "0.6", +% date = "22 June 1996", +% filename = "8r.enc", +% email = "kb@@mail.tug.org", +% address = "135 Center Hill Rd. // Plymouth, MA 02360", +% codetable = "ISO/ASCII", +% checksum = "119 662 4424", +% docstring = "Encoding for TrueType or Type 1 fonts to be used with TeX." +% @} +% +% Idea is to have all the characters normally included in Type 1 fonts +% available for typesetting. This is effectively the characters in Adobe +% Standard Encoding + ISO Latin 1 + extra characters from Lucida. +% +% Character code assignments were made as follows: +% +% (1) the Windows ANSI characters are almost all in their Windows ANSI +% positions, because some Windows users cannot easily reencode the +% fonts, and it makes no difference on other systems. The only Windows +% ANSI characters not available are those that make no sense for +% typesetting -- rubout (127 decimal), nobreakspace (160), softhyphen +% (173). quotesingle and grave are moved just because it's such an +% irritation not having them in TeX positions. +% +% (2) Remaining characters are assigned arbitrarily to the lower part +% of the range, avoiding 0, 10 and 13 in case we meet dumb software. +% +% (3) Y&Y Lucida Bright includes some extra text characters; in the +% hopes that other PostScript fonts, perhaps created for public +% consumption, will include them, they are included starting at 0x12. +% +% (4) Remaining positions left undefined are for use in (hopefully) +% upward-compatible revisions, if someday more characters are generally +% available. +% +% (5) hyphen appears twice for compatibility with both ASCII and Windows. +% +/TeXBase1Encoding [ +% 0x00 (encoded characters from Adobe Standard not in Windows 3.1) + /.notdef /dotaccent /fi /fl + /fraction /hungarumlaut /Lslash /lslash + /ogonek /ring /.notdef + /breve /minus /.notdef +% These are the only two remaining unencoded characters, so may as +% well include them. + /Zcaron /zcaron +% 0x10 + /caron /dotlessi +% (unusual TeX characters available in, e.g., Lucida Bright) + /dotlessj /ff /ffi /ffl + /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef + % very contentious; it's so painful not having quoteleft and quoteright + % at 96 and 145 that we move the things normally found there down to here. + /grave /quotesingle +% 0x20 (ASCII begins) + /space /exclam /quotedbl /numbersign + /dollar /percent /ampersand /quoteright + /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash +% 0x30 + /zero /one /two /three /four /five /six /seven + /eight /nine /colon /semicolon /less /equal /greater /question +% 0x40 + /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O +% 0x50 + /P /Q /R /S /T /U /V /W + /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore +% 0x60 + /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o +% 0x70 + /p /q /r /s /t /u /v /w + /x /y /z /braceleft /bar /braceright /asciitilde + /.notdef % rubout; ASCII ends +% 0x80 + /.notdef /.notdef /quotesinglbase /florin + /quotedblbase /ellipsis /dagger /daggerdbl + /circumflex /perthousand /Scaron /guilsinglleft + /OE /.notdef /.notdef /.notdef +% 0x90 + /.notdef /.notdef /.notdef /quotedblleft + /quotedblright /bullet /endash /emdash + /tilde /trademark /scaron /guilsinglright + /oe /.notdef /.notdef /Ydieresis +% 0xA0 + /.notdef % nobreakspace + /exclamdown /cent /sterling + /currency /yen /brokenbar /section + /dieresis /copyright /ordfeminine /guillemotleft + /logicalnot + /hyphen % Y&Y (also at 45); Windows' softhyphen + /registered + /macron +% 0xD0 + /degree /plusminus /twosuperior /threesuperior + /acute /mu /paragraph /periodcentered + /cedilla /onesuperior /ordmasculine /guillemotright + /onequarter /onehalf /threequarters /questiondown +% 0xC0 + /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla + /Egrave /Eacute /Ecircumflex /Edieresis + /Igrave /Iacute /Icircumflex /Idieresis +% 0xD0 + /Eth /Ntilde /Ograve /Oacute + /Ocircumflex /Otilde /Odieresis /multiply + /Oslash /Ugrave /Uacute /Ucircumflex + /Udieresis /Yacute /Thorn /germandbls +% 0xE0 + /agrave /aacute /acircumflex /atilde + /adieresis /aring /ae /ccedilla + /egrave /eacute /ecircumflex /edieresis + /igrave /iacute /icircumflex /idieresis +% 0xF0 + /eth /ntilde /ograve /oacute + /ocircumflex /otilde /odieresis /divide + /oslash /ugrave /uacute /ucircumflex + /udieresis /yacute /thorn /ydieresis +] def + +%%EndProcSet +%%BeginProcSet: texps.pro +%! +TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 +index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll +exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics +exch def dict begin Encoding{exch dup type/integertype ne{pop pop 1 sub +dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def} +ifelse}forall Metrics/Metrics currentdict end def[2 index currentdict +end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{ +dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 +roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def +dup[exch{dup CharStrings exch known not{pop/.notdef/Encoding true def} +if}forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def} +def end + +%%EndProcSet +%%BeginProcSet: special.pro +%! +TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N +/vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N +/rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N +/@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ +/hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho +X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B +/@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ +/urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known +{userdict/md get type/dicttype eq{userdict begin md length 10 add md +maxlength ge{/md md dup length 20 add dict copy def}if end md begin +/letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S +atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ +itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll +transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll +curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf +pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} +if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 +-1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 +get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip +yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub +neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ +noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop +90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get +neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr +1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr +2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 +-1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S +TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ +Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale +}if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState +save N userdict maxlength dict begin/magscale true def normalscale +currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts +/psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x +psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx +psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub +TR/showpage{}N/erasepage{}N/copypage{}N/p 3 def @MacSetUp}N/doclip{ +psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 +roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath +moveto}N/endTexFig{end psf$SavedState restore}N/@beginspecial{SDict +begin/SpecialSave save N gsave normalscale currentpoint TR +@SpecialDefaults count/ocount X/dcount countdictstack N}N/@setspecial{ +CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto +closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx +sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR +}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse +CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury +lineto closepath clip}if/showpage{}N/erasepage{}N/copypage{}N newpath}N +/@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{end} +repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N +/@fedspecial{end}B/li{lineto}B/rl{rlineto}B/rc{rcurveto}B/np{/SaveX +currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY +moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X +/yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0 +1 startangle endangle arc savematrix setmatrix}N end + +%%EndProcSet +TeXDict begin 39158280 55380996 1000 600 600 (manual.dvi) +@start /Fa 145[60 60 3[60 3[60 3[60 97[{TeXBase1Encoding ReEncodeFont}5 +99.6264 /Courier-Bold rf +%DVIPSBitmapFont: Fb cmr8 8 1 +/Fb 1 44 df43 +D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fc cmr10 10.95 1 +/Fc 1 62 df<007FB912E0BA12F0A26C18E0CDFCAE007FB912E0BA12F0A26C18E03C167B +A147>61 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fd cmsy10 10.95 1 +/Fd 1 55 df<176017F01601A2EE03E0A2EE07C0A2EE0F80A2EE1F00A2163EA25EA25EA2 +4B5AA24B5AA24B5AA24B5AA24BC7FCA2153EA25DA25DA24A5AA24A5AA24A5AA24A5AA24A +C8FCA2143EA25CA25CA2495AA2495AA2495AA2495AA249C9FCA2133EA25BA25BA2485AA2 +485AA2485AA2485AA248CAFCA2123EA25AA25AA25A12602C5473C000>54 +D E +%EndDVIPSBitmapFont +/Fe 179[51 6[61 1[66 61 66[{TeXBase1Encoding ReEncodeFont}4 +90.9091 /Helvetica rf /Ff 103[55 26[55 55 55 55 55 55 +55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +55 55 55 55 55 55 55 1[55 1[55 3[55 55 55 55 55 55 55 +55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 1[55 +55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 +55 55 55 55 55 55 55 2[55 55 55 33[{TeXBase1Encoding ReEncodeFont}86 +90.9091 /Courier rf /Fg 107[50 25[50 55 50 83 55 61 33 +44 39 1[61 55 61 89 33 61 33 33 61 55 39 50 61 44 61 +50 12[66 61 2[61 83 1[100 61 2[39 83 83 55 61 83 72 1[78 +6[25 1[50 50 50 50 50 50 50 50 2[25 33 5[28 35[61 61 +2[{TeXBase1Encoding ReEncodeFont}54 99.6264 /Palatino-Bold +rf /Fh 134[60 60 60 60 60 60 60 60 60 60 60 60 60 60 +60 60 60 60 60 60 60 60 60 60 60 3[60 1[60 3[60 60 2[60 +60 1[60 60 60 60 60 2[60 60 1[60 60 1[60 60 60 5[60 8[60 +1[60 60 60 60 60 2[60 60 5[60 34[{TeXBase1Encoding ReEncodeFont}53 +99.6264 /Courier rf /Fi 135[50 50 50 1[50 50 50 1[50 +50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 38[50 10[50 +50 46[{TeXBase1Encoding ReEncodeFont}25 83.022 /Courier +rf /Fj 135[43 1[47 50 27 35 33 1[50 45 48 73 24 1[19 +24 48 46 1[40 51 37 46 42 12[51 18[65 18[21 28 21 44[{ +TeXBase1Encoding ReEncodeFont}25 83.022 /Palatino-Roman +rf /Fk 205[29 29 49[{TeXBase1Encoding ReEncodeFont}2 +58.1154 /Palatino-Roman rf /Fm 134[66 60 100 66 73 40 +53 47 1[73 66 73 106 40 73 40 40 73 1[47 60 73 53 1[60 +9[120 2[80 1[86 1[73 2[120 2[47 1[100 100 3[86 80 93 +10[60 60 60 60 60 60 2[30 43[73 2[{TeXBase1Encoding ReEncodeFont}41 +119.552 /Palatino-Bold rf /Fn 205[33 33 49[{ +TeXBase1Encoding ReEncodeFont}2 66.4176 /Palatino-Roman +rf /Fo 179[55 6[66 1[72 66 66[{TeXBase1Encoding ReEncodeFont}4 +99.6264 /Helvetica rf /Fp 134[50 2[50 55 33 39 39 1[50 +44 55 1[28 2[28 50 50 1[39 50 41 46 44 97[{ +TeXBase1Encoding ReEncodeFont}18 99.6264 /Palatino-Italic +rf /Fq 107[50 50 24[50 55 51 83 56 60 32 42 39 56 60 +54 58 88 29 55 23 29 58 55 33 48 61 44 55 50 3[33 1[33 +66 66 1[100 72 78 61 52 67 1[60 78 83 94 61 72 33 34 +83 76 55 61 77 71 61 78 6[25 50 50 50 50 50 50 50 50 +50 50 1[25 33 25 2[33 33 28 1[84 33[61 60 2[{ +TeXBase1Encoding ReEncodeFont}74 99.6264 /Palatino-Roman +rf /Fr 135[72 1[80 88 48 64 56 1[88 80 88 128 48 2[48 +88 1[56 72 88 64 1[72 10[112 1[96 1[104 1[88 2[143 88 +1[56 56 1[120 1[88 1[104 96 112 12[72 72 72 72 49[{ +TeXBase1Encoding ReEncodeFont}35 143.462 /Palatino-Bold +rf /Fs 134[45 45 66 45 51 30 35 35 1[45 40 51 71 25 40 +25 25 45 45 25 35 45 37 42 40 8[66 1[66 71 56 51 61 1[56 +71 71 86 51 1[30 30 2[51 56 71 61 1[66 6[23 45 45 45 +9[30 5[25 35[50 48 2[{TeXBase1Encoding ReEncodeFont}50 +90.9091 /Palatino-Italic rf /Ft 87[30 17[45 1[45 45 24[45 +51 47 76 51 55 30 39 36 51 55 50 53 80 26 51 21 26 53 +51 30 44 56 40 50 45 3[30 1[30 61 61 61 91 66 71 56 48 +61 1[55 71 76 86 56 66 30 31 76 69 51 56 70 64 56 71 +5[23 23 45 45 45 45 45 45 45 45 45 45 55 23 30 23 2[30 +30 25 35[55 55 2[{TeXBase1Encoding ReEncodeFont}78 90.9091 +/Palatino-Roman rf /Fu 139[39 1[47 2[65 9[57 1[53 66 +18[94 22[60 5[60 60 60 3[30 44[{TeXBase1Encoding ReEncodeFont}12 +119.552 /Palatino-Roman rf /Fv 138[72 1[72 72 3[72 72 +72 72 1[72 72 2[72 72 1[72 72 32[72 17[72 46[{ +TeXBase1Encoding ReEncodeFont}15 119.552 /Courier rf +/Fw 138[87 1[61 57 4[127 1[80 2[83 6[72 19[136 8[111 +68[{TeXBase1Encoding ReEncodeFont}9 143.462 /Palatino-Roman +rf /Fx 139[30 40 35 2[51 56 4[30 3[45 1[40 56 45 10[71 +20[71 15[45 45 1[23 46[{TeXBase1Encoding ReEncodeFont}15 +90.9091 /Palatino-Bold rf /Fy 134[96 3[104 56 73 68 1[103 +94 100 152 50 2[50 1[96 1[82 105 76 95 86 20[105 6[105 +133 122 105 24[57 57 40[{TeXBase1Encoding ReEncodeFont}24 +172.188 /Palatino-Roman rf end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%BeginPaperSize: a4 +a4 +%%EndPaperSize + +%%EndSetup +%%Page: 1 1 +1 0 bop 429 814 a Fy(Byte)44 b(Code)g(Engineering)g(Library)g(\(BCEL\)) +749 1021 y(Description)h(and)f(usage)f(manual)1685 1229 +y Fx(V)-10 b(ersion)23 b(1.0)1452 1528 y Fw(Markus)35 +b(Dahm)1159 1826 y Fv(markus.dahm@berlin.de)1507 2066 +y Fu(October)c(8,)f(2001)1738 2421 y Fx(Abstract)380 +2581 y Ft(Extensions)k(and)i(impr)n(ovements)f(of)h(the)g(pr)n +(ogramming)g(language)g(Java)h(and)f(its)g(r)n(e-)244 +2693 y(lated)26 b(execution)e(envir)n(onment)i(\(Java)i(V)-5 +b(irtual)26 b(Machine,)h(JVM\))g(ar)n(e)f(the)f(subject)g(of)h(a)h(lar) +n(ge)244 2806 y(number)f(of)h(r)n(esear)n(ch)f(pr)n(ojects)g(and)g(pr)n +(oposals.)39 b(Ther)n(e)25 b(ar)n(e)i(pr)n(ojects,)f(for)h(instance,)g +(to)f(add)244 2919 y(parameterized)17 b(types)e(to)i(Java,)j(to)d +(implement)g(\223Aspect-Oriented)f(Pr)n(ogramming\224,)j(to)d(per)n(-) +244 3032 y(form)23 b(sophisticated)e(static)i(analysis,)f(and)h(to)f +(impr)n(ove)h(the)f(r)o(un-time)h(performance.)380 3145 +y(Since)c(Java)i(classes)d(ar)n(e)i(compiled)f(into)f(portable)h +(binary)h(class)f(\002les)g(\(called)h Fs(byte)g(code)p +Ft(\),)h(it)244 3258 y(is)e(the)f(most)g(convenient)g(and)h +(platform-independent)e(way)i(to)f(implement)h(these)e(impr)n(ove-)244 +3371 y(ments)k(not)g(by)h(writing)g(a)g(new)f(compiler)i(or)e(changing) +h(the)f(JVM,)h(but)g(by)g(transforming)f(the)244 3484 +y(byte)j(code.)33 b(These)23 b(transformations)h(can)h(either)f(be)h +(performed)e(after)h(compile-time,)i(or)e(at)244 3597 +y(load-time.)44 b(Many)28 b(pr)n(ogrammers)f(ar)n(e)h(doing)f(this)h +(by)g(implementing)g(their)f(own)g(special-)244 3710 +y(ized)32 b(byte)e(code)h(manipulation)i(tools,)f(which)h(ar)n(e,)g +(however)-7 b(,)33 b(r)n(estricted)d(in)i(the)f(range)g(of)244 +3823 y(their)22 b(r)n(e-usability)-10 b(.)380 3935 y(T)i(o)27 +b(deal)h(with)g(the)f(necessary)f(class)i(\002le)g(transformations,)g +(we)f(intr)n(oduce)g(an)h(API)f(that)244 4048 y(helps)22 +b(developers)e(to)i(conveniently)g(implement)h(their)f +(transformations.)0 4392 y Fr(1)143 b(Introduction)0 +4620 y Fq(The)32 b(Java)g(language)g([GJS96])h(has)f(become)g(very)h +(popular)f(and)g(many)g(r)n(esear)n(ch)h(pr)n(ojects)h(deal)0 +4741 y(with)28 b(further)g(impr)n(ovements)h(of)e(the)h(language)f(or)h +(its)g(r)o(un-time)g(behavior)-7 b(.)38 b(The)27 b(possibility)i(to)0 +4861 y(extend)e(a)f(language)h(with)g(new)f(concepts)i(is)f(sur)n(ely)g +(a)g(desirable)f(featur)n(e,)h(but)h(implementation)0 +4981 y(issues)37 b(should)h(be)e(hidden)h(fr)n(om)g(the)g(user)-7 +b(.)67 b(Fortunately)-11 b(,)42 b(the)37 b(concepts)h(of)f(the)g(Java)g +(V)-5 b(irtual)0 5102 y(Machine)23 b(permit)g(the)g(user)n(-transpar)n +(ent)i(implementation)f(of)f(such)h(extensions)g(with)f(r)n(elatively)0 +5222 y(little)j(ef)n(fort.)146 5342 y(Because)20 b(the)h(tar)n(get)h +(language)f(of)g(Java)f(is)h(an)f(interpr)n(eted)h(language)g(with)g(a) +f(small)h(and)f(easy-)0 5463 y(to-understand)i(set)f(of)g(instr)o +(uctions)i(\(the)e Fp(byte)f(code)p Fq(\),)h(developers)g(can)g +(implement)f(and)g(test)h(their)1888 5712 y(1)p eop +%%Page: 2 2 +2 1 bop 0 407 a Fq(concepts)32 b(in)g(a)f(very)h(elegant)f(way)-11 +b(.)50 b(One)32 b(can)f(write)h(a)f(plug-in)h(r)n(eplacement)f(for)i +(the)e(system's)0 527 y(class)38 b(loader)g(which)g(is)g(r)n +(esponsible)h(for)g(dynamically)f(loading)g(class)g(\002les)h(at)f(r)o +(un-time)g(and)0 648 y(passing)30 b(the)h(byte)f(code)g(to)h(the)f(V)-5 +b(irtual)31 b(Machine)e(\(see)h(section)h(4.1\).)46 b(Class)30 +b(loaders)g(may)g(thus)0 768 y(be)f(used)f(to)i(inter)n(cept)g(the)f +(loading)g(pr)n(ocess)h(and)f(transform)i(classes)e(befor)n(e)g(they)h +(get)f(actually)0 888 y(executed)c(by)h(the)g(JVM)f([LB98].)31 +b(While)25 b(the)g(original)h(class)g(\002les)g(always)f(r)n(emain)g +(unalter)n(ed,)h(the)0 1009 y(behavior)32 b(of)g(the)f(class)h(loader)f +(may)g(be)g(r)n(econ\002gur)n(ed)i(for)f(every)g(execution)g(or)g +(instr)o(umented)0 1129 y(dynamically)-11 b(.)146 1249 +y(The)34 b Fo(BCEL)40 b Fq(API)33 b(\(Byte)i(Code)f(Engineering)h +(Library\),)i(formerly)f(known)f(as)f(JavaClass,)j(is)0 +1370 y(a)h(toolkit)i(for)e(the)g(static)h(analysis)g(and)e(dynamic)h +(cr)n(eation)h(or)g(transformation)h(of)f(Java)e(class)0 +1490 y(\002les.)70 b(It)37 b(enables)h(developers)g(to)g(implement)g +(the)g(desir)n(ed)g(featur)n(es)g(on)g(a)g(high)g(level)g(of)g(ab-)0 +1611 y(straction)30 b(without)g(handling)f(all)f(the)g(internal)h +(details)f(of)h(the)g(Java)f(class)h(\002le)g(format)g(and)f(thus)0 +1731 y(r)n(e-inventing)e(the)f(wheel)f(every)h(time.)31 +b Fo(BCEL)e Fq(is)24 b(written)i(entir)n(ely)g(in)e(Java)h(and)f(fr)n +(eely)h(available)0 1851 y(under)g(the)g(terms)h(of)f(the)g(Apache)f +(License.)1752 1815 y Fn(1)146 1972 y Fq(This)33 b(paper)f(is)g(str)o +(uctur)n(ed)i(as)f(follows:)46 b(W)-9 b(e)31 b(give)i(a)f(brief)g +(description)i(of)e(the)h(Java)f(V)-5 b(irtual)0 2092 +y(Machine)40 b(and)f(the)h(class)g(\002le)g(format)h(in)f(section)h(2.) +75 b(Section)41 b(3)e(intr)n(oduces)j(the)d Fo(BCEL)46 +b Fq(API.)0 2213 y(Section)28 b(4)e(describes)h(some)g(typical)g +(application)g(ar)n(eas)g(and)f(example)g(pr)n(ojects.)38 +b(The)26 b(appendix)0 2333 y(contains)k(code)f(examples)g(that)h(ar)n +(e)f(to)h(long)f(to)h(be)f(pr)n(esented)g(in)g(the)g(main)g(part)h(of)f +(this)h(paper)-7 b(.)0 2453 y(All)24 b(examples)h(ar)n(e)g(included)g +(in)g(the)g(down-loadable)g(distribution.)0 2749 y Fm(1.1)119 +b(Related)29 b(work)0 2939 y Fq(Ther)n(e)37 b(ar)n(e)g(a)g(number)g(of) +g(pr)n(oposals)i(and)d(class)i(libraries)f(that)h(have)f(some)g +(similarities)g(with)2 3059 y(B)t(C)t(E)t(L)r(:)28 b(The)e(JOIE)f +([CCK98)o(])h(toolkit)h(can)f(be)f(used)g(to)h(instr)o(ument)h(class)f +(loaders)g(with)g(dynamic)0 3180 y(behavior)-7 b(.)73 +b(Similarly)-11 b(,)43 b(\223Binary)c(Component)h(Adaptation\224)e +([KH98])i(allows)f(components)h(to)0 3300 y(be)30 b(adapted)g(and)h +(evolved)g(on-the-\003y)-11 b(.)48 b(Han)30 b(Lee's)g(\223Byte-code)i +(Instr)o(umenting)g(T)-9 b(ool\224)31 b([LZ98])0 3421 +y(allows)20 b(the)g(user)g(to)g(insert)g(calls)g(to)g(analysis)g +(methods)g(anywher)n(e)g(in)g(the)f(byte)h(code.)30 b(The)19 +b(Jasmin)0 3541 y(language)i([MD97])g(can)f(be)h(used)f(to)i +(hand-write)f(or)g(generate)g(pseudo-assembler)g(code.)30 +b(D-Java)0 3661 y([Sil98])25 b(and)g(JCF)g([Y)-9 b(ou98])25 +b(ar)n(e)g(class)h(viewing)f(tools.)146 3782 y(In)f(contrast)h(to)g +(these)f(pr)n(ojects,)h Fo(BCEL)j Fq(is)c(intended)f(to)i(be)e(a)h +(general)g(purpose)g(tool)h(for)g(\223byte)0 3902 y(code)31 +b(engineering\224.)48 b(It)30 b(gives)h(full)g(contr)n(ol)i(to)e(the)g +(developer)f(on)h(a)g(high)g(level)f(of)h(abstraction)0 +4022 y(and)25 b(is)g(not)g(r)n(estricted)i(to)f(any)f(particular)h +(application)f(ar)n(ea.)0 4363 y Fr(2)143 b(The)35 b(Java)g(V)-8 +b(irtual)34 b(Machine)0 4590 y Fq(Readers)f(alr)n(eady)h(familiar)g +(with)g(the)g(Java)g(V)-5 b(irtual)34 b(Machine)g(and)f(the)h(Java)g +(class)g(\002le)g(format)0 4711 y(may)25 b(want)g(to)h(skip)g(this)f +(section)h(and)f(pr)n(oceed)g(with)g(section)h(3.)146 +4831 y(Pr)n(ograms)34 b(written)g(in)e(the)g(Java)h(language)f(ar)n(e)h +(compiled)f(into)h(a)f(portable)h(binary)g(format)0 4951 +y(called)27 b Fp(byte)g(code)p Fq(.)38 b(Every)27 b(class)h(is)g(r)n +(epr)n(esented)g(by)f(a)h(single)f(class)h(\002le)f(containing)i(class) +f(r)n(elated)0 5072 y(data)g(and)f(byte)i(code)f(instr)o(uctions.)42 +b(These)27 b(\002les)h(ar)n(e)g(loaded)f(dynamically)i(into)f(an)g +(interpr)n(eter)0 5192 y(\(Java)d(V)-5 b(irtual)25 b(Machine,)g(JVM\))g +(and)g(executed.)p 0 5271 1530 4 v 116 5333 a Fk(1)149 +5363 y Fj(The)c(distribution)g(is)g(available)e(at)h +Fi(http://jakarta.apache.org/bcel/)p Fj(,)14 b(including)21 +b(several)f(code)g(ex-)0 5463 y(amples)h(and)f(javadoc)g(manuals.)1888 +5712 y Fq(2)p eop +%%Page: 3 3 +3 2 bop 146 407 a Fq(Figur)n(e)21 b(1)f(illustrates)i(the)e(pr)n +(ocedur)n(e)h(of)g(compiling)f(and)g(executing)h(a)f(Java)g(class:)29 +b(The)20 b(sour)n(ce)0 527 y(\002le)f(\()p Fh(HelloWorld.java)p +Fq(\))d(is)j(compiled)g(into)h(a)e(Java)i(class)f(\002le)g(\()p +Fh(HelloWorld.class)p Fq(\),)e(loaded)0 648 y(by)32 b(the)f(byte)h +(code)g(interpr)n(eter)g(and)f(executed.)51 b(In)30 b(or)n(der)j(to)f +(implement)f(additional)g(featur)n(es,)0 768 y(r)n(esear)n(chers)k(may) +e(want)h(to)g(transform)h(class)f(\002les)g(\(drawn)f(with)h(bold)g +(lines\))f(befor)n(e)h(they)g(get)0 888 y(actually)26 +b(executed.)31 b(This)25 b(application)g(ar)n(ea)g(is)g(one)g(of)h(the) +f(main)f(issues)i(of)f(this)h(article.)0 2794 y @beginspecial +0 @llx 0 @lly 439 @urx 199 @ury 4590 @rwi @setspecial +%%BeginDocument: eps/jvm.eps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: jvm.eps +%%Creator: fig2dev Version 3.2 Patchlevel 1 +%%CreationDate: Thu Nov 19 11:55:18 1998 +%%For: dahm@che (Markus Dahm,,,,,) +%%Orientation: Portrait +%%BoundingBox: 0 0 439 199 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +-17.0 217.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n -1000 4612 m -1000 -1000 l 8588 -1000 l 8588 4612 l cp clip + 0.06000 0.06000 sc +/Courier ff 285.00 scf sf +6600 1575 m +gs 1 -1 sc (java) col0 sh gr +/Courier ff 285.00 scf sf +2550 1575 m +gs 1 -1 sc (javac) col0 sh gr +/Courier-Bold ff 150.00 scf sf +4290 1155 m +gs 1 -1 sc (08 1a 42 ...) col0 sh gr +/Courier-Bold ff 150.00 scf sf +4290 990 m +gs 1 -1 sc (ca fe ba be) col0 sh gr +% Polyline +7.500 slw +n 6405 1200 m 6300 1200 6300 1695 105 arcto 4 {pop} repeat + 6300 1800 7395 1800 105 arcto 4 {pop} repeat + 7500 1800 7500 1305 105 arcto 4 {pop} repeat + 7500 1200 6405 1200 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +n 2505 1200 m 2400 1200 2400 1695 105 arcto 4 {pop} repeat + 2400 1800 3495 1800 105 arcto 4 {pop} repeat + 3600 1800 3600 1305 105 arcto 4 {pop} repeat + 3600 1200 2505 1200 105 arcto 4 {pop} repeat + cp gs col0 s gr +% Polyline +30.000 slw +gs clippath +2280 1470 m 2400 1500 l 2280 1530 l 2445 1530 l 2445 1470 l cp +clip +n 1800 1500 m 2400 1500 l gs col0 s gr gr + +% arrowhead +7.500 slw +n 2280 1470 m 2400 1500 l 2280 1530 l 2280 1500 l 2280 1470 l cp gs 0.00 setgray ef gr col0 s +% Polyline +30.000 slw +gs clippath +4080 1470 m 4200 1500 l 4080 1530 l 4245 1530 l 4245 1470 l cp +clip +n 3600 1500 m 4200 1500 l gs col0 s gr gr + +% arrowhead +7.500 slw +n 4080 1470 m 4200 1500 l 4080 1530 l 4080 1500 l 4080 1470 l cp gs 0.00 setgray ef gr col0 s +% Polyline +30.000 slw +gs clippath +6180 1470 m 6300 1500 l 6180 1530 l 6345 1530 l 6345 1470 l cp +clip +n 5700 1500 m 6300 1500 l gs col0 s gr gr + +% arrowhead +7.500 slw +n 6180 1470 m 6300 1500 l 6180 1530 l 6180 1500 l 6180 1470 l cp gs 0.00 setgray ef gr col0 s +% Polyline +30.000 slw +n 5415 615 m 5415 915 l 5715 915 l gs col0 s gr +% Polyline +n 4215 615 m 4215 2415 l 5715 2415 l 5715 915 l 5415 615 l 4215 615 l cp gs col0 s gr +% Polyline +gs clippath +7006 1136 m 6900 1200 l 6964 1094 l 6847 1211 l 6889 1253 l cp +clip +n 7500 600 m 6900 1200 l gs col0 s gr gr + +% arrowhead +7.500 slw +n 7006 1136 m 6900 1200 l 6964 1094 l 6985 1115 l 7006 1136 l cp gs 0.00 setgray ef gr col0 s +% Polyline +30.000 slw +gs clippath +6630 1080 m 6600 1200 l 6570 1080 l 6570 1245 l 6630 1245 l cp +clip +n 6600 1200 m 6600 600 l gs col0 s gr gr + +% arrowhead +7.500 slw +n 6630 1080 m 6600 1200 l 6570 1080 l 6600 1080 l 6630 1080 l cp gs 0.00 setgray ef gr col0 s +% Polyline +n 300 3000 m 3600 3000 l 3600 3600 l 300 3600 l cp gs 0.90 setgray ef gr gs col0 s gr +% Polyline +n 4200 3000 m 7500 3000 l 7500 3600 l 4200 3600 l cp gs 0.90 setgray ef gr gs col0 s gr +% Polyline +n 1500 600 m 1500 900 l 1800 900 l gs col0 s gr +% Polyline +n 300 600 m 300 2400 l 1800 2400 l 1800 900 l 1500 600 l 300 600 l cp gs col0 s gr +/Helvetica ff 180.00 scf sf +6450 450 m +gs 1 -1 sc (Other classes) col0 sh gr +/Courier ff 150.00 scf sf +375 975 m +gs 1 -1 sc (public class) col0 sh gr +/Courier ff 150.00 scf sf +375 1140 m +gs 1 -1 sc (HelloWorld {) col0 sh gr +/Courier ff 150.00 scf sf +375 1305 m +gs 1 -1 sc ( ...) col0 sh gr +/Courier ff 150.00 scf sf +375 1635 m +gs 1 -1 sc ( void hello\(\) {) col0 sh gr +/Courier ff 150.00 scf sf +375 1800 m +gs 1 -1 sc ( ...) col0 sh gr +/Courier ff 150.00 scf sf +375 1965 m +gs 1 -1 sc ( }) col0 sh gr +/Courier ff 150.00 scf sf +375 2130 m +gs 1 -1 sc (}) col0 sh gr +/Helvetica ff 180.00 scf sf +4275 2625 m +gs 1 -1 sc (HelloWorld.class) col0 sh gr +/Helvetica-Bold ff 300.00 scf sf +900 3375 m +gs 1 -1 sc (Java language) col0 sh gr +/Helvetica-Bold ff 300.00 scf sf +4350 3375 m +gs 1 -1 sc (Java Virtual Machine) col0 sh gr +/Helvetica ff 180.00 scf sf +375 2625 m +gs 1 -1 sc (HelloWorld.java) col-1 sh gr +$F2psEnd +rs + +%%EndDocument + @endspecial 781 2998 a(Figur)n(e)g(1:)31 b(Compilation)25 +b(and)g(execution)h(of)f(Java)g(classes)146 3370 y(Note)e(that)g(the)f +(use)h(of)g(the)f(general)g(term)h(\223Java\224)f(implies)g(two)h +(meanings:)30 b(on)23 b(the)f(one)g(hand,)0 3491 y(Java)i(as)f(a)g(pr)n +(ogramming)i(language)f(is)g(meant,)f(on)h(the)g(other)g(hand,)f(the)h +(Java)g(V)-5 b(irtual)23 b(Machine,)0 3611 y(which)k(is)g(not)g +(necessarily)h(tar)n(geted)g(by)f(the)g(Java)f(language)h(exclusively) +-11 b(,)28 b(but)g(may)e(be)h(used)g(by)0 3731 y(other)j(languages)f +(as)g(well)f(\(e.g.)43 b(Eif)n(fel)29 b([CCZ97],)g(or)h(Ada)e([T)-9 +b(af96]\).)42 b(W)-9 b(e)28 b(assume)h(the)g(r)n(eader)g(to)0 +3852 y(be)g(familiar)h(with)g(the)f(Java)h(language)g(and)f(to)h(have)f +(a)h(general)f(understanding)h(of)g(the)g(V)-5 b(irtual)0 +3972 y(Machine.)0 4320 y Fm(2.1)119 b(Java)29 b(class)h(\002le)g +(format)0 4525 y Fq(Giving)g(a)f(full)g(overview)h(of)g(the)f(design)g +(issues)h(of)f(the)h(Java)f(class)h(\002le)f(format)h(and)f(the)g +(associ-)0 4645 y(ated)h(byte)g(code)g(instr)o(uctions)j(is)d(beyond)g +(the)g(scope)h(of)f(this)h(paper)-7 b(.)45 b(W)-9 b(e)29 +b(will)h(just)h(give)f(a)g(brief)0 4766 y(intr)n(oduction)36 +b(covering)e(the)g(details)f(that)i(ar)n(e)e(necessary)h(for)g +(understanding)g(the)g(r)n(est)g(of)g(this)0 4886 y(paper)-7 +b(.)39 b(The)28 b(format)h(of)f(class)h(\002les)f(and)f(the)h(byte)h +(code)f(instr)o(uction)i(set)f(ar)n(e)f(described)g(in)f(mor)n(e)0 +5007 y(detail)k(in)f(the)h(\223Java)g(V)-5 b(irtual)31 +b(Machine)g(Speci\002cation\224)h([L)-9 b(Y97])2542 4970 +y Fn(2)2579 5007 y Fq(,)32 b(and)f(in)f([MD97].)49 b(Especially)-11 +b(,)0 5127 y(we)23 b(will)g(not)h(deal)e(with)i(the)f(security)h +(constraints)h(that)f(the)f(Java)g(V)-5 b(irtual)24 b(Machine)f(has)g +(to)g(check)0 5247 y(at)i(r)o(un-time,)h(i.e.)k(the)25 +b(byte)h(code)f(veri\002er)-7 b(.)p 0 5371 1530 4 v 116 +5433 a Fk(2)149 5463 y Fj(Also)21 b(available)f(online)i(at)e +Fi(http://www.javasoft.com/docs/books/)o(vmspe)o(c/inde)o(x.htm)o(l) +1888 5712 y Fq(3)p eop +%%Page: 4 4 +4 3 bop 146 407 a Fq(Figur)n(e)40 b(2)e(shows)i(a)e(simpli\002ed)h +(example)f(of)h(the)g(contents)h(of)f(a)g(Java)f(class)i(\002le:)58 +b(It)38 b(starts)0 527 y(with)c(a)f(header)g(containing)h(a)f +(\223magic)h(number)7 b(\224)33 b(\()p Fh(0xCAFEBABE)p +Fq(\))f(and)h(the)g(version)h(number)-7 b(,)0 648 y(followed)33 +b(by)f(the)g Fp(constant)h(pool)p Fq(,)g(which)g(can)e(be)h(r)n(oughly) +i(thought)g(of)e(as)g(the)g(text)h(segment)f(of)0 768 +y(an)j(executable,)j(the)e Fp(access)e(rights)g Fq(of)i(the)g(class)g +(encoded)f(by)h(a)f(bit)h(mask,)i(a)d(list)h(of)g(interfaces)0 +888 y(implemented)19 b(by)h(the)f(class,)i(lists)f(containing)h(the)f +(\002elds)f(and)g(methods)h(of)g(the)g(class,)h(and)e(\002nally)0 +1009 y(the)35 b Fp(class)f(attributes)p Fq(,)j(e.g.)60 +b(the)35 b Fh(SourceFile)d Fq(attribute)37 b(telling)e(the)g(name)f(of) +h(the)g(sour)n(ce)h(\002le.)0 1129 y(Attributes)28 b(ar)n(e)f(a)g(way)g +(of)g(putting)h(additional,)g(e.g.)36 b(user)n(-de\002ned,)28 +b(information)g(into)g(class)f(\002le)0 1249 y(data)e(str)o(uctur)n +(es.)34 b(For)26 b(example,)f(a)g(custom)h(class)g(loader)f(may)h +(evaluate)f(such)g(attribute)i(data)e(in)0 1370 y(or)n(der)h(to)f +(perform)h(its)f(transformations.)33 b(The)25 b(JVM)g(speci\002cation)h +(declar)n(es)f(that)g(unknown,)g(i.e.)0 1490 y(user)n(-de\002ned)g +(attributes)i(must)e(be)g(ignor)n(ed)h(by)f(any)g(V)-5 +b(irtual)25 b(Machine)g(implementation.)0 5123 y @beginspecial +0 @llx 0 @lly 520 @urx 460 @ury 4590 @rwi @setspecial +%%BeginDocument: eps/classfile.eps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: classfile.eps +%%Creator: fig2dev Version 3.2 Patchlevel 1 +%%CreationDate: Mon Nov 30 16:01:26 1998 +%%For: dahm@che (Markus Dahm,,,,,) +%%Orientation: Portrait +%%BoundingBox: 0 0 520 460 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +-17.0 540.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n -1000 10000 m -1000 -1000 l 9937 -1000 l 9937 10000 l cp clip + 0.06000 0.06000 sc +% Polyline +7.500 slw +n 2999 6599 m 2400 6599 l 2400 6749 l 2999 6749 l cp gs col0 s gr +% Polyline +n 2400 6749 m 2999 6749 l 2999 6899 l 2400 6899 l cp gs col0 s gr +% Polyline +n 2999 6899 m 2400 6899 l 2400 7049 l 2999 7049 l cp gs col0 s gr +% Polyline +n 2400 7049 m 2999 7049 l 2999 7200 l 2400 7200 l cp gs col0 s gr +% Polyline +n 2400 7200 m 2999 7200 l 2999 7349 l 2400 7349 l cp gs col0 s gr +% Polyline +30.000 slw + [15 45] 45 sd +n 2699 7424 m 2699 7724 l gs col0 s gr [] 0 sd +% Polyline +7.500 slw +n 299 6449 m 3299 6449 l 3299 7949 l 299 7949 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 6824 m +gs 1 -1 sc (Methods) col0 sh gr +% Polyline +n 2999 5099 m 2400 5099 l 2400 5249 l 2999 5249 l cp gs col0 s gr +% Polyline +n 2400 5249 m 2999 5249 l 2999 5399 l 2400 5399 l cp gs col0 s gr +% Polyline +n 2999 5399 m 2400 5399 l 2400 5549 l 2999 5549 l cp gs col0 s gr +% Polyline +n 2400 5549 m 2999 5549 l 2999 5699 l 2400 5699 l cp gs col0 s gr +% Polyline +n 2400 5699 m 2999 5699 l 2999 5849 l 2400 5849 l cp gs col0 s gr +% Polyline +30.000 slw + [15 45] 45 sd +n 2699 5924 m 2699 6224 l gs col0 s gr [] 0 sd +% Polyline +7.500 slw +n 299 4949 m 3299 4949 l 3299 6449 l 299 6449 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 5399 m +gs 1 -1 sc (Fields) col0 sh gr +% Polyline +n 299 4199 m 3299 4199 l 3299 4949 l 299 4949 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 4649 m +gs 1 -1 sc (Implemented interfaces) col0 sh gr +% Polyline +n 299 3449 m 3299 3449 l 3299 4199 l 299 4199 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 3899 m +gs 1 -1 sc (Access rights) col0 sh gr +% Polyline +n 299 1349 m 3299 1349 l 3299 2099 l 299 2099 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 1799 m +gs 1 -1 sc (Header) col0 sh gr +% Polyline +n 2999 2249 m 2400 2249 l 2400 2400 l 2999 2400 l cp gs col0 s gr +% Polyline +n 2400 2400 m 2999 2400 l 2999 2549 l 2400 2549 l cp gs col0 s gr +% Polyline +n 2999 2549 m 2400 2549 l 2400 2699 l 2999 2699 l cp gs col0 s gr +% Polyline +n 2400 2699 m 2999 2699 l 2999 2849 l 2400 2849 l cp gs col0 s gr +% Polyline +n 2400 2849 m 2999 2849 l 2999 2999 l 2400 2999 l cp gs col0 s gr +% Polyline +30.000 slw + [15 45] 45 sd +n 2699 3074 m 2699 3374 l gs col0 s gr [] 0 sd +% Polyline +7.500 slw +n 299 2099 m 3299 2099 l 3299 3449 l 299 3449 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 2549 m +gs 1 -1 sc (Constant pool) col0 sh gr +% Polyline +n 299 7949 m 3299 7949 l 3299 8699 l 299 8699 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +599 8400 m +gs 1 -1 sc (Class attributes) col0 sh gr +% Polyline +n 4800 2999 m 7499 2999 l 7499 4349 l 4800 4349 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +5099 3299 m +gs 1 -1 sc (ConstantFieldref) col0 sh gr +/Helvetica ff 210.00 scf sf +5099 3600 m +gs 1 -1 sc ("aVariable") col0 sh gr +/Helvetica ff 210.00 scf sf +5099 3884 m +gs 1 -1 sc ("[Ljava/lang/Object;") col0 sh gr +/Helvetica ff 210.00 scf sf +5099 4199 m +gs 1 -1 sc ("HelloWorld") col0 sh gr +% Polyline +n 5024 2624 m 7124 2624 l 7124 2924 l 5024 2924 l cp gs col0 s gr +/Helvetica ff 210.00 scf sf +5099 2849 m +gs 1 -1 sc ("java/io/PrintStream") col0 sh gr +% Polyline +n 4800 1649 m 7499 1649 l 7499 2999 l 4800 2999 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +5099 1949 m +gs 1 -1 sc (ConstantMethodRef) col0 sh gr +/Helvetica ff 210.00 scf sf +5099 2249 m +gs 1 -1 sc ("println") col0 sh gr +/Helvetica ff 210.00 scf sf +5099 2534 m +gs 1 -1 sc ("\(Ljava/lang/String;\)V") col0 sh gr +% Polyline +n 4800 4349 m 7499 4349 l 7499 5099 l 4800 5099 l cp gs col0 s gr +/Helvetica-Bold ff 210.00 scf sf +5099 4649 m +gs 1 -1 sc (ConstantClass) col0 sh gr +/Helvetica ff 210.00 scf sf +5099 4949 m +gs 1 -1 sc ("java/io/PrintStream") col0 sh gr +% Polyline +n 4080 6500 m 3975 6500 3975 7770 105 arcto 4 {pop} repeat + 3975 7875 8820 7875 105 arcto 4 {pop} repeat + 8925 7875 8925 6605 105 arcto 4 {pop} repeat + 8925 6500 4080 6500 105 arcto 4 {pop} repeat + cp gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 3855 6725 m 3750 6725 3750 7995 105 arcto 4 {pop} repeat + 3750 8100 8595 8100 105 arcto 4 {pop} repeat + 8700 8100 8700 6830 105 arcto 4 {pop} repeat + 8700 6725 3855 6725 105 arcto 4 {pop} repeat + cp gs col7 1.00 shd ef gr gs col0 s gr +% Polyline +30.000 slw + [15 45] 45 sd +n 6150 7800 m 6150 7950 l gs col0 s gr [] 0 sd +% Polyline +7.500 slw +n 5550 7200 m 7200 7200 l 7200 7425 l 5550 7425 l cp gs col0 s gr +% Polyline +n 5550 7500 m 8625 7500 l 8625 7725 l 5550 7725 l cp gs col0 s gr +/Courier-Bold ff 180.00 scf sf +4050 7050 m +gs 1 -1 sc (getstatic java.lang.System.out) col0 sh gr +/Courier-Bold ff 180.00 scf sf +4050 7650 m +gs 1 -1 sc (invokevirtual java.io.PrintStream.println) col0 sh gr +/Courier-Bold ff 180.00 scf sf +4050 7350 m +gs 1 -1 sc (ldc "Hello, world") col0 sh gr +% Polyline + [15 45] 45 sd +n 2400 2249 m 4800 1649 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 2400 2849 m 4800 5849 l gs col0 s gr [] 0 sd +% Polyline +gs clippath +4693 3661 m 4800 3600 l 4734 3705 l 4832 3611 l 4790 3568 l cp +clip +n 2999 5324 m 4800 3600 l gs col0 s gr gr + +% arrowhead +n 4693 3661 m 4800 3600 l 4734 3705 l 4713 3683 l 4693 3661 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +3669 7107 m 3750 7200 l 3635 7156 l 3745 7233 l 3779 7184 l cp +clip +n 2999 6674 m 3750 7200 l gs col0 s gr gr + +% arrowhead +n 3669 7107 m 3750 7200 l 3635 7156 l 3652 7131 l 3669 7107 l cp gs 0.00 setgray ef gr col0 s +% Polyline +n 5099 1649 m 5099 1349 l 7799 1349 l 7799 5549 l 7499 5549 l 7499 1649 l + 5099 1649 l cp gs 0.00 setgray ef gr gs col0 s gr +% Polyline + [15 45] 45 sd +n 2999 2849 m 4800 4049 l gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 2999 2249 m 4800 2024 l gs col0 s gr [] 0 sd +% Polyline +gs clippath +7609 2533 m 7500 2475 l 7624 2475 l 7493 2442 l 7478 2500 l cp +clip +n 7800 2550 m 7500 2475 l gs col7 s gr gr + +% arrowhead +n 7609 2533 m 7500 2475 l 7624 2475 l 7616 2504 l 7609 2533 l cp gs col7 1.00 shd ef gr col7 s +% Polyline +n 4800 5099 m 7499 5099 l 7499 5849 l 4800 5849 l cp gs col0 s gr +% Polyline +n 7800 7500 m 7801 7499 l 7804 7496 l 7809 7491 l 7816 7483 l 7826 7472 l + 7840 7457 l 7856 7440 l 7875 7419 l 7897 7395 l 7921 7368 l + 7946 7340 l 7973 7310 l 7999 7279 l 8026 7247 l 8052 7216 l + 8078 7184 l 8102 7152 l 8125 7121 l 8147 7090 l 8167 7059 l + 8186 7029 l 8203 6998 l 8220 6966 l 8235 6934 l 8250 6900 l + 8261 6873 l 8272 6845 l 8282 6816 l 8292 6786 l 8303 6756 l + 8313 6724 l 8323 6692 l 8333 6659 l 8343 6626 l 8353 6592 l + 8363 6557 l 8373 6522 l 8382 6487 l 8392 6451 l 8402 6415 l + 8412 6379 l 8421 6342 l 8431 6305 l 8440 6268 l 8449 6231 l + 8458 6194 l 8467 6157 l 8476 6120 l 8484 6082 l 8492 6045 l + 8500 6007 l 8508 5969 l 8515 5932 l 8522 5894 l 8528 5856 l + 8535 5817 l 8540 5778 l 8545 5739 l 8550 5700 l 8554 5664 l + 8557 5628 l 8560 5591 l 8563 5554 l 8565 5517 l 8567 5479 l + 8568 5440 l 8570 5401 l 8571 5362 l 8572 5322 l 8572 5281 l + 8573 5241 l 8573 5200 l 8573 5159 l 8573 5117 l 8573 5076 l + 8572 5034 l 8572 4992 l 8571 4950 l 8570 4908 l 8570 4866 l + 8569 4824 l 8568 4783 l 8567 4741 l 8566 4700 l 8565 4659 l + 8564 4619 l 8563 4578 l 8562 4538 l 8561 4499 l 8560 4460 l + 8559 4421 l 8558 4383 l 8557 4346 l 8555 4309 l 8554 4272 l + 8552 4236 l 8550 4200 l 8548 4161 l 8545 4121 l 8542 4083 l + 8540 4044 l 8537 4006 l 8534 3968 l 8531 3930 l 8528 3892 l + 8526 3854 l 8523 3815 l 8520 3777 l 8517 3739 l 8515 3702 l + 8512 3664 l 8509 3626 l 8506 3588 l 8503 3551 l 8500 3514 l + 8497 3477 l 8493 3440 l 8490 3404 l 8486 3368 l 8481 3333 l + 8477 3298 l 8471 3264 l 8466 3231 l 8460 3199 l 8453 3167 l + 8446 3136 l 8438 3107 l 8430 3078 l 8421 3051 l 8411 3025 l + 8400 3000 l 8385 2969 l 8368 2941 l 8349 2913 l 8328 2887 l + 8305 2862 l 8279 2838 l 8251 2814 l 8220 2790 l 8187 2767 l + 8153 2744 l 8117 2721 l 8080 2699 l 8043 2678 l 8006 2657 l + 7970 2638 l 7937 2620 l 7907 2604 l 7879 2590 l 7856 2578 l + 7837 2568 l 7823 2561 l 7812 2556 l 7805 2553 l 7802 2551 l + 7800 2550 l gs col0 s gr +% Polyline +gs clippath +4723 4703 m 4800 4800 l 4687 4750 l 4794 4833 l 4830 4785 l cp +clip +n 5025 2775 m 5024 2776 l 5020 2779 l 5015 2784 l 5006 2792 l 4993 2804 l + 4977 2818 l 4957 2836 l 4934 2857 l 4908 2881 l 4879 2907 l + 4849 2935 l 4818 2964 l 4786 2994 l 4754 3023 l 4723 3053 l + 4693 3082 l 4664 3110 l 4637 3137 l 4612 3163 l 4589 3188 l + 4568 3212 l 4549 3235 l 4531 3257 l 4515 3278 l 4500 3300 l + 4485 3324 l 4471 3347 l 4457 3371 l 4444 3396 l 4432 3420 l + 4419 3445 l 4408 3470 l 4396 3495 l 4385 3520 l 4374 3546 l + 4363 3571 l 4352 3596 l 4342 3622 l 4332 3647 l 4323 3673 l + 4314 3698 l 4306 3724 l 4299 3749 l 4292 3775 l 4286 3800 l + 4281 3825 l 4278 3850 l 4276 3875 l 4275 3900 l 4276 3925 l + 4278 3950 l 4282 3975 l 4287 4001 l 4293 4027 l 4301 4053 l + 4309 4080 l 4319 4106 l 4329 4133 l 4340 4160 l 4351 4187 l + 4363 4214 l 4375 4241 l 4387 4268 l 4399 4294 l 4411 4320 l + 4423 4345 l 4434 4370 l 4446 4394 l 4457 4417 l 4468 4439 l + 4478 4460 l 4489 4481 l 4500 4500 l 4513 4522 l 4528 4543 l + 4543 4563 l 4559 4583 l 4578 4603 l 4597 4623 l 4618 4643 l + 4640 4664 l 4663 4685 l 4686 4705 l 4709 4724 l 4730 4742 l + 4749 4758 l 4765 4772 l 4778 4783 l 4800 4800 l gs col0 s gr gr + +% arrowhead +n 4723 4703 m 4800 4800 l 4687 4750 l 4705 4727 l 4723 4703 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +7591 5782 m 7499 5699 l 7619 5728 l 7500 5665 l 7472 5719 l cp +clip +n 7200 7275 m 7203 7274 l 7208 7271 l 7219 7265 l 7235 7257 l 7256 7246 l + 7282 7233 l 7312 7217 l 7346 7200 l 7381 7182 l 7417 7163 l + 7453 7144 l 7487 7126 l 7520 7109 l 7551 7092 l 7580 7076 l + 7607 7061 l 7631 7048 l 7654 7034 l 7676 7022 l 7696 7010 l + 7714 6998 l 7733 6986 l 7750 6975 l 7770 6961 l 7790 6947 l + 7810 6933 l 7829 6918 l 7847 6903 l 7866 6887 l 7883 6871 l + 7901 6855 l 7917 6837 l 7933 6820 l 7947 6802 l 7961 6784 l + 7973 6766 l 7984 6748 l 7994 6729 l 8003 6711 l 8010 6693 l + 8016 6675 l 8021 6656 l 8025 6638 l 8028 6618 l 8030 6598 l + 8031 6578 l 8031 6556 l 8030 6534 l 8029 6511 l 8026 6487 l + 8023 6462 l 8019 6438 l 8015 6412 l 8009 6387 l 8004 6362 l + 7997 6338 l 7991 6314 l 7984 6291 l 7977 6269 l 7971 6247 l + 7964 6226 l 7957 6207 l 7950 6187 l 7942 6167 l 7934 6146 l + 7926 6126 l 7918 6106 l 7909 6086 l 7900 6066 l 7891 6046 l + 7881 6027 l 7871 6008 l 7861 5990 l 7850 5972 l 7840 5956 l + 7829 5940 l 7818 5925 l 7807 5911 l 7797 5898 l 7785 5886 l + 7774 5874 l 7762 5863 l 7750 5852 l 7737 5841 l 7722 5830 l + 7707 5819 l 7689 5807 l 7670 5795 l 7648 5782 l 7625 5769 l + 7602 5755 l 7578 5742 l 7555 5729 l 7535 5718 l 7499 5699 l gs col0 s gr gr + +% arrowhead +n 7591 5782 m 7499 5699 l 7619 5728 l 7605 5755 l 7591 5782 l cp gs 0.00 setgray ef gr col0 s +/Helvetica ff 210.00 scf sf +975 9000 m +gs 1 -1 sc (HelloWorld.class) col0 sh gr +/Helvetica ff 210.00 scf sf +5099 5699 m +gs 1 -1 sc ("Hello, world") col0 sh gr +/Helvetica-Bold ff 210.00 scf sf +5099 5399 m +gs 1 -1 sc (ConstantString) col0 sh gr +$F2psEnd +rs + +%%EndDocument + @endspecial 1252 5327 a(Figur)n(e)h(2:)31 b(Java)25 +b(class)g(\002le)g(format)1888 5712 y(4)p eop +%%Page: 5 5 +5 4 bop 146 407 a Fq(Because)20 b(all)f(of)h(the)g(information)h +(needed)d(to)i(dynamically)g(r)n(esolve)h(the)f(symbolic)g(r)n(efer)n +(ences)0 527 y(to)32 b(classes,)h(\002elds)e(and)g(methods)h(at)f(r)o +(un-time)h(is)f(coded)h(with)f(string)i(constants,)h(the)d(constant)0 +648 y(pool)40 b(contains)g(in)g(fact)g(the)f(lar)n(gest)i(portion)f(of) +g(an)f(average)h(class)f(\002le,)k(appr)n(oximately)e(60\045)0 +768 y([AP98)o(].)31 b(The)25 b(byte)h(code)f(instr)o(uctions)i +(themselves)f(just)g(make)e(up)h(12\045.)146 893 y(The)43 +b(right)g(upper)g(box)g(shows)h(a)e(\223zoomed\224)h(excerpt)g(of)g +(the)g(constant)h(pool,)j(while)c(the)0 1014 y(r)n(ounded)37 +b(box)g(below)f(depicts)h(some)g(instr)o(uctions)i(that)e(ar)n(e)f +(contained)h(within)g(a)f(method)g(of)0 1134 y(the)e(example)f(class.) +56 b(These)34 b(instr)o(uctions)i(r)n(epr)n(esent)e(the)f +(straightforwar)n(d)k(translation)e(of)f(the)0 1254 y(well-known)26 +b(statement:)179 1522 y Fh(System.out.println\("Hello,)54 +b(world"\);)146 1784 y Fq(The)22 b(\002rst)h(instr)o(uction)h(loads)e +(the)g(contents)h(of)f(the)g(\002eld)g Fh(out)f Fq(of)h(class)h +Fh(java.lang.System)0 1904 y Fq(onto)30 b(the)g(operand)f(stack.)44 +b(This)29 b(is)h(an)e(instance)i(of)f(the)h(class)f Fh +(java.io.PrintStream)p Fq(.)39 b(The)0 2025 y Fh(ldc)25 +b Fq(\(\223Load)g(constant\224\))i(pushes)f(a)f(r)n(efer)n(ence)h(to)g +(the)g(string)h(\224Hello)e(world\224)h(on)g(the)g(stack.)33 +b(The)0 2145 y(next)28 b(instr)o(uction)j(invokes)e(the)f(instance)g +(method)g Fh(println)f Fq(which)h(takes)g(both)h(values)f(as)g(pa-)0 +2265 y(rameters)36 b(\(Instance)g(methods)g(always)h(implicitly)f(take) +g(an)g(instance)g(r)n(efer)n(ence)g(as)f(their)i(\002rst)0 +2386 y(ar)n(gument\).)146 2511 y(Instr)o(uctions,)24 +b(other)d(data)g(str)o(uctur)n(es)i(within)e(the)g(class)g(\002le)f +(and)h(constants)h(themselves)f(may)0 2632 y(r)n(efer)33 +b(to)g(constants)h(in)f(the)f(constant)i(pool.)54 b(Such)33 +b(r)n(efer)n(ences)g(ar)n(e)g(implemented)f(via)g(\002xed)h(in-)0 +2752 y(dexes)h(encoded)g(dir)n(ectly)i(into)f(the)f(instr)o(uctions.)62 +b(This)34 b(is)g(illustrated)i(for)f(some)f(items)h(of)g(the)0 +2872 y(\002gur)n(e)26 b(emphasized)e(with)h(a)g(surr)n(ounding)i(box.) +146 2998 y(For)h(example,)f(the)h Fh(invokevirtual)c +Fq(instr)o(uction)29 b(r)n(efers)f(to)g(a)f Fh(MethodRef)e +Fq(constant)j(that)0 3118 y(contains)34 b(information)h(about)f(the)g +(name)f(of)h(the)f(called)g(method,)j(the)d(signatur)n(e)i(\(i.e.)56 +b(the)33 b(en-)0 3238 y(coded)38 b(ar)n(gument)h(and)f(r)n(eturn)h +(types\),)j(and)c(to)h(which)f(class)h(the)f(method)h(belongs.)71 +b(In)37 b(fact,)0 3359 y(as)c(emphasized)f(by)h(the)g(boxed)g(value,)i +(the)e Fh(MethodRef)d Fq(constant)35 b(itself)e(just)h(r)n(efers)f(to)h +(other)0 3479 y(entries)23 b(holding)f(the)h(r)n(eal)f(data,)g(e.g.)30 +b(it)23 b(r)n(efers)g(to)g(a)f Fh(ConstantClass)d Fq(entry)k +(containing)g(a)f(sym-)0 3599 y(bolic)36 b(r)n(efer)n(ence)h(to)f(the)g +(class)g Fh(java.io.PrintStream)p Fq(.)60 b(T)-9 b(o)36 +b(keep)f(the)h(class)g(\002le)g(compact,)0 3720 y(such)29 +b(constants)i(ar)n(e)e(typically)h(shar)n(ed)f(by)g(dif)n(fer)n(ent)h +(instr)o(uctions.)45 b(Similarly)-11 b(,)30 b(a)f(\002eld)f(is)h(r)n +(epr)n(e-)0 3840 y(sented)23 b(by)g(a)f Fh(Fieldref)f +Fq(constant)k(that)e(includes)g(information)h(about)g(the)f(name,)f +(the)h(type)g(and)0 3961 y(the)i(containing)h(class)g(of)f(the)g +(\002eld.)146 4086 y(The)37 b(constant)i(pool)f(basically)g(holds)f +(the)h(following)g(types)g(of)g(constants:)57 b(Refer)n(ences)37 +b(to)0 4206 y(methods,)25 b(\002elds)g(and)g(classes,)g(strings,)i +(integers,)f(\003oats,)f(longs,)h(and)e(doubles.)0 4540 +y Fm(2.2)119 b(Byte)30 b(code)g(instruction)f(set)0 4741 +y Fq(The)f(JVM)h(is)f(a)g(stack-oriented)i(interpr)n(eter)g(that)f(cr)n +(eates)g(a)f(local)g(stack)i(frame)e(of)h(\002xed)f(size)g(for)0 +4861 y(every)21 b(method)f(invocation.)31 b(The)19 b(size)h(of)h(the)f +(local)h(stack)g(has)f(to)h(be)f(computed)g(by)h(the)f(compiler)-7 +b(.)0 4981 y(V)e(alues)21 b(may)h(also)g(be)f(stor)n(ed)i +(intermediately)f(in)f(a)h(frame)f(ar)n(ea)h(containing)g +Fp(local)f(variables)g Fq(which)0 5102 y(can)28 b(be)g(used)g(like)h(a) +f(set)h(of)f(r)n(egisters.)43 b(These)28 b(local)g(variables)h(ar)n(e)f +(number)n(ed)h(fr)n(om)g(0)f(to)h(65535,)0 5222 y(i.e.)60 +b(you)36 b(have)e(a)h(maximum)g(of)g(65536)f(of)h(local)g(variables.)61 +b(The)34 b(stack)i(frames)f(of)g(caller)g(and)0 5342 +y(callee)25 b(method)i(ar)n(e)f(overlapping,)h(i.e.)34 +b(the)26 b(caller)g(pushes)g(ar)n(guments)h(onto)h(the)e(operand)g +(stack)0 5463 y(and)f(the)g(called)f(method)i(r)n(eceives)f(them)g(in)g +(local)g(variables.)1888 5712 y(5)p eop +%%Page: 6 6 +6 5 bop 146 407 a Fq(The)32 b(byte)g(code)g(instr)o(uction)j(set)d +(curr)n(ently)i(consists)f(of)g(212)e(instr)o(uctions,)36 +b(44)31 b(opcodes)i(ar)n(e)0 527 y(marked)g(as)g(r)n(eserved)g(and)g +(may)g(be)f(used)h(for)h(futur)n(e)g(extensions)g(or)g(intermediate)f +(optimiza-)0 648 y(tions)22 b(within)f(the)g(V)-5 b(irtual)21 +b(Machine.)29 b(The)21 b(instr)o(uction)i(set)e(can)g(be)g(r)n(oughly)h +(gr)n(ouped)g(as)f(follows:)0 893 y Fg(Stack)k(operations:)49 +b Fq(Constants)26 b(can)e(be)h(pushed)f(onto)i(the)f(stack)g(either)g +(by)g(loading)g(them)g(fr)n(om)244 1013 y(the)f(constant)h(pool)f(with) +h(the)e Fh(ldc)g Fq(instr)o(uction)j(or)f(with)f(special)g +(\223short-cut\224)h(instr)o(uctions)244 1134 y(wher)n(e)37 +b(the)g(operand)f(is)h(encoded)g(into)g(the)g(instr)o(uctions,)43 +b(e.g.)66 b Fh(iconst)p 3211 1134 30 4 v 34 w(0)37 b +Fq(or)g Fh(bipush)244 1254 y Fq(\(push)25 b(byte)h(value\).)0 +1469 y Fg(Arithmetic)e(operations:)50 b Fq(The)36 b(instr)o(uction)k +(set)d(of)h(the)f(Java)h(V)-5 b(irtual)37 b(Machine)g(distinguishes)244 +1590 y(its)24 b(operand)e(types)i(using)g(dif)n(fer)n(ent)g(instr)o +(uctions)h(to)f(operate)f(on)h(values)f(of)g(speci\002c)h(type.)244 +1710 y(Arithmetic)32 b(operations)g(starting)i(with)d +Fh(i)p Fq(,)i(for)f(example,)h(denote)e(an)g(integer)h(operation.)244 +1831 y(E.g.,)k Fh(iadd)e Fq(that)h(adds)f(two)h(integers)g(and)f +(pushes)g(the)g(r)n(esult)i(back)e(on)h(the)f(stack.)60 +b(The)244 1951 y(Java)23 b(types)h Fh(boolean)p Fq(,)d +Fh(byte)p Fq(,)i Fh(short)p Fq(,)f(and)g Fh(char)g Fq(ar)n(e)h(handled) +f(as)h(integers)h(by)g(the)f(JVM.)0 2166 y Fg(Control)j(\003ow:)49 +b Fq(Ther)n(e)40 b(ar)n(e)g(branch)h(instr)o(uctions)i(like)d +Fh(goto)g Fq(and)g Fh(if)p 2836 2166 V 35 w(icmpeq)p +Fq(,)j(which)d(com-)244 2287 y(par)n(es)32 b(two)h(integers)g(for)h +(equality)-11 b(.)52 b(Ther)n(e)33 b(is)f(also)h(a)f +Fh(jsr)f Fq(\(jump)i(sub-r)n(outine\))h(and)e Fh(ret)244 +2407 y Fq(pair)26 b(of)i(instr)o(uctions)h(that)e(is)g(used)f(to)h +(implement)g(the)f Fh(finally)f Fq(clause)i(of)g Fh(try-catch)244 +2528 y Fq(blocks.)32 b(Exceptions)26 b(may)f(be)g(thr)n(own)h(with)g +(the)f Fh(athrow)e Fq(instr)o(uction.)244 2696 y(Branch)30 +b(tar)n(gets)i(ar)n(e)f(coded)f(as)h(of)n(fsets)h(fr)n(om)f(the)g(curr) +n(ent)g(byte)g(code)g(position,)i(i.e.)46 b(with)244 +2816 y(an)25 b(integer)g(number)-7 b(.)0 3031 y Fg(Load)25 +b(and)f(store)i(operations)49 b Fq(for)31 b(local)h(variables)f(like)f +Fh(iload)g Fq(and)g Fh(istore)p Fq(.)47 b(Ther)n(e)31 +b(ar)n(e)g(also)244 3152 y(array)26 b(operations)g(like)f +Fh(iastore)e Fq(which)i(stor)n(es)i(an)d(integer)i(value)f(into)g(an)g +(array)-11 b(.)0 3367 y Fg(Field)25 b(access:)50 b Fq(The)24 +b(value)g(of)h(an)f(instance)h(\002eld)f(may)g(be)g(r)n(etrieved)i +(with)e Fh(getfield)f Fq(and)h(writ-)244 3488 y(ten)d(with)g +Fh(putfield)p Fq(.)28 b(For)22 b(static)g(\002elds,)g(ther)n(e)g(ar)n +(e)f Fh(getstatic)e Fq(and)h Fh(putstatic)f Fq(coun-)244 +3608 y(terparts.)0 3824 y Fg(Method)25 b(invocation:)50 +b Fq(Methods)20 b(may)f(either)g(be)g(called)f(via)h(static)h(r)n(efer) +n(ences)g(with)f Fh(invokesta-)244 3944 y(tic)40 b Fq(or)i(be)f(bound)g +(virtually)i(with)e(the)g Fh(invokevirtual)e Fq(instr)o(uction.)81 +b(Super)41 b(class)244 4064 y(methods)25 b(and)g(private)g(methods)h +(ar)n(e)f(invoked)h(with)f Fh(invokespecial)p Fq(.)0 +4280 y Fg(Object)g(allocation:)50 b Fq(Class)28 b(instances)g(ar)n(e)g +(allocated)g(with)h(the)f Fh(new)f Fq(instr)o(uction,)k(arrays)e(of)f +(ba-)244 4400 y(sic)j(type)g(like)f Fh(int[])f Fq(with)i +Fh(newarray)p Fq(,)f(arrays)i(of)f(r)n(efer)n(ences)g(like)f +Fh(String[][])e Fq(with)244 4521 y Fh(anewarray)23 b +Fq(or)i Fh(multianewarray)p Fq(.)0 4736 y Fg(Conversion)h(and)e(type)h +(checking:)49 b Fq(For)23 b(stack)g(operands)g(of)f(basic)g(type)h +(ther)n(e)f(exist)h(casting)g(op-)244 4856 y(erations)35 +b(like)e Fh(f2i)g Fq(which)i(converts)g(a)e(\003oat)h(value)g(into)h +(an)e(integer)-7 b(.)58 b(The)33 b(validity)i(of)f(a)244 +4977 y(type)24 b(cast)h(may)f(be)f(checked)h(with)g Fh(checkcast)e +Fq(and)i(the)g Fh(instanceof)d Fq(operator)k(can)f(be)244 +5097 y(dir)n(ectly)i(mapped)e(to)i(the)f(equally)g(named)f(instr)o +(uction.)146 5342 y(Most)38 b(instr)o(uctions)i(have)c(a)h(\002xed)g +(length,)j(but)d(ther)n(e)g(ar)n(e)g(also)g(some)g(variable-length)h +(in-)0 5463 y(str)o(uctions:)59 b(In)37 b(particular)-7 +b(,)41 b(the)d Fh(lookupswitch)c Fq(and)j Fh(tableswitch)f +Fq(instr)o(uctions,)43 b(which)1888 5712 y(6)p eop +%%Page: 7 7 +7 6 bop 0 407 a Fq(ar)n(e)31 b(used)f(to)h(implement)g +Fh(switch\(\))d Fq(statements.)49 b(Since)31 b(the)g(number)f(of)h +Fh(case)f Fq(clauses)h(may)0 527 y(vary)-11 b(,)26 b(these)f(instr)o +(uctions)i(contain)f(a)f(variable)g(number)g(of)g(statements.)146 +648 y(W)-9 b(e)27 b(will)g(not)h(list)g(all)f(byte)h(code)g(instr)o +(uctions)i(her)n(e,)e(since)f(these)h(ar)n(e)f(explained)g(in)g(detail) +g(in)0 768 y(the)g(JVM)g(speci\002cation.)37 b(The)26 +b(opcode)h(names)f(ar)n(e)h(mostly)h(self-explaining,)f(so)g +(understanding)0 888 y(the)e(following)h(code)g(examples)e(should)i(be) +e(fairly)i(intuitive.)0 1183 y Fm(2.3)119 b(Method)30 +b(code)0 1373 y Fq(Non-abstract)35 b(methods)g(contain)f(an)g +(attribute)h(\()p Fh(Code)p Fq(\))e(that)h(holds)g(the)g(following)h +(data:)48 b(The)0 1493 y(maximum)27 b(size)f(of)h(the)f(method's)h +(stack)g(frame,)g(the)f(number)h(of)g(local)g(variables)f(and)g(an)g +(array)0 1614 y(of)i(byte)h(code)f(instr)o(uctions.)43 +b(Optionally)-11 b(,)29 b(it)g(may)f(also)g(contain)h(information)g +(about)g(the)f(names)0 1734 y(of)d(local)h(variables)f(and)g(sour)n(ce) +h(\002le)f(line)f(numbers)i(that)f(can)g(be)g(used)g(by)g(a)g(debugger) +-7 b(.)146 1855 y(Whenever)23 b(an)h(exception)h(is)f(thr)n(own,)h(the) +f(JVM)g(performs)h(exception)f(handling)g(by)g(looking)0 +1975 y(into)31 b(a)f(table)h(of)g(exception)g(handlers.)47 +b(The)31 b(table)f(marks)h(handlers,)h(i.e.)47 b(pieces)30 +b(of)h(code,)h(to)f(be)0 2095 y(r)n(esponsible)23 b(for)h(exceptions)f +(of)h(certain)f(types)g(that)g(ar)n(e)g(raised)g(within)g(a)f(given)h +(ar)n(ea)f(of)i(the)e(byte)0 2216 y(code.)63 b(When)35 +b(ther)n(e)g(is)h(no)g(appr)n(opriate)g(handler)f(the)h(exception)g(is) +g(pr)n(opagated)g(back)g(to)h(the)0 2336 y(caller)29 +b(of)h(the)f(method.)43 b(The)29 b(handler)g(information)h(is)f(itself) +h(stor)n(ed)g(in)f(an)g(attribute)i(contained)0 2456 +y(within)25 b(the)h Fh(Code)e Fq(attribute.)0 2751 y +Fm(2.4)119 b(Byte)30 b(code)g(of)n(fsets)0 2941 y Fq(T)-9 +b(ar)n(gets)32 b(of)g(branch)f(instr)o(uctions)j(like)d +Fh(goto)f Fq(ar)n(e)h(encoded)g(as)g(r)n(elative)h(of)n(fsets)g(in)f +(the)h(array)f(of)0 3062 y(byte)i(codes.)55 b(Exception)33 +b(handlers)g(and)f(local)h(variables)g(r)n(efer)g(to)g(absolute)h(addr) +n(esses)e(within)0 3182 y(the)26 b(byte)g(code.)34 b(The)26 +b(former)h(contains)f(r)n(efer)n(ences)h(to)g(the)f(start)h(and)e(the)h +(end)g(of)g(the)g Fh(try)f Fq(block,)0 3302 y(and)d(to)i(the)e(instr)o +(uction)j(handler)e(code.)30 b(The)22 b(latter)h(marks)h(the)e(range)h +(in)g(which)g(a)f(local)h(variable)0 3423 y(is)g(valid,)f(i.e.)30 +b(its)23 b(scope.)30 b(This)23 b(makes)f(it)h(dif)n(\002cult)h(to)f +(insert)g(or)g(delete)f(code)g(ar)n(eas)h(on)f(this)h(level)f(of)0 +3543 y(abstraction,)29 b(since)f(one)f(has)g(to)h(r)n(ecompute)g(the)f +(of)n(fsets)i(every)f(time)f(and)g(update)f(the)i(r)n(eferring)0 +3663 y(objects.)k(W)-9 b(e)24 b(will)h(see)g(in)g(section)h(3.3)e(how)i +Fo(BCEL)i Fq(r)n(emedies)d(this)h(r)n(estriction.)0 3958 +y Fm(2.5)119 b(T)-11 b(ype)30 b(information)0 4148 y +Fq(Java)k(is)h(a)f(type-safe)h(language)f(and)g(the)g(information)i +(about)f(the)f(types)h(of)g(\002elds,)i(local)d(vari-)0 +4269 y(ables,)27 b(and)g(methods)g(is)g(stor)n(ed)h(in)f +Fp(signatur)n(es)p Fq(.)37 b(These)26 b(ar)n(e)h(strings)i(stor)n(ed)f +(in)f(the)g(constant)h(pool)0 4389 y(and)35 b(encoded)h(in)f(a)g +(special)h(format.)64 b(For)36 b(example)f(the)h(ar)n(gument)h(and)e(r) +n(eturn)h(types)h(of)f(the)0 4509 y Fh(main)24 b Fq(method)120 +4688 y Fh(public)58 b(static)g(void)h(main\(String[])e(argv\))146 +4866 y Fq(ar)n(e)25 b(r)n(epr)n(esented)h(by)f(the)g(signatur)n(e)120 +5044 y Fh(\([java/lang/String;\)V)146 5222 y Fq(Classes)19 +b(and)g(arrays)h(ar)n(e)f(internally)g(r)n(epr)n(esented)h(by)f +(strings)i(like)e Fh("java/lang/String")p Fq(,)0 5342 +y(basic)k(types)g(like)g Fh(float)e Fq(by)i(an)f(integer)h(number)-7 +b(.)30 b(W)-5 b(ithin)22 b(signatur)n(es)i(they)f(ar)n(e)g(r)n(epr)n +(esented)g(by)0 5463 y(single)i(characters,)h(e.g.,)f +Fh("I")p Fq(,)f(for)i(integer)-7 b(.)1888 5712 y(7)p +eop +%%Page: 8 8 +8 7 bop 0 407 a Fm(2.6)119 b(Code)30 b(example)0 608 +y Fq(The)25 b(following)i(example)e(pr)n(ogram)i(pr)n(ompts)g(for)f(a)f +(number)h(and)f(prints)h(the)g(faculty)g(of)g(it.)33 +b(The)0 728 y Fh(readLine\(\))19 b Fq(method)i(r)n(eading)g(fr)n(om)h +(the)f(standar)n(d)h(input)f(may)g(raise)g(an)g Fh(IOException)d +Fq(and)0 849 y(if)h(a)g(misspelled)f(number)h(is)h(passed)e(to)i +Fh(parseInt\(\))d Fq(it)i(thr)n(ows)i(a)e Fh(NumberFormatException)p +Fq(.)0 969 y(Thus,)25 b(the)g(critical)h(ar)n(ea)f(of)h(code)f(must)g +(be)g(encapsulated)g(in)g(a)f Fh(try-catch)f Fq(block.)0 +1230 y Ff(import)52 b(java.io.*;)0 1343 y(public)g(class)g(Faculty)f({) +109 1456 y(private)g(static)h(BufferedReader)c(in)54 +b(=)g(new)f(BufferedReader\(n)o(ew)1745 1569 y(InputStreamReade)o(r\()o +(Sy)o(st)o(em.)o(in)o(\)\))o(;)109 1682 y(public)f(static)g(final)g +(int)h(fac\(int)f(n\))h({)218 1795 y(return)f(\(n)i(==)f(0\)?)g(1)i(:)f +(n)g(*)g(fac\(n)e(-)i(1\);)109 1907 y(})109 2020 y(public)e(static)g +(final)g(int)h(readInt\(\))e({)218 2133 y(int)i(n)h(=)h(4711;)218 +2246 y(try)e({)327 2359 y(System.out.prin)o(t\(")o(Pl)o(ea)o(se)48 +b(enter)k(a)i(number>)e("\);)327 2472 y(n)i(=)g(Integer.parseInt)o(\(i) +o(n.)o(re)o(adL)o(in)o(e\()o(\)\))o(;)218 2585 y(})g(catch\(IOExcepti)o +(on)48 b(e1\))53 b({)h(System.err.print)o(ln)o(\(e)o(1\))o(;)48 +b(})327 2698 y(catch\(NumberFor)o(mat)o(Ex)o(ce)o(pt)o(io)o(n)h(e2\))k +({)h(System.err.pri)o(ntl)o(n\()o(e2)o(\);)48 b(})218 +2811 y(return)k(n;)109 2924 y(})109 3037 y(public)g(static)g(void)g +(main\(String[])d(argv\))j({)218 3149 y(int)h(n)h(=)h(readInt\(\);)218 +3262 y(System.out.prin)o(tl)o(n\(")o(Fa)o(cu)o(lt)o(y)48 +b(of)54 b(")g(+)g(n)g(+)g(")h(is)e(")h(+)g(fac\(n\)\);)109 +3375 y(}})146 3631 y Ft(This)23 b(code)f(example)g(typically)h +(compiles)g(to)f(the)g(following)h(chunks)e(of)i(byte)f(code:)0 +3921 y Fg(2.6.1)99 b(Method)25 b(fac)0 4108 y Ff(0:)108 +b(iload_0)0 4221 y(1:)g(ifne)653 b(#8)0 4334 y(4:)108 +b(iconst_1)0 4447 y(5:)g(goto)653 b(#16)0 4560 y(8:)108 +b(iload_0)0 4672 y(9:)g(iload_0)0 4785 y(10:)53 b(iconst_1)0 +4898 y(11:)g(isub)0 5011 y(12:)g(invokestatic)213 b(Faculty.fac)49 +b(\(I\)I)k(\(12\))0 5124 y(15:)g(imul)0 5237 y(16:)g(ireturn)0 +5463 y(LocalVariable\(s)o(ta)o(rt)o(_p)o(c)c(=)54 b(0,)f(length)f(=)i +(16,)f(index)g(=)h(0:int)e(n\))1888 5712 y Fq(8)p eop +%%Page: 9 9 +9 8 bop 146 407 a Ft(The)21 b(method)f Ff(fac)h Ft(has)g(only)g(one)g +(local)i(variable,)g(the)e(ar)n(gument)g Ff(n)p Ft(,)g(stor)n(ed)f(in)i +(slot)f(0.)28 b(This)21 b(variable's)0 520 y(scope)k(ranges)g(fr)n(om)h +(the)g(start)f(of)h(the)f(byte)g(code)g(sequence)g(to)g(the)g(very)h +(end.)37 b(If)26 b(the)f(value)i(of)f Ff(n)g Ft(\(stor)n(ed)0 +633 y(in)i(local)h(variable)g(0,)g(i.e.)41 b(the)27 b(value)h(fetched)e +(with)i Ff(iload)p 2148 633 28 4 v 30 w(0)p Ft(\))f(is)h(not)e(equal)i +(to)f(0,)h(the)f Ff(ifne)e Ft(instr)o(uction)0 746 y(branches)20 +b(to)f(the)g(byte)g(code)g(at)h(of)n(fset)f(8,)h(otherwise)e(a)j(1)f +(is)g(pushed)e(onto)g(the)h(operand)g(stack)g(and)h(the)f(con-)0 +858 y(tr)n(ol)24 b(\003ow)h(branches)f(to)g(the)f(\002nal)i(r)n(eturn.) +33 b(For)23 b(ease)h(of)g(r)n(eading,)g(the)g(of)n(fsets)f(of)h(the)g +(branch)h(instr)o(uctions,)0 971 y(which)e(ar)n(e)g(actually)h(r)n +(elative,)f(ar)n(e)g(displayed)f(as)g(absolute)h(addr)n(esses)d(in)j +(these)e(examples.)146 1084 y(If)27 b(r)n(ecursion)f(has)g(to)g +(continue,)h(the)f(ar)n(guments)f(for)i(the)e(multiplication)j(\()p +Ff(n)f Ft(and)f Ff(fac\(n)53 b(-)h(1\))p Ft(\))26 b(ar)n(e)0 +1197 y(evaluated)21 b(and)g(the)f(r)n(esults)g(pushed)f(onto)h(the)g +(operand)f(stack.)27 b(After)20 b(the)h(multiplication)h(operation)e +(has)0 1310 y(been)i(performed)f(the)h(function)h(r)n(eturns)e(the)h +(computed)f(value)i(fr)n(om)g(the)f(top)g(of)h(the)e(stack.)0 +1569 y Fg(2.6.2)99 b(Method)25 b(readInt)0 1745 y Ff(0:)108 +b(sipush)434 b(4711)0 1858 y(3:)108 b(istore_0)0 1971 +y(4:)g(getstatic)269 b(java.lang.Syst)o(em.)o(ou)o(t)48 +b(Ljava/io/PrintS)o(tre)o(am)o(;)0 2084 y(7:)108 b(ldc)599 +b("Please)51 b(enter)h(a)j(number>)c(")0 2197 y(9:)108 +b(invokevirtual)49 b(java.io.PrintS)o(tre)o(am)o(.p)o(ri)o(nt)f +(\(Ljava/lang/Str)o(in)o(g;)o(\)V)0 2310 y(12:)53 b(getstatic)269 +b(Faculty.in)50 b(Ljava/io/Buffe)o(red)o(Re)o(ad)o(er)o(;)0 +2423 y(15:)j(invokevirtual)c(java.io.Buffer)o(edR)o(ea)o(de)o(r.)o(re)o +(adL)o(in)o(e)f(\(\)Ljava/lang/St)o(rin)o(g;)0 2536 y(18:)53 +b(invokestatic)104 b(java.lang.Inte)o(ger)o(.p)o(ar)o(se)o(In)o(t)49 +b(\(Ljava/lang/St)o(ri)o(ng)o(;\))o(I)0 2649 y(21:)k(istore_0)0 +2762 y(22:)g(goto)544 b(#44)0 2875 y(25:)53 b(astore_1)0 +2987 y(26:)g(getstatic)269 b(java.lang.Syst)o(em.)o(er)o(r)48 +b(Ljava/io/PrintS)o(tre)o(am)o(;)0 3100 y(29:)53 b(aload_1)0 +3213 y(30:)g(invokevirtual)c(java.io.PrintS)o(tre)o(am)o(.p)o(ri)o(nt)o +(ln)f(\(Ljava/lang/Obj)o(ec)o(t;)o(\)V)0 3326 y(33:)53 +b(goto)544 b(#44)0 3439 y(36:)53 b(astore_1)0 3552 y(37:)g(getstatic) +269 b(java.lang.Syst)o(em.)o(er)o(r)48 b(Ljava/io/PrintS)o(tre)o(am)o +(;)0 3665 y(40:)53 b(aload_1)0 3778 y(41:)g(invokevirtual)c +(java.io.PrintS)o(tre)o(am)o(.p)o(ri)o(nt)o(ln)f(\(Ljava/lang/Obj)o(ec) +o(t;)o(\)V)0 3891 y(44:)53 b(iload_0)0 4004 y(45:)g(ireturn)0 +4229 y(Exception)d(handler\(s\))g(=)0 4342 y(From)216 +b(To)327 b(Handler)51 b(Type)0 4455 y(4)381 b(22)327 +b(25)f(java.io.IOExcep)o(ti)o(on)o(\(6\))0 4568 y(4)381 +b(22)327 b(36)f(NumberFormatExc)o(ep)o(ti)o(on\()o(10)o(\))146 +4785 y Ft(First)34 b(the)g(local)j(variable)f Ff(n)f +Ft(\(in)g(slot)g(0\))g(is)g(initialized)i(to)d(the)g(value)h(4711.)67 +b(The)34 b(next)g(instr)o(uction,)0 4898 y Ff(getstatic)p +Ft(,)f(loads)i(the)f(static)g Ff(System.out)d Ft(\002eld)j(onto)f(the)h +(stack.)64 b(Then)34 b(a)h(string)e(is)i(loaded)f(and)0 +5011 y(printed,)21 b(a)i(number)g(r)n(ead)f(fr)n(om)h(the)f(standar)n +(d)g(input)h(and)f(assigned)f(to)h Ff(n)p Ft(.)146 5124 +y(If)g(one)f(of)h(the)f(called)h(methods)e(\()p Ff(readLine\(\))e +Ft(and)k Ff(parseInt\(\))p Ft(\))17 b(thr)n(ows)k(an)h(exception,)f +(the)f(Java)0 5237 y(V)-5 b(irtual)26 b(Machine)h(calls)h(one)d(of)h +(the)f(declar)n(ed)h(exception)f(handlers,)h(depending)e(on)h(the)g +(type)g(of)h(the)f(ex-)0 5350 y(ception.)36 b(The)24 +b Ff(try)p Ft(-clause)h(itself)h(does)e(not)g(pr)n(oduce)h(any)g(code,) +g(it)h(mer)n(ely)f(de\002nes)f(the)h(range)g(in)h(which)0 +5463 y(the)e(following)h(handlers)f(ar)n(e)h(active.)35 +b(In)24 b(the)g(example)g(the)g(speci\002ed)g(sour)n(ce)g(code)g(ar)n +(ea)h(maps)g(to)f(a)h(byte)1888 5712 y Fq(9)p eop +%%Page: 10 10 +10 9 bop 0 407 a Ft(code)23 b(ar)n(ea)h(ranging)f(fr)n(om)h(of)n(fset)f +(4)h(\(inclusive\))h(to)e(22)h(\(exclusive\).)31 b(If)24 +b(no)f(exception)f(has)h(occurr)n(ed)g(\(\223nor)n(-)0 +520 y(mal\224)i(execution)e(\003ow\))h(the)f Ff(goto)f +Ft(instr)o(uctions)h(branch)i(behind)e(the)g(handler)g(code.)31 +b(Ther)n(e)23 b(the)g(value)h(of)0 633 y Ff(n)e Ft(is)h(loaded)f(and)h +(r)n(eturned.)146 750 y(For)e(example)g(the)f(handler)h(for)g +Ff(java.io.IOExcep)o(ti)o(on)15 b Ft(starts)20 b(at)h(of)n(fset)g(25.) +28 b(It)20 b(simply)i(prints)e(the)0 863 y(err)n(or)i(and)h(branches)f +(back)i(to)e(the)f(normal)j(execution)d(\003ow)-8 b(,)22 +b(i.e.)28 b(as)23 b(if)g(no)f(exception)g(had)g(occurr)n(ed.)0 +1223 y Fr(3)143 b(The)35 b(BCEL)g(API)0 1443 y Ft(The)25 +b Fe(BCEL)j Ft(API)d(abstracts)h(fr)n(om)g(the)f(concr)n(ete)h(cir)n +(cumstances)g(of)g(the)f(Java)j(V)-5 b(irtual)26 b(Machine)h(and)f(how) +0 1556 y(to)c(r)n(ead)h(and)f(write)g(binary)i(Java)g(class)f(\002les.) +k(The)22 b(API)g(mainly)i(consists)d(of)i(thr)n(ee)f(parts:)127 +1795 y(1.)49 b(A)26 b(package)f(that)h(contains)g(classes)g(that)g +(describe)f(\223static\224)i(constraints)e(of)h(class)h(\002les,)f +(i.e.,)g(r)n(e\003ect)244 1908 y(the)g(class)h(\002le)f(format)h(and)g +(is)f(not)g(intended)f(for)h(byte)g(code)g(modi\002cations.)39 +b(The)26 b(classes)g(may)h(be)244 2021 y(used)e(to)h(r)n(ead)g(and)h +(write)f(class)g(\002les)h(fr)n(om)g(or)f(to)g(a)h(\002le.)39 +b(This)26 b(is)h(useful)f(especially)g(for)h(analyzing)244 +2134 y(Java)34 b(classes)f(without)e(having)j(the)e(sour)n(ce)g +(\002les)g(at)h(hand.)59 b(The)32 b(main)i(data)f(str)o(uctur)n(e)e(is) +i(called)244 2247 y Ff(JavaClass)19 b Ft(which)k(contains)f(methods,)f +(\002elds,)g(etc..)127 2453 y(2.)49 b(A)23 b(package)h(to)f +(dynamically)i(generate)d(or)h(modify)h Ff(JavaClass)19 +b Ft(objects.)31 b(It)23 b(may)h(be)g(used)e(e.g.)30 +b(to)244 2565 y(insert)20 b(analysis)i(code,)e(to)h(strip)g +(unnecessary)e(information)j(fr)n(om)g(class)f(\002les,)g(or)g(to)g +(implement)g(the)244 2678 y(code)h(generator)f(back-end)h(of)h(a)g +(Java)h(compiler)-7 b(.)127 2884 y(3.)49 b(V)-8 b(arious)21 +b(code)g(examples)h(and)g(utilities)g(like)g(a)h(class)f(\002le)g +(viewer)-7 b(,)22 b(a)h(tool)e(to)h(convert)f(class)i(\002les)e(into) +244 2997 y(HTML,)g(and)i(a)g(converter)f(fr)n(om)h(class)g(\002les)f +(to)g(the)g(Jasmin)i(assembly)e(language)g([MD97)r(].)0 +3313 y Fm(3.1)119 b(JavaClass)0 3499 y Ft(The)16 b(\223static\224)j +(component)d(of)h(the)f Fe(BCEL)i Ft(API)e(r)n(esides)g(in)i(the)e +(package)h Ff(de.fub.bytecode)o(.c)o(la)o(ss)o(fi)o(le)0 +3612 y Ft(and)22 b(r)n(epr)n(esents)e(class)i(\002les.)27 +b(All)c(of)f(the)f(binary)i(components)d(and)i(data)g(str)o(uctur)n(es) +f(declar)n(ed)g(in)i(the)e(JVM)0 3725 y(speci\002cation)27 +b([L)-8 b(Y97])26 b(and)h(described)e(in)i(section)e(2)i(ar)n(e)g +(mapped)f(to)g(classes.)38 b(Figur)n(e)26 b(3)h(shows)e(an)i(UML)0 +3837 y(diagram)34 b(of)f(the)g(hierar)n(chy)g(of)h(classes)f(of)g(the)f +Fe(BCEL)k Ft(API.)c(Figur)n(e)h(8)h(in)f(the)g(appendix)f(also)i(shows) +e(a)0 3950 y(detailed)22 b(diagram)h(of)g(the)f Ff(ConstantPool)17 +b Ft(components.)146 4068 y(The)23 b(top-level)g(data)g(str)o(uctur)n +(e)g(is)g Ff(JavaClass)p Ft(,)c(which)24 b(in)g(most)f(cases)g(is)g(cr) +n(eated)g(by)g(a)h Ff(ClassPar-)0 4181 y(ser)d Ft(object)g(that)h(is)g +(capable)h(of)f(parsing)f(binary)i(class)f(\002les.)27 +b(A)22 b Ff(JavaClass)c Ft(object)k(basically)h(consists)e(of)0 +4294 y(\002elds,)h(methods,)e(symbolic)j(r)n(efer)n(ences)f(to)g(the)g +(super)f(class)i(and)g(to)f(the)f(implemented)h(interfaces.)146 +4411 y(The)c(constant)f(pool)g(serves)g(as)h(some)f(kind)g(of)h +(central)h(r)n(epository)c(and)j(is)g(thus)f(of)h(outstanding)e(impor)n +(-)0 4524 y(tance)29 b(for)g(all)h(components.)45 b Ff(ConstantPool)24 +b Ft(objects)k(contain)i(an)f(array)h(of)f(\002xed)f(size)h(of)g +Ff(Constant)0 4637 y Ft(entries,)34 b(which)g(may)f(be)g(r)n(etrieved)f +(via)i(the)f Ff(getConstant\(\))27 b Ft(method)32 b(taking)g(an)i +(integer)d(index)i(as)0 4750 y(ar)n(gument.)58 b(Indexes)31 +b(to)h(the)h(constant)f(pool)g(may)h(be)g(contained)g(in)g(instr)o +(uctions)f(as)i(well)f(as)g(in)g(other)0 4863 y(components)21 +b(of)h(a)i(class)f(\002le)f(and)h(in)g(constant)f(pool)g(entries)f +(themselves.)146 4980 y(Methods)j(and)i(\002elds)f(contain)h(a)g +(signatur)n(e,)g(symbolically)h(de\002ning)e(their)g(types.)35 +b(Access)25 b(\003ags)h(like)0 5093 y Ff(public)52 b(static)g(final)26 +b Ft(occur)i(in)h(several)f(places)h(and)f(ar)n(e)h(encoded)d(by)j(an)f +(integer)f(bit)i(mask,)g(e.g.)0 5206 y Ff(public)52 b(static)g(final)20 +b Ft(matches)j(to)f(the)f(Java)k(expr)n(ession)109 5463 +y Ff(int)53 b(access_flags)c(=)54 b(ACC_PUBLIC)c(|)55 +b(ACC_STATIC)50 b(|)k(ACC_FINAL;)1863 5712 y Fq(10)p +eop +%%Page: 11 11 +11 10 bop 570 5113 a @beginspecial 13 @llx 12 @lly 471 +@urx 830 @ury 3221 @rwi @setspecial +%%BeginDocument: eps/javaclass.eps +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: Rose Diagram(s) +%%Creator: AdobePS5.dll Version 5.0 +%%CreationDate: 7/7/1999 17:45:7 +%%Pages: 1 +%%Orientation: Portrait +%%PageOrder: Ascend +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%DocumentData: Clean7Bit +%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 +%%LanguageLevel: 2 +%%BoundingBox: 13 12 471 830 +%%EndComments +%%BeginProcSet: epsffit 1 0 +gsave +1233.763 -187.599 translate +90 rotate +1.782 1.782 scale +%%EndProcSet + + +%%BeginDefaults +%%PageBoundingBox: 13 12 582 830 +%%EndDefaults + +%%BeginProlog +%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 +/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false +setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype +ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch +def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 +rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def +/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def +typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 +def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp +exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def +/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype +{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} +readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop +(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def +/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) +tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup +xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint +tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck +{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) +tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup +rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} +forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier +/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin +$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 +ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto +(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt +$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} +repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print +(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup +0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop +/setpacking where{pop oldpack setpacking}if}if +%%EndResource +userdict /Pscript_WinNT_Incr 230 dict dup begin put +%%BeginResource: file Pscript_FatalError 5.0 0 +/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div +cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def +%%EndResource +/VM?{vmstatus exch sub exch pop gt{[ +(This job requires more memory than is available in this printer.)100 500 +(Try one or more of the following, and then print again:)100 485 +(For the output format, choose Optimize For Portability.)115 470 +(In the Device Settings page, make sure the Available PostScript Memory is accurate.) +115 455(Reduce the number of fonts in the document.)115 440 +(Print the document in parts.)115 425 12/Times-Roman showpage +(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def +%%BeginResource: file Pscript_Win_Basic 5.0 0 +/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ +/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- +/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , +d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C +/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M +/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d +/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage +, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false +/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d +/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, +d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx +matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit +/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} +b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U +/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d +reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d +/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 +sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} +b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b +/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b +/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} +b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b +%%EndResource +%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 +/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge +{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ +snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F +setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d +/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b +%%EndResource +end +%%EndProlog + +%%BeginSetup +[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec +1 setlinecap 1 setlinejoin +/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def +%%EndSetup + +%%Page: 1 1 +%%PageBoundingBox: 13 12 582 830 +%%EndPageComments +%%BeginPageSetup +/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh +%%EndPageSetup + +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Win_GdiObject 5.0 0 +/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore +{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d +/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps +L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType +1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d +/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal +{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep +gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b +/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M +MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep +M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 ++}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d +/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix +GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 +/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal +makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 +/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d +/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] +d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 +0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne +{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd +aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx +PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save +8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 +Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx +matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` +xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill +{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot +concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap +YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 +-0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix +currentmatrix readonly d ; ;}if}b +%%EndResource +%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 +/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} +{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 +d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d +20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d +/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ +/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict +~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} +? ;}b +%%EndResource +end reinitialize +: N 712 1406 246 93 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 958 1405 M 711 1405 I 711 1499 I 958 1499 I C +K +0 0 0 1 scol Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Text 5.0 0 +/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d +/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ +length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets +{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& +/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} +if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ +{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get +StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ +{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ +length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ +put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M +currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d +/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N +/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix +astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get +length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d +/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS +{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 +copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for +& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ +4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 +add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for +/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 +Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName +length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length +string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ +putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 +$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? +{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName +get undefinefont}forall undefinefont}b +%%EndResource +end reinitialize +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Encoding256 5.0 0 +/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction +/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign +/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma +/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon +/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S +/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave +/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright +/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis +/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef +/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet +/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef +/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section +/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered +/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph +/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter +/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis +/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute +/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls +/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute +/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve +/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex +/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put +%%EndResource +end reinitialize + +%%IncludeResource: font Helvetica +F /F0 0 /256 T /Helvetica mF +/F0S1C F0 [28.75 0 0 -28.75 0 0 ] mFS +F0S1C Ji +735 1441 M (ExceptionTable)[19 13 15 16 16 8 7 16 16 19 16 16 7 0]xS +0.602 0 0.199 1 scol N 958 1456 M 711 1456 I 711 1499 I 958 1499 I C +K +N 958 1473 M 711 1473 I 711 1499 I 958 1499 I C +K +: N 1484 1418 275 93 rp C +1 1 0.801 1 scol L ; N 1759 1417 M 1483 1417 I 1483 1511 I 1759 1511 I C +K +0 0 0 1 scol 1505 1453 M (LineNumberTable)[16 7 16 16 21 16 25 16 16 10 19 16 16 7 0]xS +0.602 0 0.199 1 scol N 1759 1469 M 1483 1469 I 1483 1511 I 1759 1511 I C +K +N 1759 1485 M 1483 1485 I 1483 1511 I 1759 1511 I C +K +: N 1039 1411 318 253 rp C +1 1 0.801 1 scol L ; N 1357 1410 M 1038 1410 I 1038 1664 I 1357 1664 I C +K +0 0 0 1 scol 1163 1446 M (Code)[21 16 16 0]xS +0.602 0 0.199 1 scol N 1357 1462 M 1038 1462 I 1038 1664 I 1357 1664 I C +K +N 1357 1578 M 1038 1578 I 1038 1664 I 1357 1664 I C +K +0 0 0 1 scol 1083 1493 M (max_stack : int)[25 16 13 16 15 8 16 15 14 8 8 8 7 16 0]xS +1083 1527 M (max_locals : int)[25 16 13 16 7 16 15 16 7 15 8 8 8 7 16 0]xS +1083 1560 M (exception_handlers)[16 13 15 16 16 8 7 16 16 16 16 16 16 16 7 16 10 0]xS +1083 1626 M (getCode\(\))[16 16 8 21 16 16 16 10 0]xS +0.602 0 0.199 1 scol N 1420 1499 M 1358 1508 I K +N 1358 1508 M 1380 1516 I 1398 1502 I 1377 1494 I 1358 1508 I C +: 1 1 1 1 scol O ; K +N 1420 1499 M 1482 1487 I K +N 1462 1432 16 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 1462 1459 M (1)S +N 1462 1432 16 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 1462 1459 M (1)S +: N 1742 1576 291 93 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2033 1575 M 1741 1575 I 1741 1669 I 2033 1669 I C +K +0 0 0 1 scol 1762 1611 M (LocalVariableTable)[16 16 15 16 7 19 16 10 7 16 16 7 16 19 16 16 7 0]xS +0.602 0 0.199 1 scol N 2033 1626 M 1741 1626 I 1741 1669 I 2033 1669 I C +K +N 2033 1643 M 1741 1643 I 1741 1669 I 2033 1669 I C +K +N 1549 1580 M 1358 1556 I K +N 1358 1556 M 1380 1547 I 1398 1562 I 1377 1570 I 1358 1556 I C +: 1 1 1 1 scol O ; K +N 1549 1580 M 1740 1603 I K +: N 1709 1625 15 34 rp C +1 1 1 1 scol L ; N 1709 1625 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1709 1652 M (1)S +: N 1709 1625 15 34 rp C +1 1 1 1 scol L ; N 1709 1625 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1709 1652 M (1)S +: N 1573 1128 218 93 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1791 1127 M 1572 1127 I 1572 1221 I 1791 1221 I C +K +0 0 0 1 scol 1597 1163 M (InnerClasses)[7 16 16 16 10 21 7 16 15 15 16 0]xS +0.602 0 0.199 1 scol N 1791 1178 M 1572 1178 I 1572 1221 I 1791 1221 I C +K +N 1791 1195 M 1572 1195 I 1572 1221 I 1791 1221 I C +K +: N 1855 1128 186 93 rp C +1 1 0.801 1 scol L ; N 2041 1127 M 1854 1127 I 1854 1221 I 2041 1221 I C +K +0 0 0 1 scol 1878 1163 M (SourceFile)[19 16 16 10 15 16 18 7 7 0]xS +0.602 0 0.199 1 scol N 2041 1178 M 1854 1178 I 1854 1221 I 2041 1221 I C +K +N 2041 1195 M 1854 1195 I 1854 1221 I 2041 1221 I C +K +: N 450 1406 190 93 rp C +1 1 0.801 1 scol L ; N 640 1405 M 449 1405 I 449 1499 I 640 1499 I C +K +0 0 0 1 scol 470 1441 M (Deprecated)[21 16 16 10 16 15 16 8 16 0]xS +0.602 0 0.199 1 scol N 640 1456 M 449 1456 I 449 1499 I 640 1499 I C +K +N 640 1473 M 449 1473 I 449 1499 I 640 1499 I C +K +: N 2049 1418 161 93 rp C +1 1 0.801 1 scol L ; N 2210 1417 M 2048 1417 I 2048 1511 I 2210 1511 I C +K +0 0 0 1 scol 2069 1453 M (Unknown)[21 16 14 16 16 21 0]xS +0.602 0 0.199 1 scol N 2210 1469 M 2048 1469 I 2048 1511 I 2210 1511 I C +K +N 2210 1485 M 2048 1485 I 2048 1511 I 2210 1511 I C +K +: N 2105 1128 171 93 rp C +1 1 0.801 1 scol L ; N 2276 1127 M 2104 1127 I 2104 1221 I 2276 1221 I C +K +0 0 0 1 scol 2131 1163 M (Synthetic)[19 13 16 8 16 16 8 7 0]xS +0.602 0 0.199 1 scol N 2276 1178 M 2104 1178 I 2104 1221 I 2276 1221 I C +K +N 2276 1195 M 2104 1195 I 2104 1221 I 2276 1221 I C +K +: N 521 1128 240 93 rp C +1 1 0.801 1 scol L ; N 761 1127 M 520 1127 I 520 1221 I 761 1221 I C +K +0 0 0 1 scol 546 1163 M (ConstantValue)[21 16 16 15 8 16 16 8 19 16 7 16 0]xS +0.602 0 0.199 1 scol N 761 1177 M 520 1177 I 520 1221 I 761 1221 I C +K +N 761 1193 M 520 1193 I 520 1221 I 761 1221 I C +K +: N 491 628 204 125 rp C +1 1 0.801 1 scol L ; N 695 627 M 490 627 I 490 753 I 695 753 I C +K +0.496 0.496 0.496 1 scol 1 Lj 1 Lc 12 Lw solid N 495 748 M 691 748 I 691 632 I : 0.754 0.754 +S K +; 0 0 0 1 scol 513 663 M (ClassParser)[21 7 16 15 15 19 16 10 15 16 0]xS +0.602 0 0.199 1 scol 1 Lw solid N 695 676 M 490 676 I 490 753 I 695 753 I C +K +N 695 693 M 490 693 I 490 753 I 695 753 I C +K +0 0 0 1 scol 535 741 M (parse\(\))[16 16 10 15 16 10 0]xS +: N 1168 1116 157 93 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1325 1115 M 1167 1115 I 1167 1209 I 1325 1209 I C +K +0 0 0 1 scol 1192 1151 M (Attribute)[19 8 8 10 7 16 16 8 0]xS +0.602 0 0.199 1 scol N 1325 1164 M 1167 1164 I 1167 1209 I 1325 1209 I C +K +N 1325 1181 M 1167 1181 I 1167 1209 I 1325 1209 I C +K +N 1225 1279 M 1225 1210 I K +N 528 1279 M 2187 1279 I K +N 1225 1210 M 1242 1255 I 1209 1255 I C +: 1 1 1 1 scol O ; K +N 1190 1410 M 1190 1279 I K +N 1091 1329 276 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1091 1356 M (<>)[17 17 23 16 8 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 1602 1417 M 1602 1279 I K +N 1479 1381 251 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1479 1408 M (<>)[17 17 21 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 1941 1222 M 1941 1279 I K +N 1823 1234 255 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1823 1261 M (<>)[17 17 21 7 16 15 15 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 840 1405 M 840 1279 I K +N 728 1326 276 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 728 1353 M (<>)[17 17 23 16 8 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 2132 1417 M 2132 1279 I K +N 528 1405 M 528 1279 I K +N 416 1326 276 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 416 1353 M (<>)[17 17 23 16 8 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 1870 1575 M 1870 1279 I K +N 1748 1523 250 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1748 1550 M (<>)[17 17 21 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 1673 1222 M 1673 1279 I K +N 1541 1234 255 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1541 1261 M (<>)[17 17 21 7 16 15 15 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 2187 1222 M 2187 1279 I K +N 2068 1234 255 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 2068 1261 M (<>)[17 17 21 7 16 15 15 8 16 8 8 10 7 16 16 8 16 17 0]xS +0.602 0 0.199 1 scol N 638 1222 M 638 1279 I K +N 536 1233 245 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 536 1260 M (<>)[17 17 18 7 16 7 16 8 16 8 8 10 7 16 16 8 16 17 0]xS +: N 1130 845 233 126 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1363 844 M 1129 844 I 1129 971 I 1363 971 I C +K +0 0 0 1 scol +%%IncludeResource: font Helvetica-Oblique +F /F1 0 /256 T /Helvetica-Oblique mF +/F1S1C F1 [28.75 0 0 -28.75 0 0 ] mFS +F1S1C Ji +1150 880 M (FieldOrMethod)[18 7 16 7 16 23 10 24 16 8 16 16 0]xS +0.602 0 0.199 1 scol N 1363 894 M 1129 894 I 1129 971 I 1363 971 I C +K +N 1363 911 M 1129 911 I 1129 971 I 1363 971 I C +K +0 0 0 1 scol 1174 960 M (getName\(\))[16 16 8 21 16 24 16 10 0]xS +: N 571 845 214 126 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 785 844 M 570 844 I 570 971 I 785 971 I C +K +0 0 0 1 scol 594 880 M (AccessFlags)[19 15 15 16 15 15 18 7 16 16 0]xS +0.602 0 0.199 1 scol N 785 894 M 570 894 I 570 971 I 785 971 I C +K +N 785 911 M 570 911 I 570 971 I 785 971 I C +K +0 0 0 1 scol 614 960 M (isPublic\(\))[7 15 19 16 16 7 7 15 10 0]xS +0.602 0 0.199 1 scol N 1128 908 M 786 908 I K +N 786 908 M 831 925 I 831 891 I C +: 1 1 1 1 scol O ; K +N 1237 1043 M 1237 972 I K +N 992 1043 M 1497 1043 I K +N 1237 972 M 1253 1017 I 1220 1017 I C +: 1 1 1 1 scol O ; K +: N 1494 1023 134 84 rp C +1 1 0.801 1 scol L ; N 1628 1022 M 1493 1022 I 1493 1107 I 1628 1107 I C +K +0 0 0 1 scol F0S1C Ji +1513 1058 M (Method)[23 16 8 16 16 0]xS +0.602 0 0.199 1 scol N 1628 1074 M 1493 1074 I 1493 1107 I 1628 1107 I C +K +N 1628 1090 M 1493 1090 I 1493 1107 I 1628 1107 I C +K +N 1409 1111 M 1492 1085 I K +N 1488 1110 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1488 1137 M (1)S +0.602 0 0.199 1 scol N 1492 1085 M 1476 1102 I 1454 1097 I 1470 1080 I 1492 1085 I C +: 1 1 1 1 scol O ; K +N 1409 1111 M 1326 1136 I K +N 1341 1157 11 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1341 1184 M (*)S +N 1488 1110 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1488 1137 M (1)S +N 1341 1157 11 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1341 1184 M (*)S +0.602 0 0.199 1 scol N 1497 1028 M 1497 1043 I K +: N 1734 802 235 139 rp C +1 1 0.801 1 scol L ; N 1969 801 M 1733 801 I 1733 941 I 1969 941 I C +K +0 0 0 1 scol 1764 837 M (ConstantPool)[21 16 16 15 8 16 16 8 19 16 16 0]xS +0.602 0 0.199 1 scol N 1969 853 M 1733 853 I 1733 941 I 1969 941 I C +K +N 1969 869 M 1733 869 I 1733 941 I 1969 941 I C +K +0 0 0 1 scol 1777 918 M (getConstant\(\))[16 16 8 21 16 16 15 8 16 16 8 10 0]xS +: N 1088 610 317 160 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1405 609 M 1087 609 I 1087 770 I 1405 770 I C +K +0 0 0 1 scol 1179 645 M (JavaClass)[15 16 13 16 21 7 16 15 0]xS +0.602 0 0.199 1 scol N 1405 659 M 1087 659 I 1087 770 I 1405 770 I C +K +N 1405 676 M 1087 676 I 1087 770 I 1405 770 I C +K +0 0 0 1 scol 1131 724 M (getInterfaceNames\(\))[16 16 8 7 16 8 16 10 8 16 15 16 21 16 25 16 15 10 0]xS +1131 757 M (getSuperclassName\(\))[16 16 8 19 16 16 16 10 15 7 16 15 15 21 16 25 16 10 0]xS +0.602 0 0.199 1 scol N 1419 896 M 1314 771 I K +N 1287 794 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1287 821 M (1)S +0.602 0 0.199 1 scol N 1314 771 M 1336 779 I 1340 802 I 1318 794 I 1314 771 I C +: 1 1 1 1 scol O ; K +N 1419 896 M 1524 1021 I K +N 1539 966 11 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 1539 993 M (*)S +N 1287 794 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1287 821 M (1)S +N 1539 966 11 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 1539 993 M (*)S +1 1 1 1 scol [ 72 24 ] 0 sd N 696 690 M 1086 690 I K +0 0 0 1 scol [ 72 24 ] 0 sd N 696 690 M 1086 690 I K +3 Lw solid N 1086 690 M 1059 701 I : 0.754 0.754 +S K +; N 1086 690 M 1059 679 I : 0.754 0.754 +S K +; N 847 641 164 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 847 668 M (<>)[17 17 15 10 16 16 8 16 15 17 0]xS +0.602 0 0.199 1 scol 1 Lw solid N 1569 786 M 1406 737 I K +N 1569 786 M 1732 835 I K +N 1086 751 M 786 866 I K +N 786 866 M 834 866 I 822 834 I C +: 1 1 1 1 scol O ; K +: N 865 1023 134 84 rp C +1 1 0.801 1 scol L ; N 999 1022 M 864 1022 I 864 1107 I 999 1107 I C +K +0 0 0 1 scol 899 1058 M (Field)[18 7 16 7 0]xS +0.602 0 0.199 1 scol N 999 1072 M 864 1072 I 864 1107 I 999 1107 I C +K +N 999 1089 M 864 1089 I 864 1107 I 999 1107 I C +K +N 1083 1111 M 1000 1086 I K +N 990 1111 16 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 990 1138 M (1)S +0.602 0 0.199 1 scol N 1000 1086 M 1023 1081 I 1039 1098 I 1017 1102 I 1000 1086 I C +: 1 1 1 1 scol O ; K +N 1083 1111 M 1166 1136 I K +N 1165 1079 11 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1165 1106 M (*)S +N 990 1111 16 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 990 1138 M (1)S +N 1165 1079 11 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1165 1106 M (*)S +0.602 0 0.199 1 scol N 992 1067 M 992 1043 I K +N 1072 896 M 1177 771 I K +N 1190 794 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1190 821 M (1)S +0.602 0 0.199 1 scol N 1177 771 M 1173 794 I 1150 802 I 1155 779 I 1177 771 I C +: 1 1 1 1 scol O ; K +N 1072 896 M 967 1021 I K +N 1004 1018 11 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 1004 1045 M (*)S +N 1190 794 16 33 rp C +1 1 1 1 scol L 0 0 0 1 scol 1190 821 M (1)S +N 1004 1018 11 34 rp C +1 1 1 1 scol L 0 0 0 1 scol 1004 1045 M (*)S +LH +%%PageTrailer + +%%Trailer +%%DocumentNeededResources: +%%+ font Helvetica-Oblique +%%+ font Helvetica +%%DocumentSuppliedResources: +Pscript_WinNT_Incr dup /terminate get exec +%%EOF +grestore + +%%EndDocument + @endspecial 990 5316 a Fq(Figur)n(e)26 b(3:)31 b(UML)24 +b(diagram)i(for)f(the)h Fo(BCEL)i Fq(API)1863 5712 y(11)p +eop +%%Page: 12 12 +12 11 bop 146 407 a Ft(As)17 b(mentioned)f(in)h(section)g(2.1)g(alr)n +(eady)-10 b(,)19 b(several)e(components)e(may)j(contain)f +Fs(attribute)i Ft(objects:)25 b(classes,)0 520 y(\002elds,)43 +b(methods,)f(and)e Ff(Code)e Ft(objects)h(\(intr)n(oduced)g(in)h +(section)f(2.3\).)81 b(The)39 b(latter)g(is)h(an)g(attribute)g(it-)0 +633 y(self)f(that)h(contains)f(the)g(actual)h(byte)f(code)f(array)-10 +b(,)44 b(the)39 b(maximum)i(stack)e(size,)k(the)c(number)g(of)h(local)0 +746 y(variables,)c(a)d(table)f(of)h(handled)e(exceptions,)i(and)f(some) +g(optional)g(debugging)e(information)j(coded)e(as)0 858 +y Ff(LineNumberTable)23 b Ft(and)29 b Ff(LocalVariableTa)o(bl)o(e)24 +b Ft(attributes.)47 b(Attributes)27 b(ar)n(e)j(in)g(general)f +(speci\002c)0 971 y(to)c(some)g(data)g(str)o(uctur)n(e,)g(i.e.)37 +b(no)25 b(two)g(components)f(shar)n(e)h(the)g(same)g(kind)h(of)f +(attribute,)h(though)e(this)h(is)0 1084 y(not)h(explicitly)h +(forbidden.)40 b(In)26 b(the)g(\002gur)n(e)g(the)g Ff(Attribute)d +Ft(classes)j(ar)n(e)i(marked)e(with)g(the)g(component)0 +1197 y(they)21 b(belong)h(to.)0 1482 y Fm(3.2)119 b(Class)30 +b(repository)0 1659 y Ft(Using)35 b(the)g(pr)n(ovided)g +Ff(Repository)c Ft(class,)39 b(r)n(eading)d(class)g(\002les)g(into)f(a) +h Ff(JavaClass)c Ft(object)k(is)g(quite)0 1772 y(simple:)109 +1970 y Ff(JavaClass)51 b(clazz)h(=)i(Repository.look)o(up)o(Cl)o(as)o +(s\()o("ja)o(va)o(.l)o(an)o(g.)o(Str)o(in)o(g")o(\);)146 +2168 y Ft(The)19 b(r)n(epository)e(also)i(contains)g(methods)f(pr)n +(oviding)h(the)f(dynamic)i(equivalent)f(of)g(the)g Ff(instanceof)0 +2281 y Ft(operator)-7 b(,)21 b(and)i(other)e(useful)h(r)n(outines:)109 +2479 y Ff(if\(Repository.i)o(ns)o(ta)o(nce)o(Of)o(\(c)o(la)o(zz)o(,)49 +b(super_class\))g({)218 2592 y(...)109 2705 y(})0 2961 +y Fg(3.2.1)99 b(Accessing)25 b(class)h(\002le)f(data)0 +3138 y Ft(Information)39 b(within)g(the)f(class)i(\002le)f(components)e +(may)j(be)e(accessed)g(like)i(Java)g(Beans)e(via)j(intuitive)0 +3251 y(set/get)19 b(methods.)26 b(All)c(of)g(them)f(also)h(de\002ne)e +(a)i Ff(toString\(\))17 b Ft(method)j(so)h(that)h(implementing)f(a)h +(simple)0 3364 y(class)h(viewer)f(is)h(very)f(easy)-10 +b(.)27 b(In)22 b(fact)i(all)g(of)f(the)e(examples)i(used)e(her)n(e)h +(have)h(been)f(pr)n(oduced)f(this)h(way:)109 3562 y Ff(System.out.prin) +o(tl)o(n\()o(cla)o(zz)o(\);)109 3675 y(printCode\(clazz)o(.g)o(et)o +(Met)o(ho)o(ds)o(\(\))o(\);)109 3788 y(...)109 3901 y(public)52 +b(static)g(void)g(printCode\(Method)o([])c(methods\))j({)218 +4014 y(for\(int)h(i=0;)g(i)i(<)g(methods.length;)48 b(i++\))53 +b({)327 4127 y(System.out.prin)o(tln)o(\(m)o(et)o(ho)o(ds)o([i])o(\);) +327 4352 y(Code)g(code)g(=)h(methods[i].get)o(Cod)o(e\()o(\);)327 +4465 y(if\(code)e(!=)h(null\))g(//)g(Non-abstract)c(method)436 +4578 y(System.out.print)o(ln)o(\(c)o(od)o(e\))o(;)218 +4691 y(})109 4804 y(})0 5060 y Fg(3.2.2)99 b(Analyzing)25 +b(class)g(data)0 5237 y Ft(Last)g(but)h(not)f(least,)h +Fe(BCEL)i Ft(supports)23 b(the)i Fs(V)-7 b(isitor)28 +b Ft(design)d(pattern)g([GHJV95)q(],)h(so)g(one)f(can)i(write)e +(visitor)0 5350 y(objects)e(to)h(traverse)f(and)h(analyze)h(the)e +(contents)f(of)i(a)h(class)f(\002le.)32 b(Included)23 +b(in)h(the)g(distribution)f(is)h(a)h(class)0 5463 y Ff(JasminVisitor)17 +b Ft(that)22 b(converts)g(class)h(\002les)f(into)h(the)e(Jasmin)j +(assembler)e(language)h([MD97)q(].)1863 5712 y Fq(12)p +eop +%%Page: 13 13 +13 12 bop 0 407 a Fm(3.3)119 b(ClassGen)0 587 y Ft(This)26 +b(part)g(of)g(the)g(API)g(\(package)g Ff(de.fub.bytecod)o(e.)o(gen)o +(er)o(ic)o Ft(\))21 b(supplies)k(an)i(abstraction)f(level)h(for)0 +700 y(cr)n(eating)c(or)f(transforming)g(class)h(\002les)f(dynamically) +-10 b(.)29 b(It)22 b(makes)g(the)g(static)g(constraints)g(of)g(Java)j +(class)d(\002les)0 813 y(like)35 b(the)e(har)n(d-coded)h(byte)f(code)h +(addr)n(esses)e(generic.)63 b(The)34 b(generic)f(constant)h(pool,)j +(for)d(example,)j(is)0 926 y(implemented)23 b(by)h(the)f(class)h +Ff(ConstantPoolGen)18 b Ft(which)24 b(of)n(fers)g(methods)e(for)i +(adding)f(dif)n(fer)n(ent)h(types)0 1039 y(of)h(constants.)34 +b(Accor)n(dingly)-10 b(,)25 b Ff(ClassGen)d Ft(of)n(fers)i(an)i +(interface)f(to)f(add)h(methods,)f(\002elds,)g(and)h(attributes.)0 +1152 y(Figur)n(e)d(4)h(gives)f(an)h(overview)g(of)f(this)h(part)f(of)h +(the)e(API.)0 1422 y Fg(3.3.1)99 b(T)-9 b(ypes)0 1603 +y Ft(W)h(e)28 b(abstract)i(fr)n(om)f(the)g(concr)n(ete)f(details)h(of)g +(the)g(type)e(signatur)n(e)i(syntax)f(\(see)g(2.5\))i(by)f(intr)n +(oducing)g(the)0 1716 y Ff(Type)23 b Ft(class,)k(which)e(is)h(used,)e +(for)h(example,)g(by)g(methods)f(to)g(de\002ne)g(their)h(r)n(eturn)f +(and)i(ar)n(gument)e(types.)0 1829 y(Concr)n(ete)j(sub-classes)f(ar)n +(e)i Ff(BasicType)p Ft(,)c Ff(ObjectType)p Ft(,)f(and)k +Ff(ArrayType)d Ft(which)j(consists)f(of)h(the)g(el-)0 +1942 y(ement)33 b(type)f(and)i(the)f(number)g(of)h(dimensions.)60 +b(For)33 b(commonly)h(used)f(types)e(the)i(class)i(of)n(fers)e(some)0 +2055 y(pr)n(ede\002ned)23 b(constants.)36 b(For)25 b(example)h(the)f +(method)f(signatur)n(e)h(of)h(the)f Ff(main)f Ft(method)h(as)g(shown)g +(in)h(sec-)0 2168 y(tion)c(2.5)i(is)e(r)n(epr)n(esented)e(by:)109 +2403 y Ff(Type)162 b(return_type)49 b(=)55 b(Type.VOID;)109 +2516 y(Type[])d(arg_types)159 b(=)55 b(new)e(Type[])f({)i(new)f +(ArrayType\(Type)o(.ST)o(RI)o(NG)o(,)48 b(1\))54 b(};)146 +2750 y(Type)18 b Ft(also)i(contains)g(methods)e(to)h(convert)h(types)d +(into)j(textual)f(signatur)n(es)g(and)h(vice)g(versa.)27 +b(The)19 b(sub-)0 2863 y(classes)24 b(contain)g(implementations)g(of)g +(the)f(r)n(outines)g(and)h(constraints)f(speci\002ed)g(by)h(the)f(Java) +j(Language)0 2976 y(Speci\002cation)d([GJS96)q(].)0 3247 +y Fg(3.3.2)99 b(Generic)24 b(\002elds)h(and)g(methods)0 +3427 y Ft(Fields)f(ar)n(e)i(r)n(epr)n(esented)c(by)j +Ff(FieldGen)c Ft(objects,)k(which)g(may)h(be)e(fr)n(eely)h(modi\002ed)f +(by)h(the)f(user)-7 b(.)34 b(If)25 b(they)0 3540 y(have)e(the)g(access) +g(rights)f Ff(static)52 b(final)p Ft(,)20 b(i.e.)29 b(ar)n(e)24 +b(constants)d(and)i(of)g(basic)i(type,)c(they)h(may)h(optionally)0 +3653 y(have)g(an)g(initializing)i(value.)146 3768 y(Generic)d(methods)e +(contain)i(methods)e(to)h(add)h(exceptions)e(the)h(method)f(may)i(thr)n +(ow)-8 b(,)21 b(local)i(variables,)0 3881 y(and)g(exception)e +(handlers.)27 b(The)22 b(latter)g(two)g(ar)n(e)h(r)n(epr)n(esented)c +(by)k(user)n(-con\002gurable)f(objects)g(as)g(well.)29 +b(Be-)0 3994 y(cause)20 b(exception)e(handlers)i(and)f(local)j +(variables)f(contain)f(r)n(efer)n(ences)f(to)g(byte)g(code)h(addr)n +(esses,)d(they)i(also)0 4107 y(take)j(the)g(r)n(ole)h(of)g(an)g +Fs(instruction)h(tar)n(geter)i Ft(in)d(our)f(terminology)-10 +b(.)27 b(Instr)o(uction)22 b(tar)n(geters)f(contain)i(a)g(method)0 +4220 y Ff(updateTarget\(\))i Ft(to)31 b(r)n(edir)n(ect)g(a)h(r)n(efer)n +(ence.)54 b(Generic)32 b(\(non-abstract\))g(methods)d(r)n(efer)i(to)g +Fs(instruction)0 4332 y(lists)g Ft(that)e(consist)f(of)h(instr)o +(uction)g(objects.)47 b(Refer)n(ences)28 b(to)g(byte)g(code)h(addr)n +(esses)e(ar)n(e)i(implemented)f(by)0 4445 y(handles)22 +b(to)g(instr)o(uction)g(objects.)28 b(This)22 b(is)h(explained)f(in)h +(mor)n(e)f(detail)h(in)g(the)f(following)h(sections.)146 +4560 y(The)32 b(maximum)h(stack)f(size)g(needed)e(by)i(the)f(method)g +(and)h(the)f(maximum)j(number)e(of)g(local)i(vari-)0 +4673 y(ables)25 b(used)e(may)i(be)f(set)f(manually)j(or)e(computed)f +(via)j(the)d Ff(setMaxStack\(\))c Ft(and)24 b Ff(setMaxLocals\(\))0 +4786 y Ft(methods)d(automatically)-10 b(.)0 5056 y Fg(3.3.3)99 +b(Instructions)0 5237 y Ft(Modeling)25 b(instr)o(uctions)g(as)h +(objects)f(may)h(look)f(somewhat)g(odd)f(at)i(\002rst)f(sight,)g(but)h +(in)g(fact)h(enables)e(pr)n(o-)0 5350 y(grammers)g(to)f(obtain)i(a)g +(high-level)g(view)f(upon)f(contr)n(ol)i(\003ow)f(without)f(handling)h +(details)g(like)h(concr)n(ete)0 5463 y(byte)c(code)h(of)n(fsets.)29 +b(Instr)o(uctions)22 b(consist)g(of)h(a)h(tag,)f(i.e.)30 +b(an)24 b(opcode,)d(their)i(length)g(in)h(bytes)e(and)h(an)h(of)n(fset) +1863 5712 y Fq(13)p eop +%%Page: 14 14 +14 13 bop 383 5113 a @beginspecial 13 @llx 12 @lly 535 +@urx 830 @ury 3671 @rwi @setspecial +%%BeginDocument: eps/classgen.eps +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: Rose Diagram(s) +%%Creator: AdobePS5.dll Version 5.0 +%%CreationDate: 7/7/1999 17:42:13 +%%Pages: 1 +%%Orientation: Portrait +%%PageOrder: Ascend +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%DocumentData: Clean7Bit +%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 +%%LanguageLevel: 2 +%%BoundingBox: 13 12 535 830 +%%EndComments +%%BeginProcSet: epsffit 1 0 +gsave +1249.738 -7.476 translate +90 rotate +1.623 1.623 scale +%%EndProcSet + + +%%BeginDefaults +%%PageBoundingBox: 13 12 582 830 +%%EndDefaults + +%%BeginProlog +%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 +/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false +setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype +ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch +def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 +rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def +/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def +typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 +def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp +exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def +/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype +{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} +readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop +(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def +/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) +tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup +xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint +tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck +{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) +tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup +rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} +forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier +/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin +$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 +ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto +(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt +$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} +repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print +(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup +0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop +/setpacking where{pop oldpack setpacking}if}if +%%EndResource +userdict /Pscript_WinNT_Incr 230 dict dup begin put +%%BeginResource: file Pscript_FatalError 5.0 0 +/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div +cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def +%%EndResource +/VM?{vmstatus exch sub exch pop gt{[ +(This job requires more memory than is available in this printer.)100 500 +(Try one or more of the following, and then print again:)100 485 +(For the output format, choose Optimize For Portability.)115 470 +(In the Device Settings page, make sure the Available PostScript Memory is accurate.) +115 455(Reduce the number of fonts in the document.)115 440 +(Print the document in parts.)115 425 12/Times-Roman showpage +(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def +%%BeginResource: file Pscript_Win_Basic 5.0 0 +/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ +/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- +/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , +d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C +/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M +/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d +/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage +, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false +/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d +/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, +d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx +matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit +/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} +b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U +/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d +reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d +/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 +sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} +b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b +/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b +/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} +b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b +%%EndResource +%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 +/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge +{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ +snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F +setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d +/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b +%%EndResource +end +%%EndProlog + +%%BeginSetup +[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec +1 setlinecap 1 setlinejoin +/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def +%%EndSetup + +%%Page: 1 1 +%%PageBoundingBox: 13 12 582 830 +%%EndPageComments +%%BeginPageSetup +/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh +%%EndPageSetup + +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Win_GdiObject 5.0 0 +/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore +{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d +/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps +L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType +1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d +/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal +{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep +gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b +/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M +MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep +M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 ++}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d +/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix +GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 +/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal +makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 +/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d +/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] +d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 +0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne +{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd +aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx +PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save +8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 +Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx +matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` +xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill +{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot +concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap +YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 +-0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix +currentmatrix readonly d ; ;}if}b +%%EndResource +%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 +/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} +{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 +d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d +20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d +/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ +/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict +~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} +? ;}b +%%EndResource +end reinitialize +: N 234 594 236 124 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 470 593 M 233 593 I 233 718 I 470 718 I C +K +0 0 0 1 scol Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Text 5.0 0 +/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d +/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ +length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets +{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& +/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} +if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ +{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get +StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ +{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ +length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ +put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M +currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d +/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N +/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix +astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get +length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d +/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS +{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 +copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for +& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ +4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 +add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for +/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 +Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName +length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length +string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ +putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 +$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? +{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName +get undefinefont}forall undefinefont}b +%%EndResource +end reinitialize +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Encoding256 5.0 0 +/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction +/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign +/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma +/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon +/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S +/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave +/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright +/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis +/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef +/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet +/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef +/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section +/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered +/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph +/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter +/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis +/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute +/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls +/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute +/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve +/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex +/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put +%%EndResource +end reinitialize + +%%IncludeResource: font Helvetica +F /F0 0 /256 T /Helvetica mF +/F0S29 F0 [41 0 0 -41 0 0 ] mFS +F0S29 Ji +257 643 M (BasicType)[27 23 20 8 21 26 19 23 0]xS +0.602 0 0.199 1 scol N 470 659 M 233 659 I 233 718 I 470 718 I C +K +N 470 682 M 233 682 I 233 718 I 470 718 I C +K +: N 252 292 360 184 rp C +1 1 0.801 1 scol L ; N 612 291 M 251 291 I 251 476 I 612 476 I C +K +0 0 0 1 scol 326 341 M (ObjectType)[32 23 10 23 21 11 26 19 23 0]xS +0.602 0 0.199 1 scol N 612 357 M 251 357 I 251 476 I 612 476 I C +K +N 612 380 M 251 380 I 251 476 I 612 476 I C +K +0 0 0 1 scol 310 448 M (getClassName\(\))[23 23 11 30 10 23 20 20 30 23 36 23 14 0]xS +: N 699 292 362 184 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1061 291 M 698 291 I 698 476 I 1061 476 I C +K +0 0 0 1 scol 786 341 M (ArrayType)[27 14 14 23 19 26 19 23 0]xS +0.602 0 0.199 1 scol N 1061 357 M 698 357 I 698 476 I 1061 476 I C +K +N 1061 380 M 698 380 I 698 476 I 1061 476 I C +K +0 0 0 1 scol 757 448 M (getDimensions\(\))[23 23 11 30 8 36 23 23 20 8 23 23 20 14 0]xS +: N 532 594 312 124 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 844 593 M 531 593 I 531 718 I 844 718 I C +K +0 0 0 1 scol 546 643 M (ReferenceType)[30 23 12 23 14 23 23 21 23 26 19 23 0]xS +0.602 0 0.199 1 scol N 844 659 M 531 659 I 531 718 I 844 718 I C +K +N 844 682 M 531 682 I 531 718 I 844 718 I C +K +: N 1202 295 284 178 rp C +1 1 0.801 1 scol L ; N 1486 294 M 1201 294 I 1201 473 I 1486 473 I C +K +0 0 0 1 scol +%%IncludeResource: font Helvetica-Oblique +F /F1 0 /256 T /Helvetica-Oblique mF +/F1S29 F1 [41 0 0 -41 0 0 ] mFS +F1S29 Ji +1226 343 M (AccessFlags)[27 21 21 23 21 21 25 9 23 23 0]xS +0.602 0 0.199 1 scol N 1486 360 M 1201 360 I 1201 473 I 1486 473 I C +K +N 1486 383 M 1201 383 I 1201 473 I 1486 473 I C +K +0 0 0 1 scol 1260 450 M (isPublic\(\))[9 21 27 23 23 9 9 21 14 0]xS +0.602 0 0.199 1 scol N 1344 602 M 1344 474 I K +N 1059 602 M 1634 602 I K +N 1344 474 M 1366 534 I 1322 534 I C +: 1 1 1 1 scol O ; K +N 678 500 M 678 593 I K +N 369 500 M 881 500 I K +N 678 593 M 700 533 I 656 533 I C +: 1 1 1 1 scol O ; K +N 369 477 M 369 500 I K +N 881 477 M 881 500 I K +: N 919 683 306 234 rp C +1 1 0.801 1 scol L ; N 1225 682 M 918 682 I 918 917 I 1225 917 I C +K +0 0 0 1 scol F0S29 Ji +988 732 M (FieldGen)[25 8 23 10 23 32 23 0]xS +0.602 0 0.199 1 scol N 1225 748 M 918 748 I 918 917 I 1225 917 I C +K +N 1225 771 M 918 771 I 918 917 I 1225 917 I C +K +0 0 0 1 scol 977 839 M (getField\(\))[23 23 11 25 8 23 10 23 14 0]xS +977 886 M (setInitValue\(\))[20 23 11 10 23 8 11 27 23 10 23 23 14 0]xS +0.602 0 0.199 1 scol N 1059 682 M 1059 602 I K +: N 543 1283 386 122 rp C +1 1 0.801 1 scol L ; N 929 1282 M 542 1282 I 542 1405 I 929 1405 I C +K +0 0 0 1 scol 571 1332 M (LocalVariableGen)[23 23 21 23 10 27 23 14 8 23 23 10 23 32 23 0]xS +0.602 0 0.199 1 scol N 929 1348 M 542 1348 I 542 1405 I 929 1405 I C +K +N 929 1371 M 542 1371 I 542 1405 I 929 1405 I C +K +: N 538 1106 396 124 rp C +1 1 0.801 1 scol L ; N 934 1105 M 537 1105 I 537 1230 I 934 1230 I C +K +0 0 0 1 scol 559 1155 M (CodeExceptionGen)[30 23 23 23 27 18 21 23 23 11 8 23 23 32 23 0]xS +0.602 0 0.199 1 scol N 934 1171 M 537 1171 I 537 1230 I 934 1230 I C +K +N 934 1194 M 537 1194 I 537 1230 I 934 1230 I C +K +: N 351 836 322 184 rp C +1 1 0.801 1 scol L ; N 673 835 M 350 835 I 350 1020 I 673 1020 I C +K +0 0 0 1 scol 466 885 M (Type)[26 19 23 0]xS +0.602 0 0.199 1 scol N 673 901 M 350 901 I 350 1020 I 673 1020 I C +K +N 673 924 M 350 924 I 350 1020 I 673 1020 I C +K +0 0 0 1 scol 409 992 M (getSignature\(\))[23 23 11 27 8 23 23 23 11 23 14 23 14 0]xS +0.602 0 0.199 1 scol N 512 745 M 512 835 I K +N 347 745 M 669 745 I K +N 512 835 M 534 775 I 490 775 I C +: 1 1 1 1 scol O ; K +N 795 862 M 674 889 I K +N 795 862 M 917 833 I K +N 347 719 M 347 745 I K +N 669 719 M 669 745 I K +: N 538 1457 364 126 rp C +1 1 0.801 1 scol L ; N 902 1456 M 537 1456 I 537 1583 I 902 1583 I C +K +0 0 0 1 scol 561 1506 M (BranchInstruction)[27 14 23 23 21 23 10 23 20 11 14 23 21 11 8 23 0]xS +0.602 0 0.199 1 scol N 902 1522 M 537 1522 I 537 1583 I 902 1583 I C +K +N 902 1545 M 537 1545 I 537 1583 I 902 1583 I C +K +: N 1157 1012 342 184 rp C +1 1 0.801 1 scol L ; N 1499 1011 M 1156 1011 I 1156 1196 I 1499 1196 I C +K +0 0 0 1 scol 1221 1061 M (MethodGen)[33 23 11 23 23 23 32 23 0]xS +0.602 0 0.199 1 scol N 1499 1077 M 1156 1077 I 1156 1196 I 1499 1196 I C +K +N 1499 1100 M 1156 1100 I 1156 1196 I 1499 1196 I C +K +0 0 0 1 scol 1215 1168 M (addException\(\))[23 23 23 27 18 21 23 23 11 8 23 23 14 0]xS +0.602 0 0.199 1 scol N 1022 1227 M 1155 1172 I K +N 1155 1172 M 1136 1196 I 1105 1193 I 1124 1168 I 1155 1172 I C +: 1 1 1 1 scol O ; K +N 1022 1227 M 886 1281 I K +N 913 1302 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 913 1340 M (*)S +N 913 1302 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 913 1340 M (*)S +0.602 0 0.199 1 scol N 1045 1134 M 1155 1121 I K +N 1155 1121 M 1130 1139 I 1101 1127 I 1126 1109 I 1155 1121 I C +: 1 1 1 1 scol O ; K +N 1045 1134 M 935 1145 I K +N 934 1068 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 934 1106 M (*)S +N 934 1068 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 934 1106 M (*)S +0.602 0 0.199 1 scol N 914 1014 M 674 962 I K +N 914 1014 M 1155 1066 I K +N 1344 1011 M 1344 602 I K +: N 1751 1012 306 184 rp C +1 1 0.801 1 scol L ; N 2057 1011 M 1750 1011 I 1750 1196 I 2057 1196 I C +K +0 0 0 1 scol 1779 1061 M (InstructionList)[10 23 20 11 14 23 21 11 8 23 23 23 8 20 0]xS +0.602 0 0.199 1 scol N 2057 1077 M 1750 1077 I 1750 1196 I 2057 1196 I C +K +N 2057 1100 M 1750 1100 I 1750 1196 I 2057 1196 I C +K +0 0 0 1 scol 1809 1168 M (append\(\))[23 23 23 23 23 23 14 0]xS +0.602 0 0.199 1 scol N 1624 1104 M 1749 1104 I K +N 1624 1104 M 1500 1104 I K +: N 1201 1313 222 190 rp C +1 1 0.801 1 scol L ; N 1423 1312 M 1200 1312 I 1200 1503 I 1423 1503 I C +K +0 0 0 1 scol 1219 1362 M (Instruction)[10 23 20 11 14 23 21 11 8 23 0]xS +0.602 0 0.199 1 scol N 1423 1378 M 1200 1378 I 1200 1503 I 1423 1503 I C +K +N 1423 1495 M 1200 1495 I 1200 1503 I 1423 1503 I C +K +0 0 0 1 scol 1259 1422 M (tag)[11 23 0]xS +1259 1469 M (length)[10 23 23 23 11 0]xS +0.602 0 0.199 1 scol N 903 1485 M 1199 1429 I K +N 1199 1429 M 1144 1462 I 1136 1418 I C +: 1 1 1 1 scol O ; K +: N 1722 1345 364 126 rp C +1 1 0.801 1 scol L ; N 2086 1344 M 1721 1344 I 1721 1471 I 2086 1471 I C +K +0 0 0 1 scol 1744 1394 M (InstructionHandle)[10 23 20 11 14 23 21 11 8 23 23 30 23 23 23 10 0]xS +0.602 0 0.199 1 scol N 2086 1410 M 1721 1410 I 1721 1471 I 2086 1471 I C +K +N 2086 1433 M 1721 1433 I 1721 1471 I 2086 1471 I C +K +N 1904 1270 M 1904 1197 I K +N 1947 1181 23 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1947 1219 M (1)S +0.602 0 0.199 1 scol N 1904 1197 M 1919 1224 I 1904 1251 I 1889 1224 I 1904 1197 I C +: 1 1 1 1 scol O ; K +N 1904 1270 M 1904 1343 I K +N 1950 1313 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1950 1351 M (*)S +N 1947 1181 23 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1947 1219 M (1)S +N 1950 1313 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1950 1351 M (*)S +0.602 0 0.199 1 scol N 1572 1408 M 1424 1408 I K +N 1429 1439 23 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1429 1477 M (1)S +0.602 0 0.199 1 scol N 1572 1408 M 1720 1408 I K +N 1693 1439 23 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1693 1477 M (1)S +N 1429 1439 23 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1429 1477 M (1)S +N 1693 1439 23 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1693 1477 M (1)S +: N 0 1224 384 240 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol : 0 1223 385 242 rc N 384 1223 M -1 1223 I -1 1464 I 384 1464 I C +K +; 0 0 0 1 scol 20 1323 M (InstructionTargeter)[10 23 20 11 14 23 21 11 8 23 23 26 23 14 23 23 11 23 0]xS +0.602 0 0.199 1 scol : 0 1339 385 126 rc N 384 1339 M -1 1339 I -1 1464 I 384 1464 I C +K +; : 0 1362 385 103 rc N 384 1362 M -1 1362 I -1 1464 I 384 1464 I C +K +; 0 0 0 1 scol 58 1430 M (updateTarget\(\))[23 23 23 23 11 23 26 23 14 23 23 11 14 0]xS +64 1273 M (<>)[24 24 10 23 11 23 14 12 23 21 23 24 0]xS +1 1 1 1 scol [ 72 24 ] 0 sd N 540 1231 M 385 1280 I K +0 0 0 1 scol [ 72 24 ] 0 sd N 540 1231 M 385 1280 I K +0.602 0 0.199 1 scol solid N 385 1280 M 449 1283 I 435 1241 I C +: 1 1 1 1 scol O ; K +1 1 1 1 scol [ 72 24 ] 0 sd N 541 1344 M 385 1344 I K +0 0 0 1 scol [ 72 24 ] 0 sd N 541 1344 M 385 1344 I K +0.602 0 0.199 1 scol solid N 385 1344 M 445 1366 I 445 1322 I C +: 1 1 1 1 scol O ; K +N 1043 1616 M 1903 1616 I K +N 1903 1616 M 1903 1472 I K +N 1949 1550 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1949 1588 M (*)S +0.602 0 0.199 1 scol N 1043 1616 M 191 1616 I K +N 191 1616 M 191 1465 I K +N 237 1542 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 237 1580 M (*)S +N 1949 1550 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1949 1588 M (*)S +N 237 1542 16 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 237 1580 M (*)S +N 1186 1556 221 47 rp C +1 1 1 1 scol L 0 0 0 1 scol 1186 1594 M (<>)[24 24 11 23 14 23 23 11 20 24 0]xS +: N 1707 306 362 284 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2069 305 M 1706 305 I 1706 590 I 2069 590 I C +K +0 0 0 1 scol 1725 355 M (ConstantPoolGen)[30 23 23 20 11 23 23 11 27 23 23 10 32 23 0]xS +0.602 0 0.199 1 scol N 2069 371 M 1706 371 I 1706 590 I 2069 590 I C +K +N 2069 394 M 1706 394 I 1706 590 I 2069 590 I C +K +0 0 0 1 scol 1765 462 M (addClass\(\))[23 23 23 30 10 23 20 20 14 0]xS +1765 509 M (addMethodRef\(\))[23 23 23 33 23 11 23 23 23 30 23 12 14 0]xS +1765 556 M (addInteger\(\))[23 23 23 10 23 11 23 23 23 14 14 0]xS +: N 1475 683 314 234 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1789 682 M 1474 682 I 1474 917 I 1789 917 I C +K +0 0 0 1 scol 1541 732 M (ClassGen)[30 10 23 20 20 32 23 0]xS +0.602 0 0.199 1 scol N 1789 748 M 1474 748 I 1474 917 I 1789 917 I C +K +N 1789 771 M 1474 771 I 1474 917 I 1789 917 I C +K +0 0 0 1 scol 1533 839 M (addInterface\(\))[23 23 23 10 23 11 23 14 12 23 21 23 14 0]xS +1533 886 M (addMethod\(\))[23 23 23 33 23 11 23 23 23 14 0]xS +0.602 0 0.199 1 scol N 1634 682 M 1634 602 I K +N 1751 636 M 1782 591 I K +N 1751 636 M 1717 681 I K +1 1 1 1 scol [ 72 24 ] 0 sd N 536 1458 M 385 1408 I K +0 0 0 1 scol [ 72 24 ] 0 sd N 536 1458 M 385 1408 I K +0.602 0 0.199 1 scol solid N 385 1408 M 449 1406 I 435 1448 I C +: 1 1 1 1 scol O ; K +LH +%%PageTrailer + +%%Trailer +%%DocumentNeededResources: +%%+ font Helvetica-Oblique +%%+ font Helvetica +%%DocumentSuppliedResources: +Pscript_WinNT_Incr dup /terminate get exec +%%EOF +grestore + +%%EndDocument + @endspecial 934 5316 a Fq(Figur)n(e)26 b(4:)k(UML)25 +b(diagram)g(of)g(the)h(ClassGen)e(API)1863 5712 y(14)p +eop +%%Page: 15 15 +15 14 bop 0 407 a Ft(\(or)17 b(index\))g(within)g(the)g(byte)f(code.)25 +b(Since)18 b(many)f(instr)o(uctions)f(ar)n(e)i(immutable,)h(the)e +Ff(InstructionCon)o(st)o(an)o(ts)0 520 y Ft(interface)23 +b(of)n(fers)f(shar)n(eable)h(pr)n(ede\002ned)e(\223\003y-weight\224)h +(constants)g(to)g(use.)146 633 y(Instr)o(uctions)28 b(ar)n(e)h(gr)n +(ouped)e(via)k(sub-classing,)f(the)f(type)e(hierar)n(chy)j(of)f(instr)o +(uction)f(classes)h(is)g(illus-)0 746 y(trated)d(by)h(\(incomplete\))g +(\002gur)n(e)f(9)h(in)h(the)e(appendix.)39 b(The)27 b(most)f(important) +g(family)j(of)e(instr)o(uctions)f(ar)n(e)0 858 y(the)h +Fs(branch)h(instructions)p Ft(,)i(e.g.)42 b Ff(goto)p +Ft(,)27 b(that)h(branch)g(to)f(tar)n(gets)g(somewher)n(e)e(within)j +(the)f(byte)g(code.)42 b(Ob-)0 971 y(viously)-10 b(,)24 +b(this)f(makes)g(them)g(candidates)h(for)f(playing)h(an)g +Ff(InstructionTarge)o(te)o(r)18 b Ft(r)n(ole,)23 b(too.)31 +b(Instr)o(uc-)0 1084 y(tions)16 b(ar)n(e)i(further)e(gr)n(ouped)g(by)h +(the)f(interfaces)h(they)f(implement,)i(ther)n(e)e(ar)n(e,)i(e.g.,)f +Ff(TypedInstructi)o(on)p Ft(s)0 1197 y(that)24 b(ar)n(e)h(associated)f +(with)h(a)g(speci\002c)g(type)e(like)i Ff(ldc)p Ft(,)f(or)g +Ff(ExceptionThrowe)o(r)18 b Ft(instr)o(uctions)24 b(that)h(may)0 +1310 y(raise)e(exceptions)e(when)g(executed.)146 1423 +y(All)i(instr)o(uctions)f(can)h(be)f(traversed)f(via)i +Ff(accept\(Visitor)48 b(v\))22 b Ft(methods,)e(i.e.,)h(the)h(V)-5 +b(isitor)21 b(design)0 1536 y(pattern.)53 b(Ther)n(e)31 +b(is)g(however)f(some)h(special)h(trick)f(in)h(these)e(methods)f(that)i +(allows)h(to)f(mer)n(ge)g(the)f(han-)0 1649 y(dling)21 +b(of)g(certain)g(instr)o(uction)g(gr)n(oups.)26 b(The)20 +b Ff(accept\(\))d Ft(do)j(not)h(only)f(call)j(the)d(corr)n(esponding)f +Ff(visit\(\))0 1762 y Ft(method,)34 b(but)g(call)h Ff(visit\(\))30 +b Ft(methods)i(of)h(their)g(r)n(espective)f(super)g(classes)h(and)h +(implemented)e(inter)n(-)0 1875 y(faces)27 b(\002rst,)g(i.e.)40 +b(the)26 b(most)g(speci\002c)h Ff(visit\(\))d Ft(call)29 +b(is)e(last.)40 b(Thus)26 b(one)g(can)i(gr)n(oup)e(the)g(handling)h +(of,)h(say)-10 b(,)0 1988 y(all)24 b Ff(BranchInstructi)o(on)o +Ft(s)17 b(into)22 b(one)g(single)g(method.)146 2100 y(For)30 +b(debugging)f(purposes)f(it)j(may)g(even)g(make)f(sense)f(to)h +(\223invent\224)i(your)e(own)g(instr)o(uctions.)51 b(In)31 +b(a)0 2213 y(sophisticated)23 b(code)h(generator)f(like)i(the)e(one)h +(used)g(as)g(a)i(backend)e(of)h(the)f(Barat)g(framework)g([BS98)q(])h +(one)0 2326 y(often)h(has)g(to)h(insert)e(temporary)h +Ff(nop)f Ft(\(No)h(operation\))g(instr)o(uctions.)39 +b(When)27 b(examining)g(the)f(pr)n(oduced)0 2439 y(code)34 +b(it)g(may)h(be)f(very)g(dif)n(\002cult)i(to)d(track)i(back)g(wher)n(e) +f(the)f Ff(nop)g Ft(was)i(actually)g(inserted.)62 b(One)34 +b(could)0 2552 y(think)24 b(of)h(a)h(derived)e Ff(nop2)f +Ft(instr)o(uction)h(that)h(contains)g(additional)g(debugging)e +(information.)36 b(When)24 b(the)0 2665 y(instr)o(uction)e(list)h(is)g +(dumped)e(to)h(byte)g(code,)f(the)h(extra)g(data)h(is)g(simply)f(dr)n +(opped.)146 2778 y(One)j(could)g(also)g(think)g(of)g(new)f(byte)g(code) +g(instr)o(uctions)g(operating)g(on)h(complex)g(numbers)f(that)h(ar)n(e) +0 2891 y(r)n(eplaced)e(by)f(normal)h(byte)f(code)g(upon)g(load-time)h +(or)f(ar)n(e)h(r)n(ecognized)f(by)h(a)g(new)f(JVM.)0 +3147 y Fg(3.3.4)99 b(Instruction)25 b(lists)0 3324 y +Ft(An)18 b Fs(instruction)i(list)g Ft(is)e(implemented)g(by)g(a)h(list) +g(of)g Fs(instruction)g(handles)h Ft(encapsulating)f(instr)o(uction)f +(objects.)0 3437 y(Refer)n(ences)k(to)g(instr)o(uctions)h(in)h(the)e +(list)i(ar)n(e)g(thus)e(not)h(implemented)f(by)h(dir)n(ect)g(pointers)f +(to)h(instr)o(uctions)0 3549 y(but)31 b(by)f(pointers)f(to)h(instr)o +(uction)h Fs(handles)p Ft(.)53 b(This)31 b(makes)f(appending,)h +(inserting)f(and)h(deleting)e(ar)n(eas)i(of)0 3662 y(code)25 +b(very)h(simple.)38 b(Since)27 b(we)e(use)h(symbolic)g(r)n(efer)n +(ences,)g(computation)g(of)g(concr)n(ete)g(byte)f(code)g(of)n(fsets)0 +3775 y(does)19 b(not)h(need)f(to)h(occur)h(until)f(\002nalization,)j +(i.e.)k(until)21 b(the)f(user)f(has)i(\002nished)e(the)h(pr)n(ocess)f +(of)i(generating)0 3888 y(or)29 b(transforming)f(code.)46 +b(W)-8 b(e)28 b(will)i(use)e(the)g(term)h(instr)o(uction)f(handle)h +(and)g(instr)o(uction)g(synonymously)0 4001 y(thr)n(oughout)23 +b(the)h(r)n(est)g(of)h(the)f(paper)-7 b(.)35 b(Instr)o(uction)23 +b(handles)i(may)g(contain)h(additional)f(user)n(-de\002ned)e(data)0 +4114 y(using)f(the)g Ff(addAttribute\(\))16 b Ft(method.)0 +4362 y Fg(Appending.)90 b Ft(One)29 b(can)g(append)e(instr)o(uctions)h +(or)g(other)g(instr)o(uction)g(lists)g(anywher)n(e)g(to)g(an)h +(existing)0 4475 y(list.)63 b(The)34 b(instr)o(uctions)g(ar)n(e)h +(appended)d(after)i(the)g(given)g(instr)o(uction)g(handle.)63 +b(All)36 b(append)d(methods)0 4588 y(r)n(eturn)27 b(a)h(new)g(instr)o +(uction)f(handle)h(which)g(may)h(then)d(be)i(used)f(as)h(the)f(tar)n +(get)g(of)h(a)g(branch)h(instr)o(uction,)0 4701 y(e.g..)109 +4898 y Ff(InstructionList)48 b(il)53 b(=)i(new)e(InstructionLis)o(t\()o +(\);)109 5011 y(...)109 5124 y(GOTO)g(g)h(=)g(new)f(GOTO\(null\);)109 +5237 y(il.append\(g\);)109 5350 y(...)109 5463 y(InstructionHand)o(le) +48 b(ih)54 b(=)g(il.append\(Inst)o(ru)o(ct)o(ion)o(Co)o(ns)o(ta)o(nt)o +(s.A)o(CO)o(NS)o(T_)o(NU)o(LL\))o(;)1863 5712 y Fq(15)p +eop +%%Page: 16 16 +16 15 bop 109 407 a Ff(g.setTarget\(ih\))o(;)0 662 y +Fg(Inserting.)91 b Ft(Instr)o(uctions)24 b(may)j(be)f(inserted)e +(anywher)n(e)i(into)g(an)g(existing)f(list.)39 b(They)25 +b(ar)n(e)i(inserted)d(be-)0 775 y(for)n(e)19 b(the)f(given)g(instr)o +(uction)h(handle.)26 b(All)20 b(insert)e(methods)f(r)n(eturn)h(a)h(new) +f(instr)o(uction)h(handle)f(which)i(may)0 888 y(then)i(be)g(used)f(as)i +(the)f(start)g(addr)n(ess)f(of)i(an)g(exception)e(handler)-7 +b(,)23 b(for)f(example.)109 1114 y Ff(InstructionHand)o(le)48 +b(start)k(=)i(il.insert\(inser)o(tio)o(n_)o(po)o(in)o(t,)2073 +1227 y(InstructionCon)o(st)o(ant)o(s.)o(NO)o(P\))o(;)109 +1339 y(...)109 1452 y(mg.addException)o(Ha)o(nd)o(ler)o(\(s)o(ta)o(rt)o +(,)48 b(end,)53 b(handler,)e("java.io.IOExce)o(pt)o(io)o(n"\))o(;)0 +1708 y Fg(Deleting.)91 b Ft(Deletion)34 b(of)f(instr)o(uctions)g(is)h +(also)g(very)f(straightforwar)n(d;)38 b(all)e(instr)o(uction)d(handles) +g(and)0 1820 y(the)28 b(contained)g(instr)o(uctions)f(within)i(a)g +(given)g(range)f(ar)n(e)g(r)n(emoved)g(fr)n(om)h(the)f(instr)o(uction)g +(list)h(and)f(dis-)0 1933 y(posed.)e(The)c Ff(delete\(\))d +Ft(method)i(may)i(however)e(thr)n(ow)h(a)h Ff(TargetLostExcep)o(tio)o +(n)16 b Ft(when)22 b(ther)n(e)g(ar)n(e)0 2046 y(instr)o(uction)e(tar)n +(geters)e(still)j(r)n(efer)n(encing)f(one)f(of)h(the)f(deleted)f(instr) +o(uctions.)26 b(The)20 b(user)f(is)h(for)n(ced)g(to)f(handle)0 +2159 y(such)30 b(exceptions)f(in)i(a)g Ff(try-catch)c +Ft(block)k(and)f(r)n(edir)n(ect)g(these)f(r)n(efer)n(ences)h(elsewher)n +(e.)49 b(The)30 b Fs(peep)j(hole)0 2272 y Ft(optimizer)23 +b(described)e(in)i(section)f(A.3)h(gives)f(a)h(detailed)f(example)h +(for)f(this.)109 2498 y Ff(try)53 b({)218 2611 y(il.delete\(first)o(,) +48 b(last\);)109 2724 y(})54 b(catch\(TargetLos)o(tE)o(xce)o(pt)o(io)o +(n)48 b(e\))54 b({)218 2837 y(InstructionHand)o(le)o([])48 +b(targets)j(=)k(e.getTargets\(\))o(;)218 2949 y(for\(int)d(i=0;)g(i)i +(<)g(targets.length;)48 b(i++\))53 b({)327 3062 y(InstructionTarg)o +(ete)o(r[)o(])48 b(targeters)j(=)j(targets[i].get)o(Tar)o(ge)o(te)o(rs) +o(\(\))o(;)327 3175 y(for\(int)e(j=0;)g(j)i(<)h(targeters.leng)o(th)o +(;)48 b(j++\))491 3288 y(targeters[j].up)o(da)o(te)o(Ta)o(rg)o(et\()o +(ta)o(rg)o(et)o(s[)o(i],)g(new_target\);)218 3401 y(})109 +3514 y(})0 3769 y Fg(Finalizing.)92 b Ft(When)27 b(the)g(instr)o +(uction)h(list)g(is)g(r)n(eady)g(to)f(be)h(dumped)f(to)g(pur)n(e)h +(byte)f(code,)h(all)h(symbolic)0 3882 y(r)n(efer)n(ences)35 +b(must)g(be)h(mapped)g(to)f(r)n(eal)i(byte)e(code)h(of)n(fsets.)67 +b(This)36 b(is)g(done)f(by)h(the)f Ff(getByteCode\(\))0 +3995 y Ft(method)23 b(which)i(is)f(called)h(by)f(default)g(by)g +Ff(MethodGen.getMe)o(th)o(od)o(\(\))o Ft(.)j(Afterwar)n(ds)c(you)g +(should)g(call)0 4108 y Ff(dispose\(\))c Ft(so)j(that)h(the)f(instr)o +(uction)h(handles)f(can)i(be)f(r)n(eused)e(internally)-10 +b(.)29 b(This)23 b(helps)f(to)g(r)n(educe)h(mem-)0 4221 +y(ory)f(usage.)109 4447 y Ff(InstructionList)48 b(il)53 +b(=)i(new)e(InstructionLis)o(t\()o(\);)109 4672 y(ClassGen)106 +b(cg)53 b(=)h(new)f(ClassGen\("HelloW)o(or)o(ld)o(",)48 +b("java.lang.Obje)o(ct)o(",)1636 4785 y("",)h(ACC_PUBLIC)h +(|)k(ACC_SUPER,)1636 4898 y(null\);)109 5011 y(MethodGen)d(mg)i(=)h +(new)f(MethodGen\(ACC_ST)o(AT)o(IC)48 b(|)54 b(ACC_PUBLIC,)1691 +5124 y(Type.VOID,)c(new)j(Type[])f({)1800 5237 y(new)h +(ArrayType\(Type.)o(ST)o(RIN)o(G,)48 b(1\))1691 5350 +y(},)54 b(new)f(String[])e({)j("argv")e(},)1691 5463 +y("main",)f("HelloWorld",)e(il,)k(cp\);)1863 5712 y Fq(16)p +eop +%%Page: 17 17 +17 16 bop 109 407 a Ff(...)109 520 y(cg.addMethod\(mg)o(.g)o(et)o(Met)o +(ho)o(d\()o(\)\))o(;)109 633 y(il.dispose\(\);)49 b(//)k(Reuse)g +(instruction)c(handles)j(of)h(list)0 887 y Fg(3.3.5)99 +b(Code)25 b(example)f(revisited)0 1063 y Ft(Using)h(instr)o(uction)g +(lists)h(gives)f(us)g(a)i(generic)e(view)h(upon)e(the)h(code:)34 +b(In)25 b(Figur)n(e)g(5)h(we)f(again)i(pr)n(esent)d(the)0 +1176 y(code)e(chunk)h(of)g(the)f Ff(readInt\(\))d Ft(method)i(of)i(the) +f(faculty)i(example)e(in)i(section)e(2.6:)29 b(The)22 +b(local)j(variables)0 1289 y Ff(n)k Ft(and)g Ff(e1)g +Ft(both)g(hold)g(two)g(r)n(efer)n(ences)f(to)h(instr)o(uctions,)h +(de\002ning)e(their)h(scope.)47 b(Ther)n(e)29 b(ar)n(e)h(two)e +Ff(goto)p Ft(s)0 1402 y(branching)g(to)e(the)g Ff(iload)f +Ft(at)j(the)e(end)g(of)h(the)f(method.)40 b(One)27 b(of)g(the)f +(exception)g(handlers)g(is)i(displayed,)0 1515 y(too:)f(it)c(r)n(efer)n +(ences)e(the)h(start)g(and)h(the)e(end)h(of)h(the)f Ff(try)f +Ft(block)i(and)g(also)f(the)g(exception)g(handler)g(code.)0 +4170 y @beginspecial 0 @llx 0 @lly 583 @urx 386 @ury +4590 @rwi @setspecial +%%BeginDocument: eps/il.eps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: il.eps +%%Creator: fig2dev Version 3.2 Patchlevel 1 +%%CreationDate: Wed Dec 2 15:26:46 1998 +%%For: dahm@che (Markus Dahm,,,,,) +%%Orientation: Portrait +%%BoundingBox: 0 0 583 386 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +-84.0 526.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n -1000 9337 m -1000 -1000 l 11587 -1000 l 11587 9337 l cp clip + 0.06299 0.06299 sc +% Polyline +7.500 slw + [60] 0 sd +gs clippath +5205 7530 m 5175 7650 l 5145 7530 l 5145 7665 l 5205 7665 l cp +clip +n 5175 6975 m 5175 7650 l gs col0 s gr gr + [] 0 sd +% arrowhead +n 5205 7530 m 5175 7650 l 5145 7530 l col0 s +% Polyline + [60] 0 sd +gs clippath +5595 7095 m 5625 6975 l 5655 7095 l 5655 6960 l 5595 6960 l cp +clip +n 5625 7650 m 5625 6975 l gs col0 s gr gr + [] 0 sd +% arrowhead +n 5595 7095 m 5625 6975 l 5655 7095 l col0 s +% Polyline + [60] 0 sd +gs clippath +5205 3930 m 5175 4050 l 5145 3930 l 5145 4065 l 5205 4065 l cp +clip +n 5175 3375 m 5175 4050 l gs col0 s gr gr + [] 0 sd +% arrowhead +n 5205 3930 m 5175 4050 l 5145 3930 l col0 s +% Polyline + [60] 0 sd +gs clippath +5595 3495 m 5625 3375 l 5655 3495 l 5655 3360 l 5595 3360 l cp +clip +n 5625 4050 m 5625 3375 l gs col0 s gr gr + [] 0 sd +% arrowhead +n 5595 3495 m 5625 3375 l 5655 3495 l col0 s +% Polyline +n 4380 6750 m 4275 6750 4275 6870 105 arcto 4 {pop} repeat + 4275 6975 6420 6975 105 arcto 4 {pop} repeat + 6525 6975 6525 6855 105 arcto 4 {pop} repeat + 6525 6750 4380 6750 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 6930 m +gs 1 -1 sc (goto) col0 sh gr +% Polyline +n 4380 6300 m 4275 6300 4275 6420 105 arcto 4 {pop} repeat + 4275 6525 6420 6525 105 arcto 4 {pop} repeat + 6525 6525 6525 6405 105 arcto 4 {pop} repeat + 6525 6300 4380 6300 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4455 6480 m +gs 1 -1 sc (invokevirtual) col0 sh gr +% Polyline +n 4380 5850 m 4275 5850 4275 5970 105 arcto 4 {pop} repeat + 4275 6075 6420 6075 105 arcto 4 {pop} repeat + 6525 6075 6525 5955 105 arcto 4 {pop} repeat + 6525 5850 4380 5850 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 6030 m +gs 1 -1 sc (aload) col0 sh gr +% Polyline +n 4380 5400 m 4275 5400 4275 5520 105 arcto 4 {pop} repeat + 4275 5625 6420 5625 105 arcto 4 {pop} repeat + 6525 5625 6525 5505 105 arcto 4 {pop} repeat + 6525 5400 4380 5400 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 5580 m +gs 1 -1 sc (getstatic) col0 sh gr +% Polyline +n 4380 4950 m 4275 4950 4275 5070 105 arcto 4 {pop} repeat + 4275 5175 6420 5175 105 arcto 4 {pop} repeat + 6525 5175 6525 5055 105 arcto 4 {pop} repeat + 6525 4950 4380 4950 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 5130 m +gs 1 -1 sc (astore) col0 sh gr +% Polyline +n 4380 4500 m 4275 4500 4275 4620 105 arcto 4 {pop} repeat + 4275 4725 6420 4725 105 arcto 4 {pop} repeat + 6525 4725 6525 4605 105 arcto 4 {pop} repeat + 6525 4500 4380 4500 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 4680 m +gs 1 -1 sc (goto) col0 sh gr +% Polyline +n 4380 4050 m 4275 4050 4275 4170 105 arcto 4 {pop} repeat + 4275 4275 6420 4275 105 arcto 4 {pop} repeat + 6525 4275 6525 4155 105 arcto 4 {pop} repeat + 6525 4050 4380 4050 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4455 4230 m +gs 1 -1 sc (istore) col0 sh gr +% Polyline +gs clippath +5595 4395 m 5625 4275 l 5655 4395 l 5655 4260 l 5595 4260 l cp +clip +n 5625 4500 m 5625 4275 l gs col0 s gr gr + +% arrowhead +n 5595 4395 m 5625 4275 l 5655 4395 l col0 s +% Polyline +gs clippath +5205 4380 m 5175 4500 l 5145 4380 l 5145 4515 l 5205 4515 l cp +clip +n 5175 4275 m 5175 4500 l gs col0 s gr gr + +% arrowhead +n 5205 4380 m 5175 4500 l 5145 4380 l col0 s +% Polyline +gs clippath +5595 4845 m 5625 4725 l 5655 4845 l 5655 4710 l 5595 4710 l cp +clip +n 5625 4950 m 5625 4725 l gs col0 s gr gr + +% arrowhead +n 5595 4845 m 5625 4725 l 5655 4845 l col0 s +% Polyline +gs clippath +5205 4830 m 5175 4950 l 5145 4830 l 5145 4965 l 5205 4965 l cp +clip +n 5175 4725 m 5175 4950 l gs col0 s gr gr + +% arrowhead +n 5205 4830 m 5175 4950 l 5145 4830 l col0 s +% Polyline +gs clippath +5595 5295 m 5625 5175 l 5655 5295 l 5655 5160 l 5595 5160 l cp +clip +n 5625 5400 m 5625 5175 l gs col0 s gr gr + +% arrowhead +n 5595 5295 m 5625 5175 l 5655 5295 l col0 s +% Polyline +gs clippath +5205 5280 m 5175 5400 l 5145 5280 l 5145 5415 l 5205 5415 l cp +clip +n 5175 5175 m 5175 5400 l gs col0 s gr gr + +% arrowhead +n 5205 5280 m 5175 5400 l 5145 5280 l col0 s +% Polyline +gs clippath +5595 5745 m 5625 5625 l 5655 5745 l 5655 5610 l 5595 5610 l cp +clip +n 5625 5850 m 5625 5625 l gs col0 s gr gr + +% arrowhead +n 5595 5745 m 5625 5625 l 5655 5745 l col0 s +% Polyline +gs clippath +5205 5730 m 5175 5850 l 5145 5730 l 5145 5865 l 5205 5865 l cp +clip +n 5175 5625 m 5175 5850 l gs col0 s gr gr + +% arrowhead +n 5205 5730 m 5175 5850 l 5145 5730 l col0 s +% Polyline +gs clippath +5595 6195 m 5625 6075 l 5655 6195 l 5655 6060 l 5595 6060 l cp +clip +n 5625 6300 m 5625 6075 l gs col0 s gr gr + +% arrowhead +n 5595 6195 m 5625 6075 l 5655 6195 l col0 s +% Polyline +gs clippath +5205 6180 m 5175 6300 l 5145 6180 l 5145 6315 l 5205 6315 l cp +clip +n 5175 6075 m 5175 6300 l gs col0 s gr gr + +% arrowhead +n 5205 6180 m 5175 6300 l 5145 6180 l col0 s +% Polyline +gs clippath +5595 6645 m 5625 6525 l 5655 6645 l 5655 6510 l 5595 6510 l cp +clip +n 5625 6750 m 5625 6525 l gs col0 s gr gr + +% arrowhead +n 5595 6645 m 5625 6525 l 5655 6645 l col0 s +% Polyline +gs clippath +5205 6630 m 5175 6750 l 5145 6630 l 5145 6765 l 5205 6765 l cp +clip +n 5175 6525 m 5175 6750 l gs col0 s gr gr + +% arrowhead +n 5205 6630 m 5175 6750 l 5145 6630 l col0 s +% Polyline +n 4380 7650 m 4275 7650 4275 7770 105 arcto 4 {pop} repeat + 4275 7875 6420 7875 105 arcto 4 {pop} repeat + 6525 7875 6525 7755 105 arcto 4 {pop} repeat + 6525 7650 4380 7650 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4455 7830 m +gs 1 -1 sc (iload) col0 sh gr +% Polyline +n 4380 8100 m 4275 8100 4275 8220 105 arcto 4 {pop} repeat + 4275 8325 6420 8325 105 arcto 4 {pop} repeat + 6525 8325 6525 8205 105 arcto 4 {pop} repeat + 6525 8100 4380 8100 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4455 8280 m +gs 1 -1 sc (ireturn) col0 sh gr +% Polyline +gs clippath +5595 7995 m 5625 7875 l 5655 7995 l 5655 7860 l 5595 7860 l cp +clip +n 5625 8100 m 5625 7875 l gs col0 s gr gr + +% arrowhead +n 5595 7995 m 5625 7875 l 5655 7995 l col0 s +% Polyline +gs clippath +5205 7980 m 5175 8100 l 5145 7980 l 5145 8115 l 5205 8115 l cp +clip +n 5175 7875 m 5175 8100 l gs col0 s gr gr + +% arrowhead +n 5205 7980 m 5175 8100 l 5145 7980 l col0 s +% Polyline +gs clippath +5595 2595 m 5625 2475 l 5655 2595 l 5655 2460 l 5595 2460 l cp +clip +n 5625 2700 m 5625 2475 l gs col0 s gr gr + +% arrowhead +n 5595 2595 m 5625 2475 l 5655 2595 l col0 s +% Polyline +gs clippath +5205 2580 m 5175 2700 l 5145 2580 l 5145 2715 l 5205 2715 l cp +clip +n 5175 2475 m 5175 2700 l gs col0 s gr gr + +% arrowhead +n 5205 2580 m 5175 2700 l 5145 2580 l col0 s +% Polyline +n 4380 3150 m 4275 3150 4275 3270 105 arcto 4 {pop} repeat + 4275 3375 6420 3375 105 arcto 4 {pop} repeat + 6525 3375 6525 3255 105 arcto 4 {pop} repeat + 6525 3150 4380 3150 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 3330 m +gs 1 -1 sc (getstatic) col0 sh gr +% Polyline +n 4380 2700 m 4275 2700 4275 2820 105 arcto 4 {pop} repeat + 4275 2925 6420 2925 105 arcto 4 {pop} repeat + 6525 2925 6525 2805 105 arcto 4 {pop} repeat + 6525 2700 4380 2700 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4455 2880 m +gs 1 -1 sc (istore) col0 sh gr +% Polyline +n 4380 2250 m 4275 2250 4275 2370 105 arcto 4 {pop} repeat + 4275 2475 6420 2475 105 arcto 4 {pop} repeat + 6525 2475 6525 2355 105 arcto 4 {pop} repeat + 6525 2250 4380 2250 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +4500 2430 m +gs 1 -1 sc (sipush) col0 sh gr +% Polyline +gs clippath +5595 3045 m 5625 2925 l 5655 3045 l 5655 2910 l 5595 2910 l cp +clip +n 5625 3150 m 5625 2925 l gs col0 s gr gr + +% arrowhead +n 5595 3045 m 5625 2925 l 5655 3045 l col0 s +% Polyline +gs clippath +5205 3030 m 5175 3150 l 5145 3030 l 5145 3165 l 5205 3165 l cp +clip +n 5175 2925 m 5175 3150 l gs col0 s gr gr + +% arrowhead +n 5205 3030 m 5175 3150 l 5145 3030 l col0 s +% Polyline +n 1350 5175 m 3600 5175 l 3600 5625 l 1350 5625 l cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +1575 5400 m +gs 1 -1 sc (IOException e1) col0 sh gr +% Polyline +n 1575 5175 m 1575 4950 l 3825 4950 l 3825 5400 l 3600 5400 l 3600 5175 l + 1575 5175 l cp gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 1350 3600 m 3600 3600 l 3600 4050 l 1350 4050 l cp gs col0 s gr +/Courier-Bold ff 210.00 scf sf +1575 3825 m +gs 1 -1 sc (int n) col0 sh gr +% Polyline +n 1575 3600 m 1575 3375 l 3825 3375 l 3825 3825 l 3600 3825 l 3600 3600 l + 1575 3600 l cp gs 0.00 setgray ef gr gs col0 s gr +% Polyline +n 7200 4050 m 10350 4050 l 10350 4500 l 7200 4500 l cp gs col0 s gr +% Polyline +n 7425 4050 m 7425 3825 l 10575 3825 l 10575 4275 l 10350 4275 l 10350 4050 l + 8325 4050 l gs 0.00 setgray ef gr gs col0 s gr +/Courier-Bold ff 210.00 scf sf +7425 4275 m +gs 1 -1 sc (Exception handler 1) col0 sh gr +% Polyline +gs clippath +4152 5071 m 4275 5085 l 4160 5131 l 4294 5113 l 4286 5053 l cp +clip +n 3600 5175 m 4275 5085 l gs col0 s gr gr + +% arrowhead +n 4152 5071 m 4275 5085 l 4160 5131 l 4156 5101 l 4152 5071 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +4190 2475 m 4275 2385 l 4243 2504 l 4309 2386 l 4256 2357 l cp +clip +n 3600 3600 m 4275 2385 l gs col0 s gr gr + +% arrowhead +n 4190 2475 m 4275 2385 l 4243 2504 l 4217 2490 l 4190 2475 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +4221 6324 m 4275 6435 l 4175 6362 l 4262 6466 l 4308 6427 l cp +clip +n 3600 5625 m 4275 6435 l gs col0 s gr gr + +% arrowhead +n 4221 6324 m 4275 6435 l 4175 6362 l 4198 6343 l 4221 6324 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6635 5029 m 6525 5085 l 6596 4984 l 6494 5072 l 6533 5117 l cp +clip +n 7200 4500 m 6525 5085 l gs col0 s gr gr + +% arrowhead +n 6635 5029 m 6525 5085 l 6596 4984 l 6616 5006 l 6635 5029 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6645 4215 m 6525 4185 l 6645 4155 l 6510 4155 l 6510 4215 l cp +clip +n 7200 4185 m 6525 4185 l gs col0 s gr gr + +% arrowhead +n 6645 4215 m 6525 4185 l 6645 4155 l 6645 4185 l 6645 4215 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6582 3395 m 6525 3285 l 6627 3355 l 6538 3254 l 6493 3294 l cp +clip +n 7200 4050 m 6525 3285 l gs col0 s gr gr + +% arrowhead +n 6582 3395 m 6525 3285 l 6627 3355 l 6604 3375 l 6582 3395 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +4329 7977 m 4320 8100 l 4269 7987 l 4293 8120 l 4352 8110 l cp +clip +n 3600 4050 m 4320 8100 l gs col0 s gr gr + +% arrowhead +n 4329 7977 m 4320 8100 l 4269 7987 l 4299 7982 l 4329 7977 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6649 7784 m 6525 7785 l 6633 7726 l 6503 7760 l 6518 7818 l cp +clip +n 6525 4635 m 6527 4636 l 6532 4640 l 6542 4646 l 6556 4655 l 6575 4667 l + 6600 4683 l 6628 4702 l 6661 4723 l 6695 4746 l 6731 4771 l + 6768 4796 l 6804 4821 l 6838 4845 l 6871 4869 l 6902 4892 l + 6931 4915 l 6958 4936 l 6983 4957 l 7005 4977 l 7026 4996 l + 7045 5015 l 7063 5034 l 7080 5054 l 7095 5073 l 7110 5093 l + 7124 5113 l 7137 5133 l 7150 5154 l 7162 5176 l 7174 5199 l + 7185 5223 l 7196 5247 l 7207 5273 l 7216 5299 l 7226 5326 l + 7235 5353 l 7243 5381 l 7251 5409 l 7258 5438 l 7265 5467 l + 7271 5496 l 7276 5525 l 7281 5554 l 7286 5582 l 7290 5611 l + 7293 5639 l 7296 5667 l 7299 5694 l 7301 5721 l 7303 5748 l + 7305 5775 l 7306 5802 l 7308 5829 l 7309 5857 l 7310 5885 l + 7310 5914 l 7311 5944 l 7311 5974 l 7311 6004 l 7311 6035 l + 7310 6067 l 7310 6099 l 7309 6131 l 7308 6163 l 7307 6195 l + 7306 6227 l 7305 6258 l 7304 6289 l 7302 6320 l 7301 6350 l + 7299 6379 l 7298 6407 l 7296 6435 l 7295 6462 l 7293 6489 l + 7292 6514 l 7290 6540 l 7288 6567 l 7287 6595 l 7285 6622 l + 7283 6650 l 7281 6677 l 7279 6706 l 7277 6734 l 7275 6762 l + 7273 6791 l 7270 6820 l 7268 6848 l 7265 6877 l 7263 6905 l + 7260 6932 l 7257 6959 l 7255 6986 l 7252 7011 l 7249 7036 l + 7246 7060 l 7243 7084 l 7240 7106 l 7237 7128 l 7233 7149 l + 7230 7170 l 7226 7195 l 7221 7219 l 7216 7243 l 7211 7268 l + 7205 7292 l 7198 7317 l 7191 7342 l 7183 7366 l 7174 7390 l + 7165 7414 l 7155 7436 l 7144 7459 l 7133 7480 l 7121 7500 l + 7108 7519 l 7095 7537 l 7081 7553 l 7066 7569 l 7051 7584 l + 7035 7598 l 7020 7609 l 7003 7621 l 6985 7632 l 6966 7642 l + 6945 7653 l 6921 7663 l 6895 7674 l 6867 7684 l 6836 7695 l + 6803 7706 l 6767 7717 l 6730 7728 l 6693 7739 l 6656 7750 l + 6622 7759 l 6592 7767 l 6567 7774 l 6525 7785 l gs col0 s gr gr + +% arrowhead +n 6649 7784 m 6525 7785 l 6633 7726 l 6641 7755 l 6649 7784 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6619 7615 m 6525 7695 l 6570 7580 l 6492 7690 l 6541 7725 l cp +clip +n 6525 6840 m 6526 6843 l 6529 6850 l 6533 6863 l 6540 6882 l 6549 6908 l + 6560 6938 l 6572 6973 l 6585 7010 l 6598 7048 l 6610 7086 l + 6622 7122 l 6632 7157 l 6642 7189 l 6650 7219 l 6657 7246 l + 6663 7271 l 6667 7294 l 6671 7315 l 6673 7335 l 6675 7354 l + 6675 7373 l 6674 7394 l 6672 7415 l 6669 7435 l 6663 7455 l + 6656 7476 l 6648 7498 l 6637 7520 l 6624 7544 l 6610 7568 l + 6595 7593 l 6579 7617 l 6564 7640 l 6550 7660 l 6525 7695 l gs col0 s gr gr + +% arrowhead +n 6619 7615 m 6525 7695 l 6570 7580 l 6595 7597 l 6619 7615 l cp gs 0.00 setgray ef gr col0 s +$F2psEnd +rs + +%%EndDocument + @endspecial 844 4373 a Fq(Figur)n(e)k(5:)31 b(Instr)o(uction)26 +b(list)g(for)g Fh(readInt\(\))d Fq(method)0 4834 y Fg(3.3.6)99 +b(Instruction)25 b(factories)0 5011 y Ft(T)-8 b(o)16 +b(simplify)i(the)f(cr)n(eation)g(of)g(certain)h(instr)o(uctions)e(the)h +(user)f(can)i(use)e(the)g(supplied)g Ff(InstructionFact)o(or)o(y)0 +5124 y Ft(class)28 b(which)f(of)n(fers)g(a)h(lot)f(of)g(useful)g +(methods)e(to)i(cr)n(eate)g(instr)o(uctions)f(fr)n(om)i(scratch.)42 +b(Alternatively)-10 b(,)28 b(he)0 5237 y(can)j(also)g(use)e +Fs(compound)i(instructions)p Ft(:)45 b(When)29 b(pr)n(oducing)h(byte)f +(code,)j(some)d(patterns)g(typically)i(occur)0 5350 y(very)25 +b(fr)n(equently)-10 b(,)24 b(for)h(instance)g(the)g(compilation)h(of)f +(arithmetic)h(or)f(comparison)g(expr)n(essions.)34 b(Y)-8 +b(ou)24 b(cer)n(-)0 5463 y(tainly)k(do)f(not)g(want)h(to)f(r)n(ewrite)g +(the)g(code)g(that)g(translates)g(such)g(expr)n(essions)f(into)h(byte)g +(code)g(in)h(every)1863 5712 y Fq(17)p eop +%%Page: 18 18 +18 17 bop 0 407 a Ft(place)26 b(they)f(may)h(appear)-7 +b(.)36 b(In)26 b(or)n(der)e(to)h(support)f(this,)i(the)e +Fe(BCEL)j Ft(API)e(includes)h(a)g Fs(compound)g(instruction)0 +520 y Ft(\(an)k(interface)f(with)f(a)i(single)e Ff(getInstructionL)o +(is)o(t\()o(\))23 b Ft(method\).)45 b(Instances)27 b(of)i(this)g(class) +g(may)g(be)0 633 y(used)21 b(in)i(any)g(place)g(wher)n(e)f(normal)h +(instr)o(uctions)f(would)g(occur)-7 b(,)23 b(particularly)h(in)f +(append)e(operations.)0 898 y Fg(Example:)43 b(Pushing)32 +b(constants.)92 b Ft(Pushing)28 b(constants)g(onto)f(the)h(operand)g +(stack)g(may)h(be)g(coded)f(in)0 1011 y(dif)n(fer)n(ent)g(ways.)44 +b(As)27 b(explained)h(in)g(section)g(2.2)h(ther)n(e)e(ar)n(e)h(some)f +(\223short-cut\224)h(instr)o(uctions)f(that)h(can)h(be)0 +1124 y(used)20 b(to)h(make)g(the)f(pr)n(oduced)g(byte)g(code)h(mor)n(e) +g(compact.)28 b(The)20 b(smallest)i(instr)o(uction)f(to)f(push)h(a)h +(single)e Ff(1)0 1237 y Ft(onto)h(the)h(stack)g(is)g +Ff(iconst)p 1002 1237 28 4 v 30 w(1)p Ft(,)g(other)f(possibilities)i +(ar)n(e)f Ff(bipush)e Ft(\(can)k(be)e(used)f(to)h(push)f(values)i +(between)0 1350 y(-128)h(and)f(127\),)h Ff(sipush)c Ft(\(between)h +(-32768)26 b(and)c(32767\),)j(or)e Ff(ldc)e Ft(\(load)i(constant)f(fr)n +(om)h(constant)f(pool\).)146 1465 y(Instead)28 b(of)i(r)n(epeatedly)d +(selecting)i(the)g(most)f(compact)i(instr)o(uction)f(in,)j(say)-10 +b(,)30 b(a)g(switch,)h(one)e(can)h(use)0 1578 y(the)20 +b(compound)g Ff(PUSH)g Ft(instr)o(uction)h(whenever)f(pushing)g(a)h +(constant)g(number)g(or)g(string.)26 b(It)21 b(will)h(pr)n(oduce)0 +1691 y(the)g(appr)n(opriate)g(byte)g(code)f(instr)o(uction)i(and)f +(insert)g(entries)f(into)i(to)f(constant)f(pool)h(if)i(necessary)-10 +b(.)109 1929 y Ff(il.append\(new)49 b(PUSH\(cp,)i("Hello,)g +(world"\)\);)109 2042 y(il.append\(new)e(PUSH\(cp,)i(4711\)\);)0 +2315 y Fg(3.3.7)99 b(Code)25 b(patterns)f(using)i(regular)e +(expressions)0 2496 y Ft(When)j(transforming)g(code,)g(for)g(instance)g +(during)g(optimization)h(or)f(when)f(inserting)h(analysis)g(method)0 +2609 y(calls,)35 b(one)c(typically)h(sear)n(ches)f(for)g(certain)h +(patterns)e(of)i(code)e(to)h(perform)g(the)g(transformation)g(at.)55 +b(T)-8 b(o)0 2722 y(simplify)27 b(handling)g(such)f(situations)g +Fe(BCEL)i Ft(intr)n(oduces)e(a)h(special)g(featur)n(e:)35 +b(One)27 b(can)g(sear)n(ch)g(for)f(given)0 2835 y(code)17 +b(patterns)e(within)j(an)g(instr)o(uction)f(list)h(using)e +Fs(r)n(egular)k(expr)n(essions)p Ft(.)30 b(In)17 b(such)g(expr)n +(essions,)f(instr)o(uctions)0 2948 y(ar)n(e)26 b(r)n(epr)n(esented)e +(by)i(symbolic)g(names,)h(e.g.)37 b(\224)p Ff(`IfInstruction')p +Ft(\224.)32 b(Meta)26 b(characters)g(like)g Ff(+)p Ft(,)h +Ff(*)p Ft(,)f(and)0 3061 y Ff(\(..|..\))20 b Ft(have)j(their)f(usual)h +(meanings.)k(Thus,)22 b(the)f(expr)n(ession)109 3300 +y Ff("`NOP'+\(`ILOAD_)o(_')o(|`)o(ALO)o(AD)o(__)o('\))o(*")146 +3536 y Ft(r)n(epr)n(esents)28 b(a)i(piece)f(of)h(code)f(consisting)g +(of)h(at)g(least)f(one)g Ff(NOP)g Ft(followed)g(by)h(a)g(possibly)f +(empty)g(se-)0 3649 y(quence)22 b(of)g Ff(ILOAD)f Ft(and)i +Ff(ALOAD)d Ft(instr)o(uctions.)146 3764 y(The)j Ff(search\(\))d +Ft(method)j(of)g(class)i Ff(FindPattern)18 b Ft(gets)k(an)i(instr)o +(uction)g(list)g(and)f(a)i(r)n(egular)e(expr)n(es-)0 +3877 y(sion)g(as)g(ar)n(guments)f(and)h(r)n(eturns)f(an)i(array)f +(describing)g(the)g(ar)n(ea)h(of)f(matched)g(instr)o(uctions.)28 +b(Additional)0 3990 y(constraints)d(to)h(the)f(matching)i(ar)n(ea)g(of) +g(instr)o(uctions,)f(which)g(can)h(not)f(be)g(implemented)f(via)j(r)n +(egular)e(ex-)0 4103 y(pr)n(essions,)21 b(may)i(be)f(expr)n(essed)e +(via)k Fs(code)g(constraints)p Ft(.)0 4376 y Fg(3.3.8)99 +b(Example:)30 b(Optimizing)25 b(boolean)g(expressions.)0 +4557 y Ft(In)17 b(Java,)j(boolean)d(values)h(ar)n(e)f(mapped)g(to)g(1)h +(and)f(to)g(0,)h(r)n(espectively)-10 b(.)25 b(Thus,)18 +b(the)e(simplest)h(way)g(to)g(evaluate)0 4670 y(boolean)k(expr)n +(essions)e(is)j(to)f(push)f(a)i(1)g(or)f(a)h(0)g(onto)f(the)f(operand)g +(stack)h(depending)f(on)h(the)f(tr)o(uth)h(value)h(of)0 +4783 y(the)i(expr)n(ession.)31 b(But)23 b(this)h(way)-10 +b(,)25 b(the)e(subsequent)f(combination)k(of)e(boolean)h(expr)n +(essions)d(\(with)i Ff(&&)p Ft(,)g(e.g\))0 4896 y(yields)e(long)g +(chunks)g(of)h(code)e(that)i(push)e(lots)h(of)h(1s)g(and)f(0s)h(onto)f +(the)f(stack.)146 5011 y(When)i(the)f(code)g(has)h(been)f(\002nalized)i +(these)d(chunks)h(can)h(be)g(optimized)g(with)g(a)g Fs(peep)i(hole)f +Ft(algorithm:)0 5124 y(An)i Ff(IfInstruction)20 b Ft(\(e.g.)38 +b(the)26 b(comparison)g(of)g(two)g(integers:)33 b Ff(if)p +2529 5124 V 32 w(icmpeq)p Ft(\))24 b(that)h(either)h(pr)n(oduces)f(a)0 +5237 y(1)32 b(or)f(a)g(0)h(on)f(the)f(stack)h(and)g(is)h(followed)e(by) +h(an)h Ff(ifne)e Ft(instr)o(uction)g(\(branch)j(if)f(stack)f(value)h +Fd(6)p Fc(=)f Ft(0\))h(may)0 5350 y(be)d(r)n(eplaced)f(by)h(the)f +Ff(IfInstruction)23 b Ft(with)29 b(its)f(branch)i(tar)n(get)e(r)n +(eplaced)g(by)h(the)f(tar)n(get)g(of)h(the)f Ff(ifne)0 +5463 y Ft(instr)o(uction:)1863 5712 y Fq(18)p eop +%%Page: 19 19 +19 18 bop 109 407 a Ff(InstructionList)48 b(il)53 b(=)i(new)e +(InstructionLis)o(t\()o(\);)109 520 y(...)109 633 y(CodeConstraint)48 +b(constraint)i(=)k(new)g(CodeConstraint)o(\(\))48 b({)218 +746 y(public)k(boolean)f(checkCode\(Instru)o(ct)o(io)o(nH)o(an)o(dle)o +([])d(match\))k({)327 858 y(IfInstruction)d(if1)k(=)h +(\(IfInstruction\))o(ma)o(tch)o([0)o(].)o(ge)o(tI)o(nst)o(ru)o(ct)o(io) +o(n\()o(\);)327 971 y(GOTO)544 b(g)163 b(=)54 b(\(GOTO\)match[2].)o(ge) +o(tIn)o(st)o(ru)o(ct)o(io)o(n\(\))o(;)327 1084 y(return)e +(\(if1.getTarget\()o(\))c(==)54 b(match[3]\))c(&&)709 +1197 y(\(g.getTarget\(\))e(==)54 b(match[4]\);)218 1310 +y(})109 1423 y(};)109 1536 y(FindPattern)c(f)163 b(=)54 +b(new)f(FindPattern\(il\))o(;)109 1649 y(String)325 b(pat)53 +b(=)h("`IfInstruction)o('`)o(IC)o(ON)o(ST)o(_0')o(`G)o(OT)o(O')o(`I)o +(CON)o(ST)o(_1)o('")48 b(+)1091 1762 y("`NOP'\(`IFEQ'|`)o(IF)o(NE)o +('\))o(";)109 1875 y(InstructionHand)o(le)o([])g(match;)109 +1988 y(for\(Instruction)o(Ha)o(nd)o(le)g(ih)54 b(=)g(f.search\(pat,)48 +b(constraint\);)327 2100 y(ih)54 b(!=)g(null;)e(ih)h(=)i +(f.search\(pat,)48 b(match[0],)j(constraint\)\))e({)218 +2213 y(match)j(=)j(f.getMatch\(\);)48 b(//)54 b(Constraint)c(already)h +(checked)218 2326 y(...)218 2439 y(match[0].setTar)o(ge)o(t\(m)o(at)o +(ch)o([5)o(].)o(get)o(Ta)o(rg)o(et)o(\(\))o(\);)d(//)54 +b(Update)e(target)218 2552 y(...)218 2665 y(try)h({)327 +2778 y(il.delete\(match)o([1])o(,)48 b(match[5]\);)218 +2891 y(})54 b(catch\(TargetLos)o(tEx)o(ce)o(pt)o(io)o(n)48 +b(e\))54 b({)g(...)f(})109 3004 y(})146 3325 y Ft(The)26 +b(applied)g(code)f(constraint)h(object)g(ensur)n(es)f(that)h(the)f +(matched)h(code)f(r)n(eally)i(corr)n(esponds)d(to)i(the)0 +3437 y(tar)n(geted)e(expr)n(ession)g(pattern.)35 b(Subsequent)24 +b(application)j(of)e(this)h(algorithm)g(r)n(emoves)f(all)i(unnecessary) +0 3550 y(stack)g(operations)e(and)i(branch)h(instr)o(uctions)e(fr)n(om) +h(the)f(byte)g(code.)40 b(If)27 b(any)g(of)g(the)f(deleted)f(instr)o +(uctions)0 3663 y(is)g(still)h(r)n(efer)n(enced)d(by)i(an)h +Ff(InstructionTar)o(ge)o(te)o(r)19 b Ft(object,)25 b(the)f(r)n(efer)n +(ence)g(has)h(to)g(be)f(updated)g(in)h(the)0 3776 y Ff(catch)p +Ft(-clause.)146 3903 y(Code)g(example)h(A.1)g(gives)f(a)h(verbose)f +(example)h(of)f(how)h(to)f(cr)n(eate)h(a)g(class)g(\002le,)g(while)g +(example)g(A.3)0 4016 y(shows)e(how)i(to)f(implement)h(a)g(simple)g +(peephole)e(optimizer)i(and)g(how)g(to)f(deal)h(with)g +Ff(TargetLost)21 b Ft(ex-)0 4129 y(ceptions.)0 4468 y +Fg(Example)j(application:)91 b Ft(The)22 b(expr)n(ession)109 +4803 y Ff(if\(\(a)52 b(==)i(null\))e(||)i(\(i)g(<)g(2\)\))218 +4916 y(System.out.prin)o(tl)o(n\(")o(Oo)o(op)o(s")o(\);)146 +5237 y Ft(can)31 b(be)f(mapped)f(to)h(both)f(of)h(the)g(chunks)f(of)h +(byte)f(code)g(shown)g(in)i(\002gur)n(e)e(3.3.8.)51 b(The)29 +b(left)i(column)0 5350 y(r)n(epr)n(esents)18 b(the)i(unoptimized)g +(code)g(while)h(the)f(right)g(column)h(displays)f(the)g(same)g(code)g +(after)h(an)g(aggr)n(es-)0 5463 y(sively)i(optimizing)g(peep)e(hole)h +(algorithm)h(has)g(been)f(applied:)1863 5712 y Fq(19)p +eop +%%Page: 20 20 +20 19 bop 0 1311 a Ff(5:)108 b(aload_0)0 1424 y(6:)g(ifnull)434 +b(#13)0 1537 y(9:)108 b(iconst_0)0 1649 y(10:)53 b(goto)544 +b(#14)0 1762 y(13:)53 b(iconst_1)0 1875 y(14:)g(nop)0 +1988 y(15:)g(ifne)544 b(#36)0 2101 y(18:)53 b(iload_1)0 +2214 y(19:)g(iconst_2)0 2327 y(20:)g(if_icmplt)269 b(#27)0 +2440 y(23:)53 b(iconst_0)0 2553 y(24:)g(goto)544 b(#28)0 +2666 y(27:)53 b(iconst_1)0 2779 y(28:)g(nop)0 2891 y(29:)g(ifne)544 +b(#36)0 3004 y(32:)53 b(iconst_0)0 3117 y(33:)g(goto)544 +b(#37)0 3230 y(36:)53 b(iconst_1)0 3343 y(37:)g(nop)0 +3456 y(38:)g(ifeq)544 b(#52)0 3569 y(41:)53 b(getstatic)269 +b(System.out)0 3682 y(44:)53 b(ldc)599 b("Ooops")0 3795 +y(46:)53 b(invokevirtual)c(println)0 3908 y(52:)k(return)1899 +1311 y(10:)g(aload_0)1899 1424 y(11:)g(ifnull)434 b(#19)1899 +1537 y(14:)53 b(iload_1)1899 1650 y(15:)g(iconst_2)1899 +1763 y(16:)g(if_icmpge)269 b(#27)1899 1876 y(19:)53 b(getstatic)269 +b(System.out)1899 1989 y(22:)53 b(ldc)599 b("Ooops")1899 +2102 y(24:)53 b(invokevirtual)c(println)1899 2215 y(27:)k(return)995 +4181 y Fq(Figur)n(e)26 b(6:)31 b(Optimizing)25 b(boolean)h(expr)n +(essions)1863 5712 y(20)p eop +%%Page: 21 21 +21 20 bop 0 410 a Fr(4)143 b(Application)33 b(areas)0 +662 y Ft(Ther)n(e)20 b(ar)n(e)i(many)f(possible)g(application)h(ar)n +(eas)f(for)g Fe(BCEL)i Ft(ranging)e(fr)n(om)g(class)h(br)n(owsers,)e +(pr)n(o\002lers,)g(byte)0 774 y(code)30 b(optimizers,)i(and)e +(compilers)g(to)g(sophisticated)f(r)o(un-time)i(analysis)g(tools)e(and) +i(extensions)d(to)i(the)0 887 y(Java)24 b(language)f([AFM97,)g(MBL97].) +146 1020 y(Compilers)33 b(like)g(the)f(Barat)h(compiler)g([BS98])g(use) +f Fe(BCEL)j Ft(to)d(implement)h(a)g(byte)f(code)g(generating)0 +1133 y(back)22 b(end.)27 b(Other)21 b(possible)g(application)i(ar)n +(eas)f(ar)n(e)f(the)g(static)h(analysis)g(of)g(byte)e(code)h([TK98)q(]) +h(or)f(examin-)0 1246 y(ing)e(the)f(r)o(un-time)i(behavior)f(of)g +(classes)g(by)g(inserting)f(calls)i(to)f(pr)n(o\002ling)g(methods)e +(into)i(the)f(code.)26 b(Further)0 1359 y(examples)h(ar)n(e)h +(extending)e(Java)k(with)e(Eif)n(fel-like)h(assertions)d([FM98],)k +(automated)d(delegation)f([Cos98)q(],)0 1472 y(or)c(with)h(the)f +(concepts)f(of)i(\223Aspect-Oriented)e(Pr)n(ogramming\224)i([KLM)2542 +1439 y Fb(+)2601 1472 y Ft(97)q(].)0 1882 y Fm(4.1)119 +b(Class)30 b(loaders)0 2099 y Ft(Class)d(loaders)f(ar)n(e)h(r)n +(esponsible)f(for)h(loading)g(class)g(\002les)f(fr)n(om)i(the)e(\002le) +h(system)e(or)h(other)g(r)n(esour)n(ces)f(and)0 2212 +y(passing)k(the)g(byte)h(code)f(to)g(the)g(V)-5 b(irtual)31 +b(Machine)g([LB98].)50 b(A)30 b(custom)g Ff(ClassLoader)25 +b Ft(object)30 b(may)g(be)0 2325 y(used)h(to)h(inter)n(cept)g(the)g +(standar)n(d)g(pr)n(ocedur)n(e)f(of)i(loading)f(a)i(class,)h(i.e.)58 +b(the)31 b(system)g(class)i(loader)-7 b(,)35 b(and)0 +2438 y(perform)22 b(some)g(transformations)g(befor)n(e)g(actually)i +(passing)e(the)f(byte)h(code)g(to)g(the)g(JVM.)146 2571 +y(A)28 b(possible)f(scenario)h(is)g(described)f(in)h(\002gur)n(e)g(7:) +39 b(During)28 b(r)o(un-time)g(the)f(V)-5 b(irtual)28 +b(Machine)h(r)n(equests)0 2683 y(a)d(custom)g(class)g(loader)g(to)f +(load)h(a)g(given)g(class.)38 b(But)25 b(befor)n(e)h(the)f(JVM)h +(actually)h(sees)d(the)h(byte)g(code,)h(the)0 2796 y(class)h(loader)f +(makes)f(a)i(\223side-step\224)e(and)h(performs)f(some)g +(transformation)h(to)g(the)f(class.)39 b(T)-8 b(o)26 +b(make)g(sur)n(e)0 2909 y(that)21 b(the)f(modi\002ed)g(byte)g(code)g +(is)i(still)f(valid)i(and)e(does)e(not)h(violate)i(any)f(of)g(the)f +(JVM's)h(r)o(ules)g(it)g(is)g(checked)0 3022 y(by)i(the)e(veri\002er)i +(befor)n(e)f(the)g(JVM)h(\002nally)g(executes)e(it.)0 +4050 y @beginspecial 0 @llx 0 @lly 683 @urx 144 @ury +4590 @rwi @setspecial +%%BeginDocument: eps/classloader.eps +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: classloader.eps +%%Creator: fig2dev Version 3.2 Patchlevel 0-beta3 +%%CreationDate: Thu Mar 18 16:45:56 1999 +%%For: dahm@gromit (Markus Dahm) +%%Orientation: Portrait +%%BoundingBox: 0 0 683 144 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +-55.0 171.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n -1000 3712 m -1000 -1000 l 12712 -1000 l 12712 3712 l cp clip + 0.06299 0.06299 sc +% Polyline +7.500 slw +n 1005 450 m 900 450 900 1020 105 arcto 4 {pop} repeat + 900 1125 3045 1125 105 arcto 4 {pop} repeat + 3150 1125 3150 555 105 arcto 4 {pop} repeat + 3150 450 1005 450 105 arcto 4 {pop} repeat + cp gs col0 s gr +/Helvetica ff 210.00 scf sf +1350 900 m +gs 1 -1 sc (Java class file) col0 sh gr +% Polyline +n 3600 450 m 5850 450 l 5850 1125 l 3600 1125 l cp gs col0 s gr +/Helvetica ff 210.00 scf sf +4140 855 m +gs 1 -1 sc (Class loader) col0 sh gr +% Polyline +n 6750 450 m 9000 450 l 9000 1125 l 6750 1125 l cp gs col0 s gr +/Helvetica ff 210.00 scf sf +7020 855 m +gs 1 -1 sc (Byte code verifier) col0 sh gr +% Polyline +n 9450 450 m 11700 450 l 11700 1125 l 9450 1125 l cp gs col0 s gr +/Helvetica ff 210.00 scf sf +9900 900 m +gs 1 -1 sc (Interpreter/JIT) col0 sh gr +% Polyline +n 4950 1575 m 7875 1575 l 7875 2700 l 4950 2700 l cp gs col0 s gr +/Helvetica ff 210.00 scf sf +5175 2475 m +gs 1 -1 sc (Byte code transformations) col0 sh gr +/Courier-Bold ff 210.00 scf sf +5850 2025 m +gs 1 -1 sc (JavaClass) col0 sh gr +% Polyline +gs clippath +3453 735 m 3573 765 l 3453 795 l 3615 795 l 3615 735 l cp +clip +n 3150 765 m 3600 765 l gs col0 s gr gr + +% arrowhead +n 3453 735 m 3573 765 l 3453 795 l 3453 765 l 3453 735 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +9303 735 m 9423 765 l 9303 795 l 9465 795 l 9465 735 l cp +clip +n 9000 765 m 9450 765 l gs col0 s gr gr + +% arrowhead +n 9303 735 m 9423 765 l 9303 795 l 9303 765 l 9303 735 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6105 1428 m 6075 1548 l 6045 1428 l 6045 1590 l 6105 1590 l cp +clip +n 5850 765 m 6075 765 l 6075 1575 l gs col0 s gr gr + +% arrowhead +n 6105 1428 m 6075 1548 l 6045 1428 l 6075 1428 l 6105 1428 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6603 735 m 6723 765 l 6603 795 l 6765 795 l 6765 735 l cp +clip +n 6525 1575 m 6525 765 l 6750 765 l gs col0 s gr gr + +% arrowhead +n 6603 735 m 6723 765 l 6603 795 l 6603 765 l 6603 735 l cp gs 0.00 setgray ef gr col0 s +$F2psEnd +rs + +%%EndDocument + @endspecial 1414 4253 a Fq(Figur)n(e)26 b(7:)k(Class)25 +b(loaders)146 4672 y Ft(Using)i(class)h(loaders)f(is)g(an)h(elegant)f +(way)g(of)h(extending)d(the)i(Java)i(V)-5 b(irtual)28 +b(Machine)g(with)g(new)e(fea-)0 4785 y(tur)n(es)20 b(without)g +(actually)i(modifying)f(it.)27 b(This)21 b(concept)f(enables)h +(developers)e(to)h(use)g Fs(load-time)j(r)n(e\003ection)g +Ft(to)0 4898 y(implement)28 b(their)f(ideas)h(as)g(opposed)d(to)j(the)f +(static)h(r)n(e\003ection)g(supported)d(by)j(the)f(Java)j(Re\003ection) +d(API)0 5011 y([Jav98)r(].)45 b(Load-time)28 b(transformations)g +(supply)f(the)g(user)g(with)h(a)h(new)f(level)h(of)f(abstraction.)45 +b(He)27 b(is)i(not)0 5124 y(strictly)24 b(tied)f(to)h(the)f(static)h +(constraints)f(of)h(the)g(original)h(authors)e(of)h(the)f(classes)h +(but)g(may)g(customize)g(the)0 5237 y(applications)i(with)f(thir)n +(d-party)g(code)g(in)g(or)n(der)g(to)f(bene\002t)h(fr)n(om)h(new)e +(featur)n(es.)36 b(Such)25 b(transformations)0 5350 y(may)j(be)g +(executed)d(on)j(demand)f(and)h(neither)e(interfer)n(e)h(with)h(other)e +(users,)h(nor)h(alter)f(the)g(original)i(byte)0 5463 +y(code.)e(In)22 b(fact,)h(class)h(loaders)d(may)i(even)f(cr)n(eate)h +(classes)f Fs(ad)i(hoc)f Ft(without)f(loading)h(a)g(\002le)g(at)f(all.) +1863 5712 y Fq(21)p eop +%%Page: 22 22 +22 21 bop 0 407 a Fg(4.1.1)99 b(Example:)30 b(Poor)25 +b(Man')-5 b(s)24 b(Genericity)0 587 y Ft(The)17 b(\223Poor)g(Man's)h +(Genericity\224)g(pr)n(oject)f([BD98)r(])h(that)f(extends)f(Java)j +(with)f(parameterized)f(classes,)h(for)f(ex-)0 700 y(ample,)j(uses)e +Fe(BCEL)i Ft(in)f(two)g(places)g(to)g(generate)e(instances)i(of)g +(parameterized)f(classes:)26 b(During)19 b(compile-)0 +813 y(time)36 b(\(the)f(standar)n(d)g Ff(javac)f Ft(with)i(some)f +(slightly)g(changed)g(classes\))h(and)g(at)g(r)o(un-time)f(using)h(a)g +(cus-)0 926 y(tom)28 b(class)g(loader)-7 b(.)43 b(The)28 +b(compiler)g(puts)f(some)g(additional)h(type)e(information)j(into)f +(class)g(\002les)g(which)g(is)0 1039 y(evaluated)e(at)h(load-time)f(by) +g(the)g(class)h(loader)-7 b(.)38 b(The)26 b(class)h(loader)e(performs)h +(some)f(transformations)g(on)0 1152 y(the)i(loaded)g(class)i(and)e +(passes)g(them)g(to)g(the)g(VM.)h(The)f(following)h(algorithm)g +(illustrates)g(how)f(the)g(load)0 1264 y(method)21 b(of)i(the)f(class)h +(loader)f(ful\002lls)i(the)e(r)n(equest)f(for)h(a)h(parameterized)f +(class,)h(e.g.)k Ff(Stack)127 1487 y Ft(1.)49 +b(Sear)n(ch)19 b(for)g(class)g Ff(Stack)p Ft(,)f(load)h(it,)g(and)g +(check)g(for)g(a)g(certain)g(class)h(attribute)e(containing)h +(additional)244 1600 y(type)i(information.)28 b(I.e.)f(the)22 +b(attribute)g(de\002nes)f(the)h(\223r)n(eal\224)i(name)f(of)g(the)e +(class,)i(i.e.)28 b Ff(Stack)p Ft(.)127 1794 y(2.)49 +b(Replace)28 b(all)h(occurr)n(ences)e(and)h(r)n(efer)n(ences)f(to)g +(the)g(formal)i(type)d Ff(A)i Ft(with)g(r)n(efer)n(ences)f(to)g(the)g +(actual)244 1907 y(type)21 b Ff(String)p Ft(.)k(For)d(example)g(the)g +(method)353 2168 y Ff(void)53 b(push\(A)f(obj\))g({)i(...)g(})244 +2429 y Ft(becomes)353 2690 y Ff(void)f(push\(String)c(obj\))k({)h(...)f +(})127 2952 y Ft(3.)c(Return)21 b(the)h(r)n(esulting)g(class)h(to)f +(the)g(V)-5 b(irtual)23 b(Machine.)0 3293 y Fr(References)0 +3508 y Ft([AFM97])109 b(O.)29 b(Agesen,)f(S.)h(N.)f(Fr)n(eund,)h(and)g +(J.)h(C.)f(Mitchell.)54 b(Adding)27 b(T)-8 b(ype)28 b(Parameterization) +i(to)e(the)467 3621 y(Java)c(Language.)31 b(In)23 b Fs(Pr)n(oceedings)i +(OOPSLA)-5 b('97)p Ft(,)21 b(Atlanta,)i(GA,)f(1997.)0 +3815 y([AP98])191 b(D.)24 b(Antonioli)f(and)h(M.)g(Pilz.)37 +b(Statistische)23 b(Analyse)g(von)h(Java-Class\002les.)38 +b(In)23 b(Clemens)h(Cap,)467 3928 y(editor)-7 b(,)21 +b Fs(Pr)n(oceedings)k(JIT'98)p Ft(.)f(Springer)-7 b(,)22 +b(1998.)0 4122 y([BD98])191 b(B.)21 b(Bokowski)f(and)i(M.)f(Dahm.)32 +b(Poor)21 b(Man's)h(Genericity)g(for)f(Java.)33 b(In)21 +b(Clemens)h(Cap,)g(editor)-7 b(,)467 4235 y Fs(Pr)n(oceedings)25 +b(JIT'98)p Ft(.)f(Springer)-7 b(,)21 b(1998.)0 4429 y([BS98])213 +b(B.)28 b(Bokowski)f(and)i(A.)f(Spiegel.)51 b(Barat)29 +b(\226)h(A)e(Fr)n(ont-End)f(for)i(Java.)54 b(T)-8 b(echnical)30 +b(r)n(eport,)f(Fr)n(eie)467 4542 y(Universit)8 b(\250)-38 +b(at)22 b(Berlin,)g(1998.)0 4736 y([CCK98])123 b(Geof)n(f)24 +b(Cohen,)f(Jef)n(f)h(Chase,)g(and)f(David)i(Kaminsky)-10 +b(.)35 b(Automatic)24 b(Pr)n(ogram)f(T)-8 b(ransformation)467 +4849 y(with)22 b(JOIE.)33 b(In)22 b Fs(Pr)n(oceedings)j(USENIX)c +(Annual)h(T)-10 b(echnical)23 b(Symposium)p Ft(,)g(1998.)0 +5043 y([CCZ97])128 b(Suzanne)34 b(Collin,)39 b(Dominique)d(Colnet,)h +(and)e(Olivier)h(Zendra.)70 b(T)-8 b(ype)33 b(Infer)n(ence)h(for)h +(Late)467 5156 y(Binding.)22 b(The)g(SmallEif)n(fel)j(Compiler.)32 +b(In)23 b Fs(Pr)n(oceedings)i(JMLC'97)p Ft(,)e(1997.)0 +5350 y([Cos98])164 b(Pascal)42 b(Costanza.)90 b Fs(The)41 +b(ClassFilters)i(package)p Ft(.)91 b(Universit)8 b(\250)-38 +b(at)41 b(Bonn,)i Ff(http://www.cs.)467 5463 y(uni-)t(bonn.de/\230co)o +(st)o(an)o(za)o(/Cl)o(as)o(sF)o(il)o(te)o(rs/)o Ft(,)17 +b(1998.)1863 5712 y Fq(22)p eop +%%Page: 23 23 +23 22 bop 0 407 a Ft([FM98])180 b(C.)29 b(Fischer)f(and)g(D.)h +(Meemken.)50 b(JaW)-8 b(a:)41 b(Java)30 b(with)f(Assertions.)49 +b(In)28 b(Clemens)h(Cap,)h(editor)-7 b(,)467 520 y Fs(Pr)n(oceedings)25 +b(JIT'98)p Ft(.)f(Springer)-7 b(,)21 b(1998.)0 707 y([GHJV95])76 +b(E.)17 b(Gamma,)k(R.)d(Helm,)h(R.)f(Johnson,)g(and)g(J.)g(Vlissides.)k +Fs(Design)d(Patterns:)27 b(Elements)19 b(of)g(Reusable)467 +820 y(Object-Oriented)25 b(Softwar)n(e)p Ft(.)34 b(Addison-W)-8 +b(esley)e(,)19 b(1995.)0 1008 y([GJS96])170 b(J.)32 b(Gosling,)j(B.)d +(Joy)-10 b(,)34 b(and)f(G.)f(Steele.)63 b Fs(The)33 b(Java)h(Language)f +(Speci\002cation)p Ft(.)66 b(Addison-W)-8 b(esley)e(,)467 +1121 y(1996.)0 1308 y([Jav98])191 b(JavaSoft.)71 b Fs(Re\003ection)35 +b(API)p Ft(.)70 b Ff(http://java.sun)o(.c)o(om)o(/pr)o(od)o(uc)o(ts)o +(/j)o(dk/)o(1.)o(1/)o(do)o(cs)o(/)467 1421 y(guide/reflecti)o(on/)o +Ft(,)17 b(1998.)0 1609 y([KH98])175 b(Ralph)33 b(Keller)f(and)h(Urs)f +(H)10 b(\250)-40 b(olzle.)65 b(Binary)32 b(Component)g(Adaptation.)63 +b(In)33 b(Eric)g(Jul,)i(editor)-7 b(,)467 1722 y Fs(Pr)n(oceedings)25 +b(ECOOP'98)p Ft(.)d(Springer)-7 b(,)21 b(1998.)0 1910 +y([KLM)238 1877 y Fb(+)297 1910 y Ft(97])50 b(Gr)n(egor)27 +b(Kiczales,)i(John)e(Lamping,)h(Anurag)f(Mendhekar)-7 +b(,)27 b(Chris)h(Maeda,)g(Cristina)g(Lopes,)467 2022 +y(Jean-Mar)n(c)f(Loingtier)-7 b(,)26 b(and)g(John)g(Irwin.)43 +b(Aspect-Oriented)24 b(Pr)n(ogramming.)43 b(T)-8 b(echnical)27 +b(r)n(e-)467 2135 y(port,)21 b(Xer)n(ox)h(Palo)h(Alto)f(Resear)n(ch)g +(Center)-7 b(,)22 b(1997.)0 2323 y([LB98])205 b(Sheng)23 +b(Lian)i(and)g(Gilad)h(Bracha.)39 b(Dynamic)26 b(Class)g(Loading)d(in)i +(the)f(Java)j(V)-5 b(irtual)25 b(Machine.)467 2436 y(In)d +Fs(Pr)n(oceedings)j(OOPSLA)-5 b('98)p Ft(,)22 b(1998.)0 +2623 y([L)-8 b(Y97])208 b(T)-5 b(im)35 b(Lindholm)f(and)g(Frank)g(Y)-8 +b(ellin.)69 b Fs(The)35 b(Java)h(V)-7 b(irtual)35 b(Machine)g +(Speci\002cation)p Ft(.)71 b(Addison-)467 2736 y(W)-8 +b(esley)e(,)20 b(1997.)0 2924 y([LZ98])200 b(Han)25 b(Bok)f(Lee)f(and)i +(Benjamin)h(G.)f(Zorn.)38 b(BIT)-5 b(:)24 b(A)h(T)-8 +b(ool)24 b(for)h(Instr)o(umenting)e(Java)j(Bytecodes.)467 +3037 y(In)c Fs(Pr)n(oceedings)j(USENIX)c(Symposium)j(on)e(Internet)i(T) +-10 b(echnologies)25 b(and)e(Systems)p Ft(,)h(1998.)0 +3225 y([MBL97])119 b(A.C.)24 b(Myers,)g(J.)h(A.)g(Bank,)f(and)h(B.)f +(Liskov)-10 b(.)39 b(Parameterized)24 b(T)-8 b(ypes)23 +b(for)i(Java.)41 b(In)25 b Fs(Pr)n(oceedings)467 3337 +y(POPL)m('97)p Ft(,)c(Paris,)i(France,)f(1997.)0 3525 +y([MD97])161 b(J.)23 b(Meyer)e(and)h(T)-7 b(.)23 b(Downing.)32 +b Fs(Java)24 b(V)-7 b(irtual)24 b(Machine)p Ft(.)33 b(O'Reilly)-10 +b(,)23 b(1997.)0 3713 y([Sil98])217 b(Shawn)28 b(Silverman.)51 +b Fs(The)28 b(class\002le)i(API)p Ft(.)50 b(University)27 +b(of)h(Manitoba,)i Ff(http://Meurrens)o(.)467 3826 y(ML.org/ip-)t +(Links)o(/j)o(av)o(a/)o(cod)o(eE)o(ng)o(in)o(ee)o(rin)o(g/)o(vi)o(ew)o +(er)o(s.h)o(tm)o(l)p Ft(,)16 b(1998.)0 4013 y([T)-8 b(af96])194 +b(T)-8 b(ucker)23 b(T)-8 b(aft.)37 b(Pr)n(ogramming)25 +b(the)e(Internet)f(in)j(Ada95.)38 b(In)24 b Fs(Pr)n(oceedings)j +(Ada-Eur)n(ope)f(Interna-)467 4126 y(tional)e(Confer)n(ence)g(on)e +(Reliable)j(Softwar)n(e)f(T)-10 b(echnologies)p Ft(,)25 +b(1996.)0 4314 y([TK98])195 b(M.)35 b(Thies)f(and)h(U.)f(Kastens.)71 +b(Statische)34 b(Analyse)g(von)h(Bibliotheken)f(als)i(Gr)o(undlage)f +(dy-)467 4427 y(namischer)23 b(Optimier)o(ung.)32 b(In)23 +b(Clemens)f(Cap,)h(editor)-7 b(,)21 b Fs(Pr)n(oceedings)26 +b(JIT'98)p Ft(.)d(Springer)-7 b(,)22 b(1998.)0 4614 y([Y)-8 +b(ou98])159 b(Matt)42 b(T)-7 b(.)42 b(Y)-8 b(ourst.)92 +b Fs(Inside)44 b(Java)f(Class)g(Files)p Ft(.)96 b(Laserstars)40 +b(T)-8 b(echnologies,)45 b Ff(http://www.)467 4727 y(laserstars.com)o +(/ar)o(ti)o(cl)o(es)o(/d)o(dj/)o(in)o(si)o(de)o(jc)o(f/)p +Ft(,)16 b(1998.)1863 5712 y Fq(23)p eop +%%Page: 24 24 +24 23 bop 0 410 a Fr(A)143 b(Code)35 b(examples)e(for)i(the)g(ClassGen) +f(API)0 658 y Fm(A.1)119 b(HelloW)-9 b(orldBuilder)i(.java)0 +835 y Ft(The)18 b(following)h(Java)i(pr)n(ogram)e(r)n(eads)f(a)i(name)f +(fr)n(om)g(the)g(standar)n(d)f(input)g(and)h(prints)f(a)i(friendly)f +(\223Hello\224.)0 948 y(Since)31 b(the)f Ff(readLine\(\))d +Ft(method)j(may)h(thr)n(ow)g(an)g Ff(IOException)26 b +Ft(it)32 b(is)f(enclosed)e(by)i(a)h Ff(try-catch)0 1060 +y Ft(block.)0 1268 y Ff(import)52 b(java.io.*;)0 1494 +y(public)g(class)g(HelloWorld)e({)109 1607 y(public)i(static)g(void)g +(main\(String[])d(argv\))j({)218 1720 y(BufferedReader)c(in)54 +b(=)g(new)f(BufferedReader\()o(new)1418 1833 y(InputStreamRead)o(er)o +(\(Sy)o(st)o(em)o(.i)o(n\))o(\);)218 1946 y(String)f(name)h(=)h(null;) +218 2172 y(try)f({)327 2284 y(System.out.prin)o(t\(")o(Pl)o(ea)o(se)48 +b(enter)k(your)h(name>)f("\);)327 2397 y(name)h(=)h(in.readLine\(\);) +218 2510 y(})g(catch\(IOExcepti)o(on)48 b(e\))54 b({)g(return;)d(})218 +2736 y(System.out.prin)o(tl)o(n\(")o(He)o(ll)o(o,)d(")54 +b(+)g(name\);)109 2849 y(})0 2962 y(})0 3343 y Fm(A.2)119 +b(HelloW)-9 b(orldBuilder)i(.java)0 3520 y Ft(W)f(e)28 +b(will)i(sketch)e(her)n(e)g(how)g(the)g(above)h(Java)i(class)e(can)h +(be)f(cr)n(eated)f(fr)n(om)h(the)f(scratch)h(using)g(the)f +Fe(BCEL)0 3633 y Ft(API.)h(For)g(ease)g(of)h(r)n(eading)g(we)f(will)i +(use)e(textual)g(signatur)n(es)g(and)h(not)f(cr)n(eate)h(them)f +(dynamically)-10 b(.)51 b(For)0 3746 y(example,)22 b(the)g(signatur)n +(e)109 3954 y Ff("\(Ljava/lang/St)o(ri)o(ng)o(;\)L)o(ja)o(va)o(/l)o(an) +o(g/S)o(tr)o(in)o(gB)o(uf)o(fer)o(;")146 4161 y Ft(would)g(actually)i +(be)f(cr)n(eated)f(with)109 4369 y Ff(Type.getMethodS)o(ig)o(na)o(tur)o +(e\()o(Ty)o(pe)o(.S)o(TRI)o(NG)o(BU)o(FF)o(ER)o(,)49 +b(new)k(Type[])f({)i(Type.STRING)49 b(}\);)0 4627 y Fg(A.2.1)99 +b(Initialization:)0 4803 y Ft(First)22 b(we)g(cr)n(eate)g(an)i(empty)d +(class)i(and)g(an)g(instr)o(uction)f(list:)109 5011 y +Ff(ClassGen)106 b(cg)53 b(=)h(new)f(ClassGen\("HelloW)o(or)o(ld)o(",)48 +b("java.lang.Obje)o(ct)o(",)1636 5124 y("",)h(ACC_PUBLIC)h +(|)k(ACC_SUPER,)1636 5237 y(null\);)109 5350 y(ConstantPoolGen)48 +b(cp)53 b(=)i(cg.getConstant)o(Po)o(ol)o(\(\))o(;)49 +b(//)k(cg)h(creates)d(constant)g(pool)109 5463 y(InstructionList)d(il) +53 b(=)i(new)e(InstructionLis)o(t\()o(\);)p eop +%%Page: 25 25 +25 24 bop 146 407 a Ft(W)-8 b(e)26 b(then)f(cr)n(eate)i(the)e(main)j +(method,)d(supplying)g(the)h(method's)f(name)h(and)h(the)e(symbolic)i +(type)e(sig-)0 520 y(natur)n(e)d(encoded)f(with)i Ff(Type)e +Ft(objects.)109 705 y Ff(MethodGen)105 b(mg)54 b(=)g(new)f +(MethodGen\(ACC_S)o(TA)o(TI)o(C)48 b(|)55 b(ACC_PUBLIC,//)48 +b(access)k(flags)1745 818 y(Type.VOID,)760 b(//)53 b(return)f(type)1745 +931 y(new)i(Type[])d({)655 b(//)53 b(argument)e(types)1855 +1044 y(new)i(ArrayType\(Type)o(.S)o(TRI)o(NG)o(,)48 b(1\))54 +b(},)1745 1156 y(new)g(String[])d({)j("argv")d(},)j(//)g(arg)f(names) +1745 1269 y("main",)f("HelloWorld",)212 b(//)54 b(method,)d(class)1745 +1382 y(il,)j(cp\);)109 1495 y(InstructionFact)o(or)o(y)48 +b(factory)k(=)i(new)f(InstructionFact)o(or)o(y\()o(cg\))o(;)146 +1680 y Ft(W)-8 b(e)22 b(de\002ne)f(some)h(often)g(use)f(types:)109 +1865 y Ff(ObjectType)50 b(i_stream)h(=)j(new)f(ObjectType\("jav)o(a.i)o +(o.)o(In)o(pu)o(tS)o(tre)o(am)o("\))o(;)109 1978 y(ObjectType)d +(p_stream)h(=)j(new)f(ObjectType\("jav)o(a.i)o(o.)o(Pr)o(in)o(tS)o(tre) +o(am)o("\))o(;)0 2233 y Fg(A.2.2)99 b(Create)24 b(variables)h +Fa(in)f Fg(and)h Fa(name)p Fg(:)0 2410 y Ft(W)-8 b(e)16 +b(call)j(the)e(constr)o(uctors,)f(i.e.)26 b(execute)15 +b Ff(BufferedReader\(I)o(np)o(ut)o(St)o(rea)o(mR)o(ea)o(de)o(r\()o(Sys) +o(te)o(m.)o(in)o(\)\))o Ft(.)0 2522 y(The)j(r)n(efer)n(ence)h(to)g(the) +f Ff(BufferedReader)13 b Ft(object)19 b(stays)f(on)h(top)f(of)h(the)g +(stack)g(and)g(is)g(stor)n(ed)f(in)h(the)g(newly)0 2635 +y(allocated)k Ff(in)f Ft(variable.)109 2820 y Ff(il.append\(facto)o(ry) +o(.c)o(rea)o(te)o(Ne)o(w\()o("j)o(ava)o(.i)o(o.)o(Bu)o(ff)o(ere)o(dR)o +(ea)o(de)o(r")o(\)\);)109 2933 y(il.append\(Instr)o(uc)o(ti)o(onC)o(on) +o(st)o(an)o(ts)o(.DU)o(P\))o(;)48 b(//)54 b(Use)f(predefined)d +(constant)109 3046 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(Ne)o(w\()o +("j)o(ava)o(.i)o(o.)o(In)o(pu)o(tSt)o(re)o(am)o(Re)o(ad)o(er")o(\)\))o +(;)109 3159 y(il.append\(Instr)o(uc)o(ti)o(onC)o(on)o(st)o(an)o(ts)o +(.DU)o(P\))o(;)109 3272 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(Fi)o +(el)o(dA)o(cce)o(ss)o(\(")o(ja)o(va)o(.la)o(ng)o(.S)o(ys)o(te)o(m",)e +("in",)k(i_stream,)2073 3385 y(Constants.GETS)o(TA)o(TIC)o(\)\))o(;)109 +3498 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(In)o(vo)o(ke)o(\("j)o +(av)o(a.)o(io)o(.I)o(npu)o(tS)o(tr)o(ea)o(mR)o(ead)o(er)o(",)c +("",)1800 3611 y(Type.VOID,)i(new)j(Type[])f({)i(i_stream)d(},) +1800 3724 y(Constants.INVOK)o(ES)o(PE)o(CI)o(AL\))o(\);)109 +3837 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(In)o(vo)o(ke)o(\("j)o +(av)o(a.)o(io)o(.B)o(uff)o(er)o(ed)o(Re)o(ad)o(er")o(,)d("",)j +(Type.VOID,)1800 3950 y(new)i(Type[])f({new)h(ObjectType\("ja)o(va)o +(.io)o(.R)o(ea)o(de)o(r")o(\)},)1800 4062 y(Constants.INVOK)o(ES)o(PE)o +(CI)o(AL\))o(\);)109 4288 y(LocalVariableGe)o(n)48 b(lg)54 +b(=)218 4401 y(mg.addLocalVari)o(ab)o(le\()o("i)o(n")o(,)1309 +4514 y(new)f(ObjectType\("jav)o(a.i)o(o.)o(Bu)o(ff)o(er)o(edR)o(ea)o +(de)o(r")o(\),)48 b(null,)k(null\);)109 4627 y(int)h(in)h(=)g +(lg.getIndex\(\);)109 4740 y(lg.setStart\(il.)o(ap)o(pe)o(nd\()o(ne)o +(w)48 b(ASTORE\(in\)\)\);)h(//)54 b(`i')f(valid)f(from)h(here)146 +4925 y Ft(Cr)n(eate)23 b(local)h(variable)h Ff(name)c +Ft(and)h(initialize)j(it)e(to)f Ff(null)p Ft(.)109 5110 +y Ff(lg)54 b(=)g(mg.addLocalVar)o(iab)o(le)o(\(")o(na)o(me)o(",)48 +b(Type.STRING,)h(null,)j(null\);)109 5223 y(int)h(name)g(=)h +(lg.getIndex\(\);)109 5336 y(il.append\(Instr)o(uc)o(ti)o(onC)o(on)o +(st)o(an)o(ts)o(.AC)o(ON)o(ST)o(_N)o(UL)o(L\);)109 5449 +y(lg.setStart\(il.)o(ap)o(pe)o(nd\()o(ne)o(w)48 b(ASTORE\(name\)\)\);)g +(//)54 b(`name')d(valid)i(from)f(here)p eop +%%Page: 26 26 +26 25 bop 0 407 a Fg(A.2.3)99 b(Create)24 b(try-catch)i(block)0 +584 y Ft(W)-8 b(e)31 b(r)n(emember)g(the)g(start)g(of)h(the)f(block,)j +(r)n(ead)e(a)g(line)g(fr)n(om)h(the)e(standar)n(d)g(input)g(and)h(stor) +n(e)e(it)i(into)g(the)0 697 y(variable)25 b Ff(name)p +Ft(.)109 913 y Ff(InstructionHand)o(le)48 b(try_start)i(=)218 +1026 y(il.append\(facto)o(ry)o(.cr)o(ea)o(te)o(Fi)o(el)o(dAc)o(ce)o(ss) +o(\(")o(ja)o(va.)o(la)o(ng)o(.S)o(ys)o(tem)o(",)e("out",)k(p_stream,) +2182 1139 y(Constants.GETS)o(TAT)o(IC)o(\)\))o(;)109 +1365 y(il.append\(new)d(PUSH\(cp,)i("Please)g(enter)h(your)h(name>)f +("\)\);)109 1478 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(In)o(vo)o +(ke)o(\("j)o(av)o(a.)o(io)o(.P)o(rin)o(tS)o(tr)o(ea)o(m")o(,)d +("print",)h(Type.VOID,)1800 1591 y(new)j(Type[])f({)i(Type.STRING)c(},) +1800 1704 y(Constants.INVOK)o(EV)o(IR)o(TU)o(AL\))o(\);)109 +1817 y(il.append\(new)f(ALOAD\(in\)\);)109 1930 y(il.append\(facto)o +(ry)o(.c)o(rea)o(te)o(In)o(vo)o(ke)o(\("j)o(av)o(a.)o(io)o(.B)o(uff)o +(er)o(ed)o(Re)o(ad)o(er")o(,)f("readLine",)1800 2042 +y(Type.STRING,)h(Type.NO_ARGS,)1800 2155 y(Constants.INVOK)o(EV)o(IR)o +(TU)o(AL\))o(\);)109 2268 y(il.append\(new)g(ASTORE\(name\)\);)146 +2485 y Ft(Upon)22 b(normal)h(execution)f(we)g(jump)g(behind)h +(exception)e(handler)-7 b(,)22 b(the)g(tar)n(get)g(addr)n(ess)f(is)h +(not)g(known)0 2598 y(yet.)109 2815 y Ff(GOTO)53 b(g)h(=)g(new)f +(GOTO\(null\);)109 2928 y(InstructionHand)o(le)48 b(try_end)j(=)j +(il.append\(g\);)146 3144 y Ft(W)-8 b(e)22 b(add)g(the)g(exception)g +(handler)g(which)h(simply)g(r)n(eturns)e(fr)n(om)i(the)f(method.)109 +3361 y Ff(InstructionHand)o(le)48 b(handler)j(=)j(il.append\(Instru)o +(ct)o(io)o(nC)o(on)o(sta)o(nt)o(s.)o(RE)o(TU)o(RN\))o(;)109 +3474 y(mg.addException)o(Ha)o(nd)o(ler)o(\(t)o(ry)o(_s)o(ta)o(rt,)48 +b(try_end,)j(handler,)f("java.io.IOExcep)o(ti)o(on)o("\))o(;)146 +3691 y Ft(\223Normal\224)24 b(code)e(continues,)f(now)h(we)g(can)i(set) +d(the)h(branch)i(tar)n(get)e(of)g(the)g(GOT)n(O.)109 +3908 y Ff(InstructionHand)o(le)48 b(ih)54 b(=)218 4020 +y(il.append\(facto)o(ry)o(.cr)o(ea)o(te)o(Fi)o(el)o(dAc)o(ce)o(ss)o +(\(")o(ja)o(va.)o(la)o(ng)o(.S)o(ys)o(tem)o(",)48 b("out",)k(p_stream,) +2182 4133 y(Constants.GETS)o(TAT)o(IC)o(\)\))o(;)109 +4246 y(g.setTarget\(ih\))o(;)0 4505 y Fg(A.2.4)99 b(Printing)25 +b(\224Hello\224)0 4682 y Ft(String)d(concatenation)h(compiles)f(to)g +Ff(StringBuffer)17 b Ft(operations.)109 4898 y Ff(il.append\(facto)o +(ry)o(.c)o(rea)o(te)o(Ne)o(w\()o(Ty)o(pe.)o(ST)o(RI)o(NG)o(BU)o(FFE)o +(R\))o(\);)109 5011 y(il.append\(Instr)o(uc)o(ti)o(onC)o(on)o(st)o(an)o +(ts)o(.DU)o(P\))o(;)109 5124 y(il.append\(new)49 b(PUSH\(cp,)i("Hello,) +g("\)\);)109 5237 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(In)o(vo)o +(ke)o(\("j)o(av)o(a.)o(la)o(ng)o(.St)o(ri)o(ng)o(Bu)o(ff)o(er")o(,)d +("",)1800 5350 y(Type.VOID,)i(new)j(Type[])f({)i(Type.STRING)c +(},)1800 5463 y(Constants.INVOK)o(ES)o(PE)o(CI)o(AL\))o(\);)p +eop +%%Page: 27 27 +27 26 bop 109 407 a Ff(il.append\(new)49 b(ALOAD\(name\)\);)109 +520 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(In)o(vo)o(ke)o(\("j)o(av) +o(a.)o(la)o(ng)o(.St)o(ri)o(ng)o(Bu)o(ff)o(er")o(,)f("append",)1800 +633 y(Type.STRINGBUFF)o(ER)o(,)g(new)54 b(Type[])d({)j(Type.STRING)c +(},)1800 746 y(Constants.INVOK)o(EV)o(IR)o(TU)o(AL\))o(\);)109 +858 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(In)o(vo)o(ke)o(\("j)o(av) +o(a.)o(la)o(ng)o(.St)o(ri)o(ng)o(Bu)o(ff)o(er")o(,)e("toString",)1800 +971 y(Type.STRING,)h(Type.NO_ARGS,)1800 1084 y(Constants.INVOK)o(EV)o +(IR)o(TU)o(AL\))o(\);)109 1310 y(il.append\(facto)o(ry)o(.c)o(rea)o(te) +o(In)o(vo)o(ke)o(\("j)o(av)o(a.)o(io)o(.P)o(rin)o(tS)o(tr)o(ea)o(m")o +(,)g("println",)1800 1423 y(Type.VOID,)h(new)j(Type[])f({)i +(Type.STRING)c(},)1800 1536 y(Constants.INVOK)o(EV)o(IR)o(TU)o(AL\))o +(\);)109 1649 y(il.append\(Instr)o(uc)o(ti)o(onC)o(on)o(st)o(an)o(ts)o +(.RE)o(TU)o(RN)o(\);)0 1908 y Fg(A.2.5)99 b(Finalization)0 +2085 y Ft(Finally)-10 b(,)26 b(we)e(have)i(to)e(set)g(the)g(stack)g +(size,)i(which)f(normally)h(would)e(be)h(computed)f(on)g(the)g(\003y)h +(and)g(add)g(a)0 2197 y(default)d(constr)o(uctor)g(method)f(to)h(the)g +(class,)h(which)g(is)g(empty)e(in)i(this)f(case.)109 +2418 y Ff(mg.setMaxStack\()o(5\))o(;)109 2531 y(cg.addMethod\(mg)o(.g)o +(et)o(Met)o(ho)o(d\()o(\)\))o(;)109 2644 y(il.dispose\(\);)49 +b(//)k(Allow)g(instruction)c(handles)j(to)h(be)h(reused)109 +2756 y(cg.addEmptyCons)o(tr)o(uc)o(tor)o(\(A)o(CC)o(_P)o(UB)o(LIC)o +(\);)146 2977 y Ft(Last)22 b(but)h(not)f(least)g(we)g(dump)g(the)g +Ff(JavaClass)c Ft(object)23 b(to)f(a)h(\002le.)109 3197 +y Ff(try)53 b({)218 3310 y(cg.getJavaClass)o(\(\))o(.du)o(mp)o(\(")o +(He)o(ll)o(oWo)o(rl)o(d.)o(cl)o(as)o(s"\))o(;)109 3423 +y(})h(catch\(java.io.I)o(OE)o(xce)o(pt)o(io)o(n)48 b(e\))54 +b({)g(System.err.prin)o(tl)o(n\()o(e\);)48 b(})0 3711 +y Fm(A.3)119 b(Peephole.java)0 3888 y Ft(This)20 b(class)h(implements)e +(a)i(simple)f(peephole)e(optimizer)j(that)f(r)n(emoves)f(any)h(NOP)h +(instr)o(uctions)e(fr)n(om)i(the)0 4001 y(given)i(class.)0 +4221 y Ff(import)52 b(java.io.*;)0 4334 y(import)g(de.fub.bytecod)o +(e.c)o(la)o(ss)o(fi)o(le)o(.*;)0 4447 y(import)g(de.fub.bytecod)o(e.g)o +(en)o(er)o(ic)o(.*)o(;)0 4560 y(import)g(de.fub.bytecod)o(e.R)o(ep)o +(os)o(it)o(or)o(y;)0 4785 y(public)g(class)g(Peephole)f({)109 +4898 y(public)h(static)g(void)g(main\(String[])d(argv\))j({)218 +5011 y(try)h({)327 5124 y(/*)h(Load)f(the)g(class)f(from)h(CLASSPATH.) +382 5237 y(*/)327 5350 y(JavaClass)378 b(clazz)161 b(=)54 +b(Repository.looku)o(pC)o(la)o(ss)o(\(ar)o(gv)o([0)o(]\))o(;)327 +5463 y(Method[])433 b(methods)51 b(=)j(clazz.getMethods)o(\(\))o(;)p +eop +%%Page: 28 28 +28 27 bop 327 407 a Ff(ConstantPoolGen)48 b(cp)326 b(=)54 +b(new)g(ConstantPoolGe)o(n\()o(cl)o(azz)o(.g)o(et)o(Co)o(ns)o(tan)o(tP) +o(oo)o(l\()o(\)\))o(;)327 633 y(for\(int)e(i=0;)g(i)i(<)h +(methods.length)o(;)48 b(i++\))53 b({)436 746 y(MethodGen)e(mg)381 +b(=)54 b(new)f(MethodGen\(metho)o(ds)o([i)o(],)2345 858 +y(clazz.getClassNa)o(me)o(\(\))o(,)48 b(cp\);)436 971 +y(Method)216 b(stripped)51 b(=)j(removeNOPs\(mg\))o(;)436 +1197 y(if\(stripped)c(!=)k(null\))270 b(//)54 b(Any)f(NOPs)g(stripped?) +545 1310 y(methods[i])d(=)55 b(stripped;)50 b(//)k(Overwrite)c(with)j +(stripped)e(method)327 1423 y(})327 1649 y(/*)j(Dump)f(the)g(class)f +(to)i(_.class)382 1762 y(*/)327 1875 y(clazz.setConsta)o +(ntP)o(oo)o(l\()o(cp)o(.g)o(etF)o(in)o(al)o(Co)o(ns)o(tan)o(tP)o(oo)o +(l\()o(\)\))o(;)327 1988 y(clazz.dump\(claz)o(z.g)o(et)o(Cl)o(as)o(sN)o +(ame)o(\(\))c(+)54 b("_.class"\);)218 2100 y(})g(catch\(Exception)48 +b(e\))54 b({)g(e.printStackTr)o(ac)o(e\(\))o(;)48 b(})109 +2213 y(})109 2439 y(private)j(static)h(final)h(Method)e +(removeNOPs\(Metho)o(dG)o(en)d(mg\))53 b({)218 2552 y(InstructionList) +157 b(il)217 b(=)54 b(mg.getInstructio)o(nL)o(is)o(t\()o(\);)218 +2665 y(FindPattern)377 b(f)272 b(=)54 b(new)g(FindPattern\(il)o(\);)218 +2778 y(String)652 b(pat)162 b(=)54 b("\(`NOP'\)+";)c(//)k(Find)e(at)i +(least)e(one)h(NOP)218 2891 y(InstructionHand)o(le)48 +b(next)107 b(=)54 b(null;)218 3004 y(int)817 b(count)52 +b(=)i(0;)218 3230 y(for\(Instruction)o(Ha)o(ndl)o(e)48 +b(ih)54 b(=)g(f.search\(pat\);)48 b(//)54 b(Search)e(with)g(regular)g +(expression)436 3342 y(ih)i(!=)g(null;)436 3455 y(ih)g(=)g +(f.search\(pat,)49 b(next\)\))j({)327 3681 y(InstructionHand)o(le[)o(]) +c(match)k(=)j(f.getMatch\(\);)327 3794 y(InstructionHand)o(le)157 +b(first)52 b(=)j(match[0];)327 3907 y(InstructionHand)o(le)157 +b(last)107 b(=)55 b(match[match.le)o(ng)o(th)48 b(-)54 +b(1];)327 4133 y(/*)g(Some)f(nasty)f(Java)h(compilers)d(may)j(add)g +(NOP)h(at)f(end)g(of)h(method.)382 4246 y(*/)327 4359 +y(if\(\(next)d(=)j(last.getNext\(\)\))48 b(==)54 b(null\))436 +4472 y(break;)327 4697 y(count)f(+=)g(match.length;)327 +4923 y(/*)h(Delete)e(NOPs)g(and)i(redirect)d(any)i(references)d(to)j +(them)g(to)h(the)f(following)382 5036 y(*)h(\(non-nop\))c(instruction.) +382 5149 y(*/)327 5262 y(try)j({)436 5375 y(il.delete\(first,)48 +b(last\);)p eop +%%Page: 29 29 +29 28 bop 327 407 a Ff(})54 b(catch\(TargetLost)o(Ex)o(ce)o(pt)o(io)o +(n)49 b(e\))k({)436 520 y(InstructionHandl)o(e[)o(])48 +b(targets)k(=)i(e.getTargets\(\))o(;)436 633 y(for\(int)e(i=0;)g(i)j(<) +f(targets.length)o(;)48 b(i++\))53 b({)545 746 y(InstructionTarge)o(te) +o(r[)o(])48 b(targeters)j(=)j(targets[i].getT)o(ar)o(ge)o(te)o(rs\()o +(\);)545 971 y(for\(int)e(j=0;)h(j)h(<)g(targeters.leng)o(th)o(;)49 +b(j++\))655 1084 y(targeters[j].u)o(pd)o(at)o(eT)o(arg)o(et)o(\(t)o(ar) +o(ge)o(ts[)o(i])o(,)f(next\);)436 1197 y(})327 1310 y(})218 +1423 y(})218 1649 y(Method)k(m)i(=)g(null;)218 1875 y(if\(count)d(>)j +(0\))g({)327 1988 y(System.out.prin)o(tln)o(\(")o(Re)o(mo)o(ve)o(d)49 +b(")54 b(+)g(count)e(+)i(")g(NOP)f(instructions)c(from)k(method)f(")i +(+)1364 2100 y(mg.getName\(\)\);)327 2213 y(m)g(=)109 +b(mg.getMethod\(\);)218 2326 y(})218 2552 y(il.dispose\(\);)49 +b(//)k(Reuse)g(instruction)c(handles)218 2665 y(return)j(m;)109 +2778 y(})0 2891 y(})p eop +%%Page: 30 30 +30 29 bop 828 5113 a @beginspecial 13 @llx 12 @lly 383 +@urx 830 @ury 2602 @rwi @setspecial +%%BeginDocument: eps/constantpool.eps +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: Rose Diagram(s) +%%Creator: AdobePS5.dll Version 5.0 +%%CreationDate: 7/7/1999 17:45:21 +%%Pages: 1 +%%Orientation: Portrait +%%PageOrder: Ascend +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%DocumentData: Clean7Bit +%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 +%%LanguageLevel: 2 +%%BoundingBox: 13 12 383 830 +%%EndComments +%%BeginProcSet: epsffit 1 0 +gsave +1677.488 -356.303 translate +90 rotate +2.035 2.035 scale +%%EndProcSet + + +%%BeginDefaults +%%PageBoundingBox: 13 12 582 830 +%%EndDefaults + +%%BeginProlog +%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 +/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false +setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype +ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch +def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 +rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def +/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def +typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 +def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp +exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def +/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype +{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} +readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop +(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def +/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) +tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup +xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint +tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck +{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) +tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup +rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} +forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier +/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin +$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 +ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto +(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt +$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} +repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print +(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup +0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop +/setpacking where{pop oldpack setpacking}if}if +%%EndResource +userdict /Pscript_WinNT_Incr 230 dict dup begin put +%%BeginResource: file Pscript_FatalError 5.0 0 +/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div +cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def +%%EndResource +/VM?{vmstatus exch sub exch pop gt{[ +(This job requires more memory than is available in this printer.)100 500 +(Try one or more of the following, and then print again:)100 485 +(For the output format, choose Optimize For Portability.)115 470 +(In the Device Settings page, make sure the Available PostScript Memory is accurate.) +115 455(Reduce the number of fonts in the document.)115 440 +(Print the document in parts.)115 425 12/Times-Roman showpage +(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def +%%BeginResource: file Pscript_Win_Basic 5.0 0 +/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ +/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- +/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , +d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C +/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M +/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d +/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage +, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false +/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d +/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, +d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx +matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit +/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} +b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U +/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d +reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d +/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 +sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} +b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b +/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b +/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} +b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b +%%EndResource +%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 +/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge +{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ +snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F +setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d +/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b +%%EndResource +end +%%EndProlog + +%%BeginSetup +[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec +1 setlinecap 1 setlinejoin +/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def +%%EndSetup + +%%Page: 1 1 +%%PageBoundingBox: 13 12 582 830 +%%EndPageComments +%%BeginPageSetup +/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh +%%EndPageSetup + +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Win_GdiObject 5.0 0 +/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore +{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d +/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps +L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType +1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d +/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal +{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep +gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b +/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M +MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep +M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 ++}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d +/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix +GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 +/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal +makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 +/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d +/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] +d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 +0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne +{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd +aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx +PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save +8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 +Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx +matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` +xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill +{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot +concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap +YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 +-0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix +currentmatrix readonly d ; ;}if}b +%%EndResource +%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 +/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} +{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 +d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d +20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d +/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ +/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict +~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} +? ;}b +%%EndResource +end reinitialize +: N 1409 506 185 84 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 1594 505 M 1408 505 I 1408 590 I 1594 590 I C +K +0 0 0 1 scol Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Text 5.0 0 +/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d +/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ +length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets +{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& +/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} +if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ +{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get +StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ +{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ +length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ +put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M +currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d +/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N +/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix +astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get +length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d +/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS +{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 +copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for +& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ +4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 +add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for +/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 +Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName +length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length +string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ +putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 +$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? +{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName +get undefinefont}forall undefinefont}b +%%EndResource +end reinitialize +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Encoding256 5.0 0 +/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction +/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign +/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma +/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon +/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S +/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave +/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright +/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis +/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef +/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet +/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef +/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section +/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered +/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph +/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter +/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis +/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute +/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls +/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute +/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve +/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex +/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put +%%EndResource +end reinitialize + +%%IncludeResource: font Helvetica +F /F0 0 /256 T /Helvetica mF +/F0S18 F0 [24.66 0 0 -24.66 0 0 ] mFS +F0S18 Ji +1433 537 M (ConstantCP)[18 14 14 13 7 14 14 7 18 0]xS +0.602 0 0.199 1 scol N 1594 551 M 1408 551 I 1408 590 I 1594 590 I C +K +N 1594 565 M 1408 565 I 1408 590 I 1594 590 I C +K +: N 1292 714 375 85 rp C +1 1 0.801 1 scol L ; N 1667 713 M 1291 713 I 1291 799 I 1667 799 I C +K +0 0 0 1 scol 1324 745 M (ConstantInterfaceMethodref)[18 14 14 13 7 14 14 7 6 14 7 14 8 7 14 13 14 21 14 7 14 14 14 8 14 0]xS +0.602 0 0.199 1 scol N 1667 759 M 1291 759 I 1291 799 I 1667 799 I C +K +N 1667 773 M 1291 773 I 1291 799 I 1667 799 I C +K +: N 1710 714 262 85 rp C +1 1 0.801 1 scol L ; N 1972 713 M 1709 713 I 1709 799 I 1972 799 I C +K +0 0 0 1 scol 1734 745 M (ConstantMethodref)[18 14 14 13 7 14 14 7 21 14 7 14 14 14 8 14 0]xS +0.602 0 0.199 1 scol N 1972 759 M 1709 759 I 1709 799 I 1972 799 I C +K +N 1972 773 M 1709 773 I 1709 799 I 1972 799 I C +K +: N 1011 714 235 85 rp C +1 1 0.801 1 scol L ; N 1246 713 M 1010 713 I 1010 799 I 1246 799 I C +K +0 0 0 1 scol 1036 745 M (ConstantFieldref)[18 14 14 13 7 14 14 7 15 6 14 6 14 8 14 0]xS +0.602 0 0.199 1 scol N 1246 759 M 1010 759 I 1010 799 I 1246 799 I C +K +N 1246 773 M 1010 773 I 1010 799 I 1246 799 I C +K +: N 1516 58 213 125 rp C +1 1 0.801 1 scol L ; N 1729 57 M 1515 57 I 1515 183 I 1729 183 I C +K +0 0 0 1 scol 1546 89 M (ConstantPool)[18 14 14 13 7 14 14 7 17 14 14 0]xS +0.602 0 0.199 1 scol N 1729 103 M 1515 103 I 1515 183 I 1729 183 I C +K +N 1729 116 M 1515 116 I 1515 183 I 1729 183 I C +K +0 0 0 1 scol 1555 158 M (getConstant\(\))[14 14 7 18 14 14 13 7 14 14 7 8 0]xS +: N 1550 265 144 84 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1694 264 M 1549 264 I 1549 349 I 1694 349 I C +K +0 0 0 1 scol 1571 296 M (Constant)[18 14 14 13 7 14 14 0]xS +0.602 0 0.199 1 scol N 1694 310 M 1549 310 I 1549 349 I 1694 349 I C +K +N 1694 323 M 1549 323 I 1549 349 I 1694 349 I C +K +N 1622 223 M 1622 184 I K +N 1652 175 14 29 rp C +1 1 1 1 scol L 0 0 0 1 scol 1652 198 M (1)S +0.602 0 0.199 1 scol N 1622 184 M 1632 203 I 1622 221 I 1612 203 I 1622 184 I C +: 1 1 1 1 scol O ; K +N 1622 223 M 1622 263 I K +N 1654 245 11 28 rp C +1 1 1 1 scol L 0 0 0 1 scol 1654 268 M (*)S +N 1652 175 14 29 rp C +1 1 1 1 scol L 0 0 0 1 scol 1652 198 M (1)S +N 1654 245 11 28 rp C +1 1 1 1 scol L 0 0 0 1 scol 1654 268 M (*)S +0.602 0 0.199 1 scol N 1494 655 M 1494 591 I K +N 1123 655 M 1828 655 I K +N 1494 591 M 1509 632 I 1479 632 I C +: 1 1 1 1 scol O ; K +N 1123 713 M 1123 655 I K +: N 1743 506 219 84 rp C +1 1 0.801 1 scol L ; N 1962 505 M 1742 505 I 1742 590 I 1962 590 I C +K +0 0 0 1 scol 1769 537 M (ConstantString)[18 14 14 13 7 14 14 7 17 7 8 6 14 0]xS +0.602 0 0.199 1 scol N 1962 551 M 1742 551 I 1742 590 I 1962 590 I C +K +N 1962 565 M 1742 565 I 1742 590 I 1962 590 I C +K +: N 822 506 219 84 rp C +1 1 0.801 1 scol L ; N 1041 505 M 821 505 I 821 590 I 1041 590 I C +K +0 0 0 1 scol 849 537 M (ConstantClass)[18 14 14 13 7 14 14 7 18 6 14 13 0]xS +0.602 0 0.199 1 scol N 1041 551 M 821 551 I 821 590 I 1041 590 I C +K +N 1041 565 M 821 565 I 821 590 I 1041 590 I C +K +: N 1236 254 224 84 rp C +1 1 0.801 1 scol L ; N 1460 253 M 1235 253 I 1235 338 I 1460 338 I C +K +0 0 0 1 scol 1259 285 M (ConstantInteger)[18 14 14 13 7 14 14 7 6 14 7 14 14 14 0]xS +0.602 0 0.199 1 scol N 1460 299 M 1235 299 I 1235 338 I 1460 338 I C +K +N 1460 312 M 1235 312 I 1235 338 I 1460 338 I C +K +: N 958 254 232 84 rp C +1 1 0.801 1 scol L ; N 1190 253 M 957 253 I 957 338 I 1190 338 I C +K +0 0 0 1 scol 984 285 M (ConstantDouble)[18 14 14 13 7 14 14 7 18 14 14 14 6 0]xS +0.602 0 0.199 1 scol N 1190 299 M 957 299 I 957 338 I 1190 338 I C +K +N 1190 312 M 957 312 I 957 338 I 1190 338 I C +K +: N 1102 506 207 84 rp C +1 1 0.801 1 scol L ; N 1309 505 M 1101 505 I 1101 590 I 1309 590 I C +K +0 0 0 1 scol 1127 537 M (ConstantFloat)[18 14 14 13 7 14 14 7 15 6 14 14 0]xS +0.602 0 0.199 1 scol N 1309 551 M 1101 551 I 1101 590 I 1309 590 I C +K +N 1309 565 M 1101 565 I 1101 590 I 1309 590 I C +K +: N 708 254 206 84 rp C +1 1 0.801 1 scol L ; N 914 253 M 707 253 I 707 338 I 914 338 I C +K +0 0 0 1 scol 732 285 M (ConstantLong)[18 14 14 13 7 14 14 7 14 14 14 0]xS +0.602 0 0.199 1 scol N 914 299 M 707 299 I 707 338 I 914 338 I C +K +N 914 312 M 707 312 I 707 338 I 914 338 I C +K +: N 2025 506 246 84 rp C +1 1 0.801 1 scol L ; N 2271 505 M 2024 505 I 2024 590 I 2271 590 I C +K +0 0 0 1 scol 2051 537 M (ConstantUnicode)[18 14 14 13 7 14 14 7 18 14 6 13 14 14 0]xS +0.602 0 0.199 1 scol N 2271 545 M 2024 545 I 2024 590 I 2271 590 I C +K +N 2271 558 M 2024 558 I 2024 590 I 2271 590 I C +K +: N 1790 254 322 84 rp C +1 1 0.801 1 scol L ; N 2112 253 M 1789 253 I 1789 338 I 2112 338 I C +K +0 0 0 1 scol 1817 285 M (ConstantNameAndType)[18 14 14 13 7 14 14 7 18 14 22 14 17 14 14 14 12 14 0]xS +0.602 0 0.199 1 scol N 2112 299 M 1789 299 I 1789 338 I 2112 338 I C +K +N 2112 312 M 1789 312 I 1789 338 I 2112 338 I C +K +: N 2172 254 194 84 rp C +1 1 0.801 1 scol L ; N 2366 253 M 2171 253 I 2171 338 I 2366 338 I C +K +0 0 0 1 scol 2195 285 M (ConstantUtf8)[18 14 14 13 7 14 14 7 18 7 7 0]xS +0.602 0 0.199 1 scol N 2366 293 M 2171 293 I 2171 338 I 2366 338 I C +K +N 2366 306 M 2171 306 I 2171 338 I 2366 338 I C +K +N 1626 428 M 1626 350 I K +N 809 428 M 2269 428 I K +N 1626 350 M 1641 391 I 1611 391 I C +: 1 1 1 1 scol O ; K +N 933 505 M 933 428 I K +N 1848 505 M 1848 428 I K +N 1068 339 M 1068 428 I K +N 2146 505 M 2146 428 I K +N 809 339 M 809 428 I K +N 2269 339 M 2269 428 I K +N 1500 505 M 1500 428 I K +N 1336 339 M 1336 428 I K +N 1201 505 M 1201 428 I K +N 1926 339 M 1926 428 I K +N 1468 713 M 1468 655 I K +N 1828 713 M 1828 655 I K +LH +%%PageTrailer + +%%Trailer +%%DocumentNeededResources: +%%+ font Helvetica +%%DocumentSuppliedResources: +Pscript_WinNT_Incr dup /terminate get exec +%%EOF +grestore + +%%EndDocument + @endspecial 824 5316 a Fq(Figur)n(e)26 b(8:)k(UML)25 +b(diagram)g(for)h(the)f(ConstantPool)i(API)p eop +%%Page: 31 31 +31 30 bop 749 5113 a @beginspecial 13 @llx 12 @lly 410 +@urx 830 @ury 2792 @rwi @setspecial +%%BeginDocument: eps/instructions.eps +%!PS-Adobe-3.0 EPSF-3.0 +%%Title: Rose Diagram(s) +%%Creator: AdobePS5.dll Version 5.0 +%%CreationDate: 7/7/1999 17:43:39 +%%Pages: 1 +%%Orientation: Portrait +%%PageOrder: Ascend +%%DocumentNeededResources: (atend) +%%DocumentSuppliedResources: (atend) +%%DocumentData: Clean7Bit +%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 +%%LanguageLevel: 2 +%%BoundingBox: 13 12 410 830 +%%EndComments +%%BeginProcSet: epsffit 1 0 +gsave +1409.418 -167.686 translate +90 rotate +1.711 1.711 scale +%%EndProcSet + + +%%BeginDefaults +%%PageBoundingBox: 13 12 582 830 +%%EndDefaults + +%%BeginProlog +%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 +/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false +setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype +ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch +def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 +rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def +/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def +typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 +def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp +exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def +/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype +{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} +readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop +(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def +/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) +tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup +xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint +tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck +{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) +tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup +rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} +forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier +/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin +$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 +ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto +(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt +$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} +repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print +(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup +0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop +/setpacking where{pop oldpack setpacking}if}if +%%EndResource +userdict /Pscript_WinNT_Incr 230 dict dup begin put +%%BeginResource: file Pscript_FatalError 5.0 0 +/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div +cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def +%%EndResource +/VM?{vmstatus exch sub exch pop gt{[ +(This job requires more memory than is available in this printer.)100 500 +(Try one or more of the following, and then print again:)100 485 +(For the output format, choose Optimize For Portability.)115 470 +(In the Device Settings page, make sure the Available PostScript Memory is accurate.) +115 455(Reduce the number of fonts in the document.)115 440 +(Print the document in parts.)115 425 12/Times-Roman showpage +(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def +%%BeginResource: file Pscript_Win_Basic 5.0 0 +/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ +/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- +/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , +d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C +/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M +/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d +/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage +, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false +/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d +/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, +d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx +matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit +/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} +b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U +/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d +reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d +/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 +sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} +b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b +/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b +/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} +b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b +%%EndResource +%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 +/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge +{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ +snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F +setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d +/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b +%%EndResource +end +%%EndProlog + +%%BeginSetup +[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec +1 setlinecap 1 setlinejoin +/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def +%%EndSetup + +%%Page: 1 1 +%%PageBoundingBox: 13 12 582 830 +%%EndPageComments +%%BeginPageSetup +/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh +%%EndPageSetup + +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Win_GdiObject 5.0 0 +/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore +{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d +/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps +L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType +1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d +/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal +{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep +gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b +/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M +MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep +M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 ++}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d +/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix +GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 +/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal +makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 +/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d +/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] +d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 +0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne +{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd +aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx +PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save +8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 +Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx +matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` +xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill +{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot +concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap +YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 +-0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix +currentmatrix readonly d ; ;}if}b +%%EndResource +%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 +/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} +{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d +/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 +d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d +20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d +/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ +/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict +~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} +? ;}b +%%EndResource +end reinitialize +: N 1432 65 209 154 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 1641 64 M 1431 64 I 1431 219 I 1641 219 I C +K +0 0 0 1 scol Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Text 5.0 0 +/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d +/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ +length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets +{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& +/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} +if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ +{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get +StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ +{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ +length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ +put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M +currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d +/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N +/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix +astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get +length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d +/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS +{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 +copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for +& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ +4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 +add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for +/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 +Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName +length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length +string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ +putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 +$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? +{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName +get undefinefont}forall undefinefont}b +%%EndResource +end reinitialize +Pscript_WinNT_Incr begin +%%BeginResource: file Pscript_Encoding256 5.0 0 +/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction +/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign +/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma +/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon +/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S +/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave +/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright +/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis +/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef +/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet +/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef +/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section +/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered +/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph +/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter +/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis +/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute +/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls +/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute +/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve +/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex +/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put +%%EndResource +end reinitialize + +%%IncludeResource: font Helvetica +F /F0 0 /256 T /Helvetica mF +/F0S21 F0 [33.09 0 0 -33.09 0 0 ] mFS +F0S21 Ji +1461 104 M (Instruction)[9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 1641 117 M 1431 117 I 1431 219 I 1641 219 I C +K +N 1641 212 M 1431 212 I 1431 219 I 1641 219 I C +K +0 0 0 1 scol 1478 153 M (tag)[9 17 0]xS +1478 191 M (length)[7 17 18 18 9 0]xS +: N 575 326 321 98 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 896 325 M 574 325 I 574 424 I 896 424 I C +K +0 0 0 1 scol 609 365 M (BranchInstruction)[22 11 17 18 17 18 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 896 378 M 574 378 I 574 424 I 896 424 I C +K +N 896 396 M 574 396 I 574 424 I 896 424 I C +K +: N 822 556 164 154 rp C +1 1 0.801 1 scol L ; N 986 555 M 821 555 I 821 710 I 986 710 I C +K +0 0 0 1 scol 859 595 M (Select)[22 17 7 17 17 0]xS +0.602 0 0.199 1 scol N 986 608 M 821 608 I 821 710 I 986 710 I C +K +N 986 702 M 821 702 I 821 710 I 986 710 I C +K +0 0 0 1 scol 868 644 M (targets)[9 17 11 18 17 9 0]xS +868 682 M (keys)[16 17 15 0]xS +: N 584 815 303 100 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 887 814 M 583 814 I 583 915 I 887 915 I C +K +0 0 0 1 scol 599 855 M (LOOKUPSWITCH)[18 26 26 22 24 22 22 34 9 21 24 0]xS +0.602 0 0.199 1 scol N 887 868 M 583 868 I 583 915 I 887 915 I C +K +N 887 886 M 583 886 I 583 915 I 887 915 I C +K +: N 964 815 267 100 rp C +1 1 0.801 1 scol L ; N 1231 814 M 963 814 I 963 915 I 1231 915 I C +K +0 0 0 1 scol 978 855 M (TABLESWITCH)[21 22 22 18 22 22 34 9 21 24 0]xS +0.602 0 0.199 1 scol N 1231 868 M 963 868 I 963 915 I 1231 915 I C +K +N 1231 886 M 963 886 I 963 915 I 1231 915 I C +K +: N 567 557 208 100 rp C +1 1 0.801 1 scol L ; N 775 556 M 566 556 I 566 657 I 775 657 I C +K +0 0 0 1 scol 587 597 M (IfInstruction)[9 10 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 775 609 M 566 609 I 566 657 I 775 657 I C +K +N 775 628 M 566 628 I 566 657 I 775 657 I C +K +: N 393 557 143 100 rp C +1 1 0.801 1 scol L ; N 536 556 M 392 556 I 392 657 I 536 657 I C +K +0 0 0 1 scol 415 597 M (GOTO)[26 26 21 0]xS +0.602 0 0.199 1 scol N 536 609 M 392 609 I 392 657 I 536 657 I C +K +N 536 628 M 392 628 I 392 657 I 536 657 I C +K +N 730 499 M 730 425 I K +N 469 499 M 910 499 I K +N 730 425 M 748 473 I 712 473 I C +: 1 1 1 1 scol O ; K +N 469 556 M 469 499 I K +: N 1843 118 290 100 rp C +1 1 0.801 1 scol L ; N 2133 117 M 1842 117 I 1842 218 I 2133 218 I C +K +0 0 0 1 scol 1865 158 M (ReturnInstruction)[24 17 9 18 11 18 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 2133 168 M 1842 168 I 1842 218 I 2133 218 I C +K +N 2133 186 M 1842 186 I 1842 218 I 2133 218 I C +K +: N 1004 325 264 99 rp C +1 1 0.801 1 scol L ; N 1268 324 M 1003 324 I 1003 424 I 1268 424 I C +K +0 0 0 1 scol 1023 364 M (ArrayInstruction)[22 11 11 17 15 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 1268 377 M 1003 377 I 1003 424 I 1268 424 I C +K +N 1268 396 M 1003 396 I 1003 424 I 1268 424 I C +K +: N 1704 332 232 188 rp C +1 1 0.801 1 scol L ; N 1936 331 M 1703 331 I 1703 520 I 1936 520 I C +K +0 0 0 1 scol 1722 372 M (CPInstruction)[24 22 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 1936 382 M 1703 382 I 1703 520 I 1936 520 I C +K +N 1936 438 M 1703 438 I 1703 520 I 1936 520 I C +K +0 0 0 1 scol 1751 418 M (index)[7 18 18 17 0]xS +1751 494 M (getType\(\))[18 17 9 21 15 18 17 11 0]xS +: N 1038 118 274 100 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1312 117 M 1037 117 I 1037 218 I 1312 218 I C +K +0 0 0 1 scol 1059 158 M (StackInstruction)[22 9 17 17 16 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 1312 170 M 1037 170 I 1037 218 I 1312 218 I C +K +N 1312 189 M 1037 189 I 1037 218 I 1312 218 I C +K +: N 1312 325 345 99 rp C +1 1 0.801 1 scol L ; N 1657 324 M 1311 324 I 1311 424 I 1657 424 I C +K +0 0 0 1 scol 1329 364 M (ConversionInstruction)[24 17 18 15 17 11 17 7 17 18 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 1657 377 M 1311 377 I 1311 424 I 1657 424 I C +K +N 1657 396 M 1311 396 I 1311 424 I 1657 424 I C +K +N 675 556 M 675 499 I K +: N 619 118 337 100 rp C +1 1 0.801 1 scol L ; N 956 117 M 618 117 I 618 218 I 956 218 I C +K +0 0 0 1 scol 641 158 M (ArithmeticInstruction)[22 11 7 9 18 27 17 9 7 17 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 956 170 M 618 170 I 618 218 I 956 218 I C +K +N 956 189 M 618 189 I 618 218 I 956 218 I C +K +: N 1974 326 390 148 rp C +1 1 0.801 1 scol L ; N 2364 325 M 1973 325 I 1973 474 I 2364 474 I C +K +0 0 0 1 scol 1998 366 M (LocalVariableInstruction)[18 17 17 17 7 22 17 11 7 17 18 7 17 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 2364 376 M 1973 376 I 1973 474 I 2364 474 I C +K +N 2364 433 M 1973 433 I 1973 474 I 2364 474 I C +K +0 0 0 1 scol 2020 412 M (index)[7 18 18 17 0]xS +: N 1392 869 263 148 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1655 868 M 1391 868 I 1391 1017 I 1655 1017 I C +K +0 0 0 1 scol 1414 908 M (FieldInstruction)[20 7 17 7 18 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 1655 921 M 1391 921 I 1391 1017 I 1655 1017 I C +K +N 1655 940 M 1391 940 I 1391 1017 I 1655 1017 I C +K +0 0 0 1 scol 1439 995 M (getFieldType\(\))[18 17 9 20 7 17 7 18 21 15 18 17 11 0]xS +: N 1735 869 351 148 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2086 868 M 1734 868 I 1734 1017 I 2086 1017 I C +K +0 0 0 1 scol 1790 908 M (InvokeInstruction)[9 18 15 17 16 17 9 18 17 9 11 18 17 9 7 17 0]xS +0.602 0 0.199 1 scol N 2086 919 M 1734 919 I 1734 1017 I 2086 1017 I C +K +N 2086 937 M 1734 937 I 1734 1017 I 2086 1017 I C +K +0 0 0 1 scol 1781 992 M (getArgumentTypes\(\))[18 17 9 22 11 18 18 27 17 18 9 21 15 18 17 17 11 0]xS +0.602 0 0.199 1 scol N 1539 293 M 1539 220 I K +N 703 293 M 2171 293 I K +N 1539 220 M 1557 269 I 1522 269 I C +: 1 1 1 1 scol O ; K +N 2171 325 M 2171 293 I K +N 1826 331 M 1826 293 I K +N 898 784 M 898 711 I K +N 737 784 M 1069 784 I K +N 898 711 M 916 760 I 880 760 I C +: 1 1 1 1 scol O ; K +N 737 814 M 737 784 I K +N 1116 324 M 1116 293 I K +N 792 219 M 792 293 I K +N 1487 324 M 1487 293 I K +N 1984 219 M 1984 293 I K +N 1166 219 M 1166 293 I K +: N 1554 623 248 148 rp C +1 1 0.801 1 scol L ; N 1802 622 M 1553 622 I 1553 771 I 1802 771 I C +K +0 0 0 1 scol 1572 663 M (FieldOrMethod)[20 7 17 7 18 26 11 27 17 9 18 17 0]xS +0.602 0 0.199 1 scol N 1802 676 M 1553 676 I 1553 771 I 1802 771 I C +K +N 1802 694 M 1553 694 I 1553 771 I 1802 771 I C +K +0 0 0 1 scol 1601 749 M (getName\(\))[18 17 9 24 17 27 17 11 0]xS +: N 2179 635 186 99 rp C +1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2365 634 M 2178 634 I 2178 734 I 2365 734 I C +K +0 0 0 1 scol 2232 674 M (NEW)[24 22 0]xS +0.602 0 0.199 1 scol N 2365 684 M 2178 684 I 2178 734 I 2365 734 I C +K +N 2365 703 M 2178 703 I 2178 734 I 2365 734 I C +K +N 703 325 M 703 293 I K +N 1820 594 M 1820 521 I K +N 1657 594 M 2249 594 I K +N 1820 521 M 1838 570 I 1802 570 I C +: 1 1 1 1 scol O ; K +: N 1889 635 250 99 rp C +1 1 0.801 1 scol L ; N 2139 634 M 1888 634 I 1888 734 I 2139 734 I C +K +0 0 0 1 scol 1907 674 M (INSTANCEOF)[9 24 22 21 22 24 24 22 26 0]xS +0.602 0 0.199 1 scol N 2139 684 M 1888 684 I 1888 734 I 2139 734 I C +K +N 2139 703 M 1888 703 I 1888 734 I 2139 734 I C +K +N 2014 634 M 2014 594 I K +N 2249 634 M 2249 594 I K +N 1657 622 M 1657 594 I K +N 1069 814 M 1069 784 I K +N 1677 845 M 1677 772 I K +N 1511 845 M 1907 845 I K +N 1677 772 M 1695 821 I 1660 821 I C +: 1 1 1 1 scol O ; K +N 1907 868 M 1907 845 I K +N 1511 868 M 1511 845 I K +N 910 555 M 910 499 I K +LH +%%PageTrailer + +%%Trailer +%%DocumentNeededResources: +%%+ font Helvetica +%%DocumentSuppliedResources: +Pscript_WinNT_Incr dup /terminate get exec +%%EOF +grestore + +%%EndDocument + @endspecial 880 5316 a Fq(Figur)n(e)26 b(9:)31 b(UML)25 +b(diagram)g(for)g(the)h(Instr)o(uction)g(API)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/docs/manual.tex b/docs/manual.tex new file mode 100644 index 00000000..a79ce572 --- /dev/null +++ b/docs/manual.tex @@ -0,0 +1,1079 @@ +\documentclass[12pt,twoside]{article} + +\usepackage{epsf,a4wide,moreverb,url} +\usepackage{palatino} + +\newcommand\jc{{\sffamily BCEL }} +\newcommand\cp{{constant pool }} +\newcommand\cpe{constant pool} +\newcommand\jvm{{Java Virtual Machine }} +\newcommand\jvme{{Java Virtual Machine}} +\newcommand\vm{{Virtual Machine }} +\newcommand\href[2]{#2} + +\begin{document} + +\title{Byte Code Engineering Library (BCEL)\\ + Description and usage manual\\ + {\small \textbf{Version 1.0}}} + +\author{{\Large Markus Dahm}\\\\ + \href{mailto:markus.dahm@inf.fu-berlin.de}{\texttt{markus.dahm@berlin.de}}} + +\maketitle + +%\tableofcontents + +\begin{abstract} +Extensions and improvements of the programming language Java and its +related execution environment (Java Virtual Machine, JVM) are the +subject of a large number of research projects and proposals. There +are projects, for instance, to add parameterized types to Java, to +implement ``Aspect-Oriented Programming'', to perform sophisticated +static analysis, and to improve the run-time performance. + +Since Java classes are compiled into portable binary class files +(called \emph{byte code}), it is the most convenient and +platform-independent way to implement these improvements not by +writing a new compiler or changing the JVM, but by transforming the +byte code. These transformations can either be performed after +compile-time, or at load-time. Many programmers are doing this by +implementing their own specialized byte code manipulation tools, which +are, however, restricted in the range of their re-usability. + +To deal with the necessary class file transformations, we introduce an +API that helps developers to conveniently implement their +transformations. +\end{abstract} + +\section{Introduction}\label{sec:intro} + +The Java language \cite{gosling} has become very popular and many +research projects deal with further improvements of the language or +its run-time behavior. The possibility to extend a language with new +concepts is surely a desirable feature, but implementation issues +should be hidden from the user. Fortunately, the concepts of the \jvm +permit the user-transparent implementation of such extensions with +relatively little effort. + +Because the target language of Java is an interpreted language with a +small and easy-to-understand set of instructions (the \emph{byte +code}), developers can implement and test their concepts in a very +elegant way. One can write a plug-in replacement for the system's +class loader which is responsible for dynamically loading class files +at run-time and passing the byte code to the \vm (see section +\ref{sec:classloaders}). Class loaders may thus be used to intercept +the loading process and transform classes before they get actually +executed by the JVM \cite{classloader}. While the original class +files always remain unaltered, the behavior of the class loader may be +reconfigured for every execution or instrumented dynamically. + +The \jc API (Byte Code Engineering Library), formerly known as +JavaClass, is a toolkit for the static analysis and dynamic creation +or transformation of Java class files. It enables developers to +implement the desired features on a high level of abstraction without +handling all the internal details of the Java class file format and +thus re-inventing the wheel every time. \jc is written entirely in +Java and freely available under the terms of the Apache Software +License. \footnote{The distribution is available at + \url{http://jakarta.apache.org/bcel/}, including several code + examples and javadoc manuals. } + +This paper is structured as follows: We give a brief description of +the \jvm and the class file format in section \ref{sec:jvm}. Section +\ref{sec:api} introduces the \jc API. Section \ref{sec:application} +describes some typical application areas and example projects. The +appendix contains code examples that are to long to be presented in +the main part of this paper. All examples are included in the +down-loadable distribution. + +\subsection{Related work} + +There are a number of proposals and class libraries that have some +similarities with \textsc{BCEL}: The JOIE \cite{joie} toolkit can +be used to instrument class loaders with dynamic behavior. Similarly, +``Binary Component Adaptation'' \cite{bca} allows components to be +adapted and evolved on-the-fly. Han Lee's ``Byte-code Instrumenting +Tool'' \cite{bit} allows the user to insert calls to analysis methods +anywhere in the byte code. The Jasmin language \cite{jasmin} can be +used to hand-write or generate pseudo-assembler code. D-Java +\cite{classfile} and JCF \cite{inside} are class viewing tools. + +In contrast to these projects, \jc is intended to be a general purpose +tool for ``byte code engineering''. It gives full control to the +developer on a high level of abstraction and is not restricted to any +particular application area. + +\section{The Java Virtual Machine}\label{sec:jvm} + +Readers already familiar with the \jvm and the Java class file format +may want to skip this section and proceed with section \ref{sec:api}. + +Programs written in the Java language are compiled into a portable +binary format called \emph{byte code}. Every class is represented by +a single class file containing class related data and byte code +instructions. These files are loaded dynamically into an interpreter +(\jvme, JVM) and executed. + +Figure \ref{fig:jvm} illustrates the procedure of compiling and +executing a Java class: The source file (\texttt{HelloWorld.java}) is +compiled into a Java class file (\texttt{HelloWorld.class}), loaded by +the byte code interpreter and executed. In order to implement +additional features, researchers may want to transform class files +(drawn with bold lines) before they get actually executed. This +application area is one of the main issues of this article. + +\begin{figure}[htbp] + \begin{center} + \leavevmode + \epsfxsize\textwidth + \epsfbox{eps/jvm.eps} + \caption{Compilation and execution of Java classes} + \label{fig:jvm} + \end{center} +\end{figure} + +Note that the use of the general term ``Java'' implies two meanings: +on the one hand, Java as a programming language is meant, on the other +hand, the Java Virtual Machine, which is not necessarily targeted by +the Java language exclusively, but may be used by other languages as +well (e.g. Eiffel \cite{eiffel}, or Ada \cite{ada}). We assume the +reader to be familiar with the Java language and to have a general +understanding of the Virtual Machine. + +\subsection{Java class file format}\label{sec:format} + +Giving a full overview of the design issues of the Java class file +format and the associated byte code instructions is beyond the scope +of this paper. We will just give a brief introduction covering the +details that are necessary for understanding the rest of this +paper. The format of class files and the byte code instruction set are +described in more detail in the ``\jvm Specification'' \cite{jvm} +\footnote{Also available online at +\url{http://www.javasoft.com/docs/books/vmspec/index.html}}, and in +\cite{jasmin}. Especially, we will not deal with the security +constraints that the \jvm has to check at run-time, i.e. the byte code +verifier. + +Figure \ref{fig:classfile} shows a simplified example of the contents +of a Java class file: It starts with a header containing a ``magic +number'' (\texttt{0xCAFEBABE}) and the version number, followed by the +\emph{\cpe}, which can be roughly thought of as the text segment of an +executable, the \emph{access rights} of the class encoded by a bit +mask, a list of interfaces implemented by the class, lists containing +the fields and methods of the class, and finally the \emph{class +attributes}, e.g. the \texttt{SourceFile} attribute telling the name +of the source file. Attributes are a way of putting additional, +e.g. user-defined, information into class file data structures. For +example, a custom class loader may evaluate such attribute data in +order to perform its transformations. The JVM specification declares +that unknown, i.e. user-defined attributes must be ignored by any \vm +implementation. + +\begin{figure}[htbp] + \begin{center} + \leavevmode + \epsfxsize\textwidth + \epsfbox{eps/classfile.eps} + \caption{Java class file format} + \label{fig:classfile} + \end{center} +\end{figure} + +Because all of the information needed to dynamically resolve the +symbolic references to classes, fields and methods at run-time is +coded with string constants, the \cp contains in fact the largest +portion of an average class file, approximately 60\% \cite{statistic}. +The byte code instructions themselves just make up 12\%. + +The right upper box shows a ``zoomed'' excerpt of the \cpe, while the +rounded box below depicts some instructions that are contained within +a method of the example class. These instructions represent the +straightforward translation of the well-known statement: + +\begin{verbatim} + System.out.println("Hello, world"); +\end{verbatim} + +The first instruction loads the contents of the field \texttt{out} of +class \texttt{java.lang.System} onto the operand stack. This is an +instance of the class \texttt{java.io.PrintStream}. The \texttt{ldc} +(``Load constant'') pushes a reference to the string "Hello world" on +the stack. The next instruction invokes the instance method +\texttt{println} which takes both values as parameters (Instance +methods always implicitly take an instance reference as their first +argument). + +Instructions, other data structures within the class file and +constants themselves may refer to constants in the \cpe. Such +references are implemented via fixed indexes encoded directly into the +instructions. This is illustrated for some items of the figure +emphasized with a surrounding box. + +For example, the \texttt{invokevirtual} instruction refers to a +\texttt{MethodRef} constant that contains information about the name +of the called method, the signature (i.e. the encoded argument and +return types), and to which class the method belongs. In fact, as +emphasized by the boxed value, the \texttt{MethodRef} constant itself +just refers to other entries holding the real data, e.g. it refers to +a \texttt{ConstantClass} entry containing a symbolic reference to the +class \texttt{java.io.PrintStream}. To keep the class file compact, +such constants are typically shared by different instructions. +Similarly, a field is represented by a \texttt{Fieldref} constant that +includes information about the name, the type and the containing class +of the field. + +The \cp basically holds the following types of constants: References +to methods, fields and classes, strings, integers, floats, longs, and +doubles. + +\subsection{Byte code instruction set}\label{sec:code} + +The JVM is a stack-oriented interpreter that creates a local stack +frame of fixed size for every method invocation. The size of the local +stack has to be computed by the compiler. Values may also be stored +intermediately in a frame area containing \emph{local variables} which +can be used like a set of registers. These local variables are +numbered from 0 to 65535, i.e. you have a maximum of 65536 of local +variables. The stack frames of caller and callee method are +overlapping, i.e. the caller pushes arguments onto the operand stack +and the called method receives them in local variables. + +The byte code instruction set currently consists of 212 instructions, +44 opcodes are marked as reserved and may be used for future +extensions or intermediate optimizations within the Virtual +Machine. The instruction set can be roughly grouped as follows: + +\begin{description} +\item[Stack operations:] Constants can be pushed onto the stack either +by loading them from the \cp with the \texttt{ldc} instruction or with +special ``short-cut'' instructions where the operand is encoded into +the instructions, e.g. \texttt{iconst\_0} or \texttt{bipush} (push +byte value). + +\item[Arithmetic operations:] The instruction set of the \jvm +distinguishes its operand types using different instructions to +operate on values of specific type. Arithmetic operations starting +with \texttt{i}, for example, denote an integer operation. E.g., +\texttt{iadd} that adds two integers and pushes the result back on the +stack. The Java types \texttt{boolean}, \texttt{byte}, +\texttt{short}, and \texttt{char} are handled as integers by the JVM. + +\item[Control flow:] There are branch instructions like \texttt{goto} +and \texttt{if\_icmpeq}, which compares two integers for +equality. There is also a \texttt{jsr} (jump sub-routine) and +\texttt{ret} pair of instructions that is used to implement the +\texttt{finally} clause of \texttt{try-catch} blocks. Exceptions may +be thrown with the \texttt{athrow} instruction. + +Branch targets are coded as offsets from the current byte code +position, i.e. with an integer number. + +\item[Load and store operations] for local variables like +\texttt{iload} and \texttt{istore}. There are also array operations +like \texttt{iastore} which stores an integer value into an array. + +\item[Field access:] The value of an instance field may be retrieved +with \texttt{getfield} and written with \texttt{putfield}. For static +fields, there are \texttt{getstatic} and \texttt{putstatic} +counterparts. + +\item[Method invocation:] Methods may either be called via static +references with \texttt{invokesta\-tic} or be bound virtually with the +\texttt{invokevirtual} instruction. Super class methods and private +methods are invoked with \texttt{invokespecial}. + +\item[Object allocation:] Class instances are allocated with the +\texttt{new} instruction, arrays of basic type like \texttt{int[]} +with \texttt{newarray}, arrays of references like \texttt{String[][]} +with \texttt{anewarray} or \texttt{multianewarray}. + +\item[Conversion and type checking:] For stack operands of basic type +there exist casting operations like \texttt{f2i} which converts a +float value into an integer. The validity of a type cast may be +checked with \texttt{checkcast} and the \texttt{instanceof} operator +can be directly mapped to the equally named instruction. +\end{description} + +Most instructions have a fixed length, but there are also some +variable-length instructions: In particular, the \texttt{lookupswitch} +and \texttt{tableswitch} instructions, which are used to implement +\texttt{switch()} statements. Since the number of \texttt{case} +clauses may vary, these instructions contain a variable number of +statements. + +We will not list all byte code instructions here, since these are +explained in detail in the JVM specification. The opcode names are +mostly self-explaining, so understanding the following code examples +should be fairly intuitive. + +\subsection{Method code}\label{sec:code2} + +Non-abstract methods contain an attribute (\texttt{Code}) that holds +the following data: The maximum size of the method's stack frame, the +number of local variables and an array of byte code +instructions. Optionally, it may also contain information about the +names of local variables and source file line numbers that can be used +by a debugger. + +Whenever an exception is thrown, the JVM performs exception handling +by looking into a table of exception handlers. The table marks +handlers, i.e. pieces of code, to be responsible for exceptions of +certain types that are raised within a given area of the byte +code. When there is no appropriate handler the exception is propagated +back to the caller of the method. The handler information is itself +stored in an attribute contained within the \texttt{Code} attribute. + +\subsection{Byte code offsets}\label{sec:offsets} + +Targets of branch instructions like \texttt{goto} are encoded as +relative offsets in the array of byte codes. Exception handlers and +local variables refer to absolute addresses within the byte code. The +former contains references to the start and the end of the +\texttt{try} block, and to the instruction handler code. The latter +marks the range in which a local variable is valid, i.e. its scope. +This makes it difficult to insert or delete code areas on this level +of abstraction, since one has to recompute the offsets every time and +update the referring objects. We will see in section \ref{sec:cgapi} +how \jc remedies this restriction. + +\subsection{Type information}\label{sec:types} + +Java is a type-safe language and the information about the types of +fields, local variables, and methods is stored in +\emph{signatures}. These are strings stored in the \cp and encoded in +a special format. For example the argument and return types of the +\texttt{main} method + +\begin{verbatim} + public static void main(String[] argv) +\end{verbatim} + +are represented by the signature + +\begin{verbatim} + ([java/lang/String;)V +\end{verbatim} + +Classes and arrays are internally represented by strings like +\texttt{"java/lang/String"}, basic types like \texttt{float} by an +integer number. Within signatures they are represented by single +characters, e.g., \texttt{"I"}, for integer. + +\subsection{Code example}\label{sec:fac} + +The following example program prompts for a number and prints the +faculty of it. The \texttt{readLine()} method reading from the +standard input may raise an \texttt{IOException} and if a misspelled +number is passed to \texttt{parseInt()} it throws a +\texttt{NumberFormatException}. Thus, the critical area of code must be +encapsulated in a \texttt{try-catch} block. + +{\small \begin{verbatim} +import java.io.*; +public class Faculty { + private static BufferedReader in = new BufferedReader(new + InputStreamReader(System.in)); + public static final int fac(int n) { + return (n == 0)? 1 : n * fac(n - 1); + } + public static final int readInt() { + int n = 4711; + try { + System.out.print("Please enter a number> "); + n = Integer.parseInt(in.readLine()); + } catch(IOException e1) { System.err.println(e1); } + catch(NumberFormatException e2) { System.err.println(e2); } + return n; + } + public static void main(String[] argv) { + int n = readInt(); + System.out.println("Faculty of " + n + " is " + fac(n)); + }} +\end{verbatim}} + +This code example typically compiles to the following chunks of byte +code: + +\subsubsection{Method fac} + +{\small \begin{verbatim} +0: iload_0 +1: ifne #8 +4: iconst_1 +5: goto #16 +8: iload_0 +9: iload_0 +10: iconst_1 +11: isub +12: invokestatic Faculty.fac (I)I (12) +15: imul +16: ireturn + +LocalVariable(start_pc = 0, length = 16, index = 0:int n) +\end{verbatim}} + +The method \texttt{fac} has only one local variable, the argument +\texttt{n}, stored in slot 0. This variable's scope ranges from the +start of the byte code sequence to the very end. If the value of +\texttt{n} (stored in local variable 0, i.e. the value fetched with +\texttt{iload\_0}) is not equal to 0, the \texttt{ifne} instruction +branches to the byte code at offset 8, otherwise a 1 is pushed onto +the operand stack and the control flow branches to the final return. +For ease of reading, the offsets of the branch instructions, which are +actually relative, are displayed as absolute addresses in these +examples. + +If recursion has to continue, the arguments for the multiplication +(\texttt{n} and \texttt{fac(n - 1)}) are evaluated and the results +pushed onto the operand stack. After the multiplication operation has +been performed the function returns the computed value from the top of +the stack. + +\subsubsection{Method readInt} + +{\small \begin{verbatim} +0: sipush 4711 +3: istore_0 +4: getstatic java.lang.System.out Ljava/io/PrintStream; +7: ldc "Please enter a number> " +9: invokevirtual java.io.PrintStream.print (Ljava/lang/String;)V +12: getstatic Faculty.in Ljava/io/BufferedReader; +15: invokevirtual java.io.BufferedReader.readLine ()Ljava/lang/String; +18: invokestatic java.lang.Integer.parseInt (Ljava/lang/String;)I +21: istore_0 +22: goto #44 +25: astore_1 +26: getstatic java.lang.System.err Ljava/io/PrintStream; +29: aload_1 +30: invokevirtual java.io.PrintStream.println (Ljava/lang/Object;)V +33: goto #44 +36: astore_1 +37: getstatic java.lang.System.err Ljava/io/PrintStream; +40: aload_1 +41: invokevirtual java.io.PrintStream.println (Ljava/lang/Object;)V +44: iload_0 +45: ireturn + +Exception handler(s) = +From To Handler Type +4 22 25 java.io.IOException(6) +4 22 36 NumberFormatException(10) +\end{verbatim}} + +First the local variable \texttt{n} (in slot 0) is initialized to the +value 4711. The next instruction, \texttt{getstatic}, loads the +static \texttt{System.out} field onto the stack. Then a string is +loaded and printed, a number read from the standard input and +assigned to \texttt{n}. + +If one of the called methods (\texttt{readLine()} and +\texttt{parseInt()}) throws an exception, the \jvm calls one of the +declared exception handlers, depending on the type of the exception. +The \texttt{try}-clause itself does not produce any code, it merely +defines the range in which the following handlers are active. In the +example the specified source code area maps to a byte code area +ranging from offset 4 (inclusive) to 22 (exclusive). If no exception +has occurred (``normal'' execution flow) the \texttt{goto} +instructions branch behind the handler code. There the value of +\texttt{n} is loaded and returned. + +For example the handler for \texttt{java.io.IOException} starts at +offset 25. It simply prints the error and branches back to the normal +execution flow, i.e. as if no exception had occurred. + +\section{The BCEL API}\label{sec:api} + +The \jc API abstracts from the concrete circumstances of the \jvm and +how to read and write binary Java class files. The API mainly +consists of three parts: + +\begin{enumerate} + +\item A package that contains classes that describe ``static'' + constraints of class files, i.e., reflect the class file format and + is not intended for byte code modifications. The classes may be + used to read and write class files from or to a file. This is + useful especially for analyzing Java classes without having the + source files at hand. The main data structure is called + \texttt{JavaClass} which contains methods, fields, etc.. + +\item A package to dynamically generate or modify \texttt{JavaClass} +objects. It may be used e.g. to insert analysis code, to strip +unnecessary information from class files, or to implement the code +generator back-end of a Java compiler. + +\item Various code examples and utilities like a class file viewer, a +tool to convert class files into HTML, and a converter from class +files to the Jasmin assembly language \cite{jasmin}. +\end{enumerate} + +\subsection{JavaClass}\label{sec:javaclass} + +The ``static'' component of the \jc API resides in the package +\path{de.fub.bytecode.classfile} and represents class files. All of the +binary components and data structures declared in the JVM +specification \cite{jvm} and described in section \ref{sec:jvm} are +mapped to classes. Figure \ref{fig:umljc} shows an UML diagram of the +hierarchy of classes of the \jc API. Figure \ref{fig:umlcp} in the +appendix also shows a detailed diagram of the \texttt{ConstantPool} +components. + +\begin{figure}[htbp] + \begin{center} + \leavevmode + \epsfysize0.93\textheight + \epsfbox{eps/javaclass.eps} + \caption{UML diagram for the \jc API}\label{fig:umljc} + \end{center} +\end{figure} + +The top-level data structure is \texttt{JavaClass}, which in most +cases is created by a \texttt{Class\-Par\-ser} object that is capable +of parsing binary class files. A \texttt{JavaClass} object basically +consists of fields, methods, symbolic references to the super class +and to the implemented interfaces. + +The \cp serves as some kind of central repository and is thus of +outstanding importance for all components. \texttt{ConstantPool} +objects contain an array of fixed size of \texttt{Constant} entries, +which may be retrieved via the \texttt{getConstant()} method taking an +integer index as argument. Indexes to the \cp may be contained in +instructions as well as in other components of a class file and in \cp +entries themselves. + +Methods and fields contain a signature, symbolically defining their +types. Access flags like \texttt{public static final} occur in +several places and are encoded by an integer bit mask, e.g. +\texttt{public static final} matches to the Java expression + +\begin{verbatim} + int access_flags = ACC_PUBLIC | ACC_STATIC | ACC_FINAL; +\end{verbatim} + +As mentioned in section \ref{sec:format} already, several components +may contain \emph{attribute} objects: classes, fields, methods, and +\texttt{Code} objects (introduced in section \ref{sec:code2}). The +latter is an attribute itself that contains the actual byte code +array, the maximum stack size, the number of local variables, a table +of handled exceptions, and some optional debugging information coded +as \texttt{LineNumberTable} and \texttt{LocalVariableTable} +attributes. Attributes are in general specific to some data structure, +i.e. no two components share the same kind of attribute, though this +is not explicitly forbidden. In the figure the \texttt{Attribute} +classes are marked with the component they belong to. + +\subsection{Class repository} + +Using the provided \texttt{Repository} class, reading class files into +a \texttt{JavaClass} object is quite simple: + +\begin{verbatim} + JavaClass clazz = Repository.lookupClass("java.lang.String"); +\end{verbatim} + +The repository also contains methods providing the dynamic equivalent +of the \texttt{instanceof} operator, and other useful routines: + +\begin{verbatim} + if(Repository.instanceOf(clazz, super_class) { + ... + } +\end{verbatim} + +\subsubsection{Accessing class file data} + +Information within the class file components may be accessed like Java +Beans via intuitive set/get methods. All of them also define a +\texttt{toString()} method so that implementing a simple class viewer +is very easy. In fact all of the examples used here have been produced +this way: + +{\small \begin{verbatim} + System.out.println(clazz); + printCode(clazz.getMethods()); + ... + public static void printCode(Method[] methods) { + for(int i=0; i < methods.length; i++) { + System.out.println(methods[i]); + + Code code = methods[i].getCode(); + if(code != null) // Non-abstract method + System.out.println(code); + } + } +\end{verbatim}} + +\subsubsection{Analyzing class data} + +Last but not least, \jc supports the \emph{Visitor} design +pattern \cite{design}, so one can write visitor objects to traverse +and analyze the contents of a class file. Included in the distribution +is a class \texttt{JasminVisitor} that converts class files into the +Jasmin assembler language \cite{jasmin}. + +\subsection{ClassGen}\label{sec:cgapi} + +This part of the API (package \path{ork.apache.bcel.generic}) supplies +an abstraction level for creating or transforming class files +dynamically. It makes the static constraints of Java class files like +the hard-coded byte code addresses generic. The generic \cpe, for +example, is implemented by the class \texttt{ConstantPoolGen} which +offers methods for adding different types of constants. Accordingly, +\texttt{ClassGen} offers an interface to add methods, fields, and +attributes. Figure \ref{fig:umlcg} gives an overview of this part of +the API. + +\begin{figure}[htbp] + \begin{center} + \leavevmode + \epsfysize0.93\textheight + \epsfbox{eps/classgen.eps} + \caption{UML diagram of the ClassGen API}\label{fig:umlcg} + \end{center} +\end{figure} + +\subsubsection{Types} + +We abstract from the concrete details of the type signature syntax +(see \ref{sec:types}) by introducing the \texttt{Type} class, which is +used, for example, by methods to define their return and argument +types. Concrete sub-classes are \texttt{BasicType}, +\texttt{ObjectType}, and \texttt{ArrayType} which consists of the +element type and the number of dimensions. For commonly used types the +class offers some predefined constants. For example the method +signature of the \texttt{main} method as shown in section +\ref{sec:types} is represented by: + +\begin{verbatim} + Type return_type = Type.VOID; + Type[] arg_types = new Type[] { new ArrayType(Type.STRING, 1) }; +\end{verbatim} + +\texttt{Type} also contains methods to convert types into textual +signatures and vice versa. The sub-classes contain implementations of +the routines and constraints specified by the Java Language +Specification \cite{gosling}. + +\subsubsection{Generic fields and methods} + +Fields are represented by \texttt{FieldGen} objects, which may be +freely modified by the user. If they have the access rights +\texttt{static final}, i.e. are constants and of basic type, they may +optionally have an initializing value. + +Generic methods contain methods to add exceptions the method may +throw, local variables, and exception handlers. The latter two are +represented by user-configurable objects as well. Because exception +handlers and local variables contain references to byte code +addresses, they also take the role of an \emph{instruction targeter} +in our terminology. Instruction targeters contain a method +\texttt{updateTarget()} to redirect a reference. Generic +(non-abstract) methods refer to \emph{instruction lists} that consist +of instruction objects. References to byte code addresses are +implemented by handles to instruction objects. This is explained in +more detail in the following sections. + +The maximum stack size needed by the method and the maximum number of +local variables used may be set manually or computed via the +\texttt{setMaxStack()} and \texttt{setMaxLocals()} methods +automatically. + +\subsubsection{Instructions} + +Modeling instructions as objects may look somewhat odd at first sight, +but in fact enables programmers to obtain a high-level view upon +control flow without handling details like concrete byte code offsets. +Instructions consist of a tag, i.e. an opcode, their length in bytes +and an offset (or index) within the byte code. Since many instructions +are immutable, the \texttt{InstructionConstants} interface offers +shareable predefined ``fly-weight'' constants to use. + +Instructions are grouped via sub-classing, the type hierarchy of +instruction classes is illustrated by (incomplete) figure +\ref{fig:umlinstr} in the appendix. The most important family of +instructions are the \emph{branch instructions}, e.g. \texttt{goto}, +that branch to targets somewhere within the byte code. Obviously, +this makes them candidates for playing an \texttt{InstructionTargeter} +role, too. Instructions are further grouped by the interfaces they +implement, there are, e.g., \texttt{TypedInstruction}s that are +associated with a specific type like \texttt{ldc}, or +\texttt{ExceptionThrower} instructions that may raise exceptions when +executed. + +All instructions can be traversed via \texttt{accept(Visitor v)} methods, +i.e., the Visitor design pattern. There is however some special trick +in these methods that allows to merge the handling of certain +instruction groups. The \texttt{accept()} do not only call the +corresponding \texttt{visit()} method, but call \texttt{visit()} +methods of their respective super classes and implemented interfaces +first, i.e. the most specific \texttt{visit()} call is last. Thus one +can group the handling of, say, all \texttt{BranchInstruction}s into +one single method. + +For debugging purposes it may even make sense to ``invent'' your own +instructions. In a sophisticated code generator like the one used as a +backend of the Barat framework \cite{barat} one often has to insert +temporary \texttt{nop} (No operation) instructions. When examining +the produced code it may be very difficult to track back where the +\texttt{nop} was actually inserted. One could think of a derived +\texttt{nop2} instruction that contains additional debugging +information. When the instruction list is dumped to byte code, the +extra data is simply dropped. + +One could also think of new byte code instructions operating on +complex numbers that are replaced by normal byte code upon load-time +or are recognized by a new JVM. + +\subsubsection{Instruction lists}\label{sec:il} + +An \emph{instruction list} is implemented by a list of +\emph{instruction handles} encapsulating instruction objects. +References to instructions in the list are thus not implemented by +direct pointers to instructions but by pointers to instruction +\emph{handles}. This makes appending, inserting and deleting areas of +code very simple. Since we use symbolic references, computation of +concrete byte code offsets does not need to occur until finalization, +i.e. until the user has finished the process of generating or +transforming code. We will use the term instruction handle and +instruction synonymously throughout the rest of the paper. +Instruction handles may contain additional user-defined data using the +\texttt{addAttribute()} method. + +\paragraph{Appending.} +One can append instructions or other instruction lists anywhere to an +existing list. The instructions are appended after the given +instruction handle. All append methods return a new instruction +handle which may then be used as the target of a branch instruction, +e.g.. + +{\small \begin{verbatim} + InstructionList il = new InstructionList(); + ... + GOTO g = new GOTO(null); + il.append(g); + ... + InstructionHandle ih = il.append(InstructionConstants.ACONST_NULL); + g.setTarget(ih); +\end{verbatim}} + +\paragraph{Inserting.} +Instructions may be inserted anywhere into an existing list. They are +inserted before the given instruction handle. All insert methods +return a new instruction handle which may then be used as the start +address of an exception handler, for example. + +{\small \begin{verbatim} + InstructionHandle start = il.insert(insertion_point, + InstructionConstants.NOP); + ... + mg.addExceptionHandler(start, end, handler, "java.io.IOException"); +\end{verbatim}} + + +\paragraph{Deleting.} +Deletion of instructions is also very straightforward; all instruction +handles and the contained instructions within a given range are +removed from the instruction list and disposed. The \texttt{delete()} +method may however throw a \texttt{TargetLostException} when there are +instruction targeters still referencing one of the deleted +instructions. The user is forced to handle such exceptions in a +\texttt{try-catch} block and redirect these references elsewhere. The +\emph{peep hole} optimizer described in section \ref{sec:nop} gives a +detailed example for this. + +{\small \begin{verbatim} + try { + il.delete(first, last); + } catch(TargetLostException e) { + InstructionHandle[] targets = e.getTargets(); + for(int i=0; i < targets.length; i++) { + InstructionTargeter[] targeters = targets[i].getTargeters(); + for(int j=0; j < targeters.length; j++) + targeters[j].updateTarget(targets[i], new_target); + } + } +\end{verbatim}} + +\paragraph{Finalizing.} +When the instruction list is ready to be dumped to pure byte code, all +symbolic references must be mapped to real byte code offsets. This is +done by the \texttt{getByteCode()} method which is called by default +by \texttt{MethodGen.getMethod()}. Afterwards you should call +\texttt{dispose()} so that the instruction handles can be reused +internally. This helps to reduce memory usage. + +\begin{verbatim} + InstructionList il = new InstructionList(); + + ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", + "", ACC_PUBLIC | ACC_SUPER, + null); + MethodGen mg = new MethodGen(ACC_STATIC | ACC_PUBLIC, + Type.VOID, new Type[] { + new ArrayType(Type.STRING, 1) + }, new String[] { "argv" }, + "main", "HelloWorld", il, cp); + ... + cg.addMethod(mg.getMethod()); + il.dispose(); // Reuse instruction handles of list +\end{verbatim} + +\subsubsection{Code example revisited} + +Using instruction lists gives us a generic view upon the code: In +Figure \ref{fig:il} we again present the code chunk of the +\texttt{readInt()} method of the faculty example in section +\ref{sec:fac}: The local variables \texttt{n} and \texttt{e1} both +hold two references to instructions, defining their scope. There are +two \texttt{goto}s branching to the \texttt{iload} at the end of the +method. One of the exception handlers is displayed, too: it references +the start and the end of the \texttt{try} block and also the exception +handler code. + +\begin{figure}[htbp] + \begin{center} + \leavevmode + \epsfxsize\textwidth + \epsfbox{eps/il.eps} + \caption{Instruction list for \texttt{readInt()} method} + \label{fig:il} + \end{center} +\end{figure} + +\subsubsection{Instruction factories}\label{sec:compound} + +To simplify the creation of certain instructions the user can use the +supplied \texttt{InstructionFactory} class which offers a lot of +useful methods to create instructions from scratch. Alternatively, he +can also use \emph{compound instructions}: When producing byte code, +some patterns typically occur very frequently, for instance the +compilation of arithmetic or comparison expressions. You certainly do +not want to rewrite the code that translates such expressions into +byte code in every place they may appear. In order to support this, +the \jc API includes a \emph{compound instruction} (an interface with +a single \texttt{getInstructionList()} method). Instances of this +class may be used in any place where normal instructions would occur, +particularly in append operations. + +\paragraph{Example: Pushing constants.} +Pushing constants onto the operand stack may be coded in different +ways. As explained in section \ref{sec:code} there are some +``short-cut'' instructions that can be used to make the produced byte +code more compact. The smallest instruction to push a single +\texttt{1} onto the stack is \texttt{iconst\_1}, other possibilities +are \texttt{bipush} (can be used to push values between -128 and 127), +\texttt{sipush} (between -32768 and 32767), or \texttt{ldc} (load +constant from \cpe). + +Instead of repeatedly selecting the most compact instruction in, say, +a switch, one can use the compound \texttt{PUSH} instruction whenever +pushing a constant number or string. It will produce the appropriate +byte code instruction and insert entries into to \cp if necessary. + +\begin{verbatim} + il.append(new PUSH(cp, "Hello, world")); + il.append(new PUSH(cp, 4711)); +\end{verbatim} + +\subsubsection{Code patterns using regular expressions}\label{sec:peephole} + +When transforming code, for instance during optimization or when +inserting analysis method calls, one typically searches for certain +patterns of code to perform the transformation at. To simplify +handling such situations \jc introduces a special feature: One can +search for given code patterns within an instruction list using +\emph{regular expressions}. In such expressions, instructions are +represented by symbolic names, e.g. "\texttt{`IfInstruction'}". Meta +characters like \verb|+|, \verb|*|, and \verb@(..|..)@ have their +usual meanings. Thus, the expression + +\begin{verbatim} + "`NOP'+(`ILOAD__'|`ALOAD__')*" +\end{verbatim} + +represents a piece of code consisting of at least one \texttt{NOP} +followed by a possibly empty sequence of \texttt{ILOAD} and +\texttt{ALOAD} instructions. + +The \texttt{search()} method of class \texttt{FindPattern} gets an +instruction list and a regular expression as arguments and returns an +array describing the area of matched instructions. Additional +constraints to the matching area of instructions, which can not be +implemented via regular expressions, may be expressed via \emph{code +constraints}. + +\subsubsection{Example: Optimizing boolean expressions.} + +In Java, boolean values are mapped to 1 and to 0, respectively. Thus, +the simplest way to evaluate boolean expressions is to push a 1 or a 0 +onto the operand stack depending on the truth value of the expression. +But this way, the subsequent combination of boolean expressions (with +\verb|&&|, e.g) yields long chunks of code that push lots of 1s and +0s onto the stack. + +When the code has been finalized these chunks can be optimized with a +\emph{peep hole} algorithm: An \texttt{IfInstruction} (e.g. the +comparison of two integers: \texttt{if\_icmpeq}) that either produces +a 1 or a 0 on the stack and is followed by an \texttt{ifne} +instruction (branch if stack value $\neq$ 0) may be replaced by the +\texttt{IfInstruction} with its branch target replaced by the target +of the \texttt{ifne} instruction: + +{\small \verbatimtabinput{bool.java}} + +The applied code constraint object ensures that the matched code +really corresponds to the targeted expression pattern. Subsequent +application of this algorithm removes all unnecessary stack operations +and branch instructions from the byte code. If any of the deleted +instructions is still referenced by an \texttt{InstructionTargeter} +object, the reference has to be updated in the \texttt{catch}-clause. + +Code example \ref{sec:hello} gives a verbose example of how to create +a class file, while example \ref{sec:nop} shows how to implement a +simple peephole optimizer and how to deal with \texttt{TargetLost} +exceptions. + +\paragraph{Example application:} +The expression + +\begin{verbatim} + if((a == null) || (i < 2)) + System.out.println("Ooops"); +\end{verbatim} + +can be mapped to both of the chunks of byte code shown in figure +\ref{fig:code}. The left column represents the unoptimized code while +the right column displays the same code after an aggressively +optimizing peep hole algorithm has been applied: + +\begin{figure}[hpt] +\begin{minipage}{0.49\textwidth} + {\small \verbatimtabinput{unopt}} \vfil +\end{minipage} +\begin{minipage}{0.49\textwidth} + {\small \verbatimtabinput{opt}} \vfil +\end{minipage}\label{fig:code}\caption{Optimizing boolean expressions} +\begin{center} + + +\end{center} +\end{figure} +\section{Application areas}\label{sec:application} + +There are many possible application areas for \jc ranging from class +browsers, profilers, byte code optimizers, and compilers to +sophisticated run-time analysis tools and extensions to the Java +language \cite{agesen, myers}. + +Compilers like the Barat compiler \cite{barat} use \jc to implement a +byte code generating back end. Other possible application areas are +the static analysis of byte code \cite{thies} or examining the +run-time behavior of classes by inserting calls to profiling methods +into the code. Further examples are extending Java with Eiffel-like +assertions \cite{jawa}, automated delegation \cite{classfilters}, or +with the concepts of ``Aspect-Oriented Programming'' \cite{aspect}. + +\subsection{Class loaders}\label{sec:classloaders} + +Class loaders are responsible for loading class files from the file +system or other resources and passing the byte code to the \vm +\cite{classloader}. A custom \texttt{ClassLoader} object may be used +to intercept the standard procedure of loading a class, i.e. the +system class loader, and perform some transformations before actually +passing the byte code to the JVM. + +A possible scenario is described in figure \ref{fig:classloader}: +During run-time the \vm requests a custom class loader to load a given +class. But before the JVM actually sees the byte code, the class +loader makes a ``side-step'' and performs some transformation to the +class. To make sure that the modified byte code is still valid and +does not violate any of the JVM's rules it is checked by the verifier +before the JVM finally executes it. + +\begin{figure}[ht] + \begin{center} + \leavevmode + \epsfxsize\textwidth + \epsfbox{eps/classloader.eps} + \caption{Class loaders}\label{fig:classloader} + \end{center} +\end{figure} + +Using class loaders is an elegant way of extending the \jvm with new +features without actually modifying it. This concept enables +developers to use \emph{load-time reflection} to implement their ideas +as opposed to the static reflection supported by the Java Reflection +API \cite{reflection}. Load-time transformations supply the user with +a new level of abstraction. He is not strictly tied to the static +constraints of the original authors of the classes but may customize +the applications with third-party code in order to benefit from new +features. Such transformations may be executed on demand and neither +interfere with other users, nor alter the original byte code. In fact, +class loaders may even create classes \emph{ad hoc} without loading a +file at all. + +\subsubsection{Example: Poor Man's Genericity} + +The ``Poor Man's Genericity'' project \cite{pmg} that extends Java +with parameterized classes, for example, uses \jc in two places to +generate instances of parameterized classes: During compile-time (the +standard \texttt{javac} with some slightly changed classes) and at +run-time using a custom class loader. The compiler puts some +additional type information into class files which is evaluated at +load-time by the class loader. The class loader performs some +transformations on the loaded class and passes them to the VM. The +following algorithm illustrates how the load method of the class +loader fulfills the request for a parameterized class, +e.g. \verb|Stack| + +\begin{enumerate} +\item Search for class \texttt{Stack}, load it, and check for a +certain class attribute containing additional type information. I.e. +the attribute defines the ``real'' name of the class, +i.e. \verb|Stack|. + +\item Replace all occurrences and references to the formal type +\texttt{A} with references to the actual type \texttt{String}. For +example the method + +\begin{verbatim} + void push(A obj) { ... } +\end{verbatim} + +becomes + +\begin{verbatim} + void push(String obj) { ... } +\end{verbatim} + +\item Return the resulting class to the Virtual Machine. +\end{enumerate} + +\bibliographystyle{alpha}\bibliography{manual} + +\newpage\appendix + +\pagestyle{empty} +\include{appendix} +\include{diagrams} + +\end{document} +% LocalWords: Freie Universit Institut Informatik dahm inf fu berlin de JOIE +% LocalWords: JCF HelloWorld Jasmin Eiffel SourceFile classfile lang io ldc ar +% LocalWords: PrintStream invokevirtual MethodRef ConstantClass Fieldref dup +% LocalWords: iconst bipush iadd cmpeq jsr athrow iload istore iastore er ic +% LocalWords: getfield putfield getstatic putstatic invokestatic newarray nop +% LocalWords: anewarray checkcast instanceof lookupswitch tableswitch Barat VM +% LocalWords: ConstantPool getConstant LineNumberTable LocalvariableTable ifne +% LocalWords: invokesta invokespecial multianewarray ConstantPoolGen MethodGen +% LocalWords: BasicType ObjectType ArrayType InstructionTarge getByteCode bool +% LocalWords: BranchInstruction InstructionTargeter InstructionHandle regex +% LocalWords: TargetLostException codeconstraint CompoundInstruction sipush +% LocalWords: getInstructionList FindPattern CodeConstraint IfInstruction fac +% LocalWords: TargetLost javac readLine IOException parseInt readInt CLASSPATH +% LocalWords: NumberFormatException toString JasminVisitor getSignature JVM's +% LocalWords: FieldGen updateTarget LGPL BCEL LocalVariableTable setMaxStack +% LocalWords: setMaxLocals InstructionConstants TypedInstruction addAttribute +% LocalWords: ExceptionThrower getMethod InstructionFactory ALOAD + diff --git a/docs/opt b/docs/opt new file mode 100644 index 00000000..fd57764f --- /dev/null +++ b/docs/opt @@ -0,0 +1,24 @@ +10: aload_0 +11: ifnull #19 +14: iload_1 +15: iconst_2 +16: if_icmpge #27 +19: getstatic System.out +22: ldc "Ooops" +24: invokevirtual println +27: return + + + + + + + + + + + + + + + diff --git a/docs/unopt b/docs/unopt new file mode 100644 index 00000000..c458bf40 --- /dev/null +++ b/docs/unopt @@ -0,0 +1,24 @@ +5: aload_0 +6: ifnull #13 +9: iconst_0 +10: goto #14 +13: iconst_1 +14: nop +15: ifne #36 +18: iload_1 +19: iconst_2 +20: if_icmplt #27 +23: iconst_0 +24: goto #28 +27: iconst_1 +28: nop +29: ifne #36 +32: iconst_0 +33: goto #37 +36: iconst_1 +37: nop +38: ifeq #52 +41: getstatic System.out +44: ldc "Ooops" +46: invokevirtual println +52: return diff --git a/examples/HelloWorldBuilder.java b/examples/HelloWorldBuilder.java new file mode 100644 index 00000000..c45a52be --- /dev/null +++ b/examples/HelloWorldBuilder.java @@ -0,0 +1,157 @@ +import org.apache.bcel.generic.*; +import org.apache.bcel.Constants; + +/** + * Create HelloWorld class: + *
+ * import java.io.*;
+ *
+ * public class HelloWorld {
+ *   public static void main(String[] argv) {
+ *     BufferedReader in   = new BufferedReader(new InputStreamReader(System.in));
+ *     String name = null;
+ * 
+ *     try {
+ *       System.out.print("Please enter your name> ");
+ *       name = in.readLine();
+ *     } catch(IOException e) { return; }
+ * 
+ *     System.out.println("Hello, " + name);
+ *   }
+ * }
+ * 
+ * + * @version $Id$ + * @author
M. Dahm + */ +public class HelloWorldBuilder { + public static void main(String[] argv) { + ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", + "", Constants.ACC_PUBLIC | + Constants.ACC_SUPER, + null); + ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool + InstructionList il = new InstructionList(); + MethodGen mg = new MethodGen(Constants.ACC_STATIC | + Constants.ACC_PUBLIC,// access flags + Type.VOID, // return type + new Type[] { // argument types + new ArrayType(Type.STRING, 1) + }, + new String[] { "argv" }, // arg names + "main", "HelloWorld", // method, class + il, cp); + InstructionFactory factory = new InstructionFactory(cg); + + ObjectType i_stream = new ObjectType("java.io.InputStream"); + ObjectType p_stream = new ObjectType("java.io.PrintStream"); + + /* Create BufferedReader object and store it in local variable `in'. + */ + il.append(factory.createNew("java.io.BufferedReader")); + il.append(InstructionConstants.DUP); // Use predefined constant, i.e. flyweight + il.append(factory.createNew("java.io.InputStreamReader")); + il.append(InstructionConstants.DUP); + il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, + Constants.GETSTATIC)); + + /* Call constructors, i.e. BufferedReader(InputStreamReader()) + */ + il.append(factory.createInvoke("java.io.InputStreamReader", "", + Type.VOID, new Type[] { i_stream }, + Constants.INVOKESPECIAL)); + il.append(factory.createInvoke("java.io.BufferedReader", "", Type.VOID, + new Type[] { new ObjectType("java.io.Reader") }, + Constants.INVOKESPECIAL)); + + /* Create local variable `in' + */ + LocalVariableGen lg = mg.addLocalVariable("in", + new ObjectType("java.io.BufferedReader"), + null, null); + int in = lg.getIndex(); + lg.setStart(il.append(new ASTORE(in))); // `i' valid from here + + /* Create local variable `name' + */ + lg = mg.addLocalVariable("name", Type.STRING, null, null); + int name = lg.getIndex(); + il.append(InstructionConstants.ACONST_NULL); + lg.setStart(il.append(new ASTORE(name))); // `name' valid from here + + /* try { ... + */ + InstructionHandle try_start = + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, + Constants.GETSTATIC)); + + il.append(new PUSH(cp, "Please enter your name> ")); + il.append(factory.createInvoke("java.io.PrintStream", "print", Type.VOID, + new Type[] { Type.STRING }, Constants.INVOKEVIRTUAL)); + il.append(new ALOAD(in)); + il.append(factory.createInvoke("java.io.BufferedReader", "readLine", + Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); + il.append(new ASTORE(name)); + + /* Upon normal execution we jump behind exception handler, + * the target address is not known yet. + */ + GOTO g = new GOTO(null); + InstructionHandle try_end = il.append(g); + + /* } catch() { ... } + * Add exception handler: simply return from method + */ + InstructionHandle handler = il.append(InstructionConstants.RETURN); + mg.addExceptionHandler(try_start, try_end, handler, + new ObjectType("java.io.IOException")); + + /* Normal code continues, now we can set the branch target of the GOTO + * that jumps over the handler code. + */ + InstructionHandle ih = + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, + Constants.GETSTATIC)); + g.setTarget(ih); + + /* String concatenation compiles to StringBuffer operations. + */ + il.append(factory.createNew(Type.STRINGBUFFER)); + il.append(InstructionConstants.DUP); + il.append(new PUSH(cp, "Hello, ")); + il.append(factory.createInvoke("java.lang.StringBuffer", "", + Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKESPECIAL)); + il.append(new ALOAD(name)); + + /* Concatenate strings using a StringBuffer and print them. + */ + il.append(factory.createInvoke("java.lang.StringBuffer", "append", + Type.STRINGBUFFER, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(factory.createInvoke("java.lang.StringBuffer", "toString", + Type.STRING, Type.NO_ARGS, + Constants.INVOKEVIRTUAL)); + + il.append(factory.createInvoke("java.io.PrintStream", "println", + Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + + il.append(InstructionConstants.RETURN); + + mg.setMaxStack(5); // Needed stack size + cg.addMethod(mg.getMethod()); + + il.dispose(); // Reuse instruction handles + + /* Add public method, i.e. empty constructor + */ + cg.addEmptyConstructor(Constants.ACC_PUBLIC); + + /* Get JavaClass object and dump it to file. + */ + try { + cg.getJavaClass().dump("HelloWorld.class"); + } catch(java.io.IOException e) { System.err.println(e); } + } +} diff --git a/examples/JasminVisitor.java b/examples/JasminVisitor.java new file mode 100644 index 00000000..f0f8fa9d --- /dev/null +++ b/examples/JasminVisitor.java @@ -0,0 +1,281 @@ +import org.apache.bcel.classfile.Visitor; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import java.io.*; +import java.util.*; +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; + +/** + * Disassemble Java class object into the + * JASMIN format. + * + * @version $Id$ + * @author M. Dahm + */ +public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { + private JavaClass clazz; + private PrintWriter out; + private String class_name; + private ConstantPoolGen cp; + + public JasminVisitor(JavaClass clazz, OutputStream out) { + this.clazz = clazz; + this.out = new PrintWriter(out); + class_name = clazz.getClassName(); + cp = new ConstantPoolGen(clazz.getConstantPool()); + } + + /** + * Start traversal using DefaultVisitor pattern. + */ + public void disassemble() { + new org.apache.bcel.classfile.DescendingVisitor(clazz, this).visit(); + out.close(); + } + + public void visitJavaClass(JavaClass clazz) { + out.println(";; Produced by JasminVisitor (BCEL)"); + out.println(";; http://jakarta.apache.org/bcel/"); + out.println(";; " + new Date() + "\n"); + + out.println(".source " + clazz.getSourceFileName()); + out.println("." + Utility.classOrInterface(clazz.getAccessFlags()) + " " + + Utility.accessToString(clazz.getAccessFlags(), true) + + " " + clazz.getClassName().replace('.', '/')); + out.println(".super " + clazz.getSuperclassName().replace('.', '/')); + + String[] interfaces = clazz.getInterfaceNames(); + + for(int i=0; i < interfaces.length; i++) + out.println(".implements " + interfaces[i].replace('.', '/')); + + out.print("\n"); + } + + public void visitField(Field field) { + out.print(".field " + Utility.accessToString(field.getAccessFlags()) + + " " + field.getName() + " " + field.getSignature()); + if(field.getAttributes().length == 0) + out.print("\n"); + } + + public void visitConstantValue(ConstantValue cv) { + out.println(" = " + cv); + } + + private Method method; + + /** + * Unfortunately Jasmin expects ".end method" after each method. Thus we've to check + * for every of the method's attributes if it's the last one and print ".end method" + * then. + */ + private final void printEndMethod(Attribute attr) { + Attribute[] attributes = method.getAttributes(); + + if(attr == attributes[attributes.length - 1]) + out.println(".end method"); + } + + public void visitDeprecated(Deprecated attribute) { printEndMethod(attribute); } + public void visitSynthetic(Synthetic attribute) { printEndMethod(attribute); } + + public void visitMethod(Method method) { + out.println("\n.method " + Utility.accessToString(method.getAccessFlags()) + + " " + method.getName() + method.getSignature()); + + this.method = method; // Remember for use in subsequent visitXXX calls + + Attribute[] attributes = method.getAttributes(); + if((attributes == null) || (attributes.length == 0)) + out.println(".end method"); + } + + public void visitExceptionTable(ExceptionTable e) { + String[] names = e.getExceptionNames(); + for(int i=0; i < names.length; i++) + out.println(".throws " + names[i].replace('.', '/')); + + printEndMethod(e); + } + + private Hashtable map; + + public void visitCode(Code code) { + int label_counter = 0; + + out.println(".limit stack " + code.getMaxStack()); + out.println(".limit locals " + code.getMaxLocals()); + + MethodGen mg = new MethodGen(method, class_name, cp); + InstructionList il = mg.getInstructionList(); + InstructionHandle[] ihs = il.getInstructionHandles(); + + /* Pass 1: Give all referenced instruction handles a symbolic name, i.e. a + * label. + */ + map = new Hashtable(); + + for(int i=0; i < ihs.length; i++) { + if(ihs[i] instanceof BranchHandle) { + BranchInstruction bi = (BranchInstruction)ihs[i].getInstruction(); + + if(bi instanceof Select) { // Special cases LOOKUPSWITCH and TABLESWITCH + InstructionHandle[] targets = ((Select)bi).getTargets(); + + for(int j=0; j < targets.length; j++) + put(targets[j], "Label" + label_counter++ + ":"); + } + + InstructionHandle ih = bi.getTarget(); + put(ih, "Label" + label_counter++ + ":"); + } + } + + LocalVariableGen[] lvs = mg.getLocalVariables(); + for(int i=0; i < lvs.length; i++) { + InstructionHandle ih = lvs[i].getStart(); + put(ih, "Label" + label_counter++ + ":"); + ih = lvs[i].getEnd(); + put(ih, "Label" + label_counter++ + ":"); + } + + CodeExceptionGen[] ehs = mg.getExceptionHandlers(); + for(int i=0; i < ehs.length; i++) { + CodeExceptionGen c = ehs[i]; + InstructionHandle ih = c.getStartPC(); + + put(ih, "Label" + label_counter++ + ":"); + ih = c.getEndPC(); + put(ih, "Label" + label_counter++ + ":"); + ih = c.getHandlerPC(); + put(ih, "Label" + label_counter++ + ":"); + } + + LineNumberGen[] lns = mg.getLineNumbers(); + for(int i=0; i < lns.length; i++) { + InstructionHandle ih = lns[i].getInstruction(); + put(ih, ".line " + lns[i].getSourceLine()); + } + + /* Pass 2: Output code. + */ + for(int i=0; i < lvs.length; i++) { + LocalVariableGen l = lvs[i]; + out.println(".var " + l.getIndex() + " is " + l.getName() + " " + + l.getType().getSignature() + + " from " + get(l.getStart()) + + " to " + get(l.getEnd())); + } + + out.print("\n"); + + for(int i=0; i < ihs.length; i++) { + InstructionHandle ih = ihs[i]; + Instruction inst = ih.getInstruction(); + String str = (String)map.get(ih); + + if(str != null) + out.println(str); + + if(inst instanceof BranchInstruction) { + if(inst instanceof Select) { // Special cases LOOKUPSWITCH and TABLESWITCH + Select s = (Select)inst; + int[] matchs = s.getMatchs(); + InstructionHandle[] targets = s.getTargets(); + + if(s instanceof TABLESWITCH) { + out.println("\ttableswitch " + matchs[0] + " " + + matchs[matchs.length - 1]); + + for(int j=0; j < targets.length; j++) + out.println("\t\t" + get(targets[j])); + + } else { // LOOKUPSWITCH + out.println("\tlookupswitch "); + + for(int j=0; j < targets.length; j++) + out.println("\t\t" + matchs[j] + " : " + get(targets[j])); + } + + out.println("\t\tdefault: " + get(s.getTarget())); // Applies for both + } else { + BranchInstruction bi = (BranchInstruction)inst; + ih = bi.getTarget(); + str = get(ih); + out.println("\t" + Constants.OPCODE_NAMES[bi.getOpcode()] + " " + str); + } + } + else + out.println("\t" + inst.toString(cp.getConstantPool())); + } + + out.print("\n"); + + for(int i=0; i < ehs.length; i++) { + CodeExceptionGen c = ehs[i]; + ObjectType caught = c.getCatchType(); + String class_name = (caught == null)? // catch any exception, used when compiling finally + "all" : caught.getClassName().replace('.', '/'); + + out.println(".catch " + class_name + " from " + + get(c.getStartPC()) + " to " + get(c.getEndPC()) + + " using " + get(c.getHandlerPC())); + } + + printEndMethod(code); + } + + + private final String get(InstructionHandle ih) { + String str = new StringTokenizer((String)map.get(ih), "\n").nextToken(); + return str.substring(0, str.length() - 1); + } + + private final void put(InstructionHandle ih, String line) { + String str = (String)map.get(ih); + + if(str == null) + map.put(ih, line); + else { + if(line.startsWith("Label") || str.endsWith(line)) // Already have a label in the map + return; + + map.put(ih, str + "\n" + line); // append + } + } + + public static void main(String[] argv) { + ClassParser parser=null; + JavaClass java_class; + + try { + if(argv.length == 0) + System.err.println("disassemble: No input files specified"); + else { + for(int i=0; i < argv.length; i++) { + if((java_class = Repository.lookupClass(argv[i])) == null) + java_class = new ClassParser(argv[i]).parse(); + + String class_name = java_class.getClassName(); + int index = class_name.lastIndexOf('.'); + String path = class_name.substring(0, index + 1).replace('.', File.separatorChar); + class_name = class_name.substring(index + 1); + + if(!path.equals("")) { + File f = new File(path); + f.mkdirs(); + } + + String name = path + class_name + ".j"; + FileOutputStream out = new FileOutputStream(name); + new JasminVisitor(java_class, out).disassemble(); + System.out.println("File dumped to: " + name); + } + } + } catch(Exception e) { + e.printStackTrace(); + } + } +} diff --git a/examples/Mini/ASCII_CharStream.java b/examples/Mini/ASCII_CharStream.java new file mode 100644 index 00000000..4ddad520 --- /dev/null +++ b/examples/Mini/ASCII_CharStream.java @@ -0,0 +1,381 @@ +/* Generated By:JavaCC: Do not edit this line. ASCII_CharStream.java Version 0.7pre6 */ +package Mini; + +/** + * An implementation of interface CharStream, where the stream is assumed to + * contain only ASCII characters (without unicode processing). + */ + +public final class ASCII_CharStream +{ + public static final boolean staticFlag = true; + static int bufsize; + static int available; + static int tokenBegin; + static public int bufpos = -1; + static private int bufline[]; + static private int bufcolumn[]; + + static private int column = 0; + static private int line = 1; + + static private boolean prevCharIsCR = false; + static private boolean prevCharIsLF = false; + + static private java.io.Reader inputStream; + + static private char[] buffer; + static private int maxNextCharInd = 0; + static private int inBuf = 0; + + static private final void ExpandBuff(boolean wrapAround) + { + char[] newbuffer = new char[bufsize + 2048]; + int newbufline[] = new int[bufsize + 2048]; + int newbufcolumn[] = new int[bufsize + 2048]; + + try + { + if (wrapAround) + { + System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); + System.arraycopy(buffer, 0, newbuffer, + bufsize - tokenBegin, bufpos); + buffer = newbuffer; + + System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); + System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); + bufline = newbufline; + + System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); + System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); + bufcolumn = newbufcolumn; + + maxNextCharInd = (bufpos += (bufsize - tokenBegin)); + } + else + { + System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); + buffer = newbuffer; + + System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); + bufline = newbufline; + + System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); + bufcolumn = newbufcolumn; + + maxNextCharInd = (bufpos -= tokenBegin); + } + } + catch (Throwable t) + { + throw new Error(t.getMessage()); + } + + + bufsize += 2048; + available = bufsize; + tokenBegin = 0; + } + + static private final void FillBuff() throws java.io.IOException + { + if (maxNextCharInd == available) + { + if (available == bufsize) + { + if (tokenBegin > 2048) + { + bufpos = maxNextCharInd = 0; + available = tokenBegin; + } + else if (tokenBegin < 0) + bufpos = maxNextCharInd = 0; + else + ExpandBuff(false); + } + else if (available > tokenBegin) + available = bufsize; + else if ((tokenBegin - available) < 2048) + ExpandBuff(true); + else + available = tokenBegin; + } + + int i; + try { + if ((i = inputStream.read(buffer, maxNextCharInd, + available - maxNextCharInd)) == -1) + { + inputStream.close(); + throw new java.io.IOException(); + } + else + maxNextCharInd += i; + return; + } + catch(java.io.IOException e) { + --bufpos; + backup(0); + if (tokenBegin == -1) + tokenBegin = bufpos; + throw e; + } + } + + static public final char BeginToken() throws java.io.IOException + { + tokenBegin = -1; + char c = readChar(); + tokenBegin = bufpos; + + return c; + } + + static private final void UpdateLineColumn(char c) + { + column++; + + if (prevCharIsLF) + { + prevCharIsLF = false; + line += (column = 1); + } + else if (prevCharIsCR) + { + prevCharIsCR = false; + if (c == '\n') + { + prevCharIsLF = true; + } + else + line += (column = 1); + } + + switch (c) + { + case '\r' : + prevCharIsCR = true; + break; + case '\n' : + prevCharIsLF = true; + break; + case '\t' : + column--; + column += (8 - (column & 07)); + break; + default : + break; + } + + bufline[bufpos] = line; + bufcolumn[bufpos] = column; + } + + static public final char readChar() throws java.io.IOException + { + if (inBuf > 0) + { + --inBuf; + return (char)((char)0xff & buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos]); + } + + if (++bufpos >= maxNextCharInd) + FillBuff(); + + char c = (char)((char)0xff & buffer[bufpos]); + + UpdateLineColumn(c); + return (c); + } + + /** + * @deprecated + * @see #getEndColumn + */ + + static public final int getColumn() { + return bufcolumn[bufpos]; + } + + /** + * @deprecated + * @see #getEndLine + */ + + static public final int getLine() { + return bufline[bufpos]; + } + + static public final int getEndColumn() { + return bufcolumn[bufpos]; + } + + static public final int getEndLine() { + return bufline[bufpos]; + } + + static public final int getBeginColumn() { + return bufcolumn[tokenBegin]; + } + + static public final int getBeginLine() { + return bufline[tokenBegin]; + } + + static public final void backup(int amount) { + + inBuf += amount; + if ((bufpos -= amount) < 0) + bufpos += bufsize; + } + + public ASCII_CharStream(java.io.Reader dstream, int startline, + int startcolumn, int buffersize) + { + if (inputStream != null) + throw new Error("\n ERROR: Second call to the constructor of a static ASCII_CharStream. You must\n" + + " either use ReInit() or set the JavaCC option STATIC to false\n" + + " during the generation of this class."); + inputStream = dstream; + line = startline; + column = startcolumn - 1; + + available = bufsize = buffersize; + buffer = new char[buffersize]; + bufline = new int[buffersize]; + bufcolumn = new int[buffersize]; + } + + public ASCII_CharStream(java.io.Reader dstream, int startline, + int startcolumn) + { + this(dstream, startline, startcolumn, 4096); + } + static public void ReInit(java.io.Reader dstream, int startline, + int startcolumn, int buffersize) + { + inputStream = dstream; + line = startline; + column = startcolumn - 1; + + if (buffer == null || buffersize != buffer.length) + { + available = bufsize = buffersize; + buffer = new char[buffersize]; + bufline = new int[buffersize]; + bufcolumn = new int[buffersize]; + } + prevCharIsLF = prevCharIsCR = false; + tokenBegin = inBuf = maxNextCharInd = 0; + bufpos = -1; + } + + static public void ReInit(java.io.Reader dstream, int startline, + int startcolumn) + { + ReInit(dstream, startline, startcolumn, 4096); + } + public ASCII_CharStream(java.io.InputStream dstream, int startline, + int startcolumn, int buffersize) + { + this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096); + } + + public ASCII_CharStream(java.io.InputStream dstream, int startline, + int startcolumn) + { + this(dstream, startline, startcolumn, 4096); + } + + static public void ReInit(java.io.InputStream dstream, int startline, + int startcolumn, int buffersize) + { + ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096); + } + static public void ReInit(java.io.InputStream dstream, int startline, + int startcolumn) + { + ReInit(dstream, startline, startcolumn, 4096); + } + static public final String GetImage() + { + if (bufpos >= tokenBegin) + return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); + else + return new String(buffer, tokenBegin, bufsize - tokenBegin) + + new String(buffer, 0, bufpos + 1); + } + + static public final char[] GetSuffix(int len) + { + char[] ret = new char[len]; + + if ((bufpos + 1) >= len) + System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); + else + { + System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, + len - bufpos - 1); + System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); + } + + return ret; + } + + static public void Done() + { + buffer = null; + bufline = null; + bufcolumn = null; + } + + /** + * Method to adjust line and column numbers for the start of a token.
+ */ + static public void adjustBeginLineColumn(int newLine, int newCol) + { + int start = tokenBegin; + int len; + + if (bufpos >= tokenBegin) + { + len = bufpos - tokenBegin + inBuf + 1; + } + else + { + len = bufsize - tokenBegin + bufpos + 1 + inBuf; + } + + int i = 0, j = 0, k = 0; + int nextColDiff = 0, columnDiff = 0; + + while (i < len && + bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) + { + bufline[j] = newLine; + nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; + bufcolumn[j] = newCol + columnDiff; + columnDiff = nextColDiff; + i++; + } + + if (i < len) + { + bufline[j] = newLine++; + bufcolumn[j] = newCol + columnDiff; + + while (i++ < len) + { + if (bufline[j = start % bufsize] != bufline[++start % bufsize]) + bufline[j] = newLine++; + else + bufline[j] = newLine; + } + } + + line = bufline[j]; + column = bufcolumn[j]; + } + +} diff --git a/examples/Mini/ASTExpr.java b/examples/Mini/ASTExpr.java new file mode 100644 index 00000000..149c288a --- /dev/null +++ b/examples/Mini/ASTExpr.java @@ -0,0 +1,292 @@ +/* Generated By:JJTree: Do not edit this line. ASTExpr.java */ +/* JJT: 0.3pre1 */ + +package Mini; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; + +/** + * Represents arithmetic expressions such as `(a + 12 == b) OR c'. + * The parse tree is built initially by the parser and modified, i.e. + * compacted with `traverse()'. Each (Expr, Term, Factor) node + * with kind == -1 is replaced which its successor node, which is + * converted to type `Expr' + * + * A node with kind == -1 denotes the fact that this expression + * node has just one child branch and thus may be replaced by this + * branch (or leaf) directly without altering the expression + * semantics. Term and Factor nodes are used only to build the parse tree + * obeying the aritmetical precedences (* stronger than +, etc.) and + * are discarded in the first pass. +*/ +public class ASTExpr extends SimpleNode +implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constants { + protected int kind=-1; // Single twig to leaf? + private int unop=-1; // Special case: Unary operand applied + protected ASTExpr[] exprs; // Sub expressions + protected Environment env; // Needed in all passes + protected int line, column; + protected boolean is_simple; // true, if simple expression like `12 + f(a)' + + /* Not all children shall inherit this, exceptions are ASTIdent and ASTFunAppl, which + * look up the type in the corresponding environment entry. + */ + protected int type = T_UNKNOWN; + + // Generated methods + ASTExpr(int id) { + super(id); + } + + ASTExpr(MiniParser p, int id) { + super(p, id); + } + + public static Node jjtCreate(MiniParser p, int id) { + return new ASTExpr(p, id); + } + + ASTExpr(int line, int column, int id) { + super(id); + this.line = line; + this.column = column; + } + + ASTExpr(int line, int column, int kind, int id) { + this(line, column, id); + this.kind = kind; + } + + /* Special constructor, called from ASTTerm.traverse() and + * ASTFactor.traverse(), when traverse()ing the parse tree replace + * themselves with Expr nodes. + */ + ASTExpr(ASTExpr[] children, int kind, int line, int column) { + this(line, column, kind, JJTEXPR); + exprs = children; + } + + /** + * @return name of node, its kind and the number of children. + */ + public String toString() { + String op=""; + int len = (children != null)? children.length : 0; + if(unop != -1) + op = tokenImage[unop]; + else if(kind != -1) + op = tokenImage[kind]; + + return jjtNodeName[id] + "(" + op + ")[" + len + "]<" + + TYPE_NAMES[type] + "> @" + line + ", " + column; + } + + /** + * Overrides SimpleNode.closeNode(). Overridden by some subclasses. + * + * Called by the parser when the construction of this node is finished. + * Casts children Node[] to precise ASTExpr[] type. + */ + public void closeNode() { + if(children != null) { + exprs = new ASTExpr[children.length]; + System.arraycopy(children, 0, exprs, 0, children.length); + children=null; // Throw away old reference + } + } + + /** + * First pass + * Overridden by subclasses. Traverse the whole parse tree recursively and + * drop redundant nodes. + */ + public ASTExpr traverse(Environment env) { + this.env = env; + + if((kind == -1) && (unop == -1)) // Redundant node (built thru op precedence) ? + return exprs[0].traverse(env); // --> Replaced by successor + else { + for(int i=0; i < exprs.length; i++) // Traverse children + exprs[i] = exprs[i].traverse(env); // References may change + + return this; + } + } + + /** + * Second and third pass + * @return type of expression + * @param expected type + */ + public int eval(int expected) { + int child_type = T_UNKNOWN, t; + + is_simple = true; + + // Determine expected node type depending on used operator. + if(unop != -1) { + if(unop == MINUS) + child_type = type = T_INT; // - + else + child_type = type = T_BOOLEAN; // ! + } + else { + // Compute expected type + if((kind == PLUS) || (kind == MINUS) || (kind == MULT) || + (kind == MOD) || (kind == DIV)) + child_type = type = T_INT; + else if((kind == AND) || (kind == OR)) + child_type = type = T_BOOLEAN; + else { // LEQ, GT, etc. + child_type = T_INT; + type = T_BOOLEAN; + } + } + + // Get type of subexpressions + for(int i=0; i < exprs.length; i++) { + t = exprs[i].eval(child_type); + + if(t != child_type) + MiniC.addError(exprs[i].getLine(), exprs[i].getColumn(), + "Expression has not expected type " + TYPE_NAMES[child_type] + + " but " + TYPE_NAMES[t] + "."); + + is_simple = is_simple && exprs[i].isSimple(); + } + + return type; + } + + private static final String toBool(String i) { + return "(" + i + " != 0)"; + } + + private static final String toInt(String i) { + return "((" + i + ")? 1 : 0)"; + } + + /** + * Fourth pass, produce Java code. + */ + public void code(StringBuffer buf) { + if(unop != -1) { + exprs[0].code(buf); + String top = ASTFunDecl.pop(); + if(unop == MINUS) + ASTFunDecl.push(buf, "-" + top); + else + ASTFunDecl.push(buf, "(" + top + " == 1)? 0 : 1)"); + } + else { + exprs[0].code(buf); + exprs[1].code(buf); + String _body_int2 = ASTFunDecl.pop(); + String _body_int = ASTFunDecl.pop(); + + switch(kind) { + case PLUS: ASTFunDecl.push(buf, _body_int + " + " + _body_int2); break; + case MINUS: ASTFunDecl.push(buf, _body_int + " - " + _body_int2); break; + case MULT: ASTFunDecl.push(buf, _body_int + " * " + _body_int2); break; + case DIV: ASTFunDecl.push(buf, _body_int + " / " + _body_int2); break; + + case AND: ASTFunDecl.push(buf, toInt(toBool(_body_int) + " && " + + toBool(_body_int2))); break; + case OR: ASTFunDecl.push(buf, toInt(toBool(_body_int) + " || " + + toBool(_body_int2))); break; + + case EQ: ASTFunDecl.push(buf, toInt(_body_int + " == " + _body_int2)); + break; + case LEQ: ASTFunDecl.push(buf, toInt(_body_int + " <= " + _body_int2)); + break; + case GEQ: ASTFunDecl.push(buf, toInt(_body_int + " >= " + _body_int2)); + break; + case NEQ: ASTFunDecl.push(buf, toInt(_body_int + " != " + _body_int2)); + break; + case LT: ASTFunDecl.push(buf, toInt(_body_int + " < " + _body_int2)); + break; + case GT: ASTFunDecl.push(buf, toInt(_body_int + " > " + _body_int2)); + break; + + default: System.err.println("Ooops"); + } + } + } + + /** + * Fifth pass, produce Java byte code. + */ + public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { + exprs[0].byte_code(il, method, cp); + + if(unop != -1) { // Apply unary operand + if(unop == MINUS) + il.append(InstructionConstants.INEG); + else { // == NOT + il.append(new PUSH(cp, 1)); ASTFunDecl.push(); // Push TRUE + il.append(InstructionConstants.IXOR); ASTFunDecl.pop(); + } + } + else { // Apply binary operand + BranchHandle bh=null; + + exprs[1].byte_code(il, method, cp); + + switch(kind) { + case PLUS: il.append(InstructionConstants.IADD); ASTFunDecl.pop(); break; + case MINUS: il.append(InstructionConstants.ISUB); ASTFunDecl.pop(); break; + case MULT: il.append(InstructionConstants.IMUL); ASTFunDecl.pop(); break; + case DIV: il.append(InstructionConstants.IDIV); ASTFunDecl.pop(); break; + case AND: il.append(InstructionConstants.IAND); ASTFunDecl.pop(); break; + case OR: il.append(InstructionConstants.IOR); ASTFunDecl.pop(); break; + + /* Use negated operands */ + case EQ: bh = il.append(new IF_ICMPNE(null)); ASTFunDecl.pop(2); break; + case LEQ: bh = il.append(new IF_ICMPGT(null)); ASTFunDecl.pop(2); break; + case GEQ: bh = il.append(new IF_ICMPLT(null)); ASTFunDecl.pop(2); break; + case NEQ: bh = il.append(new IF_ICMPEQ(null)); ASTFunDecl.pop(2); break; + case LT: bh = il.append(new IF_ICMPGE(null)); ASTFunDecl.pop(2); break; + case GT: bh = il.append(new IF_ICMPLE(null)); ASTFunDecl.pop(2); break; + default: System.err.println("Ooops"); + } + + switch(kind) { + case EQ: case LEQ: case GEQ: case NEQ: case LT: case GT: + BranchHandle g; + + il.append(new PUSH(cp, 1)); + g = il.append(new GOTO(null)); + bh.setTarget(il.append(new PUSH(cp, 0))); + g.setTarget(il.append(InstructionConstants.NOP)); // May be optimized away later + ASTFunDecl.push(); + break; + + default: break; + } + } + } + + public boolean isSimple() { return is_simple; } + public void setType(int type) { this.type = type; } + public int getType() { return type; } + public void setKind(int kind) { this.kind = kind; } + public int getKind() { return kind; } + public void setUnOp(int unop) { this.unop = unop; } + public int getUnOp() { return unop; } + public void setLine(int line) { this.line = line; } + public int getLine() { return line; } + public void setColumn(int column) { this.column = column; } + public int getColumn() { return column; } + public void setPosition(int line, int column) { + this.line = line; + this.column = column; + } + + public void dump(String prefix) { + System.out.println(toString(prefix)); + + if(exprs != null) // Children may have no subchildren + for(int i=0; i < exprs.length; ++i) + exprs[i].dump(prefix + " "); + } +} diff --git a/examples/Mini/ASTFactor.java b/examples/Mini/ASTFactor.java new file mode 100644 index 00000000..41c2bdcd --- /dev/null +++ b/examples/Mini/ASTFactor.java @@ -0,0 +1,37 @@ +/* Generated By:JJTree: Do not edit this line. ASTFactor.java */ +/* JJT: 0.3pre1 */ + +package Mini; + +/** + * + * @version $Id$ + * @author M. Dahm + */ +public class ASTFactor extends ASTExpr { + // Generated methods + ASTFactor(int id) { + super(id); + } + + ASTFactor(MiniParser p, int id) { + super(p, id); + } + + public static Node jjtCreate(MiniParser p, int id) { + return new ASTFactor(p, id); + } + + // Inherited closeNode(), dump() + + /** + * Drop this node, if kind == -1, because then it has just one child node + * and may be safely replaced with it. + */ + public ASTExpr traverse(Environment env) { + if(kind == -1) // Drop it + return exprs[0].traverse(env); + else // Or convert it to Expr node & copy children + return new ASTExpr(exprs, kind, line, column).traverse(env); + } +} diff --git a/examples/Mini/ASTFunAppl.java b/examples/Mini/ASTFunAppl.java new file mode 100644 index 00000000..87c9a955 --- /dev/null +++ b/examples/Mini/ASTFunAppl.java @@ -0,0 +1,221 @@ +/* Generated By:JJTree: Do not edit this line. ASTFunAppl.java */ +/* JJT: 0.3pre1 */ + +package Mini; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; + +/** + * + * @version $Id$ + * @author M. Dahm + */ +public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, + org.apache.bcel.Constants { + private ASTIdent name; + private Function function; // Points to Function in environment + + // Generated methods + ASTFunAppl(int id) { + super(id); + } + + ASTFunAppl(MiniParser p, int id) { + super(p, id); + } + + public static Node jjtCreate(MiniParser p, int id) { + return new ASTFunAppl(p, id); + } + + ASTFunAppl(ASTIdent name, Function function, ASTExpr[] exprs) { + this(JJTFUNAPPL); + + this.name = name; + this.function = function; + this.exprs = exprs; + } + + public String toString() { + return jjtNodeName[id] + " " + name.getName(); + } + + /** + * Overrides ASTExpr.closeNode() + */ + public void closeNode() { + name = (ASTIdent)children[0]; + + if(children.length > 1) { + exprs = new ASTExpr[children.length - 1]; + System.arraycopy(children, 1, exprs, 0, children.length - 1); + } + + children=null; // Throw away old reference + } + + /** + * Overrides ASTExpr.traverse() + */ + public ASTExpr traverse(Environment env) { + String fname = name.getName(); + EnvEntry entry = env.get(fname); + + this.env = env; + + if(entry == null) // Applying unknown function + MiniC.addError(name.getLine(), name.getColumn(), + "Applying unknown function " + fname + "."); + else { + if(!(entry instanceof Function)) + MiniC.addError(name.getLine(), name.getColumn(), + "Applying non-function " + fname + "."); + else { + int len = (exprs != null)? exprs.length : 0; + Function fun = (Function)entry; + + if(len != fun.getNoArgs()) + MiniC.addError(name.getLine(), name.getColumn(), + "Function " + fname + " expects " + fun.getNoArgs() + + " arguments, you supplied " + len + "."); + else { // Adjust references + function = fun; + name = fun.getName(); + } + } + } + + if(exprs != null) // Argument list may be empty + for(int i=0; i < exprs.length; i++) + exprs[i] = exprs[i].traverse(env); + + return this; + } + + /** + * Second pass + * Overrides AstExpr.eval() + * @return type of expression + * @param expected type + */ + public int eval(int expected) { + String fname = name.getName(); + Function f = function; + ASTIdent fun = f.getName(); + ASTIdent[] args = f.getArgs(); + int t = fun.getType(); + + is_simple = true; // Only true if all arguments are simple expressions + + // Check arguments + if(exprs != null) { + for(int i=0; i < exprs.length; i++) { // length match checked in previous pass + int expect = args[i].getType(); // May be T_UNKNOWN + int t_e = exprs[i].eval(expect); // May be T_UNKNOWN + + if((expect != T_UNKNOWN) && (t_e != expect)) + MiniC.addError(exprs[i].getLine(), exprs[i].getColumn(), + "Argument " + (i + 1) + " in application of " + fname + + " is not of type " + TYPE_NAMES[expect] + " but " + + TYPE_NAMES[t_e]); + else + args[i].setType(t_e); // Update, may be identical + + is_simple = is_simple && exprs[i].isSimple(); // Check condition + } + } + + if(t == T_UNKNOWN) // Function type yet unknown + fun.setType(t = expected); // May be still T_UNKNOWN + + return type = t; + } + + /** + * Fourth pass, produce Java code. + */ + public void code(StringBuffer buf) { + String fname = name.getName(); + Function f = function; + ASTIdent[] args = f.getArgs(); + + if(fname.equals("READ")) + ASTFunDecl.push(buf, "_readInt()"); + else if(fname.equals("WRITE")) { + exprs[0].code(buf); + ASTFunDecl.push(buf, "_writeInt(" + ASTFunDecl.pop() + ")"); + } + else { // Normal function + if(exprs != null) { // Output in reverse odrder + for(int i = exprs.length - 1; i >= 0; i--) + exprs[i].code(buf); + } + + StringBuffer call = new StringBuffer(fname + "("); + // Function call + + if(exprs != null) { + for(int i=0; i < exprs.length; i++) { + call.append(ASTFunDecl.pop()); + if(i < exprs.length - 1) + call.append(", "); + } + } + call.append(")"); + + ASTFunDecl.push(buf, call.toString()); + } + } + + /** + * Fifth pass, produce Java byte code. + */ + public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { + String fname = name.getName(); + Function f = function; + //ASTIdent fun = f.getName(); + ASTIdent[] args = f.getArgs(); + String class_name = method.getClassName(); + + if(fname.equals("READ")) + il.append(new INVOKESTATIC(cp.addMethodref(class_name, + "_readInt", + "()I"))); + else if(fname.equals("WRITE")) { + exprs[0].byte_code(il, method, cp); + ASTFunDecl.pop(); + il.append(new INVOKESTATIC(cp.addMethodref(class_name, + "_writeInt", + "(I)I"))); + } + else { // Normal function + int size = exprs.length; + Type[] argv = null; + + if(exprs != null) { + argv = new Type[size]; + + for(int i=0; i < size; i++) { + argv[i] = Type.INT; + exprs[i].byte_code(il, method, cp); + } + + //ASTFunDecl.push(size); + } + + ASTFunDecl.pop(size); + + // Function call + il.append(new INVOKESTATIC(cp.addMethodref(class_name, + fname, + Type.getMethodSignature(Type.INT, + argv)))); + } + + ASTFunDecl.push(); + } + + // dump() inherited + public ASTIdent getName() { return name; } + public Function getFunction() { return function; } +} diff --git a/examples/Mini/ASTFunDecl.java b/examples/Mini/ASTFunDecl.java new file mode 100644 index 00000000..a008f74f --- /dev/null +++ b/examples/Mini/ASTFunDecl.java @@ -0,0 +1,395 @@ +/* Generated By:JJTree: Do not edit this line. ASTFunDecl.java */ +/* JJT: 0.3pre1 */ + +package Mini; +import java.io.PrintWriter; +import java.util.Iterator; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.util.InstructionFinder; + +/** + * + * @version $Id$ + * @author M. Dahm + */ +public class ASTFunDecl extends SimpleNode +implements MiniParserTreeConstants, org.apache.bcel.Constants { + private ASTIdent name; + private ASTIdent[] argv; + private ASTExpr body; + private int type = T_UNKNOWN; + private int line, column; + private boolean is_simple; // true, if simple expression like `12 + f(a)' + private boolean is_recursive; // Not used yet, TODO + private int max_depth; // max. expression tree depth + private Environment env; + + // Generated methods + ASTFunDecl(int id) { + super(id); + } + + ASTFunDecl(MiniParser p, int id) { + super(p, id); + } + + public static Node jjtCreate(MiniParser p, int id) { + return new ASTFunDecl(p, id); + } + + ASTFunDecl(ASTIdent name, ASTIdent[] argv, ASTExpr body, int type) { + this(JJTFUNDECL); + + this.name = name; + this.argv = argv; + this.body = body; + this.type = type; + } + + /** + * Overrides SimpleNode.closeNode() + * Cast children to appropiate type. + */ + public void closeNode() { + name = (ASTIdent)children[0]; + body = (ASTExpr)children[children.length - 1]; + + argv = new ASTIdent[children.length - 2]; // May be 0-size array + for(int i = 1; i < children.length - 1; i++) + argv[i - 1] = (ASTIdent)children[i]; + + children=null; // Throw away old reference + } + + /** + * First pass of parse tree. + */ + public ASTFunDecl traverse(Environment env) { + this.env = env; + + // Put arguments into hash table aka environment + for(int i=0; i < argv.length; i++) { + EnvEntry entry = env.get(argv[i].getName()); + + if(entry != null) + MiniC.addError(argv[i].getLine(), argv[i].getColumn(), + "Redeclaration of " + entry + "."); + else + env.put(new Variable(argv[i])); + } + + /* Update entry of this function, i.e. set argument references. + * The entry is already in there by garantuee, but may be of wrong type, + * i.e. the user defined a function `TRUE', e.g. and `TRUE' is of type `Variable'. + */ + try { + Function fun = (Function)env.get(name.getName()); + fun.setArgs(argv); + } catch(ClassCastException e) {} // Who cares? + + body = body.traverse(env); // Traverse expression body + + return this; + } + + /** Second pass + * @return type of expression + */ + public int eval(int pass) { + int expected = name.getType(); // Maybe other function has already called us + type = body.eval(expected); // And updated the env + + if((expected != T_UNKNOWN) && (type != expected)) + MiniC.addError(line, column, + "Function f ist not of type " + TYPE_NAMES[expected] + + " as previously assumed, but " + TYPE_NAMES[type]); + + name.setType(type); + + is_simple = body.isSimple(); + + if(pass == 2 && type == T_UNKNOWN) + is_recursive = true; + + return type; + } + + /** + * Fourth pass, produce Java code. + */ + public void code(PrintWriter out) { + String expr; + boolean main=false, ignore=false; + + String fname = name.getName(); + + if(fname.equals("main")) { + out.println(" public static void main(String[] _argv) {"); + main = true; + } + else if(fname.equals("READ") || fname.equals("WRITE")) { // Do nothing + ignore = true; + } + else { + out.print(" public static final " + "int" + // type_names[type] + + " " + fname + "("); + + for(int i = 0; i < argv.length; i++) { + out.print("int " + argv[i].getName()); + + if(i < argv.length - 1) + out.print(", "); + } + + out.println(")\n throws IOException\n {"); + } + + if(!ignore) { + StringBuffer buf = new StringBuffer(); + + body.code(buf); + out.println(getVarDecls()); + + expr = buf.toString(); + + if(main) + out.println(" try {"); + + out.println(expr); + + if(main) + out.println(" } catch(Exception e) { System.err.println(e); }\n }\n"); + else + out.println("\n return " + pop() + ";\n }\n"); + } + + reset(); + } + + /** + * Fifth pass, produce Java byte code. + */ + public void byte_code(ClassGen class_gen, ConstantPoolGen cp) { + MethodGen method=null; + boolean main=false, ignore=false; + String class_name = class_gen.getClassName(); + String fname = name.getName(); + InstructionList il = new InstructionList(); + + Type[] args = { new ArrayType(Type.STRING, 1) }; // default for `main' + String[] arg_names = { "$argv" }; + + if(fname.equals("main")) { + method = new MethodGen(ACC_STATIC | ACC_PUBLIC, + Type.VOID, args, arg_names, + "main", class_name, il, cp); + + main = true; + } else if(fname.equals("READ") || fname.equals("WRITE")) { // Do nothing + ignore = true; + } else { + int size = argv.length; + + arg_names = new String[size]; + args = new Type[size]; + + for(int i = 0; i < size; i++) { + args[i] = Type.INT; + arg_names[i] = argv[i].getName(); + } + + method = new MethodGen(ACC_STATIC | ACC_PRIVATE | ACC_FINAL, + Type.INT, args, arg_names, + fname, class_name, il, cp); + + LocalVariableGen[] lv = method.getLocalVariables(); + for(int i = 0; i < size; i++) { + Variable entry = (Variable)env.get(arg_names[i]); + entry.setLocalVariable(lv[i]); + } + + method.addException("java.io.IOException"); + } + + if(!ignore) { + body.byte_code(il, method, cp); + + if(main) { + ObjectType e_type = new ObjectType("java.lang.Exception"); + InstructionHandle start = il.getStart(), end, handler, end_handler; + LocalVariableGen exc = method.addLocalVariable("$e", + e_type, + null, null); + int slot = exc.getIndex(); + + il.append(InstructionConstants.POP); pop(); // Remove last element on stack + end = il.append(InstructionConstants.RETURN); // Use instruction constants, if possible + + // catch + handler = il.append(new ASTORE(slot)); // save exception object + il.append(new GETSTATIC(cp.addFieldref("java.lang.System", "err", + "Ljava/io/PrintStream;"))); + il.append(new ALOAD(slot)); push(2); + il.append(new INVOKEVIRTUAL(cp.addMethodref("java.io.PrintStream", + "println", + "(Ljava/lang/Object;)V"))); + pop(2); + end_handler = il.append(InstructionConstants.RETURN); + method.addExceptionHandler(start, end, handler, e_type); + exc.setStart(handler); exc.setEnd(end_handler); + } + else + il.append(InstructionConstants.IRETURN); // Reuse object to save memory + + method.removeNOPs(); // First optimization pass, provided by MethodGen + optimizeIFs(il); // Second optimization pass, application-specific + method.setMaxStack(max_size); + class_gen.addMethod(method.getMethod()); + } + + il.dispose(); // Dispose instruction handles for better memory utilization + + reset(); + } + + private static final InstructionFinder.CodeConstraint my_constraint = + new InstructionFinder.CodeConstraint() { + public boolean checkCode(InstructionHandle[] match) { + BranchInstruction if_icmp = (BranchInstruction)match[0].getInstruction(); + GOTO goto_ = (GOTO)match[2].getInstruction(); + return (if_icmp.getTarget() == match[3]) && (goto_.getTarget() == match[4]); + } + }; + + /** + * Replaces instruction sequences (typically generated by ASTIfExpr) of the form + * + * IF_ICMP__, ICONST_1, GOTO, ICONST_0, IFEQ, Instruction + * + * where the IF_ICMP__ branches to the ICONST_0 (else part) and the GOTO branches + * to the IFEQ with the simpler expression + * + * IF_ICMP__, Instruction + * + * where the IF_ICMP__ now branches to the target of the previous IFEQ instruction. + */ + private static final void optimizeIFs(InstructionList il) { + InstructionFinder f = new InstructionFinder(il); + String pat = "IF_ICMP ICONST_1 GOTO ICONST_0 IFEQ Instruction"; + + for(Iterator it = f.search(pat, my_constraint); it.hasNext();) { + InstructionHandle[] match = (InstructionHandle[])it.next(); + int len = match.length; + + // Everything ok, update code + BranchInstruction ifeq = (BranchInstruction)(match[4].getInstruction()); + BranchHandle if_icmp = (BranchHandle)match[0]; + + if_icmp.setTarget(ifeq.getTarget()); + + try { + il.delete(match[1], match[4]); + } catch(TargetLostException e) { + InstructionHandle[] targets = e.getTargets(); + + System.err.println(targets[0]); + + for(int i=0; i < targets.length; i++) { + InstructionTargeter[] targeters = targets[i].getTargeters(); + + for(int j=0; j < targeters.length; j++) + if((targets[i] != match[4]) || (targeters[j] != match[2])) + System.err.println("Ooops: " + e); + } + } + } + } + + /** + * Overrides SimpleNode.toString() + */ + public String toString() { + StringBuffer buf = new StringBuffer(); + buf.append(jjtNodeName[id] + " " + name + "("); + + for(int i = 0; i < argv.length; i++) { + buf.append(argv[i].getName()); + if(i < argv.length - 1) + buf.append(", "); + } + + buf.append(")"); + return buf.toString(); + } + + public boolean isrecursive() { return is_recursive; } + public boolean isSimple() { return is_simple; } + public ASTIdent getName() { return name; } + public int getNoArgs() { return argv.length; } + public ASTIdent[] getArgs() { return argv; } + public int getType() { return type; } + public void setType(int type) { this.type = type; } + public void setLine(int line) { this.line = line; } + public int getLine() { return line; } + public void setColumn(int column) { this.column = column; } + public int getColumn() { return column; } + public void setPosition(int line, int column) { + this.line = line; + this.column = column; + } + + /** + * Overrides SimpleNode.dump() + */ + public void dump(String prefix) { + System.out.println(toString(prefix)); + + for(int i = 0; i < argv.length; i++) + argv[i].dump(prefix + " "); + + body.dump(prefix + " "); + } + + /* Used to simpulate stack with local vars and compute maximum stack size. + */ + static int size, max_size; + + static final void reset() { size = max_size = 0; } + + private static final String getVarDecls() { + StringBuffer buf = new StringBuffer(" int "); + + for(int i=0; i < max_size; i++) { + buf.append("_s" + i); + + if(i < max_size - 1) + buf.append(", "); + } + + buf.append(";\n"); + return buf.toString(); + } + + /** Used by byte_code() + */ + static final void pop(int s) { size -= s; } + static final void push(int s) { + size += s; + + if(size > max_size) + max_size = size; + } + static final void push() { push(1); } + + /** Used byte code() + */ + static final void push(StringBuffer buf, String str) { + buf.append(" _s" + size + " = " + str + ";\n"); + push(1); + } + + static final String pop() { + return "_s" + (--size); + } +} diff --git a/examples/Mini/ASTIdent.java b/examples/Mini/ASTIdent.java new file mode 100644 index 00000000..3d223e9a --- /dev/null +++ b/examples/Mini/ASTIdent.java @@ -0,0 +1,118 @@ +/* Generated By:JJTree: Do not edit this line. ASTIdent.java */ +/* JJT: 0.3pre1 */ + +package Mini; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; + +/** + * + * @version $Id$ + * @author M. Dahm + */ +public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { + private String name; + private Variable reference; // Reference in environment to decl of this ident + + // Generated methods + ASTIdent(int id) { + super(id); + } + + ASTIdent(MiniParser p, int id) { + super(p, id); + } + + public static Node jjtCreate(MiniParser p, int id) { + return new ASTIdent(p, id); + } + + public ASTIdent(String name, int type, int line, int column) { + super(line, column, JJTIDENT); + + this.name = name; + this.type = type; + } + + // closeNode, dump inherited + + /** + * @return identifier and line/column number of appearance + */ + public String toString() { + return super.toString() + " = " + name; + } + + /** + * Overrides ASTExpr.traverse() + */ + public ASTExpr traverse(Environment env) { + EnvEntry entry = env.get(name); + + if(entry == null) + MiniC.addError(line, column, "Undeclared identifier " + name); + else if(entry instanceof Function) + MiniC.addError(line, column, + "Function " + name + " used as an identifier."); + else + reference = (Variable)entry; + + return this; // Nothing to reduce/traverse further here + } + + /** + * Overrides AstExpr.eval() + */ + public int eval(int expected) { + ASTIdent ident = reference.getName(); + int t = ident.getType(); + + is_simple = true; // (Very) simple expression, always true + + if((t == T_UNKNOWN) && (expected == T_UNKNOWN)) + type = T_UNKNOWN; + else if((t == T_UNKNOWN) && (expected != T_UNKNOWN)) { + ident.setType(expected); + type = expected; + } + else if((t != T_UNKNOWN) && (expected == T_UNKNOWN)) { + ident.setType(t); + type = t; + } + else // (t != T_UNKNOWN) && (expected != T_UNKNOWN) + type = t; // Caller has to check for an error, i.e. t != expected + + return type; + } + + /** + * Fourth pass, produce Java code. + */ + public void code(StringBuffer buf) { + if(name.equals("TRUE")) + ASTFunDecl.push(buf, "1"); + else if(name.equals("FALSE")) + ASTFunDecl.push(buf, "0"); + else + ASTFunDecl.push(buf, name); + } + + /** + * Fifth pass, produce Java byte code. + */ + public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { + if(name.equals("TRUE")) + il.append(new PUSH(cp, 1)); + else if(name.equals("FALSE")) + il.append(new PUSH(cp, 0)); + else { + LocalVariableGen local_var = reference.getLocalVariable(); + il.append(new ILOAD(local_var.getIndex())); + } + ASTFunDecl.push(); + } + + + public void setName(String name) { this.name = name; } + public String getName() { return name; } +} diff --git a/examples/Mini/ASTIfExpr.java b/examples/Mini/ASTIfExpr.java new file mode 100644 index 00000000..d554dcf0 --- /dev/null +++ b/examples/Mini/ASTIfExpr.java @@ -0,0 +1,156 @@ +/* Generated By:JJTree: Do not edit this line. ASTIfExpr.java */ +/* JJT: 0.3pre1 */ + +package Mini; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; + +/** + * + * @version $Id$ + * @author M. Dahm + */ +public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { + private ASTExpr if_expr, then_expr, else_expr; + + // Generated methods + ASTIfExpr(int id) { + super(id); + } + + ASTIfExpr(MiniParser p, int id) { + super(p, id); + } + + public static Node jjtCreate(MiniParser p, int id) { + return new ASTIfExpr(p, id); + } + + /** + * Overrides ASTExpr.closeNode() + * Cast children nodes Node[] to appropiate type ASTExpr[] + */ + public void closeNode() { + if_expr = (ASTExpr)children[0]; + then_expr = (ASTExpr)children[1]; + + if(children.length == 3) // has else branch + else_expr = (ASTExpr)children[2]; + else + MiniC.addError(if_expr.getLine(), if_expr.getColumn(), + "IF expression has no ELSE branch"); + + children=null; // Throw away + } + + /** + * Overrides ASTExpr.traverse() + */ + public ASTExpr traverse(Environment env) { + this.env = env; + + if_expr = if_expr.traverse(env); + then_expr = then_expr.traverse(env); + + if(else_expr != null) + else_expr = else_expr.traverse(env); + + return this; + } + + /** + * Second pass + * Overrides AstExpr.eval() + * @return type of expression + * @param expected type + */ + public int eval(int expected) { + int then_type, else_type, if_type; + + if((if_type=if_expr.eval(T_BOOLEAN)) != T_BOOLEAN) + MiniC.addError(if_expr.getLine(), if_expr.getColumn(), + "IF expression is not of type boolean, but " + + TYPE_NAMES[if_type] + "."); + + then_type=then_expr.eval(expected); + + if((expected != T_UNKNOWN) && (then_type != expected)) + MiniC.addError(then_expr.getLine(), then_expr.getColumn(), + "THEN expression is not of expected type " + + TYPE_NAMES[expected] + " but " + TYPE_NAMES[then_type] + "."); + + if(else_expr != null) { + else_type = else_expr.eval(expected); + + if((expected != T_UNKNOWN) && (else_type != expected)) + MiniC.addError(else_expr.getLine(), else_expr.getColumn(), + "ELSE expression is not of expected type " + + TYPE_NAMES[expected] + " but " + TYPE_NAMES[else_type] + "."); + else if(then_type == T_UNKNOWN) { + then_type = else_type; + then_expr.setType(else_type); + } + } + else { + else_type = then_type; + else_expr = then_expr; + } + + if(then_type != else_type) + MiniC.addError(line, column, + "Type mismatch in THEN-ELSE: " + + TYPE_NAMES[then_type] + " vs. " + TYPE_NAMES[else_type] + "."); + + type = then_type; + + is_simple = if_expr.isSimple() && then_expr.isSimple() && else_expr.isSimple(); + + return type; + } + + /** + * Fourth pass, produce Java code. + */ + public void code(StringBuffer buf) { + if_expr.code(buf); + + buf.append(" if(" + ASTFunDecl.pop() + " == 1) {\n"); + int size = ASTFunDecl.size; + then_expr.code(buf); + ASTFunDecl.size = size; // reset stack + buf.append(" } else {\n"); + else_expr.code(buf); + buf.append(" }\n"); + } + + /** + * Fifth pass, produce Java byte code. + */ + public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { + if_expr.byte_code(il, method, cp); + + InstructionList then_code = new InstructionList(); + InstructionList else_code = new InstructionList(); + + then_expr.byte_code(then_code, method, cp); + else_expr.byte_code(else_code, method, cp); + + BranchHandle i, g; + + i = il.append(new IFEQ(null)); // If POP() == FALSE(i.e. 0) then branch to ELSE + ASTFunDecl.pop(); + il.append(then_code); + g = il.append(new GOTO(null)); + i.setTarget(il.append(else_code)); + g.setTarget(il.append(InstructionConstants.NOP)); // May be optimized away later + } + + public void dump(String prefix) { + System.out.println(toString(prefix)); + + if_expr.dump(prefix + " "); + then_expr.dump(prefix + " "); + if(else_expr != null) + else_expr.dump(prefix + " "); + } +} diff --git a/examples/Mini/ASTInteger.java b/examples/Mini/ASTInteger.java new file mode 100644 index 00000000..ee025ada --- /dev/null +++ b/examples/Mini/ASTInteger.java @@ -0,0 +1,73 @@ +/* Generated By:JJTree: Do not edit this line. ASTInteger.java */ +/* JJT: 0.3pre1 */ + +package Mini; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; + +/** + * + * @version $Id$ + * @author M. Dahm + */ +public class ASTInteger extends ASTExpr { + private int value; + + // Generated methods + ASTInteger(int id) { + super(id); + } + + ASTInteger(MiniParser p, int id) { + super(p, id); + } + + public static Node jjtCreate(MiniParser p, int id) { + return new ASTInteger(p, id); + } + + // closeNode, dump inherited from Expr + + /** + * @return identifier and line/column number of appearance + */ + public String toString() { + return super.toString() + " = " + value; + } + + /** + * Overrides ASTExpr.traverse() + */ + public ASTExpr traverse(Environment env) { + this.env = env; + return this; // Nothing to reduce/traverse here + } + + /** + * Second pass + * Overrides AstExpr.eval() + * @return type of expression + */ + public int eval(int expected) { + is_simple = true; // (Very) simple expression, always true + + return type = T_INT; + } + + /** + * Fourth pass, produce Java code. + */ + public void code(StringBuffer buf) { + ASTFunDecl.push(buf, "" + value); + } + + /** + * Fifth pass, produce Java byte code. + */ + public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { + il.append(new PUSH(cp, value)); ASTFunDecl.push(); + } + + void setValue(int value) { this.value = value; } + int getValue() { return value; } +} diff --git a/examples/Mini/ASTLetExpr.java b/examples/Mini/ASTLetExpr.java new file mode 100644 index 00000000..f1d90c27 --- /dev/null +++ b/examples/Mini/ASTLetExpr.java @@ -0,0 +1,159 @@ +/* Generated By:JJTree: Do not edit this line. ASTLetExpr.java */ +/* JJT: 0.3pre1 */ + +package Mini; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; + +/** + * + * @version $Id$ + * @author M. Dahm + */ +public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { + private ASTIdent[] idents; + private ASTExpr[] exprs; + private ASTExpr body; + + // Generated methods + ASTLetExpr(int id) { + super(id); + } + + ASTLetExpr(MiniParser p, int id) { + super(p, id); + } + + public static Node jjtCreate(MiniParser p, int id) { + return new ASTLetExpr(p, id); + } + + + /** + * Overrides ASTExpr.closeNode() + * Cast children nodes to appropiate types. + */ + public void closeNode() { + int i, len_2 = children.length / 2; /* length must be a multiple of + * two (ident = expr) + 1 (body expr) */ + idents = new ASTIdent[len_2]; + exprs = new ASTExpr[len_2]; + + // At least one assignment is enforced by the grammar + for(i=0; i < len_2; i++) { + idents[i] = (ASTIdent)children[i * 2]; + exprs[i] = (ASTExpr)children[i * 2 + 1]; + } + + body = (ASTExpr)children[children.length - 1]; // Last expr is the body + children=null; // Throw away old reference + } + + /** + * Overrides ASTExpr.traverse() + */ + public ASTExpr traverse(Environment env) { + this.env = env; + + // Traverse RHS exprs first, so no references to LHS vars are allowed + for(int i=0; i < exprs.length; i++) + exprs[i] = exprs[i].traverse((Environment)env.clone()); + + // Put argument names into hash table aka. environment + for(int i=0; i < idents.length; i++) { + ASTIdent id = idents[i]; + String name = id.getName(); + EnvEntry entry = env.get(name); + + if(entry != null) + MiniC.addError(id.getLine(), id.getColumn(), + "Redeclaration of " + entry + "."); + else + env.put(new Variable(id)); + } + + body = body.traverse(env); + + return this; + } + + /** + * Second pass + * Overrides AstExpr.eval() + * @return type of expression + * @param expected type + */ + public int eval(int expected) { + //is_simple = true; + + for(int i=0; i < idents.length; i++) { + int t = exprs[i].eval(T_UNKNOWN); + + idents[i].setType(t); + // is_simple = is_simple && exprs[i].isSimple(); + } + + return type = body.eval(expected); + } + + /** + * Fifth pass, produce Java code. + */ + public void code(StringBuffer buf) { + for(int i = 0; i < idents.length; i++) { + String ident = idents[i].getName(); + int t = idents[i].getType(); // can only be int + + /* Idents have to be declared at start of function for later use. + * Each name is unique, so there shouldn't be a problem in application. + */ + exprs[i].code(buf); + + buf.append(" " + TYPE_NAMES[t] + " " + ident + " = " + + ASTFunDecl.pop() + ";\n"); + } + + body.code(buf); + } + + /** + * Fifth pass, produce Java byte code. + */ + public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { + int size = idents.length; + LocalVariableGen[] l = new LocalVariableGen[size]; + + for(int i=0; i < size; i++) { + String ident = idents[i].getName(); + Variable entry = (Variable)env.get(ident); + Type t = BasicType.getType((byte)idents[i].getType()); + LocalVariableGen lg = method.addLocalVariable(ident, t, null, null); + int slot = lg.getIndex(); + + entry.setLocalVariable(lg); + InstructionHandle start = il.getEnd(); + exprs[i].byte_code(il, method, cp); + start = (start == null)? il.getStart() : start.getNext(); + lg.setStart(start); + il.append(new ISTORE(slot)); ASTFunDecl.pop(); + l[i] = lg; + } + + body.byte_code(il, method, cp); + InstructionHandle end = il.getEnd(); + for(int i=0; i < size; i++) + l[i].setEnd(end); + } + + public void dump(String prefix) { + System.out.println(toString(prefix)); + + for(int i=0; i < idents.length; i++) { + idents[i].dump(prefix + " "); + exprs[i].dump(prefix + " "); + } + + body.dump(prefix + " "); + } + +} diff --git a/examples/Mini/ASTProgram.java b/examples/Mini/ASTProgram.java new file mode 100644 index 00000000..7a2c3e7a --- /dev/null +++ b/examples/Mini/ASTProgram.java @@ -0,0 +1,301 @@ +/* Generated By:JJTree: Do not edit this line. ASTProgram.java */ +/* JJT: 0.3pre1 */ + +package Mini; +import java.io.PrintWriter; +import java.util.Vector; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; + +/** + * Root node of everything, direct children are nodes of type FunDecl + * + * @version $Id$ + * @author M. Dahm + */ +public class ASTProgram extends SimpleNode +implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constants { + private ASTFunDecl[] fun_decls; // Children: Function declarations + private Environment env; // Environment contains variables and functions + + ASTProgram(int id) { + super(id); + + env = new Environment(); + + /* Add predefined functions WRITE/READ. + * WRITE has one arg of type T_INT, both return T_INT. + */ + ASTIdent ident = new ASTIdent("WRITE", T_INT, -1, -1); + ASTIdent[] args = { new ASTIdent("", T_INT, -1, -1) }; + Function fun = new Function(ident, args, true); + env.put(fun); + + ident = new ASTIdent("READ", T_INT, -1, -1); + args = new ASTIdent[0]; + fun = new Function(ident, args, true); + env.put(fun); + + /* Add predefined idents TRUE/FALSE of type T_BOOLEAN + */ + ident = new ASTIdent("TRUE", T_BOOLEAN, -1, -1); + Variable var = new Variable(ident, true); + env.put(var); + + ident = new ASTIdent("FALSE", T_BOOLEAN, -1, -1); + var = new Variable(ident, true); + env.put(var); + } + + ASTProgram(MiniParser p, int id) { + super(p, id); + } + + public static Node jjtCreate(MiniParser p, int id) { + return new ASTProgram(p, id); + } + + /** + * Overrides SimpleNode.closeNode(). + * Cast children to appropiate type. + */ + public void closeNode() { + if(children != null) { // Non-empty program ? + fun_decls = new ASTFunDecl[children.length]; + System.arraycopy(children, 0, fun_decls, 0, children.length); + children=null; // Throw away old reference + } + } + + /** + * First pass of parse tree. + * + * Put everything into the environment, which is copied appropiately to each + * recursion level, i.e. each FunDecl gets its own copy that it can further + * manipulate. + * + * Checks for name clashes of function declarations. + */ + public ASTProgram traverse() { + ASTFunDecl f; + ASTIdent name; + String fname; + EnvEntry fun; + Function main=null; + + if(fun_decls != null) { + // Put function names into hash table aka. environment + for(int i=0; i < fun_decls.length; i++) { + f = fun_decls[i]; + name = f.getName(); + fname = name.getName(); + fun = env.get(fname); // Lookup in env + + if(fun != null) + MiniC.addError(f.getLine(), f.getColumn(), + "Redeclaration of " + fun + "."); + else + env.put(new Function(name, null)); // `args' will be set by FunDecl.traverse() + + + } + + // Go for it + for(int i=0; i < fun_decls.length; i++) { + fun_decls[i] = fun_decls[i].traverse((Environment)env.clone()); + + // Look for `main' routine + fname = fun_decls[i].getName().getName(); + if(fname.equals("main")) + main = (Function)env.get(fname); + } + + if(main == null) + MiniC.addError(0, 0, "You didn't declare a `main' function."); + else if(main.getNoArgs() != 0) + MiniC.addError(main.getLine(), main.getColumn(), + "Main function has too many arguments declared."); + } + + return this; + } + + /** + * Second pass, determine type of each node, if possible. + * @return type of expression + */ + public void eval(int pass) { + + for(int i=0; i < fun_decls.length; i++) { + fun_decls[i].eval(pass); + + if(pass == 3) { // Final check for unresolved types + ASTIdent name = fun_decls[i].getName(); + + if(name.getType() == T_UNKNOWN) + MiniC.addError(name.getColumn(), name.getLine(), + "Type of function " + name.getName() + + " can not be determined (infinite recursion?)."); + } + } + } + + /** + * Fifth pass, produce Java code. + */ + public void code(PrintWriter out, String name) { + out.println("import java.io.BufferedReader;"); + out.println("import java.io.InputStreamReader;"); + out.println("import java.io.IOException;\n"); + + out.println("public final class " + name + " {"); + out.println(" private static BufferedReader _in = new BufferedReader" + + "(new InputStreamReader(System.in));\n"); + + out.println(" private static final int _readInt() throws IOException {\n" + + " System.out.print(\"Please enter a number> \");\n" + + " return Integer.parseInt(_in.readLine());\n }\n"); + + out.println(" private static final int _writeInt(int n) {\n" + + " System.out.println(\"Result: \" + n);\n return 0;\n }\n"); + + for(int i=0; i < fun_decls.length; i++) + fun_decls[i].code(out); + + out.println("}"); + } + + /** + * Fifth pass, produce Java byte code. + */ + public void byte_code(ClassGen class_gen, ConstantPoolGen cp) { + /* private static BufferedReader _in; + */ + class_gen.addField(new Field(ACC_PRIVATE | ACC_STATIC, + cp.addUtf8("_in"), + cp.addUtf8("Ljava/io/BufferedReader;"), + null, cp.getConstantPool())); + + MethodGen method; + Method m; + InstructionList il = new InstructionList(); + byte[] byte_code; + String class_name = class_gen.getClassName(); + + /* Often used constant pool entries + */ + int _in = cp.addFieldref(class_name, "_in", "Ljava/io/BufferedReader;"); + + int out = cp.addFieldref("java.lang.System", "out", + "Ljava/io/PrintStream;"); + + il.append(new GETSTATIC(out)); + il.append(new PUSH(cp, "Please enter a number> ")); + il.append(new INVOKEVIRTUAL(cp.addMethodref("java.io.PrintStream", + "print", + "(Ljava/lang/String;)V"))); + il.append(new GETSTATIC(_in)); + il.append(new INVOKEVIRTUAL(cp.addMethodref("java.io.BufferedReader", + "readLine", + "()Ljava/lang/String;"))); + il.append(new INVOKESTATIC(cp.addMethodref("java.lang.Integer", + "parseInt", + "(Ljava/lang/String;)I"))); + il.append(InstructionConstants.IRETURN); + + /* private static final int _readInt() throws IOException + */ + method = new MethodGen(ACC_STATIC | ACC_PRIVATE | ACC_FINAL, + Type.INT, Type.NO_ARGS, null, + "_readInt", class_name, il, cp); + + method.addException("java.io.IOException"); + + method.setMaxStack(2); + class_gen.addMethod(method.getMethod()); + + /* private static final int _writeInt(int i) throws IOException + */ + Type[] args = { Type.INT }; + String[] argv = { "i" } ; + il = new InstructionList(); + il.append(new GETSTATIC(out)); + il.append(new NEW(cp.addClass("java.lang.StringBuffer"))); + il.append(InstructionConstants.DUP); + il.append(new PUSH(cp, "Result: ")); + il.append(new INVOKESPECIAL(cp.addMethodref("java.lang.StringBuffer", + "", + "(Ljava/lang/String;)V"))); + + il.append(new ILOAD(0)); + il.append(new INVOKEVIRTUAL(cp.addMethodref("java.lang.StringBuffer", + "append", + "(I)Ljava/lang/StringBuffer;"))); + + il.append(new INVOKEVIRTUAL(cp.addMethodref("java.lang.StringBuffer", + "toString", + "()Ljava/lang/String;"))); + + il.append(new INVOKEVIRTUAL(cp.addMethodref("java.io.PrintStream", + "println", + "(Ljava/lang/String;)V"))); + il.append(new PUSH(cp, 0)); + il.append(InstructionConstants.IRETURN); // Reuse objects, if possible + + method = new MethodGen(ACC_STATIC | ACC_PRIVATE | ACC_FINAL, + Type.INT, args, argv, + "_writeInt", class_name, il, cp); + + method.setMaxStack(4); + class_gen.addMethod(method.getMethod()); + + /* public -- constructor + */ + il.dispose(); // Dispose instruction handles for better memory utilization + + il = new InstructionList(); + il.append(new ALOAD(0)); // Push `this' + il.append(new INVOKESPECIAL(cp.addMethodref("java.lang.Object", + "", "()V"))); + il.append(new RETURN()); + + method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, null, + "", class_name, il, cp); + + method.setMaxStack(1); + class_gen.addMethod(method.getMethod()); + + /* class initializer + */ + il.dispose(); // Dispose instruction handles for better memory utilization + il = new InstructionList(); + il.append(new NEW(cp.addClass("java.io.BufferedReader"))); + il.append(InstructionConstants.DUP); + il.append(new NEW(cp.addClass("java.io.InputStreamReader"))); + il.append(InstructionConstants.DUP); + il.append(new GETSTATIC(cp.addFieldref("java.lang.System", "in", + "Ljava/io/InputStream;"))); + il.append(new INVOKESPECIAL(cp.addMethodref("java.io.InputStreamReader", + "", "(Ljava/io/InputStream;)V"))); + il.append(new INVOKESPECIAL(cp.addMethodref("java.io.BufferedReader", + "", "(Ljava/io/Reader;)V"))); + il.append(new PUTSTATIC(_in)); + il.append(InstructionConstants.RETURN); // Reuse instruction constants + + method = new MethodGen(ACC_STATIC, Type.VOID, Type.NO_ARGS, null, + "", class_name, il, cp); + + method.setMaxStack(5); + class_gen.addMethod(method.getMethod()); + + for(int i=0; i < fun_decls.length; i++) + fun_decls[i].byte_code(class_gen, cp); + } + + public void dump(String prefix) { + System.out.println(toString(prefix)); + + for(int i = 0; i < fun_decls.length; ++i) + fun_decls[i].dump(prefix + " "); + } +} diff --git a/examples/Mini/ASTTerm.java b/examples/Mini/ASTTerm.java new file mode 100644 index 00000000..eed7c9bf --- /dev/null +++ b/examples/Mini/ASTTerm.java @@ -0,0 +1,37 @@ +/* Generated By:JJTree: Do not edit this line. ASTTerm.java */ +/* JJT: 0.3pre1 */ + +package Mini; + +/** + * + * @version $Id$ + * @author M. Dahm + */ +public class ASTTerm extends ASTExpr { + // Generated methods + ASTTerm(int id) { + super(id); + } + + ASTTerm(MiniParser p, int id) { + super(p, id); + } + + public static Node jjtCreate(MiniParser p, int id) { + return new ASTTerm(p, id); + } + + // Inherited closeNode(), dump() + + /** + * Drop this node, if kind == -1, because then it has just one child node + * and may be safely replaced with it. + */ + public ASTExpr traverse(Environment env) { + if(kind == -1) // Drop it + return exprs[0].traverse(env); + else // Or convert it to Expr node, copy children + return new ASTExpr(exprs, kind, line, column).traverse(env); + } +} diff --git a/examples/Mini/EnvEntry.java b/examples/Mini/EnvEntry.java new file mode 100644 index 00000000..bc82cea9 --- /dev/null +++ b/examples/Mini/EnvEntry.java @@ -0,0 +1,13 @@ +package Mini; + +/** + * Entry in environment. + * + * @version $Id$ + * @author M. Dahm + */ +public interface EnvEntry { + public String getHashKey(); + public int getLine(); + public int getColumn(); +} diff --git a/examples/Mini/Environment.java b/examples/Mini/Environment.java new file mode 100644 index 00000000..9c30e025 --- /dev/null +++ b/examples/Mini/Environment.java @@ -0,0 +1,184 @@ +package Mini; + +import java.util.Vector; + +/** + * For efficiency and convenience reasons we want our own hash table. It does + * not conform to java.util.Dictionary(yet). + * + * That environment contains all function definitions and identifiers. + * Hash keys are Strings (identifiers), which are mapped to a table index. + * + * The table consists of `SIZE' fields which have `SLOTS' subfields. Thus + * the maximum number of storable items is `SLOTS' * `SIZE'. + * + * @version $Id$ + * @author M. Dahm + */ +public class Environment implements Cloneable { + private static final int SIZE = 127; // Prime number large enough for most cases + private static final int SLOTS = 3; // Number of slots of each field + + private int size; // The table is an array of + private Vector[] table; // Vectors + private int elements=0; + + public Environment(int size) { + this.size = size; + table = new Vector[size]; + } + + private Environment(Vector[] table) { + size = table.length; + this.table = table; + } + + public Environment() { + this(SIZE); + } + + private final int hashCode(String key) { + return Math.abs(key.hashCode()) % size; + } + + /** + * Inserts macro into table or overwrite old contents if it + * was already stored. + */ + public void put(EnvEntry obj) { + int hash; + Vector v; + String key = obj.getHashKey(); + + hash = hashCode(key); + v = table[hash]; + + elements++; // Count + + if(v == null) // Not yet initialized + table[hash] = v = new Vector(SLOTS); + else { + try { + int index = lookup(v, key); + + if(index >= 0) { + v.setElementAt(obj, index); // Overwrite + return; + } + } catch(ArrayIndexOutOfBoundsException e) {} + } + + // Not found in Vector -> add it + v.addElement(obj); + } + + /** Get entry from hash table. + */ + public EnvEntry get(String key) { + int hash; + Vector v; + EnvEntry entry = null; + + hash = hashCode(key); + v = table[hash]; + + if(v == null) + return null; + + try { + int index = lookup(v, key); + + if(index >= 0) + entry = (EnvEntry)v.elementAt(index); + } catch(ArrayIndexOutOfBoundsException e) {} + + return entry; + } + + /** + * Delete an object if it does exist. + */ + public void delete(String key) { + int hash; + Vector v; + + hash = hashCode(key); + v = table[hash]; + + if(v == null) + return; + + try { + int index = lookup(v, key); + + if(index >= 0) { + elements--; // Count + v.removeElementAt(index); + } + } catch(ArrayIndexOutOfBoundsException e) {} + } + + private static final int lookup(Vector v, String key) + throws ArrayIndexOutOfBoundsException + { + int len = v.size(); + + for(int i=0; i < len; i++) { + EnvEntry entry = (EnvEntry)v.elementAt(i); + + if(entry.getHashKey().equals(key)) // Found index + return i; + } + + return -1; + } + + public Object clone() { + Vector[] copy = new Vector[size]; + + for(int i=0; i < size; i++) { + if(table[i] != null) { + copy[i] = (Vector)table[i].clone(); // Copies references + + /* + int len = table[i].size(); + + copy[i] = new Vector(len); + try { + for(int j=0; j < len; j++) + copy[i].addElement(table[i].elementAt(j)); + } catch(ArrayIndexOutOfBoundsException e) {}*/ + } + } + + return new Environment(copy); + } + + public String toString() { + StringBuffer buf = new StringBuffer(); + + for(int i=0; i < size; i++) + if(table[i] != null) + buf.append(table[i] + "\n"); + + return buf.toString(); + } + + public EnvEntry[] getEntries() { + EnvEntry[] entries = new EnvEntry[elements]; + int k = 0; + Vector v; + + for(int i=0; i < size; i++) { + if((v = table[i]) != null) { + int len = v.size(); + try { + for(int j=0; j < len; j++) + entries[k++] = (EnvEntry)v.elementAt(j); + } catch(ArrayIndexOutOfBoundsException e) {} + } + } + + return entries; + } +} diff --git a/examples/Mini/Function.java b/examples/Mini/Function.java new file mode 100644 index 00000000..1ccc0d3e --- /dev/null +++ b/examples/Mini/Function.java @@ -0,0 +1,63 @@ +package Mini; + +/** + * Represents a function declaration and its arguments. Type information is contained + * in the ASTIdent fields. + * + * @version $Id$ + * @author M. Dahm + */ +public class Function implements org.apache.bcel.Constants, EnvEntry { + private ASTIdent name; // Reference to the original declaration + private ASTIdent[] args; // Reference to argument identifiers + private ASTExpr body; // Reference to function expression body + private boolean reserved; // Is a key word? + private int line, column; // Short for name.getToken() + private String fun_name; // Short for name.getName() + private int no_args; + + public Function(ASTIdent name, ASTIdent[] args) { + this(name, args, false); + } + + public Function(ASTIdent name, ASTIdent[] args, boolean reserved) { + this.name = name; + this.args = args; + this.reserved = reserved; + + fun_name = name.getName(); + line = name.getLine(); + column = name.getColumn(); + setArgs(args); + } + + public String toString() { + StringBuffer buf = new StringBuffer(); + + for(int i=0; i < no_args; i++) { + buf.append(args[i].getName()); + + if(i < no_args - 1) + buf.append(", "); + } + + String prefix = "Function " + fun_name + "(" + buf.toString() + ")"; + + if(!reserved) + return prefix + " declared at line " + line + ", column " + column; + else + return prefix + " "; + } + + public int getNoArgs() { return no_args; } + public ASTIdent getName() { return name; } + public String getHashKey() { return fun_name; } + public int getLine() { return line; } + public int getColumn() { return column; } + public ASTIdent getArg(int i) { return args[i]; } + public ASTIdent[] getArgs() { return args; } + public void setArgs(ASTIdent[] args) { + this.args = args; + no_args = (args == null)? 0 : args.length; + } +} diff --git a/examples/Mini/JJTMiniParserState.java b/examples/Mini/JJTMiniParserState.java new file mode 100644 index 00000000..dec0e0b1 --- /dev/null +++ b/examples/Mini/JJTMiniParserState.java @@ -0,0 +1,123 @@ +/* Generated By:JJTree: Do not edit this line. JJTMiniParserState.java */ + +package Mini; + +class JJTMiniParserState { + private java.util.Stack nodes; + private java.util.Stack marks; + + private int sp; // number of nodes on stack + private int mk; // current mark + private boolean node_created; + + JJTMiniParserState() { + nodes = new java.util.Stack(); + marks = new java.util.Stack(); + sp = 0; + mk = 0; + } + + /* Determines whether the current node was actually closed and + pushed. This should only be called in the final user action of a + node scope. */ + boolean nodeCreated() { + return node_created; + } + + /* Call this to reinitialize the node stack. It is called + automatically by the parser's ReInit() method. */ + void reset() { + nodes.removeAllElements(); + marks.removeAllElements(); + sp = 0; + mk = 0; + } + + /* Returns the root node of the AST. It only makes sense to call + this after a successful parse. */ + Node rootNode() { + return (Node)nodes.elementAt(0); + } + + /* Pushes a node on to the stack. */ + void pushNode(Node n) { + nodes.push(n); + ++sp; + } + + /* Returns the node on the top of the stack, and remove it from the + stack. */ + Node popNode() { + if (--sp < mk) { + mk = ((Integer)marks.pop()).intValue(); + } + return (Node)nodes.pop(); + } + + /* Returns the node currently on the top of the stack. */ + Node peekNode() { + return (Node)nodes.peek(); + } + + /* Returns the number of children on the stack in the current node + scope. */ + int nodeArity() { + return sp - mk; + } + + + void clearNodeScope(Node n) { + while (sp > mk) { + popNode(); + } + mk = ((Integer)marks.pop()).intValue(); + } + + + void openNodeScope(Node n) { + marks.push(new Integer(mk)); + mk = sp; + n.jjtOpen(); + } + + + /* A definite node is constructed from a specified number of + children. That number of nodes are popped from the stack and + made the children of the definite node. Then the definite node + is pushed on to the stack. */ + void closeNodeScope(Node n, int num) { + mk = ((Integer)marks.pop()).intValue(); + while (num-- > 0) { + Node c = popNode(); + c.jjtSetParent(n); + n.jjtAddChild(c, num); + } + n.jjtClose(); + pushNode(n); + node_created = true; + } + + + /* A conditional node is constructed if its condition is true. All + the nodes that have been pushed since the node was opened are + made children of the the conditional node, which is then pushed + on to the stack. If the condition is false the node is not + constructed and they are left on the stack. */ + void closeNodeScope(Node n, boolean condition) { + if (condition) { + int a = nodeArity(); + mk = ((Integer)marks.pop()).intValue(); + while (a-- > 0) { + Node c = popNode(); + c.jjtSetParent(n); + n.jjtAddChild(c, a); + } + n.jjtClose(); + pushNode(n); + node_created = true; + } else { + mk = ((Integer)marks.pop()).intValue(); + node_created = false; + } + } +} diff --git a/examples/Mini/Mini.bnf b/examples/Mini/Mini.bnf new file mode 100644 index 00000000..5b460172 --- /dev/null +++ b/examples/Mini/Mini.bnf @@ -0,0 +1,75 @@ +Program: + (FunDecl)* + +FunDecl: + "FUN" Ident "=" Expr + +Expr: + "(" Expr ")" +| + Expr AddOp Expr +| + Expr MultOp Expr +| + Expr CmpOp Expr +| + Ident +| + Number +| + FunAppl +| + UnOp Expr +| + IfExpr + +IfExpr: + "IF" Expr "THEN" Expr ["ELSE" Expr] "FI" + +FunAppl: + Ident "(" [Expr ("," Expr)*] ")" + +AddOp: + ("+" | "-" | "OR") + +MultOp: + ("*" | "/" | "%" | "AND") + +CmpOp: + ("==" | "!=" | "<=" | ">=" | ">" | "<"") + +UnOp: + ("-" | "!") + +Ident: + LETTER (LETTER|DIGIT)* + +Number: + DIGIT+ + +LETTER: + [a-zA-Z] + +DIGIT: + [0-9] + +--------------------------------------------------------- +Expr: + Term [AddOp Term] +| + UnOp Expr +| + FunAppl + +Term: + Factor [MultOp Factor] + +Factor: + Element [CmpOp Element] + +Element: + Ident +| + Number +| + "(" Expr ")" diff --git a/examples/Mini/Mini.jj b/examples/Mini/Mini.jj new file mode 100644 index 00000000..c84c8312 --- /dev/null +++ b/examples/Mini/Mini.jj @@ -0,0 +1,576 @@ +/*@bgen(jjtree) Generated By:JJTree: Do not edit this line. Mini.jj */ +/*@egen*/ + +PARSER_BEGIN(MiniParser) +package Mini; + +public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants/*@egen*/ {/*@bgen(jjtree)*/ + protected static JJTMiniParserState jjtree = new JJTMiniParserState(); + +/*@egen*/ + private static Token expr_token; + + final static void jjtreeOpenNodeScope(Node n) {} + final static void jjtreeCloseNodeScope(Node n) {((SimpleNode)n).closeNode();} +} + +PARSER_END(MiniParser) + +SKIP : /* WHITE SPACE */ +{ + " " +| "\t" +| "\n" +| "\r" +| "\f" +} + +/* Single-line Comments + */ +MORE : +{ + "--" : SINGLE_LINE_COMMENT_STATE +} + + SPECIAL_TOKEN : +{ + : DEFAULT +} + + MORE : +{ + < ~[] > +} + +/* A program consists of a number of function declarations with a + * distinguished function `main' that starts the program. + */ +void Program() : {/*@bgen(jjtree) Program */ + ASTProgram jjtn000 = new ASTProgram(JJTPROGRAM); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000); +/*@egen*/} +{/*@bgen(jjtree) Program */ + try { +/*@egen*/ + (FunDecl())* + /*@bgen(jjtree)*/ + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + throw (ParseException)jjte000; + } + if (jjte000 instanceof RuntimeException) { + throw (RuntimeException)jjte000; + } + throw (Error)jjte000; + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } +/*@egen*/ +} + +/* "FUN" Ident() "(" NameList() ")" = Expr() + */ +void FunDecl() : +{/*@bgen(jjtree) FunDecl */ + ASTFunDecl jjtn000 = new ASTFunDecl(JJTFUNDECL); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000); +/*@egen*/ + String s; + Token t; +} +{/*@bgen(jjtree) FunDecl */ + try { +/*@egen*/ + t = "FUN" { jjtn000.setPosition(t.beginLine, t.beginColumn); } + + Ident() + + + [ + Ident() ( Ident())* + ] + + + + + Expr()/*@bgen(jjtree)*/ + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + throw (ParseException)jjte000; + } + if (jjte000 instanceof RuntimeException) { + throw (RuntimeException)jjte000; + } + throw (Error)jjte000; + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } +/*@egen*/ /* Body expression */ +} + +void Expr() : +{/*@bgen(jjtree) Expr */ + ASTExpr jjtn000 = new ASTExpr(JJTEXPR); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000); +/*@egen*/ + int kind=-1; + int un_op=-1; +} +{/*@bgen(jjtree) Expr */ + try { +/*@egen*/ + IfExpr() +| + LetExpr() +| + Term() [kind = AddOp() Expr() { jjtn000.setKind(kind); }] +| + un_op = UnOp() { jjtn000.setUnOp(un_op); } Expr()/*@bgen(jjtree)*/ + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + throw (ParseException)jjte000; + } + if (jjte000 instanceof RuntimeException) { + throw (RuntimeException)jjte000; + } + throw (Error)jjte000; + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } +/*@egen*/ +} + +/* + * The disambiguating algorithm of JavaCC automatically binds dangling + * else's to the innermost if statement. The LOOKAHEAD specification + * is to tell JavaCC that we know what we are doing. + */ +void IfExpr() : +{/*@bgen(jjtree) IfExpr */ + ASTIfExpr jjtn000 = new ASTIfExpr(JJTIFEXPR); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000); +/*@egen*/ + Token t=null; +} +{/*@bgen(jjtree) IfExpr */ + try { +/*@egen*/ + t = "IF" { jjtn000.setPosition(t.beginLine, t.beginColumn); } + Expr() "THEN" Expr() [ LOOKAHEAD(1) "ELSE" Expr() ] "FI"/*@bgen(jjtree)*/ + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + throw (ParseException)jjte000; + } + if (jjte000 instanceof RuntimeException) { + throw (RuntimeException)jjte000; + } + throw (Error)jjte000; + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } +/*@egen*/ +} + +void LetExpr() : +{/*@bgen(jjtree) LetExpr */ + ASTLetExpr jjtn000 = new ASTLetExpr(JJTLETEXPR); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000); +/*@egen*/ + Token t=null; +} +{/*@bgen(jjtree) LetExpr */ + try { +/*@egen*/ + t = "LET" { jjtn000.setPosition(t.beginLine, t.beginColumn); } + (Ident() Expr())+ "IN" Expr()/*@bgen(jjtree)*/ + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + throw (ParseException)jjte000; + } + if (jjte000 instanceof RuntimeException) { + throw (RuntimeException)jjte000; + } + throw (Error)jjte000; + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } +/*@egen*/ +} + +Token FunAppl() : +{/*@bgen(jjtree) FunAppl */ + ASTFunAppl jjtn000 = new ASTFunAppl(JJTFUNAPPL); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000); +/*@egen*/ + Token t=null; +} +{/*@bgen(jjtree) FunAppl */ + try { +/*@egen*/ + t = Ident() { jjtn000.setPosition(t.beginLine, t.beginColumn); } + + [Expr() ( Expr())*] /*@bgen(jjtree)*/ + { + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtreeCloseNodeScope(jjtn000); + } +/*@egen*/ + { return t; }/*@bgen(jjtree)*/ + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + throw (ParseException)jjte000; + } + if (jjte000 instanceof RuntimeException) { + throw (RuntimeException)jjte000; + } + throw (Error)jjte000; + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } +/*@egen*/ + +} + +void Term(): +{/*@bgen(jjtree) Term */ + ASTTerm jjtn000 = new ASTTerm(JJTTERM); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000); +/*@egen*/ + int kind=-1; +} +{/*@bgen(jjtree) Term */ + try { +/*@egen*/ + Factor() [kind = MultOp() { jjtn000.setKind(kind); } Term()]/*@bgen(jjtree)*/ + { + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtreeCloseNodeScope(jjtn000); + } +/*@egen*/ + { jjtn000.setPosition(expr_token.beginLine, expr_token.beginColumn); }/*@bgen(jjtree)*/ + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + throw (ParseException)jjte000; + } + if (jjte000 instanceof RuntimeException) { + throw (RuntimeException)jjte000; + } + throw (Error)jjte000; + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } +/*@egen*/ +} + +void Factor() : +{/*@bgen(jjtree) Factor */ + ASTFactor jjtn000 = new ASTFactor(JJTFACTOR); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000); +/*@egen*/ + int kind=-1; +} +{/*@bgen(jjtree) Factor */ + try { +/*@egen*/ + Element() [kind = CmpOp() { jjtn000.setKind(kind); } Factor()]/*@bgen(jjtree)*/ + { + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtreeCloseNodeScope(jjtn000); + } +/*@egen*/ + { jjtn000.setPosition(expr_token.beginLine, expr_token.beginColumn); }/*@bgen(jjtree)*/ + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + throw (ParseException)jjte000; + } + if (jjte000 instanceof RuntimeException) { + throw (RuntimeException)jjte000; + } + throw (Error)jjte000; + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } +/*@egen*/ +} + +void Element() : {} +{ +/* expr_token is a global variable used to remember the position of an Expr() node +*/ + LOOKAHEAD(2) + expr_token = FunAppl() +| + expr_token = Ident() +| + expr_token = Integer() +| + expr_token = Expr() +} + +Token Integer() : +{/*@bgen(jjtree) Integer */ + ASTInteger jjtn000 = new ASTInteger(JJTINTEGER); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000); +/*@egen*/ + int num; + Token t; // Contains lexem and line/column number +} +{/*@bgen(jjtree) Integer */ + try { +/*@egen*/ + t = /*@bgen(jjtree)*/ + { + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtreeCloseNodeScope(jjtn000); + } +/*@egen*/ + { + jjtn000.setValue(Integer.parseInt(t.image)); + jjtn000.setPosition(t.beginLine, t.beginColumn); + return t; + }/*@bgen(jjtree)*/ + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } +/*@egen*/ +} + +Token Ident() : +{/*@bgen(jjtree) Ident */ + ASTIdent jjtn000 = new ASTIdent(JJTIDENT); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000); +/*@egen*/ + String name; + Token t; // Contains lexem and line/column number +} +{/*@bgen(jjtree) Ident */ + try { +/*@egen*/ + (t = | t = | t = | t = | + t = )/*@bgen(jjtree)*/ + { + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtreeCloseNodeScope(jjtn000); + } +/*@egen*/ + { + jjtn000.setName(t.image); + jjtn000.setPosition(t.beginLine, t.beginColumn); + return t; + }/*@bgen(jjtree)*/ + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } +/*@egen*/ +} + +int AddOp() : +{ + Token t=null; +} +{ + (t = | t = | t = ) + { + return t.kind; + } +} + +int MultOp() : +{ + Token t=null; +} +{ + (t = | t =
| t = | t = ) + { + return t.kind; + } +} + +int CmpOp() : +{ + Token t=null; +} +{ + (t = | t = | t = | t = | t = | t = ) + { + return t.kind; + } +} + +int UnOp() : +{ + Token t=null; +} +{ + (t = | t = ) + { + return t.kind; + } +} + + +TOKEN : /* Boolean and arithmetic operands */ +{ + < GT : ">" > +| + < LT : "<" > +| + < GEQ : ">=" > +| + < LEQ : "<=" > +| + < EQ : "==" > +| + < NEQ : "!=" > +| + < NOT : "!" > +| + < FALSE : "FALSE" > +| + < TRUE : "TRUE" > +| + < AND : "AND" > +| + < OR : "OR" > +| + < PLUS : "+"> +| + < MINUS : "-"> +| + < MULT : "*"> +| + < MOD : "%"> +| + < DIV : "/"> +| + < LPAREN : "("> +| + < RPAREN : ")"> +| + < ASSIGN : "="> +| + < COMMA : ","> +| + < READ : "READ"> +| + < WRITE : "WRITE"> +} + +/* Has to be and the, otherwise every string wil become an token + * Who knows why ... + */ +TOKEN : /* LITERALS */ +{ + < #DIGIT: ["0"-"9"] > +| + < #LETTER: ["a"-"z", "A"-"Z"] > +| + < IDENT: ( | | "_")* > +| + < INTEGER: ()+ > +| + < STRING: "\"" (~["\"", "\n", "\r"])* "\"" > +} diff --git a/examples/Mini/Mini.jjt b/examples/Mini/Mini.jjt new file mode 100644 index 00000000..568c0a49 --- /dev/null +++ b/examples/Mini/Mini.jjt @@ -0,0 +1,293 @@ +options { + MULTI=true; + NODE_SCOPE_HOOK=true; /* Call methods on entry/exit of node */ +} + +PARSER_BEGIN(MiniParser) +package Mini; + +public class MiniParser { + private static Token expr_token; + + final static void jjtreeOpenNodeScope(Node n) {} + final static void jjtreeCloseNodeScope(Node n) {((SimpleNode)n).closeNode();} +} + +PARSER_END(MiniParser) + +SKIP : /* WHITE SPACE */ +{ + " " +| "\t" +| "\n" +| "\r" +| "\f" +} + +/* Single-line Comments + */ +MORE : +{ + "--" : SINGLE_LINE_COMMENT_STATE +} + + SPECIAL_TOKEN : +{ + : DEFAULT +} + + MORE : +{ + < ~[] > +} + +/* A program consists of a number of function declarations with a + * distinguished function `main' that starts the program. + */ +void Program() : {} +{ + (FunDecl())* + +} + +/* "FUN" Ident() "(" NameList() ")" = Expr() + */ +void FunDecl() : +{ + String s; + Token t; +} +{ + t = "FUN" { jjtThis.setPosition(t.beginLine, t.beginColumn); } + + Ident() + + + [ + Ident() ( Ident())* + ] + + + + + Expr() /* Body expression */ +} + +void Expr() : +{ + int kind=-1; + int un_op=-1; +} +{ + IfExpr() +| + LetExpr() +| + Term() [kind = AddOp() Expr() { jjtThis.setKind(kind); }] +| + un_op = UnOp() { jjtThis.setUnOp(un_op); } Expr() +} + +/* + * The disambiguating algorithm of JavaCC automatically binds dangling + * else's to the innermost if statement. The LOOKAHEAD specification + * is to tell JavaCC that we know what we are doing. + */ +void IfExpr() : +{ + Token t=null; +} +{ + t = "IF" { jjtThis.setPosition(t.beginLine, t.beginColumn); } + Expr() "THEN" Expr() [ LOOKAHEAD(1) "ELSE" Expr() ] "FI" +} + +void LetExpr() : +{ + Token t=null; +} +{ + t = "LET" { jjtThis.setPosition(t.beginLine, t.beginColumn); } + (Ident() Expr())+ "IN" Expr() +} + +Token FunAppl() : +{ + Token t=null; +} +{ + t = Ident() { jjtThis.setPosition(t.beginLine, t.beginColumn); } + + [Expr() ( Expr())*] + { return t; } + +} + +void Term(): +{ + int kind=-1; +} +{ + Factor() [kind = MultOp() { jjtThis.setKind(kind); } Term()] + { jjtThis.setPosition(expr_token.beginLine, expr_token.beginColumn); } +} + +void Factor() : +{ + int kind=-1; +} +{ + Element() [kind = CmpOp() { jjtThis.setKind(kind); } Factor()] + { jjtThis.setPosition(expr_token.beginLine, expr_token.beginColumn); } +} + +void Element() #void : {} +{ +/* expr_token is a global variable used to remember the position of an Expr() node +*/ + LOOKAHEAD(2) + expr_token = FunAppl() +| + expr_token = Ident() +| + expr_token = Integer() +| + expr_token = Expr() +} + +Token Integer() : +{ + int num; + Token t; // Contains lexem and line/column number +} +{ + t = + { + jjtThis.setValue(Integer.parseInt(t.image)); + jjtThis.setPosition(t.beginLine, t.beginColumn); + return t; + } +} + +Token Ident() : +{ + String name; + Token t; // Contains lexem and line/column number +} +{ + (t = | t = | t = | t = | + t = ) + { + jjtThis.setName(t.image); + jjtThis.setPosition(t.beginLine, t.beginColumn); + return t; + } +} + +int AddOp() #void : +{ + Token t=null; +} +{ + (t = | t = | t = ) + { + return t.kind; + } +} + +int MultOp() #void : +{ + Token t=null; +} +{ + (t = | t =
| t = | t = ) + { + return t.kind; + } +} + +int CmpOp() #void : +{ + Token t=null; +} +{ + (t = | t = | t = | t = | t = | t = ) + { + return t.kind; + } +} + +int UnOp() #void : +{ + Token t=null; +} +{ + (t = | t = ) + { + return t.kind; + } +} + + +TOKEN : /* Boolean and arithmetic operands */ +{ + < GT : ">" > +| + < LT : "<" > +| + < GEQ : ">=" > +| + < LEQ : "<=" > +| + < EQ : "==" > +| + < NEQ : "!=" > +| + < NOT : "!" > +| + < FALSE : "FALSE" > +| + < TRUE : "TRUE" > +| + < AND : "AND" > +| + < OR : "OR" > +| + < PLUS : "+"> +| + < MINUS : "-"> +| + < MULT : "*"> +| + < MOD : "%"> +| + < DIV : "/"> +| + < LPAREN : "("> +| + < RPAREN : ")"> +| + < ASSIGN : "="> +| + < COMMA : ","> +| + < READ : "READ"> +| + < WRITE : "WRITE"> +} + +/* Has to be and the, otherwise every string wil become an token + * Who knows why ... + */ +TOKEN : /* LITERALS */ +{ + < #DIGIT: ["0"-"9"] > +| + < #LETTER: ["a"-"z", "A"-"Z"] > +| + < IDENT: ( | | "_")* > +| + < INTEGER: ()+ > +| + < STRING: "\"" (~["\"", "\n", "\r"])* "\"" > +} diff --git a/examples/Mini/MiniC.java b/examples/Mini/MiniC.java new file mode 100644 index 00000000..6052aca7 --- /dev/null +++ b/examples/Mini/MiniC.java @@ -0,0 +1,154 @@ +package Mini; +import java.util.Vector; +import java.io.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; + +public class MiniC implements org.apache.bcel.Constants { + private static Vector errors = null; + private static Vector warnings = null; + private static String file = null; + private static int pass = 0; + + public static void main(String[] argv) { + String[] file_name = new String[argv.length]; + int files=0; + MiniParser parser=null; + String base_name=null; + boolean byte_code=true; + + try { + /* Parse command line arguments. + */ + for(int i=0; i < argv.length; i++) { + if(argv[i].charAt(0) == '-') { // command line switch + if(argv[i].equals("-java")) + byte_code=false; + else if(argv[i].equals("-bytecode")) + byte_code=true; + else + throw new Exception("Unknown option: " + argv[i]); + } + else { // add file name to list + file_name[files++] = argv[i]; + } + } + + if(files == 0) + System.err.println("Nothing to compile."); + + for(int j=0; j < files; j++) { + errors = new Vector(); + warnings = new Vector(); + pass = 0; + + if(j == 0) + parser = new MiniParser(new java.io.FileInputStream(file_name[0])); + else + parser.ReInit(new java.io.FileInputStream(file_name[j])); + + int index = file_name[j].lastIndexOf('.'); + if(index > 0) + base_name = file_name[j].substring(0, index); + else + base_name = file_name[j]; + + if((index = base_name.lastIndexOf(File.separatorChar)) > 0) + base_name = base_name.substring(index + 1); + + file = file_name[j]; + + System.out.println("Parsing ..."); + parser.Program(); + ASTProgram program = (ASTProgram)parser.jjtree.rootNode(); + + System.out.println("Pass 1: Optimizing parse tree ..."); + pass = 1; + program = program.traverse(); + // program.dump(">"); + + if(errors.size() == 0) { + System.out.println("Pass 2: Type checking (I) ..."); + program.eval(pass=2); + } + + if(errors.size() == 0) { + System.out.println("Pass 3: Type checking (II) ..."); + program.eval(pass=3); + } + + for(int i=0; i < errors.size(); i++) + System.out.println(errors.elementAt(i)); + + for(int i=0; i < warnings.size(); i++) + System.out.println(warnings.elementAt(i)); + + if(errors.size() == 0) { + if(byte_code) { + System.out.println("Pass 5: Generating byte code ..."); + ClassGen class_gen = new ClassGen(base_name, "java.lang.Object", + file_name[j], + ACC_PUBLIC | ACC_FINAL | + ACC_SUPER, null); + ConstantPoolGen cp = class_gen.getConstantPool(); + + program.byte_code(class_gen, cp); + JavaClass clazz = class_gen.getJavaClass(); + clazz.dump(base_name + ".class"); + } + else { + System.out.println("Pass 5: Generating Java code ..."); + PrintWriter out = new PrintWriter(new FileOutputStream(base_name + ".java")); + program.code(out, base_name); + out.close(); + + System.out.println("Pass 6: Compiling Java code ..."); + + String[] args = { "javac", base_name + ".java" }; + //sun.tools.javac.Main compiler = new sun.tools.javac.Main(System.err, "javac"); + try { + Process p = Runtime.getRuntime().exec(args); + p.waitFor(); + } catch(Exception e) {System.out.println(e); } + + //compiler.compile(args); + } + } + + if((errors.size() > 0) || (warnings.size() > 0)) + System.out.println(errors.size() + " errors and " + warnings.size() + + " warnings."); + } + } catch(Exception e) { e.printStackTrace(); } + } + + + final static void addError(int line, int column, String err) { + if(pass != 2) + errors.addElement(file + ":" + fillup(line, 3) + "," + fillup(column, 2) + + ": " + err); + } + + final static void addWarning(int line, int column, String err) { + warnings.addElement("Warning: " + file + ":" + fillup(line, 3) + "," + + fillup(column, 3) + ": " + err); + } + + final static String fillup(int n, int len) { + String str = Integer.toString(n); + int diff = len - str.length(); + + if(diff > 0) { + char[] chs = new char[diff]; + + for(int i=0; i < diff; i++) + chs[i] = ' '; + + return new String(chs) + str; + } + else + return str; + } + + final static void addWarning(String err) { warnings.addElement(err); } +} diff --git a/examples/Mini/MiniParser$JJCalls b/examples/Mini/MiniParser$JJCalls new file mode 100644 index 0000000000000000000000000000000000000000..9f4981c73c1b96518ff0dca3eb27a235522c6297 GIT binary patch literal 363 zcmX^0Z`VEsW(Hjb2}TC4;QZ2}9$u7#IW?7#Ua?L>NRFqyTCKO1c05 literal 0 HcmV?d00001 diff --git a/examples/Mini/MiniParser.java b/examples/Mini/MiniParser.java new file mode 100644 index 00000000..d5a34672 --- /dev/null +++ b/examples/Mini/MiniParser.java @@ -0,0 +1,991 @@ +/* Generated By:JJTree&JavaCC: Do not edit this line. MiniParser.java */ +package Mini; + +public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, MiniParserConstants {/*@bgen(jjtree)*/ + protected static JJTMiniParserState jjtree = new JJTMiniParserState();private static Token expr_token; + + final static void jjtreeOpenNodeScope(Node n) {} + final static void jjtreeCloseNodeScope(Node n) {((SimpleNode)n).closeNode();} + +/* A program consists of a number of function declarations with a + * distinguished function `main' that starts the program. + */ + static final public void Program() throws ParseException { + /*@bgen(jjtree) Program */ + ASTProgram jjtn000 = new ASTProgram(JJTPROGRAM); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000); + try { + label_1: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 9: + ; + break; + default: + jj_la1[0] = jj_gen; + break label_1; + } + FunDecl(); + } + jj_consume_token(0); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } + } + +/* "FUN" Ident() "(" NameList() ")" = Expr() + */ + static final public void FunDecl() throws ParseException { + /*@bgen(jjtree) FunDecl */ + ASTFunDecl jjtn000 = new ASTFunDecl(JJTFUNDECL); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000);String s; + Token t; + try { + t = jj_consume_token(9); + jjtn000.setPosition(t.beginLine, t.beginColumn); + Ident(); + jj_consume_token(LPAREN); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case FALSE: + case TRUE: + case READ: + case WRITE: + case IDENT: + Ident(); + label_2: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case COMMA: + ; + break; + default: + jj_la1[1] = jj_gen; + break label_2; + } + jj_consume_token(COMMA); + Ident(); + } + break; + default: + jj_la1[2] = jj_gen; + ; + } + jj_consume_token(RPAREN); + jj_consume_token(ASSIGN); + Expr(); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } + } + + static final public void Expr() throws ParseException { + /*@bgen(jjtree) Expr */ + ASTExpr jjtn000 = new ASTExpr(JJTEXPR); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000);int kind=-1; + int un_op=-1; + try { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 10: + IfExpr(); + break; + case 14: + LetExpr(); + break; + case FALSE: + case TRUE: + case LPAREN: + case READ: + case WRITE: + case IDENT: + case INTEGER: + Term(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case OR: + case PLUS: + case MINUS: + kind = AddOp(); + Expr(); + jjtn000.setKind(kind); + break; + default: + jj_la1[3] = jj_gen; + ; + } + break; + case NOT: + case MINUS: + un_op = UnOp(); + jjtn000.setUnOp(un_op); + Expr(); + break; + default: + jj_la1[4] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } + } + +/* + * The disambiguating algorithm of JavaCC automatically binds dangling + * else's to the innermost if statement. The LOOKAHEAD specification + * is to tell JavaCC that we know what we are doing. + */ + static final public void IfExpr() throws ParseException { + /*@bgen(jjtree) IfExpr */ + ASTIfExpr jjtn000 = new ASTIfExpr(JJTIFEXPR); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000);Token t=null; + try { + t = jj_consume_token(10); + jjtn000.setPosition(t.beginLine, t.beginColumn); + Expr(); + jj_consume_token(11); + Expr(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 12: + jj_consume_token(12); + Expr(); + break; + default: + jj_la1[5] = jj_gen; + ; + } + jj_consume_token(13); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } + } + + static final public void LetExpr() throws ParseException { + /*@bgen(jjtree) LetExpr */ + ASTLetExpr jjtn000 = new ASTLetExpr(JJTLETEXPR); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000);Token t=null; + try { + t = jj_consume_token(14); + jjtn000.setPosition(t.beginLine, t.beginColumn); + label_3: + while (true) { + Ident(); + jj_consume_token(ASSIGN); + Expr(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case FALSE: + case TRUE: + case READ: + case WRITE: + case IDENT: + ; + break; + default: + jj_la1[6] = jj_gen; + break label_3; + } + } + jj_consume_token(15); + Expr(); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } + } + + static final public Token FunAppl() throws ParseException { + /*@bgen(jjtree) FunAppl */ + ASTFunAppl jjtn000 = new ASTFunAppl(JJTFUNAPPL); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000);Token t=null; + try { + t = Ident(); + jjtn000.setPosition(t.beginLine, t.beginColumn); + jj_consume_token(LPAREN); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case 10: + case 14: + case NOT: + case FALSE: + case TRUE: + case MINUS: + case LPAREN: + case READ: + case WRITE: + case IDENT: + case INTEGER: + Expr(); + label_4: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case COMMA: + ; + break; + default: + jj_la1[7] = jj_gen; + break label_4; + } + jj_consume_token(COMMA); + Expr(); + } + break; + default: + jj_la1[8] = jj_gen; + ; + } + jj_consume_token(RPAREN); + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtreeCloseNodeScope(jjtn000); + {if (true) return t;} + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } + throw new Error("Missing return statement in function"); + } + + static final public void Term() throws ParseException { + /*@bgen(jjtree) Term */ + ASTTerm jjtn000 = new ASTTerm(JJTTERM); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000);int kind=-1; + try { + Factor(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case AND: + case MULT: + case MOD: + case DIV: + kind = MultOp(); + jjtn000.setKind(kind); + Term(); + break; + default: + jj_la1[9] = jj_gen; + ; + } + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtreeCloseNodeScope(jjtn000); + jjtn000.setPosition(expr_token.beginLine, expr_token.beginColumn); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } + } + + static final public void Factor() throws ParseException { + /*@bgen(jjtree) Factor */ + ASTFactor jjtn000 = new ASTFactor(JJTFACTOR); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000);int kind=-1; + try { + Element(); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case GT: + case LT: + case GEQ: + case LEQ: + case EQ: + case NEQ: + kind = CmpOp(); + jjtn000.setKind(kind); + Factor(); + break; + default: + jj_la1[10] = jj_gen; + ; + } + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtreeCloseNodeScope(jjtn000); + jjtn000.setPosition(expr_token.beginLine, expr_token.beginColumn); + } catch (Throwable jjte000) { + if (jjtc000) { + jjtree.clearNodeScope(jjtn000); + jjtc000 = false; + } else { + jjtree.popNode(); + } + if (jjte000 instanceof ParseException) { + {if (true) throw (ParseException)jjte000;} + } + if (jjte000 instanceof RuntimeException) { + {if (true) throw (RuntimeException)jjte000;} + } + {if (true) throw (Error)jjte000;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } + } + + static final public void Element() throws ParseException { + if (jj_2_1(2)) { + expr_token = FunAppl(); + } else { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case FALSE: + case TRUE: + case READ: + case WRITE: + case IDENT: + expr_token = Ident(); + break; + case INTEGER: + expr_token = Integer(); + break; + case LPAREN: + expr_token = jj_consume_token(LPAREN); + Expr(); + jj_consume_token(RPAREN); + break; + default: + jj_la1[11] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + } + + static final public Token Integer() throws ParseException { + /*@bgen(jjtree) Integer */ + ASTInteger jjtn000 = new ASTInteger(JJTINTEGER); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000);int num; + Token t; + try { + t = jj_consume_token(INTEGER); + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtreeCloseNodeScope(jjtn000); + jjtn000.setValue(Integer.parseInt(t.image)); + jjtn000.setPosition(t.beginLine, t.beginColumn); + {if (true) return t;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } + throw new Error("Missing return statement in function"); + } + + static final public Token Ident() throws ParseException { + /*@bgen(jjtree) Ident */ + ASTIdent jjtn000 = new ASTIdent(JJTIDENT); + boolean jjtc000 = true; + jjtree.openNodeScope(jjtn000); + jjtreeOpenNodeScope(jjtn000);String name; + Token t; + try { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case TRUE: + t = jj_consume_token(TRUE); + break; + case FALSE: + t = jj_consume_token(FALSE); + break; + case READ: + t = jj_consume_token(READ); + break; + case WRITE: + t = jj_consume_token(WRITE); + break; + case IDENT: + t = jj_consume_token(IDENT); + break; + default: + jj_la1[12] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + jjtree.closeNodeScope(jjtn000, true); + jjtc000 = false; + jjtreeCloseNodeScope(jjtn000); + jjtn000.setName(t.image); + jjtn000.setPosition(t.beginLine, t.beginColumn); + {if (true) return t;} + } finally { + if (jjtc000) { + jjtree.closeNodeScope(jjtn000, true); + jjtreeCloseNodeScope(jjtn000); + } + } + throw new Error("Missing return statement in function"); + } + + static final public int AddOp() throws ParseException { + Token t=null; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case PLUS: + t = jj_consume_token(PLUS); + break; + case MINUS: + t = jj_consume_token(MINUS); + break; + case OR: + t = jj_consume_token(OR); + break; + default: + jj_la1[13] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return t.kind;} + throw new Error("Missing return statement in function"); + } + + static final public int MultOp() throws ParseException { + Token t=null; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case MULT: + t = jj_consume_token(MULT); + break; + case DIV: + t = jj_consume_token(DIV); + break; + case MOD: + t = jj_consume_token(MOD); + break; + case AND: + t = jj_consume_token(AND); + break; + default: + jj_la1[14] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return t.kind;} + throw new Error("Missing return statement in function"); + } + + static final public int CmpOp() throws ParseException { + Token t=null; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case EQ: + t = jj_consume_token(EQ); + break; + case NEQ: + t = jj_consume_token(NEQ); + break; + case LEQ: + t = jj_consume_token(LEQ); + break; + case GEQ: + t = jj_consume_token(GEQ); + break; + case GT: + t = jj_consume_token(GT); + break; + case LT: + t = jj_consume_token(LT); + break; + default: + jj_la1[15] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return t.kind;} + throw new Error("Missing return statement in function"); + } + + static final public int UnOp() throws ParseException { + Token t=null; + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case MINUS: + t = jj_consume_token(MINUS); + break; + case NOT: + t = jj_consume_token(NOT); + break; + default: + jj_la1[16] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + {if (true) return t.kind;} + throw new Error("Missing return statement in function"); + } + + static final private boolean jj_2_1(int xla) { + jj_la = xla; jj_lastpos = jj_scanpos = token; + boolean retval = !jj_3_1(); + jj_save(0, xla); + return retval; + } + + static final private boolean jj_3R_8() { + if (jj_scan_token(FALSE)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + static final private boolean jj_3R_11() { + if (jj_scan_token(IDENT)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + static final private boolean jj_3R_7() { + if (jj_scan_token(TRUE)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + static final private boolean jj_3R_6() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_7()) { + jj_scanpos = xsp; + if (jj_3R_8()) { + jj_scanpos = xsp; + if (jj_3R_9()) { + jj_scanpos = xsp; + if (jj_3R_10()) { + jj_scanpos = xsp; + if (jj_3R_11()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + static final private boolean jj_3_1() { + if (jj_3R_5()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + static final private boolean jj_3R_5() { + if (jj_3R_6()) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_scan_token(LPAREN)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + static final private boolean jj_3R_10() { + if (jj_scan_token(WRITE)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + static final private boolean jj_3R_9() { + if (jj_scan_token(READ)) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + return false; + } + + static private boolean jj_initialized_once = false; + static public MiniParserTokenManager token_source; + static ASCII_CharStream jj_input_stream; + static public Token token, jj_nt; + static private int jj_ntk; + static private Token jj_scanpos, jj_lastpos; + static private int jj_la; + static public boolean lookingAhead = false; + static private boolean jj_semLA; + static private int jj_gen; + static final private int[] jj_la1 = new int[17]; + static final private int[] jj_la1_0 = {0x200,0x0,0x1800000,0x1c000000,0x11c04400,0x1000,0x1800000,0x0,0x11c04400,0xe2000000,0x3f0000,0x1800000,0x1800000,0x1c000000,0xe2000000,0x3f0000,0x10400000,}; + static final private int[] jj_la1_1 = {0x0,0x8,0x130,0x0,0x331,0x0,0x130,0x8,0x331,0x0,0x0,0x331,0x130,0x0,0x0,0x0,0x0,}; + static final private JJCalls[] jj_2_rtns = new JJCalls[1]; + static private boolean jj_rescan = false; + static private int jj_gc = 0; + + public MiniParser(java.io.InputStream stream) { + if (jj_initialized_once) { + System.out.println("ERROR: Second call to constructor of static parser. You must"); + System.out.println(" either use ReInit() or set the JavaCC option STATIC to false"); + System.out.println(" during parser generation."); + throw new Error(); + } + jj_initialized_once = true; + jj_input_stream = new ASCII_CharStream(stream, 1, 1); + token_source = new MiniParserTokenManager(jj_input_stream); + token = new Token(); + jj_ntk = -1; + jj_gen = 0; + for (int i = 0; i < 17; i++) jj_la1[i] = -1; + for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + } + + static public void ReInit(java.io.InputStream stream) { + jj_input_stream.ReInit(stream, 1, 1); + token_source.ReInit(jj_input_stream); + token = new Token(); + jj_ntk = -1; + jjtree.reset(); + jj_gen = 0; + for (int i = 0; i < 17; i++) jj_la1[i] = -1; + for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + } + + public MiniParser(java.io.Reader stream) { + if (jj_initialized_once) { + System.out.println("ERROR: Second call to constructor of static parser. You must"); + System.out.println(" either use ReInit() or set the JavaCC option STATIC to false"); + System.out.println(" during parser generation."); + throw new Error(); + } + jj_initialized_once = true; + jj_input_stream = new ASCII_CharStream(stream, 1, 1); + token_source = new MiniParserTokenManager(jj_input_stream); + token = new Token(); + jj_ntk = -1; + jj_gen = 0; + for (int i = 0; i < 17; i++) jj_la1[i] = -1; + for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + } + + static public void ReInit(java.io.Reader stream) { + jj_input_stream.ReInit(stream, 1, 1); + token_source.ReInit(jj_input_stream); + token = new Token(); + jj_ntk = -1; + jjtree.reset(); + jj_gen = 0; + for (int i = 0; i < 17; i++) jj_la1[i] = -1; + for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + } + + public MiniParser(MiniParserTokenManager tm) { + if (jj_initialized_once) { + System.out.println("ERROR: Second call to constructor of static parser. You must"); + System.out.println(" either use ReInit() or set the JavaCC option STATIC to false"); + System.out.println(" during parser generation."); + throw new Error(); + } + jj_initialized_once = true; + token_source = tm; + token = new Token(); + jj_ntk = -1; + jj_gen = 0; + for (int i = 0; i < 17; i++) jj_la1[i] = -1; + for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + } + + public void ReInit(MiniParserTokenManager tm) { + token_source = tm; + token = new Token(); + jj_ntk = -1; + jjtree.reset(); + jj_gen = 0; + for (int i = 0; i < 17; i++) jj_la1[i] = -1; + for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + } + + static final private Token jj_consume_token(int kind) throws ParseException { + Token oldToken; + if ((oldToken = token).next != null) token = token.next; + else token = token.next = token_source.getNextToken(); + jj_ntk = -1; + if (token.kind == kind) { + jj_gen++; + if (++jj_gc > 100) { + jj_gc = 0; + for (int i = 0; i < jj_2_rtns.length; i++) { + JJCalls c = jj_2_rtns[i]; + while (c != null) { + if (c.gen < jj_gen) c.first = null; + c = c.next; + } + } + } + return token; + } + token = oldToken; + jj_kind = kind; + throw generateParseException(); + } + + static final private boolean jj_scan_token(int kind) { + if (jj_scanpos == jj_lastpos) { + jj_la--; + if (jj_scanpos.next == null) { + jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken(); + } else { + jj_lastpos = jj_scanpos = jj_scanpos.next; + } + } else { + jj_scanpos = jj_scanpos.next; + } + if (jj_rescan) { + int i = 0; Token tok = token; + while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; } + if (tok != null) jj_add_error_token(kind, i); + } + return (jj_scanpos.kind != kind); + } + + static final public Token getNextToken() { + if (token.next != null) token = token.next; + else token = token.next = token_source.getNextToken(); + jj_ntk = -1; + jj_gen++; + return token; + } + + static final public Token getToken(int index) { + Token t = lookingAhead ? jj_scanpos : token; + for (int i = 0; i < index; i++) { + if (t.next != null) t = t.next; + else t = t.next = token_source.getNextToken(); + } + return t; + } + + static final private int jj_ntk() { + if ((jj_nt=token.next) == null) + return (jj_ntk = (token.next=token_source.getNextToken()).kind); + else + return (jj_ntk = jj_nt.kind); + } + + static private java.util.Vector jj_expentries = new java.util.Vector(); + static private int[] jj_expentry; + static private int jj_kind = -1; + static private int[] jj_lasttokens = new int[100]; + static private int jj_endpos; + + static private void jj_add_error_token(int kind, int pos) { + if (pos >= 100) return; + if (pos == jj_endpos + 1) { + jj_lasttokens[jj_endpos++] = kind; + } else if (jj_endpos != 0) { + jj_expentry = new int[jj_endpos]; + for (int i = 0; i < jj_endpos; i++) { + jj_expentry[i] = jj_lasttokens[i]; + } + boolean exists = false; + for (java.util.Enumeration enum = jj_expentries.elements(); enum.hasMoreElements();) { + int[] oldentry = (int[])(enum.nextElement()); + if (oldentry.length == jj_expentry.length) { + exists = true; + for (int i = 0; i < jj_expentry.length; i++) { + if (oldentry[i] != jj_expentry[i]) { + exists = false; + break; + } + } + if (exists) break; + } + } + if (!exists) jj_expentries.addElement(jj_expentry); + if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind; + } + } + + static final public ParseException generateParseException() { + jj_expentries.removeAllElements(); + boolean[] la1tokens = new boolean[43]; + for (int i = 0; i < 43; i++) { + la1tokens[i] = false; + } + if (jj_kind >= 0) { + la1tokens[jj_kind] = true; + jj_kind = -1; + } + for (int i = 0; i < 17; i++) { + if (jj_la1[i] == jj_gen) { + for (int j = 0; j < 32; j++) { + if ((jj_la1_0[i] & (1< jj_gen) { + jj_la = p.arg; jj_lastpos = jj_scanpos = p.first; + switch (i) { + case 0: jj_3_1(); break; + } + } + p = p.next; + } while (p != null); + } + jj_rescan = false; + } + + static final private void jj_save(int index, int xla) { + JJCalls p = jj_2_rtns[index]; + while (p.gen > jj_gen) { + if (p.next == null) { p = p.next = new JJCalls(); break; } + p = p.next; + } + p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla; + } + + private static final class JJCalls { + int gen; + Token first; + int arg; + JJCalls next; + } + +} diff --git a/examples/Mini/MiniParserConstants.java b/examples/Mini/MiniParserConstants.java new file mode 100644 index 00000000..0986a4d2 --- /dev/null +++ b/examples/Mini/MiniParserConstants.java @@ -0,0 +1,85 @@ +/* Generated By:JJTree&JavaCC: Do not edit this line. MiniParserConstants.java */ +package Mini; + +public interface MiniParserConstants { + + int EOF = 0; + int SINGLE_LINE_COMMENT = 7; + int GT = 16; + int LT = 17; + int GEQ = 18; + int LEQ = 19; + int EQ = 20; + int NEQ = 21; + int NOT = 22; + int FALSE = 23; + int TRUE = 24; + int AND = 25; + int OR = 26; + int PLUS = 27; + int MINUS = 28; + int MULT = 29; + int MOD = 30; + int DIV = 31; + int LPAREN = 32; + int RPAREN = 33; + int ASSIGN = 34; + int COMMA = 35; + int READ = 36; + int WRITE = 37; + int DIGIT = 38; + int LETTER = 39; + int IDENT = 40; + int INTEGER = 41; + int STRING = 42; + + int DEFAULT = 0; + int SINGLE_LINE_COMMENT_STATE = 1; + + String[] tokenImage = { + "", + "\" \"", + "\"\\t\"", + "\"\\n\"", + "\"\\r\"", + "\"\\f\"", + "\"--\"", + "", + "", + "\"FUN\"", + "\"IF\"", + "\"THEN\"", + "\"ELSE\"", + "\"FI\"", + "\"LET\"", + "\"IN\"", + "\">\"", + "\"<\"", + "\">=\"", + "\"<=\"", + "\"==\"", + "\"!=\"", + "\"!\"", + "\"FALSE\"", + "\"TRUE\"", + "\"AND\"", + "\"OR\"", + "\"+\"", + "\"-\"", + "\"*\"", + "\"%\"", + "\"/\"", + "\"(\"", + "\")\"", + "\"=\"", + "\",\"", + "\"READ\"", + "\"WRITE\"", + "", + "", + "", + "", + "", + }; + +} diff --git a/examples/Mini/MiniParserTokenManager.java b/examples/Mini/MiniParserTokenManager.java new file mode 100644 index 00000000..4a34dee1 --- /dev/null +++ b/examples/Mini/MiniParserTokenManager.java @@ -0,0 +1,721 @@ +/* Generated By:JJTree&JavaCC: Do not edit this line. MiniParserTokenManager.java */ +package Mini; + +public class MiniParserTokenManager implements MiniParserConstants +{ +static private final int jjMoveStringLiteralDfa0_1() +{ + return jjMoveNfa_1(0, 0); +} +static private final void jjCheckNAdd(int state) +{ + if (jjrounds[state] != jjround) + { + jjstateSet[jjnewStateCnt++] = state; + jjrounds[state] = jjround; + } +} +static private final void jjAddStates(int start, int end) +{ + do { + jjstateSet[jjnewStateCnt++] = jjnextStates[start]; + } while (start++ != end); +} +static private final void jjCheckNAddTwoStates(int state1, int state2) +{ + jjCheckNAdd(state1); + jjCheckNAdd(state2); +} +static private final void jjCheckNAddStates(int start, int end) +{ + do { + jjCheckNAdd(jjnextStates[start]); + } while (start++ != end); +} +static private final void jjCheckNAddStates(int start) +{ + jjCheckNAdd(jjnextStates[start]); + jjCheckNAdd(jjnextStates[start + 1]); +} +static private final int jjMoveNfa_1(int startState, int curPos) +{ + int[] nextStates; + int startsAt = 0; + jjnewStateCnt = 3; + int i = 1; + jjstateSet[0] = startState; + int j, kind = 0x7fffffff; + for (;;) + { + if (++jjround == 0x7fffffff) + ReInitRounds(); + if (curChar < 64) + { + long l = 1L << curChar; + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 0: + if ((0x2400L & l) != 0L) + { + if (kind > 7) + kind = 7; + } + if (curChar == 13) + jjstateSet[jjnewStateCnt++] = 1; + break; + case 1: + if (curChar == 10 && kind > 7) + kind = 7; + break; + case 2: + if (curChar == 13) + jjstateSet[jjnewStateCnt++] = 1; + break; + default : break; + } + } while(i != startsAt); + } + else if (curChar < 128) + { + long l = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + default : break; + } + } while(i != startsAt); + } + else + { + int i2 = (curChar & 0xff) >> 6; + long l2 = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + default : break; + } + } while(i != startsAt); + } + if (kind != 0x7fffffff) + { + jjmatchedKind = kind; + jjmatchedPos = curPos; + kind = 0x7fffffff; + } + ++curPos; + if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt))) + return curPos; + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { return curPos; } + } +} +private static final int jjStopStringLiteralDfa_0(int pos, long active0) +{ + switch (pos) + { + case 0: + if ((active0 & 0x300780fe00L) != 0L) + { + jjmatchedKind = 40; + return 1; + } + return -1; + case 1: + if ((active0 & 0x400a400L) != 0L) + return 1; + if ((active0 & 0x3003805a00L) != 0L) + { + jjmatchedKind = 40; + jjmatchedPos = 1; + return 1; + } + return -1; + case 2: + if ((active0 & 0x2004200L) != 0L) + return 1; + if ((active0 & 0x3001801800L) != 0L) + { + jjmatchedKind = 40; + jjmatchedPos = 2; + return 1; + } + return -1; + case 3: + if ((active0 & 0x2000800000L) != 0L) + { + jjmatchedKind = 40; + jjmatchedPos = 3; + return 1; + } + if ((active0 & 0x1001001800L) != 0L) + return 1; + return -1; + default : + return -1; + } +} +private static final int jjStartNfa_0(int pos, long active0) +{ + return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1); +} +static private final int jjStopAtPos(int pos, int kind) +{ + jjmatchedKind = kind; + jjmatchedPos = pos; + return pos + 1; +} +static private final int jjStartNfaWithStates_0(int pos, int kind, int state) +{ + jjmatchedKind = kind; + jjmatchedPos = pos; + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { return pos + 1; } + return jjMoveNfa_0(state, pos + 1); +} +static private final int jjMoveStringLiteralDfa0_0() +{ + switch(curChar) + { + case 33: + jjmatchedKind = 22; + return jjMoveStringLiteralDfa1_0(0x200000L); + case 37: + return jjStopAtPos(0, 30); + case 40: + return jjStopAtPos(0, 32); + case 41: + return jjStopAtPos(0, 33); + case 42: + return jjStopAtPos(0, 29); + case 43: + return jjStopAtPos(0, 27); + case 44: + return jjStopAtPos(0, 35); + case 45: + jjmatchedKind = 28; + return jjMoveStringLiteralDfa1_0(0x40L); + case 47: + return jjStopAtPos(0, 31); + case 60: + jjmatchedKind = 17; + return jjMoveStringLiteralDfa1_0(0x80000L); + case 61: + jjmatchedKind = 34; + return jjMoveStringLiteralDfa1_0(0x100000L); + case 62: + jjmatchedKind = 16; + return jjMoveStringLiteralDfa1_0(0x40000L); + case 65: + return jjMoveStringLiteralDfa1_0(0x2000000L); + case 69: + return jjMoveStringLiteralDfa1_0(0x1000L); + case 70: + return jjMoveStringLiteralDfa1_0(0x802200L); + case 73: + return jjMoveStringLiteralDfa1_0(0x8400L); + case 76: + return jjMoveStringLiteralDfa1_0(0x4000L); + case 79: + return jjMoveStringLiteralDfa1_0(0x4000000L); + case 82: + return jjMoveStringLiteralDfa1_0(0x1000000000L); + case 84: + return jjMoveStringLiteralDfa1_0(0x1000800L); + case 87: + return jjMoveStringLiteralDfa1_0(0x2000000000L); + default : + return jjMoveNfa_0(0, 0); + } +} +static private final int jjMoveStringLiteralDfa1_0(long active0) +{ + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { + jjStopStringLiteralDfa_0(0, active0); + return 1; + } + switch(curChar) + { + case 45: + if ((active0 & 0x40L) != 0L) + return jjStopAtPos(1, 6); + break; + case 61: + if ((active0 & 0x40000L) != 0L) + return jjStopAtPos(1, 18); + else if ((active0 & 0x80000L) != 0L) + return jjStopAtPos(1, 19); + else if ((active0 & 0x100000L) != 0L) + return jjStopAtPos(1, 20); + else if ((active0 & 0x200000L) != 0L) + return jjStopAtPos(1, 21); + break; + case 65: + return jjMoveStringLiteralDfa2_0(active0, 0x800000L); + case 69: + return jjMoveStringLiteralDfa2_0(active0, 0x1000004000L); + case 70: + if ((active0 & 0x400L) != 0L) + return jjStartNfaWithStates_0(1, 10, 1); + break; + case 72: + return jjMoveStringLiteralDfa2_0(active0, 0x800L); + case 73: + if ((active0 & 0x2000L) != 0L) + return jjStartNfaWithStates_0(1, 13, 1); + break; + case 76: + return jjMoveStringLiteralDfa2_0(active0, 0x1000L); + case 78: + if ((active0 & 0x8000L) != 0L) + return jjStartNfaWithStates_0(1, 15, 1); + return jjMoveStringLiteralDfa2_0(active0, 0x2000000L); + case 82: + if ((active0 & 0x4000000L) != 0L) + return jjStartNfaWithStates_0(1, 26, 1); + return jjMoveStringLiteralDfa2_0(active0, 0x2001000000L); + case 85: + return jjMoveStringLiteralDfa2_0(active0, 0x200L); + default : + break; + } + return jjStartNfa_0(0, active0); +} +static private final int jjMoveStringLiteralDfa2_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(0, old0); + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { + jjStopStringLiteralDfa_0(1, active0); + return 2; + } + switch(curChar) + { + case 65: + return jjMoveStringLiteralDfa3_0(active0, 0x1000000000L); + case 68: + if ((active0 & 0x2000000L) != 0L) + return jjStartNfaWithStates_0(2, 25, 1); + break; + case 69: + return jjMoveStringLiteralDfa3_0(active0, 0x800L); + case 73: + return jjMoveStringLiteralDfa3_0(active0, 0x2000000000L); + case 76: + return jjMoveStringLiteralDfa3_0(active0, 0x800000L); + case 78: + if ((active0 & 0x200L) != 0L) + return jjStartNfaWithStates_0(2, 9, 1); + break; + case 83: + return jjMoveStringLiteralDfa3_0(active0, 0x1000L); + case 84: + if ((active0 & 0x4000L) != 0L) + return jjStartNfaWithStates_0(2, 14, 1); + break; + case 85: + return jjMoveStringLiteralDfa3_0(active0, 0x1000000L); + default : + break; + } + return jjStartNfa_0(1, active0); +} +static private final int jjMoveStringLiteralDfa3_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(1, old0); + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { + jjStopStringLiteralDfa_0(2, active0); + return 3; + } + switch(curChar) + { + case 68: + if ((active0 & 0x1000000000L) != 0L) + return jjStartNfaWithStates_0(3, 36, 1); + break; + case 69: + if ((active0 & 0x1000L) != 0L) + return jjStartNfaWithStates_0(3, 12, 1); + else if ((active0 & 0x1000000L) != 0L) + return jjStartNfaWithStates_0(3, 24, 1); + break; + case 78: + if ((active0 & 0x800L) != 0L) + return jjStartNfaWithStates_0(3, 11, 1); + break; + case 83: + return jjMoveStringLiteralDfa4_0(active0, 0x800000L); + case 84: + return jjMoveStringLiteralDfa4_0(active0, 0x2000000000L); + default : + break; + } + return jjStartNfa_0(2, active0); +} +static private final int jjMoveStringLiteralDfa4_0(long old0, long active0) +{ + if (((active0 &= old0)) == 0L) + return jjStartNfa_0(2, old0); + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { + jjStopStringLiteralDfa_0(3, active0); + return 4; + } + switch(curChar) + { + case 69: + if ((active0 & 0x800000L) != 0L) + return jjStartNfaWithStates_0(4, 23, 1); + else if ((active0 & 0x2000000000L) != 0L) + return jjStartNfaWithStates_0(4, 37, 1); + break; + default : + break; + } + return jjStartNfa_0(3, active0); +} +static final long[] jjbitVec0 = { + 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL +}; +static private final int jjMoveNfa_0(int startState, int curPos) +{ + int[] nextStates; + int startsAt = 0; + jjnewStateCnt = 6; + int i = 1; + jjstateSet[0] = startState; + int j, kind = 0x7fffffff; + for (;;) + { + if (++jjround == 0x7fffffff) + ReInitRounds(); + if (curChar < 64) + { + long l = 1L << curChar; + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 0: + if ((0x3ff000000000000L & l) != 0L) + { + if (kind > 41) + kind = 41; + jjCheckNAdd(2); + } + else if (curChar == 34) + jjCheckNAddTwoStates(4, 5); + break; + case 1: + if ((0x3ff000000000000L & l) == 0L) + break; + if (kind > 40) + kind = 40; + jjstateSet[jjnewStateCnt++] = 1; + break; + case 2: + if ((0x3ff000000000000L & l) == 0L) + break; + if (kind > 41) + kind = 41; + jjCheckNAdd(2); + break; + case 3: + if (curChar == 34) + jjCheckNAddTwoStates(4, 5); + break; + case 4: + if ((0xfffffffbffffdbffL & l) != 0L) + jjCheckNAddTwoStates(4, 5); + break; + case 5: + if (curChar == 34 && kind > 42) + kind = 42; + break; + default : break; + } + } while(i != startsAt); + } + else if (curChar < 128) + { + long l = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 0: + if ((0x7fffffe07fffffeL & l) == 0L) + break; + if (kind > 40) + kind = 40; + jjCheckNAdd(1); + break; + case 1: + if ((0x7fffffe87fffffeL & l) == 0L) + break; + if (kind > 40) + kind = 40; + jjCheckNAdd(1); + break; + case 4: + jjAddStates(0, 1); + break; + default : break; + } + } while(i != startsAt); + } + else + { + int i2 = (curChar & 0xff) >> 6; + long l2 = 1L << (curChar & 077); + MatchLoop: do + { + switch(jjstateSet[--i]) + { + case 4: + if ((jjbitVec0[i2] & l2) != 0L) + jjAddStates(0, 1); + break; + default : break; + } + } while(i != startsAt); + } + if (kind != 0x7fffffff) + { + jjmatchedKind = kind; + jjmatchedPos = curPos; + kind = 0x7fffffff; + } + ++curPos; + if ((i = jjnewStateCnt) == (startsAt = 6 - (jjnewStateCnt = startsAt))) + return curPos; + try { curChar = input_stream.readChar(); } + catch(java.io.IOException e) { return curPos; } + } +} +static final int[] jjnextStates = { + 4, 5, +}; +public static final String[] jjstrLiteralImages = { +"", null, null, null, null, null, null, null, null, "\106\125\116", +"\111\106", "\124\110\105\116", "\105\114\123\105", "\106\111", "\114\105\124", +"\111\116", "\76", "\74", "\76\75", "\74\75", "\75\75", "\41\75", "\41", +"\106\101\114\123\105", "\124\122\125\105", "\101\116\104", "\117\122", "\53", "\55", "\52", "\45", +"\57", "\50", "\51", "\75", "\54", "\122\105\101\104", "\127\122\111\124\105", null, +null, null, null, null, }; +public static final String[] lexStateNames = { + "DEFAULT", + "SINGLE_LINE_COMMENT_STATE", +}; +public static final int[] jjnewLexState = { + -1, -1, -1, -1, -1, -1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, +}; +static final long[] jjtoToken = { + 0x73ffffffe01L, +}; +static final long[] jjtoSkip = { + 0xbeL, +}; +static final long[] jjtoSpecial = { + 0x80L, +}; +static final long[] jjtoMore = { + 0x140L, +}; +static private ASCII_CharStream input_stream; +static private final int[] jjrounds = new int[6]; +static private final int[] jjstateSet = new int[12]; +static StringBuffer image; +static int jjimageLen; +static int lengthOfMatch; +static protected char curChar; +public MiniParserTokenManager(ASCII_CharStream stream) +{ + if (input_stream != null) + throw new TokenMgrError("ERROR: Second call to constructor of static lexer. You must use ReInit() to initialize the static variables.", TokenMgrError.STATIC_LEXER_ERROR); + input_stream = stream; +} +public MiniParserTokenManager(ASCII_CharStream stream, int lexState) +{ + this(stream); + SwitchTo(lexState); +} +static public void ReInit(ASCII_CharStream stream) +{ + jjmatchedPos = jjnewStateCnt = 0; + curLexState = defaultLexState; + input_stream = stream; + ReInitRounds(); +} +static private final void ReInitRounds() +{ + int i; + jjround = 0x80000001; + for (i = 6; i-- > 0;) + jjrounds[i] = 0x80000000; +} +static public void ReInit(ASCII_CharStream stream, int lexState) +{ + ReInit(stream); + SwitchTo(lexState); +} +static public void SwitchTo(int lexState) +{ + if (lexState >= 2 || lexState < 0) + throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE); + else + curLexState = lexState; +} + +static private final Token jjFillToken() +{ + Token t = Token.newToken(jjmatchedKind); + t.kind = jjmatchedKind; + String im = jjstrLiteralImages[jjmatchedKind]; + t.image = (im == null) ? input_stream.GetImage() : im; + t.beginLine = input_stream.getBeginLine(); + t.beginColumn = input_stream.getBeginColumn(); + t.endLine = input_stream.getEndLine(); + t.endColumn = input_stream.getEndColumn(); + return t; +} + +static int curLexState = 0; +static int defaultLexState = 0; +static int jjnewStateCnt; +static int jjround; +static int jjmatchedPos; +static int jjmatchedKind; + +public static final Token getNextToken() +{ + int kind; + Token specialToken = null; + Token matchedToken; + int curPos = 0; + + EOFLoop : + for (;;) + { + try + { + curChar = input_stream.BeginToken(); + } + catch(java.io.IOException e) + { + jjmatchedKind = 0; + matchedToken = jjFillToken(); + matchedToken.specialToken = specialToken; + return matchedToken; + } + image = null; + jjimageLen = 0; + + for (;;) + { + switch(curLexState) + { + case 0: + try { input_stream.backup(0); + while (curChar <= 32 && (0x100003600L & (1L << curChar)) != 0L) + curChar = input_stream.BeginToken(); + } + catch (java.io.IOException e1) { continue EOFLoop; } + jjmatchedKind = 0x7fffffff; + jjmatchedPos = 0; + curPos = jjMoveStringLiteralDfa0_0(); + break; + case 1: + jjmatchedKind = 0x7fffffff; + jjmatchedPos = 0; + curPos = jjMoveStringLiteralDfa0_1(); + if (jjmatchedPos == 0 && jjmatchedKind > 8) + { + jjmatchedKind = 8; + } + break; + } + if (jjmatchedKind != 0x7fffffff) + { + if (jjmatchedPos + 1 < curPos) + input_stream.backup(curPos - jjmatchedPos - 1); + if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) + { + matchedToken = jjFillToken(); + matchedToken.specialToken = specialToken; + if (jjnewLexState[jjmatchedKind] != -1) + curLexState = jjnewLexState[jjmatchedKind]; + return matchedToken; + } + else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) + { + if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) + { + matchedToken = jjFillToken(); + if (specialToken == null) + specialToken = matchedToken; + else + { + matchedToken.specialToken = specialToken; + specialToken = (specialToken.next = matchedToken); + } + SkipLexicalActions(matchedToken); + } + else + SkipLexicalActions(null); + if (jjnewLexState[jjmatchedKind] != -1) + curLexState = jjnewLexState[jjmatchedKind]; + continue EOFLoop; + } + jjimageLen += jjmatchedPos + 1; + if (jjnewLexState[jjmatchedKind] != -1) + curLexState = jjnewLexState[jjmatchedKind]; + curPos = 0; + jjmatchedKind = 0x7fffffff; + try { + curChar = input_stream.readChar(); + continue; + } + catch (java.io.IOException e1) { } + } + int error_line = input_stream.getEndLine(); + int error_column = input_stream.getEndColumn(); + String error_after = null; + boolean EOFSeen = false; + try { input_stream.readChar(); input_stream.backup(1); } + catch (java.io.IOException e1) { + EOFSeen = true; + error_after = curPos <= 1 ? "" : input_stream.GetImage(); + if (curChar == '\n' || curChar == '\r') { + error_line++; + error_column = 0; + } + else + error_column++; + } + if (!EOFSeen) { + input_stream.backup(1); + error_after = curPos <= 1 ? "" : input_stream.GetImage(); + } + throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR); + } + } +} + +static final void SkipLexicalActions(Token matchedToken) +{ + switch(jjmatchedKind) + { + default : + break; + } +} +} diff --git a/examples/Mini/MiniParserTreeConstants.java b/examples/Mini/MiniParserTreeConstants.java new file mode 100644 index 00000000..5f4c54f6 --- /dev/null +++ b/examples/Mini/MiniParserTreeConstants.java @@ -0,0 +1,33 @@ +/* Generated By:JJTree: Do not edit this line. MiniParserTreeConstants.java */ + +package Mini; + +public interface MiniParserTreeConstants +{ + public int JJTPROGRAM = 0; + public int JJTFUNDECL = 1; + public int JJTEXPR = 2; + public int JJTIFEXPR = 3; + public int JJTLETEXPR = 4; + public int JJTFUNAPPL = 5; + public int JJTTERM = 6; + public int JJTFACTOR = 7; + public int JJTVOID = 8; + public int JJTINTEGER = 9; + public int JJTIDENT = 10; + + + public String[] jjtNodeName = { + "Program", + "FunDecl", + "Expr", + "IfExpr", + "LetExpr", + "FunAppl", + "Term", + "Factor", + "void", + "Integer", + "Ident", + }; +} diff --git a/examples/Mini/Node.java b/examples/Mini/Node.java new file mode 100644 index 00000000..eb1e2cac --- /dev/null +++ b/examples/Mini/Node.java @@ -0,0 +1,35 @@ +/* Generated By:JJTree: Do not edit this line. Node.java */ +/* JJT: 0.3pre1 */ + +package Mini; + +/* All AST nodes must implement this interface. It provides basic + machinery for constructing the parent and child relationships + between nodes. */ + +public interface Node { + + /** This method is called after the node has been made the current + node. It indicates that child nodes can now be added to it. */ + public void jjtOpen(); + + /** This method is called after all the child nodes have been + added. */ + public void jjtClose(); + + /** This pair of methods are used to inform the node of its + parent. */ + public void jjtSetParent(Node n); + public Node jjtGetParent(); + + /** This method tells the node to add its argument to the node's + list of children. */ + public void jjtAddChild(Node n, int i); + + /** This method returns a child node. The children are numbered + from zero, left to right. */ + public Node jjtGetChild(int i); + + /** Return the number of children the node has. */ + int jjtGetNumChildren(); +} diff --git a/examples/Mini/ParseException.java b/examples/Mini/ParseException.java new file mode 100644 index 00000000..8f5b4f55 --- /dev/null +++ b/examples/Mini/ParseException.java @@ -0,0 +1,191 @@ +/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 0.7pre6 */ +package Mini; + +/** + * This exception is thrown when parse errors are encountered. + * You can explicitly create objects of this exception type by + * calling the method generateParseException in the generated + * parser. + * + * You can modify this class to customize your error reporting + * mechanisms so long as you retain the public fields. + */ +public class ParseException extends Exception { + + /** + * This constructor is used by the method "generateParseException" + * in the generated parser. Calling this constructor generates + * a new object of this type with the fields "currentToken", + * "expectedTokenSequences", and "tokenImage" set. The boolean + * flag "specialConstructor" is also set to true to indicate that + * this constructor was used to create this object. + * This constructor calls its super class with the empty string + * to force the "toString" method of parent class "Throwable" to + * print the error message in the form: + * ParseException: + */ + public ParseException(Token currentTokenVal, + int[][] expectedTokenSequencesVal, + String[] tokenImageVal + ) + { + super(""); + specialConstructor = true; + currentToken = currentTokenVal; + expectedTokenSequences = expectedTokenSequencesVal; + tokenImage = tokenImageVal; + } + + /** + * The following constructors are for use by you for whatever + * purpose you can think of. Constructing the exception in this + * manner makes the exception behave in the normal way - i.e., as + * documented in the class "Throwable". The fields "errorToken", + * "expectedTokenSequences", and "tokenImage" do not contain + * relevant information. The JavaCC generated code does not use + * these constructors. + */ + + public ParseException() { + super(); + specialConstructor = false; + } + + public ParseException(String message) { + super(message); + specialConstructor = false; + } + + /** + * This variable determines which constructor was used to create + * this object and thereby affects the semantics of the + * "getMessage" method (see below). + */ + protected boolean specialConstructor; + + /** + * This is the last token that has been consumed successfully. If + * this object has been created due to a parse error, the token + * followng this token will (therefore) be the first error token. + */ + public Token currentToken; + + /** + * Each entry in this array is an array of integers. Each array + * of integers represents a sequence of tokens (by their ordinal + * values) that is expected at this point of the parse. + */ + public int[][] expectedTokenSequences; + + /** + * This is a reference to the "tokenImage" array of the generated + * parser within which the parse error occurred. This array is + * defined in the generated ...Constants interface. + */ + public String[] tokenImage; + + /** + * This method has the standard behavior when this object has been + * created using the standard constructors. Otherwise, it uses + * "currentToken" and "expectedTokenSequences" to generate a parse + * error message and returns it. If this object has been created + * due to a parse error, and you do not catch it (it gets thrown + * from the parser), then this method is called during the printing + * of the final stack trace, and hence the correct error message + * gets displayed. + */ + public String getMessage() { + if (!specialConstructor) { + return super.getMessage(); + } + String expected = ""; + int maxSize = 0; + for (int i = 0; i < expectedTokenSequences.length; i++) { + if (maxSize < expectedTokenSequences[i].length) { + maxSize = expectedTokenSequences[i].length; + } + for (int j = 0; j < expectedTokenSequences[i].length; j++) { + expected += tokenImage[expectedTokenSequences[i][j]] + " "; + } + if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { + expected += "..."; + } + expected += eol + " "; + } + String retval = "Encountered \""; + Token tok = currentToken.next; + for (int i = 0; i < maxSize; i++) { + if (i != 0) retval += " "; + if (tok.kind == 0) { + retval += tokenImage[0]; + break; + } + retval += add_escapes(tok.image); + tok = tok.next; + } + retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn + "." + eol; + if (expectedTokenSequences.length == 1) { + retval += "Was expecting:" + eol + " "; + } else { + retval += "Was expecting one of:" + eol + " "; + } + retval += expected; + return retval; + } + + /** + * The end of line string for this machine. + */ + protected String eol = System.getProperty("line.separator", "\n"); + + /** + * Used to convert raw characters to their escaped version + * when these raw version cannot be used as part of an ASCII + * string literal. + */ + protected String add_escapes(String str) { + StringBuffer retval = new StringBuffer(); + char ch; + for (int i = 0; i < str.length(); i++) { + switch (str.charAt(i)) + { + case 0 : + continue; + case '\b': + retval.append("\\b"); + continue; + case '\t': + retval.append("\\t"); + continue; + case '\n': + retval.append("\\n"); + continue; + case '\f': + retval.append("\\f"); + continue; + case '\r': + retval.append("\\r"); + continue; + case '\"': + retval.append("\\\""); + continue; + case '\'': + retval.append("\\\'"); + continue; + case '\\': + retval.append("\\\\"); + continue; + default: + if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { + String s = "0000" + Integer.toString(ch, 16); + retval.append("\\u" + s.substring(s.length() - 4, s.length())); + } else { + retval.append(ch); + } + continue; + } + } + return retval.toString(); + } + +} diff --git a/examples/Mini/README b/examples/Mini/README new file mode 100644 index 00000000..8d0ebe7c --- /dev/null +++ b/examples/Mini/README @@ -0,0 +1,54 @@ + Mini-Mini tutorial + ------------------ + +Mini is a very simple (semi-functional) language that I wrote to test +the generic package of BCEL. + + http://jakarta.apache.org/bcel/ + +Mini uses the JavaCC parser generator which comes precompiled from + + http://www.webgain.com/products/java_cc/ + +After setting the CLASSPATH to the directory just above the Mini +directory, e.g. + + % cd Mini + % setenv CLASSPATH $CLASSPATH:.:.. + +try the following: + + % java Mini.MiniC max.mini + +This produces a Java class file (max.class) which you can execute with + + % java max + +Enter a number (4, eg.) and you will be asked to enter 4 numbers. The +program will then tell you the biggest of them. + +Alternatively you can produce a Java file (max.java) which will be +translated automatically to a .class file. + + % java Mini.MiniC -java max.mini + +There are three examples programs (max.mini, fac.mini, fib.mini) +provided which demonstrate the language syntax and should be quite +easy to understand. + + +The compiler is not that well documented, I'm afraid, but if you've +ever seen a compiler before, you should be able to understand what I'm +doing. The part that produces the byte code is contained in the +byte_code() method that all AST nodes implement. Take a look at +MiniC.java at line 85 and follow the recursive byte_code() calls. + +It's also useful to use the listclass program provided with BCEL +to examine the generated class. For example + + % java listclass max.class + + +Send bug reports and suggestions to + + markus.dahm@berlin.de (Markus Dahm) diff --git a/examples/Mini/SimpleNode.java b/examples/Mini/SimpleNode.java new file mode 100644 index 00000000..f74779ea --- /dev/null +++ b/examples/Mini/SimpleNode.java @@ -0,0 +1,81 @@ +/* Generated By:JJTree: Do not edit this line. SimpleNode.java */ +/* JJT: 0.3pre1 */ + +package Mini; + +/** + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class SimpleNode implements Node { + protected Node parent; + protected Node[] children; + protected int id; + protected MiniParser parser; + + public SimpleNode(int i) { + id = i; + } + + public SimpleNode(MiniParser p, int i) { + this(i); + parser = p; + } + + public void jjtOpen() { + } + + public void jjtClose() { + } + + public void closeNode() { + } + + public void jjtSetParent(Node n) { parent = n; } + public Node jjtGetParent() { return parent; } + + public void jjtAddChild(Node n, int i) { + if (children == null) { + children = new Node[i + 1]; + } else if (i >= children.length) { + Node c[] = new Node[i + 1]; + System.arraycopy(children, 0, c, 0, children.length); + children = c; + } + children[i] = n; + } + + public Node jjtGetChild(int i) { + return children[i]; + } + + public int jjtGetNumChildren() { + return (children == null) ? 0 : children.length; + } + + /* You can override these two methods in subclasses of SimpleNode to + customize the way the node appears when the tree is dumped. If + your output uses more than one line you should override + toString(String), otherwise overriding toString() is probably all + you need to do. */ + + public String toString() { return MiniParserTreeConstants.jjtNodeName[id]; } + public String toString(String prefix) { return prefix + toString(); } + + /* Override this method if you want to customize how the node dumps + out its children. */ + + public void dump(String prefix) { + System.out.println(toString(prefix)); + if (children != null) { + for (int i = 0; i < children.length; ++i) { + SimpleNode n = (SimpleNode)children[i]; + if (n != null) { + n.dump(prefix + " "); + } + } + } + } +} + diff --git a/examples/Mini/Token.java b/examples/Mini/Token.java new file mode 100644 index 00000000..402f8946 --- /dev/null +++ b/examples/Mini/Token.java @@ -0,0 +1,81 @@ +/* Generated By:JavaCC: Do not edit this line. Token.java Version 0.7pre3 */ +package Mini; + +/** + * Describes the input token stream. + */ + +public class Token { + + /** + * An integer that describes the kind of this token. This numbering + * system is determined by JavaCCParser, and a table of these numbers is + * stored in the file ...Constants.java. + */ + public int kind; + + /** + * beginLine and beginColumn describe the position of the first character + * of this token; endLine and endColumn describe the position of the + * last character of this token. + */ + public int beginLine, beginColumn, endLine, endColumn; + + /** + * The string image of the token. + */ + public String image; + + /** + * A reference to the next regular (non-special) token from the input + * stream. If this is the last token from the input stream, or if the + * token manager has not read tokens beyond this one, this field is + * set to null. This is true only if this token is also a regular + * token. Otherwise, see below for a description of the contents of + * this field. + */ + public Token next; + + /** + * This field is used to access special tokens that occur prior to this + * token, but after the immediately preceding regular (non-special) token. + * If there are no such special tokens, this field is set to null. + * When there are more than one such special token, this field refers + * to the last of these special tokens, which in turn refers to the next + * previous special token through its specialToken field, and so on + * until the first special token (whose specialToken field is null). + * The next fields of special tokens refer to other special tokens that + * immediately follow it (without an intervening regular token). If there + * is no such token, this field is null. + */ + public Token specialToken; + + /** + * Returns the image. + */ + public final String toString() + { + return image; + } + + /** + * Returns a new Token object, by default. However, if you want, you + * can create and return subclass objects based on the value of ofKind. + * Simply add the cases to the switch for all those special cases. + * For example, if you have a subclass of Token called IDToken that + * you want to create if ofKind is ID, simlpy add something like : + * + * case MyParserConstants.ID : return new IDToken(); + * + * to the following switch statement. Then you can cast matchedToken + * variable to the appropriate type and use it in your lexical actions. + */ + public static final Token newToken(int ofKind) + { + switch(ofKind) + { + default : return new Token(); + } + } + +} diff --git a/examples/Mini/TokenMgrError.java b/examples/Mini/TokenMgrError.java new file mode 100644 index 00000000..e922f5e5 --- /dev/null +++ b/examples/Mini/TokenMgrError.java @@ -0,0 +1,133 @@ +/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 0.7pre2 */ +package Mini; + +public class TokenMgrError extends Error +{ + /* + * Ordinals for various reasons why an Error of this type can be thrown. + */ + + /** + * Lexical error occured. + */ + static final int LEXICAL_ERROR = 0; + + /** + * An attempt wass made to create a second instance of a static token manager. + */ + static final int STATIC_LEXER_ERROR = 1; + + /** + * Tried to change to an invalid lexical state. + */ + static final int INVALID_LEXICAL_STATE = 2; + + /** + * Detected (and bailed out of) an infinite loop in the token manager. + */ + static final int LOOP_DETECTED = 3; + + /** + * Indicates the reason why the exception is thrown. It will have + * one of the above 4 values. + */ + int errorCode; + + /** + * Replaces unprintable characters by their espaced (or unicode escaped) + * equivalents in the given string + */ + protected static final String addEscapes(String str) { + StringBuffer retval = new StringBuffer(); + char ch; + for (int i = 0; i < str.length(); i++) { + switch (str.charAt(i)) + { + case 0 : + continue; + case '\b': + retval.append("\\b"); + continue; + case '\t': + retval.append("\\t"); + continue; + case '\n': + retval.append("\\n"); + continue; + case '\f': + retval.append("\\f"); + continue; + case '\r': + retval.append("\\r"); + continue; + case '\"': + retval.append("\\\""); + continue; + case '\'': + retval.append("\\\'"); + continue; + case '\\': + retval.append("\\\\"); + continue; + default: + if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { + String s = "0000" + Integer.toString(ch, 16); + retval.append("\\u" + s.substring(s.length() - 4, s.length())); + } else { + retval.append(ch); + } + continue; + } + } + return retval.toString(); + } + + /** + * Returns a detailed message for the Error when it is thrown by the + * token manager to indicate a lexical error. + * Parameters : + * EOFSeen : indicates if EOF caused the lexicl error + * curLexState : lexical state in which this error occured + * errorLine : line number when the error occured + * errorColumn : column number when the error occured + * errorAfter : prefix that was seen before this error occured + * curchar : the offending character + * Note: You can customize the lexical error message by modifying this method. + */ + private static final String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { + return("Lexical error at line " + + errorLine + ", column " + + errorColumn + ". Encountered: " + + (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") + + "after : \"" + addEscapes(errorAfter) + "\""); + } + + /** + * You can also modify the body of this method to customize your error messages. + * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not + * of end-users concern, so you can return something like : + * + * "Internal Error : Please file a bug report .... " + * + * from this method for such cases in the release version of your parser. + */ + public String getMessage() { + return super.getMessage(); + } + + /* + * Constructors of various flavors follow. + */ + + public TokenMgrError() { + } + + public TokenMgrError(String message, int reason) { + super(message); + errorCode = reason; + } + + public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) { + this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); + } +} diff --git a/examples/Mini/Variable.java b/examples/Mini/Variable.java new file mode 100644 index 00000000..11aa7c2b --- /dev/null +++ b/examples/Mini/Variable.java @@ -0,0 +1,50 @@ +package Mini; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; + +/** + * Represents a variable declared in a LET expression or a FUN declaration. + * + * @version $Id$ + * @author M. Dahm + */ +public class Variable implements EnvEntry { + private ASTIdent name; // Reference to the original declaration + private boolean reserved; // Is a key word? + + private int line, column; // Extracted from name.getToken() + private String var_name; // Short for name.getName() + private LocalVariableGen local_var; // local var associated with this variable + + public Variable(ASTIdent name) { + this(name, false); + } + + public Variable(ASTIdent name, boolean reserved) { + this.name = name; + this.reserved = reserved; + + var_name = name.getName(); + line = name.getLine(); + column = name.getColumn(); + } + + public String toString() { + if(!reserved) + return var_name + " declared at line " + line + ", column " + column; + else + return var_name + " "; + } + + public ASTIdent getName() { return name; } + public String getHashKey() { return var_name; } + public int getLine() { return line; } + public int getColumn() { return column; } + public int getType() { return name.getType(); } + + void setLocalVariable(LocalVariableGen local_var) { + this.local_var = local_var; + } + LocalVariableGen getLocalVariable() { return local_var; } +} + diff --git a/examples/Mini/fac.mini b/examples/Mini/fac.mini new file mode 100644 index 00000000..d42b965a --- /dev/null +++ b/examples/Mini/fac.mini @@ -0,0 +1,10 @@ +-- Compute factorial + +FUN fac (n) = IF n == 0 THEN 1 + ELSE n * fac(n - 1) + FI + +FUN main() = LET + n = READ() + IN + WRITE(fac(n)) diff --git a/examples/Mini/fib.mini b/examples/Mini/fib.mini new file mode 100644 index 00000000..74fa1018 --- /dev/null +++ b/examples/Mini/fib.mini @@ -0,0 +1,11 @@ +-- Compute fibonacci numbers + +FUN fib(n) = + IF n == 0 THEN 0 + ELSE IF n == 1 THEN 1 + ELSE fib(n - 1) + fib(n - 2) FI FI + +FUN main() = + LET n = READ() + IN + WRITE(fib(n)) diff --git a/examples/Mini/max.mini b/examples/Mini/max.mini new file mode 100644 index 00000000..bee8ee51 --- /dev/null +++ b/examples/Mini/max.mini @@ -0,0 +1,21 @@ +FUN max(a, b) = IF a > b THEN a ELSE b FI + +-- n anzahl schleifendurchlaeufe +-- m bisheriges maximum +FUN LOOP(n, m) = IF n > 0 THEN + LET + x = READ() + IN + LOOP(n - 1, max(m, x)) + ELSE + m + FI + +FUN abs(n) = IF n > 0 THEN n ELSE -n FI + +FUN main() = + LET a = READ() +-- b = READ() + IN + --WRITE(max(a, b)) + WRITE(LOOP(abs(a), -47110815)) diff --git a/examples/Package.java b/examples/Package.java new file mode 100644 index 00000000..3b47ecd2 --- /dev/null +++ b/examples/Package.java @@ -0,0 +1,243 @@ +import java.util.*; +import java.util.jar.*; +import java.util.zip.*; +import java.io.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.*; +import org.apache.bcel.util.ClassPath; + +/** + * Package the client. Creates a jar file in the current directory + * that contains a minimal set of classes needed to run the client. + * + * Use BCEL to extract class names and read/write classes + * @author First Hop Ltd / Torsten Rueger + */ +public class Package { + + /** + * The name of the resulting jar is Client.jar + */ + static String defaultJar = "Client.jar"; + + /* + * See usage() for arguments. Create an instance and run that + *(just so not all members have to be static) + */ + static void main(String args[]) { + Package instance = new Package(); + try{ + instance.go(args); + }catch(Exception e){ + e.printStackTrace(); + instance.usage(); + } + } + + /** + * We use a "default ClassPath object which uses the environments + * CLASSPATH + */ + ClassPath classPath = new ClassPath(); + + /** + * A map for all Classes, the ones we're going to package. + * Store class name against the JavaClass. From the JavaClass + * we get the bytes to create the jar. + */ + TreeMap allClasses = new TreeMap(); + /** + * We start at the root classes, put them in here, then go through + * this list, putting dependent classes in here and from there + * into allClasses. Store class names against class names of their dependents + */ + TreeMap dependents = new TreeMap(); + /** + * Collect all classes that could not be found in the classpath. + * Store class names against class names of their dependents + */ + TreeMap notFound = new TreeMap(); + /** + * See wheather we print the classes that were not found (default = false) + */ + boolean showNotFound = false ; + /** + * Remember wheather to print allClasses at the end (default = false) + */ + boolean printClasses = false ; + /** + * Wheather we log classes during processing (default = false) + */ + boolean log = false ; + + public void usage(){ + System.out.println(" This program packages classes and all their dependents"); + System.out.println(" into one jar. Give all starting classes (your main)"); + System.out.println(" on the command line. Use / as separator, the .class is"); + System.out.println(" optional. We use the environments CLASSPATH to resolve"); + System.out.println(" classes. Anything but java.* packages are packaged."); + System.out.println(" If you use Class.forName (or similar), be sure to"); + System.out.println(" include the classes that you load dynamically on the"); + System.out.println(" command line.\n"); + System.out.println(" These options are recognized:"); + System.out.println(" -e -error Show errors, meaning classes that could not "); + System.out.println(" resolved + the classes that referenced them."); + System.out.println(" -l -log Show classes as they are processed. This will"); + System.out.println(" include doubles, java classes and is difficult to"); + System.out.println(" read. I use it as a sort of progress monitor"); + System.out.println(" -s -show Prints all the classes that were packaged"); + System.out.println(" in alphabetical order, which is ordered by package"); + System.out.println(" for the most part."); + } + /** + * the main of this class + */ + void go(String[] args) throws IOException { + JavaClass clazz ; + // sort the options + for(int i = 0 ; i < args.length ; i++ ){ + if( args[i].startsWith("-e") ) { + showNotFound = true; + continue; + } + if( args[i].startsWith("-s") ) { + printClasses = true ; + continue; + } + if( args[i].startsWith("-l") ) { + log = true ; + continue; + } + String clName = args[i]; + if(clName.endsWith(".class")) { + clName = clName.substring(0,clName.length()-6); + } + clName = clName.replace('.','/'); + clazz = new ClassParser(classPath.getInputStream(clName),clName).parse(); + // here we create the root set of classes to process + addDependents(clazz); + System.out.println("Packaging for class: " + clName ); + } + if( dependents.isEmpty() ){ + usage(); + return ; + } + System.out.println("Creating jar file: " + defaultJar ); + // starting processing: Grab from the dependents list an add back to it + // and the allClasses list. see addDependents + while(!dependents.isEmpty() ){ + String name = (String)dependents.firstKey(); + String from = (String) dependents.remove(name); + if(allClasses.get(name) == null){ + try{ + InputStream is = classPath.getInputStream(name); + clazz = new ClassParser(is, name).parse(); + addDependents(clazz); + }catch( IOException e){ + //System.err.println("Error, class not found " + name ); + notFound.put(name,from); + } + } + } + if(printClasses) { // if wanted show all classes + printAllClasses(); + } + // create the jar + JarOutputStream jarFile = new JarOutputStream(new FileOutputStream(defaultJar)); + jarFile.setLevel(5); // use compression + Iterator keys = allClasses.keySet().iterator(); + int written = 0 ; + while(keys.hasNext()){ // add entries for every class + String name = (String)keys.next(); + JavaClass claz = (JavaClass) allClasses.get(name); + ZipEntry zipEntry = new ZipEntry(name+".class"); + byte[] bytes = claz.getBytes() ; + int length = bytes.length ; + jarFile.putNextEntry(zipEntry); + jarFile.write( bytes , 0 , length ); + written += length; // for logging + } + jarFile.close(); + System.err.println("The jar file contains " + allClasses.size() + +" classes and contains " +written+ " bytes"); + if( !notFound.isEmpty() ){ + System.err.println( notFound.size() +" classes could not be found"); + if(showNotFound){ // if wanted show the actual classes that we not found + while(!notFound.isEmpty()){ + String name = (String)notFound.firstKey(); + System.err.println( name+ " (" + notFound.remove(name)+")"); + } + }else{ + System.err.println("Use '-e' option to view classes that were not found"); + } + } + } + + /** + * Print all classes that were packaged. Sort alphabetically for better + * overview. Enabled by -s option + */ + void printAllClasses(){ + ArrayList names = new ArrayList(allClasses.keySet()); + Collections.sort(names); + for( int i = 0 ; i < names.size() ; i ++ ){ + String cl = (String)names.get(i); + System.err.println(cl); + } + } + + /** + *Add this class to allClasses. Then go through all its dependents + * and add them to the dependents list if they are not in allClasses + */ + void addDependents( JavaClass clazz ) throws IOException { + String name = clazz.getClassName().replace('.', '/'); + allClasses.put( name , clazz ); + ConstantPool pool = clazz.getConstantPool(); + for( int i = 1 ; i < pool.getLength() ; i++){ + Constant cons = pool.getConstant(i); + //System.out.println("("+i+") " + cons ); + if( cons!=null && cons.getTag() == Constants.CONSTANT_Class ){ + int idx = ((ConstantClass)pool.getConstant(i)).getNameIndex(); + String clas = ((ConstantUtf8)pool.getConstant(idx)).getBytes(); + addClassString(clas,name); + } + } + } + + /** + * add given class to dependents (from is where its dependent from) + * some fiddeling to be done because of array class notation + */ + void addClassString(String clas,String from) throws IOException{ + if(log){ + System.out.println("processing: " + clas +" referenced by " + from); + } + // must check if it's an arrary (start with "[") + if(clas.startsWith("[")) { + if(clas.length() == 2 ) { + // it's an array of built in type, ignore + return; + } + if( 'L' == clas.charAt(1) ){ + // it's an array of objects, the class name is between [L and ; + // like [Ljava/lang/Object; + addClassString(clas.substring(2,clas.length()-1),from); + return; + } + if( '[' == clas.charAt(1) ){ + // it's an array of arrays, call recursive + addClassString(clas.substring(1),from); + return ; + } + throw new IOException("Can't recognize class name =" + clas); + } + + if( !clas.startsWith("java/") && allClasses.get(clas) == null) { + dependents.put(clas,from); + // System.out.println(" yes" ); + } else { + // System.out.println(" no" ); + } + } +} diff --git a/examples/Peephole.java b/examples/Peephole.java new file mode 100644 index 00000000..17d93874 --- /dev/null +++ b/examples/Peephole.java @@ -0,0 +1,88 @@ +import java.io.*; + +import java.util.Iterator; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.Repository; +import org.apache.bcel.util.InstructionFinder; + +/** + * Remove NOPs from given class + * + * @version $Id$ + * @author M. Dahm + */ +public class Peephole { + public static void main(String[] argv) { + try { + /* Load the class from CLASSPATH. + */ + JavaClass clazz = Repository.lookupClass(argv[0]); + Method[] methods = clazz.getMethods(); + ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); + + for(int i=0; i < methods.length; i++) { + if(!(methods[i].isAbstract() || methods[i].isNative())) { + MethodGen mg = new MethodGen(methods[i], + clazz.getClassName(), cp); + Method stripped = removeNOPs(mg); + + if(stripped != null) // Any NOPs stripped? + methods[i] = stripped; // Overwrite with stripped method + } + } + + /* Dump the class to _.class + */ + clazz.setConstantPool(cp.getFinalConstantPool()); + clazz.dump(clazz.getClassName() + "_.class"); + } catch(Exception e) { e.printStackTrace(); } + } + + private static final Method removeNOPs(MethodGen mg) { + InstructionList il = mg.getInstructionList(); + InstructionFinder f = new InstructionFinder(il); + String pat = "NOP+"; // Find at least one NOP + InstructionHandle next = null; + int count = 0; + + for(Iterator e = f.search(pat); e.hasNext(); ) { + InstructionHandle[] match = (InstructionHandle[])e.next(); + InstructionHandle first = match[0]; + InstructionHandle last = match[match.length - 1]; + + /* Some nasty Java compilers may add NOP at end of method. + */ + if((next = last.getNext()) == null) + break; + + count += match.length; + + /* Delete NOPs and redirect any references to them to the following + * (non-nop) instruction. + */ + try { + il.delete(first, last); + } catch(TargetLostException e2) { + InstructionHandle[] targets = e2.getTargets(); + for(int i=0; i < targets.length; i++) { + InstructionTargeter[] targeters = targets[i].getTargeters(); + + for(int j=0; j < targeters.length; j++) + targeters[j].updateTarget(targets[i], next); + } + } + } + + Method m = null; + + if(count > 0) { + System.out.println("Removed " + count + " NOP instructions from method " + + mg.getName()); + m = mg.getMethod(); + } + + il.dispose(); // Reuse instruction handles + return m; + } +} diff --git a/examples/ProxyCreator.java b/examples/ProxyCreator.java new file mode 100644 index 00000000..75b49711 --- /dev/null +++ b/examples/ProxyCreator.java @@ -0,0 +1,105 @@ +import java.io.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.util.ByteSequence; +import org.apache.bcel.*; +import java.awt.event.*; +import java.util.Vector; +import java.util.zip.*; + +/** + * Dynamically creates and uses a proxy for java.awt.event.ActionListener + * via the classloader mechanism if called with + *
java org.apache.bcel.util.JavaWrapper ProxyCreator
+ * + * The trick is to encode the byte code we need into the class name + * using the Utility.encode() method. This will result however in big + * ugly class name, so for many cases it will be more sufficient to + * put some clever creation code into the class loader.
This is + * comparable to the mechanism provided via + * java.lang.reflect.Proxy, but much more flexible. + * + * @version $Id$ + * @author M. Dahm + * @see org.apache.bcel.util.JavaWrapper + * @see org.apache.bcel.util.ClassLoader + * @see Utility + */ +public class ProxyCreator { + /** Load class and create instance + */ + public static Object createProxy(String pack, String class_name) { + try { + Class cl = Class.forName(pack + "$$BCEL$$" + class_name); + return cl.newInstance(); + } catch(Exception e) { + e.printStackTrace(); + } + + return null; + } + + /** Create JavaClass object for a simple proxy for an java.awt.event.ActionListener + * that just prints the passed arguments, load and use it via the class loader + * mechanism. + */ + public static void main(String[] argv) throws Exception { + ClassLoader loader = ProxyCreator.class.getClassLoader(); + + // instanceof won't work here ... + if(loader.getClass().toString().equals("class org.apache.bcel.util.ClassLoader")) { + // Real class name will be set by the class loader + ClassGen cg = new ClassGen("foo", "java.lang.Object", "", Constants.ACC_PUBLIC, + new String[] {"java.awt.event.ActionListener"}); + + // That's important, otherwise newInstance() won't work + cg.addEmptyConstructor(Constants.ACC_PUBLIC); + + InstructionList il = new InstructionList(); + ConstantPoolGen cp = cg.getConstantPool(); + InstructionFactory factory = new InstructionFactory(cg); + + int out = cp.addFieldref("java.lang.System", "out", + "Ljava/io/PrintStream;"); + int println = cp.addMethodref("java.io.PrintStream", "println", + "(Ljava/lang/Object;)V"); + MethodGen mg = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, + new Type[] { + new ObjectType("java.awt.event.ActionEvent") + }, null, "actionPerformed", "foo", il, cp); + + // System.out.println("actionPerformed:" + event); + il.append(new GETSTATIC(out)); + il.append(factory.createNew("java.lang.StringBuffer")); + il.append(InstructionConstants.DUP); + il.append(new PUSH(cp, "actionPerformed:")); + il.append(factory.createInvoke("java.lang.StringBuffer", "", Type.VOID, + new Type[] {Type.STRING}, Constants.INVOKESPECIAL)); + + il.append(new ALOAD(1)); + il.append(factory.createAppend(Type.OBJECT)); + il.append(new INVOKEVIRTUAL(println)); + il.append(InstructionConstants.RETURN); + + mg.stripAttributes(true); + mg.setMaxStack(); + mg.setMaxLocals(); + cg.addMethod(mg.getMethod()); + + byte[] bytes = cg.getJavaClass().getBytes(); + + System.out.println("Uncompressed class: " + bytes.length); + + String s = Utility.encode(bytes, true); + System.out.println("Encoded class: " + s.length()); + + System.out.print("Creating proxy ... "); + ActionListener a = (ActionListener)createProxy("foo.bar.", s); + System.out.println("Done. Now calling actionPerformed()"); + + a.actionPerformed(new ActionEvent(a, ActionEvent.ACTION_PERFORMED, "hello")); + } else + System.err.println("Call me with java org.apache.bcel.util.JavaWrapper ProxyCreator"); + } + +} diff --git a/examples/helloify.java b/examples/helloify.java new file mode 100644 index 00000000..3dab45e2 --- /dev/null +++ b/examples/helloify.java @@ -0,0 +1,109 @@ +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.Constants; + +/** + * Read class file(s) and patch all of its methods, so that they print + * "hello" and their name and signature before doing anything else. + * + * @version $Id$ + * @author M. Dahm + */ +public final class helloify implements Constants { + private static String class_name; + private static ConstantPoolGen cp; + private static int out; // reference to System.out + private static int println; // reference to PrintStream.println + + public static void main(String[] argv) { + try { + for(int i=0; i < argv.length; i++) { + if(argv[i].endsWith(".class")) { + JavaClass java_class = new ClassParser(argv[i]).parse(); + ConstantPool constants = java_class.getConstantPool(); + String file_name = argv[i].substring(0, argv[i].length() - 6) + + "_hello.class"; + cp = new ConstantPoolGen(constants); + + helloifyClassName(java_class); + + out = cp.addFieldref("java.lang.System", "out", + "Ljava/io/PrintStream;"); + println = cp.addMethodref("java.io.PrintStream", "println", + "(Ljava/lang/String;)V"); + /* Patch all methods. + */ + Method[] methods = java_class.getMethods(); + + for(int j=0; j < methods.length; j++) // Directly use array + methods[j] = helloifyMethod(methods[j]); + + /* Finally dump it back to a file. + */ + java_class.setConstantPool(cp.getFinalConstantPool()); + java_class.dump(file_name); + } + } + } catch(Exception e) { + e.printStackTrace(); + } + } + + /** Change class name to _hello + */ + private static void helloifyClassName(JavaClass java_class ) { + class_name = java_class.getClassName() + "_hello"; + int index = java_class.getClassNameIndex(); + + index = ((ConstantClass)cp.getConstant(index)).getNameIndex(); + cp.setConstant(index, new ConstantUtf8(class_name.replace('.', '/'))); + } + + /** + * Patch a method. + */ + private static Method helloifyMethod(Method m) { + Code code = m.getCode(); + int flags = m.getAccessFlags(); + String name = m.getName(); + + // Sanity check + if(m.isNative() || m.isAbstract() || (code == null)) + return m; + + /* Create instruction list to be inserted at method start. + */ + String mesg = "Hello from " + Utility.methodSignatureToString(m.getSignature(), + name, + Utility.accessToString(flags)); + InstructionList patch = new InstructionList(); + patch.append(new GETSTATIC(out)); + patch.append(new PUSH(cp, mesg)); + patch.append(new INVOKEVIRTUAL(println)); + + MethodGen mg = new MethodGen(m, class_name, cp); + InstructionList il = mg.getInstructionList(); + InstructionHandle[] ihs = il.getInstructionHandles(); + + if(name.equals("")) { // First let the super or other constructor be called + for(int j=1; j < ihs.length; j++) { + if(ihs[j].getInstruction() instanceof INVOKESPECIAL) { + il.append(ihs[j], patch); // Should check: method name == "" + break; + } + } + } else + il.insert(ihs[0], patch); + + /* Stack size must be at least 2, since the println method takes 2 argument. + */ + if(code.getMaxStack() < 2) + mg.setMaxStack(2); + + m = mg.getMethod(); + + il.dispose(); // Reuse instruction handles + + return m; + } +} diff --git a/examples/id.java b/examples/id.java new file mode 100644 index 00000000..13b83d9d --- /dev/null +++ b/examples/id.java @@ -0,0 +1,47 @@ +import java.io.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.*; +import org.apache.bcel.generic.*; + +/** + * Test BCEL if an input file is identical to the outfile generated + * with BCEL. Of course there may some small differences, e.g., because + * BCEL generates local variable tables by default. + * + * Try to: + *
+% java id 
+% java listclass -code  > foo
+% java listclass -code .clazz > bar
+% diff foo bar | more
+ * 
+ *
+ * @version $Id$
+ * @author  M. Dahm
+ */
+public class id {
+  public static void main(String[] argv) throws Exception { 
+    JavaClass clazz = null;
+
+    if((clazz = Repository.lookupClass(argv[0])) == null)
+      clazz = new ClassParser(argv[0]).parse(); // May throw IOException
+
+    ClassGen cg = new ClassGen(clazz);
+
+    Method[] methods = clazz.getMethods();
+
+    for(int i=0; i < methods.length; i++) {
+      MethodGen mg = new MethodGen(methods[i], cg.getClassName(), cg.getConstantPool());
+      cg.replaceMethod(methods[i], mg.getMethod());
+    }
+
+    Field[] fields = clazz.getFields();
+
+    for(int i=0; i < fields.length; i++) {
+      FieldGen fg =  new FieldGen(fields[i], cg.getConstantPool());
+      cg.replaceField(fields[i], fg.getField());
+    }
+
+    cg.getJavaClass().dump(clazz.getClassName() + ".clazz");
+  }
+}
diff --git a/examples/listclass.java b/examples/listclass.java
new file mode 100644
index 00000000..049c755f
--- /dev/null
+++ b/examples/listclass.java
@@ -0,0 +1,225 @@
+import java.io.*;
+import java.util.*;
+import org.apache.bcel.classfile.*;
+import org.apache.bcel.*;
+
+/**
+ * Read class file(s) and display its contents. The command line usage is:
+ *
+ * 
java listclass [-constants] [-code] [-brief] [-dependencies] [-nocontents] [-recurse] class... [-exclude ]
+ * where + *
    + *
  • -code List byte code of methods
  • + *
  • -brief List byte codes briefly
  • + *
  • -constants Print constants table (constant pool)
  • + *
  • -recurse Usually intended to be used along with + * -dependencies When this flag is set, listclass will also print information + * about all classes which the target class depends on.
  • + * + *
  • -dependencies Setting this flag makes listclass print a list of all + * classes which the target class depends on. Generated from getting all + * CONSTANT_Class constants from the constant pool.
  • + * + *
  • -exclude All non-flag arguments after this flag are added to an + * 'exclusion list'. Target classes are compared with the members of the + * exclusion list. Any target class whose fully qualified name begins with a + * name in the exclusion list will not be analyzed/listed. This is meant + * primarily when using both -recurse to exclude java, javax, and sun classes, + * and is recommended as otherwise the output from -recurse gets quite long and + * most of it is not interesting. Note that -exclude prevents listing of + * classes, it does not prevent class names from being printed in the + * -dependencies list.
  • + *
  • -nocontents Do not print JavaClass.toString() for the class. I added + * this because sometimes I'm only interested in dependency information.
  • + *
+ *

Here's a couple examples of how I typically use listclass:
+ *

java listclass -code MyClass
+ * Print information about the class and the byte code of the methods + *
java listclass -nocontents -dependencies MyClass
+ * Print a list of all classes which MyClass depends on. + *
java listclass -nocontents -recurse MyClass -exclude java. javax. sun.
+ * Print a recursive listing of all classes which MyClass depends on. Do not + * analyze classes beginning with "java.", "javax.", or "sun.". + *
java listclass -nocontents -dependencies -recurse MyClass -exclude java.javax. sun.
+ * Print a recursive listing of dependency information for MyClass and its + * dependents. Do not analyze classes beginning with "java.", "javax.", or "sun." + *

+ * + * @version $Id$ + * @author M. Dahm, + * Thomas Wheeler + */ +public class listclass { + boolean code, constants, verbose, classdep, nocontents, recurse; + Hashtable listedClasses; + Vector exclude_name; + + public static void main(String[] argv) { + Vector file_name = new Vector(); + Vector exclude_name = new Vector(); + boolean code = false, constants=false, verbose=true, classdep=false, + nocontents=false, recurse=false, exclude=false; + String name = null; + + /* Parse command line arguments. + */ + for(int i=0; i < argv.length; i++) { + if(argv[i].charAt(0) == '-') { // command line switch + if(argv[i].equals("-constants")) + constants=true; + else if(argv[i].equals("-code")) + code=true; + else if(argv[i].equals("-brief")) + verbose=false; + else if(argv[i].equals("-dependencies")) + classdep=true; + else if(argv[i].equals("-nocontents")) + nocontents=true; + else if(argv[i].equals("-recurse")) + recurse=true; + else if(argv[i].equals("-exclude")) + exclude=true; + else if(argv[i].equals("-help")) { + System.out.println( "Usage: java listclass [-constants] [-code] [-brief] " + + "[-dependencies] [-nocontents] [-recurse] class... " + + "[-exclude ]\n" + + "-constants Print constants table (constant pool)\n" + + "-code Dump byte code of methods\n" + + "-brief Brief listing\n" + + "-dependencies Show class dependencies\n" + + "-nocontents Do not print field/method information\n" + + "-recurse Recurse into dependent classes\n" + + "-exclude Do not list classes beginning with " + + "strings in " ); + System.exit( 0 ); + } else + System.err.println("Unknown switch " + argv[i] + " ignored."); + } else { // add file name to list + if(exclude) + exclude_name.addElement(argv[i]); + else + file_name.addElement(argv[i]); + } + } + + if(file_name.size() == 0) + System.err.println("list: No input files specified"); + else { + listclass listClass = new listclass(code, constants, verbose, classdep, + nocontents, recurse, exclude_name); + + for(int i=0; i < file_name.size(); i++) { + name = (String) file_name.elementAt(i); + + listClass.list(name); + } + } + } + + public listclass(boolean code, boolean constants, boolean verbose, boolean classdep, + boolean nocontents, boolean recurse, Vector exclude_name) + { + this.code = code; + this.constants = constants; + this.verbose = verbose; + this.classdep = classdep; + this.nocontents = nocontents; + this.recurse = recurse; + this.listedClasses = new Hashtable(); + this.exclude_name = exclude_name; + } + + /** Print the given class on screen + */ + public void list(String name) { + try { + JavaClass java_class; + + if((listedClasses.get(name) != null) || name.startsWith("[")) + return; + + for(int idx = 0; idx < exclude_name.size(); idx++) + if(name.startsWith((String) exclude_name.elementAt(idx))) + return; + + if((java_class = Repository.lookupClass(name)) == null) + java_class = new ClassParser(name).parse(); // May throw IOException + + if(nocontents) + System.out.println(java_class.getClassName()); + else + System.out.println(java_class); // Dump the contents + + if(constants) // Dump the constant pool ? + System.out.println(java_class.getConstantPool()); + + if(code) // Dump the method code ? + printCode(java_class.getMethods(), verbose); + + if(classdep) + printClassDependencies(java_class.getConstantPool()); + + listedClasses.put(name, name); + + if(recurse) { + String[] dependencies = getClassDependencies(java_class.getConstantPool()); + + for(int idx = 0; idx < dependencies.length; idx++) + list(dependencies[idx]); + } + } catch(IOException e) { + System.out.println("Error loading class " + name + " (" + e.getMessage() + ")"); + } + catch(Exception e) { + System.out.println("Error processing class " + name + " (" + e.getMessage() + ")"); + } + } + + /** + * Dump the list of classes this class is dependent on + */ + public static void printClassDependencies(ConstantPool pool) { + String[] names = getClassDependencies(pool); + System.out.println("Dependencies:"); + for(int idx = 0; idx < names.length; idx++) + System.out.println("\t" + names[idx]); + } + + public static String[] getClassDependencies(ConstantPool pool) { + String[] tempArray = new String[pool.getLength()]; + int size = 0; + StringBuffer buf = new StringBuffer(); + + for(int idx = 0; idx < pool.getLength(); idx++) { + Constant c = pool.getConstant(idx); + if(c != null && c.getTag() == Constants.CONSTANT_Class) { + ConstantUtf8 c1 = (ConstantUtf8) pool.getConstant(((ConstantClass)c).getNameIndex()); + buf.setLength(0); + buf.append(new String(c1.getBytes())); + for(int n = 0; n < buf.length(); n++) { + if(buf.charAt(n) == '/') + buf.setCharAt(n, '.'); + } + + tempArray[size++] = buf.toString(); + } + } + + String[] dependencies = new String[size]; + System.arraycopy(tempArray, 0, dependencies, 0, size); + return dependencies; + } + + /** + * Dump the disassembled code of all methods in the class. + */ + public static void printCode(Method[] methods, boolean verbose) { + for(int i=0; i < methods.length; i++) { + System.out.println(methods[i]); + + Code code = methods[i].getCode(); + if(code != null) + System.out.println(code.toString(verbose)); + } + } +} diff --git a/examples/maxstack.java b/examples/maxstack.java new file mode 100644 index 00000000..4f62b517 --- /dev/null +++ b/examples/maxstack.java @@ -0,0 +1,61 @@ +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.Constants; +import org.apache.bcel.*; + +/** + * Read class file(s) and examine all of its methods, determining the + * maximum stack depth used by analyzing control flow. + * + * @version $Id$ + * @author M. Dahm + */ +public final class maxstack { + public static void main(String[] argv) { + try { + for(int i = 0; i < argv.length; i++) { + String class_name = argv[i]; + JavaClass java_class = Repository.lookupClass(class_name); + + if(java_class == null) // Look for .class file? + java_class = new ClassParser(class_name).parse(); + + ConstantPoolGen cp = new ConstantPoolGen(java_class.getConstantPool()); + Method[] methods = java_class.getMethods(); + + for(int j = 0; j < methods.length; j++) { + Method m = methods[j]; + + if(!(m.isAbstract() || m.isNative())) { + MethodGen mg = new MethodGen(m, argv[i], cp); + + int compiled_stack = mg.getMaxStack(); + int compiled_locals = mg.getMaxLocals(); + mg.setMaxStack(); // Recompute value + mg.setMaxLocals(); + int computed_stack = mg.getMaxStack(); + int computed_locals = mg.getMaxLocals(); + + mg.getInstructionList().dispose(); // Reuse instruction handles + + System.out.println(m); + + if(computed_stack == compiled_stack) + System.out.println("Stack ok(" + computed_stack + ")"); + else + System.out.println("\nCompiled stack size " + compiled_stack + + " computed size " + computed_stack); + + if(computed_locals == compiled_locals) + System.out.println("Locals ok(" + computed_locals + ")"); + else + System.out.println("\nCompiled locals " + compiled_locals + + " computed size " + computed_locals); + } + } + } + } catch(Exception e) { + e.printStackTrace(); + } + } +} diff --git a/examples/patchclass.java b/examples/patchclass.java new file mode 100644 index 00000000..a56c2a5c --- /dev/null +++ b/examples/patchclass.java @@ -0,0 +1,90 @@ +import java.io.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.Constants; + +/** + * Patch all Utf8 constants in the given class file file.class + * and save the result in _file.class. + * + * Usage: patch files + * + * @version $Id$ + * @author M. Dahm + */ +public class patchclass { + public static void main(String[] argv) { + String[] file_name = new String[argv.length]; + int files = 0; + ClassParser parser = null; + JavaClass java_class; + + if(argv.length < 3) { + System.err.println("Usage: patch file1.class ..."); + System.exit(-1); + } + + try { + for(int i=2; i < argv.length; i++) + file_name[files++] = argv[i]; + + for(int i=0; i < files; i++) { + parser = new ClassParser(file_name[i]); + java_class = parser.parse(); + + patchIt(argv[0], argv[1], + java_class.getConstantPool().getConstantPool()); + + // Dump the changed class to a new file + java_class.dump("_" + file_name[i]); + System.out.println("Results saved in: _" + file_name[i]); + } + } catch(Exception e) { + System.err.println(e); + } + } + /* + * Replace all occurences of string "old" with + * "replacement" in all Utf8 constants + */ + private static void patchIt(String old, String replacement, + Constant[] constant_pool) + { + ConstantUtf8 c; + String str; + int index, old_index; + StringBuffer buf; + + /* Loop through constant pool + */ + for(short i=0; i < constant_pool.length; i++) { + if(constant_pool[i] instanceof ConstantUtf8) { // Utf8 string found + try { + c = (ConstantUtf8)constant_pool[i]; // Get the string + str = c.getBytes(); + + if((index = str.indexOf(old)) != -1) { // `old' found in str + buf = new StringBuffer(); // target buffer + old_index = 0; // String start offset + + // While we have something to replace + while((index = str.indexOf(old, old_index)) != -1) { + buf.append(str.substring(old_index, index)); // append prefix + buf.append(replacement); // append `replacement' + + old_index = index + old.length(); // Skip `old'.length chars + } + + buf.append(str.substring(old_index)); // append rest of string + str = buf.toString(); + + // Finally push the new string back to the constant pool + c = new ConstantUtf8(str); + constant_pool[i] = c; + } + } catch(StringIndexOutOfBoundsException e) { // Should not occur + System.err.println(e); + } + } + } + } +} diff --git a/lib/CCK.jar b/lib/CCK.jar new file mode 100644 index 0000000000000000000000000000000000000000..ee54a18c7b8a0be096c276831a77aae006a05c61 GIT binary patch literal 473400 zcmWIWW@Zs#;9%fjNbK;?Ww72fYOYEmao<5)cqB&(J*wMeGe^`L5)`2=2yEUR{)}$8X7iX5_ z7gZLQeYGA@V2A;?*+vOv-`<&FP+VS5)Mpim;qe6s@ z+d^0IKGAaB#J!5!oL^ijkC`8oq(A-2uKRnV%CAiq761NCruWv=37q>MBvq?yG-|nE z{7vS5^^Sv<{0X|3-xu`yJS$#wn#q@M#{<^(tug8wbmu>OdZ>f@$Ckqyjc;Kz_Q42HgEw59!^3V3`bM3n?Y-`$PFFTr>?sw|S zi;41AqHp`8^31yb>T>J4(!cZG&fBc{b+5nqmRqY6cjSDUzx`$JeAClUW|v(_TdZZf z__AaFZN56s>)AiJzGNMEKkZ^^`z^=64aMynUsver0?Z|#fbDZH1zt9kj{3f-iH4Q$|qzVC2fM+yT2Ln=x_M|YthiVK5XU67oZ z@F4Yv(h&vG`FS(v%$YSSYU)hO%NA>wFHd-OX3Na~m(R^Hv@2G7d*=U^|LK?hG4K4J z{?Fd{^Z)-d_2=9E{`&g*y}i|v9n4+!krI*;EfOUTG85+Vtmzh8v7*Xv(u^gKIGut^ z{QQD4nKw$S`v!j0Y3f+D#kY_%rBF1bkT<1p_JS2fg%c0nbhe6{&08fIsupwU#~aPH@JA3ynR4>;2v{#kT*_f40?&7J4fIMo$n*Pk`J*IxREzuSUSvM4^! zqWDBp^=9AKEaLaiTJ7oQ^~=3hFnd8!lP7Od>~f{!jBN9onPmL9bk6bV@>~N4+?v#1 zCchXM7*rXNqt-PAHENLyBL9F$xbbH`BZrif!x2V>9mNm+zvt)WRrvP*e}W|s zIG!6D=Q^?5jy`LV@NAuPTXJ6Ujol$FEmE6=jL%3u$&Lu? zuob!|a_Y#j9F>^|Zdrf5W%cdKC9}?%yqSlRSWk1=*(aRUyFIO{;kjG>{>Aw#v(=fK zO~D>fEen?KVPIfbiZ=xy7fnI_!O$eYSjy1#-`&&A!ZJ~qL7ZVB1H*p?hJuC(`}gl> zU|>-E$->CMz{CJ5L>WNx3`}lQ`d1!Ub18_~aZ|v>Gar(wW#yKePW7B7K5Nw*MghJf-BzJjj>n!^d#}2;AH7ev&2Ns@HrA!j3i}3_}2Jl<$TV$QRSVXe|x28AZOOPOSi0N zOWytACq4b_F0qS61)tl4eY*Kt3=AW7XMBCKl+_~C>{RuJj6#l56%(odf|nA@eKfmK$VIr*DD7or+FO7kLp$5f~d*TvNN;ahA?-J?_cA{)B zuTONS$iI8p(pGGGOxs>?T;ba6bE4WpXHiRdr0#;G=Zk_bK51nUP)}@#?UDXceKy#ZBko#)=$n_K5YK)EfN~XSfua1i9XeO&C__UW1Jl z8_eqjt?Yf+jy)*Rxnic%J9CSlu-=9(0j0aHtD{Qf!E;CZ4k@W+zDcNg++gtKX!JKN{WiNm3xN4kaxmHsluwq_qw-KkoC66Q~No*coFvs|1tCK|K~OwH1E3F%lO5a}7v<#eT@qTs`d+i$}%XKP&% zUA|5s>-(`SK1ubgo!h7V5WcWFV)6M^R)!T-+wE+lUzgQw*qE)k`ObGHe|=-KD}Fwo z_s_qXu666;%*xMEq2X~aZSP*bmz`cMw<5D9>*|ft+Y3uJzW@B^`@7;YvHUxe48_lB zzfaJrd)x6h;omany_J7Yt&BS@%s&6;hko_@kq7*p-F*N4e!br!?e*#@?=)8X#@m1P zd^~H_9r4TV+j{oKOkOK(;3LGjf9sN6&!66WyzThr{P(ACJiF%MvtZfF`OkK3PM95K zkLj7KZO8on`MI!a~{~|-5E0@pD(d;=FJ4dqitF9|gPJJF) z0a9_(?8@S_%u?mK)WqU5_1dPnnQ6(b+P283#*WWS$UR8q?1giSy8MEY)Mk}wsaOd1 zbxktOlT2$e)ALiaEDg+Sipol}>g$_i6sM%(VB}U6=ANamWG7;2CwuPNHE}b=NvkH= z&G9nJa#SZm0LRJGa3c^KGasfCr8dBi9yIjODb@v?|g64Fw%3RF{# zGcQdN{)m9mPPNI;KiT3=RDmff;-E8NSB!eR`>tjye8l=#KDZe6?HQs$Ic zsA-ia7nyE*?%4UhDhDYi6}Kp>urw9NIDHEb8MijA^tuSWG7}{~Eh#m=@M)%PXpi}7cn8OEH6sVNz5)xOWep%+)m3WNW&=1&@V;LJ`C{FFsy*rDRExLT}a(Ypan3Yseo}040l52yyuCu0*ms)9GmQj$>&TTuS^p!NN z6s0VTjO^sB{0yAJ6sEO#$;k;VTejMvNYxWa%k%AZ z>&(7s?0p2w9-=i9LrSol8oZY{G9TP{K7PZggDZ3{Oy_|&z-tpAmq!l*LQZ3Nj$Vo%XLSj*!k(iZoUzt@}nNn7n znVg-FN0HIBYgg60M3S=o{j$tX9XlHpWR=wvRWvEhEly9#$u20)%+5tdwq+sHqCAiPUOh|3!ihxUOo(qhcZhd;rzt{eGK;xsMJvZg!YAfbi zmtX4jp12@Db)%u*loh(sE>Sy=^oXyY9R1?r?Ml45Emo#Yv9GW6#!y}{#kSyg+%@wusPi&$osAMazyF3^#l z%Xi9$BXHviarNX=En6NgSv23kzR|R^B3Nk#zg14s-s*7e*`3Kf&jO+xYo~LI?>5MY zZ#;N-)q7Kkeee#wW zepb4#7*B})dh>vvcmA4UMy2f?j~821)O>I>s^}=@mWbmxL!e667nFl@aV~+P&k^fn}v%3eMZcpSaYm)uOV> zS=jqc;6WkZDM{yb|5-`|^(yy;G_$Prc+%*~vhG7+zt#gAr8d5F5$^*lSKZp&BGF=! z$RMnsv#H1IN`h1N+R81H8N@a%xzHl9^4Ml}MemS+##NDTHnuaC-7)Ae)3s?nXS5}0 zlaGYs2__%bj~6zz@1N}RiP_+QfuoN_;~jxEYmNs2zIw(k#jdt}0nWY3wxR&H&AS~>YY+z{PpWq^pxZ+Q%wc?B< zH~r89I*j5Xm!nQ_s7UJ=ar8GxF^WYz5ONY-wxr2fi$UW6tNFcvLc_JU?iifCrF^HM znTOA&$(du~6QlFm8ac-NLJa55d|;AdHCgPd*lKd=loBH&qz_>EL!?HZje$Xn4PRx0 z)DCs?^aIy5&<=J2mTnlgm`-K}L*f7Cl!ICm8X&y^J~mka_LMee?~aC~my`AiZQ^og zlI3>Ri=CWX>a$z(*kd7;M@0n-i?+YH^Tl}e(JQhlE;r0JTD19_J)L*w&D4J%+yhTM z73Q~?e9dM3?Yi#h4U3;<&folTqsjc)=_xranm{*!zIKylLq+g!ix1(w{0|Uc) z24sJs_sfy|<>BZPg6P~#Nt}>qafE?s_LM3Aj15Fgd~WQow`bOzayT{q>m)>q-IqTi!m~&g7UtaY>Wq!N2w3&Rt+?A@^6Vm)&_AfubXWica z`%-$VzwN4#|K614wmW0%6PM!k+xFcN+kD{Pxicc=OHWLiwx&*Pd!*P}p+9NC%Q+=a zpVptRd}htIs<&2}%%!ELb-k>`GxN8GJW7EMR&3PvJ$r+Jf#Ei>f#T!p=!OWCl=Ou3 zA197Xm^JIy|NsB@R)04#Fo1?g(gns%k`AAEd^Rb`FmcOBNl46$uwW6HAmP*Fqu2xO z^6$F#Xr&Va1A`BW_2~Ug(3oo`WF*tq(cRC}&C@jq;RcZefrKBY7+C(#x2@jy|3KrD z6CCB`?=M{Vu+)3n)TyCbCp4EWPd_)uZg+js{;5m9F5kXBW$Dyyxwq#@%rANS>np$f z{paE$>1m=F*{|o?RK7ZNZEM}W#9wa5gdPdi?w!0SN$Az9XfLIj^SNrJ7Q7(e7Ru&C&~r!;rYx<={7B0gSLS-qOc{OVRw4VA)X8#=bg z*2|bM=lE=1$UZq@`zsZ1wh4}$;wm#(c88ja6g8;Yx|FC@Ezz+%!L-rnK*!Yl!V8CF zG&!bcZaZDb%BDE`r^mmHf~X_s8y{$C#wVpZ7O4AGaXxN*!6quqr^c4e0P5|3+ZSA7 z!^psJ5@o;zJx3rlD}6ovLW2<@|0Lx>O2s(_CSG1%ZZVyo|Ns974L!LX)R6FWV0UTw z#Khdr#jM@l)8^>RtlVxe{~#Ch(ZjiS{`eT{@Jx-_#rouI1z%1~%^p}cz3EEt_8%-IV`HPDqGDZLU1w(}znsm7Z{PlXeSQ6CcltD)IdPF;Ojq8&eEIX` z<>S@mdGBuQ`StyLe*C@tHNW57`y2gy&fK~6|9^aYeERnK_w)Bwm;L^E*SN2*@BhEQ zzrQ|y-G6@l{(aS-etw;6&aZE`xAe%lbMMa2zrTN9{l7o2&K*w=zh`gr_0h4q?CjU^ z_ICBP-(P$_9W6gUrt15HC$n#}&yTyAmYMnU_3h*G^W*Ajf4{igJzHKbzNYy3gVWi& z=f&SjNlW|o_i?v=zI|2C?tPpdUT$Nz@x+A- zAAbDPJzloXW>@XOiN41C>t~l_lzwkqdiJ;Y^*6J_ccuHitG8l0I$x)UhvzGg)q)ia zM>&~)?`iv0<+dzLElup&vUhoA-~QF{`K_Cm_l{Gz;>L2Hr*ki!KW<;W>Of7Iqhg}q zMY)ZsZypIv%H9>3-tlh2w25~wshB%XiH!>h^sLO^>$QKys#&|*mQDM{Irnna^RK)- zy?zp#Uw5sVJ!@ukMAY03Y1=o7ZY|$XP*P;~Q0e`vwEfOkE}#D0(tm&Q8+RS`*4NBx zJN!(tz6xFCyFa0*P&oU^rFVI1ZqOuLCp*jY6C(qIBNOpS2HrVBR9HVolMES2WA#b9-wW+@E##*tK)_4j#IAQu0js#PZV3<=a1e`0|PEbM2M8 zZ)*SA{MoyQ`M{q83m#0ku;D|;i4_@vY$6BPw(Xw?9TD6zyEE!LBLl+sCOLO-eV@#6^=fWiWd@A2ngQM^5s~sP0lh zG0vafp|^YAmz2}}{G!L^U7sr}A~|oiPWLOH~aP2HjJjHVj+Wx9@%U7Dhz`(Eq zrTvB80zeuV2YCo{uIdzgu4>k|`ZRz4gJ))DrZ>Fk`8d-!GyUK4zxI>A{jb0EbZzwc zIWsGt{Xg?RJ?-Cr{uG9TGr#xC|Nr?p{r$bYJQdJcf1tIwTSSW4$#TY&9S5!zYP7bjGO}o#>C2@H4ZD-s!C8Mv znXU?U3uNl=`4zd835gsUbKf7CxNL7?YH(hPLr&5Y zo8t6of4SKBO_oG#|6=wgV&S3nd*58}5p7dl>mS?|R2mbiw?6)yqTu4~3kV&*@rl54=jk8!tZBGxi6 zFltGIgec;W* zjonWh9NH%<>noq%9Q!=qSXE6<6XPG5dT_jAnLm8Gk*>drTH*vj$nT$?f0x?=SkZl z#7?tpW4$Mvx%SS(?JO`K9uF#bvxI?xVL6Hq#nEP!k!I`yJpKIqA%2t%w#^O+6qxH_ z;yLld8Z9r;@-v_}4Ijhyol*F{=d z0fwUCoKr&tITY9mJsdU#37d0HHi>KQ-nqkjN6PCa0q&0zI8J&6>l_VM;$~Ru80)m! zK_pq>75&FgU4=H{2> zdfbIKYuU4`h0~&za3sHp%6%oLcvt7lC5z&N;qUSuPV;R_3Qpzk-jLHJveW8q=EP~f z3IS^;E&rmy8*^o0-m7(TuU3W#%vs~6`ObA(Q_~67(7mfAzp@&;?MR=zTTNeUs{56h zOM~{eXrzVqeaT5{aGPqJ>UvUs5hL&Ag5C=rOQRR8$PvHN`K-}-b9Dh<6{nD5#0K-V ztldY}op@H#8K+fYbUv-2P&tb=$Yf#WtaXyJRz9_PYZ!HW_RVc9A+wBGjy}HBaJhKN z1BW|`69mu{@s+Q6cYWH@lEYdjw-27(x>tO5`}KKxPy4^$ zH+%p6>7{y5$BSEKRdhU z{qJY9x3_n(M}MD})8_kuJE`zj!LNr~w157Jkg76vW?)({&ryNJO@PJKfJH%pNlk!B z)qr2J#Zj{7u@vWq296aCsv>@Nok4Gv?Gc- zNtqHN&7V&G(702_8sd~1;usooc!pT(O2*|6gL(QFy>z(#LOIP-QRRfmhU6_GCm(!E z&AgPiYqx^f#-)q}dpPQu*fLspon^do@Y@gdBlS$Lo-3@5ziw#r zW6}D$Qs>;v9V`D9J-#%z{#c%E&E46i`D@?S{CRqS_r}(LF~@&Qf4(=s;!oC^^hcHX zKc9bTUoE-koA0{MHdD0JuZFz)8*#pKaruM$p0}PX+*9-_H8$ERss{N;)Bj|8^?u-kDSNBzK>U>7>HLZ_Alk@4McZesG`hV$Fx~7jABm*W&zt zt7iB9-$7gRRJ8N%S#Npeu{H0;;k%24MH_B5I)zvN?w`nG_fDfHK7XD%)B0?kbvweM zR~_2^CH<)Am5W#7m+y z!O|qM*~s@IN6eE83JXqMStPjP$pwWar&y=G5(xU5^iUv#!Q0VCj3v`Nq##2uiOqPBf;Q=kuQqb^GcYh5K=BQF+Xku33wHH!bq+y_pk#sM9}wRd zr=K%ukOVEf+9@F+S<(>0Ho=DZvb`7|BWpVwo12=z;{fjE8)lv7X?9U?7C6SxRdPVW zK~P=A^pF>asWFSt#4W`NS61v)xFVs!B)KXs*o0}aLYN1OUeU`ZO_7RAUa@Xp^OU1A`;pp*&1)AUd-{$QwwRCB)y~2N4$`2>}T> zm+9PGAMYS002-%FNqCTYf$=5F%!dayWgYfBf3-T@Wa{a;9y?+*&xcL2n|$$eW31fy znUn6k?tFbs|K7W^_k<3dI&yK}nxz@)r}-G0#m~hR|6h0eq;|!wT}ivYPMP}VxRu%Z zf^{Zd_e%FWlrGBn9H{p4yX5=q>~b>`Gt=&L^YCq^J5Ju%>aq05hV-p|9zCx`gQw44 zIN{x_n=3=MPAH$YZ1vAmp=yh)c0H9g%e!=0D{)TTyXESqcch=zxD{03v!tKxy;{c)WQw-yO?>2M7ND|1Sw^_Gp7U5vLFQ z(N{9rVrpVC#i@(A^Z2PImFEwX7@k{hk=V>~$Yh3uxiz8+vAF?@6R+`x1hE{R z7OAv^GlCrEXAVdtN@Q=|$Z$t+&9Spg9NQ&~%@4&MJ8)2dqkQIy1uhD!9;bf%nWF_= z=V!R~m*yk}28M9FnGPumk`j}%^-!`LXhw;bmlx`tdKJVn#U)HjrZwK&m2`b>J==1d z@b|R|W{KL9Pk(ZI_9fCu&c<^2Oo{1lj3&;Em{j|}^y$V<9+@Pmpx(Y3$5V!G#n0Dj ze4MrV*a2uE7diFi#~cO*hBA~w4n5S7mh~m3q#(I7K_CItePfXV_1-RAxbWe>eG5Mm zsGO6Om;qj38pWO#-4|QFXG%*C-&xOF#ZJF_w^U8P(thvB{5_W8cQRC|ojk*I`y}?>XMa%KqwR>%YHw-|Y)lO#R!urvJFxQRmo0vm(PySome$PTkgL z{b--&$CU0#o39G@@_PIEhdYg=WI)BzmW7@)5kYvmJnPj$}tK>PKf*PM5LWME*Zz}q-SDoT@*Q*(5UK;gBu|F8XJPKM+AZ-3u?R7xso zxAWn1pGy}9KDp6+W5$}P?T6;heDZU{)r-w$W@paYaL-)+sbJa$qp<0-SL|N5x_H;o zg@GE={rs;t?|xMB|L|UW{`KeA&u3`+&*#s_>cJY-_}^hIx5L`w2ZVSd7G0e7Oq%gd z)of;qIZHP$?cKb&cfJ1fkDbPc4_lVh8qBGzliQ=we<2`GM1SUX?N;%rXCAArXLN8~ zzht}9rQ6z?`tjP~YgdM32d~_~2gw?^HTTZ|3cyLCq=>doE$^A?JCjTxxlv?TZ>;C(7Jm*r@RGj|) z)!uf(gfo_EY0o(#c6uh>OsYHP*?HgG{j*mE>m07AJw8){gFm}YQdwpAyZhX($2)u0 zOMi;~Bx<@n-E-}+SCXc~$D1E6tod{!qf@}g)x3sj z)`>bX2ma%HpJqF;6x?JATAwL$C||H>YSD&oFSke~Zk{>gtB=9*OX)^)MNE?pYRyTP zSi1Nt^PIV?+BZ0Er$6T|7cYD-*Rx8u_q*rJ{{6P=w}%Jc(>wb~GHbT%uDG)+Hth=k zK07UZ_sN1k>&tG-u>Wk^8NU4XFFWSohh}XX6n1rUO7R{2`z?6=-2Mu`^Cl8soh(>? zzWh7sx|3MVIxms+Y}Ko$9%c=m{-u7Z*4Lxy+ups}R!|gORU~^gwPEWE^{~8##mYf5 zcj!J;5W4NVOT9Yz{>I;n)7MUV*X~ou&E|biWM#$C&5ki266S5KD~*htCN|}>UGGux zmi-rfyPuqoYb%`_=DA$|yv$|)jdLHS?s~uQh}<3Hb)C!F^CUjq$X;u@ym@wq;gWS{ z=eYS_(sI2}VHC7BcTwxwFRy!^*{r=eGvD8*r*Zazrs^qkSl0$#Jl$L($kXUI-O(kq zWe!_+{Z*m2Ys7AIvB%EO-cz%}LFS8Cq3)EgOG@%{0?OV#`&8g=&SfcfQY2^PqL*>= zY*j?}U8~GHAMX5;cgoG*thco788+PCuf1gncbA^fr|0*-Z#n!Wvj5%bl^x-4maL!i z=KcIrr|()ne)yPQfNyqRT+hi$^}NmY4P^y3EiX483tqr-m2dLl$+p%OarI}Oxo+JT zQ6k{#)Z#E%>&%z;{WF)%+F!uvpV;qjx>Y(^!`jiPa^Yu_-)ECA#8~CboW9CAp1DA-d`Ifo#S}%|DjVCNu=3jaJ$aFg!GyijiBB?GT5232; zgq!kv3zNQ^T~Rmx&D7oyt+MmbMz5-rZM&>)KZs%pe<$a4{g|nmFV!! ztEm0l-@)h4|Kszs%*RQIDl-i?PLTNaUG}@SqM_Kz36W=f%~@tj8MpYvy;$!VbBVk7 zDf@AmqcM{CKI_49Co)vj_|;EyD_drnGr!7IZ@*mPX}dk-$dY}W{tr37=NPZ~d+{^tr@Kd1 z|53Yos^XS^@AK(BcTc_3%I;12aOF#$)`tem$grPvKO4L?#biET+@Z*;ch0h8kE(0` z-UmW%sRgcjY0kp;Puc%s|MPB*r*QivE0@1+8U970+_q7ido>)-PfT49%fDv6!~aWr zCG*p61xn0kJ?uMgrdhI{SoD&z#eX9?V)ACT+}p?*9dr55%UrRy0Z(fM%R}CX`A?kp zMpBF8rGViKYlAYgbt@Ft+z3>@e~_&KZ(-)PSM!$j*Q{LV^~3+jvNi5M<9x19`o@y{=k86xRgv>fewE*Oqb$4Q z+0k>;y`CS|f0)m*>0#^D=Nv7$eLPueyB9sXYjg6p;RSo&$VkJ618;BEo9=ePLaH?d8OiZq{seLE0Zl(+>+jUq^ETY zy`3kn^=QIvnS#S-y!lU^>+RZ}|4rs)V$mygh3clFRx!r%sTaRIIB>2WJRCdcMpR7_ z8v{cx-UT{HwYj5<3sNI$v^M8pKyUgWx6zVQb3k?Z)&A%9(p|UPg{=iy1fzwkyM0$5 z;c~p%6?jW2&Aau=HM6oef~zyK^Ot|qQ`+jjaFyZg+m9ZW7N?aF*uP+|TkcTpz8#kXb?D}Ku`EZDMaOHfc$bZ}Ae`QqK@ zcJDf8zWdyHb15_P^XLEHt!Mlr-~8t!3k$;%29I4jOpUxMEUkCGeslWK!osR_W`jga z{et%O-(8RB_8aimG_X%x@#gh==72x%KidDl`2YPkoi7h#nszP?t>$(p;d z-OsWu8}4j)sjcYz&g)e)^HKdjT64Vq|JnL?rRuR?yZ<~1X^*)7_vpLd{Er?vuUAox zcAL%Graqx*ZE*3@9S%7OW&+iU)*OFY=1!dWl=G;Gt(hH1K=R?hb6kxDTOBQK@3P+g z`?l2$MV%g=D+|x*aa3D!Gczk6*{El+d1GW(^Ql9J?it?OymzbZ!K=5qXgUwGOg%RaMP<==jlxy*3+!=zE_@WCOaUj2BOcJ}eUWd;i$7A}>{ymvR! zTlD9gsnPad7vFq%_Fwj;8;_j#n}omNJvYI9Lx;20;k#WblmBtPw6&72n7_6}_}t+M z6KWYd`Ch!!n6uAtp1Phw>oS|AB^7lV|0=7!wKJD++_XCQyG4KUc4_HGjr?t=#r7vC zFOc3O^qfstf!k7Rm&B9E>G!R^Zf#<0tXShVKYqHaw@v7hmp27#$`iHn-`gEIbz#Rl z$%>cDV~x&T)YNFyN;4Hu3|T67bZIINM_+Q%dV;xk z{+88S2OOxK;gV8ew@Enn=4|$fY-a_8-|yX%W6rI-f937dJD#6w+xhoF!lTM#u1h~{ zog%a*J;?aOj&(Y{>_#ev(k;$v5T&7F8%L^S3}_~fSL71#IP z*DsvKJxy=#?dSFrXY7i3AKml)lSIAGr22U6gnjxI3Z1_{?AvrF#A*|t*bb%dZhA`( z{`U=>G_Tdi(StE#kCpePN3|On8-2M|xAi&i+*_|&?`{6I>Uh?t1wGqBoa2vK z?lfA{sJ5vrvef8V&f8sQI;KI^9`>gO77qNFR<_&yUC@y-kaaV@AjS; zJO9IHjRo9EQjwB3UAWdnuZR^A`BGt^`j#u3&41%#>1CTE+Z_GAYJLn`>>RgnCFkbp zfo2QV<=ndeY*L23o{IAP&S!glvrQxYj=A@4+kVD(<_amH!$G^xp3`6cBQkdFhC45s zc3#Z1)Ze|ZbD2%`h3>Yl^9EZUbWQ!3@W``sr|ah(QKy$36TB74c7EN8JN5y;PU=M! zR4i6%S!dxjf$va08yidAc2&pwzjG23FD?BXcCP+|mSO0w(PyQ@8cr-ZZf&7LC8S$BmkDOT@zHgVo^vT&3&o}A1SY_Dk zWima_v@tCGv&X?hEO|56mlvEpdOBd&}JS4wL5V=MT=Z`cNQhme_Hr zZ%^QK#dQ-N_=p@^Jo$g^<63!H&9L89pUn052wJ;FR5piKvdm=(cN=9_-fleXk0-}th7Q}CbcB1;KX!3XhL!0pG3upJ&T({GC=9i61pef!g%JF_+NPtCFW$2-Sf|GQ?p zyqeLhdTp=By6K;tW5Yc5^|&~{mDCPcCw=*a=B};Yr=s2~d2M^(%*=Eq#wvo~P&L^<~Z8O%kmrUcag zO_TkVdpdgFlnD7UP2+j3H-4$QGd?)6@m#o_%@KxLafVkLinL=JEAOsuEB-w(M@(Dn zSM`-8x23zkU0dQ+rSoQWfgr=(z-xE7B45-loxbUvRMDZ%D8@glERBwNOeIlT6TL;m;r z3Z?X;p-c9uO0bLX*%7?mz46EZTjOl|lNjt2<&wp6Ie)${E6|a7spWJtB z|FpGlIa*gLODa!fU09}EQ|`kc_HK7z_oIaG4;P$T6r@z1Y<6e+F6pF>uypO$Df)p+ zIW_HBHaK2h5ER3+;i2|M*ELJ0GBUW$KHRo&iQhieMq6h|ImV|B9`P$?B;J)`+PqJ2 z`&LbBE8edfcQ;rl%C@xLiR|T+yp_H!U1RALCErzt=cn1%KFhJ1m{Z?u^ZdmnZw7-p zDUXB?I$I_ic63Y%EzL>4xncX9-<)arC*SllAG`D?a;xLDq>1ab%3kDH?Q5!h%X-}R!myJ!l-K({B*PT z@tlImP$I=bW0%o4tz1?{nSM<9j{qx9Zn_d3jH|eQP;WTc~r(jxFu~ zr!0Qg;#@wz(EaMZi8X8gJia*nu|MZse+RB43H6l+pBPMzGg$wi|5wVDm~*X5Z~pte z(72*%TB1df`D=yBdkj-V_X&R97Vu{E-Mv@-{tB-OxO!aPdxxI&jHg~}V&s1r{Pwcf zj(Ace=%D)P(95sg;%BFMFPgS5_upq9wzRLSe{Mf;P5b`Az0WrNUjD84ZS$+|g|D6O z-?xvnTJ5vXV9Q(C_{kHzHmzCpXLG;7*T-9!yO-{<%B``QwqX9meHuo5Tc$Xjt!zAa zl7CT!N!y!{XEQ8s`@NXfe_F)RvgN(evV!H-&HC@NCA9N|N*=zN6EthuVh!e38y;!4 z&Ae&zZMlATF>lAZwYg2<^7FTwUfgr#tBlYht%Kgvey(Jl)Xd#_WVO2b&3`YSO*agi z8WMV^j_*P1Jxh;o6D}t{Q{b55s4rVD`q-eXR_;(_Alu)Lg!IjUvpbaybk#EEtKQhL z`(Igj)w$x6<@Z;I+;z&l`S7>*gyV(@_q3ai&U_pb$zz0 z!f&r`MXk3C>kPLvxPHy{XK7(g>KChfJhJLB+yM`_o_~9Eb&QUd%ttTrw?Cs;*AzaR z^;kD1zCU;GoW1%pjoqs{<{2+5u2^>ADD%ADM@=1_CwHuFR>@ubz+~pGAFDXj9xC&$ zYPpb8cdRgPSD9+dw!?c5mIQa7s9Sq{o`UR8Wu41gdbFz>)eqmOyBN1*=Gk2=javF0 zM|D0Q(TljuurifiUB5G1Ze^Tzlwjo4hPkcxdK8X(suZ1j`}oL8ztf$PAw2vds)wxlmx@|e z8y(MoP*7F0a-!gwNkUb>)ufE)=82hH-x_1L%TRAISKeIxg*OGOjyJO2{tGdX$F8dvH;_O?%@!YwjE84$Gb?Jef#tFCXW^Q9HYuD=OENz#1b~mOxd$rTToT>i| zD(z#+4C3r-M+DL`L*nB_A__Hv-cbd*~+}jrZw||ZQ+i;DPc>C zmu$&wYu%i1-|$Y%R9UX8c554C`<>;oZxy}D68hlPpft6qozYccuV`pW;!dfb&kq|3 z%%7sR0vy!W8_xEl~$>lRIyPx~JC0ll#tAvTl63^8Co&i5+a?5^vp5C#=_mXEt zVT_LMj7G;Jo2_<8^eQH#MyVC0{8R2VopO%tMdIh;UDuvD&zqe+!Sk;57p1daQ~IJO zNlWWwY*rI!2o0Nj%Jt=v+Le#%tAoBBx17}0V!3Ksqp;T>l}{|XH@5Hm>t5!-|FN!1 zd#0t{8_9eAo9?CA#u?7I>Tsv;>+v_XN2alVO8+daSlXfZl6oR30-SIxcsJW?=|W?Z>Br<&pN~3T8r8&IV3&TXVZZ3= zw0c!>6@@)95+%C#3y+sBmHE)e_W$SH9a{0ZR;st+4P31xg2@E70q=j-gRYLYou#Z zR{g3G(z8^vIms?^cju4UtG?ax&meTbHA;;#+oW9xk*nMne|gH zO`K?y?sU3*=kjCjOfsr--1`2-UV8V#HBjxml3w`&2kr^-jlZnFZ#=Xz!qV@qk%_PV z*IS|K@e`(8?~T8AK4f)SeWkbh%|BVidXCHb_qofiXDVBATkpQtuhiGxt=lf|KBvc! zowfhSZpF~k%d|c%URC?*dQv`1_xf#*TiZ|m-Op98r(oayLH&K_J)XbL4vujf;_U*O(;ZewJ&ZW_lRPiJ3{@x>b9K|d752%(-sEgdNUb6IIa&=m4yy=58 z(z6!VOXweyzj^g~ch}t=`yF4rPki6}bwTFn^~FVe(U-HKjeC<1aI>77BNI`)%DUKV&A!(O>pvKC9V}Mkw>qY-$CF^8 zw{Z2AN2_n?=0@J<{gYJxElT_g>)JoQVyCR{sJlE`*?!4$~EtA9zAK^-zsg2V;nd5P$=2vG`z|v%NsGTwSZL+ z$g}oS(x>Dba!zYiVOuW!7IRe z<$RT+gcul{g^^c>0f!;R&Y)YW5-E_4G}MEOOL0wDrqiJ+B!9>eVH1o?nmow zf<@^y#v`Gri>@4x)=Ryy=9)!l-OkCcu4x)FUrg1IR%R$y zzhh~$=ae!RWZz)Zdc(OB7#JA3@lG-#jkG1_7gT~q+7Js};ESV&!0|0ezk=#E56L@D{@c?c(hRtON9Qr`!eQdgP1 z-7oXbYngI~#+PxG-k;95o|*Z1QrPmfC-;^8^=*9l>ASA6l~9^-flSIDjl7jt*8V+l zyCV0>FKMe&u-%JSKQ=cMFfcHHPRv0p!9aH`Qi!G{mL{iy)5_iJKf^Emlw$v&&y_V{ z$-;<`a1ZUH>yDR2o1E6%(Bk8Gxxg`%-L-5BtGP^(rs?E0G0S$9UhYfvJGW&<+U=0A zZJC)`JM$MuZnu5Tv@PQ1%sKJzX8!)myw85mx!;xZ&PzYvc&pN|RL?+M!h|hn`R%sA z!z)&&A9D@(^!d~Mz0z9x>jRGEAKb&l9B_c;08ivD?u-yYT^Zff&KVg(liQ9}3hZGx zBX96XYf}GjuJxhCvU7PH0~luTX4v1Yf4uK&_~B@2KT{sd*smHkyJb79bE_-+JXhcR z!E!dxBfK&@)gFVp($OO>E3JF5Ybq-zraCcIaqL=YL0*y^HSrOP^OemBlkG ze(SByeI?BQUeEo#wUl4(nz>C@PS!P>yv*F}_b=YOdiV0}@4fqLWj-tqm>-g3V0L9f zz$>k}UX6ZF@9ymCI9+x=g~<#E%Amr6_$yXYF-Vj-Px8JXk=;PZpBWG?} zKuB(5=iVaec_o{~B7^%su{CxFQy4{fT=B+av+&7(3?F)ytKK2VUq}&Z&JoxvpvtGuM>+ z=5Fu!=9U~@QIUA@z%!p0dyn?TseZLcShUCKg4eW7%`pxVjF;VYzRnan`^iJVX+wfQ zx^CBud3*+;6Ik;6CYV`Iv5^qdU%DVEhVxrb(Bdb5mz=d$4ZO$tDpa~)>f_9tnk}0r zGp}D7!R~(FCi?Ax0UQ2FJ0|goOfSmTOrt^ zCFy8&^Iy=crTIRlLeKw2`&K-x{d?f*l(X4i)>rTx-R}G1Maru8Uu*cjm)*H>;aPp- zvb#YGuUrs}e#Lxi`}2?17mB(Ue-KbuQeHpl`J9huR^{wgaBX#e6xucUWaGZP;-hag zmmf*8w^X-~X%6LF{6u34`#jzaM^47*&NQrcSL@~s{dB2mYg*&&1fQCw*J`u&?zVN* z@%?&t^3%_oo%$G455JsRRH%7qYVE&CJKw9x&RTQq|Chi1(XS@0aIM)G%kWC;#mh-4 z-|C#Q%%|ENIT~$3t?%b@hUdb|J`x&DDCCaPJZrpK6G`nZ(71m;TIlt^( z`@E2U6C9Mbp7_{yZEk?1$iFMIsmsA? z-HCY;w@(xE`z>*xw)#6Sw-jHGm_zTg6`OueNnGEsd&M7BRkrX6sTpUrXLBgV za=c)_lXgyF-M*Ks45vzWyzOHB!?|tFb5jF@Eo%R^-qg>$e8KiL_n!9-zk2yTizz+W z_2*=7g@D{yyFO&|K~Elt79EREs&omdy&yt~ZTf3bZ&cHmjVw6MQ| zrgv|0GY8J9lK)+RTR(f|H};5 z6xSti9%_&h=*SUW#_UY&`UQ*3xI}UwXW^U)fce{!>eC=B&M(@fuB?6-FJ`3cKfS?C@1P z_F8805iX8%^}S`%YAFIYBRvJHCkZtNtIVktYv@2 zC?|AJdZfzZBAZL*uh>3Cyv%j^^ntf>$BV4wb)O9PtlFCU=hG`aiIx8LXS09J*Qoye z!j)O}JzHMr;Xhqle_uFqsw{`Qu6-?a<-p#`nxD>#i|uY{cZ}@F6_Lr(EjlC zd18Dvt6pUN|=G-@VsJYrxgygq?LQj$Si z)o}jy@ZUX(Y+?syY<|-C(j-T-TW{je#GfaZ`BW{qBR@Ua>;BvaKVLst(9M~q^3V4P z>-OyOLuFU5)y8d&x*7XQTXy%=x&98dfp>pRkKbJ^zIJwxeDa59b^5WN|8w8{5bgH( z&eB7rtFFv_amw$1qvDSphP!Gb%}U<>JN)v*dD)M7`~KVKW>(5aMSYVx`Fq;4MY)+g zwcgr2QImA1@ZO2khZj?Wv1qU*F=ty=kiC{HkW6U22C)Sqwf?|2)t-k7({ohrD+#ha zzkWMr$F*mtzkNRT?%$TmYo98A@mal&kvjiseTw0Xs(t&9WarKkfbG?gJfM?9a0>*| zfgibv>3NxHnW;rcqf4VFP0{qEDWoCQywq~Ea34LPhlCS)^q6JAr)dbRWma-1JapjS z`o_k_iJTlWA|nz{-MHb{&^(#@)N{7aH!E)}WZENOCvP9(z;H-hL`Y1K_2W^6nzBMp zPlNfQho(-NHj(x7(*rS;tgfo57uhB>a7|dfYT3GlD?x{>96q;h_40KK^Aj>yo=I7UW45jA8=qL8-?@Z+-FsHg-n+ZCeff0r8SfXrOMCzN`NQ{5Wf`8a zv$3|fw6(gsxVd&OYU7Z;@eg*YllM*Mi=Q#hS;13a<`<+Qj{+wk9YHvR&RId~ZWJUI zBM-d~)e|((qYUZnw!GBxU^^SKFCPB{pa}J4f4D_sw-+PKBG_aJ{SNE;3)!$uJi==+BwYjPH z+${CI;(GRsuFhJ&h|RZe-0HN7u&}b6Uof$}^tR%whcBPjCLNP$_V2cC4gK@q(yD9c zJfVwRvBJd#lU`?ToU+obDn%E)9Uw6YvZ@S-=g8*1L=lZQR6ZkuIJcSgT zx4t;V<6Pc&%#oQ#Wf9+;%`eOmE{OJJVHF=6g5aIDY$oya4;e zN9P|rRtWkdbnn1be$Y6&=`Y`)C`JYb9+bU^=rMzo221nE%vAJ0g#xv)3ZDQ#49bk2 z8cR;AgWUS#Nk`YvI5ie&!H<)(tBR_r`C~DfVC`$;sJz86~+nb3=WLZ<`71eI1^2v)eYgd0L2iZrdf3X|}@GyWXyx zT2geX;mD*GUM3v|uWS3?GfmOC9r)`gv!~7m{_gK(;y3x9n{Pfk{WkZC+QkpPUB3CJ zi0x$Itbc~{mcIP?NXAab?%YH5GNYE(r?))yd!K3f>aUypQh__~VRMWRJHyQBaSuzD z?I<=dzEyc!^dR%PCFd{Il}%VW`)g$05vfnB3{Ktf{FE#?pJmDweiNI8?1qg`(`u@$ zp4dO<{4o7<;^Q9yGKb&4;f>7P(tg%$=c^NM6HfR&;IVDLm^iKNr>3jfn}=eihsqZ$ zVdlFh!Mb$ggUp9PyZW>>bUy9qI@2q-X^N|i@B+<;=KG!mxSR;mD&f&no|Y5U%A3{C zWTjrpD%r1iMeMX^Q1$(N-k0|{9G&wrr*TVmtIuNp1I53-PF{a+OYM#H&E1vLK4}){ zay(Z(X6t$&W_e`dtSwvJE-Z|xiWgg1?y9x*fV&vWU$*agu8FJ>)1Gd-|Ke7~lFh~b z>kB##c*^aFSybBC9ID$bHD`KPhhpB&D}4XnsO&7f5IcFXtbq1}@~Pb$wsY-tF8E>d zsm=T8S?hzZpM|gV4l6tU#N(H-BbS*(Q`g4=fi2b_wO$+-4coR?NcBpZYnEeuTu;@) zttu0B5_7GDoVz&^O^kjxO>4^j;8AEUvbsoZfr!iA+jA@`G=DZYoGiF+DQ_5FBOCaO zC9!AkiBs06c(1H8yZ5%JXIV>3TgkdFDl=O}Hk=gUOY;)r7vWpVw*Erv3r}9FMO>Q# zwmp1Rpnc@Bx$27j&9#fRXvnp#nWQ>1CAe|3YyNMmuCPy^pP25JQrj@;(DlhFf1ar{ zN~MNgKJ((s6r0X(|78wl|CaIgzos)^&u2-%M8!$3H(X!2e%hT`Q=NC8UDWkQRO2vf zmt%}z*2~V#57M1igfz)&PAk91zPWRS&7ud3?U&hbpUvsKFl$>jdq|^f^X%sgy4P1c znlWj)>uc3c$DIPsuh%RsUTJzzOULPBma+g}#-@I*q@AT93~!jrzq;RRdUNsP#P(VC zEO~-0C2JpLi`>3-tL{?GFa0GlZzmRgi8^)B?^OJ;^Gj;1?|AHFFIfH|?1Am0iDmCs zde!6}S$AUk9j|%8?bb@tfkIJ&c49ZeQ+%CWZ69R_?Cj9or+V<~6}IKPXQgwz{x>_b zl}E3tj>+1tC-Pchd25>FuXO2h;WW|N1~+w&&HV5Fu7ZE(j>$WM$Inl@c zmaf!WQF?0AkqPI{FN{#g^e?>pRd(Imir(Y5|LcPmMWpCY{q=;Ifx(pn-{wN(;=vHK z&Zy*iXn>5*WsL_%=L!hLGzsTyR5;kQd-v|$)-3`YdW{d>z0*1OXy1!>gD20OJ9qNr$+Ktw{ySuBWo0sRZ`uoev`HYc}|0?eFyO%FtuI+fW+V91Bf9Z^KvN^iaud-x*&JXmMrOI-Mv+>XL z%L@NL^Hpwd*|Xg7-hFkcQ_CGfFJGPzDUgv^SeToeo19x&oSIZzT%4VqU0q$Bo}ONA zQD0tOo}Zszzo(>rU1t5#`uh6+59$|OSQ+)g$F@Y4snv;p`Yt|x{{CmtePXxz#G?E7 z`1<<#`uh9*{rvpGclm`^`(3Z{+rHf2-~T+H**WvJbKBj{@rRv1udlz&UB9eczg$hf ze7XMj<@)RO)_qG`$MBoOhU;g|0_378IqHN83 zoptX2U;Xj))8Ez){@(rc*Y@q-{Yih!9ashaG3)3u?Apb!WMacow*%H%3%n&90=XhK zG4By(+!esc;KXo1jzNLRdeg9Vb$!yrL;p;!X z`&U~RRb1bw-__I;60vJ*O8S34mn*GZw|sBZC)@v@`9fB7EBA;02mkEyoa>uRHsi`|!ePXQ!+?E#IN^WJ|2{I&F!r#RA`|#@Jlg~$h8SN@J}jWx*E6E{Ph>| zHpI%ahU#3C`0hICq-m(0dBpi?(mkf3Yt5|R_obaQ4PSpxCm^r8yA6;}p^p;eAS~9bp)Vl1AH@}8S z3r47A8BXfhzGH4q$uGmWoU+8fY9VhjcHWZpOEH@DB4cl(pXiCF8fDw=&ebu!k?U8o z%|0gQ>%m3)o~#j!xwnN)y)CS5nh9oIE1+rGWpqgLNh+FsqH`LE_K=W@?&_d0(>#jN^2J16~w z3Kx6NF7Kb|2`~6n-#fm{)7k&%K;E7H-;?H66xPh%yZ=&2YU{j&0~0IPTwq)uCDZ># zu*N1rKG%K=XJ)$n(I5O58+WaIA863#`7bzdPt4_uj%}Y6m`#fRd45$my+-bw(al%? zPH5fMpWUc;yh3q~k+n?Z6(in^e<4${%^!Pexd-lY58JZBc-HA#>4&F>PRgl1Ga>Xx zyk2pXr}dexPqtQPT5oy@U4ANgR^Yb9ioH+ghLqn~e zaZ35>3C5e-79TjDduWZMfL%}W%{t-RJ_1U$t;L+Pq&DW>-}6E{`aa8r`D@N!S6ZmZymhz{P;)D2a2DWba<|= z*K{coTJiemx>(95(o^J(q-uL{QbpCME z+uv2*{8E!AoGp99zTtbqmMII5_pq&QI#8!|{^)DoyPIE~&UI#<6K`}vXZhcC`_AA0 zbmpM1=ZAHLIm}g?Zie2io2s$()PCWM1~2z6F#EFk;0p^FXs97tenYOxvRcE&6oHur^#7|y_tfoO-*PtIE&BBPZ%_F6FMZhP zzN7DDZPYnY@uc~Er6%gi(Xw(+cBb`T>f(<`>=DBsvUH$*!2NX|!F&-7F^ z%iqO<7qVUS-es!qv_8`G)LiNa%lBZftqij6K`c)W-z~irQc@WCpkq&7ZQL)X{i?KZ;%bv^3%7LU0FTb-y%-yWO2`P(T%YVjiG9~ zs@9Vy)J6XYUFZ{*U81)0?Y0ixWj^=3%FJq?ZktiQ$LC^piP`U;+gv18$3%8Y%yF*? z*IFB}ZkCZ%_?hzXWir9*;trWlUtblz&Ngn{O&hEDx7Fc^Jx7-meJ@>T_jlc;sD)1D zg(V9)ZNlG41TW;D8k-ZnbM-gAwG*0|8H(0BrrNV>^#nedR@M1FTl3k>CG*{;ADB30 zYoXloPbw0p3upO$U9<4aw4hw8zx%%P?u-b%mihEn@+RNb$k*y-LNB!sKb==9`rDwo zT65>ssZ)P16VsEHZZ^Ctc>Bq&S;k`N!n>!ow%mSp>ztSRq@JtH``WLqTqEp0Pvb9d z(%NNydh9Q|HqK0b^5olD9ro{vJ9}S$nd0_&iE+BTb+e-L+G%eq7o7gL>R`rg<{!r% z9(tabBmB)Lz(_jy>Cp|VxFnyv+$FL8n|-%YU90Vv2S={8@jQ^2&$QKAVnos_4&8R@SymN>60TK4xLr-@HdyuWhra^^q?&&Bs#? z#G5C#d9Jhh8ZCBpqvizLU0nUo3ODUKBJ{J?Eo{%lYfFADNjqUDpjdiBV7Fqa$Gs-Y zkDN(sPjLRWjH^6w_n*nVjDs^dr?!96&GM=6GfA;e(2F^g>(7>G{%nzkOxGkE|5k0Y zXTm-5UZ3p!j~_P^yQD31@|ErRC4MGipL^srf7zaYmelNJe;o|P~D{cF2o#JK94l>JYcdE0N))`fqLJ{b4k`FBviKzVJ(^OctTCog3z zNH1mVZk{;p{-c;rwXUCM)}8)bd{FI-bJW`3!oQP0NZDKa&vyT}GyB}DUng69e!rQ$ z_`Lw<-`=I+&+q<-e6T9bH~4Za_obFq*-D;K-S$@M?f8KT7Fz)wtMvBuvlzo+L z5_*4dd*SpN*>%v*bW>q?5{-`~4 z@}t(@L;suS8ysHHv-tJ?t}{-C^Og&4eKkAc-`BQXITvKOw!Lb1bFo<@wnI|?h6#h= ziay90YyP^5BkF3-8e|$6Nzp=Yu8=EC9xZjM!^j3svlzw+u^+oYR ztkoV)JT`$rpUhwKSV;CL>8cdVIeuJT^XIEW6vy$?{|lL)z08^3nf1j{;KIg-#>ZT$ zPP-|v1(a6xMGGtob!L6QxXX5P&!*Q`rp48=*8fT|PMs%o{Of_te8qrxrUxIl{}PWl zF@Mt2gV#gC9@w_Y-(#+_Z$Gj5R+Rmrd!ZYme+kYlX7;~wD*o9S7KS$&ha#HS7=I2d z*q*E!!|<5j@z<#-3>U=zpH#mo&~{w^dCa+8cfK$YDgMAWG2bjcne15QZhLBBj%FgCD7XKGG?P!e_ z@7Hl`WcdH$a92`Ez$2#mm)w6OLOkW~{1lkM##=LO(`v~}Mw2d8N_}eHZq((*<)|K_ zJLQt&$A7*5A8_X9q|A8qvyx-pDlyAa?#7=&^HRAPbGbaZLZ{YpP7nUQecRT#hYi+E z{+j=FQo?&xUs2uNqAU1Y*=1gv%sMQx==5SQw!Qj2qDOTf8K{JEO%y%%y+wTr+mr5V zpVawUZtwcKyYIMv;tkOT;Uh(&fiCiwj__(cVC;}q?vQq8%5wG>SN`j)e7cg+&8A^h znn;Zd%kHR@Z{8JUGAxZhRy znIOA3f%|HprOi@S^Zy5fU92W0{WD+9)%2vmg7-xF_w1H41tv3iU!HsYT-fB%GRg0W zKhh6{ryRNB@$U4FPh$2?BK`-0WAskxZ~dV0OjE@^wSH%mOEy+u(vhgi5(o;Q3*2u`#R^Xl;>gkP_p8fbwJh7R< zpl{KY4)d6z)2czb&wLMWbaF9q`?A{gTCVFuW409=Tz3npUN6h8oW69GME zh)z>Jx##hLkAfSmGJDS!&VE?9@V;{4?EfEM9@#Iv?C|0zHkpbCq?em3{x@9FyXmy6 z!pG3|2nKO*_ic}j0bn>z+9Q(%1I|U387Pxjee^R{*cu`ZrV8=4@G8p&ItSS3^#MF(fBcC3cZp zz=Cg|7j9U#v~qE{@9k$I0#}}9D*o~0XT5a%;g*(tj>#(~aXo2Y9Tv6OHRbM`t*0K; zp7vSpv@AFDZBqinOob=LkF+XwMm<>(b^gw+;CXF4Pot*v+?qaB>Y?G*^V$a=`5Y8c zXo%CBs`n&BiZ2G30Hi~R?~YfYyGZ}a=TwCK|IxEQO9kD4FO?w+NzWlHpplS*3A zw=QwKKYBj*#9_yEvxHiF&a|CaJx3$&#$z5HOshpMPYge|qo>T8j_VazK7hcW0K0RCidH!>mEdR>PSC9JH=5M+BvUG~u zR_7U4j{LdRaF0)SUf*foZ^Z`7{8HAQOFVyW=EieJo6l9IeBhC-2okc%O_fEfm+5L&z{fnpf zT;r~Jo2vZwvA~PP+sp4fd-EjO{n_gm!V#~9tKJH$y%iUIA%6Y+bd|U1<%N@09!XVt z;aK_hzwoOQ!8gx8y|n(N{eroc3#9L!Uv^1P{_VOB%Y;*F&YrM4V9}c>W1msec_7mK z!4In!J(eo%FV{cGO;<8_p}Sz|tebn6cP75+Vf;PQGQ}B>{d%o@3 zl@^`^k!{jGa=(_Zf2w|ece#DayPk=P{W;N=KXwaE-(O_mwP1fhorzL$h;h{xg{mv| zB?@l$U+-f1r@w6R^nV`SThh90zvdiEP*T5*2EbxN+$72JO=%JYkS@9JDz%4 z+VaQ!c$~W4b+tS#clGOA&a=A3|8ZY#rFP!%_+gLbX9|wx_&L3v=q@$WeU{>5i`P=p z-&Ax@oKQ&ZsXvs#!gr!2-C15wur}AEwyn1|ljpp?&vrd`3DAHNXym+VBVKu3L?ly zSWdTG#Nki*#mi-ld2~Mi%Qv=X72hHA>}NUWT@v-3eVw9~5#VpP3|fa}wieufPK}4hP<>Kd0KgIdRqBn=H+t zrkzhs{_gateex`?r|;v{X9_=rFNq%8EcxVIrQfE)uMJCsHvJ6$`}5KaNwFKZT^1Z- z(oX%&^eiFx`L3cDT8~AAPE-a)B?hu_|75-$mBH|2NAcpEnjL+qK8%~{Y}f58Y)kC6 zob%bLNMb|Tu6>m?Y@O?hHXo1pHc@6VzwGx7H-a>8E#kc^b^SIA`$1*agU*rHKFDsL zdfu$_;O#$4qN~mZ_k6l_^@6zc=ca4#Wz5 z^7nZV%Xs|b51;e=DN$E$&T^R1<+7E{_NSiv*LhEl%$sz4-jqb{>B>*SYU8!|<35#4 z4=X$^yv3XI*2L5Ik`LG!Sl&0Dbt6^ymNCnF%{loq=e?h4{jMW-#mvz6I~(|AHZ07$ z88E|KAj_MtbZ&!|gj~cyzGW5PKfnF1+-jFSS^3x@zQ>8}yM&{E-Hd*7fO%JMv&pB! zXF8RCzS8yn)O_Hx@{`ZZ=d)JSek;^_vqGfii!*anSZ#=6$&D2&x}++CgetCVD4e3Y zCEBBIl59l=qhyk4No`sdd z>9Nx4s%`4lH=e&0R zcDDR4?93?X{PS5T;POK0su}4YGzEl(a{gDkKffRGZMlTvlN~o!-*~lpWoMla`)-v5 zYX8ObPP62c=RZ;rVB31euD)yU4rTlJa+~jV_KTnXa{22zwMuw8R|(tg9p9SfZmiiU zy4OPR%+9n_+hrGb>?+#7@#+oVs=}viHD252SHF^B>3XrmsOHxfW8Z5pFISk>$b75S z`4A`m!sn-J@V%E!i(j|BJe=G3Q1RN&uh9>VPQ7sS*%7|a{-M%gDfWxAfAcSYC(f^D zpQqip{mo=?-zUfI#D6jR&FXr;L+kyH2YnOgpPArO=@IuzeeWD==EeSxpL8sl9KP}S z?vA+c$3FM}S!1qwU~c5lx^0evg;X?B_iPqni zO#Hg&<>Bnp?bBa2icj9{uJGouumE4>^vb0B^^ZIfbc0{M`naLNMCt9P54y>pHJ@`Y zS}CMsS3TD#T3Dz&_F;v@Bwk+I{r{hqRDb=vRr9&kiq{kQz69;#;yrE2@TAkJ<>Q0E z6RcYv7rQzc8g$&9KF8PPuy1C`-=+3>-(44Ru_+0yeCMftK`Z6*mT!V5)HX}7oXYPP zoKP^CY0qW%7b;IKA9%REV;jdcuN;NwsWqQ1Pi$Fd`1AE+{mbheD<53C$QNz1`=nQM zmxGGX+2FTT%Dov|67pV(PWb!CH0|}-eRa~!*A6+fU29dG@$vCzyUuS*3-dL^L{7%< z?lbs3`>*da>4nmi`ZFfK6O|(1lQUA@!`+7%bosIZe`s37&JBy;`AAPZo_k7+$ zxhESs-#m{Ly?N!~)u}E=j1#N`1V6fZ6|Q`mm2dOfeMVB(`P}H9yKF5BMXe(Bq8j^C z5>~pFY<)h3?X>d0R~yzuUwZPR`N_fmHxDg#d%UF6b^hJghcg7tep}o4t~IDOIyuEa zsBve}SwX|k9=8MjuH(7;bN=h%y2$sboikp>$*?n-een)Fc${^+@xjyuQF8?vFYZ_V zuuS!l%XPCgf0Of-e#YDlFh8fe+a&eCywe|c@6=BFZSeSQAZwb$5q({(%yzfPSN>z!t?!FI7=*k2F~_sTzqogE?1|#dSz196Jg=ts zD^55m6}PM_KSww(X4d8>t_r^AZvLC4l_U~rX3EGK)t|WU{ubX`g^uO&rWdw4L@fMp z>ej0wGgpNP>+U)lMDJ%5K39@pi(b;yVVAxA zd7^pZ+g6XzY@S~gjU1om+_SDcJ7K=fKKUgtSj}c!{P}QOSlTI>C5~?-6MoNooG70D zE-kZg|NJ%Grz}ccji&9K#`CV+Zywv8yKI+uKVQ+A={q_2gt%{ZyUt~Pmj7i8rjP2@ z{s=Lfm@4ReYPE?W-+zUfFTK`}vwLXcv15bIzL;X&(l~K%UIPro}5~#qHufd;ZKIa zhCYom@0BR89&-B1 zyh>R0lE@N)-(qfA9BUGG>iks@=Hh0KenRO$1iRad_oPEEP-lqY@9r6=ky z>U2(OFviA|-ZDSOoG7Q6{~G#P9e;|itNL{1wfMy_Cj-lB zI%C0uIS+!6~ z#c=wm+?)S?{$k$gdvdbgWS2S9#Fjl0;p#fy(tpMFRrqVpHG2IeDuz1BZ+7R?jMtJuc7E;?4bOzE{<)rW-m@#ICyKU~bI;$|+xm3Ml#>aWdHVv> z&h;I7oVc{Dae?XMcXR4z?l2SA5U*vn%;TAOZIPi&&ThBjJ=`e)EB~!nwb!~X>wfz2 zng;6|zaC3Jj@+~U$!hNY+uR(7eux$s);>Ci9j2W$$}>DT@2KYg zUr%&C$0n#7x7j`)w;XESTg2Tq^}xYDFRxgI9WPm~DU{h!bbG1a z%$WlHDs>I2GpF_*&Fju?+ODttvE$L@=X+V6K9!rM(f30}GG^I|LmLy6!XKZwESIHm zV&X>S<9bgc8~5?&hRn8^H}_2XwX0vUbe?RNejNE!=l+D(E(s49zg~_~yWPv`GH0nG zuh#anOD9{s3pkS()4%fBuE%i;T&rfZetYW?Gre|N$G3pzJtbax>Hn%<9E*taU$xbx z(XU$TU7g0#gYWb+_nlO^vDU!*d7ZP%iJZ`7(u=zfUM!D}zjmp0MUiOapT5>dPmebI zUe$7H&XZTm7qz|G-NSIO_953fAv?W1{(B4_v)12#VpSQujDM!G%$cRz7JKyH{my+a za_)~+rF|rXWW>A*II?d4N&CH_Q-6yF z-|s0tx+%=~ht1xWKQ}~fWr}mf2D)@U*7;kaH+#m$Y2Ut2yFFKJn!==8J0p{L?=I+> zzwWPsa8$CBRp`Vm`|kdZ+242N)|T6^7sPM=wtj8Y^50Lt-s%l~(6D>5V*1bC|LUGE z8w-w4_GPI5KjB&3fu+Zn%$NDTsrQ;zgvnk}?arEQR$R&UTR$zW2;Okb+Gn3(^QKeb zi>^%enx+uo(!F%@t-Wo< zvsb+qD!K8HF}go%%a$wucdnJaml^MtxVNnO)75*OU+(P^`_Q9rWq$a#=cN1Fx9nbV zLOl5TN;60OU@n18k{34ZTEF|Ejm_b#*#WoNS5{-e=@GbTci-(ZUlZ@%kl?nS zljUJvZ?)l1XzSKp-&5cJV>tRC?OGAD&eor569RW9T;K8I(jw#2zp4&>F1uW~oZYD6 z-^1sp`nCsejQ+svDA(aJ`OhP}Ejy1_{qB6;w?yXVKJMtb z1qEAw+}1kp-gv9F?xDXT)BH@04^Aywv93;TAKYtqEIHERQTs#N;^L36n}^Ttdw-5& zGFQRmwSkk`H|*Vipo+upyHT>3Xh=uP;f4JZYr=OYX8(?gY8CVsQu2DHJZq2YpFOH3 z(Sc5kg0h z_I&I8dtIjViA{80;%LM9aCQpQ^cU$LKfXSnG<9P8vM1TscCJ43_xz;-kz>rW-U&s$ zYkIN#>f0-8{mRysboj1h<#D?BcgOliE^p_D2q<6ok9cRvc6G*Q`Og!Xw}pRKY`S))QLRhs>`R7v!=Rmy+QsIOj^o`*b$T7LYHPm1hf*~m~XmGDqE zO^M9^mR%-J)$6CPbJX%|RTGmH`Q87_-&+3Wnltf1lA>)BSL9!k>9on~-SbY-)ML?~ z%xBKFqF3c!35h(MR4G_0A=%3`L6P~{v`IYs;?12uo{43hdWcD$-It}!Z*iM=iAv>6 zR-LP=m3Qsa))ZduKV@?7(Z-2IhwZ=q-8GfL@U+&A9>Y+t@LFj_ttnlF3xyKWyzWnH zn06{&(c^n-iPY=U_imr$GkH}0>T{k#&TC5rZ( zhb!Vs)Z6}9tlafs|K)klT0W*0|6H`!aCY4ZtU}wi|b{Kmltj8ReD`4yw&~jg|4{k=O+hE@w(aj*qo_r zhro%sJMJ_#oMG<05|%jadfcta4u|{}o|sj8_~o4^ey3a3zICay{P_1eU)d_n!mDk` zpHD`oaR^1)7x{2@wHJ7%21V^(b8G*}-164h`ND0*!RxC}NzV|n;IlP7c3AA4sV-B< z*Rmz)DpS^OpDX+5^4#pJ9Iq#LNKIzZv3S0OOI*=rdheo>OXiBcGk96@@t{#9WB(~Z zE~C~7m+Z7oSWG+ObKq)7Mw3^^pMvf4-~8d^77zc;==@xMmP?7i?|=@Ag-2YJpXp3G zb*Ag*nI$)0q@M8Eyd$COXHH8!ukt0Isk^wQ9#Q$f>(;*icfPKa+VuMf!@D^VleC%- z=1jX6Z|Eq>X%yaw2n>ll;?bYe$Is4Ddak$X5H{tK! z*GKvpLfbF&-)C=Q%@B_jeKOZELNDd+>NDN*q=fT?y1$<4KL1NAPGN1lV)wn2K)VfV zSnr=ZI-jfd-{jzx007q-L9ycZ*K#;p@ns z7_rFK+Bxk+>m0TDI{$LEED#lqbDQpyuIjzWe*%XPL}&_ zFfKpl9PYnWv&C|%Mdp*1$wwbeV|6Xxx!A{drRdl5i53ibqAPQ@md#x?#b<-g%0vB` z3U?jiDid~A{wwws%6g-kRWF!zzv72O&pigQTN|7!;#bsd`5sj`sjgz>zlhKuKN{lx zepxl=_=D-&!y+pGM`-U}r>=W%0aMmjhO7@FSs^?AJ*xQOG3nm@D_fT;{mr`Y>r(WO zQ+I#8+IR5R?OPHjn}mhjZq4@F{ewv}?$PqN*xLb&rL9}T`oHS7PIbK1@wMS=vC7`f zwatZldVA0H&bV@Q(W0#p2bSHu{Acg+XU;F4B~O|tcI}YL{D+UDe(t{eYWu}EdoJ}R z+AQ{NK5MPF*f?r&_L8-nHix^HgmPTErgrUG#MFl;Z?=0}n3j7)rsmq6{S!2IFVD;} z&;4cXlnv{Pg@%!;woOftOq4awZw&^laR>b>+D~ ztTM$N+j~640!6d5BxU*Hb8Hef$mZ>}UYB@mcCHV*N#chq@o!@u-!t&FGf}O)S?Lgx z)*re=BkYm$q&4}mqCqDA@9xudN{{Q$GP=L=%GzW-PLX*tZZF$?xu(~U|JkkP`As#~JMYBzTqj@2=;jyA@z1Q%%gUYc|AzTZ?I6L45(e9HRvp-M z;J_uzRg*5UXGtc!-|PNx5cP1?$vFCzf9QI?2%BzjA(J#fLj57xkW1T5hoW z^kLiX^c@Z%{F7&FWivLs>}UQ-f42F$8`Iuqo1Cp; z_xmlum7MJV{^*(q!K?J`@)|d+`FiP$>`R~e;%EzNrdYLz81Xf0SWNs^go>`d7GcGE}c-#I?>^DqD3wHLgnd& zpXb=WGW@<~W8+nS|6}&2)=n0?;^S_u#n!Ja-nW{sZ}t2B>I^{I_qO`RWnd<*UqmrsaKiXFK}q;3?)dvkeECe{Xtq`AI>aUs1c7 z82dZE-$}0Dgr3|zm~%V9^|Ylcd+cH3i+d+u{oJJJy=?y8<@>mouVi1o_Go(F4?gL7 zvuiC%X{NH4>tv7FgeLrR?{cWNZhQP^_hpBJpI0o~JYiz7weJbV?>DWsZ92L47yW^tiO7e^Vv+<6(yz>cGcH^Mx6~lx2Sr9 zVzvI4TF(31EH58BwKo0c>baBqHl_OzeMd@^R(3M|IhEtrvh20 zc~AWPw0z6g{D@t>q3%muPo2NHRKjc3+j*C`SB8I^=bXnr{fVWIX-@NI(d3FKgLVPG zsHpG7A8)U2-csAOP;$eO_!fO_{K zGWH9S8@-=5u1^24`4i{!bxRH(V=%o}s@*8`pKR8!;>AVBk=NDAGd-gkL#a`1ZN!xUPx$Ox~uf4^(k1s{* z!1`CIdljGGn^bxG*{P`SxBp(aw6iXsMemIt*VCwi%btv$9?PGsSp9j|*ROeIY1bCC zId01jyLh_ub$6~*#9W&P$Cy7a+w*SH`e!ZnXU_hUm6}$oZngfA*+b2|0!`;jGg9;F zle9G}6n`*^Jx_If{Zy=4TmDtr&qTrFCr^t${uA9><@V^){TqTS8mliK2z6Bdp8epB z&!uMRFKK)Wt>QM`m3{T}MTw}+E4}=O=Oz@nOPYOpKD)eT8~5~M%}=exWfwhGl4V~t zUG>)QM7~L-KX1=v{_^kllP$vE_rq zpKI4=TmFvCKID90=WBiU=|}h8z9jwq!kd?wpPYN;lb+bWTk$iV>F}Gk|K^(M>6vW0 zr=+bZ=Y3B@Quf^3`|jWE|9+}?8Br}K=Jn#w%Nw8GT^D&CIl1`1_vymv@0Qj*5z=~D zJtfC}&g9EZ1y^5{Tx|PfbhD7{^sEVTz14fw%4c#Z%YH6u{Ih3Gr*${4&HCyOM?#9` zMAopB@*Y&*dv?RVbu}OI{(smMTq8Km^g>F-CSU&B4;!!YbmcndivLVtk283|f8!pz z^||hP-D$U)?eCwc>sdc7Wufxz*Lm<&Z3D~EA;1erX{oNUVc=0-iB>~HcO)x{wtrx%yH|{ z3R_R6fc?>5Y=vHY`17`6U5wsE1Glr4>wF$JPiFeh`2D986Q{rG%kRJbt;k#F-@W*L z_u5&$uD98z-`;m$?%b3Wj`3DCsr7%iDSW(gHTn82gGIc`%tE3zZ)HCJvDq4a)TE>R zifM_)KJJ5Y^R>fv+oiZZFV}0VFMKg; zHR?I@-O#`F$d`xR)77N%|L9*@RFG<%GxPlAXD0=JSM8Hmt=#@JLD@D=E%8r(|CNtQ zFYagl^Ah-dLFI(Owo58nA8arF37+`ZZ}yUfuahTMl&Yj=Ii*YOk~t~+bMCoG(|_yT z{`$c(PHTU@!F9sLF16ae%3noIQ}ZmPLgO?xzQ116HTUV7H*0q< zU$1EY`s((t94~7myDsP4&f!^Hqs$TfSh>`gdpdi-rEa6swF!zZ;(=MlXVI(Ai?8?nDN^|H@&^A6k;%68Y9|dZCh=T8 zC^qSyLAvYp(;R^m!f>Kl3#(Aph9$ginSco8@M@ruh}l+qZ@7W&7i< zgfEg)OPeZtzw@m#5X`c+b)U?=>rFzLoa4E~8k4H<{SQ|^_r9K)6wjYpZm2D1nct)| z?`VTK)9!C`s{Y&J14a+3Yq_Lh7Y!hr=KbuMFN%wCZvBu5p4*kXR4rk5R zYX9|OKjWSWC%D$U&O4fB(l5p69lf6Q!aC>OC5uDDen(c%u=>wx!R6<$YyN?g_0Hd$ zCm-)S_LZi(-!?wnEFlNa&p=cF=MzcWv_)I4f$QvZMNK+EMT$%l7; z-lp%CzdkuizV6PebNd?azmwawE8(ckjtvuMIV`z-*4rnKF^hlvg)3^!Z~M`fdqm`3Q&Ti3HwBzjoo7|IQ4qYjazVrPlAT*4TJ= zOJ?M^rA^&hJ=Q&2EjB#o*7TU^`#^}(+TQ5euMIDP<5pI6U*`06PvA_6zoWM$f2&fP z^uA~59jhnT9z511clqxnFLAeH=PE=W{+RhmNiMX!}J z7IpIRkN&i2ued#2PfoeRzG44HhiWOQxyRS>U)Qr|Ud(Oay(UFq_PUx4#%I?Ta4bE# zA?Byk+v%F>^3fjF$6Y(Q>;sHncsN>T3p-vkDJfmSEYRO_B+h>F>8h88i#eayEB3g) z>oU@P6|&AVY~RW1eSed7{u5rweP+HT7uS>3Paa>Ma_2=6yW^aYF7q#+WlL&Y?Y`Xg zY`@j&!)i0d^YHidFOu%E7j9jC>eF77=~x!1EIY$Ds{TMG->&E|ErG3(t9R*rzW9H` z$7zk{i<<)T-=;<%+Aw4NiN%+cFZH!c!uesd3F9<)>W-pkZZ=bb!re}a;l$Q>`SSt zw#Vs#Us(?p@MSu_o;mY=u%dSHD;~QZBiE<1qO{8Io3OV{-RWk!=#Q;R@2X{6=Ux%# zak<0wenx+Z;FFZyg~Fd|KW(>Anq^|dqod1MzI6Zk&eK*upX`g?A1YCtHpO(Qe2Ab- z>T7?m!hceQ=Upe>cyssm>}<{8>=j~va#XjkE;hWdpygel%O90(TPk|z-&q%sv+3N? z*E=4p)RXdE{w{puw)D)qBIknkYDe9hP|5H#Ifu2%EM(36oo3tf_b~4LJ;Q9B&@5{{ zmdM(4ZJzV&=dBh@481n<&#!jti(jp4D&)e`*v?-+8@u7h0}IZ1Rav{`n6_o_`7&SK z=QZ!wlWT=Ho$Jokrz<7EiW8gYL|cF1jAR~qKRAP z1gh#P-8*AmD=PO&^MKjKys5hb|7WoMSQq1vBfzvqZ|lOAB`Y)foiaUky`Au=&3lfR zvA}w@ix1XZoOS#~>4LLY=Y(@bYCE1!`~Jf}Ykr{N#XPg(v)7s4Ui7(>eYoKN%eY$w ztn*^8=RFeemI{0SZh7V7E$lzf@ZHIu+-_uE*>seB%~yZtKI!?!?^i6)JtAylYt*v& z?v6R8B{5SM3g55d%+KX=nV7uqLg6v53Ym`CynU{Uvqg6toPFDC%gT)hY!=Rp$h^!v z@qFnt$<(D@>c`iHM11|I(4ianbJeckUpdPcUG#eQV^7hQ14VY1Y&p1VxA}fc{TFq> zRchi4smGTemsH*|_Z9bh7Zz>bU+lVR8Pma)l7H$aF`vk@-2DGbpa0fnY$s-Wbu0lZG3`a6O`3=GZTq-M)AwJU z-&1f*E-LR;?gG!XtB>`>w--%X7g%c(vf%E8{yDj)6fY&e+hTFOY|CqlKTi8iRMr># zRsUP6S$^1eUh%W4TVV@saIe?B&Q`We_}TG|w%R{ZJv`jmD*XA(nx&I-*=`CZ ziTUjM=V+jP;Z3UG&CI(!_P2$B_{Kow*XH_IRwV)J!cG=yEmM^JHmVXa-~0%XeOLe(ioGXIU8Audqc{ zw476HMNQz_`hb1AHYQliKT{s>DfnRhZ-o-s;D_G}JpV0@;?&u>c_Fvh+p2As*w-)H z|JfkZ)M@u@=A|ptdUf+|t>0d^CqL6?->$5mAJ$9nweyias{i>zn5N4AhD;Y$p4%mv z&El3Z-^^PLd+*(t{#8o6HnaF)qX@^Hog7Xg9S2!-MWXLzuAXLfOe%kNebuyAtUSg` zi|g3`Fdhj?Ikao3PQLl!wY~p$<)r4FwGUe2{YyW4?c?~3>vyjUo}xX$Zh~&ig0uRW zFVZ?Dr#cqN&o9}~pmL+6GU9pmjTbBoeZA}ron3u;Ck|~`*`9JW?dfLSO3A}D=6pvl zTSyuyt6t=~bn@4MUY4hir|b%A33}^(DQf|9M3F9{pzH z@S@W{(Q}FPqMvsX9a6n`J}R`!ZhYhSc13~Gf9&p`RtvoTLsRqtiL1vry-Ere)dtN zOC49TSxaX8eEjxPgwkTM_kYqB3ieO=FE>%j$wiZQVc1-4hBFd}b9MH5Uhr7o(-ACc z6!XwyQoEO2&BOZ(%jO$RU=u%dVpF%bc}j=#-FFW-zh`j7@2)f}i%jQuI#Ksf(zmYV z87Vr!uChlXo2nvi=!mT6Hg3}_*unL%C4*~k@znm{`Olw*T>2ieVfuahf0z1nFU7r_ zmategO8BbpkEInpi}!6Rb`@Ehyr*7hlXeulartZ|;}g?p4MfG*}#@js=Rl2TiFI}2kBAz|S zoa$P8x&9~9cfq*kIZ1(O`_iJ;uj!AJ(0G&nq~T19iFuajiD#31s-JmpQuVS)`?@p~1MZFPDuB{22Yku6aIy||M zY3-UR{`)uH`t)ADN^YNx&gU+*Xf@AzL9w5U4FcOfJdkS%-xV!B>q_&YD>Gf46Iy?) zsO(Jle9RL3oTvHJ^CSVwxh=^ZO50oGf&;bhF3Wj;eTw7OZ`&rXohO|7as5(bpWd3O zinDwcwuuI+op>>y@x}icO@cGm&p#9RFthr}m_ev~k7S%pD>ERpcC%Fc<^+>$w4SG)!xP?wI-L#mi z+#Y)OK;X+`mtReh|8J>xq;hNYj%^3N%$;{6HE#CCcqRGRMMV*8^Iw(7&yd?B@QwZb z!|(4_hP~(Q3Ucy#=Ad14ntNJLSUTe~#Un=^khZ)ejt;9a!4eujb2OujYGSL_T~;CN`cpkS%f^wiRe z+xz;&eg@A|)Txsz)2+H!&2#4!>%1zADFHL(qA?(*WjD6=T0LE0eS4)_^$rgk2A;<4b{10=^`jc* z`v~6Iw%9yp;*=W`-<-PT%)7DIBhE(9{@233+>n|x9CuT74)a<&Iwx|!PyI6|$oIhJ zf~hv2I^KqK)K7esJt?ej>(o%+y&ERm?1-HnBR+AvYeeYs%=0dXOTOygmn>lP|8m0X zi`Ja-4O>zp-4mv`);_2SDOs3Qw8t~WL9f*9OWr=a;K$q(!g>B&{aUk3?WCO9qcsns zWq7xgT5GUBoa6#vU9qoLs2!K6zh(S4jXN`>y_uu__r>1K-21DlnhT_- zym-XmvLT_Q_=!PNQH5o}D#Q2R>So!d>*w4Ky-;xQH<{#nj5l)ZD)N za_U;C{8>_gLaXv@g+=Px-vzkc;x|J79mYcAbS?D;YI+$@PLMR^LAOf{98?N{i3$S5=2 z^;6Doo@r9Y^_JDkSXW(na{b-P^Y0FZYO_o(pY|=L@|~Re54jbV@(J7G?^pNVUw@im zzTQg?zmtAmKl~>x>XUxq8PQuM{pDk9uwBuNGPxaNUu$sXvR7 z@0MpOEt8mB`ubN5>tDb77D;c@w#vr*C~a1puRJ6D>+b1{|F8c`k>X#gcJL_o7fyvt z31NXl=d8+0C(H{qpQRgoC?q;}`<^E`b?&cuO*x7};`_=98$%0reDC~z(x{Si;*jKVllb+01$7 z2d!z#Av>uhPO=&+WVQod_qS#sf*H7{k&S047tl&{{VZoPi9 z<+8`S+GnrXdEe@PVD-Mb(hbE&TrS7BDt~va-W}$?D`55RbDMr^@BW>9@5?nkiwmpT zyf0aAy1hHr{pTOQpQWcw1TU2MeOv3hKG$!%`Ff>qjJGO2?$tdgY_em$@S*)%4june zul?~!*t@4mdLh9ze(4q#d6qBIYP|Aoeq7vj>cUR5Mw2&fUpcf3BhPRA_Ac*z*`4=( z=^x@gp4Lx1bGqj1#XZL#|7K_YUHaN4K6-upZ`1E>`3HPACLT99@P6~9?yBSdcaA?U zJ@MK!?YX|*l@U+&&}S-7;`y*97=Yvrdh zuKE}G%WD?3muHl%JQ}^#HM#U&e(sI;cWx}MxVfCQ?6ZyV_p)+ni)-3;cZ&C3{A_65 zo%e)$&2J-Q(ejfhwHM;!U`sC}?Mh-uOEG8s4HnR(= zh3uG+=-ke)=r+Y-Vv=jOcwN#s^Gxv_o4qP6#_g7ZprS%_YwavY*<9j0O zchr(K0%z9Vn`XTE-|d}G(sz})o;TBp_Q`vAexZB+yQs?2WoOn_ukAJ4^tr?3Ks$T> z;|Hk*PG^?$zY{oc=-Z{v$tHZeDnGqRm{~o2-~9T2^*g%Wb5Brt!%~yE`*zW#_lim^ zw|Z@w4|KR5a#C9oa43T7CnM{3wJLuFe$(#!CFdFTtUj>r(`WyqqLFjDb_pjw={O+q z^iZeu9fPC|>iqIL8i%4!+*sNZUB+1Cp;)h>pvd6xWrMBS+&==R8fV<`ahdUKk-z5e zj2z9QVh4GG&$Pw82|6HoR_3DN?Mq$;$Jr`%)(aT*$xQN7YX6hi*1SsR#L4fA{!H)} zXxBcqS*QQDk?-_ph--Ne!Tg!O!M#ZA`f zv1KP8GTL)44GMG2{HhwJm4EitsR_@r{Q|uYGi|W+=+wPt@7egTb?v2;_N{`BCv`3r z_E;$D9JylDb>y2^PW9!2fM%wxrD25!&xWp!U3_Yji{4Dum4V3*d(BN#Zl~tlOySQF zzSXs4>9yk#JuaoUgEpQ`bZ+^z#`I3X(k+)RJQCP?{z%nb(J;qK!*e&ZsxEff`qC#&avuOuheCH+IeYlHprDQY>^WWe5{r=$dduLv% zuZ~;vdTNlk<`Zi%`9I$u_S;8(&s5o;+x{X??r+-LS2YE{o{Bp#@@=qUXqoueK*)yU zr(51@#ykI>72BMboX{Y;u>Z;JKT-h`BsGKSIxzs&X4$@0vewMUIBH`OKfo< zTThE5osBsrJg@0u+P_6nJN!HSrYsVB^W1sHw7}(#Z^eRcvtDf|*?Q)paQ@Bi4A;O} zK~wqOEfNfTaPokFxlml%EW69g?uE??p8M`fLAT4TzhZ|hj=Sm=O#Ql4J= zzsE0w7fOXD|C*A^siQh`TG!sbhM-lkUtfjqz7+Hz*0dnfH~zXGSJ>8dQ`c5h^N6l= z4{NjFj_T25ELFngaFanjFh zPDf}5`{B(#g6Bkx)oN~*Fx*}pzo~!IQqx>v-PsfBXBjWBJ2IhFE#z{vn@i7%g{y=8 zXGh;XX0VmRbD6#gw}IX!ok^)4mnQwo($+JYbh?L^J21m?`?0%z(|0kydFxoW`ljX8 z%t@ElsH{o5t=`&nec=Vuc_pi7$9*k(zl$wUbxMThDgmx5A(N)4u8wiN_hFy$Q2M`wh>tf1edi{&Z(XrJ~jYru-R)zgicF>aTwA zVA1E9do&_izP|S3T5d60LQKcNS|(XCefeJ2$hS?*tBi8jt_k6gebg1G5jTrbVv)hT zj}s^EnISb@XR$B0hPy3S(CVw7()&{vPMka^RX6+j;liiBK2ObpZ>GK3_TuiRnHOWG z=}p&P(OVr8sOfIGq;JXzA?4gzALpbm+c$Nh!_?OSG5=zoSihcmAtP>+qlkBycK@~u zy?S33a!-1(dRpY+zHKIx6nzCejW4f1Q@vuYzU(XA^eTl(|9qKkWiw9jg-x*q(&maAQ9OS?I7vEfJf?B>Rh<6rUHk6|I{ar<@f2IR z<9O@UL$jp)x$U=~+mZTh`|{UsG97=X+_nuZ-1~a@&7?_*=PPx>56Zs3^KVx$Lr4CK zXWZVuS8?qRNy`xY8vXw7i>RBQ%qkL(zFl8r9ua*}rua|_+lSupc& zef#~eyR&?`@wUw^=2qtf<$op|vbr{FscCvXZ;{8@+6$Au|6vVXSEwsC`^LtpR>!{G z`+0tST!UnK?v{4%w^os}XWfWfcP95CDdl_g_ZBp zCcOXq`KkN+&?c{ai?4s5@Xp&?tox7u4skzG*WKAK`u|t%zpi(9^Vft-FWE;Y@?Vr> zc`W+3YV!Pl_l*BrzQ2;t|NF;}`Xs|YrT%|jsE>MNZJRA2FWZRu)dnZVY&!9hg-y~Sd^rU@(UGQam3aQUln zP7P34u{hXE>wrf9*Uk%8D>iV&w|KtFyxO&a`|Je6eIIh!{3{X)-kkct^KgP013$a? zdvmFN-pA{IE->Kx`N2Sgf3wbcqpaLKqxUT=eXh4IEcvmHUvlE$|IB$tp-uwFs8}?g#teK`? zy682ptD*SOzVii#OG6%rHyTQ`7D{w(l<55^G0{*mKV33Xsp(sQ_(DNd9dFjCl~QXz zN^LZh-dZTVGccsdfwe(F=4heJ$&E5+C(0BqQ;bSt5jT{&yD`7wqHjQxRPzG4w;$y` z8p?kyl>fO={_jNjgMx-G8zhrINZ$XbaJS3XB~9-50y*hRif=zEHajS38Y$@tDH#?i z=?5trZ&I@UB*%P-|8c*%lnPb$mRRTvmlUTl;LJs=lEu7iq06Qce`wa3x1G z{L+%1cc()5HSY#$T03#f4pJ%=(zt4*dvlZe^-H?BmsGc2a$q>3^Vai?(HWJaMLN6B zC~x?nv+$D^^JXp1Vgue_J=RTnZzpkl{B-nCk$&k!oud!*Z4YVIZ_?El)-yFWw*0JH zTcmf?({N_c28CyP`h<+61C7*+O{@=TuKZ-c`q?zq*lf9xw(w-_-JkTlg9YVm5H5-FfVm{0N+-(2%v;E%B zX10s%`q!DiH|G0ntny9RL2`@Ze`AfO6YP!~moND2Ao%5QR-vS6iL>Pv=fvYvM21w?Y&5R&_Z?ANSRZDr!tTT1z~- zRpt0!dQ3F&oLb^JbBpKPFP;lcyq1=Dt=!_Z_KVlXDSa1$RXetL@BQL^Fl1fGArIk` zPG?It9Sc!RZ)!TX#dp7!uW_sI(FfvpxA>KF`3bUUHEc8uJ)rtxit6txeypPNKWy>+ z^2PtTNq{?3pm3>)M5&ovX@Kff9WGIIzOVj<|4b!*iUhW9G!oq!Y;GE4=@jffHAM7E zi161y&#NJUr9rV*y|+#o@tU!>ddE+C_tZeu=34 z8amZ9;>4D~mtP`FMI)=H1~0xEZd@9;+B9;uQGoK)DABDEJHJLxFO6|t6m&f#?67Fm z(y4*#MPrtm#%wH&Jt`WxcWUfg(-7CGF<-C7+lMAxSHzhC256$wPmgT+NmiP8s-bb_iuVwi^x8?u+md|Kjz*=6wxxIk*dx4;Np=f#GbF*NH z?}duyMXKdRn%j$XzZV&r7n_zBTZ$LSZZCE;FL5m|@!VeG`@JO4yfidC?_v{k%=gkn z^Rm?Pvdryex!=nQ&C5&6%PY5+*M2W=G_Pnaujt%f(fhq(qIu=i^2(XpE9ZW%TxecZ zY0j~7d)3=~noqKn8}}feZ`*-pni_3>*v`4A^eSgq;;@7;gkR4)V(N)LJDp`a_jgPXg%v(wYV!^7MA^a+gXlQ6^YI<{MX=j3tWL&v2Gb1D8-*HRd z*Yzb^M3;W$?e*O^bJmO*GhV)oiin8#=fCUe{u0D#kk8-SmrT8LckiA%^%b{o{P`pL z|9_f)JYV!E{@0QH^}%1C8ux~7 z-YopNx7Yjh>DRAc&wgFMEo}L=ZQHhO-(Fr;R#smA-R;x&Z{NOs|IV-G%`Y~KFN~d! zkB{&F^A{OxRVLx(TMP?JN=o)zs;#N1*>t05)0MJKcZ!NCDvFAVs;a8W%F6cLs@-?3 zdf&b3ea6*wb#;Y1DtB7e?6j?_+)-9p`L#U#&HH=zuD<(n_1>GS2j5)%djIv`ov#nK z&VFofF23B{{JOch`F8cy+n2xIp8mRA+`7Ep|DAr>d;S02e}C_9|Ni}Z|Mlbk=IZ|2 z)BVfE_4%*s_ixwt|9|xF>C>lQUq1Z$^WodKU*Enh&BONFJn`rI{c`)`{{CkF@%{X# z`}@Dt|2KWS|M36+GyYBgS1!(Q!hpe=Yom_HrQgz$?FS23W?h%>^3-y!t+38 zwnw{=y$tuX4uxr}wPk#lT-Gp`S*tDOpK2_9deUnBc|DU;CU;+W@MFQG2alxL+l-e6 zYfs=>DyVf_ceZ|*?{xD?`|U5TxuCV-jn47a5$nwIdT&gqx467^`wM-sRX;+uUUOOc z%B?1-e#s@ZGj8{eMI2w`#n$Go9GcVk?o0bagSxpHEALA8Ee<&mn6uVef_?R*1N|Sx z>Rx~N)+AW|svvNKgq=uzM@Ftqbla@n=Nemg&-Q8CHP2V_;d%9(Qtdl@CNnlZD?V)} zQ>2}~SSru^%U<6%apOuQJ-PMYjuj_! z3i-#ie((9b+vd>R;x`2!6|X%$|7=yu`R2U}N||a*%G(h+aA`R6b22K`YiGUw%-EnWZZ(&S_97pF`=W-GI#ZOMW;m!gEU zJr|4BK3SR-sqSUzWBOZjt%X$2(@Tk)980cst9l*^>9cg;_-td!XQ-#U?7tVM+zREj zUqa7s?pY#Z{d4Y7#;CI&KQc^gcZ!MhJO4WU*0eR=T~B_7b_c{4Z0{5Zy7fZ(KTBWx zj)_f7O?&u^y}In@CAVBqDi5DKA^qVTCbPYNXO(1ZIJ&^aLFZ(r@nkv1itp=rPi&cb zuI{$I@`Q~`U1w%=IGjp7lUltz=uK~iAlLL`96mng${|zo?{j&UoGb7OkllRX@qEqa zH`sU1V%=|Ecr}@|`jOiM??>7(7iFzuV~k~eE7N-9eBZ{&o1f9#>lbl0v&X*pnMY9G zooi86lX%X>Wh9#D&UVc+`8QEhA#>K&Rp;}fHvj&2Z_B$++0E&PYfe8D-1csB&XLXU zN`If*o!MP-b5A7K-fc7g91slt|GV2``op+MeUCp+sC~-Ua_61 z95zuQ_~Ep=PVylF|1iT&;iwdU&Ad+p=gKd02c+%|sp z#JzGhvbnZ9Z#nY)pKb9X;lP3w8qCk8+IO6i_#fP@vFLZ7{W3KPKi=iy5*MX8qzu?L zU21eVRoJMKpO9j-YeId|1%(+7a$PPF@?kDAQq4-1v-;LpB#K9KblY0)5{}3b`6@+Qk$QFoSFI?!JU*b$3;N=_3=udXEU29Lu+r zds1+uC+MK5WAu{O$8)>*OJ*%_xc5WpbE>DV+ky){UlzH#ZFpyO?A(POiG?{4PZaIW zO*UkE_ysPCl+ixVfSR^Ch****RS1abUW;-1z zkQ8;eDnHNF*wFd744-4H$PNaEg6Ba8lbz*?BBDNTU#ev zFwfoRZJr_Vd1sP#NOs5mm1gJGU)mE|7kKQ2-sFoM4f++gbc0*McXn1EI~BLk?B=o1 zgy7I+|7ZFa3M{$Vv5r-HszI7+88#e3aU)?M4EO+)xn<>1xu_vDuuAUnH>-AQdpI;YN zt-NeFD^#_%^z+i!`<+@PYWmNKdFeiWEw)MfujYA|Q<~GVH|nk`*!^}{^l>@s!>w<8 zHMFM(_P_gWqrSeUVrE!CP08;Az83@-lY+neIwo_NTg|-ptLUC@)2wy~bTO6!& zJl2m-Jl&NkOX_Y_Z?26NRCUoBU`<3z6>>~%euCb@So3Q(M_}4>o-dru1+_qdZ?&Y1PNj0_e zo+>6(e!8^xZ|P&LWjm9-Gbf(gSstADv__=5;nvSZLA{ypH%{oB?Xpqv7}LA_;?8f& z1FQ`S{pB$_9 z^-z7)#^^Ys|5GKE3uG^wyh-d!))y=`zHYHAER9VlH(owfj$w^WM4Nr!q$5XW?F(sR z%TM3)?N5UK(pmh+_xL`4a&yr)Unc1V_b>mCwlklYX?}k~?TYCSb{G75_BlQO^4_I; z-(9-;xHQ@D*+%aJduPP$uzD_*ro}IGYtok|hqsA2TYvlV*!(9)ezq+8hUL7j$qg(r zMgO&J3$Hna1n|Ci5_&>y-br?^_D;d5;|%Q<2OL@j8UFOokJE85bZNVE;O}=0h21)D z8X1F=8cVs)?MwK*DvLYs{4o^`*GE&eFL_SznE%C(<9XFesS}=eI8IO9wd9EBEtz*p zufl&;PMtZsMB(%Mo%?<-=gWHhT4jPUdv@%1r{qM>5Vy?mWgmM_3l#j(>2=WJy5Gxc zZ}H}V5Id8#^6r&Nl2V5m=eaQ5IGPqT;l~08z2pipjs<^CbXkftr1l)x%&WlC%yyU4 zK8eY0HPeGf45C)|U#2m2Rxw#mZ1DP!!)5y+=D+Kz%QrSWf8F=c>Ak+*w)g-0*1Xwr zWkdTPwL(|Xmv#Sk^9H$3yR<;~sukZQAMR^Ep zcc)awKQE53msv4ax(a?t*>m{70{@%^QS~Cs&lmj67F5y@$dq@~WOVcuVN|=y+|SJD z@%_h?q=TjomYJc<=}TfK^fX=)s1RW|z{WFc_Ejc^2fj=XtJl`;b`aQcvG7vu2`$XY1<9S==^i@)NYqlwo9`-E=f3R(VKk|8hh=&sHKKH-VFy{U(7SW_FOGF%aPQ zoZum9xclhs&;DMno4*@{?YXp0bh?&}x6Gbzu^Fd5Y@YL6;tQWpVqqZKux7#Y*5lFX8e(QqlQ*MS)_hrmpRDePwSwWxg33on{AKnYB=PrIDAc(eJ0%o76v6Wo-E% z>cz!yQ@lZ8&zrv&CF8zIGG4#ox!{QW5jOUQLzYV#i{?N0?DgQGfuQ6ghu#u}W(xsd z876HWrWI9x`dAySqZ_q-zKZvK{`gCHUi7RiX2*mC=P&Yq|E-t%kt*G3qPy>sglZw% z$ygJk1KP&>OoJ;T)Ed4mf2D3L8r$LD#p*81V#l#)9@EO7%#Ql)39p|&H1hBjo^kVp zgUPfzwQXBoH6!Nb; zpUQuCmvHcm=0EFu7$+`wpExzhV|#Z-*({%r!I}|4UtId{h{)V_mtNmL`?QTtsF&RP z<>5EBaj!;UuoQJ3^MblP^&O79!|pI`WOz32Qa7w}o`c2-ZI>PRj?uJZ+cIM_ zb?GfZ&9jfQI!tCedpUza{Fq<=w`-<18askyWti21{_RNmocP@A;`+PS{W50CM<~44 zT>P3>v}@`~-YQn6i*I>KuX4S$3Ct~>`FASY+dF}OnfCqNemd8qy>!LIud;7-m25Mf1(*~E zPB4^k6cgrk-#C@gcv{%1sgYaGyDk*pzWDHqJ?UNx#OF(#SaU0@;$GuIuJc+}6?ZQg z-n+N!%8GfDIUjX7pHhD%ui12|@B8mX{2Ri*9BvU|uiN{TTe!bqk>lPAujhC6q%NAU zai6m3>ZYg#8OOpovW_?>{rj+DsaQ;~o7T+Qd@Nc-JElGRyyWiPZ$JC7?$Vc3U&o^+Bk6X=cEQ=U%Al!t zzfE)~4-Md#TJe{Qu`nrTM{SYs#_Q^v-oGl=^NPswKVk4KQ&zmHuDs^rx~QWPzdUkx zpZ7ny%lPmu?%)3wY+t#|_=QSUF7IEDB@1uAo|V6L7OXqJ5k1Twkjj^erHS- zL(GhipF2b!H+^-VDfeQVp_bRj~4fbZHaMl}^=cFAyYkypcVx*vO?7ubJopx_r zlp1o|-{zpL%Dg8k6IghTWjpSC}h3QpszndY;V-ey$WIXo3Al`IrJvC=Jlu5 zuZ(Ow;xfPATJ+iW{nfS4PVgyco;j@lhWl$$RP15bc;&e%p3akI{NHnrW${<3HIv%) zV_pYpDZQQJtsR+vEI!OS_TAIFK2q`Pmw!yE=}$W~_BZj04M%}t0~oWz{EOSkTo%=-AN#p|M`U*Y(* zG459HQ|~1@Qq%VC6PNw4zTed%FE6d&@Y>>4&lhUE4~$XIY+sw5x81n!;p=txpZEIr z72EQ!@jdOOeslMnv%6K~7p-r3wt337MfaX52Rn*Rp0_jnZb761%i(!!7jw(%waWf` z{GG$Rc0T)w;MK8vUq646UBR_EKX*5646uB@*x&46Vc@Yj&)ZWIPc?nt<#qFIGGEVG?)we)hAiQcSNYk=nEJ($EytoZ)x_4lh3!LRuaT4Nn*}CPtkWL_ znDL$L%ME*e=+V{cUXPW!Qx`6nS#UXvF=>a!JNNf5b;EBTRQc=|xlDTEEZYpJxygnz zlR2uJSM_^7G=BevJ3eXQxhHjZyIy{9nfFC!{+BhZJ!%?#%R+(}lK@3vs?b`Ehw62Rg)tQlS;A*7# zd7H{7y*!yGtm;(bc#qV+iF&=%;@9(ED~f6ZZ^xGZG}ZCiqn{S@`itIcXSuh>FW)&k zal4?ue!Yl#^USYTz3<&&cR!|mncurZsm!WTqhuVAoL(1XXucwB4JyTM=eBLSS{B&NWhi7+Y&orFKmlXE; zR(#_25Fe#v{p&vA+S5)ae7wxQFC*f-!;HnRcSzhgt=7FH_@FtXMnpsi@6=DFl2Pd_ zp}d*`4Rgh8+U%ykC!vADR=VsGVRh^o1b2BX%cVS&HUy}4QIa&XH%KN8`;S}U+@0O^~>Y*iq*d^R?hsf zo_n$0`rjwH-rP5fth**9o^9BDh&X>z%W9Wr5ch_})2@ctSh zHdpp?U+4q<_6D!(N|O)7zbdRd*L~~t`dY)7DO?;8ceyp~m3B?{y{+sL{Xl!+r=E#S zIyLN>7Ksn;zw+T+9GST2z$tyrRVRG*A71xhLOruf^}!vl<{6anY`UxB{vyO>=U0zg zGmc59zx>T&ZC&yBP1P)2F3zG7FOF8jOshIChy_8 z_FX*W!1NDqPk7kKDo9Q46IDvya&A7~wWr=Uw`oLPG@ak?G{4?hU0h5_J)A3g&Vws_ zC;8U-7q7q4tNTIYdP$MSg6;1PFP2!Oc;!QM{j}r3YL~xz_gx9~K76@se*e5{qVM8m zCQf|SD;1b%u3n;VAX#@*M)b2$j={G_M=P&PUix*nz{T{P8rQckKP!3NLSXNXpb0;e zH+ZbeRV?NH_o>p_fT!>`yIfLJYoLux#?eEWReXEOg8r{%I$qoTpmL+BlDgorKMt9B z$1f)7c$YoQbc()|d0Ob&%6zG{Aq*E&OER{VvrIl%_LjTZNO#fH6%9Ay>TOg-gl`?2 zBN}WW=KL;b?WX6KjbxczH0&g=FV|Z8PjiYY9)jVXiZbUJ9pe+{)wkF6hAY za1s7@Wd(1OUu}q3R4p-2&|O3)Xs)7-)hy4RlVx##t^{4mt==DDcPb#Wx?~T--sRjL z*Rup}_$;5j{N{_rd4@;UEtYpR&aJFJpOm#o^NiQZ9d~1cI708%SMAxDBBXTu?K{59 zS2jGFDW25vc{}kJsuRff%`1m+jN^WYPT(?$y+_snE*WWC?S8Kn}_)qWE zRIhJws^#yuZarzuZzf^Ab-7mJxthAoF0GH;uN}QDS-HZmzVJ$f#O^0iJ}o+_HA{t4 zTUN5=y%w@On8d4f+HBt`=j8i;?R4ATblExDq?K>^%i4ZLTkuki=9cHS*CK1D*9gpU zyO$~_ykp-srxh1;jtQBay*H~d-uT(Yd4&Rp=eDP{?3Na9->&ie1fPCZ=02S>Op|}F z5^eJ;FKFVa(y%u;khzh86pk|F^xLeJ!GNTj7yVU$uXeUZq+}6!@FE)~vVdagzG7_hiC) zHJ9lN(n^?ux;7W>iw%+z@5xFLoGEj&WRiY%=ht9^%N#vVqvp!CPCX%$*0+d%-48?4 zuoD71HPZT4NL`sBvG#(0-Px8IUAo~%ZO%y)U!Jyp;##{&I&3H8n@;ksm^`ap&{L+m zV6GY4v4BFUMVCEZWPNst8g_`%?FORijMtu^A|W(X5owZNt4sn@Q| zNrg)N5^7TlPIzi6zHd}xvN>-!!RNsm(Jh9$ZO0ycJ#&4@gSKP))x{TS$@HhJUUf`0 z{PC*|nl~)|WQO_)ma}ip6qV$Yo2*|Z1JHOHd*O7fo0L( zj{ceWkw(;;`>8*9k3(DX6+Vt6&?~ua_^L zemoyLIcKZ%>I#dceR4mysV7f;wY-|W%}2_4MwzhL{iuYCK?198?ml||#*tg6LM4hq zL(YZ%552c(_OA~~+`HqF4UR_4(RU5+`05kHzV+z&crGi0;42dEoX;xUYt1}0ec89; z7iY(9+rGEyXjfp^DxRFhUUOF0tVmudurxeDF!vy@+g3j>*DK|b#%7|w&Gs#mNpn;4 zw5?pLBvbUGv+vP0mhMSL>w{k`pUWv^@J;2Knz-#~pmXC_x$3LD^u<3XF1(m~$0J!guJ@mv!>-;nZ`F%s0zcns=h>6F=-uvJd}-mE zqIh$1BjVW=n9IF3? ziR;N!uk+Tk%kpj8n7|hE_(Qo-MAA3s*bvL8^EC}G+AI5{nw1{ZU7CMCaqc<8NmCZp z7rt1LU);j|$S|&>KKx4k8u6cVj@xIRk#te{w&Hx3r;eVx$AY+v(GRYMXI#4R`cUq9 z_Q$;o`uX20O8BiPS@Aw~Wsh#a^8}q0)yEWnY>VnlzkO}Km~rpT@?{s=bHl||`?FUo zK3kypDN9GqPJUuw-`zC~ZnEtlfCfts~ra!p0a*9m9ES6AyhW}&Fr+^nrS+7MdxqL z6tGzT_rUy{*Y(wkb-yVc|Fhw?uZ+IWvqKA~T-o+#`NN|wGKb>kw;G?Q5u5#N7UR=3 zb{i4}dAm-36qDdfa9k=M(EV%e?1}sH3?{^fr(f%PYIoi3lGZN;`!Atuu2`?<-tNC? z&EC3AbBsTwHL$wfNLG$CIjM2A=xCHHL*w^6b}bIxit=kGn}kiYq%S>^(PE#uB8BH0 z$8x4B7yIe)PmUf-`?}yqne1B8OI6(J509yZUQ_ui;cFnXG<3Q*-=xzYWPPW~oK>1u zeXnoMjmH~TP8Iv7xa>>hvKGI#B@2#M)owXaaE4_&|L(b;=e^zU@1d3#t@*ycZxZLv zPi&R(j#H9cHz_4WiZ#yL@O;-EuQM9!Hu}gfyTzB4F`?XRc+|`c-v$Ad}#wZ&8{9bw`tf0wm{Ta(iPj~a*a;WIDFxX?f zMx&sv;K{&^XF=GOf=aO6?VDWZqc^;hlD&Y zG~V(`&@q`H?;tPMap0`Tu_I>7mKmh1d$8uZK!!BmJ}!p*!;g>l?iUJJ@Y{Fg`vZ%A zwc5|r_776Ipy~0O>znKh|A%U;TjoyXHWK=GLP{v>z=r8lxUwDQnxA-e^}J&v8^dZN zHdgNcQe}JAI_-QBwbP~Wg0%AE2Wj?M7mqL{Y>pAQDq49@qUX0gMzce*TU)ESLt zix|CPRf|%Ox^P)$t9r3|!`GFKYbv%{pGnAAwxRb`dxC}2TXDZbt_qn6%*n5(3szWU zEY{g#&r~3x@j6PtA^i+n(E{hJB|23PebQEE209!Nc3t>#&d(Jl?9=8RUgf+wfPcZe zi!SmZygM(&ymStJ9TRZl!jk~5%QgY)SIrGHZc0~=@QLT1Y#;HbYX1-3!jlsDCtIpc zPN_b*W5qk$?vGE_F8#GCwLJPQTe{wXszU}|TLosS9H=tf=ss1zGT^Z8IsVj}{Of}5 z`+6VNKO@OJZ+VX3+Th8Hy-Zbn+WRUk8yvc2_hd|v(dW1w_pfrljz-jr{_T(c?~^&P z_fvG1s)zUW`6;SLa*x(47fEOY9ao8#UuyDVw?g8o0-MIm3d~qn%z4dKhiWj`mQ{6-&`-CtJ=l%Can)|J1_{Wy2Qqffg2JA`h!hwuAyF4Ai+F;^`2cqrHA$asI9S#rv0)mx{DZ4UVVH-JedVa=|OFTJ< zFz0{GMT?v5-cc7VqP@Q`p6lD;BpSt;r^cO^>T~^{wx;}M#=AA*k^hx{E|~cwTUqYp z$F0ka?-VCGc_^;(NbGu+4f1`11RLa}!@vF4XZm>J?yJE%pR^z{YP3G-U3T~VA&u!LsJbXqu?Vj!~{j*8; z)@J#!EtulNDSqATdEvo{k+;IF?u3^enc3XVFLN_oyYIp6KU~^ZmQHvlnb0S><%ZOy ztRuTp6zyDNTcg&ru}U9fk(QCGk>$FS+P%_V{l8msrhu^I1?Df;t^RD<>+?Nzid0r& zOmF6qqKw-m8RjWBm9iwYT6$cPJtCH@d7BaFs=K-HzWKb&i@TB*USck3mkn`R^zhMI zk;`jrx(v$_mBrR3hTYSd_U>Jn+4R4OPQMIqaD?0rQHDuZbLR$?_wB6A-uG2kowa$gpz7$O*C8%Rg(k8;1oYlV)H9k^Uesw^-tTf!nepVx_a9ZmH%t~ znzM|gS6>uov7eUnSX3;b{mb(Ur!xe0#^x55Zhu`fz{c^%%qnFknwHO>Y zKHM*N)n31M)qTCiVejsU<=*wNj^y9S`trd}t9i<;H}peag(+r-o#+c$XVHFh`=!@j zo*HvwQ)Vvu@g?B6e2+_l%t^qF;_1Rn=4m?0&}y-Tq1s=CMhDpvy5vm~?!2gKO2 zw6SK~wz+Z9Zr3Nfy8mAv9O!=f<;6Mg`U66@)#vPmJahP8-TwOjzy7+4L~MU7_~4_6)GNtXPb8N-(p;I>62H0q&*c?cR_0va zBwWZIxBJhOn3wMgH*R*lwEB3w{ONR?lZUy_Czzg4do#-|F!u9<`<3-?=S4B!<(<@+ zW_jl5bhGeN*H<5{+0Cn{C{k<^pR()oEbT8p(kf1ER#AT#HiNa~ZH#GfS?^yR$Jeeu zlvN8QgLdnLeGlIg_iSt4&glvjcPHFm{_%Qtcb9+mi)`)4mrTa$(gN#suH4vd`KZ{_ z;Nkrji&eKux+^+8d9I(^@BBUJM3eX7h55=W_uZe7?Kb=VvG!W`BFQV6cM~7&dH1ON z-nO~RpKSS=xaa+6qq>Dgj@)7Iz2)jkt?gz;UvmsDZ{9LTW3Kll-u1ceb-Dd@rF*2` zPo5lIf8RVKvD#z9+h>K`f9}qnzb(zZ`q{>Q^O}1{&)Vl(Cp`DlSC7_>Q+mzh+dmeR#treo`U%&vzNd77;CN&3xU zAtJKr+U6rd+f7at#pld8S|+4BS>eq!ugpcA&YN2;zJ*W9-Tq}(B$wv1Bf25-K`(g@ zuj5FFTX$vG$@?B#-sc31JbINoeecv`v$g&=m~LOPc!K;)bL&0w`5rkIZ;n^}DVb#tnMtsBJvJ*|`qNb;HCaZ!BdF!@q7M?`QvX%D zfBwp1TjBWYkmwC6Oe>dma5B*;^y84G) z`s_bD?Z)r8Z6{{RMlUikxZ*Fsp3TfDx@PkUnWFw{$|bL4_5D7^zuj<{U*(HrTF*g= zWeywj^?Wx6Bs&>0z0URh@`!=s;9S;E=icY>tlOG!h~vrJ1GfX?nh)#_?4EnSFD^70`kAEs=k1NqNg_;3Wfi+C?Je8Fw5BR`U*NfYs$4~@+{aE@ zC!EcBmq19!1yj>~b(S+^cIiHky4&Gxt6QzsZhAlS1m~QE_0N9no%1l@@^n>&4hOdjlh@@WW=0B7H6$4UfQj-(Ef1j>9B>L8V}un!e6>_id)=66jNv-zR>r)V6=i(S7y=K@22Ux(Qf>Cj@aFl_F4}B zoF-+$Iik#;-9(ojQ#36zSoET%>eqA??x*qd1wKsAJ>EI{DiiCwFA{$}jCSX8bQDOqc`qa8b^X?_jIX`D{Opojb(5!C;I)=thb(49h^s9 z3)_S*$%V%}l1QolAE^83t>|l}d7m!l&g{z9jC#kJX=i`Oafaggx6l5n<=%I;nR4Gi zuiQF4@W8a#TRo|@sz14vwoZ<**dJE;r^{S4cEYmFOBXyd4=~QHG`1Bws^@gCIr-#) zC{cqQvc9#?=a@O~6PB8|aaFHE(~YvUbwVBnw^vJ+hvo{c7fXFP`&VT^d55mO-K~rJ z8ZtJPyzstTI%Vg3xr4bcH(cPYUbE!|OJ+$7+cYEH*+pVA_m@Q+RDWHYr7U}EE*=$}oN_*b$B4^W$k6?Rjys#4*!n-Ke@-!o z3cB~xF+uZV%8^ZP6gY3{-1qw*Sv2$AG3UJ85ry+k6-N`VQcwVH!efwZes6p`If^577Crx>64AG2ClDT+;ZuS*6a_)YyCH= zyjKpo{`#`goXe~EytkHKjL0Y~)e7>@4^PPQsXQRLNMgcdc2C-J5q8CMV$u|l%utdDu zp{6%2%ReFTu0YVrw2K@KL7qY(b1qJvk;3-wIOpHW2!Z?l>b9#L%`(rkdb!=Wws4xK z&Mb|ImwRtbe{P+Y{MY5^K3UNPpUs)V3yfPGLVWtM z(6>&Z?t+eO^Itvm=-Yp|Sohzwc?pwOE?@X0CM4=|`NqYzibrltp6eJPmSf@{MZ(_>$j&!4XJ zHu`w>iZ#)*mRx@^(<1Dd{fmtepRe`bJ#au*X6CxtjQrU#>K!b$=MHk6uTeFO+#{SG zdNxXw_o~kGx2rAIRD|&by}fFe|LgXl8*7!iYu%zxEh`QPXvn&v{&?EK#kai`&Y!7E zKD+lo{`9NsFYdo|PCeV&tM|B#!jX;hyGmK~@7vF|n4>tqOGA0VvI4upCp+gk&fdwb z%iO=n{ClBIRo&#udrBJ;rxl(lyQFJ4w@B3E+dhSN``_!HSl_-aleu}7cKhKP?h2+LrjVUWL(O?(d-nKv%;c_qyD{iY+AoiF5A5e3 zuJ3DBmS9YT>F0A@? z@X+=0=~K%$t`8DuXk}i+t|ZB{#{!<~Y-9?Ra=#cZbm-{!0tLGdx4+)yyV<^;_0E#p#;a!(?=ru5$tVA{ zIit$qZ;|iJs(4QdgxPb2o#vc$*vIg2>@Eqe5RHx;9UkVREipEAlHSb6O8AaHSif&| zT2{+M!!E~tRrAjuHu6%M`?aS1MvJ53`90+eOdgtF_`XkR+s&KO@_*l6{(UO4rm^ph z-gzNa|Hp0ZLC?ZtbSkf&Jr=k*QqS1;_4Ugl82vDV_z;orxPJg%H+cGxt{Lgy%R^w~ub zI~s1J$Lju7%Jt65_2$;Syr}<}*b9LiKMSpQH%sgdBob33>VkVp_wxTXnh-xL##wGz z@N@Hg&*fZ&f!kQwH>9R)4mmHLpP^UuaB(>Q>uYtpIWBzgb-rhQFG`2?_9@w{HEM7E zewQlk5d5#P?U!e=Y*3DDafa%g+PUeB(;ZhDsP|>=7x?7fW6IZ8dc>*IwI_4-s=UIJ zlKOcomL}{-=P#JGKbiT{X|C2Fej%~Po~Ivb8%nT;pvKK}jB6{@9!7CRmH3=DCLWUjh;ZBfhZ zy4RQa6r{b@9Vp%Mj`G%DHB0jTP%_rup-6|9-Z5$By>WiW%H2s`eIa(Ou`KG<{n- zN#nyzG1rBQuCt{5-|)cTqUOb@b6)2?o%h|k)+&?f61nmWTP16qs)o&{JgcJMWRDMS z!ZxmLrx|viY1NzNRA(~p*&)G?r>16z%zEMS`0s*+=b~;+(`TuOdA`zqa`N2w6B554 zV&48w_5Gnq&B~iY`9F0@wyX62NjR+d&?7-yrC-I0M{L=rz(=LQw~v;tZcWzy-y*wX zuK%9q2D7~jV=pByZC0KAp;%Es;+v%h>x2J=w`crq{iAXG%l!DO4<}_^;R%*HbI>gP zrc{EkIg9-N&Ut-bj<{|A;}UNhbZ_F5Ah$PvR?EHHa@4ls>fcMTZztcqyzRy1r$;8q ze&lL?`*3FIrOqHtRY&$1H_L<9f|mV0Z@lvA=_9e56=rcxw6xyXdTKI1&#Vb6Y`AWp zF9~7&!y}%=v%To4;oOs_caXqPUSgo(3vR(qY;@v_WVV&>W%`GM6&M{0Kc za$h;=DbLnZ%llouW~^O(nXTtpRYTJE#Fro_Hk87rrG*yL=c9lvw-{GZxowrf0VfAt<(_kdqJ z*jl&w%CCIBCG)b4AM8CS%=>!xm#h=)pEud9`n0mPUjlC%zb$(;-nuPYGqZ#v$Z!<6Y<;pX=;Mb&$bBkX@Hm`Pa z?z7Lbm;LzS@0U!?-LDVstX{WXy5!uR02^T^wZA`aO?)b`_1UviEuv?BI3M^r<-3}@ z-@RSw0y97F6gw1<`1a)^(GzyUkDW~4J^B6ow~TM|9&*|sg4S4ru@{Cn~`U8(w^FLoYdH42HORp9l z-LUJ2_&Oghy@fY)7VEw%y=eVzAKR@m_7i!nBI_?7I~`edzjnvVzZ6$z_}|X_Y9GErs82WUTKu(1v;Mr=pYzsl693VVm7T{$>{%)+b0n{71#bJYt?y}# z-RA|7lMZL?x|4s}&Z7Qc`8uB!-GFUl4T>d9E)7@)2sF4!I#GC+uM(`-u}BpS?KTm#&zN=Oq_I|t(T8by;Yn1v}j?e z+~KqPeh6x)2V7THYb{o5xy;6-^!@xs-{*?k9_`9uWO`jY-; z7+BwZz56nAY(L9sg{*b4Ebn8l zEA07IbH1%;%f#7R#kuyFoc!=Vo`He$|F`Y+ySKOR-u8Oy#_(Tjm#dz8b}QK8Q`hB$ z?)2?XXYSf@xoXYv&#Nz6@4H>SclED*%DZDEEq8U7PqNTYe7vLnvv522(+!8)A~$c_ zKmGUNz@cJ-F$AC>uv8C)xR&R?`gE%8veR7;{TSG@7&D4Eu>qcEqbfg|2^01Wo}HazP$h6 zZ0+4Sr~fRK-?!^M%WnBU_1-%dNJlMsZhL=z%>(xR_qqSy-~Z=E{l2Bne>Em&e%jZ# zILYZ=<3ZUUj`}+sC!R}6(ao7uRgu5;(#PU|7xVW$`)>Vn{(jFYyBC*ZcRe?DyU(Kd zg-KC>>A<%pksHt49!^f_vMOV=2t8x!u;k$(SA~O(?EGRn850&dwDa=XO_7-R$faA< zFz(8Xe-j_O^~*XcK@M9~Qg;ejS)g!ws&3-GlpQP+`F%P%6c%osobDgRBzYlXQaaCC z>(q+3Oq0KyoD{K9=}phZ$=+8uOfr64*){d`In|hHEu!5jeBx#v9UmMdKP%mC;YmIe z^CRHh?VSZLgVyX0&%eK?{v+Ey>l=9w_sR=4=TwI;^FE#@?X2fXU|K)PqVUSn2<5;JB z_`EqkZ#_JB-)_3xT&tp^*M*n&?D=b0ev(=9zR4nE;~N{?DsCxm>At=;c6-2Tu~#$2 zrb|RFKC^u9{n!6;Teh8bTD`sT+Jn=U$0EEmt=~w*TsX+4=<{X?r{* zmJq-3txpWS>RNRg8;{7;DfI6bP2b$hA(EiNw8o<3@ga6e&n)ky`}&xB4EEKS=q&M-z7_-_DtKGktQ2SyV>nlI$x1e|e@{&0YEC!Y2OR zUd)pfUfh1!7gzDIdAd;*r?Tm!o)4`El5_IHJ}Zuemu}3| zRcevtaKDqWMI<<6bLh7S<>k7&qc)$ki+;Q1CflvIITQPSXMC9UFKdAj=cK6j{qxJD zQdCy06L`Iw|JE=2q{}*IqB5uZTAc5Y50@x9{!cUi#;ygDbF4FWMt?P1zMC;4^ZiBN zu*6Q2RUCVEd*7Gn@L9`!`mJ`;dl!K>EO(E^e800^`PO%t-g_~{OW3zo`&{(&k4rhQ znyp7sDeC#7uim+K#hmhNHa(Z+j)!f^J+|Ne#_x{@uh)I=eIOV2mnYViBVTVye|^@0 z;Qbpuytse=*FrCS*$steGgU1a-TE4)R^MRYwb=Q&)un>>NzBJlt zxzJ%=ZHGNG``%g{+RfS*&|>rJF6Z0hmZDjD$!-cv0)LK5uQ@Y;P2+GEZ{`eVsapc= zHft90ZFtVCaHpeVkKrQzqy{nNPikz2U&0S?9cT8DHEeTQ@^6u7C&yu>q`>ajC%xi3 zf4Ca9P3%c9c`R{0!p&q|U~jI^VzKoS$8}Fl>?=O=NaE&?V>X*Uc2#XrmSql;RF+w# zK4U_Q3e!Y(=Sn4kZkrT21xZg&txFT;9cWSKi}dtKSQL2RR8M_}gNJ|Lq$x{Ho@xfp z^a@>fDY{JCQ#6R(+wg!;>6R_2I)#?rv0W;q>M~IxHIm@N7LS@dGn_cnr-kK{+Qgt> z*4gZ5xw;&AG8Zf}T^)HgBg|N7g?FFPK}o;DzR7c*ny6o#(aCX}<)OBtgx_a7w+SXY zjAyOb{mf)fIV&mQ#mfl?0^627TqOUpa}NYGult>Ja<% zRe1mA(2Z54YvOfZhedN;-mP>IgXg^B*|7G`OB>&GXG5JvHUU>H@s2LrvZU5|D}}w>~{puze^6c zZ?b)#uln&#`t4O=+uQtiT~!ToG#9;fl_`I>Wohn%C@0^KX8aZYi=$p0>pq*cEN|fr zmi0DkZ(huPcX{%P&q$^!w7Eku9?0DOLT_itC;bqM`hrFBKTn8r| zGg+6~E9jIQ_vq8HP>oJ^_D6w=#f&G|HH#*=7Nsa9Pd~}1yJ^zGIVqavH&3_(8#(Pc z%BGtic{=~Yr|I`Mu<7;hJe~0Elf&@dT2$}Gv|EaTXQ^@UcuxtK+hxJQ)~Ry%_Ku%f!pTzyLdz34AD%%B-ws9@w>C%#@X*$byUU0@&@k(g?|nE8UD%J zGdz%f@VvdX^K0~Z9{%-+r*_WS>z zdnzs`CzqKnC7LQPJXb(iSXf$q_PLx{^JdMQmpAL5eZ$N9%OY<%RaUyX{#<#~RaI4Z zduV8=={vX5duh75YyV%o7IAZG>gCCgFGat&d;9wJaG4+TzvO=V`u#h9h#TKE6&}+i z{M(=PZkgWy&8+u-KWD-&O@R|UEdQ3jJn;V`?;kVPy5-FK_b->$PMf{@`LhP@vu96h zYtNoN`}XW?>(`g9t*v+O-d$Z?{rmTC_GDIecJ}u6cK6^^_ikPH*Us+l?#KT>ev-27 zUCO?PDcqn_mv-H%uBxiqcBO3Fox*LG%F1eL%F4<>2QL*C?z~sM^J4wZoAo=*%PT7@ zOZU|7wXND~U01uOu(q~(vw2~0LBVeO;%bBPYLoKn^5Sxf`tm&$^}EXIOY7?E%j@g^ z7i{}iuKe$;gu05UPE^+-!lk7{dW3hBb@~ISdS97gYA{WZL$V z_r@Dm292B@ezUJ6BxEN3{F%5~;ddM3M0>_Re;7>GgmYvIGnjpwpD*^|ed>Y#yS`m} zYP(j1t8TIL*F&F}!xR~3F)+w79N=fD*~jGP`)_~ngGB}jm6hLrOYhk(?)GivYYzc7 zsZ}d-%CDaKB`v*MTx=VE_KSm6oU*^A#kPI_zuxZb|0ng4387^>OEggm>Q$^B$eNlE+OrQm9uo zc&3cs^VyGkmm2T<)A*rcl5c8p>!Z#PD`DTK+)F>T%C=X2o-uRktKMnR!e^&yZ~fIQ zSP`Tfn%(=1ThwZ@?p5iv-`It32CX%Xp8JmfdGzENSG-SVSrq)Zl>4o^Rx!iER`};v z_Qi!qf-En+<#nH&c_!@kfp5nq&$L|)7S~3s!IkedCnIBTlzW7GttIM%(`PDbK2JPH*SJq#Ab#IvU<-2qB&3891IALF8 z8=KF+oO^1Ov8|0?RWiH5o06J6@$VnYW!;^Zy7zxCV~x*wexY4Dr@5!C$uVb`__oAc zz;#NJK1Zym_H4ORUrLU@H$OJRQR9mxj~HL$@*Rm53m5;3WAQ!xvQFhN$5BTS?qG>T zmI}WcjvUXoTCch2zV~3n9D_F3z&%oNm4QrWKD|s_v`6D<;G|8jA_ezOS=mz9^r0vq zaE_mQtl-{-x~YwG>jQrlwv{%wdo6Q4u2-=v_-It%rr(7>J^Q|YmaHuCmrspcRyx(i zGfZM;O60!e?&Fzk^*qNjC)SI{Xf_odjfyN2KhLS97UVZTyneIgrl{8vh|SlubUWp_3MTIAD7JNs;}QSGhye(suzhVW)*XqkF2bk z!@A?3aaqFO!-=w?T&@*SN>fg+i%SZbkrj6(^zZ8d&FzKkUzNAtVJ~&g zlnI;6JTc~4QC8-C|L&mL%`cg~YR{gpy|C=&<<)lUSk7l_C7;n}F18K%uq$qzeO^`m zguNdRDX!beccr@ZJs;Glub$;x_wp{*UGt&A&2t!nLR-^;|vX`MVcd z=Kp>DpxD0Ou-dXa?~Vcg$9*<;HMYe*+H;?aDe>qL_JH8Ll_xHI-mKz(Ffes(kC=5a zU$p_7qHJofXv-J>ImdsjIu|S(izbi{nho_ImvOB?3J!S{+uIgW1c1QiX>Cp??-ac9)CQD38Ctg~)w7YoEz2)B& zXBk})V&pXxn*4gH_l%&8s$Vw9U8?px5mBVMT<3#y@buk2H?vN6`q;`FmGAvLBl^GB z=A))*a~&qt=6(0wU1pPVzvN)?{6BM7irAm3WM%ZOj6arMb6>uQ(IfSb!SjrH`)6-@ zzwWM4o%YvQsWM)t@EVOwGK1@AQ$QD$j+D7{2?#Eq`Wds{3!m3miAtmvM+_s@x1Pn=c7x$EqwcAgH=SmviQt-x;T zY4>oA>0YZsc&>!4@DE+F%}?iQgHpD|VPX4~U%IwQrTql07EkUQu3I{SKkm(t@O4zh0$lskUX4 z8^@{JqUTj@15CrRIHG>vKA)RxWZJiK^6A;in!cL@!i#oV%zC*>SJvj@wo6~-qr4}r ze7oCY>$}B4yDH~s=f3tf`!+F#Tii6~Zg$1CylU~=-(Tz7t`FX7W-M>+>8!aiTSI4?t0yn8CJDhKE6#?`@U~?TDAE%-&&O|Th47>y-UIHW$hK8 zHCZJ*Z2ncVj!sS8UdI;qTZ3QbaPyq&f_*Q4&8VNZYroso-7}-InEqXq5Heif_b}(W z`Vywzk8xq_j$6z=9-VL1@kCB|`%&JH^3v@karu+;gRk~2?Kti;GylMrct3^XA6F!A zJGWgkU-a1;;g`badbb-LpLcAI_yWoIp1*tKi-P0cKksBX_d6$|tJdz;m6aOP(|_x_ zI0)`MGjqwc-!->Nf;oR*nYrfrZzs8;;+Zqf>`Z$0J85Q4aqF!sJF}ku4vO_Do;veP z>$79Oik9RD_uigz^-1AzFZm+xyTNU%?p=7K)!eaqOVItLn%9rtTC>JJtntj$oiWdU zt$JBpy!hPI-pj{+o!gon{qyQn=IZCq3cIr1^R}$L+~2SJf8HrI=5x~Bo?;sJ<~M%X z9-U#wKl90gm(%4mF8G?IT<2?s&R3i- zGrp7mZYW^AsVHXEH$}^zv*-BqCkL(mX6Kx__+sn1UQSc-CEsqupW)iC@Z;(dWwA>Q zHw)^P+H5|n9Cz*e#fn{reYEBW?VS4Q=k#3{*09|XKKK95rcWh5^`q2l^xqu_e3E?F zUVi$FjZY1BF$#9ft`onsQH-IWAz;_~ zNj7x`v#R7R1f35w`SoXKUA{imL-YGFu}#s<*Udh}ZGU=&t)6k`dx1sE-xo);<}nt` z=9P9icXzEa_sxxs`~_Zrt)5@}s@0*w^5xA3kLa(e0ZzXTGAHZ}H+|8s@w-UP`K-g| zqdVW7T)dlMR`mb*?-Up$nrwfVivFHHrDkn<+KcbWKhHcrd8*gb<>9rnM+_aJqy&C- zEC{#ye8`yd-~^6{JFJGzmC~oG-?l|DKiSJz$Z<-ep);gkOM*9%O(UeV{F;@oXHkQ& z8bi(X)yK}1C*6#{asGa%3aC%>>K$uMez*58JyO$k zYSlYwt5>IQr=2~VgcV(mnPn099Pc=bEYjXxP181kxcGILdERgFPAs{bT{Ji3t^wTjoY!9+iy2F zqdE7|)}<<+y0oT=rNpMat?%OE(%}}W;_WFiH}c)OFY$X)31jk{=FKx(dD=o(6@L~I zDn7T2qfn$dCFH}eGVa92Psgfxbz_`z(>dfgznV3avYq&S+1RaY2dnWWrdu}{5B(B2 zR5`KXwg5v|$en@|e)a=1WeqNHH8(OPhO(cn;6B&EbkJ5h)RA#6OZPM(F+Pv(cZ?a| zuDE)yZIhiP{jB>Y=Q=i{6%B?4N+RzL-8$A9zHZUBuAQsfT#Y8M8EZLY9CF*>RJnIY z`-=m|z8E+h-1<{7(B;sYMM`^E8#NYe3{$=-@u>QkPsWuy7ychJ?`GZ5?|Si!Q{~g2 z9#@kAqlp`Ly07pMQ?&o*rZm&J;eOkc-A9hw zs=m(nv42a`!xzrWt{!}GW?95jMv1qJcivx=m|*%tb25X>%8>NVJfY5<{FQ8)ZB4KI zI5&7@Y+j+u(Bf75)R zqX6ZVg(U_IOZQnw9rHN*A;OFyp~;DJwvmXl?&Osgn|uxhPLWrLVox@m{b(vXV=vRz zNAsTXv3ncBG1Cq8tjSbK(f_PcLBku&K; za!4b?`qOg+c(3m4-E^wCVGVPz;pt?Fb7gt${mN%8TRtD2MPFzV+TVdhi zxAb6Pfmp2vYpnrW^^5rTh5KHAV5qBTu#<7vufub1{onG)1!<8hQdd^Hg+5-du&U2M zg{h^8>4#7CjvW>^7T8II?{`}F_0ZW)r@}Xjc6?5Fc$+8G;=R|K3-i-CcH|eHc6aSa z-s$z+a_i&1Rr8MieCXx3_Gr137bnkyN#8DT{t`6azgpa6b-2+gMw!yjldhf?yqYW; zsxebaTZ(V{46lyT51(fhY%JWsSa;Qr$J6v}YWuX49|Yr4!s6CcJ~b0LcR^@DL&<52 znO|%kU+v<(bSuA`tI((1pg+S*FunP5$+onN8x|hLQ>;S!tKOWeveBMl&r$biZoz)_ z*B|X))n%Ewvx#rm(x!ODG4q(?%G=H>g&a=acRIy%Df({I0h=xj>u5fUYy*qGb<=-- zPhe9C+mRmWw8M2xMb@~r7aR( zTQ#Chmq)Cu4%!(Ou+zOojNNA&b9mDyyIaC1Yd6Iomb8!RJZdG;{IKKgL4Dh~#yf3- zwpv|Xae0}_cmE4??XeZ}q_d*?)3?RJWMecfaio4R$n@ouex zUB4XSVzsZ_O_tYk9yOmp6j=?s!y$2Z%I|2RqlJET=_LQ z^LOOL7vz}R?XoxDa@%U^kI!#^aQr@S^Y?*0zZY!&wP4q;ebcHZF1}JV|98O7-?!&g zUEKS7>8WcR_tQSFk^pV$1YL8K63|qJxs|l7e?`)DZZQs4_z2IV;C(HWpn9;=T zGow%RUgMnehHVj};Z~7N$GmnQi`k{7wrUIe+O64Z+~XE5o#W{xU`~ks@Mbd z-glpuKjYEk6p-2#DW}*e&v%MVsw(TtaorR(demTE-rR{?h(K~mZJ`LIM#phbu zotfWd)}8a2vDGtU#n)(&58B)&_B%zKn#{e=nB4X;n0cf1LR5Q#BFlC0|ty#qzBc4o+Oc5yfvaM)V0qeBzv#Wn)oIKs4@r%dlQ_t)x ziZkx$NyhXRmFO?HtoP}%9@ht*f48Kj&xjIRALnK@d-sL7#LyWDI`cZ6OvI0G?Tw7P zSt+-Aoz&W+bG=?Uzc|yJcCa~ZYh=T%R-?CZ`!>uIUO0F2ov3I3qWqS{Do%*>{2Uql zJnksh-0$VG+itr&?K9H<7%89mQnp=+f1gvsl$j>e+VkEzXKcKg@s;`hs#$fvcVFVM zzMH=Hh16cPO`#A;xv(&q2Ycf7fn|5o_X`~9i11<%gxiF%(lLuQZtJ9}l> z3Ay~7kKS|q&MN#WGcE4icZ(ha1E{qA|3>z?4xoO0cAQvco?!e=P&AW_o*kZw#9h~ zAHAcq^;^32g>NoboKXMuX$D`zl=f}?vlr^U`sm-hY@0~U#ea1!ef)Yd z^88n~GjemC+b2k}EIz#B!5hEOGjnF}+-iJN8q2%m{g>wRUk|U|dU)$vp=kO?>xw?c2GXcQ=Q;v(Emod+EL6@^i}$`)Hp2Bpmpr zd)=M(>32hgHGcFi`gWG3!e9GC){^FP(GMnF+nMe}1$6Bc zx>391hh5>3yN}{_P2K%dV_LQTwB6NLf3v;175;a}s*Tl50$oZ>3=a$>UOeJyX*$SJ zvFF;m%`8lU8$49Et9@$yvwua~9Qp9)97i5^F3oAR72uxsaqUIPZ>Q8%Jj(@V zuuL;_(Yt(NQ)Dqi9=~?(gUve*=@*KN1x@_)_2Fa9xofU``OT!T@A82u*-v*Zww>W* zciXR5eNyJd4+TwYt}inRTjzLa(v0aspG|^9uRVOPCe}Ii?rE!gQs=K#z2bUpm|85> z{WNyT`CXFoqFpmxn1s(g{VtQ$9r`isPDStAX%}TGxRp0$pZ{ik>FGWLh4tdQe>Zw< zk)OFMe%^WUGkJ>lrA(u8`O_EZt({*RVc|A^V|hW~t95S=&S?HHJ7A^Ny2sTCheZTU zmI|s&p3=m~+sxBk=@WBhi#^kCjoBA2uUXdR&n0kbc7MstIzDwzeV+oQnG2)K>@3V@ zJ!d^6-m|r>Cnuy|j9*qESk8mnl;^nWg)38JmQ)!2wbf3Vr+j#sPLjx>h2l%nkNG6Now4dTI$neHMkB< z;=k?vGg|-N6yu)DX96DH`lwNu5mI%0$^>o2otsv1yx8F*p&CAaW3K?~=CW6jIyVJh ziG_P?i!94C=o4G(yeZq-#r>{^*ZfNVQ=4M#Jx+Ywb$4-K!_B};Cz`AOq%;a1G_H&h zR^&~QHfXQZoB#X=q)7X>!@rhy z2QIo(7@7QF-j?eA&sQHD3VZi&I*Yx9kGff!{hvqO^YZmHZtav~WKaBhpr(Cik#Xx( zk7=r!-*+8aae?K~V}*bEM%z+Llbe=5O*#7MwdLw7Wye*sZEl~cIo0<3cFC?@`RTd0 z-CYVpwe!XM7U|-0Qho@SJ3)75_S| zB}vBfh(uK{t5}Q z4nMszSLgi4E8DO9VhN}}y8qs@M_&$jaMW+@uK%;Ed$WvHgMr}l$NBBMmVWr}=KM=uOm?Z7Uh8LXcs}W& zZ1@S@U$avbq9=Vjee=WJ%d)-O)9q^2PE1+)Bj?JGd-GxxPcuk_7;qlwc3AUD7t-Cv|X}`^Mmclyi6|Cof6>C2KcjC*0?!s7|Kg_9y2Pf#TX-mpKDy*NB zy|O_;Ge06{RlVD<=Vk?8*G-ypnb}tLK&e%*u-TTl$k**G+maZM1O3F&bQIH#8-F7On^^t^~=4bIxkj!>bbpZ!*VBCKW5vaJjS`z{lUpj zr8^IvdA;fHm7t4kv$kB@EHUYxsl1d;M1$kpYy84u3-#LbF6zv=>SKE;^lqrg)(r<{ zylGw+oc(*}Qqka)so%An4K0@hUf*B)*mZl6;+yTOEPn;J8q9a$x?p6t;ql31TXzO8 zZ}4g@-`cU{^@N_i2dw1}Z@nC}|J|PG(w{q1o2*|S=MtUx;*;0;(;Mc#4_+?!qH^hX z=~MUkS9$MY%iOB}$k6HclFYNWwwzh|>aa_x^XlW#0aq0q)t@VL)xN){mivK!i*rQr z0|}RwU5ln|Tywf@*DZb%jrDi=?`jCYt__fnSjE}*X<7N#g%;U$wTkaI=EiLOV0Wx! z5&P|;t19hN1SO9Yq|ZKamp@HGyiViSj0YagFSb|DSFfvbw^IszpdfC@7ya8q;ZRsZ z@M6GfWe-jr<5E%9*;^kIw);R)a^c;3h6#sP zB*@#{ysF6kJJ@V@|=2ZT{tI?(Wq_ zLF-rb>|o&?}^-xKbjXv&9i*Vzw6)17xtOU>-=xZF6r&t zzbl_B)wcY)&itrVPLCgdJ;C>IVa2qr8dvtB%Y2WcZa?=-n_rkHxGrFt!uizQ)8gNK zJ6a$8KV|KvzC}5f4PMo!gCwJlOyS+wc3hgxU`bQeR_SKtZCx{K-#-qmY?F9Vn#SlXhMv24c6HEXRif2FwN~zdKpq~u-Tv4==N>XnVKsrV`o;Eyi3}4rLtczDqA~x#`#++7dy@= z@6>+#GgfYgVuJ*GhQ&sgyNd;MxjQ#Z<1iExml3Y^z0-AO`-3&p3vJ$|Pi!ik5&L(h zlf5PHIYa4hKMOK<)awd}Mw{9hJhqW|>S(&rXWw_(b6a(|HeSzP;$vNq`{aLaxzGzO z=EBk^%fBtJ5m*RwH7wy#Au4R@Q9y%dw9Rq>78|_ciJA_uP&mT zzvkZ4BeGTkZ`=XS$mNVt`+wfRWA}P% z9X%`_d96wBd9LWE!nxT*+Ot5Ldq-7w+%eB5?45r)S8Zav#>uXFyE>TX@4Hn^XF7hT ztZ+H5)jEeqX=Z|($c6xsDm!ii~ssDY)RNr`bo#OL~y7~T?^YmlREPjib z*FXBjHplyk-t0V`l}dAdJKFUg-4}NAzn1HD4vQ(;$7Y+%{>as6azltS_7aEv?y@~D zRs5>y7gAT&`)3Jt-E*5XGi@us?y*$1Z`!fjp4V)7ZqoNaYjSuj*9rDQPF1gbiSSYx zrfkKXt%A!RDlGfn^7KT9y2a*OY2oc(8$F`L6gr7`wM;oU2Zw(@h& zF;7waEd1}>j@)beZ<`-I{OoxCZnfP4PZK`66=$Z&%}#s2v61D_huUk8?P9+^^ey^X zYrJpjU4e4r+59!)=S;VryE@(ZQU5#VfF+MbXHTllP<=SfG&1s2<=f3a+)F#|IzR4v zY;(xyb@E2R-5c+h{+Ri5Z*1@0fa;K*euX#HEB;h`N@v324Avbl zoAK|7+%xth?kN3ZRocIeFCC~i*<-mqA(eS&zu4w-@h#IrxZY3UZ`R^moxVY{{r0Cq zId-E^zQQZBj?CPxd~Npxjz81RPM)sYHC=c1^tEl%*G`|7+czzD{{RRNt92AYD3nj$m&b+R7(R4lmA+_0GGZfT6wr>&2*cq&#~ ztywL)gJX%-t0fn+w7zSfxvKs1nee;WKju01l>bdScxbbYOKsgvNk*-uiu)}U_Nk?| zrwX#EJ#0>$G>dzZiwCE~CBNqx+gP94hBjO}=+Igmxw+se!-lP%Kex81&vd!=Ymc^& zUD(+-8oec9cfL1B+P<_Zoq10!ap@$*-V(jOucxnmJi1dtVUx_CT??P=`aj!kep|u8 z<6Hi_m7lwkvG|nRzpFDcrh3(d9QN7&Ec-y#v&&8|Ca#f`GjiMLR2q8o{mPRUdUhVv zoyT&`eyWM&)E82ztbs|z_DNe_hIksg)fKj@oakqDU)z{}z++9W^hG}R^G(M-nyL34 z+wHkc;O}*-+1?x}NA7Jh>7KguOz%>WxoV47Pt9DoC4Xvr80+@5zF*rFO249 zNmDodyc)*a@>jK7Zg26o>}ivO_x$rPuaEeCHkF;-zvf-Is>Is1itTSyt~|@Scuw!0 z)VE1;la7W(gqL2p{VnE#MB3+D8$V6?_Wqe`yJp0eZH8f+Ow;Eo$oxy6x+izO?8bMU zlT-G#zL9+)_|rQ*cf(swk;uQv@@q?dn}b)a67;wFplv%ReQ*6=t_c@}r`u$QUuEMx zDg9@S!b82Y=km=kdKrJ} zC;LU>%T|}SOyO5p#(Ti|%b|0o{GP{eOx$hp!TR4UsRdtTSjx{H{wZc|H97d!DXyO< zxcG~0eL47;p8Q>1wrw*Hli)A5scE-AnpOB@lymb(O#dmeZEK-y?~jU7EwklrePsvw zdMm0X6i#RfG3--tWIMH|P1lJ1kM3=E5BHz%eo2|lda`WeiBp!%p2@LR?KW?lUdI$? zD0L()xpMcCwD-vff4iL9desM2ez#n(+Ht|E>O7nL$?A$tvlky`y6u$q?KTtlnzTA5 zle|TT{>f=P#yj&SaP)=y=WTjs9DP$-NFscq20w)b%`!36-x2@0w_M zK5A3KudM-XYYj`!DC!DKei!Au_vx2QQ6-=2w#Zy^nii(*c=eUgw+h|J`vp?>*xtRr z$-J(xr!Ms@!};3_gtDg;m9OgRdUtesU*RFEYb_P|-;*AHOPc)dsE2n5cUzq1zRIR+ zk(tjdi@xouxvr=5t>|~Wpt7i7!1g1bo*(tvl9kMJJ8s#(Q;hw zy!z{_kz~fkvs?QO?sqA@c*7C2aJJaJ-4S1oZ(hp0XsP_XrF#8GSFC=k)>}Ax<C2S=~PP@#8b$o4JkmpSHi68JpmL^YeL5o`dH!vsrIVTRpFo z;rrE}Z+WG@2v%_hZOmmhzN_0c^X{|Fr`~S(+7-6{-xc2VXSVXp6#Q~I%JH1sHt9z% zf6vTn{&HTlJ?8Icll#&|aqZV8cBkcS^OavUTr$dq%|ccLMC77_~gpYv;IlP*N2a?n${ir*mB)2=2zInj8!u4 z=cRhp{|vbQ+M-6>VN65rz1_B~39TpE8^ zXt8wgW&dTGD`#F#-*0~YmCt;|d2h839GKkxp|3`kYua=<@3`RPT;uYmJ1@Rh&A+oW zT&s0Do6EX$D>LpVL=-z;u}Nx*&)gh;`Ndn^r+m&4-Nqp@OT0L(T0?%NU#_lP|2gbi zMDRy0KeuBI+g)qBS7yz#cfVWHeQjUJ&m6bpWzjp*mKTQT7d|_AB&%3eJawn}H2Yot zc2#k9Rf%@LpIlK&oc1F;XXcD@9kHu2D^;wD)vHtD_Ql@c(sW|{@FNNtYoh^d+$NoyrQ7E4adI+Z+v`7Z~nyz^2yrU_fIgN z9`;D+vyF+xMIS2*CC^^q`@1Br)OcijK)WG}>N@Jsf>zLvfj-`p347+Ukz zfs}<*ltiASW`^=g8e#x8fzWP+NbN{Z2h41?h z{r|l$a$U-vsQ2wBTk8&Z8P5~-_;=Q6YDij8i)3CsZ;Z5{#$4wfwQhfY zTD5xe9P|FIZxSXWP*K)M0lzOZ?#ccV!brW)4 z&nTGcGrRcE6`!|?Q6GKJI)?Ev+o$gl-kXqf+U(GUnF*$AHYoRt?kTv$Q|df@T7r+w z#{(&wO@Chg^`~UwX>+we-3xE^C&@-V_C6|j>zwxA*>c`h8vJX5Q|V2ktWO zigTTJaf^!ojNJdB*KI8P8dUT|q~3jCFTUEb?C<%8Pg6|fIW2VSh4@!IRbdW2UvZmp zL+~7zom2XHS-QU}ceix)m9NseZu_Rz@=+!Kt65)@ZulhM`d)tc&Xz|ZCF`3cnjP1C z?3?V7fADu(@U3;H8$5TNI~?s`xyIQ#*Xi9x?xlrQeVaX3%F8Va{ov`S9{XJMi&1IX zgRAe)y!rO^O!vB2{)b-W@8^hr`n6j5YjD6~&NWAMbxo>2`z>r+Eb_3vKXHYWdG6f6 zQQB5i}%>Y*pn6uw$$DV zD_<-dS@vvi*~z%q|1(|~IX+N2_j_mA@9!r1BFw&$mK`<3-;`hFT0{E zvDum-?w-FuuQ@;48gG5;cRRjvXGJYgNnA7Mx41CFPQ5ANQPr6_OCAQv9Tl89n`3It z(#k2*3?D2AdYgM<3x6g{V7#QxfA>;{PvN^ZUb0`ulaiD8?L@etbNAPlBW+6(!#tzd z`B!O7xg}=vqtY#Zi(b;7k~MWd-gYw_-t+d>rt7!dBv*K3=SR3$s~;*A7(=^vfqlJ-B_!8CpIcDq}#Hv~TZjPbeT{7|}0>hhI}slrmqoRVpWBHq58 zy71mJw+Gn=PWVN%I+Px66T2GKJDDLg%XWLFXwA$gCq8U(zW9uB=LzWvvp=UhoK!62 z@?Fic+d1~r(#tp0@80*!^io-zk?Sht7V=Uyxn+x>RMMrXn?=$W9h;MB;M`QgS!L{- z_P#>q()3MVQhrLfnpV#GxN6cCxhH(Ci*}u@So-$@&ov3v@C@h259NdcH_mgreXnHF z#!kh^#b1vpDXqNx_itz)XY(x{skuC6Zf7r+YjBL!xqTspzb3ueyHsw=HqPp;Rf(6+7hgX9 zOMc&Xry3O_m1hobx+WbL^|HFORA5h%h-_z<==291uH8CXe_Nk$e*5g^t~<{={Abxr z6BT#)&*y$BchifBCB7=7WsylG2mDmEQ_EI6>R!z1a2SIWJYZ7I0&?1ANuzNMT0u;oj)9a!hBvqdc?TVuWQ`4pZlP9~S`XPq_4_clttZn1`{fxi*u$Ins zqd>dsk5?{vn{@18`a~6M{*%N%+iLYa+Pe=Rg{R=|Pc|EM} zgMR0X}oiV=~LMy>nmYbA~WI-e%ev{o5$LyAbQnIgf@!Gzxzd!E0ss5|I>ZS98>uqVgt{uC(R<~_Q`dpbSD!R@{d2Xj z{CCVRXRi>s$9gvRT_Yr84t?f}p1!;Lc!#~!^RD{~rt=xhS8qP@HTKYzT@t&$f4R9~ zLeRXNE}ngY)hEo)^nLoe>E!GV(WN!-7KMtha}JB0_f2yCMEjawugZUj@UD7yE-l#D zZn=|q^T~UU-KWh}()B$h=VK#kz3)!D^}c+q6lG)Gy*Ag=IIrJ4GFN?L#VPf&)2;Pw zsUku1wS+D9@=Yu;lhbsmJtw@~Q+i3!eP$+G{m!R-T4kGp*6co`J~wc?wc+*X$9=C- zn*}rY4Z_VlrfIZozBo@cIa+V(jp;8qC$pEDK6kX}dV62ZI_&Sw(=8hAT0aCC&gu%^ zeEekYf?rqIq*n6gwd~g1n)dd@hPDvBtC2Xp@%)3>){G{Pe%muFf1j3FT&+0tX3Nw)6?^>}7ye1O z+4N<`zdbXG|MjHx-?g;=D>n6mk+f3Lb*7?trLGA~T=ygkj7p_*7R_?~+V$tp<1(3r zdOOb>`lj^EkQcPNc8I0qIBUsumoJ718vQOj7g~8v9O;p0?RmidhX`$!p5CK z3{QG@RPyhz?s)mmUE*Yqlo)sA3W19Gy%O*ED-Q5WKJcut;AWlC!?K>Y@&(^akkHF`JfTHATws znYvceN{c70=GO$&*ql{^j2i?$bh`4+f6yG{ChCx^e092-Y0Cm_fv)pPcimO975gUI zJ&Lza$uAYv8Y?G}}XR{(|oP{lBV}Z~cET z-Tu~^|I>v2t>0;SI3+K*TFL0y6s7LU;Dr;ElzokMHwl0LnSB1QbF)y<`<9@#9^v;A zMe|FI*Crdk=lWD{o94v3%uF_Ao~qjaEFb0rr}r%M{9}El#v!dPC*|Ot)PF9je5>3d zen>}Lw%7c3>~!;ki*pV8X6SZ&4LRv5&81+{%x1Ic>8r;_ReWpKo#jzJ(VTN~PvBYR z@0vF2PBST;VY%-gdhPVTyOXndW!%osKQ<}yNBr#8DH6xK=dn2i|7x7BE*YdE7n~6_ zZDDgN=YILNPt#5@bYEWJd3as-W)7|xEsZHPm$%n*J%~{c?d19YnfcwX$=%;49M_xv zv|!#%$!XD3r`%{fwn6SQ6Mn&$^gvTMM}Lx%&TVPGMXW2M4SHlgKGlwz^dseo=3-5eWh+;6X&gRl8gT7g z^D)kXq-FV`26h`BzRUdhapBj}9?sX^zqok3Q%1NM){ofeQ>%tSg$+V=QPX8$sbpC6|XpMsy!)0Q|hM9ZJ*UvxtdQ_Tygc%P%ipZ ztBEEg;^;`GczPAZ89_^mkK(~@2x zb@tXH=dv{{<-$&lVY9bkzuJBq z8Qou{Ax|8(bj?{kF?;szMb3u7EYinTUp|n%B=hjePg}nlH}9HwbJtIM)o1SRil*CL zrna8g+NgZBX`g9%$<~-3VQrUp-TJ}u+;ZEh<3u{TN z$}{lloAKg)fA78Q7xqzE_8ngHUGn7)u1~+V)z$l3-}WPyw>4zmy|_a%d+YUj2eV3M z%Y)ntUT>clRgkqZdY2W49h=8a=9}qJ-(Jp^yBc)#_frnf#H4^DUqp_+KeYe#bDfgX zP1~;NOczlt{jini|L=P@vg_}re|j{5^{Zp{8UOj7Q&g|CIveLM{1drxd&Unpwp#6| z?+3%aPu?Rpb>F;o?Z3PZ@}1QAxaZlM)v5Dm6?Qlau-na*aCCjG-S_YOHpL2U(+1{zoebV) zq)BILYh8Y;?IWzuk%TlnYZBBQE{F&0Vl?4(n`DVDDo%Q1W%%A@f0_v>4&b_q%aqRp%ky-N&E;#T) zYti+KORRt9XUP>>ZN6li6A`4h_+EE}=}9Tei@RTT?loA+t1N!`Xnk%?SrxPX#jT1bH*)-@*x1~^_$hS7|4haG8Bwgv+6enB{GcsHGMAWNcJO7xs=h`0CcK||g5 z+rnI?`78?H6OE%gr+IW5XF*oIx_neDO%r|+I@u#`PvYUC*0U$ZWZq7gog{Ca_HV z?<^Aq*^_r32Fufc-C$|wb=a6&`(@_ljD#!;pLVlrc3X7q*CZVOG-r9fpZl&=yBAM* z|8tGj1P7mkB5#f@jaHc%Y-q9jhjyNN&$n+=igy_8&-u3~{FAToidL`9i?=^trN5h{ z`e$K%d*q2-TQ2Wft1nTVU$xrssKw=#4@0=>y^WU6dlS!Hy;SdI!fHd?+m@TxSD%|! z$!Pa`#;3L|-0o}pcW!0>b&R*_-pklI-{v}QceAP#YpdA3{`>WX+kf8fvf6q3MT6HW z?b+WKZ{B?*`}30N)8{fA*wfy}d;j;e#;I)ER~D~NTsN&`{UVdzXp1+3dpPTV$$fuu zz3=y#X}fpY{SjLJ>&X2-wNl%&;%km2TP0OmZrlAX>iMcbZqI{B(`to3*yze$K72pz zrg_T-uh)Sb67n{_$)<)*TddtTZ&_6>dE4e(`(H1s-{+G3&wqZic6mmz@xLR*!fT`X z#bX|?maj0ga@~Q%}S1T9i&lTTys6{*#p-yQ~Sdvr;hZIxL1?l`H3=6MXqYp?e%JgrgTzH6HLz8mvb-8J0D zWclxy^S`dw}pA$Ui$Xp;kPCpUIWJe!NO+`^YHdX|LrUO`D(M>x$RbO`d7XQ zFSsQhBbvYA0{_|rUgn1a%xn4o7g^R`@$dMMtE&7ZeURv&d?dXap>DY2#(r zTjTL>Vj`D9l0%z_q>-!R#C;yiBz6Y*bQ$U=9-Cr0IqmEWhn#0uc1}+BpKsr|?}+4- zjKIb26V*a@P00*i>JZYyX=K{LwJL1ow3MAwv#+m<+I~wwdzxy*`t*xcy;3f(u58QM zES7S(jhVrJ-?L>JkrVUd_wPH#CiYs~XN^&6-d(ND+}HJt_T)|c`SC%1>gnl*>DOXz zD&N|x9J-C?uc$}n<>i6P!}iW9&Az@q@%S{`*=4!6w--LYws&@U{{8)p%j14etGKh} zc>ioyzM!8)&ttEL?X|K!ac^ho`)7A|-~1$TCgDKMPS$xfl?L_!1>yVW*?vElZr|;w z8Khsc+^YTF_5Jpl|LXqzXXFVuz{vSV-)ha0*<7oi&C8x}@X536fJ0LkHJ{d9wQN(L z-tG@c&g;MZ`Si|6glopaBkXAv46Gs{E*~4^9C`weeY^KrYu~gN(!JW#Ib^aFW;196 zcr5uNed&bqM4zCOvleK*bK;SoBjCijc*>=nT*7BIS?x4CbMEllG?Bt%h9`9{Z<5+? zq`8FS^=3h}#x$!JD`zyVS$R(N)k8prJ^V`ek&DmRx&$~+cZt~<2 zbSd!GmKE_`?`?QC1DZBJmdwRehsrO+!}f@vGt#*N#v})rI)X#FJ%32G2s5HO_$fD?I}CNywW?s zIcTf4@YT?hy5XC{(nBW)Uwp%TEpk~&?_~eD=e=eJlqQy5k4*l*=W=}7*QqPRQs3&{ zNLVa)*60$?^{dw&wp*_?2x)VFYH%mmRQo-9v89^u-A!>b0zmOQNzUAi-E{qert4_ZXuguPhw@m#d- z$`!q!@sq3rbTc`?wjza zU0u%BSYJta;j`1DBX9rbNpCt#suMnmlEVN%E{`o7YWzyTakep{2oRD*Z~= zZB~Ex`dZVY<>tO;C(oPyN!8<3y5fG`;tpf0Xa6~byVZ>@PwGDDSY>u;54)a7_u`g0 z|1?ZHj&ipdcHjHL!?9KEG~?3AbML=?;qLfq^FGzJ?MLtUT&uA>ahtU;^OyFb_ga(A zG=&ItolW5p$v@cLY-G?RG$+GZ`&DqCNr{rUWvcns$Yb3_TD{YEhkHC^4PDtbCGTKL zgy-YRi`8mD^Sl2<+o!6`IKcA7pfl1ZSx$K7Nt1QS7gl>{&-{GqLQiqn!HutDKh6r@ z`)=y`+OMzU8MUR?wXK@qqP=GIwp(Hfhd!?sm%hA1Kz-iPOrC`~s^YHqfBA;DZmyb~ zEhC^KeXFlAY|B#9x0!*nqxS76Ui#sPRyYgurX&0O=Ii99Ty_gtB)l}kRo6?fC*-!_ zj%_T9r&&Kv|F`p|+;+C|&?TwwiWf@9zD!bU-?CSWfAJRq=@Vv4-I*5|w7$4u;5&WK zJ_)^Rv#Rbam{hd$Rbk%DThVa>d&BpA-TJ=vbm-Oha$-q0=N_tO+;Dew>eRC4rMd4q zI-~!r`nIRYRL?>&Xy%W+wtdO7J~SBzC-UUaI4t|ETW|NN(?5TTA7GkyFK6wkh`O$D zw+UYh9!s6MDX^-1%E?^*%<8TyxoRSt_4oC()ykwO`cL0_@X7nb9yYBE#oMRVQQ_o2Nu<BzK^pg`mA5L-@ky7G44j-;DBWD*$h0?gSJRmbt$l)v0)GZ)@49s{!|vnaQCj&;rHkCYL~=2yygDT@hh{lQflSWpB6mqQFF59#I4ppBO9TAYswwF zt!s;A^9se6oOu8G>(*Jt6aH&eDonRC|7((ao8>d#&3Z;>i4Sw%8?0dvPyEp+qW#)o zv7X8CPrh4EtoiGhGduJ4=67YR)qm0p`e#47UsiPCp06gGV9MS9u_u;xdZ(|>tGd^; zy8J^{Ah%b5($lnnpY!BDG-p`Nn0gM{mL2TME)$89B-D&oE>vNBwTM= z?7XOp{r?{CIRE#Wf|^ca_q5o~2Ag#naclM*%=)yiL5gRqLbEZyv%`^w#5ePvl(~re zyghfRVoS;V^-m4^OOEdQyi56Xa4&!Rvb6eX>w3ut?eqU!xT>%CG4IBg_PAGy&q_Zt^DF(^*tgUueuZl!uf)*} zt2Hi0#98Zvzs+LGX5iew!25wg(120&f_a(m{Aqq()7~+zXPt3|_g{pL+X|hEX}Oz@ z=v`~$+pm&;Y+rx!G5sH28~y|cY(3R$r82?mnttpHpLPMAe^EKc9xbk6D(s~nuJQS? zRPz7%x9GtX??*u!INIMo^5EJXH{m3o=1UL#J?qx7^$J`q$Ujh&_q|}<^O`OnwRgnFcbP~LKqYSP7MJwtKR zi}J?K?9A`P@208qToV2n@X%q=EgNm6%(vesO;l8T_mR)=twE7`{u|}k)yj>NoF4T) z$uJQ9=UL?9vuV?fq?Q}YH2=EDoJ^JYzd>T^M5Vi{)dD?dD`>5}H&MItlXiW+)LTQ1 z=1p>)LVTr#D!R&=Q#V!Tx#n0cFJ4d-dZJKkeed&a1pF&I!CeoxUnxq-MqU6xBfM-FW|MJ%fotrx0wW$9D1J}ud_w@~h zFRM!m3qQVK_}|HhyU8e1Bl6KCH6!CtyNi0FeOXSzpUZ+x4i>SdUNkvfq;WsM^ztW- z>qeUDle7I+Sf+mNPg!Jk)1U zuJ4288iiH#rzr2-Y~d_)BhPg>rF z&2?VC)h=B)&>9fJnQ+~`lB@Sn@v&h zzqYSuq24yp*Fk}z=kza5^w`{YZQ5!5k5i6Yee2Ttnz7p?lhfFK@`Oy$;#Y3(?S;R2 z9v3#^Zc0@>m9w`eE!8wkeTBfoko2t~=9X!ZtzoP;!!n;<6KfRBo6c+y{X`;4M z{>8E|<88Bkm~!kj2;>xx;{Co!ApAiHcY^qJ7S->Cir+2#wng}g8dnJx@B9?C`P;{1 z*V1N-PMbHiXkwUPpn0kB`EWzNfavdDZKAx~rm2g=vex%^i>zwAVVEYrHJ@3WXS-QR zZFz2EctyQ%On-Tq)|QZ&*Yl3&7FbWVR4e&cdvkm3-S4#z!%dHw*BmVm=DSd-TrGA5G>B;U$^e7Ws3;%0z!e zXzEqVMjSVIQO-D{>7#Is{*H`e-!qSUr&fMQ+sMXXe?#{9m#Yg3n>=s4U@KGh|B)Cb zULU@r^8EGImB-oFeoj)f5ZyV&oB3mQ=esujqK3%w_SR1gC$IioBGBhrjw{H9;^_N{>jrv=(h=$Z9z?_Ityjgq8#aF4?)>qZxIuZ&^6NSO zx6OHbLspurHu+Qi>4I6$e_k}2+3?n~=yB2f zIk{`iSu2ZY*H>*%U8K8lk)!1PU9*h$RV4+Q>|YeMs(Zq;t5s`PT1-!#{wHVGy8ovB zC;JzE{3W}#a{c;QpEvC?yl?emj?|$^yL@=0FU|Y7p|*dOY2?O>O0A|9^MeHz_GfEP zFExK$b@;)@Erz!b%UN~h?wo8Ny`o!SN&c;j{uzt9Zf3XcOl#)37*f5}(r3M8^~T(b z>&cebF8sq+7$Iv23n zOtJpw)@HJM@2rV?-?L|$?rIlHwzew#DY0KpXwp{eJ0{YL_EvYXTW;$hGC#)5_wvwQk(@!>sQ+7?c;Vt!S9n(ICPx zg+nhsP%v20^yutaI|cLRo)+6@9xk#nI&$uwL!7^lC0cGQ|Fc{2_Ktd)nHStv1?iN%;|HMt)9O1>Fm=-bN9zqPqw{%e52kZwajHn z2Pa*!nJm>jIZgk!*}oH2jW=(vXggRRaN7OWd0qX(`{x`lj&WxEbK_V0ndbDFb6#Fq z$oW8~Y;mf^GVR)R{$DOFl(IIhz3jW|@@K=PccYB|adx)IoaNM7&ZG5UQ-6l$-K)#h zHl*HNm$~iI zxwh{ZVh<}e?@e4 z)V1Xf@3ndCs?^LG`!F!zT=_cv+&PE-aTGrNU2#78-lMu*yA$Q^HP3o>di{OIi{B!C za#z-gUj6nweB*<}Iu(I^FSu`VWLC4J?}<|sI@ErXIZ|%_!g(+9YG19adz}97mG0wH z)2hoC@7cC-z4!0ZjKi|$=GIL)E@u#b?@g-R!>jl1ow|MAYR1mMn-kyvIV!(1HPZI9 z{pY^V`;=bae3QMr@O|EOW9I|xG0fa^m|5>X;goL^-jy_Q+w0zMujkJ@w*Ak?lk+}F z2Yx#L@6pjeKkL+wbfzDf>|QBTXDngwwrStdnQ`wHMjx`?{`__H*Kql7Kc%l%-+Aw! ze`URG14|drm-Q!vGa5HoFNocCF8K8m#=_XIMelCz*>$|~-}m*wzkBCz{a*L#_q|uM z8YtY(YtCmjhCI7X_8*X^XOx;-yBu$ zO^JsY8`R_NgJ)dvIC9;gF*&EF((0JPjELQNA9rnC-E%c|N7>s`9~l%Gnv=Pwg?fc8 zj_T5EIAgQRh}CPcQUAJDjwkEx?X8h~_LkdX!-In@+|qd`EmFS%4|!| zHkqFvUz}gy+_F=2Fu_^Sf=18ESFqIaA8RL--mQkBM)e(3Q0+;fPuEtel-s=jVGL zdKuK;#QE}7-HvCcve)m^J2H{$5TCcsMvqZJ%=|MP6=*FU~h<)mA7yJq|J+*g+mXnRX< zNpSxE?fx3R_BsD9>`s2$Gkv#Ex~$<5yUC*4j=wo2QF<#Yev1AYW;x#S)-#LVthqe@ zR@TIWyi0!_zQybNcG*tGV_j;qV(d%Gt{FPTL_h9XeD~wc_TRogZ{@xhD}Q#KagE7k zxvsvW2QUS9cO;!GV? zf6Zn&-3%9<^EQI2a#L0btor0z`6}tin`dXtuhspI>b%_dtv2zo+|I`vzxUPc-M?SA z=C_IJ+LxE+tdg+`VwL=}CuHNBc#i*n-^+J9ZOF>K);;qohxq!XJ-o{IXUD!h6=eLW z@Qpr~P5dvt6RW>&JXtH#bMj7C`9GVChrUYB6?v!Mnk*`|lU+OYha+R!n#`AQ4fDI0w?X9MUymcIA{*PZbsn{LKiYB9`_`E` zQN_tp)+_a++meCChEzYA!H475IIvQLw_=Wl>+!W(Cd7s#+nn;MS!|hb|$t zd8e0Txvk%&w}36Q;?kdUcJY-bIu%S6ukM<*ZOc*J{7mf_mX;TXy<4T18WAHu?LuqSd!=%g`Rmurx_;u{x776^ud{zEsjfWG zHYK&CRQsA8XYj0_pY$e7RZf1db@Pf;`=-XtI^la~-CSh%c11+1mLaFP-@bqiIi04t zN!7o-udFKDarok@?1y1%o=BaZ+Vu2|^NQ(q)0cIJ&ENa*@fD|ocZ$|8bnZz|dm0+` zsLOojG23+)zZ_M+d5u5oyzSMX-_v9g9xdA-%$sU)-{X`;-t;ogD|!{jxgVUIc72a> zu(D{n^yz1Y`m^_S$OU_{#_ydIypQAan%55Ace&q-@8?*hC|js;uJF`^!#lb18~k~W zFbeO8XM2_&A#b!Oavgiaf9)gxe>@M_-L`T1nT>BBY`Y#Wq(1q0`kjKuT^dhJX8w~n z>ho=GSNNPYV$D}=z8_xHnbhdCHe_kHUW=k^qPg9@S=%fw{oSa3-t)*&tt%(){#{ph z;m&GRbIGG?LS?7)t37=dwfU5h*+j9eYo_WQV(T$eHu||Q`pJ_E<#W^D<;GguxPR>Y z>B_@vEM;u*+-LIjLp6JiPk!2S(^mVEX28Yx8ikYH2ELz4J^18VqSwwj6!(6^)!g)~ zr)yq*y!Nxo^|Q$)hukX>pCo5*d83wHF!Qmg_|B$(y{5}os;$25b=7_Qxvg6TKc~c7 zbKcur*{1({`^KG>We-YH(stg8+O%Wewybhpqul?u?ymYB zv%>MSf5Gfo|5~-QUO3vyEarDU*XGHmw!d<(o7?H#i@t2zew4rIecbEn+x+4A_S!~4 zlg`~(q9H0gGh)^K=99mC4NE8c$Mb!jak}Q2$@-mVC8xgajqkYqdgJf~^6ZXti|-UZ`xmX8?CKG@vGrPBY4%#(UaLL*aoJtkb6<*=|GKPu z^mBjwl2>P9OxEhZ$#`&R^?92 zzB2#PJ@(mwi`nIF{qnW3dA%>dv)%Hp$(LCLy6Y>_jP`w$sM=Fp&-ajfn&ca)Z@QVh zX9eE%U99Q&C;I52Ox2^ld0+mC8QE65KfQM)n&r#c!s-l7sT9-u7m^h1K3$iJTQX13 z{(IFO+xJ@^S3lLfQR%5V^^2U$!#1CK%Le;>wd!oYZimmBzRzXpO#WN*RjKlsdiaa&;x}94&wh8{jIirdt=~Sa_^Y_&_vg7U9CM7P zrE0Nc#JXj6Y^yYDsebajw7|8YBekKbvEkIV*!9yI9v_#f{L-*Xyiw?fgh+(o^(Wjs zWl~LQ8Sz_^wJK8dRtO%Op4jv~`pEJ+!zTgq7HJ2U+L?+p?=ovPi4ZpP5bWF{(jAg@ z%SE(*iqlFp&xD5&vzAw0Se~J*VXP`q_AfXzH_#(J*rPT7VJZ8y;veaamJvDIw@B^& zAa!zDO?^h&F~bH|kIK(xWqB1zU&PxdB(@4SHd|@ry?4yJ|E2j!O6>G!GONui-%l&? zZSUyhXzxCuT>K&_WLiDb@m8kLf{%p-9M7{}Zu4}qXvwhfnSCRFZb!KH_s+#jIu=E= zF0n|J5-f@~DvDnurCC}uWs2ET_YS@C;`1E67d3h>d-Pt7P+$0>Tame^>RE9$bBQB+ zgM)F0Zh3dxi_YB|t%1{fuU+gAeOS&~Sem|7H|o1?&exDF7O_t_3U_pb?&|3Cy3+kx zLguzbspQALWiBnhDnt%^%@BFmzxS}7uvpXoh<~*=G$!b6m;NV~!xkC6Wrg3_8~JOe zRj8?T&p6f~va>?0a^iL83DTW{?2%rNJEAwV$FA$B+|SZ2TvLL8 zezj~e|Dh=l564e=JY|+hM|h=Gyj?UYS1m zE&|Fkr@b2@=ai%<4p0;7x3~r05 zK9Q69Gpn^KCr;rM?5}W2ncx(?tx^9<_^YOa0n>lPuv%a|&zE`hes|tN*Ii2g2z=qDo$H%0eUh4{bIW6wik%AG@d4GNF>y zmu5cdXbWsz$XwOo{c3W`tM0U20_>9g_a}u#v+Kn^pWB?-{d>leDa(uF3cHC;2Q{~um zYgSBTyUfkVdz{OK+ub@|woGlGH~Ut@>65F@O3s`VDZasL%DapyzDuiqNaTC4PhD-5 z(wR0VZ`qugyJTK{Up=AI@{rXUr^v45#|4&rjuUWPdroXco9m1z+gsMN+i`Jp)#^tteKZPXEI)?H+k0nL22FH$R*FLRwxF|dQzE@y)x(VEE$6n8$NN_e2H3LdUI{{ zw_M9r_L3g6b&fP9Y?~*-Wwt(SW!1$+T$T$xJW{l0%(1z)`Ted9n%S1~c6BU>5>R@T zewEYHF2iEYvznWlZfe~ElWt{9E!%S7QKI7P)fSoVt6o)lt={zJ@TRRy8$-;pdQ#@E zm^MG6YMw*ZjKtUL?6?=mdn@F2Y->NhrSQd;eGFSKJYG=Ep(e=XoIGRQw#8f73m0zl z$}Rc6UE;|G&Rg5UO4=vfked{-XiA0!*Y@Q6Weq9I*0@J?B#AGcI@@k~^s<@Un|}xg zupD2^roJ$&vSsGK<-5DB|ZF^9Jm0-VhH>30d zX3b?+v-e)_-h1=4#!>I)=4^qCU%d~mFMGtbS5k220qy0ht@rGCysMmR_uUf$)w4>o zzAn!dUGY<6!DQ{k&`86Bo%)*F<#}D#Zi?8~rk*HO=>GQi%J<%-vM+b9_?;)!wYuD~ zL?ZaWv{%~9G7?g=%tX(a-O+BmXT4F(byd(*2VtM^d79I>3lH*5T*09u7&Cc8!%mC% zZZW1kvvqwA^F2H$&3Ndm`l00#mHAq^g<5{XJ}YM~Z*hp)e)9P0FD2W|Pwto5lQ-?k z4x2mkE#`*IJ-)+ugEY^uTwC5$tEZH6@?Y{be@96`Ze#M-Sid}ws zdu!NMrPpa&%bQ-GI&S)Bf04>0QLBY~H;%7}+9WjD(<|cWmhfG!+9xi(+M(sMCH2hV zNoVG2{Zg>6sdeO;{6MRw{gif0bVK@^)fqESXqKP2khPUh$YpxP>WDLG$!dq+r*}@@ zVHz#m(7x@M=&uvEW(uDDe!5j=%aJ`N5AND#Abi|>#`?SLY_*oQ^^%A81|4$qIkDtP ztb*Igz?Ek=oKaXmXLp?T>1k_DNq5hF)_J<;^63kwDv#Nm&gD6LujbV0WwW~^t@Cwu zoUUmV=I)%Cnfy=P;j#6(bw&HKJ=$8X&se?d)O($OC(hlHacuF-nwg?}d;JCT6UThq z+IQyh+E(!L9x&?(kh49vjH^ZO%*j3GJ6f$bZ(5l;H+%E8%voV~a=xC~X#QxnL-vWq zk$z{kpWWoXVbAJt#opPUWRjN6xoqD%OIr8hi#GXPXC^N_UBfMV+9mhg%9u+x+RmKR z3I2Afw=5&IO?#`R%ht3jTH?HCj2qd(dhI!z-RDxQx6C_!*;e<)KGTWKvW7Ktulr5A8f7c~>rID+ z=ltF)t>1sj6-Qs&tv$&nrbe*QR=)G{pB0DIW^R9yK+KvljlpHP2yglrGPuj;Pzc<+lyJH$HrJ>2As*`>gYB)u%mY zJ0IfBHJ`hG`=jlzPwzWFxBQ~+ZsTo>S)MLF(7T=M`sovM-R}L(bE`W3=f=V(y>>rx z_RP{1JYl_5ee0gEt|EWe`+vp67$@%$DH$Fer z**fd~uh@Ijdv6NA6ZmA^|0TQs^b2WG6@jm7{l4e+G3lJL=6tmK@cp~5?~5p|syd=C z`sMEZ$UEGT=g;;QPM11w;&;^aoV(z^5*4{hi%lYj=e99dU-8X+axiBb!DI1&esctOZ@u8IG10|NMPv8Vw8KxVzCXPuacb}6hx1wQok)Mi6LPL% z&)jJiw;L2|^WWWxop+{qpTGi{X=QZ}1k&%z)OF{DY-oJz@HXn^I^Fv%^BfEJ6>8o+ z^ZMZQKU%kE?h`MsOXTExdCd1*nBU9AU!(cX8jG%dDS7ziueN)?!Z(_3o5`4aAhh?y zXW!MXIjfVZpVgk5pLuij2D{g@^Il|k-;3XSY4giVk%gN}=brAkdn|a(i5v6WGS6PS zzt7nqZ`P}<>zj{XiCp*Q^gAtcxkLB{*RLDKT4nf=r1T_ zI#pTVp~Onv4XfWil>B;#*Z=m}bDNgs`IOy!ahoxErt4?Z{Lkk7pFI~b@tZgHuItzH zdzQUo|EtxXmLK`_<<+MPY@gpx7C!svOUdUiM}@yOn|!T5`nl)DXQuz9kLK+=6#b>3 z?#r!NU*2!~qQl5=dXq5Y;%{D?zkR&?ZOxZ&mkPg{?odhRH;(%MBBbxW#{aMGUq0+J z`}Q~No0j4;twxnl{;!?-U%ULj_V7nrzpp6G|DLI_m+Rky>HR-vuK#KH{rfzz9|Gn- zGz{XdT1|8XM!&&l_{Chivs^lLJ+{aq#hSf^%Mgfws4B-xy(2u?#Lj>C{psGn^&5T!6q_g@}We>PPWh<&LAU>lan<3XNBCH z^z`%;gYaWZEH5wfo~#6h1w-GQ|(l4U4I{cpz(Xt z9FK`FkM>CGS3QvqS>iQUE!1O~%*~<+C#M@HuR9Z2{QT_f(pRE$1YS5Sbgz~Yy&SRN z_}=J+=cZ+cJqqg-++6m#QJ--|{q>?>pZ%@x z%u3c<_mppmuFlp8m){wQ z!jD46`K~S3e&@KI&*I@Vk;&W>c>MQ==8Fp$la*H(-VlrOI{a9tMB7ny>XlWFTU7pu z6ew>^TCZOTn=4-{%8ieXFE>`V5__vbjp40k&;Vlrl#K_ zQXHR5aR``Q`b~X_&7`uZ%xImhi}@~O<`iG6OrKZ% z?PvOeX0fV_McrnR@h(m>C90N+hb=#^Y@;)I=^>r z$*t_|f6ML^=U@ABKy$rK@qP2}wF@3x6|SpzH1WF4*GG}d@BFwiF+8sF?&|ITs@`n= zKc{?0Ec?6<&*yL7^Yuf&zucdH_b>Z*{5*a1dQHuvhtu!>`5AxxU)`V2*X#eU-?^Wo z^g8Q=+LOlf{xC(@vux^XV5^z@OR8cYyV`_$;Ux*Ix)ldoe)t#h|BU?$i!RWBL=x7jabcUqBaYNUYG_AFc*%7xSZj%L^-J9KPNe&=Tmf z*l7*N5wm&zHCIk6${ww7w|N%W&mEa`(@tZD*t@_9%_=F1|1Y`QuM(KhmXe|@`_se4 zE@;x^B`K<(#XP;!f+o*?^5oqKjh#zdgQk33tdgqfTj>?DENJTLlvM55pQjepe#+Xs zBvm)J(mUqaC-3~-9{ROEy%X4iXB<{ZGwiMONl^=)c{(M{c1<(6jqh|TC(!b_e@ciFT z((V8L^lxChGN<#QgClQMK#N+)LhjTIXW3r?9k4~1Re?QeA&aG-X1Lq_3Y^duvP4-m z)6=&qXv(sXr5tB{y<>j`%{Uga%y?<0Z*EoaoM$1+t)FK4*ZvA#z!ti~Sv4!Lw<=_b zTIfpe)U4pSzd~lSL9e&$z4<9;Nf86X+#&`%*IV*4FfhQcw~Pm0aCznWSAUsvpA8D0 zSlr<&x4yI0W8sU3@9K8!o)*+)EmGdK+ge2PU7lW_Xtl`_fqTl?9R zawBbRe!)KpVyykV|2e+@XE}6m?_pLpAz{JEvu*`UxEK_C$zbBcO`D1eK7A-EF8=)K z6Bh>u$KT_JoFY7)*e4|=LGHH{;BW~G3yh143k(d5jEr=BwYY0jUsqSxu3fv9En9Z2 zKE`;l>FJXYuB!8*B9NpzijK)xAt#+Lt`!dZ0+~diT?cm>g`)y&Y${U z^S*rh`t@u0QJyPmyk=>9Tc7fmhxGi(lKVaX<4K>_Cq3_-Jo&%q*^~c!{P#us?@RaF zx8L79^xU>9XU_WSZP}vp|KHw?8$YHemuBZyWoKtsS68Q}r-@L*dAF{p0(1ptRaI44 zS=qjCuWR)ESk|NS}p@X_0kuioyyeEat7+qZA;SI@5ZH~%*;_fG7aJF#=`#J{;0|4;n)_we@b z-@o^pANSv`?q7d?-aEZGxx6^J|NCtIihtMF*I)0?zy3Ube*XIW{Coq6H?^03{oOCM zKW_j2!+ZBf@86%k?|*pDf3g4nlYhtmx*y%(+<35X@ubsNpMP&%@L;1v?=^8Amj@R# zpPVoi;X5ku`BuKb>SnI}!QQTuPn(PNs~Ts9N%fje^I1|H+4KB_`BcAD?p4jd4xIUz z+?3RH*j(sf!wDx3CDq^lc4=pYw%V}jw@&L?TJ)A}@}2pA*6cF95P$JI*V@q4U&D&+ zHLO@~@J7dMKekt7`sCEfNA@$epA-1Vwfp72MRyO2UwhBv@@V5MpKa!EdQ~oH{tI}O zVKd{zgVGPdRaf|LM7F-CxW4HwP^j@4mdQ z$3$e&Ez@H`UHLmqg|_GFZSOYTRg$JSZN-8=0iDT7yEszkT>Q#>V`J|1eJAd%{i33s z!lpFaVeLEHiOYYjettjgz+MX@segz5>bw3~%z7y>=DtpUJ&Wdn{JgKV4|haJ2_8%1 z{n6sQgYQ!D6uZ}D+o}?;Fmx&=8Qynu5Sg~wH>KjRQj^MWKUOZ$MwX3jN2eQXRmn_Vja}M1y7qp0p~1U%zO%h|g_80UiK(aG zi67&dGcDRN@ABcx25r9&WNBF~*`z7IqtE=rrabw^lzf#tUtA^}lDzr|A?~HbU z4V$mhw`C%08w++`I$l3VMda+SJ{E^E;}8iZKE`(nzfMnjZy_QzcQQl4&#Hj_uCO($ z^}2)(YioNyF$j9&bfj?pp=K>+znj+Qq=b8wW4$|L3Z6OSG2H2}o1Z*?wsgDw-7wo+ zy_rQ%12Sbi3R}8wy3|iid1BS_HtoZ;)vuPsw3}#@MA%&Xr}A{cmo3+(7(EiXRq3k9 zV1DFUS)KL7o>k>W+gck^j(3KO{_J>J zoAQU__v7E&kELsWn7g-DTO@K#@5U2<&MJop)xOFM|DgZ#TwT|?8^$xa3zZAFjI-7M zoKUT+yZ+&1aZ*6*JdURiuyE9fwP z;CDsW_bf?!XC7L3y7O@M1(t=M1DWk*zAsFQWk2MSaiOGEl_T2w@Qy#+20c&NI;O`S zW>w4FP*cOM;h(OYAb+2$!0E}7m7aH%Qg3EB`f2Z%Xc6AO^8TX3btiZg!_-(li9DaL zxzMBV$K4|@MDiCGaeWhHUERKSQe;EjcJIsoeR_%umnhpONeRmB>-;XWMWG_+|Is5s z$L7y*%E32mDfY`xID=kj^=NWV*qQg8Lue987XC%+}( z*Abg_6H8_vy13Q%a-jV>=h;(!{VC_K=iuYBw-?yEcIG^X{o;J`_MEck!X($m$~efb z`nUG{rhf0~5u9nIvyX6ZP`R2bzghINN94oJLIH1Q6m9!Id+$Lv|9C^QLlKqIAKn}| z@U+aR@yOP>^U`h}zh`Kj$m`Q~ykYBm<<=XTm-5V2d-hH>yb{{OI(b>k^3Z5*p}AV^ z?B=2mYILXnTVyWl%XMn)$_3)_y-pwIU-Rj)v=`VX!F~9<|H&-N?USZThMUgGJ9Yo^ zrWAoLsmoU%=pLDs6!uXt?0?~@@B_QIoDWmovZ7_`tg1bU%6qiryIL-XR9RQ*{Mqev zaog6NPFGL*MJL5rx%8Nentl%`eNwXUGHJ$yt2$=d+?^7ox;$f?~f1&t21WN5oEllWEeakS_{r zxp$p!YKwlz@>JMpYaO?+T00|CWVWvOd~U5Pb~|TtehXhw5t}~yklyXOy}Yrts}D9S zDg6GXBpAp3&^J%Hw&K;{&h`AMA-5cjYhJ0(TgU(3Ad~HYoMZ!YkzlObAEvF5i>tJY zle6b2H@yzeI?BAWu=kvEM}0caN5e1f^>0m=-#ahyGvKuBbC-SY8{V0o@;o8@+GU@= z(FHrTwA%?WDO-*&nPs_#mB-JtWX|IspKKV9W}T7w_Vd-UVVBYCk$SB@QM*K~`~fBr{pLnvSHwldLdt+Wuk zK!ci@{+Bh=c1v2;R4+Rw#nO|^xtY1VFLdIGPpTO?25;VmYKa$DubVJ!irV>gKPTF) zc@iq&)tdCBiYNT>ysOuG=IVK;>j{6nJALBA_C2N&2_AZmm!CcB6aq zZ&i1zis z7J9>VA>h%cU%tgFEWDzaY!>`-t@s_U6}7bD?(3(!Y`df6vo3^0+_-;b>vj7N_KAFH z3$^5=HI7@!TlxAQ6OX>ncVl0Cr@c7sBt7f< zq1)Q=s!!Z4-29G-+&7iUS`lKv7JV?l)W+tm<{aB!$JZxb$#V29J*oI*^IitN+Xwco zF12nb(GNIaDqyiAcjKRlQhjqgW%!P$u8U;bt2DcomG|5`FWz5^Ha$JO*xdSty4c$K zu2f-(@>S(}-exi9XS}rfQ?PYc#{QV8pZoQqr@h*;q=RR^^8{&=4&f}Peaufbe_eNT zG25c!mju$*u*k1@{_oI{A0KZUJrca#A|=#PZTJNnp2T5a+GAAEqkLUFB!Df6e~G?jGVJ3h!%2wlt-P2QSJm zu;{S)sS)Rq=hO3{C?G`T{`uPiy6jbtA1=J0YM1L|XX{pWB}jUWSJX6Bn~w zEIxQxT_I>!-P(h#&5REP_SHBfskvQS+;)7o+mqXF34zQKXRB8iD>j5Z=-s9par@!c z>QpOMl>6S;?$*%uQibtnfbL26f<^9cu)%OeEYJ5!QIaOS%KrbRBC1dxsq9c=P(q_T}e$mi=D4jNNWIyL+p7cKR32 zW34w*eT33m>dx)3HP|Hi_uG!|Z?~TKoO@vBLXk@%iowa#tbYAC$)v{}c>1DF2;0?j z1#a&9K6&i22rlwDuKCr{V6W1ZIX8B+TAr~|mcBJFH*nrv+i7=K$={QnYO5fBt$dR0 zqWQ@>E1ZN=4}{OzbAJ}kmNu&uj`2}{WKJ*W+Q2d^UB7Bos`ZYr%d9bsQrTTo4PRW6 z_+qL%UG430qgVV=vRxv(Q>^~ls7-pJ{&UaqE*rCFDgU0^eDJ(vob~T;);*^99SKvu zTx$GMwA0YR@mP&P@wam<_Z0po*vtQVpz?OI|F_`zf0i~(+F~$kpFrg9f+O1slr~K; z+&rOh?S!{WCu|LhU!-F5vV~*QTE!WmSF%3ILEJ3p)NwL+6b6z7u=XX9NF{A(*@_DAg5JruWihyQ{g3 z0GI12wY6Squ307y=0U5yDmia_G&-B#y5A*0S9R?>@pW=F6YXsN@bIq+Xkp%VkkNX( zcBoLp@d>NSey^HV<-mPzdvf-X$CqY>1i4tH>_~3A^=5j5fPV4zstPfgl!sx-nknbC z#m;9x+!futOM3sV-7j{vui3SIe(8qkw)T;v3gJgrmyE!n?o;nMAClSL-3-|oh+F0l66##ZimR%!{Sb~CClHK&(k_|$P8 zXlSmMThqkx@Vit9cez<@$q%(!-aV7^l3K2~cQM<2T@-z7arr97g`6El1-$#;O82=- zeRR2FejzFBx>Si(cG$%lhpteSo2Cm|+_LAh*=}0)Ik@w) zmgk$4w|swHsCRRYb5&V)-qf#VQS5Re8+CVmeVf0)lJD=z8@+9?;!n7qDjYBJJxf)$_fS zZ5}OP-B$ZAy8TI4L43Q@`Oi(lhj$uZTp%1=X#aVqu}!2MPw4|z{Rw8@p6B@dUs}Gu zAbfv9Y5lG|q3y|yErDu@rnf7CwmOvfGV}eK?hx{C`@u5%TN9$&Cb%`+*O8ImlD=++ z?rNudFYe4ZVcyJ^yyC|1;uF98=jqf|hE#jkG(3J-pki#fCF<&ysCoXG73)`-9}9ZC z?{W0K4%3{=udi#q*0?n(h5Nj~#digDwM%0b6f=t(T$S7TjrGQ&fXzK-Qzjl=w!wUj zH(!8xc+yvSoyfA4c1|itdVc0+2Q?8g6Yq)*mYv;w!Am!ob!<5riR{0NhY0LEe2Kb%Xw$Y zpWXQQyYNw;#@;Q};)zkY(=O)(zglzZ)|}a1b^nC;TNw7e{#c}Xr2g8cWzu@`8ca@Z zYtFj2op5FEOI3I1+nO!E_4fOadt#!IKTJ=o71+_Ub?vTC8aF<*dp%jV``DbRX)M>= z&R)F`8I%2@X2R2?S=L7zFTDPh^ChZkQ`oFGY+K$%?z+EO?U?P8f3xI!p0AM?SBW`p zAK+3yRaSlL$87<{hDpJ3hCh6>P2Nb@o%h?H;;^BBFW{1%7&gwj=I{CmZwm&xNRG)0m zl63~h9S_aW{njM?d8TW=cgA}jm-a*JW=C#{&e&v~aXosE<}4kdy6{gavbB=p0$)ST z7SvdjTwI@a_`i7XBFp3duYS3CTU2UK$7_qg-~|V>Oy_RexkGUEE%8-r*W5L^vGvyd z18H}seRz1E>DKes{NUol8?!IxUp#U*PvnKKuBGy$(9c>TlMh{7eZD(N_tL7wAKvrr zW-+Ycnc?GBzn*7y43GYr{zn!}MpY9-dM^B}zPR?)#q?zt#LY6VAIrY7Gpcx#^h+!A zTC?(vr`PV!ImNgnT*Bt4?1D*J(~FkMZstGs%IBC-hgzi7@837i-e1F(n)OvN=|c0n zbFNK7Q}v_#?#^Z{(Qjur@`@1O{oSkPm4(L}sTX$Z?iy%_Z+iSpj^*0l%DUo&$-gEZ z=<@ofu%0|_z8~YNf@EqddR_0i^Q?U;z2@OE zXF2b>h41u#s7_~ivfL(5UG;kd>zp6oHu%c@-!o zdH&3^AHVy)yY14K1MSlu99DV~zkiOtUQ*c+yK5Kc*Nb_aFL5}vMS0(wk9XgeTk(oZ z`UR~HxU(Z9<#49S%995k{xAOMYra?W?$0HY9~*p5ROmPKvE1Syc=<$z)$vFDXXbc{ zoj7k*{2?XRRqFSvLyR+?w1mF!nmKdtj@Ow%^5U=Gv=*1`iHZDPyrEU9?X%@RrL!xT ze%@cucr>#vYR{9b`eP4na{p^RQ0~DM&^+sd%S zJY&t#(+!4E_r4aS%)3;#@B1~@r=Ip&bJjGMjZes5#qO6Lhfa;X|5fTkX-vA@%3VD58}ENCvr!Day>(~CzbkdpH?;mduQ}YbP0{uf zFWY3RzcS_iPhKvH+y5|pch1e*GX8CP4!r)!9rs!oPp7x$25+6U>05QioYweR^(~hb zQaeizS1lIb_xg-+#Q)-hz3=}NI)73-!?M0ee4W3Vy)wr_=5}47<32_#lbv*?SO|KZ zYCONjSYoEfZE?4*x8|9r_o_?xuYB?MqTb0MC6-oU?)rRxKJ{+rg`z#<2TqKR?-J zz2(S6Pp4y!Vftd49C=gfKH9{t+O_I`qRym}eSx2s@@Xr)dg-$6pY*r#jd}0eyU)f8 zzPJDL_x-=92O=rKd;34gzdf@g`RlzuYl@!neN$hSz0~i-fg?*lFPL{&zc<~z zyYp80nZ;}Ni5GZ&KCzwUwD0ET@`VvA>_49@nD~LQ*Hh!iw}sm_{rL5EdzXmZ12w62 zoSFP5-X9MBu4wmj&dGxopG{}XV)&Xa*JtwXsGAGVI{Pe}&DPo5d4psu#XenX`I=B% z5f!kzEonmB`yQ)^%=3{{@uOn_&7(G`1P#l?RA15)Y^J6nh>QxjhKgYomVy?PeP;R#nSEqls%C^yeO zo~tCG^w^ViSEM^~s#fWDiCX6KA55E9Zkw8&HND#~(q3&x@@;qLBA2CBx_b_W{CCi| zSb350Iiq~dgUa(a-77Qp=`Nlz+i-czb=Fxtip~e_@CJO9c-fc|9z-_{6PFtb)RcT zr>*^YksEV=EO&5};fm4Rlgnjuqs8!t%k;LV#_NT@xkhPDm7V8iT`y%~Fy~*%)BHW2 zLfxzr1J|#$&GvneXOivvIq%D9&PS7?zrR{`szklD$ISK$lNAdQlZV*)eOYG9j-uUZpPTG9^dL!f*$7MGuGp(YpqP95&qURG_ zb!Y#(^=a|k2R6Q&N}{C=XYG>bZK_+%-)p}|R7>vq7KcvR-uW$|=O%9H{Sd^eC|Rhg z-*UzxE_vb0YBdL^H?GgE=J0K0P1o_?6+i3!b^&3H1%4cQEmFIKa0ykeM`AQ0}YfMk zY5mWb#sw!VF3mg=RO`|`tK;xR|C{p)r%c!2K0TpX=5pfKA5#{-XS}jzll|-0FBZmm z-qC%yV(Ux~pL+!=tZyiruos@3Vn!=Z*ApEn-*qxLH5A{E{PO`HYD{_i`g?84AGJ95Svt6P4Pg@ra{s2F_^zOgme>(r`+ zk@2scPwFNtxp8)Kt`>VTU^Ovr;S9?(C^2@&Z#~NF= zoVQLDS#(OKwS4nz!!tK(!_0$IT9?{)P$he>x?8zk@uv>?L=WG{yJy4R z2>&{@jA?$5;pGqM=Uk*bQXN0c@OiaC_-f;|Uz!hWCq5CMW?7)M{&HgJmnx}JfqO?n z`czy~4Yz%YT*5W~^7Vs-hqbkveqCI7O}uW}?-nnk9Y+tD`c%1Y<%;4K&px+Ruy4k( zb588D)y{V8Oq?@meK%*1!S3Vdyccwzf42X$bb9PRcb@iwvKr}yf;Fa@iDqptvYd}x zw%9-I;fw06uNnp3gxG%#oZP;|OVob#>Q4*KvR|EDc)da}X!+Z9Wj;%1T$%cSl`;0p z4F2zNnd--4zq)J^J{&%G*}dt1s*9v@-?9A->$&D+;wqCSDp(?O=jewOPk9)or>^Ii zs25h2K6A#qYj8-0=X6)FSusQm~evawBN7?EQ z$9*@suRk@4N#XAPZ98V`?c8+scUi@ymiq?QYIprT(jK3%Ec1*pu-NiH;m4V&vY+?o z8^>^&eN57A-(vBBLut|C!|g>S;YIIvnN2sn%Ftb}v1gIMq2zVmDG8cSj=T(3pH+V; zcR_X80ncC!g%|8U78=Pem{hn`S@-jVrMx0BrT-R)uyt>G^#9&!&aaQ1dqtP+nfyWO zeMa{3u8ier`3eskCZ)|iVt2t*_421BO)cfyUfO+Jplx_?(f<_-3t8EwfBSUodw58g zDck>}iuVK`1^GOADE;8Fl)@obm8-vhl=oNfRh%5UZ+>>4>ZBcu-b=bROkG&DZnf*W zEuQ_3jzW$Hrqx@r#O65MklZ*eYs2oSK7TXUs^#WWc3Eoeuq|9+J3rQ5;IvKm{eC7J zjj!wdf92N;UUrM@ma9+T@D|V({-Z58QB5+)bmHPPbK#H$sqAMbt(kOgf+5GcP&xTc z;d;H-j((acW_(b`TvwhynNgJGm{)kmNe;D34_Bu}Wu98Pw%i1=Vcjf z6O&yN9jkh|=Ue*U=dY$`IJ->zo+G*b(YLzpi4rd*Y_Bt}UlsS8?a-glRV_yksTPV% zoF6NHV#AJ=*-EV!#RXlSzi^rUAtLJP$!krg|GvGz86Z%!^}+W=0y|f7pFFSq>ZOG8 zNehql^{x9276fsxnYhu^rR%uV$)fis4gH?g-gEa~(&>9j(NzBbhO<3i4><4a=cbXS?(Qs#gOniR9z|Su>c>+>%nu?)8Gvcar4xlk)RUu}#`=;@ORr4+T2nBz>m7 ziv8gF>S@&53+YWB=@ZttHF!HErFh+XruxMB!RwYS`bUjfU$?jh9a8ODBVYS}_wrED zk|G}GPy9kG(mysd_Wj|j_%?4c-@mwPuQutF2Ca^a+VoG?`%XpSRFRrBnR_y7md;YG z{&ry5xieE{=`4NsM#jjm^5uf$II%PQw{5s~FTYsYXxm)<*{%NhSuywjdR~S8u2u)n z>o-0wfAcDi-RZu|qW_{-ukNjr`aCCLjc2w0&-L2cfp7i2rxk>ktz7);X~ct|jP*(N z=hJ!SPi^WrRkQT4lELzW=OaxTvlZ@4xWZUGIb-T{ezgPdl9q_KC(nGf+lKw>%dL$S zmt%}HRE7R({jXhrMdhuBN0y<7VVj$asZ``H70JkhzUq@c*70QeuezFk>h`5h>uLLI zr?9j9X#0C$lJ=QN1x=0aZ?7asScF!p?>8<X3$nrQqr93A3!H z+DQ02_Qr?(={Xp{Et_=l&U6vk?0q?Zr?&Piu>ZGKz_z<(D|4KLeUPrZmU#I2m+@Qe zmK}Rn7U@tD@j%x>V`h4r>%L;oBuKYQYad6}0zLOnpHDA-usfB*`xvG5YvATiVeJ7F3*Q>M6 ziJa2&5ud$Wr&P%QjocQdWR3Kud0)e;=l^s%a#A+>SfS|@S4XM%pR1U3>Nhz>HrqU( zTXFr^eJPv0Qjfk#e6wZwf3Zu%>$KT}!UMOaT`S%9Lgi@flXs_M|9Q=hnY-2AbJuD! zvwZt)974H0S!e!fXoZJlVfiHmMa!8)vNc&N{noL#E;;pD0&Yuu0)lr`^1plpB1dU|KNO-+FPU4YFeFohQ@JAB}aa(>*JeyE1FW#8+1Yod3%) zH%%2t%BwuPap&@BQrkWMKDs`0;|!yA;k;S;tEyIhz2-IfJxfGHT*iGTiw@=;H}qy& zFN@#|X6^iOvGcH&C5KLKQE7FWFN=TGMUz1GK3}mHt(k_WyG=Xy-0e^b>YNp=ra9}| z1HP09{)n4;ZBgvsyd2nHP55=Rdd|zAxl22`<@--2xmd5BF0ppIz`3P&{Zswz{h#cP-YO~j*!0t`?^pPK-O1{IR57jMpN8-H z8Slzmr>%DV}q+CBmC`t;lbk>n#ZpRecXFC;@ab*rtQnG zPG4SnU~|=>&1~s8>wbTIRVeVSyW-c@AAct2YF%z}t_a?Ii_2!SiQeyvk<(>Y+W0M# z;bSc1n43_bzcg9?u%*MHLWk#j<{#d8{Yg#3hdEXk3V*aG+lw(>xL&AmwlL>b;hiTn zk3Pwm*}b)JdTH^uV4uT_Ee;iiIYk#w7i^R%Fyyj1Us@t{fitOaF0awG@cSO3Ozi0$ z>?haM^{XmwWBPJY<-E$OIa#K!xu?#0{B6c$i{*v!hrb84HGEpUBVAvgZ?68FWQWbu zBabMyXoQ>d=xxt@Zl2ks!x{wTe$vj9L9)PgQ*2_4wFr zR)=%v&gYJawPI&1S-*@g_TBWk6E_IX`#&dsMa#pI@37YT#DX&A7v=eC-1^&)iTB<;qW0f4^_@6S`JarRb9W zz$f5@+k(qKnK*Vc-P#cwsMK`j&chY!4xBJ=n0Y#VqjteP-AmiE`EF{L&Axp)RYvV* zvDuT=zca-pjx_sTfBLZhv+jk!2Ck21e(A@|W50Fc{`HFT3q9WNZoj?H9-b!Of2VhK z`hv&mvE@GE-@V&*U%oQq-x2AjGTXQK7Ji!@BG-H+?@@B(uT>N8H0RGd^jQ3^ya$1Zg0y9s2JbZ2KgR7#Gc8D)L{nyl8 z;L?k|hMQJPPF&4;k$JZFgnhm0+@Ip_yyw5wAJ<|R_vXI5p6|cx{ru}4#9vI^{(1Xv z6+hPf_Ht}-?`-bu_TqRIrFgzr zeO(*vx4Slq^xdAzTW|Sz*1cGr$8!RI#kAP_ZmGJv?OyQfgL5MfKMbziJeR?5#wGH+P z{`_*C;pWvBm#0pABYNqh@Ch@6_b<49Jhaj}?^%{MAvx(L(|y0@(&w*~wjSKSE~4O2 zfZxQh`)2pQ-3a-7Qsdq?mp68&j;$_!vi0?M@wwYxzq`MFsd0Gi^y#+!>;Edp|EjB( z)G6M(Ztt64qFL=Gzwqiuzi3(eUryn( zlV#RywVAi8{KpCQvJbWocJOSQ&u-n_VCu9%?sj7DR)be@>h1@&uZdfpEnecDdE=$e zfyk5t&2N4$^gh7*{P$rFoe)MPF6B*9d+bd*QhQtFr%jkNCJv zy#CbbYnnyKro&IO?p&MP$@-}?!e|M55vS{>mt3Ygx}x4!*>bhQHe9aWDU$WgN$i`% zzExL+_V&3gmzc}-R_!gb=wstU+;hctzd3c_aY^>mlsIXVL;aH1Z~vWG5pwR|zQR=p zC;dOtQz4ac+}Pt~GsDa~E!#Gq-R5|@Pyeh}f{WCy8;u`01*V!zxbm@LL5<)OpRK1i zT-z^vCwZa6pRX^w-zPn=+Z#q@cH&+tw^+Oa$bK|k`G)^%RaHQpToI;redC(~1^x4b@mdB?-*+gZXZtn4qR z&)E1wA!?~xFVD|gn|PEgFBHC!_u8>w=@hSutLvKVqdOag7k9pqP7}fYG2iYts=jdrxv^T1d7gS6yju+adEdXiz)c{_#}Ij`@zYMzTRi9R28muoD|rU z;N$e~k3fl&#mK>cgaH!Mr$**Nlvz}FGLjA z?_FHGr>!z-*}`=uTAvp@pWPa4GsWzjame(jbs6Drf2B@car{Brj(ZQbl?QVdi^%dT zhlp_dEHduje!`L6t!SFy1EH65>!fS6-33hYm`}JpIq$I`ULZ-xt2IvjQLgW~Nx7G6 zjuy@+z3%%%apCqe5{GSDtXYEgE6-cL;g$o#q=>$4p0}sAOGc>O2^E{(WnWklqj{36 z%6`_%Hoeo;X`PbNM|dr6~())jPJj7wG#fxmF%7_`G|0|Dsiba_b&k@A&0v zsD4xV>f+~$Zm)}XAGYjB-j^|Po{(ky3!!>Q*o6a=Z#JmjtZ<1gCVq>_Y z1LG&g4Ova96`ji7-aF;~zfD%EZAkN6jv zXRV&Tsu8D(`s3s?w=R@k9^myYG+3T{)#PI@Bu_k;{Yc9*=}Pe9c217FJI;2k;m++8 z&Q~s&)2&?4b$Vf!kmCoFq(fh1ggUiXHgeB)6qx^uvCBJLW#Mkgs)Z*n3NEfwiQjJV zxa;bBzPF7Gx6})bfBdsxY0b_|il@dr3#u%hd1!#C>~r@bl>~(=EK5k_QkIHm_LzQNz?n(pA!;+ zS*QR1xM>@9M9({By*TF-{;sdQ_n7oN967fXUze+@o`juA zUy+jekoTgwQq>DFb%nz95vG%5UHT>}e%a9OHbX5Vm48yi&5V1me*7&iOcQ7JGZfyM z7WVOFU)PfPpFG*>I*%4Eeb?Zar|4Sx()G=$&9<=uS$6%#n^hOz@Kt-f*--8M-|2>% zzB$*adT&_FDl1v&m!N&~bkCf3`;#r+DNk$^O`X1BuTHnN)53kvqo%*-a|^r5^lPum zR$oEk*Jkk?*OqNOG`soajklUIJkPXPqrCR$z2S+xUcbGncrMcv7rk%Qv*zk&7s)#K z-1ux<`>QK;PTs1b2|s_Gd9~ozhC9B-%gxSlOi`5jGC$*(?UIEDid5>Q7fL+-ReF)T zOM6*fuidOXfdw-0ZIwLYtEX+bzr;z(bNg;a+l2K6uU|Zy$oj47{in6UTWVV`+*@rR z{zduV?v*K~T&@$P8r#}>dA4fVsBF(LE;LGMG}oSE{yp;L>pu^VRkL2$b0ohjN^4i~ z-R~{Vm-$8B^_!|5%{zkJzt8(&{&z)@?lH0HmHQ70Jx=0FEP9>Ew>4Gx_p;wx;u?;t z1)qN}nEGtNk0-1xyay)kd6jah+}uX$R`^n(wf)v@ifywb_D}m2o2(Xl`_E0|TTcyk zOcFX-<~DKW?d3mfrbtY=73_YgbGo|n)}4i1I-y!N7w!K%>N}<@F;{7i&?&zL%R}L; z7b3M5xN<4oZ01hdr4lJ&wQpB;dWrD1zWCfFAFkZZ)H;~y@A1yWs_YQ2gT0R7>I1h^ zH540nUD`Co=;`OVc9|jbg#TSPaNMpn^>Mo&M<&acLq|PUC2W1wQ4pr^QNTz_K?*24hy;Q}1qLrsup35{3 z#cILe*%KRre!beJ_Hs%LtJzwM!+teWO+Ku-pFC^9#a~rhem$TmZ^G9JI}Q|8U3b0yUTLb^4bNG8wP*BpeY=)&#`lyLdu5dQ z^Y%mc6O`JbvJ!g_|0#a*;NO%x+iTebYx(u33qQC&Duc6PJmeWAc&gn;gTs zeDxan(;qHKo0lFePD=I_sC(bE-+tXLKG)ZF%*kc{rqv1AUcJNh*gxsX&EtQ|a~j{8 z@4WE&!Y}VHlcpNZ;d$(>w_iBaxSwBQj{S)X%32d#jQ(dmzU&ykPoUCEhDku+&*Lox z*H8ZURaUzq6cZw%a6YXzs886)r{agE@g{%Kvio0N%V$sc^I7D%`Q_zz&DUoc-nj3- zyXv~-N##}Vd_)+&uvoaP6;)kmDyBd6XZoIw(3}V-IUQr0i4qNSvjaLCuU*~!(PCNS z{WU#*1b$lAXRW!#!LV7Lt;;dj{qv1(-@xe47dJP&FJ9UE|HMP?4V`WuU9to?9zV;ld$OvKL&jpwgF5KsfCDIi?`4_WT*DgFV?}Ctw zZrP)chl)KX9Z)#)`saMFN5Z$#3_@--PvV)C9xBIYb@Qmw#luP^!ne-y`97PM@;T2! zqg3YGmdG8_cMaMkTlzcRh0UHjYg6*lep^STZi#t!;}*L7VSlqg;Pf4n?v`&gyFGMv zMdxL2==VW1nW-y`o#b!*_#(l11fm zpWS96+pjs9skncBF*Wo_&$X;`dFqt&aVx*j&Sx)@ z%`$ww_?7LI6P&nxrN8eztti$cF)iwe$CRDZ0*a^Jd02mYRoJ_QM=Z2se;K*NEM>_4 z+`T+f#jAMtJZ9_nx_|0UWZkH`sk1j-wR!snz4xlN@lR{k%?mvoE;_$3*SIlv^S^)( zvfGXa)qg6R);H_cl!{$zLNk|t;@jspllLuCuW5)&!o&18=RCGw)+>)=%tMpK0Vxbj`2aZs;p;+cy{X-C727oOmH z6u7(d^ruvY@YMbcDJ2n`>VV2QwL4B8KF0GWF->Q!kbBI-R|^mPsrxv=WL<%rMVL~i zBxA^Z>1{GTI&w?vZ00y|@;f-5o9|ja|6Tze z%c~~Yx5dtB6zi=`oL-*VevZkSX;YpL&&^Y7CVgVo@=lh zO%CJGN@J{3=UD%Go6_$v#J^v(Cm-db5k!EtwBVEeR}A-Kbc#DJCcW z#q1@gx_+wfRzG-Fx8|eDnermQz{PWD}t3~e)O;W2Cwf@zoKlk&WqZY@{ zK7PMOQhv?rBhzl4KPuC#ug}&K`A{R!xsmnrw+UtGFXvPk-!%MWJt3;{<;t`u)k(g# zADlT2eLA-~W|D<8?E{keH0?&Z3WiT&Lwum8N?(tKGb+;C?y1AlJAv8k6XiN09KH+iz&<_!m4 z`k(!i^ltu7?~saFiRP1Jc%y%@i|mk{-gbHQpQ@dmo_Z_oj<00z&Gb-gTq(VG>uj^N zZ-36(oHU`kNa5P%`;t-@->zD5d9j_k*q@z(M?_Z|JbrNGXn;_E&EK3Y2RSbtm)lV- zoZc7E^33GR9`_&nuC6jX`lp@s;xWNRrF+&UZTl73C~jBDWIl6pg8uv)hTDw7WE`Du zUYa88_(%7pkg~P(q(JW1n{s_|Nh@6DTbc^gZSLZ#sJXu+IijTzNyM~mP1`?{>R z;%M8$BG=rZI9W1J=9^plm3MwqqplxN_Ij{BZKOYaj^Tz6iZF69FOK-Mcj|n!evH&6i%Av~+ib*zD5e;$}-< z2Swq)lFaNy?2*#XYW?f@Z^fT2k&sw@Lg)20-)oM&GxhpsOl@lU%p^1`a@*lql@s|D zvKLk!cxvfAr|wx;`eox6f=YnGo06*T%o&zCxM7k{s1v!KLzjYEw__yZ3^1rNuUx51S6HRy?lNn!GjC z(?6j#Kd>YuX}fgFa!LI&0ePjT^dh_;(@dgYs;Ga3{Hz}^vmr3Euz`7^yt|-Q=dagkM<{b zZd<)l?%y@LcUwj7_U>s-daDbvJr$m6cCzRa*dj@?n8 zmmlzF=&m@*y03fTvy@21r;^_HO6$@Nr$0WPc75Z_wen`meI9=Dx8Ct$?Y+7FuU@)I z>-_Pxcb+ZvKKI!Cii%nHrtkUT)2j93lyT@3--^$L`z&YhD{nacwcO09Q=+BCIV#~9 zYdn9hM)1#-VQZ82W~ybg7VUe#!^PxNV!gw%6$@v1_+wFDUsm!za_>lsM#OD?%AQ{6w(jwVdd6wOnQvP2v$=li7MZK*UMz4k zDc`BXCDNgAZEeQsT64WJt;GLDf97fITlS)B)33mpx;^VG*Iv%p7QSds_QnLi&tX!x z)097~XP)BFx!5uE?u70K%G*u{NF@j<|8n`9)68Bo=lJGn=kpGgSFb;OUV(d|Xw?t@ zk4`&1o^&)HJ3ZyasV^08Bz8&7t~_?Xz1iIKIJeD(M?0qK`uK>MZ*D26{r;o>eP}$d zWrF6FlMWlaV%|;q?=soDvctjhYJ4qQxxwcZ2ezzYc+TRj%oV|9g(S zn)0v3L{*&S^zX968>}Zi3EI3O)8_Y9>#yg!7fLEM-q&}#5N(my_2+!@uS4Y#yp0jJ zjyT=2{=48@_M-RcS=wJuSy{17TDIT$+qa!x@9kIkuj}}x^WgRR-8Y2yiT+L4KFem^ zK6l+8rINe$N-Q%xcjT|t_lYH1+ArMF*Z7}`@V0U(-M6&4?#)~)cj*lmPMK>Km0h~^ z-7VzS(#9h_Q_7@08EajXgw~sE&W?|s7X3`S)H%ASUe2Q7-L^B#|2?zaU)S2!wEsDg zy^TZu`%U-g1w33^Ex#{1lN5ON^s<=m%R;=I-e@~qSYbLL!LgZTy3WH*0cQ@W7VdC) z=+we~xYZ?#vE$&s)&;%I?3P?IFE)yaa|-RyS*WPk<;5wVcx(!1(Sj2*%?qD_E{i-r z&rC$`$t8mf=WaJ?wXHi!GA=Lk>g5uZ3VnH@&90B-;;vFoCHWZwl95KmXNA~IruD3B ze(AS9dV9s&P0VbbYog?mFMQAlcyMp`R<%86yo;U-sRYX&OPqX(U2vsv?X(`7o$BtV zK$k`SFr+5LN4_$oMxvL%5!aP%-$x|rj)cM~-Y0myAoud)u_> z$U67QhW~y|6-ai{l{(S?-K58)@JOfV+@vp=mBrs1@9b?Cx3^QjaCN?T8(VKx$*XUE z!Mo#i-Ojwe9=pFyR@>O`-)W7&tb;1ktWWJ=wJI56hKp5skX&RSouHBVf*YL!*5>5&z|T^)vRxS2X{ z99r~tnITV-^O}|k20guOiB%U?wy#;7q1p3Ese_FnooT(oc!v z%3Jd4nE3PH+%4SEr%&1aIUvNX?rGQMdfrx2rdZ+d6=N-@V>%*S$_#%GWiIT^3gq;D z;^w5shyx02RxF` z&to_eqJH>VHkViDk~4V=re#I?UDrMSuW6l_hwCQArP|Z?dM`ETzkB6Y_EKB@!&2!j z=Y1^-O-ffBo1kHSvZY~5@G{dQE1Y-~vv)T48@=1W+;6>PgRYv+d}+;FCmB)$4fQ4{ z9BSv1-s+>^ks7tda_X$#uj3bFWUSNA+ITkNaZcox6RzK`h`hZVxYtzISALp+GViY! zi;YjrJaWLLHEP3}qkM5S%FR8o2Nc#txJ_ivYTBsMF+=}UMX#Z1huETkh+d0H2X4+* zih3D2ZO-p^OIAlmaX#)ncx{VM{7k8@$$@u+gYAOm&wA@N{c5k~md(>vG@saZ?^f&d z=y@GZ{(Cmr-D;cMG|ggDgROMMq2{HR)@|C5yh`lT$$uw#KAz!Db%}m*=5Xq5jqNLo zCBtSO*}*$m!$7iwf6n)POMB+M?P7?MUbUn`p_})+=1X-&rfG#=WuAL}>TO?s=f{a- zYOl8Rr>5ll226ic=IhM=+H`5j_wJXx{{!SZ9GK(H3mgv}a)}8zI@e6(s6cSeeCKa> z`{V!pe0h9B@WLjpvnFS4`KL#}$bMqRv6MT`NbyqMn?r1ebsTk`3OUa|Hbvm#pI25K zt0xsNo3`|EE@!j!mj|hnmM_emnq!*UJn`0%P%TC~&g$}8XY<$&Eswa+Bvy4vWc`=v z5}cO26(*BsIITFw>h)Ed>sZt@hh1iq-qdQA%a=Uzd-r_8mnpAI)K34Kcw$}0!oPw2 z-08dTt>%)L%&c@FErH>%^pBJYvnIMX3A~DBl{R1Vw?eb%ww<)rz%yL0o~ zTX%UJda^=8(XFTK-=rCF974>}7XodjaXwWjtel|HWzgO(5-GaT!|9)EYU@5Fg)>=( z##i1x<6Cq4=(zlspIzgjU@^dJAgs5Vgn}n$0D%V6+t;SSOvrR1re7Y1a z?!01JEP1|Pq^QM=Dbir2g{`~a69c2B+d}q1V!Kwhn&)da$GrGtUjH&x-)zRye`y67 z6CHg|IL+_&`DoM@SZP%_{bzQU`0Po}iIdjUXDFq8Ez;O!Aa}%U$3@=!n#ty@FFR*> z#GEr#KVWc1fv-NFXWBx&S1!GISDL^4Svvd5=Z*Q9c{6-8mpQ9QPX4F!(4J8$pz**0 zV`Cxqrl+gt1*yNNI7iESc%+e4y%#qUcKx zH;d_O^D->wC$X;(|D$}hrR&`L7gJXFo4m@JBDHDa-~5nv7h!w-FXyeFYKrat$RcTM z>Ln|bfmM>q45SB02h#uk}imv78Rjy>A6_S)t}%C#p$gdR=nW@brV6BI5Gb@XAY zfyxP~f37!Yes=BLuzbnQh;>J9^cOtzs;vyWHs`ba%dXB{Yis(l)2sI!zvZzq#Kc$s z^~w{qO?|CDJEeVYJk_f>*&SE5H1$K_6?bd>^{t?<$UN^l`cC$Tfa%Y$>6aHzt zx-=-??pJzE`H$e z&$%^qp_s~Qos*u&l#WbUb2&1j@<({^kRtlac%hxncM zGX)*}K160HdU{<-YhRPyEC0u5ZdT~-_1n7Ul*~5Rlfvu#X}_#lLIX<(x7nQRM(>Ej z%eL(_aXJ36>G_oeYh6`gwsv)u^fZ$vFEpP^HNH9#RU^0b?X8s8u~BN1H1c>-Z(Qa0 zHo1JM&f5J9Ti#51QK7(-{d9@Qw48TlA8$&pS^LE+)#$ZqA3}rCE;y;cQ!Px zdcnVJ=clB}yFV>qx81G2_w&*EB`1I7O;{Ng>M(mBYg3w5-YnLg7q}U-pLo_Pg{;5j zeEa#o?+5oU4D+5gF;gq?-o^JJQNl}K8Yl)i@(Hs3GYn`<4Y|O)A@_c8`vD1~r@u;d zuO%$aVA{uV=s&}S_f88GuH>p)Jo>M8nDKu;uh0dBy0eV@htx8h8Q7heGL;#^PcfA; zv6z2gN^d%7r8i>=&%_@6zngOJPkOKL;fR9S!?;TvH|!3(D!C{gIkoc!=e(kKDh)kp zN&3sne6lO_-tJ0P)OotQYpKeao{fK)j$S$GRr2!Ssw1;9+!f;9f1P2#{XU7)`Vkl7 z*=#+w-70O~bDVh+*Kx1kP^RZGz2jZiwPhi*+F9Rj*#7C&_7o<;TT2x=9toe};5l?) z-#dq2F`71$j$Kknx~_4^#K1{)-8mlRB`qSAzR_+>m zUhsWgH{-_ny&3&X`OZRF%XBLk`70LkR4MYjV)EXl#-*AZwS+a{lYcv3Gsm$rg%h0h zZ{_V`c_f;>Ok}0OZUe*Ya}$ly0uM&yi?%-%(!E%a!{n{-Ch6EAeF2_nddHM!Id=#h zmCKx{5cl5t)=F97qatrFD*yXAaK#aC0llpi=k6B0*>UKD+|(7q|8kwg zlJ$5km8u&SDK|~hNY2w#ej3T35-xSLeT|>m?!2R`E_oH4%03(p8U3F>}8(sD_iJL_E0SC)y`!_ zI#EfQ>szGx+cWd@)nzwcIh60R=e=2}@SjDwOX7MrSrqHNf3?^q$i88{#tam z@fiMlsL;g7(7?D#S^cQq-FpT_JWh9a7;}cdv2K6!-GyU)8^7Mq-gQrc{u;g3OIBjz zekA2kV>w2V=y$q$n!GQCzDR66>*K($ z!rsJxx7C{AV$Y!lekGCcgg$klVl(bGcA1TVKVAq(9~1U$inRNv@Z5K+mq<=W&h|6h zhCOF&X686fov1VGqhz(B)bfo|-2HPWy;%0(tyV6RuFoS&dnLsqg}${9+{<#6Hf_H9 zf>-U?$Elkx%6XR9G_CWTYr^;ZjIQ^JbzxIxT)UERw)_n$+cxT&WBi`SdUH)g4-TP#Z3(abiBHKW2`uC>GH=augbAGcL-`z|xF zI4>;n=s{Rv=+Xx&L6uv>-!kjIc&t>-T5<1zlg~+~QUgEv^zTukxAgig*6N@8)9w{n zpp+t9zrkJOMX`oVs9()j(>dNNsYpJ{@kXhieXZFjmjW~ABaC;fQiW4Iyslf(w=g{{r&R6}Qn z+UNw?sOJXs<}2N6;9yWlS!*1<^FjR1(1gHic0CFaikqHupu;UEny#%)2<*QqPn(ca^jB>7WxQ%^T*m^k%S#HyIa7km z+^?4jA7Y*MfOT2}YtE;Ni7gy$;+`Glfz!WNPJF=Hah@UR2)6L6D!|OkWm;e4= zpDEtZ=`d~C=7vCqJee&D29821jDoKoG%DU`RIF&y{Lv`*u*uM(S^vl8qO;Zl2Ll8i z7P(fmC^LKPS)^iDG0~!P>W=*S9i4N3bS|{$5?AUFe5lyupxD&V@mjh2rE>S$q|SpDol7fv zPVVSA8?ko94@I?5o{$FaCWh1_2SQ#i4is1Fp8lYB_m8f~G|mu()Gba~pDj|~?a=)g z(Z_CC=klsYv~r@P<<(0Td}>qsn;CRN{v~uj|Ixd1L9cqGb^vSWz8#a)XZA;`P4f)(W^^Z(Vtelp*b6Wh(X_-H#m0C`(l$>5$IlX@8^v22=tvhEl z|D4e&IkVSt=FG~ObAKkw?VJ?q5L(mF`}%Q$m1XyBi`lgcCfiqbhgT}z+R-b$wRdGV z+q#*(A1z!twoJVHbMC{NwTpJz{i+DM7^%8Wapq2&V{nS7M^}J@poCLqso-SGg5Ee=#YH0$bGTR?Vq}#2BtPvORRVKy8T+> zYqj(~^V0CBrLMP@dhc4A`fF*r)w0ZA%W|!jPi zM}Ktp&sh9YZ@!(C@xonymfZTYtSV}))U^%2UM!ljX@}LSmA_W6k6OKZ*Q(7`xo4_Y z@3mTUe%ESFHjfo$iWxWJ^j%ubSz7H?*1fd4WahF?ao764zj_ukdE7|Yz*)WF{(}vI zyEll=-XQp!S8Vo1{@)w9cW>0R-lY0_lcDuy)9THZyEohZ-t1_-#kG2i=k6`OzqbTd zZ`gk*Vb{*BvA?$_T5n6O-j=z0Tkh{|h1T0ktG8F~-d_8Ad!zM^*6JOdyLaSTvobL; zSO<8sbF@l!?|m1{z%V<60nbsPyhuld8tbKJrlm{|E>MlRysbRPC+D_VdeZG}xz@tB zx8;K9nHkUP@BQNYzk1iZRi#^Yy?eKAo!E4d$B#^0Se037ng7T$G92JnP+;H|=61g? zBR{>RqhSWucX3@^W@T<|V`F1&ZEbdT_V4u)(w_@H|7&k(XxOmf!+iVtBS(%LIl5F; zRdwmorKzc@Pyc;5d2-dslP5K`w6wIfSN~~u-u3E#K=@?A%a;rdu9zE{n3!CC^n~g@=b1YUsX#^YY)n=Tm#%*Y}S9`MZ9xcm87U$c6$=bQIlFD{QSKJS0`lQH9Ix#FNIN9)O!obXuW3Rc}4o&o2x=B@v%YD&?h_%~} zOLrZ6)bY>dk*ArMzlvj1g-xHyG@qr0lKyGlW>e3l6k5jT`I}5V`;?RQ@FQ>2>G~p` zDi>e)nT6|2)f6d}d#<097Mf`i`POG!$l9xtJg$$tw}<7MMCydT^4oeXXRD=*?=z3> zSKpOX+Qh!|NxZaf$%@B^1Ws(Rmif}Y@XvOS50*?2PLEy!71D<4N0OGqlPe(1~dUq4yD?w5BgG~(c@ zsrRW^^}S;1_rKx!7YhF}6rA{!lb_M`>90aX-{-#xDTb?>1x!rW$hdKA{=An#rl;_5 z!3l2-ofsv3&cz%_>dnm_yRLmctg$R`)#41ZY5R{%T(Gmg|4>Dq?Sfu=X`bVcT@7@) zg|B?n?h;-YcD{eI$dMKPlR~fPbxAHgtKuu<8s^;fxYYV}w`A{|72I!`yS4p{bERxU zH|tn`cicQj+q^5-#!vfPQEi;QMsn5fm8Uo7tWx#f{6ENJs<_40s(I;LM~mi)vzHy7 za&Try-jwGhpXV=hxSYBtc87Sy%IMG>(FZYMU+Q9G!Wdt>XRd2vnwoLSTj#8vZqX*` z`=^b6&oSE`^7rDJ_0q>Ym*h(Q<=wNwOY*}W&C}Ua7HQe865g6~_xhYIxwogKXXf4R z4_=!+w|eHPEa}`2OEhP_Te3|;>agJ!$=z*I+{dc+UTc5NaV7u3qz5VgG%a}yYAR=M z4-L=Lt5U8kzr>&aA;&r-wDYHp#nYP)4Yvs2N;mAEzx0-kUjXl1|F0Lf@^1dpXyZBG zuQoX3`gbFts=%`u-wW%ymv>-Dzr>wkvX)Mg4=@zhsYXisWv+UlY>EVwcWu)+)H( zGI{qrhPF+t1zv6S%`0x**E_5=XLp4&TcEX^bJfF=zSo)uIo3(l!OygJ`}zkc@WB;9q*pKU@v?!KRA|NhrIf!Yts2l6WWO@6t^^>t23xAhNa z&AWAd^P0CmZug#jDy6^e?)xgWs)v$)-{t;0IrrXt!B^aOKKm4wzmGf0`R(5K$$4e9 z-zJ=^UF&=LaJh}XpWvL&bFa>ycs;UFEq}e={%;PS?yz4w{H%6v(zlNy_je}CJ+80b z8T@wFvEO^d*_^w*c@{0XcR65zXo~mT=0ztWrS;37%6(7bX|z5$Q{$hZMX{v#nt2Xk zj7o>amD+@aPyMq7}&66DKVnr^=c^y|MU zalO;q?MIoNn$(trmx8fAZkn2%r~gWbUe0Ygs1;I!OMt z=HmXICf)w3W0MwW=5D>+vv^(8ku$F~v+t|V-`X49ro2z{H_x0$+1u-{t^KU|e4X^P z_dV6?ydJ51moM1m^B_0r-22Cx{0#wmETx^VS})J}d?H-0C(81@>%|itGQoOInp*`{ zevRoc4c0qmxl`cvQm6m_0`(O2w$7OGGsZ_XT5+k}N|8b>-t!{CiphFgr|kS0bILSW z@wwg3DZf9)sI>&F6wuom)A2b-PceGs6tkT%r#=TQ6bN1!q_#B5G9rAXVerapW;=sk ze+^1)2v};Uw)NJGlW{B0#V_4zw)57lpFxiWf|nMnExi|UE9kXh@Y3&QJForz7$h!G zwUk?JuU*IIsQ=;HZgG4rPJQrrf9}WW$Ck9a7l*vwYFNAMR*$e>ZjQiOL;Gb?-EHC7 zjIDcj{@8sh=vH+0$}L;Bykm*TP1f7Hb?3@!v$DPP(|ML}ivAgOi#srTE#LCm9lvkc z=|#VuVzzac?W|ii{DsQ%+gDFrcHE~9i~lb?dT?&>Z3afuy{{iFvvY}gCZNi_nvJ*lWcS3p%G|594W0)S zZwX(2q4E8`#`PTMHT$Q_{hHy%@131H!G5kF=j&e<@A90JZf)WGcl(#XgnMQSpLmPU zyHxyX-x9-z#jj@^{9XI1cGBy({^`M6mYM#jkdc7oVC{t5$q$^Vhg{ zS8h-FZI-K7aLrJ>;l`Z%-%HhcejENbzq*j2^jS>L_0^B%bXLp=`sU>IJK3;y+s-M) z&z#QvPS%v)xHKl_Taf1K63tIa+d8ysDrMF_fd1Yr8o1R*~^IGk(s#jZz z*UE3)`cF03x4xosuICkBx1IlQ^?WZ*j?)uZ9q{d#)4uHDyKlBG_56P9T4i?e`)h0W zK6-X+;^yq%CRf)Q>mNHO`LbAj!}e7-CpR|1kWT;0mdlpZ zOrQR?)GP0@Wr|j|(Y{N2jh8-Uy)OCu*cu*=##n#5L}mV2{Q^Pf%qbbI`e2pNcZbm=I?4wpEx4@;Klw3CdHzIQ=jh*6?h-#r@-NQ^#!|XB3IOosSe_@yFz50< z{hwd=a4+s)+*|#}=-S`TD-ReqFl5Xx^*tv1>ffD}1;r1NJmb^!*a z=L}Wehkxp>4R}6P^xx+g!|$cr%F?AGw-lRKa!r`X*kXV9<@B?AKl(QssxnUd-nd4< z&W-Ed?}ug#tnv;vbGVEWjLvSB@(OO@WO6;+yf@CfOXxulC&S(E>rB7Tj^P#IMWeH zkzobz#|evE5+sD~)t}*=xN}dY2IJv?6)z&}xToYj2x07~&uv?15_@Q?zyfE(L%g3t zoh?`1`MPmS!ENV^Beo9AJaZQQIeE;%^OfS|?+0JJbA0*zV8S!SEgPq}{$JR!y#2{_vW3CzoeD1CdM^voXgJN8n&+d`#{z4l_ht{HPqb zH-=|&3aGNq)>dPOhd@388Y4CRT|TwGpk^PJg_+)}=j&mgZQ;SW#s= zz$vw zrLK<03=C>3r)*q#*zn5c2(Lw_ROcRPVMzKKaP9NTdp{E9K z&Ujs8@S#c|^mEO!i89mqZd81_lRSe#N7I5qLA+l*-F0)pEz@tNI@=_?eqOhW`D~jr zl_@9A#;3+^i?u@YIYF5g&ZfQlJr)?L<}O~raOnAIr4SBdk9-@xiB|h!OgHB!z5l9Y z%&a#5mCh=qyR|oMH?eE?+sQj9v2@AsH_T*zy7N2h8gZdeu_ufSZ{l2^O>Zq_VCW7J zY!6Xv4Zj(YajD96(nY%k<#OACILuBnut~)8%i8dl3Qg4h5x6AiC5uUa`9z&_GYhf= z``3wCxw`GVvrZusy9$WVR|e)x7o8;kBo1j8@OS;GALgUrFF#sKCKA%L7M_JGXyv z-pMNRF;6VlU(7Q>{CIp@*PZlL2Y-Ylw*TMNaJafZ-d3|s{(SJhGizrT1bx=h>*^Y}Ydzs%%ITTwGOg|x))$YrNo8+mx^(;NgQ(sm(V=UigVvhv$+)AHX`^)5 zyJ?x#vg=Nt?5!th)E579HK^Yt>o73 zDXm;@SUZ0^TK;yd`K7q|x8knf`@??=EWY|X?swo1wp;PPF4VAXNZInfz3SsOc8+~) z9Us`Nm%jBZVbiQ(Te*ona~J!|ZS0c!*k*oci}=xYV^wuwY1@uX?Hs#LyPR%g+1J+c zp{@QiZ}$tH?w>rD!)_O!(l}AF_+a6py1iDD)A(21kT`jHVck}~(`Ee~hTks;_OE!< zTQs-ti<*I7|DrDp3Tq!Ivi^2|vn%jr~_2Q{nR8@F9n zzCS7BV0^~Bt7Z)~7d{3>e}7w;vc2%-TSH;?9V(I@uissCn7hJ!i_pgok+`FU(>td8 z$-eSI-*?uZ!cAG(tJ+S!dVBKL`jb_AR=QP8xj1Da$Mit$nVk0WJMwmM&d#_{zU}0n zw|kWAt|-oYIWhA}rcdtCHy<~>D-5^ezSVv)b?(g2`7=u^Sf{f12it5avpG?_C-QLB zg|ZY6M|KOx10~PO(imNW&K}YEar8)R*}cnO-z+{iN9Rq9>9;%LaVLFClQybq32k}b zb3SEff9_LLz1q_@f6m!F`o5=YgWu}28m0`JTp9HuIoK|X31z48yp(&xBv;yz-?t_G zTUgqzSyDTG+_RPLGM~R!_W!KCCmihmUq5DIbB9eRkxh+#d$0ue%W6-K`k&?eR`q<- z1iV&FKQFRNFGl^o%XH?L@P8UtZ6&_jHnh}Dx?1+`c)Ff-^~A_>KW{U+CuyyL=4TDk zUF8|4=B(*md?rn=+NiJjNxZ^6`Maj(_f56FZT%k4ee@0Y?z^WwttP~BO>o@wx~@h$ zYg_j&TkT!O+Ex3yEsa(e{#k8k{n5v;_~ot@suiaKj2|;5Zd=m6q{cD(=&spIH+8jI zw>UK$a~c`k{aO(A{d8M{sB3IP+@GqPGcuxwv~HfO+VkG)(U~x=zd^UYhvlC+q40Lb z(VK1SZ*$yTf0pb1SyzSs=Qio29W{S>{J^p+yfVkmOzC7wiMGFEcPKBK;l3$!)*3*Th;hG!xVpV{j*zfU|*-wOiu1rP3}n1 zrvH5Moj*|=_#@x934P}f1*2XCrt7faa#bwEFy^j%yFU+xfm% ze5(^`t`Qri#5!lb@*!Qlp!X~0pLdD+)>wGH@yj8`5ZQTh3o zein12A|(%=_>+HK;ICWH>+@l&9ebba7d47kR(&?%`D>Z(V;^t3@WvA*TBU(Lg zF3LME&AQIx!p&zwmi7*My}WuBN%}@#(>8G)U}s&|&bp49RZq5PO6}i}Qv#uBZ$h-H zp01YgY4O~_GT!664g?_KUZx|4UCXiWBEcxng2fFz;5h)UQyp zR6mFI$n5h z|Fxub(yi0^cdO^C9TM_$6JquVVpzoQ^mnnaZM%l!iR<6%dk)0EKWWAO>Ap4Bt_e+C z3|#+uQ*PV#&TF=DD#%rNQ1G_w!kVI;|L4j-QV+eW{rc|XpRymEE(jlgueto}hQ;rU zU;p^L_`NYcL3A`Uw9`j00bW^K?@k(5_i^sRFF#~JRT4;LI0t`M`eJHV81Q>x+c z6s7bHTXrs;5NRfNJW=@Pu3ZOgCU!5~d_!+nipKntPe1);sy)@4@`(Gvq5vOTk>yjp zmcF!fDhyeicrjILOIF2=^&zLPS}zGR3e619?q!Rp+7WPmYt+w=%{9CK?f&W=_|T1g z)0OvS)e8F>1uCSzvo$Z|Xi2&$#qYM*@JCZ(#jJj{$(mp6)g$kmQ&JR~QFS1Bw%Ovd z8OJt9)+9fE>7BNw@uBba6(%ct_1b5joud5krK;YcJ9o~nHCwBCTf)haZFbKzDY3Ht6-E31~xie)|Z;?;1&`0?&YyaAt#%v`lg$vFfKRxwd#=L+1 z@*jTxX75^A|7Dg*T!z{2&$|-ltrDE2bL@G-920ky&1zM1*Hu3;pM2NaBV$+a^P}^b zH$Liqmu@Lo`A$hkZdT*<#Qu2GjHRv{r*2<7m3#5^wZUCAJ8YwQ_xwm*;}Mflcv$Su z(~}wQXa6TSPhoL5)g`?&<8@o)lFY6}!m|wuratRrP`Y-)HDHO|bJv?yu}@St9CKH0 zuBdr%fOF#E1*=s3_Nh;F`xz!G&Bl6$Ra;X|MkUb9HSo*@&B{V2-<)Tk zRd;nxUmC6TSY`buE*+N3X}+IrZaztK{`ul5*GV0bNYUHdCWqzz-Z$rUO-bq(m6@*6 zisxj-PraD*!ev@ow2zqarNtlSUJ~@HUA*GHZuOypbzwd zmc$r0LD7skT%RW|`_6XZ--3jTJ!RrCYMji^PqcaR3!Ilq{ALZIV!2g@mRoDqm99FU z-L9sPwL?#uKka{>`J3ZE?v~&AzGePvRmtu1+e0)PkDvU}vZMdWlXTnnjn{e}&l68g z-5WQZlcnbJZ^_LD>nh{+-#g5Iyl$3T80Y1EKI^YNdXjTH;wK|aMi^RrL?IFYG-&W8CmIzK+DQ}7+8O3I<UUBN|b5!C~m3yot}yl8pOyD304$hmK6hL2>B z*2zWjzx9;fTFg6?GSl=k9_vS%goK)%dwu)oA-(KkWoymHGV{9EIiK;4{Lp`A?+uP3 zyJMfP@|+csF`vq%E|@&w#^omSogGWx^%|`GcPiH*VuV=_11gOo^v-UoqS)Z`&56|ryjHD)2c2Es_(B~%-DPJe}?mi zES{t_*V?;pNh~bS>?vAfcBJ*zj0vCfw!AxaVb9;4Eq5LSJ=u~qNwq(K&-+`#_1=O` z`Ge~=@FY$DJy&A7+uY;|8|jtXRI~Yx&P`lfZM0IaxO?Jv)^#cmc5mHcyJD8TgZtxxhu|dRQ1(7>OA+efA4j#>G!f< zN1cz&nEOJh@7R^qS?x=SD5o?0JWoWzO`h6R(anko*%LzFPV28@`Ln*0VcY zJJIQ=IP-MJpAFMiP5)|Wv!6MMkgb@ zSBh#^+bOwBFY3d0>r>%kb0ShiN@g85P7%BOIXXM>kiKS7^wZFqd0Sf)bom!vn6zLy z_XYDVb)uV(sO=xo^|B( z(oj1fz%Tbi?9}0;c&^*!W$oNIs^fp%n)0bq{^891X_EV`x_DFH?RBi`TY1jzNnQ4P z<86gJ1=&W)@=3Bi*2`MfEIRl!No*eHoXSfF|4lkK^<|#eY;WiAsX@)>FIffURLnlo zvoW0i`$h%t-x9&|YPT@?%{Oo?ojT*2+G~MdYYx8oJN2Ma$Dn2T!?mi$aa$x>r`259de83staB{dW72z>~SL zt7upp z^gHlzU&7;eLMyh5?YduC?pH2Zvu5AdQ`eZZ_iS#gnIFfm|Le57cg4>4do0(+tk8}8 zxZgIwmg%xUN97jti`juIvX^}D+9egV@}_G>;k|hqj(25!oBcv~+ph^1yc!c24Icbm za>HqJfx+5yD;`|*y#07d#`L}32MCkr<58(o|zbXvgo z@;|$E>-XMzvxC#?wwM3o43FX||Goy?{3mVtcjC5p^Ti+EJ~ZLL=LrjVm4$Cj_+Vt{ zZTkJBDEqDI&BvIK##|QbuZ^7F0YS5=k=9VZSsrqYV?d-?lEyrp`+q9 z!PJR@q7x^&w+fn07yLS5Vqf#Z>!<&HKE~#HP0`~XOJKo_Pc3Iob)8w&dFE8JkLzp= z<~wfAVbeBgH%d1@tnO1w%^KEJPMz9&K3(Y`t1rhEuD{L;@+CGWMR6Q#O?GU{-6*|3y;|x=js0A6 z{Y`IlbrUrsx%s|7_b%wjRXE0c_w6EO{=Vf36+ha<1NT)VEX{Pt+7X-M@Z_C;l0p0< zu9~Ato_W>V9<&$U51#zsT*&R;LjQkHyi@w^&DGLvS5woa?pE;MmJz$Z-dMJ+PPnsV z&&&Au#}|zXR~W6xn-;rWzC`omp1IeYwB?_2Wt_Dz+S#k}IQV4iIvb7UY6aOw#jVGt zh*#9ieOe@TDrfphuHDg_J9pgWQ0FSQk~QG?#IH5y^n;bVg;K*76dB!oVto2=fL35r zzmmk8F5`+t>rXcErxZ)u6(6~*?0nup{=7h{)2B{TCGl9k9Fsd+q}^7n;t92jSCYdrz>wU z<;-yo4!U#ZW39Gx{9_-JV%tka1>IUH|AQ};3kX|8PBNUkoNs1m-$d#7r~{9KpWO(& zpb}m;ch=Q{&~MsN2locf;Es8eG=I8enAx7lDf{CdwM|$Y7AbHfzOo@uFim{TiTOJn zCfYG+2!7^1sITx@)^G93Rl3pZH-6-28rmvFMb>hUO*;{mWZc?9cdzDh0|E2uT z%Ij7rT|e_`+J`&LrBmK_hfdu8(dvX)Ugb;MylHR3r&T1g_52WRNlH0g7|IhAc7Kw( z%Mal-(a$clKQ^pkds|{UZ~pWJ{gtoRt2;!yElo}BUlDfV$91P7F~gdxhN;CfT&CJ@ zPW!v+*Pqhgd&<)Ox|x-@FEQU>8dLhxFqp0T#b;~#@Vm)oYih%a)5Vl-gmMTRTUMF8 zdG)iRO&1&_YTf1g+wovU{GQR=!iwU18S zm;GKbe~qecX7=iDPo1BLD2Q;&C@ol&&94}+zA7{Ma<=5@b6PvHeq7LP{{M38g;%Om zWs0uK6y-ZS)A4((G#I)Rm7lj3$bB+pX_EzHfQ^;jM{X9tUbXWiGyqs?OWpsdRCg&b-^#boOd& zU72U!a3-hi+mhO^X;E5o&aaQhy*`xs`rY@AM{1|L>kht1PnVK0z8=thw5ua@)g;x{ zS6g@Htc`WQv+qUjrq}9n~U^kTIv6(SFYZssF?WG z^Sk{?^Dp)lQ=8RiYW77~^hF%)>w4j~;xM1(ogU3cDyK}zr0ny1kw_V-u zcKvu$duvi__uR>E1q~A?3kzFcJ|R(g;@;PpD}8xgA8uPAF-i8Pb?RDq`PhaGS3W6r z;UzaW_PVue&fz$C({ApL&RZ*A>&kuHVpz9+8tWq^jk}MgbLVS)sFMv!E$sZeg!ShR z)hN${C11~LWlAyKl=#1M;|t|#%3iJ&w z`qwh+TkG`HA8MlNZN~1#x*sN=Vv9En-~ahba7<~>-HzB98L=S-f{M4LxvX2dpS}NT z!{hzINl>Znv3A|(WSz?iJ&})PHh#I%U9@pciS*_bGL`;&*Xi3Wj0m-jy!chHducj{%vi>?rE^cpx;F3kJwryDb?aJ!DORLXaTfOe$>UW{9H=boJ-+o!E(UE&+ zqtxa5G4E$9-Va;3)TdqPQHXZ+i`^!V4u!8;CAHRe@q4%9msgv`9d1)HZeJm6HTf%RZicHY{J?zbw32-Y|t9Ke#|9>c$%>!yb{tG6z`SD_oQLrS;~=VW0kU{YuuV3mdi{ z>Nut{$vxv0|BGk*Iz`_(9`b*lRW49g&KqyuwE6hei{E@zza`k0&nV<~nPPF^`tSBg ziIumKzws?NIpf?Oos_vTujbkuw%vGOX5y=L_B(_>-b$YL)YkL9PyM?{zpE$TmtEfb z`t&1%nJIj4s!sYiv3*Tu%!>Nzt-PCg*IxH~TX>EX6u+K$`h}2jep|xp$YR~KtBb4t z3LIAFD|CwR={B-dNjH8yU+no^CbNA7dF{FB6J9TWbIW*r;AbYwrJ9Z1XAUGS-5SsG z&ip<{SpVwfMQW^VEGb==r?wjU*Viq3c)Cv0Ika4Rnv%I~_C&i=N9IOEu5|gm^2m}^ zN3N|pQ5SvW@$NQ{rYVnlg%cw(0;6&Q1da*@WUbP_byjyb|L(4k9VYQR(rR`{y}9dA zV6pUT{29Nshhk%1Fle_oPRO1tn5T5)O_ImzsBf!@ved=n|x`TftC)tbcZSUpT zlHVAovoK6&|CIllKmQlcQ-1t^qnfB^l9%ynL*Zx7%EWXE`-M+`d$#9?R%K|w;w%3e zKlT@MuGsx;>5Z1wlJ6@1|4+62-Ila2B7M#4^f&)Csx#8}-0eTB_xrff51FmUjxRZH zeS&fE*&5mFWxjc((DI3D&ExpDQysP~7OGn-mA*RZ zwaVYOrV@{LE;>2M?P+eC^VjcdFXms^Ja@9BhxDBrMedoGD)%4gocr=wLOttd{cYY0 zO$=wG7pVPmE&7m_`|qmLQT>ibg;O6L)$M!ArNguM4~N*7dGXc9_b242)oA-Duh6NT zA^iC)?*;Q4`%Legi)m&0+GxcsQ2m{=WaivB8`kvu-O9K3uU@&3sm^cT>%Sqgfxn)v zX1*_b-j9>F@b;VQN77fnlgX4QJ};p*FKGAo1q&|rDhP)1Jnv*{S`eW5kih7I<&DsWuA-8#B-k}<`~U%+k5fZqlqd)Lp6bdoFIGnW{Pb+! zZ{<6W&+804=(1k)?e}k=%@%$VI2YX1m;7Xoi(2r$)wk0u8`rrs1{tn)Q9Q9SpygTl zEV(0zH^Sbw?Uzrw!SOUc{?I3p-_b4yl~;1>HcfSB>U3T-BhmH(qn36A>nsP4jUQ^# zl@-sq?C1PfY|^k|j&$am7M<`U3%T>wk((A>X$cZ4T+p&lP_t`Q;GUQ3<1_x1$Ot5r zER%3sF1c*6*JF>6*DobH_a2r!?q#z;+G-&a&)X%Z`Ya|%f9x_AUHwxpYVA>>RYkHP zu7)}qGu zJ;se)qKEGJG#hL&<2?JI@#!tqz02;k-c%@TbB?%C@Mx*%-H-PQdSZX~2J_sh`CR&Q zegD1k$(zgzj@*?Hj&?7cyCArCvZvwVvdzBo7k%e`@i3az`=KY+r+d;Cb2aCLU9+n9 zW!fzL^3rrQ3qOP(yr(qAu~J8M;LW^MGPsjRuX`!eUgo&N0i+*1WUO`^4rS--A( zbn|^dQ)cK_%S`6?es?&xzAFE_yTRuAKY^kz>`@j>ZUk<5T zRwquGac5S=cb?TJrP~zF?Bw~!`%7AO@|9xcV&?fmX2tCm&)i?|PFtqdT&mI{rYgzX z)x9N=<9KC4=L!V<`7)9|5RJmOTK z;kl~{)qj-^9w=xN<6G3U)a zzm-(2r2cQ78@v2#_tYoTlrm>%imnhaUA*RkGmDj2Hbvdb=&zjg&*Fw>H7jm- ze$$sc6(TrYDpV|eo&1dE44t(irCo{su~R=coZ>p_ba+{bl}*-4BX!olj?;wL!nNMS z%linH`EXwA;+!a#nlXb}NKs+(Q4s>y|^m#%*~?YcHf z{L|)KuD3q(L{Bt6cbO*0JaOu_munQfzq5y3IrB7)Yl>ThWthB=YyFp*N(m_p$2Tp@ zDqdDK!J&KY^tV%Q$)6Q%zm{fJ&m!HU`MvQ?*3+zysZ*yuIkfZ-gXYvC^|@ZAq3`sz zX2gD<^|f-HXH?xq_s<(2WOOR6zM{DLn3dJ!S(;B)bv9mleCpBxDd}6Pp|bm@e=(Sz zb#toII!^uUxr-cU_uZWAHhu2zXZLrRG%D@bG|O*u)iUR6&m^Nu*)%)W`Rkd^Xw&>_ zF`;1I^!`k_zR2j_&#M>m9KT%>JAYQMwf3jayLy)8#Y#CJ^=oxVF0tM|mE+kAX)~Tb z{=J2UTaV?Jox65%F|RsH(OsYW&(6*EV_Q9=K#_y7|A26T+bVgJZD#&_;mRRt`rq15*~-6_V9*j=5y|;^N(G0Kd-NrOZ;2tijJS2oN;%Qrp#Py5I<|J_?N{(JB&*M54=*! z<*SX6d#`&se$Bb|TQ*Ci=NLaoWo5o(xvBo_qvBh0&TjpFUwgu#XQ$otBbK^6T$aGO zJ&SRU3x{g1Rlnb>r^Y$!W0q{*q}X!dsB))l|J*N?N4z$?ji~;#YUOLCko}^{p-y}k zPiK@!1_ifjx$Rgk`rj&A|5r!x6I;FNB72Q^+3l80_qX0CiY;9_wfyNbt57b)o|(w26M7`m4gVaB2O)-CNpNYsV~%(l&3@xRxLjfWA!Yly()rf@2i9ye39|aX_dN5Jef6@x?h1)L%jbLdxs^d|=M2uBTf>U3x*s*( zRQ!!2zEW(H|B<)n%#QZ0U!h|!rFXMM=Dhdu&%3AT%(q#f(qa2;_q3Nyw*Q`W*Z(}f zeL?Ac3ybHw7v)?%)t1(~B#hN3?7+5`q<2@lv`(~cW0K$Jbo#{R3;&*e`-6Hr=bT*sw?rX&ji%3>WUqwOuVvys`pkjUVs6dGCI; zgv%?QQA;F+aZ|{Ves#N&ta+zu*pffSMRUx#>=$s{RPd4Gvyc^Xd!{e?!F2KTxhvD$ z>Jpu1r8idHVpA;3HEWqAA+V5P`LzqL=l_dmn3&*0UGtS4VZHFe-K)$~4=!MDgN&wxl9c<=fwyBK|Nn1czMZezZzJ zX{tDr)Y&@j>N45iN>vkrCN28avP$fiLXndB$yJNeZ2uk0E@b?fsn{$Lvu1r`j>bf( zsSn-T9P<=7AMaHYdf{`vN2>Rhlz`mR4LuUqa}(FTPl~@SI{V-Eg(v?hHb)DluRXE; zlCPVPv*>J%vm%SK1XS2ERE|~7c_^k-E+8b!qT6%dRZ@F~OzX`Y5%>Grt#52Hr(ZbT z@ge1q#L+`6Df>0M>WwG-eW>wI*+ESyOh?IGZB>}gDtEQCFr74aH9fa&mxB$Af))z54fE*Piy8u+(Bvufb};v>mMRSGC^*dd&N@eNlHB+VYH?LkCmL=%Du&^qq z(s`ZLx<5J9T?gmITl*&%M`dkZkuDgW)$P2{y)f%!LfX>pI`NAZ-j5X8?(?Q2@R^6h zOA+p-H4LxM1U}Poc&QZjOv(M_D!0f@HCfqiE4_oPrUxvUvse74&ch#bbmE;APAtsf z$>#HRdwDnN*@*zNsCiFpy>FW3zcYz^R-I*MW%DvQ$7WR^}Zn z*FQ{%_`2cF)~QD~v>g1pLH6y2xUCVpuXc!3L{IRYI=l3EZk*DR(DZkKSGUKwehn;L z(5JQJm`Z(W|E-F(`cE2WlrFxO`gw7${`pX5zPkb`z9)`fby7Pk;~cv5N~T`(i4Nf% zTb;LdIGy;R<+6Lq+7FvvbP4{rmH+F$nEB(PZP_cgWv^Wjy^aM6ZoCw{$u z$ZP&V(E3*B*4xR(yC&b~S>9{1e4_dCx^2&AnhJMzJ=)1Led*TeTY18(jz8*9x1N`( z^>er74|Vzb(--Xiaz*?3tLLWdeqyyIU%I=+mo|$^ZZ~I_f6Cu_WuZ!GAJdCdeA~72 zuD|XyU7fa7I&SOpl_kkpJER9_mtjk_JvA!hE zbN9tHDX!^u|3g1b`}q8VoO+MkgP7t)rR8!V)vLm*`-1qhV!m^o-m)-dx248$(XgbF zuKHD#3qR((FNtL5ELq>4v^TW+=v0>S8ylqAjMHNHH%G56VfeVdb@3YewzcguSFsD1 z-^e!qVs7)-K~ckOce~TlmR~E~-Kq}!+V%T+>D_D9`hH&+W~XdEbBSTn5rcCIIUd=v~II-|# z`ITo|8XvqnxOa}_ntOufFNI_}S6$3=J9l_z9+$0$#OQ~M`&%{t-!o*Mz$7Bfy$51q=yCd ze-!_JVwPYrSG2=)#^B#4{O4J&J<0uV+2weBiy@ohQe!ov3z^eY zmQKBK;*J@wUf5ji+DAj; zupEhO{r5uO#kiK|b$*H2NkflYM%R{HJT4Qz*y;%Hs%Yl(4l;q2MV*U1d`fLEZA_0+ z=6E%K(X77IgPq9Uj%!WI3cP>wl4U@WgDdnqq+2&P=CwGX) z`KM$geY$O6_;jM!Tw620Te3^lnTARE!o;C`6yp;OP}-l`m7|mklQg212{h3ciMmB?Ah&# zUt+&0N$K`~E;X>=cRZn~o|ixMUd-(~h01~nD;&n z+hcGx=dR`2f)gJlY#o`djxhUH)oL|NDEI>Yd)X4WZ?B`OEz!ryLSk zbA`H^qE)^s2W9*S_UhoSWzy^)iEPW=6B)R?RQ|E_(AV>NiI<-{NEaJJ(*c z^NaBvbuOE8TrOAgZ_Vhiy(+l#Up&K8Q>jxu=WiPEFE(DBuwze##I-lAsCsxgz zZeqPE`tpkY$w#?A7O#~&T|V(=^uLs@!_z0V%S?Wr)b_fdf92}PdN1L+GuGPSzQ;`F ze}CY<-Yhhzq+@=_LjPpRP20*J?u?thBYdsJ;`xqI%WRX6)Tjj&AzTWKi%ZNqFM0b`AcQYyqC5-E}pLc%lFpS zBjta5`YpGbcg}K`IaE69B>Nt>jh5l}td{mKNtms&OZ3~Fbx-~Tm1^8Czwr9;LdR+y zGi%k4yJwb9-Ddu`Qv2WC1L2D%``0#hKTp5^ZmMv|o_Nh@_OvkOUBRcXAJ|!@J@fC0 z(^ZFTcO9ty{o-KZ4*l}rE%~C7u~Fa5yn{>&tiNkCr=3vWd(iaPHtBztx7(_&`tvBi zLcF-vF8W_Z^1qAv-Ouu+pa19I?rim_IQFij>Ep$*{P({X+ZR2P{yEXTYSweHEA@|W zueW*0e(!E~dFF)e2H*Eh+;7Kq^xwnfHTui+?|e?nS|v9lc2AYnj_>vMxmNZ2h3n29 z?f$US{1^Xz^R7CEQ-$>^pL&09vlTq@(%U}M;Q!{A-+wN*|NmKT-5Yy{B?1-`61d`% z1k`+9bSFBu^DDYdv6z_T+AYqnb!ErDiOKH$@{VmHmXlIETdj?nQVzEnU(d)cW;3H8@o?kIwk|rrsQMDiBI8%N{9zo|vHc>hp$5WbetWIt#UcLLh6xVr011`nn zy`OVj-tUo5t2nXk_Lt51s}$}_3!S*%jF`D^utRowQc0*;v8%(;Bl{9%pX**>2ZP1iSJSNb+>&^esXBYliR#JJ7E zyI)*3|6!_lOxaD+_qZ2>YTru+W>Q~vkR)6-Cj00MpQ+iMJXGCxE*((`5B-lvfU zd78SHvU`t|`1owSJ0(c(zV+6H{+_kES6HlX1^XDvrfiDNiSNB0Tk(AD*E4h4euv(# z{rUEK{N$#q85>`{JM;3!)TlLYHl><(yY6*aYWn4-j8E_-cYXb>lcJUW&n~%Ipso~t zkV#mkG^Hw;S39)t>16ZNNXxY$(bc&}%a7C-o{M}w_dZXAqHv(jwFHKUJDXRD8%t|V z`*J2(O8kq^Qj3_|QR~bv>)&Vn9J=av@^vi@$IuL~5=$egLwAhoem>nCJ8fs^EZr@Z zzCxAjZok|8QS8j~mRBkfN1N3*pKd$IsUGvv=v?=VKqEfY$Lt;t`~JKw{C7~#JcMO& z&g?_oVe_sQPswbZx!u=zs!iU`ymQfCuSVv__Usju5<9xT(@ku>qo&fU?&wKgr=l)D z{PrvRx{;On=isBElGk*vvxWz$`m$CQKgfT}QFeXf`MBR^>*a6kdfldHrGH1=X<>up zx%z}Q_5g>*+OP627=QenuVS}w(#d-#GG=X_Gw0v`*+I5_G5OW3CJz{=Uf%msV0FSx z#~c3+IoUDzeb80%4sT3owhWl57kYB>19okt1HA$QjjAROIlUJhn6~Fg{;^eenUAwO zNroM5N=T`pESsG= zf&0Pogw>(iboayPCH)--WKKo9C7XtMlMzcMe?FEZ*g5^esz#@YH~q5DE1MrVlzsVfF+7{n8QIBwNgrTMJ!x^`#1;2lF>-nn_S0`0nT{>0N+3UF1 zwKLze)-)Z|i4<&_e<5z$(yfIr)4GeVJz8M4CDoQMd*+249+v+q@Q`=ui9z}dBM ztA_fOGDi`SKMw+LM2R;1dnS3K?AeDDIo=D2g0r_p*7BqsYn{3~LNs#c!>moeir#wf zx4QPB>00<)UY@jry9Gb2E8p^VuTD`&w9w@umTg~o-`9FF-F|u^OeJnls<|N7)OR*1 z3->WN>z)uWJTmjSO@f5plRsYCFPZ{&O7%VoxtVF`TYF^#Ptomb_tHYmy{0YO|7%_K z@!Pk47F}D`kodm#sQ10^t0ML{cjni9&5r-|X!}+RKF{92hvJWNe5%eheG;u0l)xP9 z6qx1VFL6Qm4pRl=p__}={eKbh@OP}l%&$Un!J9%%IZC(ey2NTI@A=2$)I77zn)5#H zJM%i}!m{mq^U8{g@^pkQW|bXX@^*8N=fBmFcKK!JP2|2TY@T!Wrrw0LdUrG@alQ$@ zZ`ULK+%x9)6862?#zCi>Q{Ty*|8sp=$+@iD?$B#%x}Uv`TEAN@EI;z?nTJICg~#NM5G#?_`y8FK8iZaiu&?VlK%6Dh2*;IC>1_u=PZn?(9<3IBA`6=1*f zwV|;#^`e%m)!tO*M2p1>=NY(o=q8=0n~^0Kc3a|d%o)@9)6U-iyICvx&-5t%Uz;`7 znb*Y5d~fyn$MuuvN;h$@%W0OkdFZe&VRQSQLrwp#Z!_HE5m<5E`eEFg)A!$P`Dl@~ zs_(PP8C~hQJ9fFv7f7Dj{xNO&IlnWTEt*Xqe0nRiNm}n;cD1q0jbrP+Z^+LRQuJP~ z+Pvfk_ukCuvD4Nwyvx3SdEviYsjzn`kN$1peXLn3uJ*U0ZrhQzFmaOX#)rk=-8Qdyfh&zUrJ*es`VyruUom z>mG8ZTW=88&-p${<(+C(S?)x+2OMFkFKq;`Ja?3@y4Y_QFzK>2-|@St|NhE;uz#}d z-?6!_H_y-ew)K10+rs|pO|LEAwtoA3z5Gu4eg6Fy4wdcTRrD)4W^mzz=YH!DtA4>t z{_}q=Ft@$>y+dHa>w?}j>(PIvVYe@5>M!Dam)R;m1a^6nFl)@Qy8 zpG^#!SdRL?InV5=|9?@6_PTdHo7U;L`8l0=&vJjQR?r3|tFBz9F4nmhnlEwwO}N15 zulZW(qNDyW$@Lh&%19zvCbmSNWCRfHaNYQ zpzCy2_me>Gj{?rtlU(aRJk9E2TDkbdE&*n91NPJDJepbomoD&RI}4p{60*0Irl90(LE+WsE}L!K8MKi<`(tIw#FZ9) zBGGyuQa0SVp|(3pRVLE)Zp=oRzgkr(9y1Nxb|nP9Vwos@dwqAthZij$xo19Nu01Fr zy-3pWJ&)}Lc2*&~3T~E-{I6RIq#ScM7F|@j)EgJVD%;;8J@ce=?Zj2vSa;4)7flzu zx}YFPY0btB6Pvuwi8)`oGEGyCy-<$X^U(}_LDPQ0!VOA4J{rw2{KBwFk~N5zH|YPi z^*h%sD_NJN;+Zb|ozVlI2vq)p_nL7bS0`yxX->YNKR45~F_`tf zlFdUmF44^vtnVx)7PG}p;?^(tr*p8t__LwaVqrbOO}wGP^X7PGTkwd+KI5zpzOwHv z%i{@YCwe$fZniOeley=Qnq9 zm1MqUaQRWn7k9-bD|-=T=P91=4>53V@LK!DYom$x))Mdk`5v8D=83Jfoqm}+*+hQn z7Ek_9ZXYM#IduO0ITMRL!aj-byL{xl=v;8X$j_ui2~3HRQ+&MX#8 zG*vpcN$>Av`;uVM_LT7No8xqy0)F-jcehA4Pci);z`y%zaH#2|L#8pIpSVt!E{NF@ z`tWk(^euwcpQEm+YN#GnS^LaTUnzLL$>FN4_8&LJ?Pd|(tKzfnb8@OjAa_{=zZjeF zwES0rI_guE7``fg*%+H>EM0y1iNI&O1*gM4PhJ)GQS;x*OG&zAxywqepDxYtzZN}T zGc~kKymL!xa{Gd5rk?yS6D=vYu?3IdC&P`Plm*9G|Qgfr@M#MyeQ0WUclualhsYWg>_yq-F!8h z^Lyca-=bR4JpCYH-R*vc*Pp$6n`iPpReeij`lX24X}+0{a^km}@fPQn8<)*aDPr!( zY&I<~70=>b{5Iry`OzzKm%oPEhkLCyjbACqw^HEDH1<+Uzp||#|Jgs@s+7Cki|x5PZ;>GYVj z+YN4=tMh){6nf@-&Dpmf&eZpcNbKBRy!U#db!n;a_B$RE9Hk?aw9K0pmo-Id)hn-m zuCV^0g~Wr1Evo%fietCtr*3QP4*&XQX?*w&#i$#t@+IZ9Z?328Xv&t@-{afX?_9k- zAip)-nA@VpRP;*G)(*o*9TR_8Os!DSllXMzT&HruQH2Y~Y;Jt&;uDa z(`rWf!+_ZaDk$mtX$NNp13&i^kcFy{r*|UD-6kUUc z_K(%_hte2Db_exlY;TJ;DAQH5^s4$g)AyUXXw{tQUauZS&U;-sx%}pI@tac;r_KKT zg2OrdP-a~i*sF1SVuoSZ3^}PqiJkKnubiU(ZjrpDzQruZ zs?DqViqih62t{v+n0t7AMzobhZ+6L|s~NTv`{JaQ1$!<_j+z+#ML_x{o8c|JqNt?x z*{d&y=}$B(QMp-Q%u}c-S;ji$$tJ^6@$vHs5_D=jjwnsgq$V`lqMfl3MGXTPQ8OCi4B-hqLBCxiw3(YL%{4MgFhb_huG- z@xPPuvx0q>Y4YaE<=)Hx^KDZ8-SEp(J8rBXTB-=|$St_!waWXm+`_o7Xu5wm3_*H5)hK5Di2L{vxi(MjDBTl=f4_k8hI zoZ8+h*}Zso&ob*j1y}xU(5~F0@3edS>}L}qW=ELL_#URjwqu%Sl)HGuUd^Vxw|{?- zDGhwMJ8Qe;=C89i2O4iLoEpqMr&WGN!f)$U_pNVwlBTVT(!Mb{w{~ z@&5VyVEFRgonLmZopIo(@}enBGmi>4aLv;DTzybc>4>XMzDJGgLupU;KeG>Xa&Ylz z_BlOnSh?uLp>409Hze;|bJt`?WQ>`#OnJ6UW8NP}<~z0@XZq_YXG$G2c5pUvYhEw5 z<%GS)3UiyoS8l~kJMsxn19gAa5{r~OvS)^~h&B8s+iAN46o=UcrYqP!cc&A&K z{gIj362IzA{%mHwoxJnv)VVRUo=%x{|KFa5Wi?&PJ;Hrr_DxPrOlpZNI%4yy#=Xkr z@E)Bls%uufeR@>4J?#D?slc>_+c#Rv+D6LSTzV+8><&}pb(Q0qHkbdVZ1=f*U>aMJ zO>CgV(ZE$Y%J#D?6us{*+q{SM^ybsImOKv?k)FPV@z?5`HrMt~y_PL|pDFng|Kd~r zGA9#S6zldxDyiLF&bo4v)zv)XrM~TF1ov*)I9F@(w!6ExUF?+ZP?&rB__=HQZO=_l zKDS!Rjn(J!+1N}C-MiXn11D)I-@RMvy6dKOb%1x(mbbP=A7yu(zr}Z3rtxoV^#R+h zEOk$~A74tBKE2oZ^yfL5i&6s@w23cK%bZ-h-f^4a%Bwg3^`7jD7Jqy>=8^NQHNAIO z?BnvB@0GLKZS%5wIobL8@!DG}&K5|i-4;m~muR<#B;+ z$!&6Z88UAV`@OZkq5Psb}AdP{ZD1T%)bA#*#6(I^xR+U zXMa6R{&Dx7ugd?I9}Ua9nC5!Tc)xo0f4e{bKK}oIZ2lj{dw-gF|1utGbC6Er>hgSe zdcmPq9%-u@j*SocS_F@7NIcBwARy{!#pd|pb&{LE;>{%tFSVDRnyM4MPUi6@)fv&o z2OEA08ZSRL*QWZ{pP5Fi6S~-gwU$&ExVlbpn7xkWk;$qnD?{oh?TIK~#7(xVw=VMNbv#zVvh({Y&t*ZK5_UN^+Pr6* zwHnmr2&Z2?Ii;3Mm1|S(!O7m*zgt!bIruOvvHh>2Tcw(H*^f1S>+YZH-rU@heS4qp zZQZ_sw0G&u({KPkelQN~8C@IX)_?K2y6=kL`-%sQ&hPBiCOCLsQe& zAGP$$mvPK4c3HOCdHOP*sO1%(Y@fF;dw;pqL+)E%X%jqDdLvgJ*Dupp6a5CNBpcCRBlykc21Yd z`u5O#X60*1(dhbriWbS15EVX}P~XV!{E|Gqz+60dh7A$D=w zNr9r;zen%P%*=ZcQewtr(8inm#%iv<@~RWwbGLuk#I3jc&7{N325MGMmd^5H)tE3# zwKQ&Nht|uGni)zn)91ghU7fzJOa@79H`nzH=Xjnw*Zx0A1& z*5!qyt&xmdq86Id^doIU>WYdFy6oq_+}-rpu0}8PqLoTU)qE?Bbvq{}-JY^-X4ERf zr2^*Cn+~hF&k5SayY_e9X}$eD3A>l_sR$ffeQ&iut61C(nFCwQOgGHFw$@_Jp#ySr zm@5>_wUv)+d^RyW)>2hj7_0i3^WV!5x#Ha>J0HgJZmX5If7^YEXCqJXt*qVB`BQSG ztBeDaqcWcDZ+29_>!rBvOZHqXvDuF{cs`$5nmNVFcbj)$bnTS>t47}It||D-ZCk1m zFZc6?|7_WZ1)=MCt6s3|t5tX@^0+2ppXL0Ufvq;DS3OKIIlnJLCv`!_mW?Sa-pBY) z1#qy)=$sG&Y9kvqusLY#jSjQtycoG@;0wnCB0>R zQR!mI>eRi@QZ9>|IDU&be1JXw)`t^|uV4H4EzhSS^~`)8GapZ`qIM%0hSOiyyp~j{ zzLULx`8|^zqvlf;ku?ig^?%IS@$#w9y4T`u7oPt!KEFm^O+(`VkI#<=NgD=Mjfg}p z`3uayY){wye$9XN++xk#lLhTRHBV-5`*c8o>!OaJ$b}S>3YlvYUzV0}-$-#gaaiM6 zOWW*+fsPzY_iNdCw+FpZ@)pq$JkML$lk&z(@br)QA4QLZuCuiAenCpZEL5p1@t_yzt$=y;Od|&RV$MLSG{Oxs*9w}FHxEUHu zm@p^jfuyyiwDYT;yzZLC%GE;qz2!6~h5ZR!$i>nUajIzAmNiRt^E*$+yegW$=gm_6 zdQP9nw4%uibe`R^%RIBSBdBx9p9Pwl%tw!2cv3qlP_;55Q~aM!P?6`fEomRxejZQh zGR{3AlO8#3=EQ3UPtANOERn>w*?g+aF~bktJ?6zGQ$G8=p1S<>V_Uc%PId!rYV17j|}7-_|@*wn2G+y&LQ7@Hr}S`Aema{9Q6zs#n6IvE#y& zwpDYqzIHiT-?)(Or<$SJneOElvPhV<&ri4N;?@P`ORgGtHQbMiy7uAlMLEg**{Z@X z)0aHDGU?lsC6}{ShVC!Fu)5E6A52AFynN%6ROyaojU~x}Q?qU|-CEh0Rl4Cw;>%ovjvGfdb+2CkN$ZW%4z)%9CaHz* zc@=uUX=!khBzNTg&$AY5g*&WyxOM%7Q|fZxXCAe>Hg$_tWXP8V?v~qrm9A3utAWrXUf?M@OriDy!0T-tMO&-QmOHj4i#Q~1o!t0se#qCLyz{4{A9w}qJ>;n5;Cmb9pcEaZxO;Us$O!$nKQ4P_f= zAAYfEmT5*?(9-<7lFe2up@niP%by-Q!)v~AyI<$CHIc&C?~6%!Yz+IjF;n*CxrHLv zuefbmVZbYs9qzf~P?^TY*-3BG|9f8OF@7(b80%U1c*V7qYroC9Z6lpi?0Gxn(YEAv zUiZ@7H@t4fmf6o<`~KsG+yCyeY@fdF{-l?2hpiXRJ=eh{$5$9ozC-Jwm|*fM$qx>n zr4JSJh8WoMeVWi+^F-zN(*xXoA6oq@u5-$Be0ug~!rm)Ek3P@!I{MVow|Y@eiof?Z zv+bwP_Hf(Wx-r}2)P3J4hYlTco9X5|J)}>pHOhD2{dXs=AMTVmc46~8iRCzM3&m2~-*Ux#S zEi|*kHC?y4dm5|eGS93PHtsW5|Bd~2b=6kR-SNFw!@7T*u$Hd4vUJ^IM%kK&t7ra5)eP-P z`u0<$E$;o|^;Z5lsmiB5y?TE@Xj)qTRGo95U*O{JFc zlT%+VuX8+Bmm;XokdWzltw747{>QVL+@$!Fsqvhf4YoT}a2+e&9@HQ>IYi9alY2+4 zKdVFg@mO7pXpx9U!Lr8W#Ke>7(x*lK3Vx{_K?#9F1YHi_n zi!AshY!6jMVcS*D^-lK#&r6jQSY*R~r|xH-&smVHQl? zQEag5uyq7mrOmXQZEj`vj~nivF4UOO%-Gg-s=2JKL$uB$w@V|j|A(kOM{!b-+N2k` zKbHwtUrV3(F?|V#CwqkRsc%_*=3TrRk++T~RjQ^PkZ?`l=x$c+j&tn(_&sj>kH(!9 zURI7-8YNk}SDaRMH*JbYCu{%P7hMaUH=YTv-__CgL#3=m ztm{Z}+0O{kS3CN2Rr_5EU9Nege@^e8tdYgAvj3M!8C#j2%F}-n91IISc1)C9IZ^uL zMA?@UvUzo;Zi}=ltP0K^YCd zZzvyL={j?BmuzuT+jN`CAJghgeXJGcfA*aJHFN&=&iOxA&i{RK{@<7L|8p*2)LOvo zwSYBi0eja1&Q%MzxfV>E(Q6bsTdAUoHQ7Y8s!3C$`Mzar;glKop7%eTK2KRRn&a8L z#gz`*Sxvh-U^wJ}R(KD-WF!hvm zR@~a&)IP0wt>j$as<`ULZh>FZb0m`LCMy+2B-KC5Ib#vkx}x1)OXE+*thlHp%39g~ zY@_s+d&K#?T9UgeG~m|)Uop|C8UoWTQfEe_&VDiX)wj-=#CfYqdpOSow5-{@R5 z#WQc!3SHLa+@5oJcXlT{u-p40{V~Tf8>VLYsVa(Ei*`+)6MG{}_u8C}Q_H%uRz172 z!oX{Guw|ColU{9>KK(6OjN!9`>ENkJr@YoY;p|GT>boK(-1%zFT`7+XrzZbcu~z%y!kQnoH?7vi zA6awn)H+9&b%CB$fsRx62~9DNT>X0Cl%K2C|6Voa&aHL-e>uF*niiB-t zGc68vu8p0!Zr81UT@2bA8&o#bMQUg6oYs4B+E>Qu*Iq5>jh>!)e5Fiu&_An<>buQE zwbur7C0#R|akntAdHK@xt{F#9RXAmt)?2KKydiR6#RkqT>ol~tykE3wb(Hop_r;b+ ztLDB8K7AuT)}vZkx=bK5``NFB+-*I!)|IN#Tby5ST@FgLlph(>|uN z$-N`qYo5LM z2kG_pj>}E7QbW>G_ikSP=-TpW-g8>C_Lx{4cs;X=Wy;RjmII5qwb&jV$k}*kUsrEm z){dZ$llR=1W?Y@K&xtG5U3KQfiiHCC zIRa)zr#Hl$PP#KCWlyj5M6YjBC&GHx|Is>g*yqfiEk~!b$1ImQzOCmpkBs2DH;pUi zoVqA;?8+L2(|69S+-OFrFu8%prZcg?ZACY%8 zXSbg@_toe8iaBR5t~mX!q*RidEt=gvZ)f#iZD;8@yQjb2P+xOq>au_53htcy#8ZEc zNAQBr>CZ9ePsLpP=F=OmllXg2o38eZyN)v?Om|1ztbWWnaehwEnaE{}_FOnT{mkp0 z^Jn&4eEs{(>zs=}YAzb}UY7cMVtUWzhgCD(XH9BW_r3gH=c0M+#WI^~DZJOt zoVglnJ3)>&up>J1W@n_=iMex@hMktslbqGFC)&O-W*)Eg)xOT=xwE_0r`|fBapOeK z5wm}9J!NDQXT06x!pnAwb+_B&m<{C)EWOv|edH~A)~@!wn*Dp;#AsXpy(-~*>vp_t zo-k+6mA^}}bgvlw+T-f0?tP=he(AQoJHxV8X$I!@o#O2%y`f{-9r)x*I zowe2F@!EBES4fuZx9X)oqAxl4+>6q)h{RTPnH)D$01x?u&Ii%(#2wcJjkHOCEk&l|JcI zdQAFZSEjqar(H70?0LhP7Q3qTt?zadvz>>v9~#8oj(h81=;vV^m$No1OTQ)Sp~X?j z_IoiikImWhXyc7X|4h$5+0J_Em2`EcRS;{J+bIb@%h?LIe2n7U?`v zkUph1_sRQjeNEhxjy`_gcyD4+UT6uQ$md;)PShU#GV$o)Q_lpSx$=C>NtRoF_VroQ zb;ZUrpYjErnfvbL+@x@N9*IV-5WGBA1I;f^Fccy-JVAFG1OFen1r7vblZLP~a zceL)!Z9lP-^Mv!}ZdqM^rF7C2%VXiHyRNw8J-8vdq$c;kgX~MXE8pJndmsPsts&#P z{7JKm-WtdYAIjLZp_Z>dY|HgkfA@yy{@bS$yYH8pg!sb`{QMsU^*;*xe-zFCDBk~3 za{Wi?^B-m3f0XC{q^SQ%+5eMj{wMYOA7|{jb~mPK*4iB_kMEfGc1LyAbyriP`J(qv zq)D>Wuf6>w{)XM5x0;76_b=1P|Ki^N#dG}^@AF@L-+%Gv|0=fr)9t-&ckkX-mDnv| z<*?}Lw#T*!?5dt!mP_nywsWPuJD{D%EB`h7{I}fq-}3pt7wUhPvH$wv)RFsrTfTq2 zdrA7<j~vm;Z^~ALfqHsoVdLG#&Q;b2R_Y@%}$2*Z(f6nv&y{P~9vj5+!`G2qX|GgRi zCnfKtwBK^szUAU)I=6WJC^LDqcYem@&o&2k?p9lsZ&h;rna=-+HB9T0|Ic@Ok=)`d zmi=s^)k;$yfqg7|DiIeRIJR(#>ZNoTwCWoQs`^d&A+Tshw`g#{6OCg^3=Hg!Z8;|d zPB={1=fNejQz+GInzHw~C6Sla4o%id6q-_b`MLiB$5uYos4Fi56||1ABucrsUS94i zU$!Lb>Z{N-kz4bgMhSX^b?4kDV0dtH`VA4W_P)f9MF)De^QYN3G&Zff!~V~<@13qy zsL$zXqO4(aW{9nh+Q(M>$>+|E!ox@VRsEO6-29Z<>N#C6^^|2t`uS?~W7Hyi|?{8sS@UBPDyecOD>-OZwPoB#6*x&zG`{%f+`PVm*Rli;{ zi4+_-w5d3M_q9FD{Td%XN$2m{U$FSZq7H^PZx5V$Ra{`hYyRbfvq1eVeXHlQxR{)n zfnTsh#hVfXbz+MGO62Y)CY*&Fbt!|5wm_Ij-=4FW|TO5G-(JX9u!6nU!6F8SoC zvH0JVA}_7gTRwT|Y`#+Dt+!ie)6RcCCUYGSJ#BK?oVl^);@0=~KCe93a$tw6pH%*l zjrvCASJpc9hMfN3$HypI65v!T`O(tlzjbk-Te;8VRU39B7dtNK*zhIDJJ(``n?cKi zFTvL8!g*%0mX9VHeEYLxjq}`?Unj3Ru_u{^MP*-Izw_J?lZ{v0s(m-Q+DA5T^j+8? zu)@)omq}SHjXU#NWLmQ36LyiBrqG4iyr-sV#9e%R**&znYUPT^P^qkFr)J^nVP&_^ z3S1X@9C{_Z>NHE3^?RWnLyhEG$>gOe+)>}ejLI}0PmATSyYWDt>q6P`2~|?2kLI4) zxM#-dZs!)PQDpCBl%nAeuLt<+vDc2-+7Td z&+%OOjd{&}-mHtd&3RK|+M({?>y>vwd8e~s@kiKk(SU!(2>#;>{& zHa*qs_nQTLs)D^R?>yeZRl`&OgBX{kEol`;irj>(+ep z*ekE-`ts57PA zIP>+3yRU!U{C@9t$v+>Ds^8!F@6OuY`(8~rc=lJ()5a*BH&1%?CExtW)csxg&vCis zpO>Nj4SGcrUx_SH=JaKWyObQwEcxTWR>y!ip^}7OtC$zEh_%(ee8~I3C)ECIDW8!- zNhoLca#Nv0IrV>&7v8*Lc5pUtKwF>of(>ErY7+{Mls>8;UFz z@+ujIzGqGpzC6w8_sb_m8e4AM$l7{HENx?~GS{QmTg;s=$L9O8n>-Q}eId{87SL;u zk}P%G!|}^Xj^?yCf$vK`?=A@CF>szK|99WA;~SQ`v?vBm7u{NM!m03LuOUmavTf1C z+cN~K&F7q`Jom%dr_6A&?Hv_?zs=T`(s>6^DfTGu+{aFaW&eI`zvRO#9z-f zeFjsiADgJFdwX5FDA+e+>YYHL*C%!y7V%qVyfo7{w<>tfvykQ1PhU=mo9UTdv?Wk( z?^FBDn;e?eLT7mEzL4(BnDzDM#AX52NG<)Y$*a?@+FkiKB`%a8oC zpEvu0#PO=Bn^uKxn(V8sar2e*cE64(FET~_xvD33>7{J=S*#StXc~1ut*tJ~Wv%C; z?c0uMZL6}LJuCV4k&P>#hHc;dG&jHYck~0Tb^Zrc^9p;bW1gsm?>wEFS3LK3%nP^h zU6+^Um6m4T?#=jWF~Mq1+1}r=AKJ<_T>th}7z&4fUKYOhwWxk&`G>e4$HMo0UYcL~ zwmSaLv+(`DpXS&9{Tezh?@luMUO`uGhSBMn_H7CbAH3olID%2 z9n+E(*dtFks})V`y|Y4=pZl0=_FS%ApOR&*ex3+kRy1{OO{$Kz*~y$Jqbb|fpRTI- zc{)v~c=4$@sV2)K&t|6;pWF6kuAXz`Ik)Uh)BBe>7~J1^E}cz%^6xj#`(FG!pCDJV zkoRtyi+a?>?zAs1_jIONc>g@^!?tCH=G=52>&kPre8tQ5`()S@OU+p%_xanbnpZ*Q zQCC-|m98%Q^FrJ?<OPn|8wroK~`0ab&o^4z5^KU_id(F*% z=S+9)ew*92c-N!v|Gw|t-@C=xefBva^~#gJ=hEsA=ia*h@W;v6e?>FaTRqjzpy!LHwef6E^ao=}8uYF(pzxn}t{Ex%x zbsu}{Yo4gb|2&;u_j&IBnisq6CS6`$_jPT3?VI%Y-?yLFec$`P_CtI8pU3L;KhM_J zeOVs=_jP*x@4Nr&ejJbg_ky1Ta_Ou_eM7xf83Ti383Ue6XZevYosBmFT|0Z_T57P2 z&tLAK)>O?ItRlKb`CBj6$O=Fd9GeQu8wXe9eR$QIrDAmC?j>*r%m6F**Gg6ciK`7oR?5%9M!{Cr%BWGJSe@NJvOnSlGlr%NDI!ylBy)b?erx zT)FbA{BxhT|1Vw*oMgz*$cH9d*R^7X~DrU!NLDiuU+~7XZEjj%dh&` zukP=k`E1qBYqx&>TzT}`wW(LHu3fu!?%J>R(#G}w{@lEK_wMc6x9{J#m(aGdu&}VP zv6;2bA}Y)JmV}j+mDRublPB+No7}o=^4pb@Cr`e-_1@*nmp7+=xasx$rq+))KYqM< z^XAW=KaU|0!^D^uI%U}Dg zYIa%HRaI5(w65K2UtPPSqIOSJ{l4n@%8L5G>*w9OfB*kJyZ^P-|9<@V{qZAXqr*Sn z$bY}{kJab@|I7U6clyuw@z?hMZ~GYk`M>?N|40AdV`30wdf=cmFTcgchv#fkY^lKzPo)-d&%PxVXNFx&UZDf8*R&p)hA z{(jj&t><&MM&F&z_5*IBCsihHEGsh3nzrh1(1(DGwK3~1`eHp469jZo@}~3^Hi43^eGKpN9RVZov*v%$8>#T5xbwYp+Ol&@jF+)%@Tf77WnK# zUfI35Gy6OOwmZhV{bF7n_GjPSmvxz8({HIT8};PYq71gjv);+)SMMOk-iHA)Kf zO^@mrYb($8SoqHJr}x(H-=CK~m@L6$^zKpcdZl+Kl`cw5E8lioJx=Qn|Ma$h96BYv z9?Fy5V*VuRSg))!TJI~Jy|;iX;$xzd;CrZN$l^FoF(fW6Ep5O zG@ZTi;h(rsn3ma^MHQb)zP_N7pqqu_Pw*Z_$KCP$^U*SR`~5Nx6Q}n;(Sp|GZ$J*p4Ya}iS+4k zpAez5sp3woWRdbeuc_1jADM2Da{9Rbh9l*NT^E`x{7`N1Z<9)Ond^bm`Wqtd?4Rh@ zbzNum`mV`Jt5$hE4G7M4I=UfFxoI`i`ABQMS(ADe%{k36$Kd(K*o2KrzxVp>efRE7 zS(Q%RcI(uWp$$t6QoWSs`lzw5Qe9-08u6~}o$adgS|uG#huw}$$~hm@f9l-peUn}1 zHSfwhQNegv=k4_GlQli6(jV6^c$njynQSg~_eJozooOw>dOM{0HF94TJY zi&Njb&biTQc}l=_%AJGrZ(dh9C~Q5YqkP`YEjvmk-8ee&=e))4S4!uKY=2%J^lZBN z%=q+bL6>={RTteS-PmxY-sZ;U3EcL2FILsr=|)+8wOMa@mu1hJUA3)yWL#D`-RnEO z-}#>Z?AOfy^(-v+)!InKEP8U z?Ggz%Eb_O&u-fs3{C!4^qND(+DF-#~h;L>^QGE5VzVqyc@Pk2H=6Zhg`*uY|oo8{AayjQa=d=p_ z2XSo6isntp(ejuQaf9oT)1%$8s*Q1vPFycG4RLFboH}#f8T(tUDW5g9p6I;3n7_|g zlhrwmXHk!^)XDEFbMEe*BFigm6>>5&pPzllVFrdgM***DZryox@(kkUlB@}9dw9f} zmvRLEznFjT{5tOyEE{+DKWj2ozr@-f-MwS!y29uWtIB+=Z`nP`*?8enSYQ98@Vo5$ zZeHBDdyem+jqlTz%>KT)?2K>Jq2&$>oes1YEHvv1*?qS2vHa7LuTvi@x~vp@X*%r> z%kxu$if3DAFp37%RT&$)+^F0-bxYFgix>VG&+^i+v`PU=JM#Urq`bm3uc^6{T{r$ zY4y~uYq`2pSMizMdL$gQP$?$Uqw@Hw#m~Ea&-a@?t58q+%Qmaj=bfN$@RKWTd0ipv z9cS_+SigH=8Cs;lKapO^YWC6e*OraikAFv*&b(}@ z6hE^q*(N&KVtaS*w)pApN>R~LcXV}2M6ZYQT#7b+q?pb&d+x8!(l@1RcDgb>e!a-# zWsL6KOKZ+OoITrH==|E!hg;WaS|0e?I*qGsgO!?$Qtb8Oxo-~b3CZJs#Ot)lWJ?0Dmzo6>8;?OLa1En27chk2@&+;+?Rir3%nl|O85pH=8^ zf#Y6n!H?|+ErNF!)U5wIgOfM$i&yoDw)M;{#=L?x!D<^M7B@3glr_CR5%;FdTg5+> zkEhpLVpiK$tBneLIuBAc9%el=Fu&{I<1kq=>eQ<3c5mI2b&n#o+qI*ux=p5E(4Ma; zu}^==>nR)V^vc!m30%N`&~E|vrbF-Nt~w+r-Vq$N@YbzWA-Yfh?rV$=o3(4l)5gcq zze6)MB-?I1Hw$Vm4Gg!g+ov>jtJ8tMA$~p5zb?cZ1iXMMzhB^-Ts&4 zz1EzvN%o*l@#2cyw_%<4XIVD;raM+?3w9sUW$!pC)pB_D?YotM50CEC=U=#%BkJXB z!SqmuR>3fnoY_rB1TG6NOvt{+T5f-N!s;Wh{>SCtGFtgnnbp6&-F`{#pSz8(T5im2 zS-B%uao(#BrM336BeH&5B>lW;nA!Mm!q%I$XX5V}KK}As@%zKaE-Z)3%WmXvl)YK} z@v(mSRG&JQth{F?-*p)@eT-P9E-l!>#?|#oCZYS2uEHEA-5opaRHu}!lkxcX1#C|^aZDh3r zW51Al=lq>wMO$WG?{1s5KTGasQ=$(etNV@p{Q~O8tR6^SGW51+cMxn^I+cUL=9%yR z?SB;b9L_A1PW<)Mm1{xA!%*i6rQIJlepLzJj1@WgGxyvM?FZ*Vm*2Z*{@-!li`OzT z5+aqE9@CdJ$#DM`*qL|NmwUl(#sdA93|#5_qFNO(rV=@}5__WiqjVyEura(zT+lsB zeZ5r9V$t1u*WFzrYI0uYN(@Vm3Wu2A*|PIoW()3~Ja)6QmWR#x%x^cbT?R*AS|8+R zP~%BwT*N+yo7r}X3 zKcv>xO6B=UEL@qsA~RQE`*3s53;*{I`_z{HN1iWTQr@2xr3EGT^J<&@_;_XqD$wYB>hQ0w__ zn@8M7zh!Sd(xUv+YP`eRT9@#AUJ~ND{LIJWoR42k>xr^ze8|K7fah1jE2G#Oc?)Ms zJ>Zc0`+iSm>70i>H=Lg>T)6f5gBi~roQhYyawTD@rFK}JMq$1wajGwMQIH=61vrs4Kh`v4@b)W zTqV46l1^u#Z2Ok&3wll&1UoGbJ63S|jEsQA@ij`z(`}af+Aq?#N)NEx^Is=D#Qu6m ze5=u|hTSSpH|Vn76G~amR+ayCt3JD?laS_pn~am;ISje?#Wz-H>Uv&3=6L$?g8eTm zr@Z{B?eTMp)smHFnpb}9m)N&t&#C`aEB_olG~>|cZ{5#ye)6t-Q2F<|QaMZgmMfno zUh!%bT+_7WWx%yNiw&nZ9=w>y_~NGHsnrcTg6BWkJE3QVM%y+H$K4rMc4Zi?>abhg zQMb6`>E4c=Uh#WOlz#R&q=h%z@7{4Xrn%86)PQZ49&gm6y%DDtJh|<%@ypJ(A1;R9 z*Um4G^1Lmug`;TYnVoHEKAmz!Ct313BSKd`anVe6UMU#ZsaZ6$HDTsdr<>nr80}tV zbfI#kaNtblqMb9Hb}miWsU5hpH+N@k=+5%=o&AoL8}cnx3Km_7*l#4+&YnH3rCY13Ir-MvuL^#lN+z2Z#9b2D++AC(*D(LbQJJvaxi2=< z+_72I_cQK>_qU7w6S?)omp8<}aG&*hcKW)UBQ77AO%!T*N^TgvE;iHP)11G zUnDhkJI}ic7WZ3UoJDes-AX%mNq%)o&@5n^vaKy7B1*(*&*~<@^cIOTzdTkYC-{F1 zJaa|MwtV%RE32mGWZ&E$dP;SZMh4%a#6zoQYZ>lvk9&QquJ1>eMYn&!tghe*8|2tp zPxjemO>lg3`pLPUv+R<8wexLF$(E?U!+SKhccst7%L|GYsWLy=8MRnLE1Kuwo2D3l z-N`z01a0OD{?UAp^K8Y2XI@gPq*n^Q(%H9Di>-IbL4RN9+ zUzxVPDp@##`N2jJ>+;&!b6RF~sH@+wR}+yt!PoKo=aR%DbDODlK z+SL@`P`p;BF89irxhAm_%(`Q$Hs6+aONDq2nOuWlxEfk>9wc zKYxDF+&}$7?fKnrZzM~U6o}8had^(D=abGnxpazs=Dhmm#`^g_0zw7l2ln$HUBuX0 zBh^|pJ1connC#}gTUK{&%WmY&-L~}3r#f%GvW#ixV$blYJgid<7rU#z-B+b)lZ?wQ zvo#iVv#mEQJFvEo^ZS$T4NXk%kJ%+}v;FA9a{QO&;!XdZx5tP_?3%TE?>q4e=Xa(| z-gN)Y%AJ8?8v-Y854^fLaP!{4?>jF#?7FG4=VsEDn`0y0NS8eP_S)vD$M+$^NL2CyQzqr{C5|GM>Bi(-c0< zwZ#uMq%%a-t~Q;$?_rVZezMdKdJ%iZW(ext2mzEjHl zQx)^o3g+w8&wu#c?(#W1?v(l8s;mzs-s=|KXML~m)tOpC`|0SromYeZR0j|M%qY7r&mk zmigdo<-e~_-@kr6_jUA%ueLYOEr3<xBZlzFT^1$AjV?5 z{JG|R^((5s?s*;+`F-ziAnVycrq90xz2_b8pK(8U;eMAagZL?2vfbD3J@o#e_4oO; zuvOK5pUZZgR9jy)OZ>0TxxYRdCG+xFw#D~k!4IQ6&ehEwNiyW&?*%@1psQ5_Ss z!Ed)1@2AkJpM^g5^P?^HHhbK=6C!`fAZ~$s&CWj8{%=g`w<7lZmCySd=OsF)CiHsE zKG~E~z72KNv1S#LyMG;=`!8z2;=h#~VR2Po4`2QE{F-T1-Q2?IaknSR&5GTwb948z zsfs02W;Wir5~^ptB0^q&rQG_O|0NrzeEEG#_`_nM3QHcRztsW`t)Cy8Cb=uQg?#nm zGP4WYzD?e04eJE;S&Nxgm-jxL&=AyQu%x1S;V$z{tP6SqRFbk|i^b9p+?mYbuJqu@ zQO}?$T?dmzG9wS)nck&(WaC%)V!cVc%ch>4_UYn=0FQLDEbi*d8$wRG`A7w=_Xy!z zC~$7U4t_T;uSL1N%9G7Dbe~Vz)U9l3q&;6r^i$Q;$;TZxdYU$PA4<1;Zh1L-($fUd zhzlhiXBx;x_uyJ1kW!KMcizLRFW zpYvi)-x4F!S*#NeJ1D7%PZC)r8mcVYx9G}Tk$G#LY2MxQpILc_LF@~4Zg)WqjizsN zHdw@-*#1~!?&Zz$d{dV#U17gy$7d(kdE2_XJ^v}HiLLvlnUXh4^x28>3C20~57qCe zr%A9~y7t>iCxpLh-KFpyyIXIxiLT`CnB?(kT%O-pM^7;kA|&({A-u#b%l!WJ8sA)?zT7ItirM9QuMYh8JD;Jy1MIx-vMV^v;W#E z)%#|z_vqJZYy7*?@Z1Ld;7!4y!Ltr@R9^Ml*f`ZjO^nMf)<3EJ!4(dvlmGK(zTX|s zW^wq&^D`P6H~4dx|Ly;OI}) zGB23YGB>6CaxctpbA2Y+mimi5lCSjF@tuC!@oVaSI)<_6d}c07f4QWGU;Aabw8zb9 zCnxzhYa7j9vhu?^W@gga-|j-Yrj*w z*4_SZ!g06cj%v%j2K)JcHD-&w+%=co`apW0?4+A}?v#m{_}u!WY`ApYas0m|I^{IzMZRHe|czVuIxTV!_@BR`tQ3Y-KbDi`*@>dQmO4J0NB4-lr@?-{_UI+k$`j-I_TTh>YAbT; zN>KLkES}As2Nr9(ybhjMaYVy?)t)(Jts2Z{Pw!vjm#7@QM~&^SSX9P$F6I~OERs*_ zI<|5;FL_^l%+GbofhF%X0xtZ?ovQY`F?0GZ9~OQF1|#YH)uM@QN(=i^3YyPmswy6? z6!&61bN4{XtSJUTQPUF?*Y`{M7c3LFezl;g`p&+T0F83(fQj*wSzPaIT{`2QVH2+XlboJa`ljhqr9q?iJi~~MUDmHp z{ad0mxp2<4B{A6?qW#HEpL@Sc5v<0{g|oC-KfdZEA7SDEX-Ma~tojOAY>~kLpgEo-(In{o_Bs zR!48Wy^Yzap}R|!ull>OSJyJ98_(T#{MaXRt=KmIglX7n>+L}s+b8$r%~h%|uRHd7 zv9odf^MmHX#%C0+d&wKSWOkiU zV)l!fy(vDp?_rkWWwZWm+upXS3YyP#zbE@y%l6`h@P(hE!)G-2zi0b7v8RfaEp_VW zo;W?p^EyYDyVx%L_@rv{=d1pUHZIazs#+PEH4F{7oGQ3oKPl~ z?0n?vw&`n*v`uE39W8eKh~Vru@0?F|Htjod?d9IEaNn>;2R77gy>mdqaNArScjdFO zUz|HNeOp2f9N4>T_RSyqCtlB4#5q4XZBMkh^-J$(D_(d!J|A$!IjBV^`q@DrZ5{o* z9P?A}G`?xg=d^z8d~AKL_`|K=7QO9^^WgmT{`S|ijkl_<#H_HLcD+2(;yC*qCoi>c zjV+e`?ji|Zoa*ZZxBprGPWYdx{FVcA&MKwnBJ0J03DD42z#T|9S3e(=8m78eitqI^y5=3G+iae4`fod|@hPQb9JkBMq~&+hrUWNA%_|7X_<66tL`?18%nR$*hF5rM@BH;< z^_-51-P47Z-Tu4u-TeI_P3L@1urITGy8if{u-^Q(!p6j;xAWEG?1LV>d11_#lUK#c z^8Qgtf7X_D?4^Ay*Uc+SH-Ee#-@;9-%4;~4*Wmu59p2{2BAuF|&aQG#>i#ocK0mu7 zfy>C+yjk?_sR_w0(|lW=`3KwV_;9`X_k+8_nKQEvoUJ{^AHTAgeL{mkO~F@&&0)LV zr^)P%-L|J{BV)&`^9#;yin#Et;s0&hT^m|bypyMHQWFtWGLcJSyv>*|Cb;>EL##uY z=f|ktLkzo;73W=c)?~hxU;g!4q)SH8-h~}qd?D3m=4Tz$tg851rMM#CCC}YVw}sB9 z-qqfm9Q5`m^DA8;9h1XaE0c-}oeS7wFU*n9+ydh|L z@@(hLTYn|BuBI^F{8P?T6LiDLS0qP1lHroRy|Yt_-W4r24b^k1i&MNfECd$bbO^f7 zK1q4)(i>meL>e;hGi}`&yIW z9RkHEW_-NAE!Ik`^3hwAaA(Dy-8QptXf!v5s0m2%8=E+DPu#=c#ZVd|CmQu2AkHn@ zW>)Q7Y=AJ=o0Q!BZ_qS<&=aHvB|uCv;< z{#rY!_R@jCT>^qn`=t6tsDyQzLSPD<(G?B6@G@^~uq%bu&0H8bs~ zZ@b$Sl=1t({o|92mv?36H3tf^9=tLm@KbQ0;Wa~#H9{Wpfrbwv+wvBcZhg4_*=7sI z(jERCJKR36=J^~Odr?ECsJqLsr+LFxQD67oof6{vg|t=dr9bWG>Rdbjm?GcTx3X>v zz4R}9JEH!gw06h&`|liIX>LF1_xM?APMbK(@5NVkq~3`VU~_uuxX|O|UyTzRFPDcf z{pEdO_<+~#NZrmYX?$|ami=1GzBPPBrOMk@+dEgZoiExsE(xCH7Nwc_hk=*#VVuYf zwwE?C)!$Xmgzzo-xP>>Si$Colds!TxX52o3tj6lVmov=f-PyK#pV;l{o*OGy9V;xk zRcWdDgfU%2Gv(?x0OHktA*F!RdI?oUnjWxEO4Li@uljZXj)P5`UY>gH}@mO+S{rfz6)L4 zZgnGo+jUd%k(1{)|J3agyt>Zum(IN#5gD#;=1>ihNO(iXcN+AjmS-`}0_ z;lQ4nRL=Y7*ROAXEm`sE?&;Zf|6VIZeVyZLH7#uI+L$-0dQVahPuSbkBXwlvKbIoi zppC*uc@}N3)cme-X~naZsS5WGioH~u@SN#HzMF;VUe?a8LvwrcpWVI_we7~UiFf85 zd;D)v?uFAm8|^i0uJW%w6=%QZWTo(-`1*r=66@0%MO8bq@0`#zo4%)1z+s#6Jngu( zp;q@!pO_IJbn%G)iZX#Szf6~{)0@(;sU&gg1n-+A?5j>E>|5}$Zuh56$q%PYJJcpB zD<0AC{Js)Pn_HLQ@;}QgH9q`3Z}8WC`q2wFj{ahLtJd|^SAMF5PKaReO!b$pw|O-+ zPVz{czpE>Lq@a6iT~M6r7Dv9d+k)$u@~))5=FL*IzEr=#a{cdI-W$z^XE<+vH{5M_ z`mxV$vy;WYAF4hMiH$swdC0ZmL+S3EP?wydfW1jG+(RrE?Wl>#JUQ*cgxaoccMJ08 z8XSlTp0FkR+Xm^-O}B4*-FPr+Z?Yd5+^az}*S5S{KI zb^M1`=AYU^rB#lrWG1+6TEtcs)qnKJf>sT!%fCeDzPsQuUoG2p594m*k`(X1Q`s!l z|2XC9$~gE3N|bHp{FT1g`RtatN6YtEh@U)ohOx-4R*W^xd!vKNG2Xh~Tgr-m=HDq@ zknXW#W2wU`CGCRW(YBq6JU5r`oc8TrLTLZW#rx(j4n1o%yJ-26wuPogSU28V(%i`_ ztF?e};_L6r=5FPF+ade@W&4h;dhY{66kbFfGD%&!+2J6A?!yf$9p}1O&gU;?Pf`-t zG>NVE*WY!=RoWN66t_!fj16YITdDZo@~JD^`8=!rDq7;xay=hZvd+$R-Isge{oR5+ zy4j0+uP#&ec_PfFBO<(;Ok@-;myds&X688|_mJG@4ts;|Z@o1Bu$d%mf8o`cbFcIMlC#r_|8JSTGwjFfjgn3# zVa}?navOIoD*3doufy(2-@KUX_ni9nIrSwKcprFmuXg6^VA zOiV9X?dLi@PIRm73z@y=64X=$DkgsmeQaL3*~FK*Z0nPM5}R3^Pp9Q&e{%`!beh`m z=lN$|mV1&-^}jvKfA^n}eD+%R!FgZJ3p+zzin(2vGUZYpGYR6HPb-XM+e04aJ>UMfI!sqE=xuY_q^s7Kgs0DY zk!jRY-F5ZZHT|uE^M!i4Di;WOeB(OR^Y&+-)Sq*ng?nG{@ZMYUFY}-2=@+)IHTdrx zeDgQ{dan#Z}k*k{af}!L-F;#t*>iJbHZa1V>aFP?n<}4o&NamwH=QXqfgkb z{`F}^+lM87AC@@&cM)B8US#>!Mc-NKEz4!^E)UOp{=M+#N=?}b$s!d6e6#2U z%&y9pI?J~3NuBI|JwNi|zlnO?;wquKvnYP&Ws ze=MITa(4cW+W{;-eK-@etkJGHc~SGX3eEs8Eqww{z|_&mFD?LtNH5- zx1M=&*XzKtUpo>Ovt=&W>%8&%)DDrCRkt_Zi_H_M%-At~`_DJoHNT6m^uG5mQcaz) zeMi;%tbN<3RGpvk?fSB!^ILk(2L4|;{jA{n!(XGPZ9VWq$#s_L-zxbwO--qY|Di7b zL#!?~MqWAa!@NkTx;3p)B7e8!)c0@t)iV8e_UH4L_p8(|VbNj_dsvw1mY}IA9rn`f z&Gq%FYwY(rpVAOzw`c!3J+177qPYC0eF4E6S)Z)B&t}yY8vBoB*IkFYzjxo1WM~QX zuH3j?rY0bwwDk5S%ctL8k&Adu*(SxJzkFFe* zPB`j(L^R>+aR;v%6)Qftc+KSfaU|z};_Jf`3^oUH31(~Fd8AbA$tSo-?VT}iW~5n~ zZ-tk1_~y*6_4m7{)tDSIR&IDH`X}VLs8Od(P0lIll~ZRem03DZ^||iUTcTZO*D(r2 z=c-vsO%DnGJVhZYM^muO>)ZsPKe`)UJ36IWOj7fnlcdD$e!2UmpF0N=-)-~tAD{-ot9(f;zd*v^u|g7{UN z=3kY}-C5JOv0?Y`Q*Rtp&V?W6|M%PZXky$v&+8e@+Z?uBH2E&RO?PkawWEtJ*&Mun z`^1uWq6YsNzim?58hrCvjE@}-R_>e{KB+89=r%vif4@Y%e*4{ioD@>mxAm^JH1rlcoNvgi!0Y0aAqf-aw{ zU8cO`W$O7q-`}6xzU@#| zjXt;BCyw2r@`|Q6x#W&+v_HblUc}#du%e-J-x{g^r=EM8?vBW7a%J9~)?sy)yXfrSsC^n~hv==5H#K+5Kyyk?hlWi;}t3d2zzegR8_X zsx7mozHX?A`gn<_wr{@^SCiSFyk8a{X3RJ>)pA>&sey?7w6;5w9&Y*iC}QbZgG$j; zXMKF8cd0~NZH(iHKbt>0U|&gRVr%s$J<*#RKV6dWJ5(g&7kap8!6ygPj{@$OGc*fM z9ZphFT9|q!EMv>;#d#ZwI&Ozt$l0{8uzA+HTVl8VeOfc~2-oLz=Cj(bimMf03Y&5* zIO-0c^Y-}2{9osti0#Tu5Ej(jvkU;zB5C#J7Vr`_bXTKPhy?JmDf zQ8D*|lZ)5*h5B3G_ub>Wb(8#N=3%IB;&pQv@KWN|si z-7kMy|9mYe`%+rg_>U#0StG7N)Q_f2VwVb{3p~uon?awR4 zlZXDRWd=7}dzCeu$V}Rt!sX2#bNKVmQ%fq}R^72!cBLoG>gM0(scbBtzlAmPSHzl$ zH6PP^mbfKwv*O++g$a9kt#6g=%hzR@_N_d{@3Vi~I$ovdQvMumYX#=5b*mM*?z6c3 zxU^*rpZzDV2gf$dF7SBzUPXaN%|*7=)jhZ4aUqAcE+{`x?e|Ab>+kXl7 z-+TxEeOV-;l=CWv(V<;ip3R(w>HG`+e(Ws6AD!=jUGQnnP%`uO`A)5$ib z*%GfsvpcsMMI>&1knB(taq`=>dpqPOcbb$qaa&vHGIGs2xunQxe{SRArESxE_Xka! z<7%^bR@%3J`*OeBi+}rkRTAg1+r_GUvVD@hmUp))E8Uwu&oFsXfan<;$)L&*NyYWM z6_v|=a;8~T^sizLj_m5H+uHJMPe7k?-^*r6`9FeL;u}Oy`c25%({9-`-(r>K<=I&R zW!^?6YqwfVYmzEmS9BzUZ>h-6Ln12|s1@hTVA>j-^>OVC<=GlrR6JufR_cH1$h+V6 z(`KQxxf4guJr?D^>ofyToteeW?8~3byh6+Pvea@Lr`X4ePihx@kP&{Qyf;QCM*Dn= zb7Z*Otfh_NEwdG`)b_pOlv7!|*rC8tUbE25l5tsfv6aM~mxdCJ=N9*gy{OqxvXfJ{ zrJwE4P194^E{BpOv%gQ@CA8zqoijYF7otk){XI_m*C#(bvNK>((8VGPvzfb|*F3lA zZ#uN_;VPA@9?yOFmz6YcGN0kuKKbO+75_diti15V=XQ@t>iX{5j`sCC72^+eggy6> zQg1$UfwOLn`FoXAQ%jFyL8)6aUfgGMbYGYBRPbY?a+K!Xw-P-cP6%uk&e-mDDS68I z9h^5FJ-BGo9MHt#ra$ z|7ELu=IO2ATwfMxz9(_!|}Xp)Jz{~&vLf; zI7Q~`?i~wH7(dK@(BmYx%IINm%>K5Pdu@hg%riMIS%%rY-^rG(a#H+;va`;Vd#|o- zJ-3^CaY}naWbY8)Qm1^R~pMp>C=$*HEMT)pX)xvjkuDyEsP5Aq+ z-H`^-FtyeiS<_K8~`&H2*So!EJWxr~wj>k*6hNegp6XNAF3 ziSlJfef&>5CZu_aid@VUDEh9q=EZ7>zK&uGKF*-8S1!)1TorZW`n%c+?SKEa^SM23 zZfow8@(RAj8R}oPaE{l(PA%rQPhV9RKH<4Be^;4W_=Aws$-kC6)x_S^e!=`+Ab48S zwaIU?zqeQ2?0@TiT3045)3DXWob%>0T}_!2#zzYbvFvAy`~TLr;|!m~OfByX;@o*^5*q20M?{l5nt-OhPiJ3m}X{P6!l{8~TzJl#zT z-qTLg))C)m?OYGZ7mY?oLe)%s)lO6x zYE;Z>=8@R%81ltxS9YXjQ0tL*kw3E!o+va;nW4Aq-Z{+$?j@&c7c_3*blkwU_1KGr zzB4oyUu!VxWO;e%gRH3akuR^m+I`DD6|SXV9cpMjS(1H|mdeAD`OQ7E9@oqde(a#+ zzjKk(&ewVTPv&ujH2Gb5{awWPNaH=vC!Kwks&;F8xhC?nUk$2v?h}!*+;FHxD0aD6 zo|DMJ%inU&q$fG~XCF|=xp_{M<6pO?v1xB{`IgiRU3T45^Ea`j+>H;LuP3I-bfQP( z`pene-8~Xpl#+B8o@krdeWkba%F`1^UWV3nO5Em}&flPRn@jC}>!IHqw{*___%7AH zee;+0D<#vXalJq3@oMIi11(AO)$6)U!ua()PZc$a+RoX>xz^#l$XN;Iodj6|1rBCh@9Tuj1}3^wi8OjjQS z+_K4tI%(qd^kLTR!piKfRR72sVVSl4`|{rZ{x`8KRx@aR>aIQ}m=9&c2Po?j-c zTcmbCVE6rfJPkSP^kog$pG-CPI_AR2lKE-+=^4{ce7L-rp+8}F`Q2Lgjs|z;;su9R zF5Vw8?PKzj8sUPgZc}!iz7S!>xg`2RJYVyMvdpy1fSk$GRqpY#ez^YKR1}{uFF&HK7vz`I5a9QE!^Gss z6Q(Cjce+S3G)z=((&Q*Q{Eq)=s==33g#ac21_lkUDnlXlh08h^E=0W8J>!Gdnh&>S z*p8f8B7JI#t<;U)p2=6v{}SACW36uDp2UTdl7H^8`>XrU%kPX*^xu^7wHK1~G8B)B z)tBu)5OKNk-ht_gv#(2i^qm`G{rhZF)`|matRYI-S&EZu#bnafag;9mdQW`Sq?c+Q z`im2$=0-A^hX%IfMF&L%w#3Kj2=QrMQunq{ERLNdEhpxFE4?iC#YDXofo9LUw{P5h zM`L?m=hDe<51hVOt=@On>rSV2scI0{(-f^E+rP@J=(xQ?>(a(aE0a5P4i)Z97P*>u zsYT1AQn!U+t@}x@H9u}CEnWMZ$wY$pdAC-b{winDj|RHDH7D0jvVTyvhHZav{T$-lqb*dNY^>dwVL3axYKalfSlPeG*T5 zd%JEn$5r?I4IfT#SY>!_)9X(f6K4uYefLe#K2w{vo-Q9EaeFWTc?V|#BE9oc-Uz@m-9GVV!}*cd&WaPY8ONAe6umgP|&xq zh)r!@@!;&KT|s{*?e$o+?pCSu#0w_z!KWEJInNzcORGr~Z{AYHWZ%?(sxIruys1h% z>Qr0YvOQ$X-%Rr2QY&8(U!Xg+<4<_M*Jb7ISO)$D&|2?{P9yE<_D+l zKl@ev@71?QUcS4s*g#TwlJLTszcH)_%M+Q_98XDm7<1d3_gNwDwy>OSUsJ9fnq403 za_!+hzZa*cPK-B_+j>CPoxd(k@`B>8ppNffmOi<(HN|=DkD$A1>Ases6Q43wozjl} zbldaO^h;9;zAXN`)bfP?BICXFcVAQsWITPnrA3X4ogwOx3^PY~zW!QITS-3NFwqas z_oY11shC+NUAi%GAv@RKhT4xEu`c%cGlgb-kJ~J;^-@dkjJ9bzRTXCxd{^sKYx;EO zoTdFEHtW>qwnZd}E9BuVO&)u%F-y+R7f2YNrO z+;pkcbW@j(vFq{1&-pKNR)|GiUw7!oBF?!}m5#UGnj&yk-R-nF(;ch7C+@kt-Qs*z zwAAErN>k6(`LXOb|1T<;R=RfL<*s`!zDo{HJ8v`T*vTKS>nv7wZk#hYQustqV|VPq zHxDPj&kX1e$aM0Z&sMfTulnBaX-mJVx>px8nR?!lGYV0;UOi1jyzJD$=W6w}3#R>; zs=Di+ewlrFt?lGp($RY^-?z%Sw|;f<(r3ayWaQd=DG#4tz8Q1bey^aggkxIZY%V`v|EBh+ zUNy}gbMBIDHa&jxdQLvhsyTVQmiL~){CK8+0T;Jt8f1U?zvi{^Gd4X_rsCOi-|zF| z7Z%tQ6cv=ttix5FVea7H{;BME|2~C>4_GWj-I;r~#?G{CvhvdNU6r+ri+yJ8UCXaq zKboaS_&>T@v0O>`tm))ApVfoyZ+tzZFWYybDPr^>#Rr8e}X+Jt)DUOh?no@~wa zD)nP)oNaO(rCF<%vF~ard*4&G%g<`dpR)Tsw)fA*>TjF8SkO&mPjRm7uX##_Ph2AT zCwAOt7LT*gH<&N}xbMX3n=X^NXO}G6y((vWQ>zS5os4+!9*v7RidKIdXRUuY;iQ+- z>FXTE|F{p_ym&6~yb$x5*M+ua^-Wzfyag>T&Db{MWYh-rh*Nsg16gjsW)D4K0n%Xv4F zS6uw=y~znDCOmv_o!7K|&Xi(>9lJGRe^vdj;#xbe4+e`KTo(q^3{L(FCHS2xw|-Z8&A+0b&g&~-yz^Dd6yInC-l9;|}e=EeMNDjm~b=^b>7 zp4j*D-WNZ8hKF)9W{LKiGf{)#@j=`<826U+(GZajs%A2@B!UN(S#FkEomTsTP6#YFV;%Ym;$|ixU=PP-4WlmoI z+t6D$fqTbg7n!=%IqWT*pk%(%aocOLHWA0!7apgt`Riry zIBHw*UWJ{nW{dB9S)KE8vH8Ii+Zm-gy8E?ken}}@-QD_d*NV7ZHtEacoA)gbPPww) zw?uHZ#;RROwX^1&PW)IsM_nwm$jQ^QO3yxyf5!C92`8k_xTdJh{JBZkIBXGz`>LNl zz5ABW)JpOc*5tE0zVw$&-|Ut1>uS`EB9>V%s(5<;{?mkNufN)tG>^5sUC!lDAgFxI zL$|s7$CRDP>$#70O8fB=Hb|vCpHm8uD{Lz{ip?2Qss&*YUA)YBp;>{+D za(Z4AEn}Ifpa1NNbsoM4H0yVFsdrVdA{pYeOpg`?qj@Ell zDBN>pJ0sK~lvL2^xL7RZl$n})XH52?Cv(ND%S1KJxx|%hYG&<|n7HX&|Lk!8BP(XA z@y?!Kn68s4`r`KHu<2d%R+YXhShup1n>{b4 z>6bUday_;MwH~XD{+>5Mwd$u-WKpn>2%F)wE0V#l{r;_w-d;8{SzJSAb?c^+8oSOo zNasw@QDZGOUZK2olhn#3lY@SBs&eMc;5V9;Vx+n4np6zava41(x`#xoKba_a88;7~=TsnSuFEh9o#3fJPpoDs2O}bXcGS9gff@2RA=`kKkr`E9t~@Q<=53_ zoKWbwWMUY=@%YTzqi<(i@;m8XsNxs2xnlRJOPn|yz|0O zT4l!it;VVbC(WXAxx+5{#9t}ABpE2{XSw~r(Jc4;^Re&l>|FFnWX%K(pU}9%M3XM7 zsc|P>-K*Rlbba}b4U13fX?}lo`qb=ilRJ1nSY=rlZBro5N-hzl4db}Bq(H9fZCjnCPu-?{os z)jf5(RK=oHKDuOfSo~X~{G`jZi9>$ES&LU|D?e543bTk=9$Hac8ZVk4x ze6}rX-IrKBiG)UOF`*lk_ph9J9PJslxyW>V)9NcL`}9;dG4mM61847Eiw!SQ!=R&hfm zXk|*q2CIMf+^!sI;Ca<<|Bo?Xoz!9z)0LjC(X*qnx>^^mDfEcizO&Oi#ARZ4g@5Fv zM$Y*@TV`Ebv7)DtOLlQuxbd}(=Sw#$FH!h=bY;O^j(Vp>0&{n4UAJ?l8%JU$Xv3*;hsju}O(&PLFn-no*<&KdA~sxfnD;V(eWHSl^~0A*-!3ID{53;x`iYAU zO+mr4j&Z1Se4I4h^h?zCu=Y*YBtLe%PmVQi-ytJsWTg4s$m{%%>qf7(sMb4wdKk^% z?)pej*Dn0Zi8WcJ+W#6hhIczRNyu-Xcp-qbI^uFb>Xg(4!h1JPZ+fNbS|F~=s_9|e z_)2}wh4M3}9RNWj&^Gf}@Vr^81y;IboEGivUtaeltnE^pmCLku z?%t-46gR&#SGl)-*1ya1&tID=V!KC?FZOFzxZp*l%^4!AS4L$%IF{);*TZR#DI-mP#vi#c@;#%oJpC=t(`Ql$f%h{Q0 z&$>4ldwH+?a;fJ?$-1opG7|R$CZ78hsxg~_;}S;BTvZn*u}c%o zFHGGc^ohgPGigohyO%CXzksDu5 zGlCEO6g=~*)vig=C;B~un$d*DaMoWF(iJXCo{DG-)BfU<=aW4pGD;`AWv0K}`EJRZ z0?(YqPo|dV-jL1^o3>Kh?`FdD?LJ5OK5pOr`F-;3M}ZUGNvKM4NxTeNC3Kq0V(o>! zmxQ+LXfc#oXaE1k ztYuE7*SeRis?D_#nX)X;D%hn-(7{Mc^`%&aXV>-O)0LAgE}RP6I^(76feP+p4iD$v zQO(WRHRt-rur||+zb29>6) z>rECguriulT^!VPgn7|c+vehxenQ8DXPfbG<^&YGY^aTjdZeGMruFP_{-k#Y{6so- zA2pv-`ukbVuW9#sW6t%nT6&5ZT&HB&oa9oOzT%1nB- zHdg7Z)qJ0jzZU%$#qJk<`(ZBq>RHF58!z|n&kwGRzB(bKliTA&_~V_T6=7f3>M;p2 zpXJn<%w}hxB!6zEu8xk(&qDvq zCrx`%7;jabZhIi*nf$e1t(zab&dpn-*JYO)zp91p%~RfWt9Hm~Yftl^91zk2s~+akRRuQB~W~&-$|e zo7n01ce>w4^=$aU_k&@>v2RPurzs^ArTqA`=7-6VV5W6eBHW)6mi%;4dSl|PsyLC&4eEQQ+LovMydJH@gW6(=MD_Z5GbzMvCG^N}8LLG(SmrX9fK_ zy|3?dw2#-UL#!=&uVoj1nB25+t-_gSf^wV~;qMd9WJ74vP|9k9UAri>6ID6MB?`7+}6%Re&`|yDCM#FBai#?|dgzMkU zGh(huPZ%6@XhVLiKd(I`<3(0r7-C-^+i2W^-?z8(O)%Ta&pn7>{smj`&NF~ z^ZDMbB%9N(*ndxuj{GQHo^f5_b&MbDKc-^i%?!y?-3dWng>vB}r->PxQ7T%>nmQ;F&8(6*82BrUHO$_ z+@cqGwu&ign{L~}xmRuSk&Qb7`Zz9f$^CSClk%_WjZk{wqXld4Xeq@Q%}bc%@U=y) z_{-LJ?>rVY1x-x}*v$0wTCwh5?^iy>{+g$y-?Q&rV>02yXWfvG*3muE=UsiX^ECDK zm1e2$e)oXuNyF|<#mV0`?(mtS{XKL3fuQL=hRX9yBhvCYUv9`ka`dBeF##6nl!}OO~(l3t1zeI8jn?4&VC7a3VM8Dxk@|hr+8noh4e)PfR zfA1Xm>!$OMMtCx3$97*y!Vdg`f4VhbU_q*y~;BR^t%=Cc3ch$KVUdF8qo!=;wK==LWuF(z-CK6S z=#$Uux8XY{Cq=vaXq(y@noe~p6X%$O4lEt}^&v&(0@rh+NU0eL`JKcD;>@j;>@1KPp0j=5}Nj0)JpY`;MJGT zw_k=&+PLoAiRb%z*5A=+U39T#(E&5JkG>Xbqr3#870TRHwUYZYSDlzrG+#NPEKRd& zdBFNEEt~M-dEYxvysBDjUj6cD(Igdt*KbRcjMKz9OWz9p`V^#O(Y;J$(!azFEzdGpTqx*ooEN@-Y1V%OnW=oi8b_ATY32wxkay02)#F*5*>#g2xqCCx?sM!2G4Qfw z-WsMHx^ItR>Ge~=uLGYiF^t-}sqCq_d6BrkYMABTDe*6!`k$QQaUwKoV-tti0h72H z_azb*3I*u?*=|+ypf#AAHHfK!bq4Djwua!Q`*#i%r98W)V}4JqqNH_M&C(Al*50bR zN+J3mYdODpygeG?f3-O6wALEKywj#Ohs{r{aVlQa)UlI+VFv>%!+}X`CmI}Cd*fYt z0~;8bcJu{1^}f8(yM0kdfv?SO!?c|xX;XzNk2LIBqy1Sb$wU6j=NSFKwC&BV9qV`f zn`Gf^(K7W*@}xz|>eGt9m#=)*rxkIa_vH*mh6QJPcKA7@P6gpKb5^9;nRM>FW$JS2y_BB^hig z^SN~&ubJI>qu4{n8&Z`PMOuG8efNaLJ}t9F>kjqYJ=B*jF|G5#l+R~_XN3p8jcB_m z(UAOet|UX-_nXruKJ6&p&=DILSbs=L`$p&EK;>%;CyiE^8-6&s=#60pQ~B02Q3)nl zj*H*UI+P(jxj!a3^K<8w3pqwEOB~szR~$BN)xI7yrTodMLtBrDYX3S@f2A@oadp2e zr-xnMf1}i$|M+eNJ)L~GIftyY{pp~bJVpGag8fV3&Dm~sCx^PfIwdSEf6CN#vfj0A z`&r+fuWI7`W6k#^;lSQi2X=}bu$0yd-CFXo|H-@di1*i&1QaWsl$7ie3lAvpNIc?8 zD(BfaDeFm6;wP1_@22d~bxN8jVVhC9$x842E9(HmZ(A~DtW72#3%@!&J=9Dyv?4;v zZO`{P?$5gC=j}0P^6qgETCv=|f|0*sAy1Ve&%Kof8(e*_^eKC&%*j8rUH6Ex9oLH$ zXC|Is{rQD?iOkZihbwAj&bxo>3BCAfTCV81nM`?y%V$lCp2hOZ%-wCqOJy#p1q&yt z9aQ7sna5M6Zp_k}X&SUbTk)of(559G|7@;E1@}#HJuMu@QeU1vPwKRetntkUmmO`d zxYl0r+94~6Oe95}Ca__CRe{XHHy}h;e_RhVx_x`*MG8FF?Xr;B8MICAMlkahL=4Q`|^2~p|gt?&*}X;Z$xJwS=+|G<+-8rdw;bv z4*O?&uh z*1%$R;EC_QC&`shBlkUx{r5D{?pd@Qvy;QL$CopX@fH5#Y2vC|@Vs7uy=vd()#`j7 zELnpVo%U6}8QMI3kwVeoAfrr$z9p;=U%!gH*WVRr^IEZu?brg_G{1c}ckv`w&){v^ zrtOsZ?&D$oKs}$z`7^aIS@THU_J5t;^zQAvl!T#V>PP#L3-Cb_?&C z&UilQNN>Mw%apiA>*eqN{$o+D|Fk`V=TqJLyUwrDYCc!)`J8>{v*mr0H5MP#_b6$_ zR63{}7FXx_ao~gUk;K-cH{PmT`v3RH-uC%dcqYHE`(CajrdR(y`Q);L^L|{=a5iQ- zIaMaIdg00WHm8=pY1uc^)!ex`&gpXNJmr#}lv)LSF}0Tm|F~?cJQJz>PkqI_>^SDd zmG*zF+g=;We^Q>GV$a24ck02fBz6HIn>~D=zt;c%DgSx*J8s59Y`qdD88;LvE=am;s(flv)Ygm%Hl0GM;?0I0w-ipgHnphgWV=o@ zP+SVS(skJrr=X_u3thUUY`aWWUYfTtgr$uF~Ekt73L$9KH25`}(S+ zgH?C4!juGE@^2lh+|4qP->0KP;iZS^s(X8Det%oK(Zwfpweb2PL!T$SaY_~1#}b7v zvL~;R%RV}TK_n$`fk{i&HlIr=>1WlZ&tj{(u;ta&HPO4*EloaiZ{?KBi{4rl>bU;9 zyEAvT?3=)iiJgVdm5iKb9}L^){>RFFk$6>zN|QCya*roU;!m@rqmQhZc>HU>esrDO zu2038QcAp&);;}cdhyKCr?>a_-#6)fR+V}E-rXDZ3}$6_8}_bTdLvO-)P1^Oc`o~b zqI13;i6IS~W;Y5XS1pxgxZ}I*L8w^jlZz?MwJwvr4O5;8r)ys`3d&e2%W|dr=SP)5 zp1?aNlKbu2j>U)k`&f3n-sK;gLZ0ijX%d1AHYX*TkNX~VXsHbCc-rEY;4v{VUQuIW z``w3MW8I`nzg!H``Bxz|J8$1hDc)oY)4P)*MLoslr7K2;MR+q!pW)8nqqa0wxbV2^ zw60G}o&F`n6kdvBCTOo*p|%Y^Xh)BtY6UQm9=u&yslR(l2!<~PVn!{ zifCkiq^cdoaw#jjAm!B62NQ&Jx!#mqJ)4!iAfwFlj_ZV<5141=iXDy9%|4VO=ktxx z^ljG6!oatIH@D5Wzx_oi_uAF#Z)vTbw0EiYg8UcHvUFU7q!L*KT|Cqz1zF#EH*@{@ zbvpk56Z0PZgIX^N@(*z`C+hEWITEn`klm3B8xDD7JfC>@`>}>2+&l(H4jdOSd?Ij? z=VofrDS^ESMJEMHbBwt8clvxjW43zDL}$~-HJ?u?zuv=g+V1_I%@uUoLANU(n3O&b;Pd^Rb_Ku^W%X7QZdMk$Ti%w*R=q!4ey4c+0pyiThWpy>d=q?G$9;y;uCOS;CuTqW#~X#2qbeKlPO)9>phoGZ+2WnOMhBb2qeX z`aTY?f~F1H0ikjpjzMeniwi%5GrSi6=kWjH`MRIM2RY^+(qTi&sikJf7SzMt*EBQC)rbI!jp zy=B4jPg4#$a1~9ce=}tl$4x<_vI%v)Of&vvOmO>mP@s-Y=fqzY<{1p<)?4{CF8M3< zRm9`clZg{ld)L9lejng;P>+;NfIm=AvTb{j|9d_Al-H~4N_LaT`Nt0(iy0c8F z+}WG)}>it_q&db#;YT z>8gOar}xfiy}Bl=bal+zRpI-&u5IWlU6Z1_I`VwiwJobk*XHD|j=s-zeZw*Z1qSN? zZ+4D3Q-ai9$1pHVi)8?xlg`Be0@FKNv_LcrbHdI^cMc2I5AbGY5nw72fYOYEmao<5)cqB&(J1IR7E zrGHp}tkq$FxCOfpf!vn|z_R zHeHf|fk7O_WOQE&Ae-!(S5lOjT722x@7%T18YjWs*~jOp;uhJ`kWmStdINKVeyPfAV9E7o^RPEIW@cFRdjFIF+sOU_9w zF3$Cj^=5Juv3g&&{Z7;^{nEaHBs-4Qf3Fn8%?>@ zI4OK_qW`h$d&IrO`NUp^+p)DRxVEZXRwQu4#v>1w+B&aet4m+iD`WKJJd@~*Vz$-O zN_0z>ox0;C%ptB?!8bR&Y$IELn8?ISYI2;yN3SNc^Q`9aQB?Y4X5oF_8*Inl<;3_=Jb^NSy6f4ezj>?LGxlB&WBfSna6JW7pq5{-6xvZ)ytra5&)$ZLyj5nCB0n!7qeBzNtnQ!c$fGD5G|T`Aig`>Uw@ z?X|mC^P+FvUAJx8zw_nqebf{`ect|Ick%xBcRttNul#rZ=Y!t;w!dvGSM;=-%sLPv z!I!U>Z|=M?r83nbM{V-fivi(5%IcT5_%764xc2GEe;#XA|Jk%G;7m`}lQgT~7f%=d z3)#8zXwT9OdZL}j|4d9d)iaY*Ej%~2w_a8Fx+O>b47JeX$tOcJre*QE{`OHTuk}6s z>e$pzQxC?yUC+ak!c_R_l~h#LtZePo*)0zk@-NTQs*g3DylvC6ZAHENS#5mJ_Uf8m z)it$n&dyqwy*6iMqLJ3>)!9sqyj%aB3T0fz`TDh62Jh6brVB*ZeAm9XSW!d7Lv_J* zqh%}2E}z=Y%;S2cdlPxQR8EABQYEwYQpbJ<($S&MV> zZ#CmNQO_27zt}9bwjn^-Xysj9wqCpACfebfPkl?#Vsz9^mJD&_=*~h}4tCmuz~nc%pni?Bk2f);(_JC3cPTvR3n-5dQC~XG8j&7nXX?&AIF`J^RX$ zl6T9yn49gK#ZPpGOI&fvE=W>IRdZTtai`ern8hiEQZw0Sk=~5G*BTX%r*5-*WZHb| z$hmVfcAA<_T(@L_Tlh^6qbluYy(Ox`Ctbs(MHZE%6qRe-YzXzbZ5Fv(aHr&}7ZTk1 z>Ge)LDHaI<&AV1eODCGjL>8@@ExxTXL%1|+i{uIezYmgICX^WZURiK7L{E9gH>pD( z`$~Jy`eggRzV!dSxwc5vT8pzPLB~XsgHA5^{GvuMr`wUaMAs<4Qbo*jZNRs~c6_&1 zU9Mz{^*2ATgJVWpK)>ZNDKj>%-@aced;cju*4mg`x@Wn$Tyrh&r%O7PFVmX$Ian3# zu)j3%)w#uUOS;{*KU;S)X{lqph+p}3$(OJEIA7-~J=4?CTN%7@*W`UE7pA}T)1LKO zvD!c0U!h1hWlo@x+^SZwfV9k;#uIW{M@X-#tW8i8#BHxj978{-p9f!m&N&g zW$`+qOdLv==LwvdAdvBv>+7k1_bu=;Wys|Cni8FukyD4a%hf#tXqheaS$3NTVdrP*nSWfn>eS6U(V!@8HO^@WIz9j!N z6TC0}IsHy=u2bA{(xOB`?493{ zzY|~eZ?u|`E}V-wL-7+uG--6lHV%y#TR>xBVF@m z_o#}^__N;e`K21kzw_PdH@<$WDckDEy~g49>UO(Dj&G)0YQ26IxqOG^a@oRf3hXS- z$20$mZOf|hnjJlx!KX^%g=WB>s|j;I>vT+NX`0Gf>+T$4c3DOE=D}G9+5DTdm);C$ zn6`G=VnN;&r-gaXO&6K?WsA{cwRwvQ8T%yc&CY-SU^4MF&%DH|$G5&i)%+ zQ>Mh}U8xW|Gc$GT3?98nQIA~SZ;0HHCS5a4NoDurzfLofKisrA?{s;WL`xexSJBnY z9g`N=Tz~L$reE6HDLjGiVw%OhG7H?!o(qwiUetN4yNGq8nL))yEmO`=`vYNVAAW9{ zDYGXkRP^Rsn`V6hJ9n*n+A;GDe<+1k+FQ=$0$o*dE*?FlwF-NyKB&tYe_G=aE z8~+G$i+;{vlREpN#~zuRlHQ78X9CV|vRU^?RBG|o)8{)EGe&H2Pyg~q)HM2V+WIYu zM?V(q@Gn?rA*4O+g?40w%zK?M$88a;HHR`Yg^;P3m)j?Dedg$YokRVh0lT z3khz}Ulfy9puG6v>`U1j4@5UGzRXIW)}y`u$DWzeCVVO1!lkw_1piuU-!^&D%`#z& zKQHx!E@kfZeCxoNXKJy6!ShiCi(=*61q&WU=jC?>>nR z%X-(nbi$TM@$5aOml>Wv@C=Pt=bCfw#I%#87gyXA?GiivHz#vr`|m)xpPy@NnT)U8 z&OWs?*DUH=u))b&$&z9pO4;ro$vE*PyFwy>CR~v4b+Z3kgZwmsQF5G^PRj4@7G?`YmTny?J0Xat8i86Zk9x)ho7=G ze$oowW!C(D+Nn;jP<9625+$FbwdD)hAEYk7yTmNX&3cXRjA!*m@q1^!>PwgW`t;$7 zS1qP>2_?Iz;ky{5OvVJy$;<68tsfx%$kW6u+0(elk>SzcDp3{YymUN}s=O z8qwvKZ*{1o)b**0cZ=Ovt;g0oHP`n^X52Rag*!Q_*yY4UFX~+KIDSL<{}QLl8UANx zO3&~=HPioCjn_FF`MdwF1is#Dl6$2}U$iIc{nD3db5Y}7{inapujU`uJNEvj*CM??WrwW=PwbAg z{j9;IX?EG@6{GsE)ZbrzTGTeZP+9KKbmG>;y*97BWyHiJSFgAg*ZleFbm@)Dp3h$L zFK2UHS6s_-uO%O*HYvYbGa-I&QpY5*g9|x+<}G}){HfT*(8StPMUgDakD4UQ%u05- zbhN`~QA<@9quKLd`6YLqwr1?UerfB5qh>GaY-8QcAH4USAk>hOd06*?Th6!aoV)cs zb?>Cr+zUFk@doV=SQa~dnKb{!vWr_EalDPNGuroeQsOPiIdkt{iJfA zHZJa5NA+GVm6|bMucUfw!}X_EFMU}PKKb&e*`Jm_R+(d%R(ECf&r4sLteD>1kKBFt zZ0kGcFPk`aSG+%2`{}8}wWM(69?tQ6~6p0rS*g2uVTL+>BnY%$anrRJ>}4U zmP7wn{N3m6v_E4TSFQG=r_Ejs&R-VZI@35s$SW6QI_-tCoAD=uHQ*=%w){gLLe zVn1iiI`Jv8iTB<9Ovyj8hN+o5wd~_D6Mfy%Wj`nVHMv{gq0L>9IxBp-+@oJ6@r41M zm)yb&H|yTvnv#C#?d%uj414ZB{>j|+kW=KQz0-Vq#Y=WBjK4WtU+Z`5*ndgtmxMv# zqzeW?JgMX3~7xh|TA-~BkV=h(iY?oAl;`LdY8pK$&N`@9-N&svge_f|tzX36r}pAt1D9);^ZJYlRb6rldr$1`?`qqrZ*k`DK_)qgN4c(<`xMWb^MCv%Uc*|` z{ouaAdyZcVj)*gc+uawa_iS)yD?j0|AYbeKx%UA(mOJ>1{=203?^DMYZw2!}-Ysif z-FHZBvD(FCu&?jWivv=cZoUj3)2=*Vc(9x`EYo#wZs@Fgnb}fp^OBmoYnoW&Z#qjc zTz=U!bYgtHwK&?lLHTeva>Q`%lS8 z`M^!@!Z+EiOZgk7utN01c4o)D4fDBJK08`+=k zVBCz$Pkw?&UM(&wF}xOFVCa*_Hx39Iu|$jmI)g_35F>!My$(AF*xugK8yj5xQLl+h zG|F-D`7Q<5g#k4yuN>dxIepixJe8Zg*_b@D?rFCX%UQqG=L6kN z9_4br`mLu$?&sdhtS2)TRxI3NG@ZxK_;u8)vs)`CxV6e@tthfu^Da>~G|I52G;5M) z#-k;Lrw(p7cA)yB3g^?_t_<-!e!G)x1{JbvQ$l6`(li*%DH+to-gG+8cSJriE zd!%wUx=z5;G~veD@_(W+Y9AvPpPrD*T6-|ym51uO$BF(e=6jxVON)uU47c&}4ahg& zCDx@eBO*y-xozz_wm$3LEfPjg&M%$xtLfkh^;qtAAup{LE=^zDvdJ|(EN9I^AML8f zt`doAD~@b+F^Moq9rF%n{}|8tWh?*f{bw=rM8fu|v%+0kY%fW9%yR^d&8nsT293>r zWc%F;8k-G^s&NuK-?Bv%JT@yU02-T(2aU}}gT`j3KIuRnn_UGSo6Uxe&2}k#o)N^z z!0;I*juOzu&9w-`kyC17o@ZWKK6J=2yt*JHT=M_il*xBnyg9fzTU1&dgv|QyGA!N0 z#L>dSG@Ew=CfH-nlK#_i|xGw#tF!_F^3EEMnSiyB64ANsd@8e&QovOOpE6hy}q3 zy(`=7rfNGsU1`Uu^VwbLALHd2S3=+Qx-u=4I~VY8UNxWVp_D$}H&++Wo#+s+BO|C$ z9I{jRkALby^=WMd)Acr-kmYze@83N>+e^>hbG!=EdGtW%xT#KCti$Vz$wI7`H>(zE za|%9lQn=s7#3(&edP%d?v_wng=jGjU){^gpZano6Fgdi+e&QnSz-pKGe6Qwiv~p%X z`($B&v!U0EH=gw?v{#tVdw=CO&x7getMaWSIpl#wDrk5pUID2E{Zt6XNvaxwpeGeO~o8n*reYXd@R^l6Z3MW zc`~=7L6*w`rQY2yFXvC@^?9Fq@r&P$4bBOfyE1Yr__M?KzkYuuXj*Va{>}BpVQk84imNcpa8?3z>edsFv?r;(F2Fk5?LqFXm;Jc)#bx z4xiIzJ6OebNzcA@>vq)bev|jN?=L&p>z29dXqz*W>F3v;LR%klY+YIZbjF;^1xGGC z+xqav?yT9WRq8cwm}59vmmIkDGx(fC*wZ_lGTR^JHBM@om3is!#(y1llXIl*wU>!~ zDoIZC*D4K}J7a(Do^WUO8@1xWZzkA3dVe)Jr`yCN|s_#UWp0sxTv_)%qhTb{l`(2GsYz=1yAKqKk9O1#8 z^*$(6`(m1LHG{lBM8YjIo6;rQZi|>tdA_qk;Cu8(#cRcfN{ThaINg79gjysWWqntk zsm^)+%d&){hd*AMljGEUHp5GPuvCV4)*UQaz>^T*7K5Bi)vMOyk|9ciel^Hd=7$#j=KWk~78TZuss09^re7y4y z25*s%4;8(UqxNm@6B)0K%9~$!^7?znithdAup+j|dqq!AUjBStB~`n0h3UJFFLBg6 z%joW`C+1;$K5K>Xzu$}6PDdOt?ek-wtfe8jKj-jg&Xa2_*8b2c|KT$Gen)z^FOzL_WseHl&<+*L= zo)Bxj2`?uc3O7hQTzc+@vh8bApM*)eI#T(GtS`-CuFi_z_|Updgum_nA1 zvHoQaiZH6Z-lqBOndA!7KLL3!uDvTb^5EoQ{xv@WWkOPq35Ttz{`ziNLH&x=hC&k; z>{F~>eevnyz z9Ao)i_JHcwg*_Y6n3lv;mOY#<`bj_BthZ(ToR;-9|BhdI9Q^otw#?QKwIMrPy`Qms zvUwbl6#q)bHSn~+w2D=8lQlw}XFk@*7M%B5B^)@@0l|m&i?7WnLXio@Z%RwL2{b&g}SGP@J;)avX4hKqR&fY zV%UL$%3sCi^_M4zriLGGj;g4v{&dK-xAfx%mxfD`SN?Zm-@Rsq%cA68BPDXN?e1eaByK?pbj1_32IK)wMUjHOI{_WszHdJ}v+2uTPubw*P$MAsuh_JMg{6JFk{2 zM!YMT+b=Ft=v@%MclnNag&Dg!B@5Wy%_o{o-WF6OooRjWrei|6;H|qYrTi-!Z+)9I z>qqu6!+96qJu@m5evr52kq+a&>D$;WjXTQHw)REO+1V=h>QU*@Gt0PRKIH7%9^U`x z@4Pd<(-cE2xOJqrrHZEZF3R5YB=W}7`sG<}f>m5MT_X>R>nu9(Xim*LdwY4OZSFkX ziLaVw>bR-s>1h|Vi9BBPO*_hAzSv`#YeoF4pKYJKh4s7PK6Z`Lwhjq7+Z90qdjhsx zSiX6&g?ZQSJ8dgx71m6+neg$7pJG4fhY81LM!qif5;qEQdv>{1^~}Dcnj0ml%|X8e zUM3dtOwzm5>we;^#!Ew{Uls=|m_&bwy#6ng^+AR4(bFp>$CsWG)sQ*3;M5k!nVI6f zKGHJJdJ@&68$a-*$~zvIq8pa1Q}+Al&7SE$p9r2xu{jl(xy)(D`p0|p*RC|Q@eN&MM^9_7WG+G*5*R1v5mECsts_7ZO;`{hr#r*ho*N7KrGe!;bs-&j@$t*Sp4@LzSBVtl;k#-Ky-o2G8} zeE;Ep`~s2vPwuSu*ssQZUSZi(%}*y&tS4P5Z426cZo(_8Cp!*ZD?F(#ef;`PnX+bQ z-rmHDKEJ4wi|#EtRXhJxW9Qs2<}!bEUzR`lXZw=>%mVvOSNDzod;n zzt7?Lf57k008PZ|%43dLMjSG=ACS+z3YH z==cAb!g#xLO%K05sL6VbVYjo)nq(iv4yKe2r%OcZ2_y9^XxueJ}I6aQ}@%pZ|wlGRxZkN6-58oRbOf)|g+)RWko~ ze{SfTw2EqvHQ^Ue2+a2QJyChqMxPylN>KrtHcP@Rjws62-`e0T^YrUK3!6jy>t868 zZptt>er$AxxrJxlq;IKVH&!42c+24S8DIJ6U$c{cd|bV%YSWKuZ&jZ2#cB$lHY|F! z>iCDtGjmRbcBMQ#vFF!JukG9agJ+_@9sE1z947;VxG26}l@ftgBBXWL8dg~&d|mLL z7*F#2>?u6=6SvU*KQkLPWb+;x){n{b}J zdMEefMKuS6S!(;! zTbaU(c}+TP(!M@T{#JMU?C~(QPkqmi&5gNNmV5tzPWu0Q3)Qaw^fSu)TD`ZDdGaGw z;pRuFY*{;vCT`=CGci!L>sWvH>#vyHBj*CMb+#5Im6toEu(_!Ou{}FtYcINaQ`n;8 zeWj{zN_12U=C}ylv%3BC(r4Y?t%twuwzW@I=QNX%H=ASnsXp?v7_;fxxJ%D2?Rb1k zy4pB)+x^VarMaxFpI;p?(eyc#(&T^hr_ztihtG-+u7BRu$rWsPw&4+%?){9^7l}&Y znL3%>ocE`EpIQFu`~eYRUp6)V{J=ypr!7-gZ!p!gxf1euTGg3@KEmP>9DBnyi9GWR zNaozAbG@lkSvX7yA{D$z1y8bZg$Bv?b+Ot9Npb#KK~XidvJEkJn1cV#(%Vysa)Q@;qH;VNqdvNO}Vs0z%k_2 zMt8-=l!Tgw(95TzEGOh{h|vz+a;H~Mc;%@lyDPhW-_9;L^>p>zp103Va3~fZM_8u8()DIJ|v#?)~kPH~HAbExw>_ z*P_yxBP;Q=agzA8?Jr!f{1#a^^O2NBF&Yd!dT;o%5ykPOsBe_?t zk442R+q8(Sl!*QsYa!#JI#XTeW{_5KxK`(}a*lGXJH6FS70o{Wdh)W(E2p{KQQi6F z$^B}dJN}#Y-r_Sa543$J9Ps|A^PJQ(cf*eRR@FA&zA;D9+IeYP+Yb&olaCt5Jv~hW zf+}Lz!hF{qe=WTBxX8VJewMY@o*A*exy$)uU0TT}Z&JACPIZFY!v}+@pAvYw;>o zi&l+2OW3o+?ku@mRl^x?@bPKm&lpaJhpVNOjyF2|>^fxr!FQRC^ooei+PV9tZeV|2 zFIw06rKo1_Ja_d?M_tzTJbSMZ)7sr~?Y^;r{-0a!{R!{qF8Yw{80WofE8FjvJbyeM zreC`JIQa0}<@TXJRO^oB9yqymW9FZ{-l;V=;`;AD5Lc`7X1MxpYipi*?q`F^8;W;s z&D3@c`ct=HQg+PEos%B@E$6B~GQWv$h206>w+&vrvR8TbtoacBN7v$9$+z^kTl?nv zv9&Mgs=SaXf8uriuYk|ftNsY<&;Akqb%Xv&!Pjc*ulrwEuwh+chVb?iPG{02-9AaR zO7%?OVyr0&zjog6sJef4P2a+M5p&M}w%8Zz_mjhJwvxJ`Vv$rYtB-y{*~i>{b=h`) ztk2rNZ!BS!t2?%6CZo%aDZ2wNUg4{oynb`f4@sRHWm4UbF5Y6&>+I7?I2m{)w?oIG z_vyvt5c$T=j3w_6ypZWF7hKw18SArUy1@OVGn!O04yEpy7IaQH?czm0S=9?ZQ?%n; zG>X`aU*tX2TqEFlcooyNOYt^BOYJ9icne=P-29|S%I)*Mu1jHYt1ljCKBcoISiHkUeLJ!C3eTj1uwsNe(Y zeMwG#SnMu;NMeldnRnni*N-rP%VIg&N4HE_%W8Avbz<33b);qT}f7O+G`yXNX zmGMM1tS(?n(Gm+;v*MGo6JM-Ma52~;FZMxLQ~CeDIrTq(eEln-JZU29AIIx^8tmCi z|6Bk6=X~8(;H-WZo8p!N4M8nM|5V3if@exT?c@A>Q(Bj!P~^-puf9&Rme*OQ&`unp*vrqoG?(*yHxi_=R_rE`T#`u5jFQZo%I{(jzNKEjxsx`7)nX`S$ zo0B(}PU`$6^=QM}RdYH+*>3sWSpH^-?Q8X`noob7e7EJj$ek&{pQf(1Vb)$=RJJW; zf$3I_yL0_k2d(rM+r{H@De2*k=o1>u>o4T&TON{7(Gl`#P08Cmi>B$WRP8I>J#*sB zMW4R3YZS-CR|c0w?YJIZ_`SWPXst&&@0R6Uab}s~Z@+Bu@>>?FH&b-_+>!;A>x)kA zJa+9PPw=(}PeYF#xE7Ihb3%3My{m?43--CUZ&G`@BP&DAe&wFPYNO>kCQ6q$n03Y0 zHL7k7ik8-yFjYKmVs5bP~BPxnV`| z7oWhdmRi#}zjWPSK6z>6@v~~|ZdWto*9X2g%Q4+Jmoxg_rdH_>TFlEbmWZql37mH3 zW{Byd>MI_mvODg%%+XwB_9R$o!?oZO;@oymYvRD{&> zOfHBtB~4kcIQL%mk=Y+sFP*eaN^Rx+EpO9`R(&st5?$)WW)^Z=YVJ3#%|SA=HWwJ@ z83u&UNNmw%oE+@IcUgMAou>8us~xvLL*Rg+sw}R312K>RyaXp^}$3@ExyiE zS3@j4nt#sRqam_!Bb&^!(%xeneOwyvR+m|XBtH5vbwTUB>Dp(Oy)o8V;c`j-prKEM zNAueY9@+;dHTs6iv2Ss_y>;`c%W?jRmt3}8oAdhio80qF%0C5V*w@J&-O?KV*i`V_ zH&1Rou9E6&Cx2XK>-p!V*7x*F%dV^_%bS_;9^a!4E-Kt+ygTP;=Cvc|E*!0x8lBh@ zD|=e-=;>gwbw{%T563RC^Jky=^2WrcQm2nNPpvql^`$cB2*_nO+9qdc~3 zQM9hhEj(=U!es8@*}8i~^SQTmGH|_4mOY*5`02}vC-3BD?mc|u@l?L`w=Qmb-}S)o z<73V}?W=uGC>}q%Va~&Ym+G$C#hhNaw@UtA?xVkN=1nk7*!02ii?Q$0mxtCA)E+qG z{vq&C)4uP!duA;^zANiJ^CG`5?YcEg^LfnPIy>gxboncE`nYb5+p6gK!NF_ZPX4i_ z^L%JD|CNXzO>S-C4i7wQ?j4%$vUJA%<&BEB_GLU=eJK37c-Nt?qTKf{+?c8JqfSwO z$@=IW9r>G*RLTZ;N*%EL^kQWZUwb*kaxv+ZtydI%^Q+u{?cA@!~#d z(IZE!7PYQi!FJ4#w`VT%uO-XR&P+P?t+H+H!Ki~bnp#g6sYM(-d9*p|ak})r?1$`| zc1A9p)hhq+w_06}!mpt8b*=MHbylox(6G7mO*7%M`%Ysr>W7qzDE_g4FV|wkS zXKZz;54PR#p8x)Itl1LVy3@=FH(z(XQQmJ{@b~luUDXP)^PR8H&-|gxfA*=K@}dvt z+4Aako(qfJzoqs0M|JM{qxYNSBCCGx+U1^Qxur||V^e3n&fRH;UpI<;WmU>qV(@rr ztFZ@KemD=q3->AUc8tXJz0)ZzK{1wzLW9&*FUy)e-V|5 zel&f!(?oqES5#Pyf!E0LG(kGUlz@{RgT zC7C~41ROgNbZGC#XCICFCe-BA$dyTI$*q}I_{c^o_~Q|qqQ*1AjXa*y1D*scdD|#j z2`_3lJUgZES%A$6Z-Yt)HSv;~@=xzBgnz6xx1DD0k?mxDtFpKwk^k}gr`O{?@qRG4 z+t0aVLC0=kiw2>#j|%5Mxf>jsW!qsMlC<|s*0o}rjSa;-4|`X#O32(dnQ?2~&= zIrd4-<9mJW@T$&txjuKxooZ^=_sHuB)h**Zufyszv2)M-&MzLaJfdYG0@o$xAJ_l+ zr)uSms%Pt_{@a$d@qWk=xpcqOuX(!LlKT?;&s=O|wXybd_*2JcJZJmKKm5fv4*dN5 znDf)WR6c&4ZLWKI_J{AY_?y1==Z?JHy(arRpWg8)-}WI}`~CaCLks2_+&K0qKmFqN z;79ShRR90A2UXUVnPO2{>&4H`zk*E(>I4b!-r4#6%$(x)Gk=2S1e=rJ>^NZ%a`=Pc z3(j>V7kYMF%U$XF_KfSa#P5y%l?T$*1cDd(6zGTA&x`%~bFv_(bK$f{X(HJx+jy$K ze%s%a9X;QC7thVKJK{V`w}m_^GkVwgr0=`Z!^4M-?slbTYFv%(UDvL}r57e~D)W5D z>ck5(vz3qW{N!G_WM@jjt8Li}jlb5n{JIa+1JI#XYl5t$i^eqNnKL3(;&5>H1b?A-;f(_r#001+yL1zZ$jS3Xd6Q>V~P4 z_PFM++6Qhz8GG)1;>*au@DT5Wpdw}y3KT1-^MG3;YAb@TO8%c~mYa84)N4WOCqvd~ z4&TYY8XH8kqBO)ViFi6T=f!5^dn@>QO=_BZ&eyeFI8lqIv@Snt?(DETx3rr4SVc?y zo_}BFclZ0hTbtkR&wW>ZZg1w~XWM?fsmz&YZvK7F_dW9aKiAEJ})MQt<-+08~wrkg7x2mWGi+uG~ ze(;{w_2FEIYwe!Z)^f&4E1$Wv+hY`zHE(u$paYNcW*Dz?JS)=4M ziCIAlMM8OID;em{@o1^ml?`%nHJI9Q#42-URGP|l)kk;Tl&F&x3r-Z)h zM*G7bV#H=WSkb>-nrZT%i8BOWyu6j85_M?y;x^&Q78a+HWG6oqx?s)Q+9xGEW74%r z52FlOyiBHWiA>&k&m{1;iO=%OGMPp}(U0CTY2T6b_MM)ke|F+DP5Zn5y_$_( zYKwf1`QWp6h< zab;e1;^Q4`oHa)~FL!qLW~pnjruFYumwLu+ar@E)U5BX-4>x(}Oj;$JvE^WPPV}*P z6FEW-=pLT{p;9O@og_6+TB*ZQsUKRn)mT( zitg176E9uyw^Vyxl4G(oc1_}C&!xRlRg(L%*rqrICH(vGFhgneqm81|tv;4EMoLOv zO=t(5C5?}isxMaN5O3!`$%Z)Op->7WfZ0-4Ni`VkGM|TLR z`qdckj!Y|l^0fAk@>D>R>ZRbTYR__i<1R&s~x)Oc7+KTZ*mJ*zeISBcG}v@EIa zm&dK-rus~cedw_!RBQT$8J)LoWo>`7TuLrI&?o!ahnAnqLS{U8x-C@tL(aJxt1d&w zR}vQrxBblaIG*T}ppn~swEWns<5q!Q*Or&aOkHz%O6)fqcauL&#|>}oFms;Q_Pny} z%#{U;Px!17H`#MyiIMJi&zzbt!z&+*{3V3UB%{}JJlUPfB71<7cmER~i;I=Z`r;q* zPP>}2Yt6JbnD`F2vKhx5xcV9Q_M5wm%$#)q$!u6*4Stbd{y5Ote<^ag3Cp8X^QXGGH`@rV^-@U*`s+8XYV%8#$q)VX=63fl70wrV>|FEe zh`dDi;!{ov^Nd`Vybd(f*HqU~lX&mBMUr=-#$N5yI~V;}B5_7>!cT^k5%U)Oc-Hbq zd)iX%$7?kn=W^8>O8r>-`K@oC)sH(We->%}=TKv7GdOB`)w*?+&vBb6lhY2I-TYrj?#cAWCTkW> zF}09&40$XR_fD^|Kj^&QZ*`?90S+(oQ+{qYxW2!2T0P&VmQVbN9}7i3?&jZ>eNtdr z`@92>9t5>NS);wY`Dvrw6ur`rsn%=0md=@-ylC?wzPX~AB{AYtL}U-13fQ+=QKCrZ z(5!?N2d;|ni0+!ztoU4U4S$dI$}IJvg%%^Mh>7nBHQ8orEK7vmM>RxnNYj%dsG8mDT;mGdrzO_KVN`9$#i`OQ(n zsVp96Z#XVkzhK?nIXBPlv1DXkU;M1JBuMOiSXji{N6W-N?Oc<^@V4=fYoA?6mA7oV zuC9i@#DQsxH@|E3{?}E>HerWs>r>XhyJZ$#d1za8|GE5^g$4@0T_^4B^JB(kieebCKs3G^E~Kctht@P z>Jv|*_~L_tEA09@c^agd?)`bSAbi$@<%>48sQDzaoI6sk6MQbnX}xl+f8X6D(iz8k zpWO1kr5)oJS{W-RP=&30^e46+*Ve8t7d%Z+n3^FSAthK z?3kVXec|aS>)>9)*RkfkX*CV^Z7xRkNLy%K4dMEq7$dnU)U+eIqiOL;<%j1Ui=C5g z+wGHj&RM2*#utvwYvzBkNWZD8D|&pT)1h7ey07vV$s|mY;W;VtlTmcH51*+?$L_!1 zN|WUdmv?f#xvKTp_xCjc--M3E{*(A7|IWM=nDmvW`IqIpgP&u5GQE^|>H6-VH_zYj zfc9|B=caM7_a61W$h~AerGo$6)|yq}yZL+;ZTw5m z$*^zXm+nV=|9|fEcYBG*|0;jGW%%c&xc@3HU-JL-t%>!;U+kBhf4cvoN2P|)&lzf5 zhTay2{uxV@F0oX!ocsMx{Ms_XZm#ouv5U)}ep%jEBB%O~$9_9!7ni6= zb6S8+Cfm`=X#qCHpB4!4F1b2Gc~*eptc?z9lw(~U8qZ`}W^|KriP6W3vV#KCKmPvk zA@f1%Ym*I%+|SdC3+v22n|zoPyTAI}t8#T~jx~wpC)=uw6Z4d}PPXDGRqxD=$x*!% z+hXlD{^`YyTzZud8?l#l_4b6XVr%X-U5%D`>?Z%*ZTi(zWK|J=i`izCl&0f-Bbe@?e~XQ9(di#+F|3ldgm&~ zKZPouT~iezYf^Uo@l3rq|37$1neOW88V9Fd{X|5^D!e=deyTwz=qe^MZ@9eF@0H&@Le{M5SLC0Df;y<7M0<;M1P?+&ipwR_#EfAin}PBSw0jI7_CdH;RI zzUQ^?Ue8_s@7vbvfjv@^+X7T(2=d9VdAr4VV@hta$rK+m_eq-Es!azPFFd?3@z#?B zm21Jfx9W;)Ufkq4@i6_5?w2I z*6LtO-So>}o&_G1d3I#Zgsvrv%v_6CTy=9^a&?~9geAwfyxbt`oy&Q2*P=3~g38Yp zyL9=UEv~fQe)LhZA^S-`u4hl)ocZgNB0ur>qgbs+i)@yf-MYK5F~h5J%Zu_yzdC0x zwN$>((&awoQo(vzyBkuk7DsuXI{qruaNeq=4=Z%8P3hWxVUu|EY^UaxQPE#l<#H@n z`Z!~8a_vz+M^ELW3#Xl(IODF>h3lE>R!(yRZzm{<3EoLw{%Pv`@VG+7uYUz}40fBwXyTgg0nJa`#?N&RRQ=pfD@pXaQ*8DdTvo>At z&zcg=6XTo-`uO6Y$EtlIr4d;Vz4F2%*@7l!yj>Px zA?nW~8PmEtbA{jScj6+`!{2;KRt<~TVRl%%eS)KHm@(gqed6q?^InPfu$bP~YA#*1 zq<^1xtJ20L^1Kn*iOjmc;%4*ynGxc})XO$|!_1dX$7DHg=aufUx?CLAHQ^S|44&qU zO&g}Z(>I>mn(K_MsIS3L`;9#tT`=FEBJVyUVI_haYd_T zcliS=?w$h&B5twm-q=3z%-gps1F{rea!s7Cw9xN(g?YmC*6)EYVm^uGJ(_mN;fBG5 zySeH--&WhJuj@Oav~p|RosL?z#1cV~SMRqc*R1$Ax9F^D_<9km+7}Bar7p}k#8=8Y z)io(K@Ye~2MJFG4AH6Hvbt_xIRX%s}lI3rdS2i`AD@dMjwD5vced5~EFJ?1ZZ%SFT z^8`sG7;=`Dn!3KVTlSUJC}nwD$fXAyZ7+VrE#GG<%X#~66o15(qVFYN)E+fQvCYYC za^&8=$*s3}LU7)zf7gpPUw>d$({U*6(P_V3hF06YXbw&=RMci^T2W^!}0#-p%)%sF?K%RuD?Odtfcg3 zq0`|nDx&A_-n=l=M>WDe_KQvAD;}@dzW6VSwqBdhwTHjxel2@gde5?HGu+Na1Kc#p4Y<>0AN03dd=G2E$?*0DWF%0MX%|p)Gr|6zsn){*p$E0J&w4CG~SGJwG=M)+wyFU2#Zm!My z{$Y`)ymi~Jy)HWwa~2x>Fs_+?S5tE5&9Ys=0iAzV9*lpWzw>Sx^Nici(}Iq@%=O*a zXlE@Lbo$!sHhc3Q(r34N8ctKuf2IDA{YN&py~^uCbE!YN|IV#cJvpsHX|lGbd)MAw zKi%2vkNN+QllMq{cJP+Ro^8F8HgDJ*@@?bCei>37YK^gdhDnfo`% zuI=TuHp_phk$vm#jVsp#@7#-;_BZ3hdcS91v|nl{f4l!dU+kZ4@RmF?KV6^p!gUW?oCG}UP7<%4TV%?&bMrEHqm zaOT7nh3V%OefoaGaP?zn0JNNbs|{i0^nb7yy@TISlfeuti>)s^jD{`{$%R_SE1joVtzMk*$jzcl+Bk+{UI zGGlFdLWR?+UY*lL3*~L~y5h1q(=Y#QEnBD-l`gr;bN`i8CS%@w9iqgu%*MjRfPnjvN-8A>B?V|%#F)`vv(#OTkF>7FUk)K&QU z)sDlwcWdSztlw3+;qZw(_s0i4!dGpd!gnY230ternT%+)>XjMujpv-xl3%_d?9G;x z`iCF3YA(!;{FXRhHL*`|@#oJOvwkiOmc6KJyH4Homd3VklMeYkY+b1Q-)>{C%!KB5 zSKhdVr@heS(C?kvaqPV4uPf=C?MG%lo|`uPx9Yl0DymPf&5E5E5nl6QZ*MeqD1lGI}D@GimQf$D>wBPr@qqM~5}do1Xq8>%q^++S2Zcx3}bH*56+07vyV~ z@#L`IAJ?~eyEHVmOaEN)_;}0fEemRnoH$-O|I>{}JA%yX&YZCA3ZK*UUHjTyw|C`x z?n*vSxww46@17bbyOR^jXO$a0I{QqLJC$*jN9Z{Hrc{M*8aRoDGo z4=oO{xVc7R{;6vDH@wdh)-5~q+%5BJuU*{FdgarM|Nj1Hm{fbLKk1y&C!5@Bvi;GY z7CqQ>{~^2R+BL`Lx>>JFmB`gU@x1rP9h-lLe%M#{{QT%%f8xXTZ)~epc zE8nGU=Gl~~zNx)$C2P{um_y5AcnXYkFICR)ceOIH`X2Otu6yqDb9!8Vll9B*S>CfO z_bWU%_p|N$&E8&LCOmU^!F_4|@#p0Mhw2YBPtA;(b1YT&YW|@R_GwE3ze@aBzQLw9 z+waruS+7j4*|()mUB1z^&- z-oU7v;bLvJhcKh;= z7nW0YHi>r0{IE#Xvx|HAa4(})`Fiy|OqVJWc$em{U9<2Dci&`3L07)CqwAOKZ>Vi~ z_xx4MypPN;7QMK;;=#^8QZh?6v}K}E<})HSO({C3qUWaW=y<=NPA zIQO9A=N2}dnXmp?yuHvzvGM%wGySY_UXP!~>^mN_uRC*X%|7?a+DWf9Kh@6qkRH${ ze)6~KC(Ef%tzUdxtG@E`^AmQbzi)A3I;?m9a--m>1iayw)?Z7)Nm37Az&*OK?U zdJ3*!_U^CuMR?f$H{`=`o;MDz12E$^#;VUMv_*)9Jt=}*h4e?1akecY#q&OW}X zC*_`9`^}WA4q^ADj@{lVbFa*jWyTRnzReNO8|DlD;$9d3>F@QH{ioO8KNl2#VmI3# zmb1;mH3i%KLKeLEYJKIN>)UTeyU+Q~d|%6X^{n5d&rjD!^(zK!UGOZlCjP~WSKq9= zTJ-DnEB@S_AJ%)R)JA9N43)_Skv*HAok-Dn_Lpm2s?pR_a*3sdm3oh7YuUdQ`DggS zKXXs;(RP!6k5i^S648BS#BMjUd!O1eKX<~Izb#AXb(p-x}KW3-iPl@+IZ+sS{|o);pcNX zOLleHJ<#&Hka_d)SG%o_Q)jhIf9l8i?BFUj>67OTeHE|9Y~7F|$+Ss^yHYAjD?DlL z8i#;&hvIg!&D|tq8xy!wtUX1P&)YU{;?*6#*B;bGcDtwA_IWYSds-D}_8>L$$m>ml z&r^i&O*;F7@A~%??m8XEJ<7K~XlJHXnS8!-SE*`OU%wP+j)}v?&cmr-|5ZiDe}EyS$4{E_mpo9x%g~vRp&BQH}PYfwo|4tuBtP> z&K|Y8;%~s&%$>>h`sMGQ-;S->5q@9phQD{{#Z~jI+PY`?pHwz}a`DcZ3ljG`Z6gn_ zO{#PFR@^#6ac)ea&t$zbBD2}vxb2j2+3K<}=2yYoBN<2PTAm8 zF1UFAhi<_WO#P=DEyUE%LT@k*&iP>9Z4(4=2q?)PJ+`PBEYGlQ$iEOnS<{zOLN6 zXYF+N9bca|tvd8B;QY58ecgASv>exE-2b`s_5b$hsY#*y$;o!{+f%|P<%?b`R>?@J z=P45Hd?a#G^QY2#D~tUHN~M0tgL>CzDxS)T^D{7r{H;$)V^w6Zh*_FInN={Hl# zqrUKe%zM=O;{pE%cgg)T&8|(j%3f}~-MDz)=d*KW%G>X+b(hXZTw@W?$@spl%$!jt8!3R>V zui7f9_U*Br`YL^u`iu6jKRmH`;d197Pnza0&T#iad(O<0zT2P0-*rBHOr}fhnWm%h z^>C$6K3^U(v5PI^QrOmPBqq76$>7P#o0s}#?_9p{RJFdX_>$ruOV)?zcxFg)i-k!% zGxp%q+F{C9H~pbw*@t@hcCpCPg5T#|-e(rvbrdZ>_TcY-;flq{xsz7&w~D+HJp3rW zZ^7FH>C(16t0$jYd@O;#wn9zm)1n{MxxuduE!Zc$>vpX4DvR6M7@^MnDP&#X%**ov zq8t7dUD<5tyVZHIS#R+bGwJw(#s4^$dh5g{M17Z<9wEJ0TD-vR#kJS{M-q1UePz;Q z@YcxMy}@buHZT9BPB+Z%OgwhYLIa6?KF^A;wMxDX%G`XG_ivz`rri(bKY@>YB{`BF)XjM^r`mttK6|^w#{$uM zI&DQFwk@#-L&eM{&08^VM}fq)_dh$@Yt}d$3VF3}5BfUkqier?)(y zCoaGCE4(1{*X64AgNBDCy>wR|`C4#6^d;~6V@eJEtW~1^LBT6cU(3q7R_KYHjIuL+ zwn~1R`b;tAww=Z+m)NCm$WB{zeV#_G`j#H1DFNSJ#!qEftugtiM&L}p_KAL%UTx%W z6J^^!m*=ua%*h#hDvn*6c=Mou$yA|CG#*y-~Y0D-LLY}($doXb(QbztG_okF#T*| zo8#Eu*7nr3JJzp%|B5rWUtDr9dLgMh`{|b*vm_#3y-J^Y-AH1~hD)!bqn_jxn&}ja z>gE-git3hD#@LlR2i|=pcHL#o>$t*OoLhPA@`Hu1+IBTA{$%o;>-j3B|6beEGXu{U zFL}l*$M$lnivEM*ogyt+KCc3~n*;B5X@9Qz!?;}C;PmUZ%xR@tqSJ*KbvP@J)$rTSMd8o3FDY+Y}_1m~8n~qvy}iDHXf=Lm?}3Zs%sj z2Vd8wO}M{yLYKz*Og2-m*S%VfJLW|)zF)K0YxW&)Td%gZqrrQ%11sG2v@P4h#uV4& zDe|=UUBkkwpF}w_+Ad$d@#K@?iFG~icO;5_6p6UoHg(p=K;f^9f!o>c_;&3$w{yqI zP}lwmI-DodcF)?Y9pfhYRUq(qbI?+cT*ofU8^&R0R>x{f-dK59dv15EuY2jLC0**r zE{Pal_~<^hICSaugEya~Us&HPbA8nTlkKZl3a(a_p0brO{csU;wCL9fC(j2=c1-=} zz_Mt|#)*w*R!W$P8)xZct-tiPFm$__e%a3u;}VZXInM(LTlkU_beiM5V;g6zTV3)y z@Oh=>-ROAsN1bI7>_??!4kvt&zcrsvctMNR_4s>tgdB>6EEkL2NEGV1{vd))nLl_L z-(H2eQihT3^CozeAAcRd796OYRy=1OTTX4FAA9gj3olWf+|uKpbfTYq{dF<#jREhn z41>9j|KF`FSW7`y{W4hi{A!t8k?+e$_=g;vkYhJTDEJh@4cl~R|2Y+-j3fq zXGZvI1L+IXUvz9*bMoc)aO>G8?*-gll{Q)U?EA@lsRMsm9u`HneLiuXuGKS*M&`P3_>xfb|D8d4iOi56f(^nzL%w z_8U*LHXcrjSmMY$sWfF_Gxs!!SL>YLhpz3>RZb7NGQYK3U1*h??45!rpTjRTo9#A= zDm{%@%sDOd!Wo6N!q&2T8j=H?-9r7$S1FmQ-&!8hw6*rZMTX(A{e&1e<1_^{Ec zZ>_`X`wSP4Uf6nAizB1KZPoEj+YipP5Wli(Rt#@r&X>h{@?Sm5g!wW{Hy?Sc%xpV* zm+$ArWd#AZAI4aCH-8ogOm{T1n166WU{jl+WwLwQS<8yLFB^l9s0d}#-)u`e`M_(^Fmjx5?wt@>~|s0)r*GTA4~AOS@KIO zfAxLQtAD~ju&&Z^$cT)+3lH-af0_Se{^5m*y04DkewBS7?`5*ji~pA%n*X@Fp+QS|(&={zj9iIA?jgrpS8l!e=>NHLwy0s? zw+oT_)AD9S`|N0VHm&(tnT4RN(%d7LO0KnkHB~$L!K5*6*|l>rI?l;|3s)9OtTCC^ z8kknza_Z{Y(qDJ3+?o+(CGD|jC2Oi*|Mkaio2;G(S)Wc}&dD+0^D2II^x!nv4{5tE z1kWzklRnk2?^(Rd`p5@aeSD2KQG`UGk z+4z@pwuBzCq5SgAMs40}<^J(CD?T@PdUokW1K0G+H+kl4zEHlC=~&d;4}}xb z=Nwt~GDmH-$szT_y1Q#EuDHuT3*ZkAT>P13?$r&ECsuD=D!6ye#~#PO^|zyxcs1wavUa(QPenD!K znE6({xHX%_%B=iSMX#22mYrT^@%J6u)}_;r{5iAQ(4={dOLYAXkHj6z=3G1Kw4{4d z%j}M=CKh+rgeLEJcjjeZh^g7RlWNU=pRY)=Jk4P%-o5=+U+Hf4D}}Q!Hk3^}Rv1|h?BUtIUY_ZjcFz44qqX~u>e2Tx+t~EC=wFgHTEQy5fX5;*UHmdvuh`Em&Q3-8 zmu{xMDO%hUlG@VDIo0#3-qy{lH8O4r?7o_)bm6Ayo2XmK0fkc!h26UF;L~F6kN?7d zefnU1@SNGE)uv^(tKNV39&WmgbGqxqu!l}pcHa?|WHw*4R6noi)tj_3ZobdAcHI=c zdbx1Yd$B1S+XW2&%r4m`x@N_PSF>D~ZeD&p=%(1K$JP=%{&Bzh+5EP|R46ZDd-fXL z#0xIDebQXgH*I;IsTSRqT_tmqV@KoNwHtq5=yomV=!`GnuyMG({4Rgvj<_J1_o?3> zvmR%-eNfJfXU~=GSNu;mvwWVB`Othrdx=QhK%r zJ-xWD%4*~GuGZyMuQ4Xdn9g6jKklg`B@ zuD_Hv>D6kl^_vY7C01OCxwv=M?r2xd-2a~G`4cvzI7jI2;t`*^f8ECI1+t=>!%WxQ z$ys^qp5uIpts=7)PTy5i_RY*RMY+2F;0(QOa>Cmiw|rNt4o{Xh(D-%u;k8%s*AhMI zPds???&=laqsr1Z@;B|zeDj|3*VdveNynd499_Q$OnBjOv~JNxeS1l5TI(~D??1Sb@#es`svg@7$8w?^Ypy5eo9;P2C!u&^?dpy4XDvIAMMtES zocKH0(XmPK`av<#6Y@9wD-{3#(Eh#MaNl#Q*-_Se%?&>WuKu@l3EuUcIDhg3Cr|?JBbprR~|p*7bNn^d5)kyck{{r+Hn`BTb=OAx+AuIasHl*%8cLs zuVrX%)l}fr*KvPrYp~{3UwG-yJ(q57_I_KaDV()vggIOyHDqw+SO$t6Up=HAGgIL$=L}; zo(B}7g8mkkv^-%pwNpu}3XT<&%&v)e^ip@*<0(H5)@Z~nkh0wDU24~5_Gpd8t!2Ar zdq(t~`&`K=J3HXB=hp0{j}9bUlW%&v&v@1${c~1l;%xjMFHSz|v-e=P;pRszzj+Ne zt_cbiwD)@KzBsk)cJAg!=`wXbhdM3${&dvnIY}=6IB7;)ux|IaTT71Y6x{^pB4(P7q$xm9)jlqVIC0uqlpR6jc;&Et@nArcPeel^s_qJYu9f6Jkuq*nR)5$9~*XUTeoG`nmuW==7tM@ zd~;*#q>brfX6kXrpGydP=N@>;eLh@X}j|5*v#9vn@it4_DKCxrB%EK!z88K z5oKo6^e_C-G(642TzJLDFE!xqO`m^1SOQY7TLlF8J?s9^wCsprKIiLA;F!lNA%FV~3g?v7Vie63q zVwSl7+}|xR7p@jD&c6KS6U&=Br)#C+6Xk3Srt$CwE?pnwr+%<$p<>wFwKb}79&^(t zs;pM*G??evB=Dkgqgm#geAk>$HAbAPg5PDTa7Q~c=q<4L;UThT!y}J-RRXVye_Hj% zPf<`XEfAXJEy45lUZO;a+WBtNy2>6?>GO-a_I~=GbGGnSu#^7d@CU5n*?(rateqJi z7;fhL{QAY}TPk0FSzXw0#(&28t3P?ac%77!oWANu6;q9J>5++=-#I)oInS(rHv8kD zf?Ip1<{!-5zAG*8>=swk&8O0*hxxBfJs^Hf?c?nqx>Eb+HZE5Fyy5rP*MI!##BW(z z9=Tb3>Xla3s*RsI4p+<0IP(5kdBz{P7%myMN|$B5_q!ivZ8hJ0Q0HXaqpzv2|J3=l z%Vwobz3QVI9}*ko`dsU>cv)Z7%GmEWe>m^(aaGf`)Bl#4Q2M1--e~j3_Ln(nXRpi> zNzd}ie^#CQCy;HD#H&9WKRC*5 z6+FrRp;oH?j!oc#xP|V1-Zy?s=3%=yyW+DB$GXKy=QjP=EG>F?`PD|fqO}%=*LFr< zVO0FbQ}6Zo{H*6GN(Yqoy!}&Y;r&>D27B%ymZjYj_ik29FmZUSf0XI)hO5wo zpJ@L2kLbTuiaSp2JazZZEuZ6-9*I-uX0Q18ndkrHWA_h8=!7M?ZZ2NAnrV0F^ZZZS zdps}q$XO2m=y~Hubwtz?wYGmsmwX=veHWU$|Gd4yxrt}W zeqNo(Aj(@_e&qOLE|Ie{V>_Gdp44Cc;r`ILB9O-5x@e4t-#%ZV*$c5cfyEkyn)+?Eqbc8GPh4M?6xc3s1jkKhsL{7RLZ}VUCYC`%0 zkFA|0CQDyEXG~x{Bn!h&3k;`wOx$}eeybKg+!XWq3bRUvE-iZMa6g5P1TK?f9i32 z-jU!5t2Wxb%4O+Mnc<$DRO7y1$kIPe{J4OZ6_>1K{j$#FWc~{hzgdF!@~%B~<%r6@ zaPi~aL5~F@cGwiH(RgPO`D0~O{BC!d<<5PKtInt`OYCp&?|M0bm3c+YE;YZ7*so^~ zZR}h7bvJWd*9VuSwwUpD{h}3*;S8M(os%UwbT)Om-bi2isv~*Z z@vTPldWBajO?)(QiH)kP?B&D-2bUdWdw=stkV$gYg|j(J4lA5cdzD&NF)_!X_SFKv zW1RgTq|#%ryqDBVSC-xV{>QBA7VAo!czE|d6Fs}@!^FMI-0vw#^PfyRY2<(1b#+8y zMbie`#qw_~9v$je3!2-Y7uIde^WU8HEvx30va+4+Evud1m%Q_xqZ*d^=nY?RSj$ws zbE@B6*JX8Wzk0dj;vL4qK0eO`b=NhHtP0C4b**^JM0TE2yOuo1boo&=y)*-bgIDf# zsZ3vV?$G6%b0S+WYcG5GsHl*&Y{hm{fq$14o_K58!@t~c`sT`{Njtn^mUZ%ed|n#< zn|WQ@>;pSWT^xVtSNoMlzMS*Y_|>M<&!)^*nY}0FTYiV{7tOZgvJ1{z#yl)e{dU5VxkNhp z(K%-~e+7s76Dp;7SC7g*@_Un=p8QzHc$s#zn|fAe$;BCq-*PiI{p9qU9^zJ_lz07T z(!TDPl-YXQID0HEPbkbx*&)T#UQ&F)r0?eEM{;xP(+zgVi)Z)lW-r}$c}KN}_}621 z5AWjW68I+86_l>LcoJKA?K&gB3yd4R#nq+Oe0#BIdExbSpPi50U2L^^#p8*O41Zl= zzS`@pGUsMaz=}@w!^c;69x9o?yRfS`b7`?@)bv;z$GD#hDvlZCFP`#jqlU`jHK$%W zGKVG{DSnjcYa=gz`ccUfw+*{0CiZ0oM5MGBvLE4|^+UMm4TrKZZmI|sukV|(X4xe3l8@Ue+V?FEJjnPhdU-|TiF=ohRzF&AQ8VXDbv#g{8zN?UERHZV!+NLcdxjdvAb~ec*q17jj&4_#kBrYcw! zx@Y(H{f!jg-&KE^U8=Nu+0_eyQ|4Wq=6jfL!FuB(`%6B`7oK>*sC6Xn)Juo7o~HYy zCp8y&d@Z+_G5O3iuQsWSuz1feCtoJbG|gJ4wzY5h;^jXx7Amj3F?B=WElHmjb%)+= z5a|Ek=PNsZs^>1BiMBllW}M-!?qyoocdAKSCI0ClJ(XZ=^G0Olyml=zYGj z;G?8j=G2|Lbe2@9B)1vauZmc3dU1yz%N|`9)2QjmQ%&{0C28FCaZN6%gm0xceXh+|H0}Spwx_8Q z0jzH>Y0oyf*%Vx}JznC)CGmS@uKG{o9;t1fz*xCUE!z6}>JJZ+uB_Q^RHJg{$C9l6 zn1!c}pUkwF5;eze|LUeWDbwSPLvP%?U1VCjGbo|G@Keq&Dfhc`z2Dni>0F<<`0DO{ zKY8x5zlB*rZ?pUpW@oBtD`u5NIZNk5U=6d;uf=w#)dNyhH-RryfkooaX)r*HV zUc9}y^v8*cI@c`)F<-t($l4jti5La!QsirKKI^OQef`uPX zqyGGkr`e@{i_|hI=gYF(Uw!iJj%B`o78?3a_=J4;XQl>Z$dmYd@0qt-GrsA1M9u?x}^m8(Z?1?zU3h6u52iRiCVk zAo+(ci|pqvnmX0=>gCBZ;_a55R$p6#1$4Rg;0K9pUqD>3!)CEuqf7p%5n zty-~1eaR}DvuCOucb%$sZaejR#?#t`^H0fYu}7_3aX-?);VJXk=R3l}ekOeWE?_Lr zbvVTC&KdUu9#fys_^B~j@A{d~A$FqCQ}|gcbdSVOPqN&)UhT7*$Jx7_?yL`ADEQoA zvD`Ux_k$fVJGs4z%bhDj>jcu0W^Lu1RBX7O``{n56L%QZSr5*XZdvLWA=h%bdBdjb zl8zS76;nFxIM?s=@>E}F5`Q-Hz^uT# zEICeb>rEYZ6bRo~b9`H)ZoYX;Sp^o**_IP_T_`sYpvnL1m(>AHN-rAZSHN~^7o>tJ{g=Cl3bik;H#C(Kg5 zr)_`pPpIYl{|T~+cRSyFQ`+r5;VygUh1wtOZ{{8NVzQ~4@#fx^H+EecW;dPhjGb>_ zCE4O{{bBKcL4ot{d42L1vj5O7`^|ph{pNQ+I}bnnuDMKq!u{i5 z^LAR;{kzyWk(J%mW^sMuFWyNK?Q%X!i`NUke7oEJlC<}+E6i1!?p>Ju)v@fp`;DnH z?3T0hO_#U+Ffk+SW6cHeO*tDj3QjmwwBeb5?5CeU`F}o;)poOcJdywEA5|khKW9Ce z&rVx@#%GEwzWn=Y&a3)whZhP=-pSN`Yk~XHT_?|WpO9?1r>f)rQ!=b8lPhD5Oogcxa z^^QkE+*bFu+?kv6ByEGWj^ng&rD9`Q2`<^tq|yk!4UYkp1NMqx_oM ziqeRAZB0D4)n0@?*kG~d_sts$()R0lOTHSPP&;>et^2!AAy?d_dDKo_VVaz0bm=B{ z$Ep&!uk1o=(p5dz9GSN;w@I+e?9i4yyq9FAOHqk_xNm;m)@B8WW)PJb*_l%hm3+`e(hV^zRzLmnd4go ze4mRP&J&y5rtvn>o8`%~E>?@h?~{~^Ef=XV|C(u6l2)4L|8}vqHTUt8Hz%Aq=NMif zm$Jch!r5z1a?$KZ-#E=Uq1UAOCTT^&^g}vjl2-(3dtjlKo!yE(UQjDFx)ru`-*`T@gk-g!ye53hcsS220(!T1|@Kd9bjyTAGO zgY+`{W$Y5^w??3u}D?&Li?nYM0r zW!KE_2A}7p&C7b0nRf5=nagMQY@eB2a$>*g|NLjQXZOsXX?><<&P@5_XOGX;G|iko zm2a`G%jP&(?I$%s2gf`^=v*a&RH^ZP4LoGG9EQ_eWw{oe}jIZqtd z9sd((d_RAhyus(?XFe_WwP8Q|N7A@{+NVFw7uL_+`TFwBPbJs(H2*Ym&PgqmUJ|VM zYftElxN|%ki&x#gx%2BzR>f`GT&xNX&F>W7mS>!CLP0oF@5saLa+g(StUFMWIw5wu zZN0VK*{pPPi8to&6Slug*uJpE+FQqB&P&Fw9j660u03+;+`F~sOCy}#IDUx_6Kc{+ z+^v`*!KtXeeV*R*3s1Rry;;KTbvxI?J3GDlm9cAwZPcQzj`Cl*Q{UV^ESJ8(>-J4y z4Hxc>&8lYYy)8GI-bgy1@M&*5qn5htpl!6m*15LP{;cQQZ*<=_4mRHA^#4rA@wXSM z*{db%&BRu>@4lIRJM`cVkAw3Cxp%py+}J;NZ{+=R_tv?))H}XyyAkg_>DB^C^{L-4 z3SJ6!`Mz&qWB-ebIW=Djzg#?iZ1MRQ7Y%>B`21q=`Cj+`3)~|gmO5JfmRcM!XU9Hs zakjT_*mLrNI{wBamETyo^P9r&qZ#jl(kyP==i6}K{Nb%8*;VTER%O`#wmstNStRXa z;*n6RE)*gEC`{?4c>KAo0{(8-PCBj&-fqJy`jfrll-d@pd%_DpPZ986Uga8bXLeM} z(GXeruY4ctzN{$snW=n)Js?tR>O!&9j`Zm&+dm(?vFV9`eB2`IlB}6>Pn3J6eGR_W z^vV5_s`&}-@5b$kiX96%X5N`4`6$^dXvzYmLndJ>C->`nWQ(gOcKTQsaw6@=AH~odo zi9?Z-UU{enlyqY~_=u zJr(aM*xx+5gZ z_PO}=<%H-Zn%PH{%RXwH=Ksj;eJOPLJnu&rrs?S(Jh$^qj&D^*eCVay7iY74<@?0j zwm|XipI24xRTJ`;oL1YVv$6Guuc~BUkHUV*rSBd@8~5Mi`RWm~qj`I(*yE_Mr?-`p zTk;PZZfdrl5h=5|p^x_o&#Jc{LnLlJJ^tZFqrY))snS(`_S!eX5xv*dH9sc4$@Dq@ zLFSu|{WRP2t8aAI*j0DVKlAU%-8Z89+V-BhzRBER@5$?%xBn3P##i65_q2TK`;W(O z{{Ex-jq!h5?TP)#^OJtf`F~`eKvS*iuMO*u3ViF8IJr+a`NsDorr&`w=j((*-=qhg zuM=FpG5+YxH|2$9(;wO7iN4;UmiNT-ky)O&<2)U?r@Jazmv?Nh;QuJu-n4sK4-l~n>@6Zb@blnlDglNsr}{Ac1N-O zvTh%&7j)d`T>3|E#q-<^bMEtI|6ndqtmlya8M|cS^`?;CIjwK%EjTVO?)}r~b?Iln zoASqZ>We2ysw_OHi20^z`Ft%YE#D?~Y#S^N@F3(yw%>)?k)B z+vA^gGmgz~oB1cwr9z|WLrqU4=ff>`<~GT;Br9{UE}m3!P}FJHWUlE6Zx2P~AKX7- z1G{U#L`;+9j$?<9{Ftg&&uX~0>!s7w(F zCr;*s(`ai4SIRT~^-Vwqolgk0Vo>GesVqa*e4phMUg4Oe z$Lfbi_&n5=Pdzq}?f38&d?}(Kl4{`T(|Yp}%MA5Z0yqEZP4w$^wwmg7$#rLANtXJO z;KvjE-paka@@~R8$0@~zXPuXP7RvA9?$!D^28SW8xxK-%j$W)|6c*TP{VSKyjsC2VHDd~&`-8aU1AJyyckBmVr5 zNg?AI5pl&szw`w4dYpGm@Va!=lg(+5^-+h8^5s$-;|Q-!ezSQ0!r%V{em_@UAufNo=wo?=^1c@Cqt|b&2!Ck0d7}G6{j8K*e1)mIc35ec zJ$o1%aOcXy)ZQPGlaA<5(E8VEwM)|Pz-wKH-*G;7R!K~hoRIW4>vrYx9l9Ft4$a$p zd&ge>eEE)hdHwg^b=-T`bEnPn&9O^+1Do6zZU4P!`|rg8Q_WP`Q#2R!PcevyQizXw zDAB3xcWZ%{+QFL4cD9*3ax0ttmnAs!wQRrql!=F_>VeB2&%9j~bE>w-+B9DK9TH$O zyL+;vR9e8ED|&IqHic__4$9qqqdCP4f0V!`=1W_tL5w*IDzk zTyOn3x5fI?;w@KMyS6zfWj3Zx|FL0#@!xYz8n(HLE2a24ujH?K-OhJ&=Ot!7$>7tE zHb`vMX*rn~xK(Fv_S@2kq^wBUu*K6t7e|GKp1!s7+FibEAKkMHIae(SoGl|&_`^Ew z#3SR-ZwsAY@AR%&y6(QkmUD01thY#%nYH^0SlaV;#H)g z`NVTo*rY)1mBnk>WjzhIzTw;5lo!7B&D@25Uu-x&LEU1PR1 z8tjKNi#UEfHLwWgYd4*tH%0kDkfo5>X_+0d&kofZ@yi|C;{NP#@+OA3X{{f&$?(db zTKu5c=l+SLAD(@QVwTgsPI(+*U&$lglDR|X{HG@@W`WZ-6j^qLo=%RGUB+5uRDA03 z4Wmk%&nJS!CIsJ*+|(1Rw0u+cQ%1e=Pfe~g zR@-mWx_)Z+kEfSTnx8uQC(UR3X|{hGa-Q^iiPwASJw1Q&@{iX$Zq<96ecbQOuj1Kx z@5F~)><1Rzn`*k+_7#_n^IMo6U!A|eS$^-S1-?aHDp9TNrsGZz;lN@)% zv?Vm(VUAY0CH{AITCi#Mg+BosKlDdjmC0U_R&=fR!?T7pYd>T~7=Gzv5=}lSm7d$Y zS#}yvw&Bh%3v}+YoX(uSZ`BdE+ZBqIYgIgZHg7*@P_o9Y@$j@neZEcaFF*bA;n@A& z&)057w%tvz!(`yVe{~Kf>dgekpg-#<%nIRv*c;{JpR=Y+9mh!SRJ#`Ce{F z5w+G~4tQC7J0YP{^li*rrBjuPJLcUh3a~Z#-Olm7W|zj=$v^FTyf>&T>1&-oa8&<< zd*I#Q0e61~-eq5~y@rYHgnD924HwrFW3Aqa=bbuhxt5r?)Se;{AsqV{DJ0Ay*=uIUq3Pb@c74TH(CBr_^0HUq`5Mco$q`0 z98o_!;p=1#|LNRKMS)t|iZ*_{>}ns*y7cysN~wQme42B6BZRgtu=~OmRM+JDOT_(S z`i-9RiF^Jq9W7MzDct%ju*WBA?bExQk~=H6lpJ=@ddJYhduc)WAG5|ke3JG3FWIkL z?a!FC->Lqm^fG6Uuc1#ac(lIcYn$zE+jsWScBlH15V_N0FIsonn|__+n{fIp*P-^n zH?MkHS=rYf&0X* z>1Y}pxx~D2y`%fFr%_d>7u;Cp8pa~AJtzFA*-pN_F*e9rp>8c4^ZO^>=K4nIvbM4|C1q-Mq_t zTj}{%^9)w!zPP_TQT4rfheYk0e7>I51#>Pv7OVN=pttz0Mc%oC`yctsEjrD=^X;dD zzwZ2MPDt!;ebN{E$V_Rj<8-%OJ6;ws#)@59${)*iDODzR*`=k^^m_C%HL}u=f36AL zAhYUVcjv|F=Fd`;1!Zk(AO07P{ij!0r&l%W?(Q2iU);N3yJd6lSD&|$C*8|8a&y)n zI^5M>X%Y0+@j&N|Pd6_#tt%D1^6*y;UrgV`FKj&9=4x+ckfO?LH^ zpRbSdJzKqYy7iOBTUDp|ex~Hwp37j*e!W%p&9z(YH&46O7taZP@oP;D--{m{hc)Lv zoWt@Ty!)YI(nY^L1`G@$Irz4ss9@}Vz`l*CH8eL|*j=Q~ZOQ}#HWz`70wO^ioSPnS zCv4m{$?2$D&!TIqYHzkMikV5@@nJas^7y}|y6pOfMqRz90q{k}N;-P!&B|NiB_RUpZ3I48kl>S^mR&l_=PPlaE1txCDhyIb(XXpRTQMp~#|xdIm?X$5j@2dn`Y5A@wy! z*P;6>eu-{8XD~-|kGaR%g2YFhhdoo9G;*?)hvu?%l7d=k)k59Poh`OS5yr^Y$sBYmJmmN{pWc!?2R+rWuJ)r%H?|JO< zJ&W@qR=sR{XnVw2HngKMvDd}Y0|Jnl(FkNU#5#XP~f{T4zEMxS43yi)b& zig&#$>BBFxGVNf}MRoD4swjVXuJ9XG^X~LsQ9b-(;j{0dYX$$=)-Bkzh{;N6&8?}+ zjG`vnWvXpdtr2IwTJY-dG;0Snzfg~Dr#E)$X7N2ry<3(Y(lGPcr#ThV4w#uG-RLyg zctG2oHBMvaXP)%g=iSmTsM?#$o}akgqRdfurS4*}TOTGV3Yv7J9$$LlQP$-tpIkCy zKdz{K8aw-v*T+)RlCYR1+b+1B*F3Ty%BBC6=odTQuh$*pJxea$;N4*1cY%4&$-S=e z-}rg<9KMiUvTFSu>mI3+GYf>-=9;WXy`asuH}67av!2A4X^#2QU$~p=GB50A+xxw( zDb2$9@g}+5o>wHVnoL|KX5AUL>WiI@P>_rLyhk=>1`Pb-ACyhc%s1$mZ`cz5lBe#l zLEUxF=%arXbgx)7ZTTYoJp0(s>&Gf5ed6i4P(3APDQ9g}PD;bSse)-Q-hN@*>e`kc zb@^CE&9zx(evdz2+rrbU|KY7-?#F-!9xe|oXWg`Yo&WGplS@OG^wu=ZR?A9=^+%{%iY41Nn$sd|Ox&h~?d|&l?)G)=J#!o>Z9eXi42M$LmHP{A~Q3DpxDrTKcE>^UAr0A8g$+ z%~PP$WU3}#$HN15?Q592mc)MI<1B7reJ*=XTaw3n$xdFQ3->2(+C5?atc$uYJA%yO ztm+O+oqQ&*^z6jsD{o$PTUtl5p3KiQGuMAF+r2kBJNkX?{{M4k zo@rU|wDR8^fr zE3&EHyCS;6Jv6J@bt@PQ#{^7cvOBQ!lXw34mE>zc) zkh;4~m03kX{8aPG++wBZY$5Aatgdsm>&d(>VR`&n-PFqZ(&@#1Yi4d{+y0_EAxmRo z&RVYW7Uf*O(BLDTp<7>-UG$hbbLXMX*H8GS1{o+_Ssu)G;+9M2rHdU2K79?RlRMuo zEC^pTc~Ku{s_E<3&rUs@v)?B)RpvVw zN|eg=y)33aX&v7Ko}TRmYFiDH=f2EXb811gu#V5i_D$E;l|PzWnz{V$u>uiM=YX_i z39m1?t9m6Zq77PZo3%Y|;=Hrj|Ld`JeCeKhDoc0VeR%BYjJ$0j4D z)~3!%h3UtHZ$I9;u|VtTk`5#3sbZ@%9yi>+F{8VZX?8?f=eMuhU7W2v_i~i#J&UmL zHz<2>HfK&hcgCfTpi7f;e15L95S0$u%4*hjC~UUQmW>?UQ}?Z8n;*dX)as>BOiE&B zf?NF}x03zSGR`dAtn8AS5FS{zH}eA%?4YQ`H4o%;bB^$yr(g{*P0*{3si z#oW^!)~%+m*7Kz2TuEe&75><{!;?MKWcjwto%no{tl)Cz&f_;u zU){M;cjk?CmqMzWVzLs~CR||fA3zL>GMDe=nDiaY&TvyL{@xD@j|U+1fS?Obkv zn(9k?>F^}mvnRsq|GC`nWq!igy7SPn&>gdWy3U<{R$us+{;4#H*v%J@rIm&?oGVIt zvOj7u=WLw|xx&TQbu+z|PVTur>s*PIApZf!-d3?m>hd-h?@jEu{Lbu_z|yXroyxOT zM0uZD;whtkCoZ;UZN}CEB_Xq%SFM}Expjxt{Z|)W8os;MSjK%lO=m8D%HdCsj4~H) zuK$p>W$VV+Sc4~vGHhnW$v8;e?%FW<+1ZFw$J{q|M_+P}yTEgz^w(>)nDmEk_J5^M zrB2m5bbMy?%Y#ODRi*l-<_4d?`6Gob%61vszn0e7#fsD1ZqKdgstLBtPhF(9e)Z+E zWsk+A%OChTa)w`TFL$|ZeOr2wwdVaDGMCb)OLNNJ$$PA4`XE5>)YsR`zxwy~o=+3h zT+zSc^}B_)EZ>~;{rA|&a!LHJ?HlwTPx~{G;ak$|Ui}B%XWZ{(dFtGfT0SGQH+k`$ zxSD%zhD@(^v+LO0nC}x=#a`fW_p8C%B&UTOcbQl|thn`2dyUl2)0bkNu05;x_pI@EjBB~tu)g6p7V1?uX;%P#yJ~|CicAZIdb`7MA@oS zWf9p5wtl;h$_B3w;#rx)=NV}+Yr4uNWiz*=DXaeTO5Z=SeT$Nrd3Mz+YuzclGj1C_ zK6c;NBJJ_*idlCafBJX4cja=;m6ZbQ1u>Hwjz>iuJGS@79JP-3w=5d#6O9&slhpD# z<@n{-tHU1)R`Y+AnYZ;r^Pe9Jjz+ATY*x48$u)-$XX=^fZU49^OlNJKRQav%O}+CU zrTfTTaSNEZIr`e-tINa6^54(D@xpPj*S}4@@ee|S(yF&u-c_5hE2-`B`P@Cr_B!91 zlaU=AwY$zWeS5Iot{pXx9Srjyp8dCc?^93Z*Pc0-*Lr-u|6qHZ%gRk60sYNC4QFj_ zn)pTK-o}slKg#`!^%os~))o=(vD))q=;gaB^Y?H6pdR*x@mzQ@^N+<{pXUG2@8=A6 zd3?6#7=MD(KOW^9{~w$e`#0U^jNezan?F{oT{sjHowWPhukPOckLB-muGaHA>iIKp zCs)PXtFNZ)ziG0+V(S~O^U`Z-OIMxye=}&sKaCzs-Iqy{O03f&cJ8h=*d`(!uhx6n zV(kgBXvNasQ;$t`nY?ft&-F^ymoDw+v^J(L`B)a*6uLTgx7!UPwc-sC;=Zntt4g0{ zL?4^obo9xALn@EEQYIzDnFXB|n&`3o8Sk=hMycMFu91tDo|%xeP4Q^Xd#(jbv&Ffm z%}G2hqPbX0Hf|-?XMv+kufELH_;uBJ>p!WPIj6VyI83Rg;YtOZW1T{XAV$fN`gbSmdF@X*b(fE<9cS@{d&Xw39{Ge3Z{za#?P9gjeJI zrG_qxXe^DZrg>7IL4ZFr}B>3zl2 zdgX$4{8LA>8%3=fTv&NhoTHU0tqz;Aq%^PDoRX}zXis45!Uf^l8O`ifQ*~#n&Y8G* znRcz!)0dArayBio^!JNhFhQ3q^0A}UG?&k>r_vs?C`!G znzJU9FaM#UhtRFS)egB%>Z+=#>y#d*+<&+;?D)E?vBJAzm+M+D(M}eVb2+r!`1GfS z81>t_KQrbgnEDAKKgx6@F6dk21gUiSy@@@=JL>R_C&cRb?N?->urerpzNyQ4Y((-?=|0r5#&Ta!C5}Idx4@3}U~=NdlkNpSqxUN2$&G+W~76metupifT!S#=Be zZ%Mq3{Iq=A9-Z|S>e8QYF8Z&&V2-|&n&_UC)2lyuALA5XvoL=0y;`f(yzkQf<-yah zKM|j{XWsX#>g-xkAI!NB{gfHPgNDp&d_h{?_j9_syXfdJj2?pXL*6 ztuy~EqNSv^KY=b?73=ExtOGv>6)doOIvzBx(6uvhcNp^}*67k8~W=a^@3;>DcpuJbQ4 zrB#SCu6uqvbjPju9};adCW=Mblrn{f%Q;uo>X&^{SZb@hJ0>PS&hFVGwOY%zyRW?; zFBPsToZao8>EGDB`|tB~znL4=SI^*+eX>q$?HL=bMWkKb{gl<+Z1{zvQl&*WZ6RI7MRp9+&g`&a|#C zxM_SdqT=rMm+!p#qmJEF0EIaczto?3Ln^&9sVEK%3|Jp0L+ zXdjdO%M9-)bnj2J`9JOBXT7z*tyMl$M}6bpF>(6)*&ouMO^h#Iy8Lw^+q$&2wZ{u4 z?Wye65w*L&j{jWA$MwISm+So#uxYd3^xZz@kGX4A|J%P;4=&JdPLrK@aQ0924Kw$* zeOww+-+Rl4x2bhq&)Z`!E+o!0@KW1Vls4h!k*S+)TCW8z?Q!Dv-S&_BcKpma_mY20 z8-Ke$^U1$PijxsAc*FmGVh36;mDGv&C9YL?WNFdM>?w1^U%md-6*l9zFH`%)7irs=bFy#jx^hBI$KiOz=PkNdzaCt?>B7|R-Gb)( zV^+R(J0c(P&})VC^xylh?K)(#|Iq)f_oim=DqQ$~^~tH%@`Bf{>i4`|b!dzDoZH&6 z>z2gcyw)rDZ_nIyG52}J*1CSpQnoh_>g=ECq;9^mXtnnIvefg2H+R=fxpQ4RUgZX3 zxLncGhlf9fhV!iwUOu@w-{6DI;$xC`Crs3sbWvln;S9aUH;&D|rXxIYf~Uu+ls8i} zZ>R$8{l({rAN8 zPjfX2)O&XFS!d1>y$8WPk7EnJ2L`U+^`?1g>c;phr-gbZNLlTjw&~lcK%PnYGY&T@ z^?sPhw)!>ytanP4L48ksrCxr{;Yg0yS9)Up*C{ggx>rmkSLC0*yu7{YShLXIeuntX zp*(D?i9!?KhjmS}xp+s<_EXMNL(7f(ivDtb`cbj|&jNP;qD%b0pYM?T^}l{ag7UgQ z8q(ic+m>;1eJ@Mhz?YPh0enF?rFEWfF_j zO!o1gj%d@{%xN9)$9doE9~U8~QN7m_;#u%A&*=NRJJsj*roVf0KK_2aLXWbInLyHw z?QgwTYwq~8X4Pt&vs2GqVVgUhdEpnya9#H=JURwzN`Ev&^M#9Fo1Nx<3o;uFH599V&qf1>Mzlkw`lDxv2Rbg%OyNc&p4rIuc&D}B~Rtyd$*cJIyD^GvD%N>JR@JHp1Fl)?K&law?Nu)RF_(GH9Y0~tgGG)i zj#ffXrk>z`$nsR-&s3!rnjoOz8Lg2!v8?%2(ehWUjVxV@ygGMScZzPiTe0}4W^O&} z|EBDn4M!T~54?XEQ<@XhBrwfp+xS>i~yF1y$()i5X2QwbHX%&*OlEvHD# zt^Bf~gX^H>)Lpu6*Uk%X?DJDLO;Hv1*05e7xXMiXT*;24OtemsqwV#pa?@tPw z_8Uki-p)vB_Kch{^?9@$Yaic!sT!gAlD`g5G&sI7VWO1Lu{%@3&1DYnsBw!3$+IYH?)j4yUb=3x9LXjZgf_bTq8^wN$Tn^wtxH_s@H^W`k_PyI1&*Q&!Zu&PrirV^4zn8+bxX=W z-w?|(U|E#Ok*FAXNkxq{E78b0hs|vB%X2wGt1hkD@-=Y&SJoe^^lL&LXD`(4+NyQ+ z*P8WNYy0;fuy?e5elE@Y<_3qlkDKT3H2z+A?|$*QyVL)F{v$eNG3)v?`(W|_&ZouMF}jb%nLVLr`2utOq*5?ehQ{8s+94?t-t7-evV@)kW3x}C z{3;bHT_GMZ*W~UD-#eSxv`_m9WpK56&x$SCq1@5CBlNH|tJ&QP!9ueycyvuTqZodE z!jfsTCqFqpCFO1(8}Dq^cRM`4s=Q0+JnfOxKR4l*u9Ol}@6s3iJ+kJ!~F1aK2!KpP-uJ-Ir_LrhDpi=)JjA;J=PT8^!?$2 z_o{A zZ?P7NM9EE{}tq5tlSfv5eJELY`G`7`ItL8WafJ*5dgN}Yv`qHboB4RgP9d^AmG zaaq%~sMO~X%Z+k3t=!2oO?PtqBB|D^JdXF^HA8IE>4bTZ-|X?lNqJkiU> zt7li~b&323R>~hO?zuB4h3>k%@=c5G2HhJOeorT8n; zd1nc~)ZFw;#?JejXwD}N7iSD-!1)Tdf{yM{OLc0^u40aocwA& zZ_*Df@jF{3mpU6N?X;?Qee^oVZ)$zYgupAUpM~xxMQCO$mz_NEtM4XN>zNl~H$7F6 zd!+SAwzK<(oT^Cq<)j^}_0t6Hs3kad~%QW&1>F5)1SW+ zsyuI_U)U<1y6J?m{gfYuabL_uo=6ljMXxLVJ>xp#%){J5{*Tk|s3u)!c*;@zae0m5 zggg3iNsr@%Ug*evtTbJ4gw@1G>7&7C;U7zn@F4MtQl`=e zHYsJV>t|OS6x)^2&LNWcWl`s;a^uo{VNAgy%L~-yj>ft;@>-{#=VW=oUeb|Xc;fKH z%@{<40SMd$I=ZF8LJ$zVfQ!}w$f3xsx+Zx^N|9d?m&+V1l z7b|mtS!51lQmy`9ZE2PHd<*9}m0P=MtXV8_>i3D=?H!L^?qN4tqP6;hU2~WFM($*Xo=%4> z)>^Z3bsk-0f%rSJJ9S$?^i^5eYn^oxZbgz5~tw=o@8aAjZe$Lo~9vKmYGpDKYx ze)1ZNdQ8qg3R#jFw(*Z><}d3yn?I39UzG-ZfB*5*wgZ)Gf+VA*70lmR$O>$26#MjW zKX=piNs|`5SgWF(RlxoC)rl!pL5a#w-I}XztrU5?tX$u=&?xAE{3?#WpX))5LAG>` zv&YyO80rM@H44xggRn*cv^CHhaz9uoP~@N90)@3RHKNj5Bil4`qJDB;KDEi{fLHdi zs;Ft)d3xoU<$=}j*S}c1JT7)Vxf?uv|hvV~sr`k15_=OfBIuWHTO zcj)S#bG}=Tux{s#JzG?MRO`-DrLz~DqH0Z-PqjSkVDmXB`f^CHuxjbat-OI={Boj( zEYH?3-Q1qabFlbo(Y)KIqwYQ764_!TW2~FKHR|IB10OSD!qC=YoTm>Zz8ld@6c7YJFifqqyXuwt^Vn7d0DC7>NGYmy>=_tGDy*be$uTe?CU7 zobDu{v@W^r@kiG!AMYOyd+h5dJS*BkMk7GAzAH@Q4S$M+vInc-sSDrFA5^x>joWr@ z#hPrRfatfc`y;|7kM)aHl(ZRt6|GponHTifX+}!M_Z`*&Ey}Nb&E-C`IUd^55X_Zk zaQZ^jqrBSBPxkQa%eZn-Febc!yZB1(CymR~X7Fs>o0q@hoYl;g+baWC&srCAb~^+XCCXBMg(PjG7^8caAVAw{ZDqiX58Ix?Wkk$<)7}FCZ0_$x{Q?y9US=*7LD%} zZN3)qzp_!`7qOXQ%PA=2FLx|ihi#)v^|c$l0s4`l(a%4dR7}};F2sw;MZUL3e!*pR z^^Uwc76F$I72PjiyY?;p_v`{+UwZrgMW4BE&3CohR#=q5y*Iiem(TrInZXCKyFr_K z9X0z^zD?=u_n7p+==PUMEiY}nA3nX=BC+(vV%c}g@3ZzKGi>e%{-yomo_GDkgr6_& zZW2#_bGUBChUFeYmqa{wo!I;AkEVjPXG-Tc{8mUiB);*-M=d{9C@yi;SRYxbW~CygtRuTOaca)v^#-bmT~*t@C!O1tI^l0n_qGX> z5+)n8>v})xz9;e*92<3Og}gv3IBqiHiw#lC*nsqmdc!JfMA9Ye*o4#~-TDH~nFy@g z#hwzqDnq)<$t&Z9+7dN3=G??h)}Cx->ChRh#7J78=Q>oy)owaCg2bJJ(d1=u4Ta12U%aKUv|q+pjUIhF5%w;ntRrB9~uB zkMHf9y-}^A=KLn6>((BjWl#FsLN%{Td(5gdw#`ueeJRY$QlanG%ZBRRPbXBaTe;}P zmOXXXPe+PG3;Oy>zA(FKe!R*gWUI#K;^1w`r94l6>8!u~=5!R>yhh8d7dBjI=##ps zYqo*sD^JdWPpaI~COX~6ru>_jl6a$xZIbn_wSw`MS7aQSr@e~s;|+dx!9h7J>%vN( zmKhBJ;YQg(!PDOdDsEkKj7v6K!gHtWe4)mTV&>D!W!aJ+DA`Q@#no7BB5fNVyGFf9 z;@Yc@>>2T=%FX3vwYayQ$@|q%VcGj9kJ;B_Q_0=Eb8mku%gMZdZE51cd7mw_3pua7 zPUxHFr+0^iiHmJsYkKyKR9P9L&8?nd<=@_Jzoc{V9ml+8?^2ua!+TDKWffF<on4Kw{oGka!v7~EW=hqiI4A1zV+#S~cqWgh?mC9C~XKQ!pehBPx zk~X@m-K-bt%~~t5UBaSiI?HA?kBf^ka#qQBO2+G`o;&r?kQ>={S(Snv*_(xwtK2I#38{Dv7e>Ndu?b7$vI{xjWU{o&)CSNA-Brh8sK_hE+2 zf&;Gt6!uIGshMjrW7+jdR8ghzTWpN#fBU982#FB z>Lqah@b;3Lc;`p|V{^-@-cGZBaVl)dHK_`wwSsew@|XUZ!Tk8o?a-F#PTyXbC0_mz z%sbupz5h!l)2qBbX_xf1-WjB(ujqLjpBeGnq{MrV|D)+jAE(S(aM|-j;_QbDwIfey zY-Ic6cBF27;^WJ_i*n*LMbkf8GuI!Q-`r^Wb6xen1FN0{X#MN5fA!<`lg*1u?k6uV z-{~B8D{Jf0%gS9hRQ5!i<5m z^phStuUKbQ=W_Yg^Rsn7?ER0v)>D34;d!%Ymu6aOsIuo$@!&{dvBKC6Z_oT=%Pu%D z-vs?dE1AbtkKI8VohdlohtZoo!}uur}#pK;reK)b{e$jXS_{BzQ9BmT>)zF^hcEsZ{jo!y}=5!S=GF&0Q?B1#iv?csAXzSHU z(w$smoBv%+|5Rqo!R+&45jXl6OFnJ7%q?BJ=i!wk5%U(tIfSLLoA5qVhfA9G5!@qyLmoR@nt^WPp z;|qjBUFTS|v96pfvHG`zpuE?dBgeabgb29v@15E4xTy6~bBtVI*n>}<*A;b+D7snq zXymDU%1iPwH~zcb;MQ%4<8OPOahTRf&F4&x6kfEct?k9R$CC?d*cmI-HT|cYy6(8E zLfP}5(}a)fMLvF2+E?8tU~-hd$>`6EIp?gVZm*vC_4fv@@0-2l9!#IBdUvBh&eo5Y ze{fzuf3EXf;_Ie|p@P3nW0byq4tQh0trQVeT-uEZ02juKW6T$Jed>|2_Nm*4W#nZ(qCb{%!l5MM!AIlPbRx zzwO@twR!)!aR2+AUoT#jE;!KrT~vfar_-g+r1Vvk&CM%P{x99Oi(Q=j{bPCd9_xh% zGy^IltXJLCT9}a^@8j>!eZ?gy$|&;jbS=|c8$-@cbIFfaT6a7+*KLZwuBh)3)@QT0 zd<}K)UEbolE<;R%kM~G$`&<`n&fRr!UFoqB z)?y2bqxGW255)qizf9q2vs5$C&s9xctSX>Uyl~F#1x5QltcYl6?O|WeT=gnok#|CI zEnDB#o6ndnFU&l~v)6i=dyuaf)7oi^oQ@{xEPUU-r6Szt{x=Vo_nR+mG!WkRcfv#q zHS=40vi6shP3&44p%!pSwzvFg>4{DAUMIfp;p41vI>^PQ*`F!es-d;atCw4wb=8ut z{-;k)%dZd35YX6^<+i}gf5WHe3-7V&f1Yq=K0B-LwwIZ!kF;8|K6|chB|85|Y)MwK ziJWh)P{!HESH4`FS?BibNc&ZxI^EZ`X(79H&ZuU`+&FOT^5egIcO~xH5#RmwwI{1| z?4R(yla`{4 z+`Y@b{fXbA>Ft~$Ua+z1j0e}6IhN94DQ8RG9FJrDJ~_vD)oR!4L4VuqB4e};RW#I^ zA7oCMvg%hTd)m8C{;Mkl<|i)OnX^4DW3N@`=Gq1RLeKxax%$$rf`eT&V@c!7hESIS z%fdM%RTgkg*&WJxW#uCF_K5Gl4*!knQ9J$mv&(}lJ|nzeKLYHcm& zbw}0CPiqyv7tQE>-ek4Mg7ddF%A9`kb5+i~^YhFs72=vyPKhkp#J?@aSJYi~@A+k| z0rr*$mPkpytrKPbvF3oz?QKspYxS(3?MSSOYdZd+qv`y_7NcdA*CabrUDee@BYAgGIXM{UGU-Qm5ZjO&WkoWIw{`oq|Nix$tv@N zRy>%M>wZ&O(biN_vq^XUq~$S7(^%tAFS`~ad+zdqC6mKc)6VIiJ@+=GHBEfpwjeXk zMGqw9tY=P{_in<;Qm%PVSyR{&BxmPy<*b^&PjK_M`N!KNj~4%EYx%Wp&83-~|7GSS z>#0>JXx}=$%*9%rM{8f-Ps~tUHr?p3P?JtCHNjS)wel#dy}m;^ke2F^Y|${($BKTO;I8&=k=YUn6hH({|n$9@irb&E|b z+A81uyeAmK#%8F04|B?ItYty6G8GP1v zzPB7Ymv~2-OMKV%wnMJ(rUgVux@Bv;DSFS-db;aQot@>SWBSvp%QIMhvjyfPR<%8N zk}jt;qowMNqxF97ga!Bi$Q}2so9w*fYhK8wl|?0HOQ!@Kn_7JK>d_hJwSP0|9CW%8 zxSp@OW7~|NRxzFAy=x9QUJ+P4E$H~>C5-)tnuBXzTD6+)Xzi_#{~ll_*gZX0`;EoP zDWV^%lMi$7vB+l6Xi%C9wkWYkqHz9N)rZt+9JX$bQYu6}+>$6~Y$v?)&+2y8P>k{WlwGV?>?T zzr8s5%ZZcu>p3ngZ+B1Vc`)O?(NoF8i`THFZzz;ms?(s}6z86NLOWK&;Bc6m_%lP7 z?vItXr(RWi;drX~%8LayF6LG%mj>^Wyr9usI3v;ekab;;Vz;qF&E-vZKh7-W4dHp* z5}B!~ZoE4onLed)}ohx^-7 zEY`0KtmzCaV6!p0!|LMg7uK#80 z{Ev-)_2qMO5BW>wOpN4Tu9?p9+eG?@WZ(S7Hr~9S_V8Nx+0IIFX>FD!UGIMwTOTvLXjr;qcBqnds&$#)j~$a=GR}McqFhry;J3|F zSGNDE-%gzNd8H5@w`7k~Wv^$g?CXzg+4UV3(<7%Q-{{qzvf8C)p2oF#-wKW!d4#rJ ze>tuB>vyK;`SJQ~%i7k=ng3?OUf;_0y#C7{zt8wRdrI_`3eNlInco{fjNkSkekbn_ zevSRAf8KNauXg(1_(}2MkA1m^y}wQP@aWT&q~FT(#V`AK?-wyH{GF#?c<9lo@Xv)$ zSDS@DJ0IJ4mXq~Nc!Jlve@8Cb2mf>WsU7~O_fz?^_wr}%+wWXlZx&C+v7hkVx%SJ$f|G9+dvEHm%lLY6>4cqk7v6cx zcd}WrfH(c{;vaz*UjO^Zv99Xwb+-><7tgiH#>r`?Z9TR4NtxCS=T8ymX1!M2dqRU} z!|Tg|H_rcYI^*7`v0SGiSZ9fj)7BMElOv9O|CO~*u6S#N<4V`=70vN$Qnp`xyx_x! zt;ddkpQy&uVO_B`zWZ^KY^v?WHC@QDb-_1_7TbO);l-1rRB&3?wvlD)FbW6 zL{m;GpY;5FFaF|oyRW8mGZ$Vy_hhT_PwBt%x%-OWJh)b>_xPfv`|j$p{eR2C>;8U! zzuut1)y8askVN_2+}%oZ6}DY(c5yR3K6PW`mIICJ(yo?2+VSRSr^BhW+%mfDfp^Ph z_5JSMqP_0R+g&^>mNwGh@DVmaF}7PV^SnB1#bMyC?yTv==7sK+rm<}CLrOWEf!=MJfC zV)}iqx^a4p$cz{4pC)z&`b5k)rZ~&$>@uEJOh@~bR`M=bVk5JqKw>_3%A^fzm6z4X zM@@a3F4p%*Li5X`y;j^jPoB@8HRGrtvpP%K{j+yPr{@Z;|LJENCi(1Z=-gv5Y}`Gw zKPR1K)%^xTG<)@lN}$P8HWpf_BS~ub(o1;<5fH-`4l8*nTMN$tlxqlFDWFPU@l#GKs%=7-E7~ z&93nJoUY(}QsBN**3^HO4(0zyS^Pu&*#84BCU0ckJtOMI!83eC`rXzR|Cl#89U@$R@8s`By(8 ze^#FFT`B5)WTy|O`m$ozr^-9{#mWkIU9XvOuYK#!nSGUqp0Mqluh}zK_uV6>#E0Rs zFHb!?;Pp%WjKRd$-NG-Q%C7lbvAlNA|Jo>@CF1daf1HoM%fY(0&v>_IozLbucQpT| z6i&G5_nAMDYx$2k#}w~Xc-$6|+sg>*OdVUiYF`jD1A{Kgh&p=CltbxEdFSPq=Q-yj z78j=$BL>z_dmVNVvAujut#@VZimkggc1J}yF0L*N7I4|>#c1W1%`uvK zpmFs*!c2Ar5AGa4WBGmF&mT3_?vm9vHU%cVD5!hit~6m~z1n1T%dTb<(aiT3+KyhB z!TR|?KXc{t{=+jL+;VG8yq#erd-UH@FS*uB-4~~5B*`puI@_8QF}brZPkjG;$y3b_ zO`A=<@>Z;z?;aGB!oM&e+);v?UrvTi{Xxu<%=ZV5a!t#r%$c>ju5-9`0-Y)^%(EKlmD1%G7)MMp}OYKAi-1H(&{A$1a>!w6DX z<_4VhJLDi@%j}V>`AI-Tp4-=;X}#2TDRUJymqpwizh7D$Oqw~%&g38C$LKp7E*@zu zeCsZmuWi`nSM=;$?VRd&bHDdb4_~seJCs+mZI;0GX}UYP)&xJjyK>s;W(T&f%)F9q zj~eb5oqoD1f9`E&O()*SHZP%Gr{i0r?tN(cZS$pu%~z!_flB74=`u$`&d?&8Zzo~!j!X5}(lK9Sty-dA)exvgYz zrQ@D=d%4!9yxf} zI*TVQTJxoUQiO8YECXhhu){icttwx81hQP%et*L4N~ez#WnTH0Pt*C}u%L5Aj@-vi zPw6S0#lNl@uWGsVV|Ge_qJdLeK%e-G7don!bL3<+dJ z&I)5>VBkkt8b(448AD>IG~l$~Z3hus^JOh9jRG9Ho~Ksxo-pKBE@cljpQz>9d&^b8 z?q7PMT(_Y6^I6ZY zsu}%Z5`E6b`kcKhT!8QKOX)LjthBeUh*>VTIOcfp{^Dce8V@HGims3R`yl&{Sw*Ua z@VQsI&*r}J7vZh?{8zp|*stVRm+`q{%=T%TpVK#85Waha?XpqD?7V9mrpUQw&c6s= zhHN9_m%omYfuV%lm^XpMd@txK+(3bUe)+eriFz%Zx+v)=*HZDWt`6O%AV)1-wI(UK z?WdWz-{x(;yXfDfW8O6vGJ290aXKk=eq!mgKV=ck#Tq4KW@(*%ZsyNtvrqs0{r-CX z3_;hn=FWw&BH>Aqo&jAOHC=1hsT4bH)DUH6meJu^mzo&b@suUi@SDbNolYxuY3Jyt zTb7*O84+|=oW=J-Xm4Y*Xi?*yfP@U+>pE(!kAmDZR3v1K^+jtvFQraAxJ~1wrfd2O z{$>5gJ-#gSS8$bUN%mazS;)CKDs0KiAUo~M%}!?OA0H%?H!SRQ=f1;})^+g0T?2=^ z6NPgN3O^WZxl;JNpl{*h6hE7q7YpXJrMg~o*C^QVeWh^Rmd`sn{4Q~;Dj8jAII(hN z?1E2SQ=@{P*)DhX`dIL&XR_9%qYt%G1B@$Uf=Vp)d-n@0ZPHuK)h@@D|F+KUdP-{H znk^d?GW|*x-|Z7td!t`+kl^Q}zaEc$~6veqylOc7bxF>@h!y z2Z_uJ|IbKnF1liQ?9GmY2OinvB~3WEZgsVq$-;wG$Gc89TwHy7ikI@FD_a=aDtI3A znf5N5c_5fCE2Zi1UFH77^UcR4CYfBndhE=q;|2Uu507ZP3v6uWz1J#uHK*s)5<};7 z*HFz@QJzc0MPHa#eQ!8uxppeEE9%1H%uRt`oPslKk@|by@1tr)F}j zp6os6nWh^GE&05}cT%33B*)stmU|kn5Wrr&g};cnci zTN2!{V0SrlZA#7A+PP*E|N55HKi+&Hk9oV9;Qz;)*CeZWW!GJJwQ(Pt{JmouJMYAQ zj=0WeQ5JaaK=q@KjbHj-sD$}{kYw7Iz!<;qk@Vf)27JL=jo3chUGh7oxN}(&8vaapx5?woM=h~tGwG-_szB8O=Ex8yJ#`*FO_)LbI z?9A)fm>C$lSn+iW@H9S5VL9rypKzc^Y`a+7w8ajBtSqjsZ(4)&7bFPkYXt3Fsjzj1 zM0*ia^JUF5K7l_O=J)Em-LLu7+LEz=C9v5|^<%KlAJ)?Onni*>IhST`J|CIBe(Uvn zpWi;e&0nC{W6kwRLTl2=-xCEFN`)=C?O|_VRdRJxOX&4A2hIjqE%aMGv1jeeiH^Y? zjETk?msiD24^o#rRb|$~J@BiB~gKI^$UCBHpTz#^A2mCBbzh#ODxYls$qMf-n6o%?R%k+3NL7@_I<=jlD*Wd)EOwt2n8g}d zAnm-g{<2KTlG3@8vNDymR_D7;Ijnto%c8lD7nx|-ujIZurBlBk=9s9I@L92CS<8Lf z_STD7-Au~<9ay=)dGYC$M+NxbD#aWQWxdO@?`^@%**AV&@PBNzE~>WVU}1Vh-0M`1 z-{lf_Z%i`^nw-^VWuWp}=0@0awT36VPa3KO?w*u+c+***Nqw*Ss#mgam)OJnvS+5q z+*y9HT6b+MdW}?>`z6~9u7B(3yTWv$+27CDmFvlQ_1nATc4oLNdxbvRQtH+ zTG}SQzivmmr|3_o^M1cN8n17uYfd_Ic|vO8ga^J6PS(=|4_n_kRDI_t*RcBxj$GgNKd&U z6KU?Q^em(Q*S55zrO8$c&DVK+cidoer;JZnV%hdL+Qm2a?gzK}SN#eT(`9C02qZV- znL#pMZa}Oz_?~X_*ICc){>)NZVUQ@i#qQ@K4kMAa!_!aJ$YhGAZSh`u*6jP{nxL8w z>^~MCnQatsXy&%O|GfiTYun~;x?HGo~;HoUziVuzKUO6u_{W?KX~Fbf0-u| z+vI<={H|G5YbfaTyF7^Z(aWO^_L&n6M3zhDxfW_&oshWv;?MAc%vYDw`W3Htu{SNe zGSTZ!k9(s>UZnshzuvSLVK&~rD=+4KixCMd*l;G`T$Ni4@85SiSCfuxC{UYvninZ=oJoh1?@Uo#5IV$ypH`D)#Sv_N_hBj!(;*;yaCLsjBV*r2w{6ZLv#RCT*H> zRO*(y<`z%Spaois6&@=*TG#RTltx&3j8>m+lg^?BCOwN+J=%S{`=pJm-kqzz@9lM| z<d3@5YBSX5$8$6v5)aPN znEJ5$#}`)9Dpv&$sqoib`=r>C1g=NF_!e^Q#pG$>FG|z?>~3AHAN%67-ejF;{PPrh zWfmw(TQYfaudY*k%^C=!xD%NjkYl1M=2xxG{Z4?Yk)31;6`R;|~|i zIi=CN@>>Y|F|H%2p4FcXe2#LYwcQRk^*QX(Bedby*M`ZLS%Z>YCvE;z*e06HQq`s# zxnMW*SG&JAnzVLwT`--aI<;)krOvDWc1e{tU(qd{lX;YdZR^}AQ_cK^BxaY^Bt5gZ zRepOzxs94vXnOJMZHrG$nWJNHA~rIU<>Za(petW&Z`oYEqZAx!!MaN#+NJCHtWR2A zELSENiC#Xj`MAQih)_dUd9%hgp$yByjL7~f6)$$NC4*IjX4tL}$f`<8?y zvwKx}*W9zZE1toj&tI#2+Ifq|zOJ3m;^qikTKp)c@5f=cH5UCk+g7_Dt;stc7OnF6 z4pXaP(aRqjGwi*du9y%Nsms1?z3GmNy_(!6I){?jTHf`1zgC?wSv7mx&vmnAX(e6x z6>;vPh}U$PqXO3_WT?5!<*J{cwm9vWP*|Y9@4p+fLUe>ZI#VZcskwyT4US*^yQfj| z-K?s+`A1m~@|f7_&)eUzWM#xbmYMJ7ywaKX^2!D#@sBeMelCox+!%Jw|A^P0dtIRm z4dnd;j%J1JE{i?GyKc>+pvJyFPu8VRmmYn3nM-|s?5c-BF)Gu4E$-UNWcl`W=ZsZJ zvRftNpU$XRo;Y{qTQ1S?`2o?hS6+W)WvtDkw)5}p^O}=yCdlq_J6v_=MArSPUnh2? z^Uk~c?`BbRoBhMIV-qh&b%$j-&wV2oq?F#?w?DdYvgr1YA1vo3@s=kjFOC&mbx%|9 zc*X_6l`qP8%M*pqGl@x*_wM(d%m35dnzMJu<*sU_Pg+-&Eh(B=ICbjPNde_&H?pmb zUi~$#l4I}5>jm=f%x$M7Kb*QUJSDZOCRe7m-q%UED&k{6O1XsQ%7=+JeM+8it*gq5 zUd-gV%{)89jk`OmAoud6H7|@UPw^c7q+-+MzUIcMyHekFT@e0I`L}e*sn?qy8D6_S zLqB!0$SavOHw3NrD^I^LA>~@{T&*(hB^x)MF;yv2mOicbur_GLws#XJ_CQ5()Vzp zrg7TEAHN(9yp{~hGkK?KH`lQv=XihVmyIHOS3b;LsgXMI-N)lXKc=^RUvi)!s(kBm z-}QlUa@ogrOW92^E;`izM7Tt==pK98g2nxtB^vuKN@Qpp&RO|fn0M>5?dMHo4(66%~BU{N%W97;U40AZ z-MSIxx8CuGORZyLj-1-hnl%=SHtXz6`}qC$-OxE%;&Y#@lbNbwa`CEG(2Q5P-{BA|F>fAJNx+6VA53@cGBh#tJ%Dgw9{QdPuQL=k~>|I(f!H-;^fK@4b+-GWx>a zH;GGj%!$5myR2)kFyiGy)z{jKLS zCrz|4N~(yHdRv(}=gSPf5iE;W*`G%o|%iOkT|}Gr}!?daysU?OqAhH`3lOrcOxr+HH5X=Ue8plb>E1 z^{rFA7Wj+nk=Cyg)7o8qcCqJYnhU({9pak5fU>|B|dQt1}e=x3`9>*t**xD*(dR_yIm;^%98 z*PLDRN>gi}jNdxW^kbJ!`G}oMJm#5Jv%-8{_=VpB&fGit8`&*>DO_~Pd3L6~)BQ!V zab(pLom^Gx+a1SOd~@$?!+VEi?s?1p?pVG-guRe)-a#oFcbop~8?I}PuRf9; zvv%9my{{Ci+m&v7cG>(q^YA^P=Dn(uZ0Dc6H%XzoamE|gzKz>W#HziW-`t#5?s=#0 z^XW%9;=4}i%r4xxTIXI_=W3mU-`K-vmKtB%aVq3?>bgyOoZC+SJULPOXFzWF&RK01vf2S|`Q~ZcK%i2js^=%%dv4Q@vSrM_`X&l5iB!d04Tyz*@Cj#;-=8_yfwJbU9ok91<@5r*njsXt!) z==qU$XVc>6vKvn3*PqKgcGp}{QF&kHR@Ws_Z>-J!{mD`mnzP8$Bv3r!)wztXD%05& zT=Ey`KXSEamUXG0_j{&<3Y)_0{cn$W7)mT|-SRZN39QKBtv2NrtWa;|W1w&j9~h%JwTS zKRI!(b92+rjHmG@8r~TlKN|I@=-DHy6_311M8XBbgC8lJp1iWawsQ*C^YWJ)=Jp*k zWSsx_-t)%-=JxXS&%Zr?tSZJ}_wOLrf#a(;v3>a2wuY%@pXzCb`R_l>Jn{T@joQbb z6IZY8-TYHL^KtJHwlhMr4ctv0*%a~@>Z{rv+uv+{K<+Ki*5gZR8eg<>f6_=u6Aj==aCc@t#swsnO*a`n3<<49rB!_;BLvjcuLSO zE7{3YC4Jf|eOih;i?V9go1V%tIF)^9k&eP*og1sme8diM80(8)x|t#<{>5zR)#$#X zTqT=2{(qgg?enzs=d~Gz@3|*+itZ71ahtWgDaiFhNPw82>5JtRhCUw?TOJ*^P<6N> zd^%u-j{C+-4U(sRTKGpYt}ilVI_2e7DH^6V{b5k5ZlUGY`XAc)Q$8;;PPms}w>V^- zs`Pb1^9j9QkFY)aclONR+cSP|H|Bq*U?x;<^!;HF)ue1N}QMxOA;%ln!mehPf*;z8TTf(MY*4ed%AtW8_AgvQaOo@!^}<%0eKmkD#neBTq2yh?mL(!i*UF*pEjJiM}>Lv zOao&@Pi@<^7uMP8e7h#MZR)mLTq0^0G7hc|Sz8)gSbjD1^}VRAuj1~OUjOy`UbXQ| z$w|8o?Ed%v{l5Q)xBvTb>$OCa2UHag;7)y5^`ojcX0ha;1+E29tau4Yd^|HpXkd z<+NUMLODaZWSP=M2VWbhtvNrk8kZ{zzTY6UQtnex!Xm{@Sstnleo7WPShMb$Q_M)2hMIrw!(Px`7MGrFerksw5-5DDYBb={xKk%T( znN{y|@;3=ZJNpKnK9V}aVcy!XRf_j!atNp7xTf|MuFJmVK6TaJ87&{#)PlFyb>_U{ zYv^1#!;RJRcwoUI?^FiSy$k$#W8Pgl<#Z)-2Zug!Uz1ln> z6GHW-PW3$*()6t`C+`ruy{D@2l4GGUUMq`six&rECg}0b^wxG2asM!@qT1cYE!Vfl zEs|4|V@5>7YKh>9Q>Jn(eZ({EQ_qZTg;{q?xpr}U=G77F*>_~7+O!ovyOW<7%6J!U zZOk$k{Iqh0MDxbOh9akZbdGbax+3Ov?Y0*0$`yB3?zle5amCJ^2G)A=Dkeq(A@`3+ ztx;7>5|23XweG23Xp-qx)sDGLaybGATml5!BiXH-FD?=PdL!e3m1E|@USEk1D{h+2 z%s3FXYs<~7M3r4HL&UpUqe3HIZHhgde7fMxfh^|h!bJ;G%r*x9&APPStn*jE?xhvI zJWmU3#G)s6T|Xo4v)ASOu8Q6)? zs=YfHpV4$I=(h7kzter|qV)M5=kdQ=oH{kgXr9O0%vXkiOzV$5|0`#+;^&D9qYs+9 zswVuZpW4{Yet&7Te9+%rA7_Ley0xe6%00m%uI8v$8gix|UV3{u$F4ZstzK~AKyY($ zWXgk?2g}8^ey4BMV%1-mySYwke&~eroX>bzJ}ElccRu&s(=lB_I;vn%&s|PYX7kv! zGVuqv+2YP!F3di(DdHc?y)g6Ut%dQIjLnW(TUl?>4Ux8R3}w6b<&gznWkHwgMb%WL zxthQIQZ1Sc(d1De+FCD?VEyG zhqK!157=KamCW=o%a_?8zWQon{riLaFHCCeSfs|xo86S1we4JP@0J-qSnFO+xuhF* zNw!!|e$SL+YeEukPgCgp$Mrw!!Sy$ctbeYUzc*Z@{Ymi3llKqI)$01|ix2smp7?fU zOw~d~ZLJ(hl`dQhlQ#P|4$v?5@&nhYJR*UPZK9LKKdIulqd}eHPe}e0h z2n~k7lBD$MepRUpy*9eo9olsL)Z4tqE7MLm?YuQ5_2yN%*p+6fJJ*RAb1d3buvT+* zNn(VCSYEe!N#;_`?3T|fFQ&Ri-461~-MVgl+TLkVj;VcRH)loI9{7>{de^-v3yd@Z zC3h*EU1_#->%}RrORlb7oogl^yUzTnk!-PxS@5xM6Vg&DkMc72dbj21+x%YVn{jY>H{cj>zM-n)IJd~fPj&skHt%jH|er2A@DOm|<2&3_$z zV#2e7>0L+TI9FS&z4T1Rtjs0p?8kNd);Uj{Zyb6%S4D9n2m%lp%g!FihwYb5^e z)LtXqF5+LgX8Ydd9rC76&03`=b(L#eS-b2`=JBxLIkszJr@u3J`nYID-ExlG$|pN) z?~8}ODKYw_7yM3elI)?Xc|R=`1Uid3(&t?M9JXTbE|+&xck}Ml|G(pkv-8&KCydiJ z<(!=%$KP(f)zGK^$g*sm&=9}=?LOO`)7Hrv70;dT?NfPSUbWQ}Uz2B3{ZFd%R%!%y zequFvDj4mewzcci2F?D{!e6}FnT5FC-#^v7hsf`m0URwy+ml+naHv|J+l9 zaMSelYf|HVQtIvsZ)@so&Xl-(-{8&f6->F7DaGB_19+Ol>zx>WJPG9e)&6$!ccr{st@t$e&>j=9 zYqHLfS0fGXpHE)#UuT^rlYKas-2Vr6g_j%*I`uo`6myKT=DMRPYc{OE8PR#PM(_Da zhc6`$isrk%bJf~iq;R^_`q#^fw{x#v$>I&acKH3HHwA@hzwbA^)L-qp_?@B1e2dPr z;s$ScwtZ~fl&gP;PhRt0fW{50S*fyfWX| zwoS5%57nRLUm(3@7yC5tEj&l}qmt|H)1!cg~gec8@O;<81bQlvwuVA!l9fvVHviX6GK>yWCq`^)W`jFZavDM5+1r zA1eQ@JDtB!&SBEQS&PEv&gjrP_Wgs zvD!HM*!1d;Q-4{0Iez_5@uiAnceRfCSMLwE9=jNHw0`f8GO7EeVg*-{>*K!2pI>D% zJ&(CxNv@{<-S2(1zDHc$Uh*6CFMg9$r~iCno^V}{?GMh47C(1CV$;}TRp;a9vm^gF z_o4r?n|@l}w~*d_!d}_?uH~sIKOeH*dHnit|BBD|=N{uPUHV2n#g6<@?pPT!bS1O*tB`pA~jx zTnKdE^l;CCbuRlKywb1Sd-}saQMHHHOaA3&Ec`yBV*k?8y5kD}ZQnhsd~5foaYnG= z+0bv1Z9Q7j-{wwQ#C_xC>&c3}dyT$q5qWt^LNYB|+qG|g+$-^Y1uv7zGGG6djDEtQ z@7nj__Kaha57P}79%N?WZ{E|k$fqrFlLUtWcep2~RH{gsx8&{~cdwX6?Vlly?msRW z{pso9`gQ)q4W{L%EGm}F$#}fE%J1RjbvjaPe;*t!2~-nU$(bl#(iD4YXU!sp9JQ{J zEze>dyFBX`^%iWE&V5|F*Qj-tpZ96eQ^zXj-t%{f>J!gVuTVJc)T+)>N!EWV($*R0_+7ivUrZ>q@Phr5 zEjm|ko7P#CweBzZlDYC@zm@Lm8b9?(ym}e2p@xpDMMCmRt8RycS~Y#JySlDxK~3Jv z@-?qAwO5K&$myrdy}hVyitCwRaBcqVhrZ+TBUsTX8uw5U!Nyv8- zS8h;qS!8eXCb8`&tnQqA-LdBQ-k@&wRA#xUy%lav6@jllcICK5Nd+kJPI}4u{EpGq z{r=km=gR6_J@ou*X&qPH;(OngEj@W(J#k%BW@o@xiS;gf=YKzExqL~re!ltpr`L6B zcE;|vbDOjJ&(TcFBA(=C^{2wgPyTI@`8t1!`{hrW?jPS~oYC4B($19mWb5R_3g-3F zfm*u_{K}HM-Z-|JEcVhlGhHlaTG*Q@9EUdX+muZ>G%u%p%|at7!OI!5p#QjWSdtp&rXs|%@c^S>8`oMe! z(E3J>+BpTs`572a%Q4^?5KzE5AfV!zR{|Ln$n8H5I%}i7e)5%L>sI>yE&uSu@rYPX zoI{l+$H7JHM}MpFP1@zB;Q6}vt3ngI{DF2YKPP^&^+UWG>;jcxYYDn>Blme1F-rdDesVYm@_=Uc^10bUnCN z&)vV}+?tBCLkaV^@9W+V(v#19W#Q5gyZGE*0qYmv99{^Yao(t7yzk^(JIQ~g{!*%n zJ}x`%q%rbws{en#s_L#-y47{|FD{F3PFnT#oo4KTY+>VnE*9VHH|)==_L-c?+p$GI zNJ^vH>+rTk@kbf^66(NfD)z?D;D61)z+in#%F8cDHO|!c5cMm&N`GyjSb$ z<^RV}Kjq`OZ4qman%&%KTzq~`^}CsO|NZ#+)_PIIL1AXWw$$U6+g9C~*7!B5$~Us? zt-=GxvfYJSZaxUwyCwDP(|wJKZJo-y6QkGZ@~aoyQ&y|C~-$#yK32v{|7(& zSM(+thQC~`l#{5u|GYuSx2!pRVJ%PcU#o|{dw(-@`s^7;L^jG7Y<+#Twq2n!X5XdT zFWh7}eI#b2&EP98RgKY3$!GTIQLtlblN8?UVJvZE#W_2n_+5v~vsir{d)9yZvGSJC zowb6mZGza0O4igrRukKJ#309-kH6_nZQIT}p>j{Zo8Dz=u3Yq1clRO7Yxi{iJoe3~ zzdp;XE?Dbb_MeREO06kzTPIuFO?_@EZ24q&k(@z9`01a!Uy7G5wUI2VxqifUO-bf8 ziEHbZ{9IplHY`Pg+jQS^z3t3vEx(0$ESxt}qfy1JSW1F*rg;ASkJAcX#;N^Zvw79& zfbF*@-8*qkZm+IwJma(%ZHqe|Nb$__ed)d2g6r>PYqet;GRv=8EmRUo?-Jh;_@n0u z>$7u$*Efsh)h*(=c-g|Qre)ELBPKyxs=2pY%WVFV!FR3oxW+3M=Q0Bw-^X(gZm^V^ zUVm7wyhUBVb$fut@fGt#qa)si&Re*{;g@*kb*Y%_&Urx@i`#U|vyO7dZw%9@bKKP3 z-#(Kia?XOAhbMdxyxDc3=$F6Z(jVZZ=W*X;`O}yf7|x=cb&7uGr8G+V^~uaj^()Oy zN-ct(Z#6YMJ6YtaWS!q8gOf!K44hn^1`AHSQ%h9TSR^RW{2<9J;XuPdDYebcMjK`x zoqLnz?cPgStM^v89`Jt4`!+PnxMN$$-v{mgCe*$0&-lH^c=j7LMGw0-XXX^&`y4m# zd*%J&Z}I>CezD5B*s0HZMZ+ZW+RHB+a(Bh;x?cEp-=!NHV!!Yl5eW;`ul%QYdFy8` z?>hl0Cv>0Ww3_Z!dLo{?JF8lL`YzF|V{Rhv-spr_YUj6(unK_e63&O zxu+hh%2}YirSgV(_m(S_+0*1q@5bC)ws!Z0w1mZnmPMENCkqR4d7q70$F%v7a3^cT z*)#8xT$c+tF4z&hSXMT$CpBzMdXM>Y*Eu)+GM8+0O*D*stM5~gR41Q4%a`xS#n!WI z+cdY_yE5U}-W%tn7UY{;4A$5wxY(%h%>i4sclzPJD;88mo6Ge$ajA=j87~QbwxiPQ zt*^y9k6#WJ=Pj~6HXO^dS+c=tQqJ?Y0w;4?jV zLPj&zrMBM`NOAM>v&yz&sjZ4&tXiM^j9Zy!p?obHpY|QQ`8~&kgC>6ME3eq1@b74$ zh&zu=^40F^nZ<|vBo&$b<=sr1hfxmiFR*$%^$e3Hq0^g z)yy^d89axRzJ%?2V07wOQPZW$$uneS>|FP(IM$Z=;0f=ov%GJ!dJY8|6!n#><=d^E z(7j>y6`7w*(s!1l{A=JSO!E8RmL7Zl!dSSWQ#^UG_&>3r2{r#=aO`@e64xcO9X zQyal$%XXWJC2l2+K z#hK;2M+1sgXJ2xuU-og;kpOw!Z{9}b4@7&-Rdy?GEnbL6Y@{g@1*Oy-Ue(1`nxX7PV zk5&Hho0ayAO;dKlg}T!Qaw2JOFa2PM`t_py(b;yc-OrD2Tjlj^_c0ZAlVh$656w5R zJ0vRP@1b^`&L?NyNgOxzk@_(u zwq{)(=z16*J^o!Q@L82?=L z*!yXC}bC;*|ykB_bcm~IX3PJD1>rKT4b_>;Rt7~oh6y9L1 z|2gWW_Tg_44Jl@&qH|>#x1F*+P`mNYx{!vsjNi6wi#z-;YDtvlw7pKkDm?ScFY_iS zOZ~js!eXX;^vd?fiucm^3rc##8Ye8snCEnD>j{;KaJO*?(>-i<=h$io<86z1zZY&{=Ks*M ze&TBHn+4kUyWYEA`FY0uvX)r;Wb2kz|kdL*g9Ea_m<=bET&~d+oC%mrb`RQ4@S<~JupRK>Jm}_26JJ*L` z$JWYUu9e@mhWJXZXUGrZ$>CV}N#g96pu}lx{7Jfeh5rhrUZ>af1$_EbqM@#-$+mmZ zm-tt`6`%6no;w{OJ!#2O?E}9bel}ln`eL!^s-=H_{r>;^d(Ld;8o9$o^FDvdK2lhe zJYl88kuV$4TX%xC&0Olbap%Ne{xMFoXG}Zqwc=^#H-_ojXSYje)^{ z54nL%sGck?2>=}l4&N>p5DU6V(023cyu8=$(`w;Y33@atBuRX;S=a2lcJoH-tbc3f zb;mQuDlHP0QyiAgp z)p@1v)E7R-m<8{Da@4Td5wR@#qmJp)s?`_E10C);PFy(W8_!OupL;789i5?At~d3H zI8WK#lC$5Rffmg&gBHz7t$Vbv%P5jZY3hp#p%)tK=I%&{NG_9m_6sS_8!5V*BGC-B^@{10&}5+WA8nB{zJ>G|D?E@>R= zmlP>mDTpneV_$Pr>+RS5hxjd_3PRG7r5E>bNA_ z5BllP$iVOrrTvY*ZdMVk{Q`{_CzMlRwnm^Vn!S`1xx}II(xngq!Kf9RM7c6GmM92r zUG{RZ%cUi1ngNWCE`@V_=SY^`k$tVVXj>1@iyRB9cc*vs?C#s$W4+k;(Vy>or%y6j z`0Hoy7wgKCwa@20wSPXZSdU+RPrklUfZC_G0W595{;obPT^g?u^^VIWxpdzIxj9GY zn=YK1Xr05vy8P$0A3A*g3znL$I3CX}^0Rqg#+DPRkzF;}$*!9Z>#lt`L9R=;i{;15 zZq`GJjg4&1l^4Xb^ycf9hj67--*Vm5<^V4dFokxZGOvHai)&2{u3S1n|FJ}5$(N^fg=hpk; zG0(bLYI+@O=lMl@3%9J(?pn80&3oOJlZ)9)_m`ZSWPj!Q6_NXKtB;4Z&VKeHuwLbY z6t_Ezn@E4T>VoT&8#QjEwa+eT{I|}*qkQ{TlUEa~G*9udi&r-+OBDFTvL(${O*vr= z=aXZlDhp;auUl>5w7|cqR;n#Qqw#s&WueB$-NN5yZ3tWEAvk@7!lLz4I3o51Ty_x2 zunXfLK2zBBbX+*ZIwOBmDKij7+IcXJ@)Ie%%)u)J3{-9+!DT=pHlQ|>86lX7H#Z3 zoD<*O$vWW@X7+K;q9m!@$&2RLq@DY6X6g*TfHRks4b*(omik}e5I zc5B47(ztoN*t=Xx*E#q~Mf3F+zZbNSD_(NtCy(>{ptXyWb7n42Qe3@2E-U+@a$D-@ znuBJxS?+5OG&om_na*=7)e_^pF@2Z#F7de!u5IAxj`Z|7>9XHO)@$m`4-3xq{jvya zPY&7Gv+6V~bb6mVPB}sbtW z-qi_S#uZjD`-;lsRlW*~BW79f`81W*JnlB}zf!<<%~e)}774+|3G?K{x z;PJ|;6B7%%aNhKf(EcRbOaA$vSr^+nbf+KgwA{fn{Z?V+CC#3G@yZb6&7BJj{?;6H zc0Mn7_uA}}!u7!`A8N(qR_R<9+MHQYr0G|eJLRBuae-{n+Z}e5kG!5;`4DZ%^kpfV zzx3$^fw`);%rkayns2@zz023TJ9u|ymt@;h%N?S!Wp|EQ&G|5kQ-;$$nse%#uJR2F zm(*%5Us!Q|d$RkU&uXhLESPoniJs{939XCgU4BrY)>FkSg#!&%3NcF*56hmM`8&Y0q-{?w4y-&1pH?poh{ zGwxkjvOXs}C#U~qom7_Z4O{j%B}MbDd{{Fjc&ppBPd8`ReM15P<7B2c`T~v}+hSOBzWwogm zN#8a#9?BE1eI&d$Q1(vZV!JaJ!^7HdJNXtX3x@e#4By7PxzTm;zO+19Ws}I5YtK7m zF5cIxxU2OhFzL?28JbFQw~H#WpH0<2E}Yl>zXvY-8T}Zqg<_5h-uU-2p0=$99${?UMH43QJ-8hYtF07DTmb`Zku>~_D133@0`u- ztru7>dv}QE{auS|!HJXSgtD5wD=Sx6e<&;{Ve_}}kFkOeE$+RZp~|>&+3%mrem_&1 zxhvqYR;iA}guU!~`E7^ae!Nwd)OmdN%ZOJW(=7cyRJ^q=Ty%W3RanIy=1nr{pC@ZC z|FqDmW}e>~pO!1vcry*f7T;?yX)=4fv!B(T@2!^;o6nP1Dwi%UN#0S+m8o@brdz^t z;WLsgTf0hRmdg6iYRx)x)acA{&lL-MSeLX$9F9Ix)l?%lZ9>?C#2+^pq&(}gxQ_&T ziWnW-w4!u(i|yqmlZ+qI-y{?}mb58M(sbS+{diAo#AChUHE)l!867|7Hz##%=nbx% zKHZq7$=cI3E9RIl?n&a#nb+l`{E^FOf4ouO0SzS+&TLCj?<41)Pmy$AGqICx&atak zmxvX$d#pX-%(HmsVu{x~HqR|#%VgHtFmc9Q&m(4n^Uu1x)tS?y%dyFO{qiSgcQniw zf0WcWSH{Nk_R5!c-Zg*Myg12IYGTICT^Fr%{I(r_n6jB+<%XFNH}=VkvG)9z5ZkzP z&oob+Sud+)x>LVM?PyxPUoqD8-D=P4m)=Pm$jG{URC~8)W(oI8GoNE`k38mkRH$B@ zroLy#^y{1bPQ6i@Ro(gM?-KSIm5V!;zWg5+rMNk@%2QphAl+wUX@XDWyxbtyG{-dc zx=rObObbrr-}bit`1dFor-@3-BuCyKgdlh{)mZ}q?3cIV_F_B4$T z8W(HNEU-IsrLm$(e6f0@hMcoxrdE3!m(B6m@C)vj7j5Q=X)p@(p1tnnk*#xgTufc1 zb+hC^bhq1tiCCJuRS8QZT{7_$xJ347iK@R=#^u5^8Se5V!gLhN?+z})_Z&Bp!u?S zI?OH1cdGR-pSfdwC4$*Vru=(~%?bZ|COXHK#!SsR#&JC_=DF|cRouHfn$~U$IkYyS z{e;L&{osg#PyyD&!xLPbLN0XpsQ7%%x3g!`iGWWei__ixAo$3(=VyInX)f=er=g&H`jB% z*~R5&zhp}Pwd^mkQ`^tjO`oW92b?a?&=F#?_77kIO4XEJ^D!8rN2}DRlM(b zV=i!0U-0Mj&J%UQ6a9k(f2!yz&Hp>217J2?)xR1C;RP6be^oo^J|UrucjG^bQ$%S%rRjyTROpn z>*lEpp0Hy{GmQH5L?<7+yjEz}(`OKI<^Ycm42DK3d=SW%>CrXilVxrp;z;I_$nPp|HsRIYb) zSIcQ*gK67N=snc9sk*6rM_IQ_e&+HQ*Hzi>ymDQc{eH zb{X3~RdKU^>uEi)a4FlH9kORFPPW+H;Ivldu$rvS|K?2xKDnK#m;9E_ znQ_;`Z--lsK!mWCeE4#+cJCG=mHx7=JggfzU+d;PJ9%zlV1Tr*nozazNja;Ux%~n& zPyJ}WIsMGC-16ToMj39C7uYS{ZTW29t4`~S!DTueZB35aw|2ZWydGHX@BWsPm+|1! zrER=@OD6@t6I_woG@JB(`uW-`=YBljw`ynVy2;^7 zZ}Y~rWwUsnczbk}to58ZMf@AgJ7Ra-V&dQRFR8Hk^@ivTA2!&|o3mt+L-G3U{n_4U z?j~-K(VlWE*6D8M2Jzn-o6MgXFo~Ibm;36HpHg;Vf>T*cSmuuT@@!&RS(*h0oaVpZ z%q7}!=dXWl6sda?dsqMPT#zYC;IGOaJmOKxwLIMmRp{4Xr_`8Sp0>XSIF zwz3_5@@D&TDQhb$p1kwie7BYxJKpJBEEcD@W6_nacfv1yw1mz+Dc`hW$J$)Bt@FMf z&lY&<`1Gae0_p54>Z_Lfv>g}ulH!(Kut{U{UbgFo7p81nqp)UONsOnbK?KX<08Z}m zi^r!w;7)RiJ@(mf=?%8Rp4XA7ync^)rd}3w?z1(W=(BTwRo27q+81m;S(fpLC3j}k zFLe_a-7|~v0sEEgk5>9Zcc1?)Q(1O2Bl&3Doh6@}FFbx3wBowNp1`+}e$`czKEA0q zRK3z{dREXS@&^c;U`s2N14F~_m1#U@(+fziNFSYGF z9XoH~Y2z>7dEG9oPX901-2d=#la*6x_?GRx(>4546UrYgX8Ucs!JVhCvV8uPXD4i} zChjQS9@~8WLZEoOJmmJTm zGWB0PuV`^i?XGE4^rdQcI#@2AqA&SpVi1$EpUt|K^$|a``gbzioxR}Smat9b?1hZ+ z#y{Bhot*V-N69Yxn1i>LYSia^$o<2qUEv~KczVvsh)ZpGmW7i(KCymc*=!#?xhd<( zjJG{~sUn~JdH>1OJJ$Q`RC)WwTvWXsflqvKmX`FX#Xg^C;Huogi~^f_qQkCTRA0c z7SpcXQ|ph}NBj`CPvDY_END2mU+amG(>KFM$2LFaT9IUL{)4s7^S+prlH%_f4IjI; z18+7w|FmQ3i~GEBSFWvKo4z-$CH`@^*uU=2NBHQ)*DHTi+B#CVDz&idFfzg}t^B^ypVzKIJu+^6M1a)4XrrfBjro`I7HX zPfFOyC}ru=6PG5w>2TZiE~R;*Zr-=!Zv~J2WWAZQFI1#VBW6WQO;+wLDQkcIhVS}Cw{@bjR%&}5&de>GFu5;wPM)?~ zrSEaRmqta+?@|rFKRS2HHm7ywf;SUi>%L4>-uGlrZpwNtDJ~<+IfBRi4BzBUlGeRh zzcD61NojWB(-#xpxadq;n3`rJbpDp@oa63qlYHl>S8{FM^2O7hKP;WC^@VTwalf?7 zl3hEMKV4iPGi8HnJIm~Nt|b#0CBN{MD9rR-c|Gh&^Rg{c?5Q4n(M3n(HLW&Fs^5F5 zRKercc6D8<->wdOyNQ;EeWu^;xwDWj+VGXwb|&Zbb&E9*zwJ5VVUo4{^6c%qrl$1e zyqZ=0VcARObfKAs){kAfHU1>rvNS*S|NGKSqPK5oE@8>8{y0sZ-@M|zd-svKM{lp@ zsoL{>dDoHEtk!X}bVcJ!qAx57IH|B|>pjD{=6hTE6Sf(h+_lhtxo~7a(4oBG_Nu;w zLodGv=jDs=t#Z_7`eym7bK4SyD+|+%QmQSVFRgksvEc9Dm|3#O|>n)3&|66cB%?-cIvvhIkj3EH9Rayz(D zc){jVg^Oa8P0akvRW)t~AGmq=d)H>I{4j;~*;*e;_URozT{L&u;`ge@vVWxMmrdWX zBg;;Fe_z_3d!jePm4a;NpODrpl7DaE`&&spvvuE1xhf&^cn9wcv4;;OW#$|^>$TE; z%Hg%|&gNR)Ie53ldF`FvAUXA>*0Vb{ZCG4d!*=iBYwMl&j>_Kazgod?R_4>KkBqM@ z&6eNun0c=w=#_s(mGak(Tze;azpR~cy}zior^?=M@B9V#{Da>=Uy+{Tw>LSp>iCqP z_Z3ygU-^f=klj7yo@AW;`O?0s`HSvFzWOWlwXU`5$IsWVdw*Az3u#p{uDxRIxOZiy z%G99wVS9~dd`Wu#F6gYMf3a|smPvi{_57mR?pgB}Kg(BcdB0HjzWQ~(H(yNc8(P;r zb8gx7oatNeXT7Ytt0wOPz5ed4JX>?(;aAH$%l$3)O#S%VPc;f)3ZER>89pbpaoK)tOhb^6z5W{>$su)xBH(He1%r z*j;mD_g|KLdEI+<&+dyI4Bu$yD3&-;V$GzZHx#@tsCje#T3O>dMLct9QEBTd`?Yd& zkEXwTdc3&8C`5h#n#1A66hpk^0FkS7En6E=|wz%HHY83r!aIt$U!c zi*0s_?yQ}+Qf0TDt}5|X<}1jv)0th+@|y2v4~P3R&dfuSey7$?6}xl%s~P9Rx^pM_ zJ*DNIrqqO486N)1db8{EoSyw^w?EE#bD-Q(Xum@E!{#RZ{%udF%op(mt0UG>2I*4nkXmYlCrJ^iL_J?AC6 z@^o=gWVYY60@H8XKkZui*E7@VocHNMyR9FW1<&6mzx;m`v*pfLf@?VJ6|d`vZ`;$m z)@R0?H{a%%wLEOPT$cHN+TWPHD<(3>m?zI{*%W4<&0cv;J-tAE3TF6;6u6-?W| z-L5(Q`_{RW7a!u=(qmrERn~qjZ2HUc*DF;LJSUmmaV=l^^X+8E#VHq6f|u-d>RZ@l zea${J)ZMeZ;9^PD9o5T{MT>e?-uwQ*Nv-|JxnD8gYy$e9Ep&UTFzcj0hdC>|Yr*+IhAdtYEi-d{xB8uFf-RD6TdwY! zpcXEECO6tjb>WO10phnMgm@=RU%KghHb>hAo3cMol$_%ic4}L;eQV}-k}H0BgQr~g z?Edq6zpK9QkvHmD%IzC_;otML`-WSddAHA5Cnj?+e(L$IJJs2uv3U>Vc6I*kINcm{ zb2I0q+4FQw+-7z!5|0)9GO_vB8Xei|SKf#=G?uyCK6oKNLBN?OcUo?7e7ni?JgH#U zrKQz(pzebN<%~?Ta?+7&^ul;)LPxbFk z5YN4y8ELYi?RTS!Zumd_U-wN!uV$US7^}E*xy;)YIr_3I%cdT#?N7O~Eja&v!Sv`V z`FkZT%JRlMf0k|$xuLdA!YOm9IFsYzssE~;tp@$}1UuJ5OcgWICKw$)d^_>7N!}ek?~5~b%bGdgSCb1(T$$By z@l3eQ$&~#Hat{_yy|B`*Fe*3uknEGMoQusHmmdIMm16Pg=IY5z3=Flb_)@wAN=o-l zEy>77x-c)+n<-Gh_IjxKb%vA;SO0Ad5>?g%gcoa{5Jny|G=o%Kf1QD#+u7x!L86)dB+wr z9^GCfFo~Nz_21I;REb%0!|pq>s!De=ZC#VD@%6&%vqH|wjgMwtIyHwo;_Q~}mFAb9 z&FlFT8xmOjW7Dqg&?^q1WKo>H%8=e3+;hwNI- zymli`je~lhb(frfw4y<&diG}9V=~DHtD1iwYCOPHt*-s+gmS_YUyJxtPgZ8kk8Ijl z@}Vnr+t&R~C!IR0cKrYy?UnF*so3VGl!I2ueA1F9XMTV70(_nPs>{C)crr3D+(ucV zfWCA@3`=zACFdj-7x#v9R)mC${>wKy>D?CoZNpZFh$AO?44S-hnKKr!T=H|`(v-;X zj!TPE<4?PH#5|v4i^uA1rPs6We&3ZC%RQ+xS7hz((zQ|FYvZ%-mgoLGUwc?b(Zjyt z{XNU~bBg~LpQ}H=cjy0!)#n$;Wlzam;Fp+YRHtP(o%1);s$}+a?DCAdeX1zyYU*V!Z6Qm2+3jv?o@|hn_qjE*B5G0Lq@||YZ|jAo zM_65pyDfdHGSYhK29rrMjAU=8+`G5UU2#jOyP@*K9cBKC)*02c*AkAIZDinUtU2}iW;Cj6oYA_zxqrRf+ubo)5|w3s9L)(QQutavfNDp)X!q>@k zH}-NBpZavpC(k5N_N=JHleE}%y^l(YCEnghS;QPIGE1_2!Qn}v8x<#%Mz5Q?%~tlm zXvM6?+^w&7?Q@N*P}`R5KH>1)Bd2|ZUcM5VefmP?qt1#+0gt_y@1|e8dMrC3ed}%Q zIcwfNnWnE&)77kpuz^{cntVqPY>8|LK+_)vVtM+(i@_XO>e)FUnsk6D+P94z0-Gds7~&-9POisFAZ!urR&o91mXR}hVkn9lN9NmySv zs@3S5fM+Rtp81EaS67+M)#8?FzGS_#n|Zy-$EZTh)9)|zh~%#~{K$53_4i`sMPI9g z^RF$DJ@d0pPkWL1%nI#$$7KDtSI^mVSoYvm<=;)bCCfX@AF;?zI9)U=L&8t*p10DE zCC$01w`UiM-%EUOSEWugw9lyhrrMtHg+)nQo=rO0l+zV0@^*<~L4GFVBDbO3iM?$BnTZeZgv766yQgm_)TJSDfEGsch*@ zUnc!THG{Myu{7?l?+rgD)-1X5@aFgC%Zm=JU47@yiruEkPd}H%%@-3+`e4`^wrcKs z2@&^@e-?IG4}?>`UU}zJ!!WaT`{!0DpgxJ{?K&heWzwsI$quO-|3@WgTB-ct@9^Vu9HyP*T=4XyeLjS zCfG!}@UyA#{X^TEkKKB>l=}^HdZA8#41?Q*dHJ(`$Zgsx_hr+kkGs|CG^#6?rKcCS zYpXB$_k+3f??HpQE_vx6lAaNqZr6QhwRXmHB>R4wv1#Lte>P{Lm8>sJ-WV|J(R$Ha z=i|?uip@M_J=^5&{i`wFtKQWXh5e07yqf$`kF%14zx(9;FPVjQ!YBQ^zRP(gd(B>Z zK;HL{Xg&9>mrr)T-uZS*nDg!*?EjJ;%%9x9`xC3rD&LI%2kUPx@#y8Vy!gz2-}+q5 z4b?kmN&V;3zOXdt&Wfv6vdxwArSJ2H_=f7sEwy}i$#mJuRmLI7yq4On=|v%v4=wHA z85R1yhBMeyqgl7KeBA@pw|?$XueKaWTHA2MXw$-Z{>)N=>gJ&h%KgQ*pZHe0&pTc9 zWaS$7Z5n;PTV^-!tl9qII@_t&7U#OfHfmH!P5%%XbmWtglIt4Vllo^&?_b_2C*aCq zcx&yl64`6hYjmES&{^d8=Dpr*ldOkUyPnIgTCyvEdEv2>o>|hGYG=K(z8A^{o_0&m z*Lb9Pk#o!U{>Lj_b9&DOZU0;^7^{9^PRFrhg;!asez`_%&yoobE|I$aq0%aJ(MF|p zQ>TlnZb=b*x%Z;NzJy0}=E_Vu>B;*fNhi^ne?jaz;T^5#%?`auVcMRoxog8Dsn-|J z%3f$*d!tkK#nG#Ow)5|v@FZ2gIXj|=?GJ>Femrf5I?Ja=_c&Hj?JnR{v))`#J8hXIjhG?l?3}fv11ziDXNzlqZSP z9&tQ%k6a-gIVZWLKE}SfP}tex-08Q4Y(>VlIeP6E!ye@nm&ojY^m+Elkol*(wiiLb@OhC-8Eac-h5^FZu$+0!}AU}|9$dE{@8>kHLYj<+q9`JEh)(VJNFU0%b)dz z7LHDG3x5RKhAP_54dDH|@x_iTxx)*iJYIk8i*xYc_FUuIQo(t@`{(f|LSi|ZW*e2? zB-oX0KFT*?o~E7G%e)24{_=z7za$IXts6KP81hhV-$UQ#gnH?30BGqeqzPl{cQEUa zgFx+Mm&L2ilzuSY+j8L@`<5?CUjkfMKs&-VnZ$Vq zd-nHV?SF-1vTd45PGKVJt+J7ySCl%IZ(h5l|Ju!8ofFO+j@q`NZ~EEjb61Z&QT=|=)xC4R zo#Wbm-_Q@6bzN5+x?Y{HGSlJQL3f>JQ5lD4`&<-k`@`s{y7l_RC)eJxHWy2LV-a1{ z&{@(Vy;3>lKPXhvR3DmLW?*1o$J??)Jw_)Wu_!S&wIsC&aft@fs^IKdQ)>l65*9e- z+KM}RG%5&6fK~SrS9^!a*UY_#CuAP6Js6PF8Wh9N9y{^Qr#uy#9T7{SKgwizZB5(zcu~WiX4ST! zTgHzzz2C0x)y?SqPG`zOyYvm&%d+>`PW%=3!r()I%gLoLPsv>iQ0jKnnd;Zp*f;sr zM((yyw(YX~lO1AOCw?@V|Leq_BM(fMig+qN^5Sfby>!Fi^fIk(8CS@8y4UK!=jk%J zUYFUV|7&l))04IjMOx;IYLg64{cH|jb79>dQ9n-$*PAou@7+ApDC7LfV@(UABGgk7 zl~s3cz8CVB2^2S-tKX>yF)}bbMv0pQv?GpC?~6pl4eH9^qfy)yAy>El`##h2nTm|Z z904bVJ;EHEk^-7ZN*e1EN+jfjCp4J(O`4pdFq6|*SV2RhtKTlKd;8k;udaqo`F5>p zah&j!MPb@s|6aRxeCzhC+tsyKs!p#B68!ak^LZZQnTj8_&X0fi`}vtSo4?)4{#(6v z>-A@kS1R+{v9Pal*~vZ2!L#^t+e_ax1(CV?Yy>z%3b;|LPa7=*y5l^rtwPGFkqc7qI4T z59@4JugU3bX2-q6+pKpVQZyEc7UTS6EWq97%(OVyFe)-@W$uSU;C50wkSuXx>W zc`?T}J}cY2W#!E`8o9>KX(~5jqV8W#z2p(Cb=PBhRj_)%%#?G}F1<+Gr)O$@u`ej! zKG4tV)m6?#?2}tC*`?A!j3+r#+skEl;f+f{9@}e z^iqiasU8qEZ;PSVlC-Q_aZiIDdN3y&gdNB*PA)pW)|`p;>CB_vB|ZxZjEvdT8oi$d zG=2(t@P_B~dhg5A_c$HNnfm0mO`)c_n$(P@qN0m(99v6fbZ!ykMnFVxaGVNS@Fu>cb`O2%8V%K=HCOEWmUq0#6wlvlvG$H3wnfeLKZI9Xf z4(sGyoOv+7z|8+Zpx)cLjWezM(hXRYa+gb4FkkJtzC!YI;Vy^7Ww}q*7#kjM-Fc^X ziE8#)hc(toa?t_DBdb&51iVvXlm04Qe!OUJ*1YZj<6-J)w6-${XiB37I`%R@O@; zQ>(B^m25BmOcN7-we#MBPgY^Y^*d&5$?J89ZOgUTx3{_a(ea-_udUc#J&1ZMvvJuP z(+{C0Trch%WPSKfK>1eWzOcQ!C(N2<9CFnsZ=;g<#8w~I8x8BUe7gJ0W-IV(Z&RPV zp-;io)j0do#>P^u$(~kLl_@h8zVkCq;$6d6QZhSG{7{)^@I3wODE~_(IVoCeKFxg| zUAFK10k;iWy}^Gjta&*zY~4vmb0xi;uKW)lSxR#fdu6V;_V3-)x0cCyZ+G@<>DSXu z*R6>z^4r_Ew&T=Ny=xoiwx4=X6}0Ttj-Fd<)))EgGcK5UX`A!$bHZ8D24A&e)-F1f z6qIo4f#K2_TfI+AW!u-6zac=4t2{*Q(UsEX=}*^7{t(-Dw)V*um!#9mGd8y`Ki4NO zef?2<%#ZMEZy#%#eTc2;-+fn1zvggopZsmXl`pK>@(%R+q!lNZFHp8x;BxG5^z82U zkE_J<{5n@x*axiOatsiXdSP+xS&vV|dM@WbzP*jNKQKStDC51(HaRHU|5f(uD?3cZ zcLzQ?B)if!Y}JxR+fM>=r$qnU^@)BhGd<^i=7akmg&P&W-8yyY)0f9OXL(M4iuogA zU-mFBE&I~zT>&~mePt6@8EjrUUDV{U_f5{D{ITNidgW_ZdUNyylq{1MvRt*`&+@*y zNP$`A6>C<`dvZ_De&^c>)%x9!n~fNZrX9Ll;h>wbHKT4`dgs>_Igc86eZ*H4K74rP z)qK6fM};LPE~@*(@HNwRZe!w!$<_Z>H2%J_JznC6>L-clvJ7{2ze!H)JT|JWU7A}i zz2V6>GWN91d~kDzmiB!kPTS-MtePgVWs<$RY1!q$!Tx7*(pG0~KV6iSoV;x3dFhJC zbGom2Se%)E-|aDuGx{)Vj$zoXJsNu~uSoD5HR|4%^`KNUO35|6R5t#@b+&txnm(JI zoV0Di+4$KvlOi`C&APF+&USC?`6aJ>W%nmm_5`n2QvVxsM!-_Cii7#|hM26{;|>nB z)#ne$Z&zvZjoovkgcYR~Oj_amq>%K+&rGGq2Z)&-e{F(ph zY!@r@POaPj);!j?(YSu{_9XYa(`-I%d$Mu+edVJ!1!|9pIUVch+s~D9bV{G1*YW38 zeFnEhl}}#pk&6AWHTYP&p2<~XJfC>9zj2}0P0d{r=YB8V`d%*kvF){U)t9!%i7QvAdh&_K_AFVrOwsLR z^u*PsGJ(A7qeXTfnNhJi@2Xh*ja7QxXRbxvjL_|KiP&|-qEcpMv!N94mcmu;JyVyi zvGnrnxY?P%{7({eXB-wV3D{=VEwc43b-%njYr zCwI%$?^O8zD?;KPosky&R?XT3){52te&afX*^5)(UUUBr&n!g3+ z7VlgiGCuiG%+K?^W3R;B0(q{#yywn5-nUocxm^6!_DxHx10Jki@#=U;wnn!8s%h^I z_q5g391VXu?{51nt?zs6bT%AcHTS6Bcc;Ej8)qDjsc~yw+{Gq(&1{DRNhOqe%>Z>+yxGk2lWSEp*gnTlM4(%u8>y7Tq~@`)Quf z;(uCqnj>Ev4)3@b)A`iVuxt8>&6Ce>ofOC}xm6-+;<*c4?I|8Vz8$>(AkMV+FmFjt zOOX$6&>DI13hlYIJ2DoWXWbJ2%Zht>^!e0?nICQ*-+myb@0{{ErDw&*n34pOGYq>5 z`1YULNY&|8jkq*U4{5RuRu`Hy_GMcinh--u-jsp=g`>R!zEc%{M1) zLSAY|?qSv&=Wb3Hnw}_J_9!W)GrPcaWB1+zr4@45h0O!PRhxZVulnWf^0{KH{p*A8 z{N!!L{HIoN%{5-Vxoh*U4X+nYy8U3<{dKF~9QHL=+HJAAe0i{l)oQt42QQj`Q@E{O z<*HwLkWb=iXL~C155+=u^RIr~&NuqzHOVJ()%9@wTc`BQ;K}Nb@^ebLgMA{m9OiOf z;H9(F*Z$4nx3xbehU@EtEQ+YRkCYC;9)Q>mv~%H_+`HTw>x^UeSNR6gVOsU?e6yFw+U@82hu#vf%>3j6-5vM#ddl{W02!MogIt_8E@A}QA-J+C7+K4R&D>B8Ir znqrT50=p}dIHz?K7tDL$s5VVld&S57AER$C51ajd=C8VGah~6IcfGr>x$D3C#lMY< ze)nhEgnh`@>d)?Ao6_B#;Vhiik+!H+$bW9b@&3z|e}0^PRLE@kM#1TcflrP~zu>1E zzH;Uh_n$o?mZV*~V}?zhdjIrE$4{SleD%o(sYlsYe!StV`K5Aqx&J<$`DGX9XLr88 zF#o;K^^412zr5`G<>l`$PtzWWHLdO2(Q9|tZ+_Y3<<>7Q$9{Rf{K(xaHm&NjK6%b- zH8MM5yE4_y=D>Mzp}EU0zmqQWy8hVqpyTQ*GEL zp{_6%Uun;treJB`o`WvAHhx#t61RnQ{fv?{oT=eH*G%;E7Opkdv27O6)*S@nP4r=@zZg|+<=j(E6ny{=N$$rD10`qosOJY}?L)0~_&3SmND zQ&L4EBYnfpscUDSJk^@=bal$oiEFk@nrOCY?ydh5c4X{Lir=DVv9mZVb_>^$3qN8P zy|@wEv{=3PYFBt@skz6ltjxr!o31%3i@un+c`XMV^C_HiMx7;;X%LK0nz5dO~KYyF8&HpEU2X?eqO4^>;Y-=;IIPRWGa39ZG zHmg$QLg7MV+1;%>rk=a&_B?NS@$Q#5WRJ`($>X2QN@+MDG*SI&1hA9?O`z@}1u&x43TOe%G}(sbqcme2vT%Z-gKJK6<2mZJ1$q z?|+rmlP!9GFMH(r@Ar(a>lVdNk3KTkEvmssZ@#ME+j!>ltZExub=E(kEW2stixFrmkYZDHr~q0j?UKJRioRUzRhh-nj^y}4u$#IrANx5d|GGZzu0oqwByBU=8FL? zDRb|d%uq}-d-lk3&-DjinU-xUmq)+mvNR3&pn-`|co?3Fp zVC|w$`z;Q6`xuLc21!~tuPsi#8}})=)icy5xa}^tJX`X`3}>UT{sR^_Cz@TDTXJZ< z-|@NMgr|g?Om9eYvbeoZSoS8{#tj^yi!&7Gaz!UMw{@34GqHY`cP4Fps!6T%0=&y3uG|qBey?YfeeWJ30WWSubH}!~ib$0EV#l~W-tGd(z zW=@D$x1urZ(9O429@1s3YyAv4l(cVee0}@z#yr`YsnV&pxh6}^^kQ>7vFUrwvL>#L znZ|23UM*Twb%$ZANv7hRB`;*G#6L0IUdJ`9Lb~zUsug$cyjc2m%ef`IKSkYy14`uP z_A^W@nd+ju=Ej|j?%jsot601A1WfuDcrpsMoc+sj_OnRtLWavLVg$DsMKyGbw0em2 zzCN|!{!T5E)n;6?uJD~sNiwn)>TW%{D<$Xd9DVO87%;q!`^OxQmBEIcD*5@$$ zs)We9_=W3ltz4YV5;HkC(nO%LSiSbGWTI_*SCw; zXSy}L*%_vEO_bm1-^=EoXV_fVrkrgno_*kj^cT~~`#Qgzne2F`#6CFC^&Q*Ae`UM; zFVWI7B{RPP@wO=^8_IFesZGZjfnwhrTcBiBS!^elas*Ja}%UErj9${OT5@WbKTB-&n4e6^+JpsM;uSjv=p5@Qdh@LTICZ{RD(=W4h)al4f6!)+M~ zH$~Ye-*jG{+t(}^yYpnLfa-kr0HKO#iM*Q)%-VDA^s06EF8kRWBp1f1zxVu$Puz-+ z+WcG>mvU^pepua5QrgPaMoMwgIydQSXCtrf2r3j5e=N~is(N{Eov%gMX1+I*60%sW zvfMvJ$R!tL<{9slHgDzQ?{DW^b-DhO`I?pMZ*R!@`s-8M=hxEL*5=3TUS{(-sBorT zpjB&$%B!cIHV2=ad}*dOedVK-HAa_qU1n3Px%PO@#$UG=*+{BNg&9kwOrO&)^!@+Q z`!BjHmYL+wOF3h^$sns;Wf!+g5JDS7*1>aZVP0_N8p5c~@D0OlZG1O zCzww_;iLY&aS<&`8e@tcW<(zU} zE2jOx zr2I=(cUDxazmc)z?)tgvY~MedZSMC1P zdf6Dwm+zliuZ*rTVfkeDZ`WNjuc!k)mySH$p5eFeMZnI<`pba=*i74mPmOc9>#luYP#Jem|B%fg+p>c;`ZBKGb}!-tN@@LK| zOM8A?T;y1+dMo*EQ>n*CLAxyLO&3qDn3N+rXU?QO6+R!gKRKl>+x=E`#iy1>%S+?j z*W`M1$o`q~$ZqbhLTlHu4~9q2pR{|pF)Fr!b!@sD#GJD!~6 zEQy>^7WwsUhso;wXLu%O&D8h!$5-2pJR8;ZkY+IwByJ5uImgRy4e5iJNG2- z;&Uw6VF%LGV!pjbxC>_vn*Jf?Qc<(^&fYuh{dVpCO7j`4?DVEHDUM63$RbTbIvY{ znfq7c=b5Y8ADI0xpZISr_mgFYN3QjDox8-|WVopQ@S%U2R!e=i>8Mw(Y}nl{6K=&`(DK&1dTNHp|Hk`Ig#-4itbe7l^Kt;99FG#^Ykf_9#*F-hr@VCdpP>n_|l+eOz}Y@W_+( z62I6cw#R4-P18=E*0Pp8aW>C^`*Dv&l9y$M7@U>*B^SIrcfXNPhPTGy^dD~zu`v~8 zuK8D>bR(`o;Hulw%mv5oo;sge+q3gf;J%%vF3y|wyTx=W>{_*`aDxAb!}o;#v3ve! z51Hbayvi_Mvb*Q<8#UGA?VPzw7QWa2$#;F8Rj6e5W%rJC(ubJV{*6i24E||gwq3u^ zA#PER@#XltSmjfiY47g5u zx79pTIrN_6`E_sQuj?00{_i!*{AD3Ib@LOPHqn>n? z!;baG+^6<#siDVLY*|%N)V1ub>eK6!qfeF|xbD6D$LgRb)(kFN9#n`;_RgQz;bhb~ zD?`n+nQ_%D=Q7iK+&53!<;fNN<`LV9p)f1zB< zUV#nW4x&p>EsSEH#a8Ft`s$X*)+H-MpUkTH$FpM6Fb%-`Lh$EA5NI9@NJW3p6|tNHeHJ!%!%ome{=`i=hqMC z={F@=EY6?2_MNZ_QIUr=LG-FmK)C_jV5N zk5@1_*>e1-V>!+^%YE;b4msA#*+x!ZCPs5B&RO?%@!Y>oG1?OzoxklAqur?C6jME8 zUAAnn*|Ig$^L#F@HGA?cEWYcV#y)G;@82#lYgT12B%NnCaWKbq-B!_?jwgGRic6Yo zIbQ@z_&ZNbXRv2;{k7o8=8mtAJI*{`(H-ZaQzP#s)0DL>NbvY3ZpU96?LIlLR1SFc zQLf5I;i!K{(B3ao-X7nV<0-dUb*ArBNzY|TzF&lG>bpKlsaP`pc>QE?d?4>$PQT3! z`NeV13-s7mKCU&9oAdXjJgjQc<^5ITVWA1<{$RtjPb>-hj537w%$m%yo@>bu^|C)NPdp{&=r1_tAUHDYIz?R6hnCfxGLmQh?+Jn4bV1nZ0Ls}+w_aeS=epDW<;@%*Ka zO|D&aQx}=1PF-ZbBj`&yqnL=u$H}gLT1EEG*1g3Uy`?H@reLm_pTHwmf!8KImlbch zE8I$2^&~3lgm;Fh{&KY~xov-{KPlwZpD+8JDezw2_RBnnuKzQifBW86RBarw?qCG> zw$~57^=|OcHu&fJzc6C!;#;0F=gyY>{(bAM@PjW+KiPLCY+Rk?HS@JXwGrcov@nJn zTyYHyI|R<{_vjb8=M-$=u-Rb!ffg#~t(g~3THpBe`NI<93cC+64|W{jG;*Gw^tnbejwO1|yho}t^t}D6 zf1dgG^3%VUT{X+hFL~_iJofRdNpJo_t$kCUeTv(V?IFLCHF)AYkAUPU>s!LR(!DFb zI_CKmcE2}J{#cRRW&ZPsug6NIs%wQsatn^9>j%{Y{#)JLUdeqTC-;;1mk(x@Eq_~W zWj^-5d+7H+@!rL(NB;Wi)fLn8`u=GCo3VNMPOonvJ2x!nsqqv0=wr>*}g`{*_AB-Sp``#~<|OMjR}PWv!@qnz-eAoIXKLi^{O z+*_WhsStm32lvi$bJ35sC-$xnG=0A~^-pQk+3!Kx^};{P<#P}3nDKtOUtPnlAC9*U z|9)BgN8s)W{>yPa>pv)$n18>pcg`aA9n}f^YDFvOtN_W z^z~1~e^&jIyMOHdb8CZdA5YiV|8J0gCf{_czu_-e*!oBBv;VNof3W>WY2Ez#yg5hq zI~e}Zy8lq5@pvH16PbNK4DNHDzjL=_hQ$8wCXbB{d_VR0pNM_OjC=eqoHhLvr|>7+ z>^s)~eDc-)5600SD$2OS?jL(%y{Rgbd(yG~jH*ic-rTB=`jA8GQ^M7+U0rVaxZ~)G z;3NBw{*Zn3>%HN>hODpdT2Jj4uG`-_>z}#GFKdhF`%8;|yx-FK-_h}(dhYZ3=0mI{ z`xc)`TfXS(kN$T@=N^kUNMAX}c(VHLZ9n>#{V-LJ+Hgf6Jma+DzevWX;WNGmUb0iz z-l#n<(BUz!_*p})#=?8;2_mObMJ`QHl#o;tm69{~)HIQ4@#F&;B3jSR|Kx4Icr}69 zCyM*?zo>VaKmHyTu5m8Ds`!ula-5ayldhp!P_tp@HHqK{)BYbYW6N=l zV%<6EhWZ3)&&&^uyx%2`6-2Bv30wH^+(E4-7a@t(py+Sb9%^rlStdR74VJRxS^6~7 zE6ZY`+s!2r|Fi>_1qaSLkyRk|HhHJX#+ayxSv59&ryqyfTyT~#JGSLl)NcW^{_j$% zwl%xx$mMSFzBgDZk;ht;^zT3=8ONCL5r|D z4!%y_Aj-fHrh{+XR}06uFZNAWwL!1_gdIixEpwfwr~LGqQy|OMYjGNU8?V;oaFDb z+cqp|D{OlzVCug_F{B}I`;xaid95cL616+L!)9Ca8#d=%hC0E$iiJOpPCf2)OU(Ha z&td+S{}(@7FFLwmQa;aFfm5qR?-};It>t3K@==;XqNv}c82CM{yLCZ#X+PSOkmU2m3$S3^D@e*f&%snA)oWwuXM3wZLLPZ+~n+l_|V4L zC7Z3cWuIOyBWjb-@m$nZCX{XO{e$A$7E8&hMuuBS{+Q>TpL^Y~*@5Lr!OO2nQ+J6k zFYGovEZ^?CWasv}{gPx_*ZqlB&d)?9pVFF}tm^dM<;C9rFD$v1 zU-%tn$z-l{{cZk{vjuaX#muN@3tpn$YngT3=Gufq!ndxzocT6c@cl%^`CJccOLuaY zR(({L6Z5v8(DmcX2NlmXo}1)ar`oESl^%K#@5K89d~$0?fro|;69dC9W_)Q-93>3~ zCFZ54BA?oN*g(WK)BJT(`u3l?Oi2gW4hPu+;{0em;89Z z|G~Y}JXN8i@lLgW(YdobfByRSqorFpr@BC5Rp1wqZ%Z#kR%m|-xaMywB2gxH)TJdU z%gJ)$t(Naz{F7cjb+D11X*6ZIW!_QGWnU&FZol|5ydd@U=CuBW7rfXeDZbFq%|Ety zpU-<2`)PI-(_Vz_({NsSG4GqjDUHgAv=vWmlQ)T$rO%wG+}2vWbn4E80_knpE3Gd- zbCeSO$r13-B;xFGDXkPkuadM&g(;J^)Ezpw;nacMCoOuPZ0$P9eV*NJTff1N+_kB< zx?HE7-2ky>?zmpvj4P2dAdb*+NOm5+99QA9sE!B6^Bm ze&E&Ka{WISvk=>g$orqmw-vFyjbF7jVI`j#hvkhko;CMouaXB93H$D7BzrM3FxjjWI#8En_J&ti1V5Fn+pqT4vX@<>QA|r@=M*8SOIli1U3a)eE){q>Dku2fzAWT1 zxoVPixxj zx0YCzn4Q;G|GV%0+v@uL@Bi-m{OGv<+!k)eKaq}&2U@OOlijLYWioNqT>;;c7v4WN zD_)!z@<2@EzT92Ot?7q1o?G|h!4`+qY@1nLp=?XNQop<^dAcbjJ=|!a`lak%iT#UT zMi?m?Tnkyzd%66rQD&fefXqA3CEH)Vj9Be3^KDyZ$gD=KvnDA?k^h!frds445t5zL zDdo21c;>QIR~6e!-8OlfU$Q;@HDtBmYcF-)#>{;;53bqzbhUx^_f09%pCyEQRKEn2 zr+4R>xJEzP)g;8n7d?ed{}^Y6Y*my}N*`y>X_u2xd)be;xJpiUOjSQ);^SiJ_^4#@ zynEAfgd^UZ{*o*B)_vEfeU*0;6-A%TcQ%Y@d)6V>EwOfy>{;mt#dwSKy zBRSuFZ}&X8TC}iqv-!ys^~@PvnN0J(MJzgNsHk04*T$=?rc%(?t81lE zaI60Ur&U)r9M78baaCLVf)lUAZ&@@vjcLEBl@-xGrC3&EPIkLp^7Iumv<>d9d}$KX zz&-OyQ-spAIE@PrCR~|$(eiW88c*GG)8FZ*?eBkcHIMu96D83%FE>^#+8u0uM#S9p z@!cw~gQ`rb&Su%s+l=RQxiXzPc45|qTi(u6Vu_rmQ!CRXv*tcnrG3muCv1Za^R1a8 zp=%N*y6I&0%0?d5Y79L1OVszQZ}x0+lQl6{mn4c#I}yOE)x`8~;@>ATR&iXM{WG}l zq$RK7>Dy7F(*M?PPh94ELu0|FY9AHWwB8tA?#RtD)0NgdFlsy*d3UQ*|FYe@wJUa- z#PprLQ{HUj;I{I^*?Tsh^!hV)Fr8gva`u{QZ^rU@YK31*UT%?_pFQ^`M_^9q1t%$s z$;rIA4}OX4;<>o+rAGbAOM$D~ayvG@|GIkD;=(qaua*i0JK3!-EL50xxl&R{KXry` zZmuC`rHNh110R_)_n35ygO@Ml4v*BHmVDDDe&XrRJ1?uTtJr!ZuW5RB=dxaS@ZqbI z?ztN}?U*f-5Y+2Zy}a#w()I(9WjWfx@pjhFmL{gXJGk{lV1cZsM)oeniDr{l>N!m{ z5s5i}`BdSg4?IOXnxu_=W=T6WXBobH9&*R$-E+g}gZ$HRhZFl_dmBe@Lt1tWvuT1D& zu<#+nJB8mRZpoc#E7hl`o5mG?E=UcE%lrN0=w#lK-L3Bb9zJMjKWyuKIP$`h`MXVJ zT8{a3xJQ4f*thJ;&$hPerRP+FmwVoSDiHRnHux}e(0V1&{;eOms(km}4{15kk)Oo2hb>Zfq<b>s!2$fXTNW?uOaCN1~Pg2P^!yne=nhKkair z&rkju&skq6{Ha<*A?b?FlNYO%G^AqH4b)0R9`9Y+SU2bHjqbvQuMRLQo8i1}@r-*K zPI<3fV%!5txsLvM*ZOR3sYtO>|6(nh`?{vgPxGSMs{*a=$Hu{P)I{?xfSp_xB6zG~`QN)5ib0vUX-8lf(icCA>(noX zlY?64?wR|(P5$?fV>|gj@8}eJV4}BBXUY1NX+JrvzisMptJPfwoweo(u9>+jzi|K^EI7610Ov^%K$!IQu9_gwB?G~tDC?HATH_nv|Mg5i?_g8eF^JtW>%*zznfBe>z>`Yh{7%( zfnAx^+_ur%CZ91p@N{qHjz^|{o_#$TcIQN(WZE(gIcKX!5?KuK3S95p_P6Y2c%JY} z;ZEwab2krPe649-^hfNJ-MKo!_)X3_#)3@83i9ttefiG1`tKXR-DO<%lIiKQ{}xC; z)h^jR|Mt%^D+`C6%~IP7uN3W=wfRz_-TrfLj~}z3X-6?SInx%~xS)=$|V_|NZjeZaqyrvJJ* z{?6w3+y3Iu^iPI+YnkQ?)TovvPY&4Nx*|jTs0e>q*TtIc5{IR~M|6q*KB{s@Q!O~< zx{Sg0Mwj!si?@d_n(ml(z$MK=srZUhnnKQ^Umg}{ zG|upx$-4bR;3`93mVncKI~?Y;wZ}+&?n;&7##BY~MQWzL}7%aeb24>d3`RzyB$BF6}Cv{O9pn zyRP`J6aU=r|FGciU50-jws<8teiH9i-Dm`3}0UZb(u(y`o^q}?aGzD)JB zyGNEb=Z#HoPE4#h(kFY<(&m<|XY%^Aqwh{lVmjiP;cXce<&+sL-!^Z{PM@1ny?yrSboa@X z>W}Xw>|D9!uHuSfKRNpeWkF?O7p??vT<)*t-(q7eYkgLCddMc3Eyq9K6ED(L2*2)m z`|R%Tl-l1kPzfc^A%!i|#YIR^&Hz@dNW_(H%WZlm1Vb zDyN#{yJo3%S7?Ns+vbFemSIwBj)|6Be&KQI)a}NzP8;7%bLOhtd2nik`^h$&ue*;; z{?=jDoc8r=mVfZ%Z_Um(&&=?;^H4up+Rf(1x~{~wLNm^F91by~(LtbjeC^ z&GHIM{|JBWX5Iyf&jU~IeHpSKBRN65e)rzL$KR&RbGzB|&0w9-nmr%P*uupXzu!of zTe7aU^`KbJQpdF^m(D%CmLu?{FVx-Rcuy_=lg%c%$8$W>f@_@r9^3dMMZ<%R_ ziC3*Vn_Ohr+wVm((lJdxOIdD<9pgLrsCcvFn@J_7hxJa$tL%0^d6N-?+-7C(pmRyVZ1(%*doWj<}$}TN=3g$EIP4beuP%`-ty*) zi{_V@|2;F;r%>I#Ld#gGVBSH_C8i(Lc;dPXlX#{X#w8o@yQ%K<&Sop$Go3Mbjm>B8 zPz{fr6Wk^xc)!_mb@%mi{HZ~^bG9%39aEU{f$a~UsM?1ftNV|ibj(`tMf{@3l$n|T z)c%x7J5V`^?ZO zzhZw(Hn?|I>1B-rf|Mtt5VI{-(AmwFQ?~%udgm`l?dmJ@2KgW&PXw`3$<1 zD&!Zh%vh9WJ~?0RM9;33YtPQQyf<(U`+M^r#eY~?H@dmyOuxBl4sXh|)3rPJVm~l8 z@4xh+`-$;CbJaS7u6B`EJ!UG8%~k9lnI!p3+pH4RiIUTp^5^=kW1cTlM7K_E6ke=) zbj8p6Atj40i8r&Z2w!ZM_aV?mF(PAWP@R83`zrSvC(hm9+wBvV8r9k_Q6n>7Ku6Up zwOw;@Y-M9vIAb}Byzz>oF{1DDl`T#m;Xk&UhS^v!R7^geg3x&C1PN9K2rDr8D({I4$JJNjF{Is8$mRFb{X56yq=x|7$5ZaK3d zedW3N%MaG`*&AvkOkeb;r;G2h+b#CKd8=jGKAwK{YQOPmGnu2OUj()2DVqv?s-98R z`TNy`*qesl?>@6sL_U+?^gg2hrLJCg+rm|B-v3XK31`CVLFE+@7wO z-dcA^rtD5g+8UWhtJ6CkrF*Nkd#QG(I7UdNTb)if+7w}IGe!DTk7oGfiAy(~k#E?| zoUS`dv-W|WRMa$yoog)q$dv{CRJ@whIx$WE(4}t<`}p)vX(@+SBu>7X5p*g`IsBE? z-N$VD$4VYXDeImJpM1VYBm9iVYVnzWXV%ymuUXPE@!O*t1t(5g-iz4~eogwO%Iuw! z9=m_6x%4h&##6-juSp{({k_tJ0iqC9}6kPt8vCj##HXZJ!ro&z?)d6Sq3J?!0%R z?Bx<`w;D0+%0~&;yly>J-0xM_yGHEhF{QbyB`i%0(t9}E@-BGEon$>OIL-6s($;y5 zR~DOHuiSkje9O zca&FNR_pWGHz`%CavvSAsQ$m=j#h2r&R+Mq-3(WD8s$Hk5v3a?7jiYPT*7nOiGN$x zJgH-Q*T`vZpYnX}l8KHFO)eNbNO^ne*(2Y~|L>De2})|rZ>;d?I%~%~_jf>4+|kYV zLZ4e(#=iKFKEXjdd;X5pHD}qb|2h&rz0>A#uHAVyajPn69jC=ky>5Zc>o)ilEc-9| zpDDq6;`J9bwzs*~Tv$uK)vyj8AtvE1z{(XO4B&o-*wp1G~a zaxS-c$lIpVksq@e&P^>Y5qWS~X0G90>*J2^&lTR?{h5K|?_-z8dp|oI{4Hb`X#2?I zW3Kc?k@cE#^ABxe3iC@mdw9j`-tB&hWoW zcF2l&J)Cw#`j!xD&ZE+^$uCwo&G8S^65Rgz)uYe7J4E)n?D-bcas97V2YaRLv(LFM zdzw4m++uw6*yOg%z0DupH~!U`^TWjI_p*Y+D%-S|F5KN<`^%vBZ!P!It#+oZv$
_R<)-}XkC!hrhRhv z4xgM^v}2!4_J(yT$G!G3FaJ?(zP?)H_}(dxzji$A%{Ux=!nEyU!u_;+SD#I+U@RB= zusrUw&&`71H6|abG5)THoBRRLolQsg_secNIU)r4QxePX%xGtzLC%i*cyM z)72Y#9|ndbZk^8hUgaxe9Dh)2d0=b#JiDpkPpT*yY>&(k|)H|*`b7=dRh0B3VmnouQ%!Zt@*Q7Tkddkc>63T z{)C?89lPAqd|u?k%^mJ~4`yn~WlNo(^i;lDsO4w)-%7ne>(1xGU%Ayk zZavcE`6qo*-BXo)b7vguuAS(So5FQ}{t^DIQ~u6ytJjRUe|y#I=$&6I|5ok`4c~Un zyeM_`x;fFo!NGAm*KFNW|B&sgw0a{B<z^bs8rK_J?QhKf;5+L>w2kN9115Bqb@fim|4mUpJN?DG`42bmnRoE~&eQrG zpY}ibqsp&k`i6i1gW2*c{Ed9BhN>_7Sag5Ng7(5QyT7PKaR;roFJ+xMeTJCxt3OR9 zDqKaH>z`H&{fWK#ZADC7k9~IE$6Q(YN58I>_4xU;aBX^+X!6ZQDO`6_HrJ(z6)th1 z6J+-l@&)c)RJbjxd6HFJpi7FJesk4M7GICLsioJ3@y&E^%OV}uplJ_x ztVxi6o3#AH)X38sSDvg1UVh=D`e{Y!tNe#<9pH>lQO}Lr+aebqH{snYRoxh&=a*ky zn)KIXM%kj?o_D{e=fAqDarw>MNq0@c^)HuCe4~BBao?Sw;0cRsQtZT^d^7q|!}?&R zqR#7$jqI(Kzv6ot_D#MYvM5wb@OreP*}d;B8le-ex5Z^k8~n1fdYB69T>#~Qh= zn8;n2+8twga{m0+OU|qQdjH~p-0qqBS^~vE#~v;E>$Jty|8zzCp7%OgPfu!AzExQ^ z^-b6`_w(nryooZ~DHhiit#fhjkU)z4OD{T$8yQRk+|E_5Ni%th;Y3KKX`o*Ug z*S-#Y=wT7$%zoHsOO)krD+^1}Mw|1pT0*yZmwveVkmc}}rn!+1)u;DyyXKlMlCXNR zPlt`ToZhn>-q1K( zBGsedxM1Rps3e24V&0;yQLb^%Y`1GL2}vIBXyf$S{Ia1@)913$(n#YS=li24oju*~ zqa$5xveYvPwe{5CQxr_3;YyZYJ2X|0W=HY2^}l?3qv3i zj+Gw@ZIUl&Pu}sk>Pmv`AzckkqfO5*r=F~|;bHx{V)@HONwe4t`Xp{G47{>FZPLBi zfc+M(Yz6pi#7B)VWN?OYJ z@q@NtpxGB0waf&L#Uf{wJVRv;ip6rYxmUzYja%!bF1;i>MY?oT-YH3m#osM1`UdRj zTpl{$K&p%0P$j<9wVqjpw zdk7@zJX=U*L8@b3ieF+bV)D};a%JV?RkLr;nq3#y6XF&c16mpFX$Z z=jJM{su%2E7BAY}9pJ+JeO~qZImPyN`$0!Rid35w@oZJ7_~hQC{gz*BW5&wDet(z0 zhur2R{-1b$$NA^S#ElpB)T>{$n6>?wjhRxS#`(>AWZj}xRkt;}eUCrrD;00n&hxX( zM2u(Zx{yWYb9-Ej9xM*nQLw>l|D#B$Cb#95B>`?Hk4ZI8|H`v-*Z1Gtxkp+SR;W%j zxy}=&{5I;9{*+1qH#R-34>DHkUnOzNt(9=`nw=swLu2K9>x3IA1-~wua2{F9lPUiG z`pxv08f@DaPw}{=cs(jZX3`0#Upie}8k4qbS}UCq6kB7yLtn&T&4ltzNli8;iff&J zR;l^B9zT-QvUGBI&V=0mqQ_Kv0)4l~pSyWhBE|knQdoy)fby9{b!E%b_e5&Jiy~e< zyjbeb$iVOvWd;=eJV?|lw~=B7GE~$X##t?VUDP&Nx?eZ0L1MFNBZqUB*oL58$6Hz? zWOz0`KGGMfpepB`T11_p08#WO_IH))MapZhVE_*GoKSzw^Gdw|+_d z`MK&RCnf#(_44xU@9*xE-{1LtUiE#O|M%0^FOb~*L0;IG?b^~Hbz$LcPsN0ki!H0? z&z9S=X;A=UH0!r?zJhD*n^j2fFDBc{g%0pVeIDb!h`>V57^Zv&>OM*Y- zUOy+D@iFtnfn!f5y*#`wyrkMVY+-_U)ryCocrLE6PCPR2>u(wB$;;d}Xa8g?Q`!3` zIK zO#;{WS*^3Rm^^pGXXR@y$HF2wuktZp*WRM6vUw}l>x~B+EK`3sU2;fQS#>sD$4UO% z=PwJ?TYMwZAF;{By`FJi_SWt={n?*m=B+OfHoF{m@Edz`z?$wocVbFPRP&DYsvTm> z`?;TKVZtI`hWyYQebJ{HnsZt>e`J}tG(RX$nBCdY`1SO2U&Xc^$JY4f^~T&@bWGm# zg4xo$cXA)J72TQUyKB!Lt@JSe=sc@r`5C@9El(=H43^$J@#UWIDPLY*v08Un=jgh= z4f7nNUYWIC_nLLP#(%j&%k{^mYWETzEX%H3bwT-N&gM%m8P>OaGHcx{dg?@E(*Ls7 z+NoQ*?;o0O&D+AVCOLJ^WuB~J6{}lqcFfw@rwm(~4>kWQ@@1Q|uIS{EhfzQ4)U$W9 zvUwyjG_ys0@A$cwEzITD@5PH1Wt@T@#@$Iz;4S2N`qtBW{`Sj<4}O%+TD2@|rTezt zgcC>prntxcTBUKzAnk$GL7B99hnk`ua`Z`Mq_e#H^eHowxASR6oO?&7gYiQ12~+qV z^s3!+S>x0rdHMLq z{{++yXw5pbW!su~$sHTjbfU}>c3um)`G(VHmPO=znd{qcgni}Yniua z&idwB5*0DS>|;jqsa2xlha?NXCWYZd-qpEfsHwr@Ey z@n5Zo{N;nwmI!pjqIY0Xc*X+d5P;JdQ$LrWu8@v^DeZ88? z|B+^F^?J^Q499^$n!+rl+Y?aUCF5eaLHouk~a$OkeeQch}%4dZKk1V}) zd8=e=Yr~|FHwr#oW`NzxE>Q43r z9-eM_%;0vLIM17PaSDn0Q)f*)Cth}E!v-B8-s;H@8+`6E&fN9Yz5h^t)4I8nla2B? z_8(sF`)6O!ysr!*|0Enzx&<`q1AcJFrJN{=I_fo7=47;H^~-Nr2lVIt`cd35KO@C^ z{T3DG`rsSA;V0k7_nh5eKG}bxhl*Ktmc=#QZyTmYo&B@^!3~xB%nbAYOyHdNXUoH2 zJHd5_wfa`?yyadgJU=@5^NR=jH@Eao-?)_XX=ym;`W-!UeRnvh%AG6}?PZR(;Qy@d z{?4iV=AASY1JT6n27Wg(RWbf1kH+WC4n$7g%%8m;Qt{t9uP;>R& z*l(%PI(44S{qe_E^G^A&OXwSi(z^E(zQ%gDSzS2vv8*je|Jp;ol81g$iEp+BCO5cu zUYwpJ%kH(qdRvFH`#ST!^*1*+RC`JEmG;;*C#y!(7#5~5mT~&&RKz#kUhwBaRF?_`q==LY)y=$ZNMe(UyOt<+r0DkoV{bsdgT{mE#2 z!2f{bv0rk>e#UvZRUE$0FTFTNIr+m5tFv>{3w!>4X0&O2tn-pR^2_52KC!q5Pk$+0 zO1aPe;b76ebp|hl{s?zlxc|4C64P? zp8>QC=~_Z@lnpxr!#Q4jt$%rx)_+)HQD$ONPAYiD2EIBB)Ib6qmHkzDyXjfG-UUp| zyjibzayW6Zyi`0qZ~g0p?bmj1tiJjuvN7e$1^yTAuA93BT*cGQow;LaoDOLq2}D~i zVbPlR{Y9DQs}pZe1e{#wZyxl0Wz{6-sD$5+eM_{DA6qJz`S_mZUG8Jzwm(xeL^OIP z?|H~R@ltK$+^E;_hf-zcU$bU<>2^W6G08h~mmJ?Nk$cCiWp6}0iLVN4TX=0vd5*}0 z^NF4drkwc_Iqmj5mo_%0o5oA0T8eMT`go1$)}bYi&8!}rm|;iY;@7TFp;x; z9_OJ~8+jW;8F$O_IQOrcaz5(Rem?uI>6{k6Yc+Fz7D4`& z$9lf9J#S@hWc^kaRO2dT>?U^PXOUCC=kGhJ5}(g{$Q?`}@J3RyXRR zHhU(XYT-R5Vm4W=+HUsZd{Eq6^vk~jY9PHtX&|8=-G|yULx~&IrDAKrOT{Gr*ZSTn zj^bO&o4YXPNm8`;DV`sk!uPC}Z`W_G zU1E+2uiCcf`k6ofU}V00_p0;T{%?DJ^Uix~^~}l7w%DDYXL^424l%!R^p7pww%;wpWcTMW$8x`Km z2C)k3ZACISm!8-(?`7iQ6?_{naGgt^l;e|q!p%=F@>EESf$cLEJqEYE`5=V4TV`x-t_EI z&VF<-XXQVkN3|tuIU{B$6^EWlfB$mgJHNXIu`$9t<*yA{xj9ZK&J>k4yEupI*P1oo zVxLAA_WB=o(s@?1!DKVf*0PtYP9GJGSd!prl&NgED&m+@Z&Z-~p-o-dtjDURUp3!u zvOXj7YQfV_X}sY{8%?&x91Uf9ck%0z&Q%$U%swxVnOrS3ODET)^y~91X|-4Gn;X2o z%$O;%BjHO{#7xuE8`)Ni#3&o6vc`U`GPsxf!ui1^fdf(B?mm!t;4(AHGW+g}*t)fC zuM2FoeK$^ZRKBtDxaE$jT_s-POTE>lAF{0p7kDBe;kmIbY{N^@RbK)ZuGBCNS((w? z#+Re=?yK(Ig9g50;kQx}a^=hx#vXiT@hh?n-S6jY4f)d(!V8U$ zXZ|i&x;?4AwOf19UBPE(BX?eVbufAce^p^+bhO7KO$j+GYjwV9$DEvtmirxkyW_Cd z@)&R1Bg>Y_C%wG=tl@W(+_yyz2lstxww@b&IQG*UDR1t7d1>e7EEe)A&)Oj#FC;N} zLvCf%Ov_)!cMNRLAO5?;{a~HnjVZayu5=vR)zQ3S;RA-#>AO#U;gJjAlJk)heyL`% z;+o+{QPKFNlJ_KR)Y{W;^e$BR8Z%8`+UL)LoyoT|cZ%~1w@r!MHg)g&>yMpJDose^ z(+*V&p4+s3sl4n=8xy-5H!@!>=MT1@(|W3(!$+>w`LOv1-@Y5?5;QI;{Y zC;eHBe|un?E$5OrZTXpNQz!G!K0T$)re|W+zSW93e}C<3)4jHSvDCa{63>+7&WcRs z@z0c)z;pT0#lYJ!pT1?E*lO^xrz@RP`m|}kPouiwijX;J!KdD6{7_u4xN@JmdRms5 z{;|(YeO{eC#ua`?`!!`vtn@B@P>Orx)1`VmY2)3qhh@H}hwjPp{J82zu;x_%l}i^! zgj?KDZdJYPzhvcnZk;tUl}DDRTV0O6d@pg2TIgS=zK)CQh1x&1b;Wb0Y~FD;P;|f8 ziLTE-w_P zul=puEw8>VG|)Ca`K|Yua%dvk!AA@pm7i{%{4a81zl~*V(7)5ZKi5y#&yiV|-M~?( zKYR6h?)4c(bDZ|Qw>Y-DE9+O_tt;Ih_pO@6=wmuv=D6Wv&mVK1a9Z>&{G(I!^Dg(< z&_bDa2ZA-epD*`1_bNzzY3*K(dGFU~m8v~iz0>?~xzN0Z*N3vS{x)qFSM?3OdS{#1 zNt1@kxb3emHQfnb!EF&U{U`Ie3_`{cgfNzleIR8hTh;aKVHC_sTX&U zX;0f}5AK!S`pRLqDh;e6gc2M>?XUfmDW1DmW4&hCxq0(rXWi|eb~#wC-TU9AyMH-k zo%}M(?!Wa5e6z;#?~(NU?@Gtjf4Rt)G8Pw{Oi+=VCK}jGjHjglH&Q0##YMx zGA!$kQOEnw64Q=+f45~r&zTK9i9hbmawzWComJg-Vb5JX*4vXamVL-oZY&bie{X!& zBl_&~vS0J~PFe5RHG50@mi|fQlisD-y-T!vmu&YgUGLjuxdq#pm$1*g?Htk7K6A1= z$4__9e#2^iqwIKfi~b2!8<}fa9t2)8jJn+!%gOP^WHrma2s6QHyMJ$7E?-`)yJctp zV>`7oFIU@j*F1Z1dY_d0*8Oga3{Jn9!?eq8UaZl~a}kPX%%<8oTRHZndoJ%dV*I3P z-WR63_NVJACeHmV6yF@5c74yO3tXHmr)B#sZ#7Ixw#eX{-CT4-W>eeQgLdyC%8Jg| zRWxtnHw^JE+qCo8!53C0b3V%KuhjQ7Sods|NwD4?^^N8U*;x$zM%?Grw!hh-Q}*%9 zL8GZN9#lU-YVPi7f7Sh8u=nSmC9nUgzl@*q-~8A^ zW08p~JvfSLr0;va$n}3QckMi-wx##p7czamcwF$zaYMdDySf90XO4g5nH~CP$xRV0 zP4TIV81fz-YE80P*@1_3vfwyNiEN**SH|ge@X}bTc zPQTrha&{}@AEV?MJ3G(MobyUn#%)t&wME0EgX>3y5<%}D;YN4X%^_oS6O=3CzEPy5L5l0knGyP#0}hEN-q zsu}B_v~&JZUJ`e%CGyRtHAiCom=-o|oh18Yl~v#UuZ3N;0uPoxRmR>Ap2$G8|6vc>UrT2RMy zQ5wdOvBRn1l{F&eqW}FkW}YoOwb5Zmrp|@DGUshaZgDwk@p3N7b5byr(3*Afor?9z zcRp6uic7xc9lag2Hmo{&bw!A`MvlhHguN?5qt||~z508__4{>y_RaL&ByFbo?DNc< zGtJ+BzxRFb_uBX0Phb9TTP*f@1Lyz1z-0-QN`?}zO-r<;Utf|9e(x*&yJYqKfWUPM zCJW>*@gLu$yzHv{?uD`2d$urLwK2Ky=7uC|_v6dmdtG_Co_)?Wir(+HqWN7 z4K3W+q^c^y)fFIrz>RhKt};iylg!6neNOP)@r+3=V@7|MR~5(V4xwv3@1-~+mM=(} zojLPe8SCdmP3ldz7$QCuZCw3u>5f@>n|xNzTX;D2A-Ax~>UEBLyRtv$^uAQiTXXRo z&rPw@PKk17PEC%hx)7U0j*U(93nI$amgQcPLJOS(&n@4V!LcCd&K@sk>2DiWRT)K|*|uY5 zDX;ghmtB^>l7dd3J|DMb)s5u~R;`%LT_hs1Vc9&h{IvahW=)-E$oWnDS=sWLhHKWa zmkIBhxuC$iyW-`cY?D1=>@y|8*4#Dx#dF+nlB~%o&B@23QWW^#9b>4|51sPp=spgF^eo+b+G%Jobk*Cz5$rm)#?QbG*CLtgfw5kGU;*bwZQp>zkRcUmq%- z@#*8&)gJ!Syg$4zI+GG3zqS3Y0$bqfgU2T1Uzx5I5i77(Kl`fgUiDe9_+RW$3u<(nCgzrt<6^vhIH^YOO+jk42tQ@BH$2(&6S$Ul>K@li1I0 zdzr)c$nW51!I~-7lAkx--!kdjiIV!*IEIrGB;~cQeYkM9d3VU2({=NMzD_l{qyKrW z&FoF?F0bu)Becxx7X6Lg+-uZ`?XBy^y znV96|t!meutR<)U<*oF^50w|^yr1z`GyIC(@u9wAHD=(VUW<29T!-AW7#@SW3ohpAc*q6#*FA#g4(a?MD<(uP4w`5$GJ)I=n zHZOCOzN&3|INCj*1Xlw{qL>RklV~D^pf| z_E(VF_v|gV^CPuf){i3lRy}$>SvQKu;jp<)#~a7SPg~m3Kj;LTJz4#t^Pr!*zr^L; zPk83`==otXA4^`p|Xsdiy5AHt3HAC@Z1EZx$3U2a$A@l+d^90zmLxIW#=@T-4BD;hoccrA14Th8xmA);+hTW|W6-wu`*ME8C*Sk?N%U$Ey zw^P6K_Dv1G_DFZfG@+mSVjihos^EM3Nb|o%Zdzmb?c0%W7q2)Z8*^;k$?CZagg<7v zJI(ExbMwWkxHU4dSM2(jE%)dNRsGFWDVBK9?zl{I@?l@WpXVz0&IZW!RygcY+GE(h z-Oa`z?!~>=7I|~M*7$2Qd(QF6+ROf2FRonpk}XS>esHmT^_#kRpX42s<&N0Bn_wlE zbW6VN=-G8b+aJFD>2Pk+A*Yj#oHB|R%8#ip`0zb;?ZsO%_tdvr7yU>mVJZ*$^-$)W z+Hv^@Uq5csct8J6iO~F)58qyt+c)>YVa-bGyN3-HKeeBScEwvGAE zKIGcB>1`@BYFq1Lx??L-|E9wJ&r*k#<{U7xY1?|o>u|*!-U_zaGr#SvU}EpsCH`FE z{NybkWNoJRrz(3Zxvrd&vhLi&-YH7EAny=r_FuYmv;R>Pwg!H^HJo{pMTG1^2D9&i#nTR zr@1_qMy$EI?S@{$?ycASFNo(P3kUU@*!(cl5srwNwrlrTgOlVXzwv+xbEw|@lGXpQzBEt*0ypb{K z0URF>y!|dA#*we2J7I}ZyDO`?#3tjA>>Zt=r=}18-Hh~hFf)N1#Of$U4L$a&Fsw=E^KIb z=Shq`)c$dTBk!!*gqtB3zl8kR<}=aJy5vP|Snj*Zrc;w_zQ0;|kHsT-o?DdJ{A&_V z#23x&vN$UhX}igJ%e(1rJEH#doZ;}6pQ!petSYzVEPsc0{!8g?YJ%4P`*!^AY>-%Y zVUNcVg(jKEY>x#_?|-lcJ-L0j+4xnjan{x!qW#@V^-uV`TYZposZP27u}pi{$~Vbh zo^uH9X9T50nYldj`b-QALM-@Fq9oRoSPV&ZXTyKSi#(V7&!=;4)4s5f4yk~PA)9p` zsAc)^BxE}j@~+`xS#|9~VtI_)^vGSCxo0fvUAE1)YKeQ*%DtCP&+{}%Jah5JmrcEU zZ-4Q6|Lyxf&fNXy&uo%mntK1&&GUPV-=Fy{^Zxr!yYrvlZLQy5z`8W!h<)jljEIRI zb2|8Dw7qqy?p>40v&7fkJ>gb6-|3UG206xS6)lode!um(bY;UP=ddT6mPJnK`RqKo zZPLOiZP8XnH$$#Smt;}a^#wW`zKfAO^u`A%clz*gM`qJ)G zRVgo~oR10Lr9JbB#Jbm41v0+A(SN%k$9SH+l)>hEL9DU|i#{|TDq3?vVAGsfWQ zruSwn-P<rDeECoL$#?J?A8Dz$ zd_BNbJ;~~k&yLr;8ZrkQd8eKexoT*gp61SzrO$mlsdR7m#ooVGCoXOMJUi%xt9wRoQ%}g-+*6`-t;AdZuKkLE#zyQ%vef+)2sYleonC zvLhy)NZ-6{?(5}o#Xikq+UaZ9MB5UIKX;ZKd#0w%{qbXQ-v0xIhg?k$d%UjDHrx?- znTxMu<-9F(9&RZNYJR!ceDT{eb6Y3NCMS9pi0FhY4&YhsT;OccDJaYD<65S~@sz{! zeZ_3~7jk7=cU(_h#dY%4*PWf$eYsL2R9?$ZGE0uO%-SfYpm@L2_zaKGCWnt-A7=8L z?<@}vI{A5%FhBc8xnD2D54eAfyVU5nCGFBr#kS<^AHOuNoLzcN{L`mrg01`y4D&qh zYTRykBh|B%&q!-*i+d(e*Q7n z{RzI8pI5|wKXFLton~wL(U7M)d{&Ph8gotmC{w%8@?d4!HBqa%IoCof1n+;E&J}8M zho}V|dl!7j)%@(ZzQM5W)2A+;twuSMrv0wvJ+HH4|FM7iQg6PC%saxrl>KO$ z=j6D~@1e)GMQ$oten>mu(zJD+1?w_1X3lO4?mG8|{qC-~*2|0h4xbmP>x|C~n6#~E z$`r4M-;XZJ`DlB$PIUi;kJ6Lg?7Fn*gY}<#{TofhnPfC-eDwZKIOS9-ls(OlCZ= z+U1qpe6J^K-rkKguN3DIb1sZIbkjQ~^w{s0CpNDr2(0Au{DvNdzf4Mzd**Ymj5A@;&7-@Y6#m>DyJvmUnWOA`Z@Q;Un=_*}B<-x8-OID*{ASOc zKjZA3RO_D`#8(SGmhY_H!TjBb-@0HzuIJ(9A0rOVH~A}=mb==nUsrfRnOTP3ya^Ax znKY8?7Jhh{J#iA#6}^3ynT5iU9BtoB!t-CVboJ(aKQ?{O$JG2kedcx7kMjRIHzmXLYxuk$=T}dj zm-AuMBaY*XBf9F|uX@7xKJQ+1#nwX~_GD;PT=bSd!ku`o^Yaajb0;42h;ZeDt*iHMJf6Dq$Z|c5of{Xcg(qEj+4ybgtQjrXzcrvg%|i1$Eo?9;-jDC2vt5pW7>5emlUbBiv;g z#@Z3_d1gbHXogD6|5+w`TK$?9MtMEg_MCRrr_*#rqTRaG16g~s*-!gRzkj>u5lh73 z`+E<4?*9*7G%0pcci#ne28NRY$jt)unP=G2y!6sceaE7r#7dXU#GL$e_=^6oCMV{6^}GDu1f9KMGM{fQeUd10#sBjOgB<%0oZo+hR3|A- z`Sxy!l-uQN6YMhujYXDg=CubZg&x>&`Nco&9Y$XxH=m!7>F#_m;FXtZ-m%4v9r-^M zMD%2IF0HMYHY;fHbiX~>RY^TE}FCT{)2r12RAreG;Gi5-01Yw;G%uJGvEgMvu8D|^ZlJ#U>En8XMGU4%& zzQ@|^c0$iLD2C6TamSElt;dujxtCjxcvd~hDmHPyt&&^y?A63Ae*5#&%C>5APV)c% zBeU$@pSt(8_y5*aeO&5a$7Woxc8*zq;*9w|a^7EfEj!oVTw}WF?#4@b^BcYDEV5*` z`>7Ni_FJaEQTvC&ilRRGyYF~7)@A7bzLz`yLzJxb+$^y(kLJbRZnHUmHb#Gi?tO_1 zr^`(Xr|)BRin`O2p1x;q*fB934g0l6O!(bPcmFS{eaS6(_TlNi$2R*fpIUOMENsK7 zS}D=+ZBz4={hQTyyR+q9_4WU9BTQ}jjk$&G#=4o>(>E9239(GDlyvl+n9hFRbA3TS z=M#mUJn3r>I!@hv;=b_{%a;xx{ykte4_CkIlh*!xo4}t>Rq=;gOy8*Huui!#>x+!} zJ^gOt(~B}PtBp5kmHb%3D;#0H&OC5EQ}2|?(j~=ZB86)V zFL-3SvUUYtO0TY)5)*pAV5Nnjp>XKcDf`YbyxmanD_8B>>I#I-icyH|Xiit>hz@2y0jCs3X*gBUA zX@Bv>Dh2P#%q?By;zX=3rYw?`JtNAcdx7=ztJ68JE{1g;3XjiGFO$A;`o^qHXU%g0 z_jTS5T`E=denBmJ8(WBCYprzZrFP-SJsF#n58Id}DlCe-lm6hqlSP7WIv@F!-imGV zXpCp^_T97Sfz45o*4D#pRT4%^b+&zbvS-cIFHOa%3o>TEawySi+Q<1!!e$8^ZrrTa_h`nl_qA&8 z*iZY1gz|PRniMa4u({`fUeO!#j{Bk7m z?`lu~Ww7K27=K>jWXQaFuVIt=iz@=Hjmx=GT~oI%yZf+7cV0+z$z#6MuW7>hM{ifG zSwGovdcnWHvOf7mgWm8l=ExFlBeRdtqgV*7g~?&n+Bg;*9({3(5qRn5zDz41rS zp3STof*Y&XF5Gf`QX1p?6yr@z?*by1xJXwy$cDaxGKdSo}=nChZ z@_PNRd6#{keb<9xo*%NB$5(F-Nt!#=Z?~uRg%69;cF4Uh+q31qfnEM1*BVU?%hZ=U zR_Lf5=E&!BsJ(ckeWOq87tyY=qPfTa^p#&Y!gOU7=l`I~KQDaQ8h;_>!R#XzcLfgE z{A^=;wEe@|1B}1t`gA!~NwQCQ|G~9Jygv6qzSr-B4JVI$-&!8}?AP7I(0|ox|HSH# zze&&8mYTuXcIuDQlGhs>Zmfy??ksG7%s<2S-QD*~_SD5cHT!zJ-{+6Wf0uokyQhD3 zzP0M3{ttKN|505E38|0nmp(tU=JNITFSpejf8ZW#v}JI;u#(SPPLceW2-X8hV>qf)DktL9gB?k%n3jeCCmL22Si z)1x1DA760FGksBzZfKhe_sX!o10t7?pE%^KV|03orP1_bQasxtPA1=dWBBdJ1QSoj zuOGcu8m87Q^kS7=9h|gGXNv2VQwye^y&3yA@7nGoB9}y`YA?MuVKtW@*S=Sr!iHzk zB~B*=PdoYPfMv^5-lxklgWrbn-wp{0I}zk;@oMJM<`s(ChZ7fv{MxoKu1{Mq()aV0 zrI*X*PhICN`fSSVS0z_&icHN;>D4TJXcNA)IIFEU>21j@A4S$Tv!^;YYrekXCU~BA zpXSF~D`L*y)AOBtd*%8rP3b3WQCoL!-dtNAZT{WoiSzc?%la+llrt8uF@KWUv*6K& zE2mZ-INLX)X!87I+ikWIQ_pTXIYGD8K|3+=gziHN5e0s?wPEJg36-j5yYs#sFe6QKB@-9`^t-cU;EKSkcH*h+Lf@XCT~E!N-#rk0RP@{Drha*w^X&V-!>+{7%TF+kOHv9m%6wj=z5es! ztXWZaZ2s1q%y}Vovf}Ty=PK$u3KZ@d*iJtkzszUNv8iu3KXq}&`3l=#pS?rr$Gj{1 zE~jujKb2kAe_J`&LuP-S&uYou3)*uIeyS4}-nPD?_N33E@4KIQ$B1=C#z^w0-G8?x z_x(rx=B*C{4l|{ybEQ-nYOi6`kv4sL$5(RFW7UN#)thbwr35XRe3~=yP|pTsKf%OP z+E4c_U@Q9}{&1&a|D#X~t@YEYd3Vn5w3)j7)=Se{U)1hgnUy+=r8iFQ0z+NL_lv*o zORih{DXRBowr}Mbd7~SP|B2e}3!Imh{NT%6-&Q`1ASx zn|!qIeAK_B3&H0?Yj$_$YpqwCcl?v_igz9BWe=OC{}f%Zq<5gatO*^MyYwZhVgSZ5z1@0?5m~xd){}sRJu%JBX-@(8);a+b7 z7)t8jytC<>a_YYPiTF-a*Po|<@a_0xeWH~AX}ah6g>uSA3gn-vET5V^{p8lELa%wB z+}ilhv*@k&$=Z&3`DaxvMe?eD4Nuk1DVo1XCeFfnr+;fvzVhnE?i-#vB~Qu99Bl|n z`p#0ser%$0rAGh69};m#zdF1zt+Wx^w@2?=)xIf*q&O0`8mOJR`;lkm`J%Z>Yc4O@ z&&*q)o_Az-f%d)jvOV()-svB*7Cm%%ho$5ZUyk=nf|B~#Klt@M_MCKI&)27 zJ+=o{Oi3?gof5P_U0>Av{N$=>uVotR=6w0gVs&cAN#i`bqdO`a56I0Hd-2j}!Sbm> z)$R;mN+d5_FZ|oMPAOpNp784-3zqA%eocDJX89$`^jE5}Zt{VO z>3og%WSMdmPCwUM)aP(s;3B)*$2mbs@+udCHlAlq5;tDOm9+j7_l@r!f9kD;xjV7ucN{-<<%RL*A0ajKuAK3G`q62RQUCd4 z$@R02i$9XuU0E};-(FiwCS;r28f`7<^w_q5#FcJSH@KbF(Gd_1Kb501U24rlOOF#a zITNDh{V4w9%8{&jk+V&B2- z`%gW#?ydaO@cO;A)X(qo*XA9!mwz~azU;%>`ad7re|>x1eZ@SvKlhCzF4Xy@>8EZv6Mb)-`|YyZq5!_a=dpF(p{&nDWsf9O-&1#g zl4lvSP19|oluu|6pJkERoz&R2tCv~BY^Ntr<%;P17j9$nA~9=;PhMYtr>ywfo<*_l zTUa};C0|^n9u;_O>34@e2VBog5kL0ig~mCppO$hy{^ur&-Z)Zo=h5>gRgxU3wbM3z zc`f|$*q%F+r$5}YC(B3f&wtNYYp>(_utkA-_E=2AYeOt%C16R z>8K#5+gn=O9>hcyS93dQvARrT^=RFfKS%ZMgLSIab1%t1lI`?9$}E4tT`_I0SEp9< z+Pib-&NNQf`}W@6zJ6hcY=syX&uzyK7p0e6y4{^z_s!>%fz%a#x5Lks7k=?x_iJH? z?iqtA?KMaCPFUUeeVMsP<2HlS0jIb838_BBuxGEsX^)>q7o9q1B!RD zQc17&bT4^sUFJ5|c?<7%{cskU-(h!n+3V**DK|@JyYm?T4vZJLGTm#BpMRB7-SO&$ z1sghyT;(}xC6*RC=v}|NtbS+Px?WYCh=^q@#?h-%U!-0<&c~;7W~xI5yLmwBjK_`& zlh!Qhn;m_5#?#5u=XgD;{AzO5D#&F^mne5O&uL2qcGDc6ru*p?Q{?~re`}!fnlH~+ z{nr7F?J`%EbIM6QHS2x8F(k-7amByI)0EkHO(eV4b;h-vPUx5Z<+b~hPLB+u>2_*4f#%&?)?J7)db@Np%V!afO@{uvowt84(Z8_s^1r_9wd+^R zdHgK>jP%OdzO$X*zPVIC=Vp{xcWIv!%K|O&4Q`*TuEsmFOE1ZO@Q&5>anqr^zYeRf z{%bqMlAk_JYiXG3%DGFgFT8&&LSpag8?67pLp0$E_rsqsGBEg}9OsLkbYzf{j#E)$ zUUCNJ7!8x7i0$L7XWO2+r^>U4N@N5?D|`)LNo8&Nl62$q4!+k{tfY4@es=!V$`=de zFZ6f4({U2yJ+t@wnK{MJ@BI8z^}nIDHYa6b(u#_Ei(mIIsg^8!%DYa5-)Vo<6xUga zpBwvko>spln!IpJwSK7moR}{^CyNO>*G+nmCU7k1Cr|X&Z~L3FgXdq{&GRzthB!~_ zwvb0DQct zt7fj-c`oE-lfGvnX;7J;9N zF(i+mgHXntW2x(qLw%u`oy2#<16Gw_d%~eQkHy^tdgoUTRrdSM#oKx%)Qn`@L)L*6zN$ zJGXrM?Y!@ozWqICX*^T1Y3bR|e?HIuJoo?qch}Y9|NqoZ4`>Vhw5K(*sdD3ug&zMm z2;ZF1rIy4zdrpSU&HRNi2Hz9D6qKk;vU{ZROF4QEf0Nep4+p0mE>qfUIqOCDZOwyS zeJcZW^7ZYmYs@&gI@*jc-RR^Ise^y|l>W%=`4PhG|8jQwM$4He1nzIkIHY#_=yp+w z=T95t%Hywz>=Ou7jjvj?vd&t0MVaNht&2NLQrt~0=6_E6nQ+CEBkg(X%O}*?Cw7V?1muJK_>^>^NTPXAuCoPFh@RN0du^(s~(y}UOj-kTxY|K&EP_0uCt zbIZ~cZeCB*PD)*otugJ*ViWGJrI~(w-_*?2+`okA%=FljGU@D;bk7sEVx4j)U2;Nm zmuOBaoWvP^ws)(wrpxB;b*m10-iU5zuYMcizr{RHTE~%h=IdR40b;A}N;W(YYEF$f zx0!ieZIoNmw+Tv%E9_=km5ha$(9X zz6Eky#bWtFD;bOanM@X&S<=P2@RsJ?LkFB(RbR%ZCFZWou1e?83!i1Yu1v`9*(?UB z4eOZRi-bJcARWV+b;axU%(WLCKUwb&xbV)W>qLyEdBWb-Y?gyIn@vsx7&+>OCv-Xn z^ZEAMPU2i3`F_&|&kZXktXy`lL`}3e)#jFKl9@zE)uAn63u-4FY~#9MXFTg=VA-5I zFMBm@{x=1QR_@CeIN;;D>*}Gh`QINYGv)+O{qo`Q%?jNMwa=cj-kag`_2$aH7Z;xx zsP2(_%~RIw7~r|mc11#AqjlAWa~Vpv&RYbi-s_Ooxf8PHh)bJc>T({d3oFlUIj_*= z$F{2LmFwE3@8Jvl4ff8KVCUg$hzk;XtGr@cL()B!URJj^uWU1p8`;(F`g<_x4R6=o zl?N8Ani)P-^l_$cU}JPf$b4?@mvbg-uf10B$-_@v^Xkzo7m=$Q4s!H;imE@i^x4m2 znx8bku25#vy|=Vn`pl<{dvT55pJbXvROt84UVd|0(JwQ%-^D5Kk63ZPUwp}%KVbE% zOh2W`d=K(c-`U;qfBW_GXAa}=YSo3`rD_!TZC6eBE?wiHXlzoi8qD=;!NK;A9cos$ zU&^0&@zj^A{>Fpkcd6+bx6Bt!=#Q#cV=(Qua7p(Twg->*$YnjBKkGqY&7lXHHojVY z)lSCwCzrY%{l4U2amBoQuC~vD9vuoYKd#{JDBx&#T_L^khAUeRhGO*s4&w{D)KIxzaE4Jy_CqK|}S^4-<*Q-c6ArOEuqp zQD=J@y8C3)vgv(`fPJO!EDu(C*ry_oxgM*YBv~ry*aHi?eRXZVrkuZ z8}1(QZ)N+`X`TD9chQ+S|C0=4ji;PzIe7hJ^%kbZC$(i|{j3&m?d<$3b5ynb5bvtA z8sF1eGZX$5Mzl@`$8M{r^IExEH*OTtM_tN z&uaPR{nyT{DX*I2b4S;@KJ|m`AKBMdjjov`j)8g~je{2-zjHXe|8BWem*ncRhF8g=e_*;S} zr`Cx$^^anzWtU>x?{w`wuF$bF>(KuzOa`o_>#dC4|Csap-0U~p`Y+`2;s1~R+wk9b zs`6{b^?S#dyZm>U)b;(}_@VpIgYSHjf@}9ZecAX#@YP(Y$wf2Y9gW*9|EIY46fQ@b{K8H%zwlv>5fJJZFZxn6(MO-D~l!vdL52Y+}z9Zbz9J_ zH*EXk)|eT^pP!mK$+;?P-bC)ZHP>gStd$M9z@*%L^*B>X%JRu&RacYEPADl)KOuB) zOYq8==~9K0Cgxr#Zo9Q@adYp~O(A;Qo&+77!{jZqbRL^_i|^H2HE*t}ByW5ea_Zgc zLLt*zNo`r#li0KFv~0NL%dz@zQcgDue?Abuaxw4u zs|;^GbG9d5k=dNT*Dc+@iPNlTs!3I^AEQ)$+=AU}_^!UQmEU!bHRztgYu&{A+dkRM zG@a4@Q|s?mH?vjTXVuj27Pikle=egYLU@CTWah-M^&d~BKD@dxzF9Xb%Ivh7_pQGN zY^w7NisqJFsPMYmXUuw|u1w>d+Mh26o+w1?ywv(;YtAikQ_otWD${ya7w;3Tms4`{ z${ngwW~*NJPh1gUGs|!DhFcR~pIklJGAm{Jod+)!+PBzTSv%?N#JSVnsA^Z9EPJ|a zNmqtW+Vab%^@Z1P`C2NO`Q3dzIpF(6m$U=tEH-+Y$nfdev(MT-zl+By;>;6`i=HXG zll!xI#VYUT`u=^bQ^<1qeEOo){mSiI0xjDMLe4kHnEYsq_GI zn8RwSlcQCh_KMkR-oE!L`gV4K#Pc#0_OybOloOK@e^nT=yY+Ec+d9jf%_`gb@T^3o zN~OidJ6i3!mFBOHN2>JP(L25;Y{%ufOP>F*__Vpi;hysL$RhR4XKwBYomrmQIm09^ zyGwU#_{67s*@^?!Zv18Ut*dB$wBoL-|KFK@s$07<^yQ-$7Y!;Kco)CV-rMq=!mVGI9kek@9^ONKGgwJkiPm(_su6>d-ljZgKxfW_~@7k3X+AGVO ze&S4Q&P{svVv_WN>GPLvI{BR`ye3F)^OKc_JaV5_%-M zXLxL!E1Q05>r}O8t0p-d2-+r>%8;&^vHIlwOsn;~tC#LCwkj=u{C@MFxw;#6U*7ZX zoZa!eGiTkM%X;eW&AG+%&#Sj-zl=Syef5uJCF$*(BdTPk&VBgHaL;3v{Y+1vB(Toc zdsaLl|A1)B>yu}bz3oHhnwbu{ z6*9cLj~5)(xTc{}kt!CxoBw*+#)&0Xhf0?$o*;ZAA<;7IS!V2^@&x|+??rb#ZkbQK zU;AVi|LP0=R=UBLah8$|D<=hOAbH0 zyZrYC|8ncVQr`sQmwC!}Wf#8)^4M^D@om$-*PQpJ9=-QLBJbHN-ea32KE(5}KCaPB zS$#TrwdC5$ZDAKC9+=tZY;fH+<#pVqQu(Yxd*0s+w>}6+R=2!y`TWNA-RAAnH6{z+ zFgzI-qu7+{J5*oX4mef`s9ivk@G9&?X-(@=lpYe z?$@V#V%AUp`m$ng_rf^C7w6Moi8@DWww=E^{l$YB%bWclZmyL5VieUF+)~&0+N9LL zOEzU?^YjgD`j->*gT>bya2?Nlq;E7UZt3#*2O0OYvBWLkzPC@XMsj;G&u;Gcg){5L z`5*CSl{5+eHMfwho&2ks@BHt!vKr^?DRXBybo{dRnYRk(V9^QLrI1PBma2ri28O`^5i4^Lr)|3Nb=R0ckk!SR!RT({mwr{{Q^_D z#a|ptcLo2Lev~)z&x^c?N3Z_)qF(DvTL26n50j@gRb zC*LTYdHiKtfZidYof6tlgI;#_mgV{J#GA(JCa`E_t!|L;SyskJl7Pt>$rDxUv3H;PR@3Eq|xv+n;{)|Me!L z-fXvY*?Q)$%Tuq_{X28>{PvwSI~?wdy<5&y8K`H~S1G%EN!mJ{)2B}D3J#h-^|Z~; z=!^5F?|1ZG9dm5!F>morVw+QB^`?B?;j!*eP^Qb|7~jhEj@x6pZ7&^}?ft23%gIer zMYS^;|2_VYnR()rXynda&He9JU0!j{%Q!Lj*E+Y8UeB{PeN}yV?o^&`*W`bXs@9k! z@5(tOllkz%eXptc$E=sm&AF>#o;d4G^FPgpul6LpY*UXZXuYHJyPJ>oVJbbZg(uTXkYdIZGh~DfX;u(2f~lovBaocZ#lli-bRmk_u<{@8mFfpQ?ct>-{$JQ zHRG;`ZqlNqPA0tFY+Ey&BqzIget8h|P4x7J#_laDFE3a1ZrKvQL*M7}^36pi+T}eb z@9vkp>M63g$iL#M#@P^iE#6bT@-C}471{g#U^I9C{M0$}r$O)p8?V{-gzG%#&3JNa zb)a@cLii@R)`xd!ZdDfHeZu5qN?{L2Ocb$9ww&t6*lHY2flBjeH~Z+CrAvJ+L@$e5(T zwB+Ev-77O=joiKF@ck3GKe1xwj|2P<+!fEgToM-Su5|nP?&^0tt#8+ZE|;>g`k?bf z;uUNlX(w0Pc@_S}j(-zus_ewP_CHxA-*w{g<9E1sN>$`nDGO$Bck|4iIcA0!NQ8I=|uR zuVTqfUv`~UZfpI!LZ9Q6w`$z-WDYwtL<;YhQCN~EuBd0n9JEdRJ7rOp>u<5ra}>BwX@ z<-V?Q#b!#g@0}TK`_F%P(e&Z}`;LV>-#vJivyQ)~=(c0+w1*1=?=4fV(wTb2U*ej+ z*7FmN%)V`VvJX9fXmn%pvV9X2O}E*+-j}^8xqwe3wgEhp^rGTitY%KI_h%Emiz{Zx zU5;w_S)_6^V%g1wcdKtb&v?6~e!-nzZLc)1?N7Mr@isWeckA|Lx2)qi4+JdP>Bh2P z^@b*)lc}#9Sgj+JW0}j(Ye=Pwl)YAuTKla$WO;@4W)aP;N}g|Z_R3b-9y|2n{sFxY z{GdTd!AEP>KVxKI2*Ep&guK|tIVZ8W7;_*Ayx3>^)vM>OzWn1f<5Y|9g;$%EPCyp> z?1U`#d5N~zXU9&^VxQ_spv68jERIZLZC)tH(jPa2bG`7-%qq=48ho?WK_ig-|BihB zv+~oA7VoEbIW4=Ei!1;4{MfS4=xm{SSFoaUo7?K|>mPVsU;dWSd7*H>h4WT*mHj7= zInTTE>u`tlhK(NE|3qqdt<9@WSlqO!Rh7;Bz2r}$FTXa2d^B`^>Ep5RoaC8l@1owF zU$X1D7YpC2g50W@vyQTQkvvH=SE+D^%rWWDHCSVGAUW>tfYq_S+yoI-X&5RPr7X%{(Z>2FeKmP zp5(0;`viP?-`#&~dqw5ZHqq_o?T@D=csbuI5k0nwHM#WHuG(#LJM2Ik7=?_?}nbO%}gZcm0#34}I*LF;zq- zOXA?M)~`P=@7UC#J-b?|laI;g{PL*DFY^4?c*{IkbLd@xiJrv#&|4?cPjL%Xvu^?D*N8*UH5S#KS$UyCH)~eYjwDuioFFW`` zEbEQYMMf!GtveSLHO@Mo*|o&#c<0%-)oVK5K6Ljfd78aGyf3p{xXwA-)62T6#qI? z;&sx#tL@v<4Of2Uia9B}Y@JW;Ov^i0Z@ya8rDtBqyRP)&-6Zqw&;CL0N)BFCQ%jnp z6rcYicBDqLV%sY?hpVJS})h zP>IX76H9pR%nEnil<(7XoP~Aw*&}mzcpG%iD?c6MY;rW?YSGRIDy;^_hdCRz?r`>J zos_V~U4L`U4};4F%Qwvaq46$tXR^oo?PcxXkG`2D(H&~coquC(ORMVFRhc4oNssDk z?)d%^dzDl&?aKAtTOZj8&p*WMle{n6r=%r$S6=%*?njgDY*v(&yS#nWp)}iK(NX8; z+uYvH2$tlZZP8XICnEAJ_1Bj@1>Ywvzm@uBLg)A7bycMY+TFK&D~p`CcVfXQvyYZF z^Fns!f8BP~cFmcmDJOU(zC0{U?+@B0Hup%L{Js-0-O)WS4`r;XTwfgX#=wv@_^NvR z#aEk)pDfZ`Ve-M`qMMb|%xnIc_iAMC7ufEym3p7xH}}xupT;sB`H!;M_D!ws*fH6s zCR)2bah3MP)zZJ#biRN1J5THC@tv!C_MV)1aD8q{*bL+iOoxc zuKw86dH=3?q>dH=Q2r@D#VVS86y`XhfS-?~+I#e7|Fo4T#~=q_A;Fn;GH zFE!)0ff}b}VIN+OT3L+zdbE+3!6C2g~N43~5)oaj;3cE~o7tzyMo_2d=7 z%t}%pog%w?HIujU%)XPO{%VWZX1UJz>ZYl6A5U5YtDRDLf2Hiy9Z8Kp*7Cq(|VE828o%HiWj(9B<(-WOCz2}N(c>kT{g3Fic=aom6nHVi;mA(CG;?_C47MgC9Fpi8` zQsWW+^g`~`PRVz_mqrO`^G51f{Po@PfrmTtVavmgX@%LVp7;pM7jdnbqsuYv$(+@< zlEddONmNgdR9$_yZoO${r0+cOyUjBT^IDA_W$mA%eYI`Q@k{g9-HakEZ(;?Nj8 z&t^UQx^=qQ+T1lu-(B0qC=LAU zGi!!$j_9h6hOar3C&j6|<{f@CH9pIPA>nbvf?T`zTwj_`>=dgE->)wJI`-xk$Nx9{ zEzjrtoueK5ET(dqb+}k`-11L-Ctc=5)>yUscbVJGIJW0^;1vlS`2#QAe~4+Qd~&*X z_E~L%e?l*7*o326O6wk;I;#9iv)0*mtBmxD<(*Y##j3k={Ljnn(|@qlsDfwVV+~%u zq|Dn4)4nS&nRH-g=A6fO*7!ZPd1S(Jx?}OA!&eqqcyEd*{>f8!R$|A5#l1JIHSV9( zzh>~!sw3D~DKA$pZ><+osa{@g!eN6uw-CE(uM6$+T$rnWGyM(u{NnDzi?=7oyJ)yI$woeY7 zOAAR&NVlx~&$9Hmc6<+h)Z~zedI<9sex6k6Y~g&vo=q&BOQXbG#IOEZF=&$Lq`A z5_O}#hu=)zl^r^^S2oD_o~HKtO*i%)WBO(_{o{sj0q;NZ+>znAv-qFv++)X^CO_HJ zDVtfN6fxu2^5(|#OA1X^WKMFMHNCx^XW4z``M!?>pFi7p=B#+d<7sP+LQ=jbwoZ#s zoVG#Zv_y|6bMTS&nL#a;kB$p{TdFA8{?tftb*j)Sm4>vLhpxsSnr^$TxFU4#;>^dw z{7>Fb_DR)Xec@mJs&>uatZ#je9Jb$5oM%b}n{_Pz@#U(?JWcP%)-v`PI*;FTKRy0o za_paLfcA4+Ly4?QFBfS@g!rvW#(zf_V^n>}Cd*aGMRCE`|3cn7RZ@O{PbB>ns zBB|ptKT`CLowPYKq1D1yEODRCv8c$V-k`3vLN2qX6hED_#<r6!6=tK^bznvI^Z{Is2!kt?1bov?lR#R3mjH*b#3DVkbKgr)|$8hI~a zVQpy>p87y=`b}T93yJP;CNG%s)R)V^#>C;+g~vt51oOj=YKGjD3|$z!GV0kXp}+1+ z(*LRU1cYubNIBnvm)J3gAhKKjqP4j%L=Y03P;48x^ zeD<2PI$L-ord1xRQ-1V4uttfEXZE`J+7n!_XUiI%dF#sT7!t4bQOova_Yd9o?S~E; zX+5dc_>wr~7-R0vH{1SnTYkw2*_g7>jWI2I<+O#ht!R1UK<~=W)ja&4=l9D{*KGED=9E?|A8rW!G-rkTtCj^LOR{+fX+tU#=I;(d01nG?9CHKIrlyae*Y0souo45Ti%ja z?vFRy)n8Cb)94Al!?W0BRYT(Hd;h`<5+;I+FG^xVrhWGy<X%-ZhUJ#{ zn@734Ocv#T>uTTE_vqF_=C)L}<-)wl@iC_+q^E0ys?8NPsGL1BiXKTcF_)jr7Gr9bX>hA^ee^gwA1>?M)g4d)N?*HDyb@NsH!znGn zQ_eDNwtKDF{H8t2&EN{pHICE(U(a)E%u??Mc(ZfZ%>TD1kdc7_|7oJg3x=FgA_p?0 zur`XlA|&*i{qspreB0PtTC@}vY9ty72n$R|P*iMm;BsPN7E_x%Jte_NI9-iJC)?Ha z?$+>syLP$iL^v1)CdY;!e77$3ZS3`3W#ZRj@7}L`@2lEb_xtbX+VXp~&+q-Vem<}I zR&D&eA0O|rXE68%mr7|a6O4PmYtb~m_`pg7fxZf+iL7@0_BR#+ODXMI-RmpC7+jC{A6{I?44(Dtx$CGHOWs~ws(K{ zJ@ZhxOU=I>U$oa6Caip5btb-bX|7y+LuNtEa?^_AEjkbM4fZfiRyt$kKUrVme*c-M zl$;G#rS~{~EDqkkQT9@gPi%x-PBzapR`Z0Z%*A09e`IHvXq5)--KZG!()f?>jHz#V z*_cEpCRmnP?>jIj{K?B65y?eA7X7@}p)X;;zp&&L*PF#QH(2&4UftIac>ChDjFwln zy>-sZJxwH~dL5QLUTf;z8&GU;CC$W;S7XMmL!LgurL&w^BkpF+OFzoC{-R#6;{3BW z-Zxf!UAr)0`GRRtr}?g|xL~$y3#aF$=`T!TT>?tIQ_gN#vQW}$>V*mg6Uloe4^#3A zFWs5x`L|j4@2sS`&p7s6d&0e){czjlXP0t%7wlIo?2S}gc6nimM6h4C;KquFF1I$s zXDm<1x}-PV-N~XmNL|+Pv&k%e?ibNt`Lx=_64k9j160o(uvmEbG5_H$lfQ;t-*N53 zqZwhAnS#0(IMQZKKIgyupoxm~?6@}zq!JFTk_l<&TjRA@IXP&C_OwzKrG49u7-nvf z`8TgG;@ZVKIW00JBA0LMO4wlg=G^<7uP)14J}a-?SFrE;t-p6_=7wFmC{R03|3SCR zG__r8c`VqJBv5Mn6D99O=>|}G!)0F)oyjsog0^a zmOeaj!g1-1Vy{Iy44Y1|uJm0loTMVtKH*lWl%w*~8Hc3SwpV{q?b0aSG}&rJ@N!|- zy;4V3e%*4=&VO02)Z9Z;q|LP@lBx|DiZ8tk5v)~srf2?VgQWMj_?IPaJkClj7yPbg zPEkD>8Nt9Qe6T!aS69y47fU8Ohs{}i@#jm=1G644`Mlz?PeRkdjrFSuT;x+DBS>cW?T$cx@N@)Pyuh~6zNy5zvPH)`?!&83sAj(SGBY`LFQ z5FgW<$8dUw)9I##YRVyRZ%Vvr*tBlC^AF~~f`QCjTUPiaPjXu2y80uFjjln6;kUJ4 zs(bUiY?nB&tUSo^vP3mj^;p4XzuPagB4*`WJ>~7R@2X?DL8=~m(rUlkne20JTxQ9i zIqQgF-IJwzk8n=@Ki8^s>7wZzzx>$m>Si4a5_H|ZrL4dCU32Y?po}jLIy&6zz3Mj@ zFYEs8DxQAXlIiONzy1#6EM3mae*@|+TG3_&WlCAZ5 z%aITBm-zM0Yc0F1K10)jh1KnlUzOXEAKJW)v!V?4C`wP+|Kdy1oK1lm`Y*n03NV^g zTen}}-?GcuUv@pIIDGw*l;f?ZtWNcz%eS9dy05IC_1iMH_iE`4s~G(3bo_qWO%o4! z=)dI;-`?ey@4r+&dH)&DvV~VOyS-T7JI}RSdR`|q@@8$xF4^OscWb;Cp1V(=b5pAE z+UvgUJh%4rb`|GCQBU5aB&v zRQ&SE$Ok9xaGCEQiT67IyApj8 zxqNcXyHcax=>K1F>(ftn-I$R1@r5OoM=$+awd>ZO9}CVsKC|Ms-i3b+laGIn=>43$ zZtAI!=bbj3YS;57+T1JsdP3K2QIpr?z%%EM3NLx(cB{3Vg=h1c22QKTowjQV9laVw zC_Hieg#%QRTsyL<`m9&ru z{rcd_qWI@CdroDCL>LurUVd0!^ZViltDGI*ZtObR!*qEy+XtSx&rf7}ADX1>n)2|b z)pW0-;)XEcoKFf1&OhDB=f-eqb;c*xfC&+IK3(sYeOc3@5ubMbw^H58*FOs8o~~qM zVK!7<+2hl>rfiPh))dXlKN&oao|!r;M!-$&_Qt8Z#M+u<-}=R=1ZG-?A3y!}9yjY{ z0r8JQ?B11a!dHKK#I>D$#IhC z*@B3|4_OYTY|V9tg$q7x+{WuKzUF1vSr&%)9eHyj_bpyO)7 z>wYVot6f$kY<7O_o6S0zOZ6|bEV88GDlW*$nvDuT(F|NE|d}!@KKTEeC zr#NLMJ;-ob^=89taqWYXne;a)Y=3>{;On&$b_P9KvGcW-p~j2a#WUspxD~6+zW0#V zYJSeL#tA9x3+F8PymFJ(?KKZtw7Bb+ewH-KcTl;Zx7qJ{<>Wo-rfh}#a-FQapBE>) zKH-YLas7pP?hl!{=gph>o2IhN{4CQGl<9Uy`*U+#e*2M)HSr4Zdec~gKR2KKxlGsB zJU8>#qZ!7rM~+8N%W3mH?RCUU|H{vxiIML#H!5w=x}fs)dE7pin{}j_PX?Bub^|2}LolNM->3v!(Y?_bf?CH(F^usLTi(RwTeMP<39V_F@3U;5f zc3CWWwR9`DYvk?La`DTI_Qy9`X?%Bm_iV1zVhiaxR*OFGWttrs8Ed{juHe1ko!`~R zecRSfxxsLU{ij{8eAmy=B#-CzoCVjKb}c@&N}J_pqGO#1=ezU?;xiVqUD*BOywrQY zlasH_IOor?Ei5cNJl1f3*a3O*56fpR`@>T)Q*?L3KOOs}AB#1AZD%k2r)|%Far$-r z)vIDpnC$cy-Ylb>cc8xTgZBj&*>#(XKOf#!{eWxttoUh@_O04~Tm8T9^Xn0>j#s_O z@)Z4}W-eIrO7W&uJWI^IC*h`b++Lm1#i~v923rE3m!EOCmLcIG{{G`_sr~YoV})A$ z4rlE6@q*o|{)l|^Lv~fiCCYbB|6P9Ta>wuf$@Wk8XZHvN`~MSo`k=nSaq9j2Efs%$ zGJf8D?oN$*z31}mKcT;DPqtk8A$@zbj&6i}vsUv$Gk=wpH5n@FU1sM$WRY8couge{ z{z%A`>+Jh4-OHbH1X!hmyk#iO@`s+f8lve0(kArLLPWY)UXLZ;3(m-mz$x0~*NFTLv1TGeH#b-|*q zv!>0;y=t(c=IQGbJGN*DY>qCL*qF7xDY9+$z`1`G1qX=Gr%g>$>b) zemT%jm%prKkK0oJeFD#y&U#W3$*&szP))?B|CqxLnMr9kOc>*A8amn*JmhMLSDnB0 zO!~IJC6^pNue^QU@mukRonD@tsdj;uv;AALKU+4r%{m|Wt$54dBS&x7JhJOaXRPYb zn4m15U;I(+6Hl4z%Z9a6VjmZkU%v8ILiJQbiryEs1@pVj7qMn=E2i?MtUByfzTU#s zzI!v%T1JcG%*UIjvL7wvEWX^c@pQ}XamL`Lh zu)}PIk`Mp6N*HgoGVGFZ2xrO&Td!sHBt5i5_7<2JiWbIcgV$ zHyn6g@a%l^bI!e|HfXxG`8o-j&KG$-M^lz#vsq-DZ|%tsQY+Rk-peR?uZ1W7VoH^? zQ4NQr9ozZMFJ+?Jwr=B5ZMeOMdxdR@T*{6G-DcdX->*;OnO&^!bNhc<_xF@pLeKZw z-|O6W=>7GK`wic>Klm%Fbco-iw~l3gch%EsPppM*6Ei1A+ z`-pSPgyjLIyA{rD+ffmn^D&J1)4kX&I*Rx9I-PvG@yPD&?eExsI(qN9eL-%T*i!pw zBd({0nPRGu7pip~vokVhEl?FGV!P$TQDwj~m(?*nSo8cs<(~#o2R|!Dg!=^i6D(_c zb7*SAoxR=sz8t%vHFow#H@$neP~EXks_EMW;}^E!u@(!u=S`nKoy&Oli>ZecW52j9 zyyluO{_TP_FW;Zi%j~gVHm;C-TkNuM_nWPz?|9afo{lOH6R&+K#;~1XNAWd=gLkzL zZGXq&^wz|2!u;vWPNwkIYfg?{rmA-Sti)VKzVrR(Cj4A%Too%IHFx3`rQ(vbX=_fH zgr|JlrDS1c{MM&zcKV^>9VT^Z*AMRNT}4Gm)-5s znda3mS-(l$p?pg;NKzCU}P zo-UL59j7r##;>b1sOIPIeKkMBZ+u>vu{`nq^5pyJ2d1BI)t}FAH~&()S^WI7+a&_3 z%K{mHykosDzbm6Zpy+?@$GgS`r{pxm1#A848?b3uw$y-kos#$Nuc?SQ8D*F62 z;j<~ztfOX3hsC#jj$jRN9aCwUHn%V6xminGd z=eDTK@H?6*bcf}g`Qp1woOw$(?&tD5+pZe_Qxdk-HU8uYtFqAn^~yp zm+M*L+?jXbomxb+b>$qkPr@cm^Otb`5h?j$QudK&>c`CjOw+ZjdnVMjOyBuwN5qwB zl20SoEqo*AmG1IWAlz-r^TZbyG|rcMzUeJ$T|Ha;Sn18f-3xvlz1pf2KPCH#YmJ1RO$)#aa1V3ow4tFv}p)w>k-UBH?7-YciT&_sUohiffQWpgi< zapAr$@@V_zy_5Z8n&$^!d+^qzuZW3%|qM@HY>#7uD?jqN3{Zv!8>-``xqX#Wm^2%(4%~?)B|Z^L^ntx4_(f zg2@k$Uk{Q!oBfyZ+f6q4;q+>OrI7Z5&p%v4E__Q{{HH6{{qcr-9iMhbd`+BUzfr9& z&(}opOq2Dgc%B<+T7TSsP29iD^iEH;wC0^JA$>RRXiZOBX%n@mEwERrbN4@uPpdDA z1SDrROS#X!`mbc)EQjfu8x@5H1*{C z2AoqQQw(oiuX6(B=y!cLFs8s0ZcY*ENlk}AytzY(imC@%#YqS=x@`?%9_1mv?e!=2Q zHQ8>3U3}C3DV$yCXVr4rJmquM(^Z(^)+zDm zb(!^)qp9XE{TPMizpnm~_o(&919pRt+LGsWUW72U-F@@sP5wE{|HXdi{{8s+*4jzp zaG3-z59jHs+>oqofgfVxXRV9b?t6Uok?sBb=6$W&+kLjb>By4k<$2rwY-6UyvS`D3 z)A?Fe4`(F3;9gOw#JfY+?74*@QaieT<5YbmGvn6+R5lHaaM4G`ElDX1}3woss34@rCb>s z`P^xFTYb{xE0=40z0RwyjVoyvOn$NNR{vuDzfnr34a(OZ`Tu*-61f7KBNO<{PfpmI zd5rb_iYHI^URHSS*ysMW(pOXBxyQBd$x#Od`+W93?P<#FE0mBrXXJC=q+dMk=C@b3 z%#RsH>KiOin3lXOE+OtGx}6vElrv7N&0|sTc^8+%2sy}= zWswJ0F%tvBd%Op^$|EIa*NWuSf|AVqJREZ`po?zP$_$%eb1%l=xtHsu8&;Nvm8I{s z@%+1ZUYFc2#=k3G%y#8i()hk8?c7hj&woGvWMx*rVG7<5yxF*;_41smnk6m@`7N*6 zn_unhG&y{4vUQnk`63y+XF-ALsy zgglnoa{(FLC*MCx>~H^`cmBDV&YDZw^SN9XURzbJ`(&c=#$y3KS-;lFSj>%F@?(Nx zwdRt5a2_|`@Ux|9LAFJzHqxvjx=|Zal7(HRE^?XN|~H(fWMOGn;DIHr*+bU@^SO z8_7BE2scxUgOier#)E??#-3tky9>*e9>nUuYE9pIFI;qM6ywPjsrB2kT%tw$Z(R$^ z-Fh!7ckSLa-~OkiomcUwKl|R?+B*N<_j~{6-v4cOzV7dbWRs4xia%17Gmf<#e(kh& z?!*g!coP>N?m3eDS*gn8-l{;x%O|$}TKTIjpr}^mnpD)2Jqe%Ol01X^TX~m#+{&!8 zK1E8_vUKh4Wm4rj9kkIxEM9(f*Q=9DCZ3sS z*u8Q=Z2yrNT$iU^dl>nk#aftCqIAxAjGcTFm8G&wliZYq_(G4) z?%h(niZ?QLx4E^@UWc6DnxaDPuZnC1FV0@% zcB=L8L9_oM4Sv?UN)|Bqtv;E0mY3mwXdEz6itk)xG>dV~#fqBP^mf_cWy-&fPJe%6gTZ!}MQ#~_Gu|$pYR45Au()}~ zx3lT-StUm%3mVV6u|n{Vp<4XmJLjf}DL-7=Jn>U#)fx*i^X_P+jn9&z&%a4>ZNHRg z@b!d;PLkZ*^enC?Me=8tIE$QBtH|%TcQNtEteL02ox0E0;5D(JWzpi75>GlM%kMD; zd)f;M-CMlJP#0pKhQz%l-3Gn>)YO=O@mJ-4tH;hW)+P$K0tEiHesO z2pzwYrLWtzzFXPzc6`C?iKo1e=TEBm7?HD2a=laI`{!0p@%e2$C$C+Yv*E+7ncVL+ zSBbxz_v@%#Qq-ahO|< zs(d>1;bPXWJ~wrTXsN_ijkjz9Yn6kmPs&vvh`aLd-gnuL$D}SzWLewx(yW_Pbt&^U zZo|JRu4h^7c)i6`9=$DaKG!9ZuH9;yRa`!~u0=D-`}G7%fz4;G2&XxVUhbK+Pjv=U zd^3-CNt^MxhQ6|{jFyP0Z`K~|vU(x1g-IiKg4b5%UYFG$11CL_nwe2w&3nLm`6Aa& zevw>-mURxNuI1_8ms>LHpZ4#PsPz{mPfW0B*Rt}SV<&My`thSX#-g?1f7B<=me0;x zA(TJo@zT!|Z}k?sigWF@xPDfK^Db+b-Xv2k=dx?H=e?&ZEzC^e)`^>8+XT(gD|d3hzo6anrIu1gn=eFcpZeV2xvOoWP$hr%myCZV&p-TlA-M4` z=MPiW^WI;(>gH|QckxETuNRuXX1e(+pSY>?%w(b4mklr1oMsGNn6YW`FG+pd>4I?& zm&PZ_uNFG*vhnH3t~$3PhCkUXofj$f?os;U+8bBqJn{6S#nX?>iGP?HzfDornk#oXdgE#@je863XMIV_^E=|h z;&tj(WtC&o*J+Ekzhqr*b$4gTiTW>>c0b~95PtUkCG!@wlx=hMYJ=Bony-0+?Zdo9 z{l!PaJAU-<`I2rjA(i3IvJCm-+4C!3uIE_Q?X-A*s`7mCO!FkqCySQcyT5VUl4Wio zHIDIGzr_DaFBbcAX@Y@4kV?<9)QOjQJont%$CQ)ue_?&rm#x;KOOvN;b5HhqyJAzB zqscxy(T;op4mlMr?u8rpVz=$x9DBu4qgsUjq-nX>nWqQ4+P#V==AP0G|E8t2`Nu8?HLuvQ)k-jP-s~*vevNeHRn&B6HzOlc%1S1Rk7=b{Q<|D^&hI3 zl|qfDEH7U9=#xq5;(#=bd74w0&Qt{|$}IVjpvdD`x&5fH)2yXG4D4j|V)I?1Zu?9$ z^MBE_1Yf8TDXc5br@#0bYr;Q0NcDE!?x_>n6T3sRc#U+Q&Qtz4WDv`=! z(YM~hDr>k?gx7xiq;#NMeg4BuwTC~1+l=U6aYXeZTo>y|qnp zOASkn-FQ&f@8Z)hk2YHVJ&~I~weM2e(eBKJQvzn2yuJFj-%>~N>N!LAKy|FFFgsVK7`yIA z*2hKs0@K_lO|Bz_vdAv2+pt8R>@$ z%k=LbG0~o^{BgtI!*0ceDq%YIwNs{u9gpsMdo4I``@B!CE1&E+Dko&+;&1Zo@$DaJ zz4`v4etJwt%Wp|s>|i-9+x7mLZijpO;YID&O_Qb=7^!cxVO9z6d%im*WVhSJx)2@D z^7%^ky;F+z#D8qwbM>REHgj-?WZnamKftr;qi{SmZqI7yYJm z)cU8o!PbrY_LUX-DpwduUXKRw zr_ubzUG)d|m$+@WYgeh*yJtzs*Z)Op9*h65?2T`ESj`#s(L2bt?z_t_9jSwCJ7W6F z7D+@^ZhsX1Gu*FtiT|vp%)htjD;?juUgKZy3dzLz2R}{u6ZP@EOXrr&R| zqcKI~%rpDB_XGa8Kb#(rE`Rg~f7kybM(kx}Ca;$%ra$`s)aL!;?>}XG4Xylc9A3{+ zl)}~Cn^JVk(T9C1PsOhn|9Ki`MQt-o+a{T&GG}6o^YMqw-oLipPYDZ{JLUa+<4;;f z@#&hYO7Hy_jqd5uxp9^6&gpo~)QBJImyg&+aIUXC`9Gj$&*s9v(bH;lW9^!&9GQ%l z>^}O}z4FH6lUCc!)OfzPC}~}o+Y>NL@9a_MQ^q%pS?Ug_P5pH=J?7nqZ5qtS9)A_d zn77d5#lA;V(k0m9zG(iQGGUVGTK-FK6m4>!sPyxvHV8W?<>+*r$PZoosU}eGw8B0% z=YT`D#*0;-@0_wMfmzcXeSWUhH;4882%D;fWXbbGB^esGWJ zhRLV0oA;WmYEN7D<@~EGcRt8ZvJO!oq3SgB$+JXv|fa5*UCh0-nHCQN`oJp?NQZg zsP8L(`s<^MiTrh^j0h%v(}bs8bx$I;yo!Fh=D=32qH7L*!uRHQsP8O#cdYth1hP*W&72xr@_gHt_e^DCCWqtMrUr1!I_8$>xW2H6V&C$%#OUY;Gd?f& zHFtf&ch2xWy{1)k3VmXA|j^xpHcu3EXFy+SqS#$SQA42qKrTFY+aH(Zbolrv|R zJ-2jS$5y>tTnaB=vc8b3V#$zyy-0514|(>e->3a`tBj<}`kAYxWM{P5N}hKqfA~2s zCYs^5+>BCvrmqTT88Z6kH2uD~TigA;-ohXAOTWDP^k2#U{kq04c0K3iV)`B4FTU_w z;)@;U-n|z-+w6VtYVW11)iN$`-z{yu@LTB1zDusVTOZY5y|{aKdmQsmbFsg2a(|iE zmH(;V^uqc3L*f6+D^9d+z1$F2^}W=2-xn|Z@&D0*-+S8kMMNG67rAJB_X~gbzM_o#Yu==Z zov5|g;o!qjvRQ5VQM=>Q%9q5vowQZ+CR^=0i7TBs{*obmWv*ZJR=j^$CC^sN&}_Fv zptfb&SHrFk!d#b^ujti(q4Ud{=ch&P4c~S5{W;zwT=hPEscoasDUW-{xAlZh6a8R( zp>KkAZ-hqO&R+^?PZi>rWOge4Xfp}vJa*&f4QJs>0oEN2eNPTp}S?|;5>!xIK;xym~+ z7Y<+kxM_)*#ft9JPn1Pu?i>|8D0q0+j|mSx=-D~h_3?cB5U6eXr}Xn2y?O6hCamK- zR1)qK8_B3LrIY1nSfE<=)5j+^)m_iiI$eBQ<9P0RW#Qnw?vwXUBtO`+amTTPxsM-i ztJORr{9s$>mJaocoqOaZV|=m;k5+Qc++#oYSn$i7d2Y`?GnSb8FOS~YvaLYVuW#v= zUgng-2~|6K<~@-7!ZiKz>>7i;huakmuT6NTcFHqv5eviGUDKBx_`7yPaiVxQcdE+u zC*SYoC?FWGi=5#Qd;`%ZaT-z zUOkMeE>2muS)3yzb4T)9ojV74#msMMzN$Ifu`yb2zR%$b-rhvnCIgmTQIprTZe~)h z-1+2ELU%ZO*N=Tlzs@|G>|lHIQGr8L@6oja@}9F_=UiJFGHv$5J6+kjKC$jyivw=> zO}1bwer&@0Gv?sj2cMb`Gj3o#JT>J<)=h(5m9e=S4m`35TFdOu+3n98Rb#bo^XsM` zHrsR9<2SI$-;Zuy?)@QkvrX(ywusb+rqLN8Z_EB2^w@XtQFQa|pY3AzA2Y-{m}V{z zHH!cEa>uy?rD~Nwb#AqvUshOSSM-``)*_>p?y{>zWjb?WNM8ZR6Zx3K;2l&d@bwAvrBmix;&XY15)w`_OZ5!)fQe|qN+ zrku4$W+z^My5TjK)+6o2>!Dlh<9&mFMp;c*zdUH4;K3c8T0g~BJ-WSOUjA~^8uoKV z<(GEWh{ql)PyXBfNAT0r4p`Fzus+|HW3_YY_Ntiw;*H><2{Q}F+>Ialxc z^J)Q8CDm8@)k0remAjtSKhIOSWgyr!p;h41c81gEP8!|WaE3?6TGTr{edgMTU25KM zzkQgl&8%H*=wyHI?EhDf*b;BB3dTPTy%4x3N=HN#)4Wr&8XX1!|ufBmfl zaeIL+HqA`a+{=!vZ)%)7uhz(64x^68=YUMp8H#;}@0Htp+ZnpUW}Z`~^t^|1mIWsc zzVlAvZ~70u*Hr72fbR`K28Q=4_=bpJ_kw};@uLsoVI7jLoqXS4*iqp4{@Y6K{ZqxZ zC~!1IJ-o%#{wpacc~OU8aiH*&?{7~3=&y0ARov&yy=6?8BA1c5nS#m%mQf*|yrzROzwAR9K-xjuimoMz%49QwDjq~sl%b?8M_C!Mo z=4`_$e0JHzD!p8irrB`Sr?r$k*%i+3_BmtcjKe+6**sTk^o_MX6~Aw0mf>6GrI6jndM9Cq zP@=|Vo3*m}IdROFR?eTNk+ipJnxt@clWyX@gT8I8hHWz1J4{>dq*s{86;)>H=zG`22o^vu&?_eG4q!^#eCo;dzyT&?e`z(8d+dtY~ zNs8@HxaD=$cn#my^0r&m@h2M|YW03*VMtps)pK2dY}!UohkzjI=N(^*TWnR^-jKW=J4$$@u%JyWO?6U`^OmI&CVhE;pcJCR{l(8dBd_GYXw0l%OKzs0*#5}DV9M^G&eazS6eeZcb+mA^ zbC+n(Te|GZ3zOe`UK+O|QdXqcDz9@|Z|=KQ!syIgFV(M-%~uU#yZ5fV^xet(zN@5Y zd)w+=D;7G5{f$^^CHd3J@0B~BM3}^!I2*5;i_-)vSN@UueZl7FgR&_?p4yKxwSwME zIMEa-7Rq`ia0}<#pmTwG5%~r2D-vcbe=)=1d&e7rxKmHuwz%uK?cDLdEA`gu z`qo;ZZ-J)o(%(4`j1~?UXETux2^zF+k_+2WLearlbw=!c-f?da}*prCOmD|ouKMI$#6;J zt(KMxCYeE(wq#Dr%XGSI#@fXiJbBq>E8p!iU;3n5d0)S2b@}Gy%w6aHJin_Rxrz7f z_ul>QU+t~FxA*y<^qtS=aOeN~#T|bnB}P|W)<@_}mm7aeHCxidXEUVV$BB0znQY7F z^&_$VNy3u=3tI{AFD>S`_?s*@Hvj(XnQSz%P9#1`!tccZq%bbhQlXcD`xOkuL8 zT3Au>Mpi(|-IH5S z6uk=Af+zl~Ghdn=^03iIC(ra=qJ6>HB~KU|-w2&iIlZhoB-dHxqU?3w@GX7`OH*}^ zo<5OeRqiHweQu|RJY(#mx37zoJ4-5pl`Lm`aM+!xH}}-ixf9P?I+Xc7e^?iqYiwTZ znQ1c9!z6W5@0P=lwEVXhq!=Mr>h8vpdZV|~7P5u%WohcJchH-$?E8+HPQ|(_R_&W`kmp%K zo~C1qtbx!ozddIjNKLgZE!7b`y+-q}*BY(|Rc;qoh%}c!a69C^d*<1B7c5(~%2R@P zWc}}7-Er`sZ&QMt+2fV=GZ*ZY+~{H_b^UWk^`aAI1p)yVwp(P#R4;ln%V$}b~jdBjLv9H|{pxE8Eu0&0=GwsbjrGQelrD0#5G33dn#)&(yzr8Hs z>2lYi^t!C@oM$_eMK?XanZUJ7>+)N^vR~6Q3JRU<*UhAEEf+cGb_ zGww)~c6JEe8tHm+FXNG`0xiqBg*`r1xa``^dX-h_v)p?9j)~va{mnCZ%>2UGLv-`{ z;BV!u1`0DSIUd-{mU=CVo!P=?`7aHbJ;voTLPCmdEN5&!dN-^4_mo`Ln_}rUPwUnn z-2IUu^6QhPif!*VEYi3pQ8)ddbH$8VMJuQ0Jrke1@lea+IsFnon-kqn%+@A^~RX{b;lFr^a7u@$<|C8t6FFoycG8da~c24<~>o;X4b*>L4MAs#dCuWN9_9BaNY2Y(F%tE z+pqUkz6(yj)_zx5-1ndsyZvY7^ql=ij{M%1wk`fq__e#%Nu7CVd%Jh+u4q+%RR58? zy*A3xI#FD5=8~=ZRqoD~S+dl%$7kZou#?kR&YnFmXR7z)U1xDIXMDo^-MeJRNz;Nf#UFdPDl(lubwVfBQdRWz%d;;wEtt6TRG4B; z!PHeU&n0HAf3222>F=&rLdx8wc3ZVi3f*14#JgAL+5~Oo+iy3PtnqG6->PG@Ddfg> z-?YBdrI#N@80~5OcK!l)-jenELe@=C?b{Hjt^eUdqSOX`h0rhl|5(D*7GGraoz`>H z>uYvsX=+jY(&-k{symZ+#vkr&*;BS8{^=3n)FADveKB*bZye?5X|e5DlhT#CbD~wG zYx39IsuN!{`kCpz%UEye#`yK4=pnNrwNsL%MQbNYZ@D2Ub@B8vGxoJpUiV(n)|ssL zN5TALZ{M1a&IK{^^Ph-iZs@!Av~=4`omEV?3M-=}q}HE2>vrvF*4pdco|{dqHqFzm ze7KIs{^r`BN=_O(4xVt+`Ce|^s&!mUId{`dtt*1BJzb2LHD^6O#U0l2Xpvs@lB zO1vknoL8{KUg&M<;nb)GcrF+`9RvGz~*z=jhM%W`Ao?wEIn>&kEK%7L%vEe!l*Z-7)_JpZHC; zC+F6h-YEbLrOK)%-GTQMt{wE>!R{w z4k}WmmtUr8vuq6&j%9tV{_el#^2Y^AmtR+DnjUWzZ_8GDR`gMO-oem_10vdg7w>uH z7C$rM`R(_TYb969SgP#!vwg?*O^YY(-uu{MVVcR=1shKOSQXy*M9y)=ss+tgqSODf zzPoZn=l!Je+p|5>PnDYgez#Fq;2U) zUFkWyW9G|8hgU3rH`&cjb$y2Ufp@2h|FrsTSG$~N)=_n8w{36SWMQ3zJ&a2iy~`pW-0pI=`7v;5=y zJ*5@?*9706)MNW~eBb5S=MTobKRIps`O2EdKNs%tw%k3@c&fGX6xXMxHFCMH&O5p( z_z%|tuq#yWtua6;b;hC*>DzCQGIPIV4&+V@LGe>p4-@BCPcb{(_en0ug z8os#)y97hp+BOzFkBqTy5%uDXo9=3Rb9-CXi8xL5ofjWobFCEQw%Pnf?Q2<|tw<%i z*k`ugJhmxkU(eOg+ONN=FGtEvqfjDSGwZH^)D)qdMH=r@YsI9wQ_Uh~o?cPs_e|+r zqe}g6%Xf>;h@>tFY&{(EPVQ9Z?0~%LiFeADvTTpo`S#%2Ciavpe$9;Hliw z9(RrJg{NvK6^Vb|T?J89lGPkqrQ>%4=e39)i_g7h70+poMY zs_B2Q&!55m!NPxvvpy*29O>tLvTqOT{aU^tLzDYWOS{uNjrh6j zWlBF@7F*18y;gTly5i2G>3jF|h*Jkf9u&?;ETa~~M^|4cgVt9z*O^qmz;Ctlb3z-Ag6CVbs@hH~}>hdj5Xcbc>^ z4{&83*?OtRbd%icROW3S+-0ZKihlV2ncn}`sN;AwmucN=7O48Ye68uK$g>9bp1pY<`Dd4!_GHUB+ob;at+rJ*{{AWbTim&4A5$C8>D~68 zT(Ee9+W99L?(FXBOq+Nwr&{Yxyc?mhJ-PFZ zWAmMZ9yhxAIuoY5>?{tvXYO9ZUf$-__95&=Pt5bVLY3}eVZS#oj*Of=b=jI63DulO zUB#E`{H!)_I;}qc^eNf+N!I5*%fqU+N=x+et&j55U*^HHImLe3NyaPQGH)-rhj1>k zJ8)Cw+!z1C&?j%t9k6~mk$KXDl#7cL4rV9#rY<-UyZle+%I*zSI>)tY4a1nHO?~ly z>yNTmOXp5K*>)k)QbI^~?xMd<86U-TLl>nwm`v_`b~91(j^r&%r>XJw+V5o!bxaC> zalUfXj`A}n7urkDe09AzVAY-H-m=R={#KbBk*HMA?oWC8adXk1|JwV@JY?0r_Zjid zoy@=LarWj<3)k4JzGtH=|M1PxU2FENv3ve|xx3@-Bk^awM3eNx4|9c_c6*&==5%`I zyTfN%5@&^|^W5&gzt5kK*GOWY*UEIbOrYjN+sZHBmU6Iz4x3DT3_Wb}L6$(* zjYBfdsgT1atJePp9X9!yM|$S8`C0xF4c}ERzz&<7as9Ya=AG0Pzb##C+b%s+U)tX~ zjq$M2`3w0jf9$&ak2EA+{#wkr=|$CA<+h!BGZeswO)gch72N;yZ-7OFTk9VFR`6ky zlTYWJ-ao_nyql=ESe8ga*|aRls+r$A8=1MeRRwMx6kTJe^Fcwtb6U{#vu868eY)uF zr}}YE&8#e0O{J*gt6H;pw#rOs=Djn+YX9*M2KRsdKb`2Y&U%NX^o!cXcZx2|P_0Oq za{J0W_aM)|GZNp*@0793SadX?r1!g03|n>3g<8p=KyBk|yVcCto;w7-{_ZqSMQP!= zm>oVh7G;TL#w-dneY$ij%V$xKO&dKnJMS*vqJLr6<)3|1zlC2pU+~pftoMrL;b$S$ z*{k;cZDrs|ofY26P{KVeK(Vs*)A~i-QZHxiDE7N(vwXvC`wMyH`xe?Ay?xVjrjz#M zD<==VzO>m;z2{%)8>V_j&^XA>b14&^U>p$$Fe^ENQbgTVo^`q?d4fbAlxLcblHf*;pH{QMZ zzWw}ogTfwJZnncw0yeu7)$VMYa5(#+dtrqA=75A7wV#gfd+k5v^zj(2?~NQEpJct* zuQAVHin?Weq{Q zfv%Okt+6;IapuBV-+O8#cil4ytvRxxKygXHbe=Tla^1?{m2x|U8k@ORnY|4w-q5E7 zKWXxcf9{2CJln+6JrCSgx)k>;dj1Pf9zS=ld0Uk1eJi_aFU`1ce95W~)?K{ED8 zxqfCoCoRg;U2^-^#U0KEKX6QxKBT=frkk(xsK)fZdmFtrehj~%oXBsQTW6MTogQ#z z<*lY=Qa4mm613Gpx0OJaCeGP2HQ$$!f#D$|a(+g?twaH9q&TG}=6U9&`m*oE{z*XTzeHJuo*-T*4q$O)vr!MU9d49L^ zy07coXJ%_Va<__^>33L^#62rL_q*WU-8)zA-uXR$@)pnHs2aK1&rf^)|Nndc>ECz% z6@RGjf8%Q8^`TePlj-s6*Vm_;ZmT$*wWrR1>h-tWCg-l-`PcfdtwB_*aZc&Gu=1Nx zdabAC+~YlKr@KpcLj3#UcBh|ZCnvqn<9;5_W@f_vXO{gQl^0L9TfgD`!Rq#!C)IBI z{*7yb=B*I$DBkw_uy53jXn#>b!!0WFr#<11P%^kC%d_jYveuH8nskd7UyGl=s4Dj; z&azu;x2AF$8}r#HgFA6cTVFNbdsd*JVX$+-1-axJCGN8uLfC9(9SAI2A78vBCt@}0 z>pR)Cvqaqs3nyIFayzWHz$`0~vvHr=1j(yHkK?RZj6_lb*=A}dzX>rEd;G$7diK_W z-~-A9QI2OS5AW={%Bhq*m1QfN=Grq89C8;=SgRy1ykh;yx8HwkdG-0#)->ing&QBe zp4HT7_Ac({Sh&?-#Exxgo6^^C3%rTFJjQFGgp zC+52{7N;~6*C{+u-pAGT!e2wqUV9n$6JF_1)}=f_wK6Y`KdflHVi~vJ+$KC>A?G9K zYU3|`M>a^L2L17A%slMf+Y)GB#I*CZuh-EtGjFb8oav(WMk{E-EVm8*VFv0<-kPU3 zT$xj;=cmfywwBY!)bP5^WdA^e`ED&|dIJJf4UV0WW;N|u{Vf0H0@kmsqIvP%Vw)b7 zgdJ~Kq?&zQFqpNQWzA{XZdvazs}P;0*n~xie70J~mt!Wfv5Q4-RGB5{Y^W9CR^RTr z++`QDvmnywR5P&JoJ{Y_Bl+@`5aM-QLwv|e?HD=*%8IBkL0ZKM8gEVuqR ze-B~hb@N``l^A>>h|~9uR~3el`nT3pSG*{ z9dFbO-CcVlAHOvGxO_3EG!uLHjNW{WgIZA+kEJa3U}t^RBvd%1DJmrAP?}ipwv9*M zE>0_oX(S?aIQSQe>#IBzCT(QS!Uf%r!Z)C3L?-lHQ;n&*LU9j=t#+Yti z|F}Oc-S@9$mu6dSQ$F0~{g}PnW_g$VX-Bh3Qgd{9Hr^9bxn&*lhb5e&r{jg0j;_ZX zcFwdH)0RKhipe{AHAl?wHuv9$2?|$yRxmkguX`F}c2~vbZ}91^*NZnR$F*`DeNkZ_ zTCljG*Ssz0o`hF&K9A(a&yj2q-=0UOO!3|QvFwh{gtNw1*XmfSU)~|F&Q^13frhG4 zXhdQ49}ll53qSqa(l2bEIpN1a9g(`}4(|+PwB9+k8!CmF?G!HA(0S~+PZQfr)AH3j z!o6nhI{5bM`iXahRFs>quaT^AnfGI9V`Ngd!ND_69xYXpRbDdZcgUQSKd(X_8rHoH z`zYYHA$+R||J^Q?$8w^!lMHwF&YQitWc7=wI>NVSRjibVyQ9qYO)A$>Df4LlP5$J& z9oyzdeCR)%%v8+XmY4L=L#69Nae;W9x~r|GcFm91$MkF#DxF=?xLiagWu}Cb*VE2R z9`A!bRL5;dF<5#doploTlZUkyOCD6d+tJ*6e07DO{>8fiTe#C^#&UeQ__3)eyeD`M z^L{n|-bruoNoRfAdHZSN$uFy#>?LheD?c9)`C&ZW>7#dkF~^o8fBx&ao@UUhxUX?< z>c)jZAH>(S35D4&d9Y)~svjQr^4IV-E=atj@#kun|6;={dy81U>{@?GDvL?C&cD<^ zBl*Y9Ic&#bxLWV@+E}s9_k0lNbzJ?&rLOf6E1IL)l?BXPT%yCQ;#cwo_84CfT5~;X zkDZd0*~h7?LQWk_anqMnSbADp=Kp4=e@jn)6Z;$=b*6sipQDQ&Zs+RIS+}g9boGYr zTTkqIioPgZHe0rY+j6Vyi4u{iCCdKsUhfV*iF&wU!ttqlq%Y5TDz-CjMzZ4i#mtdU zr!A84ZrMGdda~?Zjk23w%Yu*aRI_i&?p{`WJ3=Mc-0w-&tc_83IJxa-o>0qRwGjRM z)929671!sl&3Ha};i8q5VXpSjm;!jDMb;dbLJl+vYj31^lc(jhK`c@-1?$e|P-y z-wEadUJp#xol`!m9{MrGG?Ve5<=h5+wI^jvQQk!Xw}fJocvIIM@S4+Vta;cq%5}y0 zgK761$`ANPwKwmXVcXujL}6=X--MY_N^fon%)FVwRrHwQM4a)2z4jKyw|DO9+%mI- z(Lc`Pmtf*8uNm6}mw9tsEW5OH%C_bbN#oC4OjV}FpQV_}bYEIAZJa!_Qu*n9pUiSY z?e}VToh@rFnkg*Wk|JhiuzUq~o%<)xX?#AqCpVqZ@IUGK(y8Em%k9L;`_E~=JM`0B z(NukD@od+WNUv}AKHhyT>rvX_chNI)0qf>pdo@xy8vHIb^BjsBzS&rSUPrrnW- z)e*YY5t@57+~xgq7uL7AMrTfJJuejKJ$qZ}!%2EEY33oK-ye9noqIH6pZsEpHLqn< zPhOs@dZ|Ta?+oJ%CpE=0syuC)#w82=C(Khh9=wFvaaYC*&#R6VlhgB^qMzif+js0<)@{of zA8YGA=gB6Jm)K7j&}*AJe5d*oLgXlQIKWUXx&5v1Mc#qbdHvEvk?tlB2_@X>8AE2V!wmU1kr zSDw)(9LcbWQ77T1TW-veGtC+flQdLB4=XL3>@`vCltI{;11yD1%Q|N+5%%01pp*7E zC9rX45}#N{@P>$x#FZ=5t_Bq8eZKv{vn;-Id4+`_iRz8x7U2n!T*rA}e=c z^T&oW$Cmfz*gUwRSg9sBDLtil&D*1P;pX#-r`-5=q1ArcjktG*UQgL}ern92Ypa-* zZ@>J`xO#@F1#9ue6K?tkvyT7#o3J(^$#IQJK>DOG!4+4RY&MLX(`^*kKl6}tf=Lkb zN>0-`N6I$#HOBUDZjpa|)Xk(@;g&0hc!%!}j~unR{xA7u6Fc@yeDPD-nP;N8Z~KYa z%+61AH!FU+#xJY%D9LG4ZwcqiphKIQOC&$PD0+5r>Y2r>XV`~NUgy}jV_J#r!&{wN zg~no?(E;jts(0D?cQD5lsz)7-y`l2%uvnqJ=e00@5hcIM)p7c#_s8$$IQ+K!%$>U9 zN8UD0^6c`NsWQ#;?Se@!m(8|a((bvpfp4WNEK2cyeEj<^6=b0xMC66K`Z%8Kl-}~F_|o*AKjA%puD3jvcKaKBX}`qJ|AwFLFEsT`2)@LT z;~C_sY$@>UQrnUfyBm7`o3wd+6N?Vyw|n=5}g z`X7y|E(y7M_5SZ?h3ba|otzp@XzwvOqrxK8F+oF&X<`BshagLcgqr!u11W0fd^j>z zhX#7z_V3=dwPEe8Ye^pi1C1{RMX#M2v32eFeL1>ow{Bg_zeWFO*#7(bo}bg6d12kx zzaLZA8h^i6`~Bwg?cZ;v+rK*%EMNC~_Y~);$CxJbEK}NFUmfc1zhIT2KvuNW2iC)~ zYEO+s^FP1+@ODktH#R5PP;DXoPcxS--@l>tJtR7WOnjC6c9KP z_S;G9@{BV#op_QqMc$J~N*#)gKJ0zSTDT}@p_2O7 z0zZ`t*WTO~eb=cfvf|U%W2=Im^z6L)lHauIDO>y%sa-|OpWa^=E;euJ!+QdkSI)G_ zuE}jIxa6hjbM@tnpeM6RisVi_FE`$qbM>&J!il$^ST~$F@#Nap2a-*pJl6Ye-hatm z8jXQJl)_n*s8H7_po*AZ9~CDZw%tTQ;lFHZlAWNY%$z47n5%hqjulG|u6!=>BZ zDxGjj^Qq?IO!nwE{j7%+ZwJ3hU(39XtwMUv8cTsqVc$w}w<@jOx7N`+kTvvCuC+{$ z=JJ|rR_2D4qGuI5WUppg-`q5}Zgun#!`^Z+E~oxg*UowD2w!sLb!MpA+2X!~3T+~{ zrtR!HH$nC6His?NGF$I#nULkX>Ts5)=$2$HtI6k>lG{Zu*M&yeWlNl&boI4pZI75U z&yVX-j;G}}-2-0p1nS;D>Ji`1^1L+EK&>F z(sb@9Th#O~KbmeVnDlAkr}W&C%SKs2CX@ZN8TN>|u1*c=Tfg?KZ+6C1&+M6Q{5K
m~*d)UHWH##i>(RL2Q@9Mc0yzGV?MHIeeSP{8DV!1r>Qd z_g`<0MlasjabEuNa_5Qj57;Y-oBi}9-hzxyZ4)?J zeY&hRS`~A;+9t6W3&cL>X4@dXSHw6|{aaFpg6s5CtCH@UJ}mG#@-FBL=PsEzG2hCW zZARN{xP@-6;HZtc7&1%k*pDTPUYa<+TW9og){(@MHb1-8O=g}{pQa$vp<8r0Z&%pG zPfr1YF;(90wu>^rkqUuV(QBN(yv9DlgTiCjruBEUGHN;{=eHi z%Nr9nY*4j*`!?)|Z~Ku?-!E<7Ai3{dp0`tqtJ!K^$HlByx?8GaO6>i7V1h(%h_~I>ln<5_XZV-L5ekH`J*g*|8}9vfvEPe>bw;_V6al{5YWeWrOGaqZ1{v zxLx}%B~Q4xD=YN#PT#c;JeN+sR$#HiR$#UMg5xi%)&4R#2G*SUw%d)Ry@192(Tce) z+oHm@&z`qL-RD=LQrWW30F%CB-LLIaFZH*z#Ht7Ed?~r>n(KM5V@@rBUuvAJ-?Hdm zDpuS3BqPz={lGiEb^$?=zddz)!Oh!MQ%YN%8SR%$G4J>k{bIRZmE^+pN5wyvPy1Or zsbbrO!&b2;yjFH-$f+-FS`=gz`r+TPCHED-@|LsQ`4ZjuM@sDS<$oUQvn4cV?tCh3 z+GGDhwAJuq*hTG<$uhnB6U6Q<&DvSmYL@n;U(3@PJK44Ml*fS z$-XHz>z-ZAAh3RA#)_E9+(O5V0@?LGmcH0@`mCOecUTQqpJmS+jbmy{t~$)R_K5qZ zRY65UrQA_vAH6eQW(V-hJldt9_b6#uutIjB!3DurOdY(NQhSXywz$u>x#l=IPBmk> zaiz^PxgL>Cs-~nd9VFuJHtX%ARaev3S|^;;I%>)!6Pj$G@%ljPy(QaS9@MzLf4SROdowtr=xB7Dj)z~fmAvIZOZrnTd zzQ+&lxlGFs-J>WRx^;s7gpShLkGhTSUp=v#+xOn26%0nIyDB&T=$T&_boa*Dwt@}I zwM9hdZ;?$fUc5)^BG;DP7861i+&X$Y@zc`Aj@0Y_yLMYF+5B))!4ltDr&c9i_B*t5 z`>i>lRZLT==QMZeKkTr}4)YznUbK>mvWgoZtw22rlzj4$@>zUZ4jE6s_ zh+Ha|cK*;(5t-^!YFX-`9Qppfsj$>R0rjs{8H{MysKpCRn`wl(6jlH0k2 zxB6*)>z`!BC#bmOJB!b|6n9b6%6hlcQ)(8UP?@e%;qWp1N0>}u3Cph4-nGUv%zW-o zf3QLLzu3P`SN)WG;H^Jb&1W%|5oK`KN3#NJN0nA z_P*dUFQJc7CmNzZJ030fEGqMSDcI4uQ0$Z9(eFlF%O-BSy-c;MP*U+2=U%gYGW*;= zo(<8AF29j7#qIGWTkrJ6#Yzw7<(bw&1%uxjPeh5Jj(wp7~4>G^19fv zna!W3#%fzMp!RzE-UReemvrzD9qx&b69el^FV%%Z= zH|FE|H%o-J+?pu7?9=J4`sC%uJI)CO{}esCe{$ufV@1}ACyw0Ls`LF(l=Lv~;jg`q zu0OS`&z4wsL3N3}*1zruzoeJD9841AUy1)b-*x}dcEihEE|cODnI5jXYGAdiz2oU? zC#l-@`zAl{p2=t2ov=_({D1FCwaSFkhwAokS(cmH7%;PjRcn5zSf2jo?={=@KHnU! z!gt61&7y75*Erkm{E_>A_sMtRLIvT*NBlWG9l1?UTORRCde(+)Py6_D`}RZc*IrpZ z(~+y={gn^D-^T`#{pl-axVc;AYX|87ZS_FSsGD7M)`t#Ya6X-?m*-y&FA;}g#) zx=0JnzmhiZi^H;gExmqzqSJeBC|arJ@k+JJI!P(3+}Lnj{&i=>$rZMuc@qCw6%Hw{nYwalB zEql86=7!SBXXOD0>*faPE>v8al*}@B?l~4Vokwxf?>c|1J=RcTCNs6kAX?2}rJBm6 zj<@^8lFqDf^tuq@a!RJhM#@>mQe=PI7w>PSEyb?oN%4V3x57i1zimCSQ2h30Ud>H! zUPnCd;=8tQk@1%G!ZQ0h&y`Mcp8w{9??R*BR#TVVy#CVU@V;|PE*H%0w9XN|aPCmB z?7X4^*_SVu-(+98;Arqg|EujEr)h}Ky7J&$^KT^^LDNJN=iR0b*ScnY-h86-a?^i} zbm3!1CtPN;d^;o3acWdwAhYI$S?e3-xE4lz($LNRCZ`%&(r4~>_P56O4bL5;I)8uu zc9G-Z!M9Zj_eGYUP4~UyuV)i|_QA`J%ik#$iA|IN5AYLa*k@ z&8-g~9XgvUU%UEB?UXK=KTGp8swQZCd2HT)LGeY!_T)zvcf(68{AvrUH2m)GoWDEtL>IKRhhbPk8F$cV*F(> z&(1OY;?ol0SjYH7cV#&qw!e_tHGQ4(jp=gBZNC`*;*ni^{?h7_y|(w3NWWnIB_my; z{QR3IPd3!~IM45o^>nc3 zP3(BV8PK1^!|-cz!#`)1*5w=8{VzLJ^@%NvPx)0G_9H)~@xRf7Mc>aQeSCcD(R+q} z@xNc}2zW<|C!hgmM|2ew%^L6iM?cU$)djB-n zBNw&~VJFRB4$T&UFRm;2iTte==ny{KSRsE!SVErR$bN=L_ZdDao_!j#Dpk09kwH;Y zxaN<~A2%HQtRT(2=T>n`vDug6IC*I&&1W^ztkUi`Sa(^UQ+}H1GUvF=!@>nq%&Loj zRZRLbrLzCS6<)P}zbez@&wu)|Sv+~0`MF}*XVbc348l2zS+C6qpP0(lSK*py_VWKb){tK&ZRqzmYaxYPrdp5vsdwEzvzHjv(5C^oA`%lp56TXX=2>o zzq?N?JEMJ8`s#7-H}_MQRz^P6)j!+3XNzvq;d@GU)5F!azmQIo`@$lxp_2-(swAoH@$Jer$S#R$T=U6&p_SV@C@>G?IcCm(K zsN3=u35m_V%qa37X;jTzD9?y>K?;V%NLbSn$JwD zo_~IOMvwMz-hLRMH*KNj%Ma%+e>k^v>dcSr=8U&mCBzx;9c|b?)9<yK&Gur^6iKU=pfhuC@$9($O`!d;%vAOjdz^2l zEM8J={Zu_iX^Q!q49g>GvbWU47rgLH`0C+!BK)9Sc=DSz-*t_?>y}2=$ew-dAE^9( zA@@(VPak_1d0*0dzUY9+?w-qKCr`h99(%UAcTvK$BTmb2J?Bn9nr(RQg#U}@{Up&+BmbD);6$KAGQ(rff_pQ3 zPVSazp2NClH+w;lu;$Ei?xi!b0TtV?ZSGoSEX-xkEj#~kg z2HW^0Gye$vdOAImalaFf`iW^B_Vy-%pR<413O}9x?B2tMb%!5Svt{Txm?wza-#uR4 z5_D$%#RcCz4o%d4^p*Ez$M=jQq6g-5{_tH;%l$Z4!H)09`wKjE)1Q5)HkogKVAk)+ zPs4XT{FZh2<)`lNTuW!k=nz? zv-IVBe?R`?%YRB`-)-fS2Isy%EULfc=Kh26O?Ld|@Z$^G_gHua z{^2p-tLAePZ*4>#N>BuRqFr>45abT(ySq#{!ct_FQb*I4S0s zmetV+-^ab58S7+yO|LP3VBK=)hDUa<@0N=@I0T z*AFp%Z}vl%7&nAG(D^FrZIH6Ee8+i>>AU%U?)3RFZ`%CiPluH4ML#8N|MO<6b$w;E z>7$#oc>lVk%C9}LDzw?pis>-lm$>Ok3@Z$eGgh%TbSZ^*DVhG~_t;x|Wg=&IeY>S} z?d9Va*61(uPm&Ol`e1#3#n#%!-b{&ffxr5oMK9WX@vp>185nxB@C~kNU>#h=v0N%B z7Iey-?PVqJ(_9gn8eIz4cD-d{{uGhCNJDTFXhYx2GM(V*H&e>Dy#Q_K-6=Tp5bcm zUCbxxr5U=vsmGbJ8IpHd-+qNnFZi|Nj#js;KJ+49Deez5DAAnI@8i19$iU!+vX>8iL>_s^m`7?( zfm=~xZmNnQWJo^OKh~ScQN(uh>b$({S>JpE4u(lxxmGOLqQZHpJMsK$s~cCWw0Ccw zWxsm)qV_rmd#zoYJseF6?9ZLC{66pJpQ`^2oyj?o1`=70AD-|AKfL>);7-?H!SeGu zPb9X<|LuJLGx+I8&grLiix&y_u4nrf@o~mNld}cJJwl4@Jl0>&?QhDyJKwyDXJ?wp z1D>aS6aJXVeyyx|{@wZAfn!R0Kcz2RapiXJyk4O$v1t-oH_u#{?!4aGTSVSaM6X5U z)ue-KUavg*&Sw?-I+q6vdb)h$S6fB6w(77=^a+{6rqy*fSei$hr_9{zal>{OkGN@d zcD0Md4J~ptEAR09Re8u+=9%OqKY5o8*A!i+>JZ*lm7jUfahvjRPsy##lu<~R5mGX4 znQpvO?5%Kjpsw8BMQ$6vg}<0|!8Npc{`;F}Bt-Uyg!wdc5Eq1M5 zbXPj(bLF3jEA(G*OFv1NHD%Y`?RUj{c4e0_T0Y><>sB`E{gl7otmi-`Hvy zsxQspHrO!Zq~?ulr*oFY>{-)WwK#TS-4D6^Vxjw0GmlPbo?iNp;qr`w+tY35aa>z!;li)DYc9a>;{?eh6+ zlV3ZpZA#fz(t6n7z%zw=Guw{E?{;}&)4j|3Mfa}jYd>}@SsUeJko?H^!N$AtAKh!$ z`mjoE*M7ynBYV%pZ(H|in9Z4L66<_}|Ioc>4ePB0Zaw_?j;qwQ@j+(^>)m^@f!`fo zZ#x(I=(tq=22+J|vrQVzw!ZYZVIE?!{zaFYv*V4IJtfweJ8p19Xz$Uzy+wGH^F!Ht z22%__2FZOXuUPyqK;T<8XNB^_lZVQUe)#!)a23hk%FN+X-kQ*u@$Oda!HnJduksmH z^Ru&)SE#+~{PU<}a^9?M^E7uK+Vr=e-~Pqw_pdU(wMrl5VcR*=jsK112A%A7q%PE;yzHR*1PcH&LbxGm$+UFO24r^cAD6%EmIs$ z-h9@r_QqgY#jS?6;-*7FlTT%`nz__mT(y9shxg{u*)652y5=joGGksn`}EAia4X{m*R{ZJY;QGrS>IXhI-s!QfX~)>p3*Bh|1~6K*D}U)KiX~f>a~N2=<*90 z8T(kgr!CcA!pm06^_saWJ%-6oR+*&JKK6U-nGt~4@J-MbeD@j&k(rqCww$+OkaxFP_bDPYh z=3NQXwtL)&{<$ThW838TZ>_$s7QNlzy?bg(sC9JB+_JhQt1jJ;<9j=yV1v(L5mS!F zcmoEfE}6}~x18%`BQT0m(1jKQ@+kI-RE#3TQ`1U%(~gBm$q&ZU$ixKm(Jby z+h!gux-L;-d%5Gx41vjaCp?s~j@n{1zx2ZMnOBsyd&V!(_hjYV_N&Y+$M)#FDD_zP zc!Lc2Aj{%X*X!5T?%U9uH#JJOw@j~Sx9a-*f=g#hW_$jA*>I#jeYt)|!3;ZruXPH( zMH>TtZ2A+UpjbCs!!){O|LrBsCHg$-Wt;dnUYxmdNxz}v{^O4AGup1QZLenjcTMTY z`9(^T`MMi?i%(UD+%;9z!hOBxQ>GUk;yk~;lk<<#Z)H9! zK7QRyJ#XOyj_LwmyziV%_3Pq%FLz~SaDd5+jax2wA6eu1IAhO~Cy&*7mpWDcYV*|7 z5)_o8rV3<}#uuF00jgzgnBI_tx!a!sqUn1jsWjOq}W|mwWg9j4zAcoOavz zUgQ8bUlprjgy1W#En=+B7Z+_fKilAO-LJg1@W-wR2J82|TJV0c*#V8vhXoorfh=x< zUJ`5OSZwy0<#pI)wR}f&!pZpuUTUtk@BY0(PQ7dLy#@27zHr}e4^wsc_=<-$kdfzC zs$1gfw+*aW(Jg1zzcgR5DIrI;)}S2L*L;2d?c~JQFZai`Jdz1xlP;6> zv`yWzSY{5l@bTW8JH)-y1^Z3$M%dvFB`p_MmXBV>Z_s{mOxW?8fDp=`$ zC}_g5>DI(Z{w=K4w8K60}I_-(t^&NGlnzT|PL-M4bi zl8efGcHBL0ekBx5{2(f)?G$@3?8jSPyW3AZFJbu6xyY*c!!!LZ5Ne6tqG!MEx%8mz%cSOS^11~#o*2cc znZ>?MC@FNlmXvK>r5<C>lHz5+KQhv*%wbgy^^7Rrk9Rb)eB?I^IH4vJWAMca>GHsyyG_&uHJv* zEunkcz(2I~@v~!XXS1`;ug`Q*;a@PzR@C!q+?><0Z_Fhs%bzXiP%HnmbcM=?qYkG} zdR2M(O*)caaAL_qs}v=^dwN|N!n5{FE}X>A{P$DCe%%fw(YqRZ>$mC!Tl?HQJUwxn zcU0|zhwC}i+-a3PyS(&d>(>9#f-FNEA&k(iM*Jpj%b?kS~!TG7P z3?x$3%Tb%UUcw}$TDJ4#gJ`4O{V6jnD(64B z{5D~tRFvBL=gd`mBHn+0`@%)!ldDb9H;>1g6^cbVmM(AJ-?ZcM+u5FnGg}>j{}Wn z{(cYi%Zm8zvp#sXTzy$)`Lpm$?VZz4e*Kr6@rT7evwuN$z$-VAbTfH@2hx0XZdPl% zj@|nDv^R9BT79tEKAHPVWA8EWZGQbDlHHzta@bY#u(c~!m3%1Q5Vduq*p5$YnJ?R% zO1O~jn~P%vUiZ{%OV^56`{(k~f7srr#ha|zxb4<$rFd7Ly2Xf3;5S?FrxWF~21?=gd9&V&A;&Y#IM% zpOpV(Ka=a>jz;@LBj2r>yx$gHKDVoW#vl2A`nMP+NI#HH|F~e~bTI+Lf7_ew8#i6z z-|BA7q&DCCy;BNnaB6wQ(yP+3H4j(1J#y!n%547Se~{_vm2C^otcrPh<>4w{>xdo8 zk~x@Dwb~c9E&aA)Tl)uhQ=HRXeX~+|bNna$G)Z{W;?+O+R){*K1fQ7OC`zLnKgaR@O?b=42~V zF1Nm88^YbT{$O9o^HVjZY?Z3Vf^%CAq|Gw%xS{UH8LGH^e@Rv$%WCd`(5%*l7q-qb zwcu=b;(qN=fA4DI-nCQK&({!N_GyLH-Ov{+3qp<^OcpiZY0a9tGR*tnY3=pv*J|gl z$z8F1m0Z^BEQ702kw(|e%+|!khR%$LV4inxnwb2t&Y9Qt+}HONoBt{}tw`O*u6n`T z<-d!{O=Gnp?@U=@BAtHkzoPRa=E|D;GLx-LH+D}x@Oe^yvG1+5*Jn>YP6@cqg%XVypmHaG3EOYse}s9KfEvt?iD3@wd+)7^ISsjNM3U>({X zoV)lokLb4Zf2ZtRV<&QT_v6UMqMjm`^oaQfLPPd#ee_kwDmt!QBFp@;&~zG@v5j}_qAU&fp4e3pIga!C1|4P!=UcNb~&D}yH8Bd|2w^b zXIcs0svI#*DJQllf7Qt{g72K)T1Pp*o|k_AqDWLZ&#h~+Z&#JJKf6}jQ!DS?daYKb zcl$fx7e24~CQta|d^~Y)veDLeli&Up`E7Ug(eo)QrG)%8f1AQ^yEUH0`rbZ{otq2q z8$4w2eY^D1vPp8Yg6*4kXWrwv&KY&VxBICX^LxENIt5=Z7%|RSP+6OjBD?I(8;MYc zsKpDr`!BEhJ(>Hs!>mlUy5)y7T)GeB7`8+)9i8s9)`(*>&!e>mqFL82_u_cF@aDFH zs};dJ{8|29RW;1&xu~{br$qnR-!cHjr`8txzF#PNe1q4G z%nRpCtX>zIPHZ-FuGcSnCpY0->hh(R`?959#Bf;&zS&dbU===h+PS=#>5b=17i<={ zUhj8dC5z}n<7=vFeHYW`Eqk5xWhYNpCCB}eF7qhHss7uQ8uE{OO~~7zDd&>K;TnIk z_)5^E`sALxU6b9uUOMahbNiPIZ$CVeHQaUi@vEh!LXG7|Uud^y2Fl*3zv{G0zf)u} zJHx+S4b?9){uw%?s{X(DqiB1_^j?Yij_SD|)tr16{cVstP|7Z{PuQ}=eCj3J5Y~rL zFYUbVR6OwA)O@61YRXdAmdi}{{Vhu*{13WF{gq8AF4!;n>#eiJSGfh!u{ZBtiEf&% z&KJ0Db&31oGo~NEs_Cq%WYxq_FCh9- z@yhJ>#*ZB97H_y|c;kb`S;Z9g(!+kX9?K_hX_Z@iK3M;*lRs1Xc}?N$dzr$oGe6X_ zb$-zi6mv3<=bFGaM_>m~D>mDQ1c*_3OGI=hQ|Hln~?X>xFX}0e=iN9w5 zzZ?Ea=KpKyCLi&-zImy@TDgs{_!?!V&SaXpTt{%Dl}a4L7uOhl$0gGPQ{o*t_H=c9 zVSaL;U-8h-8w*{l*ncQpVw~`MLw{bA$Nv_O|L>OZvrhUiuY0Ne(C_`9E_lnE_G-uk z-Z(7tSW#-xQr(1hT|MjHiF}(C=3JlBTW>o@{_(}X1zfC?T0hNN^|(Fixb(!vLfPk$ zPybJE_{Vj9{ldrj3m)ee`uyR`&R@9buiU$u*@wQc?-G-$>%8awu8zT0-bo>2@An() zBHmdYeEd7Z?n|HP*AFdua{3dP>@Ek*Ii8-{yQJFfP0vTmYtcRG%RP=i-deIbGp~*P zAM=a)!djM>cE=dMbM6d?c~;1$ntS3KYviU7^FseCKyydDL|M?|9r?^i%nEpV@_oq#p+J}f) zhgwbM9}i^iSJ(Gnz%k#m`lrsWPW8*V8x~D^U$E`b`P*IbtYX~1Gtz@TwlZlxaEox1whQAlvzRtYuR43gl>61$wyNR<_bLPO z^{&ij|N87QUz}HUh2<5k$En+*zAs+Y5p`A}_MW@%y12N;fVFR)6*Yj64rF$GRXA4iw+pb$Id1BkQi+5a>J`QUX+2DV=XStc?{|c*f zjS}s_PcyH6I^(j|&s*;vQ{7Zy<*2<3WjpuZCk5uD)-7)xNSte%Z_#ku`j3N%^zS zMyW8*u7XL%?G=;o`1jT)|8NA<(bEV4Z@Zf+i@=Ie^@2cQ+@DpbSAF1i-znu}!FsZ~c+bc<^IqKQ-$I^R9;fjSH&f_Re}Fz9zBZ;>pe_uRS8$U-4)M`hV~?{I_o2 zvnL--ZQtGOKN0Q~+(I4T4|K?^dsj6GDs^g<|M7{a3`ZCXly&u_k{Iz}Qh2?aqcT&ghhKo|>go8KSs0{IO=Z zX2-hLeYfQzu6-9W|GFZ_-*dfG6T9-VwrNMMaKtQr<@Le3>=&nLB6r=ndrjLrD`qI= zAGI*Pr+Kn(<)p(Vr;1~Ca$k8fV^(-kjBek`)Tn1gCNndi&pTwYUhUB=7e3ROTvtq_ z7RQ)4PIb8UGGwXO%DA1Gb7#4(nYOwp`Wp9}jrm+GE7r`8TX1eW(=pA<#}cJD9oDiM zq^$G!l{d#nCyS3ausCzaEOz0u?VVy5QdEndOy&IVyHv+JX1U2X|CI0Z+ph%8SjXdk zUgew4hQnEFLN|y0Ei65#D5a)f;WT~Tk_qaIRzEf2dDRoBz2W^)#}y`OD@^ztmI{Te za#$+$EPDC1MI@(~p+yX`YzXIXTPLRP&y+`cvtiklDUo|NLF0u7y-jIbA+CWV+1P zFROBWIo1aBzpC-t>~JO~>trIiVmz7e-1r+qqSWWGTr z@6Os?F~>8f_H-I8es@S zU-a-zv8iJln8!ZD)*JlVPuNl9Ut7}jX&dk4go-e(Ev;^Boz@+dlqAhL!_Cvcr9N+a z^37d$O?O{z>VN3{=TI!g@ zG~L&8FTT5ZY+k{=_rKD@Q@;P6n_m0ylt9FWo_AYWcADjc?|D%=`%rzVne0Ks*36`Q?#dTmYr1{bz5IFXD9ZaLh<*32Is>rOi#`h%9=~4`J5JVoDtwDKk=f%v6X^zZiqasy!+a0 z@2qmK#%B{R7IY^*n7C1!*E~-Hul(0*p9sjlA={Ba7bsuGKZ+$AhzXZ}ngNv+M`2ajU+^{D;rfeO85jYvXO zp76{wtxP3LCb+Y)rmS41n$`dE{+d8d{)7jn*G?>J>MgF^SzLMYP`uT46S|>aX6XH1TtSG+D3 zsuFMe-V4Y4|G&-H$;?+};fvSzB7F9q+j>4xS*(9m{hSU-#p@l9GOGME!t2Ga?TWda zBDC;{`^Jprhv#|ZHO~_t3_-sCl zs9H`_*nCmPWrq@YQjO;C*1M81-D`H_61Z!_Hw`JQ}_WVaX?}hBFIkdFseT$6i<=|OjkRcqKqLvp3oK1*N?-SooUD6sI= zYK=UZn+XwV8-52${r=%N>h0D2hvYb`S7g5bTyAE>_BMXiwgoHM zu5n04ocH*)$2{~tC{oPZ_ex^UoF>_E;KGStChU9s?@ruuEzA9;Y~(gY7A8weCm{ukha8$~ zeHZ%XtPyq1)zDSo&`sygRlLB>5q_F?Da)_g&$DCSdTsi-_*YGxwQ>Hv_qF%GR=@9! z`*HX9yyH1By8cl!R3j#M@R)q%T|VoUapzi1^|xOmR|s5@DeSX4KC4K1rBD22zRyku z`lVk^Y+Ian?EbryNtx!_5mya!|G)ZHv`oxV_4~)Y37PIQ@92G>aerFTWzSD8O!Jmh z`xs2$Zk;FftyX_?*oGA~{R_8GDKwqzJ->%(ZQL>SKY8kpxx}Wu4@;Ugd-17z55Meq zx%F}dQxW5V4{LbKS#F<})#zgKSgl{#NBIOXVq$)`A0 zb;rGaV*E0cQ-AW!XVq(`?A@amu>7Rt$JsGolP^zeng7YC(Legt_aLv;)0bp^whEFg zfBqq%fA-s=s!Qv7pRQPHwL4Gn%(~V0rCT2qNw3~8YtLUtgKe_jJDjz87IGwB;>&&a z>U@>5*5ac%(U}id8E`H$@OgD>=QXz&#%r%cpk!^Glzw zOHa$RsDJ*_6$cLa?l^cT&2i0&jMe5APf}kba;Ye5ZP8(*|!Zrw9=NhWz7U+;4+>wHedjOq=$k@BO!(H`m4` z&2ajoQI@c`ckYd&PgJrR&ly~wYI$|}=2=|%%y*(MW$yPVubg$|oVW~+Rbd~-dpXTGq2?j6U|-MeNVnG^C?;aYIE*9@DR-pigj zRcy<3F$_N{ziq;dsBRvA5nHM6aay4h#19rpuXOrzb(IF&g?z=cYqUi-E>(Y?KDQb~IfuqS1CezM|CgB8jH+68q90-^w=@i6=4hAb!GS`ub!jY zm7H}h`$y5P81D6|DTWL4K5gAKz;;eao!?*3(`>7cN-M?KvF6 zHR)k*#oX54r#9O^-Ym2;QrfOAKUv!R5nBLyVrS?(>t*@NDvntf2B3k3p<(lkMTY4*J ztlw8Vy>)!m^7R{UQTnk^}&+WYU6xWn# z%b(})%<_Gnb4B7z4NHCCk(6cog#9%RAJ2K?I{Dt;rM=5}-&RUz^SoWZHG6ZA(IH9m z7s@_QGB)x*(WzOr=7RYB8#9`{TK{h8J^zT+kE>_%OBdOdGR48lTRz$BU3EaPrJ7;> z#Xe8f88_Fc3D(^EaV2F}ul^(NHC0g;?!={AyxqR+rf=ECWUFPNp;uT{%gy#BJeJ?W z@tV=RG*ftA(&OwO>TN#W)25ePI#uuRQ~Kjoj(z72@7JCADLc4T;#1%AdW*!Knn3Qh zcW=FZzFg2+d-&M?NB4brb*%4tp9-?EG0=6}oPYC&^p#bI|2O|wd1qbY0(SWg8wI+r zbl<AnFKYSb1>9({onLq^QC<` zGjjeoRcE@cyDuGhxjygl^&j$V>Kb3R%-
    =Af3twXn}r9SoX_KKS(t+gwc+?SWQ zvrh46{Or#Y0`hLXO*NeKO>1WF{pg^;RgHqF-b;(lom}?oSM8>gGSRC-)~woaH&jd2 z>xfwN&$Qq7CKR3BnmW%e{9A?2`DU+G+f`cV)~f_r*Is#cpi!5Gz){U7R>A z$E(tJ_siP(h6QsEPSc9i;?~_cWA7dnyW=kp9PH2$UZXA76{SB>;+oxgl~q?G*R9)k z?e$vTu5+^%yja8edb{p)*0mWPg_mZo(3$S7yHa<~)*{}VNXZu`x)$zQv*9V%&PnH_ zjCA~x7IgETo-1=}nZyFaeL-QjgW@&xm;Jq~Rl3cDOMTOc36sz6d~2nB#zJ_j`%+IS zol4ftIiGSZ>Tg7JbDsif6^B^bvwj}lxgtjUwa!kzgz0@-rri-ZXR*}4ocDW? zSJ$bpYmRT4=<)XDmfO#lWE&q`GvRhX_UW{p6BDmiS{`0^$zt-l%N}ld+^naUb!@QX zV9gB;cd0qQ;l=K-=)7rfzxZEY7c0AcOZmoVpR}^+&zG_X*%c?YZ;3o)m{V6cCG+uy z2dVwHFGy+Nh4JqY{sa`G-K{Gb@^rZ=8ecsgE7atTWp4_>sq+hps>z_$Sg!apm9bt)tNlrX>Uys3<5Tqcx=MvO&8J77-Er*o zvij9q&)75=9;)t3|5JC}UsWx21E=|UmB)wXYn#2=&|~U1Y4W65>iO4i?l`jN{dKEd z_k_egh}M5tJn8a|lr2lnrCh$Zg6G77-u>KKn|L^1@x=GPPAT&J_4SI;V|J;nqVa8K zGcHUmy*u|{`!%I$4yn%*i)VACEW6$DMCal6tkRu1(S9dZS1M>MHhue~XxHI0`mTzu zR!i^b9@nkR{h=DimU#O0ldsQg%GvJses-2Ts(*aN9>;eZpY-}XeYxqX`}b_d`8)y9 z(~{dWBa7yr#y!^j9DzLv19IJZ?g@jQtfA%s|s&u`de&v zKvLRj(}(hDbslWjSA973zVks=d-%D>2d8dME{GL~OIF;gwr5i%d$`=S2dAt~ycW7= znAusaIp6Gq=f~BLE7w@Gt~yuoSYn;U;q4BrraLE?lx1c+vD!}tG=rI z7dABSkSbrm+CIaOGc8(Q^tSclMZZsr++9BrS4y;h3%IEKWrx-+pNZ#KUaidF|2TPZ!4#q5-bH?E z^!t^U{^&ax-@Cf&$MnyVJNoy3FSd2~!`}H{;PV5)S05w_+0u`EJyl@4^hg`eI`Pwf z2fvj--W(2AF*|nsr%8oqrYv(_Mj^#Shfj&mnih_NpjKL7%qKh zV&NU%PqvkN6z$sBcgXea)$HHi%HMzd-nsUmt!_P0YcpmG^`(2(_Pyr0YURDvuBmFy zV?)WKXC>U(=PkGTb8F^7UG?7Rc}wKp%N_MxdgNa673-CpU-kw4nf$!?^zxt92fs=_ zs-N~l|AKD(lIVR-bC#zcsa?kNU2^G>ePY*@h+aF zAqOu%w^p}T`>GyezqHAIag%*|LfygQPu}w;-~Tk{&%7?%u#gg^kS}swGP4g{^mIKw zMd+mS7mx2eRw^nQdMf^<*5aC&aLK2_yOv2Cr}gaY=8QE+>z!7+F~PHCHJ4#$ z(#$iidvC~G(sx=O^4M=?dtzjZ@TMtlYm&C~1d6k_&cA*Bg}=hOpzKX+lxE(q`SbVo z0w-=e$($X1B5QAYGu6*O>>@XxyD2eG{b)$`&gpJvrmo%?ajig_eVV}6iWjG{A8p(p zzW(gV$EQEC{y6(5Mee`E`V)`mKi*h>^6~6K+nmZj*82Y=OPXFv@|x^^&|qP$V6oeI zowMrm_dAQ2#ZIxs=;%i1Nf%DdahiOmrn#JeFvmaONdH3B~D&%xq;hzS7`%{nAc`N@+dTl8 zr!Kd8uk!ifoD$vBr|tH}&6;k#<@{<-(U6R#ccRiRDTbVw8`Ey+FB79=8=>m?W^$a& zB#}u)ESZuG`pp(!<7P zRTl#yDwuchme%%=(!#Rfca$~OhRx-NQkoB!C%6!*`cX6?CS zt;YYS{-d<}($y}HR+y~zn#G-1Wb*9k!aaL-y4@2>YqD81)9~lFi!1YIMxWVM?lWtv z(Ttez&1&(Dw`aU>ziBgR&A#uSbnMS=uAP-VZBKCbWE;izO?^)fO%brTIvfYTAIMpvCWTM~ojpV;!RAyILM+T|n-*}9-#E*X+WXFkaM4pVvm z_(@2Kd3tE$m=&-lqZ$%5$0q!o}v0}-i3DXl{eFFbF2%y zu*tB0Q!8tm*S_hQl0Pkfe`sLl4ptSo<;c5Ta#@8$mx=y~;^QGESAM)$o<1prZ(eHD z@vf9<0b4hmF(~JKlptE}c7$K@+cCla_c@d|JW6<6)K#sve~%VaNp@l2!YJvXC7 zUQoO$V}f96vc)uu#h?^ld`E&T4H^n(u(_JU5G?3Wm z^Q`zw_{P;Inyl3h4 zKxf0%0DQ zt@Eu7dvBa_>tcX`$nK!d+aEI&9$DLQv~sg+muRO21+OZ7Rm;x$q&Ol~W2vq4I;QpJ z{#zsrb>@1jer0WrHIDtfcjqO3C-3{Nf~xIp+PhaQa1s0Kp=u@f+p24|I-i7@#GE*j zzS=@%=TAYuOv_F~?z}0qe&VSlBs1YeTclZNq)y-&L8~P>f#+_4@4Sgv_F{(fwI%Pf z1(mE@t_STDlojj_JSV?DY3{dY@rlhXyi9LA_Da6(TheO#b{q@ zcoyH!yu8e}f6L2<*WUd{NSi?R`#Y1po=tH0 z#?_-7nVsR`Z+ri#WSNlX`y00R*p0%2lb#3Y2ydUdn#a*w?dtTKlPp)oZ1l0(d-dcN zfy1g_^`ehhJ#xu0jY=s#h{$+y!44|iSGWd8E52z61VJHua+t3{XM~~*d^7Z`t~cHn0LQxm=0T9 z>oZk*6}nK+|4EyXrFDlvm_){sZI2ka8igb_$lkx({Yv`W^8#TurmI)>pJLE8TyHeH zbL*n+A>o6S;g;D4j0Xg zZLWS~U^~_t9NMIKIcaHf*(Ae-)>>CODuwx;wHWR|oyIu+UE@wzaA%W3jc zsRi{}-4{2gPVT*Zv+Q+5+6?tGEA9ImIs?xJSBD&YH0j014B4<-QVE`c;rBWZv%S;e zzq{q|tCVzKnInq656x%pVAlz8v|SZ`e@aa`Lw=yMz$_#C2KGpuH5D-z0v2tO;5n(z5ie+u1+(SzUEce6Z0eGcYvwW-X`ru_Q9*d&+nn~tvk7w=nT zr_1}cX-&I7r_q1f)$5PMg)bY#Zrz*lDA+=KhVSzV-UYT3lU*`*@BCt;yXe5fUndSp z=4P-QtVm&F{~#2+bcy!tA3VoyaBS(h@%LK6rA*IFJ>{DUBjfs4tSWzfC#2@qk<(E> zO$_&DUFbPK^M}&DBO;fbCU!=9KE1#CPhyQ?gZ;(N$AtZ253N4+++^d_?bZ)f?#6vg z6<+^nb=*?T(}#YhPJF>$wz>U@wwhhr(pNL=O+WbV@0eCqb-KX*bOFPCA&1vrOC4*N z>+_QIvaYVVe@)`Yy4wni9c$$4Gas;*WF7sM`^f!=q3tUDmpjx_ONvq|f6WR#&F}li z$Jy{f%AS0$KP$uT{Z*@L-7hp_?(Qh7=A+l;ioldC_h zQ>bgNH~FBS6LYj#{QRG4QCn}>Ty@RkWuYrp)Guuo-g(Y>UC&-Mrx}aI{`%|A7Ug^7 zE9A>|@55W`LX8yLs=1u{!6~c6pV{(=iZye$R9d#Lnvki~=A%E?(nc+q$x1ckDVwpo zL@sD9(r5i9m&-PC!bN@ygI<{Rd$`}zbPP_*obckxrO6%E%{}EaGrc^X1teX1m)<%p zW9yYuInK|fzWUZOW0QmB@>F5w=Dtm5%~LmWg*?5Tvvk!F*JV1P`&Rm;dF-4vW0TMQ z<=<0pY!32TWt_TGEpkHAca@?}JKwo!JI_oJ4LUzp#)7N3P-SB0n?+A$Z{6P(boQ#y zG;N-T7Gc4UW+$7(YAJ+sT@%api&YbozIL*8XVh}%{95POW&6+RmaM+xwEa|m)-snn z|7@02O?tUt&BV|)6H%{7OQzs;MTVQUXiwX^EJpeIr3h!aZc*ziXZ7;>`xgoGEnwUd zb8Y6Om=*8u`CQO^?R!(@`el3PFtc>`(myLLp1L+~iZqkj)cVo%-_$?f8r-UQ(~KLI z9-U&g^I|byqUGV8T+I%0de+fWvTn!Hm>nFGvVMTiBjF9Q;vx%4U4x;?d27lmE~$)&Z?@) z>3n13G~YEdH!hia`m6e+vL|V?6dzt-axQ8&&k=12yIP*P=C7Z{ZPqmrXU;vHw!X|Z zd|{4hxLl>?#@7+IB)80U$%)}gf3jN3d*=t)^G8G@PJGgIKb~sZ`#&Z-sqyy*K6a6&% zPZm1gJNjhal0#FzpQzru=;FhBkFskdk5<qXJ^k>K zw9^yL;CT}#N3q;7+*NQg)~<8!7p@4C!hV~xP3HtHr8nOes#>~E^W!0{yG|Da`T8Qo zC(OP4DCnKXy;qTujQ7eG2rK{hyLfu@?MCscdhcMsTJq_B^7cV*^{<~pXwria+8Ca?!C@D;gP%*V@8#r^fYtYd$W z({GyvwhM26vItnU|M=zoGTL3grhk&%lle*Pl&Q<#@(J@?ZTo}{$6gU$z2dsw4&(8Bzcg%9mFFY^jD_z*!Gh6W3S&7HbQkklkC|#JG>fo=X z`h}7I#Yv+D{YAE`S964Do_{@y=gX6y4RtfG6vwO=coFVVKhu)o3~zQ9;F&UpWf&Zkp0-Kjp^S|Wd_s@B{;y3&JX)~BM@qF{v3%aQdbFSI1>v)+r^{4I0Jx-tA zAHO?G`A5s{hf+abe%D-2N-wnP7rZ{_-uXg9F}^Cw@@aKkwVsUB z)nfnCk2gQOS+P`Y-tp&$Lo5FTT6{TPxku=l#renCH8r(=9`r0XtXXXSC4KP^?p1&N zi*5^If!;unBTL)LMBoZ|3`T za*+)Z^Z&+pMm|}mbGE>I{`W##9r4F4I!8ALx$FM#`~TtY<`(~}_Prf(zaw^br$`>& z!1n*?=6OlY!QJnrn+-Pn+r2mN?G1~z>(%b8l`FH(c$;2#mF@i#z4_CcGqwlpx%of5 zP5QUP<-VS+1AD>Zm^!ZF+vhzF%S6tceziCK$*Vmv&u=c`y|_qs)(uld?H#XnN(oFb z(3|9@GvVrvh-(QmO%gY+Ia;<;Ds~fJ_0y<#F+m(G$HJy^-L}KUY}QB{K&fd^QGnf+j%_yi>EwL z^?atfx;Ertw)Fa`f9?K+T1lL6^O^X1XP&~BvprYEVwBh3&@f*Vx@}?XA`1m;f$4m5 z`s#d^?F;{ZVc6Wwmt?i)#U$pUh`uR?tt-L~*IGRe@0ZsnHr9K4Z`x@5ZUoqJsq5*l8JFkVV{pOXF$qeWkc4FTb6imY4X?vkO=1`n~mB#)l-8t(B@J`ja}FCEHFp z^t8xx-u-^Rgx$!5FHQ2AG58K-hX0uvA#0eYO07&iWRTq#61Dqy0B=#pEuN*#{AsUuu8iVeTT%O)qYJb#9xvcZWKsl!k6RfB$ZyO7&e6pJ*(0y7&8% z%#p(?DwDP2Y)6Z)mb7rbTM&Ig))EUBw8kcpJPMbda z@{Fff{QX5fzOk2<63$kNI^5O#n&-5oLSN~fITriRf6%xOx@5*Pui(xszAufTc|}*2 zamqzK72EoJ^Za=q^<=@Az&)-nkvDQYX?XAL&?`)kPqKvKu3S}%zDP9qBX7MdgImw_q zKa=l&R=@Q)S#N8(c1paj-mibn&jg(dCw)p=k)+7ZWBv8p{xsqF;0}$2Z!YwSif3zF?r5B)zkJcHjm&MKY|9r<(s&TAv?Ov>{dRjJS;;%o zrr2b))yaI8*!^T{VxMoMnB}g|N4|0B9$NF4>3gS88|yCF&l$A}$+bd@S9a(xFH63q zE~=~}W0TyP^mluq+c8P4w9d-;XG0u6Dw`@xtZdaXE~U7Z7AS6seh~j8KIqmK3yFF0RbH+ae`@R26I{o=mb>b%KE@Sk zHreywvKgY=7ID1$^y;MPWr0s>p3^T)m~VaM$f7&>OBn51;({OfeziTNyr#ikMthEU zPRgz&?i<1;OpypI5thP18;@GNb zVG*VODm21G`+q)f)wx(#q>@l5Ue3JVnPYGN4R@(O9w8)$kRx65UpCIrHnq6G;y(FTFGiXjeRGy3izJq4jo)X99Ou zD}7YcUb>6(aH57&^v4yJWxkaf5xXyNb@U`khJ`l!N+>2@WInje&1?(5+rdt&IY+vd z|FoWWeD1U8jaSx`>Btn^s5D(DE%P{4F}YMDTzvcGV=W(*E*fh|@Evpeogfn;VK9-g zeLLs!11r}AOctH}CjUX=b8)#{YmP>Q2CO`sGOumRqBl!=CmKW_XwlS^ySzr#P~N9C zOE$|wV(XRVIdauA_nSRi(VB4Thtt1hYVLWzp9pMbnQb8KmwxWfl}L5gRf?CiU4709 z7qZPcdF;tIzXzL`rW&qxd>Ut)&v?CX`sT!Ke8m+P+Mlj$o_~GzDiJ5X&Fg*IS39=8 z>XIqg!jRU)xi;k#liHc~s`hBDu+E=z@0AsJwHwImG+4=29Nl_uTB;NCmMu#+OIUA7 znRINXw{lB~MZ4`+0YNnr$1@vCrrMv-xh;~`rpWOQR=u|nywhTnp&qM$_2H)__37px52kL)Soh?V^Uqfs z)Lz_nO~hI?mOIa(ZJ2if7S$k*(Ilgt^Q0^ej_;L+d*Ta@8>ta-zKwy zQ~yABpU}BUr^AoWjVa{V?NcEcml(Z~{R~G`w{&IM6WzeS1)G(MKk)2HadLm5@@ubJ zVpnKIv$+RnlhvM^mn^lKc*AyRzF_&ay>dhA)TxJ(^!KD5vVRa8XQor(b!FA&MSv!1 z?9t!8&U+l6a9;QKdGRzSbiVWl(dDLBxp{v~-{Wt((EQ89S+!O&4{nrnNY;Mnm3UA+ zO=St6{if{^xVZbWBh4Bv;-kiT7`{pULgXSML zbN+AqZ`EBEqaw#=@-bv{tnBHqgZXMQBE}~ymKT{>Dc=xD@%FfGuX6R#+-cWyZg|ew zxn6&6zsbuNr@SmKnW~kv%jK|^%+6Ra{p|tm?LMA+t7R42y|!-nI=^dIr`onhGtyhl~&L-8EhR#vvMX)P)v2nBpL@7Zou{TG^7+(}eQIJ#^Igxp(tLVV^zm~az133Z zBfWPU^ZB~$iRk%Ts`HRXMQCpPtNbt5uSGBYY|*IYE1Oc0#lCdewX!ptGOp|o;dyr5-kqslBx+jFBg64#^R+o`2i2xMv`EXFEBw8E)|5ATqF>Ux zw`|;#_`o7eH1g`?iN-GB!tSfi%**TdY*Q{f5?s*Kw|rTd-R^aBnv*X*^<8u5WYLQ5 zPHmS(GtXYnjGB4G{Z|2(-=&XRQVw`Z>CM#aG7!#ISzO#|x$(@wmlmPNC0Bl!e)QCl z%Y|an-LdyPfAU#}a0XjkK4Sb)ColSa{;V@KZ%@w9y>s56Kri^A$KuYk-DT~cI-cAt3vavdA{6jq-c7tfngkN50pdi3Zb$NCKt%cKAD8y`8$|EsoV#s#)p zUJVa#Mz(Zce(iTo{BFO1^jzhQi!<*WDK3=Mp5(W#a@pj+zs2RAS!8`-Et-&h?K$Pnn)* zeCK3~J9aNhjQ7|p=`|4>wz0Kr?E+IrqYD7 zdWuVzRpo6vt6BIqxy;kWMz5T$P`W1Qfa;~6ntH7{JI~)xo%nmrl$@RCy-!a2-83a< z=kCZnk6rt8Cg^?-)x25s-9mNU-`TN3JF6q}PE7ngtzp}p@*ACRAKWQ=#q)<<-_kz) zdtKOL+fJ2#YJJ)^_vi3cK2z1Ud(u_8va4S;M_t?QY1gfgqt9amJ;G`9w+}GWEI6i$CN|R$Q7q&zWuV*0;t>I^JJsN~xS{v_#|5PS%rKV~v*- z*tJcaE#K+N^XlL&kIZvP%~cz(>tu9EU1{Ij$ldhyajv~cr%sRgr&B#wuStiT$XvVE zAlO0h_Uan1X?r__8@35Ig=tLS{d_FHAY#pAsph^?y?hJp2Okmy-v44_f1mO+U|ot< zsO6n=Ys6f|qHfCgZ}{wSu(>E`)#vMj-8u*6Jek(P?R+F|`3A!Z z!y>mC4~;#yd39@7u6}{90&YRhl4 zuA7xBzT=e-r-Ab`$&zic38~L+vF6#F*E2ZW5c}X*X<1{cXO!q9GwwG`+c|HtK9iX? z`v!;pHOYS&0cn=er`^8sr0WKT9BSA+r6ZWR{6M4l$w_{Pyd~BZKPXOhRDbwc<%H!2 z)=d(VKDY`s%lr`9m?0E*&e;BH*U`mY2gAHxblwtWTRZ8&L?ylH4HK2ZyeD`FhI=M> z2=3{v2ui)@aqHTVKU=vsr>>c**cjA zJnyNJ({HyP<1n6hx0Rdch_`{v4JY3w|FxXSg%p^o8Tb z%{mp$W@_Dco(dXnZqD-)lf0`Ww%t-XCEx0x!S3T`hVIVE2eMLh<-LX1Tz)L{edlV& zJ)dXr3f}vB^WUZwJdb2G)LV5pjhydw^z<};PFu23^=+)ry4|t7->ycqA38ioU{3cs zuDKQcud1fZ{(8`^YT{*=s@AyDa}~zT4;@lIUOZQEQ`bf4?ZWA$RePUq-FW%L67wh9 zu3rt2k36HU@@uwd{>9sVHc6=#8lFz}3d#o=Ee&_~-7|S9U*s~;!^~KsdTo`)1?SPklt;hS9Ujn^v@(EA2n>g)VMnPSz&#c;(`|~sh%l* z4>>zNnne6-n;7@2bKm8c&);<4UYfIut+`^hjb818cY-U|_MV=~G2f{A#1S#R7lJEa zCoa!!ep8Yg@M+umCHLR_e(N?-nCth8{a;r5?O)E9a8qhV$%Si%Lj9e3^)sY0rKDG1 z%sk{>C^bKK&6#%2RE9_H&88-%{WI20t=%ZSCN@H@vpw1F?1ekKo;{5yJ91ud*)(O@ zr*1QZ?*?y)- z&&yAJXV71y;Zfgru}?5}m)cg(x%W41P1?G9W|V)XhTFVz*_SQ#J4?>V@zm$8y?W(J zyZPtGT>WJW>woAQzxitFeRyM)rDDnqUN?!#kTm!IE@_82FZ3Vo37e5_xvHcOGT543{+f z@?@^d_6vZBf}Uo_uP;*;Fv#ac0E_NO=tBcW0jvhDSC(0x392ZJg(hy=Z@;^Kwf*} ziVx|Z7MxFWQB)ajWaA!mwMDqAdH%7AHjhGgCs@sXZe(^|G&*srLgi}N&ueZmh8xzDGF|&rk@w{J zvpvy51?iJ^sK39*Q&@kG*=LK%Q?27uf-80fFVji-&lYj~#o0f14lUa=)wfcbr{Q*@ z#T~|{1?tkpwr84tNA54ptPNNBx;AB-bos#>J^Q3tPgdW!SpJyr#*q(;`}Ucima+Ie zAt2=Tixp;*Y}J-V>3>shINM`)>bzK3uJ-C_30G&`Ts<%0czsvs4(qj-&U#Kgmr!=Q z?BJCiuiGpqZ@*iyMb~?2^^Zy?IrpV1n}X*#PrdU@Bl4)2kLJz(TJ{I5Zt+jj&9#3D zY5z3R{>jDvEYyPc+owZSvqf(+d{-6aRTY&zr8EB?>(MnYjMrS;9Q`oU@zXqE*UEoC zZq988kIwqAWwE3Ev-x`^>>k|b|M|1S^v4X-A1&$Mv^835bu!iF%$rif{ClCtypwCb zy=gkB^D}4KpI>1&ls)dChoS%lu6uIFFs}So&1P*+oKcr zD^%XMEc*VwL0;mYCgXmtrJ1>E+h@*bxS!i}-dor7*82>TSQtK6jR9~m!D^ZCFG0W$qg=h;>36E)7sYhlYGZdESth7-0()? z+UajkbzgWcIA8Xqq;Pw1&fJF?>;*dQGHV+6Eaa+`iYMCM4`ebgu+{e{5#4&&EQza} z>2vq3B+uv{x{Y(YVmRL%3XK)MvDiZ?fa$l0Y4ZLpmS)Kpm&jTagc(l@%Upcj*|%`J zqH+xDowqw4zGDjCcU#uu!NAC2x6zQ;ODjTXkRb?m(ravf~(>CG2%@_;m z#JdOoHf=j>$+>WZhgB!u`y85ELo?~`_0jg=c2jCyE*2(%@^>` z%8Jr|UchS6IX`ROHO+)anK?&S+H5twz`fj2(63$5Lb&hvO#`9x4MjGm>(n0I+{5wg zfXN*0;tTxT8^qQfV2EigEs(u_|HS!RiI(a@#XIf1-!^j|{-CnIJdq{tc<}?~op_m^Mb*ZAVh^>>3)e$Wed(W=!> z=GtG%TJJ5q;IHw;ueB~};r~?^&TD?rYpn}h7$5W^T;!K&YhCQZ`vEV^MStZkQy1s= zxm-W}SL4iI<)Xi8TmLyMv=4gWFY?Q{^`Fzi{XsA4HNVug+AX+nU-Jt;*Wbxb{})}@ zZ)AHYRHsn0^N+hgUm@!|lP|kVv3r`Gl7izxvs2gSjzM{RAB`Z zcjy8~o=4hxAC^w+xO-%JW>FuP$x4S9R>pjE42BiA3#lJlB+Cp?w4 z->6y6RGYr)K&nF)SjifGmY_WxZI6x`u<18) zopWDZX!(4Hw#D&SPR2bVN;|lcDkNh%rXMca!*uOIRz!FBp|=&Hcbc;wB<_*g_F#UZ zdK~llM_WHgt!v#|A^UvS^~1|6m}L$~KXl*2$@j>rk|9H?I z=JrQ(E!f^4;@Ts<`lFm3!=3Kp5Bd@ZzDgYAouhldUHsAC9WwFJKDbExm(^( zga7p`+aIXi>74yBvPL96IZHq9D8E7D{7=_v7`8v`-yzHYDEY}D*(u%q!PPZQyB<%z z!d@PvY3J(vF;lAfd;sgesjEIl&T2bJh})$#vA%#U@` zy5DEM{aCx!`d{$tX8DYzKNgya*k3yK;CK{k-J;OP%Ws+d@tNH`Kb!H7Q}z-4t*$?& zmT}gtjcxmX>DnW^T-kTm-yO~0!v29lK4t$^x#RD*#Qxa(jqBfnz0LMn|BuYyvi?K* zTZVs&{UKRWQ_*K{c(yxc^$1;E9zg}2z!F1MvP{$Xm)QWu7&zeq; zS!Y$W`BjHoumB_2So5tDSs7>E(Q-h1-|ry~``<+09>CK0S#4yTPlMa^8FI2(Q@w z+vL^bd7ia*Kd+d-dmh(aL#YRGZm#d9hP;XMRedL&vEX-@)RTJ-OW*aDtf{ukm z^B#sglXQP7w=XyT z@~&jrz3JyJ^)KE0^`VKo{^Fg#PCmJwoiWd@JL@Y0>lfCPmxZe?Prq1Gt9teIYRwh* z9k{%#Wni2I&`wdSU;s$aDeySBM?_r^pe zJ-HmTn0;>cm&K{a60FW!%sXd(>>}$imt7ZDEbQ)yEZHcyz`KX_i@LJk>E6^WhjvT} zlM27I^jPnfQ#*R~jNdIj-P`_>>#<=}u8nKBl>WugW3RUytLR^6X1B~<`u9tz$LzbV z{b;^c6Sm)bSexciE@011CyM(t)pI^SJ>*x2olXSlvjQRJoL@zkL;9>T{Z|8jz)ZcmB zU)TO^vf1VSw=br%{9RtLnT_-8(>uOC4X3``JtANbIq~_A%6ao+6E1LH=!$Fc`=V8{ z^!ftzw~aX(()P8owL?`a7VLx$4YU{Lz7j{2b_Pt`k zdt)n`zr0CNpDsIk7CK$NTkc?AH#_%MOo4F8*8Jctds?Rb7g@JP%QItcK2xk+Wr{_4 zLNH@3PvsZRFAL5uu&?Di`bBlYHP_d(rUcBLa^d#F>vz+(amUP->0A4>uf2P(P{i!S zocNQMuTOCPtuXzYv$Pe1?91pEuJ;=ke!cdKA+z=^zq!()+^VA4iO-eIax(sI`4`#y zDT04z<7W|3^K51_)o4-K)~mvrVMpDQO%0A_O$e)U3ELgKrtd17{LHI`eA-j?hk4h( zG{{vG?w+-Ep{vGxsepIy1N9aKzH50}+&1M@S6Rm4G|{uSSo7}OTr+ovs4Y|e}~qHK&I{B$v+eRd<_c9ny}O=o-bl`;D7le^B6=6lzg5npIjDHwc+qvtA^w^ zbKIoQTAp3JBdOi2>{?pP#WkTeT^n<6wY=fJcFv%Iw`$X!eOba=y&{?3)E)j|$@<_w z_#AtIr~hu6$}%uW*f1dNw24KVBR9Z11*?K}jm6a9>|oHA8}E&+laeZ@d}7<0l-c+p zO!H6%`*EvKNyq)|8!oj@IHMwc!2U^jdW}Kd2lgL}W!~p?J5DfCnOu9P`km$XclZAM z`ukWtX~wZCCS4xZ+ja)uof5<*6%TRkj~MzV@;=m zx%ZA&S0$%P+}dupYtyl%8zl3hZ|yw!mw#UUiE_zfpRWE-TXb5(cVBvjZuRatPOA?+ zU4Qtn?7RGEYd-S}t$9iJ9~YhGuAQy0_vgu1N0YogzbMUhXj5EVyHKQW<;~X&%x^um zH7`7WfPqc&md@>Gjq7q0@2}ai>qe)f4ELn!pE^@66?^7O{N?O1;E9vXPT+Yw@rsP| z%9SCXje{mFW_vgHd|jO6d#M=~>o+gx`7YVxTsk$?{RaChJ~#cljr(31S24T#xTFcuXIEU&Z0z#>?{#yd zMq@+Ok3;`E3t#P)h$`Ubj4E9nwqz&st3WYkO)2Zl?|lKfCjR347cT$6dNY`()~P*8 z)W1-D(=(;l&F4iNR+)U8$dYlj(`4=L3CbHazf3UiKiPKVaGQ&n((Jwy&y+U#osv9p z;f{O$v^AgWJ=tCatLQWx&t&_R8M8yq%;E8)uNxetrmt(~y|~?{^=hJUFVp1K_Ys;R z`<0|0PQEpHk+jFfRZBR-Ke|*)>^&U83^|UcM}Dh%Jre^%7b|k&M&EdXd>oHwURi#2 zD)ucwk=w6cJy-ifw~0&G%yISkE`{JkgPNIVp0DFJjh^m-dIZb@)FWV8li%DpVVJ{m z@CJAA!_p@qy+5~pP!=^im-9rj%>Cb$?|)`~`!U7)tu2RT$mZ1x|1YUL6EH7zhwMt1 z6B82G-~1b1ko@X%*nGwNVb13QUUHp$f9Yhy@$df>9_h*GT-L1@n-#SA@+)hN#VN_H z3uk@psgbPOTe;|G%fbr9B^Rdigk3Jt{rW7(zDSozTr@;>*1C5|vZ0$KG-kfA;N8+C zy_`?tn#7!WUXL5@cXjN!Qg^;K>0VNSblMv14FE^3Em=Km3GQ{f3T|0e!EC!Ob(eMs`b zfZ`h}Qx1o@6^ZR#`HKy-^258uSO~Nw=qcWnA5tjA4kBhCYd+RSR@a1t&;9>Tp`g8> zf;a!xC5PZyJ`Gb`esOJUV^EzSkP(!zfMfDWUn7H=oW{ZmTdrosmu%g(mH*eb)tdoK8W{L{}lJHP*VXSx6W_wu^) z!uS5%&0e3Z6n0`mGiQ_K#1sEcox7KjTKgv@9XkQ z?({yas6OM%HO;hVd3k2-L#w>Ght~SqPIR$WJ)?gldiskz?=`+M&sLp`xhiyTk+++} zmM>p-Z2kC6*X6nKD^B&pcQp_0*%KN)_1Ut!OPEUeR1e$Qa$U%}JiG5$O^fv#alKg+ zZs<>#nK3tYM#K#D3zw$) z$OOrmmfaTRJ5{q^a%%!h_G7JPF3}fT+=Fd9r$qONa#%)qW?HgtI%l@_vhVZR6@igI zTYGX0crPy(IHJY={sCwI{xc7xrrK8en#lRykLbx-!}p-d>RN|Lv(y^JJyT}id&D_+ z_WGh?E6>~2zwUKN%iK}nc$RQku}Y|Lo;h>F3HL)Oc7^@o8f=pdA|2P4Zm26ca?|u^ z#BvF9E~dyj#wijx=bCZ~`ImQJ?C|A#QQ!S3^2)ZQmrfR_Y2Oh-0q)+I`Qn)nnvYw zvV~8Uncoz6=lvzEM!0W=DkDH>DRYpLcY3!0I*k zvOm<_Ih;E;vVHDj>E#EKug2d`zmQ^nH{IassTzd_`x7UZgx72k$lbc`U&Fz}6)hE> z-!|Pj)MRnyeDSV7&TRb;3vYFv-Yl8#c(8BJoaNGXISD$m)R`-++LzrrxcTR{Xz{mY zk2RMm_C9)^IcL+aD%+>&ALbl%|7dv7r|Q_XCAS}{P0p(>{?hU6jZN`WiHc)CS?nG? zu&Avp3EHm4`yeg(<1&|ZBko!9U2XR(lNA-XcM3w99HV6)^x&7e$hv!X^JlWCO(u*{gDcOEqD!yXbP0@QN%^&%1RaN9r zGdjfeU_Fc4{`m$!q-*-m`Tux*r>`JiCssW9WOkA)|Lv-%kY_tTxcu3AkpJpR)1}d} z`A7J9>YC;oS+4%o`K`d``ui(iwLc^`?>~J1_F_$sv!A&?O`iWYYt4lHrWM@YSKj@X zIAEX6{j||m!gpEqVZ-M7gZqUT&o8!nTh_m-rZV$w=pUtq{|nZYRcraCDlz^E?@L^D zy!QhG(~qg?s;aK0mrGleT_Qw$P2YZ>)jOAsd!tA1N9jqsIYYfqulx9VZNgUNN7KI< z&b_@ViE;BHk&`Ofmt-$iSQ|fc^@-Zyl-i*zEX(<1yHeT2iAiszyMkgnoo#AoCZ){s z*{&Eaznt?$&F0OS;oBpXn%6q_OpFv-BD%B8eT(hgrz_+9nNRyD7pKboJa&gq%y{K| zCGM0yW$w>{5n*n67pG31bn)D}Eqc)@DH}J1a!AK6)jEEddw#erdyI$Wwuxu?54R?WJx>C+?^_s;3DVO2L%m&X6^4XIq~ z(|@Y-X!lduO{XSaz4<`bCE-aFzw+t@Njs07;9c~$wm(*=?@hjEmEE+r!S0$1>Pn`@ zHKW5$-G5IW;$j zReLYnPGzZL?fj*;E|$o*a#!zJRcP6N@9s)LvEGW#c|m2T{oHRb$5m}Cb^GRZ<9(r} z>atDUpRY2+=~wq`>AqL|h2@S!@wC^=Hy_$};(Yp z<)q4fx4N)KUEEY?dW-J;n^#>^&vLzPD6yV&X8jM#>7L%}OC_%=E{&S@zH0X8!GIezc<|WJ(a6S zdvl80LE%p;l>Ilgh;K6gG{t7_^hqV{dkde=c=F=Or!_LgPb{zPF;wc=qaeTW<-&{F zYmIB=R&5R1@jLm`9%cFT>9*6h&%08no2@+U)`Gor->ND zfByacjpSq1pHtYhFTXiGD~(y_#=L~Hd-WwNUHv8%U%s|$S?TNVIV*Ex&TGGVQ~0Y% zvna~$Imhh#t&3~t@8y@CY@x00=e<9?c($p)c?roYX6bIL4D2(MBn*sH;xF*E`p#7- zdDyb}=ia%xtKGtOFTc29Pui0;Y@6kF99zsyGiwyH8pX}JJxT;=Y=G6D) z+M&klD^;rh=Zm&joGRbg;(Nh`;j)3_|DpriIjefV&)ZX3eLm^G<<)wr|CYR$7yiHT zx2kyC-+Pm7cYaTCes3EoxmR7<*iQUI??jKC(+kU()3xfWG@6&H8!R>4Qp0fC@1u5r zi%R&%T*Ld#a~h|cJg9oKt8-KK&doJ3cBk)8JMY$a_Q~ennprz1hl|fYpI0~kKzij1 zo>gsuLQ+npuNl_8b)Op4bUpQh-==(y&(17yL~keMz6V(dvID{(e_x6cea1_PJe87YVZ6a z`2}~{HNFd;y4feY?~Z%zPOYV-64ILG>QC?8>knJXQXai?t@91%A`517lLifUof~r< zFU|kL#$PmvfA!Tvs}8rxtVx~MZs+>yvdnpbYnxlX%KUv=`RfAr4$0#e8-!an+q1uq zl)tC9>5cR;UF8qIrU=<2J^af1&~MWHW%^@9 zS<3}pl_BnoPdR0i7s_wF@O^`_@kUsog=~S_CP+^>w_lu{~H4HGUuxHpNTPU5I6d< zNsu?nMSEjbNW$Mq`}aTkVJi67T<|Yj=$>_P+OHV;AAT$>x)wQm^EttT(tj;hPkAui z{pp&`;wK`L9-J`gd&zN%Cq}P0P;1sY`81X2K=}_-bCqU)K77L=@UY0&uXS_6y*~J^ ze)DtVF=^Ldhie?3>n?~|bDA;g)Egd6#TlwH-kdMEVw9FfXoe^44M~{1MrA@!%uD9z z7oie)mP_sBx=+sf^R#Nx{iK<*8|*)MH9qLy%X@v&qN9oX#1E!_n9K9;5O?fvt3zqK zu8Br=uiUfm?Bvor-(uHiX-$6o@8tHDruvn${7*gjy)d$9PF326#Q}kA_S~8GPCbzS z@#AO5xst07>{CDF-#fiOJ^r8Z?@!+QZrs}1^Kpvp_hptPsT>|`t^EuPv3l66S-=$ z_V-T;I|5JnCHNiAjI@i^G7gF@j9Pd4gw*QCY*(I_tVt?o>@3()yo1AoeVM1am|%x5+;PxHHY;z1}lT+Ss0Ccx>So%;j`>y*WcvWUaxX%BU@} zQj^%Dopqi}e)6Wl=1Tv2jmm)fbFa@weyXepk$A|p>{8IQdqJYQH`ja;bA5e1S#j67 z$C8z5%JQ-k{QvE5h`6`DZF0N2MLXM5<5wc5jXx#1*{z;tr@P$ZbV%xx(68+K>H~Yv zKHu51$8b@L?)C78VrCZB5;J#4ur6Maz#DN+Era#)W3MU&Z) z7W{woL0$2OEmkeg{0t1*^7sZxv~YCAv5)=L2IuBqHV~-0)0cYo(%QEfiOm}smo9m` z>w}V=sNz9}K+p!O`**LDyfbq5n#1=`;QqvlnLiHjKX6w(_i{;Cu)EUj=ew)l?XsSHWYc(o`EL1Ud)&NHvPH@xzv(kHg<(7*Jh{H@a% z4{M!&@ZRN*VORgrhQ!lfpBtsTES=5H!(DyRLEy@CuRWgqzm@9F|6W+Ip-aeBo@=lC z(n1Hl>35ga@9S9C%N3@x#xTS1yd6{*&97J&9Zv;XOWu8 z{5?-xgf6~LUwLh!(lXvFIx&j_J_qob6(&plvpc+)`_TXW%5BefHP7C>)6U>jF8kNW zwsyD5*?liIh6LFsM(kfPhnbz%MDo)*&iU=96Z~iW3TnG@rVC^e5tvMp<2;j zXyS#Bb9M*aST^lhX3U~ML)&Fr89qPt*tF4Sv-58LE$1)Z%KY!J^DFPw;5GFJH%+{? z{Kl-TeBZ6*`-B=6dKC9^ID{v%s!lq6rID*_gWE2)ck=>G&S|{4=D#KC?fVseAIs7- zgR)#F-HNQT{!-P`dU1ba>;rjF>UmsS8}p2jfguF%9xLQ6JU*FuseYxoNvTEX!)%~a zuO)0BubO>(R@%*e7Ey_efavS40$~as=54X-UvKbTyBV~@N-K!}V(3Lz{tM2o_jQ^S zcx&v_pUrunURSq&U*ZD}Q(?)rSy+kzE}E76R#~EYN8!us z=tqb5(>vUj9LJ|Ke~%H(64xZxtbFxy+a!)$U$c^f@; zU_))3H6d58+Osp|OUSXPy;;B_onYk2(K&y?u~h;bY-$ZEO^hLG#`-4@q^O?? z{k_e9-djGOSDg3f;{ES-{>>|!?5}1BTy9Aya88X5-*HL4Ps)3@RaDQ9rUC__?8_?} zR%X;DBqtQ7CIwsE3fmc>Yq0as#TLm9Hr{2P|Ni~Rp22lk`nvv|441Q;nJxw#=`jBJ zOI3g6`DLuX3pVJ_yPrC1V}|JEh$u{}rWL)@Gnd(m<*()`VQYHpmg;?>BV?Oopt2la z+MBG2ifd*ic^dR?U%E}AF+-_Yi*c6XM~5xE0`BPnYbI!};eFMxbN`j~yVwrr^tVpY zx_PRpV3D!VjYn@z%V!uWg;rK?U!HxWTl)I?fK~1fwi;d&<(FdOb)0ziVoHwL>qBlT zEb9^vMwsln&~w%4L&$pHaLF4fVN#EFpQ>~;mg&A#w?;FTbMm!gP7}gs+$#)Tpqlg| z#Od z{EDpu7czpv)OR-eo4TbSpHU5vaS^x}=lBE@AV@BO-DW6KrR z`(oAQOwONzHEBL;6>awZlrejoG5qEk`2)N1;y!efq6{cFVDbFEsin!&kV?1Vzd%~ft^ws|ez znsn@;z*d`S9H%$UKDXRdD)vB#RYIa3mqN+Y2O{nXS#z6M4vTe2&-DAqr|{#|?{6jA zTQgXi#h*zyEx-6gk}Y}5>kyaZC%Jq59%nY~ah>3^VPQy`^NiA)CQmD8m89;I@oRr^d(JNe^FE_cIsN4ETy;7g}v(- z%hws{9FA2m5YF2bWfJEf@6MNh_*0tNI{CJnuS<3rn(lT@+qdwd@63~Ie&%OdW;_vl zb2qxbo+(}X?wZSMOQiWiZY-OyYQo_V>5$dVWX7zlCyte5c$E?1!?=HVotdeLjmwdRbEcn}QhYL0C%iUA= z=iSWTy;tq>?UE{|W!zDRCwBPQth*d6`Da_|zSVp_wW}6?sNDQIKl8tAo1b&W3YNQm z8&k}Crk>88-f`EAbVoado& zukd2^0*6AOE>Dw4k^eD^E9kTT`pf%EyE1ZLuKCD5H!f)P|CN_Tq|^`n z*YM;o_}9d1vGSdTRb1G=RTt~6cdG0^vg>93p|AWmlwv2FK09NxQQ=Oai?GKn4qG{% zpK-rA9((Xys?^B#SzHh`{Wx#Pz8!*DJn<KyJ}SYw%7bHP6>=6I_}UzPfGm^1j5 z=w;5oCjFjV()YVt23v!_H2J=lX@5zg%waz9{vgYsOZ=lFHLoy%i3j zpPAOrjc5PNX?0$t+;i{7@1EkHdBlG!lqPEA++vJcGplUw>7_&K^!!DM zv)`B0<@<-`*@d#qIhU?cyq?S5*}}%%u-vRww)OLm(^BWp>x6W9JZHURC$4fUc{Yph z+H>6!x%UmG?tJSMIwj|^k(X!}+x3@wTy8049t&%APTM`BX5%^Ux0eJAqXMAL+?+ zh>-MaiB{S+{ramteHSBnk5&5IQ`0`Y@zm1~4V?B8jeWBcWu9=GxFyO=eYjY6LqL0X z^h`gW)`~)%jQd>9M;~Tvyd%AL>CuhXl74SFyUG9dnxiKl<%Q2$&drt( zy?s@(L%pZ!Bwy`4j#qbU1oN-_NNNeJ68+*fTc*?d>4IL5l(?`9zdxy3iC)sM{51V_ z&C)N*kIWd%b_?bGld5-3E{Uv4D=ahowR+Jnk0Tk}E}PEZEv>OVV6GeeEI#Od%aYlB ztCvOSY*NfQ6lnfot5iL6pO@-UtB_j}HQnd#Z%N*I)WGU)jqv>yAJ2N$r*&NT5q-|q z>21K=WxFEwC?_lvmb`x|CBc!KB>&R6*vleXTN`tpIxJVc}xARy{~J`?=RM> zzju}4c+Rx#C1?LXO*-`bW31Hu{_al<2VebJAY;8#z|`$fhIAO4Qfxtyw*7+7hyQeV z)kT&sjr<$$^-0jPL+?R*NnMZp@ttp9@v!<_{l@#{)SGAOKLdL&TK2vDT-T?-&(iFs z6xiew`}FPp`Zv3|UEY}GbkjZumQK(*={)PE=h7$l4y->dFY+s5vh07CZ{LEKN&aN1y_%9( z869y!@w^Pj>8zv00Tp~pKWDS`JAa%P@MlhDmHqBh$3N~X_@g9URWH*wiNE#f^qbED zbodS)clxk8WOB6lwEZ)C&+^WTJj7FfWie;Z?YK!MAv1(qOn7$;=e5~RW2&IasJ|yjq_bij@9)oE&Nt&9V%A z^MXINC9}v}{!ps5kLA2aJpb7nZil66p4vXS-59!vNkRMYZO)4C54v9n^_*_}rj@aS zZH{Q|iH#ZG?57qhAM>41EdAt8<5c07_hl?|BgDI;9$4<2?w9%P%9jf>Ma8a0h2#e| zyPn>-X_JicYF(@Io6jj74!`J|7$0e#`(bK%@NvEk+NqOsnD4hfzspd-e|A~*OO;*x z3GdnOXdImq#K+L3Vf*B^ulT#==Cyl8^4~37m$xe*%|=>xmq%RH%OIclyo=%0FSGW< zzSft%<7%C(~oCVHhI0=9pdVLQKm<#YSy$1Wl^ryFPUz+D)tz>Wy?2@brXyA zuYQqM#THk?#&*w}|G}mI9Jbt==Nn&FRx$qH>!^P@`U_W5we{PAni?S`*GEZj{BCWX z@Agf|oO$ck?y|(B>QmLqZyTya?P_=x|6AF#Wv^9Evi)PqaX#x!-upVO*5g%)>!0t+ zTz{rwUbx)t*FWdE-al`0G%mGEXx2=lqaS~${gSM^f6#&>Sf)wyo~nLr1H*rgs<>Cd z@Av8K{he}bbNtJ@&wnQN-K+ik@~_DL{fB?peyL;ITiUVj`n@Ax`~?~VbZ@Sw>|?iEwoFUZJwbw{{gj^VHV;y1)M>kA_GT-*I#Cxj(d@L~%#VNE zUfN#ro}cim{FF|+f!*Z9i}f0}Pn@Yg8DKn8 zF}>bLPHvf$&9J8PTw%k!=M1{7C(eHlHf-3&baDQ!m&G$b{*iPrzFN2LieH=QDWl1f z*PWg+^|S^=y9eL&SKY(2==p^^Q+(T&<$P-0bn^a!SM|GIa?kwuC-&wO?k|347q4>f zeff~7J2oq=qL{ybLq*BGUo(6P;=iO%4rM6Qb2C1$w$1n2fyC^@$)6J@E96|_N{Cw` z!CJB?cFKWiem9&|Km2f#QmN-W@ZMr~mBAuMiDykQpN>`Bj@?~3>FDv>`$E=d8kRkK z(4Aos@ALSF5QmfV^Nil*PFp*=kBT_!%zGz&_IbZo#G9ijE02oWSsI9i|E&6PeF^jPc7udGWyrKC<@za+AcFK_3(Q$N{OJzBd!>q$!E?Y2$&mASo3_R86v zjA#2iFX-Co<&R#Qbf4GRT%qVz>nvIK_v!A+n^u3;M6|Cj{!p~8W^E+$MK**W>yCq0z~c~J+&%sz^wv41Sv-6=F%X&CcG>MuSqpxeL|?wWQpWm@*;$+T$V&eG#cx8cUYfb(Kv?O8z*4&q&%+k-tNLC) zEbpJIXMff?Ni_ET)BJ2NetEmHRkJp%EzSwm|Mqlsy<$y~>DtEi*KWR%i3<7-Ral(;@v%@=+Bc4ssSx_PO&0SyL=aVdh9+iA(uW)~q{HRg>K)+MW^2tV_TQ=sz-+x_v{%^s*KYzbU zyXG9;9FS1Z{9v)U$I|ECs`r+t+X~uGx9MT){d@7lQ4fv3U90OflDLa`rYg!8>OaYP zu=g#m>jK>~#%ofe>Q>n%GTgiDaN6Ui(M6}u8HsW7r{P z(<+`ln%iOT^0D)U@tWQL>LWJ^>|U$fwsY?aeU4eX?Vjunu!wMK-NWBv*Kx^Wfp+-a zY4$Tct{>wP(~U`7k+v=5^o7%V`t>a~YzSalC>wKF>o5~P)5Mg@x4SM2O9$6}niTAr zvVQ*3DEF=#uU16vIJm)z_hka__M%y_ZSKYyY2n8&+%4HqY50!aZRf)Ug%h7H47|5+ zn(Z{NSL#=8N3N8$%vf|ZpoG^|P_Nlm?~}J=(8AS|C&&t`Hg8`4BJoYDji-x~?(B-J z8w-rYGvgNROnT*4&G}4wLds&F)y~Vmm*`#CclT%G({JV>=L`OFpK^OOC(-u$y>na3 z_X~lJhB8%R@a#6p`r;$CB7yt#lI%zKEL}g(Ih6O`W%u2meOZ0mjlE|&X-~d#^3d%? z_NOBxdacSDzyo7@_xYJWWMp6{KpD1-L0k5UyfV-?F*DCGDZjMDDZc`KC{(~{ufq-^ zwwJf`_O7g5@wIV*Q)}3T7g2&)ff^y^Q+N4YUf8!x*i)^xW}5cVR{00(UVQH;cXAYD ze|8UaEL8EkJ@tF{9X!Bj=DS2fYu@(3=Ij%X^?D_SE%dEuL_hfhWS%>k- z7p|NWt@!)kj*I2;qWqGd9F8Y2ozLOA^4h9$-6s=`Hy#P_srt1}#$s;fk{=TktHD>qx%rl#EnOCLw@}qa znpH%1*1DWzQP)i`SdD@b->g(vBNv$vk+{LiQKsro(2plezf`|-{wvmechaPG-}}8v za*6FBY+sC4oKo<Tay+C14Zn1Cpb)(&vA3kc6na8&K zYG(-du?gvk{z`(~>ozQIzBy$@j@Zqt|}MW;D%dTNiVByF|j1Q>>{crcCu;w@lA^2}6nN=FNwr z*DqUN_ULY6>^kA(4{zRhimp8y<+6kKo8KcbpK}+d|8wYFyfY!x#_6hw;w}xr>?J3< zy<`3@*lR0Ta^+TnuZH8z4-Ys!=lia zQ7hmj``*`|U7~+Ttb4HKwx@*e^R&mgUPm-fv095y|6QC zp!esQNUl|#Ew>lX{ZqiaH+oY0uA12IVHy-05dKw4(RM-Mg+nuiv@sIquuBXz9b2 z)>O^(jAtviOLcZPp19Z6oRny`h*kcNRQFW7HBu7X)0Z-weN|hvR6+TC`_`L&Yq>8M z?lQgd;_DZOPQ#6?uXS<`xH&3bT-#widrrlj%xtdrMMm>Z3O@ zdKtso6bU!M7U#*i2(QuhyW`}-*tc|z+p_3% z|K*2*1)_D<9QZoxgi~6>xC`pSNX((vOL6txPPW)-+gm@ZArkdX8G-$%ciw> zbzfStXjSCqH1VzPbh6gytlDgC)mypJE2}VnM`vNX{Cu$=#$Rst`oG&!AntXx?|at5 zN&mZM2WmEZZD=)gdth64=eP&Yvkwo~@3hGMdnjVh+0NyQ>h`<+O|T03*7wH4HY0Jr zpk#<25xU^=FT~|AuW>f>sNEe_VX$UG|*3U3pD~cc1_L!NmOh z=9A<1Id*vNd*SHKx_jT`lS}H6mw$A%u74OB?0#ikNuY1E%%^SXtovrke$(O>?tT96TEF?F zd8)z^Z)vO&=~_3HwmRqWb^Hp>p2C_R%{|?)lr@di~7p{ZT)b>Pek- z&0(1GgSK85bKopRyrq`;C8G`?nd~l=v@gUw6FAX=mM^#=kD^N*7J_ zCGO^(x)D@XzU6u(t7k_R$dV0EPw*U0oOi#Qwiu`;MG>z|VN43yH zj{?JDd$Id3C!gN)PGz@(&YPP@inlqW6$E=qPJBA8)?2G3_j<Pc;pJJ&6I;`b{~aGmrnZ;_B+EqiY*QOuXw z%)O+qy+20%t6Jgpmc_X_?siIr#g-xMI#c_9FHzjhYVI>l=W>|&`rXRgVlS_}IO%oj z(v=w{>n5MD3n-bXxQVGXwN-U>%2vzjYc02hWb^jNug|=b=)51&rkna z)a-9JvG+j7rj+KQzM{>}H|;V#S9gVST(|TJ?cAo?_o>(C$gU}?&raf-+n?9Fk*!>7 z<=siTyUMvV%1U=w-;pZZekIL&kzh3IRHCcd)#_w>%T=s(v8&XLNtYJgSf;c+BW#!J=1bYSIyax09gAJ1E~Gm_ z_R{0Yb5{yY?LII`I<|*rSJKVYlX*K^&%H9zDa-IS=9f_qZe*8OP-)_vmuB!L;Ka*! zdTATyL>fJj-B$Ht+eE(nTavyd7M%qe%5A^jbR{0C`67GqP^Cq@_L=1o1tte?&J_Kx z8lE-Jq-eWb-Qk9GqxX|{>&)r)jJouGqssj$o2s{-Jp1mYDTm&q1$Wkm_P@Q`bCAdR zt!M0~1$vemJKpF=Zo0OnGUB?;q@Da}Yd>1>X&z56@lTz4)55yM|MlZve>XRIv)9V= zJ)gYmQSr`YyxR{k7e-9Cnfh99^O0nWMLan++_UcN%P)+0f9>(+#{nz3E5BU*tkJjo z?%cy(hItM;g`C~DJ>p7^C$-$$_0!BLzvf;3KI`^*XW!lV^dfmr{I}e9`3tw_?Q!R? z_{@3lz03RQoDcu`l|2vsd5mYtKg~I3AD=lIIPJ($_X+nS!Y+1u_kYr!;O=7lqm1!B z^Bl%#i$zzaDNM_aIcax#axs6U`-k$#o8B7lk1yI}7qaC`(lx^=+NuWDotE!ThkC}W z)vt}XAQUkpT;j#iM=H~H+@GelagK!4sZ*Vfn)(5|`o%xpGU=22!dGCta<^rk;<{+h z`^`yrj%nY1yW+6jmB)EW4@EB?{+4=c?TsXnn^*dMk6iP~S>3OEjm~}D(aZG z>%%W`HA-IC#!xZhLWySuUHzYdvdf1s2SXk4P!l`*%fAOwdZdvF3 zxX%68`!gV#@^-lBVo8Diw zx~wnu2OavU_VCYL!#M$758m_65pK*^|5&!|ov>TEp`Q2aeI3OoOkT}B7wB_$deC>C zDITn8UK6VJ%`S7^c5kxV`sZzvy*O*mzp#CI%q;r-$%kLgEj_1gxo*+D$}7>ndrhxI zyW93J{eE%1?Oy+YD=X{NJgemA26;VTcYCk->?i-(eRXplAGbQQ@0-T|CCcrejAbpS z%zu4i;h))kGN<;xmWVO*lhl5n{`Jhwz)KF?(w5UMo_e~ah}C-E>%ygLjtFHwa@`~u z7}*+~YRY%2N@f!8mT%1O%#;5b$sMR-@tfFY_h*%>;gheA_Dfw_zOb67_rXGGkJob- zxv$)k+)`4IbBv|)fz8V&9g{v!cMf}Z*>dXdEkR8CP3PIpU3F(U^L}}OTbB=qxFJAJmy2`EVVXdEh?}Lt&bQK)LXN zy1r_TM+}a4yam1s9&u**s4>+q-A_v3`EFf~=`vT_wUf4#Nq!PJxu^K`{kXjIib-Nq zCahCAZJQK7Y0r`$#@XBf=p`lm{C_0FVT7o4@B)@bq4a4$8F%pk4!X>7*C$N+a?v;bsL4;MQ%^!ePG;}v+}kHr*?jVs z+BPryPfOjzs=mp5oKzeu-@=h4ed=n{C%cu8a|(l|O;Jy^bPrCpoS&@~H>p(m=Zzf` zHw(m@z0}z=aoOubCj@!4@%w(VyLPJm$xY?$h9cW{uU+jV@1LnvIfd;5>-0C% ztyA*(f*USgs_0$z{pn@**j+F7`^@`mzVURZ;%mvJ)~8)=dtTh29 z)1OXmOl0ct;6qo>yT zE;K>b(C6(`_w!60S!+_O*C_DumK|x``{_pHfdFs!D?26R(5~ocs+yvb*zAU+nM&|=b73BWG^1``sQkT?TPoNp5Lx1 z^2awHfNUXNwzSMLm7js(f+F%j9C~LRc>y7EXC22NT+r>j%MJpN`}(RHm%Qv1<2dRW z!o%OuuCQbqQ(%f-P~d&@bCdE4u20(QcbflW-;t${8u=eA7I^HtbdlE4YwylgJ)5(+ z_}c#efBv)@ZM#?$pk%W6MY6$(&<{}>doOzzZJs^H?7REn=gKS3dN2IF(MQ%t@L7A3 zN>juO#}C`gr%Ws~@Qv6Wf3%Y`g^{C7X|a&(sxuzC!H2e321R~WTqx%k^h!vJef}29 zNp7w!mWdDFr~Fd%>`$G);bFV5=$ntb);b@$5_f4j5AW1z`JW!o^SR$0r(=62ao$b# zOEM~zQiUgd_lw5mEqa|K7|L$WVLJPCZx{1vJG~DN5|%N!RYy2A8z?XGNZYnNx4tMi zdFEvW>p-0^S?1+PC2$L{#W3P2|p`h9&e1W zIG)XVH2BepqdMp1-p~86@5t+*=hkAk;sdP@e@Z_i7WkY;I^M!{$GPIEFAvCuZtSwU zW^wPx+u})Ui-orTWjTslkK;(D5t&bFw&czG;_SMWa$&MQYQ6j@N=Et|1{dk=Kugesn4iFE73Rw|@QV>SgIh z#`Sg2zOQ~aEBtDF?fQGG!`;pId^-JY?vjfP=N05V9n(s`e%iEI+Bx+y^TG}NHcedT zIp>H+L|)sVBx1Ka=hc&p1$r7QoL}rIKBn7ga!jnhf6W{@9`mpxO{Gm%;mbnGxZJq2 z+S%1yUWNDO_Z(G9bd(Lw)-rsxb^B{oL*Hp8$L6s22iZ@4nyWY?M0k@*)1S4HH&#qO z$K943%=B>9t%Q((^IqE*?bQxCJ=Z;~?UK|inN_^2+N`4XA2RKJ&hk2&`Kn`k{Bx7a zPe1)MW(uuY8y_ROl0VdZ2~%++)3bG5sLx8YZA4a46nD@*I0?4l+U;clZ3(4v^(`J=8t@kzD7xB;A{tQppQ%Z7K}Am=by@D$Lw%vB9-R zRc1X4m{z}n_kQx+#N@-M#S;Orb~BC$oge5=-R1r2Xqr@v;M zeK}9NrZ%dEiOQ`oZqk-X{vbSU{}gTG1t&J1esFNDt7O(qzL!E%wRwft^7#GkEjn-1 zqteIhC;suornbpafc~2{8PvTSb(0*sG-_LT^FvD)n=}*d&#foAlzqaZ-S}G<{V)dgS zenyF!ZkzdB*&g4GyH+I^?&q0%)PHW`C84&@1~GD10}i;aS$))CgHo88e52l`Lkb&C z&K7O`?v}hTq1jWhZk2;znWaXup7F{SuiFaS?<_HJtvJ=m#=P-?#qQVb@{!k<^ScVz zO@CE$#8CUQhNF z7mweNx$#)d<<%?YM3!4Tb{BU|Ri$z`W&o2o%kxP!nT3lJ6CS6ga5ivWctm*f0 zgXVcmhVwSuee{scwm0z9qeX?9Tim3+=p4GoGS68!YWnW1DbClQubmLH|CDaqI{ky^ z*QmBe^V!C`mBy{xdDQuiecP`39Y3e@7yp-dx5(tmRQrQd<)59}{kp&4se97O!#^W8 zo>+6RxOw9$2a(2GOa6Y*V`Ja+a&lR@byfPTZ8yd58NOuxCGgtRW_HZ_(#`EDZKBfl zU-o&{FY7lHH)TnldT{B+BP$MToU)L(S#H0O+3weBS(a$#!^=z;vaRV1FLcS+YV(Nk zi{$pm2D9fa=i;X2Oj-CpEvR1Vz~y7&84E2|8f9BE2XA2gU|QRJg4y@&ImrndlU6eAp!VtF_Y2CC+&s?6)-SKucv0DS%T43)_TP8cI?Mfaxc~cwyT-*;k!Omx{kmp# zX36{)={<%FyRK))1_i`wn{7L_-`C1xe$l)A%M?rvlczl4^!)#slXs5Lme|P~KXAz| zW(&M~vvg{!(u#z$xiczXyKNV2`|!hM_LZ&2wRomk1#c0}IGyg>y7i&X>gko0k2EGe z7k)d}V%9ANrNtTyHC{^=abwuL7e3P^ z7Fqw=FSH|9y({zbx*oga^Qb2H@Uy>GdKh53 z+O$#rwRYdv&c}wE?wmQMoB819jeC2f7RkHqI=Y7Aj8EVzgH>GXdJJ7UHQBn1)_mPj zy=ryyjjm7UdXB$txiW92SPbjAiBGRph%);G>a~54+IY1%a$eG@xknR%d4xG!bCV|q zZxrbCI}qfQX`<-gBclG}$ciZ|3lD8#SlukzE1~Sy;@zCiG&woY)irF^qZGqi>c^Jd zJooj>f=4>r&a-jWZ~b+0>#^X8y07)lmaqr(DbGxLo)PRLGWpXH5yPA6S^^(8wS-S@ zyI4?ma%IH*&X)zd9!=?;d-Zs*%TlSQ?+*8$dzqIfUq9oCa zsPp6Vq>g0~C*~cw_WW*k=!!VYD@q#=sQdZ%pWrMvJ2I0)d6`AGdwRHyjj9muTzSsp zOk4l_S>xf{vAbWkc%$a3onh%$W*u)_x~p`qs@+DDv%5q~BaVfJ7#~hmTJmW5-di7* z>u~8R)}-vTxUHTQ%rue9sO>><<0b)Svnip@UmMfgr_EXvH)r*;ZI%byJd&qe*F2sU zzp1Tx4yOlBobwTS19yrw1SBJ|72BFeRS zs$Jp4>eV5F$DGCfs4^UISh-=*!`4Sh!E3~(D;pGq9L$mDivFB@tJ&;TYQvVfnu0f0 z^mg^^H)IiellJQ6%+P3A-y6X_rfhRQn@s*R<#=pz$Lj-%fe9Vb9|{)jmrlNOSIc0h z-+iB~)wll5RorkWZ+4Zz@#5%53G0%VUEu3CUn$Fc=aKOC#kZrco)F%?asPeJ`-K~L z3eA&5{u>?bUBrBRf3;8H`W^h6V-_rX*1_x<)aQ0YEjVW7fp_Ldn-?{6>1i$xi22c= zDJK{m>b^u~?$)?KRlj>bcDBz{6g#UrbGrY`mNTymgG~&lpUcp@yi&>8KC>%#t>)C? zz|ERvA0EpzOnNRCv+3@Vg(Xbi{}|hCU9ykf?;9fQ(b0!qz286Uk@0iG?}Dn+ z|DF|T-?8R`Uh&+*qL1RsZY;L>tj)97#J!-caG}((`%;gp8MdxV0P`jyPTQIB`@z?EVRx;2)vqLQbFNNq;f- z((x5h(X+2~S{aw^^Z#`@zG6kA0=J<+ih9O9u50SMckC@sTA?SAx500s-qgDrUh8aQ z+WSUl_pDDDH-mFmrMWhHZ&c#Hc7}JZywBYbRfaVWH+p>ga5DK#=2b0u`Oa%Bi@!~n z>?%>TY5SJ+|1TF7tXQ|P&++HQ$3B%)a?aOYx<2J^O6R9DQx3n^dl~ykrv7vA(KZ{ z+IFL`)Tbvh-&R+CC=K6ZuyS@)**-;oZ%r-pmAkc~Qcf5LceSn1^Q^7Dd}`OZ-_nz- zE?n#p{@{6LhOANOsmWJ;-sK#LG+(88Pq6+$-o}`uoeLiET+Us#vdo0xspYaAk+yN^ zUh7Y}`n>YoJLBxmJ$70L>f+5LgiaeAw%lm&)T{Got^1E3X9_lGU5eP7bLrGChaGMH z=PHgD%_?P5d?+if#^#)`wAvsh!GlF3e@egD6)lazPx+TLv};bC=BaG8+P!Ji%582?|J@cK&U%-AFko$Y;6;larV zuSG7;Xxnp8bg^RiBc1~vnhUvpl(+3U$=g%dq`7)7^PVaG4|poGwc@>JF_v|BP8NCd zwr$U4Uh5+hB1%dN6Iq)KgLi$?_dL0^@xyG} ztHH-LHtDw2u%=wT*J9=ExBO~y=<4-SMfz^LSD%;=@n6K^#n+ex5Bh^Y!*% zI(%}~>ON8lmKI_~1wm;G#eznfG)eKEjX3W33+I6zq1rN3#ht&6b&7Z$ktMZdKU+Dcq(p0F-~C7^`kGn;RDX^wI6Vzixx}`3=)zU8AIf?=AE44USt|dD)+U zzi%?SwrX9!DPkPT=RL)KWlVW+&Eg{W*-;Zqn>s3Y^%`u6Q(Jqf&wJld4{M(%7B!7! zI{SC=wr>dJZEwE%E&KJJBh~^xjs#wrxBF2=u=Yi-ho^4rTzPqx7tf*vTYuS`ot73~ z-gZkk`>#*#g0N)@S58li5m;%ev&-}r!{mF*w62vIWEd5)u$+-@YZL8iS62*{KKEQc z_JNvkvo~|^){UH7C$=fH>8HipF(~>fXZ~GUnM~sYhE1Lq(0#b=J)=D0cgmZrbTQ^*@#755M|yXx&?Vzx6zJw@luO%n$4Am~!XE$6eR2qbxzPFLt2JZm*S@OU*UW&UHpxvV1NJEA?)jk*vH? zNo}!Gte}2;)w7GPQN0U4T7UG?+jMXFr*FBNR?c0VcrfKaVD732YgtbHZ60&QK4m7> z*bF~s);GP4c%ux-DCdl!8fVsF22Zxra!h! zJ=ZyB^_eT@uIp_`Z_k>*v3jkKy17r0{$YpJHMfpRIK4BzwDU%)nNINe=b3-vVs@XY z+Ste!c~1FrQ1I@i*$*3@SKN8JY@6F*A)k1$kZ#Msi*9At>XNgvBj3aduIkiHKAG?P zHmWRKu5IeXEYkqS4d<@pJ$RZTH$SaS$|=Hm(~qjUtxRnDx7!In*lsHE&?jl{!o8 zeR*5KT=oZNB<U&A{ z>(}v_nS7B`S>gZdV#T!c|8Jd%746gIKKA2i*XJJ(j#TeC^7#M#*+2G{X!Ex}Q}L)Y z>JEMPdR2{kkcG)i+k;EYLw;`de7GT{Y=>w5s!z`+9}+zI#$)ogm7l~ko@f}Jn0kEQ z1KrTa{(6}^zupX7mseElKeK}Cmd%0z z^=31lTlOvN+pd1>ifrt><@yX;bQfK^(iRcCWO>VXoolm|>>jmR@t94hRK63IuvKd7 zp(26F#lKCgZtPNgA{Z#?Str{&=ZSgQwY|N6t%jEa_gZ&Feb4*0cX#c3NB8LO^RArUC4RHw_zjEWxAymMuK&L6 zeQi!<{O|7{%dBrKiuf+1we{WK%!bnAXHxENbl&!EhU=Q&0agch@h^UOO*Y!}wcV*> z^0}`KkL5jg`CT`u*8b+c{;jY3H@|{FM_&G!BwKRvP};7Z`k2Tcvn~Fb`CS)_Tb{f4 zYk%XJl3D)CFP=RS+HlTu+RA$7=@HDu@vP3Vyqo`s$?g`LTgJO9Np{L^KL5K7CCX=) z-M{$qOEuR8-x9^UT&ad~xuWim#CON+&fSt|JZI~YdgHrieT9x##U_|XcFa@QC7mg3 z^NF$Iu5*RJ;kVZh*fff;pSj#{vyTn0 z{b;qoEWK&h|BeOUl=t$l=x6-Oxj^m&%hv~jjKI1zhckuwLoo!dmqQE^d<2t zbQjg^yTJH0Lv6+JJ{GTpIUO|)rA#5>4z?3HU!7ELa?%hu&a_G*K((POy=hjJOMt}N zB#i}bj9EMjW*Ix?S}SSrWEe^YOl_FOxZ>^11!XdVS5|s(GnA?=ILCCwc;C+>IfXFASdJA}8+I`ToKJ1~^;pnxt?MqafY*$r!VBU~uzY}aezoI>Jftak|m0}NlhF78vd%0HFr#8(hcM14C z;U43a_694472)-Jo8~Lk@~y~cD3u7PuKQc?Pw=IBmUic-r7Tyn_g7h*HuF$hz{Pl# zF`&ABtMQ3<9=42Er2}dizy4ZZ7T8(ZD8sTMu|bM)g?Zgqi7D#Jz3f*+9DG@?%-(Nx z;>1ml&;~2sfaT0t_t(!;OEJ9^Av;y&l?(rG^XiSg+g;Np%io;;?hF z-C$DrUe$_gd%uPB^8E~3H!U$~jOs95*nF$=x@{5frO+pn!-Lf;ZA+({Grd%(%~Ix9 z$yAJ%T#qF0o7w$84 zT(%E3m{PWVa(EuYG1)7D_c|xlt8RJCEc5K%G8T#dnakoQ^*=MT+$nfA|B%rW9He!wTX9a zOXM%5othlIVtLJks?+VBpVFDig2S6_?c)PKEqQUpDcQTM;~e*F*XwE*J5}p0>grV$ z>e&m3*G^esq4z6#QQ_?)3wB7%G7#dHXWhW>eQ&Z*+beIIiuo-QXH9q%qA`1A`yIF1 zC&3|V+b^Fi68D{QK3J~)$INXJuW#hemN48E{cp!C!=I0L%`Z*je{WWJX>n%lf1zLd zSf$=A`}Qf7J8cecaLV_+6XU1mFR@vw< z(9px5f(yN>-kM+hP*-(*oo$m%*jv393o>=D$j!A$P4wJ65{F-MGxIaSZ6G;8vV!$SLKEcY>8{-M9HaF)>Ag+8Y4-Q5iL zzwTJ^@Hd}eOoWj5^B=CUF)p)@cJ0{Va8f^J#l!WHF;e2;J9w?#CCyy6avq+RT%EN@ZuMRlc;@+qm7LF1C93XRw&PWmDqAqi z&DMmU_v)UKMawRyoOS=arEH7G>GqrT-J(U={FYPFiqG;ty_UA++AfjowaK0FF{`IU zhwliE%#J-2^*See?dG*x^;Z7>n)mm5>h^29bgo_6<$Pbx!`=D$ybC+Uzh3NG;bYy_ zmVNxv$y05YqwrYPuy*1ziiFcd8Y63J;kedLf52NvwPdN9y<{AIB~6KLe1tM&1ZjbTW`C|a3ebUg_glS z-X3$4&gjTT;^i90wmTM zwrG3Tb}do;0sbs2js=ZW&@7l)R_?*Wxr>)iPPnIdV7m-3pd%$5H#YTad;n%Am- zhb?}G?7j_*`wG}=9{T+_6#Jod_e-W+)=VSN#DYM$S%U5%h zSO_-q-4=YYLAH@kz4vSR_Kke${SNJ$T^Af*ctzO5-)W+gitxBNf7r`pyh^!|>XbaJio1^$~#7gi_i zWq)aEaG(3x`opL1HB8^z$+3lB@P)0*0{(*^e4=uU<@!9^o_C*X_`8zz^aa^R=?4Gu zC;#YF&HTLYTY5u1&jgpQJJZtJttFnXBtDij$IV!2YrEj~#S3fIc|UzwG}*@0 z_XKqnf(l?iY1s<&nBX8-E7&1r=1zu(Z{xlE!ncQ zLA7qD!P>Q~H*ZC?mYs9o#gH4@u`O)zTJ4M1lqGLl*)CmsIr7o;^d(zMtF~>sws3Ct z#C6Wm*B7syec_s}#N_U$k!8`>Z{?n4I5SCXR?D_k7sEDq>Lqr@>xG8JGx75rO?_Kq zEnoKZwdMO~n_WIicHfw`$?wA*UcK)Mxh(U2H+0Gv_#kqr>{E5wg^Tl+XKr{dDfRLur|7(; z#x}b(9#wWG&6|Gl>U6bh%=$N8H%@JcyX!RZNR`97w9fdrbz2&ZuV&U!8W%GrDEw$$3~re1kRp6KTFUQ558Q7hKFC+<^asfxU474NHuxz4qF zD@{(^p5|8JEA=|poqLaa;EmgjQhVkuyqGI#dTYX>i)_<=EWOoIc<$RSUd~>#8&bI& zOm9uN@QdDF9oQXxjTu;@e{YZ@o%sVAyGyBbFoprl>1M^PJzc{NX*zDBw#&=muPCNeO z3fLz!rJngzw!=@YfPG?9@)Z=fpO#(AzvYQ>CVSMquNU&tk2UVmPE~lH)ERHLe2eqD zO4AADs%)S1sukXEV*j)*g@4bBca5<(**~qzVg6aBv4`;`pGK|vlzrUHKl6B=R2xh% zPg2M~hhw^w$5rWBZpPe(yh@ zOpjLhKkPomQZ1x*BYAd0e{Pel=hC=x?XBv&Ilracyi^_EEL1%)u3ahLVWRoU{&M-L zmG>7tytn;j%6sb%d;f+!|J$+XUVmZ}yYZ}q_%6>2;s^Zd1+ zqxM=kV_uz*?xo|3>+00(w@b$734ah%lyW9Ynaym{LudC$j0MY zvrnfS_aJ{{@7_#u+X z?&^bJ=j1QN8FS*;?f#~8K2o;2S+i}r&B{)(sx>L?YT{o2hU)f%!m-sS7Bqa_RLIAfQ_d%ga8 z`h{MtsqLzGSKnVzUrx>~nV!4(-nZ`T#a{~F&e(Cy`t96}|EjkX348uySKRTfbEUz@8==1fo77HpKQviYA&Sf6j2y2|FslW%spgw;$sQ#bES z-OMw2K55%kHuI}){-~07J7rt!q{#Cr+iH!XC!A4x-L-!1nqB;l$_-C;Jw0jH8^r(R z<=iV_`@5}PmR~mfWqT$5zQ^IOz9w<|r!RZ`UC}IeS=QgWBg=KSc-1$oyCA>h^_TV+ zVSf{Mh1au$-SM*i;{Hh-~Q{x`^yY}nWfg$yX0;u-nv3oV$~b{uKRbF%@x0{ zx8}~m*p?jyCrcF8x$P=C)}X$1wf97`z}t*9`IpwUy^u;-ztQ!&N#^x0&#g~q@7WsD zJ>SV}UF`My!q@YTToPZgfAhYqt6`s?o(jCT?jFmQn^&`wH(y{2cXE6G>S0f4%H!zs zw|I|ioxQ7S$JDb|7Je#x_&MAB_||CQ=7@;w9n*!TMLNY^Fs^s~B{J>joLjHsC&d5n z+Vvv-a^WxYkX7~Ghrb*ynei^>IT9@parn={oOLqG& zUS1Pdb!>TX_xT0aYjZR9uh*4%YxcJ6_N?MW?`>)2|6VQl689=1=+u0L1cN0t`;r3~ zOFe3TKi5_{{M`MO!`m9!m5bL~mwuM*JreJv<5TfT;dgU)ja+eg&gFLxqhoH*_;#|F zzqswaMb`V*yf5$c_@7Q+v;3*CirHVS-?_l9biu!A%&)xJUu}*Fh_?u6FLKB&S+MU6>({N! zUw!#j=<;3JzH`C8;syK8Gk%@G{PlZG!2gm3btf1_%NNw0Vf~uV{%W~Q-PLQ2zbwVC z)XT1jFLKygyx`w-=2OZ!8vSPkC97@)$mxntx!!oG*kNn=f|{KRZdn9WS}x#{S+Q;B zf?JjW?oS(vex15(Cmzzs96IB$}6Oq4XT<)vJxKp1qv6_u9o( z(;ocqzY|y9cj!{1xzAm%S+=&`EcL&%ek}GnD6hozFTwwVdtTFi>Dv!qZrzZQ$X$7K z^VxaHv$iCOy?=Uoca7zl>GA~=kBH01bNw)yt6o2DVeqkr~!4EgoR&BLY&0FNWp!m+AH2?W(Z~0Pw7Znyxu3@u&r90>S z^(DD!PS!t-dKdD2Of`*n`;@92zwJY+cKoa#o2KcnS-WN44Td?Fwy27%6_b5gbaASl z`pcL7_b(YAFrHA6scf@%!l{mb{Ge5_%_~FJT+?D;2u;PeYFY_xRV?<^(yh}YOGI2n z+WyZJuO>%1M0`?_{CZ|dY) z_u^xtx_srAlkRf0A1YR>73@}OS5Y^$y$hIm*Rn3X#5sEUY#y!&>kY03EZ6VY z^{eGYSIUE>e_N(=#>CH$_)(v_`uXrP=A?GTXWhhk5rb zImB^1#%$deWL6U2T7!GuH!pHcCV`6mmU2lYaAnx2x~hISv|5g@Pi-gx4KcX?0Sc zSz@eqdX15_&$>VFGM1fx%)P}Vty$siXVGN|NsP<10&b}J94^reUmak(;Lg^`uQ#c- zNFSZi#q8GnZIux`vZsFEhdWvftk~^+xp4s`$Vf(JSZI%VQ&j#qLui3O} z)*o%o?6s@X7_JFii(Dt!D0Zmow5jt2uN@bQ&PwE{D#OL(kJ$Ilnp2x4%CzqPUsO?%xc zE*JT3Gv|08vF_wIvxgI&&dPZ&XtyP1@>}LZ6AQNOIQdQRVeo0wn|6vdi96M9KW|B% zmc2>#>D0~V*IcbCeOcPHT7TEhr!iu&r{-Rs;+1}rlnu}k;&^6swq{BZlvZrl6Z(>~o~zAiX#((@0K zo#JM`bCs(L(KweYzIv}nzNBl^?A6xiU1!(cJ2flFPwjEqk5$ay{C%GLD)9@(v@_XB zt^LkhC(HGBvAMt@gS>X;$~}^w^_7aX{F8i+7W!E9o@_S^kq@1BjA!9eC+ED@3t0=zl+3;3cT@h;cDnvgiOa4)o{i~~vXM)=e;$@FA9W|e2)$jU>N$QHLPFQ_n=dPBe zujF;QMUpC0RKi@mE=bJmRrC95+V@sWHKx^--_|}%j5_`0%meYPXWwog+$xs0UpglG_}lNz*_?Uj`POaybl>vNh4p9O z$+tY}3jVQk(I*zQj`$oq$%EeKIP88M75OuDf9{N@9sfBG2 zd7Jmsz8X2(9dQ~htLD!-Vf4o4lVSM}7waUQDP`}LzG9zz+D<-G&`3l*^WLXsk5!C^ z^A>+z|3Itr{H)lv9PJm}Z9(o@h0^@hN_!sL#^2bm!Ds)Y$gC!}-8Z)exEwsfbXUdiLZkkJdD^On#I7m}CiYKZo0J|f#d+Qy&zp9MZ3gLk4%RJf zNbKA*Rc!x+qvnclU4CY1`Ma|s2t8Q525ms|CaR78Ki@BY_vOKCe%qcb znbpf8R|Hwu%)BG=`b}x_T2Ax3(_Z>L*>!7Du;8Rj@fTDvCM5ncfb|qkn7%}ue#Qo#7+Nl>E+VO^)ufaAF9gK*{CXCd}QGa z!}W8sXO(Yr^4&cBk(ltKyjzhsZ(n|xa$U`8m#nm-Ptb;-JiW(HR|Lq;D=)KETYT`4 z$g1gUq^iyMj+=DtHo3Pnda|F|`>IU0TjdL^9nW7cOWmuRwAV97(`ReJ6!~|FTs`5- zC+i>0_Nus-A-FkFF~Hr~Sm#U-M_zuRQo7JN;wC;a4nO;`Rv*tn7^g}ZWyt{A2 zH?*4F>pjZ#c;_zDjaT2ke4AOUue4xgDvyS4zLB5qrb4M{T0V~#J&n7zw_}NS$?0dS z_s+={iV(hLea2;T@6$y#Q%|K^-`q2MO^E2+%er$8N=#dv^U|}#O4qY+r>M4P)U&NK z)m4ul`5kF`@Ydoia)Mu9lO%m;_J=A90Wcd7)&ndTX&8bh;&i9)6 zYRg8?B7>z$iA$eudg)fB;+{Um$mo&COsAy9d|!*YY`AYeT<)>@%3~)>^SyIqGOsgr zKkoVDDjR3^G$q;l^GQARtuFkpHcD>JjcMtQod06aL@l57JoENnI`d2AZra0IyX7XG zXH#r8o_($Q!29T%)E#$bmy>d&In!Mdm zXtM0|?W>G2r@1cq>@fPTSTp0O!9*|3GupS8mQ0)d=y2uh_dgw_%@cN6GVJ=%@$ohD zj)}*2^vadpyrKHJ^ytsWt`CzL@3^#1jSCYwHmj(-m|=U+imgmLVjpt&-VsQA^6BQi zB{Ih^Naop<)O@kvE}xX5YCpX)DDT~~S4Shw7ruUM>+HJd&z>2lirC9;|4^|@mC#=; zx!vfF(nsOa`DcZe{rz3SFhBJKPZxvS66S?Frh8n>(Gcl%TRL--+~vDl7SByJT%m8; zJEyf)G-YC6kDUV6ebA9V>9xpfTt zjucz%>AhXyvTBWjxq5+}+_sOQHd%b>M<33La%7wDSG7K?=IAjwpGhTky{uc?gNr1t z_uk7CNsIoWR$O)BG;3#JK*s+iTei)LnZDhX!8Y;n?TTX`maF=HKc&5)T3cd*RKG4i&jCN&2|lEKX?et3A^N*T&!Yv9u@KdQZ*0*Mb+d&EgKPpDFlKH}Bk4 z^M+X;DwloUm-Tr24_V#~4V#1{T-J$4pPlhk(o+56<&bv!2j*h`A}*TW+GhCFmhn&I z!y`hSPH{#zwWnG`;c`@^0I+ZC6b4hWgP@I}|7rO(#yQcO>opEs>_|3iJTe{oOJ zma?1uTUq15!4|4D zC#2IZ|KD}}>egKE=euRLWlBFbn71b=xutuvZs>A>y4B|4VjQMn4`2L$#AzGO7@D6P zP#n`Md~a%KhmL+&h>*ANi^f?exN~prDZCTT(Zv)Qdw-erPowY-gUTP%0wdQXY~N6q zQu?yk;~VGUm~`V5y9#sZ#q*=;!cMjZ)^C3L^8LntH?G}({Nq@H=RJ$40~6QC%WFQ^ z@H^nT)J*#Z?`BH_OR~W+*L~s|6;5= z%zq{?Z@OiJ9osV}Hnr{Yk`q}zs~OC6%vn~E%{YC=#icTP_cv&t$#ASLE!DJOsj;{0P9+tb8%xc*SUJBU$ zauM2d)McT5#q31a`HjT~kGxd9a@fUFdDmjwitw{X9x%MqeeiE$)TFQb9!9=5w%GpY zkg-SVDQ{(h;+ z{rUz2?;pQhh5qy$ye?mJ;K6J8&h_;w`~FS*@vHmKJ9*A6^%fWEn7Y^ZC^C9PbJqRmwx?zxQx9T(qAqrpKxCI%O}rM^OUA67gSPz z{;5si=w_WM>>qaQ|F~9Xage}ysg@+R{et;2M;!Onbmy6ieGr-dev8?s&o_Vm{_yzg zpNc|Tcl+n3PaFNZT4i-JBKW}T?}1WJPhZ2TpsOo_f_fLq@)`LFt&DPWy87;7 zk?Mcd2h34NZM0=iGN!t+g)XqYRL78fMVa~3y?!Sb&(5%*zA1CuRHw)WJZ=v%i94Rm zrqmNTrGJvzbLseZpX>JJ-1~5C4Zr_C!wi>*Xx_fGuN(fK&zcgJ%yT70arLZ4%U($? zWvbz0|Hlk!HEudzc=Qz~1B0$GzE&ghA&=;-MjRt1L9zKljv}_fTG88XGwF&%MMrC2 zV_o#RS)VOADL|R?7Q0Wa+%!S9>kDtnD*RKt@B62V{~tsBl#l0}c5zPJG`l+O*}Y=> zbnqFEns?mq9+GN){ab#|zlf^!J45E4Zg6kzljmBfwf5wPqb{H`9^(|8xL@<^RGeR+ z|6tYox#jJLu8Upbao;%2f2(>=^LM{h_cCrxn<(bh!jow`A@Hf9H{Sl2KW)bmx35i!do5pa7Ug=Y-s`b1bNw-`ocWT)=7h5e zA~QXrPX?~q*KAX!Q5pZ@T!zfABlHv#>ZC+cqWpmG{C!3FqCu2hA!J7mt;jA*LDWeK9*@ zlAVxX=;jam3Y-pmPrRdW)9~^VQ|8Yz=l1$Kwfp^6$yRyO&6p#&ER(gU<@V~#%0q8N z-wICTSsU=b@9wSeDR#-1b-vEuF|#5sIQ4*Dr6@=DlD%84F3LUpm=)FeA;om9Perxq zSqZ}Y!9;^xb-xhRed$RYmv^h)f?zLFZot2aLMSc<6A8@)7`z|E%hmnCn zj|Dkh#h{)4h8=x28c6&yn0Y={ zJZp=$`|P}T%X$6^+iBYUVEz;M$XAl*$bqwa)h(YtyHoSOrtaVo#cetgJlgyIKVe&0 zkk1|y$EDxX^s2K}=J2=0=3ip+m&DjT3EKJH>D!`V2tfH$IC`H z-fHyL*6BLEO*Q*Ev99xArq{{GZZA|h{Wo|^30KVwd1~ms+cl$qlcQyR-GR!*O^Nf$ zqUAS<|Jobw^rY=WklOV{wMmAjTARytg4g^N_4BZBbe%na-{zTy8fhW9j={WZgpD># zocJa)e^nhLD94*Wl{_89$iM(Poio6jnMH(wgMotqJ!T}3#zhe^1L+|yjpVKgc{=s~ ze48DUA9ATUn%FQawVX^=QP5%(J)}K@g-fs}EY+yklTF>YFwLpqS6z1Y)_w6`*KXfY^Ymkj@8wK9@E}KF!kggTPYPdbDpS4Q zvex6oQ=vEAM}@K`t^8S$eMoTi)kx(uR|B!$b$-X9G|#QElD;f2;q^;*>-2h81Ia$u z+}m4qZa6hYCo8_P-)Jkd)r$Rh^_q(C1?ovNXEe@in#B8@!|SzJ&POMMyGL@)DCW)2 z{c?48)3pYn#dq{(do(;M`Fb?j*=zC9n_<}xQm(6W32fR_rehMgoToRy!qCBW&xgc) zja5abH71lTIkW89`H&4~TjZBtsM;H5l)U$4DR*C<{nQ;Nk0|Lp(^UJF?1^YfV_tqy$Xz+-5s%JNGm(_dq8pn$wU?}J@?2-~ui(u331X^cyBeQ1 zO-}w8SD&CD@MiNLTSx6j{8=+{)F<8No6+02!}q7o9AB#?cceOwEqa)su<2si@{^gD zw%s&We=O4VB>a&N^I9h3>1#W$Mkq^c*OB2>KcBMTitNtN^Tm>3GcyiXIsRvpgr}ztzP-J62YdX2r%}nx69aNhrmeXv z*VmS{_eDtHt^&QKd^{hfI5o8;1<5lOt=Oi~dRFaR@axJ+hUvbI(R(w(Z^a*Jjp1x@ z+Q!uMZP)pwFP@toKf2?<0W-H^#b0XOiUNMe9_{x1qTnHUrFQNW%c`&jx@8hJq3Ryb#0zIWT34^T&ZJ;&_1mY#pC7QP&HNUj5R!fL zvEi{NzB?iVR&p*m?4`oAH_WPCM|+lYkwxB%n+LxHxU`vxK03YQ;(_oPU7vFH9_&+m zt~EQM^-8%|+?y09;oyR%S?^a%Ju)`kedpc5xh9SVb7#Kulka(~^Zk(?^Y_5>%1=!` zFa$ThvY)}@{zrDVX=#DV+8yHGAD0QoA3xmm*h72wq>Y79F<;H6@3ikuyIsL4XY^4* zE`6GM@6?S4Gddd6uWbG3fBpT@#ccDExHKmudf$-x^vHAS1L+@X`4Qnvt;Q4OX75+p zdFT5qjpG)k*EdTsZMnjIrX=r;?~BroZOif}ePl_=?i1!xKCsrxC*;6tmHnv-p%Jo{ z7I8e<>+_ATT>fG+)4IudkM?(f3|^v-$c= zwMu(~7oW>?i~`@jskq#1fA(F(lY{d!FKrE78`^!<%+&PbhtlkcOj%wFKlyQ{CfWEb z{U^@$?^5Z?8WH__p;!OU>UO_m`oVl>-43lg`L4p-g4ZAGuP`X>3;)AlZ}KsC&++I9 z&-WST8SXv4_QJCda@zkdofFv5|NH$1Vdnbxan_P6i{|{5zZ5>{U92>Jdl*~QZRXv{ z%|7w=!STP<|J?Z)!mc%A+Tk;er7Vkj>W=UJFZn;?LHs9W?O7>dmo)yEPpxOlEM+Nc z{muS6v})?dc;7!pn~&VKOn+(5^QX&(+f^m->x2T6nI9fGPyKBFQE=_m(@$fWGFK~n zF<1Mi&3t$5g!?mp>hm95zGJmU*UM9=ilx8$Bj>*iug)o# zb{{gE6S;mb!`9Xi7oR_t_nw6+JY80?{^y(@o4(y78V&NDZ&a@(c< z+wxZTvG2?!QPVCqD{CEd30_q^<<8O#TEWXSf?8)KX~=ke)BI8qob_Rw_Ojsnt4-8r zRWR$nx^5zTJdtT`becp^^ou*&{>066eLijSiSt*lC`a++_e3zZg&tbRlKs{@BJd@v z@Y{lkKjl8YRBKg@`+qAeSh4kJgw=$J~BmNk}oG0 z?h&%TI^i<+Uc2Jx>Zc~6GkaZT#=TjlBR;Kp>9%tD`71-rKe>5*ird8WS68%Xn~re` z>tg-q=WfmQi25s+IM;H$;otD;y!6*y#n;!pUKLv#_xe?DY_7CbwsH5e8=@-=7c5Z@ zT)$>&Xxp08n&QPXW^IbQG0R7$z@hPhYOGIZ*fvqk34wbP*KNtHKly7KqtMnjw*Su{!$l)!UmY{Tm*>7`bSo-rlL6-NG#dlZBiW{je z5c`tRDeC98rE^m5vX+*zk3u_C=WyK44UfG0^INKxWALw%(CsBhoEkgw7V=EbD7)Hq z;H1g-Q+&aTx-x{eo%Cw?p7DR#37bxD)pse&_i!uj4=>sr)2;loK~pxWt3$>1(C?i= zhO@s|yU41!ETm5gQ(yoJ3^iPM+ z394JYOk(%?yx`mSl1}B8^>szuo-F#qWnb1Q*|My@?5>~_*L`+ImuoLCEqipSw|r*N z{6|yOl9{_o*K6{>s)_OM39s1SBxmq6(YmfuF>6lUUFCjGu~eDeW@0>iuVN#m`>wsp z7cb?`O1_=__R58n$#bFna3wbwd}2cI@sSsZ(|RGbW4hY&tXdblC2F>rT8k z)jg`M9CT}s^{h9WCp}D<#*yFb>e?yudpnQt=YYj_Uvs8~6n~ri^1Vy?-&UQ1!f&6i z{1?7%Cd``=vWorXjaM`EFP^mf&8~fK-lt8nDo1-<($nWDl);#UA@!=ynf7R|D2*^to>e>BPMvzP8NRC^S<^iU4 zF4;*hUu0wCR41=Z|^E^yhK@^m&@2 znSLt2NxwC+I`HDdY>9)O>^r!oO#B>E=li%^G~Ge?xRY10ROS4Gb3b=oiu^FMFg&UI$;DalQM{>#9#5`*Dps8f}_a zPZ;oNEqSGSyo`NyoL{0z_@3szisH%@nIF@N_-xKU=a%`cd5`f>yo+qyBJTc4=NB%j z;eYswc|I_dIe= z`oC-Mz7mQ3SC1e6D%}3D{a0YkrQ8qsE(SWO`vfJAKV0j7lBL|;-C45S9k^L`68!e$?s-jPtCR(?)Ke0Id6@o^7a1gQ(bv8&b^s@ zH!v=EozSiG{n@8NkIgC)-L!1aiYe2tO(`yar?@X!Ug`AVlxG6-8~e}4e`2tI@MA*z z5A8$sXTN-s)=8g!tFeE^%DQ%g>dPALO!CR%b^X#eXWr|yf8h9Sc7KsgtH0;#{$G!I z_&OixY99T*l*j%_h5xCWJNggnA32bJGqbDWXZ{|aM>7uj70FefbTtZ`Cb(%*^4t)w zdiz+jf;9$OP_SSKG9vvp88DURqbM<)zvO({HJ|dLr%-wUi>9H z&+FOK2*)(5bvFGkwa!m{nsO^m?s!dzr|h!ROkq>%ek`3iC;QU6Givuex0g={xhs)( zZpWr8noFX@Eatq9IX|Z)=+;!uNmX1oGj;C@js?dcS@pm)>EfB zI=4Nl&7SSpBUZF*k5>GY&8t#Vy{=vPtgZU?=I#8ZX@Wv-t#1yfY;#e)wdKRjOmQJ4 z=^UqQ4>#k#GPgt6Q-i&>-6%U#<5zCKdCJ>M&54F_Y=*97N!xfPzPolN^v{Isj8+hx){W;Xi>A1gNPW&!Sf+CDdcrjiANi}BCLe7JW|-SI zt!L%54Nn?l&J~LKmYVwPWV>3V>z6Xy*m>RYnw^ZiMap8QeIwMiC$!$_D!#EQlJ3NRc*0bM>X8=Y3%vJVt3p5+s$OA+}{4N@VVK!cMp&M zwW`jLF1^ru`+HK+@9s|?TWw}lDp>{~|k%y;{6+>Io|$&z~;bD*`27ek<)?7!xNu@nYi5 zB@dc^RkZUjbGi6NB`UTf?&~5(ohXIA6XjfwxVP%;Pv7iuwJdq7OwrC`CqtLM3R$`D z_y5#r`!(&ePv6%3_dH3|Z&~u$$48C(!+y#os(zZa=iGL)IAxi9hX3Fr4GmV8e2y1j zVEC?pZ}><9>mY@SXIYkOS!!O1M`B(|PHGWk&|+>-w7;;U$iHQ-)20b}EnT1?zA;Jv z1Q)CP8pDf=Hl``7Nz~lSJ8o1u({%UcMfDx!!um(p>l^G(Rixcck0EfXP-n8f0G&gui; zON|2SeGHkI7#NP?Ju6cdC1I6h=I0e-4oxySir8*motKwAt2RO~Bw>MLuC2IZM5Dsj zgd3lC@tJKsck11mXXjt7e6dje!tN{UJKyOziSXXp`TfkC;^%iN|5w#Ech=@a7)WUC z`~TpZ@WVL%sT`>_dV3V!g!k*DNSM9fJMno{^3zX((@*Uc-6Y<3zUp4U$Bu;teuc^$ z$%?;uqPJe#-^3j&f8CmArrV9jJV&QZ_@gCRQd#o2l=Wj`xi8eXI_qm+FViP6 zF$u5C^9Lr^Zny0el{a|e*CO(2%E2`+*ZutFvdVg0%lic#lYAdfm0h#IMXYv~r)%f> zLo2E>niFRp%xm|2^4VK(!t_t;5AuIW=J5;mk~3w}@2l*|oiy{p=_Oj-GH=Be%AR6- zy5=X-^G>cd%Uij%C+uD@+jCA-Jk-51rn{{3sK)c}^ESF{{1tAY`cNeGZT+`%Ri_sG zSeV5`4767<~hnL7WC0cXBqgx0ohz zO1Un%su7jD_FJxRZhn65)##ksEB9{wd;P|^f3nYx@4w%Dzgu(PuD|qK-0S`<T6IC(;E+%7YU58cVlwAPoH7x~UVSR*Vupr=@S@eZOd@yfR_WgE-fo}O(h&yHNdyhm->wDml{8>90%Bt#nns<-ab73ofLDpe8FxpsT; z(V6>hTbwy}=3pbI<6hQVGZNZ2x_$rY?Ae+%4 zT>Aw-B%T$>*N})2;+^Uo`TWVu&ps>KBDPda4Cl#>+HO*>8|+tkg1t_8)nCVC*ELHI za$M&O>s7m0=@Y3v-8l96)Agl-mv>6}E?ha|cFwM&llayrR`FhlNMf=&aK*IU`R$>_ zA-dN09a*P&f15esP?T}-;+IMn9)5O@auz)7der2sqp^bS&c+t`Y+pAMU(NKVPx;q4 z^{QR?q3B?E+Oe3SWI?CYS>cb(;y;@Iy>Jqbbts;za>|G6(hH?1js`*HU58BW%=qHl z?aw;lB5^ql*+fNL3qjIs4D`UZKe4kiq0X4 z`&ZtOzFofiLG=L=RGIqFnO6sExNI$@Y2$iovMCO z>|dw6c3dxb;9jb0+XcJD`WB*hq;_VkFu40*!D-#IHq>16u)Wlt6S`DYk$uh;tu6+WnKH{bm|VX9oblig?aIxy5iObIXGF88;c6rJy znG);EKU~^kvRf9{t(VidJX=WZwzAsp)BAo$Zu)I)`it!@v!8FLf^=@~EwNOg>+c35N?``j-9LcyKQ`(~bSWYU`275inwf=I8^DL=QHMy;LqE!)J)ujW5Lut==rqyKyUSme9Q?OP0@Qo6i2l*T|Xi`ahdRK2EDCE}=`xn=UYX`bsdzDVs|7vnzl1ZVAI z)likxgZ!quymbF=bTdBLvu}RJmtd_xpCwk@yl1cJ2c-D5Uvjk99ZwLq3&Ty;W@LDgKTk*m_=f&S& z_;;lEY@IdhW3Bnzoa~f?@}^SDPd)tY_e+1lWZ$e3wYjQW_FKGIUmL5x(pbD!#q)`< zj?h=D7sfvdFGYtu-(c~i_vE(NFDqX>mj7~ph3*CSrhDhh7d?oZ^CRomIq@$$oBy>Q zTYBF_*lX1!BlTFP_a4QZ8k37MO}-tz$tRa{wYTn7!AFIh_I8hTqGv5DH7?hDHhjd{ zGGV<mmA7tecU2(@!16ZN16F%P4hbLu`QdIvH9Ynj|MB>G%eQ? z;kxoOI<&EW^Rp)teJ1-}lbe50Ap6sg=3d34=RPP-{3R4)TE;DWQeu_w;j-up*$e$2 z1YX*|*xYd;m((+N5xMY9?A;a>Yu29hs=JsWz$;eTbNPplU3aF)s;NowZ~GS<@$&JP zTHx<<#vpfdi@Jw7uYksd3)?2!`W((tXYW<_6zCCNEZtkBBcRK_V0QG)td`Q5&lcs_ zg+KnR8tNs!q^FG2|C&Yr=Z7bg&QI{?_jr;cu<)qO)svSWxIcY*da~dl*G1|xW1jc3 zEs1>cQtJE@p;X3bZ=-8r)7EO`zf+%`o?$cVoO8;D9QN}^@07#`_MX2~pmFWhBg;n@ z66ej&S!ryZeQ5gg53LRNnH+<*n5VrHn)%G?hmdyLulWbkcKt}|cv2L%MrYeO`7es! z{F4oT^9XygPPeSctm0p*mKmdYH_va0U}NYo9uTW!(~J9Q-QeSTlwPV_c?65RMC7!M&z5h zse5YF-ec3bqZ>Dz5m;5Q$LH}`BYkVBtf`T+O}?G_{h&?Y%3Y-;Y`xM)OJfptUz7i6 z&f?Q=Wb*B^*cz9+zA_Qre-}Oq-O!-o?VPVEdx$Zwtbp4|@2uPH1qZ~`+Y8b>*e0q! z`FdAE>$+6>7&c|q1KZO^MIJR3^%1&PyyUjfRUH_4`&o%XX=tF@+ z)?M35v)cA4FaG}d`VTes_iaIwM2|drWd1;E`$suXlZjEAj~do2YtNm)QnGsT`<9S{ z!j9i}txTLfd4HeYMHP>>yGz^)vpZaQQ;y_ET-AxKiCnWWQ0jZ-mJ3JAKif*(KhN*r zT$R0A@XN`AiO&D~f_1f~vVPCp<3HtXPumr9#dlYK%zpOK@Y<`(i`(A3PwbU{`1e)L z)JqqpFj^bW_G~%0UABf{;rw4=olDx7d%EQx?+wy8ZSrrO#l9N~3pFoZ6y~!_iH>M% zN_pYfJ6~jP7VoRlwQ?PdFCFc4UKUH1Eveq?reY+S{%+BpGxj`F)9k90va+|c2C`jz zvHZt_6GrI@cFX^VIxTjZrBS)k`siAfuNK~mH(&k!e8Lgc{<`@u|NOtIAGyJLzrxyw z4!@i8=OviTNq)hza;B|RZ>Yb1woTyFuJ8qSuKbcxVHW;mQx`iaEh}9#(Ih->*&#okmh*4-&6&8SF;y$@*5S1Be1$OgF9-deFUm*}ewgDHbh+^CB;);+@=13K z&zZfSRVtr$x6sYxz4F@M8r|=UWMoWcE>lbOJz{5jO@jhvgzo!PCP1`7MOFVV5IOq&qB^od^komqaXgu1F* zCq+MvyXu~I)uHI{4mX2E6QrB(n4P%GxAVHwxmP_!*||m8t&i3P7iHhg{(WMttjD|F z9q$h9;4I2-yA!QY&i~{dr{(LF_a^N=K54hq8nbT~j85$3DO&$xNv~63eo&El*<`*= z=6=2f6V^&NmTUM0zFvCwZsYWl2x-wZMXNjx&0=C#m-!+4h2dCp!&dPP-yZ&UHep}B zdg&L9(94e-nvG-Gw!R6-+R0|I?~12&%cFmrnzkRVjh&O{F@1ls!d9Ek*MdEMC;FZ3 zmR;T)aJuls&6$Dk^k(0Qbt=5SJHJIP?7jQN;KcnP zhuem76DP80O>s~C!oI6qVL?6f*W@05hA+Vke|hfz=UXseILbfj^i77ca3+m@=SiXq zjvxHwz+bwwK~A9ScOmN+2Xos%`>y4^XI?LIE_`LOU)I*^{IQq6Kk@X~ZtAQv_K!MM zAL>>V@APvbkMvVsNwZV4jdG^UKlx&PFSD0)`@`*=xjIvf4mh7YD0R%B=yQS9WcL8U z{v|(cxMEvoUn|zjJ@_-jx_{x_8n(BOH(H#V=X>`}V_4h*aoyr|j+drwv29$v`{nZs z=k-@}Z+`q`b_$!m$j`_LFSh+QeI6+GJXvH?_wqnJztYD$B$C@wsW$ z-AUCaHU)7<%zdRO|D=v(XZ`CX!A^zsYo5##y4!z7+R`dhCBW|Jk^RSC&ad5H9JXIn z{j%cxpb6%I&O$|uRtk^I4&)wx!SE!vp+@vUobS>-bF&IUK7A^+IR1|1&i5DoVt-<% z-I^vU^Kg!w!`o+$Ut{0Acp|g#$)?Lk^!?Xa@Q3>=FF150{G6}zF-xwSHM>sCYp5^} zxZ71IJ>l)b%|FU!9V)-TvroAFSoO*|@(f*?28~WjtMqiNRm3NsO~`Ej5%}X^h86#H z!?fZf9sZF9;+L1kN@YJgrfeg}n62jbbw-kL%p8H7_D_jc>85OSVtDQaepAO!Ubo z%S~?`3+>h?h=lhpN-mriG(q?|Q;k+nabcs#M~m}XFCKAE`u+ZyWx(A%ubhk>3o{qa zoVFvRw8-_v6(Osc&G&kLX!fKpn4Df1W6Nf8{$SGaOd)%J)|w`-AM7U66NTzJr+qrT zWm5b?#XSrQmtA=0uCK$`YSye+mRP#*f%cnc-5}OT`mRU_-&${gO zd)08g`w|zLn@qjmUS{ud>KFIg$NdbS))y=}rE zr47YXEcks@>kb?I-)$NA*f6|6RQ|%?L|P4U7#l`y%sP&*F99Bzs0n zu9zcM%|{;d&q`6ZKk9#5ZRbYe!0!n^)a{E;%=-E!Gs1RKLg|~5HGSG)I{$69P1z=F z+~TQh_S0t5iOye5zvQHjoG<;@J=bPm!&8$3mu7ALa#H86r1$f~m!@wr>D2kl>Rp-a zX}@ES%Jj)jza8{8KP}>7ihC=3;RSc;j}?i(UfTRy*!t2<*mU6!#?Sr#?mM1!sGH~6 zD-kJVv}0f61jR{*zi{@LcmCrAE#~r#Stj&MfPvw*625U#ZCt}8*oR7MgLD0b9R=#P zx%SDaCv07?^#aqYlBTdvQPn>a1e^y;VJx17u$=CP>t=?m*l>5xqOy3uD< zxn$U%&XC-;I|tR5_P0)BJgnsZG2i8nUYEbi^o4JJ32R>ZbL*>e+swNwv^idRtH$yB zSt-?>wq97Up+mLnp71XPsUwU#?-acL_f+ea*{6sN1#=fpxWyLL7AIBvQ0(a#sE%O}l75&0CbcLHd)5Am`kROS@aSzM6W221YYY)>_Wccb?Q+IZO7I>?J$r*M6U^ z*O~5HRL~YZ-!Om4Gs#oQZ;wUn{@TjG6P_8T#+1OztuZ-fq1>8eY3U`aAD**xeLLq+ z-XDj>7yq;!lE_~^O=xMD(#o03w)^&-Z}x}{-1DEY*O?Va(Ak%1wa89DhRpsmuB zK}tTssX3|1C1``8{-?pWbWh%L?AR5%E59597CLEXY@_P$9ax=w%tyg!XaspW4h}<*SeDWTW^e?+`2fy zc*-uPPqRx*9(-JD&asnOn)}PC`K^mCy)gN0)};{sM z`|MTX&6g)mI{x;8x6r(V*&%9Q3|F2`?%U*=(Z0&jG=Ja0%7tx-^ER#3?@fNvBkc5~ zy+Czx_C>vo5?2r1)1Ic0Ro|*Bv@PK3xAf|3#%xFVL!&Q*Ft2XmS(B<#Z8m#XJ}7D= z}|-WE^yBRAo)b)vxx?(<&2pIC(H|&UO@>8+5+ z-IN%pHq+h6U}mSWu-Nylp|8WTx9V-Zdg;=xx}`gJ?bdGZ?^)qn z?-$>nZOVDozOH7^=X<-q=X`(j{n&H6iZ_L)7HX9?yLM%kRR3Q0s&Ae{X}9c_+sV9) z@dkGi1NDMG`rXgFfA7_cc@8TUSEVK?&d;p+)wK6E-_cdGnJ&(7RuJGj*)F?D*+-dq zce$QugXq2q_8P{QXR$pt-)bnlZd#^AK)Bw^&ZCDGM*1YrGHNM&X1p+qK{cN5=&u3} zqa)XTIhlQ%(WyJxQK6dUPR$vw{|pNgf82P`U2?;4S)kh^v)kfbVe7xQTD|evw%K^! zGmGlDo0sG`*_)mCmUtW8Tz<`A<$;1MZoVm(&g>F6yDy?z{qhbSj_UlJ$OC-87^e!q z=rIb-%j9ymT2*^@-#5SAyVl<23oGwXWqNzHcVULkrQ|n{H6%S&t!{p~L@{vI+lcfV z`|pUkJ}>*pq_|Ab^Rww=>Ce~Zb*$eVtz&&o=j#zB$Lm{W&k=nneDCOy*>m@nwEiud zkm+Q$<7WP59W|fJPqK}doeb)kDR#|nfBjm0hHJ^Ed0a{bo~_L5bY%#;9kEX^=z6o9 z&m|F#o2#pL-FnmUFvua)XUWQ0X+}?PKmYQhDd66W60Pi8Wlqa(eL5?*YN4dq!85Hl zZA{KCt-K*}=g8eFOE!H<&N=PuQ*6?^ob&L9vaV%OQ7rM@w>Gw{KdbRu;+yvU7YmPW zxv=Q+gCysot0C^*3Mt$5g|y}pjmjLFuc^88$YO+K>l(oxVG@0oqFmrll z){?0cBrk0{QnPX13XT0W2EQv-bcRJ-IkV()?6F0r4kw@OUy^>D&pOEA^@69z5-z;^ z!0PRMERNgTbn6AS8JU3!A|1MNPBkl%OxIrD(s_<$#gEt%{RI*{B?qP)-V>&gb7f2G zHmB%~8#c2&*Ou-`Ofb*3ie}k-q^`q-|K|&x?prgu*j71Dp8ufZTAOM1tT0oi)h85R z-4i3o~0xr8v66^>%-MER-Klz-}ZVgvwH@AyOVeF z!>X2-oT)2qEkhTcdobe&pNMaD=6qqjJUi+6Z>?7LsBPTje)(q-?`q|R54m63bn6wB zPe0I=c+zn#e|c%U^MhqCg?3#jyzG)8x_jZwc_&&=9-Xyrfxp7$PH%SRI_pgr#ouh~ zohB#}e(9-LY^%tm*3~O}PO<*a^1Xhkl;MTRDo-s5PQ$yu%}U%3Rr|P!-!+U)zPS9Z z&}`NT%dSZIns?s4IxDp4^UNzjpLKlaPgXrG-%-}Scw2kk;%J>+vP~+z4?+%^s9e}R zdEbK>2Xw8N7hTu1KJ@PMtapA{$5KS2YmPeqeyP{JZ_eB2Y=M^<9VPih8m_fhI~jhQ zvR>qZ?TNmx`vNjGWVCy4#6G-Rw(|bHhp#!0c_klnne}e*Z^bp6Gv*j=UlX|HtHRyv zi_RCqjC6ut@&=uFckS4r?DVZFYu3JeUBYqOC1saG@F}A*N#Q>xTE{egzfAP4U3A6s zt>A6(&C)VIUmZR;Z(Tr1q{^Mt23DhYZw#+4keR>MeY@*LlOCH%R=;(tY<4d%N>DlY z_R|IPmz_*iTtVs`S-;AZ_OJO?dhpQs3)^+99=*C7Ve#?84+JKl?4_`lTRy2u6oiBbt`%Pz)B9n0}`c*E%!%z6U>vJ&B5RN-* zoT4OectNu7M99>mn=ftFUbRTJTd6{F@50b)9rXsx=buQO{aj&Jz|7|4ClKke)hU17 zv(_A|4C@OQC52x~rPMV(J9?;UhR1gG2mPg|-mIMUI^~-3=DBRn%lxn3nc#LLXIb3m zqBzFDqZcIECvx7LIHgQPFnPh=>WhY_y?pHp@69rKe!;6UdTpjjuVC=ntvgsX^Era# z;`H~me2ZSb`Ff4ob|)>3gyaMFF3a}KSia=k!8tJ{JLj2aO1Y~ZD(*g-zEjR{L+pnS zW*<4^yYe=i230_ zMN6kslCvJHo2RF!k#RyN_+?6G4YtQjZe8&A#Y5BC-??tzr z*T4DTh|cr^t;eTKBr1;8?Q{6NG-+?ri3eAl(*t!h%67SY7JVc3ucfq5>*TlXM}pQq zh*|ejYoF9^wzI1HzQs0VIBw3?=jANkKjr_~MRT)%cy+HYo&1#{Xx94a3{!0Ovb=4x z*ZTR?%D2_TOXOo_=EDUY=auAy*FNyD^i&9Lne&>=!fN0 z)!>D+`NpWjs6wcb4JwK7L z{L9DfANx)ApRzCJ^Xkpps^uqBaru?#F7AITpIu+FU3_=mq)jS$-?-22H)=J`c<*V_Ef4wW$3NCj!`y@WQF8D*sajxK{EFa5f-51<3Ct^qRf_vBgxCa;9K9s?`JLMJs ztp7@SZwy71r82ms&i~u|to)~Kg3?wsJ+{@%4_|G)P{32Qtu}VW`u`91NB%i~#(Q?{ zg@ACz|Fbj8j8=Ice*4yT(qeDsg+V(XYiaBAzSl5yo1fTYmz=63bl?1K#r6-JZ8m=t z{~r&U;vqIuC}U|)&xdTPnwK7IGwn{B`i(aJ?d!y&J%UZP+oqfhL@0n<&E~@cf>|qeMS~z57 zFt<>5WoopP?4}p$U-K+)T`xbyXm>SMURhaXz223Re`IuYuljnJxV`>kUA@R~LFJVa z)2l(LKEd`}hHLk%I<(h;`@72#R-^nGclz!vUKO%)X`0G84L9MoCgufKeI~9j5b(YD z{#D;w=SM+Tqs~t2kiMHJ)u!T*d?Nq7XoJ++XDfg9ojhCjDrwS&3x|1>INpXAb6;`V znN`3w!CiNeeQ^APyD9X zEn{_#uU__Ufi%1S^6*tl72aj%Z(n?IrLn3L+h1*SMB>oawEmQO4Bg ze2&lRV+-&4?4J1O>MN0rv#x0OoiDd|{W^GZanSl=)2|kXko(kfU`- z`(^pOjvL>yiuLV}?Vap=Zu4s4%LRWMHtDvurMWC)iDC^EUnF7js(D{Vh{2rKjVcqL z*sN%|s^?w0xQj1gVW^AiT;a^kKR3HA^j7}a&fEVg@Oebm_85KM1-hs1Xtx?Y0PYezbw)87v3_j}a{eX!_Q7`0q6j$!=DgReit<{^TVy8BFdGg;C z?y<}Cwq1GZbJ<=g-*d*}r^^MNI#+JlH9wfvLaD>@&jczMp0Mh0h3kp0QEC%=xUdC}-Y_&u4^}>wli( zcKPF+uI)xz?Nj1vYG)QH>R#N|Ssw82;GCnP=O?VwSk-fRP4vnex7|PQZO=G(WR}I; zs)j6WxrM)uvcGuJx^qUX-15-BTXt>D$d#WPD7gHZMQ-=yZ|#}xbDEkgH5;X@Insg; zZklwcVl~5V$pE%MGTpY5E#S4mwd7jnwF`_5s?~Cro)wU^JT6+vx}oU9 zoENOqiyxOT%1uA|a&qmLmCPnK3(;U!fj-UEA-J(u6U z`&9GBUGc|XR4-=C**EL;e*7M8PH(2*o>wQ=I5axD#!J7^5N@v(G@%i5CaxAsEw&T)Y3H}57_#f>S zuX@M4)cvL5^iO_oyfv;T2;aAGdU~(!S6a5b?7OA;CwwkWF08t>$3}YjdzH$QXPg%# z9JF4R{`N)TAG^jviA^?~b^ZtU&R?qaOYet`y~cfUqaXVej9u@S|JWDsrCDd6KF`tb zu7CEm6pGZuv)vCr@IC#(Z>b-9EHv&fmaOSN<#X{g-~Gj|_NN|ImuT$UfB5}uiTuX* zw;%lG`|*#p=05BE`8=n-U**}i{*=$f^D_I^i~UvVe!trJW3Bvt`Ggve6Aw)qXP&yT zNb6g}dHt8A)8F^%-T$ia^_XB5%l-J~_xaT?d1q?=ntS+rZ(SAl<@ZNk`hQrxKk?7r z7xINw_kTLvO*$67D<tB! zRNdaZuEsHZpXEL0Ipr-{3iH=*?f+bD>7Ukh(}?NRZG)EZSuAs&dl>M})NwYB;d>X? z!{rg+DZI05kIn2=m2wt)r(ZcEtM`1Z!qWZ#?;ztfsmo^c7hAlpljH1kvt0GldP|^= z^0{Q$zbDRENS^cA)pBcMf$64aF%!xON@Wu`OB&Q^F6nEDw#`yT`>&dv#00ADy*QJzVBtOIPTe(LKrfZOfz>#gIwb zlcqo6>)N(T#hh1vy~_CqPoHwe%{zEnT4eoB6@6a){VMTK%=SN3{pseZ`m;H!^ZJx0 z>5-LtHX6mBy{@+Q56>r?kCHR)c5LJfvl9->Yn{41fH!~XPl@gd>8l?jx6C=;c658N z_4bQ;dCT*9xbX0ljV(9<8Dpox%ww%MV{%xQ@0QN zdJ|`6tY+%Lkn{HW+Zp-YpZT7zUc7a~vVs!%_g%#m2Yhs553O}>eRW;ouC2s(r$fIL z9{x3W#B6Y{nd54l#5+L`v+2)vPFhzwHH2%@?*0oOIj$a^km0ZY-tYOg+YikaM0`#x zs1katDRuh1Ql;0$J(KrM@Ok#LGv(axIVt<(ubhATwALv2%yU(rhV>TlGS5#x(LOi- zOz-FADMsq)BKD?T`5m8mUw(Qctu=G;3ZpKq#VbCYzVTQ4#^3%7z5fy?|A>1$Tkky2 z`$bUrzRh>;Ry%$=rfkCcDVFo6-R0Bfr+f_Wv;4gD^WKXOb32}?A1t@|=J7|YVqfn^ zz90YQdHq~pVzi(A*7ZfE#TAye<_`R)`W??s=kqZ9w_9@V{n4c+5MSO|B7ALKhfvado~>V8&Rcjj^F$8pY0aM4{BUJHIr}F@7{geye*y{ z`B|vGX5J^eQ|CRhXWaEWH#xZb&`FnGW$&pI!X7I=W|_4>?NVo!Q03K>Re?)Q;^(^X zW@(wOoV+sBx4mlL;qyC-{0{}c@OoMMZ=cTIX$KY6K7Wt7z+4divVHp(;loGt7hFmR zUZHdU_;vnAHCvR<*&qB-ScbJ ziyMFW?0EFBmijuK^#0QYI-YMfvZb2_85^uJObcq9<$8Rjl+^NPmt9J^-fV1mb;T)a zrP#wAwOYAh%Nai}TN1l%x1PcA?n9sUe4ikdR+YK*@v9wI!V6<$=l_}|5+3~I&4jnC zrBjwq3)r}d{W{yKu+tgaqWsqQwbaSxeLu*};5k>c(DZGX%<~UxY|gmP(v}b1EFt^f zYR{R(D4l6@TV&@ewXToQ?O1&)`lQyXBRl=ViZ&L_kP>_5+3U79xcl)dlR`m`$abq` zQbz)>bWLgLnvF5%4*_Pf2dA)94O z&}xr=oqrZjy4TQ9dBUf8M%Fn7ttPLdS3f`8k#*KlJnOBYhpD>9T5GYD(^yvW9#`0^ z<@l;6dE%`p3Z>5sJw(+#w#s#15o;GY{lE5c)Xy3%6PImOzpsSl@4t2JRj#d5PK3cPg`@M=v{&(%Z4j~(|pbaUHh;(x=vwsmVabf3+Jwz zTRNXz5aaP!^ruh7hI!J7gAY>mW!4(6b1D>l9sK*Beafmgp{4gu?bxNTPVenf)=Zx2 z%$?g;g*Ulx4L^ESl)L!jZ_dZNKY#po(qe8_)iIgl>BY~U$~#OwlH~br#ve)5%H&T^ z+a7(Yk((Sp>GzLV`F~-2*YCMsSsr8+k@hb2+2nq|g|b^3&K*?zue56E=}bYs_uYYt ze$HpEFU-X5-Gevq`l{C-rf8qZmAEea7ktEBkp3RS zGhz%3@AU9ZS7_myuE4r4pf>2OpRl8d?PVqJ( zi}P>4jaa6)+p|3Ci(w7t|Jgqr|2$;=5pc{pdeYqqkMh#WpPkwH{GK)Bu#&6k4FYrljyJGERy0`AU+NrZi zD+_maRtXi)Fe+$P6n*n`YRMUgT8{??1``=vi|-uDZR0$>tyTWZmN=QaR}9X&U$&n- z<;Bywc+K-meYicOBUDxf2Fgh4w0?@_*{c2If4!2`S=qkb7o%27ohf{>SaO@`jzfj| zr|w)#Xk09ldd(!_QAwuKnONR+g*k3BtEEg%esjMx^_Ah_KcVg=X98V&72~d`9^ZI) zf{fJH7^{?PIaBs6v`%}_t{1zC`S_>Whm)U9U#D4=5^)Q2k@_Z?)xBlUQLVyNH}+|)F9?j=^hbF2(^KV3oc5+{*zB>Y+vGNP z)b4)vgM5q28>f8a2hGFG)=e^%VPar-f-*&he()vo6j@keQD$ONPAX)Q3^Eh5G?KGM zaJJ;qk44hKC)dn9^GZB_z5A9BgGPPbc9zuGFdNMoliIgV zeV<~ad26y?@#}qY+PWOBK`+m3xSH$Af8!ya5>NRpPixu!HszHork+^2>EyMwsdpv? zicU#w&s8<9j5YpaGjE!}8J%CZ%C_8&o8FVVc~?%|{0ZA8&26!+p7PiFt8nJA(u=FE z_i|>fo@+ayt1@HVf<@BRD^I3rOM2f3S(e5lekNaUX->fLuW~tl$KEKv+98y@{igdS z-$H9a<*QF*re??7zaY5!u-_enL!R$8Sy|8WQZr8r?p4{j?ATJy==RNt(TpwET{nLW zxx{)oV0X7#uFuhoN!m&um+W1;eDz_!?V5SQ+#4ob%ed*Z`P!9tTuudhI|W{OR3EsS z^myWmyKB#^Xw+A8RBpS?wx z1k0sQMNb^vV;-ww0suy=&UFB7I z>z&uvTd##W6|OBfctE%5)E=W*_Gj3wa}#8htFBBiz1YFq)Vccc$%-=G;-zUmH@xH? zo86Ty=G`y$+Sljsmm;Suql-P!FFm!zif@V>eDTUp^=^VhZs5dxvyGy+B{p8U-+#mM z@K*gJYoZjA64-r1K2&6z`EL4Z`}_Otmkd#?0ax=D-#gm)IB@5K?TdYv-h0OuUo23) z;r0PppADx=XLpuA_M3I?)w^wzulzhU>)9>AMK%t+T6ya^xn)C)W`EjexHrq~T|wr1 zqeSfr<>d6xj|x_T#sv*8!*ZtR*jG+FdHeDa$KE9;ExmU+E*9&Sev$N4YO&5tkA=63 z9kQ=^rL%rLVm3{4)=j}nwt2IvpDuHJ>)xGmW!~fyDb-rS*UvkCY4~{kw9MX|G_^jB zX`LyX4JCumwO^h7{gQdId%EKLS+lS1<-C)e#Fmzov+w$mkdPObfBS?i@|u4yKS?a@ z_2uR>%3Y^S*Uvo6d_F&3jfZ8*zeHwviF?|%Qm#7vyPMJujd9NBndAbw}aIi#dKimQ7tx9<$B+c5{kYr^37-p7{$x_Ro>1 zSQqi2tz!DzGe>Ms%ul(!>f@R+sq?dc@YH!5OfA^HJeMv1R^QfR?>AmGnmCc?PK;Hv zzx0ne^ZP3`D%bMtnX&rZuI-u=tz0e06D@=>wkjDf&u|Uskv7bGUlf#L(b{ zy1T#GJdWzzEN87-m!DQWEp7doTGM*acjC^{gLh_~=%_hUTe`9Ak+)i%e*aagpq{Vg zzGuGL{QS+xv+<9((X|8DBX@OGuJ@Py=(AAoce9hT&dM*m>%{LLn637YqyCJMz|9+1 zwyj^AdjH%r-`Te#Y~5BK(0ys~KWbJz@6#V@|1KPu&$Vu!%EHe4hqp~6N~PXzPPmuB zyC7oHBb!cp*5;ur26MqH$MCGCOSCSD)m~QDfjFd4V|y9 z)Cc+h?Ou@d!>>H;XZo-3tx|@sXU%xRdeookhveikmDa}kug!-;(`vP3H(%b_^J{0@ ztLTW8M*nOZ{$H^=Qd@TG$nBkyhvk<{eX^hFhrF7j_IEjhLf%!OpZ-fVJ#0N{S|qSP z>DGygs2k<(4r&74rvIOw33%)Fan-9V)xMc;4zKE!VB~yd=D$T#O>R+4Q>LYhjM2#> zg*Hq4gMEC;wAcFZdQ9c(XfF|XR^ueBlDj?7z^CcwLxbcKXC}SW|9|v|Ow7tTX)}wK z#<+$TSbaQp*~4b?)oX!LtBx|~^d0(oeX^0edvenP;~D!HSEhMQuevv-vPf1qSi5EK z{a2nT(!z6$qj$aCGG8>+G%u!qdbV%mg3|EWP2s$Lr@k_-yt=ukPqH$3R?zaZ$_t7e zY-V3r80xf4XWEAFK(BKi#_qbD^Nv&nFUu?z+Ieuw)15LO)43zlPW2WEKP~zECD}YX zQ@S)Si|>?H<#a_G<`9v6lkTMznmtXs8ozOu;(>Fzt9^YAioR-!_K94-GUi>c#Lam= z0cIzxoXxn-Jo>|NLd~(XSShjml0f0pkiGU(*ZJ*edwEuRS)@gtRIaY>MBTGGxl>v1 z-VR!MWMRd&g)vH-ZcbSHChg~`dq>P>dC8kDb!C6CiSPD1zEgZR(@ywJ;!RKVm~CHF zIjgF6q2|Mv-Ope|8Ff^O*a@N{A%aTt&UiN09b&Yp%*0*K14zX-gooO{E$0uSY zkH5&S)v@LU%hv2W@@8p|R8!IPJ+}o;+n?`GN%sm#`uFFB*S@kh7f(K25xB|S%IBqs z-^{6XFF!vw@?~|r`_#9^%cp@ob-&`7JK6PbkED4`SJ|6oktCL~NPpeRy^qajx-5+r zYP+KwQ86>YxA1t_)t#DiUuF3oiS#Rv?37E3c9OWZx9A3UcD+fQ%{E>4M<01^C!ey_ zN?FzBlr@9H?QwPJkt05NkEVW~QM7;0d~e&khT7S$E&k1(qu%^!!JhLIl6ATl&xu>v zBiegw=9xdLO&=omYnb%du^Tr>_p5DYf0JVqm2hNR&Epw8dViT4I}M&?CjN40ynE@; zV= zmtEgA&**97!-(8hjgH1^b#rgub6F&`sfPRcb?Ge!Y?DuYKI9dD?%d?xrHNrLuT*3U z&hS57+*Z?e&|=bD&G}P}qqOhl&3kNG&vNOJqV0KeB^k%&H=kavxGQq~zUwM4-;ELF z6RVA*b8hJ?cFDnKU`A;6K&@|`@C~f{sG-R*MzU8CGDPSeR%PQ!VO=pf4X^ab#KkL3FqVL zA{)zp*2F2U4f-N*UW?uQwXR9W*0*1oZ|qnuKU*f}=Gmju9CPy5-?40n{mOSs_D!)s z>4y8N@&^>>du>;{B|h;<9(&}yzE5Ti-zQwG)$^>if5(6I>*K}?i|S;o-4Dv0VJ+b* zP(S!)vE+Lto9?di18zL*Kh0bJp7=Du$gf>r{+A<@{PEwH0_5c+ope*}Z`n2Qe|sz# zyYkP3X5pRf{g+%O2FUs@(M~^kaKW9{O5?LnttULWFS0&w*4sQQ(_SgLkFN{$pWbPi zy6?_&2|ulJ`N+9ahxAU>b`{Nkd0aDgWzDt8)mZ||Z)-p4HA)`tM=8am6tyq@D4xMAMrEG@QWS) zFS}p*?6yyq9l0D++jf0(%Rf#h``)Oi&5Y-TKd1{n_592br*fy+GTM75|Ni+o`aBPx zHm%iv;q~;o%@1+5k8Zn*pWB?Ds#~?MjRdGU0#rrBZE^E~M*g3j@*j)-pf98)_rT>k6@e`AY? z9!9ns**BW>4LIY{8Tc-pk3TZ`hfv(1@ItZp#qa+!{(n(j%32(6T>Go?PXP6 zX?^fwz6bUu$F=Jpu3V?Tf6brwiBa)iw&b~7-mv4ZSor?4udT2A+I{6$b;-Z)Ghf&r zP@C7P{6q2K2cEZwcOP%x-llV3@(|ad-=V)7JnZjXoT?@H{Ndx^naaXnPZn1gPAj+3 z@!p`*pE@u4as8RA+bjOIMCfgL@MnrdecRI?tY<%)J>56g{PJeIzP$_WIC&PD=BshO z@R~Yhw}nc;l$$2r84hZ%r}hiS?sQr&Sg6Fv|J3YRRp-%`)rZ!pJ`U7O-QlICpd!36 zis#LglQ(pO4gLI=+g)nuFR_da<5{Q|&$rYmeASXm&aZ4m#a&i@5YSoR?!~p}%%U$h z_dF9gIMt;!hcDo+t+1GcSZPjkUWhQ|S)M9jJ7w$D#9Jeh&vp?za zm;X&Q4EI$mSPNpJ4Hmzx+s<>M>w3yk=p?QR<&25PFF(tFv>w-Es8{Ue`6CbNL-Vh`uk?$Lfx%oJ zdE5rQ53PeVZiCu~#X zGpEnb@|S4%u5!UBXrIrP0Hw4USC1R5yqg;FRlRttB$xaADRyE}Y&_jI+#lSIykGpo z<%@*YI{S&r-W%?|FgWwZ-PSQ6UhAWl?aQtoYdha32zra`)&CMWiPN#0k z)k!{hh|Ae9+IuU{UY%bV&CJ}ztOBT}KkaOnFBiT2R0C!0e7E+A z6s}#Ek~nvviRAMH=Gn&xA*ELJQ&IH8=^QBJSfR_J>xkLQD_^^DbO&TP*eE~eh#ubkA;!uRUZSEs2*&Ia#x z%DuV5H<|I->4~Yy^Qzj@-e=5PT)6$K?Dbjkfi{QFo}XbJ_L^tv#`5Ynd;fx#DX-KQ zWZcln8ggRYB(CTi2hD!I+EMHmXuo{JZ2Jp2+x9KAIClG{*UTX8$yZNZy1j6FN|?mo z>>JGgm_P}r>03?rb4CV+B$PoI^iu&~XO@-}rKajT=Oh*v`{k#kLIz;w2A%dhJk_i|(v?wNgg z=kn+Cs`Hk=m)FnlND|JLQsNPwR(e)?-;_OXx~l$eC{r{&A`uk(uf^dakKpOF6LME- zW_L>`#(KqVTyi@1rRV*Px7dDP(l+e5wdta!Wl7rYJuC_b0{FXP5Fr&*_OqS3;J2cx9vDEv1%mPF#A6lt*%x;=acf ze#z4lcNa^~tvG$5}J^x=6B0pb-_e}D`-@g`lt;>vh>vf0g z9oPA1$9eC6d^4#}^-N|&T7;yDPwt*m0XkoH|B-WEE}!1&Xur<1*882MUaLom`TZch zh^4c;m|6r&3rnOHZEj0EB)CfKyvqt=M)#` z+3&w+pYT}1nop-~t3eGY!%`#>~Q7`uLAl}C}uTHSf zoMliihE;O z`whm>?yP%t&EK6G5Obs<>~`&EA(2LVB`3z7So##q6JybV|;Gv`zZ= zZk`j_QnysCX=2n3m9#`{;ho+0TJ|x5qU7L-6$;*r3=9wOp2#5qExb{q1QH=jqd03~ zQU(9}PkyF)`+D=T@E4Bn)n+ewskqd4f$kDrUr(p^n{+SanXf;&ZT8&_yI(Rk#c+vf zujmka60~8(f-M(#1^Sx2SoK{5TwGiO9rPw1=Kg4Zzxrm1`E0ST-(SD0{=IkR&u2f* z*BI;9{<;6%w!bs)GgsAhW>AQt}!(MI<^*h3;dU#_-t;NKWMSd|8c3}I6N~b4N*BG|>y!ULNt3JD*Vk>+f-PI@#PZj1ZDV!T z^}G6Pg78YNmy>lLb_8$j>5|?xYtz;{>#xnQ+hHeDDs?;B-1_6ygJ%VgrSv4!Y@3kQ z>tOLjs$iAyRztqUFQy6~zF1JSkAJb@wPPMW0zNO-I+_`8|K2$JhD6Ij*FCdSlC_o@ zYMu4FBw)%Gz4F$EOGejkPE>H-sU?~2l3lW1)9jCi_>+qT2R~er3t66j&+EpODQmwk z6iO9aR=wji$BbUd8J?F*cSo2^t|8oERsA!L zXSFQpPaN6{FXYJNFXpf-y$~ZU#`SgGtz(`u^d(m8+TNnij2k33^ncB>^fEnT{IvqtyUXD>ubvyKVPNqQJ^ zux0VGrM*@S^!uENbDF@W zV~47oHiRG5Ix^EoK77uqf^7@dY%#y}o5`IaJ(G{ccb}}Oz^RP_vvo|qvaG(jhkH#l z%j^CS>zM9;Rvbs4%DfYWcj!o2U%}C9$_2YKQEUeNm-+Fpl zF^hCxO1JvgdULfdGwze~60b(x+WNQ5(KWM{@9wWD(;arV#;!?u`8>P%9C9 zp11d#ux!5mJ;|b5UrI_i&jmO6bGR+z+_id_cOm1g+?XEkh|sSml=s|nKKX4&@NK6p zFL#>hvG*Apo+sEirZHO{4O;w{J*1nx`4B zaOp%sL3PokDUa@@?lNcFBpAP3X@Ae&CdSxy;faY{2QGeG?E1&sY+uvs*c-E()}HFo zUaM{GmAI?VI;dXU_EhlS`%(`M?(yTV{yI1M3XA$vEB)VZW^Kyu?2Rs1oxpL{b9+YK zR@vxV?Y?Y`QvcWA+`)Taf#qb3yw41+Sn2HCZdX~`!$#+;{f*Zi_?>g7=QitEONDFg zv-YyC{r|!&tNfGh!D;`~cmF@O_;EqHd~T2Co%@M*lmEo%`=2iL`Vtj*<(9;X&Vuc| ze0L7t$;w{d|NPmFrTR}dKPr$960@rQ8vLezt5K=wmR{bC-&!`?yi*afJ>?Zz;C?Cl z-Pz*Hzom5LFXgGtZ?HJr-u`hxtNR{hJN53~_oWxvr~KP(#`l>0%F4*uZL;1;AAdz? zteEk{B_Jw%xo@DH+}4kWOD>CWwr`uc%=4%G_K(7~i{`4&p73GX24VjnA6V*g9;WXV zUDxOz*%#=x zbN=zoVs&%xnrH0Je{B9^ZFJABX)MRnQtxegx^de#Gh^8mYs7Q@$kl(i_4-|j^u?)p zS@BhKW$KS~i~T#&a&D8I@8ik`qI|#aJTvtoOOJ`Kf0)X>zWDGRt6LHezHQ6j z;MbaT@x`N*HD$|se}8OHdla9ur@8#)D=}lOrT+WAC_Xq;QtEB9&H3}G*?Rx79_HJu zDiSadI2+k0;TQfyN^9%X68`y$a<2Uc*G%BwyRg`6-KFWtZ|2NWt}H%dv8|(E!nwz6 zkv8sU{9kGRU75Ab=6c`Mw2H9H;l)jnvU$;O-#l@;Dky9+J$)Rt2oO zcK1D(+7q+Y-42dQsz!GvC1-l)KM4{H?TvN)5wkqtn9$6Z)6PzNoMKaZDyQuEm4`bQ zWj*QNoI1&;EHgZCQuvfJn>)Ah9FubjU3M!-t!^#9?!g_GL(-p}nUJ~CXzxqbb&3+a zW|!IKhj^@1ovOo78+BQ9a_5~_q6t?M@>n0Uf+FU#4SrmTF^6GcT!@a9g`&3PDK3&*8 z@8?=IR%7=qTjuLVK4>*KyIbYlju#tu9asOHs`!4%w5VxmX&Y7w7j@}+KM7fHaeR@d zsglIf&+cg-nM}JiV+>3p zHZ}1E^ohF~*KV4lb|Nd%S(xKX>BEfR9C!0e>ffBI)LL&Q&Rw(V2@jjG?<=89!TXE* znYYc+OyB9O$M`~JX7^Fs+#>PJ3vM?PPA)sM=Hs5^(`mLoTMgE6o2y1&*|b2nuVB}i zev4=c@0Hq<#4N!77R{SisF|)?PDo!yf%FJ$Cs!g&*Y_i2(_k%lb zi1e7B!f({JhwVzwD=&V!WAolSTJhz(Ew*2OU3I#6$-!W0hn=lw z&woo;vbXw@v$or|P2lytTyYUI#$_vb4*9vk@D~7Jum=kfdub1ECt^B5^yRF)#&n9uEo&5e(&|B{9%sH`d z>;uZWubEa^$y^IRzfi#X?@61)wAAylC@yx2_BQml>Q|ygzlK`cuua!=I+;F1}m*Ju>y@)NQ&u8K0EpE}K35 zc}}Hc-QhLKtnVJ57Z!DI4LLu_XXgHGPhEfRwcfKNQ|eA%QB?fl619byE9=rv%a=+> zPC7Bk*dcD(be&39gO|!DHa$6i&)SrEMO&=)+>FV><&W$tL;V++Kk+qJ&z|eC6jJ{)kWO%)eA3?-f1Zz?|3Z`2uI!2X=WpLEWo2j`@b3Kq&R%wd z^`98Be(1NdYU+G@zO*1p{T1_6%{4C$yn0n*G$-(G{3>oOYe5d4yAIoW8(%evm_0wc z@mpe!x>Mt%e}~sbYHirLYr~QSOD6E^Z@rN+{Y(9aXZ-cO^rsc#jff;YQ=Y!L2r@D!Y07V_Jx%c~|WbNTL)ysr#;yawK18TS^NzCBW@ckt&` zGtM06g2vq?iC-P`ctehIrB)<%x*pXFejL2xO8lhxhn{}9{7%H~_S>7;2CestUmmUG z3Fmb#5lS?czr2xQbD@#gA~Ej`9HoEa`j}lWpfzixM(CnnZnh8mDZigp!-cVYaF->br z!0z)8Kg(GxGx{Y}FTZvFth#j((|dcunhZ}()xRV+J)L!8qUHvVdfmsTJMI^7G`{*L zb+T(xjqow1Uu_Ft*iW1BLd>#h&4NZ&i*|{=WE~+5*Gc~QM||h~SU<__;{Kb$^Y820 zz3S`_7oYJ%Y{rkMJI7yj@jIn2=Xcy{}S z4F}^FhTSPluiBryQ@B7s$YQ>e|D@$-1Y> zG4R!G+gG|v!v3FodE}6TEBm+0)$NIaGpn{*?ca0f?8S}Mfp5$&oG)MK|7F^f^3!tZ zhpJ^47uX)GW;WeD)AXsB&!M#}?{b$|HSFGFyFAeTY5@ad$%Z{jt<}|vFZklFF8KYi z;dn{w^G&67StT9w-!K1g!!!BU-Hza&kKKQoCo-P?`+wz~Grp?+u(|tT9Mf1~N zT#tWg%DR?Uzm)su=KY@(?!5_1ShR9}`NpbcEB@9Vk)SUw5yKMMiv0bBW%XRu_l0e)yr`cs|M*OK{|mnUpHANY$nSq4B952;YK^gV zmjB1!^M8c%UAlX7$@$N}ng85YmVG?&nem*PQ}jRlE~$AD==bf@Ewe;V&wGj|&p)e} zIM>H9>apCW>`j{SN=sE+N&6W*lw$Ge_B$%vB&cy%l`@66rap_^nOAn zi}T+3%b!<&_tK(+q)I)juE;yPE+i(X+iY4n$+eX2bU@FPLAN^WgD;%2saN^wG25bH`)a;3{n>fk)6#t2*nm>D1 zf3=z?9UFE2qMEbX2j{=3LVXiYN+<^3c;)9hb4u`Qt}~Oo)=ZJSp|JUa%I1x}eajD9 z3RF$=`Cedt;;qz^Ri#hApLo98*52c?x8H)V#fAaTCVua(IQN*hYL9Ve-ln>nZ#CDY zeoUTewf0ZqnS0#}-QFpl@jF@SRu$)!cVj-M#;&WASS6IW4P*QkUe2~Wq<4%b^3dBn zpVhZMzql;2({gvg$)Ht{?(^0MHJvuT_*nD9bonFia(+F1p|9=nf9n=cUXyTUYsb~O zJELC#Mx5DNHZaQ;OVRgdkES{;RJqMzCrj<(QGj{Fs-S@C_Ut4sR zn3+(|cH_Mo(~7kCHoGqVWBq+r*Phwi%U@ocH>vMftwe0)`a9|tD*QW6{`e3l^6G1K zOubLR+jjl3*AEvZGEXcJQ{Fl;z-+ow%?FC9sl#U?7upF)&DQ96>F6; zp1R2%_P``$Q=k9wtdNH}VTTOTHvON~8vCbbQvI^MVOb4FcdgAW-1x`)hWP!~S$;a4 z28C8n4(~QN|Fv{~-Mj5Gr02$0hJ9U}{*O7po1Np>O}B+pg%}v>)sg2V(1(>_r%a;` zZDF62XbrlZciBO}_VSb+g?G02&Y5(9d+Cy+o-A%1+ZEy#DQV5@&bV5BTym>ltotT& z#=4GjmAprd{0|ljZ1&4oYNoU;ZO`uFXJ_U_{{Q#+vv^TO$FfG&LwN#oc55Y;?VdP) z+3`(TGJWjq$$eM7?ccf2k%&-P!}n+7d$+opSNmS_S_H6tYB~GnO8xqnYn<;^Kh#Lo z_YpllN8r;d9Utj_&TZwJecA&oeo3r04oh^{pjVP-&edG}PI#MazF7IS@a2_G5pVc@ z`$T*^G$X!WuWF9W@4X%W1!a$P3Hyf3$+2(odarhHJLhuE@48b0C+hh{%JRBbt)4q;CUYKWYFx_1v0eAhLAJz`{7fqsOtmje^ZdWwOgMUl z^bNHs`OAc+8FRk3NV2~=>C^c`79r=C{yGzMR+!s*hyMx7Syt__O_mdXD_!}l6`Lgg za$SmB`^GzQWv5p9{J8aAA;(Fr%zMq6rKh(u{C$#|x=7>Rq}bRT#~!=v_NST*8;(wY zc6imJ@Mnjw9bF%HXdaix;WyvRZ>-f{QR@^~f6IPD<c65}wfD?))iRpewdR}Ap<0_0N-FQgWFF{)QVg5v`d4=t85la5 z@ue8p@zJO$CLl2{H3u>xS{fP~ES)M+H*I}uiLa+deCw(UL6dj|H0rjrZo9Q*OM+9g zqsZE;s+FAHlkb*np7Lm_{MS>3$F#p*;+D<7Eh(Lra?Ja6#bf)TntQ%y#9tmwyKnox zcwX_j;&Z>By|1tT&-`}Av3Xr)tj#aK{9W;yL$LR0Pg3FB)k_jP=XCM09*ljw@S{f5 z9rLw0B}X@FUpUjg`{nGdQTj@Ia`l$VZ7omrTFh%C4ld{lREl$0^DuRf(<#}*r=A=+>z)}{;5*xiFI1zLP4-&3 zOm%$N>q0Gy#YuC1ZehrH;S$cTm>xQ3dX=28V{=zt=Zq^0lou_?zPQEb`>G~~6&ov! zuCW|SEqwi_`oZLX#+TwJtDY-Mp0}dP)O1guxyXtsSyxYNR{s0->ynsus|rTFN2a3F zwH9C3SkTp4^_$mNe~r@7iG}MmUhwGZd$*mAxbi{lUf6}x8J_Mr+{XoHPWd@AaybthZ94RE$qxZ(ExW8YjZZg8JkGcV&-* z{d{|rPX5(hQt8s`Iso{#(zvr%v?F#D5%!tsOe#S2IXxnFNiLBC^!_s$eq$a++ zrSoh;`n}uBlqdDY3iMSAJPtfH=}}O3qxC$m*H4mm#IK9ocIEi($+Of>@3c#(4*E84 zvY2;TU*a#RYGdV}25t$~2bTNJb6l>6yBXFbqce}wBZlaEZklDf$$kD~v*f-UxukcJi!KT62{<&nsIcYqY{ow#0qX}Zcs>FAf*af8%&x@Wao+=dMJVpGF?xRN$YM-`!za7D4_;MAs zh`3g*Z}GKln9uxUc}w*!nU)9Yswq2e3u;-%6jJ_2BrN8F=eI;-Jf_ERNH3wxq5AoFkI*#s#F#{XJgip&oU_wilg>F z_^cYaf6=dgOY?Z++4%-14QCuFce&jWvZ!x!LS)f&9+9kRFW8@bQP!;z-5+5o=6q)5 z0&OEpSH6i~mYrN_$fBuc@vScG-tqO0c3j!hbxZz(>&hR#9H-W^FfcH2BA0yVbNJ#Y z(?IztsfZca-ay~{%MJpyvu9YC`8f$kW&F^Y@0anhm7D8P5U1WUr>xM@mel;Un{pz>e)|EnXrkqu#!GH+!aeetO-XKfh#4a~|&Nops1dWH0Zj7?m6I zd{f$Qx0MRrTWq+&>2bjGNmIF2KfLtY>D0@dq(927X*y56=X$QX@R>dILPSXzi|7f4 z?A=PQT0GUPKbI$;{Qkv4l>hmKf&~TloTX)1t!KT`nbz54Rj{FHTCbj^|H`b#i=2Mv zs|Fu9ETyMu5%SqO;Gy2rGoLIjv|G*cGU!v`O**OKzlil_@kuv5@3mDg9&_3MRyjH8 z)5=51|9NIUw2zhH{TBOW!?|@nr5o2@wzQA?&d$EXuPfk7cB}9ID{k`?yh{UTFiu#@ zdE8_7T7wUV&42CX3;L#UL-(^v_y5U{i!N*zxpViXP5+a~NkPu9`wz9Zu}J4s%Pv?u zQ}aVw;mr)8!XH&fra!8z{2@87w1xZrh3eFI@f@;`Ume%FzO?itL&?mW%0;}_#d&Jy zwJl7mjW}kemD2m|nB=2tnZI}J?6|!sZt)J&H+ea7kI#KLD7eS}^pvuvIiI;@EAGhb zQ#`sCd~L$@8SngeGBPmyWWpEwGRU#-T9KSuP?DLShm-_@PUl??5U`y*!@|(-wo0wT zsl}{Zei;B3CIGUqrGt8a!+=qW4p zHI-Apsye^*&A^KP2bHrZ7H&)#4)sAvUv`%+T?T8XC=eVnNJS<}Co#VEL z4t%_~ivLt^>XdhZ^W3a{^iNQ=KN{OqI^|5z{Q0hi|5rzcd{_~1Xxo|q%hdQYC6 zaNZ?&#KDv0n?aJ*dcG$kjdp|EZ{l^EMZ_~9>R+`+p8j0_A~cpF40v%_wgsW~Z#M6opFc968YfUPnM_iIy$M#EzX$_kxZ zn9RhVKY9=&bJIe+uv1ZG!t$vSN7PR1sjmI=!2YED6UCKXE}=0~uZKKc9AvpSDxfE( zW0Smz@$FZZwZBTf|M~oWe*Hpz?;FMwf=+~J*;@ztW~X1h{O@1Yj`h4tMBUE6xgB$4 z%>=6zT4$ynin?0ZfA`eFvQwgOtwUvB%nHwBwz+n&%jtjP9MMg&=S1(Xz0PlA->JUO z#J0Ljupsc=md4&w3#CI$7haurC?V8+^;-|_oqtk0mUb7aDXZ#Vc-^~r)4JTVWy;fv+v5UxRzV~;krXxXW4Ph zf5jdc^7&M+$93PD9)4bfqfYv6(pybsW!v7y?d)Qm_<3LJ`42mrLN6cR7k#mFMStAF zyyvni*CjV_ev4bq>34k1;McL$t#KCV5~KRt7A_>|yTD>ZThgABGGa`Tlsw0zCsblp8VdnP>9`NHU- zth!#rU$e6I(cFChJ;jT5@L!sI_;6`UeEfyz!ugy3J3Pz3vt@pA&h+P;|J0&q*d2@! zmi+nIylUg!oqWe9<_Xr%`dc#lTBVLkh4CHM_3;K);cQ8dbzbgmG#9>}TGwfsynOZv zTlc!_d5IV88ZYlmpJaA&;u9O){Ks>jybBRhoBHo-43A^|ccHqYrGD!hH~|83TcjE4u`r&kE?;np#lo$B>Q!FgU~(Sz4MmA8NJYevrc zy(KmyvGgU&{TtoBkHk3CmVH&*c3zopbAfWq`i*}UPpLL>`=jR=<1MhcsP;MQk)9d* z)RS~_*vquubr&9rQ-8yfm@iN^X~E<#KNR0hy!#)Ve`VZll&hE-7=E$iE7(ywG(MSm zseYxoNvTDMOxzn3>n|KAV0(Gp-Lkt(OB1%%F=*{tdtl#>u*Li;zcvX8b8zmto7evK zRFQYt_CH#3CW4+SAK8B_?kT>0>llmBrjy{3-O_mT{<{A^I*rU8-qa9`O00PETywMh zky+)()NB39-I%u}3Q7e(pC`dAthHP#b*}KV=9S--pC7(>;74^!){&p;ODz>m_WB84 zNndKbpF#D&ExnFs>8#&F>=VVy16DQ`Tt6!FjI+!l#Oe`aBVTsLg1qEFi}fqBl0Cni z(K)wYbl1Q4ml^^c;-#3F2gvF8G>* zd4s}CUPrmdCtDWkE>F~me17?cSEEj6>`vDh?;PpXlXv)D%oe%6yE|KYdc^yEyBdC% z&N2$Oh|OH6w@vQ_w{zF@dT@fUd2pTk7$XCNB1(ad-p-RmuIYVKOEU72O7yv*)xpxC zGPdR{VwYO4Ib8g-VUO434;@$cIY&opMDX&n1}?ajH_ba@*UjG9zUjB}AC-ULpF8ov z4awvG=X`XwoVR&IK(fN#B_JrPo>w@L22Sk z_rK25-+4R8Ip)FM#p2mASGGAsYaZa}c@n#RhUuxco!XmOgKtG%Hq)9ad)n^FNzNl) zu8kMjQUa|mZ9c=XT|w39a{hLioguoSOSY$p8myThO7cX4Go8E8MdehHZ)O*p4 zOXdC(KbA(Hhf=Y(OtoIO#ioWv2W4t)IJ@e}(v62*x9-XP@$lcSzUUouANcOR+$YJ^ zFz2$U+WJ3dK3Iyb+PCJ#j(&Eg=OGj3MNgae-z&l9>Wp`fA4TfD@w}XFDF0|)oBKu4 zb-$*~?e)-!ylCJqd7a-j$#RCc?B^W^qeKoJSLk6$`xtRtxW=!RRnE?)XhOK^R>^4} zjAgrboOQ5?EQ8=eIP<{O?X!7;ie~UHjdNDG>mqelSL>ne^^I%KZ2O(p;hVs|tSxDBU9nM!tk|~~ z8~qpl2#Zv>nX$9ktc-Quyq8{klb=l~+ct&Er}4sQ=XQ~ zCm4@?pBOS@KIgJimSwDL?wM&l_Y2>}xoRzveX=GaS~T>pM~1em{^b)c7c%Wu-c3>4 z*MHJ{#;p@qJ_J5vn1AKGsswArB2nQxJNu+B-rRS>N9W&VPU*`s`DTxz{2r|cyV!*R!d!mA(cYTR_{KX_5^>V}`W$}9{F{wO_4^wC$89wlg*r*CRrDP$C_ zH-fV!KT(>{a<#$Hak8gJgpS4nA*Y51Dh@&i9u!NenV&q6k~U}NhKTE7 zulHqVZ`s=AePtKJsTQxhuU7AQo_#gTeEPQYdgs^r-{1T#xAyA4^Lxv$`P6akpZ$LK z^Lg**{I|Ss`P};co-a3p&oAKk{A2-lGRtJ9Mp@p@8JT7!pZr%#$`ve(FeuzzzkI*q z6aMdJYwmBm%cBw_p*$b#qJ zmU)!)C#=$sK5sSk-Xw$HI}6r);!)9PoXlI7wZzKr_St|V_jNU%+B}@0HDj8#I&bOB zy&1tb;+}A}{Q3C9a+hDgL+{^fJWsx|_%z*&_ej!~?YftImlehLB~SI3w^*Y%wq5e; z@jsm&IR`oZzVuhF5HIrg$S^KnniIPrL1iVwb)|zXF_)ZfdoIy9BUrcORpzvv#aCJ^ zvkuLf!r3!@&Dl+B!u?C%aH{`0<6__tTc@pNHe=&Fk2Uv~yzg82O_XPL+FbqBH+3}f zHo5qJU_G36+u^^N@wJ!t#f*3>0==87&bI7bqp5_Gy4>;*uitSr|G%UP-N|b^{_O>dGgvQ2|GnOsd_vnyk)22HM0`eszxOjP_ z5-whwk$6xhssBio^q;``1?O{ah#5HZ?wuui(80N@dz;R|lWcyWzk9EIGOOSJ@*vlo zM^1|uyy|X|n9-xzmA|wxZB5#@fPmHZ9z4RGjt{@_u}DvGs?FYbs&$%R+KXe-7P5Aa zUho}TtoVQ4vws;)k`W=Xn{PIottn2lwNL9d-XQqaXV#3H@;6@|IXmSQ6X!yqYe~(G zz6lajZvB}Sckl_*?8MLIyDlCT*d~1Iz|0@)`({4p{o(xc^qWhmxi@a!cy-9qvh}Q3 z)`9-qZN+9kgln4~b8G5}Q zv#o8~8QyF6IDIEJ29$?dOj_}Zvu*ckn+}aBjBiw|>P@n;w64@@s^18jzLF*Fnp|&K zxl&Sn@S{BbU!mVxcXY)6xqJ8Ay*>v}M7^C&gsxec8m)4(TH*Tm zvscWsL!mYci@07_W#^myIDBSVwh7;{%nwm)8A7qS2R6LERGN3^MAwN&F{uyI?kuWK znyTO1KT(UDW%tyn<`<)$t)6!ASip$`+Y5Hbb{M(e=ULt%X7OjszS_$N=Kk20uxHx* zDbhR2gI8yt(|Mx6|L%~iUd?n>mDkx82dfsWJ!o6YoRe!}%^+0j}7_85<6jJYq$z499vOj$}Z z_b58Ve%~QjO8RdSR=UmWNrT+N?Vi|yt`j%{_)FtekIoXU%7rP_oGXX;Lak2i2;x6Cw&TC zzSDYPc3sYc&_7ca{Hj>icBUjYDSTpXaC*GXChzZ8gH$Vyw$5M56{W{)t@t&!tl0FX z<^E5%S8o(k_P)qcU0?t7ShUSbkD|xdTc(u#b#SuH_dfUXxSNXWGG$`}S>upb`*(e) zUVfx6<@1AbDWCtxc+U#XS)IACadB?q`<)*X`QAI-=2>k$J4U00a|zex(zot%ch;V= zTiE-={DbB`ckQ=VU*`Gm{hiMIzxThQboPdXy003YhEa!B%=>TjAzaknF#JywtJeSj zJT+l27BBsi-{!Hfzx&6;xy)K?&rVX>{-Mjz&V5^S#nKtmZf)D(8N*pN?O(&n-_OPP zxih`HQWBQwuDqh_{?s$-#k9^Z>C=|f8DA8Cx$Wqbi_h0y+uazst*292Fmc@6Cx}T-yw??ljVvTq{Q};mxR{>YY?N_c9#fAnK zr;5`S`Q>kG1Fg60e-( zYTW*yGs^gsrqXiBOG`d3`gTLyKy=$Bf%R(_+&r**TaziCJO4=C+-g^4jLsl#hS-=jBUX(wr@^#&C1^`qdlHEG>;HJ=lDHRs5xc zmlxm9TDLqze3x;A>pMf|b0TG{UDJ9#sr?RmdzmjaHt4c!mu3NR;n#q|dthaB~q<|aB%W{f6{lmV` zSbA@Q9d|;C!a|2C-kXYw*QTsE`-uO|i7BW zp5^@s-Cvt`pO?S?hM#wa*Pas-)@RzAdgdp-npWa}^p)0hsiK`3&Zn5>{$B01OkCn^ zx%lr5(@s~MI8w~##k@VUT)AlKHjD2&pX_?`dv563DQ8v94J0m=>=wB7?XHS>di;U# z&kxd#bLA)RN>C8wF?~{#%(nexZ`++^d>VJtVg=SnFLvLjx_wtm?u#jhw0UK^ADg7J z-~E((`|ek+6?Tu`?QVJdG~)O1&Jv5>DtFJ)IHmiBDeLu0zq%xq`G4PY=kcW9tecJA zq0Zhnt=eDPew%MWKu zjzylU=rP`8yYWl0eP;pRm-{;Bo;|AgXUixcf9#X}hq7Fu(zT`R2LA>8WRA?er@rxr zrH*G(rO@)NAJ=MjntE<|<+ES);=;?7o;fSEt(7}Bvt4{Ez~tS%Tzr2=Y5T>yrh6+S zYCT(~P4m&WY&v!L#e1tBkMNt7hdccB{gT3kp7TFmecn&svZZ@FPvWObLhjeUOxm)hS==v7YUJ(WD!LoCm;=k9yAeC^vEJmDYsbXF|e zI{Rg00_*o|)$fZs|79;Tzm}kQElKm*#3HMxpZn*E??=ML4)=?y>eQS8qbi_dqy=~Vp)JF{_~0Ndmred}LLQ9QF|ZOjd`_my{Q*==OL z@g1^VuhF^i^f8arx5nRV{{8+NlbCEXFOY@h!Lqd4W5JJ9z7*y+-|?Jm<#XmRU)IBe z?_cbhQ*GIn%zd{03rAQ5e{%kH13CK+_o+eK^gGo{izL{0bG%-;>9D7bd5^s6$MY-S z>+>hhIUjA^bA8ID{-)T7w&0Jum|sUUF(xfJ_ESY-6En~8xg~e?=CpBd#e2tezj%)E4_H({)ty+ z|G4AxWxK%NwJ!D27w>z1DHmkgt;T*S@{Ut$h;!k48AnmYzkL(_6$rf7So)^FWy;!5 zve8d3p4l|zlw??)t-~vU`Rpq{DZYF7_|9Qwk-vG4q3@rssEXH2m4C9bs@^2je`3{) z^ZYAbWv;4fTotz@!z`n3Rl98HZH;G-m0v7cwR`0&d%j1>OQ-x@{x&1~(qhRszkk)be!_B>xT07hl`G# zi*h?JSutDhr*7dtQ(1*@E5=8k?KF?NM|1=+DjoIGoG!$@Lu9$ql9-rC#YHlYi;`Ws za$A-!GSqjwr~1{_?!E9scAYKqk6fw>RP7RH{@@O*2@{w)vH4Vh*Up~pfs&FT!kYpo zCI`uBC7XoQD}Ob%o8N4%8uIB{*`l641!BnT4?^MmwDW^NlR{UJU<~^zCl34malk9yq*>zb#Qo)}?BfngY{Jb^N z=Jk|$xtD8hFXJvKytQoUtv@IDZV5lS>_7X^mtvNyLQB`5UmR=rL#5AHr7=&^A*Ae) z&`yTwr;on*;^%*RmgUZhhUar*_Bi%j++Ennkad=GLDSsq~x@-GhN*`Zf~_|QM%c__zA=BldTa?biNg8?q3wNd$v)TdE9Do9nCtG ztCwm*zIa4k(urcJyj11&L_y6%XtKrn2gc5AhJM=&7;;ZaukD+4yFlWQ!0S)E3lEh$ zoYR_KJo!>=wL_EV%lr9nC(KUwIwz@d{zK)o^Th^F+GptKUkJ2+^sY^kJ^sNQ@snbI zleQ_RSnHqNc5D{|!|{mP8L>n@`Y5;T z{_Gs*O(mL$2d2k^m*j2)8`m#}9%5eenA7q> zkwp6Bb8#ns8LV8Kty9goZdcuYRlg^kzFd``-h-yqD*m22bzOjg;UM07y)ec`kOt&K zAS;aSsR(dz=PKUtx^#)ZRpr7u`K=M$Av{4BOcpFz(PLaXIri3C?@1@~ZvA8U-w}SV zVxjS*a}^IOmKy()s&D)?$9#6cv@XZ6*6 zrp?nH&k&V++V)muV!(|0B-^d?X8$wZ{%^(WxN^QV+r;nWvxi+Ru1aVPIlH;$|H1^3 zOH1o^ESkYu=AO7B^QvtB$t}BIMU>vZBPd+kxvSLUS&FC8ta(Rkb~|=wzVv46Z4=+& z>sFCfxo+)(Z=yZ!ehU_tb64n2?@tlk?V^|Uf99m<@>6dQue!X-<0ad&31JecQ)E{^ zy~5nu%~QDQVO)24(3I>;2UyN6IZ&c68gS8fzMjMO+ysupi&M^Q5Hvcq>wL+KS1!xh z+$IXWP;C{AojxsFi>D@N11FQ#m8Fl&w9kD$a3ErO_1e>SH}5g4_DOQ-DQ44q+;wH{ z;@=yeW^Z@0nZA6|;dSvvYnZP+?>fAdS3*Mk9`C8?x6i-d82R62^Yh~7D$#^X@4s5i zwZ5BFcm9B`j%JVWw*%!-x38-E>2@^ic58C|{GF$U;bzmc%Ufb*3a?(4&boba#M4t5 z^SDuW&vguyw1-n)8td z@)qA+WhuSRz4dtY&O8s5n8bA!2U@*PT>7Y~$h{yxZ`!`&Ut}jUezx;w6QA`wa$oG@ zwH5uMRx|#|u4?{l|8c6k&iTZ*vz}Hmu5WMYR!m&+f!iqXh0XajZ7vHp2d+4INbmJ0 zRx4qrWUa2;&Iu_Zic#CqHWm%Ws{vHfZwh zEn*u4bhZ8^t6a7^e>D6+?uR}1j_-}xBiVZI@`deAFG9uSh2s^ASw26vGh4cLw#-+x z`S*@lFaN;pe!}JB?IZ6md|DS4{9(J(pOnOf&EH#1v_HQ|_&LM+BqwA1gx{)NKakT=~NP&B1z5_CCJY-E$T*149blSvP6q zNfy|N7)V(>2(q9Cw3;H%ONdFeX4UYhzBcf?Q+SNPA|AK%Qw~fZ>WsJ zq7bG|`2+n9hI07U>U0UI_6PR>v!Gfk58WX@f$SXX1&x>am$`ON2yJhX2v%-ZTQBu z@T$VKJ@$Vso_x8GQd-D6Rf^+!?3ImP8xC*0B-qbU65`CPZ8mGsPL z;nHrWlno_w{=Pfl$X%XdlRT9-#Aqt#l)djJo;V(P;1zS?@o1}y^$+3}Z9223Wku-6 zh+n&|WU$X}Stl;D+W4uuk;Q)n|76*}>h~tfZ*VN&Q@d>PCm0|eBxx)({7;?X5E>0x;G{Mb!}_*+{efGx7?fk*}PG&;C->+>yArFp{-xy|{q70B&S>gh zN&F}Iuv75pH}K&o+rCt6KFr9#AcivG7K3&NpC~jfl$K=X=sPBZ*401;!L7gMU$)kAZ<<1q1Sw zGP;N4Fg@g!m|T)yRHke|2JdWlq<&pOJ+!Qxy+S>0kFBQ#gZqtlie`lk+v+dzo zpN}nBc)QJb9sjd)+`(BL25aIH4hu|VJ^lWM?>nRJ-`<8Msi*sNI5KDQ+**=YK1227 z0k=%mWh}ZZhr7(#G+uJ?t2pd-PE1BhYPLgU;TmUdW_fX=TlvQAdo zBqyokD%;}5KMO%MAe$~0{*W{5;@j67`Cw$=2X#kOSjNQq^de-^aNo$Gzoz$blA z%FDlPPg&SsKX~EP)a89LeW{{%T?G5l+f&}fZ|T^%SW;O%r|G@R^0vHHw`n3W*9nRzJ z4^GWGTx`>sCginphWU~J(aNU9>?*eyp2mUGG!iEbR{3ri9A2!p8jP9p|n}Y1p63yj7(;1dmZ2#l_oLwekY4f zUmfpxW0mQ}RxiGCM;2UN+?Lq(qlisL*&;Gjb>jWKOSH0$gM%`Ta`pwzS!kwqb4l#+ z>21pGG1t>>+}vrB__<+~)Tyh5bDmWMu1xP$SG(hRQQfo1Qc7Z9Rpm70uBlmia~>Nw zmc~gQdbVnxPQ2DBi6W_E?}KMY>Sk_`xOR4>>Y5yl>D(KfZ70VZ`g_!K{W1Q)BdLtf zEn`Fuhs`s+S0{h;OrTUmaMYDw(bHIqrx&mAwO86ZE&1f$K%a-9ecBbx+j^1$Eq*!(Z8cgYX_Po+%BO;v zk8}4p3r)@Yk(W6AOpj`7ZTDl_J?8~@`E9M!#U$Uo>Umo+{jsvD`Mm9a7UfRi_Yp~r z>^;vfd29Nc=8NkDOD{arsExIM_(LY%z+|@9`8ZF-D>?Ufe92jUf@glwZZ$)h7ouDZQ{t+j8MPxvGH^7RYv zd#<~d?_0aC>98&Dt7$6}Ug&MI6->P+HuKoZZ5*o~v~KfY)xS8eP}cWuF0W|EYzuck zuIm$()LSo{bb0aQ>4DDj{>iM*#PgH9O%KmEEVU|o$rrbr<^Gxnt4^7_@z z<}K@M)#;LOn_0I0!j?TTgUV+y7zP*G%-~C6>$0c?bE*14~xui?)83}K68bH+z-Y-8js&x zJL2&|%{V>%*}0j<#s7bQ<14Oct>sreG;4}@;Il2A_q>-U-xj`f^knIeTh22#ROqd9 zNokRFo!|c4%Zgvr>8~UI!biufc>8C(`%<_s*=cKi?%fDWUCw#GR;4@>Nqo1#RAGw$ zBV)c-%WtjnzxgykHU7wj6%2CERx9YRL^w4Y=r0M$l-j3Q!k^xoCE6OeZ1KEp>GE3) zKEAkd+*qe7LUE1VJ+TLtS!+~ej|+jvf}FYTUp=xF3izQ5LnPT z>wJ2hWP-GG%W|V_E4?@Uajbaq*(;i5zkGUUh;44g_ha=kcWd+%e`Kun^6T*ko@yj~ zzxyp`w6Z;Kvgpt0>9tpGu*=9A2qmxmEBiG*;$P?1e3?yL-|W2J=q8`JafI!7@T5Ik z4+qAr-=4qW=DR-+=AYv&liMbpXSk-Z{I_-ST;25-_Aj66)bj94Uf><)2mzm?h0nl8 zjbF}LZ!wvXfuS2^ku3=or!gdYdqZCP2?q-N^V572G`(9}i7V^qqTGXe_w*~6Mb?Py zX%G((-hTV?rl{>H-$PWhdiJ&MYuN9*MZ&j+LH?A*W>XWUMZV|eoj&vP+3&PxUyh$& zfB#~ObHxHhr3;TO`q!>1I(==$;yYdDiPozg>8tl;b#Rr~ZJK{8?B+MGYg_*)ztrH> zWs=Q)$FXIFtGNe{a7KeZ#bGY7~Xtj;oq<{Kbg$o;;72-a6 zPurVf-F@kl^`@MuOVn$xZ*-dO`7-l{=7qZf=BsP2YxjnByS|iu;VPYJ^}1@EmAo^5 z*~=TwSJIvsGZ(&5p1pUA%HE~}0Y=-!QdG9SThV8ID4?1*<3i-&I%f8Q0Eg|e?re^a zW;o=3%75vdn(UG2;5;iM|4niNN4r$Pan@h|xTgEwP21x*&G<~==Gl|B@yM`#yd1hT zPxyt`y8VK`ART*7w5ZUlFZKw9TU2x*L>qEjV@|DyVzoRqEA9X?q>_1Eib02 zrcNxj4&3J5*y!COQrvvehI7FYqeD9yJ!1rKq=|D)pRcp>X=tVBeCE{GHflURis}hd zmT+A*c5 z^5Tm<96ohwTk=@{`_%ndZT-#gg4_MFTYJ^dtIg_u>3`!F->%F$hs`&q{%(8sGylcR zc*prWcenj>lzK90#{Z@#PG261r({{g94`FaQmLgCR#3K!?}DYs+J{Q@di4$Gil?o= zYG503xVK-V^WTgYxBdS#Xsw+e_%QwfS6q_R`U39t8yn0gRCs@jJ2P>XReoA^PuZDm z+IyR#U+z19W0u^X9+#>D*3Z0ezFkmvnBr#5J30G9^m{)k!EZS`wqH2&PLS)&vFaWE z#^H`FjmrDME!czi?|9lWGcbH*C9|A0fo8<8*Tur2BLDABD!W~>R5d`QDPn=gtt~oA zA(@PtN1Y6GJ+ilkOgZ~ZEi$6)wcP?y`5#V8G?bc}J_StdKlk9pw2gg_&1LOh?|)qJ zPHo}B%&wU?-@M!T{NwKDf6ndveSQD_KW(fp4&-u%@|-q#yW-K#T?@Zttjn8OyXslg zH<#0DoQiG7lwTEw8ip9Je&a3saF+JMwuOn)c%6G^U!FUS_lch6_WgNnyAE<*K3f=m zT|&j~oay~0TuV@V{nBgys@ZoFbsQJBsI@IEmOfD-aayBd+U~vca*HqDT|etiLWIoe-Cl)P zOQtw@+><*P#Ccls$t4XVxuaffRi6w~itPk)maj~BKgmV2>!h=Bm`6nDiR8{=$?OYG zol5G>>t0pyIjV^-Vtd?G?6h3#jqj?JOkG#EMjRKAe8P5hX{2$;@yv5Cwmm+T;VS*~ zhN4c*9Z`!(#-%bPxkXp*TFJOsCka`daIa*Mpki zZLX=er*4#-`|}73+iuH?OI!a$l!XNz579k7b;>bb)ziLtuV)2aQCjcc9I>PI!_?zb zF7~c{5>_s>?DX57RZn-881%e-G3f)(;afKan?zDenuC9`cK_lreeLlgF=HLeGXLjp zvkshiaa50Mf`mj;M6lp*zpEFwF6=bC7u#<4X3B=yiLR=t3)K}JBj?7>nH#5e_-&Mp zdyDzc&K?HE#qlCr(^lubdiTxXn}TMt{k-`vJAHXhYkzlf+H%lN(zzn>Sc>t%)ftln zL?W9UCG`_qlvXDv-|^{I=)7iR_f)Z*J4XLhg=D)%NA}a}64Q>H(q+0EDA~SHtm?dx zZ1~b=n{{68{ZS*LdGU;~>*3Wxmp+SZI-xc37|-E_5sMamUr_h7;J>-l#BH()ZLchx zWL;usESSW*y3JjL_o&d%uX9?Gm!9F9F)e*t>&8jvgnLcGpL13k+-|bHxI&^gv?XH6 zN1NFiWp`r&S(2Ey^*pvXC?IyCXxGGd3omZkl$kR-Ym7HtLO5M2`{oIX-E7?0^5`#Phe>54TU;G2eb(#u^Ue#NyI>hNe0J*V|t* zKi$=nU(owd(f7;r6MIv)=Wtv;e!%z9g9T4-O1;0#df`N^-8F8LEB2g|XUK+3vMzZf zwDiTQW!g%1S})?*KMG$mc=a-#?S|MSuAla~_6r~CiT&>QRiPvKpSkQrT2E&MeWs?^tG@=>X^rtUCuLpROE8yh5PDEas)HubgbW^O;1{AV^XYcP)J*gU1rbIl>k zHODH~9A^EcvBM+%ziP=NqiunEd16|fzuI(WA35||WoM^!$SnB}vUNvw|8&0pXr4ED zf8C`OT1%!*>a^G!dU5Z$lxGDmkPB}yDt3BCJ9NznrmuKCl0Peq%p(|hRvAT2dOmEdv%M+;{Cr+>& z_K-}TaCXAN6#q5^O2k*cG+D;YTjIPyVgak9uwiG<_QKURITA73 zvqa{yOCGC|U6Ho##j^8iLbr5hC?py+&&hB-7INp*1Xqc#Y|pQjSv*euB^Fpyo8olh zs0iofq)H!#>4waeQ#6=XZWhtbnRJ>(G3&xpYRA$ zK-NxCvo9=1F8Q!*2sz}{wrF<20vnh8qIZo_Ll$-UXw97)lb^Wa>#{8~GjvN&2`>rL zsPYa7DKUIEHBfoc)Rp~NPRrD8EK683DKLGx;+>m|B4Q?Fsa_EA_fB2V75#RhnAWPE z-xoa|-`k)SaL_<`sk^sGaPaHxrA4O#g|B%;95+y%x?#fPj|^r3=fl_E3JBZ1r%!RY zrfP*u`QDaiugm5bOABeN6lM#W-VzuPriND6sbYp@qwA94|?Jdt2d> z^0~0>^t}TYw(fS!oIUCB9?es}dW~0_n45)6qkE65*m$OU*0ft5exS2)`9~k8M@P@e zE{Ts6+n4`He@TUH&KW^wKJ`L^pH+1BPRZDq?_W-eLXu;=Zaygh0U z*B)8yc1KobN6{YN-B+S5J=O)Y?Pjl5-Q(S!GUxsRiCG5PSMJ7ajUBJ_o;`D=W^eD9#T#fS_;0#}&O?c}@1%DrKD1~~57;7g zG;4aHkl?KYB6EId`#d+lyCBxDW71q9-T4-q&-q^dwocmCXx|~pS@OZAP6rn>tm8M$ zSmws+B|A@GGvhwD^)1C$bg#!2&e>C|UEqHC<+GTDD;7BUzNj&N@=fi=!$%MHw{Y_) zUkS*uZRy!#nYU|ooqKYyIG40m{4!4Y&Fh2b>&h&g$^XKnr%Z6Cr?}HBreDi0nn&NM zd^wl%qhN^nrWcybZ{&ZOPP+G++b877|$Eao=6}+=oT>1F&-onIm&s&a9z9bbUi-^`uKYq1WR4`=y#~n&L{B2%UZ`@T_ z6J>s_Ecx*V&rbgTcZ`YQer!3EWO|LMr31Z3rmgK+Ky{miA3EQH=>6y8 z8gE0wtKK>A+42XU>JNzQOOoNERJm6VXAjW&e&ex*7 z*TR4GW2Ma4Lz;garpOnHh8OVKKg|ErQ~!~>_@UP6L+f+2>XIve%$@o`YV`s6HEi{p zN`G|cOn=POb~LI{ilOyOzQkU4QJ2Dv3qGj))#!QjyKeejv)=+MWt66`be?;zv3+0D z;a{$oU+TKFPb_b$oM|J%aAukC(|S-1$l|q5c^ex8gBBl|9ThW34LCI{xY^}3~$yw8}H89#+_*XE^k5T$1d}bkPl%;xwVw+ zPWI@nFz&IjJiIx7--5+`(rrpoy{IB`{^!K@^N9yI}oef`o zoY$h%Cb?>t>a>kpL)HXtHFeGp47qK+}Qx4c5c1M#~m7Ilg;b7VNcgjo#$Rf46w_zCOP!EN97n#g3ITbQX5;9P4vC zR&qumq;Z;|@4DM>*Zp60v4Y8~MEH)6&t!w{g^MoC?6I72I^f#mmv5gwJGC~m`hsuP zVveM3J(W9J6c?<}+J1-0Rq1i)iQ>D{FDB)7E!*wclB#oHX^0iqmdjypdY(SjiID7w zylwg@wbbe5LrtUp1yN4CS2Ij}7y^?v-c_jkvTs9f%jK@r;0s?PTy!GtynDpF&BJD5 z@~+EfCwDAdX5Ddg#pD7>)wmai4W}j3%0G#$R9f>=%-q%J;g*Fj%XWkt>qZ}&8e!FC zy#840oYd|b({&Rz^dx#QG8;*4n3HA0v!!eDlU1C@4SpwiMFsw@T;u+9WrY0oohw&v zOw@MTD^|#PT{PhNL9-;+J{hmgc}zv0!kfG=d=&~aYB}D$*!A&Bm7|J@S6^`4$}n24qcbNLo5y!?-ceZCo0!-bX#76ZNOQMta`)27t7F-(1x%6=7{g9$5S3ZHzfUUQ#wa>*O7lbg==>~<2GmFn+PGtcma z-Y%Hjx@G4F8$*_d0Er-X}Wgu-JjZzn^d;QmY>|g|2Y4Gf zGj(0W_6JN%HQcOqTlHb)ttX%TCyT!OC~;u(mi^@tnXC2I1SRgh+~K!#?<0#(`qxX& z?lbGSdqep#>mH9-FRQa(mqcH0;@z?A!I@8cOgLJer|#(q&-i$=&HR{wX^_R?t+JCo zO2wU@%i=BZ>bNcEv5v*jGOX*3&Pe_L@j}dU8tcnPUzhbT-#BmJX}YP&;LNL|j=P@h z@jbow@`)K*`3rYVI&kh#gvy^wnYUI=o)eR_qt(Dyds#f^U#%mlo%fas)GspcFseGm zV9hGO^}w|&bqz)AQ~8`Y-+z9j7}B+V@r?HgiLPs#Z#;aFp8i$0@V89N)v)IeW_^3K z)GmL+ON&|U6FTJFPYW!YaB$WO_Z=HK_W3G{&0l00C#1EqykK+lZ6{T}D?9evJt@C1 zy?2S;ll7l0Zxji%y9ES0ODKfY)?At5P?}(QL+pF^`hz=E<{V*O=-^@1a4Nu4L&4^k z^Q0d)9CM3)H5k-d#6`(#m45i)!Ln4TX*pj~qTWmY4b{#^jom-QTwB^aUFMB&tAOkq zje8b8u4-a0cd}po@~5louj#4}yj%Az&A$D8#X}G6s}Ja|98mlPp|V2_VFx~Zd+;doG*J;-CximVHPKB?4-}3z1%-#o#)}l z8L2lmJmPU)J>C57J!Y2ac|GPQHslrE`}FCOF)y2)GS}Wid(RzMcWLsR$!<3%^PK&7 zM8rAc#<@#}+qPt${8(hDJl9((c!HG0t!s^oE^UyU%aeP^V9D#>y~nQ?&G{f+lo~8A zyv$VMSeT2&Hp86U8V6^Q+b1jist%_fpE#{NE@IPx4VH2asY^D*+%*@9;@@RaW{~kU z&g6|tPoiyNOwkgV@0V`|*}k9X8gC?gD9`5L#^tB7WOuZwZ=9Z?Ji*hyB6Yfx8b|0v z%e!+;SE?<}oVe2M;_Wt;!{0n37ib;rX)3roBmH=cp>p!&Wsj?*er@dEQKqS8`Fv%? zrT$gcFD+RtX3XG9wx1+p<(#rrotOQi$kSCj0_B>HY`dl&wmCS&|1raHW1iVzOV>W+ z=woB~$$rjLC{X|54L?6|)x;-D=NYCrp7->&TDDOCth!GiTe~*#Xl=M|BC+b6bf{}fYVGwL)QFqmim;jTrpHHwN-tpo@V=N4Hi?`rE~30^3?K*yx4xpWZ{dgz56QG zWo`&{Zr$`WNwdd1u~1-bwcO)9Z2YOKmYhgquKZ#;!Ts?w8P>V;g6pnZZ^}6DA#czl zJ>zLbH`@WP@8YQ^%g!cj*xOuw^}?C7)i0Ml?w|VhaZwR-{`QBpZ5xDKeXRO?OZWEj zXE122?76r?Z0D?~HmOyrdp{k@JaD)}>5=lCM?Yq`Z1)KgRy93&^~aMRQ{28y;&M|v zcSdqk$lf(=KBvF*trm-TeQC$68J7y!-zM(Tw7>pAbzf43dCuvtb2i;txNgq7t?OmF z`X6#1ZHX=8k@T?KlykXGREo3U$fCr@#u~9lUPKu0jlR&*vFq)N?^Y|qUA`8-^?ZBr zg5P{u2J5~F`Tvc7YMbdMd9&UXedG20fA3jS?|7BCg9n`IS=*0&3;poshXbp6kmA<3 zgEKQ$G))Zg&i(GP%JkMJ@k1#)KG=S9kJhf(xb4TM#C@&*8*=w;Wty1Py)ATt@76o+ z8I2o!oAj1dOmUCa(zt4~V)@LB48hNV`#NS%f4|uH=;{T5a+T{V1?BYu+%o^P%>T&w z_m+cY>IGNHcMj~gJ2|=&#c#LXT_awbqi^acf7h*WP73FeNc+9tA96`IoGgiW!|?2e zwL%R66dyIxU} z5;bK}`6QIRLM$*V!$JERSM3c|okY`<$Ii0(+~?ow|9gY~?+t5fZF{^UYCV!V%(IpMOrd98w%; zo7~E(HEGp6p$O5`mla|BUnigaXJ~7x6%hO3`=r{4aACJOX-_A#)|}k0ucDe*W<@U8p>_N8iMvKo8uy!D zv7~PAo&N4@^Nqs|VUpD^Pu%!Yo}Th%vGJ>uQC#2j8NN%rlxdcq@Nq$H)yp|O%}i5| zU+r-{bXTU)1-o(_wpIjpKA+k zAIpau|C^Hd)7?b(>GjDkTc%xkamVeiW$&a<7Jk8hqut`V`fD>8qJK^4QGemW?vdHp z(X{--mIJrW>~Kt)P*pj-dQ0WR2M#YkO(@gn2|GEZy`&=1C}ojN%6jq0wkM~Yt@iFQ zrzq^lx8ly#h@Pyib^Q(t{+!%3f5NJRF{h-i>)3{cWNdt&5!ou_f6`|2RIA9yv`(?Q zRUWy*8UN%@$CU`Ie-N4%aJ@_G?RTBm9Zgdsj;4PPop`BmJ$Gt+6#pWjeT&WFAC-Q4 z#8$q;ODFxN{EA9GsYqkDv&N31FQS)RJ5!URI)`21l+m(_`KNd6zZJhq=ePI!)qj^> zy>#8Z=W2xW95JmeZ9}-xPYqd=^a2tCiMUBpcpQC_49t z=x>cfb-zO_b~FBtX)rC8kmTaK>$>#E<}$J5;B_qJ7d`ry9=_$unfCsb<&o!+n=PKJ zsb+kc&NVecK48t!{bZLfcNgliGTt!?)z- zs}t3i^Stf9sDPw4Q_WGv~5=G6u*ukTd9l6RV^BfHc$eLlyd)XUGJ*B+KCUtM+fk>QCBmxBd! z9o70*aTrfN87HUF=GaoZU4=D^t#OHu>hD<@v+6U`jHhq@@#2H?WwX7!ZEx>A@I9Va zwd?I$i@vW-w_n>f9$lMWee~|#N79S>6#Jrimae}1?PTOZmAq3kk|N%m+!3tgwLP_B zS@P)_YMfPeSM_(Dmp-f`#A7J*zw@36@BL*8y)z|(A`)i2R#wVf7ohk|a@BvwgVWca zx_YTn(l}s+t>5m>+rFpPtaLb;?|< z@ykV8OK@#sV$7nca<^Em{_JFqT2RWen6bp~$WrUlM-tBQ{}M$LV;76tDx8)$rvIS$ zxWv07`2zn0BZGDbK9F}7x~aS3XNo&W>Fr_@ZRZ)wW>+to@%=w|)x(@X7rAUE28IljRS)QC7NvpXRFs&P zoPm;Pr%pNzx@fQMKjV_1E{zKJJr5U&Z{=T5xUlnL%L}H(uM=k^Y~7ZkVK-e(tCL&) zK)cbrYsYRMInF}iyR;*W_+9q@O z$#VTr$xnjev66-sX9G%O?>&ALv@2J!cDpw7N}Gpr?0-FYU7oZa6y&$scPCLppm^G( z=w+rtv#mL-CoR15g{jhLN2Yh_vD^Dh4BBcKd0f5j|M%LT+c)8^)$)mDdk=Jf`=?@G z_PJO6k^}42{)>LqN-qtwqjY7BXIwHkec^|@Jex_+>xct$+FaRQ-{+OkNbWpn8m-*B z`tqSH!`)8ZrqLTG95rgb$Hne-!ukAiLoNHd*0yRgNB+C>@XJO0_ZIhN1QJUv%iSzF^IH9O+^ z1SOHy9UIs;zP_1z{^fUnC3T+EC5p~7s`GgRoz(VmsV>|o?_ztKQ?^j;?Yar`?oQs< z6O$-ka(-z?|BS7^7pj7mwv=9;t@6If^yK%qmJTZgQA0Ho9_)xa={5Lj}Gs55g zCEKo&JRM?wZDT`In^I!#qSILsDp&04xtP6w_?`F|#pkq8&MG%bR`#?;W`yFE~O^ZxI|!P21; zb$l$7+MYUlN$uOp>MbM`X4kd#f>_Vm-nIr`X|A=`&ZadkJ>7OQC*$>2`=c}ORVZq` z?CFzTUvljK!(RJCzvlRQWp)_9JZhQlf3Eu8^UC?(ZQnmxUteF@7^bq}y?eJq#C7?V zsn@q$N!gfi=i;Yn8xQfH=AVDy$GWlwwt?RLzSYsCPiO9$qrbCn*=}{++pJd>ZC;!8 zd)B_>6_s~4T**CbCKDVUZ1(o_u57WlTOy0XKdT~C*)sK2=`+MQqx00%jo4;Qc z^4V(Qlp5RK!OirKd2`Ax*IDhCkGov2c=2o%`<6^Y-NuYvo=kflXlJZb6IjJmr8iyH zy*kSJ-7T{_OOESC>fB!EkgYQ7k?zWVhw@undVMPO^DXAFaQ)$!!^kY~!e-yh!~mC$ zC5w6&y;^Yh?W5%Ldz<`9PX7MO)po&o&ZM8cf=4*m{z@#p&8EWI^ku^3HJdh`IlI&2 z74Mv@f7UJB&CR8k(DNp|!F%b_{nA1BTIvo+W&aoVJ|)Vmrp;y$t7Qn|9sVRvlF z*|p1=K6+d}xoz{nxKd{(q^RA9`)J zhsSY#l|Rg^@y&0SHovUB`}WzaI`#GMbWR*M>~7~;)WNE`>6}*V72WSHXUcon7IB}^vv@7)c23HZk8@?|7?Ayw?H)JcAd-p?)N_xFPz?a_jloxVvgro z%NCbhR63twW%Aj1?%E{+c4fcg&gLq7GiKA0SohuL+|StaUQx$iUO&FoJ&Hfn;Ggxq z^D1rr2`sixI6Z136FRQs@l`b%@3>agVv+uAQQGp0Ubj?N)htufo)KBuR=4x%jQ;R~ zrAzlms@AJwQuf2ZiU&}t{_W=jKac%wqE~vbhEmMwTVPJU9fjpXmUO%C15^~PZ zD=taQD?zEE=7wbF3pt9|2FsoHUck|G^jedC#Dvffy}wu&XF6SRak7`(oTFaydYAXK zrJeu1gtxAg|HJrC9TR{ zx>SDA(j{5HV#%>kZ|*#uTL&#++O|a zzynSXP#d{X(dp+e^va0+EF)w{? z>3o{GAg-0=(~SgQE<`Pf6S$cBK%47y2N50$@(XG&tR83!mA{9^7Dn< zTZ{LDT23DV%uW12EAZKnQzm*9s)SsHx>i7sy2hwSL!yf>hY9@i%TYS6VPU~?>4r$L zcj|1H+)VFIO#vRpM&UaarG_tkr}@jUx_;6Ky8UO`zONJ2%aE67Lsml+Z zR61pFbGw9wgxgoQ6a6$T^MbEN@7j3s>aK&jTTkY`o7EPja(UnN-*@y!Nnu4UxaTeaAyVGr!D!!yeO};Uzlt zx6^ifefVJ3-p4!lDLUC-c-wZA`{wt#UNaIbECsT+9iM$?>ck@|hYPzx%F28mHU|Z7 zijoPo(0pj({Ov+vs?TF(r8jMvv+wyTIb3wn<($*0sQYAFex!=M>&0I=tpVlkA7;ne z+Z;ABvhX*Q+O=G`Kk=yJXR+Au`?@o&;}Ux+Y}6lLs_VRRY|-P}^B#O()Z#BOeo#%#Soh;p!ydcHx+8hb9j91k*okeCx zJ=XBAS7-84k1MRX{=j>gE3={PlW1%G4Ho`?I~`&cmsp9}sQxNvRQ{rzsdvBikNDgb z5mm>SGn;hOJ)C&o-Hcb&cQT$?-+M$(Xlo7o@?A4B)q~&K{csV`>eNuGTEC8GzUqpI+s-Se#k@>1z3aHOd3o%b|F_TUx?gF!rT93hApT&g z(o``KF0Lhey(gu1#qes)KgPdz&-&ndO;a~pzErJS<2uPcJnQ0;xRtWrQd4hbObXv+ z!2iu(z`$>ku2uhoo6?}dL7VB_fwRmE42w}VZliC}5koE<+#tJJAwxQ?VeB=+*Cqek zdw-kzgjq&#fe4r1BZ11UNopoDmY8m0Y1*tZK|yqhY5L0?`8lP}O1cU!smMy+tzPOo zd0BVg7Q-1{d3PMrZ!N1{R{ef&`Q*CycO$3uX4d_Bxo`LPw?Fr_%hx{OsdPJYr5;PqWoL=)c^3%j>NjD@EOvRxVVox|hgtOxSR1y@8;ws^qm5a~@PI zF-a8gO!ASwC|tSv#%TeM)xVA9LJJfouBkOyeraP$j-Nwuh;M3EJfrC~@$dJde_hHn z6?}VIE$F1>mvu8{eY-c+$84(Kb&KiWRfUw zbDyX?%oN8c?zelKKxeYm|V3nCE!ByjgC^GsFP2n%)In6Rj!8>7*1E4Xriam zVHTtE@KWoR%r>(?8=)8hUv+hTb2jB67vczP+guOb+vb5U_1A2r-PwQnUjodLl2h4 z_+Fd(YHc=;y3kwp9ga4tDL?p5>%A~@R*9LuxhFYz?ze6FD{d(|N)}31slG|Lv4h3# z*%SA#P2Niv$Qy1d+#P5#CtIQ>aoukIK+fIMo}H8GvplYwX#TWdW2p71!&4qB2z8v2 zP{@xKT{1yU_tuXcaXJPibFWV=e)^@z(UVm&p!0O!(?=3|Jo8U0W_&N4zb^HL%s=~s zkxuqM_X@L%$Q)5@3!NhT@a4OrlZI`*JKy{`%sJiQd6+`J$vwIDbFTx|%BsqwMQnS} z6K&;^yUWGmj*>*nGKc5$%&SjLx>ECJ&w_-IIo8v%d|#A>XkYv(*yCZbE8*78Pa-{y zXYw!gPc_}_^6%>E685D0-;R0*N@O1&?qB%1Fgvd<$m>DT^dp)(1XeR86r}j<5Z={( zez9D>oaT%pyeV_7*GcHr&iPfK9yWnRZhE2cRM#U9R(T1^U5FN|44;0VB`@rQjm>@D z=XQHjroOf5UD$no{rVNw6aW4W2`ZDGr~R;OR$lj;2UhV8!lrvBG``+k*xn@mSoKP{ z$(Iv)(~oRW%DnV&f?BNfYu*Q`6%$*g>-*eJIeGDT%AQF(7KPo^5z#M>YVS>27`kIu zZ`G@-cS1AgcpG&)?h#u*>4R0DyCYm(XsoZ*uQUP zZKb8*-QGqEL{Bk~&fcm{)krSh~Ahud%TC{#^b~*Cw>- z-p>7d`-38=NJ$Jpw|H_$fdo=TSCFd`lops~FS*PV6cx-xSqkfRBwQwQpr0Rd7lJV+c8$)(-+;p{3dK{gyXLrKR84cY( zxAnXiJQlkx#^=J(n)qY=9-Q%e?tD)B{^z(+otunv<=r>;9!ag(F=PJeAEJrh`1roO zz5V!;PO;(sX&YvUTZCi`t%45!OiGNOKtv`H!C4=U(Dcoyw ztnSSUE04aapYQlbxPIz~^*fKPKdhN?kTvGT{!|;U*{xCMq*>QaP0KuKR63KZP0Vjr zTwC6DwXd8rFFw+)WapaKnI6bA!{3oZ+mkC>rQ0~^#>ZKUgg&$7^Iw0xzhlWyhN3#% z^Ada4K9v*-_?B>>*^%F@I^g32BYwT_54aea@9=)~Z4==6)ZMUUEgOqjgJ}g*?fRwb z9e;RQZ`iuIiI-VcG-lEg_uppq>EAO;$}jG}kg@LT{A1G&mu#5Ix2=l(HeYzbSeU3-=%p1EAW8eAJb-{H3o zTe0lx?LVTXXnoT9X%W-t$o^%`fnCDAbAz{=ZTKpi{;u}T#B-IVF&Y_$xenWZcrVEi zRpLlCwt6x9zuxlr3FUK_|8g^0)tHbaR`yQh6u+XwdEo%3>*pUFyJK?d&czFxS6BG8 zzfNG?9`^B&=2ww8t$_6_-1oM1uY7b)Q^;R%@%`80M;>_1Gr85ae$mzp>zTjZ_M9|M znJ(VEE%MIP*+=hM){A}*`&hPha?AeJP2c0KyMGtY4fWxlBYd;&RCLdhBbvu{bId!& zZnJWBOYwnE!9NmCmwtEnG`Hb?eSGhJ&l@}2n;fE9FYY?}tmqd@{)%L_^ko{)(~GBc z^oM@D5P9&j$9{h<%PpeSwwh^wq)zX)#*|eCW^pd+`IFZ%zvAAvNTr3vxhcWO$bR~}v=Hyz zC38FfX!(i=+5cev6L@TSdCQ4=i!!Uuz1?}f@?7zG+rM9bANOCfp>4WU8_TD4zc1z; zotOW<>eBkX{d3%$-J~utJr0i!znIvVBylx&`NJLRm+Z=x=3h@$P(Htve@<}ZZN4n` z`O=%zCiJ~z<@){i183gk9SxOCH~;dVQ$PM~?t;AVM<=*n-8sEuUvZgQ!j;rLkFC!> zYdrMqOpty_mHL{(@7MN;pJ=}Ja$`^5oaA^ZiDo;ldF~F%frkzrTIDCc zkZgy;9+S*`ea~jk`jobPNzl|cXUmR$TNRsrP$ow0q;%a=*0?>Y8*Vr6a8FT4TpD5; zaDb^grD*Nvf6rN0{Y_mFd4qda;gzCfeV$*R-?z9}I{wk)`D<=;!$(U}gKN*b^Y^A+ zu9cJ3j<}YUc@-l7?!l_O~k=;y9xxYM0y24-u~azw))`>kSSO zUHNTg8j?W`^NiR1nej>aj(I`zH?{rmE^+_r`N}ICzvDr_v-O&$;w?AlU5HWN;xPMo z2>%NobrV6$?%UHZxN=E*eOvRX+^1∓ubF&MX#@ocX%_HZ~k>o?rjXULuopyG`xF*-f_#_nzr43`z?R-4$`-RGZ?3-^yp6 zIBRphsGP~!;c{Ttw9_t(wo*b;>Yrzdd^rCpXx{bm;K<0p1iy#;NE`wzPwAJUA4bnF|1yeWbtxN z?wXBd9p7%S?v~ttpf*cPHf*(Gd4&0ct*e=%GQ7HfuP>NiUpBW*_QJo0p8m6C^+z;B z-yUU@`@H#PN!W*%TZTHMU9g!Q6nL@mb3=EBo$k`u#{0t@gd*-F2 zR-lHezpwY<0D(DY(`T#su0H0ycENI$MSqzexe72nQVlwv`D?;*LtR77e;VL0W&g4G zh%b+${^tC&^z`qwwe>YlM-9t-HCXh0-=~LaZjPLyfAq5N#5LC!87vfZi(MVcxoeFt zOBcu9=s>sqAzzurwtT)CByh)jX7}n>iHcpXQzmjsTlLs+Fwd)elV)Pi^^E0l$g@p0 zk2CDk4z_i#-6hFh+R-*urI?^;NBIMQD{pY*717F)G?TxeLP=9}e z@B2Sq-q~S)tJ`-Te#KYJdJla3g36J_r??my7@F_~Daw$fXI@EadTNnNesXDUYF-JX zj~Cl#=y%vb!1cdM8PB#tAsH5-B@2otG;v3{Jmxqlw1_bM+})O z97JRqoE49;v3BaFeNBJ1-+q4ld-;sy9$jwTLw=L)w1=)Nkw{0D_B6XFG;+E!%Q@i!5%;N8=-w>}1RrwT>c~0t& z^{)+SiSjwlf1?Z%79GBoRC*=j!2P?sE1Qhp^v+L|I{i@kj_P*K?3lgBUM)QL<-&8l z^#4p*1|Rd~_9T5yP2D(?+u}^w&d26EoAW`*bwa*wm;fUKLk3FNq7SN}%q@H7mE~ur zqNLZg!Lj*5fdaPE*H10g-NF?iDwy?JZ;Ia6vkTPPSeh5E<@Eji;PR$BIoI{dPi`{# z7@xT)_ffO`0r}K9yAzVvip>6D^!?qLna1hQ&(-|@_*MGRipMLPB%JSU>p$!HqAJaO z&X41N3^uqa%V~HRJUN$~JH5I&vO_VE_1uhwU)H^5@5}7f`Q0(Qc6Rl$!>s%`Yxh`5$ZuI7J!u?m(G0s9OO(gP!9{vzdbd5idE@QA{ z-tI%Z@kRxEf8Vp(=yP7E?_otei3D09dsj^mu(eK=Bh2`n-+(5yms?Hs#d~U+P3xQ zqWa0R9mAHU-b@Op{-?5`^7hw`tfz;n@=q>zo>@@XkmK`C;;v9hctLZ{tbJW2Mpl!r zp1)w{<}fu!tLRlqeqtuuS^-y|W2?66U$C2-eD%a_gXi&mS$GE!GDp!MTwK^?<}b1 zxoyt~N@^l9hvq3VF)(nT)HdizO&NKJ263Ym`T*|Skm%sc4kG`=COB|@_ikjGwmMU= zse+w_(Q)-trK3qtHJ5nvwzY7soSt6amT&i~#n{hUx%tzZ{vw;%AzcyaR%(;aK6~@? z+|PZR(?36cem#H15s5gD6$vk{ehtsMX6j>_7g1xnd;j6NzPZPrXqU~JEwoA^>U>NW zH_z25tG$W)6FamDZ=YOot8v->C$IX>`I;WqeJAm2=LG(prm~(!A-Y1d7JhUxl4QJM z7!u^uR;Idd`QB?G!JCa<-8v_CJ@yb=M~SYpbK7p$4+}lyZ|Y5M=utBfZr}1OYs#_n zk2q(S%e;-fV^Oj^Thn)OkJ%RED}j2Gc4VaMPCubJafZT0t%Z{lcdVIWv`a8)Ld@;c z2Nr1DRy{Ix1M7uuJbW*sz;b@^pnp-?M{^+h3@( z{=2jAv*t3^1kYp1Hi;_=bL)E-`u>!D_%rDJ`GkYkY@VF2kGx+L&1)u+Qh)kT+tg?I z*&96PD)jC7uPdVBYMnEET0m#|llSfsWhj*_>n6xYANO~zH*UG`s??0lTF$@0sbN1rZAZoBn;!N&jg z1#eCG5;io<*81?8uhzjpr9u9pMp8@Bj-svyg4&OyZCd9}xagYPv4%^j)#AOUr|918 z=MuxK?J7lQw$yjNajatN7xe9YYB2Bklfc9}?e^XOp8LF#*t~Mu?@F5&Cm#m#eY6SN zH-F*_HAx5gi5%7E1v+OgDCARqV%T_a^LW_pZrj z>l*db#k0Z{zH);y;T+Do=_bq!3{&tod{!dX{`Ldd8ouan#`32{aR%$Hp*eJ*!=g0Jp>vpl{ zz0^bhqmQd>-QDQF$eOFern$0h%F`K6DK^BJbKirDD`roKzp+j>=g5ioAvOn`TkoAzW=p*;{X4AWamnB8K$`;b4uoSnNEwiytV*)W!1T+^^30P$L6<2*eqsoZaXHlm9a8w zrn8u9)KrblJySK$7@h5Tma_8K+dZ1H?P4z!FJ7J@woi2%hgbSuw~ng)p&9KvHV6J~ zI;s`;>e2`8Pit3wu{%=L@q6zx)|gfXM>CZSRpDg0&`0sAr?W#G!+bPf1?#Rn#&7el z?%uk9WD~CwfloNs3RnCBx8{tce|K6kF)(D}T?vEI>42obu*}qQNc!uYcsfYRQKap^ zTS`60w=aDKnL2EUK-h!AN8)t2Fwvt@7b{^xQ#ZPoQxYwRK#QtGn zkfm)8S9iddM_=Ar*U$g_{qKGI@)?H}x9KjCxMuUd{dVt?_jQsXOZCq!c@gblEVBQz z-2aztwUS%zt}l698>}UAt9F4zQLbR9%ZtoPQBP5WJ$F~m)CpfTL+fqdHaqoBwxzn{s{oemlxh_MWla0+f&Teg@D_g}iZ4+kPzG=IC zV^2@3C|i2W;e%S&I`psmNgtouJ^54STt)kpw;$#TcI!W6oflbga>J(#|EcQzGmKvE zab{hAX_e&;Az`_c)Eig!sFzs0dUaRC-%k4}x7-9xZuwM&#r}od>3m!f+h0yLlX%ni zD$9RH$fq|i`|Tt|bDE73jxnu$_Bi9>JKnRJvx0LxCMFsxI`kUq9Q509xaIV_`wHK= zubIx{KOR)Hv7+%pY03uA5b6DAL_FMWLNzUFqhlgt1P;-<+$nl_;u-4 zTW31@X-K}{<(o3!?DyZg zHFevU%NCZK3K^Rc`a)L)b0%F235&nKc|%WEr|31KtC7#}(C|zTbcM%6uc^ zx(2yonZo7@)1O}$pI0#XOK&&7-lABfq<=;@Lf`eB#OvAi8wz@o9&>xe7k*UM>C;QU zxXQp!|JrhKtEC@1cWNZ>X=PfkI?r1`V{sQ(GSl}R(%&~Wx##RTYvx&P5xh85=>5)P zoa<`m1x4yeX&ib`uN-sU=gtpaP$ksKX6tc{k%3_|-oybrL>)Zt;9Cj0VlLDZQUK&m zI15_K+Irq0bLljD$BRdJ*EP8OW{@)PRq zR}+utm&U8iSrBqv#<^5WNcoG6+}W1oTZsoQWR(B155N3UvpJ=uFJZ-(yABb>^-7Nf z=T|s2cjdM{3az)t<@tvHte|kWf5Vq;%*eoS3U6l*Wf3CeK3UX$bZW4-zi^<)KfSr%P8odKuqEPD zuue`OsE#|)2OJai#gD|cpSruDPtS7m`eyyI5x(v3N}(2!@(wtEq~ z(^8L@nfq#%E&X|6W6t)*#0S$JS6C;_Rh)9->86v*d7`dGi}T1<-WDyL&bs;q2eZ|! z69?Am+?;JTGmEq7wMBneUs>A*u2d^A)>Hd7)vQ)&J)dwR&-F)9=&vIUiB=O&&wuo4 z`^*~QldPWlM^}lgc1oL+>#S-ANkWw~Mu965A%KO?J(;eLq!))$*WJhr+1~YPLr+ z4t`&2>uUW|XZ2&HU6x5abJJfI9Fbghp+r#yfokc#u;Jm0Qby}OY1K*8+;9z@+D|7e__uhn`XvCyh)7CJG{St z&#*bf5f?CVX4bsNEmH-wwkNz|FkY@$;w6-^TtK$O*!#Cw%0KXJmCk?OwRSNvFnqw< zo=`^aRt6*%CFZ7#hu4`rT=$+v|sVuSG~btOQn4A{k_lcRG+W5|6lWy z%|2+y;zQ~NL0YzFO>#C*+POUX*RDkAu)mFQYb46EQWr0B5`1yD?53qa#^uvbe{Y@6 zH2LBk;lHi(R=&8p)#u>0Gp}ylsq@Z>bcjq^;ZS~VjnvO$RTnqNIEXqn&f6;}#dLw? z(C&-x#pX+>&W>;lyP$a?ZdGXR-8I+vKb+38=$YW~d{(0I^`%jZv$%gO-nfS4MWA3> z>FVE;uNpKcGdZ^DzMk5)@xY3I8D`SA&kM5joA4+fnkI2xy6WkIl&~g?E=AGf|FpN2 zYAu-bdR5-*NgCT;O`P0i*l4$2m{;BK;JayaKNOrkcrp9nrZ2s7BDX)cig>@HP2$m; zS)LP1cc)p#?7p*k-CS2y!O)3|4(n}5y1VVmB;AiDDFt0qLLZA3zwfRxStcCpv3iCW z$J_J^1!BfJzc$95w-&gP;_5c%VgcjkKWWw}@_VD}1fPeV3AXMJV%>G-*QCIeG1{}Y z?TKSz)V#~}brW%C!6+kKR+Jr#1#e(|2e4mN8ve0i45 zlBn$6wqeuOl^q*|Dt~{Uo}VpU-c;eRyr$t#xuvqpm&YkmkL#M0J-Zh?Z8;sOw*1i7 zDNp`122T8Z{?-zc*J<@${Wyc-CqJE3T z^ZnDNy!Pxfx!F=PLoa#KRqtbRp2l~M$ZY()^2C+jwtpp)|2^Ikb12ok=tS;L|C=i# zx5>_UQp3u6Xl@uGP(@c>?OD0O+T9!R2 z@8zUzk++xm?z&Lo8#KW)DK>y ziX`P+KDITfGU@KBQwuZOyz@qY;cRpFO-t8AYG{4n%Fz@tHq4E>tloQLN8XbpN#%Tz z%~fmivu@eE?h*O$;<998!2a7WDiq_5w(hYE(Rh+){>hdpZtVi%byx= zoZ|Uf@|&jQVV|tvwgdkbXs0xF9NmmtqGf~ICSNdpTu1)%i zjAOh^uO0-{eDJux^2x%+eNzs++IUpp^ad_%5f+xH)t)h5moItbwuM7S`SHQbyGAcK z+k)!W9L!?PW;HWE5P$S+g!}f*KerVAf55VmU3g)O{PqQ*2df&VUcC~sC0Tjxv{R2& zS2r3ynQ~OmqlecnM=-)@Yw%IC9Px;(JK@)gR4r5QwH*9-xh?Noi`&yFYqbu&co0w< zq%CKZ>r{ACIOt;Mj3-f6lg_5BUAJS-7U4kF-5O6!PgtmD@5&TWy=%*4&MKTIQ_lV4 zjMJ%)Pq(!#s`EL$yx7e@BWI&H*Ejuuvw2|$)gPvOWg*}}!nPJj#j(e*f>D|ele#tpL`?`upEHr1!PW!~MgJDZ#(K+49 zrJmY2)iH50BfOv`r|Mk2+ux z)BZ8Q^t_tRRL+xA3*DwoJ%6fvU3T4_{!LArnWCkcfr`mv>h_OX)A!C)i!ICiSbWmfWGkF|{Sj(<|~K zZ*Pw{CUqtI*;V$B3!3;jbFzClU!UoEd~wZ0Z+(u`E4EXvHm}V%_AxNqaEsR$LDBgK z7T>X6>TzkqUeE7l6E2+F7k_!D|HH>zcCqUEI%&;E84u6VS(19xPETOv)(KZu-#K1W z(RDkae0$gV2b;esCjWS2@>6|X`~KS=oUYdAA7rx57w0frwW;L!O|9~E?~Z=G^RtOR zUP$0=k$Xi*){j)ZxnUQCJ5yp3lIPk^VP50-bz7XtvYtIJk8l6T%c@`ScXj%YS9z09oEJGK(fiJ<+b#NJW!$ksR!~Yp z=_aBvpC111NxRT4Z{)80*6z=Y^@@$rIvejiQYct$&A;7qO5f>Ct<`(-BNp71ZTcIw zXpfrk)9H6)U-LW(%1vC>BQtqAdwh9Bb%*Go`wzB%n`XaY=C2e_xfxE$HkEt(w7Kf^ zH|(=(>#~33&-8Dnv9ss0K-r_&bEV>r%h&wS{`&6Q!}lqZ&D6FOoqLnF{nVz12Epq5 za*8uU7RFrZT^uu|^3I(4#jmD(?diQEYs)b0!{M`+ejN{%d6Icf|9ttI_;cHJ+$(?H z`7adKroAIGy#Dy9V9_mKx7jx5%I4my*1j>Nhs`WpphoI!pg-%x?i(LP{>aYT#+CQ> zeMRHs$R&Sb{h1xO4_;4DjjBxFDVh7{&4Y{8`uxwE+Gp+UyUF9}xq0{WeO3_ieq= z$IFqZ{a$oWTTqI&T(TqJ84RrS9Sfb=fcY zer=enJ6Yru8)x(+rn3+GrW>k8gk3g$_VyUpo5a(#8djhA0x~2gm{lcSdUIQ=B0)hX zUaO*hNfW=0L*}+)Wgq{?t$DoA^TFXC9nB_>c3jNeY1rLgdP8IWng^W+CjTkCXCHpB zxKTf@`ajqIYu`3W|Gs#5TJeun$&VG@o}TAhY^GH)PwQrdXwB)+jd9EFId0q2FISwrk6MW?-S(w<6+jKe6?n`gz|@dmrs8_9w>8=q5i4)QR^$Q7HrI%PkzKb zC};ay(Xf|a@#IbWgZ{GjzgcXI*sZX1UU_JG$JRpi=(@J~*Ij?KYCCmt9M1VETK86A zj(U?$!OYP8(htthpWJuqZk&JkWy?1?U#)m2PFvAtde&cck7k^`wAOQr ziR+5nqSZkU@~?&_b>4inHtqV$Cuzcd6JC0XJz4QJ_o&2H*`>=CUwM}|=a{X=M?TdR zzwB3Kosyq-)c&xnctTkCA+28$4^C~Gwf6revCZ}W!J{{icPk|>VP{~77eb!I#yffw zP?TSgT2zvmS`6u;&kf_OkUlE#xBk87}&f^6E zN!LEznx>mA`c|uRCzr_-r{Gh83-~UWu?j74=)HW3PcNK5<7Msid##ry-xFV|`{Den zEptWo)%^C8^3?3`{el}=rvzk2S3lpip}{;Ng7@ahj6K`^TD2Z5G~1u5_V(O5 z#l}e9v^$%=?zp?~cu?DcIc*Pa1*|ZZ;MiK;#&laMG$TZHyGzop)T4{0-OY5>U%X_u z!pbB*Q(qw=4eqVmS)OQ|Vq9Cct%y(xDBAVkr18?Ut!GUNXC7F@R#~+3v9FQn z#>HuS_Go$;$D~b9RVkP9l-psz+{yg(R!WdO*QHBVyC$7@?6sx4#q3pB{N{NJPTXnS zu~YkAq|S>;&FAK2^dwY#dH3$x8%HK>t)^gSvnv;lJ4jg0+;xgC>V86*_lf30AznZ(f=+^H|>$xy^SXS~rW#vF>b>6qWKjQuOj*rBv8y-FY37 z+rMVq$uerYv%-CDlPS~ZWsGYRb+27~7}vaPevwN1a(~a-_W>6?SoG$->uKY5$g0dS z&Uj}uiFcQ)j95sB-}EW}asn<)*?c;Z`$+EM>mFGdZru&DE=-; zk2>sbIsKM(f#6=1Jj;E)2j9Qgcr{=i=QUL>J<*6Dfei1XZ(l43Oo;`tzWZWI-E^-dp0m47@rhc`n5mgIbN_jn6unrU*J~G^2v%ra(lmFnrftg2V+-2u zDlAJ4%&yHoVcE5^+_Fq_N7JRBIrkU1=NMZqd8oCgJIKvw=6b8Z$y*hqwpUJD$bW5T z#kHwg>qH}NWvS`JSKfQ}DTMFn(`=JB69dDAiqdu79jpG3$9nzwrrJ$@qUIcDGFF6s zv=a;7pVFh5cx&}T=7h+(sgf!i{FozqGG=5HJPf zwmHAPY1tJDR74$qp4u?Q?rzpX)lVnRdotBM)Hu7``O-&A)_AQ&$qP*5^==%Wd~Cr^ zwWxj`2Xdn-KXxqH~k}7pZIdo>EMvmwY9f>fBN&3YF%7= zo9CXr%KQH_U&~E)(tWSV_3!AhA7bTdy#L!ye(9K9wk17dQxE(4N2Z=#d(RxcI&sG3 zs;74|)^AB!uT{}o_En{_*znOr#n36IaxSy;hMq|&pWya$>Cb;WLUxuLZ|A>#w7ovK z`jSD7&L$lTr>SpiW?wF7U8JbTy+$DK-e#vXElEQ&i|q$3Tdkf=U*$F3xaO1C>O{j+ z29uS=-HjI%ywQ`YwwM=cGVkoiJBvQr^gT~@tlKl;v8(IjWDC1(9(9KG-rdKJe>92H z`}uZS?ET95Gio=7S?7y~JxFTF8?Aq24ycKS^^_>x7s{In4JZr7_f53UKk5_I$D?*KJ7qx-yP_oZ*BlQ7-4 zeB-{QR=o}zp3J$_JR^SdhA%vP=Ox`Dzn+*Ev~k0hXD9#W?KK{I1K+OAhRQ#KrQ$ zO?c+zGq>}&vo3a-zA^cf=^|~WeB{6GjtTzi<=;Q7Zr{G1F@{Ar@l8VKE}7{Myw<%t zxO7LOW{vhPgC34|O^zjzhc>;)Qwk6|6704ywn<=39iO-Q1<830a^KvJB@~#=a?9aq z_7ClUvhcf5(t`dA-<{*S!xAPaDu{1Zw7BT$;{-6{WgUn+m{rwhljqO%O3bl_FP0EN4fulYacY;$sM*m zyU)bVsz+D&#`)au+phRL*ta2{hkwb(0$(ZR_K9LEQaPsU=-Kx8Z{D2{ntSunrddZ* zGi^-!&Yyaj&iZZd$48D8Q5izzwI22 z87J;*jovr2S-hQNz0b48HSc|S;-&5v+3;O@_-fAnv!QnPE%r@5R(|=%ziY47?AI4{ z;0g16z-NtN&ZEYoZ~ z<9K<|zcR0PkBh~xU3^^@x9iu<`7xi$CX_Ci|7RlKm2kuAy1Q?x`IbM6aA&KiKV0A~ zRZ)L@|0^curC;Q?d#yA2RYZ_0M{HM{5UZxdV|s4}ZGcY2E*{@%EAJM}D~^ z%{_MCb5CVxZ zi}`Ru$he#@+b1vWTTS4!-}BVDeNWCPIN7=9*jtt}s{_K_a;n2lHtm`8*41m9f0&V; z4QqMIk-HHmYb=;eEhdY;)Va2D^T|KOk&Wk^CvDB*f8}xGYEQZC?MZ6c`(}Jq15Gis z7I&+D=44>-!`pIHMH!8Sv>Yp)GZORCQ~i^QQ;W)AbAZppII5#?Q39b;+Jj<@wwRY_i z*UTwpSq--wv>v#tpJWJryu?o}sP^O1`a^aNT-tPB3`~QEx^8c7{Xj&6rW5&uauDjmNm|Ajgg@kIltA1F|(X5** zG(K?iY}v+d#$qLV_nwhVW6HX${H0%iS7qMz5chUd-J2TGmOJgztkB{&RVNKsU*o;2 z72d|tk%dUOwmU2Lygv?D2Mnep)%hPrVa3)%N-iSTf_B<){?l##Wzf?BVJZVON zfH;T!d`DNI;3cPitXdZy7xHn}6TO8>z2+=aa`$d~lJ@!Nqt`}1wm68pZdzfz^zEz^ z>wODX?&#Rgx+`>x%WgTZrR3Jz7tPTDG?gvX7e|Y~kpS<(vIqOY#XO;P^ zZu&8SWqPmg-nhhU@$Z^@Lf6hT3gh5Dv2sUizsIuZ8kMpb8PEGhk*j1kn8;dRbPWkS zAj_3?c?<7%rcK>jul^3%7AVHy@nesEc0}j~Jp)BS8;|Q{K1l^js=b%IUC;SDKH$U4 zh23+?bL6-l6}y#+im<%*OBdd@=Y;CXu-~cK^FF-Go_OTh>eAgQIx{9cJ#q1PZj{`S zNV7Za1@9*OeeUJu;5eaJ{J&m-?)P@##^o>KKL2f-w{@az%jfKWEC0wT+3!ksp5xrZ z&|=ua_@i*v{j`?%8Pf|lpG=qdcGkxE{GxolkHW{KEUaJG_k3LOUwn@Ejr((XU6_M; zm+W&-cyrQu{)F54TsFVnukTY|o5ES%S0LBal~~TB++`s@OR`7kn}J^8na{R@TlPF{ z+!*Q8aR25JIlaGfr+%)h@|Y&~*yoi2Uwx6utNetrpNZ`rl@kB_-fc7R*(G?~^8!ow z^E-wfuUXC|cfB?_o~k7J=~(s8;?!O?pZ>M&tlA-wqm#uHSRFrw|r2SH@($Ku$ z^LkRz!3sZjhcm_dj-5-pcv|WF1FM}^40>m?OkA8Ur!ChZS$0)4Ug@XtCeBWmJ~lhM z3C}gdkF9=F$M|=LbGE!$loJ1rmR(B!Q_hP2>-ofYf9bx{oCiDHUGI5c{dzH};BMpD z|KRnN^*einBUu<20`Q*PfU=YqQc9sL<((RQI`6WBi0$O*o!OJFU6>XW_3J^RHNUyS zM#hZ{oPsM4D2eJQiJdE%A`zorB(slOWq}a4T|>WT3GC2WFuC+g^hVDpHeY5bJ=Man6?Xqt z$8Fh_``a|R|NN1%wK@xht6ol&|MfAsvG%povn^*@q<8e4%@mC5O{sdjC$+pJC(-$^ zS@WOv9gVVY{F;3}i)BQVwQVVV^LSZXG}AZNC7GX}yPUpIdgo{^@3aHo_OH)c(Djrh zS31Hy_QBe#CnqFqpSzaZYIn5vlsikBBc}-E$@%VUI#(d%`SlF{4dLQ<`!n`^wyU_Y z)J@KzPhLK4*Q3LWbT1x$R1o(luRH95*xd6gYMwY9n9>r zcO6rz?aY+a+-tYkJ|VMf%d*Xp_D35pCrmo$mgslOrLnm6`szuWd!}yTTf1e#_d0NL zGCHszf|ZGZVG$@v!B_C0FV{s`!Gm7iEe*@g2@aL{Klkgl?Yh?)ldlKf;*&7g^=ZZ@ zjZ<+whD$9R!V~yJUfi@Jm}Ihg=NwF-cG}h-52%i zf)*QQB|T#IJ#v5N-m*0z$w||S&)v1$|M~a+|I6q9seG$!v4P2d^$Ot`lRaee^k=Lr z`Q7)!G%w#hyZCiA4TWnla;kt(IQ=cQ8jh}Jv z5Wd+X>7V-P{{jE2EKO2TOO6@yNvN&=mdY&|{7!$$tjed?lX$%al`0eG{978jy?xQv zJ<1!`GTl4ks9b0<%Twz3%l3dRx!aF1tY2cR;g}_qyZh_5EhRhKte5J?9GmE5GxvLv z>AQf9ZV6$gF$?C!)P|YpwwkUe@c!>E(RAvf*|DEujZ+=2FaK2QW_5SIPb6n*b&>g9 zvuUnG_cBga_5HU>22x9Kff0Dux?*9>FBrVTgnB#9Lak#vC_;gFJ(sU zzo>J%!sREp4@-SZl8;SDJDtwdyHM)kgd6RqJsuxl?bxC<_oGth4z9=V56#S5-^Og= zvCS(oC+Y2XS(W8$xWwj#3NL1wHz$!j#988W$~3ua6DCT&)ROn)pZvZox#(k%lS@K`|M4&h?{t6cAE63*1RkSpQ9#+XPin~(`47VSW8ZjGbbEfs*U-ijvwTJFh`N>P87N49N>ztIY6MaIpr#i^! zZ@ORUrKz8~HcgmU#IT}S>GtfeM~xmwotHIZpLhO2{ahE%J9j>?uh3t((0ko!uM8i%Rsu=^7jtm6$Wor`(3tJ?K-3qaY5FGKYvGy>s_z#2Rdmd z&Z@dr9CEDN;`?!1khFrw-&rU3HdJ$;ynpC}&cdFsGwvPnxlhuVZfrW_a@}+8pP&P* zEB<{Bkag8KwUldpw|0f|#J^Yendkguj!;@(YPqXBW70P^?~LU^tIr*h++*@k;NXEL zz4EV?t%%Y&e%H}`-KMrTd3I|W=ifgo(=DJ_qu!&I?-plGefO+px~cb@ zn%g3wNq<-0Tg_Bnl($kqe?#ZpvMsAtR$HuhZ||M=y`0ZtRiU(H`J&Z5tA97S6^hn- ztalOlZ}~C%!JHpAaf&bHfys~=6^ZHcimv!Yu*rh`%8zs($=2NT!d>Z7DTkE1Brfj#=eebT@0P;% zk_odH=)JBGI=d@8Jj;9bce`!z#~&0N?ps|E@XkKu&_5v|;W$No-+MPAk1SW=oO0H4 z+S!e|mDjf&iJ$$u_5Y&BE7m?1%KmFU*?Q%K=l>;*CB9j%UobDw-*@U`^)u-U=64q9 zf3D&VOFAHx{i7rIS(W^81-SzP&-Zq0Jo`Su_4a%}Mh|*(x7|@3&gX2-xkDVC)N%5z;P*SmPGuVxacU?V6Nr&YkE9!qpSSGewSQ z%7`v6^qF&zv+BW;is@&6Sow9H|FGl7v>)#+>khX3;Pvmm|B*-6s)g6wbeGlYi$A?R z=DRk35wqXyoM=BirgU+2pXq-a?)R)_3&krZZ9nB{Wb3K6{L93%SA_W@URy;wx z)}i5QvTnnng%J-EJT;ucZ-muN*{$tm;kdCeGwE=S_5trdoWG2Azt+B%acp(Oxvg`P zb>rO4&m{=od(i7%cq;7paYa$F>8rc`*rfmawmGr)Oz z{@5UOQ0E-kQ&RhX$(k!qgv!{=+}P@Nh;;Z@7bCpYy>{Qf8ETF#7X$rIN` z96EWeMZ4zqsb{vQOXA#O#opztT9S~_$SBhDBsW}S*4M5Nhc{R)vRIigAyIUW>8I#t z{b|<>??!#AOZARmtX=F<>vS-}mu0=ny@?7z(#P8uCW|Dy1er2VK54b{5ZCkC`!$oc zmp9!M_Ay)ZnCG09#mSyEr3bTjF)B)}oYP{o?$I2k$2%fReUuhD@a{3-wC(M+3;j0H z^`qFi)jJ%tekp`b3^Dl2c6IV@Kif^YJFm>%@-}wQ@n0`>H5X;aub3|4k{M()ciD{P zPg^FwPG6}^8d=7XOs3a%FhAJ@q%Khxd# zlKtU^yX?sEQFCVFGu?xbCz%bTm*jxX0|f7!S_*}GKa^NiraaK~3S4w}^H8Se5u zKJ)TMl|oNF@w=**L5F_^)^Wn5RISExA^R?+js7W>}v~UU2J(= z(Dbrr)V#}Ub{l)%oc7!OUGny$n{2-aT-eyQ=#Pwv)S;(WefL<2w+El`YS%BFqS6@k zptL0DN2rLlMoakWB}vT=eQp;%$a+ppUhq)Re^NE?p1p?^+og24rq`@r*Jy0G;hpCb zQ_C9ZzYF=3CKpG2nYB-KT28y)$N%;J*Lj7&GAe11zQb1ihLAXHt+G+d`Tr#yB}`V&AIh8y{$bWMqvQR2{-0vY>bSLU zyFH)y%R7cGyzRBv^{8d7+SPZ~y?y(*YG%81?wv_Z*7^dkyWVa2FmuW=u_Z}6mq)zQ z{I)UZ-toOfI`@w?uN1o${bN^e{yf)0YVOnJKPD%3+Ii#q?xzoL@EzTv8+=6m=>;$ue$uEt z;msV@`bBW9_bTJA9a-JVesf7TBZf%um70)zyNo?I_HVzw;L6PBpYK>0d2mG}ow()afA!a_ zf0I_{&YhigcN^Qfw4KbH+7U|+{mk|^W;dR-cw5%hbfrxZViSHZe>t(Mfyp_q%kG=b zb&F@c+pXU3Zp-D|ab|;&bm{%qWjlqNeKwZfHn!fBy1VH52CGjQEk)PMQaDppR_u^H zY;IPD zy7li;R~%I1cd3$&=1DsJO=hmWiBHrtlRByBx@8`n+a%dewEcN{N!O{I(Qs4YC(xEn z@hR&k*s;4z%rRjIKN;teeV)^5V<$s>DMQ{BV3tt z>i&FwE%Wnmu?WBTdY;0m9_HsZ*d006-{~~di=pVCdO*3PNXB;8PeqNf&YA)DWmZpL z**GD7=A`da)hdrLtPRTLQhdr8FZtOuwPUuiVdsK=mR=>#J0c6WpWsjYtq-bnd^U9~ z(q>{{$OkXMWn>azfNb|jgdVHT1U*`vlYs@wf>FM%A&$D9es22zPJxD6QMEc7ZTOhM zz`&5lz`!5^(*dS!85kJgT74b;Jl$M_L-c&z0=yZSxEQ#=YHFKM&va)8i^7QK3=9mJ zxryni#rnva*aA0b!IXe#ZV&;-JdAKn&SAk|jWDks4cMUdTl$9uNVg6H0|P%?6Nq7o zsxc@(zXW6}vgRoldG&c27#Kh{ih}gO@fquc>U`St`?>15dxFCn z<^hoIHL1T$elajGs4_Az2*P!O7_BVGx`SO^(6zg!OxIE^3zqL;U|?8^5qSGp5!(F& zBGEO2>{k1?sH=*BfuWQE-RJFW2+cwM!8j~GwmSUBYz78~`3wvUd>|*ou_HS|e`pB0 z-5`gTT=l${#=yW(!+`E@2@bek7grzG5R72k6PKu!yLpcEJ!S?5Jr?vtvlmHws5gdY zklmI)L~8We7#OtJ&|~Zd58Q4yPgftTL7v{XqiQw-1H*cZAa@l;((Q+#85HCjwSCXt zU|?XljiFgq1g_b`(FY^UK$>@5d$iJtfq}sXL$i@6T(gg>qZ_sW|F$o<#D=qumU3j66D|}_y@T9p$7mc_)caAXZ^*R z(+%ZOG-J={akpwB)-o_KY{alTR{^d)*f9)iia#Dy@MZ}E1H*ERGAdjVt~tOl7&Ehp zCr;PmmS$?wXJTOJV@5A0ER_(tJ^lRrG4+FduJ0Ko7sbH9kd5K=6)Fh*KA7nSr1@&z zp2?sU^zy9e1%e`{2j3-mnZ3&VI2$%42~FOyRjBrd$6mIt25T@j$8XL4DD!%73BD} zYNZwL7#J8pX%4ksJ*W-0J;dMN2i@nOV3UvGWvGM}�Q;=)g6H`e6??!?nLOCowQE zgflWQfGTHDCWqifx(Lky==Opf9Xa*o#~cO*hBA!k%GZNyO-fA8M$eug&7s$vcYb7G zV5ne5ua6}3;hGauQn2Zrb0exIiH(7wmkm9cxf;OrCMBol=o+DG2Za}ItDl*{wL7|C ztrL3Xe3hew7#N&|(d#l{3%Fj8)#w(3{M@wOaP9;K28M111_smy&?+yu=H!gj>y0oXzn~JE{kYozZaxUjr6t((;%)=T`oi_5q~@fSq+-*4^<#5G0RsaA zs0o9bMh_ur&o9rzrg=m6h5i~&1_on6^!U#AgWH{!Sel%Q)#&RN&=bjUz4-;HSR)O0H8wK^uDKww7<+ob-2$mjh3n2s zElpOaqbY(vc0w%qvMPN=r<}nrd;kLY`+L8=Qic(YZvH1aaGvXaWb8%uBR=1n}@(qe&WMJT7LvIM&$c5WnT#{c< zkc!pixNDW7e7OG7JnSyV-Tu=kfNRc6Elp*2R?jk;+2yTFrv#XD;5qi}G(vG{B zW~@Zfj!iS}vT8;*T(gURIK1Tu>yOu<^~YI3$qkNOdl(o}@{=LGapZ1givHAJPna1P zTshFI;0&0SvD>Rr-%xK=#=ziMhHkIvXM|>BZ2p}yB}nac3coM7OT@c zTR=k|@Ob2evp|eX$Do?ghf6v-TTq5eP#af2k+q=@mVmTgsI5&0tvmpgU8r5KxZ_AR z24Nj40XccOR9?0p0|SFPBYF>T2eJWJ21-DiU<}{vaSvo1wlU|{HzXJ7#B#|0S%!4ju&7>V6&U!(h7+!+}dZZe|R z5#5~Wuw0!K|wOjNlFM@-C;UYf+1LzhJs52QD7#6+6Z!UK8 zEHlNTve+3I{_vtVXuUpRn1|g6W6!-$d>I)S9x|dw<@cW$M)+hFmtczpP?&9Vj$``7 z#lYYt!N35T{6qMy_cvC9@CVhIil=ho{0t1|WEmJh`4C~;IW}gb3;>Qtkh`#Z@4lDT z#8-?A49(0844Mct7#J9I#IPEp;#rpET9%qu;*pq_k^@^LjGO^La~v$U53_hOGB8|c zWMBZzaUe|2l|V5zKP44gfPu`Ym~_!^j{yUNNDlfS(=SPMGcY{|GGXcWkL$KEGcee3 zFfgDd{2yNECJ^VZ+w&H@1o`VeBLjmJ!c!oYKdOn4`p2_8pu)t!puxhxpaC}l#MqsH%@o3Z1eJ%}(%d2&7#SE=Goky@G#S}c z*W7}V%7DZ?*u{A0X@D)AbJ#A%ihc6Zsx_~nDH zZ!Ezu%cC2oS;pASy2;MGj*Xdtp^FvWT~56?%`(Am)~a7&V!F%>41pMCO__kxEK}@e zncc0*31DPkc#aYFyi;(RWrk@MD1FJBxO&U*F))-Uq8ENEr{XdTe+uKMol|g}pMl}D z90LPr4KpNFfJpHrxJ<-!8z_zKji15)nt_4Aijjdq0b~FiYiz+~l8Ptn5NYIs24q^? zH(CBPCI*JHEDQ{wi9fhu42fHDn?_7Ernp|c=sp_*g8?6U<*&E{*<_#0yi~|BT{sGz zg!@51{js(pJolp-R9pfsQn3|0pjdtIGHAa99|OZ0dGtc{;Q_1$;f_*J4OxBWXI~93 z14F4adMm=?JXYf{;}c|z#jBgECo?fH)Uu+tBDn8jHHL6a1TuEj}SIB07 z;||jZkTW`0zf%Xb!XGoD=bpINs74e)PsYOLAy69dPdL|X%g?~@R|&o5`1J<6N%#{% z$HCXh8$=lx!gSDU*7iTx&BN})jsg!29VP~bU(D#ef_fnqq$Vli>@VVy!M-~h$zE7H zLCm7a<_3W_ui*+bu>~uqP2yr;C=)~PFisM~Fa&>iy*SNsJCm1zK}H%qG2|;^7==Bk z(i*b!dYBj(SXj~foYMLjMi3WDuO4131r;%vJ>p-6$VP@#7Nk1nrT8W0;%s?eODK-A zVP{}C$BSOyDokS&fL zW?OA=8iqe6Bb7h9lyWdI=m?@GigWHbjl}L%nYldjpm|Lp76t}ggg+S=82SQm8bw^p zik;NmcY&RO;iLe1AuSP%&1fuj5UAL==FzYlG-LuQfKUe|^rIohq?cyuI~ElsR=Q*+ z=H#d2%1T*G9Tx4p3=C2jmBz^!tOj9*7|1>03irdGFfuUsVst&HXJIvlaA<*yy}0-P zj}Yj{5Na#sQVzmcr=rBX zc&`S#ImG!?K=)?1A0q<;W`xSrBg_Ri(eZoKulB2f-h=$S|!_ z0=_o{85rKHpqFsXt8f~I>0^*lq91-92PI?Bso|(4+_F75jUvv=CbO7DK~apElArHG z7!B@`=QYK(8n*7dVHHNS^L9NI+d#2{Y#u8CS zk2)_R8=IGc+n1msuG0U(ovqvq4C+$o-6y%r*v!FQ34&au%@_X)G?3e)h2F|mypPQ^ z%pe1qazek43p6U`23qrsQvcO`!Db3^A-3tai4drW1DT9E%DMR)!c@>uyc?+1jIG83 zIj;Gw&*uq9Kd=~s-G|fHTxru_Vqo~k%)p?I;=_mhtl;J?sQyH_h2TIb z$YnA4!v3z%jv;Do6(@wvP`~_?R7~fA5`}sDUPC{S>A#z%vJ4CoHt2;#uO&Y7Fg*=2tw(;VdOZ_lY`Y0%V>gGePeJbU*cw*@^66WQ5wL(@uCH%fU^xkXR1OWzy zwJPZ2neXy&n}+FQkjwV&^D_rcb`>x)FzBJg@Tq#-W)b!^sI;rg?D-37+F-^ndlSNJ z-^9#3$E5ty5~utMY^fS#(z2yxmZ|&<3>Os9<9Aszc9SrD3o_?xG}oyUpj9XsZS&yC z*v%o%r_C!v)?CwKUY2j6D=3x31WJ+MYk0CP?1H(~_CX(ATY^D(B$2%T1|3P^QG-rUi5@P-fWK%&K zWsC89(>G?B&@%xBhTBT$<39GUa2SQ%r?FvsXMjr0Xl4cmZIm)3?>7#E2zwS(981W3 zp988KF$<8je-Q>l&Q!teSCC0T`g;t|h%qp{(?c&nJpN-h3Dc_}b7t!%naVIRFn|_F zp)Q4p5o3e53Q=4{uwe+w7W}L4EB)eQU@(_Q@2OspK$r^~ID_~V(}f_Dn!eR^gAzv) zGy3$1hz2f`2*(B}L5mb8rYr{CT*-`{Ekd;*CYKbYrs{)7Ah0)FL8cr$u|mO{k%0l! zU_{NNb~@;$fNr3{Rw#kYId;=+;Zz|8hI(~$*Id-aW)5a(flOgDUH|G1BLhPxMkZb3 zfXx)*Lh6Sv$Eo!!3=B-1=-u#pPS{MvGmmh6#ykI=j0_AvF&2*Aa7Q*OKP44=n1j+p zzXH$A@D&4>?VQ2OUB(sxr&*A;TJo4sK56{G6~#w$8HM9JvI-n zb01@5U{GX651;k^NTwj#L%5Av-S9J4nT3JDpA&sB>p&oqQII(!?8bonRq^-Ksp|p^ z3#f0SE8j@w8=TVEBqL32$AB(<~f| z1OBVb4v1!DV7QLq$0HRu&BC!bfW>Q_@;1=!KtA;F%C5s{7LLUM(NS;y9cN`=NaaB{ zE4LM=Sy&bafRe&Swgn$~Ss55+aiW{m(2dh9bL@%SGIG)3$E*wtpLx*BlA9B7nT2T* zs4kro=pvWR#K4fjik{NhrX!nFRFqhWvRNKEnSu;jvT3qeGidk}qj=jj6UiXRBmiEM z81-sBL90%tU}V1b*+?dVt2mqnfpW3;vSrF~EDQ|KInYbEy1B>(<)@^gp8|sJyAJ{8 zCVrrM+t|<}Pkj-JQF+BBiFqY>ou$q6?!Z}Q28PA#=>3d?OOVWhR|NRn21;1+ht6}m zaWF85@}p0--&=uX9<*q{Oa`E!l2UE&OJZVRSd5VjGBzTc0a}}n({rF?fP4`=>gb{H z79@i_^OErzgM9fp>cm<4Rup4WQc>@aM~}D(NH=|>&SdP`hGGzwo70ia0tFKCRnDkG zC1N{J%mR&-;Pf8IB;@;OL3eZ^+Ut$GkW50kSj%zFSSMY zBk~QFsPWfv0K*`}-K5CIfYK!LU5BW~K{gQM zPAO!UfdU-)1Y*uA|M~oi8{AteILn4 zNOuiic!3N=rJPL(S6&9tYr&bhz z)noT7$Z;U6p$0?M2c;&aq!u}6Bo-wmm!uYXmZTOXmgE=dCFdj-7ng>_=1aSZ*v^iv zmQJ6of82BS)?lYwNxMDoIC*MnYIb@aH0e9Z&byE!H8)?zJxzA)brYvOigH>4k0vT< zFli|Tv_wt0A;hSqc!b%$;r;>s2Q!O~-BT-^oMrO;+?l<_?=8#i{{4FY{JugmNB#7ei`ZuTZ0ep4or!y{M?@R1)j7CCvgtEV zd7pJsfW|Z*sXfa=wQe(|pDUS^wld|3#m6V!lapruSKQ%}HNCCnn%fDLjqDav<4leH z4hPL;_J33mC8X3ZB@}io#((PEE1z68=A?T6F8ckw=6U#=N4-^|ds#1^veXu0>nhVr zTO&DB)HrRnWpS-;*@6h4iVLp|TT`FrM5(NB>J{fYle&A&Z11NfC!dxb(Y&_su}pjq z&$@uJu5P}7&!qw8o!cF2TfTKyO#4)MPVMKWSu30`YSmmczWt)}-GR+FF1BbzZM!Hn zb^FD-em)_+z_QQ0OqzMK5?4ij`4G!$IsM4%V&}NjqM1?suR=>)wqIBkeqr0pJB{Uq z8=B5(ZTVfo8g+9?+kwHGOVXxGpDt@7Xc&kyFAig4qEpfVQ<%5(B{jTNTx*xcYUjXhx8$kXZ+Dvs{VzXqey;bj`ZFh{%DmG> zByo>lzvS0=8_!A~xxgKl4$CwOsxGK$oVMbS^UVVv0~{iygge-tHUu5K*gE0g*XI4s zvv*%{pCRz0N5SrSVeQGAxnW#YBPujEF=!d9$(ffPF=WVO=($4Get8ceTx>=~8?7fUwuS+dJLleIa-+g7yuvT@=3g*V@o zZsY&y{?65gZ%^Z-M423eHCz6>a(Ct_8cu9H?taH!V4g_h3HP}DyBFqbE9_5>&^=K7 zKXj&U%4MUg%M)c*rSnWZ`($szj2k|WLOw>k{j9P0*1Ko>BvwucXj}Q#Kumx0;)N4- z*GL5J4%~9TV*l>thcaTfdn8Usxg;LF@Y(f0PclS0|8U+dsk}4sk@Jk#(?nuA>!v6E zn*L(-!-XHN%3nBNeWFU`k%O$k84=yH8)8`a?T&Um5BD}aBf4=*ZCiEb3fXrBOIv!% zC$H7%`lWP2NpJU0k1i8aF0;S-D=(QZ{1)WDIWdbTsWUEyli{#USi$s9xvRXUoc?lg z@!}mGCzw**D$m%qem%;g6Szj|gXOC)TKSh|EYq7+_-f}<<179D9~IqM7_sp4jG0-n zetQ*sq%(K(mN7jyo^?Nyi83y!MxM+RUf& zpmdYG_>ICFMh1pDW_;-eRApnSl3ar;^GXscTq}}O3raHc^B_qmcfwh(!ww>?=eKO_ zG~9Me?Q42yVQ_tOw5Yh3>yjM?N;~FkyKE7pp6H=sH*L0YdmYBH4-l>*^6sWR+TQjlCvXX+eXIO2VcJVGVcfX_hT`v z^W?KvHVL==^}DFs^!#Loipj%wHh<mFl3**-v)rf02FPe=_rK z+23%{&s%2mxrm$&kWKUCnI^ARrJ$GUb~Vi>Iz#r=V>8yz8bVnoF8ulbUB5Btx&NsR zvab$27L>Q)^6z$7GBI4D;b70g>`+?n`CLfK9u(TM4rrN+Gcqu&W5gHQ>Ns+#OKMVSx^sSRL1s=W zwBqlbmYXv7i-ApwO=H+j-pB$`(w7qWPE7|zP*Ip*?Lfm8m^gY@3}GoF8Yxs5&JimCN? zoBhS_EWgjIo;N*zU40#=)|%s*eGKjs7Ef0`bMd&~!xzsdSUi$(mf`GEaqmjDcb}C! zL;3K;rxFh&k*R)UOL>dLVL9b{t|vMsAF2xaG51Iwo52RJHlggP>G2gRZ#vqA1KkZK z_o*(LEfI2U)m$F2)vFg=P0H0i;m!SV*_#6mQ`A<^S|d`@8d}z=DqFWH-Rkm2o|~;N z{Z=P!Tc1B)O z`O?CI_&Fu+_BxO_T~z0%PCz)mzMOd5L~M|(OR%Qq z#q$Y0JZ+a3E~#lK@%npn;S~G1Ju!b!hD{=;YT~BWCW|3t7W)ydxxt};(R#m%-WL1 z=_;24-7Q4>c)a>dbe}n#5?mlOUGz}#*W`%U6E)7gk|vrPv#r|iNGw-f85Fte+036$ zc1(f-Nyf-z(1^2HTgg&%d4eZ6lnSat9S?c*|SsjOgoy-RPwE8!fAeqQ4hZ;W#H zFwEYW!^K~6ZX%nb*VH45C*FEJ5=&V*=?llE2+wO=Nnw+u9C^Gh>3VFOWTSXONVSkF zDP&TXOhixbB-2+J=Lp1y(m{$lRy8PDdw zNQpBC}S_XxMk9+J^vFBihargwQ&ZOv>u9vM_cU@Ep-MO+_CUbVA?wl*7QK575gk*QV zSnRrHTc7@lD(>wsjwfykjn?Q^7C$x1Tdz6Oq(k(@5iXrybKLEIujq>`5qo>&P2}uK z(b(y;=R7XBab{J`CC@20Ry`L!xl#94;M+Gh-pHF33&!3&lfxx_`o!~lov-V4=Nxfd zqg2_IW$G6?XTi3L`R^X^KR70tb2u`q+xQBf{6gvH7n{$ouw0gTk4I=n2hY9(iZRP} z|KX}#UE?XQ9R5LWpIW8h{YTb+I^;ia*BuJ|({ul$_P=F?V*3qw*KJIilXQB;UIn{? zPqGgdsyA1d-8ky!l`UPwEPL%)Oy>)qcc;TWyjwNTn;-GrTOjf!m0h@RVqML??NXZS zHcWf=zB6c->av3GscSN~*R!sTyq_1(k#bH~$uD`*sg3g5hCb7lcZxn-SDjUP-TvMCYo5)iK5zN`PVqb2=Xa_<|4BdYKWVPlPc_&5 zTZHWzjOT0on!0GZ$lf(CL|xZwRry|g-E}YE%d$oB+Ev~c?`!{Jcg@%S)w`%Z-tG3HqWV+V8l{KrW=jbHIY>F8&X^Wilc zllDJq?Go3FTT{{bXld8tuH>%m+V>tluwq|dSg^NQT4v9+gS~wFE*oC1Jm;CGw|a+F4};C!A^i(6FVi>yF_|Iq`?WN`IDYsZ;5h z%;d-UW8;jE+nMGGef8)5(bN1zu@E6l4D01CuTqI)O$A}QBiWEW7PGJJN4eB+&vm=bNuMtMXEZ&t}VL*9bz1u z*1S)g-Tiw;%$~?8d5L8o!yd-zE9XtvXwG%RP2NyY*m@?{+;g)WY;G((?i|~;FCzVu zmG|cQ3EwPU_eR((V?P`_(N8(=%oW3gDeGQO>vO19xFXyA`)j7p&&*Zv>({Jq4s8A# zx;1^{Y_01CPZ#dD5-{Dh@WR|o_QRcdE0Q<8oILZ*E|a&*rt0n06?o<2();Mfmzh4Z z?ujyMT}YOF=#swrp3=UAj!Tb|KJfG;l;lpnSm1Z7#Kk!%|hj>&}LOmQs7?@kvadcHwa%kMwl4^7hAvBWzgrul$i1`R3^5@EIGpW_2wO z&*#YDno`QP>-OnuM;0%9_pMc}crE93Ls8N7C$x+erT=bniJmRU8qQq4mLs&b^TLUw zZgH;Zy4CLfW>iNi2yv82qy{dQjSdV8-)SY4*MI0% zV({|gJm#9d?Vgu6U7Wr7?a3ycN<G#b$NSKAUyfz}8y-?ZmAYU++tqTGTaL+hx^` z9hRq8rI)7q6pC$np)tqKCidCyO|`rBt*LP>b&h?i5_?|j!S6*AC>*^Yp3Lr&lk1b@f`O&N*hSHGHMgtA%29-L}|WxYU{1y(#Thz^<8IlDpJj+okeL zFVl>a^zNPJQe9Q5PiPyf+YfCT9sbTHBg*&<4B~8=PF9p2X;1#!eZd`@( zUbjtL!snjx-WHiXhjXz(aW>PcuMXv1p=V0s+N9nad~qpXwk?gVf5qx4$(hS^1b9{% z-*VP?ALwJ1=4&9;bwoE%CTtV;vyTsBg#BEa+eGYi*7jUWc6L!WJe%FYdW&~|-pgy< zv%Q^Pe@!c%c+KB^yN*yt`IMuFQ;QC4aXf#fBERNu$&$#&6Ic#1Dx?SAl7B7plJm%} z<2iXTtiXOP0B&0U$?6!i4fNBM)mv1JA`72b!%Bz^Z zR1jyH*m3bLSFO`#w<3YF3!WAV#49A6e8ykqljgUv>M|?#Z z(|nb9zGpVDxw~e%LOW|T7 zPkv0FB78?^Q=w{!fZs!w1V5KBp=^nb*Cap2%JZ_Q>iK%9_oVwI_e*V7WZl6u)n*pQ zvR4}p9oyp7xg7%@7fs6$a5!U$%?2mXIP@wND3ce zl6c*tc>Ux`ICxL+IPjdDeokt&#H@qT-6dWn)`fdq9&bDru*bQhQ>^gf#8tBb zM9pi%J{DBXHcdG5@P>+dP_Fcv7rKd3x4ZczwN@ zp`C4k3`6BRh6TYachCEBG>zURu$1&gGxWlqX?sOS% zfxrz0KE`~8cWiwO$8Y*_KCpYBd%&D2pZOl=9_|YM4{Hx>XTHx^qyA=ZxBKPh56=|L zz6Jhh;!SeTYW~;3JL!MdpJ)HCu}z(GW@rDWTGd-~RBHFmUp8gVl{5Qf|K9$Uc}2Kn za=PQBym#uM#>$?%`4qY2mtKG2yUIKFO?nAu!u|h?d+#>g=PjAB?IP!c$y=K1oOZup zeK7yB+>d>%_wKvxU$*y)*&nr^%bP`6N({poCH>;olsivOKgO_iy2?sz&vNz5^?xdY*gv zzQm8Gb^k4mKeB$qkLk67`!7Ax|7#QP^GQc)0pEVM##JhJAD%bN)DAMq_nVaW<@t^0 zPrps(*Uo#jTjp0+(d3f3>5AX(%?_SotuD)K{{GCr)b+J)p?qpzn0yf z7`7>I+lfI8%p4#;mW; zzus1_y7B(ia$i`N`8PM`AXvR`9&vX4F6L+K;t$w_C;j9}=lw z{h|BPpM7<+p6PE;(L151xFmMw&EQR1s<)q7>L>5nu8=zY^z)q&A)gIdm|M1;*Ou9` zZ$*Lp-fX>E?UuI{z<2Bjt5X*D#oMhZKHg{iJbCVCdY{QV`Z@ldtpn>{lUwg?9CpS%*Zj}1u${lpBi)H_ z%L2ETZj-ER=lQrTxyiRd^;+s#x9G-wk++nMC$(#|```YQQ#6P3-2&|#|Lmo=bXFM` z%Elgiz4h&_cO^5QwP!LvFu8QYU3q8Au}?g+&Mq~XpYF7c=lDaNTOHl0{CbniKg9ep zi+ADwVDroF{Bjlj1;I6jwuiZ2);_TRAY^rT`i9B+Pd#G}s_vQcyhv4V*69jc{p0Jq z)<2cXdm5GZT>FE<%EuDxpPs#Q!g}Y-?@o^t_s!yOs^@rrJz3__@(Skt9jo7Y?>JW1 zqy09s?}7N%r-etJJ@Vbg^lo$S}r_|qs)?A7^zx>VKKT~SW?UU{KZWT|coEN|4|0MYh`_Jg#y#FNp z?fZ|?-~4}u_Wsa4don*exN-T%>L|_km(xD}z9sX|VfCZ?SzBLR|JWX7TfZdtN&i;g z7vBq~ZkszjyZl4u+q?(WKZ0`)xZSd@vFkTHZ-4Bk`=|f^uk;2S?hRmmZr5@+PqSDx ztame0u=mtl%ej|T3x8b9z4|FsAxCI>gE&IRxj8$E3bhr6_dBM`(a_d;X zKhC=Bul=A@nG6p@nz@yFcgA%S|rK9~9L*VlvKa?`R5i)Z;W-mLSB*8oXnf zLMJy@+%a#iWv$<=+(h;?t>%h5zM+Y=Jtky>hRmMEbe5fK5;&EG_FRnca?+5R9eF)3 zyK_?76JhRcp(dXm^FE!#Vmd45s$b~!YbD)g`!ckql}O08p6vUia>bjkI@l@Rq;$*8 zlPfkyn+R(zj@i2M!q(`=k1{N7RXM!*yPvhm@96tFeUpK{?^metZo4IJ= z`Oy5-lI+0KQ&#ZFOEyfDk55cExF#y{Z&l!&ehc+UtYGt2ZK|N-8}x2JHT>|@q)kLsh3*-zY*eIj>J`pNMX`@nV%_BZdUq=*%k+0u;}yJMvU65Z&Ftdl)#WQI`C}{Q@7y@kv-NT1F43Ly7N37t z{lPY*^|O={|Bk-Z`$EIdT)nuxWSYgSFKiprj@ z^t)VKd930w?XRw9e9n72{qdU<_k4fU=%&gZ7dT#@IyWigfu7X|MpOBsx+B~_XNb)= z__tiAJ$_R3J=r4ppEH8xlvfGQmRKUPMzKb>NM5#3K0jGlaiZ&!%~E~(_rJd5y>tI} zuInUNUX=Cw|`_vm#^nES;_ZQbKXR*LJw9_D^N&|g;g)8>V1JA3VmFArqSRV?TT-(SId z;J8BTpItFrWvwLcAqhcDVh81k=8AfO?ba)?{qpR zu_))`qdCVe$molmYKt;hcBQ7ZWLnCHzGqywdQSyKT~@zZGH=bjjUP|$R^E7JYs8;l zE=d+gFBnafxZWKZ8!IKSR5E5|lI!`5!`1_IWvV)O_e=a zzj_@z5tzzW{>~wF!vFV=CunXBGTWl6HSapt$@;{#uC~&F-dSmm-7liTqV-(Wgn0ff zKEr#hWs?pEV*2zvn5R0>O!lZ0gLD62`xAHkGN|arPe#YH!jsa`lGPx z9Yf~cE%g(Zdp@kG7w_|b6n-#sSM0J{DZV>Kg8SH-gq{8bZ&Khp%FMZV5kWH)Jfo0i>U*=-*i z|CFu?YL)x^{KY?3P>xtzI_>;nCI$v!7P6|<%)E45)oRdbze5fpw$6>WqC^8fFxq`& zl*o9n&so#$fB&VVG3K#M(3%E+LNVcTO8J)WPgzaISa-2~J>~}xKc{=3}KYq2epecUkI?0o-4wW}cIj>WUogH7iTrEd4rm#Bq`_?3l zFPs1E6sx_stVE(GZS}1;0UJDv6Tf6^nUuxFkhEp~5tfG{bGuB|bGUB)(G^knmX+DR zBx#14jGF8Qe>rvo4I|Tw0ow&$^*l0WGs-<8zc010%b~S^Z{>tIj+cuikLEk?Z(es- zS?cZ7xx$zFKlzJ4-q>DuYvFR|UrMnNulMvUO22JT{nNcAvP(2*#h^pTc)4f!R5$f{uusfW3RJRnsp@>AuxU0kbHRc0G9RWf-zz-uoA1Y+gDuUz zB^!#^voGG@>NU++6PWBP6}@s}s8sf~h}p-Qq;9X-Sk{|+G2#U0=7&M*XB3V4PwaF_ zJD579{fKu8W6kUnPhHlXaQGxEv~SXba?f|wF8lnSXsL%Bx;oQ9ew|wA^$Bq+r6QJhck$m)0&TqdWgh@R)NVSLKtk z*ImCSd|7`Cp5FC*qNh|Yyt6%O_w=Cefv@U<{xd9fU>JzH$IC0oTPVun((o4xM zbv{oFmHLH$a(4ci5>?%FVsgs;$teeepPXBMQqX_*gWQT~CpeYX3;r~oXdWZc6Tjm| zO2yHm%NB6V<~lD}*?8i8Y>w2Q>D|8V;juYvdtN3PKQtEqEMVDwLMQBD(&o+(p*j5f z%QhBwh8%t$bB23=$wt?lN!_}~%5Dn%nA&~yK)2quDM6<@t_Vf?9r0%^ow7=OlT_dC z8Pw;K3RG%38L0x<|!#wp*le*uw#qYQw_rsFeY$Bt+=GsJqMN77nWhYc8 z6uB>0U0al_BlIe3{^10kw07mUlbP=}Uei5za$-Vtf&2F-Z1J@!cjP!r&Ka&+pQPZm zXKCEzg`1dCmS?VhcXN-W#LQ%_x$bL@tqF1tElGLFqv0_;c2=Ta~YfcAY)GVRp7^(JJQLqjw)>WVjb*yDLZ? z<@7KjD5VJTmMZx-5XMR*XzHN z^41M$g}%aOFK$2B-lds2HTaU+g^2j4UnRG$nR0piV$&P4+=;g{c>Q|s%v$%hu`eLH zaK~=Zw_3+Um6n@b5&iPLB#+B&7Sn923)}XT+_n3y%`4Wt=)eAl>EWi8({nzAnf}W9 z!(IE;PNi;({qZyL`!;P`xoq39{$sn($kfLk{A#~}?Sh>?|DJVr$~%5> z^B+RzboyGmm2G2_3kzPoG7tF~eZe+uQJ&znMJd6uRhK$fzS4TXiS52p@RnVC(x(=< zI8VL5`^cJSYu9FfnfcVNXxBs!j$cxHL%-SuzkIZ7nbqb~pH@xFn!oaX{Pis?zGkYg zHtbGYwXZBy*^PDSE2-?T>g?50g8a^R9;}XinY-$fd8Aj-+sd@9OV%7)wu&uy`An%a zjXMb$J}x0%aepVRnzHBBEv^5Xrr50CzjC3O>UpkhOZFV)4gKmJ^l93)aMJ}baY1r7 zr$_DFw(jQitdd&iUi;8>bxZHho|Vp88FcT|uc}MauYAZl{pz8F;zB*1tLq%x3k`%g z-L<+e7W3}o>MCcODY1O(3L#sUzkUl`O?i8LOaDdnD5WRwP`@MczWr7u`}_PXF3p0c9>)e9CY--(j%V97LE)%fmRLb$YA zRH0C4;?8SQ@7|b+SVtYcYn{C-DKW-2Ag$}NWW*(+l?Y+w@O$y4bq#n?TmI zg)0&dbp(`X^11j*|I*%KDbjOAn)mg}o6{Wo0=Ae*IM3Ztp)#pd&^z5t;}!q6M^dsX z){A;~$gyVbJd~;`l6z06i*@moR!74v*Ld~PR}^SmH!?Rbt@b!&G~M$~!XQz~6eZpa#33;hzP&Z|{*_JN50IltQmvk&xpS6!KK z^Pzc}Ec>!G7t2c${gm6ZxZ2J0``D8IJ>Uy@Y~(n1qx_A8Xoa@mq&wjeUkV>w(*4Q9 zbvd>Atj6&u*8fS1J#H5@uP;mw*V&L<5PaD9$jhK*_b*4he6x*p|E=E5>Mf3|c=HZq znMia@=-<5PWU+>E)_je~i&H8Ex1R0(crhTo+3Z#Ns~R`5J(dh#uDA#cBH z%#=0rd$&C->^Oew1Iv;0n;%?`JkE)5wz1o3|0YLT&(-E&+i3yu+aD^9BR2XB%K?f@azMtZPUfpyALYT&3EuW?O4C{M_Bjw zh?-?bw@2Se{utLiKe=$vMd_MtN6RB>rXBnonfd8Y>N}O+?#Vp=Mduxz^WETiPSvGD z@ow{;E8eKE|M6bc_k+F1Tn(N#h6M@il6%)ggdS`B$j3Ho_Q%B=Y?d||Nrf!Eu%dve za8XlIh{j>A(?QWclvlh_sp*PHsM{L&)pYeMpEX|o`MZ7xT5Nx+p`&Nbw7Sn}?d}g8 zZzO`I_&U9*J&`DXfa6-)qC4)13#Di8Q&@V} zCWlo-wB=C)k1F#f!@2JIKGT{?!@4Km*}3!h9R5SDV)3V+A4_cc&A4NQ!%F9EVv+L6 ztUGtIv)_{qvX?q6|HG!>!_Nt)S35k9(|E$2D6{NzrK*7$dtbD#sN(X#i7WJqDgs)) zW}Y$=nah1XdJ*@Wbxl}b3c*nmI%+M=g5buwM2x|Yc{=7({W@3UZv{jIQgj!Hlk^_BZs`hUrs39V;slJi>o)0Wj& zfxWj%ByFn=S8>#*G?`YZIhnog52D=@Pd+{w`@ooO`8S<_7p7NVojH2VYU7>vy4MUKO-;{IRhb4R-=j2IEy6GSKYf7V?SwO|%1DX?!L|%12 z2#RmY`6{XrRL`D#ML1yDKSr??>I=CppT2Va;{N9c<#i?>yAd{9S-@|mXx2W(KknWY zO{S`w3+H~`Hbu5|X+~7Jmu%&k6~(949F{vI#rNc>$+hE(hv%CA<=C?8v|LNvsY-^b zzQZ>xo?Mz$`p@oF?fgThxLj`^76?hWf8cgoy;4%XeTEI6)0yq7Lc1(v9?L~;;XgJ_ zRBBx%hu%r?8n#V;r)_XQmN+HU%hmbkt~>0zxi;$dYuQA}ybAR9luYGWd1!!&&?f=8Ucf$X{gg@+mczzmxGOlp0RK9gXvKALEL{FGV0&QV>SCs!4onm(9f-yl<| z+cV+1qg~&_j4wYdDs88nkWQGiM{wC`<_!+_c)FkJ2B_yZmwqbCm|E@-aE~|osqKx` zr5`rkTzw{bWB6f48GEfy9G6e|PL*VpOTSZCS=aV%&cnb`b=4=wB*SyRczAX78r#fT zch50<*_5&Pejoa0 z)rK1VBKcQqmbps(OnXw-eLeZTyJCFv=Pj&1qjH{WK6yQ{ed7CLf6nhzzr6PJ9?xA0 z^;I%20z%7Wt{ML}inQ-3dF@xaSZ{66LK%sQK+8Gn4!vwr|0jEJ;lZ-RU)j5sb?>@z zOLdo;*(JLYj^lGKiD>U?`#rPhzzM~hu~%F+Z8QBpZ`)V1Tx;Ll41d;NCj&ws7QUPr zVeeeNa6!n0&|TU4t6KYR=FZcJDlA=?&g&N>WH^0MtwDeFrpFZtMk&9JJeZZ3lJe@N zw6Nswm0|H_mp6Z1)6A@Ypeo#=f6&x|7XUnY1M{%N@MT1cy|fp zx+iAuuL-rxiMV!}*ZKF;&CANTWu@16l=ev3FOu5T7I-EsSmCjIVR*94ZiW{b7cxGk zb?0w7bz4VfYlVJc?2f|kHwqYJcKSt~?tOML|AzG8yPVnIW(wWx)X{P;w`Wnj+p4m0 z!mFrv%Upgn{E**V-mJAG)%wqY8^u1e!=ufnWo=|ngjQ}pY!^w`MUL==2DqxmT~^!yfv4d`pvB7FiJc(W;<-! z{W7vjtyOOSg%!qTJN*_pZTfQ3B7S1ooGFFJ9*Shd8$Z%*xc@ZF=WctvcHR1j$6Mv? zql`1J-|YHSqItK?swnfjqfh&lyeDzlG4qeDXaAUzT~q#OJM+h>Cm-KApXVpJNB8fW zQ&%3oOWz&5Y1`M$0k2kk-yEtL*?4Ep-!)pMmn{PO!zUQG|tEkEV>S!?Qn&HM+GtofEq$+w%rAtxNZ zbc(*!6btr+rhg4gkDmBeCoy-@)}8W3hT8dDe!N|E(`HLKd}~!Q{;ANx-JUIPk@nV3`JD7N z?TJ=!t|)r6!Ycf{oyCV>+vWC#wu(JoPkQd$-I4pn@?uX|vbardzRw(~6MDAAi`h@w zoiO4PjVOO$`9{KgyQOJr? ztKg&9iO1Or^Vhd>*2wxilYXFikL!4)^`1k{AGF>#_*bacoJ!Vd&QI5?vy(ntzG>qh zC$rx8BWa)Pwzb5cnfB@Q4XrxM+Xwa^-u3hQ4c0$e-+1eEcQ?IHzWzb_M(G~~>m&Jz z<)5N&CjT+}#pxZB(5$nso@{^Q-gExV{yz;}KO7gCYQHe$<9u!9ANo@| z|5z@aV!z(!vA)*kANf;D|A?kCFLR!8{a}2s(x1|&)qkcGi7v~3lCQbt+}%_50q>s4 zYxaNMuWkQyzNSA{fFIYoJ*pv3ofm4#b58%XQR3Wr(VsPYEhfJgWv$t-@rd13a(}eX zqwifS|HK*wr*ss%ESsV3b%g1mnB7K+|5-c}w{-13YW6YtqNbeq^KNxl7aQfOBb*nt{kpi1#2=CSIB!S5t|P8S(QhU$ zKEk@mp(eObbowc;kGYoOm%ERYr}pk}GwaSy?S3&`zf1b5bkhDm-4-hLqV`kfcUxca zDO^5F^Oj~lE)ZC3e-+Xsqws$Wrkv_ndGf7tf!=~wbQr(ZpNg!3y~VbEUB zIYIA5^H+TDF2ACFboZ<1N5WroKQ4VH^8d=6B!}p(J$xUzIB#jK%vinDncH*uHs5C% zyPq25u9sQ)^(52V*_%9e`^;M!tA0HD?F z+EwOMwZ;6YvZX&1!DiNJC$IKd7A-!kZ*CcO;%uMkrn?(G+hm@f=5r5uSMX+%wQTj1xZ_(tz3zKm z+5LFIo+EhR=d3U>$|}0 zz12SKpQl%RUy!=_Ol-&ZSr$_S@;jXkKYsqeH1pS@;0SScyDQt+Hx=mdF|*6_J^tyT z@ig7R(q4GkC#D$(-4Ey3u|4~=`M~Mphm-6W|I{e0d0?55{=Gi$x!mbzrbl zw&_pT*)nO*I^ET==;|YfXL_ zmCE%+oBP3nAlAaAQhCQev5U(8(q&WEwV%V{d49=;@)xq)Q_HJdWYQ$l)B9Dn$*rH0 zb&*jbGA?Y1_r{MLUoP&R)@AL#ZDMNLi&uY?V(;`!SK4HC$Nq!G$NZ2}H6kxe?j1G= zoL<2eeEM@}6IA!PQ6NxY8C8xRdE##F=)$)?MlXXCNS(RbRiu+8{t2CdioZh@H zj#K!``@`W>dz0cmTiq_?cv?i{g~d$+6NstuF=vw{Y` ztE_#6H;OSZWa=Ofe0QPku2;e_@Qu2OY_26|Mab2w&+k;HKT9=gOiZ{j>A(h#lPrgn zdU80uc?38)Ra;_DrlfhWO`2&i(?P&x%ayJFwmx9fW7&92)zy_lLoeiZ)X}aRS@plO zbJs>^XRj^YK55?PXJ^lFyX^b_`bqWkJH_vI{=WI{EcbHxdM=foqeYxwk{fth-Yk-D zzU*_0v!wRSgJ`xhuU}nyAjr#?^>5s{5`Pm=R zdGB3(P|Is~;eo!?pV;PplOOGD^4T9++2XT4Ol6DD{?NXJz+vW#F)@Rz@md)S{FE~1tXW#jRcG}WfJV={&TKCSIFt+U< zdCH7$9Dedvr-=P~k^1Cv!yBhFf z(SoVjxdpcxC3)WP7)hoa+|Bofb$?kxe#NOqzltl3wL4n7EB|IH$S@q2wV0sIW|(jA z=T4*L2XppkMYk0{s5Ga`T8Qi`UC_=h#nx|KpmSZ!NaFZk-zOK(r5kYeSr!=CJamx1 zel8(^<-Fwv3A>U9IX{*%KmRa6^+OM{_rr9)Io{q!D{X$%SUfslWYII>?MnWwznT|1 z?6`RU0cYFmLm$)n>vL^HKCf{*aFN4Ef4@t6D#zbXpH5%@Y5wcD=?~@7$EzM~ELf7a zD{iNV!%h-e(v086c|74#p*Y6YG3C5 zdOr25g6Ujq?~*LlHQ%kY&Z~q)?$#6O@IP-qyY<0a#|>-Pr``KIMXu%l{Kq>!pPOg? z{`ib}Kkn}p6s{8KKlbX_&)I((e_hxSu|n_4Et9;$my05{=snB-vuETaRIT1p+ zIb7x!GCG5!LX#5y{@5bf*jAt-qrYtLyhM>-XFjsqZvA)QS44-JWEYDQN9|1U72l8l zVGP^g(7b=AO_w(cPHe@zoGMQx!Y;)g68_-scHDNW zqW_Ym3lGNMb|_kM|EBYpjjrIVnq-Sd{q0RBO?h;3`F_lHnit}` zd3oghV3z94Y=tW#{FiwuR$NoFs>*h^!k=|w}Vs3s> zcdDP^(Hk%FIoLCw_HJD$@s@vX*J2$Z&ZAxxO^WxP8On^waZ3^GxUYCzUQ0WtJSMZ)Mw~^EI7R5=f7vaEKUpE z-)V5?&WrxZ`<8y&tiN&A%BkyE6>FKD(hFz*SrX3CJo(NNxg(1`pDz5oX2qTjCBCjt zAGK~i?a40`Qd;@*jpfs&o>iWzbH7~*TJ?Tz*cYdH+D*BIFCVp>y19Ch?nZ}gyHnNc2@7Iy;Z^@#mBFq3%vAn@#;|8dfT~eC}KKwME%i zw`2{ouc_5(VQ$l3hu1j1d*xBJ-e>O9kn-Tu#=Smkv=SY%CO*y2=wN%Mvdq_1te!cu zw{P~V%%frT!NDHe&FgiZ-IwVw%T=@fbbPT+u($fId1b0gCzdS^Ii*`AeI(`+<5`o# zC0`E}sQ8AM1v6z`ZJz-r&t`hg8(mgiZm8aFD%oor5 z5^B!0ij&>*dG14x1q)l}daKR#wz(#hAiVr7uXI}2sjy>3XT{ar-pn@Zob;q6^Zccl z#jf*B+I_e6Ep1y?$!R@Xx_6?~k{IsX2Qwcom0o?S!0m5!pW@wAbMxcQy(fQ`Z4a{& zeP;GDecHjJ&yM^&$rg4fj^*^3-HEDhv2)BWToSl@BXRPDEt%f7IaZQjDijUW6Ear{5MUG)(2Lt$avj(^iTr@8EBT)!+s`r`W8 z8P*s7r!O+@__w$7T7rU~!PoSq*+J9n_FflbEo(kA2bMD}I7&XJ&Ap41DJM zbf3vF?+c!$`xl$m&CjY>d-GFZL|gx%pkJ$AL_5WQHPnbIWbu-3z11A>TB?>uZGAzW z6;rXb;=UfsN~`1fkDk1q6D53nbup8gU*kE>Sr*A9esepG{hpi5uy|bRH@VZ;@i~ui zq1vlCX~NHI=3Y*EB{^*OQCT0hqpu_tZ2 zyl?&Mw_h$S_DF5iYYhw9uM@PlZppNpOR5gP6tkH1uHKmQ{PX3k`)n_%WLPOpzcS+r z&-xEm>8JfV&P;H9yW>tZ2h*yygdce~yjEBqe9 ze&T~xe!%pT_iYo4#KisKv~X@{OotbKLTYUZ7JwadQ;KR0`| zuJ6Rwo2%5)(@V?TUrDTQepq6V->7zvZTAm`O-I@dBL2vJI&$2=wT9{Fqxb+NyH>7` zmTN@foqB(m{|ShC;Fj4OYs5XbNaNe&!-X4UI(J^`KAg(eSRt_MmPPDlqGleQT7`e-i6I`+I5Q<dOJMoR^p^IsC)# z*Ae#ldkdaV+q*JUD(J6|dzHwm?+$I(O($&oA>pH*UzS*D&7=1slU-cz_dB~?acY+> zI8Jj}C7urK2;J6PJM+3}N0o1`1;4SvL64X3QgbiF%e%?9>U8g#FtvY9wQKUXqVT`} zXYXs>`TqT_b|#~P)BcwUuev;Y!i|ZC7GxR=eQhoO6j1BK{i1T=^q1VSPDT9}JmXo- z53V&}U4Oi`g5SsR%NGV|Dc2_tMYg&>&sul(?i9m^ChoQVh;zTfR%=*DBo$@wv@8rItM5w-w`KIg_u18U)5N2Vdn+WV?EO zrS!tUw=H6&+%c>2nzgUY%RBvU@|WM!8lQZXW%!i%`A^tP9*ei#KfQmwFMj&H%U>r|>RmKG7I9hEt)o!d;Y5OTsgk|#bayn-nT7NOPFNizS*vOqiitWMLU*{DaCn@NjRVL zb1hq)U2j}1k4_3XoWAh$_2zlLzqTYBWV5C+i~DZg{y07Ti1wa46=&tWpJuwj&Htx-tTXpQ>Nx=E&dU6=GOVZ`U!sp zOx~`Uw(m^Yhl-h5CFx@Cmee?^OYtPRtL-u_y;&QZzvMDY4A<2^_DTg@++Tzxr%0s) zWnGXC;}Bl`E5x0TR2fE@bbMSC=p!m<=7vTC4&J1h9ofecr_X=M0#f%6kh}d)m#u{cKN*692-9yOJzD zH)fP<%{8~!qc?rt+EZJ?s?J1NZswiyQg7+`N88>UGZzvT4!-o+DLP4Shqa;p+-H@Q zOZyKyTmIZzCgCD3ynUH8_gR;pId3myv;W^cVN*|S?E780)d$>NcP;v0)BaNOL{L&e zv)8Ls!`Q4zDi1|hwdL)!%i4Qn?ZsEktF_)QGMKse_rcp5l?yk{S$<^p%DF2Dx z#~u5rcFHH_GZX5M{`-_~;qgzlxI<3Y{-EKf;5jPx%d5{$kI>qG$mpl3-o*PC<}Txw zo_b)$q#KKJcEqMW;(L1Fb*R`qpD($mI?J`ix2@jyW5TO;_Nxpw>)0OahnU&gglitzLUphjsH`k^1N# zs%#g^_;D?lSHRax>#og|5lXVJxOXDDf3kB@bM7ZG88zwUN9zA3a(qs9aj2j8;nLD- z=KV4g*GDPpPUYS^<^Gi=>jbJ5mn+PjwyAU8^5-_n!jeaJsq2WoDR~m{P3?8xp+(6C z)kkkAZ+P%9WKtB*-pr)=&91eKk*~Z9R<2KI_$5_z#r#3wa>esa0U3b?SCd+Iit(P( zEsMx`$*Qfhcj385Z=PlRKAgPLU99_`ozVeru5!-vjkVXTY$vQgz0Plc*_TUScQhZ7 zZ~9kYzmfgIG8LMQP6OP3ef(yV(tXnx9_yI&*EMRI@bv*pP?UlGz6 zJH_EHliv;A+J|Kl4iyq_T0bw~J=b1aqP%P35%xoikNy48ePnUh3ZvckucoVB|F!MA z_cAuI!xxuN-Y$8QbFpY`!+opL=A&VUgn4W(9(XQYF{x2q`bPQ#ZXTPX2ZDKhtoik& zIv;u}8`@;5wDn~7{#xL;ercI*i*n22&f`KolAX%ek9X!NoH1H2(W&yea!q)Qq^#ar z<=Z!%BxPB-Q#B_|`Ic+s?)fzA+{fPu3=3EOJ~%TwyL7eG^B)Q)r|!BMxFclxg6KmD zPTAj`<6{rKv%$`(v>aKRo%qeHmFCV?>@uGT1-Hqb1j&;_%^-kZt z`S8q(f?L*eB4z#DkMGQTb@SZE+zp)x8#Hvq-so+UURAVat?ixF$Jw)e)^eTCnfm+g z+M=?u9dBfpr7xQMhp#QXS$KVGT?I4GVflj@cUXl#sLkj!U(8&doWDzCa`R!u9}HD5 zf^3-hA5_$^bbk~$r@n_lezEtr$0ZBvgrqsmA8xK-K6$tQd?Ne21MMGFZ90~}(E1x~ z)0O}D{m0lE?)!)HKQKQ$wm;z755?35`A)7sE;ao7U!+}Xp0ra~PNn$4^plEHnhQ_u zY23Wb>GU>RgM&E=mAM8wwQj3Uygrj$)Vz;h`bXBe%88$E=T3d|cG_>9og!~FOP4p> zpPzkN^QT*1^vhsB56RH`6IbQmz5TW5T%JMdr@KYV{^VH(TT8zQ_!~Ck{6~XBku8Ti zHkD|fDUHrldARv$QCrA@^xRu2&##&7`n}7P>*uv2E*;q`ALjTK-_ELG`Bt(wZP(v; zPPtph$^>571-z=;u$ukFvHOnO|IT+>XvMJk%3*_eTdt|E1auZ=>L~9CvgND$D#CKL zuw%u1$L=b&Z9=uHtN8N5&pR)-Vm!`izuNE6=T{!OCDG~fF>`fZ_Al@}6r{YmbbWs6^7As;277Irzn*?G|HR>a&Vnyucd_kful!(F z>3q&b?Xd8%34xOyD;OA?rmW*z^QPwdQ?{GejpxpA$;)EfdAHray-D$x^F?8k50_0k zAB!;6x&6Fs{G@FD(u5xpol^y-O8ilhn#C^fC#Y_{J*}?1Fuk}CXEUC3}Ri4{Y_d%<-uxZuvL)^zWc@{_U^-CU4IM>yr98mU*vF7&M7tfaV ze5gn=F9`e|&NXLI`=ulO-)G2QH+Ozi_*cxsX5IZnl^*uqmWhQ670oX%_*wY(_=Jil z7F?ajOY16j9GP%C>BPs!zwX-FO!oe3xJ)>#bi>_iB^9xUZ(guS*j4oPN=gf#?XlIt zg8O?V_?1hSwNI3JJbRIK_vI%#b5`$m4Xu?iZoc!{@2>9Ccj>>+UAmtrEN<|;BPMpv zd!Cd3G}!%0?{ePve*IK+ig-f|oAr~d9nR|-Yd4AAO6922di_vvr(E9&4jawKAJ*LQ z`S~{NheKX_|5MQwPxv*K@9nzt*wi8@uATK$l}-G+Bbr6x=O&pacJ7fCKVj|jTs^9SjitFBhJ9!t%Yx_U5mh2yGoF2P-0$sDrC`lZSZY> znN*SgyvFT&4PtV*-)`D{XV)X6wY#ToyTNqSWr^-Ik;7q=FJ(zg6J#q-KN**$D7E(B zmaSJMe0z?paFttS=GNKNoB1p2k^BYq`8D5ey1%wGeyo&rBW3@6%jdu6o}N>@FaF=3 zmv$jGeT@u!tRGw$Y8h=L+nSacWPR|EkSaU5(fY`7xrwt}vnD35U-8?e>%_%Xi@5{m zHkZEeP+X_nTPC~LV#Q;FTO~4rFExa$`Z}v(mekoSbMXDPXFGRCB zKAt*VS6B6@CWlXtPeJ1wnR6mqN7s~In&z?a%%b3Vn@^R6Ii6)bCu`L0T5K2{5%J_! z+L}3`X<-M-Htp=1a{bGD|GR0Ybf%pOi*q!{kNdVc@SYYI+vjbMXNN35H0Orj`~?ad zFPAR*Ww_NRpRq&yo2CH=jdu&fLB(g_Pps!kr@v}y{za&nDH zQk^R2I+s))sf!so!UxxSd{T1!F1Vn2o%`~{ z@)um(&S8A*^7k9QF>wPx8~M(-;ucxyvM`; z^Cz3;Fsoh>+wQ|9Y{xTs{(g};cZtPl%0ZR6hed4pC!bsFB)-8#ys$OyNN5%3b&F%| zQ;w#mJoK)Tynj*W-6feiHEI3~x&4>4fAoI(F<0h~BWvB><~e^ON=;&Ik}4Hv8_lwg z`@U%P9h2?x8%^{2w&X|F?l5hdn3d0N6FmQ!v{AyUp?;`=W;>l`{&Yk&!saKn_u({zu=m` zxPM(z$GV3qvBxE=+N-OC#b4T%6nYpAG57}pjO)z{l#+MqUay99_LITcfomEV&S{X2rq<4ObR%oaonDwlwyTs*c+3*J;d&S#wuj zl9ZiWSaV@x?TW(-jQae)GF~|M;lbkimi2x8|CrZ4e-`d&q&B(u{k+dRpI^6~{P*$4 z{OW?m!j+QKQ@)&hG5up#Pk1WN35h9&D#nSnQ4fGW? z6CIhRZ_rRwP4sNiON?}KYf?NoB|+1oZ${Gu0ml-~LPwi2?Tllex%?h3Y7(wE=-qG2 zCG~NUfWBtNq0>x#+7_BeIKTWdXg%$;=jmaYdtV;1xz+CI6qGmF^X~BPinHzfANu&W zIc#!zQgF0gl;`(`E^~=JT~WUbT)2Km_{`lSn6X zy|=2y{l|uH1{O1-W1g5j6kqjd+1#$oY13jJ8NL$Vs%2(rlQ>&5`t+BskkxY*%FI60 z`HHPv#p!sA>=n^#uCv$KG(Vq|_rlL!)FMT%psh{t@WX8jmxkuuUZ!gmVZTbcMrZoW z=ij!N%~#V1__BWXM$V#l0UU8BUVLeJ)^WLnlP!K}H@EoopmT|B$Ak=%Qe>^Cm%O;Q zndj7$nVTp7*`zn8ec3f0_tWB!SMS)(8q^>La_X5NxHs;hJtzntQ| z;+6%ksI)_!|G)EF4Cky()4g|PU(xCxD`MEs&Y!tBDqHuW$E(^z-^(kNMW5}_Xjyp9 zaQ%mxox+=vr)|H~HSOHTkFIkLX8t-XEH6Ie$9^SCU;pJ9savkOl`pVc!h1M$(!8c3 z#<(ShVJ@-CD;#AR%jFeKb~hU@zPOh?U{UqfYqnSZH*L7TzjsBo_}X{-bjx(5UdeU0 zW#yF}&z4iPxV^LcvvtPD>-mr0m{~pATH^5HuihoLY>(H|TUV$GiX3{cIq7!C9N}-z zAI)Q1>CQE2m#*IK>OIjOEPEJF?&`M^oFgbPh526hZVU17Z5Kj5#HsJmUOJ=e##V1> z|9@KS->06fTPl=$_cYVJ1$(xCObPz6^uk4>cWQfrFSu((R-JynDEdKi>V`&#tOf=Z zp^|0A^4G&3_KC^9GhZe8*tos-UFmdfk-N7m{`_^Wa^1E`P3*|#)>4MXLssp{OSSj( zn@y5DvB4w#@@ie~srSs*Ml8PH-toX}*9XD2LUzs?pC__P@0I%fPyVvBJ1G8xC;pN4 zuX~5D-#B9aL-78i@ThwA_w|$h=Gz>w|Iuff*lTn%;p~l+zgy%F@aG6b>p1?l{BtDl zLHe}ie|6VvD%A;YdoQYX@h5oOvS8;Wp%xYfhPUka8dJDVE_6xF&4-j{t>K&%A>pF` z^2P2w`FO%eQL{D4`KH?BM!}a{twM(`C8#MVNN}`Hf0Als5S@Onh2^N|>d@P}w%iI^ z6PCL;G|Is!lk?g&){UWSvhRj(iQ2ku>$a@d_4m%G7@rhL-)H&#&gQ$t?<~Kc+1tOj z;#1<3q=~bh9%_%Zcyq`-=EolH_|k_x-2FR0l#1_rcqo#0|J4su+U{rm*xR<;^pE3V zdDB0hhmEEFt$C;~^>5X~e5rry9?DD2yZXVO_k8A$>21$V_bhmLU+UlDhx?`Cu1vWU z(z(pbG<4a@BH7@J%NGYZOl`3F+)9}v7wd8hAB(nlA&;QX-rS8)ibUFGWU?|<3^uD3bvSM#vWJPmD zLBIj&(wHXm&Zp+xAEH_Igzl-DozU*`?J#Dx9%MTy;-TIr6al6-#?VabhpZwCyWVht8=#JR1-OdN*viUs{W_l-D zu)pCvr-a!DUmnQ{rul{+bZf31*#2=tC~6}(byp0 zb*KM>A+!B4ciulN^5!3c8SM|N^Zt=3m;Ax{&g_Ht!oOZE^|}w{?D!~clcn*XW#O_1 zr`s-laCP3v5;9?RiHzx$keZ_bY;!{{vxGbfZd-L|Id5pMpz~FZv%T!Rq20fEOl32j zuNEqX>i2N7oH@YUwo70+kE!r-ktyo}Zf#i9c*7=X-m$ROD*xo$ahvadnf*Jr-diVY z_QDlYBi04XPHs7yapAs@*<{b4<>CS6WpB6cdh7W_w@gWdSFe29jb#DPGj&hR4ei-y zb@le^HR~&*ehSvESHFMQ!$xfDqHmv$CAqYEcXRb$zNYSEyZWqxvhOXV?e@-J7e(5J`^2~VKH`S!yXV+~AwTVl6 zQWMv?)95^(+?tY4Dgz2^9%nURYFcB-YRN-r|pt(bJ{Zmr5E4#~BF zY8NaO!-5vB>Q!H1EBbPiQ1ns9)>$8~Y#qo zLagLc(Y9^-GA5*)(LEKBT)MQWNW&>neRh>Y(}qdirDklopKrC9hN&zw2vt$ucyyDR z?A;vJ;6&q#4$_?3GkK0KI=y0->NKyC=+{m{^QYZ3og{5lUR9^Do;Ha%9DKJ8GFfZ}oq zkvlV&9Dkg6`kT4+VF|u^TgSep}rcSdERl! zZ#L~nHJz+wet+JDt}2_b3qQM4jOM(5`{dus0>^cKqJN!nDOO74ORGxI`*x_=aN?}V zYiE5ZpEkKzBb$BK+8t*fg{_!(LzCNMX4H9Co0Xnor}&JTJPukV*LE+zwQ$*+fE(}s zOno9&ye;Rz{5$@O|M9*S^1C?Ib%y1%fNk%6^vm{%>S?*u zD~08)FGd-aZ)(}2JB7#ccVzD5ZD)Cw>rC@B$=G-y>&>0A{NATR&o>>vuySQZe`a)~ zd(6z4KNfxMp4q$i$hYW)3G;0Y+IT;$+C5=X};A5WgqD7Q+# zGG}8`)t*+NzM?YT`$Bt|lctrk^xg|R^ID>@UgCDAp2DwFiEFIXc2%@o=rua@wIz4Y zS+NkUHxa+P`SlseNYo!BW=lfk!=q514n&;uE)5jEVp;q1P>9HodmGBYJh7V9d^B3EfH~#`sR<8R^HS<}dTv zp{f*~;C=pP)Lda5dEq6eq~fm{G%;1l_D22M*KsLY-BWzS_LQ6Vgfl)a+t~9sD?KFh zjokf%%r*QByB{1Xt?_>I>~lK*d||acFAi~)B%4+h=;{Pj{p3xO|5ae?WYMyB$HdLE z1&^)mc)+p9qEEt2;JBujO&81L`A?J&Jgc=oy1Ldr?!W@AgN$)c_&=T7*W6jp$)9?; zZbIdx7_L_U7Y6D zzhJfOmg=OF_D75AXFdJLGu_TzEZ!<|xAbP|n=Z4nFYhorP+05!JM)ax(WA2a*b{pn z7@2n`sBX_qm5OD&f06T8{_@S`pIU1qdUtfM`L)r)Kdtxu()8PzKTOLP+>Mpfh_!54 z`tzB0W>uM#_8nChmuZv37MDj^{)94qOIXiwYHI5T|^|~$Ked%<|6I&X>J*q7% zpP4lKg*}_IrhocozlSC>jB_meKi{mMmj73M#<9&A&y7pDU*5ivWu>`!w*E!in&!48 zA5Z+&mp-oC(^Sh?eT4mAnBlbSOD|-O@?5+6s9}Pe;pW5UP2QI?#L~~0SoI|vZ_IW6 z&~>DY?efgxEy*0ElRJ;k5s7cpE}Ur0c5G3^NfsvOKX={Va7aJ@8_~eNLBd_r+@<&N z4leZzJ&Ds!37EP|+;#4Gqq2Bcdzt+5JkEV>`WCLs9u!8c`CSj{Ebc8`vV)J4fuUaz zU&~4X$1oMBWu;=M2fj`yH{i4vv!lS8li6p}l9Os0HIynkn)>F6IwrL^d`NIPKY7W` zo;T;(?w)+T*+x_D55s>Cm%=ogioylUyI-x#TJin;b@L~MEx!D#<*wPR`JJHg^Ta{! zfP+B|Y^QjBK09dZyzu76-0e4OMS>3=^(me;>Czv^Rf$H~(KTu2UeAL(YZFD*rg-o; zx@&qxPds6CN+K(E<%=|-@0xps|DMnZ$-5mcqJI3^^n>qJCzm)}ztneXZ|f!HOGOE9 zGW1Ljf7}0DzddP;0RXP>C* z%n(ICA0?h|Pkm4iixFSgW4}fN$Dt#+{@!_q0(fMc zJy`x8Xp3p!)p;PhV71nwAQcz!4N1>!)(Eh0R(Y8VlX5qcvya(7 zU!T9l@TkIp;D+=j^FDRK#1$KEd}g1`{Cs6(sNU(z)1~(+wmkk}C+}ummZM#`Q7yc6 zwrO;gglM$l7x75F)4yhPL>Cub@XQara_&_0HIsc;KVR>dia<#=9dHo=-og{Oc6jl{$Ayc(~m{Rwv{i#Cw=?3Dv%>uLR%=T!Tjp|J5t}o~w+_r{ceVNO;fjN3 zD&y{Lo3tNXk2|YMqwmsn zrmMduUNQ2Sdhbe9-L5Vv8zbK@vo_leF%=x^qbj_hJQCV9Q^lye58fI>1y(WB@^T|q{{*VQs z?sMm}{f`Vycqu>2bNb!O3mw*7&;Qz1yz$)j=XW1WNIzT5oU-rl1o8GciF5xu?Kz*( zJpcKG=YPCY{#<1&s!MIqtWRY4ZvB~wzf*NpL;0H=rS|U{3EZy7m_*O?%w07nbE574 zCN=RHTJn4TR6U)b%FKR*HP0wWXY+jxuGDS2=Rdp^|G>iBH1|>Q9qH_AJ322;sXO$` zVrB}D-o(FU&b!U8h#kKbnw4Ahao4t@?t=Co9XSiXfV+n-jeNNW7#SFTF@Z7?BNG<` z_S@Gu8PEaJEpm)ZA`Bw%d*qNWd;{GhhtLSRXa%kf=~lS_Z`>AxE`~#xFaw%e@#z3v z6o=5U3#tQpyBj`@po`-W8Xu!-gkB2=(vR%fYNUIhKnDmS^b0dWZnT414AqbKS~+yX zkuM7Z_0SQ9=dofn9O+^ybhD7J!U2_w2(y;4V>c@p+hs%O#v)&g0E%9Ou_Bz6yxq@1F*n<$c^#W=iBD`FfiQ6n#YZ2XL$n`vG&VHMP%`_afIl8gPH3O)TfN-Q> c4qjvNH5mfDS=m4ai86>XB(pIvnB{?Z07GXjNdN!< literal 0 HcmV?d00001 diff --git a/src/java/org/apache/bcel/Constants.java b/src/java/org/apache/bcel/Constants.java new file mode 100644 index 00000000..cab86336 --- /dev/null +++ b/src/java/org/apache/bcel/Constants.java @@ -0,0 +1,768 @@ +package org.apache.bcel; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Constants for the project, mostly defined in the JVM specification. + * + * @version $Id$ + * @author M. Dahm + */ +public interface Constants { + /** Major and minor version of the code. + */ + public final static short MAJOR_1_1 = 45; + public final static short MINOR_1_1 = 3; + public final static short MAJOR_1_2 = 46; + public final static short MINOR_1_2 = 0; + public final static short MAJOR_1_3 = 47; + public final static short MINOR_1_3 = 0; + public final static short MAJOR = MAJOR_1_1; // Defaults + public final static short MINOR = MINOR_1_1; + + /** Maximum value for an unsigned short. + */ + public final static int MAX_SHORT = 65535; // 2^16 - 1 + + /** Maximum value for an unsigned byte. + */ + public final static int MAX_BYTE = 255; // 2^8 - 1 + + /** Access flags for classes, fields and methods. + */ + public final static short ACC_PUBLIC = 0x0001; + public final static short ACC_PRIVATE = 0x0002; + public final static short ACC_PROTECTED = 0x0004; + public final static short ACC_STATIC = 0x0008; + + public final static short ACC_FINAL = 0x0010; + public final static short ACC_SYNCHRONIZED = 0x0020; + public final static short ACC_VOLATILE = 0x0040; + public final static short ACC_TRANSIENT = 0x0080; + + public final static short ACC_NATIVE = 0x0100; + public final static short ACC_INTERFACE = 0x0200; + public final static short ACC_ABSTRACT = 0x0400; + public final static short ACC_STRICT = 0x0800; + + // Applies to classes compiled by new compilers only + public final static short ACC_SUPER = 0x0020; + + public final static short MAX_ACC_FLAG = ACC_ABSTRACT; + + public final static String[] ACCESS_NAMES = { + "public", "private", "protected", "static", "final", "synchronized", + "volatile", "transient", "native", "interface", "abstract" + }; + + /** Tags in constant pool to denote type of constant. + */ + public final static byte CONSTANT_Utf8 = 1; + public final static byte CONSTANT_Integer = 3; + public final static byte CONSTANT_Float = 4; + public final static byte CONSTANT_Long = 5; + public final static byte CONSTANT_Double = 6; + public final static byte CONSTANT_Class = 7; + public final static byte CONSTANT_Fieldref = 9; + public final static byte CONSTANT_String = 8; + public final static byte CONSTANT_Methodref = 10; + public final static byte CONSTANT_InterfaceMethodref = 11; + public final static byte CONSTANT_NameAndType = 12; + + public final static String[] CONSTANT_NAMES = { + "", "CONSTANT_Utf8", "", "CONSTANT_Integer", + "CONSTANT_Float", "CONSTANT_Long", "CONSTANT_Double", + "CONSTANT_Class", "CONSTANT_String", "CONSTANT_Fieldref", + "CONSTANT_Methodref", "CONSTANT_InterfaceMethodref", + "CONSTANT_NameAndType" }; + + /** The name of the static initializer, also called "class + * initialization method" or "interface initialization + * method". This is "<clinit>". + */ + public final static String STATIC_INITIALIZER_NAME = ""; + + /** The name of every constructor method in a class, also called + * "instance initialization method". This is "<init>". + */ + public final static String CONSTRUCTOR_NAME = ""; + + /** The names of the interfaces implemented by arrays */ + public final static String[] INTERFACES_IMPLEMENTED_BY_ARRAYS = {"java.lang.Cloneable", "java.io.Serializable"}; + + /** + * Limitations of the Java Virtual Machine. + * See The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. + */ + public static final int MAX_CP_ENTRIES = 65535; + public static final int MAX_CODE_SIZE = 65536; //bytes + + /** Java VM opcodes. + */ + public static final short NOP = 0; + public static final short ACONST_NULL = 1; + public static final short ICONST_M1 = 2; + public static final short ICONST_0 = 3; + public static final short ICONST_1 = 4; + public static final short ICONST_2 = 5; + public static final short ICONST_3 = 6; + public static final short ICONST_4 = 7; + public static final short ICONST_5 = 8; + public static final short LCONST_0 = 9; + public static final short LCONST_1 = 10; + public static final short FCONST_0 = 11; + public static final short FCONST_1 = 12; + public static final short FCONST_2 = 13; + public static final short DCONST_0 = 14; + public static final short DCONST_1 = 15; + public static final short BIPUSH = 16; + public static final short SIPUSH = 17; + public static final short LDC = 18; + public static final short LDC_W = 19; + public static final short LDC2_W = 20; + public static final short ILOAD = 21; + public static final short LLOAD = 22; + public static final short FLOAD = 23; + public static final short DLOAD = 24; + public static final short ALOAD = 25; + public static final short ILOAD_0 = 26; + public static final short ILOAD_1 = 27; + public static final short ILOAD_2 = 28; + public static final short ILOAD_3 = 29; + public static final short LLOAD_0 = 30; + public static final short LLOAD_1 = 31; + public static final short LLOAD_2 = 32; + public static final short LLOAD_3 = 33; + public static final short FLOAD_0 = 34; + public static final short FLOAD_1 = 35; + public static final short FLOAD_2 = 36; + public static final short FLOAD_3 = 37; + public static final short DLOAD_0 = 38; + public static final short DLOAD_1 = 39; + public static final short DLOAD_2 = 40; + public static final short DLOAD_3 = 41; + public static final short ALOAD_0 = 42; + public static final short ALOAD_1 = 43; + public static final short ALOAD_2 = 44; + public static final short ALOAD_3 = 45; + public static final short IALOAD = 46; + public static final short LALOAD = 47; + public static final short FALOAD = 48; + public static final short DALOAD = 49; + public static final short AALOAD = 50; + public static final short BALOAD = 51; + public static final short CALOAD = 52; + public static final short SALOAD = 53; + public static final short ISTORE = 54; + public static final short LSTORE = 55; + public static final short FSTORE = 56; + public static final short DSTORE = 57; + public static final short ASTORE = 58; + public static final short ISTORE_0 = 59; + public static final short ISTORE_1 = 60; + public static final short ISTORE_2 = 61; + public static final short ISTORE_3 = 62; + public static final short LSTORE_0 = 63; + public static final short LSTORE_1 = 64; + public static final short LSTORE_2 = 65; + public static final short LSTORE_3 = 66; + public static final short FSTORE_0 = 67; + public static final short FSTORE_1 = 68; + public static final short FSTORE_2 = 69; + public static final short FSTORE_3 = 70; + public static final short DSTORE_0 = 71; + public static final short DSTORE_1 = 72; + public static final short DSTORE_2 = 73; + public static final short DSTORE_3 = 74; + public static final short ASTORE_0 = 75; + public static final short ASTORE_1 = 76; + public static final short ASTORE_2 = 77; + public static final short ASTORE_3 = 78; + public static final short IASTORE = 79; + public static final short LASTORE = 80; + public static final short FASTORE = 81; + public static final short DASTORE = 82; + public static final short AASTORE = 83; + public static final short BASTORE = 84; + public static final short CASTORE = 85; + public static final short SASTORE = 86; + public static final short POP = 87; + public static final short POP2 = 88; + public static final short DUP = 89; + public static final short DUP_X1 = 90; + public static final short DUP_X2 = 91; + public static final short DUP2 = 92; + public static final short DUP2_X1 = 93; + public static final short DUP2_X2 = 94; + public static final short SWAP = 95; + public static final short IADD = 96; + public static final short LADD = 97; + public static final short FADD = 98; + public static final short DADD = 99; + public static final short ISUB = 100; + public static final short LSUB = 101; + public static final short FSUB = 102; + public static final short DSUB = 103; + public static final short IMUL = 104; + public static final short LMUL = 105; + public static final short FMUL = 106; + public static final short DMUL = 107; + public static final short IDIV = 108; + public static final short LDIV = 109; + public static final short FDIV = 110; + public static final short DDIV = 111; + public static final short IREM = 112; + public static final short LREM = 113; + public static final short FREM = 114; + public static final short DREM = 115; + public static final short INEG = 116; + public static final short LNEG = 117; + public static final short FNEG = 118; + public static final short DNEG = 119; + public static final short ISHL = 120; + public static final short LSHL = 121; + public static final short ISHR = 122; + public static final short LSHR = 123; + public static final short IUSHR = 124; + public static final short LUSHR = 125; + public static final short IAND = 126; + public static final short LAND = 127; + public static final short IOR = 128; + public static final short LOR = 129; + public static final short IXOR = 130; + public static final short LXOR = 131; + public static final short IINC = 132; + public static final short I2L = 133; + public static final short I2F = 134; + public static final short I2D = 135; + public static final short L2I = 136; + public static final short L2F = 137; + public static final short L2D = 138; + public static final short F2I = 139; + public static final short F2L = 140; + public static final short F2D = 141; + public static final short D2I = 142; + public static final short D2L = 143; + public static final short D2F = 144; + public static final short I2B = 145; + public static final short INT2BYTE = 145; // Old notion + public static final short I2C = 146; + public static final short INT2CHAR = 146; // Old notion + public static final short I2S = 147; + public static final short INT2SHORT = 147; // Old notion + public static final short LCMP = 148; + public static final short FCMPL = 149; + public static final short FCMPG = 150; + public static final short DCMPL = 151; + public static final short DCMPG = 152; + public static final short IFEQ = 153; + public static final short IFNE = 154; + public static final short IFLT = 155; + public static final short IFGE = 156; + public static final short IFGT = 157; + public static final short IFLE = 158; + public static final short IF_ICMPEQ = 159; + public static final short IF_ICMPNE = 160; + public static final short IF_ICMPLT = 161; + public static final short IF_ICMPGE = 162; + public static final short IF_ICMPGT = 163; + public static final short IF_ICMPLE = 164; + public static final short IF_ACMPEQ = 165; + public static final short IF_ACMPNE = 166; + public static final short GOTO = 167; + public static final short JSR = 168; + public static final short RET = 169; + public static final short TABLESWITCH = 170; + public static final short LOOKUPSWITCH = 171; + public static final short IRETURN = 172; + public static final short LRETURN = 173; + public static final short FRETURN = 174; + public static final short DRETURN = 175; + public static final short ARETURN = 176; + public static final short RETURN = 177; + public static final short GETSTATIC = 178; + public static final short PUTSTATIC = 179; + public static final short GETFIELD = 180; + public static final short PUTFIELD = 181; + public static final short INVOKEVIRTUAL = 182; + public static final short INVOKESPECIAL = 183; + public static final short INVOKENONVIRTUAL = 183; // Old name in JDK 1.0 + public static final short INVOKESTATIC = 184; + public static final short INVOKEINTERFACE = 185; + public static final short NEW = 187; + public static final short NEWARRAY = 188; + public static final short ANEWARRAY = 189; + public static final short ARRAYLENGTH = 190; + public static final short ATHROW = 191; + public static final short CHECKCAST = 192; + public static final short INSTANCEOF = 193; + public static final short MONITORENTER = 194; + public static final short MONITOREXIT = 195; + public static final short WIDE = 196; + public static final short MULTIANEWARRAY = 197; + public static final short IFNULL = 198; + public static final short IFNONNULL = 199; + public static final short GOTO_W = 200; + public static final short JSR_W = 201; + + /** + * Non-legal opcodes, may be used by JVM internally. + */ + public static final short BREAKPOINT = 202; + public static final short LDC_QUICK = 203; + public static final short LDC_W_QUICK = 204; + public static final short LDC2_W_QUICK = 205; + public static final short GETFIELD_QUICK = 206; + public static final short PUTFIELD_QUICK = 207; + public static final short GETFIELD2_QUICK = 208; + public static final short PUTFIELD2_QUICK = 209; + public static final short GETSTATIC_QUICK = 210; + public static final short PUTSTATIC_QUICK = 211; + public static final short GETSTATIC2_QUICK = 212; + public static final short PUTSTATIC2_QUICK = 213; + public static final short INVOKEVIRTUAL_QUICK = 214; + public static final short INVOKENONVIRTUAL_QUICK = 215; + public static final short INVOKESUPER_QUICK = 216; + public static final short INVOKESTATIC_QUICK = 217; + public static final short INVOKEINTERFACE_QUICK = 218; + public static final short INVOKEVIRTUALOBJECT_QUICK = 219; + public static final short NEW_QUICK = 221; + public static final short ANEWARRAY_QUICK = 222; + public static final short MULTIANEWARRAY_QUICK = 223; + public static final short CHECKCAST_QUICK = 224; + public static final short INSTANCEOF_QUICK = 225; + public static final short INVOKEVIRTUAL_QUICK_W = 226; + public static final short GETFIELD_QUICK_W = 227; + public static final short PUTFIELD_QUICK_W = 228; + public static final short IMPDEP1 = 254; + public static final short IMPDEP2 = 255; + + /** + * For internal purposes only. + */ + public static final short PUSH = 4711; + public static final short SWITCH = 4712; + + /** + * Illegal codes + */ + public static final short UNDEFINED = -1; + public static final short UNPREDICTABLE = -2; + public static final short RESERVED = -3; + public static final String ILLEGAL_OPCODE = ""; + public static final String ILLEGAL_TYPE = ""; + + public static final byte T_BOOLEAN = 4; + public static final byte T_CHAR = 5; + public static final byte T_FLOAT = 6; + public static final byte T_DOUBLE = 7; + public static final byte T_BYTE = 8; + public static final byte T_SHORT = 9; + public static final byte T_INT = 10; + public static final byte T_LONG = 11; + + public static final byte T_VOID = 12; // Non-standard + public static final byte T_ARRAY = 13; + public static final byte T_OBJECT = 14; + public static final byte T_REFERENCE = 14; // Deprecated + public static final byte T_UNKNOWN = 15; + public static final byte T_ADDRESS = 16; + + public static final String[] TYPE_NAMES = { + ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, + "boolean", "char", "float", "double", "byte", "short", "int", "long", + "void", "array", "object", "unknown" // Non-standard + }; + + public static final String[] SHORT_TYPE_NAMES = { + ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, + "Z", "C", "F", "D", "B", "S", "I", "J", + "V", ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE + }; + + /** + * Number of byte code operands, i.e., number of bytes after the tag byte + * itself. + */ + public static final short[] NO_OF_OPERANDS = { + 0/*nop*/, 0/*aconst_null*/, 0/*iconst_m1*/, 0/*iconst_0*/, + 0/*iconst_1*/, 0/*iconst_2*/, 0/*iconst_3*/, 0/*iconst_4*/, + 0/*iconst_5*/, 0/*lconst_0*/, 0/*lconst_1*/, 0/*fconst_0*/, + 0/*fconst_1*/, 0/*fconst_2*/, 0/*dconst_0*/, 0/*dconst_1*/, + 1/*bipush*/, 2/*sipush*/, 1/*ldc*/, 2/*ldc_w*/, 2/*ldc2_w*/, + 1/*iload*/, 1/*lload*/, 1/*fload*/, 1/*dload*/, 1/*aload*/, + 0/*iload_0*/, 0/*iload_1*/, 0/*iload_2*/, 0/*iload_3*/, + 0/*lload_0*/, 0/*lload_1*/, 0/*lload_2*/, 0/*lload_3*/, + 0/*fload_0*/, 0/*fload_1*/, 0/*fload_2*/, 0/*fload_3*/, + 0/*dload_0*/, 0/*dload_1*/, 0/*dload_2*/, 0/*dload_3*/, + 0/*aload_0*/, 0/*aload_1*/, 0/*aload_2*/, 0/*aload_3*/, + 0/*iaload*/, 0/*laload*/, 0/*faload*/, 0/*daload*/, + 0/*aaload*/, 0/*baload*/, 0/*caload*/, 0/*saload*/, + 1/*istore*/, 1/*lstore*/, 1/*fstore*/, 1/*dstore*/, + 1/*astore*/, 0/*istore_0*/, 0/*istore_1*/, 0/*istore_2*/, + 0/*istore_3*/, 0/*lstore_0*/, 0/*lstore_1*/, 0/*lstore_2*/, + 0/*lstore_3*/, 0/*fstore_0*/, 0/*fstore_1*/, 0/*fstore_2*/, + 0/*fstore_3*/, 0/*dstore_0*/, 0/*dstore_1*/, 0/*dstore_2*/, + 0/*dstore_3*/, 0/*astore_0*/, 0/*astore_1*/, 0/*astore_2*/, + 0/*astore_3*/, 0/*iastore*/, 0/*lastore*/, 0/*fastore*/, + 0/*dastore*/, 0/*aastore*/, 0/*bastore*/, 0/*castore*/, + 0/*sastore*/, 0/*pop*/, 0/*pop2*/, 0/*dup*/, 0/*dup_x1*/, + 0/*dup_x2*/, 0/*dup2*/, 0/*dup2_x1*/, 0/*dup2_x2*/, 0/*swap*/, + 0/*iadd*/, 0/*ladd*/, 0/*fadd*/, 0/*dadd*/, 0/*isub*/, + 0/*lsub*/, 0/*fsub*/, 0/*dsub*/, 0/*imul*/, 0/*lmul*/, + 0/*fmul*/, 0/*dmul*/, 0/*idiv*/, 0/*ldiv*/, 0/*fdiv*/, + 0/*ddiv*/, 0/*irem*/, 0/*lrem*/, 0/*frem*/, 0/*drem*/, + 0/*ineg*/, 0/*lneg*/, 0/*fneg*/, 0/*dneg*/, 0/*ishl*/, + 0/*lshl*/, 0/*ishr*/, 0/*lshr*/, 0/*iushr*/, 0/*lushr*/, + 0/*iand*/, 0/*land*/, 0/*ior*/, 0/*lor*/, 0/*ixor*/, 0/*lxor*/, + 2/*iinc*/, 0/*i2l*/, 0/*i2f*/, 0/*i2d*/, 0/*l2i*/, 0/*l2f*/, + 0/*l2d*/, 0/*f2i*/, 0/*f2l*/, 0/*f2d*/, 0/*d2i*/, 0/*d2l*/, + 0/*d2f*/, 0/*i2b*/, 0/*i2c*/, 0/*i2s*/, 0/*lcmp*/, 0/*fcmpl*/, + 0/*fcmpg*/, 0/*dcmpl*/, 0/*dcmpg*/, 2/*ifeq*/, 2/*ifne*/, + 2/*iflt*/, 2/*ifge*/, 2/*ifgt*/, 2/*ifle*/, 2/*if_icmpeq*/, + 2/*if_icmpne*/, 2/*if_icmplt*/, 2/*if_icmpge*/, 2/*if_icmpgt*/, + 2/*if_icmple*/, 2/*if_acmpeq*/, 2/*if_acmpne*/, 2/*goto*/, + 2/*jsr*/, 1/*ret*/, UNPREDICTABLE/*tableswitch*/, UNPREDICTABLE/*lookupswitch*/, + 0/*ireturn*/, 0/*lreturn*/, 0/*freturn*/, + 0/*dreturn*/, 0/*areturn*/, 0/*return*/, + 2/*getstatic*/, 2/*putstatic*/, 2/*getfield*/, + 2/*putfield*/, 2/*invokevirtual*/, 2/*invokespecial*/, 2/*invokestatic*/, + 4/*invokeinterface*/, UNDEFINED, 2/*new*/, + 1/*newarray*/, 2/*anewarray*/, + 0/*arraylength*/, 0/*athrow*/, 2/*checkcast*/, + 2/*instanceof*/, 0/*monitorenter*/, + 0/*monitorexit*/, UNPREDICTABLE/*wide*/, 3/*multianewarray*/, + 2/*ifnull*/, 2/*ifnonnull*/, 4/*goto_w*/, + 4/*jsr_w*/, 0/*breakpoint*/, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, RESERVED/*impdep1*/, RESERVED/*impdep2*/ + }; + + /** + * How the byte code operands are to be interpreted. + */ + public static final short[][] TYPE_OF_OPERANDS = { + {}/*nop*/, {}/*aconst_null*/, {}/*iconst_m1*/, {}/*iconst_0*/, + {}/*iconst_1*/, {}/*iconst_2*/, {}/*iconst_3*/, {}/*iconst_4*/, + {}/*iconst_5*/, {}/*lconst_0*/, {}/*lconst_1*/, {}/*fconst_0*/, + {}/*fconst_1*/, {}/*fconst_2*/, {}/*dconst_0*/, {}/*dconst_1*/, + {T_BYTE}/*bipush*/, {T_SHORT}/*sipush*/, {T_BYTE}/*ldc*/, + {T_SHORT}/*ldc_w*/, {T_SHORT}/*ldc2_w*/, + {T_BYTE}/*iload*/, {T_BYTE}/*lload*/, {T_BYTE}/*fload*/, + {T_BYTE}/*dload*/, {T_BYTE}/*aload*/, {}/*iload_0*/, + {}/*iload_1*/, {}/*iload_2*/, {}/*iload_3*/, {}/*lload_0*/, + {}/*lload_1*/, {}/*lload_2*/, {}/*lload_3*/, {}/*fload_0*/, + {}/*fload_1*/, {}/*fload_2*/, {}/*fload_3*/, {}/*dload_0*/, + {}/*dload_1*/, {}/*dload_2*/, {}/*dload_3*/, {}/*aload_0*/, + {}/*aload_1*/, {}/*aload_2*/, {}/*aload_3*/, {}/*iaload*/, + {}/*laload*/, {}/*faload*/, {}/*daload*/, {}/*aaload*/, + {}/*baload*/, {}/*caload*/, {}/*saload*/, {T_BYTE}/*istore*/, + {T_BYTE}/*lstore*/, {T_BYTE}/*fstore*/, {T_BYTE}/*dstore*/, + {T_BYTE}/*astore*/, {}/*istore_0*/, {}/*istore_1*/, + {}/*istore_2*/, {}/*istore_3*/, {}/*lstore_0*/, {}/*lstore_1*/, + {}/*lstore_2*/, {}/*lstore_3*/, {}/*fstore_0*/, {}/*fstore_1*/, + {}/*fstore_2*/, {}/*fstore_3*/, {}/*dstore_0*/, {}/*dstore_1*/, + {}/*dstore_2*/, {}/*dstore_3*/, {}/*astore_0*/, {}/*astore_1*/, + {}/*astore_2*/, {}/*astore_3*/, {}/*iastore*/, {}/*lastore*/, + {}/*fastore*/, {}/*dastore*/, {}/*aastore*/, {}/*bastore*/, + {}/*castore*/, {}/*sastore*/, {}/*pop*/, {}/*pop2*/, {}/*dup*/, + {}/*dup_x1*/, {}/*dup_x2*/, {}/*dup2*/, {}/*dup2_x1*/, + {}/*dup2_x2*/, {}/*swap*/, {}/*iadd*/, {}/*ladd*/, {}/*fadd*/, + {}/*dadd*/, {}/*isub*/, {}/*lsub*/, {}/*fsub*/, {}/*dsub*/, + {}/*imul*/, {}/*lmul*/, {}/*fmul*/, {}/*dmul*/, {}/*idiv*/, + {}/*ldiv*/, {}/*fdiv*/, {}/*ddiv*/, {}/*irem*/, {}/*lrem*/, + {}/*frem*/, {}/*drem*/, {}/*ineg*/, {}/*lneg*/, {}/*fneg*/, + {}/*dneg*/, {}/*ishl*/, {}/*lshl*/, {}/*ishr*/, {}/*lshr*/, + {}/*iushr*/, {}/*lushr*/, {}/*iand*/, {}/*land*/, {}/*ior*/, + {}/*lor*/, {}/*ixor*/, {}/*lxor*/, {T_BYTE, T_BYTE}/*iinc*/, + {}/*i2l*/, {}/*i2f*/, {}/*i2d*/, {}/*l2i*/, {}/*l2f*/, {}/*l2d*/, + {}/*f2i*/, {}/*f2l*/, {}/*f2d*/, {}/*d2i*/, {}/*d2l*/, {}/*d2f*/, + {}/*i2b*/, {}/*i2c*/,{}/*i2s*/, {}/*lcmp*/, {}/*fcmpl*/, + {}/*fcmpg*/, {}/*dcmpl*/, {}/*dcmpg*/, {T_SHORT}/*ifeq*/, + {T_SHORT}/*ifne*/, {T_SHORT}/*iflt*/, {T_SHORT}/*ifge*/, + {T_SHORT}/*ifgt*/, {T_SHORT}/*ifle*/, {T_SHORT}/*if_icmpeq*/, + {T_SHORT}/*if_icmpne*/, {T_SHORT}/*if_icmplt*/, + {T_SHORT}/*if_icmpge*/, {T_SHORT}/*if_icmpgt*/, + {T_SHORT}/*if_icmple*/, {T_SHORT}/*if_acmpeq*/, + {T_SHORT}/*if_acmpne*/, {T_SHORT}/*goto*/, {T_SHORT}/*jsr*/, + {T_BYTE}/*ret*/, {}/*tableswitch*/, {}/*lookupswitch*/, + {}/*ireturn*/, {}/*lreturn*/, {}/*freturn*/, {}/*dreturn*/, + {}/*areturn*/, {}/*return*/, {T_SHORT}/*getstatic*/, + {T_SHORT}/*putstatic*/, {T_SHORT}/*getfield*/, + {T_SHORT}/*putfield*/, {T_SHORT}/*invokevirtual*/, + {T_SHORT}/*invokespecial*/, {T_SHORT}/*invokestatic*/, + {T_SHORT, T_BYTE, T_BYTE}/*invokeinterface*/, {}, + {T_SHORT}/*new*/, {T_BYTE}/*newarray*/, + {T_SHORT}/*anewarray*/, {}/*arraylength*/, {}/*athrow*/, + {T_SHORT}/*checkcast*/, {T_SHORT}/*instanceof*/, + {}/*monitorenter*/, {}/*monitorexit*/, {T_BYTE}/*wide*/, + {T_SHORT, T_BYTE}/*multianewarray*/, {T_SHORT}/*ifnull*/, + {T_SHORT}/*ifnonnull*/, {T_INT}/*goto_w*/, {T_INT}/*jsr_w*/, + {}/*breakpoint*/, {}, {}, {}, {}, {}, {}, {}, + {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, + {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, + {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, + {}/*impdep1*/, {}/*impdep2*/ + }; + + /** + * Names of opcodes. + */ + public static final String[] OPCODE_NAMES = { + "nop", "aconst_null", "iconst_m1", "iconst_0", "iconst_1", + "iconst_2", "iconst_3", "iconst_4", "iconst_5", "lconst_0", + "lconst_1", "fconst_0", "fconst_1", "fconst_2", "dconst_0", + "dconst_1", "bipush", "sipush", "ldc", "ldc_w", "ldc2_w", "iload", + "lload", "fload", "dload", "aload", "iload_0", "iload_1", "iload_2", + "iload_3", "lload_0", "lload_1", "lload_2", "lload_3", "fload_0", + "fload_1", "fload_2", "fload_3", "dload_0", "dload_1", "dload_2", + "dload_3", "aload_0", "aload_1", "aload_2", "aload_3", "iaload", + "laload", "faload", "daload", "aaload", "baload", "caload", "saload", + "istore", "lstore", "fstore", "dstore", "astore", "istore_0", + "istore_1", "istore_2", "istore_3", "lstore_0", "lstore_1", + "lstore_2", "lstore_3", "fstore_0", "fstore_1", "fstore_2", + "fstore_3", "dstore_0", "dstore_1", "dstore_2", "dstore_3", + "astore_0", "astore_1", "astore_2", "astore_3", "iastore", "lastore", + "fastore", "dastore", "aastore", "bastore", "castore", "sastore", + "pop", "pop2", "dup", "dup_x1", "dup_x2", "dup2", "dup2_x1", + "dup2_x2", "swap", "iadd", "ladd", "fadd", "dadd", "isub", "lsub", + "fsub", "dsub", "imul", "lmul", "fmul", "dmul", "idiv", "ldiv", + "fdiv", "ddiv", "irem", "lrem", "frem", "drem", "ineg", "lneg", + "fneg", "dneg", "ishl", "lshl", "ishr", "lshr", "iushr", "lushr", + "iand", "land", "ior", "lor", "ixor", "lxor", "iinc", "i2l", "i2f", + "i2d", "l2i", "l2f", "l2d", "f2i", "f2l", "f2d", "d2i", "d2l", "d2f", + "i2b", "i2c", "i2s", "lcmp", "fcmpl", "fcmpg", + "dcmpl", "dcmpg", "ifeq", "ifne", "iflt", "ifge", "ifgt", "ifle", + "if_icmpeq", "if_icmpne", "if_icmplt", "if_icmpge", "if_icmpgt", + "if_icmple", "if_acmpeq", "if_acmpne", "goto", "jsr", "ret", + "tableswitch", "lookupswitch", "ireturn", "lreturn", "freturn", + "dreturn", "areturn", "return", "getstatic", "putstatic", "getfield", + "putfield", "invokevirtual", "invokespecial", "invokestatic", + "invokeinterface", ILLEGAL_OPCODE, "new", "newarray", "anewarray", + "arraylength", "athrow", "checkcast", "instanceof", "monitorenter", + "monitorexit", "wide", "multianewarray", "ifnull", "ifnonnull", + "goto_w", "jsr_w", "breakpoint", ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, ILLEGAL_OPCODE, + ILLEGAL_OPCODE, "impdep1", "impdep2" + }; + + /** + * Number of words consumed on operand stack by instructions. + */ + public static final int[] CONSUME_STACK = { + 0/*nop*/, 0/*aconst_null*/, 0/*iconst_m1*/, 0/*iconst_0*/, 0/*iconst_1*/, + 0/*iconst_2*/, 0/*iconst_3*/, 0/*iconst_4*/, 0/*iconst_5*/, 0/*lconst_0*/, + 0/*lconst_1*/, 0/*fconst_0*/, 0/*fconst_1*/, 0/*fconst_2*/, 0/*dconst_0*/, + 0/*dconst_1*/, 0/*bipush*/, 0/*sipush*/, 0/*ldc*/, 0/*ldc_w*/, 0/*ldc2_w*/, 0/*iload*/, + 0/*lload*/, 0/*fload*/, 0/*dload*/, 0/*aload*/, 0/*iload_0*/, 0/*iload_1*/, 0/*iload_2*/, + 0/*iload_3*/, 0/*lload_0*/, 0/*lload_1*/, 0/*lload_2*/, 0/*lload_3*/, 0/*fload_0*/, + 0/*fload_1*/, 0/*fload_2*/, 0/*fload_3*/, 0/*dload_0*/, 0/*dload_1*/, 0/*dload_2*/, + 0/*dload_3*/, 0/*aload_0*/, 0/*aload_1*/, 0/*aload_2*/, 0/*aload_3*/, 2/*iaload*/, + 2/*laload*/, 2/*faload*/, 2/*daload*/, 2/*aaload*/, 2/*baload*/, 2/*caload*/, 2/*saload*/, + 1/*istore*/, 2/*lstore*/, 1/*fstore*/, 2/*dstore*/, 1/*astore*/, 1/*istore_0*/, + 1/*istore_1*/, 1/*istore_2*/, 1/*istore_3*/, 2/*lstore_0*/, 2/*lstore_1*/, + 2/*lstore_2*/, 2/*lstore_3*/, 1/*fstore_0*/, 1/*fstore_1*/, 1/*fstore_2*/, + 1/*fstore_3*/, 2/*dstore_0*/, 2/*dstore_1*/, 2/*dstore_2*/, 2/*dstore_3*/, + 1/*astore_0*/, 1/*astore_1*/, 1/*astore_2*/, 1/*astore_3*/, 3/*iastore*/, 4/*lastore*/, + 3/*fastore*/, 4/*dastore*/, 3/*aastore*/, 3/*bastore*/, 3/*castore*/, 3/*sastore*/, + 1/*pop*/, 2/*pop2*/, 1/*dup*/, 2/*dup_x1*/, 3/*dup_x2*/, 2/*dup2*/, 3/*dup2_x1*/, + 4/*dup2_x2*/, 2/*swap*/, 2/*iadd*/, 4/*ladd*/, 2/*fadd*/, 4/*dadd*/, 2/*isub*/, 4/*lsub*/, + 2/*fsub*/, 4/*dsub*/, 2/*imul*/, 4/*lmul*/, 2/*fmul*/, 4/*dmul*/, 2/*idiv*/, 4/*ldiv*/, + 2/*fdiv*/, 4/*ddiv*/, 2/*irem*/, 4/*lrem*/, 2/*frem*/, 4/*drem*/, 1/*ineg*/, 2/*lneg*/, + 1/*fneg*/, 2/*dneg*/, 2/*ishl*/, 3/*lshl*/, 2/*ishr*/, 3/*lshr*/, 2/*iushr*/, 3/*lushr*/, + 2/*iand*/, 4/*land*/, 2/*ior*/, 4/*lor*/, 2/*ixor*/, 4/*lxor*/, 0/*iinc*/, + 1/*i2l*/, 1/*i2f*/, 1/*i2d*/, 2/*l2i*/, 2/*l2f*/, 2/*l2d*/, 1/*f2i*/, 1/*f2l*/, + 1/*f2d*/, 2/*d2i*/, 2/*d2l*/, 2/*d2f*/, 1/*i2b*/, 1/*i2c*/, 1/*i2s*/, + 4/*lcmp*/, 2/*fcmpl*/, 2/*fcmpg*/, 4/*dcmpl*/, 4/*dcmpg*/, 1/*ifeq*/, 1/*ifne*/, + 1/*iflt*/, 1/*ifge*/, 1/*ifgt*/, 1/*ifle*/, 2/*if_icmpeq*/, 2/*if_icmpne*/, 2/*if_icmplt*/, + 2 /*if_icmpge*/, 2/*if_icmpgt*/, 2/*if_icmple*/, 2/*if_acmpeq*/, 2/*if_acmpne*/, + 0/*goto*/, 0/*jsr*/, 0/*ret*/, 1/*tableswitch*/, 1/*lookupswitch*/, 1/*ireturn*/, + 2/*lreturn*/, 1/*freturn*/, 2/*dreturn*/, 1/*areturn*/, 0/*return*/, 0/*getstatic*/, + UNPREDICTABLE/*putstatic*/, 1/*getfield*/, UNPREDICTABLE/*putfield*/, + UNPREDICTABLE/*invokevirtual*/, UNPREDICTABLE/*invokespecial*/, + UNPREDICTABLE/*invokestatic*/, + UNPREDICTABLE/*invokeinterface*/, UNDEFINED, 0/*new*/, 1/*newarray*/, 1/*anewarray*/, + 1/*arraylength*/, 1/*athrow*/, 1/*checkcast*/, 1/*instanceof*/, 1/*monitorenter*/, + 1/*monitorexit*/, 0/*wide*/, UNPREDICTABLE/*multianewarray*/, 1/*ifnull*/, 1/*ifnonnull*/, + 0/*goto_w*/, 0/*jsr_w*/, 0/*breakpoint*/, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNPREDICTABLE/*impdep1*/, UNPREDICTABLE/*impdep2*/ + }; + + /** + * Number of words produced onto operand stack by instructions. + */ + public static final int[] PRODUCE_STACK = { + 0/*nop*/, 1/*aconst_null*/, 1/*iconst_m1*/, 1/*iconst_0*/, 1/*iconst_1*/, + 1/*iconst_2*/, 1/*iconst_3*/, 1/*iconst_4*/, 1/*iconst_5*/, 2/*lconst_0*/, + 2/*lconst_1*/, 1/*fconst_0*/, 1/*fconst_1*/, 1/*fconst_2*/, 2/*dconst_0*/, + 2/*dconst_1*/, 1/*bipush*/, 1/*sipush*/, 1/*ldc*/, 1/*ldc_w*/, 2/*ldc2_w*/, 1/*iload*/, + 2/*lload*/, 1/*fload*/, 2/*dload*/, 1/*aload*/, 1/*iload_0*/, 1/*iload_1*/, 1/*iload_2*/, + 1/*iload_3*/, 2/*lload_0*/, 2/*lload_1*/, 2/*lload_2*/, 2/*lload_3*/, 1/*fload_0*/, + 1/*fload_1*/, 1/*fload_2*/, 1/*fload_3*/, 2/*dload_0*/, 2/*dload_1*/, 2/*dload_2*/, + 2/*dload_3*/, 1/*aload_0*/, 1/*aload_1*/, 1/*aload_2*/, 1/*aload_3*/, 1/*iaload*/, + 2/*laload*/, 1/*faload*/, 2/*daload*/, 1/*aaload*/, 1/*baload*/, 1/*caload*/, 1/*saload*/, + 0/*istore*/, 0/*lstore*/, 0/*fstore*/, 0/*dstore*/, 0/*astore*/, 0/*istore_0*/, + 0/*istore_1*/, 0/*istore_2*/, 0/*istore_3*/, 0/*lstore_0*/, 0/*lstore_1*/, + 0/*lstore_2*/, 0/*lstore_3*/, 0/*fstore_0*/, 0/*fstore_1*/, 0/*fstore_2*/, + 0/*fstore_3*/, 0/*dstore_0*/, 0/*dstore_1*/, 0/*dstore_2*/, 0/*dstore_3*/, + 0/*astore_0*/, 0/*astore_1*/, 0/*astore_2*/, 0/*astore_3*/, 0/*iastore*/, 0/*lastore*/, + 0/*fastore*/, 0/*dastore*/, 0/*aastore*/, 0/*bastore*/, 0/*castore*/, 0/*sastore*/, + 0/*pop*/, 0/*pop2*/, 2/*dup*/, 3/*dup_x1*/, 4/*dup_x2*/, 4/*dup2*/, 5/*dup2_x1*/, + 6/*dup2_x2*/, 2/*swap*/, 1/*iadd*/, 2/*ladd*/, 1/*fadd*/, 2/*dadd*/, 1/*isub*/, 2/*lsub*/, + 1/*fsub*/, 2/*dsub*/, 1/*imul*/, 2/*lmul*/, 1/*fmul*/, 2/*dmul*/, 1/*idiv*/, 2/*ldiv*/, + 1/*fdiv*/, 2/*ddiv*/, 1/*irem*/, 2/*lrem*/, 1/*frem*/, 2/*drem*/, 1/*ineg*/, 2/*lneg*/, + 1/*fneg*/, 2/*dneg*/, 1/*ishl*/, 2/*lshl*/, 1/*ishr*/, 2/*lshr*/, 1/*iushr*/, 2/*lushr*/, + 1/*iand*/, 2/*land*/, 1/*ior*/, 2/*lor*/, 1/*ixor*/, 2/*lxor*/, + 0/*iinc*/, 2/*i2l*/, 1/*i2f*/, 2/*i2d*/, 1/*l2i*/, 1/*l2f*/, 2/*l2d*/, 1/*f2i*/, + 2/*f2l*/, 2/*f2d*/, 1/*d2i*/, 2/*d2l*/, 1/*d2f*/, + 1/*i2b*/, 1/*i2c*/, 1/*i2s*/, 1/*lcmp*/, 1/*fcmpl*/, 1/*fcmpg*/, + 1/*dcmpl*/, 1/*dcmpg*/, 0/*ifeq*/, 0/*ifne*/, 0/*iflt*/, 0/*ifge*/, 0/*ifgt*/, 0/*ifle*/, + 0/*if_icmpeq*/, 0/*if_icmpne*/, 0/*if_icmplt*/, 0/*if_icmpge*/, 0/*if_icmpgt*/, + 0/*if_icmple*/, 0/*if_acmpeq*/, 0/*if_acmpne*/, 0/*goto*/, 1/*jsr*/, 0/*ret*/, + 0/*tableswitch*/, 0/*lookupswitch*/, 0/*ireturn*/, 0/*lreturn*/, 0/*freturn*/, + 0/*dreturn*/, 0/*areturn*/, 0/*return*/, UNPREDICTABLE/*getstatic*/, 0/*putstatic*/, + UNPREDICTABLE/*getfield*/, 0/*putfield*/, UNPREDICTABLE/*invokevirtual*/, + UNPREDICTABLE/*invokespecial*/, UNPREDICTABLE/*invokestatic*/, + UNPREDICTABLE/*invokeinterface*/, UNDEFINED, 1/*new*/, 1/*newarray*/, 1/*anewarray*/, + 1/*arraylength*/, 1/*athrow*/, 1/*checkcast*/, 1/*instanceof*/, 0/*monitorenter*/, + 0/*monitorexit*/, 0/*wide*/, 1/*multianewarray*/, 0/*ifnull*/, 0/*ifnonnull*/, + 0/*goto_w*/, 1/*jsr_w*/, 0/*breakpoint*/, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNDEFINED, UNDEFINED, UNDEFINED, + UNDEFINED, UNPREDICTABLE/*impdep1*/, UNPREDICTABLE/*impdep2*/ + }; + + /** Attributes and their corresponding names. + */ + public static final byte ATTR_UNKNOWN = -1; + public static final byte ATTR_SOURCE_FILE = 0; + public static final byte ATTR_CONSTANT_VALUE = 1; + public static final byte ATTR_CODE = 2; + public static final byte ATTR_EXCEPTIONS = 3; + public static final byte ATTR_LINE_NUMBER_TABLE = 4; + public static final byte ATTR_LOCAL_VARIABLE_TABLE = 5; + public static final byte ATTR_INNER_CLASSES = 6; + public static final byte ATTR_SYNTHETIC = 7; + public static final byte ATTR_DEPRECATED = 8; + public static final byte ATTR_PMG = 9; + public static final byte ATTR_SIGNATURE = 10; + public static final byte ATTR_STACK_MAP = 11; + + public static final short KNOWN_ATTRIBUTES = 12; + + public static final String[] ATTRIBUTE_NAMES = { + "SourceFile", "ConstantValue", "Code", "Exceptions", + "LineNumberTable", "LocalVariableTable", + "InnerClasses", "Synthetic", "Deprecated", + "PMGClass", "Signature", "StackMap" + }; + + /** Constants used in the StackMap attribute. + */ + public static final byte ITEM_Bogus = 0; + public static final byte ITEM_Integer = 1; + public static final byte ITEM_Float = 2; + public static final byte ITEM_Double = 3; + public static final byte ITEM_Long = 4; + public static final byte ITEM_Null = 5; + public static final byte ITEM_InitObject = 6; + public static final byte ITEM_Object = 7; + public static final byte ITEM_NewObject = 8; + + public static final String[] ITEM_NAMES = { + "Bogus", "Integer", "Float", "Double", "Long", + "Null", "InitObject", "Object", "NewObject" + }; +} diff --git a/src/java/org/apache/bcel/ExceptionConstants.java b/src/java/org/apache/bcel/ExceptionConstants.java new file mode 100644 index 00000000..089bea55 --- /dev/null +++ b/src/java/org/apache/bcel/ExceptionConstants.java @@ -0,0 +1,123 @@ +package org.apache.bcel; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Exception constants. + * + * @version $Id$ + * @author E. Haase + */ +public interface ExceptionConstants { + /** The mother of all exceptions + */ + public static final Class THROWABLE = Throwable.class; + + /** Super class of any run-time exception + */ + public static final Class RUNTIME_EXCEPTION = RuntimeException.class; + + /** Super class of any linking exception (aka Linkage Error) + */ + public static final Class LINKING_EXCEPTION = LinkageError.class; + + /** Linking Exceptions + */ + public static final Class CLASS_CIRCULARITY_ERROR = ClassCircularityError.class; + public static final Class CLASS_FORMAT_ERROR = ClassFormatError.class; + public static final Class EXCEPTION_IN_INITIALIZER_ERROR = ExceptionInInitializerError.class; + public static final Class INCOMPATIBLE_CLASS_CHANGE_ERROR = IncompatibleClassChangeError.class; + public static final Class ABSTRACT_METHOD_ERROR = AbstractMethodError.class; + public static final Class ILLEGAL_ACCESS_ERROR = IllegalAccessError.class; + public static final Class INSTANTIATION_ERROR = InstantiationError.class; + public static final Class NO_SUCH_FIELD_ERROR = NoSuchFieldError.class; + public static final Class NO_SUCH_METHOD_ERROR = NoSuchMethodError.class; + public static final Class NO_CLASS_DEF_FOUND_ERROR = NoClassDefFoundError.class; + public static final Class UNSATISFIED_LINK_ERROR = UnsatisfiedLinkError.class; + public static final Class VERIFY_ERROR = VerifyError.class; + + /* UnsupportedClassVersionError is new in JDK 1.2 */ + //public static final Class UnsupportedClassVersionError = UnsupportedClassVersionError.class; + + /** Run-Time Exceptions + */ + public static final Class NULL_POINTER_EXCEPTION = NullPointerException.class; + public static final Class ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION = ArrayIndexOutOfBoundsException.class; + public static final Class ARITHMETIC_EXCEPTION = ArithmeticException.class; + public static final Class NEGATIVE_ARRAY_SIZE_EXCEPTION = NegativeArraySizeException.class; + public static final Class CLASS_CAST_EXCEPTION = ClassCastException.class; + public static final Class ILLEGAL_MONITOR_STATE = IllegalMonitorStateException.class; + + /** Pre-defined exception arrays according to chapters 5.1-5.4 of the Java Virtual + * Machine Specification + */ + public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION = { + NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR, + EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR + }; // Chapter 5.1 + + public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION = { + NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR, NO_SUCH_METHOD_ERROR + }; // Chapter 5.2 + + public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION = new Class[0]; // Chapter 5.3 (as below) + public static final Class[] EXCS_STRING_RESOLUTION = new Class[0]; + // Chapter 5.4 (no errors but the ones that _always_ could happen! How stupid.) + + public static final Class[] EXCS_ARRAY_EXCEPTION = { + NULL_POINTER_EXCEPTION, ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION + }; + +} diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java new file mode 100644 index 00000000..5c502ea6 --- /dev/null +++ b/src/java/org/apache/bcel/Repository.java @@ -0,0 +1,295 @@ +package org.apache.bcel; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.classfile.*; +import org.apache.bcel.util.*; +import java.util.HashMap; +import java.io.*; + +/** + * Repository maintains informations about class interdependencies, e.g. + * whether a class is a sub-class of another. JavaClass objects are put + * into a cache which can be purged with clearCache(). + * + * All JavaClass objects used as arguments must have been obtained via + * the repository or been added with addClass() manually. This is + * because we have to check for object identity (==). + * + * @version $Id$ + * @author M. Dahm. + */ + +import org.apache.bcel.Constants; + +/** + * Super class for all objects that have modifiers like private, final, ... + * I.e. classes, fields, and methods. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class AccessFlags { + protected int access_flags; + + public AccessFlags() {} + + /** + * @param a inital access flags + */ + public AccessFlags(int a) { + access_flags = a; + } + + /** + * @return Access flags of the object. + */ + public final int getAccessFlags() { return access_flags; } + + /** + * @param access_flags Access flags of the object. + */ + public final void setAccessFlags(int access_flags) { + this.access_flags = access_flags; + } + + private final void setFlag(int flag, boolean set) { + if((access_flags & flag) != 0) { // Flag is set already + if(!set) // Delete flag ? + access_flags ^= flag; + } else { // Flag not set + if(set) // Set flag ? + access_flags |= flag; + } + } + + public final void isPublic(boolean flag) { setFlag(Constants.ACC_PUBLIC, flag); } + public final boolean isPublic() { + return (access_flags & Constants.ACC_PUBLIC) != 0; + } + + public final void isPrivate(boolean flag) { setFlag(Constants.ACC_PRIVATE, flag); } + public final boolean isPrivate() { + return (access_flags & Constants.ACC_PRIVATE) != 0; + } + + public final void isProtected(boolean flag) { setFlag(Constants.ACC_PROTECTED, flag); } + public final boolean isProtected() { + return (access_flags & Constants.ACC_PROTECTED) != 0; + } + + public final void isStatic(boolean flag) { setFlag(Constants.ACC_STATIC, flag); } + public final boolean isStatic() { + return (access_flags & Constants.ACC_STATIC) != 0; + } + + public final void isFinal(boolean flag) { setFlag(Constants.ACC_FINAL, flag); } + public final boolean isFinal() { + return (access_flags & Constants.ACC_FINAL) != 0; + } + + public final void isSynchronized(boolean flag) { setFlag(Constants.ACC_SYNCHRONIZED, flag); } + public final boolean isSynchronized() { + return (access_flags & Constants.ACC_SYNCHRONIZED) != 0; + } + + public final void isVolatile(boolean flag) { setFlag(Constants.ACC_VOLATILE, flag); } + public final boolean isVolatile() { + return (access_flags & Constants.ACC_VOLATILE) != 0; + } + + public final void isTransient(boolean flag) { setFlag(Constants.ACC_TRANSIENT, flag); } + public final boolean isTransient() { + return (access_flags & Constants.ACC_TRANSIENT) != 0; + } + + public final void isNative(boolean flag) { setFlag(Constants.ACC_NATIVE, flag); } + public final boolean isNative() { + return (access_flags & Constants.ACC_NATIVE) != 0; + } + + public final void isInterface(boolean flag) { setFlag(Constants.ACC_INTERFACE, flag); } + public final boolean isInterface() { + return (access_flags & Constants.ACC_INTERFACE) != 0; + } + + public final void isAbstract(boolean flag) { setFlag(Constants.ACC_ABSTRACT, flag); } + public final boolean isAbstract() { + return (access_flags & Constants.ACC_ABSTRACT) != 0; + } + + public final void isStrictfp(boolean flag) { setFlag(Constants.ACC_STRICT, flag); } + public final boolean isStrictfp() { + return (access_flags & Constants.ACC_STRICT) != 0; + } +} diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java new file mode 100644 index 00000000..5557fdd4 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -0,0 +1,274 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * Abstract super class for Attribute objects. Currently the + * ConstantValue, SourceFile, Code, + * Exceptiontable, LineNumberTable, + * LocalVariableTable, InnerClasses and + * Synthetic attributes are supported. The + * Unknown attribute stands for non-standard-attributes. + * + * @version $Id$ + * @author M. Dahm + * @see ConstantValue + * @see SourceFile + * @see Code + * @see Unknown + * @see ExceptionTable + * @see LineNumberTable + * @see LocalVariableTable + * @see InnerClasses + * @see Synthetic + * @see Deprecated +*/ +public abstract class Attribute implements Cloneable, Node { + protected int name_index; // Points to attribute name in constant pool + protected int length; // Content length of attribute field + protected byte tag; // Tag to distiguish subclasses + protected ConstantPool constant_pool; + + Attribute(byte tag, int name_index, int length, ConstantPool constant_pool) { + this.tag = tag; + this.name_index = name_index; + this.length = length; + this.constant_pool = constant_pool; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public abstract void accept(Visitor v); + + /** + * Dump attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public void dump(DataOutputStream file) throws IOException + { + file.writeShort(name_index); + file.writeInt(length); + } + + /* Class method reads one attribute from the input data stream. + * This method must not be accessible from the outside. It is + * called by the Field and Method constructor methods. + * + * @see Field + * @see Method + * @param file Input stream + * @param constant_pool Array of constants + * @return Attribute + * @throw IOException + * @throw ClassFormatError + * @throw InternalError + */ + static final Attribute readAttribute(DataInputStream file, + ConstantPool constant_pool) + throws IOException, ClassFormatError, InternalError + { + ConstantUtf8 c; + String name; + int name_index; + int length; + byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute + + // Get class name from constant pool via `name_index' indirection + name_index = (int)(file.readUnsignedShort()); + c = (ConstantUtf8)constant_pool.getConstant(name_index, + Constants.CONSTANT_Utf8); + name = c.getBytes(); + + // Length of data in bytes + length = file.readInt(); + + // Compare strings to find known attribute + for(byte i=0; i < Constants.KNOWN_ATTRIBUTES; i++) { + if(name.equals(Constants.ATTRIBUTE_NAMES[i])) { + tag = i; // found! + break; + } + } + + // Call proper constructor, depending on `tag' + switch(tag) { + case Constants.ATTR_UNKNOWN: + return new Unknown(name_index, length, file, constant_pool); + + case Constants.ATTR_CONSTANT_VALUE: + return new ConstantValue(name_index, length, file, constant_pool); + + case Constants.ATTR_SOURCE_FILE: + return new SourceFile(name_index, length, file, constant_pool); + + case Constants.ATTR_CODE: + return new Code(name_index, length, file, constant_pool); + + case Constants.ATTR_EXCEPTIONS: + return new ExceptionTable(name_index, length, file, constant_pool); + + case Constants.ATTR_LINE_NUMBER_TABLE: + return new LineNumberTable(name_index, length, file, constant_pool); + + case Constants.ATTR_LOCAL_VARIABLE_TABLE: + return new LocalVariableTable(name_index, length, file, constant_pool); + + case Constants.ATTR_INNER_CLASSES: + return new InnerClasses(name_index, length, file, constant_pool); + + case Constants.ATTR_SYNTHETIC: + return new Synthetic(name_index, length, file, constant_pool); + + case Constants.ATTR_DEPRECATED: + return new Deprecated(name_index, length, file, constant_pool); + + case Constants.ATTR_PMG: + return new PMGClass(name_index, length, file, constant_pool); + + case Constants.ATTR_SIGNATURE: + return new Signature(name_index, length, file, constant_pool); + + case Constants.ATTR_STACK_MAP: + return new StackMap(name_index, length, file, constant_pool); + + default: // Never reached + throw new InternalError("Ooops! default case reached."); + } + } + + /** + * @return Length of attribute field in bytes. + */ + public final int getLength() { return length; } + + /** + * @param Attribute length in bytes. + */ + public final void setLength(int length) { + this.length = length; + } + + /** + * @param name_index of attribute. + */ + public final void setNameIndex(int name_index) { + this.name_index = name_index; + } + + /** + * @return Name index in constant pool of attribute name. + */ + public final int getNameIndex() { return name_index; } + + /** + * @return Tag of attribute, i.e., its type. Value may not be altered, thus + * there is no setTag() method. + */ + public final byte getTag() { return tag; } + + /** + * @return Constant pool used by this object. + * @see ConstantPool + */ + public final ConstantPool getConstantPool() { return constant_pool; } + + /** + * @param constant_pool Constant pool to be used for this object. + * @see ConstantPool + */ + public final void setConstantPool(ConstantPool constant_pool) { + this.constant_pool = constant_pool; + } + + /** + * Use copy() if you want to have a deep copy(), i.e., with all references + * copied correctly. + * + * @return shallow copy of this attribute + */ + public Object clone() { + Object o = null; + + try { + o = super.clone(); + } catch(CloneNotSupportedException e) { + e.printStackTrace(); // Never occurs + } + + return o; + } + + /** + * @return deep copy of this attribute + */ + public abstract Attribute copy(ConstantPool constant_pool); + + /** + * @return attribute name. + */ + public String toString() { + return Constants.ATTRIBUTE_NAMES[tag]; + } +} diff --git a/src/java/org/apache/bcel/classfile/ClassParser.java b/src/java/org/apache/bcel/classfile/ClassParser.java new file mode 100644 index 00000000..68801453 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ClassParser.java @@ -0,0 +1,329 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; +import java.util.zip.*; + +/** + * Wrapper class that parses a given Java .class file. The method + * parse returns a + * + * JavaClass object on success. When an I/O error or an + * inconsistency occurs an appropiate exception is propagated back + * to the caller. + * + * The structure and the names comply, except for a few conveniences, + * exactly with the + * JVM specification 1.0. See this paper for + * further details about the structure of a bytecode file. + * + * @version $Id$ + * @author M. Dahm + */ +public final class ClassParser { + private DataInputStream file; + private ZipFile zip; + private String file_name; + private int class_name_index, superclass_name_index; + private int major, minor; // Compiler version + private int access_flags; // Access rights of parsed class + private int[] interfaces; // Names of implemented interfaces + private ConstantPool constant_pool; // collection of constants + private Field[] fields; // class fields, i.e., its variables + private Method[] methods; // methods defined in the class + private Attribute[] attributes; // attributes defined in the class + private boolean is_zip; // Loaded from zip file + + private static final int BUFSIZE = 8192; + + /** + * Parse class from the given stream. + * + * @param file Input stream + * @param file_name File name + */ + public ClassParser(InputStream file, String file_name) { + this.file_name = file_name; + + String clazz = file.getClass().getName(); // Not a very clean solution ... + is_zip = clazz.startsWith("java.util.zip.") || clazz.startsWith("java.util.jar."); + + if(file instanceof DataInputStream) // Is already a data stream + this.file = (DataInputStream)file; + else + this.file = new DataInputStream(new BufferedInputStream(file, BUFSIZE)); + } + + /** Parse class from given .class file. + * + * @param file_name file name + * @throw IOException + */ + public ClassParser(String file_name) throws IOException + { + is_zip = false; + this.file_name = file_name; + file = new DataInputStream(new BufferedInputStream + (new FileInputStream(file_name), BUFSIZE)); + } + + /** Parse class from given .class file in a ZIP-archive + * + * @param file_name file name + * @throw IOException + */ + public ClassParser(String zip_file, String file_name) throws IOException + { + is_zip = true; + zip = new ZipFile(zip_file); + ZipEntry entry = zip.getEntry(file_name); + + this.file_name = file_name; + + file = new DataInputStream(new BufferedInputStream(zip.getInputStream(entry), + BUFSIZE)); + } + + /** + * Parse the given Java class file and return an object that represents + * the contained data, i.e., constants, methods, fields and commands. + * A ClassFormatError is raised, if the file is not a valid + * .class file. (This does not include verification of the byte code as it + * is performed by the java interpreter). + * + * @return Class object representing the parsed class file + * @throw IOException + * @throw ClassFormatError + */ + public JavaClass parse() throws IOException, ClassFormatError + { + /****************** Read headers ********************************/ + // Check magic tag of class file + readID(); + + // Get compiler version + readVersion(); + + /****************** Read constant pool and related **************/ + // Read constant pool entries + readConstantPool(); + + // Get class information + readClassInfo(); + + // Get interface information, i.e., implemented interfaces + readInterfaces(); + + /****************** Read class fields and methods ***************/ + // Read class fields, i.e., the variables of the class + readFields(); + + // Read class methods, i.e., the functions in the class + readMethods(); + + // Read class attributes + readAttributes(); + + // Check for unknown variables + //Unknown[] u = Unknown.getUnknownAttributes(); + //for(int i=0; i < u.length; i++) + // System.err.println("WARNING: " + u[i]); + + // Everything should have been read now + // if(file.available() > 0) { + // int bytes = file.available(); + // byte[] buf = new byte[bytes]; + // file.read(buf); + + // if(!(is_zip && (buf.length == 1))) { + // System.err.println("WARNING: Trailing garbage at end of " + file_name); + // System.err.println(bytes + " extra bytes: " + Utility.toHexString(buf)); + // } + // } + + // Read everything of interest, so close the file + file.close(); + if(zip != null) + zip.close(); + + // Return the information we have gathered in a new object + return new JavaClass(class_name_index, superclass_name_index, + file_name, major, minor, access_flags, + constant_pool, interfaces, fields, + methods, attributes, is_zip? JavaClass.ZIP : JavaClass.FILE); + } + + /** + * Read information about the attributes of the attributes of the class. + * @throw IOException + * @throw ClassFormatError + */ + private final void readAttributes() throws IOException, ClassFormatError + { + int attributes_count; + + attributes_count = file.readUnsignedShort(); + attributes = new Attribute[attributes_count]; + + for(int i=0; i < attributes_count; i++) + attributes[i] = Attribute.readAttribute(file, constant_pool); + } + + /** + * Read information about the class and its super class. + * @throw IOException + * @throw ClassFormatError + */ + private final void readClassInfo() throws IOException, ClassFormatError + { + access_flags = file.readUnsignedShort(); + + /* Interfaces are implicitely abstract, the flag should be set + * according to the JVM specification. + */ + if((access_flags & Constants.ACC_INTERFACE) != 0) + access_flags |= Constants.ACC_ABSTRACT; + + if(((access_flags & Constants.ACC_ABSTRACT) != 0) && + ((access_flags & Constants.ACC_FINAL) != 0 )) + throw new ClassFormatError("Class can't be both final and abstract"); + + class_name_index = file.readUnsignedShort(); + superclass_name_index = file.readUnsignedShort(); + } + /** + * Read constant pool entries. + * @throw IOException + * @throw ClassFormatError + */ + private final void readConstantPool() throws IOException, ClassFormatError + { + constant_pool = new ConstantPool(file); + } + + /** + * Read information about the fields of the class, i.e., its variables. + * @throw IOException + * @throw ClassFormatError + */ + private final void readFields() throws IOException, ClassFormatError + { + int fields_count; + + fields_count = file.readUnsignedShort(); + fields = new Field[fields_count]; + + for(int i=0; i < fields_count; i++) + fields[i] = new Field(file, constant_pool); + } + + /******************** Private utility methods **********************/ + + /** + * Check whether the header of the file is ok. + * Of course, this has to be the first action on successive file reads. + * @throw IOException + * @throw ClassFormatError + */ + private final void readID() throws IOException, ClassFormatError + { + int magic = 0xCAFEBABE; + + if(file.readInt() != magic) + throw new ClassFormatError(file_name + " is not a Java .class file"); + } + /** + * Read information about the interfaces implemented by this class. + * @throw IOException + * @throw ClassFormatError + */ + private final void readInterfaces() throws IOException, ClassFormatError + { + int interfaces_count; + + interfaces_count = file.readUnsignedShort(); + interfaces = new int[interfaces_count]; + + for(int i=0; i < interfaces_count; i++) + interfaces[i] = file.readUnsignedShort(); + } + /** + * Read information about the methods of the class. + * @throw IOException + * @throw ClassFormatError + */ + private final void readMethods() throws IOException, ClassFormatError + { + int methods_count; + + methods_count = file.readUnsignedShort(); + methods = new Method[methods_count]; + + for(int i=0; i < methods_count; i++) + methods[i] = new Method(file, constant_pool); + } + /** + * Read major and minor version of compiler which created the file. + * @throw IOException + * @throw ClassFormatError + */ + private final void readVersion() throws IOException, ClassFormatError + { + minor = file.readUnsignedShort(); + major = file.readUnsignedShort(); + } +} diff --git a/src/java/org/apache/bcel/classfile/Code.java b/src/java/org/apache/bcel/classfile/Code.java new file mode 100644 index 00000000..84f2efe7 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Code.java @@ -0,0 +1,373 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents a chunk of Java byte code contained in a + * method. It is instantiated by the + * Attribute.readAttribute() method. A Code + * attribute contains informations about operand stack, local + * variables, byte code and the exceptions handled within this + * method. + * + * This attribute has attributes itself, namely LineNumberTable which + * is used for debugging purposes and LocalVariableTable which + * contains information about the local variables. + * + * @version $Id$ + * @author M. Dahm + * @see Attribute + * @see CodeException + * @see LineNumberTable + * @see LocalVariableTable + */ +public final class Code extends Attribute { + private int max_stack; // Maximum size of stack used by this method + private int max_locals; // Number of local variables + private int code_length; // Length of code in bytes + private byte[] code; // Actual byte code + + private int exception_table_length; + private CodeException[] exception_table; // Table of handled exceptions + private int attributes_count; // Attributes of code: LineNumber + private Attribute[] attributes; // or LocalVariable + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use copy() for a physical copy. + */ + public Code(Code c) { + this(c.getNameIndex(), c.getLength(), c.getMaxStack(), c.getMaxLocals(), + c.getCode(), c.getExceptionTable(), c.getAttributes(), + c.getConstantPool()); + } + + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + Code(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + // Initialize with some default values which will be overwritten later + this(name_index, length, + file.readUnsignedShort(), file.readUnsignedShort(), + (byte[])null, (CodeException[])null, (Attribute[])null, + constant_pool); + + code_length = file.readInt(); + code = new byte[code_length]; // Read byte code + file.readFully(code); + + /* Read exception table that contains all regions where an exception + * handler is active, i.e., a try { ... } catch() block. + */ + exception_table_length = file.readUnsignedShort(); + exception_table = new CodeException[exception_table_length]; + + for(int i=0; i < exception_table_length; i++) + exception_table[i] = new CodeException(file); + + /* Read all attributes, currently `LineNumberTable' and + * `LocalVariableTable' + */ + attributes_count = file.readUnsignedShort(); + attributes = new Attribute[attributes_count]; + for(int i=0; i < attributes_count; i++) + attributes[i] = Attribute.readAttribute(file, constant_pool); + + /* Adjust length, because of setAttributes in this(), s.b. length + * is incorrect, because it didn't take the internal attributes + * into account yet! Very subtle bug, fixed in 3.1.1. + */ + this.length = length; + } + + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param max_stack Maximum size of stack + * @param max_locals Number of local variables + * @param code Actual byte code + * @param exception_table Table of handled exceptions + * @param attributes Attributes of code: LineNumber or LocalVariable + * @param constant_pool Array of constants + */ + public Code(int name_index, int length, + int max_stack, int max_locals, + byte[] code, + CodeException[] exception_table, + Attribute[] attributes, + ConstantPool constant_pool) + { + super(Constants.ATTR_CODE, name_index, length, constant_pool); + + this.max_stack = max_stack; + this.max_locals = max_locals; + + setCode(code); + setExceptionTable(exception_table); + setAttributes(attributes); // Overwrites length! + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitCode(this); + } + + /** + * Dump code attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + + file.writeShort(max_stack); + file.writeShort(max_locals); + file.writeInt(code_length); + file.write(code, 0, code_length); + + file.writeShort(exception_table_length); + for(int i=0; i < exception_table_length; i++) + exception_table[i].dump(file); + + file.writeShort(attributes_count); + for(int i=0; i < attributes_count; i++) + attributes[i].dump(file); + } + + /** + * @return Collection of code attributes. + * @see Attribute + */ + public final Attribute[] getAttributes() { return attributes; } + + /** + * @return LineNumberTable of Code, if it has one + */ + public LineNumberTable getLineNumberTable() { + for(int i=0; i < attributes_count; i++) + if(attributes[i] instanceof LineNumberTable) + return (LineNumberTable)attributes[i]; + + return null; + } + + /** + * @return LocalVariableTable of Code, if it has one + */ + public LocalVariableTable getLocalVariableTable() { + for(int i=0; i < attributes_count; i++) + if(attributes[i] instanceof LocalVariableTable) + return (LocalVariableTable)attributes[i]; + + return null; + } + + /** + * @return Actual byte code of the method. + */ + public final byte[] getCode() { return code; } + + /** + * @return Table of handled exceptions. + * @see CodeException + */ + public final CodeException[] getExceptionTable() { return exception_table; } + + /** + * @return Number of local variables. + */ + public final int getMaxLocals() { return max_locals; } + + /** + * @return Maximum size of stack used by this method. + */ + + public final int getMaxStack() { return max_stack; } + + /** + * @return the internal length of this code attribute (minus the first 6 bytes) + * and excluding all its attributes + */ + private final int getInternalLength() { + return 2 /*max_stack*/ + 2 /*max_locals*/ + 4 /*code length*/ + + code_length /*byte-code*/ + + 2 /*exception-table length*/ + + 8 * exception_table_length /* exception table */ + + 2 /* attributes count */; + } + + /** + * @return the full size of this code attribute, minus its first 6 bytes, + * including the size of all its contained attributes + */ + private final int calculateLength() { + int len = 0; + + for(int i=0; i < attributes_count; i++) + len += attributes[i].length + 6 /*attribute header size*/; + + return len + getInternalLength(); + } + + /** + * @param attributes. + */ + public final void setAttributes(Attribute[] attributes) { + this.attributes = attributes; + attributes_count = (attributes == null)? 0 : attributes.length; + length = calculateLength(); // Adjust length + } + + /** + * @param code byte code + */ + public final void setCode(byte[] code) { + this.code = code; + code_length = (code == null)? 0 : code.length; + } + + /** + * @param exception_table exception table + */ + public final void setExceptionTable(CodeException[] exception_table) { + this.exception_table = exception_table; + exception_table_length = (exception_table == null)? 0 : + exception_table.length; + } + + /** + * @param max_locals maximum number of local variables + */ + public final void setMaxLocals(int max_locals) { + this.max_locals = max_locals; + } + + /** + * @param max_stack maximum stack size + */ + public final void setMaxStack(int max_stack) { + this.max_stack = max_stack; + } + + /** + * @return String representation of code chunk. + */ + public final String toString(boolean verbose) { + StringBuffer buf; + + buf = new StringBuffer("Code(max_stack = " + max_stack + + ", max_locals = " + max_locals + + ", code_length = " + code_length + ")\n" + + Utility.codeToString(code, constant_pool, 0, -1, verbose)); + + if(exception_table_length > 0) { + buf.append("\nException handler(s) = \n" + "From\tTo\tHandler\tType\n"); + + for(int i=0; i < exception_table_length; i++) + buf.append(exception_table[i].toString(constant_pool, verbose) + "\n"); + } + + if(attributes_count > 0) { + buf.append("\nAttribute(s) = \n"); + + for(int i=0; i < attributes_count; i++) + buf.append(attributes[i].toString() + "\n"); + } + + return buf.toString(); + } + + /** + * @return String representation of code chunk. + */ + public final String toString() { + return toString(true); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + Code c = (Code)clone(); + c.code = (byte[])code.clone(); + c.constant_pool = constant_pool; + + c.exception_table = new CodeException[exception_table_length]; + for(int i=0; i < exception_table_length; i++) + c.exception_table[i] = exception_table[i].copy(); + + c.attributes = new Attribute[attributes_count]; + for(int i=0; i < attributes_count; i++) + c.attributes[i] = attributes[i].copy(constant_pool); + + return c; + } +} diff --git a/src/java/org/apache/bcel/classfile/CodeException.java b/src/java/org/apache/bcel/classfile/CodeException.java new file mode 100644 index 00000000..c3bb946e --- /dev/null +++ b/src/java/org/apache/bcel/classfile/CodeException.java @@ -0,0 +1,227 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents an entry in the exception table of the Code + * attribute and is used only there. It contains a range in which a + * particular exception handler is active. + * + * @version $Id$ + * @author M. Dahm + * @see Code + */ +public final class CodeException implements Cloneable, Constants, Node { + private int start_pc; // Range in the code the exception handler is + private int end_pc; // active. start_pc is inclusive, end_pc exclusive + private int handler_pc; /* Starting address of exception handler, i.e., + * an offset from start of code. + */ + private int catch_type; /* If this is zero the handler catches any + * exception, otherwise it points to the + * exception class which is to be caught. + */ + /** + * Initialize from another object. + */ + public CodeException(CodeException c) { + this(c.getStartPC(), c.getEndPC(), c.getHandlerPC(), c.getCatchType()); + } + + /** + * Construct object from file stream. + * @param file Input stream + * @throw IOException + */ + CodeException(DataInputStream file) throws IOException + { + this(file.readUnsignedShort(), file.readUnsignedShort(), + file.readUnsignedShort(), file.readUnsignedShort()); + } + + /** + * @param start_pc Range in the code the exception handler is active, + * start_pc is inclusive while + * @param end_pc is exclusive + * @param handler_pc Starting address of exception handler, i.e., + * an offset from start of code. + * @param catch_type If zero the handler catches any + * exception, otherwise it points to the exception class which is + * to be caught. + */ + public CodeException(int start_pc, int end_pc, int handler_pc, + int catch_type) + { + this.start_pc = start_pc; + this.end_pc = end_pc; + this.handler_pc = handler_pc; + this.catch_type = catch_type; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitCodeException(this); + } + /** + * Dump code exception to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeShort(start_pc); + file.writeShort(end_pc); + file.writeShort(handler_pc); + file.writeShort(catch_type); + } + + /** + * @return 0, if the handler catches any exception, otherwise it points to + * the exception class which is to be caught. + */ + public final int getCatchType() { return catch_type; } + + /** + * @return Exclusive end index of the region where the handler is active. + */ + public final int getEndPC() { return end_pc; } + + /** + * @return Starting address of exception handler, relative to the code. + */ + public final int getHandlerPC() { return handler_pc; } + + /** + * @return Inclusive start index of the region where the handler is active. + */ + public final int getStartPC() { return start_pc; } + + /** + * @param catch_type. + */ + public final void setCatchType(int catch_type) { + this.catch_type = catch_type; + } + + /** + * @param end_pc end of handled block + */ + public final void setEndPC(int end_pc) { + this.end_pc = end_pc; + } + + /** + * @param handler_pc where the actual code is + */ + public final void setHandlerPC(int handler_pc) { + this.handler_pc = handler_pc; + } + + /** + * @param start_pc start of handled block + */ + public final void setStartPC(int start_pc) { + this.start_pc = start_pc; + } + + /** + * @return String representation. + */ + public final String toString() { + return "CodeException(start_pc = " + start_pc + + ", end_pc = " + end_pc + + ", handler_pc = " + handler_pc + ", catch_type = " + catch_type + ")"; + } + + /** + * @return String representation. + */ + public final String toString(ConstantPool cp, boolean verbose) { + String str; + + if(catch_type == 0) + str = "(0)"; + else + str = Utility.compactClassName(cp.getConstantString(catch_type, CONSTANT_Class), false) + + (verbose? "(" + catch_type + ")" : ""); + + return start_pc + "\t" + end_pc + "\t" + handler_pc + "\t" + str; + } + + public final String toString(ConstantPool cp) { + return toString(cp, true); + } + + /** + * @return deep copy of this object + */ + public CodeException copy() { + try { + return (CodeException)clone(); + } catch(CloneNotSupportedException e) {} + + return null; + } +} diff --git a/src/java/org/apache/bcel/classfile/Constant.java b/src/java/org/apache/bcel/classfile/Constant.java new file mode 100644 index 00000000..62550614 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Constant.java @@ -0,0 +1,148 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * Abstract superclass for classes to represent the different constant types + * in the constant pool of a class file. The classes keep closely to + * the JVM specification. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class Constant implements Cloneable, Node { + /* In fact this tag is redundant since we can distinguish different + * `Constant' objects by their type, i.e., via `instanceof'. In some + * places we will use the tag for switch()es anyway. + * + * First, we want match the specification as closely as possible. Second we + * need the tag as an index to select the corresponding class name from the + * `CONSTANT_NAMES' array. + */ + protected byte tag; + + Constant(byte tag) { this.tag = tag; } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public abstract void accept(Visitor v); + + public abstract void dump(DataOutputStream file) throws IOException; + + /** + * @return Tag of constant, i.e., its type. No setTag() method to avoid + * confusion. + */ + public final byte getTag() { return tag; } + + /** + * @return String representation. + */ + public String toString() { + return Constants.CONSTANT_NAMES[tag] + "[" + tag + "]"; + } + + /** + * @return deep copy of this constant + */ + public Constant copy() { + try { + return (Constant)super.clone(); + } catch(CloneNotSupportedException e) {} + + return null; + } + + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + /** + * Read one constant from the given file, the type depends on a tag byte. + * + * @param file Input stream + * @return Constant object + */ + static final Constant readConstant(DataInputStream file) + throws IOException, ClassFormatError + { + byte b = file.readByte(); // Read tag byte + + switch(b) { + case Constants.CONSTANT_Class: return new ConstantClass(file); + case Constants.CONSTANT_Fieldref: return new ConstantFieldref(file); + case Constants.CONSTANT_Methodref: return new ConstantMethodref(file); + case Constants.CONSTANT_InterfaceMethodref: return new + ConstantInterfaceMethodref(file); + case Constants.CONSTANT_String: return new ConstantString(file); + case Constants.CONSTANT_Integer: return new ConstantInteger(file); + case Constants.CONSTANT_Float: return new ConstantFloat(file); + case Constants.CONSTANT_Long: return new ConstantLong(file); + case Constants.CONSTANT_Double: return new ConstantDouble(file); + case Constants.CONSTANT_NameAndType: return new ConstantNameAndType(file); + case Constants.CONSTANT_Utf8: return new ConstantUtf8(file); + default: + throw new ClassFormatError("Invalid byte tag in constant pool: " + b); + } + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantCP.java b/src/java/org/apache/bcel/classfile/ConstantCP.java new file mode 100644 index 00000000..496c57b5 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantCP.java @@ -0,0 +1,154 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.Constants; + +/** + * Abstract super class for Fieldref and Methodref constants. + * + * @version $Id$ + * @author M. Dahm + * @see ConstantFieldref + * @see ConstantMethodref + * @see ConstantInterfaceMethodref + */ +public abstract class ConstantCP extends Constant { + /** References to the constants containing the class and the field signature + */ + protected int class_index, name_and_type_index; + + /** + * Initialize from another object. + */ + public ConstantCP(ConstantCP c) { + this(c.getTag(), c.getClassIndex(), c.getNameAndTypeIndex()); + } + + /** + * Initialize instance from file data. + * + * @param tag Constant type tag + * @param file Input stream + * @throw IOException + */ + ConstantCP(byte tag, DataInputStream file) throws IOException + { + this(tag, file.readUnsignedShort(), file.readUnsignedShort()); + } + + /** + * @param class_index Reference to the class containing the field + * @param name_and_type_index and the field signature + */ + protected ConstantCP(byte tag, int class_index, + int name_and_type_index) { + super(tag); + this.class_index = class_index; + this.name_and_type_index = name_and_type_index; + } + + /** + * Dump constant field reference to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeByte(tag); + file.writeShort(class_index); + file.writeShort(name_and_type_index); + } + + /** + * @return Reference (index) to class this field or method belongs to. + */ + public final int getClassIndex() { return class_index; } + + /** + * @return Reference (index) to signature of the field. + */ + public final int getNameAndTypeIndex() { return name_and_type_index; } + + /** + * @param class_index points to Constant_class + */ + public final void setClassIndex(int class_index) { + this.class_index = class_index; + } + + /** + * @return Class this field belongs to. + */ + public String getClass(ConstantPool cp) { + return cp.constantToString(class_index, Constants.CONSTANT_Class); + } + + /** + * @param name_and_type_index points to Constant_NameAndType + */ + public final void setNameAndTypeIndex(int name_and_type_index) { + this.name_and_type_index = name_and_type_index; + } + + /** + * @return String representation. + */ + public final String toString() { + return super.toString() + "(class_index = " + class_index + + ", name_and_type_index = " + name_and_type_index + ")"; + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantClass.java b/src/java/org/apache/bcel/classfile/ConstantClass.java new file mode 100644 index 00000000..2ae81538 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantClass.java @@ -0,0 +1,153 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from the abstract + * Constant class + * and represents a reference to a (external) class. + * + * @version $Id$ + * @author M. Dahm + * @see Constant + */ +public final class ConstantClass extends Constant implements ConstantObject { + private int name_index; // Identical to ConstantString except for the name + + /** + * Initialize from another object. + */ + public ConstantClass(ConstantClass c) { + this(c.getNameIndex()); + } + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throw IOException + */ + ConstantClass(DataInputStream file) throws IOException + { + this(file.readUnsignedShort()); + } + + /** + * @param name_index Name index in constant pool + */ + public ConstantClass(int name_index) { + super(Constants.CONSTANT_Class); + this.name_index = name_index; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantClass(this); + } + + /** + * Dump constant class to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeByte(tag); + file.writeShort(name_index); + } + + /** + * @return Name index in constant pool of class name. + */ + public final int getNameIndex() { return name_index; } + + /** + * @param name_index. + */ + public final void setNameIndex(int name_index) { + this.name_index = name_index; + } + + + /** @return String object + */ + public Object getConstantValue(ConstantPool cp) { + Constant c = cp.getConstant(name_index, Constants.CONSTANT_Utf8); + return ((ConstantUtf8)c).getBytes(); + } + + /** @return dereferenced string + */ + public String getBytes(ConstantPool cp) { + return (String)getConstantValue(cp); + } + + /** + * @return String representation. + */ + public final String toString() { + return super.toString() + "(name_index = " + name_index + ")"; + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantDouble.java b/src/java/org/apache/bcel/classfile/ConstantDouble.java new file mode 100644 index 00000000..145928fd --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantDouble.java @@ -0,0 +1,142 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from the abstract + * Constant class + * and represents a reference to a Double object. + * + * @version $Id$ + * @author M. Dahm + * @see Constant + */ +public final class ConstantDouble extends Constant implements ConstantObject { + private double bytes; + + /** + * @param bytes Data + */ + public ConstantDouble(double bytes) { + super(Constants.CONSTANT_Double); + this.bytes = bytes; + } + + /** + * Initialize from another object. + */ + public ConstantDouble(ConstantDouble c) { + this(c.getBytes()); + } + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throw IOException + */ + ConstantDouble(DataInputStream file) throws IOException + { + this(file.readDouble()); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantDouble(this); + } + /** + * Dump constant double to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeByte(tag); + file.writeDouble(bytes); + } + /** + * @return data, i.e., 8 bytes. + */ + public final double getBytes() { return bytes; } + /** + * @param bytes. + */ + public final void setBytes(double bytes) { + this.bytes = bytes; + } + /** + * @return String representation. + */ + public final String toString() + { + return super.toString() + "(bytes = " + bytes + ")"; + } + + /** @return Double object + */ + public Object getConstantValue(ConstantPool cp) { + return new Double(bytes); + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/java/org/apache/bcel/classfile/ConstantFieldref.java new file mode 100644 index 00000000..7ebd17c2 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantFieldref.java @@ -0,0 +1,104 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents a constant pool reference to a field. + * + * @version $Id$ + * @author M. Dahm + */ +public final class ConstantFieldref extends ConstantCP { + /** + * Initialize from another object. + */ + public ConstantFieldref(ConstantFieldref c) { + super(Constants.CONSTANT_Fieldref, c.getClassIndex(), c.getNameAndTypeIndex()); + } + + /** + * Initialize instance from file data. + * + * @param file input stream + * @throw IOException + */ + ConstantFieldref(DataInputStream file) throws IOException + { + super(Constants.CONSTANT_Fieldref, file); + } + + /** + * @param class_index Reference to the class containing the Field + * @param name_and_type_index and the Field signature + */ + public ConstantFieldref(int class_index, + int name_and_type_index) { + super(Constants.CONSTANT_Fieldref, class_index, name_and_type_index); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of Fields, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantFieldref(this); + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantFloat.java b/src/java/org/apache/bcel/classfile/ConstantFloat.java new file mode 100644 index 00000000..5df62c1b --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantFloat.java @@ -0,0 +1,141 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from the abstract + * Constant class + * and represents a reference to a float object. + * + * @version $Id$ + * @author M. Dahm + * @see Constant + */ +public final class ConstantFloat extends Constant implements ConstantObject { + private float bytes; + + /** + * @param bytes Data + */ + public ConstantFloat(float bytes) + { + super(Constants.CONSTANT_Float); + this.bytes = bytes; + } + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public ConstantFloat(ConstantFloat c) { + this(c.getBytes()); + } + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throw IOException + */ + ConstantFloat(DataInputStream file) throws IOException + { + this(file.readFloat()); + } + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantFloat(this); + } + /** + * Dump constant float to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeByte(tag); + file.writeFloat(bytes); + } + /** + * @return data, i.e., 4 bytes. + */ + public final float getBytes() { return bytes; } + /** + * @param bytes. + */ + public final void setBytes(float bytes) { + this.bytes = bytes; + } + + /** + * @return String representation. + */ + public final String toString() { + return super.toString() + "(bytes = " + bytes + ")"; + } + + /** @return Float object + */ + public Object getConstantValue(ConstantPool cp) { + return new Float(bytes); + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantInteger.java b/src/java/org/apache/bcel/classfile/ConstantInteger.java new file mode 100644 index 00000000..a8b9e2d2 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantInteger.java @@ -0,0 +1,148 @@ + +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from the abstract + * Constant class + * and represents a reference to an int object. + * + * @version $Id$ + * @author M. Dahm + * @see Constant + */ +public final class ConstantInteger extends Constant implements ConstantObject { + private int bytes; + + /** + * @param bytes Data + */ + public ConstantInteger(int bytes) + { + super(Constants.CONSTANT_Integer); + this.bytes = bytes; + } + + /** + * Initialize from another object. + */ + public ConstantInteger(ConstantInteger c) { + this(c.getBytes()); + } + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throw IOException + */ + ConstantInteger(DataInputStream file) throws IOException + { + this(file.readInt()); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantInteger(this); + } + + /** + * Dump constant integer to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeByte(tag); + file.writeInt(bytes); + } + + /** + * @return data, i.e., 4 bytes. + */ + public final int getBytes() { return bytes; } + + /** + * @param bytes. + */ + public final void setBytes(int bytes) { + this.bytes = bytes; + } + + /** + * @return String representation. + */ + public final String toString() { + return super.toString() + "(bytes = " + bytes + ")"; + } + + /** @return Integer object + */ + public Object getConstantValue(ConstantPool cp) { + return new Integer(bytes); + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java new file mode 100644 index 00000000..f3fba280 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java @@ -0,0 +1,104 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents a constant pool reference to an interface method. + * + * @version $Id$ + * @author M. Dahm + */ +public final class ConstantInterfaceMethodref extends ConstantCP { + /** + * Initialize from another object. + */ + public ConstantInterfaceMethodref(ConstantInterfaceMethodref c) { + super(Constants.CONSTANT_InterfaceMethodref, c.getClassIndex(), c.getNameAndTypeIndex()); + } + + /** + * Initialize instance from file data. + * + * @param file input stream + * @throw IOException + */ + ConstantInterfaceMethodref(DataInputStream file) throws IOException + { + super(Constants.CONSTANT_InterfaceMethodref, file); + } + + /** + * @param class_index Reference to the class containing the method + * @param name_and_type_index and the method signature + */ + public ConstantInterfaceMethodref(int class_index, + int name_and_type_index) { + super(Constants.CONSTANT_InterfaceMethodref, class_index, name_and_type_index); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantInterfaceMethodref(this); + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantLong.java b/src/java/org/apache/bcel/classfile/ConstantLong.java new file mode 100644 index 00000000..db521f78 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantLong.java @@ -0,0 +1,139 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from the abstract + * Constant class + * and represents a reference to a long object. + * + * @version $Id$ + * @author M. Dahm + * @see Constant + */ +public final class ConstantLong extends Constant implements ConstantObject { + private long bytes; + + /** + * @param bytes Data + */ + public ConstantLong(long bytes) + { + super(Constants.CONSTANT_Long); + this.bytes = bytes; + } + /** + * Initialize from another object. + */ + public ConstantLong(ConstantLong c) { + this(c.getBytes()); + } + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throw IOException + */ + ConstantLong(DataInputStream file) throws IOException + { + this(file.readLong()); + } + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantLong(this); + } + /** + * Dump constant long to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeByte(tag); + file.writeLong(bytes); + } + /** + * @return data, i.e., 8 bytes. + */ + public final long getBytes() { return bytes; } + /** + * @param bytes. + */ + public final void setBytes(long bytes) { + this.bytes = bytes; + } + /** + * @return String representation. + */ + public final String toString() { + return super.toString() + "(bytes = " + bytes + ")"; + } + + /** @return Long object + */ + public Object getConstantValue(ConstantPool cp) { + return new Long(bytes); + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/java/org/apache/bcel/classfile/ConstantMethodref.java new file mode 100644 index 00000000..05992167 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantMethodref.java @@ -0,0 +1,104 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents a constant pool reference to a method. + * + * @version $Id$ + * @author M. Dahm + */ +public final class ConstantMethodref extends ConstantCP { + /** + * Initialize from another object. + */ + public ConstantMethodref(ConstantMethodref c) { + super(Constants.CONSTANT_Methodref, c.getClassIndex(), c.getNameAndTypeIndex()); + } + + /** + * Initialize instance from file data. + * + * @param file input stream + * @throw IOException + */ + ConstantMethodref(DataInputStream file) throws IOException + { + super(Constants.CONSTANT_Methodref, file); + } + + /** + * @param class_index Reference to the class containing the method + * @param name_and_type_index and the method signature + */ + public ConstantMethodref(int class_index, + int name_and_type_index) { + super(Constants.CONSTANT_Methodref, class_index, name_and_type_index); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantMethodref(this); + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/java/org/apache/bcel/classfile/ConstantNameAndType.java new file mode 100644 index 00000000..8de59337 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantNameAndType.java @@ -0,0 +1,171 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from the abstract + * Constant class + * and represents a reference to the name and signature + * of a field or method. + * + * @version $Id$ + * @author M. Dahm + * @see Constant + */ +public final class ConstantNameAndType extends Constant { + private int name_index; // Name of field/method + private int signature_index; // and its signature. + + /** + * Initialize from another object. + */ + public ConstantNameAndType(ConstantNameAndType c) { + this(c.getNameIndex(), c.getSignatureIndex()); + } + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throw IOException + */ + ConstantNameAndType(DataInputStream file) throws IOException + { + this((int)file.readUnsignedShort(), (int)file.readUnsignedShort()); + } + + /** + * @param name_index Name of field/method + * @param signature_index and its signature + */ + public ConstantNameAndType(int name_index, + int signature_index) + { + super(Constants.CONSTANT_NameAndType); + this.name_index = name_index; + this.signature_index = signature_index; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantNameAndType(this); + } + + /** + * Dump name and signature index to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeByte(tag); + file.writeShort(name_index); + file.writeShort(signature_index); + } + + /** + * @return Name index in constant pool of field/method name. + */ + public final int getNameIndex() { return name_index; } + + /** @return name + */ + public final String getName(ConstantPool cp) { + return cp.constantToString(getNameIndex(), Constants.CONSTANT_Utf8); + } + + /** + * @return Index in constant pool of field/method signature. + */ + public final int getSignatureIndex() { return signature_index; } + + /** @return signature + */ + public final String getSignature(ConstantPool cp) { + return cp.constantToString(getSignatureIndex(), Constants.CONSTANT_Utf8); + } + + /** + * @param name_index. + */ + public final void setNameIndex(int name_index) { + this.name_index = name_index; + } + + /** + * @param signature_index. + */ + public final void setSignatureIndex(int signature_index) { + this.signature_index = signature_index; + } + + /** + * @return String representation + */ + public final String toString() { + return super.toString() + "(name_index = " + name_index + + ", signature_index = " + signature_index + ")"; + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantObject.java b/src/java/org/apache/bcel/classfile/ConstantObject.java new file mode 100644 index 00000000..ff41502c --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantObject.java @@ -0,0 +1,69 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * This interface denotes those constants that have a "natural" value, + * such as ConstantLong, ConstantString, etc.. + * + * @version $Id$ + * @author M. Dahm + * @see Constant + */ +public interface ConstantObject { + /** @return object representing the constant, e.g., Long for ConstantLong + */ + public abstract Object getConstantValue(ConstantPool cp); +} diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/java/org/apache/bcel/classfile/ConstantPool.java new file mode 100644 index 00000000..a10ad43f --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantPool.java @@ -0,0 +1,369 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents the constant pool, i.e., a table of constants. + * It may contain null references, due to the JVM specification that skips + * an entry after an 8-byte constant (double, long) entry. + * + * @version $Id$ + * @see Constant + * @author M. Dahm + */ +public class ConstantPool implements Cloneable, Node { + private int constant_pool_count; + private Constant[] constant_pool; + + /** + * @param constant_pool Array of constants + */ + public ConstantPool(Constant[] constant_pool) + { + setConstantPool(constant_pool); + } + + /** + * Read constants from given file stream. + * + * @param file Input stream + * @throw IOException + * @throw ClassFormatError + */ + ConstantPool(DataInputStream file) throws IOException, ClassFormatError + { + byte tag; + + constant_pool_count = file.readUnsignedShort(); + constant_pool = new Constant[constant_pool_count]; + + /* constant_pool[0] is unused by the compiler and may be used freely + * by the implementation. + */ + for(int i=1; i < constant_pool_count; i++) { + constant_pool[i] = Constant.readConstant(file); + + /* Quote from the JVM specification: + * "All eight byte constants take up two spots in the constant pool. + * If this is the n'th byte in the constant pool, then the next item + * will be numbered n+2" + * + * Thus we have to increment the index counter. + */ + tag = constant_pool[i].getTag(); + if((tag == Constants.CONSTANT_Double) || (tag == Constants.CONSTANT_Long)) + i++; + } + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantPool(this); + } + + /** + * Resolve constant to a string representation. + * + * @param constant Constant to be printed + * @return String representation + */ + public String constantToString(Constant c) + throws ClassFormatError + { + String str; + int i; + byte tag = c.getTag(); + + switch(tag) { + case Constants.CONSTANT_Class: + i = ((ConstantClass)c).getNameIndex(); + c = getConstant(i, Constants.CONSTANT_Utf8); + str = Utility.compactClassName(((ConstantUtf8)c).getBytes(), false); + break; + + case Constants.CONSTANT_String: + i = ((ConstantString)c).getStringIndex(); + c = getConstant(i, Constants.CONSTANT_Utf8); + str = "\"" + escape(((ConstantUtf8)c).getBytes()) + "\""; + break; + + case Constants.CONSTANT_Utf8: str = ((ConstantUtf8)c).getBytes(); break; + case Constants.CONSTANT_Double: str = "" + ((ConstantDouble)c).getBytes(); break; + case Constants.CONSTANT_Float: str = "" + ((ConstantFloat)c).getBytes(); break; + case Constants.CONSTANT_Long: str = "" + ((ConstantLong)c).getBytes(); break; + case Constants.CONSTANT_Integer: str = "" + ((ConstantInteger)c).getBytes(); break; + + case Constants.CONSTANT_NameAndType: + str = (constantToString(((ConstantNameAndType)c).getNameIndex(), + Constants.CONSTANT_Utf8) + " " + + constantToString(((ConstantNameAndType)c).getSignatureIndex(), + Constants.CONSTANT_Utf8)); + break; + + case Constants.CONSTANT_InterfaceMethodref: case Constants.CONSTANT_Methodref: + case Constants.CONSTANT_Fieldref: + str = (constantToString(((ConstantCP)c).getClassIndex(), + Constants.CONSTANT_Class) + "." + + constantToString(((ConstantCP)c).getNameAndTypeIndex(), + Constants.CONSTANT_NameAndType)); + break; + + default: // Never reached + throw new RuntimeException("Unknown constant type " + tag); + } + + return str; + } + + private static final String escape(String str) { + int len = str.length(); + StringBuffer buf = new StringBuffer(len + 5); + char[] ch = str.toCharArray(); + + for(int i=0; i < len; i++) { + switch(ch[i]) { + case '\n' : buf.append("\\n"); break; + case '\r' : buf.append("\\r"); break; + case '\t' : buf.append("\\t"); break; + case '\b' : buf.append("\\b"); break; + case '"' : buf.append("\\\""); break; + default: buf.append(ch[i]); + } + } + + return buf.toString(); + } + + + /** + * Retrieve constant at `index' from constant pool and resolve it to + * a string representation. + * + * @param index of constant in constant pool + * @param tag expected type + * @return String representation + */ + public String constantToString(int index, byte tag) + throws ClassFormatError + { + Constant c = getConstant(index, tag); + return constantToString(c); + } + + /** + * Dump constant pool to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public void dump(DataOutputStream file) throws IOException + { + file.writeShort(constant_pool_count); + + for(int i=1; i < constant_pool_count; i++) + if(constant_pool[i] != null) + constant_pool[i].dump(file); + } + + /** + * Get constant from constant pool. + * + * @param index Index in constant pool + * @return Constant value + * @see Constant + */ + public Constant getConstant(int index) { + if (index >= constant_pool.length || index < 0) + throw new ClassFormatError("Invalid constant pool reference: " + + index + ". Constant pool size is: " + + constant_pool.length); + return constant_pool[index]; + } + + /** + * Get constant from constant pool and check whether it has the + * expected type. + * + * @param index Index in constant pool + * @param tag Tag of expected constant, i.e., its type + * @return Constant value + * @see Constant + * @throw ClassFormatError + */ + public Constant getConstant(int index, byte tag) + throws ClassFormatError + { + Constant c; + + c = getConstant(index); + + if(c == null) + throw new ClassFormatError("Constant pool at index " + index + " is null."); + + if(c.getTag() == tag) + return c; + else + throw new ClassFormatError("Expected class `" + Constants.CONSTANT_NAMES[tag] + + "' at index " + index + " and got " + c); + } + + /** + * @return Array of constants. + * @see Constant + */ + public Constant[] getConstantPool() { return constant_pool; } + /** + * Get string from constant pool and bypass the indirection of + * `ConstantClass' and `ConstantString' objects. I.e. these classes have + * an index field that points to another entry of the constant pool of + * type `ConstantUtf8' which contains the real data. + * + * @param index Index in constant pool + * @param tag Tag of expected constant, either ConstantClass or ConstantString + * @return Contents of string reference + * @see ConstantClass + * @see ConstantString + * @throw ClassFormatError + */ + public String getConstantString(int index, byte tag) + throws ClassFormatError + { + Constant c; + int i; + String s; + + c = getConstant(index, tag); + + /* This switch() is not that elegant, since the two classes have the + * same contents, they just differ in the name of the index + * field variable. + * But we want to stick to the JVM naming conventions closely though + * we could have solved these more elegantly by using the same + * variable name or by subclassing. + */ + switch(tag) { + case Constants.CONSTANT_Class: i = ((ConstantClass)c).getNameIndex(); break; + case Constants.CONSTANT_String: i = ((ConstantString)c).getStringIndex(); break; + default: + throw new RuntimeException("getConstantString called with illegal tag " + tag); + } + + // Finally get the string from the constant pool + c = getConstant(i, Constants.CONSTANT_Utf8); + return ((ConstantUtf8)c).getBytes(); + } + /** + * @return Length of constant pool. + */ + public int getLength() + { + return constant_pool_count; + } + + /** + * @param constant Constant to set + */ + public void setConstant(int index, Constant constant) { + constant_pool[index] = constant; + } + + /** + * @param constant_pool + */ + public void setConstantPool(Constant[] constant_pool) { + this.constant_pool = constant_pool; + constant_pool_count = (constant_pool == null)? 0 : constant_pool.length; + } + /** + * @return String representation. + */ + public String toString() { + StringBuffer buf = new StringBuffer(); + + for(int i=1; i < constant_pool_count; i++) + buf.append(i + ")" + constant_pool[i] + "\n"); + + return buf.toString(); + } + + /** + * @return deep copy of this constant pool + */ + public ConstantPool copy() { + ConstantPool c = null; + + try { + c = (ConstantPool)clone(); + } catch(CloneNotSupportedException e) {} + + c.constant_pool = new Constant[constant_pool_count]; + + for(int i=1; i < constant_pool_count; i++) { + if(constant_pool[i] != null) + c.constant_pool[i] = constant_pool[i].copy(); + } + + return c; + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantString.java b/src/java/org/apache/bcel/classfile/ConstantString.java new file mode 100644 index 00000000..3ed78f44 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantString.java @@ -0,0 +1,147 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from the abstract + * Constant class + * and represents a reference to a String object. + * + * @version $Id$ + * @author M. Dahm + * @see Constant + */ +public final class ConstantString extends Constant implements ConstantObject { + private int string_index; // Identical to ConstantClass except for this name + + /** + * Initialize from another object. + */ + public ConstantString(ConstantString c) { + this(c.getStringIndex()); + } + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throw IOException + */ + ConstantString(DataInputStream file) throws IOException + { + this((int)file.readUnsignedShort()); + } + /** + * @param string_index Index of Constant_Utf8 in constant pool + */ + public ConstantString(int string_index) + { + super(Constants.CONSTANT_String); + this.string_index = string_index; + } + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantString(this); + } + /** + * Dump constant field reference to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeByte(tag); + file.writeShort(string_index); + } + /** + * @return Index in constant pool of the string (ConstantUtf8). + */ + public final int getStringIndex() { return string_index; } + /** + * @param string_index. + */ + public final void setStringIndex(int string_index) { + this.string_index = string_index; + } + /** + * @return String representation. + */ + public final String toString() + { + return super.toString() + "(string_index = " + string_index + ")"; + } + + /** @return String object + */ + public Object getConstantValue(ConstantPool cp) { + Constant c = cp.getConstant(string_index, Constants.CONSTANT_Utf8); + return ((ConstantUtf8)c).getBytes(); + } + + /** @return dereferenced string + */ + public String getBytes(ConstantPool cp) { + return (String)getConstantValue(cp); + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/java/org/apache/bcel/classfile/ConstantUtf8.java new file mode 100644 index 00000000..a087d5c6 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -0,0 +1,143 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from the abstract + * Constant class + * and represents a reference to a Utf8 encoded string. + * + * @version $Id$ + * @author M. Dahm + * @see Constant + */ +public final class ConstantUtf8 extends Constant { + private String bytes; + + /** + * Initialize from another object. + */ + public ConstantUtf8(ConstantUtf8 c) { + this(c.getBytes()); + } + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throw IOException + */ + ConstantUtf8(DataInputStream file) throws IOException + { + super(Constants.CONSTANT_Utf8); + + bytes = file.readUTF(); + } + + /** + * @param bytes Data + */ + public ConstantUtf8(String bytes) + { + super(Constants.CONSTANT_Utf8); + this.bytes = bytes; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantUtf8(this); + } + + /** + * Dump String in Utf8 format to file stream. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeByte(tag); + file.writeUTF(bytes); + } + + /** + * @return Data converted to string. + */ + public final String getBytes() { return bytes; } + + /** + * @param bytes. + */ + public final void setBytes(String bytes) { + this.bytes = bytes; + } + + /** + * @return String representation + */ + public final String toString() + { + return super.toString() + "(\"" + Utility.replace(bytes, "\n", "\\n") + "\")"; + } +} diff --git a/src/java/org/apache/bcel/classfile/ConstantValue.java b/src/java/org/apache/bcel/classfile/ConstantValue.java new file mode 100644 index 00000000..bd4e53b9 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ConstantValue.java @@ -0,0 +1,204 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from Attribute and represents a constant + * value, i.e., a default value for initializing a class field. + * This class is instantiated by the Attribute.readAttribute() method. + * + * @version $Id$ + * @author M. Dahm + * @see Attribute + */ +public final class ConstantValue extends Attribute { + private int constantvalue_index; + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public ConstantValue(ConstantValue c) { + this(c.getNameIndex(), c.getLength(), c.getConstantValueIndex(), + c.getConstantPool()); + } + + /** + * Construct object from file stream. + * @param name_index Name index in constant pool + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throw IOException + */ + ConstantValue(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(name_index, length, (int)file.readUnsignedShort(), constant_pool); + } + + /** + * @param name_index Name index in constant pool + * @param length Content length in bytes + * @param constantvalue_index Index in constant pool + * @param constant_pool Array of constants + */ + public ConstantValue(int name_index, int length, + int constantvalue_index, + ConstantPool constant_pool) + { + super(Constants.ATTR_CONSTANT_VALUE, name_index, length, constant_pool); + this.constantvalue_index = constantvalue_index; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitConstantValue(this); + } + /** + * Dump constant value attribute to file stream on binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + file.writeShort(constantvalue_index); + } + /** + * @return Index in constant pool of constant value. + */ + public final int getConstantValueIndex() { return constantvalue_index; } + + /** + * @param constantvalue_index. + */ + public final void setConstantValueIndex(int constantvalue_index) { + this.constantvalue_index = constantvalue_index; + } + + /** + * @return String representation of constant value. + */ + public final String toString() throws InternalError + { + Constant c = constant_pool.getConstant(constantvalue_index); + + String buf; + int i; + + // Print constant to string depending on its type + switch(c.getTag()) { + case Constants.CONSTANT_Long: buf = "" + ((ConstantLong)c).getBytes(); break; + case Constants.CONSTANT_Float: buf = "" + ((ConstantFloat)c).getBytes(); break; + case Constants.CONSTANT_Double: buf = "" + ((ConstantDouble)c).getBytes(); break; + case Constants.CONSTANT_Integer: buf = "" + ((ConstantInteger)c).getBytes(); break; + case Constants.CONSTANT_String: + i = ((ConstantString)c).getStringIndex(); + c = constant_pool.getConstant(i, Constants.CONSTANT_Utf8); + buf = "\"" + convertString(((ConstantUtf8)c).getBytes()) + "\""; + break; + default: throw new InternalError("Type of ConstValue invalid: " + c); + } + + return buf; + } + + /** + * Escape all occurences of newline chars '\n', quotes \", etc. + */ + private static final String convertString(String label) { + char[] ch = label.toCharArray(); + StringBuffer buf = new StringBuffer(); + + for(int i=0; i < ch.length; i++) { + switch(ch[i]) { + case '\n': + buf.append("\\n"); break; + case '\r': + buf.append("\\r"); break; + case '\"': + buf.append("\\\""); break; + case '\'': + buf.append("\\'"); break; + case '\\': + buf.append("\\\\"); break; + default: + buf.append(ch[i]); break; + } + } + + return buf.toString(); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + ConstantValue c = (ConstantValue)clone(); + c.constant_pool = constant_pool; + return c; + } +} diff --git a/src/java/org/apache/bcel/classfile/Deprecated.java b/src/java/org/apache/bcel/classfile/Deprecated.java new file mode 100644 index 00000000..7502cff8 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Deprecated.java @@ -0,0 +1,170 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from Attribute and denotes that this is a + * deprecated method. + * It is instantiated from the Attribute.readAttribute() method. + * + * @version $Id$ + * @author M. Dahm + * @see Attribute + */ +public final class Deprecated extends Attribute { + private byte[] bytes; + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public Deprecated(Deprecated c) { + this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); + } + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param bytes Attribute contents + * @param constant_pool Array of constants + * @param sourcefile_index Index in constant pool to CONSTANT_Utf8 + */ + public Deprecated(int name_index, int length, byte[] bytes, + ConstantPool constant_pool) + { + super(Constants.ATTR_DEPRECATED, name_index, length, constant_pool); + this.bytes = bytes; + } + + /** + * Construct object from file stream. + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throw IOException + */ + Deprecated(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(name_index, length, (byte [])null, constant_pool); + + if(length > 0) { + bytes = new byte[length]; + file.readFully(bytes); + System.err.println("Deprecated attribute with length > 0"); + } + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitDeprecated(this); + } + + /** + * Dump source file attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + + if(length > 0) + file.write(bytes, 0, length); + } + + /** + * @return data bytes. + */ + public final byte[] getBytes() { return bytes; } + + /** + * @param bytes. + */ + public final void setBytes(byte[] bytes) { + this.bytes = bytes; + } + + /** + * @return attribute name + */ + public final String toString() { + return Constants.ATTRIBUTE_NAMES[Constants.ATTR_DEPRECATED]; + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + Deprecated c = (Deprecated)clone(); + + if(bytes != null) + c.bytes = (byte[])bytes.clone(); + + c.constant_pool = constant_pool; + return c; + } +} diff --git a/src/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/java/org/apache/bcel/classfile/DescendingVisitor.java new file mode 100644 index 00000000..c98e4b22 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -0,0 +1,351 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.util.Stack; + +/** + * Traverses a JavaClass with another Visitor object 'piggy-backed' + * that is applied to all components of a JavaClass object. I.e. this + * class supplies the traversal strategy, other classes can make use + * of it. + * + * @version $Id$ + * @author M. Dahm + */ +public class DescendingVisitor implements Visitor { + private JavaClass clazz; + private Visitor visitor; + private Stack stack = new Stack(); + + /** @return container of current entitity, i.e., predecessor during traversal + */ + public Object predecessor() { + return predecessor(0); + } + + /** + * @param level nesting level, i.e., 0 returns the direct predecessor + * @return container of current entitity, i.e., predecessor during traversal + */ + public Object predecessor(int level) { + int size = stack.size(); + + if((size < 2) || (level < 0)) + return null; + else + return stack.elementAt(size - (level + 2)); // size - 1 == current + } + + /** @return current object + */ + public Object current() { + return stack.peek(); + } + + /** + * @param clazz Class to traverse + * @param visitor visitor object to apply to all components + */ + public DescendingVisitor(JavaClass clazz, Visitor visitor) { + this.clazz = clazz; + this.visitor = visitor; + } + + /** + * Start traversal. + */ + public void visit() { clazz.accept(this); } + + public void visitJavaClass(JavaClass clazz) { + stack.push(clazz); + clazz.accept(visitor); + + Field[] fields = clazz.getFields(); + for(int i=0; i < fields.length; i++) + fields[i].accept(this); + + Method[] methods = clazz.getMethods(); + for(int i=0; i < methods.length; i++) + methods[i].accept(this); + + Attribute[] attributes = clazz.getAttributes(); + for(int i=0; i < attributes.length; i++) + attributes[i].accept(this); + + clazz.getConstantPool().accept(this); + stack.pop(); + } + + public void visitField(Field field) { + stack.push(field); + field.accept(visitor); + + Attribute[] attributes = field.getAttributes(); + for(int i=0; i < attributes.length; i++) + attributes[i].accept(this); + stack.pop(); + } + + public void visitConstantValue(ConstantValue cv) { + stack.push(cv); + cv.accept(visitor); + stack.pop(); + } + + public void visitMethod(Method method) { + stack.push(method); + method.accept(visitor); + + Attribute[] attributes = method.getAttributes(); + for(int i=0; i < attributes.length; i++) + attributes[i].accept(this); + + stack.pop(); + } + + public void visitExceptionTable(ExceptionTable table) { + stack.push(table); + table.accept(visitor); + stack.pop(); + } + + public void visitCode(Code code) { + stack.push(code); + code.accept(visitor); + + CodeException[] table = code.getExceptionTable(); + for(int i=0; i < table.length; i++) + table[i].accept(this); + + Attribute[] attributes = code.getAttributes(); + for(int i=0; i < attributes.length; i++) + attributes[i].accept(this); + stack.pop(); + } + + public void visitCodeException(CodeException ce) { + stack.push(ce); + ce.accept(visitor); + stack.pop(); + } + + public void visitLineNumberTable(LineNumberTable table) { + stack.push(table); + table.accept(visitor); + + LineNumber[] numbers = table.getLineNumberTable(); + for(int i=0; i < numbers.length; i++) + numbers[i].accept(this); + stack.pop(); + } + + public void visitLineNumber(LineNumber number) { + stack.push(number); + number.accept(visitor); + stack.pop(); + } + + public void visitLocalVariableTable(LocalVariableTable table) { + stack.push(table); + table.accept(visitor); + + LocalVariable[] vars = table.getLocalVariableTable(); + for(int i=0; i < vars.length; i++) + vars[i].accept(this); + stack.pop(); + } + + public void visitStackMap(StackMap table) { + stack.push(table); + table.accept(visitor); + + StackMapEntry[] vars = table.getStackMap(); + + for(int i=0; i < vars.length; i++) + vars[i].accept(this); + stack.pop(); + } + + public void visitStackMapEntry(StackMapEntry var) { + stack.push(var); + var.accept(visitor); + stack.pop(); + } + + public void visitLocalVariable(LocalVariable var) { + stack.push(var); + var.accept(visitor); + stack.pop(); + } + + public void visitConstantPool(ConstantPool cp) { + stack.push(cp); + cp.accept(visitor); + + Constant[] constants = cp.getConstantPool(); + for(int i=1; i < constants.length; i++) { + if(constants[i] != null) + constants[i].accept(this); + } + + stack.pop(); + } + + public void visitConstantClass(ConstantClass constant) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantDouble(ConstantDouble constant) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantFieldref(ConstantFieldref constant) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantFloat(ConstantFloat constant) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantInteger(ConstantInteger constant) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref constant) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantLong(ConstantLong constant) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantMethodref(ConstantMethodref constant) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantNameAndType(ConstantNameAndType constant) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantString(ConstantString constant) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantUtf8(ConstantUtf8 constant) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitInnerClasses(InnerClasses ic) { + stack.push(ic); + ic.accept(visitor); + + InnerClass[] ics = ic.getInnerClasses(); + for(int i=0; i < ics.length; i++) + ics[i].accept(this); + stack.pop(); + } + + public void visitInnerClass(InnerClass inner) { + stack.push(inner); + inner.accept(visitor); + stack.pop(); + } + + public void visitDeprecated(Deprecated attribute) { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitSourceFile(SourceFile attribute) { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitSynthetic(Synthetic attribute) { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitUnknown(Unknown attribute) { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } +} diff --git a/src/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/java/org/apache/bcel/classfile/EmptyVisitor.java new file mode 100644 index 00000000..ff1ea7e7 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -0,0 +1,104 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.classfile.*; +import org.apache.bcel.*; + +/** + * Visitor with empty method bodies, can be extended and used in conjunction with the + * DescendingVisitor class, e.g. + * + * By courtesy of David Spencer. + * + * @see DescendingVisitor + * @version $Id$ + * + */ +public class EmptyVisitor implements Visitor { + protected EmptyVisitor() { } + + public void visitCode(Code obj) {} + public void visitCodeException(CodeException obj) {} + public void visitConstantClass(ConstantClass obj) {} + public void visitConstantDouble(ConstantDouble obj) {} + public void visitConstantFieldref(ConstantFieldref obj) {} + public void visitConstantFloat(ConstantFloat obj) {} + public void visitConstantInteger(ConstantInteger obj) {} + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) {} + public void visitConstantLong(ConstantLong obj) {} + public void visitConstantMethodref(ConstantMethodref obj) {} + public void visitConstantNameAndType(ConstantNameAndType obj) {} + public void visitConstantPool(ConstantPool obj) {} + public void visitConstantString(ConstantString obj) {} + public void visitConstantUtf8(ConstantUtf8 obj) {} + public void visitConstantValue(ConstantValue obj) {} + public void visitDeprecated(Deprecated obj) {} + public void visitExceptionTable(ExceptionTable obj) {} + public void visitField(Field obj) {} + public void visitInnerClass(InnerClass obj) {} + public void visitInnerClasses(InnerClasses obj) {} + public void visitJavaClass(JavaClass obj) {} + public void visitLineNumber(LineNumber obj) {} + public void visitLineNumberTable(LineNumberTable obj) {} + public void visitLocalVariable(LocalVariable obj) {} + public void visitLocalVariableTable(LocalVariableTable obj) {} + public void visitMethod(Method obj) {} + public void visitSourceFile(SourceFile obj) {} + public void visitSynthetic(Synthetic obj) {} + public void visitUnknown(Unknown obj) {} + public void visitStackMap(StackMap obj) {} + public void visitStackMapEntry(StackMapEntry obj) {} +} diff --git a/src/java/org/apache/bcel/classfile/ExceptionTable.java b/src/java/org/apache/bcel/classfile/ExceptionTable.java new file mode 100644 index 00000000..0f26b1f4 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ExceptionTable.java @@ -0,0 +1,202 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents the table of exceptions that are thrown by a + * method. This attribute may be used once per method. The name of + * this class is ExceptionTable for historical reasons; The + * Java Virtual Machine Specification, Second Edition defines this + * attribute using the name Exceptions (which is inconsistent + * with the other classes). + * + * @version $Id$ + * @author M. Dahm + * @see Code + */ +public final class ExceptionTable extends Attribute { + private int number_of_exceptions; // Table of indices into + private int[] exception_index_table; // constant pool + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use copy() for a physical copy. + */ + public ExceptionTable(ExceptionTable c) { + this(c.getNameIndex(), c.getLength(), c.getExceptionIndexTable(), + c.getConstantPool()); + } + + /** + * @param name_index Index in constant pool + * @param length Content length in bytes + * @param exception_index_table Table of indices in constant pool + * @param constant_pool Array of constants + */ + public ExceptionTable(int name_index, int length, + int[] exception_index_table, + ConstantPool constant_pool) + { + super(Constants.ATTR_EXCEPTIONS, name_index, length, constant_pool); + setExceptionIndexTable(exception_index_table); + } + + /** + * Construct object from file stream. + * @param name_index Index in constant pool + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throw IOException + */ + ExceptionTable(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(name_index, length, (int[])null, constant_pool); + + number_of_exceptions = file.readUnsignedShort(); + exception_index_table = new int[number_of_exceptions]; + + for(int i=0; i < number_of_exceptions; i++) + exception_index_table[i] = file.readUnsignedShort(); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionTable(this); + } + + /** + * Dump exceptions attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + file.writeShort(number_of_exceptions); + for(int i=0; i < number_of_exceptions; i++) + file.writeShort(exception_index_table[i]); + } + + /** + * @return Array of indices into constant pool of thrown exceptions. + */ + public final int[] getExceptionIndexTable() {return exception_index_table;} + /** + * @return Length of exception table. + */ + public final int getNumberOfExceptions() { return number_of_exceptions; } + + /** + * @return class names of thrown exceptions + */ + public final String[] getExceptionNames() { + String[] names = new String[number_of_exceptions]; + for(int i=0; i < number_of_exceptions; i++) + names[i] = constant_pool.getConstantString(exception_index_table[i], + Constants.CONSTANT_Class). + replace('/', '.'); + return names; + } + + /** + * @param exception_index_table. + * Also redefines number_of_exceptions according to table length. + */ + public final void setExceptionIndexTable(int[] exception_index_table) { + this.exception_index_table = exception_index_table; + number_of_exceptions = (exception_index_table == null)? 0 : + exception_index_table.length; + } + /** + * @return String representation, i.e., a list of thrown exceptions. + */ + public final String toString() { + StringBuffer buf = new StringBuffer(""); + String str; + + for(int i=0; i < number_of_exceptions; i++) { + str = constant_pool.getConstantString(exception_index_table[i], + Constants.CONSTANT_Class); + buf.append(Utility.compactClassName(str, false)); + + if(i < number_of_exceptions - 1) + buf.append(", "); + } + + return buf.toString(); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + ExceptionTable c = (ExceptionTable)clone(); + c.exception_index_table = (int[])exception_index_table.clone(); + c.constant_pool = constant_pool; + return c; + } +} diff --git a/src/java/org/apache/bcel/classfile/Field.java b/src/java/org/apache/bcel/classfile/Field.java new file mode 100644 index 00000000..741f7e1d --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Field.java @@ -0,0 +1,157 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents the field info structure, i.e., the representation + * for a variable in the class. See JVM specification for details. + * + * @version $Id$ + * @author M. Dahm + */ +public final class Field extends FieldOrMethod { + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public Field(Field c) { + super(c); + } + + /** + * Construct object from file stream. + * @param file Input stream + */ + Field(DataInputStream file, ConstantPool constant_pool) + throws IOException, ClassFormatError + { + super(file, constant_pool); + } + + /** + * @param access_flags Access rights of field + * @param name_index Points to field name in constant pool + * @param signature_index Points to encoded signature + * @param attributes Collection of attributes + * @param constant_pool Array of constants + */ + public Field(int access_flags, int name_index, int signature_index, + Attribute[] attributes, ConstantPool constant_pool) + { + super(access_flags, name_index, signature_index, attributes, constant_pool); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitField(this); + } + + /** + * @return constant value associated with this field (may be null) + */ + public final ConstantValue getConstantValue() { + for(int i=0; i < attributes_count; i++) + if(attributes[i].getTag() == Constants.ATTR_CONSTANT_VALUE) + return (ConstantValue)attributes[i]; + + return null; + } + + /** + * Return string representation close to declaration format, + * `public static final short MAX = 100', e.g.. + * + * @return String representation of field, including the signature. + */ + public final String toString() { + String name, signature, access; // Short cuts to constant pool + + // Get names from constant pool + access = Utility.accessToString(access_flags); + access = access.equals("")? "" : (access + " "); + signature = Utility.signatureToString(getSignature()); + name = getName(); + + StringBuffer buf = new StringBuffer(access + signature + " " + name); + ConstantValue cv = getConstantValue(); + + if(cv != null) + buf.append(" = " + cv); + + for(int i=0; i < attributes_count; i++) { + Attribute a = attributes[i]; + + if(!(a instanceof ConstantValue)) + buf.append(" [" + a.toString() + "]"); + } + + return buf.toString(); + } + + /** + * @return deep copy of this field + */ + public final Field copy(ConstantPool constant_pool) { + return (Field)copy_(constant_pool); + } +} diff --git a/src/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/java/org/apache/bcel/classfile/FieldOrMethod.java new file mode 100644 index 00000000..a32d1a85 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -0,0 +1,223 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +import java.io.*; + +/** + * Abstract super class for fields and methods. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class FieldOrMethod extends AccessFlags implements Cloneable, Node { + protected int name_index; // Points to field name in constant pool + protected int signature_index; // Points to encoded signature + protected int attributes_count;// No. of attributes + protected Attribute[] attributes; // Collection of attributes + protected ConstantPool constant_pool; + + FieldOrMethod() {} + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + protected FieldOrMethod(FieldOrMethod c) { + this(c.getAccessFlags(), c.getNameIndex(), c.getSignatureIndex(), + c.getAttributes(), c.getConstantPool()); + } + + /** + * Construct object from file stream. + * @param file Input stream + * @throw IOException + * @throw ClassFormatError + */ + protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) + throws IOException, ClassFormatError + { + this(file.readUnsignedShort(), file.readUnsignedShort(), + file.readUnsignedShort(), null, constant_pool); + + attributes_count = file.readUnsignedShort(); + attributes = new Attribute[attributes_count]; + for(int i=0; i < attributes_count; i++) + attributes[i] = Attribute.readAttribute(file, constant_pool); + } + + /** + * @param access_flags Access rights of method + * @param name_index Points to field name in constant pool + * @param signature_index Points to encoded signature + * @param attributes Collection of attributes + * @param constant_pool Array of constants + */ + protected FieldOrMethod(int access_flags, int name_index, int signature_index, + Attribute[] attributes, ConstantPool constant_pool) + { + this.access_flags = access_flags; + this.name_index = name_index; + this.signature_index = signature_index; + this.constant_pool = constant_pool; + + setAttributes(attributes); + } + + /** + * Dump object to file stream on binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeShort(access_flags); + file.writeShort(name_index); + file.writeShort(signature_index); + file.writeShort(attributes_count); + + for(int i=0; i < attributes_count; i++) + attributes[i].dump(file); + } + + /** + * @return Collection of object attributes. + */ + public final Attribute[] getAttributes() { return attributes; } + + /** + * @param attributes Collection of object attributes. + */ + public final void setAttributes(Attribute[] attributes) { + this.attributes = attributes; + attributes_count = (attributes == null)? 0 : attributes.length; + } + + /** + * @return Constant pool used by this object. + */ + public final ConstantPool getConstantPool() { return constant_pool; } + + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool(ConstantPool constant_pool) { + this.constant_pool = constant_pool; + } + + /** + * @return Index in constant pool of object's name. + */ + public final int getNameIndex() { return name_index; } + + /** + * @param name_index Index in constant pool of object's name. + */ + public final void setNameIndex(int name_index) { + this.name_index = name_index; + } + + /** + * @return Index in constant pool of field signature. + */ + public final int getSignatureIndex() { return signature_index; } + + /** + * @param signature_index Index in constant pool of field signature. + */ + public final void setSignatureIndex(int signature_index) { + this.signature_index = signature_index; + } + + /** + * @return Name of object, i.e., method name or field name + */ + public final String getName() { + ConstantUtf8 c; + c = (ConstantUtf8)constant_pool.getConstant(name_index, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + /** + * @return String representation of object's type signature (java style) + */ + public final String getSignature() { + ConstantUtf8 c; + c = (ConstantUtf8)constant_pool.getConstant(signature_index, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + /** + * @return deep copy of this field + */ + protected FieldOrMethod copy_(ConstantPool constant_pool) { + FieldOrMethod c = null; + + try { + c = (FieldOrMethod)clone(); + } catch(CloneNotSupportedException e) {} + + c.constant_pool = constant_pool; + c.attributes = new Attribute[attributes_count]; + + for(int i=0; i < attributes_count; i++) + c.attributes[i] = attributes[i].copy(constant_pool); + + return c; + } +} diff --git a/src/java/org/apache/bcel/classfile/InnerClass.java b/src/java/org/apache/bcel/classfile/InnerClass.java new file mode 100644 index 00000000..21e0b0bb --- /dev/null +++ b/src/java/org/apache/bcel/classfile/InnerClass.java @@ -0,0 +1,221 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents a inner class attribute, i.e., the class + * indices of the inner and outer classes, the name and the attributes + * of the inner class. + * + * @version $Id$ + * @author M. Dahm + * @see InnerClasses + */ +public final class InnerClass implements Cloneable, Node { + private int inner_class_index; + private int outer_class_index; + private int inner_name_index; + private int inner_access_flags; + + /** + * Initialize from another object. + */ + public InnerClass(InnerClass c) { + this(c.getInnerClassIndex(), c.getOuterClassIndex(), c.getInnerNameIndex(), + c.getInnerAccessFlags()); + } + + /** + * Construct object from file stream. + * @param file Input stream + * @throw IOException + */ + InnerClass(DataInputStream file) throws IOException + { + this(file.readUnsignedShort(), file.readUnsignedShort(), + file.readUnsignedShort(), file.readUnsignedShort()); + } + + /** + * @param inner_class_index Class index in constant pool of inner class + * @param outer_class_index Class index in constant pool of outer class + * @param inner_name_index Name index in constant pool of inner class + * @param inner_access_flags Access flags of inner class + */ + public InnerClass(int inner_class_index, int outer_class_index, + int inner_name_index, int inner_access_flags) + { + this.inner_class_index = inner_class_index; + this.outer_class_index = outer_class_index; + this.inner_name_index = inner_name_index; + this.inner_access_flags = inner_access_flags; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitInnerClass(this); + } + /** + * Dump inner class attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeShort(inner_class_index); + file.writeShort(outer_class_index); + file.writeShort(inner_name_index); + file.writeShort(inner_access_flags); + } + /** + * @return access flags of inner class. + */ + public final int getInnerAccessFlags() { return inner_access_flags; } + /** + * @return class index of inner class. + */ + public final int getInnerClassIndex() { return inner_class_index; } + /** + * @return name index of inner class. + */ + public final int getInnerNameIndex() { return inner_name_index; } + /** + * @return class index of outer class. + */ + public final int getOuterClassIndex() { return outer_class_index; } + /** + * @param inner_access_flags. + */ + public final void setInnerAccessFlags(int inner_access_flags) { + this.inner_access_flags = inner_access_flags; + } + /** + * @param inner_class_index. + */ + public final void setInnerClassIndex(int inner_class_index) { + this.inner_class_index = inner_class_index; + } + /** + * @param inner_name_index. + */ + public final void setInnerNameIndex(int inner_name_index) { + this.inner_name_index = inner_name_index; + } + /** + * @param outer_class_index. + */ + public final void setOuterClassIndex(int outer_class_index) { + this.outer_class_index = outer_class_index; + } + /** + * @return String representation. + */ + public final String toString() { + return "InnerClass(" + inner_class_index + ", " + outer_class_index + + ", " + inner_name_index + ", " + inner_access_flags + ")"; + } + + /** + * @return Resolved string representation + */ + public final String toString(ConstantPool constant_pool) { + String inner_class_name, outer_class_name, inner_name, access; + + inner_class_name = constant_pool.getConstantString(inner_class_index, + Constants.CONSTANT_Class); + inner_class_name = Utility.compactClassName(inner_class_name); + + if (outer_class_index != 0) { + outer_class_name = constant_pool.getConstantString(outer_class_index, + Constants.CONSTANT_Class); + outer_class_name = Utility.compactClassName(outer_class_name); + } + else + outer_class_name = ""; + + if(inner_name_index != 0) + inner_name = ((ConstantUtf8)constant_pool. + getConstant(inner_name_index, Constants.CONSTANT_Utf8)).getBytes(); + else + inner_name = ""; + + access = Utility.accessToString(inner_access_flags, true); + access = access.equals("")? "" : (access + " "); + + return "InnerClass:" + access + inner_class_name + + "(\"" + outer_class_name + "\", \"" + inner_name + "\")"; + } + + /** + * @return deep copy of this object + */ + public InnerClass copy() { + try { + return (InnerClass)clone(); + } catch(CloneNotSupportedException e) {} + + return null; + } +} diff --git a/src/java/org/apache/bcel/classfile/InnerClasses.java b/src/java/org/apache/bcel/classfile/InnerClasses.java new file mode 100644 index 00000000..beefa38e --- /dev/null +++ b/src/java/org/apache/bcel/classfile/InnerClasses.java @@ -0,0 +1,181 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from Attribute and denotes that this class + * is an Inner class of another. + * to the source file of this class. + * It is instantiated from the Attribute.readAttribute() method. + * + * @version $Id$ + * @author M. Dahm + * @see Attribute + */ +public final class InnerClasses extends Attribute { + private InnerClass[] inner_classes; + private int number_of_classes; + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public InnerClasses(InnerClasses c) { + this(c.getNameIndex(), c.getLength(), c.getInnerClasses(), + c.getConstantPool()); + } + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param inner_classes array of inner classes attributes + * @param constant_pool Array of constants + * @param sourcefile_index Index in constant pool to CONSTANT_Utf8 + */ + public InnerClasses(int name_index, int length, + InnerClass[] inner_classes, + ConstantPool constant_pool) + { + super(Constants.ATTR_INNER_CLASSES, name_index, length, constant_pool); + setInnerClasses(inner_classes); + } + + /** + * Construct object from file stream. + * + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throw IOException + */ + InnerClasses(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(name_index, length, (InnerClass[])null, constant_pool); + + number_of_classes = file.readUnsignedShort(); + inner_classes = new InnerClass[number_of_classes]; + + for(int i=0; i < number_of_classes; i++) + inner_classes[i] = new InnerClass(file); + } + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitInnerClasses(this); + } + /** + * Dump source file attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + file.writeShort(number_of_classes); + + for(int i=0; i < number_of_classes; i++) + inner_classes[i].dump(file); + } + + /** + * @return array of inner class "records" + */ + public final InnerClass[] getInnerClasses() { return inner_classes; } + + /** + * @param inner_classes. + */ + public final void setInnerClasses(InnerClass[] inner_classes) { + this.inner_classes = inner_classes; + number_of_classes = (inner_classes == null)? 0 : inner_classes.length; + } + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer(); + + for(int i=0; i < number_of_classes; i++) + buf.append(inner_classes[i].toString(constant_pool) + "\n"); + + return buf.toString(); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + InnerClasses c = (InnerClasses)clone(); + + c.inner_classes = new InnerClass[number_of_classes]; + for(int i=0; i < number_of_classes; i++) + c.inner_classes[i] = inner_classes[i].copy(); + + c.constant_pool = constant_pool; + return c; + } +} diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java new file mode 100644 index 00000000..82084ab5 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -0,0 +1,611 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import java.io.*; +import java.util.StringTokenizer; + +/** + * Represents a Java class, i.e., the data structures, constant pool, + * fields, methods and commands contained in a Java .class file. + * See JVM + * specification for details. + * + * @version $Id$ + * @author M. Dahm + */ +public class JavaClass extends AccessFlags implements Cloneable, Node { + private String file_name; + private String package_name; + private String source_file_name = ""; + private int class_name_index; + private int superclass_name_index; + private String class_name; + private String superclass_name; + private int major, minor; // Compiler version + private ConstantPool constant_pool; // Constant pool + private int[] interfaces; // implemented interfaces + private String[] interface_names; + private Field[] fields; // Fields, i.e., variables of class + private Method[] methods; // methods defined in the class + private Attribute[] attributes; // attributes defined in the class + private byte source = HEAP; // Generated in memory + + public static final byte HEAP = 1; + public static final byte FILE = 2; + public static final byte ZIP = 3; + + static boolean debug = false; // Debugging on/off + static char sep = '/'; // directory separator + + /** + * Constructor gets all contents as arguments. + * + * @param class_name Class name + * @param superclass_name Superclass name + * @param file_name File name + * @param major Major compiler version + * @param minor Minor compiler version + * @param access_flags Access rights defined by bit flags + * @param constant_pool Array of constants + * @param interfaces Implemented interfaces + * @param fields Class fields + * @param methods Class methods + * @param attributes Class attributes + * @param source Read from file or generated in memory? + */ + public JavaClass(int class_name_index, + int superclass_name_index, + String file_name, + int major, + int minor, + int access_flags, + ConstantPool constant_pool, + int[] interfaces, + Field[] fields, + Method[] methods, + Attribute[] attributes, + byte source) + { + if(interfaces == null) // Allowed for backward compatibility + interfaces = new int[0]; + if(attributes == null) + this.attributes = new Attribute[0]; + if(fields == null) + fields = new Field[0]; + if(methods == null) + methods = new Method[0]; + + this.class_name_index = class_name_index; + this.superclass_name_index = superclass_name_index; + this.file_name = file_name; + this.major = major; + this.minor = minor; + this.access_flags = access_flags; + this.constant_pool = constant_pool; + this.interfaces = interfaces; + this.fields = fields; + this.methods = methods; + this.attributes = attributes; + this.source = source; + + // Get source file name if available + for(int i=0; i < attributes.length; i++) { + if(attributes[i] instanceof SourceFile) { + source_file_name = ((SourceFile)attributes[i]).getSourceFileName(); + break; + } + } + + // Get class name and superclass name + ConstantUtf8 name; + + /* According to the specification the following entries must be of type + * `ConstantClass' but we check that anyway via the + * `ConstPool.getConstant' method. + */ + class_name = constant_pool.getConstantString(class_name_index, + Constants.CONSTANT_Class); + class_name = Utility.compactClassName(class_name, false); + + int index = class_name.lastIndexOf('.'); + if(index < 0) + package_name = ""; + else + package_name = class_name.substring(0, index); + + if(superclass_name_index > 0) { // May be zero -> class is java.lang.Object + superclass_name = constant_pool.getConstantString(superclass_name_index, + Constants.CONSTANT_Class); + superclass_name = Utility.compactClassName(superclass_name, false); + } + else + superclass_name = "java.lang.Object"; + + interface_names = new String[interfaces.length]; + for(int i=0; i < interfaces.length; i++) { + String str = constant_pool.getConstantString(interfaces[i], Constants.CONSTANT_Class); + interface_names[i] = Utility.compactClassName(str, false); + } + } + + /** + * Constructor gets all contents as arguments. + * + * @param class_name Class name + * @param superclass_name Superclass name + * @param file_name File name + * @param major Major compiler version + * @param minor Minor compiler version + * @param access_flags Access rights defined by bit flags + * @param constant_pool Array of constants + * @param interfaces Implemented interfaces + * @param fields Class fields + * @param methods Class methods + * @param attributes Class attributes + */ + public JavaClass(int class_name_index, + int superclass_name_index, + String file_name, + int major, + int minor, + int access_flags, + ConstantPool constant_pool, + int[] interfaces, + Field[] fields, + Method[] methods, + Attribute[] attributes) { + this(class_name_index, superclass_name_index, file_name, major, minor, access_flags, + constant_pool, interfaces, fields, methods, attributes, HEAP); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitJavaClass(this); + } + + /* Print debug information depending on `JavaClass.debug' + */ + static final void Debug(String str) { + if(debug) + System.out.println(str); + } + + /** + * Dump class to a file. + * + * @param file Output file + * @throw IOException + */ + public void dump(File file) throws IOException + { + String parent = file.getParent(); + + if(parent != null) { + File dir = new File(parent); + + if(dir != null) + dir.mkdirs(); + } + + dump(new DataOutputStream(new FileOutputStream(file))); + } + + /** + * Dump class to a file named file_name. + * + * @param file_name Output file name + * @exception IOException + */ + public void dump(String file_name) throws IOException + { + dump(new File(file_name)); + } + + /** + * @return class in binary format + */ + public byte[] getBytes() { + ByteArrayOutputStream s = new ByteArrayOutputStream(); + DataOutputStream ds = new DataOutputStream(s); + + try { + dump(ds); + ds.close(); + } catch(IOException e) { e.printStackTrace(); } + + return s.toByteArray(); + } + + /** + * Dump Java class to output stream in binary format. + * + * @param file Output stream + * @exception IOException + */ + public void dump(OutputStream file) throws IOException { + dump(new DataOutputStream(file)); + } + + /** + * Dump Java class to output stream in binary format. + * + * @param file Output stream + * @exception IOException + */ + public void dump(DataOutputStream file) throws IOException + { + file.writeInt(0xcafebabe); + file.writeShort(minor); + file.writeShort(major); + + constant_pool.dump(file); + + file.writeShort(access_flags); + file.writeShort(class_name_index); + file.writeShort(superclass_name_index); + + file.writeShort(interfaces.length); + for(int i=0; i < interfaces.length; i++) + file.writeShort(interfaces[i]); + + file.writeShort(fields.length); + for(int i=0; i < fields.length; i++) + fields[i].dump(file); + + file.writeShort(methods.length); + for(int i=0; i < methods.length; i++) + methods[i].dump(file); + + if(attributes != null) { + file.writeShort(attributes.length); + for(int i=0; i < attributes.length; i++) + attributes[i].dump(file); + } + else + file.writeShort(0); + + file.close(); + } + + /** + * @return Attributes of the class. + */ + public Attribute[] getAttributes() { return attributes; } + + /** + * @return Class name. + */ + public String getClassName() { return class_name; } + + /** + * @return Package name. + */ + public String getPackageName() { return package_name; } + + /** + * @return Class name index. + */ + public int getClassNameIndex() { return class_name_index; } + + /** + * @return Constant pool. + */ + public ConstantPool getConstantPool() { return constant_pool; } + + /** + * @return Fields, i.e., variables of the class. + */ + public Field[] getFields() { return fields; } + /** + * @return File name of class, aka SourceFile attribute value + */ + public String getFileName() { return file_name; } + /** + * @return Names of implemented interfaces. + */ + public String[] getInterfaceNames() { return interface_names; } + /** + * @return Implemented interfaces. + */ + public int[] getInterfaces() { return interfaces; } + /** + * @return Major number of compiler version. + */ + public int getMajor() { return major; } + /** + * @return Methods of the class. + */ + public Method[] getMethods() { return methods; } + /** + * @return Minor number of compiler version. + */ + public int getMinor() { return minor; } + + /** + * @return sbsolute path to file where this class was read from + */ + public String getSourceFileName() { return source_file_name; } + + /** + * @return Superclass name. + */ + public String getSuperclassName() { return superclass_name; } + /** + * @return Class name index. + */ + public int getSuperclassNameIndex() { return superclass_name_index; } + + static { + // Debugging ... on/off + String debug = System.getProperty("JavaClass.debug"); + + if(debug != null) + JavaClass.debug = new Boolean(debug).booleanValue(); + + // Get path separator either / or \ usually + String sep = System.getProperty("file.separator"); + + if(sep != null) + try { + JavaClass.sep = sep.charAt(0); + } catch(StringIndexOutOfBoundsException e) {} // Never reached + } + + /** + * @param attributes. + */ + public void setAttributes(Attribute[] attributes) { + this.attributes = attributes; + } + /** + * @param class_name. + */ + public void setClassName(String class_name) { + this.class_name = class_name; + } + /** + * @param class_name_index. + */ + public void setClassNameIndex(int class_name_index) { + this.class_name_index = class_name_index; + } + /** + * @param constant_pool. + */ + public void setConstantPool(ConstantPool constant_pool) { + this.constant_pool = constant_pool; + } + /** + * @param fields. + */ + public void setFields(Field[] fields) { + this.fields = fields; + } + /** + * Set File name of class, aka SourceFile attribute value + */ + public void setFileName(String file_name) { + this.file_name = file_name; + } + /** + * @param interface_names. + */ + public void setInterfaceNames(String[] interface_names) { + this.interface_names = interface_names; + } + /** + * @param interfaces. + */ + public void setInterfaces(int[] interfaces) { + this.interfaces = interfaces; + } + /** + * @param major. + */ + public void setMajor(int major) { + this.major = major; + } + /** + * @param methods. + */ + public void setMethods(Method[] methods) { + this.methods = methods; + } + /** + * @param minor. + */ + public void setMinor(int minor) { + this.minor = minor; + } + /** + * Set absolute path to file this class was read from. + */ + public void setSourceFileName(String source_file_name) { + this.source_file_name = source_file_name; + } + /** + * @param superclass_name. + */ + public void setSuperclassName(String superclass_name) { + this.superclass_name = superclass_name; + } + /** + * @param superclass_name_index. + */ + public void setSuperclassNameIndex(int superclass_name_index) { + this.superclass_name_index = superclass_name_index; + } + /** + * @return String representing class contents. + */ + public String toString() { + String access = Utility.accessToString(access_flags, true); + access = access.equals("")? "" : (access + " "); + + StringBuffer buf = new StringBuffer(access + + Utility.classOrInterface(access_flags) + + " " + + class_name + " extends " + + Utility.compactClassName(superclass_name, + false) + '\n'); + int size = interfaces.length; + + if(size > 0) { + buf.append("implements\t\t"); + + for(int i=0; i < size; i++) { + buf.append(interface_names[i]); + if(i < size - 1) + buf.append(", "); + } + + buf.append('\n'); + } + + buf.append("filename\t\t" + file_name + '\n'); + buf.append("compiled from\t\t" + source_file_name + '\n'); + buf.append("compiler version\t" + major + "." + minor + '\n'); + buf.append("access flags\t\t" + access_flags + '\n'); + buf.append("constant pool\t\t" + constant_pool.getLength() + " entries\n"); + buf.append("ACC_SUPER flag\t\t" + isSuper() + "\n"); + + if(attributes.length > 0) { + buf.append("\nAttribute(s):\n"); + for(int i=0; i < attributes.length; i++) + buf.append(indent(attributes[i])); + } + + if(fields.length > 0) { + buf.append("\n" + fields.length + " fields:\n"); + for(int i=0; i < fields.length; i++) + buf.append("\t" + fields[i] + '\n'); + } + + if(methods.length > 0) { + buf.append("\n" + methods.length + " methods:\n"); + for(int i=0; i < methods.length; i++) + buf.append("\t" + methods[i] + '\n'); + } + + return buf.toString(); + } + + private static final String indent(Object obj) { + StringTokenizer tok = new StringTokenizer(obj.toString(), "\n"); + StringBuffer buf = new StringBuffer(); + + while(tok.hasMoreTokens()) + buf.append("\t" + tok.nextToken() + "\n"); + + return buf.toString(); + } + + /** + * @return deep copy of this class + */ + public JavaClass copy() { + JavaClass c = null; + + try { + c = (JavaClass)clone(); + } catch(CloneNotSupportedException e) {} + + c.constant_pool = constant_pool.copy(); + c.interfaces = (int[])interfaces.clone(); + c.interface_names = (String[])interface_names.clone(); + + c.fields = new Field[fields.length]; + for(int i=0; i < fields.length; i++) + c.fields[i] = fields[i].copy(c.constant_pool); + + c.methods = new Method[methods.length]; + for(int i=0; i < methods.length; i++) + c.methods[i] = methods[i].copy(c.constant_pool); + + c.attributes = new Attribute[attributes.length]; + for(int i=0; i < attributes.length; i++) + c.attributes[i] = attributes[i].copy(c.constant_pool); + + return c; + } + + public final boolean instanceOf(JavaClass super_class) { + return Repository.instanceOf(this, super_class); + } + + public final boolean isSuper() { + return (access_flags & Constants.ACC_SUPER) != 0; + } + + public final boolean isClass() { + return (access_flags & Constants.ACC_INTERFACE) == 0; + } + + /** @return returns either HEAP (generated), FILE, or ZIP + */ + public final byte getSource() { + return source; + } +} diff --git a/src/java/org/apache/bcel/classfile/LineNumber.java b/src/java/org/apache/bcel/classfile/LineNumber.java new file mode 100644 index 00000000..d7b76ae8 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/LineNumber.java @@ -0,0 +1,164 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents a (PC offset, line number) pair, i.e., a line number in + * the source that corresponds to a relative address in the byte code. This + * is used for debugging purposes. + * + * @version $Id$ + * @author M. Dahm + * @see LineNumberTable + */ +public final class LineNumber implements Cloneable, Node { + private int start_pc; // Program Counter (PC) corresponds to line + private int line_number; // number in source file + + /** + * Initialize from another object. + */ + public LineNumber(LineNumber c) { + this(c.getStartPC(), c.getLineNumber()); + } + + /** + * Construct object from file stream. + * @param file Input stream + * @throw IOException + */ + LineNumber(DataInputStream file) throws IOException + { + this(file.readUnsignedShort(), file.readUnsignedShort()); + } + + /** + * @param start_pc Program Counter (PC) corresponds to + * @param line_number line number in source file + */ + public LineNumber(int start_pc, int line_number) + { + this.start_pc = start_pc; + this.line_number = line_number; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitLineNumber(this); + } + + /** + * Dump line number/pc pair to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeShort(start_pc); + file.writeShort(line_number); + + } + /** + * @return Corresponding source line + */ + public final int getLineNumber() { return line_number; } + + /** + * @return PC in code + */ + public final int getStartPC() { return start_pc; } + + /** + * @param line_number. + */ + public final void setLineNumber(int line_number) { + this.line_number = line_number; + } + + /** + * @param start_pc. + */ + public final void setStartPC(int start_pc) { + this.start_pc = start_pc; + } + + /** + * @return String representation + */ + public final String toString() { + return "LineNumber(" + start_pc + ", " + line_number + ")"; + } + + /** + * @return deep copy of this object + */ + public LineNumber copy() { + try { + return (LineNumber)clone(); + } catch(CloneNotSupportedException e) {} + + return null; + } +} diff --git a/src/java/org/apache/bcel/classfile/LineNumberTable.java b/src/java/org/apache/bcel/classfile/LineNumberTable.java new file mode 100644 index 00000000..bc71ca80 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/LineNumberTable.java @@ -0,0 +1,234 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents a table of line numbers for debugging + * purposes. This attribute is used by the Code attribute. It + * contains pairs of PCs and line numbers. + * + * @version $Id$ + * @author M. Dahm + * @see Code + * @see LineNumber + */ +public final class LineNumberTable extends Attribute { + private int line_number_table_length; + private LineNumber[] line_number_table; // Table of line/numbers pairs + + /* + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use copy() for a physical copy. + */ + public LineNumberTable(LineNumberTable c) { + this(c.getNameIndex(), c.getLength(), c.getLineNumberTable(), + c.getConstantPool()); + } + + /* + * @param name_index Index of name + * @param length Content length in bytes + * @param line_number_table Table of line/numbers pairs + * @param constant_pool Array of constants + */ + public LineNumberTable(int name_index, int length, + LineNumber[] line_number_table, + ConstantPool constant_pool) + { + super(Constants.ATTR_LINE_NUMBER_TABLE, name_index, length, constant_pool); + setLineNumberTable(line_number_table); + } + + /** + * Construct object from file stream. + * @param name_index Index of name + * @param length Content length in bytes + * @param file Input stream + * @throw IOException + * @param constant_pool Array of constants + */ + LineNumberTable(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(name_index, length, (LineNumber[])null, constant_pool); + line_number_table_length = (file.readUnsignedShort()); + line_number_table = new LineNumber[line_number_table_length]; + + for(int i=0; i < line_number_table_length; i++) + line_number_table[i] = new LineNumber(file); + } + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitLineNumberTable(this); + } + /** + * Dump line number table attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + file.writeShort(line_number_table_length); + for(int i=0; i < line_number_table_length; i++) + line_number_table[i].dump(file); + } + + /** + * @return Array of (pc offset, line number) pairs. + */ + public final LineNumber[] getLineNumberTable() { return line_number_table; } + + /** + * @param line_number_table. + */ + public final void setLineNumberTable(LineNumber[] line_number_table) { + this.line_number_table = line_number_table; + + line_number_table_length = (line_number_table == null)? 0 : + line_number_table.length; + } + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer(); + StringBuffer line = new StringBuffer(); + + for(int i=0; i < line_number_table_length; i++) { + line.append(line_number_table[i].toString()); + + if(i < line_number_table_length - 1) + line.append(", "); + + if(line.length() > 72) { + line.append('\n'); + buf.append(line); + line.setLength(0); + } + } + + buf.append(line); + + return buf.toString(); + } + + /** + * Map byte code positions to source code lines. + * + * @param pos byte code offset + * @return corresponding line in source code + */ + public int getSourceLine(int pos) { + int l = 0, r = line_number_table_length-1; + + if(r < 0) // array is empty + return -1; + + int min_index = -1, min=-1; + + /* Do a binary search since the array is ordered. + */ + do { + int i = (l + r) / 2; + int j = line_number_table[i].getStartPC(); + + if(j == pos) + return line_number_table[i].getLineNumber(); + else if(pos < j) // else constrain search area + r = i - 1; + else // pos > j + l = i + 1; + + /* If exact match can't be found (which is the most common case) + * return the line number that corresponds to the greatest index less + * than pos. + */ + if(j < pos && j > min) { + min = j; + min_index = i; + } + } while(l <= r); + + return line_number_table[min_index].getLineNumber(); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + LineNumberTable c = (LineNumberTable)clone(); + + c.line_number_table = new LineNumber[line_number_table_length]; + for(int i=0; i < line_number_table_length; i++) + c.line_number_table[i] = line_number_table[i].copy(); + + c.constant_pool = constant_pool; + return c; + } + + public final int getTableLength() { return line_number_table_length; } +} diff --git a/src/java/org/apache/bcel/classfile/LocalVariable.java b/src/java/org/apache/bcel/classfile/LocalVariable.java new file mode 100644 index 00000000..76a67c0f --- /dev/null +++ b/src/java/org/apache/bcel/classfile/LocalVariable.java @@ -0,0 +1,257 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents a local variable within a method. It contains its + * scope, name, signature and index on the method's frame. + * + * @version $Id$ + * @author M. Dahm + * @see LocalVariableTable + */ +public final class LocalVariable implements Constants, Cloneable, Node { + private int start_pc; // Range in which the variable is valid + private int length; + private int name_index; // Index in constant pool of variable name + private int signature_index; // Index of variable signature + private int index; /* Variable is `index'th local variable on + * this method's frame. + */ + + private ConstantPool constant_pool; + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use copy() for a physical copy. + */ + public LocalVariable(LocalVariable c) { + this(c.getStartPC(), c.getLength(), c.getNameIndex(), + c.getSignatureIndex(), c.getIndex(), c.getConstantPool()); + } + + /** + * Construct object from file stream. + * @param file Input stream + * @throw IOException + */ + LocalVariable(DataInputStream file, ConstantPool constant_pool) + throws IOException + { + this(file.readUnsignedShort(), file.readUnsignedShort(), + file.readUnsignedShort(), file.readUnsignedShort(), + file.readUnsignedShort(), constant_pool); + } + + /** + * @param start_pc Range in which the variable + * @param length ... is valid + * @param name_index Index in constant pool of variable name + * @param signature_index Index of variable's signature + * @param index Variable is `index'th local variable on the method's frame + * @param constant_pool Array of constants + */ + public LocalVariable(int start_pc, int length, int name_index, + int signature_index, int index, + ConstantPool constant_pool) + { + this.start_pc = start_pc; + this.length = length; + this.name_index = name_index; + this.signature_index = signature_index; + this.index = index; + this.constant_pool = constant_pool; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitLocalVariable(this); + } + + /** + * Dump local variable to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeShort(start_pc); + file.writeShort(length); + file.writeShort(name_index); + file.writeShort(signature_index); + file.writeShort(index); + } + + /** + * @return Constant pool used by this object. + */ + public final ConstantPool getConstantPool() { return constant_pool; } + + /** + * @return Variable is valid within getStartPC() .. getStartPC()+getLength() + */ + public final int getLength() { return length; } + + /** + * @return Variable name. + */ + public final String getName() { + ConstantUtf8 c; + + c = (ConstantUtf8)constant_pool.getConstant(name_index, CONSTANT_Utf8); + return c.getBytes(); + } + + /** + * @return Index in constant pool of variable name. + */ + public final int getNameIndex() { return name_index; } + + /** + * @return Signature. + */ + public final String getSignature() { + ConstantUtf8 c; + c = (ConstantUtf8)constant_pool.getConstant(signature_index, + CONSTANT_Utf8); + return c.getBytes(); + } + + /** + * @return Index in constant pool of variable signature. + */ + public final int getSignatureIndex() { return signature_index; } + + /** + * @return index of register where variable is stored + */ + public final int getIndex() { return index; } + + /** + * @return Start of range where he variable is valid + */ + public final int getStartPC() { return start_pc; } + + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool(ConstantPool constant_pool) { + this.constant_pool = constant_pool; + } + + /** + * @param length. + */ + public final void setLength(int length) { + this.length = length; + } + + /** + * @param name_index. + */ + public final void setNameIndex(int name_index) { + this.name_index = name_index; + } + + /** + * @param signature_index. + */ + public final void setSignatureIndex(int signature_index) { + this.signature_index = signature_index; + } + + /** + * @param index. + */ + public final void setIndex(int index) { this.index = index; } + + /** + * @param start_pc Specify range where the local variable is valid. + */ + public final void setStartPC(int start_pc) { + this.start_pc = start_pc; + } + + /** + * @return string representation. + */ + public final String toString() { + String name = getName(), signature = Utility.signatureToString(getSignature()); + + return "LocalVariable(start_pc = " + start_pc + ", length = " + length + + ", index = " + index + ":" + signature + " " + name + ")"; + } + + /** + * @return deep copy of this object + */ + public LocalVariable copy() { + try { + return (LocalVariable)clone(); + } catch(CloneNotSupportedException e) {} + + return null; + } +} diff --git a/src/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/java/org/apache/bcel/classfile/LocalVariableTable.java new file mode 100644 index 00000000..809b6406 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -0,0 +1,196 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents colection of local variables in a + * method. This attribute is contained in the Code attribute. + * + * @version $Id$ + * @author M. Dahm + * @see Code + * @see LocalVariable + */ +public class LocalVariableTable extends Attribute { + private int local_variable_table_length; // Table of local + private LocalVariable[] local_variable_table; // variables + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use copy() for a physical copy. + */ + public LocalVariableTable(LocalVariableTable c) { + this(c.getNameIndex(), c.getLength(), c.getLocalVariableTable(), + c.getConstantPool()); + } + + /** + * @param name_index Index in constant pool to `LocalVariableTable' + * @param length Content length in bytes + * @param local_variable_table Table of local variables + * @param constant_pool Array of constants + */ + public LocalVariableTable(int name_index, int length, + LocalVariable[] local_variable_table, + ConstantPool constant_pool) + { + super(Constants.ATTR_LOCAL_VARIABLE_TABLE, name_index, length, constant_pool); + setLocalVariableTable(local_variable_table); + } + + /** + * Construct object from file stream. + * @param name_index Index in constant pool + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throw IOException + */ + LocalVariableTable(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(name_index, length, (LocalVariable[])null, constant_pool); + + local_variable_table_length = (file.readUnsignedShort()); + local_variable_table = new LocalVariable[local_variable_table_length]; + + for(int i=0; i < local_variable_table_length; i++) + local_variable_table[i] = new LocalVariable(file, constant_pool); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitLocalVariableTable(this); + } + + /** + * Dump local variable table attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + file.writeShort(local_variable_table_length); + for(int i=0; i < local_variable_table_length; i++) + local_variable_table[i].dump(file); + } + + /** + * @return Array of local variables of method. + */ + public final LocalVariable[] getLocalVariableTable() { + return local_variable_table; + } + + /** @return first matching variable using index + */ + public final LocalVariable getLocalVariable(int index) { + for(int i=0; i < local_variable_table_length; i++) + if(local_variable_table[i].getIndex() == index) + return local_variable_table[i]; + + return null; + } + + public final void setLocalVariableTable(LocalVariable[] local_variable_table) + { + this.local_variable_table = local_variable_table; + local_variable_table_length = (local_variable_table == null)? 0 : + local_variable_table.length; + } + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer(""); + + for(int i=0; i < local_variable_table_length; i++) { + buf.append(local_variable_table[i].toString()); + + if(i < local_variable_table_length - 1) + buf.append('\n'); + } + + return buf.toString(); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + LocalVariableTable c = (LocalVariableTable)clone(); + + c.local_variable_table = new LocalVariable[local_variable_table_length]; + for(int i=0; i < local_variable_table_length; i++) + c.local_variable_table[i] = local_variable_table[i].copy(); + + c.constant_pool = constant_pool; + return c; + } + + public final int getTableLength() { return local_variable_table_length; } +} diff --git a/src/java/org/apache/bcel/classfile/Method.java b/src/java/org/apache/bcel/classfile/Method.java new file mode 100644 index 00000000..7acf4389 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Method.java @@ -0,0 +1,216 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents the method info structure, i.e., the representation + * for a method in the class. See JVM specification for details. + * A method has access flags, a name, a signature and a number of attributes. + * + * @version $Id$ + * @author M. Dahm + */ +public final class Method extends FieldOrMethod { + /** + * Empty constructor, all attributes have to be defined via `setXXX' + * methods. Use at your own risk. + */ + public Method() {} + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public Method(Method c) { + super(c); + } + + /** + * Construct object from file stream. + * @param file Input stream + * @throw IOException + * @throw ClassFormatError + */ + Method(DataInputStream file, ConstantPool constant_pool) + throws IOException, ClassFormatError + { + super(file, constant_pool); + } + + /** + * @param access_flags Access rights of method + * @param name_index Points to field name in constant pool + * @param signature_index Points to encoded signature + * @param attributes Collection of attributes + * @param constant_pool Array of constants + */ + public Method(int access_flags, int name_index, int signature_index, + Attribute[] attributes, ConstantPool constant_pool) + { + super(access_flags, name_index, signature_index, attributes, constant_pool); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitMethod(this); + } + + /** + * @return Code attribute of method, if any + */ + public final Code getCode() { + for(int i=0; i < attributes_count; i++) + if(attributes[i] instanceof Code) + return (Code)attributes[i]; + + return null; + } + + /** + * @return ExceptionTable attribute of method, if any, i.e., list all + * exceptions the method may throw not exception handlers! + */ + public final ExceptionTable getExceptionTable() { + for(int i=0; i < attributes_count; i++) + if(attributes[i] instanceof ExceptionTable) + return (ExceptionTable)attributes[i]; + + return null; + } + + /** @return LocalVariableTable of code attribute if any, i.e. the call is forwarded + * to the Code atribute. + */ + public final LocalVariableTable getLocalVariableTable() { + Code code = getCode(); + + if(code != null) + return code.getLocalVariableTable(); + else + return null; + } + + /** @return LineNumberTable of code attribute if any, i.e. the call is forwarded + * to the Code atribute. + */ + public final LineNumberTable getLineNumberTable() { + Code code = getCode(); + + if(code != null) + return code.getLineNumberTable(); + else + return null; + } + + /** + * Return string representation close to declaration format, + * `public static void main(String[] args) throws IOException', e.g. + * + * @return String representation of the method. + */ + public final String toString() { + ConstantUtf8 c; + ConstantValue cv; + String name, signature, access; // Short cuts to constant pool + String exceptions; + StringBuffer buf; + Attribute[] attr; + + access = Utility.accessToString(access_flags); + + // Get name and signature from constant pool + c = (ConstantUtf8)constant_pool.getConstant(signature_index, + Constants.CONSTANT_Utf8); + signature = c.getBytes(); + + c = (ConstantUtf8)constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8); + name = c.getBytes(); + + signature = Utility.methodSignatureToString(signature, name, access, true, + getLocalVariableTable()); + buf = new StringBuffer(signature); + + for(int i=0; i < attributes_count; i++) { + Attribute a = attributes[i]; + + if(!((a instanceof Code) || (a instanceof ExceptionTable))) + buf.append(" [" + a.toString() + "]"); + } + + ExceptionTable e = getExceptionTable(); + if(e != null) { + String str = e.toString(); + if(!str.equals("")) + buf.append("\n\t\tthrows " + str); + } + + return buf.toString(); + } + + /** + * @return deep copy of this method + */ + public final Method copy(ConstantPool constant_pool) { + return (Method)copy_(constant_pool); + } +} diff --git a/src/java/org/apache/bcel/classfile/Node.java b/src/java/org/apache/bcel/classfile/Node.java new file mode 100644 index 00000000..28b8c6ff --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Node.java @@ -0,0 +1,65 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denote class to have an accept method(); + * + * @version $Id$ + * @author M. Dahm + */ +public interface Node { + public void accept(Visitor obj); +} diff --git a/src/java/org/apache/bcel/classfile/PMGClass.java b/src/java/org/apache/bcel/classfile/PMGClass.java new file mode 100644 index 00000000..d76b34c8 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/PMGClass.java @@ -0,0 +1,189 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from Attribute and represents a reference + * to a PMG + * attribute. + * + * @version $Id$ + * @author M. Dahm + * @see Attribute + */ +public final class PMGClass extends Attribute { + private int pmg_class_index, pmg_index; + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public PMGClass(PMGClass c) { + this(c.getNameIndex(), c.getLength(), c.getPMGIndex(), c.getPMGClassIndex(), + c.getConstantPool()); + } + + /** + * Construct object from file stream. + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throw IOException + */ + PMGClass(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(name_index, length, file.readUnsignedShort(), file.readUnsignedShort(), + constant_pool); + } + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param constant_pool Array of constants + * @param PMGClass_index Index in constant pool to CONSTANT_Utf8 + */ + public PMGClass(int name_index, int length, int pmg_index, int pmg_class_index, + ConstantPool constant_pool) + { + super(Constants.ATTR_PMG, name_index, length, constant_pool); + this.pmg_index = pmg_index; + this.pmg_class_index = pmg_class_index; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + System.err.println("Visiting non-standard PMGClass object"); + } + + /** + * Dump source file attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + file.writeShort(pmg_index); + file.writeShort(pmg_class_index); + } + + /** + * @return Index in constant pool of source file name. + */ + public final int getPMGClassIndex() { return pmg_class_index; } + + /** + * @param PMGClass_index. + */ + public final void setPMGClassIndex(int pmg_class_index) { + this.pmg_class_index = pmg_class_index; + } + + /** + * @return Index in constant pool of source file name. + */ + public final int getPMGIndex() { return pmg_index; } + + /** + * @param PMGClass_index. + */ + public final void setPMGIndex(int pmg_index) { + this.pmg_index = pmg_index; + } + + /** + * @return PMG name. + */ + public final String getPMGName() { + ConstantUtf8 c = (ConstantUtf8)constant_pool.getConstant(pmg_index, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + /** + * @return PMG class name. + */ + public final String getPMGClassName() { + ConstantUtf8 c = (ConstantUtf8)constant_pool.getConstant(pmg_class_index, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + /** + * @return String representation + */ + public final String toString() { + return "PMGClass(" + getPMGName() + ", " + getPMGClassName() + ")"; + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + return (PMGClass)clone(); + } +} diff --git a/src/java/org/apache/bcel/classfile/Signature.java b/src/java/org/apache/bcel/classfile/Signature.java new file mode 100644 index 00000000..7da60b9b --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Signature.java @@ -0,0 +1,295 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from Attribute and represents a reference + * to a GJ attribute. + * + * @version $Id$ + * @author M. Dahm + * @see Attribute + */ +public final class Signature extends Attribute { + private int signature_index; + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public Signature(Signature c) { + this(c.getNameIndex(), c.getLength(), c.getSignatureIndex(), c.getConstantPool()); + } + + /** + * Construct object from file stream. + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throw IOException + */ + Signature(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(name_index, length, file.readUnsignedShort(), constant_pool); + } + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param constant_pool Array of constants + * @param Signature_index Index in constant pool to CONSTANT_Utf8 + */ + public Signature(int name_index, int length, int signature_index, + ConstantPool constant_pool) + { + super(Constants.ATTR_SIGNATURE, name_index, length, constant_pool); + this.signature_index = signature_index; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + System.err.println("Visiting non-standard Signature object"); + } + + /** + * Dump source file attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + file.writeShort(signature_index); + } + + /** + * @return Index in constant pool of source file name. + */ + public final int getSignatureIndex() { return signature_index; } + + /** + * @param Signature_index. + */ + public final void setSignatureIndex(int signature_index) { + this.signature_index = signature_index; + } + + /** + * @return GJ signature. + */ + public final String getSignature() { + ConstantUtf8 c = (ConstantUtf8)constant_pool.getConstant(signature_index, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + /** + * Extends ByteArrayInputStream to make 'unreading' chars possible. + */ + private static final class MyByteArrayInputStream extends ByteArrayInputStream { + MyByteArrayInputStream(String data) { super(data.getBytes()); } + final int mark() { return pos; } + final String getData() { return new String(buf); } + final void reset(int p) { pos = p; } + final void unread() { if(pos > 0) pos--; } + } + + private static boolean identStart(int ch) { + return ch == 'T' || ch == 'L'; + } + + private static boolean identPart(int ch) { + return ch == '/' || ch == ';'; + } + + private static final void matchIdent(MyByteArrayInputStream in, StringBuffer buf) { + int ch; + + if((ch = in.read()) == -1) + throw new RuntimeException("Illegal signature: " + in.getData() + + " no ident, reaching EOF"); + + //System.out.println("return from ident:" + (char)ch); + + if(!identStart(ch)) { + StringBuffer buf2 = new StringBuffer(); + + int count = 1; + while(Character.isJavaIdentifierPart((char)ch)) { + buf2.append((char)ch); + count++; + ch = in.read(); + } + + if(ch == ':') { // Ok, formal parameter + in.skip("Ljava/lang/Object".length()); + buf.append(buf2); + + ch = in.read(); + in.unread(); + //System.out.println("so far:" + buf2 + ":next:" +(char)ch); + } else { + for(int i=0; i < count; i++) + in.unread(); + } + + return; + } + + StringBuffer buf2 = new StringBuffer(); + ch = in.read(); + + do { + buf2.append((char)ch); + ch = in.read(); + //System.out.println("within ident:"+ (char)ch); + + } while((ch != -1) && (Character.isJavaIdentifierPart((char)ch) || (ch == '/'))); + + buf.append(buf2.toString().replace('/', '.')); + + //System.out.println("regular return ident:"+ (char)ch + ":" + buf2); + + if(ch != -1) + in.unread(); + } + + private static final void matchGJIdent(MyByteArrayInputStream in, + StringBuffer buf) + { + int ch; + + matchIdent(in, buf); + + ch = in.read(); + if((ch == '<') || ch == '(') { // Parameterized or method + //System.out.println("Enter <"); + buf.append((char)ch); + matchGJIdent(in, buf); + + while(((ch = in.read()) != '>') && (ch != ')')) { // List of parameters + if(ch == -1) + throw new RuntimeException("Illegal signature: " + in.getData() + + " reaching EOF"); + + //System.out.println("Still no >"); + buf.append(", "); + in.unread(); + matchGJIdent(in, buf); // Recursive call + } + + //System.out.println("Exit >"); + + buf.append((char)ch); + } else + in.unread(); + + ch = in.read(); + if(identStart(ch)) { + in.unread(); + matchGJIdent(in, buf); + } else if(ch == ')') { + in.unread(); + return; + } else if(ch != ';') + throw new RuntimeException("Illegal signature: " + in.getData() + " read " + + (char)ch); + } + + public static String translate(String s) { + //System.out.println("Sig:" + s); + StringBuffer buf = new StringBuffer(); + + matchGJIdent(new MyByteArrayInputStream(s), buf); + + return buf.toString(); + } + + public static final boolean isFormalParameterList(String s) { + return s.startsWith("<") && (s.indexOf(':') > 0); + } + + public static final boolean isActualParameterList(String s) { + return s.startsWith("L") && s.endsWith(">;"); + } + + /** + * @return String representation + */ + public final String toString() { + String s = getSignature(); + + return "Signature(" + s + ")"; + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + return (Signature)clone(); + } +} diff --git a/src/java/org/apache/bcel/classfile/SourceFile.java b/src/java/org/apache/bcel/classfile/SourceFile.java new file mode 100644 index 00000000..2e9db567 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/SourceFile.java @@ -0,0 +1,165 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from Attribute and represents a reference + * to the source file of this class. + * It is instantiated from the Attribute.readAttribute() method. + * + * @version $Id$ + * @author M. Dahm + * @see Attribute + */ +public final class SourceFile extends Attribute { + private int sourcefile_index; + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public SourceFile(SourceFile c) { + this(c.getNameIndex(), c.getLength(), c.getSourceFileIndex(), + c.getConstantPool()); + } + + /** + * Construct object from file stream. + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throw IOException + */ + SourceFile(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(name_index, length, file.readUnsignedShort(), constant_pool); + } + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param constant_pool Array of constants + * @param sourcefile_index Index in constant pool to CONSTANT_Utf8 + */ + public SourceFile(int name_index, int length, int sourcefile_index, + ConstantPool constant_pool) + { + super(Constants.ATTR_SOURCE_FILE, name_index, length, constant_pool); + this.sourcefile_index = sourcefile_index; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitSourceFile(this); + } + + /** + * Dump source file attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + file.writeShort(sourcefile_index); + } + + /** + * @return Index in constant pool of source file name. + */ + public final int getSourceFileIndex() { return sourcefile_index; } + + /** + * @param sourcefile_index. + */ + public final void setSourceFileIndex(int sourcefile_index) { + this.sourcefile_index = sourcefile_index; + } + + /** + * @return Source file name. + */ + public final String getSourceFileName() { + ConstantUtf8 c = (ConstantUtf8)constant_pool.getConstant(sourcefile_index, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + /** + * @return String representation + */ + public final String toString() { + return "SourceFile(" + getSourceFileName() + ")"; + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + return (SourceFile)clone(); + } +} diff --git a/src/java/org/apache/bcel/classfile/StackMap.java b/src/java/org/apache/bcel/classfile/StackMap.java new file mode 100644 index 00000000..50460ebc --- /dev/null +++ b/src/java/org/apache/bcel/classfile/StackMap.java @@ -0,0 +1,185 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents a stack map attribute used for + * preverification of Java classes for the Java 2 Micro Edition + * (J2ME). This attribute is used by the KVM and contained + * within the Code attribute of a method. See CLDC specification + * §5.3.1.2 + * + * @version $Id$ + * @author M. Dahm + * @see Code + * @see StackMapEntry + * @see StackMapType + */ +public final class StackMap extends Attribute implements Node { + private int map_length; + private StackMapEntry[] map; // Table of stack map entries + + /* + * @param name_index Index of name + * @param length Content length in bytes + * @param map Table of stack map entries + * @param constant_pool Array of constants + */ + public StackMap(int name_index, int length, StackMapEntry[] map, + ConstantPool constant_pool) + { + super(Constants.ATTR_STACK_MAP, name_index, length, constant_pool); + + setStackMap(map); + } + + /** + * Construct object from file stream. + * @param name_index Index of name + * @param length Content length in bytes + * @param file Input stream + * @throw IOException + * @param constant_pool Array of constants + */ + StackMap(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(name_index, length, (StackMapEntry[])null, constant_pool); + + map_length = file.readUnsignedShort(); + map = new StackMapEntry[map_length]; + + for(int i=0; i < map_length; i++) + map[i] = new StackMapEntry(file, constant_pool); + } + + /** + * Dump line number table attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + file.writeShort(map_length); + for(int i=0; i < map_length; i++) + map[i].dump(file); + } + + /** + * @return Array of stack map entries + */ + public final StackMapEntry[] getStackMap() { return map; } + + /** + * @param map Array of stack map entries + */ + public final void setStackMap(StackMapEntry[] map) { + this.map = map; + + map_length = (map == null)? 0 : map.length; + } + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer("StackMap("); + + for(int i=0; i < map_length; i++) { + buf.append(map[i].toString()); + + if(i < map_length - 1) + buf.append(", "); + } + + buf.append(')'); + + return buf.toString(); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + StackMap c = (StackMap)clone(); + + c.map = new StackMapEntry[map_length]; + for(int i=0; i < map_length; i++) + c.map[i] = map[i].copy(); + + c.constant_pool = constant_pool; + return c; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackMap(this); + } + + public final int getMapLength() { return map_length; } +} diff --git a/src/java/org/apache/bcel/classfile/StackMapEntry.java b/src/java/org/apache/bcel/classfile/StackMapEntry.java new file mode 100644 index 00000000..a64184ea --- /dev/null +++ b/src/java/org/apache/bcel/classfile/StackMapEntry.java @@ -0,0 +1,209 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents a stack map entry recording the types of + * local variables and the the of stack items at a given byte code offset. + * See CLDC specification §5.3.1.2 + * + * @version $Id$ + * @author M. Dahm + * @see StackMap + * @see StackMapType + */ +public final class StackMapEntry implements Cloneable { + private int byte_code_offset; + private int number_of_locals; + private StackMapType[] types_of_locals; + private int number_of_stack_items; + private StackMapType[] types_of_stack_items; + private ConstantPool constant_pool; + + /** + * Construct object from file stream. + * @param file Input stream + * @throw IOException + */ + StackMapEntry(DataInputStream file, ConstantPool constant_pool) throws IOException + { + this(file.readShort(), file.readShort(), null, -1, null, constant_pool); + + types_of_locals = new StackMapType[number_of_locals]; + for(int i=0; i < number_of_locals; i++) + types_of_locals[i] = new StackMapType(file, constant_pool); + + number_of_stack_items = file.readShort(); + types_of_stack_items = new StackMapType[number_of_stack_items]; + for(int i=0; i < number_of_stack_items; i++) + types_of_stack_items[i] = new StackMapType(file, constant_pool); + } + + public StackMapEntry(int byte_code_offset, int number_of_locals, + StackMapType[] types_of_locals, + int number_of_stack_items, + StackMapType[] types_of_stack_items, + ConstantPool constant_pool) { + this.byte_code_offset = byte_code_offset; + this.number_of_locals = number_of_locals; + this.types_of_locals = types_of_locals; + this.number_of_stack_items = number_of_stack_items; + this.types_of_stack_items = types_of_stack_items; + this.constant_pool = constant_pool; + } + + /** + * Dump stack map entry + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeShort(byte_code_offset); + + file.writeShort(number_of_locals); + for(int i=0; i < number_of_locals; i++) + types_of_locals[i].dump(file); + + file.writeShort(number_of_stack_items); + for(int i=0; i < number_of_stack_items; i++) + types_of_stack_items[i].dump(file); + } + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer("(offset=" + byte_code_offset); + + if(number_of_locals > 0) { + buf.append(", locals={"); + + for(int i=0; i < number_of_locals; i++) { + buf.append(types_of_locals[i]); + if(i < number_of_locals - 1) + buf.append(", "); + } + + buf.append("}"); + } + + if(number_of_stack_items > 0) { + buf.append(", stack items={"); + + for(int i=0; i < number_of_stack_items; i++) { + buf.append(types_of_stack_items[i]); + if(i < number_of_stack_items - 1) + buf.append(", "); + } + + buf.append("}"); + } + + buf.append(")"); + + return buf.toString(); + } + + + public void setByteCodeOffset(int b) { byte_code_offset = b; } + public int getByteCodeOffset() { return byte_code_offset; } + public void setNumberOfLocals(int n) { number_of_locals = n; } + public int getNumberOfLocals() { return number_of_locals; } + public void setTypesOfLocals(StackMapType[] t) { types_of_locals = t; } + public StackMapType[] getTypesOfLocals() { return types_of_locals; } + public void setNumberOfStackItems(int n) { number_of_stack_items = n; } + public int getNumberOfStackItems() { return number_of_stack_items; } + public void setTypesOfStackItems(StackMapType[] t) { types_of_stack_items = t; } + public StackMapType[] getTypesOfStackItems() { return types_of_stack_items; } + + /** + * @return deep copy of this object + */ + public StackMapEntry copy() { + try { + return (StackMapEntry)clone(); + } catch(CloneNotSupportedException e) {} + + return null; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackMapEntry(this); + } + + /** + * @return Constant pool used by this object. + */ + public final ConstantPool getConstantPool() { return constant_pool; } + + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool(ConstantPool constant_pool) { + this.constant_pool = constant_pool; + } +} diff --git a/src/java/org/apache/bcel/classfile/StackMapType.java b/src/java/org/apache/bcel/classfile/StackMapType.java new file mode 100644 index 00000000..39f63092 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/StackMapType.java @@ -0,0 +1,172 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class represents the type of a local variable or item on stack + * used in the StackMap entries. + * + * @version $Id$ + * @author M. Dahm + * @see StackMapEntry + * @see StackMap + * @see Constants + */ +public final class StackMapType implements Cloneable { + private byte type; + private int index = -1; // Index to CONSTANT_Class or offset + private ConstantPool constant_pool; + + /** + * Construct object from file stream. + * @param file Input stream + * @throw IOException + */ + StackMapType(DataInputStream file, ConstantPool constant_pool) throws IOException + { + this(file.readByte(), -1, constant_pool); + + if(hasIndex()) + setIndex(file.readShort()); + + setConstantPool(constant_pool); + } + + /** + * @param type type tag as defined in the Constants interface + * @param index index to constant pool, or byte code offset + */ + public StackMapType(byte type, int index, ConstantPool constant_pool) { + setType(type); + setIndex(index); + setConstantPool(constant_pool); + } + + public void setType(byte t) { + if((t < Constants.ITEM_Bogus) || (t > Constants.ITEM_NewObject)) + throw new RuntimeException("Illegal type for StackMapType: " + t); + type = t; + } + + public byte getType() { return type; } + public void setIndex(int t) { index = t; } + + /** @return index to constant pool if type == ITEM_Object, or offset + * in byte code, if type == ITEM_NewObject, and -1 otherwise + */ + public int getIndex() { return index; } + + /** + * Dump type entries to file. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + file.writeByte(type); + if(hasIndex()) + file.writeShort(getIndex()); + } + + /** @return true, if type is either ITEM_Object or ITEM_NewObject + */ + public final boolean hasIndex() { + return ((type == Constants.ITEM_Object) || + (type == Constants.ITEM_NewObject)); + } + + private String printIndex() { + if(type == Constants.ITEM_Object) + return ", class=" + constant_pool.constantToString(index, Constants.CONSTANT_Class); + else if(type == Constants.ITEM_NewObject) + return ", offset=" + index; + else + return ""; + } + + /** + * @return String representation + */ + public final String toString() { + return "(type=" + Constants.ITEM_NAMES[type] + printIndex() + ")"; + } + + /** + * @return deep copy of this object + */ + public StackMapType copy() { + try { + return (StackMapType)clone(); + } catch(CloneNotSupportedException e) {} + + return null; + } + + /** + * @return Constant pool used by this object. + */ + public final ConstantPool getConstantPool() { return constant_pool; } + + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool(ConstantPool constant_pool) { + this.constant_pool = constant_pool; + } +} diff --git a/src/java/org/apache/bcel/classfile/Synthetic.java b/src/java/org/apache/bcel/classfile/Synthetic.java new file mode 100644 index 00000000..c06c630e --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Synthetic.java @@ -0,0 +1,171 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class is derived from Attribute and declares this class + * as `synthetic', i.e., it needs special handling. + * It is instantiated from the Attribute.readAttribute() method. + * + * @version $Id$ + * @author M. Dahm + * @see Attribute + */ +public final class Synthetic extends Attribute { + private byte[] bytes; + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use copy() for a physical copy. + */ + public Synthetic(Synthetic c) { + this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); + } + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param bytes Attribute contents + * @param constant_pool Array of constants + * @param sourcefile_index Index in constant pool to CONSTANT_Utf8 + */ + public Synthetic(int name_index, int length, byte[] bytes, + ConstantPool constant_pool) + { + super(Constants.ATTR_SYNTHETIC, name_index, length, constant_pool); + this.bytes = bytes; + } + + /** + * Construct object from file stream. + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throw IOException + */ + Synthetic(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(name_index, length, (byte [])null, constant_pool); + + if(length > 0) { + bytes = new byte[length]; + file.readFully(bytes); + System.err.println("Synthetic attribute with length > 0"); + } + } + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitSynthetic(this); + } + /** + * Dump source file attribute to file stream in binary format. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + if(length > 0) + file.write(bytes, 0, length); + } + /** + * @return data bytes. + */ + public final byte[] getBytes() { return bytes; } + + /** + * @param bytes. + */ + public final void setBytes(byte[] bytes) { + this.bytes = bytes; + } + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer("Synthetic"); + + if(length > 0) + buf.append(" " + Utility.toHexString(bytes)); + + return buf.toString(); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + Synthetic c = (Synthetic)clone(); + + if(bytes != null) + c.bytes = (byte[])bytes.clone(); + + c.constant_pool = constant_pool; + return c; + } +} diff --git a/src/java/org/apache/bcel/classfile/Unknown.java b/src/java/org/apache/bcel/classfile/Unknown.java new file mode 100644 index 00000000..e6f17efd --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Unknown.java @@ -0,0 +1,205 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import java.io.*; +import java.util.*; + +/** + * This class represents a reference to an unknown (i.e., + * application-specific) attribute of a class. It is instantiated + * from the Attribute.readAttribute() method. + * + * @version $Id$ + * @author M. Dahm + */ +public final class Unknown extends Attribute { + private byte[] bytes; + private String name; + + private static HashMap unknown_attributes = new HashMap(); + + /** @return array of unknown attributes, but just one for each kind. + */ + static Unknown[] getUnknownAttributes() { + Unknown[] unknowns = new Unknown[unknown_attributes.size()]; + Iterator entries = unknown_attributes.values().iterator(); + + for(int i=0; entries.hasNext(); i++) + unknowns[i] = (Unknown)entries.next(); + + unknown_attributes.clear(); + return unknowns; + } + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public Unknown(Unknown c) { + this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); + } + + /** + * Create a non-standard attribute. + * + * @param name_index Index in constant pool + * @param length Content length in bytes + * @param bytes Attribute contents + * @param constant_pool Array of constants + */ + public Unknown(int name_index, int length, byte[] bytes, + ConstantPool constant_pool) + { + super(Constants.ATTR_UNKNOWN, name_index, length, constant_pool); + this.bytes = bytes; + + name = ((ConstantUtf8)constant_pool.getConstant(name_index, + Constants.CONSTANT_Utf8)).getBytes(); + unknown_attributes.put(name, this); + } + + /** + * Construct object from file stream. + * @param name_index Index in constant pool + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throw IOException + */ + Unknown(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) + throws IOException + { + this(name_index, length, (byte [])null, constant_pool); + + if(length > 0) { + bytes = new byte[length]; + file.readFully(bytes); + } + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitUnknown(this); + } + /** + * Dump unknown bytes to file stream. + * + * @param file Output file stream + * @throw IOException + */ + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + if(length > 0) + file.write(bytes, 0, length); + } + /** + * @return data bytes. + */ + public final byte[] getBytes() { return bytes; } + + /** + * @return name of attribute. + */ + public final String getName() { return name; } + + /** + * @param bytes. + */ + public final void setBytes(byte[] bytes) { + this.bytes = bytes; + } + + /** + * @return String representation. + */ + public final String toString() { + if(length == 0 || bytes == null) + return "(Unknown attribute " + name + ")"; + + String hex; + if(length > 10) { + byte[] tmp = new byte[10]; + System.arraycopy(bytes, 0, tmp, 0, 10); + hex = Utility.toHexString(tmp) + "... (truncated)"; + } + else + hex = Utility.toHexString(bytes); + + return "(Unknown attribute " + name + ": " + hex + ")"; + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + Unknown c = (Unknown)clone(); + + if(bytes != null) + c.bytes = (byte[])bytes.clone(); + + c.constant_pool = constant_pool; + return c; + } +} diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java new file mode 100644 index 00000000..6eb2a696 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -0,0 +1,1355 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.util.ByteSequence; +import java.io.*; +import java.util.ArrayList; +import java.util.zip.*; + +/** + * Utility functions that do not really belong to any class in particular. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class Utility { + private static int consumed_chars; /* How many chars have been consumed + * during parsing in signatureToString(). + * Read by methodSignatureToString(). + * Set by side effect,but only internally. + */ + private static boolean wide=false; /* The `WIDE' instruction is used in the + * byte code to allow 16-bit wide indices + * for local variables. This opcode + * precedes an `ILOAD', e.g.. The opcode + * immediately following takes an extra + * byte which is combined with the + * following byte to form a + * 16-bit value. + */ + /** + * Convert bit field of flags into string such as `static final'. + * + * @param access_flags Access flags + * @return String representation of flags + */ + public static final String accessToString(int access_flags) { + return accessToString(access_flags, false); + } + + /** + * Convert bit field of flags into string such as `static final'. + * + * Special case: Classes compiled with new compilers and with the + * `ACC_SUPER' flag would be said to be "synchronized". This is + * because SUN used the same value for the flags `ACC_SUPER' and + * `ACC_SYNCHRONIZED'. + * + * @param access_flags Access flags + * @param for_class access flags are for class qualifiers ? + * @return String representation of flags + */ + public static final String accessToString(int access_flags, + boolean for_class) + { + StringBuffer buf = new StringBuffer(); + + int p = 0; + for(int i=0; p < Constants.MAX_ACC_FLAG; i++) { // Loop through known flags + p = pow2(i); + + if((access_flags & p) != 0) { + /* Special case: Classes compiled with new compilers and with the + * `ACC_SUPER' flag would be said to be "synchronized". This is + * because SUN used the same value for the flags `ACC_SUPER' and + * `ACC_SYNCHRONIZED'. + */ + if(for_class && ((p == Constants.ACC_SUPER) || (p == Constants.ACC_INTERFACE))) + continue; + + buf.append(Constants.ACCESS_NAMES[i] + " "); + } + } + + return buf.toString().trim(); + } + + /** + * @return "class" or "interface", depending on the ACC_INTERFACE flag + */ + public static final String classOrInterface(int access_flags) { + return ((access_flags & Constants.ACC_INTERFACE) != 0)? "interface" : "class"; + } + + /** + * Disassemble a byte array of JVM byte codes starting from code line + * `index' and return the disassembled string representation. Decode only + * `num' opcodes (including their operands), use -1 if you want to + * decompile everything. + * + * @param code byte code array + * @param constant_pool Array of constants + * @param index offset in `code' array + * (number of opcodes, not bytes!) + * @param length number of opcodes to decompile, -1 for all + * @param verbose be verbose, e.g. print constant pool index + * @return String representation of byte codes + */ + public static final String codeToString(byte[] code, + ConstantPool constant_pool, + int index, int length, boolean verbose) + { + StringBuffer buf = new StringBuffer(code.length * 20); // Should be sufficient + ByteSequence stream = new ByteSequence(code); + + try { + for(int i=0; i < index; i++) // Skip `index' lines of code + codeToString(stream, constant_pool, verbose); + + for(int i=0; stream.available() > 0; i++) { + if((length < 0) || (i < length)) { + String indices = fillup(stream.getIndex() + ":", 6, true, ' '); + buf.append(indices + codeToString(stream, constant_pool, verbose) + '\n'); + } + } + } catch(IOException e) { + System.out.println(buf.toString()); + e.printStackTrace(); + throw new ClassFormatError("Byte code error: " + e); + } + + return buf.toString(); + } + + public static final String codeToString(byte[] code, + ConstantPool constant_pool, + int index, int length) { + return codeToString(code, constant_pool, index, length, true); + } + + /** + * Disassemble a stream of byte codes and return the + * string representation. + * + * @param bytes stream of bytes + * @param constant_pool Array of constants + * @param verbose be verbose, e.g. print constant pool index + * @return String representation of byte code + */ + public static final String codeToString(ByteSequence bytes, + ConstantPool constant_pool, boolean verbose) + throws IOException + { + short opcode = (short)bytes.readUnsignedByte(); + int default_offset=0, low, high, npairs; + int index, vindex, constant; + int[] match, jump_table; + int no_pad_bytes=0, offset; + StringBuffer buf = new StringBuffer(Constants.OPCODE_NAMES[opcode]); + + /* Special case: Skip (0-3) padding bytes, i.e., the + * following bytes are 4-byte-aligned + */ + if((opcode == Constants.TABLESWITCH) || (opcode == Constants.LOOKUPSWITCH)) { + int remainder = bytes.getIndex() % 4; + no_pad_bytes = (remainder == 0)? 0 : 4 - remainder; + + for(int i=0; i < no_pad_bytes; i++) { + byte b; + + if((b=bytes.readByte()) != 0) + System.err.println("Warning: Padding byte != 0 in " + + Constants.OPCODE_NAMES[opcode] + ":" + b); + } + + // Both cases have a field default_offset in common + default_offset = bytes.readInt(); + } + + switch(opcode) { + /* Table switch has variable length arguments. + */ + case Constants.TABLESWITCH: + low = bytes.readInt(); + high = bytes.readInt(); + + offset = bytes.getIndex() - 12 - no_pad_bytes - 1; + default_offset += offset; + + buf.append("\tdefault = " + default_offset + ", low = " + low + + ", high = " + high + "("); + + jump_table = new int[high - low + 1]; + for(int i=0; i < jump_table.length; i++) { + jump_table[i] = offset + bytes.readInt(); + buf.append(jump_table[i]); + + if(i < jump_table.length - 1) + buf.append(", "); + } + buf.append(")"); + + break; + + /* Lookup switch has variable length arguments. + */ + case Constants.LOOKUPSWITCH: { + + npairs = bytes.readInt(); + offset = bytes.getIndex() - 8 - no_pad_bytes - 1; + + match = new int[npairs]; + jump_table = new int[npairs]; + default_offset += offset; + + buf.append("\tdefault = " + default_offset + ", npairs = " + npairs + + " ("); + + for(int i=0; i < npairs; i++) { + match[i] = bytes.readInt(); + + jump_table[i] = offset + bytes.readInt(); + + buf.append("(" + match[i] + ", " + jump_table[i] + ")"); + + if(i < npairs - 1) + buf.append(", "); + } + buf.append(")"); + } + break; + + /* Two address bytes + offset from start of byte stream form the + * jump target + */ + case Constants.GOTO: case Constants.IFEQ: case Constants.IFGE: case Constants.IFGT: + case Constants.IFLE: case Constants.IFLT: case Constants.JSR: case Constants.IFNE: + case Constants.IFNONNULL: case Constants.IFNULL: case Constants.IF_ACMPEQ: + case Constants.IF_ACMPNE: case Constants.IF_ICMPEQ: case Constants.IF_ICMPGE: case Constants.IF_ICMPGT: + case Constants.IF_ICMPLE: case Constants.IF_ICMPLT: case Constants.IF_ICMPNE: + buf.append("\t\t#" + ((bytes.getIndex() - 1) + bytes.readShort())); + break; + + /* 32-bit wide jumps + */ + case Constants.GOTO_W: case Constants.JSR_W: + buf.append("\t\t#" + ((bytes.getIndex() - 1) + bytes.readInt())); + break; + + /* Index byte references local variable (register) + */ + case Constants.ALOAD: case Constants.ASTORE: case Constants.DLOAD: case Constants.DSTORE: case Constants.FLOAD: + case Constants.FSTORE: case Constants.ILOAD: case Constants.ISTORE: case Constants.LLOAD: case Constants.LSTORE: + case Constants.RET: + if(wide) { + vindex = bytes.readUnsignedShort(); + wide=false; // Clear flag + } + else + vindex = bytes.readUnsignedByte(); + + buf.append("\t\t%" + vindex); + break; + + /* + * Remember wide byte which is used to form a 16-bit address in the + * following instruction. Relies on that the method is called again with + * the following opcode. + */ + case Constants.WIDE: + wide = true; + buf.append("\t(wide)"); + break; + + /* Array of basic type. + */ + case Constants.NEWARRAY: + buf.append("\t\t<" + Constants.TYPE_NAMES[bytes.readByte()] + ">"); + break; + + /* Access object/class fields. + */ + case Constants.GETFIELD: case Constants.GETSTATIC: case Constants.PUTFIELD: case Constants.PUTSTATIC: + index = bytes.readUnsignedShort(); + buf.append("\t\t" + + constant_pool.constantToString(index, Constants.CONSTANT_Fieldref) + + (verbose? " (" + index + ")" : "")); + break; + + /* Operands are references to classes in constant pool + */ + case Constants.NEW: + case Constants.CHECKCAST: + buf.append("\t"); + case Constants.INSTANCEOF: + index = bytes.readUnsignedShort(); + buf.append("\t<" + constant_pool.constantToString(index, + Constants.CONSTANT_Class) + + ">" + (verbose? " (" + index + ")" : "")); + break; + + /* Operands are references to methods in constant pool + */ + case Constants.INVOKESPECIAL: case Constants.INVOKESTATIC: case Constants.INVOKEVIRTUAL: + index = bytes.readUnsignedShort(); + buf.append("\t" + constant_pool.constantToString(index, + Constants.CONSTANT_Methodref) + + (verbose? " (" + index + ")" : "")); + break; + + case Constants.INVOKEINTERFACE: + index = bytes.readUnsignedShort(); + int nargs = bytes.readUnsignedByte(); // historical, redundant + buf.append("\t" + + constant_pool.constantToString(index, + Constants.CONSTANT_InterfaceMethodref) + + (verbose? " (" + index + ")\t" : "") + nargs + "\t" + + bytes.readUnsignedByte()); // Last byte is a reserved space + break; + + /* Operands are references to items in constant pool + */ + case Constants.LDC_W: case Constants.LDC2_W: + index = bytes.readUnsignedShort(); + + buf.append("\t\t" + constant_pool.constantToString + (index, constant_pool.getConstant(index).getTag()) + + (verbose? " (" + index + ")" : "")); + break; + + case Constants.LDC: + index = bytes.readUnsignedByte(); + + buf.append("\t\t" + + constant_pool.constantToString + (index, constant_pool.getConstant(index).getTag()) + + (verbose? " (" + index + ")" : "")); + break; + + /* Array of references. + */ + case Constants.ANEWARRAY: + index = bytes.readUnsignedShort(); + + buf.append("\t\t<" + compactClassName(constant_pool.getConstantString + (index, Constants.CONSTANT_Class), false) + + ">" + (verbose? " (" + index + ")": "")); + break; + + /* Multidimensional array of references. + */ + case Constants.MULTIANEWARRAY: { + index = bytes.readUnsignedShort(); + int dimensions = bytes.readUnsignedByte(); + + buf.append("\t<" + compactClassName(constant_pool.getConstantString + (index, Constants.CONSTANT_Class), false) + + ">\t" + dimensions + (verbose? " (" + index + ")" : "")); + } + break; + + /* Increment local variable. + */ + case Constants.IINC: + if(wide) { + vindex = bytes.readUnsignedShort(); + constant = bytes.readShort(); + wide = false; + } + else { + vindex = bytes.readUnsignedByte(); + constant = bytes.readByte(); + } + buf.append("\t\t%" + vindex + "\t" + constant); + break; + + default: + if(Constants.NO_OF_OPERANDS[opcode] > 0) { + for(int i=0; i < Constants.TYPE_OF_OPERANDS[opcode].length; i++) { + buf.append("\t\t"); + switch(Constants.TYPE_OF_OPERANDS[opcode][i]) { + case Constants.T_BYTE: buf.append(bytes.readByte()); break; + case Constants.T_SHORT: buf.append(bytes.readShort()); break; + case Constants.T_INT: buf.append(bytes.readInt()); break; + + default: // Never reached + System.err.println("Unreachable default case reached!"); + System.exit(-1); + } + } + } + } + + return buf.toString(); + } + + public static final String codeToString(ByteSequence bytes, ConstantPool constant_pool) + throws IOException + { + return codeToString(bytes, constant_pool, true); + } + + /** + * Shorten long class names, java/lang/String becomes + * String. + * + * @param str The long class name + * @return Compacted class name + */ + public static final String compactClassName(String str) { + return compactClassName(str, true); + } + + /** + * Shorten long class name str, i.e., chop off the prefix, + * if the + * class name starts with this string and the flag chopit is true. + * Slashes / are converted to dots .. + * + * @param str The long class name + * @param prefix The prefix the get rid off + * @param chopit Flag that determines whether chopping is executed or not + * @return Compacted class name + */ + public static final String compactClassName(String str, + String prefix, + boolean chopit) + { + int len = prefix.length(); + + str = str.replace('/', '.'); // Is `/' on all systems, even DOS + + if(chopit) { + // If string starts with `prefix' and contains no further dots + if(str.startsWith(prefix) && + (str.substring(len).indexOf('.') == -1)) + str = str.substring(len); + } + + return str; + } + + /** + * Shorten long class names, java/lang/String becomes + * java.lang.String, + * e.g.. If chopit is true the prefix java.lang + * is also removed. + * + * @param str The long class name + * @param chopit Flag that determines whether chopping is executed or not + * @return Compacted class name + */ + public static final String compactClassName(String str, boolean chopit) { + return compactClassName(str, "java.lang.", chopit); + } + + private static final boolean is_digit(char ch) { + return (ch >= '0') && (ch <= '9'); + } + + private static final boolean is_space(char ch) { + return (ch == ' ') || (ch == '\t') || (ch == '\r') || (ch == '\n'); + } + + /** + * @return `flag' with bit `i' set to 1 + */ + public static final int setBit(int flag, int i) { + return flag | pow2(i); + } + + /** + * @return `flag' with bit `i' set to 0 + */ + public static final int clearBit(int flag, int i) { + int bit = pow2(i); + return (flag & bit) == 0? flag : flag ^ bit; + } + + /** + * @return true, if bit `i' in `flag' is set + */ + public static final boolean isSet(int flag, int i) { + return (flag & pow2(i)) != 0; + } + + /** + * Converts string containing the method return and argument types + * to a byte code method signature. + * + * @param ret Return type of method + * @param argv Types of method arguments + * @return Byte code representation of method signature + */ + public final static String methodTypeToSignature(String ret, String[] argv) + throws ClassFormatError + { + StringBuffer buf = new StringBuffer("("); + String str; + + if(argv != null) + for(int i=0; i < argv.length; i++) { + str = getSignature(argv[i]); + + if(str.endsWith("V")) // void can't be a method argument + throw new ClassFormatError("Invalid type: " + argv[i]); + + buf.append(str); + } + + str = getSignature(ret); + + buf.append(")" + str); + + return buf.toString(); + } + + /** + * @param signature Method signature + * @return Array of argument types + * @throw ClassFormatError + */ + public static final String[] methodSignatureArgumentTypes(String signature) + throws ClassFormatError + { + return methodSignatureArgumentTypes(signature, true); + } + + /** + * @param signature Method signature + * @param chopit Shorten class names ? + * @return Array of argument types + * @throw ClassFormatError + */ + public static final String[] methodSignatureArgumentTypes(String signature, + boolean chopit) + throws ClassFormatError + { + ArrayList vec = new ArrayList(); + int index; + String[] types; + + try { // Read all declarations between for `(' and `)' + if(signature.charAt(0) != '(') + throw new ClassFormatError("Invalid method signature: " + signature); + + index = 1; // current string position + + while(signature.charAt(index) != ')') { + vec.add(signatureToString(signature.substring(index), chopit)); + index += consumed_chars; // update position + } + } catch(StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatError("Invalid method signature: " + signature); + } + + types = new String[vec.size()]; + vec.toArray(types); + return types; + } + /** + * @param signature Method signature + * @return return type of method + * @throw ClassFormatError + */ + public static final String methodSignatureReturnType(String signature) + throws ClassFormatError + { + return methodSignatureReturnType(signature, true); + } + /** + * @param signature Method signature + * @param chopit Shorten class names ? + * @return return type of method + * @throw ClassFormatError + */ + public static final String methodSignatureReturnType(String signature, + boolean chopit) + throws ClassFormatError + { + int index; + String type; + + try { + // Read return type after `)' + index = signature.lastIndexOf(')') + 1; + type = signatureToString(signature.substring(index), chopit); + } catch(StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatError("Invalid method signature: " + signature); + } + + return type; + } + + /** + * Converts method signature to string with all class names compacted. + * + * @param signature to convert + * @param name of method + * @param access flags of method + * @return Human readable signature + */ + public static final String methodSignatureToString(String signature, + String name, + String access) { + return methodSignatureToString(signature, name, access, true); + } + + public static final String methodSignatureToString(String signature, + String name, + String access, + boolean chopit) { + return methodSignatureToString(signature, name, access, chopit, null); + } + + /** + * A return­type signature represents the return value from a method. + * It is a series of bytes in the following grammar: + * + * ::= | V + * + * The character V indicates that the method returns no value. Otherwise, the + * signature indicates the type of the return value. + * An argument signature represents an argument passed to a method: + * + * ::= + * + * A method signature represents the arguments that the method expects, and + * the value that it returns. + * ::= () + * ::= * + * + * This method converts such a string into a Java type declaration like + * `void main(String[])' and throws a `ClassFormatError' when the parsed + * type is invalid. + * + * @param signature Method signature + * @param name Method name + * @param access Method access rights + * @return Java type declaration + * @throw ClassFormatError + */ + public static final String methodSignatureToString(String signature, + String name, + String access, + boolean chopit, + LocalVariableTable vars) + throws ClassFormatError + { + StringBuffer buf = new StringBuffer("("); + String type; + int index; + int var_index = (access.indexOf("static") >= 0)? 0 : 1; + + try { // Read all declarations between for `(' and `)' + if(signature.charAt(0) != '(') + throw new ClassFormatError("Invalid method signature: " + signature); + + index = 1; // current string position + + while(signature.charAt(index) != ')') { + buf.append(signatureToString(signature.substring(index), chopit)); + + if(vars != null) { + LocalVariable l = vars.getLocalVariable(var_index); + + if(l != null) + buf.append(" " + l.getName()); + } else + buf.append(" arg" + var_index); + + var_index++; + buf.append(", "); + index += consumed_chars; // update position + } + + index++; // update position + + // Read return type after `)' + type = signatureToString(signature.substring(index), chopit); + + } catch(StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatError("Invalid method signature: " + signature); + } + + if(buf.length() > 1) // Tack off the extra ", " + buf.setLength(buf.length() - 2); + + buf.append(")"); + + return access + ((access.length() > 0)? " " : "") + // May be an empty string + type + " " + name + buf.toString(); + } + + // Guess what this does + private static final int pow2(int n) { + return 1 << n; + } + + /** + * Replace all occurences of old in str with new. + * + * @param str String to permute + * @param old String to be replaced + * @param new Replacement string + * @return new String object + */ + public static final String replace(String str, String old, String new_) { + int index, old_index; + StringBuffer buf = new StringBuffer(); + + try { + if((index = str.indexOf(old)) != -1) { // `old' found in str + old_index = 0; // String start offset + + // While we have something to replace + while((index = str.indexOf(old, old_index)) != -1) { + buf.append(str.substring(old_index, index)); // append prefix + buf.append(new_); // append replacement + + old_index = index + old.length(); // Skip `old'.length chars + } + + buf.append(str.substring(old_index)); // append rest of string + str = buf.toString(); + } + } catch(StringIndexOutOfBoundsException e) { // Should not occur + System.err.println(e); + } + + return str; + } + + /** + * Converts signature to string with all class names compacted. + * + * @param signature to convert + * @return Human readable signature + */ + public static final String signatureToString(String signature) { + return signatureToString(signature, true); + } + + /** + * The field signature represents the value of an argument to a function or + * the value of a variable. It is a series of bytes generated by the + * following grammar: + * + *
    +   *  ::= 
    +   *       ::= ||
    +   *        ::= B|C|D|F|I|J|S|Z
    +   *      ::= L;
    +   *       ::= [
    +   *
    +   * The meaning of the base types is as follows:
    +   * B byte signed byte
    +   * C char character
    +   * D double double precision IEEE float
    +   * F float single precision IEEE float
    +   * I int integer
    +   * J long long integer
    +   * L; ... an object of the given class
    +   * S short signed short
    +   * Z boolean true or false
    +   * [ ... array
    +   * 
    + * + * This method converts this string into a Java type declaration such as + * `String[]' and throws a `ClassFormatError' when the parsed type is + * invalid. + * + * @param signature Class signature + * @param chopit Flag that determines whether chopping is executed or not + * @return Java type declaration + * @throws ClassFormatError + */ + public static final String signatureToString(String signature, + boolean chopit) + { + consumed_chars = 1; // This is the default, read just one char like `B' + + try { + switch(signature.charAt(0)) { + case 'B' : return "byte"; + case 'C' : return "char"; + case 'D' : return "double"; + case 'F' : return "float"; + case 'I' : return "int"; + case 'J' : return "long"; + + case 'L' : { // Full class name + int index = signature.indexOf(';'); // Look for closing `;' + + if(index < 0) + throw new ClassFormatError("Invalid signature: " + signature); + + consumed_chars = index + 1; // "Lblabla;" `L' and `;' are removed + + return compactClassName(signature.substring(1, index), chopit); + } + + case 'S' : return "short"; + case 'Z' : return "boolean"; + + case '[' : { // Array declaration + int n; + StringBuffer buf, brackets; + String type; + char ch; + int consumed_chars; // Shadows global var + + brackets = new StringBuffer(); // Accumulate []'s + + // Count opening brackets and look for optional size argument + for(n=0; signature.charAt(n) == '['; n++) + brackets.append("[]"); + + consumed_chars = n; // Remember value + + // The rest of the string denotes a `' + type = signatureToString(signature.substring(n), chopit); + + Utility.consumed_chars += consumed_chars; + return type + brackets.toString(); + } + + case 'V' : return "void"; + + default : throw new ClassFormatError("Invalid signature: `" + + signature + "'"); + } + } catch(StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatError("Invalid signature: " + e + ":" + signature); + } + } + + /** Parse Java type such as "char", or "java.lang.String[]" and return the + * signature in byte code format, e.g. "C" or "[Ljava/lang/String;" respectively. + * + * @param type Java type + * @return byte code signature + */ + public static String getSignature(String type) { + StringBuffer buf = new StringBuffer(); + char[] chars = type.toCharArray(); + boolean char_found = false, delim = false; + int index = -1; + + loop: + for(int i=0; i < chars.length; i++) { + switch(chars[i]) { + case ' ': case '\t': case '\n': case '\r': case '\f': + if(char_found) + delim = true; + break; + + case '[': + if(!char_found) + throw new RuntimeException("Illegal type: " + type); + + index = i; + break loop; + + default: + char_found = true; + if(!delim) + buf.append(chars[i]); + } + } + + int brackets = 0; + + if(index > 0) + brackets = countBrackets(type.substring(index)); + + type = buf.toString(); + buf.setLength(0); + + for(int i=0; i < brackets; i++) + buf.append('['); + + boolean found = false; + + for(int i=Constants.T_BOOLEAN; (i <= Constants.T_VOID) && !found; i++) { + if(Constants.TYPE_NAMES[i].equals(type)) { + found = true; + buf.append(Constants.SHORT_TYPE_NAMES[i]); + } + } + + if(!found) // Class name + buf.append('L' + type.replace('.', '/') + ';'); + + return buf.toString(); + } + + private static int countBrackets(String brackets) { + char[] chars = brackets.toCharArray(); + int count = 0; + boolean open = false; + + for(int i=0; iConstants + * + * @param signature in format described above + * @return type of method signature + * @see Constants + */ + public static final byte typeOfMethodSignature(String signature) + throws ClassFormatError + { + int index; + + try { + if(signature.charAt(0) != '(') + throw new ClassFormatError("Invalid method signature: " + signature); + + index = signature.lastIndexOf(')') + 1; + return typeOfSignature(signature.substring(index)); + } catch(StringIndexOutOfBoundsException e) { + throw new ClassFormatError("Invalid method signature: " + signature); + } + } + + /** + * Return type of signature as a byte value as defined in Constants + * + * @param signature in format described above + * @return type of signature + * @see Constants + */ + public static final byte typeOfSignature(String signature) + throws ClassFormatError + { + try { + switch(signature.charAt(0)) { + case 'B' : return Constants.T_BYTE; + case 'C' : return Constants.T_CHAR; + case 'D' : return Constants.T_DOUBLE; + case 'F' : return Constants.T_FLOAT; + case 'I' : return Constants.T_INT; + case 'J' : return Constants.T_LONG; + case 'L' : return Constants.T_REFERENCE; + case '[' : return Constants.T_ARRAY; + case 'V' : return Constants.T_VOID; + case 'Z' : return Constants.T_BOOLEAN; + case 'S' : return Constants.T_SHORT; + default: + throw new ClassFormatError("Invalid method signature: " + signature); + } + } catch(StringIndexOutOfBoundsException e) { + throw new ClassFormatError("Invalid method signature: " + signature); + } + } + + /** Map opcode names to opcode numbers. E.g., return Constants.ALOAD for "aload" + */ + public static short searchOpcode(String name) { + name = name.toLowerCase(); + + for(short i=0; i < Constants.OPCODE_NAMES.length; i++) + if(Constants.OPCODE_NAMES[i].equals(name)) + return i; + + return -1; + } + + /** + * Convert (signed) byte to (unsigned) short value, i.e., all negative + * values become positive. + */ + private static final short byteToShort(byte b) { + return (b < 0)? (short)(256 + b) : (short)b; + } + + /** Convert bytes into hexidecimal string + * + * @return bytes as hexidecimal string, e.g. 00 FA 12 ... + */ + public static final String toHexString(byte[] bytes) { + StringBuffer buf = new StringBuffer(); + + for(int i=0; i < bytes.length; i++) { + short b = byteToShort(bytes[i]); + String hex = Integer.toString(b, 0x10); + + if(b < 0x10) // just one digit, prepend '0' + buf.append('0'); + + buf.append(hex); + + if(i < bytes.length - 1) + buf.append(' '); + } + + return buf.toString(); + } + + /** + * Return a string for an integer justified left or right and filled up with + * `fill' characters if necessary. + * + * @param i integer to format + * @param length length of desired string + * @param left_justify format left or right + * @param fill fill character + * @return formatted int + */ + public static final String format(int i, int length, boolean left_justify, char fill) { + return fillup(Integer.toString(i), length, left_justify, fill); + } + + /** + * Fillup char with up to length characters with char `fill' and justify it left or right. + * + * @param str string to format + * @param length length of desired string + * @param left_justify format left or right + * @param fill fill character + * @return formatted string + */ + public static final String fillup(String str, int length, boolean left_justify, char fill) { + int len = length - str.length(); + char[] buf = new char[(len < 0)? 0 : len]; + + for(int j=0; j < buf.length; j++) + buf[j] = fill; + + if(left_justify) + return str + new String(buf); + else + return new String(buf) + str; + } + + static final boolean equals(byte[] a, byte[] b) { + int size; + + if((size=a.length) != b.length) + return false; + + for(int i=0; i < size; i++) + if(a[i] != b[i]) + return false; + + return true; + } + + public static final void printArray(PrintStream out, Object[] obj) { + out.println(printArray(obj, true)); + } + + public static final void printArray(PrintWriter out, Object[] obj) { + out.println(printArray(obj, true)); + } + + public static final String printArray(Object[] obj) { + return printArray(obj, true); + } + + public static final String printArray(Object[] obj, boolean braces) { + if(obj == null) + return null; + + StringBuffer buf = new StringBuffer(); + if(braces) + buf.append('{'); + + for(int i=0; i < obj.length; i++) { + if(obj[i] != null) + buf.append(obj[i].toString()); + else + buf.append("null"); + + if(i < obj.length - 1) + buf.append(", "); + } + + if(braces) + buf.append('}'); + + return buf.toString(); + } + + /** @return true, if character is one of (a, ... z, A, ... Z, 0, ... 9, _) + */ + public static boolean isJavaIdentifierPart(char ch) { + return ((ch >= 'a') && (ch <= 'z')) || + ((ch >= 'A') && (ch <= 'Z')) || + ((ch >= '0') && (ch <= '9')) || + (ch == '_'); + } + + /** Encode byte array it into Java identifier string, i.e., a string + * that only contains the following characters: (a, ... z, A, ... Z, + * 0, ... 9, _, $). The encoding algorithm itself is not too + * clever: if the current byte's ASCII value already is a valid Java + * identifier part, leave it as it is. Otherwise it writes the + * escape character($) followed by

    • the ASCII value as a + * hexadecimal string, if the value is not in the range + * 200..247
    • a Java identifier char not used in a lowercase + * hexadecimal string, if the value is in the range + * 200..247
      • + * + *

        This operation inflates the original byte array by roughly 40-50%

        + * + * @param bytes the byte array to convert + * @param compress use gzip to minimize string + */ + public static String encode(byte[] bytes, boolean compress) throws IOException { + if(compress) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + GZIPOutputStream gos = new GZIPOutputStream(baos); + + gos.write(bytes, 0, bytes.length); + gos.close(); + baos.close(); + + bytes = baos.toByteArray(); + } + + CharArrayWriter caw = new CharArrayWriter(); + JavaWriter jw = new JavaWriter(caw); + + for(int i=0; i < bytes.length; i++) { + int in = bytes[i] & 0x000000ff; // Normalize to unsigned + jw.write(in); + } + + return caw.toString(); + } + + /** Decode a string back to a byte array. + * + * @param bytes the byte array to convert + * @param uncompress use gzip to uncompress the stream of bytes + */ + public static byte[] decode(String s, boolean uncompress) throws IOException { + char[] chars = s.toCharArray(); + + CharArrayReader car = new CharArrayReader(chars); + JavaReader jr = new JavaReader(car); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + int ch; + + while((ch = jr.read()) >= 0) { + bos.write(ch); + } + + bos.close(); + car.close(); + jr.close(); + + byte[] bytes = bos.toByteArray(); + + if(uncompress) { + GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes)); + + byte[] tmp = new byte[bytes.length * 3]; // Rough estimate + int count = 0; + int b; + + while((b = gis.read()) >= 0) + tmp[count++] = (byte)b; + + bytes = new byte[count]; + System.arraycopy(tmp, 0, bytes, 0, count); + } + + return bytes; + } + + // A-Z, g-z, _, $ + private static final int FREE_CHARS = 48; + private static int[] CHAR_MAP = new int[FREE_CHARS]; + private static int[] MAP_CHAR = new int[256]; // Reverse map + private static final char ESCAPE_CHAR = '$'; + + static { + int j = 0, k = 0; + for(int i='A'; i <= 'Z'; i++) { + CHAR_MAP[j] = i; + MAP_CHAR[i] = j; + j++; + } + + for(int i='g'; i <= 'z'; i++) { + CHAR_MAP[j] = i; + MAP_CHAR[i] = j; + j++; + } + + CHAR_MAP[j] = '$'; + MAP_CHAR['$'] = j; + j++; + + CHAR_MAP[j] = '_'; + MAP_CHAR['_'] = j; + } + + /** Decode characters into bytes. + * Used by decode() + */ + private static class JavaReader extends FilterReader { + public JavaReader(Reader in) { + super(in); + } + + public int read() throws IOException { + int b = in.read(); + + if(b != ESCAPE_CHAR) { + return b; + } else { + int i = in.read(); + + if(i < 0) + return -1; + + if(((i >= '0') && (i <= '9')) || ((i >= 'a') && (i <= 'f'))) { // Normal escape + int j = in.read(); + + if(j < 0) + return -1; + + char[] tmp = { (char)i, (char)j }; + int s = Integer.parseInt(new String(tmp), 16); + + return s; + } else { // Special escape + return MAP_CHAR[i]; + } + } + } + + public int read(char[] cbuf, int off, int len) throws IOException { + for(int i=0; i < len; i++) + cbuf[off + i] = (char)read(); + + return len; + } + } + + /** Encode bytes into valid java identifier characters. + * Used by encode() + */ + private static class JavaWriter extends FilterWriter { + public JavaWriter(Writer out) { + super(out); + } + + public void write(int b) throws IOException { + if(isJavaIdentifierPart((char)b) && (b != ESCAPE_CHAR)) { + out.write(b); + } else { + out.write(ESCAPE_CHAR); // Escape character + + // Special escape + if(b >= 0 && b < FREE_CHARS) { + out.write(CHAR_MAP[b]); + } else { // Normal escape + char[] tmp = Integer.toHexString(b).toCharArray(); + + if(tmp.length == 1) { + out.write('0'); + out.write(tmp[0]); + } else { + out.write(tmp[0]); + out.write(tmp[1]); + } + } + } + } + + public void write(char[] cbuf, int off, int len) throws IOException { + for(int i=0; i < len; i++) + write(cbuf[off + i]); + } + + public void write(String str, int off, int len) throws IOException { + write(str.toCharArray(), off, len); + } + } +} diff --git a/src/java/org/apache/bcel/classfile/Visitor.java b/src/java/org/apache/bcel/classfile/Visitor.java new file mode 100644 index 00000000..c3149de4 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Visitor.java @@ -0,0 +1,100 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Interface to make use of the Visitor pattern programming style. + * I.e. a class that implements this interface can traverse the contents of + * a Java class just by calling the `accept' method which all classes have. + * + * Implemented by wish of + * Boris Bokowski. + * + * @version $Id$ + * @author M. Dahm + */ +public interface Visitor { + public void visitCode(Code obj); + public void visitCodeException(CodeException obj); + public void visitConstantClass(ConstantClass obj); + public void visitConstantDouble(ConstantDouble obj); + public void visitConstantFieldref(ConstantFieldref obj); + public void visitConstantFloat(ConstantFloat obj); + public void visitConstantInteger(ConstantInteger obj); + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj); + public void visitConstantLong(ConstantLong obj); + public void visitConstantMethodref(ConstantMethodref obj); + public void visitConstantNameAndType(ConstantNameAndType obj); + public void visitConstantPool(ConstantPool obj); + public void visitConstantString(ConstantString obj); + public void visitConstantUtf8(ConstantUtf8 obj); + public void visitConstantValue(ConstantValue obj); + public void visitDeprecated(Deprecated obj); + public void visitExceptionTable(ExceptionTable obj); + public void visitField(Field obj); + public void visitInnerClass(InnerClass obj); + public void visitInnerClasses(InnerClasses obj); + public void visitJavaClass(JavaClass obj); + public void visitLineNumber(LineNumber obj); + public void visitLineNumberTable(LineNumberTable obj); + public void visitLocalVariable(LocalVariable obj); + public void visitLocalVariableTable(LocalVariableTable obj); + public void visitMethod(Method obj); + public void visitSourceFile(SourceFile obj); + public void visitSynthetic(Synthetic obj); + public void visitUnknown(Unknown obj); + public void visitStackMap(StackMap obj); + public void visitStackMapEntry(StackMapEntry obj); +} diff --git a/src/java/org/apache/bcel/classfile/lic b/src/java/org/apache/bcel/classfile/lic new file mode 100644 index 00000000..66e71199 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/lic @@ -0,0 +1,53 @@ +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ diff --git a/src/java/org/apache/bcel/classfile/package.html b/src/java/org/apache/bcel/classfile/package.html new file mode 100644 index 00000000..2bf7c28c --- /dev/null +++ b/src/java/org/apache/bcel/classfile/package.html @@ -0,0 +1,14 @@ + + + + + + +

        +This package contains the classes that describe the structure of a +Java class file and a class file parser. +

        + + diff --git a/src/java/org/apache/bcel/generic/AALOAD.java b/src/java/org/apache/bcel/generic/AALOAD.java new file mode 100644 index 00000000..628dbb73 --- /dev/null +++ b/src/java/org/apache/bcel/generic/AALOAD.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * AALOAD - Load reference from array + *
        Stack: ..., arrayref, index -> value
        + * + * @version $Id$ + * @author M. Dahm + */ +public class AALOAD extends ArrayInstruction implements StackProducer { + /** Load reference from array + */ + public AALOAD() { + super(org.apache.bcel.Constants.AALOAD); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitAALOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/AASTORE.java b/src/java/org/apache/bcel/generic/AASTORE.java new file mode 100644 index 00000000..c78e9bb6 --- /dev/null +++ b/src/java/org/apache/bcel/generic/AASTORE.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * AASTORE - Store into reference array + *
        Stack: ..., arrayref, index, value -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class AASTORE extends ArrayInstruction implements StackConsumer { + /** Store into reference array + */ + public AASTORE() { + super(org.apache.bcel.Constants.AASTORE); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitAASTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ACONST_NULL.java b/src/java/org/apache/bcel/generic/ACONST_NULL.java new file mode 100644 index 00000000..c379a7f5 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ACONST_NULL.java @@ -0,0 +1,94 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * ACONST_NULL - Push null reference + *
        Stack: ... -> ..., null
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ACONST_NULL extends Instruction + implements PushInstruction, TypedInstruction { + /** + * Push null reference + */ + public ACONST_NULL() { + super(org.apache.bcel.Constants.ACONST_NULL, (short)1); + } + + /** @return Type.NULL + */ + public Type getType(ConstantPoolGen cp) { + return Type.NULL; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitTypedInstruction(this); + v.visitACONST_NULL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ALOAD.java b/src/java/org/apache/bcel/generic/ALOAD.java new file mode 100644 index 00000000..3ed5b466 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ALOAD.java @@ -0,0 +1,92 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * ALOAD - Load reference from local variable + *
        Stack: ... -> ..., objectref
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ALOAD extends LoadInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ALOAD() { + super(org.apache.bcel.Constants.ALOAD, org.apache.bcel.Constants.ALOAD_0); + } + + /** Load reference from local variable + * @param n index of local variable + */ + public ALOAD(int n) { + super(org.apache.bcel.Constants.ALOAD, org.apache.bcel.Constants.ALOAD_0, n); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + super.accept(v); + v.visitALOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ANEWARRAY.java b/src/java/org/apache/bcel/generic/ANEWARRAY.java new file mode 100644 index 00000000..8248befe --- /dev/null +++ b/src/java/org/apache/bcel/generic/ANEWARRAY.java @@ -0,0 +1,114 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.ExceptionConstants; + +/** + * ANEWARRAY - Create new array of references + *
        Stack: ..., count -> ..., arrayref
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ANEWARRAY extends CPInstruction + implements LoadClass, AllocationInstruction, ExceptionThrower, StackProducer { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ANEWARRAY() {} + + public ANEWARRAY(int index) { + super(org.apache.bcel.Constants.ANEWARRAY, index); + } + + public Class[] getExceptions(){ + Class[] cs = new Class[1 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; + + System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, + cs, 0, ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); + cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = + ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION; + return cs; + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitLoadClass(this); + v.visitAllocationInstruction(this); + v.visitExceptionThrower(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitANEWARRAY(this); + } + + public ObjectType getLoadClassType(ConstantPoolGen cpg) { + Type t = getType(cpg); + + if (t instanceof ArrayType){ + t = ((ArrayType) t).getBasicType(); + } + + return (t instanceof ObjectType)? (ObjectType) t : null; + } +} diff --git a/src/java/org/apache/bcel/generic/ARETURN.java b/src/java/org/apache/bcel/generic/ARETURN.java new file mode 100644 index 00000000..577a15f4 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ARETURN.java @@ -0,0 +1,88 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * ARETURN - Return reference from method + *
        Stack: ..., objectref -> <empty>
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ARETURN extends ReturnInstruction { + /** + * Return reference from method + */ + public ARETURN() { + super(org.apache.bcel.Constants.ARETURN); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitReturnInstruction(this); + v.visitARETURN(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ARRAYLENGTH.java b/src/java/org/apache/bcel/generic/ARRAYLENGTH.java new file mode 100644 index 00000000..8bab6cb0 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ARRAYLENGTH.java @@ -0,0 +1,92 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * ARRAYLENGTH - Get length of array + *
        Stack: ..., arrayref -> ..., length
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ARRAYLENGTH extends Instruction + implements ExceptionThrower, StackProducer { + /** Get length of array + */ + public ARRAYLENGTH() { + super(org.apache.bcel.Constants.ARRAYLENGTH, (short)1); + } + + /** @return exceptions this instruction may cause + */ + public Class[] getExceptions() { + return new Class[] { org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION }; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitStackProducer(this); + v.visitARRAYLENGTH(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ASTORE.java b/src/java/org/apache/bcel/generic/ASTORE.java new file mode 100644 index 00000000..b123a571 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ASTORE.java @@ -0,0 +1,92 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * ASTORE - Store reference into local variable + *
        Stack ..., objectref -> ... 
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ASTORE extends StoreInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ASTORE() { + super(org.apache.bcel.Constants.ASTORE, org.apache.bcel.Constants.ASTORE_0); + } + + /** Store reference into local variable + * @param n index of local variable + */ + public ASTORE(int n) { + super(org.apache.bcel.Constants.ASTORE, org.apache.bcel.Constants.ASTORE_0, n); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + super.accept(v); + v.visitASTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ATHROW.java b/src/java/org/apache/bcel/generic/ATHROW.java new file mode 100644 index 00000000..89a8025d --- /dev/null +++ b/src/java/org/apache/bcel/generic/ATHROW.java @@ -0,0 +1,92 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * ATHROW - Throw exception + *
        Stack: ..., objectref -> objectref
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ATHROW extends Instruction implements UnconditionalBranch, ExceptionThrower { + /** + * Throw exception + */ + public ATHROW() { + super(org.apache.bcel.Constants.ATHROW, (short)1); + } + + /** @return exceptions this instruction may cause + */ + public Class[] getExceptions() { + return new Class[] { org.apache.bcel.ExceptionConstants.THROWABLE }; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitUnconditionalBranch(this); + v.visitExceptionThrower(this); + v.visitATHROW(this); + } +} diff --git a/src/java/org/apache/bcel/generic/AllocationInstruction.java b/src/java/org/apache/bcel/generic/AllocationInstruction.java new file mode 100644 index 00000000..b2922d4a --- /dev/null +++ b/src/java/org/apache/bcel/generic/AllocationInstruction.java @@ -0,0 +1,64 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denote family of instructions that allocates space in the heap. + * + * @version $Id$ + * @author M. Dahm + */ +public interface AllocationInstruction {} + diff --git a/src/java/org/apache/bcel/generic/ArithmeticInstruction.java b/src/java/org/apache/bcel/generic/ArithmeticInstruction.java new file mode 100644 index 00000000..aa185924 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ArithmeticInstruction.java @@ -0,0 +1,106 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +/** + * Super class for the family of arithmetic instructions. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class ArithmeticInstruction extends Instruction + implements TypedInstruction, StackProducer, StackConsumer { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ArithmeticInstruction() {} + + /** + * @param opcode of instruction + */ + protected ArithmeticInstruction(short opcode) { + super(opcode, (short)1); + } + + /** @return type associated with the instruction + */ + public Type getType(ConstantPoolGen cp) { + switch(opcode) { + case Constants.DADD: case Constants.DDIV: case Constants.DMUL: + case Constants.DNEG: case Constants.DREM: case Constants.DSUB: + return Type.DOUBLE; + + case Constants.FADD: case Constants.FDIV: case Constants.FMUL: + case Constants.FNEG: case Constants.FREM: case Constants.FSUB: + return Type.FLOAT; + + case Constants.IADD: case Constants.IAND: case Constants.IDIV: + case Constants.IMUL: case Constants.INEG: case Constants.IOR: case Constants.IREM: + case Constants.ISHL: case Constants.ISHR: case Constants.ISUB: + case Constants.IUSHR: case Constants.IXOR: + return Type.INT; + + case Constants.LADD: case Constants.LAND: case Constants.LDIV: + case Constants.LMUL: case Constants.LNEG: case Constants.LOR: case Constants.LREM: + case Constants.LSHL: case Constants.LSHR: case Constants.LSUB: + case Constants.LUSHR: case Constants.LXOR: + return Type.LONG; + + default: // Never reached + throw new ClassGenException("Unknown type " + opcode); + } + } +} diff --git a/src/java/org/apache/bcel/generic/ArrayInstruction.java b/src/java/org/apache/bcel/generic/ArrayInstruction.java new file mode 100644 index 00000000..b8586bd4 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ArrayInstruction.java @@ -0,0 +1,106 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Super class for instructions dealing with array access such as IALOAD. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class ArrayInstruction extends Instruction + implements ExceptionThrower, TypedInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ArrayInstruction() {} + + /** + * @param opcode of instruction + */ + protected ArrayInstruction(short opcode) { + super(opcode, (short)1); + } + + public Class[] getExceptions() { + return org.apache.bcel.ExceptionConstants.EXCS_ARRAY_EXCEPTION; + } + + /** @return type associated with the instruction + */ + public Type getType(ConstantPoolGen cp) { + switch(opcode) { + case org.apache.bcel.Constants.IALOAD: case org.apache.bcel.Constants.IASTORE: + return Type.INT; + case org.apache.bcel.Constants.CALOAD: case org.apache.bcel.Constants.CASTORE: + return Type.CHAR; + case org.apache.bcel.Constants.BALOAD: case org.apache.bcel.Constants.BASTORE: + return Type.BYTE; + case org.apache.bcel.Constants.SALOAD: case org.apache.bcel.Constants.SASTORE: + return Type.SHORT; + case org.apache.bcel.Constants.LALOAD: case org.apache.bcel.Constants.LASTORE: + return Type.LONG; + case org.apache.bcel.Constants.DALOAD: case org.apache.bcel.Constants.DASTORE: + return Type.DOUBLE; + case org.apache.bcel.Constants.FALOAD: case org.apache.bcel.Constants.FASTORE: + return Type.FLOAT; + case org.apache.bcel.Constants.AALOAD: case org.apache.bcel.Constants.AASTORE: + return Type.OBJECT; + + default: throw new ClassGenException("Oops: unknown case in switch" + opcode); + } + } +} diff --git a/src/java/org/apache/bcel/generic/ArrayType.java b/src/java/org/apache/bcel/generic/ArrayType.java new file mode 100644 index 00000000..738a5990 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ArrayType.java @@ -0,0 +1,156 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; + +/** + * Denotes array type, such as int[][] + * + * @version $Id$ + * @author M. Dahm + */ +public final class ArrayType extends ReferenceType { + private int dimensions; + private Type basic_type; + + /** + * Convenience constructor for array type, e.g. int[] + * + * @param type array type, e.g. T_INT + */ + public ArrayType(byte type, int dimensions) { + this(BasicType.getType(type), dimensions); + } + + /** + * Convenience constructor for reference array type, e.g. Object[] + * + * @param class_name complete name of class (java.lang.String, e.g.) + */ + public ArrayType(String class_name, int dimensions) { + this(new ObjectType(class_name), dimensions); + } + + /** + * Constructor for array of given type + * + * @param type type of array (may be an array itself) + */ + public ArrayType(Type type, int dimensions) { + super(Constants.T_ARRAY, ""); + + if((dimensions < 1) || (dimensions > Constants.MAX_BYTE)) + throw new ClassGenException("Invalid number of dimensions: " + dimensions); + + switch(type.getType()) { + case Constants.T_ARRAY: + ArrayType array = (ArrayType)type; + this.dimensions = dimensions + array.dimensions; + basic_type = array.basic_type; + break; + + case Constants.T_VOID: + throw new ClassGenException("Invalid type: void[]"); + + default: // Basic type or reference + this.dimensions = dimensions; + basic_type = type; + break; + } + + StringBuffer buf = new StringBuffer(); + for(int i=0; i < this.dimensions; i++) + buf.append('['); + + buf.append(basic_type.getSignature()); + + signature = buf.toString(); + } + + /** + * @return basic type of array, i.e., for int[][][] the basic type is int + */ + public Type getBasicType() { + return basic_type; + } + + /** + * @return element type of array, i.e., for int[][][] the element type is int[][] + */ + public Type getElementType() { + if(dimensions == 1) + return basic_type; + else + return new ArrayType(basic_type, dimensions - 1); + } + + /** @return number of dimensions of array + */ + public int getDimensions() { return dimensions; } + + /** @return a hash code value for the object. + */ + public int hashcode() { return basic_type.hashCode() ^ dimensions; } + + /** @return true if both type objects refer to the same array type. + */ + public boolean equals(Object type) { + if(type instanceof ArrayType) { + ArrayType array = (ArrayType)type; + return (array.dimensions == dimensions) && array.basic_type.equals(basic_type); + } else + return false; + } +} diff --git a/src/java/org/apache/bcel/generic/BALOAD.java b/src/java/org/apache/bcel/generic/BALOAD.java new file mode 100644 index 00000000..ff309eb0 --- /dev/null +++ b/src/java/org/apache/bcel/generic/BALOAD.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * BALOAD - Load byte or boolean from array + *
        Stack: ..., arrayref, index -> ..., value
        + * + * @version $Id$ + * @author M. Dahm + */ +public class BALOAD extends ArrayInstruction implements StackProducer { + /** Load byte or boolean from array + */ + public BALOAD() { + super(org.apache.bcel.Constants.BALOAD); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitBALOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/BASTORE.java b/src/java/org/apache/bcel/generic/BASTORE.java new file mode 100644 index 00000000..ce5a1028 --- /dev/null +++ b/src/java/org/apache/bcel/generic/BASTORE.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * BASTORE - Store into byte or boolean array + *
        Stack: ..., arrayref, index, value -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class BASTORE extends ArrayInstruction implements StackConsumer { + /** Store byte or boolean into array + */ + public BASTORE() { + super(org.apache.bcel.Constants.BASTORE); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitBASTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/BIPUSH.java b/src/java/org/apache/bcel/generic/BIPUSH.java new file mode 100644 index 00000000..d9b6efd1 --- /dev/null +++ b/src/java/org/apache/bcel/generic/BIPUSH.java @@ -0,0 +1,132 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * BIPUSH - Push byte on stack + * + *
        Stack: ... -> ..., value
        + * + * @version $Id$ + * @author M. Dahm + */ +public class BIPUSH extends Instruction implements ConstantPushInstruction { + private byte b; + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + BIPUSH() {} + + /** Push byte on stack + */ + public BIPUSH(byte b) { + super(org.apache.bcel.Constants.BIPUSH, (short)2); + this.b = b; + } + + /** + * Dump instruction as byte code to stream out. + */ + public void dump(DataOutputStream out) throws IOException { + super.dump(out); + out.writeByte(b); + } + + /** + * @return mnemonic for instruction + */ + public String toString(boolean verbose) { + return super.toString(verbose) + " " + b; + } + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException + { + length = 2; + b = bytes.readByte(); + } + + public Number getValue() { return new Integer(b); } + + /** @return Type.BYTE + */ + public Type getType(ConstantPoolGen cp) { + return Type.BYTE; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitPushInstruction(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitConstantPushInstruction(this); + v.visitBIPUSH(this); + } +} diff --git a/src/java/org/apache/bcel/generic/BREAKPOINT.java b/src/java/org/apache/bcel/generic/BREAKPOINT.java new file mode 100644 index 00000000..22547865 --- /dev/null +++ b/src/java/org/apache/bcel/generic/BREAKPOINT.java @@ -0,0 +1,80 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * BREAKPOINT + * + * @version $Id$ + * @author Enver Haase + */ +public class BREAKPOINT extends Instruction { + public BREAKPOINT() { + super(org.apache.bcel.Constants.BREAKPOINT, (short)1); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitBREAKPOINT(this); + } +} diff --git a/src/java/org/apache/bcel/generic/BasicType.java b/src/java/org/apache/bcel/generic/BasicType.java new file mode 100644 index 00000000..00785e95 --- /dev/null +++ b/src/java/org/apache/bcel/generic/BasicType.java @@ -0,0 +1,101 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; + +/** + * Denotes basic type such as int. + * + * @version $Id$ + * @author M. Dahm + */ +public final class BasicType extends Type { + /** + * Constructor for basic types such as int, long, `void' + * + * @param type one of T_INT, T_BOOLEAN, ..., T_VOID + * @see org.apache.bcel.Constants + */ + BasicType(byte type) { + super(type, Constants.SHORT_TYPE_NAMES[type]); + + if((type < Constants.T_BOOLEAN) || (type > Constants.T_VOID)) + throw new ClassGenException("Invalid type: " + type); + } + + public static final BasicType getType(byte type) { + switch(type) { + case Constants.T_VOID: return VOID; + case Constants.T_BOOLEAN: return BOOLEAN; + case Constants.T_BYTE: return BYTE; + case Constants.T_SHORT: return SHORT; + case Constants.T_CHAR: return CHAR; + case Constants.T_INT: return INT; + case Constants.T_LONG: return LONG; + case Constants.T_DOUBLE: return DOUBLE; + case Constants.T_FLOAT: return FLOAT; + + default: + throw new ClassGenException("Invalid type: " + type); + } + } + + /** @return true if both type objects refer to the same type + */ + public boolean equals(Object type) { + return (type instanceof BasicType)? + ((BasicType)type).type == this.type : false; + } +} diff --git a/src/java/org/apache/bcel/generic/BranchHandle.java b/src/java/org/apache/bcel/generic/BranchHandle.java new file mode 100644 index 00000000..9ba154db --- /dev/null +++ b/src/java/org/apache/bcel/generic/BranchHandle.java @@ -0,0 +1,151 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * BranchHandle is returned by specialized InstructionList.append() whenever a + * BranchInstruction is appended. This is useful when the target of this + * instruction is not known at time of creation and must be set later + * via setTarget(). + * + * @see InstructionHandle + * @see Instruction + * @see InstructionList + * @version $Id$ + * @author M. Dahm + */ +public final class BranchHandle extends InstructionHandle { + private BranchInstruction bi; // An alias in fact, but saves lots of casts + + private BranchHandle(BranchInstruction i) { + super(i); + bi = i; + } + + /** Factory methods. + */ + private static BranchHandle bh_list = null; // List of reusable handles + + static final BranchHandle getBranchHandle(BranchInstruction i) { + if(bh_list == null) + return new BranchHandle(i); + else { + BranchHandle bh = bh_list; + bh_list = (BranchHandle)bh.next; + + bh.setInstruction(i); + + return bh; + } + } + + /** Handle adds itself to the list of resuable handles. + */ + protected void addHandle() { + next = bh_list; + bh_list = this; + } + + /* Override InstructionHandle methods: delegate to branch instruction. + * Through this overriding all access to the private i_position field should + * be prevented. + */ + public int getPosition() { return bi.position; } + + void setPosition(int pos) { + i_position = bi.position = pos; + } + + protected int updatePosition(int offset, int max_offset) { + int x = bi.updatePosition(offset, max_offset); + i_position = bi.position; + return x; + } + + /** + * Pass new target to instruction. + */ + public void setTarget(InstructionHandle ih) { + bi.setTarget(ih); + } + + /** + * Update target of instruction. + */ + public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { + bi.updateTarget(old_ih, new_ih); + } + + /** + * @return target of instruction. + */ + public InstructionHandle getTarget() { + return bi.getTarget(); + } + + /** + * Set new contents. Old instruction is disposed and may not be used anymore. + */ + public void setInstruction(Instruction i) { + super.setInstruction(i); + + if(!(i instanceof BranchInstruction)) + throw new ClassGenException("Assigning " + i + + " to branch handle which is not a branch instruction"); + + bi = (BranchInstruction)i; + } +} + diff --git a/src/java/org/apache/bcel/generic/BranchInstruction.java b/src/java/org/apache/bcel/generic/BranchInstruction.java new file mode 100644 index 00000000..099eef20 --- /dev/null +++ b/src/java/org/apache/bcel/generic/BranchInstruction.java @@ -0,0 +1,246 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * Abstract super class for branching instructions like GOTO, IFEQ, etc.. + * Branch instructions may have a variable length, namely GOTO, JSR, + * LOOKUPSWITCH and TABLESWITCH. + * + * @see InstructionList + * @version $Id$ + * @author M. Dahm + */ +public abstract class BranchInstruction extends Instruction implements InstructionTargeter { + protected int index; // Branch target relative to this instruction + protected InstructionHandle target; // Target object in instruction list + protected int position; // Byte code offset + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + BranchInstruction() {} + + /** Common super constructor + * @param opcodee Instruction opcode + * @param target instruction to branch to + */ + protected BranchInstruction(short opcode, InstructionHandle target) { + super(opcode, (short)3); + setTarget(target); + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + out.writeByte(opcode); + + index = getTargetOffset(); + + if(Math.abs(index) >= 32767) // too large for short + throw new ClassGenException("Branch target offset too large for short"); + + out.writeShort(index); // May be negative, i.e., point backwards + } + + /** + * @param target branch target + * @return the offset to `target' relative to this instruction + */ + protected int getTargetOffset(InstructionHandle target) { + if(target == null) + throw new ClassGenException("Target of " + super.toString(true) + + " is invalid null handle"); + + int t = target.getPosition(); + + if(t < 0) + throw new ClassGenException("Invalid branch target position offset for " + + super.toString(true) + ":" + t + ":" + target); + + return t - position; + } + + /** + * @return the offset to this instruction's target + */ + protected int getTargetOffset() { return getTargetOffset(target); } + + /** + * Called by InstructionList.setPositions when setting the position for every + * instruction. In the presence of variable length instructions `setPositions' + * performs multiple passes over the instruction list to calculate the + * correct (byte) positions and offsets by calling this function. + * + * @param offset additional offset caused by preceding (variable length) instructions + * @param max_offset the maximum offset that may be caused by these instructions + * @return additional offset caused by possible change of this instruction's length + */ + protected int updatePosition(int offset, int max_offset) { + position += offset; + return 0; + } + + /** + * Long output format: + * + * <position in byte code> + * <name of opcode> "["<opcode number>"]" + * "("<length of instruction>")" + * "<"<target instruction>">" "@"<branch target offset> + * + * @param verbose long/short format switch + * @return mnemonic for instruction + */ + public String toString(boolean verbose) { + String s = super.toString(verbose); + String t = "null"; + + if(verbose) { + if(target != null) { + if(target.getInstruction() == this) + t = ""; + else if(target.getInstruction() == null) + t = ""; + else + t = target.getInstruction().toString(false); // Avoid circles + } + } else { + if(target != null) { + index = getTargetOffset(); + t = "" + (index + position); + } + } + + return s + " -> " + t; + } + + /** + * Read needed data (e.g. index) from file. Conversion to a InstructionHandle + * is done in InstructionList(byte[]). + * + * @param bytes input stream + * @param wide wide prefix? + * @see InstructionList + */ + protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException + { + length = 3; + index = bytes.readShort(); + } + + /** + * @return target offset in byte code + */ + public final int getIndex() { return index; } + + /** + * @return target of branch instruction + */ + public InstructionHandle getTarget() { return target; } + + /** + * Set branch target + * @param target branch target + */ + public void setTarget(InstructionHandle target) { + notifyTarget(this.target, target, this); + this.target = target; + } + + /** + * Used by BranchInstruction, LocalVariableGen, CodeExceptionGen + */ + static final void notifyTarget(InstructionHandle old_ih, InstructionHandle new_ih, + InstructionTargeter t) { + if(old_ih != null) + old_ih.removeTargeter(t); + if(new_ih != null) + new_ih.addTargeter(t); + } + + /** + * @param old_ih old target + * @param new_ih new target + */ + public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { + if(target == old_ih) + setTarget(new_ih); + else + throw new ClassGenException("Not targeting " + old_ih + ", but " + target); + } + + /** + * @return true, if ih is target of this instruction + */ + public boolean containsTarget(InstructionHandle ih) { + return (target == ih); + } + + /** + * Inform target that it's not targeted anymore. + */ + void dispose() { + setTarget(null); + index=-1; + position=-1; + } +} diff --git a/src/java/org/apache/bcel/generic/CALOAD.java b/src/java/org/apache/bcel/generic/CALOAD.java new file mode 100644 index 00000000..bf4f0c9f --- /dev/null +++ b/src/java/org/apache/bcel/generic/CALOAD.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * CALOAD - Load char from array + *
        Stack: ..., arrayref, index -> ..., value
        + * + * @version $Id$ + * @author M. Dahm + */ +public class CALOAD extends ArrayInstruction implements StackProducer { + /** Load char from array + */ + public CALOAD() { + super(org.apache.bcel.Constants.CALOAD); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitCALOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/CASTORE.java b/src/java/org/apache/bcel/generic/CASTORE.java new file mode 100644 index 00000000..864a60b5 --- /dev/null +++ b/src/java/org/apache/bcel/generic/CASTORE.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * CASTORE - Store into char array + *
        Stack: ..., arrayref, index, value -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class CASTORE extends ArrayInstruction implements StackConsumer { + /** Store char into array + */ + public CASTORE() { + super(org.apache.bcel.Constants.CASTORE); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitCASTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/CHECKCAST.java b/src/java/org/apache/bcel/generic/CHECKCAST.java new file mode 100644 index 00000000..7bd66206 --- /dev/null +++ b/src/java/org/apache/bcel/generic/CHECKCAST.java @@ -0,0 +1,117 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.ExceptionConstants; +/** + * CHECKCAST - Check whether object is of given type + *
        Stack: ..., objectref -> ..., objectref
        + * + * @version $Id$ + * @author M. Dahm + */ +public class CHECKCAST extends CPInstruction + implements LoadClass, ExceptionThrower, StackProducer, StackConsumer { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + CHECKCAST() {} + + /** Check whether object is of given type + * @param n index to class in constant pool + */ + public CHECKCAST(int index) { + super(org.apache.bcel.Constants.CHECKCAST, index); + } + + /** @return exceptions this instruction may cause + */ + public Class[] getExceptions() { + Class[] cs = new Class[1 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; + + System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, + cs, 0, ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); + cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = + ExceptionConstants.CLASS_CAST_EXCEPTION; + return cs; + } + + public ObjectType getLoadClassType(ConstantPoolGen cpg) { + Type t = getType(cpg); + + if(t instanceof ArrayType) + t = ((ArrayType) t).getBasicType(); + + return (t instanceof ObjectType)? (ObjectType) t : null; + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitLoadClass(this); + v.visitExceptionThrower(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitCHECKCAST(this); + } +} diff --git a/src/java/org/apache/bcel/generic/CPInstruction.java b/src/java/org/apache/bcel/generic/CPInstruction.java new file mode 100644 index 00000000..d6eb0d1f --- /dev/null +++ b/src/java/org/apache/bcel/generic/CPInstruction.java @@ -0,0 +1,166 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.io.*; +import org.apache.bcel.util.ByteSequence; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.*; + +/** + * Abstract super class for instructions that use an index into the + * constant pool such as LDC, INVOKEVIRTUAL, etc. + * + * @see ConstantPoolGen + * @see LDC + * @see INVOKEVIRTUAL + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class CPInstruction extends Instruction + implements TypedInstruction, IndexedInstruction +{ + protected int index; // index to constant pool + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + CPInstruction() {} + + /** + * @param index to constant pool + */ + protected CPInstruction(short opcode, int index) { + super(opcode, (short)3); + setIndex(index); + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + out.writeByte(opcode); + out.writeShort(index); + } + + /** + * Long output format: + * + * <name of opcode> "["<opcode number>"]" + * "("<length of instruction>")" "<"< constant pool index>">" + * + * @param verbose long/short format switch + * @return mnemonic for instruction + */ + public String toString(boolean verbose) { + return super.toString(verbose) + " " + index; + } + + /** + * @return mnemonic for instruction with symbolic references resolved + */ + public String toString(ConstantPool cp) { + Constant c = cp.getConstant(index); + String str = cp.constantToString(c); + + if(c instanceof ConstantClass) + str = str.replace('.', '/'); + + return org.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " + str; + } + + /** + * Read needed data (i.e., index) from file. + * @param bytes input stream + * @param wide wide prefix? + */ + protected void initFromFile(ByteSequence bytes, boolean wide) + throws IOException + { + setIndex(bytes.readUnsignedShort()); + length = 3; + } + + /** + * @return index in constant pool referred by this instruction. + */ + public final int getIndex() { return index; } + + /** + * Set the index to constant pool. + * @param index in constant pool. + */ + public void setIndex(int index) { + if(index < 0) + throw new ClassGenException("Negative index value: " + index); + + this.index = index; + } + + /** @return type related with this instruction. + */ + public Type getType(ConstantPoolGen cpg) { + ConstantPool cp = cpg.getConstantPool(); + String name = cp.getConstantString(index, org.apache.bcel.Constants.CONSTANT_Class); + + if(!name.startsWith("[")) + name = "L" + name + ";"; + + return Type.getType(name); + } +} diff --git a/src/java/org/apache/bcel/generic/ClassGen.java b/src/java/org/apache/bcel/generic/ClassGen.java new file mode 100644 index 00000000..8c6d95d6 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ClassGen.java @@ -0,0 +1,434 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.*; +import java.util.ArrayList; +import java.util.Iterator; + +/** + * Template class for building up a java class. May be initialized with an + * existing java class (file). + * + * @see JavaClass + * @version $Id$ + * @author M. Dahm + */ +public class ClassGen extends AccessFlags implements Cloneable { + /* Corresponds to the fields found in a JavaClass object. + */ + private String class_name, super_class_name, file_name; + private int class_name_index = -1, superclass_name_index = -1; + private int major = Constants.MAJOR_1_1, minor = Constants.MINOR_1_1; + + private ConstantPoolGen cp; // Template for building up constant pool + + // ArrayLists instead of arrays to gather fields, methods, etc. + private ArrayList field_vec = new ArrayList(); + private ArrayList method_vec = new ArrayList(); + private ArrayList attribute_vec = new ArrayList(); + private ArrayList interface_vec = new ArrayList(); + + /** Convenience constructor to set up some important values initially. + * + * @param class_name fully qualified class name + * @param super_class_name fully qualified superclass name + * @param file_name source file name + * @param access_flags access qualifiers + * @param interfaces implemented interfaces + */ + public ClassGen(String class_name, String super_class_name, String file_name, + int access_flags, String[] interfaces) { + this.class_name = class_name; + this.super_class_name = super_class_name; + this.file_name = file_name; + this.access_flags = access_flags; + cp = new ConstantPoolGen(); // Create empty constant pool + + // Put everything needed by default into the constant pool and the vectors + addAttribute(new SourceFile(cp.addUtf8("SourceFile"), 2, + cp.addUtf8(file_name), cp.getConstantPool())); + class_name_index = cp.addClass(class_name); + superclass_name_index = cp.addClass(super_class_name); + + if(interfaces != null) + for(int i=0; i < interfaces.length; i++) + addInterface(interfaces[i]); + } + + /** + * Initialize with existing class. + * @param clazz JavaClass object (e.g. read from file) + */ + public ClassGen(JavaClass clazz) { + class_name_index = clazz.getClassNameIndex(); + superclass_name_index = clazz.getSuperclassNameIndex(); + class_name = clazz.getClassName(); + super_class_name = clazz.getSuperclassName(); + file_name = clazz.getSourceFileName(); + access_flags = clazz.getAccessFlags(); + cp = new ConstantPoolGen(clazz.getConstantPool()); + major = clazz.getMajor(); + minor = clazz.getMinor(); + + Attribute[] attributes = clazz.getAttributes(); + Method[] methods = clazz.getMethods(); + Field[] fields = clazz.getFields(); + String[] interfaces = clazz.getInterfaceNames(); + + for(int i=0; i < interfaces.length; i++) + addInterface(interfaces[i]); + + for(int i=0; i < attributes.length; i++) + addAttribute(attributes[i]); + + for(int i=0; i < methods.length; i++) + addMethod(methods[i]); + + for(int i=0; i < fields.length; i++) + addField(fields[i]); + } + + /** + * @return the (finally) built up Java class object. + */ + public JavaClass getJavaClass() { + int[] interfaces = getInterfaces(); + Field[] fields = getFields(); + Method[] methods = getMethods(); + Attribute[] attributes = getAttributes(); + + // Must be last since the above calls may still add something to it + ConstantPool cp = this.cp.getFinalConstantPool(); + + return new JavaClass(class_name_index, superclass_name_index, + file_name, major, minor, access_flags, + cp, interfaces, fields, methods, attributes); + } + + /** + * Add an interface to this class, i.e., this class has to implement it. + * @param name interface to implement (fully qualified class name) + */ + public void addInterface(String name) { + interface_vec.add(name); + } + + /** + * Remove an interface from this class. + * @param name interface to remove (fully qualified name) + */ + public void removeInterface(String name) { + interface_vec.remove(name); + } + + /** + * @return major version number of class file + */ + public int getMajor() { return major; } + + /** Set major version number of class file, default value is 45 (JDK 1.1) + * @param major major version number + */ + public void setMajor(int major) { + this.major = major; + } + + /** Set minor version number of class file, default value is 3 (JDK 1.1) + * @param minor minor version number + */ + public void setMinor(int minor) { + this.minor = minor; + } + + /** + * @return minor version number of class file + */ + public int getMinor() { return minor; } + + /** + * Add an attribute to this class. + * @param a attribute to add + */ + public void addAttribute(Attribute a) { attribute_vec.add(a); } + + /** + * Add a method to this class. + * @param m method to add + */ + public void addMethod(Method m) { method_vec.add(m); } + + /** + * Convenience method. + * + * Add an empty constructor to this class that does nothing but calling super(). + * @param access rights for constructor + */ + public void addEmptyConstructor(int access_flags) { + InstructionList il = new InstructionList(); + il.append(InstructionConstants.THIS); // Push `this' + il.append(new INVOKESPECIAL(cp.addMethodref(super_class_name, + "", "()V"))); + il.append(InstructionConstants.RETURN); + + MethodGen mg = new MethodGen(access_flags, Type.VOID, Type.NO_ARGS, null, + "", class_name, il, cp); + mg.setMaxStack(1); + addMethod(mg.getMethod()); + } + + /** + * Add a field to this class. + * @param f field to add + */ + public void addField(Field f) { field_vec.add(f); } + + public boolean containsField(Field f) { return field_vec.contains(f); } + + /** @return field object with given name, or null + */ + public Field containsField(String name) { + for(Iterator e=field_vec.iterator(); e.hasNext(); ) { + Field f = (Field)e.next(); + if(f.getName().equals(name)) + return f; + } + + return null; + } + + /** @return method object with given name and signature, or null + */ + public Method containsMethod(String name, String signature) { + for(Iterator e=method_vec.iterator(); e.hasNext();) { + Method m = (Method)e.next(); + if(m.getName().equals(name) && m.getSignature().equals(signature)) + return m; + } + + return null; + } + + /** + * Remove an attribute from this class. + * @param a attribute to remove + */ + public void removeAttribute(Attribute a) { attribute_vec.remove(a); } + + /** + * Remove a method from this class. + * @param m method to remove + */ + public void removeMethod(Method m) { method_vec.remove(m); } + + /** Replace given method with new one. If the old one does not exist + * add the new_ method to the class anyway. + */ + public void replaceMethod(Method old, Method new_) { + if(new_ == null) + throw new ClassGenException("Replacement method must not be null"); + + int i = method_vec.indexOf(old); + + if(i < 0) + method_vec.add(new_); + else + method_vec.set(i, new_); + } + + /** Replace given field with new one. If the old one does not exist + * add the new_ field to the class anyway. + */ + public void replaceField(Field old, Field new_) { + if(new_ == null) + throw new ClassGenException("Replacement method must not be null"); + + int i = field_vec.indexOf(old); + + if(i < 0) + field_vec.add(new_); + else + field_vec.set(i, new_); + } + + /** + * Remove a field to this class. + * @param f field to remove + */ + public void removeField(Field f) { field_vec.remove(f); } + + public String getClassName() { return class_name; } + public String getSuperclassName() { return super_class_name; } + public String getFileName() { return file_name; } + + public void setClassName(String name) { + class_name = name.replace('/', '.'); + class_name_index = cp.addClass(name); + } + + public void setSuperclassName(String name) { + super_class_name = name.replace('/', '.'); + superclass_name_index = cp.addClass(name); + } + + public Method[] getMethods() { + Method[] methods = new Method[method_vec.size()]; + method_vec.toArray(methods); + return methods; + } + + public void setMethods(Method[] methods) { + method_vec.clear(); + for(int m=0; m. + */ + +/** + * Thrown on internal errors. Extends RuntimeException so it hasn't to be declared + * in the throws clause every time. + * + * @version $Id$ + * @author M. Dahm + */ +public class ClassGenException extends RuntimeException { + public ClassGenException() { super(); } + public ClassGenException(String s) { super(s); } +} + diff --git a/src/java/org/apache/bcel/generic/ClassObserver.java b/src/java/org/apache/bcel/generic/ClassObserver.java new file mode 100644 index 00000000..ee37ceda --- /dev/null +++ b/src/java/org/apache/bcel/generic/ClassObserver.java @@ -0,0 +1,67 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Implement this interface if you're interested in changes to a ClassGen object + * and register yourself with addObserver(). + * + * @version $Id$ + * @author M. Dahm + */ +public interface ClassObserver { + public void notify(ClassGen clazz); +} + diff --git a/src/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/java/org/apache/bcel/generic/CodeExceptionGen.java new file mode 100644 index 00000000..1f58b28d --- /dev/null +++ b/src/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -0,0 +1,201 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.*; + +/** + * This class represents an exception handler, i.e., specifies the region where + * a handler is active and an instruction where the actual handling is done. + * pool as parameters. Opposed to the JVM specification the end of the handled + * region is set to be inclusive, i.e. all instructions between start and end + * are protected including the start and end instructions (handles) themselves. + * The end of the region is automatically mapped to be exclusive when calling + * getCodeException(), i.e., there is no difference semantically. + * + * @version $Id$ + * @author M. Dahm + * @see MethodGen + * @see CodeException + * @see InstructionHandle + */ +public final class CodeExceptionGen implements InstructionTargeter, Cloneable { + private InstructionHandle start_pc; + private InstructionHandle end_pc; + private InstructionHandle handler_pc; + private ObjectType catch_type; + + /** + * Add an exception handler, i.e., specify region where a handler is active and an + * instruction where the actual handling is done. + * + * @param start_pc Start of handled region (inclusive) + * @param end_pc End of handled region (inclusive) + * @param handler_pc Where handling is done + * @param catch_type which exception is handled, null for ANY + */ + public CodeExceptionGen(InstructionHandle start_pc, InstructionHandle end_pc, + InstructionHandle handler_pc, ObjectType catch_type) { + setStartPC(start_pc); + setEndPC(end_pc); + setHandlerPC(handler_pc); + this.catch_type = catch_type; + } + + /** + * Get CodeException object.
        + * + * This relies on that the instruction list has already been dumped + * to byte code or or that the `setPositions' methods has been + * called for the instruction list. + * + * @param cp constant pool + */ + public CodeException getCodeException(ConstantPoolGen cp) { + return new CodeException(start_pc.getPosition(), + end_pc.getPosition() + end_pc.getInstruction().getLength(), + handler_pc.getPosition(), + (catch_type == null)? 0 : cp.addClass(catch_type)); + } + + /* Set start of handler + * @param start_pc Start of handled region (inclusive) + */ + public void setStartPC(InstructionHandle start_pc) { + BranchInstruction.notifyTarget(this.start_pc, start_pc, this); + this.start_pc = start_pc; + } + + /* Set end of handler + * @param end_pc End of handled region (inclusive) + */ + public void setEndPC(InstructionHandle end_pc) { + BranchInstruction.notifyTarget(this.end_pc, end_pc, this); + this.end_pc = end_pc; + } + + /* Set handler code + * @param handler_pc Start of handler + */ + public void setHandlerPC(InstructionHandle handler_pc) { + BranchInstruction.notifyTarget(this.handler_pc, handler_pc, this); + this.handler_pc = handler_pc; + } + + /** + * @param old_ih old target, either start or end + * @param new_ih new target + */ + public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { + boolean targeted = false; + + if(start_pc == old_ih) { + targeted = true; + setStartPC(new_ih); + } + + if(end_pc == old_ih) { + targeted = true; + setEndPC(new_ih); + } + + if(handler_pc == old_ih) { + targeted = true; + setHandlerPC(new_ih); + } + + if(!targeted) + throw new ClassGenException("Not targeting " + old_ih + ", but {" + start_pc + ", " + + end_pc + ", " + handler_pc + "}"); + } + + /** + * @return true, if ih is target of this handler + */ + public boolean containsTarget(InstructionHandle ih) { + return (start_pc == ih) || (end_pc == ih) || (handler_pc == ih); + } + + /** Sets the type of the Exception to catch. Set 'null' for ANY. */ + public void setCatchType(ObjectType catch_type) { this.catch_type = catch_type; } + /** Gets the type of the Exception to catch, 'null' for ANY. */ + public ObjectType getCatchType() { return catch_type; } + + /** @return start of handled region (inclusive) + */ + public InstructionHandle getStartPC() { return start_pc; } + + /** @return end of handled region (inclusive) + */ + public InstructionHandle getEndPC() { return end_pc; } + + /** @return start of handler + */ + public InstructionHandle getHandlerPC() { return handler_pc; } + + public String toString() { + return "CodeExceptionGen(" + start_pc + ", " + end_pc + ", " + handler_pc + ")"; + } + + public Object clone() { + try { + return super.clone(); + } catch(CloneNotSupportedException e) { + System.err.println(e); + return null; + } + } +} diff --git a/src/java/org/apache/bcel/generic/CompoundInstruction.java b/src/java/org/apache/bcel/generic/CompoundInstruction.java new file mode 100644 index 00000000..5198dc43 --- /dev/null +++ b/src/java/org/apache/bcel/generic/CompoundInstruction.java @@ -0,0 +1,76 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Wrapper class for `compound' operations, virtual instructions that + * don't exist as byte code, but give a useful meaning. For example, + * the (virtual) PUSH instruction takes an arbitray argument and produces the + * appropiate code at dump time (ICONST, LDC, BIPUSH, ...). Also you can use the + * SWITCH instruction as a useful template for either LOOKUPSWITCH or + * TABLESWITCH. + * + * The interface provides the possibilty for the user to write + * `templates' or `macros' for such reuseable code patterns. + * + * @version $Id$ + * @author M. Dahm + * @see PUSH + * @see SWITCH + */ +public interface CompoundInstruction { + public InstructionList getInstructionList(); +} + diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/java/org/apache/bcel/generic/ConstantPoolGen.java new file mode 100644 index 00000000..54cf2bb1 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -0,0 +1,782 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.*; +import java.util.HashMap; + +/** + * This class is used to build up a constant pool. The user adds + * constants via `addXXX' methods, `addString', `addClass', + * etc.. These methods return an index into the constant + * pool. Finally, `getFinalConstantPool()' returns the constant pool + * built up. Intermediate versions of the constant pool can be + * obtained with `getConstantPool()'. A constant pool has capacity for + * Constants.MAX_SHORT entries. Note that the first (0) is used by the + * JVM and that Double and Long constants need two slots. + * + * @version $Id$ + * @author M. Dahm + * @see Constant + */ +public class ConstantPoolGen { + protected int size = 1024; // Inital size, sufficient in most cases + protected Constant[] constants = new Constant[size]; + protected int index = 1; // First entry (0) used by JVM + + private static final String METHODREF_DELIM = ":"; + private static final String IMETHODREF_DELIM = "#"; + private static final String FIELDREF_DELIM = "&"; + private static final String NAT_DELIM = "%"; + + private static class Index { + int index; + Index(int i) { index = i; } + } + + /** + * Initialize with given array of constants. + * + * @param c array of given constants, new ones will be appended + */ + public ConstantPoolGen(Constant[] cs) { + if(cs.length > size) { + size = cs.length; + constants = new Constant[size]; + } + + System.arraycopy(cs, 0, constants, 0, cs.length); + + if(cs.length > 0) + index = cs.length; + + for(int i=1; i < index; i++) { + Constant c = constants[i]; + + if(c instanceof ConstantString) { + ConstantString s = (ConstantString)c; + ConstantUtf8 u8 = (ConstantUtf8)constants[s.getStringIndex()]; + + string_table.put(u8.getBytes(), new Index(i)); + } else if(c instanceof ConstantClass) { + ConstantClass s = (ConstantClass)c; + ConstantUtf8 u8 = (ConstantUtf8)constants[s.getNameIndex()]; + + class_table.put(u8.getBytes(), new Index(i)); + } else if(c instanceof ConstantNameAndType) { + ConstantNameAndType n = (ConstantNameAndType)c; + ConstantUtf8 u8 = (ConstantUtf8)constants[n.getNameIndex()]; + ConstantUtf8 u8_2 = (ConstantUtf8)constants[n.getSignatureIndex()]; + + n_a_t_table.put(u8.getBytes() + NAT_DELIM + u8_2.getBytes(), new Index(i)); + } else if(c instanceof ConstantUtf8) { + ConstantUtf8 u = (ConstantUtf8)c; + + utf8_table.put(u.getBytes(), new Index(i)); + } else if(c instanceof ConstantCP) { + ConstantCP m = (ConstantCP)c; + ConstantClass clazz = (ConstantClass)constants[m.getClassIndex()]; + ConstantNameAndType n = (ConstantNameAndType)constants[m.getNameAndTypeIndex()]; + + ConstantUtf8 u8 = (ConstantUtf8)constants[clazz.getNameIndex()]; + String class_name = u8.getBytes().replace('/', '.'); + + u8 = (ConstantUtf8)constants[n.getNameIndex()]; + String method_name = u8.getBytes(); + + u8 = (ConstantUtf8)constants[n.getSignatureIndex()]; + String signature = u8.getBytes(); + + String delim = METHODREF_DELIM; + + if(c instanceof ConstantInterfaceMethodref) + delim = IMETHODREF_DELIM; + else if(c instanceof ConstantFieldref) + delim = FIELDREF_DELIM; + + cp_table.put(class_name + delim + method_name + delim + signature, new Index(i)); + } + } + } + + /** + * Initialize with given constant pool. + */ + public ConstantPoolGen(ConstantPool cp) { + this(cp.getConstantPool()); + } + + /** + * Create empty constant pool. + */ + public ConstantPoolGen() {} + + /** Resize internal array of constants. + */ + protected void adjustSize() { + if(index + 3 >= size) { + Constant[] cs = constants; + + size *= 2; + constants = new Constant[size]; + System.arraycopy(cs, 0, constants, 0, index); + } + } + + private HashMap string_table = new HashMap(); + + /** + * Look for ConstantString in ConstantPool containing String `str'. + * + * @param str String to search for + * @return index on success, -1 otherwise + */ + public int lookupString(String str) { + Index index = (Index)string_table.get(str); + return (index != null)? index.index : -1; + } + + /** + * Add a new String constant to the ConstantPool, if it is not already in there. + * + * @param str String to add + * @return index of entry + */ + public int addString(String str) { + int ret; + + if((ret = lookupString(str)) != -1) + return ret; // Already in CP + + adjustSize(); + + ConstantUtf8 u8 = new ConstantUtf8(str); + ConstantString s = new ConstantString(index); + + constants[index++] = u8; + ret = index; + constants[index++] = s; + + string_table.put(str, new Index(ret)); + + return ret; + } + + private HashMap class_table = new HashMap(); + + /** + * Look for ConstantClass in ConstantPool named `str'. + * + * @param str String to search for + * @return index on success, -1 otherwise + */ + public int lookupClass(String str) { + Index index = (Index)class_table.get(str.replace('.', '/')); + return (index != null)? index.index : -1; + } + + private int addClass_(String clazz) { + int ret; + + if((ret = lookupClass(clazz)) != -1) + return ret; // Already in CP + + adjustSize(); + + ConstantClass c = new ConstantClass(addUtf8(clazz)); + + ret = index; + constants[index++] = c; + + class_table.put(clazz, new Index(ret)); + + return ret; + } + + /** + * Add a new Class reference to the ConstantPool, if it is not already in there. + * + * @param str Class to add + * @return index of entry + */ + public int addClass(String str) { + return addClass_(str.replace('.', '/')); + } + + /** + * Add a new Class reference to the ConstantPool for a given type. + * + * @param str Class to add + * @return index of entry + */ + public int addClass(ObjectType type) { + return addClass(type.getClassName()); + } + + /** + * Add a reference to an array class (e.g. String[][]) as needed by MULTIANEWARRAY + * instruction, e.g. to the ConstantPool. + * + * @param type type of array class + * @return index of entry + */ + public int addArrayClass(ArrayType type) { + return addClass_(type.getSignature()); + } + + /** + * Look for ConstantInteger in ConstantPool. + * + * @param n integer number to look for + * @return index on success, -1 otherwise + */ + public int lookupInteger(int n) { + for(int i=1; i < index; i++) { + if(constants[i] instanceof ConstantInteger) { + ConstantInteger c = (ConstantInteger)constants[i]; + + if(c.getBytes() == n) + return i; + } + } + + return -1; + } + + /** + * Add a new Integer constant to the ConstantPool, if it is not already in there. + * + * @param n integer number to add + * @return index of entry + */ + public int addInteger(int n) { + int ret; + + if((ret = lookupInteger(n)) != -1) + return ret; // Already in CP + + adjustSize(); + + ret = index; + constants[index++] = new ConstantInteger(n); + + return ret; + } + + /** + * Look for ConstantFloat in ConstantPool. + * + * @param n Float number to look for + * @return index on success, -1 otherwise + */ + public int lookupFloat(float n) { + for(int i=1; i < index; i++) { + if(constants[i] instanceof ConstantFloat) { + ConstantFloat c = (ConstantFloat)constants[i]; + + if(c.getBytes() == n) + return i; + } + } + + return -1; + } + + /** + * Add a new Float constant to the ConstantPool, if it is not already in there. + * + * @param n Float number to add + * @return index of entry + */ + public int addFloat(float n) { + int ret; + + if((ret = lookupFloat(n)) != -1) + return ret; // Already in CP + + adjustSize(); + + ret = index; + constants[index++] = new ConstantFloat(n); + + return ret; + } + + private HashMap utf8_table = new HashMap(); + + /** + * Look for ConstantUtf8 in ConstantPool. + * + * @param n Utf8 string to look for + * @return index on success, -1 otherwise + */ + public int lookupUtf8(String n) { + Index index = (Index)utf8_table.get(n); + + return (index != null)? index.index : -1; + } + + /** + * Add a new Utf8 constant to the ConstantPool, if it is not already in there. + * + * @param n Utf8 string to add + * @return index of entry + */ + public int addUtf8(String n) { + int ret; + + if((ret = lookupUtf8(n)) != -1) + return ret; // Already in CP + + adjustSize(); + + ret = index; + constants[index++] = new ConstantUtf8(n); + + utf8_table.put(n, new Index(ret)); + + return ret; + } + + /** + * Look for ConstantLong in ConstantPool. + * + * @param n Long number to look for + * @return index on success, -1 otherwise + */ + public int lookupLong(long n) { + for(int i=1; i < index; i++) { + if(constants[i] instanceof ConstantLong) { + ConstantLong c = (ConstantLong)constants[i]; + + if(c.getBytes() == n) + return i; + } + } + + return -1; + } + + /** + * Add a new long constant to the ConstantPool, if it is not already in there. + * + * @param n Long number to add + * @return index of entry + */ + public int addLong(long n) { + int ret; + + if((ret = lookupLong(n)) != -1) + return ret; // Already in CP + + adjustSize(); + + ret = index; + constants[index] = new ConstantLong(n); + index += 2; // Wastes one entry according to spec + + return ret; + } + + /** + * Look for ConstantDouble in ConstantPool. + * + * @param n Double number to look for + * @return index on success, -1 otherwise + */ + public int lookupDouble(double n) { + for(int i=1; i < index; i++) { + if(constants[i] instanceof ConstantDouble) { + ConstantDouble c = (ConstantDouble)constants[i]; + + if(c.getBytes() == n) + return i; + } + } + + return -1; + } + + /** + * Add a new double constant to the ConstantPool, if it is not already in there. + * + * @param n Double number to add + * @return index of entry + */ + public int addDouble(double n) { + int ret; + + if((ret = lookupDouble(n)) != -1) + return ret; // Already in CP + + adjustSize(); + + ret = index; + constants[index] = new ConstantDouble(n); + index += 2; // Wastes one entry according to spec + + return ret; + } + + private HashMap n_a_t_table = new HashMap(); + + /** + * Look for ConstantNameAndType in ConstantPool. + * + * @param name of variable/method + * @param signature of variable/method + * @return index on success, -1 otherwise + */ + public int lookupNameAndType(String name, String signature) { + Index index = (Index)n_a_t_table.get(name + NAT_DELIM + signature); + return (index != null)? index.index : -1; + } + + /** + * Add a new NameAndType constant to the ConstantPool if it is not already + * in there. + * + * @param n NameAndType string to add + * @return index of entry + */ + public int addNameAndType(String name, String signature) { + int ret; + int name_index, signature_index; + + if((ret = lookupNameAndType(name, signature)) != -1) + return ret; // Already in CP + + adjustSize(); + + name_index = addUtf8(name); + signature_index = addUtf8(signature); + ret = index; + constants[index++] = new ConstantNameAndType(name_index, signature_index); + + n_a_t_table.put(name + NAT_DELIM + signature, new Index(ret)); + return ret; + } + + private HashMap cp_table = new HashMap(); + + /** + * Look for ConstantMethodref in ConstantPool. + * + * @param class_name Where to find method + * @param method_name Guess what + * @param signature return and argument types + * @return index on success, -1 otherwise + */ + public int lookupMethodref(String class_name, String method_name, String signature) { + Index index = (Index)cp_table.get(class_name + METHODREF_DELIM + method_name + + METHODREF_DELIM + signature); + return (index != null)? index.index : -1; + } + + public int lookupMethodref(MethodGen method) { + return lookupMethodref(method.getClassName(), method.getName(), + method.getSignature()); + } + + /** + * Add a new Methodref constant to the ConstantPool, if it is not already + * in there. + * + * @param n Methodref string to add + * @return index of entry + */ + public int addMethodref(String class_name, String method_name, String signature) { + int ret, class_index, name_and_type_index; + + if((ret = lookupMethodref(class_name, method_name, signature)) != -1) + return ret; // Already in CP + + adjustSize(); + + name_and_type_index = addNameAndType(method_name, signature); + class_index = addClass(class_name); + ret = index; + constants[index++] = new ConstantMethodref(class_index, name_and_type_index); + + cp_table.put(class_name + METHODREF_DELIM + method_name + + METHODREF_DELIM + signature, new Index(ret)); + + return ret; + } + + public int addMethodref(MethodGen method) { + return addMethodref(method.getClassName(), method.getName(), + method.getSignature()); + } + + /** + * Look for ConstantInterfaceMethodref in ConstantPool. + * + * @param class_name Where to find method + * @param method_name Guess what + * @param signature return and argument types + * @return index on success, -1 otherwise + */ + public int lookupInterfaceMethodref(String class_name, String method_name, String signature) { + Index index = (Index)cp_table.get(class_name + IMETHODREF_DELIM + method_name + + IMETHODREF_DELIM + signature); + return (index != null)? index.index : -1; + } + + public int lookupInterfaceMethodref(MethodGen method) { + return lookupInterfaceMethodref(method.getClassName(), method.getName(), + method.getSignature()); + } + + /** + * Add a new InterfaceMethodref constant to the ConstantPool, if it is not already + * in there. + * + * @param n InterfaceMethodref string to add + * @return index of entry + */ + public int addInterfaceMethodref(String class_name, String method_name, String signature) { + int ret, class_index, name_and_type_index; + + if((ret = lookupInterfaceMethodref(class_name, method_name, signature)) != -1) + return ret; // Already in CP + + adjustSize(); + + class_index = addClass(class_name); + name_and_type_index = addNameAndType(method_name, signature); + ret = index; + constants[index++] = new ConstantInterfaceMethodref(class_index, name_and_type_index); + + cp_table.put(class_name + IMETHODREF_DELIM + method_name + + IMETHODREF_DELIM + signature, new Index(ret)); + + return ret; + } + + public int addInterfaceMethodref(MethodGen method) { + return addInterfaceMethodref(method.getClassName(), method.getName(), + method.getSignature()); + } + + /** + * Look for ConstantFieldref in ConstantPool. + * + * @param class_name Where to find method + * @param field_name Guess what + * @param signature return and argument types + * @return index on success, -1 otherwise + */ + public int lookupFieldref(String class_name, String field_name, String signature) { + Index index = (Index)cp_table.get(class_name + FIELDREF_DELIM + field_name + + FIELDREF_DELIM + signature); + return (index != null)? index.index : -1; + } + + /** + * Add a new Fieldref constant to the ConstantPool, if it is not already + * in there. + * + * @param n Fieldref string to add + * @return index of entry + */ + public int addFieldref(String class_name, String field_name, String signature) { + int ret; + int class_index, name_and_type_index; + + if((ret = lookupFieldref(class_name, field_name, signature)) != -1) + return ret; // Already in CP + + adjustSize(); + + class_index = addClass(class_name); + name_and_type_index = addNameAndType(field_name, signature); + ret = index; + constants[index++] = new ConstantFieldref(class_index, name_and_type_index); + + cp_table.put(class_name + FIELDREF_DELIM + field_name + FIELDREF_DELIM + signature, new Index(ret)); + + return ret; + } + + /** + * @param i index in constant pool + * @return constant pool entry at index i + */ + public Constant getConstant(int i) { return constants[i]; } + + /** + * Use with care! + * + * @param i index in constant pool + * @param c new constant pool entry at index i + */ + public void setConstant(int i, Constant c) { constants[i] = c; } + + /** + * @return intermediate constant pool + */ + public ConstantPool getConstantPool() { + return new ConstantPool(constants); + } + + /** + * @return current size of constant pool + */ + public int getSize() { + return index; + } + + /** + * @return constant pool with proper length + */ + public ConstantPool getFinalConstantPool() { + Constant[] cs = new Constant[index]; + + System.arraycopy(constants, 0, cs, 0, index); + + return new ConstantPool(cs); + } + + /** + * @return String representation. + */ + public String toString() { + StringBuffer buf = new StringBuffer(); + + for(int i=1; i < index; i++) + buf.append(i + ")" + constants[i] + "\n"); + + return buf.toString(); + } + + /** Import constant from another ConstantPool and return new index. + */ + public int addConstant(Constant c, ConstantPoolGen cp) { + Constant[] constants = cp.getConstantPool().getConstantPool(); + + switch(c.getTag()) { + case Constants.CONSTANT_String: { + ConstantString s = (ConstantString)c; + ConstantUtf8 u8 = (ConstantUtf8)constants[s.getStringIndex()]; + + return addString(u8.getBytes()); + } + + case Constants.CONSTANT_Class: { + ConstantClass s = (ConstantClass)c; + ConstantUtf8 u8 = (ConstantUtf8)constants[s.getNameIndex()]; + + return addClass(u8.getBytes()); + } + + case Constants.CONSTANT_NameAndType: { + ConstantNameAndType n = (ConstantNameAndType)c; + ConstantUtf8 u8 = (ConstantUtf8)constants[n.getNameIndex()]; + ConstantUtf8 u8_2 = (ConstantUtf8)constants[n.getSignatureIndex()]; + + return addNameAndType(u8.getBytes(), u8_2.getBytes()); + } + + case Constants.CONSTANT_Utf8: + return addUtf8(((ConstantUtf8)c).getBytes()); + + case Constants.CONSTANT_Double: + return addDouble(((ConstantDouble)c).getBytes()); + + case Constants.CONSTANT_Float: + return addFloat(((ConstantFloat)c).getBytes()); + + case Constants.CONSTANT_Long: + return addLong(((ConstantLong)c).getBytes()); + + case Constants.CONSTANT_Integer: + return addInteger(((ConstantInteger)c).getBytes()); + + case Constants.CONSTANT_InterfaceMethodref: case Constants.CONSTANT_Methodref: + case Constants.CONSTANT_Fieldref: { + ConstantCP m = (ConstantCP)c; + ConstantClass clazz = (ConstantClass)constants[m.getClassIndex()]; + ConstantNameAndType n = (ConstantNameAndType)constants[m.getNameAndTypeIndex()]; + ConstantUtf8 u8 = (ConstantUtf8)constants[clazz.getNameIndex()]; + String class_name = u8.getBytes().replace('/', '.'); + + u8 = (ConstantUtf8)constants[n.getNameIndex()]; + String name = u8.getBytes(); + + u8 = (ConstantUtf8)constants[n.getSignatureIndex()]; + String signature = u8.getBytes(); + + switch(c.getTag()) { + case Constants.CONSTANT_InterfaceMethodref: + return addInterfaceMethodref(class_name, name, signature); + + case Constants.CONSTANT_Methodref: + return addMethodref(class_name, name, signature); + + case Constants.CONSTANT_Fieldref: + return addFieldref(class_name, name, signature); + + default: // Never reached + throw new RuntimeException("Unknown constant type " + c); + } + } + + default: // Never reached + throw new RuntimeException("Unknown constant type " + c); + } + } +} diff --git a/src/java/org/apache/bcel/generic/ConstantPushInstruction.java b/src/java/org/apache/bcel/generic/ConstantPushInstruction.java new file mode 100644 index 00000000..95886618 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ConstantPushInstruction.java @@ -0,0 +1,70 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denotes a push instruction that produces a literal on the stack + * such as SIPUSH, BIPUSH, ICONST, etc. + * + * @version $Id$ + * @author M. Dahm + + * @see ICONST + * @see SIPUSH + */ +public interface ConstantPushInstruction extends PushInstruction, TypedInstruction { + public Number getValue(); +} + diff --git a/src/java/org/apache/bcel/generic/ConversionInstruction.java b/src/java/org/apache/bcel/generic/ConversionInstruction.java new file mode 100644 index 00000000..8aba47a0 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ConversionInstruction.java @@ -0,0 +1,102 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +/** + * Super class for the x2y family of instructions. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class ConversionInstruction extends Instruction + implements TypedInstruction, StackProducer, StackConsumer { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ConversionInstruction() {} + + /** + * @param opcode opcode of instruction + */ + protected ConversionInstruction(short opcode) { + super(opcode, (short)1); + } + + /** @return type associated with the instruction + */ + public Type getType(ConstantPoolGen cp) { + switch(opcode) { + case Constants.D2I: case Constants.F2I: case Constants.L2I: + return Type.INT; + case Constants.D2F: case Constants.I2F: case Constants.L2F: + return Type.FLOAT; + case Constants.D2L: case Constants.F2L: case Constants.I2L: + return Type.LONG; + case Constants.F2D: case Constants.I2D: case Constants.L2D: + return Type.DOUBLE; + case Constants.I2B: + return Type.BYTE; + case Constants.I2C: + return Type.CHAR; + case Constants.I2S: + return Type.SHORT; + + default: // Never reached + throw new ClassGenException("Unknown type " + opcode); + } + } +} + diff --git a/src/java/org/apache/bcel/generic/D2F.java b/src/java/org/apache/bcel/generic/D2F.java new file mode 100644 index 00000000..63c5714c --- /dev/null +++ b/src/java/org/apache/bcel/generic/D2F.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * D2F - Convert double to float + *
        Stack: ..., value.word1, value.word2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class D2F extends ConversionInstruction { + /** Convert double to float + */ + public D2F() { + super(org.apache.bcel.Constants.D2F); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitD2F(this); + } +} diff --git a/src/java/org/apache/bcel/generic/D2I.java b/src/java/org/apache/bcel/generic/D2I.java new file mode 100644 index 00000000..cf8e29b6 --- /dev/null +++ b/src/java/org/apache/bcel/generic/D2I.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * D2I - Convert double to int + *
        Stack: ..., value.word1, value.word2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class D2I extends ConversionInstruction { + /** Convert double to int + */ + public D2I() { + super(org.apache.bcel.Constants.D2I); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitD2I(this); + } +} diff --git a/src/java/org/apache/bcel/generic/D2L.java b/src/java/org/apache/bcel/generic/D2L.java new file mode 100644 index 00000000..1de3431f --- /dev/null +++ b/src/java/org/apache/bcel/generic/D2L.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * D2L - Convert double to long + *
        Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class D2L extends ConversionInstruction { + /** Convert double to long + */ + public D2L() { + super(org.apache.bcel.Constants.D2L); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitD2L(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DADD.java b/src/java/org/apache/bcel/generic/DADD.java new file mode 100644 index 00000000..6caefba5 --- /dev/null +++ b/src/java/org/apache/bcel/generic/DADD.java @@ -0,0 +1,88 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DADD - Add doubles + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result.word1, result1.word2 + * + * @version $Id$ + * @author M. Dahm + */ +public class DADD extends ArithmeticInstruction { + /** Add doubles + */ + public DADD() { + super(org.apache.bcel.Constants.DADD); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitDADD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DALOAD.java b/src/java/org/apache/bcel/generic/DALOAD.java new file mode 100644 index 00000000..21605003 --- /dev/null +++ b/src/java/org/apache/bcel/generic/DALOAD.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DALOAD - Load double from array + *
        Stack: ..., arrayref, index -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DALOAD extends ArrayInstruction implements StackProducer { + /** Load double from array + */ + public DALOAD() { + super(org.apache.bcel.Constants.DALOAD); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitDALOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DASTORE.java b/src/java/org/apache/bcel/generic/DASTORE.java new file mode 100644 index 00000000..afba81cf --- /dev/null +++ b/src/java/org/apache/bcel/generic/DASTORE.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DASTORE - Store into double array + *
        Stack: ..., arrayref, index, value.word1, value.word2 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DASTORE extends ArrayInstruction implements StackConsumer { + /** Store double into array + */ + public DASTORE() { + super(org.apache.bcel.Constants.DASTORE); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitDASTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DCMPG.java b/src/java/org/apache/bcel/generic/DCMPG.java new file mode 100644 index 00000000..ac4bbc2b --- /dev/null +++ b/src/java/org/apache/bcel/generic/DCMPG.java @@ -0,0 +1,93 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DCMPG - Compare doubles: value1 > value2 + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result + * + * @version $Id$ + * @author M. Dahm + */ +public class DCMPG extends Instruction + implements TypedInstruction, StackProducer, StackConsumer { + + public DCMPG() { + super(org.apache.bcel.Constants.DCMPG, (short)1); + } + + /** @return Type.DOUBLE + */ + public Type getType(ConstantPoolGen cp) { + return Type.DOUBLE; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitDCMPG(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DCMPL.java b/src/java/org/apache/bcel/generic/DCMPL.java new file mode 100644 index 00000000..c64a8e27 --- /dev/null +++ b/src/java/org/apache/bcel/generic/DCMPL.java @@ -0,0 +1,92 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DCMPL - Compare doubles: value1 < value2 + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result + * + * @version $Id$ + * @author M. Dahm + */ +public class DCMPL extends Instruction + implements TypedInstruction, StackProducer, StackConsumer { + public DCMPL() { + super(org.apache.bcel.Constants.DCMPL, (short)1); + } + + /** @return Type.DOUBLE + */ + public Type getType(ConstantPoolGen cp) { + return Type.DOUBLE; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitDCMPL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DCONST.java b/src/java/org/apache/bcel/generic/DCONST.java new file mode 100644 index 00000000..7f07a270 --- /dev/null +++ b/src/java/org/apache/bcel/generic/DCONST.java @@ -0,0 +1,112 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DCONST - Push 0.0 or 1.0, other values cause an exception + * + *
        Stack: ... -> ..., 
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DCONST extends Instruction + implements ConstantPushInstruction, TypedInstruction { + private double value; + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + DCONST() {} + + public DCONST(double f) { + super(org.apache.bcel.Constants.DCONST_0, (short)1); + + if(f == 0.0) + opcode = org.apache.bcel.Constants.DCONST_0; + else if(f == 1.0) + opcode = org.apache.bcel.Constants.DCONST_1; + else + throw new ClassGenException("DCONST can be used only for 0.0 and 1.0: " + f); + + value = f; + } + + public Number getValue() { return new Double(value); } + + /** @return Type.DOUBLE + */ + public Type getType(ConstantPoolGen cp) { + return Type.DOUBLE; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitPushInstruction(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitConstantPushInstruction(this); + v.visitDCONST(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DDIV.java b/src/java/org/apache/bcel/generic/DDIV.java new file mode 100644 index 00000000..3eec9167 --- /dev/null +++ b/src/java/org/apache/bcel/generic/DDIV.java @@ -0,0 +1,88 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DDIV - Divide doubles + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result.word1, result.word2 + * + * @version $Id$ + * @author M. Dahm + */ +public class DDIV extends ArithmeticInstruction { + /** Divide doubles + */ + public DDIV() { + super(org.apache.bcel.Constants.DDIV); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitDDIV(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DLOAD.java b/src/java/org/apache/bcel/generic/DLOAD.java new file mode 100644 index 00000000..8533c08c --- /dev/null +++ b/src/java/org/apache/bcel/generic/DLOAD.java @@ -0,0 +1,92 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DLOAD - Load double from local variable + *
        Stack ... -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DLOAD extends LoadInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + DLOAD() { + super(org.apache.bcel.Constants.DLOAD, org.apache.bcel.Constants.DLOAD_0); + } + + /** Load double from local variable + * @param n index of local variable + */ + public DLOAD(int n) { + super(org.apache.bcel.Constants.DLOAD, org.apache.bcel.Constants.DLOAD_0, n); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + super.accept(v); + v.visitDLOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DMUL.java b/src/java/org/apache/bcel/generic/DMUL.java new file mode 100644 index 00000000..d070a7f9 --- /dev/null +++ b/src/java/org/apache/bcel/generic/DMUL.java @@ -0,0 +1,88 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DMUL - Multiply doubles + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result.word1, result.word2 + * + * @version $Id$ + * @author M. Dahm + */ +public class DMUL extends ArithmeticInstruction { + /** Multiply doubles + */ + public DMUL() { + super(org.apache.bcel.Constants.DMUL); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitDMUL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DNEG.java b/src/java/org/apache/bcel/generic/DNEG.java new file mode 100644 index 00000000..c0911463 --- /dev/null +++ b/src/java/org/apache/bcel/generic/DNEG.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DNEG - Negate double + *
        Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DNEG extends ArithmeticInstruction { + public DNEG() { + super(org.apache.bcel.Constants.DNEG); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitDNEG(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DREM.java b/src/java/org/apache/bcel/generic/DREM.java new file mode 100644 index 00000000..e32e9add --- /dev/null +++ b/src/java/org/apache/bcel/generic/DREM.java @@ -0,0 +1,88 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DREM - Remainder of doubles + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result.word1, result.word2 + * + * @version $Id$ + * @author M. Dahm + */ +public class DREM extends ArithmeticInstruction { + /** Remainder of doubles + */ + public DREM() { + super(org.apache.bcel.Constants.DREM); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitDREM(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DRETURN.java b/src/java/org/apache/bcel/generic/DRETURN.java new file mode 100644 index 00000000..3acae91d --- /dev/null +++ b/src/java/org/apache/bcel/generic/DRETURN.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DRETURN - Return double from method + *
        Stack: ..., value.word1, value.word2 -> <empty>
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DRETURN extends ReturnInstruction { + /** Return double from method + */ + public DRETURN() { + super(org.apache.bcel.Constants.DRETURN); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitReturnInstruction(this); + v.visitDRETURN(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DSTORE.java b/src/java/org/apache/bcel/generic/DSTORE.java new file mode 100644 index 00000000..d087afdd --- /dev/null +++ b/src/java/org/apache/bcel/generic/DSTORE.java @@ -0,0 +1,92 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DSTORE - Store double into local variable + *
        Stack: ..., value.word1, value.word2 -> ... 
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DSTORE extends StoreInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + DSTORE() { + super(org.apache.bcel.Constants.DSTORE, org.apache.bcel.Constants.DSTORE_0); + } + + /** Store double into local variable + * @param n index of local variable + */ + public DSTORE(int n) { + super(org.apache.bcel.Constants.DSTORE, org.apache.bcel.Constants.DSTORE_0, n); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + super.accept(v); + v.visitDSTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DSUB.java b/src/java/org/apache/bcel/generic/DSUB.java new file mode 100644 index 00000000..96471865 --- /dev/null +++ b/src/java/org/apache/bcel/generic/DSUB.java @@ -0,0 +1,88 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DSUB - Substract doubles + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result.word1, result.word2 + * + * @version $Id$ + * @author M. Dahm + */ +public class DSUB extends ArithmeticInstruction { + /** Substract doubles + */ + public DSUB() { + super(org.apache.bcel.Constants.DSUB); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitDSUB(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DUP.java b/src/java/org/apache/bcel/generic/DUP.java new file mode 100644 index 00000000..d77acdc5 --- /dev/null +++ b/src/java/org/apache/bcel/generic/DUP.java @@ -0,0 +1,84 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DUP - Duplicate top operand stack word + *
        Stack: ..., word -> ..., word, word
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DUP extends StackInstruction implements PushInstruction { + public DUP() { + super(org.apache.bcel.Constants.DUP); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitStackInstruction(this); + v.visitDUP(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DUP2.java b/src/java/org/apache/bcel/generic/DUP2.java new file mode 100644 index 00000000..aae4be13 --- /dev/null +++ b/src/java/org/apache/bcel/generic/DUP2.java @@ -0,0 +1,84 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DUP2 - Duplicate two top operand stack words + *
        Stack: ..., word2, word1 -> ..., word2, word1, word2, word1
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DUP2 extends StackInstruction implements PushInstruction { + public DUP2() { + super(org.apache.bcel.Constants.DUP2); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitStackInstruction(this); + v.visitDUP2(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DUP2_X1.java b/src/java/org/apache/bcel/generic/DUP2_X1.java new file mode 100644 index 00000000..38eccc1d --- /dev/null +++ b/src/java/org/apache/bcel/generic/DUP2_X1.java @@ -0,0 +1,82 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DUP2_X1 - Duplicate two top operand stack words and put three down + *
        Stack: ..., word3, word2, word1 -> ..., word2, word1, word3, word2, word1
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DUP2_X1 extends StackInstruction { + public DUP2_X1() { + super(org.apache.bcel.Constants.DUP2_X1); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackInstruction(this); + v.visitDUP2_X1(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DUP2_X2.java b/src/java/org/apache/bcel/generic/DUP2_X2.java new file mode 100644 index 00000000..f68c22e8 --- /dev/null +++ b/src/java/org/apache/bcel/generic/DUP2_X2.java @@ -0,0 +1,82 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DUP2_X2 - Duplicate two top operand stack words and put four down + *
        Stack: ..., word4, word3, word2, word1 -> ..., word2, word1, word4, word3, word2, word1
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DUP2_X2 extends StackInstruction { + public DUP2_X2() { + super(org.apache.bcel.Constants.DUP2_X2); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackInstruction(this); + v.visitDUP2_X2(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DUP_X1.java b/src/java/org/apache/bcel/generic/DUP_X1.java new file mode 100644 index 00000000..1c8bdb64 --- /dev/null +++ b/src/java/org/apache/bcel/generic/DUP_X1.java @@ -0,0 +1,82 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DUP_X1 - Duplicate top operand stack word and put two down + *
        Stack: ..., word2, word1 -> ..., word1, word2, word1
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DUP_X1 extends StackInstruction { + public DUP_X1() { + super(org.apache.bcel.Constants.DUP_X1); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackInstruction(this); + v.visitDUP_X1(this); + } +} diff --git a/src/java/org/apache/bcel/generic/DUP_X2.java b/src/java/org/apache/bcel/generic/DUP_X2.java new file mode 100644 index 00000000..fd0b8bdd --- /dev/null +++ b/src/java/org/apache/bcel/generic/DUP_X2.java @@ -0,0 +1,82 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * DUP_X2 - Duplicate top operand stack word and put three down + *
        Stack: ..., word3, word2, word1 -> ..., word1, word3, word2, word1
        + * + * @version $Id$ + * @author M. Dahm + */ +public class DUP_X2 extends StackInstruction { + public DUP_X2() { + super(org.apache.bcel.Constants.DUP_X2); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackInstruction(this); + v.visitDUP_X2(this); + } +} diff --git a/src/java/org/apache/bcel/generic/EmptyVisitor.java b/src/java/org/apache/bcel/generic/EmptyVisitor.java new file mode 100644 index 00000000..fdaf5270 --- /dev/null +++ b/src/java/org/apache/bcel/generic/EmptyVisitor.java @@ -0,0 +1,244 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Supplies empty method bodies to be overridden by subclasses. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class EmptyVisitor implements Visitor { + public void visitStackInstruction(StackInstruction obj) { } + public void visitLocalVariableInstruction(LocalVariableInstruction obj) { } + public void visitBranchInstruction(BranchInstruction obj) { } + public void visitLoadClass(LoadClass obj) { } + public void visitFieldInstruction(FieldInstruction obj) { } + public void visitIfInstruction(IfInstruction obj) { } + public void visitConversionInstruction(ConversionInstruction obj) { } + public void visitPopInstruction(PopInstruction obj) { } + public void visitJsrInstruction(JsrInstruction obj) { } + public void visitGotoInstruction(GotoInstruction obj) { } + public void visitStoreInstruction(StoreInstruction obj) { } + public void visitTypedInstruction(TypedInstruction obj) { } + public void visitSelect(Select obj) { } + public void visitUnconditionalBranch(UnconditionalBranch obj) { } + public void visitPushInstruction(PushInstruction obj) { } + public void visitArithmeticInstruction(ArithmeticInstruction obj) { } + public void visitCPInstruction(CPInstruction obj) { } + public void visitInvokeInstruction(InvokeInstruction obj) { } + public void visitArrayInstruction(ArrayInstruction obj) { } + public void visitAllocationInstruction(AllocationInstruction obj) { } + public void visitReturnInstruction(ReturnInstruction obj) { } + public void visitFieldOrMethod(FieldOrMethod obj) { } + public void visitConstantPushInstruction(ConstantPushInstruction obj) { } + public void visitExceptionThrower(ExceptionThrower obj) { } + public void visitLoadInstruction(LoadInstruction obj) { } + public void visitVariableLengthInstruction(VariableLengthInstruction obj) { } + public void visitStackProducer(StackProducer obj) { } + public void visitStackConsumer(StackConsumer obj) { } + public void visitACONST_NULL(ACONST_NULL obj) { } + public void visitGETSTATIC(GETSTATIC obj) { } + public void visitIF_ICMPLT(IF_ICMPLT obj) { } + public void visitMONITOREXIT(MONITOREXIT obj) { } + public void visitIFLT(IFLT obj) { } + public void visitLSTORE(LSTORE obj) { } + public void visitPOP2(POP2 obj) { } + public void visitBASTORE(BASTORE obj) { } + public void visitISTORE(ISTORE obj) { } + public void visitCHECKCAST(CHECKCAST obj) { } + public void visitFCMPG(FCMPG obj) { } + public void visitI2F(I2F obj) { } + public void visitATHROW(ATHROW obj) { } + public void visitDCMPL(DCMPL obj) { } + public void visitARRAYLENGTH(ARRAYLENGTH obj) { } + public void visitDUP(DUP obj) { } + public void visitINVOKESTATIC(INVOKESTATIC obj) { } + public void visitLCONST(LCONST obj) { } + public void visitDREM(DREM obj) { } + public void visitIFGE(IFGE obj) { } + public void visitCALOAD(CALOAD obj) { } + public void visitLASTORE(LASTORE obj) { } + public void visitI2D(I2D obj) { } + public void visitDADD(DADD obj) { } + public void visitINVOKESPECIAL(INVOKESPECIAL obj) { } + public void visitIAND(IAND obj) { } + public void visitPUTFIELD(PUTFIELD obj) { } + public void visitILOAD(ILOAD obj) { } + public void visitDLOAD(DLOAD obj) { } + public void visitDCONST(DCONST obj) { } + public void visitNEW(NEW obj) { } + public void visitIFNULL(IFNULL obj) { } + public void visitLSUB(LSUB obj) { } + public void visitL2I(L2I obj) { } + public void visitISHR(ISHR obj) { } + public void visitTABLESWITCH(TABLESWITCH obj) { } + public void visitIINC(IINC obj) { } + public void visitDRETURN(DRETURN obj) { } + public void visitFSTORE(FSTORE obj) { } + public void visitDASTORE(DASTORE obj) { } + public void visitIALOAD(IALOAD obj) { } + public void visitDDIV(DDIV obj) { } + public void visitIF_ICMPGE(IF_ICMPGE obj) { } + public void visitLAND(LAND obj) { } + public void visitIDIV(IDIV obj) { } + public void visitLOR(LOR obj) { } + public void visitCASTORE(CASTORE obj) { } + public void visitFREM(FREM obj) { } + public void visitLDC(LDC obj) { } + public void visitBIPUSH(BIPUSH obj) { } + public void visitDSTORE(DSTORE obj) { } + public void visitF2L(F2L obj) { } + public void visitFMUL(FMUL obj) { } + public void visitLLOAD(LLOAD obj) { } + public void visitJSR(JSR obj) { } + public void visitFSUB(FSUB obj) { } + public void visitSASTORE(SASTORE obj) { } + public void visitALOAD(ALOAD obj) { } + public void visitDUP2_X2(DUP2_X2 obj) { } + public void visitRETURN(RETURN obj) { } + public void visitDALOAD(DALOAD obj) { } + public void visitSIPUSH(SIPUSH obj) { } + public void visitDSUB(DSUB obj) { } + public void visitL2F(L2F obj) { } + public void visitIF_ICMPGT(IF_ICMPGT obj) { } + public void visitF2D(F2D obj) { } + public void visitI2L(I2L obj) { } + public void visitIF_ACMPNE(IF_ACMPNE obj) { } + public void visitPOP(POP obj) { } + public void visitI2S(I2S obj) { } + public void visitIFEQ(IFEQ obj) { } + public void visitSWAP(SWAP obj) { } + public void visitIOR(IOR obj) { } + public void visitIREM(IREM obj) { } + public void visitIASTORE(IASTORE obj) { } + public void visitNEWARRAY(NEWARRAY obj) { } + public void visitINVOKEINTERFACE(INVOKEINTERFACE obj) { } + public void visitINEG(INEG obj) { } + public void visitLCMP(LCMP obj) { } + public void visitJSR_W(JSR_W obj) { } + public void visitMULTIANEWARRAY(MULTIANEWARRAY obj) { } + public void visitDUP_X2(DUP_X2 obj) { } + public void visitSALOAD(SALOAD obj) { } + public void visitIFNONNULL(IFNONNULL obj) { } + public void visitDMUL(DMUL obj) { } + public void visitIFNE(IFNE obj) { } + public void visitIF_ICMPLE(IF_ICMPLE obj) { } + public void visitLDC2_W(LDC2_W obj) { } + public void visitGETFIELD(GETFIELD obj) { } + public void visitLADD(LADD obj) { } + public void visitNOP(NOP obj) { } + public void visitFALOAD(FALOAD obj) { } + public void visitINSTANCEOF(INSTANCEOF obj) { } + public void visitIFLE(IFLE obj) { } + public void visitLXOR(LXOR obj) { } + public void visitLRETURN(LRETURN obj) { } + public void visitFCONST(FCONST obj) { } + public void visitIUSHR(IUSHR obj) { } + public void visitBALOAD(BALOAD obj) { } + public void visitDUP2(DUP2 obj) { } + public void visitIF_ACMPEQ(IF_ACMPEQ obj) { } + public void visitIMPDEP1(IMPDEP1 obj) { } + public void visitMONITORENTER(MONITORENTER obj) { } + public void visitLSHL(LSHL obj) { } + public void visitDCMPG(DCMPG obj) { } + public void visitD2L(D2L obj) { } + public void visitIMPDEP2(IMPDEP2 obj) { } + public void visitL2D(L2D obj) { } + public void visitRET(RET obj) { } + public void visitIFGT(IFGT obj) { } + public void visitIXOR(IXOR obj) { } + public void visitINVOKEVIRTUAL(INVOKEVIRTUAL obj) { } + public void visitFASTORE(FASTORE obj) { } + public void visitIRETURN(IRETURN obj) { } + public void visitIF_ICMPNE(IF_ICMPNE obj) { } + public void visitFLOAD(FLOAD obj) { } + public void visitLDIV(LDIV obj) { } + public void visitPUTSTATIC(PUTSTATIC obj) { } + public void visitAALOAD(AALOAD obj) { } + public void visitD2I(D2I obj) { } + public void visitIF_ICMPEQ(IF_ICMPEQ obj) { } + public void visitAASTORE(AASTORE obj) { } + public void visitARETURN(ARETURN obj) { } + public void visitDUP2_X1(DUP2_X1 obj) { } + public void visitFNEG(FNEG obj) { } + public void visitGOTO_W(GOTO_W obj) { } + public void visitD2F(D2F obj) { } + public void visitGOTO(GOTO obj) { } + public void visitISUB(ISUB obj) { } + public void visitF2I(F2I obj) { } + public void visitDNEG(DNEG obj) { } + public void visitICONST(ICONST obj) { } + public void visitFDIV(FDIV obj) { } + public void visitI2B(I2B obj) { } + public void visitLNEG(LNEG obj) { } + public void visitLREM(LREM obj) { } + public void visitIMUL(IMUL obj) { } + public void visitIADD(IADD obj) { } + public void visitLSHR(LSHR obj) { } + public void visitLOOKUPSWITCH(LOOKUPSWITCH obj) { } + public void visitDUP_X1(DUP_X1 obj) { } + public void visitFCMPL(FCMPL obj) { } + public void visitI2C(I2C obj) { } + public void visitLMUL(LMUL obj) { } + public void visitLUSHR(LUSHR obj) { } + public void visitISHL(ISHL obj) { } + public void visitLALOAD(LALOAD obj) { } + public void visitASTORE(ASTORE obj) { } + public void visitANEWARRAY(ANEWARRAY obj) { } + public void visitFRETURN(FRETURN obj) { } + public void visitFADD(FADD obj) { } + public void visitBREAKPOINT(BREAKPOINT obj) { } +} diff --git a/src/java/org/apache/bcel/generic/ExceptionThrower.java b/src/java/org/apache/bcel/generic/ExceptionThrower.java new file mode 100644 index 00000000..15dd085e --- /dev/null +++ b/src/java/org/apache/bcel/generic/ExceptionThrower.java @@ -0,0 +1,79 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denote an instruction that may throw a run-time or a linking + * exception (or both) during execution. This is not quite the truth + * as such; because all instructions may throw an + * java.lang.VirtualMachineError. These exceptions are omitted. + * + * The Lava Language Specification specifies exactly which + * RUN-TIME and which LINKING exceptions each + * instruction may throw which is reflected by the implementers. Due + * to the structure of the JVM specification, it may be possible that + * an Instruction implementing this interface returns a Class[] of + * size 0. + * + * Please note that we speak of an "exception" here when we mean any + * "Throwable" object; so this term is equally used for "Exception" + * and "Error" objects. + * + * @version $Id$ + * @author Enver Haase + */ +public interface ExceptionThrower { + public java.lang.Class[] getExceptions(); +} diff --git a/src/java/org/apache/bcel/generic/F2D.java b/src/java/org/apache/bcel/generic/F2D.java new file mode 100644 index 00000000..381d4284 --- /dev/null +++ b/src/java/org/apache/bcel/generic/F2D.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * F2D - Convert float to double + *
        Stack: ..., value -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class F2D extends ConversionInstruction { + /** Convert float to double + */ + public F2D() { + super(org.apache.bcel.Constants.F2D); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitF2D(this); + } +} diff --git a/src/java/org/apache/bcel/generic/F2I.java b/src/java/org/apache/bcel/generic/F2I.java new file mode 100644 index 00000000..3d0092df --- /dev/null +++ b/src/java/org/apache/bcel/generic/F2I.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * F2I - Convert float to int + *
        Stack: ..., value -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class F2I extends ConversionInstruction { + /** Convert float to int + */ + public F2I() { + super(org.apache.bcel.Constants.F2I); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitF2I(this); + } +} diff --git a/src/java/org/apache/bcel/generic/F2L.java b/src/java/org/apache/bcel/generic/F2L.java new file mode 100644 index 00000000..eb6689fc --- /dev/null +++ b/src/java/org/apache/bcel/generic/F2L.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * F2L - Convert float to long + *
        Stack: ..., value -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class F2L extends ConversionInstruction { + /** Convert float to long + */ + public F2L() { + super(org.apache.bcel.Constants.F2L); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitF2L(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FADD.java b/src/java/org/apache/bcel/generic/FADD.java new file mode 100644 index 00000000..c7ba2423 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FADD.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FADD - Add floats + *
        Stack: ..., value1, value2 -> result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FADD extends ArithmeticInstruction { + /** Add floats + */ + public FADD() { + super(org.apache.bcel.Constants.FADD); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitFADD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FALOAD.java b/src/java/org/apache/bcel/generic/FALOAD.java new file mode 100644 index 00000000..48d361d5 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FALOAD.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FALOAD - Load float from array + *
        Stack: ..., arrayref, index -> ..., value
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FALOAD extends ArrayInstruction implements StackProducer { + /** Load float from array + */ + public FALOAD() { + super(org.apache.bcel.Constants.FALOAD); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitFALOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FASTORE.java b/src/java/org/apache/bcel/generic/FASTORE.java new file mode 100644 index 00000000..a6ea273a --- /dev/null +++ b/src/java/org/apache/bcel/generic/FASTORE.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FASTORE - Store into float array + *
        Stack: ..., arrayref, index, value -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FASTORE extends ArrayInstruction implements StackConsumer { + /** Store float into array + */ + public FASTORE() { + super(org.apache.bcel.Constants.FASTORE); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitFASTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FCMPG.java b/src/java/org/apache/bcel/generic/FCMPG.java new file mode 100644 index 00000000..de638802 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FCMPG.java @@ -0,0 +1,91 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FCMPG - Compare floats: value1 > value2 + *
        Stack: ..., value1, value2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FCMPG extends Instruction + implements TypedInstruction, StackProducer, StackConsumer { + public FCMPG() { + super(org.apache.bcel.Constants.FCMPG, (short)1); + } + + /** @return Type.FLOAT + */ + public Type getType(ConstantPoolGen cp) { + return Type.FLOAT; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitFCMPG(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FCMPL.java b/src/java/org/apache/bcel/generic/FCMPL.java new file mode 100644 index 00000000..5f67ce75 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FCMPL.java @@ -0,0 +1,91 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FCMPL - Compare floats: value1 < value2 + *
        Stack: ..., value1, value2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FCMPL extends Instruction + implements TypedInstruction, StackProducer, StackConsumer { + public FCMPL() { + super(org.apache.bcel.Constants.FCMPL, (short)1); + } + + /** @return Type.FLOAT + */ + public Type getType(ConstantPoolGen cp) { + return Type.FLOAT; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitFCMPL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FCONST.java b/src/java/org/apache/bcel/generic/FCONST.java new file mode 100644 index 00000000..d90fa28f --- /dev/null +++ b/src/java/org/apache/bcel/generic/FCONST.java @@ -0,0 +1,114 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FCONST - Push 0.0, 1.0 or 2.0, other values cause an exception + * + *
        Stack: ... -> ..., 
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FCONST extends Instruction + implements ConstantPushInstruction, TypedInstruction { + private float value; + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + FCONST() {} + + public FCONST(float f) { + super(org.apache.bcel.Constants.FCONST_0, (short)1); + + if(f == 0.0) + opcode = org.apache.bcel.Constants.FCONST_0; + else if(f == 1.0) + opcode = org.apache.bcel.Constants.FCONST_1; + else if(f == 2.0) + opcode = org.apache.bcel.Constants.FCONST_2; + else + throw new ClassGenException("FCONST can be used only for 0.0, 1.0 and 2.0: " + f); + + value = f; + } + + public Number getValue() { return new Float(value); } + + /** @return Type.FLOAT + */ + public Type getType(ConstantPoolGen cp) { + return Type.FLOAT; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitPushInstruction(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitConstantPushInstruction(this); + v.visitFCONST(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FDIV.java b/src/java/org/apache/bcel/generic/FDIV.java new file mode 100644 index 00000000..105fe4ec --- /dev/null +++ b/src/java/org/apache/bcel/generic/FDIV.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FDIV - Divide floats + *
        Stack: ..., value1, value2 -> result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FDIV extends ArithmeticInstruction { + /** Divide floats + */ + public FDIV() { + super(org.apache.bcel.Constants.FDIV); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitFDIV(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FLOAD.java b/src/java/org/apache/bcel/generic/FLOAD.java new file mode 100644 index 00000000..ae54b051 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FLOAD.java @@ -0,0 +1,92 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FLOAD - Load float from local variable + *
        Stack ... -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FLOAD extends LoadInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + FLOAD() { + super(org.apache.bcel.Constants.FLOAD, org.apache.bcel.Constants.FLOAD_0); + } + + /** Load float from local variable + * @param n index of local variable + */ + public FLOAD(int n) { + super(org.apache.bcel.Constants.FLOAD, org.apache.bcel.Constants.FLOAD_0, n); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + super.accept(v); + v.visitFLOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FMUL.java b/src/java/org/apache/bcel/generic/FMUL.java new file mode 100644 index 00000000..5bd6ce99 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FMUL.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FMUL - Multiply floats + *
        Stack: ..., value1, value2 -> result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FMUL extends ArithmeticInstruction { + /** Multiply floats + */ + public FMUL() { + super(org.apache.bcel.Constants.FMUL); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitFMUL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FNEG.java b/src/java/org/apache/bcel/generic/FNEG.java new file mode 100644 index 00000000..7d7bb3d6 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FNEG.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FNEG - Negate float + *
        Stack: ..., value -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FNEG extends ArithmeticInstruction { + public FNEG() { + super(org.apache.bcel.Constants.FNEG); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitFNEG(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FREM.java b/src/java/org/apache/bcel/generic/FREM.java new file mode 100644 index 00000000..a4bc3aba --- /dev/null +++ b/src/java/org/apache/bcel/generic/FREM.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FREM - Remainder of floats + *
        Stack: ..., value1, value2 -> result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FREM extends ArithmeticInstruction { + /** Remainder of floats + */ + public FREM() { + super(org.apache.bcel.Constants.FREM); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitFREM(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FRETURN.java b/src/java/org/apache/bcel/generic/FRETURN.java new file mode 100644 index 00000000..c46f16d8 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FRETURN.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FRETURN - Return float from method + *
        Stack: ..., value -> <empty>
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FRETURN extends ReturnInstruction { + /** Return float from method + */ + public FRETURN() { + super(org.apache.bcel.Constants.FRETURN); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitReturnInstruction(this); + v.visitFRETURN(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FSTORE.java b/src/java/org/apache/bcel/generic/FSTORE.java new file mode 100644 index 00000000..6c93ae08 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FSTORE.java @@ -0,0 +1,92 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FSTORE - Store float into local variable + *
        Stack: ..., value -> ... 
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FSTORE extends StoreInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + FSTORE() { + super(org.apache.bcel.Constants.FSTORE, org.apache.bcel.Constants.FSTORE_0); + } + + /** Store float into local variable + * @param n index of local variable + */ + public FSTORE(int n) { + super(org.apache.bcel.Constants.FSTORE, org.apache.bcel.Constants.FSTORE_0, n); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + super.accept(v); + v.visitFSTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FSUB.java b/src/java/org/apache/bcel/generic/FSUB.java new file mode 100644 index 00000000..842ea1e6 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FSUB.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * FSUB - Substract floats + *
        Stack: ..., value1, value2 -> result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class FSUB extends ArithmeticInstruction { + /** Substract floats + */ + public FSUB() { + super(org.apache.bcel.Constants.FSUB); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitFSUB(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FieldGen.java b/src/java/org/apache/bcel/generic/FieldGen.java new file mode 100644 index 00000000..6f8114c5 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FieldGen.java @@ -0,0 +1,310 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.*; +import java.util.ArrayList; +import java.util.Iterator; + +/** + * Template class for building up a field. The only extraordinary thing + * one can do is to add a constant value attribute to a field (which must of + * course be compatible with to the declared type). + * + * @version $Id$ + * @author M. Dahm + * @see Field + */ +public class FieldGen extends FieldGenOrMethodGen { + private Object value = null; + + /** + * Declare a field. If it is static (isStatic() == true) and has a + * basic type like int or String it may have an initial value + * associated with it as defined by setInitValue(). + * + * @param access_flags access qualifiers + * @param type field type + * @param name field name + * @param cp constant pool + */ + public FieldGen(int access_flags, Type type, String name, ConstantPoolGen cp) { + setAccessFlags(access_flags); + setType(type); + setName(name); + setConstantPool(cp); + } + + /** + * Instantiate from existing field. + * + * @param field Field object + * @param cp constant pool (must contain the same entries as the field's constant pool) + */ + public FieldGen(Field field, ConstantPoolGen cp) { + this(field.getAccessFlags(), Type.getType(field.getSignature()), field.getName(), cp); + + Attribute[] attrs = field.getAttributes(); + + for(int i=0; i < attrs.length; i++) { + if(attrs[i] instanceof ConstantValue) + setValue(((ConstantValue)attrs[i]).getConstantValueIndex()); + else + addAttribute(attrs[i]); + } + } + + private void setValue(int index) { + ConstantPool cp = this.cp.getConstantPool(); + Constant c = cp.getConstant(index); + value = ((ConstantObject)c).getConstantValue(cp); + } + + /** + * Set (optional) initial value of field, otherwise it will be set to null/0/false + * by the JVM automatically. + */ + public void setInitValue(String str) { + checkType(new ObjectType("java.lang.String")); + + if(str != null) + value = str; + } + + public void setInitValue(long l) { + checkType(Type.LONG); + + if(l != 0L) + value = new Long(l); + } + + public void setInitValue(int i) { + checkType(Type.INT); + + if(i != 0) + value = new Integer(i); + } + + public void setInitValue(short s) { + checkType(Type.SHORT); + + if(s != 0) + value = new Integer(s); + } + + public void setInitValue(char c) { + checkType(Type.CHAR); + + if(c != 0) + value = new Integer(c); + } + + public void setInitValue(byte b) { + checkType(Type.BYTE); + + if(b != 0) + value = new Integer(b); + } + + public void setInitValue(boolean b) { + checkType(Type.BOOLEAN); + + if(b) + value = new Integer(1); + } + + public void setInitValue(float f) { + checkType(Type.FLOAT); + + if(f != 0.0) + value = new Float(f); + } + + public void setInitValue(double d) { + checkType(Type.DOUBLE); + + if(d != 0.0) + value = new Double(d); + } + + /** Remove any initial value. + */ + public void cancelInitValue() { + value = null; + } + + private void checkType(Type atype) { + if(type == null) + throw new ClassGenException("You haven't defined the type of the field yet"); + + if(!isFinal()) + throw new ClassGenException("Only final fields may have an initial value!"); + + if(!type.equals(atype)) + throw new ClassGenException("Types are not compatible: " + type + " vs. " + atype); + } + + /** + * Get field object after having set up all necessary values. + */ + public Field getField() { + String signature = getSignature(); + int name_index = cp.addUtf8(name); + int signature_index = cp.addUtf8(signature); + + if(value != null) { + checkType(type); + int index = addConstant(); + addAttribute(new ConstantValue(cp.addUtf8("ConstantValue"), + 2, index, cp.getConstantPool())); + } + + return new Field(access_flags, name_index, signature_index, getAttributes(), + cp.getConstantPool()); + } + + private int addConstant() { + switch(type.getType()) { + case Constants.T_INT: case Constants.T_CHAR: case Constants.T_BYTE: + case Constants.T_BOOLEAN: case Constants.T_SHORT: + return cp.addInteger(((Integer)value).intValue()); + + case Constants.T_FLOAT: + return cp.addFloat(((Float)value).floatValue()); + + case Constants.T_DOUBLE: + return cp.addDouble(((Double)value).doubleValue()); + + case Constants.T_LONG: + return cp.addLong(((Long)value).longValue()); + + case Constants.T_REFERENCE: + return cp.addString(((String)value)); + + default: + throw new RuntimeException("Oops: Unhandled : " + type.getType()); + } + } + + public String getSignature() { return type.getSignature(); } + + private ArrayList observers; + + /** Add observer for this object. + */ + public void addObserver(FieldObserver o) { + if(observers == null) + observers = new ArrayList(); + + observers.add(o); + } + + /** Remove observer for this object. + */ + public void removeObserver(FieldObserver o) { + if(observers != null) + observers.remove(o); + } + + /** Call notify() method on all observers. This method is not called + * automatically whenever the state has changed, but has to be + * called by the user after he has finished editing the object. + */ + public void update() { + if(observers != null) + for(Iterator e = observers.iterator(); e.hasNext(); ) + ((FieldObserver)e.next()).notify(this); + } + + public String getInitValue() { + if(value != null) { + return value.toString(); + } else + return null; + } + + /** + * Return string representation close to declaration format, + * `public static final short MAX = 100', e.g.. + * + * @return String representation of field + */ + public final String toString() { + String name, signature, access; // Short cuts to constant pool + + access = Utility.accessToString(access_flags); + access = access.equals("")? "" : (access + " "); + signature = type.toString(); + name = getName(); + + StringBuffer buf = new StringBuffer(access + signature + " " + name); + String value = getInitValue(); + + if(value != null) + buf.append(" = " + value); + + return buf.toString(); + } + + /** @return deep copy of this field + */ + public FieldGen copy(ConstantPoolGen cp) { + FieldGen fg = (FieldGen)clone(); + + fg.setConstantPool(cp); + return fg; + } +} diff --git a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java new file mode 100644 index 00000000..08ef516b --- /dev/null +++ b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -0,0 +1,129 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.classfile.*; +import java.util.ArrayList; + +/** + * Super class for FieldGen and MethodGen objects, since they have + * some methods in common! + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class FieldGenOrMethodGen extends AccessFlags + implements NamedAndTyped, Cloneable +{ + protected String name; + protected Type type; + protected ConstantPoolGen cp; + private ArrayList attribute_vec = new ArrayList(); + + protected FieldGenOrMethodGen() {} + + public void setType(Type type) { this.type = type; } + public Type getType() { return type; } + + /** @return name of method/field. + */ + public String getName() { return name; } + public void setName(String name) { this.name = name; } + + public ConstantPoolGen getConstantPool() { return cp; } + public void setConstantPool(ConstantPoolGen cp) { this.cp = cp; } + + /** + * Add an attribute to this method. Currently, the JVM knows about + * the `Code', `ConstantValue', `Synthetic' and `Exceptions' + * attributes. Other attributes will be ignored by the JVM but do no + * harm. + * + * @param a attribute to be added + */ + public void addAttribute(Attribute a) { attribute_vec.add(a); } + + /** + * Remove an attribute. + */ + public void removeAttribute(Attribute a) { attribute_vec.remove(a); } + + /** + * Remove all attributes. + */ + public void removeAttributes() { attribute_vec.clear(); } + + /** + * @return all attributes of this method. + */ + public Attribute[] getAttributes() { + Attribute[] attributes = new Attribute[attribute_vec.size()]; + attribute_vec.toArray(attributes); + return attributes; + } + + /** @return signature of method/field. + */ + public abstract String getSignature(); + + public Object clone() { + try { + return super.clone(); + } catch(CloneNotSupportedException e) { + System.err.println(e); + return null; + } + } +} diff --git a/src/java/org/apache/bcel/generic/FieldInstruction.java b/src/java/org/apache/bcel/generic/FieldInstruction.java new file mode 100644 index 00000000..028ed5cf --- /dev/null +++ b/src/java/org/apache/bcel/generic/FieldInstruction.java @@ -0,0 +1,116 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantCP; +import org.apache.bcel.classfile.*; + +/** + * Super class for the GET/PUTxxx family of instructions. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class FieldInstruction extends FieldOrMethod + implements TypedInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + FieldInstruction() {} + + /** + * @param index to constant pool + */ + protected FieldInstruction(short opcode, int index) { + super(opcode, index); + } + + /** + * @return mnemonic for instruction with symbolic references resolved + */ + public String toString(ConstantPool cp) { + return org.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " + + cp.constantToString(index, org.apache.bcel.Constants.CONSTANT_Fieldref); + } + + /** @return size of field (1 or 2) + */ + protected int getFieldSize(ConstantPoolGen cpg) { + return getType(cpg).getSize(); + } + + /** @return return type of referenced field + */ + public Type getType(ConstantPoolGen cpg) { + return getFieldType(cpg); + } + + /** @return type of field + */ + public Type getFieldType(ConstantPoolGen cpg) { + return Type.getType(getSignature(cpg)); + } + + /** @return name of referenced field. + */ + public String getFieldName(ConstantPoolGen cpg) { + return getName(cpg); + } +} + diff --git a/src/java/org/apache/bcel/generic/FieldObserver.java b/src/java/org/apache/bcel/generic/FieldObserver.java new file mode 100644 index 00000000..e5593248 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FieldObserver.java @@ -0,0 +1,67 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Imnplement this interface if you're interested in changes to a FieldGen object + * and register yourself with addObserver(). + * + * @version $Id$ + * @author M. Dahm + */ +public interface FieldObserver { + public void notify(FieldGen field); +} + diff --git a/src/java/org/apache/bcel/generic/FieldOrMethod.java b/src/java/org/apache/bcel/generic/FieldOrMethod.java new file mode 100644 index 00000000..835ff380 --- /dev/null +++ b/src/java/org/apache/bcel/generic/FieldOrMethod.java @@ -0,0 +1,117 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.classfile.*; + +/** + * Super class for InvokeInstruction and FieldInstruction, since they have + * some methods in common! + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class FieldOrMethod extends CPInstruction implements LoadClass { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + FieldOrMethod() {} + + /** + * @param index to constant pool + */ + protected FieldOrMethod(short opcode, int index) { + super(opcode, index); + } + + /** @return signature of referenced method/field. + */ + public String getSignature(ConstantPoolGen cpg) { + ConstantPool cp = cpg.getConstantPool(); + ConstantCP cmr = (ConstantCP)cp.getConstant(index); + ConstantNameAndType cnat = (ConstantNameAndType)cp.getConstant(cmr.getNameAndTypeIndex()); + + return ((ConstantUtf8)cp.getConstant(cnat.getSignatureIndex())).getBytes(); + } + + /** @return name of referenced method/field. + */ + public String getName(ConstantPoolGen cpg) { + ConstantPool cp = cpg.getConstantPool(); + ConstantCP cmr = (ConstantCP)cp.getConstant(index); + ConstantNameAndType cnat = (ConstantNameAndType)cp.getConstant(cmr.getNameAndTypeIndex()); + return ((ConstantUtf8)cp.getConstant(cnat.getNameIndex())).getBytes(); + } + + /** @return name of the referenced class/interface + */ + public String getClassName(ConstantPoolGen cpg) { + ConstantPool cp = cpg.getConstantPool(); + ConstantCP cmr = (ConstantCP)cp.getConstant(index); + return cp.getConstantString(cmr.getClassIndex(), org.apache.bcel.Constants.CONSTANT_Class).replace('/', '.'); + } + + /** @return type of the referenced class/interface + */ + public ObjectType getClassType(ConstantPoolGen cpg) { + return new ObjectType(getClassName(cpg)); + } + + /** @return type of the referenced class/interface + */ + public ObjectType getLoadClassType(ConstantPoolGen cpg) { + return getClassType(cpg); + } +} diff --git a/src/java/org/apache/bcel/generic/GETFIELD.java b/src/java/org/apache/bcel/generic/GETFIELD.java new file mode 100644 index 00000000..c6ec284a --- /dev/null +++ b/src/java/org/apache/bcel/generic/GETFIELD.java @@ -0,0 +1,117 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.ExceptionConstants; + +/** + * GETFIELD - Fetch field from object + *
        Stack: ..., objectref -> ..., value
        + * OR + *
        Stack: ..., objectref -> ..., value.word1, value.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class GETFIELD extends FieldInstruction + implements ExceptionThrower, StackConsumer, StackProducer { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + GETFIELD() {} + + public GETFIELD(int index) { + super(Constants.GETFIELD, index); + } + + public int produceStack(ConstantPoolGen cpg) { return getFieldSize(cpg); } + + public Class[] getExceptions() { + Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, + cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+1] = + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = + ExceptionConstants.NULL_POINTER_EXCEPTION; + + return cs; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitFieldInstruction(this); + v.visitGETFIELD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/GETSTATIC.java b/src/java/org/apache/bcel/generic/GETSTATIC.java new file mode 100644 index 00000000..c7a783c3 --- /dev/null +++ b/src/java/org/apache/bcel/generic/GETSTATIC.java @@ -0,0 +1,113 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.ExceptionConstants; + +/** + * GETSTATIC - Fetch static field from class + *
        Stack: ..., -> ..., value
        + * OR + *
        Stack: ..., -> ..., value.word1, value.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class GETSTATIC extends FieldInstruction implements PushInstruction, ExceptionThrower { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + GETSTATIC() {} + + public GETSTATIC(int index) { + super(Constants.GETSTATIC, index); + } + + public int produceStack(ConstantPoolGen cpg) { return getFieldSize(cpg); } + + public Class[] getExceptions() { + Class[] cs = new Class[1 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, + cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + + return cs; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitFieldInstruction(this); + v.visitGETSTATIC(this); + } +} diff --git a/src/java/org/apache/bcel/generic/GOTO.java b/src/java/org/apache/bcel/generic/GOTO.java new file mode 100644 index 00000000..f77c84ea --- /dev/null +++ b/src/java/org/apache/bcel/generic/GOTO.java @@ -0,0 +1,122 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; + +/** + * GOTO - Branch always (to relative offset, not absolute address) + * + * @version $Id$ + * @author M. Dahm + */ +public class GOTO extends GotoInstruction implements VariableLengthInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + GOTO() {} + + public GOTO(InstructionHandle target) { + super(org.apache.bcel.Constants.GOTO, target); + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + index = getTargetOffset(); + if(opcode == org.apache.bcel.Constants.GOTO) + super.dump(out); + else { // GOTO_W + index = getTargetOffset(); + out.writeByte(opcode); + out.writeInt(index); + } + } + + /** Called in pass 2 of InstructionList.setPositions() in order to update + * the branch target, that may shift due to variable length instructions. + */ + protected int updatePosition(int offset, int max_offset) { + int i = getTargetOffset(); // Depending on old position value + + position += offset; // Position may be shifted by preceding expansions + + if(Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) + opcode = org.apache.bcel.Constants.GOTO_W; + length = 5; + return 2; // 5 - 3 + } + + return 0; + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitVariableLengthInstruction(this); + v.visitUnconditionalBranch(this); + v.visitBranchInstruction(this); + v.visitGotoInstruction(this); + v.visitGOTO(this); + } +} diff --git a/src/java/org/apache/bcel/generic/GOTO_W.java b/src/java/org/apache/bcel/generic/GOTO_W.java new file mode 100644 index 00000000..93a867b4 --- /dev/null +++ b/src/java/org/apache/bcel/generic/GOTO_W.java @@ -0,0 +1,110 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * GOTO_W - Branch always (to relative offset, not absolute address) + * + * @version $Id$ + * @author M. Dahm + */ +public class GOTO_W extends GotoInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + GOTO_W() {} + + public GOTO_W(InstructionHandle target) { + super(org.apache.bcel.Constants.GOTO_W, target); + length = 5; + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + index = getTargetOffset(); + out.writeByte(opcode); + out.writeInt(index); + } + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException + { + index = bytes.readInt(); + length = 5; + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitUnconditionalBranch(this); + v.visitBranchInstruction(this); + v.visitGotoInstruction(this); + v.visitGOTO_W(this); + } +} diff --git a/src/java/org/apache/bcel/generic/GotoInstruction.java b/src/java/org/apache/bcel/generic/GotoInstruction.java new file mode 100644 index 00000000..3d768be1 --- /dev/null +++ b/src/java/org/apache/bcel/generic/GotoInstruction.java @@ -0,0 +1,75 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Super class for GOTO + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class GotoInstruction extends BranchInstruction + implements UnconditionalBranch +{ + GotoInstruction(short opcode, InstructionHandle target) { + super(opcode, target); + } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + GotoInstruction(){} +} diff --git a/src/java/org/apache/bcel/generic/I2B.java b/src/java/org/apache/bcel/generic/I2B.java new file mode 100644 index 00000000..9eddff96 --- /dev/null +++ b/src/java/org/apache/bcel/generic/I2B.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * I2B - Convert int to byte + *
        Stack: ..., value -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class I2B extends ConversionInstruction { + /** Convert int to byte + */ + public I2B() { + super(org.apache.bcel.Constants.I2B); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitI2B(this); + } +} diff --git a/src/java/org/apache/bcel/generic/I2C.java b/src/java/org/apache/bcel/generic/I2C.java new file mode 100644 index 00000000..9d7c36df --- /dev/null +++ b/src/java/org/apache/bcel/generic/I2C.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * I2C - Convert int to char + *
        Stack: ..., value -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class I2C extends ConversionInstruction { + /** Convert int to char + */ + public I2C() { + super(org.apache.bcel.Constants.I2C); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitI2C(this); + } +} diff --git a/src/java/org/apache/bcel/generic/I2D.java b/src/java/org/apache/bcel/generic/I2D.java new file mode 100644 index 00000000..c5148551 --- /dev/null +++ b/src/java/org/apache/bcel/generic/I2D.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * I2D - Convert int to double + *
        Stack: ..., value -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class I2D extends ConversionInstruction { + /** Convert int to double + */ + public I2D() { + super(org.apache.bcel.Constants.I2D); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitI2D(this); + } +} diff --git a/src/java/org/apache/bcel/generic/I2F.java b/src/java/org/apache/bcel/generic/I2F.java new file mode 100644 index 00000000..570bf390 --- /dev/null +++ b/src/java/org/apache/bcel/generic/I2F.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * I2F - Convert int to float + *
        Stack: ..., value -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class I2F extends ConversionInstruction { + /** Convert int to float + */ + public I2F() { + super(org.apache.bcel.Constants.I2F); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitI2F(this); + } +} diff --git a/src/java/org/apache/bcel/generic/I2L.java b/src/java/org/apache/bcel/generic/I2L.java new file mode 100644 index 00000000..d5d02971 --- /dev/null +++ b/src/java/org/apache/bcel/generic/I2L.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * I2L - Convert int to long + *
        Stack: ..., value -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class I2L extends ConversionInstruction { + /** Convert int to long + */ + public I2L() { + super(org.apache.bcel.Constants.I2L); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitI2L(this); + } +} diff --git a/src/java/org/apache/bcel/generic/I2S.java b/src/java/org/apache/bcel/generic/I2S.java new file mode 100644 index 00000000..8ab5ff13 --- /dev/null +++ b/src/java/org/apache/bcel/generic/I2S.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * I2S - Convert int to short + *
        Stack: ..., value -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class I2S extends ConversionInstruction { + public I2S() { + super(org.apache.bcel.Constants.I2S); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitI2S(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IADD.java b/src/java/org/apache/bcel/generic/IADD.java new file mode 100644 index 00000000..74b04958 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IADD.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IADD - Add ints + *
        Stack: ..., value1, value2 -> result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IADD extends ArithmeticInstruction { + /** Add ints + */ + public IADD() { + super(org.apache.bcel.Constants.IADD); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIADD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IALOAD.java b/src/java/org/apache/bcel/generic/IALOAD.java new file mode 100644 index 00000000..33936b63 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IALOAD.java @@ -0,0 +1,88 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IALOAD - Load int from array + *
        Stack: ..., arrayref, index -> ..., value
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IALOAD extends ArrayInstruction implements StackProducer { + /** + * Load int from array + */ + public IALOAD() { + super(org.apache.bcel.Constants.IALOAD); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitIALOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IAND.java b/src/java/org/apache/bcel/generic/IAND.java new file mode 100644 index 00000000..ef5b0cab --- /dev/null +++ b/src/java/org/apache/bcel/generic/IAND.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IAND - Bitwise AND int + *
        Stack: ..., value1, value2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IAND extends ArithmeticInstruction { + public IAND() { + super(org.apache.bcel.Constants.IAND); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIAND(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IASTORE.java b/src/java/org/apache/bcel/generic/IASTORE.java new file mode 100644 index 00000000..2b0a24b4 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IASTORE.java @@ -0,0 +1,88 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IASTORE - Store into int array + *
        Stack: ..., arrayref, index, value -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IASTORE extends ArrayInstruction implements StackConsumer { + /** + * Store into int array + */ + public IASTORE() { + super(org.apache.bcel.Constants.IASTORE); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitIASTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ICONST.java b/src/java/org/apache/bcel/generic/ICONST.java new file mode 100644 index 00000000..39e08329 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ICONST.java @@ -0,0 +1,110 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * ICONST - Push value between -1, ..., 5, other values cause an exception + * + *
        Stack: ... -> ..., 
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ICONST extends Instruction + implements ConstantPushInstruction, TypedInstruction { + private int value; + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ICONST() {} + + public ICONST(int i) { + super(org.apache.bcel.Constants.ICONST_0, (short)1); + + if((i >= -1) && (i <= 5)) + opcode = (short)(org.apache.bcel.Constants.ICONST_0 + i); // Even works for i == -1 + else + throw new ClassGenException("ICONST can be used only for value between -1 and 5: " + + i); + value = i; + } + + public Number getValue() { return new Integer(value); } + + /** @return Type.INT + */ + public Type getType(ConstantPoolGen cp) { + return Type.INT; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitPushInstruction(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitConstantPushInstruction(this); + v.visitICONST(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IDIV.java b/src/java/org/apache/bcel/generic/IDIV.java new file mode 100644 index 00000000..60453df9 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IDIV.java @@ -0,0 +1,94 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IDIV - Divide ints + *
        Stack: ..., value1, value2 -> result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IDIV extends ArithmeticInstruction implements ExceptionThrower { + /** Divide ints + */ + public IDIV() { + super(org.apache.bcel.Constants.IDIV); + } + + /** @return exceptions this instruction may cause + */ + public Class[] getExceptions() { + return new Class[] { org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION }; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIDIV(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IFEQ.java b/src/java/org/apache/bcel/generic/IFEQ.java new file mode 100644 index 00000000..f9b6cb52 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IFEQ.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IFEQ - Branch if int comparison with zero succeeds + * + *
        Stack: ..., value -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IFEQ extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFEQ() {} + + public IFEQ(InstructionHandle target) { + super(org.apache.bcel.Constants.IFEQ, target); + } + + /** + * @return negation of instruction, e.g. IFEQ.negate() == IFNE + */ + public IfInstruction negate() { + return new IFNE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFEQ(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IFGE.java b/src/java/org/apache/bcel/generic/IFGE.java new file mode 100644 index 00000000..c7b1ff44 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IFGE.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IFGE - Branch if int comparison with zero succeeds + * + *
        Stack: ..., value -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IFGE extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFGE() {} + + public IFGE(InstructionHandle target) { + super(org.apache.bcel.Constants.IFGE, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFLT(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFGE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IFGT.java b/src/java/org/apache/bcel/generic/IFGT.java new file mode 100644 index 00000000..0d0a5ad3 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IFGT.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IFGT - Branch if int comparison with zero succeeds + * + *
        Stack: ..., value -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IFGT extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFGT() {} + + public IFGT(InstructionHandle target) { + super(org.apache.bcel.Constants.IFGT, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFLE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFGT(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IFLE.java b/src/java/org/apache/bcel/generic/IFLE.java new file mode 100644 index 00000000..0a75215d --- /dev/null +++ b/src/java/org/apache/bcel/generic/IFLE.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IFLE - Branch if int comparison with zero succeeds + * + *
        Stack: ..., value -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IFLE extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFLE() {} + + public IFLE(InstructionHandle target) { + super(org.apache.bcel.Constants.IFLE, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFGT(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFLE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IFLT.java b/src/java/org/apache/bcel/generic/IFLT.java new file mode 100644 index 00000000..a316ee30 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IFLT.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IFLT - Branch if int comparison with zero succeeds + * + *
        Stack: ..., value -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IFLT extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFLT() {} + + public IFLT(InstructionHandle target) { + super(org.apache.bcel.Constants.IFLT, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFGE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFLT(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IFNE.java b/src/java/org/apache/bcel/generic/IFNE.java new file mode 100644 index 00000000..47ed4248 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IFNE.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IFNE - Branch if int comparison with zero succeeds + * + *
        Stack: ..., value -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IFNE extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFNE() {} + + public IFNE(InstructionHandle target) { + super(org.apache.bcel.Constants.IFNE, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFEQ(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFNE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IFNONNULL.java b/src/java/org/apache/bcel/generic/IFNONNULL.java new file mode 100644 index 00000000..75a80d6a --- /dev/null +++ b/src/java/org/apache/bcel/generic/IFNONNULL.java @@ -0,0 +1,97 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IFNONNULL - Branch if reference is not null + * + *
        Stack: ..., reference -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IFNONNULL extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFNONNULL() {} + + public IFNONNULL(InstructionHandle target) { + super(org.apache.bcel.Constants.IFNONNULL, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFNULL(target); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFNONNULL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IFNULL.java b/src/java/org/apache/bcel/generic/IFNULL.java new file mode 100644 index 00000000..3e1346b7 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IFNULL.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IFNULL - Branch if reference is not null + * + *
        Stack: ..., reference -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IFNULL extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFNULL() {} + + public IFNULL(InstructionHandle target) { + super(org.apache.bcel.Constants.IFNULL, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFNONNULL(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFNULL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IF_ACMPEQ.java b/src/java/org/apache/bcel/generic/IF_ACMPEQ.java new file mode 100644 index 00000000..d8560fb2 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IF_ACMPEQ.java @@ -0,0 +1,97 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IF_ACMPEQ - Branch if reference comparison succeeds + * + *
        Stack: ..., value1, value2 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IF_ACMPEQ extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ACMPEQ() {} + + public IF_ACMPEQ(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ACMPEQ, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ACMPNE(target); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ACMPEQ(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IF_ACMPNE.java b/src/java/org/apache/bcel/generic/IF_ACMPNE.java new file mode 100644 index 00000000..89cd7f54 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IF_ACMPNE.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IF_ACMPNE - Branch if reference comparison doesn't succeed + * + *
        Stack: ..., value1, value2 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IF_ACMPNE extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ACMPNE() {} + + public IF_ACMPNE(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ACMPNE, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ACMPEQ(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ACMPNE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IF_ICMPEQ.java b/src/java/org/apache/bcel/generic/IF_ICMPEQ.java new file mode 100644 index 00000000..c84f244f --- /dev/null +++ b/src/java/org/apache/bcel/generic/IF_ICMPEQ.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IF_ICMPEQ - Branch if int comparison succeeds + * + *
        Stack: ..., value1, value2 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IF_ICMPEQ extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ICMPEQ() {} + + public IF_ICMPEQ(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ICMPEQ, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ICMPNE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ICMPEQ(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IF_ICMPGE.java b/src/java/org/apache/bcel/generic/IF_ICMPGE.java new file mode 100644 index 00000000..354bed13 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IF_ICMPGE.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IF_ICMPGE - Branch if int comparison succeeds + * + *
        Stack: ..., value1, value2 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IF_ICMPGE extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ICMPGE() {} + + public IF_ICMPGE(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ICMPGE, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ICMPLT(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ICMPGE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IF_ICMPGT.java b/src/java/org/apache/bcel/generic/IF_ICMPGT.java new file mode 100644 index 00000000..86519ceb --- /dev/null +++ b/src/java/org/apache/bcel/generic/IF_ICMPGT.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IF_ICMPGT - Branch if int comparison succeeds + * + *
        Stack: ..., value1, value2 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IF_ICMPGT extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ICMPGT() {} + + public IF_ICMPGT(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ICMPGT, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ICMPLE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ICMPGT(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IF_ICMPLE.java b/src/java/org/apache/bcel/generic/IF_ICMPLE.java new file mode 100644 index 00000000..d7de2c8e --- /dev/null +++ b/src/java/org/apache/bcel/generic/IF_ICMPLE.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IF_ICMPLE - Branch if int comparison succeeds + * + *
        Stack: ..., value1, value2 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IF_ICMPLE extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ICMPLE() {} + + public IF_ICMPLE(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ICMPLE, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ICMPGT(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ICMPLE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IF_ICMPLT.java b/src/java/org/apache/bcel/generic/IF_ICMPLT.java new file mode 100644 index 00000000..0bb03b4e --- /dev/null +++ b/src/java/org/apache/bcel/generic/IF_ICMPLT.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IF_ICMPLT - Branch if int comparison succeeds + * + *
        Stack: ..., value1, value2 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IF_ICMPLT extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ICMPLT() {} + + public IF_ICMPLT(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ICMPLT, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ICMPGE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ICMPLT(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IF_ICMPNE.java b/src/java/org/apache/bcel/generic/IF_ICMPNE.java new file mode 100644 index 00000000..409e841c --- /dev/null +++ b/src/java/org/apache/bcel/generic/IF_ICMPNE.java @@ -0,0 +1,98 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IF_ICMPNE - Branch if int comparison doesn't succeed + * + *
        Stack: ..., value1, value2 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IF_ICMPNE extends IfInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ICMPNE() {} + + public IF_ICMPNE(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ICMPNE, target); + } + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ICMPEQ(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ICMPNE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IINC.java b/src/java/org/apache/bcel/generic/IINC.java new file mode 100644 index 00000000..3eebbf90 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IINC.java @@ -0,0 +1,179 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * IINC - Increment local variable by constant + * + * @version $Id$ + * @author M. Dahm + */ +public class IINC extends LocalVariableInstruction { + private boolean wide; + private int c; + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IINC() {} + + public IINC(int n, int c) { + super(); // Default behaviour of LocalVariableInstruction causes error + + this.opcode = org.apache.bcel.Constants.IINC; + this.length = (short)3; + + setIndex(n); // May set wide as side effect + setIncrement(c); + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + if(wide) // Need WIDE prefix ? + out.writeByte(org.apache.bcel.Constants.WIDE); + + out.writeByte(opcode); + + if(wide) { + out.writeShort(n); + out.writeShort(c); + } else { + out.writeByte(n); + out.writeByte(c); + } + } + + private final void setWide() { + if(wide = ((n > org.apache.bcel.Constants.MAX_SHORT) || + (Math.abs(c) > Byte.MAX_VALUE))) + length = 6; // wide byte included + else + length = 3; + } + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException + { + this.wide = wide; + + if(wide) { + length = 6; + n = bytes.readUnsignedShort(); + c = bytes.readShort(); + } else { + length = 3; + n = bytes.readUnsignedByte(); + c = bytes.readByte(); + } + } + + /** + * @return mnemonic for instruction + */ + public String toString(boolean verbose) { + return super.toString(verbose) + " " + c; + } + + /** + * Set index of local variable. + */ + public final void setIndex(int n) { + if(n < 0) + throw new ClassGenException("Negative index value: " + n); + + this.n = n; + setWide(); + } + + /** + * @return increment factor + */ + public final int getIncrement() { return c; } + + /** + * Set increment factor. + */ + public final void setIncrement(int c) { + this.c = c; + setWide(); + } + + /** @return int type + */ + public Type getType(ConstantPoolGen cp) { + return Type.INT; + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitLocalVariableInstruction(this); + v.visitIINC(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ILOAD.java b/src/java/org/apache/bcel/generic/ILOAD.java new file mode 100644 index 00000000..320eb767 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ILOAD.java @@ -0,0 +1,92 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * ILOAD - Load int from local variable onto stack + *
        Stack: ... -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ILOAD extends LoadInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ILOAD() { + super(org.apache.bcel.Constants.ILOAD, org.apache.bcel.Constants.ILOAD_0); + } + + /** Load int from local variable + * @param n index of local variable + */ + public ILOAD(int n) { + super(org.apache.bcel.Constants.ILOAD, org.apache.bcel.Constants.ILOAD_0, n); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + super.accept(v); + v.visitILOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IMPDEP1.java b/src/java/org/apache/bcel/generic/IMPDEP1.java new file mode 100644 index 00000000..488eff09 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IMPDEP1.java @@ -0,0 +1,80 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IMPDEP1 - Implementation dependent + * + * @version $Id$ + * @author M. Dahm + */ +public class IMPDEP1 extends Instruction { + public IMPDEP1() { + super(org.apache.bcel.Constants.IMPDEP1, (short)1); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitIMPDEP1(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IMPDEP2.java b/src/java/org/apache/bcel/generic/IMPDEP2.java new file mode 100644 index 00000000..8663c9e9 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IMPDEP2.java @@ -0,0 +1,80 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IMPDEP2 - Implementation dependent + * + * @version $Id$ + * @author M. Dahm + */ +public class IMPDEP2 extends Instruction { + public IMPDEP2() { + super(org.apache.bcel.Constants.IMPDEP2, (short)1); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitIMPDEP2(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IMUL.java b/src/java/org/apache/bcel/generic/IMUL.java new file mode 100644 index 00000000..ef8d337e --- /dev/null +++ b/src/java/org/apache/bcel/generic/IMUL.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IMUL - Multiply ints + *
        Stack: ..., value1, value2 -> result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IMUL extends ArithmeticInstruction { + /** Multiply ints + */ + public IMUL() { + super(org.apache.bcel.Constants.IMUL); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIMUL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/INEG.java b/src/java/org/apache/bcel/generic/INEG.java new file mode 100644 index 00000000..83b0582c --- /dev/null +++ b/src/java/org/apache/bcel/generic/INEG.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * INEG - Negate int + *
        Stack: ..., value -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class INEG extends ArithmeticInstruction { + public INEG() { + super(org.apache.bcel.Constants.INEG); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitINEG(this); + } +} diff --git a/src/java/org/apache/bcel/generic/INSTANCEOF.java b/src/java/org/apache/bcel/generic/INSTANCEOF.java new file mode 100644 index 00000000..4d147c6c --- /dev/null +++ b/src/java/org/apache/bcel/generic/INSTANCEOF.java @@ -0,0 +1,106 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * INSTANCEOF - Determine if object is of given type + *
        Stack: ..., objectref -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class INSTANCEOF extends CPInstruction + implements LoadClass, ExceptionThrower, StackProducer, StackConsumer { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + INSTANCEOF() {} + + public INSTANCEOF(int index) { + super(org.apache.bcel.Constants.INSTANCEOF, index); + } + + public Class[] getExceptions() { + return org.apache.bcel.ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION; + } + + public ObjectType getLoadClassType(ConstantPoolGen cpg) { + Type t = getType(cpg); + + if(t instanceof ArrayType) + t = ((ArrayType) t).getBasicType(); + + return (t instanceof ObjectType)? (ObjectType) t : null; + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitLoadClass(this); + v.visitExceptionThrower(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitINSTANCEOF(this); + } +} diff --git a/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java new file mode 100644 index 00000000..f61eca00 --- /dev/null +++ b/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -0,0 +1,163 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.Constants; +import org.apache.bcel.ExceptionConstants; + +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * INVOKEINTERFACE - Invoke interface method + *
        Stack: ..., objectref, [arg1, [arg2 ...]] -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public final class INVOKEINTERFACE extends InvokeInstruction { + private int nargs; // Number of arguments on stack (number of stack slots), called "count" in vmspec2 + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + INVOKEINTERFACE() {} + + public INVOKEINTERFACE(int index, int nargs) { + super(Constants.INVOKEINTERFACE, index); + length = 5; + + if(nargs < 1) + throw new ClassGenException("Number of arguments must be > 0 " + nargs); + + this.nargs = nargs; + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + out.writeByte(opcode); + out.writeShort(index); + out.writeByte(nargs); + out.writeByte(0); + } + + /** + * The count argument according to the Java Language Specification, + * Second Edition. + */ + public int getCount() { return nargs; } + + /** + * Read needed data (i.e., index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) + throws IOException + { + super.initFromFile(bytes, wide); + + length = 5; + nargs = bytes.readUnsignedByte(); + bytes.readByte(); // Skip 0 byte + } + + /** + * @return mnemonic for instruction with symbolic references resolved + */ + public String toString(ConstantPool cp) { + return super.toString(cp) + " " + nargs; + } + + public int consumeStack(ConstantPoolGen cpg) { // nargs is given in byte-code + return nargs; // nargs includes this reference + } + + public Class[] getExceptions() { + Class[] cs = new Class[4 + ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length]; + + System.arraycopy(ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION, 0, + cs, 0, ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length); + + cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length+3] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length+2] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; + cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length+1] = ExceptionConstants.ABSTRACT_METHOD_ERROR; + cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length] = ExceptionConstants.UNSATISFIED_LINK_ERROR; + + return cs; + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitInvokeInstruction(this); + v.visitINVOKEINTERFACE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/java/org/apache/bcel/generic/INVOKESPECIAL.java new file mode 100644 index 00000000..a73d8fab --- /dev/null +++ b/src/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -0,0 +1,113 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +import org.apache.bcel.ExceptionConstants; + +/** + * INVOKESPECIAL - Invoke instance method; special handling for superclass, private + * and instance initialization method invocations + * + *
        Stack: ..., objectref, [arg1, [arg2 ...]] -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class INVOKESPECIAL extends InvokeInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + INVOKESPECIAL() {} + + public INVOKESPECIAL(int index) { + super(Constants.INVOKESPECIAL, index); + } + + public Class[] getExceptions() { + Class[] cs = new Class[4 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, + cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+3] = ExceptionConstants.UNSATISFIED_LINK_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+2] = ExceptionConstants.ABSTRACT_METHOD_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; + + return cs; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitInvokeInstruction(this); + v.visitINVOKESPECIAL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/java/org/apache/bcel/generic/INVOKESTATIC.java new file mode 100644 index 00000000..01abae76 --- /dev/null +++ b/src/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -0,0 +1,110 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +import org.apache.bcel.ExceptionConstants; + +/** + * INVOKESTATIC - Invoke a class (static) method + * + *
        Stack: ..., [arg1, [arg2 ...]] -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class INVOKESTATIC extends InvokeInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + INVOKESTATIC() {} + + public INVOKESTATIC(int index) { + super(Constants.INVOKESTATIC, index); + } + + public Class[] getExceptions() { + Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, + cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.UNSATISFIED_LINK_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + + return cs; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitInvokeInstruction(this); + v.visitINVOKESTATIC(this); + } +} diff --git a/src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java new file mode 100644 index 00000000..dd84d142 --- /dev/null +++ b/src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -0,0 +1,112 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +import org.apache.bcel.ExceptionConstants; + +/** + * INVOKEVIRTUAL - Invoke instance method; dispatch based on class + * + *
        Stack: ..., objectref, [arg1, [arg2 ...]] -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class INVOKEVIRTUAL extends InvokeInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + INVOKEVIRTUAL() {} + + public INVOKEVIRTUAL(int index) { + super(Constants.INVOKEVIRTUAL, index); + } + + public Class[] getExceptions() { + Class[] cs = new Class[4 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, + cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+3] = ExceptionConstants.UNSATISFIED_LINK_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+2] = ExceptionConstants.ABSTRACT_METHOD_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; + + return cs; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitInvokeInstruction(this); + v.visitINVOKEVIRTUAL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IOR.java b/src/java/org/apache/bcel/generic/IOR.java new file mode 100644 index 00000000..32b92110 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IOR.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IOR - Bitwise OR int + *
        Stack: ..., value1, value2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IOR extends ArithmeticInstruction { + public IOR() { + super(org.apache.bcel.Constants.IOR); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIOR(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IREM.java b/src/java/org/apache/bcel/generic/IREM.java new file mode 100644 index 00000000..27ec0f15 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IREM.java @@ -0,0 +1,94 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IREM - Remainder of int + *
        Stack: ..., value1, value2 -> result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IREM extends ArithmeticInstruction implements ExceptionThrower { + /** Remainder of ints + */ + public IREM() { + super(org.apache.bcel.Constants.IREM); + } + + /** @return exceptions this instruction may cause + */ + public Class[] getExceptions() { + return new Class[] { org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION }; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIREM(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IRETURN.java b/src/java/org/apache/bcel/generic/IRETURN.java new file mode 100644 index 00000000..db1d18bc --- /dev/null +++ b/src/java/org/apache/bcel/generic/IRETURN.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IRETURN - Return int from method + *
        Stack: ..., value -> <empty>
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IRETURN extends ReturnInstruction { + /** Return int from method + */ + public IRETURN() { + super(org.apache.bcel.Constants.IRETURN); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitReturnInstruction(this); + v.visitIRETURN(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ISHL.java b/src/java/org/apache/bcel/generic/ISHL.java new file mode 100644 index 00000000..998772bd --- /dev/null +++ b/src/java/org/apache/bcel/generic/ISHL.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * ISHL - Arithmetic shift left int + *
        Stack: ..., value1, value2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ISHL extends ArithmeticInstruction { + public ISHL() { + super(org.apache.bcel.Constants.ISHL); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitISHL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ISHR.java b/src/java/org/apache/bcel/generic/ISHR.java new file mode 100644 index 00000000..97919128 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ISHR.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * ISHR - Arithmetic shift right int + *
        Stack: ..., value1, value2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ISHR extends ArithmeticInstruction { + public ISHR() { + super(org.apache.bcel.Constants.ISHR); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitISHR(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ISTORE.java b/src/java/org/apache/bcel/generic/ISTORE.java new file mode 100644 index 00000000..efca2fc3 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ISTORE.java @@ -0,0 +1,92 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * ISTORE - Store int from stack into local variable + *
        Stack: ..., value -> ... 
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ISTORE extends StoreInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ISTORE() { + super(org.apache.bcel.Constants.ISTORE, org.apache.bcel.Constants.ISTORE_0); + } + + /** Store int into local variable + * @param n index of local variable + */ + public ISTORE(int n) { + super(org.apache.bcel.Constants.ISTORE, org.apache.bcel.Constants.ISTORE_0, n); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + super.accept(v); + v.visitISTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ISUB.java b/src/java/org/apache/bcel/generic/ISUB.java new file mode 100644 index 00000000..b0c8411f --- /dev/null +++ b/src/java/org/apache/bcel/generic/ISUB.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * ISUB - Substract ints + *
        Stack: ..., value1, value2 -> result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class ISUB extends ArithmeticInstruction { + /** Substract ints + */ + public ISUB() { + super(org.apache.bcel.Constants.ISUB); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitISUB(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IUSHR.java b/src/java/org/apache/bcel/generic/IUSHR.java new file mode 100644 index 00000000..c038cfda --- /dev/null +++ b/src/java/org/apache/bcel/generic/IUSHR.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IUSHR - Logical shift right int + *
        Stack: ..., value1, value2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class IUSHR extends ArithmeticInstruction { + public IUSHR() { + super(org.apache.bcel.Constants.IUSHR); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIUSHR(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IXOR.java b/src/java/org/apache/bcel/generic/IXOR.java new file mode 100644 index 00000000..acc44df9 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IXOR.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * IXOR - Bitwise XOR int + *
        Stack: ..., value1, value2 -> ..., result
        + * + * @version $Id$ + * @authXOR M. Dahm + */ +public class IXOR extends ArithmeticInstruction { + public IXOR() { + super(org.apache.bcel.Constants.IXOR); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIXOR(this); + } +} diff --git a/src/java/org/apache/bcel/generic/IfInstruction.java b/src/java/org/apache/bcel/generic/IfInstruction.java new file mode 100644 index 00000000..22217fe0 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IfInstruction.java @@ -0,0 +1,82 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Super class for the IFxxx family of instructions. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class IfInstruction extends BranchInstruction implements StackConsumer { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IfInstruction() {} + + /** + * @param instruction Target instruction to branch to + */ + protected IfInstruction(short opcode, InstructionHandle target) { + super(opcode, target); + } + + /** + * @return negation of instruction, e.g. IFEQ.negate() == IFNE + */ + public abstract IfInstruction negate(); +} + diff --git a/src/java/org/apache/bcel/generic/IndexedInstruction.java b/src/java/org/apache/bcel/generic/IndexedInstruction.java new file mode 100644 index 00000000..067e7089 --- /dev/null +++ b/src/java/org/apache/bcel/generic/IndexedInstruction.java @@ -0,0 +1,68 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denote entity that refers to an index, e.g. local variable instructions, + * RET, CPInstruction, etc. + * + * @version $Id$ + * @author M. Dahm + */ +public interface IndexedInstruction { + public int getIndex(); + public void setIndex(int index); +} + diff --git a/src/java/org/apache/bcel/generic/Instruction.java b/src/java/org/apache/bcel/generic/Instruction.java new file mode 100644 index 00000000..1dc84b8f --- /dev/null +++ b/src/java/org/apache/bcel/generic/Instruction.java @@ -0,0 +1,276 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.classfile.ConstantPool; +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * Abstract super class for all Java byte codes. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class Instruction implements Cloneable, Serializable { + protected short length = 1; // Length of instruction in bytes + protected short opcode = -1; // Opcode number + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + Instruction() {} + + public Instruction(short opcode, short length) { + this.length = length; + this.opcode = opcode; + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + out.writeByte(opcode); // Common for all instructions + } + + /** + * Long output format: + * + * <name of opcode> "["<opcode number>"]" + * "("<length of instruction>")" + * + * @param verbose long/short format switch + * @return mnemonic for instruction + */ + public String toString(boolean verbose) { + if(verbose) + return Constants.OPCODE_NAMES[opcode] + "[" + opcode + "](" + length + ")"; + else + return Constants.OPCODE_NAMES[opcode]; + } + + /** + * @return mnemonic for instruction in verbose format + */ + public String toString() { + return toString(true); + } + + /** + * @return mnemonic for instruction with sumbolic references resolved + */ + public String toString(ConstantPool cp) { + return toString(false); + } + + /** + * Use with caution, since `BranchInstruction's have a `target' reference which + * is not copied correctly (only basic types are). This also applies for + * `Select' instructions with their multiple branch targets. + * + * @see BranchInstruction + * @return (shallow) copy of an instruction + */ + public Instruction copy() { + Instruction i = null; + + // "Constant" instruction, no need to duplicate + if(InstructionConstants.INSTRUCTIONS[this.getOpcode()] != null) + i = this; + else { + try { + i = (Instruction)clone(); + } catch(CloneNotSupportedException e) { + System.err.println(e); + } + } + + return i; + } + + /** + * Read needed data (e.g. index) from file. + * + * @param bytes byte sequence to read from + * @param wide "wide" instruction flag + */ + protected void initFromFile(ByteSequence bytes, boolean wide) + throws IOException + {} + + /** + * Read an instruction from (byte code) input stream and return the + * appropiate object. + * + * @param file file to read from + * @return instruction object being read + */ + public static final Instruction readInstruction(ByteSequence bytes) + throws IOException + { + boolean wide = false; + short opcode = (short)bytes.readUnsignedByte(); + Instruction obj = null; + + if(opcode == Constants.WIDE) { // Read next opcode after wide byte + wide = true; + opcode = (short)bytes.readUnsignedByte(); + } + + if(InstructionConstants.INSTRUCTIONS[opcode] != null) + return InstructionConstants.INSTRUCTIONS[opcode]; // Used predefined immutable object, if available + + /* Find appropiate class, instantiate an (empty) instruction object + * and initialize it by hand. + */ + Class clazz; + try { + clazz = Class.forName(className(opcode)); + } + catch (ClassNotFoundException cnfe){ + // If a class by that name does not exist, the opcode is illegal. + // Note that IMPDEP1, IMPDEP2, BREAKPOINT are also illegal in a sense. + throw new ClassGenException("Illegal opcode detected."); + } + try { + obj = (Instruction)clazz.newInstance(); + + if(wide && !((obj instanceof LocalVariableInstruction) || (obj instanceof IINC) || + (obj instanceof RET))) + throw new Exception("Illegal opcode after wide: " + opcode); + + obj.setOpcode(opcode); + obj.initFromFile(bytes, wide); // Do further initializations, if any + // Byte code offset set in InstructionList + } catch(Exception e) { throw new ClassGenException(e.toString()); } + + return obj; + } + + private static final String className(short opcode) { + String name = Constants.OPCODE_NAMES[opcode].toUpperCase(); + + /* ICONST_0, etc. will be shortened to ICONST, etc., since ICONST_0 and the like + * are not implemented (directly). + */ + try { + int len = name.length(); + char ch1 = name.charAt(len - 2), ch2 = name.charAt(len - 1); + + if((ch1 == '_') && (ch2 >= '0') && (ch2 <= '5')) + name = name.substring(0, len - 2); + + if(name.equals("ICONST_M1")) // Special case + name = "ICONST"; + } catch(StringIndexOutOfBoundsException e) { System.err.println(e); } + + return "org.apache.bcel.generic." + name; + } + + /** + * This method also gives right results for instructions whose + * effect on the stack depends on the constant pool entry they + * reference. + * @return Number of words consumed from stack by this instruction, + * or Constants.UNPREDICTABLE, if this can not be computed statically + */ + public int consumeStack(ConstantPoolGen cpg) { + return Constants.CONSUME_STACK[opcode]; + } + + /** + * This method also gives right results for instructions whose + * effect on the stack depends on the constant pool entry they + * reference. + * @return Number of words produced onto stack by this instruction, + * or Constants.UNPREDICTABLE, if this can not be computed statically + */ + public int produceStack(ConstantPoolGen cpg) { + return Constants.PRODUCE_STACK[opcode]; + } + + /** + * @return this instructions opcode + */ + public short getOpcode() { return opcode; } + + /** + * @return length (in bytes) of instruction + */ + public int getLength() { return length; } + + /** + * Needed in readInstruction. + */ + private void setOpcode(short opcode) { this.opcode = opcode; } + + /** Some instructions may be reused, so don't do anything by default. + */ + void dispose() { } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public abstract void accept(Visitor v); +} diff --git a/src/java/org/apache/bcel/generic/InstructionConstants.java b/src/java/org/apache/bcel/generic/InstructionConstants.java new file mode 100644 index 00000000..a4bfe225 --- /dev/null +++ b/src/java/org/apache/bcel/generic/InstructionConstants.java @@ -0,0 +1,326 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; + +/** + * This interface contains shareable instruction objects. + * + * In order to save memory you can use some instructions multiply, + * since they have an immutable state and are directly derived from + * Instruction. I.e. they have no instance fields that could be + * changed. Since some of these instructions like ICONST_0 occur + * very frequently this can save a lot of time and space. This + * feature is an adaptation of the FlyWeight design pattern, we + * just use an array instead of a factory. + * + * The Instructions can also accessed directly under their names, so + * it's possible to write il.append(Instruction.ICONST_0); + * + * @version $Id$ + * @author M. Dahm + */ +public interface InstructionConstants { + /** Predefined instruction objects + */ + public static final Instruction NOP = new NOP(); + public static final Instruction ACONST_NULL = new ACONST_NULL(); + public static final Instruction ICONST_M1 = new ICONST(-1); + public static final Instruction ICONST_0 = new ICONST(0); + public static final Instruction ICONST_1 = new ICONST(1); + public static final Instruction ICONST_2 = new ICONST(2); + public static final Instruction ICONST_3 = new ICONST(3); + public static final Instruction ICONST_4 = new ICONST(4); + public static final Instruction ICONST_5 = new ICONST(5); + public static final Instruction LCONST_0 = new LCONST(0); + public static final Instruction LCONST_1 = new LCONST(1); + public static final Instruction FCONST_0 = new FCONST(0); + public static final Instruction FCONST_1 = new FCONST(1); + public static final Instruction FCONST_2 = new FCONST(2); + public static final Instruction DCONST_0 = new DCONST(0); + public static final Instruction DCONST_1 = new DCONST(1); + public static final ArrayInstruction IALOAD = new IALOAD(); + public static final ArrayInstruction LALOAD = new LALOAD(); + public static final ArrayInstruction FALOAD = new FALOAD(); + public static final ArrayInstruction DALOAD = new DALOAD(); + public static final ArrayInstruction AALOAD = new AALOAD(); + public static final ArrayInstruction BALOAD = new BALOAD(); + public static final ArrayInstruction CALOAD = new CALOAD(); + public static final ArrayInstruction SALOAD = new SALOAD(); + public static final ArrayInstruction IASTORE = new IASTORE(); + public static final ArrayInstruction LASTORE = new LASTORE(); + public static final ArrayInstruction FASTORE = new FASTORE(); + public static final ArrayInstruction DASTORE = new DASTORE(); + public static final ArrayInstruction AASTORE = new AASTORE(); + public static final ArrayInstruction BASTORE = new BASTORE(); + public static final ArrayInstruction CASTORE = new CASTORE(); + public static final ArrayInstruction SASTORE = new SASTORE(); + public static final StackInstruction POP = new POP(); + public static final StackInstruction POP2 = new POP2(); + public static final StackInstruction DUP = new DUP(); + public static final StackInstruction DUP_X1 = new DUP_X1(); + public static final StackInstruction DUP_X2 = new DUP_X2(); + public static final StackInstruction DUP2 = new DUP2(); + public static final StackInstruction DUP2_X1 = new DUP2_X1(); + public static final StackInstruction DUP2_X2 = new DUP2_X2(); + public static final StackInstruction SWAP = new SWAP(); + public static final ArithmeticInstruction IADD = new IADD(); + public static final ArithmeticInstruction LADD = new LADD(); + public static final ArithmeticInstruction FADD = new FADD(); + public static final ArithmeticInstruction DADD = new DADD(); + public static final ArithmeticInstruction ISUB = new ISUB(); + public static final ArithmeticInstruction LSUB = new LSUB(); + public static final ArithmeticInstruction FSUB = new FSUB(); + public static final ArithmeticInstruction DSUB = new DSUB(); + public static final ArithmeticInstruction IMUL = new IMUL(); + public static final ArithmeticInstruction LMUL = new LMUL(); + public static final ArithmeticInstruction FMUL = new FMUL(); + public static final ArithmeticInstruction DMUL = new DMUL(); + public static final ArithmeticInstruction IDIV = new IDIV(); + public static final ArithmeticInstruction LDIV = new LDIV(); + public static final ArithmeticInstruction FDIV = new FDIV(); + public static final ArithmeticInstruction DDIV = new DDIV(); + public static final ArithmeticInstruction IREM = new IREM(); + public static final ArithmeticInstruction LREM = new LREM(); + public static final ArithmeticInstruction FREM = new FREM(); + public static final ArithmeticInstruction DREM = new DREM(); + public static final ArithmeticInstruction INEG = new INEG(); + public static final ArithmeticInstruction LNEG = new LNEG(); + public static final ArithmeticInstruction FNEG = new FNEG(); + public static final ArithmeticInstruction DNEG = new DNEG(); + public static final ArithmeticInstruction ISHL = new ISHL(); + public static final ArithmeticInstruction LSHL = new LSHL(); + public static final ArithmeticInstruction ISHR = new ISHR(); + public static final ArithmeticInstruction LSHR = new LSHR(); + public static final ArithmeticInstruction IUSHR = new IUSHR(); + public static final ArithmeticInstruction LUSHR = new LUSHR(); + public static final ArithmeticInstruction IAND = new IAND(); + public static final ArithmeticInstruction LAND = new LAND(); + public static final ArithmeticInstruction IOR = new IOR(); + public static final ArithmeticInstruction LOR = new LOR(); + public static final ArithmeticInstruction IXOR = new IXOR(); + public static final ArithmeticInstruction LXOR = new LXOR(); + public static final ConversionInstruction I2L = new I2L(); + public static final ConversionInstruction I2F = new I2F(); + public static final ConversionInstruction I2D = new I2D(); + public static final ConversionInstruction L2I = new L2I(); + public static final ConversionInstruction L2F = new L2F(); + public static final ConversionInstruction L2D = new L2D(); + public static final ConversionInstruction F2I = new F2I(); + public static final ConversionInstruction F2L = new F2L(); + public static final ConversionInstruction F2D = new F2D(); + public static final ConversionInstruction D2I = new D2I(); + public static final ConversionInstruction D2L = new D2L(); + public static final ConversionInstruction D2F = new D2F(); + public static final ConversionInstruction I2B = new I2B(); + public static final ConversionInstruction I2C = new I2C(); + public static final ConversionInstruction I2S = new I2S(); + public static final Instruction LCMP = new LCMP(); + public static final Instruction FCMPL = new FCMPL(); + public static final Instruction FCMPG = new FCMPG(); + public static final Instruction DCMPL = new DCMPL(); + public static final Instruction DCMPG = new DCMPG(); + public static final ReturnInstruction IRETURN = new IRETURN(); + public static final ReturnInstruction LRETURN = new LRETURN(); + public static final ReturnInstruction FRETURN = new FRETURN(); + public static final ReturnInstruction DRETURN = new DRETURN(); + public static final ReturnInstruction ARETURN = new ARETURN(); + public static final ReturnInstruction RETURN = new RETURN(); + public static final Instruction ARRAYLENGTH = new ARRAYLENGTH(); + public static final Instruction ATHROW = new ATHROW(); + public static final Instruction MONITORENTER = new MONITORENTER(); + public static final Instruction MONITOREXIT = new MONITOREXIT(); + + /** You can use these constants in multiple places safely, if you can guarantee + * that you will never alter their internal values, e.g. call setIndex(). + */ + public static final LocalVariableInstruction THIS = new ALOAD(0); + public static final LocalVariableInstruction ALOAD_0 = THIS; + public static final LocalVariableInstruction ALOAD_1 = new ALOAD(1); + public static final LocalVariableInstruction ALOAD_2 = new ALOAD(2); + public static final LocalVariableInstruction ILOAD_0 = new ILOAD(0); + public static final LocalVariableInstruction ILOAD_1 = new ILOAD(1); + public static final LocalVariableInstruction ILOAD_2 = new ILOAD(2); + public static final LocalVariableInstruction ASTORE_0 = new ASTORE(0); + public static final LocalVariableInstruction ASTORE_1 = new ASTORE(1); + public static final LocalVariableInstruction ASTORE_2 = new ASTORE(2); + public static final LocalVariableInstruction ISTORE_0 = new ISTORE(0); + public static final LocalVariableInstruction ISTORE_1 = new ISTORE(1); + public static final LocalVariableInstruction ISTORE_2 = new ISTORE(2); + + + /** Get object via its opcode, for immutable instructions like + * branch instructions entries are set to null. + */ + public static final Instruction[] INSTRUCTIONS = new Instruction[256]; + + /** Interfaces may have no static initializers, so we simulate this + * with an inner class. + */ + static final Clinit bla = new Clinit(); + + static class Clinit { + Clinit() { + INSTRUCTIONS[Constants.NOP] = NOP; + INSTRUCTIONS[Constants.ACONST_NULL] = ACONST_NULL; + INSTRUCTIONS[Constants.ICONST_M1] = ICONST_M1; + INSTRUCTIONS[Constants.ICONST_0] = ICONST_0; + INSTRUCTIONS[Constants.ICONST_1] = ICONST_1; + INSTRUCTIONS[Constants.ICONST_2] = ICONST_2; + INSTRUCTIONS[Constants.ICONST_3] = ICONST_3; + INSTRUCTIONS[Constants.ICONST_4] = ICONST_4; + INSTRUCTIONS[Constants.ICONST_5] = ICONST_5; + INSTRUCTIONS[Constants.LCONST_0] = LCONST_0; + INSTRUCTIONS[Constants.LCONST_1] = LCONST_1; + INSTRUCTIONS[Constants.FCONST_0] = FCONST_0; + INSTRUCTIONS[Constants.FCONST_1] = FCONST_1; + INSTRUCTIONS[Constants.FCONST_2] = FCONST_2; + INSTRUCTIONS[Constants.DCONST_0] = DCONST_0; + INSTRUCTIONS[Constants.DCONST_1] = DCONST_1; + INSTRUCTIONS[Constants.IALOAD] = IALOAD; + INSTRUCTIONS[Constants.LALOAD] = LALOAD; + INSTRUCTIONS[Constants.FALOAD] = FALOAD; + INSTRUCTIONS[Constants.DALOAD] = DALOAD; + INSTRUCTIONS[Constants.AALOAD] = AALOAD; + INSTRUCTIONS[Constants.BALOAD] = BALOAD; + INSTRUCTIONS[Constants.CALOAD] = CALOAD; + INSTRUCTIONS[Constants.SALOAD] = SALOAD; + INSTRUCTIONS[Constants.IASTORE] = IASTORE; + INSTRUCTIONS[Constants.LASTORE] = LASTORE; + INSTRUCTIONS[Constants.FASTORE] = FASTORE; + INSTRUCTIONS[Constants.DASTORE] = DASTORE; + INSTRUCTIONS[Constants.AASTORE] = AASTORE; + INSTRUCTIONS[Constants.BASTORE] = BASTORE; + INSTRUCTIONS[Constants.CASTORE] = CASTORE; + INSTRUCTIONS[Constants.SASTORE] = SASTORE; + INSTRUCTIONS[Constants.POP] = POP; + INSTRUCTIONS[Constants.POP2] = POP2; + INSTRUCTIONS[Constants.DUP] = DUP; + INSTRUCTIONS[Constants.DUP_X1] = DUP_X1; + INSTRUCTIONS[Constants.DUP_X2] = DUP_X2; + INSTRUCTIONS[Constants.DUP2] = DUP2; + INSTRUCTIONS[Constants.DUP2_X1] = DUP2_X1; + INSTRUCTIONS[Constants.DUP2_X2] = DUP2_X2; + INSTRUCTIONS[Constants.SWAP] = SWAP; + INSTRUCTIONS[Constants.IADD] = IADD; + INSTRUCTIONS[Constants.LADD] = LADD; + INSTRUCTIONS[Constants.FADD] = FADD; + INSTRUCTIONS[Constants.DADD] = DADD; + INSTRUCTIONS[Constants.ISUB] = ISUB; + INSTRUCTIONS[Constants.LSUB] = LSUB; + INSTRUCTIONS[Constants.FSUB] = FSUB; + INSTRUCTIONS[Constants.DSUB] = DSUB; + INSTRUCTIONS[Constants.IMUL] = IMUL; + INSTRUCTIONS[Constants.LMUL] = LMUL; + INSTRUCTIONS[Constants.FMUL] = FMUL; + INSTRUCTIONS[Constants.DMUL] = DMUL; + INSTRUCTIONS[Constants.IDIV] = IDIV; + INSTRUCTIONS[Constants.LDIV] = LDIV; + INSTRUCTIONS[Constants.FDIV] = FDIV; + INSTRUCTIONS[Constants.DDIV] = DDIV; + INSTRUCTIONS[Constants.IREM] = IREM; + INSTRUCTIONS[Constants.LREM] = LREM; + INSTRUCTIONS[Constants.FREM] = FREM; + INSTRUCTIONS[Constants.DREM] = DREM; + INSTRUCTIONS[Constants.INEG] = INEG; + INSTRUCTIONS[Constants.LNEG] = LNEG; + INSTRUCTIONS[Constants.FNEG] = FNEG; + INSTRUCTIONS[Constants.DNEG] = DNEG; + INSTRUCTIONS[Constants.ISHL] = ISHL; + INSTRUCTIONS[Constants.LSHL] = LSHL; + INSTRUCTIONS[Constants.ISHR] = ISHR; + INSTRUCTIONS[Constants.LSHR] = LSHR; + INSTRUCTIONS[Constants.IUSHR] = IUSHR; + INSTRUCTIONS[Constants.LUSHR] = LUSHR; + INSTRUCTIONS[Constants.IAND] = IAND; + INSTRUCTIONS[Constants.LAND] = LAND; + INSTRUCTIONS[Constants.IOR] = IOR; + INSTRUCTIONS[Constants.LOR] = LOR; + INSTRUCTIONS[Constants.IXOR] = IXOR; + INSTRUCTIONS[Constants.LXOR] = LXOR; + INSTRUCTIONS[Constants.I2L] = I2L; + INSTRUCTIONS[Constants.I2F] = I2F; + INSTRUCTIONS[Constants.I2D] = I2D; + INSTRUCTIONS[Constants.L2I] = L2I; + INSTRUCTIONS[Constants.L2F] = L2F; + INSTRUCTIONS[Constants.L2D] = L2D; + INSTRUCTIONS[Constants.F2I] = F2I; + INSTRUCTIONS[Constants.F2L] = F2L; + INSTRUCTIONS[Constants.F2D] = F2D; + INSTRUCTIONS[Constants.D2I] = D2I; + INSTRUCTIONS[Constants.D2L] = D2L; + INSTRUCTIONS[Constants.D2F] = D2F; + INSTRUCTIONS[Constants.I2B] = I2B; + INSTRUCTIONS[Constants.I2C] = I2C; + INSTRUCTIONS[Constants.I2S] = I2S; + INSTRUCTIONS[Constants.LCMP] = LCMP; + INSTRUCTIONS[Constants.FCMPL] = FCMPL; + INSTRUCTIONS[Constants.FCMPG] = FCMPG; + INSTRUCTIONS[Constants.DCMPL] = DCMPL; + INSTRUCTIONS[Constants.DCMPG] = DCMPG; + INSTRUCTIONS[Constants.IRETURN] = IRETURN; + INSTRUCTIONS[Constants.LRETURN] = LRETURN; + INSTRUCTIONS[Constants.FRETURN] = FRETURN; + INSTRUCTIONS[Constants.DRETURN] = DRETURN; + INSTRUCTIONS[Constants.ARETURN] = ARETURN; + INSTRUCTIONS[Constants.RETURN] = RETURN; + INSTRUCTIONS[Constants.ARRAYLENGTH] = ARRAYLENGTH; + INSTRUCTIONS[Constants.ATHROW] = ATHROW; + INSTRUCTIONS[Constants.MONITORENTER] = MONITORENTER; + INSTRUCTIONS[Constants.MONITOREXIT] = MONITOREXIT; + } + } +} diff --git a/src/java/org/apache/bcel/generic/InstructionFactory.java b/src/java/org/apache/bcel/generic/InstructionFactory.java new file mode 100644 index 00000000..01b77695 --- /dev/null +++ b/src/java/org/apache/bcel/generic/InstructionFactory.java @@ -0,0 +1,593 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; + +/** + * Instances of this class may be used, e.g., to generate typed + * versions of instructions. Its main purpose is to be used as the + * byte code generating backend of a compiler. You can subclass it to + * add your own create methods. + * + * @version $Id$ + * @author M. Dahm + * @see Constants + */ +public class InstructionFactory implements InstructionConstants { + protected ClassGen cg; + protected ConstantPoolGen cp; + + public InstructionFactory(ClassGen cg, ConstantPoolGen cp) { + this.cg = cg; + this.cp = cp; + } + + /** Initialize with ClassGen object + */ + public InstructionFactory(ClassGen cg) { + this(cg, cg.getConstantPool()); + } + + /** Initialize just with ConstantPoolGen object + */ + public InstructionFactory(ConstantPoolGen cp) { + this(null, cp); + } + + /** Create an invoke instruction. + * + * @param class_name name of the called class + * @param name name of the called method + * @param ret_type return type of method + * @param arg_types argument types of method + * @param kind how to invoke, i.e., INVOKEINTERFACE, INVOKESTATIC, INVOKEVIRTUAL, + * or INVOKESPECIAL + * @see Constants + */ + public InvokeInstruction createInvoke(String class_name, String name, Type ret_type, + Type[] arg_types, short kind) { + int index; + int nargs = 0; + String signature = Type.getMethodSignature(ret_type, arg_types); + + for(int i=0; i < arg_types.length; i++) // Count size of arguments + nargs += arg_types[i].getSize(); + + if(kind == Constants.INVOKEINTERFACE) + index = cp.addInterfaceMethodref(class_name, name, signature); + else + index = cp.addMethodref(class_name, name, signature); + + switch(kind) { + case Constants.INVOKESPECIAL: return new INVOKESPECIAL(index); + case Constants.INVOKEVIRTUAL: return new INVOKEVIRTUAL(index); + case Constants.INVOKESTATIC: return new INVOKESTATIC(index); + case Constants.INVOKEINTERFACE: return new INVOKEINTERFACE(index, nargs + 1); + default: + throw new RuntimeException("Oops: Unknown invoke kind:" + kind); + } + } + + /** Create a call to the most popular System.out.println() method. + * + * @param s the string to print + */ + public InstructionList createPrintln(String s) { + InstructionList il = new InstructionList(); + int out = cp.addFieldref("java.lang.System", "out", + "Ljava/io/PrintStream;"); + int println = cp.addMethodref("java.io.PrintStream", "println", + "(Ljava/lang/String;)V"); + + il.append(new GETSTATIC(out)); + il.append(new PUSH(cp, s)); + il.append(new INVOKEVIRTUAL(println)); + + return il; + } + + private static class MethodObject { + Type[] arg_types; + Type result_type; + String[] arg_names; + String class_name; + String name; + int access; + + MethodObject(String c, String n, Type r, Type[] a, int acc) { + class_name = c; + name = n; + result_type = r; + arg_types = a; + access = acc; + } + } + + private InvokeInstruction createInvoke(MethodObject m, short kind) { + return createInvoke(m.class_name, m.name, m.result_type, m.arg_types, kind); + } + + private static MethodObject[] append_mos = { + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, + new Type[] { Type.STRING }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, + new Type[] { Type.OBJECT }, Constants.ACC_PUBLIC), + null, null, // indices 2, 3 + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, + new Type[] { Type.BOOLEAN }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, + new Type[] { Type.CHAR }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, + new Type[] { Type.FLOAT }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, + new Type[] { Type.DOUBLE }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, + new Type[] { Type.INT }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, // No append(byte) + new Type[] { Type.INT }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, // No append(short) + new Type[] { Type.INT }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, + new Type[] { Type.LONG }, Constants.ACC_PUBLIC) + }; + + private static final boolean isString(Type type) { + return ((type instanceof ObjectType) && + ((ObjectType)type).getClassName().equals("java.lang.String")); + } + + public Instruction createAppend(Type type) { + byte t = type.getType(); + + if(isString(type)) + return createInvoke(append_mos[0], Constants.INVOKEVIRTUAL); + + switch(t) { + case Constants.T_BOOLEAN: + case Constants.T_CHAR: + case Constants.T_FLOAT: + case Constants.T_DOUBLE: + case Constants.T_BYTE: + case Constants.T_SHORT: + case Constants.T_INT: + case Constants.T_LONG + : return createInvoke(append_mos[t], Constants.INVOKEVIRTUAL); + case Constants.T_ARRAY: + case Constants.T_OBJECT: + return createInvoke(append_mos[1], Constants.INVOKEVIRTUAL); + default: + throw new RuntimeException("Oops: No append for this type? " + type); + } + } + + /** Create a field instruction. + * + * @param class_name name of the accessed class + * @param name name of the referenced field + * @param type type of field + * @param kind how to access, i.e., GETFIELD, PUTFIELD, GETSTATIC, PUTSTATIC + * @see Constants + */ + public FieldInstruction createFieldAccess(String class_name, String name, Type type, short kind) { + int index; + String signature = type.getSignature(); + + index = cp.addFieldref(class_name, name, signature); + + switch(kind) { + case Constants.GETFIELD: return new GETFIELD(index); + case Constants.PUTFIELD: return new PUTFIELD(index); + case Constants.GETSTATIC: return new GETSTATIC(index); + case Constants.PUTSTATIC: return new PUTSTATIC(index); + + default: + throw new RuntimeException("Oops: Unknown getfield kind:" + kind); + } + } + + /** Create reference to `this' + */ + public static Instruction createThis() { + return new ALOAD(0); + } + + /** Create typed return + */ + public static ReturnInstruction createReturn(Type type) { + switch(type.getType()) { + case Constants.T_ARRAY: + case Constants.T_OBJECT: return ARETURN; + case Constants.T_INT: + case Constants.T_SHORT: + case Constants.T_BOOLEAN: + case Constants.T_CHAR: + case Constants.T_BYTE: return IRETURN; + case Constants.T_FLOAT: return FRETURN; + case Constants.T_DOUBLE: return DRETURN; + case Constants.T_LONG: return LRETURN; + case Constants.T_VOID: return RETURN; + + default: + throw new RuntimeException("Invalid type: " + type); + } + } + + private static final ArithmeticInstruction createBinaryIntOp(char first, String op) { + switch(first) { + case '-' : return ISUB; + case '+' : return IADD; + case '%' : return IREM; + case '*' : return IMUL; + case '/' : return IDIV; + case '&' : return IAND; + case '|' : return IOR; + case '^' : return IXOR; + case '<' : return ISHL; + case '>' : return op.equals(">>>")? (ArithmeticInstruction)IUSHR : + (ArithmeticInstruction)ISHR; + default: throw new RuntimeException("Invalid operand " + op); + } + } + + private static final ArithmeticInstruction createBinaryLongOp(char first, String op) { + switch(first) { + case '-' : return LSUB; + case '+' : return LADD; + case '%' : return LREM; + case '*' : return LMUL; + case '/' : return LDIV; + case '&' : return LAND; + case '|' : return LOR; + case '^' : return LXOR; + case '<' : return LSHL; + case '>' : return op.equals(">>>")? (ArithmeticInstruction)LUSHR : + (ArithmeticInstruction)LSHR; + default: throw new RuntimeException("Invalid operand " + op); + } + } + + private static final ArithmeticInstruction createBinaryFloatOp(char op) { + switch(op) { + case '-' : return FSUB; + case '+' : return FADD; + case '*' : return FMUL; + case '/' : return FDIV; + default: throw new RuntimeException("Invalid operand " + op); + } + } + + private static final ArithmeticInstruction createBinaryDoubleOp(char op) { + switch(op) { + case '-' : return DSUB; + case '+' : return DADD; + case '*' : return DMUL; + case '/' : return DDIV; + default: throw new RuntimeException("Invalid operand " + op); + } + } + + /** + * Create binary operation for simple basic types, such as int and float. + * + * @param op operation, such as "+", "*", "<<", etc. + */ + public static ArithmeticInstruction createBinaryOperation(String op, Type type) { + char first = op.toCharArray()[0]; + + switch(type.getType()) { + case Constants.T_BYTE: + case Constants.T_SHORT: + case Constants.T_INT: + case Constants.T_CHAR: return createBinaryIntOp(first, op); + case Constants.T_LONG: return createBinaryLongOp(first, op); + case Constants.T_FLOAT: return createBinaryFloatOp(first); + case Constants.T_DOUBLE: return createBinaryDoubleOp(first); + default: throw new RuntimeException("Invalid type " + type); + } + } + + /** + * @param size size of operand, either 1 (int, e.g.) or 2 (double) + */ + public static StackInstruction createPop(int size) { + return (size == 2)? (StackInstruction)POP2 : + (StackInstruction)POP; + } + + /** + * @param size size of operand, either 1 (int, e.g.) or 2 (double) + */ + public static StackInstruction createDup(int size) { + return (size == 2)? (StackInstruction)DUP2 : + (StackInstruction)DUP; + } + + /** + * @param size size of operand, either 1 (int, e.g.) or 2 (double) + */ + public static StackInstruction createDup_2(int size) { + return (size == 2)? (StackInstruction)DUP2_X2 : + (StackInstruction)DUP_X2; + } + + /** + * @param size size of operand, either 1 (int, e.g.) or 2 (double) + */ + public static StackInstruction createDup_1(int size) { + return (size == 2)? (StackInstruction)DUP2_X1 : + (StackInstruction)DUP_X1; + } + + /** + * @param index index of local variable + */ + public static LocalVariableInstruction createStore(Type type, int index) { + switch(type.getType()) { + case Constants.T_BOOLEAN: + case Constants.T_CHAR: + case Constants.T_BYTE: + case Constants.T_SHORT: + case Constants.T_INT: return new ISTORE(index); + case Constants.T_FLOAT: return new FSTORE(index); + case Constants.T_DOUBLE: return new DSTORE(index); + case Constants.T_LONG: return new LSTORE(index); + case Constants.T_ARRAY: + case Constants.T_OBJECT: return new ASTORE(index); + default: throw new RuntimeException("Invalid type " + type); + } + } + + /** + * @param index index of local variable + */ + public static LocalVariableInstruction createLoad(Type type, int index) { + switch(type.getType()) { + case Constants.T_BOOLEAN: + case Constants.T_CHAR: + case Constants.T_BYTE: + case Constants.T_SHORT: + case Constants.T_INT: return new ILOAD(index); + case Constants.T_FLOAT: return new FLOAD(index); + case Constants.T_DOUBLE: return new DLOAD(index); + case Constants.T_LONG: return new LLOAD(index); + case Constants.T_ARRAY: + case Constants.T_OBJECT: return new ALOAD(index); + default: throw new RuntimeException("Invalid type " + type); + } + } + + /** + * @param type type of elements of array, i.e., array.getElementType() + */ + public static ArrayInstruction createArrayLoad(Type type) { + switch(type.getType()) { + case Constants.T_BOOLEAN: + case Constants.T_BYTE: return BALOAD; + case Constants.T_CHAR: return CALOAD; + case Constants.T_SHORT: return SALOAD; + case Constants.T_INT: return IALOAD; + case Constants.T_FLOAT: return FALOAD; + case Constants.T_DOUBLE: return DALOAD; + case Constants.T_LONG: return LALOAD; + case Constants.T_ARRAY: + case Constants.T_OBJECT: return AALOAD; + default: throw new RuntimeException("Invalid type " + type); + } + } + + /** + * @param type type of elements of array, i.e., array.getElementType() + */ + public static ArrayInstruction createArrayStore(Type type) { + switch(type.getType()) { + case Constants.T_BOOLEAN: + case Constants.T_BYTE: return BASTORE; + case Constants.T_CHAR: return CASTORE; + case Constants.T_SHORT: return SASTORE; + case Constants.T_INT: return IASTORE; + case Constants.T_FLOAT: return FASTORE; + case Constants.T_DOUBLE: return DASTORE; + case Constants.T_LONG: return LASTORE; + case Constants.T_ARRAY: + case Constants.T_OBJECT: return AASTORE; + default: throw new RuntimeException("Invalid type " + type); + } + } + + + /** Create conversion operation for two stack operands, this may be an I2C, instruction, e.g., + * if the operands are basic types and CHECKCAST if they are reference types. + */ + public Instruction createCast(Type src_type, Type dest_type) { + if((src_type instanceof BasicType) && (dest_type instanceof BasicType)) { + byte dest = dest_type.getType(); + byte src = src_type.getType(); + + if(dest == Constants.T_LONG && (src == Constants.T_CHAR || src == Constants.T_BYTE || + src == Constants.T_SHORT)) + src = Constants.T_INT; + + String[] short_names = { "C", "F", "D", "B", "S", "I", "L" }; + + String name = "org.apache.bcel.generic." + short_names[src - Constants.T_CHAR] + + "2" + short_names[dest - Constants.T_CHAR]; + + Instruction i = null; + try { + i = (Instruction)java.lang.Class.forName(name).newInstance(); + } catch(Exception e) { + throw new RuntimeException("Could not find instruction: " + name); + } + + return i; + } else if((src_type instanceof ReferenceType) && (dest_type instanceof ReferenceType)) { + if(dest_type instanceof ArrayType) + return new CHECKCAST(cp.addArrayClass((ArrayType)dest_type)); + else + return new CHECKCAST(cp.addClass(((ObjectType)dest_type).getClassName())); + } + else + throw new RuntimeException("Can not cast " + src_type + " to " + dest_type); + } + + public GETFIELD createGetField(String class_name, String name, Type t) { + return new GETFIELD(cp.addFieldref(class_name, name, t.getSignature())); + } + + public GETSTATIC createGetStatic(String class_name, String name, Type t) { + return new GETSTATIC(cp.addFieldref(class_name, name, t.getSignature())); + } + + public PUTFIELD createPutField(String class_name, String name, Type t) { + return new PUTFIELD(cp.addFieldref(class_name, name, t.getSignature())); + } + + public PUTSTATIC createPutStatic(String class_name, String name, Type t) { + return new PUTSTATIC(cp.addFieldref(class_name, name, t.getSignature())); + } + + public CHECKCAST createCheckCast(ReferenceType t) { + if(t instanceof ArrayType) + return new CHECKCAST(cp.addArrayClass((ArrayType)t)); + else + return new CHECKCAST(cp.addClass((ObjectType)t)); + } + + public NEW createNew(ObjectType t) { + return new NEW(cp.addClass(t)); + } + + public NEW createNew(String s) { + return createNew(new ObjectType(s)); + } + + /** Create new array of given size and type. + */ + public AllocationInstruction createNewArray(Type t, short dim) { + if(dim == 1) { + if(t instanceof ObjectType) + return new ANEWARRAY(cp.addClass((ObjectType)t)); + else if(t instanceof ArrayType) + return new ANEWARRAY(cp.addArrayClass((ArrayType)t)); + else + return new NEWARRAY(((BasicType)t).getType()); + } else { + ArrayType at; + + if(t instanceof ArrayType) + at = (ArrayType)t; + else + at = new ArrayType(t, dim); + + return new MULTIANEWARRAY(cp.addArrayClass(at), dim); + } + } + + /** Create "null" value for reference types, 0 for basic types like int + */ + public static Instruction createNull(Type type) { + switch(type.getType()) { + case Constants.T_ARRAY: + case Constants.T_OBJECT: return ACONST_NULL; + case Constants.T_INT: + case Constants.T_SHORT: + case Constants.T_BOOLEAN: + case Constants.T_CHAR: + case Constants.T_BYTE: return ICONST_0; + case Constants.T_FLOAT: return FCONST_0; + case Constants.T_DOUBLE: return DCONST_0; + case Constants.T_LONG: return LCONST_0; + case Constants.T_VOID: return NOP; + + default: + throw new RuntimeException("Invalid type: " + type); + } + } + + /** Create branch instruction by given opcode, except LOOKUPSWITCH and TABLESWITCH. + * For those you should use the SWITCH compeund instruction. + */ + public static BranchInstruction createBranchInstruction(short opcode, InstructionHandle target) { + switch(opcode) { + case Constants.IFEQ: return new IFEQ(target); + case Constants.IFNE: return new IFNE(target); + case Constants.IFLT: return new IFLT(target); + case Constants.IFGE: return new IFGE(target); + case Constants.IFGT: return new IFGT(target); + case Constants.IFLE: return new IFLE(target); + case Constants.IF_ICMPEQ: return new IF_ICMPEQ(target); + case Constants.IF_ICMPNE: return new IF_ICMPNE(target); + case Constants.IF_ICMPLT: return new IF_ICMPLT(target); + case Constants.IF_ICMPGE: return new IF_ICMPGE(target); + case Constants.IF_ICMPGT: return new IF_ICMPGT(target); + case Constants.IF_ICMPLE: return new IF_ICMPLE(target); + case Constants.IF_ACMPEQ: return new IF_ACMPEQ(target); + case Constants.IF_ACMPNE: return new IF_ACMPNE(target); + case Constants.GOTO: return new GOTO(target); + case Constants.JSR: return new JSR(target); + case Constants.IFNULL: return new IFNULL(target); + case Constants.IFNONNULL: return new IFNONNULL(target); + case Constants.GOTO_W: return new GOTO_W(target); + case Constants.JSR_W: return new JSR_W(target); + default: + throw new RuntimeException("Invalid opcode: " + opcode); + } + } + + public void setClassGen(ClassGen c) { cg = c; } + public ClassGen getClassGen() { return cg; } + public void setConstantPool(ConstantPoolGen c) { cp = c; } + public ConstantPoolGen getConstantPool() { return cp; } +} diff --git a/src/java/org/apache/bcel/generic/InstructionHandle.java b/src/java/org/apache/bcel/generic/InstructionHandle.java new file mode 100644 index 00000000..2c6cc548 --- /dev/null +++ b/src/java/org/apache/bcel/generic/InstructionHandle.java @@ -0,0 +1,284 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.classfile.Utility; +import java.util.HashSet; +import java.util.Collection; +import java.util.HashMap; + +/** + * Instances of this class give users a handle to the instructions contained in + * an InstructionList. Instruction objects may be used more than once within a + * list, this is useful because it saves memory and may be much faster. + * + * Within an InstructionList an InstructionHandle object is wrapped + * around all instructions, i.e., it implements a cell in a + * doubly-linked list. From the outside only the next and the + * previous instruction (handle) are accessible. One + * can traverse the list via an Enumeration returned by + * InstructionList.elements(). + * + * @version $Id$ + * @author M. Dahm + * @see Instruction + * @see BranchHandle + * @see InstructionList + */ +public class InstructionHandle implements java.io.Serializable { + InstructionHandle next, prev; // Will be set from the outside + Instruction instruction; + protected int i_position = -1; // byte code offset of instruction + private HashSet targeters; + private HashMap attributes; + + public final InstructionHandle getNext() { return next; } + public final InstructionHandle getPrev() { return prev; } + public final Instruction getInstruction() { return instruction; } + + /** + * Replace current instruction contained in this handle. + * Old instruction is disposed using Instruction.dispose(). + */ + public void setInstruction(Instruction i) { // Overridden in BranchHandle + if(i == null) + throw new ClassGenException("Assigning null to handle"); + + if((this.getClass() != BranchHandle.class) && (i instanceof BranchInstruction)) + throw new ClassGenException("Assigning branch instruction " + i + " to plain handle"); + + if(instruction != null) + instruction.dispose(); + + instruction = i; + } + + /** + * Temporarily swap the current instruction, without disturbing + * anything. Meant to be used by a debugger, implementing + * breakpoints. Current instruction is returned. + */ + public Instruction swapInstruction(Instruction i) { + Instruction oldInstruction = instruction; + instruction = i; + return oldInstruction; + } + + /*private*/ protected InstructionHandle(Instruction i) { + setInstruction(i); + } + + private static InstructionHandle ih_list = null; // List of reusable handles + + /** Factory method. + */ + static final InstructionHandle getInstructionHandle(Instruction i) { + if(ih_list == null) + return new InstructionHandle(i); + else { + InstructionHandle ih = ih_list; + ih_list = ih.next; + + ih.setInstruction(i); + + return ih; + } + } + + /** + * Called by InstructionList.setPositions when setting the position for every + * instruction. In the presence of variable length instructions `setPositions()' + * performs multiple passes over the instruction list to calculate the + * correct (byte) positions and offsets by calling this function. + * + * @param offset additional offset caused by preceding (variable length) instructions + * @param max_offset the maximum offset that may be caused by these instructions + * @return additional offset caused by possible change of this instruction's length + */ + protected int updatePosition(int offset, int max_offset) { + i_position += offset; + return 0; + } + + /** @return the position, i.e., the byte code offset of the contained + * instruction. This is accurate only after + * InstructionList.setPositions() has been called. + */ + public int getPosition() { return i_position; } + + /** Set the position, i.e., the byte code offset of the contained + * instruction. + */ + void setPosition(int pos) { i_position = pos; } + + /** Overridden in BranchHandle + */ + protected void addHandle() { + next = ih_list; + ih_list = this; + } + + /** + * Delete contents, i.e., remove user access and make handle reusable. + */ + void dispose() { + next = prev = null; + instruction.dispose(); + instruction = null; + i_position = -1; + attributes = null; + removeAllTargeters(); + addHandle(); + } + + /** Remove all targeters, if any. + */ + public void removeAllTargeters() { + if(targeters != null) + targeters.clear(); + } + + /** + * Denote this handle isn't referenced anymore by t. + */ + public void removeTargeter(InstructionTargeter t) { + targeters.remove(t); + } + + /** + * Denote this handle is being referenced by t. + */ + public void addTargeter(InstructionTargeter t) { + if(targeters == null) + targeters = new HashSet(); + + //if(!targeters.contains(t)) + targeters.add(t); + } + + public boolean hasTargeters() { + return (targeters != null) && (targeters.size() > 0); + } + + /** + * @return null, if there are no targeters + */ + public InstructionTargeter[] getTargeters() { + if(!hasTargeters()) + return null; + + InstructionTargeter[] t = new InstructionTargeter[targeters.size()]; + targeters.toArray(t); + return t; + } + + /** @return a (verbose) string representation of the contained instruction. + */ + public String toString(boolean verbose) { + return Utility.format(i_position, 4, false, ' ') + ": " + instruction.toString(verbose); + } + + /** @return a string representation of the contained instruction. + */ + public String toString() { + return toString(true); + } + + /** Add an attribute to an instruction handle. + * + * @param key the key object to store/retrieve the attribute + * @param attr the attribute to associate with this handle + */ + public void addAttribute(Object key, Object attr) { + if(attributes == null) + attributes = new HashMap(3); + + attributes.put(key, attr); + } + + /** Delete an attribute of an instruction handle. + * + * @param key the key object to retrieve the attribute + */ + public void removeAttribute(Object key) { + if(attributes != null) + attributes.remove(key); + } + + /** Get attribute of an instruction handle. + * + * @param key the key object to store/retrieve the attribute + */ + public Object getAttribute(Object key) { + if(attributes != null) + return attributes.get(key); + + return null; + } + + /** @return all attributes associated with this handle + */ + public Collection getAttributes() { + return attributes.values(); + } + + /** Convenience method, simply calls accept() on the contained instruction. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + instruction.accept(v); + } +} diff --git a/src/java/org/apache/bcel/generic/InstructionList.java b/src/java/org/apache/bcel/generic/InstructionList.java new file mode 100644 index 00000000..2d521967 --- /dev/null +++ b/src/java/org/apache/bcel/generic/InstructionList.java @@ -0,0 +1,1287 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.util.ByteSequence; +import java.io.*; +import java.util.Iterator; +import java.util.HashMap; +import java.util.ArrayList; + +/** + * This class is a container for a list of Instruction objects. Instructions can + * be appended, inserted, moved, deleted, etc.. Instructions are being + * wrapped into InstructionHandles objects that + * are returned upon append/insert operations. They give the user + * (read only) access to the list structure, such that it can be traversed and + * manipulated in a controlled way. + * + * A list is finally dumped to a byte code array with getByteCode. + * + * @version $Id$ + * @author M. Dahm + * @see Instruction + * @see InstructionHandle + * @see BranchHandle + */ +public class InstructionList implements Serializable { + private InstructionHandle start = null, end = null; + private int length = 0; // number of elements in list + private int[] byte_positions; // byte code offsets corresponding to instructions + + /** + * Create (empty) instruction list. + */ + public InstructionList() {} + + /** + * Create instruction list containing one instruction. + * @param i initial instruction + */ + public InstructionList(Instruction i) { + append(i); + } + + /** + * Create instruction list containing one instruction. + * @param i initial instruction + */ + public InstructionList(BranchInstruction i) { + append(i); + } + + /** + * Initialize list with (nonnull) compound instruction. Consumes argument + * list, i.e., it becomes empty. + * + * @param c compound instruction (list) + */ + public InstructionList(CompoundInstruction c) { + append(c.getInstructionList()); + } + + /** + * Test for empty list. + */ + public boolean isEmpty() { return start == null; } // && end == null + + /** + * Find the target instruction (handle) that corresponds to the given target + * position (byte code offset). + * + * @param ihs array of instruction handles, i.e. il.getInstructionHandles() + * @param pos array of positions corresponding to ihs, i.e. il.getInstructionPositions() + * @param count length of arrays + * @param target target position to search for + * @return target position's instruction handle if available + */ + public static InstructionHandle findHandle(InstructionHandle[] ihs, + int[] pos, int count, + int target) { + int l=0, r = count - 1; + + /* Do a binary search since the pos array is orderd. + */ + do { + int i = (l + r) / 2; + int j = pos[i]; + + if(j == target) // target found + return ihs[i]; + else if(target < j) // else constrain search area + r = i - 1; + else // target > j + l = i + 1; + } while(l <= r); + + return null; + } + + /** + * Get instruction handle for instruction at byte code position pos. + * This only works properly, if the list is freshly initialized from a byte array or + * setPositions() has been called before this method. + * + * @param pos byte code position to search for + * @return target position's instruction handle if available + */ + public InstructionHandle findHandle(int pos) { + InstructionHandle[] ihs = getInstructionHandles(); + return findHandle(ihs, byte_positions, length, pos); + } + + /** + * Initialize instruction list from byte array. + * + * @param code byte array containing the instructions + */ + public InstructionList(byte[] code) { + ByteSequence bytes = new ByteSequence(code); + InstructionHandle[] ihs = new InstructionHandle[code.length]; + int[] pos = new int[code.length]; // Can't be more than that + int count = 0; // Contains actual length + + /* Pass 1: Create an object for each byte code and append them + * to the list. + */ + try { + while(bytes.available() > 0) { + // Remember byte offset and associate it with the instruction + int off = bytes.getIndex(); + pos[count] = off; + + /* Read one instruction from the byte stream, the byte position is set + * accordingly. + */ + Instruction i = Instruction.readInstruction(bytes); + InstructionHandle ih; + if(i instanceof BranchInstruction) // Use proper append() method + ih = append((BranchInstruction)i); + else + ih = append(i); + + ih.setPosition(off); + ihs[count] = ih; + + count++; + } + } catch(IOException e) { throw new ClassGenException(e.toString()); } + + byte_positions = new int[count]; // Trim to proper size + System.arraycopy(pos, 0, byte_positions, 0, count); + + /* Pass 2: Look for BranchInstruction and update their targets, i.e., + * convert offsets to instruction handles. + */ + for(int i=0; i < count; i++) { + if(ihs[i] instanceof BranchHandle) { + BranchInstruction bi = (BranchInstruction)ihs[i].instruction; + int target = bi.position + bi.getIndex(); /* Byte code position: + * relative -> absolute. */ + // Search for target position + InstructionHandle ih = findHandle(ihs, pos, count, target); + + if(ih == null) // Search failed + throw new ClassGenException("Couldn't find target for branch: " + bi); + + bi.setTarget(ih); // Update target + + // If it is a Select instruction, update all branch targets + if(bi instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH + Select s = (Select)bi; + int[] indices = s.getIndices(); + + for(int j=0; j < indices.length; j++) { + target = bi.position + indices[j]; + ih = findHandle(ihs, pos, count, target); + + if(ih == null) // Search failed + throw new ClassGenException("Couldn't find target for switch: " + bi); + + s.setTarget(j, ih); // Update target + } + } + } + } + } + + /** + * Append another list after instruction (handle) ih contained in this list. + * Consumes argument list, i.e., it becomes empty. + * + * @param ih where to append the instruction list + * @param il Instruction list to append to this one + * @return instruction handle pointing to the first appended instruction + */ + public InstructionHandle append(InstructionHandle ih, InstructionList il) { + if(il == null) + throw new ClassGenException("Appending null InstructionList"); + + if(il.isEmpty()) // Nothing to do + return ih; + + InstructionHandle next = ih.next, ret = il.start; + + ih.next = il.start; + il.start.prev = ih; + + il.end.next = next; + + if(next != null) // i == end ? + next.prev = il.end; + else + end = il.end; // Update end ... + + length += il.length; // Update length + + il.clear(); + + return ret; + } + + /** + * Append another list after instruction i contained in this list. + * Consumes argument list, i.e., it becomes empty. + * + * @param i where to append the instruction list + * @param il Instruction list to append to this one + * @return instruction handle pointing to the first appended instruction + */ + public InstructionHandle append(Instruction i, InstructionList il) { + InstructionHandle ih; + + if((ih = findInstruction2(i)) == null) // Also applies for empty list + throw new ClassGenException("Instruction " + i + + " is not contained in this list."); + + return append(ih, il); + } + + /** + * Append another list to this one. + * Consumes argument list, i.e., it becomes empty. + * + * @param il list to append to end of this list + * @return instruction handle of the first appended instruction + */ + public InstructionHandle append(InstructionList il) { + if(il == null) + throw new ClassGenException("Appending null InstructionList"); + + if(il.isEmpty()) // Nothing to do + return null; + + if(isEmpty()) { + start = il.start; + end = il.end; + length = il.length; + + il.clear(); + + return start; + } else + return append(end, il); // was end.instruction + } + + /** + * Append an instruction to the end of this list. + * + * @param ih instruction to append + */ + private void append(InstructionHandle ih) { + if(isEmpty()) { + start = end = ih; + ih.next = ih.prev = null; + } + else { + end.next = ih; + ih.prev = end; + ih.next = null; + end = ih; + } + + length++; // Update length + } + + /** + * Append an instruction to the end of this list. + * + * @param i instruction to append + * @return instruction handle of the appended instruction + */ + public InstructionHandle append(Instruction i) { + InstructionHandle ih = InstructionHandle.getInstructionHandle(i); + append(ih); + + return ih; + } + + /** + * Append a branch instruction to the end of this list. + * + * @param i branch instruction to append + * @return branch instruction handle of the appended instruction + */ + public BranchHandle append(BranchInstruction i) { + BranchHandle ih = BranchHandle.getBranchHandle(i); + append(ih); + + return ih; + } + + /** + * Append a single instruction j after another instruction i, which + * must be in this list of course! + * + * @param i Instruction in list + * @param j Instruction to append after i in list + * @return instruction handle of the first appended instruction + */ + public InstructionHandle append(Instruction i, Instruction j) { + return append(i, new InstructionList(j)); + } + + /** + * Append a compound instruction, after instruction i. + * + * @param i Instruction in list + * @param c The composite instruction (containing an InstructionList) + * @return instruction handle of the first appended instruction + */ + public InstructionHandle append(Instruction i, CompoundInstruction c) { + return append(i, c.getInstructionList()); + } + + /** + * Append a compound instruction. + * + * @param c The composite instruction (containing an InstructionList) + * @return instruction handle of the first appended instruction + */ + public InstructionHandle append(CompoundInstruction c) { + return append(c.getInstructionList()); + } + + /** + * Append a compound instruction. + * + * @param ih where to append the instruction list + * @param c The composite instruction (containing an InstructionList) + * @return instruction handle of the first appended instruction + */ + public InstructionHandle append(InstructionHandle ih, CompoundInstruction c) { + return append(ih, c.getInstructionList()); + } + + /** + * Append an instruction after instruction (handle) ih contained in this list. + * + * @param ih where to append the instruction list + * @param i Instruction to append + * @return instruction handle pointing to the first appended instruction + */ + public InstructionHandle append(InstructionHandle ih, Instruction i) { + return append(ih, new InstructionList(i)); + } + + /** + * Append an instruction after instruction (handle) ih contained in this list. + * + * @param ih where to append the instruction list + * @param i Instruction to append + * @return instruction handle pointing to the first appended instruction + */ + public BranchHandle append(InstructionHandle ih, BranchInstruction i) { + BranchHandle bh = BranchHandle.getBranchHandle(i); + InstructionList il = new InstructionList(); + il.append(bh); + + append(ih, il); + + return bh; + } + + /** + * Insert another list before Instruction handle ih contained in this list. + * Consumes argument list, i.e., it becomes empty. + * + * @param i where to append the instruction list + * @param il Instruction list to insert + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert(InstructionHandle ih, InstructionList il) { + if(il == null) + throw new ClassGenException("Inserting null InstructionList"); + + if(il.isEmpty()) // Nothing to do + return ih; + + InstructionHandle prev = ih.prev, ret = il.start; + + ih.prev = il.end; + il.end.next = ih; + + il.start.prev = prev; + + if(prev != null) // ih == start ? + prev.next = il.start; + else + start = il.start; // Update start ... + + length += il.length; // Update length + + il.clear(); + + return ret; + } + + /** + * Insert another list. + * + * @param il list to insert before start of this list + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert(InstructionList il) { + if(isEmpty()) { + append(il); // Code is identical for this case + return start; + } + else + return insert(start, il); + } + + /** + * Insert an instruction at start of this list. + * + * @param ih instruction to insert + */ + private void insert(InstructionHandle ih) { + if(isEmpty()) { + start = end = ih; + ih.next = ih.prev = null; + } else { + start.prev = ih; + ih.next = start; + ih.prev = null; + start = ih; + } + + length++; + } + + /** + * Insert another list before Instruction i contained in this list. + * Consumes argument list, i.e., it becomes empty. + * + * @param i where to append the instruction list + * @param il Instruction list to insert + * @return instruction handle pointing to the first inserted instruction, + * i.e., il.getStart() + */ + public InstructionHandle insert(Instruction i, InstructionList il) { + InstructionHandle ih; + + if((ih = findInstruction1(i)) == null) + throw new ClassGenException("Instruction " + i + + " is not contained in this list."); + + return insert(ih, il); + } + + /** + * Insert an instruction at start of this list. + * + * @param i instruction to insert + * @return instruction handle of the inserted instruction + */ + public InstructionHandle insert(Instruction i) { + InstructionHandle ih = InstructionHandle.getInstructionHandle(i); + insert(ih); + + return ih; + } + + /** + * Insert a branch instruction at start of this list. + * + * @param i branch instruction to insert + * @return branch instruction handle of the appended instruction + */ + public BranchHandle insert(BranchInstruction i) { + BranchHandle ih = BranchHandle.getBranchHandle(i); + insert(ih); + return ih; + } + + /** + * Insert a single instruction j before another instruction i, which + * must be in this list of course! + * + * @param i Instruction in list + * @param j Instruction to insert before i in list + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert(Instruction i, Instruction j) { + return insert(i, new InstructionList(j)); + } + + /** + * Insert a compound instruction before instruction i. + * + * @param i Instruction in list + * @param c The composite instruction (containing an InstructionList) + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert(Instruction i, CompoundInstruction c) { + return insert(i, c.getInstructionList()); + } + + /** + * Insert a compound instruction. + * + * @param c The composite instruction (containing an InstructionList) + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert(CompoundInstruction c) { + return insert(c.getInstructionList()); + } + + /** + * Insert an instruction before instruction (handle) ih contained in this list. + * + * @param ih where to insert to the instruction list + * @param i Instruction to insert + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert(InstructionHandle ih, Instruction i) { + return insert(ih, new InstructionList(i)); + } + + /** + * Insert a compound instruction. + * + * @param ih where to insert the instruction list + * @param c The composite instruction (containing an InstructionList) + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert(InstructionHandle ih, CompoundInstruction c) { + return insert(ih, c.getInstructionList()); + } + + /** + * Insert an instruction before instruction (handle) ih contained in this list. + * + * @param ih where to insert to the instruction list + * @param i Instruction to insert + * @return instruction handle of the first inserted instruction + */ + public BranchHandle insert(InstructionHandle ih, BranchInstruction i) { + BranchHandle bh = BranchHandle.getBranchHandle(i); + InstructionList il = new InstructionList(); + il.append(bh); + + insert(ih, il); + + return bh; + } + + /** + * Take all instructions (handles) from "start" to "end" and append them after the + * new location "target". Of course, "end" must be after "start" and target must + * not be located withing this range. If you want to move something to the start of + * the list use null as value for target.
        + * Any instruction targeters pointing to handles within the block, keep their targets. + * + * @param start of moved block + * @param end of moved block + * @param target of moved block + */ + public void move(InstructionHandle start, InstructionHandle end, InstructionHandle target) { + // Step 1: Check constraints + + if((start == null) || (end == null)) + throw new ClassGenException("Invalid null handle: From " + start + " to " + end); + + if((target == start) || (target == end)) + throw new ClassGenException("Invalid range: From " + start + " to " + end + + " contains target " + target); + + for(InstructionHandle ih = start; ih != end.next; ih = ih.next) { + if(ih == null) // At end of list, end not found yet + throw new ClassGenException("Invalid range: From " + start + " to " + end); + else if(ih == target) // target may be null + throw new ClassGenException("Invalid range: From " + start + " to " + end + + " contains target " + target); + } + + // Step 2: Temporarily remove the given instructions from the list + + InstructionHandle prev = start.prev, next = end.next; + + if(prev != null) + prev.next = next; + else // start == this.start! + this.start = next; + + if(next != null) + next.prev = prev; + else // end == this.end! + this.end = prev; + + start.prev = end.next = null; + + // Step 3: append after target + + if(target == null) { // append to start of list + end.next = this.start; + this.start = start; + } else { + next = target.next; + + target.next = start; + start.prev = target; + end.next = next; + + if(next != null) + next.prev = end; + } + } + + /** + * Move a single instruction (handle) to a new location. + * + * @param ih moved instruction + * @param target new location of moved instruction + */ + public void move(InstructionHandle ih, InstructionHandle target) { + move(ih, ih, target); + } + + /** + * Remove from instruction `prev' to instruction `next' both contained + * in this list. Throws TargetLostException when one of the removed instruction handles + * is still being targeted. + * + * @param prev where to start deleting (predecessor, exclusive) + * @param next where to end deleting (successor, exclusive) + */ + private void remove(InstructionHandle prev, InstructionHandle next) + throws TargetLostException + { + InstructionHandle first, last; // First and last deleted instruction + + if((prev == null) && (next == null)) { // singleton list + first = last = start; + start = end = null; + } else { + if(prev == null) { // At start of list + first = start; + start = next; + } else { + first = prev.next; + prev.next = next; + } + + if(next == null) { // At end of list + last = end; + end = prev; + } else { + last = next.prev; + next.prev = prev; + } + } + + first.prev = null; // Completely separated from rest of list + last.next = null; + + ArrayList target_vec = new ArrayList(); + + for(InstructionHandle ih=first; ih != null; ih = ih.next) + ih.getInstruction().dispose(); // e.g. BranchInstructions release their targets + + StringBuffer buf = new StringBuffer("{ "); + for(InstructionHandle ih=first; ih != null; ih = next) { + next = ih.next; + length--; + + if(ih.hasTargeters()) { // Still got targeters? + target_vec.add(ih); + buf.append(ih.toString(true) + " "); + ih.next = ih.prev = null; + } else + ih.dispose(); + } + + buf.append("}"); + + if(!target_vec.isEmpty()) { + InstructionHandle[] targeted = new InstructionHandle[target_vec.size()]; + target_vec.toArray(targeted); + throw new TargetLostException(targeted, buf.toString()); + } + } + + /** + * Remove instruction from this list. The corresponding Instruction + * handles must not be reused! + * + * @param ih instruction (handle) to remove + */ + public void delete(InstructionHandle ih) throws TargetLostException { + remove(ih.prev, ih.next); + } + + /** + * Remove instruction from this list. The corresponding Instruction + * handles must not be reused! + * + * @param i instruction to remove + */ + public void delete(Instruction i) throws TargetLostException { + InstructionHandle ih; + + if((ih = findInstruction1(i)) == null) + throw new ClassGenException("Instruction " + i + + " is not contained in this list."); + delete(ih); + } + + /** + * Remove instructions from instruction `from' to instruction `to' contained + * in this list. The user must ensure that `from' is an instruction before + * `to', or risk havoc. The corresponding Instruction handles must not be reused! + * + * @param from where to start deleting (inclusive) + * @param to where to end deleting (inclusive) + */ + public void delete(InstructionHandle from, InstructionHandle to) + throws TargetLostException + { + remove(from.prev, to.next); + } + + /** + * Remove instructions from instruction `from' to instruction `to' contained + * in this list. The user must ensure that `from' is an instruction before + * `to', or risk havoc. The corresponding Instruction handles must not be reused! + * + * @param from where to start deleting (inclusive) + * @param to where to end deleting (inclusive) + */ + public void delete(Instruction from, Instruction to) throws TargetLostException { + InstructionHandle from_ih, to_ih; + + if((from_ih = findInstruction1(from)) == null) + throw new ClassGenException("Instruction " + from + + " is not contained in this list."); + + if((to_ih = findInstruction2(to)) == null) + throw new ClassGenException("Instruction " + to + + " is not contained in this list."); + delete(from_ih, to_ih); + } + + /** + * Search for given Instruction reference, start at beginning of list. + * + * @param i instruction to search for + * @return instruction found on success, null otherwise + */ + private InstructionHandle findInstruction1(Instruction i) { + for(InstructionHandle ih=start; ih != null; ih = ih.next) + if(ih.instruction == i) + return ih; + + return null; + } + + /** + * Search for given Instruction reference, start at end of list + * + * @param i instruction to search for + * @return instruction found on success, null otherwise + */ + private InstructionHandle findInstruction2(Instruction i) { + for(InstructionHandle ih=end; ih != null; ih = ih.prev) + if(ih.instruction == i) + return ih; + + return null; + } + + public boolean contains(InstructionHandle i) { + if(i == null) + return false; + + for(InstructionHandle ih=start; ih != null; ih = ih.next) + if(ih == i) + return true; + + return false; + } + + public boolean contains(Instruction i) { + return findInstruction1(i) != null; + } + + public void setPositions() { + setPositions(false); + } + + /** + * Give all instructions their position number (offset in byte stream), i.e., + * make the list ready to be dumped. + * + * @param check Perform sanity checks, e.g. if all targeted instructions really belong + * to this list + */ + public void setPositions(boolean check) { + int max_additional_bytes = 0, additional_bytes = 0; + int index = 0, count = 0; + int[] pos = new int[length]; + + /* Pass 0: Sanity checks + */ + if(check) { + for(InstructionHandle ih=start; ih != null; ih = ih.next) { + Instruction i = ih.instruction; + + if(i instanceof BranchInstruction) { // target instruction within list? + Instruction inst = ((BranchInstruction)i).getTarget().instruction; + if(!contains(inst)) + throw new ClassGenException("Branch target of " + + Constants.OPCODE_NAMES[i.opcode] + ":" + + inst + " not in instruction list"); + + if(i instanceof Select) { + InstructionHandle[] targets = ((Select)i).getTargets(); + + for(int j=0; j < targets.length; j++) { + inst = targets[j].instruction; + if(!contains(inst)) + throw new ClassGenException("Branch target of " + + Constants.OPCODE_NAMES[i.opcode] + ":" + + inst + " not in instruction list"); + } + } + + if(!(ih instanceof BranchHandle)) + throw new ClassGenException("Branch instruction " + + Constants.OPCODE_NAMES[i.opcode] + ":" + + inst + " not contained in BranchHandle."); + + } + } + } + + /* Pass 1: Set position numbers and sum up the maximum number of bytes an + * instruction may be shifted. + */ + for(InstructionHandle ih=start; ih != null; ih = ih.next) { + Instruction i = ih.instruction; + + ih.setPosition(index); + pos[count++] = index; + + /* Get an estimate about how many additional bytes may be added, because + * BranchInstructions may have variable length depending on the target + * offset (short vs. int) or alignment issues (TABLESWITCH and + * LOOKUPSWITCH). + */ + switch(i.getOpcode()) { + case Constants.JSR: case Constants.GOTO: + max_additional_bytes += 2; + break; + + case Constants.TABLESWITCH: case Constants.LOOKUPSWITCH: + max_additional_bytes += 3; + break; + } + + index += i.getLength(); + } + + /* Pass 2: Expand the variable-length (Branch)Instructions depending on + * the target offset (short or int) and ensure that branch targets are + * within this list. + */ + for(InstructionHandle ih=start; ih != null; ih = ih.next) + additional_bytes += ih.updatePosition(additional_bytes, max_additional_bytes); + + /* Pass 3: Update position numbers (which may have changed due to the + * preceding expansions), like pass 1. + */ + index=count=0; + for(InstructionHandle ih=start; ih != null; ih = ih.next) { + Instruction i = ih.instruction; + + ih.setPosition(index); + pos[count++] = index; + index += i.getLength(); + } + + byte_positions = new int[count]; // Trim to proper size + System.arraycopy(pos, 0, byte_positions, 0, count); + } + + /** + * When everything is finished, use this method to convert the instruction + * list into an array of bytes. + * + * @return the byte code ready to be dumped + */ + public byte[] getByteCode() { + // Update position indices of instructions + setPositions(); + + ByteArrayOutputStream b = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(b); + + try { + for(InstructionHandle ih=start; ih != null; ih = ih.next) { + Instruction i = ih.instruction; + i.dump(out); // Traverse list + } + } catch(IOException e) { + System.err.println(e); + return null; + } + + return b.toByteArray(); + } + + /** + * @return an array of instructions without target information for branch instructions. + */ + public Instruction[] getInstructions() { + ByteSequence bytes = new ByteSequence(getByteCode()); + ArrayList instructions = new ArrayList(); + + try { + while(bytes.available() > 0) { + instructions.add(Instruction.readInstruction(bytes)); + } + } catch(IOException e) { throw new ClassGenException(e.toString()); } + + Instruction[] result = new Instruction[instructions.size()]; + instructions.toArray(result); + return result; + } + + public String toString() { + return toString(true); + } + + /** + * @param verbose toggle output format + * @return String containing all instructions in this list. + */ + public String toString(boolean verbose) { + StringBuffer buf = new StringBuffer(); + + for(InstructionHandle ih=start; ih != null; ih = ih.next) { + buf.append(ih.toString(verbose) + "\n"); + } + + return buf.toString(); + } + + /** + * @return Enumeration that lists all instructions (handles) + */ + public Iterator iterator() { + return new Iterator() { + private InstructionHandle ih = start; + + public Object next() { + InstructionHandle i = ih; + ih = ih.next; + return i; + } + + public void remove() { + throw new UnsupportedOperationException(); + } + + public boolean hasNext() { return ih != null; } + }; + } + + /** + * @return array containing all instructions (handles) + */ + public InstructionHandle[] getInstructionHandles() { + InstructionHandle[] ihs = new InstructionHandle[length]; + InstructionHandle ih = start; + + for(int i=0; i < length; i++) { + ihs[i] = ih; + ih = ih.next; + } + + return ihs; + } + + /** + * Get positions (offsets) of all instructions in the list. This relies on that + * the list has been freshly created from an byte code array, or that setPositions() + * has been called. Otherwise this may be inaccurate. + * + * @return array containing all instruction's offset in byte code + */ + public int[] getInstructionPositions() { return byte_positions; } + + /** + * @return complete, i.e., deep copy of this list + */ + public InstructionList copy() { + HashMap map = new HashMap(); + InstructionList il = new InstructionList(); + + /* Pass 1: Make copies of all instructions, append them to the new list + * and associate old instruction references with the new ones, i.e., + * a 1:1 mapping. + */ + for(InstructionHandle ih=start; ih != null; ih = ih.next) { + Instruction i = ih.instruction; + Instruction c = i.copy(); // Use clone for shallow copy + + if(c instanceof BranchInstruction) + map.put(ih, il.append((BranchInstruction)c)); + else + map.put(ih, il.append(c)); + } + + /* Pass 2: Update branch targets. + */ + InstructionHandle ih=start; + InstructionHandle ch=il.start; + + while(ih != null) { + Instruction i = ih.instruction; + Instruction c = ch.instruction; + + if(i instanceof BranchInstruction) { + BranchInstruction bi = (BranchInstruction)i; + BranchInstruction bc = (BranchInstruction)c; + InstructionHandle itarget = bi.getTarget(); // old target + + // New target is in hash map + bc.setTarget((InstructionHandle)map.get(itarget)); + + if(bi instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH + InstructionHandle[] itargets = ((Select)bi).getTargets(); + InstructionHandle[] ctargets = ((Select)bc).getTargets(); + + for(int j=0; j < itargets.length; j++) { // Update all targets + ctargets[j] = (InstructionHandle)map.get(itargets[j]); + } + } + } + + ih = ih.next; + ch = ch.next; + } + + return il; + } + + /** Replace all references to the old constant pool with references to the new + * constant pool + */ + public void replaceConstantPool(ConstantPoolGen old_cp, ConstantPoolGen new_cp) { + for(InstructionHandle ih=start; ih != null; ih = ih.next) { + Instruction i = ih.instruction; + + if(i instanceof CPInstruction) { + CPInstruction ci = (CPInstruction)i; + Constant c = old_cp.getConstant(ci.getIndex()); + ci.setIndex(new_cp.addConstant(c, old_cp)); + } + } + } + + private void clear() { + start = end = null; + length = 0; + } + + /** + * Delete contents of list. Provides besser memory utilization, + * because the system then may reuse the instruction handles. This + * method is typically called right after + * MethodGen.getMethod(). + */ + public void dispose() { + // Traverse in reverse order, because ih.next is overwritten + for(InstructionHandle ih=end; ih != null; ih = ih.prev) + /* Causes BranchInstructions to release target and targeters, because it + * calls dispose() on the contained instruction. + */ + ih.dispose(); + + clear(); + } + + /** + * @return start of list + */ + public InstructionHandle getStart() { return start; } + + /** + * @return end of list + */ + public InstructionHandle getEnd() { return end; } + + /** + * @return length of list (Number of instructions, not bytes) + */ + public int getLength() { return length; } + + /** + * @return length of list (Number of instructions, not bytes) + */ + public int size() { return length; } + + /** + * Redirect all references from old_target to new_target, i.e., update targets + * of branch instructions. + * + * @param old_target the old target instruction handle + * @param new_target the new target instruction handle + */ + public void redirectBranches(InstructionHandle old_target, + InstructionHandle new_target) { + for(InstructionHandle ih = start; ih != null; ih = ih.next) { + Instruction i = ih.getInstruction(); + + if(i instanceof BranchInstruction) { + BranchInstruction b = (BranchInstruction)i; + InstructionHandle target = b.getTarget(); + + if(target == old_target) + b.setTarget(new_target); + + if(b instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH + InstructionHandle[] targets = ((Select)b).getTargets(); + + for(int j=0; j < targets.length; j++) // Update targets + if(targets[j] == old_target) + ((Select)b).setTarget(j, new_target); + } + } + } + } + + /** + * Redirect all references of local variables from old_target to new_target. + * + * @@param lg array of local variables + * @@param old_target the old target instruction handle + * @@param new_target the new target instruction handle + * @@see MethodGen + */ + public void redirectLocalVariables(LocalVariableGen[] lg, + InstructionHandle old_target, + InstructionHandle new_target) { + for(int i=0; i < lg.length; i++) { + InstructionHandle start = lg[i].getStart(); + InstructionHandle end = lg[i].getEnd(); + + if(start == old_target) + lg[i].setStart(new_target); + + if(end == old_target) + lg[i].setEnd(new_target); + } + } + + /** + * Redirect all references of exception handlers from old_target to new_target. + * + * @@param exceptions array of exception handlers + * @@param old_target the old target instruction handle + * @@param new_target the new target instruction handle + * @@see MethodGen + */ + public void redirectExceptionHandlers(CodeExceptionGen[] exceptions, + InstructionHandle old_target, + InstructionHandle new_target) { + for(int i=0; i < exceptions.length; i++) { + if(exceptions[i].getStartPC() == old_target) + exceptions[i].setStartPC(new_target); + + if(exceptions[i].getEndPC() == old_target) + exceptions[i].setEndPC(new_target); + + if(exceptions[i].getHandlerPC() == old_target) + exceptions[i].setHandlerPC(new_target); + } + } + + private ArrayList observers; + + /** Add observer for this object. + */ + public void addObserver(InstructionListObserver o) { + if(observers == null) + observers = new ArrayList(); + + observers.add(o); + } + + /** Remove observer for this object. + */ + public void removeObserver(InstructionListObserver o) { + if(observers != null) + observers.remove(o); + } + + /** Call notify() method on all observers. This method is not called + * automatically whenever the state has changed, but has to be + * called by the user after he has finished editing the object. + */ + public void update() { + if(observers != null) + for(Iterator e = observers.iterator(); e.hasNext(); ) + ((InstructionListObserver)e.next()).notify(this); + } +} + diff --git a/src/java/org/apache/bcel/generic/InstructionListObserver.java b/src/java/org/apache/bcel/generic/InstructionListObserver.java new file mode 100644 index 00000000..96bc647f --- /dev/null +++ b/src/java/org/apache/bcel/generic/InstructionListObserver.java @@ -0,0 +1,67 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Implement this interface if you're interested in changes to an InstructionList object + * and register yourself with addObserver(). + * + * @version $Id$ + * @author M. Dahm + */ +public interface InstructionListObserver { + public void notify(InstructionList list); +} + diff --git a/src/java/org/apache/bcel/generic/InstructionTargeter.java b/src/java/org/apache/bcel/generic/InstructionTargeter.java new file mode 100644 index 00000000..77e03adf --- /dev/null +++ b/src/java/org/apache/bcel/generic/InstructionTargeter.java @@ -0,0 +1,70 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denote that a class targets InstructionHandles within an InstructionList. Namely + * the following implementers: + * + * @see BranchHandle + * @see LocalVariableGen + * @see CodeExceptionGen + * @version $Id$ + * @author M. Dahm + */ +public interface InstructionTargeter { + public boolean containsTarget(InstructionHandle ih); + public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih); +} diff --git a/src/java/org/apache/bcel/generic/InvokeInstruction.java b/src/java/org/apache/bcel/generic/InvokeInstruction.java new file mode 100644 index 00000000..70981203 --- /dev/null +++ b/src/java/org/apache/bcel/generic/InvokeInstruction.java @@ -0,0 +1,146 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.*; +import java.util.StringTokenizer; + +/** + * Super class for the INVOKExxx family of instructions. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class InvokeInstruction extends FieldOrMethod + implements ExceptionThrower, TypedInstruction, StackConsumer, StackProducer { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + InvokeInstruction() {} + + /** + * @param index to constant pool + */ + protected InvokeInstruction(short opcode, int index) { + super(opcode, index); + } + + /** + * @return mnemonic for instruction with symbolic references resolved + */ + public String toString(ConstantPool cp) { + Constant c = cp.getConstant(index); + StringTokenizer tok = new StringTokenizer(cp.constantToString(c)); + + return Constants.OPCODE_NAMES[opcode] + " " + + tok.nextToken().replace('.', '/') + tok.nextToken(); + } + + /** + * Also works for instructions whose stack effect depends on the + * constant pool entry they reference. + * @return Number of words consumed from stack by this instruction + */ + public int consumeStack(ConstantPoolGen cpg) { + String signature = getSignature(cpg); + Type[] args = Type.getArgumentTypes(signature); + int sum; + + if(opcode == Constants.INVOKESTATIC) + sum = 0; + else + sum = 1; // this reference + + int n = args.length; + for (int i = 0; i < n; i++) + sum += args[i].getSize(); + + return sum; + } + + /** + * Also works for instructions whose stack effect depends on the + * constant pool entry they reference. + * @return Number of words produced onto stack by this instruction + */ + public int produceStack(ConstantPoolGen cpg) { + return getReturnType(cpg).getSize(); + } + + /** @return return type of referenced method. + */ + public Type getType(ConstantPoolGen cpg) { + return getReturnType(cpg); + } + + /** @return name of referenced method. + */ + public String getMethodName(ConstantPoolGen cpg) { + return getName(cpg); + } + + /** @return return type of referenced method. + */ + public Type getReturnType(ConstantPoolGen cpg) { + return Type.getReturnType(getSignature(cpg)); + } + + /** @return argument types of referenced method. + */ + public Type[] getArgumentTypes(ConstantPoolGen cpg) { + return Type.getArgumentTypes(getSignature(cpg)); + } +} diff --git a/src/java/org/apache/bcel/generic/JSR.java b/src/java/org/apache/bcel/generic/JSR.java new file mode 100644 index 00000000..920e14d5 --- /dev/null +++ b/src/java/org/apache/bcel/generic/JSR.java @@ -0,0 +1,119 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; + +/** + * JSR - Jump to subroutine + * + * @version $Id$ + * @author M. Dahm + */ +public class JSR extends JsrInstruction implements VariableLengthInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + JSR() {} + + public JSR(InstructionHandle target) { + super(org.apache.bcel.Constants.JSR, target); + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + index = getTargetOffset(); + if(opcode == org.apache.bcel.Constants.JSR) + super.dump(out); + else { // JSR_W + index = getTargetOffset(); + out.writeByte(opcode); + out.writeInt(index); + } + } + + protected int updatePosition(int offset, int max_offset) { + int i = getTargetOffset(); // Depending on old position value + + position += offset; // Position may be shifted by preceding expansions + + if(Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) + opcode = org.apache.bcel.Constants.JSR_W; + length = 5; + return 2; // 5 - 3 + } + + return 0; + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitVariableLengthInstruction(this); + v.visitBranchInstruction(this); + v.visitJsrInstruction(this); + v.visitJSR(this); + } +} diff --git a/src/java/org/apache/bcel/generic/JSR_W.java b/src/java/org/apache/bcel/generic/JSR_W.java new file mode 100644 index 00000000..789ef037 --- /dev/null +++ b/src/java/org/apache/bcel/generic/JSR_W.java @@ -0,0 +1,110 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * JSR_W - Jump to subroutine + * + * @version $Id$ + * @author M. Dahm + */ +public class JSR_W extends JsrInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + JSR_W() {} + + public JSR_W(InstructionHandle target) { + super(org.apache.bcel.Constants.JSR_W, target); + length = 5; + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + index = getTargetOffset(); + out.writeByte(opcode); + out.writeInt(index); + } + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException + { + index = bytes.readInt(); + length = 5; + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitBranchInstruction(this); + v.visitJsrInstruction(this); + v.visitJSR_W(this); + } +} diff --git a/src/java/org/apache/bcel/generic/JsrInstruction.java b/src/java/org/apache/bcel/generic/JsrInstruction.java new file mode 100644 index 00000000..e5a4a4f8 --- /dev/null +++ b/src/java/org/apache/bcel/generic/JsrInstruction.java @@ -0,0 +1,116 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Super class for JSR - Jump to subroutine + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class JsrInstruction extends BranchInstruction + implements UnconditionalBranch, TypedInstruction, StackProducer +{ + JsrInstruction(short opcode, InstructionHandle target) { + super(opcode, target); + } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + JsrInstruction(){} + + /** @return return address type + */ + public Type getType(ConstantPoolGen cp) { + return new ReturnaddressType(physicalSuccessor()); + } + + + /** + * Returns an InstructionHandle to the physical successor + * of this JsrInstruction. For this method to work, + * this JsrInstruction object must not be shared between + * multiple InstructionHandle objects! + * Formally, there must not be InstructionHandle objects + * i, j where i != j and i.getInstruction() == this == + * j.getInstruction(). + * @return an InstructionHandle to the "next" instruction that + * will be executed when RETurned from a subroutine. + */ + public InstructionHandle physicalSuccessor(){ + InstructionHandle ih = this.target; + + // Rewind! + while(ih.getPrev() != null) + ih = ih.getPrev(); + + // Find the handle for "this" JsrInstruction object. + while(ih.getInstruction() != this) + ih = ih.getNext(); + + InstructionHandle toThis = ih; + + while(ih != null){ + ih = ih.getNext(); + if ((ih != null) && (ih.getInstruction() == this)) + throw new RuntimeException("physicalSuccessor() called on a shared JsrInstruction."); + } + + // Return the physical successor + return toThis.getNext(); + } +} diff --git a/src/java/org/apache/bcel/generic/L2D.java b/src/java/org/apache/bcel/generic/L2D.java new file mode 100644 index 00000000..8edc5e02 --- /dev/null +++ b/src/java/org/apache/bcel/generic/L2D.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * L2D - Convert long to double + *
        Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class L2D extends ConversionInstruction { + public L2D() { + super(org.apache.bcel.Constants.L2D); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitL2D(this); + } +} diff --git a/src/java/org/apache/bcel/generic/L2F.java b/src/java/org/apache/bcel/generic/L2F.java new file mode 100644 index 00000000..c996dc68 --- /dev/null +++ b/src/java/org/apache/bcel/generic/L2F.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * L2F - Convert long to float + *
        Stack: ..., value.word1, value.word2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class L2F extends ConversionInstruction { + public L2F() { + super(org.apache.bcel.Constants.L2F); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitL2F(this); + } +} diff --git a/src/java/org/apache/bcel/generic/L2I.java b/src/java/org/apache/bcel/generic/L2I.java new file mode 100644 index 00000000..c52d346d --- /dev/null +++ b/src/java/org/apache/bcel/generic/L2I.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * L2I - Convert long to int + *
        Stack: ..., value.word1, value.word2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class L2I extends ConversionInstruction { + public L2I() { + super(org.apache.bcel.Constants.L2I); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitL2I(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LADD.java b/src/java/org/apache/bcel/generic/LADD.java new file mode 100644 index 00000000..006adaaf --- /dev/null +++ b/src/java/org/apache/bcel/generic/LADD.java @@ -0,0 +1,86 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LADD - Add longs + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result.word1, result.word2 + * + * @version $Id$ + * @author M. Dahm + */ +public class LADD extends ArithmeticInstruction { + public LADD() { + super(org.apache.bcel.Constants.LADD); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLADD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LALOAD.java b/src/java/org/apache/bcel/generic/LALOAD.java new file mode 100644 index 00000000..a61d37a4 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LALOAD.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LALOAD - Load long from array + *
        Stack: ..., arrayref, index -> ..., value1, value2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LALOAD extends ArrayInstruction implements StackProducer { + /** Load long from array + */ + public LALOAD() { + super(org.apache.bcel.Constants.LALOAD); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitLALOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LAND.java b/src/java/org/apache/bcel/generic/LAND.java new file mode 100644 index 00000000..ab56ad50 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LAND.java @@ -0,0 +1,86 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LAND - Bitwise AND longs + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result.word1, result.word2 + * + * @version $Id$ + * @author M. Dahm + */ +public class LAND extends ArithmeticInstruction { + public LAND() { + super(org.apache.bcel.Constants.LAND); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLAND(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LASTORE.java b/src/java/org/apache/bcel/generic/LASTORE.java new file mode 100644 index 00000000..7aff0803 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LASTORE.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LASTORE - Store into long array + *
        Stack: ..., arrayref, index, value.word1, value.word2 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LASTORE extends ArrayInstruction implements StackConsumer { + /** Store long into array + */ + public LASTORE() { + super(org.apache.bcel.Constants.LASTORE); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitLASTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LCMP.java b/src/java/org/apache/bcel/generic/LCMP.java new file mode 100644 index 00000000..b5b707bf --- /dev/null +++ b/src/java/org/apache/bcel/generic/LCMP.java @@ -0,0 +1,82 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LCMP - Compare longs: + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result <= -1, 0, 1> + * + * @version $Id$ + * @author M. Dahm + */ +public class LCMP extends Instruction { + public LCMP() { + super(org.apache.bcel.Constants.LCMP, (short)1); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitLCMP(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LCONST.java b/src/java/org/apache/bcel/generic/LCONST.java new file mode 100644 index 00000000..a0ca5433 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LCONST.java @@ -0,0 +1,112 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LCONST - Push 0 or 1, other values cause an exception + * + *
        Stack: ... -> ..., 
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LCONST extends Instruction + implements ConstantPushInstruction, TypedInstruction { + private long value; + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LCONST() {} + + public LCONST(long l) { + super(org.apache.bcel.Constants.LCONST_0, (short)1); + + if(l == 0) + opcode = org.apache.bcel.Constants.LCONST_0; + else if(l == 1) + opcode = org.apache.bcel.Constants.LCONST_1; + else + throw new ClassGenException("LCONST can be used only for 0 and 1: " + l); + + value = l; + } + + public Number getValue() { return new Long(value); } + + /** @return Type.LONG + */ + public Type getType(ConstantPoolGen cp) { + return Type.LONG; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitPushInstruction(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitConstantPushInstruction(this); + v.visitLCONST(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LDC.java b/src/java/org/apache/bcel/generic/LDC.java new file mode 100644 index 00000000..2782ccd9 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LDC.java @@ -0,0 +1,172 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * LDC - Push item from constant pool. + * + *
        Stack: ... -> ..., item
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LDC extends CPInstruction + implements PushInstruction, ExceptionThrower, TypedInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LDC() {} + + public LDC(int index) { + super(org.apache.bcel.Constants.LDC_W, index); + setSize(); + } + + // Adjust to proper size + protected final void setSize() { + if(index <= org.apache.bcel.Constants.MAX_BYTE) { // Fits in one byte? + opcode = org.apache.bcel.Constants.LDC; + length = 2; + } else { + opcode = org.apache.bcel.Constants.LDC_W; + length = 3; + } + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + out.writeByte(opcode); + + if(length == 2) + out.writeByte(index); + else // Applies for LDC_W + out.writeShort(index); + } + + /** + * Set the index to constant pool and adjust size. + */ + public final void setIndex(int index) { + super.setIndex(index); + setSize(); + } + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) + throws IOException + { + length = 2; + index = bytes.readUnsignedByte(); + } + + public Object getValue(ConstantPoolGen cpg) { + org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(index); + + switch(c.getTag()) { + case org.apache.bcel.Constants.CONSTANT_String: + int i = ((org.apache.bcel.classfile.ConstantString)c).getStringIndex(); + c = cpg.getConstantPool().getConstant(i); + return ((org.apache.bcel.classfile.ConstantUtf8)c).getBytes(); + + case org.apache.bcel.Constants.CONSTANT_Float: + return new Float(((org.apache.bcel.classfile.ConstantFloat)c).getBytes()); + + case org.apache.bcel.Constants.CONSTANT_Integer: + return new Integer(((org.apache.bcel.classfile.ConstantInteger)c).getBytes()); + + default: // Never reached + throw new RuntimeException("Unknown or invalid constant type at " + index); + } + } + + public Type getType(ConstantPoolGen cpg) { + switch(cpg.getConstantPool().getConstant(index).getTag()) { + case org.apache.bcel.Constants.CONSTANT_String: return Type.STRING; + case org.apache.bcel.Constants.CONSTANT_Float: return Type.FLOAT; + case org.apache.bcel.Constants.CONSTANT_Integer: return Type.INT; + default: // Never reached + throw new RuntimeException("Unknown or invalid constant type at " + index); + } + } + + public Class[] getExceptions() { + return org.apache.bcel.ExceptionConstants.EXCS_STRING_RESOLUTION; + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitLDC(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LDC2_W.java b/src/java/org/apache/bcel/generic/LDC2_W.java new file mode 100644 index 00000000..d576767d --- /dev/null +++ b/src/java/org/apache/bcel/generic/LDC2_W.java @@ -0,0 +1,116 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LDC2_W - Push long or double from constant pool + * + *
        Stack: ... -> ..., item.word1, item.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LDC2_W extends CPInstruction + implements PushInstruction, TypedInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LDC2_W() {} + + public LDC2_W(int index) { + super(org.apache.bcel.Constants.LDC2_W, index); + } + + public Type getType(ConstantPoolGen cpg) { + switch(cpg.getConstantPool().getConstant(index).getTag()) { + case org.apache.bcel.Constants.CONSTANT_Long: return Type.LONG; + case org.apache.bcel.Constants.CONSTANT_Double: return Type.DOUBLE; + default: // Never reached + throw new RuntimeException("Unknown constant type " + opcode); + } + } + + public Number getValue(ConstantPoolGen cpg) { + org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(index); + + switch(c.getTag()) { + case org.apache.bcel.Constants.CONSTANT_Long: + return new Long(((org.apache.bcel.classfile.ConstantLong)c).getBytes()); + + case org.apache.bcel.Constants.CONSTANT_Double: + return new Double(((org.apache.bcel.classfile.ConstantDouble)c).getBytes()); + + default: // Never reached + throw new RuntimeException("Unknown or invalid constant type at " + index); + } + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitLDC2_W(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LDC_W.java b/src/java/org/apache/bcel/generic/LDC_W.java new file mode 100644 index 00000000..1e658dea --- /dev/null +++ b/src/java/org/apache/bcel/generic/LDC_W.java @@ -0,0 +1,87 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.IOException; +import org.apache.bcel.util.ByteSequence; + +/** + * LDC_W - Push item from constant pool (wide index) + * + *
        Stack: ... -> ..., item.word1, item.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LDC_W extends LDC { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LDC_W() {} + + public LDC_W(int index) { + super(index); + } + + /** + * Read needed data (i.e., index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) + throws IOException + { + setIndex(bytes.readUnsignedShort()); + length = 3; + } +} diff --git a/src/java/org/apache/bcel/generic/LDIV.java b/src/java/org/apache/bcel/generic/LDIV.java new file mode 100644 index 00000000..fad7a9a8 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LDIV.java @@ -0,0 +1,91 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LDIV - Divide longs + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result.word1, result.word2 + * + * @version $Id$ + * @author M. Dahm + */ +public class LDIV extends ArithmeticInstruction implements ExceptionThrower { + public LDIV() { + super(org.apache.bcel.Constants.LDIV); + } + + public Class[] getExceptions() { + return new Class[] { org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION }; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLDIV(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LLOAD.java b/src/java/org/apache/bcel/generic/LLOAD.java new file mode 100644 index 00000000..bd61c2bd --- /dev/null +++ b/src/java/org/apache/bcel/generic/LLOAD.java @@ -0,0 +1,89 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LLOAD - Load long from local variable + *
        Stack ... -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LLOAD extends LoadInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LLOAD() { + super(org.apache.bcel.Constants.LLOAD, org.apache.bcel.Constants.LLOAD_0); + } + + public LLOAD(int n) { + super(org.apache.bcel.Constants.LLOAD, org.apache.bcel.Constants.LLOAD_0, n); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + super.accept(v); + v.visitLLOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LMUL.java b/src/java/org/apache/bcel/generic/LMUL.java new file mode 100644 index 00000000..c7c6dd50 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LMUL.java @@ -0,0 +1,86 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LMUL - Multiply longs + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result.word1, result.word2 + * + * @version $Id$ + * @author M. Dahm + */ +public class LMUL extends ArithmeticInstruction { + public LMUL() { + super(org.apache.bcel.Constants.LMUL); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLMUL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LNEG.java b/src/java/org/apache/bcel/generic/LNEG.java new file mode 100644 index 00000000..ae43ce81 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LNEG.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LNEG - Negate long + *
        Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LNEG extends ArithmeticInstruction { + public LNEG() { + super(org.apache.bcel.Constants.LNEG); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLNEG(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java new file mode 100644 index 00000000..af87245a --- /dev/null +++ b/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java @@ -0,0 +1,133 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * LOOKUPSWITCH - Switch with unordered set of values + * + * @version $Id$ + * @author M. Dahm + * @see SWITCH + */ +public class LOOKUPSWITCH extends Select { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LOOKUPSWITCH() {} + + public LOOKUPSWITCH(int[] match, InstructionHandle[] targets, + InstructionHandle target) { + super(org.apache.bcel.Constants.LOOKUPSWITCH, match, targets, target); + + length = (short)(9 + match_length * 8); /* alignment remainder assumed + * 0 here, until dump time. */ + fixed_length = length; + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + super.dump(out); + out.writeInt(match_length); // npairs + + for(int i=0; i < match_length; i++) { + out.writeInt(match[i]); // match-offset pairs + out.writeInt(indices[i] = getTargetOffset(targets[i])); + } + } + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException + { + super.initFromFile(bytes, wide); // reads padding + + match_length = bytes.readInt(); + fixed_length = (short)(9 + match_length * 8); + length = (short)(fixed_length + padding); + + match = new int[match_length]; + indices = new int[match_length]; + targets = new InstructionHandle[match_length]; + + for(int i=0; i < match_length; i++) { + match[i] = bytes.readInt(); + indices[i] = bytes.readInt(); + } + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitVariableLengthInstruction(this); + v.visitStackProducer(this); + v.visitBranchInstruction(this); + v.visitSelect(this); + v.visitLOOKUPSWITCH(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LOR.java b/src/java/org/apache/bcel/generic/LOR.java new file mode 100644 index 00000000..4eda00d1 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LOR.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LOR - Bitwise OR long + *
        Stack: ..., value1, value2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LOR extends ArithmeticInstruction { + public LOR() { + super(org.apache.bcel.Constants.LOR); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLOR(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LREM.java b/src/java/org/apache/bcel/generic/LREM.java new file mode 100644 index 00000000..f985c275 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LREM.java @@ -0,0 +1,88 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LREM - Remainder of long + *
        Stack: ..., value1, value2 -> result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LREM extends ArithmeticInstruction implements ExceptionThrower { + public LREM() { + super(org.apache.bcel.Constants.LREM); + } + + public Class[] getExceptions() { return new Class[] { org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION }; } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLREM(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LRETURN.java b/src/java/org/apache/bcel/generic/LRETURN.java new file mode 100644 index 00000000..090206a6 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LRETURN.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LRETURN - Return long from method + *
        Stack: ..., value.word1, value.word2 -> <empty>
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LRETURN extends ReturnInstruction { + public LRETURN() { + super(org.apache.bcel.Constants.LRETURN); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitReturnInstruction(this); + v.visitLRETURN(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LSHL.java b/src/java/org/apache/bcel/generic/LSHL.java new file mode 100644 index 00000000..25eb8a36 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LSHL.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LSHL - Arithmetic shift left long + *
        Stack: ..., value1.word1, value1.word2, value2 -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LSHL extends ArithmeticInstruction { + public LSHL() { + super(org.apache.bcel.Constants.LSHL); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLSHL(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LSHR.java b/src/java/org/apache/bcel/generic/LSHR.java new file mode 100644 index 00000000..73fdc0a1 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LSHR.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LSHR - Arithmetic shift right long + *
        Stack: ..., value1.word1, value1.word2, value2 -> ..., result.word1, result.word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LSHR extends ArithmeticInstruction { + public LSHR() { + super(org.apache.bcel.Constants.LSHR); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLSHR(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LSTORE.java b/src/java/org/apache/bcel/generic/LSTORE.java new file mode 100644 index 00000000..0f9ad29d --- /dev/null +++ b/src/java/org/apache/bcel/generic/LSTORE.java @@ -0,0 +1,89 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LSTORE - Store long into local variable + *
        Stack: ..., value.word1, value.word2 -> ... 
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LSTORE extends StoreInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LSTORE() { + super(org.apache.bcel.Constants.LSTORE, org.apache.bcel.Constants.LSTORE_0); + } + + public LSTORE(int n) { + super(org.apache.bcel.Constants.LSTORE, org.apache.bcel.Constants.LSTORE_0, n); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + super.accept(v); + v.visitLSTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LSUB.java b/src/java/org/apache/bcel/generic/LSUB.java new file mode 100644 index 00000000..1863abfe --- /dev/null +++ b/src/java/org/apache/bcel/generic/LSUB.java @@ -0,0 +1,86 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LSUB - Substract longs + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        + * ..., result.word1, result.word2 + * + * @version $Id$ + * @author M. Dahm + */ +public class LSUB extends ArithmeticInstruction { + public LSUB() { + super(org.apache.bcel.Constants.LSUB); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLSUB(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LUSHR.java b/src/java/org/apache/bcel/generic/LUSHR.java new file mode 100644 index 00000000..fdc2f97d --- /dev/null +++ b/src/java/org/apache/bcel/generic/LUSHR.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LUSHR - Logical shift right long + *
        Stack: ..., value1, value2 -> ..., result
        + * + * @version $Id$ + * @author M. Dahm + */ +public class LUSHR extends ArithmeticInstruction { + public LUSHR() { + super(org.apache.bcel.Constants.LUSHR); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLUSHR(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LXOR.java b/src/java/org/apache/bcel/generic/LXOR.java new file mode 100644 index 00000000..8e72cf12 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LXOR.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * LXOR - Bitwise XOR long + *
        Stack: ..., value1, value2 -> ..., result
        + * + * @version $Id$ + * @authXOR M. Dahm + */ +public class LXOR extends ArithmeticInstruction { + public LXOR() { + super(org.apache.bcel.Constants.LXOR); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLXOR(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LineNumberGen.java b/src/java/org/apache/bcel/generic/LineNumberGen.java new file mode 100644 index 00000000..38ed2fa0 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LineNumberGen.java @@ -0,0 +1,130 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.*; + +/** + * This class represents a line number within a method, i.e., give an instruction + * a line number corresponding to the source code line. + * + * @version $Id$ + * @author M. Dahm + * @see LineNumber + * @see MethodGen + */ +public class LineNumberGen implements InstructionTargeter, Cloneable { + private InstructionHandle ih; + private int src_line; + + /** + * Create a line number. + * + * @param ih instruction handle to reference + * @return new line number object + */ + public LineNumberGen(InstructionHandle ih, int src_line) { + setInstruction(ih); + setSourceLine(src_line); + } + + /** + * @return true, if ih is target of this line number + */ + public boolean containsTarget(InstructionHandle ih) { + return this.ih == ih; + } + + /** + * @param old_ih old target + * @param new_ih new target + */ + public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { + if(old_ih != ih) + throw new ClassGenException("Not targeting " + old_ih + ", but " + ih + "}"); + else + setInstruction(new_ih); + } + + /** + * Get LineNumber attribute . + * + * This relies on that the instruction list has already been dumped to byte code or + * or that the `setPositions' methods has been called for the instruction list. + */ + public LineNumber getLineNumber() { + return new LineNumber(ih.getPosition(), src_line); + } + + public void setInstruction(InstructionHandle ih) { + BranchInstruction.notifyTarget(this.ih, ih, this); + + this.ih = ih; + } + + public Object clone() { + try { + return super.clone(); + } catch(CloneNotSupportedException e) { + System.err.println(e); + return null; + } + } + + public InstructionHandle getInstruction() { return ih; } + public void setSourceLine(int src_line) { this.src_line = src_line; } + public int getSourceLine() { return src_line; } +} diff --git a/src/java/org/apache/bcel/generic/LoadClass.java b/src/java/org/apache/bcel/generic/LoadClass.java new file mode 100644 index 00000000..7226d56a --- /dev/null +++ b/src/java/org/apache/bcel/generic/LoadClass.java @@ -0,0 +1,86 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denotes that an instruction may start the process of loading and resolving + * the referenced class in the Virtual Machine. + * + * @version $Id$ + * @author M. Dahm + */ +public interface LoadClass { + /** + * Returns the ObjectType of the referenced class or interface + * that may be loaded and resolved. + * @return object type that may be loaded or null if a primitive is + * referenced + */ + public ObjectType getLoadClassType(ConstantPoolGen cpg); + + /** + * Returns the type associated with this instruction. + * LoadClass instances are always typed, but this type + * does not always refer to the type of the class or interface + * that it possibly forces to load. For example, GETFIELD would + * return the type of the field and not the type of the class + * where the field is defined. + * If no class is forced to be loaded, null is returned. + * An example for this is an ANEWARRAY instruction that creates + * an int[][]. + * @see #getLoadClassType(ConstantPoolGen) + */ + public Type getType(ConstantPoolGen cpg); +} diff --git a/src/java/org/apache/bcel/generic/LoadInstruction.java b/src/java/org/apache/bcel/generic/LoadInstruction.java new file mode 100644 index 00000000..34f20ad1 --- /dev/null +++ b/src/java/org/apache/bcel/generic/LoadInstruction.java @@ -0,0 +1,101 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denotes an unparameterized instruction to load a value from a local + * variable, e.g. ILOAD. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class LoadInstruction extends LocalVariableInstruction + implements PushInstruction +{ + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + * tag and length are defined in readInstruction and initFromFile, respectively. + */ + LoadInstruction(short canon_tag, short c_tag) { + super(canon_tag, c_tag); + } + + /** + * @param opcode Instruction opcode + * @param c_tag Instruction number for compact version, ALOAD_0, e.g. + * @param n local variable index (unsigned short) + */ + protected LoadInstruction(short opcode, short c_tag, int n) { + super(opcode, c_tag, n); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitTypedInstruction(this); + v.visitLocalVariableInstruction(this); + v.visitLoadInstruction(this); + } +} + diff --git a/src/java/org/apache/bcel/generic/LocalVariableGen.java b/src/java/org/apache/bcel/generic/LocalVariableGen.java new file mode 100644 index 00000000..482848ff --- /dev/null +++ b/src/java/org/apache/bcel/generic/LocalVariableGen.java @@ -0,0 +1,191 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.*; + +/** + * This class represents a local variable within a method. It contains its + * scope, name and type. The generated LocalVariable object can be obtained + * with getLocalVariable which needs the instruction list and the constant + * pool as parameters. + * + * @version $Id$ + * @author M. Dahm + * @see LocalVariable + * @see MethodGen + */ +public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Cloneable { + private int index; + private String name; + private Type type; + private InstructionHandle start, end; + + /** + * Generate a local variable that with index `index'. Note that double and long + * variables need two indexs. Index indices have to be provided by the user. + * + * @param index index of local variable + * @param name its name + * @param type its type + * @param start from where the instruction is valid (null means from the start) + * @param end until where the instruction is valid (null means to the end) + */ + public LocalVariableGen(int index, String name, Type type, + InstructionHandle start, InstructionHandle end) { + if((index < 0) || (index > Constants.MAX_SHORT)) + throw new ClassGenException("Invalid index index: " + index); + + this.name = name; + this.type = type; + this.index = index; + setStart(start); + setEnd(end); + } + + /** + * Get LocalVariable object. + * + * This relies on that the instruction list has already been dumped to byte code or + * or that the `setPositions' methods has been called for the instruction list. + * + * @param il instruction list (byte code) which this variable belongs to + * @param cp constant pool + */ + public LocalVariable getLocalVariable(ConstantPoolGen cp) { + int start_pc = start.getPosition(); + int length = end.getPosition() - start_pc; + int name_index = cp.addUtf8(name); + int signature_index = cp.addUtf8(type.getSignature()); + + return new LocalVariable(start_pc, length, name_index, + signature_index, index, cp.getConstantPool()); + } + + public void setIndex(int index) { this.index = index; } + public int getIndex() { return index; } + public void setName(String name) { this.name = name; } + public String getName() { return name; } + public void setType(Type type) { this.type = type; } + public Type getType() { return type; } + + public InstructionHandle getStart() { return start; } + public InstructionHandle getEnd() { return end; } + + public void setStart(InstructionHandle start) { + BranchInstruction.notifyTarget(this.start, start, this); + this.start = start; + } + + public void setEnd(InstructionHandle end) { + BranchInstruction.notifyTarget(this.end, end, this); + this.end = end; + } + + /** + * @param old_ih old target, either start or end + * @param new_ih new target + */ + public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { + boolean targeted = false; + + if(start == old_ih) { + targeted = true; + setStart(new_ih); + } + + if(end == old_ih) { + targeted = true; + setEnd(new_ih); + } + + if(!targeted) + throw new ClassGenException("Not targeting " + old_ih + ", but {" + start + ", " + + end + "}"); + } + + /** + * @return true, if ih is target of this variable + */ + public boolean containsTarget(InstructionHandle ih) { + return (start == ih) || (end == ih); + } + + /** + * We consider to local variables to be equal, if the use the same index and + * are valid in the same range. + */ + public boolean equals(Object o) { + if(!(o instanceof LocalVariableGen)) + return false; + + LocalVariableGen l = (LocalVariableGen)o; + return (l.index == index) && (l.start == start) && (l.end == end); + } + + public String toString() { + return "LocalVariableGen(" + name + ", " + type + ", " + start + ", " + end + ")"; + } + + public Object clone() { + try { + return super.clone(); + } catch(CloneNotSupportedException e) { + System.err.println(e); + return null; + } + } +} diff --git a/src/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/java/org/apache/bcel/generic/LocalVariableInstruction.java new file mode 100644 index 00000000..74db9c2b --- /dev/null +++ b/src/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -0,0 +1,227 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.util.ByteSequence; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.Constants; + +/** + * Abstract super class for instructions dealing with local variables. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class LocalVariableInstruction extends Instruction + implements TypedInstruction, IndexedInstruction { + protected int n = -1; // index of referenced variable + private short c_tag = -1; // compact version, such as ILOAD_0 + private short canon_tag = -1; // canonical tag such as ILOAD + + private final boolean wide() { return n > Constants.MAX_BYTE; } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + * tag and length are defined in readInstruction and initFromFile, respectively. + */ + LocalVariableInstruction(short canon_tag, short c_tag) { + super(); + this.canon_tag = canon_tag; + this.c_tag = c_tag; + } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Also used by IINC()! + */ + LocalVariableInstruction() { + } + + /** + * @param opcode Instruction opcode + * @param c_tag Instruction number for compact version, ALOAD_0, e.g. + * @param n local variable index (unsigned short) + */ + protected LocalVariableInstruction(short opcode, short c_tag, int n) { + super(opcode, (short)2); + + this.c_tag = c_tag; + canon_tag = opcode; + + setIndex(n); + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + if(wide()) // Need WIDE prefix ? + out.writeByte(Constants.WIDE); + + out.writeByte(opcode); + + if(length > 1) { // Otherwise ILOAD_n, instruction, e.g. + if(wide()) + out.writeShort(n); + else + out.writeByte(n); + } + } + + /** + * Long output format: + * + * <name of opcode> "["<opcode number>"]" + * "("<length of instruction>")" "<"< local variable index>">" + * + * @param verbose long/short format switch + * @return mnemonic for instruction + */ + public String toString(boolean verbose) { + if(((opcode >= Constants.ILOAD_0) && + (opcode <= Constants.ALOAD_3)) || + ((opcode >= Constants.ISTORE_0) && + (opcode <= Constants.ASTORE_3))) + return super.toString(verbose); + else + return super.toString(verbose) + " " + n; + } + + /** + * Read needed data (e.g. index) from file. + * PRE: (ILOAD <= tag <= ALOAD_3) || (ISTORE <= tag <= ASTORE_3) + */ + protected void initFromFile(ByteSequence bytes, boolean wide) + throws IOException + { + if(wide) { + n = bytes.readUnsignedShort(); + length = 4; + } else if(((opcode >= Constants.ILOAD) && + (opcode <= Constants.ALOAD)) || + ((opcode >= Constants.ISTORE) && + (opcode <= Constants.ASTORE))) { + n = bytes.readUnsignedByte(); + length = 2; + } else if(opcode <= Constants.ALOAD_3) { // compact load instruction such as ILOAD_2 + n = (opcode - Constants.ILOAD_0) % 4; + length = 1; + } else { // Assert ISTORE_0 <= tag <= ASTORE_3 + n = (opcode - Constants.ISTORE_0) % 4; + length = 1; + } + } + + /** + * @return local variable index referred by this instruction. + */ + public final int getIndex() { return n; } + + /** + * Set the local variable index + */ + public void setIndex(int n) { + if((n < 0) || (n > Constants.MAX_SHORT)) + throw new ClassGenException("Illegal value: " + n); + + this.n = n; + + if(n >= 0 && n <= 3) { // Use more compact instruction xLOAD_n + opcode = (short)(c_tag + n); + length = 1; + } else { + opcode = canon_tag; + + if(wide()) // Need WIDE prefix ? + length = 4; + else + length = 2; + } + } + + /** @return canonical tag for instruction, e.g., ALOAD for ALOAD_0 + */ + public short getCanonicalTag() { + return canon_tag; + } + + /** + * Returns the type associated with the instruction - + * in case of ALOAD or ASTORE Type.OBJECT is returned. + * This is just a bit incorrect, because ALOAD and ASTORE + * may work on every ReferenceType (including Type.NULL) and + * ASTORE may even work on a ReturnaddressType . + * @return type associated with the instruction + */ + public Type getType(ConstantPoolGen cp) { + switch(canon_tag) { + case Constants.ILOAD: case Constants.ISTORE: + return Type.INT; + case Constants.LLOAD: case Constants.LSTORE: + return Type.LONG; + case Constants.DLOAD: case Constants.DSTORE: + return Type.DOUBLE; + case Constants.FLOAD: case Constants.FSTORE: + return Type.FLOAT; + case Constants.ALOAD: case Constants.ASTORE: + return Type.OBJECT; + + default: throw new ClassGenException("Oops: unknown case in switch" + canon_tag); + } + } +} + diff --git a/src/java/org/apache/bcel/generic/MONITORENTER.java b/src/java/org/apache/bcel/generic/MONITORENTER.java new file mode 100644 index 00000000..5f023f47 --- /dev/null +++ b/src/java/org/apache/bcel/generic/MONITORENTER.java @@ -0,0 +1,88 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * MONITORENTER - Enter monitor for object + *
        Stack: ..., objectref -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class MONITORENTER extends Instruction + implements ExceptionThrower, StackConsumer { + public MONITORENTER() { + super(org.apache.bcel.Constants.MONITORENTER, (short)1); + } + + public Class[] getExceptions() { + return new Class[] { org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION }; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitStackConsumer(this); + v.visitMONITORENTER(this); + } +} diff --git a/src/java/org/apache/bcel/generic/MONITOREXIT.java b/src/java/org/apache/bcel/generic/MONITOREXIT.java new file mode 100644 index 00000000..c3bb27a6 --- /dev/null +++ b/src/java/org/apache/bcel/generic/MONITOREXIT.java @@ -0,0 +1,88 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * MONITOREXIT - Exit monitor for object + *
        Stack: ..., objectref -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class MONITOREXIT extends Instruction + implements ExceptionThrower, StackConsumer { + public MONITOREXIT() { + super(org.apache.bcel.Constants.MONITOREXIT, (short)1); + } + + public Class[] getExceptions() { + return new Class[] { org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION }; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitStackConsumer(this); + v.visitMONITOREXIT(this); + } +} diff --git a/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java new file mode 100644 index 00000000..039c4ece --- /dev/null +++ b/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java @@ -0,0 +1,172 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.util.ByteSequence; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.ExceptionConstants; + +/** + * MULTIANEWARRAY - Create new mutidimensional array of references + *
        Stack: ..., count1, [count2, ...] -> ..., arrayref
        + * + * @version $Id$ + * @author M. Dahm + */ +public class MULTIANEWARRAY extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower { + private short dimensions; + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + MULTIANEWARRAY() {} + + public MULTIANEWARRAY(int index, short dimensions) { + super(org.apache.bcel.Constants.MULTIANEWARRAY, index); + + if(dimensions < 1) + throw new ClassGenException("Invalid dimensions value: " + dimensions); + + this.dimensions = dimensions; + length = 4; + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + out.writeByte(opcode); + out.writeShort(index); + out.writeByte(dimensions); + } + + /** + * Read needed data (i.e., no. dimension) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) + throws IOException + { + super.initFromFile(bytes, wide); + dimensions = bytes.readByte(); + length = 4; + } + + /** + * @return number of dimensions to be created + */ + public final short getDimensions() { return dimensions; } + + /** + * @return mnemonic for instruction + */ + public String toString(boolean verbose) { + return super.toString(verbose) + " " + index + " " + dimensions; + } + + /** + * @return mnemonic for instruction with symbolic references resolved + */ + public String toString(ConstantPool cp) { + return super.toString(cp) + " " + dimensions; + } + + /** + * Also works for instructions whose stack effect depends on the + * constant pool entry they reference. + * @return Number of words consumed from stack by this instruction + */ + public int consumeStack(ConstantPoolGen cpg) { return dimensions; } + + public Class[] getExceptions() { + Class[] cs = new Class[2 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; + + System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, + cs, 0, ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); + + cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length+1] = ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION; + cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; + + return cs; + } + + public ObjectType getLoadClassType(ConstantPoolGen cpg) { + Type t = getType(cpg); + + if (t instanceof ArrayType){ + t = ((ArrayType) t).getBasicType(); + } + + return (t instanceof ObjectType)? (ObjectType) t : null; + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitLoadClass(this); + v.visitAllocationInstruction(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitMULTIANEWARRAY(this); + } +} diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java new file mode 100644 index 00000000..fb379a00 --- /dev/null +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -0,0 +1,938 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.*; +import java.util.*; + +/** + * Template class for building up a method. This is done by defining exception + * handlers, adding thrown exceptions, local variables and attributes, whereas + * the `LocalVariableTable' and `LineNumberTable' attributes will be set + * automatically for the code. Use stripAttributes() if you don't like this. + * + * While generating code it may be necessary to insert NOP operations. You can + * use the `removeNOPs' method to get rid off them. + * The resulting method object can be obtained via the `getMethod()' method. + * + * @version $Id$ + * @author M. Dahm + * @author Patrick C. Beard + * @see InstructionList + * @see Method + */ +public class MethodGen extends FieldGenOrMethodGen { + private String class_name; + private Type[] arg_types; + private String[] arg_names; + private int max_locals; + private int max_stack; + private InstructionList il; + private boolean strip_attributes; + + private ArrayList variable_vec = new ArrayList(); + private ArrayList line_number_vec = new ArrayList(); + private ArrayList exception_vec = new ArrayList(); + private ArrayList throws_vec = new ArrayList(); + private ArrayList code_attrs_vec = new ArrayList(); + + /** + * Declare method. If the method is non-static the constructor + * automatically declares a local variable `$this' in slot 0. The + * actual code is contained in the `il' parameter, which may further + * manipulated by the user. But he must take care not to remove any + * instruction (handles) that are still referenced from this object. + * + * For example one may not add a local variable and later remove the + * instructions it refers to without causing havoc. It is safe + * however if you remove that local variable, too. + * + * @param access_flags access qualifiers + * @param return_type method type + * @param arg_types argument types + * @param arg_names argument names (if this is null, default names will be provided + * for them) + * @param method_name name of method + * @param class_name class name containing this method (may be null, if you don't care) + * @param il instruction list associated with this method, may be null only for + * abstract or native methods + * @param cp constant pool + */ + public MethodGen(int access_flags, Type return_type, Type[] arg_types, + String[] arg_names, String method_name, String class_name, + InstructionList il, ConstantPoolGen cp) { + setAccessFlags(access_flags); + setType(return_type); + setArgumentTypes(arg_types); + setArgumentNames(arg_names); + setName(method_name); + setClassName(class_name); + setInstructionList(il); + setConstantPool(cp); + + if((access_flags & (Constants.ACC_ABSTRACT | Constants.ACC_NATIVE)) == 0) { + InstructionHandle start = il.getStart(); + InstructionHandle end = il.getEnd(); + + /* Add local variables, namely the implicit `this' and the arguments + */ + if(!isStatic() && (class_name != null)) // Instance method -> `this' is local var 0 + addLocalVariable("this", new ObjectType(class_name), start, end); + + if(arg_types != null) { + int size = arg_types.length; + + if(arg_names != null) { // Names for variables provided? + if(size != arg_names.length) + throw new ClassGenException("Mismatch in argument array lengths: " + + size + " vs. " + arg_names.length); + } else { // Give them dummy names + arg_names = new String[size]; + + for(int i=0; i < size; i++) + arg_names[i] = "arg" + i; + + setArgumentNames(arg_names); + } + + for(int i=0; i < size; i++) + addLocalVariable(arg_names[i], arg_types[i], start, end); + } + } + } + + /** + * Instantiate from existing method. + * + * @param m method + * @param class_name class name containing this method + * @param cp constant pool + */ + public MethodGen(Method m, String class_name, ConstantPoolGen cp) { + this(m.getAccessFlags(), Type.getReturnType(m.getSignature()), + Type.getArgumentTypes(m.getSignature()), null /* may be overridden anyway */, + m.getName(), class_name, + ((m.getAccessFlags() & (Constants.ACC_ABSTRACT | Constants.ACC_NATIVE)) == 0)? + new InstructionList(m.getCode().getCode()) : null, + cp); + + Attribute[] attributes = m.getAttributes(); + for(int i=0; i < attributes.length; i++) { + Attribute a = attributes[i]; + + if(a instanceof Code) { + Code c = (Code)a; + setMaxStack(c.getMaxStack()); + setMaxLocals(c.getMaxLocals()); + + CodeException[] ces = c.getExceptionTable(); + + if(ces != null) { + for(int j=0; j < ces.length; j++) { + CodeException ce = ces[j]; + int type = ce.getCatchType(); + ObjectType c_type = null; + + if(type > 0) { + String cen = m.getConstantPool().getConstantString(type, Constants.CONSTANT_Class); + c_type = new ObjectType(cen); + } + + int end_pc = ce.getEndPC(); + int length = m.getCode().getCode().length; + + InstructionHandle end; + + if(length == end_pc) { // May happen, because end_pc is exclusive + end = il.getEnd(); + } else { + end = il.findHandle(end_pc); + end = end.getPrev(); // Make it inclusive + } + + addExceptionHandler(il.findHandle(ce.getStartPC()), end, + il.findHandle(ce.getHandlerPC()), c_type); + } + } + + Attribute[] c_attributes = c.getAttributes(); + for(int j=0; j < c_attributes.length; j++) { + a = c_attributes[j]; + + if(a instanceof LineNumberTable) { + LineNumber[] ln = ((LineNumberTable)a).getLineNumberTable(); + for(int k=0; k < ln.length; k++) { + LineNumber l = ln[k]; + addLineNumber(il.findHandle(l.getStartPC()), l.getLineNumber()); + } + } else if(a instanceof LocalVariableTable) { + LocalVariable[] lv = ((LocalVariableTable)a).getLocalVariableTable(); + for(int k=0; k < lv.length; k++) { + LocalVariable l = lv[k]; + InstructionHandle start = il.findHandle(l.getStartPC()); + InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength()); + + // Repair malformed handles + if(start == null) + start = il.getStart(); + if(end == null) + end = il.getEnd(); + + addLocalVariable(l.getName(), Type.getType(l.getSignature()), + l.getIndex(), start, end); + } + } else + addCodeAttribute(a); + } + } else if(a instanceof ExceptionTable) { + String[] names = ((ExceptionTable)a).getExceptionNames(); + for(int j=0; j < names.length; j++) + addException(names[j]); + } else + addAttribute(a); + } + } + + /** + * Adds a local variable to this method. + * + * @param name variable name + * @param type variable type + * @param slot the index of the local variable, if type is long or double, the next available + * index is slot+2 + * @param start from where the variable is valid + * @param end until where the variable is valid + * @return new local variable object + * @see LocalVariable + */ + public LocalVariableGen addLocalVariable(String name, Type type, int slot, + InstructionHandle start, + InstructionHandle end) { + byte t = type.getType(); + int add = type.getSize(); + + if(slot + add > max_locals) + max_locals = slot + add; + + LocalVariableGen l = new LocalVariableGen(slot, name, type, start, end); + int i; + + if((i = variable_vec.indexOf(l)) >= 0) // Overwrite if necessary + variable_vec.set(i, l); + else + variable_vec.add(l); + return l; + } + + /** + * Adds a local variable to this method and assigns an index automatically. + * + * @param name variable name + * @param type variable type + * @param start from where the variable is valid, if this is null, + * it is valid from the start + * @param end until where the variable is valid, if this is null, + * it is valid to the end + * @return new local variable object + * @see LocalVariable + */ + public LocalVariableGen addLocalVariable(String name, Type type, + InstructionHandle start, + InstructionHandle end) { + return addLocalVariable(name, type, max_locals, start, end); + } + + /** + * Remove a local variable, its slot will not be reused, if you do not use addLocalVariable + * with an explicit index argument. + */ + public void removeLocalVariable(LocalVariableGen l) { + variable_vec.remove(l); + } + + /** + * Remove all local variables. + */ + public void removeLocalVariables() { + variable_vec.clear(); + } + + /** + * Sort local variables by index + */ + private static final void sort(LocalVariableGen[] vars, int l, int r) { + int i = l, j = r; + int m = vars[(l + r) / 2].getIndex(); + LocalVariableGen h; + + do { + while(vars[i].getIndex() < m) i++; + while(m < vars[j].getIndex()) j--; + + if(i <= j) { + h=vars[i]; vars[i]=vars[j]; vars[j]=h; // Swap elements + i++; j--; + } + } while(i <= j); + + if(l < j) sort(vars, l, j); + if(i < r) sort(vars, i, r); + } + + /* + * If the range of the variable has not been set yet, it will be set to be valid from + * the start to the end of the instruction list. + * + * @return array of declared local variables sorted by index + */ + public LocalVariableGen[] getLocalVariables() { + int size = variable_vec.size(); + LocalVariableGen[] lg = new LocalVariableGen[size]; + variable_vec.toArray(lg); + + for(int i=0; i < size; i++) { + if(lg[i].getStart() == null) + lg[i].setStart(il.getStart()); + + if(lg[i].getEnd() == null) + lg[i].setEnd(il.getEnd()); + } + + if(size > 1) + sort(lg, 0, size - 1); + + return lg; + } + + /** + * @return `LocalVariableTable' attribute of all the local variables of this method. + */ + public LocalVariableTable getLocalVariableTable(ConstantPoolGen cp) { + LocalVariableGen[] lg = getLocalVariables(); + int size = lg.length; + LocalVariable[] lv = new LocalVariable[size]; + + for(int i=0; i < size; i++) + lv[i] = lg[i].getLocalVariable(cp); + + return new LocalVariableTable(cp.addUtf8("LocalVariableTable"), + 2 + lv.length * 10, lv, cp.getConstantPool()); + } + + /** + * Give an instruction a line number corresponding to the source code line. + * + * @param ih instruction to tag + * @return new line number object + * @see LineNumber + */ + public LineNumberGen addLineNumber(InstructionHandle ih, int src_line) { + LineNumberGen l = new LineNumberGen(ih, src_line); + line_number_vec.add(l); + return l; + } + + /** + * Remove a line number. + */ + public void removeLineNumber(LineNumberGen l) { + line_number_vec.remove(l); + } + + /** + * Remove all line numbers. + */ + public void removeLineNumbers() { + line_number_vec.clear(); + } + + /* + * @return array of line numbers + */ + public LineNumberGen[] getLineNumbers() { + LineNumberGen[] lg = new LineNumberGen[line_number_vec.size()]; + line_number_vec.toArray(lg); + return lg; + } + + /** + * @return `LineNumberTable' attribute of all the local variables of this method. + */ + public LineNumberTable getLineNumberTable(ConstantPoolGen cp) { + int size = line_number_vec.size(); + LineNumber[] ln = new LineNumber[size]; + + try { + for(int i=0; i < size; i++) + ln[i] = ((LineNumberGen)line_number_vec.get(i)).getLineNumber(); + } catch(ArrayIndexOutOfBoundsException e) {} // Never occurs + + return new LineNumberTable(cp.addUtf8("LineNumberTable"), + 2 + ln.length * 4, ln, cp.getConstantPool()); + } + + /** + * Add an exception handler, i.e., specify region where a handler is active and an + * instruction where the actual handling is done. + * + * @param start_pc Start of region (inclusive) + * @param end_pc End of region (inclusive) + * @param handler_pc Where handling is done + * @param catch_type fully qualified class name of handled exception or null if any + * exception is handled + * @return new exception handler object + */ + public CodeExceptionGen addExceptionHandler(InstructionHandle start_pc, + InstructionHandle end_pc, + InstructionHandle handler_pc, + ObjectType catch_type) { + if((start_pc == null) || (end_pc == null) || (handler_pc == null)) + throw new ClassGenException("Exception handler target is null instruction"); + + CodeExceptionGen c = new CodeExceptionGen(start_pc, end_pc, + handler_pc, catch_type); + exception_vec.add(c); + return c; + } + + /** + * Remove an exception handler. + */ + public void removeExceptionHandler(CodeExceptionGen c) { + exception_vec.remove(c); + } + + /** + * Remove all line numbers. + */ + public void removeExceptionHandlers() { + exception_vec.clear(); + } + + /* + * @return array of declared exception handlers + */ + public CodeExceptionGen[] getExceptionHandlers() { + CodeExceptionGen[] cg = new CodeExceptionGen[exception_vec.size()]; + exception_vec.toArray(cg); + return cg; + } + + /** + * @return code exceptions for `Code' attribute + */ + private CodeException[] getCodeExceptions() { + int size = exception_vec.size(); + CodeException[] c_exc = new CodeException[size]; + + try { + for(int i=0; i < size; i++) { + CodeExceptionGen c = (CodeExceptionGen)exception_vec.get(i); + c_exc[i] = c.getCodeException(cp); + } + } catch(ArrayIndexOutOfBoundsException e) {} + + return c_exc; + } + + /** + * Add an exception possibly thrown by this method. + * + * @param class_name (fully qualified) name of exception + */ + public void addException(String class_name) { + throws_vec.add(class_name); + } + + /** + * Remove an exception. + */ + public void removeException(String c) { + throws_vec.remove(c); + } + + /** + * Remove all exceptions. + */ + public void removeExceptions() { + throws_vec.clear(); + } + + /* + * @return array of thrown exceptions + */ + public String[] getExceptions() { + String[] e = new String[throws_vec.size()]; + throws_vec.toArray(e); + return e; + } + + /** + * @return `Exceptions' attribute of all the exceptions thrown by this method. + */ + private ExceptionTable getExceptionTable(ConstantPoolGen cp) { + int size = throws_vec.size(); + int[] ex = new int[size]; + + try { + for(int i=0; i < size; i++) + ex[i] = cp.addClass((String)throws_vec.get(i)); + } catch(ArrayIndexOutOfBoundsException e) {} + + return new ExceptionTable(cp.addUtf8("Exceptions"), + 2 + 2 * size, ex, cp.getConstantPool()); + } + + /** + * Add an attribute to the code. Currently, the JVM knows about the + * LineNumberTable, LocalVariableTable and StackMap attributes, + * where the former two will be generated automatically and the + * latter is used for the MIDP only. Other attributes will be + * ignored by the JVM but do no harm. + * + * @param a attribute to be added + */ + public void addCodeAttribute(Attribute a) { code_attrs_vec.add(a); } + + /** + * Remove a code attribute. + */ + public void removeCodeAttribute(Attribute a) { code_attrs_vec.remove(a); } + + /** + * Remove all code attributes. + */ + public void removeCodeAttributes() { + code_attrs_vec.clear(); + } + + /** + * @return all attributes of this method. + */ + public Attribute[] getCodeAttributes() { + Attribute[] attributes = new Attribute[code_attrs_vec.size()]; + code_attrs_vec.toArray(attributes); + return attributes; + } + + /** + * Get method object. Never forget to call setMaxStack() or setMaxStack(max), respectively, + * before calling this method (the same applies for max locals). + * + * @return method object + */ + public Method getMethod() { + String signature = getSignature(); + int name_index = cp.addUtf8(name); + int signature_index = cp.addUtf8(signature); + + /* Also updates positions of instructions, i.e., their indices + */ + byte[] byte_code = null; + + if(il != null) + byte_code = il.getByteCode(); + + + LineNumberTable lnt = null; + LocalVariableTable lvt = null; + + /* Create LocalVariableTable and LineNumberTable attributes (for debuggers, e.g.) + */ + if((variable_vec.size() > 0) && !strip_attributes) + addCodeAttribute(lvt = getLocalVariableTable(cp)); + + if((line_number_vec.size() > 0) && !strip_attributes) + addCodeAttribute(lnt = getLineNumberTable(cp)); + + Attribute[] code_attrs = getCodeAttributes(); + + /* Each attribute causes 6 additional header bytes + */ + int attrs_len = 0; + for(int i=0; i < code_attrs.length; i++) + attrs_len += (code_attrs[i].getLength() + 6); + + CodeException[] c_exc = getCodeExceptions(); + int exc_len = c_exc.length * 8; // Every entry takes 8 bytes + + Code code = null; + if((il != null) && !isAbstract()) { + code = new Code(cp.addUtf8("Code"), + 8 + byte_code.length + // prologue byte code + 2 + exc_len + // exceptions + 2 + attrs_len, // attributes + max_stack, max_locals, + byte_code, c_exc, + code_attrs, + cp.getConstantPool()); + + addAttribute(code); + } + + ExceptionTable et = null; + + if(throws_vec.size() > 0) + addAttribute(et = getExceptionTable(cp)); // Add `Exceptions' if there are "throws" clauses + + Method m = new Method(access_flags, name_index, signature_index, + getAttributes(), cp.getConstantPool()); + + // Undo effects of adding attributes + if(lvt != null) removeCodeAttribute(lvt); + if(lnt != null) removeCodeAttribute(lnt); + if(code != null) removeAttribute(code); + if(et != null) removeAttribute(et); + + return m; + } + + /** + * Remove all NOPs from the instruction list (if possible) and update every + * object refering to them, i.e., branch instructions, local variables and + * exception handlers. + */ + public void removeNOPs() { + if(il != null) { + InstructionHandle next; + /* Check branch instructions. + */ + for(InstructionHandle ih = il.getStart(); ih != null; ih = next) { + next = ih.next; + + if((next != null) && (ih.getInstruction() instanceof NOP)) { + try { + il.delete(ih); + } catch(TargetLostException e) { + InstructionHandle[] targets = e.getTargets(); + + for(int i=0; i < targets.length; i++) { + InstructionTargeter[] targeters = targets[i].getTargeters(); + + for(int j=0; j < targeters.length; j++) + targeters[j].updateTarget(targets[i], next); + } + } + } + } + } + } + + /** + * Set maximum number of local variables. + */ + public void setMaxLocals(int m) { max_locals = m; } + public int getMaxLocals() { return max_locals; } + + /** + * Set maximum stack size for this method. + */ + public void setMaxStack(int m) { max_stack = m; } + public int getMaxStack() { return max_stack; } + + /** @return class that contains this method + */ + public String getClassName() { return class_name; } + public void setClassName(String class_name) { this.class_name = class_name; } + + public void setReturnType(Type return_type) { setType(return_type); } + public Type getReturnType() { return getType(); } + + public void setArgumentTypes(Type[] arg_types) { this.arg_types = arg_types; } + public Type[] getArgumentTypes() { return (Type[])arg_types.clone(); } + public void setArgumentType(int i, Type type) { arg_types[i] = type; } + public Type getArgumentType(int i) { return arg_types[i]; } + + public void setArgumentNames(String[] arg_names) { this.arg_names = arg_names; } + public String[] getArgumentNames() { return (String[])arg_names.clone(); } + public void setArgumentName(int i, String name) { arg_names[i] = name; } + public String getArgumentName(int i) { return arg_names[i]; } + + public InstructionList getInstructionList() { return il; } + public void setInstructionList(InstructionList il) { this.il = il; } + + public String getSignature() { + return Type.getMethodSignature(type, arg_types); + } + + /** + * Computes max. stack size by performing control flow analysis. + * @author Patrick C. Beard + */ + public void setMaxStack() { + if(il != null) + max_stack = getMaxStack(cp, il, getExceptionHandlers()); + else + max_stack = 0; + } + + /** + * Compute maximum number of local variables. + */ + public void setMaxLocals() { + if(il != null) { + int max = isStatic()? 0 : 1; + + if(arg_types != null) + for(int i=0; i < arg_types.length; i++) + max += arg_types[i].getSize(); + + for(InstructionHandle ih = il.getStart(); ih != null; ih = ih.getNext()) { + Instruction ins = ih.getInstruction(); + + if((ins instanceof LocalVariableInstruction) || + (ins instanceof RET) || (ins instanceof IINC)) + { + int index = ((IndexedInstruction)ins).getIndex() + + ((TypedInstruction)ins).getType(cp).getSize(); + + if(index > max) + max = index; + } + } + + max_locals = max; + } else + max_locals = 0; + } + + /** Do not/Do produce attributes code attributesLineNumberTable and + * LocalVariableTable, like javac -O + */ + public void stripAttributes(boolean flag) { strip_attributes = flag; } + + static final class BranchTarget { + InstructionHandle target; + int stackDepth; + + BranchTarget(InstructionHandle target, int stackDepth) { + this.target = target; + this.stackDepth = stackDepth; + } + } + + static final class BranchStack { + Stack branchTargets = new Stack(); + Hashtable visitedTargets = new Hashtable(); + + public void push(InstructionHandle target, int stackDepth) { + if(visited(target)) + return; + + branchTargets.push(visit(target, stackDepth)); + } + + public BranchTarget pop() { + if(!branchTargets.empty()) { + BranchTarget bt = (BranchTarget) branchTargets.pop(); + return bt; + } + + return null; + } + + private final BranchTarget visit(InstructionHandle target, int stackDepth) { + BranchTarget bt = new BranchTarget(target, stackDepth); + visitedTargets.put(target, bt); + + return bt; + } + + private final boolean visited(InstructionHandle target) { + return (visitedTargets.get(target) != null); + } + } + + /** + * Computes stack usage of an instruction list by performing control flow analysis. + * + * @return maximum stack depth used by method + */ + public static int getMaxStack(ConstantPoolGen cp, InstructionList il, CodeExceptionGen[] et) { + BranchStack branchTargets = new BranchStack(); + + /* Initially, populate the branch stack with the exception + * handlers, because these aren't (necessarily) branched to + * explicitly. in each case, the stack will have depth 1, + * containing the exception object. + */ + for (int i = 0; i < et.length; i++) { + InstructionHandle handler_pc = et[i].getHandlerPC(); + if (handler_pc != null) + branchTargets.push(handler_pc, 1); + } + + int stackDepth = 0, maxStackDepth = 0; + InstructionHandle ih = il.getStart(); + + while(ih != null) { + Instruction instruction = ih.getInstruction(); + short opcode = instruction.getOpcode(); + int delta = instruction.produceStack(cp) - instruction.consumeStack(cp); + + stackDepth += delta; + if(stackDepth > maxStackDepth) + maxStackDepth = stackDepth; + + // choose the next instruction based on whether current is a branch. + if(instruction instanceof BranchInstruction) { + BranchInstruction branch = (BranchInstruction) instruction; + if(instruction instanceof Select) { + // explore all of the select's targets. the default target is handled below. + Select select = (Select) branch; + InstructionHandle[] targets = select.getTargets(); + for (int i = 0; i < targets.length; i++) + branchTargets.push(targets[i], stackDepth); + // nothing to fall through to. + ih = null; + } else if(!(branch instanceof IfInstruction)) { + // if an instruction that comes back to following PC, + // push next instruction, with stack depth reduced by 1. + if(opcode == Constants.JSR || opcode == Constants.JSR_W) + branchTargets.push(ih.getNext(), stackDepth - 1); + ih = null; + } + // for all branches, the target of the branch is pushed on the branch stack. + // conditional branches have a fall through case, selects don't, and + // jsr/jsr_w return to the next instruction. + branchTargets.push(branch.getTarget(), stackDepth); + } else { + // check for instructions that terminate the method. + if(opcode == Constants.ATHROW || opcode == Constants.RET || + (opcode >= Constants.IRETURN && opcode <= Constants.RETURN)) + ih = null; + } + // normal case, go to the next instruction. + if(ih != null) + ih = ih.getNext(); + // if we have no more instructions, see if there are any deferred branches to explore. + if(ih == null) { + BranchTarget bt = branchTargets.pop(); + if (bt != null) { + ih = bt.target; + stackDepth = bt.stackDepth; + } + } + } + + return maxStackDepth; + } + + private ArrayList observers; + + /** Add observer for this object. + */ + public void addObserver(MethodObserver o) { + if(observers == null) + observers = new ArrayList(); + + observers.add(o); + } + + /** Remove observer for this object. + */ + public void removeObserver(MethodObserver o) { + if(observers != null) + observers.remove(o); + } + + /** Call notify() method on all observers. This method is not called + * automatically whenever the state has changed, but has to be + * called by the user after he has finished editing the object. + */ + public void update() { + if(observers != null) + for(Iterator e = observers.iterator(); e.hasNext(); ) + ((MethodObserver)e.next()).notify(this); + } + + /** + * Return string representation close to declaration format, + * `public static void main(String[]) throws IOException', e.g. + * + * @return String representation of the method. + */ + public final String toString() { + String access = Utility.accessToString(access_flags); + String signature = Type.getMethodSignature(type, arg_types); + + signature = Utility.methodSignatureToString(signature, name, access, + true, getLocalVariableTable(cp)); + + StringBuffer buf = new StringBuffer(signature); + + if(throws_vec.size() > 0) { + for(Iterator e = throws_vec.iterator(); e.hasNext(); ) + buf.append("\n\t\tthrows " + e.next()); + } + + return buf.toString(); + } + + /** @return deep copy of this method + */ + public MethodGen copy(String class_name, ConstantPoolGen cp) { + Method m = ((MethodGen)clone()).getMethod(); + MethodGen mg = new MethodGen(m, class_name, this.cp); + + if(this.cp != cp) { + mg.setConstantPool(cp); + mg.getInstructionList().replaceConstantPool(this.cp, cp); + } + + return mg; + } +} diff --git a/src/java/org/apache/bcel/generic/MethodObserver.java b/src/java/org/apache/bcel/generic/MethodObserver.java new file mode 100644 index 00000000..eab665eb --- /dev/null +++ b/src/java/org/apache/bcel/generic/MethodObserver.java @@ -0,0 +1,67 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Implement this interface if you're interested in changes to a MethodGen object + * and register yourself with addObserver(). + * + * @version $Id$ + * @author M. Dahm + */ +public interface MethodObserver { + public void notify(MethodGen method); +} + diff --git a/src/java/org/apache/bcel/generic/NEW.java b/src/java/org/apache/bcel/generic/NEW.java new file mode 100644 index 00000000..f59e4633 --- /dev/null +++ b/src/java/org/apache/bcel/generic/NEW.java @@ -0,0 +1,111 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.ExceptionConstants; + +/** + * NEW - Create new object + *
        Stack: ... -> ..., objectref
        + * + * @version $Id$ + * @author M. Dahm + */ +public class NEW extends CPInstruction + implements LoadClass, AllocationInstruction, ExceptionThrower, StackProducer { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + NEW() {} + + public NEW(int index) { + super(org.apache.bcel.Constants.NEW, index); + } + + public Class[] getExceptions(){ + Class[] cs = new Class[2 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; + + System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, + cs, 0, ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); + + cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length+1] = ExceptionConstants.INSTANTIATION_ERROR; + cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; + + return cs; + } + + public ObjectType getLoadClassType(ConstantPoolGen cpg) { + return (ObjectType)getType(cpg); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitLoadClass(this); + v.visitAllocationInstruction(this); + v.visitExceptionThrower(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitNEW(this); + } +} diff --git a/src/java/org/apache/bcel/generic/NEWARRAY.java b/src/java/org/apache/bcel/generic/NEWARRAY.java new file mode 100644 index 00000000..97dfb74a --- /dev/null +++ b/src/java/org/apache/bcel/generic/NEWARRAY.java @@ -0,0 +1,141 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * NEWARRAY - Create new array of basic type (int, short, ...) + *
        Stack: ..., count -> ..., arrayref
        + * type must be one of T_INT, T_SHORT, ... + * + * @version $Id$ + * @author M. Dahm + */ +public class NEWARRAY extends Instruction + implements AllocationInstruction, ExceptionThrower, StackProducer { + private byte type; + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + NEWARRAY() {} + + public NEWARRAY(byte type) { + super(org.apache.bcel.Constants.NEWARRAY, (short)2); + this.type = type; + } + + public NEWARRAY(BasicType type) { + this(type.getType()); + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + out.writeByte(opcode); + out.writeByte(type); + } + + /** + * @return numeric code for basic element type + */ + public final byte getTypecode() { return type; } + + /** + * @return type of constructed array + */ + public final Type getType() { + return new ArrayType(BasicType.getType(type), 1); + } + + /** + * @return mnemonic for instruction + */ + public String toString(boolean verbose) { + return super.toString(verbose) + " " + org.apache.bcel.Constants.TYPE_NAMES[type]; + } + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException + { + type = bytes.readByte(); + length = 2; + } + + public Class[] getExceptions() { + return new Class[] { org.apache.bcel.ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION }; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitAllocationInstruction(this); + v.visitExceptionThrower(this); + v.visitStackProducer(this); + v.visitNEWARRAY(this); + } +} diff --git a/src/java/org/apache/bcel/generic/NOP.java b/src/java/org/apache/bcel/generic/NOP.java new file mode 100644 index 00000000..c670e3c6 --- /dev/null +++ b/src/java/org/apache/bcel/generic/NOP.java @@ -0,0 +1,80 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * NOP - Do nothing + * + * @version $Id$ + * @author M. Dahm + */ +public class NOP extends Instruction { + public NOP() { + super(org.apache.bcel.Constants.NOP, (short)1); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitNOP(this); + } +} diff --git a/src/java/org/apache/bcel/generic/NamedAndTyped.java b/src/java/org/apache/bcel/generic/NamedAndTyped.java new file mode 100644 index 00000000..a789e3bf --- /dev/null +++ b/src/java/org/apache/bcel/generic/NamedAndTyped.java @@ -0,0 +1,71 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denote entity that has both name and type. This is true for local variables, + * methods and fields. + * + * @version $Id$ + * @author M. Dahm + */ +public interface NamedAndTyped { + public String getName(); + public Type getType(); + public void setName(String name); + public void setType(Type type); + +} + diff --git a/src/java/org/apache/bcel/generic/ObjectType.java b/src/java/org/apache/bcel/generic/ObjectType.java new file mode 100644 index 00000000..d4476770 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ObjectType.java @@ -0,0 +1,136 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; + +/** + * Denotes reference such as java.lang.String. + * + * @version $Id$ + * @author M. Dahm + */ +public final class ObjectType extends ReferenceType { + private String class_name; // Class name of type + + /** + * @param class_name fully qualified class name, e.g. java.lang.String + */ + public ObjectType(String class_name) { + super(Constants.T_REFERENCE, "L" + class_name.replace('.', '/') + ";"); + this.class_name = class_name.replace('/', '.'); + } + + /** @return name of referenced class + */ + public String getClassName() { return class_name; } + + /** @return a hash code value for the object. + */ + public int hashCode() { return class_name.hashCode(); } + + /** @return true if both type objects refer to the same class. + */ + public boolean equals(Object type) { + return (type instanceof ObjectType)? + ((ObjectType)type).class_name.equals(class_name) : false; + } + + /** + * If "this" doesn't reference a class, it references an interface + * or a non-existant entity. + */ + public boolean referencesClass(){ + JavaClass jc = Repository.lookupClass(class_name); + if (jc == null) + return false; + else + return jc.isClass(); + } + + /** + * If "this" doesn't reference an interface, it references a class + * or a non-existant entity. + */ + public boolean referencesInterface(){ + JavaClass jc = Repository.lookupClass(class_name); + if (jc == null) + return false; + else + return !jc.isClass(); + } + + public boolean subclassOf(ObjectType superclass){ + if (this.referencesInterface() || superclass.referencesInterface()) + return false; + + return Repository.instanceOf(this.class_name, superclass.class_name); + } + + /** + * Java Virtual Machine Specification edition 2, § 5.4.4 Access Control + */ + public boolean accessibleTo(ObjectType accessor) { + JavaClass jc = Repository.lookupClass(class_name); + + if(jc.isPublic()) { + return true; + } else { + JavaClass acc = Repository.lookupClass(accessor.class_name); + return acc.getPackageName().equals(jc.getPackageName()); + } + } +} diff --git a/src/java/org/apache/bcel/generic/POP.java b/src/java/org/apache/bcel/generic/POP.java new file mode 100644 index 00000000..c5dac2c5 --- /dev/null +++ b/src/java/org/apache/bcel/generic/POP.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * POP - Pop top operand stack word + * + *
        Stack: ..., word -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class POP extends StackInstruction implements PopInstruction { + public POP() { + super(org.apache.bcel.Constants.POP); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitPopInstruction(this); + v.visitStackInstruction(this); + v.visitPOP(this); + } +} diff --git a/src/java/org/apache/bcel/generic/POP2.java b/src/java/org/apache/bcel/generic/POP2.java new file mode 100644 index 00000000..8a7faeba --- /dev/null +++ b/src/java/org/apache/bcel/generic/POP2.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * POP2 - Pop two top operand stack words + * + *
        Stack: ..., word2, word1 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class POP2 extends StackInstruction implements PopInstruction { + public POP2() { + super(org.apache.bcel.Constants.POP2); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitPopInstruction(this); + v.visitStackInstruction(this); + v.visitPOP2(this); + } +} diff --git a/src/java/org/apache/bcel/generic/PUSH.java b/src/java/org/apache/bcel/generic/PUSH.java new file mode 100644 index 00000000..7a77a1d2 --- /dev/null +++ b/src/java/org/apache/bcel/generic/PUSH.java @@ -0,0 +1,196 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +import java.io.*; + +/** + * Wrapper class for push operations, which are implemented either as BIPUSH, + * LDC or xCONST_n instructions. + * + * @version $Id$ + * @author M. Dahm + */ +public final class PUSH + implements CompoundInstruction, VariableLengthInstruction, InstructionConstants +{ + private Instruction instruction; + + /** + * This constructor also applies for values of type short, char, byte + * + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, int value) { + if((value >= -1) && (value <= 5)) // Use ICONST_n + instruction = INSTRUCTIONS[Constants.ICONST_0 + value]; + else if((value >= -128) && (value <= 127)) // Use BIPUSH + instruction = new BIPUSH((byte)value); + else if((value >= -32768) && (value <= 32767)) // Use SIPUSH + instruction = new SIPUSH((short)value); + else // If everything fails create a Constant pool entry + instruction = new LDC(cp.addInteger(value)); + } + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, boolean value) { + instruction = INSTRUCTIONS[Constants.ICONST_0 + (value? 1 : 0)]; + } + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, float value) { + if(value == 0.0) + instruction = FCONST_0; + else if(value == 1.0) + instruction = FCONST_1; + else if(value == 2.0) + instruction = FCONST_2; + else // Create a Constant pool entry + instruction = new LDC(cp.addFloat(value)); + } + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, long value) { + if(value == 0) + instruction = LCONST_0; + else if(value == 1) + instruction = LCONST_1; + else // Create a Constant pool entry + instruction = new LDC2_W(cp.addLong(value)); + } + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, double value) { + if(value == 0.0) + instruction = DCONST_0; + else if(value == 1.0) + instruction = DCONST_1; + else // Create a Constant pool entry + instruction = new LDC2_W(cp.addDouble(value)); + } + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, String value) { + if(value == null) + instruction = ACONST_NULL; + else // Create a Constant pool entry + instruction = new LDC(cp.addString(value)); + } + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, Number value) { + if((value instanceof Integer) || (value instanceof Short) || (value instanceof Byte)) + instruction = new PUSH(cp, value.intValue()).instruction; + else if(value instanceof Double) + instruction = new PUSH(cp, value.doubleValue()).instruction; + else if(value instanceof Float) + instruction = new PUSH(cp, value.floatValue()).instruction; + else if(value instanceof Long) + instruction = new PUSH(cp, value.longValue()).instruction; + else + throw new ClassGenException("What's this: " + value); + } + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, Character value) { + this(cp, (int)value.charValue()); + } + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, Boolean value) { + this(cp, value.booleanValue()); + } + + public final InstructionList getInstructionList() { + return new InstructionList(instruction); + } + + public final Instruction getInstruction() { + return instruction; + } + + /** + * @return mnemonic for instruction + */ + public String toString() { + return instruction.toString() + " (PUSH)"; + } +} + diff --git a/src/java/org/apache/bcel/generic/PUTFIELD.java b/src/java/org/apache/bcel/generic/PUTFIELD.java new file mode 100644 index 00000000..ad5bee3e --- /dev/null +++ b/src/java/org/apache/bcel/generic/PUTFIELD.java @@ -0,0 +1,114 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.ExceptionConstants; + +/** + * PUTFIELD - Put field in object + *
        Stack: ..., objectref, value -> ...
        + * OR + *
        Stack: ..., objectref, value.word1, value.word2 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class PUTFIELD extends FieldInstruction implements ExceptionThrower{ + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + PUTFIELD() {} + + public PUTFIELD(int index) { + super(Constants.PUTFIELD, index); + } + + public int consumeStack(ConstantPoolGen cpg) { return getFieldSize(cpg) + 1; } + + public Class[] getExceptions() { + Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, + cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+1] = + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = + ExceptionConstants.NULL_POINTER_EXCEPTION; + + return cs; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitFieldInstruction(this); + v.visitPUTFIELD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/PUTSTATIC.java b/src/java/org/apache/bcel/generic/PUTSTATIC.java new file mode 100644 index 00000000..b3da2ec7 --- /dev/null +++ b/src/java/org/apache/bcel/generic/PUTSTATIC.java @@ -0,0 +1,114 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.ExceptionConstants; + +/** + * PUTSTATIC - Put static field in class + *
        Stack: ..., objectref, value -> ...
        + * OR + *
        Stack: ..., objectref, value.word1, value.word2 -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class PUTSTATIC extends FieldInstruction + implements ExceptionThrower, PopInstruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + PUTSTATIC() {} + + public PUTSTATIC(int index) { + super(Constants.PUTSTATIC, index); + } + + public int consumeStack(ConstantPoolGen cpg) { return getFieldSize(cpg); } + + public Class[] getExceptions() { + Class[] cs = new Class[1 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, + cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + + return cs; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitStackConsumer(this); + v.visitPopInstruction(this); + v.visitTypedInstruction(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitFieldInstruction(this); + v.visitPUTSTATIC(this); + } +} diff --git a/src/java/org/apache/bcel/generic/PopInstruction.java b/src/java/org/apache/bcel/generic/PopInstruction.java new file mode 100644 index 00000000..df9cf3a0 --- /dev/null +++ b/src/java/org/apache/bcel/generic/PopInstruction.java @@ -0,0 +1,68 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denotes an unparameterized instruction to pop a value on top from the stack, + * such as ISTORE, POP, PUTSTATIC. + * + * @version $Id$ + * @author M. Dahm + * @see ISTORE + * @see POP + */ +public interface PopInstruction extends StackConsumer { +} + diff --git a/src/java/org/apache/bcel/generic/PushInstruction.java b/src/java/org/apache/bcel/generic/PushInstruction.java new file mode 100644 index 00000000..9b600441 --- /dev/null +++ b/src/java/org/apache/bcel/generic/PushInstruction.java @@ -0,0 +1,73 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denotes an unparameterized instruction to produce a value on top of the stack, + * such as ILOAD, LDC, SIPUSH, DUP, ICONST, etc. + * + * @version $Id$ + * @author M. Dahm + + * @see ILOAD + * @see ICONST + * @see LDC + * @see DUP + * @see SIPUSH + * @see GETSTATIC + */ +public interface PushInstruction extends StackProducer { +} + diff --git a/src/java/org/apache/bcel/generic/RET.java b/src/java/org/apache/bcel/generic/RET.java new file mode 100644 index 00000000..c916e0b2 --- /dev/null +++ b/src/java/org/apache/bcel/generic/RET.java @@ -0,0 +1,161 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * RET - Return from subroutine + * + *
        Stack: ..., -> ..., address
        + * + * @version $Id$ + * @author M. Dahm + */ +public class RET extends Instruction implements IndexedInstruction, TypedInstruction { + private boolean wide; + private int index; // index to local variable containg the return address + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + RET() {} + + public RET(int index) { + super(org.apache.bcel.Constants.RET, (short)2); + setIndex(index); // May set wide as side effect + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + if(wide) + out.writeByte(org.apache.bcel.Constants.WIDE); + + out.writeByte(opcode); + + if(wide) + out.writeShort(index); + else + out.writeByte(index); + } + + private final void setWide() { + if(wide = index > org.apache.bcel.Constants.MAX_BYTE) + length = 4; // Including the wide byte + else + length = 2; + } + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException + { + this.wide = wide; + + if(wide) { + index = bytes.readUnsignedShort(); + length = 4; + } else { + index = bytes.readUnsignedByte(); + length = 2; + } + } + + /** + * @return index of local variable containg the return address + */ + public final int getIndex() { return index; } + + /** + * Set index of local variable containg the return address + */ + public final void setIndex(int n) { + if(n < 0) + throw new ClassGenException("Negative index value: " + n); + + index = n; + setWide(); + } + + /** + * @return mnemonic for instruction + */ + public String toString(boolean verbose) { + return super.toString(verbose) + " " + index; + } + + /** @return return address type + */ + public Type getType(ConstantPoolGen cp) { + return ReturnaddressType.NO_TARGET; + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitRET(this); + } +} diff --git a/src/java/org/apache/bcel/generic/RETURN.java b/src/java/org/apache/bcel/generic/RETURN.java new file mode 100644 index 00000000..d8f4084c --- /dev/null +++ b/src/java/org/apache/bcel/generic/RETURN.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * RETURN - Return from void method + *
        Stack: ... -> <empty>
        + * + * @version $Id$ + * @author M. Dahm + */ +public class RETURN extends ReturnInstruction { + public RETURN() { + super(org.apache.bcel.Constants.RETURN); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitReturnInstruction(this); + v.visitRETURN(this); + } +} diff --git a/src/java/org/apache/bcel/generic/ReferenceType.java b/src/java/org/apache/bcel/generic/ReferenceType.java new file mode 100644 index 00000000..dd958fa1 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ReferenceType.java @@ -0,0 +1,258 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; + +/** + * Super class for objects and arrays. + * + * @version $Id$ + * @author M. Dahm + */ +public class ReferenceType extends Type { + protected ReferenceType(byte t, String s) { + super(t, s); + } + + /** Class is non-abstract but not instantiable from the outside + */ + ReferenceType() { + super(Constants.T_OBJECT, ""); + } + + /** + * Return true iff this type is castable to another type t as defined in + * the JVM specification. The case where this is Type.NULL is not + * defined (see the CHECKCAST definition in the JVM specification). + * However, because e.g. CHECKCAST doesn't throw a + * ClassCastException when casting a null reference to any Object, + * true is returned in this case. + */ + public boolean isCastableTo(Type t){ + if(this.equals(Type.NULL)) + return true; // If this is ever changed in isAssignmentCompatible() + + return isAssignmentCompatibleWith(t); /* Yes, it's true: It's the same definition. + * See vmspec2 AASTORE / CHECKCAST definitions. + */ + } + + /** + * Return true iff this is assignment compatible with another type t + * as defined in the JVM specification; see the AASTORE definition + * there. + */ + public boolean isAssignmentCompatibleWith(Type t) { + if(!(t instanceof ReferenceType)) + return false; + + ReferenceType T = (ReferenceType)t; + + if(this.equals(Type.NULL)) + return true; // This is not explicitely stated, but clear. Isn't it? + + /* If this is a class type then + */ + if((this instanceof ObjectType) && (((ObjectType) this).referencesClass())) { + /* If T is a class type, then this must be the same class as T, + or this must be a subclass of T; + */ + if((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) { + if(this.equals(T)) + return true; + + if(Repository.instanceOf( ((ObjectType) this).getClassName(), + ((ObjectType) T).getClassName())) + return true; + } + + /* If T is an interface type, this must implement interface T. + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())) { + if (Repository.implementationOf( ((ObjectType) this).getClassName(), + ((ObjectType) T).getClassName() )) + return true; + } + } + + /* If this is an interface type, then: + */ + if ((this instanceof ObjectType) && (((ObjectType) this).referencesInterface())){ + /* If T is a class type, then T must be Object (§2.4.7). + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())){ + if (T.equals(Type.OBJECT)) return true; + } + + /* If T is an interface type, then T must be the same interface + as this or a superinterface of this (§2.13.2). + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())){ + if (this.equals(T)) return true; + if (Repository.implementationOf( ((ObjectType) this).getClassName(), + ((ObjectType) T).getClassName() )) return true; + } + } + + /* If this is an array type, namely, the type SC[], that is, an + array of components of type SC, then: + */ + if(this instanceof ArrayType){ + /* If T is a class type, then T must be Object (§2.4.7). + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())){ + if (T.equals(Type.OBJECT)) return true; + } + + /* If T is an array type TC[], that is, an array of components + of type TC, then one of the following must be true: + */ + if (T instanceof ArrayType) { + /* TC and SC are the same primitive type (§2.4.1). + */ + Type sc = ((ArrayType) this).getElementType(); + Type tc = ((ArrayType) this).getElementType(); + + if (sc instanceof BasicType && tc instanceof BasicType && sc.equals(tc)) + return true; + + /* TC and SC are reference types (§2.4.6), and type SC is + assignable to TC by these runtime rules.*/ + if (tc instanceof ReferenceType && sc instanceof ReferenceType && + ((ReferenceType) sc).isAssignmentCompatibleWith((ReferenceType) tc)) return true; + } + + /* If T is an interface type, T must be one of the interfaces implemented by arrays (§2.15). */ + // TODO: Check if this is still valid or find a way to dynamically find out which + // interfaces arrays implement. However, as of the JVM specification edition 2, there + // are at least two different pages where assignment compatibility is defined and + // on one of them "interfaces implemented by arrays" is exchanged with "'Cloneable' or + // 'java.io.Serializable'" + if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())){ + for (int ii=0; ii. + */ +import org.apache.bcel.Constants; +import org.apache.bcel.ExceptionConstants; + +/** + * Super class for the xRETURN family of instructions. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class ReturnInstruction extends Instruction + implements ExceptionThrower, TypedInstruction, StackConsumer { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ReturnInstruction() {} + + /** + * @param opcode of instruction + */ + protected ReturnInstruction(short opcode) { + super(opcode, (short)1); + } + + public Type getType() { + switch(opcode) { + case Constants.IRETURN: return Type.INT; + case Constants.LRETURN: return Type.LONG; + case Constants.FRETURN: return Type.FLOAT; + case Constants.DRETURN: return Type.DOUBLE; + case Constants.ARETURN: return Type.OBJECT; + case Constants.RETURN: return Type.VOID; + + default: // Never reached + throw new ClassGenException("Unknown type " + opcode); + } + } + + public Class[] getExceptions() { + return new Class[] { ExceptionConstants.ILLEGAL_MONITOR_STATE }; + } + + /** @return type associated with the instruction + */ + public Type getType(ConstantPoolGen cp) { + return getType(); + } +} + diff --git a/src/java/org/apache/bcel/generic/ReturnaddressType.java b/src/java/org/apache/bcel/generic/ReturnaddressType.java new file mode 100644 index 00000000..4a1b4c57 --- /dev/null +++ b/src/java/org/apache/bcel/generic/ReturnaddressType.java @@ -0,0 +1,102 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.Constants; +import org.apache.bcel.generic.InstructionHandle; + +/** + * Returnaddress, the type JSR or JSR_W instructions push upon the stack. + * + * see vmspec2 §3.3.3 + * @version $Id$ + * @author Enver Haase + */ +public class ReturnaddressType extends Type { + + public static final ReturnaddressType NO_TARGET = new ReturnaddressType(); + private InstructionHandle returnTarget; + + /** + * A Returnaddress [that doesn't know where to return to]. + */ + private ReturnaddressType(){ + super(Constants.T_ADDRESS, ""); + } + + /** + * Creates a ReturnaddressType object with a target. + */ + public ReturnaddressType(InstructionHandle returnTarget) { + super(Constants.T_ADDRESS, ""); + this.returnTarget = returnTarget; + } + + /** + * Returns if the two Returnaddresses refer to the same target. + */ + public boolean equals(Object rat){ + if(!(rat instanceof ReturnaddressType)) + return false; + + return ((ReturnaddressType)rat).returnTarget.equals(this.returnTarget); + } + + /** + * @return the target of this ReturnaddressType + */ + public InstructionHandle getTarget(){ + return returnTarget; + } +} diff --git a/src/java/org/apache/bcel/generic/SALOAD.java b/src/java/org/apache/bcel/generic/SALOAD.java new file mode 100644 index 00000000..17f18f74 --- /dev/null +++ b/src/java/org/apache/bcel/generic/SALOAD.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * SALOAD - Load short from array + *
        Stack: ..., arrayref, index -> ..., value
        + * + * @version $Id$ + * @author M. Dahm + */ +public class SALOAD extends ArrayInstruction implements StackProducer { + public SALOAD() { + super(org.apache.bcel.Constants.SALOAD); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitSALOAD(this); + } +} diff --git a/src/java/org/apache/bcel/generic/SASTORE.java b/src/java/org/apache/bcel/generic/SASTORE.java new file mode 100644 index 00000000..cc3088f3 --- /dev/null +++ b/src/java/org/apache/bcel/generic/SASTORE.java @@ -0,0 +1,85 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * SASTORE - Store into short array + *
        Stack: ..., arrayref, index, value -> ...
        + * + * @version $Id$ + * @author M. Dahm + */ +public class SASTORE extends ArrayInstruction implements StackConsumer { + public SASTORE() { + super(org.apache.bcel.Constants.SASTORE); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitSASTORE(this); + } +} diff --git a/src/java/org/apache/bcel/generic/SIPUSH.java b/src/java/org/apache/bcel/generic/SIPUSH.java new file mode 100644 index 00000000..e1e216b9 --- /dev/null +++ b/src/java/org/apache/bcel/generic/SIPUSH.java @@ -0,0 +1,129 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * SIPUSH - Push short + * + *
        Stack: ... -> ..., value
        + * + * @version $Id$ + * @author M. Dahm + */ +public class SIPUSH extends Instruction implements ConstantPushInstruction { + private short b; + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + SIPUSH() {} + + public SIPUSH(short b) { + super(org.apache.bcel.Constants.SIPUSH, (short)3); + this.b = b; + } + + /** + * Dump instruction as short code to stream out. + */ + public void dump(DataOutputStream out) throws IOException { + super.dump(out); + out.writeShort(b); + } + + /** + * @return mnemonic for instruction + */ + public String toString(boolean verbose) { + return super.toString(verbose) + " " + b; + } + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException + { + length = 3; + b = bytes.readShort(); + } + + public Number getValue() { return new Integer(b); } + + /** @return Type.SHORT + */ + public Type getType(ConstantPoolGen cp) { + return Type.SHORT; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitPushInstruction(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitConstantPushInstruction(this); + v.visitSIPUSH(this); + } +} diff --git a/src/java/org/apache/bcel/generic/SWAP.java b/src/java/org/apache/bcel/generic/SWAP.java new file mode 100644 index 00000000..9b23edc1 --- /dev/null +++ b/src/java/org/apache/bcel/generic/SWAP.java @@ -0,0 +1,84 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * SWAP - Swa top operand stack word + *
        Stack: ..., word2, word1 -> ..., word1, word2
        + * + * @version $Id$ + * @author M. Dahm + */ +public class SWAP extends StackInstruction implements StackConsumer, StackProducer { + public SWAP() { + super(org.apache.bcel.Constants.SWAP); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitStackInstruction(this); + v.visitSWAP(this); + } +} diff --git a/src/java/org/apache/bcel/generic/SWITCH.java b/src/java/org/apache/bcel/generic/SWITCH.java new file mode 100644 index 00000000..d47bd2a1 --- /dev/null +++ b/src/java/org/apache/bcel/generic/SWITCH.java @@ -0,0 +1,183 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * SWITCH - Branch depending on int value, generates either LOOKUPSWITCH or + * TABLESWITCH instruction, depending on whether the match values (int[]) can be + * sorted with no gaps between the numbers. + * + * @version $Id$ + * @author M. Dahm + */ +public final class SWITCH implements CompoundInstruction { + private int[] match; + private InstructionHandle[] targets; + private Select instruction; + private int match_length; + + /** + * Template for switch() constructs. If the match array can be + * sorted in ascending order with gaps no larger than max_gap + * between the numbers, a TABLESWITCH instruction is generated, and + * a LOOKUPSWITCH otherwise. The former may be more efficient, but + * needs more space. + * + * Note, that the key array always will be sorted, though we leave + * the original arrays unaltered. + * + * @param match array of match values (case 2: ... case 7: ..., etc.) + * @param targets the instructions to be branched to for each case + * @param target the default target + * @param max_gap maximum gap that may between case branches + */ + public SWITCH(int[] match, InstructionHandle[] targets, + InstructionHandle target, int max_gap) { + this.match = (int[])match.clone(); + this.targets = (InstructionHandle[])targets.clone(); + + if((match_length = match.length) < 2) // (almost) empty switch, or just default + instruction = new TABLESWITCH(match, targets, target); + else { + sort(0, match_length - 1); + + if(matchIsOrdered(max_gap)) { + fillup(max_gap, target); + + instruction = new TABLESWITCH(this.match, this.targets, target); + } + else + instruction = new LOOKUPSWITCH(this.match, this.targets, target); + } + } + + public SWITCH(int[] match, InstructionHandle[] targets, + InstructionHandle target) { + this(match, targets, target, 1); + } + + private final void fillup(int max_gap, InstructionHandle target) { + int max_size = match_length + match_length * max_gap; + int[] m_vec = new int[max_size]; + InstructionHandle[] t_vec = new InstructionHandle[max_size]; + int count = 1; + + m_vec[0] = match[0]; + t_vec[0] = targets[0]; + + for(int i=1; i < match_length; i++) { + int prev = match[i-1]; + int gap = match[i] - prev; + + for(int j=1; j < gap; j++) { + m_vec[count] = prev + j; + t_vec[count] = target; + count++; + } + + m_vec[count] = match[i]; + t_vec[count] = targets[i]; + count++; + } + + match = new int[count]; + targets = new InstructionHandle[count]; + + System.arraycopy(m_vec, 0, match, 0, count); + System.arraycopy(t_vec, 0, targets, 0, count); + } + + /** + * Sort match and targets array with QuickSort. + */ + private final void sort(int l, int r) { + int i = l, j = r; + int h, m = match[(l + r) / 2]; + InstructionHandle h2; + + do { + while(match[i] < m) i++; + while(m < match[j]) j--; + + if(i <= j) { + h=match[i]; match[i]=match[j]; match[j]=h; // Swap elements + h2=targets[i]; targets[i]=targets[j]; targets[j]=h2; // Swap instructions, too + i++; j--; + } + } while(i <= j); + + if(l < j) sort(l, j); + if(i < r) sort(i, r); + } + + /** + * @return match is sorted in ascending order with no gap bigger than max_gap? + */ + private final boolean matchIsOrdered(int max_gap) { + for(int i=1; i < match_length; i++) + if(match[i] - match[i-1] > max_gap) + return false; + + return true; + } + + public final InstructionList getInstructionList() { + return new InstructionList(instruction); + } + + public final Instruction getInstruction() { + return instruction; + } +} diff --git a/src/java/org/apache/bcel/generic/Select.java b/src/java/org/apache/bcel/generic/Select.java new file mode 100644 index 00000000..c56f6903 --- /dev/null +++ b/src/java/org/apache/bcel/generic/Select.java @@ -0,0 +1,256 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * Select - Abstract super class for LOOKUPSWITCH and TABLESWITCH instructions. + * + * @version $Id$ + * @author M. Dahm + * @see LOOKUPSWITCH + * @see TABLESWITCH + * @see InstructionList + */ +public abstract class Select extends BranchInstruction + implements VariableLengthInstruction, StackProducer +{ + protected int[] match; // matches, i.e., case 1: ... + protected int[] indices; // target offsets + protected InstructionHandle[] targets; // target objects in instruction list + protected int fixed_length; // fixed length defined by subclasses + protected int match_length; // number of cases + protected int padding = 0; // number of pad bytes for alignment + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + Select() {} + + /** + * (Match, target) pairs for switch. + * `Match' and `targets' must have the same length of course. + * + * @param match array of matching values + * @param targets instruction targets + * @param target default instruction target + */ + Select(short opcode, int[] match, InstructionHandle[] targets, + InstructionHandle target) { + super(opcode, target); + + this.targets = targets; + for(int i=0; i < targets.length; i++) + notifyTarget(null, targets[i], this); + + this.match = match; + + if((match_length = match.length) != targets.length) + throw new ClassGenException("Match and target array have not the same length"); + + indices = new int[match_length]; + } + + /** + * Since this is a variable length instruction, it may shift the following + * instructions which then need to update their position. + * + * Called by InstructionList.setPositions when setting the position for every + * instruction. In the presence of variable length instructions `setPositions' + * performs multiple passes over the instruction list to calculate the + * correct (byte) positions and offsets by calling this function. + * + * @param offset additional offset caused by preceding (variable length) instructions + * @param max_offset the maximum offset that may be caused by these instructions + * @return additional offset caused by possible change of this instruction's length + */ + protected int updatePosition(int offset, int max_offset) { + position += offset; // Additional offset caused by preceding SWITCHs, GOTOs, etc. + + short old_length = length; + + /* Alignment on 4-byte-boundary, + 1, because of tag byte. + */ + padding = (4 - ((position + 1) % 4)) % 4; + length = (short)(fixed_length + padding); // Update length + + return length - old_length; + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + out.writeByte(opcode); + + for(int i=0; i < padding; i++) // Padding bytes + out.writeByte(0); + + index = getTargetOffset(); // Write default target offset + out.writeInt(index); + } + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException + { + padding = (4 - (bytes.getIndex() % 4)) % 4; // Compute number of pad bytes + + for(int i=0; i < padding; i++) { + byte b; + if((b=bytes.readByte()) != 0) + throw new ClassGenException("Padding byte != 0: " + b); + } + + // Default branch target common for both cases (TABLESWITCH, LOOKUPSWITCH) + index = bytes.readInt(); + } + + /** + * @return mnemonic for instruction + */ + public String toString(boolean verbose) { + StringBuffer buf = new StringBuffer(super.toString(verbose)); + + if(verbose) { + for(int i=0; i < match_length; i++) { + String s = "null"; + + if(targets[i] != null) + s = targets[i].getInstruction().toString(); + + buf.append("(" + match[i] + ", " + s + " = {" + indices[i] + "})"); + } + } + else + buf.append(" ..."); + + return buf.toString(); + } + + /** + * Set branch target for `i'th case + */ + public void setTarget(int i, InstructionHandle target) { + notifyTarget(targets[i], target, this); + targets[i] = target; + } + + /** + * @param old_ih old target + * @param new_ih new target + */ + public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { + boolean targeted = false; + + if(target == old_ih) { + targeted = true; + setTarget(new_ih); + } + + for(int i=0; i < targets.length; i++) { + if(targets[i] == old_ih) { + targeted = true; + setTarget(i, new_ih); + } + } + + if(!targeted) + throw new ClassGenException("Not targeting " + old_ih); + } + + /** + * @return true, if ih is target of this instruction + */ + public boolean containsTarget(InstructionHandle ih) { + if(target == ih) + return true; + + for(int i=0; i < targets.length; i++) + if(targets[i] == ih) + return true; + + return false; + } + + /** + * Inform targets that they're not targeted anymore. + */ + void dispose() { + super.dispose(); + + for(int i=0; i < targets.length; i++) + targets[i].removeTargeter(this); + } + + /** + * @return array of match indices + */ + public int[] getMatchs() { return match; } + + /** + * @return array of match target offsets + */ + public int[] getIndices() { return indices; } + + /** + * @return array of match targets + */ + public InstructionHandle[] getTargets() { return targets; } +} diff --git a/src/java/org/apache/bcel/generic/StackConsumer.java b/src/java/org/apache/bcel/generic/StackConsumer.java new file mode 100644 index 00000000..fd97f60b --- /dev/null +++ b/src/java/org/apache/bcel/generic/StackConsumer.java @@ -0,0 +1,68 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denote an instruction that may consume a value from the stack. + * + * @version $Id$ + * @author M. Dahm + */ +public interface StackConsumer { + /** @return how many words are consumed from stack + */ + public int consumeStack(ConstantPoolGen cpg); +} + diff --git a/src/java/org/apache/bcel/generic/StackInstruction.java b/src/java/org/apache/bcel/generic/StackInstruction.java new file mode 100644 index 00000000..03a488e5 --- /dev/null +++ b/src/java/org/apache/bcel/generic/StackInstruction.java @@ -0,0 +1,83 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Super class for stack operations like DUP and POP. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class StackInstruction extends Instruction { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + StackInstruction() {} + + /** + * @param opcode instruction opcode + */ + protected StackInstruction(short opcode) { + super(opcode, (short)1); + } + + /** @return Type.UNKNOWN + */ + public Type getType(ConstantPoolGen cp) { + return Type.UNKNOWN; + } +} + diff --git a/src/java/org/apache/bcel/generic/StackProducer.java b/src/java/org/apache/bcel/generic/StackProducer.java new file mode 100644 index 00000000..955b9c07 --- /dev/null +++ b/src/java/org/apache/bcel/generic/StackProducer.java @@ -0,0 +1,69 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denote an instruction that may produce a value on top of the stack + * (this excludes DUP_X1, e.g.) + * + * @version $Id$ + * @author M. Dahm + */ +public interface StackProducer { + /** @return how many words are produced on stack + */ + public int produceStack(ConstantPoolGen cpg); +} + diff --git a/src/java/org/apache/bcel/generic/StoreInstruction.java b/src/java/org/apache/bcel/generic/StoreInstruction.java new file mode 100644 index 00000000..a24249e0 --- /dev/null +++ b/src/java/org/apache/bcel/generic/StoreInstruction.java @@ -0,0 +1,102 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denotes an unparameterized instruction to store a value into a local variable, + * e.g. ISTORE. + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class StoreInstruction extends LocalVariableInstruction + implements PopInstruction +{ + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + * tag and length are defined in readInstruction and initFromFile, respectively. + */ + StoreInstruction(short canon_tag, short c_tag) { + super(canon_tag, c_tag); + } + + /** + * @param opcode Instruction opcode + * @param c_tag Instruction number for compact version, ASTORE_0, e.g. + * @param n local variable index (unsigned short) + */ + protected StoreInstruction(short opcode, short c_tag, int n) { + super(opcode, c_tag, n); + } + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitStackConsumer(this); + v.visitPopInstruction(this); + v.visitStoreInstruction(this); + v.visitTypedInstruction(this); + v.visitLocalVariableInstruction(this); + v.visitStoreInstruction(this); + } +} + diff --git a/src/java/org/apache/bcel/generic/TABLESWITCH.java b/src/java/org/apache/bcel/generic/TABLESWITCH.java new file mode 100644 index 00000000..a2ef8d9b --- /dev/null +++ b/src/java/org/apache/bcel/generic/TABLESWITCH.java @@ -0,0 +1,147 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; +import org.apache.bcel.util.ByteSequence; + +/** + * TABLESWITCH - Switch within given range of values, i.e., low..high + * + * @version $Id$ + * @author M. Dahm + * @see SWITCH + */ +public class TABLESWITCH extends Select { + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + TABLESWITCH() {} + + /** + * @param match sorted array of match values, match[0] must be low value, + * match[match_length - 1] high value + * @param targets where to branch for matched values + * @param target default branch + */ + public TABLESWITCH(int[] match, InstructionHandle[] targets, + InstructionHandle target) { + super(org.apache.bcel.Constants.TABLESWITCH, match, targets, target); + + length = (short)(13 + match_length * 4); /* Alignment remainder assumed + * 0 here, until dump time */ + fixed_length = length; + } + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump(DataOutputStream out) throws IOException { + super.dump(out); + + int low = (match_length > 0)? match[0] : 0; + out.writeInt(low); + + int high = (match_length > 0)? match[match_length - 1] : 0; + out.writeInt(high); + + for(int i=0; i < match_length; i++) // jump offsets + out.writeInt(indices[i] = getTargetOffset(targets[i])); + } + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException + { + super.initFromFile(bytes, wide); + + int low = bytes.readInt(); + int high = bytes.readInt(); + + match_length = high - low + 1; + fixed_length = (short)(13 + match_length * 4); + length = (short)(fixed_length + padding); + + match = new int[match_length]; + indices = new int[match_length]; + targets = new InstructionHandle[match_length]; + + for(int i=low; i <= high; i++) + match[i - low] = i; + + for(int i=0; i < match_length; i++) { + indices[i] = bytes.readInt(); + } + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitVariableLengthInstruction(this); + v.visitStackProducer(this); + v.visitBranchInstruction(this); + v.visitSelect(this); + v.visitTABLESWITCH(this); + } +} diff --git a/src/java/org/apache/bcel/generic/TargetLostException.java b/src/java/org/apache/bcel/generic/TargetLostException.java new file mode 100644 index 00000000..3caf528f --- /dev/null +++ b/src/java/org/apache/bcel/generic/TargetLostException.java @@ -0,0 +1,100 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Thrown by InstructionList.remove() when one or multiple disposed instruction + * are still being referenced by a InstructionTargeter object. I.e. the + * InstructionTargeter has to be notified that (one of) the InstructionHandle it + * is referencing is being removed from the InstructionList and thus not valid anymore. + * + * Making this an exception instead of a return value forces the user to handle + * these case explicitely in a try { ... } catch. The following code illustrates + * how this may be done: + * + *
        + *     ...
        + *     try {
        + *	il.delete(start_ih, end_ih);
        + *     } catch(TargetLostException e) {
        + *       InstructionHandle[] targets = e.getTargets();
        + *	 for(int i=0; i < targets.length; i++) {
        + *	   InstructionTargeter[] targeters = targets[i].getTargeters();
        + *     
        + *	   for(int j=0; j < targeters.length; j++)
        + *	     targeters[j].updateTarget(targets[i], new_target);
        + *       }
        + *     }
        + * 
        + * + * @see InstructionHandle + * @see InstructionList + * @see InstructionTargeter + * @version $Id$ + * @author M. Dahm + */ +public final class TargetLostException extends Exception { + private InstructionHandle[] targets; + + TargetLostException(InstructionHandle[] t, String mesg) { + super(mesg); + targets = t; + } + + /** + * @return list of instructions still being targeted. + */ + public InstructionHandle[] getTargets() { return targets; } +} diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java new file mode 100644 index 00000000..2d1aacc9 --- /dev/null +++ b/src/java/org/apache/bcel/generic/Type.java @@ -0,0 +1,232 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.*; +import java.io.*; +import java.util.ArrayList; + +/** + * Abstract super class for all possible java types, namely basic types + * such as int, object types like String and array types, e.g. int[] + * + * @version $Id$ + * @author M. Dahm + */ +public abstract class Type { + protected byte type; + protected String signature; // signature for the type + + /** Predefined constants + */ + public static final BasicType VOID = new BasicType(Constants.T_VOID); + public static final BasicType BOOLEAN = new BasicType(Constants.T_BOOLEAN); + public static final BasicType INT = new BasicType(Constants.T_INT); + public static final BasicType SHORT = new BasicType(Constants.T_SHORT); + public static final BasicType BYTE = new BasicType(Constants.T_BYTE); + public static final BasicType LONG = new BasicType(Constants.T_LONG); + public static final BasicType DOUBLE = new BasicType(Constants.T_DOUBLE); + public static final BasicType FLOAT = new BasicType(Constants.T_FLOAT); + public static final BasicType CHAR = new BasicType(Constants.T_CHAR); + public static final ObjectType OBJECT = new ObjectType("java.lang.Object"); + public static final ObjectType STRING = new ObjectType("java.lang.String"); + public static final ObjectType STRINGBUFFER = new ObjectType("java.lang.StringBuffer"); + public static final ObjectType THROWABLE = new ObjectType("java.lang.Throwable"); + public static final Type[] NO_ARGS = new Type[0]; + public static final ReferenceType NULL = new ReferenceType(); + public static final Type UNKNOWN = new Type(Constants.T_UNKNOWN, + ""){}; + + protected Type(byte t, String s) { + type = t; + signature = s; + } + + /** + * @return signature for given type. + */ + public String getSignature() { return signature; } + + /** + * @return type as defined in Constants + */ + public byte getType() { return type; } + + /** + * @return stack size of this type (2 for long and double, 0 for void, 1 otherwise) + */ + public int getSize() { + switch(type) { + case Constants.T_DOUBLE: + case Constants.T_LONG: return 2; + case Constants.T_VOID: return 0; + default: return 1; + } + } + + /** + * @return Type string, e.g. `int[]' + */ + public String toString() { + return ((this.equals(Type.NULL) || (type >= Constants.T_UNKNOWN)))? signature : + Utility.signatureToString(signature, false); + } + + /** + * Convert type to Java method signature, e.g. int[] f(java.lang.String x) + * becomes (Ljava/lang/String;)[I + * + * @param return_type what the method returns + * @param arg_types what are the argument types + * @return method signature for given type(s). + */ + public static String getMethodSignature(Type return_type, Type[] arg_types) { + StringBuffer buf = new StringBuffer("("); + int length = (arg_types == null)? 0 : arg_types.length; + + for(int i=0; i < length; i++) + buf.append(arg_types[i].getSignature()); + + buf.append(')'); + buf.append(return_type.getSignature()); + + return buf.toString(); + } + + private static int consumed_chars=0; // Remember position in string, see getArgumentTypes + + /** + * Convert signature to a Type object. + * @param signature signature string such as Ljava/lang/String; + * @return type object + */ + public static final Type getType(String signature) + throws StringIndexOutOfBoundsException + { + byte type = Utility.typeOfSignature(signature); + + if(type <= Constants.T_VOID) { + consumed_chars = 1; + return BasicType.getType(type); + } else if(type == Constants.T_ARRAY) { + int dim=0; + do { // Count dimensions + dim++; + } while(signature.charAt(dim) == '['); + + // Recurse, but just once, if the signature is ok + Type t = getType(signature.substring(dim)); + + consumed_chars += dim; // update counter + + return new ArrayType(t, dim); + } else { // type == T_REFERENCE + int index = signature.indexOf(';'); // Look for closing `;' + + if(index < 0) + throw new ClassFormatError("Invalid signature: " + signature); + + consumed_chars = index + 1; // "Lblabla;" `L' and `;' are removed + + return new ObjectType(signature.substring(1, index).replace('/', '.')); + } + } + + /** + * Convert return value of a method (signature) to a Type object. + * + * @param signature signature string such as (Ljava/lang/String;)V + * @return return type + */ + public static Type getReturnType(String signature) { + try { + // Read return type after `)' + int index = signature.lastIndexOf(')') + 1; + return getType(signature.substring(index)); + } catch(StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatError("Invalid method signature: " + signature); + } + } + + /** + * Convert arguments of a method (signature) to an array of Type objects. + * @param signature signature string such as (Ljava/lang/String;)V + * @return array of argument types + */ + public static Type[] getArgumentTypes(String signature) { + ArrayList vec = new ArrayList(); + int index; + Type[] types; + + try { // Read all declarations between for `(' and `)' + if(signature.charAt(0) != '(') + throw new ClassFormatError("Invalid method signature: " + signature); + + index = 1; // current string position + + while(signature.charAt(index) != ')') { + vec.add(getType(signature.substring(index))); + index += consumed_chars; // update position + } + } catch(StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatError("Invalid method signature: " + signature); + } + + types = new Type[vec.size()]; + vec.toArray(types); + return types; + } +} diff --git a/src/java/org/apache/bcel/generic/TypedInstruction.java b/src/java/org/apache/bcel/generic/TypedInstruction.java new file mode 100644 index 00000000..a2043d02 --- /dev/null +++ b/src/java/org/apache/bcel/generic/TypedInstruction.java @@ -0,0 +1,67 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Get the type associated with an instruction, int for ILOAD, or the type + * of the field of a PUTFIELD instruction, e.g.. + * + * @version $Id$ + * @author M. Dahm + */ +public interface TypedInstruction { + public Type getType(ConstantPoolGen cpg); +} + diff --git a/src/java/org/apache/bcel/generic/UnconditionalBranch.java b/src/java/org/apache/bcel/generic/UnconditionalBranch.java new file mode 100644 index 00000000..17d23f12 --- /dev/null +++ b/src/java/org/apache/bcel/generic/UnconditionalBranch.java @@ -0,0 +1,67 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denotes an instruction to perform an unconditional branch, i.e., GOTO, JSR. + * + * @version $Id$ + * @author M. Dahm + + * @see GOTO + * @see JSR + */ +public interface UnconditionalBranch {} + diff --git a/src/java/org/apache/bcel/generic/VariableLengthInstruction.java b/src/java/org/apache/bcel/generic/VariableLengthInstruction.java new file mode 100644 index 00000000..e08a2e1e --- /dev/null +++ b/src/java/org/apache/bcel/generic/VariableLengthInstruction.java @@ -0,0 +1,70 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Denotes an instruction to be a variable length instruction, such as + * GOTO, JSR, LOOKUPSWITCH and TABLESWITCH. + * + * @version $Id$ + * @author M. Dahm + + * @see GOTO + * @see JSR + * @see LOOKUPSWITCH + * @see TABLESWITCH + */ +public interface VariableLengthInstruction {} + diff --git a/src/java/org/apache/bcel/generic/Visitor.java b/src/java/org/apache/bcel/generic/Visitor.java new file mode 100644 index 00000000..836d9f93 --- /dev/null +++ b/src/java/org/apache/bcel/generic/Visitor.java @@ -0,0 +1,247 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Interface implementing the Visitor pattern programming style. + * I.e., a class that implements this interface can handle all types of + * instructions with the properly typed methods just by calling the accept() + * method. + * + * @version $Id$ + * @author M. Dahm + */ +public interface Visitor { + public void visitStackInstruction(StackInstruction obj); + public void visitLocalVariableInstruction(LocalVariableInstruction obj); + public void visitBranchInstruction(BranchInstruction obj); + public void visitLoadClass(LoadClass obj); + public void visitFieldInstruction(FieldInstruction obj); + public void visitIfInstruction(IfInstruction obj); + public void visitConversionInstruction(ConversionInstruction obj); + public void visitPopInstruction(PopInstruction obj); + public void visitStoreInstruction(StoreInstruction obj); + public void visitTypedInstruction(TypedInstruction obj); + public void visitSelect(Select obj); + public void visitJsrInstruction(JsrInstruction obj); + public void visitGotoInstruction(GotoInstruction obj); + public void visitUnconditionalBranch(UnconditionalBranch obj); + public void visitPushInstruction(PushInstruction obj); + public void visitArithmeticInstruction(ArithmeticInstruction obj); + public void visitCPInstruction(CPInstruction obj); + public void visitInvokeInstruction(InvokeInstruction obj); + public void visitArrayInstruction(ArrayInstruction obj); + public void visitAllocationInstruction(AllocationInstruction obj); + public void visitReturnInstruction(ReturnInstruction obj); + public void visitFieldOrMethod(FieldOrMethod obj); + public void visitConstantPushInstruction(ConstantPushInstruction obj); + public void visitExceptionThrower(ExceptionThrower obj); + public void visitLoadInstruction(LoadInstruction obj); + public void visitVariableLengthInstruction(VariableLengthInstruction obj); + public void visitStackProducer(StackProducer obj); + public void visitStackConsumer(StackConsumer obj); + public void visitACONST_NULL(ACONST_NULL obj); + public void visitGETSTATIC(GETSTATIC obj); + public void visitIF_ICMPLT(IF_ICMPLT obj); + public void visitMONITOREXIT(MONITOREXIT obj); + public void visitIFLT(IFLT obj); + public void visitLSTORE(LSTORE obj); + public void visitPOP2(POP2 obj); + public void visitBASTORE(BASTORE obj); + public void visitISTORE(ISTORE obj); + public void visitCHECKCAST(CHECKCAST obj); + public void visitFCMPG(FCMPG obj); + public void visitI2F(I2F obj); + public void visitATHROW(ATHROW obj); + public void visitDCMPL(DCMPL obj); + public void visitARRAYLENGTH(ARRAYLENGTH obj); + public void visitDUP(DUP obj); + public void visitINVOKESTATIC(INVOKESTATIC obj); + public void visitLCONST(LCONST obj); + public void visitDREM(DREM obj); + public void visitIFGE(IFGE obj); + public void visitCALOAD(CALOAD obj); + public void visitLASTORE(LASTORE obj); + public void visitI2D(I2D obj); + public void visitDADD(DADD obj); + public void visitINVOKESPECIAL(INVOKESPECIAL obj); + public void visitIAND(IAND obj); + public void visitPUTFIELD(PUTFIELD obj); + public void visitILOAD(ILOAD obj); + public void visitDLOAD(DLOAD obj); + public void visitDCONST(DCONST obj); + public void visitNEW(NEW obj); + public void visitIFNULL(IFNULL obj); + public void visitLSUB(LSUB obj); + public void visitL2I(L2I obj); + public void visitISHR(ISHR obj); + public void visitTABLESWITCH(TABLESWITCH obj); + public void visitIINC(IINC obj); + public void visitDRETURN(DRETURN obj); + public void visitFSTORE(FSTORE obj); + public void visitDASTORE(DASTORE obj); + public void visitIALOAD(IALOAD obj); + public void visitDDIV(DDIV obj); + public void visitIF_ICMPGE(IF_ICMPGE obj); + public void visitLAND(LAND obj); + public void visitIDIV(IDIV obj); + public void visitLOR(LOR obj); + public void visitCASTORE(CASTORE obj); + public void visitFREM(FREM obj); + public void visitLDC(LDC obj); + public void visitBIPUSH(BIPUSH obj); + public void visitDSTORE(DSTORE obj); + public void visitF2L(F2L obj); + public void visitFMUL(FMUL obj); + public void visitLLOAD(LLOAD obj); + public void visitJSR(JSR obj); + public void visitFSUB(FSUB obj); + public void visitSASTORE(SASTORE obj); + public void visitALOAD(ALOAD obj); + public void visitDUP2_X2(DUP2_X2 obj); + public void visitRETURN(RETURN obj); + public void visitDALOAD(DALOAD obj); + public void visitSIPUSH(SIPUSH obj); + public void visitDSUB(DSUB obj); + public void visitL2F(L2F obj); + public void visitIF_ICMPGT(IF_ICMPGT obj); + public void visitF2D(F2D obj); + public void visitI2L(I2L obj); + public void visitIF_ACMPNE(IF_ACMPNE obj); + public void visitPOP(POP obj); + public void visitI2S(I2S obj); + public void visitIFEQ(IFEQ obj); + public void visitSWAP(SWAP obj); + public void visitIOR(IOR obj); + public void visitIREM(IREM obj); + public void visitIASTORE(IASTORE obj); + public void visitNEWARRAY(NEWARRAY obj); + public void visitINVOKEINTERFACE(INVOKEINTERFACE obj); + public void visitINEG(INEG obj); + public void visitLCMP(LCMP obj); + public void visitJSR_W(JSR_W obj); + public void visitMULTIANEWARRAY(MULTIANEWARRAY obj); + public void visitDUP_X2(DUP_X2 obj); + public void visitSALOAD(SALOAD obj); + public void visitIFNONNULL(IFNONNULL obj); + public void visitDMUL(DMUL obj); + public void visitIFNE(IFNE obj); + public void visitIF_ICMPLE(IF_ICMPLE obj); + public void visitLDC2_W(LDC2_W obj); + public void visitGETFIELD(GETFIELD obj); + public void visitLADD(LADD obj); + public void visitNOP(NOP obj); + public void visitFALOAD(FALOAD obj); + public void visitINSTANCEOF(INSTANCEOF obj); + public void visitIFLE(IFLE obj); + public void visitLXOR(LXOR obj); + public void visitLRETURN(LRETURN obj); + public void visitFCONST(FCONST obj); + public void visitIUSHR(IUSHR obj); + public void visitBALOAD(BALOAD obj); + public void visitDUP2(DUP2 obj); + public void visitIF_ACMPEQ(IF_ACMPEQ obj); + public void visitIMPDEP1(IMPDEP1 obj); + public void visitMONITORENTER(MONITORENTER obj); + public void visitLSHL(LSHL obj); + public void visitDCMPG(DCMPG obj); + public void visitD2L(D2L obj); + public void visitIMPDEP2(IMPDEP2 obj); + public void visitL2D(L2D obj); + public void visitRET(RET obj); + public void visitIFGT(IFGT obj); + public void visitIXOR(IXOR obj); + public void visitINVOKEVIRTUAL(INVOKEVIRTUAL obj); + public void visitFASTORE(FASTORE obj); + public void visitIRETURN(IRETURN obj); + public void visitIF_ICMPNE(IF_ICMPNE obj); + public void visitFLOAD(FLOAD obj); + public void visitLDIV(LDIV obj); + public void visitPUTSTATIC(PUTSTATIC obj); + public void visitAALOAD(AALOAD obj); + public void visitD2I(D2I obj); + public void visitIF_ICMPEQ(IF_ICMPEQ obj); + public void visitAASTORE(AASTORE obj); + public void visitARETURN(ARETURN obj); + public void visitDUP2_X1(DUP2_X1 obj); + public void visitFNEG(FNEG obj); + public void visitGOTO_W(GOTO_W obj); + public void visitD2F(D2F obj); + public void visitGOTO(GOTO obj); + public void visitISUB(ISUB obj); + public void visitF2I(F2I obj); + public void visitDNEG(DNEG obj); + public void visitICONST(ICONST obj); + public void visitFDIV(FDIV obj); + public void visitI2B(I2B obj); + public void visitLNEG(LNEG obj); + public void visitLREM(LREM obj); + public void visitIMUL(IMUL obj); + public void visitIADD(IADD obj); + public void visitLSHR(LSHR obj); + public void visitLOOKUPSWITCH(LOOKUPSWITCH obj); + public void visitDUP_X1(DUP_X1 obj); + public void visitFCMPL(FCMPL obj); + public void visitI2C(I2C obj); + public void visitLMUL(LMUL obj); + public void visitLUSHR(LUSHR obj); + public void visitISHL(ISHL obj); + public void visitLALOAD(LALOAD obj); + public void visitASTORE(ASTORE obj); + public void visitANEWARRAY(ANEWARRAY obj); + public void visitFRETURN(FRETURN obj); + public void visitFADD(FADD obj); + public void visitBREAKPOINT(BREAKPOINT obj); +} diff --git a/src/java/org/apache/bcel/generic/package.html b/src/java/org/apache/bcel/generic/package.html new file mode 100644 index 00000000..2ae21266 --- /dev/null +++ b/src/java/org/apache/bcel/generic/package.html @@ -0,0 +1,16 @@ + + + + + + +

        +This package contains the "generic" part of the +Byte Code Engineering +Library, i.e., classes to dynamically modify class objects and +byte code instructions. +

        + + diff --git a/src/java/org/apache/bcel/package.html b/src/java/org/apache/bcel/package.html new file mode 100644 index 00000000..0ea9520c --- /dev/null +++ b/src/java/org/apache/bcel/package.html @@ -0,0 +1,17 @@ + + + + + + +

        +This package contains basic classes for the +Byte Code Engineering Library + and constants defined by the + + JVM specification. +

        + + diff --git a/src/java/org/apache/bcel/util/AttributeHTML.java b/src/java/org/apache/bcel/util/AttributeHTML.java new file mode 100644 index 00000000..aef1284f --- /dev/null +++ b/src/java/org/apache/bcel/util/AttributeHTML.java @@ -0,0 +1,256 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.classfile.*; +import java.io.*; + +/** + * Convert found attributes into HTML file. + * + * @version $Id$ + * @author M. Dahm + * + */ +final class AttributeHTML implements org.apache.bcel.Constants { + private String class_name; // name of current class + private PrintWriter file; // file to write to + private int attr_count = 0; + private ConstantHTML constant_html; + private ConstantPool constant_pool; + + AttributeHTML(String dir, String class_name, ConstantPool constant_pool, + ConstantHTML constant_html) throws IOException + { + this.class_name = class_name; + this.constant_pool = constant_pool; + this.constant_html = constant_html; + + file = new PrintWriter(new FileOutputStream(dir + class_name + "_attributes.html")); + file.println(""); + } + + private final String codeLink(int link, int method_number) { + return "" + + link + ""; + } + + final void close() { + file.println("
        "); + file.close(); + } + + final void writeAttribute(Attribute attribute, String anchor) throws IOException { + writeAttribute(attribute, anchor, 0); + } + + final void writeAttribute(Attribute attribute, String anchor, int method_number) throws IOException { + byte tag = attribute.getTag(); + int index; + + if(tag == ATTR_UNKNOWN) // Don't know what to do about this one + return; + + attr_count++; // Increment number of attributes found so far + + if(attr_count % 2 == 0) + file.print(""); + else + file.print(""); + + file.println("

        " + attr_count + " " + ATTRIBUTE_NAMES[tag] + "

        "); + + /* Handle different attributes + */ + switch(tag) { + case ATTR_CODE: + Code c = (Code)attribute; + Attribute[] attributes = c.getAttributes(); + + // Some directly printable values + file.print("
        • Maximum stack size = " + c.getMaxStack() + + "
        • \n
        • Number of local variables = " + + c.getMaxLocals() + "
        • \n
        • Byte code
        \n"); + + // Get handled exceptions and list them + CodeException[] ce = c.getExceptionTable(); + int len = ce.length; + + if(len > 0) { + file.print("

        Exceptions handled

          "); + + for(int i=0; i < len; i++) { + int catch_type = ce[i].getCatchType(); // Index in constant pool + + file.print("
        • "); + + if(catch_type != 0) + file.print(constant_html.referenceConstant(catch_type)); // Create Link to _cp.html + else + file.print("Any Exception"); + + file.print("
          (Ranging from lines " + codeLink(ce[i].getStartPC(), method_number) + + " to " + codeLink(ce[i].getEndPC(), method_number) + ", handled at line " + + codeLink(ce[i].getHandlerPC(), method_number) + ")
        • "); + } + file.print("
        "); + } + break; + + case ATTR_CONSTANT_VALUE: + index = ((ConstantValue)attribute).getConstantValueIndex(); + + // Reference _cp.html + file.print("\n"); + break; + + case ATTR_SOURCE_FILE: + index = ((SourceFile)attribute).getSourceFileIndex(); + + // Reference _cp.html + file.print("\n"); + break; + + case ATTR_EXCEPTIONS: + // List thrown exceptions + int[] indices = ((ExceptionTable)attribute).getExceptionIndexTable(); + + file.print("\n"); + break; + + case ATTR_LINE_NUMBER_TABLE: + LineNumber[] line_numbers =((LineNumberTable)attribute).getLineNumberTable(); + + // List line number pairs + file.print("

        "); + + for(int i=0; i < line_numbers.length; i++) { + file.print("(" + line_numbers[i].getStartPC() + ", " + line_numbers[i].getLineNumber() + ")"); + + if(i < line_numbers.length - 1) + file.print(", "); // breakable + } + break; + + case ATTR_LOCAL_VARIABLE_TABLE: + LocalVariable[] vars = ((LocalVariableTable)attribute).getLocalVariableTable(); + + // List name, range and type + file.print("

          "); + + for(int i=0; i < vars.length; i++) { + index = vars[i].getSignatureIndex(); + String signature = ((ConstantUtf8)constant_pool.getConstant(index, CONSTANT_Utf8)).getBytes(); + signature = Utility.signatureToString(signature, false); + int start = vars[i].getStartPC(); + int end = (start + vars[i].getLength()); + + file.println("
        • " + Class2HTML.referenceType(signature) + + " " + vars[i].getName() + " in slot %" + vars[i].getIndex() + + "
          Valid from lines " + + "" + + start + " to " + + "" + + end + "
        • "); + } + file.print("
        \n"); + + break; + + case ATTR_INNER_CLASSES: + InnerClass[] classes = ((InnerClasses)attribute).getInnerClasses(); + + // List inner classes + file.print("
          "); + + for(int i=0; i < classes.length; i++) { + String name, access; + + index = classes[i].getInnerNameIndex(); + if(index > 0) + name =((ConstantUtf8)constant_pool.getConstant(index, CONSTANT_Utf8)).getBytes(); + else + name = "<anonymous>"; + + access = Utility.accessToString(classes[i].getInnerAccessFlags()); + + file.print("
        • " + access + " "+ + constant_html.referenceConstant(classes[i].getInnerClassIndex()) + + " in class " + + constant_html.referenceConstant(classes[i].getOuterClassIndex()) + + " named " + name + "
        • \n"); + } + + file.print("
        \n"); + break; + + default: // Such as Unknown attribute or Deprecated + file.print("

        " + attribute.toString()); + } + + file.println(""); + file.flush(); + } +} diff --git a/src/java/org/apache/bcel/util/ByteSequence.java b/src/java/org/apache/bcel/util/ByteSequence.java new file mode 100644 index 00000000..db293414 --- /dev/null +++ b/src/java/org/apache/bcel/util/ByteSequence.java @@ -0,0 +1,82 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.io.*; + +/** + * Utility class that implements a sequence of bytes which can be read + * via the `readByte()' method. This is used to implement a wrapper for the + * Java byte code stream to gain some more readability. + * + * @version $Id$ + * @author M. Dahm + */ +public final class ByteSequence extends DataInputStream { + private ByteArrayStream byte_stream; + + public ByteSequence(byte[] bytes) { + super(new ByteArrayStream(bytes)); + byte_stream = (ByteArrayStream)in; + } + + public final int getIndex() { return byte_stream.getPosition(); } + final void unreadByte() { byte_stream.unreadByte(); } + + private static final class ByteArrayStream extends ByteArrayInputStream { + ByteArrayStream(byte[] bytes) { super(bytes); } + final int getPosition() { return pos; } // is protected in ByteArrayInputStream + final void unreadByte() { if(pos > 0) pos--; } + } +} diff --git a/src/java/org/apache/bcel/util/Class2HTML.java b/src/java/org/apache/bcel/util/Class2HTML.java new file mode 100644 index 00000000..f7442f25 --- /dev/null +++ b/src/java/org/apache/bcel/util/Class2HTML.java @@ -0,0 +1,262 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.io.*; +import java.util.BitSet; +import org.apache.bcel.classfile.*; +import org.apache.bcel.Constants; + +/** + * Read class file(s) and convert them into HTML files. + * + * Given a JavaClass object "class" that is in package "package" five files + * will be created in the specified directory. + * + *

          + *
        1. "package"."class".html as the main file which defines the frames for + * the following subfiles. + *
        2. "package"."class"_attributes.html contains all (known) attributes found in the file + *
        3. "package"."class"_cp.html contains the constant pool + *
        4. "package"."class"_code.html contains the byte code + *
        5. "package"."class"_methods.html contains references to all methods and fields of the class + *
        + * + * All subfiles reference each other appropiately, e.g. clicking on a + * method in the Method's frame will jump to the appropiate method in + * the Code frame. + * + * @version $Id$ + * @author M. Dahm +*/ +public class Class2HTML implements Constants +{ + private JavaClass java_class; // current class object + private String dir; + + private static String class_package; // name of package, unclean to make it static, but ... + private static String class_name; // name of current class, dito + private static ConstantPool constant_pool; + + /** + * Write contents of the given JavaClass into HTML files. + * + * @param java_class The class to write + * @param dir The directory to put the files in + */ + public Class2HTML(JavaClass java_class, String dir) throws IOException { + Method[] methods = java_class.getMethods(); + + this.java_class = java_class; + this.dir = dir; + class_name = java_class.getClassName(); // Remember full name + constant_pool = java_class.getConstantPool(); + + // Get package name by tacking off everything after the last `.' + int index = class_name.lastIndexOf('.'); + if(index > -1) + class_package = class_name.substring(0, index); + else + class_package = ""; // default package + + ConstantHTML constant_html = new ConstantHTML(dir, class_name, class_package, methods, + constant_pool); + + /* Attributes can't be written in one step, so we just open a file + * which will be written consequently. + */ + AttributeHTML attribute_html = new AttributeHTML(dir, class_name, constant_pool, constant_html); + + MethodHTML method_html = new MethodHTML(dir, class_name, methods, java_class.getFields(), + constant_html, attribute_html); + // Write main file (with frames, yuk) + writeMainHTML(attribute_html); + new CodeHTML(dir, class_name, methods, constant_pool, constant_html); + attribute_html.close(); + } + + public static void main(String argv[]) + { + String[] file_name = new String[argv.length]; + int files=0; + ClassParser parser=null; + JavaClass java_class=null; + String zip_file = null; + char sep = System.getProperty("file.separator").toCharArray()[0]; + String dir = "." + sep; // Where to store HTML files + + try { + /* Parse command line arguments. + */ + for(int i=0; i < argv.length; i++) { + if(argv[i].charAt(0) == '-') { // command line switch + if(argv[i].equals("-d")) { // Specify target directory, default `.´ + dir = argv[++i]; + + if(!dir.endsWith("" + sep)) + dir = dir + sep; + + new File(dir).mkdirs(); // Create target directory if necessary + } + else if(argv[i].equals("-zip")) + zip_file = argv[++i]; + else + System.out.println("Unknown option " + argv[i]); + } + else // add file name to list */ + file_name[files++] = argv[i]; + } + + if(files == 0) + System.err.println("Class2HTML: No input files specified."); + else { // Loop through files ... + for(int i=0; i < files; i++) { + System.out.print("Processing " + file_name[i] + "..."); + if(zip_file == null) + parser = new ClassParser(file_name[i]); // Create parser object from file + else + parser = new ClassParser(zip_file, file_name[i]); // Create parser object from zip file + + java_class = parser.parse(); + new Class2HTML(java_class, dir); + System.out.println("Done."); + } + } + } catch(Exception e) { + System.out.println(e); + e.printStackTrace(System.out); + } + } + + /** + * Utility method that converts a class reference in the constant pool, + * i.e., an index to a string. + */ + static String referenceClass(int index) { + String str = constant_pool.getConstantString(index, CONSTANT_Class); + str = Utility.compactClassName(str); + str = Utility.compactClassName(str, class_package + ".", true); + + return "" + str + ""; + } + + static final String referenceType(String type) { + String short_type = Utility.compactClassName(type); + short_type = Utility.compactClassName(short_type, class_package + ".", true); + + int index = type.indexOf('['); // Type is an array? + if(index > -1) + type = type.substring(0, index); // Tack of the `[' + + // test for basic type + if(type.equals("int") || type.equals("short") || type.equals("boolean") || type.equals("void") || + type.equals("char") || type.equals("byte") || type.equals("long") || type.equals("double") || + type.equals("float")) + return "" + type + ""; + else + return "" + short_type + ""; + } + + static String toHTML(String str) { + StringBuffer buf = new StringBuffer(); + + try { // Filter any characters HTML doesn't like such as < and > in particular + for(int i=0; i < str.length(); i++) { + char ch; + + switch(ch=str.charAt(i)) { + case '<': buf.append("<"); break; + case '>': buf.append(">"); break; + case '\n': buf.append("\\n"); break; + case '\r': buf.append("\\r"); break; + default: buf.append(ch); + } + } + } catch(StringIndexOutOfBoundsException e) {} // Never occurs + + return buf.toString(); + } + + private void writeMainHTML(AttributeHTML attribute_html) throws IOException { + PrintWriter file = new PrintWriter(new FileOutputStream(dir + class_name + ".html")); + Attribute[] attributes = java_class.getAttributes(); + + file.println("\n" + "Documentation for " + class_name + "" + + "\n" + + "\n" + + "\n" + + + "\n" + + "\n" + + "\n" + + + "\n" + + "\n" + + "\n" + + "" + ); + + file.close(); + + for(int i=0; i < attributes.length; i++) + attribute_html.writeAttribute(attributes[i], "class" + i); + } +} diff --git a/src/java/org/apache/bcel/util/ClassLoader.java b/src/java/org/apache/bcel/util/ClassLoader.java new file mode 100644 index 00000000..0af6a7a0 --- /dev/null +++ b/src/java/org/apache/bcel/util/ClassLoader.java @@ -0,0 +1,200 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.util.Hashtable; +import java.io.*; +import java.util.zip.*; +import org.apache.bcel.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; + +/** + *

        Drop in replacement for the standard class loader of the JVM. You can use it + * in conjunction with the JavaWrapper to dynamically modify/create classes + * as they're requested.

        + * + *

        This class loader recognizes special requests in a distinct + * format, i.e., when the name of the requested class contains with + * "$$BCEL$$" it calls the createClass() method with that name + * (everything bevor the $$BCEL$$ is considered to be the package + * name. You can subclass the class loader and override that + * method. "Normal" classes class can be modified by overriding the + * modifyClass() method which is called just before defineClass().

        + * + *

        There may be a number of packages where you have to use the default + * class loader (which may also be faster). You can define the set of packages + * where to use the system class loader in the constructor. The default value contains + * "java.", "sun.", "javax."

        + * + * @version $Id$ + * @author M. Dahm + * @see JavaWrapper + * @see ClassPath + */ +public class ClassLoader extends java.lang.ClassLoader { + private Hashtable classes = new Hashtable(); // Hashtable is synchronized thus thread-safe + private String[] ignored_packages = { + "java.", "javax.", "sun." + }; + + public ClassLoader() { + } + + /** @param ignored_packages classes contained in these packages will be loaded + * with the system class loader + */ + public ClassLoader(String[] ignored_packages) { + String[] new_p = new String[ignored_packages.length + this.ignored_packages.length]; + + System.arraycopy(this.ignored_packages, 0, new_p, 0, this.ignored_packages.length); + System.arraycopy(ignored_packages, 0, new_p, this.ignored_packages.length, + ignored_packages.length); + + this.ignored_packages = new_p; + } + + protected Class loadClass(String class_name, boolean resolve) + throws ClassNotFoundException + { + Class cl = null; + + /* First try: lookup hash table. + */ + if((cl=(Class)classes.get(class_name)) == null) { + /* Second try: Load system class using system class loader. You better + * don't mess around with them. + */ + for(int i=0; i < ignored_packages.length; i++) { + if(class_name.startsWith(ignored_packages[i])) { + cl = Class.forName(class_name); + break; + } + } + + if(cl == null) { + JavaClass clazz = null; + + /* Third try: Special request? + */ + if(class_name.indexOf("$$BCEL$$") >= 0) + clazz = createClass(class_name); + else // Fourth try: Load classes via repository + clazz = modifyClass(Repository.lookupClass(class_name)); + + if(clazz != null) { + byte[] bytes = clazz.getBytes(); + cl = defineClass(class_name, bytes, 0, bytes.length); + } else // Fourth try: Use default class loader + cl = Class.forName(class_name); + } + + if(resolve) + resolveClass(cl); + } + + classes.put(class_name, cl); + + return cl; + } + + /** Override this method if you want to alter a class before it gets actually + * loaded. Does nothing by default. + */ + protected JavaClass modifyClass(JavaClass clazz) { + return clazz; + } + + /** + * Override this method to create you own classes on the fly. The + * name contains the special token $$BCEL$$. Everything before that + * token is consddered to be a package name. You can encode you own + * arguments into the subsequent string. You must regard however not + * to use any "illegal" characters, i.e., characters that may not + * appear in a Java class name too
        + * + * The default implementation interprets the string as a encoded compressed + * Java class, unpacks and decodes it with the Utility.decode() method, and + * parses thee resulting byte array and returns the resulting JavaClass object. + * + * @param class_name compressed byte code with "$$BCEL$$" in it + */ + protected JavaClass createClass(String class_name) { + int index = class_name.indexOf("$$BCEL$$"); + String real_name = class_name.substring(index + 8); + + JavaClass clazz = null; + try { + byte[] bytes = Utility.decode(real_name, true); + ClassParser parser = new ClassParser(new ByteArrayInputStream(bytes), "foo"); + + clazz = parser.parse(); + } catch(Throwable e) { + e.printStackTrace(); + return null; + } + + // Adapt the class name to the passed value + ConstantPool cp = clazz.getConstantPool(); + + ConstantClass cl = (ConstantClass)cp.getConstant(clazz.getClassNameIndex(), + Constants.CONSTANT_Class); + ConstantUtf8 name = (ConstantUtf8)cp.getConstant(cl.getNameIndex(), + Constants.CONSTANT_Utf8); + name.setBytes(class_name.replace('.', '/')); + + return clazz; + } +} diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java new file mode 100644 index 00000000..c4d77724 --- /dev/null +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -0,0 +1,322 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.util.*; +import java.util.zip.*; +import java.io.*; + +/** + * Responsible for loading (class) files from the CLASSPATH. Inspired by + * sun.tools.ClassPath. + * + * @version $Id$ + * @author M. Dahm + */ +public class ClassPath { + private PathEntry[] paths; + + /** + * Search for classes in given path. + */ + public ClassPath(String class_path) { + ArrayList vec = new ArrayList(); + + for(StringTokenizer tok=new StringTokenizer(class_path, + System.getProperty("path.separator")); + tok.hasMoreTokens();) + { + String path = tok.nextToken(); + + if(!path.equals("")) { + File file = new File(path); + + try { + if(file.exists()) { + if(file.isDirectory()) + vec.add(new Dir(path)); + else + vec.add(new Zip(new ZipFile(file))); + } + } catch(IOException e) { + System.err.println("CLASSPATH component " + file + ": " + e); + } + } + } + + paths = new PathEntry[vec.size()]; + vec.toArray(paths); + } + + /** + * Search for classes in CLASSPATH. + */ + public ClassPath() { + this(getClassPath()); + } + + private static final void getPathComponents(String path, ArrayList list) { + if(path != null) { + StringTokenizer tok = new StringTokenizer(path, File.pathSeparator); + + while(tok.hasMoreTokens()) { + String name = tok.nextToken(); + File file = new File(name); + + if(file.exists()) + list.add(name); + } + } + } + + private static final String getClassPath() { + String class_path = System.getProperty("java.class.path"); + String boot_path = System.getProperty("sun.boot.class.path"); + String ext_path = System.getProperty("java.ext.dirs"); + + ArrayList list = new ArrayList(); + + getPathComponents(class_path, list); + getPathComponents(boot_path, list); + + ArrayList dirs = new ArrayList(); + getPathComponents(ext_path, dirs); + + for(Iterator e = dirs.iterator(); e.hasNext(); ) { + File ext_dir = new File((String)e.next()); + String[] extensions = ext_dir.list(new FilenameFilter() { + public boolean accept(File dir, String name) { + name = name.toLowerCase(); + return name.endsWith(".zip") || name.endsWith(".jar"); + } + }); + + if(extensions != null) + for(int i=0; i < extensions.length; i++) + list.add(ext_path + File.separatorChar + extensions[i]); + } + + StringBuffer buf = new StringBuffer(); + + for(Iterator e = list.iterator(); e.hasNext(); ) { + buf.append((String)e.next()); + + if(e.hasNext()) + buf.append(File.pathSeparatorChar); + } + + return buf.toString(); + } + + /** + * @param name fully qualified class name, e.g. java.lang.String + * @return input stream for class + */ + public InputStream getInputStream(String name) throws IOException { + return getInputStream(name, ".class"); + } + + /** + * @param name fully qualified file name, e.g. java/lang/String + * @param suffix file name ends with suff, e.g. .java + * @return input stream for file on class path + */ + public InputStream getInputStream(String name, String suffix) throws IOException { + return getClassFile(name, suffix).getInputStream(); + } + + /** + * @param name fully qualified file name, e.g. java/lang/String + * @param suffix file name ends with suff, e.g. .java + * @return class file for the java class + */ + public ClassFile getClassFile(String name, String suffix) throws IOException { + for(int i=0; i < paths.length; i++) { + ClassFile cf; + + if((cf = paths[i].getClassFile(name, suffix)) != null) + return cf; + } + + throw new IOException("Couldn't find: " + name + suffix); + } + + /** + * @param name fully qualified class name, e.g. java.lang.String + * @return input stream for class + */ + public ClassFile getClassFile(String name) throws IOException { + return getClassFile(name, ".class"); + } + + /** + * @param name fully qualified file name, e.g. java/lang/String + * @param suffix file name ends with suffix, e.g. .java + * @return byte array for file on class path + */ + public byte[] getBytes(String name, String suffix) throws IOException { + InputStream is = getInputStream(name, suffix); + + if(is == null) + throw new IOException("Couldn't find: " + name + suffix); + + DataInputStream dis = new DataInputStream(is); + byte[] bytes = new byte[is.available()]; + dis.readFully(bytes); + dis.close(); is.close(); + + return bytes; + } + + /** + * @return byte array for class + */ + public byte[] getBytes(String name) throws IOException { + return getBytes(name, ".class"); + } + + /** + * @param name name of file to search for, e.g. java/lang/String.java + * @return full (canonical) path for file + */ + public String getPath(String name) throws IOException { + int index = name.lastIndexOf('.'); + String suffix = ""; + + if(index > 0) { + suffix = name.substring(index); + name = name.substring(0, index); + } + + return getPath(name, suffix); + } + + /** + * @param name name of file to search for, e.g. java/lang/String + * @param suffix file name suffix, e.g. .java + * @return full (canonical) path for file, if it exists + */ + public String getPath(String name, String suffix) throws IOException { + return getClassFile(name, suffix).getPath(); + } + + private static abstract class PathEntry { + abstract ClassFile getClassFile(String name, String suffix) throws IOException; + } + + /** Contains information about file/ZIP entry of the Java class. + */ + public abstract static class ClassFile { + /** @return input stream for class file. + */ + public abstract InputStream getInputStream() throws IOException; + + /** @return canonical path to class file. + */ + public abstract String getPath(); + + /** @return modification time of class file. + */ + public abstract long getTime(); + + /** @return size of class file. + */ + public abstract long getSize(); + } + + private static class Dir extends PathEntry { + private String dir; + + Dir(String d) { dir = d; } + + ClassFile getClassFile(String name, String suffix) throws IOException { + final File file = new File(dir + File.separatorChar + + name.replace('.', File.separatorChar) + suffix); + + return file.exists()? new ClassFile() { + public InputStream getInputStream() throws IOException { return new FileInputStream(file); } + + public String getPath() { try { + return file.getCanonicalPath(); + } catch(IOException e) { return null; } + + } + public long getTime() { return file.lastModified(); } + public long getSize() { return file.length(); } + } : null; + } + + public String toString() { return dir; } + } + + private static class Zip extends PathEntry { + private ZipFile zip; + + Zip(ZipFile z) { zip = z; } + + ClassFile getClassFile(String name, String suffix) throws IOException { + final ZipEntry entry = zip.getEntry(name.replace('.', '/') + suffix); + + return (entry != null)? new ClassFile() { + public InputStream getInputStream() throws IOException { return zip.getInputStream(entry); } + public String getPath() { return entry.toString(); } + public long getTime() { return entry.getTime(); } + public long getSize() { return entry.getSize(); } + } : null; + } + } +} + + diff --git a/src/java/org/apache/bcel/util/ClassQueue.java b/src/java/org/apache/bcel/util/ClassQueue.java new file mode 100644 index 00000000..e543917e --- /dev/null +++ b/src/java/org/apache/bcel/util/ClassQueue.java @@ -0,0 +1,78 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.util.ArrayList; +import org.apache.bcel.classfile.JavaClass; + +/** + * Utility class implementing a (typesafe) queue of JavaClass + * objects. + * + * @version $Id$ + * @author M. Dahm + * @see ClassVector +*/ +public class ClassQueue { + protected int left = 0; + private ArrayList vec = new ArrayList(); + + public void enqueue(JavaClass clazz) { vec.add(clazz); } + public JavaClass dequeue() { + JavaClass clazz = (JavaClass)vec.get(left); + vec.remove(left++); + return clazz; + } + public boolean empty() { return vec.size() <= left; } +} diff --git a/src/java/org/apache/bcel/util/ClassStack.java b/src/java/org/apache/bcel/util/ClassStack.java new file mode 100644 index 00000000..79b0af05 --- /dev/null +++ b/src/java/org/apache/bcel/util/ClassStack.java @@ -0,0 +1,73 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.util.Stack; +import org.apache.bcel.classfile.JavaClass; + +/** + * Utility class implementing a (typesafe) stack of JavaClass objects. + * + * @version $Id$ + * @author M. Dahm + * @see Stack +*/ +public class ClassStack { + private Stack stack = new Stack(); + + public void push(JavaClass clazz) { stack.push(clazz); } + public JavaClass pop() { return (JavaClass)stack.pop(); } + public JavaClass top() { return (JavaClass)stack.peek(); } + public boolean empty() { return stack.empty(); } +} diff --git a/src/java/org/apache/bcel/util/ClassVector.java b/src/java/org/apache/bcel/util/ClassVector.java new file mode 100644 index 00000000..a04f0721 --- /dev/null +++ b/src/java/org/apache/bcel/util/ClassVector.java @@ -0,0 +1,79 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.util.ArrayList; +import org.apache.bcel.classfile.JavaClass; + +/** + * Utility class implementing a (typesafe) collection of JavaClass + * objects. Contains the most important methods of a Vector. + * + * @version $Id$ + * @author M. Dahm + * @see ClassQueue +*/ +public class ClassVector { + protected ArrayList vec = new ArrayList(); + + public void addElement(JavaClass clazz) { vec.add(clazz); } + public JavaClass elementAt(int index) { return (JavaClass)vec.get(index); } + public void removeElementAt(int index) { vec.remove(index); } + + public JavaClass[] toArray() { + JavaClass[] classes = new JavaClass[vec.size()]; + vec.toArray(classes); + return classes; + } +} diff --git a/src/java/org/apache/bcel/util/CodeHTML.java b/src/java/org/apache/bcel/util/CodeHTML.java new file mode 100644 index 00000000..38a442c7 --- /dev/null +++ b/src/java/org/apache/bcel/util/CodeHTML.java @@ -0,0 +1,618 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.classfile.*; +import java.io.*; +import java.util.BitSet; + +/** + * Convert code into HTML file. + * + * @version $Id$ + * @author M. Dahm + * + */ +final class CodeHTML implements org.apache.bcel.Constants { + private String class_name; // name of current class + private Method[] methods; // Methods to print + private PrintWriter file; // file to write to + private BitSet goto_set; + private ConstantPool constant_pool; + private ConstantHTML constant_html; + private static boolean wide=false; + + CodeHTML(String dir, String class_name, + Method[] methods, ConstantPool constant_pool, + ConstantHTML constant_html) throws IOException + { + this.class_name = class_name; + this.methods = methods; + this.constant_pool = constant_pool; + this.constant_html = constant_html; + + file = new PrintWriter(new FileOutputStream(dir + class_name + "_code.html")); + file.println(""); + + for(int i=0; i < methods.length; i++) + writeMethod(methods[i], i); + + file.println(""); + file.close(); + } + + /** + * Disassemble a stream of byte codes and return the + * string representation. + * + * @param stream data input stream + * @return String representation of byte code + */ + private final String codeToHTML(ByteSequence bytes, int method_number) + throws IOException + { + short opcode = (short)bytes.readUnsignedByte(); + StringBuffer buf; + String name, sig, signature; + int default_offset=0, low, high; + int index, class_index, vindex, constant; + int[] jump_table; + int no_pad_bytes=0, offset; + + buf = new StringBuffer("" + OPCODE_NAMES[opcode] + ""); + + /* Special case: Skip (0-3) padding bytes, i.e., the + * following bytes are 4-byte-aligned + */ + if((opcode == TABLESWITCH) || (opcode == LOOKUPSWITCH)) { + int remainder = bytes.getIndex() % 4; + no_pad_bytes = (remainder == 0)? 0 : 4 - remainder; + + for(int i=0; i < no_pad_bytes; i++) + bytes.readByte(); + + // Both cases have a field default_offset in common + default_offset = bytes.readInt(); + } + + switch(opcode) { + case TABLESWITCH: + low = bytes.readInt(); + high = bytes.readInt(); + + offset = bytes.getIndex() - 12 - no_pad_bytes - 1; + default_offset += offset; + + buf.append(""); + + // Print switch indices in first row (and default) + jump_table = new int[high - low + 1]; + for(int i=0; i < jump_table.length; i++) { + jump_table[i] = offset + bytes.readInt(); + + buf.append(""); + } + buf.append("\n"); + + // Print target and default indices in second row + for(int i=0; i < jump_table.length; i++) + buf.append(""); + buf.append("\n
        " + (low + i) + "default
        " + jump_table[i] + "" + default_offset + "
        \n"); + + break; + + /* Lookup switch has variable length arguments. + */ + case LOOKUPSWITCH: + int npairs = bytes.readInt(); + offset = bytes.getIndex() - 8 - no_pad_bytes - 1; + jump_table = new int[npairs]; + default_offset += offset; + + buf.append(""); + + // Print switch indices in first row (and default) + for(int i=0; i < npairs; i++) { + int match = bytes.readInt(); + + jump_table[i] = offset + bytes.readInt(); + buf.append(""); + } + buf.append("\n"); + + // Print target and default indices in second row + for(int i=0; i < npairs; i++) + buf.append(""); + buf.append("\n
        " + match + "default
        " + jump_table[i] + "" + default_offset + "
        \n"); + break; + + /* Two address bytes + offset from start of byte stream form the + * jump target. + */ + case GOTO: case IFEQ: case IFGE: case IFGT: + case IFLE: case IFLT: + case IFNE: case IFNONNULL: case IFNULL: case IF_ACMPEQ: + case IF_ACMPNE: case IF_ICMPEQ: case IF_ICMPGE: case IF_ICMPGT: + case IF_ICMPLE: case IF_ICMPLT: case IF_ICMPNE: case JSR: + + index = (int)(bytes.getIndex() + bytes.readShort() - 1); + + buf.append("" + index + ""); + break; + + /* Same for 32-bit wide jumps + */ + case GOTO_W: case JSR_W: + int windex = bytes.getIndex() + bytes.readInt() - 1; + buf.append("" + + windex + ""); + break; + + /* Index byte references local variable (register) + */ + case ALOAD: case ASTORE: case DLOAD: case DSTORE: case FLOAD: + case FSTORE: case ILOAD: case ISTORE: case LLOAD: case LSTORE: + case RET: + if(wide) { + vindex = bytes.readShort(); + wide=false; // Clear flag + } + else + vindex = bytes.readUnsignedByte(); + + buf.append("%" + vindex); + break; + + /* + * Remember wide byte which is used to form a 16-bit address in the + * following instruction. Relies on that the method is called again with + * the following opcode. + */ + case WIDE: + wide = true; + buf.append("(wide)"); + break; + + /* Array of basic type. + */ + case NEWARRAY: + buf.append("" + TYPE_NAMES[bytes.readByte()] + ""); + break; + + /* Access object/class fields. + */ + case GETFIELD: case GETSTATIC: case PUTFIELD: case PUTSTATIC: + index = bytes.readShort(); + ConstantFieldref c1 = (ConstantFieldref)constant_pool.getConstant(index, CONSTANT_Fieldref); + + class_index = c1.getClassIndex(); + name = constant_pool.getConstantString(class_index, CONSTANT_Class); + name = Utility.compactClassName(name, false); + + index = c1.getNameAndTypeIndex(); + String field_name = constant_pool.constantToString(index, CONSTANT_NameAndType); + + if(name.equals(class_name)) { // Local field + buf.append("" + field_name + "\n"); + } + else + buf.append(constant_html.referenceConstant(class_index) + "." + field_name); + + break; + + /* Operands are references to classes in constant pool + */ + case CHECKCAST: case INSTANCEOF: case NEW: + index = bytes.readShort(); + buf.append(constant_html.referenceConstant(index)); + break; + + /* Operands are references to methods in constant pool + */ + case INVOKESPECIAL: case INVOKESTATIC: case INVOKEVIRTUAL: case INVOKEINTERFACE: + int m_index = bytes.readShort(); + String str; + + if(opcode == INVOKEINTERFACE) { // Special treatment needed + int nargs = bytes.readUnsignedByte(); // Redundant + int reserved = bytes.readUnsignedByte(); // Reserved + + ConstantInterfaceMethodref c=(ConstantInterfaceMethodref)constant_pool.getConstant(m_index, CONSTANT_InterfaceMethodref); + + class_index = c.getClassIndex(); + str = constant_pool.constantToString(c); + index = c.getNameAndTypeIndex(); + } + else { + ConstantMethodref c = (ConstantMethodref)constant_pool.getConstant(m_index, CONSTANT_Methodref); + class_index = c.getClassIndex(); + + str = constant_pool.constantToString(c); + index = c.getNameAndTypeIndex(); + } + + name = Class2HTML.referenceClass(class_index); + str = Class2HTML.toHTML(constant_pool.constantToString(constant_pool.getConstant(index, CONSTANT_NameAndType))); + + // Get signature, i.e., types + ConstantNameAndType c2 = (ConstantNameAndType)constant_pool. + getConstant(index, CONSTANT_NameAndType); + signature = constant_pool.constantToString(c2.getSignatureIndex(), + CONSTANT_Utf8); + String[] args = Utility.methodSignatureArgumentTypes(signature, false); + String type = Utility.methodSignatureReturnType(signature, false); + + buf.append(name + "." + str + "" + "("); + + // List arguments + for(int i=0; i < args.length; i++) { + buf.append(Class2HTML.referenceType(args[i])); + + if(i < args.length - 1) + buf.append(", "); + } + // Attach return type + buf.append("):" + Class2HTML.referenceType(type)); + + break; + + /* Operands are references to items in constant pool + */ + case LDC_W: case LDC2_W: + index = bytes.readShort(); + + buf.append("" + + Class2HTML.toHTML(constant_pool.constantToString(index, + constant_pool. + getConstant(index).getTag()))+ + ""); + break; + + case LDC: + index = bytes.readUnsignedByte(); + buf.append("" + + Class2HTML.toHTML(constant_pool.constantToString(index, + constant_pool. + getConstant(index).getTag()))+ + ""); + break; + + /* Array of references. + */ + case ANEWARRAY: + index = bytes.readShort(); + + buf.append(constant_html.referenceConstant(index)); + break; + + /* Multidimensional array of references. + */ + case MULTIANEWARRAY: + index = bytes.readShort(); + int dimensions = bytes.readByte(); + buf.append(constant_html.referenceConstant(index) + ":" + dimensions + "-dimensional"); + break; + + /* Increment local variable. + */ + case IINC: + if(wide) { + vindex = bytes.readShort(); + constant = bytes.readShort(); + wide = false; + } + else { + vindex = bytes.readUnsignedByte(); + constant = bytes.readByte(); + } + buf.append("%" + vindex + " " + constant); + break; + + default: + if(NO_OF_OPERANDS[opcode] > 0) { + for(int i=0; i < TYPE_OF_OPERANDS[opcode].length; i++) { + switch(TYPE_OF_OPERANDS[opcode][i]) { + case T_BYTE: + buf.append(bytes.readUnsignedByte()); + break; + + case T_SHORT: // Either branch or index + buf.append(bytes.readShort()); + break; + + case T_INT: + buf.append(bytes.readInt()); + break; + + default: // Never reached + System.err.println("Unreachable default case reached!"); + System.exit(-1); + } + buf.append(" "); + } + } + } + + buf.append(""); + return buf.toString(); + } + + /** + * Find all target addresses in code, so that they can be marked + * with <A NAME = ...>. Target addresses are kept in an BitSet object. + */ + private final void findGotos(ByteSequence bytes, Method method, Code code) + throws IOException + { + int index; + goto_set = new BitSet(bytes.available()); + int opcode; + + /* First get Code attribute from method and the exceptions handled + * (try .. catch) in this method. We only need the line number here. + */ + + if(code != null) { + CodeException[] ce = code.getExceptionTable(); + int len = ce.length; + + for(int i=0; i < len; i++) { + goto_set.set(ce[i].getStartPC()); + goto_set.set(ce[i].getEndPC()); + goto_set.set(ce[i].getHandlerPC()); + } + + // Look for local variables and their range + Attribute[] attributes = code.getAttributes(); + for(int i=0; i < attributes.length; i++) { + if(attributes[i].getTag() == ATTR_LOCAL_VARIABLE_TABLE) { + LocalVariable[] vars = ((LocalVariableTable)attributes[i]).getLocalVariableTable(); + + for(int j=0; j < vars.length; j++) { + int start = vars[j].getStartPC(); + int end = (int)(start + vars[j].getLength()); + goto_set.set(start); + goto_set.set(end); + } + break; + } + } + } + + // Get target addresses from GOTO, JSR, TABLESWITCH, etc. + for(int i=0; bytes.available() > 0; i++) { + opcode = bytes.readUnsignedByte(); + //System.out.println(OPCODE_NAMES[opcode]); + switch(opcode) { + case TABLESWITCH: case LOOKUPSWITCH: + //bytes.readByte(); // Skip already read byte + + int remainder = bytes.getIndex() % 4; + int no_pad_bytes = (remainder == 0)? 0 : 4 - remainder; + int default_offset, offset; + + for(int j=0; j < no_pad_bytes; j++) + bytes.readByte(); + + // Both cases have a field default_offset in common + default_offset = bytes.readInt(); + + if(opcode == TABLESWITCH) { + int low = bytes.readInt(); + int high = bytes.readInt(); + + offset = bytes.getIndex() - 12 - no_pad_bytes - 1; + default_offset += offset; + goto_set.set(default_offset); + + for(int j=0; j < (high - low + 1); j++) { + index = offset + bytes.readInt(); + goto_set.set(index); + } + } + else { // LOOKUPSWITCH + int npairs = bytes.readInt(); + + offset = bytes.getIndex() - 8 - no_pad_bytes - 1; + default_offset += offset; + goto_set.set(default_offset); + + for(int j=0; j < npairs; j++) { + int match = bytes.readInt(); + + index = offset + bytes.readInt(); + goto_set.set(index); + } + } + break; + + case GOTO: case IFEQ: case IFGE: case IFGT: + case IFLE: case IFLT: + case IFNE: case IFNONNULL: case IFNULL: case IF_ACMPEQ: + case IF_ACMPNE: case IF_ICMPEQ: case IF_ICMPGE: case IF_ICMPGT: + case IF_ICMPLE: case IF_ICMPLT: case IF_ICMPNE: case JSR: + //bytes.readByte(); // Skip already read byte + index = bytes.getIndex() + bytes.readShort() - 1; + + goto_set.set(index); + break; + + case GOTO_W: case JSR_W: + //bytes.readByte(); // Skip already read byte + index = bytes.getIndex() + bytes.readInt() - 1; + goto_set.set(index); + break; + + default: + bytes.unreadByte(); + codeToHTML(bytes, 0); // Ignore output + } + } + } + + /** + * Write a single method with the byte code associated with it. + */ + private void writeMethod(Method method, int method_number) + throws IOException + { + // Get raw signature + String signature = method.getSignature(); + // Get array of strings containing the argument types + String[] args = Utility.methodSignatureArgumentTypes(signature, false); + // Get return type string + String type = Utility.methodSignatureReturnType(signature, false); + // Get method name + String name = method.getName(); + String html_name = Class2HTML.toHTML(name); + // Get method's access flags + String access = Utility.accessToString(method.getAccessFlags()); + access = Utility.replace(access, " ", " "); + // Get the method's attributes, the Code Attribute in particular + Attribute[] attributes= method.getAttributes(); + + file.print("

        " + access + " " + + "" + Class2HTML.referenceType(type) + + " " + html_name + "("); + + for(int i=0; i < args.length; i++) { + file.print(Class2HTML.referenceType(args[i])); + if(i < args.length - 1) + file.print(", "); + } + + file.println(")

        "); + + Code c=null; + byte[] code=null; + + if(attributes.length > 0) { + file.print("

        Attributes

          \n"); + for(int i=0; i < attributes.length; i++) { + byte tag = attributes[i].getTag(); + + if(tag != ATTR_UNKNOWN) + file.print("
        • " + ATTRIBUTE_NAMES[tag] + "
        • \n"); + else + file.print("
        • " + attributes[i] + "
        • "); + + if(tag == ATTR_CODE) { + c = (Code)attributes[i]; + Attribute[] attributes2 = c.getAttributes(); + code = c.getCode(); + + file.print("
            "); + for(int j=0; j < attributes2.length; j++) { + tag = attributes2[j].getTag(); + file.print("
          • " + + ATTRIBUTE_NAMES[tag] + "
          • \n"); + + } + file.print("
          "); + } + } + file.println("
        "); + } + + if(code != null) { // No code, an abstract method, e.g. + //System.out.println(name + "\n" + Utility.codeToString(code, constant_pool, 0, -1)); + + // Print the byte code + ByteSequence stream = new ByteSequence(code); + stream.mark(stream.available()); + findGotos(stream, method, c); + stream.reset(); + + file.println("" + + ""); + + for(int i=0; stream.available() > 0; i++) { + int offset = stream.getIndex(); + String str = codeToHTML(stream, method_number); + String anchor = ""; + + /* Set an anchor mark if this line is targetted by a goto, jsr, etc. + * Defining an anchor for every line is very inefficient! + */ + if(goto_set.get(offset)) + anchor = ""; + + String anchor2; + if(stream.getIndex() == code.length) // last loop + anchor2 = "" + offset + ""; + else + anchor2 = "" + offset; + + file.println(""); + } + + // Mark last line, may be targetted from Attributes window + file.println(""); + file.println("
        Byte
        offset
        InstructionArgument
        " + anchor2 + "" + anchor + str + "
        "); + } + + } +} diff --git a/src/java/org/apache/bcel/util/ConstantHTML.java b/src/java/org/apache/bcel/util/ConstantHTML.java new file mode 100644 index 00000000..5c5819f2 --- /dev/null +++ b/src/java/org/apache/bcel/util/ConstantHTML.java @@ -0,0 +1,262 @@ + +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.classfile.*; +import java.io.*; + +/** + * Convert constant pool into HTML file. + * + * @version $Id$ + * @author M. Dahm + * + */ +final class ConstantHTML implements org.apache.bcel.Constants { + private String class_name; // name of current class + private String class_package; // name of package + private ConstantPool constant_pool; // reference to constant pool + private PrintWriter file; // file to write to + private String[] constant_ref; // String to return for cp[i] + private Constant[] constants; // The constants in the cp + private Method[] methods; + + ConstantHTML(String dir, String class_name, String class_package, Method[] methods, + ConstantPool constant_pool) throws IOException + { + this.class_name = class_name; + this.class_package = class_package; + this.constant_pool = constant_pool; + this.methods = methods; + constants = constant_pool.getConstantPool(); + file = new PrintWriter(new FileOutputStream(dir + class_name + "_cp.html")); + constant_ref = new String[constants.length]; + constant_ref[0] = "<unknown>"; + + file.println(""); + + // Loop through constants, constants[0] is reserved + for(int i=1; i < constants.length; i++) { + if(i % 2 == 0) + file.print("\n"); + } + + file.println("
        "); + else + file.print("
        "); + + if(constants[i] != null) + writeConstant(i); + + file.print("
        "); + file.close(); + } + + String referenceConstant(int index) { + return constant_ref[index]; + } + + private void writeConstant(int index) { + byte tag = constants[index].getTag(); + int class_index, name_index; + String ref; + + // The header is always the same + file.println("

        " + index + " " + CONSTANT_NAMES[tag] + "

        "); + + /* For every constant type get the needed parameters and print them appropiately + */ + switch(tag) { + case CONSTANT_InterfaceMethodref: + case CONSTANT_Methodref: + // Get class_index and name_and_type_index, depending on type + if(tag == CONSTANT_Methodref) { + ConstantMethodref c = (ConstantMethodref)constant_pool.getConstant(index, CONSTANT_Methodref); + class_index = c.getClassIndex(); + name_index = c.getNameAndTypeIndex(); + } + else { + ConstantInterfaceMethodref c1 = (ConstantInterfaceMethodref)constant_pool.getConstant(index, CONSTANT_InterfaceMethodref); + class_index = c1.getClassIndex(); + name_index = c1.getNameAndTypeIndex(); + } + + // Get method name and its class + String method_name = constant_pool.constantToString(name_index, CONSTANT_NameAndType); + String html_method_name = Class2HTML.toHTML(method_name); + + // Partially compacted class name, i.e., / -> . + String method_class = constant_pool.constantToString(class_index, CONSTANT_Class); + String short_method_class = Utility.compactClassName(method_class); // I.e., remove java.lang. + short_method_class = Utility.compactClassName(method_class); // I.e., remove java.lang. + short_method_class = Utility.compactClassName(short_method_class, class_package + ".", true); // Remove class package prefix + + // Get method signature + ConstantNameAndType c2 = (ConstantNameAndType)constant_pool.getConstant(name_index, CONSTANT_NameAndType); + String signature = constant_pool.constantToString(c2.getSignatureIndex(), CONSTANT_Utf8); + // Get array of strings containing the argument types + String[] args = Utility.methodSignatureArgumentTypes(signature, false); + + // Get return type string + String type = Utility.methodSignatureReturnType(signature, false); + String ret_type = Class2HTML.referenceType(type); + + StringBuffer buf = new StringBuffer("("); + for(int i=0; i < args.length; i++) { + buf.append(Class2HTML.referenceType(args[i])); + if(i < args.length - 1) + buf.append(", "); + } + buf.append(")"); + + String arg_types = buf.toString(); + + if(method_class.equals(class_name)) // Method is local to class + ref = "" + html_method_name + ""; + else + ref = "" + short_method_class + + "." + html_method_name; + + constant_ref[index] = ret_type + " " + + short_method_class + "." + html_method_name + " " + arg_types; + + file.println("

        " + ret_type + " " + ref + arg_types + " \n

        "); + break; + + case CONSTANT_Fieldref: + // Get class_index and name_and_type_index + ConstantFieldref c3 = (ConstantFieldref)constant_pool.getConstant(index, CONSTANT_Fieldref); + class_index = c3.getClassIndex(); + name_index = c3.getNameAndTypeIndex(); + + // Get method name and its class (compacted) + String field_class = constant_pool.constantToString(class_index, CONSTANT_Class); + String short_field_class = Utility.compactClassName(field_class); // I.e., remove java.lang. + short_field_class = Utility.compactClassName(short_field_class, class_package + ".", true); // Remove class package prefix + + String field_name = constant_pool.constantToString(name_index, CONSTANT_NameAndType); + + if(field_class.equals(class_name)) // Field is local to class + ref = "" + field_name + ""; + else + ref = "" + + short_field_class + "." + field_name + "\n"; + + constant_ref[index] = "" + + short_field_class + "." + field_name + ""; + + file.println("

        " + ref + "
        \n" + "

        "); + break; + + case CONSTANT_Class: + ConstantClass c4 = (ConstantClass)constant_pool.getConstant(index, CONSTANT_Class); + name_index = c4.getNameIndex(); + String class_name2 = constant_pool.constantToString(index, tag); // / -> . + String short_class_name = Utility.compactClassName(class_name2); // I.e., remove java.lang. + short_class_name = Utility.compactClassName(short_class_name, class_package + ".", true); // Remove class package prefix + + ref = "" + short_class_name + ""; + constant_ref[index] = "" + short_class_name + ""; + + file.println("

        " + ref + "

        \n"); + break; + + case CONSTANT_String: + ConstantString c5 = (ConstantString)constant_pool.getConstant(index, CONSTANT_String); + name_index = c5.getStringIndex(); + + String str = Class2HTML.toHTML(constant_pool.constantToString(index, tag)); + + file.println("

        " + str + "

        \n"); + break; + + case CONSTANT_NameAndType: + ConstantNameAndType c6 = (ConstantNameAndType)constant_pool.getConstant(index, CONSTANT_NameAndType); + name_index = c6.getNameIndex(); + int signature_index = c6.getSignatureIndex(); + + file.println("

        " + Class2HTML.toHTML(constant_pool.constantToString(index, tag)) + "

        \n"); + break; + + default: + file.println("

        " + Class2HTML.toHTML(constant_pool.constantToString(index, tag)) + "\n"); + } // switch + } + + private final int getMethodNumber(String str) { + for(int i=0; i < methods.length; i++) { + String cmp = methods[i].getName() + methods[i].getSignature(); + if(cmp.equals(str)) + return i; + } + return -1; + } +} diff --git a/src/java/org/apache/bcel/util/InstructionFinder.java b/src/java/org/apache/bcel/util/InstructionFinder.java new file mode 100644 index 00000000..4e3370bb --- /dev/null +++ b/src/java/org/apache/bcel/util/InstructionFinder.java @@ -0,0 +1,440 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.util.*; +import org.apache.bcel.Constants; +import org.apache.bcel.generic.*; +import org.apache.regexp.*; + +/** + * InstructionFinder is a tool to search for given instructions patterns, + * i.e., match sequences of instructions in an instruction list via + * regular expressions. This can be used, e.g., in order to implement + * a peep hole optimizer that looks for code patterns and replaces + * them with faster equivalents. + * + *

        This class internally uses the + * Regexp package to search for regular expressions. + * + * A typical application would look like this: +

        +    InstructionFinder f   = new InstructionFinder(il);
        +    String            pat = "IfInstruction ICONST_0 GOTO ICONST_1 NOP (IFEQ|IFNE)";
        +    
        +    for(Iterator i = f.search(pat, constraint); i.hasNext(); ) {
        +      InstructionHandle[] match = (InstructionHandle[])i.next();
        +      ...
        +      il.delete(match[1], match[5]);
        +      ...
        +    }
        +
        + * @version $Id$ + * @author M. Dahm + * @see Instruction + * @see InstructionList + */ +public class InstructionFinder { + private static final int OFFSET = 32767; // char + OFFSET is outside of LATIN-1 + private static final int NO_OPCODES = 256; // Potential number, some are not used + + private static final HashMap map = new HashMap(); // Map + + private InstructionList il; + private String il_string; // instruction list as string + private InstructionHandle[] handles; // map instruction list to array + + /** + * @param il instruction list to search for given patterns + */ + public InstructionFinder(InstructionList il) { + this.il = il; + reread(); + } + + /** + * Reread the instruction list, e.g., after you've altered the list upon a match. + */ + public final void reread() { + int size = il.getLength(); + char[] buf = new char[size]; // Create a string with length equal to il length + handles = il.getInstructionHandles(); + + // Map opcodes to characters + for(int i=0; i < size; i++) + buf[i] = makeChar(handles[i].getInstruction().getOpcode()); + + il_string = new String(buf); + } + + /** + * Map symbolic instruction names like "getfield" to a single character. + * + * @param pattern instruction pattern in lower case + * @return encoded string for a pattern such as "BranchInstruction". + */ + private static final String mapName(String pattern) { + String result = (String)map.get(pattern); + + if(result != null) + return result; + + for(short i=0; i < NO_OPCODES; i++) + if(pattern.equals(Constants.OPCODE_NAMES[i])) + return "" + makeChar(i); + + throw new RuntimeException("Instruction unknown: " + pattern); + } + + /** + * Replace symbolic names of instructions with the appropiate character and remove + * all white space from string. Meta characters such as +, * are ignored. + * + * @param pattern The pattern to compile + * @return translated regular expression string + */ + private static final String compilePattern(String pattern) { + String lower = pattern.toLowerCase(); + StringBuffer buf = new StringBuffer(); + int size = pattern.length(); + + for(int i=0; i < size; i++) { + char ch = lower.charAt(i); + + if(Character.isLetterOrDigit(ch)) { + StringBuffer name = new StringBuffer(); + + while((Character.isLetterOrDigit(ch) || ch == '_') && i < size) { + name.append(ch); + + if(++i < size) + ch = lower.charAt(i); + else + break; + } + + i--; + + buf.append(mapName(name.toString())); + } else if(!Character.isWhitespace(ch)) + buf.append(ch); + } + + return buf.toString(); + } + + /** + * @return the matched piece of code as an array of instruction (handles) + */ + private InstructionHandle[] getMatch(int matched_from, int match_length) { + InstructionHandle[] match = new InstructionHandle[match_length]; + System.arraycopy(handles, matched_from, match, 0, match_length); + + return match; + } + + /** + * Search for the given pattern in the instruction list. You can search for any valid + * opcode via its symbolic name, e.g. "istore". You can also use a super class or + * an interface name to match a whole set of instructions, e.g. "BranchInstruction" or + * "LoadInstruction". "istore" is also an alias for all "istore_x" instructions. Additional + * aliases are "if" for "ifxx", "if_icmp" for "if_icmpxx", "if_acmp" for "if_acmpxx". + * + * Consecutive instruction names must be separated by white space which will be removed + * during the compilation of the pattern. + * + * For the rest the usual pattern matching rules for regular expressions apply.

        + * Example pattern: + *

        +     search("BranchInstruction NOP ((IfInstruction|GOTO)+ ISTORE Instruction)*");
        +   * 
        + * + *

        If you alter the instruction list upon a match such that other + * matching areas are affected, you should call reread() to update + * the finder and call search() again, because the matches are cached. + * + * @param pattern the instruction pattern to search for, where case is ignored + * @param from where to start the search in the instruction list + * @param constraint optional CodeConstraint to check the found code pattern for + * user-defined constraints + * @return iterator of matches where e.nextElement() returns an array of instruction handles + * describing the matched area + */ + public final Iterator search(String pattern, InstructionHandle from, + CodeConstraint constraint) + { + String search = compilePattern(pattern); + int start = -1; + + for(int i=0; i < handles.length; i++) { + if(handles[i] == from) { + start = i; // Where to start search from (index) + break; + } + } + + if(start == -1) + throw new ClassGenException("Instruction handle " + from + + " not found in instruction list."); + try { + RE regex = new RE(search); + ArrayList matches = new ArrayList(); + + while(start < il_string.length() && regex.match(il_string, start)) { + int startExpr = regex.getParenStart(0); + int endExpr = regex.getParenEnd(0); + int lenExpr = regex.getParenLength(0); + + InstructionHandle[] match = getMatch(startExpr, lenExpr); + + if((constraint == null) || constraint.checkCode(match)) + matches.add(match); + start = endExpr; + } + + return matches.iterator(); + } catch(RESyntaxException e) { + System.err.println(e); + } + + return null; + } + + /** + * Start search beginning from the start of the given instruction list. + * + * @param pattern the instruction pattern to search for, where case is ignored + * @return iterator of matches where e.nextElement() + * returns an array of instruction handles describing the matched + * area + */ + public final Iterator search(String pattern) { + return search(pattern, il.getStart(), null); + } + + /** + * Start search beginning from `from'. + * + * @param pattern the instruction pattern to search for, where case is ignored + * @param from where to start the search in the instruction list + * @return iterator of matches where e.nextElement() returns an array of instruction handles + * describing the matched area + */ + public final Iterator search(String pattern, InstructionHandle from) { + return search(pattern, from, null); + } + + /** + * Start search beginning from the start of the given instruction list. + * Check found matches with the constraint object. + * + * @param pattern the instruction pattern to search for, case is ignored + * @param constraint constraints to be checked on matching code + * @return instruction handle or `null' if the match failed + */ + public final Iterator search(String pattern, CodeConstraint constraint) { + return search(pattern, il.getStart(), constraint); + } + + /** + * Convert opcode number to char. + */ + private static final char makeChar(short opcode) { + return (char)(opcode + OFFSET); + } + + /** + * @return the inquired instruction list + */ + public final InstructionList getInstructionList() { return il; } + + /** + * Code patterns found may be checked using an additional + * user-defined constraint object whether they really match the needed criterion. + * I.e., check constraints that can not expressed with regular expressions. + * + */ + public interface CodeConstraint { + /** + * @param match array of instructions matching the requested pattern + * @return true if the matched area is really useful + */ + public boolean checkCode(InstructionHandle[] match); + } + + // Initialize pattern map + + static { + map.put("arithmeticinstruction", "(irem|lrem|iand|ior|ineg|isub|lneg|fneg|fmul|ldiv|fadd|lxor|frem|idiv|land|ixor|ishr|fsub|lshl|fdiv|iadd|lor|dmul|lsub|ishl|imul|lmul|lushr|dneg|iushr|lshr|ddiv|drem|dadd|ladd|dsub)"); + map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial)"); + map.put("arrayinstruction", "(baload|aastore|saload|caload|fastore|lastore|iaload|castore|iastore|aaload|bastore|sastore|faload|laload|daload|dastore)"); + map.put("gotoinstruction", "(goto|goto_w)"); + map.put("conversioninstruction", "(d2l|l2d|i2s|d2i|l2i|i2b|l2f|d2f|f2i|i2d|i2l|f2d|i2c|f2l|i2f)"); + map.put("localvariableinstruction", "(fstore|iinc|lload|dstore|dload|iload|aload|astore|istore|fload|lstore)"); + map.put("loadinstruction", "(fload|dload|lload|iload|aload)"); + map.put("fieldinstruction", "(getfield|putstatic|getstatic|putfield)"); + map.put("cpinstruction", "(ldc2_w|invokeinterface|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)"); + map.put("stackinstruction", "(dup2|swap|dup2_x2|pop|pop2|dup|dup2_x1|dup_x2|dup_x1)"); + map.put("branchinstruction", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); + map.put("returninstruction", "(lreturn|ireturn|freturn|dreturn|areturn|return)"); + map.put("storeinstruction", "(istore|fstore|dstore|astore|lstore)"); + map.put("select", "(tableswitch|lookupswitch)"); + map.put("ifinstruction", "(ifeq|ifgt|if_icmpne|if_icmpeq|ifge|ifnull|ifne|if_icmple|if_icmpge|if_acmpeq|if_icmplt|if_acmpne|ifnonnull|iflt|if_icmpgt|ifle)"); + map.put("jsrinstruction", "(jsr|jsr_w)"); + map.put("variablelengthinstruction", "(tableswitch|jsr|goto|lookupswitch)"); + map.put("unconditionalbranch", "(goto|jsr|jsr_w|athrow|goto_w)"); + map.put("constantpushinstruction", "(dconst|bipush|sipush|fconst|iconst|lconst)"); + map.put("typedinstruction", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)"); + map.put("popinstruction", "(fstore|dstore|pop|pop2|astore|putstatic|istore|lstore)"); + map.put("allocationinstruction", "(multianewarray|new|anewarray|newarray)"); + map.put("indexedinstruction", "(lload|lstore|fload|ldc2_w|invokeinterface|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)"); + map.put("pushinstruction", "(dup|lload|dup2|bipush|fload|ldc2_w|sipush|lconst|fconst|dload|getstatic|ldc_w|aconst_null|dconst|iload|ldc|iconst|aload)"); + map.put("stackproducer", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)"); + map.put("stackconsumer", "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)"); + map.put("exceptionthrower", "(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|ldc|invokestatic|daload)"); + map.put("loadclass", "(multianewarray|invokeinterface|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)"); + map.put("instructiontargeter", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); + + // Some aliases + map.put("if_icmp", "(if_icmpne|if_icmpeq|if_icmple|if_icmpge|if_icmplt|if_icmpgt)"); + map.put("if_acmp", "(if_acmpeq|if_acmpne)"); + map.put("if", "(ifeq|ifne|iflt|ifge|ifgt|ifle)"); + + // Precompile some aliases first + map.put("iconst", precompile(Constants.ICONST_0, Constants.ICONST_5, Constants.ICONST_M1)); + map.put("lconst", new String(new char[] { '(', makeChar(Constants.LCONST_0), '|', + makeChar(Constants.LCONST_1), ')' })); + map.put("dconst", new String(new char[] { '(', makeChar(Constants.DCONST_0), '|', + makeChar(Constants.DCONST_1), ')' })); + map.put("fconst", new String(new char[] { '(', makeChar(Constants.FCONST_0), '|', + makeChar(Constants.FCONST_1), ')' })); + + map.put("iload", precompile(Constants.ILOAD_0, Constants.ILOAD_3, Constants.ILOAD)); + map.put("dload", precompile(Constants.DLOAD_0, Constants.DLOAD_3, Constants.DLOAD)); + map.put("fload", precompile(Constants.FLOAD_0, Constants.FLOAD_3, Constants.FLOAD)); + map.put("aload", precompile(Constants.ALOAD_0, Constants.ALOAD_3, Constants.ALOAD)); + + map.put("istore", precompile(Constants.ISTORE_0, Constants.ISTORE_3, Constants.ISTORE)); + map.put("dstore", precompile(Constants.DSTORE_0, Constants.DSTORE_3, Constants.DSTORE)); + map.put("fstore", precompile(Constants.FSTORE_0, Constants.FSTORE_3, Constants.FSTORE)); + map.put("astore", precompile(Constants.ASTORE_0, Constants.ASTORE_3, Constants.ASTORE)); + + // Compile strings + + for(Iterator i = map.keySet().iterator(); i.hasNext(); ) { + String key = (String)i.next(); + String value = (String)map.get(key); + + char ch = value.charAt(1); // Omit already precompiled patterns + if(ch < OFFSET) { + map.put(key, compilePattern(value)); // precompile all patterns + } + } + + // Add instruction alias to match anything + + StringBuffer buf = new StringBuffer("("); + + for(short i=0; i < NO_OPCODES; i++) { + if(Constants.NO_OF_OPERANDS[i] != Constants.UNDEFINED) { // Not an invalid opcode + buf.append(makeChar(i)); + + if(i < NO_OPCODES - 1) + buf.append('|'); + } + } + buf.append(')'); + + map.put("instruction", buf.toString()); + } + + private static String precompile(short from, short to, short extra) { + StringBuffer buf = new StringBuffer("("); + + for(short i=from; i <= to; i++) { + buf.append(makeChar(i)); + buf.append('|'); + } + + buf.append(makeChar(extra)); + buf.append(")"); + return buf.toString(); + } + + /* + * Internal debugging routines. + */ + private static final String pattern2string(String pattern) { + return pattern2string(pattern, true); + } + + private static final String pattern2string(String pattern, boolean make_string) { + StringBuffer buf = new StringBuffer(); + + for(int i=0; i < pattern.length(); i++) { + char ch = pattern.charAt(i); + + if(ch >= OFFSET) { + if(make_string) + buf.append(Constants.OPCODE_NAMES[ch - OFFSET]); + else + buf.append((int)(ch - OFFSET)); + } else + buf.append(ch); + } + + return buf.toString(); + } +} diff --git a/src/java/org/apache/bcel/util/JavaWrapper.java b/src/java/org/apache/bcel/util/JavaWrapper.java new file mode 100644 index 00000000..89cd9736 --- /dev/null +++ b/src/java/org/apache/bcel/util/JavaWrapper.java @@ -0,0 +1,152 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.lang.reflect.*; + +/** + * Java interpreter replacement, i.e., wrapper that uses its own ClassLoader + * to modify/generate classes as they're requested. You can take this as a template + * for your own applications.
        + * Call this wrapper with + *

        java org.apache.bcel.util.JavaWrapper <real.class.name> [arguments]
        + *

        + * To use your own class loader you can set the "bcel.classloader" system property + * which defaults to "org.apache.bcel.util.ClassLoader", e.g., with + *

        java org.apache.bcel.util.JavaWrapper -Dbcel.classloader=foo.MyLoader <real.class.name> [arguments]
        + *

        + * + * @version $Id$ + * @author M. Dahm + * @see ClassLoader + */ +public class JavaWrapper { + private java.lang.ClassLoader loader; + + private static java.lang.ClassLoader getClassLoader() { + String s = System.getProperty("bcel.classloader"); + + if((s == null) || "".equals(s)) + s = "org.apache.bcel.util.ClassLoader"; + + try { + return (java.lang.ClassLoader)Class.forName(s).newInstance(); + } catch(Exception e) { + throw new RuntimeException(e.toString()); + } + } + + public JavaWrapper(java.lang.ClassLoader loader) { + this.loader = loader; + } + + public JavaWrapper() { + this(getClassLoader()); + } + + /** Runs the main method of the given class with the arguments passed in argv + * + * @param class_name the fully qualified class name + * @param argv the arguments just as you would pass them directly + */ + public void runMain(String class_name, String[] argv) throws ClassNotFoundException + { + Class cl = loader.loadClass(class_name); + Method method = null; + + try { + method = cl.getMethod("main", new Class[] { argv.getClass() }); + + /* Method main is sane ? + */ + int m = method.getModifiers(); + Class r = method.getReturnType(); + + if(!(Modifier.isPublic(m) && Modifier.isStatic(m)) || + Modifier.isAbstract(m) || (r != Void.TYPE)) + throw new NoSuchMethodException(); + } catch(NoSuchMethodException no) { + System.out.println("In class " + class_name + + ": public static void main(String[] argv) is not defined"); + return; + } + + try { + method.invoke(null, new Object[] { argv }); + } catch(Exception ex) { + ex.printStackTrace(); + } + } + + /** Default main method used as wrapper, expects the fully qualified class name + * of the real class as the first argument. + */ + public static void main(String[] argv) throws Exception { + /* Expects class name as first argument, other arguments are by-passed. + */ + if(argv.length == 0) { + System.out.println("Missing class name."); + return; + } + + String class_name = argv[0]; + String[] new_argv = new String[argv.length - 1]; + System.arraycopy(argv, 1, new_argv, 0, new_argv.length); + + JavaWrapper wrapper = new JavaWrapper(); + wrapper.runMain(class_name, new_argv); + } +} + diff --git a/src/java/org/apache/bcel/util/MethodHTML.java b/src/java/org/apache/bcel/util/MethodHTML.java new file mode 100644 index 00000000..d7991940 --- /dev/null +++ b/src/java/org/apache/bcel/util/MethodHTML.java @@ -0,0 +1,199 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.classfile.*; +import java.io.*; + +/** + * Convert methods and fields into HTML file. + * + * @version $Id$ + * @author M. Dahm + * + */ +final class MethodHTML implements org.apache.bcel.Constants { + private String class_name; // name of current class + private PrintWriter file; // file to write to + private ConstantHTML constant_html; + private AttributeHTML attribute_html; + + MethodHTML(String dir, String class_name, + Method[] methods, Field[] fields, + ConstantHTML constant_html, AttributeHTML attribute_html) throws IOException + { + this.class_name = class_name; + this.attribute_html = attribute_html; + this.constant_html = constant_html; + + file = new PrintWriter(new FileOutputStream(dir + class_name + "_methods.html")); + + file.println(""); + file.println("" + + ""); + for(int i=0; i < fields.length; i++) + writeField(fields[i]); + file.println("
        Access flagsTypeField name
        "); + + file.println("" + + "" + + ""); + for(int i=0; i < methods.length; i++) + writeMethod(methods[i], i); + + file.println("
        Access flagsReturn typeMethod nameArguments
        "); + file.close(); + } + + /** + * Print field of class. + * + * @param field field to print + * @exception java.io.IOException + */ + private void writeField(Field field) throws IOException { + String type = Utility.signatureToString(field.getSignature()); + String name = field.getName(); + String access = Utility.accessToString(field.getAccessFlags()); + Attribute[] attributes; + + access = Utility.replace(access, " ", " "); + + file.print("" + access + "\n" + + Class2HTML.referenceType(type) + "" + + name + ""); + + attributes = field.getAttributes(); + + // Write them to the Attributes.html file with anchor "[]" + for(int i=0; i < attributes.length; i++) + attribute_html.writeAttribute(attributes[i], name + "@" + i); + + for(int i=0; i < attributes.length; i++) { + if(attributes[i].getTag() == ATTR_CONSTANT_VALUE) { // Default value + String str = ((ConstantValue)attributes[i]).toString(); + + // Reference attribute in _attributes.html + file.print("= " + str + "\n"); + break; + } + } + + file.println(""); + } + + private final void writeMethod(Method method, int method_number) throws IOException { + // Get raw signature + String signature = method.getSignature(); + // Get array of strings containing the argument types + String[] args = Utility.methodSignatureArgumentTypes(signature, false); + // Get return type string + String type = Utility.methodSignatureReturnType(signature, false); + // Get method name + String name = method.getName(), html_name; + // Get method's access flags + String access = Utility.accessToString(method.getAccessFlags()); + // Get the method's attributes, the Code Attribute in particular + Attribute[] attributes = method.getAttributes(); + + /* HTML doesn't like names like and spaces are places to break + * lines. Both we don't want... + */ + access = Utility.replace(access, " ", " "); + html_name = Class2HTML.toHTML(name); + + file.print("" + + access + ""); + + file.print("" + Class2HTML.referenceType(type) + "" + + "" + html_name + "\n("); + + for(int i=0; i < args.length; i++) { + file.print(Class2HTML.referenceType(args[i])); + if(i < args.length - 1) + file.print(", "); + } + + file.print(")"); + + // Check for thrown exceptions + for(int i=0; i < attributes.length; i++) { + attribute_html.writeAttribute(attributes[i], "method" + method_number + "@" + i, + method_number); + + byte tag = attributes[i].getTag(); + if(tag == ATTR_EXCEPTIONS) { + file.print("throws"); + int[] exceptions = ((ExceptionTable)attributes[i]).getExceptionIndexTable(); + + for(int j=0; j < exceptions.length; j++) { + file.print(constant_html.referenceConstant(exceptions[j])); + + if(j < exceptions.length - 1) + file.print(", "); + } + file.println(""); + } else if(tag == ATTR_CODE) { + Attribute[] c_a = ((Code)attributes[i]).getAttributes(); + + for(int j=0; j < c_a.length; j++) + attribute_html.writeAttribute(c_a[j], "method" + method_number + "@" + i + "@" + j, + method_number); + } + } + } +} diff --git a/src/java/org/apache/bcel/util/package.html b/src/java/org/apache/bcel/util/package.html new file mode 100644 index 00000000..62e9c8b0 --- /dev/null +++ b/src/java/org/apache/bcel/util/package.html @@ -0,0 +1,25 @@ + + + + + + +

        +This package contains utility classes for the +Byte Code Engineering +Library, namely: +

        +

        +

          +
        • Collection classes for JavaClass objects
        • +
        • A converter for class files to HTML
        • +
        • A tool to find instructions patterns via regular expressions
        • +
        • A class to find classes as defined in the CLASSPATH
        • +
        • A class loader that allows to create clases at run time
        • +
        + +

        + + diff --git a/src/java/org/apache/bcel/verifier/GraphicalVerifier.java b/src/java/org/apache/bcel/verifier/GraphicalVerifier.java new file mode 100644 index 00000000..e8f729ef --- /dev/null +++ b/src/java/org/apache/bcel/verifier/GraphicalVerifier.java @@ -0,0 +1,109 @@ +package org.apache.bcel.verifier; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import javax.swing.UIManager; +import java.awt.*; +import org.apache.bcel.verifier.*; +import org.apache.bcel.generic.*; + + +/** + * A graphical user interface application demonstrating JustIce. + * + * @version $Id$ + * @author Enver Haase + */ +public class GraphicalVerifier { + boolean packFrame = false; + + /** Constructor. */ + public GraphicalVerifier() { + VerifierAppFrame frame = new VerifierAppFrame(); + //Frames überprüfen, die voreingestellte Größe haben + //Frames packen, die nutzbare bevorzugte Größeninformationen enthalten, z.B. aus ihrem Layout + if (packFrame) { + frame.pack(); + } + else { + frame.validate(); + } + //Das Fenster zentrieren + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + Dimension frameSize = frame.getSize(); + if (frameSize.height > screenSize.height) { + frameSize.height = screenSize.height; + } + if (frameSize.width > screenSize.width) { + frameSize.width = screenSize.width; + } + frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); + frame.setVisible(true); + + frame.classNamesJList.setModel(new VerifierFactoryListModel()); + VerifierFactory.getVerifier(Type.OBJECT.getClassName()); // Fill list with java.lang.Object + frame.classNamesJList.setSelectedIndex(0); // default, will verify java.lang.Object + } + /** Main method. */ + public static void main(String[] args) { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } + catch(Exception e) { + e.printStackTrace(); + } + new GraphicalVerifier(); + } +} diff --git a/src/java/org/apache/bcel/verifier/NativeVerifier.java b/src/java/org/apache/bcel/verifier/NativeVerifier.java new file mode 100644 index 00000000..2e8bef41 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/NativeVerifier.java @@ -0,0 +1,116 @@ +package org.apache.bcel.verifier; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * The NativeVerifier class implements a main(String[] args) method that's + * roughly compatible to the one in the Verifier class, but that uses the + * JVM's internal verifier for its class file verification. + * This can be used for comparison runs between the JVM-internal verifier + * and JustIce. + * + * @version $Id$ + * @author Enver Haase + */ +public abstract class NativeVerifier{ + + /** + * This class must not be instantiated. + */ + private NativeVerifier(){ + } + + /** + * Works only on the first argument. + */ + public static void main(String [] args){ + if (args.length != 1){ + System.out.println("Verifier front-end: need exactly one argument."); + System.exit(1); + } + + int dotclasspos = args[0].lastIndexOf(".class"); + if (dotclasspos != -1) args[0] = args[0].substring(0,dotclasspos); + args[0] = args[0].replace('/','.'); + //System.out.println(args[0]); + + + try{ + Class.forName(args[0]); + } + catch(ExceptionInInitializerError eiie){ //subclass of LinkageError! + System.out.println("NativeVerifier: ExceptionInInitializerError encountered on '"+args[0]+"'."); + System.out.println(eiie); + System.exit(1); + } + catch(LinkageError le){ + System.out.println("NativeVerifier: LinkageError encountered on '"+args[0]+"'."); + System.out.println(le); + System.exit(1); + } + catch(ClassNotFoundException cnfe){ + System.out.println("NativeVerifier: FILE NOT FOUND: '"+args[0]+"'."); + System.exit(1); + } + catch(Throwable t){ + System.out.println("NativeVerifier: Unspecified verification error on'"+args[0]+"'."); + System.exit(1); + } + + System.out.println("NativeVerifier: Class file '"+args[0]+"' seems to be okay."); + System.exit(0); + + } +} diff --git a/src/java/org/apache/bcel/verifier/PassVerifier.java b/src/java/org/apache/bcel/verifier/PassVerifier.java new file mode 100644 index 00000000..6e35d857 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/PassVerifier.java @@ -0,0 +1,143 @@ +package org.apache.bcel.verifier; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.util.ArrayList; + +/** + * A PassVerifier actually verifies a class file; it is instantiated + * by a Verifier. + * The verification should conform with a certain pass as described + * in The Java Virtual Machine Specification, 2nd edition. + * This book describes four passes. Pass one means loading the + * class and verifying a few static constraints. Pass two actually + * verifies some other constraints that could enforce loading in + * referenced class files. Pass three is the first pass that actually + * checks constraints in the code array of a method in the class file; + * it has two parts with the first verifying static constraints and + * the second part verifying structural constraints (where a data flow + * analysis is used for). The fourth pass, finally, performs checks + * that can only be done at run-time. + * JustIce does not have a run-time pass, but certain constraints that + * are usually delayed until run-time for performance reasons are also + * checked during the second part of pass three. + * PassVerifier instances perform caching. + * That means, if you really want a new verification run of a certain + * pass you must use a new instance of a given PassVerifier. + * + * @version $Id$ + * @author Enver Haase + * @see org.apache.bcel.verifier.Verifier + * @see #verify() + */ +public abstract class PassVerifier{ + + /** The (warning) messages. */ + private ArrayList messages = new ArrayList(); //Type of elements: String + + /** The VerificationResult cache. */ + private VerificationResult verificationResult = null; + + /** + * This method runs a verification pass conforming to the + * Java Virtual Machine Specification, 2nd edition, on a + * class file. + * PassVerifier instances perform caching; + * i.e. if the verify() method once determined a VerificationResult, + * then this result may be returned after every invocation of this + * method instead of running the verification pass anew; likewise with + * the result of getMessages(). + * + * @see #getMessages() + * @see #addMessage(String) + */ + public VerificationResult verify(){ + if (verificationResult == null){ + verificationResult = do_verify(); + } + return verificationResult; + } + + /** Does the real verification work, uncached. */ + public abstract VerificationResult do_verify(); + + /** + * This method adds a (warning) message to the message pool of this + * PassVerifier. This method is normally only internally used by + * BCEL's class file verifier "JustIce" and should not be used from + * the outside. + * + * @see #getMessages() + */ + public void addMessage(String message){ + messages.add(message); + } + + /** + * Returns the (warning) messages that this PassVerifier accumulated + * during its do_verify()ing work. + * + * @see #addMessage(String) + * @see #do_verify() + */ + public String[] getMessages(){ + verify(); // create messages if not already done (cached!) + String[] ret = new String[messages.size()]; + for (int i=0; i. + */ + +import org.apache.bcel.verifier.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.*; + +/** + * This class has a main method implementing a demonstration program + * of how to use the VerifierFactoryObserver. It transitively verifies + * all class files encountered; this may take up a lot of time and, + * more notably, memory. + * + * @version $Id$ + * @author Enver Haase + */ +public class TransitiveHull implements VerifierFactoryObserver{ + + /** Used for indentation. */ + private int indent = 0; + + /** Not publicly instantiable. */ + private TransitiveHull(){ + } + + /* Implementing VerifierFactoryObserver. */ + public void update(String classname){ + + System.gc(); // avoid swapping if possible. + + for (int i=0; i. + */ + +/** + * A VerificationResult is what a PassVerifier returns + * after verifying. + * + * @version $Id$ + * @author Enver Haase + * + */ +public class VerificationResult{ + + /** + * Constant to indicate verification has not been tried yet. + * This happens if some earlier verification pass did not return VERIFIED_OK. + */ + public static final int VERIFIED_NOTYET = 0; + /** Constant to indicate verification was passed. */ + public static final int VERIFIED_OK = 1; + /** Constant to indicate verfication failed. */ + public static final int VERIFIED_REJECTED = 2; + + /** + * This string is the canonical message for verifications that have not been tried yet. + * This happens if some earlier verification pass did not return VERIFIED_OK. + */ + private static final String VERIFIED_NOTYET_MSG = "Not yet verified."; + /** This string is the canonical message for passed verification passes. */ + private static final String VERIFIED_OK_MSG = "Passed verification."; + + /** + * Canonical VerificationResult for not-yet-tried verifications. + * This happens if some earlier verification pass did not return VERIFIED_OK. + */ + public static final VerificationResult VR_NOTYET = new VerificationResult(VERIFIED_NOTYET, VERIFIED_NOTYET_MSG); + /** Canonical VerificationResult for passed verifications. */ + public static final VerificationResult VR_OK = new VerificationResult(VERIFIED_OK, VERIFIED_OK_MSG); + + /** The numeric status. */ + private int numeric; + + /** The detailed message. */ + private String detailMessage; + + /** This class is not no-args instantiable. */ + private VerificationResult(){} + + /** The usual constructor. */ + public VerificationResult(int status, String message){ + numeric = status; + detailMessage = message; + } + + /** Returns one one the VERIFIED_OK, VERIFIED_NOTYET, VERIFIED_REJECTED constants. */ + public int getStatus(){ + return numeric; + } + + /** Returns a detailed message. */ + public String getMessage(){ + return detailMessage; + } + + /** + * Returns if two VerificationResult instances are equal. + */ + public boolean equals(Object o){ + if (! (o instanceof VerificationResult)) return false; + VerificationResult other = (VerificationResult) o; + return ((other.numeric == this.numeric) && (other.detailMessage.equals(this.detailMessage))); + } + + /** + * Returns a String representation of the VerificationResult. + */ + public String toString(){ + String ret=""; + if (numeric == VERIFIED_NOTYET) ret = "VERIFIED_NOTYET"; + if (numeric == VERIFIED_OK) ret = "VERIFIED_OK"; + if (numeric == VERIFIED_REJECTED) ret = "VERIFIED_REJECTED"; + ret+="\n"+detailMessage+"\n"; + return ret; + } +} diff --git a/src/java/org/apache/bcel/verifier/Verifier.java b/src/java/org/apache/bcel/verifier/Verifier.java new file mode 100644 index 00000000..8e2dd2b8 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/Verifier.java @@ -0,0 +1,283 @@ +package org.apache.bcel.verifier; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.util.*; +import org.apache.bcel.verifier.statics.*; +import org.apache.bcel.verifier.structurals.*; +import org.apache.bcel.verifier.exc.*; +import org.apache.bcel.verifier.exc.Utility; // Ambigous if not declared explicitely. +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; + +/** + * A Verifier instance is there to verify a class file according to The Java Virtual + * Machine Specification, 2nd Edition. + * + * Pass-3b-verification includes pass-3a-verification; + * pass-3a-verification includes pass-2-verification; + * pass-2-verification includes pass-1-verification. + * + * A Verifier creates PassVerifier instances to perform the actual verification. + * + * @version $Id$ + * @author Enver Haase + * @see org.apache.bcel.verifier.PassVerifier + */ +public class Verifier{ + /** + * The name of the class this verifier operates on. + */ + private final String classname; + + /** A Pass1Verifier for this Verifier instance. */ + private Pass1Verifier p1v; + /** A Pass2Verifier for this Verifier instance. */ + private Pass2Verifier p2v; + /** The Pass3aVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ + private HashMap p3avs = new HashMap(); + /** The Pass3bVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ + private HashMap p3bvs = new HashMap(); + + /** Returns the VerificationResult for the given pass. */ + public VerificationResult doPass1(){ + if (p1v == null){ + p1v = new Pass1Verifier(this); + } + return p1v.verify(); + } + + /** Returns the VerificationResult for the given pass. */ + public VerificationResult doPass2(){ + if (p2v == null){ + p2v = new Pass2Verifier(this); + } + return p2v.verify(); + } + + /** Returns the VerificationResult for the given pass. */ + public VerificationResult doPass3a(int method_no){ + String key = Integer.toString(method_no); + Pass3aVerifier p3av; + p3av = (Pass3aVerifier) (p3avs.get(key)); + if (p3avs.get(key) == null){ + p3av = new Pass3aVerifier(this, method_no); + p3avs.put(key, p3av); + } + return p3av.verify(); + } + + /** Returns the VerificationResult for the given pass. */ + public VerificationResult doPass3b(int method_no){ + String key = Integer.toString(method_no); + Pass3bVerifier p3bv; + p3bv = (Pass3bVerifier) (p3bvs.get(key)); + if (p3bvs.get(key) == null){ + p3bv = new Pass3bVerifier(this, method_no); + p3bvs.put(key, p3bv); + } + return p3bv.verify(); + } + + /** + * This class may not be no-args instantiated. + */ + private Verifier(){ + classname = ""; // never executed anyway, make compiler happy. + }// not noargs-instantiable + + /** + * Instantiation is done by the VerifierFactory. + * + * @see VerifierFactory + */ + Verifier(String fully_qualified_classname){ + classname = fully_qualified_classname; + flush(); + } + + /** + * Returns the name of the class this verifier operates on. + * This is particularly interesting when this verifier was created + * recursively by another Verifier and you got a reference to this + * Verifier by the getVerifiers() method of the VerifierFactory. + * @see VerifierFactory + */ + public final String getClassName(){ + return classname; + } + + /** + * Forget everything known about the class file; that means, really + * start a new verification of a possibly different class file from + * BCEL's repository. + * + */ + public void flush(){ + p1v = null; + p2v = null; + p3avs.clear(); + p3bvs.clear(); + } + + /** + * This returns all the (warning) messages collected during verification. + * A prefix shows from which verifying pass a message originates. + */ + public String[] getMessages(){ + ArrayList messages = new ArrayList(); + + if (p1v != null){ + String[] p1m = p1v.getMessages(); + for (int i=0; i"); + for (int j=0; j. + */ + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.event.*; +import org.apache.bcel.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.verifier.*; + +/** + * This class implements a machine-generated frame for use with + * the GraphicalVerfifier. + * + * @version $Id$ + * @author Enver Haase + * @see GraphicalVerifier + */ +public class VerifierAppFrame extends JFrame { + JPanel contentPane; + JSplitPane jSplitPane1 = new JSplitPane(); + JPanel jPanel1 = new JPanel(); + JPanel jPanel2 = new JPanel(); + JSplitPane jSplitPane2 = new JSplitPane(); + JPanel jPanel3 = new JPanel(); + JList classNamesJList = new JList(); + GridLayout gridLayout1 = new GridLayout(); + JPanel messagesPanel = new JPanel(); + GridLayout gridLayout2 = new GridLayout(); + JMenuBar jMenuBar1 = new JMenuBar(); + JMenu jMenu1 = new JMenu(); + JScrollPane jScrollPane1 = new JScrollPane(); + JScrollPane messagesScrollPane = new JScrollPane(); + JScrollPane jScrollPane3 = new JScrollPane(); + GridLayout gridLayout4 = new GridLayout(); + JScrollPane jScrollPane4 = new JScrollPane(); + CardLayout cardLayout1 = new CardLayout(); + + private String JUSTICE_VERSION = "JustIce by Enver Haase"; + private String current_class; + GridLayout gridLayout3 = new GridLayout(); + JTextPane pass1TextPane = new JTextPane(); + JTextPane pass2TextPane = new JTextPane(); + JTextPane messagesTextPane = new JTextPane(); + JMenuItem newFileMenuItem = new JMenuItem(); + JSplitPane jSplitPane3 = new JSplitPane(); + JSplitPane jSplitPane4 = new JSplitPane(); + JScrollPane jScrollPane2 = new JScrollPane(); + JScrollPane jScrollPane5 = new JScrollPane(); + JScrollPane jScrollPane6 = new JScrollPane(); + JScrollPane jScrollPane7 = new JScrollPane(); + JList pass3aJList = new JList(); + JList pass3bJList = new JList(); + JTextPane pass3aTextPane = new JTextPane(); + JTextPane pass3bTextPane = new JTextPane(); + JMenu jMenu2 = new JMenu(); + JMenuItem whatisMenuItem = new JMenuItem(); + JMenuItem aboutMenuItem = new JMenuItem(); + + /** Constructor. */ + public VerifierAppFrame() { + enableEvents(AWTEvent.WINDOW_EVENT_MASK); + try { + jbInit(); + } + catch(Exception e) { + e.printStackTrace(); + } + } + /** Initizalization of the components. */ + private void jbInit() throws Exception { + //setIconImage(Toolkit.getDefaultToolkit().createImage(Frame1.class.getResource("[Ihr Symbol]"))); + contentPane = (JPanel) this.getContentPane(); + contentPane.setLayout(cardLayout1); + this.setJMenuBar(jMenuBar1); + this.setSize(new Dimension(708, 451)); + this.setTitle("JustIce"); + jPanel1.setMinimumSize(new Dimension(100, 100)); + jPanel1.setPreferredSize(new Dimension(100, 100)); + jPanel1.setLayout(gridLayout1); + jSplitPane2.setOrientation(JSplitPane.VERTICAL_SPLIT); + jPanel2.setLayout(gridLayout2); + jPanel3.setMinimumSize(new Dimension(200, 100)); + jPanel3.setPreferredSize(new Dimension(400, 400)); + jPanel3.setLayout(gridLayout4); + messagesPanel.setMinimumSize(new Dimension(100, 100)); + messagesPanel.setLayout(gridLayout3); + jPanel2.setMinimumSize(new Dimension(200, 100)); + jMenu1.setText("File"); + + jScrollPane1.getViewport().setBackground(Color.red); + messagesScrollPane.getViewport().setBackground(Color.red); + messagesScrollPane.setPreferredSize(new Dimension(10, 10)); + classNamesJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { + classNamesJList_valueChanged(e); + } + }); + classNamesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + jScrollPane3.setBorder(BorderFactory.createLineBorder(Color.black)); + jScrollPane3.setPreferredSize(new Dimension(100, 100)); + gridLayout4.setRows(4); + gridLayout4.setColumns(1); + gridLayout4.setHgap(1); + jScrollPane4.setBorder(BorderFactory.createLineBorder(Color.black)); + jScrollPane4.setPreferredSize(new Dimension(100, 100)); + pass1TextPane.setBorder(BorderFactory.createRaisedBevelBorder()); + pass1TextPane.setToolTipText(""); + pass1TextPane.setEditable(false); + pass2TextPane.setBorder(BorderFactory.createRaisedBevelBorder()); + pass2TextPane.setEditable(false); + messagesTextPane.setBorder(BorderFactory.createRaisedBevelBorder()); + messagesTextPane.setEditable(false); + newFileMenuItem.setText("New..."); + newFileMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(78, java.awt.event.KeyEvent.CTRL_MASK, true)); + newFileMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(ActionEvent e) { + newFileMenuItem_actionPerformed(e); + } + }); + pass3aTextPane.setEditable(false); + pass3bTextPane.setEditable(false); + pass3aJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { + pass3aJList_valueChanged(e); + } + }); + pass3bJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { + pass3bJList_valueChanged(e); + } + }); + jMenu2.setText("Help"); + whatisMenuItem.setText("What is..."); + whatisMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(ActionEvent e) { + whatisMenuItem_actionPerformed(e); + } + }); + aboutMenuItem.setText("About"); + aboutMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(ActionEvent e) { + aboutMenuItem_actionPerformed(e); + } + }); + jSplitPane2.add(messagesPanel, JSplitPane.BOTTOM); + messagesPanel.add(messagesScrollPane, null); + messagesScrollPane.getViewport().add(messagesTextPane, null); + jSplitPane2.add(jPanel3, JSplitPane.TOP); + jPanel3.add(jScrollPane3, null); + jScrollPane3.getViewport().add(pass1TextPane, null); + jPanel3.add(jScrollPane4, null); + jPanel3.add(jSplitPane3, null); + jSplitPane3.add(jScrollPane2, JSplitPane.LEFT); + jScrollPane2.getViewport().add(pass3aJList, null); + jSplitPane3.add(jScrollPane5, JSplitPane.RIGHT); + jScrollPane5.getViewport().add(pass3aTextPane, null); + jPanel3.add(jSplitPane4, null); + jSplitPane4.add(jScrollPane6, JSplitPane.LEFT); + jScrollPane6.getViewport().add(pass3bJList, null); + jSplitPane4.add(jScrollPane7, JSplitPane.RIGHT); + jScrollPane7.getViewport().add(pass3bTextPane, null); + jScrollPane4.getViewport().add(pass2TextPane, null); + jSplitPane1.add(jPanel2, JSplitPane.TOP); + jPanel2.add(jScrollPane1, null); + jSplitPane1.add(jPanel1, JSplitPane.BOTTOM); + jPanel1.add(jSplitPane2, null); + jScrollPane1.getViewport().add(classNamesJList, null); + jMenuBar1.add(jMenu1); + jMenuBar1.add(jMenu2); + contentPane.add(jSplitPane1, "jSplitPane1"); + jMenu1.add(newFileMenuItem); + jMenu2.add(whatisMenuItem); + jMenu2.add(aboutMenuItem); + jSplitPane2.setDividerLocation(300); + jSplitPane3.setDividerLocation(150); + jSplitPane4.setDividerLocation(150); + } + + /** Overridden to stop the application on a closing window. */ + protected void processWindowEvent(WindowEvent e) { + super.processWindowEvent(e); + if (e.getID() == WindowEvent.WINDOW_CLOSING) { + System.exit(0); + } + } + + synchronized void classNamesJList_valueChanged(ListSelectionEvent e) { + if (e.getValueIsAdjusting()) return; + current_class = classNamesJList.getSelectedValue().toString(); + verify(); + classNamesJList.setSelectedValue(current_class, true); + } + + private void verify(){ + setTitle("PLEASE WAIT"); + + Verifier v = VerifierFactory.getVerifier(current_class); + v.flush(); // Don't cache the verification result for this class. + + VerificationResult vr; + + vr = v.doPass1(); + if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED){ + pass1TextPane.setText(vr.getMessage()); + pass1TextPane.setBackground(Color.red); + + pass2TextPane.setText(""); + pass2TextPane.setBackground(Color.yellow); + pass3aTextPane.setText(""); + pass3aJList.setListData(new Object[0]); + pass3aTextPane.setBackground(Color.yellow); + + pass3bTextPane.setText(""); + pass3bJList.setListData(new Object[0]); + pass3bTextPane.setBackground(Color.yellow); + + } + else{ // Must be VERIFIED_OK, Pass 1 does not know VERIFIED_NOTYET + pass1TextPane.setBackground(Color.green); + pass1TextPane.setText(vr.getMessage()); + + vr = v.doPass2(); + if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED){ + pass2TextPane.setText(vr.getMessage()); + pass2TextPane.setBackground(Color.red); + + pass3aTextPane.setText(""); + pass3aTextPane.setBackground(Color.yellow); + pass3aJList.setListData(new Object[0]); + pass3bTextPane.setText(""); + pass3bTextPane.setBackground(Color.yellow); + pass3bJList.setListData(new Object[0]); + } + else{ // must be Verified_OK, because Pass1 was OK (cannot be Verified_NOTYET). + pass2TextPane.setText(vr.getMessage()); + pass2TextPane.setBackground(Color.green); + + JavaClass jc = Repository.lookupClass(current_class); + boolean all3aok = true; + boolean all3bok = true; + String all3amsg = ""; + String all3bmsg = ""; + + String[] methodnames = new String[jc.getMethods().length]; + for (int i=0; i. + */ + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Vector; + +/** + * This class produces instances of the Verifier class. Its purpose is to make + * sure that they are singleton instances with respect to the class name they + * operate on. That means, for every class (represented by a unique fully qualified + * class name) there is exactly one Verifier. + * + * @version $Id$ + * @author Enver Haase + */ +public class VerifierFactory{ + + /** + * The HashMap that holds the data about the already-constructed Verifier instances. + */ + private static HashMap hashMap = new HashMap(); + + /** + * The VerifierFactoryObserver instances that observe the VerifierFactory. + */ + private static Vector observers = new Vector(); + + /** + * The VerifierFactory is not instantiable. + */ + private VerifierFactory(){} + + /** + * Returns the (only) verifier responsible for the class with the given name. + * Possibly a new Verifier object is transparently created. + * @return the (only) verifier responsible for the class with the given name. + */ + public static Verifier getVerifier(String fully_qualified_classname){ + fully_qualified_classname = fully_qualified_classname; + + Verifier v = (Verifier) (hashMap.get(fully_qualified_classname)); + if (v==null){ + v = new Verifier(fully_qualified_classname); + hashMap.put(fully_qualified_classname, v); + notify(fully_qualified_classname); + } + + return v; + } + + /** + * Notifies the observers of a newly generated Verifier. + */ + private static void notify(String fully_qualified_classname){ + // notify the observers + Iterator i = observers.iterator(); + while (i.hasNext()){ + VerifierFactoryObserver vfo = (VerifierFactoryObserver) i.next(); + vfo.update(fully_qualified_classname); + } + } + + /** + * Returns all Verifier instances created so far. + * This is useful when a Verifier recursively lets + * the VerifierFactory create other Verifier instances + * and if you want to verify the transitive hull of + * referenced class files. + */ + public static Verifier[] getVerifiers(){ + Verifier[] vs = new Verifier[hashMap.values().size()]; + return (Verifier[]) (hashMap.values().toArray(vs)); // Because vs is big enough, vs is used to store the values into and returned! + } + + /** + * Adds the VerifierFactoryObserver o to the list of observers. + */ + public static void attach(VerifierFactoryObserver o){ + observers.addElement(o); + } + + /** + * Removes the VerifierFactoryObserver o from the list of observers. + */ + public static void detach(VerifierFactoryObserver o){ + observers.removeElement(o); + } +} diff --git a/src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java new file mode 100644 index 00000000..38d4cd05 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -0,0 +1,107 @@ +package org.apache.bcel.verifier; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.verifier.*; +import javax.swing.event.*; +/** + * This class implements an adapter; it implements both a Swing ListModel and + * a VerifierFactoryObserver. + * + * @version $Id$ + * @author Enver Haase + */ +public class VerifierFactoryListModel implements org.apache.bcel.verifier.VerifierFactoryObserver, javax.swing.ListModel{ + + private java.util.ArrayList listeners = new java.util.ArrayList(); + + private java.util.TreeSet cache = new java.util.TreeSet(); + + public VerifierFactoryListModel() { + VerifierFactory.attach(this); + update(null); // fill cache. + } + + public synchronized void update(String s){ + int size = listeners.size(); + + Verifier[] verifiers = VerifierFactory.getVerifiers(); + int num_of_verifiers = verifiers.length; + cache.clear(); + for (int i=0; i. + */ + +/** + * VerifierFactoryObserver instances are notified when new Verifier + * instances are created. + * + * @version $Id$ + * @author Enver Haase + * + * @see VerifierFactory#getVerifier(String) + * @see VerifierFactory#getVerifiers() + * @see VerifierFactory#attach(VerifierFactoryObserver) + * @see VerifierFactory#detach(VerifierFactoryObserver) + */ +public interface VerifierFactoryObserver{ + /** + * VerifierFactoryObserver instances are notified invoking this method. + * The String argument is the fully qualified class name of a class a + * new Verifier instance created by the VerifierFactory operates on. + */ + public void update(String s); +} diff --git a/src/java/org/apache/bcel/verifier/VerifyDialog.java b/src/java/org/apache/bcel/verifier/VerifyDialog.java new file mode 100644 index 00000000..9fe642d0 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/VerifyDialog.java @@ -0,0 +1,559 @@ +package org.apache.bcel.verifier; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.verifier.*; +import java.awt.Color; + +/** + * A class for simple graphical class file verification. + * Use the main(String []) method with fully qualified + * class names as arguments to use it as a stand-alone + * application. + * Use the VerifyDialog(String) constructor to use this + * class in your application. + * [This class was created using VisualAge for Java, + * but it does not work under VAJ itself (Version 3.02 JDK 1.2)] + * @version $Id$ + * @author Enver Haase + * @see #main(String[]) + * @see #VerifyDialog(String) + */ +public class VerifyDialog extends javax.swing.JDialog { + /** Machine-generated. */ + private javax.swing.JPanel ivjJDialogContentPane = null; + /** Machine-generated. */ + private javax.swing.JPanel ivjPass1Panel = null; + /** Machine-generated. */ + private javax.swing.JPanel ivjPass2Panel = null; + /** Machine-generated. */ + private javax.swing.JPanel ivjPass3Panel = null; + /** Machine-generated. */ + private javax.swing.JButton ivjPass1Button = null; + /** Machine-generated. */ + private javax.swing.JButton ivjPass2Button = null; + /** Machine-generated. */ + private javax.swing.JButton ivjPass3Button = null; + /** Machine-generated. */ + IvjEventHandler ivjEventHandler = new IvjEventHandler(); + + /** + * The class to verify. Default set to 'java.lang.Object' + * in case this class is instantiated via one of the many + * machine-generated constructors. + */ + private String class_name = "java.lang.Object"; + + /** + * This field is here to count the number of open VerifyDialog + * instances so the JVM can be exited afer every Dialog had been + * closed. + */ + private static int classes_to_verify; + +/** Machine-generated. */ +class IvjEventHandler implements java.awt.event.ActionListener { + public void actionPerformed(java.awt.event.ActionEvent e) { + if (e.getSource() == VerifyDialog.this.getPass1Button()) + connEtoC1(e); + if (e.getSource() == VerifyDialog.this.getPass2Button()) + connEtoC2(e); + if (e.getSource() == VerifyDialog.this.getPass3Button()) + connEtoC3(e); + if (e.getSource() == VerifyDialog.this.getFlushButton()) + connEtoC4(e); + }; + }; + /** Machine-generated. */ + private javax.swing.JButton ivjFlushButton = null; +/** Machine-generated. */ +public VerifyDialog() { + super(); + initialize(); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Dialog owner) { + super(owner); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Dialog owner, String title) { + super(owner, title); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Dialog owner, String title, boolean modal) { + super(owner, title, modal); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Dialog owner, boolean modal) { + super(owner, modal); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Frame owner) { + super(owner); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Frame owner, String title) { + super(owner, title); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Frame owner, String title, boolean modal) { + super(owner, title, modal); +} + +/** Machine-generated. */ +public VerifyDialog(java.awt.Frame owner, boolean modal) { + super(owner, modal); +} + +/** + * Use this constructor if you want a possibility to verify other + * class files than java.lang.Object. + * @param fully_qualified_class_name java.lang.String + */ +public VerifyDialog(String fully_qualified_class_name) { + super(); + + int dotclasspos = fully_qualified_class_name.lastIndexOf(".class"); + if (dotclasspos != -1) fully_qualified_class_name = fully_qualified_class_name.substring(0,dotclasspos); + fully_qualified_class_name = fully_qualified_class_name.replace('/', '.'); + + class_name = fully_qualified_class_name; + initialize(); +} + + +/** Machine-generated. */ +private void connEtoC1(java.awt.event.ActionEvent arg1) { + try { + // user code begin {1} + // user code end + this.pass1Button_ActionPerformed(arg1); + // user code begin {2} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {3} + // user code end + handleException(ivjExc); + } +} + +/** Machine-generated. */ +private void connEtoC2(java.awt.event.ActionEvent arg1) { + try { + // user code begin {1} + // user code end + this.pass2Button_ActionPerformed(arg1); + // user code begin {2} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {3} + // user code end + handleException(ivjExc); + } +} + +/** Machine-generated. */ +private void connEtoC3(java.awt.event.ActionEvent arg1) { + try { + // user code begin {1} + // user code end + this.pass4Button_ActionPerformed(arg1); + // user code begin {2} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {3} + // user code end + handleException(ivjExc); + } +} + +/** Machine-generated. */ +private void connEtoC4(java.awt.event.ActionEvent arg1) { + try { + // user code begin {1} + // user code end + this.flushButton_ActionPerformed(arg1); + // user code begin {2} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {3} + // user code end + handleException(ivjExc); + } +} + +/** Machine-generated. */ +public void flushButton_ActionPerformed(java.awt.event.ActionEvent actionEvent) { + VerifierFactory.getVerifier(class_name).flush(); + Repository.removeClass(class_name); // Make sure it will be reloaded. + getPass1Panel().setBackground(Color.gray); + getPass1Panel().repaint(); + getPass2Panel().setBackground(Color.gray); + getPass2Panel().repaint(); + getPass3Panel().setBackground(Color.gray); + getPass3Panel().repaint(); +} + +/** Machine-generated. */ +private javax.swing.JButton getFlushButton() { + if (ivjFlushButton == null) { + try { + ivjFlushButton = new javax.swing.JButton(); + ivjFlushButton.setName("FlushButton"); + ivjFlushButton.setText("Flush: Forget old verification results"); + ivjFlushButton.setBackground(java.awt.SystemColor.controlHighlight); + ivjFlushButton.setBounds(60, 215, 300, 30); + ivjFlushButton.setForeground(java.awt.Color.red); + ivjFlushButton.setActionCommand("FlushButton"); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjFlushButton; +} + +/** Machine-generated. */ +private javax.swing.JPanel getJDialogContentPane() { + if (ivjJDialogContentPane == null) { + try { + ivjJDialogContentPane = new javax.swing.JPanel(); + ivjJDialogContentPane.setName("JDialogContentPane"); + ivjJDialogContentPane.setLayout(null); + getJDialogContentPane().add(getPass1Panel(), getPass1Panel().getName()); + getJDialogContentPane().add(getPass3Panel(), getPass3Panel().getName()); + getJDialogContentPane().add(getPass2Panel(), getPass2Panel().getName()); + getJDialogContentPane().add(getPass1Button(), getPass1Button().getName()); + getJDialogContentPane().add(getPass2Button(), getPass2Button().getName()); + getJDialogContentPane().add(getPass3Button(), getPass3Button().getName()); + getJDialogContentPane().add(getFlushButton(), getFlushButton().getName()); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjJDialogContentPane; +} + +/** Machine-generated. */ +private javax.swing.JButton getPass1Button() { + if (ivjPass1Button == null) { + try { + ivjPass1Button = new javax.swing.JButton(); + ivjPass1Button.setName("Pass1Button"); + ivjPass1Button.setText("Pass1: Verify binary layout of .class file"); + ivjPass1Button.setBackground(java.awt.SystemColor.controlHighlight); + ivjPass1Button.setBounds(100, 40, 300, 30); + ivjPass1Button.setActionCommand("Button1"); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass1Button; +} + +/** Machine-generated. */ +private javax.swing.JPanel getPass1Panel() { + if (ivjPass1Panel == null) { + try { + ivjPass1Panel = new javax.swing.JPanel(); + ivjPass1Panel.setName("Pass1Panel"); + ivjPass1Panel.setLayout(null); + ivjPass1Panel.setBackground(java.awt.SystemColor.controlShadow); + ivjPass1Panel.setBounds(30, 30, 50, 50); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass1Panel; +} + +/** Machine-generated. */ +private javax.swing.JButton getPass2Button() { + if (ivjPass2Button == null) { + try { + ivjPass2Button = new javax.swing.JButton(); + ivjPass2Button.setName("Pass2Button"); + ivjPass2Button.setText("Pass 2: Verify static .class file constraints"); + ivjPass2Button.setBackground(java.awt.SystemColor.controlHighlight); + ivjPass2Button.setBounds(100, 100, 300, 30); + ivjPass2Button.setActionCommand("Button2"); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass2Button; +} + +/** Machine-generated. */ +private javax.swing.JPanel getPass2Panel() { + if (ivjPass2Panel == null) { + try { + ivjPass2Panel = new javax.swing.JPanel(); + ivjPass2Panel.setName("Pass2Panel"); + ivjPass2Panel.setLayout(null); + ivjPass2Panel.setBackground(java.awt.SystemColor.controlShadow); + ivjPass2Panel.setBounds(30, 90, 50, 50); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass2Panel; +} + +/** Machine-generated. */ +private javax.swing.JButton getPass3Button() { + if (ivjPass3Button == null) { + try { + ivjPass3Button = new javax.swing.JButton(); + ivjPass3Button.setName("Pass3Button"); + ivjPass3Button.setText("Passes 3a+3b: Verify code arrays"); + ivjPass3Button.setBackground(java.awt.SystemColor.controlHighlight); + ivjPass3Button.setBounds(100, 160, 300, 30); + ivjPass3Button.setActionCommand("Button2"); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass3Button; +} + +/** Machine-generated. */ +private javax.swing.JPanel getPass3Panel() { + if (ivjPass3Panel == null) { + try { + ivjPass3Panel = new javax.swing.JPanel(); + ivjPass3Panel.setName("Pass3Panel"); + ivjPass3Panel.setLayout(null); + ivjPass3Panel.setBackground(java.awt.SystemColor.controlShadow); + ivjPass3Panel.setBounds(30, 150, 50, 50); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass3Panel; +} + +/** Machine-generated. */ +private void handleException(java.lang.Throwable exception) { + + /* Uncomment the following lines to print uncaught exceptions to stdout */ + System.out.println("--------- UNCAUGHT EXCEPTION ---------"); + exception.printStackTrace(System.out); +} + + +/** Machine-generated. */ +private void initConnections() throws java.lang.Exception { + // user code begin {1} + // user code end + getPass1Button().addActionListener(ivjEventHandler); + getPass2Button().addActionListener(ivjEventHandler); + getPass3Button().addActionListener(ivjEventHandler); + getFlushButton().addActionListener(ivjEventHandler); +} + +/** Machine-generated. */ +private void initialize() { + try { + // user code begin {1} + // user code end + setName("VerifyDialog"); + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setSize(430, 280); + setVisible(true); + setModal(true); + setResizable(false); + setContentPane(getJDialogContentPane()); + initConnections(); + } catch (java.lang.Throwable ivjExc) { + handleException(ivjExc); + } + // user code begin {2} + setTitle("'"+class_name+"' verification - JustIce / BCEL"); + // user code end +} +/** + * Verifies one or more class files. + * Verification results are presented graphically: Red means 'rejected', + * green means 'passed' while yellow means 'could not be verified yet'. + * @param args java.lang.String[] fully qualified names of classes to verify. + */ +public static void main(java.lang.String[] args) { + classes_to_verify = args.length; + + for (int i=0; i. + */ + +/** + * Instances of this class should never be thrown. When such an instance is thrown, + * this is due to an INTERNAL ERROR of BCEL's class file verifier "JustIce". + * + * @version $Id$ + * @author Enver Haase + */ +public final class AssertionViolatedException extends RuntimeException{ + /** The error message. */ + private String detailMessage; + /** Constructs a new AssertionViolatedException with null as its error message string. */ + public AssertionViolatedException(){ + super(); + } + /** + * Constructs a new AssertionViolatedException with the specified error message preceded + * by "INTERNAL ERROR: ". + */ + public AssertionViolatedException(String message){ + super(message = "INTERNAL ERROR: "+message); // Thanks to Java, the constructor call here must be first. + detailMessage=message; + } + /** Extends the error message with a string before ("pre") and after ("post") the + 'old' error message. All of these three strings are allowed to be null, and null + is always replaced by the empty string (""). In particular, after invoking this + method, the error message of this object can no longer be null. + */ + public void extendMessage(String pre, String post){ + if (pre == null) pre=""; + if (detailMessage == null) detailMessage=""; + if (post == null) post=""; + detailMessage = pre+detailMessage+post; + } + /** + * Returns the error message string of this AssertionViolatedException object. + * @return the error message string of this AssertionViolatedException. + */ + public String getMessage(){ + return detailMessage; + } + + /** + * DO NOT USE. It's for experimental testing during development only. + */ + public static void main(String[] args){ + AssertionViolatedException ave = new AssertionViolatedException("Oops!"); + ave.extendMessage("\nFOUND:\n\t","\nExiting!!\n"); + throw ave; + } + + /** + * Returns the backtrace of this AssertionViolatedException as a String. + * @return The backtrace of this AssertionViolatedException as a String. + */ + public String getStackTrace(){ + return Utility.getStackTrace(this); + } + +} diff --git a/src/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/java/org/apache/bcel/verifier/exc/ClassConstraintException.java new file mode 100644 index 00000000..11b67f24 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/ClassConstraintException.java @@ -0,0 +1,83 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" + * when a class file to verify does not pass the verification pass 2 as described + * in the Java Virtual Machine specification, 2nd edition. + * + * @version $Id$ + * @author Enver Haase + */ +public class ClassConstraintException extends VerificationException{ + /** The specified error message. */ + private String detailMessage; + + /** + * Constructs a new ClassConstraintException with null as its error message string. + */ + public ClassConstraintException(){ + super(); + } + + /** + * Constructs a new ClassConstraintException with the specified error message. + */ + public ClassConstraintException(String message){ + super (message); + detailMessage = message; + } +} diff --git a/src/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/java/org/apache/bcel/verifier/exc/CodeConstraintException.java new file mode 100644 index 00000000..14dfd4f7 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/CodeConstraintException.java @@ -0,0 +1,77 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when + * a class file does not pass the verification pass 3. Note that the pass 3 used by + * "JustIce" involves verification that is usually delayed to pass 4. + * + * @version $Id$ + * @author Enver Haase + */ +public abstract class CodeConstraintException extends VerificationException{ + /** + * Constructs a new CodeConstraintException with null as its error message string. + */ + CodeConstraintException(){ + super(); + } + /** + * Constructs a new CodeConstraintException with the specified error message. + */ + CodeConstraintException(String message){ + super(message); + } +} diff --git a/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java new file mode 100644 index 00000000..5101b632 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java @@ -0,0 +1,71 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" + * when the verification of a method is requested that does not exist. + * + * @version $Id$ + * @author Enver Haase + */ +public class InvalidMethodException extends RuntimeException{ + /** Must not be no-args requested so there's always some error message. */ + private InvalidMethodException(){} + + /** Constructs an InvalidMethodException with the specified detail message. */ + public InvalidMethodException(String message){ + super(message); + } +} diff --git a/src/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java b/src/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java new file mode 100644 index 00000000..6ca913c4 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java @@ -0,0 +1,74 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when + * a class file to verify does not pass the verification pass 3 because of a violation + * of a constraint that is usually only verified at run-time (pass 4). + * The Java Virtual Machine Specification, 2nd edition, states that certain constraints + * are usually verified at run-time for performance reasons (the verification of those + * constraints requires loading in and recursively verifying referenced classes) that + * conceptually belong to pass 3; to be precise, that conceptually belong to the + * data flow analysis of pass 3 (called pass 3b in JustIce). + * These are the checks necessary for resolution: Compare pages 142-143 ("4.9.1 The + * Verification Process") and pages 50-51 ("2.17.3 Linking: Verification, Preparation, + * and Resolution") of the above mentioned book. + * TODO: At this time, this class is not used in JustIce. + * + * @version $Id$ + * @author Enver Haase + */ +public class LinkingConstraintException extends StructuralCodeConstraintException{ +} diff --git a/src/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/java/org/apache/bcel/verifier/exc/LoadingException.java new file mode 100644 index 00000000..4e17e6cd --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/LoadingException.java @@ -0,0 +1,82 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * When loading a class file, BCEL will throw an instance of LoadingException if + * the class file is malformed; so it is not conforming to the "Pass 1" verification + * process as described in the Java Virtual Machine specification, 2nd. edition. + * @version $Id$ + * @author Enver Haase + */ +public class LoadingException extends VerifierConstraintViolatedException{ + /** The specified error message. */ + private String detailMessage; + + /** + * Constructs a new LoadingException with null as its error message string. + */ + public LoadingException(){ + super(); + } + + /** + * Constructs a new LoadingException with the specified error message. + */ + public LoadingException(String message){ + super (message); + detailMessage = message; + } +} diff --git a/src/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java new file mode 100644 index 00000000..2a52743d --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java @@ -0,0 +1,81 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * A LocalVariableInfoInconsistentException instance is thrown by + * the LocalVariableInfo class when it detects that the information + * it holds is inconsistent; this is normally due to inconsistent + * LocalVariableTable entries in the Code attribute of a certain + * Method object. + * + * @version $Id$ + * @author Enver Haase + */ +public class LocalVariableInfoInconsistentException extends ClassConstraintException{ + /** + * Constructs a new LocalVariableInfoInconsistentException with null as its error message string. + */ + public LocalVariableInfoInconsistentException(){ + super(); + } + + /** + * Constructs a new LocalVariableInfoInconsistentException with the specified error message. + */ + public LocalVariableInfoInconsistentException(String message){ + super (message); + } +} diff --git a/src/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java new file mode 100644 index 00000000..86b0fd3b --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java @@ -0,0 +1,71 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when + * a class file to verify does not pass the verification pass 3 because of a violation + * of a static constraint as described in the Java Virtual Machine Specification, + * 2nd edition, 4.8.1, pages 133-137. The static constraints checking part of pass 3 + * is called pass 3a in JustIce. + * + * @version $Id$ + * @author Enver Haase + */ +public abstract class StaticCodeConstraintException extends CodeConstraintException{ + public StaticCodeConstraintException(String message){ + super(message); + } +} diff --git a/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java new file mode 100644 index 00000000..43a8a3f7 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java @@ -0,0 +1,74 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when + * a class file to verify does not pass the verification pass 3 because of a violation + * of a static constraint as described in the Java Virtual Machine Specification, + * Second edition, 4.8.1, pages 133-137. The static constraints checking part of pass 3 + * is called pass 3a in JustIce. + * Static constraints on the instructions in the code array are checked early in + * pass 3a and are described on page 134 in the Java Virtual Machine Specification, + * Second Edition. + * + * @version $Id$ + * @author Enver Haase + */ +public class StaticCodeInstructionConstraintException extends StaticCodeConstraintException{ + public StaticCodeInstructionConstraintException(String message){ + super(message); + } +} diff --git a/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java new file mode 100644 index 00000000..3825a741 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -0,0 +1,74 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when + * a class file to verify does not pass the verification pass 3 because of a violation + * of a static constraint as described in the Java Virtual Machine Specification, + * Second edition, 4.8.1, pages 133-137. The static constraints checking part of pass 3 + * is called pass 3a in JustIce. + * Static constraints on the operands of instructions in the code array are checked late in + * pass 3a and are described on page 134-137 in the Java Virtual Machine Specification, + * Second Edition. + * + * @version $Id$ + * @author Enver Haase + */ +public class StaticCodeInstructionOperandConstraintException extends StaticCodeConstraintException{ + public StaticCodeInstructionOperandConstraintException(String message){ + super(message); + } +} diff --git a/src/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java new file mode 100644 index 00000000..946f1044 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java @@ -0,0 +1,82 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when + * a class file to verify does not pass the verification pass 3 because of a violation + * of a structural constraint as described in the Java Virtual Machine Specification, + * 2nd edition, 4.8.2, pages 137-139. + * Note that the notion of a "structural" constraint is somewhat misleading. Structural + * constraints are constraints on relationships between Java virtual machine instructions. + * These are the constraints where data-flow analysis is needed to verify if they hold. + * The data flow analysis of pass 3 is called pass 3b in JustIce. + * + * @version $Id$ + * @author Enver Haase + */ +public class StructuralCodeConstraintException extends CodeConstraintException{ + /** + * Constructs a new StructuralCodeConstraintException with the specified error message. + */ + public StructuralCodeConstraintException(String message){ + super(message); + } + /** + * Constructs a new StructuralCodeConstraintException with null as its error message string. + */ + public StructuralCodeConstraintException(){ + super(); + } +} diff --git a/src/java/org/apache/bcel/verifier/exc/Utility.java b/src/java/org/apache/bcel/verifier/exc/Utility.java new file mode 100644 index 00000000..01b80cea --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/Utility.java @@ -0,0 +1,76 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.io.*; + +/** + * A utility class providing convenience methods concerning Throwable instances. + * @version $Id$ + * @author Enver Haase + * @see java.lang.Throwable + */ +public final class Utility{ + /** This class is not instantiable. */ + private Utility(){} + + /** This method returns the stack trace of a Throwable instance as a String. */ + public static String getStackTrace(Throwable t){ + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + t.printStackTrace(pw); + return sw.toString(); + } +} diff --git a/src/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/java/org/apache/bcel/verifier/exc/VerificationException.java new file mode 100644 index 00000000..d8d473fa --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/VerificationException.java @@ -0,0 +1,82 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when a + * class file to verify does not pass one of the verification passes 2 or 3. + * Note that the pass 3 used by "JustIce" involves verification that is usually + * delayed to pass 4. + * The name of this class is justified by the Java Virtual Machine Specification, 2nd + * edition, page 164, 5.4.1 where verification as a part of the linking process is + * defined to be the verification happening in passes 2 and 3. + * + * @version $Id$ + * @author Enver Haase + */ +public abstract class VerificationException extends VerifierConstraintViolatedException{ + /** + * Constructs a new VerificationException with null as its error message string. + */ + VerificationException(){ + super(); + } + /** + * Constructs a new VerificationException with the specified error message. + */ + VerificationException(String message){ + super(message); + } +} diff --git a/src/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java new file mode 100644 index 00000000..65dd1e96 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java @@ -0,0 +1,107 @@ +package org.apache.bcel.verifier.exc; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" + * whenever + * verification proves that some constraint of a class file (as stated in the + * Java Virtual Machine Specification, Edition 2) is violated. + * This is roughly equivalent to the VerifyError the JVM-internal verifiers + * throw. + * + * @version $Id$ + * @author Enver Haase + */ +public abstract class VerifierConstraintViolatedException extends RuntimeException{ + // /** The name of the offending class that did not pass the verifier. */ + // String name_of_offending_class; + + /** The specified error message. */ + private String detailMessage; + /** + * Constructs a new VerifierConstraintViolatedException with null as its error message string. + */ + VerifierConstraintViolatedException(){ + super(); + } + /** + * Constructs a new VerifierConstraintViolatedException with the specified error message. + */ + VerifierConstraintViolatedException(String message){ + super(message); // Not that important + detailMessage = message; + } + + + /** Extends the error message with a string before ("pre") and after ("post") the + 'old' error message. All of these three strings are allowed to be null, and null + is always replaced by the empty string (""). In particular, after invoking this + method, the error message of this object can no longer be null. + */ + public void extendMessage(String pre, String post){ + if (pre == null) pre=""; + if (detailMessage == null) detailMessage=""; + if (post == null) post=""; + detailMessage = pre+detailMessage+post; + } + /** + * Returns the error message string of this VerifierConstraintViolatedException object. + * @return the error message string of this VerifierConstraintViolatedException. + */ + public String getMessage(){ + return detailMessage; + } +} diff --git a/src/java/org/apache/bcel/verifier/exc/package.html b/src/java/org/apache/bcel/verifier/exc/package.html new file mode 100644 index 00000000..3d04b1b5 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/exc/package.html @@ -0,0 +1,24 @@ + + + + + + + +Exception classes used by JustIce, mostly used internally. You don't need to bother with them. + +

        Package Specification

        + +Contained in this package are Exception classes for use with the JustIce verifier. + +

        Related Documentation

        + +For a simple demonstration of JustIce working, please see: + + + + diff --git a/src/java/org/apache/bcel/verifier/package.html b/src/java/org/apache/bcel/verifier/package.html new file mode 100644 index 00000000..5f73d77d --- /dev/null +++ b/src/java/org/apache/bcel/verifier/package.html @@ -0,0 +1,25 @@ + + + + + + + +BCEL's verifier JustIce is there to help you dump correct Java class files created or modified with BCEL. + +

        Package Specification

        + +This is the top-level package of the JustIce verifier. To actually use it, have a look at the VerifierFactory and +Verifier classes. + +

        Related Documentation

        + +For a simple demonstration of JustIce working, please see: + + + + diff --git a/src/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java new file mode 100644 index 00000000..108988c4 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java @@ -0,0 +1,79 @@ +package org.apache.bcel.verifier.statics; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.generic.Type; + +/** + * This class represents the upper half of a DOUBLE variable. + * @version $Id$ + * @author Enver Haase + */ +public final class DOUBLE_Upper extends Type{ + + /** The one and only instance of this class. */ + private static DOUBLE_Upper singleInstance = new DOUBLE_Upper(); + + /** The constructor; this class must not be instantiated from the outside. */ + private DOUBLE_Upper(){ + super(Constants.T_UNKNOWN, "Long_Upper"); + } + + /** Use this method to get the single instance of this class. */ + public static DOUBLE_Upper theInstance(){ + return singleInstance; + } +} diff --git a/src/java/org/apache/bcel/verifier/statics/IntList.java b/src/java/org/apache/bcel/verifier/statics/IntList.java new file mode 100644 index 00000000..bc45fda1 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/statics/IntList.java @@ -0,0 +1,85 @@ +package org.apache.bcel.verifier.statics; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.util.ArrayList; + +/** + * A small utility class representing a set of basic int values. + * + * @version $Id$ + * @author Enver Haase + */ +public class IntList{ + /** The int are stored as Integer objects here. */ + private ArrayList theList; + /** This constructor creates an empty list. */ + IntList(){ + theList = new ArrayList(); + } + /** Adds an element to the list. */ + void add(int i){ + theList.add(new Integer(i)); + } + /** Checks if the specified int is already in the list. */ + boolean contains(int i){ + Integer[] ints = new Integer[theList.size()]; + theList.toArray(ints); + for (int j=0; j. + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.generic.Type; + +/** + * This class represents the upper half of a LONG variable. + * @version $Id$ + * @author Enver Haase + */ +public final class LONG_Upper extends Type{ + + /** The one and only instance of this class. */ + private static LONG_Upper singleInstance = new LONG_Upper(); + + /** The constructor; this class must not be instantiated from the outside. */ + private LONG_Upper(){ + super(Constants.T_UNKNOWN, "Long_Upper"); + } + + /** Use this method to get the single instance of this class. */ + public static LONG_Upper theInstance(){ + return singleInstance; + } +} diff --git a/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java new file mode 100644 index 00000000..2c9a7dec --- /dev/null +++ b/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java @@ -0,0 +1,145 @@ +package org.apache.bcel.verifier.statics; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.exc.*; +import java.util.Hashtable; + +/** + * A utility class holding the information about + * the name and the type of a local variable in + * a given slot (== index). This information + * often changes in course of byte code offsets. + * + * @version $Id$ + * @author Enver Haase + */ +public class LocalVariableInfo{ + + /** The types database. KEY: String representing the offset integer. */ + private Hashtable types = new Hashtable(); + /** The names database. KEY: String representing the offset integer. */ + private Hashtable names = new Hashtable(); + + /** + * Adds a name of a local variable and a certain slot to our 'names' + * (Hashtable) database. + */ + private void setName(int offset, String name){ + names.put( ((Integer.toString(offset))), name); + } + /** + * Adds a type of a local variable and a certain slot to our 'types' + * (Hashtable) database. + */ + private void setType(int offset, Type t){ + types.put( ((Integer.toString(offset))), t); + } + + /** + * Returns the type of the local variable that uses this local + * variable slot at the given bytecode offset. + * Care for legal bytecode offsets yourself, otherwise the return value + * might be wrong. + * May return 'null' if nothing is known about the type of this local + * variable slot at the given bytecode offset. + */ + public Type getType(int offset){ + return (Type) types.get(Integer.toString(offset)); + } + /** + * Returns the name of the local variable that uses this local + * variable slot at the given bytecode offset. + * Care for legal bytecode offsets yourself, otherwise the return value + * might be wrong. + * May return 'null' if nothing is known about the type of this local + * variable slot at the given bytecode offset. + */ + public String getName(int offset){ + return (String) (names.get(Integer.toString(offset))); + } + /** + * Adds some information about this local variable (slot). + * @throws LocalVariableInfoInconsistentException if the new information conflicts + * with already gathered information. + */ + public void add(String name, int startpc, int length, Type t) throws LocalVariableInfoInconsistentException{ + for (int i=startpc; i<=startpc+length; i++){ // incl/incl-notation! + add(i,name,t); + } + } + + /** + * Adds information about name and type for a given offset. + * @throws LocalVariableInfoInconsistentException if the new information conflicts + * with already gathered information. + */ + private void add(int offset, String name, Type t) throws LocalVariableInfoInconsistentException{ + if (getName(offset) != null){ + if (! getName(offset).equals(name)){ + throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+"' a local variable has two different names: '"+getName(offset)+"' and '"+name+"'."); + } + } + if (getType(offset) != null){ + if (! getType(offset).equals(t)){ + throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+"' a local variable has two different types: '"+getType(offset)+"' and '"+t+"'."); + } + } + setName(offset, name); + setType(offset, t); + } +} diff --git a/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java new file mode 100644 index 00000000..221e6ab9 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java @@ -0,0 +1,113 @@ +package org.apache.bcel.verifier.statics; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.exc.*; + +/** + * A utility class holding the information about + * the names and the types of the local variables in + * a given method. + * + * @version $Id$ + * @author Enver Haase + */ +public class LocalVariablesInfo{ + + /** The information about the local variables is stored here. */ + private LocalVariableInfo[] localVariableInfos; + + /** + * The ints in the list represent code offsets where either instructions must start + * or the offset is the length of the code array. This will be verified in Pass 3a. + */ + private IntList instruction_offsets = new IntList(); + + /** The constructor. */ + LocalVariablesInfo(int max_locals){ + localVariableInfos = new LocalVariableInfo[max_locals]; + for (int i=0; i= localVariableInfos.length){ + throw new AssertionViolatedException("Slot number for local variable information out of range."); + } + return localVariableInfos[slot]; + } + + /** + * Adds information about the local variable in slot 'slot'. Automatically + * adds information for slot+1 if 't' is Type.LONG or Type.DOUBLE. + * @throws LocalVariableInfoInconsistentException if the new information conflicts + * with already gathered information. + */ + public void add(int slot, String name, int startpc, int length, Type t) throws LocalVariableInfoInconsistentException{ + // The add operation on LocalVariableInfo may throw the '...Inconsistent...' exception, we don't throw it explicitely here. + + if (slot < 0 || slot >= localVariableInfos.length){ + throw new AssertionViolatedException("Slot number for local variable information out of range."); + } + + localVariableInfos[slot].add(name, startpc, length, t); + if (t == Type.LONG) localVariableInfos[slot+1].add(name, startpc, length, LONG_Upper.theInstance()); + if (t == Type.DOUBLE) localVariableInfos[slot+1].add(name, startpc, length, DOUBLE_Upper.theInstance()); + } +} diff --git a/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java new file mode 100644 index 00000000..4b1e8c00 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -0,0 +1,214 @@ +package org.apache.bcel.verifier.statics; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.classfile.*; +import org.apache.bcel.Repository; +import org.apache.bcel.verifier.*; +import org.apache.bcel.verifier.exc.*; +import org.apache.bcel.verifier.exc.Utility; +import java.util.ArrayList; + +/** + * This PassVerifier verifies a class file according to pass 1 as + * described in The Java Virtual Machine Specification, 2nd edition. + * More detailed information is to be found at the do_verify() method's + * documentation. + * + * @version $Id$ + * @author Enver Haase + * @see #do_verify() + */ +public final class Pass1Verifier extends PassVerifier{ + /** + * DON'T USE THIS EVEN PRIVATELY! USE getJavaClass() INSTEAD. + * @see #getJavaClass() + */ + private JavaClass jc; + + /** + * The Verifier that created this. + */ + private Verifier myOwner; + + /** Used to load in and return the myOwner-matching JavaClass object when needed. Avoids loading in a class file when it's not really needed! */ + private JavaClass getJavaClass(){ + if (jc == null){ + jc = Repository.lookupClass(myOwner.getClassName()); + } + return jc; + } + + /** + * Should only be instantiated by a Verifier. + * + * @see org.apache.bcel.verifier.Verifier + */ + public Pass1Verifier(Verifier owner){ + myOwner = owner; + } + + /** + * Pass-one verification basically means loading in a class file. + * The Java Virtual Machine Specification is not too precise about + * what makes the difference between passes one and two. + * The answer is that only pass one is performed on a class file as + * long as its resolution is not requested; whereas pass two and + * pass three are performed during the resolution process. + * Only four constraints to be checked are explicitely stated by + * The Java Virtual Machine Specification, 2nd edition: + *
          + *
        • The first four bytes must contain the right magic number (0xCAFEBABE). + *
        • All recognized attributes must be of the proper length. + *
        • The class file must not be truncated or have extra bytes at the end. + *
        • The constant pool must not contain any superficially unrecognizable information. + *
        + * A more in-depth documentation of what pass one should do was written by + * Philip W. L. Fong: + *
          + *
        • the file should not be truncated. + *
        • the file should not have extra bytes at the end. + *
        • all variable-length structures should be well-formatted: + *
            + *
          • there should only be constant_pool_count-1 many entries in the constant pool. + *
          • all constant pool entries should have size the same as indicated by their type tag. + *
          • there are exactly interfaces_count many entries in the interfaces array of the class file. + *
          • there are exactly fields_count many entries in the fields array of the class file. + *
          • there are exactly methods_count many entries in the methods array of the class file. + *
          • there are exactly attributes_count many entries in the attributes array of the class file, fields, methods, and code attribute. + *
          • there should be exactly attribute_length many bytes in each attribute. Inconsistency between attribute_length and the actually size of the attribute content should be uncovered. For example, in an Exceptions attribute, the actual number of exceptions as required by the number_of_exceptions field might yeild an attribute size that doesn't match the attribute_length. Such an anomaly should be detected. + *
          • all attributes should have proper length. In particular, under certain context (e.g. while parsing method_info), recognizable attributes (e.g. "Code" attribute) should have correct format (e.g. attribute_length is 2). + *
          + *
        • Also, certain constant values are checked for validity: + *
            + *
          • The magic number should be 0xCAFEBABE. + *
          • The major and minor version numbers are valid. + *
          • All the constant pool type tags are recognizable. + *
          • All undocumented access flags are masked off before use. Strictly speaking, this is not really a check. + *
          • The field this_class should point to a string that represents a legal non-array class name, and this name should be the same as the class file being loaded. + *
          • the field super_class should point to a string that represents a legal non-array class name. + *
          • Because some of the above checks require cross referencing the constant pool entries, guards are set up to make sure that the referenced entries are of the right type and the indices are within the legal range (0 < index < constant_pool_count). + *
          + *
        • Extra checks done in pass 1: + *
            + *
          • the constant values of static fields should have the same type as the fields. + *
          • the number of words in a parameter list does not exceed 255 and locals_max. + *
          • the name and signature of fields and methods are verified to be of legal format. + *
          + *
        + * (From the Paper The Mysterious Pass One, first draft, September 2, 1997.) + *
        + * However, most of this is done by parsing a class file or generating a class file into BCEL's internal data structure. + * Therefore, all that is really done here is look up the class file from BCEL's repository. + * This is also motivated by the fact that some omitted things + * (like the check for extra bytes at the end of the class file) are handy when actually using BCEL to repair a class file (otherwise you would not be + * able to load it into BCEL). + * + * @see org.apache.bcel.Repository + */ + public VerificationResult do_verify(){ + JavaClass jc; + try{ + jc = getJavaClass(); //loads in the class file if not already done. + + if (jc != null){ + /* If we find more constraints to check, we should do this in an own method. */ + if (! myOwner.getClassName().equals(jc.getClassName())){ + // This should maybe caught by BCEL: In case of renamed .class files we get wrong + // JavaClass objects here. + throw new LoadingException("Wrong name: the internal name of the .class file '"+jc.getClassName()+"' does not match the file's name '"+myOwner.getClassName()+"'."); + } + } + + } + catch(LoadingException e){ + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, e.getMessage()); + } + catch(ClassFormatError e){ + // BCEL sometimes is a little harsh describing exceptual situations. + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, e.getMessage()); + } + catch(RuntimeException e){ + // BCEL does not catch every possible RuntimeException; e.g. if + // a constant pool index is referenced that does not exist. + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Parsing via BCEL did not succeed. "+e.getClass().getName()+" occured:\n"+Utility.getStackTrace(e)); + } + + if (jc != null){ + return VerificationResult.VR_OK; + } + else{ + //TODO: Maybe change Repository's behaviour to throw a LoadingException instead of just returning "null" + // if a class file cannot be found or in another way be looked up. + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Repository.lookup() failed. FILE NOT FOUND?"); + } + } + + /** + * Currently this returns an empty array of String. + * One could parse the error messages of BCEL + * (written to java.lang.System.err) when loading + * a class file such as detecting unknown attributes + * or trailing garbage at the end of a class file. + * However, Markus Dahm does not like the idea so this + * method is currently useless and therefore marked as + * TODO. + */ + public String[] getMessages(){ + // This method is only here to override the javadoc-comment. + return super.getMessages(); + } + +} diff --git a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java new file mode 100644 index 00000000..7c41d1fb --- /dev/null +++ b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -0,0 +1,1334 @@ +package org.apache.bcel.verifier.statics; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.*; +import org.apache.bcel.classfile.DescendingVisitor; // Use _this_ one! +import org.apache.bcel.classfile.EmptyVisitor; // Use _this_ one! +import org.apache.bcel.classfile.Visitor; // Use _this_ one! +import org.apache.bcel.generic.*; +import org.apache.bcel.verifier.*; +import org.apache.bcel.verifier.exc.*; +import java.util.HashMap; +import java.util.HashSet; + +/** + * This PassVerifier verifies a class file according to + * pass 2 as described in The Java Virtual Machine + * Specification, 2nd edition. + * More detailed information is to be found at the do_verify() + * method's documentation. + * + * @version $Id$ + * @author Enver Haase + * @see #do_verify() + */ +public final class Pass2Verifier extends PassVerifier implements Constants{ + + /** + * The LocalVariableInfo instances used by Pass3bVerifier. + * localVariablesInfos[i] denotes the information for the + * local variables of method number i in the + * JavaClass this verifier operates on. + */ + private LocalVariablesInfo[] localVariablesInfos; + + /** The Verifier that created this. */ + private Verifier myOwner; + + /** + * Should only be instantiated by a Verifier. + * + * @see Verifier + */ + public Pass2Verifier(Verifier owner){ + myOwner = owner; + } + + /** + * Returns a LocalVariablesInfo object containing information + * about the usage of the local variables in the Code attribute + * of the said method or null if the class file this + * Pass2Verifier operates on could not be pass-2-verified correctly. + * The method number method_nr is the method you get using + * Repository.lookupClass(myOwner.getClassname()).getMethods()[method_nr];. + * You should not add own information. Leave that to JustIce. + */ + public LocalVariablesInfo getLocalVariablesInfo(int method_nr){ + if (this.verify() != VerificationResult.VR_OK) return null; // It's cached, don't worry. + if (method_nr < 0 || method_nr >= localVariablesInfos.length){ + throw new AssertionViolatedException("Method number out of range."); + } + return localVariablesInfos[method_nr]; + } + + /** + * Pass 2 is the pass where static properties of the + * class file are checked without looking into "Code" + * arrays of methods. + * This verification pass is usually invoked when + * a class is resolved; and it may be possible that + * this verification pass has to load in other classes + * such as superclasses or implemented interfaces. + * Therefore, Pass 1 is run on them.
        + * Note that most referenced classes are not loaded + * in for verification or for an existance check by this + * pass; only the syntactical correctness of their names + * and descriptors (a.k.a. signatures) is checked.
        + * Very few checks that conceptually belong here + * are delayed until pass 3a in JustIce. JustIce does + * not only check for syntactical correctness but also + * for semantical sanity - therefore it needs access to + * the "Code" array of methods in a few cases. Please + * see the pass 3a documentation, too. + * + * @see org.apache.bcel.verifier.statics.Pass3aVerifier + */ + public VerificationResult do_verify(){ + VerificationResult vr1 = myOwner.doPass1(); + if (vr1.equals(VerificationResult.VR_OK)){ + + // For every method, we could have information about the local variables out of LocalVariableTable attributes of + // the Code attributes. + localVariablesInfos = new LocalVariablesInfo[Repository.lookupClass(myOwner.getClassName()).getMethods().length]; + + VerificationResult vr = VerificationResult.VR_OK; // default. + try{ + constant_pool_entries_satisfy_static_constraints(); + field_and_method_refs_are_valid(); + every_class_has_an_accessible_superclass(); + final_methods_are_not_overridden(); + } + catch (ClassConstraintException cce){ + vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); + } + return vr; + } + else + return VerificationResult.VR_NOTYET; + } + + /** + * Ensures that every class has a super class and that + * final classes are not subclassed. + * This means, the class this Pass2Verifier operates + * on has proper super classes (transitively) up to + * java.lang.Object. + * The reason for really loading (and Pass1-verifying) + * all of those classes here is that we need them in + * Pass2 anyway to verify no final methods are overridden + * (that could be declared anywhere in the ancestor hierarchy). + * + * @throws ClassConstraintException otherwise. + */ + private void every_class_has_an_accessible_superclass(){ + HashSet hs = new HashSet(); // save class names to detect circular inheritance + JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + int supidx = -1; + + while (supidx != 0){ + supidx = jc.getSuperclassNameIndex(); + + if (supidx == 0){ + if (jc != Repository.lookupClass(Type.OBJECT.getClassName())){ + throw new ClassConstraintException("Superclass of '"+jc.getClassName()+"' missing but not "+Type.OBJECT.getClassName()+" itself!"); + } + } + else{ + String supername = jc.getSuperclassName(); + if (! hs.add(supername)){ // If supername already is in the list + throw new ClassConstraintException("Circular superclass hierarchy detected."); + } + Verifier v = VerifierFactory.getVerifier(supername); + VerificationResult vr = v.doPass1(); + + if (vr != VerificationResult.VR_OK){ + throw new ClassConstraintException("Could not load in ancestor class '"+supername+"'."); + } + jc = Repository.lookupClass(supername); + + if (jc.isFinal()){ + throw new ClassConstraintException("Ancestor class '"+supername+"' has the FINAL access modifier and must therefore not be subclassed."); + } + } + } + } + + /** + * Ensures that final methods are not overridden. + * Precondition to run this method: + * constant_pool_entries_satisfy_static_constraints() and + * every_class_has_an_accessible_superclass() have to be invoked before + * (in that order). + * + * @throws ClassConstraintException otherwise. + * @see #constant_pool_entries_satisfy_static_constraints() + * @see #every_class_has_an_accessible_superclass() + */ + private void final_methods_are_not_overridden(){ + HashMap hashmap = new HashMap(); + JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + + int supidx = -1; + while (supidx != 0){ + supidx = jc.getSuperclassNameIndex(); + + ConstantPoolGen cpg = new ConstantPoolGen(jc.getConstantPool()); + Method[] methods = jc.getMethods(); + for (int i=0; i= cplen)){ + throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(referrer)+"'."); + } + Constant c = cp.getConstant(index); + if (! shouldbe.isInstance(c)){ + String isnot = shouldbe.toString().substring(shouldbe.toString().lastIndexOf(".")+1); //Cut all before last "." + throw new ClassCastException("Illegal constant '"+tostring(c)+"' at index '"+index+"'. '"+tostring(referrer)+"' expects a '"+shouldbe+"'."); + } + } + /////////////////////////////////////// + // ClassFile structure (vmspec2 4.1) // + /////////////////////////////////////// + public void visitJavaClass(JavaClass obj){ + Attribute[] atts = obj.getAttributes(); + boolean foundSourceFile = false; + boolean foundInnerClasses = false; + + // Is there an InnerClass referenced? + // This is a costly check; existing verifiers don't do it! + boolean hasInnerClass = new InnerClassDetector(jc).innerClassReferenced(); + + for (int i=0; i 1){ + throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); + } + + if (obj.isFinal() && obj.isVolatile()){ + throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_FINAL, ACC_VOLATILE modifiers set."); + } + } + else{ // isInterface! + if (!obj.isPublic()){ + throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); + } + if (!obj.isStatic()){ + throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_STATIC modifier set but hasn't!"); + } + if (!obj.isFinal()){ + throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_FINAL modifier set but hasn't!"); + } + } + + if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_VOLATILE|ACC_TRANSIENT)) > 0){ + addMessage("Field '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, ACC_TRANSIENT set (ignored)."); + } + + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + String name = obj.getName(); + if (! validFieldName(name)){ + throw new ClassConstraintException("Field '"+tostring(obj)+"' has illegal name '"+obj.getName()+"'."); + } + + // A descriptor is often named signature in BCEL + checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); + + String sig = ((ConstantUtf8) (cp.getConstant(obj.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + + try{ + Type t = Type.getType(sig); + } + catch (ClassFormatError cfe){ // sometimes BCEL is a little harsh describing exceptional situations. + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'."); + } + + String nameanddesc = (name+sig); + if (field_names_and_desc.contains(nameanddesc)){ + throw new ClassConstraintException("No two fields (like '"+tostring(obj)+"') are allowed have same names and descriptors!"); + } + if (field_names.contains(name)){ + addMessage("More than one field of name '"+name+"' detected (but with different type descriptors). This is very unusual."); + } + field_names_and_desc.add(nameanddesc); + field_names.add(name); + + Attribute[] atts = obj.getAttributes(); + for (int i=0; i 1){ + throw new ClassConstraintException("Method '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); + } + + if (obj.isAbstract()){ + if (obj.isFinal()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_FINAL modifier set."); + if (obj.isNative()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_NATIVE modifier set."); + if (obj.isPrivate()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_PRIVATE modifier set."); + if (obj.isStatic()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STATIC modifier set."); + if (obj.isStrictfp()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STRICT modifier set."); + if (obj.isSynchronized()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_SYNCHRONIZED modifier set."); + } + } + else{ // isInterface! + if (!name.equals(STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph + if (!obj.isPublic()){ + throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); + } + if (!obj.isAbstract()){ + throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_STATIC modifier set but hasn't!"); + } + if ( obj.isPrivate() || + obj.isProtected() || + obj.isStatic() || + obj.isFinal() || + obj.isSynchronized() || + obj.isNative() || + obj.isStrictfp() ){ + throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must not have any of the ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT modifiers set."); + } + } + } + + // A specific instance initialization method... (vmspec2,Page 116). + if (name.equals(CONSTRUCTOR_NAME)){ + //..may have at most one of ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC set: is checked above. + //..may also have ACC_STRICT set, but none of the other flags in table 4.5 (vmspec2, page 115) + if ( obj.isStatic() || + obj.isFinal() || + obj.isSynchronized() || + obj.isNative() || + obj.isAbstract() ){ + throw new ClassConstraintException("Instance initialization method '"+tostring(obj)+"' must not have any of the ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT modifiers set."); + } + } + + // Class and interface initialization methods... + if (name.equals(STATIC_INITIALIZER_NAME)){ + if ((obj.getAccessFlags() & (~ACC_STRICT)) > 0){ + addMessage("Class or interface initialization method '"+tostring(obj)+"' has superfluous access modifier(s) set: everything but ACC_STRICT is ignored."); + } + if (obj.isAbstract()){ + throw new ClassConstraintException("Class or interface initialization method '"+tostring(obj)+"' must not be abstract. This contradicts the Java Language Specification, Second Edition (which omits this constraint) but is common practice of existing verifiers."); + } + } + + if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_SYNCHRONIZED|ACC_NATIVE|ACC_ABSTRACT|ACC_STRICT)) > 0){ + addMessage("Method '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT set (ignored)."); + } + + String nameanddesc = (name+sig); + if (method_names_and_desc.contains(nameanddesc)){ + throw new ClassConstraintException("No two methods (like '"+tostring(obj)+"') are allowed have same names and desciptors!"); + } + method_names_and_desc.add(nameanddesc); + + Attribute[] atts = obj.getAttributes(); + int num_code_atts = 0; + for (int i=0; i= cplen)){ + throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(obj)+"'."); + } + Constant c = cp.getConstant(index); + + if (CONST_Long.isInstance(c) && field_type.equals(Type.LONG)){ + return; + } + if (CONST_Float.isInstance(c) && field_type.equals(Type.FLOAT)){ + return; + } + if (CONST_Double.isInstance(c) && field_type.equals(Type.DOUBLE)){ + return; + } + if (CONST_Integer.isInstance(c) && (field_type.equals(Type.INT) || field_type.equals(Type.SHORT) || field_type.equals(Type.CHAR) || field_type.equals(Type.BYTE) || field_type.equals(Type.BOOLEAN))){ + return; + } + if (CONST_String.isInstance(c) && field_type.equals(Type.STRING)){ + return; + } + + throw new ClassConstraintException("Illegal type of ConstantValue '"+obj+"' embedding Constant '"+c+"'. It is referenced by field '"+tostring(f)+"' expecting a different type: '"+field_type+"'."); + } + } + // SYNTHETIC: see above + // DEPRECATED: see above + ///////////////////////////////////////////////////////// + // method_info-structure-ATTRIBUTES (vmspec2 4.6, 4.7) // + ///////////////////////////////////////////////////////// + public void visitCode(Code obj){//vmspec2 4.7.3 + // No code attribute allowed for native or abstract methods: see visitMethod(Method). + // Code array constraints are checked in Pass3 (3a and 3b). + + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); + if (! name.equals("Code")){ + throw new ClassConstraintException("The Code attribute '"+tostring(obj)+"' is not correctly named 'Code' but '"+name+"'."); + } + + Method m = null; // satisfy compiler + if (!(carrier.predecessor() instanceof Method)){ + addMessage("Code attribute '"+tostring(obj)+"' is not declared in a method_info structure but in '"+carrier.predecessor()+"'. Ignored."); + return; + } + else{ + m = (Method) carrier.predecessor(); // we can assume this method was visited before; + // i.e. the data consistency was verified. + } + + if (obj.getCode().length == 0){ + throw new ClassConstraintException("Code array of Code attribute '"+tostring(obj)+"' (method '"+m+"') must not be empty."); + } + + //In JustIce, the check for correct offsets into the code array is delayed to Pass 3a. + CodeException[] exc_table = obj.getExceptionTable(); + for (int i=0; i= code.getMaxLocals()){ + throw new ClassConstraintException("LocalVariableTable attribute '"+tostring(lvt)+"' references a LocalVariable '"+tostring(localvariables[i])+"' with an index that exceeds the surrounding Code attribute's max_locals value of '"+code.getMaxLocals()+"'."); + } + + try{ + localVariablesInfos[method_number].add(localindex, localname, localvariables[i].getStartPC(), localvariables[i].getLength(), t); + } + catch(LocalVariableInfoInconsistentException lviie){ + throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+"' found in Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"'). "+lviie.getMessage()); + } + }// for all local variables localvariables[i] in the LocalVariableTable attribute atts[a] END + + num_of_lvt_attribs++; + if (num_of_lvt_attribs > obj.getMaxLocals()){ + throw new ClassConstraintException("Number of LocalVariableTable attributes of Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"') exceeds number of local variable slots '"+obj.getMaxLocals()+"' ('There may be no more than one LocalVariableTable attribute per local variable in the Code attribute.')."); + } + }// if atts[a] instanceof LocalVariableTable END + }// for all attributes atts[a] END + }// visitCode(Code) END + + public void visitExceptionTable(ExceptionTable obj){//vmspec2 4.7.4 + // incorrectly named, it's the Exceptions attribute (vmspec2 4.7.4) + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); + if (! name.equals("Exceptions")){ + throw new ClassConstraintException("The Exceptions attribute '"+tostring(obj)+"' is not correctly named 'Exceptions' but '"+name+"'."); + } + + int[] exc_indices = obj.getExceptionIndexTable(); + + for (int i=0; iPrecondition: index-style cross referencing in the constant + * pool must be valid. Simply invoke constant_pool_entries_satisfy_static_constraints() + * before.
        + * + * @throws ClassConstraintException otherwise. + * @see #constant_pool_entries_satisfy_static_constraints() + */ + private void field_and_method_refs_are_valid(){ + JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + DescendingVisitor v = new DescendingVisitor(jc, new FAMRAV_Visitor(jc)); + v.visit(); + } + + /** + * A Visitor class that ensures the ConstantCP-subclassed entries + * of the constant pool are valid. + * Precondition: index-style cross referencing in the constant + * pool must be valid. + * + * @see #constant_pool_entries_satisfy_static_constraints() + * @see org.apache.bcel.classfile.ConstantCP + */ + private class FAMRAV_Visitor extends EmptyVisitor implements Visitor{ + private final JavaClass jc; + private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work. + private FAMRAV_Visitor(JavaClass _jc){ + jc = _jc; + cp = _jc.getConstantPool(); + } + + public void visitConstantFieldref(ConstantFieldref obj){ + if (obj.getTag() != Constants.CONSTANT_Fieldref){ + throw new ClassConstraintException("ConstantFieldref '"+tostring(obj)+"' has wrong tag!"); + } + int name_and_type_index = obj.getNameAndTypeIndex(); + ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); + String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name + if (!validFieldName(name)){ + throw new ClassConstraintException("Invalid field name '"+name+"' referenced by '"+tostring(obj)+"'."); + } + + int class_index = obj.getClassIndex(); + ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); + String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form + if (! validClassName(className)){ + throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); + } + + String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + + try{ + Type t = Type.getType(sig); + } + catch (ClassFormatError cfe){ + // Well, BCEL sometimes is a little harsh describing exceptional situations. + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'."); + } + } + + public void visitConstantMethodref(ConstantMethodref obj){ + if (obj.getTag() != Constants.CONSTANT_Methodref){ + throw new ClassConstraintException("ConstantMethodref '"+tostring(obj)+"' has wrong tag!"); + } + int name_and_type_index = obj.getNameAndTypeIndex(); + ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); + String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name + if (!validClassMethodName(name)){ + throw new ClassConstraintException("Invalid (non-interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); + } + + int class_index = obj.getClassIndex(); + ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); + String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form + if (! validClassName(className)){ + throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); + } + + String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + + try{ + Type t = Type.getReturnType(sig); + Type[] ts = Type.getArgumentTypes(sig); + if ( name.equals(CONSTRUCTOR_NAME) && (t != Type.VOID) ){ + throw new ClassConstraintException("Instance initialization method must have VOID return type."); + } + } + catch (ClassFormatError cfe){ + // Well, BCEL sometimes is a little harsh describing exceptional situations. + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'."); + } + } + + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ + if (obj.getTag() != Constants.CONSTANT_InterfaceMethodref){ + throw new ClassConstraintException("ConstantInterfaceMethodref '"+tostring(obj)+"' has wrong tag!"); + } + int name_and_type_index = obj.getNameAndTypeIndex(); + ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); + String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name + if (!validInterfaceMethodName(name)){ + throw new ClassConstraintException("Invalid (interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); + } + + int class_index = obj.getClassIndex(); + ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); + String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form + if (! validClassName(className)){ + throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); + } + + String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + + try{ + Type t = Type.getReturnType(sig); + Type[] ts = Type.getArgumentTypes(sig); + if ( name.equals(STATIC_INITIALIZER_NAME) && (t != Type.VOID) ){ + addMessage("Class or interface initialization method '"+STATIC_INITIALIZER_NAME+"' usually has VOID return type instead of '"+t+"'. Note this is really not a requirement of The Java Virtual Machine Specification, Second Edition."); + } + } + catch (ClassFormatError cfe){ + // Well, BCEL sometimes is a little harsh describing exceptional situations. + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'."); + } + + } + + } + + /** + * This method returns true if and only if the supplied String + * represents a valid Java class name. + */ + private static final boolean validClassName(String name){ + // Are there restrictions? + return true; + } + /** + * This method returns true if and only if the supplied String + * represents a valid method name. + * This is basically the same as a valid identifier name in the + * Java programming language, but the special name for + * the instance initialization method is allowed and the special name + * for the class/interface initialization method may be allowed. + */ + private static boolean validMethodName(String name, boolean allowStaticInit){ + if (validJavaLangMethodName(name)) return true; + + if (allowStaticInit){ + return (name.equals(CONSTRUCTOR_NAME) || name.equals(STATIC_INITIALIZER_NAME)); + } + else{ + return name.equals(CONSTRUCTOR_NAME); + } + } + + /** + * This method returns true if and only if the supplied String + * represents a valid method name that may be referenced by + * ConstantMethodref objects. + */ + private static boolean validClassMethodName(String name){ + return validMethodName(name, false); + } + + /** + * This method returns true if and only if the supplied String + * represents a valid Java programming language method name stored as a simple + * (non-qualified) name. + * Conforming to: The Java Virtual Machine Specification, Second Edition, §2.7, §2.7.1, §2.2. + */ + private static boolean validJavaLangMethodName(String name){ + if (!Character.isJavaIdentifierStart(name.charAt(0))) return false; + + for (int i=1; i. + */ + +import org.apache.bcel.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.classfile.*; +import org.apache.bcel.verifier.*; +import org.apache.bcel.verifier.exc.*; +import java.util.ArrayList; +import java.util.HashMap; + +/** + * This PassVerifier verifies a class file according to + * pass 3, static part as described in The Java Virtual + * Machine Specification, 2nd edition. + * More detailed information is to be found at the do_verify() + * method's documentation. + * + * @version $Id$ + * @author Enver Haase + * @see #do_verify() + */ +public final class Pass3aVerifier extends PassVerifier{ + + /** The Verifier that created this. */ + private Verifier myOwner; + + /** + * The method number to verify. + * This is the index in the array returned + * by JavaClass.getMethods(). + */ + private int method_no; + + /** The one and only InstructionList object used by an instance of this class. It's here for performance reasons by do_verify() and its callees. */ + InstructionList instructionList; + /** The one and only Code object used by an instance of this class. It's here for performance reasons by do_verify() and its callees. */ + Code code; + + /** Should only be instantiated by a Verifier. */ + public Pass3aVerifier(Verifier owner, int method_no){ + myOwner = owner; + this.method_no = method_no; + } + + /** + * Pass 3a is the verification of static constraints of + * JVM code (such as legal targets of branch instructions). + * This is the part of pass 3 where you do not need data + * flow analysis. + * JustIce also delays the checks for a correct exception + * table of a Code attribute and correct line number entries + * in a LineNumberTable attribute of a Code attribute (which + * conceptually belong to pass 2) to this pass. Also, most + * of the check for valid local variable entries in a + * LocalVariableTable attribute of a Code attribute is + * delayed until this pass. + * All these checks need access to the code array of the + * Code attribute. + * + * @throws InvalidMethodException if the method to verify does not exist. + */ + public VerificationResult do_verify(){ + if (myOwner.doPass2().equals(VerificationResult.VR_OK)){ + // Okay, class file was loaded correctly by Pass 1 + // and satisfies static constraints of Pass 2. + JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + Method[] methods = jc.getMethods(); + if (method_no >= methods.length){ + throw new InvalidMethodException("METHOD DOES NOT EXIST!"); + } + Method method = methods[method_no]; + code = method.getCode(); + + // No Code? Nothing to verify! + if ( method.isAbstract() || method.isNative() ){ // IF mg HAS NO CODE (static constraint of Pass 2) + return VerificationResult.VR_OK; + } + + // TODO: + // We want a very sophisticated code examination here with good explanations + // on where to look for an illegal instruction or such. + // Only after that we should try to build an InstructionList and throw an + // AssertionViolatedException if after our examination InstructionList building + // still fails. + // That examination should be implemented in a byte-oriented way, i.e. look for + // an instruction, make sure its validity, count its length, find the next + // instruction and so on. + try{ + instructionList = new InstructionList(method.getCode().getCode()); + } + catch(RuntimeException re){ + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Bad bytecode in the code array of the Code attribute of method '"+method+"'."); + } + + instructionList.setPositions(true); + + // Start verification. + VerificationResult vr = VerificationResult.VR_OK; //default + try{ + delayedPass2Checks(); + } + catch(ClassConstraintException cce){ + vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); + return vr; + } + try{ + pass3StaticInstructionChecks(); + pass3StaticInstructionOperandsChecks(); + } + catch(StaticCodeConstraintException scce){ + vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, scce.getMessage()); + } + return vr; + } + else{ //did not pass Pass 2. + return VerificationResult.VR_NOTYET; + } + } + + /** + * These are the checks that could be done in pass 2 but are delayed to pass 3 + * for performance reasons. Also, these checks need access to the code array + * of the Code attribute of a Method so it's okay to perform them here. + * Also see the description of the do_verify() method. + * + * @throws ClassConstraintException if the verification fails. + * @see #do_verify() + */ + private void delayedPass2Checks(){ + + int[] instructionPositions = instructionList.getInstructionPositions(); + int codeLength = code.getCode().length; + + ///////////////////// + // LineNumberTable // + ///////////////////// + LineNumberTable lnt = code.getLineNumberTable(); + if (lnt != null){ + LineNumber[] lineNumbers = lnt.getLineNumberTable(); + IntList offsets = new IntList(); + lineNumber_loop: for (int i=0; i < lineNumbers.length; i++){ // may appear in any order. + for (int j=0; j < instructionPositions.length; j++){ + // TODO: Make this a binary search! The instructionPositions array is naturally ordered! + int offset = lineNumbers[i].getStartPC(); + if (instructionPositions[j] == offset){ + if (offsets.contains(offset)){ + addMessage("LineNumberTable attribute '"+code.getLineNumberTable()+"' refers to the same code offset ('"+offset+"') more than once which is violating the semantics [but is sometimes produced by IBM's 'jikes' compiler]."); + } + else{ + offsets.add(offset); + } + continue lineNumber_loop; + } + } + throw new ClassConstraintException("Code attribute '"+code+"' has a LineNumberTable attribute '"+code.getLineNumberTable()+"' referring to a code offset ('"+lineNumbers[i].getStartPC()+"') that does not exist."); + } + } + + /////////////////////////// + // LocalVariableTable(s) // + /////////////////////////// + /* We cannot use code.getLocalVariableTable() because there could be more + than only one. This is a bug in BCEL. */ + Attribute[] atts = code.getAttributes(); + for (int a=0; a= endpc){ + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has its start_pc ('"+startpc+"') not smaller than its end_pc ('"+endpc+"')."); + } + if (!contains(instructionPositions, startpc)){ + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has a non-existant bytecode offset as its start_pc ('"+startpc+"')."); + } + if ( (!contains(instructionPositions, endpc)) && (endpc != codeLength)){ + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has a non-existant bytecode offset as its end_pc ('"+startpc+"') [that is also not equal to code_length ('"+codeLength+"')]."); + } + if (!contains(instructionPositions, handlerpc)){ + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has a non-existant bytecode offset as its handler_pc ('"+handlerpc+"')."); + } + } + } + + /** + * These are the checks if constraints are satisfied which are described in the + * Java Virtual Machine Specification, Second Edition as Static Constraints on + * the instructions of Java Virtual Machine Code (chapter 4.8.1). + * + * @throws StaticCodeConstraintException if the verification fails. + */ + private void pass3StaticInstructionChecks(){ + + // Code array must not be empty: + // Enforced in pass 2 (also stated in the static constraints of the Code + // array in vmspec2), together with pass 1 (reading code_length bytes and + // interpreting them as code[]). So this must not be checked again here. + + if (! (code.getCode().length < 65536)){// contradicts vmspec2 page 152 ("Limitations"), but is on page 134. + throw new StaticCodeInstructionConstraintException("Code array in code attribute '"+code+"' too big: must be smaller than 65536 bytes."); + } + + // First opcode at offset 0: okay, that's clear. Nothing to do. + + // Only instances of the instructions documented in Section 6.4 may appear in + // the code array. + + // For BCEL's sake, we cannot handle WIDE stuff, but hopefully BCEL does its job right :) + + // The last byte of the last instruction in the code array must be the byte at index + // code_length-1 : See the do_verify() comments. We actually don't iterate through the + // byte array, but use an InstructionList so we cannot check for this. But BCEL does + // things right, so it's implicitely okay. + + // TODO: Check how BCEL handles (and will handle) instructions like IMPDEP1, IMPDEP2, + // BREAKPOINT... that BCEL knows about but which are illegal anyway. + // We currently go the safe way here. + InstructionHandle ih = instructionList.getStart(); + while (ih != null){ + Instruction i = ih.getInstruction(); + if (i instanceof IMPDEP1){ + throw new StaticCodeInstructionConstraintException("IMPDEP1 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); + } + if (i instanceof IMPDEP2){ + throw new StaticCodeInstructionConstraintException("IMPDEP2 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); + } + if (i instanceof BREAKPOINT){ + throw new StaticCodeInstructionConstraintException("BREAKPOINT must not be in the code, it is an illegal instruction for _internal_ JVM use!"); + } + ih = ih.getNext(); + } + + // The original verifier seems to do this check here, too. + // An unreachable last instruction may also not fall through the + // end of the code, which is stupid -- but with the original + // verifier's subroutine semantics one cannot predict reachability. + Instruction last = instructionList.getEnd().getInstruction(); + if (! ((last instanceof ReturnInstruction) || + (last instanceof RET) || + (last instanceof GotoInstruction) || + (last instanceof ATHROW) )) // JSR / JSR_W would possibly RETurn and then fall off the code! + throw new StaticCodeInstructionConstraintException("Execution must not fall off the bottom of the code array. This constraint is enforced statically as some existing verifiers do - so it may be a false alarm if the last instruction is not reachable."); + } + + /** + * These are the checks for the satisfaction of constraints which are described in the + * Java Virtual Machine Specification, Second Edition as Static Constraints on + * the operands of instructions of Java Virtual Machine Code (chapter 4.8.1). + * BCEL parses the code array to create an InstructionList and therefore has to check + * some of these constraints. Additional checks are also implemented here. + * + * @throws StaticCodeConstraintException if the verification fails. + */ + private void pass3StaticInstructionOperandsChecks(){ + // When building up the InstructionList, BCEL has already done all those checks + // mentioned in The Java Virtual Machine Specification, Second Edition, as + // "static constraints on the operands of instructions in the code array". + // TODO: see the do_verify() comments. Maybe we should really work on the + // byte array first to give more comprehensive messages. + // TODO: Review Exception API, possibly build in some "offending instruction" thing + // when we're ready to insulate the offending instruction by doing the + // above thing. + + // TODO: Implement as much as possible here. BCEL does _not_ check everything. + + ConstantPoolGen cpg = new ConstantPoolGen(Repository.lookupClass(myOwner.getClassName()).getConstantPool()); + InstOperandConstraintVisitor v = new InstOperandConstraintVisitor(cpg); + + // Checks for the things BCEL does _not_ handle itself. + InstructionHandle ih = instructionList.getStart(); + while (ih != null){ + Instruction i = ih.getInstruction(); + + // An "own" constraint, due to JustIce's new definition of what "subroutine" means. + if (i instanceof JsrInstruction){ + InstructionHandle target = ((JsrInstruction) i).getTarget(); + if (target == instructionList.getStart()){ + throw new StaticCodeInstructionOperandConstraintException("Due to JustIce's clear definition of subroutines, no JSR or JSR_W may have a top-level instruction (such as the very first instruction, which is targeted by instruction '"+ih+"' as its target."); + } + if (!(target.getInstruction() instanceof ASTORE)){ + throw new StaticCodeInstructionOperandConstraintException("Due to JustIce's clear definition of subroutines, no JSR or JSR_W may target anything else than an ASTORE instruction. Instruction '"+ih+"' targets '"+target+"'."); + } + } + + // vmspec2, page 134-137 + ih.accept(v); + + ih = ih.getNext(); + } + + } + + /** A small utility method returning if a given int i is in the given int[] ints. */ + private static boolean contains(int[] ints, int i){ + for (int j=0; j= cpg.getSize()){ + constraintViolated(i, "Illegal constant pool index '"+idx+"'."); + } + } + + /////////////////////////////////////////////////////////// + // The Java Virtual Machine Specification, pages 134-137 // + /////////////////////////////////////////////////////////// + /** + * Assures the generic preconditions of a LoadClass instance. + * The referenced class is loaded and pass2-verified. + */ + public void visitLoadClass(LoadClass o){ + ObjectType t = o.getLoadClassType(cpg); + if (t != null){// null means "no class is loaded" + Verifier v = VerifierFactory.getVerifier(t.getClassName()); + VerificationResult vr = v.doPass1(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded: '"+vr+"'."); + } + } + } + + // The target of each jump and branch instruction [...] must be the opcode [...] + // BCEL _DOES_ handle this. + + // tableswitch: BCEL will do it, supposedly. + + // lookupswitch: BCEL will do it, supposedly. + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + // LDC and LDC_W (LDC_W is a subclass of LDC in BCEL's model) + public void visitLDC(LDC o){ + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (! ( (c instanceof ConstantInteger) || + (c instanceof ConstantFloat) || + (c instanceof ConstantString) ) ){ + constraintViolated(o, "Operand of LDC or LDC_W must be one of CONSTANT_Integer, CONSTANT_Float or CONSTANT_String, but is '"+c+"'."); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + // LDC2_W + public void visitLDC2_W(LDC2_W o){ + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (! ( (c instanceof ConstantLong) || + (c instanceof ConstantDouble) ) ){ + constraintViolated(o, "Operand of LDC2_W must be CONSTANT_Long or CONSTANT_Double, but is '"+c+"'."); + } + try{ + indexValid(o, o.getIndex()+1); + } + catch(StaticCodeInstructionOperandConstraintException e){ + throw new AssertionViolatedException("OOPS: Does not BCEL handle that? LDC2_W operand has a problem."); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + //getfield, putfield, getstatic, putstatic + public void visitFieldInstruction(FieldInstruction o){ + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantFieldref)){ + constraintViolated(o, "Indexing a constant that's not a CONSTANT_Fieldref but a '"+c+"'."); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitInvokeInstruction(InvokeInstruction o){ + indexValid(o, o.getIndex()); + if ( (o instanceof INVOKEVIRTUAL) || + (o instanceof INVOKESPECIAL) || + (o instanceof INVOKESTATIC) ){ + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantMethodref)){ + constraintViolated(o, "Indexing a constant that's not a CONSTANT_Methodref but a '"+c+"'."); + } + else{ + // Constants are okay due to pass2. + ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantMethodref) c).getNameAndTypeIndex())); + ConstantUtf8 cutf8 = (ConstantUtf8) (cpg.getConstant(cnat.getNameIndex())); + if (cutf8.getBytes().equals(Constants.CONSTRUCTOR_NAME) && (!(o instanceof INVOKESPECIAL)) ){ + constraintViolated(o, "Only INVOKESPECIAL is allowed to invoke instance initialization methods."); + } + if ( (! (cutf8.getBytes().equals(Constants.CONSTRUCTOR_NAME)) ) && (cutf8.getBytes().startsWith("<")) ){ + constraintViolated(o, "No method with a name beginning with '<' other than the instance initialization methods may be called by the method invocation instructions."); + } + } + } + else{ //if (o instanceof INVOKEINTERFACE){ + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantInterfaceMethodref)){ + constraintViolated(o, "Indexing a constant that's not a CONSTANT_InterfaceMethodref but a '"+c+"'."); + } + // TODO: From time to time check if BCEL allows to detect if the + // 'count' operand is consistent with the information in the + // CONSTANT_InterfaceMethodref and if the last operand is zero. + // By now, BCEL hides those two operands because they're superfluous. + + // Invoked method must not be or + ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantInterfaceMethodref)c).getNameAndTypeIndex())); + String name = ((ConstantUtf8) (cpg.getConstant(cnat.getNameIndex()))).getBytes(); + if (name.equals(Constants.CONSTRUCTOR_NAME)){ + constraintViolated(o, "Method to invoke must not be '"+Constants.CONSTRUCTOR_NAME+"'."); + } + if (name.equals(Constants.STATIC_INITIALIZER_NAME)){ + constraintViolated(o, "Method to invoke must not be '"+Constants.STATIC_INITIALIZER_NAME+"'."); + } + } + + // The LoadClassType is the method-declaring class, so we have to check the other types. + + Type t = o.getReturnType(cpg); + if (t instanceof ArrayType){ + t = ((ArrayType) t).getBasicType(); + } + if (t instanceof ObjectType){ + Verifier v = VerifierFactory.getVerifier(((ObjectType) t).getClassName()); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated(o, "Return type class/interface could not be verified successfully: '"+vr.getMessage()+"'."); + } + } + + Type[] ts = o.getArgumentTypes(cpg); + for (int i=0; i= 255){ + constraintViolated(o, "Not allowed to create an array with more than 255 dimensions."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitNEWARRAY(NEWARRAY o){ + byte t = o.getTypecode(); + if (! ( (t == Constants.T_BOOLEAN) || + (t == Constants.T_CHAR) || + (t == Constants.T_FLOAT) || + (t == Constants.T_DOUBLE) || + (t == Constants.T_BYTE) || + (t == Constants.T_SHORT) || + (t == Constants.T_INT) || + (t == Constants.T_LONG) ) ){ + constraintViolated(o, "Illegal type code '+t+' for 'atype' operand."); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitILOAD(ILOAD o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitFLOAD(FLOAD o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitALOAD(ALOAD o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitISTORE(ISTORE o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitFSTORE(FSTORE o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitASTORE(ASTORE o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitIINC(IINC o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitRET(RET o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitLLOAD(LLOAD o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + } + else{ + int maxminus2 = max_locals()-2; + if (idx > maxminus2){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitDLOAD(DLOAD o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + } + else{ + int maxminus2 = max_locals()-2; + if (idx > maxminus2){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitLSTORE(LSTORE o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + } + else{ + int maxminus2 = max_locals()-2; + if (idx > maxminus2){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitDSTORE(DSTORE o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + } + else{ + int maxminus2 = max_locals()-2; + if (idx > maxminus2){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ + int[] matchs = o.getMatchs(); + int max = Integer.MIN_VALUE; + for (int i=0; i= "low". We cannot check this, as BCEL hides + // it from us. + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitPUTSTATIC(PUTSTATIC o){ + String field_name = o.getFieldName(cpg); + JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + Field[] fields = jc.getFields(); + Field f = null; + for (int i=0; i. + if ((!(jc.isClass())) && (!(meth_name.equals(Constants.STATIC_INITIALIZER_NAME)))){ + constraintViolated(o, "Interface field '"+f+"' must be set in a '"+Constants.STATIC_INITIALIZER_NAME+"' method."); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitGETSTATIC(GETSTATIC o){ + String field_name = o.getFieldName(cpg); + JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + Field[] fields = jc.getFields(); + Field f = null; + for (int i=0; i. + */ + +import org.apache.bcel.classfile.*; + +/** + * BCEL's Node classes (those from the classfile API that accept() Visitor + * instances) have toString() methods that were not designed to be robust, + * this gap is closed by this class. + * When performing class file verification, it may be useful to output which + * entity (e.g. a Code instance) is not satisfying the verifier's + * constraints, but in this case it could be possible for the toString() + * method to throw a RuntimeException. + * A (new StringRepresentation(Node n)).toString() never throws any exception. + * Note that this class also serves as a placeholder for more sophisticated message + * handling in future versions of JustIce. + * + * @version $Id$ + * @author Enver Haase + */ +public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor implements Visitor{ + /** The string representation, created by a visitXXX() method, output by toString(). */ + private String tostring; + /** + * Creates a new StringRepresentation object which is the representation of n. + * + * @see #toString() + */ + public StringRepresentation(Node n){ + n.accept(this); + } + /** + * Returns the String representation. + */ + public String toString(){ + return tostring; + } + /** + * Returns the String representation of the Node object obj; + * this is obj.toString() if it does not throw any RuntimeException, + * or else it is a string derived only from obj's class name. + */ + private String toString(Node obj){ + String ret; + try{ + ret = obj.toString(); + } + catch(RuntimeException e){ + String s = obj.getClass().getName(); + s = s.substring(s.lastIndexOf(".")+1); + ret = "<<"+s+">>"; + } + return ret; + } + //////////////////////////////// + // Visitor methods start here // + //////////////////////////////// + // We don't of course need to call some default implementation: + // e.g. we could also simply output "Code" instead of a possibly + // lengthy Code attribute's toString(). + public void visitCode(Code obj){ + //tostring = toString(obj); + tostring = ""; // We don't need real code outputs. + } + public void visitCodeException(CodeException obj){ + tostring = toString(obj); + } + public void visitConstantClass(ConstantClass obj){ + tostring = toString(obj); + } + public void visitConstantDouble(ConstantDouble obj){ + tostring = toString(obj); + } + public void visitConstantFieldref(ConstantFieldref obj){ + tostring = toString(obj); + } + public void visitConstantFloat(ConstantFloat obj){ + tostring = toString(obj); + } + public void visitConstantInteger(ConstantInteger obj){ + tostring = toString(obj); + } + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ + tostring = toString(obj); + } + public void visitConstantLong(ConstantLong obj){ + tostring = toString(obj); + } + public void visitConstantMethodref(ConstantMethodref obj){ + tostring = toString(obj); + } + public void visitConstantNameAndType(ConstantNameAndType obj){ + tostring = toString(obj); + } + public void visitConstantPool(ConstantPool obj){ + tostring = toString(obj); + } + public void visitConstantString(ConstantString obj){ + tostring = toString(obj); + } + public void visitConstantUtf8(ConstantUtf8 obj){ + tostring = toString(obj); + } + public void visitConstantValue(ConstantValue obj){ + tostring = toString(obj); + } + public void visitDeprecated(Deprecated obj){ + tostring = toString(obj); + } + public void visitExceptionTable(ExceptionTable obj){ + tostring = toString(obj); + } + public void visitField(Field obj){ + tostring = toString(obj); + } + public void visitInnerClass(InnerClass obj){ + tostring = toString(obj); + } + public void visitInnerClasses(InnerClasses obj){ + tostring = toString(obj); + } + public void visitJavaClass(JavaClass obj){ + tostring = toString(obj); + } + public void visitLineNumber(LineNumber obj){ + tostring = toString(obj); + } + public void visitLineNumberTable(LineNumberTable obj){ + tostring = ""; + } + public void visitLocalVariable(LocalVariable obj){ + tostring = toString(obj); + } + public void visitLocalVariableTable(LocalVariableTable obj){ + tostring = ""; + } + public void visitMethod(Method obj){ + tostring = toString(obj); + } + public void visitSourceFile(SourceFile obj){ + tostring = toString(obj); + } + public void visitSynthetic(Synthetic obj){ + tostring = toString(obj); + } + public void visitUnknown(Unknown obj){ + tostring = toString(obj); + } +} diff --git a/src/java/org/apache/bcel/verifier/statics/package.html b/src/java/org/apache/bcel/verifier/statics/package.html new file mode 100644 index 00000000..b86c53b9 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/statics/package.html @@ -0,0 +1,26 @@ + + + + + + + +Provides PassVerifier classes used internally by JustIce. You don't need to bother with them. + +

        Package Specification

        + +Contained in this package are PassVerifier classes for use with the JustIce verifier. +Only the passes performing what Sun calls 'static constraints' have PassVerifier classes +here. + +

        Related Documentation

        + +For a simple demonstration of JustIce working, please see: + + + + diff --git a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java new file mode 100644 index 00000000..e59ceb90 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -0,0 +1,466 @@ +package org.apache.bcel.verifier.structurals; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.generic.*; +import org.apache.bcel.verifier.VerifierFactory; +import org.apache.bcel.verifier.exc.*; +import java.util.*; + +/** + * This class represents a control flow graph of a method. + * + * @version $Id$ + * @author Enver Haase + */ +public class ControlFlowGraph{ + + /** + * Objects of this class represent a node in a ControlFlowGraph. + * These nodes are instructions, not basic blocks. + */ + private class InstructionContextImpl implements InstructionContext{ + + /** + * The TAG field is here for external temporary flagging, such + * as graph colouring. + * + * @see #getTag() + * @see #setTag(int) + */ + private int TAG; + + /** + * The InstructionHandle this InstructionContext is wrapped around. + */ + private InstructionHandle instruction; + + /** + * The 'incoming' execution Frames. + */ + private HashMap inFrames; // key: the last-executed JSR + + /** + * The 'outgoing' execution Frames. + */ + private HashMap outFrames; // key: the last-executed JSR + + /** + * The 'execution predecessors' - a list of type InstructionContext + * of those instances that have been execute()d before in that order. + */ + private ArrayList executionPredecessors = null; // Type: InstructionContext + + /** + * Creates an InstructionHandleImpl object from an InstructionHandle. + * Creation of one per InstructionHandle suffices. Don't create more. + */ + public InstructionContextImpl(InstructionHandle inst){ + if (inst == null) throw new AssertionViolatedException("Cannot instantiate InstructionContextImpl from NULL."); + + instruction = inst; + inFrames = new java.util.HashMap(); + outFrames = new java.util.HashMap(); + } + + /* Satisfies InstructionContext.getTag(). */ + public int getTag(){ + return TAG; + } + + /* Satisfies InstructionContext.setTag(int). */ + public void setTag(int tag){ + TAG = tag; + } + + /** + * Returns the exception handlers of this instruction. + */ + public ExceptionHandler[] getExceptionHandlers(){ + return exceptionhandlers.getExceptionHandlers(getInstruction()); + } + + /** + * Returns a clone of the "outgoing" frame situation with respect to the given ExecutionChain. + */ + public Frame getOutFrame(ArrayList execChain){ + executionPredecessors = execChain; + + Frame org; + + InstructionContext jsr = lastExecutionJSR(); + + org = (Frame) outFrames.get(jsr); + + if (org == null){ + throw new AssertionViolatedException("outFrame not set! This:\n"+this+"\nExecutionChain: "+getExecutionChain()+"\nOutFrames: '"+outFrames+"'."); + } + return org.getClone(); + } + + /** + * "Merges in" (vmspec2, page 146) the "incoming" frame situation; + * executes the instructions symbolically + * and therefore calculates the "outgoing" frame situation. + * Returns: True iff the "incoming" frame situation changed after + * merging with "inFrame". + * The execPreds ArrayList must contain the InstructionContext + * objects executed so far in the correct order. This is just + * one execution path [out of many]. This is needed to correctly + * "merge" in the special case of a RET's successor. + * The InstConstraintVisitor and ExecutionVisitor instances + * must be set up correctly. + * @return true - if and only if the "outgoing" frame situation + * changed from the one before execute()ing. + */ + public boolean execute(Frame inFrame, ArrayList execPreds, InstConstraintVisitor icv, ExecutionVisitor ev){ + + executionPredecessors = (ArrayList) execPreds.clone(); + + //sanity check + if ( (lastExecutionJSR() == null) && (subroutines.subroutineOf(getInstruction()) != subroutines.getTopLevel() ) ){ + throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?"); + } + if ( (lastExecutionJSR() != null) && (subroutines.subroutineOf(getInstruction()) == subroutines.getTopLevel() ) ){ + throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?"); + } + + Frame inF = (Frame) inFrames.get(lastExecutionJSR()); + if (inF == null){// no incoming frame was set, so set it. + inFrames.put(lastExecutionJSR(), inFrame); + inF = inFrame; + } + else{// if there was an "old" inFrame + if (inF.equals(inFrame)){ //shortcut: no need to merge equal frames. + return false; + } + if (! mergeInFrames(inFrame)){ + return false; + } + } + + // Now we're sure the inFrame has changed! + + // new inFrame is already merged in, see above. + Frame workingFrame = inF.getClone(); + + try{ + // This verifies the InstructionConstraint for the current + // instruction, but does not modify the workingFrame object. +//InstConstraintVisitor icv = InstConstraintVisitor.getInstance(VerifierFactory.getVerifier(method_gen.getClassName())); + icv.setFrame(workingFrame); + getInstruction().accept(icv); + } + catch(StructuralCodeConstraintException ce){ + ce.extendMessage("","\nInstructionHandle: "+getInstruction()+"\n"); + ce.extendMessage("","\nExecution Frame:\n"+workingFrame); + extendMessageWithFlow(ce); + throw ce; + } + + // This executes the Instruction. + // Therefore the workingFrame object is modified. +//ExecutionVisitor ev = ExecutionVisitor.getInstance(VerifierFactory.getVerifier(method_gen.getClassName())); + ev.setFrame(workingFrame); + getInstruction().accept(ev); + //getInstruction().accept(ExecutionVisitor.withFrame(workingFrame)); + outFrames.put(lastExecutionJSR(), workingFrame); + + return true; // new inFrame was different from old inFrame so merging them + // yielded a different this.inFrame. + } + + /** + * Returns a simple String representation of this InstructionContext. + */ + public String toString(){ + //TODO: Put information in the brackets, e.g. + // Is this an ExceptionHandler? Is this a RET? Is this the start of + // a subroutine? + String ret = getInstruction().toString(false)+"\t[InstructionContext]"; + return ret; + } + + /** + * Does the actual merging (vmspec2, page 146). + * Returns true IFF this.inFrame was changed in course of merging with inFrame. + */ + private boolean mergeInFrames(Frame inFrame){ + // TODO: Can be performance-improved. + Frame inF = (Frame) inFrames.get(lastExecutionJSR()); + OperandStack oldstack = inF.getStack().getClone(); + LocalVariables oldlocals = inF.getLocals().getClone(); + try{ + inF.getStack().merge(inFrame.getStack()); + inF.getLocals().merge(inFrame.getLocals()); + } + catch (StructuralCodeConstraintException sce){ + extendMessageWithFlow(sce); + throw sce; + } + if ( oldstack.equals(inF.getStack()) && + oldlocals.equals(inF.getLocals()) ){ + return false; + } + else{ + return true; + } + } + + /** + * Returns the control flow execution chain. This is built + * while execute(Frame, ArrayList)-ing the code represented + * by the surrounding ControlFlowGraph. + */ + private String getExecutionChain(){ + String s = this.toString(); + for (int i=executionPredecessors.size()-1; i>=0; i--){ + s = executionPredecessors.get(i)+"\n" + s; + } + return s; + } + + + /** + * Extends the StructuralCodeConstraintException ("e") object with an at-the-end-extended message. + * This extended message will then reflect the execution flow needed to get to the constraint + * violation that triggered the throwing of the "e" object. + */ + private void extendMessageWithFlow(StructuralCodeConstraintException e){ + String s = "Execution flow:\n"; + e.extendMessage("", s+getExecutionChain()); + } + + /* + * Fulfils the contract of InstructionContext.getInstruction(). + */ + public InstructionHandle getInstruction(){ + return instruction; + } + + /** + * Returns the InstructionContextImpl with an JSR/JSR_W + * that was last in the ExecutionChain, without + * a corresponding RET, i.e. + * we were called by this one. + * Returns null if we were called from the top level. + */ + private InstructionContextImpl lastExecutionJSR(){ + + int size = executionPredecessors.size(); + int retcount = 0; + + for (int i=size-1; i>=0; i--){ + InstructionContextImpl current = (InstructionContextImpl) (executionPredecessors.get(i)); + Instruction currentlast = current.getInstruction().getInstruction(); + if (currentlast instanceof RET) retcount++; + if (currentlast instanceof JsrInstruction){ + retcount--; + if (retcount == -1) return current; + } + } + return null; + } + + /* Satisfies InstructionContext.getSuccessors(). */ + public InstructionContext[] getSuccessors(){ + return contextsOf(_getSuccessors()); + } + + /** + * A utility method that calculates the successors of a given InstructionHandle + * That means, a RET does have successors as defined here. + * A JsrInstruction has its target as its successor + * (opposed to its physical successor) as defined here. + */ +// TODO: implement caching! + private InstructionHandle[] _getSuccessors(){ + final InstructionHandle[] empty = new InstructionHandle[0]; + final InstructionHandle[] single = new InstructionHandle[1]; + final InstructionHandle[] pair = new InstructionHandle[2]; + + Instruction inst = getInstruction().getInstruction(); + + if (inst instanceof RET){ + Subroutine s = subroutines.subroutineOf(getInstruction()); + if (s==null){ //return empty; // RET in dead code. "empty" would be the correct answer, but we know something about the surrounding project... + throw new AssertionViolatedException("Asking for successors of a RET in dead code?!"); + } +//TODO: remove +throw new AssertionViolatedException("DID YOU REALLY WANT TO ASK FOR RET'S SUCCS?"); +/* + InstructionHandle[] jsrs = s.getEnteringJsrInstructions(); + InstructionHandle[] ret = new InstructionHandle[jsrs.length]; + for (int i=0; i(NOT ORDERED!)
        . + */ + public InstructionContext[] getInstructionContexts(){ + InstructionContext[] ret = new InstructionContext[instructionContexts.values().size()]; + return (InstructionContext[]) instructionContexts.values().toArray(ret); + } + + /** + * Returns true, if and only if the said instruction is not reachable; that means, + * if it not part of this ControlFlowGraph. + */ + public boolean isDead(InstructionHandle i){ + return instructionContexts.containsKey(i); + } +} diff --git a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java new file mode 100644 index 00000000..b05040b3 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java @@ -0,0 +1,93 @@ +package org.apache.bcel.verifier.structurals; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.generic.*; + +/** + * This class represents an exception handler; that is, an ObjectType + * representing a subclass of java.lang.Throwable and the instruction + * the handler starts off (represented by an InstructionContext). + * + * @version $Id$ + * @author Enver Haase + */ +public class ExceptionHandler{ + /** The type of the exception to catch. NULL means ANY. */ + private ObjectType catchtype; + + /** The InstructionHandle where the handling begins. */ + private InstructionHandle handlerpc; + + /** Leave instance creation to JustIce. */ + ExceptionHandler(ObjectType catch_type, InstructionHandle handler_pc){ + catchtype = catch_type; + handlerpc = handler_pc; + } + + /** + * Returns the type of the exception that's handled. 'null' means 'ANY'. + */ + public ObjectType getExceptionType(){ + return catchtype; + } + + /** + * Returns the InstructionHandle where the handler starts off. + */ + public InstructionHandle getHandlerStart(){ + return handlerpc; + } +} diff --git a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java new file mode 100644 index 00000000..ebf95e69 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -0,0 +1,107 @@ +package org.apache.bcel.verifier.structurals; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.generic.*; +import java.util.HashSet; +import java.util.Hashtable; + +/** + * This class allows easy access to ExceptionHandler objects. + * + * @version $Id$ + * @author Enver Haase + */ +public class ExceptionHandlers{ + /** + * The ExceptionHandler instances. + * Key: InstructionHandle objects, Values: HashSet instances. + */ + private Hashtable exceptionhandlers; + + /** + * Constructor. Creates a new ExceptionHandlers instance. + */ + public ExceptionHandlers(MethodGen mg){ + exceptionhandlers = new Hashtable(); + CodeExceptionGen[] cegs = mg.getExceptionHandlers(); + for (int i=0; i. + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.generic.*; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.exc.*; +import java.util.ArrayList; +import java.util.Hashtable; + +/** + * This Visitor class may be used for a type-based Java Virtual Machine + * simulation. + * It does not check for correct types on the OperandStack or in the + * LocalVariables; nor does it check their sizes are sufficiently big. + * Thus, to use this Visitor for bytecode verifying, you have to make sure + * externally that the type constraints of the Java Virtual Machine instructions + * are satisfied. An InstConstraintVisitor may be used for this. + * Anyway, this Visitor does not mandate it. For example, when you + * visitIADD(IADD o), then there are two stack slots popped and one + * stack slot containing a Type.INT is pushed (where you could also + * pop only one slot if you know there are two Type.INT on top of the + * stack). Monitor-specific behaviour is not simulated. + * + *

        Conventions: + * + * Type.VOID will never be pushed onto the stack. Type.DOUBLE and Type.LONG + * that would normally take up two stack slots (like Double_HIGH and + * Double_LOW) are represented by a simple single Type.DOUBLE or Type.LONG + * object on the stack here. + * If a two-slot type is stored into a local variable, the next variable + * is given the type Type.UNKNOWN. + * + * @version $Id$ + * @author Enver Haase + * @see #visitDSTORE(DSTORE o) + * @see InstConstraintVisitor + */ +public class ExecutionVisitor extends EmptyVisitor implements Visitor{ + + /** + * The executionframe we're operating on. + */ + private Frame frame = null; + + /** + * The ConstantPoolGen we're working with. + * @see #setConstantPoolGen(ConstantPoolGen) + */ + private ConstantPoolGen cpg = null; + + /** + * Constructor. Constructs a new instance of this class. + */ + public ExecutionVisitor(){} + + /** + * The OperandStack from the current Frame we're operating on. + * @see #setFrame(Frame) + */ + private OperandStack stack(){ + return frame.getStack(); + } + + /** + * The LocalVariables from the current Frame we're operating on. + * @see #setFrame(Frame) + */ + private LocalVariables locals(){ + return frame.getLocals(); + } + + /** + * Sets the ConstantPoolGen needed for symbolic execution. + */ + public void setConstantPoolGen(ConstantPoolGen cpg){ + this.cpg = cpg; + } + + /** + * The only method granting access to the single instance of + * the ExecutionVisitor class. Before actively using this + * instance, SET THE ConstantPoolGen FIRST. + * @see #setConstantPoolGen(ConstantPoolGen) + */ + public void setFrame(Frame f){ + this.frame = f; + } + + ///** Symbolically executes the corresponding Java Virtual Machine instruction. */ + //public void visitWIDE(WIDE o){ + // The WIDE instruction is modelled as a flag + // of the embedded instructions in BCEL. + // Therefore BCEL checks for possible errors + // when parsing in the .class file: We don't + // have even the possibilty to care for WIDE + // here. + //} + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitAALOAD(AALOAD o){ + stack().pop(); // pop the index int +//System.out.print(stack().peek()); + Type t = stack().pop(); // Pop Array type + if (t == Type.NULL){ + stack().push(Type.NULL); + } // Do nothing stackwise --- a NullPointerException is thrown at Run-Time + else{ + ArrayType at = (ArrayType) t; + stack().push(at.getElementType()); + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitAASTORE(AASTORE o){ + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitACONST_NULL(ACONST_NULL o){ + stack().push(Type.NULL); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitALOAD(ALOAD o){ + stack().push(locals().get(o.getIndex())); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitANEWARRAY(ANEWARRAY o){ + stack().pop(); //count + stack().push( new ArrayType(o.getType(cpg), 1) ); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitARETURN(ARETURN o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitARRAYLENGTH(ARRAYLENGTH o){ + stack().pop(); + stack().push(Type.INT); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitASTORE(ASTORE o){ + locals().set(o.getIndex(), stack().pop()); + //System.err.println("TODO-DEBUG: set LV '"+o.getIndex()+"' to '"+locals().get(o.getIndex())+"'."); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitATHROW(ATHROW o){ + Type t = stack().pop(); + stack().clear(); + if (t.equals(Type.NULL)) + stack().push(Type.getType("Ljava/lang/NullPointerException;")); + else + stack().push(t); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitBALOAD(BALOAD o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitBASTORE(BASTORE o){ + stack().pop(); + stack().pop(); + stack().pop(); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitBIPUSH(BIPUSH o){ + stack().push(Type.INT); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitCALOAD(CALOAD o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitCASTORE(CASTORE o){ + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitCHECKCAST(CHECKCAST o){ + // It's possibly wrong to do so, but SUN's + // ByteCode verifier seems to do (only) this, too. + // TODO: One could use a sophisticated analysis here to check + // if a type cannot possibly be cated to another and by + // so doing predict the ClassCastException at run-time. + stack().pop(); + stack().push(o.getType(cpg)); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitD2F(D2F o){ + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitD2I(D2I o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitD2L(D2L o){ + stack().pop(); + stack().push(Type.LONG); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDADD(DADD o){ + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDALOAD(DALOAD o){ + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDASTORE(DASTORE o){ + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDCMPG(DCMPG o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDCMPL(DCMPL o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDCONST(DCONST o){ + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDDIV(DDIV o){ + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDLOAD(DLOAD o){ + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDMUL(DMUL o){ + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDNEG(DNEG o){ + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDREM(DREM o){ + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDRETURN(DRETURN o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDSTORE(DSTORE o){ + locals().set(o.getIndex(), stack().pop()); + locals().set(o.getIndex()+1, Type.UNKNOWN); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDSUB(DSUB o){ + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDUP(DUP o){ + Type t = stack().pop(); + stack().push(t); + stack().push(t); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDUP_X1(DUP_X1 o){ + Type w1 = stack().pop(); + Type w2 = stack().pop(); + stack().push(w1); + stack().push(w2); + stack().push(w1); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDUP_X2(DUP_X2 o){ + Type w1 = stack().pop(); + Type w2 = stack().pop(); + if (w2.getSize() == 2){ + stack().push(w1); + stack().push(w2); + stack().push(w1); + } + else{ + Type w3 = stack().pop(); + stack().push(w1); + stack().push(w3); + stack().push(w2); + stack().push(w1); + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDUP2(DUP2 o){ + Type t = stack().pop(); + if (t.getSize() == 2){ + stack().push(t); + stack().push(t); + } + else{ // t.getSize() is 1 + Type u = stack().pop(); + stack().push(u); + stack().push(t); + stack().push(u); + stack().push(t); + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDUP2_X1(DUP2_X1 o){ + Type t = stack().pop(); + if (t.getSize() == 2){ + Type u = stack().pop(); + stack().push(t); + stack().push(u); + stack().push(t); + } + else{ //t.getSize() is1 + Type u = stack().pop(); + Type v = stack().pop(); + stack().push(u); + stack().push(t); + stack().push(v); + stack().push(u); + stack().push(t); + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDUP2_X2(DUP2_X2 o){ + Type t = stack().pop(); + if (t.getSize() == 2){ + Type u = stack().pop(); + if (u.getSize() == 2){ + stack().push(t); + stack().push(u); + stack().push(t); + }else{ + Type v = stack().pop(); + stack().push(t); + stack().push(v); + stack().push(u); + stack().push(t); + } + } + else{ //t.getSize() is 1 + Type u = stack().pop(); + Type v = stack().pop(); + if (v.getSize() == 2){ + stack().push(u); + stack().push(t); + stack().push(v); + stack().push(u); + stack().push(t); + }else{ + Type w = stack().pop(); + stack().push(u); + stack().push(t); + stack().push(w); + stack().push(v); + stack().push(u); + stack().push(t); + } + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitF2D(F2D o){ + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitF2I(F2I o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitF2L(F2L o){ + stack().pop(); + stack().push(Type.LONG); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFADD(FADD o){ + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFALOAD(FALOAD o){ + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFASTORE(FASTORE o){ + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFCMPG(FCMPG o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFCMPL(FCMPL o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFCONST(FCONST o){ + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFDIV(FDIV o){ + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFLOAD(FLOAD o){ + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFMUL(FMUL o){ + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFNEG(FNEG o){ + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFREM(FREM o){ + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFRETURN(FRETURN o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFSTORE(FSTORE o){ + locals().set(o.getIndex(), stack().pop()); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFSUB(FSUB o){ + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitGETFIELD(GETFIELD o){ + stack().pop(); + Type t = o.getFieldType(cpg); + if ( t.equals(Type.BOOLEAN) || + t.equals(Type.CHAR) || + t.equals(Type.BYTE) || + t.equals(Type.SHORT) ) + t = Type.INT; + stack().push(t); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitGETSTATIC(GETSTATIC o){ + Type t = o.getFieldType(cpg); + if ( t.equals(Type.BOOLEAN) || + t.equals(Type.CHAR) || + t.equals(Type.BYTE) || + t.equals(Type.SHORT) ) + t = Type.INT; + stack().push(t); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitGOTO(GOTO o){ + // no stack changes. + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitGOTO_W(GOTO_W o){ + // no stack changes. + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitI2B(I2B o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitI2C(I2C o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitI2D(I2D o){ + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitI2F(I2F o){ + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitI2L(I2L o){ + stack().pop(); + stack().push(Type.LONG); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitI2S(I2S o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIADD(IADD o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIALOAD(IALOAD o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIAND(IAND o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIASTORE(IASTORE o){ + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitICONST(ICONST o){ + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIDIV(IDIV o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ACMPEQ(IF_ACMPEQ o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ACMPNE(IF_ACMPNE o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ICMPEQ(IF_ICMPEQ o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ICMPGE(IF_ICMPGE o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ICMPGT(IF_ICMPGT o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ICMPLE(IF_ICMPLE o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ICMPLT(IF_ICMPLT o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ICMPNE(IF_ICMPNE o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFEQ(IFEQ o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFGE(IFGE o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFGT(IFGT o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFLE(IFLE o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFLT(IFLT o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFNE(IFNE o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFNONNULL(IFNONNULL o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFNULL(IFNULL o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIINC(IINC o){ + // stack is not changed. + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitILOAD(ILOAD o){ + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIMUL(IMUL o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitINEG(INEG o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitINSTANCEOF(INSTANCEOF o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ + stack().pop(); //objectref + for (int i=0; i. + */ + +import org.apache.bcel.generic.*; +import org.apache.bcel.verifier.exc.*; +import java.util.ArrayList; + +/** + * This class represents a JVM execution frame; that means, + * a local variable array and an operand stack. + * + * @version $Id$ + * @author Enver Haase + */ + +public class Frame{ + + /** + * For instance initialization methods, it is important to remember + * which instance it is that is not initialized yet. It will be + * initialized invoking another constructor later. + * NULL means the instance already *is* initialized. + */ + protected static UninitializedObjectType _this; + + /** + * + */ + private LocalVariables locals; + + /** + * + */ + private OperandStack stack; + + /** + * + */ + public Frame(int maxLocals, int maxStack){ + locals = new LocalVariables(maxLocals); + stack = new OperandStack(maxStack); + } + + /** + * + */ + public Frame(LocalVariables locals, OperandStack stack){ + this.locals = locals; + this.stack = stack; + } + + /** + * + */ + protected Object clone(){ + Frame f = new Frame(locals.getClone(), stack.getClone()); + return f; + } + + /** + * + */ + public Frame getClone(){ + return (Frame) clone(); + } + + /** + * + */ + public LocalVariables getLocals(){ + return locals; + } + + /** + * + */ + public OperandStack getStack(){ + return stack; + } + + /** + * + */ + public boolean equals(Object o){ + if (!(o instanceof Frame)) return false; // implies "null" is non-equal. + Frame f = (Frame) o; + return this.stack.equals(f.stack) && this.locals.equals(f.locals); + } + + /** + * Returns a String representation of the Frame instance. + */ + public String toString(){ + String s="Local Variables:\n"; + s += locals; + s += "OperandStack:\n"; + s += stack; + return s; + } +} diff --git a/src/java/org/apache/bcel/verifier/structurals/GenericArray.java b/src/java/org/apache/bcel/verifier/structurals/GenericArray.java new file mode 100644 index 00000000..30cdafe6 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/structurals/GenericArray.java @@ -0,0 +1,66 @@ +package org.apache.bcel.verifier.structurals; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * A placeholder class that can be used to create an ObjectType of which + * has some of the properties arrays have. They implement java.lang.Cloneable + * and java.io.Serializable and they extend java.lang.Object. + * + * @version $Id$ + * @author Enver Haase + */ +public class GenericArray extends java.lang.Object implements java.lang.Cloneable, java.io.Serializable{ +} diff --git a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java new file mode 100644 index 00000000..05c999ad --- /dev/null +++ b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -0,0 +1,2652 @@ +package org.apache.bcel.verifier.structurals; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.generic.*; +import org.apache.bcel.verifier.*; +import org.apache.bcel.verifier.exc.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Hashtable; + +/** + * A Visitor class testing for valid preconditions of JVM instructions. + * The instance of this class will throw a StructuralCodeConstraintException + * instance if an instruction is visitXXX()ed which has preconditions that are + * not satisfied. + * TODO: Currently, the JVM's behaviour concerning monitors (MONITORENTER, + * MONITOREXIT) is not modeled in JustIce. + * + * @version $Id$ + * @author Enver Haase + * @see org.apache.bcel.verifier.exc.StructuralCodeConstraintException + * @see org.apache.bcel.verifier.exc.LinkingConstraintException + */ +public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bcel.generic.Visitor{ + + private static ObjectType GENERIC_ARRAY = new ObjectType("org.apache.bcel.verifier.structurals.GenericArray"); + + /** + * The constructor. Constructs a new instance of this class. + */ + public InstConstraintVisitor(){} + + /** + * The Execution Frame we're working on. + * + * @see #setFrame(Frame f) + * @see #locals() + * @see #stack() + */ + private Frame frame = null; + + /** + * The ConstantPoolGen we're working on. + * + * @see #setConstantPoolGen(ConstantPoolGen cpg) + */ + private ConstantPoolGen cpg = null; + + /** + * The MethodGen we're working on. + * + * @see #setMethodGen(MethodGen mg) + */ + private MethodGen mg = null; + + /** + * The OperandStack we're working on. + * + * @see #setFrame(Frame f) + */ + private OperandStack stack(){ + return frame.getStack(); + } + + /** + * The LocalVariables we're working on. + * + * @see #setFrame(Frame f) + */ + private LocalVariables locals(){ + return frame.getLocals(); + } + + /** + * This method is called by the visitXXX() to notify the acceptor of this InstConstraintVisitor + * that a constraint violation has occured. This is done by throwing an instance of a + * StructuralCodeConstraintException. + * @throws org.apache.bcel.verifier.exc.StructuralCodeConstraintException always. + */ + private void constraintViolated(Instruction violator, String description){ + String fq_classname = violator.getClass().getName(); + throw new StructuralCodeConstraintException("Instruction "+ fq_classname.substring(fq_classname.lastIndexOf('.')+1) +" constraint violated: " + description); + } + + /** + * This returns the single instance of the InstConstraintVisitor class. + * To operate correctly, other values must have been set before actually + * using the instance. + * Use this method for performance reasons. + * + * @see #setConstantPoolGen(ConstantPoolGen cpg) + * @see #setMethodGen(MethodGen mg) + */ + public void setFrame(Frame f){ + this.frame = f; + //if (singleInstance.mg == null || singleInstance.cpg == null) throw new AssertionViolatedException("Forgot to set important values first."); + } + + /** + * Sets the ConstantPoolGen instance needed for constraint + * checking prior to execution. + */ + public void setConstantPoolGen(ConstantPoolGen cpg){ + this.cpg = cpg; + } + + /** + * Sets the MethodGen instance needed for constraint + * checking prior to execution. + */ + public void setMethodGen(MethodGen mg){ + this.mg = mg; + } + + /** + * Assures index is of type INT. + * @throws org.apache.bcel.verifier.exc.StructuralCodeConstraintException if the above constraint is not satisfied. + */ + private void indexOfInt(Instruction o, Type index){ + if (! index.equals(Type.INT)) + constraintViolated(o, "The 'index' is not of type int but of type "+index+"."); + } + + /** + * Assures the ReferenceType r is initialized (or Type.NULL). + * Formally, this means (!(r instanceof UninitializedObjectType)), because + * there are no uninitialized array types. + * @throws org.apache.bcel.verifier.exc.StructuralCodeConstraintException if the above constraint is not satisfied. + */ + private void referenceTypeIsInitialized(Instruction o, ReferenceType r){ + if (r instanceof UninitializedObjectType){ + constraintViolated(o, "Working on an uninitialized object '"+r+"'."); + } + } + + /** Assures value is of type INT. */ + private void valueOfInt(Instruction o, Type value){ + if (! value.equals(Type.INT)) + constraintViolated(o, "The 'value' is not of type int but of type "+value+"."); + } + + /** + * Assures arrayref is of ArrayType or NULL; + * returns true if and only if arrayref is non-NULL. + * @throws org.apache.bcel.verifier.exc.StructuralCodeConstraintException if the above constraint is violated. + */ + private boolean arrayrefOfArrayType(Instruction o, Type arrayref){ + if (! ((arrayref instanceof ArrayType) || arrayref.equals(Type.NULL)) ) + constraintViolated(o, "The 'arrayref' does not refer to an array but is of type "+arrayref+"."); + return (arrayref instanceof ArrayType); + } + + /***************************************************************/ + /* MISC */ + /***************************************************************/ + /** + * Ensures the general preconditions of an instruction that accesses the stack. + * This method is here because BCEL has no such superinterface for the stack + * accessing instructions; and there are funny unexpected exceptions in the + * semantices of the superinterfaces and superclasses provided. + * E.g. SWAP is a StackConsumer, but DUP_X1 is not a StackProducer. + * Therefore, this method is called by all StackProducer, StackConsumer, + * and StackInstruction instances via their visitXXX() method. + * Unfortunately, as the superclasses and superinterfaces overlap, some instructions + * cause this method to be called two or three times. [TODO: Fix this.] + * + * @see #visitStackConsumer(StackConsumer o) + * @see #visitStackProducer(StackProducer o) + * @see #visitStackInstruction(StackInstruction o) + */ + private void _visitStackAccessor(Instruction o){ + int consume = o.consumeStack(cpg); // Stack values are always consumed first; then produced. + if (consume > stack().slotsUsed()){ + constraintViolated((Instruction) o, "Cannot consume "+consume+" stack slots: only "+stack().slotsUsed()+" slot(s) left on stack!\nStack:\n"+stack()); + } + + int produce = o.produceStack(cpg) - ((Instruction) o).consumeStack(cpg); // Stack values are always consumed first; then produced. + if ( produce + stack().slotsUsed() > stack().maxStack() ){ + constraintViolated((Instruction) o, "Cannot produce "+produce+" stack slots: only "+(stack().maxStack()-stack().slotsUsed())+" free stack slot(s) left.\nStack:\n"+stack()); + } + } + + /***************************************************************/ + /* "generic"visitXXXX methods where XXXX is an interface */ + /* therefore, we don't know the order of visiting; but we know */ + /* these methods are called before the visitYYYY methods below */ + /***************************************************************/ + + /** + * Assures the generic preconditions of a LoadClass instance. + * The referenced class is loaded and pass2-verified. + */ + public void visitLoadClass(LoadClass o){ + ObjectType t = o.getLoadClassType(cpg); + if (t != null){// null means "no class is loaded" + Verifier v = VerifierFactory.getVerifier(t.getClassName()); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + } + + /** + * Ensures the general preconditions of a StackConsumer instance. + */ + public void visitStackConsumer(StackConsumer o){ + _visitStackAccessor((Instruction) o); + } + + /** + * Ensures the general preconditions of a StackProducer instance. + */ + public void visitStackProducer(StackProducer o){ + _visitStackAccessor((Instruction) o); + } + + + /***************************************************************/ + /* "generic" visitYYYY methods where YYYY is a superclass. */ + /* therefore, we know the order of visiting; we know */ + /* these methods are called after the visitXXXX methods above. */ + /***************************************************************/ + /** + * Ensures the general preconditions of a CPInstruction instance. + */ + public void visitCPInstruction(CPInstruction o){ + int idx = o.getIndex(); + if ((idx < 0) || (idx >= cpg.getSize())){ + throw new AssertionViolatedException("Huh?! Constant pool index of instruction '"+o+"' illegal? Pass 3a should have checked this!"); + } + } + + /** + * Ensures the general preconditions of a FieldInstruction instance. + */ + public void visitFieldInstruction(FieldInstruction o){ + // visitLoadClass(o) has been called before: Every FieldOrMethod + // implements LoadClass. + // visitCPInstruction(o) has been called before. + // A FieldInstruction may be: GETFIELD, GETSTATIC, PUTFIELD, PUTSTATIC + Constant c = cpg.getConstant(o.getIndex()); + if (!(c instanceof ConstantFieldref)){ + constraintViolated(o, "Index '"+o.getIndex()+"' should refer to a CONSTANT_Fieldref_info structure, but refers to '"+c+"'."); + } + // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). + Type t = o.getType(cpg); + if (t instanceof ObjectType){ + String name = ((ObjectType)t).getClassName(); + Verifier v = VerifierFactory.getVerifier( name ); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + } + + /** + * Ensures the general preconditions of an InvokeInstruction instance. + */ + public void visitInvokeInstruction(InvokeInstruction o){ + // visitLoadClass(o) has been called before: Every FieldOrMethod + // implements LoadClass. + // visitCPInstruction(o) has been called before. +//TODO + } + + /** + * Ensures the general preconditions of a StackInstruction instance. + */ + public void visitStackInstruction(StackInstruction o){ + _visitStackAccessor(o); + } + + /** + * Assures the generic preconditions of a LocalVariableInstruction instance. + * That is, the index of the local variable must be valid. + */ + public void visitLocalVariableInstruction(LocalVariableInstruction o){ + if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ + constraintViolated(o, "The 'index' is not a valid index into the local variable array."); + } + } + + /** + * Assures the generic preconditions of a LoadInstruction instance. + */ + public void visitLoadInstruction(LoadInstruction o){ + //visitLocalVariableInstruction(o) is called before, because it is more generic. + + // LOAD instructions must not read Type.UNKNOWN + if (locals().get(o.getIndex()) == Type.UNKNOWN){ + constraintViolated(o, "Read-Access on local variable "+o.getIndex()+" with unknown content."); + } + + // LOAD instructions, two-slot-values at index N must have Type.UNKNOWN + // as a symbol for the higher halve at index N+1 + // [suppose some instruction put an int at N+1--- our double at N is defective] + if (o.getType(cpg).getSize() == 2){ + if (locals().get(o.getIndex()+1) != Type.UNKNOWN){ + constraintViolated(o, "Reading a two-locals value from local variables "+o.getIndex()+" and "+(o.getIndex()+1)+" where the latter one is destroyed."); + } + } + + // LOAD instructions must read the correct type. + if (!(o instanceof ALOAD)){ + if (locals().get(o.getIndex()) != o.getType(cpg) ){ + constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+locals().get(o.getIndex())+"'; Instruction type: '"+o.getType(cpg)+"'."); + } + } + else{ // we deal with an ALOAD + if (!(locals().get(o.getIndex()) instanceof ReferenceType)){ + constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+locals().get(o.getIndex())+"'; Instruction expects a ReferenceType."); + } + // ALOAD __IS ALLOWED__ to put uninitialized objects onto the stack! + //referenceTypeIsInitialized(o, (ReferenceType) (locals().get(o.getIndex()))); + } + + // LOAD instructions must have enough free stack slots. + if ((stack().maxStack() - stack().slotsUsed()) < o.getType(cpg).getSize()){ + constraintViolated(o, "Not enough free stack slots to load a '"+o.getType(cpg)+"' onto the OperandStack."); + } + } + + /** + * Assures the generic preconditions of a StoreInstruction instance. + */ + public void visitStoreInstruction(StoreInstruction o){ + //visitLocalVariableInstruction(o) is called before, because it is more generic. + + if (stack().isEmpty()){ // Don't bother about 1 or 2 stack slots used. This check is implicitely done below while type checking. + constraintViolated(o, "Cannot STORE: Stack to read from is empty."); + } + + if ( (!(o instanceof ASTORE)) ){ + if (! (stack().peek() == o.getType(cpg)) ){// the other xSTORE types are singletons in BCEL. + constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction type: '"+o.getType(cpg)+"'."); + } + } + else{ // we deal with ASTORE + Type stacktop = stack().peek(); + if ( (!(stacktop instanceof ReferenceType)) && (!(stacktop instanceof ReturnaddressType)) ){ + constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction expects a ReferenceType or a ReturnadressType."); + } + if (stacktop instanceof ReferenceType){ + referenceTypeIsInitialized(o, (ReferenceType) stacktop); + } + } + } + + /** + * Assures the generic preconditions of a ReturnInstruction instance. + */ + public void visitReturnInstruction(ReturnInstruction o){ + if (o instanceof RETURN){ + return; + } + if (o instanceof ARETURN){ + if (stack().peek() == Type.NULL){ + return; + } + else{ + if (! (stack().peek() instanceof ReferenceType)){ + constraintViolated(o, "Reference type expected on top of stack, but is: '"+stack().peek()+"'."); + } + referenceTypeIsInitialized(o, (ReferenceType) (stack().peek())); + ReferenceType objectref = (ReferenceType) (stack().peek()); + // TODO: This can only be checked if using Staerk-et-al's "set of object types" instead of a + // "wider cast object type" created during verification. + //if (! (objectref.isAssignmentCompatibleWith(mg.getType())) ){ + // constraintViolated(o, "Type on stack top which should be returned is a '"+stack().peek()+"' which is not assignment compatible with the return type of this method, '"+mg.getType()+"'."); + //} + } + } + else{ + Type method_type = mg.getType(); + if (method_type == Type.BOOLEAN || + method_type == Type.BYTE || + method_type == Type.SHORT || + method_type == Type.CHAR){ + method_type = Type.INT; + } + if (! ( method_type.equals( stack().peek() ))){ + constraintViolated(o, "Current method has return type of '"+mg.getType()+"' expecting a '"+method_type+"' on top of the stack. But stack top is a '"+stack().peek()+"'."); + } + } + } + + /***************************************************************/ + /* "special"visitXXXX methods for one type of instruction each */ + /***************************************************************/ + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitAALOAD(AALOAD o){ + Type arrayref = stack().peek(1); + Type index = stack().peek(0); + + indexOfInt(o, index); + if (arrayrefOfArrayType(o, arrayref)){ + if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); + } + referenceTypeIsInitialized(o, (ReferenceType) (((ArrayType) arrayref).getElementType())); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitAASTORE(AASTORE o){ + Type arrayref = stack().peek(2); + Type index = stack().peek(1); + Type value = stack().peek(0); + + indexOfInt(o, index); + if (!(value instanceof ReferenceType)){ + constraintViolated(o, "The 'value' is not of a ReferenceType but of type "+value+"."); + }else{ + referenceTypeIsInitialized(o, (ReferenceType) value); + } + // Don't bother further with "referenceTypeIsInitialized()", there are no arrays + // of an uninitialized object type. + if (arrayrefOfArrayType(o, arrayref)){ + if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); + } + if (! ((ReferenceType)value).isAssignmentCompatibleWith((ReferenceType) ((ArrayType) arrayref).getElementType())){ + constraintViolated(o, "The type of 'value' ('"+value+"') is not assignment compatible to the components of the array 'arrayref' refers to. ('"+((ArrayType) arrayref).getElementType()+"')"); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitACONST_NULL(ACONST_NULL o){ + // Nothing needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitALOAD(ALOAD o){ + //visitLoadInstruction(LoadInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitANEWARRAY(ANEWARRAY o){ + if (!stack().peek().equals(Type.INT)) + constraintViolated(o, "The 'count' at the stack top is not of type '"+Type.INT+"' but of type '"+stack().peek()+"'."); + // The runtime constant pool item at that index must be a symbolic reference to a class, + // array, or interface type. See Pass 3a. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitARETURN(ARETURN o){ + if (! (stack().peek() instanceof ReferenceType) ){ + constraintViolated(o, "The 'objectref' at the stack top is not of a ReferenceType but of type '"+stack().peek()+"'."); + } + ReferenceType objectref = (ReferenceType) (stack().peek()); + referenceTypeIsInitialized(o, objectref); + + // The check below should already done via visitReturnInstruction(ReturnInstruction), see there. + // It cannot be done using Staerk-et-al's "set of object types" instead of a + // "wider cast object type", anyway. + //if (! objectref.isAssignmentCompatibleWith(mg.getReturnType() )){ + // constraintViolated(o, "The 'objectref' type "+objectref+" at the stack top is not assignment compatible with the return type '"+mg.getReturnType()+"' of the method."); + //} + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitARRAYLENGTH(ARRAYLENGTH o){ + Type arrayref = stack().peek(0); + arrayrefOfArrayType(o, arrayref); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitASTORE(ASTORE o){ + if (! ( (stack().peek() instanceof ReferenceType) || (stack().peek() instanceof ReturnaddressType) ) ){ + constraintViolated(o, "The 'objectref' is not of a ReferenceType or of ReturnaddressType but of "+stack().peek()+"."); + } + if (stack().peek() instanceof ReferenceType){ + referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitATHROW(ATHROW o){ + // It's stated that 'objectref' must be of a ReferenceType --- but since Throwable is + // not derived from an ArrayType, it follows that 'objectref' must be of an ObjectType or Type.NULL. + if (! ((stack().peek() instanceof ObjectType) || (stack().peek().equals(Type.NULL))) ){ + constraintViolated(o, "The 'objectref' is not of an (initialized) ObjectType but of type "+stack().peek()+"."); + } + + // NULL is a subclass of every class, so to speak. + if (stack().peek().equals(Type.NULL)) return; + + ObjectType exc = (ObjectType) (stack().peek()); + ObjectType throwable = (ObjectType) (Type.getType("Ljava/lang/Throwable;")); + if ( (! (exc.subclassOf(throwable)) ) && (! (exc.equals(throwable))) ){ + constraintViolated(o, "The 'objectref' is not of class Throwable or of a subclass of Throwable, but of '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitBALOAD(BALOAD o){ + Type arrayref = stack().peek(1); + Type index = stack().peek(0); + indexOfInt(o, index); + if (arrayrefOfArrayType(o, arrayref)){ + if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || + (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ){ + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitBASTORE(BASTORE o){ + Type arrayref = stack().peek(2); + Type index = stack().peek(1); + Type value = stack().peek(0); + + indexOfInt(o, index); + valueOfInt(o, index); + if (arrayrefOfArrayType(o, arrayref)){ + if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || + (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ) + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitBIPUSH(BIPUSH o){ + // Nothing to do... + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitBREAKPOINT(BREAKPOINT o){ + throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as BREAKPOINT."); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitCALOAD(CALOAD o){ + Type arrayref = stack().peek(1); + Type index = stack().peek(0); + + indexOfInt(o, index); + arrayrefOfArrayType(o, arrayref); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitCASTORE(CASTORE o){ + Type arrayref = stack().peek(2); + Type index = stack().peek(1); + Type value = stack().peek(0); + + indexOfInt(o, index); + valueOfInt(o, index); + if (arrayrefOfArrayType(o, arrayref)){ + if (! ((ArrayType) arrayref).getElementType().equals(Type.CHAR) ){ + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of type char but to an array of type "+((ArrayType) arrayref).getElementType()+"."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitCHECKCAST(CHECKCAST o){ + // The objectref must be of type reference. + Type objectref = stack().peek(0); + if (!(objectref instanceof ReferenceType)){ + constraintViolated(o, "The 'objectref' is not of a ReferenceType but of type "+objectref+"."); + } + else{ + referenceTypeIsInitialized(o, (ReferenceType) objectref); + } + // The unsigned indexbyte1 and indexbyte2 are used to construct an index into the runtime constant pool of the + // current class (§3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant + // pool item at the index must be a symbolic reference to a class, array, or interface type. + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantClass)){ + constraintViolated(o, "The Constant at 'index' is not a ConstantClass, but '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitD2F(D2F o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitD2I(D2I o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitD2L(D2L o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDADD(DADD o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDALOAD(DALOAD o){ + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type double[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.DOUBLE){ + constraintViolated(o, "Stack next-to-top must be of type double[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDASTORE(DASTORE o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type double[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.DOUBLE){ + constraintViolated(o, "Stack next-to-next-to-top must be of type double[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDCMPG(DCMPG o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDCMPL(DCMPL o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDCONST(DCONST o){ + // There's nothing to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDDIV(DDIV o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDLOAD(DLOAD o){ + //visitLoadInstruction(LoadInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDMUL(DMUL o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDNEG(DNEG o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDREM(DREM o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDRETURN(DRETURN o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDSTORE(DSTORE o){ + //visitStoreInstruction(StoreInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDSUB(DSUB o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDUP(DUP o){ + if (stack().peek().getSize() != 1){ + constraintViolated(o, "Won't DUP type on stack top '"+stack().peek()+"' because it must occupy exactly one slot, not '"+stack().peek().getSize()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDUP_X1(DUP_X1 o){ + if (stack().peek().getSize() != 1){ + constraintViolated(o, "Type on stack top '"+stack().peek()+"' should occupy exactly one slot, not '"+stack().peek().getSize()+"'."); + } + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "Type on stack next-to-top '"+stack().peek(1)+"' should occupy exactly one slot, not '"+stack().peek(1).getSize()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDUP_X2(DUP_X2 o){ + if (stack().peek().getSize() != 1){ + constraintViolated(o, "Stack top type must be of size 1, but is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); + } + if (stack().peek(1).getSize() == 2){ + return; // Form 2, okay. + } + else{ //stack().peek(1).getSize == 1. + if (stack().peek(2).getSize() != 1){ + constraintViolated(o, "If stack top's size is 1 and stack next-to-top's size is 1, stack next-to-next-to-top's size must also be 1, but is: '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDUP2(DUP2 o){ + if (stack().peek().getSize() == 2){ + return; // Form 2, okay. + } + else{ //stack().peek().getSize() == 1. + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDUP2_X1(DUP2_X1 o){ + if (stack().peek().getSize() == 2){ + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "If stack top's size is 2, then stack next-to-top's size must be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); + } + else{ + return; // Form 2 + } + } + else{ // stack top is of size 1 + if ( stack().peek(1).getSize() != 1 ){ + constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); + } + if ( stack().peek(2).getSize() != 1 ){ + constraintViolated(o, "If stack top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDUP2_X2(DUP2_X2 o){ + + if (stack().peek(0).getSize() == 2){ + if (stack().peek(1).getSize() == 2){ + return; // Form 4 + } + else{// stack top size is 2, next-to-top's size is 1 + if ( stack().peek(2).getSize() != 1 ){ + constraintViolated(o, "If stack top's size is 2 and stack-next-to-top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + } + else{ + return; // Form 2 + } + } + } + else{// stack top is of size 1 + if (stack().peek(1).getSize() == 1){ + if ( stack().peek(2).getSize() == 2 ){ + return; // Form 3 + } + else{ + if ( stack().peek(3).getSize() == 1){ + return; // Form 1 + } + } + } + } + constraintViolated(o, "The operand sizes on the stack do not match any of the four forms of usage of this instruction."); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitF2D(F2D o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitF2I(F2I o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitF2L(F2L o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFADD(FADD o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFALOAD(FALOAD o){ + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type float[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.FLOAT){ + constraintViolated(o, "Stack next-to-top must be of type float[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFASTORE(FASTORE o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type float[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.FLOAT){ + constraintViolated(o, "Stack next-to-next-to-top must be of type float[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFCMPG(FCMPG o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFCMPL(FCMPL o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFCONST(FCONST o){ + // nothing to do here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFDIV(FDIV o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFLOAD(FLOAD o){ + //visitLoadInstruction(LoadInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFMUL(FMUL o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFNEG(FNEG o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFREM(FREM o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFRETURN(FRETURN o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFSTORE(FSTORE o){ + //visitStoreInstruction(StoreInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFSUB(FSUB o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitGETFIELD(GETFIELD o){ + Type objectref = stack().peek(); + if (! ( (objectref instanceof ObjectType) || (objectref == Type.NULL) ) ){ + constraintViolated(o, "Stack top should be an object reference that's not an array reference, but is '"+objectref+"'."); + } + + String field_name = o.getFieldName(cpg); + + JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + Field[] fields = jc.getFields(); + Field f = null; + for (int i=0; i=0; i--){ + Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 + Type fromDesc = argtypes[i]; + if (fromDesc == Type.BOOLEAN || + fromDesc == Type.BYTE || + fromDesc == Type.CHAR || + fromDesc == Type.SHORT){ + fromDesc = Type.INT; + } + if (! fromStack.equals(fromDesc)){ + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + ReferenceType rFromStack = (ReferenceType) fromStack; + ReferenceType rFromDesc = (ReferenceType) fromDesc; + // TODO: This can only be checked when using Staerk-et-al's "set of object types" + // instead of a "wider cast object type" created during verification. + //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + //} + } + else{ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); + } + } + } + + Type objref = stack().peek(nargs); + if (objref == Type.NULL){ + return; + } + if (! (objref instanceof ReferenceType) ){ + constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); + } + referenceTypeIsInitialized(o, (ReferenceType) objref); + if (!(objref instanceof ObjectType)){ + if (!(objref instanceof ArrayType)){ + constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType + } + else{ + objref = GENERIC_ARRAY; + } + } + + String objref_classname = ((ObjectType) objref).getClassName(); + + String theInterface = o.getClassName(cpg); + + // TODO: This can only be checked if we're using Staerk-et-al's "set of object types" + // instead of "wider cast object types" generated during verification. + //if ( ! Repository.implementationOf(objref_classname, theInterface) ){ + // constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theInterface+"' as expected."); + //} + + int counted_count = 1; // 1 for the objectref + for (int i=0; i=0; i--){ + Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 + Type fromDesc = argtypes[i]; + if (fromDesc == Type.BOOLEAN || + fromDesc == Type.BYTE || + fromDesc == Type.CHAR || + fromDesc == Type.SHORT){ + fromDesc = Type.INT; + } + if (! fromStack.equals(fromDesc)){ + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + ReferenceType rFromStack = (ReferenceType) fromStack; + ReferenceType rFromDesc = (ReferenceType) fromDesc; + // TODO: This can only be checked using Staerk-et-al's "set of object types", not + // using a "wider cast object type". + //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + //} + } + else{ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); + } + } + } + + Type objref = stack().peek(nargs); + if (objref == Type.NULL){ + return; + } + if (! (objref instanceof ReferenceType) ){ + constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); + } + String objref_classname = null; + if ( !(o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME))){ + referenceTypeIsInitialized(o, (ReferenceType) objref); + if (!(objref instanceof ObjectType)){ + if (!(objref instanceof ArrayType)){ + constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType + } + else{ + objref = GENERIC_ARRAY; + } + } + + objref_classname = ((ObjectType) objref).getClassName(); + } + else{ + if (!(objref instanceof UninitializedObjectType)){ + constraintViolated(o, "Expecting an UninitializedObjectType as 'objectref' on the stack, not a '"+objref+"'. Otherwise, you couldn't invoke a method since an array has no methods (not to speak of a return address)."); + } + objref_classname = ((UninitializedObjectType) objref).getInitialized().getClassName(); + } + + + String theClass = o.getClassName(cpg); + if ( ! Repository.instanceOf(objref_classname, theClass) ){ + constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); + } + + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitINVOKESTATIC(INVOKESTATIC o){ + // Method is not native, otherwise pass 3 would not happen. + + Type t = o.getType(cpg); + if (t instanceof ObjectType){ + String name = ((ObjectType)t).getClassName(); + Verifier v = VerifierFactory.getVerifier( name ); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + + Type[] argtypes = o.getArgumentTypes(cpg); + int nargs = argtypes.length; + + for (int i=nargs-1; i>=0; i--){ + Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 + Type fromDesc = argtypes[i]; + if (fromDesc == Type.BOOLEAN || + fromDesc == Type.BYTE || + fromDesc == Type.CHAR || + fromDesc == Type.SHORT){ + fromDesc = Type.INT; + } + if (! fromStack.equals(fromDesc)){ + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + ReferenceType rFromStack = (ReferenceType) fromStack; + ReferenceType rFromDesc = (ReferenceType) fromDesc; + // TODO: This check can only be done using Staerk-et-al's "set of object types" + // instead of a "wider cast object type" created during verification. + //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + //} + } + else{ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); + } + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ + // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). + + Type t = o.getType(cpg); + if (t instanceof ObjectType){ + String name = ((ObjectType)t).getClassName(); + Verifier v = VerifierFactory.getVerifier( name ); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + + + Type[] argtypes = o.getArgumentTypes(cpg); + int nargs = argtypes.length; + + for (int i=nargs-1; i>=0; i--){ + Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 + Type fromDesc = argtypes[i]; + if (fromDesc == Type.BOOLEAN || + fromDesc == Type.BYTE || + fromDesc == Type.CHAR || + fromDesc == Type.SHORT){ + fromDesc = Type.INT; + } + if (! fromStack.equals(fromDesc)){ + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + ReferenceType rFromStack = (ReferenceType) fromStack; + ReferenceType rFromDesc = (ReferenceType) fromDesc; + // TODO: This can only be checked when using Staerk-et-al's "set of object types" instead + // of a single "wider cast object type" created during verification. + //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + //} + } + else{ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); + } + } + } + + Type objref = stack().peek(nargs); + if (objref == Type.NULL){ + return; + } + if (! (objref instanceof ReferenceType) ){ + constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); + } + referenceTypeIsInitialized(o, (ReferenceType) objref); + if (!(objref instanceof ObjectType)){ + if (!(objref instanceof ArrayType)){ + constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType + } + else{ + objref = GENERIC_ARRAY; + } + } + + String objref_classname = ((ObjectType) objref).getClassName(); + + String theClass = o.getClassName(cpg); + + if ( ! Repository.instanceOf(objref_classname, theClass) ){ + constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitIOR(IOR o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitIREM(IREM o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitIRETURN(IRETURN o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitISHL(ISHL o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitISHR(ISHR o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitISTORE(ISTORE o){ + //visitStoreInstruction(StoreInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitISUB(ISUB o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitIUSHR(IUSHR o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitIXOR(IXOR o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitJSR(JSR o){ + // nothing to do here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitJSR_W(JSR_W o){ + // nothing to do here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitL2D(L2D o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitL2F(L2F o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitL2I(L2I o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLADD(LADD o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLALOAD(LALOAD o){ + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type long[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.LONG){ + constraintViolated(o, "Stack next-to-top must be of type long[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLAND(LAND o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLASTORE(LASTORE o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type long[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.LONG){ + constraintViolated(o, "Stack next-to-next-to-top must be of type long[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLCMP(LCMP o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLCONST(LCONST o){ + // Nothing to do here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLDC(LDC o){ + // visitCPInstruction is called first. + + Constant c = cpg.getConstant(o.getIndex()); + if (! ( ( c instanceof ConstantInteger) || + ( c instanceof ConstantFloat ) || + ( c instanceof ConstantString ) ) ){ + constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLDC_W(LDC_W o){ + // visitCPInstruction is called first. + + Constant c = cpg.getConstant(o.getIndex()); + if (! ( ( c instanceof ConstantInteger) || + ( c instanceof ConstantFloat ) || + ( c instanceof ConstantString ) ) ){ + constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLDC2_W(LDC2_W o){ + // visitCPInstruction is called first. + + Constant c = cpg.getConstant(o.getIndex()); + if (! ( ( c instanceof ConstantLong) || + ( c instanceof ConstantDouble ) ) ){ + constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLDIV(LDIV o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLLOAD(LLOAD o){ + //visitLoadInstruction(LoadInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLMUL(LMUL o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLNEG(LNEG o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + // See also pass 3a. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLOR(LOR o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLREM(LREM o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLRETURN(LRETURN o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLSHL(LSHL o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLSHR(LSHR o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLSTORE(LSTORE o){ + //visitStoreInstruction(StoreInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLSUB(LSUB o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLUSHR(LUSHR o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLXOR(LXOR o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitMONITORENTER(MONITORENTER o){ + if (! ((stack().peek()) instanceof ReferenceType)){ + constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); + } + referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitMONITOREXIT(MONITOREXIT o){ + if (! ((stack().peek()) instanceof ReferenceType)){ + constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); + } + referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitMULTIANEWARRAY(MULTIANEWARRAY o){ + int dimensions = o.getDimensions(); + // Dimensions argument is okay: see Pass 3a. + for (int i=0; i, see Pass 3a. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitRET(RET o){ + if (! (locals().get(o.getIndex()) instanceof ReturnaddressType)){ + constraintViolated(o, "Expecting a ReturnaddressType in local variable "+o.getIndex()+"."); + } + if (locals().get(o.getIndex()) == ReturnaddressType.NO_TARGET){ + throw new AssertionViolatedException("Oops: RET expecting a target!"); + } + // Other constraints such as non-allowed overlapping subroutines are enforced + // while building the Subroutines data structure. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitRETURN(RETURN o){ + if (mg.getName().equals(Constants.CONSTRUCTOR_NAME)){// If we leave an method + if ((frame._this != null) && (!(mg.getClassName().equals(Type.OBJECT.getClassName()))) ) { + constraintViolated(o, "Leaving a constructor that itself did not call a constructor."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitSALOAD(SALOAD o){ + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type short[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.SHORT){ + constraintViolated(o, "Stack next-to-top must be of type short[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitSASTORE(SASTORE o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type short[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.SHORT){ + constraintViolated(o, "Stack next-to-next-to-top must be of type short[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitSIPUSH(SIPUSH o){ + // nothing to do here. Generic visitXXX() methods did the trick before. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitSWAP(SWAP o){ + if (stack().peek().getSize() != 1){ + constraintViolated(o, "The value at the stack top is not of size '1', but of size '"+stack().peek().getSize()+"'."); + } + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "The value at the stack next-to-top is not of size '1', but of size '"+stack().peek(1).getSize()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitTABLESWITCH(TABLESWITCH o){ + indexOfInt(o, stack().peek()); + // See Pass 3a. + } + +} + diff --git a/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java new file mode 100644 index 00000000..f737bd12 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -0,0 +1,141 @@ +package org.apache.bcel.verifier.structurals; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.generic.InstructionHandle; +import java.util.ArrayList; +import java.util.Iterator; + +/** + * An InstructionContext offers convenient access + * to information like control flow successors and + * such. + * + * @version $Id$ + * @author Enver Haase + */ +public interface InstructionContext{ + + /** + * The getTag and setTag methods may be used for + * temporary flagging, such as graph colouring. + * Nothing in the InstructionContext object depends + * on the value of the tag. JustIce does not use it. + * + * @see #setTag(int tag) + */ + public int getTag(); + + /** + * The getTag and setTag methods may be used for + * temporary flagging, such as graph colouring. + * Nothing in the InstructionContext object depends + * on the value of the tag. JustIce does not use it. + * + * @see #getTag() + */ + public void setTag(int tag); + + /** + * This method symbolically executes the Instruction + * held in the InstructionContext. + * It "merges in" the incoming execution frame situation + * (see The Java Virtual Machine Specification, 2nd + * edition, page 146). + * By so doing, the outgoing execution frame situation + * is calculated. + * + * This method is JustIce-specific and is usually of + * no sense for users of the ControlFlowGraph class. + * They should use getInstruction().accept(Visitor), + * possibly in conjunction with the ExecutionVisitor. + * + * + * @see ControlFlowGraph + * @see ExecutionVisitor + * @see #getOutFrame(ArrayList) + * @return true - if and only if the "outgoing" frame situation + * changed from the one before execute()ing. + */ + boolean execute(Frame inFrame, ArrayList executionPredecessors, InstConstraintVisitor icv, ExecutionVisitor ev); + + /** + * This method returns the outgoing execution frame situation; + * therefore it has to be calculated by execute(Frame, ArrayList) + * first. + * + * @see #execute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) + */ + Frame getOutFrame(ArrayList executionPredecessors); + + /** + * Returns the InstructionHandle this InstructionContext is wrapped around. + * + * @return The InstructionHandle this InstructionContext is wrapped around. + */ + InstructionHandle getInstruction(); + + /** + * Returns the usual control flow successors. + * @see #getExceptionHandlers() + */ + InstructionContext[] getSuccessors(); + + /** + * Returns the exception handlers that protect this instruction. + * They are special control flow successors. + */ + ExceptionHandler[] getExceptionHandlers(); +} diff --git a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java new file mode 100644 index 00000000..6dad821b --- /dev/null +++ b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -0,0 +1,229 @@ +package org.apache.bcel.verifier.structurals; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.generic.Type; +import org.apache.bcel.generic.ReferenceType; +import org.apache.bcel.verifier.exc.*; + +/** + * This class implements an array of local variables used for symbolic JVM + * simulation. + * + * @version $Id$ + * @author Enver Haase + */ +public class LocalVariables{ + /** The Type[] containing the local variable slots. */ + private Type[] locals; + + /** + * Creates a new LocalVariables object. + */ + public LocalVariables(int maxLocals){ + locals = new Type[maxLocals]; + for (int i=0; i. + */ + +import org.apache.bcel.generic.*; +import org.apache.bcel.verifier.exc.*; +import java.util.*; + +/** + * This class implements a stack used for symbolic JVM stack simulation. + * [It's used an an operand stack substitute.] + * Elements of this stack are org.apache.bcel.generic.Type objects. + * + * @version $Id$ + * @author Enver Haase + */ +public class OperandStack{ + + /** We hold the stack information here. */ + private ArrayList stack = new ArrayList(); + + /** The maximum number of stack slots this OperandStack instance may hold. */ + private int maxStack; + + /** + * Creates an empty stack with a maximum of maxStack slots. + */ + public OperandStack(int maxStack){ + this.maxStack = maxStack; + } + + /** + * Creates an otherwise empty stack with a maximum of maxStack slots and + * the ObjectType 'obj' at the top. + */ + public OperandStack(int maxStack, ObjectType obj){ + this.maxStack = maxStack; + this.push(obj); + } + /** + * Returns a deep copy of this object; that means, the clone operates + * on a new stack. However, the Type objects on the stack are + * shared. + */ + protected Object clone(){ + OperandStack newstack = new OperandStack(this.maxStack); + newstack.stack = (ArrayList) this.stack.clone(); + return newstack; + } + + /** + * Clears the stack. + */ + public void clear(){ + stack = new ArrayList(); + } + + /** + * Returns true if and only if this OperandStack + * equals another, meaning equal lengths and equal + * objects on the stacks. + */ + public boolean equals(Object o){ + if (!(o instanceof OperandStack)) return false; + OperandStack s = (OperandStack) o; + return this.stack.equals(s.stack); + } + + /** + * Returns a (typed!) clone of this. + * + * @see #clone() + */ + public OperandStack getClone(){ + return (OperandStack) this.clone(); + } + + /** + * Returns true IFF this OperandStack is empty. + */ + public boolean isEmpty(){ + return stack.isEmpty(); + } + + /** + * Returns the number of stack slots this stack can hold. + */ + public int maxStack(){ + return this.maxStack; + } + + /** + * Returns the element on top of the stack. The element is not popped off the stack! + */ + public Type peek(){ + return peek(0); + } + + /** + * Returns the element that's i elements below the top element; that means, + * iff i==0 the top element is returned. The element is not popped off the stack! + */ + public Type peek(int i){ + return (Type) stack.get(size()-i-1); + } + + /** + * Returns the element on top of the stack. The element is popped off the stack. + */ + public Type pop(){ + Type e = (Type) stack.remove(size()-1); + return e; + } + + /** + * Pops i elements off the stack. ALWAYS RETURNS "null"!!! + */ + public Type pop(int i){ + for (int j=0; j= maxStack){ + throw new AssertionViolatedException("OperandStack too small, should have thrown proper Exception elsewhere. Stack: "+this); + } + stack.add(type); + } + + /** + * Returns the size of this OperandStack; that means, how many Type objects there are. + */ + int size(){ + return stack.size(); + } + + /** + * Returns the number of stack slots used. + * @see #maxStack() + */ + public int slotsUsed(){ + /* XXX change this to a better implementation using a variable + that keeps track of the actual slotsUsed()-value monitoring + all push()es and pop()s. + */ + int slots = 0; + for (int i=0; i. + */ + +import java.io.*; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Random; +import java.util.Vector; +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.verifier.*; +import org.apache.bcel.verifier.statics.*; +import org.apache.bcel.verifier.exc.*; + +/** + * This PassVerifier verifies a method of class file according to pass 3, + * so-called structural verification as described in The Java Virtual Machine + * Specification, 2nd edition. + * More detailed information is to be found at the do_verify() method's + * documentation. + * + * @version $Id$ + * @author Enver Haase + * @see #do_verify() + */ + +public final class Pass3bVerifier extends PassVerifier{ + /* TODO: Throughout pass 3b, upper halves of LONG and DOUBLE + are represented by Type.UNKNOWN. This should be changed + in favour of LONG_Upper and DOUBLE_Upper as in pass 2. */ + + /** + * An InstructionContextQueue is a utility class that holds + * (InstructionContext, ArrayList) pairs in a Queue data structure. + * This is used to hold information about InstructionContext objects + * externally --- i.e. that information is not saved inside the + * InstructionContext object itself. This is useful to save the + * execution path of the symbolic execution of the + * Pass3bVerifier - this is not information + * that belongs into the InstructionContext object itself. + * Only at "execute()"ing + * time, an InstructionContext object will get the current information + * we have about its symbolic execution predecessors. + */ + private static final class InstructionContextQueue{ + private Vector ics = new Vector(); // Type: InstructionContext + private Vector ecs = new Vector(); // Type: ArrayList (of InstructionContext) + public void add(InstructionContext ic, ArrayList executionChain){ + ics.add(ic); + ecs.add(executionChain); + } + public boolean isEmpty(){ + return ics.isEmpty(); + } + public void remove(){ + this.remove(0); + } + public void remove(int i){ + ics.remove(i); + ecs.remove(i); + } + public InstructionContext getIC(int i){ + return (InstructionContext) ics.get(i); + } + public ArrayList getEC(int i){ + return (ArrayList) ecs.get(i); + } + public int size(){ + return ics.size(); + } + } // end Inner Class InstructionContextQueue + + /** In DEBUG mode, the verification algorithm is not randomized. */ + private static final boolean DEBUG = true; + + /** The Verifier that created this. */ + private Verifier myOwner; + + /** The method number to verify. */ + private int method_no; + + /** + * This class should only be instantiated by a Verifier. + * + * @see org.apache.bcel.verifier.Verifier + */ + public Pass3bVerifier(Verifier owner, int method_no){ + myOwner = owner; + this.method_no = method_no; + } + + /** + * Whenever the outgoing frame + * situation of an InstructionContext changes, all its successors are + * put [back] into the queue [as if they were unvisited]. + * The proof of termination is about the existence of a + * fix point of frame merging. + */ + private void circulationPump(ControlFlowGraph cfg, InstructionContext start, Frame vanillaFrame, InstConstraintVisitor icv, ExecutionVisitor ev){ + final Random random = new Random(); + InstructionContextQueue icq = new InstructionContextQueue(); + + start.execute(vanillaFrame, new ArrayList(), icv, ev); // new ArrayList() <=> no Instruction was executed before + // => Top-Level routine (no jsr call before) + icq.add(start, new ArrayList()); + + // LOOP! + while (!icq.isEmpty()){ + InstructionContext u; + ArrayList ec; + if (!DEBUG){ + int r = random.nextInt(icq.size()); + u = icq.getIC(r); + ec = icq.getEC(r); + icq.remove(r); + } + else{ + u = icq.getIC(0); + ec = icq.getEC(0); + icq.remove(0); + } + + ArrayList oldchain = (ArrayList) (ec.clone()); + ArrayList newchain = (ArrayList) (ec.clone()); + newchain.add(u); + + if ((u.getInstruction().getInstruction()) instanceof RET){ +//System.err.println(u); + // We can only follow _one_ successor, the one after the + // JSR that was recently executed. + RET ret = (RET) (u.getInstruction().getInstruction()); + ReturnaddressType t = (ReturnaddressType) u.getOutFrame(oldchain).getLocals().get(ret.getIndex()); + InstructionContext theSuccessor = cfg.contextOf(t.getTarget()); + + // Sanity check + InstructionContext lastJSR = null; + int skip_jsr = 0; + for (int ss=oldchain.size()-1; ss >= 0; ss--){ + if (skip_jsr < 0){ + throw new AssertionViolatedException("More RET than JSR in execution chain?!"); + } +//System.err.println("+"+oldchain.get(ss)); + if (((InstructionContext) oldchain.get(ss)).getInstruction().getInstruction() instanceof JsrInstruction){ + if (skip_jsr == 0){ + lastJSR = (InstructionContext) oldchain.get(ss); + break; + } + else{ + skip_jsr--; + } + } + if (((InstructionContext) oldchain.get(ss)).getInstruction().getInstruction() instanceof RET){ + skip_jsr++; + } + } + if (lastJSR == null){ + throw new AssertionViolatedException("RET without a JSR before in ExecutionChain?! EC: '"+oldchain+"'."); + } + JsrInstruction jsr = (JsrInstruction) (lastJSR.getInstruction().getInstruction()); + if ( theSuccessor != (cfg.contextOf(jsr.physicalSuccessor())) ){ + throw new AssertionViolatedException("RET '"+u.getInstruction()+"' info inconsistent: jump back to '"+theSuccessor+"' or '"+cfg.contextOf(jsr.physicalSuccessor())+"'?"); + } + + if (theSuccessor.execute(u.getOutFrame(oldchain), newchain, icv, ev)){ + icq.add(theSuccessor, (ArrayList) newchain.clone()); + } + } + else{// "not a ret" + + // Normal successors. Add them to the queue of successors. + InstructionContext[] succs = u.getSuccessors(); + for (int s=0; s. + */ + +import org.apache.bcel.generic.*; + +/** + * This interface defines properties of JVM bytecode subroutines. + * Note that it is 'abused' to maintain the top-level code in a + * consistent fashion, too. + * + * @version $Id$ + * @author Enver Haase + */ +public interface Subroutine{ + /** + * Returns all the JsrInstructions that have the + * first instruction of this subroutine as their target. + * Must not be invoked on the 'top-level subroutine'. + */ + public InstructionHandle[] getEnteringJsrInstructions(); + + /** + * Returns the one and only RET that leaves the subroutine. + * Note that JustIce has a pretty rigid notion of a subroutine. + * Must not be invoked on the 'top-level subroutine'. + * + * @see org.apache.bcel.verifier.structurals.Subroutines + */ + public InstructionHandle getLeavingRET(); + + /** + * Returns all instructions that together form this subroutine. + * Note that an instruction is part of exactly one subroutine + * (the top-level code is considered to be a special subroutine) - + * else it is not reachable at all (dead code). + */ + public InstructionHandle[] getInstructions(); + + /** + * Returns if the given InstructionHandle refers to an instruction + * that is part of this subroutine. This is a convenience method + * that saves iteration over the InstructionHandle objects returned + * by getInstructions(). + * + * @see #getInstructions() + */ + public boolean contains(InstructionHandle inst); + + /** + * Returns an int[] containing the indices of the local variable slots + * accessed by this Subroutine (read-accessed, write-accessed or both); + * local variables referenced by subroutines of this subroutine are + * not included. + * + * @see #getRecursivelyAccessedLocalsIndices() + */ + public int[] getAccessedLocalsIndices(); + + /** + * Returns an int[] containing the indices of the local variable slots + * accessed by this Subroutine (read-accessed, write-accessed or both); + * local variables referenced by subroutines of this subroutine are + * included. + * + * @see #getAccessedLocalsIndices() + */ + public int[] getRecursivelyAccessedLocalsIndices(); + + /** + * Returns the subroutines that are directly called from this subroutine. + */ + public Subroutine[] subSubs(); +} diff --git a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java new file mode 100644 index 00000000..47b5444e --- /dev/null +++ b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -0,0 +1,668 @@ +package org.apache.bcel.verifier.structurals; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.generic.*; +import org.apache.bcel.verifier.exc.*; +import java.awt.Color; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Iterator; + + /** + * Instances of this class contain information about the subroutines + * found in a code array of a method. + * This implementation considers the top-level (the instructions + * reachable without a JSR or JSR_W starting off from the first + * instruction in a code array of a method) being a special subroutine; + * see getTopLevel() for that. + * Please note that the definition of subroutines in the Java Virtual + * Machine Specification, Second Edition is somewhat incomplete. + * Therefore, JustIce uses an own, more rigid notion. + * Basically, a subroutine is a piece of code that starts at the target + * of a JSR of JSR_W instruction and ends at a corresponding RET + * instruction. Note also that the control flow of a subroutine + * may be complex and non-linear; and that subroutines may be nested. + * JustIce also mandates subroutines not to be protected by exception + * handling code (for the sake of control flow predictability). + * To understand JustIce's notion of subroutines, please read + * + * TODO: refer to the paper. + * + * @version $Id$ + * @author Enver Haase + * @see #getTopLevel() + */ +public class Subroutines{ + /** + * This inner class implements the Subroutine interface. + */ + private class SubroutineImpl implements Subroutine{ + /** + * UNSET, a symbol for an uninitialized localVariable + * field. This is used for the "top-level" Subroutine; + * i.e. no subroutine. + */ + private final int UNSET = -1; + + /** + * The Local Variable slot where the first + * instruction of this subroutine (an ASTORE) stores + * the JsrInstruction's ReturnAddress in and + * the RET of this subroutine operates on. + */ + private int localVariable = UNSET; + + /** The instructions that belong to this subroutine. */ + private HashSet instructions = new HashSet(); // Elements: InstructionHandle + + /* + * Refer to the Subroutine interface for documentation. + */ + public boolean contains(InstructionHandle inst){ + return instructions.contains(inst); + } + + /** + * The JSR or JSR_W instructions that define this + * subroutine by targeting it. + */ + private HashSet theJSRs = new HashSet(); + + /** + * The RET instruction that leaves this subroutine. + */ + private InstructionHandle theRET; + + /** + * Returns a String representation of this object, merely + * for debugging purposes. + * (Internal) Warning: Verbosity on a problematic subroutine may cause + * stack overflow errors due to recursive subSubs() calls. + * Don't use this, then. + */ + public String toString(){ + String ret = "Subroutine: Local variable is '"+localVariable+"', JSRs are '"+theJSRs+"', RET is '"+theRET+"', Instructions: '"+instructions.toString()+"'."; + + ret += " Accessed local variable slots: '"; + int[] alv = getAccessedLocalsIndices(); + for (int i=0; inot
        a + * subroutine, the top-level, is also modeled as a Subroutine + * object. + * It is a special Subroutine object where you must not invoke + * getEnteringJsrInstructions() or getLeavingRET(). + * + * @see Subroutine#getEnteringJsrInstructions() + * @see Subroutine#getLeavingRET() + */ + public Subroutine getTopLevel(){ + return TOPLEVEL; + } + /** + * A utility method that calculates the successors of a given InstructionHandle + * in the same subroutine. That means, a RET does not have any successors + * as defined here. A JsrInstruction has its physical successor as its successor + * (opposed to its target) as defined here. + */ + private static InstructionHandle[] getSuccessors(InstructionHandle instruction){ + final InstructionHandle[] empty = new InstructionHandle[0]; + final InstructionHandle[] single = new InstructionHandle[1]; + final InstructionHandle[] pair = new InstructionHandle[2]; + + Instruction inst = instruction.getInstruction(); + + if (inst instanceof RET){ + return empty; + } + + // Terminates method normally. + if (inst instanceof ReturnInstruction){ + return empty; + } + + // Terminates method abnormally, because JustIce mandates + // subroutines not to be protected by exception handlers. + if (inst instanceof ATHROW){ + return empty; + } + + // See method comment. + if (inst instanceof JsrInstruction){ + single[0] = instruction.getNext(); + return single; + } + + if (inst instanceof GotoInstruction){ + single[0] = ((GotoInstruction) inst).getTarget(); + return single; + } + + if (inst instanceof BranchInstruction){ + if (inst instanceof Select){ + // BCEL's getTargets() returns only the non-default targets, + // thanks to Eli Tilevich for reporting. + InstructionHandle[] matchTargets = ((Select) inst).getTargets(); + InstructionHandle[] ret = new InstructionHandle[matchTargets.length+1]; + ret[0] = ((Select) inst).getTarget(); + System.arraycopy(matchTargets, 0, ret, 1, matchTargets.length); + return ret; + } + else{ + pair[0] = instruction.getNext(); + pair[1] = ((BranchInstruction) inst).getTarget(); + return pair; + } + } + + // default case: Fall through. + single[0] = instruction.getNext(); + return single; + } + + /** + * Returns a String representation of this object; merely for debugging puposes. + */ + public String toString(){ + return "---\n"+subroutines.toString()+"\n---\n"; + } +} diff --git a/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java new file mode 100644 index 00000000..ac9bbddb --- /dev/null +++ b/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -0,0 +1,97 @@ +package org.apache.bcel.verifier.structurals; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.*; +import org.apache.bcel.generic.*; + +/** + * This class represents an uninitialized object type; see The Java + * Virtual Machine Specification, Second Edition, page 147: 4.9.4 for + * more details. + * + * @version $Id$ + * @author Enver Haase + */ +public class UninitializedObjectType extends ReferenceType implements Constants{ + + /** The "initialized" version. */ + private ObjectType initialized; + + /** Creates a new instance. */ + public UninitializedObjectType(ObjectType t){ + super(T_UNKNOWN, ""); + initialized = t; + } + + /** + * Returns the ObjectType of the same class as the one of the uninitialized object + * represented by this UninitializedObjectType instance. + */ + public ObjectType getInitialized(){ + return initialized; + } + + /** + * Returns true on equality of this and o. + * Equality means the ObjectType instances of "initialized" + * equal one another in this and the o instance. + * + */ + public boolean equals(Object o){ + if (! (o instanceof UninitializedObjectType)) return false; + return initialized.equals(((UninitializedObjectType)o).initialized); + } +} diff --git a/src/java/org/apache/bcel/verifier/structurals/package.html b/src/java/org/apache/bcel/verifier/structurals/package.html new file mode 100644 index 00000000..915ff5e9 --- /dev/null +++ b/src/java/org/apache/bcel/verifier/structurals/package.html @@ -0,0 +1,27 @@ + + + + + + + +Provides a PassVerifier class mostly used internally by JustIce, yielding a control flow graph for public use as +a nice side effect. + +

        Package Specification

        + +Contained in this package is a PassVerifier class for use with the JustIce verifier and its utility classes. +Only the pass performing what Sun calls "Structural Constraints on Java Virtual Machine Code" +has a PassVerifier class here. JustIce calls this pass "Pass 3b". + +

        Related Documentation

        + +For a simple demonstration of JustIce working, please see: + + + + -- GitLab From 5ea0fe1fdc7512b82ccc5008ceef8b06234a1a34 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Tue, 30 Oct 2001 16:39:24 +0000 Subject: [PATCH 0004/1313] - adding start of xdocs so we can get the site up and running as i'm about to update the jakarta site with references to bcel. made some additions to the build to allow building the docs with anakia. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152694 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 79 +++++++++++++++++++++++++++++++++++ default.properties | 12 ++++++ xdocs/index.xml | 17 ++++++++ xdocs/stylesheets/project.xml | 12 ++++++ 4 files changed, 120 insertions(+) create mode 100644 default.properties create mode 100644 xdocs/index.xml create mode 100644 xdocs/stylesheets/project.xml diff --git a/build.xml b/build.xml index 8b03bcbd..9c9e673a 100644 --- a/build.xml +++ b/build.xml @@ -30,6 +30,14 @@ Available targets: --> + + + + + + + + @@ -154,4 +162,75 @@ Available targets: + + + + + + + + + + + + + + + + + + + The Jakarta-Site2 module is not present! Please check + to make sure that you have checked it out from CVS. + + <http://jakarta.apache.org/site/jakarta-site2.html> + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/default.properties b/default.properties new file mode 100644 index 00000000..f395c05c --- /dev/null +++ b/default.properties @@ -0,0 +1,12 @@ +# ------------------------------------------------------------------- +# B U I L D P R O P E R T I E S +# ------------------------------------------------------------------- +# These properties are used by the BCEL build, you may override +# any of these default values by placing property values in +# your ${user.home}/build.properties file. +# ------------------------------------------------------------------- + +jakarta.site2 = ../jakarta-site2 +docs.src = ./xdocs +docs.dest = ./docs +jdom.jar = jdom-b7.jar diff --git a/xdocs/index.xml b/xdocs/index.xml new file mode 100644 index 00000000..6fb6299c --- /dev/null +++ b/xdocs/index.xml @@ -0,0 +1,17 @@ + + + + + + + Jason van Zyl + + + +
        +

        + Documentation will soon be ready. +

        +
        + +
        diff --git a/xdocs/stylesheets/project.xml b/xdocs/stylesheets/project.xml new file mode 100644 index 00000000..0e010dac --- /dev/null +++ b/xdocs/stylesheets/project.xml @@ -0,0 +1,12 @@ + + + + BCEL + BCEL + + + + + + + -- GitLab From 11ce9d52b59ccb47063d54609b9acd8026d5848a Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Tue, 30 Oct 2001 16:49:25 +0000 Subject: [PATCH 0005/1313] - bcel logo taken from the sf site git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152695 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/images/bcel-logo.gif | Bin 0 -> 4931 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 xdocs/images/bcel-logo.gif diff --git a/xdocs/images/bcel-logo.gif b/xdocs/images/bcel-logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..24029c69b102518473a1633b11ced95b06bb6808 GIT binary patch literal 4931 zcmZ?wbhEHbY+|^@@Kurl1h^Qu7#O&?7#MhEc^G7Qcx1)786LgRd;!NU42t? zsc&1mceQ(Nc}qi~U)Lm6eohW94o>dr+?-tVxtW>S=1+F*X>87CSQfy$ke!Eze-jVi zrtMp|@7}b9n}>~=>EQmY+jzJavN16+^MtJ^>|4E7mG>YU8~2vuJMP}OdxC%GPOd|z znQ!0Sv-ud$vqM}WH941Bu2l1WxV8Dg<6RGASY$GCCa+-R+EclEEAO3+>{}j~N*An} zx7fYmLPCU@q2dvCLA$Ou?yuu_N2z(vdY#c7?HR{cG*_hJ^+BeRMQtv-PpCcqC(8AV zW6o_cA*PlI@`?^Q+qX8W_?Zf5n*IZ_B7d*vCV5k^Ff(4dq0Rhx_D~J z<2oK6N9PrLxvu;SY7Y$y&u=*>=d-6mYKd_bznL>bVG|37(1b&^1tO24&TiGT5qr8_ zB_YN)lgY(X`(T`DisXL3&66aZw&v<8^g1*;z3bm8yQlR7V{=p55|7Dis?Ad`??2(9 znURo^e)DCugwLE8XL4J%3O*>iQvd&Bnf?B z^R<7Wtq#uHpFX>rE0J)Zp_u8&p$FC8JE!odah@q|t-WL$bXKI}$%@ClwFw+<+4V0@ z9O<>vU3g>SM1f9LmGT>xTPNGNR?eSLsSz2k;NZ1#=`=Sh%Oz8d%{D%rk#g!F*Nlv1 zoyn6^SG;^SJN#Us+MJSInI~GiuC7d={guZ&Yc%iFWr}ucue3~Lgs4)V^KyY%g5c` zyKj_C*0^~hBXQb4Nw?MP%p5Y){5BliraalX`|C? zVX0Fm+%HuHaBiD$_@0M~Lk7Phv#5({?QK6J4L;_%s{^wDRK5_ zA5TGtY3Gif)=UZ7e`3v)V9xWa7QGX3ki6#Oys!1kY!9!s$Bj1JHu>NXp`OgGqqlp{ zoVP*Mk_T=rD*C5$v_LIC`F3tj?)Sh3ftP7_JVn&zT=0qbo2*~6B-Qj>i1qh5?+%6r zOmHweEYZNgeE(^hV;*ah`oWk&%dZDm<`r5Wc%bz3k$ADOZK&Y^cGK166XJq5il^jE zJs0+H*>$sfH>Gm|jGUNsOV|I?<3DFT!B=+n>EeTSpKINi&gcm9FzsM`AzQAf_*MF* z;EWyoPy5XKF74TtUvxl2!scV8;=b362AXG<9KFW!U-bX|e2D^urn)mLW|%eeEidV| zM)Hp?d+LmkS;3DT$rBUUCjK}qrqtOf_R5p1I$h1Fwa?%8QzYxcj%C8$0K?@mLW6q&;- z+<5m*tZore;mJPgo-Qji@n^CkPiKj}pqr5|e?~)`(`C_uD{IAOG@MDco9O8pBE&y^ zja#u=m~fRXPc%(VS#*@IVhd`?Mr;+`z6cS~6BkV6}T{_ZaQDW(l9 zAsQVDyZQCcPY{pX^;q*e7suCCZRUYB9Cq6#bY?D_#LKLrz_qL8u*qtHu0)Q8#1L+d zJ8fS@&gpiGWWRPb%4pgcso_w;T#@FwC{j6A^N|$0XM^{wO;b`5)=Yk~ApFfe#tZ)! zrY#hE-OB9oc}C~e=M#SzYe;D=XgF-}*jamWtn=Z2otDe5=$SpQn0-e~YW@C#WRaT^ z2N><19i1@g0+&PvgP-7{Eo`3rbKWT)xBFq(JxgJAl)vg3`{wo;YwuoM-rLhu;AYM+ zafPnIx+zPIUb!N1>Kj;N)R?lW zb5j$33ss&~(pUZ5;#@fGeBO%3lX)8185^<%K&;>p>9?)^FGM zUq0YHZ}-yW7JZ2`-oEQwaPaIa!KCC(osBF^!aEL>PcmXWt5a^wzvIBKPhYv)43@5Z zcQVZR*Hyoug6Um{dJk1jD-Aj%n&-mcmGG$QvJzLqf&9fY<`fIAo*4@>FIWZ)3!7EtA95;@@8ID>u8;v5F%fY+<`w`~=@BJtQ!T}VPNmuFY0oa2fc z3T`)VHQl+barCr6;+$JvUm9MN73E#8Dcb*xHJEA6hi|EhA&DI%IiD~UR|H!b1L!J`mW>p%etO?-4L``F|J6Y>}21x zLl;g(pIbWJzVl&(&*L+h?`G+|oA@aC!Ojb<6^Hwz|GsFANnY^fLP{!UG7s*ZP&Av_iY3W=e?QDZyVx1N%>mr{#R%3 z+w~X9*v??kuay59Yh~qrb#~R2&$oZ?RTuI3wf2w1o%`wg9p*Qz` ze>wlkx5e%9`|qYUFKg*)@Lsa`?=uD0489;Pxz77vSFb`ySx2nOp6fUmz z`YIul{XzQYSot=6`R6@vfez=yg750CV&QrFF4dVh>)bA|6f@>iHT6DfV1Mv{&Q~{9 zR*%M?>1+|pIRBZOyCfSQzYyqRYQ60UPm!UraEJO&Gfqu0siJ1%_O`&k+r`zL4OI+v z?jB(f7RYm z-6KNQ>CaN;7<=hn4f%eFGw~zCg_H`m2;ToH7IKX|rxfF7P4*Ww6lG#=-W|&QScxlt znXRRUQRasHPk}rS8T2OK2;pNA+%`pDPqe+`hdc5nP~F`J=4Qbpii`i$cB5!Iy(&)^hmGRxnsNt4fmJTSW2>O1m{C2sloOzZtV>iGe|&?q8PFnO8%c zpH5#LR+%$1iDO~-lc_PsJ|>wx^r~kSv|5%@W@w(XElK*Yz+)w`;FJA}BP!Kgd%Yqg zcYPG|Fys~xF#ozpa!%FPP)ITm!QPWaoR|8tVSp-ge6%D^^@mh&HHsY&*_ zDKxW(L^>T)5Lsa6qS+z-!Q_U4#VyX6YmfXhyFF7V{szxU%e;RxOcxti#I(h5h~(d1 zmdoI&XQVpGz@q#83h}337W|EWp;-06iF}cyMmdA9&pY~&d|BmH!+gC zH+6ph)Bbta?9ZAgWH)BIJ)Y^gFjstnxRauV^ocHCHa)*eA=${}2bGhY3Z@>M%%^Zs zY`dVs{=ylBAE)(yX58qQ%)4!YWU^uB(umEEvs9#Jr#5oX3z-#ebtO_hi3;$mgyC9k7Srw*r$ZXS8-$|Sj z(pRVFM@t~s)+Vt-r;tPm2aO&E=_YIHTrQS7qY%*bs^9s5{g-m9RkK9$H`=g^MJUY*-m@}r z%ddIszKHJ^5LqwQwLx=L_yY0vM!qeI;-X#I0>780D(BWei+-_f?%_!bGOKhyIO*}V zZ1}FZ-uZ(B?`%G&u*_|03CWjbS(0Y(CooEEU=&v{xHoB@_E))up~l{&-8NlO{t@Y% zswr{5Qui7zdGsq)tu5f!rij^!Jx5;}e7w%^Ky8z4R@<+@^n(JM|84sw&$w*)`{o!$ z!v&`nO|4p*w(>?}T%pqS&B@XSI(Gk>{_~>ZyCU)S$FlKdcKY3RiUo|al3AIe)A=s9 z?sygW+-d6dRU9rB3}vY?m&GF-V-pK_?XQl`o6IGICVEQ=wpZ><= zC7Zni*`M$E#l82TCFgqwz0Vo~!UuLqHSjHQ$lw%NXZXVB$!m{itLH50cD|=xvvW$f z*`)%v?*)o?D(-AAPj^z)YOg*k?iL;Hs?4)pSLRTMf~T#H#;tbtS?!t%Dvb>ar4Dzh zs=t)GEq857DQYtB+WpF{XG-EM zj_gc7bXmP{!RlkHrdN9;9aCjlSQJyN&7!{c;L*xAP9-wDb~P2@YmUV-acaIfd@=k` z&z|EB&yUyF@Vj0=F-7NaKfAV4$;p~MWwYiK+uu1Ek5@CHIX0)3&+(qK z=hU~>@Y1|Dr_NnEwaKSpOU&u*K^o0Mr+4@qnt$hX2UGEZoYQtDXAZ`kIhNz)H0SU! z8_knz&ba$HpXVuR&pCdXr*h4qGl%D>UaL9#;)>JVH)n5MW-ncH_UZA{={kj34URrj wYNpn3%$>BuMTNKZjb`Z*t?pgb8~&Wj%qe Date: Tue, 30 Oct 2001 16:49:46 +0000 Subject: [PATCH 0006/1313] - bcel logo git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152696 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/stylesheets/project.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xdocs/stylesheets/project.xml b/xdocs/stylesheets/project.xml index 0e010dac..b5eaa455 100644 --- a/xdocs/stylesheets/project.xml +++ b/xdocs/stylesheets/project.xml @@ -2,7 +2,7 @@ BCEL - BCEL + BCEL -- GitLab From 9df929dafb81c678c974b49891dc30cd2e11bf42 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 31 Oct 2001 10:23:19 +0000 Subject: [PATCH 0007/1313] Confusion between build.dir and build.dest, examples wouldn't run git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152697 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.xml b/build.xml index 9c9e673a..e37f2125 100644 --- a/build.xml +++ b/build.xml @@ -49,7 +49,7 @@ Available targets: - + @@ -72,7 +72,7 @@ Available targets: - + -- GitLab From dd2b239329d298482a406c7c8ade232e71489ada Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 31 Oct 2001 10:27:40 +0000 Subject: [PATCH 0008/1313] More verbose echo git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152698 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index e37f2125..28c3a80d 100644 --- a/build.xml +++ b/build.xml @@ -107,7 +107,7 @@ Available targets: - + -- GitLab From c97882204ff0fe1ce47d85954287c8274a2d5f11 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Fri, 9 Nov 2001 23:25:10 +0000 Subject: [PATCH 0009/1313] - manual converted to anakia format, some further formatting is required and the eps images still need to be converted. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152699 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/manual.xml | 1223 +++++++++++++++++++++++++++++++++ xdocs/stylesheets/project.xml | 1 + 2 files changed, 1224 insertions(+) create mode 100644 xdocs/manual.xml diff --git a/xdocs/manual.xml b/xdocs/manual.xml new file mode 100644 index 00000000..62f3b1d2 --- /dev/null +++ b/xdocs/manual.xml @@ -0,0 +1,1223 @@ + + + + + Markus Dahm + Byte Code Engineering Library (BCEL) v1 + + + + +
        +

        + Extensions and improvements of the programming language Java and its + related execution environment (Java Virtual Machine, JVM) are the + subject of a large number of research projects and proposals. There + are projects, for instance, to add parameterized types to Java, to + implement ``Aspect-Oriented Programming'', to perform sophisticated + static analysis, and to improve the run-time performance. +

        + +

        + Since Java classes are compiled into portable binary class files + (called byte code), it is the most convenient and + platform-independent way to implement these improvements not by + writing a new compiler or changing the JVM, but by transforming the + byte code. These transformations can either be performed after + compile-time, or at load-time. Many programmers are doing this by + implementing their own specialized byte code manipulation tools, which + are, however, restricted in the range of their re-usability. +

        + +

        + To deal with the necessary class file transformations, we introduce an + API that helps developers to conveniently implement their + transformations. +

        +
        + +
        +

        + The Java language [] has become very popular and many + research projects deal with further improvements of the language or + its run-time behavior. The possibility to extend a language with new + concepts is surely a desirable feature, but implementation issues + should be hidden from the user. Fortunately, the concepts of the Java Virtual Machine + permit the user-transparent implementation of such extensions with + relatively little effort. +

        + +

        + Because the target language of Java is an interpreted language with a + small and easy-to-understand set of instructions (the byte + code), developers can implement and test their concepts in a very + elegant way. One can write a plug-in replacement for the system's + class loader which is responsible for dynamically loading class files + at run-time and passing the byte code to the Virtual Machine (see section + ). Class loaders may thus be used to intercept + the loading process and transform classes before they get actually + executed by the JVM []. While the original class + files always remain unaltered, the behavior of the class loader may be + reconfigured for every execution or instrumented dynamically. +

        + +

        + The BCEL API (Byte Code Engineering Library), formerly known as + JavaClass, is a toolkit for the static analysis and dynamic creation + or transformation of Java class files. It enables developers to + implement the desired features on a high level of abstraction without + handling all the internal details of the Java class file format and + thus re-inventing the wheel every time. BCEL is written entirely in + Java and freely available under the terms of the Apache Software + License. +

        + +

        + This paper is structured as follows: We give a brief description of + the Java Virtual Machine and the class file format in section . Section + introduces the BCEL API. Section + describes some typical application areas and example projects. The + appendix contains code examples that are to long to be presented in + the main part of this paper. All examples are included in the + down-loadable distribution. +

        + +
        + +
        +

        + There are a number of proposals and class libraries that have some + similarities with BCEL: The JOIE [] toolkit can + be used to instrument class loaders with dynamic behavior. Similarly, + ``Binary Component Adaptation'' [] allows components to be + adapted and evolved on-the-fly. Han Lee's ``Byte-code Instrumenting + Tool'' [] allows the user to insert calls to analysis methods + anywhere in the byte code. The Jasmin language [] can be + used to hand-write or generate pseudo-assembler code. D-Java + [] and JCF [] are class viewing tools. +

        + +

        + In contrast to these projects, BCEL is intended + to be a general purpose + tool for ``byte code engineering''. It gives full control to the + developer on a high level of abstraction and is not restricted to any + particular application area. +

        +
        + +
        +

        + Readers already familiar with the Java Virtual Machine and the Java class file format + may want to skip this section and proceed with section . +

        + +

        + Programs written in the Java language are compiled into a portable + binary format called byte code. Every class is represented by + a single class file containing class related data and byte code + instructions. These files are loaded dynamically into an interpreter + (Java Virtual Machine, JVM) and executed. +

        + +

        + Figure illustrates the procedure of compiling and + executing a Java class: The source file (HelloWorld.java) is + compiled into a Java class file (HelloWorld.class), loaded by + the byte code interpreter and executed. In order to implement + additional features, researchers may want to transform class files + (drawn with bold lines) before they get actually executed. This + application area is one of the main issues of this article. +

        + +

        + +
        + Figure 1: Compilation and execution of Java classes +

        + +

        + Note that the use of the general term ``Java'' implies two meanings: + on the one hand, Java as a programming language is meant, on the other + hand, the Java Virtual Machine, which is not necessarily targeted by + the Java language exclusively, but may be used by other languages as + well (e.g. Eiffel [], or Ada []). We assume the + reader to be familiar with the Java language and to have a general + understanding of the Virtual Machine. +

        + +
        + +
        +

        + Giving a full overview of the design issues of the Java class file + format and the associated byte code instructions is beyond the scope + of this paper. We will just give a brief introduction covering the + details that are necessary for understanding the rest of this + paper. The format of class files and the byte code instruction set are + described in more detail in the ``Java Virtual Machine Specification'' [] + ,and in []. Especially, we will not deal with the security + constraints that the Java Virtual Machine has to check at run-time, i.e. the byte code + verifier. +

        + +

        + Figure shows a simplified example of the contents + of a Java class file: It starts with a header containing a ``magic + number'' (0xCAFEBABE) and the version number, followed by the + constant pool, which can be roughly thought of as the text segment of an + executable, the access rights of the class encoded by a bit + mask, a list of interfaces implemented by the class, lists containing + the fields and methods of the class, and finally the class + attributes, e.g. the SourceFile attribute telling the name + of the source file. Attributes are a way of putting additional, + e.g. user-defined, information into class file data structures. For + example, a custom class loader may evaluate such attribute data in + order to perform its transformations. The JVM specification declares + that unknown, i.e. user-defined attributes must be ignored by any Virtual Machine + implementation. +

        + +

        + +
        + Figure 2: Java class file format +

        + +

        + Because all of the information needed to dynamically resolve the + symbolic references to classes, fields and methods at run-time is + coded with string constants, the constant pool contains in fact the largest + portion of an average class file, approximately 60% []. + The byte code instructions themselves just make up 12%. +

        + +

        + The right upper box shows a ``zoomed'' excerpt of the constant pool, while the + rounded box below depicts some instructions that are contained within + a method of the example class. These instructions represent the + straightforward translation of the well-known statement: +

        + + + System.out.println("Hello, world"); + + +

        + The first instruction loads the contents of the field out of + class java.lang.System onto the operand stack. This is an + instance of the class java.io.PrintStream. The ldc + (``Load constant'') pushes a reference to the string "Hello world" on + the stack. The next instruction invokes the instance method + println which takes both values as parameters (Instance + methods always implicitly take an instance reference as their first + argument). +

        + +

        + Instructions, other data structures within the class file and + constants themselves may refer to constants in the constant pool. Such + references are implemented via fixed indexes encoded directly into the + instructions. This is illustrated for some items of the figure + emphasized with a surrounding box. +

        + +

        + For example, the invokevirtual instruction refers to a + MethodRef constant that contains information about the name + of the called method, the signature (i.e. the encoded argument and + return types), and to which class the method belongs. In fact, as + emphasized by the boxed value, the MethodRef constant itself + just refers to other entries holding the real data, e.g. it refers to + a ConstantClass entry containing a symbolic reference to the + class java.io.PrintStream. To keep the class file compact, + such constants are typically shared by different instructions. + Similarly, a field is represented by a Fieldref constant that + includes information about the name, the type and the containing class + of the field. +

        + +

        + The constant pool basically holds the following types of constants: References + to methods, fields and classes, strings, integers, floats, longs, and + doubles. +

        + +
        + +
        +

        + The JVM is a stack-oriented interpreter that creates a local stack + frame of fixed size for every method invocation. The size of the local + stack has to be computed by the compiler. Values may also be stored + intermediately in a frame area containing local variables which + can be used like a set of registers. These local variables are + numbered from 0 to 65535, i.e. you have a maximum of 65536 of local + variables. The stack frames of caller and callee method are + overlapping, i.e. the caller pushes arguments onto the operand stack + and the called method receives them in local variables. +

        + +

        + The byte code instruction set currently consists of 212 instructions, + 44 opcodes are marked as reserved and may be used for future + extensions or intermediate optimizations within the Virtual + Machine. The instruction set can be roughly grouped as follows: +

        + +

        + Stack operations: + Constants can be pushed onto the stack either + by loading them from the constant pool with the ldc instruction or with + special ``short-cut'' instructions where the operand is encoded into + the instructions, e.g. iconst_0 or bipush (push + byte value). +

        + +

        + Arithmetic operations: + The instruction set of the Java Virtual Machine + distinguishes its operand types using different instructions to + operate on values of specific type. Arithmetic operations starting + with i, for example, denote an integer operation. E.g., + iadd that adds two integers and pushes the result back on the + stack. The Java types boolean, byte, + short, and char are handled as integers by the JVM. +

        + +

        + Control flow: + There are branch instructions like goto + and if_icmpeq, which compares two integers for + equality. There is also a jsr (jump sub-routine) and + ret pair of instructions that is used to implement the + finally clause of try-catch blocks. Exceptions may + be thrown with the athrow instruction. + Branch targets are coded as offsets from the current byte code + position, i.e. with an integer number. +

        + +

        + Load and store operations + for local variables like + iload and istore. There are also array operations + like iastore which stores an integer value into an array. +

        + +

        + Field access: + The value of an instance field may be retrieved + with getfield and written with putfield. For static + fields, there are getstatic and putstatic + counterparts. +

        + +

        + Method invocation: + Methods may either be called via static + references with invokestatic or be bound virtually with the + invokevirtual instruction. Super class methods and private + methods are invoked with invokespecial. +

        + +

        + Object allocation: + Class instances are allocated with the + new instruction, arrays of basic type like int[] + with newarray, arrays of references like String[][] + with anewarray or multianewarray. +

        + +

        + Conversion and type checking: + For stack operands of basic type + there exist casting operations like f2i which converts a + float value into an integer. The validity of a type cast may be + checked with checkcast and the instanceof operator + can be directly mapped to the equally named instruction. +

        + +

        + Most instructions have a fixed length, but there are also some + variable-length instructions: In particular, the lookupswitch + and tableswitch instructions, which are used to implement + switch() statements. Since the number of case + clauses may vary, these instructions contain a variable number of + statements. +

        + +

        + We will not list all byte code instructions here, since these are + explained in detail in the JVM specification. The opcode names are + mostly self-explaining, so understanding the following code examples + should be fairly intuitive. +

        + +
        + +
        +

        + Non-abstract methods contain an attribute (Code) that holds + the following data: The maximum size of the method's stack frame, the + number of local variables and an array of byte code + instructions. Optionally, it may also contain information about the + names of local variables and source file line numbers that can be used + by a debugger. +

        + +

        + Whenever an exception is thrown, the JVM performs exception handling + by looking into a table of exception handlers. The table marks + handlers, i.e. pieces of code, to be responsible for exceptions of + certain types that are raised within a given area of the byte + code. When there is no appropriate handler the exception is propagated + back to the caller of the method. The handler information is itself + stored in an attribute contained within the Code attribute. +

        + +
        + +
        +

        + Targets of branch instructions like goto are encoded as + relative offsets in the array of byte codes. Exception handlers and + local variables refer to absolute addresses within the byte code. The + former contains references to the start and the end of the + try block, and to the instruction handler code. The latter + marks the range in which a local variable is valid, i.e. its scope. + This makes it difficult to insert or delete code areas on this level + of abstraction, since one has to recompute the offsets every time and + update the referring objects. We will see in section + how BCEL remedies this restriction. +

        + +
        + + +
        +

        + Java is a type-safe language and the information about the types of + fields, local variables, and methods is stored in + signatures. These are strings stored in the constant pool and encoded in + a special format. For example the argument and return types of the + main method +

        + + + public static void main(String[] argv) + + +

        + are represented by the signature +

        + + + ([java/lang/String;)V + + +

        + Classes and arrays are internally represented by strings like + "java/lang/String", basic types like float by an + integer number. Within signatures they are represented by single + characters, e.g., Ï", for integer. +

        + +
        + +
        +

        + The following example program prompts for a number and prints the + faculty of it. The readLine() method reading from the + standard input may raise an IOException and if a misspelled + number is passed to parseInt() it throws a + NumberFormatException. Thus, the critical area of code must be + encapsulated in a try-catch block. +

        + + + import java.io.*; + public class Faculty { + private static BufferedReader in = new BufferedReader(new + InputStreamReader(System.in)); + public static final int fac(int n) { + return (n == 0)? 1 : n * fac(n - 1); + } + public static final int readInt() { + int n = 4711; + try { + System.out.print("Please enter a number> "); + n = Integer.parseInt(in.readLine()); + } catch(IOException e1) { System.err.println(e1); } + catch(NumberFormatException e2) { System.err.println(e2); } + return n; + } + public static void main(String[] argv) { + int n = readInt(); + System.out.println("Faculty of " + n + " is " + fac(n)); + }} + + +

        + This code example typically compiles to the following chunks of byte + code: +

        + + + 0: iload_0 + 1: ifne #8 + 4: iconst_1 + 5: goto #16 + 8: iload_0 + 9: iload_0 + 10: iconst_1 + 11: isub + 12: invokestatic Faculty.fac (I)I (12) + 15: imul + 16: ireturn + + LocalVariable(start_pc = 0, length = 16, index = 0:int n) + + +

        + The method fac has only one local variable, the argument + n, stored in slot 0. This variable's scope ranges from the + start of the byte code sequence to the very end. If the value of + n (stored in local variable 0, i.e. the value fetched with + iload_0) is not equal to 0, the ifne instruction + branches to the byte code at offset 8, otherwise a 1 is pushed onto + the operand stack and the control flow branches to the final return. + For ease of reading, the offsets of the branch instructions, which are + actually relative, are displayed as absolute addresses in these + examples. +

        + +

        + If recursion has to continue, the arguments for the multiplication + (n and fac(n - 1)) are evaluated and the results + pushed onto the operand stack. After the multiplication operation has + been performed the function returns the computed value from the top of + the stack. +

        + + + 0: sipush 4711 + 3: istore_0 + 4: getstatic java.lang.System.out Ljava/io/PrintStream; + 7: ldc "Please enter a number> " + 9: invokevirtual java.io.PrintStream.print (Ljava/lang/String;)V + 12: getstatic Faculty.in Ljava/io/BufferedReader; + 15: invokevirtual java.io.BufferedReader.readLine ()Ljava/lang/String; + 18: invokestatic java.lang.Integer.parseInt (Ljava/lang/String;)I + 21: istore_0 + 22: goto #44 + 25: astore_1 + 26: getstatic java.lang.System.err Ljava/io/PrintStream; + 29: aload_1 + 30: invokevirtual java.io.PrintStream.println (Ljava/lang/Object;)V + 33: goto #44 + 36: astore_1 + 37: getstatic java.lang.System.err Ljava/io/PrintStream; + 40: aload_1 + 41: invokevirtual java.io.PrintStream.println (Ljava/lang/Object;)V + 44: iload_0 + 45: ireturn + + Exception handler(s) = + From To Handler Type + 4 22 25 java.io.IOException(6) + 4 22 36 NumberFormatException(10) + + + +

        + First the local variable n (in slot 0) is initialized to the + value 4711. The next instruction, getstatic, loads the + static System.out field onto the stack. Then a string is + loaded and printed, a number read from the standard input and + assigned to n. +

        + +

        + If one of the called methods (readLine() and + parseInt()) throws an exception, the Java Virtual Machine calls one of the + declared exception handlers, depending on the type of the exception. + The try-clause itself does not produce any code, it merely + defines the range in which the following handlers are active. In the + example the specified source code area maps to a byte code area + ranging from offset 4 (inclusive) to 22 (exclusive). If no exception + has occurred (``normal'' execution flow) the goto + instructions branch behind the handler code. There the value of + n is loaded and returned. +

        + +

        + For example the handler for java.io.IOException starts at + offset 25. It simply prints the error and branches back to the normal + execution flow, i.e. as if no exception had occurred. +

        + +
        + +
        +

        + The BCEL API abstracts from the concrete circumstances of the Java Virtual Machine and + how to read and write binary Java class files. The API mainly + consists of three parts: +

        + +

        + +

          +
        1. A package that contains classes that describe ``static'' + constraints of class files, i.e., reflect the class file format and + is not intended for byte code modifications. The classes may be + used to read and write class files from or to a file. This is + useful especially for analyzing Java classes without having the + source files at hand. The main data structure is called + JavaClass which contains methods, fields, etc..
        2. + +
        3. A package to dynamically generate or modify JavaClass + objects. It may be used e.g. to insert analysis code, to strip + unnecessary information from class files, or to implement the code + generator back-end of a Java compiler.
        4. + +
        5. Various code examples and utilities like a class file viewer, a + tool to convert class files into HTML, and a converter from class + files to the Jasmin assembly language [].
        6. +
        +

        + +
        + +
        +

        + The ``static'' component of the BCEL API resides in the package + and represents class files. All of the + binary components and data structures declared in the JVM + specification [] and described in section 2 are + mapped to classes. Figure shows an UML diagram of the + hierarchy of classes of the BCEL API. Figure in the + appendix also shows a detailed diagram of the ConstantPool + components. +

        + +

        + +
        + Figure 3: UML diagram for the BCELAPI +

        + +

        + The top-level data structure is JavaClass, which in most + cases is created by a ClassParser object that is capable + of parsing binary class files. A JavaClass object basically + consists of fields, methods, symbolic references to the super class + and to the implemented interfaces. +

        + +

        + The constant pool serves as some kind of central repository and is thus of + outstanding importance for all components. ConstantPool + objects contain an array of fixed size of Constant entries, + which may be retrieved via the getConstant() method taking an + integer index as argument. Indexes to the constant pool may be contained in + instructions as well as in other components of a class file and in constant pool + entries themselves. +

        + +

        + Methods and fields contain a signature, symbolically defining their + types. Access flags like public static final occur in + several places and are encoded by an integer bit mask, e.g. + public static final matches to the Java expression +

        + + + + int access_flags = ACC_PUBLIC | ACC_STATIC | ACC_FINAL; + + +

        + As mentioned in section 2.1 already, several components + may contain attribute objects: classes, fields, methods, and + Code objects (introduced in section 2.3). The + latter is an attribute itself that contains the actual byte code + array, the maximum stack size, the number of local variables, a table + of handled exceptions, and some optional debugging information coded + as LineNumberTable and LocalVariableTable + attributes. Attributes are in general specific to some data structure, + i.e. no two components share the same kind of attribute, though this + is not explicitly forbidden. In the figure the Attribute + classes are marked with the component they belong to. +

        + +
        + +
        +

        + Using the provided Repository class, reading class files into + a JavaClass object is quite simple: +

        + + + JavaClass clazz = Repository.lookupClass("java.lang.String"); + + +

        + The repository also contains methods providing the dynamic equivalent + of the instanceof operator, and other useful routines: +

        + + + if(Repository.instanceOf(clazz, super_class) { + ... + } + + +
        + +
        + +

        + Information within the class file components may be accessed like Java + Beans via intuitive set/get methods. All of them also define a + toString() method so that implementing a simple class viewer + is very easy. In fact all of the examples used here have been produced + this way: +

        + + + System.out.println(clazz); + printCode(clazz.getMethods()); + ... + public static void printCode(Method[] methods) { + for(int i=0; i < methods.length; i++) { + System.out.println(methods[i]); + + Code code = methods[i].getCode(); + if(code != null) // Non-abstract method + System.out.println(code); + } + } + + +
        + +
        +

        + Last but not least, BCEL supports the Visitor design + pattern [], so one can write visitor objects to traverse + and analyze the contents of a class file. Included in the distribution + is a class JasminVisitor that converts class files into the + Jasmin assembler language []. +

        + +
        + +
        +

        + This part of the API (package ) supplies + an abstraction level for creating or transforming class files + dynamically. It makes the static constraints of Java class files like + the hard-coded byte code addresses generic. The generic constant pool, for + example, is implemented by the class ConstantPoolGen which + offers methods for adding different types of constants. Accordingly, + ClassGen offers an interface to add methods, fields, and + attributes. Figure gives an overview of this part of + the API. +

        + +

        + +
        + Figure 4: UML diagram of the ClassGen API +

        + +
        + +
        +

        + We abstract from the concrete details of the type signature syntax + (see 2.5) by introducing the Type class, which is + used, for example, by methods to define their return and argument + types. Concrete sub-classes are BasicType, + ObjectType, and ArrayType which consists of the + element type and the number of dimensions. For commonly used types the + class offers some predefined constants. For example the method + signature of the main method as shown in section + 2.5 is represented by: +

        + + + Type return_type = Type.VOID; + Type[] arg_types = new Type[] { new ArrayType(Type.STRING, 1) }; + + +

        + Type also contains methods to convert types into textual + signatures and vice versa. The sub-classes contain implementations of + the routines and constraints specified by the Java Language + Specification []. +

        + +
        + +
        +

        + Fields are represented by FieldGen objects, which may be + freely modified by the user. If they have the access rights + static final, i.e. are constants and of basic type, they may + optionally have an initializing value. +

        + +

        + Generic methods contain methods to add exceptions the method may + throw, local variables, and exception handlers. The latter two are + represented by user-configurable objects as well. Because exception + handlers and local variables contain references to byte code + addresses, they also take the role of an instruction targeter + in our terminology. Instruction targeters contain a method + updateTarget() to redirect a reference. Generic + (non-abstract) methods refer to instruction lists that consist + of instruction objects. References to byte code addresses are + implemented by handles to instruction objects. This is explained in + more detail in the following sections. +

        + +

        + The maximum stack size needed by the method and the maximum number of + local variables used may be set manually or computed via the + setMaxStack() and setMaxLocals() methods + automatically. +

        + +
        + +
        +

        + Modeling instructions as objects may look somewhat odd at first sight, + but in fact enables programmers to obtain a high-level view upon + control flow without handling details like concrete byte code offsets. + Instructions consist of a tag, i.e. an opcode, their length in bytes + and an offset (or index) within the byte code. Since many instructions + are immutable, the InstructionConstants interface offers + shareable predefined ``fly-weight'' constants to use. +

        + +

        + Instructions are grouped via sub-classing, the type hierarchy of + instruction classes is illustrated by (incomplete) figure + in the appendix. The most important family of + instructions are the branch instructions, e.g. goto, + that branch to targets somewhere within the byte code. Obviously, + this makes them candidates for playing an InstructionTargeter + role, too. Instructions are further grouped by the interfaces they + implement, there are, e.g., TypedInstructions that are + associated with a specific type like ldc, or + ExceptionThrower instructions that may raise exceptions when + executed. +

        + +

        + All instructions can be traversed via accept(Visitor v) methods, + i.e., the Visitor design pattern. There is however some special trick + in these methods that allows to merge the handling of certain + instruction groups. The accept() do not only call the + corresponding visit() method, but call visit() + methods of their respective super classes and implemented interfaces + first, i.e. the most specific visit() call is last. Thus one + can group the handling of, say, all BranchInstructions into + one single method. +

        + +

        + For debugging purposes it may even make sense to ``invent'' your own + instructions. In a sophisticated code generator like the one used as a + backend of the Barat framework [] one often has to insert + temporary nop (No operation) instructions. When examining + the produced code it may be very difficult to track back where the + nop was actually inserted. One could think of a derived + nop2 instruction that contains additional debugging + information. When the instruction list is dumped to byte code, the + extra data is simply dropped. +

        + +

        + One could also think of new byte code instructions operating on + complex numbers that are replaced by normal byte code upon load-time + or are recognized by a new JVM. +

        + +
        + +
        +

        + An instruction list is implemented by a list of + instruction handles encapsulating instruction objects. + References to instructions in the list are thus not implemented by + direct pointers to instructions but by pointers to instruction + handles. This makes appending, inserting and deleting areas of + code very simple. Since we use symbolic references, computation of + concrete byte code offsets does not need to occur until finalization, + i.e. until the user has finished the process of generating or + transforming code. We will use the term instruction handle and + instruction synonymously throughout the rest of the paper. + Instruction handles may contain additional user-defined data using the + addAttribute() method. +

        + +

        + Appending + One can append instructions or other instruction lists anywhere to an + existing list. The instructions are appended after the given + instruction handle. All append methods return a new instruction + handle which may then be used as the target of a branch instruction, + e.g.. +

        + + + InstructionList il = new InstructionList(); + ... + GOTO g = new GOTO(null); + il.append(g); + ... + InstructionHandle ih = il.append(InstructionConstants.ACONST_NULL); + g.setTarget(ih); + + +

        + Inserting + Instructions may be inserted anywhere into an existing list. They are + inserted before the given instruction handle. All insert methods + return a new instruction handle which may then be used as the start + address of an exception handler, for example. +

        + + + InstructionHandle start = il.insert(insertion_point, + InstructionConstants.NOP); + ... + mg.addExceptionHandler(start, end, handler, "java.io.IOException"); + + +

        + Deleting + Deletion of instructions is also very straightforward; all instruction + handles and the contained instructions within a given range are + removed from the instruction list and disposed. The delete() + method may however throw a TargetLostException when there are + instruction targeters still referencing one of the deleted + instructions. The user is forced to handle such exceptions in a + try-catch block and redirect these references elsewhere. The + peep hole optimizer described in section gives a + detailed example for this. +

        + + + try { + il.delete(first, last); + } catch(TargetLostException e) { + InstructionHandle[] targets = e.getTargets(); + for(int i=0; i < targets.length; i++) { + InstructionTargeter[] targeters = targets[i].getTargeters(); + for(int j=0; j < targeters.length; j++) + targeters[j].updateTarget(targets[i], new_target); + } + } + + +

        + Finalizing + When the instruction list is ready to be dumped to pure byte code, all + symbolic references must be mapped to real byte code offsets. This is + done by the getByteCode() method which is called by default + by MethodGen.getMethod(). Afterwards you should call + dispose() so that the instruction handles can be reused + internally. This helps to reduce memory usage. +

        + + + InstructionList il = new InstructionList(); + + ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", + "<generated>", ACC_PUBLIC | ACC_SUPER, + null); + MethodGen mg = new MethodGen(ACC_STATIC | ACC_PUBLIC, + Type.VOID, new Type[] { + new ArrayType(Type.STRING, 1) + }, new String[] { "argv" }, + "main", "HelloWorld", il, cp); + ... + cg.addMethod(mg.getMethod()); + il.dispose(); // Reuse instruction handles of list + + +
        + +
        +

        + Using instruction lists gives us a generic view upon the code: In + Figure we again present the code chunk of the + readInt() method of the faculty example in section + 2.6: The local variables n and e1 both + hold two references to instructions, defining their scope. There are + two gotos branching to the iload at the end of the + method. One of the exception handlers is displayed, too: it references + the start and the end of the try block and also the exception + handler code. +

        + +

        + +
        + Figure 5: Instruction list for readInt() method +

        + +
        + +
        +

        + To simplify the creation of certain instructions the user can use the + supplied InstructionFactory class which offers a lot of + useful methods to create instructions from scratch. Alternatively, he + can also use compound instructions: When producing byte code, + some patterns typically occur very frequently, for instance the + compilation of arithmetic or comparison expressions. You certainly do + not want to rewrite the code that translates such expressions into + byte code in every place they may appear. In order to support this, + the BCEL API includes a compound instruction (an interface with + a single getInstructionList() method). Instances of this + class may be used in any place where normal instructions would occur, + particularly in append operations. +

        + +

        + Example: Pushing constants + Pushing constants onto the operand stack may be coded in different + ways. As explained in section 2.2 there are some + ``short-cut'' instructions that can be used to make the produced byte + code more compact. The smallest instruction to push a single + 1 onto the stack is iconst_1, other possibilities + are bipush (can be used to push values between -128 and 127), + sipush (between -32768 and 32767), or ldc (load + constant from constant pool). +

        + +

        + Instead of repeatedly selecting the most compact instruction in, say, + a switch, one can use the compound PUSH instruction whenever + pushing a constant number or string. It will produce the appropriate + byte code instruction and insert entries into to constant pool if necessary. +

        + + + il.append(new PUSH(cp, "Hello, world")); + il.append(new PUSH(cp, 4711)); + + +
        + +
        +

        + When transforming code, for instance during optimization or when + inserting analysis method calls, one typically searches for certain + patterns of code to perform the transformation at. To simplify + handling such situations BCEL introduces a special feature: One can + search for given code patterns within an instruction list using + regular expressions. In such expressions, instructions are + represented by symbolic names, e.g. "`IfInstruction'". Meta + characters like +, *, and (..|..) have their + usual meanings. Thus, the expression +

        + + + "`NOP'+(`ILOAD__'|`ALOAD__')*" + + +

        + represents a piece of code consisting of at least one NOP + followed by a possibly empty sequence of ILOAD and + ALOAD instructions. +

        + +

        + The search() method of class FindPattern gets an + instruction list and a regular expression as arguments and returns an + array describing the area of matched instructions. Additional + constraints to the matching area of instructions, which can not be + implemented via regular expressions, may be expressed via code + constraints. +

        + +
        + +
        +

        + In Java, boolean values are mapped to 1 and to 0, respectively. Thus, + the simplest way to evaluate boolean expressions is to push a 1 or a 0 + onto the operand stack depending on the truth value of the expression. + But this way, the subsequent combination of boolean expressions (with + &&, e.g) yields long chunks of code that push lots of 1s and + 0s onto the stack. +

        + +

        + When the code has been finalized these chunks can be optimized with a + peep hole algorithm: An IfInstruction (e.g. the + comparison of two integers: if_icmpeq) that either produces + a 1 or a 0 on the stack and is followed by an ifne + instruction (branch if stack value + 0) may be replaced by the + IfInstruction with its branch target replaced by the target + of the ifne instruction: +

        + +

        + The applied code constraint object ensures that the matched code + really corresponds to the targeted expression pattern. Subsequent + application of this algorithm removes all unnecessary stack operations + and branch instructions from the byte code. If any of the deleted + instructions is still referenced by an InstructionTargeter + object, the reference has to be updated in the catch-clause. +

        + +

        + Code example gives a verbose example of how to create + a class file, while example shows how to implement a + simple peephole optimizer and how to deal with TargetLost + exceptions. +

        + +

        + Example application: + The expression: +

        + + + if((a == null) || (i < 2)) + System.out.println("Ooops"); + + +

        + can be mapped to both of the chunks of byte code shown in figure + . The left column represents the unoptimized code while + the right column displays the same code after an aggressively + optimizing peep hole algorithm has been applied: +

        + +

        + FIX ME! +

        + +
        + +
        +

        + There are many possible application areas for BCEL ranging from class + browsers, profilers, byte code optimizers, and compilers to + sophisticated run-time analysis tools and extensions to the Java + language [,]. +

        + +

        + Compilers like the Barat compiler [] use BCEL to implement a + byte code generating back end. Other possible application areas are + the static analysis of byte code [] or examining the + run-time behavior of classes by inserting calls to profiling methods + into the code. Further examples are extending Java with Eiffel-like + assertions [], automated delegation [], or + with the concepts of ``Aspect-Oriented Programming'' []. +

        + +
        + +
        +

        + Class loaders are responsible for loading class files from the file + system or other resources and passing the byte code to the Virtual Machine + []. A custom ClassLoader object may be used + to intercept the standard procedure of loading a class, i.e. the + system class loader, and perform some transformations before actually + passing the byte code to the JVM. +

        + +

        + A possible scenario is described in figure : + During run-time the Virtual Machine requests a custom class loader to load a given + class. But before the JVM actually sees the byte code, the class + loader makes a ``side-step'' and performs some transformation to the + class. To make sure that the modified byte code is still valid and + does not violate any of the JVM's rules it is checked by the verifier + before the JVM finally executes it. +

        + +

        + +
        + Figure 7: Class loaders +

        + +

        + Using class loaders is an elegant way of extending the Java Virtual Machine with new + features without actually modifying it. This concept enables + developers to use load-time reflection to implement their ideas + as opposed to the static reflection supported by the Java Reflection + API []. Load-time transformations supply the user with + a new level of abstraction. He is not strictly tied to the static + constraints of the original authors of the classes but may customize + the applications with third-party code in order to benefit from new + features. Such transformations may be executed on demand and neither + interfere with other users, nor alter the original byte code. In fact, + class loaders may even create classes ad hoc without loading a + file at all. +

        + +
        + +
        +

        + The ``Poor Man's Genericity'' project [] that extends Java + with parameterized classes, for example, uses BCEL in two places to + generate instances of parameterized classes: During compile-time (the + standard javac with some slightly changed classes) and at + run-time using a custom class loader. The compiler puts some + additional type information into class files which is evaluated at + load-time by the class loader. The class loader performs some + transformations on the loaded class and passes them to the VM. The + following algorithm illustrates how the load method of the class + loader fulfills the request for a parameterized class, + e.g. Stack<String> +

        + +

        +

          +
        1. Search for class Stack, load it, and check for a + certain class attribute containing additional type information. I.e. + the attribute defines the ``real'' name of the class, + i.e. Stack<A>.
        2. + +
        3. Replace all occurrences and references to the formal type + A with references to the actual type String. For + example the method +
        4. + + + void push(A obj) { ... } + + +

          + becomes +

          + + + void push(String obj) { ... } + + +
        5. Return the resulting class to the Virtual Machine.
        6. +
        +

        + +
        + + +
        diff --git a/xdocs/stylesheets/project.xml b/xdocs/stylesheets/project.xml index b5eaa455..04598627 100644 --- a/xdocs/stylesheets/project.xml +++ b/xdocs/stylesheets/project.xml @@ -7,6 +7,7 @@ + -- GitLab From 085b7456d4b4eb857b88baa5cfcf5b4489a2aa00 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Sat, 10 Nov 2001 00:17:13 +0000 Subject: [PATCH 0010/1313] - convert eps images to gifs git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152700 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/images/classfile.gif | Bin 0 -> 16827 bytes xdocs/images/classgen.gif | Bin 0 -> 28994 bytes xdocs/images/classloader.gif | Bin 0 -> 4275 bytes xdocs/images/constantpool.gif | Bin 0 -> 12431 bytes xdocs/images/il.gif | Bin 0 -> 9551 bytes xdocs/images/instructions.gif | Bin 0 -> 18280 bytes xdocs/images/javaclass.gif | Bin 0 -> 26052 bytes xdocs/images/jvm.gif | Bin 0 -> 6810 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 xdocs/images/classfile.gif create mode 100644 xdocs/images/classgen.gif create mode 100644 xdocs/images/classloader.gif create mode 100644 xdocs/images/constantpool.gif create mode 100644 xdocs/images/il.gif create mode 100644 xdocs/images/instructions.gif create mode 100644 xdocs/images/javaclass.gif create mode 100644 xdocs/images/jvm.gif diff --git a/xdocs/images/classfile.gif b/xdocs/images/classfile.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa9a2892d42ac80eb25fc970d1bf95e318de54df GIT binary patch literal 16827 zcmZ?wbhEHb3Pxtl9mq!lnzkcO%UuSzvWH=ieo3EE=O-0%KSu=!% zg%uU#?QE=bGShs$JT|Uf&A`C$|Nnmm;(+2$7O+Ac5DBuAf%X3ahTfFSc^RwL<-Fck zpmTne!rh8>?`z)wKd_)cL-1nXi6uoRU2b+6KGv%uej+ zpTA(?qWKf&B+pv5a@Cv_tJm4iTfAxWmaR+I2d>?*d(YhMdv|Z#dicoElKltlcbz!bLFg@-wqXR3yH2%b686(nJIM?*hpQ@4aO7o%p8%JIp( zw*Q%wBR4JOo2HkzaE_&as{Rba=tpN}IxC-@za^(i_*Ag^#YMJ_T1(5mT=iQbGGFZL z&Mm7JFI%_7$#jLOdg$r|;l$XhrP}*8-R(KxA+Sw%#l}@0(+&zUJesmAEqGxm+d>9W z?HDF*xic+q4eN@OFKpFj&5sK!Sgcqf`P1;G)l^0AnbnKm$uhDrnFJIxGca9T(mjXm zLB)Yg7G@O@4hF`?_|rAt9=+n$HqHy1A;_)Eyx<4ZZXP8T3%_4KK5^7dHnuRBexQ+= zah))OK%-T|{h2k(l?sxL1nxf2u60%Z7nJmkRY^r-Q^UaqhR>od3=976W_Tr}AmEt8 z?2^Dx&TBLA-hZdJkwTm-D|@dzXlh+keyrtJ&a#Mffx`B-oSTBjV^u1ymbx)02UT#j zH3&?IV&oEPoYys(Wx9V-x8ng>2Gt|%(n?2NCqxwqU0KS&$-Km4v8&D}Mutk33CEvI zx*L(FJL~0B&uJE3Y zW#AE6I45?&!edJ}#yDL#Fw309#(fh ztv-$A4x4hM*+$WIe3xX)b(Gi*3g#>lGRV^CrRXr0=XND16rC~* z7e865yI~uzuXINGu?f>^nlG6OM@_G_{{H9ayeDSTTQ1BJ`m|*3m1C)w`>eklUwD(Z zf~T0}$y~E-v77H+e8wT@qUW$nx@h_Q|4eWCB;*f#^-NfIceeF8)r_*UK5HZ=dTlts zWVWI7N!{`ztIzFe3AcE)y3=~=jyqNwmP!-MXGqI0)L1U@Vd|OHc0YNQjSk#ulwFqi zcc-!z|HS0`tD|K~%aFWGhf!m@R5W?M78Jbtq;_MfW5 zxxHK^H=0jmE)d@Lcgln67_S7;mL>ZcuO4NaKl{$Q3ilO4CBBh%vkyNw#B9Hyl&R%Q zw$JkmE!IpSyguwN!oQx`+Q2Nrz*OovX*NfKilbvn+vMMUFHZ$H=r?u-ta=>DqR-AK zUgsI`H;J3chiw;c-Ev00HK%!RUgx~u$XucN=di1d>Hh!UT^+;HG_LU0cxW5R6hv@I zOqso+!R~K~yF+x%ViummN0?+AIyXs9k=j^c>#!-X_lVF0w)fX|DxGPOzV4 zX9KaXT^p3!FYWuX>>4^!U}CjBo-bIQ1`JA4!fNZ0zmC6cFgg@^kt z*4q~jELv$1W6Rs6t|7AA;@+>TvIRGoZ|%wUl<$3N_j`jZn`F`g7LIWDts8etZ)03$ z^0d)caF=w(t>%>`hcw)4FZ)|xUD@f}>BK0sA=LdUoBglVzKlEq(#$nqt@$2H`f?|1 z=)B2bCUSUX@K2`D4_~HC3HD&HeH{|I%T3YiQ;Z+ui7#`XYBaQ$3#?%hD~Mo8=vu~L z!O+k2!9?qb=JNfkUx(SKUR}ufa9wl4N|y~x*SfxHGpwwIY?Zc9r_k=z*Mc0A*LUU4OWS>V?k5L^8qr)e7lwx036s?S z@9#ZQ-*Q{>QPTMx6MXf~rdWqJUD>9zSG1wzAVX~NsWVg3e&#+oCbo0-s%<-xtEGxk z&F(#&R=(x8NW)ncJe|K(&Ggfa>$}&KCRhC2t@TW9^XyOo9xv4;375)V z?NQxWU~*k@Z8wi-W+KD7V%CrM`x|cbOb$5NDJsskX`RFZ-MEw8@iT9GmHs$pTC~*9 z@Qjl1`yKM`(^gL~-hE!^w8cpkmQ51HHNqO^+mAcX*ci9QM^Vsz>q*zTPyL@4t^Qiq zaw@V{eZz_=4-e#6a7103?%kWU{KP>McCC3$jJHhKj81kj-duV2Mp;3+#)g+{%rC3b=DM)voSr_>#9~>!F;RL01|-i>*7pAu~Q{=HZW9PloOGYUrCO#cp5HI1a|gWM)U77ySHybgxpV&M$^?>CAx&RZD_OAF;kl@(a2V|al=}^iz4wA znSRYiGdMR|yxL6ry&epj-Xv7FhbqHQemr!a4w+F2h}$@WRR#kneO zJKj-{+`2OMT-LVA9o!q8=dPP7o0C-i>~?$U3W14k_BUSkHMh_0HkfR4CHRHK>7CkF znJu%7teDf!X0+XUaPCraNI*$}WbCX9t*aS0Ec}>lwk|y8Ua|G)#=iXl5i0(s2lN*` z&p5ET$mY`ScTF81WL{`3H$1a9yLjXDJ3{kMR-DRR#}OzzecOqGH50zqKC$yF>-yOJ z{Cvx@w)>L17Qb4u;U!P@?!Il29ev%*M;XeU1x`0+irlUIb8m~qMp>KkRNwcx$mek3syrbj#)68yN~Jl`Z1BCNl6SFfb`7RHw-CCdh4i zm=nLF&fsZN&_o^L_^=D3(o)X5DAXJhSP_I&`tFt6dpT#xrip}95XY(n}cN#Tq zTkL*M*YQ*=Zu;c@u~D~JMZu=YwJxzHTq1ep37?3C4F8`!R17bwzHyL&ZGoF!iM0M= zTQifIK5^46I~dZAw*4xW?KP9q+$?jt(L*(|~IcE8;PQtwFRKYv%UeQ|9V)+@nbjGmW)#R|Ea;ul9__O%Z5~VfHx(}z zMwRJp%yYL)NHY_fJB@XISwMq1E8Ah_PB9bK52^wV-3j!u?0+; zC?<4ubLxrdseBnZi2@UUHP=rwkY4(geVJn6@|FpI8zdJrGW_4qmLL&mpwZTeD`rlw+Bv=E=JdLs(;Hq+ zk6~v&ksx(7BQBwB8t;xtHV#!Mp3I0`=AHC3yl~}=NRR1`3^VsGnOVT*Yq2CUTQaFA zb4rhAhV{{z&ke)>uuYM4N>cA+)#MCt*DP{qn6>EBwAO^#7TZ$JPi@=rQf~83q4kxl z8)qgY++`f(YyQj^F)119@ zrj6x-Imr#R_6hO_j_MgX8FMd){dlr=*0-5=I1BD^1{7YMnr=DoSm(^GGnxONHj_6K zGtw{)`zIvLwK-}Nqx3_gJRUEG<)z$R2g5QY@-|%zi&$x_GP%7xm_a70MtAXoMGIpW zUMyt1V8mHu@bsb7$|bXnCeF8GkTQ5R|E9^T%#&R+HR~FV#tL5+mxxgK_r?7UlOj)n z^m6y$ltm0JrRI|vV+0CH*e5XTT4Xq>)!E{4+s1>2AzjQDSPf4V>PvAf=`?k1a*|8z zVhFEVGL4njG|I3L)AEW0mHa$cp+yQ}H+W^0y9<%P246Bz!ANh>nf-Z)mfa#?YByS$2mYPnhBo#ind#~5CC7)u-R9)6U& z=~afO=&I+IGx80@)IQIyQ1$iO*5$F0cb%f9orAQ{t?2hjvYlnjA{v_a9V<fZ+`KuZJc+J1SwVvTN z+tfq`ugVR3ucXBU%xMbPuxeNSsYNq|Gv@L>$oXivVsk{dp=V;}F^#_`x@D!;%T?Fj zNQ`P|la&zJ`ajyJv(}q!p*E|1 zr0%209V@-PB|Jmy)fkFz&1n3&`+)SGL)Lp5er_sb;3)Liy~1jT<%jHrot(-7?d{Uj zR!Z)c{J6{VRp8PGYdx+p`&4buI+=CZd+#ZR9p^H4-|Y68)v)jXPUan-_Dp|}{$w`i zGwa3cq*5i!=J+;jHr#is0{ zE8L6LDCF4~?lh1&{KIoqTf-sl7l#j6?t6XUu&vLLwzNa)IY+j8@8!8E>2xRPzP6CZ zoFiT`Gp}U}?#w>?M4PEPdWzp0p75Tdk#}ZB^RQKQ?N47bBeX^!HRo9Fp4kpEN4R{B z@G5VgW_fIn!11CrUfJIc#<^{KGkdd_45#?Z9|J^ zqto4{Ih}9he0aEHZB&bWHoG?P*ZnCCIMDHbpBmfj9-W1YWlr6kq_gbg!E4MdL5D>@ zom8(`Yq#fE*BR!X9R7VilFaIr|BDJPw-x4wPUAjh5W#FH=x)f>ZXgz3t#M_J=x3=X zJBoxiTZ$Fy+;cO`Ha==&xoy&ggAcrq+-^LrX|wol!@}v7EQ!ZWLLZx?d?*WPE<3-* zG{@aC;Ik=5z}e}>t_wvRuN^FtIAN1pWL?8#daCfk&Bn&ZI=s8iFh8lON&mC0tc&^J z9qv8dvlR|nbf2-?aNR@li0YPfkL}-`)z&slJ7Zm;sKAn>;81i)wVC6km;!TE}}# zAxch7Dh^E?51Xo0WN#=dG+q9AxwPio-Rfh{oEU1}9Q?U}q5bEzLuy^RUpfp$I`2Do zT9_zIKjG~3$eB&0Ge*f}qKISGA+^Y}*4G)Gb^dCtovV?|t1Ehz`LNEZNFE*Lf@^zZ zS#$Pso;;jXk-;`0ibw9m57eiU!!&E1mBZ1+}S z=U!&<+&h_PkNqfE`An8Y`R1MlB1a#o%T>MJSN1!mu|_iWFYAjxez|Kd{&(GQh+l*4 zuq@y7zek??9)I@chV$KHQ>HSrzB~HPApTa>1H)T4+7f(U_&yAt%FfKk;n{vss_#MU zbGZYy4;TM=z}UyXpz)d_-*T}$j^Dkf*yA3({>v&mkNq9XBi(n8IM+Rp-uKvkAD{NQ zM-Jy&e*R^BI(OgmxsMOtWj9}!waxobi}8tCfyea|4@S&;`rkRw^T7U-2~xgsPd5C1 z)H>lwLE6EndC#)uF~#XUFwx6;A$_T28?(jEd?7yWZrR4?oHK7r3WvN?;pTfXUHaKY zgD0ALS;gmeDx~!MT6?l4Z+@NKz1iFkll*2+`tW4t$$bij3(6;-S*AKEe0lAyw1p{O z7u-x^{-3$ScEvxfd&_bQSRZhGd|s(=T&2{) zEI4XuiOZXi;I7}I>jbYayP^8>h|H61dC&gza?Uu%-0b=?AfRGPu3VN0$Kz)!4oh)9 z=3@}*Yc$xp&0OH*#JVRgbuXsMy+6C)^=>|v?Ovr3(<|oY)%xFl9~hmnWn=rBgFct^ z>NN6RPSq1Jp7yq5+K2D^=Gio@Th~@uYP3w|$9oC>Nbh9%>L1Vcm3}CQe(m~i$BuW* z7S5jn95$XhlwTUx_Q@;Qz}~DeVx58O>W;AI!HS>syx)Fa_juWdCyuS`&3#W?qciP~ zUp%$2n@u^c^048=t6~517H?WMt+F@k!-sY0l6ueFooC%y5T2x<86wYC`a7HXq*wZU zqpxR;vgO}K>hFqP3Ka_sG@B7(id{e0A7km57y&Hb$FrVXR`mJ~IyPf{~<>!Ou&S#E4G-+SVpOy>v z(j9-*zxlfD{nDQMJgjYh+HBHU{>$!gTNC71Et$lMdCtm1d{oAtv({O90enq=W6;Ie2X$A$)xIYCP)KgfN~PE>_s-;oo&Ja0UIurSPE<#Bn-tH7eLp;JfT1&0KS$q@%L7L5*p5HSfC zFNH6ECy4xEkYHeunDO;%&o9p>4SWVNKJOF*);)8L)r@9TdcWu5-CR=_1(y$Hb-z;0 zbE?gzcm+fq>rpnT<})dA^qONX zvB+&IEYdh7q{O9Q;-IjwQHkX*pGv@Hha(LWtxo(GwK%{wpUH@cMTenbV+Y672LT*2 z7!U9sQ*{?H2w=F<${3)@u96_&>99nY_oGLo+Sg1+p$pFhY9v3aa z0&_>G!h-{i4Bt7{qGMt&^fZPPi&IgLjHQ-@zxv{|_+Oz1TFJ!)u`#U-X(@ zhQorN<~AI5o3yjoA?rfKi$kJ^c_;E01xlJPs?*l^-kQkJpvqDe_Rw{)C{sggzp{m2 zAb+g#0`te*Z#>nRYlPg@4Rl#=vmi^JhOp1ILY3T(>k74@J3XTWvSA>>#GacJo zFr)35rp3fV1@%eXPdV0aa&$NnsMDG{NAr*5$JPI0B%VI>&-){>^Xb1{_j}QI*8V@b znyGi5q(c2Xxn0%_Q<#D`>`1cvex&!L-{I$%*D_Zl&qH6dfEg=663>(i9-9$QeC@ZJD4~^*`f<+}S_+lNaXa z#Rg2_+R9+}@uoosdyAsjtS{DVT!x+UDG%*)#2C2i8r!^llGvvoJaST@uq(>PN8&-y zfx~xry6pD+KOwq3ETlBsaX~NOIe-0Vu#E&t?2waO^U)h zoA$hPn51mMa_SJ{3Xf$D>bf@;$<02t*RITHy0yZIEm_MMq9pjV>xEeq1u7NYeke{= zk!1awC2Zs><0xzA<&v%z*%auK&eQy2sZh4$;b^zVeY<29iUgbIbP6byokq> z(LB2JoZt!GMHvxS?f!og6ju0h%=y$3*PI&*`V8MRnio70GBHuq+qQ9v%Bnew%)2@K z61_~8FY|W%@x{4AaK%bj>Aha_)+C%iV40}m!{or^*A*f>BZIARcBZ+smf!7%LCXbo z)g8o~njCKlR=J2yWS#2SwSG;K?1Dgdrj~+h))PHeJv`AVpWSs*?W6nRsI!^tu3b=B zUuQaFp3JJymb0nVglEjxjZCYeK1~Y$8g1f~wDNqD*_K7J zx|!bDw=OR-+qx=NH#^$<)`SZWRJAt=Ju%tod5DQKqm@&-b;ae)`6s7{b8t+{zk6xQ zic{%~JR96%*J>>-N;yqTK1?{%E?t*Z;Yue`1;y%}fqCYPOYbAEmFjQeM=P211|;_5qdQ#1Qw9jk%)AMf-@}EwJ0BSQf0kIAm|OC;X-$S*@T@tzofSnC z=C(WaTU-|1yroWTZ*X9EMWv5feE(5}%x5npuQqv?tTfbpZQNxn$jVrHEKgTE=>G95 zKR%Xr&OiRzWQ!DU!8gN=Uzu}$b4Yiby|zH)Y<1v~2bxzdZ#%#FY4+>f(|xOx_I&%# zW}EZa@OACuv#HxVg>!G^HtHv7L^}$!vs7{WRPNH6bYzEB!Y4)b(|hkRm9F@(!&1PH z`w^?woo5q!%HOZQ+uvBh_Vh1n&HV}Y%?^BDlGX6hjOE>RAC@=CTW&vL{P-8CW+6Hb6ED+TF!iSh%Jx847RoUvUeH0XRXWZ44tu9W~v6;jqttRtm~Sd9La3h zse3(BHPM9W_Da?Y4<@;#zm?hlte734a7B1qzU+s%?_8#T0t_l++TUM()Mmb=&~3J} z^mDBTr~Rs~ZC(FznO=3FV@-{+_|yY6`bCD`kzRq~Pqi{%rP_N(oe<*b7T&90zw+24 z+r>*PE~xQ+_u#t9y={8?hNnN4m2GwAHT&wQplUj2~7 zvgj7Z6))~z`aAQhok`WKt=ww@CEg!l)J^W(AMq+W^Ne!)qq&c3SiBVV^-r9Rjro6^ zamEpzh{G4pHjBJ*EXimo%{X47F`XxdJJR8v#0yy#w$`dU%)$aE`S-Z*(>=h_<&`dS z@)nEi^arjCb;m7T8JI2|igd=I^8 z39M{Au;#2}SmT5Tvu}xb3Y}^YmGLQbnRi2jQKi$jU#0uS&HD$gI%*#|7ytL+N?*=z z7d?0uu%E4ToutDlKJUQ$2a3vaokC85l4cDN6|JTM$5b~Q649A{d+RAtB{#8Sv;9gE zweGoEbo_5UaD-9P&|7lSLg|20>5`uB)++i(cr6Kd&>xVrPxEAY?jglBy`~@7t3Et< z^+ZvJuc2b4ql}2s=7o)nE=g+`Lro6dzT0?Aoy+NeXTzS3aG5Zdlr>)2XF3eq=5cl; z?=zjJ`5^Yth3<)axLB4jF`i4d&3pX&!TjBsaXJf?RA!xxU31Luk3&rdm&S?HmS-NF z*~z$X3(LKwiZX{9oL_P8yVEK+jqA3~8MhBCCewI@zsX;}kZk%yaoLg>r>JJ16W*?j zk4#P}6rQ-dGt*I~!RdJ~TjCZL#;^yvW@ip>dEggwNW1Ha{w()+5eFwu$3rrTZV#CE zaJU|}c$&Va&u&$Cujl`nVmXNpY)|}Ze77#>+VjPO-{?t1ALE@Po-XGYd_35%ADMTv zLEi0M%Iy!X2YnC9)hsD-agU8?77sWqvWGF^(cz2?B@w6jVh%H`6CNiYNilO`jNO(R zS>_wOM)_jE!HOHMabj0Y|17%gkQQqv6B*L%x9MR-Pg+vnBfDvHG!8{bEn|xyuNAdnFEr+LFP|8|#FJK0@nUVGMuqQ-j=rcxGhT>Q zOmwa7J$X;`2pdNDY;Kwem32dHUd}K77X8dy&?g;3fCNS~TvdKm(d0jGPHT-%eUDCOF zFzQ1?5DQTfXjw4No_E3^S9rS4QFDQZjvMAa z_;|?DH8cIoTuqg0%Do4dtT-h1#Zfmzz<{Hf=gt3<3JX@nu4>*~FO74*W^(qpurdE|G|xC@!|Pg*;qt&IEUTfV z;%Cc2jf1)>t}0J_f@RNbmpWNd>ghFy!E1%fPQK|r7TKH!vKRKvT(c*-;oqvSOB*&Q zF?;u&{_&zAYtDh)Y78rrm^@dmN?X&m{FJ-q6Cd}9%ak(OtUsPA;AmL8p_PmG_^+Rn zIS#NLIK?2nCq(sR_PmSPlka7BJX@W)sBv-F^V9=@sy-h2e;8U)oDZM4%%5@0Wl8FW z56w#x4z;?xk{Wpa;w;^blp*`;@>z($w-ZHD8O*Ax3P z!g!qieSCf-<*m1>H;>4%Eg3nsYgebqT;s}cnXw=@Z{^wxVJ`D~c-9rg&zE5;P&{C% z;C)$ct>)B#ds19sCuYuFnD=T`-t>nVyh?4&dtXX!I5T4(&v7=z>04N*E%Th8;pWNG zE4gOQRJEWBpSUh{G#BkWDm?YAu#(foFTw&B^v+o59yuuS@}KkGdGB6jz5iCUK6B=r z*N-Bu8TIA8ism#}ZsDrVf8g1VeW!{e^>_K`UgdgczDdWyXXPTcTl0Udm^E$P`cwb& zuX?=-vpqjeP3wPL{-1yAi)5a49a#75!`c;+27i9#Gs$15+~#%kkv{9=Q@@oC-^(i4 z%i8L9b9IAT0lV@C_I&leKB*0h3K|LuhY1z?o%H+AelM^> zbA9uxfCtOe`Oc?biCVg_@ixc$(>;D0cP%WG{*d*o*08(HFqC7KVjBPQy8*nxQJjYj z_|s=e+q=%GOaC^bFy~yM(Urn~f<+3?4Oc&0&0t<6HF?dIdmGnC8gcyzY7@P%F*Q_~ zd((55qQ#~EjRLl+OKz4{SiFhvI-~IRkD|%bPrlTamkyY;?wOKmS@oa+RjO{qxpSt8Uo%<=ahKAQfTYeBR*vLPcB8 zpE*26)yCJhy}7EkslJrYchwxd>5->DGOT*TV!F&_gUaU66>CJBKD%`qzw2~f&UJ6g zf>Y-!S)Z=_TyZJc{h^H&w43 zWM6sczy;s-mB$o9S8bdy_oMKP?xi6M_UxG-JFPPzf%k7OmuPF@@@+4fb&qLW=Te%~ z@GZ9g-PxX-d*Zc4UI2uc99!%)?YJc88^7f*jJ`ag?mxKzEG{kQ5diQIypHO;i#DAxli{qryy2Z+R zp}ihTVggTHI1cDvy`QLV9Dbc6bw0aozf?+hqt0m)l|VC%h^{F0$JKWhUw@h`u(T+B zcfjwwO+Rhq&HEmhZ+oCWt6`PRam!b+R@=7KoH==G$-|uArH4w6CQ7XIPX8oz+(d}u z%dHJZ1MS)!C#jgSIE0v;Ni#NC)A_-A`5a%X|EXR9*Q~y!$UX8jC=zde6epZ(-xL8w^lD|%6#r3AZsv{BcQpBtt+pdG2cJBh<&T|eF@V&^KZA!p0R#% zjJA2jteqyiE@+)MZ4G^6x98U1K#TOvAGe+Td0SO5!@W{^x25vq?Q{H%7U`ESivQFg zRJp&)coyrgPW6jS_boN$tLAtctLs}WkN&jS`B$ZQ#`4Agqn4)c;=Q_JLH90Y_g%G5 zrcPwvG&y{F=khAvqk?m@tL9HnvKKR2t86%>dK>fgmx2<)TDn0=5t=+2j2EROHq=kE znf+;rzvQa$PaO6Lv5#^?&1ss!AOJ z#(80W^FlhL8ctluzRfK9=Th~q`RX>!z5d%L=U(%_6wS!^E2YcRW6j)xP5~Y6JL+$o z@+VxB-*ZFVR!-8vU}w!`^L1x#Tuz#LpitZEd_=eSlorV~N4-*NH_d1iDcHN%{(|5_ zn~A!{Gj9Icx;>CN_~$lr+rBqqJHCmXW0?M-Zi>i{=Ic9K<&X57c;a){|Kj~Tff8T4 zI>+55x&KaG-YV64-86oyvx$11*5(A3|9^jMT!W4H znlG%{>eZSy@%lUejbFQtr-VyfmzWaG^z!|lzW#^KR;Tp7t9|&n??2o1DIe4i9e3^M z*qVOm#)}^uKX;fX&+uT`D6w+q$(t{Ka!P4gaap}w)S&QT`UaD!DV*9W4qB^LeU^G{ z>V5k5>)+fmIj@Z_80e%Ibk06~r{*<}tgfv3gj>(QZL`^XH|FGDUOBzM+L&oE%XQc3 zJ>UE8U!O;Vg1bQnU%&sgdFSufFHKl~W}gW2Uq!BhcV3RoJks|J7A)gwD6$o^N)ZoC z+|?~({VQXG+CuGqm9zhIbUKZm%I3tmqy^v9T`bydkbTJ5VWZb;@UedeJb*W)4*Hy`euvoQEAyT6EFRzIaHWh5Xa{Ssl0|pU+uBmHoMIc?UIKAt!4^dB9y{}RQiJxxDZ+To?&zBw899xHb- zI~%NVHF|b2jH_eX#$x@7qxlfQ_*Z^^*Y<%ykYt2m#@uxVOepcuk#O^-M#)FUmBM3FN~YJx9at$ z+28B>TkHNF{{36r%dWNj{!jG@bu9b-v&Hk|ww5ihV>9!ZRc)to;&9c!NRGsi)`!#M z+ip~H#8rxNS}1hL&YB_DsyioKsq4kg8FRaIJbozke7`Y6w%m3}nNpwmuNyIr2^v#8 z4cz29Qzm(tC2>tS_VGtRo~xc`>eR5flTVucuBj$-#p*3xI$0twQpnp#VS4lohdxav z#)y5K>2r$C-DJ>Zo598ts=DIk;~A_v0*(us_`EU}w#jv6Eb7ubm9ej~|MQ&fv3w`$g$e}7mlkVJYxALU30xlS}cuw^_ zl%Tu)*}U$&T~lkb1Jb8XS)I4%)4A-`+vm7FeV6&+(&_yD|KhUp3x5U`t>?b}ue;z7 zm$K9bUWNy12M^C$=fJ?QRWu>ZKST&JhfrhsM1Iwxt!j4Rvci5aZRFiqUjKOev&X!}W_Y+MR z7-gM~9kiXmzKZ# zzBu_XgUBr*oe2)9^WPmbW7(`<%iti`u;lTfA*SiE{aLkJW5hpeIiJ9``JP3l`}_yW}CFLt=JvHG~#r-!rM zbd}EPTk3uKo@gt3A%b7^+Kht?+tLoaGkjI8$KZ8(f@}d=l30aL|`)YUNd?8^;<7Io>jOnItpp5_kQl(#m>tf~UVri|eEbkJ&PQIld8N zb=x^-X+_q7-nUE*4XPXpjKM1-gbEgKV))}G$7rxfgzLc$HkbaE$|Z{2w*)54+n_z+ znZN_?f8h%y*KLwl&2fBKwqjZ2rcJ8rYEorWB2Ue_GKrUi!C9|)=V=#-geisr493%$ zd>W@-5>T*7GqPlw$Qi3N>)_4#lYW(Rv9)+kzpm4CrRrx>SFZ5HWp{ebC$spe1bkF| z`o-Na;YSmzZ{zHDbC&IU5w`h93-jD0g%#N%4Bpa5o=tzFvOMgMr-53A?}7k{1IF$N zfk`gw|EIpPyeG)l$-4IC3syWR|_z7(i5$j#Ws?8(C7P~qd!ASEKu z!0Iz4qp!G$<$zXLb%W@nRSvHsI6v&@Y1qKXu;YcmwOvMnH$qkl72G*IW!Lq2MIkKN zTibjcHCh=nt}c`0el4Vw863#QpmNmVgz%lL{>2VKyu2D&kJoXWV$k4S$EKkBDKFxB z;hAC%?I)b}xyGUECMqy;t_{nbklGN=D!8>g$N9b5>w^q7MoIfwJ6S9$9T`Nz7YTYW zG4V~f&HN>VgZY0&L^1cphFiLZOsq5HrM7UhEL8fwNigBSYPJb3Yzz&#XU@z%KS|Jj zy_(}>Y3NiUiZ7qzw9h6zuu}afo zValGy1WuhDdnQCP1-S+^ygTT(-Z^@<+EK4ZA~EJo&m|fh+Y9b8{@C8U-dX-)+MY)u zRacIjN`1^Z>$Va1x&;g@45^n?8W>pqa2`?GcDz0MSOeefDT^)T92p+%xZAQVCpBBYbf6o?^#1-lU3? z3qP;^vWvk|J#dGOO_znT!jYQ-4;UicuD#Fmh~Y43U|hAMXv*7F0eZ6%&#bFdpA^Q$ zvgXUgLq;1knXYs*@0aXjXoxzHb4Y9ZnXuotp8C#~TJd)C%_YA1DZC-fZW*nwo2+-U zOEgyAX3;3yEq#gW&fK=$vW-b6baUUXd$ZCu)(^p@_on29T%=XU3S~rac(H(oGlI1yXYWi?%rAjw1(sX#JQW*T^(4E#;8*{eJ z4j<+HEH*0b2;f#w_nkTUuFv7Af7r@|ce&gBXT9sP!#vo~B4zjQf+??NUS661;%7#k zUCAurU0q*W+@!s3vu;Q}_-e*MtLv!_wD%&nudu(pTKK0A*^-O==SvV`rNPJ$*waD8Gx{iI@cG=YaIQ|)L-D-bjNp1%XeEZFL_hX<(L{8*1hFfOSRvVmV+ER8dnv0DvzqO zeN&$PH@5hm=)~uBKOaV|x>EY^81>cq-c=|3XN}1k)h~r-^T%TEZElxcu%y2TXDXO*UG>at9wni?+ zoTQKS^9(Bum-5(rNUUBQb6h#$)YRZd8(8CnMcCLG=1*cVec>2%KwG`6KwrR~H9#Uz z%$oUGeEL;uPc_!i6PZp&bBY#3y!p`5pxCs^MczX+MS4l12z$=u3$69;jdskI_Z-`# z!rC{Kg>Bu=bj>W@xgwR}xuc$9$MvrrY1i1Bm(JsbJw?W=@bTm3(=1^r0HB>*zh^y>d{!PhHRDt4E5>U+m!v7 zHgxfbF&31UU3pOP?|Ib**BUpcqU$GQ*i1BD@U6WtA>O2E1$#$Xq9Rv9?=R-2(_h$SPa4RttW=Dg_@k&Q$Ad$wQX??b zPft?(=61H%jfTIRyL4J6XB#qf9ky`IoZ{X&#dGBp?~_w}S5A?(WUGEL`SuO@|A!~4 ziF8(dFqksUVRBp2n6y$M+Jf1Qm7`(?)8rE7yORwqKXmR-ap<|=;KkUYY~YzTQD&>8 z+=|QwjRUjzf|(ZVlor_RUXf`mE5W=cN%mEU?jFw|A&n|~SC%u9%wO3utz2hXZZmro zY9-+^P0L}fRT~pC!(1+*IUzgckK9!LV#1t#RgI&O!BjXhLA5Y;D$CiY7Mrex_L?*w zU=9CYSsFHrB~0L>CjVltzRTen!VxM5!Xui)1vf6>{1xsmu<(Iocy7}ChozaphLJ}T zEc%>V7A+0Q-H^s`z)1Xvvq~3(+NtKu2D3{$=09E#I#*;tuW_m-L)ZcpFH@@pHXI8w zl7lxdjF2(msbLM9Kh=JI=RAeVF3sowe7AVTeznCxoi`b!$k}(sbz~E5uba)TL50SFO%` zF;{s*Tyt}~%+WxjZHp|gEx2aRWZ0Hmm6d$PD_Q$NC!@N{+Lf!S)jN4!v0dMqWce(~ z#>M@p)SUAt5^W`t#9s!UUFs>%wobxjVT2o#_Odl{UpskMg`DqV^0Hd}&vC}llhX_) zbWd(e*%Q`1{aDFrHbw@utn;ZRdDpUdX3Nx1W5^2NeRPFOH`ztu;l}xox_Zs{_N?Hw zPRMZG($@7XQEPUF(ua(-4I5uPO=DmyxHr*!heD>HA@|t|rkT?+zeHJxDm!_6E73FF z@=bUe-|ei#qs~_)vZuAC{x^K>c%(Q(x_iU%t45NqU9QeBKN94!AY_x>ZS$2EdWsZR z%dMO&mpHvObB?}2Kg&-|_iZlUX06gl3)y%%Z`ZSed1>oAuIGLIk#JopRxYLQxmbRG zn*DyQD#0(CJAao5eaJh`y7Tiju7>KcoaEx$Pi4781X(oAl>+*I9?So;ES$yMvn)Ax z`R+6(hF$*0w?E%e^skhGSHQYYIrgX8&Ix6yB~y5sw3%jP7mB6tXtmz8b4S`Y3)jru zld`3Ye7(ff9u)18mO1mIb{fNmtlx7Z7tVVfvEgL8bW{Wz%oWiJcfZ68&Yt8}oo&y|f_7|Vr z|MkiKT+W6=o@)F&2kSHrMmrr8)tMx&qjq8SLBTy5pBeUtKR>wk(#&IrG|~+ZrG_7R zW4J->(Tv7PZQ4E+Z9fk_TCTw^AZWrHcEVKqlDRwv%wF(Xmu*!&N@ZPyj_d6a^AjwPQtmODq) z?9Nf8nMXzc94X`x4PJA!^yJYpp2=xE2UnGJ)bNNpJ5`pPQGcv`LPJqGM5nHuXL{!v zA?~RYwwzMG!F)31Bg2%NJN(XQI{!Q|{fwY*!^|F@hVMlp|4%)q7@eOl_|7 zIq7-u)MlU4TXR%ZBBm|jImMB2VzCx3o!T zTGuiAMx)?nCfmw$Itl0bHlBO)Mtp0c(Ge?a!4{*LSELnGqP8_$*mYAaYU|<_>Db&Y zMwtg(TtuQOCWoiYYP{QQq*-yH|L_GP=d=ILY}+bmofzoW^TOC=OZMRo9bH{TCuWT; z?6E9rZbi)Nk0;yQa9enji@{7*elA%;<3ftCB@O-z_fZ5*XQ7?OMagBTC2TXbeWcz$fpTbv9FCa zwv=eNFljAzhh_i2S66zu`CPxci1)^k&uw$hZcnLo%uF`C{z-iwbI(5AOY38gOnq+p zQ0M0QLy1>+6g3&~-}Nm}G01NGr1d$VUcvQ_i-^;t6m!;HJ03qU{Scb({#K^j_wJE9 z%s2Kh{nt~oty0>%GSaknBTuBaAfp-tyFL?0X`k|xJ z!=uw4im$uDd+y=iClBTIDi!q}o%epE>UT)J?~&=BCtI4m`eF&N#>TfOe4^Wn;)4_r2v(@@4f1T;D3Bh{bJ3T$#JV35~`=2eZNojtn6LaG-XS?=_pA5Q z_?(u%o-O5VlXLE)2*>C2)ZNFXy6DDFv-r4g?s1RznSKf7EDCDO3dZdB&6gam{r6nz mo11^u%k)sIX~&*@EKXe?C9$Q<{l!s+nEp9_`=u2b7_0#=Z8Ty4 literal 0 HcmV?d00001 diff --git a/xdocs/images/classgen.gif b/xdocs/images/classgen.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ac962689ca9e9bd5fba200f3a794f5842c8a3d0 GIT binary patch literal 28994 zcmZ?wbhEHbG-BprdgjWoY}vA<;%;LFYn#Ew`b3ui4!Mo z+_>@h@#78-4zp*^UcP*JLqo&<{rm6Vzu({A|Ni~^f`Wqi^XH#Ge}2M*2?+@a1_lPL zt*s|coT#s_ud1qAzkdCuO`8G&0@~Wz{{8#6VZ(-=o}QMLmi+vDU0vPC$jHy1KkweX z+t1H$+O%o0v9T{+yr{0OPDx2gO-*HBVEFUr&;S4b8HN;4{K>+|z~IWD19CMeP8it# zH@G%6x3spkcXW1j_w@GlPnbAq@|3C5rq7r;YxbPE^X4yDxM=Z`rOTGDSh;HTnzifJ zZ`inL^OmjKw(r=vYxkbL`}Q9=cfF5Czga)^;~&qEhi4Xh+`OuDYRgNTx%1kr=6acA=&TIcd~NfrEvv)hy|;Gd za&8sAwlTxDsJ7Hh_v+Ty{|#K`cyHI+$sDiTT6#J>InpopH`h1z?V%42+H)^wW>~oK z@$m`D-t&BRZhCrphH>^ip2)&`PSt|l_r8~3et2=k)5@??E7Q|gk2CC;*USIyxza*& zt&W5P2U<8d9tmm$_&YMPa!86qoU5@c+OpJi>%E8u$CD4w&J>o&`F*A2mhx`l$-Mh& zY(B;ptEWs@(AdJnFQgK|u>Qb=Dweh!^^60%TJEv&Tx4kY;;4SXSA@sVr9jz`VL=T; zl)6OKk}bz>*ZEj-B(!i#1U$$#nwTC}DN?rdo+CHUM}}q>g$E8yCvKWw5;$_wd2zzU z)K9Wb!WITDEIMD?qB<9Cxz^C-cXN8|e@2!k?GL?N{wY1`*y37wrIXF~0)s6Vk0PVs zH_ZatXbiI^jb&)W4sW-dEaen5Z(BlV~vY90Lnf6FNc}S%`Yuho#CwV!GV#}qG4s-ha=`W%mzXm9hlfe1QJ+exjZy& z_8yx2Vymsxg@)?2b_>=rzw->p@nhe1H=Sz>`~5jCDje!IoH4gE zZTJkh{8{4o9v)zRCN+D_23CXaG|!#0mY!$kE7_U(f1mre(+aGTi>*!*PF)IQB& zqVR72y`=2rS3ZAPv33#TyL9>5BSteG9hDZXI=PV5(!jBslV_Icr61SKj}!~tad+AO zLFL6d#?Jz09vpNRp19@yiES@RR%t$McDUs-L)O2^=hk=C$A>F9{SWX6Jor@h)9|F+ zy>@>G23CEx<(q6a$?+M#$Y*|Mx$%S)!{(=ruVs?#ZWw;}5W!)x^7mvG-4BU#1VtQj zD;&&~w%EH=SIw{0F)P@%M&xvI-t=az4e{GTPA8Yo;&!Wj-tV$Qz5o9sxz1e9oBt!` zyqWf4hu$3lOYY}JHbNWZYi<6=<;G4IX_4&z?6O1tuaLuzNSS4^cakqW5EHX2G!$r@ zY%TqHg4>)wZ@B%x-4vL~uzfDyTlcX2i{v+{gv;MMo1DJ$MWl^bfeO0>LrTKs6U(_C zX>8Mc(e~NUW4XYCO^mW98MZrfaOoE9sav8^_nLW{O^eEEhPxlyPIj|@>o7RFlQEMi z{q+6bc@@rkrs~IPZ|vvZYudu}w>v|A_sly%F7ihnp6~v2KuJ)^;lM@Clbta-3j#hR zZWU{MpZ%F3<*Lkv-C<8pCmh~AxhCz!wl@*&8P~cGJbhNC8~M|NNhD#ScUt(Iq=lOQ z^E_NUM1Nk?^w{Uo9#^B-#&Ln6F*l_{R5QuGC6qtvmSDcG%9D4qM0Q)9UEC$&J*9Mu zhm7dkPvwcsi#^${$m}ZQ>T{`n_#x!kytjKN%Dpa{xFheRX6!q^{_unD(|4R$q2V?$ zI3^_EZj9Q3T3rRZgR3sSxVK%F#p0s5@|NJ2uiTA%FELNs7Ldpw{lNddWwxdKDOn~l zg+1+>&n@>YPH#&u_HnTdEy);CwsA$2PB&7@MnzHQI7Rhp|a_RnLIqrJFD(LC1 z8%pvMCkCzKp3&b`>CBhKA9-FXpqgvSEpf90Jr%DXpPKi1&8dB2(ZVNk^h2F5&)Rob zc}D5VIZrYTSZjDJH?0ak$>BEVM^1XIsT9+a8c+V876uO5K@2-zvDwX@X`uLQHOsGG zg7YgIzRdjcXZ}WprGArHxpPul-Scj$yFK2vM0;cE9uOv6cEgF}XK^0Zd6R#8W4wocL39E6kN`lcg$0-$Lot zaXY>5?6AC<;vRHis}IwKjdz_VeEczW62}Ft*F3u}%&nb!`oR>1^No4lUxP|sJ^PuG z;M&0OjA{O!C8bN=?paavP4RQ3nasoYe&?q0vfNpgCz4h5g=@W%&xaOc9t*u^0r4L* z#Md31W2Km?ZEvp9XS%apM&;tK`L2FPCQkhC&X8g^&GlsVB>T1BH{4;}D95`yZO@B| z*1^+vuBzF%?WA1_!_imD_U9)~{QBpmIn##ODz$d=+j$@Ob1?||xMv+$Af>jzQB^X{ z@$Bc4&rg+`-=22-`Xbzi}mrWCZQ?DV)nb2=CyT}DYvU9FsC^}YWCe}r>v zIrPb5&W@Tl$Mp;6SeVL0*lk>TV@K=UYbo*9+aFB}oZB^FWyR6x8S#QK!mpFYS2f6J@5Zn9hcwcDEQwU;V9Wa3P2?On(`XK(+b?M@5MZz@Wk-5S=U zDE>O(?8C-x->SEJtd9yNsVYuyH!Cjk{P4l~fRMpoCCmRz+G~sC zQ;yrNT52Ho!%5+WCijNY_lwj_FGYO{R4@y#|8CCnQ@z3VVEr-m=0zWydLI0*H}gml zZ|4_nb@?mIn6W58f2l5iX`rCHqn;?^wT0ECOLY$k2fi;;KPYT(IMvwC!%|?qK9Q-cUwS@bw|(Q4c*5qwD8oG21Gk;9T{p#hWF&WSQNC(8YtsPK~Uw#I~S z%ez!g3O?)LW>1))aC4I0&q)TF6D2sgq$DSsRZg~eIZ^3lKhw-f^A-BlBO6#M`yE&I zcQ^E^znnb9qtEB&l)@L2=P^uitn6Xwl)h{+HAJ;L;-;Wo=M*N6sdE*kMxW$Q@Z@%> zoaDBWBkty8<&)DGEvLB|P6_9nerQKu$;pb`pZ%#jIg=`ZxIX7qa z-Ph#2yK~mdnOqNl_C40*c)D`#^OL=AIXPe7ocX%FHnOF^!g#C%tS`7a{p-`p|3 zZ^Ha(oeP#;nE&{jx^#uHypb2{M0u9ha>VW)HLVJ29fu~;EkxJ33K z1JhwcS*|==Ms3f<)`g2BdRl}-R|#@B+dsQDm9ue4$P~Xt&l0{ClpZ#Bf3%1}Tx$Bq z6^nQLoM{`i@Qiz|1ee;a@MH%w(~m{g*A82M{G|9Psp`eoh%@cgb&qq3wD@^9Xm)b( zGrg*Bk*Z{QVK((y$Re?tb4gA+g_pnEX7oRk|Kq2;eyPCOziiK6RLwZFRQFU((kk7x zi&jOpEi}#IZx2=oS}MqMii7Lb^zBw$h7zg8o180BQvFTLpSd~Se7w5&kV4tA2Hht2 zFKia?*xe7TO3~3^WMwzbWpfW%rf_Mx@5h9-J+J;R{JmkV-{;WNyJ}u6QP^|D`bn|! z-i?i%4OUE_JWsJl3%>HJbaOIqT2uB&mG!z#=B2dcX*w&OFzJ2;M^cj(q)Tp(p3OtY8{s=9TmHt0Re)l4qE`btL^NPtz z5|1V^2iQXsCcRy7rbTd=8(o&m5o}lK}#ZjOIh=#ZRog~=&kK_N6DOXLa8j< z(%r1u@2ZmK9I|V)+O2&h(N}e4$d$0V$7R>r?PJ{cgg;m3nyO*>c&+Ns+5Z((RHsEp zrWqT43f;6w!Su7Pbi0n-w{4HF+a1xKl3gVn9_7?)q;|1MZRR7v1B@Cz8&@xyP=9BM z%9)LuUtDdByk;-5dHtu4(&sno`F(CZ*{bsYP{99-W;ZV#;J+sGt2^Y#$6aiWCPqqu zXCH2Vti9)*)>=6pi^GRxWY-j}P1<1Sto&|qk?xJiVx?f|Ge#WUUI&DnUmp3tO>6Vs zuF^dzw~8~9WM3~z-IKjfeB$aq23~s~6$FLa-!iXYPt1QS?Dbb-6MNzQ{ks&uOx*rp zvU&NbLu}l!Aun8}Y+|_fDn%zbZ0;p3KVinq_N|fI%A}qs=IAUFiCMU@_#oS2$2K+d zz$=={H96ttZh}H9Qr#Kdj;_(*3Ekmc?=~a)q*QLB@L|@8+wDFTuKvcb`>>Mvp313i z%bLyoeeUpona$y{huNl+v@?j~yW1S-%`u(825m&^?%fTVcrt&#w zU1$7n{2sViz1qw~$mx@5{q>Y;gV!g1GoJjz=pI#GUKnF?YxT)xM^CQS+2f^tM9lGs za{9@7C0+gts-{g0OuiQ`Sn*#8F5^njJTNi){Vy4|yV9%&6y7NEGtZU?omn6I$bqHV zoI^K$(QVD1=FrB?WjveW-L@L0x>Pe|IncG z@^wyQ%V*yho_7Bi-uQ>pP{U1s)3Mh^I=b7E;^RE z^QU%6Zq9=}Nt5I>aa*m21BvOcf!t~I~cu6uIsa<}=jAcf=J3$>mVm@W_Yy&RSz zRsZ^v$KIAL(@*aBmyi>3x7eNezE^Lqe|JK7^^v~^jaV3tN5+^b7WU-!VIS1pP4 z?4w=$hN|idjMT)}>1Hzp_bvJFIp1lQ**?v@PmgTpsNWLOVE?Dta7kK(PfcP{CGTBn z9y^kL7!#AbngQZa{Q9EjiT+--}nk}1zd{!YJ2wR zZjQH0r?6T75n8V^NvUN@_1-D+>#Qd1?9^CXWl{aD=i(w=N9lEbQ3u~OWgV-qkXPAN zroHzc!x{I8mQ7MN+zu`OEjJd%885DCjd0zg$+Td>n~i@I*1J2&98ozDp&fmlM>|tR zA-iO)&>;q<=Yjr*_E+c~?O@XNePlF`uX_zkT0zR~e-Cs;1T4FDcYT zqd?zPQ`r|Xyjha}-Xg?iiRURl)%T5NyZ7yQZhdrJ)8!+MRVCA|>-^o&mzuPyNB4S? z2N%1+--T<1tS{$Wem|+>U9UF(fq5T)+9`e7%@CmT?0=rX^S3&STQA=%{UqDVa57x^ z^`s|BNr#Jsue?#+E&AAe^K7NltvdUpLvq*NV3_yu>xPfLw?DF4JzJuZ_V8a!?z5we zs}=m-pYjqj-tef7D~Tb0nttxIH3yVZPX_HPDtWg}@5_5R(Ukp*{ro0fh~seSsTQ+d zHNmR2wu}GKGo89yE6?(L|9McMbJII<`)}#~U*xmDeB*p&t?^%jIk;YTmA)J?n?r2`Awf-|PSHNRR&}wE3s6oS&!X&#ChlmEY?-`RvC{j-OVqCYL$#=`CPf ztIt=__@z01>Pdm$mme^mYWTfJpRef$C-24IrGkGB*^7rpvPf-UJT5o?XjEVy%b+L9>` zI(U2dJG!P#>Uwo=!K0b2f)5r<5@}@>ZV_Z#ee>UchWNi+9vc=oW}M>FijfdtW@Kct zF_@E45WPE(OGzZ*!%Bh1UYBRJDFQ?lv*8hNQ^|IX3R<7qk+plAL_; z#H3jdM2!xt7x16?DN9H&HUH%jCr(YTxv#h-uC9*w?|SysR&5<#F@;SJ9&BA>&@HZO zC~=7)mC3_Jg{Sbs0Y;0RC2wcxTu7L(P%&F{W^qD!K%+0KifzJ71xNQ{HZJi)(cfj2 z*?)5IPOFg!T*kpE=3B8LWA)9;XV@0SovoVo^4bRGum+BeQUBlEcD=A{>5(G!m8>S5 zzCUE=ocOR;=tO4Og1oh-4op<@Ec)On-EaZrBx$r!``or0bWCx>rD<11ydeQF4 zW}U{G(9r9V;J`d@Zg@z5mtNA%_UxNeIHFwyuSU1|Gn)EOev!N4Br{8k=YfJ30g+Fq z`sZfG^*A0YZ(w6MqWOGI$+gVqb1R;$d_J${+so(k8`!j7%$3@b`9epm;{O79msUBg zs}mTtCOE{4XgGLH_etUs3E=U2;7~G2g5mNCmBh}zX}XJ+zbs$cq5Nuv!p!Aq(=4sB zUa!6NVAbkc$%G9n802F%ymp-Mu1unFiO#hIwNt;gi3?6!clB6^=53hACs=vBB9xbw{>T)eRr%ow7)xUL*pI>(b>~%v}R83RJkkZ&UN6P zZMD**tExpeiW^+h&(B(-v*x_O1Oc552jhek4F$7jdUq`QG^OqR39CcipH8yIG8|st zv#6$bpLpk?8_c{*oQ@=jH#KkG|LD|YN$UwWLl-Wc;V_4jsm%4-hP2|RJ%);$A<|z2 zL}&dMZ!DUndve|BnEPo(*Awi653=fTJ20>%8Z#H4ky`mlC`R6vC;86A1HKO$mI_?B z=x!_O$by2bnlnbUuB3VxC<6bKd!5)u&&ao>cq& z!}0rnf4;pwfA!z%=>-RV2~=K?|F^bc{vS4v16MBcH@vl0VDe|P`u8`Zkx6F(i~0>- zR=p2ZVtW$y=v{F5*ZZHZUeIUmCoRK6J7#n=O}f(1i+r3I|a@9E=)rtx%-?v$w-~YLD zA>&2$$fkJ4X)3FJs2XfY&G`2O_^`>k81qK=ZhHbK3{EXd+-2q|^lh|aKQ1?4ptxy&mJS~F+IljDiAiaJVt zn&z||@F_d@QmOcm$Gonc>~A_6^u&uM*K|fLcKOF?mS4shWI>VxEiqK+LE7wU#h-5k~Q_aW!gM1sG?{l_xZ4?oU?=` zEfOnTt`y+3sO#30GnhX|BE_8rpubRNwS{1GI_xxfLR(i^X ze{%3dzXdBIbX%56aa}WI{Mdb@IxCoesolNWg0(+_vK_;ZhaR2iBv&x;mCa|azL>Bp z>#Xj+4mfd8-$~|~@fRC@%WG5SoSqXFh%*43WVQYJo?auRiJSRKgAxX40n zQeT=+WZ$=CrJ^fU)E1Z@3OF$J+k{BQ3^(uVhr(9K{C=%E&He1@d*>AQe4d~G_?25r zR*r~pL_^HBW+Cm z#h1Ts{IZt8pdo1XuPZD3wyp|4`zmbrud5sSwysI<%?b=o>DzH`>$>u@uj778bshS! zbwj(YJKu+f8z=nCWd5^fMcud+C>CHQW30fO8U6d#4LP$7A4?geF8sRvfX{sGM42AJ zj^B4)_-)@6=*zs?? zwj9H6a|^70-+r)BV8`Xl>nx8Nzct zoa?K4d+U@t&#S)-5|q81s8_l|f6wdS_dDy?_=#?ckJS=g@%UOd;}?ZV8d>gpIt0RR zUM@bN|H`>?H_M|qPA-L)CrjO3zOU#jUQ!>d#cohtf1A&Zv(?k~$*vA%r85?WfxbR9 z;TDEwb|TL@UK&hPPh`%JNj6k<^=TI0T`S@*c+I{`DJs7D@=HOtojQlqUZ0x%Kts^t z(*OKbvc0QaX6*Y@>c(*K+f@5S%b2EDFMhG4aHhJ$=W2h>7rXC%f0^+wXh}Zjq4Ouc z@-Y5)xwED*_q5#&zy1G|B({hwxYd)qSfc5vi9USoruic3W(#|%Y|GDC5ziw);o zIq#X5S(aDu9Ax}nRCnw^1(TET{Ou;sHt=yy;D5L^Hb_YA;6jGIM>y=Z=!$(}(D=x} z@t~QP&0s+)-xPDZUv8YI)myv;O(!VuFLjdWS|IoBLG!6bp*5^gAr}7ECoyy>@bh18 zw%6c#pxS2m;=jc-A%lxe9G5RiAK%(qlGwCLJWF#&J9{Fd(SxSV)A?*&+n#K+d68&1 zX)&MdQqP^wonJkaZoDGcp1>c!m4h=N>5MYZobQG@g=$w8^7E?6gk4qr`$YQN0WVob zDXWJ8V$34l6&|Z1IAmL+4qZBlp{)u zn}l|_a$U)&dBY+6?nY?$2C?}KN=g$sx+eDNI$fH-=Slo#wBspqbg}Zsxu_4kGhBST}wb`7uMr?Gi$2LaMndEvAT1aIu`w<|%Mw#grolrZjA=(+uR_7wDmR zQ7ibT_renilAfH?E-5}YoGHS}*?m#aKa%r)MVM=&?6L)uToWgK-V*HHH0y4LiFxtN zg^aVK7EjN9$WV7sOtw&^<-n|42mf=lNXkE2E^u_GK;W_Bu9IcQC7N|ARlF}Vyl^ru zS!jMqlddQH#Zt7|mTDN>l9!MW5kD0Zdf^ci#cBSg3l2yJ#X zWwDrjLv!vbh1qvH`K>Ib~Zp+m1wScW-fs;ynCPj&D|~ z0GB|W#X^x=8EgT%8LX)$TxD+$cuG2}gx~rv7wILCyJ{)R!=kuf#b;lpa!-v&-X(oM zW7&cR{tcI1#Wyb7@p0MDO-uhxC@bDIqx4p)o00DoRh#Nl%T=bttQMJ)skkC8cnYhi zfX<8+U0N&O3anfpWj{koy5*OR)(d`*mn-L6tuo$Kxz5UQDVOx}SNvPMR{c|0zDA0N z-GGVl!|DT4YYthhITE$zSk;;nv(}vIVmkVO>C~?^7o^r+vRZp3YK^kNlp`xw>VD<# z*tPnF`09HR%N}sqZ@wk9J<7U`i+Ap;wfC*oO;K3&&dcWMDXHhbj9$LtS$%5VTdDQQ zH@QXu^r%_H3XU*N`twOqTWbl=+W z=+}nB!W;iDTsy0j_w}reQm;2gFYeUXZL5$iCYo*cy^BY}AX9BNH;?pczTKM`FKwEw zyvdK1cad?v>2Epd?#;5RH?KInIqu`8EaA<^8a6ub=H45%HY9p$nD&}8UOeZjw#MAv z8mGPX`YxWZWku@gMJd(Wij)%gy#ys2wxwrpOQ~koY+rk{V)MFLn?0mglz4Bcv@SmO zQ=?WpV@=lf#a-JQPxE@+=4z?l@#^RHwa0hVS?_SI-tNx5^WKCV`wVtY`@OEux^A|1 z$?jb{CS~oIAI&jCd)LzH)UIP0+NZaCZQhmUwQH&N6tU$yH_zUb$F*boY_WB>?KW`# zFWVHoYkBtW&8v6q+P!9HRO`KrtG?Xc`7qpu(T#rUh&=?<8C9@GnMm_#F{U44+=O+4K@EPSafx{kVmo5rAo_*juKT1 zD+7Dx9JxHNTftKG>hTLN#dqF}nQvgaWa06i5Bru*Fsc7z*kp5}>GetrpAxH@9X4yM z+Ar>9oy8f{VdBcjXKrEm$Dn(vgK_`G1P#U$zgdnJtU9z>xPRIO)q|P_0guJ+Fv|EI z)ZgI4x#`WklbcQU-8|W8wKZP)>?NKxk=8uX)@N_bIU6dyE%(fR+pVWMCPzGR;c5@C z{Ifx8_5psYms9mRP4jzB@0`8w5c2_N(WyK?!j&YNC$^vKSa8mpS(o?n8H=Z90<$-o z@7eD7>Ex6T=Ntt z^7rDWJy!81a&$*=lV~H)&hO9=$Jc z&ZlPTvy^ie6BnP~ac*hBk{OpSE?9kK*BYzVtzNM^PF+o^_T43t`%&=pB1OX&=TCoL z6mNS$QvDih^+Ark%IUpV9vXzM<>@`;=sjJR-}PX^@+Ob-DL?*-DU%y0@w?!pPNPag%&nF=r-Rnq>QR~379rB^C^6lmcbCe%1AiwM z2Xb9mYa&!|_ri?3XU^PZ@x600;m$jwo4pOS-NJTGZ>E)=6r7eL@`js}V?woK&qCI9 z)9%Wiuhg}%IVjk(Sx@;RryxVDf#btA24Tf*`;zvEaLGNg-l+HO&W#_uo6Yy$Ke2bG z=AXOScXnvr+oF9>@6X*`D{|);%I!6-<1w4Vo4QupeBQAN-pAJW_-*IiH?`Aoez#G7 z-YxfYJ3Z@oa$j%D&wi?vUbo}Y6aL>%tmK{s**)F%>G5{Pv$tygKg;M_bM?(#?nb7} zf6ofy)}+jPQp_hE!?z*MPbWd{S<J=2%z7@m@wvyn=XG{54RY(7=B2j0YiaXK z@3{A9+U^&5w_g1H^&<59^GSR=r}QaL)0;Gd@8!O!FW%jH`Sa7u9n!B_&0ozvw`18l z(G_vejrCryaeVdo*Q;$(uUFk$Q2%aq;lI}z`<@A$6UgIxbFA;#mblHuD((eKo-Ryz zEff7D;NFXqd7FZ-WV2joVqtyjru{ZP@8#8b8>grSIA#0Z@!NTC-Shc!@3>aGF|~#~ zkK19n?%jiZufI-AN)=A{aPL)n_v@PncDdxef47lw-ywUG?00|UcKnO8-lg~9onXN0 z&Hs~hMBgvi^+Esg2fq7qvPXplnMuQOXB-yZhWd;WG`|Be3pzpi-r?$^XAx8=UA6h0#Mi=#1@ z^YiM`H;iX(xJ>$2QD^&^UafUVi z^-kQS_u#{#M5(wB>7CQ6ZoRbo^l>-8l~$OG#JLv_7C-Z^=h?s@^^3Eug_A??-=pHi z{0A0G$^Lh7T;k2R_z^RQ3y(0H5Qj?#4`)XQCyxt*D~=_$3q_gMut=-~EwNq9&fK$O z=dPVX&iq20ylfr(ocyf3oLt;&&b&e{Y=?KTII}c43$vaT>2PN4VB-`zdcT8@e+R$t z?ziuDP24i?IOHK1m;GT)v?AG9z?D$5t8CD+`!Pt+|K!5 zMnTKqNFy_wpt_#ICV!{>_2S$%C*00R7^ObHWEjQ1a^Bh57R9gboV={YF19A@i;UNn zd24Ili_B2ol%OQo+96;vVds>@#?|5LHCZ_LF1E1UI}oVg(UN>!QLv!U<Q9tITpuUrXl6H@1c-Tj@cxSjlIrhznrgpnHcGoJ)iI3>g{hHZE_ZI(6zW4 z9d)Af@hMr~U0YsWHV@?3v4L^x>+6&HuAM!quz6o1zljl(m{|-{<^g%lHFwS5Pnh^j zuEBMQNX+Hzo>ijr{`#5tzjl2Ybbo8Z%cZRfX&Jrcab=Y!+9iY(l_FI( zWhUu)-4l84ryXb6!t(U&jb-zUzDcU}b*}vBFq5U{it>VrZ9Tixa^vDFD{>G0de&Lw zIV*VXmE4maxz{VUNIU*NrgX`Bo_N!=xXnEoj~_Q5Y72i;xm7dZz)IE)#o6^Uf9`s@ z6nbr z!JwNxB5FIXAM!eozgP1s0~43Uh7cyhsBN$H9-R}~?)BY>p zJnwBRa$#gjUfL?}*v?i}6lZjJ55rN8c%LJOVhh(?Q&N8Z`pf0%Q~rFs5)vL8e%UW> zLL-|fLxF=TWAO3=EY1ZykC+_paV`wzca92}DExKn6eZzn*F=3UUQ0K+$fvsl&i=@XCzn|KU3s%HO zpHSmn?qMLG5$yks>Beftx(_X{xD^H2wmY!zy3i=#vXJMy+tS*v+zkJ|J#T5-MqJ)?F%ydJdCS-a|@tj8M{ ziMJn*8s(+;1oJH8`Kx z_I0Cd)fokbUsD-*q*y~Vmc)H1y1w_}#1-Yc1n$jVw~)bS+lH3qf=fD0W^(&xwRN0# zUTUqfQ#MR2MMd8E}-sPyg| zRVDXg#=277c4x!1tJ8w~?mp#nxq9oY(xS>e+ZdJ@TsqWh_B`njQ<<=q^#4QL#cC>k z$G=Y2{Ww!XS;)Z2V(aI{{A-drB@!AQ%{Zb`GTWh$E6mJUM{xH0?z>{{i_ez}C}>~q zc3^bdY8@}3Wq9bdA4`d<4O2x*>hXiEh7t=I<{B-~4@gwioLMBQB=*2YQ~I8h>c&v- zJ;CC4Z))apT~IYMY*-^Om*a)f1VNs!1uJ?YPu5;53hPvQw04F|gWp!s6&V$L#iFfB z9_-o+)<>;%xuC-lb>txfmxhyh^1;bUOxXv_uWimgq>`4Ib*pb`&Pnlyf^K(KIR<_S zSuF7=qQ}W%$&LMCY|@KbJ)`cX&FIT`v%WoeRqXCtS99ueROMcF*r`nt+|;sp$Mpvs z{|mo-Y~YAYQ94<{awqQ<_eHK;_0-&(aU^jmsnSXWz(ualkb_>u|SrzQl=qrPS2C=?*C`dkeD_Taxrzl9m-o z2JE`kbxZC4uaGS+r_)z^ZI-V;^CFJbvU>Zg&xiLpM#+}0Ia$ymUpLp}Y0R1wB|(c8 z3l2>|?zO2df^A{S3k;{-({y0snK@ym>Kn6kfk{ax-&~yS+Z-okYF<>+bZSD{Y~3Gm zD-N`nurG*ss^+y>(&cXTt=Z4eyvN(vDxgRhn64E5<%ytI=Vxpq{kTZy zY;^M7zFfEx-6pr^@)e2y&dO~oR`&5f7MXj%T}Ma!_AE1v%DvicH|E&&B*ZYkt9e%W zx$S&RA6KOOl)!9;AM5`7t$M+)lw~fQUjd@zF`x`Ugq#Sm>c6^_S@Wa0Q zJIqCkH#}Zyc=gAb3o9P&4BlUT?V?40l}gYYf$L%)d#cy9=$?5hH1+S~n-4cM=fw#0 z`o^;q{c^*;8daIK?Hl@v6(3Zt`ulBD!tZr64DVlWZ@$lL zcq>+Q(uUo^hn~jH&V2bx?t9vcWoD7DJmOUjEuK@p(|`W4qlX;WC)}4_G*C)z1k810jJ3OVtG;u_WDO^%AY!4e%yFoCG3iE=z+za903gH zLIhIEY^_+mSr;%YSrYEy))cywuSz-2YkFnDH?><#;pWphj6FP?1X|h;cwIXzak((8 zK(v&#!SI4`bE&CKm1)SDD-7pE7{l3&1b4KaN_ICd)shZ((|BMiw!lqB!{6pa1AjoO z>BbV~_BM?p47}GE%9ggqRJ1QxP`ygo(j}=e>`L^z;Jkt#jzSE43=ciuwktJPIK_Mt ziOguPkm#JfpuKyAUBiyZrif0~CE-3FooBF%&szS!^YvziyAF(>UE?Or=n7QsswwGQ zQrNb}!nE^6#>OA6>sE9V9`PJ&)*L{<&Xgc|Xfe`;Qs9?2?X*niCqgOqlVl z_Z`PXl_kwS?h`p)PFPvdFOgYY&(bIRvq4L!OVQI=O0rWXa+2i=H*p3A&=On8$wrow zO(MZdY-dikS~+>eVSZ5Iw$V^Is1U;oMW7(2R$bquAKAvz?^eGCv1o`J^gdeEQ7gM zPR==blW+gyhN&G)fn{@-GtYZ;Q{|?o*PLVvL!q{{N9Nv6WZ+h`WoW2Lv6wd{>Hpj> zJ7?dN4CORn+)&h19NfOUDDd_{h6zv8rZD(yG`9b~QsLXq1)ENm?KY0{SF{b-XmI#( z$*u*G(^BLgr>gZ$=AU~cM0bS-Tc0R`NYW#cQ+{B zS4e*RrMmTUkQ!S4qu#uO^39ExpcY zv9G~UDmiW8HsiTl3_@-MDT^o?JT?+~#<0Q3%ykB@(-tA_4GcwBgRRP!$QI^znhOal z3r|;<++}3+l_iy{YpK=4MJ>B#?p;wXpbPFH(oAoyC1r~i}B|HqDklL~~t zYj6~V#Rrzom6A`J=*=~q+xuaPn99=TU#p%yT65u-dA?ERgM{oB7Ty5CRcJC?( zy{_);y!zh3mF>@!Wdc1!F6Lb?U$uFHYxkB#7o+BUv|2CpLv7#o71}PVZp})F{E@0D zUV5KPbRt*iAuq8XV)Ca`<yuHZdvGR|w&UW~Fgrj$!XY~)GZY!N+I{xT2GMV_`9LI)BO z1kx61FXRoMS}G{?-{RhNp1rR&-V&&Nxxs+XKi8^nbcR3u*%-`mQl zS>?alYkk|S%{eE_Y`<`L7dBmTSb3_+zVkxNpKI1U4dVN|!Z-z$Z#{~W{Kl~%OrV89 zo9jYM+lEr}sfsNI8t0ERv^6R|&v2A7So*PQTL$;Ey~n(+KIq(SF59)s<&T)COzEQK zg^}G~=C)_;oPK)h`*L-b0E2#s1(O{ax(>7%yD*$~4AOpSHEY?b@Kw83OHWm3Zxuc? ze`PbnfeS&>R?gAi8C+CmahzJi$F=9+>?t>QPB^T&O>0;AanHS1S5LfNJ%Lwh>Fl<- z_p5h4^qw$HdPUEbHT+fkGG_1l|Kk5%*9ogqy}e};ru^Ey-{>XNpWpk~Vh)Pc9F&-IP-@RXnL7vN{v1?zbCB;0=Qe>u zYBh&6<{Z-MIjGz-<6`7Q<~fVrpW3_h@PR`o{S+i;wPhaueB;oU%e%jK&(YswXE%q_ za?Y$a&M6#wj`-|3veq!dMEk(3Lx%+-k8ClX=zJ&nL-wp&)&3?nsv$jlEqabdzL^+( zXVw$xjZY$vbwzr+&zYV6X7(Ft`=FSJ9G#hYKF7-U>@M6hJGRH!@y?=<&(@D!PwXr1 z@_6VK@-$!QR6m=g=jm=IDMzPYaQ)cAUv6!>am~7CECphlxHqpkI-_Rpveo4+o~Eu%o(vV4CvJ(p>g1ou zD3E2P<0v(;{|?{!KYYi}h$$qU^tkAM?abmI2Ttw&6Zq|QfAD72ouaySr)8{;1}}eV zpt>~p(&X*_ORcL#C1tp!j$RB&`f5}8Fn?mr$@4klEP~4`e>>lLl&?}0;u9$7?Ao-q zIM^fXLa#^KyBHaU+OQo>XLlK0s7MUyU2*#Eo&^U~+)HEl=jJf{6cnAD$hS2y);2UM z`jKGxX_12pe7pe?9G7FIHfPOr@zgxKSwAe+hWoJm%Hy2RF6r~uo=g94BYNr5wF@h^ zie_gXjCy8Za!7#ZxBHc-ZQL4n1>Mg^$=toD|7zXL&=m)I?0Gz7?tdtCE*3l1v*mQ+ z>N$qIbEYQ?9NT&MadBp^q~Wt2Z)P0-F(DzR_p-n=F@~)obGwR?#W(GJcrD0~H=4Wp ze9)PsZ4FIt+wZ)&dS%+N#+up5ZxfE4;kzGDd}KoEu{#ObidtuQn(fTXws$SAFHGfL zws`xl>wnkya68^=RI1&{5WstFW#pldSzJo@6K*|Z)Rs6^y3HnG$KCeVDL2na9o@P8 zCigOt9BqLmWw(#{7+(%5JfBv3-kG7tIO{-QR_yV4xq&yQJUG?dc=yHyL7@fO46TZD zPyJ81HD|H)v-RgM`A43;_s;j`8QqQbJnLg6&K))o<4#z(aZ%oDHnkgfm2dSHI;h@% z-})dTaMLD>W3_Yd$^TmY^g}@p@BOD*_b)iz7g(HidKq`_X$EP#Q)zeZ3vnOJvgw>X zcYVpXo8jM@S3S~c>$Ox@E8~*j?LV<)M)2b@ujt)L_a-;oGkc^{D=oV1*S#%I6SbF^ zvwYA}e3zfN>~Tl!{o}RQX8pRR#n-9Rx4AfG^BjXqVQH(*sa1F{Rh#!&-C^r|pSYrp z>emI-YGx=(WX}wdnoOb1;Z>@@)hV@**TE_;?8{wM9f=0F`7aU(X z?S3ww{A8ozmHNCp!MwsZzZ=+Ci+W1=F(=n`PP`hdyJdNwgq0D`skH1nrpdya&d%O< z^y2Q5^X*J;c`03XOk@7*eD@;n?Q^!zYR>C;w7$LL{9VTT3}e%ibxpr(Txp(2r%BidX;bg-a8(NI{U=- z9X~Dmakq@Sg#KLd`yacPeM~sXrE;FjiRaVye;+ma%aqPfRrUX*zW)cO8C!Y@ZUr#LEmft7oYoI{QiG2sb^6B@FgVvYgqi( zA4*?>G#S(dm}DK8loS{Y`M+!y{91MAqsjWOE{;rE2Vyx5n3B$aPC0+x-u}Dq%5Qup zxwI}Y=x_M!7yR+n>Q5>2zg3(UW=devEMU@l@ck##kI&ja9Q=Q@t{1kF|6ZT}J(d5b zt^Uu+{lZi2zs;Ec(NXr-oclk`KK?9{|K*YRZAt#G%JrWYtpBAL|Gg~!*E)ah74J%Z=~|9c<*R|}i3`|bZ6>HoStzJKTaADj9`qzV|${r_`8{_iFGzgOb_UaS9mWB%WZ z`x(>wKW@|S^p*Md$o`+x%s=%z|GdBO=hpszZ|?tlxBvgYJNJLhc=IDN=buj!fP6GE+0OD4n?^7 z`a2WXpV9}?y7fy9G7cnsaA@TcS7Vg%*cfNmBB6V6^@)$ykM<}ycU>{xxcKDcA8wOw z1srU0j1;%aco48e<<#u;cB|fO7hHbc#j2c3)~jUl+4&y3S#_;WHnEB6$8U;IR9+bx z>OC{;b){(L|FE?Qhm&k>ZC&HOQ7Sy9JOB*Y^z z!NDQ4@ldCTNW__njZEb%Tw9zDBs4X03JMsU-YtB9eH)wZf(0+X=LMasaV|8yD_HvK z`i5SuDuW{jlh~almPjdC3O3$qYL<>T(A&u9$lA6c>Vm?-X3&8L4l-vljrulNHC^Rba z`XnTfe ztAx*B;`BLiK;XQo0ZSow4%b})eW5_7-|vLsOH^gV*`zP0Rj2S?UsVDl1>t&Vglf+M<=(2l&++<`flbmA~J(>#v%! zpv|oti~Cuo_#8;q{pNOrg_py~g_-pj#}tk7Ea`{a?)_?ZWYt?zd~)IXj?9h=U8ct( zX1%F6d8*$XiSR9eFfq@2Uq&jy$~evhaFT zknwg4`475L4!fOF6kYyZ+jhIa$~o)78V`k;4Icc9N^^n_n|_+wB=O;kam@2`(|yym zILe=B+1JP%(evK+<72n{cT1)3dn5D}yOjI??>Oahjr+lgL-W04AMF&|6kl{H*vjZ* zTSkNWv+AsQNzd2n*n7NKan0FI+h*BMhx;vi_@dvW_1K4C_WcB~iBm2zsD_kG{qzz-?BZxRyMESGs>TTuDiuwf;KqCx$` z=gqSu<)88;?mL^?TigC)VuDJ83G0rP48NN$@i$jEYJ{HkF*7=sAR?lw6WYlTt`$5- zs$u2+FUvZEwkR<%JznBy^B~!Ga>PHL6P*7H7x_+K**~M`it7YX2g7_Nm(*z)M+_}5 zI^;YF%$G>m=&16* zQV!~l9Fz3ZLXIria#K4(X|<(TO*+#&k+~6xlX7o`Of$6qdiq|)WP$iQ$1FKLF9gV_ z&OY)}aLu1-UMw!|#x_+9Od<`^ClxNcZ&6&vp4hR(cU~tGbCr)X$X5F215G!dnghXT8;MHCVjz zqUFp#G5ZueT8z(5O5#{0`;;MtfiX|V(&^Xjd@u9;jjvSacD`73V~RP;sjVJv`wO#I zhiEFaSH8(H<4QVKHTjfQt?mR?-W-n;n;7os=rJDLeg2UYgSwsGyU^-COW9rv+rAWB z;A-q5z?gE>;3CkaN>9kV*{?$&nsr7tJd^SCrz`gpzk&)xM} z|HTS!I+d&}`Ta6qkt3%=_2>5y$&$++yP`b^l zK(3@!Sx>+33){P&DX-_d?xFJHXkFf@;HeGKa^Z)U&$&8D|KM7kXH7{yPYNP-Xy0)5 zZ;hWQb0}ofVHvZHZmczHwgqi%7X0x*XQ@o=pCkVHdLj?I|DL)labBW%cG7`OH@svS zUPf4I{dq7&S>vQ++l5*uJMW3#ZF-gCRZo^1W~aw3JoH?vsP(($mh|UyoIn0kWBRUn zVU`KcrU1UgDH6^fl~s=iJhJKc=u>uKWXbSTnqRrXU-1YLQOk&Ns!mUFZ!qIw#+eIyz+R=qy&x) zA_q*iuA2NxYpM3zR~%D?=jP>4JvwEQzM@|6v)}Wirt*DWIJG|bl5wd|bL&R)6LS{N zG~QWUJ*o4Bi}tPq4|2Ef+viuIc=u?*bzLvBbpZ@*vvoO+swqqqwbwbO-MwehSB}kn zS07vs;EoC`y2ilDB>#Y~#AeE3zo}1DjvT$6d%yg5Y2m8Jya!cgub%r@CU4HuFIihv zB2VlR>d|)ol_qkoB*$dW!y|m|tQ;R0`9owGq*qLEX;_#rA#k~OJHu~%FS9M{)?a$# zTvaf=EO))An)HD{_U^NXLmuq^U&3kc?G#o2DX(J^|L3Xbf1hTY-}8)F;Cog*&$?dn*J@~P+rtg$;VcF zEVAP8`+vV)Y3zG{_3;$mjj7@X-gRx5yHRV~@*`);5|28{DN8vVqoYlAI`%B-> z?)Z7)hHFKFgVgW&EdQM!*8E$}!QfH9QLv6#Lx44cThf8yA*14?h6c_PT-+;!m@0&f z1w@S%0@yt2g)AETK1m&9ml9WC{>t9Om67$b{lA9f4leG!ZU;`|ik9vPElP!rYJx5I4O(`Fx9s}f z5-_8+q>xeS0nNi?VJL()PxV0FVHa4_=THe~Rykd5Eds#($#fscaBeD9 zKXIey+>36b0LJ4x#8egjN3J;0bKasy>`|BR@zxCyvPItoPMzp|!XYgdz-aY?b7KLM zq5#u!4!)-n{c|7m-d~aKoX9A>fH6&@|IZ950mtrF7ToV8xc^2>xEbDWzp>N$atqtd z2^oUI8yN)We&A)U6yS@T@TFtIT7_1LO^ntR6BQywo(1uBoZuAc>=Kil^l`>SshwQh zKh!U+m}KNB!p=~&@dM-S8Jy~z{l=bsIyWb+WN45%Ap7{nWVcQMsSmtO zwdb7D|DpQFihlpfsR|Pr9~g48G;~|toMO{CRaRnZ&`plQ=K?~S)3R>zd;S#C-oRUdUGM?f{ntr1QpvVXLQV*(Y13%&&?TqKW9vk zoH@yIX8%h@%Se&Z%<0=wc@rci*Z!Ot#4eTpb86s5VSxoR84VfYPKwOzoYhv~C%bd{ z0?XN#HZUz%$k=pJY}w0M-xkc$J~aECBX7Nt@RrCq*9@ux8JSmSayG9NTFyD=?St7- zj!bq9%u_1o-k3S}*3P+iIA>1JfGL(^5;3{-c^|EtjMGmz@%Eh z^dytVAhY}H%=sr6Cf@(R_-Lj0>yz_tKbWVi$fP`hN!MZiuSl+qI~VX(@dzktsIHvH zbZg$}PC@kmCQSn-r4I`hGfWnLwNQzR>$wHDuAvfR)c=KN9Tv=eAoBkwr=r4qH3ueT zDK6fq#THsz3DlyARE-$;q zDRPMEx5q-Ji%VCQ*Yqr?DhOOQ-Jo>S14ex-&K#}zTvf|wC@fWcwPKPNr}l)UQLA{% zh0EqGlSy(?3t1$Q>l&GN$*qvdm5pIlyp>AcBdrUURSKG1BZVrmgz67Cte7&P*+z<6 zV#AVI4ovJ;^CwqvR?cMHB)R5T6pKv5e0wXNDUH(q92u_)r7fEL-#=p$!`?||=a_Ua zP4YfmxK@9Y--S)?8;r6pglcbN^c8hpb^H;7`B9#2TAb_)n%NdEo8iDDTeW7&h6(pO z*B}3-(7$Qv+7D5e4mu|~trHfpC~wVn64L50<*6J4W%bY-=(Y^P;QZIfS^ zmVM!9=9Z%|vrA>_g$>FVZ$2Bk;cVfCW`?y}Cra*jSmC#ED%-}@t{<4bpV~BO!TPAx zTmP+6GU(>o>$JhbT4v>>%?#VU9wbLjS(eBhkbJ4oSI;cz67vd$uZe+4sfyBzxHkS5 zTcF62e{1Ux4Q8#|TjO4DS}(Y*Ux4w_!gaGtGr6WDf4r=$ZI+vRdc&JtX~}J=QDw?J z4bsa`IbAd?uC7+hkdjk7y@_w5K-=wI@zpC2JlMj=u$56*c5#zQp4rZtulc^xyKXS2 ztSpn6JSl755~BqotGE4jJ0r?yEWLBhfklr6?24S$2&na+t7MZA+u(v+G>%G8r8vtiCjR z*^jPion3qXcI{ZXaK~DPwZFecnN8ZA`P(4uSkdOK`^1}z|6Ve2TyCV|E_421na`s= zf!*C6Rr46<{NL3VHMKhHz`E`OH46`j9xP`xuIsv>x}?>Fg)M$Mmd24p{G}u zc^%M+IimY}y_VGiXV0w;I^17oEf$~9ubp$`#_GKv84r8@*<-nZN&dpoy)U+}h(7Sd zQZCc;Xh_b{npsERy_$NX!mcfnG4{^U)*p--3P#IZab531TKh@N8is4ty=5n{+v$+J-R&*&uKMbyAR9e02!O72yPOUz3%K6Qy z62{FJ+c~!NaM>2QtZ+z>Gk2`p{-5{w9*%uB5eIVm580gYsNr~bIKf=#tfRF`&xXS# zYKisNO_-KdJ>jt`DLp-9w4G4>RUVb4J00hhdpxm0JUst+B4j15@`Ih38f=F!C-uUw-Pm{+sjn)0CM$D^;}w zZgw)5xVV_hSM$G<&)Q8Y8<=eJujXIdWZ}ZQ<)O@eAJg#rVW#J=JvA&Z^ z&uRtX1Dg8{ue(gRl&pCDmV?UVHm`(RTy${RWwp`dw}t1V@3y+7O);}?SQg#5aJw>d>f*Z+tK3v#uS)Dabh}02HblMjx>t8urQ@UJ@+Xm##3USp6!iaYV_9ZYd}Pb_M`}U^u^kWZl`OisM1|D>a;{4VZ8zalad3IY+T~% zAI}Q(y4J4PRS-LC_sTmrYh{wcLszCe(tjS!bXaY7vlHUUEoZEd(Pa$U-$MkdjZ+KTUPc|?zvUn@5 zwtbt;+StNc7OSh9ZmRRCZcmGy!xBDal39|nvaHy}HD4_3Z`*!8d|AoCRq4XwyB2TS zxw%f*3CYiU{@|U`Vm1S2?@XH{X)PDc2d~y}hur)<(RhFdWmsOsgi z%`Eq&tY3Gchmec>IewN5xywQ2*StDhrX(Wti#w zpPyy-ZVn!2K^G2wP7as-2e~=fj?Z)9=5uCsVR2@ec$M?u1YSN44nb$WKAv4LL$#BjLzomx` zbh)}jY)a9(RpB`&xbV7)MeYWMNg;)Nt3C-oKi{x5>$;Mugb}|`E6XFEJIT*J+}W|# zMzTWn!ph(~?g{d(k5;{#cy2kHn2koqf$UrJc}~u3X8HKSYv}~#_D#Ubel32^%zr~l| zZ{n^B7kW3{p^){Q?q5FZ%eAWv;!(H3F^$JPCf70^_gY-CION415^#`_oo(iV zG*PRJCli-A{OBrIZ;DW?>^FEGtv?~9BV6sWYm%zUAyM(pDN|~0JeiR)$wf)mao!I3 zNjcj*PicyWJYZyWye8S5?)rb%O7+=ZTnAESez1)^FCgS{I5@KUXsBh-!k-?W@pAJ}&D`TV8x)LxiAQgPN0a zJJY2wkHh`X{S9x}qCDfAeJ%(XU(IojS;$>hWoTP=HVwqn^7^W?ODz+1F09|8D}%<$cQOI9K#M_i}dY5zFNlx4MaK zzt__IO9rh= zkNeBm_-;N}aa``?u6g_GJ}!7|$s()rkVSZB^n^b}y&4lV0uI=u`(JQSIkkFw;q$G} z*>}I0+;L9rWy=h|zu#)ql@uCX@3VdU_9Wb?`iq9@JZt0q8LbR<`?KS&v3wQy9Q^oP zv(BFQkK1jne_hg!*Id)C@r!VA6{Bl^huk{#*+j zlX;fpNM=oAz980{t)alktHJP>>yzWuTyG|sFK+*SOtka}*wExM=|Nde^MQX70gTKX ziv-#|jwnfe?C|heBsBfR5jCrio!(0rH;Oolh)6um*m?0GOQFUNFNu6P8Lqf^rXW5} zg;UuRb_p=5B{XoO)gmGRu`;bl}iJ;6c#tBZL59z&s7EM6LyZwNZs1(kIy>0n)R?L=_c zr%5wPmhvV_I(q%c7cLT9YPlwqOXDPudhX3hYCf9Y7nT@oZS$L0Dj9yk5BS&P*+PJQN6f6Kn*^ZBQS zwBK@TV3$Z>s(m8BdSeIg-kK>4Ph|St8M8WzZw2SQYPs#r-G06%>&QIQt(vWR4+YA3 z*joE{98cKe#K_sBYVfY0!OG%#&%vHlMmN!$OcxgNtbe&UXIAk6|LNsxJ+`FkW^m7D z4)WN)ujCOUQ((unI>W{d=QaxI&3$<`No!HoDN#?$tC|c8j$Pk(u4AIr)RX`1Ot<%b z>-;R3adl3#)mFPifg}1yx<#yb4ut*`4AZ}`sGa%L!N{#aVnVZHJ(%k*G4$?TuW;3% zeY4!}j%NqArkBrsEs`pAd;Zg_%gS8u<}ye7dw(h6u-B9{*rFWyAZ+Evw%(x7uG?!S z?bDZ-%aLchE41NN*mg$KKfGn)O`(PV9$DQEy{X?-%>UFyY28*{u~_FRx4-;L-~J^> z|HXsTx1D*)iViKfFA$W`^C;?F<^7N~&uUHz{At^)%YEU!L&)ujxMf%L{BIstx$rtJ z{Oq=MqHQU)+Dh@W@_wj%uk{XZb!4nHIK2Nj>xPc2-=_IFyxhXH?^@$bLA|Btl$RP6 z8#J^3Kf|pR*mOwJ??&rQ>6Dg><+Ehf?o70odGzthVTRf%T@95p6(` z^S$)?2DWJ%&a9gF^h41*x%}GueG6R}nHydSI_Mcqy7t@Bk~#b22A@s$KE&Kt%bvo~ zYn+&2?a0XTVH4xx+G&=%4EbwAxKFpqu^Y1N^%i`ddhE<8*3CXPhqoC-UHoZ%!iHnP zHTlEW&N=B#n-^FsZ0B8cwWzo>;ctyDYfjew&`6Qkuo|(#iYqd+iny{CHuW8fd8M9s zFJtLZM&~vI(;GVvY~09y`BL!as&mfkK5xCNlC4)JajNpQSze)%%+m%>q2mi(rtiC= zn6{K%;{xZq*{UD&{(Gme3m4woR{z3AG2-=XB$cd$^n&illDj{7YKFJ6y(+_^?y_U{X|r$!e7r7|CToU^DGc_-ggT{?O4hjhzt zrz1bdr7>!9ud=+dX?xE1=%?;Zm2Yo#fBrj-cTJpTN63Y)LsCW_FDlurvLo)vPhTD( z9JZfliqr*hwvcPeC3_pZj;#}F*n9f9lHuu6DP66yt>lnM z(XPPTNp3$cnoY|tc>9~lQj&Sm!jR@3CL#U~$s5KC7;j6z)et>U&1BKg8BiX$D1mEX za)oQd z=M=l)e#C)=KOnM4oRh17fBI#fCsQL;B4ocD{vUg%pgz2e_r5qM-vYzRgXLLAT4g^< zNq=Cp=HT8jy`{vX+~S}>$}!$E4QT~e%GJZ$uUx5Fb+IMwazubp zP$%WW*d39@$5c9fON*9!$K-^@D~%ohLwSo>EcYsxq`vmN9K`Y0T+!qPslwL&8?cbRPTr2l$BH+mL)HR7)1{dYNRYg_7# zgr-~x1EDn7P1q|XBqRl4ey;IAdT+qgSV`A%qZprrkq=^}G zrtw}6(3|;W25#s2Ekwk7mWbDW&k zD0XpM|IOtSIzMrj9TzX&C~A@>q4ZcaYV!2VjbfdiEP@3g4+X@gToQkHNZ{vjn_uM< zS21^$1u^S8OkYqbl_J^Bq);Xwz$kT~=D(x8v3t#DjcIv5^D8+2b84*&+NP$qv5aFn`+=G38Rm8?Fey7M6zf`OQ^g@> zFe|lkRu1PPO-b1`g^SjPv6OA9_O@DdJ#0}~Cg-1Ny}XBeH#aP{y0!RYC8G?(e+D}y z28S&5Z=HSLN`+Z|3Fen9TPh&ry{g(*YN-R`(gG_^vFr1g5|(alSSq?|sX-^>yGP0^ zGdM&Iv}J!S{F))0#pQS9#sY@rOG*zd>3_9kjoR{JDNZqW4(Sa{JKF`Tb}g>?)y%$u zQS`x5Nrz=Il6HcLbDgVJyiiQkjADq~W_|M~|AHfmMiLQd0!(TQ+!MIC)dZN{X{}u0w&qaPnu(1|bqkozWCh3kTBEvimFUNb z?tv@zUjM&J&87L&1-@Bnk#hq?V>YjtmCAEfVfxD|5!nlj@3_{icVOaVVEP=jMm}-< z)UNfj8W$S|F#Wl;KBk00(qPq!6xkla6Xgufh`j!2(u~llS8ljRmUHgY zVp0=ec3!aY$HzonLnbW)76obHFInj-*2~pSOKL}*-VPk;wCZ%XE5s4iM>YML7 zGTA!pkV$m-_;G!F)}-E)4Zm8}3e0p85KoraEH|5D%N57%&lay+KVhTv?{fE#+k;l` zSQ@akpla)}rd>-8>{$Nr|MK%vE8bmHW}3ZiN_A8G^tm&l`In}O7HKEWvo@Akz5V?! zu4UF7!P@C;OUh1t-^2Kr>4NoMX63aFoA$V}?VcpK${>2x#l_pM?BG3hAa&ZargIKi zS1jC%qy5@~_bfiWMR4MtA1`;!T(Fm6$$STo{fC!Gp8K`*;;Y=9w|QopvKY0*b1X;* znz-T8hJA8OyOiu86y?^Ykz9F6Rty{3qdX;&{LG#8X$Cy_ib(U3m zBlBe9T)nI%R}AuJK3Khh;b67*u8-aaw+Z-L?Ky0-$49y0ppN$vv6x)thnoz%cmLdS zkS8E0@PxdP%&udnH=gJ|oa9~|R&z9B&e5nn|BuGhFi2fEnjmv5>CRCHnIoUAk1R9W zaL0R_&oj0C1`@vx?3@1a2*1oxGal|w)%(-d_*d`o&po|*ZDX;47USKe>P<0{vOXO0 zF_W&Xu9nW>XWBYQCpPMhZ_QQK`$*Ha? z-gcSgoeH}fvUadfpU+n#ay(m_Y5Q@RYsY;9El+NhdZgJuW5SAA4riL8S?+kRN}b)( z|EE2->bTmX@U@tNBb(Z`O8Qk=qxwco!F_EmGvV=$CXwF!$J^Ih~0QMRkLN zSUW=vwr!pvsv9&{LSwF;fmm#XA@6LBw%lgEvzOfW@80?Ca{Ivm-f-RH&b+f-d#_w# zzTU%dDwn7B;)=>I%oA_2as@rSddQmhh;x3uZCZ0JKi`HPzhgVkGu!9{%XUlMXt}#H z$Css(r-SpZLW%D6nYlNGVml^%*!{0qG%9q$q`Ncfr`bow-kRXk`AU1^ik|;`jN5jG zO}Z7U!8tXyz540aUA)Q-s@LCdyt(7<&AkzRd>73cIwk62Z*h6b@aXuR%@w=IAiK`? za?r7>r&N=#EtnA1*4F$tD$n=yK3R>2u?>gj_J{4zNsQfha&D5cMC@7L+vk#vI`{76 zeK?_CsCh!D*=*~kAAj!%yIpx;d#^#|!MD(RQIAZoiq;=H5V+HUp?@a#e#0AwUObrf z?cVQ*Ti*==x_8(J*L57&;FjUYCnbCLi$TDyS%$WMjsE4{E_u1<%I`uz^J2<7%kFax z)BAjTo%>!N(zDomZq0tZ@Pl@5PVprj{kQVCUGT|$Z!XRAJ$sJh;-8Z% z=DoVS?=4r*+wOw5cXzy;XZP;OJ(mUN-o98TvUc4;F~)aGHQqgyd;iJK<@vmK-|`&q zt>bv-*LD71(8ap<4C@8o_WeI?+vRV(=cLTd_usy}XO#cI=KsMa>w|ItlU4wep#u}= z{I}1qevq;EWPX1^@cug`1}5hPOidF$O8tL&*JG~E{ZD%TSIf#zmOp=i)&7I#YzBkI zPnzdH%=q)k?*Hc{lAoF6r566)C;sch+bSkY|9-B1Kb!N>4)R}v_&+=4e^4u6axP$c zyJ{&v|0j;QpS0q;g6+Sh=zlSim-37Lq#STq;?`G_{7G*nf6A|31P0rp(PxCOO{~4OnK&e67jnR*IKWO^|Q&{}LD9r9Ok!1P0X!Ov#L!R2DGt8c1<2U}6gRt9pOkJANirf&bm>nba6KRG6BZ zop}|MT3TFtdeQG4>tUGP)jbb%@7T-*vlcb4Shs#dAA<|py<^)MHy%4auSH#xlT)>` zSw&6DSyruCR<>Ee`GTtR4QIt>wMWg$&I(KloJ~yX&es*6eSXZOD66iddR9}tMa9iT zLg;bpf29--VXc@5uTZrxCJC=O87CFhIz)_*%`#oH_;|m9bC=GtjZaoKT;bBr>D95 z+xrKHyZ>uBycAgG_kX^*hr*l-5BFN~{{HuD-JD&Ao0C>l=NvLGDAf@BB5vt@@!F{h zj-aElD)&?^t~O0DdGVk{By7jj;tRYJ4|zYmc;$eptcigiv(^NGfV91VWpNy8JWI}T zJNJBu=K8WknaM_zqp6S6WY-c7`!@&8x>{Z2m>((&iS4{F(aY@RlgT2EORl6e+o;Q$ zKiD(DA=x0S`M&KH6NbfBOfxn-72u5de0$of1kVUgV_u0VjcXh-)75>guOw_m%m-GvE94NdPC>gp)3<2DPk?+OMEElj6Z z{aw^{Ysb_Zw_5IUd2V3v+sWL_a;B{@E$y}I+~@_;AJh&svmWS((>6{MEu7@pb}ZLX*pyevI5DoH8t2G6n}2-@gp^V2tQH$vT~bXF+T&yG{c`iNFHO=Ztz>6BtT)EsbI) z^V&%~Ft6s)2U*T~uVu>p&CeF7aIrHvHZ0N7aClWeSL?v6 zj76pC(HnM0TyOs0_EEurgF*S3mkU$8%e5s8R(2PH7pfj9cPQr;d31nDNu}xlvw(yG zL+#PVu=y+bWVjA8*C-XF%@!~)P-WqhDaf|l9h&%7=YiJ7=R4R<1YQ;8@&#ziuy7nW z$;=hZagb?=S-}SmrtoPEjN6${V>|HqcCVO%$T?}1ZFJsC>f zb2gk=eQioY^^6-WTaGQ8-KwH>XxFT&PE*c#hxBb`gr{ltE!*o|==z|c=14nZc+wOlxeE=n!KfDO&$~H)L6HdI+ntT{!6Ugg=DU+TrD+7ivKd zx%jwdEI4st>AndY)<`3VfAZ^^~yw*T9qV3S)PTipWVw)aeOh~ zX*R{psc)6ctr=$4t7y*Y>s(}UL8E)6NMgg3-USxLbLKPoOxxC!0~ciTh)e7Lea%R92pzKl^8U^RJRdz>d;u|a*y!>6An-QBh5 zlg(u=J72Z9V4<4^vCoVb+|>%1+j3yW5l7?Myo)Tp>Vy`sC3Lgh(XXhHSBDl%+ z-R#RQ7nq$kA7T2&UeMHi|A}6)MM~nQqW7z0^qw=Fk~R6y5cc&~M%lCC%{;lAgBVua zWaPT&m3i{>l2uj>YRgg@+*ZCZ>5H1W>cLU(zDpNWPBF(mwaVbu(M+=XlH|wOH)TiE z1|B!vCQSh>>E3-OwXLUbYn;X)5^tH1GaveFU{uPUi$gr22FMLGe3k9ykgQ6 z7DlXn7qTimcFpqWgNgRO+g4fJuvoOZ%h}mz>l6zvnSh%NH`&fz4PLfocZ#6S6|uxw z|9K902xd+Y%MI{T${lWXU%%D^Xs;Yd%5!8Gv9ggZDPjbyRU>Z&h7XT*SO|p zZWm`T%e{}wy!ZXQ`)t#->IaFE<=Ytj@*0)z++p9&xldkiZfW+!M@N4sAA9{qwB>sh$t_*&UdO~G@Xd^7ubGPTaLHGTHeqpUm6B=UWn+s*1E-M%(C zrLS0E_n(J0;^t@n8#*!s2mfJAklS^#``oL={dXQ2##_l}DSj5Lp7FxU+-iGm-sg-bhX@;Jy1o^NyK|Gpo`^{0QB{Qu93{H~vu&;R?jIOXrV{{4R# zng0L0{r}(k=eGa8pZ_0sW&eK$iH1G{rT_UKa)i_yIA%0VO;DXwXjHqrK|rF>H9>#U zLr*sKMu{1XwhDS|76CJtH!4UpRWCA_B;KS}(WIB4%J-u|<3^L72h+EtM)4m_CO4X< zg*KVaXjYt2w(C=))sN=4>?Ot=EiN4e^U7O1X0!-BZg#!VQgyxd@bi|S6Nyj6TZ1cF z!@_IBI$C3H6hGSD8Y|KEbXskKMq5lrky?0LT19JyM7ht7wxkR8e{ZYmXsziesr%6$EYT6}-q9gZb9s7uXGC+`kMial9WFmQeje+X^rC5sNB*>m zPK_CzAGdYR$!MDAk+(piOTnV+VOZC)8I3C}l>Se=&}fvvz{kKKk;J`U)%m?x=jtC# zD|Tc~n#jy^L#4(caz_RKsvX^eH@bK>#daQb`x3;*z@Y5K;Lm(WW{!&cswQ3g!&VCn zrM5XRWPUM_va>Fj-@C-X z(ZEu=&6-2N;_6gYmYJQ$SM+hd=)4mw$)aTV(NK2TWBvb&Sn?JL+OgTVTafqTqf!r;p{(bG*yV<|Fa6uolS0~PU?EW(GwNJ z6C!)QG)!_o*|ljxwy%?xy|Uzf*QVXd43{2t?>ALFXwk2C*+jdjdkL%i`lW_Y0EepS9s>O?ws}Q`mD6&vo>@#Y?_(1K63WQ^4ZDLX79RLx94W!zMr#S ziqEk(nscPG?wF_CiJ5aAZ=dt<;+%6oYcF(4U$UHgH+=5a!nrqQ*50})ap&gTtKa9g z3C??DS^LCN;#uXq^V8>LyUl*{vhLkY@z;{`Pnpjz4V?civ*w3q(ubY%U$pc7_hsmI zoZwY2pxyPIi}RH`!>bPcfXNIS)R%DDgk0tknZ+!+dBLtlrYx)Kc~>>wXwdzYlz*s| zIn;TP&4h`0-`IcsT)0ns(If@^yNUW)nr>57o7Xr-NsCBw81zkCXxPQTPmNui&MXI|1MR_U4R8ofP9^}|Jd58+H6=d7hywSO~nIh^EVHj3s^wm8nl@&Dzb zD?b+qUUpqxYGA3X{jnwbe@SZDHS4ge@`0(U?yJtB_D3Pz%AO3L z(+e)>Kbl}*aaHTXMg|?Gm{VW+gG9CN9`W;T^|lw*>dew#?mF>Q!Lp25bF)^l@Fc9< zeAxKEONy^@fXO<>=@%62J0>NI%rvr{#W`(B>bnrd(k5^HW63E>d@4fnlSDkHY!3g> zXeuQ%@#$rYyDY077VEG66tBXneDo2MZq%wB?2C6Ab1a?gyXn$2-y~V_SMfS73stU| zoZTE*!#i`>pjYib1Koix>3FZiBNmJyMX534dgAZ zHrVlXW8JMa=RMT_2R5^PJH&oiL|%HUoX+j_3DRq332mrOUE^4#!RkF>P5^`D>U^%# zn_v7~@YqSRh;@4Jvq@G-OnRPbAC=TDO;wb-Z1H|^+WiU9Qj_fe@6Ze1?fX}GWvrHZ z)+Q(2-S!i9GyL13lqf0xRayOZ(B|@I+g&V0^SQUboyq*bNvE)xDT}#z9IBQ+`o)g_we}9Ud z`@LtG_}*;8y;roWu2qZOn7!9z``(m`d+%A7K3CuOcz59gZn0<8`$VSii{7~JO?Jyu z>s=pLSHD{={v~?BNZ>=g*&S zXlQu<{(V6~!JRvI?%%)P*48$E{`^0G{`~*{pMeOV_>+Z^fx(zT2c#C{CkD3v2WA#{ z=t%XSSW2pMSBX>TKTb`yY1H_^rSF{>PrW z^Y4HEZ)j|4ZfR|6@96C6b`odopD=OK0tXqJOWC#^oszh~ zv2iv>oRzi%L(0kj^BtPGcuRyLndce>)%|Hphz_1*JlX2PvCGddtd7{6WgC2DMhp8< zn@c4P42RsOu?m=YOxVK6G~Gzx#8kzDZvzu8Pr7wjUw62&!-&tJ!rIvJ7MoB@Xz8*1 z)sK%)P-bR+aOVBS^`eRn61R<=SS9&x=yC8$l$@VZakek*_Z0?~UQwx3f?ofr2F~LW|N?y;t`-@}2LZ*O(0F@$N<|Lt|e`Gc|Z|c0u;C^CLV(kQV&X5Jn*2*^amJgbz zE%Xaj5@MYFWVssK1crZB88i9o1SHdx7YZylUGp@grADOWK#_5}=&#XR%dVGRWBT|s-#WNRwnZ?TKoEs8*+ZeAUUc7Z>yM?RXq-h6^ zh;M##%eKt<>62^_H0wr;n9AyztFqHR&whDJ&D{Q} zZ^5j|QIBMvJD#dMSLW6>i*4os_Gg~w`PW>Y`$I<5hTDjd^~dM=-+UtN*k`S*eYJT0 z|1aqd+=u*{tiGtTon?0t4PX-0NLXlCy~0iRNr!L6m&KC>8r3)!Fo>=>z^EMH;O^Mf z>6i0m>3=@%298+|&P%LWz^EC@;8WgZ%3I*Tppf9?XZjd?ynDy!_5o(i3%`gOi!MwZaLU02u5+L|K%z`<#~)wMNFU)L1ejffCl z)xZ<8VC}!0M%PlQ>-&`6Fv%`h?Pc5$zU$Z54GgnaCs-F;SLWEZrlVJ9kIsh()&&X7 z9xK+QnBP8g;8G~F*n>40ipy@)8p(Sd=BBR9XjTaSCmfu%=$^R_q{1V6P3kKA3muH?G#-Ir0}MpyT)E89Nl?%S$z zjk|x>Rd@^C`#5X6;#1rI>#JBN-TS(0yZqbQ^)-(L@Bh3tUFPfF^>wQY*BpQMeLus? z^$CnV52`qBY+&^>u=#bmNpMXA>x9q(wg|6>T+u%cDIMO>W`5>jzfw4t*ozGv?rR?M zBwQ2z+v~_Ib)kvl{y}DyzKuQUI>~xIGmcr@`yj});9Oo%<8j-0(@(Jpq$DvqFw7U& z!0GdWN&L1VgRsV?DeJefD)|4*u-<3nT)!qYiFfDel~zTQ<}PSp+n=z$y1{71^))`a z5i`&BoHUxV(Wce>{LgtI3ZLeFRZJ6^TzQ}>;PbrQHNMvTw+h`1zAW4u{@j(@z+LP=xR<=nnQ%l|v>?bV+=OM0^1VK$Znuflf!y1JpSbd9b; zc0_)|y4CASSNrc_bDY0x*6e>cxNl&(Y39T%;}iyl3w_(REcbnz75)3x zA@w*dMTB?uY1$Y%@5ya zC>MK`Vo;E%pjSF0MOu(gPQupffR%Jm`~5AAJLHXePM>9v(VM!(Gk?w=Np<%Irsp1_ zm76`E20kb^n&QI9RCBcAo(IE~nTlV<6_r~O-HN0l&i!BAqJ7{YV~X>R$%(UN55_#Y zJ!7YFTAl0?nZMFZMhg`FGBxrR{kbS-KZkkNzb~Z;dnFZpF0iB@o;GFAl6Pmge{6oT zhUb;wVbeOV%Jx;xJv}ul#omr{UqyuP^16A)vf1nID?RbbQ;L5%W4>Pywrz2}j*M*zXU3YF|xSMW1r&;QRIg3uY-LV9QBa4Mo zKQf%WTx2dNwJ*5wq_V9^plxQOt#+Gt{dB97!nWy&E!Ulkb~jspx|X?UTCuJRPl}Mj zvCYl48PfI@=AIn3E*`emnp?^@RzF!NVOD4-TO#bcLv7b#>wO#Z+ds=6Ww7;IVORQ{ z!LVFqkFrvHQ*+D>#T|!j>K?aOZz8>26Lty7pXbmlkT_GLa8;Y%?@hwb^0wzgbzd zWQDR-i%8rFC7X&4?xxc6gSG+=wyPs*C%tf6p3cgyZhm}0JL`v*bdRFk9g_VPVy!be zJ670n9I!ufKzQF_hAt1e>E@!w8Z0{7s~IGky+p)6B+DLK?A)Ag-*Lq8S8|`3xq{WB ze))~|3j!-tExJ~)SAOnQ=~RV^O|yc~aeBOBN$# z)t^OQchp6-v(3*i`Dx1hrJUzehvkXD0S5dlreUwEHhOIW$pHV^e?ZNq5~# z!v7y7PI)m|LTZx8t`>&xCnj1cHAbjUXO9$?e>m~rV&&Ny^$`UHP3AmIC#!!3PuMh3 z*6NVzo|efh1yl7lHEFXr8FadJndkIO=Lz-{4k%aP2od|fP2yT$xr~W$oXX706DuW8 zDnxuQd(cpP`h&wR5$D)TGZYR9N~+9~=T!T2LxlB0@fpWiK}GVsO-^Oo9kerj%WhO0 z@0>Adrv(2d$3v1%3%5AfSn^!8tf&Z)a&j-{5fRl2n#1#@a?Xw^=?6-Ck{F(BH}IF7 zdTheXvyBcB%a!Jx6kM>YbW-`=z+h z!@06SbELH99lg+*R8TPSh4{sde5&OZ8Q&NCM0Ooput@FrqRo=?>zo)3trmNC*`Kpq zY`oE3>&A-jKj&{sTv}No$E{*h;j)w~OW{-E;vW~6m5Y~EPUng7;)z?eK-NVgnM*>d zXxVknMF~lz_ucIS++Ddir~W_lU}8jzQfBAm&?zd1n3qoUoMCfC!+XVQYnC}~Q$#p3 zSA~0&dY-HfQsD_{asT5X{%nWqqFsxxBueWy+TVG#V6&pC@xv9KTU>0_*Loi3(Kq3d zJGo}+FNNSKg43m(GJZK`aZS0=x%RuFAg>m)YvtO_AB%*n=6&AIGi#z^@=xA1kvxLC z=QTy~?E5w0;4Ifar>0giExY$>KL4U7wM|LKUrqY{QG_>XgU=KD8HbfBL>P~4c91IHn6cDZiS@ot(ia!o9lb16WFg(4(pzwwB}z&x z?UmG$h1>eLHyLhpTgNCCA;~Dkw7GNp#)ZGvhh1+@Y1)}{v0aX9XNmXnBMHkB19DCa zdLL+SPW>o&UXU@LQ6saFp<6@z%5<^#MRu7%ee42z>~>Wog>O9Su(eu?IehlkW!0+H zzugkJJ(7Q~xHVgWWl_@|ZIAB8O^Q!;7N;n$T2&o;Xlu61^dlQ&8kY;{PLxImWzXi|fSpGT=1ya2Q17wS$k7arsWZ*-ym9#O z&(L|rW`qtZpl93(7BBw@^?GP6=l$U*}7XG+A?8o%yYF>domf?F2H!BIw3a*-8!w@Y~mE>do|M|@tkt2r% z16Kv!p7OZFd*_iOm$mZZnkSVn>(f`C^m@aw_zTB4XUjw^QOZAQyZ5I{ccWnDBZt`{ zo76Me-gKS`yk5&!G$*8N)v>af1#Uizvd=hpojW;aY4tYyvOi~@Xr4QDVAH2v_R_PK z-8pVkZBx#vgf8$Up&rmHm;yx@tww{ z!b%AnH-1msWW>2)&g=Q_q*h41HNJj?@vhiqBiqX+v6qeh=5`*tAa?iCN*-1}o%1qx zS=rs?q;8e_HhJ%4yukKX)HaY&v_aW7oUwZPCBNQN=WZ9+@EYsqUXHnYHSXuY(i5M$xo6WLK&rZcWrX- zMk<^!pM3Y$Tb=7FOcIyxz59Fb?jpk^*}Fn(?>@SF=}GLZQ-6=Y+^cuaH%sL2-Al6f zPDWn)S<5QMaG&emy-&9F{~PY!mkqynAeZIM-UniJ55+D&2spqfaqpqrzk6E259RG1 zshrbQ-Ei~m^_vgG7*y{)();)5{-TE>Ru4bxKKOd}&iAz!+5g?%@pq3voY|e&yo0`v zkM}%gjk~Myu2bvXWBYfhj{okM_MLgqd(E=$qV>N0-hEen{q+6$9ys5-8l8T2KOEs#m(bi_w4P5`wPS#1lc_Z(R*&? z_dKWP*^(2_o6bIqdv~{y?>S4}9k#p|7kggltbM_9`Dy*Xr%rq?oAq9L)ZPAl_Q{O8 z;+}mk`}FdHe`?|l`x?$!Sd^RBMtyE5h8#cAuFZ}xjF#P=-E z?|$OF`@8+lt$+7&qu;B8edUMmy>xB3wI}xNm1nnoAKbdO@2#os?K}V8UQ4?j{r&YL zo_Ejc-Z3=14RLt;LhshTwb>u!-hXlF7hiDaIh9knEV6;QIbc5Wh&sd(QuI49tfFzs1#m zQ%wBUxZqn?1Ea)+4-*f5d!+FF?f0+tj^EoBFiLD-jP8$(?T;_>kLzb-+O8H;cV4ri zetDz6P^Uk~l+;KTe#u^Y-pTT3yX${C7cy!*@DE{?nJUjaU;oOC`QQ2iqh9riE_~0u zGCp;2e_Y?esQ)euiUmJrZ~B#Y?H5nt?KeX<^-qWV zS0%$gg%AFeIfOQ;GRPl`J!t=Z$9{ne@$7O8F-@hvoHqVlqVTVD+Fvfme?<(x@5}#; zYW$~s{?8KrZ;>0Lrj|0+=Knq2|81TA{|H8w1>H>%I#Fq!Pbb|hv0E7Ua!SzcC--YMUg3oTqS6;- z6dy_`YaTV@_|{`$q-FhB&DL4b(e=HDx3_;_czQ@=ys?Q6@Wi8WsgPi*Md*?2myI|?^6{~Nq+i1T%(AkRR(9z>ZC+>>hdcOJc)yX$*@4ff1 z{<*g4iNm@d{=Ra4`a78M%_si_TbtTA!94WYVl3D+GtIf_&YtN+`=l`rJ zGBH25P<8RW)l!<-mP=pH3*)t3m#wv>J#25!?uBnB>-*+be}8s!Z@ajCoOQ*g=NFgrpO5bS_37Qi{m?${gs(Z`TQ6~LydiQ&iUdPoTwxkDiwNHFgT36+BDQHeD2lI=xUzcYuciJ zuZqMO_m(;)=I)ttBhJ`a?2O0U+T2Ks!l_#?W%$nCCXp#MQQ8;pO*h%VMfdt8Tw%{r^4d_K@1|cTMi)J^yO{Am_KKNK^yATS z?y!i9+(sM+9(5a@i+J2?`EEusw+&z9lZmEm4|@bW{34%rJI38ioobtLqxBFvV)Qx4I-`&n%wU_Pp`-9Kz zW`8(*cArZu|X=yMpG3lr?G%;xqNv0JDSx1Dk~dQ)cpk|C_!YVzO#rVwrG&SxJGJNra(l?de;LasiB- z0tXoQCdA)Vn!vE`T;+5<-BGpbjF3K*h= z3Z`!Bd8D)crRU12L2PfU8T2gEUBB%V%35oqWHevwY^KxMX8fm0RtDawl!hIiPAk(=SuZc<%f)Y2Ln_r~J*X%nyiuVpICVYmS}pEM=dk z%KxKh?YNuC%k*o`EEbu72DSh}M)e#AN&R09OcoDXc{3dBr46o%F&VGsn83ii=GUPF zKi_HG6|X{`vWG3@6YhAgt#R#I_*S+C;VjpXRX;gCFsy9bI6G+WD-qcbzMJ2L*4?XK zC3vtZG*ZpD%PaJiw(M!Av`?bz9&M5OzQQbGrO<^9{0577uH0ha@G)yIi(SR{)#|EB zm02C%iYVVyhJd)Z6VrnZzqw)(&A?Q&l_8EbH_X*LN^-`um43R(`IQlj9B)2#uQ{vD zm-;j2YMtTApsx>dE;@uP_TpXX<*LHMr@dd;Z|kb?qv>H+PeiZh65nPNv83dumbb#I zuZ(k8*9nOW{J*h0PJBYc-$!SF*M;R^HfuQfI`DNJpW(d_084Lk)K z*c-J>BaIHM5d5IPq!HQ3BGJ$#G~w~pM_yZ9{d5^cmg%VpHr#ie^dnR4nEDTkKPLQ- zi`PiVu4Ct%aOJz`fyp*Y4n*Ajew5>M*~Y25Zr6-twsJ{qWs+05f4PR|(eloUjl14H zt4`)Q_5IU^lR?(XomXExNx!nK`TEpbQ?~acibvnrtEjh0lCz>gRQ*RLds)6!HTPYw zNjDi;dh%w7Z}6~?zHwG#-RuT;kA(7HKTnCfDujp^B&uGoI3%i8oGhvtDEWFqyX##e z*1kVmRP=9kE^svpxoR_&;eT@OffZ|Cw=bM_BJA1csSZoyS(f~I?8t3>>c*NSj0dt) z)zv02_&$A5uYDwKc2MuJG?9m<2YDLPuTSYXx$om;xt}NYbOp@ZwC2SYN6$wI(<2wm zZz@`x>*ZOj{$Zk*>w^uuJsFw5OuKTqFVEq7=fz*HyRx{~L~WeE>}ehI)jOw;mH+;> z_j!!6Mb-?TWbXgAZ`AaQjvhMpPJc^SHe2)UQ(w+y1ZiG){raEP4W9p7wk|eHtN$GE zFm1~VrC9Hx8m>DGvgKa_Hj6dBZMwwhTbFYDZzThpi^A$dd_^pAD_*u%3p54IUaiCX zz(qJdoQds&j;SUCBm05f5A2TIvR!y=FOPcB|Hsd{f8W?Yx0E^O@9iUOMhBk1eQ)5l z_r832(6v=^TX&Y(yqA0b>-y8z4U5zqo^ie}*It_TD(ZNZ?4@-dBNm!fB=6pHEKa}V zk+^>0jP*M%`qWkKzkRQ;h56mZ2;nN-?z*#8v-iyQ&fm4;yI=aba?2~Z)0duq{V)A$ z^vvfe>9!X(vK@;J+c|Yg4a3p3ybrz4NgTfJYxKM^s$_-g&JUr-mVXY-2)X&oR&LsK z$4UB?4?e!$`M&<##+LoD!SAn|+$q0qz+cW&zo1C|L27-`wJrWvD_;C8S@Wdi-074D zKaJjXOT9lYcKY|Fl^2@wvw7BKF@5;MX3$vH^I0H((ZBzrO#YW&|9zSbvKhrcoDWzr zJF553BggD1{8=;nnS>`S^6~q%@60=v3y;MNu5xM2sL^LW*!%9mdq$3x3^p47g&029 z`Dv%UZ90^3|CKk}489qQI9?u5@A#(M9;VTHEU$*I=kvA+y9~VE^qo8?mvH}HI%5Ox z%~KltZPqaAWN}_R@JH`d=O(>FYhLr*&YyV4;B^$o9=A6`eLBXCPAB|GfIVXprQ zT+269C-~jiAW-Mfy-MODcjt>;r?`ZEpW=xB$et*8lS_BMf!FT|Tr<90;Jv(JVqZUJ zrF!;@^mmJvz5eIkyh!st&jPup?Hy4o+MHI+j?-MK(8s8extvF17LUSOo&z&4y}dV~ zkZ-%1bfM=(r_o2_WN zTaTjsCwX2EwU65J{0~;^7&QtpOwS6MY!|fR+8Ncay$TC66_ZcR;NsA{{8Ekc(`vm> z-77R3y@b>kYR)QIwK$D)>6L;Pw|d2QsL4H^Ah%Fclf7u#H$hcn&v|hx)%9PhPu(<$ z!D#Lbp(#H9i>3*@kXOu8RSmp$Pq4a5;}%13y-v14>!fWwle4Gst})3Jb<{I7RiC6V zx#CQo(ccvYx}UWp4UN?^YTUY+qWg`T*$?~+GP$aD)JNFlzrJZ?k#Xc_6X(yS%$H?T zh0Rzun}rq&6$a;vq?-r2^Xeopv=m!(Zno(CY%$T;a%!>V%*~c_KU=C^HjfnWd{JQj zeYu%-fR*NZ!>yYO7- zJd>|DEH^P-J;imsh_~l+Yx6HYq9V@qjJ`Lo*nQmW`*4f>dL_S?Q|yjU@mUyhO=yeX z&k)fYwBXSH8A#yn{}v_{ZwP;P&Y}_;OZ}d-oaklm%W;&xV2C5ai1DIS0p?=)F*qY zSH7rs@zn5%{t?w*gX%?nn*UGrj=mb&y(MDiS2JJJNbS-{<*ku(McvA;Ml78g7Jk`k zZD?4bNwn!_4TaE{#U}2-rpDn{y*Eyc@xB^;xio73R+qz}vG+}*zo+?&h6eDP%Ke(^ z&uN;V_$A)9Ie~ksf)PWaWSP^>M{;Z`NxjYTryek=m?d$$23GF4IG%u%raWbGR`Il zi#%ZRY0H>emO0am%O-)jvxmuR{^9jqB28L;ExlhaT9{+zL^sPbog<1aBZyrex^BT+Y8O;kcm!yApV2BGV z5Hv3gU7VJ#m@E3dP%&JO!(7Pc169(ofjG4yYiygmf%nOqgdBEcIy(F+) z`OdVG-wLI%-%Ec#WC~~~5p~E({9aZVuGH30maSM``@OuBk zm9JYW=YFr8%v!ayyo$ZKYVG%`ZkFn;<<&o1tM`7dZe*!BT3)lYrRMDS8fMnotKVyG zrqX(z3d@-|IeJPjykK|GB;XZ+Yqy^Nh#lLWde7*en{(KWva)*ih-( zC|Kd4)Y_PPv{8PBr;>D_2>j!1LdAz&jB>bIk%G_jRg zu~oUPmH${PBV*fo*S5%MZT}CniLXm38+USH8-Jfnk|t>djj2fu6Q#2Lyx z6;1Oi;^##0&DasVY)9NG3%+$f;x|deZj<2KHN*eVkM5bR{>Lo*Pu=J_${KLVBK}52 z)U^uUdlr7rEczZk4R~eY`%a?&?a^Mth_1gsI=)&=u&w&r#{B>6GbUDAwOdMe?PQ&9Idh`Q ztnHg;+CQAh-ZX2b`^>FBL)ZS)*-$xacV)$n$~m9E%wAuaed}cS=E@wKm4;_4%Z@~5 zU%MGuSeey-GmGzlgnYufOUIP9sx?+|Gjdcd3d?6I7tGdT__61w*^y;O8@L%yK9hg> zvqQp4PxRNK*B)$=7k)Tw`s>v9U|AcJn%9i2F4^C9?)tMchrueFW!7TJ^NXFk?rwOt zV5!gI^OAE9MjlXlv;9)rvh`_4Lndai@hng7+qp?Z{Lr$g|JsslV@1XRo|hZC1s3gcXX*%iv0}yg zsT?~GRS6zad!u!(nQy`R{*Dt$)^m5I?-b%*ue9P2&xz_OdTaij*>G~XdL;K9j^EuH z(wo_T8~>lR)zY`)j0Tgzd(P_Jt$x+*e7~patYI=Ls`3tX@p;l4 zmr8G5UAgY~*Q`~#yE_F|9$4NXaH3jhLtB^z;~US;X}wH-S|_H=eyP&6D9fW|(d<`D zF})?ZH|736*n7;cvtc%ahQc(js{OLNRv)Z7J*D~xr^m+qT#SC4e4Gq7R%z}JIJVfESRNGbL{kq zc`6PEQWr2yk!JGxRjcxV!Kvnm?WUO%ZUwI2y-Ydqs?nT9>%5rGtezQiVrrAj$zbJJ8~^;dcjtm?!;-aY7M-X$k-PH9)j9hQZd%rxztoWXW}C10 z(xQzs-tK)zGqi#-8%Pm$AeGWtG{v{TYUb! z*~^Iqt7>I*4sGyTRr=y`>bW&J|7)L=ZM+=2c3sMXE7c#4ZF#$h=S1_I+M7pvZ_Jk6 zseRypQU9W-6E`;c%-^%ir+Vh4mB%hMcg`>IyS%vbvi8Z#7kyV8Jzle=_lmFWjCHlQ zF4!{mpE!Pw_m2LnYpx-ee&5d0P!Rgq{$YvVv^$)1y|I@e4WEm z>u>7GT{ntev-8+?>k}_*?A}Q^oZo(G^Ff={VsWq3=Y=RjONPdv2Lt-Nxf9 zZrcAoTy*c{2Hl0_D^C77Ip1R60^SQt{QqR}-P;ycd*cQFVcC7}v;I9TpZK<^^N`NI z1*W=Rdvbs5d;5ZO*AwNr5A0dwV&Bwo`LanS%qUxbEat!Gw5T(Sz8kP;-)l}0ST5AL zIlo}zjLx}LH4pA9<>aky=-|1w=q^`v?UB~ECwSIAwSD*WsoXWcm2aQj`#393@AJP+ z{d?ZF=6-IhyLF>(i``s?zc1gPU%tU*SIqRfrc3i)%v#^jruj-=Xyv;%pJWYQtl#(f zuH1X>PlsODeMx<=dC3Ka!2gRA=bE3Lw{9~Vla|BOF9B2d7&?OLZk##2CMR=URL-x1 zd*0nWeNy@D#5q-rUkoOG^6uQV|Ku6%6AR8Cxqe6W{Dli!)-!&2`DyKkKkcYLvNpm9d_Qh)YUKV)H3;(s}vNk>i%5P-LR6 ziH?tIL+3=>QcKgRr!L-{`)sGE=0>MVRyiJ~O{x|LPA*J4d9lnbEX&J3I6OK&IXyeS zxV*Z)xxKr8^7QaxJ8vlq1rw2zG9d~I(uN7Ot~I7-?uS2d-;x}#z@e$eZNZY6!K#yN zD^g@6dIDM-nc0~>mU;##JUCc#;lRSr8ksyyEJya)WTZb26z^=i5ttd=aImqLUrI8g zqwt{5G}he?AHSz2FPty?oJA%hL*B9dvr^c_2!3wQ4z~&;gHuNL_LL_GxD>oB(r|D6 zucYewSS;wtuCn(#E*WQYoDT1HYhl`B6rk;-sJHZ7X;x@jSabB#qiZ`CFtF+*n@(eW zX1I3escHJj=hjpjKR-9^`aE9UDwCI&mR)SJSzBfL`r5kq!^@uVmb|&OEr0pqH(#i-@cz-moIPs|KGN+{+s93Gk38h)UqqhSkN?w(<7mpjqSyP z7U6lUiE6w-8Vg&wi*77zm-lK;Y`dCU@vuWZEn<067WdmTN&a6l!M2E@kJVXe=8{R?MmLvC_GkK;#1Ie^xpZpiK8wZEqKkG)cI(a`UBC3BBQuW@S%xtt(!#ZaGYxLS!-6*K7O;gqRT3G z#+jtqx&@b_Ua#DGIqbJ?VPRJEx}A?ZchB1Xa+{Ri?#c6{*Y9~+z^%9XebXzwed{M$ zuiyXt+V3~JeiyCMKe*=W@AZdnu*s}>eSqCP%izdDy_k(h)%;=}?3EPOGCV#vPNwK6 z@9tk8j$b)cRkToPvyJ}Aw|Q%f=E|MklXcpB_U}!r)UNxeowY5WWN^-T^~%pHY?$vp zI`0|nzUA^3sk!-Qd=~F8xoX7mcgr<{CV__Q@y)W^ZX{2R-F7p5@!V~{p;7SPe@3ZKYzY} zfIvV%fPsO5f`S4A1H=FS{~1UDia%Kx85jf@bU>Owb~3R3S5WCo$()z5YF*CjeFZw_ zOLFg5tb1Sc{{Mjm1s*z5^=-@vCv&XkUszG%wKi&fMApL-Z>#n{*ihk9tw@$P7do-}pZ^cgb^xeCpCty%f` zXKAu&*w8{Bv2(^Dtgw_#z#8 zU}i^pmdKggUlkaeSbu~Z>~i0@$kq2$6pO&q+=U&zZz{ejI`myXn9n2sUq@g<-$TzZ zVf|BcJTLb(b!gYfN<4UQuu)Lqsck^=14pyT0#XZ11Q;BeSoyaph&BXGWr{Z4oORdB zrO~2_`%%T;$ODS=J&Dnm*ud$sNC$MYentle_Hzg!qs++<7G+bFVOW#ZE0)7Pq^ zt~_U)U+8i8n>oYdn+KYs*XVN1c+WT|K{Ni`9?Lb1A*?(FetUO)eSL;M;r_Y1R!qy= zTD#@*c_wMFFWbF3Uj9Kt*|&3|CJp}ot$zOg(Jkq5;J=@bOx#oT2MtVIlaJS%^BBng zZ{#u4hz_n($T-Z9VUh8$wf<*ody9z*ql247n}(7rM?jf^b@No#M;$ubJbK#71UC3F zs9jsY!|-~?ipPC3Grk`$VO-5tue0W;cG0o=_3hpsppI!WH<#HZ_OF{SNpH*d0 zS+GIH;l;xJZ&t3TP~FzRz-*z!wSvjmD=V{Bo@>jCWlO(SG8HNJaY`>=lJ)d4SH{`~ zhrI85!(Od6)%E0FtzmPyNoPqb+v{~=p*x*ssI9r>l)Z@Y^y`gB8g4diRIYixnu9&S z)WPLQ-IRv^3~f!#kLz?g3nrH=j@l}<>B*`?YO8eK9P0~bU@+lg2`GHR!P3IXFje7_ zN|~?OFO8)^J604#ygM+{!D5Zu@16_23~$SX-ZFdFOuON6Rz_r++0Kq&jg%uCJ|B)x zs_1f>tHPq%r1??L!E@^qnJ;>ws;fm~w;y@J@#*YTlUGeARA=xoGM$>ST|hsJquN(S z+VsOE4i*#VE1^dXx<6kj|4_rE-fqh#sn277`J|hSrtciD=p))(s&Tg0E@`C)yxlg{ zZ5j6lj#Sf)u8a{(1r0Mx*S}?B;L=&dB7C@FNBNbseQSTnY&w*{z+7xDapKXG%O7=k z(wD6AdXy-!z=7#;nBK4d;-{`Xs1#eV_+0#}pfyK-y$+TU`1N8-ap5~vxzhp%_H6y0 zH}N3rabM=>&A;>hbTe|>A7Rz}eM)irWG9s0lo`H@5_RC^^X2~hCg|XmV%W>s+KDkn7CdZ~0i`!xBfrm)$@$uFJyCjNpKNh3yhyhQvNk z2A%~xUW=RgMZL0@B`gTJ9OC3UYm#=iRe%Tgx0_cMb}VO*e8_6X_VTK4>_>JEj{`n? zHDx>+GFC6rNQ%xh*u3x8*Yyp&YZBPKZyb{PwxQ$gYUU|M#--;RS~Dgz1t@zT)(BX! ziDz{VcWy+}mYGHC?Jq3LaQD7-Y1X$bD}2{xg`d6^BIP_QdFcaLnGcr7o3^p7J-arq z{PgX6&%|b3W?sj=>)iU*LTUl}<8Ro7##!>YD09mgv#p1$|%*7ltbrk;FgV#=}QoH+Y; z-VF`)(X)D34(zHBcwJv;{eaDS#+IK?<5~h4c-EYAWV{spfm`m(L%z>jl7;;oMV=cl zuw+-T%K3e4aPDyto1bt*W!u}%lPe!dUB7;`d4?W$f(<)kM8z?I4I3w1?S5SGA%gE2 z>n5(YGb!)HDue%O`}$HFg{||xovakd53AXnYQTQ{^o82BGpko| z@|>T3n#rj+^Low^Q~8^Gk*D+PF`lp>M6)@&|7h@`^9e7;e z;s4?+!N0dc1Q>QNXx$?2e}F+a{pf{7OHHQKUk-Ene#YnNo~wfQ8MAV`s)9e=eO)5$ zxxL@dSvn^A(3^XUBs3>4x+-ky#wcSe^P{X_7k~0CV;P~$;{`1XON=wk7o6ov*e-sg z!S5);-c`v-zDu=MhBe9@uI0%tesVR(U@ND@Uv~4$TW-JKq+)(DR(r~Y-4f6Cl^R}& zWh(oB;<97Q+wyrESw7o3>+?O}-gE7fNXGl8)9-yKRr~ZeF>HqZ?Sl&6m=kwP_wnpD z-u5xfU(DG2{2RB&(-v6liVs~TWAHS{pnvC?bid+PbNbzR5BD7ro&H2U_UChl{Ix{| za;xVa@8Vy>x$DyZ>3oTG-N)}QDfq=vH-}UA_nemz$A4WYXDRjd*emm1VluDBysw+8 zD_&c@s`_A%$5Vd3;Z0h9b@Rn{N?VhYZseG|&6CvlzK?(AJKasYfA13u>*BCtEBLCRVY}wy z?tA-|ieG%mZ>Yw$K!#P4@Aop-Kfmr7*F9~T`Bzb@VIEi5kyqB=_I{ds=f_Qs`vS3N zep_#w`{!x&{4Z};?)fWq#^PxzN*0Por#7w-%3t)b zw!6(%??t-Dp(fP=+jB{37nNkMBsE`a(w+N3mg9h~?nm8>DO|6MS?qQ&Px!>KwSoEh zW48?srTPv5P8*urr>O)+uqZ9jQ$C>gPKhaPvCzXULf@Gfe{NzBzp8(J0|Wn!Bozha zo$9s4Pgwr9GdGqn={CDISCncj3~Rd1A^M#;K_bhuC_%f!;LQdDUS?gE<>pEO{=UIA z--OsJ0!2PQl$K!@-pF9`{6nNIgNy8OL8k!S|0Rc8EjRl3F7eTL$o)Nx*=s|G-Gz>I zVyeL!Ob;F#YaI5_PHt(=XnL?kaB+*z(FTcIPpoE%I!m{S?ac7eVPpsh<+FXr^W%V6 z)<;Q=r3?Xy3dx)J!!?+Kr?&em@*Pl-WnLhr?<#)1q2x;uAMXa%g2s}xV z;3(kbPEbfvVR*{nsrA6v;XwC6w&rchoo9ti_86F?rJ8U~Hn|fb>9^Q3IYVz>L$6F@ zmyLjH)Iti$e{+gQVzV-OmP|rY?Naj*^yGUPIirUniu3$f3;2) zQ~i3Fbs0lg{!X?$2KEF7m-7XavqHmu8wfn#$ZE4nsA+@X$43j44)Dk<%5_R%Q1EE`7VmRO4fx`z)bF3X>czPUzXOC{Ss-*#pIkKde?e zJ73tbY~|wFomZIjm&@2$3F@1dK3}o?4TI3{EAFeqmUC?KKfIy!`R4^YCM=g1WZ#!y z*ZE7{XCk-z5t#!8E7Uj37$231*KiJH=;r&>UAl~Ucd+mRD|el()z(e(#G01<&u(|! zZX&$Yi)o>Y=!#X!t6nMWkmQdy*R8+7x6w*{`z?iozu0%b5;6I>y2xmaUCWwmg;Msk zH5*nnA8=P#^UCh|PAOSn6!V=S4I6&{{Ih3H-9>vzAGz@RUx|hgW^%qEzB_rtZSH$q;ez&*?8SP@Y8Wy zy;)px2#079Q%Lr~?~NN%1J-QxW?@L=uH-%>m9f!Hp|s+&;=98QQx*4V)yS*Ltg_f( zzBQ7QLD0)0`fzmN;hxWO0p-dwwK+9*wmay^=fkli!wF}Oy!&AB<;2mp3;YY2O~U3J`}~V9FX&jEg4P}F z@RB<_-z#XaMYA)_5$0Q%@~8SlM-A)Dtt=N;GZ{@f5x@{SgY~5U0tT^T2lN{{jjz?2 zwPmCm$Yvi{uu8zgB!)?phk5?ylmF+eNh(R>>eZ1>zYsd*!$AXveb2X^T62bZ#xbSM zy9L<;PHnw&YB}U}?Udg3Mey2&R`tz&*CP3NnkUtm^l)$DdhM`%%TnfTd&2LYNi5sOZKH(dow{|&Iik+91bU&!zZs^@w;n$pIPpfA-B`5(`#;TGe0Ge*D=9fS^t~DRj0cX zyt(Gge%yTZNobyK!n=u@MqBurpIFXMiuQ55WS7P8yG7L8ovFo&=|Q^6^s{E(x-1`0 zpY5!TzrBlD)l8{>^3l^9u7woa-3Yw(-8FOmY54wO^~<(@%)9!ju3&;&>bkWmE2SH6oMm138x2k`Wj0^{14n#W8i#v=(6*I4&iI}*C?#8DBzlCB>a4L;lUq~>}&Ah*i8njTmc8s2^03Pb}ENBUfO+;qg?n&pbi6< zLy(JM?tjD8ra}|64oW<<@XUMJ%XdIaEv{Dhhm!xBW6xIIpA!6d+7+SmGarX`Ex+C% z-F(}G`DO3^2h$bi3H|vf>bWX^;g=~{iDF*C?HsW+8XqPx2ux01^=QS^YaI+0tFEsz ziN45xyUOVx-;)IWza~un8zn9j&72yjmcNnZ?-c>LuiRdFDl64^cNK^qmkiK&F#W&0 zQAc=O^NOkW7M+w|^Y&F@!2PYv&vuvu%vtw1<6-jFHonAr`ED0kY89@$?=Xp)nRR{x z$5AIuCSH8qBM zb{kaFFCO#If0vc8nZ@5rza;geqU9S+WA5hyh0MG?G6%(Tnp{MG?JV|n2n2`js;v|i{0Oq?}K&1J6e%4&DqFbt3sf?A` zzG=GaN#74&{s-_c-|~mm*iY~6TDRj*o+dN6NZZAA?c2WaE^F56w{-y%?C*Wz?znaK zF6)E~-<%6FlQwMrH~Fi$plgZA^3y1c2LD|0-T&K*xFF5bCHFs|%+oeZ>^ZR>m7;!)O=4_f2>U_1RB;cFp z>8~NdKScyxgVaKDAo!zzp?l-=X+I_AZ{%HeBq)gM z;&qr zjTtsdlQ$g*cv&OFenE3<*50Jex7JQR`M2rtBf0mQcjrxQIUE{lq+9kMHU=!V6idSqhKJ>Q^>m~VOC*PT~k|^lUeVqc}Y_(S0-sr zQ4+P-aDq=%XTyd$tPj1`-n7ukdG~DAgL_5?9@t&ED>ePX1F1z?f=hg-Z-~pzFD|Yu zZO%?t)-=ge&Cy~NQQ(;RfRSOwbcG|cFCW!j;(X=wet8B52ZaaLtPFfHO$-M24vKty z)zWR`FWnR_sGrpHLs!||=W!oP!-}O14Yh7!|4$j+EL3f=ec-gINAvRKV>8W`*Vs&& z+$G=QaZN-hGkEDXOHQ4<+m*$d!OCnBPQ6;CT31(vtxr0;s#H6C6=#dq#%)Uv99oyQ zS#3jM*{bHPd25^AF59AccURf_QxXP-oe_I%v(h*p99X}6UkksoUrpg9VFnjYX1}cp z3zPJUwUf`SnaRzV5<5YzuO^j&*>3hm3A?pbrmt04gT5OSC~VHqW@b2$m-}SXyLSol9~YK>*_8TLm)5BE-CU{sqD%=_i$9*?7M@9n>Q_4M{n4r)8CPa5;? zb9wvq-Tm_98kg!vjL-Iae7`Ga_y6A_E9H&xvEQyX$Jev2c>aHW6L-_6TY}7?Vg0pi z-=@nqizoeXDR7_TF3#B4keHaSloqk5)5s>>rM<-T19R)2i4}`_B)i0A)3&$1i0?7} zv|~YyQOWjJrtNz}RYG`Hq^dA@YW)mj`qH{NsXsW0BY~eIOYlITxUJg^MrIE2bA2I` zcFt=~VVUMI)1OE3;*9J=C-1aXCOS6ETG_GTx(Hjx1EuWT4$0*URF`!$O>t!?h!r*8 zQOr7j)0by6W154i5_@$^XC9gBH=*=G>BK!s(vBJ|6a1}~@^yM-_ceY_Te^Og+WZC? zyTAj?+#DMm43?O2H8P!&C_2E*x8~ua^{2j=WoxWEbW0~K>{MB6iO-Z<|Fu`V=c)D- z2nsoVgiAnR!dk`&ua@a(oUxj%my|BorM7$*mjm~DUzea`%=Ul0-snzv)6lzW&CK7N zyIu+PTyHb<+Ifuo`ljnE7{8mXNmKmyjj_;hucM~lL22XfF}o{MyO?-?IrTUwv~mO- zKas6-p+iS^lfxk{z7v=7vu76>8yvURH$AYlIxcNFgS%lv&&k?lF-=T790m?fS|+jw zIBxLdZaQbEI3Xd(rg&{M^99R=4c9izyP0)8eYKkd^IDY!FBUMz&UL+$aalI-a)eE5 z^yF&olMMIsf5yx?Rw^8Ke@-3in_IU;#qL=os)%%jKl0#^HYzT*p0`uu?%$Z}Ph`}1 z|1W;F*tk`d#lA|HUQjkMQz3R>G^&xIIOK$qHIDL$mC-ZEN za=+AsM8E59D>JsR2-h4}kN+zY;CAnGt@2iu#(DPx^Y{MnWVrUz=Nsz>t3_6Q_wBR< zzBT;v;bLI07`TI3$FXl~_SKXUY^-KDJI?w0bGfff-r@i#w!tuhvu;xjDv1h}t zYscq5ur+9Q(Kzn;hJ9Vo-&|d$57Cp|1P*OhIFNhizyh{t4$j{*`D2(ZygoW5Hb@yQ z4avRS@hawp^IV04LOdF+bN7AUCgIoIYG0F(r{&4 zzz-9r;3~GsMhQ{2I+1gw3>t;XyO(5&G&DQ;JQ0lNxO7eA<>?y+>pAA`ydEPF$~BEK zfw5V$jrm7NhrVDjZx9C)OM{|}%$;XqY!cV^?wILSG&O;hJA;Au)xw@SMTT(QjW;K~ z*wCQ)YEswaU#hm=8x}F^JTT&UJY6otbLYsX??AkBFbqXFfR314f_&nv1<>#cEZd(=$ z^tBw&J$`e2@jSu&hPzHbSZ?oVP<80OyXYGCw_6;qbs9O?I2cm*Y>4h&mLO}ZaKNR` zTlZT)w*GG2JYBDct*@?3i#l}IDgDKX|DD%%O)L0N?3BJLLe2h1Y5mR6C&!PyvU$14 zeDAAR{p#DV?|ol%UG&3T{o1S6D!w~1_jK0GEqwj@{!h6Fd;YuXGkI7(VBT)NXZeA3 zbr+8%__a)tU-|c3ne-dyIHvQv{UjQgP3GwEM_1G=^S&#d_T#})7mFi{tv5Wli(8^J>-4O7=RqUg8nwe0zV!t1I;++7>ggvi59{J9P2Vg}$E` zmzwHM*n9D_35WITC%reCCdh~dh#d%uxw}Z_`Ij@N@|He0Yg1HkoXu3IV(}Sqj%-gh9IZZ_NRQ&5{G3DS2T$9U1fTGkAq3r z-)WEjy~W=OtQ_8Ch}e8#RHt+ z3Xy8wVR0?ncGm_RndjLuS@VrX;ax7zbJj0eawl_4cDwvAV)p@#ew!WsjaI7XWW8sc z1-TygQa;a~Z`Z%= zyx`4vm7mEU?7sU?Dclvh_~p}bnR_Q$YV~C5|HcUa@>(;0&gbI9_n($a|75=WN3P+% z>yiKRZ{Et!yzA2CdB32-iAik1EZKYiPckqo9X$0lp4q75MLt0?jkuBCdc4EGyhpC9zT%~WaxTFG&YFYq%wQ1o1psQZmW;#Z@pMxsT@ zCH-?(^_h~tA8nZ}nk+8a%xA|jLnrzAgLv~Lt_o=^CN>8Y#12LzCYf@1rO2?~N^IqL z)5|$?aj45xmyHLQ-o!LaX|tGjwv6`(gMx!a(jgVOV{t!yoH)EsM=&zVI9$2-n74_0 zmZi7g#Azlz2V)d3I^KHp(nV1BU)TfI$ov}Ci;f4gc^b^UmTaETaAQUwKLhJW%Zn{b zd3BW-UA$sFg#0YuOe|`Rp0#30mdRCzCCqX^d~6P>oNsYycbUZS=BVG?+Z#SOq~AHj zbmpAYldHb-*z`j$8FkF%eewUXznG7W!=yuRqctyFn82Wva?t;k!pw-~8|qzoNQ-%Aq4u z9DFW{>a#JX&s7S^JH|L6AVlQZyC)JtA?zWH;puXBxOJ|Ci8gCr5S4$?bt6MqChgge z1zy_~uUTm_bJ|>!4s?=R8pvScyzxgHqeW7-SYM9Dl3-8qoeRUQ-drnHS^j;7bLky{ z{GV(LjL$EZUY{oTw4{rlU#GK1F`~R`d3ETK@-B53E#AO3&H^D(min533aWB1YKMxhlyG+qdKDE67Y zX!_(=YH)y|W{MfZOmW{}X|ESOOH~rfnx|$uPL^!&FI!Q^c(gUExg+RN=cAh&S7aJke}MSe%Qq%F0Q7({p5Q zS;ZZl6139t7mtV2%3T8en{|9E^E7AfaPhwMqH}`Fj7z<$ezK`WYW-Pl8jD_@`=BW3 zAt1WuO4XmVIecF2Uzk%n?uNSx@qf5ga8L72#rYZ6oVjwRIJ{{*S@0y$plRNxGci74 znjGGW4;nT<^#UF#kkkPkZJSm(9s-G!&xEC+KYNEw8* zY*0ANxW>_jgWbi}Y2B4W+$@ce$1>WszH-@@#WL^WT7}-Sd4lVIdD>WJCvC{uxa)YA z#8b)CYcdWl0x^dU+Bh(FT-+=bv_5}l+1}#F3I`_rYtG73SXUqLwR?2uv4+xt wq!ZZ$ysE{pbm`J%%a&cfeEH(Viwq15d-v|Ox3{mWt9$e2&DpbO@7}#D zARsVr-n{?+|Lg1PD<~+$$H(X8<@NRT`TP5?UAuPT#ECCozMMUK_MAC$mM>ra<;$0Q z_wH@nxUs*#zpAQg&z?OKCQLYf{P>9zCpK-`v|+=B*4Eaxwzia%l>GesKY#xG|NozX zGNAaAg^__li$Mou49HImZ2ujm7I^4L^`BT$bTY?k{)H7KUTdS)-&j+2`fb(z2OBDU z^k$!bv8C#4-tPM!cGUQ-zy1Elp1SkzfB!F%Vrp(_ZENr7?CS36?G$U6IBD{fsne#< zn3>C@!aQ&Of`y9~FIl>5`HIDiv(~I#w|>LMO`Btwm^F9o+_ihp-hKNI96Ypl^_FAD zPncaRL8*UHOFJ)qNBGX;0#akvm;t)xgp|t4KY>VPoXO0w2KmDJDO~OWjfiawkokgyuXM=-g z02?<~g~=&H)(cDIc?Ak4BxH3lb91!#2s$2WSz_FJ^Uld_Yj1DQuXTlf6@0_X6Fv%B>e zS#~4{J(w+FdS(}YutJzmqN5&%eCjE+mkp&{OWBkj1g#0%^6~MB$>NH=r%Uu^@Jw>@ z_&w`D@ubeRyYDQGF1>Yk^IGw6zkPdt&N;KcNM)b2I1`t^uE{C#aklzDHA|M?>zG@+ z^)myTMuOu@%kA<3E4GH;E#2Xf5Sz=XHTAxafu%wW7l!~tNc|($%l~gSD70xP8MCgt zuIR(>6W~z7?fbxi@r~>U23Due=M7x~It{m&gf$p~b9qDz7~Q}2nm?N8p=Rk_rM+wc zLzyPaOBEKj6&_OhOCUN%q5cwj%lW=yu6t5 ze0K4(mCxrDT&a9M|Huc;7YkY@Jyc)N@#s_H!XC3%8A9!9TrU>&hgG$*GN!D0xol3^ ztC!0cv}wIsv1D4-tCh2|7}!>=+4kzy>NQS}+8AUR5?-&}@od%Wb$hOa&HpMdtyxnTzD}7z}Mw0a#6~+?ncXRJsy?V3bh0&7# zxm#au(>}XvcERg+OE$Gwzu$X#%Iz0Be|+QS-4h$}`uzb-hCOWiS^kT6@8vXKqp{gr z;Z4C|wtU48N8W|aX*(kEe38BaPx+ho$6JeZjP^;T7k)hXXjx6$N!iJ7+)wD7*Z#b~ z;QE|(r^DB*Dc)jZt(@;J-&tcUZ}PwA-Nl+^%O~h_)TD>xe6)G%&B*B_{ngqr{NZOk zE{}o+mJt8VTlLc2v$tBr_8-(wGQ7@xCc)qk#|q~gNq_k+S1)T1xwcD#?MmH;o~^O^ zzj%!+EP{Ws``r$%nd_Y^AR`ceF^>1~j>iWL3KT8c!jGD5{TOt3N{gu;1LN#O*9ku_ z75!(L#<<0L!+!?W{XL?5cMiYsJNu}!{qXjAXH+*#&EG3`fF1Doxv&${cJiKBf&-Wy8PW6-oE`bjdnX0dvUS?#;v48iWLdACai}>7Ud#+se z;qUn|>+`*P3d>lYxiByZ6*%afa*ZK-k+FZ(83>W?6MH_MHMIopDcoo{`j8K`+WQqDnk zl15Qew8|3&>laqMM>k|71S)bXT1=A^I-nO~l6bRhp}VEw^Rk!Sy(jo9hIm3^Ss#c57v`Wu+aAAHEkagYX{;zMJW*^J&Fl3E5;M9@qlal7vbv31d zNkQR|!>i36JugpNhky1~U#V}+`XOz~zenALWsH6DCd>JM9$rv3brWAr4&T3R$%^V1 zFHUct%$dlOd~Rk&TY>7?GijH$3q+==8~y(f9B8t=;*6GQu=%cs&-L1;$g|5B8|>eq zF~=iV`q0T^eIG>5&uB}Qz0q@_L-}MtPS8r}=`Idk5>niLy)T3$7e328<@~Di+LDEA zoav6PtxCxv9%tGn=_MTKc%;7eik#&o!?iOxC$-6Kn4l@tu-fI2*1c`T7rxmDuHP|p zLhZV$*{3#!ZoE|W`e2*d-k*O$s|yw{-rZu=-cy&#xW%~Ptr*jx7!KEsimigq$|pjm z#A&SLwu}z_YJT}1&vBO{X9D6^a@|-UBoH*^Zfn}EOoqQ#-795gDW$jvO}~(JwD#Lf zIls$~CRui=8U^cI%Cp$M;P6$|t$AzbJv-;5_$I(%ku}Tz__7@{6sm%zD_1-eR9n4h z{;w6{TV0xj>Rs3!+OH|?*sFZ<;l2}Lj~{M~o-?&Mo&ST9#8tNg3)appU3Dt{YM98* zHdVhG9T91+?b8a*7O$^QSv3E5)tl`e6TI7$F8KcFRM{y}r&Rr_n&JCZ-fX#Pd4~6A zce8jrVBB%`L&VPP$lnH{dnStJ>x)h2J{xx2V0U1C>^bdg+oUWFeFP0^rElK){VZa? z^2&mWbk>B#9UfbGEY`pJV8kfNdS%hZ&#XUo-FmR=p}Dw{?CbW#MR$#73Y*G>tt&56 zOnN_Y#_@d~29ur?-HP#fu*M)PYstquCwP_~bw3!B6B@MghEVYmowdD&)&I*fGGiPT zXk^&(>aFWaiTg2~^V;bNg6pr(W0Yrb>b|(zG5t|o@2R%qEl-QMWUh$IKK*r0up%cv zO4jA%s>b+;SKd>(3huF(T=x0*Ic$#Urog@jR=(xiyyofaWGcF!?3-H`AL@2i`pukc zdpG@CkZbccT147W@8HFwnXi*=Jlc0ToBZ=i)L;mav*n!eyyU<%#n(bBSXO#H`expi zrJ>@eHk;|3jd5Y#mPIQJqQ%$8F$o@2V$9mjVJa0qe^&VMk20>lHX)z1`+s^e3Vd>9 zs!aURlhx8aP5Sl&y_IRbx}OURt*Vn##n@R{qQfloc_fO{UT=||$JBgX_3Zh%nPr|q z|L1?XS}`N^{lzi?hmV{bLLU5mJCgMM3MO5!zW8ll`K7ZhX2x4j-krSD#PiOVsW%pM zGHyxsbz%?R!V-|_d$y9}u5hr)0e8`^%JZ!gcpMgQ*)w5XL{adJWoLg}Y7rJ!3}+G) zc3#SvaNW~%+P1D$dn=7H@A>3K)l9CF6#4G)K)L(>(&-0O)QnV*`S@<)ntDRy&%XYh zCI4n9PuRNSX71-jKUTP()mKkAa?pLHS9}n|{r7xFXBOBSI)D26pxgfEsrmvB*X~IT z$)6A1lHUKhpx;`sXxWy$Ry)qc>-W!nSI_$E{UgJM$$DLE?DLk^pEqhyepJu)L+4L9 z%g^l%e=jsFo>=l<;D>>Kcq4~e{b%<^i3)w82p0YujgLPx1}|vfY;MR4Xi)MH){szA z+tKu@s6>mo`L}wr{^7==Zcrs{YlW&N`gOa1zYlqw#OgZ8JpUgJZ#?-b$noG4^U_~ZWKSd)O*Vl z2L2BWD;mY8NXY;E=*b$O>ab1f$)lRC2qE_sOl=ljmk)I0c61#t7qIBCh$yz+VZeBq zv5Vt?U;Z-D+|Zac!d?HxPjoG*Xj#tDb9h15kslU88YVG2l=?%ZFQ(XVJ`&&kBZ^6+ zXT3nj@ecJu^PZbG+)lnQz57G&{tL7974n>4JzsbvT|X$dcUdftV@F0q??Z|DLlJ$S zPw*eB=s$Fz!~a1?kXg#AZ2`My#FR1hrwcHwoG^iF=LDXc6ZlqgEzRiqwxU1AxNoBK z#DfR={T_526P7kI3eHK1W&W9{6QR#vIZ0#YB&|p;woEzCj#dN7$wn`=qkgc4SWLE< zIeBN$|Fr&ilagRGykvNEPRtIS@>8PjxQR=mJ0 zk(IL-1^BW6lD`IiEG=1bWVq2-LQUoV)kXoahB}zIV)> z_i)Zbj=9yIv-4Bts2`pixnS<+jCuJF=icR**QGfx?!dfKPVN_yeXm}M&6uR~t5ZvE z!~B1eTALoR{^!&d4Pa#6HJ`Cc;7aCPo-S>f1^nz?I{#Uv7XIR#FPO>xy_2^&K~C%e zI(Wyd4u@4KLZCa$$#joe3WL70C9l*dF zz}U~U*t|-}au<(Nm5js!M&1Ah>43$~tAt!v@wjKnh+kmfUBKwDOW*p}k~acNPZ}&; zsK{WKwN&E4k{GWg&l#632xRoiTB;<#6jik>k1HmuT5b`%eA+4A z8D8A8PKh;ftqikb(!6E9Kx)-3gH_&_R*42OuE<&{7O<=(Xw|w~OaEtTtrlL$7#g*j zw}7!@*J@VA)xRFB7W&92t+2*>)tV)oYmd$1IU&WpYnJfAS8H}?X8(N5TSKC^hDCG89AFIJy*1|c*0|SO{eN#wvfh>w zz3qSU?5%0Dw{;b)XIii|>-V+->FuG?+lr#MmuYXysNP<+d%NH1?RCGmH$PZ;ENV-> z;g$x69bXc5lq}ex-nb+8;Evh{J6<#FEOgi@rnu8Oac5P-&X)^zYM$8UaawF%H~XA! zzQx*Y3#`?bXR|N;y>|Y_T`WSoW_m9#VBDRVu$%efF7w9SMGJP{J+M2CVb9M8yEVLb zxBlL>Qd|9ywD_jmJ5Q`$ccfeBw6*rx>|N(yuf1r!{K>?4fphm|H;vLGfl5&mcg9Ej|>i*-|0Qv zblB-lulAfH8#>u!&UDG0Ida9}h;PG@r;$g3bf#MOlw5EyHwbF~v%tK?Y(_`Ww7MM! z4>lD3IZ%G#(6K85NB3Uv*&@uCpre^5!*k)gj*Z39poF7t%||2us9)-2t246RvYCO; z;nf`=zfhqog5^oboumhVx0 zbA%`9oKU7Dba1 z#npx)>Q}=0k9e#W6Vv|UF#lSekD9Ztub8KZTceARzoE#^H;Ng5xCI^v{!*4syYB6x zC_H0_mn^4iprV}1M}}?2!o^P*7Ke(@pCbR!F=k4d=>Le`tL+~>O^=;gu+)`jS%J-^ zt_^E0GJ2G|aHi-V_n&&hXIo-c&=SdKQ$&5&21R`oJaSOvnTkwqu3v;}dR}j+%Sx+e z5&JDF!mdd-UOm2gjZwILW6jQml96}0x!1DHYh~auFf08bQR-}(efiic9bW#mCnx<; z>29w|c`Uay_O|qM=?fi-+s{rtyF_5)N7e0aK1+KuY6}@$on<1N8CRC8CJ9HMYcX}) zWR~jgnhhiXv2d|DX2h{?ZaEtl-Ld zsQ3$q-%3rjS<8F;JF}@}dB}uD#p;7WI|{6&3p?v42JPk*HG1|i zh5Zq?;-ha5lOAmo*mUC2)q^g_Q*$nUENVHNu!2!q%cMJEEBC^=ERw9Exzm)zg*w~! z+&K7$d%q9wLgS8xGZ%M15V!pzxV6wh?%dUB#(9UgUAcUvxI{#L)zPccN&z}-DL)S? z`y3R%eb8Te;)yRJ5`qN*SFbpWG+ee_D)J!onProU*T%vUm8h7et32DTc&4pYmQ9?f zAyk$Uo;g<`@M?*Wf=sJu&YG_-aZgn~F9`|VCeLA)^UqDXdarBg!3g|SMyX&@y@?8zkA2`CD?2>dr(mPIDFcf z?wVtpd2a97aK?o1eR7k+Z$}xOxY8ZTA8xaDy=Bbu-*U<1UV-;r=`Ss^Nl7US--Som zU1RCba$V+gJy}xXQfqTf^92UGKPeHHo;g2fnegmI_Q$y~*HRg7sAd`L=f10I^=@(c zoWj>u@`*7iA#Wx!#Du6`o9OjE?P|v~C*cXN!lp&Jd~+$-9G@)v*5nSisNJ!9OZ!@i zqjt^f`=7yUZW<&J!k_ja^_#m9f3Ai z6JhOO}g4S=^7Nnsj_D*18|Kn}B%jeDFd)Tp} z*E^Vv#pUMhyZ0YHKFq>);q0!>R{S5u8~Fv6JiRHpVfGeh-;|k`rnxMf!1|x*RnmYB8-srs}$W7nuU0gC;%@ zjyW$PSjT32NadpNnwp4xU!FW&9AxZvR;So)LFSyD*=;7i7cLcqwB6FUFr};g%`~mx zHoNQ<%N|?r&)T=tLEFVqgh}kF0mJMg(`KKT7PLlfQDM3;Q^g0Z4&#Hm^WASR>-4K` zNHfX1!Z6P^m&M;grJQw^Yx|ev(%09IU$|}Y^ng;5fQhZ$p@ybLRspF-ZK1{qqB>RQ zXYMIo&JcW&rAn@d`R%P=-!7>YENBRkIngnR(O)us@wp9~^;G=jBC@+q@B|*3#vzvZ zY?~R!f@3=#JbSTj`K3Ir6($@?1`bkQ22l%CKm3=-cr>*rZ;~JHt4BX`y2AG)vzhww zG59mCk_ueJ&#~*a>weaZD`{@JSu)(+o0iBV2`YYG@LoiW(ecqqRyUOg%hcaEd}^Hc zz_@w+5--LcZe|6E4?6F*T{zLls&-(l;a8DE?o&0l8?2Jyj((`&UhNd@(rF=-->*d3jDr&?V~YT{nBVFH6W`~QN?;e1y_8hp1$EtB|k zzlpzN3Bwg3kBECrA|J#V7Zq?<#Kl~n==oyng^2``NR+Q zGx*7@SaN0i44d`K9*9&l%*+v}SP(p2w48w{^TszrGaq5b^Lysy?KMm;cPzhtJ>FCQ z?w8Af{(nn0IOns+T{YKQ5OgDReQZaJ?dI6;cPro5E;cpQOTE@~KVZVS*8dVl4=h$M z7E^j3Ai9tzK*|f}OR0ngqT|c-+1DvE57L z{}Vac8M~eJiW)*fRFu^{Jd7MBP4aoNSbm}ggAh-{z1dwg)_Zl-+h`Y>#@X|>40}4-{cubO`aK6zHD3)8q~BV zgpp%{q;IC*p3Aq|T-uhR#;gWHx4 z>FbQ=eYJ_T+IrI7;nwFlPk829{Ols8`> zc8R?sdqDRmzeVvHFWgu=FQ_+7DdSUp>AC##>CS%}7HRY8-EtvLeO1r_+sXm=vyJppyth7F($v6AfI;};0jC(h_vlIwlF@&*Rv4RZh*TDUJAl*K^r9hG_;2%rX}iPLpV2NcTFjj3Z#{rwd+{u6uM} zuK1#U??Wb|&;()KXOB7lEW5IowdH-Aw|P8!;|%WasvnuYz7D*(?>M92v!e6X%(WHg zOjxITKK(B9{Je)nL&KAjo&%Ak9qso#7MUMZiTE#aP~gmtUTKw<$4cS1F7565yu5N( zkl*5~mk)&9oflryryVV+XYAN(`ryK&o3Ach-6Gr~#lrZ^?DMYc3lErVc=={x;`FUI zj=9Nha$WnzV#D*6Qo{?fa=h#xtRl`lyQa8(w{Ba0z15vh66O)7bKhTDC|#P{!o1}R zi@M3QiJCzS;^hanAI{?5)Bg7CcAIZ=U)CLed_RiU;^=ng4}1J%p6osR{pkM}k=NJF zdAj9}g^kbcqM5?MTP+^OmFy4DxdKr>=Qrv0Pwx@!uCxI~*9z9Llz?pZou9ZvKSpj$Ge1 zTrPQ&_uiCUX8|M6jk)h@zyH4Va9?1$lkxLba~r+vf8|rc7clbP*!@URzVhUEs}EvR zf8Pl-|9bLsJ~L~^9tOJ&l^6TxeR1G<_At7x^2}_%&r9!%vYA}?!4`Ai>(=dm-@ZN@ zc6Ghn&K>+(Y$^8}cp?sbKWbk0R-6Cg-OqK_Ywhi9oD`ZKL?3u@e*3?#f9L&a*PH+I zTY=p-*TTjJ=Ko$jF#rE^>$=+JqW!{8so&4>iIm6oz+yDO!T=%bG)BeBn4%@%@ zkoWJ)yZ;;;7~XpQ|IzvX*ZL#(&NJL>{P^trN0|a9%?n?QycxwWoYlIZY^Bd6&G5y{ zfW`H{fVIGdc?Jf|`}zMRoM%qYXNmp5DxdkJNS`@ao%JIBkBEXF2?gwx0Y{l$vxr|{ zJFEXIVguuf_3RTbuzGKp*RbJ#i@={F>p7$s{F$_YOS6FU@k-9y?>X1||68)*-x>oR zZUOF{4V*!_4r;um0uGEy%a)`~V0*uk(R>0kmjlC_4}2dl@VPc{9o@kHu%BnWy9pa} zUQ16IPXq5+$9?w%_`bUHXI@8i| zG5B8!mr#K#6Ul^> zbJaDxn6=~-lF~FmD_k|gZTcG`_e z$fH^H2dl9J!+{+O6xVK)*EEv*wo%D2=+g`?`6-Q(vl=CNCUL91G3t55)v!iV?vVeJ zSK%KFl_!2siZxREnWubK(X~y%@5vMMSB2>X3r(UHsq`N>^yEqFy_UWvU$u!w;#&ajWS--Yjmvct6vq9!>?7dOeD{iM%o{6B#`e%C{O5x?ji2Oe0s z87*jFR8WuzJQ%ISV9LR$o|dk|K3Sf**x2^-i5Xd&*nC4D%%8ViM)`rFJ7e6 zAeLxsmRf8UxRFV#!K~2OoVnpgl(GCzpJE;L(sj#sd!$hq-!F=;duRh~=&5i>b%#wI-8;C5v+`l0B?VQgq_HDL4Jb~w?rp?J<&HsG1t$8+=jXBS5 zo_{ZR=d_@gH-w+wDYmOLu$%ePZn3fb<@MhfLhR!w*lVA(pIYp&kLaNmE`{jBRX+1vl)7Jl6XmX!A#|F<|kEb)K3C17@ud2>I%=vNQ^t+#(n+5G2A z;A8`?RDK@aP%q`FpM*+-V}lrM^naKf2y`@Ep|$n3-PaK9BG%*mo{^%V)}f*2OTv;v zSqcmOxF~q!mo5$ZdRFb~y1K35nje^#=rd*ZM>PM}5SqC)a&D>6T+^tTQ_XKO3N8H_ zwQ*{swnFsI(5U=CIlBh8;EQHQO&M}RBh~qXpTB3?AQJ1mkokyaoWEw|e2=)dU*kMG z4Ba}+)NuwHWXVMiDfv4WOIs{ zGW+-(2@;ZNH|SGzZCWFF?P<2EkgQu+#hph{Ity3%xMy7Xzai)7B-7;8C2gmbPEEWT zuyEUjM&bQ!*&p?@F9$DvV#uqs*gWB3_ZkL%mc-V8wK?TVMjS@f72h%^C`NBeQw}S# z4r+}3Fzva+c2SK)E-AM39K}+3wzMB&LR;3Z<@nB@{+*j4OLl#+WkF)ilfbw?EaidW z1-GvWOEITETCh>hJ8sI-bQkBM5;n#**9?JfjU^0Kn$I_NFh&VDL~eT_Jf}=~fzs+f ztwK#pgq*%B9ylyyz~aTBBjB{AEOUDq<12<)kF0c?w9hN7{&Pg_EQ3`__;N2t$s<-GSzkK+Xo&HbK=%N|oKN>AH%%u#juwqo-cnamQ})7vdFmY&+TVtQRF}*~i!S;i)nc8*Rx<_4#3#CHc3JkZmp6zelExh2^!JNhl z%^L^Wt}?Xm4R7z9-fq9tE1{9`-f_zxF4Af_oI#Bo3!LJ7iYoV6biF;8bnU2M$KxEv zw>j3=yZ?*#to83%EWF@^w_dvw?}eO#C69`BU&=48SW-44B;jog(-{VxLw$nI(mm<@ z?oa(ME$Oq6kPS8&i%{5>71L+=4bON9Vf@$?7c2AD{<}I#p#(j5A`fm zXS!>IN-PTWdOF+Ma!$Q!%M8cDgl3^>ihIv(U;K21^E;#2l9F?tM(#Xiy43$7bI7ix zvA>okN{R0FU99GP?VUm_%f)5y&9Vg&icDH2`&O;Bi@dwd!79ShK<5xwn56#gw4x=8 z3QSmAPq5_PdN!AF=fu0KN>~yv%}{uhAz3p+f%pFRCBHl7sh?kSx@y_>WRG3b*ZLmk zN#5RT`+sJ6+mY2*71o?psNLmm%=**jq}AF=!L<`Tdg8+x+P0_1N80_r^<`b)2Fcym zxvU%bZZEHy#wq@LWBJ96^&K0gm#q`D&aeNr>9_ml>%u>G={^hKpXR_YBk1?$u;0oY z>$etmZtHw>@|N57~3@^G;peO^hdYPoBN2{PwQy+dE_X zck6TQOy}D3ki8)Ec`@_M0#=8oDbdeP{BAt+`|O42^)GHOeY3k{y|DFbg|oMw-}0Nu zzpiXSy7}WO=}$~^Sp0wQkN^L2>->(xYfm25omJ9zAm@ggYgdEj3>9ylglo4L#8ySQ z&YB?{;?k@=D_i%^?%jn4`qvz&cHjGY_FivA(Q7>F6AsvHNVqsF!dRzO@mGc24Y9i7 zn!Sc|j$5BOUdet!Fy=(&YM$lKPTX~xow?8?;BeImma?U*4%O%GnsYg7_t&$#OQRpw zoLg_2dHdkmmp1%QZO;F^!}r#vb5-<;<-?Q>fz7)j8YFP2gQ#W;|&lzuyf0OXZrIHfhiP(cArbAEVsekKT75 z?!E4LcbCuH3*xUO>fGXAgqdu3V07YWa*^7mgtU`OVs1@*J}uBZCCJfSsd2{Z?b=5R z4TEIF)=bilcbm_6aFsUqQ}<(GNh}5Vws+m{e7a%#_ z_1#=R&Uu}JhpM;^ z>E=xOczvSDT&Y{dyG8ySt?OHs7<2vL`GRzgnbSVE=f%4**|n_==B=?xGfj=~`}XLa zH~ad)@&iHk8TZ&XdbC*|U2r$o{q*&@j}KRW2;BQ&?ai*IEZxBmCduyKHtC>D+GDjl z3!Ik4Yj8J+aV1si&D5N>_-V6M$rLrIj^ct2Wu`3-1!ul(pQEUBT3%4-qd?2Tn!ArC zH1lvMtqghe(LzS1|Hy?81`Z1kzZ6)oD{1pBhOMvvigB>5dN_g0eeuf90tv-{W&in3 zZvV%dv7W(t|NH;`51*zMGD^uQsReQJnXMAha`P%Pw2F#LO3TVCDyyn%YU_&Q;%N}9 zXk99!vqW-*kciJwEdh-ZRRIN=9@Ck+o(@ZgXqv_urm`a|N+&wx zbxbnj;ArU%;pFaM5YtaOv!YP>c%PhM+^-LXDkmqY`KNtRDG>5@5ng++N3&S%>@2g- zQ>>;ev9K3*=r*{!H1144)xuZ#;aM0L+oe5w=Iji* zYsC3K?0Cyd@$+%E`hp5yLev}QuQ&a<%tK(&6s~6W?=J*iGaFova87)-%J#=puXS}> zfAKBc(2#m#_B8$Eb90s#$hYW)Orbr&@Lg zEA?=mNjFeCSHG)1Jmz_$4jZ4`J*xz{EieE5`)~bdp6tBZXF?6^N;48NSEMe!BYDZ- z!YStOE1MdG_#8g)u)0}nbTR(M(&it_VIjzC%ep1#OhIzQkCuQ>8WR&`7aqJa$K*`L z)i5p&jV-(^F|{}Tx2BZZ&T!K8pZT#zoL%6;lF6G^Jol~gGs|ofe-mrmspbAlm~ARc z1ZSh9@Qg%;gfBi$i<`1HadtJ7225_4D&muHpfh8hV?WD1Pu0NL^-NM3YCKAxCYJ__ z6lB+xUM9J|lipdnZ3v0u!l zlM5@P*PYUCJ}NWEe4E)_VNDlqO^cvUtRJPE6hztr1#ij3?RN=moMGQ2y5?!Pop#P~ z;d0x%LMPROYgcYMHbaU{=(89@_J$`Frj0C9)1tTDOfQ~fbUJ&r&DPoa=~6Q#d@Tev z)joUswQzl1=>L>V`@3(HKnw7%)5!b6W2&J6P;A8B^p&M21i zIvSFZJLOu7_JtcVA5|FLkIdbC@0V!SX4&8AvsZ_(hn@}5Vw}fwh12m_<+R|JdR%wj zU1r?+F^_>|E2FvPJgx=P^(QF)pS(ro==SRWdnQf}wmZu>;S}e}XX_@*Uw+=Ps7dML zk#`jbblnAB?~}eE8L{tg2=@g>hTos>@Bjaw*`R?*MuCw#;{fBOb;8dl%QCNizJtxk zpz-_c2TcA;_n7)HFmgDA8}GQ-!ZXPuUU{|xrz)E@$07j%p)GM-(H$I7s;66Zq7yk| z!w<6jIL5$rBVn@934@9U8$1OB?sH^kxH!%YX!GJ}IX&&gk;si7IyYM@iJBkY#`NM% zw8l@gl?CKc5{AUU_lMTuOi?_DK>efPca%^0 zFuEDM+89>{DXPqxo+*Vv zZS(%9Xcj(l_v!jHX+_CGwY57=DNWl{v#{i$MzZATKL-t`@4BPd zVz+xw?y#~wI9Gnic;2Tu>b9>l&sXy$%z3>e$@sFR-RhskxmQ%u9VYMeU$s?uK3A-U z^T(Cvo3Cw{&#Jr3_r!_Q-AP}1a(F!4tfSm4ou*_xb$RIQY~|SLcSV3-Hq&dhz|kqw zt}J2TP4`LlvYWE)3cvPQ%^hr2tkbMEE;C!&=@DQwiEGAz6&ivE0u;M~=l#ExxIEx* zkH0))=t8s50Eq(*VY{U!FZbJ;YRtP@Wfj*I)ugMdb9WtJHCb?NdmYo7l+;HN&u4LL zjuTzy&f~~v_JMIPQ(3@+Evt8gc;0Y+Fm-t*@0)sq3k_^j8a7UnZHalSb@lMR4@-q( z-=ughW;|||z#{fSCsW({`st)=0-a|y(>+(u4JT9`Y9VJGj4 z)#YEKBHbP?GCQy8&=>PmW79(My>GP`CU9*K;JUDW!vWsB$8D=`e45wGEGFT(smLTVzS#7kTq)(DSw}7x_l9*|yr=K~+t$8= z%`TGj$nS`C>vpV8(B+%F;0hb(kJP=I8D6mkclgT$qi@HUQ6E9w`{<5Iqx70bCtt!ooS)9iL9IifZYPMOjLA0XLS?{Ez z^aAlWK7RWR9xOySn_TXg@P&5LbY4sfviyTMct`64Fg zUC8d$UzY#ZWKcN4aCLRw*Hz8ZuiR30b!~n3)q|^HW&C@k>;J94Z9Z@KCS!fl&B)!~ zw%-nWQ=p%Cd#CmH-S_?9R@lG%f6zbY!d~WoIaT~NKhst})ttS6seS&YJDl$;CiDLL zSao;R6Ycynd*DXcDYr(@UB07Z1%k+3t9_bMcWG>*0=j6wX)$+ zYX0xu1^2$ri`^St`o21_Vctf+{J-pFcNrKb{QQ3Ey~_t?>pxf6Wp>VqxBF^%vF3o? z{x1yT`D|{{f8Sd_`c-wd?uC0_OnkHbUyGA_KU~e9`J&r=)4THhKOTDhJC}d|=##ni zzh3{p_B&mU{m8WLsWSg-=l@?R$`B=YcBjN^NrkV93&J%QJQ0*#-|2A4_Q5CDgmB*n zk2z;-PmN{!caJSCl-){>xi9K{r$R%d!;PH}xDO@#=Q;I&=TZXiIR*BD2HsZ>_&z1@ z3d#6xN#N&N$QyP*K!C+lOc1?ECLfK1+X=i0Qxs<-iJ~}0lq|D?bcWRE3-lD&bNjq#Fsm>F=6PTo`mave4 zRZy4fd?RnOXu_nFfwjvwp?*)`WfD{1stUm(bc;!tAtxsUyO3%9X_-Z=CHDlIt>+S6}egRf$|7!EQStc~0Q% z*f-917MuuoNS+hA#O{KtZQRMbPZ!(qP1T*G($#Ukgh$!)nb$IjCyru|lUP(mUA*rs zIX%mk+4Y!Yk&oj64M`8RNm5$=4^_LD?$`vLS4X&9>W-`?*Eew$M<~#Gh?24n? zzq?v~Pi+kxk{eXIPB?|#Yi927+3>~b?wy-P7nBqI8WTSy&-us|)ix(;U8=`cRmlk{ zwja87T0CZwxtY+!7ngU|ZizGF3mNkVof}G6E%&%?_%JhK+u|^<#coN{WqaC_>r^HO zbn;JpEWG4kz?)_XkA|od%@bc7Y7;nU&Xm5l!qGCw(?{)*&NMaUGIdWcas4%F#yQSR zJUT;X~luDwZPn(FknPU@N(Qg^T-z+L1BfAor`lyj+b6d8&- zdgJ+;H%PFgZ#&&J@3h~(=aIA0PRxA3JZptj2-haw!*wweCYefwyzA__#U@(t^jwXy zbj{ zJx|Nho`0Xy$h_s?TsPGQDfMWFhRQE4TNzwiE;MdnVinfWXm-0}VZhkGCrz(LdCRW! z1=q6dZ-h%*y!tQVkR=|tO1E_N?_Sq0E{zW@940@BPIp`0<~qIfiF)-cZGorZtMwSF z-#&`+a9#4%lO?5Z-=n5;lFaiY8cNrACq*%*^XP0%^j@Obu-@e$%K_%YZjAyRuXk)a z&zy6ZCBl7*!%FEluix)@y?-8i@1^tGE(uPb^dduG(f!;dYITe!!!B;0CUj<5{Hb|2 zPHkE<&1uS+x=H8i7c-iT9Yp8-M_dj>=K*q zWjVns?*y;?i({w=xn8wauW?F5&D$H3bQy9)wl_H3T$Srq+ECHe#J(o?&Z)IhTXSD| z>ZS$0JsY()(d_cz*f8|vQwSak7bUU#*GvlPd{RYx+!6H@nFW8ClNbbx7w!^G>yy zj|zBrH@E#^Gcc86-o*Ct;HD-C14kAP?&{EIA~6MTpS+j2u;C~dGhd;5&>8K&vzWK; zIJoECqFoDauM}eByWGrYzHIK7g5`%6A3c}MH08C#2W|eBN%l89rROUtm>52oy5a6z zgAZwX@)ich4^~ZFa(Y_CIW3nyqn3jLl1qZ!yk91CFts!WPw1E`ut`VbT(i&eT@2jX z6FiQsiIKfysGedFb!4Ms($V#99C;s_jZ_@%7qqh-Wz)7!4j157zRe{4-$Nz%fXZan ziyD0W2F|PRwmbDT8om)|vw6?K9w&Er%2TI2uKO&%>N<6fFqJj&{I6Zm6nd*$QsL9A zm0r20HXbT)O<2(sI;mr>+cSwdeqlelHn$dVwQNdLbTU_OlZ;3WS+jYs%3+!R62EiU zwf}clH5E_az;BuUxqObX=@iHQJa)&T0{J7K?;3tivn+n(wApt-e(JeMZ3oAlWycS= z7&r+uhd*%6KEXb*W{bE%v+)%-Nr^48E?eq7oy-rXCG&Jnn!>2P;SBto1MwU&k09>?-}v)%hz|`N27XY9ALhRkeHxXK`CDa@$kBH_*Jm z%6_SL@F(lzC0(|Kds|NIT9fasd@z^8b+P7ay+09_q4D*vFk zA1fB8ZvLw8usz)1poPl}^O{uN*{?pzIF}t+YE-Z) zciHjC!(TGHi?ZU)Ca!5)Ip@36tmZ(K#?1=Fx$8eLr+(@2N#(?D*C*tFlzdr8(RX>{GXq;-0lY6hzTt`31 z;rpSB*AFb&G3SVLck&#`H`nIf;Cy!`qtJg{u)S$=yk6^ny(f=$C>H)a)${X)V}+IH z55=aPNnMuJr;BH9J~FdDHn8=@+{ZsXuC&a3UO8Vr?njpQEN{WN?vv-#b1$5qvuO2) zvr1O3B@Y)nS1s}WWj&E$j`pvm{ccXazm^qO*@o`&ZE#rL{cFYKUko)?%NGBdl~J{F z^RLD8cTJbB@;0ejb=it-@w%m_OV*sWT6eu_{qD*~=XQm@{FTnKd%bjZAG7uP^phLj z|JrD6{q~-fn{oAK`|AH&y?;Mt+r1z;Y-9B9&Dpz!S*`C(dcR|G{@t?QI}f|un)G`Y z^Msv;e{E4`+P=7Yef@8tRO>z2Kli-0&Pv|BiCbu2^oITKtG8d@Ep*rV!0q)1_-nR` z@8OZPIi%dQNB_@K^F7?QHbyKJu&5`;)$9`8GUw+|e`yTlWo0I*^ zPc9ZXwcJL2jm_!xOHVrsoH@QH^YWi_|3kL;m!2y>c;@pS^;wMHYAkG}X`n_kb;+L@bJO?j| zpI8+Uk+toDIYVot!HbVsodzzqdbMk>&wuk@)+yO9|7_n|>EE9Y-8Al;k#SxnU^<`b z->vFQp+3(SFF03{v?=O}lm9VhmCMZiA$N3B^gl^;ev&&-;Eb#NoNF&b0=&?N~0_m^rig&am%V+&ZOE=zwJ86R%w+Hv}ylZ8{b|`lHdd zhmrY9tHrkbuqDoV6|VaV>;;wx^qqXj=ou)+e!^*D&5|WOomZ>`R&0sRyZ)QC{b+L0 z%^J7mSF_7*|7|<|w7BYS-SK?pu)6#9ss>j8x`0s3gpY^5~f`Yr=-2M~8Ra{(X7tEQd!|LKG^zI#)FW|^3+y@HRzH!BN)g}TdD)Ko3o!TLY&ecZm4xe)8r}539C}$8jMA17$PD1y=Pz zpSVo_9M5QEUZ){$#kTO`yJJ_E&Dzq%n{A~zYu#P51EM*W(~o#tm(J^B&^Wb5MM9yV z^Hq9d^WJ)P`M5t7pPIOjpUXJ<_}yK0rT)jvFQuw|XC3LPJ=wn5MrHrmi}md~f8rKD z-g86b=W~s+B@PLblf^R5O!#-~W$Uz62L$y*o|_b&>SB7=sJZ6ZiKb(XNt=SQ?K#$Z zFf30On6aR15fD6x^;F>ls~E}+%9~ncQ$O!tBsQX zuLqr1WqST$q6UYILjp&FSVQLoA1UtRT^ElfCNTPxbT2t1qIRM{C(x|Xn~PJ7VdDwa zr%#k6j%}Ki%Aq3S-ME_l*h=-;*TP=+xx34^ngn^Ot16%FWH_Y4*mEc5rLCuuqrvJf z3#VnCO7}|+h%k#CF`3n`up?cfGT^ZG3Z{#%nHlejNUHie?x+bCHqT5Va&hsTbA^54!F}GM5iBavs-3JlC$|{0iLIF!RC+yidu;jFO(jY@ zSp-Vycmv%H9Gg&(`_u%G_sn&1&<| z4!H+46;zrQvwzHE#?HLG?&^C>F3UcO7C*PCnZJ13=E+;*V>K)uMBA^M zqFj2t{Q2JRn+ol1D;~D1|Kqt^>uy*1;Gu-dY zzkgo!>*MPCYsxpW+y9MiT~f|m`}IEi{MygYm+!Cpbf;au?&r+|_Vxd#iqHScV&TB_ zZE5}g-}nAqD{x>jD=6U7Nnla6I2dhtp{ceZK}w>+k?)aKvj|HfhpR>#Kg)p@b(ci0 z&>c=<+b*=~wC&akmMyz@@#5aSd+X}z?CtFt7#J>JzO102ARr*HfB$|5 z2ZuLr-rT)=x1pio?Af#P=FQXB*N=~nudS{1_xFGQ{(W9v-u?Uc`}+Fk%$YNP{`|FT z*PcIrJ|Q8&z`)?kmoNSO{p;7S4+sb-C@8ph@7~0T6Zh=d^YZ1(`uh5f8#f+5ethoS zxovH2vuDq)s;XMPeEEb46aN1Fd*Z~2*4EZdn>MATrES=-AwNIg&(Ck?&YjiO)ejy# z=)2B_FcKh~iBO{|plO`=# zu%NQCvZtr#&!0d4!GK}V0L7myj0_Bc3_2hef#QUL{eMGXQ*%peTYE=mS9ecuU;l)O zlO|7@I&J!lnX_iknLBU(f`y9~FIl>5`HGdRRKIRx^4T8ox67L*}F)U z@!+AuM~)sle&Xb*(`U|}JEyhp(&Z~xuU)@!^VS3g|9kfzJbd){$TAy`$f5UQFfdktOc8ChA>2Use_4d>bf3^UPgoSyH?DyD0)B+lq zuBdZO2-GSq;0@KdDQ`iL@J}fzSnOD%ud%}Xb*73IwUS4g!b#{5;{R7u$OZ_v< zYrf9RWpgvZj**#Tk?4ZSb&uan4GEd}@M>%vtIUqem7iQS9%{VZX)anL+~+jkeS+hK z5GIzkZH%mUmriqFVh$1aW3GIw8p+7{W@`w`RNKOErg@@macwr=Zg{kc-D_FcKQHHn zKuV#bz`_4)yicCXu!&4*V_>xAQ-JO3i9i3P6?d9|N4QyI37PS20?3&1%Xs~RWzrck%!Yf-}hJ=*b zHY6=Bsbp@f4B}0=D=gr_nmR*8?LZXEnvYu+&svjqBF*Bmrvn2km(#ZMWvoxK4rFUR zz3IL10Gsxk4FNJ%qRfISvsae0`c%#_=jh2~WbzICu##25t$`uCT2q^mX{su>a@u86 z>$Kdp%T_;IeZOM57Td3ztNPb6&$ynQ^zo(Vn|*)yvUTD$n39Fhlq`#~ zvg5P-3d_Vd^t}puqx^sOJqsznpb4G{4U8foQ4Ne7HEs?)LRVDvrz@*}c(G2y=s_V9 zdziaX$WL9>zV&;)++NQn^+V>xen+vhw^xa&%Ss%JwA)b_BxiJhfmK2${3`?JjgE#Z zA?8&I%O;pzKd`N;*Yed3euIVsei7z7Ut8F`SNgJ#&%)sQd>84p+gEvg-z#@HtSdP_ zZiT8VBkRg2uIJ_~HGd3mX5N-K=$DYR;fc9GK!7@Hh|mt>eV2cnbYxffQrXBX>u`{f ziLK%QqX>6HL&IIE4f_tf4k-Dskwett!^XQZ6%Iul0U-;jnaau^9AK?&y1@9Z=Gorw zUvz)w*5>(mAILryciW<9ljq5vhX1D%>-uNzN!)Z#=jnqptVKCjo~>Fsxu99^>^#wo z2aHS#Asf;;lspb_=mj*gXfSZ`ePDQF^T3|9qM>qAa}%3bKqFVjf|62gIVQdp4Jxj*!bf$*D?a(TcYP~p&8bL##-nGa43Y73aH8CW@398Ne%eVWkWvqVY! z!a7w9IQ$DWuf11C8L*}uv`96XUmM@rj(+mlkvVu)xvBX4m56`O4vmfv*w>a+U;T831j`G1JXOc=R1ExOHQ@HJ*{qW}+b)8nt z(#8YdOiGowP4v7urDrnAvHAzzdJ#DPx9mvQe@$8Vd4-bD$1AI%)HA($<(E1;DqLG2mpvrL1%80*; z!Lw$GDw@fzwkoRXwokq4&!rK|k#l^Hpo2fNVbR=I5z`Ol#5F8ktsHqlYl9DSkHgAa zf8yPKtJrR}`X-ZVyE=t^(zWBWn%8dIF*~jGTEyupF`0>T*JNyVnsNTomAYTI)@1z^ z4ZFPSoAg52wK>}ZZ(grs-n=zpZC>-$$lF$C+cxvAGu=`&?UB^?9VbM+d8fT*xVcMV z=Y`&NCCj~IH#3Cqxbf9BxAwKP*n@%=jU5h3DKDa5#hUMaarS6g?(Mr?^GsUX74j>; zm)-kvYr5F$+T3d0pTR5&46LFGEj7=xxBR;I{lNMY>$AUipR-&PBEYOx@P7hN&jYU2 zP6wBze(=$6VEUiudT83x4Xy4mTs-yH%uO8{yTZ>r65IXbsJ0(Vd!o-{spA%cX6Foh zj&^g%{+@Bv#*XE+&;=#|`>-P_enuJ{(RbCXEp<+>bu7+YbxF)k@sOJt&!nkmp8C$X zu~}-Jit~JP4xRL$KCynAb@t`lG>Gm$%=sZn@k~wHzLh`Eaq8vH&7Upt{@#Tq{=WC~ z@^_`$NZ%67sarF9>bJ`b{omCler6Z^ZP?J^nx@K|aNtlv^$WknN*DWLO?+SG^s(D$ z6+BvyWVvj!f0+TROu{RUO%7j8{i=Um6S?$xfvatB(DdfI6@2b%PEYg-H|BEuTIsvY z;eYq*H2uiy)z3_=lxsGzY`CN+xZ@^+-7&%0 z{AMBr-y3-hwpqM&z5C|e&0Viq-xV(QNilD}ma*zsPP+7+(-+ol-g4eD;X}%; z-s4$wa?YB|EqLW5f9LXou-AulEgxu9HZumDyz|WJIdA^)leaJ2YVdn<^2obPDYFk; zOEXH0wpkUnb#9(=>Z;^~Qvb@DPSx4FLinbyn%a8!xxIbKh2vIVy!a%p1|6LGXM(fB z3iG>DeJ0MYI}jrCzyIj^S2GzW{+aby>0QU&4?DYf8WkSr9(?Uy^Q5@?;Nx?Zo@Zj$ zlpasK82_0eaBjD&$ogIP&rX@S>Nu-cX`#^T(xT}twJ)VN35A|eIbW?3)%kV0*rRPG z`LEAO%U|T=za%_8ctc&wzc$|g=T7WWE)==SZCn?>h;cy@W3PMHhnH%Cr@mhP+n=n) zq~7lkbRb3MZn-+suZ8kY%P-Z=etmqwk|}4-RoDIbXZ+|hkE7hgLOq_3HP?j`l^0o7 z2L`M^DD$nQ_I?86b7zI`TdL~=y4v)aR%MutOpwyr!Q|bNzR(}NlNHO z-uuO-@4iWWYhq*xulX0=+}e;hz3{)q{Eteei~OZNEA25-I^I@vUx4xKc7C=DTV^u` z>mQoUX8NbnG8qz^Lp(Snj)_Pc$WASjIeAgznw!i0iA4`KGCr7?7w^nq{Da@~g*mgC z*@tv3{~i3B*%-Gz<1Gkp6)S69vryyvM9GhzG`>1nR3^48pJ+PkGw-kK0@*jrBbEsl zTBwJs^ObkBbCk7qtdN&`B=Yf-sd12U-(w5!C+&P2JG>re_e%s%@o1gqq2+Z*#jnXO zX_0tPN7k3%hFZ1gWi$8$io2c}bgs;Z5BDfgTW&aEQ|CPct>2DHvCLX`5*ha}F>)+z z+inrHQ-iN|h3PJ#UKzohpBF?P9Ox}}QgV6lpGEBhCd6Z-ilNXh)DEBoQl zRKTP*fl*R`SNLWQ`vhi&4NOUv(^4X*C1*0E&779CbDH)AX1fhcb{Cj)ET^Y=c6k~n zbU8QOby8J-toG)bh{OhiMq%-Y6|FOmO#jzt`oz#ofZ@MfXtL@>L)pqk28j!;UP`iQ zN($CnTyAcZo#P^R>(Y$0Lo@V0v0O-O*I;03{lKU-fl)P}FZO08`vsPLfwQ+&&K3?} z*s*i=o}IHT3>f#{oPFrz>^~Nf%->{|D~f*WsGgcRX{NE=Y?B$Ux3~YO=$~4t%Xdj8 zj7gz>xwvhm-EMKquuoIGznIQVk~@;2dhQ4B?Vu@)2JW2>OzR{kZmdjaH()tDbN;WL z^Z%Tje^fKF{JBZx_fED0CEAOm7JAH>e#2sZ#)3N;s*aUP)`qediwu;Li|%G>Dx5Hz zEU3KKygt%t!OxEh?{_lv6fkKnm>Lr~-}Bp4n+x*|q!t_9nr+j-GWqL&M$H3Eoo6rKA?j1i}n-ZwH@x^WJ}MMlL0PK{Ml*&F_^ zdeoIJpTM*ldH1|UUB?8(VY^?#j$#Wne-OV#j8{| zEV4Si`O8!;+20$TZg0s7TBkFCNllv5V8OEVS4?5Ex1MX*8g-i|XBU@|_hvuqZJ!Dm z_-1pfd|0+<7Pm3OI+nn7QJh;+thYxbE?Ym7yUdzFo`F?&0kIZgvIc1|{aCYHk$+hTXS!vnTHG@!owbo4@V% zhP@v)Hhf~*^I`k)*}Fs(H=nBBbFG>;ZPtdX6BrwVnD%^NYINGUn_;(>!tU$U`*tL( z>#63w@LRohH}@TGjrZO{X|Ff-cJKS~n=AA6&Kn;XA8>0tir!iMTV0Yt_{!}49CNrV zqBh;$u&e&j{>9R)&dglGHXQ69n3(UVOXvtc$==8L=itnS%~x0RPP?tn%)l&ZaHuKZ z;JgEenl|j;by}TWVUJlZ}N0GTea-mzZgM_*B96vPfrcFaIfaVgFhU40jGBco@0D) zu8ZN~(*>TDfwCfJ`L@pBV{?+TDztc=u<`GoiyV$yLVN_Zb2+V_27KPbxqHf`gj*+E z7M-7r}=vLA>{{VSIB*MC`SWj<#=XLQb&) z0oq$t7G6;0)nLojm^xwGnnM?qY&k-7`ED8Wl}}vZKT&m7%YWS)$1Q`Kq}WuaPFyZN zMUgSG_?pL;!l>jM0UI@!r>HsTo-NcBc$*`{7;t5R!;x7HxB3&dy?k`(oy?7g6DGKc zOJ2LE@OWFDUx?I!Z`ba<)P9xA(79c97!S2}-NGo$XU>Ygaw@I@l|+{@~rMFH}zcEj!K2-~Ic#*v2!e zflLOzD$DO&Xqe0A)^+pF+y$n|mLJP2H%ZN?W>l-2?)B=e*C^7N*Fq z+`{PLXLh;BYv!eUv&|o`PGEZQdhh?|v%cF3mDLKVf0$o;_~C;GYAhR;YM#DkCZz7_ za&6Bih8Yt#6-;WKe$7QlS^e6KtGT_5g_qVZ;C;4w0^u?oM$_|Z_CWQ`14;=*4%p)&&ZT3!#XQxSM8&hzolOr z2fl3H@M_(?*ZbayDjL4@Dt=`%`_;>>oBLH6a?hODa!=hTVBb8M3-%kIy*PFLlrP7( zx8_IAbsy{dA9vzi#3{Rn#uEJzXsb{BBL-RfZ=?j~hCi4g6w|55I5@Y_{ukrcD zR>jm!n`8nPnAhLr7koEcPe=a2ONWK81)}*@6@GT}=X>F7|3SSp^-|Vtw}v&&d|w_v zeKg_Di;2(HG<_{x@%7MF#aH70do3GPznwDRzN{iR`G=~WMf~Fq&frYfl8Np=c$pS3 z>0Eeou<4u0#CPhazp-Xs?5i)En7IB|V^7&b`O?0svzv-PhW)H`EPIo-oLO_jgAG6G z-XF2Kr`7borA0pGOJh;i=3)h<)#n-+{2C?CcLGB(;cpI@^5z zE(qacdcdUmf$2&7zi0LTp2mN)Z+zJOK;n*v{q9skT*8^BFnB z1lauj1vptb#rOrg{Mm#AIRsmUI64JdMJ5Zjw9cQ;7`S-J(m;6~`DMrhwu}qF1GfA2 zA2@i(f6+GBfbIWtOBnXENcgkzw{kH1^KkMCu(q-Y`Ey+N7h&n=@n;shDt-GwKkFCP znJh0Q9{Y>E@ za=tn00gBvjPVY#RXJTuS+H+@`Zn7ftl@qoqh49pBUYpB)A?ZE8Kqef3ZI++m54af9sx!bBSNcVYhR~$Iu;Zn(^oM>@;|Ee6jcZ zb3B{%`o9XSIX6}MO2f_{MurC*4mMaj3khk6?fP+&%|-0O%{nIur>dhIqCxln=UC{z zUQqH})~IJI#D4;8>U+-jkPlcoMtyRoGcE?V+xx*F>CurrdaK%AJdb< zPg*X2)TP5@{HW95n1pP@f`|#1g?Y>#1gr9TOt{Rz{_e*Szk4E|q&+RN4$IXt@4edJ z_xiyMzDa@&E4WjP(j>bBw_b?wXm9nXP-f#;7VKy7K;Xbd_4~CeXZcD8I7lf<*KTrb zGynK(@kIHzC(lh3PBRa-k<~GjIyb4%@MeF^XgHnjH^buY04k z{Kf7MTJ3qezg)}qTEcthhs(a(7t{_e*>&?XXYOuZ&qlA;C!!cwpDCPNX2vx+v$y)z zvc(36_r1t^-}&m6kY?OYk<0={u{F#QiuXM>Tvp#W(PpLMCv-{)X_G7ERTxyhiyXEpkqq!O@e!KnG?m6b~ZNB1oP`T{-3(F=1 zI9=;gd;9ff_oTIEy8{=$m08XFEr!`z`;O${ut` zFE4)>dwFg}xZ0A2Gmmvm|WMSQcUZw`O=bLZ@KKiQ}A55L~=g16AJ^5vT5Iv-BK zg>tda*GB98emiMmTy^*I?MYWScAWmy$bIU?zTKCmuRnB%^Ps=m?~fVk_y2r3wqwE7 zuQ$@y?+sOW!G4-kbBe(McKv|+Uh7Xq?Em}g&G!DiUzQ5wZu#kD%fI*fhs*2hwU6CD zAM<{(fg^WR0h5NrhMM2XN3Tt~X#ZbPtA2?EBezh5{T5pW`Fu?oW~mDdF}(j-tZ1G8U zfyShmN8iMlWe(Xq^k7hNcyyvBW0K>SjSh^DzBMpf2+2qo&*c2esfpHwCx40#9*;<=6Mdg{j>MX9(vu=j7>=9iQQ{XK9;M8fg(j#l9Z)uhK zueeaH*5Z>^ZbX92Ho;56M}8hl5Slc7Z%q?Jj6jRctxwY!JC@r#_dH*9>+`%HXO`Q2 zKY6|??EtIf3w8U8GtY&ZIoCZ~bJQSmTffRl6@z7;SQfnb%qhL{uyqnB29>$c;*4_2|C zbZTjs{+635(?=lxju_4EnNpAkqEAAyMXDvUr z^}H51Zua@;#7lhBR;3H6TN#IfNmA_{d_aA)|>07w{p3!zo{uQUq z70kTcFSyICD@@UPD7Lm)r%8T!j63t2L;>cI&WVn1PE=|nXcq4{w&2{-_@Z=<0~#D3 zRww4plb1HS-=ue4gu7&2dhsD%eya(+N{%^6kFEFqv)Zt4F@tsL zoxYY8qZHGib3pL-v4qc-H|ho4ve_EM_dHd7dSt_&_ZNZ=CO)5X>45Q_1a{AuM{LPA zEH$siH~jqlxcsC=PQ&Zm_W#{y9?PAcc(S;Ap^&$Vn1+3T=D)yAQ`f(F^6a2QmE*Fw zX{+}<-J;ogsw=i=X65bFo3%eH60hY?I=ScBGntv9&U!0ny{>s~CjRQ|?r!6EW_v^& ztT&!t{bEMc_dRJYzb(E0&VH@uB`G1Z*;73K(@|5YD>9Dv{Vv8f8Zxg@$#lt`b=rHQ zfxl#In!CM~+h1iRSDm1V^&gTv=Q$+l-RM{)S}9dpS!Z~8U-qeaFQZ)dgncNA>Akiw zHFUv+zHM8U%f1cY{WDf}(p$X(ULL{suWy|CS^8oY_q2ay>V|h2G#Bl$y(eb4TjcoG zZF`=-o%-+Qv(VWxFUwe_EC`PbU!-w4B_VX>e@?&l=u_cSVj`q|Gz5xeNO#M0C>y6p zP3XJMaP2A&lTIdM(4w5j!qxc)Bfq>03Ym6K!~duJ)MVkE1`lQ_=XP8FxO*aE>a>|H zKm6Elde1jxeEUGrCwu2?2bzv^DnXfCLj+_|;vOVNT^44n=a zSlFjT?c;M(*gQ!=)-z$##f7_!mp@rnuXt}3MPeX67TX6Y~T0}2Gvsa4~tEeSFc=U z$d_k7ps8>~sWr~^5ns%P*JtPK$ZBG^*3SLfUQwW6&sAULxwcxZ7AnmT;=UYi*rQqU z^7pr9*&iF0p0`-nCARo_O>-!hprToTTXVwY=NH-w&Ki3hz33qLK+8S6WT~kDi$NB9 zqSw80-s2*53P_&3iF{L+cbq5QYBQG~rUYFthp(^QO5&a_XxMM^3jy9fY|68>u^jy<|}1gD`s?kzQVNevd!!WnPn@wuB5SS zis=5h#PXtI$s`U|@c>3Pm#za6JqjVMJBpcf#GGbN<{c7FOU=0#c}x(HoOtD6-}cXpFEai+ z=zehBrNPawIZ^KC#DvDQFUd?Q8=Q0v>=jJX_&i+|Zcftc6w%TQ({W+q?sQhV*{Ab! zlGV=1CpS#I;>={?;A-sPA(F`@dvdbJ%qh>N zw38lH;w#bMf}Y}gJT{} zTjV_VZ4raQhPhftMQ>EjYY}2Fd|`e zpDi-k)S({Hyx_p%!wpMROc(ofDgEK(S>?|EE}?1WL$~m&<_^0ojc#eEbV;#Ia5PY? z(qEAyvM?w5){+;Ii}y|VUwt5HY059h$X^!eUK+8pxLFDstUf#6W~)0~u=Gg7vW8hA zS+}_R)D^@8nseBF6{gqkHxOJ_!Jt#Zu+3uSl&F={s#b1|U}7qmzrvBBx|~n$s+h!e zkNzcvDjY5D$N9RmmNnj5#bdZ)&j(qyN#b`E`Sh=A$$j!Umco!9#UZ?Lk$F?vO~fsQT@#IfTJpFuk2di`en)ffE8X!Aq~^r>bSU` zR;}}zxo)nNA6uZ;&PI;a)3aAitm4=BFYWPY`Q=mVmu0SOeVqW4S#R}DR2MRXm z?3&J%z5Jzt(5;DrH_gL^c1zq$msj@YTeE7T#p-~6yOznl_T9M1K<-n(mxHTScPA{H zxk+Op-}^?vvWX?VEQ-R}YD=c_I?Zk|pS?MPn_H&3$#sSJGlM4P@395Rj3KwUpT3&y zvD(;4r088h+_h9KwHa}|?S)Pz+ft+bB4=-(yLI!@;%yseZd*HfW7X>E(a{!l+_M`_ zTQynl$dBC7QoLjN%pFTN@943f)_2<6DPhYT&7Jd|cTTOIIz8HA9(Tu_*OrTa@AOzX z_ep2av!C1NtXj0fddI?S>kR98t6$r#mEIj;y}PD(S9ZkzT~iOtcA?rN~k$a-IaLFsIR1KJ{-n1uvC9}SPgJ!|>v)a2Z?A~1?y<@Qhlja0Q z-49Ic0+9v<({EO9%3`(FE@5Iea428Qw7%Nry!F1q$bD;=nRPBOF>jcmJ!RI>M2B-f zy3er+>VIW2->`r8<^BJ-Co*nWDKY1u)SiPfcMi(^IVf?5NmF3f8qWQ{8Chi?^ePA} zjC^|FeTv9K@7n^KfQ!QmmkjKJ9VH-)lUDY>Z8itJFE}? z(b{`a*rA?tMwH|cMFA#0hJ|xP8En_Ms~9*23LM^h`iKe7fyuXBV}ANAo%#R3r`2rZig=OkL`>881nj#8R44RKzIgI`hm%^vq>ssaKTkeYzUR~$pJQ`R^JpzNU4KV(hmMuJ!70gv z(O8E93QTMZ zu1sRQa9`W!< y%+7@o(nKwl2*U!BYW*wq66OphCtuTlRsX%Cduu1);w|9HPzbF zr&lnfpFNaRd);uaQ>m|PLI>e071s(5c2TsrgnjdtP|PDY`M zT?|I7zd4^xGW@mhLa49C?!5xXWs}bd+(|RNcck~$zO_mxeQoc*)uto=&c0u-w0q3@DijoV<&ImD1N?6jWz`%7}Pv;4P_`TaN zWf$|^%d+f?6o}Ih>Pxhhvr&pQyIaQVRFo&RY1@e{YEL$Xdj)Y?J`CJDp)>2v`SYcZ zeZy>OwmnW2eG(<)CcRKdPtVjL`S#9)|Ic3eJ`C$ywEsX<=SMM*dFl_`1>BrCG~|?e zOr&qF_0#25cAob@Ixj@$62qb?J|@chw8dAmU(WVPR!|JQ-Sp18^BlMBCW9yDJnG6k zGuO$)%~Q1!;Y@2}ysz$d>LDk;QaD>e=5<}3xq8<1?;h`G(EZY|{Py!FztWz2s|NP1 zyZhbe!ubUI)$^8g888$sQapG1>COZ7Qo1BCAm7{&UWYOhS9s_3kgobG~%{onCm)ivP7ImgqAT3%#yevPA4-Yr?yG z6W`Zcy}UEg(N|7QA?bZ(;JZW1Kem1}^4@e`)qWk%J#M=lVs?fMfroUT=6!ZHic+}P zp!NTQ?I->3=lJCO*WJIzE%sDa``)AFNslTIYIZ6VK2UhoSs*t-fpf}(g5OFiy9Glg z8$1uRR_Q3MrimRG%Z;)vBGIvnf7*`Axcif^d3~(3$ODXDPV+-2UsWpl*7~w%_}f zrFy(^E>bu)#aLsqc$#9YY@vZPgORj@(6YoA!SB9rXMW@5^!Iv$@C^nIeqIh9e;y8I zW=?*8W>)_R6DP1u;N)$a!YnvJLcpI@x~*S8WCA}Y4~y6Yp`J%ozh-J=FR^|yThgpRtbhJ%tZf!rlkM-KTWAl#-NzCcrHF4wi$4>%xKA6ZO!X_xT z&|hq+KWE>kJGcB8-t?}lhD3}$r2lvpP%p0%q8n(a>}L4 zW3pE4FRufQivkvVO)U*c+%`E}S(3Zr^K@m8_=9t693}-dvj~}qy!s(1#F}_gAlD<| zppt8$>-oT(4F{R-R%SatdOV{yd*;}O2Z*J{sEi3N3mu#&xE1ntD2?^y0{o!O}z$6cGkRMzz#SU~4$4XV=|TW9L+-|E7dFBNHW%P`S3Nj~-T z-k`aRQ$jiT;#_=JaI!%BhRrSy(TmZV{V&)z|YtWP2{VU%y?O=Cc{RjG6alW;iv;>Av3R{%rPE zMOAsPQ(u`+vi;1QdfRwcv;OJykd)4$PK+Ee9kIHY+%9JLt zz)t?@YgDw(3s-nq#+$hX-O|vRu9zCIuxCxktDYr)zlE-B)5u)Cbk3f|0y7GJr7Tks zvTzq_VaeOjSp46!PU#?nz#Hf5k;lXm7?dMCw{fWmED-H&0FOYg9b zqN(GBw`weW1#4o}m#qreCggm<&+eS8bk~lE9cj`ng0` zsxU|U94tuZHCJX8F$s9Ap;+H@u!LE*Hn026-P^(YZUhB1u|#8C77?f3f)?0P>Qw20>& z-m`f{c_Y)Sr@CqTy22zXZ~o7Fex)lr&P+j%_4Z$}Z_LU3r*2#;-uv`%CvgXW2=A-?w1&@OR$JJIvvX9-Q_K& zTBZJRnN{1{I}+w^D=Y(!YybQ4?BlP$KcByk{qgI~_V@oDzRbMP$ia7`d*ALS&)3%n z9sfV&&p(EqfVc}KT@3S1)_gbaViZ4dz(c{HQ6MJ#hg8NqQ`L1$N*@lez7co4ZXA^Q#nEQu($1R7*vhSQfKlqf0^a&5 zhn2bloZM0ta8@@RQqgN|yMK70urtR|#i)z_n}gRVJgSITuPtQQZ5fl~GK<6QQ-`2Z ziq7J@IU25}QX9JBdXxiiy*MK4wlL0VigLh<7j7nVKPqOvS}smrw+blP?LPo4=@n=ErWXPF6W`f0^~M$_$t@A_Y4!sib!Ep5N3FRg&*s~yX2#CBvUJ|dnU6VA6t`CDm+qQu^TkD7|Lw^` z3EMp9zuc3~@UW7*^4{bH+YB<~KcCdAa{N3 z60kyAQp>SFXu=YSy-Kc*85fT&4N+24mG?+j49YndB4(uCkV%&5nJ)>iWJq;ng`T+6>pFu4`0@tZQA`8hz5r z>0sO9jahq_CVzFmaYX6UhNoNBB&lc5+f*bbG%qzPHUG!WkG)}=-$uRpC$Kv5Dwolg zIjy-VYa^p#7j2uq?yP*a?(AsuQ`a``|N0{H_T}huzVF*?j_Uj`$_~6^#3sJxeC>ozlxvr&~C1RIt`#$gb*K<{tlJ~zj zU0_k(kYAL&ddl}>SN6YN^Iq*|w;JPX^IGN;ZyG>}mIGlKJ&~U=^Ke1v4KTkdj{UEpS&11RXnJ0t(ot#>n^Hle_#K|+P zn`bl^F-fgSXG^}eB&dJYebeQZbMyN)I|mgseZ9c2w{5z;`RT< zO}y+;E2{H8FWi0jx$E(%EX*syxn*Pzx@Cu6)IYX(nfck5e%n``o5#0xh5Ox1ulxGU z@++=0gd}9?P5O0p!?ENg$-db^=1Z>ac=lyY@!8jLzpF0q{EAcD{(bX;+}E{>ecxt9|GstMobF{aJnc@4JUb@5c6phcmEnM;zeLS|Haj`}PyH{O_!80!0FAj^Dep&HRjITu#M) zsryX#%a?QSWBA|lc;kb)$1K;0_HE}W*u}!HzLiagfr&Na0P|PoUmGgl6?Y5AJhwhx zwf3^?E3S%$M_dw)Odj`&Qy$-8s4%I#X}h;9rC5PcIlzI#WkK;4<=t$3{I7oT{Zb~$f?wyJuABb)c1R{J*Sv0gQYh|6j52|M=3JUn>w}_k)Y$$H(UNnd>IY_lp)Z zaNK&*z~_+oRy4rjQ}vENUr+pxzx17Xy?(cNz2pwLpUdSgmNVW{Z(s>;3TP;knNY(fQU8Ct z+|ly7J>hi?%Po@BnGSp}e#q#{$%c}wyN~2~l{GQGr`=FSwfk9NGdh>BT)eD*O z7jn9fRVy?w2uBnNo0or0s%2GY%F1966>kY%QJlGhfm5O4^}}{if?d7qpkpo6%gg zysiC)bJmKspJLr|AM%%8uVCAd&!$i)6Hul&y?MWTL)CMJY3x<94&71#?c5wq1=AaQ zx7RJVC|kLrOFE@o;X!ACd3Rexp`t^#v3tQT4%TVkOA3}V$O#mwuaMjSg3;2WsOEZc z_m2Fy=Zv3DFfP8KcA=u?*0qYuE93;ld+fe?9uJ~>G|q&{8r8Jfx`NeR?PT~{k}ZxhTYclIop(=kKv#*7Tfww~tl zDHT2ME1HBgm|EN$dy>mlSIYH2pB&p+(fo31K@$_FLGi!mEnkBwTz7PQ`d0trSb633 ziYe2lymIW}SUxc#JYS(RpKro!HiP2FD@w&5FlJnz^mMu&oZX&m}>i_b7TAD zZ|$W;>V%NS|Y0^1th#$HewZMqb4k={w}^ z?r3|RIQw8{L3eO_Px3rQai%Ao?yOx?U4P8{x?^T%XIXWmefmwtV=os7a!g}6HTU(w z`F7LG8DBL;Wt4Ngnpb8~FS3$>t*hsV<)ZA)Df2sf`ZMR8?3_POqfTa)d8$X@!Rc*s z8)g`ssuSz#I4QB%ZAGbnc&mO_PxkVOZ#(-G8j9^ATk>|cub9!=GPBuHW$xY}CU${k zNmk2}PBBe6#*#LpCja^3*9+ToKUId#Y?eJx#A3=olmxf2stWHuh`WLT70KKs=2PoF!!Zfdn(GHp(0 z?P9CN%;F0LvKF7Yxgx8pOX@>jr&j+(i*n}7**~UDzf{5aLv7Z;o+OjP9C${#(tD1S9 z1vZuid67#szt0nmWUQOM;nmJ5-HFkoE*ODOLNci&RNn+R(xF5%Cx$|_T~!Z=*^p> zrahGUKT}G)CWE~=OLD-dlna;3Oa`X6~t+_hTksWd?R$TdB%0AtZnTxf|qQ&QVweNEVd&!Bj zZ>t@?y+ZGKZO`Xklk6(@h(aCnwy(-eOLtH9nc>LAwL1Uzjujlmx4OFXpEDGxcP@Ul zUGc%>fXqGfe%GaY{I5EGeUFd(u0^L?BGhMgcveZPbRLo3J7>od_aF1N-JZNYYe~xM z?6b==?Kf1nKp>;et;1bt&qCellcbOIi-a%L zzH{hA_Dr{xd*62VzsPR+%3Q1=UdRx|*jZj+Ww}yYr&4xD)sOH}ThC_U^1^S=CePo# zuEc$IoK2zDsUx8>$D~CLi+bi)nYTo(np`5zq$bXkd#A{0PrLA*18=vTFxqiY=*qz! znUizej!cR}0K5$wHaDZl9CS zpPgFPle{bbCUYe&u`Z#uKO z=gc{ow97To7i`X6=kdDPlOc93HSXKl2QufvpPhXabM9HqxyL={UhO&e=FYh%cg}t2 zIj0)H^fBiA^FQb8r!mQFI~#ZO{LYxO#Vl!wS}Fhj1hM8`I8$?B?XnBz(^4<3$>FKZ zJSuas&+VeA$p!tii!YX3l%9Km;jbLi+Y2|2UcBvcN%ieTd08(--wXHBE**Yysg?C| zq1xs9%@;M@F3)VaY}tEBb8V{j+>5$v3#`tj*}lE(k@o-cZ<#Azx@Vku(|q5Wc;qJf zuTA&fdpel+io5Qm)1_C>#$4TT=Bnr1t2(?Foz7l%l@(05s~!0Fe9GIatL9wG(M`#& zO(=-XOtrn3{#M(*_HthA#k9HC3)HSf?7dKa_DVzVwQAXGEqAZ?#ay4Ec0H;$rf;sp zWZ#?hwKw)nxe;{sMtj)J-z_)y=-jB`4d~u;a`T-N8}{TbtGzY%&&>s~YO`dozc_Mh z36J0w*;8)|^Vkb+&)ar&qwjS=*Q}4_HQkRhue)d6ZqL3w{mzxN+e@Z3{WLrHldW)% z*_>S;y|}dG`O#;%yzf z#hIE`XO^;OKmJ>_fc^g0N%t3Co3XL&?#Et!|i|1pbOV2M0e>1?%`zhocu6yI~cmHAsY_hDgiz)iKX-}j`ilr3_5 z%y(wvk{3(F=apSL`|w)NgMBi0dVe2Rh?w*%t$76}Q<;0!{vQ)Qw(V0&XIR|b_t9;( zT?)gFsJ^=y4AY<2b4cd@3Tywcvab6_?aUc-nyf1$Js_tJ4)uPn#{4`*@~GA)ln5wJDzGv=kMTrs@zaEX=m$wj*`A}&tG`F@atG8 z$-(r+>wnJu!eS1AduKDJ&EENVPTJ!Nk%vrvt8(05>HK?qXYb7=f7fS8Z0NdG^=lbp z%__%?<9(H9CJW{<=$ZF@QDfSBy#Bp->Bf~^6C!7b|9sdz{b&?7Yw3>#9IvyxKXAG1$^PcT0F zL!$TYB_}7yI-GEr(z-v|e$vY-TXlPl^)LUGF}C?lC{y3~RCgw$`PbjkYeFgtzRA|u zy{=N)&CK#I|5jbEUqrr#-X3OirpO&7pTt{(S1>-#*xN1tHfhE3(Dprk?rrfWs_uX9 zKIY!DwyGt~f7ZqA@0~o#|J;}wr}K{ee6+*A3%^WS-FCG;wI~p?o+UqT!mN&0%CE{R zx*zUQpOGc8adF)er|ZSXXC6H)UnDL5O62DQ0mIqHk3W^YQ9OD1XUSE+w^=Pd!C(CK zT3IXm%c`pPf#u(iW%d8#>)*A$rK$4g#+m3`C9BBY9KgxdA0Q>(%sr_!fU7TntutW8LWO1-j(Poy7AZG1bI1gUD|2$M z6;L$j-M@Y3?k;Xl(3^2LXYxoTd0CXEReFPc;fb~$7! zr1N=g@|EQ&nIMuKwl-vvfR2yF$BC{X2E5zeEPoh#w5;D}?qSWYIQ1E9=XA9y7}fo1 z`aQHbEH^FkbiCJA`KjQYP?Nx9A-SeQ9h3hvF((|f3Ub{P;8?=X>$mGdW6YA47i3N>ko2z1DF>?qh4%YIhW<y6^aiYo#XpQt*o ziu`Y~%CfSm=Bs4uRgMi?L!;c5b_Do^_6I&{^m?wbAc1|um#^ooITtK$$cTJ6^+H?Y zNwY)BavxY*z1UMf`8&R7J#;s$c&dkZd1R}>Lra+iwf{{_Q@?VYO|fI^>`itOi{zc) zCO7S>uBhE2M-G`D4p!~y8j~6rIN=ja&2JqIC+qXO^2bWRCGe*qxg3{H$0|@ zW+`;A@lDuyz%@l_!NHDbuB0x;sv?DRDzd3x1H-r`Y`WH=e86a#Qk@b*hIVP&Cy&KT zJYPvGa;j_y3{&>m)u5dJ?PluK#U-mUR?I64dO0P5lclM1Nu;?)^HLA@ORRh$?9wME5;g6jdNt-O09$C#9it{*lkqn3bC(CTl4@I3^GzV^f`zcZsX3fn6$N3q#9x zwUzJmJ=VQ`XW+6=JKx~#xoY3AAJ105-}mR+>-YN^*!R3&$RwWg|HDBJ^&b6oH!}|; zc5r0`HC7fDI-K6oY4IVa;D1Jep=+J)gT|iee9sy=7TqlCP}bE`IJD!lujlC#Gb?T% zOkm3}2%J2-!y$RsH?GM13-6A3Z`tE4|F-9lkNMjzms#v}zg`K^KQrTssKx=~{gI!~ z%-Sb&U{dM9_~$OKRpvJ`ZMbBoc6QqYxBYXM+%A$1-g=Pz&f4;Qf$#6;->YLkSMZ=k zd|m$Ci5Gh-QVR9&ZF@XHoA2kIN&fSCA4bk?uzWa8KCJS2pedhK^89|iEidz@_gURu zwf@~NgSGqr^}N_rE?oV#>u%rf=ex_-Rli^MpU-B`6`uUvAB&ae@A*{9eg4m*bN2rK ze}6vX;$LfgEk1tlH?Q>bwHNM5+yDK3Y65@ck7wM?b-%8yIlph>yZ3hgeowl1e)r$D zqy6JccH@kzWq<(uQTxf3e&TM{`ng%4j}`Js&?Iq{=jg!ALC7ut>g z#0zu=Zn$)0mDZnMod?QVk5qVgcK)`SeXzvhusqZGu5g)0$r~)J8e18x;t#dn`X)NR z;h~Cd^9qO7Q!Dh%{4O?IuTc;$Gr%f(D;+ktDXgs1VVEAd^XUqXhaMhU3(WVY2r_ZBht+ibm*n+%A!saC z=sxTEBo@Cila6~eE5n~$I?-%bDZ6Oqr-p|vK2E(Ceczgj6smJ&IIG<9*NA!{*t){o zI>}P&eai94DU+7_YiXU|vE_uuVyV!YoF!{wDpxI7+LO#IZ)G*>TFJuW-WuU9hs2jT zWcM`sc)R`FbaA4LvF**1|9Loesa_H-ZF2QYl=NySx{|!>h|2Q=9V(knI)9s(AeF$o zI^ww3wT;sjtjX|Q9d+?n`HXu%OJ(FM=^sm48PmG+dhXZOaPZ zwOQe(Z(ZB#wr$7RwRzFn(E{&Eg}hH*NHq#+yc_U(X@J2yCW)dB zz8-}oF+Z1{xKhTEImubz@uHUHT!)nS1vJu>emrdsQks=ecz9>>+8Nt$1|S!CdK$*eZzltp9f6R5&QprUF-Kz^pw7$(B#PyPu$B7 zPIqjZ6#kT}QQ_1yIn!kuow#-!UBFezSa~EVyj4KDng4lQ?xF7o4EjDc3cu-PIQ`?8 z#W};e%p3`Eh6l$T_%=;w_j#fu{qux}-=;~^&!njBeh_QXv+017^=0wbKTcUbGc?cX zd8$`kc_6Bfi(#M7Go#rv_c1hVnsWV)zLx%lWlO9#&nf?N|J&K0=VJLbn;+|WZudL# zK;}33Io)CDj?q8Qr(ZK}5Ip;WNqd%bP2QFz|7Bj3PhD_w#D1Ajmg`#<>&7l`PN?Rk5{7MnC-cbKg=AMgl?3c z3YUxTTO55iF!0B*%WvOJHDBV)rw_Kl2vPE&weBS z^!u|fTN_v(NjLJ|`TPFk(mnT6eHpl(#D1LU&cNcZzUuV$e_y31;JJ7 ztK07rQ8>WB!|>&a@xLd}>z#f{Pbi$E?C|eNU&Ds8f4_F8%iMXfz4FV|%JU0~P1`Ge zhA}K|uiWp(=--7=S3t1W%q}mIgx-+Ou&l5OMELG9i_PpU^X{`i9g?|F0 zOvHZ%l@3Nejsl?u#*eLxOco7i!g(KjPk--L{C-k<%eun&q*Yf+t}dSNp0}E<@#}XM>44@> zt_|lB8XDcpQp$@0I~w@|S|g4#h$OU$|HzK}!SX9T&)l7Hr+EBdvC;+ZZJ$L;b zvW`SFb-4d$_~qVqe_A$gLZ@s+XY{wqoQOt=869mW+IMZMZa>jzUS9e#qWG*uuXIC& z*o3-C5k(U@3fLHON|s5?>_~s29?$TDMej$0AV)rbMbQ_F+}$fwYM9&aL=>;9h-XP) zn6sjT#jWpmYxd8KZfo~=nVIq2D<$@7=;yoF{nv=+uS`GoBVToS;}`XKeuL`o=^ZCe z6zf+O3OF=Y{a|6+P;@;b&rl^s~P#yqwYeXGO01PnOIRlM^#rSthgwS9Cco>iRi#67Peo z@}DKn*GrzdS8AvK&*OhkyiP5LpP{6tve-#IzUn7SrDmDt$r+uUGj?yQc4?1Stdvmx zsi(TKl)-(*w--f?oJFUmmuf%Hw=XZ`nJ~SxGG05gG|i*3RfAE)fT4YQ51YYkr5PQY zJZE!mV4Ts;_`GElp zw{>>U$m7ps=#zPn?UXRDu9?2b z&vIdwW{#M_WR8ZpJKE#dO2%J`SQv1;X=i)h53%B&$^}2%I`p=;vP@_cap=gdsC?C4 znvl+@{k>60V6s~$Z$U-&$7xF~BB$Qpmd!7)Ov;@>tYN8C_*6yry!$Kj1zr~I@F?rv z(YiK_!O)T++9U74j<%Q?@s~My|5l`1uc&SiuV)ru^j(?no4Jh3a{7*s!nXpZ^F`H3 za8&YnG)ja|mH9DQyJMk@$Hc6N`na8SZ@)9}8m!{U=ruV$`ODYp>EfN6swz(&uUDy9 z^?mAs)`>IUIV}!T&sk?R%~rEo<#=7s%>N7%*qg3!HPn1B{;uA%q-)8FvSiPnS-q$1 zi@#0GFkg4>!-{gY+LIm(d$M|^9p>-czV!Xc#@&&#izHP(1*-9ItvdW;!5WK>8ji-M zj>czcg_5uOR9Ey>tY|Xn$o`eq-9NKbShC{N(xzwI+IN_>eM?=lPYLk3Mjo1dp*cBZQrQ$uSCSKIcd{M^U?sW7|G@miMygzt(5tA05Q$%lO9hF+V?sHkmsu}aFx2xPA`ViZS;HttRuc9dSIn&#hHk|t3^_6YK zMz>{3+gnq$4#|1OXGbh6*>xzN>u|!VhMioCzwfp>cb!4(K+_J7p5w>53@y7Exyz1J zWP82Jm$T^>-fm$KkQEYh)QOErp_?Z-=V;8GqqEwM{_#BMmT~aA(BAo4$9mk3IZrz3 zWqfe5+a7+IgRh#8#j71Z`rueePkL4iuY}ItN}tRPuMeN)KF*VK{J@6I^=~qAc(!!* zlvT^{-n^)ie&-&HkS`%W&qxozzQjc#h_%9DkF3a?Os@JtwZ_Op6gechN?FdfTZNbIy4zJLNd( ztgF+hS7(kcZ?kydb9&Jlo+mtM-*pZq$;@CXn=V>Y_H#}0^*cQ8bX0D~^aRPA=iyCB zc*7fg=Yr7LO#a?Z?()rk5);2po&5bP!>^yIthwpTbCVTyd4Ip@Zr*dC{?A$Ez4532 zaC6qC_D2><*(PxMTwuC;$tdj7iGmA`LYK8xUaCBE$?EO_vD}0h4NZXr#)hJz_iP$# zt~WjW!O+>xuv1*@8~aspbxlEsnnP^03s22^Dt^RwZyj61MT=vX=Y?M}Tz2i)gUfbI zSBkHlZS}sAle@<~Hi1>(KcoEhy<%BcRi5u$8ooMPyWZ$T#oylz{$6W^cGUNmchszn zpXgny$x&hMd&#o)I_tA*j3t*;W?uTjbE<6Z&D<9^k4)I%KKsUk=SQYVwC<~pk6u+X zJGyux2ct$r-J}=OC4Vl6>zI)-_u5R~TMge%EmOW;`nPST&GU8B zPxlI5nEd@H!<6X^aT%SLd>JQZbXU)vws6AZJ76`d2FdoS+Hxoc^+-Z7njwKwzg z9h*gO?`_k$v-Iy7=Cr~Ky``?RZs^^p`u;RO@J6B4ulu{Ins$ZvFVnusuzJJO+5*o{ zjO-JbBquO31~C0t+kM2=>R4^siQJY`zPHZY{m*@F?XByl8E(jSw(xeedcX2m`V zoUlWzph)3GtB-E=&$I;!Iq`uR4Aa8vUT%Bpwz_Rn5W~8%r#+Ipys8$+oV^(FyjA4G z#cMV^l}CBi7cfcoJ*;50_OiQU%X4~x@BJw{Ps@Fu`o+a-s<)?XKfJc5Kt6y;_X3kz z0I$k{=i>92JR{C~$vrvJy#ECE(}MOFIcs0kU3<~T_i{l@u8INkEM``tf`=*%JSquH z67v}6?7P;uE`EU?Pr+T~ZojnVG$zJ^Hz(%3IkoT2nR{=}{rmssg528^eNXNsyt!2O z_Qt%oxAwig;P%Z0{6KKACI$Cf+Q= zV(R+?3Gd5gGvp62H7wRwdBEg)?&ZBa>rZy?o8#`Zu6xh7zJ*i%U0?x&@dw7gpP2qW zekuL$^+AC*QxCq6ZF|o@|Gh$gd=6i-x_^Rs^kr+?cYi-I8Z2OXF8uKuxB0iZCwc8Z zS-meiqjvAl)6eUF>~NUJsJp?DiT`z{^JiJ__tSzug{ytCmiO!Q&RI2WR$N{V+p5Bo zFN#DX7psIXG+CadziwH?yCdQ9hYv?I@iZ{*5}TLWc{y+alepZ6W&;Mv3D5f{{%5+g z?|aSt?{)HTbq{=*%*zLWkqx` zEOxJ7XXVN^t^r7zeH0R$p_W!-3 z&!aB4&u06#A8vQED|ZlfUw z2S1y?KQD)%bW2wkD>E}|S3e6&w?7L9i?rC3-WFZ~5l)_|OPc+c`OjUkWX;;O41usy zZ2u!pML4{jo&5;(7~As~E`pD--NLZ$*4*VS{r>m;n_5@}_!q6|&Ue|hQ-JG6`Z?d zJdMK4nwIRC`RkZMBP%znki!9nlR~W}-*plu2_%Lz)^Hd^bU7?&xX3nFN8stqO+pTC z-}x5K*>xh}=^e^|$rtqrfPZ%7U|_5B@rU64(z!b8AmapQU^J%@`tAI(J`OUPENJG*D+=jTd+r|0?Y z-BlVCwlMqt(W{N^Ts)Qv0)2v(*I8%FYD~|lOR8Rf`|;`d{`J$py#Dd|wfc;`|7tqK zdp-oPDilm$sN`u}z$hYGvcZAcxe7&pP^9gL+ z3LEYf$f{guWRmlE(#XtZF~NaVe1=35`?1`cPp9+g8aPeoa5&h=&RWK>kSQ!LZ4RT{ z|35Pt=JGCF-oQA!SMtydzMf77jt4t6otTsrZai5$!OiQ^M6ayJ(^w1lersUe*7GE9cCmYiBgw$bNXhtkZT;nfL8NxeSTa zo`-_BFR+SpoSsm1KumfK-zioOgS>vb6PBT zcT^(1=k#`F(}u=uo`6X=;^fn{{NmpV9AIFRFiGfSoZ|4n$U;MS(Wm3a#$gW3rs77P z%ldc>u4gs;e`)N0-h8*tm*uy5Rux7DWISk`BB=K&(V2bO%0^};BNHYL5u=cU`7z#K z-gI(r_SmqR_wLM$zD(zbj)&P)q&8j&+L!y4)&Kk3@7rW{JDvCDRGGwY!C@lM$RZ|U zcf*f!M~(xdn1_HRqrqZs#wU}4^D4EOWrD8w^6t3u!!iv#4O}Yg>gFmS|KaMBQ|rI#upbqf!|IBU2H>f`3Pr zHj8?*1b54I1cV+rdt*hFtB=D6nFR||WLGO1@+_8^S!^HXb54WR;3!*6(>f0ohTc`L z+sqXZgq&_uD zPDtqCIM~CqZ-*jlMhEj8ld0;;MyI%2jFcCYaIjaoc!lM$Oy1D*H1bqL*8T(`5szlBNvM&}_$qYF*l z4l2xA6I4y@oX-`_5>|TTv)pR&Vkwt1kJWykKJLxIc%XC(v%&I$ZWfI|_iCX>vPC(` zsuOM=J3KeL|6k1^`Kt%}j(nIb`1gXcB11tlV@-pSiN`^!++x4;H4hfa{ypR7?sX~a z!X}~SY?)Yrg8peDlL`ta&V5?f*>Gy1vzF&gPk*Le-bq?YGhG~&&%1o%O%-EknL8nq zX+`Jhr6&%HGFTkoHdJcnnG#}sY{#mw?Yrhq4og~5*x0Qkb)jME&STQGGiNeZY@2bS zqgg*!^vn(|#cRg})KXIBM#i?9F>Kl=y0-UB_kSgk=Ce6<4Xo@3I5^V;8rBqTHR-Ee zlcFvywf<4M=myQG>;qq=RS<>$RYXd4&Rlq(d%)R5j13KGjX@de`Q7C*6Gg zq;K<%)>k@9UY%__!N4ZDX79uH^da`GHFpuxeT`n(WEGb9I{d-aR|?>%O19 z-@EbqeulDHPA|CQes9~hf9nPPCh;@zUzvU!+$i|L!>@or_=-6zyMW$GzYVwes(&0- z;M>^Y?(;}!O2ZKizl~ktHc4!|D?Ahg8hX-w9!uT+am?b}#=i3ZXCBM_{&C!%?O=vR z&O@f;h{H}+4Gaorp1kt-aWo*!ucy)HsaEvQQxWGjF|^!~QHr-X{3)<#@^P7m8nbt< zPVxIZ>BZxxOq<2pwg_&X^}J`2`uv~grWG2@{r-o=I=_A2SKYNW+REv6(p6>^ep@oX z)VwhHUFmVmofmX{}HZO)p=E#zH2>)e8STUI$ZNXKpCcDqA?kkIo zdi(1Cp(~#%f_gVICZTI9u_hn1hmMeZ}IJbCNuXoFvJ}(ZI zH=q02O%?U@UlgbEwK55CxL^DqapL;P$1yw+cT_vxe!L`@C(oHM=dsnqpyL}4J=Nsj zZ4`E{=uXq#B{$dUZ)cb7o|P>2^4^4Y_S1hG7~XB1xj?~%`L&(<>@RcQm&-di+wWj3 z>|Ud4{P~AZ&N0r!)bQ%ET_+ zp32qj|34$)-i&u04wnoYemAa}En>aZc%EAAX4l&82Y$_tjQ@@>bQTAgT=e05;mEh5 zw${AyfkB1f2ZrZH{`roKo#oMY3M{5E+u)J$aY@8m|Y0>_C8eEBU5e;(8tGCDmEXkRSAXsPVvx+23g-PWLgL)SEv~ zFg8i!KQ+Bqj*XqEe3U-PYJU1;&y75Nu-^zBpV-C3+>usPE6VSD~Xj`EcLD-u>~CziZ! zcRDpA_|o}ayZ1lc(ZlpJ zllAAsZ49wCfg<%Rj2!~}bDS9EX4Fe7nDBlPR+?^cWQILULF>B-_5u$q#7=UYZqJgr zIZ+_3PeC*HRcM8ivXM*(gZPq0uV)YbtKG+MdE`-{^2+M#1Fk9e+f{HWe@^ zFfc%lu}!O-mH|G-Hs|KFyr0vOUotscP7h>=otVyHJ5$9Y(fHW6{@+ih<{s~H$jmLV zoKoDuz}CP}doptGF@{~wrvG4_aZ6=J^UA)~pA)}_&wP1l>P=%+Eti?IW=15qJLQi_&IvG^bJkPze5dD$o3rC3rxom+d*|lddq3x9Yfitw*?Y-y z?uBDB4>rwh%$#@Gbl#Jb^VVOBzy5O8Y0mkcL37`ACOplYpWhMp`J}-7lk?BboWE(u ze5NSQADV8w3mLBqFJSMI=k!|eBXt44Rm}@Ym3@&5XKOCh_E;z?wa`#yCgaM5*^G;1 ztm5Q;El~5aS2{IEC2EfPt%dqpvl(74GWMEl7*(&wFwf@JV!L09^EKyHm@P8*lC-Q^ z;?X7Q618OGj3s`*mT(m^m@P;RiCP*KwKRrpY1FQzmmL&ij(u2~AO%`un-aAwtqOFE WZPu=3iKmw4{aRMgCECcqU=0BNIIPbA literal 0 HcmV?d00001 diff --git a/xdocs/images/jvm.gif b/xdocs/images/jvm.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ff1eb3de0d8212f40759f1c282d08125875e605 GIT binary patch literal 6810 zcmZ?wbhEHb+|GEM;i>||+O=yP92~5ytm^CQ-@ku<{`~p-_wN@M7aJHD1Ox>1_xBeR z6wIGLKOrGOKtN!^gbC}{uUAk|*u8tVwzl?-8#nm)_+({e8yg!>o;>N{;W2OCywudx zu&}WG`}aS4_Kbmn;s5{t473D_KUo+V7!(+EK$d{~#K897VM2k2j#U4NB}FH5tma=> zQR1~WYWxb~f}+m^f+jlvFNm7jAAIJ`Pq!F3vm!7G6f?B1VB3&H}mleayK63R#TYMVmOc zEL~o-Zo$+;hmRaR7T)J9%h=t)$->3kv4#1PJa4JOIu-$r?uA?V6q*&T@^C7!wXJ%} z`-+8yljr!Cuiw5;I_Y%!Y~N{C4l9m73{46XV}H+*jBqt@Vs_(EGO%C?NNDG0li@kh zwtn&PeueEi0S-@s>|IY=xkwx+ayY2;OU%$=!2_k00esI&BN`YOTmDbgy?nChfZ>vh zi#;Z;n&N!wf~UY~4vPuN408`EDqnVucyfZ_Aj5tp0|m}Q&##o^Eje2_bIaP>+rOl3 z`l6X~P@(>e#GFOdp&h#zIi9IbntkBlxxE5cGCwU7H_&C_WwU7Y-nl8&foZP9ivwRc z8u{8gL@JUSlrj|OOD=u9rswO^>l>0!&-2~A?d|Oy#jo$3-M#(&{R7S1@_u`Ee0+Rj zvUdErJDZO_zp&VQzTe(mrLX4B&c2`5!Vs+_n-wSTzpti}HDTxTp9l8s{r&yJvBrM}$^P7k5=j;Cd zUH)IOg880ufF_3;2V1+`*6$1J{(OCSpIv*~x4<-&SsrX%vIk!zb{>AP<9N5>sTYB1 zOJp(@OW57pEI+{}Y?6wckCJ1Gd+@c2C*uB_JWlm}Ny&7Z64aJ)eu}GEWvXbLT(i=Q zqf0E=X1h<&OzH@mx3YD1?lz9)1{F;kmkSp4X{OCBi@TWKubaoYcxJ!Mt)ufBx+47- zq>6R5F7{Jfl`&y*!YbA!6VGX6E}gb$2TJDHn;hG5{eO4|T4(UyNv&vJa`}mfC2<->!y&a@=g>L+N zxNKWm%WamO0hZbSd)ByA{LU48_N`HU7uTj!tb5;Vvrfoz@lj#jAN=I^nu+h#1oh=> zFG(Le=%Jxwkaf@Iw&Rgf(b9KELR!M_nXxu!uTNX2YAAIgKxUP}H2LI0qnXSl1`U3~ zTWxyJIBhv`fMH={!RGyq8XrChnDIMw2XLKP{F#BPW!kOES9R99EId+kTQvO)E{F?% zJKD~-HGa+U zDxARJE#`bxAzIIySI(E~M4@q{TTQ`d#S0I5j_n5DH_u>#voezztw{$bVc=%L-A)?`T%>m&%)sB8g z*cVw$n5dSX%h&l#K);Li^rbs7VNW~GJT6;gvio7|xfPA64BAVz860i8dW?3N2w3pD z-e3ACBUqQ^hUkH-3zEGVlrAWI(@ZXr*Eqs3QJtlkA;X?mD`u@lJKLMeyyykDZ`!rA z8S`l+73g$E2K0ql9FS#d(Px%UEYxj!OS8Gj*B0h532usQ#yu?k*(uos>khw$2|uc zHk$ag^6;F0lIOHpjj1V7JSA+`Dv3$jV*k0Sj~rOMa^8x)x;F$>>TM>={d75Kd_=o% zUy&1|pL3T3o0FgN=O*QTlM_C%>nGf8QW9UXqk(V3Sq|0@l35098rvijy6!5e-hC4) zYNeGp$;@jK)pkzeSQ>atH?Zuaw!)`S=1G$EZ02s4&z{w{cRrGqVz#4_XB~60 zrP|GyMwW%4jMLOU398F1>it`jkg=$ffkE2MLGg==^6P^tk|jGPoy*+BeP=RH$h&Q( zmt;3HUpgS|EB1h|<{Fc%@a(6yyVKX3ee!Lq^Pb|eXVV0Z6)bZ;G&wWnHMX!UaOe0u z!PQFsA;UKgeXh6~b(`ju9BCoVs$Y2o>YdsmzGpFX zkds`(Fww9_P$A)B!-0d00=m-fU7`KHm#ojRHB$)1@}kItmbJC<=)Wp+xdkkh7}JZqf{GNMGgkGkX<&*xD( z74To2VS!P{Z0Eh%Niq%&VWJP1CupA$;MncmZ~JH)r%!hE2Q9X(iyWuycpVXAs(K-C zT1I9OgKx2XrBt`a1mz}S--PK_Z0t2(IREctTfE5Q);|Zcgr{5oPfo~ZyR2D|g%!ClI=vk>Ajt_ha;2)eGgZAEzGrCC0$WWG%6Obp%6(|Camx zU&;^iuJe;T`}iokxB4OBe=<3IJuOTR7Rmj6y>_A293?UPgGV0sx^z9B@*u4@u~v5C zhu)YyigLz`$A4TfG)Q$$Ql29r|M&LB9G2=Q)hd-I^xyF?S_C~d7TL+cw#R*1rKGf4 zeah)@7J(P*iY97Je|YMY$0}Q?nDwf^e@x9<$39zlrH5wlPKk_T3wkGhNz?VcdZund z@H|b!7mkw;UihmUHvjMuUCX#-7aHC%FA`s?=GC6%p=h*4Md5A+*KSLmS$cWP{wvFB z2N_FU&V9FO>B2qf?$K?ReIC43QTzMSKHBkGwZN8@f;z9%UKCu9TCjDMW9-xT&yLq! z*vwWpF3tJ0Ov-F(%hPlf+gB;yqf*Xma)nKtX51ZcRLP}*!TXBNyWW)R2hP^rTlINI zUbuPU#A~{Tww<4?cP*#Q=V{;Pm3Mt5Ba{_az3~)b5i>a;%Ot*CAw#SB)dR(AcB>z< zq&IC?csI}1nel<0)Q@c5dvcRBY<8qJPCPuj;myxkRSc#}79E|sAaIvqgJ!M+?;*oo zQ}14Ts8q_)kagJ6@zexx?v<D#zMuP3%&Czty_Wt3+6g>yrD1!E4s@t?OieuL zUh`?neVK)x$4f1RT(_3-Eo?jg`@!YhsG0@*58vg-lw9nuZ++5S^V21xu3wZ7WJe-yt zHlhCahWgLf>u)kP91Ji0f4YpdFo0!IsFi0zfP65+eL*=d2FaJ(ilkSlKN4Xm50xlj zHc1K-l6P=0y~3%-sPf;L@5Q&A^@6!+ZI$XXns^>r>F$WuUs2qeXww(o=y`#$O;Aua zA?d?+wkk%!Ey*DU8yP+Ya8EqwBGVzo%~0?Bn9pT`QKvzZJA2vNO~xM%2+e)i$nmIA zS0(R3NFIl2q2-OL8!8nn4Q=-txk?VVyFO^kXJ~i#NdLj^tM`#-$p%y7tDbHLOEgO-#Txo>y=5wAFyaRUe@I;AX#vswZy=J z@j(xdfTUZ8H{VjB%_+{2irnX37-=7rykKE6i>Yn;<8H?ghcE8A78R0=xbS# zDx=u;LPO(ihUEJjSt=b#ZyvjP83fM$(V6Vf{;r~DZdluTvk9CpS&y#J=IG4&yko+5 zcZDMoU2m2){8=$!YGB5%GM?gX1`?W_7r#wBCNSymjr{o%^eABO6!CU`z%4rWagJ=DR zcDQ?RvW0r`8;ea5`%(LjmHoc?)Rcxqxw2{hA2TL-U7ehmFfHTfw95;pnWW_&=9pf_ zDf{c_G}g-LH8b@WvT@d1${2JSD9;pW?36U~lxgnNXN*dL*L1{ zyd`rCXU_TbjPv8lx%(XFE4`ebzj*e+mGkfZoU?sq=8wu*OuOd&|KmA>?G_h*maCxE zeBo0wM1T1&m^o9{c>zbpe92ktpLR+sok~^ln*M0#!YMBoP0K9enze|JbMX(2#lJik z$1YfG9=WKZV9~CFi=!2mOnA9CgJH=|$0d;qmee;aIc%}mENYhQuMD>?X`fw5!Cn(B zrIzlWxl}fC>Gr~AkrqhHA0&u@HOA0uUk(inCLE6%+3-ycB<03 zdfP_fsP+{?|3zl+-o@W(5Vrh)*!!-Hdq3Fk(coBUx{WbfrZGA?$6?3G32SmTi)Jm@ z@%Pq_p5N;xO7HB}=C)E7Fsx?holsPkv_{R5D?efF-dUm-H<$_+Ee3 z*?|(#Vjs%8qbIMP<+Xc_!Rj5>Cc9Q|aJsNN|HJN_$2$)HmffoD^k4(WcQ2RCR)(8) z${t(ASD3u#+A8s;$0FNPO*Xz3ztp^e_t_4~K&cl;#8?vdSgDjgVc=Ufecjmr;{}Nv zA032VueN)qZP})7^WA&@|AXA-mnIA9JrsK1;JlmbzKsY+IlR-DMS~uD zzWH#dPVg|V!QrysT=AP3ta`YY8E_pCSj$wS_jt2q4QA8*;{+g-nn!3-k-A%dd^&zIrA{)+_Rc< zFXo&(XLD}Bw6m}Nockbi{?nf`Z`Sa0lH^A)?Rr(=jsWYtLzPoM|iG!?mhcI=I+(xv*+1* z&odm5V;4Bj^nsCS!4f2F6n{H{=U$%*s8}^_Owk-dp{9&rYg6v*zus4BvA;y*H1nVRZS+knomKh~d;x zo>Rx)G9H=iWnJh8wnbuEw6ZyY}uQ z+cW25?-lo+eXVonP3^rCYwsL6bLScF-IG1H#00J_wY~Rr?j4B>cli|bNlF@Ykz#ttmwTp;qHTDxo6Jby?#XJ#>>A9w`1=!`rW(9`$)>~%DcU1 zrk%ZcNS9IUgPhmi>+%J6q#7Qa`1|PH!5f0>ZtC$p=I6V<;;fu#!5xW)$MOb@V*egb z(7kCp@A2W7CvO{{*yKGakbU(2&dsn7H_yo2dg%L9Uf}T?$H!*(p1fW7_=wKqr*Ch_ z2i%+V_nLIV!>zs78*Oj7~gDUWN&yZa^ZP=-|fG#FQ?CY`6ltHm))6Z{}^Yids+OC zQLKPr`McX)XBnjf7~dG)*sXi>|9ZVw)%#v;@_RkSmvPIzSDWqbO7PxapnGTMx|eg- zU9JE7@}%9X<36|K3mBK3dsUhDdS&cu{slJzYhTa$`(}6FbFaDwwR^A0G`wE8?p4=b z#=~}u_UB%$t9!Y0->bF%UNy?SVK;aqu6J&d-StDd3``Dh4RRk(tGlhw_nOiEOnL2v z+<70E|1%z1bK~~kM}@kKZxla>t-pCM?=|2450d>Kx4vUEs=HG@_tDFqr`J=i|G)Q< zCI9x}nh*TvJ_+=n@qEYl$?knuE#qz8+t=@XZq)rO=>Nv+-HmmzH*T-{=Iw zYi}I){b<4eR*vDT^7;>N5JzCkVHuD+`)-!lHcH183^gRd6nK3tCd7H|LD z+wZ24+#}QdA5Z6gru&}R z{l7MU-hs^V?!A8z zb1jDN^1iw!X6IfCZMgn!-G`0xPcrOpFiiMuruW_E{*RJ%H}}dv<&gWcRPOmZ#alzm4;McKE)Q3t(KOd-L)7 z-zW6%=KlXXssF~Q`*LUU&#tLI_eTHD7Csi?2KEm>d2DB%cdYzqqb;v^v7^S0^}jr0 zh?S0aV*On5R*F7!I!8|m?Ay9U z+b*r%ckl7p3-b*4_;e z55GU0DpK|KOyHK#qSG@qW@z2DW(s6BSC+rodgWx%lezVb+-gZ*dJ+O1pBl-$_#t>t z&q{V}$(;WMOEcS+FLtO}QMGlNq1ke~f*ThK&#;vl zXQC+viT9gb*cDS>2d)-e-MskR(ySS;4`~;PruTkb(#PhIX20<6cClAa*2M41dl=K| zG-p@kiJs0-pHkHmC2#8vNMD(my!X;I3ByBQ6UzpT{GmcF2X z|3*O%uSh&S*luy%Ru(dOT@54LYM&+7|_3OJEldHvaJ ztJ$w-hk2c4<|+|3u)KfgbKb5GMMfJOi>@&1OMP-+@Y&O-vBQCZ(Wv7+Cl}v?0*;2P zDkr9fcRvhVR-dt0aKz!ioP~m&fNRdiWfHbWK5}stEMXAa!t#KDS(ZJf&_&$-ji4Bh z*$sge+@BX+*z-w8MCCBAHBXD1nCB8MSKZz%6D1p19=W+0+txTaGd^Mt@=)4t^XZr| z^Wx7<%npslXY?Lt1vT)pC{2>F>J$kHP@Ai>S%7PG%cYC%imEP6yxuulQ@Pbe7X&Hm z^@iAJE`PH+(BD({>XqO?*^a<3LAj!#8_cfshBhUzw%dhga+jV8EPQ+QdVGDX=#50> zxmV1&)KYcTkhN5hTSc# z7M*st{Nd57cZ##SuivZoEET_ByZvXcQFN7{*Y^93oY$s5Xckm^6yKmIXz{T9rm4iE z&c}17Kjd1zG$J`m_1=xgMdJH*-0Sybt9&vkQ0`h%o2=i>RDbKb$Y(*}Y&)LLER@TC zIJ@{=gCdzdAD9JU)UG*YURpxw_dGYxR2q*0&N$m*Xs}R zMZej2Qm;C5t+e8T=B+pLZol3BurK=E&X? Date: Sat, 10 Nov 2001 00:18:51 +0000 Subject: [PATCH 0011/1313] - removed the eps files as they have been converted to gifs. the xfig files will remain so that edits can be made. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152701 13f79535-47bb-0310-9956-ffa450edef68 --- docs/eps/classfile.eps | 378 --------------------------- docs/eps/classgen.eps | 499 ------------------------------------ docs/eps/classloader.eps | 160 ------------ docs/eps/constantpool.eps | 399 ----------------------------- docs/eps/il.eps | 513 ------------------------------------- docs/eps/instructions.eps | 445 -------------------------------- docs/eps/javaclass.eps | 525 -------------------------------------- docs/eps/jvm.eps | 218 ---------------- 8 files changed, 3137 deletions(-) delete mode 100644 docs/eps/classfile.eps delete mode 100644 docs/eps/classgen.eps delete mode 100644 docs/eps/classloader.eps delete mode 100644 docs/eps/constantpool.eps delete mode 100644 docs/eps/il.eps delete mode 100644 docs/eps/instructions.eps delete mode 100644 docs/eps/javaclass.eps delete mode 100644 docs/eps/jvm.eps diff --git a/docs/eps/classfile.eps b/docs/eps/classfile.eps deleted file mode 100644 index 5896e457..00000000 --- a/docs/eps/classfile.eps +++ /dev/null @@ -1,378 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: classfile.eps -%%Creator: fig2dev Version 3.2 Patchlevel 1 -%%CreationDate: Mon Nov 30 16:01:26 1998 -%%For: dahm@che (Markus Dahm,,,,,) -%%Orientation: Portrait -%%BoundingBox: 0 0 520 460 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def - -end -save --17.0 540.0 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def -%%EndProlog - -$F2psBegin -10 setmiterlimit -n -1000 10000 m -1000 -1000 l 9937 -1000 l 9937 10000 l cp clip - 0.06000 0.06000 sc -% Polyline -7.500 slw -n 2999 6599 m 2400 6599 l 2400 6749 l 2999 6749 l cp gs col0 s gr -% Polyline -n 2400 6749 m 2999 6749 l 2999 6899 l 2400 6899 l cp gs col0 s gr -% Polyline -n 2999 6899 m 2400 6899 l 2400 7049 l 2999 7049 l cp gs col0 s gr -% Polyline -n 2400 7049 m 2999 7049 l 2999 7200 l 2400 7200 l cp gs col0 s gr -% Polyline -n 2400 7200 m 2999 7200 l 2999 7349 l 2400 7349 l cp gs col0 s gr -% Polyline -30.000 slw - [15 45] 45 sd -n 2699 7424 m 2699 7724 l gs col0 s gr [] 0 sd -% Polyline -7.500 slw -n 299 6449 m 3299 6449 l 3299 7949 l 299 7949 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 6824 m -gs 1 -1 sc (Methods) col0 sh gr -% Polyline -n 2999 5099 m 2400 5099 l 2400 5249 l 2999 5249 l cp gs col0 s gr -% Polyline -n 2400 5249 m 2999 5249 l 2999 5399 l 2400 5399 l cp gs col0 s gr -% Polyline -n 2999 5399 m 2400 5399 l 2400 5549 l 2999 5549 l cp gs col0 s gr -% Polyline -n 2400 5549 m 2999 5549 l 2999 5699 l 2400 5699 l cp gs col0 s gr -% Polyline -n 2400 5699 m 2999 5699 l 2999 5849 l 2400 5849 l cp gs col0 s gr -% Polyline -30.000 slw - [15 45] 45 sd -n 2699 5924 m 2699 6224 l gs col0 s gr [] 0 sd -% Polyline -7.500 slw -n 299 4949 m 3299 4949 l 3299 6449 l 299 6449 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 5399 m -gs 1 -1 sc (Fields) col0 sh gr -% Polyline -n 299 4199 m 3299 4199 l 3299 4949 l 299 4949 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 4649 m -gs 1 -1 sc (Implemented interfaces) col0 sh gr -% Polyline -n 299 3449 m 3299 3449 l 3299 4199 l 299 4199 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 3899 m -gs 1 -1 sc (Access rights) col0 sh gr -% Polyline -n 299 1349 m 3299 1349 l 3299 2099 l 299 2099 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 1799 m -gs 1 -1 sc (Header) col0 sh gr -% Polyline -n 2999 2249 m 2400 2249 l 2400 2400 l 2999 2400 l cp gs col0 s gr -% Polyline -n 2400 2400 m 2999 2400 l 2999 2549 l 2400 2549 l cp gs col0 s gr -% Polyline -n 2999 2549 m 2400 2549 l 2400 2699 l 2999 2699 l cp gs col0 s gr -% Polyline -n 2400 2699 m 2999 2699 l 2999 2849 l 2400 2849 l cp gs col0 s gr -% Polyline -n 2400 2849 m 2999 2849 l 2999 2999 l 2400 2999 l cp gs col0 s gr -% Polyline -30.000 slw - [15 45] 45 sd -n 2699 3074 m 2699 3374 l gs col0 s gr [] 0 sd -% Polyline -7.500 slw -n 299 2099 m 3299 2099 l 3299 3449 l 299 3449 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 2549 m -gs 1 -1 sc (Constant pool) col0 sh gr -% Polyline -n 299 7949 m 3299 7949 l 3299 8699 l 299 8699 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 8400 m -gs 1 -1 sc (Class attributes) col0 sh gr -% Polyline -n 4800 2999 m 7499 2999 l 7499 4349 l 4800 4349 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -5099 3299 m -gs 1 -1 sc (ConstantFieldref) col0 sh gr -/Helvetica ff 210.00 scf sf -5099 3600 m -gs 1 -1 sc ("aVariable") col0 sh gr -/Helvetica ff 210.00 scf sf -5099 3884 m -gs 1 -1 sc ("[Ljava/lang/Object;") col0 sh gr -/Helvetica ff 210.00 scf sf -5099 4199 m -gs 1 -1 sc ("HelloWorld") col0 sh gr -% Polyline -n 5024 2624 m 7124 2624 l 7124 2924 l 5024 2924 l cp gs col0 s gr -/Helvetica ff 210.00 scf sf -5099 2849 m -gs 1 -1 sc ("java/io/PrintStream") col0 sh gr -% Polyline -n 4800 1649 m 7499 1649 l 7499 2999 l 4800 2999 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -5099 1949 m -gs 1 -1 sc (ConstantMethodRef) col0 sh gr -/Helvetica ff 210.00 scf sf -5099 2249 m -gs 1 -1 sc ("println") col0 sh gr -/Helvetica ff 210.00 scf sf -5099 2534 m -gs 1 -1 sc ("\(Ljava/lang/String;\)V") col0 sh gr -% Polyline -n 4800 4349 m 7499 4349 l 7499 5099 l 4800 5099 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -5099 4649 m -gs 1 -1 sc (ConstantClass) col0 sh gr -/Helvetica ff 210.00 scf sf -5099 4949 m -gs 1 -1 sc ("java/io/PrintStream") col0 sh gr -% Polyline -n 4080 6500 m 3975 6500 3975 7770 105 arcto 4 {pop} repeat - 3975 7875 8820 7875 105 arcto 4 {pop} repeat - 8925 7875 8925 6605 105 arcto 4 {pop} repeat - 8925 6500 4080 6500 105 arcto 4 {pop} repeat - cp gs 0.00 setgray ef gr gs col0 s gr -% Polyline -n 3855 6725 m 3750 6725 3750 7995 105 arcto 4 {pop} repeat - 3750 8100 8595 8100 105 arcto 4 {pop} repeat - 8700 8100 8700 6830 105 arcto 4 {pop} repeat - 8700 6725 3855 6725 105 arcto 4 {pop} repeat - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -30.000 slw - [15 45] 45 sd -n 6150 7800 m 6150 7950 l gs col0 s gr [] 0 sd -% Polyline -7.500 slw -n 5550 7200 m 7200 7200 l 7200 7425 l 5550 7425 l cp gs col0 s gr -% Polyline -n 5550 7500 m 8625 7500 l 8625 7725 l 5550 7725 l cp gs col0 s gr -/Courier-Bold ff 180.00 scf sf -4050 7050 m -gs 1 -1 sc (getstatic java.lang.System.out) col0 sh gr -/Courier-Bold ff 180.00 scf sf -4050 7650 m -gs 1 -1 sc (invokevirtual java.io.PrintStream.println) col0 sh gr -/Courier-Bold ff 180.00 scf sf -4050 7350 m -gs 1 -1 sc (ldc "Hello, world") col0 sh gr -% Polyline - [15 45] 45 sd -n 2400 2249 m 4800 1649 l gs col0 s gr [] 0 sd -% Polyline - [15 45] 45 sd -n 2400 2849 m 4800 5849 l gs col0 s gr [] 0 sd -% Polyline -gs clippath -4693 3661 m 4800 3600 l 4734 3705 l 4832 3611 l 4790 3568 l cp -clip -n 2999 5324 m 4800 3600 l gs col0 s gr gr - -% arrowhead -n 4693 3661 m 4800 3600 l 4734 3705 l 4713 3683 l 4693 3661 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -3669 7107 m 3750 7200 l 3635 7156 l 3745 7233 l 3779 7184 l cp -clip -n 2999 6674 m 3750 7200 l gs col0 s gr gr - -% arrowhead -n 3669 7107 m 3750 7200 l 3635 7156 l 3652 7131 l 3669 7107 l cp gs 0.00 setgray ef gr col0 s -% Polyline -n 5099 1649 m 5099 1349 l 7799 1349 l 7799 5549 l 7499 5549 l 7499 1649 l - 5099 1649 l cp gs 0.00 setgray ef gr gs col0 s gr -% Polyline - [15 45] 45 sd -n 2999 2849 m 4800 4049 l gs col0 s gr [] 0 sd -% Polyline - [15 45] 45 sd -n 2999 2249 m 4800 2024 l gs col0 s gr [] 0 sd -% Polyline -gs clippath -7609 2533 m 7500 2475 l 7624 2475 l 7493 2442 l 7478 2500 l cp -clip -n 7800 2550 m 7500 2475 l gs col7 s gr gr - -% arrowhead -n 7609 2533 m 7500 2475 l 7624 2475 l 7616 2504 l 7609 2533 l cp gs col7 1.00 shd ef gr col7 s -% Polyline -n 4800 5099 m 7499 5099 l 7499 5849 l 4800 5849 l cp gs col0 s gr -% Polyline -n 7800 7500 m 7801 7499 l 7804 7496 l 7809 7491 l 7816 7483 l 7826 7472 l - 7840 7457 l 7856 7440 l 7875 7419 l 7897 7395 l 7921 7368 l - 7946 7340 l 7973 7310 l 7999 7279 l 8026 7247 l 8052 7216 l - 8078 7184 l 8102 7152 l 8125 7121 l 8147 7090 l 8167 7059 l - 8186 7029 l 8203 6998 l 8220 6966 l 8235 6934 l 8250 6900 l - 8261 6873 l 8272 6845 l 8282 6816 l 8292 6786 l 8303 6756 l - 8313 6724 l 8323 6692 l 8333 6659 l 8343 6626 l 8353 6592 l - 8363 6557 l 8373 6522 l 8382 6487 l 8392 6451 l 8402 6415 l - 8412 6379 l 8421 6342 l 8431 6305 l 8440 6268 l 8449 6231 l - 8458 6194 l 8467 6157 l 8476 6120 l 8484 6082 l 8492 6045 l - 8500 6007 l 8508 5969 l 8515 5932 l 8522 5894 l 8528 5856 l - 8535 5817 l 8540 5778 l 8545 5739 l 8550 5700 l 8554 5664 l - 8557 5628 l 8560 5591 l 8563 5554 l 8565 5517 l 8567 5479 l - 8568 5440 l 8570 5401 l 8571 5362 l 8572 5322 l 8572 5281 l - 8573 5241 l 8573 5200 l 8573 5159 l 8573 5117 l 8573 5076 l - 8572 5034 l 8572 4992 l 8571 4950 l 8570 4908 l 8570 4866 l - 8569 4824 l 8568 4783 l 8567 4741 l 8566 4700 l 8565 4659 l - 8564 4619 l 8563 4578 l 8562 4538 l 8561 4499 l 8560 4460 l - 8559 4421 l 8558 4383 l 8557 4346 l 8555 4309 l 8554 4272 l - 8552 4236 l 8550 4200 l 8548 4161 l 8545 4121 l 8542 4083 l - 8540 4044 l 8537 4006 l 8534 3968 l 8531 3930 l 8528 3892 l - 8526 3854 l 8523 3815 l 8520 3777 l 8517 3739 l 8515 3702 l - 8512 3664 l 8509 3626 l 8506 3588 l 8503 3551 l 8500 3514 l - 8497 3477 l 8493 3440 l 8490 3404 l 8486 3368 l 8481 3333 l - 8477 3298 l 8471 3264 l 8466 3231 l 8460 3199 l 8453 3167 l - 8446 3136 l 8438 3107 l 8430 3078 l 8421 3051 l 8411 3025 l - 8400 3000 l 8385 2969 l 8368 2941 l 8349 2913 l 8328 2887 l - 8305 2862 l 8279 2838 l 8251 2814 l 8220 2790 l 8187 2767 l - 8153 2744 l 8117 2721 l 8080 2699 l 8043 2678 l 8006 2657 l - 7970 2638 l 7937 2620 l 7907 2604 l 7879 2590 l 7856 2578 l - 7837 2568 l 7823 2561 l 7812 2556 l 7805 2553 l 7802 2551 l - 7800 2550 l gs col0 s gr -% Polyline -gs clippath -4723 4703 m 4800 4800 l 4687 4750 l 4794 4833 l 4830 4785 l cp -clip -n 5025 2775 m 5024 2776 l 5020 2779 l 5015 2784 l 5006 2792 l 4993 2804 l - 4977 2818 l 4957 2836 l 4934 2857 l 4908 2881 l 4879 2907 l - 4849 2935 l 4818 2964 l 4786 2994 l 4754 3023 l 4723 3053 l - 4693 3082 l 4664 3110 l 4637 3137 l 4612 3163 l 4589 3188 l - 4568 3212 l 4549 3235 l 4531 3257 l 4515 3278 l 4500 3300 l - 4485 3324 l 4471 3347 l 4457 3371 l 4444 3396 l 4432 3420 l - 4419 3445 l 4408 3470 l 4396 3495 l 4385 3520 l 4374 3546 l - 4363 3571 l 4352 3596 l 4342 3622 l 4332 3647 l 4323 3673 l - 4314 3698 l 4306 3724 l 4299 3749 l 4292 3775 l 4286 3800 l - 4281 3825 l 4278 3850 l 4276 3875 l 4275 3900 l 4276 3925 l - 4278 3950 l 4282 3975 l 4287 4001 l 4293 4027 l 4301 4053 l - 4309 4080 l 4319 4106 l 4329 4133 l 4340 4160 l 4351 4187 l - 4363 4214 l 4375 4241 l 4387 4268 l 4399 4294 l 4411 4320 l - 4423 4345 l 4434 4370 l 4446 4394 l 4457 4417 l 4468 4439 l - 4478 4460 l 4489 4481 l 4500 4500 l 4513 4522 l 4528 4543 l - 4543 4563 l 4559 4583 l 4578 4603 l 4597 4623 l 4618 4643 l - 4640 4664 l 4663 4685 l 4686 4705 l 4709 4724 l 4730 4742 l - 4749 4758 l 4765 4772 l 4778 4783 l 4800 4800 l gs col0 s gr gr - -% arrowhead -n 4723 4703 m 4800 4800 l 4687 4750 l 4705 4727 l 4723 4703 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -7591 5782 m 7499 5699 l 7619 5728 l 7500 5665 l 7472 5719 l cp -clip -n 7200 7275 m 7203 7274 l 7208 7271 l 7219 7265 l 7235 7257 l 7256 7246 l - 7282 7233 l 7312 7217 l 7346 7200 l 7381 7182 l 7417 7163 l - 7453 7144 l 7487 7126 l 7520 7109 l 7551 7092 l 7580 7076 l - 7607 7061 l 7631 7048 l 7654 7034 l 7676 7022 l 7696 7010 l - 7714 6998 l 7733 6986 l 7750 6975 l 7770 6961 l 7790 6947 l - 7810 6933 l 7829 6918 l 7847 6903 l 7866 6887 l 7883 6871 l - 7901 6855 l 7917 6837 l 7933 6820 l 7947 6802 l 7961 6784 l - 7973 6766 l 7984 6748 l 7994 6729 l 8003 6711 l 8010 6693 l - 8016 6675 l 8021 6656 l 8025 6638 l 8028 6618 l 8030 6598 l - 8031 6578 l 8031 6556 l 8030 6534 l 8029 6511 l 8026 6487 l - 8023 6462 l 8019 6438 l 8015 6412 l 8009 6387 l 8004 6362 l - 7997 6338 l 7991 6314 l 7984 6291 l 7977 6269 l 7971 6247 l - 7964 6226 l 7957 6207 l 7950 6187 l 7942 6167 l 7934 6146 l - 7926 6126 l 7918 6106 l 7909 6086 l 7900 6066 l 7891 6046 l - 7881 6027 l 7871 6008 l 7861 5990 l 7850 5972 l 7840 5956 l - 7829 5940 l 7818 5925 l 7807 5911 l 7797 5898 l 7785 5886 l - 7774 5874 l 7762 5863 l 7750 5852 l 7737 5841 l 7722 5830 l - 7707 5819 l 7689 5807 l 7670 5795 l 7648 5782 l 7625 5769 l - 7602 5755 l 7578 5742 l 7555 5729 l 7535 5718 l 7499 5699 l gs col0 s gr gr - -% arrowhead -n 7591 5782 m 7499 5699 l 7619 5728 l 7605 5755 l 7591 5782 l cp gs 0.00 setgray ef gr col0 s -/Helvetica ff 210.00 scf sf -975 9000 m -gs 1 -1 sc (HelloWorld.class) col0 sh gr -/Helvetica ff 210.00 scf sf -5099 5699 m -gs 1 -1 sc ("Hello, world") col0 sh gr -/Helvetica-Bold ff 210.00 scf sf -5099 5399 m -gs 1 -1 sc (ConstantString) col0 sh gr -$F2psEnd -rs diff --git a/docs/eps/classgen.eps b/docs/eps/classgen.eps deleted file mode 100644 index 4d7052b1..00000000 --- a/docs/eps/classgen.eps +++ /dev/null @@ -1,499 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Title: Rose Diagram(s) -%%Creator: AdobePS5.dll Version 5.0 -%%CreationDate: 7/7/1999 17:42:13 -%%Pages: 1 -%%Orientation: Portrait -%%PageOrder: Ascend -%%DocumentNeededResources: (atend) -%%DocumentSuppliedResources: (atend) -%%DocumentData: Clean7Bit -%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 -%%LanguageLevel: 2 -%%BoundingBox: 13 12 535 830 -%%EndComments -%%BeginProcSet: epsffit 1 0 -gsave -1249.738 -7.476 translate -90 rotate -1.623 1.623 scale -%%EndProcSet - - -%%BeginDefaults -%%PageBoundingBox: 13 12 582 830 -%%EndDefaults - -%%BeginProlog -%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 -/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false -setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype -ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch -def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 -rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def -/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def -typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 -def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp -exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def -/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype -{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} -readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop -(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def -/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) -tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup -xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint -tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck -{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) -tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup -rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} -forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier -/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin -$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 -ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto -(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt -$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} -repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print -(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup -0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop -/setpacking where{pop oldpack setpacking}if}if -%%EndResource -userdict /Pscript_WinNT_Incr 230 dict dup begin put -%%BeginResource: file Pscript_FatalError 5.0 0 -/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div -cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def -%%EndResource -/VM?{vmstatus exch sub exch pop gt{[ -(This job requires more memory than is available in this printer.)100 500 -(Try one or more of the following, and then print again:)100 485 -(For the output format, choose Optimize For Portability.)115 470 -(In the Device Settings page, make sure the Available PostScript Memory is accurate.) -115 455(Reduce the number of fonts in the document.)115 440 -(Print the document in parts.)115 425 12/Times-Roman showpage -(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def -%%BeginResource: file Pscript_Win_Basic 5.0 0 -/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ -/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- -/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , -d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C -/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M -/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d -/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage -, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false -/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d -/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, -d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx -matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit -/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} -b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U -/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d -reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d -/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 -sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} -b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b -/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b -/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} -b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b -%%EndResource -%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 -/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge -{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ -snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F -setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d -/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b -%%EndResource -end -%%EndProlog - -%%BeginSetup -[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec -1 setlinecap 1 setlinejoin -/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def -%%EndSetup - -%%Page: 1 1 -%%PageBoundingBox: 13 12 582 830 -%%EndPageComments -%%BeginPageSetup -/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh -%%EndPageSetup - -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Win_GdiObject 5.0 0 -/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore -{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d -/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps -L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType -1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d -/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal -{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep -gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b -/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M -MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep -M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 -+}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d -/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix -GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 -/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal -makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 -/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d -/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] -d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 -0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne -{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd -aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx -PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save -8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 -Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx -matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` -xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill -{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot -concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap -YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 --0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix -currentmatrix readonly d ; ;}if}b -%%EndResource -%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 -/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} -{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 -d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d -20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d -/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ -/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict -~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} -? ;}b -%%EndResource -end reinitialize -: N 234 594 236 124 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 470 593 M 233 593 I 233 718 I 470 718 I C -K -0 0 0 1 scol Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Text 5.0 0 -/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d -/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ -length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets -{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& -/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} -if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ -{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get -StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ -{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ -length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ -put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M -currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d -/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N -/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix -astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get -length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d -/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS -{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 -copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for -& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ -4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 -add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for -/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 -Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName -length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length -string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ -putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 -$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? -{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName -get undefinefont}forall undefinefont}b -%%EndResource -end reinitialize -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Encoding256 5.0 0 -/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction -/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign -/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma -/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S -/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave -/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright -/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis -/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef -/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet -/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef -/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section -/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered -/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph -/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter -/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis -/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute -/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls -/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute -/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve -/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex -/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put -%%EndResource -end reinitialize - -%%IncludeResource: font Helvetica -F /F0 0 /256 T /Helvetica mF -/F0S29 F0 [41 0 0 -41 0 0 ] mFS -F0S29 Ji -257 643 M (BasicType)[27 23 20 8 21 26 19 23 0]xS -0.602 0 0.199 1 scol N 470 659 M 233 659 I 233 718 I 470 718 I C -K -N 470 682 M 233 682 I 233 718 I 470 718 I C -K -: N 252 292 360 184 rp C -1 1 0.801 1 scol L ; N 612 291 M 251 291 I 251 476 I 612 476 I C -K -0 0 0 1 scol 326 341 M (ObjectType)[32 23 10 23 21 11 26 19 23 0]xS -0.602 0 0.199 1 scol N 612 357 M 251 357 I 251 476 I 612 476 I C -K -N 612 380 M 251 380 I 251 476 I 612 476 I C -K -0 0 0 1 scol 310 448 M (getClassName\(\))[23 23 11 30 10 23 20 20 30 23 36 23 14 0]xS -: N 699 292 362 184 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1061 291 M 698 291 I 698 476 I 1061 476 I C -K -0 0 0 1 scol 786 341 M (ArrayType)[27 14 14 23 19 26 19 23 0]xS -0.602 0 0.199 1 scol N 1061 357 M 698 357 I 698 476 I 1061 476 I C -K -N 1061 380 M 698 380 I 698 476 I 1061 476 I C -K -0 0 0 1 scol 757 448 M (getDimensions\(\))[23 23 11 30 8 36 23 23 20 8 23 23 20 14 0]xS -: N 532 594 312 124 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 844 593 M 531 593 I 531 718 I 844 718 I C -K -0 0 0 1 scol 546 643 M (ReferenceType)[30 23 12 23 14 23 23 21 23 26 19 23 0]xS -0.602 0 0.199 1 scol N 844 659 M 531 659 I 531 718 I 844 718 I C -K -N 844 682 M 531 682 I 531 718 I 844 718 I C -K -: N 1202 295 284 178 rp C -1 1 0.801 1 scol L ; N 1486 294 M 1201 294 I 1201 473 I 1486 473 I C -K -0 0 0 1 scol -%%IncludeResource: font Helvetica-Oblique -F /F1 0 /256 T /Helvetica-Oblique mF -/F1S29 F1 [41 0 0 -41 0 0 ] mFS -F1S29 Ji -1226 343 M (AccessFlags)[27 21 21 23 21 21 25 9 23 23 0]xS -0.602 0 0.199 1 scol N 1486 360 M 1201 360 I 1201 473 I 1486 473 I C -K -N 1486 383 M 1201 383 I 1201 473 I 1486 473 I C -K -0 0 0 1 scol 1260 450 M (isPublic\(\))[9 21 27 23 23 9 9 21 14 0]xS -0.602 0 0.199 1 scol N 1344 602 M 1344 474 I K -N 1059 602 M 1634 602 I K -N 1344 474 M 1366 534 I 1322 534 I C -: 1 1 1 1 scol O ; K -N 678 500 M 678 593 I K -N 369 500 M 881 500 I K -N 678 593 M 700 533 I 656 533 I C -: 1 1 1 1 scol O ; K -N 369 477 M 369 500 I K -N 881 477 M 881 500 I K -: N 919 683 306 234 rp C -1 1 0.801 1 scol L ; N 1225 682 M 918 682 I 918 917 I 1225 917 I C -K -0 0 0 1 scol F0S29 Ji -988 732 M (FieldGen)[25 8 23 10 23 32 23 0]xS -0.602 0 0.199 1 scol N 1225 748 M 918 748 I 918 917 I 1225 917 I C -K -N 1225 771 M 918 771 I 918 917 I 1225 917 I C -K -0 0 0 1 scol 977 839 M (getField\(\))[23 23 11 25 8 23 10 23 14 0]xS -977 886 M (setInitValue\(\))[20 23 11 10 23 8 11 27 23 10 23 23 14 0]xS -0.602 0 0.199 1 scol N 1059 682 M 1059 602 I K -: N 543 1283 386 122 rp C -1 1 0.801 1 scol L ; N 929 1282 M 542 1282 I 542 1405 I 929 1405 I C -K -0 0 0 1 scol 571 1332 M (LocalVariableGen)[23 23 21 23 10 27 23 14 8 23 23 10 23 32 23 0]xS -0.602 0 0.199 1 scol N 929 1348 M 542 1348 I 542 1405 I 929 1405 I C -K -N 929 1371 M 542 1371 I 542 1405 I 929 1405 I C -K -: N 538 1106 396 124 rp C -1 1 0.801 1 scol L ; N 934 1105 M 537 1105 I 537 1230 I 934 1230 I C -K -0 0 0 1 scol 559 1155 M (CodeExceptionGen)[30 23 23 23 27 18 21 23 23 11 8 23 23 32 23 0]xS -0.602 0 0.199 1 scol N 934 1171 M 537 1171 I 537 1230 I 934 1230 I C -K -N 934 1194 M 537 1194 I 537 1230 I 934 1230 I C -K -: N 351 836 322 184 rp C -1 1 0.801 1 scol L ; N 673 835 M 350 835 I 350 1020 I 673 1020 I C -K -0 0 0 1 scol 466 885 M (Type)[26 19 23 0]xS -0.602 0 0.199 1 scol N 673 901 M 350 901 I 350 1020 I 673 1020 I C -K -N 673 924 M 350 924 I 350 1020 I 673 1020 I C -K -0 0 0 1 scol 409 992 M (getSignature\(\))[23 23 11 27 8 23 23 23 11 23 14 23 14 0]xS -0.602 0 0.199 1 scol N 512 745 M 512 835 I K -N 347 745 M 669 745 I K -N 512 835 M 534 775 I 490 775 I C -: 1 1 1 1 scol O ; K -N 795 862 M 674 889 I K -N 795 862 M 917 833 I K -N 347 719 M 347 745 I K -N 669 719 M 669 745 I K -: N 538 1457 364 126 rp C -1 1 0.801 1 scol L ; N 902 1456 M 537 1456 I 537 1583 I 902 1583 I C -K -0 0 0 1 scol 561 1506 M (BranchInstruction)[27 14 23 23 21 23 10 23 20 11 14 23 21 11 8 23 0]xS -0.602 0 0.199 1 scol N 902 1522 M 537 1522 I 537 1583 I 902 1583 I C -K -N 902 1545 M 537 1545 I 537 1583 I 902 1583 I C -K -: N 1157 1012 342 184 rp C -1 1 0.801 1 scol L ; N 1499 1011 M 1156 1011 I 1156 1196 I 1499 1196 I C -K -0 0 0 1 scol 1221 1061 M (MethodGen)[33 23 11 23 23 23 32 23 0]xS -0.602 0 0.199 1 scol N 1499 1077 M 1156 1077 I 1156 1196 I 1499 1196 I C -K -N 1499 1100 M 1156 1100 I 1156 1196 I 1499 1196 I C -K -0 0 0 1 scol 1215 1168 M (addException\(\))[23 23 23 27 18 21 23 23 11 8 23 23 14 0]xS -0.602 0 0.199 1 scol N 1022 1227 M 1155 1172 I K -N 1155 1172 M 1136 1196 I 1105 1193 I 1124 1168 I 1155 1172 I C -: 1 1 1 1 scol O ; K -N 1022 1227 M 886 1281 I K -N 913 1302 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 913 1340 M (*)S -N 913 1302 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 913 1340 M (*)S -0.602 0 0.199 1 scol N 1045 1134 M 1155 1121 I K -N 1155 1121 M 1130 1139 I 1101 1127 I 1126 1109 I 1155 1121 I C -: 1 1 1 1 scol O ; K -N 1045 1134 M 935 1145 I K -N 934 1068 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 934 1106 M (*)S -N 934 1068 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 934 1106 M (*)S -0.602 0 0.199 1 scol N 914 1014 M 674 962 I K -N 914 1014 M 1155 1066 I K -N 1344 1011 M 1344 602 I K -: N 1751 1012 306 184 rp C -1 1 0.801 1 scol L ; N 2057 1011 M 1750 1011 I 1750 1196 I 2057 1196 I C -K -0 0 0 1 scol 1779 1061 M (InstructionList)[10 23 20 11 14 23 21 11 8 23 23 23 8 20 0]xS -0.602 0 0.199 1 scol N 2057 1077 M 1750 1077 I 1750 1196 I 2057 1196 I C -K -N 2057 1100 M 1750 1100 I 1750 1196 I 2057 1196 I C -K -0 0 0 1 scol 1809 1168 M (append\(\))[23 23 23 23 23 23 14 0]xS -0.602 0 0.199 1 scol N 1624 1104 M 1749 1104 I K -N 1624 1104 M 1500 1104 I K -: N 1201 1313 222 190 rp C -1 1 0.801 1 scol L ; N 1423 1312 M 1200 1312 I 1200 1503 I 1423 1503 I C -K -0 0 0 1 scol 1219 1362 M (Instruction)[10 23 20 11 14 23 21 11 8 23 0]xS -0.602 0 0.199 1 scol N 1423 1378 M 1200 1378 I 1200 1503 I 1423 1503 I C -K -N 1423 1495 M 1200 1495 I 1200 1503 I 1423 1503 I C -K -0 0 0 1 scol 1259 1422 M (tag)[11 23 0]xS -1259 1469 M (length)[10 23 23 23 11 0]xS -0.602 0 0.199 1 scol N 903 1485 M 1199 1429 I K -N 1199 1429 M 1144 1462 I 1136 1418 I C -: 1 1 1 1 scol O ; K -: N 1722 1345 364 126 rp C -1 1 0.801 1 scol L ; N 2086 1344 M 1721 1344 I 1721 1471 I 2086 1471 I C -K -0 0 0 1 scol 1744 1394 M (InstructionHandle)[10 23 20 11 14 23 21 11 8 23 23 30 23 23 23 10 0]xS -0.602 0 0.199 1 scol N 2086 1410 M 1721 1410 I 1721 1471 I 2086 1471 I C -K -N 2086 1433 M 1721 1433 I 1721 1471 I 2086 1471 I C -K -N 1904 1270 M 1904 1197 I K -N 1947 1181 23 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1947 1219 M (1)S -0.602 0 0.199 1 scol N 1904 1197 M 1919 1224 I 1904 1251 I 1889 1224 I 1904 1197 I C -: 1 1 1 1 scol O ; K -N 1904 1270 M 1904 1343 I K -N 1950 1313 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1950 1351 M (*)S -N 1947 1181 23 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1947 1219 M (1)S -N 1950 1313 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1950 1351 M (*)S -0.602 0 0.199 1 scol N 1572 1408 M 1424 1408 I K -N 1429 1439 23 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1429 1477 M (1)S -0.602 0 0.199 1 scol N 1572 1408 M 1720 1408 I K -N 1693 1439 23 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1693 1477 M (1)S -N 1429 1439 23 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1429 1477 M (1)S -N 1693 1439 23 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1693 1477 M (1)S -: N 0 1224 384 240 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol : 0 1223 385 242 rc N 384 1223 M -1 1223 I -1 1464 I 384 1464 I C -K -; 0 0 0 1 scol 20 1323 M (InstructionTargeter)[10 23 20 11 14 23 21 11 8 23 23 26 23 14 23 23 11 23 0]xS -0.602 0 0.199 1 scol : 0 1339 385 126 rc N 384 1339 M -1 1339 I -1 1464 I 384 1464 I C -K -; : 0 1362 385 103 rc N 384 1362 M -1 1362 I -1 1464 I 384 1464 I C -K -; 0 0 0 1 scol 58 1430 M (updateTarget\(\))[23 23 23 23 11 23 26 23 14 23 23 11 14 0]xS -64 1273 M (<>)[24 24 10 23 11 23 14 12 23 21 23 24 0]xS -1 1 1 1 scol [ 72 24 ] 0 sd N 540 1231 M 385 1280 I K -0 0 0 1 scol [ 72 24 ] 0 sd N 540 1231 M 385 1280 I K -0.602 0 0.199 1 scol solid N 385 1280 M 449 1283 I 435 1241 I C -: 1 1 1 1 scol O ; K -1 1 1 1 scol [ 72 24 ] 0 sd N 541 1344 M 385 1344 I K -0 0 0 1 scol [ 72 24 ] 0 sd N 541 1344 M 385 1344 I K -0.602 0 0.199 1 scol solid N 385 1344 M 445 1366 I 445 1322 I C -: 1 1 1 1 scol O ; K -N 1043 1616 M 1903 1616 I K -N 1903 1616 M 1903 1472 I K -N 1949 1550 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1949 1588 M (*)S -0.602 0 0.199 1 scol N 1043 1616 M 191 1616 I K -N 191 1616 M 191 1465 I K -N 237 1542 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 237 1580 M (*)S -N 1949 1550 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1949 1588 M (*)S -N 237 1542 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 237 1580 M (*)S -N 1186 1556 221 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1186 1594 M (<>)[24 24 11 23 14 23 23 11 20 24 0]xS -: N 1707 306 362 284 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2069 305 M 1706 305 I 1706 590 I 2069 590 I C -K -0 0 0 1 scol 1725 355 M (ConstantPoolGen)[30 23 23 20 11 23 23 11 27 23 23 10 32 23 0]xS -0.602 0 0.199 1 scol N 2069 371 M 1706 371 I 1706 590 I 2069 590 I C -K -N 2069 394 M 1706 394 I 1706 590 I 2069 590 I C -K -0 0 0 1 scol 1765 462 M (addClass\(\))[23 23 23 30 10 23 20 20 14 0]xS -1765 509 M (addMethodRef\(\))[23 23 23 33 23 11 23 23 23 30 23 12 14 0]xS -1765 556 M (addInteger\(\))[23 23 23 10 23 11 23 23 23 14 14 0]xS -: N 1475 683 314 234 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1789 682 M 1474 682 I 1474 917 I 1789 917 I C -K -0 0 0 1 scol 1541 732 M (ClassGen)[30 10 23 20 20 32 23 0]xS -0.602 0 0.199 1 scol N 1789 748 M 1474 748 I 1474 917 I 1789 917 I C -K -N 1789 771 M 1474 771 I 1474 917 I 1789 917 I C -K -0 0 0 1 scol 1533 839 M (addInterface\(\))[23 23 23 10 23 11 23 14 12 23 21 23 14 0]xS -1533 886 M (addMethod\(\))[23 23 23 33 23 11 23 23 23 14 0]xS -0.602 0 0.199 1 scol N 1634 682 M 1634 602 I K -N 1751 636 M 1782 591 I K -N 1751 636 M 1717 681 I K -1 1 1 1 scol [ 72 24 ] 0 sd N 536 1458 M 385 1408 I K -0 0 0 1 scol [ 72 24 ] 0 sd N 536 1458 M 385 1408 I K -0.602 0 0.199 1 scol solid N 385 1408 M 449 1406 I 435 1448 I C -: 1 1 1 1 scol O ; K -LH -%%PageTrailer - -%%Trailer -%%DocumentNeededResources: -%%+ font Helvetica-Oblique -%%+ font Helvetica -%%DocumentSuppliedResources: -Pscript_WinNT_Incr dup /terminate get exec -%%EOF -grestore diff --git a/docs/eps/classloader.eps b/docs/eps/classloader.eps deleted file mode 100644 index 4c3a3f3f..00000000 --- a/docs/eps/classloader.eps +++ /dev/null @@ -1,160 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: classloader.eps -%%Creator: fig2dev Version 3.2 Patchlevel 0-beta3 -%%CreationDate: Thu Mar 18 16:45:56 1999 -%%For: dahm@gromit (Markus Dahm) -%%Orientation: Portrait -%%BoundingBox: 0 0 683 144 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def - -end -save --55.0 171.0 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def -%%EndProlog - -$F2psBegin -10 setmiterlimit -n -1000 3712 m -1000 -1000 l 12712 -1000 l 12712 3712 l cp clip - 0.06299 0.06299 sc -% Polyline -7.500 slw -n 1005 450 m 900 450 900 1020 105 arcto 4 {pop} repeat - 900 1125 3045 1125 105 arcto 4 {pop} repeat - 3150 1125 3150 555 105 arcto 4 {pop} repeat - 3150 450 1005 450 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Helvetica ff 210.00 scf sf -1350 900 m -gs 1 -1 sc (Java class file) col0 sh gr -% Polyline -n 3600 450 m 5850 450 l 5850 1125 l 3600 1125 l cp gs col0 s gr -/Helvetica ff 210.00 scf sf -4140 855 m -gs 1 -1 sc (Class loader) col0 sh gr -% Polyline -n 6750 450 m 9000 450 l 9000 1125 l 6750 1125 l cp gs col0 s gr -/Helvetica ff 210.00 scf sf -7020 855 m -gs 1 -1 sc (Byte code verifier) col0 sh gr -% Polyline -n 9450 450 m 11700 450 l 11700 1125 l 9450 1125 l cp gs col0 s gr -/Helvetica ff 210.00 scf sf -9900 900 m -gs 1 -1 sc (Interpreter/JIT) col0 sh gr -% Polyline -n 4950 1575 m 7875 1575 l 7875 2700 l 4950 2700 l cp gs col0 s gr -/Helvetica ff 210.00 scf sf -5175 2475 m -gs 1 -1 sc (Byte code transformations) col0 sh gr -/Courier-Bold ff 210.00 scf sf -5850 2025 m -gs 1 -1 sc (JavaClass) col0 sh gr -% Polyline -gs clippath -3453 735 m 3573 765 l 3453 795 l 3615 795 l 3615 735 l cp -clip -n 3150 765 m 3600 765 l gs col0 s gr gr - -% arrowhead -n 3453 735 m 3573 765 l 3453 795 l 3453 765 l 3453 735 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -9303 735 m 9423 765 l 9303 795 l 9465 795 l 9465 735 l cp -clip -n 9000 765 m 9450 765 l gs col0 s gr gr - -% arrowhead -n 9303 735 m 9423 765 l 9303 795 l 9303 765 l 9303 735 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6105 1428 m 6075 1548 l 6045 1428 l 6045 1590 l 6105 1590 l cp -clip -n 5850 765 m 6075 765 l 6075 1575 l gs col0 s gr gr - -% arrowhead -n 6105 1428 m 6075 1548 l 6045 1428 l 6075 1428 l 6105 1428 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6603 735 m 6723 765 l 6603 795 l 6765 795 l 6765 735 l cp -clip -n 6525 1575 m 6525 765 l 6750 765 l gs col0 s gr gr - -% arrowhead -n 6603 735 m 6723 765 l 6603 795 l 6603 765 l 6603 735 l cp gs 0.00 setgray ef gr col0 s -$F2psEnd -rs diff --git a/docs/eps/constantpool.eps b/docs/eps/constantpool.eps deleted file mode 100644 index 4d3d5bd7..00000000 --- a/docs/eps/constantpool.eps +++ /dev/null @@ -1,399 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Title: Rose Diagram(s) -%%Creator: AdobePS5.dll Version 5.0 -%%CreationDate: 7/7/1999 17:45:21 -%%Pages: 1 -%%Orientation: Portrait -%%PageOrder: Ascend -%%DocumentNeededResources: (atend) -%%DocumentSuppliedResources: (atend) -%%DocumentData: Clean7Bit -%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 -%%LanguageLevel: 2 -%%BoundingBox: 13 12 383 830 -%%EndComments -%%BeginProcSet: epsffit 1 0 -gsave -1677.488 -356.303 translate -90 rotate -2.035 2.035 scale -%%EndProcSet - - -%%BeginDefaults -%%PageBoundingBox: 13 12 582 830 -%%EndDefaults - -%%BeginProlog -%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 -/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false -setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype -ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch -def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 -rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def -/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def -typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 -def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp -exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def -/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype -{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} -readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop -(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def -/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) -tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup -xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint -tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck -{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) -tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup -rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} -forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier -/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin -$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 -ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto -(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt -$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} -repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print -(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup -0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop -/setpacking where{pop oldpack setpacking}if}if -%%EndResource -userdict /Pscript_WinNT_Incr 230 dict dup begin put -%%BeginResource: file Pscript_FatalError 5.0 0 -/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div -cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def -%%EndResource -/VM?{vmstatus exch sub exch pop gt{[ -(This job requires more memory than is available in this printer.)100 500 -(Try one or more of the following, and then print again:)100 485 -(For the output format, choose Optimize For Portability.)115 470 -(In the Device Settings page, make sure the Available PostScript Memory is accurate.) -115 455(Reduce the number of fonts in the document.)115 440 -(Print the document in parts.)115 425 12/Times-Roman showpage -(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def -%%BeginResource: file Pscript_Win_Basic 5.0 0 -/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ -/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- -/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , -d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C -/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M -/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d -/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage -, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false -/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d -/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, -d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx -matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit -/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} -b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U -/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d -reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d -/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 -sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} -b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b -/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b -/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} -b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b -%%EndResource -%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 -/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge -{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ -snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F -setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d -/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b -%%EndResource -end -%%EndProlog - -%%BeginSetup -[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec -1 setlinecap 1 setlinejoin -/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def -%%EndSetup - -%%Page: 1 1 -%%PageBoundingBox: 13 12 582 830 -%%EndPageComments -%%BeginPageSetup -/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh -%%EndPageSetup - -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Win_GdiObject 5.0 0 -/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore -{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d -/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps -L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType -1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d -/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal -{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep -gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b -/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M -MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep -M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 -+}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d -/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix -GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 -/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal -makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 -/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d -/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] -d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 -0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne -{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd -aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx -PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save -8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 -Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx -matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` -xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill -{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot -concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap -YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 --0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix -currentmatrix readonly d ; ;}if}b -%%EndResource -%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 -/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} -{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 -d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d -20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d -/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ -/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict -~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} -? ;}b -%%EndResource -end reinitialize -: N 1409 506 185 84 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 1594 505 M 1408 505 I 1408 590 I 1594 590 I C -K -0 0 0 1 scol Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Text 5.0 0 -/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d -/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ -length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets -{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& -/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} -if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ -{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get -StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ -{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ -length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ -put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M -currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d -/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N -/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix -astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get -length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d -/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS -{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 -copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for -& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ -4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 -add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for -/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 -Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName -length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length -string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ -putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 -$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? -{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName -get undefinefont}forall undefinefont}b -%%EndResource -end reinitialize -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Encoding256 5.0 0 -/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction -/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign -/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma -/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S -/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave -/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright -/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis -/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef -/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet -/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef -/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section -/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered -/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph -/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter -/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis -/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute -/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls -/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute -/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve -/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex -/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put -%%EndResource -end reinitialize - -%%IncludeResource: font Helvetica -F /F0 0 /256 T /Helvetica mF -/F0S18 F0 [24.66 0 0 -24.66 0 0 ] mFS -F0S18 Ji -1433 537 M (ConstantCP)[18 14 14 13 7 14 14 7 18 0]xS -0.602 0 0.199 1 scol N 1594 551 M 1408 551 I 1408 590 I 1594 590 I C -K -N 1594 565 M 1408 565 I 1408 590 I 1594 590 I C -K -: N 1292 714 375 85 rp C -1 1 0.801 1 scol L ; N 1667 713 M 1291 713 I 1291 799 I 1667 799 I C -K -0 0 0 1 scol 1324 745 M (ConstantInterfaceMethodref)[18 14 14 13 7 14 14 7 6 14 7 14 8 7 14 13 14 21 14 7 14 14 14 8 14 0]xS -0.602 0 0.199 1 scol N 1667 759 M 1291 759 I 1291 799 I 1667 799 I C -K -N 1667 773 M 1291 773 I 1291 799 I 1667 799 I C -K -: N 1710 714 262 85 rp C -1 1 0.801 1 scol L ; N 1972 713 M 1709 713 I 1709 799 I 1972 799 I C -K -0 0 0 1 scol 1734 745 M (ConstantMethodref)[18 14 14 13 7 14 14 7 21 14 7 14 14 14 8 14 0]xS -0.602 0 0.199 1 scol N 1972 759 M 1709 759 I 1709 799 I 1972 799 I C -K -N 1972 773 M 1709 773 I 1709 799 I 1972 799 I C -K -: N 1011 714 235 85 rp C -1 1 0.801 1 scol L ; N 1246 713 M 1010 713 I 1010 799 I 1246 799 I C -K -0 0 0 1 scol 1036 745 M (ConstantFieldref)[18 14 14 13 7 14 14 7 15 6 14 6 14 8 14 0]xS -0.602 0 0.199 1 scol N 1246 759 M 1010 759 I 1010 799 I 1246 799 I C -K -N 1246 773 M 1010 773 I 1010 799 I 1246 799 I C -K -: N 1516 58 213 125 rp C -1 1 0.801 1 scol L ; N 1729 57 M 1515 57 I 1515 183 I 1729 183 I C -K -0 0 0 1 scol 1546 89 M (ConstantPool)[18 14 14 13 7 14 14 7 17 14 14 0]xS -0.602 0 0.199 1 scol N 1729 103 M 1515 103 I 1515 183 I 1729 183 I C -K -N 1729 116 M 1515 116 I 1515 183 I 1729 183 I C -K -0 0 0 1 scol 1555 158 M (getConstant\(\))[14 14 7 18 14 14 13 7 14 14 7 8 0]xS -: N 1550 265 144 84 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1694 264 M 1549 264 I 1549 349 I 1694 349 I C -K -0 0 0 1 scol 1571 296 M (Constant)[18 14 14 13 7 14 14 0]xS -0.602 0 0.199 1 scol N 1694 310 M 1549 310 I 1549 349 I 1694 349 I C -K -N 1694 323 M 1549 323 I 1549 349 I 1694 349 I C -K -N 1622 223 M 1622 184 I K -N 1652 175 14 29 rp C -1 1 1 1 scol L 0 0 0 1 scol 1652 198 M (1)S -0.602 0 0.199 1 scol N 1622 184 M 1632 203 I 1622 221 I 1612 203 I 1622 184 I C -: 1 1 1 1 scol O ; K -N 1622 223 M 1622 263 I K -N 1654 245 11 28 rp C -1 1 1 1 scol L 0 0 0 1 scol 1654 268 M (*)S -N 1652 175 14 29 rp C -1 1 1 1 scol L 0 0 0 1 scol 1652 198 M (1)S -N 1654 245 11 28 rp C -1 1 1 1 scol L 0 0 0 1 scol 1654 268 M (*)S -0.602 0 0.199 1 scol N 1494 655 M 1494 591 I K -N 1123 655 M 1828 655 I K -N 1494 591 M 1509 632 I 1479 632 I C -: 1 1 1 1 scol O ; K -N 1123 713 M 1123 655 I K -: N 1743 506 219 84 rp C -1 1 0.801 1 scol L ; N 1962 505 M 1742 505 I 1742 590 I 1962 590 I C -K -0 0 0 1 scol 1769 537 M (ConstantString)[18 14 14 13 7 14 14 7 17 7 8 6 14 0]xS -0.602 0 0.199 1 scol N 1962 551 M 1742 551 I 1742 590 I 1962 590 I C -K -N 1962 565 M 1742 565 I 1742 590 I 1962 590 I C -K -: N 822 506 219 84 rp C -1 1 0.801 1 scol L ; N 1041 505 M 821 505 I 821 590 I 1041 590 I C -K -0 0 0 1 scol 849 537 M (ConstantClass)[18 14 14 13 7 14 14 7 18 6 14 13 0]xS -0.602 0 0.199 1 scol N 1041 551 M 821 551 I 821 590 I 1041 590 I C -K -N 1041 565 M 821 565 I 821 590 I 1041 590 I C -K -: N 1236 254 224 84 rp C -1 1 0.801 1 scol L ; N 1460 253 M 1235 253 I 1235 338 I 1460 338 I C -K -0 0 0 1 scol 1259 285 M (ConstantInteger)[18 14 14 13 7 14 14 7 6 14 7 14 14 14 0]xS -0.602 0 0.199 1 scol N 1460 299 M 1235 299 I 1235 338 I 1460 338 I C -K -N 1460 312 M 1235 312 I 1235 338 I 1460 338 I C -K -: N 958 254 232 84 rp C -1 1 0.801 1 scol L ; N 1190 253 M 957 253 I 957 338 I 1190 338 I C -K -0 0 0 1 scol 984 285 M (ConstantDouble)[18 14 14 13 7 14 14 7 18 14 14 14 6 0]xS -0.602 0 0.199 1 scol N 1190 299 M 957 299 I 957 338 I 1190 338 I C -K -N 1190 312 M 957 312 I 957 338 I 1190 338 I C -K -: N 1102 506 207 84 rp C -1 1 0.801 1 scol L ; N 1309 505 M 1101 505 I 1101 590 I 1309 590 I C -K -0 0 0 1 scol 1127 537 M (ConstantFloat)[18 14 14 13 7 14 14 7 15 6 14 14 0]xS -0.602 0 0.199 1 scol N 1309 551 M 1101 551 I 1101 590 I 1309 590 I C -K -N 1309 565 M 1101 565 I 1101 590 I 1309 590 I C -K -: N 708 254 206 84 rp C -1 1 0.801 1 scol L ; N 914 253 M 707 253 I 707 338 I 914 338 I C -K -0 0 0 1 scol 732 285 M (ConstantLong)[18 14 14 13 7 14 14 7 14 14 14 0]xS -0.602 0 0.199 1 scol N 914 299 M 707 299 I 707 338 I 914 338 I C -K -N 914 312 M 707 312 I 707 338 I 914 338 I C -K -: N 2025 506 246 84 rp C -1 1 0.801 1 scol L ; N 2271 505 M 2024 505 I 2024 590 I 2271 590 I C -K -0 0 0 1 scol 2051 537 M (ConstantUnicode)[18 14 14 13 7 14 14 7 18 14 6 13 14 14 0]xS -0.602 0 0.199 1 scol N 2271 545 M 2024 545 I 2024 590 I 2271 590 I C -K -N 2271 558 M 2024 558 I 2024 590 I 2271 590 I C -K -: N 1790 254 322 84 rp C -1 1 0.801 1 scol L ; N 2112 253 M 1789 253 I 1789 338 I 2112 338 I C -K -0 0 0 1 scol 1817 285 M (ConstantNameAndType)[18 14 14 13 7 14 14 7 18 14 22 14 17 14 14 14 12 14 0]xS -0.602 0 0.199 1 scol N 2112 299 M 1789 299 I 1789 338 I 2112 338 I C -K -N 2112 312 M 1789 312 I 1789 338 I 2112 338 I C -K -: N 2172 254 194 84 rp C -1 1 0.801 1 scol L ; N 2366 253 M 2171 253 I 2171 338 I 2366 338 I C -K -0 0 0 1 scol 2195 285 M (ConstantUtf8)[18 14 14 13 7 14 14 7 18 7 7 0]xS -0.602 0 0.199 1 scol N 2366 293 M 2171 293 I 2171 338 I 2366 338 I C -K -N 2366 306 M 2171 306 I 2171 338 I 2366 338 I C -K -N 1626 428 M 1626 350 I K -N 809 428 M 2269 428 I K -N 1626 350 M 1641 391 I 1611 391 I C -: 1 1 1 1 scol O ; K -N 933 505 M 933 428 I K -N 1848 505 M 1848 428 I K -N 1068 339 M 1068 428 I K -N 2146 505 M 2146 428 I K -N 809 339 M 809 428 I K -N 2269 339 M 2269 428 I K -N 1500 505 M 1500 428 I K -N 1336 339 M 1336 428 I K -N 1201 505 M 1201 428 I K -N 1926 339 M 1926 428 I K -N 1468 713 M 1468 655 I K -N 1828 713 M 1828 655 I K -LH -%%PageTrailer - -%%Trailer -%%DocumentNeededResources: -%%+ font Helvetica -%%DocumentSuppliedResources: -Pscript_WinNT_Incr dup /terminate get exec -%%EOF -grestore diff --git a/docs/eps/il.eps b/docs/eps/il.eps deleted file mode 100644 index f2ab8d92..00000000 --- a/docs/eps/il.eps +++ /dev/null @@ -1,513 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: il.eps -%%Creator: fig2dev Version 3.2 Patchlevel 1 -%%CreationDate: Wed Dec 2 15:26:46 1998 -%%For: dahm@che (Markus Dahm,,,,,) -%%Orientation: Portrait -%%BoundingBox: 0 0 583 386 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def - -end -save --84.0 526.0 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def -%%EndProlog - -$F2psBegin -10 setmiterlimit -n -1000 9337 m -1000 -1000 l 11587 -1000 l 11587 9337 l cp clip - 0.06299 0.06299 sc -% Polyline -7.500 slw - [60] 0 sd -gs clippath -5205 7530 m 5175 7650 l 5145 7530 l 5145 7665 l 5205 7665 l cp -clip -n 5175 6975 m 5175 7650 l gs col0 s gr gr - [] 0 sd -% arrowhead -n 5205 7530 m 5175 7650 l 5145 7530 l col0 s -% Polyline - [60] 0 sd -gs clippath -5595 7095 m 5625 6975 l 5655 7095 l 5655 6960 l 5595 6960 l cp -clip -n 5625 7650 m 5625 6975 l gs col0 s gr gr - [] 0 sd -% arrowhead -n 5595 7095 m 5625 6975 l 5655 7095 l col0 s -% Polyline - [60] 0 sd -gs clippath -5205 3930 m 5175 4050 l 5145 3930 l 5145 4065 l 5205 4065 l cp -clip -n 5175 3375 m 5175 4050 l gs col0 s gr gr - [] 0 sd -% arrowhead -n 5205 3930 m 5175 4050 l 5145 3930 l col0 s -% Polyline - [60] 0 sd -gs clippath -5595 3495 m 5625 3375 l 5655 3495 l 5655 3360 l 5595 3360 l cp -clip -n 5625 4050 m 5625 3375 l gs col0 s gr gr - [] 0 sd -% arrowhead -n 5595 3495 m 5625 3375 l 5655 3495 l col0 s -% Polyline -n 4380 6750 m 4275 6750 4275 6870 105 arcto 4 {pop} repeat - 4275 6975 6420 6975 105 arcto 4 {pop} repeat - 6525 6975 6525 6855 105 arcto 4 {pop} repeat - 6525 6750 4380 6750 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 6930 m -gs 1 -1 sc (goto) col0 sh gr -% Polyline -n 4380 6300 m 4275 6300 4275 6420 105 arcto 4 {pop} repeat - 4275 6525 6420 6525 105 arcto 4 {pop} repeat - 6525 6525 6525 6405 105 arcto 4 {pop} repeat - 6525 6300 4380 6300 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4455 6480 m -gs 1 -1 sc (invokevirtual) col0 sh gr -% Polyline -n 4380 5850 m 4275 5850 4275 5970 105 arcto 4 {pop} repeat - 4275 6075 6420 6075 105 arcto 4 {pop} repeat - 6525 6075 6525 5955 105 arcto 4 {pop} repeat - 6525 5850 4380 5850 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 6030 m -gs 1 -1 sc (aload) col0 sh gr -% Polyline -n 4380 5400 m 4275 5400 4275 5520 105 arcto 4 {pop} repeat - 4275 5625 6420 5625 105 arcto 4 {pop} repeat - 6525 5625 6525 5505 105 arcto 4 {pop} repeat - 6525 5400 4380 5400 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 5580 m -gs 1 -1 sc (getstatic) col0 sh gr -% Polyline -n 4380 4950 m 4275 4950 4275 5070 105 arcto 4 {pop} repeat - 4275 5175 6420 5175 105 arcto 4 {pop} repeat - 6525 5175 6525 5055 105 arcto 4 {pop} repeat - 6525 4950 4380 4950 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 5130 m -gs 1 -1 sc (astore) col0 sh gr -% Polyline -n 4380 4500 m 4275 4500 4275 4620 105 arcto 4 {pop} repeat - 4275 4725 6420 4725 105 arcto 4 {pop} repeat - 6525 4725 6525 4605 105 arcto 4 {pop} repeat - 6525 4500 4380 4500 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 4680 m -gs 1 -1 sc (goto) col0 sh gr -% Polyline -n 4380 4050 m 4275 4050 4275 4170 105 arcto 4 {pop} repeat - 4275 4275 6420 4275 105 arcto 4 {pop} repeat - 6525 4275 6525 4155 105 arcto 4 {pop} repeat - 6525 4050 4380 4050 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4455 4230 m -gs 1 -1 sc (istore) col0 sh gr -% Polyline -gs clippath -5595 4395 m 5625 4275 l 5655 4395 l 5655 4260 l 5595 4260 l cp -clip -n 5625 4500 m 5625 4275 l gs col0 s gr gr - -% arrowhead -n 5595 4395 m 5625 4275 l 5655 4395 l col0 s -% Polyline -gs clippath -5205 4380 m 5175 4500 l 5145 4380 l 5145 4515 l 5205 4515 l cp -clip -n 5175 4275 m 5175 4500 l gs col0 s gr gr - -% arrowhead -n 5205 4380 m 5175 4500 l 5145 4380 l col0 s -% Polyline -gs clippath -5595 4845 m 5625 4725 l 5655 4845 l 5655 4710 l 5595 4710 l cp -clip -n 5625 4950 m 5625 4725 l gs col0 s gr gr - -% arrowhead -n 5595 4845 m 5625 4725 l 5655 4845 l col0 s -% Polyline -gs clippath -5205 4830 m 5175 4950 l 5145 4830 l 5145 4965 l 5205 4965 l cp -clip -n 5175 4725 m 5175 4950 l gs col0 s gr gr - -% arrowhead -n 5205 4830 m 5175 4950 l 5145 4830 l col0 s -% Polyline -gs clippath -5595 5295 m 5625 5175 l 5655 5295 l 5655 5160 l 5595 5160 l cp -clip -n 5625 5400 m 5625 5175 l gs col0 s gr gr - -% arrowhead -n 5595 5295 m 5625 5175 l 5655 5295 l col0 s -% Polyline -gs clippath -5205 5280 m 5175 5400 l 5145 5280 l 5145 5415 l 5205 5415 l cp -clip -n 5175 5175 m 5175 5400 l gs col0 s gr gr - -% arrowhead -n 5205 5280 m 5175 5400 l 5145 5280 l col0 s -% Polyline -gs clippath -5595 5745 m 5625 5625 l 5655 5745 l 5655 5610 l 5595 5610 l cp -clip -n 5625 5850 m 5625 5625 l gs col0 s gr gr - -% arrowhead -n 5595 5745 m 5625 5625 l 5655 5745 l col0 s -% Polyline -gs clippath -5205 5730 m 5175 5850 l 5145 5730 l 5145 5865 l 5205 5865 l cp -clip -n 5175 5625 m 5175 5850 l gs col0 s gr gr - -% arrowhead -n 5205 5730 m 5175 5850 l 5145 5730 l col0 s -% Polyline -gs clippath -5595 6195 m 5625 6075 l 5655 6195 l 5655 6060 l 5595 6060 l cp -clip -n 5625 6300 m 5625 6075 l gs col0 s gr gr - -% arrowhead -n 5595 6195 m 5625 6075 l 5655 6195 l col0 s -% Polyline -gs clippath -5205 6180 m 5175 6300 l 5145 6180 l 5145 6315 l 5205 6315 l cp -clip -n 5175 6075 m 5175 6300 l gs col0 s gr gr - -% arrowhead -n 5205 6180 m 5175 6300 l 5145 6180 l col0 s -% Polyline -gs clippath -5595 6645 m 5625 6525 l 5655 6645 l 5655 6510 l 5595 6510 l cp -clip -n 5625 6750 m 5625 6525 l gs col0 s gr gr - -% arrowhead -n 5595 6645 m 5625 6525 l 5655 6645 l col0 s -% Polyline -gs clippath -5205 6630 m 5175 6750 l 5145 6630 l 5145 6765 l 5205 6765 l cp -clip -n 5175 6525 m 5175 6750 l gs col0 s gr gr - -% arrowhead -n 5205 6630 m 5175 6750 l 5145 6630 l col0 s -% Polyline -n 4380 7650 m 4275 7650 4275 7770 105 arcto 4 {pop} repeat - 4275 7875 6420 7875 105 arcto 4 {pop} repeat - 6525 7875 6525 7755 105 arcto 4 {pop} repeat - 6525 7650 4380 7650 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4455 7830 m -gs 1 -1 sc (iload) col0 sh gr -% Polyline -n 4380 8100 m 4275 8100 4275 8220 105 arcto 4 {pop} repeat - 4275 8325 6420 8325 105 arcto 4 {pop} repeat - 6525 8325 6525 8205 105 arcto 4 {pop} repeat - 6525 8100 4380 8100 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4455 8280 m -gs 1 -1 sc (ireturn) col0 sh gr -% Polyline -gs clippath -5595 7995 m 5625 7875 l 5655 7995 l 5655 7860 l 5595 7860 l cp -clip -n 5625 8100 m 5625 7875 l gs col0 s gr gr - -% arrowhead -n 5595 7995 m 5625 7875 l 5655 7995 l col0 s -% Polyline -gs clippath -5205 7980 m 5175 8100 l 5145 7980 l 5145 8115 l 5205 8115 l cp -clip -n 5175 7875 m 5175 8100 l gs col0 s gr gr - -% arrowhead -n 5205 7980 m 5175 8100 l 5145 7980 l col0 s -% Polyline -gs clippath -5595 2595 m 5625 2475 l 5655 2595 l 5655 2460 l 5595 2460 l cp -clip -n 5625 2700 m 5625 2475 l gs col0 s gr gr - -% arrowhead -n 5595 2595 m 5625 2475 l 5655 2595 l col0 s -% Polyline -gs clippath -5205 2580 m 5175 2700 l 5145 2580 l 5145 2715 l 5205 2715 l cp -clip -n 5175 2475 m 5175 2700 l gs col0 s gr gr - -% arrowhead -n 5205 2580 m 5175 2700 l 5145 2580 l col0 s -% Polyline -n 4380 3150 m 4275 3150 4275 3270 105 arcto 4 {pop} repeat - 4275 3375 6420 3375 105 arcto 4 {pop} repeat - 6525 3375 6525 3255 105 arcto 4 {pop} repeat - 6525 3150 4380 3150 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 3330 m -gs 1 -1 sc (getstatic) col0 sh gr -% Polyline -n 4380 2700 m 4275 2700 4275 2820 105 arcto 4 {pop} repeat - 4275 2925 6420 2925 105 arcto 4 {pop} repeat - 6525 2925 6525 2805 105 arcto 4 {pop} repeat - 6525 2700 4380 2700 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4455 2880 m -gs 1 -1 sc (istore) col0 sh gr -% Polyline -n 4380 2250 m 4275 2250 4275 2370 105 arcto 4 {pop} repeat - 4275 2475 6420 2475 105 arcto 4 {pop} repeat - 6525 2475 6525 2355 105 arcto 4 {pop} repeat - 6525 2250 4380 2250 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 2430 m -gs 1 -1 sc (sipush) col0 sh gr -% Polyline -gs clippath -5595 3045 m 5625 2925 l 5655 3045 l 5655 2910 l 5595 2910 l cp -clip -n 5625 3150 m 5625 2925 l gs col0 s gr gr - -% arrowhead -n 5595 3045 m 5625 2925 l 5655 3045 l col0 s -% Polyline -gs clippath -5205 3030 m 5175 3150 l 5145 3030 l 5145 3165 l 5205 3165 l cp -clip -n 5175 2925 m 5175 3150 l gs col0 s gr gr - -% arrowhead -n 5205 3030 m 5175 3150 l 5145 3030 l col0 s -% Polyline -n 1350 5175 m 3600 5175 l 3600 5625 l 1350 5625 l cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -1575 5400 m -gs 1 -1 sc (IOException e1) col0 sh gr -% Polyline -n 1575 5175 m 1575 4950 l 3825 4950 l 3825 5400 l 3600 5400 l 3600 5175 l - 1575 5175 l cp gs 0.00 setgray ef gr gs col0 s gr -% Polyline -n 1350 3600 m 3600 3600 l 3600 4050 l 1350 4050 l cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -1575 3825 m -gs 1 -1 sc (int n) col0 sh gr -% Polyline -n 1575 3600 m 1575 3375 l 3825 3375 l 3825 3825 l 3600 3825 l 3600 3600 l - 1575 3600 l cp gs 0.00 setgray ef gr gs col0 s gr -% Polyline -n 7200 4050 m 10350 4050 l 10350 4500 l 7200 4500 l cp gs col0 s gr -% Polyline -n 7425 4050 m 7425 3825 l 10575 3825 l 10575 4275 l 10350 4275 l 10350 4050 l - 8325 4050 l gs 0.00 setgray ef gr gs col0 s gr -/Courier-Bold ff 210.00 scf sf -7425 4275 m -gs 1 -1 sc (Exception handler 1) col0 sh gr -% Polyline -gs clippath -4152 5071 m 4275 5085 l 4160 5131 l 4294 5113 l 4286 5053 l cp -clip -n 3600 5175 m 4275 5085 l gs col0 s gr gr - -% arrowhead -n 4152 5071 m 4275 5085 l 4160 5131 l 4156 5101 l 4152 5071 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -4190 2475 m 4275 2385 l 4243 2504 l 4309 2386 l 4256 2357 l cp -clip -n 3600 3600 m 4275 2385 l gs col0 s gr gr - -% arrowhead -n 4190 2475 m 4275 2385 l 4243 2504 l 4217 2490 l 4190 2475 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -4221 6324 m 4275 6435 l 4175 6362 l 4262 6466 l 4308 6427 l cp -clip -n 3600 5625 m 4275 6435 l gs col0 s gr gr - -% arrowhead -n 4221 6324 m 4275 6435 l 4175 6362 l 4198 6343 l 4221 6324 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6635 5029 m 6525 5085 l 6596 4984 l 6494 5072 l 6533 5117 l cp -clip -n 7200 4500 m 6525 5085 l gs col0 s gr gr - -% arrowhead -n 6635 5029 m 6525 5085 l 6596 4984 l 6616 5006 l 6635 5029 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6645 4215 m 6525 4185 l 6645 4155 l 6510 4155 l 6510 4215 l cp -clip -n 7200 4185 m 6525 4185 l gs col0 s gr gr - -% arrowhead -n 6645 4215 m 6525 4185 l 6645 4155 l 6645 4185 l 6645 4215 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6582 3395 m 6525 3285 l 6627 3355 l 6538 3254 l 6493 3294 l cp -clip -n 7200 4050 m 6525 3285 l gs col0 s gr gr - -% arrowhead -n 6582 3395 m 6525 3285 l 6627 3355 l 6604 3375 l 6582 3395 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -4329 7977 m 4320 8100 l 4269 7987 l 4293 8120 l 4352 8110 l cp -clip -n 3600 4050 m 4320 8100 l gs col0 s gr gr - -% arrowhead -n 4329 7977 m 4320 8100 l 4269 7987 l 4299 7982 l 4329 7977 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6649 7784 m 6525 7785 l 6633 7726 l 6503 7760 l 6518 7818 l cp -clip -n 6525 4635 m 6527 4636 l 6532 4640 l 6542 4646 l 6556 4655 l 6575 4667 l - 6600 4683 l 6628 4702 l 6661 4723 l 6695 4746 l 6731 4771 l - 6768 4796 l 6804 4821 l 6838 4845 l 6871 4869 l 6902 4892 l - 6931 4915 l 6958 4936 l 6983 4957 l 7005 4977 l 7026 4996 l - 7045 5015 l 7063 5034 l 7080 5054 l 7095 5073 l 7110 5093 l - 7124 5113 l 7137 5133 l 7150 5154 l 7162 5176 l 7174 5199 l - 7185 5223 l 7196 5247 l 7207 5273 l 7216 5299 l 7226 5326 l - 7235 5353 l 7243 5381 l 7251 5409 l 7258 5438 l 7265 5467 l - 7271 5496 l 7276 5525 l 7281 5554 l 7286 5582 l 7290 5611 l - 7293 5639 l 7296 5667 l 7299 5694 l 7301 5721 l 7303 5748 l - 7305 5775 l 7306 5802 l 7308 5829 l 7309 5857 l 7310 5885 l - 7310 5914 l 7311 5944 l 7311 5974 l 7311 6004 l 7311 6035 l - 7310 6067 l 7310 6099 l 7309 6131 l 7308 6163 l 7307 6195 l - 7306 6227 l 7305 6258 l 7304 6289 l 7302 6320 l 7301 6350 l - 7299 6379 l 7298 6407 l 7296 6435 l 7295 6462 l 7293 6489 l - 7292 6514 l 7290 6540 l 7288 6567 l 7287 6595 l 7285 6622 l - 7283 6650 l 7281 6677 l 7279 6706 l 7277 6734 l 7275 6762 l - 7273 6791 l 7270 6820 l 7268 6848 l 7265 6877 l 7263 6905 l - 7260 6932 l 7257 6959 l 7255 6986 l 7252 7011 l 7249 7036 l - 7246 7060 l 7243 7084 l 7240 7106 l 7237 7128 l 7233 7149 l - 7230 7170 l 7226 7195 l 7221 7219 l 7216 7243 l 7211 7268 l - 7205 7292 l 7198 7317 l 7191 7342 l 7183 7366 l 7174 7390 l - 7165 7414 l 7155 7436 l 7144 7459 l 7133 7480 l 7121 7500 l - 7108 7519 l 7095 7537 l 7081 7553 l 7066 7569 l 7051 7584 l - 7035 7598 l 7020 7609 l 7003 7621 l 6985 7632 l 6966 7642 l - 6945 7653 l 6921 7663 l 6895 7674 l 6867 7684 l 6836 7695 l - 6803 7706 l 6767 7717 l 6730 7728 l 6693 7739 l 6656 7750 l - 6622 7759 l 6592 7767 l 6567 7774 l 6525 7785 l gs col0 s gr gr - -% arrowhead -n 6649 7784 m 6525 7785 l 6633 7726 l 6641 7755 l 6649 7784 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6619 7615 m 6525 7695 l 6570 7580 l 6492 7690 l 6541 7725 l cp -clip -n 6525 6840 m 6526 6843 l 6529 6850 l 6533 6863 l 6540 6882 l 6549 6908 l - 6560 6938 l 6572 6973 l 6585 7010 l 6598 7048 l 6610 7086 l - 6622 7122 l 6632 7157 l 6642 7189 l 6650 7219 l 6657 7246 l - 6663 7271 l 6667 7294 l 6671 7315 l 6673 7335 l 6675 7354 l - 6675 7373 l 6674 7394 l 6672 7415 l 6669 7435 l 6663 7455 l - 6656 7476 l 6648 7498 l 6637 7520 l 6624 7544 l 6610 7568 l - 6595 7593 l 6579 7617 l 6564 7640 l 6550 7660 l 6525 7695 l gs col0 s gr gr - -% arrowhead -n 6619 7615 m 6525 7695 l 6570 7580 l 6595 7597 l 6619 7615 l cp gs 0.00 setgray ef gr col0 s -$F2psEnd -rs diff --git a/docs/eps/instructions.eps b/docs/eps/instructions.eps deleted file mode 100644 index 2ed46dc5..00000000 --- a/docs/eps/instructions.eps +++ /dev/null @@ -1,445 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Title: Rose Diagram(s) -%%Creator: AdobePS5.dll Version 5.0 -%%CreationDate: 7/7/1999 17:43:39 -%%Pages: 1 -%%Orientation: Portrait -%%PageOrder: Ascend -%%DocumentNeededResources: (atend) -%%DocumentSuppliedResources: (atend) -%%DocumentData: Clean7Bit -%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 -%%LanguageLevel: 2 -%%BoundingBox: 13 12 410 830 -%%EndComments -%%BeginProcSet: epsffit 1 0 -gsave -1409.418 -167.686 translate -90 rotate -1.711 1.711 scale -%%EndProcSet - - -%%BeginDefaults -%%PageBoundingBox: 13 12 582 830 -%%EndDefaults - -%%BeginProlog -%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 -/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false -setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype -ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch -def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 -rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def -/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def -typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 -def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp -exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def -/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype -{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} -readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop -(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def -/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) -tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup -xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint -tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck -{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) -tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup -rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} -forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier -/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin -$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 -ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto -(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt -$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} -repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print -(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup -0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop -/setpacking where{pop oldpack setpacking}if}if -%%EndResource -userdict /Pscript_WinNT_Incr 230 dict dup begin put -%%BeginResource: file Pscript_FatalError 5.0 0 -/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div -cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def -%%EndResource -/VM?{vmstatus exch sub exch pop gt{[ -(This job requires more memory than is available in this printer.)100 500 -(Try one or more of the following, and then print again:)100 485 -(For the output format, choose Optimize For Portability.)115 470 -(In the Device Settings page, make sure the Available PostScript Memory is accurate.) -115 455(Reduce the number of fonts in the document.)115 440 -(Print the document in parts.)115 425 12/Times-Roman showpage -(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def -%%BeginResource: file Pscript_Win_Basic 5.0 0 -/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ -/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- -/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , -d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C -/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M -/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d -/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage -, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false -/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d -/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, -d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx -matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit -/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} -b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U -/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d -reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d -/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 -sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} -b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b -/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b -/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} -b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b -%%EndResource -%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 -/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge -{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ -snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F -setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d -/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b -%%EndResource -end -%%EndProlog - -%%BeginSetup -[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec -1 setlinecap 1 setlinejoin -/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def -%%EndSetup - -%%Page: 1 1 -%%PageBoundingBox: 13 12 582 830 -%%EndPageComments -%%BeginPageSetup -/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh -%%EndPageSetup - -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Win_GdiObject 5.0 0 -/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore -{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d -/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps -L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType -1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d -/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal -{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep -gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b -/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M -MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep -M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 -+}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d -/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix -GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 -/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal -makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 -/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d -/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] -d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 -0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne -{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd -aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx -PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save -8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 -Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx -matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` -xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill -{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot -concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap -YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 --0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix -currentmatrix readonly d ; ;}if}b -%%EndResource -%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 -/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} -{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 -d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d -20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d -/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ -/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict -~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} -? ;}b -%%EndResource -end reinitialize -: N 1432 65 209 154 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 1641 64 M 1431 64 I 1431 219 I 1641 219 I C -K -0 0 0 1 scol Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Text 5.0 0 -/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d -/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ -length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets -{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& -/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} -if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ -{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get -StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ -{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ -length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ -put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M -currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d -/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N -/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix -astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get -length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d -/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS -{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 -copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for -& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ -4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 -add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for -/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 -Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName -length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length -string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ -putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 -$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? -{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName -get undefinefont}forall undefinefont}b -%%EndResource -end reinitialize -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Encoding256 5.0 0 -/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction -/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign -/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma -/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S -/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave -/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright -/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis -/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef -/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet -/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef -/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section -/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered -/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph -/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter -/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis -/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute -/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls -/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute -/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve -/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex -/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put -%%EndResource -end reinitialize - -%%IncludeResource: font Helvetica -F /F0 0 /256 T /Helvetica mF -/F0S21 F0 [33.09 0 0 -33.09 0 0 ] mFS -F0S21 Ji -1461 104 M (Instruction)[9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 1641 117 M 1431 117 I 1431 219 I 1641 219 I C -K -N 1641 212 M 1431 212 I 1431 219 I 1641 219 I C -K -0 0 0 1 scol 1478 153 M (tag)[9 17 0]xS -1478 191 M (length)[7 17 18 18 9 0]xS -: N 575 326 321 98 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 896 325 M 574 325 I 574 424 I 896 424 I C -K -0 0 0 1 scol 609 365 M (BranchInstruction)[22 11 17 18 17 18 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 896 378 M 574 378 I 574 424 I 896 424 I C -K -N 896 396 M 574 396 I 574 424 I 896 424 I C -K -: N 822 556 164 154 rp C -1 1 0.801 1 scol L ; N 986 555 M 821 555 I 821 710 I 986 710 I C -K -0 0 0 1 scol 859 595 M (Select)[22 17 7 17 17 0]xS -0.602 0 0.199 1 scol N 986 608 M 821 608 I 821 710 I 986 710 I C -K -N 986 702 M 821 702 I 821 710 I 986 710 I C -K -0 0 0 1 scol 868 644 M (targets)[9 17 11 18 17 9 0]xS -868 682 M (keys)[16 17 15 0]xS -: N 584 815 303 100 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 887 814 M 583 814 I 583 915 I 887 915 I C -K -0 0 0 1 scol 599 855 M (LOOKUPSWITCH)[18 26 26 22 24 22 22 34 9 21 24 0]xS -0.602 0 0.199 1 scol N 887 868 M 583 868 I 583 915 I 887 915 I C -K -N 887 886 M 583 886 I 583 915 I 887 915 I C -K -: N 964 815 267 100 rp C -1 1 0.801 1 scol L ; N 1231 814 M 963 814 I 963 915 I 1231 915 I C -K -0 0 0 1 scol 978 855 M (TABLESWITCH)[21 22 22 18 22 22 34 9 21 24 0]xS -0.602 0 0.199 1 scol N 1231 868 M 963 868 I 963 915 I 1231 915 I C -K -N 1231 886 M 963 886 I 963 915 I 1231 915 I C -K -: N 567 557 208 100 rp C -1 1 0.801 1 scol L ; N 775 556 M 566 556 I 566 657 I 775 657 I C -K -0 0 0 1 scol 587 597 M (IfInstruction)[9 10 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 775 609 M 566 609 I 566 657 I 775 657 I C -K -N 775 628 M 566 628 I 566 657 I 775 657 I C -K -: N 393 557 143 100 rp C -1 1 0.801 1 scol L ; N 536 556 M 392 556 I 392 657 I 536 657 I C -K -0 0 0 1 scol 415 597 M (GOTO)[26 26 21 0]xS -0.602 0 0.199 1 scol N 536 609 M 392 609 I 392 657 I 536 657 I C -K -N 536 628 M 392 628 I 392 657 I 536 657 I C -K -N 730 499 M 730 425 I K -N 469 499 M 910 499 I K -N 730 425 M 748 473 I 712 473 I C -: 1 1 1 1 scol O ; K -N 469 556 M 469 499 I K -: N 1843 118 290 100 rp C -1 1 0.801 1 scol L ; N 2133 117 M 1842 117 I 1842 218 I 2133 218 I C -K -0 0 0 1 scol 1865 158 M (ReturnInstruction)[24 17 9 18 11 18 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 2133 168 M 1842 168 I 1842 218 I 2133 218 I C -K -N 2133 186 M 1842 186 I 1842 218 I 2133 218 I C -K -: N 1004 325 264 99 rp C -1 1 0.801 1 scol L ; N 1268 324 M 1003 324 I 1003 424 I 1268 424 I C -K -0 0 0 1 scol 1023 364 M (ArrayInstruction)[22 11 11 17 15 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 1268 377 M 1003 377 I 1003 424 I 1268 424 I C -K -N 1268 396 M 1003 396 I 1003 424 I 1268 424 I C -K -: N 1704 332 232 188 rp C -1 1 0.801 1 scol L ; N 1936 331 M 1703 331 I 1703 520 I 1936 520 I C -K -0 0 0 1 scol 1722 372 M (CPInstruction)[24 22 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 1936 382 M 1703 382 I 1703 520 I 1936 520 I C -K -N 1936 438 M 1703 438 I 1703 520 I 1936 520 I C -K -0 0 0 1 scol 1751 418 M (index)[7 18 18 17 0]xS -1751 494 M (getType\(\))[18 17 9 21 15 18 17 11 0]xS -: N 1038 118 274 100 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1312 117 M 1037 117 I 1037 218 I 1312 218 I C -K -0 0 0 1 scol 1059 158 M (StackInstruction)[22 9 17 17 16 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 1312 170 M 1037 170 I 1037 218 I 1312 218 I C -K -N 1312 189 M 1037 189 I 1037 218 I 1312 218 I C -K -: N 1312 325 345 99 rp C -1 1 0.801 1 scol L ; N 1657 324 M 1311 324 I 1311 424 I 1657 424 I C -K -0 0 0 1 scol 1329 364 M (ConversionInstruction)[24 17 18 15 17 11 17 7 17 18 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 1657 377 M 1311 377 I 1311 424 I 1657 424 I C -K -N 1657 396 M 1311 396 I 1311 424 I 1657 424 I C -K -N 675 556 M 675 499 I K -: N 619 118 337 100 rp C -1 1 0.801 1 scol L ; N 956 117 M 618 117 I 618 218 I 956 218 I C -K -0 0 0 1 scol 641 158 M (ArithmeticInstruction)[22 11 7 9 18 27 17 9 7 17 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 956 170 M 618 170 I 618 218 I 956 218 I C -K -N 956 189 M 618 189 I 618 218 I 956 218 I C -K -: N 1974 326 390 148 rp C -1 1 0.801 1 scol L ; N 2364 325 M 1973 325 I 1973 474 I 2364 474 I C -K -0 0 0 1 scol 1998 366 M (LocalVariableInstruction)[18 17 17 17 7 22 17 11 7 17 18 7 17 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 2364 376 M 1973 376 I 1973 474 I 2364 474 I C -K -N 2364 433 M 1973 433 I 1973 474 I 2364 474 I C -K -0 0 0 1 scol 2020 412 M (index)[7 18 18 17 0]xS -: N 1392 869 263 148 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1655 868 M 1391 868 I 1391 1017 I 1655 1017 I C -K -0 0 0 1 scol 1414 908 M (FieldInstruction)[20 7 17 7 18 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 1655 921 M 1391 921 I 1391 1017 I 1655 1017 I C -K -N 1655 940 M 1391 940 I 1391 1017 I 1655 1017 I C -K -0 0 0 1 scol 1439 995 M (getFieldType\(\))[18 17 9 20 7 17 7 18 21 15 18 17 11 0]xS -: N 1735 869 351 148 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2086 868 M 1734 868 I 1734 1017 I 2086 1017 I C -K -0 0 0 1 scol 1790 908 M (InvokeInstruction)[9 18 15 17 16 17 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 2086 919 M 1734 919 I 1734 1017 I 2086 1017 I C -K -N 2086 937 M 1734 937 I 1734 1017 I 2086 1017 I C -K -0 0 0 1 scol 1781 992 M (getArgumentTypes\(\))[18 17 9 22 11 18 18 27 17 18 9 21 15 18 17 17 11 0]xS -0.602 0 0.199 1 scol N 1539 293 M 1539 220 I K -N 703 293 M 2171 293 I K -N 1539 220 M 1557 269 I 1522 269 I C -: 1 1 1 1 scol O ; K -N 2171 325 M 2171 293 I K -N 1826 331 M 1826 293 I K -N 898 784 M 898 711 I K -N 737 784 M 1069 784 I K -N 898 711 M 916 760 I 880 760 I C -: 1 1 1 1 scol O ; K -N 737 814 M 737 784 I K -N 1116 324 M 1116 293 I K -N 792 219 M 792 293 I K -N 1487 324 M 1487 293 I K -N 1984 219 M 1984 293 I K -N 1166 219 M 1166 293 I K -: N 1554 623 248 148 rp C -1 1 0.801 1 scol L ; N 1802 622 M 1553 622 I 1553 771 I 1802 771 I C -K -0 0 0 1 scol 1572 663 M (FieldOrMethod)[20 7 17 7 18 26 11 27 17 9 18 17 0]xS -0.602 0 0.199 1 scol N 1802 676 M 1553 676 I 1553 771 I 1802 771 I C -K -N 1802 694 M 1553 694 I 1553 771 I 1802 771 I C -K -0 0 0 1 scol 1601 749 M (getName\(\))[18 17 9 24 17 27 17 11 0]xS -: N 2179 635 186 99 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2365 634 M 2178 634 I 2178 734 I 2365 734 I C -K -0 0 0 1 scol 2232 674 M (NEW)[24 22 0]xS -0.602 0 0.199 1 scol N 2365 684 M 2178 684 I 2178 734 I 2365 734 I C -K -N 2365 703 M 2178 703 I 2178 734 I 2365 734 I C -K -N 703 325 M 703 293 I K -N 1820 594 M 1820 521 I K -N 1657 594 M 2249 594 I K -N 1820 521 M 1838 570 I 1802 570 I C -: 1 1 1 1 scol O ; K -: N 1889 635 250 99 rp C -1 1 0.801 1 scol L ; N 2139 634 M 1888 634 I 1888 734 I 2139 734 I C -K -0 0 0 1 scol 1907 674 M (INSTANCEOF)[9 24 22 21 22 24 24 22 26 0]xS -0.602 0 0.199 1 scol N 2139 684 M 1888 684 I 1888 734 I 2139 734 I C -K -N 2139 703 M 1888 703 I 1888 734 I 2139 734 I C -K -N 2014 634 M 2014 594 I K -N 2249 634 M 2249 594 I K -N 1657 622 M 1657 594 I K -N 1069 814 M 1069 784 I K -N 1677 845 M 1677 772 I K -N 1511 845 M 1907 845 I K -N 1677 772 M 1695 821 I 1660 821 I C -: 1 1 1 1 scol O ; K -N 1907 868 M 1907 845 I K -N 1511 868 M 1511 845 I K -N 910 555 M 910 499 I K -LH -%%PageTrailer - -%%Trailer -%%DocumentNeededResources: -%%+ font Helvetica -%%DocumentSuppliedResources: -Pscript_WinNT_Incr dup /terminate get exec -%%EOF -grestore diff --git a/docs/eps/javaclass.eps b/docs/eps/javaclass.eps deleted file mode 100644 index cbfa8924..00000000 --- a/docs/eps/javaclass.eps +++ /dev/null @@ -1,525 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%Title: Rose Diagram(s) -%%Creator: AdobePS5.dll Version 5.0 -%%CreationDate: 7/7/1999 17:45:7 -%%Pages: 1 -%%Orientation: Portrait -%%PageOrder: Ascend -%%DocumentNeededResources: (atend) -%%DocumentSuppliedResources: (atend) -%%DocumentData: Clean7Bit -%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 -%%LanguageLevel: 2 -%%BoundingBox: 13 12 471 830 -%%EndComments -%%BeginProcSet: epsffit 1 0 -gsave -1233.763 -187.599 translate -90 rotate -1.782 1.782 scale -%%EndProcSet - - -%%BeginDefaults -%%PageBoundingBox: 13 12 582 830 -%%EndDefaults - -%%BeginProlog -%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 -/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false -setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype -ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch -def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 -rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def -/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def -typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 -def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp -exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def -/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype -{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} -readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop -(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def -/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) -tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup -xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint -tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck -{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) -tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup -rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} -forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier -/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin -$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 -ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto -(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt -$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} -repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print -(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup -0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop -/setpacking where{pop oldpack setpacking}if}if -%%EndResource -userdict /Pscript_WinNT_Incr 230 dict dup begin put -%%BeginResource: file Pscript_FatalError 5.0 0 -/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div -cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def -%%EndResource -/VM?{vmstatus exch sub exch pop gt{[ -(This job requires more memory than is available in this printer.)100 500 -(Try one or more of the following, and then print again:)100 485 -(For the output format, choose Optimize For Portability.)115 470 -(In the Device Settings page, make sure the Available PostScript Memory is accurate.) -115 455(Reduce the number of fonts in the document.)115 440 -(Print the document in parts.)115 425 12/Times-Roman showpage -(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def -%%BeginResource: file Pscript_Win_Basic 5.0 0 -/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ -/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- -/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , -d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C -/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M -/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d -/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage -, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false -/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d -/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, -d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx -matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit -/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} -b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U -/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d -reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d -/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 -sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} -b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b -/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b -/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} -b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b -%%EndResource -%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 -/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge -{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ -snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F -setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d -/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b -%%EndResource -end -%%EndProlog - -%%BeginSetup -[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec -1 setlinecap 1 setlinejoin -/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def -%%EndSetup - -%%Page: 1 1 -%%PageBoundingBox: 13 12 582 830 -%%EndPageComments -%%BeginPageSetup -/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh -%%EndPageSetup - -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Win_GdiObject 5.0 0 -/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore -{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d -/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps -L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType -1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d -/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal -{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep -gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b -/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M -MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep -M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 -+}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d -/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix -GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 -/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal -makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 -/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d -/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] -d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 -0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne -{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd -aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx -PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save -8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 -Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx -matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` -xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill -{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot -concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap -YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 --0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix -currentmatrix readonly d ; ;}if}b -%%EndResource -%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 -/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} -{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 -d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d -20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d -/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ -/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict -~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} -? ;}b -%%EndResource -end reinitialize -: N 712 1406 246 93 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 958 1405 M 711 1405 I 711 1499 I 958 1499 I C -K -0 0 0 1 scol Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Text 5.0 0 -/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d -/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ -length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets -{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& -/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} -if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ -{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get -StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ -{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ -length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ -put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M -currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d -/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N -/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix -astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get -length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d -/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS -{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 -copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for -& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ -4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 -add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for -/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 -Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName -length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length -string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ -putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 -$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? -{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName -get undefinefont}forall undefinefont}b -%%EndResource -end reinitialize -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Encoding256 5.0 0 -/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction -/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign -/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma -/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S -/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave -/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright -/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis -/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef -/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet -/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef -/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section -/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered -/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph -/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter -/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis -/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute -/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls -/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute -/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve -/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex -/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put -%%EndResource -end reinitialize - -%%IncludeResource: font Helvetica -F /F0 0 /256 T /Helvetica mF -/F0S1C F0 [28.75 0 0 -28.75 0 0 ] mFS -F0S1C Ji -735 1441 M (ExceptionTable)[19 13 15 16 16 8 7 16 16 19 16 16 7 0]xS -0.602 0 0.199 1 scol N 958 1456 M 711 1456 I 711 1499 I 958 1499 I C -K -N 958 1473 M 711 1473 I 711 1499 I 958 1499 I C -K -: N 1484 1418 275 93 rp C -1 1 0.801 1 scol L ; N 1759 1417 M 1483 1417 I 1483 1511 I 1759 1511 I C -K -0 0 0 1 scol 1505 1453 M (LineNumberTable)[16 7 16 16 21 16 25 16 16 10 19 16 16 7 0]xS -0.602 0 0.199 1 scol N 1759 1469 M 1483 1469 I 1483 1511 I 1759 1511 I C -K -N 1759 1485 M 1483 1485 I 1483 1511 I 1759 1511 I C -K -: N 1039 1411 318 253 rp C -1 1 0.801 1 scol L ; N 1357 1410 M 1038 1410 I 1038 1664 I 1357 1664 I C -K -0 0 0 1 scol 1163 1446 M (Code)[21 16 16 0]xS -0.602 0 0.199 1 scol N 1357 1462 M 1038 1462 I 1038 1664 I 1357 1664 I C -K -N 1357 1578 M 1038 1578 I 1038 1664 I 1357 1664 I C -K -0 0 0 1 scol 1083 1493 M (max_stack : int)[25 16 13 16 15 8 16 15 14 8 8 8 7 16 0]xS -1083 1527 M (max_locals : int)[25 16 13 16 7 16 15 16 7 15 8 8 8 7 16 0]xS -1083 1560 M (exception_handlers)[16 13 15 16 16 8 7 16 16 16 16 16 16 16 7 16 10 0]xS -1083 1626 M (getCode\(\))[16 16 8 21 16 16 16 10 0]xS -0.602 0 0.199 1 scol N 1420 1499 M 1358 1508 I K -N 1358 1508 M 1380 1516 I 1398 1502 I 1377 1494 I 1358 1508 I C -: 1 1 1 1 scol O ; K -N 1420 1499 M 1482 1487 I K -N 1462 1432 16 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 1462 1459 M (1)S -N 1462 1432 16 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 1462 1459 M (1)S -: N 1742 1576 291 93 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2033 1575 M 1741 1575 I 1741 1669 I 2033 1669 I C -K -0 0 0 1 scol 1762 1611 M (LocalVariableTable)[16 16 15 16 7 19 16 10 7 16 16 7 16 19 16 16 7 0]xS -0.602 0 0.199 1 scol N 2033 1626 M 1741 1626 I 1741 1669 I 2033 1669 I C -K -N 2033 1643 M 1741 1643 I 1741 1669 I 2033 1669 I C -K -N 1549 1580 M 1358 1556 I K -N 1358 1556 M 1380 1547 I 1398 1562 I 1377 1570 I 1358 1556 I C -: 1 1 1 1 scol O ; K -N 1549 1580 M 1740 1603 I K -: N 1709 1625 15 34 rp C -1 1 1 1 scol L ; N 1709 1625 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1709 1652 M (1)S -: N 1709 1625 15 34 rp C -1 1 1 1 scol L ; N 1709 1625 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1709 1652 M (1)S -: N 1573 1128 218 93 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1791 1127 M 1572 1127 I 1572 1221 I 1791 1221 I C -K -0 0 0 1 scol 1597 1163 M (InnerClasses)[7 16 16 16 10 21 7 16 15 15 16 0]xS -0.602 0 0.199 1 scol N 1791 1178 M 1572 1178 I 1572 1221 I 1791 1221 I C -K -N 1791 1195 M 1572 1195 I 1572 1221 I 1791 1221 I C -K -: N 1855 1128 186 93 rp C -1 1 0.801 1 scol L ; N 2041 1127 M 1854 1127 I 1854 1221 I 2041 1221 I C -K -0 0 0 1 scol 1878 1163 M (SourceFile)[19 16 16 10 15 16 18 7 7 0]xS -0.602 0 0.199 1 scol N 2041 1178 M 1854 1178 I 1854 1221 I 2041 1221 I C -K -N 2041 1195 M 1854 1195 I 1854 1221 I 2041 1221 I C -K -: N 450 1406 190 93 rp C -1 1 0.801 1 scol L ; N 640 1405 M 449 1405 I 449 1499 I 640 1499 I C -K -0 0 0 1 scol 470 1441 M (Deprecated)[21 16 16 10 16 15 16 8 16 0]xS -0.602 0 0.199 1 scol N 640 1456 M 449 1456 I 449 1499 I 640 1499 I C -K -N 640 1473 M 449 1473 I 449 1499 I 640 1499 I C -K -: N 2049 1418 161 93 rp C -1 1 0.801 1 scol L ; N 2210 1417 M 2048 1417 I 2048 1511 I 2210 1511 I C -K -0 0 0 1 scol 2069 1453 M (Unknown)[21 16 14 16 16 21 0]xS -0.602 0 0.199 1 scol N 2210 1469 M 2048 1469 I 2048 1511 I 2210 1511 I C -K -N 2210 1485 M 2048 1485 I 2048 1511 I 2210 1511 I C -K -: N 2105 1128 171 93 rp C -1 1 0.801 1 scol L ; N 2276 1127 M 2104 1127 I 2104 1221 I 2276 1221 I C -K -0 0 0 1 scol 2131 1163 M (Synthetic)[19 13 16 8 16 16 8 7 0]xS -0.602 0 0.199 1 scol N 2276 1178 M 2104 1178 I 2104 1221 I 2276 1221 I C -K -N 2276 1195 M 2104 1195 I 2104 1221 I 2276 1221 I C -K -: N 521 1128 240 93 rp C -1 1 0.801 1 scol L ; N 761 1127 M 520 1127 I 520 1221 I 761 1221 I C -K -0 0 0 1 scol 546 1163 M (ConstantValue)[21 16 16 15 8 16 16 8 19 16 7 16 0]xS -0.602 0 0.199 1 scol N 761 1177 M 520 1177 I 520 1221 I 761 1221 I C -K -N 761 1193 M 520 1193 I 520 1221 I 761 1221 I C -K -: N 491 628 204 125 rp C -1 1 0.801 1 scol L ; N 695 627 M 490 627 I 490 753 I 695 753 I C -K -0.496 0.496 0.496 1 scol 1 Lj 1 Lc 12 Lw solid N 495 748 M 691 748 I 691 632 I : 0.754 0.754 +S K -; 0 0 0 1 scol 513 663 M (ClassParser)[21 7 16 15 15 19 16 10 15 16 0]xS -0.602 0 0.199 1 scol 1 Lw solid N 695 676 M 490 676 I 490 753 I 695 753 I C -K -N 695 693 M 490 693 I 490 753 I 695 753 I C -K -0 0 0 1 scol 535 741 M (parse\(\))[16 16 10 15 16 10 0]xS -: N 1168 1116 157 93 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1325 1115 M 1167 1115 I 1167 1209 I 1325 1209 I C -K -0 0 0 1 scol 1192 1151 M (Attribute)[19 8 8 10 7 16 16 8 0]xS -0.602 0 0.199 1 scol N 1325 1164 M 1167 1164 I 1167 1209 I 1325 1209 I C -K -N 1325 1181 M 1167 1181 I 1167 1209 I 1325 1209 I C -K -N 1225 1279 M 1225 1210 I K -N 528 1279 M 2187 1279 I K -N 1225 1210 M 1242 1255 I 1209 1255 I C -: 1 1 1 1 scol O ; K -N 1190 1410 M 1190 1279 I K -N 1091 1329 276 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1091 1356 M (<>)[17 17 23 16 8 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 1602 1417 M 1602 1279 I K -N 1479 1381 251 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1479 1408 M (<>)[17 17 21 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 1941 1222 M 1941 1279 I K -N 1823 1234 255 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1823 1261 M (<>)[17 17 21 7 16 15 15 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 840 1405 M 840 1279 I K -N 728 1326 276 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 728 1353 M (<>)[17 17 23 16 8 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 2132 1417 M 2132 1279 I K -N 528 1405 M 528 1279 I K -N 416 1326 276 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 416 1353 M (<>)[17 17 23 16 8 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 1870 1575 M 1870 1279 I K -N 1748 1523 250 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1748 1550 M (<>)[17 17 21 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 1673 1222 M 1673 1279 I K -N 1541 1234 255 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1541 1261 M (<>)[17 17 21 7 16 15 15 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 2187 1222 M 2187 1279 I K -N 2068 1234 255 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 2068 1261 M (<>)[17 17 21 7 16 15 15 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 638 1222 M 638 1279 I K -N 536 1233 245 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 536 1260 M (<>)[17 17 18 7 16 7 16 8 16 8 8 10 7 16 16 8 16 17 0]xS -: N 1130 845 233 126 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1363 844 M 1129 844 I 1129 971 I 1363 971 I C -K -0 0 0 1 scol -%%IncludeResource: font Helvetica-Oblique -F /F1 0 /256 T /Helvetica-Oblique mF -/F1S1C F1 [28.75 0 0 -28.75 0 0 ] mFS -F1S1C Ji -1150 880 M (FieldOrMethod)[18 7 16 7 16 23 10 24 16 8 16 16 0]xS -0.602 0 0.199 1 scol N 1363 894 M 1129 894 I 1129 971 I 1363 971 I C -K -N 1363 911 M 1129 911 I 1129 971 I 1363 971 I C -K -0 0 0 1 scol 1174 960 M (getName\(\))[16 16 8 21 16 24 16 10 0]xS -: N 571 845 214 126 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 785 844 M 570 844 I 570 971 I 785 971 I C -K -0 0 0 1 scol 594 880 M (AccessFlags)[19 15 15 16 15 15 18 7 16 16 0]xS -0.602 0 0.199 1 scol N 785 894 M 570 894 I 570 971 I 785 971 I C -K -N 785 911 M 570 911 I 570 971 I 785 971 I C -K -0 0 0 1 scol 614 960 M (isPublic\(\))[7 15 19 16 16 7 7 15 10 0]xS -0.602 0 0.199 1 scol N 1128 908 M 786 908 I K -N 786 908 M 831 925 I 831 891 I C -: 1 1 1 1 scol O ; K -N 1237 1043 M 1237 972 I K -N 992 1043 M 1497 1043 I K -N 1237 972 M 1253 1017 I 1220 1017 I C -: 1 1 1 1 scol O ; K -: N 1494 1023 134 84 rp C -1 1 0.801 1 scol L ; N 1628 1022 M 1493 1022 I 1493 1107 I 1628 1107 I C -K -0 0 0 1 scol F0S1C Ji -1513 1058 M (Method)[23 16 8 16 16 0]xS -0.602 0 0.199 1 scol N 1628 1074 M 1493 1074 I 1493 1107 I 1628 1107 I C -K -N 1628 1090 M 1493 1090 I 1493 1107 I 1628 1107 I C -K -N 1409 1111 M 1492 1085 I K -N 1488 1110 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1488 1137 M (1)S -0.602 0 0.199 1 scol N 1492 1085 M 1476 1102 I 1454 1097 I 1470 1080 I 1492 1085 I C -: 1 1 1 1 scol O ; K -N 1409 1111 M 1326 1136 I K -N 1341 1157 11 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1341 1184 M (*)S -N 1488 1110 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1488 1137 M (1)S -N 1341 1157 11 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1341 1184 M (*)S -0.602 0 0.199 1 scol N 1497 1028 M 1497 1043 I K -: N 1734 802 235 139 rp C -1 1 0.801 1 scol L ; N 1969 801 M 1733 801 I 1733 941 I 1969 941 I C -K -0 0 0 1 scol 1764 837 M (ConstantPool)[21 16 16 15 8 16 16 8 19 16 16 0]xS -0.602 0 0.199 1 scol N 1969 853 M 1733 853 I 1733 941 I 1969 941 I C -K -N 1969 869 M 1733 869 I 1733 941 I 1969 941 I C -K -0 0 0 1 scol 1777 918 M (getConstant\(\))[16 16 8 21 16 16 15 8 16 16 8 10 0]xS -: N 1088 610 317 160 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1405 609 M 1087 609 I 1087 770 I 1405 770 I C -K -0 0 0 1 scol 1179 645 M (JavaClass)[15 16 13 16 21 7 16 15 0]xS -0.602 0 0.199 1 scol N 1405 659 M 1087 659 I 1087 770 I 1405 770 I C -K -N 1405 676 M 1087 676 I 1087 770 I 1405 770 I C -K -0 0 0 1 scol 1131 724 M (getInterfaceNames\(\))[16 16 8 7 16 8 16 10 8 16 15 16 21 16 25 16 15 10 0]xS -1131 757 M (getSuperclassName\(\))[16 16 8 19 16 16 16 10 15 7 16 15 15 21 16 25 16 10 0]xS -0.602 0 0.199 1 scol N 1419 896 M 1314 771 I K -N 1287 794 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1287 821 M (1)S -0.602 0 0.199 1 scol N 1314 771 M 1336 779 I 1340 802 I 1318 794 I 1314 771 I C -: 1 1 1 1 scol O ; K -N 1419 896 M 1524 1021 I K -N 1539 966 11 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 1539 993 M (*)S -N 1287 794 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1287 821 M (1)S -N 1539 966 11 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 1539 993 M (*)S -1 1 1 1 scol [ 72 24 ] 0 sd N 696 690 M 1086 690 I K -0 0 0 1 scol [ 72 24 ] 0 sd N 696 690 M 1086 690 I K -3 Lw solid N 1086 690 M 1059 701 I : 0.754 0.754 +S K -; N 1086 690 M 1059 679 I : 0.754 0.754 +S K -; N 847 641 164 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 847 668 M (<>)[17 17 15 10 16 16 8 16 15 17 0]xS -0.602 0 0.199 1 scol 1 Lw solid N 1569 786 M 1406 737 I K -N 1569 786 M 1732 835 I K -N 1086 751 M 786 866 I K -N 786 866 M 834 866 I 822 834 I C -: 1 1 1 1 scol O ; K -: N 865 1023 134 84 rp C -1 1 0.801 1 scol L ; N 999 1022 M 864 1022 I 864 1107 I 999 1107 I C -K -0 0 0 1 scol 899 1058 M (Field)[18 7 16 7 0]xS -0.602 0 0.199 1 scol N 999 1072 M 864 1072 I 864 1107 I 999 1107 I C -K -N 999 1089 M 864 1089 I 864 1107 I 999 1107 I C -K -N 1083 1111 M 1000 1086 I K -N 990 1111 16 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 990 1138 M (1)S -0.602 0 0.199 1 scol N 1000 1086 M 1023 1081 I 1039 1098 I 1017 1102 I 1000 1086 I C -: 1 1 1 1 scol O ; K -N 1083 1111 M 1166 1136 I K -N 1165 1079 11 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1165 1106 M (*)S -N 990 1111 16 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 990 1138 M (1)S -N 1165 1079 11 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1165 1106 M (*)S -0.602 0 0.199 1 scol N 992 1067 M 992 1043 I K -N 1072 896 M 1177 771 I K -N 1190 794 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1190 821 M (1)S -0.602 0 0.199 1 scol N 1177 771 M 1173 794 I 1150 802 I 1155 779 I 1177 771 I C -: 1 1 1 1 scol O ; K -N 1072 896 M 967 1021 I K -N 1004 1018 11 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 1004 1045 M (*)S -N 1190 794 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1190 821 M (1)S -N 1004 1018 11 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 1004 1045 M (*)S -LH -%%PageTrailer - -%%Trailer -%%DocumentNeededResources: -%%+ font Helvetica-Oblique -%%+ font Helvetica -%%DocumentSuppliedResources: -Pscript_WinNT_Incr dup /terminate get exec -%%EOF -grestore diff --git a/docs/eps/jvm.eps b/docs/eps/jvm.eps deleted file mode 100644 index c85c7617..00000000 --- a/docs/eps/jvm.eps +++ /dev/null @@ -1,218 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: jvm.eps -%%Creator: fig2dev Version 3.2 Patchlevel 1 -%%CreationDate: Thu Nov 19 11:55:18 1998 -%%For: dahm@che (Markus Dahm,,,,,) -%%Orientation: Portrait -%%BoundingBox: 0 0 439 199 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def - -end -save --17.0 217.0 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def -%%EndProlog - -$F2psBegin -10 setmiterlimit -n -1000 4612 m -1000 -1000 l 8588 -1000 l 8588 4612 l cp clip - 0.06000 0.06000 sc -/Courier ff 285.00 scf sf -6600 1575 m -gs 1 -1 sc (java) col0 sh gr -/Courier ff 285.00 scf sf -2550 1575 m -gs 1 -1 sc (javac) col0 sh gr -/Courier-Bold ff 150.00 scf sf -4290 1155 m -gs 1 -1 sc (08 1a 42 ...) col0 sh gr -/Courier-Bold ff 150.00 scf sf -4290 990 m -gs 1 -1 sc (ca fe ba be) col0 sh gr -% Polyline -7.500 slw -n 6405 1200 m 6300 1200 6300 1695 105 arcto 4 {pop} repeat - 6300 1800 7395 1800 105 arcto 4 {pop} repeat - 7500 1800 7500 1305 105 arcto 4 {pop} repeat - 7500 1200 6405 1200 105 arcto 4 {pop} repeat - cp gs col0 s gr -% Polyline -n 2505 1200 m 2400 1200 2400 1695 105 arcto 4 {pop} repeat - 2400 1800 3495 1800 105 arcto 4 {pop} repeat - 3600 1800 3600 1305 105 arcto 4 {pop} repeat - 3600 1200 2505 1200 105 arcto 4 {pop} repeat - cp gs col0 s gr -% Polyline -30.000 slw -gs clippath -2280 1470 m 2400 1500 l 2280 1530 l 2445 1530 l 2445 1470 l cp -clip -n 1800 1500 m 2400 1500 l gs col0 s gr gr - -% arrowhead -7.500 slw -n 2280 1470 m 2400 1500 l 2280 1530 l 2280 1500 l 2280 1470 l cp gs 0.00 setgray ef gr col0 s -% Polyline -30.000 slw -gs clippath -4080 1470 m 4200 1500 l 4080 1530 l 4245 1530 l 4245 1470 l cp -clip -n 3600 1500 m 4200 1500 l gs col0 s gr gr - -% arrowhead -7.500 slw -n 4080 1470 m 4200 1500 l 4080 1530 l 4080 1500 l 4080 1470 l cp gs 0.00 setgray ef gr col0 s -% Polyline -30.000 slw -gs clippath -6180 1470 m 6300 1500 l 6180 1530 l 6345 1530 l 6345 1470 l cp -clip -n 5700 1500 m 6300 1500 l gs col0 s gr gr - -% arrowhead -7.500 slw -n 6180 1470 m 6300 1500 l 6180 1530 l 6180 1500 l 6180 1470 l cp gs 0.00 setgray ef gr col0 s -% Polyline -30.000 slw -n 5415 615 m 5415 915 l 5715 915 l gs col0 s gr -% Polyline -n 4215 615 m 4215 2415 l 5715 2415 l 5715 915 l 5415 615 l 4215 615 l cp gs col0 s gr -% Polyline -gs clippath -7006 1136 m 6900 1200 l 6964 1094 l 6847 1211 l 6889 1253 l cp -clip -n 7500 600 m 6900 1200 l gs col0 s gr gr - -% arrowhead -7.500 slw -n 7006 1136 m 6900 1200 l 6964 1094 l 6985 1115 l 7006 1136 l cp gs 0.00 setgray ef gr col0 s -% Polyline -30.000 slw -gs clippath -6630 1080 m 6600 1200 l 6570 1080 l 6570 1245 l 6630 1245 l cp -clip -n 6600 1200 m 6600 600 l gs col0 s gr gr - -% arrowhead -7.500 slw -n 6630 1080 m 6600 1200 l 6570 1080 l 6600 1080 l 6630 1080 l cp gs 0.00 setgray ef gr col0 s -% Polyline -n 300 3000 m 3600 3000 l 3600 3600 l 300 3600 l cp gs 0.90 setgray ef gr gs col0 s gr -% Polyline -n 4200 3000 m 7500 3000 l 7500 3600 l 4200 3600 l cp gs 0.90 setgray ef gr gs col0 s gr -% Polyline -n 1500 600 m 1500 900 l 1800 900 l gs col0 s gr -% Polyline -n 300 600 m 300 2400 l 1800 2400 l 1800 900 l 1500 600 l 300 600 l cp gs col0 s gr -/Helvetica ff 180.00 scf sf -6450 450 m -gs 1 -1 sc (Other classes) col0 sh gr -/Courier ff 150.00 scf sf -375 975 m -gs 1 -1 sc (public class) col0 sh gr -/Courier ff 150.00 scf sf -375 1140 m -gs 1 -1 sc (HelloWorld {) col0 sh gr -/Courier ff 150.00 scf sf -375 1305 m -gs 1 -1 sc ( ...) col0 sh gr -/Courier ff 150.00 scf sf -375 1635 m -gs 1 -1 sc ( void hello\(\) {) col0 sh gr -/Courier ff 150.00 scf sf -375 1800 m -gs 1 -1 sc ( ...) col0 sh gr -/Courier ff 150.00 scf sf -375 1965 m -gs 1 -1 sc ( }) col0 sh gr -/Courier ff 150.00 scf sf -375 2130 m -gs 1 -1 sc (}) col0 sh gr -/Helvetica ff 180.00 scf sf -4275 2625 m -gs 1 -1 sc (HelloWorld.class) col0 sh gr -/Helvetica-Bold ff 300.00 scf sf -900 3375 m -gs 1 -1 sc (Java language) col0 sh gr -/Helvetica-Bold ff 300.00 scf sf -4350 3375 m -gs 1 -1 sc (Java Virtual Machine) col0 sh gr -/Helvetica ff 180.00 scf sf -375 2625 m -gs 1 -1 sc (HelloWorld.java) col-1 sh gr -$F2psEnd -rs -- GitLab From 52b2d1148776c9d6cc78eadabf3a03cf9755cc09 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Sat, 10 Nov 2001 00:36:56 +0000 Subject: [PATCH 0012/1313] - fixing image reference typo git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152702 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/manual.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/xdocs/manual.xml b/xdocs/manual.xml index 62f3b1d2..bf176d34 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -131,7 +131,7 @@

        @@ -179,7 +179,7 @@

        - + Figure
        Figure 2: Java class file format

        @@ -602,7 +602,7 @@

        - + Figure
        Figure 3: UML diagram for the BCELAPI

        @@ -728,7 +728,7 @@

        - + Figure
        Figure 4: UML diagram of the ClassGen API

        @@ -968,7 +968,7 @@

        - + Figure
        Figure 5: Instruction list for readInt() method

        @@ -1152,7 +1152,7 @@

        - + Figure
        Figure 7: Class loaders

        -- GitLab From c36a8a989d3b80f591d4534c2e2dc8799bd2b474 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Sat, 10 Nov 2001 00:46:16 +0000 Subject: [PATCH 0013/1313] - reducing the size of the image for the website git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152703 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/images/bcel-logo.gif | Bin 4931 -> 5128 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/xdocs/images/bcel-logo.gif b/xdocs/images/bcel-logo.gif index 24029c69b102518473a1633b11ced95b06bb6808..ee6553b553563e032991b2d04a45c897fde94d37 100644 GIT binary patch literal 5128 zcmZ?wbhEHbbY#e7_|Cxa_3PIUA3nsy#6&rJG&VLqd-~MJ$7j-{NzrT0WT&g)XYH)1B=)8OPPDEHZ#75`g!-u}s78Y7+d-v{@ zmzV$b>z9s-Qd?V_j+T;kYn7!X9Cb84efsqB#fz0IR`76hJ32b9m_B96k|lxG zMzyuIot>Tc?%g|a;^e`D2WQTldGyF>8(non9hG}`?o92SaqQSJH#fIkyLK6Bsw9W_ z#5owxojdp6-@if5hA}QSnQnp3CMMgqZF4Zv@O3ixGB*x&wGMUEV`gId{{4HPo%Ng7 zuamv4lbr2bO*GG)JNNtd@3^?+*4A!kW7TLs?@O01smdut*%~Fd7;|y5NQp{Hh=_;? z@-1Js%+J|bQc_Y@Ld3_^GBqVD%hTFSUv0sH1vhWr6yW8I@(wL6sycP@?8i@E4(#7& zVr2dO`_HDTItw*511)8DQ(Z?BO(zq*j~_qUXsJs{Dzme)q{YR2c=wTqTcoPA?9QD# zE=F3@rcI3Uuu@XinlpQmow1<+pCAh}r=7aS|NnmtbyfcU{r}_JkG#A*H!E#1AxRru zBTiP%Y$qdmIZ1O(bv6zjF-duLcDC2AU%!6!>fgVAlP6Dp_3G8jmoGnk{P_FN@8{2- z|NQw=T}!X2tijd7YU8|B`31G<>FLptVV)lDrG=?8W=xndZO;35@1pE&K7IQ5`_JE> zKfZnW@@3xaIbXkiDk(1R?(XUB>8!3On9x5VFDvQQ%U5sTzU^pj+`Vjbc6RogH?Lm5 zdR<>qQC?P%otZadLdBjnEAstA?DQ0yo13fZ>OHMAR;}AyniQIwk(-;7Q|xVZXltW>h5bS-T5vbO3L^wZ+>p?V)fw9;suMlTok@>3Gl7eYc&k9tog8l!RZ{kMe>fcech2Mt_6bsG-npP z57O>D?%e+0&o$w`sw(@DC70aT+?a1fX20h7nJ?PM&!9A+qwjFT5e7B~_pT;$nhQQl*_ zd;=Wd)g-zU6Asa3+ae5qCY_Iy{!TE_RZU`TYoOgiHMSJCvOFRs$77zL* z3^)WBC8s-l>&mf+V-w;~*|6Yn!T${#jtU8#WMXEu6Hr*ruMn^xgz1(+z#*m@J%N6i z6+4tz42=~S`lhN&e7@yp+WNDf&uIdKUxv*K1_xIL28N@{=9F2niC3B^tXjbzbIFO% z@Yp0-`&`yWXE%n z!>?Mfq~OrhrI(s?)*MmF_TA!X;={!K;$a)Rz@5MrCV?X#*j7dBIC+^)%1pU%;>)xe zBW;HbclhIa>s(wWnsg{MG3j41;865A;n1v^v**Jh>3;#2+IwpReRWTHma8svy#M0k zF)k&C14lSq?;Jd$#&zPuF{SAz{uj90MQ?ZXF?c^K*W}jctELkSQgR%dMFn~kb_$vw z-g}bUQsJXEHgm_DNbZ|-vg7&EEiNfPF1K+^^wDh+EU7m5&0(}5u}kKs zLx7iH%Yw}(#I~~*|{K@OKZuEoEFxZ zPbRZT&k!iKIpjLOuH=@(QT0I8e=ibQgvBZ*a0m-HBpl%?zc8QamI9aA62^38j}~?g zM~;95CgzwE9G|on?O9^#qdYaBMe~w?rIUt&p!Np`9+3(CqAE@-@zE^OJqP*(pDgB( zGdQGnZab@gPD+!|$_FhepZnP)IAs$B9C`lhI2;mnaA1_zS;(HUfIYauiLus*OQc_im{S5;q4v~XQj4=nfbQli2?0vwepTMkj%b+7DWsyjE z1B0SbV2g>wN&62;_is)MpE_&KV%F#x&5EBAIkfL6Hk$8tR`Pn-s1(sCvWP)mF(Zsc zu;&1WfCLN6tqmL@M^?$lURn6+A0xM8j-!Y^$6?tUJ2<%o4t4xE94*+>&?vKD5$k4c zSKbfP`=g^2`~G>jxdi>R`}udVwB-#ZjjV(Y9v@yNZ3!37(<>TwX*yK&bu_*)3+&kS zR5?$sf>|xDKr>D0T%@R@gtXX%MuQXu=DooU92|lFTSR-_Pg`2Rd_QFZhs8Bt7P$j) z44DePX%apY+N0+!{ujujns7)^|G@#acbZJv5eEg9S|oA4Z#c3x@k@u;f+d1B2Uu8r z_?dG)95Zstlaj$gj@?_FboDlNm_InfTpr||gFb1E=6`aNYq6JtyRvzA7SyXypgZHb8jVhfnqLM&XTt2J$3^yPqp zi$RCW9)~sa*Jgg2)hU^}M@Tg6g_Cs%Lu_8k1A%EBw*?(N`z&)D`ELpwlx?xxYIG?_ zxW9%`>&b+B-`0L#CSG~y!n;3^&*!~#>=ZU z;aq}i8hGHZ_$JKUsE1jG7>v@ z;92Tn=^pM|?8TzWsUMCjeVNdx^P+j542QGKEy1=Z5A&jF3hdHF6WAoD82)Dy*w9eA zn9GLa33IWbU0zN?zzvxl$wJ{9^7%JxXzX3(kd+qSTm8`NMJ!BgW7pLjUr2|$9L9U6K?cM9pXvb;cnwm<0P3NcGO3qb|t+L4nANn#J*^(---B;mincNRq&-G{9ggp+wHO`Z8{b2CM zqrs6oVa6eqD+Uce^R@_Vx#9d*LE(vuN>Yom!jYJ-$62%!6ml9HYFzp^Y^wj!B(iMk zL5-|^Y@&aXm^CIeaYdc(h)TK0)W&d6nVr#frITQ1@rQN>3&r0TF8xrRTi_6J_X4x^ zo~a% zqu799vH;Wm2P{D!xU~vcV++_GJYZYI;3Jv9+GYMLkT2;Ww$J!RkR=((~pa>)Pt_7*x z5BP38U||+uD*P|Ns^P$XZ3DmcQ9kL^u&@M{W&tOG3;DSR*ls)2vNjfVerBJMz~$@8 zo+ZE+yn$`90&8Rf_fl8p2!RZNh~_s5ES&}%#!vWb3?#3nr-~iXhzMj~z92a70ZY6B zt0DuN#s!x84@}VxTzuOZ+XdLdUU>deVGa;Whp_b*{@MbjMh`et1z3_itp0jPvI(*@TrkcR;LQHPv*Q6jk7bQ?1FMV!YwHHiq6Zu` z6O_6h`*A3UZ8nq_`5(x)Goh_-0_U#+UZxGfk_}8z*I5GtIFt*RrUbBE4K!=)s1I;p zuyBx0IAZiafc<|F)B6d`;;zgl4UBP~%*6}XJp@etTXb@UK^ z8tTB9m!QHhdHTNw?a)Ngm?P;@0#Y3h7Ji7+z%f56XH zpd;GIyv%@E)R0X?fM0NeNI?L@T_f>dO`1goOu7L~stF7WZtAcpwsAjT;!EI>e8@F# z1A~2lpxFjRUIt#K2b{eBA2IN4;CF6dI5vSn#DMSR1g5(}st+zPSTXRGe({BY9!HHZ70#^SF+NUqzwsT6vH zQ0HMZi+-TaBA^}PXeGqRB>aJ2uz_LmL;m1O5z7ty;!=x65_skns8=+xt2|&hbCXHl zfYHW)+3^AcYXgVu0j^UAxGD-5j1TCXO_JQGz;33%@=t*A-vVyYkL)WJaPO#`BP5_F zn!qDiz{I_g!ApUGb{e#AWw@e~;(N6}Rdw6ByVTmRT-f5j^6&+F4L`0kfcif?5G*N9U@lTlMD_@^CC* z4t>?TEVBB)0=M7-X1xQf(;XPoPOkoSsh)2EZ{-FS{|EdVvZijFxWcSq?b-z9Zv{*S zf_hJ));+6Q_b`d)#xKT~3M?-lFjy&=EG(S$KY($jF|(QiOQMv{pIhtyof0T2;AC5% z<#j>e*Nf>(j00CWFnB4jiwJOQ8nDeZ+9(peQCM5$zXIc?25|?6*)0~bDplg54orCo zTo)1+Ys}uHHCyDEgStY1I?DlB(~FtrN@|k-1E;5bWZ-|mX?1$D&F#&$uQyxm-t3$$ z_U-31rVot&8n|^7gno(7mginOg^QohfKgR|k?#SU!se|`#iB>OdTwP+oxaiJ{{lYs z0H)sym_HUUrExZyHHw=*(zAQGEx~B>=ZieL2@EeinXDdgmCoL9^pvpm67hQLZJ!PK zizYC52{3X$nB(gyFMQA>(P>-5?XAj=o4+h%l)AO}!UsmJ%|er2>lD3Q*7BY;GX+?r#$0!yNMPF*}Hs$r?O0( zX!4L%Re(RQfQfqn_x#(T<}1w-oVGo(kiKOty{emAfq`$we*wnxky9;{wsrp6Qo7no zp+a)i1BQdG`J%)xt+_+dN&pmpzd|SZ_b;wg4I}CeBn;%Rm{;J4j%SC z9H^t1u-nV*weT5-87c|<{tK87aPL?aeU#(&G0}y4%DR>JHE`K1;9GZq!Sd;aBg~3z z)qzLK9d}$Z)b{OEW=v4={J?))Vc&rlTg`8tWMSq%rn&X_u2r5BSgs4rNEYCZQP|yZ zX5zNr{AUvw@*9{R8R@-vrMt3$*|LEnCV{D=fdA11rX34drbZriSu;P8o4H~G%Xdqi z3o>U97cos&n0$Nz@2Zzvw>wuz{Mk|LEy%OL=$iuD;-GWSYR>Tru;^Z}ThqWM62NFy zz;N>RN%N0~nz(s|4=`0Lo&CdecKQS+bs+|k15$hiddH&n6uuPpR$$L}V32yiDkX4H hK=z`L?M2bGj1CT52R1P{Brx55xbf<3env(HYXBmx5+MKp literal 4931 zcmZ?wbhEHbY+|^@@Kurl1h^Qu7#O&?7#MhEc^G7Qcx1)786LgRd;!NU42t? zsc&1mceQ(Nc}qi~U)Lm6eohW94o>dr+?-tVxtW>S=1+F*X>87CSQfy$ke!Eze-jVi zrtMp|@7}b9n}>~=>EQmY+jzJavN16+^MtJ^>|4E7mG>YU8~2vuJMP}OdxC%GPOd|z znQ!0Sv-ud$vqM}WH941Bu2l1WxV8Dg<6RGASY$GCCa+-R+EclEEAO3+>{}j~N*An} zx7fYmLPCU@q2dvCLA$Ou?yuu_N2z(vdY#c7?HR{cG*_hJ^+BeRMQtv-PpCcqC(8AV zW6o_cA*PlI@`?^Q+qX8W_?Zf5n*IZ_B7d*vCV5k^Ff(4dq0Rhx_D~J z<2oK6N9PrLxvu;SY7Y$y&u=*>=d-6mYKd_bznL>bVG|37(1b&^1tO24&TiGT5qr8_ zB_YN)lgY(X`(T`DisXL3&66aZw&v<8^g1*;z3bm8yQlR7V{=p55|7Dis?Ad`??2(9 znURo^e)DCugwLE8XL4J%3O*>iQvd&Bnf?B z^R<7Wtq#uHpFX>rE0J)Zp_u8&p$FC8JE!odah@q|t-WL$bXKI}$%@ClwFw+<+4V0@ z9O<>vU3g>SM1f9LmGT>xTPNGNR?eSLsSz2k;NZ1#=`=Sh%Oz8d%{D%rk#g!F*Nlv1 zoyn6^SG;^SJN#Us+MJSInI~GiuC7d={guZ&Yc%iFWr}ucue3~Lgs4)V^KyY%g5c` zyKj_C*0^~hBXQb4Nw?MP%p5Y){5BliraalX`|C? zVX0Fm+%HuHaBiD$_@0M~Lk7Phv#5({?QK6J4L;_%s{^wDRK5_ zA5TGtY3Gif)=UZ7e`3v)V9xWa7QGX3ki6#Oys!1kY!9!s$Bj1JHu>NXp`OgGqqlp{ zoVP*Mk_T=rD*C5$v_LIC`F3tj?)Sh3ftP7_JVn&zT=0qbo2*~6B-Qj>i1qh5?+%6r zOmHweEYZNgeE(^hV;*ah`oWk&%dZDm<`r5Wc%bz3k$ADOZK&Y^cGK166XJq5il^jE zJs0+H*>$sfH>Gm|jGUNsOV|I?<3DFT!B=+n>EeTSpKINi&gcm9FzsM`AzQAf_*MF* z;EWyoPy5XKF74TtUvxl2!scV8;=b362AXG<9KFW!U-bX|e2D^urn)mLW|%eeEidV| zM)Hp?d+LmkS;3DT$rBUUCjK}qrqtOf_R5p1I$h1Fwa?%8QzYxcj%C8$0K?@mLW6q&;- z+<5m*tZore;mJPgo-Qji@n^CkPiKj}pqr5|e?~)`(`C_uD{IAOG@MDco9O8pBE&y^ zja#u=m~fRXPc%(VS#*@IVhd`?Mr;+`z6cS~6BkV6}T{_ZaQDW(l9 zAsQVDyZQCcPY{pX^;q*e7suCCZRUYB9Cq6#bY?D_#LKLrz_qL8u*qtHu0)Q8#1L+d zJ8fS@&gpiGWWRPb%4pgcso_w;T#@FwC{j6A^N|$0XM^{wO;b`5)=Yk~ApFfe#tZ)! zrY#hE-OB9oc}C~e=M#SzYe;D=XgF-}*jamWtn=Z2otDe5=$SpQn0-e~YW@C#WRaT^ z2N><19i1@g0+&PvgP-7{Eo`3rbKWT)xBFq(JxgJAl)vg3`{wo;YwuoM-rLhu;AYM+ zafPnIx+zPIUb!N1>Kj;N)R?lW zb5j$33ss&~(pUZ5;#@fGeBO%3lX)8185^<%K&;>p>9?)^FGM zUq0YHZ}-yW7JZ2`-oEQwaPaIa!KCC(osBF^!aEL>PcmXWt5a^wzvIBKPhYv)43@5Z zcQVZR*Hyoug6Um{dJk1jD-Aj%n&-mcmGG$QvJzLqf&9fY<`fIAo*4@>FIWZ)3!7EtA95;@@8ID>u8;v5F%fY+<`w`~=@BJtQ!T}VPNmuFY0oa2fc z3T`)VHQl+barCr6;+$JvUm9MN73E#8Dcb*xHJEA6hi|EhA&DI%IiD~UR|H!b1L!J`mW>p%etO?-4L``F|J6Y>}21x zLl;g(pIbWJzVl&(&*L+h?`G+|oA@aC!Ojb<6^Hwz|GsFANnY^fLP{!UG7s*ZP&Av_iY3W=e?QDZyVx1N%>mr{#R%3 z+w~X9*v??kuay59Yh~qrb#~R2&$oZ?RTuI3wf2w1o%`wg9p*Qz` ze>wlkx5e%9`|qYUFKg*)@Lsa`?=uD0489;Pxz77vSFb`ySx2nOp6fUmz z`YIul{XzQYSot=6`R6@vfez=yg750CV&QrFF4dVh>)bA|6f@>iHT6DfV1Mv{&Q~{9 zR*%M?>1+|pIRBZOyCfSQzYyqRYQ60UPm!UraEJO&Gfqu0siJ1%_O`&k+r`zL4OI+v z?jB(f7RYm z-6KNQ>CaN;7<=hn4f%eFGw~zCg_H`m2;ToH7IKX|rxfF7P4*Ww6lG#=-W|&QScxlt znXRRUQRasHPk}rS8T2OK2;pNA+%`pDPqe+`hdc5nP~F`J=4Qbpii`i$cB5!Iy(&)^hmGRxnsNt4fmJTSW2>O1m{C2sloOzZtV>iGe|&?q8PFnO8%c zpH5#LR+%$1iDO~-lc_PsJ|>wx^r~kSv|5%@W@w(XElK*Yz+)w`;FJA}BP!Kgd%Yqg zcYPG|Fys~xF#ozpa!%FPP)ITm!QPWaoR|8tVSp-ge6%D^^@mh&HHsY&*_ zDKxW(L^>T)5Lsa6qS+z-!Q_U4#VyX6YmfXhyFF7V{szxU%e;RxOcxti#I(h5h~(d1 zmdoI&XQVpGz@q#83h}337W|EWp;-06iF}cyMmdA9&pY~&d|BmH!+gC zH+6ph)Bbta?9ZAgWH)BIJ)Y^gFjstnxRauV^ocHCHa)*eA=${}2bGhY3Z@>M%%^Zs zY`dVs{=ylBAE)(yX58qQ%)4!YWU^uB(umEEvs9#Jr#5oX3z-#ebtO_hi3;$mgyC9k7Srw*r$ZXS8-$|Sj z(pRVFM@t~s)+Vt-r;tPm2aO&E=_YIHTrQS7qY%*bs^9s5{g-m9RkK9$H`=g^MJUY*-m@}r z%ddIszKHJ^5LqwQwLx=L_yY0vM!qeI;-X#I0>780D(BWei+-_f?%_!bGOKhyIO*}V zZ1}FZ-uZ(B?`%G&u*_|03CWjbS(0Y(CooEEU=&v{xHoB@_E))up~l{&-8NlO{t@Y% zswr{5Qui7zdGsq)tu5f!rij^!Jx5;}e7w%^Ky8z4R@<+@^n(JM|84sw&$w*)`{o!$ z!v&`nO|4p*w(>?}T%pqS&B@XSI(Gk>{_~>ZyCU)S$FlKdcKY3RiUo|al3AIe)A=s9 z?sygW+-d6dRU9rB3}vY?m&GF-V-pK_?XQl`o6IGICVEQ=wpZ><= zC7Zni*`M$E#l82TCFgqwz0Vo~!UuLqHSjHQ$lw%NXZXVB$!m{itLH50cD|=xvvW$f z*`)%v?*)o?D(-AAPj^z)YOg*k?iL;Hs?4)pSLRTMf~T#H#;tbtS?!t%Dvb>ar4Dzh zs=t)GEq857DQYtB+WpF{XG-EM zj_gc7bXmP{!RlkHrdN9;9aCjlSQJyN&7!{c;L*xAP9-wDb~P2@YmUV-acaIfd@=k` z&z|EB&yUyF@Vj0=F-7NaKfAV4$;p~MWwYiK+uu1Ek5@CHIX0)3&+(qK z=hU~>@Y1|Dr_NnEwaKSpOU&u*K^o0Mr+4@qnt$hX2UGEZoYQtDXAZ`kIhNz)H0SU! z8_knz&ba$HpXVuR&pCdXr*h4qGl%D>UaL9#;)>JVH)n5MW-ncH_UZA{={kj34URrj wYNpn3%$>BuMTNKZjb`Z*t?pgb8~&Wj%qe Date: Sat, 10 Nov 2001 02:19:46 +0000 Subject: [PATCH 0014/1313] - updating the documentation, grabbing missing docs from the sf site. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152704 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/contributors.xml | 37 +++++++++ xdocs/faq.xml | 65 ++++++++++++++++ xdocs/index.xml | 32 ++++++-- xdocs/license.xml | 71 ++++++++++++++++++ xdocs/news.xml | 26 +++++++ xdocs/projects.xml | 136 ++++++++++++++++++++++++++++++++++ xdocs/stylesheets/project.xml | 22 +++++- 7 files changed, 382 insertions(+), 7 deletions(-) create mode 100644 xdocs/contributors.xml create mode 100644 xdocs/faq.xml create mode 100644 xdocs/license.xml create mode 100644 xdocs/news.xml create mode 100644 xdocs/projects.xml diff --git a/xdocs/contributors.xml b/xdocs/contributors.xml new file mode 100644 index 00000000..d51f875c --- /dev/null +++ b/xdocs/contributors.xml @@ -0,0 +1,37 @@ + + + + + + BCEL Contributors + Jason van Zyl + + + + +
        + +

        + + + + + + + + + + + + + + + + + +
        Markus Dahmmarkus.dahm@berlin.de
        Conor MacNeillconor@cortexbusiness.com.au
        Costin Manolachecmanolache@yahoo.com
        Jason van Zyljvanzyl@zenplex.com
        +

        + +
        + +
        diff --git a/xdocs/faq.xml b/xdocs/faq.xml new file mode 100644 index 00000000..31478dc5 --- /dev/null +++ b/xdocs/faq.xml @@ -0,0 +1,65 @@ + + + + + + BCEL FAQ + Jason van Zyl + + + + +
        + +

        + Q: Is the BCEL thread-safe? +
        + A: BCEL was (deliberately) not designed for thread + safety. See + "Concurrent Programming in Java", by Doug Lea, + for an excellent reference on how to build thread-safe wrappers. +

        +

        + Q: Can I use BCEL in a commercial product? +
        + A: Yes, this is covered by the LGPL, if you add a note about the original + author and where to find the sources, i.e., this URL. +

        + +

        + Q: (Typically for users of SUN's XSLTC) I'm getting + +

        +    de.fub.bytecode.generic.ClassGenException: Branch target offset too large for short
        +    
        + + when compiling large files. +
        + A: The answer lies in internal limitations of the JVM, + branch instruction like goto can not address offsets larger than + a short integer, i.e. offsets >= 32767.
        + The solution is to split the branch into in intermediate hops, + which the XSLTC obviously doesn't take care off. Blame SUN ;-) + (In fact you could replace gotos with the goto_w instruction, + but this would help in the other cases). +

        + +

        + Q: Can I create or modify classes dynmically with BCEL? +
        + A: Since 4.4.0 BCEL contains useful classes in the + de.fub.bytecode.util package, namely ClassLoader and + JavaWrapper. Take a look at the ProxyCreator example. +

        + +
        + + +
        diff --git a/xdocs/index.xml b/xdocs/index.xml index 6fb6299c..471213de 100644 --- a/xdocs/index.xml +++ b/xdocs/index.xml @@ -8,10 +8,32 @@ -
        -

        - Documentation will soon be ready. -

        -
        + +
        +

        + The Byte Code Engineering Library (formerly known as JavaClass) is intended + to give users a convenient possibility to analyze, create, and manipulate + (binary) Java class files (those ending with .class). Classes are represented + by objects which contain all the symbolic information of the given class: + methods, fields and byte code instructions, in particular. +

        + +

        + Such objects can be read from an existing file, be transformed + by a program (e.g. a class loader at run-time) and dumped to a file again. + An even more interesting application is the creation of classes from scratch + at run-time. The Byte Code Engineering Library (BCEL) may be also useful + if you want to learn about the Java Virtual Machine (JVM) and the format of + Java .class files. +

        + +

        + BCEL is already being used successfully in several projects such as + compilers, optimizers, obsfuscators and analysis tools, the most + popular probably being the Xalan XSLT processor at Apache. +

        + +
        + diff --git a/xdocs/license.xml b/xdocs/license.xml new file mode 100644 index 00000000..b253ef88 --- /dev/null +++ b/xdocs/license.xml @@ -0,0 +1,71 @@ + + + + + Apache Software License + Jason van Zyl + + + +
        + +. + */ +]]> + +
        + +
        + diff --git a/xdocs/news.xml b/xdocs/news.xml new file mode 100644 index 00000000..3ccf0ae3 --- /dev/null +++ b/xdocs/news.xml @@ -0,0 +1,26 @@ + + + + + Jason van Zyl + News and Status + + + + +
        + +

        27 October 2001 - BCEL moves to Jakarta!

        + +

        + The Byte Code Engineering Library is now an official + subproject of Jakarta. A special thanks goes to Markus Dahm + for donating the code to the Jakarta Project. +

        + +
        + +
        + + +
        diff --git a/xdocs/projects.xml b/xdocs/projects.xml new file mode 100644 index 00000000..da042fbc --- /dev/null +++ b/xdocs/projects.xml @@ -0,0 +1,136 @@ + + + + + + BCEL Projects + Jason van Zyl + + + + +
        + + + +

        Related Projects

        + + +
        + + +
        + + + + + + diff --git a/xdocs/stylesheets/project.xml b/xdocs/stylesheets/project.xml index 04598627..2d2d4f9b 100644 --- a/xdocs/stylesheets/project.xml +++ b/xdocs/stylesheets/project.xml @@ -6,8 +6,26 @@ - + + + + + + + + + + + + + + + + + + + - + -- GitLab From 94cb58749e985d40bbabdacba28e60b6a34d20cb Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 12 Nov 2001 12:20:42 +0000 Subject: [PATCH 0015/1313] Fixes towards Apache git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152705 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/faq.xml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/xdocs/faq.xml b/xdocs/faq.xml index 31478dc5..6fe6d720 100644 --- a/xdocs/faq.xml +++ b/xdocs/faq.xml @@ -23,15 +23,16 @@ Q: Can I use BCEL in a commercial product?
        A: Yes, this is covered by the LGPL, if you add a note about the original + href="license.html">Apache License, if you add a note about the original author and where to find the sources, i.e., this URL.

        - Q: (Typically for users of SUN's XSLTC) I'm getting + Q: (Typically for users of XSLTC) I'm getting

        -    de.fub.bytecode.generic.ClassGenException: Branch target offset too large for short
        +    ...
        +    ClassGenException: Branch target offset too large for short
             
        when compiling large files. @@ -40,17 +41,17 @@ branch instruction like goto can not address offsets larger than a short integer, i.e. offsets >= 32767.
        The solution is to split the branch into in intermediate hops, - which the XSLTC obviously doesn't take care off. Blame SUN ;-) + which the XSLTC obviously doesn't take care off. (In fact you could replace gotos with the goto_w instruction, but this would help in the other cases).

        - Q: Can I create or modify classes dynmically with BCEL? + Q: Can I create or modify classes dynamically with BCEL?
        A: Since 4.4.0 BCEL contains useful classes in the - de.fub.bytecode.util package, namely ClassLoader and - JavaWrapper. Take a look at the ProxyCreator example. + util package, namely ClassLoader and + JavaWrapper. Take a look at the ProxyCreator example.

        -- GitLab From 802d27b32e02ae8074e964709f7b68731e1652dd Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Thu, 15 Nov 2001 16:23:36 +0000 Subject: [PATCH 0016/1313] - adding "dist" target to produce binary and source distributions. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152706 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 100 ++++++++++++++++++++++++++++++++++++++++++++- default.properties | 3 ++ 2 files changed, 102 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 28c3a80d..e4de526d 100644 --- a/build.xml +++ b/build.xml @@ -84,7 +84,7 @@ Available targets:

        - + Figure
        Figure 1: Compilation and execution of Java classes

        - + + + + + + + + + + + + + +-------------------------------------------------------+ + | C R E A T I N G B I N A R Y D I S T R I B U T I O N | + +-------------------------------------------------------+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +-------------------------------------------------------+ + | C R E A T I N G S O U R C E D I S T R I B U T I O N | + +-------------------------------------------------------+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/default.properties b/default.properties index f395c05c..cd4447c5 100644 --- a/default.properties +++ b/default.properties @@ -6,6 +6,9 @@ # your ${user.home}/build.properties file. # ------------------------------------------------------------------- +project = bcel +version = 5.0rc1 +final.name = ${project}-${version} jakarta.site2 = ../jakarta-site2 docs.src = ./xdocs docs.dest = ./docs -- GitLab From 155734b961e36d08a3eafea830305cec780ec14d Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 20 Nov 2001 11:41:05 +0000 Subject: [PATCH 0017/1313] Unknown (non-standard) attributes may be read via user-defined factory objects that can be registered with the Attribute.addAttributeReader method. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152707 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Attribute.java | 35 ++++++++-- .../bcel/classfile/AttributeReader.java | 70 +++++++++++++++++++ 2 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 src/java/org/apache/bcel/classfile/AttributeReader.java diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index 5557fdd4..43e6ada5 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -54,8 +54,9 @@ package org.apache.bcel.classfile; * . */ -import org.apache.bcel.Constants; -import java.io.*; +import org.apache.bcel.Constants; +import java.io.*; +import java.util.HashMap; /** * Abstract super class for Attribute objects. Currently the @@ -110,7 +111,28 @@ public abstract class Attribute implements Cloneable, Node { { file.writeShort(name_index); file.writeInt(length); - } + } + + private static HashMap readers = new HashMap(); + + /** Add an Attribute reader capable of parsing (user-defined) attributes + * named "name". You should not add readers for the standard attributes + * such as "LineNumberTable", because those are handled internally. + * + * @param name the name of the attribute as stored in the class file + * @param r the reader object + */ + public static void addAttributeReader(String name, AttributeReader r) { + readers.put(name, r); + } + + /** Remove attribute reader + * + * @param name the name of the attribute as stored in the class file + */ + public static void removeAttributeReader(String name) { + readers.remove(name); + } /* Class method reads one attribute from the input data stream. * This method must not be accessible from the outside. It is @@ -155,7 +177,12 @@ public abstract class Attribute implements Cloneable, Node { // Call proper constructor, depending on `tag' switch(tag) { case Constants.ATTR_UNKNOWN: - return new Unknown(name_index, length, file, constant_pool); + AttributeReader r = (AttributeReader)readers.get(name); + + if(r != null) + return r.createAttribute(name_index, length, file, constant_pool); + else + return new Unknown(name_index, length, file, constant_pool); case Constants.ATTR_CONSTANT_VALUE: return new ConstantValue(name_index, length, file, constant_pool); diff --git a/src/java/org/apache/bcel/classfile/AttributeReader.java b/src/java/org/apache/bcel/classfile/AttributeReader.java new file mode 100644 index 00000000..b9793e4a --- /dev/null +++ b/src/java/org/apache/bcel/classfile/AttributeReader.java @@ -0,0 +1,70 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Unknown (non-standard) attributes may be read via user-defined + * factory objects that can be registered with the Attribute.addAttributeReader + * method. + * + * @see Attribute + * @version $Id$ + * @author M. Dahm + */ +public interface AttributeReader { + public Attribute createAttribute(int name_index, int length, + java.io.DataInputStream file, + ConstantPool constant_pool); +} -- GitLab From 16aa6c1f5d02cdfffebc02d426ee9a0c4d58f784 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 22 Nov 2001 14:20:57 +0000 Subject: [PATCH 0018/1313] Did some reworking on the manual git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152708 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/faq.xml | 10 +- xdocs/manual.xml | 473 +++++++++++++++++----------------- xdocs/projects.xml | 8 +- xdocs/stylesheets/project.xml | 1 + 4 files changed, 247 insertions(+), 245 deletions(-) diff --git a/xdocs/faq.xml b/xdocs/faq.xml index 6fe6d720..bbcd81b5 100644 --- a/xdocs/faq.xml +++ b/xdocs/faq.xml @@ -28,7 +28,7 @@

        - Q: (Typically for users of XSLTC) I'm getting + Q: (Typically for users of Xalan (XSLTC)) I'm getting

             ...
        @@ -47,11 +47,11 @@
             

        - Q: Can I create or modify classes dynamically with BCEL? + Q: Can I create or modify classes dynamically with BCEL?
        - A: Since 4.4.0 BCEL contains useful classes in the - util package, namely ClassLoader and - JavaWrapper. Take a look at the ProxyCreator example. + A: BCEL contains useful classes in the + util package, namely ClassLoader and + JavaWrapper. Take a look at the ProxyCreator example.

        diff --git a/xdocs/manual.xml b/xdocs/manual.xml index bf176d34..4f69dbe8 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -3,347 +3,344 @@ Markus Dahm - Byte Code Engineering Library (BCEL) v1 + Byte Code Engineering Library (BCEL)

        - Extensions and improvements of the programming language Java and its - related execution environment (Java Virtual Machine, JVM) are the - subject of a large number of research projects and proposals. There - are projects, for instance, to add parameterized types to Java, to - implement ``Aspect-Oriented Programming'', to perform sophisticated - static analysis, and to improve the run-time performance. + Extensions and improvements of the programming language Java and + its related execution environment (Java Virtual Machine, JVM) are + the subject of a large number of research projects and + proposals. There are projects, for instance, to add parameterized + types to Java, to implement Aspect-Oriented Programming, to + perform sophisticated static analysis, and to improve the run-time + performance.

        - Since Java classes are compiled into portable binary class files - (called byte code), it is the most convenient and - platform-independent way to implement these improvements not by - writing a new compiler or changing the JVM, but by transforming the - byte code. These transformations can either be performed after - compile-time, or at load-time. Many programmers are doing this by - implementing their own specialized byte code manipulation tools, which - are, however, restricted in the range of their re-usability. + Since Java classes are compiled into portable binary class files + (called byte code), it is the most convenient and + platform-independent way to implement these improvements not by + writing a new compiler or changing the JVM, but by transforming + the byte code. These transformations can either be performed + after compile-time, or at load-time. Many programmers are doing + this by implementing their own specialized byte code manipulation + tools, which are, however, restricted in the range of their + re-usability.

        - To deal with the necessary class file transformations, we introduce an - API that helps developers to conveniently implement their - transformations. + To deal with the necessary class file transformations, we + introduce an API that helps developers to conveniently implement + their transformations.

        -
        +

        - The Java language [] has become very popular and many - research projects deal with further improvements of the language or - its run-time behavior. The possibility to extend a language with new - concepts is surely a desirable feature, but implementation issues - should be hidden from the user. Fortunately, the concepts of the Java Virtual Machine - permit the user-transparent implementation of such extensions with + The Java language has become + very popular and many research projects deal with further + improvements of the language or its run-time behavior. The + possibility to extend a language with new concepts is surely a + desirable feature, but the implementation issues should be hidden from + the user. Fortunately, the concepts of the Java Virtual Machine + permit the user-transparent implementation of such extensions with relatively little effort.

        - Because the target language of Java is an interpreted language with a - small and easy-to-understand set of instructions (the byte - code), developers can implement and test their concepts in a very - elegant way. One can write a plug-in replacement for the system's - class loader which is responsible for dynamically loading class files - at run-time and passing the byte code to the Virtual Machine (see section - ). Class loaders may thus be used to intercept - the loading process and transform classes before they get actually - executed by the JVM []. While the original class - files always remain unaltered, the behavior of the class loader may be - reconfigured for every execution or instrumented dynamically. + Because the target language of Java is an interpreted language + with a small and easy-to-understand set of instructions (the + byte code), developers can implement and test their + concepts in a very elegant way. One can write a plug-in + replacement for the system's class loader which is + responsible for dynamically loading class files at run-time and + passing the byte code to the Virtual Machine (see section ). + Class loaders may thus be used to intercept the loading process + and transform classes before they get actually executed by the + JVM. While the original class files always remain unaltered, the + behavior of the class loader may be reconfigured for every + execution or instrumented dynamically.

        - The BCEL API (Byte Code Engineering Library), formerly known as - JavaClass, is a toolkit for the static analysis and dynamic creation - or transformation of Java class files. It enables developers to - implement the desired features on a high level of abstraction without - handling all the internal details of the Java class file format and - thus re-inventing the wheel every time. BCEL is written entirely in - Java and freely available under the terms of the Apache Software - License. + The BCEL API (Byte Code + Engineering Library), formerly known as JavaClass, is a toolkit + for the static analysis and dynamic creation or transformation of + Java class files. It enables developers to implement the desired + features on a high level of abstraction without handling all the + internal details of the Java class file format and thus + re-inventing the wheel every time. BCEL + is written entirely in Java and freely available under the + terms of the Apache Software License.

        - This paper is structured as follows: We give a brief description of - the Java Virtual Machine and the class file format in section . Section - introduces the BCEL API. Section - describes some typical application areas and example projects. The - appendix contains code examples that are to long to be presented in - the main part of this paper. All examples are included in the - down-loadable distribution. + This manual is structured as follows: We give a brief description + of the Java Virtual Machine and the class file format in section 2. Section 3 introduces the BCEL API. Section 4 describes some typical application areas and + example projects. The appendix contains code examples that are to + long to be presented in the main part of this paper. All examples + are included in the down-loadable distribution.

        -
        +

        - There are a number of proposals and class libraries that have some - similarities with BCEL: The JOIE [] toolkit can - be used to instrument class loaders with dynamic behavior. Similarly, - ``Binary Component Adaptation'' [] allows components to be - adapted and evolved on-the-fly. Han Lee's ``Byte-code Instrumenting - Tool'' [] allows the user to insert calls to analysis methods - anywhere in the byte code. The Jasmin language [] can be - used to hand-write or generate pseudo-assembler code. D-Java - [] and JCF [] are class viewing tools. + Readers already familiar with the Java Virtual Machine and the + Java class file format may want to skip this section and proceed + with section 3.

        - In contrast to these projects, BCEL is intended - to be a general purpose - tool for ``byte code engineering''. It gives full control to the - developer on a high level of abstraction and is not restricted to any - particular application area. -

        -
        - -
        -

        - Readers already familiar with the Java Virtual Machine and the Java class file format - may want to skip this section and proceed with section . -

        - -

        - Programs written in the Java language are compiled into a portable - binary format called byte code. Every class is represented by - a single class file containing class related data and byte code - instructions. These files are loaded dynamically into an interpreter - (Java Virtual Machine, JVM) and executed. + Programs written in the Java language are compiled into a portable + binary format called byte code. Every class is + represented by a single class file containing class related data + and byte code instructions. These files are loaded dynamically + into an interpreter (Java + Virtual Machine, aka. JVM) and executed.

        - Figure illustrates the procedure of compiling and - executing a Java class: The source file (HelloWorld.java) is - compiled into a Java class file (HelloWorld.class), loaded by - the byte code interpreter and executed. In order to implement - additional features, researchers may want to transform class files - (drawn with bold lines) before they get actually executed. This - application area is one of the main issues of this article. + Figure 1 illustrates the procedure of + compiling and executing a Java class: The source file + (HelloWorld.java) is compiled into a Java class file + (HelloWorld.class), loaded by the byte code interpreter + and executed. In order to implement additional features, + researchers may want to transform class files (drawn with bold + lines) before they get actually executed. This application area + is one of the main issues of this article.

        -

        - Figure +

        +
        - Figure 1: Compilation and execution of Java classes + Figure 1: Compilation and execution of Java classes

        - Note that the use of the general term ``Java'' implies two meanings: - on the one hand, Java as a programming language is meant, on the other - hand, the Java Virtual Machine, which is not necessarily targeted by - the Java language exclusively, but may be used by other languages as - well (e.g. Eiffel [], or Ada []). We assume the - reader to be familiar with the Java language and to have a general - understanding of the Virtual Machine. + Note that the use of the general term "Java" implies in fact two + meanings: on the one hand, Java as a programming language, on the + other hand, the Java Virtual Machine, which is not necessarily + targeted by the Java language exclusively, but may be used by other + languages as well. We assume the reader to be familiar with + the Java language and to have a general understanding of the + Virtual Machine.

        - Giving a full overview of the design issues of the Java class file - format and the associated byte code instructions is beyond the scope - of this paper. We will just give a brief introduction covering the - details that are necessary for understanding the rest of this - paper. The format of class files and the byte code instruction set are - described in more detail in the ``Java Virtual Machine Specification'' [] - ,and in []. Especially, we will not deal with the security - constraints that the Java Virtual Machine has to check at run-time, i.e. the byte code - verifier. -

        - -

        - Figure shows a simplified example of the contents - of a Java class file: It starts with a header containing a ``magic - number'' (0xCAFEBABE) and the version number, followed by the - constant pool, which can be roughly thought of as the text segment of an - executable, the access rights of the class encoded by a bit - mask, a list of interfaces implemented by the class, lists containing - the fields and methods of the class, and finally the class - attributes, e.g. the SourceFile attribute telling the name - of the source file. Attributes are a way of putting additional, - e.g. user-defined, information into class file data structures. For - example, a custom class loader may evaluate such attribute data in - order to perform its transformations. The JVM specification declares - that unknown, i.e. user-defined attributes must be ignored by any Virtual Machine - implementation. -

        - -

        - Figure + Giving a full overview of the design issues of the Java class file + format and the associated byte code instructions is beyond the + scope of this paper. We will just give a brief introduction + covering the details that are necessary for understanding the rest + of this paper. The format of class files and the byte code + instruction set are described in more detail in the Java + Virtual Machine Specification. Especially, we will not deal + with the security constraints that the Java Virtual Machine has to + check at run-time, i.e. the byte code verifier. +

        + +

        + Figure 2 shows a simplified example of the + contents of a Java class file: It starts with a header containing + a "magic number" (0xCAFEBABE) and the version number, + followed by the constant pool, which can be roughly + thought of as the text segment of an executable, the access + rights of the class encoded by a bit mask, a list of + interfaces implemented by the class, lists containing the fields + and methods of the class, and finally the class + attributes, e.g., the SourceFile attribute telling + the name of the source file. Attributes are a way of putting + additional, user-defined information into class file data + structures. For example, a custom class loader may evaluate such + attribute data in order to perform its transformations. The JVM + specification declares that unknown, i.e., user-defined attributes + must be ignored by any Virtual Machine implementation. +

        + +

        +
        - Figure 2: Java class file format + Figure 2: Java class file format

        - Because all of the information needed to dynamically resolve the - symbolic references to classes, fields and methods at run-time is - coded with string constants, the constant pool contains in fact the largest - portion of an average class file, approximately 60% []. - The byte code instructions themselves just make up 12%. + Because all of the information needed to dynamically resolve the + symbolic references to classes, fields and methods at run-time is + coded with string constants, the constant pool contains in fact + the largest portion of an average class file, approximately + 60%. In fact, this makes the constant pool an easy target for code + manipulation issues. The byte code instructions themselves just + make up 12%.

        - The right upper box shows a ``zoomed'' excerpt of the constant pool, while the - rounded box below depicts some instructions that are contained within - a method of the example class. These instructions represent the - straightforward translation of the well-known statement: + The right upper box shows a "zoomed" excerpt of the constant pool, + while the rounded box below depicts some instructions that are + contained within a method of the example class. These + instructions represent the straightforward translation of the + well-known statement: +

        + +

        + System.out.println("Hello, world");

        - - - System.out.println("Hello, world"); -

        - The first instruction loads the contents of the field out of - class java.lang.System onto the operand stack. This is an - instance of the class java.io.PrintStream. The ldc - (``Load constant'') pushes a reference to the string "Hello world" on - the stack. The next instruction invokes the instance method - println which takes both values as parameters (Instance - methods always implicitly take an instance reference as their first - argument). + The first instruction loads the contents of the field out + of class java.lang.System onto the operand stack. This is + an instance of the class java.io.PrintStream. The + ldc ("Load constant") pushes a reference to the string + "Hello world" on the stack. The next instruction invokes the + instance method println which takes both values as + parameters (Instance methods always implicitly take an instance + reference as their first argument).

        - Instructions, other data structures within the class file and - constants themselves may refer to constants in the constant pool. Such - references are implemented via fixed indexes encoded directly into the - instructions. This is illustrated for some items of the figure - emphasized with a surrounding box. + Instructions, other data structures within the class file and + constants themselves may refer to constants in the constant pool. + Such references are implemented via fixed indexes encoded directly + into the instructions. This is illustrated for some items of the + figure emphasized with a surrounding box.

        - For example, the invokevirtual instruction refers to a - MethodRef constant that contains information about the name - of the called method, the signature (i.e. the encoded argument and - return types), and to which class the method belongs. In fact, as - emphasized by the boxed value, the MethodRef constant itself - just refers to other entries holding the real data, e.g. it refers to - a ConstantClass entry containing a symbolic reference to the - class java.io.PrintStream. To keep the class file compact, - such constants are typically shared by different instructions. - Similarly, a field is represented by a Fieldref constant that - includes information about the name, the type and the containing class - of the field. + For example, the invokevirtual instruction refers to a + MethodRef constant that contains information about the + name of the called method, the signature (i.e., the encoded + argument and return types), and to which class the method belongs. + In fact, as emphasized by the boxed value, the MethodRef + constant itself just refers to other entries holding the real + data, e.g., it refers to a ConstantClass entry containing + a symbolic reference to the class java.io.PrintStream. + To keep the class file compact, such constants are typically + shared by different instructions and other constant pool + entries. Similarly, a field is represented by a Fieldref + constant that includes information about the name, the type and + the containing class of the field.

        - The constant pool basically holds the following types of constants: References - to methods, fields and classes, strings, integers, floats, longs, and - doubles. + The constant pool basically holds the following types of + constants: References to methods, fields and classes, strings, + integers, floats, longs, and doubles.

        - The JVM is a stack-oriented interpreter that creates a local stack - frame of fixed size for every method invocation. The size of the local - stack has to be computed by the compiler. Values may also be stored - intermediately in a frame area containing local variables which - can be used like a set of registers. These local variables are - numbered from 0 to 65535, i.e. you have a maximum of 65536 of local - variables. The stack frames of caller and callee method are - overlapping, i.e. the caller pushes arguments onto the operand stack - and the called method receives them in local variables. + The JVM is a stack-oriented interpreter that creates a local stack + frame of fixed size for every method invocation. The size of the + local stack has to be computed by the compiler. Values may also be + stored intermediately in a frame area containing local + variables which can be used like a set of registers. These + local variables are numbered from 0 to 65535, i.e., you have a + maximum of 65536 of local variables per method. The stack frames + of caller and callee method are overlapping, i.e., the caller + pushes arguments onto the operand stack and the called method + receives them in local variables.

        - The byte code instruction set currently consists of 212 instructions, - 44 opcodes are marked as reserved and may be used for future - extensions or intermediate optimizations within the Virtual - Machine. The instruction set can be roughly grouped as follows: + The byte code instruction set currently consists of 212 + instructions, 44 opcodes are marked as reserved and may be used + for future extensions or intermediate optimizations within the + Virtual Machine. The instruction set can be roughly grouped as + follows:

        - Stack operations: - Constants can be pushed onto the stack either - by loading them from the constant pool with the ldc instruction or with - special ``short-cut'' instructions where the operand is encoded into - the instructions, e.g. iconst_0 or bipush (push - byte value). + Stack operations: Constants can be pushed onto the stack + either by loading them from the constant pool with the + ldc instruction or with special "short-cut" + instructions where the operand is encoded into the instructions, + e.g., iconst_0 or bipush (push byte value).

        - Arithmetic operations: - The instruction set of the Java Virtual Machine - distinguishes its operand types using different instructions to - operate on values of specific type. Arithmetic operations starting - with i, for example, denote an integer operation. E.g., - iadd that adds two integers and pushes the result back on the - stack. The Java types boolean, byte, - short, and char are handled as integers by the JVM. + Arithmetic operations: The instruction set of the Java + Virtual Machine distinguishes its operand types using different + instructions to operate on values of specific type. Arithmetic + operations starting with i, for example, denote an + integer operation. E.g., iadd that adds two integers + and pushes the result back on the stack. The Java types + boolean, byte, short, and + char are handled as integers by the JVM.

        - Control flow: - There are branch instructions like goto - and if_icmpeq, which compares two integers for - equality. There is also a jsr (jump sub-routine) and - ret pair of instructions that is used to implement the - finally clause of try-catch blocks. Exceptions may - be thrown with the athrow instruction. - Branch targets are coded as offsets from the current byte code - position, i.e. with an integer number. + Control flow: There are branch instructions like + goto, and if_icmpeq, which compares two integers + for equality. There is also a jsr (jump sub-routine) + and ret pair of instructions that is used to implement + the finally clause of try-catch blocks. + Exceptions may be thrown with the athrow instruction. + Branch targets are coded as offsets from the current byte code + position, i.e., with an integer number.

        - Load and store operations - for local variables like - iload and istore. There are also array operations - like iastore which stores an integer value into an array. + Load and store operations for local variables like + iload and istore. There are also array + operations like iastore which stores an integer value + into an array.

        - Field access: - The value of an instance field may be retrieved - with getfield and written with putfield. For static - fields, there are getstatic and putstatic - counterparts. + Field access: The value of an instance field may be + retrieved with getfield and written with + putfield. For static fields, there are + getstatic and putstatic counterparts.

        - Method invocation: - Methods may either be called via static - references with invokestatic or be bound virtually with the - invokevirtual instruction. Super class methods and private - methods are invoked with invokespecial. + Method invocation: Static Methods may either be called via + invokestatic or be bound virtually with the + invokevirtual instruction. Super class methods and + private methods are invoked with invokespecial. A + special case are interface methods which are invoked with + invokeinterface.

        - Object allocation: - Class instances are allocated with the - new instruction, arrays of basic type like int[] - with newarray, arrays of references like String[][] - with anewarray or multianewarray. + Object allocation: Class instances are allocated with the + new instruction, arrays of basic type like + int[] with newarray, arrays of references like + String[][] with anewarray or + multianewarray.

        - Conversion and type checking: - For stack operands of basic type - there exist casting operations like f2i which converts a - float value into an integer. The validity of a type cast may be - checked with checkcast and the instanceof operator - can be directly mapped to the equally named instruction. + Conversion and type checking: For stack operands of basic + type there exist casting operations like f2i which + converts a float value into an integer. The validity of a type + cast may be checked with checkcast and the + instanceof operator can be directly mapped to the + equally named instruction.

        - Most instructions have a fixed length, but there are also some - variable-length instructions: In particular, the lookupswitch - and tableswitch instructions, which are used to implement - switch() statements. Since the number of case - clauses may vary, these instructions contain a variable number of - statements. + Most instructions have a fixed length, but there are also some + variable-length instructions: In particular, the + lookupswitch and tableswitch instructions, which + are used to implement switch() statements. Since the + number of case clauses may vary, these instructions + contain a variable number of statements.

        @@ -419,7 +416,7 @@ Classes and arrays are internally represented by strings like "java/lang/String", basic types like float by an integer number. Within signatures they are represented by single - characters, e.g., Ï", for integer. + characters, e.g., Ï, for integer.

        diff --git a/xdocs/projects.xml b/xdocs/projects.xml index da042fbc..7cb0a666 100644 --- a/xdocs/projects.xml +++ b/xdocs/projects.xml @@ -33,8 +33,7 @@ code optimization -
      • - Gretel - Residual Test Coverage Tool +
      • Gretel - Residual Test Coverage Tool
      • @@ -69,6 +68,11 @@ >Sally: Simple Aspect Language
      • +
      • AspectJ: Aspect-oriented Java +
      • +
      • Brakes: Thread serialization diff --git a/xdocs/stylesheets/project.xml b/xdocs/stylesheets/project.xml index 2d2d4f9b..5b827764 100644 --- a/xdocs/stylesheets/project.xml +++ b/xdocs/stylesheets/project.xml @@ -26,6 +26,7 @@ +
      • -- GitLab From 2d30047d07b492c01ee759e680594c16c7c83fbd Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 26 Nov 2001 14:00:51 +0000 Subject: [PATCH 0019/1313] eben more reworking and additions git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152709 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/manual.xml | 693 +++++++++++++++++++++++++---------------------- 1 file changed, 366 insertions(+), 327 deletions(-) diff --git a/xdocs/manual.xml b/xdocs/manual.xml index 4f69dbe8..16298d15 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -2,7 +2,7 @@ - Markus Dahm + Markus Dahm Byte Code Engineering Library (BCEL) @@ -45,10 +45,10 @@ very popular and many research projects deal with further improvements of the language or its run-time behavior. The possibility to extend a language with new concepts is surely a - desirable feature, but the implementation issues should be hidden from - the user. Fortunately, the concepts of the Java Virtual Machine - permit the user-transparent implementation of such extensions with - relatively little effort. + desirable feature, but the implementation issues should be hidden + from the user. Fortunately, the concepts of the Java Virtual + Machine permit the user-transparent implementation of such + extensions with relatively little effort.

        @@ -121,9 +121,10 @@

        +
        -
        Figure 1: Compilation and execution of Java classes + Figure 1: Compilation and execution of Java classes

        @@ -172,9 +173,10 @@

        +
        -
        Figure 2: Java class file format + Figure 2: Java class file format

        @@ -286,7 +288,7 @@

        Control flow: There are branch instructions like goto, and if_icmpeq, which compares two integers - for equality. There is also a jsr (jump sub-routine) + for equality. There is also a jsr (jump to sub-routine) and ret pair of instructions that is used to implement the finally clause of try-catch blocks. Exceptions may be thrown with the athrow instruction. @@ -296,7 +298,7 @@

        Load and store operations for local variables like - iload and istore. There are also array + iload and istore. There are also array operations like iastore which stores an integer value into an array.

        @@ -344,119 +346,128 @@

        - We will not list all byte code instructions here, since these are - explained in detail in the JVM specification. The opcode names are - mostly self-explaining, so understanding the following code examples - should be fairly intuitive. + We will not list all byte code instructions here, since these are + explained in detail in the JVM + specification. The opcode names are mostly self-explaining, + so understanding the following code examples should be fairly + intuitive.

        - Non-abstract methods contain an attribute (Code) that holds - the following data: The maximum size of the method's stack frame, the - number of local variables and an array of byte code - instructions. Optionally, it may also contain information about the - names of local variables and source file line numbers that can be used - by a debugger. + Non-abstract (and non-native) methods contain an attribute + "Code" that holds the following data: The maximum size of + the method's stack frame, the number of local variables and an + array of byte code instructions. Optionally, it may also contain + information about the names of local variables and source file + line numbers that can be used by a debugger.

        - Whenever an exception is thrown, the JVM performs exception handling - by looking into a table of exception handlers. The table marks - handlers, i.e. pieces of code, to be responsible for exceptions of - certain types that are raised within a given area of the byte - code. When there is no appropriate handler the exception is propagated - back to the caller of the method. The handler information is itself - stored in an attribute contained within the Code attribute. + Whenever an exception is raised during execution, the JVM performs + exception handling by looking into a table of exception + handlers. The table marks handlers, i.e., code chunks, to be + responsible for exceptions of certain types that are raised within + a given area of the byte code. When there is no appropriate + handler the exception is propagated back to the caller of the + method. The handler information is itself stored in an attribute + contained within the Code attribute.

        - Targets of branch instructions like goto are encoded as - relative offsets in the array of byte codes. Exception handlers and - local variables refer to absolute addresses within the byte code. The - former contains references to the start and the end of the - try block, and to the instruction handler code. The latter - marks the range in which a local variable is valid, i.e. its scope. - This makes it difficult to insert or delete code areas on this level - of abstraction, since one has to recompute the offsets every time and - update the referring objects. We will see in section - how BCEL remedies this restriction. + Targets of branch instructions like goto are encoded as + relative offsets in the array of byte codes. Exception handlers + and local variables refer to absolute addresses within the byte + code. The former contains references to the start and the end of + the try block, and to the instruction handler code. The + latter marks the range in which a local variable is valid, i.e., + its scope. This makes it difficult to insert or delete code areas + on this level of abstraction, since one has to recompute the + offsets every time and update the referring objects. We will see + in section 3.3 how BCEL remedies this restriction.

        -

        - Java is a type-safe language and the information about the types of - fields, local variables, and methods is stored in - signatures. These are strings stored in the constant pool and encoded in - a special format. For example the argument and return types of the - main method + Java is a type-safe language and the information about the types + of fields, local variables, and methods is stored in so called + signatures. These are strings stored in the constant pool + and encoded in a special format. For example the argument and + return types of the main method

        - - public static void main(String[] argv) - +

        + public static void main(String[] argv) +

        are represented by the signature

        - - ([java/lang/String;)V - +

        + ([java/lang/String;)V +

        - Classes and arrays are internally represented by strings like - "java/lang/String", basic types like float by an + Classes are internally represented by strings like + "java/lang/String", basic types like float by an integer number. Within signatures they are represented by single - characters, e.g., Ï, for integer. + characters, e.g., I, for integer. Arrays are denoted with + a [ at the start of the signature.

        - The following example program prompts for a number and prints the - faculty of it. The readLine() method reading from the - standard input may raise an IOException and if a misspelled - number is passed to parseInt() it throws a - NumberFormatException. Thus, the critical area of code must be - encapsulated in a try-catch block. + The following example program prompts for a number and prints the + faculty of it. The readLine() method reading from the + standard input may raise an IOException and if a + misspelled number is passed to parseInt() it throws a + NumberFormatException. Thus, the critical area of code + must be encapsulated in a try-catch block.

        import java.io.*; + public class Faculty { - private static BufferedReader in = new BufferedReader(new + private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - public static final int fac(int n) { + + public static final int fac(int n) { return (n == 0)? 1 : n * fac(n - 1); - } - public static final int readInt() { + } + + public static final int readInt() { int n = 4711; try { - System.out.print("Please enter a number> "); + System.out.print("Please enter a number> "); n = Integer.parseInt(in.readLine()); } catch(IOException e1) { System.err.println(e1); } catch(NumberFormatException e2) { System.err.println(e2); } return n; - } - public static void main(String[] argv) { + } + + public static void main(String[] argv) { int n = readInt(); System.out.println("Faculty of " + n + " is " + fac(n)); - }} + } + }

        - This code example typically compiles to the following chunks of byte - code: + This code example typically compiles to the following chunks of + byte code:

        @@ -475,32 +486,32 @@ LocalVariable(start_pc = 0, length = 16, index = 0:int n) -

        - The method fac has only one local variable, the argument - n, stored in slot 0. This variable's scope ranges from the - start of the byte code sequence to the very end. If the value of - n (stored in local variable 0, i.e. the value fetched with - iload_0) is not equal to 0, the ifne instruction - branches to the byte code at offset 8, otherwise a 1 is pushed onto - the operand stack and the control flow branches to the final return. - For ease of reading, the offsets of the branch instructions, which are - actually relative, are displayed as absolute addresses in these +

        fac(): + The method fac has only one local variable, the argument + n, stored at index 0. This variable's scope ranges from + the start of the byte code sequence to the very end. If the value + of n (the value fetched with iload_0) is not + equal to 0, the ifne instruction branches to the byte + code at offset 8, otherwise a 1 is pushed onto the operand stack + and the control flow branches to the final return. For ease of + reading, the offsets of the branch instructions, which are + actually relative, are displayed as absolute addresses in these examples.

        - If recursion has to continue, the arguments for the multiplication - (n and fac(n - 1)) are evaluated and the results - pushed onto the operand stack. After the multiplication operation has - been performed the function returns the computed value from the top of - the stack. + If recursion has to continue, the arguments for the multiplication + (n and fac(n - 1)) are evaluated and the results + pushed onto the operand stack. After the multiplication operation + has been performed the function returns the computed value from + the top of the stack.

        0: sipush 4711 3: istore_0 4: getstatic java.lang.System.out Ljava/io/PrintStream; - 7: ldc "Please enter a number> " + 7: ldc "Please enter a number> " 9: invokevirtual java.io.PrintStream.print (Ljava/lang/String;)V 12: getstatic Faculty.in Ljava/io/BufferedReader; 15: invokevirtual java.io.BufferedReader.readLine ()Ljava/lang/String; @@ -523,129 +534,138 @@ From To Handler Type 4 22 25 java.io.IOException(6) 4 22 36 NumberFormatException(10) - -

        - First the local variable n (in slot 0) is initialized to the - value 4711. The next instruction, getstatic, loads the - static System.out field onto the stack. Then a string is - loaded and printed, a number read from the standard input and - assigned to n. +

        readInt(): First the local variable n (at index 0) + is initialized to the value 4711. The next instruction, + getstatic, loads the referencs held by the static + System.out field onto the stack. Then a string is loaded + and printed, a number read from the standard input and assigned to + n.

        - If one of the called methods (readLine() and - parseInt()) throws an exception, the Java Virtual Machine calls one of the - declared exception handlers, depending on the type of the exception. - The try-clause itself does not produce any code, it merely - defines the range in which the following handlers are active. In the - example the specified source code area maps to a byte code area - ranging from offset 4 (inclusive) to 22 (exclusive). If no exception - has occurred (``normal'' execution flow) the goto - instructions branch behind the handler code. There the value of - n is loaded and returned. + If one of the called methods (readLine() and + parseInt()) throws an exception, the Java Virtual Machine + calls one of the declared exception handlers, depending on the + type of the exception. The try-clause itself does not + produce any code, it merely defines the range in which the + subsequent handlers are active. In the example, the specified + source code area maps to a byte code area ranging from offset 4 + (inclusive) to 22 (exclusive). If no exception has occurred + ("normal" execution flow) the goto instructions branch + behind the handler code. There the value of n is loaded + and returned.

        - For example the handler for java.io.IOException starts at - offset 25. It simply prints the error and branches back to the normal - execution flow, i.e. as if no exception had occurred. + The handler for java.io.IOException starts at + offset 25. It simply prints the error and branches back to the + normal execution flow, i.e., as if no exception had occurred.

        - The BCEL API abstracts from the concrete circumstances of the Java Virtual Machine and - how to read and write binary Java class files. The API mainly - consists of three parts: + The BCEL API abstracts from + the concrete circumstances of the Java Virtual Machine and how to + read and write binary Java class files. The API mainly consists + of three parts:

          -
        1. A package that contains classes that describe ``static'' - constraints of class files, i.e., reflect the class file format and - is not intended for byte code modifications. The classes may be +
        2. A package that contains classes that describe "static" + constraints of class files, i.e., reflects the class file format and + is not intended for byte code modifications. The classes may be used to read and write class files from or to a file. This is useful especially for analyzing Java classes without having the source files at hand. The main data structure is called JavaClass which contains methods, fields, etc..
        3. -
        4. A package to dynamically generate or modify JavaClass - objects. It may be used e.g. to insert analysis code, to strip - unnecessary information from class files, or to implement the code - generator back-end of a Java compiler.
        5. - -
        6. Various code examples and utilities like a class file viewer, a - tool to convert class files into HTML, and a converter from class - files to the Jasmin assembly language [].
        7. +
        8. A package to dynamically generate or modify + JavaClass or Method objects. It may be used to + insert analysis code, to strip unnecessary information from class + files, or to implement the code generator back-end of a Java + compiler.
        9. + +
        10. Various code examples and utilities like a class file viewer, + a tool to convert class files into HTML, and a converter from + class files to the Jasmin assembly + language.

        -

        - The ``static'' component of the BCEL API resides in the package - and represents class files. All of the - binary components and data structures declared in the JVM - specification [] and described in section 2 are - mapped to classes. Figure shows an UML diagram of the - hierarchy of classes of the BCEL API. Figure in the - appendix also shows a detailed diagram of the ConstantPool - components. + The "static" component of the BCEL API resides in the package + org.apache.bcel.classfile and closely represents class + files. All of the binary components and data structures declared + in the JVM + specification and described in section 2 are mapped to classes. + + Figure 3 shows an UML + diagram of the hierarchy of classes of the BCEL API. Figure TODO in the appendix also + shows a detailed diagram of the ConstantPool components.

        -

        - Figure -
        - Figure 3: UML diagram for the BCELAPI +

        + +
        + Figure 3: UML diagram for the JavaClass API

        - The top-level data structure is JavaClass, which in most - cases is created by a ClassParser object that is capable - of parsing binary class files. A JavaClass object basically - consists of fields, methods, symbolic references to the super class - and to the implemented interfaces. + The top-level data structure is JavaClass, which in most + cases is created by a ClassParser object that is capable + of parsing binary class files. A JavaClass object + basically consists of fields, methods, symbolic references to the + super class and to the implemented interfaces.

        - The constant pool serves as some kind of central repository and is thus of - outstanding importance for all components. ConstantPool - objects contain an array of fixed size of Constant entries, - which may be retrieved via the getConstant() method taking an - integer index as argument. Indexes to the constant pool may be contained in - instructions as well as in other components of a class file and in constant pool + The constant pool serves as some kind of central repository and is + thus of outstanding importance for all components. + ConstantPool objects contain an array of fixed size of + Constant entries, which may be retrieved via the + getConstant() method taking an integer index as argument. + Indexes to the constant pool may be contained in instructions as + well as in other components of a class file and in constant pool entries themselves.

        - Methods and fields contain a signature, symbolically defining their - types. Access flags like public static final occur in - several places and are encoded by an integer bit mask, e.g. + Methods and fields contain a signature, symbolically defining + their types. Access flags like public static final occur + in several places and are encoded by an integer bit mask, e.g., public static final matches to the Java expression

        - - int access_flags = ACC_PUBLIC | ACC_STATIC | ACC_FINAL; - + int access_flags = ACC_PUBLIC | ACC_STATIC | ACC_FINAL;

        - As mentioned in section 2.1 already, several components - may contain attribute objects: classes, fields, methods, and - Code objects (introduced in section 2.3). The + As mentioned in section + 2.1 already, several components may contain attribute + objects: classes, fields, methods, and Code objects + (introduced in section 2.3). The latter is an attribute itself that contains the actual byte code - array, the maximum stack size, the number of local variables, a table - of handled exceptions, and some optional debugging information coded - as LineNumberTable and LocalVariableTable - attributes. Attributes are in general specific to some data structure, - i.e. no two components share the same kind of attribute, though this - is not explicitly forbidden. In the figure the Attribute - classes are marked with the component they belong to. + array, the maximum stack size, the number of local variables, a + table of handled exceptions, and some optional debugging + information coded as LineNumberTable and + LocalVariableTable attributes. Attributes are in general + specific to some data structure, i.e., no two components share the + same kind of attribute, though this is not explicitly + forbidden. In the figure the Attribute classes are stereotyped + with the component they belong to.

        @@ -656,9 +676,7 @@ a JavaClass object is quite simple:

        - - JavaClass clazz = Repository.lookupClass("java.lang.String"); - + JavaClass clazz = Repository.lookupClass("java.lang.String");

        The repository also contains methods providing the dynamic equivalent @@ -668,19 +686,18 @@ if(Repository.instanceOf(clazz, super_class) { ... - } - + }

        - Information within the class file components may be accessed like Java - Beans via intuitive set/get methods. All of them also define a - toString() method so that implementing a simple class viewer - is very easy. In fact all of the examples used here have been produced - this way: + Information within the class file components may be accessed like + Java Beans via intuitive set/get methods. All of them also define + a toString() method so that implementing a simple class + viewer is very easy. In fact all of the examples used here have + been produced this way:

        @@ -702,32 +719,35 @@

        - Last but not least, BCEL supports the Visitor design - pattern [], so one can write visitor objects to traverse - and analyze the contents of a class file. Included in the distribution - is a class JasminVisitor that converts class files into the - Jasmin assembler language []. + Last but not least, BCEL + supports the Visitor design pattern, so one can write + visitor objects to traverse and analyze the contents of a class + file. Included in the distribution is a class + JasminVisitor that converts class files into the Jasmin + assembler language.

        - This part of the API (package ) supplies - an abstraction level for creating or transforming class files - dynamically. It makes the static constraints of Java class files like - the hard-coded byte code addresses generic. The generic constant pool, for - example, is implemented by the class ConstantPoolGen which - offers methods for adding different types of constants. Accordingly, - ClassGen offers an interface to add methods, fields, and - attributes. Figure gives an overview of this part of - the API. + This part of the API (package org.apache.bcel.generic) + supplies an abstraction level for creating or transforming class + files dynamically. It makes the static constraints of Java class + files like the hard-coded byte code addresses "generic". The + generic constant pool, for example, is implemented by the class + ConstantPoolGen which offers methods for adding different + types of constants. Accordingly, ClassGen offers an + interface to add methods, fields, and attributes. + Figure 4 gives an overview of this part of the API.

        -

        - Figure +

        + +
        - Figure 4: UML diagram of the ClassGen API + Figure 4: UML diagram of the ClassGen API

        @@ -735,14 +755,15 @@

        We abstract from the concrete details of the type signature syntax - (see 2.5) by introducing the Type class, which is - used, for example, by methods to define their return and argument - types. Concrete sub-classes are BasicType, - ObjectType, and ArrayType which consists of the - element type and the number of dimensions. For commonly used types the - class offers some predefined constants. For example the method - signature of the main method as shown in section - 2.5 is represented by: + (see 2.5) by introducing the + Type class, which is used, for example, by methods to + define their return and argument types. Concrete sub-classes are + BasicType, ObjectType, and ArrayType + which consists of the element type and the number of + dimensions. For commonly used types the class offers some + predefined constants. For example, the method signature of the + main method as shown in + section 2.5 is represented by:

        @@ -752,38 +773,39 @@

        Type also contains methods to convert types into textual - signatures and vice versa. The sub-classes contain implementations of - the routines and constraints specified by the Java Language - Specification []. + signatures and vice versa. The sub-classes contain implementations + of the routines and constraints specified by the Java Language + Specification.

        -

        - Fields are represented by FieldGen objects, which may be - freely modified by the user. If they have the access rights - static final, i.e. are constants and of basic type, they may - optionally have an initializing value. + Fields are represented by FieldGen objects, which may be + freely modified by the user. If they have the access rights + static final, i.e., are constants and of basic type, they + may optionally have an initializing value.

        - Generic methods contain methods to add exceptions the method may - throw, local variables, and exception handlers. The latter two are - represented by user-configurable objects as well. Because exception - handlers and local variables contain references to byte code - addresses, they also take the role of an instruction targeter - in our terminology. Instruction targeters contain a method - updateTarget() to redirect a reference. Generic - (non-abstract) methods refer to instruction lists that consist - of instruction objects. References to byte code addresses are - implemented by handles to instruction objects. This is explained in - more detail in the following sections. + Generic methods contain methods to add exceptions the method may + throw, local variables, and exception handlers. The latter two are + represented by user-configurable objects as well. Because + exception handlers and local variables contain references to byte + code addresses, they also take the role of an instruction + targeter in our terminology. Instruction targeters contain a + method updateTarget() to redirect a reference. This is + somewhat related to the Observer design pattern. Generic + (non-abstract) methods refer to instruction lists that + consist of instruction objects. References to byte code addresses + are implemented by handles to instruction objects. If the list is + updated the instruction targeters will be informed about it. This + is explained in more detail in the following sections.

        - The maximum stack size needed by the method and the maximum number of - local variables used may be set manually or computed via the + The maximum stack size needed by the method and the maximum number + of local variables used may be set manually or computed via the setMaxStack() and setMaxLocals() methods automatically.

        @@ -792,57 +814,59 @@

        - Modeling instructions as objects may look somewhat odd at first sight, - but in fact enables programmers to obtain a high-level view upon - control flow without handling details like concrete byte code offsets. - Instructions consist of a tag, i.e. an opcode, their length in bytes - and an offset (or index) within the byte code. Since many instructions - are immutable, the InstructionConstants interface offers - shareable predefined ``fly-weight'' constants to use. + Modeling instructions as objects may look somewhat odd at first + sight, but in fact enables programmers to obtain a high-level view + upon control flow without handling details like concrete byte code + offsets. Instructions consist of an opcode (sometimes called + tag), their length in bytes and an offset (or index) within the + byte code. Since many instructions are immutable (stack operators, + e.g.), the InstructionConstants interface offers + shareable predefined "fly-weight" constants to use.

        Instructions are grouped via sub-classing, the type hierarchy of - instruction classes is illustrated by (incomplete) figure - in the appendix. The most important family of - instructions are the branch instructions, e.g. goto, - that branch to targets somewhere within the byte code. Obviously, - this makes them candidates for playing an InstructionTargeter - role, too. Instructions are further grouped by the interfaces they + instruction classes is illustrated by (incomplete) figure in the + appendix. The most important family of instructions are the + branch instructions, e.g., goto, that branch to + targets somewhere within the byte code. Obviously, this makes them + candidates for playing an InstructionTargeter role, + too. Instructions are further grouped by the interfaces they implement, there are, e.g., TypedInstructions that are associated with a specific type like ldc, or - ExceptionThrower instructions that may raise exceptions when - executed. + ExceptionThrower instructions that may raise exceptions + when executed.

        - All instructions can be traversed via accept(Visitor v) methods, - i.e., the Visitor design pattern. There is however some special trick - in these methods that allows to merge the handling of certain - instruction groups. The accept() do not only call the - corresponding visit() method, but call visit() - methods of their respective super classes and implemented interfaces - first, i.e. the most specific visit() call is last. Thus one - can group the handling of, say, all BranchInstructions into - one single method. + All instructions can be traversed via accept(Visitor v) + methods, i.e., the Visitor design pattern. There is however some + special trick in these methods that allows to merge the handling + of certain instruction groups. The accept() do not only + call the corresponding visit() method, but call + visit() methods of their respective super classes and + implemented interfaces first, i.e., the most specific + visit() call is last. Thus one can group the handling of, + say, all BranchInstructions into one single method.

        - For debugging purposes it may even make sense to ``invent'' your own - instructions. In a sophisticated code generator like the one used as a - backend of the Barat framework [] one often has to insert - temporary nop (No operation) instructions. When examining - the produced code it may be very difficult to track back where the - nop was actually inserted. One could think of a derived - nop2 instruction that contains additional debugging - information. When the instruction list is dumped to byte code, the + For debugging purposes it may even make sense to "invent" your own + instructions. In a sophisticated code generator like the one used + as a backend of the Barat + framework for static analysis one often has to insert + temporary nop (No operation) instructions. When examining + the produced code it may be very difficult to track back where the + nop was actually inserted. One could think of a derived + nop2 instruction that contains additional debugging + information. When the instruction list is dumped to byte code, the extra data is simply dropped.

        - One could also think of new byte code instructions operating on - complex numbers that are replaced by normal byte code upon load-time - or are recognized by a new JVM. + One could also think of new byte code instructions operating on + complex numbers that are replaced by normal byte code upon + load-time or are recognized by a new JVM.

        @@ -853,23 +877,24 @@ instruction handles encapsulating instruction objects. References to instructions in the list are thus not implemented by direct pointers to instructions but by pointers to instruction - handles. This makes appending, inserting and deleting areas of - code very simple. Since we use symbolic references, computation of - concrete byte code offsets does not need to occur until finalization, - i.e. until the user has finished the process of generating or - transforming code. We will use the term instruction handle and - instruction synonymously throughout the rest of the paper. - Instruction handles may contain additional user-defined data using the - addAttribute() method. + handles. This makes appending, inserting and deleting + areas of code very simple and also allows us to reuse immutable + instruction objects (fly-weight objects). Since we use symbolic + references, computation of concrete byte code offsets does not + need to occur until finalization, i.e., until the user has + finished the process of generating or transforming code. We will + use the term instruction handle and instruction synonymously + throughout the rest of the paper. Instruction handles may contain + additional user-defined data using the addAttribute() + method.

        - Appending - One can append instructions or other instruction lists anywhere to an - existing list. The instructions are appended after the given - instruction handle. All append methods return a new instruction - handle which may then be used as the target of a branch instruction, - e.g.. + Appending: One can append instructions or other instruction + lists anywhere to an existing list. The instructions are appended + after the given instruction handle. All append methods return a + new instruction handle which may then be used as the target of a + branch instruction, e.g.:

        @@ -878,16 +903,17 @@ GOTO g = new GOTO(null); il.append(g); ... + // Use immutable fly-weight object InstructionHandle ih = il.append(InstructionConstants.ACONST_NULL); g.setTarget(ih);

        - Inserting - Instructions may be inserted anywhere into an existing list. They are - inserted before the given instruction handle. All insert methods - return a new instruction handle which may then be used as the start - address of an exception handler, for example. + Inserting: Instructions may be inserted anywhere into an + existing list. They are inserted before the given instruction + handle. All insert methods return a new instruction handle which + may then be used as the start address of an exception handler, for + example.

        @@ -898,16 +924,16 @@

        - Deleting - Deletion of instructions is also very straightforward; all instruction - handles and the contained instructions within a given range are - removed from the instruction list and disposed. The delete() - method may however throw a TargetLostException when there are - instruction targeters still referencing one of the deleted - instructions. The user is forced to handle such exceptions in a - try-catch block and redirect these references elsewhere. The - peep hole optimizer described in section gives a - detailed example for this. + Deleting: Deletion of instructions is also very + straightforward; all instruction handles and the contained + instructions within a given range are removed from the instruction + list and disposed. The delete() method may however throw + a TargetLostException when there are instruction + targeters still referencing one of the deleted instructions. The + user is forced to handle such exceptions in a try-catch + clause and redirect these references elsewhere. The peep + hole optimizer described in the appendix gives a detailed + example for this.

        @@ -924,13 +950,13 @@

        - Finalizing - When the instruction list is ready to be dumped to pure byte code, all - symbolic references must be mapped to real byte code offsets. This is - done by the getByteCode() method which is called by default - by MethodGen.getMethod(). Afterwards you should call + Finalizing: When the instruction list is ready to be dumped + to pure byte code, all symbolic references must be mapped to real + byte code offsets. This is done by the getByteCode() + method which is called by default by + MethodGen.getMethod(). Afterwards you should call dispose() so that the instruction handles can be reused - internally. This helps to reduce memory usage. + internally. This helps to improve memory usage.

        @@ -953,78 +979,91 @@

        - Using instruction lists gives us a generic view upon the code: In - Figure we again present the code chunk of the - readInt() method of the faculty example in section - 2.6: The local variables n and e1 both - hold two references to instructions, defining their scope. There are - two gotos branching to the iload at the end of the - method. One of the exception handlers is displayed, too: it references - the start and the end of the try block and also the exception + Using instruction lists gives us a generic view upon the code: In + Figure 5 we again present the code chunk + of the readInt() method of the faculty example in section + 2.6: The local variables + n and e1 both hold two references to + instructions, defining their scope. There are two gotos + branching to the iload at the end of the method. One of + the exception handlers is displayed, too: it references the start + and the end of the try block and also the exception handler code.

        -

        - Figure +

        + +
        - Figure 5: Instruction list for readInt() method + Figure 5: Instruction list for readInt() method

        - To simplify the creation of certain instructions the user can use the - supplied InstructionFactory class which offers a lot of - useful methods to create instructions from scratch. Alternatively, he - can also use compound instructions: When producing byte code, - some patterns typically occur very frequently, for instance the - compilation of arithmetic or comparison expressions. You certainly do - not want to rewrite the code that translates such expressions into - byte code in every place they may appear. In order to support this, - the BCEL API includes a compound instruction (an interface with - a single getInstructionList() method). Instances of this - class may be used in any place where normal instructions would occur, + To simplify the creation of certain instructions the user can use + the supplied InstructionFactory class which offers a lot + of useful methods to create instructions from + scratch. Alternatively, he can also use compound + instructions: When producing byte code, some patterns + typically occur very frequently, for instance the compilation of + arithmetic or comparison expressions. You certainly do not want + to rewrite the code that translates such expressions into byte + code in every place they may appear. In order to support this, the + BCEL API includes a compound + instruction (an interface with a single + getInstructionList() method). Instances of this class + may be used in any place where normal instructions would occur, particularly in append operations.

        - Example: Pushing constants - Pushing constants onto the operand stack may be coded in different - ways. As explained in section 2.2 there are some - ``short-cut'' instructions that can be used to make the produced byte - code more compact. The smallest instruction to push a single - 1 onto the stack is iconst_1, other possibilities - are bipush (can be used to push values between -128 and 127), - sipush (between -32768 and 32767), or ldc (load - constant from constant pool). + Example: Pushing constants Pushing constants onto the + operand stack may be coded in different ways. As explained in section 2.2 there are + some "short-cut" instructions that can be used to make the + produced byte code more compact. The smallest instruction to push + a single 1 onto the stack is iconst_1, other + possibilities are bipush (can be used to push values + between -128 and 127), sipush (between -32768 and 32767), + or ldc (load constant from constant pool).

        - Instead of repeatedly selecting the most compact instruction in, say, - a switch, one can use the compound PUSH instruction whenever - pushing a constant number or string. It will produce the appropriate - byte code instruction and insert entries into to constant pool if necessary. + Instead of repeatedly selecting the most compact instruction in, + say, a switch, one can use the compound PUSH instruction + whenever pushing a constant number or string. It will produce the + appropriate byte code instruction and insert entries into to + constant pool if necessary.

        + InstructionFactory f = new InstructionFactory(class_gen); + InstructionList il = new InstructionList(); + ... il.append(new PUSH(cp, "Hello, world")); il.append(new PUSH(cp, 4711)); + ... + il.append(f.createPrintln("Hello World")); + ... + il.append(f.createReturn(type));

        - When transforming code, for instance during optimization or when - inserting analysis method calls, one typically searches for certain - patterns of code to perform the transformation at. To simplify - handling such situations BCEL introduces a special feature: One can - search for given code patterns within an instruction list using - regular expressions. In such expressions, instructions are - represented by symbolic names, e.g. "`IfInstruction'". Meta - characters like +, *, and (..|..) have their - usual meanings. Thus, the expression + When transforming code, for instance during optimization or when + inserting analysis method calls, one typically searches for + certain patterns of code to perform the transformation at. To + simplify handling such situations BCEL + introduces a special feature: One can search for given code + patterns within an instruction list using regular + expressions. In such expressions, instructions are + represented by symbolic names, e.g. "`IfInstruction'". + Meta characters like +, *, and (..|..) + have their usual meanings. Thus, the expression

        -- GitLab From 2b764788b9c8aede5702665c2c882359d25da329 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 27 Nov 2001 12:20:08 +0000 Subject: [PATCH 0020/1313] Added appendix to manual git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152710 13f79535-47bb-0310-9956-ffa450edef68 --- docs/appendix.tex | 2 +- xdocs/manual.xml | 603 +++++++++++++++++++++++++++++++++++++--------- 2 files changed, 496 insertions(+), 109 deletions(-) diff --git a/docs/appendix.tex b/docs/appendix.tex index 26cfc74b..073f0cc0 100644 --- a/docs/appendix.tex +++ b/docs/appendix.tex @@ -50,7 +50,7 @@ symbolic type signature encoded with \texttt{Type} objects. InstructionFactory factory = new InstructionFactory(cg); \end{verbatim}} -We define some often use types: +We define some often used types: {\small\begin{verbatim} ObjectType i_stream = new ObjectType("java.io.InputStream"); diff --git a/xdocs/manual.xml b/xdocs/manual.xml index 16298d15..4f88d53b 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -1056,72 +1056,91 @@

        When transforming code, for instance during optimization or when inserting analysis method calls, one typically searches for - certain patterns of code to perform the transformation at. To - simplify handling such situations BCEL - introduces a special feature: One can search for given code - patterns within an instruction list using regular - expressions. In such expressions, instructions are - represented by symbolic names, e.g. "`IfInstruction'". - Meta characters like +, *, and (..|..) - have their usual meanings. Thus, the expression + certain patterns of code to perform the transformation at. To + simplify handling such situations BCEL introduces a special feature: + One can search for given code patterns within an instruction list + using regular expressions. In such expressions, + instructions are represented by their opcode names, e.g., + LDC, one may also use their respective super classes, e.g., + "IfInstruction". Meta characters like +, + *, and (..|..) have their usual meanings. Thus, + the expression

        - - "`NOP'+(`ILOAD__'|`ALOAD__')*" - + "NOP+(ILOAD|ALOAD)*"

        - represents a piece of code consisting of at least one NOP - followed by a possibly empty sequence of ILOAD and + represents a piece of code consisting of at least one NOP + followed by a possibly empty sequence of ILOAD and ALOAD instructions.

        - The search() method of class FindPattern gets an - instruction list and a regular expression as arguments and returns an - array describing the area of matched instructions. Additional - constraints to the matching area of instructions, which can not be - implemented via regular expressions, may be expressed via code - constraints. + The search() method of class + org.apache.bcel.util.InstructionFinder gets a regular + expression and a starting point as arguments and returns an + iterator describing the area of matched instructions. Additional + constraints to the matching area of instructions, which can not be + implemented via regular expressions, may be expressed via code + constraint objects.

        - In Java, boolean values are mapped to 1 and to 0, respectively. Thus, - the simplest way to evaluate boolean expressions is to push a 1 or a 0 - onto the operand stack depending on the truth value of the expression. - But this way, the subsequent combination of boolean expressions (with - &&, e.g) yields long chunks of code that push lots of 1s and - 0s onto the stack. + In Java, boolean values are mapped to 1 and to 0, + respectively. Thus, the simplest way to evaluate boolean + expressions is to push a 1 or a 0 onto the operand stack depending + on the truth value of the expression. But this way, the + subsequent combination of boolean expressions (with + &&, e.g) yields long chunks of code that push + lots of 1s and 0s onto the stack.

        - When the code has been finalized these chunks can be optimized with a - peep hole algorithm: An IfInstruction (e.g. the - comparison of two integers: if_icmpeq) that either produces - a 1 or a 0 on the stack and is followed by an ifne - instruction (branch if stack value - 0) may be replaced by the - IfInstruction with its branch target replaced by the target - of the ifne instruction: + When the code has been finalized these chunks can be optimized + with a peep hole algorithm: An IfInstruction + (e.g. the comparison of two integers: if_icmpeq) that + either produces a 1 or a 0 on the stack and is followed by an + ifne instruction (branch if stack value 0) may be + replaced by the IfInstruction with its branch target + replaced by the target of the ifne instruction:

        -

        - The applied code constraint object ensures that the matched code - really corresponds to the targeted expression pattern. Subsequent - application of this algorithm removes all unnecessary stack operations - and branch instructions from the byte code. If any of the deleted - instructions is still referenced by an InstructionTargeter - object, the reference has to be updated in the catch-clause. -

        + + CodeConstraint constraint = new CodeConstraint() { + public boolean checkCode(InstructionHandle[] match) { + IfInstruction if1 = (IfInstruction)match[0].getInstruction(); + GOTO g = (GOTO)match[2].getInstruction(); + return (if1.getTarget() == match[3]) && + (g.getTarget() == match[4]); + } + }; + + InstructionFinder f = new InstructionFinder(il); + String pat = "IfInstruction ICONST_0 GOTO ICONST_1 NOP(IFEQ|IFNE)"; + + for(Iterator e = f.search(pat, constraint); e.hasNext(); ) { + InstructionHandle[] match = (InstructionHandle[])e.next();; + ... + match[0].setTarget(match[5].getTarget()); // Update target + ... + try { + il.delete(match[1], match[5]); + } catch(TargetLostException e) { ... } + } +

        - Code example gives a verbose example of how to create - a class file, while example shows how to implement a - simple peephole optimizer and how to deal with TargetLost - exceptions. + The applied code constraint object ensures that the matched code + really corresponds to the targeted expression pattern. Subsequent + application of this algorithm removes all unnecessary stack + operations and branch instructions from the byte code. If any of + the deleted instructions is still referenced by an + InstructionTargeter object, the reference has to be + updated in the catch-clause.

        @@ -1135,105 +1154,161 @@

        - can be mapped to both of the chunks of byte code shown in figure - . The left column represents the unoptimized code while - the right column displays the same code after an aggressively - optimizing peep hole algorithm has been applied: + can be mapped to both of the chunks of byte code shown in figure 6. The left column represents the + unoptimized code while the right column displays the same code + after the peep hole algorithm has been applied:

        -

        - FIX ME! +

        + + + + + +
        +5:  aload_0
        +6:  ifnull        #13
        +9:  iconst_0
        +10: goto          #14
        +13: iconst_1
        +14: nop
        +15: ifne          #36
        +18: iload_1
        +19: iconst_2
        +20: if_icmplt     #27
        +23: iconst_0
        +24: goto          #28
        +27: iconst_1
        +28: nop
        +29: ifne          #36
        +32: iconst_0
        +33: goto          #37
        +36: iconst_1
        +37: nop
        +38: ifeq          #52
        +41: getstatic     System.out
        +44: ldc           "Ooops"
        +46: invokevirtual println
        +52: return
        +  
        +10: aload_0
        +11: ifnull        #19
        +14: iload_1
        +15: iconst_2
        +16: if_icmpge     #27
        +19: getstatic     System.out
        +22: ldc           "Ooops"
        +24: invokevirtual println
        +27: return
        +  
        +

        - There are many possible application areas for BCEL ranging from class + There are many possible application areas for BCEL ranging from class browsers, profilers, byte code optimizers, and compilers to sophisticated run-time analysis tools and extensions to the Java - language [,]. + language.

        - Compilers like the Barat compiler [] use BCEL to implement a - byte code generating back end. Other possible application areas are - the static analysis of byte code [] or examining the - run-time behavior of classes by inserting calls to profiling methods - into the code. Further examples are extending Java with Eiffel-like - assertions [], automated delegation [], or - with the concepts of ``Aspect-Oriented Programming'' []. + Compilers like the Barat compiler use BCEL to implement a byte code + generating back end. Other possible application areas are the + static analysis of byte code or examining the run-time behavior of + classes by inserting calls to profiling methods into the + code. Further examples are extending Java with Eiffel-like + assertions, automated delegation, or with the concepts of Aspect-Oriented Programming.
        A + list of projects using BCEL can + be found here.

        - Class loaders are responsible for loading class files from the file - system or other resources and passing the byte code to the Virtual Machine - []. A custom ClassLoader object may be used - to intercept the standard procedure of loading a class, i.e. the - system class loader, and perform some transformations before actually - passing the byte code to the JVM. + Class loaders are responsible for loading class files from the + file system or other resources and passing the byte code to the + Virtual Machine. A custom ClassLoader object may be used + to intercept the standard procedure of loading a class, i.e.m the + system class loader, and perform some transformations before + actually passing the byte code to the JVM.

        - A possible scenario is described in figure : - During run-time the Virtual Machine requests a custom class loader to load a given - class. But before the JVM actually sees the byte code, the class - loader makes a ``side-step'' and performs some transformation to the - class. To make sure that the modified byte code is still valid and - does not violate any of the JVM's rules it is checked by the verifier - before the JVM finally executes it. + A possible scenario is described in figure + 7: + During run-time the Virtual Machine requests a custom class loader + to load a given class. But before the JVM actually sees the byte + code, the class loader makes a "side-step" and performs some + transformation to the class. To make sure that the modified byte + code is still valid and does not violate any of the JVM's rules it + is checked by the verifier before the JVM finally executes it.

        -

        - Figure +

        + +
        Figure 7: Class loaders -

        - -

        - Using class loaders is an elegant way of extending the Java Virtual Machine with new - features without actually modifying it. This concept enables - developers to use load-time reflection to implement their ideas - as opposed to the static reflection supported by the Java Reflection - API []. Load-time transformations supply the user with - a new level of abstraction. He is not strictly tied to the static - constraints of the original authors of the classes but may customize - the applications with third-party code in order to benefit from new - features. Such transformations may be executed on demand and neither - interfere with other users, nor alter the original byte code. In fact, - class loaders may even create classes ad hoc without loading a - file at all. + +

        + +

        + Using class loaders is an elegant way of extending the Java + Virtual Machine with new features without actually modifying it. + This concept enables developers to use load-time + reflection to implement their ideas as opposed to the static + reflection supported by the Java + Reflection API. Load-time transformations supply the user with + a new level of abstraction. He is not strictly tied to the static + constraints of the original authors of the classes but may + customize the applications with third-party code in order to + benefit from new features. Such transformations may be executed on + demand and neither interfere with other users, nor alter the + original byte code. In fact, class loaders may even create classes + ad hoc without loading a file at all.
        BCEL has already builtin support for + dynamically creating classes, an example is the ProxyCreator class.

        - The ``Poor Man's Genericity'' project [] that extends Java - with parameterized classes, for example, uses BCEL in two places to - generate instances of parameterized classes: During compile-time (the - standard javac with some slightly changed classes) and at - run-time using a custom class loader. The compiler puts some - additional type information into class files which is evaluated at - load-time by the class loader. The class loader performs some - transformations on the loaded class and passes them to the VM. The - following algorithm illustrates how the load method of the class - loader fulfills the request for a parameterized class, - e.g. Stack<String> + The "Poor + Man's Genericity" project that extends Java with parameterized + classes, for example, uses BCEL in two places to generate + instances of parameterized classes: During compile-time (with the + standard javac with some slightly changed classes) and at + run-time using a custom class loader. The compiler puts some + additional type information into class files (attributes) which is + evaluated at load-time by the class loader. The class loader + performs some transformations on the loaded class and passes them + to the VM. The following algorithm illustrates how the load method + of the class loader fulfills the request for a parameterized + class, e.g., Stack<String>

          -
        1. Search for class Stack, load it, and check for a - certain class attribute containing additional type information. I.e. - the attribute defines the ``real'' name of the class, - i.e. Stack<A>.
        2. +
        3. Search for class Stack, load it, and check for a + certain class attribute containing additional type + information. I.e. the attribute defines the "real" name of the + class, i.e., Stack<A>.
        4. -
        5. Replace all occurrences and references to the formal type - A with references to the actual type String. For +
        6. Replace all occurrences and references to the formal type + A with references to the actual type String. For example the method
        7. @@ -1254,6 +1329,318 @@

        - + +
        +
        + +
        +

        + The following program reads a name from the standard input and + prints a friendly "Hello". Since the readLine() method may + throw an IOException it is enclosed by a try-catch + clause. +

        + + + import java.io.*; + + public class HelloWorld { + public static void main(String[] argv) { + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + String name = null; + + try { + System.out.print("Please enter your name> "); + name = in.readLine(); + } catch(IOException e) { return; } + + System.out.println("Hello, " + name); + } + } + + +

        + We will sketch here how the above Java class can be created from the + scratch using the BCEL API. For + ease of reading we will use textual signatures and not create them + dynamically. For example, the signature +

        + + "(Ljava/lang/String;)Ljava/lang/StringBuffer;" + +

        + actually be created with +

        + + Type.getMethodSignature(Type.STRINGBUFFER, new Type[] { Type.STRING }); + +

        Initialization: + First we create an empty class and an instruction list: +

        + + + ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", + "<generated>", ACC_PUBLIC | ACC_SUPER, + null); + ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool + InstructionList il = new InstructionList(); + + +

        +We then create the main method, supplying the method's name and the +symbolic type signature encoded with Type objects. +

        + + + MethodGen mg = new MethodGen(ACC_STATIC | ACC_PUBLIC, // access flags + Type.VOID, // return type + new Type[] { // argument types + new ArrayType(Type.STRING, 1) }, + new String[] { "argv" }, // arg names + "main", "HelloWorld", // method, class + il, cp); + InstructionFactory factory = new InstructionFactory(cg); + + +

        + We now define some often used types: +

        + + + ObjectType i_stream = new ObjectType("java.io.InputStream"); + ObjectType p_stream = new ObjectType("java.io.PrintStream"); + + +

        Create variables in and name: We call + the constructors, i.e., execute + BufferedReader(InputStreamReader(System.in)). The reference + to the BufferedReader object stays on top of the stack and + is stored in the newly allocated in variable. +

        + + + il.append(factory.createNew("java.io.BufferedReader")); + il.append(InstructionConstants.DUP); // Use predefined constant + il.append(factory.createNew("java.io.InputStreamReader")); + il.append(InstructionConstants.DUP); + il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, + Constants.GETSTATIC)); + il.append(factory.createInvoke("java.io.InputStreamReader", "<init>", + Type.VOID, new Type[] { i_stream }, + Constants.INVOKESPECIAL)); + il.append(factory.createInvoke("java.io.BufferedReader", "<init>", Type.VOID, + new Type[] {new ObjectType("java.io.Reader")}, + Constants.INVOKESPECIAL)); + + LocalVariableGen lg = mg.addLocalVariable("in", + new ObjectType("java.io.BufferedReader"), null, null); + int in = lg.getIndex(); + lg.setStart(il.append(new ASTORE(in))); // "i" valid from here + + +

        + Create local variable name and initialize it to null. +

        + + + lg = mg.addLocalVariable("name", Type.STRING, null, null); + int name = lg.getIndex(); + il.append(InstructionConstants.ACONST_NULL); + lg.setStart(il.append(new ASTORE(name))); // "name" valid from here + + +

        Create try-catch block: We remember the start of the + block, read a line from the standard input and store it into the + variable name. +

        + + + InstructionHandle try_start = + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, + Constants.GETSTATIC)); + + il.append(new PUSH(cp, "Please enter your name> ")); + il.append(factory.createInvoke("java.io.PrintStream", "print", Type.VOID, + new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(new ALOAD(in)); + il.append(factory.createInvoke("java.io.BufferedReader", "readLine", + Type.STRING, Type.NO_ARGS, + Constants.INVOKEVIRTUAL)); + il.append(new ASTORE(name)); + + +

        + Upon normal execution we jump behind exception handler, the target + address is not known yet. +

        + + + GOTO g = new GOTO(null); + InstructionHandle try_end = il.append(g); + + +

        + We add the exception handler which simply returns from the method. +

        + + + InstructionHandle handler = il.append(InstructionConstants.RETURN); + mg.addExceptionHandler(try_start, try_end, handler, "java.io.IOException"); + + +

        + "Normal" code continues, now we can set the branch target of the GOTO. +

        + + + InstructionHandle ih = + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, + Constants.GETSTATIC)); + g.setTarget(ih); + + +

        Printing "Hello": + String concatenation compiles to StringBuffer operations. +

        + + + il.append(factory.createNew(Type.STRINGBUFFER)); + il.append(InstructionConstants.DUP); + il.append(new PUSH(cp, "Hello, ")); + il.append(factory.createInvoke("java.lang.StringBuffer", "<init>", + Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKESPECIAL)); + il.append(new ALOAD(name)); + il.append(factory.createInvoke("java.lang.StringBuffer", "append", + Type.STRINGBUFFER, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(factory.createInvoke("java.lang.StringBuffer", "toString", + Type.STRING, Type.NO_ARGS, + Constants.INVOKEVIRTUAL)); + + il.append(factory.createInvoke("java.io.PrintStream", "println", + Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(InstructionConstants.RETURN); + + + +

        Finalization: Finally, we have to set the stack size, + which normally would have to be computed on the fly and add a + default constructor method to the class, which is empty in this + case. +

        + + + mg.setMaxStack(); + cg.addMethod(mg.getMethod()); + il.dispose(); // Allow instruction handles to be reused + cg.addEmptyConstructor(ACC_PUBLIC); + + +

        + Last but not least we dump the JavaClass object to a file. +

        + + + try { + cg.getJavaClass().dump("HelloWorld.class"); + } catch(java.io.IOException e) { System.err.println(e); } + + +
        + +
        +

        + This class implements a simple peephole optimizer that removes any NOP + instructions from the given class. +

        + + +import java.io.*; + +import java.util.Iterator; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.Repository; +import org.apache.bcel.util.InstructionFinder; + +public class Peephole { + public static void main(String[] argv) { + try { + /* Load the class from CLASSPATH. + */ + JavaClass clazz = Repository.lookupClass(argv[0]); + Method[] methods = clazz.getMethods(); + ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); + + for(int i=0; i < methods.length; i++) { + if(!(methods[i].isAbstract() || methods[i].isNative())) { + MethodGen mg = new MethodGen(methods[i], + clazz.getClassName(), cp); + Method stripped = removeNOPs(mg); + + if(stripped != null) // Any NOPs stripped? + methods[i] = stripped; // Overwrite with stripped method + } + } + + /* Dump the class to "class name"_.class + */ + clazz.setConstantPool(cp.getFinalConstantPool()); + clazz.dump(clazz.getClassName() + "_.class"); + } catch(Exception e) { e.printStackTrace(); } + } + + private static final Method removeNOPs(MethodGen mg) { + InstructionList il = mg.getInstructionList(); + InstructionFinder f = new InstructionFinder(il); + String pat = "NOP+"; // Find at least one NOP + InstructionHandle next = null; + int count = 0; + + for(Iterator i = f.search(pat); i.hasNext(); ) { + InstructionHandle[] match = (InstructionHandle[])e.next(); + InstructionHandle first = match[0]; + InstructionHandle last = match[match.length - 1]; + + /* Some nasty Java compilers may add NOP at end of method. + */ + if((next = last.getNext()) == null) + break; + + count += match.length; + + /* Delete NOPs and redirect any references to them to the following + * (non-nop) instruction. + */ + try { + il.delete(first, last); + } catch(TargetLostException e) { + InstructionHandle[] targets = e.getTargets(); + for(int i=0; i < targets.length; i++) { + InstructionTargeter[] targeters = targets[i].getTargeters(); + + for(int j=0; j < targeters.length; j++) + targeters[j].updateTarget(targets[i], next); + } + } + } + + Method m = null; + + if(count > 0) { + System.out.println("Removed " + count + " NOP instructions from method " + + mg.getName()); + m = mg.getMethod(); + } + + il.dispose(); // Reuse instruction handles + return m; + } +} + +
        -- GitLab From c00fe93c5248900a26b2a9a0c79020ad01a224dd Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 27 Nov 2001 12:29:30 +0000 Subject: [PATCH 0021/1313] Added constant pool diagram git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152711 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/manual.xml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/xdocs/manual.xml b/xdocs/manual.xml index 4f88d53b..9048f2fb 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -611,9 +611,9 @@ specification and described in section 2 are mapped to classes. - Figure 3 shows an UML - diagram of the hierarchy of classes of the BCEL API. Figure TODO in the appendix also + Figure 3 shows an UML diagram of the + hierarchy of classes of the BCEL + API. Figure 8 in the appendix also shows a detailed diagram of the ConstantPool components.

        @@ -1642,5 +1642,15 @@ public class Peephole { }
        +
        + +

        + + +
        + Figure 8: UML diagram for constant pool classes +
        +

        +
        -- GitLab From 2bd26ca1099e08153cb7c99bfb9091e78a031ef2 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Wed, 28 Nov 2001 07:45:40 +0000 Subject: [PATCH 0022/1313] Improved a comment, mainly to see if CVS write access works. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152712 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/structurals/Pass3bVerifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 62373b74..642fc1e9 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -258,7 +258,7 @@ public final class Pass3bVerifier extends PassVerifier{ do{ if ((ih.getInstruction() instanceof ReturnInstruction) && (!(cfg.isDead(ih)))) { InstructionContext ic = cfg.contextOf(ih); - Frame f = ic.getOutFrame(new ArrayList()); // TODO: This is buggy, we check only the top-level return instructions this way. + Frame f = ic.getOutFrame(new ArrayList()); // TODO: This is buggy, we check only the top-level return instructions this way. Maybe some maniac returns from a method when in a subroutine? LocalVariables lvs = f.getLocals(); for (int i=0; i Date: Fri, 14 Dec 2001 18:31:18 +0000 Subject: [PATCH 0023/1313] Check clazz for null pointer first git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152713 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/ClassLoader.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/util/ClassLoader.java b/src/java/org/apache/bcel/util/ClassLoader.java index 0af6a7a0..ce45e49d 100644 --- a/src/java/org/apache/bcel/util/ClassLoader.java +++ b/src/java/org/apache/bcel/util/ClassLoader.java @@ -131,8 +131,12 @@ public class ClassLoader extends java.lang.ClassLoader { */ if(class_name.indexOf("$$BCEL$$") >= 0) clazz = createClass(class_name); - else // Fourth try: Load classes via repository - clazz = modifyClass(Repository.lookupClass(class_name)); + else { // Fourth try: Load classes via repository + if((clazz = Repository.lookupClass(class_name)) != null) + clazz = modifyClass(clazz); + else + throw new ClassNotFoundException(class_name); + } if(clazz != null) { byte[] bytes = clazz.getBytes(); -- GitLab From 378638269ebbf81f751aea817b14239fe09d4fb0 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 14 Dec 2001 18:31:58 +0000 Subject: [PATCH 0024/1313] Allow lookup through getResourceAsStream() git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152714 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/ClassPath.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index c4d77724..d117663a 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -169,11 +169,22 @@ public class ClassPath { } /** + * Return stream for class or resource on CLASSPATH. + * * @param name fully qualified file name, e.g. java/lang/String * @param suffix file name ends with suff, e.g. .java * @return input stream for file on class path */ public InputStream getInputStream(String name, String suffix) throws IOException { + InputStream is = null; + + try { + is = getClass().getClassLoader().getResourceAsStream(name + suffix); + } catch(Exception e) { } + + if(is != null) + return is; + return getClassFile(name, suffix).getInputStream(); } -- GitLab From 24a5aa6b09149f293dd20d0d8bf23068dc3352cd Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 14 Dec 2001 18:32:54 +0000 Subject: [PATCH 0025/1313] For local variables whose scope end at the last instruction of the method's code, the JVM specification is ambiguous. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152715 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/LocalVariableGen.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/java/org/apache/bcel/generic/LocalVariableGen.java b/src/java/org/apache/bcel/generic/LocalVariableGen.java index 482848ff..88ae71aa 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/java/org/apache/bcel/generic/LocalVariableGen.java @@ -102,12 +102,22 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo * This relies on that the instruction list has already been dumped to byte code or * or that the `setPositions' methods has been called for the instruction list. * + * Note that for local variables whose scope end at the last + * instruction of the method's code, the JVM specification is ambiguous: + * both a start_pc+length ending at the last instruction and + * start_pc+length ending at first index beyond the end of the code are + * valid. + * * @param il instruction list (byte code) which this variable belongs to * @param cp constant pool */ public LocalVariable getLocalVariable(ConstantPoolGen cp) { int start_pc = start.getPosition(); int length = end.getPosition() - start_pc; + + if(length > 0) + length += end.getInstruction().getLength(); + int name_index = cp.addUtf8(name); int signature_index = cp.addUtf8(type.getSignature()); -- GitLab From ee211a376e5aeeb75381d5c2b3a05e301662b09f Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 14 Dec 2001 18:33:15 +0000 Subject: [PATCH 0026/1313] new project git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152716 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/projects.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xdocs/projects.xml b/xdocs/projects.xml index 7cb0a666..088ce2e6 100644 --- a/xdocs/projects.xml +++ b/xdocs/projects.xml @@ -99,6 +99,10 @@ framework +
      • Java code coverage + tool for JUnit +
      • +
      • Prolog
      • -- GitLab From 52197046397a2a937d865c1488ccd1297e8fe988 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 14 Dec 2001 18:44:29 +0000 Subject: [PATCH 0027/1313] Make getClassPath() public git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152717 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/ClassPath.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index d117663a..5725f311 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -121,7 +121,12 @@ public class ClassPath { } } - private static final String getClassPath() { + /** Checks for class path components in the following properties: + * "java.class.path", "sun.boot.class.path", "java.ext.dirs" + * + * @return class path as used by default by BCEL + */ + public static final String getClassPath() { String class_path = System.getProperty("java.class.path"); String boot_path = System.getProperty("sun.boot.class.path"); String ext_path = System.getProperty("java.ext.dirs"); -- GitLab From 5c462458477f362d508f66d8c846d1a4b29a0569 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Fri, 14 Dec 2001 23:42:06 +0000 Subject: [PATCH 0028/1313] - adjusting the dist target so that the source distribution can be built by anyone attempting to make patches - fixed the dist target so that the sources are in the correct location for compiling - update the version to 5.1-dev as i've built the bundles for the 5.0 release. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152718 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 13 ++++++++++--- default.properties | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/build.xml b/build.xml index e4de526d..7394a1fb 100644 --- a/build.xml +++ b/build.xml @@ -239,7 +239,7 @@ Available targets: + depends="init,jar,apidocs,xdocs"> @@ -264,6 +264,13 @@ Available targets: + + + + + + + @@ -298,7 +305,7 @@ Available targets: - + @@ -306,7 +313,7 @@ Available targets: - + diff --git a/default.properties b/default.properties index cd4447c5..fdb7193e 100644 --- a/default.properties +++ b/default.properties @@ -7,7 +7,7 @@ # ------------------------------------------------------------------- project = bcel -version = 5.0rc1 +version = 5.1-dev final.name = ${project}-${version} jakarta.site2 = ../jakarta-site2 docs.src = ./xdocs -- GitLab From f76134a764aae28cc47d9433aa9999a284ba5b67 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Sun, 16 Dec 2001 12:51:07 +0000 Subject: [PATCH 0029/1313] Repaired accept(Visitor) method: PUTFIELD is a StackConsumer, namely a PopInstruction. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152719 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/PUTFIELD.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/java/org/apache/bcel/generic/PUTFIELD.java b/src/java/org/apache/bcel/generic/PUTFIELD.java index ad5bee3e..35946d8d 100644 --- a/src/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/java/org/apache/bcel/generic/PUTFIELD.java @@ -104,6 +104,8 @@ public class PUTFIELD extends FieldInstruction implements ExceptionThrower{ */ public void accept(Visitor v) { v.visitExceptionThrower(this); + v.visitStackConsumer(this); + v.visitPopInstruction(this); v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); -- GitLab From 7d256da0812980dad9d7b29f3850fc866cf74c51 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Tue, 18 Dec 2001 14:52:28 +0000 Subject: [PATCH 0030/1313] - making PUTFIELD implement PopInstruction, the required methods to satisfy the interface were present but the explicit implements statement was missing. Markus, you'll want to double check. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152720 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/PUTFIELD.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/PUTFIELD.java b/src/java/org/apache/bcel/generic/PUTFIELD.java index 35946d8d..2e4fbdf7 100644 --- a/src/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/java/org/apache/bcel/generic/PUTFIELD.java @@ -66,7 +66,9 @@ import org.apache.bcel.ExceptionConstants; * @version $Id$ * @author M. Dahm */ -public class PUTFIELD extends FieldInstruction implements ExceptionThrower{ +public class PUTFIELD + extends FieldInstruction + implements PopInstruction,ExceptionThrower{ /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. -- GitLab From 14d6312d7281dbaa5c4c1db0c6e07c17827d70d0 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 20 Dec 2001 09:53:22 +0000 Subject: [PATCH 0031/1313] exception handler does something more useful git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152721 13f79535-47bb-0310-9956-ffa450edef68 --- examples/HelloWorldBuilder.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/examples/HelloWorldBuilder.java b/examples/HelloWorldBuilder.java index c45a52be..195f1ec2 100644 --- a/examples/HelloWorldBuilder.java +++ b/examples/HelloWorldBuilder.java @@ -14,7 +14,10 @@ import org.apache.bcel.Constants; * try { * System.out.print("Please enter your name> "); * name = in.readLine(); - * } catch(IOException e) { return; } + * } catch(IOException e) { + * System.out.println(e); + * return; + * } * * System.out.println("Hello, " + name); * } @@ -100,9 +103,17 @@ public class HelloWorldBuilder { InstructionHandle try_end = il.append(g); /* } catch() { ... } - * Add exception handler: simply return from method + * Add exception handler: print exception and return from method */ - InstructionHandle handler = il.append(InstructionConstants.RETURN); + InstructionHandle handler = + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, + Constants.GETSTATIC)); + // Little trick in order not to save exception object temporarily + il.append(InstructionConstants.SWAP); + + il.append(factory.createInvoke("java.io.PrintStream", "println", Type.VOID, + new Type[] { Type.OBJECT }, Constants.INVOKEVIRTUAL)); + il.append(InstructionConstants.RETURN); mg.addExceptionHandler(try_start, try_end, handler, new ObjectType("java.io.IOException")); -- GitLab From e55afae9a42d2790c733eecd2cacd3ea58b2b2b3 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Thu, 24 Jan 2002 02:31:08 +0000 Subject: [PATCH 0032/1313] - cleaning out the docs that have been converted to XML. The bibliography still needs to be converted. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152722 13f79535-47bb-0310-9956-ffa450edef68 --- docs/Faculty.java | 28 - docs/HelloWorld.java | 16 - docs/Peephole.java | 82 - docs/appendix.tex | 193 -- docs/bool.java | 24 - docs/diagrams.tex | 19 - docs/manual.ps | 4988 ------------------------------------------ docs/manual.tex | 1079 --------- docs/opt | 24 - docs/unopt | 24 - 10 files changed, 6477 deletions(-) delete mode 100644 docs/Faculty.java delete mode 100644 docs/HelloWorld.java delete mode 100644 docs/Peephole.java delete mode 100644 docs/appendix.tex delete mode 100644 docs/bool.java delete mode 100644 docs/diagrams.tex delete mode 100644 docs/manual.ps delete mode 100644 docs/manual.tex delete mode 100644 docs/opt delete mode 100644 docs/unopt diff --git a/docs/Faculty.java b/docs/Faculty.java deleted file mode 100644 index c8e7d956..00000000 --- a/docs/Faculty.java +++ /dev/null @@ -1,28 +0,0 @@ -import java.io.*; - -public class Faculty { - private static BufferedReader in = new BufferedReader(new - InputStreamReader(System.in)); - - public static final int fac(int n) { - return(n == 0)? 1 : n * fac(n - 1); - } - - public static final int readInt() { - int n = 4711; - - try { - System.out.print("Please enter a number> "); - n = Integer.parseInt(in.readLine()); - } - catch(IOException e1) { System.err.println(e1); } - catch(NumberFormatException e2) { System.err.println(e2); } - - return n; - } - - public static void main(String[] args) { - int n = readInt(); - System.out.println("Faculty of " + n + " is " + fac(n)); - } -} diff --git a/docs/HelloWorld.java b/docs/HelloWorld.java deleted file mode 100644 index 1630e21f..00000000 --- a/docs/HelloWorld.java +++ /dev/null @@ -1,16 +0,0 @@ -import java.io.*; - -public class HelloWorld { - public static void main(String[] argv) { - BufferedReader in = new BufferedReader(new - InputStreamReader(System.in)); - String name = null; - - try { - System.out.print("Please enter your name> "); - name = in.readLine(); - } catch(IOException e) { return; } - - System.out.println("Hello, " + name); - } -} diff --git a/docs/Peephole.java b/docs/Peephole.java deleted file mode 100644 index c8806aed..00000000 --- a/docs/Peephole.java +++ /dev/null @@ -1,82 +0,0 @@ -import java.io.*; - -import java.util.Iterator; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; -import org.apache.bcel.Repository; -import org.apache.bcel.util.InstructionFinder; - -public class Peephole { - public static void main(String[] argv) { - try { - /* Load the class from CLASSPATH. - */ - JavaClass clazz = Repository.lookupClass(argv[0]); - Method[] methods = clazz.getMethods(); - ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); - - for(int i=0; i < methods.length; i++) { - if(!(methods[i].isAbstract() || methods[i].isNative())) { - MethodGen mg = new MethodGen(methods[i], - clazz.getClassName(), cp); - Method stripped = removeNOPs(mg); - - if(stripped != null) // Any NOPs stripped? - methods[i] = stripped; // Overwrite with stripped method - } - } - - /* Dump the class to _.class - */ - clazz.setConstantPool(cp.getFinalConstantPool()); - clazz.dump(clazz.getClassName() + "_.class"); - } catch(Exception e) { e.printStackTrace(); } - } - - private static final Method removeNOPs(MethodGen mg) { - InstructionList il = mg.getInstructionList(); - InstructionFinder f = new InstructionFinder(il); - String pat = "NOP+"; // Find at least one NOP - InstructionHandle next = null; - int count = 0; - - for(Iterator i = f.search(pat); i.hasNext(); ) { - InstructionHandle[] match = (InstructionHandle[])e.next(); - InstructionHandle first = match[0]; - InstructionHandle last = match[match.length - 1]; - - /* Some nasty Java compilers may add NOP at end of method. - */ - if((next = last.getNext()) == null) - break; - - count += match.length; - - /* Delete NOPs and redirect any references to them to the following - * (non-nop) instruction. - */ - try { - il.delete(first, last); - } catch(TargetLostException e) { - InstructionHandle[] targets = e.getTargets(); - for(int i=0; i < targets.length; i++) { - InstructionTargeter[] targeters = targets[i].getTargeters(); - - for(int j=0; j < targeters.length; j++) - targeters[j].updateTarget(targets[i], next); - } - } - } - - Method m = null; - - if(count > 0) { - System.out.println("Removed " + count + " NOP instructions from method " + - mg.getName()); - m = mg.getMethod(); - } - - il.dispose(); // Reuse instruction handles - return m; - } -} diff --git a/docs/appendix.tex b/docs/appendix.tex deleted file mode 100644 index 073f0cc0..00000000 --- a/docs/appendix.tex +++ /dev/null @@ -1,193 +0,0 @@ -\section{Code examples for the BCEL API}\label{sec:apicg} - -\subsection{HelloWorldBuilder.java} -The following Java program reads a name from the standard input and -prints a friendly ``Hello''. Since the \texttt{readLine()} method may -throw an \texttt{IOException} it is enclosed by a \texttt{try-catch} block. - -{\small \verbatimtabinput{HelloWorld.java}\label{sec:hello}} - -\subsection{HelloWorldBuilder.java} - -We will sketch here how the above Java class can be created from the -scratch using the \jc API. For ease of reading we will -use textual signatures and not create them dynamically. For example, -the signature - -\begin{verbatim} - "(Ljava/lang/String;)Ljava/lang/StringBuffer;" -\end{verbatim} - -would actually be created with - -\begin{verbatim} - Type.getMethodSignature(Type.STRINGBUFFER, new Type[] { Type.STRING }); -\end{verbatim} - -\subsubsection{Initialization:} - -First we create an empty class and an instruction list: - -{\small\begin{verbatim} - ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", - "", ACC_PUBLIC | ACC_SUPER, - null); - ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool - InstructionList il = new InstructionList(); -\end{verbatim}} - -We then create the main method, supplying the method's name and the -symbolic type signature encoded with \texttt{Type} objects. - -{\small\begin{verbatim} - MethodGen mg = new MethodGen(ACC_STATIC | ACC_PUBLIC,// access flags - Type.VOID, // return type - new Type[] { // argument types - new ArrayType(Type.STRING, 1) }, - new String[] { "argv" }, // arg names - "main", "HelloWorld", // method, class - il, cp); - InstructionFactory factory = new InstructionFactory(cg); -\end{verbatim}} - -We define some often used types: - -{\small\begin{verbatim} - ObjectType i_stream = new ObjectType("java.io.InputStream"); - ObjectType p_stream = new ObjectType("java.io.PrintStream"); -\end{verbatim}} - -\subsubsection{Create variables \texttt{in} and \texttt{name}:} - -We call the constructors, i.e. execute -\texttt{BufferedReader(Input\-Stream\-Reader(System.in))}. The reference -to the \texttt{BufferedReader} object stays on top of the stack and is -stored in the newly allocated \texttt{in} variable. - -{\small\begin{verbatim} - il.append(factory.createNew("java.io.BufferedReader")); - il.append(InstructionConstants.DUP); // Use predefined constant - il.append(factory.createNew("java.io.InputStreamReader")); - il.append(InstructionConstants.DUP); - il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, - Constants.GETSTATIC)); - il.append(factory.createInvoke("java.io.InputStreamReader", "", - Type.VOID, new Type[] { i_stream }, - Constants.INVOKESPECIAL)); - il.append(factory.createInvoke("java.io.BufferedReader", "", Type.VOID, - new Type[] {new ObjectType("java.io.Reader")}, - Constants.INVOKESPECIAL)); - - LocalVariableGen lg = - mg.addLocalVariable("in", - new ObjectType("java.io.BufferedReader"), null, null); - int in = lg.getIndex(); - lg.setStart(il.append(new ASTORE(in))); // `i' valid from here -\end{verbatim}} - -Create local variable \texttt{name} and initialize it to \texttt{null}. - -{\small\begin{verbatim} - lg = mg.addLocalVariable("name", Type.STRING, null, null); - int name = lg.getIndex(); - il.append(InstructionConstants.ACONST_NULL); - lg.setStart(il.append(new ASTORE(name))); // `name' valid from here -\end{verbatim}} - -\subsubsection{Create try-catch block} - -We remember the start of the block, read a line from the standard -input and store it into the variable \texttt{name}. - -{\small\begin{verbatim} - InstructionHandle try_start = - il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, - Constants.GETSTATIC)); - - il.append(new PUSH(cp, "Please enter your name> ")); - il.append(factory.createInvoke("java.io.PrintStream", "print", Type.VOID, - new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); - il.append(new ALOAD(in)); - il.append(factory.createInvoke("java.io.BufferedReader", "readLine", - Type.STRING, Type.NO_ARGS, - Constants.INVOKEVIRTUAL)); - il.append(new ASTORE(name)); -\end{verbatim}} - -Upon normal execution we jump behind exception handler, the target -address is not known yet. - -{\small\begin{verbatim} - GOTO g = new GOTO(null); - InstructionHandle try_end = il.append(g); -\end{verbatim}} - -We add the exception handler which simply returns from the method. - -{\small\begin{verbatim} - InstructionHandle handler = il.append(InstructionConstants.RETURN); - mg.addExceptionHandler(try_start, try_end, handler, "java.io.IOException"); -\end{verbatim}} - -``Normal'' code continues, now we can set the branch target of the GOTO. - -{\small\begin{verbatim} - InstructionHandle ih = - il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, - Constants.GETSTATIC)); - g.setTarget(ih); -\end{verbatim}} - -\subsubsection{Printing "Hello"} - -String concatenation compiles to \texttt{StringBuffer} operations. - -{\small\begin{verbatim} - il.append(factory.createNew(Type.STRINGBUFFER)); - il.append(InstructionConstants.DUP); - il.append(new PUSH(cp, "Hello, ")); - il.append(factory.createInvoke("java.lang.StringBuffer", "", - Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKESPECIAL)); - il.append(new ALOAD(name)); - il.append(factory.createInvoke("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); - il.append(factory.createInvoke("java.lang.StringBuffer", "toString", - Type.STRING, Type.NO_ARGS, - Constants.INVOKEVIRTUAL)); - - il.append(factory.createInvoke("java.io.PrintStream", "println", - Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); - il.append(InstructionConstants.RETURN); -\end{verbatim}} - -\subsubsection{Finalization} - -Finally, we have to set the stack size, which normally would be -computed on the fly and add a default constructor method to the class, -which is empty in this case. - -{\small\begin{verbatim} - mg.setMaxStack(5); - cg.addMethod(mg.getMethod()); - il.dispose(); // Allow instruction handles to be reused - cg.addEmptyConstructor(ACC_PUBLIC); -\end{verbatim}} - -Last but not least we dump the \texttt{JavaClass} object to a file. - -{\small\begin{verbatim} - try { - cg.getJavaClass().dump("HelloWorld.class"); - } catch(java.io.IOException e) { System.err.println(e); } -\end{verbatim}} - -\subsection{Peephole.java} - -This class implements a simple peephole optimizer that removes any NOP -instructions from the given class. - -{\small\verbatimtabinput{Peephole.java}}\label{sec:nop} diff --git a/docs/bool.java b/docs/bool.java deleted file mode 100644 index cf517ea0..00000000 --- a/docs/bool.java +++ /dev/null @@ -1,24 +0,0 @@ - InstructionList il = new InstructionList(); - ... - CodeConstraint constraint = new CodeConstraint() { - public boolean checkCode(InstructionHandle[] match) { - IfInstruction if1 = (IfInstruction)match[0].getInstruction(); - GOTO g = (GOTO)match[2].getInstruction(); - return (if1.getTarget() == match[3]) && - (g.getTarget() == match[4]); - } - }; - FindPattern f = new FindPattern(il); - String pat = "`IfInstruction'`ICONST_0'`GOTO'`ICONST_1'" + - "`NOP'(`IFEQ'|`IFNE')"; - InstructionHandle[] match; - for(InstructionHandle ih = f.search(pat, constraint); - ih != null; ih = f.search(pat, match[0], constraint)) { - match = f.getMatch(); // Constraint already checked - ... - match[0].setTarget(match[5].getTarget()); // Update target - ... - try { - il.delete(match[1], match[5]); - } catch(TargetLostException e) { ... } - } diff --git a/docs/diagrams.tex b/docs/diagrams.tex deleted file mode 100644 index 454b7242..00000000 --- a/docs/diagrams.tex +++ /dev/null @@ -1,19 +0,0 @@ - -\begin{figure}[htbp] - \begin{center} - \leavevmode - \epsfysize0.93\textheight - \epsfbox{eps/constantpool.eps} - \caption{UML diagram for the ConstantPool API}\label{fig:umlcp} - \end{center} -\end{figure} - -\begin{figure}[ht] - \begin{center} - \leavevmode - \epsfysize0.93\textheight - \epsfbox{eps/instructions.eps} - \caption{UML diagram for the Instruction API}\label{fig:umlinstr} - \end{center} -\end{figure} - diff --git a/docs/manual.ps b/docs/manual.ps deleted file mode 100644 index c6024074..00000000 --- a/docs/manual.ps +++ /dev/null @@ -1,4988 +0,0 @@ -%!PS-Adobe-2.0 -%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software -%%Title: manual.dvi -%%Pages: 31 -%%PageOrder: Ascend -%%BoundingBox: 0 0 596 842 -%%DocumentFonts: Palatino-Roman Palatino-Bold Courier Palatino-Italic -%%+ Helvetica Helvetica-Oblique Courier-Bold -%%DocumentPaperSizes: a4 -%%EndComments -%DVIPSWebPage: (www.radicaleye.com) -%DVIPSCommandLine: /usr/bin/dvips manual.dvi -%DVIPSParameters: dpi=600, compressed -%DVIPSSource: TeX output 2001.10.08:1345 -%%BeginProcSet: texc.pro -%! -/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S -N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 -mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 -0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ -landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize -mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ -matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round -exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ -statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] -N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin -/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array -/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 -array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N -df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A -definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get -}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} -B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr -1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 -1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx -0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx -sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ -rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp -gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B -/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ -/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ -A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy -get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} -ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp -fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 -{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add -chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ -1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} -forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn -/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put -}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ -bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A -mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ -SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ -userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X -1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 -index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N -/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ -/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) -(LaserWriter 16/600)]{A length product length le{A length product exch 0 -exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse -end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask -grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} -imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round -exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto -fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p -delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} -B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ -p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S -rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end - -%%EndProcSet -%%BeginProcSet: 8r.enc -% @@psencodingfile@{ -% author = "S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry", -% version = "0.6", -% date = "22 June 1996", -% filename = "8r.enc", -% email = "kb@@mail.tug.org", -% address = "135 Center Hill Rd. // Plymouth, MA 02360", -% codetable = "ISO/ASCII", -% checksum = "119 662 4424", -% docstring = "Encoding for TrueType or Type 1 fonts to be used with TeX." -% @} -% -% Idea is to have all the characters normally included in Type 1 fonts -% available for typesetting. This is effectively the characters in Adobe -% Standard Encoding + ISO Latin 1 + extra characters from Lucida. -% -% Character code assignments were made as follows: -% -% (1) the Windows ANSI characters are almost all in their Windows ANSI -% positions, because some Windows users cannot easily reencode the -% fonts, and it makes no difference on other systems. The only Windows -% ANSI characters not available are those that make no sense for -% typesetting -- rubout (127 decimal), nobreakspace (160), softhyphen -% (173). quotesingle and grave are moved just because it's such an -% irritation not having them in TeX positions. -% -% (2) Remaining characters are assigned arbitrarily to the lower part -% of the range, avoiding 0, 10 and 13 in case we meet dumb software. -% -% (3) Y&Y Lucida Bright includes some extra text characters; in the -% hopes that other PostScript fonts, perhaps created for public -% consumption, will include them, they are included starting at 0x12. -% -% (4) Remaining positions left undefined are for use in (hopefully) -% upward-compatible revisions, if someday more characters are generally -% available. -% -% (5) hyphen appears twice for compatibility with both ASCII and Windows. -% -/TeXBase1Encoding [ -% 0x00 (encoded characters from Adobe Standard not in Windows 3.1) - /.notdef /dotaccent /fi /fl - /fraction /hungarumlaut /Lslash /lslash - /ogonek /ring /.notdef - /breve /minus /.notdef -% These are the only two remaining unencoded characters, so may as -% well include them. - /Zcaron /zcaron -% 0x10 - /caron /dotlessi -% (unusual TeX characters available in, e.g., Lucida Bright) - /dotlessj /ff /ffi /ffl - /.notdef /.notdef /.notdef /.notdef - /.notdef /.notdef /.notdef /.notdef - % very contentious; it's so painful not having quoteleft and quoteright - % at 96 and 145 that we move the things normally found there down to here. - /grave /quotesingle -% 0x20 (ASCII begins) - /space /exclam /quotedbl /numbersign - /dollar /percent /ampersand /quoteright - /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash -% 0x30 - /zero /one /two /three /four /five /six /seven - /eight /nine /colon /semicolon /less /equal /greater /question -% 0x40 - /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O -% 0x50 - /P /Q /R /S /T /U /V /W - /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore -% 0x60 - /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o -% 0x70 - /p /q /r /s /t /u /v /w - /x /y /z /braceleft /bar /braceright /asciitilde - /.notdef % rubout; ASCII ends -% 0x80 - /.notdef /.notdef /quotesinglbase /florin - /quotedblbase /ellipsis /dagger /daggerdbl - /circumflex /perthousand /Scaron /guilsinglleft - /OE /.notdef /.notdef /.notdef -% 0x90 - /.notdef /.notdef /.notdef /quotedblleft - /quotedblright /bullet /endash /emdash - /tilde /trademark /scaron /guilsinglright - /oe /.notdef /.notdef /Ydieresis -% 0xA0 - /.notdef % nobreakspace - /exclamdown /cent /sterling - /currency /yen /brokenbar /section - /dieresis /copyright /ordfeminine /guillemotleft - /logicalnot - /hyphen % Y&Y (also at 45); Windows' softhyphen - /registered - /macron -% 0xD0 - /degree /plusminus /twosuperior /threesuperior - /acute /mu /paragraph /periodcentered - /cedilla /onesuperior /ordmasculine /guillemotright - /onequarter /onehalf /threequarters /questiondown -% 0xC0 - /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla - /Egrave /Eacute /Ecircumflex /Edieresis - /Igrave /Iacute /Icircumflex /Idieresis -% 0xD0 - /Eth /Ntilde /Ograve /Oacute - /Ocircumflex /Otilde /Odieresis /multiply - /Oslash /Ugrave /Uacute /Ucircumflex - /Udieresis /Yacute /Thorn /germandbls -% 0xE0 - /agrave /aacute /acircumflex /atilde - /adieresis /aring /ae /ccedilla - /egrave /eacute /ecircumflex /edieresis - /igrave /iacute /icircumflex /idieresis -% 0xF0 - /eth /ntilde /ograve /oacute - /ocircumflex /otilde /odieresis /divide - /oslash /ugrave /uacute /ucircumflex - /udieresis /yacute /thorn /ydieresis -] def - -%%EndProcSet -%%BeginProcSet: texps.pro -%! -TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 -index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll -exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics -exch def dict begin Encoding{exch dup type/integertype ne{pop pop 1 sub -dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def} -ifelse}forall Metrics/Metrics currentdict end def[2 index currentdict -end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{ -dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 -roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def -dup[exch{dup CharStrings exch known not{pop/.notdef/Encoding true def} -if}forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def} -def end - -%%EndProcSet -%%BeginProcSet: special.pro -%! -TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N -/vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N -/rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N -/@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ -/hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho -X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B -/@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ -/urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known -{userdict/md get type/dicttype eq{userdict begin md length 10 add md -maxlength ge{/md md dup length 20 add dict copy def}if end md begin -/letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S -atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ -itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll -transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll -curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf -pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} -if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 --1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 -get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip -yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub -neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ -noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop -90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get -neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr -1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr -2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 --1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S -TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ -Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale -}if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState -save N userdict maxlength dict begin/magscale true def normalscale -currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts -/psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x -psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx -psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub -TR/showpage{}N/erasepage{}N/copypage{}N/p 3 def @MacSetUp}N/doclip{ -psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 -roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath -moveto}N/endTexFig{end psf$SavedState restore}N/@beginspecial{SDict -begin/SpecialSave save N gsave normalscale currentpoint TR -@SpecialDefaults count/ocount X/dcount countdictstack N}N/@setspecial{ -CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto -closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx -sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR -}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse -CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury -lineto closepath clip}if/showpage{}N/erasepage{}N/copypage{}N newpath}N -/@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{end} -repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N -/@fedspecial{end}B/li{lineto}B/rl{rlineto}B/rc{rcurveto}B/np{/SaveX -currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY -moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X -/yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0 -1 startangle endangle arc savematrix setmatrix}N end - -%%EndProcSet -TeXDict begin 39158280 55380996 1000 600 600 (manual.dvi) -@start /Fa 145[60 60 3[60 3[60 3[60 97[{TeXBase1Encoding ReEncodeFont}5 -99.6264 /Courier-Bold rf -%DVIPSBitmapFont: Fb cmr8 8 1 -/Fb 1 44 df43 -D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fc cmr10 10.95 1 -/Fc 1 62 df<007FB912E0BA12F0A26C18E0CDFCAE007FB912E0BA12F0A26C18E03C167B -A147>61 D E -%EndDVIPSBitmapFont -%DVIPSBitmapFont: Fd cmsy10 10.95 1 -/Fd 1 55 df<176017F01601A2EE03E0A2EE07C0A2EE0F80A2EE1F00A2163EA25EA25EA2 -4B5AA24B5AA24B5AA24B5AA24BC7FCA2153EA25DA25DA24A5AA24A5AA24A5AA24A5AA24A -C8FCA2143EA25CA25CA2495AA2495AA2495AA2495AA249C9FCA2133EA25BA25BA2485AA2 -485AA2485AA2485AA248CAFCA2123EA25AA25AA25A12602C5473C000>54 -D E -%EndDVIPSBitmapFont -/Fe 179[51 6[61 1[66 61 66[{TeXBase1Encoding ReEncodeFont}4 -90.9091 /Helvetica rf /Ff 103[55 26[55 55 55 55 55 55 -55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 -55 55 55 55 55 55 55 1[55 1[55 3[55 55 55 55 55 55 55 -55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 1[55 -55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 -55 55 55 55 55 55 55 2[55 55 55 33[{TeXBase1Encoding ReEncodeFont}86 -90.9091 /Courier rf /Fg 107[50 25[50 55 50 83 55 61 33 -44 39 1[61 55 61 89 33 61 33 33 61 55 39 50 61 44 61 -50 12[66 61 2[61 83 1[100 61 2[39 83 83 55 61 83 72 1[78 -6[25 1[50 50 50 50 50 50 50 50 2[25 33 5[28 35[61 61 -2[{TeXBase1Encoding ReEncodeFont}54 99.6264 /Palatino-Bold -rf /Fh 134[60 60 60 60 60 60 60 60 60 60 60 60 60 60 -60 60 60 60 60 60 60 60 60 60 60 3[60 1[60 3[60 60 2[60 -60 1[60 60 60 60 60 2[60 60 1[60 60 1[60 60 60 5[60 8[60 -1[60 60 60 60 60 2[60 60 5[60 34[{TeXBase1Encoding ReEncodeFont}53 -99.6264 /Courier rf /Fi 135[50 50 50 1[50 50 50 1[50 -50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 38[50 10[50 -50 46[{TeXBase1Encoding ReEncodeFont}25 83.022 /Courier -rf /Fj 135[43 1[47 50 27 35 33 1[50 45 48 73 24 1[19 -24 48 46 1[40 51 37 46 42 12[51 18[65 18[21 28 21 44[{ -TeXBase1Encoding ReEncodeFont}25 83.022 /Palatino-Roman -rf /Fk 205[29 29 49[{TeXBase1Encoding ReEncodeFont}2 -58.1154 /Palatino-Roman rf /Fm 134[66 60 100 66 73 40 -53 47 1[73 66 73 106 40 73 40 40 73 1[47 60 73 53 1[60 -9[120 2[80 1[86 1[73 2[120 2[47 1[100 100 3[86 80 93 -10[60 60 60 60 60 60 2[30 43[73 2[{TeXBase1Encoding ReEncodeFont}41 -119.552 /Palatino-Bold rf /Fn 205[33 33 49[{ -TeXBase1Encoding ReEncodeFont}2 66.4176 /Palatino-Roman -rf /Fo 179[55 6[66 1[72 66 66[{TeXBase1Encoding ReEncodeFont}4 -99.6264 /Helvetica rf /Fp 134[50 2[50 55 33 39 39 1[50 -44 55 1[28 2[28 50 50 1[39 50 41 46 44 97[{ -TeXBase1Encoding ReEncodeFont}18 99.6264 /Palatino-Italic -rf /Fq 107[50 50 24[50 55 51 83 56 60 32 42 39 56 60 -54 58 88 29 55 23 29 58 55 33 48 61 44 55 50 3[33 1[33 -66 66 1[100 72 78 61 52 67 1[60 78 83 94 61 72 33 34 -83 76 55 61 77 71 61 78 6[25 50 50 50 50 50 50 50 50 -50 50 1[25 33 25 2[33 33 28 1[84 33[61 60 2[{ -TeXBase1Encoding ReEncodeFont}74 99.6264 /Palatino-Roman -rf /Fr 135[72 1[80 88 48 64 56 1[88 80 88 128 48 2[48 -88 1[56 72 88 64 1[72 10[112 1[96 1[104 1[88 2[143 88 -1[56 56 1[120 1[88 1[104 96 112 12[72 72 72 72 49[{ -TeXBase1Encoding ReEncodeFont}35 143.462 /Palatino-Bold -rf /Fs 134[45 45 66 45 51 30 35 35 1[45 40 51 71 25 40 -25 25 45 45 25 35 45 37 42 40 8[66 1[66 71 56 51 61 1[56 -71 71 86 51 1[30 30 2[51 56 71 61 1[66 6[23 45 45 45 -9[30 5[25 35[50 48 2[{TeXBase1Encoding ReEncodeFont}50 -90.9091 /Palatino-Italic rf /Ft 87[30 17[45 1[45 45 24[45 -51 47 76 51 55 30 39 36 51 55 50 53 80 26 51 21 26 53 -51 30 44 56 40 50 45 3[30 1[30 61 61 61 91 66 71 56 48 -61 1[55 71 76 86 56 66 30 31 76 69 51 56 70 64 56 71 -5[23 23 45 45 45 45 45 45 45 45 45 45 55 23 30 23 2[30 -30 25 35[55 55 2[{TeXBase1Encoding ReEncodeFont}78 90.9091 -/Palatino-Roman rf /Fu 139[39 1[47 2[65 9[57 1[53 66 -18[94 22[60 5[60 60 60 3[30 44[{TeXBase1Encoding ReEncodeFont}12 -119.552 /Palatino-Roman rf /Fv 138[72 1[72 72 3[72 72 -72 72 1[72 72 2[72 72 1[72 72 32[72 17[72 46[{ -TeXBase1Encoding ReEncodeFont}15 119.552 /Courier rf -/Fw 138[87 1[61 57 4[127 1[80 2[83 6[72 19[136 8[111 -68[{TeXBase1Encoding ReEncodeFont}9 143.462 /Palatino-Roman -rf /Fx 139[30 40 35 2[51 56 4[30 3[45 1[40 56 45 10[71 -20[71 15[45 45 1[23 46[{TeXBase1Encoding ReEncodeFont}15 -90.9091 /Palatino-Bold rf /Fy 134[96 3[104 56 73 68 1[103 -94 100 152 50 2[50 1[96 1[82 105 76 95 86 20[105 6[105 -133 122 105 24[57 57 40[{TeXBase1Encoding ReEncodeFont}24 -172.188 /Palatino-Roman rf end -%%EndProlog -%%BeginSetup -%%Feature: *Resolution 600dpi -TeXDict begin -%%BeginPaperSize: a4 -a4 -%%EndPaperSize - -%%EndSetup -%%Page: 1 1 -1 0 bop 429 814 a Fy(Byte)44 b(Code)g(Engineering)g(Library)g(\(BCEL\)) -749 1021 y(Description)h(and)f(usage)f(manual)1685 1229 -y Fx(V)-10 b(ersion)23 b(1.0)1452 1528 y Fw(Markus)35 -b(Dahm)1159 1826 y Fv(markus.dahm@berlin.de)1507 2066 -y Fu(October)c(8,)f(2001)1738 2421 y Fx(Abstract)380 -2581 y Ft(Extensions)k(and)i(impr)n(ovements)f(of)h(the)g(pr)n -(ogramming)g(language)g(Java)h(and)f(its)g(r)n(e-)244 -2693 y(lated)26 b(execution)e(envir)n(onment)i(\(Java)i(V)-5 -b(irtual)26 b(Machine,)h(JVM\))g(ar)n(e)f(the)f(subject)g(of)h(a)h(lar) -n(ge)244 2806 y(number)f(of)h(r)n(esear)n(ch)f(pr)n(ojects)g(and)g(pr)n -(oposals.)39 b(Ther)n(e)25 b(ar)n(e)i(pr)n(ojects,)f(for)h(instance,)g -(to)f(add)244 2919 y(parameterized)17 b(types)e(to)i(Java,)j(to)d -(implement)g(\223Aspect-Oriented)f(Pr)n(ogramming\224,)j(to)d(per)n(-) -244 3032 y(form)23 b(sophisticated)e(static)i(analysis,)f(and)h(to)f -(impr)n(ove)h(the)f(r)o(un-time)h(performance.)380 3145 -y(Since)c(Java)i(classes)d(ar)n(e)i(compiled)f(into)f(portable)h -(binary)h(class)f(\002les)g(\(called)h Fs(byte)g(code)p -Ft(\),)h(it)244 3258 y(is)e(the)f(most)g(convenient)g(and)h -(platform-independent)e(way)i(to)f(implement)h(these)e(impr)n(ove-)244 -3371 y(ments)k(not)g(by)h(writing)g(a)g(new)f(compiler)i(or)e(changing) -h(the)f(JVM,)h(but)g(by)g(transforming)f(the)244 3484 -y(byte)j(code.)33 b(These)23 b(transformations)h(can)h(either)f(be)h -(performed)e(after)h(compile-time,)i(or)e(at)244 3597 -y(load-time.)44 b(Many)28 b(pr)n(ogrammers)f(ar)n(e)h(doing)f(this)h -(by)g(implementing)g(their)f(own)g(special-)244 3710 -y(ized)32 b(byte)e(code)h(manipulation)i(tools,)f(which)h(ar)n(e,)g -(however)-7 b(,)33 b(r)n(estricted)d(in)i(the)f(range)g(of)244 -3823 y(their)22 b(r)n(e-usability)-10 b(.)380 3935 y(T)i(o)27 -b(deal)h(with)g(the)f(necessary)f(class)i(\002le)g(transformations,)g -(we)f(intr)n(oduce)g(an)h(API)f(that)244 4048 y(helps)22 -b(developers)e(to)i(conveniently)g(implement)h(their)f -(transformations.)0 4392 y Fr(1)143 b(Introduction)0 -4620 y Fq(The)32 b(Java)g(language)g([GJS96])h(has)f(become)g(very)h -(popular)f(and)g(many)g(r)n(esear)n(ch)h(pr)n(ojects)h(deal)0 -4741 y(with)28 b(further)g(impr)n(ovements)h(of)e(the)h(language)f(or)h -(its)g(r)o(un-time)g(behavior)-7 b(.)38 b(The)27 b(possibility)i(to)0 -4861 y(extend)e(a)f(language)h(with)g(new)f(concepts)i(is)f(sur)n(ely)g -(a)g(desirable)f(featur)n(e,)h(but)h(implementation)0 -4981 y(issues)37 b(should)h(be)e(hidden)h(fr)n(om)g(the)g(user)-7 -b(.)67 b(Fortunately)-11 b(,)42 b(the)37 b(concepts)h(of)f(the)g(Java)g -(V)-5 b(irtual)0 5102 y(Machine)23 b(permit)g(the)g(user)n(-transpar)n -(ent)i(implementation)f(of)f(such)h(extensions)g(with)f(r)n(elatively)0 -5222 y(little)j(ef)n(fort.)146 5342 y(Because)20 b(the)h(tar)n(get)h -(language)f(of)g(Java)f(is)h(an)f(interpr)n(eted)h(language)g(with)g(a) -f(small)h(and)f(easy-)0 5463 y(to-understand)i(set)f(of)g(instr)o -(uctions)i(\(the)e Fp(byte)f(code)p Fq(\),)h(developers)g(can)g -(implement)f(and)g(test)h(their)1888 5712 y(1)p eop -%%Page: 2 2 -2 1 bop 0 407 a Fq(concepts)32 b(in)g(a)f(very)h(elegant)f(way)-11 -b(.)50 b(One)32 b(can)f(write)h(a)f(plug-in)h(r)n(eplacement)f(for)i -(the)e(system's)0 527 y(class)38 b(loader)g(which)g(is)g(r)n -(esponsible)h(for)g(dynamically)f(loading)g(class)g(\002les)h(at)f(r)o -(un-time)g(and)0 648 y(passing)30 b(the)h(byte)f(code)g(to)h(the)f(V)-5 -b(irtual)31 b(Machine)e(\(see)h(section)h(4.1\).)46 b(Class)30 -b(loaders)g(may)g(thus)0 768 y(be)f(used)f(to)i(inter)n(cept)g(the)f -(loading)g(pr)n(ocess)h(and)f(transform)i(classes)e(befor)n(e)g(they)h -(get)f(actually)0 888 y(executed)c(by)h(the)g(JVM)f([LB98].)31 -b(While)25 b(the)g(original)h(class)g(\002les)g(always)f(r)n(emain)g -(unalter)n(ed,)h(the)0 1009 y(behavior)32 b(of)g(the)f(class)h(loader)f -(may)g(be)g(r)n(econ\002gur)n(ed)i(for)f(every)g(execution)g(or)g -(instr)o(umented)0 1129 y(dynamically)-11 b(.)146 1249 -y(The)34 b Fo(BCEL)40 b Fq(API)33 b(\(Byte)i(Code)f(Engineering)h -(Library\),)i(formerly)f(known)f(as)f(JavaClass,)j(is)0 -1370 y(a)h(toolkit)i(for)e(the)g(static)h(analysis)g(and)e(dynamic)h -(cr)n(eation)h(or)g(transformation)h(of)f(Java)e(class)0 -1490 y(\002les.)70 b(It)37 b(enables)h(developers)g(to)g(implement)g -(the)g(desir)n(ed)g(featur)n(es)g(on)g(a)g(high)g(level)g(of)g(ab-)0 -1611 y(straction)30 b(without)g(handling)f(all)f(the)g(internal)h -(details)f(of)h(the)g(Java)f(class)h(\002le)g(format)g(and)f(thus)0 -1731 y(r)n(e-inventing)e(the)f(wheel)f(every)h(time.)31 -b Fo(BCEL)e Fq(is)24 b(written)i(entir)n(ely)g(in)e(Java)h(and)f(fr)n -(eely)h(available)0 1851 y(under)g(the)g(terms)h(of)f(the)g(Apache)f -(License.)1752 1815 y Fn(1)146 1972 y Fq(This)33 b(paper)f(is)g(str)o -(uctur)n(ed)i(as)f(follows:)46 b(W)-9 b(e)31 b(give)i(a)f(brief)g -(description)i(of)e(the)h(Java)f(V)-5 b(irtual)0 2092 -y(Machine)40 b(and)f(the)h(class)g(\002le)g(format)h(in)f(section)h(2.) -75 b(Section)41 b(3)e(intr)n(oduces)j(the)d Fo(BCEL)46 -b Fq(API.)0 2213 y(Section)28 b(4)e(describes)h(some)g(typical)g -(application)g(ar)n(eas)g(and)f(example)g(pr)n(ojects.)38 -b(The)26 b(appendix)0 2333 y(contains)k(code)f(examples)g(that)h(ar)n -(e)f(to)h(long)f(to)h(be)f(pr)n(esented)g(in)g(the)g(main)g(part)h(of)f -(this)h(paper)-7 b(.)0 2453 y(All)24 b(examples)h(ar)n(e)g(included)g -(in)g(the)g(down-loadable)g(distribution.)0 2749 y Fm(1.1)119 -b(Related)29 b(work)0 2939 y Fq(Ther)n(e)37 b(ar)n(e)g(a)g(number)g(of) -g(pr)n(oposals)i(and)d(class)i(libraries)f(that)h(have)f(some)g -(similarities)g(with)2 3059 y(B)t(C)t(E)t(L)r(:)28 b(The)e(JOIE)f -([CCK98)o(])h(toolkit)h(can)f(be)f(used)g(to)h(instr)o(ument)h(class)f -(loaders)g(with)g(dynamic)0 3180 y(behavior)-7 b(.)73 -b(Similarly)-11 b(,)43 b(\223Binary)c(Component)h(Adaptation\224)e -([KH98])i(allows)f(components)h(to)0 3300 y(be)30 b(adapted)g(and)h -(evolved)g(on-the-\003y)-11 b(.)48 b(Han)30 b(Lee's)g(\223Byte-code)i -(Instr)o(umenting)g(T)-9 b(ool\224)31 b([LZ98])0 3421 -y(allows)20 b(the)g(user)g(to)g(insert)g(calls)g(to)g(analysis)g -(methods)g(anywher)n(e)g(in)g(the)f(byte)h(code.)30 b(The)19 -b(Jasmin)0 3541 y(language)i([MD97])g(can)f(be)h(used)f(to)i -(hand-write)f(or)g(generate)g(pseudo-assembler)g(code.)30 -b(D-Java)0 3661 y([Sil98])25 b(and)g(JCF)g([Y)-9 b(ou98])25 -b(ar)n(e)g(class)h(viewing)f(tools.)146 3782 y(In)f(contrast)h(to)g -(these)f(pr)n(ojects,)h Fo(BCEL)j Fq(is)c(intended)f(to)i(be)e(a)h -(general)g(purpose)g(tool)h(for)g(\223byte)0 3902 y(code)31 -b(engineering\224.)48 b(It)30 b(gives)h(full)g(contr)n(ol)i(to)e(the)g -(developer)f(on)h(a)g(high)g(level)f(of)h(abstraction)0 -4022 y(and)25 b(is)g(not)g(r)n(estricted)i(to)f(any)f(particular)h -(application)f(ar)n(ea.)0 4363 y Fr(2)143 b(The)35 b(Java)g(V)-8 -b(irtual)34 b(Machine)0 4590 y Fq(Readers)f(alr)n(eady)h(familiar)g -(with)g(the)g(Java)g(V)-5 b(irtual)34 b(Machine)g(and)f(the)h(Java)g -(class)g(\002le)g(format)0 4711 y(may)25 b(want)g(to)h(skip)g(this)f -(section)h(and)f(pr)n(oceed)g(with)g(section)h(3.)146 -4831 y(Pr)n(ograms)34 b(written)g(in)e(the)g(Java)h(language)f(ar)n(e)h -(compiled)f(into)h(a)f(portable)h(binary)g(format)0 4951 -y(called)27 b Fp(byte)g(code)p Fq(.)38 b(Every)27 b(class)h(is)g(r)n -(epr)n(esented)g(by)f(a)h(single)f(class)h(\002le)f(containing)i(class) -f(r)n(elated)0 5072 y(data)g(and)f(byte)i(code)f(instr)o(uctions.)42 -b(These)27 b(\002les)h(ar)n(e)g(loaded)f(dynamically)i(into)f(an)g -(interpr)n(eter)0 5192 y(\(Java)d(V)-5 b(irtual)25 b(Machine,)g(JVM\))g -(and)g(executed.)p 0 5271 1530 4 v 116 5333 a Fk(1)149 -5363 y Fj(The)c(distribution)g(is)g(available)e(at)h -Fi(http://jakarta.apache.org/bcel/)p Fj(,)14 b(including)21 -b(several)f(code)g(ex-)0 5463 y(amples)h(and)f(javadoc)g(manuals.)1888 -5712 y Fq(2)p eop -%%Page: 3 3 -3 2 bop 146 407 a Fq(Figur)n(e)21 b(1)f(illustrates)i(the)e(pr)n -(ocedur)n(e)h(of)g(compiling)f(and)g(executing)h(a)f(Java)g(class:)29 -b(The)20 b(sour)n(ce)0 527 y(\002le)f(\()p Fh(HelloWorld.java)p -Fq(\))d(is)j(compiled)g(into)h(a)e(Java)i(class)f(\002le)g(\()p -Fh(HelloWorld.class)p Fq(\),)e(loaded)0 648 y(by)32 b(the)f(byte)h -(code)g(interpr)n(eter)g(and)f(executed.)51 b(In)30 b(or)n(der)j(to)f -(implement)f(additional)g(featur)n(es,)0 768 y(r)n(esear)n(chers)k(may) -e(want)h(to)g(transform)h(class)f(\002les)g(\(drawn)f(with)h(bold)g -(lines\))f(befor)n(e)h(they)g(get)0 888 y(actually)26 -b(executed.)31 b(This)25 b(application)g(ar)n(ea)g(is)g(one)g(of)h(the) -f(main)f(issues)i(of)f(this)h(article.)0 2794 y @beginspecial -0 @llx 0 @lly 439 @urx 199 @ury 4590 @rwi @setspecial -%%BeginDocument: eps/jvm.eps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: jvm.eps -%%Creator: fig2dev Version 3.2 Patchlevel 1 -%%CreationDate: Thu Nov 19 11:55:18 1998 -%%For: dahm@che (Markus Dahm,,,,,) -%%Orientation: Portrait -%%BoundingBox: 0 0 439 199 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def - -end -save --17.0 217.0 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def -%%EndProlog - -$F2psBegin -10 setmiterlimit -n -1000 4612 m -1000 -1000 l 8588 -1000 l 8588 4612 l cp clip - 0.06000 0.06000 sc -/Courier ff 285.00 scf sf -6600 1575 m -gs 1 -1 sc (java) col0 sh gr -/Courier ff 285.00 scf sf -2550 1575 m -gs 1 -1 sc (javac) col0 sh gr -/Courier-Bold ff 150.00 scf sf -4290 1155 m -gs 1 -1 sc (08 1a 42 ...) col0 sh gr -/Courier-Bold ff 150.00 scf sf -4290 990 m -gs 1 -1 sc (ca fe ba be) col0 sh gr -% Polyline -7.500 slw -n 6405 1200 m 6300 1200 6300 1695 105 arcto 4 {pop} repeat - 6300 1800 7395 1800 105 arcto 4 {pop} repeat - 7500 1800 7500 1305 105 arcto 4 {pop} repeat - 7500 1200 6405 1200 105 arcto 4 {pop} repeat - cp gs col0 s gr -% Polyline -n 2505 1200 m 2400 1200 2400 1695 105 arcto 4 {pop} repeat - 2400 1800 3495 1800 105 arcto 4 {pop} repeat - 3600 1800 3600 1305 105 arcto 4 {pop} repeat - 3600 1200 2505 1200 105 arcto 4 {pop} repeat - cp gs col0 s gr -% Polyline -30.000 slw -gs clippath -2280 1470 m 2400 1500 l 2280 1530 l 2445 1530 l 2445 1470 l cp -clip -n 1800 1500 m 2400 1500 l gs col0 s gr gr - -% arrowhead -7.500 slw -n 2280 1470 m 2400 1500 l 2280 1530 l 2280 1500 l 2280 1470 l cp gs 0.00 setgray ef gr col0 s -% Polyline -30.000 slw -gs clippath -4080 1470 m 4200 1500 l 4080 1530 l 4245 1530 l 4245 1470 l cp -clip -n 3600 1500 m 4200 1500 l gs col0 s gr gr - -% arrowhead -7.500 slw -n 4080 1470 m 4200 1500 l 4080 1530 l 4080 1500 l 4080 1470 l cp gs 0.00 setgray ef gr col0 s -% Polyline -30.000 slw -gs clippath -6180 1470 m 6300 1500 l 6180 1530 l 6345 1530 l 6345 1470 l cp -clip -n 5700 1500 m 6300 1500 l gs col0 s gr gr - -% arrowhead -7.500 slw -n 6180 1470 m 6300 1500 l 6180 1530 l 6180 1500 l 6180 1470 l cp gs 0.00 setgray ef gr col0 s -% Polyline -30.000 slw -n 5415 615 m 5415 915 l 5715 915 l gs col0 s gr -% Polyline -n 4215 615 m 4215 2415 l 5715 2415 l 5715 915 l 5415 615 l 4215 615 l cp gs col0 s gr -% Polyline -gs clippath -7006 1136 m 6900 1200 l 6964 1094 l 6847 1211 l 6889 1253 l cp -clip -n 7500 600 m 6900 1200 l gs col0 s gr gr - -% arrowhead -7.500 slw -n 7006 1136 m 6900 1200 l 6964 1094 l 6985 1115 l 7006 1136 l cp gs 0.00 setgray ef gr col0 s -% Polyline -30.000 slw -gs clippath -6630 1080 m 6600 1200 l 6570 1080 l 6570 1245 l 6630 1245 l cp -clip -n 6600 1200 m 6600 600 l gs col0 s gr gr - -% arrowhead -7.500 slw -n 6630 1080 m 6600 1200 l 6570 1080 l 6600 1080 l 6630 1080 l cp gs 0.00 setgray ef gr col0 s -% Polyline -n 300 3000 m 3600 3000 l 3600 3600 l 300 3600 l cp gs 0.90 setgray ef gr gs col0 s gr -% Polyline -n 4200 3000 m 7500 3000 l 7500 3600 l 4200 3600 l cp gs 0.90 setgray ef gr gs col0 s gr -% Polyline -n 1500 600 m 1500 900 l 1800 900 l gs col0 s gr -% Polyline -n 300 600 m 300 2400 l 1800 2400 l 1800 900 l 1500 600 l 300 600 l cp gs col0 s gr -/Helvetica ff 180.00 scf sf -6450 450 m -gs 1 -1 sc (Other classes) col0 sh gr -/Courier ff 150.00 scf sf -375 975 m -gs 1 -1 sc (public class) col0 sh gr -/Courier ff 150.00 scf sf -375 1140 m -gs 1 -1 sc (HelloWorld {) col0 sh gr -/Courier ff 150.00 scf sf -375 1305 m -gs 1 -1 sc ( ...) col0 sh gr -/Courier ff 150.00 scf sf -375 1635 m -gs 1 -1 sc ( void hello\(\) {) col0 sh gr -/Courier ff 150.00 scf sf -375 1800 m -gs 1 -1 sc ( ...) col0 sh gr -/Courier ff 150.00 scf sf -375 1965 m -gs 1 -1 sc ( }) col0 sh gr -/Courier ff 150.00 scf sf -375 2130 m -gs 1 -1 sc (}) col0 sh gr -/Helvetica ff 180.00 scf sf -4275 2625 m -gs 1 -1 sc (HelloWorld.class) col0 sh gr -/Helvetica-Bold ff 300.00 scf sf -900 3375 m -gs 1 -1 sc (Java language) col0 sh gr -/Helvetica-Bold ff 300.00 scf sf -4350 3375 m -gs 1 -1 sc (Java Virtual Machine) col0 sh gr -/Helvetica ff 180.00 scf sf -375 2625 m -gs 1 -1 sc (HelloWorld.java) col-1 sh gr -$F2psEnd -rs - -%%EndDocument - @endspecial 781 2998 a(Figur)n(e)g(1:)31 b(Compilation)25 -b(and)g(execution)h(of)f(Java)g(classes)146 3370 y(Note)e(that)g(the)f -(use)h(of)g(the)f(general)g(term)h(\223Java\224)f(implies)g(two)h -(meanings:)30 b(on)23 b(the)f(one)g(hand,)0 3491 y(Java)i(as)f(a)g(pr)n -(ogramming)i(language)f(is)g(meant,)f(on)h(the)g(other)g(hand,)f(the)h -(Java)g(V)-5 b(irtual)23 b(Machine,)0 3611 y(which)k(is)g(not)g -(necessarily)h(tar)n(geted)g(by)f(the)g(Java)f(language)h(exclusively) --11 b(,)28 b(but)g(may)e(be)h(used)g(by)0 3731 y(other)j(languages)f -(as)g(well)f(\(e.g.)43 b(Eif)n(fel)29 b([CCZ97],)g(or)h(Ada)e([T)-9 -b(af96]\).)42 b(W)-9 b(e)28 b(assume)h(the)g(r)n(eader)g(to)0 -3852 y(be)g(familiar)h(with)g(the)f(Java)h(language)g(and)f(to)h(have)f -(a)h(general)f(understanding)h(of)g(the)g(V)-5 b(irtual)0 -3972 y(Machine.)0 4320 y Fm(2.1)119 b(Java)29 b(class)h(\002le)g -(format)0 4525 y Fq(Giving)g(a)f(full)g(overview)h(of)g(the)f(design)g -(issues)h(of)f(the)h(Java)f(class)h(\002le)f(format)h(and)f(the)g -(associ-)0 4645 y(ated)h(byte)g(code)g(instr)o(uctions)j(is)d(beyond)g -(the)g(scope)h(of)f(this)h(paper)-7 b(.)45 b(W)-9 b(e)29 -b(will)h(just)h(give)f(a)g(brief)0 4766 y(intr)n(oduction)36 -b(covering)e(the)g(details)f(that)i(ar)n(e)e(necessary)h(for)g -(understanding)g(the)g(r)n(est)g(of)g(this)0 4886 y(paper)-7 -b(.)39 b(The)28 b(format)h(of)f(class)h(\002les)f(and)f(the)h(byte)h -(code)f(instr)o(uction)i(set)f(ar)n(e)f(described)g(in)f(mor)n(e)0 -5007 y(detail)k(in)f(the)h(\223Java)g(V)-5 b(irtual)31 -b(Machine)g(Speci\002cation\224)h([L)-9 b(Y97])2542 4970 -y Fn(2)2579 5007 y Fq(,)32 b(and)f(in)f([MD97].)49 b(Especially)-11 -b(,)0 5127 y(we)23 b(will)g(not)h(deal)e(with)i(the)f(security)h -(constraints)h(that)f(the)f(Java)g(V)-5 b(irtual)24 b(Machine)f(has)g -(to)g(check)0 5247 y(at)i(r)o(un-time,)h(i.e.)k(the)25 -b(byte)h(code)f(veri\002er)-7 b(.)p 0 5371 1530 4 v 116 -5433 a Fk(2)149 5463 y Fj(Also)21 b(available)f(online)i(at)e -Fi(http://www.javasoft.com/docs/books/)o(vmspe)o(c/inde)o(x.htm)o(l) -1888 5712 y Fq(3)p eop -%%Page: 4 4 -4 3 bop 146 407 a Fq(Figur)n(e)40 b(2)e(shows)i(a)e(simpli\002ed)h -(example)f(of)h(the)g(contents)h(of)f(a)g(Java)f(class)i(\002le:)58 -b(It)38 b(starts)0 527 y(with)c(a)f(header)g(containing)h(a)f -(\223magic)h(number)7 b(\224)33 b(\()p Fh(0xCAFEBABE)p -Fq(\))f(and)h(the)g(version)h(number)-7 b(,)0 648 y(followed)33 -b(by)f(the)g Fp(constant)h(pool)p Fq(,)g(which)g(can)e(be)h(r)n(oughly) -i(thought)g(of)e(as)g(the)g(text)h(segment)f(of)0 768 -y(an)j(executable,)j(the)e Fp(access)e(rights)g Fq(of)i(the)g(class)g -(encoded)f(by)h(a)f(bit)h(mask,)i(a)d(list)h(of)g(interfaces)0 -888 y(implemented)19 b(by)h(the)f(class,)i(lists)f(containing)h(the)f -(\002elds)f(and)g(methods)h(of)g(the)g(class,)h(and)e(\002nally)0 -1009 y(the)35 b Fp(class)f(attributes)p Fq(,)j(e.g.)60 -b(the)35 b Fh(SourceFile)d Fq(attribute)37 b(telling)e(the)g(name)f(of) -h(the)g(sour)n(ce)h(\002le.)0 1129 y(Attributes)28 b(ar)n(e)f(a)g(way)g -(of)g(putting)h(additional,)g(e.g.)36 b(user)n(-de\002ned,)28 -b(information)g(into)g(class)f(\002le)0 1249 y(data)e(str)o(uctur)n -(es.)34 b(For)26 b(example,)f(a)g(custom)h(class)g(loader)f(may)h -(evaluate)f(such)g(attribute)i(data)e(in)0 1370 y(or)n(der)h(to)f -(perform)h(its)f(transformations.)33 b(The)25 b(JVM)g(speci\002cation)h -(declar)n(es)f(that)g(unknown,)g(i.e.)0 1490 y(user)n(-de\002ned)g -(attributes)i(must)e(be)g(ignor)n(ed)h(by)f(any)g(V)-5 -b(irtual)25 b(Machine)g(implementation.)0 5123 y @beginspecial -0 @llx 0 @lly 520 @urx 460 @ury 4590 @rwi @setspecial -%%BeginDocument: eps/classfile.eps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: classfile.eps -%%Creator: fig2dev Version 3.2 Patchlevel 1 -%%CreationDate: Mon Nov 30 16:01:26 1998 -%%For: dahm@che (Markus Dahm,,,,,) -%%Orientation: Portrait -%%BoundingBox: 0 0 520 460 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def - -end -save --17.0 540.0 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def -%%EndProlog - -$F2psBegin -10 setmiterlimit -n -1000 10000 m -1000 -1000 l 9937 -1000 l 9937 10000 l cp clip - 0.06000 0.06000 sc -% Polyline -7.500 slw -n 2999 6599 m 2400 6599 l 2400 6749 l 2999 6749 l cp gs col0 s gr -% Polyline -n 2400 6749 m 2999 6749 l 2999 6899 l 2400 6899 l cp gs col0 s gr -% Polyline -n 2999 6899 m 2400 6899 l 2400 7049 l 2999 7049 l cp gs col0 s gr -% Polyline -n 2400 7049 m 2999 7049 l 2999 7200 l 2400 7200 l cp gs col0 s gr -% Polyline -n 2400 7200 m 2999 7200 l 2999 7349 l 2400 7349 l cp gs col0 s gr -% Polyline -30.000 slw - [15 45] 45 sd -n 2699 7424 m 2699 7724 l gs col0 s gr [] 0 sd -% Polyline -7.500 slw -n 299 6449 m 3299 6449 l 3299 7949 l 299 7949 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 6824 m -gs 1 -1 sc (Methods) col0 sh gr -% Polyline -n 2999 5099 m 2400 5099 l 2400 5249 l 2999 5249 l cp gs col0 s gr -% Polyline -n 2400 5249 m 2999 5249 l 2999 5399 l 2400 5399 l cp gs col0 s gr -% Polyline -n 2999 5399 m 2400 5399 l 2400 5549 l 2999 5549 l cp gs col0 s gr -% Polyline -n 2400 5549 m 2999 5549 l 2999 5699 l 2400 5699 l cp gs col0 s gr -% Polyline -n 2400 5699 m 2999 5699 l 2999 5849 l 2400 5849 l cp gs col0 s gr -% Polyline -30.000 slw - [15 45] 45 sd -n 2699 5924 m 2699 6224 l gs col0 s gr [] 0 sd -% Polyline -7.500 slw -n 299 4949 m 3299 4949 l 3299 6449 l 299 6449 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 5399 m -gs 1 -1 sc (Fields) col0 sh gr -% Polyline -n 299 4199 m 3299 4199 l 3299 4949 l 299 4949 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 4649 m -gs 1 -1 sc (Implemented interfaces) col0 sh gr -% Polyline -n 299 3449 m 3299 3449 l 3299 4199 l 299 4199 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 3899 m -gs 1 -1 sc (Access rights) col0 sh gr -% Polyline -n 299 1349 m 3299 1349 l 3299 2099 l 299 2099 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 1799 m -gs 1 -1 sc (Header) col0 sh gr -% Polyline -n 2999 2249 m 2400 2249 l 2400 2400 l 2999 2400 l cp gs col0 s gr -% Polyline -n 2400 2400 m 2999 2400 l 2999 2549 l 2400 2549 l cp gs col0 s gr -% Polyline -n 2999 2549 m 2400 2549 l 2400 2699 l 2999 2699 l cp gs col0 s gr -% Polyline -n 2400 2699 m 2999 2699 l 2999 2849 l 2400 2849 l cp gs col0 s gr -% Polyline -n 2400 2849 m 2999 2849 l 2999 2999 l 2400 2999 l cp gs col0 s gr -% Polyline -30.000 slw - [15 45] 45 sd -n 2699 3074 m 2699 3374 l gs col0 s gr [] 0 sd -% Polyline -7.500 slw -n 299 2099 m 3299 2099 l 3299 3449 l 299 3449 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 2549 m -gs 1 -1 sc (Constant pool) col0 sh gr -% Polyline -n 299 7949 m 3299 7949 l 3299 8699 l 299 8699 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -599 8400 m -gs 1 -1 sc (Class attributes) col0 sh gr -% Polyline -n 4800 2999 m 7499 2999 l 7499 4349 l 4800 4349 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -5099 3299 m -gs 1 -1 sc (ConstantFieldref) col0 sh gr -/Helvetica ff 210.00 scf sf -5099 3600 m -gs 1 -1 sc ("aVariable") col0 sh gr -/Helvetica ff 210.00 scf sf -5099 3884 m -gs 1 -1 sc ("[Ljava/lang/Object;") col0 sh gr -/Helvetica ff 210.00 scf sf -5099 4199 m -gs 1 -1 sc ("HelloWorld") col0 sh gr -% Polyline -n 5024 2624 m 7124 2624 l 7124 2924 l 5024 2924 l cp gs col0 s gr -/Helvetica ff 210.00 scf sf -5099 2849 m -gs 1 -1 sc ("java/io/PrintStream") col0 sh gr -% Polyline -n 4800 1649 m 7499 1649 l 7499 2999 l 4800 2999 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -5099 1949 m -gs 1 -1 sc (ConstantMethodRef) col0 sh gr -/Helvetica ff 210.00 scf sf -5099 2249 m -gs 1 -1 sc ("println") col0 sh gr -/Helvetica ff 210.00 scf sf -5099 2534 m -gs 1 -1 sc ("\(Ljava/lang/String;\)V") col0 sh gr -% Polyline -n 4800 4349 m 7499 4349 l 7499 5099 l 4800 5099 l cp gs col0 s gr -/Helvetica-Bold ff 210.00 scf sf -5099 4649 m -gs 1 -1 sc (ConstantClass) col0 sh gr -/Helvetica ff 210.00 scf sf -5099 4949 m -gs 1 -1 sc ("java/io/PrintStream") col0 sh gr -% Polyline -n 4080 6500 m 3975 6500 3975 7770 105 arcto 4 {pop} repeat - 3975 7875 8820 7875 105 arcto 4 {pop} repeat - 8925 7875 8925 6605 105 arcto 4 {pop} repeat - 8925 6500 4080 6500 105 arcto 4 {pop} repeat - cp gs 0.00 setgray ef gr gs col0 s gr -% Polyline -n 3855 6725 m 3750 6725 3750 7995 105 arcto 4 {pop} repeat - 3750 8100 8595 8100 105 arcto 4 {pop} repeat - 8700 8100 8700 6830 105 arcto 4 {pop} repeat - 8700 6725 3855 6725 105 arcto 4 {pop} repeat - cp gs col7 1.00 shd ef gr gs col0 s gr -% Polyline -30.000 slw - [15 45] 45 sd -n 6150 7800 m 6150 7950 l gs col0 s gr [] 0 sd -% Polyline -7.500 slw -n 5550 7200 m 7200 7200 l 7200 7425 l 5550 7425 l cp gs col0 s gr -% Polyline -n 5550 7500 m 8625 7500 l 8625 7725 l 5550 7725 l cp gs col0 s gr -/Courier-Bold ff 180.00 scf sf -4050 7050 m -gs 1 -1 sc (getstatic java.lang.System.out) col0 sh gr -/Courier-Bold ff 180.00 scf sf -4050 7650 m -gs 1 -1 sc (invokevirtual java.io.PrintStream.println) col0 sh gr -/Courier-Bold ff 180.00 scf sf -4050 7350 m -gs 1 -1 sc (ldc "Hello, world") col0 sh gr -% Polyline - [15 45] 45 sd -n 2400 2249 m 4800 1649 l gs col0 s gr [] 0 sd -% Polyline - [15 45] 45 sd -n 2400 2849 m 4800 5849 l gs col0 s gr [] 0 sd -% Polyline -gs clippath -4693 3661 m 4800 3600 l 4734 3705 l 4832 3611 l 4790 3568 l cp -clip -n 2999 5324 m 4800 3600 l gs col0 s gr gr - -% arrowhead -n 4693 3661 m 4800 3600 l 4734 3705 l 4713 3683 l 4693 3661 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -3669 7107 m 3750 7200 l 3635 7156 l 3745 7233 l 3779 7184 l cp -clip -n 2999 6674 m 3750 7200 l gs col0 s gr gr - -% arrowhead -n 3669 7107 m 3750 7200 l 3635 7156 l 3652 7131 l 3669 7107 l cp gs 0.00 setgray ef gr col0 s -% Polyline -n 5099 1649 m 5099 1349 l 7799 1349 l 7799 5549 l 7499 5549 l 7499 1649 l - 5099 1649 l cp gs 0.00 setgray ef gr gs col0 s gr -% Polyline - [15 45] 45 sd -n 2999 2849 m 4800 4049 l gs col0 s gr [] 0 sd -% Polyline - [15 45] 45 sd -n 2999 2249 m 4800 2024 l gs col0 s gr [] 0 sd -% Polyline -gs clippath -7609 2533 m 7500 2475 l 7624 2475 l 7493 2442 l 7478 2500 l cp -clip -n 7800 2550 m 7500 2475 l gs col7 s gr gr - -% arrowhead -n 7609 2533 m 7500 2475 l 7624 2475 l 7616 2504 l 7609 2533 l cp gs col7 1.00 shd ef gr col7 s -% Polyline -n 4800 5099 m 7499 5099 l 7499 5849 l 4800 5849 l cp gs col0 s gr -% Polyline -n 7800 7500 m 7801 7499 l 7804 7496 l 7809 7491 l 7816 7483 l 7826 7472 l - 7840 7457 l 7856 7440 l 7875 7419 l 7897 7395 l 7921 7368 l - 7946 7340 l 7973 7310 l 7999 7279 l 8026 7247 l 8052 7216 l - 8078 7184 l 8102 7152 l 8125 7121 l 8147 7090 l 8167 7059 l - 8186 7029 l 8203 6998 l 8220 6966 l 8235 6934 l 8250 6900 l - 8261 6873 l 8272 6845 l 8282 6816 l 8292 6786 l 8303 6756 l - 8313 6724 l 8323 6692 l 8333 6659 l 8343 6626 l 8353 6592 l - 8363 6557 l 8373 6522 l 8382 6487 l 8392 6451 l 8402 6415 l - 8412 6379 l 8421 6342 l 8431 6305 l 8440 6268 l 8449 6231 l - 8458 6194 l 8467 6157 l 8476 6120 l 8484 6082 l 8492 6045 l - 8500 6007 l 8508 5969 l 8515 5932 l 8522 5894 l 8528 5856 l - 8535 5817 l 8540 5778 l 8545 5739 l 8550 5700 l 8554 5664 l - 8557 5628 l 8560 5591 l 8563 5554 l 8565 5517 l 8567 5479 l - 8568 5440 l 8570 5401 l 8571 5362 l 8572 5322 l 8572 5281 l - 8573 5241 l 8573 5200 l 8573 5159 l 8573 5117 l 8573 5076 l - 8572 5034 l 8572 4992 l 8571 4950 l 8570 4908 l 8570 4866 l - 8569 4824 l 8568 4783 l 8567 4741 l 8566 4700 l 8565 4659 l - 8564 4619 l 8563 4578 l 8562 4538 l 8561 4499 l 8560 4460 l - 8559 4421 l 8558 4383 l 8557 4346 l 8555 4309 l 8554 4272 l - 8552 4236 l 8550 4200 l 8548 4161 l 8545 4121 l 8542 4083 l - 8540 4044 l 8537 4006 l 8534 3968 l 8531 3930 l 8528 3892 l - 8526 3854 l 8523 3815 l 8520 3777 l 8517 3739 l 8515 3702 l - 8512 3664 l 8509 3626 l 8506 3588 l 8503 3551 l 8500 3514 l - 8497 3477 l 8493 3440 l 8490 3404 l 8486 3368 l 8481 3333 l - 8477 3298 l 8471 3264 l 8466 3231 l 8460 3199 l 8453 3167 l - 8446 3136 l 8438 3107 l 8430 3078 l 8421 3051 l 8411 3025 l - 8400 3000 l 8385 2969 l 8368 2941 l 8349 2913 l 8328 2887 l - 8305 2862 l 8279 2838 l 8251 2814 l 8220 2790 l 8187 2767 l - 8153 2744 l 8117 2721 l 8080 2699 l 8043 2678 l 8006 2657 l - 7970 2638 l 7937 2620 l 7907 2604 l 7879 2590 l 7856 2578 l - 7837 2568 l 7823 2561 l 7812 2556 l 7805 2553 l 7802 2551 l - 7800 2550 l gs col0 s gr -% Polyline -gs clippath -4723 4703 m 4800 4800 l 4687 4750 l 4794 4833 l 4830 4785 l cp -clip -n 5025 2775 m 5024 2776 l 5020 2779 l 5015 2784 l 5006 2792 l 4993 2804 l - 4977 2818 l 4957 2836 l 4934 2857 l 4908 2881 l 4879 2907 l - 4849 2935 l 4818 2964 l 4786 2994 l 4754 3023 l 4723 3053 l - 4693 3082 l 4664 3110 l 4637 3137 l 4612 3163 l 4589 3188 l - 4568 3212 l 4549 3235 l 4531 3257 l 4515 3278 l 4500 3300 l - 4485 3324 l 4471 3347 l 4457 3371 l 4444 3396 l 4432 3420 l - 4419 3445 l 4408 3470 l 4396 3495 l 4385 3520 l 4374 3546 l - 4363 3571 l 4352 3596 l 4342 3622 l 4332 3647 l 4323 3673 l - 4314 3698 l 4306 3724 l 4299 3749 l 4292 3775 l 4286 3800 l - 4281 3825 l 4278 3850 l 4276 3875 l 4275 3900 l 4276 3925 l - 4278 3950 l 4282 3975 l 4287 4001 l 4293 4027 l 4301 4053 l - 4309 4080 l 4319 4106 l 4329 4133 l 4340 4160 l 4351 4187 l - 4363 4214 l 4375 4241 l 4387 4268 l 4399 4294 l 4411 4320 l - 4423 4345 l 4434 4370 l 4446 4394 l 4457 4417 l 4468 4439 l - 4478 4460 l 4489 4481 l 4500 4500 l 4513 4522 l 4528 4543 l - 4543 4563 l 4559 4583 l 4578 4603 l 4597 4623 l 4618 4643 l - 4640 4664 l 4663 4685 l 4686 4705 l 4709 4724 l 4730 4742 l - 4749 4758 l 4765 4772 l 4778 4783 l 4800 4800 l gs col0 s gr gr - -% arrowhead -n 4723 4703 m 4800 4800 l 4687 4750 l 4705 4727 l 4723 4703 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -7591 5782 m 7499 5699 l 7619 5728 l 7500 5665 l 7472 5719 l cp -clip -n 7200 7275 m 7203 7274 l 7208 7271 l 7219 7265 l 7235 7257 l 7256 7246 l - 7282 7233 l 7312 7217 l 7346 7200 l 7381 7182 l 7417 7163 l - 7453 7144 l 7487 7126 l 7520 7109 l 7551 7092 l 7580 7076 l - 7607 7061 l 7631 7048 l 7654 7034 l 7676 7022 l 7696 7010 l - 7714 6998 l 7733 6986 l 7750 6975 l 7770 6961 l 7790 6947 l - 7810 6933 l 7829 6918 l 7847 6903 l 7866 6887 l 7883 6871 l - 7901 6855 l 7917 6837 l 7933 6820 l 7947 6802 l 7961 6784 l - 7973 6766 l 7984 6748 l 7994 6729 l 8003 6711 l 8010 6693 l - 8016 6675 l 8021 6656 l 8025 6638 l 8028 6618 l 8030 6598 l - 8031 6578 l 8031 6556 l 8030 6534 l 8029 6511 l 8026 6487 l - 8023 6462 l 8019 6438 l 8015 6412 l 8009 6387 l 8004 6362 l - 7997 6338 l 7991 6314 l 7984 6291 l 7977 6269 l 7971 6247 l - 7964 6226 l 7957 6207 l 7950 6187 l 7942 6167 l 7934 6146 l - 7926 6126 l 7918 6106 l 7909 6086 l 7900 6066 l 7891 6046 l - 7881 6027 l 7871 6008 l 7861 5990 l 7850 5972 l 7840 5956 l - 7829 5940 l 7818 5925 l 7807 5911 l 7797 5898 l 7785 5886 l - 7774 5874 l 7762 5863 l 7750 5852 l 7737 5841 l 7722 5830 l - 7707 5819 l 7689 5807 l 7670 5795 l 7648 5782 l 7625 5769 l - 7602 5755 l 7578 5742 l 7555 5729 l 7535 5718 l 7499 5699 l gs col0 s gr gr - -% arrowhead -n 7591 5782 m 7499 5699 l 7619 5728 l 7605 5755 l 7591 5782 l cp gs 0.00 setgray ef gr col0 s -/Helvetica ff 210.00 scf sf -975 9000 m -gs 1 -1 sc (HelloWorld.class) col0 sh gr -/Helvetica ff 210.00 scf sf -5099 5699 m -gs 1 -1 sc ("Hello, world") col0 sh gr -/Helvetica-Bold ff 210.00 scf sf -5099 5399 m -gs 1 -1 sc (ConstantString) col0 sh gr -$F2psEnd -rs - -%%EndDocument - @endspecial 1252 5327 a(Figur)n(e)h(2:)31 b(Java)25 -b(class)g(\002le)g(format)1888 5712 y(4)p eop -%%Page: 5 5 -5 4 bop 146 407 a Fq(Because)20 b(all)f(of)h(the)g(information)h -(needed)d(to)i(dynamically)g(r)n(esolve)h(the)f(symbolic)g(r)n(efer)n -(ences)0 527 y(to)32 b(classes,)h(\002elds)e(and)g(methods)h(at)f(r)o -(un-time)h(is)f(coded)h(with)f(string)i(constants,)h(the)d(constant)0 -648 y(pool)40 b(contains)g(in)g(fact)g(the)f(lar)n(gest)i(portion)f(of) -g(an)f(average)h(class)f(\002le,)k(appr)n(oximately)e(60\045)0 -768 y([AP98)o(].)31 b(The)25 b(byte)h(code)f(instr)o(uctions)i -(themselves)f(just)g(make)e(up)h(12\045.)146 893 y(The)43 -b(right)g(upper)g(box)g(shows)h(a)e(\223zoomed\224)h(excerpt)g(of)g -(the)g(constant)h(pool,)j(while)c(the)0 1014 y(r)n(ounded)37 -b(box)g(below)f(depicts)h(some)g(instr)o(uctions)i(that)e(ar)n(e)f -(contained)h(within)g(a)f(method)g(of)0 1134 y(the)e(example)f(class.) -56 b(These)34 b(instr)o(uctions)i(r)n(epr)n(esent)e(the)f -(straightforwar)n(d)k(translation)e(of)f(the)0 1254 y(well-known)26 -b(statement:)179 1522 y Fh(System.out.println\("Hello,)54 -b(world"\);)146 1784 y Fq(The)22 b(\002rst)h(instr)o(uction)h(loads)e -(the)g(contents)h(of)f(the)g(\002eld)g Fh(out)f Fq(of)h(class)h -Fh(java.lang.System)0 1904 y Fq(onto)30 b(the)g(operand)f(stack.)44 -b(This)29 b(is)h(an)e(instance)i(of)f(the)h(class)f Fh -(java.io.PrintStream)p Fq(.)39 b(The)0 2025 y Fh(ldc)25 -b Fq(\(\223Load)g(constant\224\))i(pushes)f(a)f(r)n(efer)n(ence)h(to)g -(the)g(string)h(\224Hello)e(world\224)h(on)g(the)g(stack.)33 -b(The)0 2145 y(next)28 b(instr)o(uction)j(invokes)e(the)f(instance)g -(method)g Fh(println)f Fq(which)h(takes)g(both)h(values)f(as)g(pa-)0 -2265 y(rameters)36 b(\(Instance)g(methods)g(always)h(implicitly)f(take) -g(an)g(instance)g(r)n(efer)n(ence)g(as)f(their)i(\002rst)0 -2386 y(ar)n(gument\).)146 2511 y(Instr)o(uctions,)24 -b(other)d(data)g(str)o(uctur)n(es)i(within)e(the)g(class)g(\002le)f -(and)h(constants)h(themselves)f(may)0 2632 y(r)n(efer)33 -b(to)g(constants)h(in)f(the)f(constant)i(pool.)54 b(Such)33 -b(r)n(efer)n(ences)g(ar)n(e)g(implemented)f(via)g(\002xed)h(in-)0 -2752 y(dexes)h(encoded)g(dir)n(ectly)i(into)f(the)f(instr)o(uctions.)62 -b(This)34 b(is)g(illustrated)i(for)f(some)f(items)h(of)g(the)0 -2872 y(\002gur)n(e)26 b(emphasized)e(with)h(a)g(surr)n(ounding)i(box.) -146 2998 y(For)h(example,)f(the)h Fh(invokevirtual)c -Fq(instr)o(uction)29 b(r)n(efers)f(to)g(a)f Fh(MethodRef)e -Fq(constant)j(that)0 3118 y(contains)34 b(information)h(about)f(the)g -(name)f(of)h(the)f(called)g(method,)j(the)d(signatur)n(e)i(\(i.e.)56 -b(the)33 b(en-)0 3238 y(coded)38 b(ar)n(gument)h(and)f(r)n(eturn)h -(types\),)j(and)c(to)h(which)f(class)h(the)f(method)h(belongs.)71 -b(In)37 b(fact,)0 3359 y(as)c(emphasized)f(by)h(the)g(boxed)g(value,)i -(the)e Fh(MethodRef)d Fq(constant)35 b(itself)e(just)h(r)n(efers)f(to)h -(other)0 3479 y(entries)23 b(holding)f(the)h(r)n(eal)f(data,)g(e.g.)30 -b(it)23 b(r)n(efers)g(to)g(a)f Fh(ConstantClass)d Fq(entry)k -(containing)g(a)f(sym-)0 3599 y(bolic)36 b(r)n(efer)n(ence)h(to)f(the)g -(class)g Fh(java.io.PrintStream)p Fq(.)60 b(T)-9 b(o)36 -b(keep)f(the)h(class)g(\002le)g(compact,)0 3720 y(such)29 -b(constants)i(ar)n(e)e(typically)h(shar)n(ed)f(by)g(dif)n(fer)n(ent)h -(instr)o(uctions.)45 b(Similarly)-11 b(,)30 b(a)f(\002eld)f(is)h(r)n -(epr)n(e-)0 3840 y(sented)23 b(by)g(a)f Fh(Fieldref)f -Fq(constant)k(that)e(includes)g(information)h(about)g(the)f(name,)f -(the)h(type)g(and)0 3961 y(the)i(containing)h(class)g(of)f(the)g -(\002eld.)146 4086 y(The)37 b(constant)i(pool)f(basically)g(holds)f -(the)h(following)g(types)g(of)g(constants:)57 b(Refer)n(ences)37 -b(to)0 4206 y(methods,)25 b(\002elds)g(and)g(classes,)g(strings,)i -(integers,)f(\003oats,)f(longs,)h(and)e(doubles.)0 4540 -y Fm(2.2)119 b(Byte)30 b(code)g(instruction)f(set)0 4741 -y Fq(The)f(JVM)h(is)f(a)g(stack-oriented)i(interpr)n(eter)g(that)f(cr)n -(eates)g(a)f(local)g(stack)i(frame)e(of)h(\002xed)f(size)g(for)0 -4861 y(every)21 b(method)f(invocation.)31 b(The)19 b(size)h(of)h(the)f -(local)h(stack)g(has)f(to)h(be)f(computed)g(by)h(the)f(compiler)-7 -b(.)0 4981 y(V)e(alues)21 b(may)h(also)g(be)f(stor)n(ed)i -(intermediately)f(in)f(a)h(frame)f(ar)n(ea)h(containing)g -Fp(local)f(variables)g Fq(which)0 5102 y(can)28 b(be)g(used)g(like)h(a) -f(set)h(of)f(r)n(egisters.)43 b(These)28 b(local)g(variables)h(ar)n(e)f -(number)n(ed)h(fr)n(om)g(0)f(to)h(65535,)0 5222 y(i.e.)60 -b(you)36 b(have)e(a)h(maximum)g(of)g(65536)f(of)h(local)g(variables.)61 -b(The)34 b(stack)i(frames)f(of)g(caller)g(and)0 5342 -y(callee)25 b(method)i(ar)n(e)f(overlapping,)h(i.e.)34 -b(the)26 b(caller)g(pushes)g(ar)n(guments)h(onto)h(the)e(operand)g -(stack)0 5463 y(and)f(the)g(called)f(method)i(r)n(eceives)f(them)g(in)g -(local)g(variables.)1888 5712 y(5)p eop -%%Page: 6 6 -6 5 bop 146 407 a Fq(The)32 b(byte)g(code)g(instr)o(uction)j(set)d -(curr)n(ently)i(consists)f(of)g(212)e(instr)o(uctions,)36 -b(44)31 b(opcodes)i(ar)n(e)0 527 y(marked)g(as)g(r)n(eserved)g(and)g -(may)g(be)f(used)h(for)h(futur)n(e)g(extensions)g(or)g(intermediate)f -(optimiza-)0 648 y(tions)22 b(within)f(the)g(V)-5 b(irtual)21 -b(Machine.)29 b(The)21 b(instr)o(uction)i(set)e(can)g(be)g(r)n(oughly)h -(gr)n(ouped)g(as)f(follows:)0 893 y Fg(Stack)k(operations:)49 -b Fq(Constants)26 b(can)e(be)h(pushed)f(onto)i(the)f(stack)g(either)g -(by)g(loading)g(them)g(fr)n(om)244 1013 y(the)f(constant)h(pool)f(with) -h(the)e Fh(ldc)g Fq(instr)o(uction)j(or)f(with)f(special)g -(\223short-cut\224)h(instr)o(uctions)244 1134 y(wher)n(e)37 -b(the)g(operand)f(is)h(encoded)g(into)g(the)g(instr)o(uctions,)43 -b(e.g.)66 b Fh(iconst)p 3211 1134 30 4 v 34 w(0)37 b -Fq(or)g Fh(bipush)244 1254 y Fq(\(push)25 b(byte)h(value\).)0 -1469 y Fg(Arithmetic)e(operations:)50 b Fq(The)36 b(instr)o(uction)k -(set)d(of)h(the)f(Java)h(V)-5 b(irtual)37 b(Machine)g(distinguishes)244 -1590 y(its)24 b(operand)e(types)i(using)g(dif)n(fer)n(ent)g(instr)o -(uctions)h(to)f(operate)f(on)h(values)f(of)g(speci\002c)h(type.)244 -1710 y(Arithmetic)32 b(operations)g(starting)i(with)d -Fh(i)p Fq(,)i(for)f(example,)h(denote)e(an)g(integer)h(operation.)244 -1831 y(E.g.,)k Fh(iadd)e Fq(that)h(adds)f(two)h(integers)g(and)f -(pushes)g(the)g(r)n(esult)i(back)e(on)h(the)f(stack.)60 -b(The)244 1951 y(Java)23 b(types)h Fh(boolean)p Fq(,)d -Fh(byte)p Fq(,)i Fh(short)p Fq(,)f(and)g Fh(char)g Fq(ar)n(e)h(handled) -f(as)h(integers)h(by)g(the)f(JVM.)0 2166 y Fg(Control)j(\003ow:)49 -b Fq(Ther)n(e)40 b(ar)n(e)g(branch)h(instr)o(uctions)i(like)d -Fh(goto)g Fq(and)g Fh(if)p 2836 2166 V 35 w(icmpeq)p -Fq(,)j(which)d(com-)244 2287 y(par)n(es)32 b(two)h(integers)g(for)h -(equality)-11 b(.)52 b(Ther)n(e)33 b(is)f(also)h(a)f -Fh(jsr)f Fq(\(jump)i(sub-r)n(outine\))h(and)e Fh(ret)244 -2407 y Fq(pair)26 b(of)i(instr)o(uctions)h(that)e(is)g(used)f(to)h -(implement)g(the)f Fh(finally)f Fq(clause)i(of)g Fh(try-catch)244 -2528 y Fq(blocks.)32 b(Exceptions)26 b(may)f(be)g(thr)n(own)h(with)g -(the)f Fh(athrow)e Fq(instr)o(uction.)244 2696 y(Branch)30 -b(tar)n(gets)i(ar)n(e)f(coded)f(as)h(of)n(fsets)h(fr)n(om)f(the)g(curr) -n(ent)g(byte)g(code)g(position,)i(i.e.)46 b(with)244 -2816 y(an)25 b(integer)g(number)-7 b(.)0 3031 y Fg(Load)25 -b(and)f(store)i(operations)49 b Fq(for)31 b(local)h(variables)f(like)f -Fh(iload)g Fq(and)g Fh(istore)p Fq(.)47 b(Ther)n(e)31 -b(ar)n(e)g(also)244 3152 y(array)26 b(operations)g(like)f -Fh(iastore)e Fq(which)i(stor)n(es)i(an)d(integer)i(value)f(into)g(an)g -(array)-11 b(.)0 3367 y Fg(Field)25 b(access:)50 b Fq(The)24 -b(value)g(of)h(an)f(instance)h(\002eld)f(may)g(be)g(r)n(etrieved)i -(with)e Fh(getfield)f Fq(and)h(writ-)244 3488 y(ten)d(with)g -Fh(putfield)p Fq(.)28 b(For)22 b(static)g(\002elds,)g(ther)n(e)g(ar)n -(e)f Fh(getstatic)e Fq(and)h Fh(putstatic)f Fq(coun-)244 -3608 y(terparts.)0 3824 y Fg(Method)25 b(invocation:)50 -b Fq(Methods)20 b(may)f(either)g(be)g(called)f(via)h(static)h(r)n(efer) -n(ences)g(with)f Fh(invokesta-)244 3944 y(tic)40 b Fq(or)i(be)f(bound)g -(virtually)i(with)e(the)g Fh(invokevirtual)e Fq(instr)o(uction.)81 -b(Super)41 b(class)244 4064 y(methods)25 b(and)g(private)g(methods)h -(ar)n(e)f(invoked)h(with)f Fh(invokespecial)p Fq(.)0 -4280 y Fg(Object)g(allocation:)50 b Fq(Class)28 b(instances)g(ar)n(e)g -(allocated)g(with)h(the)f Fh(new)f Fq(instr)o(uction,)k(arrays)e(of)f -(ba-)244 4400 y(sic)j(type)g(like)f Fh(int[])f Fq(with)i -Fh(newarray)p Fq(,)f(arrays)i(of)f(r)n(efer)n(ences)g(like)f -Fh(String[][])e Fq(with)244 4521 y Fh(anewarray)23 b -Fq(or)i Fh(multianewarray)p Fq(.)0 4736 y Fg(Conversion)h(and)e(type)h -(checking:)49 b Fq(For)23 b(stack)g(operands)g(of)f(basic)g(type)h -(ther)n(e)f(exist)h(casting)g(op-)244 4856 y(erations)35 -b(like)e Fh(f2i)g Fq(which)i(converts)g(a)e(\003oat)h(value)g(into)h -(an)e(integer)-7 b(.)58 b(The)33 b(validity)i(of)f(a)244 -4977 y(type)24 b(cast)h(may)f(be)f(checked)h(with)g Fh(checkcast)e -Fq(and)i(the)g Fh(instanceof)d Fq(operator)k(can)f(be)244 -5097 y(dir)n(ectly)i(mapped)e(to)i(the)f(equally)g(named)f(instr)o -(uction.)146 5342 y(Most)38 b(instr)o(uctions)i(have)c(a)h(\002xed)g -(length,)j(but)d(ther)n(e)g(ar)n(e)g(also)g(some)g(variable-length)h -(in-)0 5463 y(str)o(uctions:)59 b(In)37 b(particular)-7 -b(,)41 b(the)d Fh(lookupswitch)c Fq(and)j Fh(tableswitch)f -Fq(instr)o(uctions,)43 b(which)1888 5712 y(6)p eop -%%Page: 7 7 -7 6 bop 0 407 a Fq(ar)n(e)31 b(used)f(to)h(implement)g -Fh(switch\(\))d Fq(statements.)49 b(Since)31 b(the)g(number)f(of)h -Fh(case)f Fq(clauses)h(may)0 527 y(vary)-11 b(,)26 b(these)f(instr)o -(uctions)i(contain)f(a)f(variable)g(number)g(of)g(statements.)146 -648 y(W)-9 b(e)27 b(will)g(not)h(list)g(all)f(byte)h(code)g(instr)o -(uctions)i(her)n(e,)e(since)f(these)h(ar)n(e)f(explained)g(in)g(detail) -g(in)0 768 y(the)g(JVM)g(speci\002cation.)37 b(The)26 -b(opcode)h(names)f(ar)n(e)h(mostly)h(self-explaining,)f(so)g -(understanding)0 888 y(the)e(following)h(code)g(examples)e(should)i(be) -e(fairly)i(intuitive.)0 1183 y Fm(2.3)119 b(Method)30 -b(code)0 1373 y Fq(Non-abstract)35 b(methods)g(contain)f(an)g -(attribute)h(\()p Fh(Code)p Fq(\))e(that)h(holds)g(the)g(following)h -(data:)48 b(The)0 1493 y(maximum)27 b(size)f(of)h(the)f(method's)h -(stack)g(frame,)g(the)f(number)h(of)g(local)g(variables)f(and)g(an)g -(array)0 1614 y(of)i(byte)h(code)f(instr)o(uctions.)43 -b(Optionally)-11 b(,)29 b(it)g(may)f(also)g(contain)h(information)g -(about)g(the)f(names)0 1734 y(of)d(local)h(variables)f(and)g(sour)n(ce) -h(\002le)f(line)f(numbers)i(that)f(can)g(be)g(used)g(by)g(a)g(debugger) --7 b(.)146 1855 y(Whenever)23 b(an)h(exception)h(is)f(thr)n(own,)h(the) -f(JVM)g(performs)h(exception)f(handling)g(by)g(looking)0 -1975 y(into)31 b(a)f(table)h(of)g(exception)g(handlers.)47 -b(The)31 b(table)f(marks)h(handlers,)h(i.e.)47 b(pieces)30 -b(of)h(code,)h(to)f(be)0 2095 y(r)n(esponsible)23 b(for)h(exceptions)f -(of)h(certain)f(types)g(that)g(ar)n(e)g(raised)g(within)g(a)f(given)h -(ar)n(ea)f(of)i(the)e(byte)0 2216 y(code.)63 b(When)35 -b(ther)n(e)g(is)h(no)g(appr)n(opriate)g(handler)f(the)h(exception)g(is) -g(pr)n(opagated)g(back)g(to)h(the)0 2336 y(caller)29 -b(of)h(the)f(method.)43 b(The)29 b(handler)g(information)h(is)f(itself) -h(stor)n(ed)g(in)f(an)g(attribute)i(contained)0 2456 -y(within)25 b(the)h Fh(Code)e Fq(attribute.)0 2751 y -Fm(2.4)119 b(Byte)30 b(code)g(of)n(fsets)0 2941 y Fq(T)-9 -b(ar)n(gets)32 b(of)g(branch)f(instr)o(uctions)j(like)d -Fh(goto)f Fq(ar)n(e)h(encoded)g(as)g(r)n(elative)h(of)n(fsets)g(in)f -(the)h(array)f(of)0 3062 y(byte)i(codes.)55 b(Exception)33 -b(handlers)g(and)f(local)h(variables)g(r)n(efer)g(to)g(absolute)h(addr) -n(esses)e(within)0 3182 y(the)26 b(byte)g(code.)34 b(The)26 -b(former)h(contains)f(r)n(efer)n(ences)h(to)g(the)f(start)h(and)e(the)h -(end)g(of)g(the)g Fh(try)f Fq(block,)0 3302 y(and)d(to)i(the)e(instr)o -(uction)j(handler)e(code.)30 b(The)22 b(latter)h(marks)h(the)e(range)h -(in)g(which)g(a)f(local)h(variable)0 3423 y(is)g(valid,)f(i.e.)30 -b(its)23 b(scope.)30 b(This)23 b(makes)f(it)h(dif)n(\002cult)h(to)f -(insert)g(or)g(delete)f(code)g(ar)n(eas)h(on)f(this)h(level)f(of)0 -3543 y(abstraction,)29 b(since)f(one)f(has)g(to)h(r)n(ecompute)g(the)f -(of)n(fsets)i(every)f(time)f(and)g(update)f(the)i(r)n(eferring)0 -3663 y(objects.)k(W)-9 b(e)24 b(will)h(see)g(in)g(section)h(3.3)e(how)i -Fo(BCEL)i Fq(r)n(emedies)d(this)h(r)n(estriction.)0 3958 -y Fm(2.5)119 b(T)-11 b(ype)30 b(information)0 4148 y -Fq(Java)k(is)h(a)f(type-safe)h(language)f(and)g(the)g(information)i -(about)f(the)f(types)h(of)g(\002elds,)i(local)d(vari-)0 -4269 y(ables,)27 b(and)g(methods)g(is)g(stor)n(ed)h(in)f -Fp(signatur)n(es)p Fq(.)37 b(These)26 b(ar)n(e)h(strings)i(stor)n(ed)f -(in)f(the)g(constant)h(pool)0 4389 y(and)35 b(encoded)h(in)f(a)g -(special)h(format.)64 b(For)36 b(example)f(the)h(ar)n(gument)h(and)e(r) -n(eturn)h(types)h(of)f(the)0 4509 y Fh(main)24 b Fq(method)120 -4688 y Fh(public)58 b(static)g(void)h(main\(String[])e(argv\))146 -4866 y Fq(ar)n(e)25 b(r)n(epr)n(esented)h(by)f(the)g(signatur)n(e)120 -5044 y Fh(\([java/lang/String;\)V)146 5222 y Fq(Classes)19 -b(and)g(arrays)h(ar)n(e)f(internally)g(r)n(epr)n(esented)h(by)f -(strings)i(like)e Fh("java/lang/String")p Fq(,)0 5342 -y(basic)k(types)g(like)g Fh(float)e Fq(by)i(an)f(integer)h(number)-7 -b(.)30 b(W)-5 b(ithin)22 b(signatur)n(es)i(they)f(ar)n(e)g(r)n(epr)n -(esented)g(by)0 5463 y(single)i(characters,)h(e.g.,)f -Fh("I")p Fq(,)f(for)i(integer)-7 b(.)1888 5712 y(7)p -eop -%%Page: 8 8 -8 7 bop 0 407 a Fm(2.6)119 b(Code)30 b(example)0 608 -y Fq(The)25 b(following)i(example)e(pr)n(ogram)i(pr)n(ompts)g(for)f(a)f -(number)h(and)f(prints)h(the)g(faculty)g(of)g(it.)33 -b(The)0 728 y Fh(readLine\(\))19 b Fq(method)i(r)n(eading)g(fr)n(om)h -(the)f(standar)n(d)h(input)f(may)g(raise)g(an)g Fh(IOException)d -Fq(and)0 849 y(if)h(a)g(misspelled)f(number)h(is)h(passed)e(to)i -Fh(parseInt\(\))d Fq(it)i(thr)n(ows)i(a)e Fh(NumberFormatException)p -Fq(.)0 969 y(Thus,)25 b(the)g(critical)h(ar)n(ea)f(of)h(code)f(must)g -(be)g(encapsulated)g(in)g(a)f Fh(try-catch)f Fq(block.)0 -1230 y Ff(import)52 b(java.io.*;)0 1343 y(public)g(class)g(Faculty)f({) -109 1456 y(private)g(static)h(BufferedReader)c(in)54 -b(=)g(new)f(BufferedReader\(n)o(ew)1745 1569 y(InputStreamReade)o(r\()o -(Sy)o(st)o(em.)o(in)o(\)\))o(;)109 1682 y(public)f(static)g(final)g -(int)h(fac\(int)f(n\))h({)218 1795 y(return)f(\(n)i(==)f(0\)?)g(1)i(:)f -(n)g(*)g(fac\(n)e(-)i(1\);)109 1907 y(})109 2020 y(public)e(static)g -(final)g(int)h(readInt\(\))e({)218 2133 y(int)i(n)h(=)h(4711;)218 -2246 y(try)e({)327 2359 y(System.out.prin)o(t\(")o(Pl)o(ea)o(se)48 -b(enter)k(a)i(number>)e("\);)327 2472 y(n)i(=)g(Integer.parseInt)o(\(i) -o(n.)o(re)o(adL)o(in)o(e\()o(\)\))o(;)218 2585 y(})g(catch\(IOExcepti)o -(on)48 b(e1\))53 b({)h(System.err.print)o(ln)o(\(e)o(1\))o(;)48 -b(})327 2698 y(catch\(NumberFor)o(mat)o(Ex)o(ce)o(pt)o(io)o(n)h(e2\))k -({)h(System.err.pri)o(ntl)o(n\()o(e2)o(\);)48 b(})218 -2811 y(return)k(n;)109 2924 y(})109 3037 y(public)g(static)g(void)g -(main\(String[])d(argv\))j({)218 3149 y(int)h(n)h(=)h(readInt\(\);)218 -3262 y(System.out.prin)o(tl)o(n\(")o(Fa)o(cu)o(lt)o(y)48 -b(of)54 b(")g(+)g(n)g(+)g(")h(is)e(")h(+)g(fac\(n\)\);)109 -3375 y(}})146 3631 y Ft(This)23 b(code)f(example)g(typically)h -(compiles)g(to)f(the)g(following)h(chunks)e(of)i(byte)f(code:)0 -3921 y Fg(2.6.1)99 b(Method)25 b(fac)0 4108 y Ff(0:)108 -b(iload_0)0 4221 y(1:)g(ifne)653 b(#8)0 4334 y(4:)108 -b(iconst_1)0 4447 y(5:)g(goto)653 b(#16)0 4560 y(8:)108 -b(iload_0)0 4672 y(9:)g(iload_0)0 4785 y(10:)53 b(iconst_1)0 -4898 y(11:)g(isub)0 5011 y(12:)g(invokestatic)213 b(Faculty.fac)49 -b(\(I\)I)k(\(12\))0 5124 y(15:)g(imul)0 5237 y(16:)g(ireturn)0 -5463 y(LocalVariable\(s)o(ta)o(rt)o(_p)o(c)c(=)54 b(0,)f(length)f(=)i -(16,)f(index)g(=)h(0:int)e(n\))1888 5712 y Fq(8)p eop -%%Page: 9 9 -9 8 bop 146 407 a Ft(The)21 b(method)f Ff(fac)h Ft(has)g(only)g(one)g -(local)i(variable,)g(the)e(ar)n(gument)g Ff(n)p Ft(,)g(stor)n(ed)f(in)i -(slot)f(0.)28 b(This)21 b(variable's)0 520 y(scope)k(ranges)g(fr)n(om)h -(the)g(start)f(of)h(the)f(byte)g(code)g(sequence)g(to)g(the)g(very)h -(end.)37 b(If)26 b(the)f(value)i(of)f Ff(n)g Ft(\(stor)n(ed)0 -633 y(in)i(local)h(variable)g(0,)g(i.e.)41 b(the)27 b(value)h(fetched)e -(with)i Ff(iload)p 2148 633 28 4 v 30 w(0)p Ft(\))f(is)h(not)e(equal)i -(to)f(0,)h(the)f Ff(ifne)e Ft(instr)o(uction)0 746 y(branches)20 -b(to)f(the)g(byte)g(code)g(at)h(of)n(fset)f(8,)h(otherwise)e(a)j(1)f -(is)g(pushed)e(onto)g(the)h(operand)g(stack)g(and)h(the)f(con-)0 -858 y(tr)n(ol)24 b(\003ow)h(branches)f(to)g(the)f(\002nal)i(r)n(eturn.) -33 b(For)23 b(ease)h(of)g(r)n(eading,)g(the)g(of)n(fsets)f(of)h(the)g -(branch)h(instr)o(uctions,)0 971 y(which)e(ar)n(e)g(actually)h(r)n -(elative,)f(ar)n(e)g(displayed)f(as)g(absolute)h(addr)n(esses)d(in)j -(these)e(examples.)146 1084 y(If)27 b(r)n(ecursion)f(has)g(to)g -(continue,)h(the)f(ar)n(guments)f(for)i(the)e(multiplication)j(\()p -Ff(n)f Ft(and)f Ff(fac\(n)53 b(-)h(1\))p Ft(\))26 b(ar)n(e)0 -1197 y(evaluated)21 b(and)g(the)f(r)n(esults)g(pushed)f(onto)h(the)g -(operand)f(stack.)27 b(After)20 b(the)h(multiplication)h(operation)e -(has)0 1310 y(been)i(performed)f(the)h(function)h(r)n(eturns)e(the)h -(computed)f(value)i(fr)n(om)g(the)f(top)g(of)h(the)e(stack.)0 -1569 y Fg(2.6.2)99 b(Method)25 b(readInt)0 1745 y Ff(0:)108 -b(sipush)434 b(4711)0 1858 y(3:)108 b(istore_0)0 1971 -y(4:)g(getstatic)269 b(java.lang.Syst)o(em.)o(ou)o(t)48 -b(Ljava/io/PrintS)o(tre)o(am)o(;)0 2084 y(7:)108 b(ldc)599 -b("Please)51 b(enter)h(a)j(number>)c(")0 2197 y(9:)108 -b(invokevirtual)49 b(java.io.PrintS)o(tre)o(am)o(.p)o(ri)o(nt)f -(\(Ljava/lang/Str)o(in)o(g;)o(\)V)0 2310 y(12:)53 b(getstatic)269 -b(Faculty.in)50 b(Ljava/io/Buffe)o(red)o(Re)o(ad)o(er)o(;)0 -2423 y(15:)j(invokevirtual)c(java.io.Buffer)o(edR)o(ea)o(de)o(r.)o(re)o -(adL)o(in)o(e)f(\(\)Ljava/lang/St)o(rin)o(g;)0 2536 y(18:)53 -b(invokestatic)104 b(java.lang.Inte)o(ger)o(.p)o(ar)o(se)o(In)o(t)49 -b(\(Ljava/lang/St)o(ri)o(ng)o(;\))o(I)0 2649 y(21:)k(istore_0)0 -2762 y(22:)g(goto)544 b(#44)0 2875 y(25:)53 b(astore_1)0 -2987 y(26:)g(getstatic)269 b(java.lang.Syst)o(em.)o(er)o(r)48 -b(Ljava/io/PrintS)o(tre)o(am)o(;)0 3100 y(29:)53 b(aload_1)0 -3213 y(30:)g(invokevirtual)c(java.io.PrintS)o(tre)o(am)o(.p)o(ri)o(nt)o -(ln)f(\(Ljava/lang/Obj)o(ec)o(t;)o(\)V)0 3326 y(33:)53 -b(goto)544 b(#44)0 3439 y(36:)53 b(astore_1)0 3552 y(37:)g(getstatic) -269 b(java.lang.Syst)o(em.)o(er)o(r)48 b(Ljava/io/PrintS)o(tre)o(am)o -(;)0 3665 y(40:)53 b(aload_1)0 3778 y(41:)g(invokevirtual)c -(java.io.PrintS)o(tre)o(am)o(.p)o(ri)o(nt)o(ln)f(\(Ljava/lang/Obj)o(ec) -o(t;)o(\)V)0 3891 y(44:)53 b(iload_0)0 4004 y(45:)g(ireturn)0 -4229 y(Exception)d(handler\(s\))g(=)0 4342 y(From)216 -b(To)327 b(Handler)51 b(Type)0 4455 y(4)381 b(22)327 -b(25)f(java.io.IOExcep)o(ti)o(on)o(\(6\))0 4568 y(4)381 -b(22)327 b(36)f(NumberFormatExc)o(ep)o(ti)o(on\()o(10)o(\))146 -4785 y Ft(First)34 b(the)g(local)j(variable)f Ff(n)f -Ft(\(in)g(slot)g(0\))g(is)g(initialized)i(to)d(the)g(value)h(4711.)67 -b(The)34 b(next)g(instr)o(uction,)0 4898 y Ff(getstatic)p -Ft(,)f(loads)i(the)f(static)g Ff(System.out)d Ft(\002eld)j(onto)f(the)h -(stack.)64 b(Then)34 b(a)h(string)e(is)i(loaded)f(and)0 -5011 y(printed,)21 b(a)i(number)g(r)n(ead)f(fr)n(om)h(the)f(standar)n -(d)g(input)h(and)f(assigned)f(to)h Ff(n)p Ft(.)146 5124 -y(If)g(one)f(of)h(the)f(called)h(methods)e(\()p Ff(readLine\(\))e -Ft(and)k Ff(parseInt\(\))p Ft(\))17 b(thr)n(ows)k(an)h(exception,)f -(the)f(Java)0 5237 y(V)-5 b(irtual)26 b(Machine)h(calls)h(one)d(of)h -(the)f(declar)n(ed)h(exception)f(handlers,)h(depending)e(on)h(the)g -(type)g(of)h(the)f(ex-)0 5350 y(ception.)36 b(The)24 -b Ff(try)p Ft(-clause)h(itself)h(does)e(not)g(pr)n(oduce)h(any)g(code,) -g(it)h(mer)n(ely)f(de\002nes)f(the)h(range)g(in)h(which)0 -5463 y(the)e(following)h(handlers)f(ar)n(e)h(active.)35 -b(In)24 b(the)g(example)g(the)g(speci\002ed)g(sour)n(ce)g(code)g(ar)n -(ea)h(maps)g(to)f(a)h(byte)1888 5712 y Fq(9)p eop -%%Page: 10 10 -10 9 bop 0 407 a Ft(code)23 b(ar)n(ea)h(ranging)f(fr)n(om)h(of)n(fset)f -(4)h(\(inclusive\))h(to)e(22)h(\(exclusive\).)31 b(If)24 -b(no)f(exception)f(has)h(occurr)n(ed)g(\(\223nor)n(-)0 -520 y(mal\224)i(execution)e(\003ow\))h(the)f Ff(goto)f -Ft(instr)o(uctions)h(branch)i(behind)e(the)g(handler)g(code.)31 -b(Ther)n(e)23 b(the)g(value)h(of)0 633 y Ff(n)e Ft(is)h(loaded)f(and)h -(r)n(eturned.)146 750 y(For)e(example)g(the)f(handler)h(for)g -Ff(java.io.IOExcep)o(ti)o(on)15 b Ft(starts)20 b(at)h(of)n(fset)g(25.) -28 b(It)20 b(simply)i(prints)e(the)0 863 y(err)n(or)i(and)h(branches)f -(back)i(to)e(the)f(normal)j(execution)d(\003ow)-8 b(,)22 -b(i.e.)28 b(as)23 b(if)g(no)f(exception)g(had)g(occurr)n(ed.)0 -1223 y Fr(3)143 b(The)35 b(BCEL)g(API)0 1443 y Ft(The)25 -b Fe(BCEL)j Ft(API)d(abstracts)h(fr)n(om)g(the)f(concr)n(ete)h(cir)n -(cumstances)g(of)g(the)f(Java)j(V)-5 b(irtual)26 b(Machine)h(and)f(how) -0 1556 y(to)c(r)n(ead)h(and)f(write)g(binary)i(Java)g(class)f(\002les.) -k(The)22 b(API)g(mainly)i(consists)d(of)i(thr)n(ee)f(parts:)127 -1795 y(1.)49 b(A)26 b(package)f(that)h(contains)g(classes)g(that)g -(describe)f(\223static\224)i(constraints)e(of)h(class)h(\002les,)f -(i.e.,)g(r)n(e\003ect)244 1908 y(the)g(class)h(\002le)f(format)h(and)g -(is)f(not)g(intended)f(for)h(byte)g(code)g(modi\002cations.)39 -b(The)26 b(classes)g(may)h(be)244 2021 y(used)e(to)h(r)n(ead)g(and)h -(write)f(class)g(\002les)h(fr)n(om)g(or)f(to)g(a)h(\002le.)39 -b(This)26 b(is)h(useful)f(especially)g(for)h(analyzing)244 -2134 y(Java)34 b(classes)f(without)e(having)j(the)e(sour)n(ce)g -(\002les)g(at)h(hand.)59 b(The)32 b(main)i(data)f(str)o(uctur)n(e)e(is) -i(called)244 2247 y Ff(JavaClass)19 b Ft(which)k(contains)f(methods,)f -(\002elds,)g(etc..)127 2453 y(2.)49 b(A)23 b(package)h(to)f -(dynamically)i(generate)d(or)h(modify)h Ff(JavaClass)19 -b Ft(objects.)31 b(It)23 b(may)h(be)g(used)e(e.g.)30 -b(to)244 2565 y(insert)20 b(analysis)i(code,)e(to)h(strip)g -(unnecessary)e(information)j(fr)n(om)g(class)f(\002les,)g(or)g(to)g -(implement)g(the)244 2678 y(code)h(generator)f(back-end)h(of)h(a)g -(Java)h(compiler)-7 b(.)127 2884 y(3.)49 b(V)-8 b(arious)21 -b(code)g(examples)h(and)g(utilities)g(like)g(a)h(class)f(\002le)g -(viewer)-7 b(,)22 b(a)h(tool)e(to)h(convert)f(class)i(\002les)e(into) -244 2997 y(HTML,)g(and)i(a)g(converter)f(fr)n(om)h(class)g(\002les)f -(to)g(the)g(Jasmin)i(assembly)e(language)g([MD97)r(].)0 -3313 y Fm(3.1)119 b(JavaClass)0 3499 y Ft(The)16 b(\223static\224)j -(component)d(of)h(the)f Fe(BCEL)i Ft(API)e(r)n(esides)g(in)i(the)e -(package)h Ff(de.fub.bytecode)o(.c)o(la)o(ss)o(fi)o(le)0 -3612 y Ft(and)22 b(r)n(epr)n(esents)e(class)i(\002les.)27 -b(All)c(of)f(the)f(binary)i(components)d(and)i(data)g(str)o(uctur)n(es) -f(declar)n(ed)g(in)i(the)e(JVM)0 3725 y(speci\002cation)27 -b([L)-8 b(Y97])26 b(and)h(described)e(in)i(section)e(2)i(ar)n(e)g -(mapped)f(to)g(classes.)38 b(Figur)n(e)26 b(3)h(shows)e(an)i(UML)0 -3837 y(diagram)34 b(of)f(the)g(hierar)n(chy)g(of)h(classes)f(of)g(the)f -Fe(BCEL)k Ft(API.)c(Figur)n(e)h(8)h(in)f(the)g(appendix)f(also)i(shows) -e(a)0 3950 y(detailed)22 b(diagram)h(of)g(the)f Ff(ConstantPool)17 -b Ft(components.)146 4068 y(The)23 b(top-level)g(data)g(str)o(uctur)n -(e)g(is)g Ff(JavaClass)p Ft(,)c(which)24 b(in)g(most)f(cases)g(is)g(cr) -n(eated)g(by)g(a)h Ff(ClassPar-)0 4181 y(ser)d Ft(object)g(that)h(is)g -(capable)h(of)f(parsing)f(binary)i(class)f(\002les.)27 -b(A)22 b Ff(JavaClass)c Ft(object)k(basically)h(consists)e(of)0 -4294 y(\002elds,)h(methods,)e(symbolic)j(r)n(efer)n(ences)f(to)g(the)g -(super)f(class)i(and)g(to)f(the)f(implemented)h(interfaces.)146 -4411 y(The)c(constant)f(pool)g(serves)g(as)h(some)f(kind)g(of)h -(central)h(r)n(epository)c(and)j(is)g(thus)f(of)h(outstanding)e(impor)n -(-)0 4524 y(tance)29 b(for)g(all)h(components.)45 b Ff(ConstantPool)24 -b Ft(objects)k(contain)i(an)f(array)h(of)f(\002xed)f(size)h(of)g -Ff(Constant)0 4637 y Ft(entries,)34 b(which)g(may)f(be)g(r)n(etrieved)f -(via)i(the)f Ff(getConstant\(\))27 b Ft(method)32 b(taking)g(an)i -(integer)d(index)i(as)0 4750 y(ar)n(gument.)58 b(Indexes)31 -b(to)h(the)h(constant)f(pool)g(may)h(be)g(contained)g(in)g(instr)o -(uctions)f(as)i(well)f(as)g(in)g(other)0 4863 y(components)21 -b(of)h(a)i(class)f(\002le)f(and)h(in)g(constant)f(pool)g(entries)f -(themselves.)146 4980 y(Methods)j(and)i(\002elds)f(contain)h(a)g -(signatur)n(e,)g(symbolically)h(de\002ning)e(their)g(types.)35 -b(Access)25 b(\003ags)h(like)0 5093 y Ff(public)52 b(static)g(final)26 -b Ft(occur)i(in)h(several)f(places)h(and)f(ar)n(e)h(encoded)d(by)j(an)f -(integer)f(bit)i(mask,)g(e.g.)0 5206 y Ff(public)52 b(static)g(final)20 -b Ft(matches)j(to)f(the)f(Java)k(expr)n(ession)109 5463 -y Ff(int)53 b(access_flags)c(=)54 b(ACC_PUBLIC)c(|)55 -b(ACC_STATIC)50 b(|)k(ACC_FINAL;)1863 5712 y Fq(10)p -eop -%%Page: 11 11 -11 10 bop 570 5113 a @beginspecial 13 @llx 12 @lly 471 -@urx 830 @ury 3221 @rwi @setspecial -%%BeginDocument: eps/javaclass.eps -%!PS-Adobe-3.0 EPSF-3.0 -%%Title: Rose Diagram(s) -%%Creator: AdobePS5.dll Version 5.0 -%%CreationDate: 7/7/1999 17:45:7 -%%Pages: 1 -%%Orientation: Portrait -%%PageOrder: Ascend -%%DocumentNeededResources: (atend) -%%DocumentSuppliedResources: (atend) -%%DocumentData: Clean7Bit -%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 -%%LanguageLevel: 2 -%%BoundingBox: 13 12 471 830 -%%EndComments -%%BeginProcSet: epsffit 1 0 -gsave -1233.763 -187.599 translate -90 rotate -1.782 1.782 scale -%%EndProcSet - - -%%BeginDefaults -%%PageBoundingBox: 13 12 582 830 -%%EndDefaults - -%%BeginProlog -%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 -/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false -setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype -ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch -def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 -rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def -/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def -typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 -def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp -exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def -/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype -{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} -readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop -(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def -/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) -tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup -xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint -tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck -{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) -tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup -rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} -forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier -/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin -$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 -ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto -(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt -$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} -repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print -(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup -0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop -/setpacking where{pop oldpack setpacking}if}if -%%EndResource -userdict /Pscript_WinNT_Incr 230 dict dup begin put -%%BeginResource: file Pscript_FatalError 5.0 0 -/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div -cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def -%%EndResource -/VM?{vmstatus exch sub exch pop gt{[ -(This job requires more memory than is available in this printer.)100 500 -(Try one or more of the following, and then print again:)100 485 -(For the output format, choose Optimize For Portability.)115 470 -(In the Device Settings page, make sure the Available PostScript Memory is accurate.) -115 455(Reduce the number of fonts in the document.)115 440 -(Print the document in parts.)115 425 12/Times-Roman showpage -(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def -%%BeginResource: file Pscript_Win_Basic 5.0 0 -/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ -/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- -/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , -d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C -/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M -/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d -/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage -, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false -/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d -/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, -d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx -matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit -/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} -b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U -/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d -reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d -/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 -sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} -b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b -/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b -/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} -b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b -%%EndResource -%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 -/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge -{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ -snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F -setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d -/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b -%%EndResource -end -%%EndProlog - -%%BeginSetup -[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec -1 setlinecap 1 setlinejoin -/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def -%%EndSetup - -%%Page: 1 1 -%%PageBoundingBox: 13 12 582 830 -%%EndPageComments -%%BeginPageSetup -/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh -%%EndPageSetup - -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Win_GdiObject 5.0 0 -/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore -{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d -/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps -L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType -1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d -/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal -{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep -gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b -/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M -MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep -M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 -+}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d -/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix -GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 -/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal -makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 -/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d -/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] -d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 -0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne -{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd -aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx -PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save -8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 -Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx -matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` -xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill -{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot -concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap -YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 --0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix -currentmatrix readonly d ; ;}if}b -%%EndResource -%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 -/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} -{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 -d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d -20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d -/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ -/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict -~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} -? ;}b -%%EndResource -end reinitialize -: N 712 1406 246 93 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 958 1405 M 711 1405 I 711 1499 I 958 1499 I C -K -0 0 0 1 scol Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Text 5.0 0 -/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d -/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ -length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets -{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& -/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} -if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ -{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get -StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ -{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ -length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ -put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M -currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d -/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N -/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix -astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get -length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d -/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS -{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 -copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for -& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ -4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 -add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for -/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 -Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName -length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length -string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ -putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 -$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? -{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName -get undefinefont}forall undefinefont}b -%%EndResource -end reinitialize -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Encoding256 5.0 0 -/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction -/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign -/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma -/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S -/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave -/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright -/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis -/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef -/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet -/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef -/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section -/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered -/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph -/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter -/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis -/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute -/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls -/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute -/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve -/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex -/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put -%%EndResource -end reinitialize - -%%IncludeResource: font Helvetica -F /F0 0 /256 T /Helvetica mF -/F0S1C F0 [28.75 0 0 -28.75 0 0 ] mFS -F0S1C Ji -735 1441 M (ExceptionTable)[19 13 15 16 16 8 7 16 16 19 16 16 7 0]xS -0.602 0 0.199 1 scol N 958 1456 M 711 1456 I 711 1499 I 958 1499 I C -K -N 958 1473 M 711 1473 I 711 1499 I 958 1499 I C -K -: N 1484 1418 275 93 rp C -1 1 0.801 1 scol L ; N 1759 1417 M 1483 1417 I 1483 1511 I 1759 1511 I C -K -0 0 0 1 scol 1505 1453 M (LineNumberTable)[16 7 16 16 21 16 25 16 16 10 19 16 16 7 0]xS -0.602 0 0.199 1 scol N 1759 1469 M 1483 1469 I 1483 1511 I 1759 1511 I C -K -N 1759 1485 M 1483 1485 I 1483 1511 I 1759 1511 I C -K -: N 1039 1411 318 253 rp C -1 1 0.801 1 scol L ; N 1357 1410 M 1038 1410 I 1038 1664 I 1357 1664 I C -K -0 0 0 1 scol 1163 1446 M (Code)[21 16 16 0]xS -0.602 0 0.199 1 scol N 1357 1462 M 1038 1462 I 1038 1664 I 1357 1664 I C -K -N 1357 1578 M 1038 1578 I 1038 1664 I 1357 1664 I C -K -0 0 0 1 scol 1083 1493 M (max_stack : int)[25 16 13 16 15 8 16 15 14 8 8 8 7 16 0]xS -1083 1527 M (max_locals : int)[25 16 13 16 7 16 15 16 7 15 8 8 8 7 16 0]xS -1083 1560 M (exception_handlers)[16 13 15 16 16 8 7 16 16 16 16 16 16 16 7 16 10 0]xS -1083 1626 M (getCode\(\))[16 16 8 21 16 16 16 10 0]xS -0.602 0 0.199 1 scol N 1420 1499 M 1358 1508 I K -N 1358 1508 M 1380 1516 I 1398 1502 I 1377 1494 I 1358 1508 I C -: 1 1 1 1 scol O ; K -N 1420 1499 M 1482 1487 I K -N 1462 1432 16 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 1462 1459 M (1)S -N 1462 1432 16 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 1462 1459 M (1)S -: N 1742 1576 291 93 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2033 1575 M 1741 1575 I 1741 1669 I 2033 1669 I C -K -0 0 0 1 scol 1762 1611 M (LocalVariableTable)[16 16 15 16 7 19 16 10 7 16 16 7 16 19 16 16 7 0]xS -0.602 0 0.199 1 scol N 2033 1626 M 1741 1626 I 1741 1669 I 2033 1669 I C -K -N 2033 1643 M 1741 1643 I 1741 1669 I 2033 1669 I C -K -N 1549 1580 M 1358 1556 I K -N 1358 1556 M 1380 1547 I 1398 1562 I 1377 1570 I 1358 1556 I C -: 1 1 1 1 scol O ; K -N 1549 1580 M 1740 1603 I K -: N 1709 1625 15 34 rp C -1 1 1 1 scol L ; N 1709 1625 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1709 1652 M (1)S -: N 1709 1625 15 34 rp C -1 1 1 1 scol L ; N 1709 1625 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1709 1652 M (1)S -: N 1573 1128 218 93 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1791 1127 M 1572 1127 I 1572 1221 I 1791 1221 I C -K -0 0 0 1 scol 1597 1163 M (InnerClasses)[7 16 16 16 10 21 7 16 15 15 16 0]xS -0.602 0 0.199 1 scol N 1791 1178 M 1572 1178 I 1572 1221 I 1791 1221 I C -K -N 1791 1195 M 1572 1195 I 1572 1221 I 1791 1221 I C -K -: N 1855 1128 186 93 rp C -1 1 0.801 1 scol L ; N 2041 1127 M 1854 1127 I 1854 1221 I 2041 1221 I C -K -0 0 0 1 scol 1878 1163 M (SourceFile)[19 16 16 10 15 16 18 7 7 0]xS -0.602 0 0.199 1 scol N 2041 1178 M 1854 1178 I 1854 1221 I 2041 1221 I C -K -N 2041 1195 M 1854 1195 I 1854 1221 I 2041 1221 I C -K -: N 450 1406 190 93 rp C -1 1 0.801 1 scol L ; N 640 1405 M 449 1405 I 449 1499 I 640 1499 I C -K -0 0 0 1 scol 470 1441 M (Deprecated)[21 16 16 10 16 15 16 8 16 0]xS -0.602 0 0.199 1 scol N 640 1456 M 449 1456 I 449 1499 I 640 1499 I C -K -N 640 1473 M 449 1473 I 449 1499 I 640 1499 I C -K -: N 2049 1418 161 93 rp C -1 1 0.801 1 scol L ; N 2210 1417 M 2048 1417 I 2048 1511 I 2210 1511 I C -K -0 0 0 1 scol 2069 1453 M (Unknown)[21 16 14 16 16 21 0]xS -0.602 0 0.199 1 scol N 2210 1469 M 2048 1469 I 2048 1511 I 2210 1511 I C -K -N 2210 1485 M 2048 1485 I 2048 1511 I 2210 1511 I C -K -: N 2105 1128 171 93 rp C -1 1 0.801 1 scol L ; N 2276 1127 M 2104 1127 I 2104 1221 I 2276 1221 I C -K -0 0 0 1 scol 2131 1163 M (Synthetic)[19 13 16 8 16 16 8 7 0]xS -0.602 0 0.199 1 scol N 2276 1178 M 2104 1178 I 2104 1221 I 2276 1221 I C -K -N 2276 1195 M 2104 1195 I 2104 1221 I 2276 1221 I C -K -: N 521 1128 240 93 rp C -1 1 0.801 1 scol L ; N 761 1127 M 520 1127 I 520 1221 I 761 1221 I C -K -0 0 0 1 scol 546 1163 M (ConstantValue)[21 16 16 15 8 16 16 8 19 16 7 16 0]xS -0.602 0 0.199 1 scol N 761 1177 M 520 1177 I 520 1221 I 761 1221 I C -K -N 761 1193 M 520 1193 I 520 1221 I 761 1221 I C -K -: N 491 628 204 125 rp C -1 1 0.801 1 scol L ; N 695 627 M 490 627 I 490 753 I 695 753 I C -K -0.496 0.496 0.496 1 scol 1 Lj 1 Lc 12 Lw solid N 495 748 M 691 748 I 691 632 I : 0.754 0.754 +S K -; 0 0 0 1 scol 513 663 M (ClassParser)[21 7 16 15 15 19 16 10 15 16 0]xS -0.602 0 0.199 1 scol 1 Lw solid N 695 676 M 490 676 I 490 753 I 695 753 I C -K -N 695 693 M 490 693 I 490 753 I 695 753 I C -K -0 0 0 1 scol 535 741 M (parse\(\))[16 16 10 15 16 10 0]xS -: N 1168 1116 157 93 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1325 1115 M 1167 1115 I 1167 1209 I 1325 1209 I C -K -0 0 0 1 scol 1192 1151 M (Attribute)[19 8 8 10 7 16 16 8 0]xS -0.602 0 0.199 1 scol N 1325 1164 M 1167 1164 I 1167 1209 I 1325 1209 I C -K -N 1325 1181 M 1167 1181 I 1167 1209 I 1325 1209 I C -K -N 1225 1279 M 1225 1210 I K -N 528 1279 M 2187 1279 I K -N 1225 1210 M 1242 1255 I 1209 1255 I C -: 1 1 1 1 scol O ; K -N 1190 1410 M 1190 1279 I K -N 1091 1329 276 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1091 1356 M (<>)[17 17 23 16 8 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 1602 1417 M 1602 1279 I K -N 1479 1381 251 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1479 1408 M (<>)[17 17 21 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 1941 1222 M 1941 1279 I K -N 1823 1234 255 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1823 1261 M (<>)[17 17 21 7 16 15 15 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 840 1405 M 840 1279 I K -N 728 1326 276 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 728 1353 M (<>)[17 17 23 16 8 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 2132 1417 M 2132 1279 I K -N 528 1405 M 528 1279 I K -N 416 1326 276 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 416 1353 M (<>)[17 17 23 16 8 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 1870 1575 M 1870 1279 I K -N 1748 1523 250 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1748 1550 M (<>)[17 17 21 16 16 16 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 1673 1222 M 1673 1279 I K -N 1541 1234 255 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1541 1261 M (<>)[17 17 21 7 16 15 15 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 2187 1222 M 2187 1279 I K -N 2068 1234 255 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 2068 1261 M (<>)[17 17 21 7 16 15 15 8 16 8 8 10 7 16 16 8 16 17 0]xS -0.602 0 0.199 1 scol N 638 1222 M 638 1279 I K -N 536 1233 245 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 536 1260 M (<>)[17 17 18 7 16 7 16 8 16 8 8 10 7 16 16 8 16 17 0]xS -: N 1130 845 233 126 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1363 844 M 1129 844 I 1129 971 I 1363 971 I C -K -0 0 0 1 scol -%%IncludeResource: font Helvetica-Oblique -F /F1 0 /256 T /Helvetica-Oblique mF -/F1S1C F1 [28.75 0 0 -28.75 0 0 ] mFS -F1S1C Ji -1150 880 M (FieldOrMethod)[18 7 16 7 16 23 10 24 16 8 16 16 0]xS -0.602 0 0.199 1 scol N 1363 894 M 1129 894 I 1129 971 I 1363 971 I C -K -N 1363 911 M 1129 911 I 1129 971 I 1363 971 I C -K -0 0 0 1 scol 1174 960 M (getName\(\))[16 16 8 21 16 24 16 10 0]xS -: N 571 845 214 126 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 785 844 M 570 844 I 570 971 I 785 971 I C -K -0 0 0 1 scol 594 880 M (AccessFlags)[19 15 15 16 15 15 18 7 16 16 0]xS -0.602 0 0.199 1 scol N 785 894 M 570 894 I 570 971 I 785 971 I C -K -N 785 911 M 570 911 I 570 971 I 785 971 I C -K -0 0 0 1 scol 614 960 M (isPublic\(\))[7 15 19 16 16 7 7 15 10 0]xS -0.602 0 0.199 1 scol N 1128 908 M 786 908 I K -N 786 908 M 831 925 I 831 891 I C -: 1 1 1 1 scol O ; K -N 1237 1043 M 1237 972 I K -N 992 1043 M 1497 1043 I K -N 1237 972 M 1253 1017 I 1220 1017 I C -: 1 1 1 1 scol O ; K -: N 1494 1023 134 84 rp C -1 1 0.801 1 scol L ; N 1628 1022 M 1493 1022 I 1493 1107 I 1628 1107 I C -K -0 0 0 1 scol F0S1C Ji -1513 1058 M (Method)[23 16 8 16 16 0]xS -0.602 0 0.199 1 scol N 1628 1074 M 1493 1074 I 1493 1107 I 1628 1107 I C -K -N 1628 1090 M 1493 1090 I 1493 1107 I 1628 1107 I C -K -N 1409 1111 M 1492 1085 I K -N 1488 1110 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1488 1137 M (1)S -0.602 0 0.199 1 scol N 1492 1085 M 1476 1102 I 1454 1097 I 1470 1080 I 1492 1085 I C -: 1 1 1 1 scol O ; K -N 1409 1111 M 1326 1136 I K -N 1341 1157 11 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1341 1184 M (*)S -N 1488 1110 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1488 1137 M (1)S -N 1341 1157 11 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1341 1184 M (*)S -0.602 0 0.199 1 scol N 1497 1028 M 1497 1043 I K -: N 1734 802 235 139 rp C -1 1 0.801 1 scol L ; N 1969 801 M 1733 801 I 1733 941 I 1969 941 I C -K -0 0 0 1 scol 1764 837 M (ConstantPool)[21 16 16 15 8 16 16 8 19 16 16 0]xS -0.602 0 0.199 1 scol N 1969 853 M 1733 853 I 1733 941 I 1969 941 I C -K -N 1969 869 M 1733 869 I 1733 941 I 1969 941 I C -K -0 0 0 1 scol 1777 918 M (getConstant\(\))[16 16 8 21 16 16 15 8 16 16 8 10 0]xS -: N 1088 610 317 160 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1405 609 M 1087 609 I 1087 770 I 1405 770 I C -K -0 0 0 1 scol 1179 645 M (JavaClass)[15 16 13 16 21 7 16 15 0]xS -0.602 0 0.199 1 scol N 1405 659 M 1087 659 I 1087 770 I 1405 770 I C -K -N 1405 676 M 1087 676 I 1087 770 I 1405 770 I C -K -0 0 0 1 scol 1131 724 M (getInterfaceNames\(\))[16 16 8 7 16 8 16 10 8 16 15 16 21 16 25 16 15 10 0]xS -1131 757 M (getSuperclassName\(\))[16 16 8 19 16 16 16 10 15 7 16 15 15 21 16 25 16 10 0]xS -0.602 0 0.199 1 scol N 1419 896 M 1314 771 I K -N 1287 794 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1287 821 M (1)S -0.602 0 0.199 1 scol N 1314 771 M 1336 779 I 1340 802 I 1318 794 I 1314 771 I C -: 1 1 1 1 scol O ; K -N 1419 896 M 1524 1021 I K -N 1539 966 11 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 1539 993 M (*)S -N 1287 794 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1287 821 M (1)S -N 1539 966 11 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 1539 993 M (*)S -1 1 1 1 scol [ 72 24 ] 0 sd N 696 690 M 1086 690 I K -0 0 0 1 scol [ 72 24 ] 0 sd N 696 690 M 1086 690 I K -3 Lw solid N 1086 690 M 1059 701 I : 0.754 0.754 +S K -; N 1086 690 M 1059 679 I : 0.754 0.754 +S K -; N 847 641 164 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 847 668 M (<>)[17 17 15 10 16 16 8 16 15 17 0]xS -0.602 0 0.199 1 scol 1 Lw solid N 1569 786 M 1406 737 I K -N 1569 786 M 1732 835 I K -N 1086 751 M 786 866 I K -N 786 866 M 834 866 I 822 834 I C -: 1 1 1 1 scol O ; K -: N 865 1023 134 84 rp C -1 1 0.801 1 scol L ; N 999 1022 M 864 1022 I 864 1107 I 999 1107 I C -K -0 0 0 1 scol 899 1058 M (Field)[18 7 16 7 0]xS -0.602 0 0.199 1 scol N 999 1072 M 864 1072 I 864 1107 I 999 1107 I C -K -N 999 1089 M 864 1089 I 864 1107 I 999 1107 I C -K -N 1083 1111 M 1000 1086 I K -N 990 1111 16 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 990 1138 M (1)S -0.602 0 0.199 1 scol N 1000 1086 M 1023 1081 I 1039 1098 I 1017 1102 I 1000 1086 I C -: 1 1 1 1 scol O ; K -N 1083 1111 M 1166 1136 I K -N 1165 1079 11 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1165 1106 M (*)S -N 990 1111 16 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 990 1138 M (1)S -N 1165 1079 11 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1165 1106 M (*)S -0.602 0 0.199 1 scol N 992 1067 M 992 1043 I K -N 1072 896 M 1177 771 I K -N 1190 794 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1190 821 M (1)S -0.602 0 0.199 1 scol N 1177 771 M 1173 794 I 1150 802 I 1155 779 I 1177 771 I C -: 1 1 1 1 scol O ; K -N 1072 896 M 967 1021 I K -N 1004 1018 11 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 1004 1045 M (*)S -N 1190 794 16 33 rp C -1 1 1 1 scol L 0 0 0 1 scol 1190 821 M (1)S -N 1004 1018 11 34 rp C -1 1 1 1 scol L 0 0 0 1 scol 1004 1045 M (*)S -LH -%%PageTrailer - -%%Trailer -%%DocumentNeededResources: -%%+ font Helvetica-Oblique -%%+ font Helvetica -%%DocumentSuppliedResources: -Pscript_WinNT_Incr dup /terminate get exec -%%EOF -grestore - -%%EndDocument - @endspecial 990 5316 a Fq(Figur)n(e)26 b(3:)31 b(UML)24 -b(diagram)i(for)f(the)h Fo(BCEL)i Fq(API)1863 5712 y(11)p -eop -%%Page: 12 12 -12 11 bop 146 407 a Ft(As)17 b(mentioned)f(in)h(section)g(2.1)g(alr)n -(eady)-10 b(,)19 b(several)e(components)e(may)j(contain)f -Fs(attribute)i Ft(objects:)25 b(classes,)0 520 y(\002elds,)43 -b(methods,)f(and)e Ff(Code)e Ft(objects)h(\(intr)n(oduced)g(in)h -(section)f(2.3\).)81 b(The)39 b(latter)g(is)h(an)g(attribute)g(it-)0 -633 y(self)f(that)h(contains)f(the)g(actual)h(byte)f(code)f(array)-10 -b(,)44 b(the)39 b(maximum)i(stack)e(size,)k(the)c(number)g(of)h(local)0 -746 y(variables,)c(a)d(table)f(of)h(handled)e(exceptions,)i(and)f(some) -g(optional)g(debugging)e(information)j(coded)e(as)0 858 -y Ff(LineNumberTable)23 b Ft(and)29 b Ff(LocalVariableTa)o(bl)o(e)24 -b Ft(attributes.)47 b(Attributes)27 b(ar)n(e)j(in)g(general)f -(speci\002c)0 971 y(to)c(some)g(data)g(str)o(uctur)n(e,)g(i.e.)37 -b(no)25 b(two)g(components)f(shar)n(e)h(the)g(same)g(kind)h(of)f -(attribute,)h(though)e(this)h(is)0 1084 y(not)h(explicitly)h -(forbidden.)40 b(In)26 b(the)g(\002gur)n(e)g(the)g Ff(Attribute)d -Ft(classes)j(ar)n(e)i(marked)e(with)g(the)g(component)0 -1197 y(they)21 b(belong)h(to.)0 1482 y Fm(3.2)119 b(Class)30 -b(repository)0 1659 y Ft(Using)35 b(the)g(pr)n(ovided)g -Ff(Repository)c Ft(class,)39 b(r)n(eading)d(class)g(\002les)g(into)f(a) -h Ff(JavaClass)c Ft(object)k(is)g(quite)0 1772 y(simple:)109 -1970 y Ff(JavaClass)51 b(clazz)h(=)i(Repository.look)o(up)o(Cl)o(as)o -(s\()o("ja)o(va)o(.l)o(an)o(g.)o(Str)o(in)o(g")o(\);)146 -2168 y Ft(The)19 b(r)n(epository)e(also)i(contains)g(methods)f(pr)n -(oviding)h(the)f(dynamic)i(equivalent)f(of)g(the)g Ff(instanceof)0 -2281 y Ft(operator)-7 b(,)21 b(and)i(other)e(useful)h(r)n(outines:)109 -2479 y Ff(if\(Repository.i)o(ns)o(ta)o(nce)o(Of)o(\(c)o(la)o(zz)o(,)49 -b(super_class\))g({)218 2592 y(...)109 2705 y(})0 2961 -y Fg(3.2.1)99 b(Accessing)25 b(class)h(\002le)f(data)0 -3138 y Ft(Information)39 b(within)g(the)f(class)i(\002le)f(components)e -(may)j(be)e(accessed)g(like)i(Java)g(Beans)e(via)j(intuitive)0 -3251 y(set/get)19 b(methods.)26 b(All)c(of)g(them)f(also)h(de\002ne)e -(a)i Ff(toString\(\))17 b Ft(method)j(so)h(that)h(implementing)f(a)h -(simple)0 3364 y(class)h(viewer)f(is)h(very)f(easy)-10 -b(.)27 b(In)22 b(fact)i(all)g(of)f(the)e(examples)i(used)e(her)n(e)h -(have)h(been)f(pr)n(oduced)f(this)h(way:)109 3562 y Ff(System.out.prin) -o(tl)o(n\()o(cla)o(zz)o(\);)109 3675 y(printCode\(clazz)o(.g)o(et)o -(Met)o(ho)o(ds)o(\(\))o(\);)109 3788 y(...)109 3901 y(public)52 -b(static)g(void)g(printCode\(Method)o([])c(methods\))j({)218 -4014 y(for\(int)h(i=0;)g(i)i(<)g(methods.length;)48 b(i++\))53 -b({)327 4127 y(System.out.prin)o(tln)o(\(m)o(et)o(ho)o(ds)o([i])o(\);) -327 4352 y(Code)g(code)g(=)h(methods[i].get)o(Cod)o(e\()o(\);)327 -4465 y(if\(code)e(!=)h(null\))g(//)g(Non-abstract)c(method)436 -4578 y(System.out.print)o(ln)o(\(c)o(od)o(e\))o(;)218 -4691 y(})109 4804 y(})0 5060 y Fg(3.2.2)99 b(Analyzing)25 -b(class)g(data)0 5237 y Ft(Last)g(but)h(not)f(least,)h -Fe(BCEL)i Ft(supports)23 b(the)i Fs(V)-7 b(isitor)28 -b Ft(design)d(pattern)g([GHJV95)q(],)h(so)g(one)f(can)i(write)e -(visitor)0 5350 y(objects)e(to)h(traverse)f(and)h(analyze)h(the)e -(contents)f(of)i(a)h(class)f(\002le.)32 b(Included)23 -b(in)h(the)g(distribution)f(is)h(a)h(class)0 5463 y Ff(JasminVisitor)17 -b Ft(that)22 b(converts)g(class)h(\002les)f(into)h(the)e(Jasmin)j -(assembler)e(language)h([MD97)q(].)1863 5712 y Fq(12)p -eop -%%Page: 13 13 -13 12 bop 0 407 a Fm(3.3)119 b(ClassGen)0 587 y Ft(This)26 -b(part)g(of)g(the)g(API)g(\(package)g Ff(de.fub.bytecod)o(e.)o(gen)o -(er)o(ic)o Ft(\))21 b(supplies)k(an)i(abstraction)f(level)h(for)0 -700 y(cr)n(eating)c(or)f(transforming)g(class)h(\002les)f(dynamically) --10 b(.)29 b(It)22 b(makes)g(the)g(static)g(constraints)g(of)g(Java)j -(class)d(\002les)0 813 y(like)35 b(the)e(har)n(d-coded)h(byte)f(code)h -(addr)n(esses)e(generic.)63 b(The)34 b(generic)f(constant)h(pool,)j -(for)d(example,)j(is)0 926 y(implemented)23 b(by)h(the)f(class)h -Ff(ConstantPoolGen)18 b Ft(which)24 b(of)n(fers)g(methods)e(for)i -(adding)f(dif)n(fer)n(ent)h(types)0 1039 y(of)h(constants.)34 -b(Accor)n(dingly)-10 b(,)25 b Ff(ClassGen)d Ft(of)n(fers)i(an)i -(interface)f(to)f(add)h(methods,)f(\002elds,)g(and)h(attributes.)0 -1152 y(Figur)n(e)d(4)h(gives)f(an)h(overview)g(of)f(this)h(part)f(of)h -(the)e(API.)0 1422 y Fg(3.3.1)99 b(T)-9 b(ypes)0 1603 -y Ft(W)h(e)28 b(abstract)i(fr)n(om)f(the)g(concr)n(ete)f(details)h(of)g -(the)g(type)e(signatur)n(e)i(syntax)f(\(see)g(2.5\))i(by)f(intr)n -(oducing)g(the)0 1716 y Ff(Type)23 b Ft(class,)k(which)e(is)h(used,)e -(for)h(example,)g(by)g(methods)f(to)g(de\002ne)g(their)h(r)n(eturn)f -(and)i(ar)n(gument)e(types.)0 1829 y(Concr)n(ete)j(sub-classes)f(ar)n -(e)i Ff(BasicType)p Ft(,)c Ff(ObjectType)p Ft(,)f(and)k -Ff(ArrayType)d Ft(which)j(consists)f(of)h(the)g(el-)0 -1942 y(ement)33 b(type)f(and)i(the)f(number)g(of)h(dimensions.)60 -b(For)33 b(commonly)h(used)f(types)e(the)i(class)i(of)n(fers)e(some)0 -2055 y(pr)n(ede\002ned)23 b(constants.)36 b(For)25 b(example)h(the)f -(method)f(signatur)n(e)h(of)h(the)f Ff(main)f Ft(method)h(as)g(shown)g -(in)h(sec-)0 2168 y(tion)c(2.5)i(is)e(r)n(epr)n(esented)e(by:)109 -2403 y Ff(Type)162 b(return_type)49 b(=)55 b(Type.VOID;)109 -2516 y(Type[])d(arg_types)159 b(=)55 b(new)e(Type[])f({)i(new)f -(ArrayType\(Type)o(.ST)o(RI)o(NG)o(,)48 b(1\))54 b(};)146 -2750 y(Type)18 b Ft(also)i(contains)g(methods)e(to)h(convert)h(types)d -(into)j(textual)f(signatur)n(es)g(and)h(vice)g(versa.)27 -b(The)19 b(sub-)0 2863 y(classes)24 b(contain)g(implementations)g(of)g -(the)f(r)n(outines)g(and)h(constraints)f(speci\002ed)g(by)h(the)f(Java) -j(Language)0 2976 y(Speci\002cation)d([GJS96)q(].)0 3247 -y Fg(3.3.2)99 b(Generic)24 b(\002elds)h(and)g(methods)0 -3427 y Ft(Fields)f(ar)n(e)i(r)n(epr)n(esented)c(by)j -Ff(FieldGen)c Ft(objects,)k(which)g(may)h(be)e(fr)n(eely)h(modi\002ed)f -(by)h(the)f(user)-7 b(.)34 b(If)25 b(they)0 3540 y(have)e(the)g(access) -g(rights)f Ff(static)52 b(final)p Ft(,)20 b(i.e.)29 b(ar)n(e)24 -b(constants)d(and)i(of)g(basic)i(type,)c(they)h(may)h(optionally)0 -3653 y(have)g(an)g(initializing)i(value.)146 3768 y(Generic)d(methods)e -(contain)i(methods)e(to)h(add)h(exceptions)e(the)h(method)f(may)i(thr)n -(ow)-8 b(,)21 b(local)i(variables,)0 3881 y(and)g(exception)e -(handlers.)27 b(The)22 b(latter)g(two)g(ar)n(e)h(r)n(epr)n(esented)c -(by)k(user)n(-con\002gurable)f(objects)g(as)g(well.)29 -b(Be-)0 3994 y(cause)20 b(exception)e(handlers)i(and)f(local)j -(variables)f(contain)f(r)n(efer)n(ences)f(to)g(byte)g(code)h(addr)n -(esses,)d(they)i(also)0 4107 y(take)j(the)g(r)n(ole)h(of)g(an)g -Fs(instruction)h(tar)n(geter)i Ft(in)d(our)f(terminology)-10 -b(.)27 b(Instr)o(uction)22 b(tar)n(geters)f(contain)i(a)g(method)0 -4220 y Ff(updateTarget\(\))i Ft(to)31 b(r)n(edir)n(ect)g(a)h(r)n(efer)n -(ence.)54 b(Generic)32 b(\(non-abstract\))g(methods)d(r)n(efer)i(to)g -Fs(instruction)0 4332 y(lists)g Ft(that)e(consist)f(of)h(instr)o -(uction)g(objects.)47 b(Refer)n(ences)28 b(to)g(byte)g(code)h(addr)n -(esses)e(ar)n(e)i(implemented)f(by)0 4445 y(handles)22 -b(to)g(instr)o(uction)g(objects.)28 b(This)22 b(is)h(explained)f(in)h -(mor)n(e)f(detail)h(in)g(the)f(following)h(sections.)146 -4560 y(The)32 b(maximum)h(stack)f(size)g(needed)e(by)i(the)f(method)g -(and)h(the)f(maximum)j(number)e(of)g(local)i(vari-)0 -4673 y(ables)25 b(used)e(may)i(be)f(set)f(manually)j(or)e(computed)f -(via)j(the)d Ff(setMaxStack\(\))c Ft(and)24 b Ff(setMaxLocals\(\))0 -4786 y Ft(methods)d(automatically)-10 b(.)0 5056 y Fg(3.3.3)99 -b(Instructions)0 5237 y Ft(Modeling)25 b(instr)o(uctions)g(as)h -(objects)f(may)h(look)f(somewhat)g(odd)f(at)i(\002rst)f(sight,)g(but)h -(in)g(fact)h(enables)e(pr)n(o-)0 5350 y(grammers)g(to)f(obtain)i(a)g -(high-level)g(view)f(upon)f(contr)n(ol)i(\003ow)f(without)f(handling)h -(details)g(like)h(concr)n(ete)0 5463 y(byte)c(code)h(of)n(fsets.)29 -b(Instr)o(uctions)22 b(consist)g(of)h(a)h(tag,)f(i.e.)30 -b(an)24 b(opcode,)d(their)i(length)g(in)h(bytes)e(and)h(an)h(of)n(fset) -1863 5712 y Fq(13)p eop -%%Page: 14 14 -14 13 bop 383 5113 a @beginspecial 13 @llx 12 @lly 535 -@urx 830 @ury 3671 @rwi @setspecial -%%BeginDocument: eps/classgen.eps -%!PS-Adobe-3.0 EPSF-3.0 -%%Title: Rose Diagram(s) -%%Creator: AdobePS5.dll Version 5.0 -%%CreationDate: 7/7/1999 17:42:13 -%%Pages: 1 -%%Orientation: Portrait -%%PageOrder: Ascend -%%DocumentNeededResources: (atend) -%%DocumentSuppliedResources: (atend) -%%DocumentData: Clean7Bit -%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 -%%LanguageLevel: 2 -%%BoundingBox: 13 12 535 830 -%%EndComments -%%BeginProcSet: epsffit 1 0 -gsave -1249.738 -7.476 translate -90 rotate -1.623 1.623 scale -%%EndProcSet - - -%%BeginDefaults -%%PageBoundingBox: 13 12 582 830 -%%EndDefaults - -%%BeginProlog -%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 -/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false -setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype -ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch -def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 -rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def -/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def -typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 -def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp -exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def -/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype -{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} -readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop -(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def -/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) -tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup -xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint -tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck -{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) -tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup -rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} -forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier -/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin -$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 -ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto -(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt -$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} -repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print -(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup -0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop -/setpacking where{pop oldpack setpacking}if}if -%%EndResource -userdict /Pscript_WinNT_Incr 230 dict dup begin put -%%BeginResource: file Pscript_FatalError 5.0 0 -/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div -cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def -%%EndResource -/VM?{vmstatus exch sub exch pop gt{[ -(This job requires more memory than is available in this printer.)100 500 -(Try one or more of the following, and then print again:)100 485 -(For the output format, choose Optimize For Portability.)115 470 -(In the Device Settings page, make sure the Available PostScript Memory is accurate.) -115 455(Reduce the number of fonts in the document.)115 440 -(Print the document in parts.)115 425 12/Times-Roman showpage -(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def -%%BeginResource: file Pscript_Win_Basic 5.0 0 -/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ -/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- -/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , -d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C -/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M -/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d -/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage -, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false -/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d -/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, -d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx -matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit -/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} -b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U -/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d -reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d -/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 -sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} -b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b -/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b -/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} -b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b -%%EndResource -%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 -/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge -{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ -snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F -setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d -/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b -%%EndResource -end -%%EndProlog - -%%BeginSetup -[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec -1 setlinecap 1 setlinejoin -/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def -%%EndSetup - -%%Page: 1 1 -%%PageBoundingBox: 13 12 582 830 -%%EndPageComments -%%BeginPageSetup -/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh -%%EndPageSetup - -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Win_GdiObject 5.0 0 -/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore -{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d -/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps -L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType -1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d -/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal -{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep -gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b -/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M -MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep -M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 -+}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d -/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix -GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 -/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal -makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 -/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d -/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] -d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 -0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne -{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd -aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx -PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save -8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 -Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx -matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` -xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill -{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot -concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap -YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 --0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix -currentmatrix readonly d ; ;}if}b -%%EndResource -%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 -/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} -{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 -d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d -20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d -/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ -/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict -~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} -? ;}b -%%EndResource -end reinitialize -: N 234 594 236 124 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 470 593 M 233 593 I 233 718 I 470 718 I C -K -0 0 0 1 scol Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Text 5.0 0 -/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d -/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ -length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets -{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& -/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} -if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ -{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get -StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ -{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ -length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ -put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M -currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d -/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N -/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix -astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get -length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d -/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS -{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 -copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for -& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ -4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 -add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for -/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 -Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName -length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length -string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ -putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 -$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? -{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName -get undefinefont}forall undefinefont}b -%%EndResource -end reinitialize -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Encoding256 5.0 0 -/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction -/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign -/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma -/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S -/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave -/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright -/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis -/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef -/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet -/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef -/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section -/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered -/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph -/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter -/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis -/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute -/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls -/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute -/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve -/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex -/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put -%%EndResource -end reinitialize - -%%IncludeResource: font Helvetica -F /F0 0 /256 T /Helvetica mF -/F0S29 F0 [41 0 0 -41 0 0 ] mFS -F0S29 Ji -257 643 M (BasicType)[27 23 20 8 21 26 19 23 0]xS -0.602 0 0.199 1 scol N 470 659 M 233 659 I 233 718 I 470 718 I C -K -N 470 682 M 233 682 I 233 718 I 470 718 I C -K -: N 252 292 360 184 rp C -1 1 0.801 1 scol L ; N 612 291 M 251 291 I 251 476 I 612 476 I C -K -0 0 0 1 scol 326 341 M (ObjectType)[32 23 10 23 21 11 26 19 23 0]xS -0.602 0 0.199 1 scol N 612 357 M 251 357 I 251 476 I 612 476 I C -K -N 612 380 M 251 380 I 251 476 I 612 476 I C -K -0 0 0 1 scol 310 448 M (getClassName\(\))[23 23 11 30 10 23 20 20 30 23 36 23 14 0]xS -: N 699 292 362 184 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1061 291 M 698 291 I 698 476 I 1061 476 I C -K -0 0 0 1 scol 786 341 M (ArrayType)[27 14 14 23 19 26 19 23 0]xS -0.602 0 0.199 1 scol N 1061 357 M 698 357 I 698 476 I 1061 476 I C -K -N 1061 380 M 698 380 I 698 476 I 1061 476 I C -K -0 0 0 1 scol 757 448 M (getDimensions\(\))[23 23 11 30 8 36 23 23 20 8 23 23 20 14 0]xS -: N 532 594 312 124 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 844 593 M 531 593 I 531 718 I 844 718 I C -K -0 0 0 1 scol 546 643 M (ReferenceType)[30 23 12 23 14 23 23 21 23 26 19 23 0]xS -0.602 0 0.199 1 scol N 844 659 M 531 659 I 531 718 I 844 718 I C -K -N 844 682 M 531 682 I 531 718 I 844 718 I C -K -: N 1202 295 284 178 rp C -1 1 0.801 1 scol L ; N 1486 294 M 1201 294 I 1201 473 I 1486 473 I C -K -0 0 0 1 scol -%%IncludeResource: font Helvetica-Oblique -F /F1 0 /256 T /Helvetica-Oblique mF -/F1S29 F1 [41 0 0 -41 0 0 ] mFS -F1S29 Ji -1226 343 M (AccessFlags)[27 21 21 23 21 21 25 9 23 23 0]xS -0.602 0 0.199 1 scol N 1486 360 M 1201 360 I 1201 473 I 1486 473 I C -K -N 1486 383 M 1201 383 I 1201 473 I 1486 473 I C -K -0 0 0 1 scol 1260 450 M (isPublic\(\))[9 21 27 23 23 9 9 21 14 0]xS -0.602 0 0.199 1 scol N 1344 602 M 1344 474 I K -N 1059 602 M 1634 602 I K -N 1344 474 M 1366 534 I 1322 534 I C -: 1 1 1 1 scol O ; K -N 678 500 M 678 593 I K -N 369 500 M 881 500 I K -N 678 593 M 700 533 I 656 533 I C -: 1 1 1 1 scol O ; K -N 369 477 M 369 500 I K -N 881 477 M 881 500 I K -: N 919 683 306 234 rp C -1 1 0.801 1 scol L ; N 1225 682 M 918 682 I 918 917 I 1225 917 I C -K -0 0 0 1 scol F0S29 Ji -988 732 M (FieldGen)[25 8 23 10 23 32 23 0]xS -0.602 0 0.199 1 scol N 1225 748 M 918 748 I 918 917 I 1225 917 I C -K -N 1225 771 M 918 771 I 918 917 I 1225 917 I C -K -0 0 0 1 scol 977 839 M (getField\(\))[23 23 11 25 8 23 10 23 14 0]xS -977 886 M (setInitValue\(\))[20 23 11 10 23 8 11 27 23 10 23 23 14 0]xS -0.602 0 0.199 1 scol N 1059 682 M 1059 602 I K -: N 543 1283 386 122 rp C -1 1 0.801 1 scol L ; N 929 1282 M 542 1282 I 542 1405 I 929 1405 I C -K -0 0 0 1 scol 571 1332 M (LocalVariableGen)[23 23 21 23 10 27 23 14 8 23 23 10 23 32 23 0]xS -0.602 0 0.199 1 scol N 929 1348 M 542 1348 I 542 1405 I 929 1405 I C -K -N 929 1371 M 542 1371 I 542 1405 I 929 1405 I C -K -: N 538 1106 396 124 rp C -1 1 0.801 1 scol L ; N 934 1105 M 537 1105 I 537 1230 I 934 1230 I C -K -0 0 0 1 scol 559 1155 M (CodeExceptionGen)[30 23 23 23 27 18 21 23 23 11 8 23 23 32 23 0]xS -0.602 0 0.199 1 scol N 934 1171 M 537 1171 I 537 1230 I 934 1230 I C -K -N 934 1194 M 537 1194 I 537 1230 I 934 1230 I C -K -: N 351 836 322 184 rp C -1 1 0.801 1 scol L ; N 673 835 M 350 835 I 350 1020 I 673 1020 I C -K -0 0 0 1 scol 466 885 M (Type)[26 19 23 0]xS -0.602 0 0.199 1 scol N 673 901 M 350 901 I 350 1020 I 673 1020 I C -K -N 673 924 M 350 924 I 350 1020 I 673 1020 I C -K -0 0 0 1 scol 409 992 M (getSignature\(\))[23 23 11 27 8 23 23 23 11 23 14 23 14 0]xS -0.602 0 0.199 1 scol N 512 745 M 512 835 I K -N 347 745 M 669 745 I K -N 512 835 M 534 775 I 490 775 I C -: 1 1 1 1 scol O ; K -N 795 862 M 674 889 I K -N 795 862 M 917 833 I K -N 347 719 M 347 745 I K -N 669 719 M 669 745 I K -: N 538 1457 364 126 rp C -1 1 0.801 1 scol L ; N 902 1456 M 537 1456 I 537 1583 I 902 1583 I C -K -0 0 0 1 scol 561 1506 M (BranchInstruction)[27 14 23 23 21 23 10 23 20 11 14 23 21 11 8 23 0]xS -0.602 0 0.199 1 scol N 902 1522 M 537 1522 I 537 1583 I 902 1583 I C -K -N 902 1545 M 537 1545 I 537 1583 I 902 1583 I C -K -: N 1157 1012 342 184 rp C -1 1 0.801 1 scol L ; N 1499 1011 M 1156 1011 I 1156 1196 I 1499 1196 I C -K -0 0 0 1 scol 1221 1061 M (MethodGen)[33 23 11 23 23 23 32 23 0]xS -0.602 0 0.199 1 scol N 1499 1077 M 1156 1077 I 1156 1196 I 1499 1196 I C -K -N 1499 1100 M 1156 1100 I 1156 1196 I 1499 1196 I C -K -0 0 0 1 scol 1215 1168 M (addException\(\))[23 23 23 27 18 21 23 23 11 8 23 23 14 0]xS -0.602 0 0.199 1 scol N 1022 1227 M 1155 1172 I K -N 1155 1172 M 1136 1196 I 1105 1193 I 1124 1168 I 1155 1172 I C -: 1 1 1 1 scol O ; K -N 1022 1227 M 886 1281 I K -N 913 1302 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 913 1340 M (*)S -N 913 1302 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 913 1340 M (*)S -0.602 0 0.199 1 scol N 1045 1134 M 1155 1121 I K -N 1155 1121 M 1130 1139 I 1101 1127 I 1126 1109 I 1155 1121 I C -: 1 1 1 1 scol O ; K -N 1045 1134 M 935 1145 I K -N 934 1068 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 934 1106 M (*)S -N 934 1068 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 934 1106 M (*)S -0.602 0 0.199 1 scol N 914 1014 M 674 962 I K -N 914 1014 M 1155 1066 I K -N 1344 1011 M 1344 602 I K -: N 1751 1012 306 184 rp C -1 1 0.801 1 scol L ; N 2057 1011 M 1750 1011 I 1750 1196 I 2057 1196 I C -K -0 0 0 1 scol 1779 1061 M (InstructionList)[10 23 20 11 14 23 21 11 8 23 23 23 8 20 0]xS -0.602 0 0.199 1 scol N 2057 1077 M 1750 1077 I 1750 1196 I 2057 1196 I C -K -N 2057 1100 M 1750 1100 I 1750 1196 I 2057 1196 I C -K -0 0 0 1 scol 1809 1168 M (append\(\))[23 23 23 23 23 23 14 0]xS -0.602 0 0.199 1 scol N 1624 1104 M 1749 1104 I K -N 1624 1104 M 1500 1104 I K -: N 1201 1313 222 190 rp C -1 1 0.801 1 scol L ; N 1423 1312 M 1200 1312 I 1200 1503 I 1423 1503 I C -K -0 0 0 1 scol 1219 1362 M (Instruction)[10 23 20 11 14 23 21 11 8 23 0]xS -0.602 0 0.199 1 scol N 1423 1378 M 1200 1378 I 1200 1503 I 1423 1503 I C -K -N 1423 1495 M 1200 1495 I 1200 1503 I 1423 1503 I C -K -0 0 0 1 scol 1259 1422 M (tag)[11 23 0]xS -1259 1469 M (length)[10 23 23 23 11 0]xS -0.602 0 0.199 1 scol N 903 1485 M 1199 1429 I K -N 1199 1429 M 1144 1462 I 1136 1418 I C -: 1 1 1 1 scol O ; K -: N 1722 1345 364 126 rp C -1 1 0.801 1 scol L ; N 2086 1344 M 1721 1344 I 1721 1471 I 2086 1471 I C -K -0 0 0 1 scol 1744 1394 M (InstructionHandle)[10 23 20 11 14 23 21 11 8 23 23 30 23 23 23 10 0]xS -0.602 0 0.199 1 scol N 2086 1410 M 1721 1410 I 1721 1471 I 2086 1471 I C -K -N 2086 1433 M 1721 1433 I 1721 1471 I 2086 1471 I C -K -N 1904 1270 M 1904 1197 I K -N 1947 1181 23 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1947 1219 M (1)S -0.602 0 0.199 1 scol N 1904 1197 M 1919 1224 I 1904 1251 I 1889 1224 I 1904 1197 I C -: 1 1 1 1 scol O ; K -N 1904 1270 M 1904 1343 I K -N 1950 1313 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1950 1351 M (*)S -N 1947 1181 23 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1947 1219 M (1)S -N 1950 1313 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1950 1351 M (*)S -0.602 0 0.199 1 scol N 1572 1408 M 1424 1408 I K -N 1429 1439 23 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1429 1477 M (1)S -0.602 0 0.199 1 scol N 1572 1408 M 1720 1408 I K -N 1693 1439 23 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1693 1477 M (1)S -N 1429 1439 23 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1429 1477 M (1)S -N 1693 1439 23 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1693 1477 M (1)S -: N 0 1224 384 240 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol : 0 1223 385 242 rc N 384 1223 M -1 1223 I -1 1464 I 384 1464 I C -K -; 0 0 0 1 scol 20 1323 M (InstructionTargeter)[10 23 20 11 14 23 21 11 8 23 23 26 23 14 23 23 11 23 0]xS -0.602 0 0.199 1 scol : 0 1339 385 126 rc N 384 1339 M -1 1339 I -1 1464 I 384 1464 I C -K -; : 0 1362 385 103 rc N 384 1362 M -1 1362 I -1 1464 I 384 1464 I C -K -; 0 0 0 1 scol 58 1430 M (updateTarget\(\))[23 23 23 23 11 23 26 23 14 23 23 11 14 0]xS -64 1273 M (<>)[24 24 10 23 11 23 14 12 23 21 23 24 0]xS -1 1 1 1 scol [ 72 24 ] 0 sd N 540 1231 M 385 1280 I K -0 0 0 1 scol [ 72 24 ] 0 sd N 540 1231 M 385 1280 I K -0.602 0 0.199 1 scol solid N 385 1280 M 449 1283 I 435 1241 I C -: 1 1 1 1 scol O ; K -1 1 1 1 scol [ 72 24 ] 0 sd N 541 1344 M 385 1344 I K -0 0 0 1 scol [ 72 24 ] 0 sd N 541 1344 M 385 1344 I K -0.602 0 0.199 1 scol solid N 385 1344 M 445 1366 I 445 1322 I C -: 1 1 1 1 scol O ; K -N 1043 1616 M 1903 1616 I K -N 1903 1616 M 1903 1472 I K -N 1949 1550 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1949 1588 M (*)S -0.602 0 0.199 1 scol N 1043 1616 M 191 1616 I K -N 191 1616 M 191 1465 I K -N 237 1542 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 237 1580 M (*)S -N 1949 1550 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1949 1588 M (*)S -N 237 1542 16 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 237 1580 M (*)S -N 1186 1556 221 47 rp C -1 1 1 1 scol L 0 0 0 1 scol 1186 1594 M (<>)[24 24 11 23 14 23 23 11 20 24 0]xS -: N 1707 306 362 284 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2069 305 M 1706 305 I 1706 590 I 2069 590 I C -K -0 0 0 1 scol 1725 355 M (ConstantPoolGen)[30 23 23 20 11 23 23 11 27 23 23 10 32 23 0]xS -0.602 0 0.199 1 scol N 2069 371 M 1706 371 I 1706 590 I 2069 590 I C -K -N 2069 394 M 1706 394 I 1706 590 I 2069 590 I C -K -0 0 0 1 scol 1765 462 M (addClass\(\))[23 23 23 30 10 23 20 20 14 0]xS -1765 509 M (addMethodRef\(\))[23 23 23 33 23 11 23 23 23 30 23 12 14 0]xS -1765 556 M (addInteger\(\))[23 23 23 10 23 11 23 23 23 14 14 0]xS -: N 1475 683 314 234 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1789 682 M 1474 682 I 1474 917 I 1789 917 I C -K -0 0 0 1 scol 1541 732 M (ClassGen)[30 10 23 20 20 32 23 0]xS -0.602 0 0.199 1 scol N 1789 748 M 1474 748 I 1474 917 I 1789 917 I C -K -N 1789 771 M 1474 771 I 1474 917 I 1789 917 I C -K -0 0 0 1 scol 1533 839 M (addInterface\(\))[23 23 23 10 23 11 23 14 12 23 21 23 14 0]xS -1533 886 M (addMethod\(\))[23 23 23 33 23 11 23 23 23 14 0]xS -0.602 0 0.199 1 scol N 1634 682 M 1634 602 I K -N 1751 636 M 1782 591 I K -N 1751 636 M 1717 681 I K -1 1 1 1 scol [ 72 24 ] 0 sd N 536 1458 M 385 1408 I K -0 0 0 1 scol [ 72 24 ] 0 sd N 536 1458 M 385 1408 I K -0.602 0 0.199 1 scol solid N 385 1408 M 449 1406 I 435 1448 I C -: 1 1 1 1 scol O ; K -LH -%%PageTrailer - -%%Trailer -%%DocumentNeededResources: -%%+ font Helvetica-Oblique -%%+ font Helvetica -%%DocumentSuppliedResources: -Pscript_WinNT_Incr dup /terminate get exec -%%EOF -grestore - -%%EndDocument - @endspecial 934 5316 a Fq(Figur)n(e)26 b(4:)k(UML)25 -b(diagram)g(of)g(the)h(ClassGen)e(API)1863 5712 y(14)p -eop -%%Page: 15 15 -15 14 bop 0 407 a Ft(\(or)17 b(index\))g(within)g(the)g(byte)f(code.)25 -b(Since)18 b(many)f(instr)o(uctions)f(ar)n(e)i(immutable,)h(the)e -Ff(InstructionCon)o(st)o(an)o(ts)0 520 y Ft(interface)23 -b(of)n(fers)f(shar)n(eable)h(pr)n(ede\002ned)e(\223\003y-weight\224)h -(constants)g(to)g(use.)146 633 y(Instr)o(uctions)28 b(ar)n(e)h(gr)n -(ouped)e(via)k(sub-classing,)f(the)f(type)e(hierar)n(chy)j(of)f(instr)o -(uction)f(classes)h(is)g(illus-)0 746 y(trated)d(by)h(\(incomplete\))g -(\002gur)n(e)f(9)h(in)h(the)e(appendix.)39 b(The)27 b(most)f(important) -g(family)j(of)e(instr)o(uctions)f(ar)n(e)0 858 y(the)h -Fs(branch)h(instructions)p Ft(,)i(e.g.)42 b Ff(goto)p -Ft(,)27 b(that)h(branch)g(to)f(tar)n(gets)g(somewher)n(e)e(within)j -(the)f(byte)g(code.)42 b(Ob-)0 971 y(viously)-10 b(,)24 -b(this)f(makes)g(them)g(candidates)h(for)f(playing)h(an)g -Ff(InstructionTarge)o(te)o(r)18 b Ft(r)n(ole,)23 b(too.)31 -b(Instr)o(uc-)0 1084 y(tions)16 b(ar)n(e)i(further)e(gr)n(ouped)g(by)h -(the)f(interfaces)h(they)f(implement,)i(ther)n(e)e(ar)n(e,)i(e.g.,)f -Ff(TypedInstructi)o(on)p Ft(s)0 1197 y(that)24 b(ar)n(e)h(associated)f -(with)h(a)g(speci\002c)g(type)e(like)i Ff(ldc)p Ft(,)f(or)g -Ff(ExceptionThrowe)o(r)18 b Ft(instr)o(uctions)24 b(that)h(may)0 -1310 y(raise)e(exceptions)e(when)g(executed.)146 1423 -y(All)i(instr)o(uctions)f(can)h(be)f(traversed)f(via)i -Ff(accept\(Visitor)48 b(v\))22 b Ft(methods,)e(i.e.,)h(the)h(V)-5 -b(isitor)21 b(design)0 1536 y(pattern.)53 b(Ther)n(e)31 -b(is)g(however)f(some)h(special)h(trick)f(in)h(these)e(methods)f(that)i -(allows)h(to)f(mer)n(ge)g(the)f(han-)0 1649 y(dling)21 -b(of)g(certain)g(instr)o(uction)g(gr)n(oups.)26 b(The)20 -b Ff(accept\(\))d Ft(do)j(not)h(only)f(call)j(the)d(corr)n(esponding)f -Ff(visit\(\))0 1762 y Ft(method,)34 b(but)g(call)h Ff(visit\(\))30 -b Ft(methods)i(of)h(their)g(r)n(espective)f(super)g(classes)h(and)h -(implemented)e(inter)n(-)0 1875 y(faces)27 b(\002rst,)g(i.e.)40 -b(the)26 b(most)g(speci\002c)h Ff(visit\(\))d Ft(call)29 -b(is)e(last.)40 b(Thus)26 b(one)g(can)i(gr)n(oup)e(the)g(handling)h -(of,)h(say)-10 b(,)0 1988 y(all)24 b Ff(BranchInstructi)o(on)o -Ft(s)17 b(into)22 b(one)g(single)g(method.)146 2100 y(For)30 -b(debugging)f(purposes)f(it)j(may)g(even)g(make)f(sense)f(to)h -(\223invent\224)i(your)e(own)g(instr)o(uctions.)51 b(In)31 -b(a)0 2213 y(sophisticated)23 b(code)h(generator)f(like)i(the)e(one)h -(used)g(as)g(a)i(backend)e(of)h(the)f(Barat)g(framework)g([BS98)q(])h -(one)0 2326 y(often)h(has)g(to)h(insert)e(temporary)h -Ff(nop)f Ft(\(No)h(operation\))g(instr)o(uctions.)39 -b(When)27 b(examining)g(the)f(pr)n(oduced)0 2439 y(code)34 -b(it)g(may)h(be)f(very)g(dif)n(\002cult)i(to)d(track)i(back)g(wher)n(e) -f(the)f Ff(nop)g Ft(was)i(actually)g(inserted.)62 b(One)34 -b(could)0 2552 y(think)24 b(of)h(a)h(derived)e Ff(nop2)f -Ft(instr)o(uction)h(that)h(contains)g(additional)g(debugging)e -(information.)36 b(When)24 b(the)0 2665 y(instr)o(uction)e(list)h(is)g -(dumped)e(to)h(byte)g(code,)f(the)h(extra)g(data)h(is)g(simply)f(dr)n -(opped.)146 2778 y(One)j(could)g(also)g(think)g(of)g(new)f(byte)g(code) -g(instr)o(uctions)g(operating)g(on)h(complex)g(numbers)f(that)h(ar)n(e) -0 2891 y(r)n(eplaced)e(by)f(normal)h(byte)f(code)g(upon)g(load-time)h -(or)f(ar)n(e)h(r)n(ecognized)f(by)h(a)g(new)f(JVM.)0 -3147 y Fg(3.3.4)99 b(Instruction)25 b(lists)0 3324 y -Ft(An)18 b Fs(instruction)i(list)g Ft(is)e(implemented)g(by)g(a)h(list) -g(of)g Fs(instruction)g(handles)h Ft(encapsulating)f(instr)o(uction)f -(objects.)0 3437 y(Refer)n(ences)k(to)g(instr)o(uctions)h(in)h(the)e -(list)i(ar)n(e)g(thus)e(not)h(implemented)f(by)h(dir)n(ect)g(pointers)f -(to)h(instr)o(uctions)0 3549 y(but)31 b(by)f(pointers)f(to)h(instr)o -(uction)h Fs(handles)p Ft(.)53 b(This)31 b(makes)f(appending,)h -(inserting)f(and)h(deleting)e(ar)n(eas)i(of)0 3662 y(code)25 -b(very)h(simple.)38 b(Since)27 b(we)e(use)h(symbolic)g(r)n(efer)n -(ences,)g(computation)g(of)g(concr)n(ete)g(byte)f(code)g(of)n(fsets)0 -3775 y(does)19 b(not)h(need)f(to)h(occur)h(until)f(\002nalization,)j -(i.e.)k(until)21 b(the)f(user)f(has)i(\002nished)e(the)h(pr)n(ocess)f -(of)i(generating)0 3888 y(or)29 b(transforming)f(code.)46 -b(W)-8 b(e)28 b(will)i(use)e(the)g(term)h(instr)o(uction)f(handle)h -(and)g(instr)o(uction)g(synonymously)0 4001 y(thr)n(oughout)23 -b(the)h(r)n(est)g(of)h(the)f(paper)-7 b(.)35 b(Instr)o(uction)23 -b(handles)i(may)g(contain)h(additional)f(user)n(-de\002ned)e(data)0 -4114 y(using)f(the)g Ff(addAttribute\(\))16 b Ft(method.)0 -4362 y Fg(Appending.)90 b Ft(One)29 b(can)g(append)e(instr)o(uctions)h -(or)g(other)g(instr)o(uction)g(lists)g(anywher)n(e)g(to)g(an)h -(existing)0 4475 y(list.)63 b(The)34 b(instr)o(uctions)g(ar)n(e)h -(appended)d(after)i(the)g(given)g(instr)o(uction)g(handle.)63 -b(All)36 b(append)d(methods)0 4588 y(r)n(eturn)27 b(a)h(new)g(instr)o -(uction)f(handle)h(which)g(may)h(then)d(be)i(used)f(as)h(the)f(tar)n -(get)g(of)h(a)g(branch)h(instr)o(uction,)0 4701 y(e.g..)109 -4898 y Ff(InstructionList)48 b(il)53 b(=)i(new)e(InstructionLis)o(t\()o -(\);)109 5011 y(...)109 5124 y(GOTO)g(g)h(=)g(new)f(GOTO\(null\);)109 -5237 y(il.append\(g\);)109 5350 y(...)109 5463 y(InstructionHand)o(le) -48 b(ih)54 b(=)g(il.append\(Inst)o(ru)o(ct)o(ion)o(Co)o(ns)o(ta)o(nt)o -(s.A)o(CO)o(NS)o(T_)o(NU)o(LL\))o(;)1863 5712 y Fq(15)p -eop -%%Page: 16 16 -16 15 bop 109 407 a Ff(g.setTarget\(ih\))o(;)0 662 y -Fg(Inserting.)91 b Ft(Instr)o(uctions)24 b(may)j(be)f(inserted)e -(anywher)n(e)i(into)g(an)g(existing)f(list.)39 b(They)25 -b(ar)n(e)i(inserted)d(be-)0 775 y(for)n(e)19 b(the)f(given)g(instr)o -(uction)h(handle.)26 b(All)20 b(insert)e(methods)f(r)n(eturn)h(a)h(new) -f(instr)o(uction)h(handle)f(which)i(may)0 888 y(then)i(be)g(used)f(as)i -(the)f(start)g(addr)n(ess)f(of)i(an)g(exception)e(handler)-7 -b(,)23 b(for)f(example.)109 1114 y Ff(InstructionHand)o(le)48 -b(start)k(=)i(il.insert\(inser)o(tio)o(n_)o(po)o(in)o(t,)2073 -1227 y(InstructionCon)o(st)o(ant)o(s.)o(NO)o(P\))o(;)109 -1339 y(...)109 1452 y(mg.addException)o(Ha)o(nd)o(ler)o(\(s)o(ta)o(rt)o -(,)48 b(end,)53 b(handler,)e("java.io.IOExce)o(pt)o(io)o(n"\))o(;)0 -1708 y Fg(Deleting.)91 b Ft(Deletion)34 b(of)f(instr)o(uctions)g(is)h -(also)g(very)f(straightforwar)n(d;)38 b(all)e(instr)o(uction)d(handles) -g(and)0 1820 y(the)28 b(contained)g(instr)o(uctions)f(within)i(a)g -(given)g(range)f(ar)n(e)g(r)n(emoved)g(fr)n(om)h(the)f(instr)o(uction)g -(list)h(and)f(dis-)0 1933 y(posed.)e(The)c Ff(delete\(\))d -Ft(method)i(may)i(however)e(thr)n(ow)h(a)h Ff(TargetLostExcep)o(tio)o -(n)16 b Ft(when)22 b(ther)n(e)g(ar)n(e)0 2046 y(instr)o(uction)e(tar)n -(geters)e(still)j(r)n(efer)n(encing)f(one)f(of)h(the)f(deleted)f(instr) -o(uctions.)26 b(The)20 b(user)f(is)h(for)n(ced)g(to)f(handle)0 -2159 y(such)30 b(exceptions)f(in)i(a)g Ff(try-catch)c -Ft(block)k(and)f(r)n(edir)n(ect)g(these)f(r)n(efer)n(ences)h(elsewher)n -(e.)49 b(The)30 b Fs(peep)j(hole)0 2272 y Ft(optimizer)23 -b(described)e(in)i(section)f(A.3)h(gives)f(a)h(detailed)f(example)h -(for)f(this.)109 2498 y Ff(try)53 b({)218 2611 y(il.delete\(first)o(,) -48 b(last\);)109 2724 y(})54 b(catch\(TargetLos)o(tE)o(xce)o(pt)o(io)o -(n)48 b(e\))54 b({)218 2837 y(InstructionHand)o(le)o([])48 -b(targets)j(=)k(e.getTargets\(\))o(;)218 2949 y(for\(int)d(i=0;)g(i)i -(<)g(targets.length;)48 b(i++\))53 b({)327 3062 y(InstructionTarg)o -(ete)o(r[)o(])48 b(targeters)j(=)j(targets[i].get)o(Tar)o(ge)o(te)o(rs) -o(\(\))o(;)327 3175 y(for\(int)e(j=0;)g(j)i(<)h(targeters.leng)o(th)o -(;)48 b(j++\))491 3288 y(targeters[j].up)o(da)o(te)o(Ta)o(rg)o(et\()o -(ta)o(rg)o(et)o(s[)o(i],)g(new_target\);)218 3401 y(})109 -3514 y(})0 3769 y Fg(Finalizing.)92 b Ft(When)27 b(the)g(instr)o -(uction)h(list)g(is)g(r)n(eady)g(to)f(be)h(dumped)f(to)g(pur)n(e)h -(byte)f(code,)h(all)h(symbolic)0 3882 y(r)n(efer)n(ences)35 -b(must)g(be)h(mapped)g(to)f(r)n(eal)i(byte)e(code)h(of)n(fsets.)67 -b(This)36 b(is)g(done)f(by)h(the)f Ff(getByteCode\(\))0 -3995 y Ft(method)23 b(which)i(is)f(called)h(by)f(default)g(by)g -Ff(MethodGen.getMe)o(th)o(od)o(\(\))o Ft(.)j(Afterwar)n(ds)c(you)g -(should)g(call)0 4108 y Ff(dispose\(\))c Ft(so)j(that)h(the)f(instr)o -(uction)h(handles)f(can)i(be)f(r)n(eused)e(internally)-10 -b(.)29 b(This)23 b(helps)f(to)g(r)n(educe)h(mem-)0 4221 -y(ory)f(usage.)109 4447 y Ff(InstructionList)48 b(il)53 -b(=)i(new)e(InstructionLis)o(t\()o(\);)109 4672 y(ClassGen)106 -b(cg)53 b(=)h(new)f(ClassGen\("HelloW)o(or)o(ld)o(",)48 -b("java.lang.Obje)o(ct)o(",)1636 4785 y("",)h(ACC_PUBLIC)h -(|)k(ACC_SUPER,)1636 4898 y(null\);)109 5011 y(MethodGen)d(mg)i(=)h -(new)f(MethodGen\(ACC_ST)o(AT)o(IC)48 b(|)54 b(ACC_PUBLIC,)1691 -5124 y(Type.VOID,)c(new)j(Type[])f({)1800 5237 y(new)h -(ArrayType\(Type.)o(ST)o(RIN)o(G,)48 b(1\))1691 5350 -y(},)54 b(new)f(String[])e({)j("argv")e(},)1691 5463 -y("main",)f("HelloWorld",)e(il,)k(cp\);)1863 5712 y Fq(16)p -eop -%%Page: 17 17 -17 16 bop 109 407 a Ff(...)109 520 y(cg.addMethod\(mg)o(.g)o(et)o(Met)o -(ho)o(d\()o(\)\))o(;)109 633 y(il.dispose\(\);)49 b(//)k(Reuse)g -(instruction)c(handles)j(of)h(list)0 887 y Fg(3.3.5)99 -b(Code)25 b(example)f(revisited)0 1063 y Ft(Using)h(instr)o(uction)g -(lists)h(gives)f(us)g(a)i(generic)e(view)h(upon)e(the)h(code:)34 -b(In)25 b(Figur)n(e)g(5)h(we)f(again)i(pr)n(esent)d(the)0 -1176 y(code)e(chunk)h(of)g(the)f Ff(readInt\(\))d Ft(method)i(of)i(the) -f(faculty)i(example)e(in)i(section)e(2.6:)29 b(The)22 -b(local)j(variables)0 1289 y Ff(n)k Ft(and)g Ff(e1)g -Ft(both)g(hold)g(two)g(r)n(efer)n(ences)f(to)h(instr)o(uctions,)h -(de\002ning)e(their)h(scope.)47 b(Ther)n(e)29 b(ar)n(e)h(two)e -Ff(goto)p Ft(s)0 1402 y(branching)g(to)e(the)g Ff(iload)f -Ft(at)j(the)e(end)g(of)h(the)f(method.)40 b(One)27 b(of)g(the)f -(exception)g(handlers)g(is)i(displayed,)0 1515 y(too:)f(it)c(r)n(efer)n -(ences)e(the)h(start)g(and)h(the)e(end)h(of)h(the)f Ff(try)f -Ft(block)i(and)g(also)f(the)g(exception)g(handler)g(code.)0 -4170 y @beginspecial 0 @llx 0 @lly 583 @urx 386 @ury -4590 @rwi @setspecial -%%BeginDocument: eps/il.eps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: il.eps -%%Creator: fig2dev Version 3.2 Patchlevel 1 -%%CreationDate: Wed Dec 2 15:26:46 1998 -%%For: dahm@che (Markus Dahm,,,,,) -%%Orientation: Portrait -%%BoundingBox: 0 0 583 386 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def - -end -save --84.0 526.0 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def -%%EndProlog - -$F2psBegin -10 setmiterlimit -n -1000 9337 m -1000 -1000 l 11587 -1000 l 11587 9337 l cp clip - 0.06299 0.06299 sc -% Polyline -7.500 slw - [60] 0 sd -gs clippath -5205 7530 m 5175 7650 l 5145 7530 l 5145 7665 l 5205 7665 l cp -clip -n 5175 6975 m 5175 7650 l gs col0 s gr gr - [] 0 sd -% arrowhead -n 5205 7530 m 5175 7650 l 5145 7530 l col0 s -% Polyline - [60] 0 sd -gs clippath -5595 7095 m 5625 6975 l 5655 7095 l 5655 6960 l 5595 6960 l cp -clip -n 5625 7650 m 5625 6975 l gs col0 s gr gr - [] 0 sd -% arrowhead -n 5595 7095 m 5625 6975 l 5655 7095 l col0 s -% Polyline - [60] 0 sd -gs clippath -5205 3930 m 5175 4050 l 5145 3930 l 5145 4065 l 5205 4065 l cp -clip -n 5175 3375 m 5175 4050 l gs col0 s gr gr - [] 0 sd -% arrowhead -n 5205 3930 m 5175 4050 l 5145 3930 l col0 s -% Polyline - [60] 0 sd -gs clippath -5595 3495 m 5625 3375 l 5655 3495 l 5655 3360 l 5595 3360 l cp -clip -n 5625 4050 m 5625 3375 l gs col0 s gr gr - [] 0 sd -% arrowhead -n 5595 3495 m 5625 3375 l 5655 3495 l col0 s -% Polyline -n 4380 6750 m 4275 6750 4275 6870 105 arcto 4 {pop} repeat - 4275 6975 6420 6975 105 arcto 4 {pop} repeat - 6525 6975 6525 6855 105 arcto 4 {pop} repeat - 6525 6750 4380 6750 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 6930 m -gs 1 -1 sc (goto) col0 sh gr -% Polyline -n 4380 6300 m 4275 6300 4275 6420 105 arcto 4 {pop} repeat - 4275 6525 6420 6525 105 arcto 4 {pop} repeat - 6525 6525 6525 6405 105 arcto 4 {pop} repeat - 6525 6300 4380 6300 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4455 6480 m -gs 1 -1 sc (invokevirtual) col0 sh gr -% Polyline -n 4380 5850 m 4275 5850 4275 5970 105 arcto 4 {pop} repeat - 4275 6075 6420 6075 105 arcto 4 {pop} repeat - 6525 6075 6525 5955 105 arcto 4 {pop} repeat - 6525 5850 4380 5850 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 6030 m -gs 1 -1 sc (aload) col0 sh gr -% Polyline -n 4380 5400 m 4275 5400 4275 5520 105 arcto 4 {pop} repeat - 4275 5625 6420 5625 105 arcto 4 {pop} repeat - 6525 5625 6525 5505 105 arcto 4 {pop} repeat - 6525 5400 4380 5400 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 5580 m -gs 1 -1 sc (getstatic) col0 sh gr -% Polyline -n 4380 4950 m 4275 4950 4275 5070 105 arcto 4 {pop} repeat - 4275 5175 6420 5175 105 arcto 4 {pop} repeat - 6525 5175 6525 5055 105 arcto 4 {pop} repeat - 6525 4950 4380 4950 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 5130 m -gs 1 -1 sc (astore) col0 sh gr -% Polyline -n 4380 4500 m 4275 4500 4275 4620 105 arcto 4 {pop} repeat - 4275 4725 6420 4725 105 arcto 4 {pop} repeat - 6525 4725 6525 4605 105 arcto 4 {pop} repeat - 6525 4500 4380 4500 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 4680 m -gs 1 -1 sc (goto) col0 sh gr -% Polyline -n 4380 4050 m 4275 4050 4275 4170 105 arcto 4 {pop} repeat - 4275 4275 6420 4275 105 arcto 4 {pop} repeat - 6525 4275 6525 4155 105 arcto 4 {pop} repeat - 6525 4050 4380 4050 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4455 4230 m -gs 1 -1 sc (istore) col0 sh gr -% Polyline -gs clippath -5595 4395 m 5625 4275 l 5655 4395 l 5655 4260 l 5595 4260 l cp -clip -n 5625 4500 m 5625 4275 l gs col0 s gr gr - -% arrowhead -n 5595 4395 m 5625 4275 l 5655 4395 l col0 s -% Polyline -gs clippath -5205 4380 m 5175 4500 l 5145 4380 l 5145 4515 l 5205 4515 l cp -clip -n 5175 4275 m 5175 4500 l gs col0 s gr gr - -% arrowhead -n 5205 4380 m 5175 4500 l 5145 4380 l col0 s -% Polyline -gs clippath -5595 4845 m 5625 4725 l 5655 4845 l 5655 4710 l 5595 4710 l cp -clip -n 5625 4950 m 5625 4725 l gs col0 s gr gr - -% arrowhead -n 5595 4845 m 5625 4725 l 5655 4845 l col0 s -% Polyline -gs clippath -5205 4830 m 5175 4950 l 5145 4830 l 5145 4965 l 5205 4965 l cp -clip -n 5175 4725 m 5175 4950 l gs col0 s gr gr - -% arrowhead -n 5205 4830 m 5175 4950 l 5145 4830 l col0 s -% Polyline -gs clippath -5595 5295 m 5625 5175 l 5655 5295 l 5655 5160 l 5595 5160 l cp -clip -n 5625 5400 m 5625 5175 l gs col0 s gr gr - -% arrowhead -n 5595 5295 m 5625 5175 l 5655 5295 l col0 s -% Polyline -gs clippath -5205 5280 m 5175 5400 l 5145 5280 l 5145 5415 l 5205 5415 l cp -clip -n 5175 5175 m 5175 5400 l gs col0 s gr gr - -% arrowhead -n 5205 5280 m 5175 5400 l 5145 5280 l col0 s -% Polyline -gs clippath -5595 5745 m 5625 5625 l 5655 5745 l 5655 5610 l 5595 5610 l cp -clip -n 5625 5850 m 5625 5625 l gs col0 s gr gr - -% arrowhead -n 5595 5745 m 5625 5625 l 5655 5745 l col0 s -% Polyline -gs clippath -5205 5730 m 5175 5850 l 5145 5730 l 5145 5865 l 5205 5865 l cp -clip -n 5175 5625 m 5175 5850 l gs col0 s gr gr - -% arrowhead -n 5205 5730 m 5175 5850 l 5145 5730 l col0 s -% Polyline -gs clippath -5595 6195 m 5625 6075 l 5655 6195 l 5655 6060 l 5595 6060 l cp -clip -n 5625 6300 m 5625 6075 l gs col0 s gr gr - -% arrowhead -n 5595 6195 m 5625 6075 l 5655 6195 l col0 s -% Polyline -gs clippath -5205 6180 m 5175 6300 l 5145 6180 l 5145 6315 l 5205 6315 l cp -clip -n 5175 6075 m 5175 6300 l gs col0 s gr gr - -% arrowhead -n 5205 6180 m 5175 6300 l 5145 6180 l col0 s -% Polyline -gs clippath -5595 6645 m 5625 6525 l 5655 6645 l 5655 6510 l 5595 6510 l cp -clip -n 5625 6750 m 5625 6525 l gs col0 s gr gr - -% arrowhead -n 5595 6645 m 5625 6525 l 5655 6645 l col0 s -% Polyline -gs clippath -5205 6630 m 5175 6750 l 5145 6630 l 5145 6765 l 5205 6765 l cp -clip -n 5175 6525 m 5175 6750 l gs col0 s gr gr - -% arrowhead -n 5205 6630 m 5175 6750 l 5145 6630 l col0 s -% Polyline -n 4380 7650 m 4275 7650 4275 7770 105 arcto 4 {pop} repeat - 4275 7875 6420 7875 105 arcto 4 {pop} repeat - 6525 7875 6525 7755 105 arcto 4 {pop} repeat - 6525 7650 4380 7650 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4455 7830 m -gs 1 -1 sc (iload) col0 sh gr -% Polyline -n 4380 8100 m 4275 8100 4275 8220 105 arcto 4 {pop} repeat - 4275 8325 6420 8325 105 arcto 4 {pop} repeat - 6525 8325 6525 8205 105 arcto 4 {pop} repeat - 6525 8100 4380 8100 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4455 8280 m -gs 1 -1 sc (ireturn) col0 sh gr -% Polyline -gs clippath -5595 7995 m 5625 7875 l 5655 7995 l 5655 7860 l 5595 7860 l cp -clip -n 5625 8100 m 5625 7875 l gs col0 s gr gr - -% arrowhead -n 5595 7995 m 5625 7875 l 5655 7995 l col0 s -% Polyline -gs clippath -5205 7980 m 5175 8100 l 5145 7980 l 5145 8115 l 5205 8115 l cp -clip -n 5175 7875 m 5175 8100 l gs col0 s gr gr - -% arrowhead -n 5205 7980 m 5175 8100 l 5145 7980 l col0 s -% Polyline -gs clippath -5595 2595 m 5625 2475 l 5655 2595 l 5655 2460 l 5595 2460 l cp -clip -n 5625 2700 m 5625 2475 l gs col0 s gr gr - -% arrowhead -n 5595 2595 m 5625 2475 l 5655 2595 l col0 s -% Polyline -gs clippath -5205 2580 m 5175 2700 l 5145 2580 l 5145 2715 l 5205 2715 l cp -clip -n 5175 2475 m 5175 2700 l gs col0 s gr gr - -% arrowhead -n 5205 2580 m 5175 2700 l 5145 2580 l col0 s -% Polyline -n 4380 3150 m 4275 3150 4275 3270 105 arcto 4 {pop} repeat - 4275 3375 6420 3375 105 arcto 4 {pop} repeat - 6525 3375 6525 3255 105 arcto 4 {pop} repeat - 6525 3150 4380 3150 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 3330 m -gs 1 -1 sc (getstatic) col0 sh gr -% Polyline -n 4380 2700 m 4275 2700 4275 2820 105 arcto 4 {pop} repeat - 4275 2925 6420 2925 105 arcto 4 {pop} repeat - 6525 2925 6525 2805 105 arcto 4 {pop} repeat - 6525 2700 4380 2700 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4455 2880 m -gs 1 -1 sc (istore) col0 sh gr -% Polyline -n 4380 2250 m 4275 2250 4275 2370 105 arcto 4 {pop} repeat - 4275 2475 6420 2475 105 arcto 4 {pop} repeat - 6525 2475 6525 2355 105 arcto 4 {pop} repeat - 6525 2250 4380 2250 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -4500 2430 m -gs 1 -1 sc (sipush) col0 sh gr -% Polyline -gs clippath -5595 3045 m 5625 2925 l 5655 3045 l 5655 2910 l 5595 2910 l cp -clip -n 5625 3150 m 5625 2925 l gs col0 s gr gr - -% arrowhead -n 5595 3045 m 5625 2925 l 5655 3045 l col0 s -% Polyline -gs clippath -5205 3030 m 5175 3150 l 5145 3030 l 5145 3165 l 5205 3165 l cp -clip -n 5175 2925 m 5175 3150 l gs col0 s gr gr - -% arrowhead -n 5205 3030 m 5175 3150 l 5145 3030 l col0 s -% Polyline -n 1350 5175 m 3600 5175 l 3600 5625 l 1350 5625 l cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -1575 5400 m -gs 1 -1 sc (IOException e1) col0 sh gr -% Polyline -n 1575 5175 m 1575 4950 l 3825 4950 l 3825 5400 l 3600 5400 l 3600 5175 l - 1575 5175 l cp gs 0.00 setgray ef gr gs col0 s gr -% Polyline -n 1350 3600 m 3600 3600 l 3600 4050 l 1350 4050 l cp gs col0 s gr -/Courier-Bold ff 210.00 scf sf -1575 3825 m -gs 1 -1 sc (int n) col0 sh gr -% Polyline -n 1575 3600 m 1575 3375 l 3825 3375 l 3825 3825 l 3600 3825 l 3600 3600 l - 1575 3600 l cp gs 0.00 setgray ef gr gs col0 s gr -% Polyline -n 7200 4050 m 10350 4050 l 10350 4500 l 7200 4500 l cp gs col0 s gr -% Polyline -n 7425 4050 m 7425 3825 l 10575 3825 l 10575 4275 l 10350 4275 l 10350 4050 l - 8325 4050 l gs 0.00 setgray ef gr gs col0 s gr -/Courier-Bold ff 210.00 scf sf -7425 4275 m -gs 1 -1 sc (Exception handler 1) col0 sh gr -% Polyline -gs clippath -4152 5071 m 4275 5085 l 4160 5131 l 4294 5113 l 4286 5053 l cp -clip -n 3600 5175 m 4275 5085 l gs col0 s gr gr - -% arrowhead -n 4152 5071 m 4275 5085 l 4160 5131 l 4156 5101 l 4152 5071 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -4190 2475 m 4275 2385 l 4243 2504 l 4309 2386 l 4256 2357 l cp -clip -n 3600 3600 m 4275 2385 l gs col0 s gr gr - -% arrowhead -n 4190 2475 m 4275 2385 l 4243 2504 l 4217 2490 l 4190 2475 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -4221 6324 m 4275 6435 l 4175 6362 l 4262 6466 l 4308 6427 l cp -clip -n 3600 5625 m 4275 6435 l gs col0 s gr gr - -% arrowhead -n 4221 6324 m 4275 6435 l 4175 6362 l 4198 6343 l 4221 6324 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6635 5029 m 6525 5085 l 6596 4984 l 6494 5072 l 6533 5117 l cp -clip -n 7200 4500 m 6525 5085 l gs col0 s gr gr - -% arrowhead -n 6635 5029 m 6525 5085 l 6596 4984 l 6616 5006 l 6635 5029 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6645 4215 m 6525 4185 l 6645 4155 l 6510 4155 l 6510 4215 l cp -clip -n 7200 4185 m 6525 4185 l gs col0 s gr gr - -% arrowhead -n 6645 4215 m 6525 4185 l 6645 4155 l 6645 4185 l 6645 4215 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6582 3395 m 6525 3285 l 6627 3355 l 6538 3254 l 6493 3294 l cp -clip -n 7200 4050 m 6525 3285 l gs col0 s gr gr - -% arrowhead -n 6582 3395 m 6525 3285 l 6627 3355 l 6604 3375 l 6582 3395 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -4329 7977 m 4320 8100 l 4269 7987 l 4293 8120 l 4352 8110 l cp -clip -n 3600 4050 m 4320 8100 l gs col0 s gr gr - -% arrowhead -n 4329 7977 m 4320 8100 l 4269 7987 l 4299 7982 l 4329 7977 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6649 7784 m 6525 7785 l 6633 7726 l 6503 7760 l 6518 7818 l cp -clip -n 6525 4635 m 6527 4636 l 6532 4640 l 6542 4646 l 6556 4655 l 6575 4667 l - 6600 4683 l 6628 4702 l 6661 4723 l 6695 4746 l 6731 4771 l - 6768 4796 l 6804 4821 l 6838 4845 l 6871 4869 l 6902 4892 l - 6931 4915 l 6958 4936 l 6983 4957 l 7005 4977 l 7026 4996 l - 7045 5015 l 7063 5034 l 7080 5054 l 7095 5073 l 7110 5093 l - 7124 5113 l 7137 5133 l 7150 5154 l 7162 5176 l 7174 5199 l - 7185 5223 l 7196 5247 l 7207 5273 l 7216 5299 l 7226 5326 l - 7235 5353 l 7243 5381 l 7251 5409 l 7258 5438 l 7265 5467 l - 7271 5496 l 7276 5525 l 7281 5554 l 7286 5582 l 7290 5611 l - 7293 5639 l 7296 5667 l 7299 5694 l 7301 5721 l 7303 5748 l - 7305 5775 l 7306 5802 l 7308 5829 l 7309 5857 l 7310 5885 l - 7310 5914 l 7311 5944 l 7311 5974 l 7311 6004 l 7311 6035 l - 7310 6067 l 7310 6099 l 7309 6131 l 7308 6163 l 7307 6195 l - 7306 6227 l 7305 6258 l 7304 6289 l 7302 6320 l 7301 6350 l - 7299 6379 l 7298 6407 l 7296 6435 l 7295 6462 l 7293 6489 l - 7292 6514 l 7290 6540 l 7288 6567 l 7287 6595 l 7285 6622 l - 7283 6650 l 7281 6677 l 7279 6706 l 7277 6734 l 7275 6762 l - 7273 6791 l 7270 6820 l 7268 6848 l 7265 6877 l 7263 6905 l - 7260 6932 l 7257 6959 l 7255 6986 l 7252 7011 l 7249 7036 l - 7246 7060 l 7243 7084 l 7240 7106 l 7237 7128 l 7233 7149 l - 7230 7170 l 7226 7195 l 7221 7219 l 7216 7243 l 7211 7268 l - 7205 7292 l 7198 7317 l 7191 7342 l 7183 7366 l 7174 7390 l - 7165 7414 l 7155 7436 l 7144 7459 l 7133 7480 l 7121 7500 l - 7108 7519 l 7095 7537 l 7081 7553 l 7066 7569 l 7051 7584 l - 7035 7598 l 7020 7609 l 7003 7621 l 6985 7632 l 6966 7642 l - 6945 7653 l 6921 7663 l 6895 7674 l 6867 7684 l 6836 7695 l - 6803 7706 l 6767 7717 l 6730 7728 l 6693 7739 l 6656 7750 l - 6622 7759 l 6592 7767 l 6567 7774 l 6525 7785 l gs col0 s gr gr - -% arrowhead -n 6649 7784 m 6525 7785 l 6633 7726 l 6641 7755 l 6649 7784 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6619 7615 m 6525 7695 l 6570 7580 l 6492 7690 l 6541 7725 l cp -clip -n 6525 6840 m 6526 6843 l 6529 6850 l 6533 6863 l 6540 6882 l 6549 6908 l - 6560 6938 l 6572 6973 l 6585 7010 l 6598 7048 l 6610 7086 l - 6622 7122 l 6632 7157 l 6642 7189 l 6650 7219 l 6657 7246 l - 6663 7271 l 6667 7294 l 6671 7315 l 6673 7335 l 6675 7354 l - 6675 7373 l 6674 7394 l 6672 7415 l 6669 7435 l 6663 7455 l - 6656 7476 l 6648 7498 l 6637 7520 l 6624 7544 l 6610 7568 l - 6595 7593 l 6579 7617 l 6564 7640 l 6550 7660 l 6525 7695 l gs col0 s gr gr - -% arrowhead -n 6619 7615 m 6525 7695 l 6570 7580 l 6595 7597 l 6619 7615 l cp gs 0.00 setgray ef gr col0 s -$F2psEnd -rs - -%%EndDocument - @endspecial 844 4373 a Fq(Figur)n(e)k(5:)31 b(Instr)o(uction)26 -b(list)g(for)g Fh(readInt\(\))d Fq(method)0 4834 y Fg(3.3.6)99 -b(Instruction)25 b(factories)0 5011 y Ft(T)-8 b(o)16 -b(simplify)i(the)f(cr)n(eation)g(of)g(certain)h(instr)o(uctions)e(the)h -(user)f(can)i(use)e(the)g(supplied)g Ff(InstructionFact)o(or)o(y)0 -5124 y Ft(class)28 b(which)f(of)n(fers)g(a)h(lot)f(of)g(useful)g -(methods)e(to)i(cr)n(eate)g(instr)o(uctions)f(fr)n(om)i(scratch.)42 -b(Alternatively)-10 b(,)28 b(he)0 5237 y(can)j(also)g(use)e -Fs(compound)i(instructions)p Ft(:)45 b(When)29 b(pr)n(oducing)h(byte)f -(code,)j(some)d(patterns)g(typically)i(occur)0 5350 y(very)25 -b(fr)n(equently)-10 b(,)24 b(for)h(instance)g(the)g(compilation)h(of)f -(arithmetic)h(or)f(comparison)g(expr)n(essions.)34 b(Y)-8 -b(ou)24 b(cer)n(-)0 5463 y(tainly)k(do)f(not)g(want)h(to)f(r)n(ewrite)g -(the)g(code)g(that)g(translates)g(such)g(expr)n(essions)f(into)h(byte)g -(code)g(in)h(every)1863 5712 y Fq(17)p eop -%%Page: 18 18 -18 17 bop 0 407 a Ft(place)26 b(they)f(may)h(appear)-7 -b(.)36 b(In)26 b(or)n(der)e(to)h(support)f(this,)i(the)e -Fe(BCEL)j Ft(API)e(includes)h(a)g Fs(compound)g(instruction)0 -520 y Ft(\(an)k(interface)f(with)f(a)i(single)e Ff(getInstructionL)o -(is)o(t\()o(\))23 b Ft(method\).)45 b(Instances)27 b(of)i(this)g(class) -g(may)g(be)0 633 y(used)21 b(in)i(any)g(place)g(wher)n(e)f(normal)h -(instr)o(uctions)f(would)g(occur)-7 b(,)23 b(particularly)h(in)f -(append)e(operations.)0 898 y Fg(Example:)43 b(Pushing)32 -b(constants.)92 b Ft(Pushing)28 b(constants)g(onto)f(the)h(operand)g -(stack)g(may)h(be)g(coded)f(in)0 1011 y(dif)n(fer)n(ent)g(ways.)44 -b(As)27 b(explained)h(in)g(section)g(2.2)h(ther)n(e)e(ar)n(e)h(some)f -(\223short-cut\224)h(instr)o(uctions)f(that)h(can)h(be)0 -1124 y(used)20 b(to)h(make)g(the)f(pr)n(oduced)g(byte)g(code)h(mor)n(e) -g(compact.)28 b(The)20 b(smallest)i(instr)o(uction)f(to)f(push)h(a)h -(single)e Ff(1)0 1237 y Ft(onto)h(the)h(stack)g(is)g -Ff(iconst)p 1002 1237 28 4 v 30 w(1)p Ft(,)g(other)f(possibilities)i -(ar)n(e)f Ff(bipush)e Ft(\(can)k(be)e(used)f(to)h(push)f(values)i -(between)0 1350 y(-128)h(and)f(127\),)h Ff(sipush)c Ft(\(between)h -(-32768)26 b(and)c(32767\),)j(or)e Ff(ldc)e Ft(\(load)i(constant)f(fr)n -(om)h(constant)f(pool\).)146 1465 y(Instead)28 b(of)i(r)n(epeatedly)d -(selecting)i(the)g(most)f(compact)i(instr)o(uction)f(in,)j(say)-10 -b(,)30 b(a)g(switch,)h(one)e(can)h(use)0 1578 y(the)20 -b(compound)g Ff(PUSH)g Ft(instr)o(uction)h(whenever)f(pushing)g(a)h -(constant)g(number)g(or)g(string.)26 b(It)21 b(will)h(pr)n(oduce)0 -1691 y(the)g(appr)n(opriate)g(byte)g(code)f(instr)o(uction)i(and)f -(insert)g(entries)f(into)i(to)f(constant)f(pool)h(if)i(necessary)-10 -b(.)109 1929 y Ff(il.append\(new)49 b(PUSH\(cp,)i("Hello,)g -(world"\)\);)109 2042 y(il.append\(new)e(PUSH\(cp,)i(4711\)\);)0 -2315 y Fg(3.3.7)99 b(Code)25 b(patterns)f(using)i(regular)e -(expressions)0 2496 y Ft(When)j(transforming)g(code,)g(for)g(instance)g -(during)g(optimization)h(or)f(when)f(inserting)h(analysis)g(method)0 -2609 y(calls,)35 b(one)c(typically)h(sear)n(ches)f(for)g(certain)h -(patterns)e(of)i(code)e(to)h(perform)g(the)g(transformation)g(at.)55 -b(T)-8 b(o)0 2722 y(simplify)27 b(handling)g(such)f(situations)g -Fe(BCEL)i Ft(intr)n(oduces)e(a)h(special)g(featur)n(e:)35 -b(One)27 b(can)g(sear)n(ch)g(for)f(given)0 2835 y(code)17 -b(patterns)e(within)j(an)g(instr)o(uction)f(list)h(using)e -Fs(r)n(egular)k(expr)n(essions)p Ft(.)30 b(In)17 b(such)g(expr)n -(essions,)f(instr)o(uctions)0 2948 y(ar)n(e)26 b(r)n(epr)n(esented)e -(by)i(symbolic)g(names,)h(e.g.)37 b(\224)p Ff(`IfInstruction')p -Ft(\224.)32 b(Meta)26 b(characters)g(like)g Ff(+)p Ft(,)h -Ff(*)p Ft(,)f(and)0 3061 y Ff(\(..|..\))20 b Ft(have)j(their)f(usual)h -(meanings.)k(Thus,)22 b(the)f(expr)n(ession)109 3300 -y Ff("`NOP'+\(`ILOAD_)o(_')o(|`)o(ALO)o(AD)o(__)o('\))o(*")146 -3536 y Ft(r)n(epr)n(esents)28 b(a)i(piece)f(of)h(code)f(consisting)g -(of)h(at)g(least)f(one)g Ff(NOP)g Ft(followed)g(by)h(a)g(possibly)f -(empty)g(se-)0 3649 y(quence)22 b(of)g Ff(ILOAD)f Ft(and)i -Ff(ALOAD)d Ft(instr)o(uctions.)146 3764 y(The)j Ff(search\(\))d -Ft(method)j(of)g(class)i Ff(FindPattern)18 b Ft(gets)k(an)i(instr)o -(uction)g(list)g(and)f(a)i(r)n(egular)e(expr)n(es-)0 -3877 y(sion)g(as)g(ar)n(guments)f(and)h(r)n(eturns)f(an)i(array)f -(describing)g(the)g(ar)n(ea)h(of)f(matched)g(instr)o(uctions.)28 -b(Additional)0 3990 y(constraints)d(to)h(the)f(matching)i(ar)n(ea)g(of) -g(instr)o(uctions,)f(which)g(can)h(not)f(be)g(implemented)f(via)j(r)n -(egular)e(ex-)0 4103 y(pr)n(essions,)21 b(may)i(be)f(expr)n(essed)e -(via)k Fs(code)g(constraints)p Ft(.)0 4376 y Fg(3.3.8)99 -b(Example:)30 b(Optimizing)25 b(boolean)g(expressions.)0 -4557 y Ft(In)17 b(Java,)j(boolean)d(values)h(ar)n(e)f(mapped)g(to)g(1)h -(and)f(to)g(0,)h(r)n(espectively)-10 b(.)25 b(Thus,)18 -b(the)e(simplest)h(way)g(to)g(evaluate)0 4670 y(boolean)k(expr)n -(essions)e(is)j(to)f(push)f(a)i(1)g(or)f(a)h(0)g(onto)f(the)f(operand)g -(stack)h(depending)f(on)h(the)f(tr)o(uth)h(value)h(of)0 -4783 y(the)i(expr)n(ession.)31 b(But)23 b(this)h(way)-10 -b(,)25 b(the)e(subsequent)f(combination)k(of)e(boolean)h(expr)n -(essions)d(\(with)i Ff(&&)p Ft(,)g(e.g\))0 4896 y(yields)e(long)g -(chunks)g(of)h(code)e(that)i(push)e(lots)h(of)h(1s)g(and)f(0s)h(onto)f -(the)f(stack.)146 5011 y(When)i(the)f(code)g(has)h(been)f(\002nalized)i -(these)d(chunks)h(can)h(be)g(optimized)g(with)g(a)g Fs(peep)i(hole)f -Ft(algorithm:)0 5124 y(An)i Ff(IfInstruction)20 b Ft(\(e.g.)38 -b(the)26 b(comparison)g(of)g(two)g(integers:)33 b Ff(if)p -2529 5124 V 32 w(icmpeq)p Ft(\))24 b(that)h(either)h(pr)n(oduces)f(a)0 -5237 y(1)32 b(or)f(a)g(0)h(on)f(the)f(stack)h(and)g(is)h(followed)e(by) -h(an)h Ff(ifne)e Ft(instr)o(uction)g(\(branch)j(if)f(stack)f(value)h -Fd(6)p Fc(=)f Ft(0\))h(may)0 5350 y(be)d(r)n(eplaced)f(by)h(the)f -Ff(IfInstruction)23 b Ft(with)29 b(its)f(branch)i(tar)n(get)e(r)n -(eplaced)g(by)h(the)f(tar)n(get)g(of)h(the)f Ff(ifne)0 -5463 y Ft(instr)o(uction:)1863 5712 y Fq(18)p eop -%%Page: 19 19 -19 18 bop 109 407 a Ff(InstructionList)48 b(il)53 b(=)i(new)e -(InstructionLis)o(t\()o(\);)109 520 y(...)109 633 y(CodeConstraint)48 -b(constraint)i(=)k(new)g(CodeConstraint)o(\(\))48 b({)218 -746 y(public)k(boolean)f(checkCode\(Instru)o(ct)o(io)o(nH)o(an)o(dle)o -([])d(match\))k({)327 858 y(IfInstruction)d(if1)k(=)h -(\(IfInstruction\))o(ma)o(tch)o([0)o(].)o(ge)o(tI)o(nst)o(ru)o(ct)o(io) -o(n\()o(\);)327 971 y(GOTO)544 b(g)163 b(=)54 b(\(GOTO\)match[2].)o(ge) -o(tIn)o(st)o(ru)o(ct)o(io)o(n\(\))o(;)327 1084 y(return)e -(\(if1.getTarget\()o(\))c(==)54 b(match[3]\))c(&&)709 -1197 y(\(g.getTarget\(\))e(==)54 b(match[4]\);)218 1310 -y(})109 1423 y(};)109 1536 y(FindPattern)c(f)163 b(=)54 -b(new)f(FindPattern\(il\))o(;)109 1649 y(String)325 b(pat)53 -b(=)h("`IfInstruction)o('`)o(IC)o(ON)o(ST)o(_0')o(`G)o(OT)o(O')o(`I)o -(CON)o(ST)o(_1)o('")48 b(+)1091 1762 y("`NOP'\(`IFEQ'|`)o(IF)o(NE)o -('\))o(";)109 1875 y(InstructionHand)o(le)o([])g(match;)109 -1988 y(for\(Instruction)o(Ha)o(nd)o(le)g(ih)54 b(=)g(f.search\(pat,)48 -b(constraint\);)327 2100 y(ih)54 b(!=)g(null;)e(ih)h(=)i -(f.search\(pat,)48 b(match[0],)j(constraint\)\))e({)218 -2213 y(match)j(=)j(f.getMatch\(\);)48 b(//)54 b(Constraint)c(already)h -(checked)218 2326 y(...)218 2439 y(match[0].setTar)o(ge)o(t\(m)o(at)o -(ch)o([5)o(].)o(get)o(Ta)o(rg)o(et)o(\(\))o(\);)d(//)54 -b(Update)e(target)218 2552 y(...)218 2665 y(try)h({)327 -2778 y(il.delete\(match)o([1])o(,)48 b(match[5]\);)218 -2891 y(})54 b(catch\(TargetLos)o(tEx)o(ce)o(pt)o(io)o(n)48 -b(e\))54 b({)g(...)f(})109 3004 y(})146 3325 y Ft(The)26 -b(applied)g(code)f(constraint)h(object)g(ensur)n(es)f(that)h(the)f -(matched)h(code)f(r)n(eally)i(corr)n(esponds)d(to)i(the)0 -3437 y(tar)n(geted)e(expr)n(ession)g(pattern.)35 b(Subsequent)24 -b(application)j(of)e(this)h(algorithm)g(r)n(emoves)f(all)i(unnecessary) -0 3550 y(stack)g(operations)e(and)i(branch)h(instr)o(uctions)e(fr)n(om) -h(the)f(byte)g(code.)40 b(If)27 b(any)g(of)g(the)f(deleted)f(instr)o -(uctions)0 3663 y(is)g(still)h(r)n(efer)n(enced)d(by)i(an)h -Ff(InstructionTar)o(ge)o(te)o(r)19 b Ft(object,)25 b(the)f(r)n(efer)n -(ence)g(has)h(to)g(be)f(updated)g(in)h(the)0 3776 y Ff(catch)p -Ft(-clause.)146 3903 y(Code)g(example)h(A.1)g(gives)f(a)h(verbose)f -(example)h(of)f(how)h(to)f(cr)n(eate)h(a)g(class)g(\002le,)g(while)g -(example)g(A.3)0 4016 y(shows)e(how)i(to)f(implement)h(a)g(simple)g -(peephole)e(optimizer)i(and)g(how)g(to)f(deal)h(with)g -Ff(TargetLost)21 b Ft(ex-)0 4129 y(ceptions.)0 4468 y -Fg(Example)j(application:)91 b Ft(The)22 b(expr)n(ession)109 -4803 y Ff(if\(\(a)52 b(==)i(null\))e(||)i(\(i)g(<)g(2\)\))218 -4916 y(System.out.prin)o(tl)o(n\(")o(Oo)o(op)o(s")o(\);)146 -5237 y Ft(can)31 b(be)f(mapped)f(to)h(both)f(of)h(the)g(chunks)f(of)h -(byte)f(code)g(shown)g(in)i(\002gur)n(e)e(3.3.8.)51 b(The)29 -b(left)i(column)0 5350 y(r)n(epr)n(esents)18 b(the)i(unoptimized)g -(code)g(while)h(the)f(right)g(column)h(displays)f(the)g(same)g(code)g -(after)h(an)g(aggr)n(es-)0 5463 y(sively)i(optimizing)g(peep)e(hole)h -(algorithm)h(has)g(been)f(applied:)1863 5712 y Fq(19)p -eop -%%Page: 20 20 -20 19 bop 0 1311 a Ff(5:)108 b(aload_0)0 1424 y(6:)g(ifnull)434 -b(#13)0 1537 y(9:)108 b(iconst_0)0 1649 y(10:)53 b(goto)544 -b(#14)0 1762 y(13:)53 b(iconst_1)0 1875 y(14:)g(nop)0 -1988 y(15:)g(ifne)544 b(#36)0 2101 y(18:)53 b(iload_1)0 -2214 y(19:)g(iconst_2)0 2327 y(20:)g(if_icmplt)269 b(#27)0 -2440 y(23:)53 b(iconst_0)0 2553 y(24:)g(goto)544 b(#28)0 -2666 y(27:)53 b(iconst_1)0 2779 y(28:)g(nop)0 2891 y(29:)g(ifne)544 -b(#36)0 3004 y(32:)53 b(iconst_0)0 3117 y(33:)g(goto)544 -b(#37)0 3230 y(36:)53 b(iconst_1)0 3343 y(37:)g(nop)0 -3456 y(38:)g(ifeq)544 b(#52)0 3569 y(41:)53 b(getstatic)269 -b(System.out)0 3682 y(44:)53 b(ldc)599 b("Ooops")0 3795 -y(46:)53 b(invokevirtual)c(println)0 3908 y(52:)k(return)1899 -1311 y(10:)g(aload_0)1899 1424 y(11:)g(ifnull)434 b(#19)1899 -1537 y(14:)53 b(iload_1)1899 1650 y(15:)g(iconst_2)1899 -1763 y(16:)g(if_icmpge)269 b(#27)1899 1876 y(19:)53 b(getstatic)269 -b(System.out)1899 1989 y(22:)53 b(ldc)599 b("Ooops")1899 -2102 y(24:)53 b(invokevirtual)c(println)1899 2215 y(27:)k(return)995 -4181 y Fq(Figur)n(e)26 b(6:)31 b(Optimizing)25 b(boolean)h(expr)n -(essions)1863 5712 y(20)p eop -%%Page: 21 21 -21 20 bop 0 410 a Fr(4)143 b(Application)33 b(areas)0 -662 y Ft(Ther)n(e)20 b(ar)n(e)i(many)f(possible)g(application)h(ar)n -(eas)f(for)g Fe(BCEL)i Ft(ranging)e(fr)n(om)g(class)h(br)n(owsers,)e -(pr)n(o\002lers,)g(byte)0 774 y(code)30 b(optimizers,)i(and)e -(compilers)g(to)g(sophisticated)f(r)o(un-time)i(analysis)g(tools)e(and) -i(extensions)d(to)i(the)0 887 y(Java)24 b(language)f([AFM97,)g(MBL97].) -146 1020 y(Compilers)33 b(like)g(the)f(Barat)h(compiler)g([BS98])g(use) -f Fe(BCEL)j Ft(to)d(implement)h(a)g(byte)f(code)g(generating)0 -1133 y(back)22 b(end.)27 b(Other)21 b(possible)g(application)i(ar)n -(eas)f(ar)n(e)f(the)g(static)h(analysis)g(of)g(byte)e(code)h([TK98)q(]) -h(or)f(examin-)0 1246 y(ing)e(the)f(r)o(un-time)i(behavior)f(of)g -(classes)g(by)g(inserting)f(calls)i(to)f(pr)n(o\002ling)g(methods)e -(into)i(the)f(code.)26 b(Further)0 1359 y(examples)h(ar)n(e)h -(extending)e(Java)k(with)e(Eif)n(fel-like)h(assertions)d([FM98],)k -(automated)d(delegation)f([Cos98)q(],)0 1472 y(or)c(with)h(the)f -(concepts)f(of)i(\223Aspect-Oriented)e(Pr)n(ogramming\224)i([KLM)2542 -1439 y Fb(+)2601 1472 y Ft(97)q(].)0 1882 y Fm(4.1)119 -b(Class)30 b(loaders)0 2099 y Ft(Class)d(loaders)f(ar)n(e)h(r)n -(esponsible)f(for)h(loading)g(class)g(\002les)f(fr)n(om)i(the)e(\002le) -h(system)e(or)h(other)g(r)n(esour)n(ces)f(and)0 2212 -y(passing)k(the)g(byte)h(code)f(to)g(the)g(V)-5 b(irtual)31 -b(Machine)g([LB98].)50 b(A)30 b(custom)g Ff(ClassLoader)25 -b Ft(object)30 b(may)g(be)0 2325 y(used)h(to)h(inter)n(cept)g(the)g -(standar)n(d)g(pr)n(ocedur)n(e)f(of)i(loading)f(a)i(class,)h(i.e.)58 -b(the)31 b(system)g(class)i(loader)-7 b(,)35 b(and)0 -2438 y(perform)22 b(some)g(transformations)g(befor)n(e)g(actually)i -(passing)e(the)f(byte)h(code)g(to)g(the)g(JVM.)146 2571 -y(A)28 b(possible)f(scenario)h(is)g(described)f(in)h(\002gur)n(e)g(7:) -39 b(During)28 b(r)o(un-time)g(the)f(V)-5 b(irtual)28 -b(Machine)h(r)n(equests)0 2683 y(a)d(custom)g(class)g(loader)g(to)f -(load)h(a)g(given)g(class.)38 b(But)25 b(befor)n(e)h(the)f(JVM)h -(actually)h(sees)d(the)h(byte)g(code,)h(the)0 2796 y(class)h(loader)f -(makes)f(a)i(\223side-step\224)e(and)h(performs)f(some)g -(transformation)h(to)g(the)f(class.)39 b(T)-8 b(o)26 -b(make)g(sur)n(e)0 2909 y(that)21 b(the)f(modi\002ed)g(byte)g(code)g -(is)i(still)f(valid)i(and)e(does)e(not)h(violate)i(any)f(of)g(the)f -(JVM's)h(r)o(ules)g(it)g(is)g(checked)0 3022 y(by)i(the)e(veri\002er)i -(befor)n(e)f(the)g(JVM)h(\002nally)g(executes)e(it.)0 -4050 y @beginspecial 0 @llx 0 @lly 683 @urx 144 @ury -4590 @rwi @setspecial -%%BeginDocument: eps/classloader.eps -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: classloader.eps -%%Creator: fig2dev Version 3.2 Patchlevel 0-beta3 -%%CreationDate: Thu Mar 18 16:45:56 1999 -%%For: dahm@gromit (Markus Dahm) -%%Orientation: Portrait -%%BoundingBox: 0 0 683 144 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%Magnification: 1.0000 -%%EndComments -/$F2psDict 200 dict def -$F2psDict begin -$F2psDict /mtrx matrix put -/col-1 {0 setgray} bind def -/col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def -/col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def - -end -save --55.0 171.0 translate -1 -1 scale - -/cp {closepath} bind def -/ef {eofill} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth} bind def -/tr {translate} bind def -/tnt {dup dup currentrgbcolor - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add - 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} - bind def -/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul - 4 -2 roll mul srgb} bind def -/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def -/$F2psEnd {$F2psEnteredState restore end} def -%%EndProlog - -$F2psBegin -10 setmiterlimit -n -1000 3712 m -1000 -1000 l 12712 -1000 l 12712 3712 l cp clip - 0.06299 0.06299 sc -% Polyline -7.500 slw -n 1005 450 m 900 450 900 1020 105 arcto 4 {pop} repeat - 900 1125 3045 1125 105 arcto 4 {pop} repeat - 3150 1125 3150 555 105 arcto 4 {pop} repeat - 3150 450 1005 450 105 arcto 4 {pop} repeat - cp gs col0 s gr -/Helvetica ff 210.00 scf sf -1350 900 m -gs 1 -1 sc (Java class file) col0 sh gr -% Polyline -n 3600 450 m 5850 450 l 5850 1125 l 3600 1125 l cp gs col0 s gr -/Helvetica ff 210.00 scf sf -4140 855 m -gs 1 -1 sc (Class loader) col0 sh gr -% Polyline -n 6750 450 m 9000 450 l 9000 1125 l 6750 1125 l cp gs col0 s gr -/Helvetica ff 210.00 scf sf -7020 855 m -gs 1 -1 sc (Byte code verifier) col0 sh gr -% Polyline -n 9450 450 m 11700 450 l 11700 1125 l 9450 1125 l cp gs col0 s gr -/Helvetica ff 210.00 scf sf -9900 900 m -gs 1 -1 sc (Interpreter/JIT) col0 sh gr -% Polyline -n 4950 1575 m 7875 1575 l 7875 2700 l 4950 2700 l cp gs col0 s gr -/Helvetica ff 210.00 scf sf -5175 2475 m -gs 1 -1 sc (Byte code transformations) col0 sh gr -/Courier-Bold ff 210.00 scf sf -5850 2025 m -gs 1 -1 sc (JavaClass) col0 sh gr -% Polyline -gs clippath -3453 735 m 3573 765 l 3453 795 l 3615 795 l 3615 735 l cp -clip -n 3150 765 m 3600 765 l gs col0 s gr gr - -% arrowhead -n 3453 735 m 3573 765 l 3453 795 l 3453 765 l 3453 735 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -9303 735 m 9423 765 l 9303 795 l 9465 795 l 9465 735 l cp -clip -n 9000 765 m 9450 765 l gs col0 s gr gr - -% arrowhead -n 9303 735 m 9423 765 l 9303 795 l 9303 765 l 9303 735 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6105 1428 m 6075 1548 l 6045 1428 l 6045 1590 l 6105 1590 l cp -clip -n 5850 765 m 6075 765 l 6075 1575 l gs col0 s gr gr - -% arrowhead -n 6105 1428 m 6075 1548 l 6045 1428 l 6075 1428 l 6105 1428 l cp gs 0.00 setgray ef gr col0 s -% Polyline -gs clippath -6603 735 m 6723 765 l 6603 795 l 6765 795 l 6765 735 l cp -clip -n 6525 1575 m 6525 765 l 6750 765 l gs col0 s gr gr - -% arrowhead -n 6603 735 m 6723 765 l 6603 795 l 6603 765 l 6603 735 l cp gs 0.00 setgray ef gr col0 s -$F2psEnd -rs - -%%EndDocument - @endspecial 1414 4253 a Fq(Figur)n(e)26 b(7:)k(Class)25 -b(loaders)146 4672 y Ft(Using)i(class)h(loaders)f(is)g(an)h(elegant)f -(way)g(of)h(extending)d(the)i(Java)i(V)-5 b(irtual)28 -b(Machine)g(with)g(new)e(fea-)0 4785 y(tur)n(es)20 b(without)g -(actually)i(modifying)f(it.)27 b(This)21 b(concept)f(enables)h -(developers)e(to)h(use)g Fs(load-time)j(r)n(e\003ection)g -Ft(to)0 4898 y(implement)28 b(their)f(ideas)h(as)g(opposed)d(to)j(the)f -(static)h(r)n(e\003ection)g(supported)d(by)j(the)f(Java)j(Re\003ection) -d(API)0 5011 y([Jav98)r(].)45 b(Load-time)28 b(transformations)g -(supply)f(the)g(user)g(with)h(a)h(new)f(level)h(of)f(abstraction.)45 -b(He)27 b(is)i(not)0 5124 y(strictly)24 b(tied)f(to)h(the)f(static)h -(constraints)f(of)h(the)g(original)h(authors)e(of)h(the)f(classes)h -(but)g(may)g(customize)g(the)0 5237 y(applications)i(with)f(thir)n -(d-party)g(code)g(in)g(or)n(der)g(to)f(bene\002t)h(fr)n(om)h(new)e -(featur)n(es.)36 b(Such)25 b(transformations)0 5350 y(may)j(be)g -(executed)d(on)j(demand)f(and)h(neither)e(interfer)n(e)h(with)h(other)e -(users,)h(nor)h(alter)f(the)g(original)i(byte)0 5463 -y(code.)e(In)22 b(fact,)h(class)h(loaders)d(may)i(even)f(cr)n(eate)h -(classes)f Fs(ad)i(hoc)f Ft(without)f(loading)h(a)g(\002le)g(at)f(all.) -1863 5712 y Fq(21)p eop -%%Page: 22 22 -22 21 bop 0 407 a Fg(4.1.1)99 b(Example:)30 b(Poor)25 -b(Man')-5 b(s)24 b(Genericity)0 587 y Ft(The)17 b(\223Poor)g(Man's)h -(Genericity\224)g(pr)n(oject)f([BD98)r(])h(that)f(extends)f(Java)j -(with)f(parameterized)f(classes,)h(for)f(ex-)0 700 y(ample,)j(uses)e -Fe(BCEL)i Ft(in)f(two)g(places)g(to)g(generate)e(instances)i(of)g -(parameterized)f(classes:)26 b(During)19 b(compile-)0 -813 y(time)36 b(\(the)f(standar)n(d)g Ff(javac)f Ft(with)i(some)f -(slightly)g(changed)g(classes\))h(and)g(at)g(r)o(un-time)f(using)h(a)g -(cus-)0 926 y(tom)28 b(class)g(loader)-7 b(.)43 b(The)28 -b(compiler)g(puts)f(some)g(additional)h(type)e(information)j(into)f -(class)g(\002les)g(which)g(is)0 1039 y(evaluated)e(at)h(load-time)f(by) -g(the)g(class)h(loader)-7 b(.)38 b(The)26 b(class)h(loader)e(performs)h -(some)f(transformations)g(on)0 1152 y(the)i(loaded)g(class)i(and)e -(passes)g(them)g(to)g(the)g(VM.)h(The)f(following)h(algorithm)g -(illustrates)g(how)f(the)g(load)0 1264 y(method)21 b(of)i(the)f(class)h -(loader)f(ful\002lls)i(the)e(r)n(equest)f(for)h(a)h(parameterized)f -(class,)h(e.g.)k Ff(Stack)127 1487 y Ft(1.)49 -b(Sear)n(ch)19 b(for)g(class)g Ff(Stack)p Ft(,)f(load)h(it,)g(and)g -(check)g(for)g(a)g(certain)g(class)h(attribute)e(containing)h -(additional)244 1600 y(type)i(information.)28 b(I.e.)f(the)22 -b(attribute)g(de\002nes)f(the)h(\223r)n(eal\224)i(name)f(of)g(the)e -(class,)i(i.e.)28 b Ff(Stack)p Ft(.)127 1794 y(2.)49 -b(Replace)28 b(all)h(occurr)n(ences)e(and)h(r)n(efer)n(ences)f(to)g -(the)g(formal)i(type)d Ff(A)i Ft(with)g(r)n(efer)n(ences)f(to)g(the)g -(actual)244 1907 y(type)21 b Ff(String)p Ft(.)k(For)d(example)g(the)g -(method)353 2168 y Ff(void)53 b(push\(A)f(obj\))g({)i(...)g(})244 -2429 y Ft(becomes)353 2690 y Ff(void)f(push\(String)c(obj\))k({)h(...)f -(})127 2952 y Ft(3.)c(Return)21 b(the)h(r)n(esulting)g(class)h(to)f -(the)g(V)-5 b(irtual)23 b(Machine.)0 3293 y Fr(References)0 -3508 y Ft([AFM97])109 b(O.)29 b(Agesen,)f(S.)h(N.)f(Fr)n(eund,)h(and)g -(J.)h(C.)f(Mitchell.)54 b(Adding)27 b(T)-8 b(ype)28 b(Parameterization) -i(to)e(the)467 3621 y(Java)c(Language.)31 b(In)23 b Fs(Pr)n(oceedings)i -(OOPSLA)-5 b('97)p Ft(,)21 b(Atlanta,)i(GA,)f(1997.)0 -3815 y([AP98])191 b(D.)24 b(Antonioli)f(and)h(M.)g(Pilz.)37 -b(Statistische)23 b(Analyse)g(von)h(Java-Class\002les.)38 -b(In)23 b(Clemens)h(Cap,)467 3928 y(editor)-7 b(,)21 -b Fs(Pr)n(oceedings)k(JIT'98)p Ft(.)f(Springer)-7 b(,)22 -b(1998.)0 4122 y([BD98])191 b(B.)21 b(Bokowski)f(and)i(M.)f(Dahm.)32 -b(Poor)21 b(Man's)h(Genericity)g(for)f(Java.)33 b(In)21 -b(Clemens)h(Cap,)g(editor)-7 b(,)467 4235 y Fs(Pr)n(oceedings)25 -b(JIT'98)p Ft(.)f(Springer)-7 b(,)21 b(1998.)0 4429 y([BS98])213 -b(B.)28 b(Bokowski)f(and)i(A.)f(Spiegel.)51 b(Barat)29 -b(\226)h(A)e(Fr)n(ont-End)f(for)i(Java.)54 b(T)-8 b(echnical)30 -b(r)n(eport,)f(Fr)n(eie)467 4542 y(Universit)8 b(\250)-38 -b(at)22 b(Berlin,)g(1998.)0 4736 y([CCK98])123 b(Geof)n(f)24 -b(Cohen,)f(Jef)n(f)h(Chase,)g(and)f(David)i(Kaminsky)-10 -b(.)35 b(Automatic)24 b(Pr)n(ogram)f(T)-8 b(ransformation)467 -4849 y(with)22 b(JOIE.)33 b(In)22 b Fs(Pr)n(oceedings)j(USENIX)c -(Annual)h(T)-10 b(echnical)23 b(Symposium)p Ft(,)g(1998.)0 -5043 y([CCZ97])128 b(Suzanne)34 b(Collin,)39 b(Dominique)d(Colnet,)h -(and)e(Olivier)h(Zendra.)70 b(T)-8 b(ype)33 b(Infer)n(ence)h(for)h -(Late)467 5156 y(Binding.)22 b(The)g(SmallEif)n(fel)j(Compiler.)32 -b(In)23 b Fs(Pr)n(oceedings)i(JMLC'97)p Ft(,)e(1997.)0 -5350 y([Cos98])164 b(Pascal)42 b(Costanza.)90 b Fs(The)41 -b(ClassFilters)i(package)p Ft(.)91 b(Universit)8 b(\250)-38 -b(at)41 b(Bonn,)i Ff(http://www.cs.)467 5463 y(uni-)t(bonn.de/\230co)o -(st)o(an)o(za)o(/Cl)o(as)o(sF)o(il)o(te)o(rs/)o Ft(,)17 -b(1998.)1863 5712 y Fq(22)p eop -%%Page: 23 23 -23 22 bop 0 407 a Ft([FM98])180 b(C.)29 b(Fischer)f(and)g(D.)h -(Meemken.)50 b(JaW)-8 b(a:)41 b(Java)30 b(with)f(Assertions.)49 -b(In)28 b(Clemens)h(Cap,)h(editor)-7 b(,)467 520 y Fs(Pr)n(oceedings)25 -b(JIT'98)p Ft(.)f(Springer)-7 b(,)21 b(1998.)0 707 y([GHJV95])76 -b(E.)17 b(Gamma,)k(R.)d(Helm,)h(R.)f(Johnson,)g(and)g(J.)g(Vlissides.)k -Fs(Design)d(Patterns:)27 b(Elements)19 b(of)g(Reusable)467 -820 y(Object-Oriented)25 b(Softwar)n(e)p Ft(.)34 b(Addison-W)-8 -b(esley)e(,)19 b(1995.)0 1008 y([GJS96])170 b(J.)32 b(Gosling,)j(B.)d -(Joy)-10 b(,)34 b(and)f(G.)f(Steele.)63 b Fs(The)33 b(Java)h(Language)f -(Speci\002cation)p Ft(.)66 b(Addison-W)-8 b(esley)e(,)467 -1121 y(1996.)0 1308 y([Jav98])191 b(JavaSoft.)71 b Fs(Re\003ection)35 -b(API)p Ft(.)70 b Ff(http://java.sun)o(.c)o(om)o(/pr)o(od)o(uc)o(ts)o -(/j)o(dk/)o(1.)o(1/)o(do)o(cs)o(/)467 1421 y(guide/reflecti)o(on/)o -Ft(,)17 b(1998.)0 1609 y([KH98])175 b(Ralph)33 b(Keller)f(and)h(Urs)f -(H)10 b(\250)-40 b(olzle.)65 b(Binary)32 b(Component)g(Adaptation.)63 -b(In)33 b(Eric)g(Jul,)i(editor)-7 b(,)467 1722 y Fs(Pr)n(oceedings)25 -b(ECOOP'98)p Ft(.)d(Springer)-7 b(,)21 b(1998.)0 1910 -y([KLM)238 1877 y Fb(+)297 1910 y Ft(97])50 b(Gr)n(egor)27 -b(Kiczales,)i(John)e(Lamping,)h(Anurag)f(Mendhekar)-7 -b(,)27 b(Chris)h(Maeda,)g(Cristina)g(Lopes,)467 2022 -y(Jean-Mar)n(c)f(Loingtier)-7 b(,)26 b(and)g(John)g(Irwin.)43 -b(Aspect-Oriented)24 b(Pr)n(ogramming.)43 b(T)-8 b(echnical)27 -b(r)n(e-)467 2135 y(port,)21 b(Xer)n(ox)h(Palo)h(Alto)f(Resear)n(ch)g -(Center)-7 b(,)22 b(1997.)0 2323 y([LB98])205 b(Sheng)23 -b(Lian)i(and)g(Gilad)h(Bracha.)39 b(Dynamic)26 b(Class)g(Loading)d(in)i -(the)f(Java)j(V)-5 b(irtual)25 b(Machine.)467 2436 y(In)d -Fs(Pr)n(oceedings)j(OOPSLA)-5 b('98)p Ft(,)22 b(1998.)0 -2623 y([L)-8 b(Y97])208 b(T)-5 b(im)35 b(Lindholm)f(and)g(Frank)g(Y)-8 -b(ellin.)69 b Fs(The)35 b(Java)h(V)-7 b(irtual)35 b(Machine)g -(Speci\002cation)p Ft(.)71 b(Addison-)467 2736 y(W)-8 -b(esley)e(,)20 b(1997.)0 2924 y([LZ98])200 b(Han)25 b(Bok)f(Lee)f(and)i -(Benjamin)h(G.)f(Zorn.)38 b(BIT)-5 b(:)24 b(A)h(T)-8 -b(ool)24 b(for)h(Instr)o(umenting)e(Java)j(Bytecodes.)467 -3037 y(In)c Fs(Pr)n(oceedings)j(USENIX)c(Symposium)j(on)e(Internet)i(T) --10 b(echnologies)25 b(and)e(Systems)p Ft(,)h(1998.)0 -3225 y([MBL97])119 b(A.C.)24 b(Myers,)g(J.)h(A.)g(Bank,)f(and)h(B.)f -(Liskov)-10 b(.)39 b(Parameterized)24 b(T)-8 b(ypes)23 -b(for)i(Java.)41 b(In)25 b Fs(Pr)n(oceedings)467 3337 -y(POPL)m('97)p Ft(,)c(Paris,)i(France,)f(1997.)0 3525 -y([MD97])161 b(J.)23 b(Meyer)e(and)h(T)-7 b(.)23 b(Downing.)32 -b Fs(Java)24 b(V)-7 b(irtual)24 b(Machine)p Ft(.)33 b(O'Reilly)-10 -b(,)23 b(1997.)0 3713 y([Sil98])217 b(Shawn)28 b(Silverman.)51 -b Fs(The)28 b(class\002le)i(API)p Ft(.)50 b(University)27 -b(of)h(Manitoba,)i Ff(http://Meurrens)o(.)467 3826 y(ML.org/ip-)t -(Links)o(/j)o(av)o(a/)o(cod)o(eE)o(ng)o(in)o(ee)o(rin)o(g/)o(vi)o(ew)o -(er)o(s.h)o(tm)o(l)p Ft(,)16 b(1998.)0 4013 y([T)-8 b(af96])194 -b(T)-8 b(ucker)23 b(T)-8 b(aft.)37 b(Pr)n(ogramming)25 -b(the)e(Internet)f(in)j(Ada95.)38 b(In)24 b Fs(Pr)n(oceedings)j -(Ada-Eur)n(ope)f(Interna-)467 4126 y(tional)e(Confer)n(ence)g(on)e -(Reliable)j(Softwar)n(e)f(T)-10 b(echnologies)p Ft(,)25 -b(1996.)0 4314 y([TK98])195 b(M.)35 b(Thies)f(and)h(U.)f(Kastens.)71 -b(Statische)34 b(Analyse)g(von)h(Bibliotheken)f(als)i(Gr)o(undlage)f -(dy-)467 4427 y(namischer)23 b(Optimier)o(ung.)32 b(In)23 -b(Clemens)f(Cap,)h(editor)-7 b(,)21 b Fs(Pr)n(oceedings)26 -b(JIT'98)p Ft(.)d(Springer)-7 b(,)22 b(1998.)0 4614 y([Y)-8 -b(ou98])159 b(Matt)42 b(T)-7 b(.)42 b(Y)-8 b(ourst.)92 -b Fs(Inside)44 b(Java)f(Class)g(Files)p Ft(.)96 b(Laserstars)40 -b(T)-8 b(echnologies,)45 b Ff(http://www.)467 4727 y(laserstars.com)o -(/ar)o(ti)o(cl)o(es)o(/d)o(dj/)o(in)o(si)o(de)o(jc)o(f/)p -Ft(,)16 b(1998.)1863 5712 y Fq(23)p eop -%%Page: 24 24 -24 23 bop 0 410 a Fr(A)143 b(Code)35 b(examples)e(for)i(the)g(ClassGen) -f(API)0 658 y Fm(A.1)119 b(HelloW)-9 b(orldBuilder)i(.java)0 -835 y Ft(The)18 b(following)h(Java)i(pr)n(ogram)e(r)n(eads)f(a)i(name)f -(fr)n(om)g(the)g(standar)n(d)f(input)g(and)h(prints)f(a)i(friendly)f -(\223Hello\224.)0 948 y(Since)31 b(the)f Ff(readLine\(\))d -Ft(method)j(may)h(thr)n(ow)g(an)g Ff(IOException)26 b -Ft(it)32 b(is)f(enclosed)e(by)i(a)h Ff(try-catch)0 1060 -y Ft(block.)0 1268 y Ff(import)52 b(java.io.*;)0 1494 -y(public)g(class)g(HelloWorld)e({)109 1607 y(public)i(static)g(void)g -(main\(String[])d(argv\))j({)218 1720 y(BufferedReader)c(in)54 -b(=)g(new)f(BufferedReader\()o(new)1418 1833 y(InputStreamRead)o(er)o -(\(Sy)o(st)o(em)o(.i)o(n\))o(\);)218 1946 y(String)f(name)h(=)h(null;) -218 2172 y(try)f({)327 2284 y(System.out.prin)o(t\(")o(Pl)o(ea)o(se)48 -b(enter)k(your)h(name>)f("\);)327 2397 y(name)h(=)h(in.readLine\(\);) -218 2510 y(})g(catch\(IOExcepti)o(on)48 b(e\))54 b({)g(return;)d(})218 -2736 y(System.out.prin)o(tl)o(n\(")o(He)o(ll)o(o,)d(")54 -b(+)g(name\);)109 2849 y(})0 2962 y(})0 3343 y Fm(A.2)119 -b(HelloW)-9 b(orldBuilder)i(.java)0 3520 y Ft(W)f(e)28 -b(will)i(sketch)e(her)n(e)g(how)g(the)g(above)h(Java)i(class)e(can)h -(be)f(cr)n(eated)f(fr)n(om)h(the)f(scratch)h(using)g(the)f -Fe(BCEL)0 3633 y Ft(API.)h(For)g(ease)g(of)h(r)n(eading)g(we)f(will)i -(use)e(textual)g(signatur)n(es)g(and)h(not)f(cr)n(eate)h(them)f -(dynamically)-10 b(.)51 b(For)0 3746 y(example,)22 b(the)g(signatur)n -(e)109 3954 y Ff("\(Ljava/lang/St)o(ri)o(ng)o(;\)L)o(ja)o(va)o(/l)o(an) -o(g/S)o(tr)o(in)o(gB)o(uf)o(fer)o(;")146 4161 y Ft(would)g(actually)i -(be)f(cr)n(eated)f(with)109 4369 y Ff(Type.getMethodS)o(ig)o(na)o(tur)o -(e\()o(Ty)o(pe)o(.S)o(TRI)o(NG)o(BU)o(FF)o(ER)o(,)49 -b(new)k(Type[])f({)i(Type.STRING)49 b(}\);)0 4627 y Fg(A.2.1)99 -b(Initialization:)0 4803 y Ft(First)22 b(we)g(cr)n(eate)g(an)i(empty)d -(class)i(and)g(an)g(instr)o(uction)f(list:)109 5011 y -Ff(ClassGen)106 b(cg)53 b(=)h(new)f(ClassGen\("HelloW)o(or)o(ld)o(",)48 -b("java.lang.Obje)o(ct)o(",)1636 5124 y("",)h(ACC_PUBLIC)h -(|)k(ACC_SUPER,)1636 5237 y(null\);)109 5350 y(ConstantPoolGen)48 -b(cp)53 b(=)i(cg.getConstant)o(Po)o(ol)o(\(\))o(;)49 -b(//)k(cg)h(creates)d(constant)g(pool)109 5463 y(InstructionList)d(il) -53 b(=)i(new)e(InstructionLis)o(t\()o(\);)p eop -%%Page: 25 25 -25 24 bop 146 407 a Ft(W)-8 b(e)26 b(then)f(cr)n(eate)i(the)e(main)j -(method,)d(supplying)g(the)h(method's)f(name)h(and)h(the)e(symbolic)i -(type)e(sig-)0 520 y(natur)n(e)d(encoded)f(with)i Ff(Type)e -Ft(objects.)109 705 y Ff(MethodGen)105 b(mg)54 b(=)g(new)f -(MethodGen\(ACC_S)o(TA)o(TI)o(C)48 b(|)55 b(ACC_PUBLIC,//)48 -b(access)k(flags)1745 818 y(Type.VOID,)760 b(//)53 b(return)f(type)1745 -931 y(new)i(Type[])d({)655 b(//)53 b(argument)e(types)1855 -1044 y(new)i(ArrayType\(Type)o(.S)o(TRI)o(NG)o(,)48 b(1\))54 -b(},)1745 1156 y(new)g(String[])d({)j("argv")d(},)j(//)g(arg)f(names) -1745 1269 y("main",)f("HelloWorld",)212 b(//)54 b(method,)d(class)1745 -1382 y(il,)j(cp\);)109 1495 y(InstructionFact)o(or)o(y)48 -b(factory)k(=)i(new)f(InstructionFact)o(or)o(y\()o(cg\))o(;)146 -1680 y Ft(W)-8 b(e)22 b(de\002ne)f(some)h(often)g(use)f(types:)109 -1865 y Ff(ObjectType)50 b(i_stream)h(=)j(new)f(ObjectType\("jav)o(a.i)o -(o.)o(In)o(pu)o(tS)o(tre)o(am)o("\))o(;)109 1978 y(ObjectType)d -(p_stream)h(=)j(new)f(ObjectType\("jav)o(a.i)o(o.)o(Pr)o(in)o(tS)o(tre) -o(am)o("\))o(;)0 2233 y Fg(A.2.2)99 b(Create)24 b(variables)h -Fa(in)f Fg(and)h Fa(name)p Fg(:)0 2410 y Ft(W)-8 b(e)16 -b(call)j(the)e(constr)o(uctors,)f(i.e.)26 b(execute)15 -b Ff(BufferedReader\(I)o(np)o(ut)o(St)o(rea)o(mR)o(ea)o(de)o(r\()o(Sys) -o(te)o(m.)o(in)o(\)\))o Ft(.)0 2522 y(The)j(r)n(efer)n(ence)h(to)g(the) -f Ff(BufferedReader)13 b Ft(object)19 b(stays)f(on)h(top)f(of)h(the)g -(stack)g(and)g(is)g(stor)n(ed)f(in)h(the)g(newly)0 2635 -y(allocated)k Ff(in)f Ft(variable.)109 2820 y Ff(il.append\(facto)o(ry) -o(.c)o(rea)o(te)o(Ne)o(w\()o("j)o(ava)o(.i)o(o.)o(Bu)o(ff)o(ere)o(dR)o -(ea)o(de)o(r")o(\)\);)109 2933 y(il.append\(Instr)o(uc)o(ti)o(onC)o(on) -o(st)o(an)o(ts)o(.DU)o(P\))o(;)48 b(//)54 b(Use)f(predefined)d -(constant)109 3046 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(Ne)o(w\()o -("j)o(ava)o(.i)o(o.)o(In)o(pu)o(tSt)o(re)o(am)o(Re)o(ad)o(er")o(\)\))o -(;)109 3159 y(il.append\(Instr)o(uc)o(ti)o(onC)o(on)o(st)o(an)o(ts)o -(.DU)o(P\))o(;)109 3272 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(Fi)o -(el)o(dA)o(cce)o(ss)o(\(")o(ja)o(va)o(.la)o(ng)o(.S)o(ys)o(te)o(m",)e -("in",)k(i_stream,)2073 3385 y(Constants.GETS)o(TA)o(TIC)o(\)\))o(;)109 -3498 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(In)o(vo)o(ke)o(\("j)o -(av)o(a.)o(io)o(.I)o(npu)o(tS)o(tr)o(ea)o(mR)o(ead)o(er)o(",)c -("",)1800 3611 y(Type.VOID,)i(new)j(Type[])f({)i(i_stream)d(},) -1800 3724 y(Constants.INVOK)o(ES)o(PE)o(CI)o(AL\))o(\);)109 -3837 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(In)o(vo)o(ke)o(\("j)o -(av)o(a.)o(io)o(.B)o(uff)o(er)o(ed)o(Re)o(ad)o(er")o(,)d("",)j -(Type.VOID,)1800 3950 y(new)i(Type[])f({new)h(ObjectType\("ja)o(va)o -(.io)o(.R)o(ea)o(de)o(r")o(\)},)1800 4062 y(Constants.INVOK)o(ES)o(PE)o -(CI)o(AL\))o(\);)109 4288 y(LocalVariableGe)o(n)48 b(lg)54 -b(=)218 4401 y(mg.addLocalVari)o(ab)o(le\()o("i)o(n")o(,)1309 -4514 y(new)f(ObjectType\("jav)o(a.i)o(o.)o(Bu)o(ff)o(er)o(edR)o(ea)o -(de)o(r")o(\),)48 b(null,)k(null\);)109 4627 y(int)h(in)h(=)g -(lg.getIndex\(\);)109 4740 y(lg.setStart\(il.)o(ap)o(pe)o(nd\()o(ne)o -(w)48 b(ASTORE\(in\)\)\);)h(//)54 b(`i')f(valid)f(from)h(here)146 -4925 y Ft(Cr)n(eate)23 b(local)h(variable)h Ff(name)c -Ft(and)h(initialize)j(it)e(to)f Ff(null)p Ft(.)109 5110 -y Ff(lg)54 b(=)g(mg.addLocalVar)o(iab)o(le)o(\(")o(na)o(me)o(",)48 -b(Type.STRING,)h(null,)j(null\);)109 5223 y(int)h(name)g(=)h -(lg.getIndex\(\);)109 5336 y(il.append\(Instr)o(uc)o(ti)o(onC)o(on)o -(st)o(an)o(ts)o(.AC)o(ON)o(ST)o(_N)o(UL)o(L\);)109 5449 -y(lg.setStart\(il.)o(ap)o(pe)o(nd\()o(ne)o(w)48 b(ASTORE\(name\)\)\);)g -(//)54 b(`name')d(valid)i(from)f(here)p eop -%%Page: 26 26 -26 25 bop 0 407 a Fg(A.2.3)99 b(Create)24 b(try-catch)i(block)0 -584 y Ft(W)-8 b(e)31 b(r)n(emember)g(the)g(start)g(of)h(the)f(block,)j -(r)n(ead)e(a)g(line)g(fr)n(om)h(the)e(standar)n(d)g(input)g(and)h(stor) -n(e)e(it)i(into)g(the)0 697 y(variable)25 b Ff(name)p -Ft(.)109 913 y Ff(InstructionHand)o(le)48 b(try_start)i(=)218 -1026 y(il.append\(facto)o(ry)o(.cr)o(ea)o(te)o(Fi)o(el)o(dAc)o(ce)o(ss) -o(\(")o(ja)o(va.)o(la)o(ng)o(.S)o(ys)o(tem)o(",)e("out",)k(p_stream,) -2182 1139 y(Constants.GETS)o(TAT)o(IC)o(\)\))o(;)109 -1365 y(il.append\(new)d(PUSH\(cp,)i("Please)g(enter)h(your)h(name>)f -("\)\);)109 1478 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(In)o(vo)o -(ke)o(\("j)o(av)o(a.)o(io)o(.P)o(rin)o(tS)o(tr)o(ea)o(m")o(,)d -("print",)h(Type.VOID,)1800 1591 y(new)j(Type[])f({)i(Type.STRING)c(},) -1800 1704 y(Constants.INVOK)o(EV)o(IR)o(TU)o(AL\))o(\);)109 -1817 y(il.append\(new)f(ALOAD\(in\)\);)109 1930 y(il.append\(facto)o -(ry)o(.c)o(rea)o(te)o(In)o(vo)o(ke)o(\("j)o(av)o(a.)o(io)o(.B)o(uff)o -(er)o(ed)o(Re)o(ad)o(er")o(,)f("readLine",)1800 2042 -y(Type.STRING,)h(Type.NO_ARGS,)1800 2155 y(Constants.INVOK)o(EV)o(IR)o -(TU)o(AL\))o(\);)109 2268 y(il.append\(new)g(ASTORE\(name\)\);)146 -2485 y Ft(Upon)22 b(normal)h(execution)f(we)g(jump)g(behind)h -(exception)e(handler)-7 b(,)22 b(the)g(tar)n(get)g(addr)n(ess)f(is)h -(not)g(known)0 2598 y(yet.)109 2815 y Ff(GOTO)53 b(g)h(=)g(new)f -(GOTO\(null\);)109 2928 y(InstructionHand)o(le)48 b(try_end)j(=)j -(il.append\(g\);)146 3144 y Ft(W)-8 b(e)22 b(add)g(the)g(exception)g -(handler)g(which)h(simply)g(r)n(eturns)e(fr)n(om)i(the)f(method.)109 -3361 y Ff(InstructionHand)o(le)48 b(handler)j(=)j(il.append\(Instru)o -(ct)o(io)o(nC)o(on)o(sta)o(nt)o(s.)o(RE)o(TU)o(RN\))o(;)109 -3474 y(mg.addException)o(Ha)o(nd)o(ler)o(\(t)o(ry)o(_s)o(ta)o(rt,)48 -b(try_end,)j(handler,)f("java.io.IOExcep)o(ti)o(on)o("\))o(;)146 -3691 y Ft(\223Normal\224)24 b(code)e(continues,)f(now)h(we)g(can)i(set) -d(the)h(branch)i(tar)n(get)e(of)g(the)g(GOT)n(O.)109 -3908 y Ff(InstructionHand)o(le)48 b(ih)54 b(=)218 4020 -y(il.append\(facto)o(ry)o(.cr)o(ea)o(te)o(Fi)o(el)o(dAc)o(ce)o(ss)o -(\(")o(ja)o(va.)o(la)o(ng)o(.S)o(ys)o(tem)o(",)48 b("out",)k(p_stream,) -2182 4133 y(Constants.GETS)o(TAT)o(IC)o(\)\))o(;)109 -4246 y(g.setTarget\(ih\))o(;)0 4505 y Fg(A.2.4)99 b(Printing)25 -b(\224Hello\224)0 4682 y Ft(String)d(concatenation)h(compiles)f(to)g -Ff(StringBuffer)17 b Ft(operations.)109 4898 y Ff(il.append\(facto)o -(ry)o(.c)o(rea)o(te)o(Ne)o(w\()o(Ty)o(pe.)o(ST)o(RI)o(NG)o(BU)o(FFE)o -(R\))o(\);)109 5011 y(il.append\(Instr)o(uc)o(ti)o(onC)o(on)o(st)o(an)o -(ts)o(.DU)o(P\))o(;)109 5124 y(il.append\(new)49 b(PUSH\(cp,)i("Hello,) -g("\)\);)109 5237 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(In)o(vo)o -(ke)o(\("j)o(av)o(a.)o(la)o(ng)o(.St)o(ri)o(ng)o(Bu)o(ff)o(er")o(,)d -("",)1800 5350 y(Type.VOID,)i(new)j(Type[])f({)i(Type.STRING)c -(},)1800 5463 y(Constants.INVOK)o(ES)o(PE)o(CI)o(AL\))o(\);)p -eop -%%Page: 27 27 -27 26 bop 109 407 a Ff(il.append\(new)49 b(ALOAD\(name\)\);)109 -520 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(In)o(vo)o(ke)o(\("j)o(av) -o(a.)o(la)o(ng)o(.St)o(ri)o(ng)o(Bu)o(ff)o(er")o(,)f("append",)1800 -633 y(Type.STRINGBUFF)o(ER)o(,)g(new)54 b(Type[])d({)j(Type.STRING)c -(},)1800 746 y(Constants.INVOK)o(EV)o(IR)o(TU)o(AL\))o(\);)109 -858 y(il.append\(facto)o(ry)o(.c)o(rea)o(te)o(In)o(vo)o(ke)o(\("j)o(av) -o(a.)o(la)o(ng)o(.St)o(ri)o(ng)o(Bu)o(ff)o(er")o(,)e("toString",)1800 -971 y(Type.STRING,)h(Type.NO_ARGS,)1800 1084 y(Constants.INVOK)o(EV)o -(IR)o(TU)o(AL\))o(\);)109 1310 y(il.append\(facto)o(ry)o(.c)o(rea)o(te) -o(In)o(vo)o(ke)o(\("j)o(av)o(a.)o(io)o(.P)o(rin)o(tS)o(tr)o(ea)o(m")o -(,)g("println",)1800 1423 y(Type.VOID,)h(new)j(Type[])f({)i -(Type.STRING)c(},)1800 1536 y(Constants.INVOK)o(EV)o(IR)o(TU)o(AL\))o -(\);)109 1649 y(il.append\(Instr)o(uc)o(ti)o(onC)o(on)o(st)o(an)o(ts)o -(.RE)o(TU)o(RN)o(\);)0 1908 y Fg(A.2.5)99 b(Finalization)0 -2085 y Ft(Finally)-10 b(,)26 b(we)e(have)i(to)e(set)g(the)g(stack)g -(size,)i(which)f(normally)h(would)e(be)h(computed)f(on)g(the)g(\003y)h -(and)g(add)g(a)0 2197 y(default)d(constr)o(uctor)g(method)f(to)h(the)g -(class,)h(which)g(is)g(empty)e(in)i(this)f(case.)109 -2418 y Ff(mg.setMaxStack\()o(5\))o(;)109 2531 y(cg.addMethod\(mg)o(.g)o -(et)o(Met)o(ho)o(d\()o(\)\))o(;)109 2644 y(il.dispose\(\);)49 -b(//)k(Allow)g(instruction)c(handles)j(to)h(be)h(reused)109 -2756 y(cg.addEmptyCons)o(tr)o(uc)o(tor)o(\(A)o(CC)o(_P)o(UB)o(LIC)o -(\);)146 2977 y Ft(Last)22 b(but)h(not)f(least)g(we)g(dump)g(the)g -Ff(JavaClass)c Ft(object)23 b(to)f(a)h(\002le.)109 3197 -y Ff(try)53 b({)218 3310 y(cg.getJavaClass)o(\(\))o(.du)o(mp)o(\(")o -(He)o(ll)o(oWo)o(rl)o(d.)o(cl)o(as)o(s"\))o(;)109 3423 -y(})h(catch\(java.io.I)o(OE)o(xce)o(pt)o(io)o(n)48 b(e\))54 -b({)g(System.err.prin)o(tl)o(n\()o(e\);)48 b(})0 3711 -y Fm(A.3)119 b(Peephole.java)0 3888 y Ft(This)20 b(class)h(implements)e -(a)i(simple)f(peephole)e(optimizer)j(that)f(r)n(emoves)f(any)h(NOP)h -(instr)o(uctions)e(fr)n(om)i(the)0 4001 y(given)i(class.)0 -4221 y Ff(import)52 b(java.io.*;)0 4334 y(import)g(de.fub.bytecod)o -(e.c)o(la)o(ss)o(fi)o(le)o(.*;)0 4447 y(import)g(de.fub.bytecod)o(e.g)o -(en)o(er)o(ic)o(.*)o(;)0 4560 y(import)g(de.fub.bytecod)o(e.R)o(ep)o -(os)o(it)o(or)o(y;)0 4785 y(public)g(class)g(Peephole)f({)109 -4898 y(public)h(static)g(void)g(main\(String[])d(argv\))j({)218 -5011 y(try)h({)327 5124 y(/*)h(Load)f(the)g(class)f(from)h(CLASSPATH.) -382 5237 y(*/)327 5350 y(JavaClass)378 b(clazz)161 b(=)54 -b(Repository.looku)o(pC)o(la)o(ss)o(\(ar)o(gv)o([0)o(]\))o(;)327 -5463 y(Method[])433 b(methods)51 b(=)j(clazz.getMethods)o(\(\))o(;)p -eop -%%Page: 28 28 -28 27 bop 327 407 a Ff(ConstantPoolGen)48 b(cp)326 b(=)54 -b(new)g(ConstantPoolGe)o(n\()o(cl)o(azz)o(.g)o(et)o(Co)o(ns)o(tan)o(tP) -o(oo)o(l\()o(\)\))o(;)327 633 y(for\(int)e(i=0;)g(i)i(<)h -(methods.length)o(;)48 b(i++\))53 b({)436 746 y(MethodGen)e(mg)381 -b(=)54 b(new)f(MethodGen\(metho)o(ds)o([i)o(],)2345 858 -y(clazz.getClassNa)o(me)o(\(\))o(,)48 b(cp\);)436 971 -y(Method)216 b(stripped)51 b(=)j(removeNOPs\(mg\))o(;)436 -1197 y(if\(stripped)c(!=)k(null\))270 b(//)54 b(Any)f(NOPs)g(stripped?) -545 1310 y(methods[i])d(=)55 b(stripped;)50 b(//)k(Overwrite)c(with)j -(stripped)e(method)327 1423 y(})327 1649 y(/*)j(Dump)f(the)g(class)f -(to)i(_.class)382 1762 y(*/)327 1875 y(clazz.setConsta)o -(ntP)o(oo)o(l\()o(cp)o(.g)o(etF)o(in)o(al)o(Co)o(ns)o(tan)o(tP)o(oo)o -(l\()o(\)\))o(;)327 1988 y(clazz.dump\(claz)o(z.g)o(et)o(Cl)o(as)o(sN)o -(ame)o(\(\))c(+)54 b("_.class"\);)218 2100 y(})g(catch\(Exception)48 -b(e\))54 b({)g(e.printStackTr)o(ac)o(e\(\))o(;)48 b(})109 -2213 y(})109 2439 y(private)j(static)h(final)h(Method)e -(removeNOPs\(Metho)o(dG)o(en)d(mg\))53 b({)218 2552 y(InstructionList) -157 b(il)217 b(=)54 b(mg.getInstructio)o(nL)o(is)o(t\()o(\);)218 -2665 y(FindPattern)377 b(f)272 b(=)54 b(new)g(FindPattern\(il)o(\);)218 -2778 y(String)652 b(pat)162 b(=)54 b("\(`NOP'\)+";)c(//)k(Find)e(at)i -(least)e(one)h(NOP)218 2891 y(InstructionHand)o(le)48 -b(next)107 b(=)54 b(null;)218 3004 y(int)817 b(count)52 -b(=)i(0;)218 3230 y(for\(Instruction)o(Ha)o(ndl)o(e)48 -b(ih)54 b(=)g(f.search\(pat\);)48 b(//)54 b(Search)e(with)g(regular)g -(expression)436 3342 y(ih)i(!=)g(null;)436 3455 y(ih)g(=)g -(f.search\(pat,)49 b(next\)\))j({)327 3681 y(InstructionHand)o(le[)o(]) -c(match)k(=)j(f.getMatch\(\);)327 3794 y(InstructionHand)o(le)157 -b(first)52 b(=)j(match[0];)327 3907 y(InstructionHand)o(le)157 -b(last)107 b(=)55 b(match[match.le)o(ng)o(th)48 b(-)54 -b(1];)327 4133 y(/*)g(Some)f(nasty)f(Java)h(compilers)d(may)j(add)g -(NOP)h(at)f(end)g(of)h(method.)382 4246 y(*/)327 4359 -y(if\(\(next)d(=)j(last.getNext\(\)\))48 b(==)54 b(null\))436 -4472 y(break;)327 4697 y(count)f(+=)g(match.length;)327 -4923 y(/*)h(Delete)e(NOPs)g(and)i(redirect)d(any)i(references)d(to)j -(them)g(to)h(the)f(following)382 5036 y(*)h(\(non-nop\))c(instruction.) -382 5149 y(*/)327 5262 y(try)j({)436 5375 y(il.delete\(first,)48 -b(last\);)p eop -%%Page: 29 29 -29 28 bop 327 407 a Ff(})54 b(catch\(TargetLost)o(Ex)o(ce)o(pt)o(io)o -(n)49 b(e\))k({)436 520 y(InstructionHandl)o(e[)o(])48 -b(targets)k(=)i(e.getTargets\(\))o(;)436 633 y(for\(int)e(i=0;)g(i)j(<) -f(targets.length)o(;)48 b(i++\))53 b({)545 746 y(InstructionTarge)o(te) -o(r[)o(])48 b(targeters)j(=)j(targets[i].getT)o(ar)o(ge)o(te)o(rs\()o -(\);)545 971 y(for\(int)e(j=0;)h(j)h(<)g(targeters.leng)o(th)o(;)49 -b(j++\))655 1084 y(targeters[j].u)o(pd)o(at)o(eT)o(arg)o(et)o(\(t)o(ar) -o(ge)o(ts[)o(i])o(,)f(next\);)436 1197 y(})327 1310 y(})218 -1423 y(})218 1649 y(Method)k(m)i(=)g(null;)218 1875 y(if\(count)d(>)j -(0\))g({)327 1988 y(System.out.prin)o(tln)o(\(")o(Re)o(mo)o(ve)o(d)49 -b(")54 b(+)g(count)e(+)i(")g(NOP)f(instructions)c(from)k(method)f(")i -(+)1364 2100 y(mg.getName\(\)\);)327 2213 y(m)g(=)109 -b(mg.getMethod\(\);)218 2326 y(})218 2552 y(il.dispose\(\);)49 -b(//)k(Reuse)g(instruction)c(handles)218 2665 y(return)j(m;)109 -2778 y(})0 2891 y(})p eop -%%Page: 30 30 -30 29 bop 828 5113 a @beginspecial 13 @llx 12 @lly 383 -@urx 830 @ury 2602 @rwi @setspecial -%%BeginDocument: eps/constantpool.eps -%!PS-Adobe-3.0 EPSF-3.0 -%%Title: Rose Diagram(s) -%%Creator: AdobePS5.dll Version 5.0 -%%CreationDate: 7/7/1999 17:45:21 -%%Pages: 1 -%%Orientation: Portrait -%%PageOrder: Ascend -%%DocumentNeededResources: (atend) -%%DocumentSuppliedResources: (atend) -%%DocumentData: Clean7Bit -%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 -%%LanguageLevel: 2 -%%BoundingBox: 13 12 383 830 -%%EndComments -%%BeginProcSet: epsffit 1 0 -gsave -1677.488 -356.303 translate -90 rotate -2.035 2.035 scale -%%EndProcSet - - -%%BeginDefaults -%%PageBoundingBox: 13 12 582 830 -%%EndDefaults - -%%BeginProlog -%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 -/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false -setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype -ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch -def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 -rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def -/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def -typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 -def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp -exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def -/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype -{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} -readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop -(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def -/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) -tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup -xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint -tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck -{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) -tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup -rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} -forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier -/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin -$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 -ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto -(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt -$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} -repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print -(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup -0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop -/setpacking where{pop oldpack setpacking}if}if -%%EndResource -userdict /Pscript_WinNT_Incr 230 dict dup begin put -%%BeginResource: file Pscript_FatalError 5.0 0 -/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div -cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def -%%EndResource -/VM?{vmstatus exch sub exch pop gt{[ -(This job requires more memory than is available in this printer.)100 500 -(Try one or more of the following, and then print again:)100 485 -(For the output format, choose Optimize For Portability.)115 470 -(In the Device Settings page, make sure the Available PostScript Memory is accurate.) -115 455(Reduce the number of fonts in the document.)115 440 -(Print the document in parts.)115 425 12/Times-Roman showpage -(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def -%%BeginResource: file Pscript_Win_Basic 5.0 0 -/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ -/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- -/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , -d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C -/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M -/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d -/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage -, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false -/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d -/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, -d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx -matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit -/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} -b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U -/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d -reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d -/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 -sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} -b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b -/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b -/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} -b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b -%%EndResource -%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 -/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge -{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ -snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F -setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d -/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b -%%EndResource -end -%%EndProlog - -%%BeginSetup -[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec -1 setlinecap 1 setlinejoin -/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def -%%EndSetup - -%%Page: 1 1 -%%PageBoundingBox: 13 12 582 830 -%%EndPageComments -%%BeginPageSetup -/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh -%%EndPageSetup - -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Win_GdiObject 5.0 0 -/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore -{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d -/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps -L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType -1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d -/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal -{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep -gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b -/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M -MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep -M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 -+}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d -/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix -GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 -/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal -makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 -/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d -/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] -d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 -0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne -{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd -aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx -PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save -8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 -Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx -matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` -xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill -{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot -concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap -YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 --0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix -currentmatrix readonly d ; ;}if}b -%%EndResource -%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 -/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} -{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 -d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d -20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d -/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ -/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict -~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} -? ;}b -%%EndResource -end reinitialize -: N 1409 506 185 84 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 1594 505 M 1408 505 I 1408 590 I 1594 590 I C -K -0 0 0 1 scol Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Text 5.0 0 -/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d -/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ -length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets -{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& -/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} -if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ -{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get -StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ -{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ -length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ -put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M -currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d -/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N -/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix -astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get -length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d -/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS -{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 -copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for -& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ -4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 -add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for -/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 -Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName -length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length -string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ -putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 -$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? -{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName -get undefinefont}forall undefinefont}b -%%EndResource -end reinitialize -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Encoding256 5.0 0 -/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction -/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign -/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma -/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S -/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave -/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright -/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis -/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef -/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet -/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef -/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section -/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered -/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph -/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter -/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis -/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute -/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls -/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute -/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve -/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex -/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put -%%EndResource -end reinitialize - -%%IncludeResource: font Helvetica -F /F0 0 /256 T /Helvetica mF -/F0S18 F0 [24.66 0 0 -24.66 0 0 ] mFS -F0S18 Ji -1433 537 M (ConstantCP)[18 14 14 13 7 14 14 7 18 0]xS -0.602 0 0.199 1 scol N 1594 551 M 1408 551 I 1408 590 I 1594 590 I C -K -N 1594 565 M 1408 565 I 1408 590 I 1594 590 I C -K -: N 1292 714 375 85 rp C -1 1 0.801 1 scol L ; N 1667 713 M 1291 713 I 1291 799 I 1667 799 I C -K -0 0 0 1 scol 1324 745 M (ConstantInterfaceMethodref)[18 14 14 13 7 14 14 7 6 14 7 14 8 7 14 13 14 21 14 7 14 14 14 8 14 0]xS -0.602 0 0.199 1 scol N 1667 759 M 1291 759 I 1291 799 I 1667 799 I C -K -N 1667 773 M 1291 773 I 1291 799 I 1667 799 I C -K -: N 1710 714 262 85 rp C -1 1 0.801 1 scol L ; N 1972 713 M 1709 713 I 1709 799 I 1972 799 I C -K -0 0 0 1 scol 1734 745 M (ConstantMethodref)[18 14 14 13 7 14 14 7 21 14 7 14 14 14 8 14 0]xS -0.602 0 0.199 1 scol N 1972 759 M 1709 759 I 1709 799 I 1972 799 I C -K -N 1972 773 M 1709 773 I 1709 799 I 1972 799 I C -K -: N 1011 714 235 85 rp C -1 1 0.801 1 scol L ; N 1246 713 M 1010 713 I 1010 799 I 1246 799 I C -K -0 0 0 1 scol 1036 745 M (ConstantFieldref)[18 14 14 13 7 14 14 7 15 6 14 6 14 8 14 0]xS -0.602 0 0.199 1 scol N 1246 759 M 1010 759 I 1010 799 I 1246 799 I C -K -N 1246 773 M 1010 773 I 1010 799 I 1246 799 I C -K -: N 1516 58 213 125 rp C -1 1 0.801 1 scol L ; N 1729 57 M 1515 57 I 1515 183 I 1729 183 I C -K -0 0 0 1 scol 1546 89 M (ConstantPool)[18 14 14 13 7 14 14 7 17 14 14 0]xS -0.602 0 0.199 1 scol N 1729 103 M 1515 103 I 1515 183 I 1729 183 I C -K -N 1729 116 M 1515 116 I 1515 183 I 1729 183 I C -K -0 0 0 1 scol 1555 158 M (getConstant\(\))[14 14 7 18 14 14 13 7 14 14 7 8 0]xS -: N 1550 265 144 84 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1694 264 M 1549 264 I 1549 349 I 1694 349 I C -K -0 0 0 1 scol 1571 296 M (Constant)[18 14 14 13 7 14 14 0]xS -0.602 0 0.199 1 scol N 1694 310 M 1549 310 I 1549 349 I 1694 349 I C -K -N 1694 323 M 1549 323 I 1549 349 I 1694 349 I C -K -N 1622 223 M 1622 184 I K -N 1652 175 14 29 rp C -1 1 1 1 scol L 0 0 0 1 scol 1652 198 M (1)S -0.602 0 0.199 1 scol N 1622 184 M 1632 203 I 1622 221 I 1612 203 I 1622 184 I C -: 1 1 1 1 scol O ; K -N 1622 223 M 1622 263 I K -N 1654 245 11 28 rp C -1 1 1 1 scol L 0 0 0 1 scol 1654 268 M (*)S -N 1652 175 14 29 rp C -1 1 1 1 scol L 0 0 0 1 scol 1652 198 M (1)S -N 1654 245 11 28 rp C -1 1 1 1 scol L 0 0 0 1 scol 1654 268 M (*)S -0.602 0 0.199 1 scol N 1494 655 M 1494 591 I K -N 1123 655 M 1828 655 I K -N 1494 591 M 1509 632 I 1479 632 I C -: 1 1 1 1 scol O ; K -N 1123 713 M 1123 655 I K -: N 1743 506 219 84 rp C -1 1 0.801 1 scol L ; N 1962 505 M 1742 505 I 1742 590 I 1962 590 I C -K -0 0 0 1 scol 1769 537 M (ConstantString)[18 14 14 13 7 14 14 7 17 7 8 6 14 0]xS -0.602 0 0.199 1 scol N 1962 551 M 1742 551 I 1742 590 I 1962 590 I C -K -N 1962 565 M 1742 565 I 1742 590 I 1962 590 I C -K -: N 822 506 219 84 rp C -1 1 0.801 1 scol L ; N 1041 505 M 821 505 I 821 590 I 1041 590 I C -K -0 0 0 1 scol 849 537 M (ConstantClass)[18 14 14 13 7 14 14 7 18 6 14 13 0]xS -0.602 0 0.199 1 scol N 1041 551 M 821 551 I 821 590 I 1041 590 I C -K -N 1041 565 M 821 565 I 821 590 I 1041 590 I C -K -: N 1236 254 224 84 rp C -1 1 0.801 1 scol L ; N 1460 253 M 1235 253 I 1235 338 I 1460 338 I C -K -0 0 0 1 scol 1259 285 M (ConstantInteger)[18 14 14 13 7 14 14 7 6 14 7 14 14 14 0]xS -0.602 0 0.199 1 scol N 1460 299 M 1235 299 I 1235 338 I 1460 338 I C -K -N 1460 312 M 1235 312 I 1235 338 I 1460 338 I C -K -: N 958 254 232 84 rp C -1 1 0.801 1 scol L ; N 1190 253 M 957 253 I 957 338 I 1190 338 I C -K -0 0 0 1 scol 984 285 M (ConstantDouble)[18 14 14 13 7 14 14 7 18 14 14 14 6 0]xS -0.602 0 0.199 1 scol N 1190 299 M 957 299 I 957 338 I 1190 338 I C -K -N 1190 312 M 957 312 I 957 338 I 1190 338 I C -K -: N 1102 506 207 84 rp C -1 1 0.801 1 scol L ; N 1309 505 M 1101 505 I 1101 590 I 1309 590 I C -K -0 0 0 1 scol 1127 537 M (ConstantFloat)[18 14 14 13 7 14 14 7 15 6 14 14 0]xS -0.602 0 0.199 1 scol N 1309 551 M 1101 551 I 1101 590 I 1309 590 I C -K -N 1309 565 M 1101 565 I 1101 590 I 1309 590 I C -K -: N 708 254 206 84 rp C -1 1 0.801 1 scol L ; N 914 253 M 707 253 I 707 338 I 914 338 I C -K -0 0 0 1 scol 732 285 M (ConstantLong)[18 14 14 13 7 14 14 7 14 14 14 0]xS -0.602 0 0.199 1 scol N 914 299 M 707 299 I 707 338 I 914 338 I C -K -N 914 312 M 707 312 I 707 338 I 914 338 I C -K -: N 2025 506 246 84 rp C -1 1 0.801 1 scol L ; N 2271 505 M 2024 505 I 2024 590 I 2271 590 I C -K -0 0 0 1 scol 2051 537 M (ConstantUnicode)[18 14 14 13 7 14 14 7 18 14 6 13 14 14 0]xS -0.602 0 0.199 1 scol N 2271 545 M 2024 545 I 2024 590 I 2271 590 I C -K -N 2271 558 M 2024 558 I 2024 590 I 2271 590 I C -K -: N 1790 254 322 84 rp C -1 1 0.801 1 scol L ; N 2112 253 M 1789 253 I 1789 338 I 2112 338 I C -K -0 0 0 1 scol 1817 285 M (ConstantNameAndType)[18 14 14 13 7 14 14 7 18 14 22 14 17 14 14 14 12 14 0]xS -0.602 0 0.199 1 scol N 2112 299 M 1789 299 I 1789 338 I 2112 338 I C -K -N 2112 312 M 1789 312 I 1789 338 I 2112 338 I C -K -: N 2172 254 194 84 rp C -1 1 0.801 1 scol L ; N 2366 253 M 2171 253 I 2171 338 I 2366 338 I C -K -0 0 0 1 scol 2195 285 M (ConstantUtf8)[18 14 14 13 7 14 14 7 18 7 7 0]xS -0.602 0 0.199 1 scol N 2366 293 M 2171 293 I 2171 338 I 2366 338 I C -K -N 2366 306 M 2171 306 I 2171 338 I 2366 338 I C -K -N 1626 428 M 1626 350 I K -N 809 428 M 2269 428 I K -N 1626 350 M 1641 391 I 1611 391 I C -: 1 1 1 1 scol O ; K -N 933 505 M 933 428 I K -N 1848 505 M 1848 428 I K -N 1068 339 M 1068 428 I K -N 2146 505 M 2146 428 I K -N 809 339 M 809 428 I K -N 2269 339 M 2269 428 I K -N 1500 505 M 1500 428 I K -N 1336 339 M 1336 428 I K -N 1201 505 M 1201 428 I K -N 1926 339 M 1926 428 I K -N 1468 713 M 1468 655 I K -N 1828 713 M 1828 655 I K -LH -%%PageTrailer - -%%Trailer -%%DocumentNeededResources: -%%+ font Helvetica -%%DocumentSuppliedResources: -Pscript_WinNT_Incr dup /terminate get exec -%%EOF -grestore - -%%EndDocument - @endspecial 824 5316 a Fq(Figur)n(e)26 b(8:)k(UML)25 -b(diagram)g(for)h(the)f(ConstantPool)i(API)p eop -%%Page: 31 31 -31 30 bop 749 5113 a @beginspecial 13 @llx 12 @lly 410 -@urx 830 @ury 2792 @rwi @setspecial -%%BeginDocument: eps/instructions.eps -%!PS-Adobe-3.0 EPSF-3.0 -%%Title: Rose Diagram(s) -%%Creator: AdobePS5.dll Version 5.0 -%%CreationDate: 7/7/1999 17:43:39 -%%Pages: 1 -%%Orientation: Portrait -%%PageOrder: Ascend -%%DocumentNeededResources: (atend) -%%DocumentSuppliedResources: (atend) -%%DocumentData: Clean7Bit -%%TargetDevice: (HP LaserJet 5Si) (2014.108) 1 -%%LanguageLevel: 2 -%%BoundingBox: 13 12 410 830 -%%EndComments -%%BeginProcSet: epsffit 1 0 -gsave -1409.418 -167.686 translate -90 rotate -1.711 1.711 scale -%%EndProcSet - - -%%BeginDefaults -%%PageBoundingBox: 13 12 582 830 -%%EndDefaults - -%%BeginProlog -%%BeginResource: file Pscript_WinNT_ErrorHandler 5.0 0 -/currentpacking where{pop/oldpack currentpacking def/setpacking where{pop false -setpacking}if}if/$brkpage 64 dict def $brkpage begin/prnt{dup type/stringtype -ne{=string cvs}if dup length 6 mul/tx exch def/ty 10 def currentpoint/toy exch -def/tox exch def 1 setgray newpath tox toy 2 sub moveto 0 ty rlineto tx 0 -rlineto 0 ty neg rlineto closepath fill tox toy moveto 0 setgray show}bind def -/nl{currentpoint exch pop lmargin exch moveto 0 -10 rmoveto}def/=={/cp 0 def -typeprint nl}def/typeprint{dup type exec}readonly def/lmargin 72 def/rmargin 72 -def/tprint{dup length cp add rmargin gt{nl/cp 0 def}if dup length cp add/cp -exch def prnt}readonly def/cvsprint{=string cvs tprint( )tprint}readonly def -/integertype{cvsprint}readonly def/realtype{cvsprint}readonly def/booleantype -{cvsprint}readonly def/operatortype{(--)tprint =string cvs tprint(-- )tprint} -readonly def/marktype{pop(-mark- )tprint}readonly def/dicttype{pop -(-dictionary- )tprint}readonly def/nulltype{pop(-null- )tprint}readonly def -/filetype{pop(-filestream- )tprint}readonly def/savetype{pop(-savelevel- ) -tprint}readonly def/fonttype{pop(-fontid- )tprint}readonly def/nametype{dup -xcheck not{(/)tprint}if cvsprint}readonly def/stringtype{dup rcheck{(\()tprint -tprint(\))tprint}{pop(-string- )tprint}ifelse}readonly def/arraytype{dup rcheck -{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint}forall(]) -tprint}ifelse}{pop(-array- )tprint}ifelse}readonly def/packedarraytype{dup -rcheck{dup xcheck{({)tprint{typeprint}forall(})tprint}{([)tprint{typeprint} -forall(])tprint}ifelse}{pop(-packedarray- )tprint}ifelse}readonly def/courier -/Courier findfont 10 scalefont def end errordict/handleerror{systemdict begin -$error begin $brkpage begin newerror{/newerror false store vmstatus pop pop 0 -ne{grestoreall}if showpage initgraphics courier setfont lmargin 720 moveto -(ERROR: )prnt errorname prnt nl(OFFENDING COMMAND: )prnt/command load prnt -$error/ostack known{nl nl(STACK:)prnt nl nl $error/ostack get aload length{==} -repeat}if systemdict/showpage get exec(%%[ Error: )print errorname =print -(; OffendingCommand: )print/command load =print( ]%%)= flush}if end end end}dup -0 systemdict put dup 4 $brkpage put bind readonly put/currentpacking where{pop -/setpacking where{pop oldpack setpacking}if}if -%%EndResource -userdict /Pscript_WinNT_Incr 230 dict dup begin put -%%BeginResource: file Pscript_FatalError 5.0 0 -/FatalErrorIf{{initgraphics findfont exch scalefont setfont counttomark 3 div -cvi{moveto show}repeat showpage quit}{cleartomark}ifelse}bind def -%%EndResource -/VM?{vmstatus exch sub exch pop gt{[ -(This job requires more memory than is available in this printer.)100 500 -(Try one or more of the following, and then print again:)100 485 -(For the output format, choose Optimize For Portability.)115 470 -(In the Device Settings page, make sure the Available PostScript Memory is accurate.) -115 455(Reduce the number of fonts in the document.)115 440 -(Print the document in parts.)115 425 12/Times-Roman showpage -(%%[ PrinterError: Low Printer VM ]%%)= true FatalErrorIf}if}bind def -%%BeginResource: file Pscript_Win_Basic 5.0 0 -/d/def load def/,/load load d/~/exch , d/?/ifelse , d/!/pop , d/`/begin , d/^ -/index , d/@/dup , d/+/translate , d/$/roll , d/U/userdict , d/M/moveto , d/- -/rlineto , d/&/currentdict , d/:/gsave , d/;/grestore , d/F/false , d/T/true , -d/N/newpath , d/E/end , d/Ac/arc , d/An/arcn , d/A/ashow , d/D/awidthshow , d/C -/closepath , d/V/div , d/O/eofill , d/L/fill , d/I/lineto , d/-c/curveto , d/-M -/rmoveto , d/+S/scale , d/Ji/setfont , d/Lc/setlinecap , d/Lj/setlinejoin , d -/Lw/setlinewidth , d/Lm/setmiterlimit , d/sd/setdash , d/S/show , d/LH/showpage -, d/K/stroke , d/W/widthshow , d/R/rotate , d/P/eoclip , d/L2? false -/languagelevel where{pop languagelevel 2 ge{pop true}if}if d L2?{/xS/xshow , d -/yS/yshow , d/zS/xyshow , d}if/b{bind d}bind d/bd{bind d}bind d/xd{~ d}bd/ld{, -d}bd/lw/Lw ld/lc/Lc ld/lj/Lj ld/sg/setgray ld/ADO_mxRot null d/self & d/OrgMx -matrix currentmatrix d/reinitialize{: OrgMx setmatrix[/TextInit/GraphInit -/UtilsInit counttomark{@ where{self eq}{F}?{cvx exec}{!}?}repeat cleartomark ;} -b/initialize{`{/ADO_mxRot ~ d/TextInitialised? F d reinitialize E}{U -/Pscript_Win_Data 230 dict @ ` put/ADO_mxRot ~ d/TextInitialised? F d -reinitialize}?}b/terminate{!{& self eq{exit}{E}?}loop E}b/suspend/terminate , d -/resume{` Pscript_Win_Data `}b/snap{transform 0.25 sub round 0.25 add ~ 0.25 -sub round 0.25 add ~ itransform}b/dsnap{dtransform round ~ round ~ idtransform} -b<04>cvn{}d/rr{1 ^ 0 - 0 ~ - neg 0 - C}b/rp{4 2 $ M 1 ^ 0 - 0 ~ - neg 0 -}b -/solid{[]0 sd}b/g{@ not{U/DefIf_save save put}if U/DefIf_bool 2 ^ put}b -/DefIf_El{if U/DefIf_bool get not @{U/DefIf_save get restore}if}b/e{DefIf_El !} -b/UDF{L2?{undefinefont}{!}?}b/UDR{L2?{undefineresource}{! !}?}b -%%EndResource -%%BeginResource: file Pscript_Win_Utils_L2 5.0 0 -/rf/rectfill , d/fx{1 1 dtransform @ 0 ge{1 sub 0.5}{1 add -0.5}? 3 -1 $ @ 0 ge -{1 sub 0.5}{1 add -0.5}? 3 1 $ 4 1 $ idtransform 4 -2 $ idtransform}b/BZ{4 -2 $ -snap + +S fx rf}b/rs/rectstroke , d/rc/rectclip , d/UtilsInit{currentglobal{F -setglobal}if}b/scol{! setcolor}b/colspA/DeviceGray d/colspABC/DeviceRGB d -/colspRefresh{colspABC setcolorspace}b/SetColSpace{colspABC setcolorspace}b -%%EndResource -end -%%EndProlog - -%%BeginSetup -[ 1 0 0 1 0 0 ] false Pscript_WinNT_Incr dup /initialize get exec -1 setlinecap 1 setlinejoin -/mysetup [ 0.24 0 0 -0.24 13.43905 829.74047 ] def -%%EndSetup - -%%Page: 1 1 -%%PageBoundingBox: 13 12 582 830 -%%EndPageComments -%%BeginPageSetup -/DeviceRGB dup setcolorspace /colspABC exch def mysetup concat colspRefresh -%%EndPageSetup - -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Win_GdiObject 5.0 0 -/SavedCTM null d/CTMsave{/SavedCTM SavedCTM currentmatrix d}b/CTMrestore -{SavedCTM setmatrix}b/mp null d/ADO_mxRot null d/GDIHMatrix null d -/GDIHPatternDict 22 dict d GDIHPatternDict `/PatternType 1 d/PaintType 2 d/Reps -L2?{1}{5}? d/XStep 8 Reps mul d/YStep XStep d/BBox[0 0 XStep YStep]d/TilingType -1 d/PaintProc{` 1 Lw[]0 sd PaintData , exec E}b/FGnd null d/BGnd null d -/HS_Horizontal{horiz}b/HS_Vertical{vert}b/HS_FDiagonal{fdiag}b/HS_BDiagonal -{biag}b/HS_Cross{horiz vert}b/HS_DiagCross{fdiag biag}b/MaxXYStep XStep YStep -gt{XStep}{YStep}? d/horiz{Reps{0 4 M XStep 0 - 0 8 +}repeat 0 -8 Reps mul + K}b -/vert{Reps{4 0 M 0 YStep - 8 0 +}repeat 0 -8 Reps mul + K}b/biag{Reps{0 0 M -MaxXYStep @ - 0 YStep neg M MaxXYStep @ - 0 8 +}repeat 0 -8 Reps mul + 0 YStep -M 8 8 - K}b/fdiag{Reps{0 0 M MaxXYStep @ neg - 0 YStep M MaxXYStep @ neg - 0 8 -+}repeat 0 -8 Reps mul + MaxXYStep @ M 8 -8 - K}b E/makehatch{4 -2 $/yOrg ~ d -/xOrg ~ d GDIHPatternDict/PaintData 3 -1 $ put CTMsave GDIHMatrix setmatrix -GDIHPatternDict matrix xOrg yOrg + mp CTMrestore ~ U ~ 2 ^ put}b/h0{/h0 -/HS_Horizontal makehatch}b/h1{/h1/HS_Vertical makehatch}b/h2{/h2/HS_FDiagonal -makehatch}b/h3{/h3/HS_BDiagonal makehatch}b/h4{/h4/HS_Cross makehatch}b/h5{/h5 -/HS_DiagCross makehatch}b/GDIBWPatternDict 25 dict @ `/PatternType 1 d -/PaintType L2?{1}{2}? d/RepsV L2?{1}{6}? d/RepsH L2?{1}{5}? d/BBox[0 0 RepsH 1] -d/TilingType 1 d/XStep 1 d/YStep 1 d/Height 8 RepsV mul d/Width 8 d/mx[Width 0 -0 Height neg 0 Height]d/FGnd null d/BGnd null d/SetBGndFGnd L2?{{FGnd null ne -{FGnd aload ! scol BBox aload ! 2 ^ sub ~ 3 ^ sub ~ rf}if BGnd null ne{BGnd -aload ! scol}if}}{{}}? b/PaintProc{` SetBGndFGnd RepsH{Width Height F mx -PaintData imagemask Width 0 +}repeat E}b E d/GDIBWPatternMx null d/pfprep{save -8 1 $/PatternOfTheDay 8 1 $ GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/yExt ~ d/Width ~ d/FGnd ~ d/BGnd ~ d/Height yExt RepsV mul d/mx[Width 0 0 -Height 0 0]d E : GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx -matrix currentmatrix d ; CTMsave GDIBWPatternMx setmatrix GDIBWPatternDict @ ` -xOrg yOrg E matrix + mp CTMrestore ~ !}b/pfbf{/fEOFill ~ d pfprep hbf fEOFill -{O}{L}? restore}b/GraphInit{GDIHMatrix null eq{/SavedCTM matrix d : ADO_mxRot -concat 0 0 snap + : 0.48 @ GDIHPatternDict ` YStep mul ~ XStep mul ~ dsnap -YStep V ~ XStep V ~ E +S/GDIHMatrix matrix currentmatrix readonly d ; : 0.24 --0.24 +S GDIBWPatternDict ` Width Height E dsnap +S/GDIBWPatternMx matrix -currentmatrix readonly d ; ;}if}b -%%EndResource -%%BeginResource: file Pscript_Win_GdiObject_L2 5.0 0 -/mp/makepattern , d/hbf{setpattern}b/hf{:/fEOFill ~ d ~ ! setpattern fEOFill{O} -{L}? ;}b/pbf{: !/fEOFill ~ d GDIBWPatternDict `/yOrg ~ d/xOrg ~ d/PaintData ~ d -/OutputBPP ~ d/Height ~ d/Width ~ d/PaintType 1 d/PatternType 1 d/TilingType 1 -d/BBox[0 0 Width Height]d/XStep Width d/YStep Height d/mx xOrg yOrg matrix + d -20 dict @ `/ImageType 1 d/Width Width d/Height Height d/ImageMatrix mx d -/BitsPerComponent 8 d OutputBPP 24 eq{/Decode[0 1 0 1 0 1]d}{OutputBPP 8 eq{ -/Decode[0 1]d}{/Decode[0 1 0 1 0 1 0 1]d}?}?/DataSource{PaintData}d E/ImageDict -~ d/PaintProc{` ImageDict image E}b & mx makepattern setpattern E fEOFill{O}{L} -? ;}b -%%EndResource -end reinitialize -: N 1432 65 209 154 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol 1 Lw N 1641 64 M 1431 64 I 1431 219 I 1641 219 I C -K -0 0 0 1 scol Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Text 5.0 0 -/TextInit{TextInitialised? not{/Pscript_Windows_Font & d/TextInitialised? T d -/fM[1 0 0 1 0 0]d/mFM matrix d/iMat[1 0 0.212557 1 0 0]d}if}b/copyfont{1 ^ -length add dict `{1 ^/FID ne{d}{! !}?}forall & E}b/EncodeDict 11 dict d/bullets -{{/bullet}repeat}b/rF{3 copyfont @ ` ~ EncodeDict ~ get/Encoding ~ 3 ^/0 eq{& -/CharStrings known{CharStrings/Eth known not{! EncodeDict/ANSIEncodingOld get} -if}if}if d E}b/mF{@ 7 1 $ findfont ~{@/Encoding get @ StandardEncoding eq{! T}{ -{ISOLatin1Encoding}stopped{! F}{eq}?{T}{@ ` T 32 1 127{Encoding 1 ^ get -StandardEncoding 3 -1 $ get eq and}for E}?}?}{F}?{1 ^ ~ rF}{0 copyfont}? 6 -2 $ -{T pd_AddEm87 ~ !}{! ~ !/pd_charset @ where{~ get 128 eq{@ FDV 2 copy get @ -length array copy put pd_CoverFCRange}if}{!}?}? 2 ^ ~ definefont fM 5 4 -1 $ -put fM 4 0 put fM makefont Pscript_Windows_Font 3 1 $ put}b/sLT{: Lw -M -currentpoint snap M 0 - 0 Lc K ;}b/xUP null d/yUP null d/uW null d/xSP null d -/ySP null d/sW null d/sSU{N/uW ~ d/yUP ~ d/xUP ~ d}b/sU{xUP yUP uW sLT}b/sST{N -/sW ~ d/ySP ~ d/xSP ~ d}b/sT{xSP ySP sW sLT}b/sR{: + R 0 0 M}b/sRxy{: matrix -astore concat 0 0 M}b/eR/; , d/AddOrigFP{{&/FontInfo known{&/FontInfo get -length 6 add}{6}? dict `/WinPitchAndFamily ~ d/WinCharSet ~ d/OrigFontType ~ d -/OrigFontStyle ~ d/OrigFontName ~ d & E/FontInfo ~ d}{! ! ! ! !}?}b/mFS -{makefont Pscript_Windows_Font 3 1 $ put}b/mF42D{0 copyfont `/FontName ~ d 2 -copy ~ sub 1 add dict `/.notdef 0 d 2 copy 1 ~{@ 3 ^ sub Encoding ~ get ~ d}for -& E/CharStrings ~ d ! ! & @ E/FontName get ~ definefont}bind d/mF42{15 dict ` @ -4 1 $/FontName ~ d/FontType 0 d/FMapType 2 d/FontMatrix[1 0 0 1 0 0]d 1 ^ 254 -add 255 idiv @ array/Encoding ~ d 0 1 3 -1 $ 1 sub{@ Encoding 3 1 $ put}for -/FDepVector Encoding length array d/CharStrings 2 dict `/.notdef 0 d & E d 0 1 -Encoding length 1 sub{@ @ 10 lt{! FontName length 1 add string}{100 lt{FontName -length 2 add string}{FontName length 3 add string}?}? @ 0 FontName @ length -string cvs putinterval @ 3 -1 $ @ 4 1 $ 3 string cvs FontName length ~ -putinterval cvn 1 ^ 256 mul @ 255 add 3 -1 $ 4 ^ findfont mF42D FDepVector 3 1 -$ put}for & @ E/FontName get ~ definefont ! ! ! mF}b/UmF{L2? -{Pscript_Windows_Font ~ undef}{!}?}b/UmF42{@ findfont/FDepVector get{/FontName -get undefinefont}forall undefinefont}b -%%EndResource -end reinitialize -Pscript_WinNT_Incr begin -%%BeginResource: file Pscript_Encoding256 5.0 0 -/CharCol256Encoding[/.notdef/breve/caron/dotaccent/dotlessi/fi/fl/fraction -/hungarumlaut/Lslash/lslash/minus/ogonek/ring/Zcaron/zcaron/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/exclam/quotedbl/numbersign -/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma -/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon -/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S -/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave -/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright -/asciitilde/.notdef/.notdef/.notdef/quotesinglbase/florin/quotedblbase/ellipsis -/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/.notdef -/.notdef/.notdef/.notdef/quoteleft/quoteright/quotedblleft/quotedblright/bullet -/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/.notdef/.notdef -/Ydieresis/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar/section -/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/.notdef/registered -/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph -/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter -/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis -/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute -/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls -/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute -/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve -/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex -/udieresis/yacute/thorn/ydieresis]def EncodeDict/256 CharCol256Encoding put -%%EndResource -end reinitialize - -%%IncludeResource: font Helvetica -F /F0 0 /256 T /Helvetica mF -/F0S21 F0 [33.09 0 0 -33.09 0 0 ] mFS -F0S21 Ji -1461 104 M (Instruction)[9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 1641 117 M 1431 117 I 1431 219 I 1641 219 I C -K -N 1641 212 M 1431 212 I 1431 219 I 1641 219 I C -K -0 0 0 1 scol 1478 153 M (tag)[9 17 0]xS -1478 191 M (length)[7 17 18 18 9 0]xS -: N 575 326 321 98 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 896 325 M 574 325 I 574 424 I 896 424 I C -K -0 0 0 1 scol 609 365 M (BranchInstruction)[22 11 17 18 17 18 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 896 378 M 574 378 I 574 424 I 896 424 I C -K -N 896 396 M 574 396 I 574 424 I 896 424 I C -K -: N 822 556 164 154 rp C -1 1 0.801 1 scol L ; N 986 555 M 821 555 I 821 710 I 986 710 I C -K -0 0 0 1 scol 859 595 M (Select)[22 17 7 17 17 0]xS -0.602 0 0.199 1 scol N 986 608 M 821 608 I 821 710 I 986 710 I C -K -N 986 702 M 821 702 I 821 710 I 986 710 I C -K -0 0 0 1 scol 868 644 M (targets)[9 17 11 18 17 9 0]xS -868 682 M (keys)[16 17 15 0]xS -: N 584 815 303 100 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 887 814 M 583 814 I 583 915 I 887 915 I C -K -0 0 0 1 scol 599 855 M (LOOKUPSWITCH)[18 26 26 22 24 22 22 34 9 21 24 0]xS -0.602 0 0.199 1 scol N 887 868 M 583 868 I 583 915 I 887 915 I C -K -N 887 886 M 583 886 I 583 915 I 887 915 I C -K -: N 964 815 267 100 rp C -1 1 0.801 1 scol L ; N 1231 814 M 963 814 I 963 915 I 1231 915 I C -K -0 0 0 1 scol 978 855 M (TABLESWITCH)[21 22 22 18 22 22 34 9 21 24 0]xS -0.602 0 0.199 1 scol N 1231 868 M 963 868 I 963 915 I 1231 915 I C -K -N 1231 886 M 963 886 I 963 915 I 1231 915 I C -K -: N 567 557 208 100 rp C -1 1 0.801 1 scol L ; N 775 556 M 566 556 I 566 657 I 775 657 I C -K -0 0 0 1 scol 587 597 M (IfInstruction)[9 10 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 775 609 M 566 609 I 566 657 I 775 657 I C -K -N 775 628 M 566 628 I 566 657 I 775 657 I C -K -: N 393 557 143 100 rp C -1 1 0.801 1 scol L ; N 536 556 M 392 556 I 392 657 I 536 657 I C -K -0 0 0 1 scol 415 597 M (GOTO)[26 26 21 0]xS -0.602 0 0.199 1 scol N 536 609 M 392 609 I 392 657 I 536 657 I C -K -N 536 628 M 392 628 I 392 657 I 536 657 I C -K -N 730 499 M 730 425 I K -N 469 499 M 910 499 I K -N 730 425 M 748 473 I 712 473 I C -: 1 1 1 1 scol O ; K -N 469 556 M 469 499 I K -: N 1843 118 290 100 rp C -1 1 0.801 1 scol L ; N 2133 117 M 1842 117 I 1842 218 I 2133 218 I C -K -0 0 0 1 scol 1865 158 M (ReturnInstruction)[24 17 9 18 11 18 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 2133 168 M 1842 168 I 1842 218 I 2133 218 I C -K -N 2133 186 M 1842 186 I 1842 218 I 2133 218 I C -K -: N 1004 325 264 99 rp C -1 1 0.801 1 scol L ; N 1268 324 M 1003 324 I 1003 424 I 1268 424 I C -K -0 0 0 1 scol 1023 364 M (ArrayInstruction)[22 11 11 17 15 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 1268 377 M 1003 377 I 1003 424 I 1268 424 I C -K -N 1268 396 M 1003 396 I 1003 424 I 1268 424 I C -K -: N 1704 332 232 188 rp C -1 1 0.801 1 scol L ; N 1936 331 M 1703 331 I 1703 520 I 1936 520 I C -K -0 0 0 1 scol 1722 372 M (CPInstruction)[24 22 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 1936 382 M 1703 382 I 1703 520 I 1936 520 I C -K -N 1936 438 M 1703 438 I 1703 520 I 1936 520 I C -K -0 0 0 1 scol 1751 418 M (index)[7 18 18 17 0]xS -1751 494 M (getType\(\))[18 17 9 21 15 18 17 11 0]xS -: N 1038 118 274 100 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1312 117 M 1037 117 I 1037 218 I 1312 218 I C -K -0 0 0 1 scol 1059 158 M (StackInstruction)[22 9 17 17 16 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 1312 170 M 1037 170 I 1037 218 I 1312 218 I C -K -N 1312 189 M 1037 189 I 1037 218 I 1312 218 I C -K -: N 1312 325 345 99 rp C -1 1 0.801 1 scol L ; N 1657 324 M 1311 324 I 1311 424 I 1657 424 I C -K -0 0 0 1 scol 1329 364 M (ConversionInstruction)[24 17 18 15 17 11 17 7 17 18 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 1657 377 M 1311 377 I 1311 424 I 1657 424 I C -K -N 1657 396 M 1311 396 I 1311 424 I 1657 424 I C -K -N 675 556 M 675 499 I K -: N 619 118 337 100 rp C -1 1 0.801 1 scol L ; N 956 117 M 618 117 I 618 218 I 956 218 I C -K -0 0 0 1 scol 641 158 M (ArithmeticInstruction)[22 11 7 9 18 27 17 9 7 17 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 956 170 M 618 170 I 618 218 I 956 218 I C -K -N 956 189 M 618 189 I 618 218 I 956 218 I C -K -: N 1974 326 390 148 rp C -1 1 0.801 1 scol L ; N 2364 325 M 1973 325 I 1973 474 I 2364 474 I C -K -0 0 0 1 scol 1998 366 M (LocalVariableInstruction)[18 17 17 17 7 22 17 11 7 17 18 7 17 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 2364 376 M 1973 376 I 1973 474 I 2364 474 I C -K -N 2364 433 M 1973 433 I 1973 474 I 2364 474 I C -K -0 0 0 1 scol 2020 412 M (index)[7 18 18 17 0]xS -: N 1392 869 263 148 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 1655 868 M 1391 868 I 1391 1017 I 1655 1017 I C -K -0 0 0 1 scol 1414 908 M (FieldInstruction)[20 7 17 7 18 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 1655 921 M 1391 921 I 1391 1017 I 1655 1017 I C -K -N 1655 940 M 1391 940 I 1391 1017 I 1655 1017 I C -K -0 0 0 1 scol 1439 995 M (getFieldType\(\))[18 17 9 20 7 17 7 18 21 15 18 17 11 0]xS -: N 1735 869 351 148 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2086 868 M 1734 868 I 1734 1017 I 2086 1017 I C -K -0 0 0 1 scol 1790 908 M (InvokeInstruction)[9 18 15 17 16 17 9 18 17 9 11 18 17 9 7 17 0]xS -0.602 0 0.199 1 scol N 2086 919 M 1734 919 I 1734 1017 I 2086 1017 I C -K -N 2086 937 M 1734 937 I 1734 1017 I 2086 1017 I C -K -0 0 0 1 scol 1781 992 M (getArgumentTypes\(\))[18 17 9 22 11 18 18 27 17 18 9 21 15 18 17 17 11 0]xS -0.602 0 0.199 1 scol N 1539 293 M 1539 220 I K -N 703 293 M 2171 293 I K -N 1539 220 M 1557 269 I 1522 269 I C -: 1 1 1 1 scol O ; K -N 2171 325 M 2171 293 I K -N 1826 331 M 1826 293 I K -N 898 784 M 898 711 I K -N 737 784 M 1069 784 I K -N 898 711 M 916 760 I 880 760 I C -: 1 1 1 1 scol O ; K -N 737 814 M 737 784 I K -N 1116 324 M 1116 293 I K -N 792 219 M 792 293 I K -N 1487 324 M 1487 293 I K -N 1984 219 M 1984 293 I K -N 1166 219 M 1166 293 I K -: N 1554 623 248 148 rp C -1 1 0.801 1 scol L ; N 1802 622 M 1553 622 I 1553 771 I 1802 771 I C -K -0 0 0 1 scol 1572 663 M (FieldOrMethod)[20 7 17 7 18 26 11 27 17 9 18 17 0]xS -0.602 0 0.199 1 scol N 1802 676 M 1553 676 I 1553 771 I 1802 771 I C -K -N 1802 694 M 1553 694 I 1553 771 I 1802 771 I C -K -0 0 0 1 scol 1601 749 M (getName\(\))[18 17 9 24 17 27 17 11 0]xS -: N 2179 635 186 99 rp C -1 1 0.801 1 scol L ; 0.602 0 0.199 1 scol N 2365 634 M 2178 634 I 2178 734 I 2365 734 I C -K -0 0 0 1 scol 2232 674 M (NEW)[24 22 0]xS -0.602 0 0.199 1 scol N 2365 684 M 2178 684 I 2178 734 I 2365 734 I C -K -N 2365 703 M 2178 703 I 2178 734 I 2365 734 I C -K -N 703 325 M 703 293 I K -N 1820 594 M 1820 521 I K -N 1657 594 M 2249 594 I K -N 1820 521 M 1838 570 I 1802 570 I C -: 1 1 1 1 scol O ; K -: N 1889 635 250 99 rp C -1 1 0.801 1 scol L ; N 2139 634 M 1888 634 I 1888 734 I 2139 734 I C -K -0 0 0 1 scol 1907 674 M (INSTANCEOF)[9 24 22 21 22 24 24 22 26 0]xS -0.602 0 0.199 1 scol N 2139 684 M 1888 684 I 1888 734 I 2139 734 I C -K -N 2139 703 M 1888 703 I 1888 734 I 2139 734 I C -K -N 2014 634 M 2014 594 I K -N 2249 634 M 2249 594 I K -N 1657 622 M 1657 594 I K -N 1069 814 M 1069 784 I K -N 1677 845 M 1677 772 I K -N 1511 845 M 1907 845 I K -N 1677 772 M 1695 821 I 1660 821 I C -: 1 1 1 1 scol O ; K -N 1907 868 M 1907 845 I K -N 1511 868 M 1511 845 I K -N 910 555 M 910 499 I K -LH -%%PageTrailer - -%%Trailer -%%DocumentNeededResources: -%%+ font Helvetica -%%DocumentSuppliedResources: -Pscript_WinNT_Incr dup /terminate get exec -%%EOF -grestore - -%%EndDocument - @endspecial 880 5316 a Fq(Figur)n(e)26 b(9:)31 b(UML)25 -b(diagram)g(for)g(the)h(Instr)o(uction)g(API)p eop -%%Trailer -end -userdict /end-hook known{end-hook}if -%%EOF diff --git a/docs/manual.tex b/docs/manual.tex deleted file mode 100644 index a79ce572..00000000 --- a/docs/manual.tex +++ /dev/null @@ -1,1079 +0,0 @@ -\documentclass[12pt,twoside]{article} - -\usepackage{epsf,a4wide,moreverb,url} -\usepackage{palatino} - -\newcommand\jc{{\sffamily BCEL }} -\newcommand\cp{{constant pool }} -\newcommand\cpe{constant pool} -\newcommand\jvm{{Java Virtual Machine }} -\newcommand\jvme{{Java Virtual Machine}} -\newcommand\vm{{Virtual Machine }} -\newcommand\href[2]{#2} - -\begin{document} - -\title{Byte Code Engineering Library (BCEL)\\ - Description and usage manual\\ - {\small \textbf{Version 1.0}}} - -\author{{\Large Markus Dahm}\\\\ - \href{mailto:markus.dahm@inf.fu-berlin.de}{\texttt{markus.dahm@berlin.de}}} - -\maketitle - -%\tableofcontents - -\begin{abstract} -Extensions and improvements of the programming language Java and its -related execution environment (Java Virtual Machine, JVM) are the -subject of a large number of research projects and proposals. There -are projects, for instance, to add parameterized types to Java, to -implement ``Aspect-Oriented Programming'', to perform sophisticated -static analysis, and to improve the run-time performance. - -Since Java classes are compiled into portable binary class files -(called \emph{byte code}), it is the most convenient and -platform-independent way to implement these improvements not by -writing a new compiler or changing the JVM, but by transforming the -byte code. These transformations can either be performed after -compile-time, or at load-time. Many programmers are doing this by -implementing their own specialized byte code manipulation tools, which -are, however, restricted in the range of their re-usability. - -To deal with the necessary class file transformations, we introduce an -API that helps developers to conveniently implement their -transformations. -\end{abstract} - -\section{Introduction}\label{sec:intro} - -The Java language \cite{gosling} has become very popular and many -research projects deal with further improvements of the language or -its run-time behavior. The possibility to extend a language with new -concepts is surely a desirable feature, but implementation issues -should be hidden from the user. Fortunately, the concepts of the \jvm -permit the user-transparent implementation of such extensions with -relatively little effort. - -Because the target language of Java is an interpreted language with a -small and easy-to-understand set of instructions (the \emph{byte -code}), developers can implement and test their concepts in a very -elegant way. One can write a plug-in replacement for the system's -class loader which is responsible for dynamically loading class files -at run-time and passing the byte code to the \vm (see section -\ref{sec:classloaders}). Class loaders may thus be used to intercept -the loading process and transform classes before they get actually -executed by the JVM \cite{classloader}. While the original class -files always remain unaltered, the behavior of the class loader may be -reconfigured for every execution or instrumented dynamically. - -The \jc API (Byte Code Engineering Library), formerly known as -JavaClass, is a toolkit for the static analysis and dynamic creation -or transformation of Java class files. It enables developers to -implement the desired features on a high level of abstraction without -handling all the internal details of the Java class file format and -thus re-inventing the wheel every time. \jc is written entirely in -Java and freely available under the terms of the Apache Software -License. \footnote{The distribution is available at - \url{http://jakarta.apache.org/bcel/}, including several code - examples and javadoc manuals. } - -This paper is structured as follows: We give a brief description of -the \jvm and the class file format in section \ref{sec:jvm}. Section -\ref{sec:api} introduces the \jc API. Section \ref{sec:application} -describes some typical application areas and example projects. The -appendix contains code examples that are to long to be presented in -the main part of this paper. All examples are included in the -down-loadable distribution. - -\subsection{Related work} - -There are a number of proposals and class libraries that have some -similarities with \textsc{BCEL}: The JOIE \cite{joie} toolkit can -be used to instrument class loaders with dynamic behavior. Similarly, -``Binary Component Adaptation'' \cite{bca} allows components to be -adapted and evolved on-the-fly. Han Lee's ``Byte-code Instrumenting -Tool'' \cite{bit} allows the user to insert calls to analysis methods -anywhere in the byte code. The Jasmin language \cite{jasmin} can be -used to hand-write or generate pseudo-assembler code. D-Java -\cite{classfile} and JCF \cite{inside} are class viewing tools. - -In contrast to these projects, \jc is intended to be a general purpose -tool for ``byte code engineering''. It gives full control to the -developer on a high level of abstraction and is not restricted to any -particular application area. - -\section{The Java Virtual Machine}\label{sec:jvm} - -Readers already familiar with the \jvm and the Java class file format -may want to skip this section and proceed with section \ref{sec:api}. - -Programs written in the Java language are compiled into a portable -binary format called \emph{byte code}. Every class is represented by -a single class file containing class related data and byte code -instructions. These files are loaded dynamically into an interpreter -(\jvme, JVM) and executed. - -Figure \ref{fig:jvm} illustrates the procedure of compiling and -executing a Java class: The source file (\texttt{HelloWorld.java}) is -compiled into a Java class file (\texttt{HelloWorld.class}), loaded by -the byte code interpreter and executed. In order to implement -additional features, researchers may want to transform class files -(drawn with bold lines) before they get actually executed. This -application area is one of the main issues of this article. - -\begin{figure}[htbp] - \begin{center} - \leavevmode - \epsfxsize\textwidth - \epsfbox{eps/jvm.eps} - \caption{Compilation and execution of Java classes} - \label{fig:jvm} - \end{center} -\end{figure} - -Note that the use of the general term ``Java'' implies two meanings: -on the one hand, Java as a programming language is meant, on the other -hand, the Java Virtual Machine, which is not necessarily targeted by -the Java language exclusively, but may be used by other languages as -well (e.g. Eiffel \cite{eiffel}, or Ada \cite{ada}). We assume the -reader to be familiar with the Java language and to have a general -understanding of the Virtual Machine. - -\subsection{Java class file format}\label{sec:format} - -Giving a full overview of the design issues of the Java class file -format and the associated byte code instructions is beyond the scope -of this paper. We will just give a brief introduction covering the -details that are necessary for understanding the rest of this -paper. The format of class files and the byte code instruction set are -described in more detail in the ``\jvm Specification'' \cite{jvm} -\footnote{Also available online at -\url{http://www.javasoft.com/docs/books/vmspec/index.html}}, and in -\cite{jasmin}. Especially, we will not deal with the security -constraints that the \jvm has to check at run-time, i.e. the byte code -verifier. - -Figure \ref{fig:classfile} shows a simplified example of the contents -of a Java class file: It starts with a header containing a ``magic -number'' (\texttt{0xCAFEBABE}) and the version number, followed by the -\emph{\cpe}, which can be roughly thought of as the text segment of an -executable, the \emph{access rights} of the class encoded by a bit -mask, a list of interfaces implemented by the class, lists containing -the fields and methods of the class, and finally the \emph{class -attributes}, e.g. the \texttt{SourceFile} attribute telling the name -of the source file. Attributes are a way of putting additional, -e.g. user-defined, information into class file data structures. For -example, a custom class loader may evaluate such attribute data in -order to perform its transformations. The JVM specification declares -that unknown, i.e. user-defined attributes must be ignored by any \vm -implementation. - -\begin{figure}[htbp] - \begin{center} - \leavevmode - \epsfxsize\textwidth - \epsfbox{eps/classfile.eps} - \caption{Java class file format} - \label{fig:classfile} - \end{center} -\end{figure} - -Because all of the information needed to dynamically resolve the -symbolic references to classes, fields and methods at run-time is -coded with string constants, the \cp contains in fact the largest -portion of an average class file, approximately 60\% \cite{statistic}. -The byte code instructions themselves just make up 12\%. - -The right upper box shows a ``zoomed'' excerpt of the \cpe, while the -rounded box below depicts some instructions that are contained within -a method of the example class. These instructions represent the -straightforward translation of the well-known statement: - -\begin{verbatim} - System.out.println("Hello, world"); -\end{verbatim} - -The first instruction loads the contents of the field \texttt{out} of -class \texttt{java.lang.System} onto the operand stack. This is an -instance of the class \texttt{java.io.PrintStream}. The \texttt{ldc} -(``Load constant'') pushes a reference to the string "Hello world" on -the stack. The next instruction invokes the instance method -\texttt{println} which takes both values as parameters (Instance -methods always implicitly take an instance reference as their first -argument). - -Instructions, other data structures within the class file and -constants themselves may refer to constants in the \cpe. Such -references are implemented via fixed indexes encoded directly into the -instructions. This is illustrated for some items of the figure -emphasized with a surrounding box. - -For example, the \texttt{invokevirtual} instruction refers to a -\texttt{MethodRef} constant that contains information about the name -of the called method, the signature (i.e. the encoded argument and -return types), and to which class the method belongs. In fact, as -emphasized by the boxed value, the \texttt{MethodRef} constant itself -just refers to other entries holding the real data, e.g. it refers to -a \texttt{ConstantClass} entry containing a symbolic reference to the -class \texttt{java.io.PrintStream}. To keep the class file compact, -such constants are typically shared by different instructions. -Similarly, a field is represented by a \texttt{Fieldref} constant that -includes information about the name, the type and the containing class -of the field. - -The \cp basically holds the following types of constants: References -to methods, fields and classes, strings, integers, floats, longs, and -doubles. - -\subsection{Byte code instruction set}\label{sec:code} - -The JVM is a stack-oriented interpreter that creates a local stack -frame of fixed size for every method invocation. The size of the local -stack has to be computed by the compiler. Values may also be stored -intermediately in a frame area containing \emph{local variables} which -can be used like a set of registers. These local variables are -numbered from 0 to 65535, i.e. you have a maximum of 65536 of local -variables. The stack frames of caller and callee method are -overlapping, i.e. the caller pushes arguments onto the operand stack -and the called method receives them in local variables. - -The byte code instruction set currently consists of 212 instructions, -44 opcodes are marked as reserved and may be used for future -extensions or intermediate optimizations within the Virtual -Machine. The instruction set can be roughly grouped as follows: - -\begin{description} -\item[Stack operations:] Constants can be pushed onto the stack either -by loading them from the \cp with the \texttt{ldc} instruction or with -special ``short-cut'' instructions where the operand is encoded into -the instructions, e.g. \texttt{iconst\_0} or \texttt{bipush} (push -byte value). - -\item[Arithmetic operations:] The instruction set of the \jvm -distinguishes its operand types using different instructions to -operate on values of specific type. Arithmetic operations starting -with \texttt{i}, for example, denote an integer operation. E.g., -\texttt{iadd} that adds two integers and pushes the result back on the -stack. The Java types \texttt{boolean}, \texttt{byte}, -\texttt{short}, and \texttt{char} are handled as integers by the JVM. - -\item[Control flow:] There are branch instructions like \texttt{goto} -and \texttt{if\_icmpeq}, which compares two integers for -equality. There is also a \texttt{jsr} (jump sub-routine) and -\texttt{ret} pair of instructions that is used to implement the -\texttt{finally} clause of \texttt{try-catch} blocks. Exceptions may -be thrown with the \texttt{athrow} instruction. - -Branch targets are coded as offsets from the current byte code -position, i.e. with an integer number. - -\item[Load and store operations] for local variables like -\texttt{iload} and \texttt{istore}. There are also array operations -like \texttt{iastore} which stores an integer value into an array. - -\item[Field access:] The value of an instance field may be retrieved -with \texttt{getfield} and written with \texttt{putfield}. For static -fields, there are \texttt{getstatic} and \texttt{putstatic} -counterparts. - -\item[Method invocation:] Methods may either be called via static -references with \texttt{invokesta\-tic} or be bound virtually with the -\texttt{invokevirtual} instruction. Super class methods and private -methods are invoked with \texttt{invokespecial}. - -\item[Object allocation:] Class instances are allocated with the -\texttt{new} instruction, arrays of basic type like \texttt{int[]} -with \texttt{newarray}, arrays of references like \texttt{String[][]} -with \texttt{anewarray} or \texttt{multianewarray}. - -\item[Conversion and type checking:] For stack operands of basic type -there exist casting operations like \texttt{f2i} which converts a -float value into an integer. The validity of a type cast may be -checked with \texttt{checkcast} and the \texttt{instanceof} operator -can be directly mapped to the equally named instruction. -\end{description} - -Most instructions have a fixed length, but there are also some -variable-length instructions: In particular, the \texttt{lookupswitch} -and \texttt{tableswitch} instructions, which are used to implement -\texttt{switch()} statements. Since the number of \texttt{case} -clauses may vary, these instructions contain a variable number of -statements. - -We will not list all byte code instructions here, since these are -explained in detail in the JVM specification. The opcode names are -mostly self-explaining, so understanding the following code examples -should be fairly intuitive. - -\subsection{Method code}\label{sec:code2} - -Non-abstract methods contain an attribute (\texttt{Code}) that holds -the following data: The maximum size of the method's stack frame, the -number of local variables and an array of byte code -instructions. Optionally, it may also contain information about the -names of local variables and source file line numbers that can be used -by a debugger. - -Whenever an exception is thrown, the JVM performs exception handling -by looking into a table of exception handlers. The table marks -handlers, i.e. pieces of code, to be responsible for exceptions of -certain types that are raised within a given area of the byte -code. When there is no appropriate handler the exception is propagated -back to the caller of the method. The handler information is itself -stored in an attribute contained within the \texttt{Code} attribute. - -\subsection{Byte code offsets}\label{sec:offsets} - -Targets of branch instructions like \texttt{goto} are encoded as -relative offsets in the array of byte codes. Exception handlers and -local variables refer to absolute addresses within the byte code. The -former contains references to the start and the end of the -\texttt{try} block, and to the instruction handler code. The latter -marks the range in which a local variable is valid, i.e. its scope. -This makes it difficult to insert or delete code areas on this level -of abstraction, since one has to recompute the offsets every time and -update the referring objects. We will see in section \ref{sec:cgapi} -how \jc remedies this restriction. - -\subsection{Type information}\label{sec:types} - -Java is a type-safe language and the information about the types of -fields, local variables, and methods is stored in -\emph{signatures}. These are strings stored in the \cp and encoded in -a special format. For example the argument and return types of the -\texttt{main} method - -\begin{verbatim} - public static void main(String[] argv) -\end{verbatim} - -are represented by the signature - -\begin{verbatim} - ([java/lang/String;)V -\end{verbatim} - -Classes and arrays are internally represented by strings like -\texttt{"java/lang/String"}, basic types like \texttt{float} by an -integer number. Within signatures they are represented by single -characters, e.g., \texttt{"I"}, for integer. - -\subsection{Code example}\label{sec:fac} - -The following example program prompts for a number and prints the -faculty of it. The \texttt{readLine()} method reading from the -standard input may raise an \texttt{IOException} and if a misspelled -number is passed to \texttt{parseInt()} it throws a -\texttt{NumberFormatException}. Thus, the critical area of code must be -encapsulated in a \texttt{try-catch} block. - -{\small \begin{verbatim} -import java.io.*; -public class Faculty { - private static BufferedReader in = new BufferedReader(new - InputStreamReader(System.in)); - public static final int fac(int n) { - return (n == 0)? 1 : n * fac(n - 1); - } - public static final int readInt() { - int n = 4711; - try { - System.out.print("Please enter a number> "); - n = Integer.parseInt(in.readLine()); - } catch(IOException e1) { System.err.println(e1); } - catch(NumberFormatException e2) { System.err.println(e2); } - return n; - } - public static void main(String[] argv) { - int n = readInt(); - System.out.println("Faculty of " + n + " is " + fac(n)); - }} -\end{verbatim}} - -This code example typically compiles to the following chunks of byte -code: - -\subsubsection{Method fac} - -{\small \begin{verbatim} -0: iload_0 -1: ifne #8 -4: iconst_1 -5: goto #16 -8: iload_0 -9: iload_0 -10: iconst_1 -11: isub -12: invokestatic Faculty.fac (I)I (12) -15: imul -16: ireturn - -LocalVariable(start_pc = 0, length = 16, index = 0:int n) -\end{verbatim}} - -The method \texttt{fac} has only one local variable, the argument -\texttt{n}, stored in slot 0. This variable's scope ranges from the -start of the byte code sequence to the very end. If the value of -\texttt{n} (stored in local variable 0, i.e. the value fetched with -\texttt{iload\_0}) is not equal to 0, the \texttt{ifne} instruction -branches to the byte code at offset 8, otherwise a 1 is pushed onto -the operand stack and the control flow branches to the final return. -For ease of reading, the offsets of the branch instructions, which are -actually relative, are displayed as absolute addresses in these -examples. - -If recursion has to continue, the arguments for the multiplication -(\texttt{n} and \texttt{fac(n - 1)}) are evaluated and the results -pushed onto the operand stack. After the multiplication operation has -been performed the function returns the computed value from the top of -the stack. - -\subsubsection{Method readInt} - -{\small \begin{verbatim} -0: sipush 4711 -3: istore_0 -4: getstatic java.lang.System.out Ljava/io/PrintStream; -7: ldc "Please enter a number> " -9: invokevirtual java.io.PrintStream.print (Ljava/lang/String;)V -12: getstatic Faculty.in Ljava/io/BufferedReader; -15: invokevirtual java.io.BufferedReader.readLine ()Ljava/lang/String; -18: invokestatic java.lang.Integer.parseInt (Ljava/lang/String;)I -21: istore_0 -22: goto #44 -25: astore_1 -26: getstatic java.lang.System.err Ljava/io/PrintStream; -29: aload_1 -30: invokevirtual java.io.PrintStream.println (Ljava/lang/Object;)V -33: goto #44 -36: astore_1 -37: getstatic java.lang.System.err Ljava/io/PrintStream; -40: aload_1 -41: invokevirtual java.io.PrintStream.println (Ljava/lang/Object;)V -44: iload_0 -45: ireturn - -Exception handler(s) = -From To Handler Type -4 22 25 java.io.IOException(6) -4 22 36 NumberFormatException(10) -\end{verbatim}} - -First the local variable \texttt{n} (in slot 0) is initialized to the -value 4711. The next instruction, \texttt{getstatic}, loads the -static \texttt{System.out} field onto the stack. Then a string is -loaded and printed, a number read from the standard input and -assigned to \texttt{n}. - -If one of the called methods (\texttt{readLine()} and -\texttt{parseInt()}) throws an exception, the \jvm calls one of the -declared exception handlers, depending on the type of the exception. -The \texttt{try}-clause itself does not produce any code, it merely -defines the range in which the following handlers are active. In the -example the specified source code area maps to a byte code area -ranging from offset 4 (inclusive) to 22 (exclusive). If no exception -has occurred (``normal'' execution flow) the \texttt{goto} -instructions branch behind the handler code. There the value of -\texttt{n} is loaded and returned. - -For example the handler for \texttt{java.io.IOException} starts at -offset 25. It simply prints the error and branches back to the normal -execution flow, i.e. as if no exception had occurred. - -\section{The BCEL API}\label{sec:api} - -The \jc API abstracts from the concrete circumstances of the \jvm and -how to read and write binary Java class files. The API mainly -consists of three parts: - -\begin{enumerate} - -\item A package that contains classes that describe ``static'' - constraints of class files, i.e., reflect the class file format and - is not intended for byte code modifications. The classes may be - used to read and write class files from or to a file. This is - useful especially for analyzing Java classes without having the - source files at hand. The main data structure is called - \texttt{JavaClass} which contains methods, fields, etc.. - -\item A package to dynamically generate or modify \texttt{JavaClass} -objects. It may be used e.g. to insert analysis code, to strip -unnecessary information from class files, or to implement the code -generator back-end of a Java compiler. - -\item Various code examples and utilities like a class file viewer, a -tool to convert class files into HTML, and a converter from class -files to the Jasmin assembly language \cite{jasmin}. -\end{enumerate} - -\subsection{JavaClass}\label{sec:javaclass} - -The ``static'' component of the \jc API resides in the package -\path{de.fub.bytecode.classfile} and represents class files. All of the -binary components and data structures declared in the JVM -specification \cite{jvm} and described in section \ref{sec:jvm} are -mapped to classes. Figure \ref{fig:umljc} shows an UML diagram of the -hierarchy of classes of the \jc API. Figure \ref{fig:umlcp} in the -appendix also shows a detailed diagram of the \texttt{ConstantPool} -components. - -\begin{figure}[htbp] - \begin{center} - \leavevmode - \epsfysize0.93\textheight - \epsfbox{eps/javaclass.eps} - \caption{UML diagram for the \jc API}\label{fig:umljc} - \end{center} -\end{figure} - -The top-level data structure is \texttt{JavaClass}, which in most -cases is created by a \texttt{Class\-Par\-ser} object that is capable -of parsing binary class files. A \texttt{JavaClass} object basically -consists of fields, methods, symbolic references to the super class -and to the implemented interfaces. - -The \cp serves as some kind of central repository and is thus of -outstanding importance for all components. \texttt{ConstantPool} -objects contain an array of fixed size of \texttt{Constant} entries, -which may be retrieved via the \texttt{getConstant()} method taking an -integer index as argument. Indexes to the \cp may be contained in -instructions as well as in other components of a class file and in \cp -entries themselves. - -Methods and fields contain a signature, symbolically defining their -types. Access flags like \texttt{public static final} occur in -several places and are encoded by an integer bit mask, e.g. -\texttt{public static final} matches to the Java expression - -\begin{verbatim} - int access_flags = ACC_PUBLIC | ACC_STATIC | ACC_FINAL; -\end{verbatim} - -As mentioned in section \ref{sec:format} already, several components -may contain \emph{attribute} objects: classes, fields, methods, and -\texttt{Code} objects (introduced in section \ref{sec:code2}). The -latter is an attribute itself that contains the actual byte code -array, the maximum stack size, the number of local variables, a table -of handled exceptions, and some optional debugging information coded -as \texttt{LineNumberTable} and \texttt{LocalVariableTable} -attributes. Attributes are in general specific to some data structure, -i.e. no two components share the same kind of attribute, though this -is not explicitly forbidden. In the figure the \texttt{Attribute} -classes are marked with the component they belong to. - -\subsection{Class repository} - -Using the provided \texttt{Repository} class, reading class files into -a \texttt{JavaClass} object is quite simple: - -\begin{verbatim} - JavaClass clazz = Repository.lookupClass("java.lang.String"); -\end{verbatim} - -The repository also contains methods providing the dynamic equivalent -of the \texttt{instanceof} operator, and other useful routines: - -\begin{verbatim} - if(Repository.instanceOf(clazz, super_class) { - ... - } -\end{verbatim} - -\subsubsection{Accessing class file data} - -Information within the class file components may be accessed like Java -Beans via intuitive set/get methods. All of them also define a -\texttt{toString()} method so that implementing a simple class viewer -is very easy. In fact all of the examples used here have been produced -this way: - -{\small \begin{verbatim} - System.out.println(clazz); - printCode(clazz.getMethods()); - ... - public static void printCode(Method[] methods) { - for(int i=0; i < methods.length; i++) { - System.out.println(methods[i]); - - Code code = methods[i].getCode(); - if(code != null) // Non-abstract method - System.out.println(code); - } - } -\end{verbatim}} - -\subsubsection{Analyzing class data} - -Last but not least, \jc supports the \emph{Visitor} design -pattern \cite{design}, so one can write visitor objects to traverse -and analyze the contents of a class file. Included in the distribution -is a class \texttt{JasminVisitor} that converts class files into the -Jasmin assembler language \cite{jasmin}. - -\subsection{ClassGen}\label{sec:cgapi} - -This part of the API (package \path{ork.apache.bcel.generic}) supplies -an abstraction level for creating or transforming class files -dynamically. It makes the static constraints of Java class files like -the hard-coded byte code addresses generic. The generic \cpe, for -example, is implemented by the class \texttt{ConstantPoolGen} which -offers methods for adding different types of constants. Accordingly, -\texttt{ClassGen} offers an interface to add methods, fields, and -attributes. Figure \ref{fig:umlcg} gives an overview of this part of -the API. - -\begin{figure}[htbp] - \begin{center} - \leavevmode - \epsfysize0.93\textheight - \epsfbox{eps/classgen.eps} - \caption{UML diagram of the ClassGen API}\label{fig:umlcg} - \end{center} -\end{figure} - -\subsubsection{Types} - -We abstract from the concrete details of the type signature syntax -(see \ref{sec:types}) by introducing the \texttt{Type} class, which is -used, for example, by methods to define their return and argument -types. Concrete sub-classes are \texttt{BasicType}, -\texttt{ObjectType}, and \texttt{ArrayType} which consists of the -element type and the number of dimensions. For commonly used types the -class offers some predefined constants. For example the method -signature of the \texttt{main} method as shown in section -\ref{sec:types} is represented by: - -\begin{verbatim} - Type return_type = Type.VOID; - Type[] arg_types = new Type[] { new ArrayType(Type.STRING, 1) }; -\end{verbatim} - -\texttt{Type} also contains methods to convert types into textual -signatures and vice versa. The sub-classes contain implementations of -the routines and constraints specified by the Java Language -Specification \cite{gosling}. - -\subsubsection{Generic fields and methods} - -Fields are represented by \texttt{FieldGen} objects, which may be -freely modified by the user. If they have the access rights -\texttt{static final}, i.e. are constants and of basic type, they may -optionally have an initializing value. - -Generic methods contain methods to add exceptions the method may -throw, local variables, and exception handlers. The latter two are -represented by user-configurable objects as well. Because exception -handlers and local variables contain references to byte code -addresses, they also take the role of an \emph{instruction targeter} -in our terminology. Instruction targeters contain a method -\texttt{updateTarget()} to redirect a reference. Generic -(non-abstract) methods refer to \emph{instruction lists} that consist -of instruction objects. References to byte code addresses are -implemented by handles to instruction objects. This is explained in -more detail in the following sections. - -The maximum stack size needed by the method and the maximum number of -local variables used may be set manually or computed via the -\texttt{setMaxStack()} and \texttt{setMaxLocals()} methods -automatically. - -\subsubsection{Instructions} - -Modeling instructions as objects may look somewhat odd at first sight, -but in fact enables programmers to obtain a high-level view upon -control flow without handling details like concrete byte code offsets. -Instructions consist of a tag, i.e. an opcode, their length in bytes -and an offset (or index) within the byte code. Since many instructions -are immutable, the \texttt{InstructionConstants} interface offers -shareable predefined ``fly-weight'' constants to use. - -Instructions are grouped via sub-classing, the type hierarchy of -instruction classes is illustrated by (incomplete) figure -\ref{fig:umlinstr} in the appendix. The most important family of -instructions are the \emph{branch instructions}, e.g. \texttt{goto}, -that branch to targets somewhere within the byte code. Obviously, -this makes them candidates for playing an \texttt{InstructionTargeter} -role, too. Instructions are further grouped by the interfaces they -implement, there are, e.g., \texttt{TypedInstruction}s that are -associated with a specific type like \texttt{ldc}, or -\texttt{ExceptionThrower} instructions that may raise exceptions when -executed. - -All instructions can be traversed via \texttt{accept(Visitor v)} methods, -i.e., the Visitor design pattern. There is however some special trick -in these methods that allows to merge the handling of certain -instruction groups. The \texttt{accept()} do not only call the -corresponding \texttt{visit()} method, but call \texttt{visit()} -methods of their respective super classes and implemented interfaces -first, i.e. the most specific \texttt{visit()} call is last. Thus one -can group the handling of, say, all \texttt{BranchInstruction}s into -one single method. - -For debugging purposes it may even make sense to ``invent'' your own -instructions. In a sophisticated code generator like the one used as a -backend of the Barat framework \cite{barat} one often has to insert -temporary \texttt{nop} (No operation) instructions. When examining -the produced code it may be very difficult to track back where the -\texttt{nop} was actually inserted. One could think of a derived -\texttt{nop2} instruction that contains additional debugging -information. When the instruction list is dumped to byte code, the -extra data is simply dropped. - -One could also think of new byte code instructions operating on -complex numbers that are replaced by normal byte code upon load-time -or are recognized by a new JVM. - -\subsubsection{Instruction lists}\label{sec:il} - -An \emph{instruction list} is implemented by a list of -\emph{instruction handles} encapsulating instruction objects. -References to instructions in the list are thus not implemented by -direct pointers to instructions but by pointers to instruction -\emph{handles}. This makes appending, inserting and deleting areas of -code very simple. Since we use symbolic references, computation of -concrete byte code offsets does not need to occur until finalization, -i.e. until the user has finished the process of generating or -transforming code. We will use the term instruction handle and -instruction synonymously throughout the rest of the paper. -Instruction handles may contain additional user-defined data using the -\texttt{addAttribute()} method. - -\paragraph{Appending.} -One can append instructions or other instruction lists anywhere to an -existing list. The instructions are appended after the given -instruction handle. All append methods return a new instruction -handle which may then be used as the target of a branch instruction, -e.g.. - -{\small \begin{verbatim} - InstructionList il = new InstructionList(); - ... - GOTO g = new GOTO(null); - il.append(g); - ... - InstructionHandle ih = il.append(InstructionConstants.ACONST_NULL); - g.setTarget(ih); -\end{verbatim}} - -\paragraph{Inserting.} -Instructions may be inserted anywhere into an existing list. They are -inserted before the given instruction handle. All insert methods -return a new instruction handle which may then be used as the start -address of an exception handler, for example. - -{\small \begin{verbatim} - InstructionHandle start = il.insert(insertion_point, - InstructionConstants.NOP); - ... - mg.addExceptionHandler(start, end, handler, "java.io.IOException"); -\end{verbatim}} - - -\paragraph{Deleting.} -Deletion of instructions is also very straightforward; all instruction -handles and the contained instructions within a given range are -removed from the instruction list and disposed. The \texttt{delete()} -method may however throw a \texttt{TargetLostException} when there are -instruction targeters still referencing one of the deleted -instructions. The user is forced to handle such exceptions in a -\texttt{try-catch} block and redirect these references elsewhere. The -\emph{peep hole} optimizer described in section \ref{sec:nop} gives a -detailed example for this. - -{\small \begin{verbatim} - try { - il.delete(first, last); - } catch(TargetLostException e) { - InstructionHandle[] targets = e.getTargets(); - for(int i=0; i < targets.length; i++) { - InstructionTargeter[] targeters = targets[i].getTargeters(); - for(int j=0; j < targeters.length; j++) - targeters[j].updateTarget(targets[i], new_target); - } - } -\end{verbatim}} - -\paragraph{Finalizing.} -When the instruction list is ready to be dumped to pure byte code, all -symbolic references must be mapped to real byte code offsets. This is -done by the \texttt{getByteCode()} method which is called by default -by \texttt{MethodGen.getMethod()}. Afterwards you should call -\texttt{dispose()} so that the instruction handles can be reused -internally. This helps to reduce memory usage. - -\begin{verbatim} - InstructionList il = new InstructionList(); - - ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", - "", ACC_PUBLIC | ACC_SUPER, - null); - MethodGen mg = new MethodGen(ACC_STATIC | ACC_PUBLIC, - Type.VOID, new Type[] { - new ArrayType(Type.STRING, 1) - }, new String[] { "argv" }, - "main", "HelloWorld", il, cp); - ... - cg.addMethod(mg.getMethod()); - il.dispose(); // Reuse instruction handles of list -\end{verbatim} - -\subsubsection{Code example revisited} - -Using instruction lists gives us a generic view upon the code: In -Figure \ref{fig:il} we again present the code chunk of the -\texttt{readInt()} method of the faculty example in section -\ref{sec:fac}: The local variables \texttt{n} and \texttt{e1} both -hold two references to instructions, defining their scope. There are -two \texttt{goto}s branching to the \texttt{iload} at the end of the -method. One of the exception handlers is displayed, too: it references -the start and the end of the \texttt{try} block and also the exception -handler code. - -\begin{figure}[htbp] - \begin{center} - \leavevmode - \epsfxsize\textwidth - \epsfbox{eps/il.eps} - \caption{Instruction list for \texttt{readInt()} method} - \label{fig:il} - \end{center} -\end{figure} - -\subsubsection{Instruction factories}\label{sec:compound} - -To simplify the creation of certain instructions the user can use the -supplied \texttt{InstructionFactory} class which offers a lot of -useful methods to create instructions from scratch. Alternatively, he -can also use \emph{compound instructions}: When producing byte code, -some patterns typically occur very frequently, for instance the -compilation of arithmetic or comparison expressions. You certainly do -not want to rewrite the code that translates such expressions into -byte code in every place they may appear. In order to support this, -the \jc API includes a \emph{compound instruction} (an interface with -a single \texttt{getInstructionList()} method). Instances of this -class may be used in any place where normal instructions would occur, -particularly in append operations. - -\paragraph{Example: Pushing constants.} -Pushing constants onto the operand stack may be coded in different -ways. As explained in section \ref{sec:code} there are some -``short-cut'' instructions that can be used to make the produced byte -code more compact. The smallest instruction to push a single -\texttt{1} onto the stack is \texttt{iconst\_1}, other possibilities -are \texttt{bipush} (can be used to push values between -128 and 127), -\texttt{sipush} (between -32768 and 32767), or \texttt{ldc} (load -constant from \cpe). - -Instead of repeatedly selecting the most compact instruction in, say, -a switch, one can use the compound \texttt{PUSH} instruction whenever -pushing a constant number or string. It will produce the appropriate -byte code instruction and insert entries into to \cp if necessary. - -\begin{verbatim} - il.append(new PUSH(cp, "Hello, world")); - il.append(new PUSH(cp, 4711)); -\end{verbatim} - -\subsubsection{Code patterns using regular expressions}\label{sec:peephole} - -When transforming code, for instance during optimization or when -inserting analysis method calls, one typically searches for certain -patterns of code to perform the transformation at. To simplify -handling such situations \jc introduces a special feature: One can -search for given code patterns within an instruction list using -\emph{regular expressions}. In such expressions, instructions are -represented by symbolic names, e.g. "\texttt{`IfInstruction'}". Meta -characters like \verb|+|, \verb|*|, and \verb@(..|..)@ have their -usual meanings. Thus, the expression - -\begin{verbatim} - "`NOP'+(`ILOAD__'|`ALOAD__')*" -\end{verbatim} - -represents a piece of code consisting of at least one \texttt{NOP} -followed by a possibly empty sequence of \texttt{ILOAD} and -\texttt{ALOAD} instructions. - -The \texttt{search()} method of class \texttt{FindPattern} gets an -instruction list and a regular expression as arguments and returns an -array describing the area of matched instructions. Additional -constraints to the matching area of instructions, which can not be -implemented via regular expressions, may be expressed via \emph{code -constraints}. - -\subsubsection{Example: Optimizing boolean expressions.} - -In Java, boolean values are mapped to 1 and to 0, respectively. Thus, -the simplest way to evaluate boolean expressions is to push a 1 or a 0 -onto the operand stack depending on the truth value of the expression. -But this way, the subsequent combination of boolean expressions (with -\verb|&&|, e.g) yields long chunks of code that push lots of 1s and -0s onto the stack. - -When the code has been finalized these chunks can be optimized with a -\emph{peep hole} algorithm: An \texttt{IfInstruction} (e.g. the -comparison of two integers: \texttt{if\_icmpeq}) that either produces -a 1 or a 0 on the stack and is followed by an \texttt{ifne} -instruction (branch if stack value $\neq$ 0) may be replaced by the -\texttt{IfInstruction} with its branch target replaced by the target -of the \texttt{ifne} instruction: - -{\small \verbatimtabinput{bool.java}} - -The applied code constraint object ensures that the matched code -really corresponds to the targeted expression pattern. Subsequent -application of this algorithm removes all unnecessary stack operations -and branch instructions from the byte code. If any of the deleted -instructions is still referenced by an \texttt{InstructionTargeter} -object, the reference has to be updated in the \texttt{catch}-clause. - -Code example \ref{sec:hello} gives a verbose example of how to create -a class file, while example \ref{sec:nop} shows how to implement a -simple peephole optimizer and how to deal with \texttt{TargetLost} -exceptions. - -\paragraph{Example application:} -The expression - -\begin{verbatim} - if((a == null) || (i < 2)) - System.out.println("Ooops"); -\end{verbatim} - -can be mapped to both of the chunks of byte code shown in figure -\ref{fig:code}. The left column represents the unoptimized code while -the right column displays the same code after an aggressively -optimizing peep hole algorithm has been applied: - -\begin{figure}[hpt] -\begin{minipage}{0.49\textwidth} - {\small \verbatimtabinput{unopt}} \vfil -\end{minipage} -\begin{minipage}{0.49\textwidth} - {\small \verbatimtabinput{opt}} \vfil -\end{minipage}\label{fig:code}\caption{Optimizing boolean expressions} -\begin{center} - - -\end{center} -\end{figure} -\section{Application areas}\label{sec:application} - -There are many possible application areas for \jc ranging from class -browsers, profilers, byte code optimizers, and compilers to -sophisticated run-time analysis tools and extensions to the Java -language \cite{agesen, myers}. - -Compilers like the Barat compiler \cite{barat} use \jc to implement a -byte code generating back end. Other possible application areas are -the static analysis of byte code \cite{thies} or examining the -run-time behavior of classes by inserting calls to profiling methods -into the code. Further examples are extending Java with Eiffel-like -assertions \cite{jawa}, automated delegation \cite{classfilters}, or -with the concepts of ``Aspect-Oriented Programming'' \cite{aspect}. - -\subsection{Class loaders}\label{sec:classloaders} - -Class loaders are responsible for loading class files from the file -system or other resources and passing the byte code to the \vm -\cite{classloader}. A custom \texttt{ClassLoader} object may be used -to intercept the standard procedure of loading a class, i.e. the -system class loader, and perform some transformations before actually -passing the byte code to the JVM. - -A possible scenario is described in figure \ref{fig:classloader}: -During run-time the \vm requests a custom class loader to load a given -class. But before the JVM actually sees the byte code, the class -loader makes a ``side-step'' and performs some transformation to the -class. To make sure that the modified byte code is still valid and -does not violate any of the JVM's rules it is checked by the verifier -before the JVM finally executes it. - -\begin{figure}[ht] - \begin{center} - \leavevmode - \epsfxsize\textwidth - \epsfbox{eps/classloader.eps} - \caption{Class loaders}\label{fig:classloader} - \end{center} -\end{figure} - -Using class loaders is an elegant way of extending the \jvm with new -features without actually modifying it. This concept enables -developers to use \emph{load-time reflection} to implement their ideas -as opposed to the static reflection supported by the Java Reflection -API \cite{reflection}. Load-time transformations supply the user with -a new level of abstraction. He is not strictly tied to the static -constraints of the original authors of the classes but may customize -the applications with third-party code in order to benefit from new -features. Such transformations may be executed on demand and neither -interfere with other users, nor alter the original byte code. In fact, -class loaders may even create classes \emph{ad hoc} without loading a -file at all. - -\subsubsection{Example: Poor Man's Genericity} - -The ``Poor Man's Genericity'' project \cite{pmg} that extends Java -with parameterized classes, for example, uses \jc in two places to -generate instances of parameterized classes: During compile-time (the -standard \texttt{javac} with some slightly changed classes) and at -run-time using a custom class loader. The compiler puts some -additional type information into class files which is evaluated at -load-time by the class loader. The class loader performs some -transformations on the loaded class and passes them to the VM. The -following algorithm illustrates how the load method of the class -loader fulfills the request for a parameterized class, -e.g. \verb|Stack| - -\begin{enumerate} -\item Search for class \texttt{Stack}, load it, and check for a -certain class attribute containing additional type information. I.e. -the attribute defines the ``real'' name of the class, -i.e. \verb|Stack|. - -\item Replace all occurrences and references to the formal type -\texttt{A} with references to the actual type \texttt{String}. For -example the method - -\begin{verbatim} - void push(A obj) { ... } -\end{verbatim} - -becomes - -\begin{verbatim} - void push(String obj) { ... } -\end{verbatim} - -\item Return the resulting class to the Virtual Machine. -\end{enumerate} - -\bibliographystyle{alpha}\bibliography{manual} - -\newpage\appendix - -\pagestyle{empty} -\include{appendix} -\include{diagrams} - -\end{document} -% LocalWords: Freie Universit Institut Informatik dahm inf fu berlin de JOIE -% LocalWords: JCF HelloWorld Jasmin Eiffel SourceFile classfile lang io ldc ar -% LocalWords: PrintStream invokevirtual MethodRef ConstantClass Fieldref dup -% LocalWords: iconst bipush iadd cmpeq jsr athrow iload istore iastore er ic -% LocalWords: getfield putfield getstatic putstatic invokestatic newarray nop -% LocalWords: anewarray checkcast instanceof lookupswitch tableswitch Barat VM -% LocalWords: ConstantPool getConstant LineNumberTable LocalvariableTable ifne -% LocalWords: invokesta invokespecial multianewarray ConstantPoolGen MethodGen -% LocalWords: BasicType ObjectType ArrayType InstructionTarge getByteCode bool -% LocalWords: BranchInstruction InstructionTargeter InstructionHandle regex -% LocalWords: TargetLostException codeconstraint CompoundInstruction sipush -% LocalWords: getInstructionList FindPattern CodeConstraint IfInstruction fac -% LocalWords: TargetLost javac readLine IOException parseInt readInt CLASSPATH -% LocalWords: NumberFormatException toString JasminVisitor getSignature JVM's -% LocalWords: FieldGen updateTarget LGPL BCEL LocalVariableTable setMaxStack -% LocalWords: setMaxLocals InstructionConstants TypedInstruction addAttribute -% LocalWords: ExceptionThrower getMethod InstructionFactory ALOAD - diff --git a/docs/opt b/docs/opt deleted file mode 100644 index fd57764f..00000000 --- a/docs/opt +++ /dev/null @@ -1,24 +0,0 @@ -10: aload_0 -11: ifnull #19 -14: iload_1 -15: iconst_2 -16: if_icmpge #27 -19: getstatic System.out -22: ldc "Ooops" -24: invokevirtual println -27: return - - - - - - - - - - - - - - - diff --git a/docs/unopt b/docs/unopt deleted file mode 100644 index c458bf40..00000000 --- a/docs/unopt +++ /dev/null @@ -1,24 +0,0 @@ -5: aload_0 -6: ifnull #13 -9: iconst_0 -10: goto #14 -13: iconst_1 -14: nop -15: ifne #36 -18: iload_1 -19: iconst_2 -20: if_icmplt #27 -23: iconst_0 -24: goto #28 -27: iconst_1 -28: nop -29: ifne #36 -32: iconst_0 -33: goto #37 -36: iconst_1 -37: nop -38: ifeq #52 -41: getstatic System.out -44: ldc "Ooops" -46: invokevirtual println -52: return -- GitLab From 454645d2524bba29ba7123c992c0cf2ef088601c Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Thu, 24 Jan 2002 02:33:00 +0000 Subject: [PATCH 0033/1313] - removing "docs" target that was previously used to generate docs from tex source. The documentation has been converted to XML. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152723 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/build.xml b/build.xml index 7394a1fb..8b8d411d 100644 --- a/build.xml +++ b/build.xml @@ -25,7 +25,6 @@ Available targets: - test -> Run example number x - test -> Run all examples - mini -> Run Mini compiler and test results - - docs -> Build documentation from TeX sources - apidocs -> Build API documentation (javadoc) in "docs/api" --> @@ -75,14 +74,6 @@ Available targets: - - - - - - - - -- GitLab From cee51ea7125aaf55d912fe70beec3138d96a77fe Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 25 Jan 2002 15:25:10 +0000 Subject: [PATCH 0034/1313] new project found git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152724 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/projects.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xdocs/projects.xml b/xdocs/projects.xml index 088ce2e6..41dda6db 100644 --- a/xdocs/projects.xml +++ b/xdocs/projects.xml @@ -103,6 +103,10 @@ tool for JUnit +
      • + Heap Usage Profiling +
      • +
      • Prolog
      • -- GitLab From 4536484032b273e4d8b0a0e5ad6878de054b0929 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 30 Jan 2002 08:56:09 +0000 Subject: [PATCH 0035/1313] Remove old Code attribute before adding a new one git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152725 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/MethodGen.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index fb379a00..4e9c49dc 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -586,7 +586,6 @@ public class MethodGen extends FieldGenOrMethodGen { if(il != null) byte_code = il.getByteCode(); - LineNumberTable lnt = null; LocalVariableTable lvt = null; @@ -610,7 +609,17 @@ public class MethodGen extends FieldGenOrMethodGen { int exc_len = c_exc.length * 8; // Every entry takes 8 bytes Code code = null; + if((il != null) && !isAbstract()) { + // Remove any stale code attribute + Attribute[] attributes = getAttributes(); + for(int i=0; i < attributes.length; i++) { + Attribute a = attributes[i]; + + if(a instanceof Code) + removeAttribute(a); + } + code = new Code(cp.addUtf8("Code"), 8 + byte_code.length + // prologue byte code 2 + exc_len + // exceptions -- GitLab From 2462820cd81c944e317633a8e223fd53f5ede010 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 1 Feb 2002 08:47:52 +0000 Subject: [PATCH 0036/1313] Show API docs too git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152726 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/stylesheets/project.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/xdocs/stylesheets/project.xml b/xdocs/stylesheets/project.xml index 5b827764..797c314f 100644 --- a/xdocs/stylesheets/project.xml +++ b/xdocs/stylesheets/project.xml @@ -13,6 +13,7 @@ + -- GitLab From deb24c8679b13a4544507573f5c531d4c538e6b3 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 1 Feb 2002 08:48:01 +0000 Subject: [PATCH 0037/1313] Add examples to distribution git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152727 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 8b8d411d..3cea7903 100644 --- a/build.xml +++ b/build.xml @@ -269,6 +269,13 @@ Available targets: + + + + + + + @@ -303,13 +310,20 @@ Available targets: - + + + + + + + + -- GitLab From 7b23ad8a4c74199c18724b32276c72571a0e9be2 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Fri, 1 Feb 2002 19:13:21 +0000 Subject: [PATCH 0038/1313] Minor: Make the output more consistent. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152728 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/Verifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/Verifier.java b/src/java/org/apache/bcel/verifier/Verifier.java index 8e2dd2b8..e7d8564a 100644 --- a/src/java/org/apache/bcel/verifier/Verifier.java +++ b/src/java/org/apache/bcel/verifier/Verifier.java @@ -258,7 +258,7 @@ public class Verifier{ JavaClass jc = Repository.lookupClass(args[k]); for (int i=0; i Date: Mon, 4 Feb 2002 08:43:22 +0000 Subject: [PATCH 0039/1313] Bug fix: Class queue uses now ArrayList, different semantics not regarded git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152729 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/ClassQueue.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/bcel/util/ClassQueue.java b/src/java/org/apache/bcel/util/ClassQueue.java index e543917e..134c93b3 100644 --- a/src/java/org/apache/bcel/util/ClassQueue.java +++ b/src/java/org/apache/bcel/util/ClassQueue.java @@ -65,14 +65,19 @@ import org.apache.bcel.classfile.JavaClass; * @see ClassVector */ public class ClassQueue { - protected int left = 0; - private ArrayList vec = new ArrayList(); + protected ArrayList vec = new ArrayList(); + + public void enqueue(JavaClass clazz) { vec.add(clazz); } - public void enqueue(JavaClass clazz) { vec.add(clazz); } public JavaClass dequeue() { - JavaClass clazz = (JavaClass)vec.get(left); - vec.remove(left++); + JavaClass clazz = (JavaClass)vec.get(0); + vec.remove(0); return clazz; } - public boolean empty() { return vec.size() <= left; } + + public boolean empty() { return vec.size() == 0; } + + public String toString() { + return vec.toString(); + } } -- GitLab From 10f853464a01d13c4405b9ed325cd1e8ab63a03b Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Mon, 4 Feb 2002 09:06:40 +0000 Subject: [PATCH 0040/1313] "commented in" a check that would often fail as long as there was some BCEL bug lurking concerning Assignment Compatibility. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152730 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/structurals/InstConstraintVisitor.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 05c999ad..e6627e26 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -2472,11 +2472,12 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc else{ constraintViolated(o, "The stack top type '"+value+"' is not of a reference type as expected."); } - // TODO: This can only be checked using Staerk-et-al's "set-of-object types", not + // TODO: This can possibly only be checked using Staerk-et-al's "set-of-object types", not // using "wider cast object types" created during verification. - //if (!(rvalue.isAssignmentCompatibleWith(shouldbe))){ - // constraintViolated(o, "The stack top type '"+value+"' is not assignment compatible with '"+shouldbe+"'."); - //} + // Comment it out if you encounter problems. See also the analogon at visitPUTSTATIC. + if (!(rvalue.isAssignmentCompatibleWith(shouldbe))){ + constraintViolated(o, "The stack top type '"+value+"' is not assignment compatible with '"+shouldbe+"'."); + } } else{ if (shouldbe != value){ -- GitLab From 318263a8e5442914a1d4eb4661054d6fdef41786 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Mon, 4 Feb 2002 12:44:25 +0000 Subject: [PATCH 0041/1313] Make the JustICE verifier aware of the new "Signature" attribute. Also, improve BCEL documentation concerning this. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152731 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/Attribute.java | 1 + .../bcel/verifier/statics/StringRepresentation.java | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index 43e6ada5..f693b7d1 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -78,6 +78,7 @@ import java.util.HashMap; * @see InnerClasses * @see Synthetic * @see Deprecated + * @see Signature */ public abstract class Attribute implements Cloneable, Node { protected int name_index; // Points to attribute name in constant pool diff --git a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 93f36373..40b28c0f 100644 --- a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -55,6 +55,7 @@ package org.apache.bcel.verifier.statics; */ import org.apache.bcel.classfile.*; +import org.apache.bcel.verifier.exc.*; /** * BCEL's Node classes (those from the classfile API that accept() Visitor @@ -74,18 +75,27 @@ import org.apache.bcel.classfile.*; public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor implements Visitor{ /** The string representation, created by a visitXXX() method, output by toString(). */ private String tostring; + /** The node we ask for its string representation. Not really needed; only for debug output. */ + private Node n; /** * Creates a new StringRepresentation object which is the representation of n. * * @see #toString() */ public StringRepresentation(Node n){ - n.accept(this); + this.n = n; + n.accept(this); // assign a string representation to field 'tostring' if we know n's class. } /** * Returns the String representation. */ public String toString(){ + // The run-time check below is needed because we don't want to omit inheritance + // of "EmptyVisitor" and provide a thousand empty methods. + // However, in terms of performance this would be a better idea. + // If some new "Node" is defined in BCEL (such as some concrete "Attribute"), we + // want to know that this class has also to be adapted. + if (tostring == null) throw new AssertionViolatedException("Please adapt '"+getClass()+"' to deal with objects of class '"+n.getClass()+"'."); return tostring; } /** -- GitLab From 09cdcb4101f6d0d762624f54700ed90edb10f634 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Mon, 4 Feb 2002 13:07:31 +0000 Subject: [PATCH 0042/1313] Included support for the Signature attribute in BCEL. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152732 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/DescendingVisitor.java | 6 ++++++ src/java/org/apache/bcel/classfile/EmptyVisitor.java | 1 + src/java/org/apache/bcel/classfile/Signature.java | 1 + src/java/org/apache/bcel/classfile/Visitor.java | 1 + .../apache/bcel/verifier/statics/StringRepresentation.java | 3 +++ 5 files changed, 12 insertions(+) diff --git a/src/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/java/org/apache/bcel/classfile/DescendingVisitor.java index c98e4b22..3f3f1031 100644 --- a/src/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -331,6 +331,12 @@ public class DescendingVisitor implements Visitor { stack.pop(); } + public void visitSignature(Signature attribute) { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + public void visitSourceFile(SourceFile attribute) { stack.push(attribute); attribute.accept(visitor); diff --git a/src/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/java/org/apache/bcel/classfile/EmptyVisitor.java index ff1ea7e7..5a4a9910 100644 --- a/src/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -96,6 +96,7 @@ public class EmptyVisitor implements Visitor { public void visitLocalVariable(LocalVariable obj) {} public void visitLocalVariableTable(LocalVariableTable obj) {} public void visitMethod(Method obj) {} + public void visitSignature(Signature obj) {} public void visitSourceFile(SourceFile obj) {} public void visitSynthetic(Synthetic obj) {} public void visitUnknown(Unknown obj) {} diff --git a/src/java/org/apache/bcel/classfile/Signature.java b/src/java/org/apache/bcel/classfile/Signature.java index 7da60b9b..dd53184d 100644 --- a/src/java/org/apache/bcel/classfile/Signature.java +++ b/src/java/org/apache/bcel/classfile/Signature.java @@ -112,6 +112,7 @@ public final class Signature extends Attribute { */ public void accept(Visitor v) { System.err.println("Visiting non-standard Signature object"); + v.visitSignature(this); } /** diff --git a/src/java/org/apache/bcel/classfile/Visitor.java b/src/java/org/apache/bcel/classfile/Visitor.java index c3149de4..97a2d4f2 100644 --- a/src/java/org/apache/bcel/classfile/Visitor.java +++ b/src/java/org/apache/bcel/classfile/Visitor.java @@ -92,6 +92,7 @@ public interface Visitor { public void visitLocalVariable(LocalVariable obj); public void visitLocalVariableTable(LocalVariableTable obj); public void visitMethod(Method obj); + public void visitSignature(Signature obj); public void visitSourceFile(SourceFile obj); public void visitSynthetic(Synthetic obj); public void visitUnknown(Unknown obj); diff --git a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 40b28c0f..c636a134 100644 --- a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -200,6 +200,9 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor public void visitMethod(Method obj){ tostring = toString(obj); } + public void visitSignature(Signature obj){ + tostring = toString(obj); + } public void visitSourceFile(SourceFile obj){ tostring = toString(obj); } -- GitLab From f66d858f99038f2fea34502a2e54ae8c6f565df2 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 7 Feb 2002 16:30:43 +0000 Subject: [PATCH 0043/1313] added check, synthetic may be set for fields too git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152733 13f79535-47bb-0310-9956-ffa450edef68 --- examples/JasminVisitor.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/JasminVisitor.java b/examples/JasminVisitor.java index f0f8fa9d..1217b312 100644 --- a/examples/JasminVisitor.java +++ b/examples/JasminVisitor.java @@ -79,7 +79,10 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { } public void visitDeprecated(Deprecated attribute) { printEndMethod(attribute); } - public void visitSynthetic(Synthetic attribute) { printEndMethod(attribute); } + public void visitSynthetic(Synthetic attribute) { + if(method != null) + printEndMethod(attribute); + } public void visitMethod(Method method) { out.println("\n.method " + Utility.accessToString(method.getAccessFlags()) + -- GitLab From fa52c73de776d7c66e83ba44ef31b3b7c707d8a4 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Thu, 7 Feb 2002 23:12:59 +0000 Subject: [PATCH 0044/1313] updated URL of JustICE PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152734 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/VerifierAppFrame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/java/org/apache/bcel/verifier/VerifierAppFrame.java index 4d5e9842..a18f2f2c 100644 --- a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -378,7 +378,7 @@ public class VerifierAppFrame extends JFrame { void aboutMenuItem_actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(this, - "JustIce is a Java class file verifier.\nIt was implemented by Enver Haase in 2001.\nhttp://bcel.sourceforge.net", + "JustIce is a Java class file verifier.\nIt was implemented by Enver Haase in 2001, 2002.\n", JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); } -- GitLab From cd0bbae028a88365aca358cb76940ba8cb1e7ece Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Thu, 7 Feb 2002 23:22:30 +0000 Subject: [PATCH 0045/1313] doc update PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152735 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/Verifier.java | 4 +++- src/java/org/apache/bcel/verifier/VerifierFactory.java | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/Verifier.java b/src/java/org/apache/bcel/verifier/Verifier.java index e7d8564a..61b4ecbf 100644 --- a/src/java/org/apache/bcel/verifier/Verifier.java +++ b/src/java/org/apache/bcel/verifier/Verifier.java @@ -75,9 +75,11 @@ import java.util.Iterator; * pass-2-verification includes pass-1-verification. * * A Verifier creates PassVerifier instances to perform the actual verification. - * + * Verifier instances are usually generated by the VerifierFactory. + * * @version $Id$ * @author Enver Haase + * @see org.apache.bcel.verifier.VerifierFactory * @see org.apache.bcel.verifier.PassVerifier */ public class Verifier{ diff --git a/src/java/org/apache/bcel/verifier/VerifierFactory.java b/src/java/org/apache/bcel/verifier/VerifierFactory.java index c6ff992b..2c61ba1c 100644 --- a/src/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/java/org/apache/bcel/verifier/VerifierFactory.java @@ -66,6 +66,7 @@ import java.util.Vector; * * @version $Id$ * @author Enver Haase + * @see org.apache.bcel.verifier.Verifier */ public class VerifierFactory{ -- GitLab From 874a8073beebac6a86f2a9758d810618196f3bac Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 11 Feb 2002 10:45:36 +0000 Subject: [PATCH 0046/1313] bug-fix: lookup Utf8 first git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152736 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/ConstantPoolGen.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/java/org/apache/bcel/generic/ConstantPoolGen.java index 54cf2bb1..0ec2a373 100644 --- a/src/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -201,12 +201,12 @@ public class ConstantPoolGen { if((ret = lookupString(str)) != -1) return ret; // Already in CP + int utf8 = addUtf8(str); + adjustSize(); - ConstantUtf8 u8 = new ConstantUtf8(str); - ConstantString s = new ConstantString(index); + ConstantString s = new ConstantString(utf8); - constants[index++] = u8; ret = index; constants[index++] = s; -- GitLab From 3f9dead3ef76b18671cfa6c8507a92a8492189d0 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 1 Mar 2002 10:17:23 +0000 Subject: [PATCH 0047/1313] new lookup method for Class objects git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152737 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Repository.java | 29 ++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index 5c502ea6..08e8c460 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -101,6 +101,35 @@ public abstract class Repository { return clazz; } + /** + * Try to find class source via getResourceAsStream() + * @return JavaClass object for given runtime class + */ + public static JavaClass lookupClass(Class clazz) { + String class_name = clazz.getName(); + + JavaClass j_class = (JavaClass)classes.get(class_name); + + if(j_class == null) { + String name = class_name; + int i = name.lastIndexOf('.'); + + if(i > 0) + name = name.substring(i + 1); + + try { + InputStream is = clazz.getResourceAsStream(name + ".class"); + j_class = new ClassParser(is, class_name).parse(); + } catch(IOException e) { + throw new RuntimeException(e.getMessage()); + } + + classes.put(class_name, j_class); + } + + return j_class; + } + /** @return class file object for given Java class. */ public static ClassPath.ClassFile lookupClassFile(String class_name) { -- GitLab From ed944a4b5495f8abf731ad723c10e810a52c428d Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 1 Mar 2002 10:18:05 +0000 Subject: [PATCH 0048/1313] documentation fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152738 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/ConstantClass.java | 3 ++- src/java/org/apache/bcel/classfile/JavaClass.java | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/ConstantClass.java b/src/java/org/apache/bcel/classfile/ConstantClass.java index 2ae81538..4e2489ee 100644 --- a/src/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/java/org/apache/bcel/classfile/ConstantClass.java @@ -88,7 +88,8 @@ public final class ConstantClass extends Constant implements ConstantObject { } /** - * @param name_index Name index in constant pool + * @param name_index Name index in constant pool. Should refer to a + * ConstantUtf8. */ public ConstantClass(int name_index) { super(Constants.CONSTANT_Class); diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 82084ab5..3c4b8beb 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -95,8 +95,10 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { /** * Constructor gets all contents as arguments. * - * @param class_name Class name - * @param superclass_name Superclass name + * @param class_name_index Index into constant pool referencing a + * ConstantClass that represents this class. + * @param superclass_name_index Index into constant pool referencing a + * ConstantClass that represents this class's superclass. * @param file_name File name * @param major Major compiler version * @param minor Minor compiler version -- GitLab From d73caec50d0d7ccc47bb7c60197a067a9e38d3a5 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 1 Mar 2002 10:53:23 +0000 Subject: [PATCH 0049/1313] check argument type for void git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152739 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/MethodGen.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index 4e9c49dc..adc572a9 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -134,6 +134,10 @@ public class MethodGen extends FieldGenOrMethodGen { if(arg_types != null) { int size = arg_types.length; + for(int i=0; i < size; i++) { + if(Type.VOID == arg_types[i]) + throw new ClassGenException("'void' is an illegal argument type for a method"); +} if(arg_names != null) { // Names for variables provided? if(size != arg_names.length) -- GitLab From fcbca34ba4329562684fc8e9b98b375f751f8fd5 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Sat, 2 Mar 2002 19:55:59 +0000 Subject: [PATCH 0050/1313] typo PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152740 13f79535-47bb-0310-9956-ffa450edef68 --- TODO.JustIce | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TODO.JustIce b/TODO.JustIce index a60343ee..65ebef10 100644 --- a/TODO.JustIce +++ b/TODO.JustIce @@ -7,7 +7,7 @@ $Id$ Sun. However, there are better methods such as the idea proposed by Staerk et al.: using sets of object types. -- There are a few bugs concerning access rights of referenced method +- There are a few bugs concerning access rights of referenced methods and probably fields. The tests for access rights that Sun defines should happen in pass four (which JustIce performs during pass 3a) are unintentionally omitted. This also happened to Sun and IBM with some -- GitLab From fff452e453f405341039a44a9f105457ca247124 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 4 Mar 2002 13:33:33 +0000 Subject: [PATCH 0051/1313] Check for null git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152741 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/ClassGen.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/generic/ClassGen.java b/src/java/org/apache/bcel/generic/ClassGen.java index 8c6d95d6..01c497f9 100644 --- a/src/java/org/apache/bcel/generic/ClassGen.java +++ b/src/java/org/apache/bcel/generic/ClassGen.java @@ -99,8 +99,10 @@ public class ClassGen extends AccessFlags implements Cloneable { cp = new ConstantPoolGen(); // Create empty constant pool // Put everything needed by default into the constant pool and the vectors - addAttribute(new SourceFile(cp.addUtf8("SourceFile"), 2, - cp.addUtf8(file_name), cp.getConstantPool())); + if(file_name != null) + addAttribute(new SourceFile(cp.addUtf8("SourceFile"), 2, + cp.addUtf8(file_name), cp.getConstantPool())); + class_name_index = cp.addClass(class_name); superclass_name_index = cp.addClass(super_class_name); -- GitLab From 8490de21009dca2dcfd2a77f0d6aa545e3f30a37 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 4 Mar 2002 13:36:57 +0000 Subject: [PATCH 0052/1313] New constructor accepts cpg git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152742 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/generic/ClassGen.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/generic/ClassGen.java b/src/java/org/apache/bcel/generic/ClassGen.java index 01c497f9..aa56f5c9 100644 --- a/src/java/org/apache/bcel/generic/ClassGen.java +++ b/src/java/org/apache/bcel/generic/ClassGen.java @@ -89,14 +89,15 @@ public class ClassGen extends AccessFlags implements Cloneable { * @param file_name source file name * @param access_flags access qualifiers * @param interfaces implemented interfaces + * @param cp constant pool to use */ public ClassGen(String class_name, String super_class_name, String file_name, - int access_flags, String[] interfaces) { + int access_flags, String[] interfaces, ConstantPoolGen cp) { this.class_name = class_name; this.super_class_name = super_class_name; this.file_name = file_name; this.access_flags = access_flags; - cp = new ConstantPoolGen(); // Create empty constant pool + this.cp = cp; // Put everything needed by default into the constant pool and the vectors if(file_name != null) @@ -111,6 +112,20 @@ public class ClassGen extends AccessFlags implements Cloneable { addInterface(interfaces[i]); } + /** Convenience constructor to set up some important values initially. + * + * @param class_name fully qualified class name + * @param super_class_name fully qualified superclass name + * @param file_name source file name + * @param access_flags access qualifiers + * @param interfaces implemented interfaces + */ + public ClassGen(String class_name, String super_class_name, String file_name, + int access_flags, String[] interfaces) { + this(class_name, super_class_name, file_name, access_flags, interfaces, + new ConstantPoolGen()); + } + /** * Initialize with existing class. * @param clazz JavaClass object (e.g. read from file) -- GitLab From 519a941dc276677ab1510b0620758a474775c596 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 6 Mar 2002 17:49:42 +0000 Subject: [PATCH 0053/1313] _method, because Jasmin doesnt like method git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152743 13f79535-47bb-0310-9956-ffa450edef68 --- examples/JasminVisitor.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/examples/JasminVisitor.java b/examples/JasminVisitor.java index 1217b312..6a57616a 100644 --- a/examples/JasminVisitor.java +++ b/examples/JasminVisitor.java @@ -64,7 +64,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { out.println(" = " + cv); } - private Method method; + private Method _method; /** * Unfortunately Jasmin expects ".end method" after each method. Thus we've to check @@ -72,7 +72,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { * then. */ private final void printEndMethod(Attribute attr) { - Attribute[] attributes = method.getAttributes(); + Attribute[] attributes = _method.getAttributes(); if(attr == attributes[attributes.length - 1]) out.println(".end method"); @@ -80,17 +80,17 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { public void visitDeprecated(Deprecated attribute) { printEndMethod(attribute); } public void visitSynthetic(Synthetic attribute) { - if(method != null) + if(_method != null) printEndMethod(attribute); } public void visitMethod(Method method) { - out.println("\n.method " + Utility.accessToString(method.getAccessFlags()) + - " " + method.getName() + method.getSignature()); + out.println("\n.method " + Utility.accessToString(_method.getAccessFlags()) + + " " + _method.getName() + _method.getSignature()); - this.method = method; // Remember for use in subsequent visitXXX calls + this._method = method; // Remember for use in subsequent visitXXX calls - Attribute[] attributes = method.getAttributes(); + Attribute[] attributes = _method.getAttributes(); if((attributes == null) || (attributes.length == 0)) out.println(".end method"); } @@ -111,7 +111,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { out.println(".limit stack " + code.getMaxStack()); out.println(".limit locals " + code.getMaxLocals()); - MethodGen mg = new MethodGen(method, class_name, cp); + MethodGen mg = new MethodGen(_method, class_name, cp); InstructionList il = mg.getInstructionList(); InstructionHandle[] ihs = il.getInstructionHandles(); @@ -229,7 +229,6 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { printEndMethod(code); } - private final String get(InstructionHandle ih) { String str = new StringTokenizer((String)map.get(ih), "\n").nextToken(); -- GitLab From 45373a17ba9a97e8521f9322578f0a69cf171722 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 6 Mar 2002 17:50:26 +0000 Subject: [PATCH 0054/1313] doc fixes by dmartin@cliftonlabs.com git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152744 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/ConstantPool.java | 13 +++++++++---- src/java/org/apache/bcel/classfile/JavaClass.java | 7 ++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/java/org/apache/bcel/classfile/ConstantPool.java index a10ad43f..4b44d5d7 100644 --- a/src/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/java/org/apache/bcel/classfile/ConstantPool.java @@ -58,12 +58,17 @@ import org.apache.bcel.Constants; import java.io.*; /** - * This class represents the constant pool, i.e., a table of constants. - * It may contain null references, due to the JVM specification that skips - * an entry after an 8-byte constant (double, long) entry. - * + + * This class represents the constant pool, i.e., a table of constants, of + * a parsed classfile. It may contain null references, due to the JVM + * specification that skips an entry after an 8-byte constant (double, + * long) entry. Those interested in generating constant pools + * programatically should see + * ConstantPoolGen. + * @version $Id$ * @see Constant + * @see org.apache.bcel.generic.ConstantPoolGen * @author M. Dahm */ public class ConstantPool implements Cloneable, Node { diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 3c4b8beb..dce410cd 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -64,8 +64,13 @@ import java.util.StringTokenizer; * fields, methods and commands contained in a Java .class file. * See JVM * specification for details. - * + + * The intent of this class is to represent a parsed or otherwise existing + * class file. Those interested in programatically generating classes + * should see the ClassGen class. + * @version $Id$ + * @see org.apache.bcel.generic.ClassGen * @author M. Dahm */ public class JavaClass extends AccessFlags implements Cloneable, Node { -- GitLab From f1067d73526a0315d54aed16a456b04e16935883 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 7 Mar 2002 08:57:01 +0000 Subject: [PATCH 0055/1313] protected constructor git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152745 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/Attribute.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index f693b7d1..eb6f8e95 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -86,7 +86,8 @@ public abstract class Attribute implements Cloneable, Node { protected byte tag; // Tag to distiguish subclasses protected ConstantPool constant_pool; - Attribute(byte tag, int name_index, int length, ConstantPool constant_pool) { + protected Attribute(byte tag, int name_index, int length, + ConstantPool constant_pool) { this.tag = tag; this.name_index = name_index; this.length = length; -- GitLab From fd0c06086eb903f20287f24b7db4e3e5a89055e7 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 7 Mar 2002 08:58:56 +0000 Subject: [PATCH 0056/1313] public readAttribute, why not git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152746 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/Attribute.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index eb6f8e95..c95ffc34 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -149,8 +149,8 @@ public abstract class Attribute implements Cloneable, Node { * @throw ClassFormatError * @throw InternalError */ - static final Attribute readAttribute(DataInputStream file, - ConstantPool constant_pool) + public static final Attribute readAttribute(DataInputStream file, + ConstantPool constant_pool) throws IOException, ClassFormatError, InternalError { ConstantUtf8 c; -- GitLab From 75a4179a03628c204a2c08e1027a26c277748b51 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 7 Mar 2002 09:03:28 +0000 Subject: [PATCH 0057/1313] doc updates by dmartin@cliftonlabs.com git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152747 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Deprecated.java | 1 - .../org/apache/bcel/classfile/SourceFile.java | 20 +++++++++++++------ .../org/apache/bcel/classfile/Synthetic.java | 19 +++++++++++------- .../org/apache/bcel/classfile/Unknown.java | 12 +++++++++-- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/Deprecated.java b/src/java/org/apache/bcel/classfile/Deprecated.java index 7502cff8..410be68f 100644 --- a/src/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/java/org/apache/bcel/classfile/Deprecated.java @@ -82,7 +82,6 @@ public final class Deprecated extends Attribute { * @param length Content length in bytes * @param bytes Attribute contents * @param constant_pool Array of constants - * @param sourcefile_index Index in constant pool to CONSTANT_Utf8 */ public Deprecated(int name_index, int length, byte[] bytes, ConstantPool constant_pool) diff --git a/src/java/org/apache/bcel/classfile/SourceFile.java b/src/java/org/apache/bcel/classfile/SourceFile.java index 2e9db567..a7215d1d 100644 --- a/src/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/java/org/apache/bcel/classfile/SourceFile.java @@ -59,8 +59,9 @@ import java.io.*; /** * This class is derived from Attribute and represents a reference - * to the source file of this class. - * It is instantiated from the Attribute.readAttribute() method. + * to the source file of this class. At most one SourceFile attribute + * should appear per classfile. The intention of this class is that it is + * instantiated from the Attribute.readAttribute() method. * * @version $Id$ * @author M. Dahm @@ -93,10 +94,17 @@ public final class SourceFile extends Attribute { } /** - * @param name_index Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes - * @param constant_pool Array of constants - * @param sourcefile_index Index in constant pool to CONSTANT_Utf8 + * @param name_index Index in constant pool to CONSTANT_Utf8, which + * should represent the string "SourceFile". + * @param length Content length in bytes, the value should be 2. + * @param constant_pool The constant pool that this attribute is + * associated with. + * @param sourcefile_index Index in constant pool to CONSTANT_Utf8. This + * string will be interpreted as the name of the file from which this + * class was compiled. It will not be interpreted as indicating the name + * of the directory contqining the file or an absolute path; this + * information has to be supplied the consumer of this attribute - in + * many cases, the JVM. */ public SourceFile(int name_index, int length, int sourcefile_index, ConstantPool constant_pool) diff --git a/src/java/org/apache/bcel/classfile/Synthetic.java b/src/java/org/apache/bcel/classfile/Synthetic.java index c06c630e..234c1683 100644 --- a/src/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/java/org/apache/bcel/classfile/Synthetic.java @@ -58,9 +58,13 @@ import org.apache.bcel.Constants; import java.io.*; /** - * This class is derived from Attribute and declares this class - * as `synthetic', i.e., it needs special handling. - * It is instantiated from the Attribute.readAttribute() method. + * This class is derived from Attribute and declares this class as + * `synthetic', i.e., it needs special handling. The JVM specification + * states "A class member that does not appear in the source code must be + * marked using a Synthetic attribute." It may appear in the ClassFile + * attribute table, a field_info table or a method_info table. This class + * is intended to be instantiated from the + * Attribute.readAttribute() method. * * @version $Id$ * @author M. Dahm @@ -78,11 +82,12 @@ public final class Synthetic extends Attribute { } /** - * @param name_index Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes + * @param name_index Index in constant pool to CONSTANT_Utf8, which + * should represent the string "Synthetic". + * @param length Content length in bytes - should be zero. * @param bytes Attribute contents - * @param constant_pool Array of constants - * @param sourcefile_index Index in constant pool to CONSTANT_Utf8 + * @param constant_pool The constant pool this attribute is associated + * with. */ public Synthetic(int name_index, int length, byte[] bytes, ConstantPool constant_pool) diff --git a/src/java/org/apache/bcel/classfile/Unknown.java b/src/java/org/apache/bcel/classfile/Unknown.java index e6f17efd..56c9ab4d 100644 --- a/src/java/org/apache/bcel/classfile/Unknown.java +++ b/src/java/org/apache/bcel/classfile/Unknown.java @@ -60,10 +60,18 @@ import java.util.*; /** * This class represents a reference to an unknown (i.e., - * application-specific) attribute of a class. It is instantiated - * from the Attribute.readAttribute() method. + * application-specific) attribute of a class. It is instantiated from the + * Attribute.readAttribute() method. Applications that need to + * read in application-specific attributes should create an AttributeReader implementation and + * attach it via Attribute.addAttributeReader. + * * @version $Id$ + * @see org.apache.bcel.classfile.Attribute + * @see org.apache.bcel.classfile.AttributeReader * @author M. Dahm */ public final class Unknown extends Attribute { -- GitLab From 5bfb1b3e4c4b2a650381d1fe027154a63b01331d Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 8 Mar 2002 16:04:57 +0000 Subject: [PATCH 0058/1313] FAQ fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152748 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/faq.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xdocs/faq.xml b/xdocs/faq.xml index bbcd81b5..e481a883 100644 --- a/xdocs/faq.xml +++ b/xdocs/faq.xml @@ -24,7 +24,8 @@
        A: Yes, this is covered by the Apache License, if you add a note about the original - author and where to find the sources, i.e., this URL. + author and where to find the sources, i.e., + http://jakarta.apace.org/bcel/

        @@ -43,7 +44,7 @@ The solution is to split the branch into in intermediate hops, which the XSLTC obviously doesn't take care off. (In fact you could replace gotos with the goto_w instruction, - but this would help in the other cases). + but this wouldn't help in the other cases).

        -- GitLab From df83ee9665069978f7d3411193fb744b959dfcb1 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Sat, 9 Mar 2002 22:30:15 +0000 Subject: [PATCH 0059/1313] I put some checks back in which I commented out while there was a problem with BCEL check for assignment compatibility (which was rooted someplace else). However, this could cause JustIce to reject code that's not rejected by traditional verifiers. I got a bug report today from a person who found a class that was rejected by a traditional verifier but not by JustIce - which is even more annoying. So I switched. See TODO.JustIce . PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152749 13f79535-47bb-0310-9956-ffa450edef68 --- TODO.JustIce | 10 ++++++++- .../structurals/InstConstraintVisitor.java | 22 +++++++++---------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/TODO.JustIce b/TODO.JustIce index 65ebef10..d6f43731 100644 --- a/TODO.JustIce +++ b/TODO.JustIce @@ -5,7 +5,15 @@ $Id$ - JustIce uses object generalization during pass 3b, as supposed by Sun. However, there are better methods such as the idea proposed by -Staerk et al.: using sets of object types. +Staerk et al.: using sets of object types. JustIce may reject code +that is not rejected by traditional JVM-internal verifiers for this +reason. The corresponding checks all have some "TODO" tag with an +explanation; they're all in the 'InstConstraint.java' file. Users +encountering problems should simply comment them out (or uncomment +them) as they like. The default is some setting that works well +when using 'java org.apache.bcel.verifier.TransHull java.lang.String' +- that is, there are no rejects caused by the above problem in a lot +of usual classes. - There are a few bugs concerning access rights of referenced methods and probably fields. The tests for access rights that Sun defines diff --git a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index e6627e26..e2634c30 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -1758,9 +1758,9 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc ReferenceType rFromDesc = (ReferenceType) fromDesc; // TODO: This can only be checked using Staerk-et-al's "set of object types", not // using a "wider cast object type". - //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); - //} + if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + } } else{ constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); @@ -1836,11 +1836,11 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ ReferenceType rFromStack = (ReferenceType) fromStack; ReferenceType rFromDesc = (ReferenceType) fromDesc; - // TODO: This check can only be done using Staerk-et-al's "set of object types" + // TODO: This check can possibly only be done using Staerk-et-al's "set of object types" // instead of a "wider cast object type" created during verification. - //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); - //} + if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + } } else{ constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); @@ -1882,11 +1882,11 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ ReferenceType rFromStack = (ReferenceType) fromStack; ReferenceType rFromDesc = (ReferenceType) fromDesc; - // TODO: This can only be checked when using Staerk-et-al's "set of object types" instead + // TODO: This can possibly only be checked when using Staerk-et-al's "set of object types" instead // of a single "wider cast object type" created during verification. - //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); - //} + if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + } } else{ constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); -- GitLab From 711b255da655f47922bf787d9380d39882c7a704 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 11 Mar 2002 12:22:39 +0000 Subject: [PATCH 0060/1313] Small fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152750 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 3 +++ src/java/org/apache/bcel/Constants.java | 4 ++-- src/java/org/apache/bcel/Repository.java | 8 ++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/build.xml b/build.xml index 3cea7903..6d6e05e7 100644 --- a/build.xml +++ b/build.xml @@ -61,6 +61,9 @@ Available targets: + + + Date: Mon, 11 Mar 2002 16:16:38 +0000 Subject: [PATCH 0061/1313] Small fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152751 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Attribute.java | 8 ++-- .../apache/bcel/classfile/ClassParser.java | 40 +++++++++---------- src/java/org/apache/bcel/classfile/Code.java | 2 +- .../apache/bcel/classfile/CodeException.java | 4 +- .../org/apache/bcel/classfile/ConstantCP.java | 4 +- .../apache/bcel/classfile/ConstantClass.java | 4 +- .../apache/bcel/classfile/ConstantDouble.java | 4 +- .../bcel/classfile/ConstantFieldref.java | 2 +- .../apache/bcel/classfile/ConstantFloat.java | 4 +- .../bcel/classfile/ConstantInteger.java | 4 +- .../classfile/ConstantInterfaceMethodref.java | 2 +- .../apache/bcel/classfile/ConstantLong.java | 4 +- .../bcel/classfile/ConstantMethodref.java | 2 +- .../bcel/classfile/ConstantNameAndType.java | 4 +- .../apache/bcel/classfile/ConstantPool.java | 10 ++--- .../apache/bcel/classfile/ConstantString.java | 4 +- .../apache/bcel/classfile/ConstantUtf8.java | 4 +- .../apache/bcel/classfile/ConstantValue.java | 4 +- .../org/apache/bcel/classfile/Deprecated.java | 4 +- .../apache/bcel/classfile/ExceptionTable.java | 4 +- .../apache/bcel/classfile/FieldOrMethod.java | 6 +-- .../org/apache/bcel/classfile/InnerClass.java | 4 +- .../apache/bcel/classfile/InnerClasses.java | 4 +- .../org/apache/bcel/classfile/JavaClass.java | 2 +- .../org/apache/bcel/classfile/LineNumber.java | 4 +- .../bcel/classfile/LineNumberTable.java | 4 +- .../apache/bcel/classfile/LocalVariable.java | 4 +- .../bcel/classfile/LocalVariableTable.java | 4 +- .../org/apache/bcel/classfile/Method.java | 4 +- .../org/apache/bcel/classfile/PMGClass.java | 4 +- .../org/apache/bcel/classfile/Signature.java | 4 +- .../org/apache/bcel/classfile/SourceFile.java | 4 +- .../org/apache/bcel/classfile/StackMap.java | 4 +- .../apache/bcel/classfile/StackMapEntry.java | 4 +- .../apache/bcel/classfile/StackMapType.java | 4 +- .../org/apache/bcel/classfile/Synthetic.java | 4 +- .../org/apache/bcel/classfile/Unknown.java | 4 +- .../org/apache/bcel/classfile/Utility.java | 25 +++++++----- src/java/org/apache/bcel/generic/IXOR.java | 2 +- .../apache/bcel/generic/InstructionList.java | 16 ++++---- src/java/org/apache/bcel/generic/LXOR.java | 2 +- .../apache/bcel/generic/LineNumberGen.java | 1 - 42 files changed, 119 insertions(+), 113 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index c95ffc34..945330e8 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -107,7 +107,7 @@ public abstract class Attribute implements Cloneable, Node { * Dump attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public void dump(DataOutputStream file) throws IOException { @@ -145,9 +145,9 @@ public abstract class Attribute implements Cloneable, Node { * @param file Input stream * @param constant_pool Array of constants * @return Attribute - * @throw IOException - * @throw ClassFormatError - * @throw InternalError + * @throws IOException + * @throws ClassFormatError + * @throws InternalError */ public static final Attribute readAttribute(DataInputStream file, ConstantPool constant_pool) diff --git a/src/java/org/apache/bcel/classfile/ClassParser.java b/src/java/org/apache/bcel/classfile/ClassParser.java index 68801453..379e2444 100644 --- a/src/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/java/org/apache/bcel/classfile/ClassParser.java @@ -111,7 +111,7 @@ public final class ClassParser { /** Parse class from given .class file. * * @param file_name file name - * @throw IOException + * @throws IOException */ public ClassParser(String file_name) throws IOException { @@ -124,7 +124,7 @@ public final class ClassParser { /** Parse class from given .class file in a ZIP-archive * * @param file_name file name - * @throw IOException + * @throws IOException */ public ClassParser(String zip_file, String file_name) throws IOException { @@ -146,8 +146,8 @@ public final class ClassParser { * is performed by the java interpreter). * * @return Class object representing the parsed class file - * @throw IOException - * @throw ClassFormatError + * @throws IOException + * @throws ClassFormatError */ public JavaClass parse() throws IOException, ClassFormatError { @@ -209,8 +209,8 @@ public final class ClassParser { /** * Read information about the attributes of the attributes of the class. - * @throw IOException - * @throw ClassFormatError + * @throws IOException + * @throws ClassFormatError */ private final void readAttributes() throws IOException, ClassFormatError { @@ -225,8 +225,8 @@ public final class ClassParser { /** * Read information about the class and its super class. - * @throw IOException - * @throw ClassFormatError + * @throws IOException + * @throws ClassFormatError */ private final void readClassInfo() throws IOException, ClassFormatError { @@ -247,8 +247,8 @@ public final class ClassParser { } /** * Read constant pool entries. - * @throw IOException - * @throw ClassFormatError + * @throws IOException + * @throws ClassFormatError */ private final void readConstantPool() throws IOException, ClassFormatError { @@ -257,8 +257,8 @@ public final class ClassParser { /** * Read information about the fields of the class, i.e., its variables. - * @throw IOException - * @throw ClassFormatError + * @throws IOException + * @throws ClassFormatError */ private final void readFields() throws IOException, ClassFormatError { @@ -276,8 +276,8 @@ public final class ClassParser { /** * Check whether the header of the file is ok. * Of course, this has to be the first action on successive file reads. - * @throw IOException - * @throw ClassFormatError + * @throws IOException + * @throws ClassFormatError */ private final void readID() throws IOException, ClassFormatError { @@ -288,8 +288,8 @@ public final class ClassParser { } /** * Read information about the interfaces implemented by this class. - * @throw IOException - * @throw ClassFormatError + * @throws IOException + * @throws ClassFormatError */ private final void readInterfaces() throws IOException, ClassFormatError { @@ -303,8 +303,8 @@ public final class ClassParser { } /** * Read information about the methods of the class. - * @throw IOException - * @throw ClassFormatError + * @throws IOException + * @throws ClassFormatError */ private final void readMethods() throws IOException, ClassFormatError { @@ -318,8 +318,8 @@ public final class ClassParser { } /** * Read major and minor version of compiler which created the file. - * @throw IOException - * @throw ClassFormatError + * @throws IOException + * @throws ClassFormatError */ private final void readVersion() throws IOException, ClassFormatError { diff --git a/src/java/org/apache/bcel/classfile/Code.java b/src/java/org/apache/bcel/classfile/Code.java index 84f2efe7..ed354d86 100644 --- a/src/java/org/apache/bcel/classfile/Code.java +++ b/src/java/org/apache/bcel/classfile/Code.java @@ -182,7 +182,7 @@ public final class Code extends Attribute { * Dump code attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/CodeException.java b/src/java/org/apache/bcel/classfile/CodeException.java index c3bb946e..e90d70c0 100644 --- a/src/java/org/apache/bcel/classfile/CodeException.java +++ b/src/java/org/apache/bcel/classfile/CodeException.java @@ -86,7 +86,7 @@ public final class CodeException implements Cloneable, Constants, Node { /** * Construct object from file stream. * @param file Input stream - * @throw IOException + * @throws IOException */ CodeException(DataInputStream file) throws IOException { @@ -127,7 +127,7 @@ public final class CodeException implements Cloneable, Constants, Node { * Dump code exception to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantCP.java b/src/java/org/apache/bcel/classfile/ConstantCP.java index 496c57b5..a4bf9f29 100644 --- a/src/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/java/org/apache/bcel/classfile/ConstantCP.java @@ -82,7 +82,7 @@ public abstract class ConstantCP extends Constant { * * @param tag Constant type tag * @param file Input stream - * @throw IOException + * @throws IOException */ ConstantCP(byte tag, DataInputStream file) throws IOException { @@ -104,7 +104,7 @@ public abstract class ConstantCP extends Constant { * Dump constant field reference to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantClass.java b/src/java/org/apache/bcel/classfile/ConstantClass.java index 4e2489ee..30f82f82 100644 --- a/src/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/java/org/apache/bcel/classfile/ConstantClass.java @@ -80,7 +80,7 @@ public final class ConstantClass extends Constant implements ConstantObject { * Initialize instance from file data. * * @param file Input stream - * @throw IOException + * @throws IOException */ ConstantClass(DataInputStream file) throws IOException { @@ -111,7 +111,7 @@ public final class ConstantClass extends Constant implements ConstantObject { * Dump constant class to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantDouble.java b/src/java/org/apache/bcel/classfile/ConstantDouble.java index 145928fd..ddf43db5 100644 --- a/src/java/org/apache/bcel/classfile/ConstantDouble.java +++ b/src/java/org/apache/bcel/classfile/ConstantDouble.java @@ -88,7 +88,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { * Initialize instance from file data. * * @param file Input stream - * @throw IOException + * @throws IOException */ ConstantDouble(DataInputStream file) throws IOException { @@ -109,7 +109,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { * Dump constant double to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/java/org/apache/bcel/classfile/ConstantFieldref.java index 7ebd17c2..f3dc77a6 100644 --- a/src/java/org/apache/bcel/classfile/ConstantFieldref.java +++ b/src/java/org/apache/bcel/classfile/ConstantFieldref.java @@ -75,7 +75,7 @@ public final class ConstantFieldref extends ConstantCP { * Initialize instance from file data. * * @param file input stream - * @throw IOException + * @throws IOException */ ConstantFieldref(DataInputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantFloat.java b/src/java/org/apache/bcel/classfile/ConstantFloat.java index 5df62c1b..a1fd1f42 100644 --- a/src/java/org/apache/bcel/classfile/ConstantFloat.java +++ b/src/java/org/apache/bcel/classfile/ConstantFloat.java @@ -88,7 +88,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { * Initialize instance from file data. * * @param file Input stream - * @throw IOException + * @throws IOException */ ConstantFloat(DataInputStream file) throws IOException { @@ -108,7 +108,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { * Dump constant float to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantInteger.java b/src/java/org/apache/bcel/classfile/ConstantInteger.java index a8b9e2d2..6b4e6e5c 100644 --- a/src/java/org/apache/bcel/classfile/ConstantInteger.java +++ b/src/java/org/apache/bcel/classfile/ConstantInteger.java @@ -91,7 +91,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { * Initialize instance from file data. * * @param file Input stream - * @throw IOException + * @throws IOException */ ConstantInteger(DataInputStream file) throws IOException { @@ -113,7 +113,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { * Dump constant integer to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java index f3fba280..a1d1fdfe 100644 --- a/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java +++ b/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java @@ -75,7 +75,7 @@ public final class ConstantInterfaceMethodref extends ConstantCP { * Initialize instance from file data. * * @param file input stream - * @throw IOException + * @throws IOException */ ConstantInterfaceMethodref(DataInputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantLong.java b/src/java/org/apache/bcel/classfile/ConstantLong.java index db521f78..556c9e4d 100644 --- a/src/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/java/org/apache/bcel/classfile/ConstantLong.java @@ -87,7 +87,7 @@ public final class ConstantLong extends Constant implements ConstantObject { * Initialize instance from file data. * * @param file Input stream - * @throw IOException + * @throws IOException */ ConstantLong(DataInputStream file) throws IOException { @@ -107,7 +107,7 @@ public final class ConstantLong extends Constant implements ConstantObject { * Dump constant long to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/java/org/apache/bcel/classfile/ConstantMethodref.java index 05992167..6b8c69d6 100644 --- a/src/java/org/apache/bcel/classfile/ConstantMethodref.java +++ b/src/java/org/apache/bcel/classfile/ConstantMethodref.java @@ -75,7 +75,7 @@ public final class ConstantMethodref extends ConstantCP { * Initialize instance from file data. * * @param file input stream - * @throw IOException + * @throws IOException */ ConstantMethodref(DataInputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/java/org/apache/bcel/classfile/ConstantNameAndType.java index 8de59337..50dbfad3 100644 --- a/src/java/org/apache/bcel/classfile/ConstantNameAndType.java +++ b/src/java/org/apache/bcel/classfile/ConstantNameAndType.java @@ -82,7 +82,7 @@ public final class ConstantNameAndType extends Constant { * Initialize instance from file data. * * @param file Input stream - * @throw IOException + * @throws IOException */ ConstantNameAndType(DataInputStream file) throws IOException { @@ -116,7 +116,7 @@ public final class ConstantNameAndType extends Constant { * Dump name and signature index to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/java/org/apache/bcel/classfile/ConstantPool.java index 4b44d5d7..483a8f45 100644 --- a/src/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/java/org/apache/bcel/classfile/ConstantPool.java @@ -87,8 +87,8 @@ public class ConstantPool implements Cloneable, Node { * Read constants from given file stream. * * @param file Input stream - * @throw IOException - * @throw ClassFormatError + * @throws IOException + * @throws ClassFormatError */ ConstantPool(DataInputStream file) throws IOException, ClassFormatError { @@ -220,7 +220,7 @@ public class ConstantPool implements Cloneable, Node { * Dump constant pool to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public void dump(DataOutputStream file) throws IOException { @@ -254,7 +254,7 @@ public class ConstantPool implements Cloneable, Node { * @param tag Tag of expected constant, i.e., its type * @return Constant value * @see Constant - * @throw ClassFormatError + * @throws ClassFormatError */ public Constant getConstant(int index, byte tag) throws ClassFormatError @@ -289,7 +289,7 @@ public class ConstantPool implements Cloneable, Node { * @return Contents of string reference * @see ConstantClass * @see ConstantString - * @throw ClassFormatError + * @throws ClassFormatError */ public String getConstantString(int index, byte tag) throws ClassFormatError diff --git a/src/java/org/apache/bcel/classfile/ConstantString.java b/src/java/org/apache/bcel/classfile/ConstantString.java index 3ed78f44..e32b25ab 100644 --- a/src/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/java/org/apache/bcel/classfile/ConstantString.java @@ -79,7 +79,7 @@ public final class ConstantString extends Constant implements ConstantObject { * Initialize instance from file data. * * @param file Input stream - * @throw IOException + * @throws IOException */ ConstantString(DataInputStream file) throws IOException { @@ -107,7 +107,7 @@ public final class ConstantString extends Constant implements ConstantObject { * Dump constant field reference to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/java/org/apache/bcel/classfile/ConstantUtf8.java index a087d5c6..e5d9e5be 100644 --- a/src/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -80,7 +80,7 @@ public final class ConstantUtf8 extends Constant { * Initialize instance from file data. * * @param file Input stream - * @throw IOException + * @throws IOException */ ConstantUtf8(DataInputStream file) throws IOException { @@ -113,7 +113,7 @@ public final class ConstantUtf8 extends Constant { * Dump String in Utf8 format to file stream. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ConstantValue.java b/src/java/org/apache/bcel/classfile/ConstantValue.java index bd4e53b9..82fc8a3e 100644 --- a/src/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/java/org/apache/bcel/classfile/ConstantValue.java @@ -84,7 +84,7 @@ public final class ConstantValue extends Attribute { * @param length Content length in bytes * @param file Input stream * @param constant_pool Array of constants - * @throw IOException + * @throws IOException */ ConstantValue(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException @@ -120,7 +120,7 @@ public final class ConstantValue extends Attribute { * Dump constant value attribute to file stream on binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/Deprecated.java b/src/java/org/apache/bcel/classfile/Deprecated.java index 410be68f..456f53e3 100644 --- a/src/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/java/org/apache/bcel/classfile/Deprecated.java @@ -96,7 +96,7 @@ public final class Deprecated extends Attribute { * @param length Content length in bytes * @param file Input stream * @param constant_pool Array of constants - * @throw IOException + * @throws IOException */ Deprecated(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException @@ -125,7 +125,7 @@ public final class Deprecated extends Attribute { * Dump source file attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/ExceptionTable.java b/src/java/org/apache/bcel/classfile/ExceptionTable.java index 0f26b1f4..a2ee795f 100644 --- a/src/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/java/org/apache/bcel/classfile/ExceptionTable.java @@ -102,7 +102,7 @@ public final class ExceptionTable extends Attribute { * @param length Content length in bytes * @param file Input stream * @param constant_pool Array of constants - * @throw IOException + * @throws IOException */ ExceptionTable(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException @@ -131,7 +131,7 @@ public final class ExceptionTable extends Attribute { * Dump exceptions attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/java/org/apache/bcel/classfile/FieldOrMethod.java index a32d1a85..1b758cd1 100644 --- a/src/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -83,8 +83,8 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No /** * Construct object from file stream. * @param file Input stream - * @throw IOException - * @throw ClassFormatError + * @throws IOException + * @throws ClassFormatError */ protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) throws IOException, ClassFormatError @@ -120,7 +120,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * Dump object to file stream on binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/InnerClass.java b/src/java/org/apache/bcel/classfile/InnerClass.java index 21e0b0bb..21642728 100644 --- a/src/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/java/org/apache/bcel/classfile/InnerClass.java @@ -83,7 +83,7 @@ public final class InnerClass implements Cloneable, Node { /** * Construct object from file stream. * @param file Input stream - * @throw IOException + * @throws IOException */ InnerClass(DataInputStream file) throws IOException { @@ -120,7 +120,7 @@ public final class InnerClass implements Cloneable, Node { * Dump inner class attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/InnerClasses.java b/src/java/org/apache/bcel/classfile/InnerClasses.java index beefa38e..30cbf0dc 100644 --- a/src/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/java/org/apache/bcel/classfile/InnerClasses.java @@ -102,7 +102,7 @@ public final class InnerClasses extends Attribute { * @param length Content length in bytes * @param file Input stream * @param constant_pool Array of constants - * @throw IOException + * @throws IOException */ InnerClasses(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException @@ -129,7 +129,7 @@ public final class InnerClasses extends Attribute { * Dump source file attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index dce410cd..c0d1ef1b 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -243,7 +243,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { * Dump class to a file. * * @param file Output file - * @throw IOException + * @throws IOException */ public void dump(File file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/LineNumber.java b/src/java/org/apache/bcel/classfile/LineNumber.java index d7b76ae8..c7ff87ad 100644 --- a/src/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/java/org/apache/bcel/classfile/LineNumber.java @@ -80,7 +80,7 @@ public final class LineNumber implements Cloneable, Node { /** * Construct object from file stream. * @param file Input stream - * @throw IOException + * @throws IOException */ LineNumber(DataInputStream file) throws IOException { @@ -112,7 +112,7 @@ public final class LineNumber implements Cloneable, Node { * Dump line number/pc pair to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/LineNumberTable.java b/src/java/org/apache/bcel/classfile/LineNumberTable.java index bc71ca80..b0dc6fd3 100644 --- a/src/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/java/org/apache/bcel/classfile/LineNumberTable.java @@ -99,7 +99,7 @@ public final class LineNumberTable extends Attribute { * @param name_index Index of name * @param length Content length in bytes * @param file Input stream - * @throw IOException + * @throws IOException * @param constant_pool Array of constants */ LineNumberTable(int name_index, int length, DataInputStream file, @@ -126,7 +126,7 @@ public final class LineNumberTable extends Attribute { * Dump line number table attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/LocalVariable.java b/src/java/org/apache/bcel/classfile/LocalVariable.java index 76a67c0f..0ff01c67 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariable.java @@ -88,7 +88,7 @@ public final class LocalVariable implements Constants, Cloneable, Node { /** * Construct object from file stream. * @param file Input stream - * @throw IOException + * @throws IOException */ LocalVariable(DataInputStream file, ConstantPool constant_pool) throws IOException @@ -133,7 +133,7 @@ public final class LocalVariable implements Constants, Cloneable, Node { * Dump local variable to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/java/org/apache/bcel/classfile/LocalVariableTable.java index 809b6406..a440b838 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -99,7 +99,7 @@ public class LocalVariableTable extends Attribute { * @param length Content length in bytes * @param file Input stream * @param constant_pool Array of constants - * @throw IOException + * @throws IOException */ LocalVariableTable(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException @@ -128,7 +128,7 @@ public class LocalVariableTable extends Attribute { * Dump local variable table attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/Method.java b/src/java/org/apache/bcel/classfile/Method.java index 7acf4389..ad094931 100644 --- a/src/java/org/apache/bcel/classfile/Method.java +++ b/src/java/org/apache/bcel/classfile/Method.java @@ -82,8 +82,8 @@ public final class Method extends FieldOrMethod { /** * Construct object from file stream. * @param file Input stream - * @throw IOException - * @throw ClassFormatError + * @throws IOException + * @throws ClassFormatError */ Method(DataInputStream file, ConstantPool constant_pool) throws IOException, ClassFormatError diff --git a/src/java/org/apache/bcel/classfile/PMGClass.java b/src/java/org/apache/bcel/classfile/PMGClass.java index d76b34c8..24aef906 100644 --- a/src/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/java/org/apache/bcel/classfile/PMGClass.java @@ -84,7 +84,7 @@ public final class PMGClass extends Attribute { * @param length Content length in bytes * @param file Input stream * @param constant_pool Array of constants - * @throw IOException + * @throws IOException */ PMGClass(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException @@ -122,7 +122,7 @@ public final class PMGClass extends Attribute { * Dump source file attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/Signature.java b/src/java/org/apache/bcel/classfile/Signature.java index dd53184d..b6269f79 100644 --- a/src/java/org/apache/bcel/classfile/Signature.java +++ b/src/java/org/apache/bcel/classfile/Signature.java @@ -82,7 +82,7 @@ public final class Signature extends Attribute { * @param length Content length in bytes * @param file Input stream * @param constant_pool Array of constants - * @throw IOException + * @throws IOException */ Signature(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException @@ -119,7 +119,7 @@ public final class Signature extends Attribute { * Dump source file attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/SourceFile.java b/src/java/org/apache/bcel/classfile/SourceFile.java index a7215d1d..cdb69547 100644 --- a/src/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/java/org/apache/bcel/classfile/SourceFile.java @@ -85,7 +85,7 @@ public final class SourceFile extends Attribute { * @param length Content length in bytes * @param file Input stream * @param constant_pool Array of constants - * @throw IOException + * @throws IOException */ SourceFile(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException @@ -128,7 +128,7 @@ public final class SourceFile extends Attribute { * Dump source file attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/StackMap.java b/src/java/org/apache/bcel/classfile/StackMap.java index 50460ebc..064755e6 100644 --- a/src/java/org/apache/bcel/classfile/StackMap.java +++ b/src/java/org/apache/bcel/classfile/StackMap.java @@ -95,7 +95,7 @@ public final class StackMap extends Attribute implements Node { * @param name_index Index of name * @param length Content length in bytes * @param file Input stream - * @throw IOException + * @throws IOException * @param constant_pool Array of constants */ StackMap(int name_index, int length, DataInputStream file, @@ -114,7 +114,7 @@ public final class StackMap extends Attribute implements Node { * Dump line number table attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/StackMapEntry.java b/src/java/org/apache/bcel/classfile/StackMapEntry.java index a64184ea..0ee9a3e2 100644 --- a/src/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/java/org/apache/bcel/classfile/StackMapEntry.java @@ -78,7 +78,7 @@ public final class StackMapEntry implements Cloneable { /** * Construct object from file stream. * @param file Input stream - * @throw IOException + * @throws IOException */ StackMapEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { @@ -111,7 +111,7 @@ public final class StackMapEntry implements Cloneable { * Dump stack map entry * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/StackMapType.java b/src/java/org/apache/bcel/classfile/StackMapType.java index 39f63092..a212984f 100644 --- a/src/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/java/org/apache/bcel/classfile/StackMapType.java @@ -75,7 +75,7 @@ public final class StackMapType implements Cloneable { /** * Construct object from file stream. * @param file Input stream - * @throw IOException + * @throws IOException */ StackMapType(DataInputStream file, ConstantPool constant_pool) throws IOException { @@ -115,7 +115,7 @@ public final class StackMapType implements Cloneable { * Dump type entries to file. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/Synthetic.java b/src/java/org/apache/bcel/classfile/Synthetic.java index 234c1683..96523002 100644 --- a/src/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/java/org/apache/bcel/classfile/Synthetic.java @@ -102,7 +102,7 @@ public final class Synthetic extends Attribute { * @param length Content length in bytes * @param file Input stream * @param constant_pool Array of constants - * @throw IOException + * @throws IOException */ Synthetic(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException @@ -129,7 +129,7 @@ public final class Synthetic extends Attribute { * Dump source file attribute to file stream in binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/Unknown.java b/src/java/org/apache/bcel/classfile/Unknown.java index 56c9ab4d..60ac7049 100644 --- a/src/java/org/apache/bcel/classfile/Unknown.java +++ b/src/java/org/apache/bcel/classfile/Unknown.java @@ -126,7 +126,7 @@ public final class Unknown extends Attribute { * @param length Content length in bytes * @param file Input stream * @param constant_pool Array of constants - * @throw IOException + * @throws IOException */ Unknown(int name_index, int length, DataInputStream file, ConstantPool constant_pool) @@ -154,7 +154,7 @@ public final class Unknown extends Attribute { * Dump unknown bytes to file stream. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 6eb2a696..762b1646 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -561,7 +561,7 @@ public abstract class Utility { /** * @param signature Method signature * @return Array of argument types - * @throw ClassFormatError + * @throws ClassFormatError */ public static final String[] methodSignatureArgumentTypes(String signature) throws ClassFormatError @@ -573,7 +573,7 @@ public abstract class Utility { * @param signature Method signature * @param chopit Shorten class names ? * @return Array of argument types - * @throw ClassFormatError + * @throws ClassFormatError */ public static final String[] methodSignatureArgumentTypes(String signature, boolean chopit) @@ -604,7 +604,7 @@ public abstract class Utility { /** * @param signature Method signature * @return return type of method - * @throw ClassFormatError + * @throws ClassFormatError */ public static final String methodSignatureReturnType(String signature) throws ClassFormatError @@ -615,7 +615,7 @@ public abstract class Utility { * @param signature Method signature * @param chopit Shorten class names ? * @return return type of method - * @throw ClassFormatError + * @throws ClassFormatError */ public static final String methodSignatureReturnType(String signature, boolean chopit) @@ -681,7 +681,7 @@ public abstract class Utility { * @param name Method name * @param access Method access rights * @return Java type declaration - * @throw ClassFormatError + * @throws ClassFormatError */ public static final String methodSignatureToString(String signature, String name, @@ -1128,6 +1128,11 @@ public abstract class Utility { } public static final String printArray(Object[] obj, boolean braces) { + return printArray(obj, braces, false); + } + + public static final String printArray(Object[] obj, boolean braces, + boolean quote) { if(obj == null) return null; @@ -1136,13 +1141,15 @@ public abstract class Utility { buf.append('{'); for(int i=0; i < obj.length; i++) { - if(obj[i] != null) - buf.append(obj[i].toString()); - else + if(obj[i] != null) { + buf.append((quote? "\"" : "") + obj[i].toString() + (quote? "\"" : "")); + } else { buf.append("null"); + } - if(i < obj.length - 1) + if(i < obj.length - 1) { buf.append(", "); + } } if(braces) diff --git a/src/java/org/apache/bcel/generic/IXOR.java b/src/java/org/apache/bcel/generic/IXOR.java index acc44df9..5ce6afa0 100644 --- a/src/java/org/apache/bcel/generic/IXOR.java +++ b/src/java/org/apache/bcel/generic/IXOR.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *

        Stack: ..., value1, value2 -> ..., result
        * * @version $Id$ - * @authXOR M. Dahm + * @author M. Dahm */ public class IXOR extends ArithmeticInstruction { public IXOR() { diff --git a/src/java/org/apache/bcel/generic/InstructionList.java b/src/java/org/apache/bcel/generic/InstructionList.java index 2d521967..d68724bd 100644 --- a/src/java/org/apache/bcel/generic/InstructionList.java +++ b/src/java/org/apache/bcel/generic/InstructionList.java @@ -1213,10 +1213,10 @@ public class InstructionList implements Serializable { /** * Redirect all references of local variables from old_target to new_target. * - * @@param lg array of local variables - * @@param old_target the old target instruction handle - * @@param new_target the new target instruction handle - * @@see MethodGen + * @param lg array of local variables + * @param old_target the old target instruction handle + * @param new_target the new target instruction handle + * @see MethodGen */ public void redirectLocalVariables(LocalVariableGen[] lg, InstructionHandle old_target, @@ -1236,10 +1236,10 @@ public class InstructionList implements Serializable { /** * Redirect all references of exception handlers from old_target to new_target. * - * @@param exceptions array of exception handlers - * @@param old_target the old target instruction handle - * @@param new_target the new target instruction handle - * @@see MethodGen + * @param exceptions array of exception handlers + * @param old_target the old target instruction handle + * @param new_target the new target instruction handle + * @see MethodGen */ public void redirectExceptionHandlers(CodeExceptionGen[] exceptions, InstructionHandle old_target, diff --git a/src/java/org/apache/bcel/generic/LXOR.java b/src/java/org/apache/bcel/generic/LXOR.java index 8e72cf12..991a6eb7 100644 --- a/src/java/org/apache/bcel/generic/LXOR.java +++ b/src/java/org/apache/bcel/generic/LXOR.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
        Stack: ..., value1, value2 -> ..., result
        * * @version $Id$ - * @authXOR M. Dahm + * @author M. Dahm */ public class LXOR extends ArithmeticInstruction { public LXOR() { diff --git a/src/java/org/apache/bcel/generic/LineNumberGen.java b/src/java/org/apache/bcel/generic/LineNumberGen.java index 38ed2fa0..8b7cbde2 100644 --- a/src/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/java/org/apache/bcel/generic/LineNumberGen.java @@ -74,7 +74,6 @@ public class LineNumberGen implements InstructionTargeter, Cloneable { * Create a line number. * * @param ih instruction handle to reference - * @return new line number object */ public LineNumberGen(InstructionHandle ih, int src_line) { setInstruction(ih); -- GitLab From 610e215231ba1bd6126cc75812c7173cac172967 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 11 Mar 2002 17:00:48 +0000 Subject: [PATCH 0062/1313] new create method git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152752 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/generic/InstructionFactory.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/java/org/apache/bcel/generic/InstructionFactory.java b/src/java/org/apache/bcel/generic/InstructionFactory.java index 01b77695..4c20bfa7 100644 --- a/src/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/java/org/apache/bcel/generic/InstructionFactory.java @@ -138,6 +138,26 @@ public class InstructionFactory implements InstructionConstants { return il; } + /** Uses PUSH to push a constant value onto the stack. + * @param value must be of type Number, Boolean, Character or String + */ + public Instruction createConstant(Object value) { + PUSH push; + + if(value instanceof Number) + push = new PUSH(cp, (Number)value); + else if(value instanceof String) + push = new PUSH(cp, (String)value); + else if(value instanceof Boolean) + push = new PUSH(cp, (Boolean)value); + else if(value instanceof Character) + push = new PUSH(cp, (Character)value); + else + throw new ClassGenException("Illegal type: " + value.getClass()); + + return push.getInstruction(); + } + private static class MethodObject { Type[] arg_types; Type result_type; -- GitLab From 183ee5dc51d41957bee0702364f0bd7049513691 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 11 Mar 2002 17:19:49 +0000 Subject: [PATCH 0063/1313] new utility method git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152753 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/ConstantValue.java | 33 ++----------------- .../org/apache/bcel/classfile/Utility.java | 27 +++++++++++++++ src/java/org/apache/bcel/generic/DCONST.java | 2 +- src/java/org/apache/bcel/generic/FCONST.java | 2 +- src/java/org/apache/bcel/generic/ICONST.java | 2 +- src/java/org/apache/bcel/generic/LCONST.java | 2 +- 6 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/ConstantValue.java b/src/java/org/apache/bcel/classfile/ConstantValue.java index 82fc8a3e..0177fec6 100644 --- a/src/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/java/org/apache/bcel/classfile/ConstantValue.java @@ -84,7 +84,7 @@ public final class ConstantValue extends Attribute { * @param length Content length in bytes * @param file Input stream * @param constant_pool Array of constants - * @throws IOException + * @throw IOException */ ConstantValue(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException @@ -120,7 +120,7 @@ public final class ConstantValue extends Attribute { * Dump constant value attribute to file stream on binary format. * * @param file Output file stream - * @throws IOException + * @throw IOException */ public final void dump(DataOutputStream file) throws IOException { @@ -158,7 +158,7 @@ public final class ConstantValue extends Attribute { case Constants.CONSTANT_String: i = ((ConstantString)c).getStringIndex(); c = constant_pool.getConstant(i, Constants.CONSTANT_Utf8); - buf = "\"" + convertString(((ConstantUtf8)c).getBytes()) + "\""; + buf = "\"" + Utility.convertString(((ConstantUtf8)c).getBytes()) + "\""; break; default: throw new InternalError("Type of ConstValue invalid: " + c); } @@ -166,33 +166,6 @@ public final class ConstantValue extends Attribute { return buf; } - /** - * Escape all occurences of newline chars '\n', quotes \", etc. - */ - private static final String convertString(String label) { - char[] ch = label.toCharArray(); - StringBuffer buf = new StringBuffer(); - - for(int i=0; i < ch.length; i++) { - switch(ch[i]) { - case '\n': - buf.append("\\n"); break; - case '\r': - buf.append("\\r"); break; - case '\"': - buf.append("\\\""); break; - case '\'': - buf.append("\\'"); break; - case '\\': - buf.append("\\\\"); break; - default: - buf.append(ch[i]); break; - } - } - - return buf.toString(); - } - /** * @return deep copy of this attribute */ diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 762b1646..8d32face 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -1359,4 +1359,31 @@ public abstract class Utility { write(str.toCharArray(), off, len); } } + + /** + * Escape all occurences of newline chars '\n', quotes \", etc. + */ + public static final String convertString(String label) { + char[] ch = label.toCharArray(); + StringBuffer buf = new StringBuffer(); + + for(int i=0; i < ch.length; i++) { + switch(ch[i]) { + case '\n': + buf.append("\\n"); break; + case '\r': + buf.append("\\r"); break; + case '\"': + buf.append("\\\""); break; + case '\'': + buf.append("\\'"); break; + case '\\': + buf.append("\\\\"); break; + default: + buf.append(ch[i]); break; + } + } + + return buf.toString(); + } } diff --git a/src/java/org/apache/bcel/generic/DCONST.java b/src/java/org/apache/bcel/generic/DCONST.java index 7f07a270..7a937d2a 100644 --- a/src/java/org/apache/bcel/generic/DCONST.java +++ b/src/java/org/apache/bcel/generic/DCONST.java @@ -57,7 +57,7 @@ package org.apache.bcel.generic; /** * DCONST - Push 0.0 or 1.0, other values cause an exception * - *
        Stack: ... -> ..., 
        + *
        Stack: ... -> ..., 
        * * @version $Id$ * @author M. Dahm diff --git a/src/java/org/apache/bcel/generic/FCONST.java b/src/java/org/apache/bcel/generic/FCONST.java index d90fa28f..cca350bf 100644 --- a/src/java/org/apache/bcel/generic/FCONST.java +++ b/src/java/org/apache/bcel/generic/FCONST.java @@ -57,7 +57,7 @@ package org.apache.bcel.generic; /** * FCONST - Push 0.0, 1.0 or 2.0, other values cause an exception * - *
        Stack: ... -> ..., 
        + *
        Stack: ... -> ..., 
        * * @version $Id$ * @author M. Dahm diff --git a/src/java/org/apache/bcel/generic/ICONST.java b/src/java/org/apache/bcel/generic/ICONST.java index 39e08329..145f2e25 100644 --- a/src/java/org/apache/bcel/generic/ICONST.java +++ b/src/java/org/apache/bcel/generic/ICONST.java @@ -57,7 +57,7 @@ package org.apache.bcel.generic; /** * ICONST - Push value between -1, ..., 5, other values cause an exception * - *
        Stack: ... -> ..., 
        + *
        Stack: ... -> ..., 
        * * @version $Id$ * @author M. Dahm diff --git a/src/java/org/apache/bcel/generic/LCONST.java b/src/java/org/apache/bcel/generic/LCONST.java index a0ca5433..e5245c0f 100644 --- a/src/java/org/apache/bcel/generic/LCONST.java +++ b/src/java/org/apache/bcel/generic/LCONST.java @@ -57,7 +57,7 @@ package org.apache.bcel.generic; /** * LCONST - Push 0 or 1, other values cause an exception * - *
        Stack: ... -> ..., 
        + *
        Stack: ... -> ..., 
        * * @version $Id$ * @author M. Dahm -- GitLab From 4ccf2cc0afb02525a3f0b85b7519b9a90170f612 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 12 Mar 2002 09:24:01 +0000 Subject: [PATCH 0064/1313] docu fixes, instruction.getName() git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152754 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/IINC.java | 4 ++++ .../org/apache/bcel/generic/Instruction.java | 18 +++++++++++++----- .../bcel/generic/InstructionFactory.java | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/bcel/generic/IINC.java b/src/java/org/apache/bcel/generic/IINC.java index 3eebbf90..2a163ef3 100644 --- a/src/java/org/apache/bcel/generic/IINC.java +++ b/src/java/org/apache/bcel/generic/IINC.java @@ -72,6 +72,10 @@ public class IINC extends LocalVariableInstruction { */ IINC() {} + /** + * @param n index of local variable + * @param c increment factor + */ public IINC(int n, int c) { super(); // Default behaviour of LocalVariableInstruction causes error diff --git a/src/java/org/apache/bcel/generic/Instruction.java b/src/java/org/apache/bcel/generic/Instruction.java index 1dc84b8f..6a70ca8a 100644 --- a/src/java/org/apache/bcel/generic/Instruction.java +++ b/src/java/org/apache/bcel/generic/Instruction.java @@ -89,6 +89,12 @@ public abstract class Instruction implements Cloneable, Serializable { out.writeByte(opcode); // Common for all instructions } + /** @return name of instruction, i.e., opcode name + */ + public String getName() { + return Constants.OPCODE_NAMES[opcode]; + } + /** * Long output format: * @@ -100,9 +106,9 @@ public abstract class Instruction implements Cloneable, Serializable { */ public String toString(boolean verbose) { if(verbose) - return Constants.OPCODE_NAMES[opcode] + "[" + opcode + "](" + length + ")"; + return getName() + "[" + opcode + "](" + length + ")"; else - return Constants.OPCODE_NAMES[opcode]; + return getName(); } /** @@ -180,18 +186,20 @@ public abstract class Instruction implements Cloneable, Serializable { * and initialize it by hand. */ Class clazz; + try { clazz = Class.forName(className(opcode)); - } - catch (ClassNotFoundException cnfe){ + } catch (ClassNotFoundException cnfe){ // If a class by that name does not exist, the opcode is illegal. // Note that IMPDEP1, IMPDEP2, BREAKPOINT are also illegal in a sense. throw new ClassGenException("Illegal opcode detected."); } + try { obj = (Instruction)clazz.newInstance(); - if(wide && !((obj instanceof LocalVariableInstruction) || (obj instanceof IINC) || + if(wide && !((obj instanceof LocalVariableInstruction) || + (obj instanceof IINC) || (obj instanceof RET))) throw new Exception("Illegal opcode after wide: " + opcode); diff --git a/src/java/org/apache/bcel/generic/InstructionFactory.java b/src/java/org/apache/bcel/generic/InstructionFactory.java index 4c20bfa7..654363ee 100644 --- a/src/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/java/org/apache/bcel/generic/InstructionFactory.java @@ -577,7 +577,7 @@ public class InstructionFactory implements InstructionConstants { } /** Create branch instruction by given opcode, except LOOKUPSWITCH and TABLESWITCH. - * For those you should use the SWITCH compeund instruction. + * For those you should use the SWITCH compound instruction. */ public static BranchInstruction createBranchInstruction(short opcode, InstructionHandle target) { switch(opcode) { -- GitLab From f9c55314dd9634dff16db0cabead85d39e7efcdd Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 12 Mar 2002 17:04:03 +0000 Subject: [PATCH 0065/1313] bug fix causing nullpointer git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152755 13f79535-47bb-0310-9956-ffa450edef68 --- examples/JasminVisitor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/JasminVisitor.java b/examples/JasminVisitor.java index 6a57616a..3e92f6ab 100644 --- a/examples/JasminVisitor.java +++ b/examples/JasminVisitor.java @@ -85,11 +85,11 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { } public void visitMethod(Method method) { + this._method = method; // Remember for use in subsequent visitXXX calls + out.println("\n.method " + Utility.accessToString(_method.getAccessFlags()) + " " + _method.getName() + _method.getSignature()); - this._method = method; // Remember for use in subsequent visitXXX calls - Attribute[] attributes = _method.getAttributes(); if((attributes == null) || (attributes.length == 0)) out.println(".end method"); -- GitLab From 86b4aa2d707e56898bc78a9656e7475620de3795 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 12 Mar 2002 17:52:00 +0000 Subject: [PATCH 0066/1313] Generate BCEL-Java code from class git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152756 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/util/BCELFactory.java | 347 ++++++++++++++++++ src/java/org/apache/bcel/util/BCELifier.java | 301 +++++++++++++++ 2 files changed, 648 insertions(+) create mode 100644 src/java/org/apache/bcel/util/BCELFactory.java create mode 100644 src/java/org/apache/bcel/util/BCELifier.java diff --git a/src/java/org/apache/bcel/util/BCELFactory.java b/src/java/org/apache/bcel/util/BCELFactory.java new file mode 100644 index 00000000..01386ec2 --- /dev/null +++ b/src/java/org/apache/bcel/util/BCELFactory.java @@ -0,0 +1,347 @@ +package org.apache.bcel.util; + +import org.apache.bcel.generic.*; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.Constants; +import java.io.PrintWriter; +import java.util.*; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Factory creates il.append() statements, and sets instruction targets. + * A helper class for BCELifier. + * + * @see BCELifier + * @version $Id$ + * @author M. Dahm + */ +class BCELFactory extends EmptyVisitor { + private MethodGen _mg; + private PrintWriter _out; + private ConstantPoolGen _cp; + + BCELFactory(MethodGen mg, PrintWriter out) { + _mg = mg; + _cp = mg.getConstantPool(); + _out = out; + } + + private HashMap branch_map = new HashMap(); // Map + + public void start() { + for(InstructionHandle ih = _mg.getInstructionList().getStart(); + ih != null; ih = ih.getNext()) { + Instruction i = ih.getInstruction(); + + if(i instanceof BranchInstruction) { + branch_map.put(i, ih); // memorize container + } + + if(ih.hasTargeters()) { + if(i instanceof BranchInstruction) { + _out.println(" InstructionHandle ih_" + ih.getPosition() + ";"); + } else { + _out.print(" InstructionHandle ih_" + ih.getPosition() + " = "); + } + } else { + _out.print(" "); + } + + if(!visitInstruction(i)) + i.accept(this); + } + + updateBranchTargets(); + updateExceptionHandlers(); + } + + private boolean visitInstruction(Instruction i) { + short opcode = i.getOpcode(); + + if((InstructionConstants.INSTRUCTIONS[opcode] != null) && + !(i instanceof ConstantPushInstruction) && + !(i instanceof ReturnInstruction)) { // Handled below + _out.println("il.append(InstructionConstants." + + i.getName().toUpperCase() + ");"); + return true; + } + + return false; + } + + public void visitLocalVariableInstruction(LocalVariableInstruction i) { + short opcode = i.getOpcode(); + Type type = i.getType(_cp); + + if(opcode == Constants.IINC) { + _out.println("il.append(new IINC(" + i.getIndex() + ", " + + ((IINC)i).getIncrement() + "));"); + } else { + String kind = (opcode < Constants.ISTORE)? "Load" : "Store"; + _out.println("il.append(_factory.create" + kind + "(" + + BCELifier.printType(type) + ", " + + i.getIndex() + "));"); + } + } + + public void visitArrayInstruction(ArrayInstruction i) { + short opcode = i.getOpcode(); + Type type = i.getType(_cp); + String kind = (opcode < Constants.IASTORE)? "Load" : "Store"; + + _out.println("il.append(_factory.createArray" + kind + "(" + + BCELifier.printType(type) + "));"); + } + + public void visitFieldInstruction(FieldInstruction i) { + short opcode = i.getOpcode(); + + String class_name = i.getClassName(_cp); + String field_name = i.getFieldName(_cp); + Type type = i.getFieldType(_cp); + + _out.println("il.append(_factory.createFieldAccess(\"" + + class_name + "\", \"" + field_name + "\", " + + BCELifier.printType(type) + ", " + + "Constants." + Constants.OPCODE_NAMES[opcode].toUpperCase() + + "));"); + } + + public void visitInvokeInstruction(InvokeInstruction i) { + short opcode = i.getOpcode(); + String class_name = i.getClassName(_cp); + String method_name = i.getMethodName(_cp); + Type type = i.getReturnType(_cp); + Type[] arg_types = i.getArgumentTypes(_cp); + + _out.println("il.append(_factory.createInvoke(\"" + + class_name + "\", \"" + method_name + "\", " + + BCELifier.printType(type) + ", " + + BCELifier.printArgumentTypes(arg_types) + ", " + + "Constants." + Constants.OPCODE_NAMES[opcode].toUpperCase() + + "));"); + } + + public void visitAllocationInstruction(AllocationInstruction i) { + CPInstruction in = (CPInstruction)i; + Type type = in.getType(_cp); + short opcode = in.getOpcode(); + int dim = 1; + + switch(opcode) { + case Constants.NEW: + _out.println("il.append(_factory.createNew(\"" + + ((ObjectType)type).getClassName() + "\"));"); + break; + + case Constants.MULTIANEWARRAY: + dim = ((MULTIANEWARRAY)i).getDimensions(); + + case Constants.ANEWARRAY: + case Constants.NEWARRAY: + _out.println("il.append(_factory.createNewArray(\"" + + BCELifier.printType(type) + ", " + dim + "));"); + break; + + default: + throw new RuntimeException("Oops: " + opcode); + } + } + + private void createConstant(Object value) { + String embed = value.toString(); + + if(value instanceof String) + embed = '"' + Utility.convertString(value.toString()) + '"'; + else if(value instanceof Character) + embed = "(char)0x" + Integer.toHexString(((Character)value).charValue()); + + _out.println("il.append(new PUSH(_cp, " + embed + "));"); + } + + public void visitLDC(LDC i) { + createConstant(i.getValue(_cp)); + } + + public void visitLDC2_W(LDC2_W i) { + createConstant(i.getValue(_cp)); + } + + public void visitConstantPushInstruction(ConstantPushInstruction i) { + createConstant(i.getValue()); + } + + public void visitINSTANCEOF(INSTANCEOF i) { + Type type = i.getType(_cp); + + _out.println("il.append(new INSTANCEOF(_cp.addClass(" + + BCELifier.printType(type) + ")));"); + } + + public void visitCHECKCAST(CHECKCAST i) { + Type type = i.getType(_cp); + + _out.println("il.append(_factory.createCheckCast(" + + BCELifier.printType(type) + "));"); + } + + public void visitReturnInstruction(ReturnInstruction i) { + Type type = i.getType(_cp); + + _out.println("il.append(_factory.createReturn(" + + BCELifier.printType(type) + "));"); + } + + // Memorize BranchInstructions that need an update + private ArrayList branches = new ArrayList(); + + public void visitBranchInstruction(BranchInstruction bi) { + BranchHandle bh = (BranchHandle)branch_map.get(bi); + int pos = bh.getPosition(); + String name = bi.getName() + "_" + pos; + + if(bi instanceof Select) { + Select s = (Select)bi; + branches.add(bi); + + StringBuffer args = new StringBuffer("new int[] { "); + int[] matchs = s.getMatchs(); + + for(int i=0; i < matchs.length; i++) { + args.append(matchs[i]); + + if(i < matchs.length - 1) + args.append(", "); + } + + args.append(" }"); + + _out.print(" Select " + name + " = new " + + bi.getName().toUpperCase() + "(" + args + + ", new InstructionHandle[] { "); + + for(int i=0; i < matchs.length; i++) { + _out.print("null"); + + if(i < matchs.length - 1) + _out.print(", "); + } + + _out.println(");"); + } else { + int t_pos = bh.getTarget().getPosition(); + String target; + + if(pos > t_pos) { + target = "ih_" + t_pos; + } else { + branches.add(bi); + target = "null"; + } + + _out.println(" BranchInstruction " + name + + " = _factory.createBranchInstruction(" + + "Constants." + bi.getName().toUpperCase() + ", " + + target + ");"); + } + + if(bh.hasTargeters()) + _out.println(" ih_" + pos + " = il.append(" + name + ");"); + else + _out.println(" il.append(" + name + ");"); + } + + public void visitRET(RET i) { + _out.println("il.append(new RET(" + i.getIndex() + ")));"); + } + + private void updateBranchTargets() { + for(Iterator i = branches.iterator(); i.hasNext(); ) { + BranchInstruction bi = (BranchInstruction)i.next(); + BranchHandle bh = (BranchHandle)branch_map.get(bi); + int pos = bh.getPosition(); + String name = bi.getName() + "_" + pos; + int t_pos = bh.getTarget().getPosition(); + + _out.println(" " + name + ".setTarget(ih_" + t_pos + ");"); + + if(bi instanceof Select) { + InstructionHandle[] ihs = ((Select)bi).getTargets(); + + for(int j = 0; j < ihs.length; j++) { + t_pos = ihs[j].getPosition(); + + _out.println(" " + name + ".setTarget(" + j + + ", ih_" + t_pos + ");"); + } + } + } + } + + private void updateExceptionHandlers() { + CodeExceptionGen[] handlers = _mg.getExceptionHandlers(); + + for(int i=0; i < handlers.length; i++) { + CodeExceptionGen h = handlers[i]; + + _out.println(" method.addExceptionHandler(" + + "ih_" + h.getStartPC().getPosition() + ", " + + "ih_" + h.getEndPC().getPosition() + ", " + + "ih_" + h.getHandlerPC().getPosition() + ", " + + BCELifier.printType(h.getCatchType()) + ");"); + } + } +} diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java new file mode 100644 index 00000000..ebce8dac --- /dev/null +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -0,0 +1,301 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.Repository; +import org.apache.bcel.Constants; +import java.io.*; + +/** + * This class takes a given JavaClass object and converts it to a + * Java program that creates that very class using BCEL. This + * gives new users of BCEL a useful example showing how things + * are done with BCEL. It does not cover all features of BCEL, + * but tries to mimic hand-written code as close as possible. + * + * @version $Id$ + * @author M. Dahm + */ +public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { + private JavaClass _clazz; + private PrintWriter _out; + private DescendingVisitor _visitor; + private ConstantPoolGen _cp; + + /** @param clazz Java class to "decompile" + * @param out where to output Java program + */ + public BCELifier(JavaClass clazz, OutputStream out) { + _clazz = clazz; + _out = new PrintWriter(out); + _cp = new ConstantPoolGen(_clazz.getConstantPool()); + } + + /** Start Java code generation + */ + public void start() { + visitJavaClass(_clazz); + _out.flush(); + } + + public void visitJavaClass(JavaClass clazz) { + String class_name = clazz.getClassName(); + String super_name = clazz.getSuperclassName(); + String package_name = clazz.getPackageName(); + String inter = Utility.printArray(clazz.getInterfaceNames(), + false, true); + + _out.println("import org.apache.bcel.generic.*;"); + _out.println("import org.apache.bcel.classfile.*;"); + _out.println("import org.apache.bcel.*;"); + _out.println("import java.io.*;\n"); + + _out.println("public class " + class_name + "Creator implements Constants {"); + _out.println(" private InstructionFactory _factory;"); + _out.println(" private ConstantPoolGen _cp;"); + _out.println(" private ClassGen _cg;\n"); + + _out.println(" public " + class_name + "Creator() {"); + _out.println(" _cg = new ClassGen(\"" + + (("".equals(package_name))? class_name : + package_name + "." + class_name) + + "\", \"" + super_name + "\", " + + "\"" + clazz.getSourceFileName() + "\", " + + printFlags(clazz.getAccessFlags(), true) + ", " + + "new String[] { " + inter + " });\n"); + + _out.println(" _cp = _cg.getConstantPool();"); + _out.println(" _factory = new InstructionFactory(_cg, _cp);"); + _out.println(" }\n"); + + printCreate(); + + Field[] fields = clazz.getFields(); + + if(fields.length > 0) { + _out.println(" private void createFields() {"); + _out.println(" FieldGen field;"); + + for(int i=0; i < fields.length; i++) { + fields[i].accept(this); + } + + _out.println(" }\n"); + } + + Method[] methods = clazz.getMethods(); + + for(int i=0; i < methods.length; i++) { + _out.println(" private void createMethod_" + i + "() {"); + + methods[i].accept(this); + _out.println(" }\n"); + } + + printMain(); + _out.println("}"); + } + + private void printCreate() { + _out.println(" public void create(OutputStream out) throws IOException {"); + + Field[] fields = _clazz.getFields(); + if(fields.length > 0) { + _out.println(" createFields();"); + } + + Method[] methods = _clazz.getMethods(); + for(int i=0; i < methods.length; i++) { + _out.println(" createMethod_" + i + "();"); + } + + _out.println(" _cg.getJavaClass().dump(out);"); + + _out.println(" }\n"); + } + + private void printMain() { + String class_name = _clazz.getClassName(); + + _out.println(" public static void main(String[] args) throws Exception {"); + _out.println(" " + class_name + "Creator creator = new " + + class_name + "Creator();"); + _out.println(" creator.create(new FileOutputStream(\"" + class_name + + ".class\"));"); + _out.println(" }"); + } + + public void visitField(Field field) { + _out.println("\n field = new FieldGen(" + + printFlags(field.getAccessFlags()) + + ", " + printType(field.getSignature()) + ", \"" + + field.getName() + "\", _cp);"); + + ConstantValue cv = field.getConstantValue(); + + if(cv != null) { + String value = cv.toString(); + _out.println(" field.setInitValue(" + value + ")"); + } + + _out.println(" _cg.addField(field.getField());"); + } + + public void visitMethod(Method method) { + MethodGen mg = new MethodGen(method, _clazz.getClassName(), _cp); + + Type result_type = mg.getReturnType(); + Type[] arg_types = mg.getArgumentTypes(); + + _out.println(" InstructionList il = new InstructionList();"); + _out.println(" MethodGen method = new MethodGen(" + + printFlags(method.getAccessFlags()) + + ", " + printType(result_type) + + ", " + printArgumentTypes(arg_types) + ", " + + "new String[] { " + + Utility.printArray(mg.getArgumentNames(), false, true) + + " }, \"" + method.getName() + "\", \"" + + _clazz.getClassName() + "\", il, _cp);\n"); + + BCELFactory factory = new BCELFactory(mg, _out); + factory.start(); + + _out.println(" method.setMaxStack();"); + _out.println(" method.setMaxLocals();"); + _out.println(" _cg.addMethod(method.getMethod());"); + _out.println(" il.dispose();"); + } + + static String printFlags(int flags) { + return printFlags(flags, false); + } + + static String printFlags(int flags, boolean for_class) { + if(flags == 0) + return "0"; + + StringBuffer buf = new StringBuffer(); + for(int i=0, pow=1; i <= Constants.MAX_ACC_FLAG; i++) { + if((flags & pow) != 0) { + if((pow == Constants.ACC_SYNCHRONIZED) && for_class) + buf.append("ACC_SUPER | "); + else + buf.append("ACC_" + Constants.ACCESS_NAMES[i].toUpperCase() + " | "); + } + + pow <<= 1; + } + + String str = buf.toString(); + return str.substring(0, str.length() - 3); + } + + static String printArgumentTypes(Type[] arg_types) { + if(arg_types.length == 0) + return "Type.NO_ARGS"; + + StringBuffer args = new StringBuffer(); + + for(int i=0; i < arg_types.length; i++) { + args.append(printType(arg_types[i])); + + if(i < arg_types.length - 1) + args.append(", "); + } + + return "new Type[] { " + args.toString() + " }"; + } + + static String printType(Type type) { + return printType(type.getSignature()); + } + + static String printType(String signature) { + Type type = Type.getType(signature); + byte t = type.getType(); + + if(t <= Constants.T_VOID) { + return "Type." + Constants.TYPE_NAMES[t].toUpperCase(); + } else if(type.toString().equals("java.lang.String")) { + return "Type.STRING"; + } else if(type.toString().equals("java.lang.Object")) { + return "Type.OBJECT"; + } else if(type.toString().equals("java.lang.StringBuffer")) { + return "Type.STRINGBUFFER"; + } else if(type instanceof ArrayType) { + ArrayType at = (ArrayType)type; + + return "new ArrayType(" + printType(at.getBasicType()) + + ", " + at.getDimensions() + ")"; + } else { + return "new ObjectType(\"" + Utility.signatureToString(signature, false) + + "\")"; + } + } + + /** Default main method + */ + public static void main(String[] argv) throws Exception { + JavaClass java_class; + String name = argv[0]; + + if((java_class = Repository.lookupClass(name)) == null) + java_class = new ClassParser(name).parse(); // May throw IOException + + BCELifier bcelifier = new BCELifier(java_class, System.out); + bcelifier.start(); + } +} -- GitLab From 6c2ec4bcbdc372ae4d5b47471870ceef354bdd6d Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 12 Mar 2002 17:58:46 +0000 Subject: [PATCH 0067/1313] faq update git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152757 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/faq.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/xdocs/faq.xml b/xdocs/faq.xml index e481a883..d928ca55 100644 --- a/xdocs/faq.xml +++ b/xdocs/faq.xml @@ -10,6 +10,14 @@
        +

        + Q: How can I ... with BCEL? +
        + A: Take a look at + org.apache.bcel.util.BCELifier, it takes a given class + and converts it to a BCEL program (in Java, of course). It will + show you how certain code is generated using BCEL. +

        Q: Is the BCEL thread-safe? @@ -19,6 +27,7 @@ "Concurrent Programming in Java", by Doug Lea, for an excellent reference on how to build thread-safe wrappers.

        +

        Q: Can I use BCEL in a commercial product?
        -- GitLab From ea7703e668716591260035fa316f89d338e3b70a Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 12 Mar 2002 18:01:53 +0000 Subject: [PATCH 0068/1313] totally out of date git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152758 13f79535-47bb-0310-9956-ffa450edef68 --- README | 62 ---------------------------------------------------------- 1 file changed, 62 deletions(-) delete mode 100644 README diff --git a/README b/README deleted file mode 100644 index 2b754740..00000000 --- a/README +++ /dev/null @@ -1,62 +0,0 @@ -********** A lot to do here ... ******************** - -I took the chance to make some changes when moving to Apache. In particular: - -* The package names have changed, just rename the prefix - de.fub.bytecode -> org.apache.bcel -* All deprecated classes and methods have been removed (e.g., - Instruction.getTag() == getOpcode()) -* The FindPattern class has been removed in favor of - org.apache.bcel.util.InstructionFinder which offers an improved API -* The Regex package from Jakarta is used instead of GNU regexp -* BCEL now relies on JDK1.2 classes, collection classes in particular, this - may even speed up BCEL a bit since no more synchronization locks are used -* BCEL is compiled using ANT instead of make - -However, for 99% of the users they will just have to rename the -packages and it will work. - - -There are also some new parts of BCEL, which have been distributed as -separate packages before: - -BCEL Manual ------------ - -The BCEL manual (the former Technical report) is added to the distribution. - - -Class Construction Kit (CCK) ----------------------------- - -The sources can be obtained upon request, however they've been developed -with IBM's VisualAge, thus they're hard to read at best. You can request -and Visual Age repository file as well. CCK has been developed by -Markus Dahm (markus.dahm@berlin.de) - -You can run CCK with java -jar lib/CCK.jar - -JustIce verifier ----------------- - -The JustIce bytecode verifier has been developed by Enver Haase -(enver@convergence.de) and is now an integral part of BCEL. - -Mini ----- - -The Mini programming language is now distributed together with BCEL. - - -New versions ------------- - - http://jakarta.apache.org/bcel/ - -Author ------- - -The BCEL is copyright (2001) Markus Dahm. Send bug reports and -suggestions to markus.dahm@berlin.de (Markus Dahm), please tell me -also if you find this tool helpful and in what kind of projects you -use it. -- GitLab From 8c7065401f91c8a560d9e866ee35274cb536d011 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 12 Mar 2002 18:08:16 +0000 Subject: [PATCH 0069/1313] Generate BCEL-Java code from class git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152759 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/manual.xml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/xdocs/manual.xml b/xdocs/manual.xml index 9048f2fb..b6f216b1 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -1330,8 +1330,7 @@

        -
        -
        +

        @@ -1642,6 +1641,16 @@ public class Peephole { }

        + +
        +

        + If you want to learn how certain things are generated using BCEL you + can do the following: Write your program with the needed features in + Java and compile it as usual. Then use BCELifier to create + a class that creates that very input class using BCEL.
        + (Think about this sentence for a while, or just try it ...) +

        +

        -- GitLab From 2d42ef996add22a99bb3f0581da2fa953cb478f7 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 12 Mar 2002 18:11:04 +0000 Subject: [PATCH 0070/1313] Generate BCEL-Java code from class git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152760 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/manual.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/xdocs/manual.xml b/xdocs/manual.xml index b6f216b1..4df4f995 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -1661,5 +1661,6 @@ public class Peephole {

        +
        -- GitLab From 42ed4d959db06554661427f99bf78a60be78d09e Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 12 Mar 2002 18:11:52 +0000 Subject: [PATCH 0071/1313] Generate BCEL-Java code from class git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152761 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/manual.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xdocs/manual.xml b/xdocs/manual.xml index 4df4f995..f738d141 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -1650,8 +1650,9 @@ public class Peephole { a class that creates that very input class using BCEL.
        (Think about this sentence for a while, or just try it ...)

        +
        -
        +

        @@ -1660,7 +1661,6 @@ public class Peephole { Figure 8: UML diagram for constant pool classes

        -
        -
        +
        -- GitLab From 54202accd72f9e094064234eb49e52118de9503f Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 13 Mar 2002 08:37:00 +0000 Subject: [PATCH 0072/1313] hyperlinked git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152762 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/index.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/xdocs/index.xml b/xdocs/index.xml index 471213de..c886f3d5 100644 --- a/xdocs/index.xml +++ b/xdocs/index.xml @@ -28,9 +28,11 @@

        - BCEL is already being used successfully in several projects such as - compilers, optimizers, obsfuscators and analysis tools, the most - popular probably being the Xalan XSLT processor at Apache. + BCEL is already being used successfully in several projects such + as compilers, optimizers, obsfuscators and analysis tools, the + most popular probably being the . - */ -- GitLab From 2e1483ea99e130df9600d3b742320a4121f4933d Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 15 Mar 2002 08:47:39 +0000 Subject: [PATCH 0074/1313] doc fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152764 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Repository.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index 254d2910..621b343e 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -60,13 +60,13 @@ import java.util.HashMap; import java.io.*; /** - * Repository maintains informations about class interdependencies, e.g. + * The repository maintains informations about class interdependencies, e.g., * whether a class is a sub-class of another. JavaClass objects are put * into a cache which can be purged with clearCache(). * * All JavaClass objects used as arguments must have been obtained via * the repository or been added with addClass() manually. This is - * because we have to check for object identity (==). + * because we have to check for real object identity (==). * * @version $Id$ * @author M. Dahm Date: Fri, 15 Mar 2002 11:19:24 +0000 Subject: [PATCH 0075/1313] Removed an unused method as a result of refactoring and to make it compatible with JDK 1.4 which uses a different method of the same name. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152765 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/exc/AssertionViolatedException.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java index 91b8c6b7..66031eaf 100644 --- a/src/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ b/src/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java @@ -104,12 +104,4 @@ public final class AssertionViolatedException extends RuntimeException{ throw ave; } - /** - * Returns the backtrace of this AssertionViolatedException as a String. - * @return The backtrace of this AssertionViolatedException as a String. - */ - public String getStackTrace(){ - return Utility.getStackTrace(this); - } - } -- GitLab From 77db6f413e37f4ddbe025753a80b5c12b2f83fcf Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Sun, 17 Mar 2002 20:27:13 +0000 Subject: [PATCH 0076/1313] This is the documentation for JustIce, the bytecode verifier of BCEL. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152766 13f79535-47bb-0310-9956-ffa450edef68 --- docs/verifier/GNUmakefile | 37 + docs/verifier/GUI1.eps | 22426 ++++++++++++++++++++++++++++ docs/verifier/GUI2.eps | 22386 +++++++++++++++++++++++++++ docs/verifier/JustIce.lyx | 14186 ++++++++++++++++++ docs/verifier/V_API_SD.eps | 2401 +++ docs/verifier/VennDiag.eps | Bin 0 -> 132738 bytes docs/verifier/VerificationAPI.bmp | Bin 0 -> 797318 bytes docs/verifier/VerificationAPI.eps | 759 + docs/verifier/chap1.bmp | Bin 0 -> 752118 bytes docs/verifier/chap1.eps | 1019 ++ docs/verifier/classfile.eps | 378 + docs/verifier/conventcfg.bmp | Bin 0 -> 375478 bytes docs/verifier/conventcfg.eps | 699 + docs/verifier/exframe.bmp | Bin 0 -> 581478 bytes docs/verifier/exframe.eps | 879 ++ docs/verifier/justicecfg.bmp | Bin 0 -> 377830 bytes docs/verifier/justicecfg.eps | 793 + 17 files changed, 65963 insertions(+) create mode 100644 docs/verifier/GNUmakefile create mode 100644 docs/verifier/GUI1.eps create mode 100644 docs/verifier/GUI2.eps create mode 100644 docs/verifier/JustIce.lyx create mode 100644 docs/verifier/V_API_SD.eps create mode 100644 docs/verifier/VennDiag.eps create mode 100755 docs/verifier/VerificationAPI.bmp create mode 100755 docs/verifier/VerificationAPI.eps create mode 100755 docs/verifier/chap1.bmp create mode 100755 docs/verifier/chap1.eps create mode 100644 docs/verifier/classfile.eps create mode 100755 docs/verifier/conventcfg.bmp create mode 100755 docs/verifier/conventcfg.eps create mode 100755 docs/verifier/exframe.bmp create mode 100755 docs/verifier/exframe.eps create mode 100755 docs/verifier/justicecfg.bmp create mode 100755 docs/verifier/justicecfg.eps diff --git a/docs/verifier/GNUmakefile b/docs/verifier/GNUmakefile new file mode 100644 index 00000000..90d72098 --- /dev/null +++ b/docs/verifier/GNUmakefile @@ -0,0 +1,37 @@ +# JustIce, the class file verifier for use with BCEL was written +# in 2001 by Enver Haase; (c) 2001 Enver Haase. +# +# 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# $Id$ + +RM := rm + +all: psgz + +distclean: clean + $(RM) -rf *~ + +ps: + lyx -e ps JustIce.lyx + +pdf: ps + ps2pdf JustIce.ps JustIce.pdf + +psgz: ps + gzip JustIce.ps + +clean: + $(RM) -rf JustIce.ps JustIce.pdf JustIce.ps.gz diff --git a/docs/verifier/GUI1.eps b/docs/verifier/GUI1.eps new file mode 100644 index 00000000..eb224159 --- /dev/null +++ b/docs/verifier/GUI1.eps @@ -0,0 +1,22426 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 0 0 911 507 +%%HiResBoundingBox: 0.000000 0.000000 911.000000 507.000000 +%......................................... +%%Creator: AFPL Ghostscript 700 (epswrite) +%%CreationDate: 2001/09/18 02:54:38 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%EndComments +%%BeginProlog +% This copyright applies to everything between here and the %%EndProlog: +% Copyright (C) 2001 artofcode LLC, Benicia, CA. All rights reserved. +%%BeginResource: procset GS_epswrite_2_0_1001 +/GS_epswrite_2_0_1001 80 dict dup begin +/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch +4 index eq and{ pop pop pop}{ PageSize dup 1 +5 -1 roll put 0 4 -1 roll put dup where{ exch get exec} +{ pop/setpagedevice where +{ pop 1 dict dup /PageSize PageSize put setpagedevice} +{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat +setpage}if}ifelse}ifelse}ifelse} bind def +/!{bind def}bind def/#{load def}!/N/counttomark # +/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! +/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! +/w/setlinewidth #/J/setlinecap # +/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # +/m/moveto #/l/lineto #/c/rcurveto # +/p{N 2 idiv{N -2 roll rlineto}repeat}! +/P{N 0 gt{N -2 roll moveto p}if}! +/h{p closepath}!/H{P closepath}! +/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! +/re{4 -2 roll m exch dup lx exch ly neg lx h}! +/^{3 index neg 3 index neg}! +/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! +/q/gsave #/Q/grestore #/rf{re fill}! +/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! +/|={pop exch 4 1 roll 3 array astore cvx exch 1 index def exec}! +/|{exch string readstring |=}! +/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! +/@/currentfile #/${+ @ |}! +/B{{2 copy string{readstring pop}aload pop 4 array astore cvx +3 1 roll}repeat pop pop true}! +/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! +/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! +/Ic{exch Ix false 3 colorimage}! +/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> +/CCITTFaxDecode filter}!/FX{<b4`lA&Ys2N'u`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`e9"u!!!"P +KS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)P`l?$us8U*Y`l?$<`l?$< +`l?$<`l?$<`l?!u!!($Y`l?$<`l?$<`l<[bKE(uP`l?$us8U*Y`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`lA&Ys2N'u`l?$<`l?$<`l?$<`l?!u!!($Y`l?$< +`l?$<`l?$<`e9"u!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)P +`l?$us8U*Y`l?$<`l?$<`l?$<`W,u=z!!($Y`l?$<`l?$<`l<[bKE(uP`l?$us8U*Y`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`lA&Ys2N'u`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`e9"u!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u +!!%\*K`D)P`l?$us8U*Y`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l<[bKE(uP`l?$u +s8U*Y`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`lA&Ys8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s+H&Y!!!"P +KS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W*!zzzzzzzzzzz!!!"PKS9C*s8W-!`l?$< +`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`W,u=KS5$Y +s8W-!s8W-!`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$b4`lA&Y +s2N'u`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`e9"u!!!"PKS9C*s8W-!s8W,=`l?$< +`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'! +s8W-!s8W*!!!*'!s8W-!s8W-!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!z!<<*! +s8W*!!!*'!s8W-!s8W-!s8W-!rr<$!!!!$!s8W-!rr<$!s8W-!s8W-!rr<$!s8W-!s8W-!rr<$! +s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-!rr<$! +s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!s8W*!!!*'!s8W-!s8W-!s8W-!rr<$! +s8W-!s8N'!zs8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!s8W*!!!*'!s8W-!!!!$! +s8W-!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-!rr<$!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!s8W-! +s8W-!s8W-!!!!$!s8W-!s8W-!!!!$!s8W-!s8W-!!!!$!s8W-!rr<$!s8W-!s8N'!zs8W-!s8N'! +!<<*!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!s8W*!!!*'!s8W-!s8W*!!!*'!s8W-!s8W*!!!*'! +s8W-!s8W*!!!*'!s8W-!s8W*!!!*'!s8W-!!!!$!s8W-!s8W-!!!!$!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W,=`lA&Ys2N'u`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`e9"u!!!"PKS9C* +s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrBI7!.0%m`l?$us8U*Y`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l<[b +KE(uPKS5$Ys8W-!s8W-!`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$b4`lA&Ys8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s+H&Y!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#U +hVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8N'!!<<*!s8W*!z!<<*!s8W*!!!*'!s8W-!s8W*!!!*'! +s8W-!s8W-!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!z!<<*!s8W*!!!*'!s8W-! +s8W-!s8W-!rr<$!!!!$!s8W-!rr<$!s8W*!!!*'!s8W-!s8W*!!!*'!rr<$!s8W-!s8N'!!<<*! +s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-!rr<$!s8W-!s8N'!!<<*! +s8W*!z!<<*!s8W*!!!*'!s8W-!s8W*!!!*'!s8W-!s8W-!s8W-!rr<$!s8W-!s8N'!zs8W-!s8N'! +!<<*!s8W-!s8N'!!<<*!s8W*!z!<<*!s8W*!!!*'!s8W-!!!!$!s8W-!s8W-!!!!$!s8W-!rr<$! +!!!$!s8W-!rr<$!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!s8W-!s8W-!rr<$!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*! +s8W*!!!*'!s8W-!s8W*!!!*'!s8W-!!!!$!s8W-!s8W-!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-! +s8W*!!!*'!s8W-!z!!*'!s8W-!!!!$!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`lA&Ys2N'u`l?$< +`l?$<`W,u=zzz`l?$<`l?$<`e9"u!!!"PKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!z!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!z +!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`W,u=KS5$Ys8W-!s8W-!`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`lA&Ys2N'u`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`e9"u!!!"PKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C* +s8W*!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*! +!<<'!!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*! +!<<'!!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!zzz!!!$!rrE*!zs8N'!!!*'!z +s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!zs8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$! +rrE*!zzzzs8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +!!!$!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!zs8N*!rrE*!zzz!<<'!s8N*!rrE*!z +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*! +rrE*!!<<'!s8N'!zzz!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!zzzzs8N*!rrE*!zs8N*!rrE*! +!<<'!s8N*!rr<$!z!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'! +s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'! +s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!zzz!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!zz +s8N*!rrE*!!<<'!zzzs8N*!rr<$!!<<'!!!!$!rr<$!!<<'!s8N'!zzz!!*'!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'! +s8N'!!!*'!!<<'!zzz!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'! +s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!zz!<<'!s8N*!rr<$!zz +z!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'! +!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!!!!$!rr<$!!<<'!!!!$!rrE*!zs8N*!rrE*!zs8N*!rrE*!zs8N*!rrE*!!<<'! +s8N'!zzz!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!!<<'! +s8N*!rr<$!!<<'!s8N*!rr<$!zz!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*! +!<<'!s8N*!rrE*!zzzzs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!zs8N'!!!*'!!<<'! +!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'! +s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'! +s8N*!rrE*!zz!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u +`l?!u!!%\*K`D)Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-! +`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!zz!!*'!!<<'!s8N*!rrE*!zz!!*'!!<<'!s8N'! +zz!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zz!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!z!!!$!rr<$!z!!!$! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!z!!!$!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*! +!<<'!s8N'!zz!!!$!rrE*!!<<'!zz!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N'!zzs8N*!rrE*!!<<'!s8N'!zzs8N*!rrE*!zz!!*'!!<<'!s8N*!rr<$! +!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!z!!!$!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!zs8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!z!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zz!!*'!!<<'!s8N*!rr<$!z!!!$!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*! +!<<'!s8N*!rr<$!zs8N*!rrE*!!<<'!s8N*!rr<$!z!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*! +rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!z!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!z!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!z!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7 +!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\* +K`D)Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$< +`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7 +!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8N'! +!<<*!!!!$!s8N'!!<<*!!!!$!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'! +s8W-!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'! +s8W-!!!!$!s8W-!rr<$!s8W-!s8W-!s8W-!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C* +s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*! +rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)P +s8W-!s8N'!zs8W-!s8W-!rr<$!!!!$!s8W-!rr<$!s8W-!s8N'!!<<*!z!!*'!s8W-!s8W*!!!*'! +s8W-!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-!s8W-!s8W-!rr<$!z!!*'!s8W-!s8W*!!!*'!s8W-! +s8W*!!!*'!s8W-!zz!<<*!s8W-!s8N'!!<<*!z!!*'!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rr<$!!<<'! +s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'! +s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'! +!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!zs8N'!!!*'!zs8N*!rr<$!!<<'! +s8N*!rr<$!!<<'!s8N'!!!*'!zs8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*! +!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*! +rrE*!zs8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!z +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*! +rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!!<<'! +s8N*!rr<$!!<<'!!!!$!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rr<$!!<<'! +!!!$!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*! +!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$! +!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'! +!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'! +!!*'!zs8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N'!!!*'!zs8N*!rr<$!!<<'!s8N*! +rr<$!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N'! +!!*'!!<<'!s8N*!rr<$!zzzzs8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'! +!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'! +!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rr<$! +!<<'!!!!$!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!!!!$!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'! +!!*'!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$! +rrE*!!<<'!s8N'!zzzz!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u +!!%\*K`D)Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,= +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$< +`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*! +rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!z!!!$!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*! +rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*! +!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rr<$!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rr<$!zs8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rrE*!zs8N*!rrE*!zs8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rrE*!zs8N*! +rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!z +!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!!!!$!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$! +!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!z!!*'!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!zs8N'!!!*'!!<<'!!!!$! +rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C* +s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C* +s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$< +`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8N'!!<<*!!!!$!s8N'!!<<*!!!!$!s8W-! +rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!!!!$!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'! +s8W-!s8W*!!!*'!s8W-!!!!$!s8W-!rr<$!zzzs8W-!s8N'!!<<*!s8W-!s8N'!!<<*!!!!$!s8W-! +rr<$!s8W-!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!zzz!!*'!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$< +`W,u=!!!"PKS9C*s8W*!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$! +!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*! +!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!z!!!$!rrE*!!<<'!!!!$!rrE*!!<<'! +!!!$!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'! +!!*'!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!zs8N*!rr<$!zs8N*!rr<$!!<<'!s8N'!z!<<'!s8N'! +!!*'!zs8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!zs8N*! +rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!z!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'! +!!!$!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!z!!!$!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'! +s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!zs8N*!rr<$!zs8N*!rr<$! +!<<'!s8N'!z!<<'!s8N'!!!*'!zs8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*! +!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*! +rrE*!zs8N*!rrE*!zs8N*!rrE*!!<<'!z!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$! +rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!zs8N*! +rrE*!!<<'!s8N*!rr<$!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rr<$!!<<'! +s8N*!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!!<<'!s8N*!rr<$! +!<<'!s8N'!z!<<'!s8N'!!!*'!!<<'!z!!*'!!<<'!!!!$!rr<$!!<<'!!!!$!rrE*!zs8N*!rrE*!z +s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'! +s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!z!!!$! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'! +s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!z!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'!s8N*! +rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!z!!*'!!<<'!!!!$! +rrE*!z!!!$!rrE*!zs8N'!!!*'!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N*! +rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'!s8N*! +rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rr<$!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C* +s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8N'!zs8W-!s8W-!rr<$! +!!!$!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!rr<$! +s8W-!s8W-!s8W-!!!!$!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!!!!$!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8N'!zs8W-! +s8W-!s8W-!!!!$!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8N'!!<<*!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!zz!!*'!!<<'! +s8N'!zzz!!*'!!<<'!zzz!!!$!rrE*!z!!!$!rr<$!zs8N*!rr<$!z!!!$!rrE*!!<<'!s8N'!!!*'! +z!!!$!rrE*!z!!!$!rrE*!z!!!$!rrE*!zzzzs8N*!rrE*!zz!!*'!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!z!!!$!rrE*! +!<<'!z!!*'!z!!!$!rrE*!!<<'!s8N'!zzs8N*!rrE*!z!!!$!rrE*!zs8N'!z!<<'!s8N'!z!<<'!z +z!<<'!!!!$!rrE*!!<<'!!!!$!rr<$!zs8N*!rrE*!!<<'!zz!<<'!s8N*!rr<$!zs8N'!z!<<'! +s8N*!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N'!!!*'!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!z!!!$!rrE*!!<<'!z +!!*'!z!!!$!rrE*!!<<'!s8N'!zzs8N*!rrE*!z!!!$!rrE*!zs8N'!z!<<'!s8N'!z!<<'!zz!<<'! +!!!$!rrE*!!<<'!!!!$!rr<$!zs8N*!rrE*!!<<'!zz!<<'!s8N*!rr<$!zs8N'!z!<<'!s8N*! +rrE*!zs8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*! +rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N'!zzs8N*!rrE*!z!!!$! +rr<$!zs8N*!rrE*!!<<'!zz!<<'!s8N*!rr<$!zs8N*!rr<$!!<<'!z!!*'!!<<'!z!!*'!zz!!*'!z +s8N*!rrE*!zs8N'!z!<<'!s8N*!rrE*!zz!!*'!!<<'!s8N'!z!<<'!z!!*'!!<<'!s8N*!rr<$! +!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*! +rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!zz!<<'! +s8N*!rr<$!zs8N'!z!<<'!s8N*!rrE*!zz!!*'!!<<'!s8N'!z!<<'!s8N'!!!*'!z!!!$!rrE*!z +!!!$!rr<$!z!!!$!rr<$!!<<'!s8N*!rr<$!!<<'!z!!*'!!<<'!s8N*!rr<$!z!!!$!rrE*!!<<'!z +!!*'!z!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!z +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\* +K`D)Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$< +`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7 +!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\* +K`D)Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$< +`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7 +!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$< +`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8N'!!<<*!s8W*!!!*'!s8W-!!!!$!s8W-! +rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!z!!*'!rr<$!s8W-!s8N'!!<<*!s8W-!s8W-!rr<$!z!!*'!s8W-!s8W-! +s8N'!z!!!$!s8W-!s8W-!zzzz!!*'!rr<$!s8W-!s8W-!rr<$!s8W-!s8N'!zs8W-!s8W-!s8W-!zz +!<<*!s8W-!s8N'!!<<*!z!!*'!s8W-!s8W*!z!<<*!!!!$!s8W-!s8W-!zz!<<*!s8W-!s8N'!!<<*! +s8W-!s8N'!!<<*!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rr<$!z!!!$! +rrE*!!<<'!s8N*!rr<$!zzz!<<'!zzzs8N*!rrE*!zzz!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rr<$!z!!!$!rrE*!!<<'!s8N'!zzz!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!zzzzz!<<'!s8N'!zz!!!$!rrE*!!<<'!s8N'!zzs8N'!zzs8N'!zzs8N*!rr<$!z!!!$! +rrE*!!<<'!s8N'!zzz!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zz!!*'!!<<'!s8N'!zzz!!*'! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N'!zz!!!$!rrE*!!<<'!s8N'!z!<<'!zzzzz!<<'!s8N*!rr<$!zzz!<<'!s8N'!zzz!!*'! +!<<'!s8N'!zzs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!zz!!*'!!<<'!s8N*!rrE*!zz +!!*'!!<<'!s8N'!zzz!!*'!!<<'!s8N'!zzs8N*!rr<$!zzz!<<'!s8N*!rr<$!z!!!$!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!zzzzs8N*!rr<$!zzz!<<'!zz!<<'!zz!<<'!s8N'!zzz!!*'!zzzz +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!zz!<<'!zz!<<'!zzz!!!$!rr<$!z!!!$!rr<$!z!!!$!rr<$! +zzz!<<'!s8N*!rr<$!zs8N*!rrE*!!<<'!s8N'!zzs8N*!rrE*!!<<'!zz!<<'!s8N'!z!<<'!zz +!<<'!s8N*!rr<$!zz!!*'!zz!!*'!zz!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zzz!<<'!s8N*! +rr<$!zz!!*'!!<<'!s8N*!rr<$!z!!!$!rrE*!!<<'!zz!<<'!s8N*!rrE*!zz!!*'!!<<'!z!!*'!z +z!!*'!!<<'!s8N'!zz!!!$!rr<$!z!!!$!rr<$!z!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!zzz +!!*'!zz!!*'!zz!!*'!!<<'!s8N'!zzs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!zzz!<<'! +zzz!!!$!rrE*!!<<'!zzzs8N*!rrE*!zz!!*'!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!z!!!$!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!zzz!!!$!rrE*!zzzzs8N'!zzs8N'!zzs8N*!rr<$!zz!!*'!zz!!*'!z!!!$! +rrE*!!<<'!z!!*'!zzzzzzzzzz!!!$!rrE*!!<<'!s8N'!zz!!!$!rrE*!zzzzs8N*!rrE*!zz!!*'! +!<<'!s8N*!rr<$!zzzzzzzs8N*!rrE*!zzzzs8N*!rrE*!zzz!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$b4`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#U +hVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8N'!!<<*!!!!$!s8N'!!<<*!!!!$!s8W-!rr<$!s8W-! +s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!s8W-!s8W-!rr<$!zzzs8W-!s8W-!s8W-!s8W-! +s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-!s8W*! +!!*'!s8W-!zzzz!!*'!s8W-!!!!$!s8N'!!<<*!s8W*!!!*'!s8W-!s8W-!s8W-!rr<$!s8W-!s8W-! +rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-! +rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C* +s8W*!s8N*!rrE*!zs8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'! +!!!$!rrE*!zs8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!z!!!$!rrE*!!<<'! +!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N'!!!*'!zs8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*! +rr<$!zs8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!z!!!$!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!z!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!z +!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!z!!!$!rrE*!zs8N*!rrE*!!<<'!!!!$! +rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*! +!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'! +!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*! +!<<'!!!!$!rrE*!!<<'!s8N'!z!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'! +s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!zs8N'!!!*'!!<<'!s8N*! +rr<$!!<<'!s8N*!rrE*!z!!!$!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N'!!!*'! +!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!z!!*'!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rr<$!!<<'!s8N'!z!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N*! +rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!!!!$! +rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!z!!!$!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'! +s8N*!rrE*!zs8N*!rrE*!!<<'!z!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N'!z!<<'!s8N*!rrE*!zs8N*! +rr<$!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rr<$!!<<'! +s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!z!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!zs8N*!rr<$! +!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rr<$!!<<'!!!!$!rrE*!zs8N*!rrE*!zs8N*! +rr<$!!<<'!!!!$!rr<$!!<<'!s8N'!z!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*! +!<<'!z!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!z +!!*'!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$b4`lA&Ys2N'u`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`e9"u!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\* +K`D)Ps8W-!s8N'!!<<*!s8W-!s8W-!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W*!!!*'!s8W-!s8W-!s8W-!rr<$!zzzs8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!zzzz!!*'!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W*!!!*'!s8W-!!!!$!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$us8U*Y`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l<[bKE(uPKS5$Ys8W-!s8W-!`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$< +!!!"PKS9C*s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`lA&Ys2N'u`l?$<`l7uYzzzz!!!#=`l?$<`e9"u!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#U +hVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#O +KS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrBI7!.0%m`l?$us8U*Y`l?$<`l?$<`l7uYzzz!63$u`l?$<`l<[bKE(uPKS5$Y +s8W-!s8W-!`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$b4`lA&Ys2N'u`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`e9"u!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\* +K`D)Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$< +`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7 +!.0%m`l?$us8U*Y`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l<[bKE(uPKS5$Ys8W-! +s8W-!`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$b4`lA&Ys8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s+H&Y +!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8N'!!<<*! +s8W*!!!*'!s8W-!!!!$!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-! +s8W-!s8W-!rr<$!s8W-!s8W-!s8W-!z!!*'!s8W-!!!!$!s8W-!s8W-!!!!$!s8W-!rr<$!s8W-! +s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`W,u=KS5$Ys8W-!s8W-!`l?$<`l<[bKE(uPhVR,h +s8U*Y`l?$ +Q +cleartomark end end pagesave restore showpage +%%PageTrailer +%%Trailer +%%Pages: 1 diff --git a/docs/verifier/GUI2.eps b/docs/verifier/GUI2.eps new file mode 100644 index 00000000..a6927f1c --- /dev/null +++ b/docs/verifier/GUI2.eps @@ -0,0 +1,22386 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 0 0 911 507 +%%HiResBoundingBox: 0.000000 0.000000 911.000000 507.000000 +%......................................... +%%Creator: AFPL Ghostscript 700 (epswrite) +%%CreationDate: 2001/09/18 02:55:20 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%EndComments +%%BeginProlog +% This copyright applies to everything between here and the %%EndProlog: +% Copyright (C) 2001 artofcode LLC, Benicia, CA. All rights reserved. +%%BeginResource: procset GS_epswrite_2_0_1001 +/GS_epswrite_2_0_1001 80 dict dup begin +/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch +4 index eq and{ pop pop pop}{ PageSize dup 1 +5 -1 roll put 0 4 -1 roll put dup where{ exch get exec} +{ pop/setpagedevice where +{ pop 1 dict dup /PageSize PageSize put setpagedevice} +{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat +setpage}if}ifelse}ifelse}ifelse} bind def +/!{bind def}bind def/#{load def}!/N/counttomark # +/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! +/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! +/w/setlinewidth #/J/setlinecap # +/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # +/m/moveto #/l/lineto #/c/rcurveto # +/p{N 2 idiv{N -2 roll rlineto}repeat}! +/P{N 0 gt{N -2 roll moveto p}if}! +/h{p closepath}!/H{P closepath}! +/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! +/re{4 -2 roll m exch dup lx exch ly neg lx h}! +/^{3 index neg 3 index neg}! +/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! +/q/gsave #/Q/grestore #/rf{re fill}! +/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! +/|={pop exch 4 1 roll 3 array astore cvx exch 1 index def exec}! +/|{exch string readstring |=}! +/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! +/@/currentfile #/${+ @ |}! +/B{{2 copy string{readstring pop}aload pop 4 array astore cvx +3 1 roll}repeat pop pop true}! +/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! +/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! +/Ic{exch Ix false 3 colorimage}! +/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> +/CCITTFaxDecode filter}!/FX{<b4`lA&Ys2N'u`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`e9"u!!!"P +KS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)P`l?$us8U*Y`l?$<`l?$< +`l?$<`l?$<`l?!u!!($Y`l?$<`l?$<`l<[bKE(uP`l?$us8U*Y`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`lA&Ys2N'u`l?$<`l?$<`l?$<`l?!u!!($Y +`l?$<`l?$<`l?$<`e9"u!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\* +K`D)P`l?$us8U*Y`l?$<`l?$<`l?$<`W,u=z!!($Y`l?$<`l?$<`l<[bKE(uP`l?$us8U*Y`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`lA&Ys2N'u`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`e9"u!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#U +hVS;4s2N'u`l?!u!!%\*K`D)P`l?$us8U*Y`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l<[bKE(uP`l?$us8U*Y`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$b4`lA&Ys8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s+H&Y!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)P!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZPzzzzzzzzzzz!!!"PKS9C* +s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*! +rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N'!!!*'!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'! +s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!zs8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*! +rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!z +s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'! +!!!$!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*! +!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!zs8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!z +s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`W,u=KS5$Ys8W-!s8W-!`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$b4`lA&Ys2N'u`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`e9"u +!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)P!!%ZP!/(=PK`D)P +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%]Ps8N'!KE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/1CPrr<%P!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%\l`lA&Ys2N'u`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`e9"u!!!"PKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$us8U*Y`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l<[bKE(uPKS5$Ys8W-!s8W-!`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$b4`lA&Ys8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s+H&Y!!!"PKS9C* +s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)P!!%ZP!/(=PK`D)P!!%ZP!/(=P +K`D)Ps8W-!s8W-!rr<%P!!%]Ps8N'!K`D)P!!%ZP!/(=PK`D)Ps8W-!s8W-!rr<%P!!%ZP!/(=P +KE)"*s8W*!!/(=PK`D)P!!%ZP!/(=PK`D)P!!%ZP!/(=PKE)"*!!%]Ps8N'!KE)"*!!%ZP!/(=P +K`D)P!!%ZP!/1CPrr<%P!!%ZP!/1CPrr<%P!!%]Ps8N'!KE)"*s8W-!s8W-!s8W-!s8W*!!/(=P +K`D)P!!%ZP!/(=PKE)"*!!%]Ps8N'!KE)"*s8W*!!/(=PK`D)P!!%ZP!/(=PK`D)P!!%ZP!/1CP +rr<%P!!%ZP!/1CPrr<%P!!%]Ps8N'!KE)"*!!%]Ps8N'!KE)"*s8W*!!/(=PKE)"*!!%ZP!/(=P +KE)"*s8W*!!/(=PK`D)P!!%ZP!/1CPrr<%P!!%ZP!/1CPs8W-!s8W-!s8W-!rr<%P!!%ZP!/1CP +s8W-!s8W-!s8N'!KE)"*s8W*!!/(=PKE)"*s8W*!!/(=PKE)"*s8W*!!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=P +KE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%\l`lA&Ys2N'u`l?$<`l?$<`W,u=zzz`l?$<`l?$< +`e9"u!!!"PKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`W,u=KS5$Ys8W-!s8W-!`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u +`l?!u!!%\*K`D)P!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/1CPrr<%P!!%ZP!/1CPrr<%P!!%ZP!/1CPrr<%P!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%]Ps8N'!KE)"* +s8W*!!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*s8W*!!/(=PK`D)P!!%ZP!/(=PKE)"*s8W*!!/(=PK`D)P!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"* +!!%\l`lA&Ys2N'u`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`e9"u!!!"PKS9C*s8W-! +`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +KS5$Ys8W-!s8W-!`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u +!!%\*K`D)P!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP +!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP +!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP +!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP +!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP +!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP +!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP +!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP +!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP +!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP +!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%ZP!/(=PKE)"*!!%\l +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$< +`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N'! +!!*'!!<<'!s8N'!!!*'!zs8N*!rrE*!zs8N*!rrE*!zs8N*!rrE*!z!!!$!rrE*!!<<'!s8N*!rrE*! +zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rr<$! +!<<'!s8N*!rr<$!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'!!<<'! +s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'! +!!!$!rrE*!zs8N*!rr<$!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$! +!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N'!z!<<'!s8N'!!!*'! +!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N'! +!!*'!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!z +s8N*!rrE*!zs8N*!rrE*!zs8N*!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*! +rrE*!zs8N*!rrE*!!<<'!z!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*! +rrE*!zs8N*!rrE*!zs8N*!rrE*!zs8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N'!z +!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!z +s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rr<$! +!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!!<<'! +s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'! +s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!!!!$!rr<$! +!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'! +s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'! +s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!zs8N'! +!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!z +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'! +!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!zs8N*!rrE*!zs8N*!rrE*! +!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*! +!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C* +s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rr<$!zz +!!*'!!<<'!s8N*!rr<$!z!!!$!rrE*!zz!!*'!zz!!*'!!<<'!zz!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N'!zzs8N*!rr<$!zs8N'!z!<<'!s8N*!rrE*!z +!!!$!rr<$!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'! +!!*'!!<<'!s8N*!rrE*!zz!!*'!!<<'!s8N*!rr<$!zz!!*'!!<<'!s8N'!zz!!!$!rrE*!z!!!$! +rrE*!zs8N*!rrE*!zz!!*'!!<<'!s8N'!zzz!!*'!!<<'!s8N'!!!*'!zs8N*!rrE*!!<<'!zz!<<'! +s8N'!z!<<'!s8N'!z!<<'!z!!*'!z!!!$!rrE*!!<<'!s8N'!z!<<'!!!!$!rrE*!zs8N'!!!*'! +!<<'!s8N'!z!<<'!s8N'!z!<<'!s8N*!rr<$!zz!!*'!!<<'!s8N'!zzs8N*!rr<$!zs8N'!z!<<'! +s8N*!rr<$!zzz!<<'!s8N'!zzs8N*!rrE*!!<<'!s8N'!zzs8N*!rr<$!zs8N'!z!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!zzzs8N*!rrE*!!<<'!zz!<<'! +s8N'!zzs8N'!zzs8N*!rr<$!z!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zz!!*'!!<<'! +s8N*!rrE*!zz!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!z +s8N*!rrE*!zs8N*!rr<$!!<<'!!!!$!rrE*!!<<'!z!!*'!!<<'!z!!*'!!<<'!s8N'!zz!!!$! +rrE*!!<<'!zz!<<'!s8N'!z!<<'!z!!*'!!<<'!s8N'!zzz!!*'!!<<'!zz!<<'!s8N*!rrE*!!<<'! +zz!<<'!s8N'!z!<<'!z!!*'!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!zzs8N'!zzs8N'!zzs8N*!rrE*!!<<'!s8N*!rr<$!!<<'! +s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!z!!!$! +rrE*!!<<'!zzz!!!$!rrE*!zzzzs8N*!rrE*!zz!!*'!!<<'!s8N*!rr<$!zz!!*'!!<<'!zzz!!!$! +rrE*!zz!!*'!!<<'!s8N'!zzs8N'!zzs8N*!rr<$!z!!!$!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*! +rr<$!z!!!$!rr<$!z!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!z!!!$!rrE*!!<<'!s8N'!z +zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!z!!!$!rrE*!!<<'!s8N*!rr<$!zs8N'!zz +!!!$!rr<$!zs8N*!rrE*!!<<'!zz!<<'!s8N*!rr<$!zs8N'!z!<<'!s8N*!rr<$!z!!!$!rrE*! +!<<'!s8N'!z!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zz!!*'!!<<'!z!!*'!z +!!!$!rrE*!!<<'!s8N'!z!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-!rr<$! +s8W-!s8W-!rr<$!!!!$!s8N'!!<<*!s8W-!s8N'!!<<*!s8W-!s8W-!rr<$!!!!$!s8N'!!<<*! +s8W*!!!*'!s8W-!!!!$!s8W-!s8W-!zz!<<*!s8W-!s8N'!!<<*!s8W-!s8W-!rr<$!z!!*'!s8W-! +s8W-!s8N'!!<<*!z!!*'!s8W-!s8W*!!!*'!s8W-!s8W*!zzs8W-!s8W-!s8W-!z!!*'!s8W-!s8W*! +z!<<*!!!!$!s8W-!rr<$!s8W-!s8W-!rr<$!s8W-!s8N'!!<<*!z!!*'!s8W-!s8W-!s8N'!zz!!*'! +s8W-!z!!*'!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u= +!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u +!!%\*K`D)Ps8W-!s8W-!rr<$!s8W-!s8W-!s8W-!s8W-!s8N'!!<<*!s8W*!!!*'!rr<$!s8W-! +s8W-!s8W-!s8W-!s8N'!!<<*!s8W-!s8W-!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-!rr<$!s8W-! +s8W-!s8W-!s8W*!!!*'!s8W-!s8W-!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*! +!!*'!s8W-!!!!$!s8W-!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-!!!!$! +s8W-!rr<$!s8W-!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!s8W*! +!!*'!s8W-!!!!$!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,= +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$< +`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)P +s8W-!s8W-!rr<$!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!!!!$!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!rr<$!z!!*'!s8W-!s8W-!s8N'!!<<*!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-!!!!$!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!!!!$! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"P +KS9C*s8W*!s8N'!zzz!!*'!!<<'!s8N*!rr<$!z!!!$!rrE*!!<<'!s8N'!zzs8N*!rrE*!zzzz +s8N*!rrE*!zzz!<<'!s8N*!rr<$!zzzzz!!*'!zz!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zzzz +s8N'!zzz!!*'!!<<'!s8N'!zz!!!$!rrE*!zzzzs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!zs8N'!z!<<'!s8N*!rrE*!!<<'!!!!$! +rrE*!!<<'!zz!<<'!zz!<<'!s8N*!rr<$!z!!!$!rr<$!z!!!$!rr<$!z!!!$!rrE*!zzz!<<'! +s8N*!rrE*!zz!!*'!!<<'!zzz!!!$!rrE*!!<<'!zz!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!zz!<<'!zz!<<'!zz +!<<'!zzz!!!$!rrE*!!<<'!zz!<<'!s8N*!rrE*!zs8N'!!!*'!!<<'!s8N'!zz!!!$!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!zzzzs8N*!rrE*!zs8N*! +rrE*!!<<'!s8N'!zzz!!*'!!<<'!z!!*'!!<<'!s8N*!rr<$!zzz!<<'!s8N*!rr<$!z!!!$!rrE*! +!<<'!s8N'!z!<<'!s8N*!rrE*!!<<'!zz!<<'!s8N*!rr<$!zz!!*'!!<<'!s8N*!rrE*!zz!!*'! +!<<'!zzz!!!$!rrE*!!<<'!zz!<<'!s8N'!zzs8N'!zzs8N*!rr<$!zzz!<<'!zzz!!!$!rr<$!zz +!!*'!!<<'!s8N*!rrE*!zzzzs8N*!rrE*!zz!!*'!!<<'!s8N'!zzzzzzzzs8N'!z!<<'!s8N'!z +!<<'!s8N*!rr<$!z!!!$!rrE*!!<<'!s8N'!zz!!!$!rrE*!zzz!<<'!s8N*!rrE*!!<<'!zz!<<'! +s8N'!zzz!!*'!!<<'!s8N'!zzs8N*!rr<$!z!!!$!rr<$!z!!!$!rrE*!!<<'!!!!$!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$b4`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$< +`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rr<$!zs8N*!rr<$!!<<'! +s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'!!<<'! +s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!z!!*'!!<<'!!!!$! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!zs8N*!rrE*! +!<<'!!!!$!rrE*!z!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!zz!<<'!s8N*!rr<$! +!<<'!s8N*!rr<$!!<<'!s8N'!z!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!z!!!$! +rrE*!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$! +!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N'!z!<<'!s8N'!!!*'!!<<'! +s8N'!z!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'! +s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'! +s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'! +s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!zs8N*!rr<$!!<<'! +s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$! +!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zz +!!*'!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$! +rrE*!!<<'!!!!$!rrE*!z!!!$!rrE*!zs8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*! +!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!z!!!$!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#O +KS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u +!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-!rr<$!s8W-!s8N'!!<<*!s8W*!z!<<*!s8W-! +s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!z!<<*!s8W-!s8W-!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-! +rr<$!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-!s8W-!s8N'!zs8W-!s8N'!!<<*!s8W-!s8N'!!<<*! +s8W*!!!*'!rr<$!s8W-!s8W-!s8W-!s8W*!!!*'!rr<$!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-! +!!!$!s8W-!s8W-!!!!$!s8W-!s8W-!!!!$!s8W-!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-!s8W-! +s8W-!s8W-!rr<$!s8W*!!!*'!s8W-!!!!$!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*! +s8W*!z!<<*!s8W*!!!*'!s8W-!!!!$!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*! +!!*'!s8W-!s8W*!!!*'!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,= +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$< +`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u +!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*! +!!!$!s8W-!s8W-!!!!$!s8N'!!<<*!s8W-!s8N'!!<<*!s8W-!s8W-!s8W-!!!!$!s8W-!rr<$! +s8W-!s8W-!rr<$!s8W-!s8W-!s8W-!s8W*!!!*'!rr<$!s8W-!s8W-!rr<$!s8W-!s8N'!!<<*! +s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!s8W*!!!*'!rr<$!s8W-!s8W-!rr<$!s8W-!s8N'!!<<*! +s8W*!!!*'!s8W-!!!!$!s8N'!!<<*!s8W-!s8N'!!<<*!!!!$!s8W-!s8W-!!!!$!s8W-!rr<$! +s8W-!s8W-!s8W-!s8W-!s8W-!rr<$!s8W*!!!*'!s8W-!!!!$!s8W-!rr<$!s8W-!s8N'!!<<*! +s8W-!s8N'!!<<*!s8W*!z!<<*!s8W*!!!*'!s8W-!!!!$!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-! +s8N'!!<<*!s8W*!z!<<*!s8W*!!!*'!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C* +s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'! +!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!z!!*'!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +KS5$Ys8W-!s8W-!`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\* +K`D)Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$< +`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!zzz!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'! +!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'! +!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!zzz +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*! +!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*! +!<<'!!!!$!rrE*!zs8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'! +!!!$!rr<$!!<<'!s8N'!zzz!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*! +rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zz!!*'!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'! +s8N'!zz!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*! +rr<$!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!zzz!!!$!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*! +zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!zz!!!$!rrE*!zs8N*!rrE*!!<<'! +s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!zzz!!*'!!<<'!s8N'!zzs8N*!rrE*!!<<'!zz!<<'! +s8N*!rrE*!zz!!*'!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!z +s8N*!rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!zz +!!!$!rrE*!zs8N*!rrE*!zs8N*!rrE*!zzz!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'! +s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!zzz!<<'! +s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'! +s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'! +!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'! +s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!zzzzs8N*!rrE*!zzz!<<'!s8N'!!!*'!zs8N'! +!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!zzzs8N*!rrE*!zs8N*!rrE*!!<<'!s8N'!!!*'! +!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-! +s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!z!!*'!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!zzz!<<'!s8N*!rr<$!z!!!$!rrE*!zzz!<<'!s8N*!rr<$!zzzzs8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rr<$!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!z +!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!zz!<<'!s8N'!z!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!z +!!!$!rrE*!!<<'!s8N'!zzs8N*!rrE*!!<<'!zz!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*! +rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!z!!!$!rrE*!z!!!$! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zzzzs8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!z!!!$!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!zzs8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$b4`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!s8W,=`l?$< +`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8N'!!<<*!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +rr<$!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$b4`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?#OKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-!rr<$! +s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*! +s8W-!s8W-!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-!rr<$!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-! +!!!$!s8W-!s8W-!!!!$!s8W-!rr<$!s8W*!!!*'!s8W-!!!!$!s8W-!s8W-!!!!$!s8W-!rr<$! +s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!s8W*!!!*'!s8W-!!!!$!s8W-!s8W-!s8W-!s8N'!!<<*! +s8W*!!!*'!s8W-!s8W*!!!*'!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-!s8W-!s8W-!s8N'!!<<*! +s8W-!s8W-!s8W-!!!!$!s8W-!rr<$!s8W-!s8W-!s8W-!s8W-!s8W-!rr<$!s8W*!!!*'!s8W-! +!!!$!s8W-!s8W-!s8W-!s8N'!!<<*!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-!s8W*!!!*'!s8W-! +!!!$!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!!<<*!s8W*!!!*'!s8W-!s8W*!!!*'!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$b4`lA&Ys2N'u`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`e9"u +!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-!rr<$! +s8W-!s8W-!rr<$!z!!*'!s8W-!!!!$!s8W-!s8W-!!!!$!s8W-!rr<$!z!!*'!s8W-!s8W-!s8W-! +s8W-!!!!$!s8W-!s8W-!zz!<<*!s8W-!s8W-!s8W-!s8W*!!!*'!s8W-!!!!$!s8N'!zs8W-!s8N'! +!<<*!s8W-!s8N'!!<<*!s8W*!zzs8W-!s8W-!rr<$!s8W-!s8N'!!<<*!s8W-!s8N'!zs8W*!!!*'! +s8W-!!!!$!s8W-!s8W-!s8W-!s8N'!!<<*!s8W*!!!*'!rr<$!!!!$!s8W-!s8W-!!!!$!s8W-! +s8W-!zz!<<*!s8W-!s8W-!rr<$!!!!$!s8W-!rr<$!z!!*'!rr<$!s8W-!s8W-!s8W-!s8W-!s8N'! +!<<*!s8W-!s8N'!!<<*!s8W*!z!<<*!s8W-!s8W-!rr<$!z!!*'!s8W-!s8W*!!!*'!rr<$!!!!$! +s8W-!rr<$!z!!*'!rr<$!s8W-!s8W-!rr<$!z!!*'!s8W-!s8W*!!!*'!rr<$!!!!$!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*! +s8N*!rrE*!zs8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!!!!$! +rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!zzz!<<'!s8N*!rr<$! +!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*! +!<<'!!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*! +!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!z!!!$!rrE*!!<<'!s8N*!rrE*!zs8N*!rr<$!!<<'!s8N*! +rrE*!zs8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!zs8N*!rrE*!!<<'!s8N*!rr<$!!<<'! +!!!$!rr<$!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$!rr<$!!<<'!!!!$!rrE*!zs8N*! +rrE*!zs8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$! +!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*! +!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!zs8N*! +rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!zs8N'!!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!z +s8N'!!!*'!zs8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N'! +!!*'!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*! +rr<$!zzzzs8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!z!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'! +!!!$!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'! +!!*'!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*! +rr<$!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!!!!$! +rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!!!!$! +rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!!!!$! +rrE*!zs8N*!rrE*!zs8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m +`l?$us8U*Y`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l<[bKE(uPKS5$Ys8W-!s8W-! +`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$b4`lA&Ys2N'u`l?$<`l7uYzzzz!!!#=`l?$<`e9"u!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u +!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C*s8W*!s8N*!rrE*!zs8N*!rr<$!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*! +rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!zs8N*!rrE*!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'! +s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!zs8N*! +rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rr<$!!<<'! +s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'!z!<<'!s8N'!!!*'!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*!rr<$! +!<<'!s8N*!rr<$!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!!!!$!rr<$!!<<'!s8N*!rrE*!zs8N*!rrE*!!<<'! +s8N'!!!*'!!<<'!s8N*!rr<$!zs8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rr<$!!<<'!s8N*! +rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!!!!$! +rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*! +rrE*!!<<'!s8N*!rrE*!!<<'!!!!$!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N'! +!!*'!!<<'!s8N'!!!*'!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!zs8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$us8U*Y`l?$<`l?$<`l7uYzzz +!63$u`l?$<`l<[bKE(uPKS5$Ys8W-!s8W-!`l?$<`l<[bKE(uPhVR,hs8U*Y`l?$b4`lA&Ys2N'u`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$< +`e9"u!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C* +s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$us8U*Y +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l<[bKE(uPKS5$Ys8W-!s8W-!`l?$<`l<[b +KE(uPhVR,hs8U*Y`l?$b4`lA&Ys8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s+H&Y!!!"PKS9C*s8W-!s8W,=`l?$<`e9"u!!!#UhVS;4s2N'u`l?!u!!%\*K`D)Ps8W-!s8W-! +rr<$!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!rr<$!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-! +s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W-!s8W,=`l?$<`l?$<`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?#OKS9C*s8W-!`l?$<`l?$<`W,u=!!!"PKS9C* +s8W*!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*! +!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrE*!!<<'!s8N*!rrBI7!.0%m`l?$<`l?$< +`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`l?$<`W,u=KS5$Ys8W-!s8W-!`l?$<`l<[b +KE(uPhVR,hs8U*Y`l?$ +Q +cleartomark end end pagesave restore showpage +%%PageTrailer +%%Trailer +%%Pages: 1 diff --git a/docs/verifier/JustIce.lyx b/docs/verifier/JustIce.lyx new file mode 100644 index 00000000..6d6bde19 --- /dev/null +++ b/docs/verifier/JustIce.lyx @@ -0,0 +1,14186 @@ +#LyX 1.1 created this file. For more info see http://www.lyx.org/ +\lyxformat 218 +\textclass scrbook +\begin_preamble + +\end_preamble +\language english +\inputencoding latin1 +\fontscheme default +\graphics default +\float_placement !htp +\paperfontsize default +\spacing single +\papersize Default +\paperpackage a4wide +\use_geometry 0 +\use_amsmath 0 +\paperorientation portrait +\secnumdepth 2 +\tocdepth 2 +\paragraph_separation indent +\defskip medskip +\quotes_language english +\quotes_times 2 +\papercolumns 1 +\papersides 2 +\paperpagestyle default + +\layout Subject + + +\emph on +Diplomarbeit +\layout Title + +JustIce +\newline + +\size small +A Free Class File Verifier for Java +\latex latex + +\backslash +texttrademark\SpecialChar ~ + +\layout Author + +Enver Haase +\newline + +\size tiny + +\layout Date + +September 2001 +\layout Publishers + +Freie Universität Berlin +\newline +Institut für Informatik +\newline +Takustraße 9 +\newline +D-14195 Berlin +\layout Lowertitleback + + +\series bold +\size scriptsize +Revision +\series default + +\series bold +\shape smallcaps +$Id$ +\layout Minisec + +Erklärung +\begin_float footnote +\layout Standard + +I declare that I wrote this +\emph on +Diplomarbeit +\emph default + completely on my own and without the help of persons not listed. + All sources of information are listed in the Bibliography section. +\end_float +\layout Standard + +Hiermit versichere ich, die vorliegende Diplomarbeit selbständig und ohne + fremde Hilfe verfaßt zu haben. + Es wurden nur die in der Bibliographie angegebenen Quellen benutzt. +\layout Minisec + +Danksagung +\begin_float footnote +\layout Standard + +The creation of this +\emph on +Diplomarbeit +\emph default + paper was supported and supervised by Prof. + Dr. + Elfriede Fehr and Dipl.-Inform. + Markus Dahm. + Keith Seymour suggested a lot of language-related improvements. + Thank you. +\end_float +\layout Standard + +Während der Anfertigung dieser Diplomarbeit wurde ich von Prof. + Dr. + Elfriede Fehr und Dipl.-Inform. + Markus Dahm betreut, wofür ich mich an dieser Stelle herzlich bedanke. +\layout Standard + +Desweiteren bedanke ich mich bei Keith Seymour, der mir eine Reihe sprachspezifi +scher Verbesserungsvorschläge sandte. +\layout Minisec + +Autor +\begin_float footnote +\layout Standard + +Author +\end_float +\layout Standard + +Enver Haase +\newline +Gubener Straße 18 +\newline +D-10243 Berlin +\newline +http://www.inf.fu-berlin.de/~ehaase +\layout Standard + + +\begin_inset LatexCommand \tableofcontents{} + +\end_inset + + +\layout Addchap + +Abstract +\layout Standard + +When Sun Microsystems developed their +\emph on +Java Platform +\emph default + in the early 1990s, it was originally designed for use in networked and + embedded consumer-electronics applications. + But when they introduced it around 1995, it quickly became used in World + Wide Web browser software. + This was a way to bring interactive content to demanding World Wide Web + users. + Sun took great care for the robustness of the platform: they planned to + connect embedded devices and let them share data and code over a network. + Defective devices transmitting bad data or unreliable network connections + should not cause other devices to crash. + This property made Java a good choice for the code-executing engine in + World Wide Web browsers: defective server software or transmission errors + would not cause the +\emph on +Java Platform +\emph default + to crash; this is also true for purposely malicious code hidden on the + Web. + The code-executing part of the +\emph on +Java Platform +\emph default + is called +\emph on +The Java Virtual Machine +\emph default + (the +\emph on +JVM +\emph default +, for short). + This execution engine has to assure that the code to be executed is well-behave +d; it has to +\emph on +verify +\emph default + the code. + Therefore, the +\emph on +verifier +\emph default + is an integral part of every JVM, but JustIce implements a verifier that + is not integrated in a JVM. + It was implemented using a software library called the +\emph on +Byte Code Engineering Library +\emph default + (the +\emph on +BCEL +\emph default +, for short) by Markus Dahm +\begin_inset LatexCommand \cite{BCEL98,BCEL-WWW} + +\end_inset + +. +\layout Standard + +The BCEL is intended to give users a convenient mechanism to analyze, create + and manipulate (binary) Java class files. + It offers an object-oriented view of otherwise raw data, including program + code. + This library is, therefore, well-respected especially in the compiler-writer + community whenever the JVM is chosen as the target machine of the compiler. + Compiler back-ends use the BCEL to produce code for the JVM; and as new + compilers may be faulty, they may produce bad code. + Testing these compilers often is a difficult task. + The generated code should not only be semantically correct, but it also + has to pass the verifiers of all existing JVM implementations. + Normally, a lot of human interaction is required to run test cases. + If the code is rejected by a verifier, one often does not know why. + Most verifiers emit error messages which do not identify the offending + instruction. +\layout Standard + +JustIce presents an Application Programming Interface (API) that may be + used to automate the procedure sketched above. + The constraints imposed on class files are designed to be strict, therefore + eleminating the need to run several verifiers on the generated code. + If code passes the JustIce verifier, it should pass all other verifiers. + JustIce was also designed to output human-understandable messages if the + verification of some code fails. +\layout Standard + +The application range of JustIce is not limited to compiler back-ends, in + the same sense as the BCEL is not only useful in this area. + Transformations of existing code and even generation of hand-crafted code + fall into its scope, too. + As a side effect, JustIce exports some data structures such as a control + flow graph; so its API may also be used for applications targeting other + problem areas such as static analyses of program code. +\layout Chapter + +Introduction +\layout Section + +Low Level Security as a Part of a Many-Tiered Strategy +\layout Standard + +The Java programming language is well-known for its inherent security facilities + such as the lack of pointer arithmetic or the need for memory allocation + and deallocation. + Lesser known is that this is only the top of an iceberg; the +\emph on +Java Platform +\emph default + implements a many-tiered security strategy +\begin_inset LatexCommand \cite{Yellin-WWW} + +\end_inset + +. + It was designed to run even untrusted code -- code that possibly was not + produced by a compiler for the Java programming language, code that may + be corrupt or code that may have malicious intent (such as stealing credit + card number information from a hard disk drive). + Three considerations were made: +\layout Itemize + +Untrusted code could damage hardware, software, or information on the host + machine. +\layout Itemize + +It could pass unauthorized information to anyone. +\layout Itemize + +It could cause the host machine to become unusable through resource depletion. +\layout Standard + +While some security features such as type-safety or the already-mentioned + lack of pointer arithmetic of the Java programming language are a convenient + help for programmers, they can only help to reduce programming errors. + Of course these features do not help targeting the above problems. + At a lower level, however, the +\emph on +Java Plat\SpecialChar \- +form +\emph default + implements a so-called sandbox: an area where code can be executed but + that has well-defined boundaries shielding the rest of the system. + This is achieved by means of a +\emph on +Java Virtual Machine +\emph default + (JVM) emulation; the host platform does not directly run untrusted code, + but a +\emph on +run-time system +\emph default + which in turn runs the code, restricting its access to system resources. +\layout Standard + +A run-time system cannot safely assume that untrusted code is well-behaved. + Code could cause stack overflows, stack underruns, or otherwise erroneous + behaviour that may bring the run-time system into an undefined state -- + possibly allowing access to protected memory areas. + One could protect the run-time system by letting it predict the effects + of every single instruction just in time while actually executing it -- + but that would be too time-consuming to be applicable in practice. +\layout Standard + +Therefore, good behaviour of program code has to be enforced +\emph on +before +\emph default + it is actually executed -- at least as far as this is possible. + This is the lowest level of Java security; there has to be an integral + component in every JVM implementation doing so ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 420). + This part of the JVM is called the +\emph on +class file verifier +\emph default +, yet better known as the +\emph on +bytecode verifier. + +\emph default +Technically speaking, bytecode verification is only a part of class file + verification so +\emph on +class file verifier +\emph default + is a more embracing term. + JustIce implements a whole class file verifier. +\layout Standard + +\begin_float fig +\layout Standard +\align center + +\begin_inset Figure size 595 396 +file chap1.eps +width 3 100 +flags 9 + +\end_inset + + +\layout Caption + +Concept of Class File Verification +\end_float +\layout Section + +Why Another Verifier? +\layout Standard + +As said before, every JVM implementation must contain a class file verifier, + so it is reasonable to ask for the motivation behind creating just another + class file verifier -- especially one that is +\emph on +not +\emph default + part of a JVM implementation. +\layout Subsection + +Bytecode Engineers Need JustIce +\layout Standard + +Shortly after the +\emph on +Java Platform +\emph default + was introduced, it was adopted with pleasure because of its inherent independen +ce from operating systems and concrete hardware. + Industry and educational institutions with heterogenous networked computers + could now run the same software program on different host machines. + Soon, many efforts were put into research and development of compilers + for programming languages other than the Java programming language that + use the JVM bytecode as target. +\layout Standard + +Nowadays, many other programming languages do have the JVM as its target + platform; e.g. + Fortran +\begin_inset LatexCommand \cite{f2j} + +\end_inset + +, Ada +\begin_inset LatexCommand \cite{AppMag-WWW} + +\end_inset + +, Scheme +\begin_inset LatexCommand \cite{KAWA-WWW} + +\end_inset + + or modified Java language versions +\begin_inset LatexCommand \cite{GJ-WWW,PMG-WWW} + +\end_inset + +. + A vast collection of programming languages targeting the JVM can be found + on the World Wide Web +\begin_inset LatexCommand \cite{PL4JVM} + +\end_inset + +. +\layout Standard + +All these compilers emit code for the JVM -- and so all these compilers + have to pass the JVM's verifier. + Implementors of such compilers have to consider the security related constraint +s the JVM poses on the generated code. + It is difficult to test if the emitted code works on all JVM implementations, + passing all JVM verifier implementations. + This is especially problematic if not all of the project's class files + are loaded into the JVM during a test run, because then they will not be + verified. +\layout Standard + +Having an opportunity to verify the transitive hull of referenced class + files (starting with some main class file) would be of help; JustIce offers + it. +\layout Standard + +The Bytecode Engineering Library by Markus Dahm is often used as a compiler + back-end to emit code, but it is also used to hand-craft code or to implement + bytecode transformations. + Because JustIce works closely together with the BCEL, users of the BCEL + do not even have to leave their development environment to run the JustIce + verifier. +\layout Standard + +To our knowledge, JustIce is the only implementation of a Java class file + verifier that was written in the Java programming language +\begin_inset LatexCommand \cite{langspec2} + +\end_inset + + itself +\begin_float footnote +\layout Standard + +In a personal communication, Robert Stärk told the author that there was + a Java implementation of the verifier discussed in +\begin_inset LatexCommand \cite{JBook} + +\end_inset + +, written by Joachim Schmid using the BCEL. + However, it is not released for public use yet. +\end_float +. + Because of its +\emph on +Verification API +\emph default +, it can be included in other software projects written in Java with more + ease than any other verifier implementation in a different programming + language could provide. +\layout Subsection + +JustIce is Verbose +\layout Standard + +Usually, when classes pass the verifier, it is mute. + JustIce, in contrast, distinguishes between verification results and messages. + Messages are often warnings, but the reason for emitting such a warning + instead of a negative verification result is because the class file does + not pose a threat to the integrity of the JVM and thus does not have to + be rejected. +\layout Standard + +When a verification error occurs and the class file is rejected, even the + built-in verifiers usually produce some output saying so. + As an example, consider the following verifier run: +\newline + +\newline + +\family typewriter +ehaase@haneman:/home/ehaase > java Cc +\newline +Exception in thread "main" java.lang.VerifyError: +\newline +(class: Cc, method: ttt signature: ()V) +\newline +Recursive call to jsr entry +\family default + +\newline + +\latex latex + +\newline + +\layout Standard + +One might ask +\emph on +which +\emph default + +\begin_inset Quotes eld +\end_inset + +jsr entry +\begin_inset Quotes erd +\end_inset + + (a branch target of a +\latex latex + +\backslash +texttt{jsr} +\latex default + or a +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + instruction) is called recursively and which instructions may be responsible + for this. + Compare this to JustIce's output: +\newline + +\newline +[...] +\layout Standard + + +\family typewriter +Pass 3b, method number 0 ['public static void ttt()']: +\layout Standard + + +\family typewriter +VERIFIED_REJECTED +\layout Standard + + +\family typewriter +Constraint violated in method 'public static void ttt()': +\layout Standard + + +\family typewriter +Subroutine with local variable '1', JSRs '[ 36: jsr[168](3) -> astore_1, + 8: jsr[168](3) -> astore_1, 30: jsr[168](3) -> astore_1, 23: jsr[168](3) + -> astore_1]', RET ' 62: ret[169](2) 1' is called by a subroutine which + uses the same local variable index as itself; maybe even a recursive call? + JustIce's clean definition of a subroutine forbids both. +\newline + +\family default +[...] +\layout Standard + + +\family typewriter +Warnings: +\layout Standard + + +\family typewriter +Pass 2: Attribute 'LineNumber(0, 4), LineNumber(0, 5), LineNumber(15, 8), + LineNumber(39, 11), LineNumber(47, 12), LineNumber(57, 13), LineNumber(64, + 15)' as an attribute of Code attribute '' (method 'public static + void ttt()') will effectively be ignored and is only useful for debuggers + and such. +\layout Standard + + +\family typewriter +Pass 2: Attribute 'LineNumber(0, 1), LineNumber(4, 1)' as an attribute of + Code attribute '' (method 'public void ()') will effectively + be ignored and is only useful for debuggers and such. +\layout Standard + + +\family typewriter +Pass 3a: LineNumberTable attribute 'LineNumber(0, 4), LineNumber(0, 5), + LineNumber(15, 8), LineNumber(39, 11), LineNumber(47, 12), LineNumber(57, + 13), LineNumber(64, 15)' refers to the same code offset ('0') more than + once which is violating the semantics [but is sometimes produced by IBM's + 'jikes' compiler]. +\newline + +\layout Standard + +This output obviously has an answer to the above question; it shows the + only +\latex latex + +\backslash +texttt{jsr} +\latex default + or +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + instructions possibly responsible for a recursive call (which is not allowed + by the specification of the JVM). + For the special --but clean-- definition of subroutines JustIce uses, please + see section +\begin_inset LatexCommand \ref{Subroutines_Def} + +\end_inset + +. +\layout Standard + +Note also the warning messages. + Class files that were not generated by Sun's +\emph on +javac +\emph default + compiler have a tendency to look a little different in some corner cases. + IBM's +\emph on +jikes +\emph default + compiler, for instance, produces LineNumberTable attributes (see +\begin_inset LatexCommand \ref{LineNumberTableAttribute} + +\end_inset + +) which look different from those created by +\emph on +javac +\emph default +. + Detecting such differences is desirable because future JVMs will have stricter + verification checks +\begin_float footnote +\layout Standard + +The Solaris port of Sun's JVM, version 1.3.0_01, already has (some of) the + stricter checks built in. + You may enable them using the command-line option '-Xfuture'. + Nothing about this issue is mentioned in the specification +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +. +\end_float + (which most old +\emph on +javac +\emph default +-compiled class files will probably still pass). + JustIce guides bytecode engineers to create class files that are indistinguisha +ble from those created by +\emph on +javac +\emph default + to retain compatibility with Sun's future JVM implementations. + Figure +\begin_inset LatexCommand \ref{FigVenn} + +\end_inset + + graphically shows the relationship between class files and the verifier +\begin_float footnote +\layout Standard + +This is a simplicistic figure; unfortunately, there are class files produced + by the +\emph on +javac +\emph default + compiler that do not pass the verifier. + Please see section +\begin_inset LatexCommand \ref{javacRejected} + +\end_inset + + for more details. +\end_float +. +\begin_float fig +\layout Standard +\align center + +\begin_inset Figure size 595 378 +file VennDiag.eps +width 3 100 +height 3 45 +flags 9 + +\end_inset + + +\layout Caption + + +\begin_inset LatexCommand \label{FigVenn} + +\end_inset + +Venn diagram showing the operating domain of the Java verifier. +\end_float +\layout Subsection + +JustIce is Free +\layout Standard + +Currently, there is no other free and complete open source verifier available + known to the author. + You may have a look at the JVM's source code by Sun Microsystems but you + are not allowed to use the knowledge from that inspection for your own + projects or even use their code. + JustIce is a clean-room implementation: the author wrote JustIce by only + reading the Java +\latex latex + +\backslash +texttrademark +\latex default +\SpecialChar ~ + Virtual Machine Specification, Second Edition +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + + and comparing the behaviour of JustIce with the behaviour of commercial + implementations of Sun Microsystems and IBM Corporation. +\layout Standard + +The open source JVM implementation +\emph on +Kaffe +\emph default + +\begin_inset LatexCommand \cite{Kaffe-WWW} + +\end_inset + +, for example +\emph on +, +\emph default + does not have a +\emph on +complete +\emph default + verifier built in (although mandated by the JVM specification). +\layout Standard + + +\emph on +Kissme +\emph default + +\begin_inset LatexCommand \cite{kissme-WWW} + +\end_inset + +, another open source JVM implementation, currently does not include any + verifier at all. + +\layout Standard + +The JVM implementations +\emph on + SableVM +\emph default + +\begin_inset LatexCommand \cite{SableVM-WWW} + +\end_inset + + and Intel Corporation's +\emph on +Open Runtime Platform +\emph default + +\begin_inset LatexCommand \cite{ORP-WWW} + +\end_inset + + are platforms to experiment with performance-enhancements. + They are not intended to work as general-purpose JVMs so they do not need + to implement verifiers. +\layout Standard + +Other open source projects that could make use of a free verifier include + the Java compiler +\emph on +gcj +\emph default + which is part of the GNU compiler collection +\begin_inset LatexCommand \cite{GCC-WWW} + +\end_inset + +. +\layout Standard + +JustIce is covered by the well-known and respected software license +\emph on +GNU General Public License +\emph default + (GPL); see section +\begin_inset LatexCommand \ref{GPL} + +\end_inset + +. + The author hopes other free software will benefit from it; from the JustIce + software +\begin_inset LatexCommand \cite{JustIce} + +\end_inset + + as well as from this paper describing some of the inner workings of JustIce. +\layout Chapter + +The Java Virtual Machine +\layout Standard + +The Java Virtual Machine (JVM) is an abstract machine specified in +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +. + It has no knowledge about the Java programming language; but only of a + certain binary file format: the class file format. + A class file contains machine instructions for the JVM (called +\emph on +bytecodes +\emph default +), a symbol table (called +\emph on +constant pool +\emph default +) and some other ancillary information. +\layout Standard + +On method invocation, a local stack frame is set up called the +\emph on +execution frame +\emph default +. + It consists of an +\emph on +operand stack +\emph default + and +\emph on +local variables +\emph default + (which may be compared to registers of traditional machines). +\layout Standard + +The instructions in the code arrays of class files are interpreted by the + JVM. + There are 212 legal instructions; they have read-access to the class file's + constant pool and they can modify the operand stack and the local variables + in their execution frame. + An invoked method reads its arguments from the local variables. + Certain instructions pass a return value to the invoking method. +\layout Section + + +\begin_inset LatexCommand \label{Classfile Structure} + +\end_inset + +The ClassFile Structure +\layout Standard + +Traditionally, the JVM loads its programs from files stored on file systems + of host machines; these files have names that end with +\emph on + +\begin_inset Quotes eld +\end_inset + +.class +\begin_inset Quotes erd +\end_inset + + +\emph default +. + It is possible to store the files in various other ways; a so-called +\emph on +class loader +\emph default + is then used to transform the files internally to the desired, basic class + file format. + Therefore, it suffices to explain the structure of traditional class files. + Every class file consists of a single +\family typewriter +ClassFile +\family default + structure as defined below. + It defines a single class as known from the Java Programming Language +\begin_inset LatexCommand \cite{langspec2} + +\end_inset + +. + The terms +\emph on +class +\emph default + and +\emph on +class file +\emph default + may therefore be used interchangeably. +\begin_float fig +\layout Standard +\align center + +\begin_inset Figure size 595 526 +file classfile.eps +width 3 100 +flags 9 + +\end_inset + + +\layout Standard + +A class file consists of constants, fields, methods, attributes and some + ancillary information. + This figure was taken from +\begin_inset LatexCommand \cite{BCEL98} + +\end_inset + +, used with permission of the author. +\layout Caption + +A Class File +\end_float +\layout Standard + +As we will see, the +\family typewriter +ClassFile +\family default + structure and its sub-structures are defined for upwards compatibility, + i.e., new structure definitions can be added to the specification easily + at a later time. +\newline + +\newline + +\family typewriter +ClassFile { +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u4 magic; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 minor_version; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 major_version; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 constant_pool_count; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +cp_info constant_pool[constant_pool_count-1]; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 access_flags; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 this_class; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 super_class; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 interfaces_count; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 interfaces[interfaces_count]; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 fields_count; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +field_info fields[fields_count]; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 methods_count; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +method_info methods[methods_count]; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 attributes_count; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +attribute_info attributes[attributes_count]; +\newline +} +\newline + +\newline + +\family default +You may read an ' +\family typewriter +u +\family default +' as 'byte times'; e.g., ' +\family typewriter +u2 +\family default +' means 'two bytes in size'. + We will not delve into too much detail here; the exact specification of + the entries are published by Sun +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +. + But one should note that besides some other information, a class file basically + defines +\emph on +attributes +\emph default +, +\emph on + constants +\emph default +, +\emph on +fields +\emph default + and +\emph on +methods +\emph default +. + Also, there are strong structural constraints imposed on class files. + It is a verifier's task to validate them. +\layout Subsection + +Attributes +\layout Standard + +The general format of an attribute is defined below. +\newline + +\newline + +\family typewriter +attribute_info { +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 attribute_name_index; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u4 attribute_length; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u1 info[attribute_length]; +\newline +} +\family default + +\newline + +\newline +An attribute is basically a typed data container; its type is determined + by its name. + Every JVM is required to be silent about attributes of types it does not + know. + On the other hand, newly defined attributes are required not to impose + a semantical change on the class file. + These attributes should be uniquely named; in fact, the pair (, ) is required to be unique. + This is guaranteed because attributes not defined by Sun Microsystems have + to be named according to the package naming scheme of the Java Programming + Language +\begin_inset LatexCommand \cite{langspec2} + +\end_inset + +. + Certain basic attributes are predefined. + They are used in the +\family typewriter +ClassFile +\family default + (see section +\begin_inset LatexCommand \ref{Classfile Structure} + +\end_inset + +), +\family typewriter +field_info +\family default + (see section +\begin_inset LatexCommand \ref{Fields} + +\end_inset + +) and +\family typewriter +method_info +\family default + (see section +\begin_inset LatexCommand \ref{Methods} + +\end_inset + +). + Also, attributes may be nested: the +\family typewriter +Code +\family default + attribute references other attributes. +\layout Standard + +Some examples for predefined attributes are listed below. +\layout Subsubsection + + +\begin_inset LatexCommand \label{ConstantValueAttribute} + +\end_inset + +The ConstantValue attribute +\layout Standard + +The ConstantValue attribute has the following format: +\newline + +\newline + +\family typewriter +ConstantValue_attribute { +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 attribute_name_index; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u4 attribute_length; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 constantvalue_index; +\newline +} +\family default + +\newline + +\newline +The +\family typewriter +ConstantValue +\family default + attribute represents the value of a constant field. + It has a fixed length: it contains only a two-byte reference into the constant + pool. + Only +\family typewriter +field_info +\family default + structures (see section +\begin_inset LatexCommand \ref{Fields} + +\end_inset + +) contain this type of attribute. +\layout Subsubsection + + +\begin_inset LatexCommand \label{CodeAttribute} + +\end_inset + +The Code Attribute +\layout Standard + +The +\family typewriter +Code +\family default + attribute is used in the +\family typewriter +method_info +\family default + (see section +\begin_inset LatexCommand \ref{Methods} + +\end_inset + +) structure. + It represents the program code of a method and it is defined as follows: +\newline + +\newline + +\family typewriter +Code_attribute { +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 attribute_name_index; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u4 attribute_length; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 max_stack; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 max_locals; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u4 code_length; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u1 code[code_length]; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 exception_table_length; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +{ +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 start_pc; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 end_pc; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 handler_pc; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 catch_type; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +} exception_table[exception_table_length]; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 attributes_count; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +attribute_info attributes[attributes_count]; +\newline +} +\family default + +\newline + +\newline +This is the most complex of all predefined attributes. + Every method that has code (i.e., every non-native, non-abstract method) + must have such an attribute. + Note that the maximum stack depth and the number of local variables for + a method invocation are defined here. + This is important for the JVM when it creates an +\emph on +execution frame +\emph default + (see section +\begin_inset LatexCommand \ref{LV_and_OpStack} + +\end_inset + +) at the time the method is invoked. +\layout Standard + +Also, the exception handlers are defined here. + Exception handlers prevent an executing method from an abrupt completion + if an exceptional situation occurs. + Code areas are said to be protected against a class of exceptional situations + by an exception handler +\begin_float footnote +\layout Standard + +The JVM closely reflects the +\emph on +exception +\emph default + mechanism of the Java programming language +\begin_inset LatexCommand \cite{langspec2} + +\end_inset + +. + In the Java programming language, exceptions can be +\emph on +thrown +\emph default +, and they can be +\emph on +caught +\emph default + explicitly. + If an internal JVM error occurs, the JVM also --implicitly-- throws an + exception. +\end_float +. + Algorithm +\begin_inset LatexCommand \ref{ExcHdAlgo} + +\end_inset + + shows an example for the use of exception handlers. + The exact meaning of the instruction opcodes is not important here, the + most common instructions are explained later in this paper. +\layout Standard + +\begin_float alg +\layout Standard + +[Let +\family typewriter +start_pc +\family default + and +\family typewriter +end_pc +\family default + protect the area A to B, inclusive. + Let the +\family typewriter +catch_type +\family default + be +\begin_inset Quotes eld +\end_inset + + +\family typewriter +java.lang.NullPointerException +\family default + +\begin_inset Quotes erd +\end_inset + +. + Let the +\family typewriter +handler_pc +\family default + point to C.] +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +aconst_null\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; push a NULL onto the operand stack. +\layout Standard + + +\family typewriter +A:\SpecialChar ~ +nop\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; do nothing +\layout Standard + + +\family typewriter +B:\SpecialChar ~ +getfield Foo::bar\SpecialChar ~ +\SpecialChar ~ +; dereference NULL, cause NullPointerExc. +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +;\SpecialChar ~ +never executed +\layout Standard + + +\family typewriter +C:\SpecialChar ~ +nop\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +;\SpecialChar ~ +this is executed: we could handle +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +nop\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +;\SpecialChar ~ +the NullPointerException +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +;\SpecialChar ~ +leave method (complete normally) +\layout Caption + + +\begin_inset LatexCommand \label{ExcHdAlgo} + +\end_inset + +Use of Exception Handlers +\end_float +\layout Standard + +The most important item, however, is the +\family typewriter +code +\family default + item. + It defines the bytecode of this method; i.e., the JVM machine instructions. +\layout Subsubsection + + +\begin_inset LatexCommand \label{LineNumberTableAttribute} + +\end_inset + +The LineNumberTable Attribute +\layout Standard + +The +\family typewriter +LineNumberTable +\family default + attribute is defined as follows: +\newline + +\newline + +\family typewriter +LineNumberTable_attribute { +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 attribute_name_index; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u4 attribute_length; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 line_number_table_length; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +{ +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 start_pc; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 line_number; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +} line_number_table[line_number_table_length]; +\newline +} +\newline + +\family default + +\newline +This attribute describes the relation between source code line numbers and + JVM instruction offsets in the +\family typewriter +code +\family default + array of the +\family typewriter +Code_attribute +\family default +; it can be used by debuggers to show the source code of currently executing + JVM machine instructions. + This attribute is usually a sub-attribute of a +\family typewriter +Code_attribute +\family default +. + Multiple +\family typewriter +LineNumberTable +\family default + attributes may together represent a given line of a source code file. + +\layout Subsection + +Constants +\layout Standard + +All the constants together form the +\emph on +constant pool +\emph default +. + The general +\family typewriter +cp_info +\family default + structure is straightforward. +\newline + +\newline + +\family typewriter +cp_info { +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u1 tag; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u1 info[]; +\newline +} +\family default + +\newline + +\newline +The 'tag' defines what 'info' follows it. + Constants define either constant values or constant symbolic references, + such as references to other classes. + Currently, eleven constant types are defined: +\family typewriter +Class +\family default +, +\family typewriter +Field\SpecialChar \- +ref +\family default +, +\family typewriter +Method\SpecialChar \- +ref +\family default +, +\family typewriter +In\SpecialChar \- +ter\SpecialChar \- +face\SpecialChar \- +Method\SpecialChar \- +ref +\family default +, +\family typewriter +String +\family default +, +\family typewriter +In\SpecialChar \- +teger +\family default +, +\family typewriter +Float +\family default +, +\family typewriter +Long +\family default +, +\family typewriter +Double +\family default +, +\family typewriter +Name\SpecialChar \- +And\SpecialChar \- +Type +\family default + and +\family typewriter +Utf8 +\family default +. +\layout Standard + +Most of the names are self-explanatory; the interested reader will find + more information in the specification +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +. + Constants can be nested; this is done by referring to the constant pool + index of the enclosed constant. +\layout Standard + +See the following examples. +\newline + +\newline + +\family typewriter +CONSTANT_Utf8_info { +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u1 tag; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 length; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u1 bytes[length]; +\newline +} +\newline + +\newline + +\family default +A CONSTANT_Utf8 represents a constant string. + Such a string is e.g. + used to describe names of methods, names of fields, names of attributes, + types of methods or types of fields. + This string is encoded in UTF-8 format, a variant of the unicode character + set +\begin_inset LatexCommand \cite{Unicode} + +\end_inset + +. + +\family typewriter + +\family default +The tag for this type of constant is simply the number 1, as defined in + the Java Virtual Machine Specification, Second Edition +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +. +\family typewriter + +\newline + +\newline +CONSTANT_NameAndType_info { +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u1 tag; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 name_index; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 descriptor_index; +\newline +} +\family default + +\newline + +\newline +A Constant_NameAndType represents a name and a signature of a method, the + tag is the number 12. + +\family typewriter + +\family default +Both +\family typewriter +class_index +\family default +and +\family typewriter + descriptor_index +\family default +refer to a +\family typewriter + CONSTANT_Utf8 +\family default +. +\family typewriter + +\newline + +\newline +CONSTANT_InterfaceMethodref_info { +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u1 tag; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 class_index; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 name_and_type_index; +\newline +} +\family default + +\newline + +\newline +A +\family typewriter +CONSTANT_InterfaceMethodref +\family default + describes a reference to a method defined in an interface class (see section + +\begin_inset LatexCommand \cite{langspec2} + +\end_inset + + for an explanation of interfaces), the tag is number 11. + The interface class is referenced via a two-byte index into the constant + pool. + A +\family typewriter +Constant_Class +\family default + is expected there describing a reference to some class file. + Every method has a name, zero or more argument types and a return type; + this is described in the +\family typewriter +CONSTANT_NameAndType +\family default + that is also referenced via a two-byte constant pool index. +\layout Standard + +Note that there are implicit constraints on the integrity of a class file: + for example, there must not be a +\family typewriter +CONSTANT_Integer +\family default + where a +\family typewriter +CONSTANT_Utf8 +\family default + is expected for a certain entity. + As another example, the names and the types of methods are encoded as strings + in UTF-8 format +\begin_inset LatexCommand \cite{Unicode} + +\end_inset + +. + They have to be well-formed (according to the specification) to be valid. +\layout Subsection + + +\begin_inset LatexCommand \label{Fields} + +\end_inset + +Fields +\layout Standard + +Each field is described by a field_info structure as defined below. +\newline + +\newline + +\family typewriter +field_info { +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 access_flags; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 name_index; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 descriptor_index; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 attributes_count; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +attribute_info attributes[attributes_count]; +\family default + +\newline +} +\newline + +\newline +A field has to be unique in a class file with respect to its name and descriptor +\begin_float footnote +\layout Standard + +The descriptor of a field describes its type. + E.g., a descriptor of +\begin_inset Quotes eld +\end_inset + +[I +\begin_inset Quotes erd +\end_inset + + means +\begin_inset Quotes eld +\end_inset + +one-dimensional array of +\family typewriter +int +\family default + +\begin_inset Quotes erd +\end_inset + +. +\end_float +. + We see that fields reference constants in the constant pool via their constant + pool indices (such as a +\family typewriter +CONSTANT_Utf8 +\family default + describing a field's name). + An important attribute used by fields is the ConstantValue attribute (see + section +\begin_inset LatexCommand \ref{ConstantValueAttribute} + +\end_inset + +). +\layout Standard + +The +\family typewriter +access_flags +\family default + entry is a bit vector that specifies the accessibility and other properties +\begin_float footnote +\layout Standard + +Often called +\emph on +visibility +\emph default +. +\end_float + of the field. + E.g., a field with the +\family typewriter +ACC_PRIVATE +\begin_float footnote +\layout Standard + +Bit number 1. +\end_float + bit set is not accessible to other classes. + A field with the +\family typewriter +ACC_PUBLIC +\begin_float footnote +\layout Standard + +Bit number 0. +\end_float + bit set is accessible to any other class. + Any combination with both the +\family typewriter +ACC_PRIVATE +\family default + and the +\family typewriter +ACC_PUBLIC +\family default + bit set is not valid. +\layout Standard + +The +\family typewriter +descriptor_index +\family default + refers to a +\family typewriter +CONSTANT_Utf8 +\family default + that symbolically encodes the type of the field. +\layout Subsection + + +\begin_inset LatexCommand \label{Methods} + +\end_inset + +Methods +\layout Standard + +Each method is described by a method_info structure as defined below. +\newline + +\newline + +\family typewriter +method_info { +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 access_flags; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 name_index; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 descriptor_index; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +u2 attributes_count; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +attribute_info attributes[attributes_count]; +\newline +} +\family default + +\newline + +\newline +As we can easily see, this is exactly the same structure we already know + as +\family typewriter +field_info +\family default + (see section +\begin_inset LatexCommand \ref{Fields} + +\end_inset + +). + The difference lies in the meaning of the enlisted entities. + For example, an access flag saying a field was volatile (non-cacheable) + would not make any sense if set in a +\family typewriter +method_info +\family default + structure. + Vice versa, an access flag saying the floating point instructions should + work in +\begin_inset Quotes eld +\end_inset + +FP-strict +\begin_inset Quotes erd +\end_inset + + mode would be of no use if set in a +\family typewriter +field_info +\family default + structure. +\layout Standard + +Methods use a different set of attributes than fields; for example, the + +\family typewriter +Constant\SpecialChar \- +Value +\family default + attribute (see section +\begin_inset LatexCommand \ref{ConstantValueAttribute} + +\end_inset + +) is of no use here. + The +\family typewriter +Code +\family default + and +\family typewriter +Exceptions +\family default + attributes frequently used by methods are of no use for fields on the other + hand. +\layout Section + +The Execution Engine +\layout Standard + +Before a piece of code (the code of a +\begin_inset Quotes eld +\end_inset + +method +\begin_inset Quotes erd +\end_inset + +) is executed, an +\emph on +execution frame +\emph default + is set up. + It consists of a program counter (as known from traditional CPUs), a set + of local variables (similar to registers known from traditional CPUs), + and an operand stack. + For each new invocation instance of a method, a new execution frame is + set up; it is destroyed on method termination. +\layout Standard + +Because a method may invoke other methods or itself recursively, there is + a global method invocation stack. +\layout Standard + +There also is a garbage-collected heap shared among the execution frames. + This heap is used for object allocation (see section +\begin_inset LatexCommand \ref{Instructions} + +\end_inset + +). +\layout Standard + +The number of local variables is not fixed. + Every method defines how many local variables are used for its code (up + to 65536). +\layout Standard + +Also note that there is no equivalent of a +\emph on +Processor Status Word +\emph default + (PSW) in the JVM. + Traditionally, a PSW has flags that are set implicitly during execution + of the instructions (such as an overflow or is-zero flag). + This is often used for conditional branching. + The JVM, however, uses the operand stack to store the result of a comparison + instruction explicitly. + This result is often read from the stack by the JVM's conditional branching + instructions. +\layout Standard + +Should exceptional situations occur (such as an out-of-memory situation), + the JVM does not lock up. + Instead, an +\begin_inset Quotes eld +\end_inset + +exception is thrown +\begin_inset Quotes erd +\end_inset + +; the currently executing program is signalled. + These signals can be processed ( +\begin_inset Quotes eld +\end_inset + +exceptions can be caught +\begin_inset Quotes erd +\end_inset + +). + If such a signal is not handled by the currently executing method, the + JVM will search a handler through the invocation hierarchy and stop execution + only if none was found. +\layout Standard + +There is a thread mechanism in the JVM. + Basically every thread creates an own method invocation stack (so there + may be more than one active execution frame at a time), but this feature + is not important for the rest of this text. +\layout Standard + +\begin_float fig +\layout Standard +\align center + +\begin_inset Figure size 595 379 +file exframe.eps +width 3 100 +flags 9 + +\end_inset + + +\layout Standard + +This figure shows a method invocation stack. + Method +\family typewriter +main +\family default + was invoked by the system, +\family typewriter +main +\family default + invoked +\family typewriter +foo +\family default +, +\family typewriter +foo +\family default + invoked +\family typewriter +bar +\family default +, and +\family typewriter +bar +\family default + invoked +\family typewriter +foo +\family default + recursively. + This figure assumes +\family typewriter +main +\family default + allocates one local variable and one operand stack slot, +\family typewriter +foo +\family default + allocates three local variables and two operand stack slots and +\family typewriter +bar +\family default + allocates one local variable and two operand stack slots. +\layout Caption + +Method Invocation Stack +\end_float +\layout Subsection + + +\begin_inset LatexCommand \label{LV_and_OpStack} + +\end_inset + +Local Variables and the Operand Stack +\layout Standard + +The method information in a class file defines how many local variables + are used on this method's invocation. + It also defines the maximum operand stack size. + Together, the local variables array and the operand stack are called the + +\emph on +execution frame +\emph default +. +\layout Standard + +A single stack slot has a width of 32 bits, which is also the width of a + local variable. + Therefore, values of types that occupy 64 bits ( +\emph on +double +\emph default + and +\emph on +long +\emph default +) must be stored in two consecutive stack slots or local variables. +\layout Standard + +The verifier takes care that the stack cannot overflow and that it cannot + underflow. + Also, it takes care that instructions may only access local variables if + they contain a value of a known, correct type (see section +\begin_inset LatexCommand \ref{Pass3Spec} + +\end_inset + +). + +\layout Subsection + + +\begin_inset LatexCommand \label{Instructions} + +\end_inset + +Introduction to JVM Instructions +\layout Standard + +This section is derived from section 2.2 of +\begin_inset LatexCommand \cite{BCEL98} + +\end_inset + +, used with permission of the author. +\layout Standard + +The JVM's instruction set currently consists of 212 instructions, 44 opcodes + are marked as reserved and may be used for future extensions or intermediate + optimizations within the Virtual Machine. + The instruction set can be roughly grouped as follows: +\layout Description + +Stack\SpecialChar ~ +operations: Constants can be pushed onto the stack either by loading + them from the constant pool with the +\latex latex + +\backslash +texttt{ldc} +\latex default + instruction or with special ``short-cut'' instructions where the operand + is encoded into the instructions, e.g., +\latex latex + +\backslash +texttt{iconst +\backslash +_0} +\latex default + or +\latex latex + +\backslash +texttt{bipush} +\latex default + (push byte value). +\layout Description + +Arithmetic\SpecialChar ~ +operations: The instruction set of the JVM distinguishes its operand + types using different instructions to operate on values of specific type. + Arithmetic operations starting with +\latex latex + +\backslash +texttt{i} +\latex default +, for example, denote an integer operation. + E.g., +\latex latex + +\backslash +texttt{iadd} +\latex default + that adds two integers and pushes the result back on the operand stack. + The Java types +\latex latex + +\backslash +texttt{boolean} +\latex default +, +\latex latex + +\backslash +texttt{byte} +\latex default +, +\latex latex + +\backslash +texttt{short} +\latex default +, and +\latex latex + +\backslash +texttt{char} +\latex default + are handled as integers by the JVM. +\layout Description + + +\begin_inset LatexCommand \label{RetDesc} + +\end_inset + +Control\SpecialChar ~ +flow: There are branch instructions like +\latex latex + +\backslash +texttt{goto} +\latex default +and +\latex latex + +\backslash +texttt{if +\backslash +_icmpeq} +\latex default +, which compares two integers for equality. + There is also a +\latex latex + +\backslash +texttt{jsr} +\begin_float footnote +\layout Standard + +There is a +\begin_inset Quotes eld +\end_inset + +wide +\begin_inset Quotes erd +\end_inset + + version of +\latex latex + +\backslash +texttt{jsr} +\latex default + called +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default +. + The instructions +\latex latex + +\backslash +texttt{jsr} +\latex default +/ +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + and +\latex latex + +\backslash +texttt{ret} +\latex default + play in important role in chapter +\begin_inset LatexCommand \ref{Pass3Spec} + +\end_inset + +. +\end_float + (jump into subroutine) and +\latex latex + +\backslash +texttt{ret} +\latex default + (return from subroutine) pair of instructions. + Exceptions may be thrown with the +\latex latex + +\backslash +texttt{athrow} +\latex default + instruction. + Branch targets are coded as offsets from the current byte code position, + i.e., they are coded with an integer number. +\layout Description + +Load\SpecialChar ~ +and\SpecialChar ~ +store\SpecialChar ~ +operations for local variables like +\latex latex + +\backslash +texttt{iload} +\latex default + and +\latex latex + +\backslash +texttt{istore} +\latex default +. + There are also array operations like +\latex latex + +\backslash +texttt{iastore} +\latex default + which stores an integer value into an array. +\layout Description + +Field\SpecialChar ~ +access: The value of an instance field may be retrieved with +\latex latex + +\backslash +texttt{getfield} +\latex default + and written with +\latex latex + +\backslash +texttt{putfield} +\latex default +. + For static fields, there are +\latex latex + +\backslash +texttt{getstatic} +\latex default + and +\latex latex + +\backslash +texttt{putstatic} +\latex default + counterparts. +\layout Description + +Method\SpecialChar ~ +invocation: Methods may either be called via static references with + +\latex latex + +\backslash +texttt{invokestatic} +\latex default + or be bound virtually with the +\latex latex + +\backslash +texttt{invokevirtual} +\latex default + instruction. + Super class methods and private methods are invoked with +\latex latex + +\backslash +texttt{invokespecial} +\latex default +. +\layout Description + +Object\SpecialChar ~ +allocation: Class instances are allocated with the +\latex latex + +\backslash +texttt{new} +\latex default + instruction, arrays of basic type like +\latex latex + +\backslash +texttt{int[]} +\latex default + with +\latex latex + +\backslash +texttt{newarray} +\latex default +, arrays of references like +\latex latex + +\backslash +texttt{String[][]} +\latex default + with +\latex latex + +\backslash +texttt{anewarray} +\latex default + or +\latex latex + +\backslash +texttt{multianewarray} +\latex default +. +\layout Description + +Conversion\SpecialChar ~ +and\SpecialChar ~ +type\SpecialChar ~ +checking: For stack operands of basic type there exist + casting operations like +\latex latex + +\backslash +texttt{f2i} +\latex default + which converts a float value into an integer. + The validity of a type cast may be checked with +\latex latex + +\backslash +texttt{checkcast} +\latex default + and the +\latex latex + +\backslash +texttt{instanceof} +\latex default + operator can be directly mapped to the equally named instruction. +\layout Standard + +Most instructions have a fixed length, but there are also some variable-length + instructions: In particular, the +\latex latex + +\backslash +texttt{lookupswitch} +\latex default + and +\latex latex + +\backslash +texttt{tableswitch} +\latex default + instructions, which are often used by compilers to implement the Java language + +\latex latex + +\backslash +texttt{switch()} +\latex default + statements. + Since the number of +\latex latex + +\backslash +texttt{case} +\latex default + clauses may vary, these instructions contain a variable number of statements. +\layout Standard + +In a class file, the +\family typewriter +code +\family default + item in the +\family typewriter +Code +\family default + attributes (which in turn are attributes of +\family typewriter +method_info +\family default + structures), is a byte array in which binary representations of JVM instruction +s are stored sequentially. + This is also called +\emph on +bytecode +\emph default +. +\layout Standard + +The JVM is a stack-based machine. + There are local variables which may be compared to registers, but most + instructions work on the operand stack. + E.g., the +\latex latex + +\backslash +texttt{iadd} +\latex default + instruction pops two integers from the operand stack and pushes the result + of the add operation on top of the stack. +\layout Standard + +We will not list all of the instructions here, since these are explained + in detail in the JVM specification. + However, you will find the most common instructions in table +\begin_inset LatexCommand \ref{typeprefixes} + +\end_inset + +, cited with slight corrections and modifications from chapter 4 of +\begin_inset LatexCommand \cite{JNS} + +\end_inset + +. +\layout Standard + +\begin_float tab +\layout Caption + + +\begin_inset LatexCommand \label{typeprefixes} + +\end_inset + +Type Prefixes and the Most Common JVM Instructions +\layout Standard +\align center + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\layout Standard + +Prefix +\end_inset + + +\begin_inset Text + +\layout Standard + +Bytecode type +\end_inset + + + + +\begin_inset Text + +\layout Standard + +i +\end_inset + + +\begin_inset Text + +\layout Standard + +Integer +\end_inset + + + + +\begin_inset Text + +\layout Standard + +f +\end_inset + + +\begin_inset Text + +\layout Standard + +Floating point +\end_inset + + + + +\begin_inset Text + +\layout Standard + +l +\end_inset + + +\begin_inset Text + +\layout Standard + +Long +\end_inset + + + + +\begin_inset Text + +\layout Standard + +d +\end_inset + + +\begin_inset Text + +\layout Standard + +Double precision floating point +\end_inset + + + + +\begin_inset Text + +\layout Standard + +b +\end_inset + + +\begin_inset Text + +\layout Standard + +Byte +\end_inset + + + + +\begin_inset Text + +\layout Standard + +s +\end_inset + + +\begin_inset Text + +\layout Standard + +Short +\end_inset + + + + +\begin_inset Text + +\layout Standard + +c +\end_inset + + +\begin_inset Text + +\layout Standard + +Character +\end_inset + + + + +\begin_inset Text + +\layout Standard + +a +\end_inset + + +\begin_inset Text + +\layout Standard + +Object reference +\end_inset + + + + +\end_inset + + +\end_float +\layout Standard + + +\begin_inset Tabular + + + + + + + + + + + + + + +\begin_inset Text + +\layout Standard + + +\size scriptsize +Instruction +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size scriptsize +int +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size scriptsize +long +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size scriptsize +float +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size scriptsize +double +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size scriptsize +byte +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size scriptsize +char +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size scriptsize +short +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size scriptsize +object ref. +\end_inset + + +\begin_inset Text + +\layout Standard + + +\size scriptsize +Function +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?2c +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Convert value of type to character +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?2d +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Convert value of type to double +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?2i +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Convert value of type to integer +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?2f +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Convert value of type to float +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?2l +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Convert value of type to long +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?2s +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Convert value of type to short +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?add +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Add two values of type +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?aload +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +Push an element of type from an array onto the stack +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?and +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Perform logical AND on two values of type +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?astore +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +Pop an element of type from the stack and store it in an array of type + +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?cmp +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Compare two long values. + If they are equal push 0, if the first is greater push 1, else push -1 +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?cmpg +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Compare two IEEE values of type from the stack. + If they are equal push 0, if the first is greater push 1, if the second + is greater push -1. + If either is NaN (not a number) push 1 +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?cmpl +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Compare two IEEE values of type from the stack. + If they are equal push 0, if the first is greater push 1, if the second + is greater push -1. + If either is NaN (not a number) push -1 +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?const +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +Push a constant value of type onto the stack +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?div +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Perform a division using two values of type and push the quotient onto + the stack +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?inc +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Increment the top of the stack (possibly by a negative value) +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?ipush +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Push a sign extended byte or short value onto the stack +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?load +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Push a value of type from a local variable onto the stack +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?mul +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Perform multiplication of two values of type +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?neg +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Negate a value of type +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?newarray +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +Create a new array of object references +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?or +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Perform logical OR on two values of type +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?rem +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Perform a division using two values of type and push the remainder onto + the stack +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?return +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +Return a value of type to the invoking method +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?shl +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Perform arithmetic shift left on a value of type +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?shr +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Perform arithmetic shift right on a value of type +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?store +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +Pop a value of type and store it into a local variable +\end_inset + + + + +\begin_inset Text + +\layout Standard + +?sub +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +X +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +\end_inset + + +\begin_inset Text + +\layout Standard + +Perform a subtraction using two values of type +\end_inset + + + + +\end_inset + + +\layout Standard + +The opcode names are mostly self-explanatory. + In this paper, all bytecode is commented to support the intuitive understanding. + Algorithms +\begin_inset LatexCommand \ref{facjavapl} + +\end_inset + + and +\begin_inset LatexCommand \ref{facjavabytecode} + +\end_inset + + show an example bytecode taken from +\begin_inset LatexCommand \cite{BCEL98} + +\end_inset + +. + It implements the well-known faculty function. + To understand this example, it is important to know that method arguments + are stored into the local variables of a newly created execution frame + upon method invocation. +\layout Standard + +\begin_float alg +\layout Caption + + +\begin_inset LatexCommand \label{facjavapl} + +\end_inset + +Methed +\emph on +fac +\emph default + in a class +\emph on +Faculty +\emph default +, Java programming language version +\layout Standard + + +\family typewriter +public static final int fac(int n){ +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +return (n==0)?1:n*fac(n-1); +\layout Standard + + +\family typewriter +} +\end_float +\layout Standard + +\begin_float alg +\layout Caption + + +\begin_inset LatexCommand \label{facjavabytecode} + +\end_inset + +Method +\emph on +fac +\emph default + in a class +\emph on +Faculty +\emph default +, Java bytecode version +\layout Standard + + +\family typewriter +\size footnotesize +Faculty.fac (I)I +\layout Standard + + +\family typewriter +\size footnotesize +0:\SpecialChar ~ +\SpecialChar ~ +iload_0\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; load argument onto stack +\layout Standard + + +\family typewriter +\size footnotesize +1:\SpecialChar ~ +\SpecialChar ~ +ifne #8\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; non-zero? Then branch to 8. +\layout Standard + + +\family typewriter +\size footnotesize +4:\SpecialChar ~ +\SpecialChar ~ +iconst_1\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; push constant 1 onto stack +\layout Standard + + +\family typewriter +\size footnotesize +5:\SpecialChar ~ +\SpecialChar ~ +goto #16\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; jump to 16 +\layout Standard + + +\family typewriter +\size footnotesize +8:\SpecialChar ~ +\SpecialChar ~ +iload_0\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; load argument onto stack +\layout Standard + + +\family typewriter +\size footnotesize +9:\SpecialChar ~ +\SpecialChar ~ +iload_0\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; load argument onto stack +\layout Standard + + +\family typewriter +\size footnotesize +10:\SpecialChar ~ +iconst_1\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; push constant 1 onto stack +\layout Standard + + +\family typewriter +\size footnotesize +11:\SpecialChar ~ +isub\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; subtract the stack top from +\layout Standard + + +\family typewriter +\size footnotesize +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; the stack next-to-top which becomes +\layout Standard + + +\family typewriter +\size footnotesize +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; the new stack top +\layout Standard + + +\family typewriter +\size footnotesize +12:\SpecialChar ~ +invokestatic Faculty.fac (I)I\SpecialChar ~ +\SpecialChar ~ +; call method fac recursively, +\layout Standard + + +\family typewriter +\size footnotesize +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; the new invocation +\layout Standard + + +\family typewriter +\size footnotesize +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; instance's argument is the stack top +\layout Standard + + +\family typewriter +\size footnotesize +15:\SpecialChar ~ +imul\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; multiply the return value with the +\layout Standard + + +\family typewriter +\size footnotesize +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; argument given to the current +\layout Standard + + +\family typewriter +\size footnotesize +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; invocation instance +\layout Standard + + +\family typewriter +\size footnotesize +16:\SpecialChar ~ +ireturn\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; return value on top of the +\layout Standard + + +\family typewriter +\size footnotesize +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; stack to the invoking method +\end_float +\layout Chapter + + +\begin_inset LatexCommand \label{SpecPasses} + +\end_inset + +Specification of the Verification Passes +\layout Standard + +Sun describes a four-pass class file verifier in The Java Virtual Machine + Specification, Second Edition +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +. + It is not necessary to implement the verification algorithms literally; + and it is not possible anyway (see section +\begin_inset LatexCommand \ref{SpecSubroutines} + +\end_inset + +). + However, implementing a verifier with a multiple-pass architecture makes + sense. + It is a good thing to stay close to the specification because it is well-known + throughout the bytecode engineering community. + Also, the boundaries between the passes are not arbitrary. + They are drawn to improve the performance of the verifiers built into JVMs. + For example, classes are not verified (completely) before they are actually + used but they are loaded as soon as they are referenced in a certain way. + Most verifiers use the traditional multiple-pass architecture, including + Kimera +\begin_inset LatexCommand \cite{Kimera-WWW} + +\end_inset + +. + Work in other directions (for instance, the one-pass-architecture proposed + by Fong +\begin_inset LatexCommand \cite{Fong-WWW} + +\end_inset + +) did not yield lasting results. +\layout Standard + +Pass one is basically about loading a class file into the JVM in a sane + way and pass two verifies that the loaded class file information is consistent. + Pass three verifies that the program code is well-behaved; pass four verifies + things that conceptually belong to pass three but are delayed to the run-time + for performance reasons. +\layout Standard + +Sometimes implementation details are discussed in this chapter. + Whenever the specification +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + + was ambigous about some issue, the behaviour of Sun's JVM implementations + was observed. + The discussed details are part of the specification of the JustIce verifier. +\layout Section + + +\begin_inset LatexCommand \label{PassOneSpec} + +\end_inset + +Pass One +\layout Standard + +The first pass of the verifier is only vaguely specified. + It is there to assure a class file +\begin_inset Quotes eld +\end_inset + + +\series bold +has the basic format of a class file. + The first four bytes must contain the right magic number. + All recognized attributes must be of the proper length. + The class file must not be truncated or have any extra bytes at the end. + The constant pool must not contain any superficially unrecognizable information +\series default + +\begin_inset Quotes erd +\end_inset + + ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 141). +\layout Standard + +The right magic number is 0xCAFEBABE ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 94), which is easy to assure. +\layout Standard + +It is not clear what +\begin_inset Quotes eld +\end_inset + +superficially unrecognizable information +\begin_inset Quotes erd +\end_inset + + exactly is, however. + If an attribute is not known to the JVM (or verifier) implementation, it + has to be ignored -- so this does not seem to be +\begin_inset Quotes eld +\end_inset + +superficially unrecognizable information +\begin_inset Quotes erd +\end_inset + +. + Attributes that are not used cannot be detected in pass one. + One would have to look at the bytecodes to decide whether an attribute + is used or not (which is not the domain of pass one, but of pass three). +\layout Standard + +Observations show that most existing JVM verifiers +\begin_float footnote +\layout Standard + +An example of a verifier with this behaviour is the one implemented in Sun's + Solaris port of the JVM, version 1.3.0_01. +\end_float + ignore +\begin_inset Quotes eld +\end_inset + +extra bytes at the end +\begin_inset Quotes erd +\end_inset + + instead of rejecting class files bearing them. +\layout Standard + +The other two statements specify verification of the class file structure + (and the structure of the attributes therein). + But this is also the domain of pass two! Only by inspecting the way the + JVM +\emph on +loads +\emph default +, +\emph on +resolves +\emph default + and +\emph on +prepares +\emph default + classes one will understand the precise boundary between verification passes + one and two +\begin_inset LatexCommand \cite{Fong-WWW} + +\end_inset + +. +\layout Standard + +'Being careful when loading a class file' is a good definition for pass + one: the structure of the file to load is untrusted. + Every implicit statement such as +\begin_inset Quotes eld +\end_inset + +this attribute has a length of 1234 bytes in total +\begin_inset Quotes erd +\end_inset + + is validated. +\layout Standard + + +\emph on +Resolution +\emph default + is the transformation of a symbolic reference to an actual reference -- + i.e., as long as there is only a symbolic reference to an entity, this entity + cannot be verified at all because it has not been loaded yet. + Passes two and three are performed during the +\emph on +resolution +\emph default + of a class file; while loading of the class file --pass one-- must have + been performed before. + +\emph on +Resolution +\emph default + as such is meaningless to JustIce; the term is only used to draw the borders + between the verification passes. +\layout Section + + +\begin_inset LatexCommand \label{SpecPassTwo} + +\end_inset + +Pass Two +\layout Standard + +The checks performed in pass two enforce that the following constraints + are satisfied. +\layout Itemize + +Ensuring that final classes are not subclassed and that final methods are + not overridden. +\layout Itemize + +Checking that every class (except +\family typewriter +java.lang.Object +\family default +) has a direct superclass. +\layout Itemize + +Ensuring that the constant pool satisfies the documented static constraints: + for example, that each +\family typewriter +CONSTANT_Class_info +\family default + structure in the constant pool contains in its +\family typewriter +name_index +\family default + item a valid constant pool index for a +\family typewriter +CONSTANT_Utf8_info +\family default + structure. +\layout Itemize + +Checking that all field references and method references in the constant + pool have valid names, valid classes, and a valid type descriptor. +\layout Standard + +As Frank Yellin puts it +\begin_inset LatexCommand \cite{Yellin-WWW} + +\end_inset + +: pass two +\begin_inset Quotes eld +\end_inset + +performs all verification that can be performed without looking at the bytecodes +\begin_inset Quotes erd +\end_inset + +. + Also, +\begin_inset Quotes eld +\end_inset + +this pass does not actually check to make sure that the given field or method + really exists in the given class; nor does it check that the type signatures + given refer to real classes. +\begin_inset Quotes erd +\end_inset + + Note that again +\emph on +resolution +\emph default + plays an important role to create the boundary between two passes; here + it is the boundary between pass two and pass three. + Because linking-time verification enhances the performance of the JVM, + checks that basically belong to pass two are delayed to pass three. + This leads to the obvious contradiction in the sentences cited above. +\layout Standard + +This performance enhancement has an ugly side effect. + Consider a reference to a method m contained in a class file C that does + not exist. + As long as this reference is not +\emph on +used +\emph default +, i.e., +\emph on +resolved +\emph default +, the absence of C cannot be detected. + Such a reference should in the author's opinion regarded as +\begin_inset Quotes eld +\end_inset + +superficially unrecognizable information +\begin_inset Quotes erd +\end_inset + + (see section +\begin_inset LatexCommand \ref{PassOneSpec} + +\end_inset + +) and therefore be detected. +\layout Standard + +This pass has to verify the integrity of the clas file's data structures + as explained in section +\begin_inset LatexCommand \ref{Classfile Structure} + +\end_inset + +. + As an example, consider the Line\SpecialChar \- +Number\SpecialChar \- +Table atribute. + Sun did not specify there has to be exactly one +\family typewriter +Line\SpecialChar \- +Number\SpecialChar \- +Table +\family default + attribute (or none at all) per method, so possibly there is more than one + attribute of that kind. + This lax specification is not necessary due to the fact that you can put + all information in a single +\family typewriter +Line\SpecialChar \- +Number\SpecialChar \- +Table_attri\SpecialChar \- +bute +\begin_float footnote +\layout Standard + +Any number of +\family typewriter +line_number_table +\family default +array entries fits nicely in a single +\family typewriter +LineNumberTable_attribute +\family default + attribute. +\end_float +, but Sun did specify it this way ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 129). +\layout Standard + +Verifiers are requested to reject class files with inconsistent information + in their attributes. + However, here it may be that only by looking at all +\family typewriter +Line\SpecialChar \- +Number\SpecialChar \- +Table_attribute +\family default +s of a method, an inconsistency can be detected. + JustIce does so and rejects class files with inconsistent +\family typewriter +Line\SpecialChar \- +Number\SpecialChar \- +Table +\family default + information. +\layout Standard + +Furthermore, it issues warnings if such an attribute is detected at all + to discourage its use (see section +\begin_inset LatexCommand \ref{Pass2Impl} + +\end_inset + +). + This is done because of possible different interpretations of the specification. +\layout Standard + +It should be noted that the use of attributes raises a few more problems + to class file verification. + A simple case is the presence of an unknown attribute that may safely be + ignored. + It is explicitly stated that such a class file must not be rejected. + On the other hand, how should a verifier react if --for example-- a +\family typewriter +field_info +\family default + (see section +\begin_inset LatexCommand \ref{Fields} + +\end_inset + +) structure encloses a +\family typewriter +Code_attribute +\family default +? JustIce will issue a warning but not reject the class file. +\layout Section + + +\begin_inset LatexCommand \label{Pass3Spec} + +\end_inset + +Pass Three +\layout Standard + +Performing pass three basically means +\emph on +verifying the bytecode +\emph default +. + There are so-called +\begin_inset Quotes eld +\end_inset + +static constraints +\begin_inset Quotes erd +\end_inset + + on both the instructions in the code array and their operands. + There are also so-called +\begin_inset Quotes eld +\end_inset + +structural constraints +\begin_inset Quotes erd +\end_inset + +. + The structural constraints specify constraints on relationships between + JVM instructions, so some people (including the author) regard +\begin_inset Quotes eld +\end_inset + +structural constraints +\begin_inset Quotes erd +\end_inset + + as a misnomer; they should be called +\begin_inset Quotes eld +\end_inset + +dynamic constraints +\begin_inset Quotes erd +\end_inset + +. +\layout Standard + +Static constraints are easily enforced using very simple checks. + Here is an example for such a check: let there be a +\family typewriter +Code +\family default + (see section +\begin_inset LatexCommand \ref{CodeAttribute} + +\end_inset + +) attribute with a +\family typewriter +max_locals +\family default + value of 2. + Only local variables number 0 and 1 may be accessed by the bytecode in + this +\family typewriter +Code +\family default + attribute. + For all instructions accessing local variables, make sure they do not access + any other local variable. +\layout Standard + +Structural constraints are enforced using an algorithm sketched by Sun; + it implements a symbolic execution of a method's code, by means of data + flow analysis including type inference ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, pages 143-151). + This algorithm is called the +\emph on +data flow analyzer. + +\emph default + It is intuitively easy to understand, but it is hard to prove its correctness. + The reason for that is the very weak specification of its subtleties; especiall +y +\emph on +subroutines +\emph default +, +\emph on +wide date types +\emph default + and +\emph on +object initialization +\emph default + (see below). + The general approach, however, is sound +\begin_inset LatexCommand \cite{BCV-Soundness} + +\end_inset + +. + Here is an example for a structural constraint enforced by this algorithm: + during program execution, at any given point in the program the operand + stack is always of the same height, no matter which code path was taken + to reach that point. + +\layout Standard + +Pass three is the core of the verifier. + Note that we will split this pass up into two passes, namely a pass verifying + the static constraints and a pass verifying the structural constraints + of a method's code. + We will call these passes +\begin_inset Quotes eld +\end_inset + +pass 3a +\begin_inset Quotes erd +\end_inset + + and +\begin_inset Quotes eld +\end_inset + +pass 3b +\begin_inset Quotes erd +\end_inset + +. + In a way, they resemble pass one and pass two: the former pass carefully + parses an entity, while the latter pass performs additional verification. + +\layout Standard + +By defining pass four, the specification +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + + implicitly excludes +\begin_inset Quotes eld +\end_inset + +certain tests that could in principle be performed in Pass 3 +\begin_inset Quotes erd +\end_inset + +, because they are +\begin_inset Quotes eld +\end_inset + +delayed until the first time the code for the method is actually invoked +\begin_inset Quotes erd +\end_inset + +. + On the other hand, verifiers are allowed to perform pass four partially + or completely as a part of pass three. + JustIce performs the pass four checks in pass 3a. +\layout Subsection + +Static Constraints: Pass 3a +\layout Standard + +Sun gives examples of what the verifier does before starting the data flow + analyzer ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, pages 143-144): +\layout Itemize +\pextra_type 1 \pextra_width 10mm + + +\series bold +Branches must be within the bounds of the code array for the method. +\layout Itemize +\pextra_type 1 \pextra_width 10mm + + +\series bold +The targets of all control-flow instructions are each the start of an instructio +n. + In the case of a +\latex latex + +\backslash +texttt{wide} +\latex default + instruction the +\latex latex + +\backslash +texttt{wide} +\latex default +opcode is considered the start of the instruction, and the opcode giving + the operation modified by that +\latex latex + +\backslash +texttt{wide} +\latex default + instruction is not considered to start an instruction. + Branches into the middle of an instruction are disallowed. +\layout Itemize +\pextra_type 1 \pextra_width 10mm + + +\series bold +No instruction can access or modify a local variable at an index greater + than or equal to the number of local variables that its method indicates + it allocates. +\layout Itemize +\pextra_type 1 \pextra_width 10mm + + +\series bold +All references to the constant pool must be an entry of the appropriate + type. + For example: the instruction +\latex latex + +\backslash +texttt{ldc} +\latex default + can be used only for data of type int or float or for instances of class + String; the instruction +\latex latex + +\backslash +texttt{getfield} +\latex default + must reference a field. +\layout Itemize +\pextra_type 1 \pextra_width 10mm + + +\series bold +The code does not end in the middle of an instruction. +\layout Itemize +\pextra_type 1 \pextra_width 10mm + + +\series bold +Execution cannot fall off the end of the code. +\layout Itemize +\pextra_type 1 \pextra_width 10mm + + +\series bold +For each exception handler, the starting and ending point of the code protected + by the handler must be at the beginning of an instruction or, in the case + of the ending point, immediately past the end of the code. + The starting point must be before the ending point. + The exception handler code must start at a valid instruction, and it may + not start at an opcode being modified by the +\latex latex + +\backslash +texttt{wide} +\latex default + instruction. +\layout Standard + +Most of these constraints are either static constraints on instructions + or on their operands. + A full list of constraints can be found in the Java Virtual Machine Specificati +on, Second Edition ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, pages 133-137). +\layout Standard + +The check for execution falling off the end of the code is an exception: + this is a structural constraint and should therefore be performed in pass + 3b. + Sun's verifiers, however, reject code that has an unreachable +\latex latex + +\backslash +texttt{nop} +\latex default +at the end of the code array. + Obviously, they reject the code before performing data flow analysis. + For the sake of compatibility, JustIce performs this check in pass 3a. +\layout Standard + +Note that the JVM's instructions differ in length. + Some instructions occupy only one byte (such as +\family typewriter +nop +\family default +), others occupy three bytes (such as +\family typewriter +goto +\family default +). + Branch instructions could therefore target operands of instructions. + For example, line 1 of algorithm +\begin_inset LatexCommand \ref{facjavabytecode} + +\end_inset + + reads +\begin_inset Quotes eld +\end_inset + + +\family typewriter +1: ifne #8 +\family default + +\begin_inset Quotes erd +\end_inset + +. + If it would read +\begin_inset Quotes eld +\end_inset + + +\family typewriter +1: ifne #7 +\family default + +\begin_inset Quotes erd +\end_inset + +, this code was malformed. + A special case is the instruction +\family typewriter +wide +\family default +. + This instruction takes another instruction +\emph on +as its operand +\emph default +, so one could be misguided into thinking this embedded instruction was + a valid target for branches. + It is not. +\layout Standard + +The checks Sun delays until pass four are performed in pass 3a by JustIce. + These are checks to ensure allowed and possible access to a referenced + type, listed below. + +\layout Itemize + +Is the type (class or interface) currently under examination allowed to + reference the type +\begin_float footnote +\layout Standard + +Interfaces may contain code, this is normally used for static initialization + of +\family typewriter +final +\family default + variables. +\end_float +? +\layout Itemize + +Does the referenced method or field exist in the given class? +\layout Itemize + +Does the referenced method or field have the indicated descriptor (signature)? +\layout Itemize + +Does the method currently under examination have access to the referenced + method or field? +\layout Subsection + +Structural Constraints: Pass 3b +\layout Standard + +The structural constraints of JVM instructions are enforced by a data flow + analyzer. + This algorithm ensures the following constraints ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 142). +\layout Itemize +\pextra_type 1 \pextra_width 10mm + + +\series bold +The operand stack is always the same size and contains the same types of + values. +\layout Itemize +\pextra_type 1 \pextra_width 10mm + + +\series bold +No local variable is accessed unless it is known to contain a value of an + appropriate type. +\layout Itemize +\pextra_type 1 \pextra_width 10mm + + +\series bold +Methods are invoked with the appropriate arguments. +\layout Itemize +\pextra_type 1 \pextra_width 10mm + + +\series bold +Fields are assigned only using values of appropriate types. +\layout Itemize +\pextra_type 1 \pextra_width 10mm + + +\series bold +All opcodes have appropriate type arguments on the operand stack and in + the local variable array. +\layout Standard + +A full list of structural constraints can be found in The Java Virtual Machine + Specification, Second Edition ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, pages 137-139). +\layout Subsubsection + + +\begin_inset LatexCommand \label{SunCoreAlgo} + +\end_inset + +Sun's Verification Algorithm +\layout Standard + +Sun specifies the data flow analyzer by giving an informal algorithm ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, pages 144-146). + This algorithm it cited here completely because it is the very core of + the verifier. + According to this algorithm, every bytecode instruction has a +\begin_inset Quotes eld +\end_inset + +changed +\begin_inset Quotes erd +\end_inset + + bit. + Initially, only the +\begin_inset Quotes eld +\end_inset + +changed +\begin_inset Quotes erd +\end_inset + + bit of the first instruction is set. +\layout Enumerate +\pextra_type 1 \pextra_width 10mm + + +\series bold +Select a virtual machine instruction whose "changed" bit is set. + If no instruction remains whose "changed" bit is set, the method has successful +ly been verified. + Otherwise, turn off the "changed" bit of the selected instruction. +\layout Enumerate +\pextra_type 1 \pextra_width 10mm + + +\series bold +Model the effect of the instruction on the operand stack and local variable + array by doing the following: +\newline + +\latex latex + +\backslash +textbullet\SpecialChar ~ + +\latex default +If the instruction uses values from the operand stack, ensure that there + are a sufficient number of values on the stack and that the top values + on the stack are of an appropriate type. + Otherwise, verification fails. +\newline + +\latex latex + +\backslash +textbullet\SpecialChar ~ + +\latex default +If the instruction uses a local variable, ensure that the specified local + variable contains a value of the appropriate type. + Otherwise, verification fails. +\newline + +\latex latex + +\backslash +textbullet\SpecialChar ~ + +\latex default +If the instruction pushes values onto the operand stack, ensure that there + is sufficient room on the operand stack for the new values. + Add the indicated types to the top of the modeled operand stack. +\newline + +\latex latex + +\backslash +textbullet\SpecialChar ~ + +\latex default +If the instruction modifies a local variable, record that the local variable + now contains the new type. +\layout Enumerate +\pextra_type 1 \pextra_width 10mm + + +\series bold +Determine the instructions that can follow the current instruction. + Successor instructions can be one of the following: +\newline + +\latex latex + +\backslash +textbullet\SpecialChar ~ + +\latex default +The next instruction, if the current instruction is not an unconditional + control transfer instruction (for instance goto, return, or athrow). + Verification fails if it is possible to "fall off" the last instruction + of the method. +\newline + +\latex latex + +\backslash +textbullet\SpecialChar ~ + +\latex default +The target(s) of a conditional or unconditional branch or switch. +\newline + +\latex latex + +\backslash +textbullet\SpecialChar ~ + +\latex default +Any exception handlers for this instruction. + +\layout Enumerate +\pextra_type 1 \pextra_width 10mm + + +\series bold +Merge the state of the operand stack and local variable array at the end + of the execution of the current instruction into each of the successor + instructions. + In the special case of control transfer to an exception handler, the operand + stack is set to contain a single object of the exception type indicated + by the exception handler information. +\newline + +\latex latex + +\backslash +textbullet\SpecialChar ~ + +\latex default +If this is the first time the successor instruction has been visited, record + that the operand stack and local variable values calculated in steps 2 + and 3 are the state of the operand stack and local variable array prior + to executing the successor instruction. + Set the "changed" bit for the successor instruction. +\newline + +\latex latex + +\backslash +textbullet\SpecialChar ~ + +\latex default +If the successor instruction has been seen before, merge the operand stack + and local variable values calculated in steps 2 and 3 into the values already + there. + Set the "changed" bit if there is any modification to the values. +\layout Enumerate +\pextra_type 1 \pextra_width 10mm + + +\series bold +Continue at step 1. + +\layout Standard +\pextra_type 1 \pextra_width 10mm + + +\series bold +To merge two operand stacks, the number of values on each stack must be + identical. + The types of values on the stacks must also be identical, except that different +ly typed reference values may appear at corresponding places on the two + stacks. + In this case, the merged operand stack contains a reference to an instance + of the first common superclass of the two types. + Such a reference type always exists because the type Object is a superclass + of all class and interface types. + If the operand stacks cannot be merged, verification of the method fails. +\layout Standard +\pextra_type 1 \pextra_width 10mm + + +\series bold +To merge two local variable array states, corresponding pairs of local variables + are compared. + If the two types are not identical, then unless both contain reference + values, the verifier records that the local variable contains an unusable + value. + If both of the pair of local variables contain reference values, the merged + state contains a reference to an instance of the first common superclass + of the two types. +\layout Standard + +Certain instructions and data types complicate the data flow analyzer, most + notably the instruction +\latex latex + +\backslash +texttt{ret} +\latex default + (see section +\begin_inset LatexCommand \ref{RetDesc} + +\end_inset + +). + The algorithm above even uses a special definition of +\emph on +merging +\emph default + for the +\latex latex + +\backslash +texttt{ret} +\latex default + instruction (see +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 151). + The +\latex latex + +\backslash +texttt{ret} +\latex default + instruction is parameterized with a value of type +\family typewriter +returnaddress +\family default + which is read from a local variable and used as a branching target. + The +\latex latex + +\backslash +texttt{ret} +\latex default + instruction is there to implement a (control flow) return from a +\emph on +subroutine +\emph default +. +\layout Subsubsection + +Reachability of Instructions +\layout Standard + +For the data flow analysis algorithm, you need to know all the possible + control flow successors of every instruction, i.e., you need to build a +\emph on +control flow graph +\emph default + (see below). + Without the instructions +\latex latex + +\backslash +texttt{jsr} +\begin_float footnote +\layout Standard + +Remember, a +\latex latex + +\backslash +texttt{jsr} +\latex default + or +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + instruction is an unconditional branch instruction that jumps into a +\emph on +subroutine +\emph default +. + Usually a +\latex latex + +\backslash +texttt{ret} +\latex default + instruction leaves the +\emph on +subroutine +\emph default +. +\end_float +, +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + and +\latex latex + +\backslash +texttt{ret} +\latex default + this calculation would be easy. + But to calculate successors of a +\latex latex + +\backslash +texttt{ret} +\latex default + instruction, you need a complete control flow graph: you need to find out + which +\latex latex + +\backslash +texttt{jsr} +\latex default + or +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + and +\latex latex + +\backslash +texttt{ret} +\latex default + pairs belong together. + Therefore, a cycle of self-dependency is created that has to be broken + somewhere. + This is explained in detail below. +\layout Standard + +This was also an issue that led to the definition of the term +\emph on + subroutine +\emph default + that JustIce uses. + This definition allows the prediction of a +\latex latex + +\backslash +texttt{ret} +\latex default + instruction's target without performing control flow analysis. +\layout Subsubsection + + +\begin_inset LatexCommand \label{SpecSubroutines} + +\end_inset + +Subroutines +\layout Standard + +Subroutines make the verification algorithm extremely difficult. + They are harshly underspecified. + Although +\begin_inset Quotes eld +\end_inset + +the Java virtual machine has no guarantee that any file it is asked to load + was generated by that compiler +\begin_inset Quotes erd +\end_inset + +, the subroutine specification explains how +\emph on +javac +\emph default +transforms +\begin_inset Quotes eld +\end_inset + + +\latex latex + +\backslash +texttt{try} +\latex default +/ +\latex latex + +\backslash +texttt{catch} +\latex default +/ +\latex latex + +\backslash +texttt{finally} +\latex default + +\begin_inset Quotes erd +\end_inset + + clauses into subroutines +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +. + Intuitively, one gets the idea that a subroutine starts with some jump + target of a +\latex latex + +\backslash +texttt{jsr} +\latex default + or +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + instruction and ends with a +\latex latex + +\backslash +texttt{ret} +\latex default + instruction. + But the specification fails to correctly specify what subroutines exactly + are at machine instruction level. + Consider algorithm +\begin_inset LatexCommand \ref{jsrpopalgo} + +\end_inset + +. +\layout Standard + +\begin_float alg +\layout Standard + + +\family typewriter +00 jsr\SpecialChar ~ +03\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; Jump to +\begin_inset Quotes eld +\end_inset + +subroutine +\begin_inset Quotes erd +\end_inset + + at offset 03; push return +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; address 03 onto stack. +\layout Standard + + +\family typewriter +03 pop\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; Pop the return address off the stack. +\layout Standard + + +\family typewriter +04 nop\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; No operation. +\layout Caption + + +\begin_inset LatexCommand \label{jsrpopalgo} + +\end_inset + +Is This a Subroutine? +\end_float +\layout Standard + +What is this? Is the +\emph on +NOP +\emph default + instruction part of a subroutine or not? Algorithm +\begin_inset LatexCommand \ref{OneOrTwoSubroutinesAlgo} + +\end_inset + + shows another example. +\layout Standard + +\begin_float alg +\layout Caption + + +\begin_inset LatexCommand \label{OneOrTwoSubroutinesAlgo} + +\end_inset + +One or Two Subroutines? +\layout Standard + + +\family typewriter +00 iload_0\SpecialChar ~ +\SpecialChar ~ +; Load a numerical 0 onto the stack. +\layout Standard + + +\family typewriter +01 jsr\SpecialChar ~ +05\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; Jump to "subroutine" at offset 05; push return +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; address 04 onto stack. +\layout Standard + + +\family typewriter +04 return\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; Leave the method. +\layout Standard + + +\family typewriter +05 dup\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; Duplicate the stack's top. +\layout Standard + + +\family typewriter +06 astore\SpecialChar ~ +0\SpecialChar ~ +; Store the return address from the stack into +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; local variable 0. +\layout Standard + + +\family typewriter +07 astore\SpecialChar ~ +1\SpecialChar ~ +; Store the return address from the stack into +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; local variable 1. +\layout Standard + + +\family typewriter +08 ifeq\SpecialChar ~ +12\SpecialChar ~ +\SpecialChar ~ +; If there is a 0 on top of the stack, jump to +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; offset 12. +\layout Standard + + +\family typewriter +11 ret\SpecialChar ~ +0\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; Return to offset 4 (because this is in local +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; variable 0 here). +\layout Standard + + +\family typewriter +12 nop\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; No operation. +\layout Standard + + +\family typewriter +13 ret\SpecialChar ~ +1\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; Return to offset 4 (because this is in local +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; variable 1 here). +\end_float +\layout Standard + +Do we deal with one subroutine (which is the case if you define subroutines + to start with a +\latex latex + +\backslash +texttt{jsr} +\latex default + or +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default +'s target) or are these two subroutines (which is the case if you count + the +\latex latex + +\backslash +texttt{ret} +\latex default + instructions and believe that there must be exactly one +\latex latex + +\backslash +texttt{ret} +\latex default + per subroutine)? +\layout Standard + +Recursive calls to subroutines are forbidden by the specification; however, + Sun's verifier implementations are not consequently deciding which recursive + calls to reject +\begin_float footnote +\layout Standard + +This was experimentally found by the author and also published in +\begin_inset LatexCommand \cite{JBook} + +\end_inset + +. +\end_float +. + This is a failure due to a missing definition of the term +\emph on +subroutine +\emph default +. +\layout Standard + +While the first example passes Sun's verifier, the second example is rejected. + The exact definition of the term +\emph on +subroutine +\emph default + cannot be deducted from ther behaviour of Sun's verifier. +\layout Standard + +A new, clean specification had to be defined. + Such a specification can of course not be compatible with the behaviour + of Sun's verifier in all corner cases. +\layout Subsubsection + + +\begin_inset LatexCommand \label{Subroutines_Def} + +\end_inset + +A Precise Definition of the Term +\emph on +Subroutine +\layout Standard + +Because Sun --inappropriately-- describes how +\emph on +javac +\emph default + creates subroutines, the definition presented here is based on the observation + of +\emph on +javac +\emph default +'s behaviour. + This makes the definition compatible with a lot of existing code, but without + violating the validity of far-reaching conclusions earned by exploiting + a clean definition +\begin_float footnote +\layout Standard + +Unfortunately, in some rare cases, +\emph on +javac +\emph default + produces code that is incompatible with the constraints related to our + definition of +\emph on +subroutine +\emph default +. + However, +\emph on +javac +\emph default + also produces code which is incompatible with Sun's verifier (see section + +\begin_inset LatexCommand \ref{StaerkJreject} + +\end_inset + +). +\end_float +. + +\layout Itemize + +Every instruction of a method is part of exactly one subroutine (or the + top-level). +\layout Itemize + +The first instruction of a subroutine is an +\latex latex + +\backslash +texttt{astore N} +\latex default + instruction that stores the return address in local variable number +\emph on +N +\emph default +. +\layout Itemize + +There must be exactly one +\latex latex + +\backslash +texttt{ret} +\latex default + instruction per subroutine. + This instruction must work on the local variable +\emph on +N +\emph default +; i.e., it is a +\latex latex + +\backslash +texttt{ret N} +\latex default + instruction. +\layout Itemize + +Subroutines are not protected by exception handlers. +\layout Itemize + +No instruction that is part of a subroutine is the target of an exception + handler. +\layout Itemize + +Subroutines of a subroutine do not access local variable +\emph on +N +\emph default +. + A subsubroutine of a subroutine is also considered a subroutine here, in + a recursive sense. +\layout Standard + +As we can see, a subroutine can be characterized by its set of instructions, + the most important instruction being the target of some +\latex latex + +\backslash +texttt{jsr} +\latex default + or +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + instruction that is not part of the subroutine itself. + Another important property is the local variable +\emph on +N +\emph default + the +\latex latex + +\backslash +texttt{ret} +\latex default + instruction is working on. +\layout Standard + +This way, we can make sure subroutines are properly nested, so that JustIce + would reject both the example bytecodes in algorithms +\begin_inset LatexCommand \ref{jsrpopalgo} + +\end_inset + + and +\begin_inset LatexCommand \ref{OneOrTwoSubroutinesAlgo} + +\end_inset + +. +\layout Standard + +The +\latex latex + +\backslash +texttt{astore} +\latex default + instruction mentioned above is so important because there is no JVM instruction + that can read values of a +\latex latex + +\backslash +texttt{returnaddress} +\latex default + type from local variables. + After entering a subroutine, the +\latex latex + +\backslash +texttt{astore} +\latex default + instruction pops the return address off the operand stack and writes it + into local variable number +\emph on +N +\emph default +. + Therefore we can be sure it will not be duplicated or deleted as in algorithms + +\begin_inset LatexCommand \ref{jsrpopalgo} + +\end_inset + + and +\begin_inset LatexCommand \ref{OneOrTwoSubroutinesAlgo} + +\end_inset + +. +\layout Standard + +The constraints concerning exception handlers are defined to make sure that + we can observe the control flow statically. + If an exception is thrown from within a subroutine, the method simply +\begin_inset Quotes eld +\end_inset + + +\emph on +completes abruptly +\emph default + +\begin_inset Quotes erd +\end_inset + + ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 74). + If we would allow subroutine instructions to be protected by exception + handlers, it would not be clear if the handling instructions are part of + the subroutine or not. +\layout Standard + +We can also derive subsubroutines of subroutines recursively by exploiting + the properly-nested property explained above. +\layout Subsubsection + +The Control Flow Graph +\layout Standard + +A control flow graph is a directed graph with edges that represent possible + branches of control flow. + Similarly, the nodes describe groups of physically adjacent instructions + that have to be executed one after another -- without any possible control + flow branch to another instruction but the physical successor +\begin_float footnote +\layout Standard + +More information about control flow graphs can be found in +\begin_inset LatexCommand \cite{DragonBook} + +\end_inset + +. +\end_float +. + Figure +\begin_inset LatexCommand \ref{convcfg} + +\end_inset + + shows such a control flow graph for algorithm +\begin_inset LatexCommand \ref{facjavabytecode} + +\end_inset + +, the implementation of the faculty function discussed earlier. +\layout Standard + +\begin_float fig +\layout Standard +\align center + +\begin_inset Figure size 595 368 +file conventcfg.eps +width 3 100 +flags 9 + +\end_inset + + +\layout Caption + + +\begin_inset LatexCommand \label{convcfg} + +\end_inset + +A Conventional Control Flow Graph +\end_float +\layout Standard + +The JVM defines a sort of control flow orthogonal to the common execution + of instructions, namely, the exception mechanism. + Because every instruction could possibly throw an exception (say, a +\family typewriter +java.lang.VirtualMachineError +\family default +) during its execution, the control flow graph calculated by JustIce always + uses only one instruction per node. + This also reflects the original verification algorithm given by Sun Microsystem +s. + Figure +\begin_inset LatexCommand \ref{justicecfg} + +\end_inset + + shows an example for such a control flow graph. +\layout Standard + +\begin_float fig +\layout Standard +\align center + +\begin_inset Figure size 595 473 +file justicecfg.eps +width 3 100 +flags 9 + +\end_inset + + +\layout Caption + + +\begin_inset LatexCommand \label{justicecfg} + +\end_inset + +A Control Flow Graph as Used by JustIce +\end_float +\layout Standard + +Instruction nodes are augmented with a data structure that represents the + simulated operand stack and the simulated local variables array. + When running the core verification algorithm, these nodes are put into + a queue which is equivalent to tagging them with a +\emph on +changed +\emph default + bit as Sun describes +\begin_float footnote +\layout Standard + +As explained later, JustIce uses a queue that allows duplicates: this is + a slight semantical change. +\end_float +. +\layout Subsubsection + +Subroutines Revisited: Interplay With the Data Flow Analyzer +\layout Standard + +There is another problem concerning subroutines. + Normally, when merging the type information of two simulated local variables, + the common type is recorded as +\emph on +unusable +\emph default + if the types differ. + This +\emph on +unusable +\emph default + value is then propagated to subsequent instructions to prevent read access. +\layout Standard + +This is not the case with the successors of the +\latex latex + +\backslash +texttt{ret} +\latex default + instruction. + These successors are physical successors of some +\latex latex + +\backslash +texttt{jsr} +\latex default + or +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + instructions. +\layout Standard + +Subroutines are said to be +\emph on +polymorphic +\emph default + with respect to their local variables arrays. + As an example, consider algorithm +\begin_inset LatexCommand \ref{lvpolymorphalgo} + +\end_inset + +. + This algorithm shows legal JVM code. + In line 11, local variable 0 may contain a value of the +\family typewriter +integer +\family default + or the +\family typewriter +float +\family default + type; depending on the +\latex latex + +\backslash +texttt{jsr} +\latex default + instruction that entered the subroutine. + Normally, this would cause the verifier to mark local variable 0 as +\emph on +unusable +\emph default +and propagate this information. + The successors of the +\latex latex + +\backslash +texttt{ret} +\latex default + instruction are the instructions in lines 5 and 10. + However, a correct verifier does +\emph on +not +\emph default + mark local variable 0 as +\emph on +unusable +\emph default + for them, because the local variable 0 was not accessed or modified in + the subroutine. +\layout Standard + +\begin_float alg +\layout Caption + + +\begin_inset LatexCommand \label{lvpolymorphalgo} + +\end_inset + +Local Variables are Polymorphic in Subroutines +\layout Standard + + +\family typewriter +0 : iconst_0\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; load integer constant 0 onto stack +\layout Standard + + +\family typewriter +1 : istore 0\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; move it into local variable 0 +\layout Standard + + +\family typewriter +2 : jsr 11\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; enter subroutine +\layout Standard + + +\family typewriter +5 : fconst 0.0\SpecialChar ~ +; load float constant 0.0 onto stack +\layout Standard + + +\family typewriter +6 : fstore 0\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; move it into local variable 0 +\layout Standard + + +\family typewriter +7 : jsr 11\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; enter subroutine again +\layout Standard + + +\family typewriter +10: return\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; complete method +\layout Standard + + +\family typewriter +11: astore 1\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; Subroutine entry: move return address +\layout Standard + + +\family typewriter +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; into local variable 1 +\layout Standard + + +\family typewriter +12: nop\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; do nothing +\layout Standard + + +\family typewriter +13: ret 1\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; return from subroutine +\end_float +\layout Standard + +Basically, only the local variables accessed in the called subroutine (and + the subroutines called from there, recursively) are merged with the correspondi +ng successor of a +\latex latex + +\backslash +texttt{ret} +\latex default + instruction. + This means that in this special case, three sources are used to construct + the merged array of local variables type information (instead of only two): + the +\latex latex + +\backslash +texttt{jsr} +\latex default +/ +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + instruction, the +\latex latex + +\backslash +texttt{ret} +\latex default + instruction and the "old" type information of the +\latex latex + +\backslash +texttt{ret} +\latex default + instruction's target (which is the physical successor of the +\latex latex + +\backslash +texttt{jsr} +\latex default +/ +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default +instruction). +\layout Standard + +One possibility to deal with this situation is +\emph on +inlining +\emph default +. + For instance, the verifier of the ElectricalFire JVM +\begin_inset LatexCommand \cite{EF} + +\end_inset + + uses this approach: instruction nodes of subroutines are duplicated for + every calling +\latex latex + +\backslash +texttt{jsr} +\latex default + or +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + instruction. + This approach is equivalent to the one sketched by Sun (see +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 151). + +\layout Standard + +JustIce uses a variant of this approach: instruction nodes are augmented + with sets of local variables arrays. + The local variables array used for merging a +\latex latex + +\backslash +texttt{ret} +\latex default +'s type information with the physical successor of some +\latex latex + +\backslash +texttt{jsr} +\latex default +/ +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + instruction is keyed by that +\latex latex + +\backslash +texttt{jsr} +\latex default +/ +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + instruction itself. + This still implies a special merging mechanism for the +\latex latex + +\backslash +texttt{ret} +\latex default + instruction: only the physical successor of one +\latex latex + +\backslash +texttt{jsr} +\latex default +/ +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + instruction can be merged with the +\latex latex + +\backslash +texttt{ret} +\latex default + at a time, because other +\latex latex + +\backslash +texttt{jsr} +\latex default +/ +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + instructions have possibly not been symbolically executed yet and thus + bear no type information at the time of merging. + In this scenario, an instruction in a subroutine plays multiple roles; + one for each occurence of a +\latex latex + +\backslash +texttt{jsr} +\latex default +/ +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + that is calling the subroutine. + The queue holding the instructions to symbolically execute is therefore + required to allow duplicates. +\layout Subsubsection + +Wide Data Types +\layout Standard + +The types +\family typewriter +long +\family default + and +\family typewriter +double +\family default +use two consecutive local variables if written to or read from a local variables + array. + Similarly, they use two operand stack slots. + This makes type verification a bit more difficult because of subtle special + cases. + For example, when a method uses three local variables at maximum (local + variables 0, 1 and 2), the code is not allowed to store a +\family typewriter +double +\family default + value in local variable 2 (because local variable 3 would have to be occupied, + too). +\layout Subsubsection + +Instance Initialization and Newly Created Objects +\layout Standard + +It would be difficult to verify that a newly created instance is initialized + exactly once, given all possible paths of execution flow in a method. + Fortunately (from a verifier implementor's view), Sun puts constraints + on object initialization that match the behaviour of the verifier --- instead + of putting sane constraints on object initialization and actually verifying + them. +\layout Standard + + +\begin_inset Quotes eld +\end_inset + +A valid instruction sequence must not have an uninitialized object on the + operand stack or in a local variable during a backwards branch [\SpecialChar \ldots{} +]. + Otherwise, a devious piece of code might fool the verifier into thinking + it had initialized a class instance when it had, in fact, initialized a + class instance created in a previous pass through a loop +\begin_inset Quotes erd +\end_inset + + ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 148). +\layout Section + + +\begin_inset LatexCommand \label{Pass4Spec} + +\end_inset + +Pass Four +\layout Standard + +Pass four performs +\begin_inset Quotes eld +\end_inset + +certain tests that could in principle be performed in Pass 3 +\begin_inset Quotes erd +\end_inset + + ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 142). + These tests are usually delayed by JVM implementations until run-time, + because they possibly trigger the loading of referenced class file definitions. + This is a performance enhancement. + However, +\begin_inset Quotes eld +\end_inset + +A Java virtual machine implementation is allowed to perform any or all of + the Pass 4 steps as part of Pass 3 +\begin_inset Quotes erd +\end_inset + + ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 143). + The tests +\layout Itemize + +ensure that the referenced method or field exists in the given class +\layout Itemize + +check that the referenced method or field has the indicated descriptor (signatur +e) +\layout Itemize + +check that the currently executing method has access to the referenced method + or field. +\layout Standard + +JustIce has no run-time system and so the tests of pass four are performed + in pass 3a. +\layout Standard + +There are tests that have to be performed at run-time: for example, if an + object referenced by an object reference on top of the operand stack implements + a certain interface or not +\begin_inset LatexCommand \cite{Fong2-WWW} + +\end_inset + +. + These are not considered part of the pass four verification. +\layout Chapter + +Implementation of the Verification Passes +\layout Standard + +Occasionally, the behaviour of other verifier implementations was explained + in section +\begin_inset LatexCommand \ref{SpecPasses} + +\end_inset + + +\emph on +. + +\emph default +This is not a mistake; the Java Virtual Machine Specification, Second Edition + +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + + is unfortunately not detailed enough to make a clean-room implementation + of the JVM verifier possible. + Having a close look at the behaviour of existing verifier implementations + is sometimes necessary to interpret the specification correctly. + For that reason, the behaviour of these implementations is part of the + specification of JustIce whereever appropriate. + Still, there are some minor differences in behaviour between JustIce and + the traditional JVM built-in verifiers. + These differences were observed by using the traditional verifiers, not + by inspecting their source code. +\layout Standard + +JustIce is implemented in the Java programming language +\begin_inset LatexCommand \cite{langspec2} + +\end_inset + + using the Byte Code Engineering Library +\begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} + +\end_inset + +. +\layout Section + +Pass One +\layout Standard + +The Byte Code Engineering Library (BCEL) presents an object oriented view + of the class file structure. + Therefore, an integral part of that library is parsing class files. + JustIce uses the BCEL, so there was nothing left to do to load a class + file in. + Only minor changes were made to the BCEL to make it more verbose when exception +al situations occur; i.e., when a garbled class file is loaded in. + The BCEL uses Java's exception mechanism to signal these situations; JustIce + transforms this behaviour into the behaviour expected by users of the Verificat +ion API (see section +\begin_inset LatexCommand \ref{Verification API} + +\end_inset + +). +\layout Subsubsection + +Comparison to Sun's Implementation +\layout Standard + +There does not seem to be any difference in behaviour between JustIce and + the traditional verifiers. + Still, this conviction is a result of black box tests so it might not be + true in corner cases. +\layout Standard + +Unknown attributes are ignored (though JustIce records a warning message, + where the traditional verifiers don't). +\layout Standard + +Trailing bytes at the end of the class file are ignored in both versions, + contradicting the specification. + This was necessary because some Java run-time environments are broken concernin +g the handling of .JAR archive files. + The mechanism of loading class files from these archives files using the + Java Platform's API is used by BCEL and probably by Sun's JVM, too. + It is possible that this is the reason why Sun's verifier itself does not + enforce this constraint. + However, it does not really pose a threat to the integrity of any JVM known + to the author. + There is no entry in the +\family typewriter +ClassFile +\family default + structure (see section +\begin_inset LatexCommand \ref{Classfile Structure} + +\end_inset + +) stating how long the class file is in its entirety, so a JVM implementor + cannot possibly base a wrong decision on that. + +\layout Section + + +\begin_inset LatexCommand \label{Pass2Impl} + +\end_inset + +Pass Two +\layout Standard + +JustIce does perform +\begin_inset Quotes eld +\end_inset + +all verification that can be performed without looking at the bytecodes +\begin_inset Quotes erd +\end_inset + + in pass two. + For some reasons (like determining a valid ancestor hierarchy of a class), + pass two of JustIce has to load referenced classes. + Of course, this is done in a careful way: by pass-one-verifying them. + If loading of a referenced class should fail (i.e., verification pass one + fails on this class), the referencing class is rejected by JustIce's pass + two. + Pass two of JustIce does not pass-two-verify any referenced classes. +\layout Standard + +Also, JustIce's pass two emits a wealth of (warning) messages. + Their target is to guide a bytecode engineer to create class files that + are indistinguishable from those created by Sun's +\emph on +javac +\emph default + compiler with no debugging output. + For example, the use of +\family typewriter +LineNumberTable +\family default + attributes (see section +\begin_inset LatexCommand \ref{LineNumberTableAttribute} + +\end_inset + +) is discouraged, because these atributes are only useful for debugging + purposes. + Still, they can be the reason for a class file to be rejected -- to be + on the safe side, finished applications for the JVM should not be shipped + with this debug information. +\layout Standard + +Most of the checks of pass two were implemented using the Visitor programming + pattern +\begin_inset LatexCommand \cite{DesignPatterns} + +\end_inset + + provided by the BCEL's +\emph on +de.fub.byte\SpecialChar \- +code.class\SpecialChar \- +file +\emph default + API. + This made it possible to have all the verification split into several methods + without having to define artificial boundaries. + For instance, a +\family typewriter +ConstantValue +\family default + attribute is verified in a method called +\emph on +visitConstantValue(ConstantValue) +\emph default +. + This is a use of the object oriented view of class files the BCEL offers. +\layout Subsubsection + +Comparison to Sun's Implementation +\layout Standard + +JustIce does not distinguish between run-time or link-time because it was + not intended to implement a JVM. + Therefore, the notion of +\emph on +resolving +\emph default +(see section +\begin_inset LatexCommand \ref{SpecPassTwo} + +\end_inset + +) is useless for JustIce. + The author believes that the specification of pass two given by Sun closely + reflects their implementation (or the other way around) +\begin_float footnote +\layout Standard + +The Java Virtual Machine Specification, Second Edition, began as an internal + project documentation ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page xiv). + Unfortunately, this can still be felt sometimes. +\end_float +. +\layout Standard + +Sometimes, there are ambiguities in the specification. + For instance, it is said that +\begin_inset Quotes eld +\end_inset + +If the constant pool of a class or interface refers to any class or interface + that is not a member of a package, its +\family typewriter +ClassFile +\family default + structure must have exactly one +\family typewriter +InnerClasses +\family default + attribute in its +\family typewriter +attributes +\family default + table +\begin_inset Quotes erd +\end_inset + +. + A class or interface that is +\begin_inset Quotes eld +\end_inset + +not member of a package +\begin_inset Quotes erd +\end_inset + + is better known as a +\emph on +nested class +\emph default + or +\emph on +inner class +\emph default + +\begin_inset LatexCommand \cite{InnerSpec} + +\end_inset + +, but this is something specific to the Java language. + The +\emph on +javac +\emph default + compiler creates multiple, often funny-named +\begin_float footnote +\layout Standard + +For anonymous classes defined in a class +\emph on +X +\emph default + the names are +\emph on +X$1 +\emph default +, +\emph on +X$2 +\emph default + and so on. + For a named inner class +\emph on +I +\emph default + defined in class +\emph on +C +\emph default + the name is +\emph on +C$I +\emph default +. + There is, however, no guarantee for that: this is only observed behaviour + of javac. + Please see section +\begin_inset LatexCommand \ref{InnerBug} + +\end_inset + + for an example how this behaviour can lead to unexpected problems. +\end_float + class files that are otherwise indistinguishable from normal class files. +\layout Standard + +Therefore, it is generally not possible to decide if such an attribute is + missing; therefore Sun's implementation does not check this constraint. + JustIce, in contrast, uses its warning mechanism if the name of a referenced + class or interface could be a name of an inner class created by the +\emph on +javac +\emph default + compiler and the +\family typewriter +InnerClass +\family default + attribute is missing. +\layout Standard + +The sets of accepted or rejected class files concerning pass two are equal + using both Sun's implementation and JustIce, as exhaustive tests show. + This can, however, not be proven because one would need to analyze Sun's + source code for that (which is not intended: as already mentioned, JustIce + is a clean-room implementation). +\layout Section + +Pass Three +\layout Subsection + +Pass 3a +\layout Standard + +One feature of the BCEL's +\emph on +de.fub.bytecode.generic +\emph default + package is parsing code attributes of methods and transforming them into + so-called +\family typewriter +Instruction\SpecialChar \- +List +\family default + objects. + Consequently, this feature is used to implement pass 3a; a few additional + checks have been implemented where BCEL is too +\begin_inset Quotes eld +\end_inset + +trustful +\begin_inset Quotes erd +\end_inset + + when parsing, i.e., where BCEL relies on the correctness of the class file. +\layout Standard + +Pass 3a consists of the checking of static constraints on instructions and + static constraints on operands of these instructions. + The successful creation an an +\family typewriter +Instruction\SpecialChar \- +List +\family default + object already implies that the static constraints on instructions are + satisfied. + Similar to pass one, JustIce transforms the behaviour of BCEL's exception + mechanism into the behaviour expected by users of the Verification API + (see section +\begin_inset LatexCommand \ref{Verification API} + +\end_inset + +). +\layout Standard + +The +\emph on +de.fub.byte\SpecialChar \- +code.ge\SpecialChar \- +ne\SpecialChar \- +ric +\emph default +API provided by BCEL offers a Visitor design pattern similar to the one + of the +\emph on +de.fub.byte\SpecialChar \- +code.class\SpecialChar \- +file +\emph default + API. + The tests for the static constraints on operands of instructions are implemente +d by using it. + For example, the constraints put on the operands of any +\latex latex + +\backslash +texttt{iload} +\latex default + instruction are verified using a +\emph on +visitILOAD(ILOAD) +\emph default + method defined in a Visitor class. + This Visitor class implements all the checks for integrity of all instruction's + operands. + Algorithm +\begin_inset LatexCommand \ref{visitILOADstaticoperands} + +\end_inset + + shows the impementation of the +\emph on +visitILOAD(ILOAD) +\emph default + method. +\begin_float alg +\layout Caption + + +\begin_inset LatexCommand \label{visitILOADstaticoperands} + +\end_inset + +visitILOAD, Visitor ensuring static constraints on operands of instructions +\layout Standard + + +\family typewriter +\SpecialChar \- +\SpecialChar ~ +/** Checks if the constraints of operands of the said instruction(s) are + satisfied. + */ +\newline +\SpecialChar \- +public void visitILOAD(ILOAD o){ +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +int idx = o.getIndex(); +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +if (idx < 0){ +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +constraintViolated(o, "Index '"+idx+"' must be non-negative."); +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +} +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +else{ +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +int maxminus1 = max_locals()-1; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +if (idx > maxminus1){ +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 + '"+maxminus1+"'."); +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +} +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +} +\newline +} +\end_float +\layout Standard + +JustIce does not provide any run-time, so the tests of pass four (see section + +\begin_inset LatexCommand \ref{Pass4Spec} + +\end_inset + +) are not delayed until run-time, but performed here. +\layout Subsubsection + +Comparison to Sun's Implementation +\layout Standard + +Sun does not distinguish pass 3a and pass 3b. + However, Sun's verifiers also have to ensure that the static constraints + on instructions are satisfied before starting data flow analysis. +\layout Standard + +This is obvious because a data structure has to be built before the data + flow analyzer can be run; and this data structure has to be built carefully +\begin_float footnote +\layout Standard + +This actually means verifying the structural integrity of the bytecodes. +\end_float + because passes one and two did not look at the bytecodes before. +\layout Standard + +JustIce does implement pass four checks in pass 3a which Sun's verifiers + do not. + Because JustIce provides no run-time, the outcome of a verification failure + is reported instantly. + Traditional JVMs are required to silently delay the actions triggered by + that knowledge until run-time. +\layout Subsection + +Pass 3b +\layout Standard + +JustIce aims at implementing Sun's data flow analyzing algorithm as closely + as possible. + First, a control flow graph is built --- which implies analyzing a method's + subroutine calling structure first. +\layout Standard + +After that an implementation of the core algorithm sketched by Sun Microsystems + is started. + Verification failure is internally signalled by the Java exception handling + mechanism which is then transformed to match the Verification API (see + section +\begin_inset LatexCommand \ref{Verification API} + +\end_inset + +). +\layout Subsubsection + + +\begin_inset LatexCommand \label{SubroutineImpl} + +\end_inset + +Subroutines +\layout Standard + +Subroutines are modeled as instances of the +\family typewriter +Subroutine +\family default + interface +\emph on +. + +\emph default + They provide the following methods (note that an +\family typewriter +InstructionHandle +\family default + is the BCEL's programming handle to instruction objects and that +\emph on +X[] +\emph default + is the common Java notation for +\emph on +array of +\emph default + +\emph on +X +\emph default +): +\layout Itemize + + +\emph on +boolean contains(InstructionHandle) +\emph default + +\newline +Returns true if and only if the given +\family typewriter +InstructionHandle +\family default + refers to an instruction that is part of this subroutine, +\layout Itemize + + +\emph on +InstructionHandle[] getInstructions() +\emph default + +\newline +Returns all instructions that together form this subroutine, +\layout Itemize + + +\emph on +int[] getAccessedLocalsIndices() +\emph default + +\newline +Returns an array containing the indices of the local variable slots accessed + by this subroutine (read-accessed, write-accessed or both); local variables + referenced by subroutines of this subroutine are not included, +\layout Itemize + + +\emph on +int[] getRecursivelyAccessedLocalsIndices() +\emph default + +\emph on + +\newline + +\emph default +Returns an array containing the indices of the local variable slots accessed + by this subroutine (read-accessed, write-accessed or both); local variables + referenced by subroutines of this subroutine are included, +\layout Itemize + + +\emph on +Subroutine[] subSubs() +\emph default + +\emph on + +\newline + +\emph default +Returns the subroutines that are directly called from this subroutine, +\layout Itemize + + +\emph on +InstructionHandle[] getEnteringJsrInstructions() +\emph default + +\newline +Returns all the JsrInstructions that have the first instruction of this + subroutine as their target, +\layout Itemize + + +\emph on +InstructionHandle getLeavingRET() +\emph default + +\newline +Returns the one and only RET that leaves the subroutine. +\layout Standard + +Together with information from a simple analysis of the possible control + flow transfer of all the other instructions but +\latex latex + +\backslash +texttt{ret} +\latex default + (see section +\begin_inset LatexCommand \ref{Pass3Spec} + +\end_inset + +), a control flow graph is built. +\layout Subsubsection + +The Control Flow Graph +\layout Standard + +The control flow graph is a single instance with respect to a given method + to verify. + It is defined by providing access to a set of contexts of instructions. + These are modeled as instances of the +\emph on + +\family typewriter +\emph default +In\SpecialChar \- +struc\SpecialChar \- +tion\SpecialChar \- +Con\SpecialChar \- +text +\family default + interface. +\layout Standard + +These instances enclose +\family typewriter +InstructionHandle +\family default + objects (which represent an instruction in the bytecode), but they augment + these objects with type information (a set of +\family typewriter +Frame +\family default +s, see below) as needed by the data flow analysis algorithm. + Also, a method called +\emph on +getSuccessors() +\emph default +is provided that calculates the possible control flow successors of a given + +\family typewriter +In\SpecialChar \- +struc\SpecialChar \- +tion\SpecialChar \- +Con\SpecialChar \- +text +\family default + instance. +\layout Standard + +The most notable method defined in the +\family typewriter +In\SpecialChar \- +struc\SpecialChar \- +tion\SpecialChar \- +Con\SpecialChar \- +text +\family default +\emph on + +\emph default +interface is, however, the +\emph on +execute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) +\emph default + method. + This method is used to symbolically execute a given instruction. +\layout Standard + +The +\family typewriter +ArrayList +\family default +\emph on + +\emph default +argument is there to record the subroutine calling chain. + The properly-nested property of JustIce subroutines is exploited here: + one can simply count +\latex latex + +\backslash +texttt{jsr} +\latex default +/ +\latex latex + +\backslash +texttt{jsr +\backslash +_w} +\latex default + and +\latex latex + +\backslash +texttt{ret} +\latex default + instructions, similar to counting opened and closed braces in mathematical + expressions. +\layout Standard + +A +\family typewriter +Frame +\family default + is JustIce's model of an +\emph on +execution frame +\emph default +: a local variables array model together with an operand stack model. + Every +\emph on +InstructionContext +\emph default + instance is augmented with such a frame (to be precise, a set of such frames + as discussed in the specification of subroutines, see section +\begin_inset LatexCommand \ref{Pass3Spec} + +\end_inset + +). +\layout Standard + +When frames are merged, the +\emph on +execute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) +\emph default +method of some successor +\family typewriter +InstructionContext +\family default + is called. + The +\family typewriter +Frame +\family default + argument represents is the current type information of the predecessing + +\family typewriter +InstructionContext. +\layout Subsubsection + +Visitors +\layout Standard + +As in pass 3a, the Visitor pattern of the BCEL +\emph on +de.fub.byte\SpecialChar \- +code.ge\SpecialChar \- +ne\SpecialChar \- +ric +\emph default + API is also used in pass 3b. + While it was used to verify the static constraints of pass three in pass + 3a, it is now used to verify the structural constraints. +\layout Standard + +Before an instruction +\family typewriter +X +\family default + is symbolically executed, the corresponding +\emph on +visitX(X) +\emph default + method is invoked on an +\family typewriter +InstConstraintVisitor +\family default + instance. + This instance is there to verify all the preconditions are met to safely + execute the instruction +\family typewriter +X +\family default +. + The +\family typewriter +InstConstraintVisitor +\family default + class therefore holds information about the preconditions of all 212 valid + Java bytecode instructions. + A simplified version of this Visitor's +\emph on +visitILOAD(ILOAD) +\emph default + method is listed in algorithm +\begin_inset LatexCommand \ref{visitILOADInstConstraints} + +\end_inset + +. +\layout Standard + +Similarly, the +\emph on + +\family typewriter +\emph default +ExecutionVisitor +\family default + class contains information about the behaviour of every bytecode instruction. + An instance of this class is used to model the effect of the bytecode instructi +ons on a +\emph on +Frame +\emph default + instance. + Algorithm +\begin_inset LatexCommand \ref{visitILOADExecution} + +\end_inset + + shows the +\emph on +visitILOAD(ILOAD) +\emph default + method of this Visitor. +\layout Standard + +\begin_float alg +\layout Caption + + +\begin_inset LatexCommand \label{visitILOADInstConstraints} + +\end_inset + +visitILOAD, Visitor ensuring the structural (dynamic) constraints of instruction +s +\layout Standard + + +\family typewriter +public void visitILOAD(ILOAD o){ +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +int produce = o.produceStack(cpg); +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +if ( produce + stack().slotsUsed() > stack().maxStack() ){ +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +constraintViolated(o, "Cannot produce "+produce+" stack slots: only "+(stack().ma +xStack()-stack().slotsUsed())+" free stack slot(s) left. +\backslash +nStack: +\backslash +n"+stack()); +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +} +\newline +[\SpecialChar \ldots{} +] +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +} +\end_float +\begin_float alg +\layout Caption + + +\begin_inset LatexCommand \label{visitILOADExecution} + +\end_inset + +visitILOAD, Visitor symbolically executing instructions +\layout Standard + + +\family typewriter +/** Symbolically executes the corresponding Java Virtual Machine instruction. + */ +\newline +\SpecialChar \- +public void visitILOAD(ILOAD o){ +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +stack().push(Type.INT); +\newline +\SpecialChar \- +} +\end_float +\begin_float alg +\layout Caption + +Simplified Core Verification Algorithm of Pass 3b +\layout Standard + + +\series bold +\size small +public VerificationResult do_verify(Method m) +\series default +{ +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +ControlFlowGraph cfg; +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +if (m.hasCode()) +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +cfg = new ControlFlowGraph(m) +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +else +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return Good_VerificationResult; +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +Frame f = new Frame(); +\shape slanted +// local variables and operand stack +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +f.localVariables().initialize(m.signature()); +\shape slanted +// put formal param types into loc. + vars +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +InstConstraintVisitor icv = new InstConstraintVisitor(); +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +ExecutionVisitor ev = new ExecutionVisitor(); +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +try{ +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +circulationPump(cfg, f, icv, ev); +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +} +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +catch(VerificationFailure){ +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return Bad_VerificationResult; +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +} +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +return Good_VerificationResult; +\layout Standard + + +\size small +} +\newline + +\layout Standard + + +\series bold +\size small +public void circulationPump(ControlflowGraph cfg, Frame startFrame, InstConstrai +ntVisitor icv, ExecutionVisitor ev) throws VerificationFailure +\series default +{ +\layout Standard + + +\size small +Instruction start = cfg.getFirstInstruction(); +\layout Standard + + +\shape slanted +\size small +/* +\layout Standard + + +\shape slanted +\size small +Now merge the first frame (type info) into the first instruction. +\layout Standard + + +\shape slanted +\size small +Empty list -> no instructions have been executed before. +\layout Standard + + +\shape slanted +\size small +*/ +\layout Standard + + +\size small +start.execute(startFrame, EmptyInstructionList, icv, ev); +\layout Standard + + +\shape slanted +\size small +/* +\layout Standard + + +\shape slanted +\size small +Q is a Queue of pairs (Instruction, InstructionList). +\layout Standard + + +\shape slanted +\size small +*/ +\layout Standard + + +\size small +Queue Q = EmptyQueue; +\layout Standard + + +\shape slanted +\size small +/* +\layout Standard + + +\shape slanted +\size small +Put the first instruction into the queue. + This is similar to initializing a breadth first search. +\layout Standard + + +\shape slanted +\size small +*/ +\layout Standard + + +\size small +Q.add (start, EmptyInstructionList); +\layout Standard + + +\shape slanted +\size small +/* +\layout Standard + + +\shape slanted +\size small +The main loop +\layout Standard + + +\shape slanted +\size small +*/ +\layout Standard + + +\size small +while (Q.isNotEmpty()){ +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +Instruction u = fst(Q.head()); +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +InstructionList ec = snd(Q.head()); +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +Q.removeHead(); +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +InstructionList oldchain = ec; +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +InstructionList newchain = ec++[u]; +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +for (all successors v of u){ +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + +\shape slanted +/* +\layout Standard + + +\shape slanted +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +execute returns true if type info has changed. + It may throw VerificationFailures. +\layout Standard + + +\shape slanted +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +*/ +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +if (v.execute(u.getOutFrame(oldchain), newchain,icv,ev)) +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +Q.add((v, newchain)); +\layout Standard + + +\size small +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +} +\layout Standard + + +\size small +} +\end_float +\layout Subsubsection + + +\begin_inset LatexCommand \label{ComparisonSubroutines} + +\end_inset + +Comparison to Sun's Implementation +\layout Standard + +JustIce was originally aimed to be as compatible to Sun's implementation + as possible. + However, the unclear specification prevents clean room implementations + (i.e., implementations whose programmers did not look into Sun's code) from + perfect compatibility. +\layout Standard + +Fortunately, it JustIce closely matches Sun's implementation in its behaviour. + As a test case, the author verified the transitive hull of the referenced + class files starting with the +\emph on +de.fub.bytecode.verifier.Verifier +\emph default + class. + This set includes most of the classes of the Java 2 API supplied by Sun + Microsystems, i.e., a few hundreds of apparently correct classes. + A very small number of class files was rejected by JustIce because of its + different specification of subroutine constraints. + No other rejects were encountered. +\layout Standard + +Most class files that are found to be rejected by Sun's verifier implementations + are rejected by JustIce, too. +\layout Standard + +However, there are class file rejected by Sun's verifier implementations + but not by JustIce. + This should not occur, but JustIce does not mimic the programming errors + of Sun's verifiers so far. + Please see section +\begin_inset LatexCommand \ref{javacRejected} + +\end_inset + + for a discussion on a selected incompatibility issue. +\layout Standard + +An automated testing suite could solidify the trust in JustIce's implementation + which is not implemented yet. + Please see section +\begin_inset LatexCommand \ref{VerifierValidationSuite} + +\end_inset + + for a discussion on that topic. +\layout Section + +Pass Four +\layout Standard + +The tests Sun's verifiers perform during run-time but which in principle + could be performed in pass three +\emph on +are +\emph default + performed in pass 3a by JustIce. +\layout Subsubsection + +Comparison to Sun's Implementation +\layout Standard + +It sems natural that Sun's verifier implements the specification by Sun. + Obviously, JustIce has no run-time so JustIce has no pass four. + The checks Sun performs in pass four +\begin_float footnote +\layout Standard + +Some JVMs expose implementation mistakes concerning pass four verification. + See section +\begin_inset LatexCommand \ref{PassFourBug} + +\end_inset + +. +\end_float + are performed in pass 3a by JustIce. +\layout Chapter + + +\begin_inset LatexCommand \label{Verification API} + +\end_inset + +The Verification API +\layout Section + +Introduction +\layout Standard + +The Application Programming Interface (API) of JustIce uses object oriented + design patterns +\begin_inset LatexCommand \cite{DesignPatterns} + +\end_inset + +. + Readers not familiar with design patterns are encouraged to read at least + about the +\emph on +Visitor +\emph default +, +\emph on +Singleton +\emph default +, +\emph on +Observer +\emph default + and +\emph on +Factory +\emph default + patterns. +\layout Standard + +JustIce currently consists of four packages: +\emph on +de.fub.byte\SpecialChar \- +code.veri\SpecialChar \- +fier +\emph default +, +\emph on +de.fub. + byte\SpecialChar \- +code.veri\SpecialChar \- +fier.exc +\emph default +, +\emph on +de.fub.byte\SpecialChar \- +code.veri\SpecialChar \- +fier.statics +\emph default + and +\emph on +de.fub.byte\SpecialChar \- +code.veri\SpecialChar \- +fier. + struc\SpecialChar \- +tu\SpecialChar \- +rals +\emph default +. + (We shall from now on omit the preceding +\emph on +de.fub.byte\SpecialChar \- +code +\emph default +.) The most important of them is the +\emph on +verifier +\emph default + package. + The class +\family typewriter +VerifierFactory +\family default + can be found here; this is the place where all verification starts. + The +\family typewriter +Veri\SpecialChar \- +fier\SpecialChar \- +Fac\SpecialChar \- +tory +\family default + creates +\family typewriter +Verifier +\family default + instances; only the +\family typewriter +VerifierFactory +\family default + can create these instances. + A +\family typewriter +Verifier +\family default + instance, in turn, has a one-to-one relationship with a class file to verify, + +\begin_inset Quotes eld +\end_inset + +its class +\begin_inset Quotes erd +\end_inset + +. + You can instruct a +\family typewriter +Verifier +\family default + instance to run a verification pass on its class yielding a +\family typewriter +VerificationResult +\family default +. +\layout Standard + +All class files are fetched from the BCEL's class file repository, i.e., the + class +\family typewriter +Re\SpecialChar \- +po\SpecialChar \- +si\SpecialChar \- +to\SpecialChar \- +ry +\family default +. + The class files stored there are either put there by the user or they are + read from the file system. + For a bytecode engineer who uses the BCEL this is convenient, because one + does not have to save the dynamically created class file first in order + to load it into JustIce. +\layout Standard + +Pass 1 and pass 2 are related to the +\family typewriter +ClassFile +\family default + structure as such; passes 3a and 3b verify the bytecode of a method. + If a class file was created using the BCEL, the BCEL user already knows + how the +\family typewriter +JavaClass +\family default + object looks like +\begin_float footnote +\layout Standard + +A +\family typewriter +JavaClass +\family default + object represents a class file in the BCEL. +\end_float +. + The number of methods is known and the order of the methods in the class + file is known. +\layout Standard + +However, if this is not the case, one usually does not know the number of + methods in a class file or the order of these methods. + To carefully extract this information from an untrusted class file, one + should first let a pass-2-verification run on this file. + Afterwards, the information can be read from the +\family typewriter +JavaClass +\family default + object the BCEL offers. +\layout Standard + +Finally, one is able to supply the +\begin_inset Quotes eld +\end_inset + +method index +\begin_inset Quotes erd +\end_inset + + needed by verification passes 3a and 3b. +\layout Standard + +Basically, after pass 2 has been run successfully on a class file, one can + safely use the methods in the BCEL's +\emph on + classfile +\emph default +package +\emph on + +\emph default +on that class file. + After pass 3a has been run successfully on a method, one can safely work + on that method using the BCEL's +\emph on +generic +\emph default + package. + After pass 3b has been run successfully on all methods in a class file, + this class file will not be rejected by other verifiers. +\layout Standard + +Often, the run of a verification pass implies recursively verifying other + class files as well (because they are somehow referenced). + Therefore, +\emph on +Verifier +\emph default + instances for these referenced classes are created transparently. + To be notified when such an event occurs, one can implement the +\emph on +VerifierFactoryObserver +\emph default +interface and let the +\emph on +VerifierFactory +\emph default + register your implementation. +\layout Standard + +\begin_float fig +\layout Standard +\align center + +\begin_inset Figure size 595 863 +file VerificationAPI.eps +width 3 100 +angle 90 +flags 1 + +\end_inset + + +\layout Caption + +UML class diagram of the Verification API +\end_float +\layout Standard + +A Verifier creates instances of PassVerifiers. + A PassVerifier instance in charge of performing some later verification + pass transparently creates PassVerifier instances for the preceding passes. + Therefore, users of the Verification API do not have to care about the + order of verification passes; i.e., earlier passes are run always before + later passes. + All verification results are cached; this way an unsual order of calls + to the +\emph on +doPassX() +\emph default + methods of the +\emph on +Verifier +\emph default + class does not even waste computing time. +\begin_float fig +\layout Standard +\align center + +\begin_inset Figure size 595 631 +file V_API_SD.eps +width 3 100 +height 3 75 +flags 9 + +\end_inset + + +\layout Caption + +Informal UML sequence diagram showing the dependency of verification pass + two on verification pass one. +\end_float +\layout Section + +Some Example Code +\layout Standard + +The code below shows an example of how to use the API provided by JustIce. + It will verify the transitive hull of all referenced class files. + Normally, while verifying a class, referenced classes are recursively verified + performing +\emph on +earlier +\emph default + passes. + Verifiers that are using pass 1 on their class will not load in any other + classes (see section +\begin_inset LatexCommand \ref{SpecPasses} + +\end_inset + +). + Therefore, normally the transitive hull is +\emph on +not +\emph default + verified completely (it usually does not make sense to verify it, though + -- it's done here only to give an example of what can be done). +\family typewriter +\size small + +\newline + +\newline +01\SpecialChar ~ +package de.fub.bytecode.verifier; +\newline +02\SpecialChar ~ +import de.fub.bytecode.verifier.*; +\newline +03\SpecialChar ~ +import de.fub.bytecode.classfile.*; +\newline +04\SpecialChar ~ +import de.fub.bytecode.*; +\newline +05\SpecialChar ~ +/** +\newline +06\SpecialChar ~ +\SpecialChar ~ +* This class has a main method implementing a demonstration program +\newline +07\SpecialChar ~ +\SpecialChar ~ +* of how to use the VerifierFactoryObserver. + It transitively verifies +\newline +08\SpecialChar ~ +\SpecialChar ~ +* all class files encountered; this may take up a lot of time and, +\newline +09\SpecialChar ~ +\SpecialChar ~ +* more notably, memory. + +\newline +10\SpecialChar ~ +\SpecialChar ~ +* +\newline +11\SpecialChar ~ +\SpecialChar ~ +* @author Enver Haase +\newline +12\SpecialChar ~ +\SpecialChar ~ +*/ +\newline +13\SpecialChar ~ +public class TransitiveHull implements VerifierFactoryObserver{ +\newline +14\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/** Used for indentation. + */ +\newline +15\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +private int indent = 0; +\newline +16\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/** Not publicly instantiable. + */ +\newline +17\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +private TransitiveHull(){ } +\newline +18 +\newline +19\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* Implementing VerifierFactoryObserver. + */ +\newline +20\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +public void update(String classname){ +\newline +21\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +for (int i=0; i +\emph default + if it exists (see +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 53). + For the correct operation of the JVM it is important that this method does + not contain an infinite loop. + Verifying if this constraint is true is similar to the Halting Problem + and therefore not generally computable +\begin_inset LatexCommand \cite{Unknowable} + +\end_inset + +. + A verifier has to omit the check and pass potentially unsafe class files. +\layout Standard + +For another example, consider algorithm +\begin_inset LatexCommand \ref{StackOverflowAlgo} + +\end_inset + + below. +\layout Standard + +\begin_float alg +\layout Caption + + +\begin_inset LatexCommand \label{StackOverflowAlgo} + +\end_inset + +Rejected class +\layout Standard + + +\family typewriter +public static int always_true() +\layout Standard + + +\family typewriter +Code(max_stack = 1, max_locals = 1, code_length = 2) +\layout Standard + + +\family typewriter +0: iconst_1\SpecialChar ~ +\SpecialChar ~ +; push constant 1 onto stack +\layout Standard + + +\family typewriter +1: ireturn\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; return constant 1 ( +\begin_inset Quotes eld +\end_inset + +true +\begin_inset Quotes erd +\end_inset + +) +\newline + +\layout Standard + + +\family typewriter +public static void good_method() +\layout Standard + + +\family typewriter +0: invokestatic NewClass0.always_true ()I (18) +\layout Standard + + +\family typewriter +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; Push +\begin_inset Quotes eld +\end_inset + +true +\begin_inset Quotes erd +\end_inset + + on stack +\layout Standard + + +\family typewriter +3: ifne #10\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; If +\begin_inset Quotes eld +\end_inset + +true +\begin_inset Quotes erd +\end_inset + + is on stack jump to 10 +\layout Standard + + +\family typewriter +6: pop \SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; Pop a value off the stack +\layout Standard + + +\family typewriter +7: goto #6 \SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; jump to 6 +\layout Standard + + +\family typewriter +10:return\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +; complete method +\end_float +This code is harmless, because lines 6 and 7 can never be executed (it would + underflow the operand stack in an infinite loop). + A class file with this code is rejected by JustIce and other verifiers, + because the endless loop seems to be a malicious threat to the integrity + of the JVM. +\layout Standard + +We conclude that there cannot be a perfect verifier. + All that could be done is reduce the degree of uncertainty. + For practical purposes, i.e., to be compatible with Sun's implementation, + one should not even do that. +\layout Standard + +There is also a simple proof showing a perfect verifier does not exist in + +\begin_inset LatexCommand \cite{JNS} + +\end_inset + +, chapter 6. + It uses a diagonalization argument. +\layout Section + +Future Work +\layout Standard + +Class file verification is an integral component of Java security; and applicati +on programs running on the Java Virtual Machine are often used in security + critical areas. + Several security holes and flaws have been found both in implementations + and the specification of the Java class file verifier since it was introduced. +\layout Standard + +Recently, the area has experienced a leap as a theoretically founded, sound + and complete Java environment was defined in +\begin_inset LatexCommand \cite{JBook} + +\end_inset + +. + Possibly Sun's engineers will use this work to improve Java and the Java + verifier. + JustIce will have to change to always keep close to the industry standard. + +\layout Standard + +But JustIce itself can also be improved concerning practicability, and new + software can be developed on top of the Verification API. +\layout Subsection + +Improvements to JustIce +\layout Subsubsection + +Introduction of Unique Identifers for Verification Results and Warning Messages +\layout Standard + +Currently, warning messages and verification results are conceptually text-based. + Only +\emph on +VerificationResult +\emph default + objects include a numeric value which programs can use to decide if some + class verification failed or not. + A program like the prototype introduced in section +\begin_inset LatexCommand \ref{GUI_APP} + +\end_inset + + can currently not hide specific messages from the user without parsing + text. + This limitation should be removed in the future by using unique message + numbers. + This would also make translation of the messages into other languages easier. +\layout Subsubsection + + +\begin_inset LatexCommand \label{NewVerificationStrategy} + +\end_inset + +A New Verification Strategy +\layout Standard + +The core verification algorithm cited in section +\begin_inset LatexCommand \ref{SunCoreAlgo} + +\end_inset + + works by generalizing the knowledge about an object type along the inheritance + hierarchy. +\layout Standard + +For instance, let there be an object of type +\family typewriter +java.util.Ab\SpecialChar \- +stract\SpecialChar \- +List +\family default + on the simulated stack of some modeled instruction. + Let there be a loop so that the algorithm has to visit that same instruction + again, this time with an object of type +\family typewriter +java.util.Ab\SpecialChar \- +stract\SpecialChar \- +Set +\family default + in that same stack slot. + The verifier will compute the meet of the two types and record that there + is some object of type +\family typewriter +java.util.Ab\SpecialChar \- +stract\SpecialChar \- +Collection +\family default + in that stack slot. +\layout Standard + +Remember that the instruction will be marked with a +\emph on +changed +\emph default + bit until no such re-typing change occurs any more (JustIce will actually + put it into a queue). +\layout Standard + +This approach does not work very well when it comes to interface types instead + of class files. + For example, the meet of a +\family typewriter +java.lang.In\SpecialChar \- +teger +\family default + and a +\family typewriter +java.lang.Doub\SpecialChar \- +le +\family default + is a +\family typewriter +java.lang.Num\SpecialChar \- +ber +\family default + because +\family typewriter +java.lang.Num\SpecialChar \- +ber +\family default +\emph on + +\emph default +is the first common super class. + Both classes also implement the +\family typewriter +java.lang.Com\SpecialChar \- +parable +\family default + interface, but +\family typewriter +java.lang.Num\SpecialChar \- +ber +\family default + does not. + This information is lost when replacing the type information. + However, current verifiers do not reject the class files but make additional + run-time checks necessary. +\layout Standard + +Fong noticed that this could be the reason for the +\latex latex + +\backslash +texttt{invoke\SpecialChar \- +interface} +\latex default + opcode to be underspecified +\begin_inset LatexCommand \cite{Fong2-WWW} + +\end_inset + + (also see section +\begin_inset LatexCommand \ref{InvokeInterfaceDescFONG} + +\end_inset + +). +\layout Standard + +Stärk et al. + suggest the use of +\emph on +sets +\emph default + of reference types instead ( +\begin_inset LatexCommand \cite{JBook} + +\end_inset + +, pages 229-231). + This could also be implemented in JustIce. +\layout Subsubsection + +Keeping up with Specification Clarifications +\layout Standard + +As a clean-room implementation, JustIce depends on the clearness of the + specification. + Ambiguities could lead to programming errors. +\layout Standard + +Here we give one example: methods can be inherited in Java (for example, + the method +\emph on +clone() +\emph default +is declared in the +\family typewriter +java.lang.Ob\SpecialChar \- +ject +\family default + class and therefore inherited by every other class). +\layout Standard + +Let a class +\family typewriter +A +\family default + be a subclass of +\family typewriter +java.lang.Ob\SpecialChar \- +ject +\family default + and let class +\family typewriter +B +\family default + be a subclass of +\family typewriter +A +\family default +. + Also, let class +\family typewriter +B +\family default + override the definition of +\emph on +clone() +\emph default + with an own implementation. +\layout Standard + +If +\emph on +javac +\emph default + compiles a Java program that invokes this method, it is either referenced + as +\emph on +java.lang.Ob\SpecialChar \- +ject::clone() +\emph default + or as +\emph on +B::clone() +\emph default +. + However, because +\family typewriter +A +\family default + inherits this method, the reference +\emph on +A::clone() +\emph default + is legal, too. +\layout Standard + +In The Java Virtual Machine Specification, Second Edition ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 291) it is said that the reference must be a +\begin_inset Quotes eld +\end_inset + +symbolic reference to the class in which the method is to be found +\begin_inset Quotes erd +\end_inset + +. + Statically, the method +\emph on +clone() +\emph default + can of course not be found in class +\family typewriter +A +\family default +. + One could therefore think the reference +\emph on +A::clone() +\emph default + was not legal. +\layout Standard + +In the meanwhile, Sun's engineer Gilad Bracha clarified this issue: +\begin_inset Quotes eld +\end_inset + +Of course. + This is discussed in JVMS 5.4.3.4, which describes interface method resolution. + I don't see the text on page 280 as contradicting that. + The symbolic reference does give an interface in which the required method + can be found, albeit as an inherited member. + We could try and reword it in a more precise way, to eliminate any misunderstan +dings. +\begin_inset Quotes erd +\end_inset + + +\layout Standard + +Keeping up with clarifications like this is an inevitable and on-going part + of the development of JustIce. +\layout Subsubsection + +Keeping up with Java Extensions +\layout Standard + +Recently, Sun Microsystems introduced a new attribute: the +\family typewriter +StackMap +\family default + attribute which is an attribute local to the +\family typewriter +Code +\family default + attribute (see section +\emph on + +\begin_inset LatexCommand \ref{CodeAttribute} + +\end_inset + + +\emph default +). + It was specified in +\begin_inset LatexCommand \cite{J2ME-CLDCS} + +\end_inset + +. +\layout Standard + +It is there to provide +\begin_inset Quotes eld +\end_inset + +limited devices +\begin_inset Quotes erd +\end_inset + + that perform a one-pass verification with type information that would normally + have to be inferred by the verifier. +\layout Standard + +It is not used by the verification algorithm of JustIce now: it's currently + an +\emph on +unknown attribute +\emph default + to JustIce. +\layout Subsubsection + +Detecting Local Variable Accesses out of Scope +\layout Standard + +The +\family typewriter +LocalVariableTable +\family default + attribute is a debug information attribute. + Basically, it gives debuggers information about the original (source code) + name and type of a given local variable. +\layout Standard + +JustIce builds data structures to warn if it detects contradicting and overlappi +ng areas; e.g., if some local variable is anounced to carry an +\family typewriter +int +\family default + value and a +\family typewriter +float +\family default + value at the same time. +\layout Standard + +It could also be interesting to warn if a local variable is accessed for + which no debug information exists. + This is currently not implemented. +\layout Subsubsection + +Extending the Verification API +\layout Standard + +JustIce can easily be extended to run certain analyses related to symbolic + bytecode execution. +\layout Standard + +This includes the computation of the maximum number of used operand stack + slots in a method or the computation of unused local variables in a method. +\layout Standard + +These analyses are normally costly to implement +\begin_float footnote +\layout Standard + +Often, heuristics are used such as the method MethodGen.getMaxStack() in + the BCEL +\begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} + +\end_inset + +. +\end_float +, but they are a waste product of the verifier's core algorithm. +\layout Subsubsection + + +\begin_inset LatexCommand \label{VerifierValidationSuite} + +\end_inset + +A Verifier Validation Suite +\layout Standard + +The Kimera project +\begin_inset LatexCommand \cite{Kimera-WWW} + +\end_inset + + was the first known project to implement a stand-alone Java verifier. + The people behind the project had to test the behaviour of their verifier + against the behaviour of the previous implementations. + Tests have been run in order to validate the Kimera verifier. + These tests range from simply introducing random one-byte errors into class + files and automatically running Kimera against other verifiers to elaborate + research work +\begin_inset LatexCommand \cite{Kimera-ProdGram,Kimera-TestingJVM} + +\end_inset + +. +\layout Standard + +Currently, JustIce comes only with a very limited possibility of running + test cases against the native verifier of the host machine's JVM. + The pioneering work of the Kimera project could be used to implement a + validation suite for JustIce. +\layout Subsection + + +\begin_inset LatexCommand \label{Firewall} + +\end_inset + +A Verifier Protecting an Intranet +\layout Standard + +Often, Java Virtual Machines are built into software used to browse the + World Wide Web such as the KDE project's +\emph on +Konqueror +\begin_inset LatexCommand \cite{KDE} + +\end_inset + + +\emph default + or Mozilla.org's +\emph on +Mozilla +\emph default + +\begin_inset LatexCommand \cite{Mozilla} + +\end_inset + + products. + Such Internet technology is also often used in corporate networks. + Corporate networks based on internet technology are called +\emph on +intranets +\emph default +; these networks are normally protected from the Internet by a so-called + +\emph on +firewall +\emph default + computer. + +\layout Standard + +This computer's task is to provide access to the internet only to privileged + employees and --even more important-- it blocks access from unauthorized + persons outside the intranet. + The firewall machine is a single, bi-directional point of access. +\layout Standard + +However, normally web-browsing is considered harmless, so that the employees + can unrestrictedly gather information, possibly visiting Java-enabled web + sites. + The JVMs built into the browser software run software downloaded from the + World Wide Web; while the the built-in verifiers make sure that no dangerous + code can be executed. +\layout Standard + +Let us assume someone discovered a security hole in the verifier implementation + or implementations that are used on the corporate network's workstations; + let us also assume a patch exists that would fix the problem. + +\layout Standard + +A system administrator would have to spent a lot of time to repair every + single verifier. + A cheaper solution would be a verifier built into the firewall machine; + such a verifier can easily be implemented using JustIce and its Verification + API. +\layout Subsection + +A Java Virtual Machine Implementation Using JustIce +\layout Standard + +The Java verifier is originally a part of the Java Virtual Machine. + JustIce could also be part of a Java Virtual Machine. + JustIce's class files (the program code JustIce consists of) could simply + be integrated into the core Java class files. + The execution engine would then run JustIce without actually verifying + JustIce's class files themselves. + +\layout Standard + +For scientific purposes one could also implement a JVM in the Java programming + language. + Such an implementation could, for example, serve as a debugger. +\layout Subsection + + +\begin_inset LatexCommand \label{LinePrincipleInfoHidingAndSecurity} + +\end_inset + +Drawing a Clear Line Between the Principle of Information Hiding and Security +\layout Standard + +The principle of information hiding has been (and still is!) a practice + of experienced programmers for many years. + It is there to reduce programming errors. +\layout Standard + +In the Modula-2 programming language +\begin_inset LatexCommand \cite{M2} + +\end_inset + + this is achieved by explicitely dividing the program code in definition + modules and implementation modules. + In older programming languages, such as in the C programming language +\begin_inset LatexCommand \cite{C} + +\end_inset + +, this principle is implicitely used, too. + Basically this is achieved by defining interfaces that only describe what + the code of a program module does. + These interface +\begin_inset Quotes eld +\end_inset + +headers +\begin_inset Quotes erd +\end_inset + + are included into user code instead of simply including the code itself. + +\layout Standard + +In object-oriented programming languages such as in Delphi +\begin_inset LatexCommand \cite{D3} + +\end_inset + +, C++ +\begin_inset LatexCommand \cite{CPP-D,CPP-E} + +\end_inset + + or Java +\begin_inset LatexCommand \cite{langspec2} + +\end_inset + +, this principle is refined to what is called object encapsulation. + When a class is defined, certain key words such as +\family typewriter +private +\family default +, +\family typewriter +protected +\family default +, +\family typewriter +friend +\family default +, +\family typewriter +public +\family default +, +\family typewriter +published +\family default + set the access rules for the members +\begin_float footnote +\layout Standard + +The members of a class are its components: methods (program code) and fields + (also called attributes or variables). +\end_float + of an object of the given class. +\layout Standard + +Still, this refined technique does not have anything to do with security. + It is only there to aid programmers create a reasonable design. + If every piece of code could manipulate every data structure, one would + not know where to look for a programming error in the program source code. + On the other hand, if some field is private in C++, one could (with some + knowledge about the compiler used) still reference and modify this field + by pointer manipulation. + In addition to that, a second program like a debugger could watch even + the data of private fields. +\layout Standard + +However, when a Java program is compiled into the language of the JVM, the + information about the access rights of the fields and methods is included. + This is where the principle of information hiding is exploited to provide + security. + For example, the verifier of the JVM has to make sure private fields are + never accessed from a foreign piece of code. + But there are many implementations of the JVM which have security flaws + such as not honouring the access rights. + There are debuggers for JVM bytecodes, too. +\layout Standard + +When one thinks about security, one has to think of some enemy who could + try to harm the computer or information stored on that computer. + From a JVM user's point of view, the JVM is relatively secure. + Even running untrusted code cannot do much harm. + Because the security flaws in different JVM implementations differ, they + are probably not exploited most times. +\layout Standard + +From a Java programmer's point of view, the JVM is not secure. + Untrusted users can do much harm. + For example, an online banking application storing important data in Java + fields (such as access information to the bank's database management system) + is a threat to both the bank and its customers. + This information could easily be extracted by a malicious user. +\layout Standard + +Another problem for Java programmers is the amount of symbolical information + stored in class files. + Today, it is easy to de-compile a Java class file back to Java language + source code +\begin_inset LatexCommand \cite{JODE-WWW} + +\end_inset + +. + This source code can then be read and analyzed by the user. + Facing this problem, the +\begin_inset Quotes eld +\end_inset + +only safe course of action is to assume that ALL Java code will at some + point be decompiled +\begin_inset Quotes erd +\end_inset + + ( +\begin_inset LatexCommand \cite{JNS} + +\end_inset + +, page 68). +\layout Standard + +We conclude that the principle of information hiding is not enough to provide + a degree of security that both --users and programmers-- could accept. + Programmers should not believe a good design makes a program +\emph on +secure +\emph default +. + +\layout Chapter + +Appendix +\layout Section + +History of JustIce +\layout Standard + +The author of JustIce once started to implement a class file decompiler + like Jode +\begin_inset LatexCommand \cite{JODE-WWW} + +\end_inset + +. + It soon became clear that to successfully implement it, one should exploit + the +\begin_inset Quotes eld +\end_inset + +well-behaved +\begin_inset Quotes erd +\end_inset + + property of class files (which essentially means that they pass a verifier, + especially pass three) +\begin_inset LatexCommand \cite{Krakatoa-WWW} + +\end_inset + +. + +\layout Standard + +JustIce was then developed to understand the +\begin_inset Quotes eld +\end_inset + +well-behaved +\begin_inset Quotes erd +\end_inset + + property of usual class files. + It took much longer to complete than estimated because of the many inherent + bugs and ambiguities in The Java Virtual Machine Specification, Second + Edition +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +. +\layout Standard + +Its name starts with a +\emph on +J +\emph default + like Java does, referring to the tradition of giving Java-related software + such names. + The second part of the name, +\emph on +ICE +\emph default +, was inspired by a novel by William Gibson +\begin_inset LatexCommand \cite{Neuromancer} + +\end_inset + +. + It is an acronym for +\emph on +Intrusion Countermeasures Electronics +\emph default +, something that is very much like today's firewall systems (see section + +\begin_inset LatexCommand \ref{Firewall} + +\end_inset + +). + He credits the invention of +\emph on +ICE +\emph default + to Tom Maddox. + The missing three letters were inserted to create a word that makes sense; + in fact, choosing the three-letter combination +\emph on +ust +\emph default +resulted in the creation of a word with a double sense via bi-capitalization. +\layout Standard + +JustIce was written using and extending the excellent Byte Code Engineering + Library +\begin_inset LatexCommand \cite{BCEL-WWW,BCEL98} + +\end_inset + + by Markus Dahm. + It really helped a lot and sped up development time. +\layout Standard + +It was also --last but not least-- written to earn its author a German +\emph on + Dipl.-Inform. + +\emph default + degree which one may compare to a +\emph on +master +\emph default + degree. +\layout Section + +Flaws and Ambiguities Encountered +\layout Standard + +While designing, implementing and testing JustIce, a lot of interesting + flaws and ambiguities were found in the specification +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, the Java compiler +\emph on +javac +\emph default + and the JVM +\emph on +java +\emph default +. +\layout Subsection + +Flaws in the Java Virtual Machine Specification +\layout Standard + +The Java Virtual Machine Specification, Second Edition was derived from + an in-house document describing the as-is implementation of Sun's genuine + Java Virtual Machine ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page xiv). + This sometimes leads to problems as there are still a few points left where + Sun's engineers forgot to describe specification details to the public, + in error assuming they would be implementation details. + Another source of mistakes are ambiguities, inherent to natural languages + auch as English. +\layout Subsubsection + +A Code Length Maximum of 65535 Bytes per Method +\layout Standard + +On page 152, The Java Virtual Machine Specification, Second Edition +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + + says that code arrays may at most have a length of 65536 bytes because + certain indices that point into the code are only 16 bits of width. + Page 134 states the code must have +\begin_inset Quotes gld +\end_inset + +less than +\begin_inset Quotes grd +\end_inset + + 65536 bytes. + Therefore, the limitation stated on page 152 is not helpful, but only confusing. +\layout Subsubsection + +Subroutines +\layout Standard + +The implementation of a provably correct verifier is not possible because + of the ambiguities in the specification +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +. + To reach this goal, various efforts have been made to describe the verifier + and the JVM formally +\begin_inset LatexCommand \cite{Qian,StataAbadi,FreundMitchell,JBook,JPaper} + +\end_inset + +. + By restricting the code +\emph on +javac +\emph default + produces or by redefining the verifier's behaviour, however, they are never + one-to-one with the behaviour of the existing JVMs. +\layout Standard + +Sun's specification does not define the term +\emph on +subroutine +\emph default + although it is used. + Instead, it is explained what bytecode the Java +\emph on +compiler +\emph default + generates when a +\family typewriter +finally +\family default + clause appears in the Java +\emph on +language +\emph default + source code -- this definitely does not belong there, because a verifier + must never assume the code it verifies was created by Sun's +\emph on +javac +\emph default + compiler. +\layout Standard + +Clarifying this issue could lead to an +\emph on +official +\emph default + formal specification. +\layout Subsubsection + +The Specification Sometimes Satisfies the Verifier +\layout Standard + + +\begin_inset LatexCommand \label{InvokeInterfaceDescFONG} + +\end_inset + +Fong +\begin_inset LatexCommand \cite{Fong2-WWW} + +\end_inset + + found in 1997 that the +\family typewriter +invokeinterface +\family default + opcode was underspecified in the first edition of the Java Virtual Machine + Specification. + He managed to create a class file that did not implement a specific interface + but nevertheless used +\family typewriter +invokeinterface +\family default + to invoke a method. + This class file passed the verifier (up to pass three), but the JVM found + the problem during run-time (pass four). + Fong concluded that the omission in the specification was done on purpose + because the implementation of the data flow analyzer does not allow to + check this constraint (please see section +\begin_inset LatexCommand \ref{NewVerificationStrategy} + +\end_inset + + for a description of how this limitation could be overcome). + However, in The Java Virtual Machine Specification, Second Edition +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, the specification of +\family typewriter +invokeinterface +\family default + is corrected. +\layout Standard + +Still, there is another case where one would suspect the specification describes + the behaviour of the verifier: on pages 147 and 148 of the specification + +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, verification of instance initialization methods and newly created objects + is explained. + +\begin_inset Quotes eld +\end_inset + +A valid instruction sequence must not have an uninitialized object on the + operand stack or in a local variable during a backwards branch, or in a + local variable in code protected by an exception handler or a +\family typewriter +finally +\family default + clause +\begin_inset Quotes erd +\end_inset + +. + Note that the Java language keyword +\family typewriter +finally +\family default + does not really belong here (Sun should speak of +\emph on +subroutines +\emph default +), but more important is that this specification is made to satisfy the + verification algorithm: +\begin_inset Quotes eld +\end_inset + +Otherwise, a devious piece of code might fool the verifier +\begin_inset Quotes erd +\end_inset + +. + +\layout Subsubsection + + +\begin_inset LatexCommand \label{InnerBug} + +\end_inset + +The '$' Character as a Valid Part of a Java Name +\layout Standard + +Because the +\emph on +javac +\emph default + compiler may create class files with a '$' character in their names as + a result of Java source files defining inner classes, this character should + no longer be a valid part of a Java name to avoid problems. + I.e., the method invocation +\emph on +ja\SpecialChar \- +va.lang.Cha\SpecialChar \- +rac\SpecialChar \- +ter.is\SpecialChar \- +Ja\SpecialChar \- +va\SpecialChar \- +Iden\SpecialChar \- +tifier\SpecialChar \- +Part('$'); +\emph default + should return the value +\family typewriter +false +\family default +. +\layout Subsection + +Flaws in the Implementation of the +\emph on +Java Platform +\layout Subsubsection + + +\begin_inset LatexCommand \label{javacRejected} + +\end_inset + +Sun's Verifier Rejects Code Produced by Sun's Compiler +\layout Standard + +Surprisingly, there are a number of examples in which such a thing happens. +\layout Paragraph + + +\begin_inset LatexCommand \label{StaerkJreject} + +\end_inset + +Another Problem With Subroutines +\layout Standard + +In +\begin_inset LatexCommand \cite{JPaper} + +\end_inset + +, Stärk and Schmid give a few code examples which are compiled correctly + by the +\emph on +javac +\emph default + compiler but the resulting code is rejected by the traditional verifiers. + Algorithms +\begin_inset LatexCommand \ref{StaerkJLang} + +\end_inset + + and +\begin_inset LatexCommand \ref{StaerkJByteCode} + +\end_inset + + show one of their examples given in the Java programming language and the + resulting output of the +\emph on +javac +\emph default + compiler. +\begin_float alg +\layout Caption + + +\begin_inset LatexCommand \label{StaerkJLang} + +\end_inset + +Stärk and Schmid's Rejected Class, Java Language Version +\layout Standard + + +\family typewriter +class Test1{ +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +int test(boolean b){ +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +int i; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +try{ +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +if (b) return 1; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +i=2; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +} +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +finally { +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +if (b) i = 3; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +} +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return i; +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +} +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +} +\end_float +\layout Standard + +\begin_float alg +\layout Caption + + +\begin_inset LatexCommand \label{StaerkJByteCode} + +\end_inset + +Stärk and Schmid's Rejected Class, JVM Bytecode Version +\layout Standard + + +\family typewriter +int test(boolean arg1) +\layout Standard + + +\family typewriter +Code(max_stack = 1, max_locals = 6, code_length = 39) +\layout Standard + + +\family typewriter +0: iload_1 +\layout Standard + + +\family typewriter +1: ifeq #11 +\layout Standard + + +\family typewriter +4: iconst_1 +\layout Standard + + +\family typewriter +5: istore_3 +\layout Standard + + +\family typewriter +6: jsr #27 +\layout Standard + + +\family typewriter +9: iload_3 +\layout Standard + + +\family typewriter +10: ireturn +\layout Standard + + +\family typewriter +11: iconst_2 +\layout Standard + + +\family typewriter +12: istore_2 +\layout Standard + + +\family typewriter +13: jsr #27 +\layout Standard + + +\family typewriter +16: goto #37 +\layout Standard + + +\family typewriter +19: astore %4 +\layout Standard + + +\family typewriter +21: jsr #27 +\layout Standard + + +\family typewriter +24: aload %4 +\layout Standard + + +\family typewriter +26: athrow +\layout Standard + + +\family typewriter +27: astore %5 +\layout Standard + + +\family typewriter +29: iload_1 +\layout Standard + + +\family typewriter +30: ifeq #35 +\layout Standard + + +\family typewriter +33: iconst_3 +\layout Standard + + +\family typewriter +34: istore_2 +\layout Standard + + +\family typewriter +35: ret %5 +\layout Standard + + +\family typewriter +37: iload_2 +\layout Standard + + +\family typewriter +38: ireturn +\end_float +If one tries to run this bytecode using a JVM by IBM Corporation, the code + is rejected +\begin_float footnote +\layout Standard + +It is also rejected by Sun's JVMs and the Kimera verifier +\begin_inset LatexCommand \cite{Kimera-WWW} + +\end_inset + +. +\end_float +: +\newline + +\family typewriter +ehaase@haneman:/home/ehaase > java Test1 +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +Exception in thread "main" java.lang.VerifyError: +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +(class: Test1, method: test signature: (Z)I) +\newline +\SpecialChar \- +\SpecialChar ~ +\SpecialChar ~ +Localvariable 2 contains wrong type +\newline + +\newline + +\family default +In his lectures, Stärk explains that the problem lies in the polymorphic + nature of JVM subroutines +\begin_inset LatexCommand \cite{JLectures} + +\end_inset + +. + Consider algorithm +\begin_inset LatexCommand \ref{StaerkJByteCode} + +\end_inset + +. + In line 12, an +\family typewriter +int +\family default + is put into local variable number 2. + The subroutine starting at line 27 is then called from line number 13. + Note that this subroutine accesses the local variable number 2. + Finally, line 16 transfers control to line 37 where the verification problem + occurs. + An +\family typewriter +int +\family default + should be read from local variable number 2, but this is marked +\family typewriter +unusable +\family default +, because it was accessed in the subroutine. +\layout Standard + +However, the specification ( +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +, page 151) states: +\layout Itemize + +For any local variable that [\SpecialChar \ldots{} +] has been accessed or modified by the subroutine, + use the type of the local variable at the time of the +\family typewriter +ret +\family default +. +\layout Itemize + +For any other local variables, use the type of the local variable before + the +\family typewriter +jsr +\family default + instruction. +\layout Standard + +As one can see, in the above example local variable number 2 holds an +\family typewriter +int +\family default + data type in both cases; there is no need to mark it +\family typewriter +unusable +\family default +. + This is the reason why JustIce does not reject the above bytecode, thus + being slightly incompatible with the behaviour of other verifiers. +\layout Paragraph + +The Maximum Method Length May Be Exceeded +\layout Standard + +The +\emph on +javac +\emph default + compiler Sun included in the Java Development Kit version 1.3.0_01 does not + check for the maximum method length of the +\family typewriter +code +\family default + array in a +\family typewriter +Code +\family default + attribute (see section +\begin_inset LatexCommand \ref{CodeAttribute} + +\end_inset + +). + A test file containing 65000 lines like +\begin_inset Quotes eld +\end_inset + + +\family typewriter +Sys\SpecialChar \- +tem.out.println( +\begin_inset Quotes eld +\end_inset + +Test +\begin_inset Quotes erd +\end_inset + +); +\family default + +\begin_inset Quotes erd +\end_inset + + was compiled, but the resulting class file was rejected by the verifier. +\layout Standard + +IBM Corporation's +\emph on +jikes +\emph default + compiler does not even generate code, but it locks up while compiling the + test file. +\layout Subsubsection + +A Compiler Issue Related to Inner Classes +\layout Standard + +The +\emph on +javac +\emph default + compiler has to name class files, even those of so-called anonymous classes + +\begin_inset LatexCommand \cite{InnerSpec} + +\end_inset + +. +\layout Standard + +This can cause problems: an inner class +\emph on +I +\emph default + defined in a class +\emph on +A +\emph default + will be compiled into a class file called +\emph on +A$I.class +\emph default +. + A Java class named +\emph on +A$I +\emph default + will also be compiled into a class file named +\emph on +A$I.class +\emph default + overwriting the former class file. + Because Sun did not forbid the ' +\emph on +$ +\emph default +' character as a legal part of a Java identifier, the +\emph on +javac +\emph default + compiler should use a more sophisticated naming scheme. +\layout Subsubsection + + +\begin_inset LatexCommand \label{PassFourBug} + +\end_inset + +Pass Four is Only Partially Implemented +\layout Standard + +Pass four defines run-time tests for constraints that could also be verified + in pass three; it is only for performance reasons that these tests are + delayed. + Instead of having all the tests in one place, they are unnecessarily spread + +\begin_inset Quotes eld +\end_inset + +making the validation of the verification algorithm itself extremely difficult +\begin_inset Quotes erd +\end_inset + + +\begin_inset LatexCommand \cite{Fong-WWW} + +\end_inset + +. + Risking security for better performance is often regarded as a bad decision. + For instance, in the +\layout Standard + + +\family typewriter +java version "1.3.0_01" +\layout Standard + + +\family typewriter +Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0_01) +\layout Standard + + +\family typewriter +Java HotSpot(TM) Client VM (build 1.3.0_01, mixed mode) +\layout Standard + +Java Virtual Machine, the pass four check for access rights was unintentionally + omitted. + Sadly, other vendors license Sun's code and base their own implementations + on that code. + Therefore, mistakes are often inherited throughout the JVM vendors. + The +\layout Standard + + +\family typewriter +java version "1.3.0" +\layout Standard + + +\family typewriter +Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0) +\layout Standard + + +\family typewriter +Classic VM (build 1.3.0, J2RE 1.3.0 IBM build cx130-20010626 (JIT enabled: jitc)) +\layout Standard + +Java Virtual Machine by IBM Corporation, for example, exposes the same mistake. +\layout Section + +Related Work +\layout Subsection + +The Kimera Project +\layout Standard + +It is a misfortune that the Kimera +\begin_inset LatexCommand \cite{Kimera-WWW} + +\end_inset + + project closed the World Wide Web presence and that the source code of + the Kimera verifier was never released -- it would have been quite interesting + to see how that respected verifier implementation deals with the problems + arising concerning subroutine verification. +\layout Standard + +However, Kimera is the single other stand-alone verifier besides JustIce + the author knows of. + The people behind the project found important security breaches in JVM + implementations of various World Wide Web browsers. +\layout Standard + +Also, they validated their verifier implementation and published several + papers on JVM implementation verification +\begin_inset LatexCommand \cite{Kimera-ProdGram,Kimera-TestingJVM} + +\end_inset + +. +\layout Subsection + +The Verifier by Stärk, Schmid and Börger +\layout Standard + +In +\begin_inset LatexCommand \cite{JBook} + +\end_inset + +, the authors define the Java programming language and the Java virtual + machine formally using +\emph on +Abstract State Machines +\emph default + (ASM). + This also includes the verifier; its specifications have also been implemented + in the functional programming language AsmGofer +\begin_inset LatexCommand \cite{AsmGofer} + +\end_inset + +. + This implementation is included on the CD-ROM that accompanies the book. +\layout Standard + +The +\begin_inset Quotes eld +\end_inset + + +\emph on +JBook verifier +\emph default + +\begin_inset Quotes erd +\end_inset + + does not implement a complete class file verifier. + It currently only implements the bytecode verification. + Its input files are not class files itself, but a textual representation + of class files in so-called Jasmin format +\begin_inset LatexCommand \cite{JVM} + +\end_inset + +. + Therefore, this implementation is merely of theoretical interest. +\layout Standard + +It does, however, implement a bytecode verifier that is founded on a +\emph on +solid +\emph default + theory. + This theory could become the standard for the interpretation of the JVM + specification +\begin_inset LatexCommand \cite{vmspec2} + +\end_inset + +. + It could even change the specification to remove its ambiguities. +\layout Standard + +There is also an unreleased version of this verifier implemented in the + Java programming language using the BCEL. + This implementation, if it should ever be released, promises a lot as it + could combine usability and a solid theory. +\layout Section + + +\begin_inset LatexCommand \label{GPL} + +\end_inset + +The GNU General Public License +\layout Standard + + +\emph on +GNU GENERAL PUBLIC LICENSE +\layout Standard + +Version 2, June 1991 +\layout Standard + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +\layout Standard + +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +\layout Standard + +Everyone is permitted to copy and distribute verbatim copies of this license + document, but changing it is not allowed. +\layout Standard + + +\emph on +Preamble +\layout Standard + +The licenses for most software are designed to take away your freedom to + share and change it. + By contrast, the GNU General Public License is intended to guarantee your + freedom to share and change free software--to make sure the software is + free for all its users. + This General Public License applies to most of the Free Software Foundation's + software and to any other program whose authors commit to using it. + (Some other Free Software Foundation software is covered by the GNU Library + General Public License instead.) You can apply it to your programs, too.When + we speak of free software, we are referring to freedom, not price. + Our General Public Licenses are designed to make sure that you have the + freedom to distribute copies of free software (and charge for this service + if you wish), that you receive source code or can get it if you want it, + that you can change the software or use pieces of it in new free programs; + and that you know you can do these things. +\layout Standard + +To protect your rights, we need to make restrictions that forbid anyone + to deny you these rights or to ask you to surrender the rights. +\layout Standard + +These restrictions translate to certain responsibilities for you if you + distribute copies of the software, or if you modify it. + For example, if you distribute copies of such a program, whether gratis + or for a fee, you must give the recipients all the rights that you have. + You must make sure that they, too, receive or can get the source code. + And you must show them these terms so they know their rights. +\layout Standard + +We protect your rights with two steps: +\layout Standard + +(1) copyright the software, and +\layout Standard + +(2) offer you this license which gives you legal permission to copy, distribute + and/or modify the software. +\layout Standard + +Also, for each author's protection and ours, we want to make certain that + everyone understands that there is no warranty for this free software. + If the software is modified by someone else and passed on, we want its + recipients to know that what they have is not the original, so that any + problems introduced by others will not reflect on the original authors' + reputations. +\layout Standard + +Finally, any free program is threatened constantly by software patents. + We wish to avoid the danger that redistributors of a free program will + individually obtain patent licenses, in effect making the program proprietary. + To prevent this, we have made it clear that any patent must be licensed + for everyone's free use or not licensed at all. +\layout Standard + +The precise terms and conditions for copying, distribution and modification + follow. +\layout Standard + + +\emph on +GNU GENERAL PUBLIC LICENSE +\layout Standard + + +\emph on +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +\layout Standard + +0. + This License applies to any program or other work which contains a notice + placed by the copyright holder saying it may be distributed under the terms + of this General Public License. + The "Program", below, refers to any such program or work, and a "work based + on the Program" means either the Program or any derivative work under copyright + law: that is to say, a work containing the Program or a portion of it, + either verbatim or with modifications and/or translated into another language. + (Hereinafter, translation is included without limitation in the term "modificat +ion".) Each licensee is addressed as "you". + Activities other than copying, distribution and modification are not covered + by this License; they are outside its scope. + The act of running the Program is not restricted, and the output from the + Program is covered only if its contents constitute a work based on the + Program (independent of having been made by running the Program). + Whether that is true depends on what the Program does. +\layout Standard + +1. + You may copy and distribute verbatim copies of the Program's source code + as you receive it, in any medium, provided that you conspicuously and appropria +tely publish on each copy an appropriate copyright notice and disclaimer + of warranty; keep intact all the notices that refer to this License and + to the absence of any warranty; and give any other recipients of the Program + a copy of this License along with the Program. + You may charge a fee for the physical act of transferring a copy, and you + may at your option offer warranty protection in exchange for a fee. +\layout Standard + +2. + You may modify your copy or copies of the Program or any portion of it, + thus forming a work based on the Program, and copy and distribute such + modifications or work under the terms of Section 1 above, provided that + you also meet all of these conditions: +\layout Standard + +a) You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. +\layout Standard + +b) You must cause any work that you distribute or publish, that in whole + or in part contains or is derived from the Program or any part thereof, + to be licensed as a whole at no charge to all third parties under the terms + of this License. +\layout Standard + +c) If the modified program normally reads commands interactively when run, + you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an appropriate + copyright notice and a notice that there is no warranty (or else, saying + that you provide a warranty) and that users may redistribute the program + under these conditions, and telling the user how to view a copy of this + License. + (Exception: if the Program itself is interactive but does not normally + print such an announcement, your work based on the Program is not required + to print an announcement.) These requirements apply to the modified work + as a whole. + If identifiable sections of that work are not derived from the Program, + and can be reasonably considered independent and separate works in themselves, + then this License, and its terms, do not apply to those sections when you + distribute them as separate works. + But when you distribute the same sections as part of a whole which is a + work based on the Program, the distribution of the whole must be on the + terms of this License, whose permissions for other licensees extend to + the entire whole, and thus to each and every part regardless of who wrote + it. + Thus, it is not the intent of this section to claim rights or contest your + rights to work written entirely by you; rather, the intent is to exercise + the right to control the distribution of derivative or collective works + based on the Program. + In addition, mere aggregation of another work not based on the Program + with the Program (or with a work based on the Program) on a volume of a + storage or distribution medium does not bring the other work under the + scope of this License. +\layout Standard + +3. + You may copy and distribute the Program (or a work based on it, under Section + 2) in object code or executable form under the terms of Sections 1 and + 2 above provided that you also do one of the following: +\layout Standard + +a) Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 above + on a medium customarily used for software interchange; or, +\layout Standard + +b) Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, +\layout Standard + +c) Accompany it with the information you received as to the offer to distribute + corresponding source code. + (This alternative is allowed only for noncommercial distribution and only + if you received the program in object code or executable form with such + an offer, in accord with Subsection b above.) The source code for a work + means the preferred form of the work for making modifications to it. + For an executable work, complete source code means all the source code + for all modules it contains, plus any associated interface definition files, + plus the scripts used to control compilation and installation of the executable. + However, as a special exception, the source code distributed need not include + anything that is normally distributed (in either source or binary form) + with the major components (compiler, kernel, and so on) of the operating + system on which the executable runs, unless that component itself accompanies + the executable. + If distribution of executable or object code is made by offering access + to copy from a designated place, then offering equivalent access to copy + the source code from the same place counts as distribution of the source + code, even though third parties are not compelled to copy the source along + with the object code. +\layout Standard + +4. + You may not copy, modify, sublicense, or distribute the Program except + as expressly provided under this License. + Any attempt otherwise to copy, modify, sublicense or distribute the Program + is void, and will automatically terminate your rights under this License. + However, parties who have received copies, or rights, from you under this + License will not have their licenses terminated so long as such parties + remain in full compliance. +\layout Standard + +5. + You are not required to accept this License, since you have not signed + it. + However, nothing else grants you permission to modify or distribute the + Program or its derivative works. + These actions are prohibited by law if you do not accept this License. + Therefore, by modifying or distributing the Program (or any work based + on the Program), you indicate your acceptance of this License to do so, + and all its terms and conditions for copying, distributing or modifying + the Program or works based on it. +\layout Standard + +6. + Each time you redistribute the Program (or any work based on the Program), + the recipient automatically receives a license from the original licensor + to copy, distribute or modify the Program subject to these terms and conditions. + You may not impose any further restrictions on the recipients' exercise + of the rights granted herein. + You are not responsible for enforcing compliance by third parties to this + License. +\layout Standard + +7. + If, as a consequence of a court judgment or allegation of patent infringement + or for any other reason (not limited to patent issues), conditions are + imposed on you (whether by court order, agreement or otherwise) that contradict + the conditions of this License, they do not excuse you from the conditions + of this License. + If you cannot distribute so as to satisfy simultaneously your obligations + under this License and any other pertinent obligations, then as a consequence + you may not distribute the Program at all. + For example, if a patent license would not permit royalty-free redistribution + of the Program by all those who receive copies directly or indirectly through + you, then the only way you could satisfy both it and this License would + be to refrain entirely from distribution of the Program. + If any portion of this section is held invalid or unenforceable under any + particular circumstance, the balance of the section is intended to apply + and the section as a whole is intended to apply in other circumstances. + It is not the purpose of this section to induce you to infringe any patents + or other property right claims or to contest validity of any such claims; + this section has the sole purpose of protecting the integrity of the free + software distribution system, which is implemented by public license practices. + Many people have made generous contributions to the wide range of software + distributed through that system in reliance on consistent application of + that system; it is up to the author/donor to decide if he or she is willing + to distribute software through any other system and a licensee cannot impose + that choice. + This section is intended to make thoroughly clear what is believed to be + a consequence of the rest of this License. +\layout Standard + +8. + If the distribution and/or use of the Program is restricted in certain + countries either by patents or by copyrighted interfaces, the original + copyright holder who places the Program under this License may add an explicit + geographical distribution limitation excluding those countries, so that + distribution is permitted only in or among countries not thus excluded. + In such case, this License incorporates the limitation as if written in + the body of this License. +\layout Standard + +9. + The Free Software Foundation may publish revised and/or new versions of + the General Public License from time to time. + Such new versions will be similar in spirit to the present version, but + may differ in detail to address new problems or concerns. + Each version is given a distinguishing version number. + If the Program specifies a version number of this License which applies + to it and "any later version", you have the option of following the terms + and conditions either of that version or of any later version published + by the Free Software Foundation. + If the Program does not specify a version number of this License, you may + choose any version ever published by the Free Software Foundation. +\layout Standard + +10. + If you wish to incorporate parts of the Program into other free programs + whose distribution conditions are different, write to the author to ask + for permission. + For software which is copyrighted by the Free Software Foundation, write + to the Free Software Foundation; we sometimes make exceptions for this. + Our decision will be guided by the two goals of preserving the free status + of all derivatives of our free software and of promoting the sharing and + reuse of software generally. +\layout Standard + + +\emph on +NO WARRANTY +\layout Standard + +11. + BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR + THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER + PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER + EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH + YOU. + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY + SERVICING, REPAIR OR CORRECTION. +\layout Standard + +12. + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL + ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING + ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF + THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS + OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR + THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY + OF SUCH DAMAGES. +\layout Standard + + +\emph on +END OF TERMS AND CONDITIONS +\layout Addchap + +Glossary +\layout Description + +Access\SpecialChar ~ +modifiers In the Java programming language, the use of the keywords + +\family typewriter +private +\family default +, +\family typewriter +protected +\family default +, +\family typewriter +public +\family default + (or the use of no keyword) defines the access rights for data or program + code (also called visibility). + This information is also used by the JVM: it is part of the class files. + The most important modifier is +\family typewriter +private +\family default + which is used to globally deny access to a field or method. +\layout Description + +Access\SpecialChar ~ +rights Access rights are granted or denied by the use of +\latex latex + +\backslash +( +\backslash +triangleright +\backslash +) +\latex default +access modifiers. +\layout Description + +API Applications Programming Interface. + Such an interface is used to include functionality of foreign program modules + (often +\latex latex + +\latex default +Java +\latex latex + +\backslash +( +\backslash +triangleright +\backslash +) +\latex default +packages) into own programs. +\layout Description + +Debugger A program used to investigate the behaviour of another program. + Often used to find and remove programming errors, so-called bugs. +\layout Description + +Descriptor A symbolic description of type information. + In the JVM's class files, strings in UTF-8 format +\begin_inset LatexCommand \cite{Unicode} + +\end_inset + + are used to describe type information. +\layout Description + +Field A member of a Java object or class, also called variable or attribute. +\layout Description + +Method A member of a Java object or class. + Methods include program code or they are abstract representatives for program + code. + A method can be compared to a +\emph on +function +\emph default +in programming languages like C or Pascal. +\layout Description + +Opcode Operation Code. + This denotes an instruction in an assembly-like computer language; to some + people it means its binary representation. +\layout Description + +Package A package is an entity used in both the Java programming language + and the Java Virtual Machine definition. + It is used to group classes that in the eyes of the programmer belong together. + Package definitions have impact on +\latex latex + +\backslash +( +\backslash +triangleright +\backslash +) +\latex default +access rights granted to other classes. +\layout Description + +Signature A method has a (possibly empty) set of arguments it expects, and + it has a return type (possibly the +\family typewriter +void +\family default + type). + The type information of the arguments and the return type together is called + signature. + A signature can be expressed in terms of a +\latex latex + +\backslash +( +\backslash +triangleright +\backslash +) +\latex default +descriptor. +\layout Description + +Type A field or a method argument has a type such as +\family typewriter +int +\family default + or +\family typewriter +String +\family default +. + In the JVM's context, all values are typed. + Types can be expressed in terms of a +\latex latex + +\backslash +( +\backslash +triangleright +\backslash +) +\latex default +descriptor. +\layout Standard + + +\begin_inset LatexCommand \listoffigures{} + +\end_inset + + +\layout Standard + + +\latex latex + +\backslash +addcontentsline{toc}{chapter}{List Of Figures} +\layout Standard + + +\begin_inset LatexCommand \listofalgorithms{} + +\end_inset + + +\layout Standard + + +\latex latex + +\backslash +addcontentsline{toc}{chapter}{List Of Algorithms} +\layout Bibliography +\bibitem [AppMag-WWW]{AppMag-WWW} + + +\latex latex + +\backslash +addcontentsline{toc}{chapter}{Bibliography} +\latex default +AverStar's AppletMagic(tm): Ada for the Java Virtual Machine. +\newline + +\emph on +http://www.appletmagic.com +\layout Bibliography +\bibitem [AsmGofer]{AsmGofer} + +Joachim Schmid: AsmGofer. +\newline + +\emph on +http://www.tydo.org +\layout Bibliography +\bibitem [BCEL98]{BCEL98} + +Markus Dahm: Byte Code Engineering with the BCEL API. + Freie Universität Berlin, Institut für Informatik. + Technical Report B-17-98. +\layout Bibliography +\bibitem [BCEL-WWW]{BCEL-WWW} + +Markus Dahm: Byte Code Engineering Library. +\emph on + +\newline +http://bcel.sourceforge.net +\layout Bibliography +\bibitem [BCV-Soundness]{BCV-Soundness} + +Cornelia Pusch: Proving the Soundness of a Java Bytecode Verifier Specification + in Isabelle/HOL. + Technische Universität München, Institut für Informatik. + +\newline + +\emph on +http://www.in.tum.de/~pusch/ +\layout Bibliography +\bibitem [C]{C} + +Brian W. + Kerninghan, Dennis M. + Ritchie: The C Programming Language, Second Edition, ANSI C. + Prentice-Hall 1998, ISBN 0131103628. +\layout Bibliography +\bibitem [CPP-D]{CPP-D} + +Bjarne Stroustrup: Die C++ Programmiersprache. + Addison-Wesly-Longman, 1998, ISBN 3-8273-1296-5. +\layout Bibliography +\bibitem [CPP-E]{CPP-E} + +Bjarne Stroustrup: The C++-Programming Language, Third Edition. + Addison-Wesley 1997, ISBN 0-201-88954-4. +\layout Bibliography +\bibitem [D3]{D3} + +Guido Lang, Andreas Bohne: Delphi 3.0 lernen. + Addison-Wesley-Longman 1997, ISBN 3-8273-1190-x. +\layout Bibliography +\bibitem [DesignPatterns]{DesignPatterns} + +Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns + Elements of Reusable Object-Oriented Software. + Addison-Wesley 1995, ISBN: 0201633612. +\layout Bibliography +\bibitem [DragonBook]{DragonBook} + +Alfred V. + Aho, Ravi Sethi, Jeffrey D. + Ullman: Compilers: Principles, Techniques, and Tools. + Addison-Wesley 1985, ISBN: 0201100886. +\layout Bibliography +\bibitem [EF]{EF} + +ElectricalFire. +\emph on + +\newline +http://www.mozilla.org/projects/ef/ +\layout Bibliography +\bibitem [f2j]{f2j} + +Keith Seymour: f2j - Fortran-to-Java Compiler. +\newline + +\emph on +http://cs.utk.edu/f2j/ +\layout Bibliography +\bibitem [Fong-WWW]{Fong-WWW} + +Philip W. + L. + Fong: The mysterious Pass One, first draft, September 2, 1997. + +\newline + +\emph on +http://www.cs.sfu.ca/people/GradStudents/pwfong/personal/ JVM/pass1/ +\layout Bibliography +\bibitem [Fong2-WWW]{Fong2-WWW} + +Philip W. + L. + Fong: A Flaw with the Specification of the Invokeinterface Opcode. + +\newline + +\emph on +http://www.cs.sfu.ca/people/GradStudents/pwfong/personal/ JVM/invokeinterface/ +\layout Bibliography +\bibitem [FreundMitchell]{FreundMitchell} + +Stephen N. + Freund, John Mitchell: A Formal Framework for the Java Bytecode Language + and Verifier. + Department of Computer Science, Stanford University. + Stanford, CA 94305-9045. + Appeared in OOPSLA '99. +\layout Bibliography +\bibitem [GCC-WWW]{GCC-WWW} + +GCC, The GNU compiler collection. +\emph on + +\newline +http://gcc.gnu.org +\layout Bibliography +\bibitem [GJ-WWW]{GJ-WWW} + +GJ. + A Generic Java Language Extension. +\newline + +\emph on +http://www.cis.unisa.edu.au/~pizza/gj/ +\layout Bibliography +\bibitem [InnerSpec]{InnerSpec} + +Sun Microsystems: Inner Classes Specification. +\newline + +\emph on +http://java.sun.com/products/jdk/1.1/docs/guide/ +\newline +innerclasses/spec/innerclasses.doc.html +\layout Bibliography +\bibitem [J2ME-CLDCS]{J2ME-CLDCS} + +Sun Microsystems: J2ME +\latex latex + +\backslash +texttrademark +\latex default +\SpecialChar ~ + Connected Limited Device Configuration Specification. +\newline + +\emph on +http://jcp.org/aboutJava/communityprocess/final/jsr030/ +\layout Bibliography +\bibitem [JBook]{JBook} + +Robert Stärk, Joachim Schmid, Egon Börger: Java +\latex latex + +\backslash +texttrademark\SpecialChar ~ + +\latex default + and the Java +\latex latex + +\backslash +texttrademark\SpecialChar ~ + +\latex default + Virtual Machine. + Springer-Verlag 2001, ISBN 3-540-42088-6. +\newline + +\emph on +http://www.inf.ethz.ch/~jbook/ +\layout Bibliography +\bibitem [JPaper]{JPaper} + +Robert F. + Stärk, Joachim Schmid: Java bytecode verification is not possible. + ETH Zürich, Department of Computer Science 2000. +\emph on + +\newline +http://www.inf.ethz.ch/~staerk/pdf/jbv00.pdf +\layout Bibliography +\bibitem [JLectures]{JLectures} + +Robert F. + Stärk: Java and the JVM: Definition and Verification (37-474). +\newline + +\emph on +http://www.inf.ethz.ch/~jbook/eth37474/ +\newline +http://www.inf.ethz.ch/~jbook/eth37474/javaBV.pdf +\layout Bibliography +\bibitem [JNS]{JNS} + +Robert Macgregor, Dave Durbin, John Owlett, Andrew Yeomans: JAVA +\latex latex + +\backslash +texttrademark +\latex default +\SpecialChar ~ + Network Security. + Prentice Hall 1998, ISBN 0137615299. +\layout Bibliography +\bibitem [JODE-WWW]{JODE-WWW} + +JODE is a java package containing a decompiler and an optimizer for java. +\newline + +\emph on +http://jode.sourceforge.net +\layout Bibliography +\bibitem [JustIce]{JustIce} + +Enver Haase: JustIce. + A Free Class File Verifier for Java +\latex latex + +\backslash +texttrademark +\latex default +\SpecialChar ~ +.Freie Universität Berlin, Takustraße 9, D-14195 Berlin; September 2001. +\newline + +\emph on +http://bcel.sourceforge.net/ +\newline +http://bcel.sourceforge.net/justice +\layout Bibliography +\bibitem [JVM]{JVM} + +Jon Meyer, Troy Downing: JAVA Virtual Machine. + O'Reilly 1997, ISBN 1-56592-194-1. +\layout Bibliography +\bibitem [Kaffe-WWW]{Kaffe-WWW} + +Kaffe. + Kaffe is a cleanroom, open source implementation of a Java virtual machine + and class libraries. +\emph on + +\newline +http://www.kaffe.org +\layout Bibliography +\bibitem [KAWA-WWW]{KAWA-WWW} + +Kawa, the Java-based Scheme system. +\emph on + +\newline +http://http://www.gnu.org/software/kawa/ +\layout Bibliography +\bibitem [KDE]{KDE} + +KDE, the K desktop environment. +\newline + +\emph on +http://www.kde.org +\layout Bibliography +\bibitem [Kimera-WWW]{Kimera-WWW} + +The Kimera Verifier. + +\emph on + +\emph default + +\newline +Currently off-line because of a World Wide Web presentation rework. +\emph on + +\newline +http://kimera.cs.washington.edu/verifier.html +\newline +http://www-kimera.cs.washington.edu +\layout Bibliography +\bibitem [Kimera-TestingJVM]{Kimera-TestingJVM} + +Emin Gün Sirer: Testing Java Virtual Machines. + An Experience Report on Automatically Testing Java Virtual Machines. + University of Washington, Dept. + of Computer Science and Engineering. +\newline + +\emph on +http://kimera.cs.washington.edu +\layout Bibliography +\bibitem [Kimera-ProdGram]{Kimera-ProdGram} + +Emin Gün Sirer, Brian N. + Bershad: Using Production Grammars in Software Testing. + University of Washington, Department of Computer Science. +\newline + +\emph on +http://kimera.cs.washington.edu +\layout Bibliography +\bibitem [kissme-WWW]{kissme-WWW} + +kissme. + A free Java Virtual Machine. +\emph on + +\newline +http://kissme.sourceforge.net +\layout Bibliography +\bibitem [Krakatoa-WWW]{Krakatoa-WWW} + +Todd A. + Proebsting, Scott A. + Watterson: Krakatoa: Decompilation in Java (Does Bytecode Reveal Source?). + The University of Arizona, Department of Computer Science. +\newline + +\emph on +http://www.cs.arizona.edu/people/saw/papers/Krakatoa-COOTS97.ps.Z +\layout Bibliography +\bibitem [langspec2]{langspec2} + +James Gosling, Bill Joy, Guy Steele, Gilad Bracha: The Java Language Specificati +on, Second Edition. + Addison-Wesley 2000, ISBN 0201310082. +\layout Bibliography +\bibitem [M2]{M2} + +Niklaus Wirth: Programming in Modula-2, Fourth Edition. + Springer-Verlag 1988, ISBN 3-540-50150-9. +\layout Bibliography +\bibitem [Mozilla]{Mozilla} + +Mozilla.org (The Mozilla Origanization): Mozilla. +\newline + +\emph on +http://www.mozilla.org +\layout Bibliography +\bibitem [Neuromancer]{Neuromancer} + +William Gibson: Neuromancer. + Ace Books 1994, ISBN 0441000681. +\layout Bibliography +\bibitem [ORP-WWW]{ORP-WWW} + +Open Runtime Platform. + A Platform For Bytecode System Research. +\newline + +\emph on +http://www.intel.com/research/mrl/orp/index.htm +\layout Bibliography +\bibitem [PL4JVM]{PL4JVM} + +Robert Tolksdorf: Programming Languages for the Java Virtual Machine. +\newline + +\emph on +http://grunge.cs.tu-berlin.de/~tolk/vmlanguages.html +\layout Bibliography +\bibitem [PMG-WWW]{PMG-WWW} + +PMG. + Poor Man's Genericity for Java. + +\newline + +\emph on +http://www.inf.fu-berlin.de/~bokowski/pmgjava/index.html +\layout Bibliography +\bibitem [Qian]{Qian} + +Zhenyu Qian: A Formal Specification of Java +\latex latex + +\backslash +texttrademark +\latex default +\SpecialChar ~ + Virtual Machine Instructions for Objects, Methods and Subroutines. + Bremen Institute for Safe Systems (BISS), FB3 Informatik, Universität Bremen, + D-28334 Bremen, Germany. +\layout Bibliography +\bibitem [SableVM-WWW]{SableVM-WWW} + +SableVM. + A Bytecode Interpreter. +\emph on + +\newline +http://www.sablevm.org +\layout Bibliography +\bibitem [StataAbadi]{StataAbadi} + +Raymie Stata and Martin Abadi: A Type System for Java Bytecode Subroutines. + In: ACM Transactions on Programming Languages and Systems, Vol. + 21, No. + 1, January 1999, Pages 90-137. +\layout Bibliography +\bibitem [Unknowable]{Unknowable} + +G.J. + Chaitin: The Unknowable. + Springer-Verlag 1999, ISBN 981-4021-72-5. +\newline + +\emph on +http://www.umcs.maine.edu/~chaitin/unknowable/ +\layout Bibliography +\bibitem [Unicode]{Unicode} + +The Unicode Consortium: The Unicode Standard, Version 2.0. + Niso Press 1996, ISBN 0-201-48345-9. +\newline + +\emph on +http://www.unicode.org +\layout Bibliography +\bibitem [Yellin-WWW]{Yellin-WWW} + +Frank Yellin: Low Level Security in Java. +\emph on + +\newline +http://java.sun.com/sfaq/verifier.html +\layout Bibliography +\bibitem [VMSPEC2]{vmspec2} + +Tim Lindholm, Frank Yellin: The Java +\latex latex + +\backslash +texttrademark\SpecialChar ~ + +\latex default + Virtual Machine Specification, Second Edition. + Addison-Wesley 1999, ISBN 0-201-43294-4. +\the_end diff --git a/docs/verifier/V_API_SD.eps b/docs/verifier/V_API_SD.eps new file mode 100644 index 00000000..ace1359a --- /dev/null +++ b/docs/verifier/V_API_SD.eps @@ -0,0 +1,2401 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 6 6 1079 801 +%%BeginProcSet: reencode 1.0 0 +/RE +{ findfont begin + currentdict dup length dict begin + {1 index /FID ne {def} {pop pop} ifelse} forall + /FontName exch def dup length 0 ne + { /Encoding Encoding 256 array copy def + 0 exch + { dup type /nametype eq + { Encoding 2 index 2 index put + pop 1 add + } + { exch pop + } ifelse + } forall + } if pop + currentdict dup end end + /FontName get exch definefont pop + } bind def +%%EndProcSet: reencode 1.0 0 +%%BeginProcSet: ellipse 1.0 0 +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse { ellipsedict begin +/endangle exch def +/startangle exch def +/yrad exch def +/xrad exch def +/y exch def +/x exch def +/savematrix mtrx currentmatrix def +x y translate +xrad yrad scale +0 0 1 0 360 arc +savematrix setmatrix end } def +%%EndProcSet: ellipse 1.0 0 +%%EndProlog +%%BeginSetup +/isolatin1encoding +[ 32 /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright + /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one + /two /three /four /five /six /seven /eight /nine /colon /semicolon + /less /equal /greater /question /at /A /B /C /D /E + /F /G /H /I /J /K /L /M /N /O + /P /Q /R /S /T /U /V /W /X /Y + /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c + /d /e /f /g /h /i /j /k /l /m + /n /o /p /q /r /s /t /u /v /w + /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef + /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright + /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior + /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf + /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla + /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde + /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex + /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring + /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis + /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave + /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def +%%EndSetup +1 setlinewidth +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +12 scalefont setfont +0.0 0.0 0.0 setrgbcolor +0 807 translate +1.0 1.0 1.0 setrgbcolor +newpath +10 -10 moveto +86 0 rlineto +0 -26 rlineto +-86 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +10 -10 moveto +86 0 rlineto +0 -26 rlineto +-86 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +10 -10 moveto +86 0 rlineto +0 -26 rlineto +-86 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +10 -10 moveto +86 0 rlineto +0 -26 rlineto +-86 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +10 -10 moveto +86 0 rlineto +0 -26 rlineto +-86 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +10 -10 moveto +86 0 rlineto +0 -26 rlineto +-86 0 rlineto +closepath +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +9 scalefont setfont +newpath +21 -25 moveto +86 -25 lineto +stroke +21 -24 moveto +(firewall : Object) show +1.0 1.0 1.0 setrgbcolor +newpath +49 -37 moveto +9 0 rlineto +0 -759 rlineto +-9 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +49 -37 moveto +9 0 rlineto +0 -759 rlineto +-9 0 rlineto +closepath +stroke +newpath +49 -796 moveto +58 -796 lineto +stroke +newpath +58 -796 moveto +49 -796 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +43 -72 moveto +20 0 rlineto +0 -679 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +43 -72 moveto +20 0 rlineto +0 -679 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +43 -72 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +43 -72 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +43 -112 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +43 -112 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +43 -152 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +43 -152 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +43 -232 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +43 -232 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +43 -272 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +43 -272 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +43 -752 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +43 -752 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +157 -10 moveto +119 0 rlineto +0 -26 rlineto +-119 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +157 -10 moveto +119 0 rlineto +0 -26 rlineto +-119 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +157 -10 moveto +119 0 rlineto +0 -26 rlineto +-119 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +157 -10 moveto +119 0 rlineto +0 -26 rlineto +-119 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +157 -10 moveto +119 0 rlineto +0 -26 rlineto +-119 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +157 -10 moveto +119 0 rlineto +0 -26 rlineto +-119 0 rlineto +closepath +stroke +newpath +168 -25 moveto +266 -25 lineto +stroke +168 -24 moveto +(aClassToVerify : Class) show +1.0 1.0 1.0 setrgbcolor +newpath +213 -37 moveto +9 0 rlineto +0 -759 rlineto +-9 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +213 -37 moveto +9 0 rlineto +0 -759 rlineto +-9 0 rlineto +closepath +stroke +newpath +213 -796 moveto +222 -796 lineto +stroke +newpath +222 -796 moveto +213 -796 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +207 -72 moveto +20 0 rlineto +0 -39 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +207 -72 moveto +20 0 rlineto +0 -39 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +207 -72 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +207 -72 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +207 -112 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +207 -112 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +337 -10 moveto +118 0 rlineto +0 -26 rlineto +-118 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +337 -10 moveto +118 0 rlineto +0 -26 rlineto +-118 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +337 -10 moveto +118 0 rlineto +0 -26 rlineto +-118 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +337 -10 moveto +118 0 rlineto +0 -26 rlineto +-118 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +337 -10 moveto +118 0 rlineto +0 -26 rlineto +-118 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +337 -10 moveto +118 0 rlineto +0 -26 rlineto +-118 0 rlineto +closepath +stroke +newpath +348 -25 moveto +445 -25 lineto +stroke +348 -24 moveto +(theVF : VerifierFactory) show +1.0 1.0 1.0 setrgbcolor +newpath +392 -37 moveto +9 0 rlineto +0 -759 rlineto +-9 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +392 -37 moveto +9 0 rlineto +0 -759 rlineto +-9 0 rlineto +closepath +stroke +newpath +392 -796 moveto +401 -796 lineto +stroke +newpath +401 -796 moveto +392 -796 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +386 -152 moveto +20 0 rlineto +0 -79 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +386 -152 moveto +20 0 rlineto +0 -79 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +386 -152 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +386 -152 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +386 -192 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +386 -192 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +386 -232 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +386 -232 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +562 -180 moveto +95 0 rlineto +0 -26 rlineto +-95 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +562 -180 moveto +95 0 rlineto +0 -26 rlineto +-95 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +562 -180 moveto +95 0 rlineto +0 -26 rlineto +-95 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +562 -180 moveto +95 0 rlineto +0 -26 rlineto +-95 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +562 -180 moveto +95 0 rlineto +0 -26 rlineto +-95 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +562 -180 moveto +95 0 rlineto +0 -26 rlineto +-95 0 rlineto +closepath +stroke +newpath +573 -195 moveto +647 -195 lineto +stroke +573 -194 moveto +(aVerifier : Verifier) show +1.0 1.0 1.0 setrgbcolor +newpath +606 -207 moveto +9 0 rlineto +0 -589 rlineto +-9 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +606 -207 moveto +9 0 rlineto +0 -589 rlineto +-9 0 rlineto +closepath +stroke +newpath +606 -796 moveto +615 -796 lineto +stroke +newpath +615 -796 moveto +606 -796 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +600 -207 moveto +20 0 rlineto +0 -544 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +600 -207 moveto +20 0 rlineto +0 -544 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +562 -190 moveto +95 0 rlineto +0 1 rlineto +-95 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +562 -190 moveto +95 0 rlineto +0 1 rlineto +-95 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +600 -272 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +600 -272 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +600 -312 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +600 -312 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +600 -352 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +600 -352 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +600 -432 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +600 -432 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +600 -472 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +600 -472 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +600 -512 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +600 -512 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +600 -592 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +600 -592 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +600 -632 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +600 -632 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +600 -712 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +600 -712 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +600 -752 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +600 -752 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +764 -300 moveto +108 0 rlineto +0 -26 rlineto +-108 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +764 -300 moveto +108 0 rlineto +0 -26 rlineto +-108 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +764 -300 moveto +108 0 rlineto +0 -26 rlineto +-108 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +764 -300 moveto +108 0 rlineto +0 -26 rlineto +-108 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +764 -300 moveto +108 0 rlineto +0 -26 rlineto +-108 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +764 -300 moveto +108 0 rlineto +0 -26 rlineto +-108 0 rlineto +closepath +stroke +newpath +775 -315 moveto +862 -315 lineto +stroke +775 -314 moveto +(aP2V : Pass2Verifier) show +1.0 1.0 1.0 setrgbcolor +newpath +814 -327 moveto +9 0 rlineto +0 -469 rlineto +-9 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +814 -327 moveto +9 0 rlineto +0 -469 rlineto +-9 0 rlineto +closepath +stroke +newpath +814 -796 moveto +823 -796 lineto +stroke +newpath +823 -796 moveto +814 -796 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +808 -327 moveto +20 0 rlineto +0 -384 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +808 -327 moveto +20 0 rlineto +0 -384 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +764 -310 moveto +108 0 rlineto +0 1 rlineto +-108 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +764 -310 moveto +108 0 rlineto +0 1 rlineto +-108 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +808 -352 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +808 -352 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +808 -432 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +808 -432 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +808 -632 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +808 -632 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +808 -672 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +808 -672 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +808 -672 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +808 -672 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +808 -712 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +808 -712 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +808 -392 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +808 -392 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +808 -392 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +808 -392 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +933 -460 moveto +108 0 rlineto +0 -26 rlineto +-108 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +933 -460 moveto +108 0 rlineto +0 -26 rlineto +-108 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +933 -460 moveto +108 0 rlineto +0 -26 rlineto +-108 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +933 -460 moveto +108 0 rlineto +0 -26 rlineto +-108 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +933 -460 moveto +108 0 rlineto +0 -26 rlineto +-108 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +933 -460 moveto +108 0 rlineto +0 -26 rlineto +-108 0 rlineto +closepath +stroke +newpath +944 -475 moveto +1031 -475 lineto +stroke +944 -474 moveto +(aP1V : Pass1Verifier) show +1.0 1.0 1.0 setrgbcolor +newpath +983 -487 moveto +9 0 rlineto +0 -309 rlineto +-9 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +983 -487 moveto +9 0 rlineto +0 -309 rlineto +-9 0 rlineto +closepath +stroke +newpath +983 -796 moveto +992 -796 lineto +stroke +newpath +992 -796 moveto +983 -796 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +977 -487 moveto +20 0 rlineto +0 -104 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +977 -487 moveto +20 0 rlineto +0 -104 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +933 -470 moveto +108 0 rlineto +0 1 rlineto +-108 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +933 -470 moveto +108 0 rlineto +0 1 rlineto +-108 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +977 -512 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +977 -512 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +977 -552 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +977 -552 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +977 -552 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +977 -552 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +1.0 1.0 1.0 setrgbcolor +newpath +977 -592 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +977 -592 moveto +20 0 rlineto +0 1 rlineto +-20 0 rlineto +closepath +stroke +newpath +64 -72 moveto +207 -72 lineto +stroke +newpath +206 -72 moveto +194 -79 lineto +194 -65 lineto +closepath +eofill +newpath +206 -72 moveto +194 -79 lineto +194 -65 lineto +closepath +stroke +73 -68 moveto +( : getName\(\)) show +newpath +207 -112 moveto +202 -112 lineto +stroke +newpath +197 -112 moveto +192 -112 lineto +stroke +newpath +187 -112 moveto +182 -112 lineto +stroke +newpath +177 -112 moveto +172 -112 lineto +stroke +newpath +167 -112 moveto +162 -112 lineto +stroke +newpath +157 -112 moveto +152 -112 lineto +stroke +newpath +147 -112 moveto +142 -112 lineto +stroke +newpath +137 -112 moveto +132 -112 lineto +stroke +newpath +127 -112 moveto +122 -112 lineto +stroke +newpath +117 -112 moveto +112 -112 lineto +stroke +newpath +107 -112 moveto +102 -112 lineto +stroke +newpath +97 -112 moveto +92 -112 lineto +stroke +newpath +87 -112 moveto +82 -112 lineto +stroke +newpath +77 -112 moveto +72 -112 lineto +stroke +newpath +67 -112 moveto +64 -112 lineto +stroke +newpath +77 -105 moveto +65 -112 lineto +stroke +newpath +77 -119 moveto +65 -112 lineto +stroke +156 -128 moveto +( : name) show +newpath +64 -152 moveto +386 -152 lineto +stroke +newpath +385 -152 moveto +373 -159 lineto +373 -145 lineto +closepath +eofill +newpath +385 -152 moveto +373 -159 lineto +373 -145 lineto +closepath +stroke +104 -148 moveto +( : getVerifier\(name\)) show +newpath +407 -192 moveto +560 -192 lineto +562 -190 lineto +stroke +newpath +561 -191 moveto +550 -200 lineto +547 -186 lineto +closepath +eofill +newpath +561 -191 moveto +550 -200 lineto +547 -186 lineto +closepath +stroke +396 -188 moveto +( : create_if_not_cached) show +newpath +386 -232 moveto +381 -232 lineto +stroke +newpath +376 -232 moveto +371 -232 lineto +stroke +newpath +366 -232 moveto +361 -232 lineto +stroke +newpath +356 -232 moveto +351 -232 lineto +stroke +newpath +346 -232 moveto +341 -232 lineto +stroke +newpath +336 -232 moveto +331 -232 lineto +stroke +newpath +326 -232 moveto +321 -232 lineto +stroke +newpath +316 -232 moveto +311 -232 lineto +stroke +newpath +306 -232 moveto +301 -232 lineto +stroke +newpath +296 -232 moveto +291 -232 lineto +stroke +newpath +286 -232 moveto +281 -232 lineto +stroke +newpath +276 -232 moveto +271 -232 lineto +stroke +newpath +266 -232 moveto +261 -232 lineto +stroke +newpath +256 -232 moveto +251 -232 lineto +stroke +newpath +246 -232 moveto +241 -232 lineto +stroke +newpath +236 -232 moveto +231 -232 lineto +stroke +newpath +226 -232 moveto +221 -232 lineto +stroke +newpath +216 -232 moveto +211 -232 lineto +stroke +newpath +206 -232 moveto +201 -232 lineto +stroke +newpath +196 -232 moveto +191 -232 lineto +stroke +newpath +186 -232 moveto +181 -232 lineto +stroke +newpath +176 -232 moveto +171 -232 lineto +stroke +newpath +166 -232 moveto +161 -232 lineto +stroke +newpath +156 -232 moveto +151 -232 lineto +stroke +newpath +146 -232 moveto +141 -232 lineto +stroke +newpath +136 -232 moveto +131 -232 lineto +stroke +newpath +126 -232 moveto +121 -232 lineto +stroke +newpath +116 -232 moveto +111 -232 lineto +stroke +newpath +106 -232 moveto +101 -232 lineto +stroke +newpath +96 -232 moveto +91 -232 lineto +stroke +newpath +86 -232 moveto +81 -232 lineto +stroke +newpath +76 -232 moveto +71 -232 lineto +stroke +newpath +66 -232 moveto +64 -232 lineto +stroke +newpath +77 -225 moveto +65 -232 lineto +stroke +newpath +77 -239 moveto +65 -232 lineto +stroke +238 -248 moveto +( : verifier_responsible_for_name) show +newpath +64 -272 moveto +600 -272 lineto +stroke +newpath +599 -272 moveto +587 -279 lineto +587 -265 lineto +closepath +eofill +newpath +599 -272 moveto +587 -279 lineto +587 -265 lineto +closepath +stroke +173 -268 moveto +( : doPass2\(\)) show +newpath +621 -312 moveto +760 -312 lineto +764 -310 lineto +stroke +newpath +763 -311 moveto +752 -320 lineto +749 -306 lineto +closepath +eofill +newpath +763 -311 moveto +752 -320 lineto +749 -306 lineto +closepath +stroke +607 -308 moveto +( : create_if_not_cached) show +newpath +621 -352 moveto +808 -352 lineto +stroke +newpath +807 -352 moveto +795 -359 lineto +795 -345 lineto +closepath +eofill +newpath +807 -352 moveto +795 -359 lineto +795 -345 lineto +closepath +stroke +647 -348 moveto +( : verify\(\)) show +newpath +808 -432 moveto +621 -432 lineto +stroke +newpath +622 -432 moveto +634 -425 lineto +634 -439 lineto +closepath +eofill +newpath +622 -432 moveto +634 -425 lineto +634 -439 lineto +closepath +stroke +737 -448 moveto +( : doPass1\(\)) show +newpath +621 -472 moveto +933 -470 lineto +stroke +newpath +932 -471 moveto +920 -478 lineto +920 -464 lineto +closepath +eofill +newpath +932 -471 moveto +920 -478 lineto +920 -464 lineto +closepath +stroke +650 -468 moveto +( : create_if_not_cached) show +newpath +621 -512 moveto +977 -512 lineto +stroke +newpath +976 -512 moveto +964 -519 lineto +964 -505 lineto +closepath +eofill +newpath +976 -512 moveto +964 -519 lineto +964 -505 lineto +closepath +stroke +690 -508 moveto +( : verify\(\)) show +newpath +998 -552 moveto +1024 -552 lineto +1024 -568 lineto +1008 -568 lineto +998 -552 lineto +stroke +newpath +999 -553 moveto +1011 -559 lineto +999 -566 lineto +closepath +eofill +newpath +999 -553 moveto +1011 -559 lineto +999 -566 lineto +closepath +stroke +960 -548 moveto +( : do_some_verifying_work) show +newpath +977 -592 moveto +972 -592 lineto +stroke +newpath +967 -592 moveto +962 -592 lineto +stroke +newpath +957 -592 moveto +952 -592 lineto +stroke +newpath +947 -592 moveto +942 -592 lineto +stroke +newpath +937 -592 moveto +932 -592 lineto +stroke +newpath +927 -592 moveto +922 -592 lineto +stroke +newpath +917 -592 moveto +912 -592 lineto +stroke +newpath +907 -592 moveto +902 -592 lineto +stroke +newpath +897 -592 moveto +892 -592 lineto +stroke +newpath +887 -592 moveto +882 -592 lineto +stroke +newpath +877 -592 moveto +872 -592 lineto +stroke +newpath +867 -592 moveto +862 -592 lineto +stroke +newpath +857 -592 moveto +852 -592 lineto +stroke +newpath +847 -592 moveto +842 -592 lineto +stroke +newpath +837 -592 moveto +832 -592 lineto +stroke +newpath +827 -592 moveto +822 -592 lineto +stroke +newpath +817 -592 moveto +812 -592 lineto +stroke +newpath +807 -592 moveto +802 -592 lineto +stroke +newpath +797 -592 moveto +792 -592 lineto +stroke +newpath +787 -592 moveto +782 -592 lineto +stroke +newpath +777 -592 moveto +772 -592 lineto +stroke +newpath +767 -592 moveto +762 -592 lineto +stroke +newpath +757 -592 moveto +752 -592 lineto +stroke +newpath +747 -592 moveto +742 -592 lineto +stroke +newpath +737 -592 moveto +732 -592 lineto +stroke +newpath +727 -592 moveto +722 -592 lineto +stroke +newpath +717 -592 moveto +712 -592 lineto +stroke +newpath +707 -592 moveto +702 -592 lineto +stroke +newpath +697 -592 moveto +692 -592 lineto +stroke +newpath +687 -592 moveto +682 -592 lineto +stroke +newpath +677 -592 moveto +672 -592 lineto +stroke +newpath +667 -592 moveto +662 -592 lineto +stroke +newpath +657 -592 moveto +652 -592 lineto +stroke +newpath +647 -592 moveto +642 -592 lineto +stroke +newpath +637 -592 moveto +632 -592 lineto +stroke +newpath +627 -592 moveto +622 -592 lineto +stroke +newpath +634 -585 moveto +622 -592 lineto +stroke +newpath +634 -599 moveto +622 -592 lineto +stroke +873 -608 moveto +( : okay) show +newpath +621 -632 moveto +626 -632 lineto +stroke +newpath +631 -632 moveto +636 -632 lineto +stroke +newpath +641 -632 moveto +646 -632 lineto +stroke +newpath +651 -632 moveto +656 -632 lineto +stroke +newpath +661 -632 moveto +666 -632 lineto +stroke +newpath +671 -632 moveto +676 -632 lineto +stroke +newpath +681 -632 moveto +686 -632 lineto +stroke +newpath +691 -632 moveto +696 -632 lineto +stroke +newpath +701 -632 moveto +706 -632 lineto +stroke +newpath +711 -632 moveto +716 -632 lineto +stroke +newpath +721 -632 moveto +726 -632 lineto +stroke +newpath +731 -632 moveto +736 -632 lineto +stroke +newpath +741 -632 moveto +746 -632 lineto +stroke +newpath +751 -632 moveto +756 -632 lineto +stroke +newpath +761 -632 moveto +766 -632 lineto +stroke +newpath +771 -632 moveto +776 -632 lineto +stroke +newpath +781 -632 moveto +786 -632 lineto +stroke +newpath +791 -632 moveto +796 -632 lineto +stroke +newpath +801 -632 moveto +806 -632 lineto +stroke +newpath +795 -639 moveto +807 -632 lineto +stroke +newpath +795 -625 moveto +807 -632 lineto +stroke +652 -628 moveto +( : okay) show +newpath +829 -672 moveto +856 -672 lineto +856 -688 lineto +840 -688 lineto +829 -672 lineto +stroke +newpath +830 -673 moveto +842 -679 lineto +830 -686 lineto +closepath +eofill +newpath +830 -673 moveto +842 -679 lineto +830 -686 lineto +closepath +stroke +791 -668 moveto +( : do_some_verifying_work) show +newpath +808 -712 moveto +803 -712 lineto +stroke +newpath +798 -712 moveto +793 -712 lineto +stroke +newpath +788 -712 moveto +783 -712 lineto +stroke +newpath +778 -712 moveto +773 -712 lineto +stroke +newpath +768 -712 moveto +763 -712 lineto +stroke +newpath +758 -712 moveto +753 -712 lineto +stroke +newpath +748 -712 moveto +743 -712 lineto +stroke +newpath +738 -712 moveto +733 -712 lineto +stroke +newpath +728 -712 moveto +723 -712 lineto +stroke +newpath +718 -712 moveto +713 -712 lineto +stroke +newpath +708 -712 moveto +703 -712 lineto +stroke +newpath +698 -712 moveto +693 -712 lineto +stroke +newpath +688 -712 moveto +683 -712 lineto +stroke +newpath +678 -712 moveto +673 -712 lineto +stroke +newpath +668 -712 moveto +663 -712 lineto +stroke +newpath +658 -712 moveto +653 -712 lineto +stroke +newpath +648 -712 moveto +643 -712 lineto +stroke +newpath +638 -712 moveto +633 -712 lineto +stroke +newpath +628 -712 moveto +623 -712 lineto +stroke +newpath +634 -705 moveto +622 -712 lineto +stroke +newpath +634 -719 moveto +622 -712 lineto +stroke +747 -728 moveto +( : okay) show +newpath +600 -752 moveto +595 -752 lineto +stroke +newpath +590 -752 moveto +585 -752 lineto +stroke +newpath +580 -752 moveto +575 -752 lineto +stroke +newpath +570 -752 moveto +565 -752 lineto +stroke +newpath +560 -752 moveto +555 -752 lineto +stroke +newpath +550 -752 moveto +545 -752 lineto +stroke +newpath +540 -752 moveto +535 -752 lineto +stroke +newpath +530 -752 moveto +525 -752 lineto +stroke +newpath +520 -752 moveto +515 -752 lineto +stroke +newpath +510 -752 moveto +505 -752 lineto +stroke +newpath +500 -752 moveto +495 -752 lineto +stroke +newpath +490 -752 moveto +485 -752 lineto +stroke +newpath +480 -752 moveto +475 -752 lineto +stroke +newpath +470 -752 moveto +465 -752 lineto +stroke +newpath +460 -752 moveto +455 -752 lineto +stroke +newpath +450 -752 moveto +445 -752 lineto +stroke +newpath +440 -752 moveto +435 -752 lineto +stroke +newpath +430 -752 moveto +425 -752 lineto +stroke +newpath +420 -752 moveto +415 -752 lineto +stroke +newpath +410 -752 moveto +405 -752 lineto +stroke +newpath +400 -752 moveto +395 -752 lineto +stroke +newpath +390 -752 moveto +385 -752 lineto +stroke +newpath +380 -752 moveto +375 -752 lineto +stroke +newpath +370 -752 moveto +365 -752 lineto +stroke +newpath +360 -752 moveto +355 -752 lineto +stroke +newpath +350 -752 moveto +345 -752 lineto +stroke +newpath +340 -752 moveto +335 -752 lineto +stroke +newpath +330 -752 moveto +325 -752 lineto +stroke +newpath +320 -752 moveto +315 -752 lineto +stroke +newpath +310 -752 moveto +305 -752 lineto +stroke +newpath +300 -752 moveto +295 -752 lineto +stroke +newpath +290 -752 moveto +285 -752 lineto +stroke +newpath +280 -752 moveto +275 -752 lineto +stroke +newpath +270 -752 moveto +265 -752 lineto +stroke +newpath +260 -752 moveto +255 -752 lineto +stroke +newpath +250 -752 moveto +245 -752 lineto +stroke +newpath +240 -752 moveto +235 -752 lineto +stroke +newpath +230 -752 moveto +225 -752 lineto +stroke +newpath +220 -752 moveto +215 -752 lineto +stroke +newpath +210 -752 moveto +205 -752 lineto +stroke +newpath +200 -752 moveto +195 -752 lineto +stroke +newpath +190 -752 moveto +185 -752 lineto +stroke +newpath +180 -752 moveto +175 -752 lineto +stroke +newpath +170 -752 moveto +165 -752 lineto +stroke +newpath +160 -752 moveto +155 -752 lineto +stroke +newpath +150 -752 moveto +145 -752 lineto +stroke +newpath +140 -752 moveto +135 -752 lineto +stroke +newpath +130 -752 moveto +125 -752 lineto +stroke +newpath +120 -752 moveto +115 -752 lineto +stroke +newpath +110 -752 moveto +105 -752 lineto +stroke +newpath +100 -752 moveto +95 -752 lineto +stroke +newpath +90 -752 moveto +85 -752 lineto +stroke +newpath +80 -752 moveto +75 -752 lineto +stroke +newpath +70 -752 moveto +65 -752 lineto +stroke +newpath +77 -745 moveto +65 -752 lineto +stroke +newpath +77 -759 moveto +65 -752 lineto +stroke +414 -768 moveto +( : okayVerificationResult) show +newpath +829 -392 moveto +856 -392 lineto +856 -408 lineto +840 -408 lineto +829 -392 lineto +stroke +newpath +830 -393 moveto +842 -399 lineto +830 -406 lineto +closepath +eofill +newpath +830 -393 moveto +842 -399 lineto +830 -406 lineto +closepath +stroke +791 -388 moveto +( : do_some_verifying_work) show +1.0 1.0 1.0 setrgbcolor +newpath +892 -712 moveto +38 0 rlineto +0 -19 rlineto +-38 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +892 -712 moveto +38 0 rlineto +0 -19 rlineto +-38 0 rlineto +closepath +stroke +isolatin1encoding /_TimesRoman /TimesRoman RE +/_TimesRoman findfont +10 scalefont setfont +0.0 0.0 0.0 setrgbcolor +893 -728 moveto +(Pass One) show +0.0 0.0 0.0 setrgbcolor +newpath +904 -608 moveto +920 -712 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +660 -656 moveto +38 0 rlineto +0 -19 rlineto +-38 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +660 -656 moveto +38 0 rlineto +0 -19 rlineto +-38 0 rlineto +closepath +stroke +0.0 0.0 0.0 setrgbcolor +661 -672 moveto +(Pass One) show +0.0 0.0 0.0 setrgbcolor +newpath +688 -624 moveto +688 -664 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +677 -752 moveto +41 0 rlineto +0 -19 rlineto +-41 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +677 -752 moveto +41 0 rlineto +0 -19 rlineto +-41 0 rlineto +closepath +stroke +0.0 0.0 0.0 setrgbcolor +678 -768 moveto +(Pass Two) show +0.0 0.0 0.0 setrgbcolor +newpath +720 -760 moveto +760 -728 lineto +stroke +1.0 1.0 1.0 setrgbcolor +newpath +755 -224 moveto +115 0 rlineto +0 -34 rlineto +-115 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +755 -224 moveto +115 0 rlineto +0 -34 rlineto +-115 0 rlineto +closepath +stroke +0.0 0.0 0.0 setrgbcolor +762 -240 moveto +(Single Pass2Verifier with) show +756 -255 moveto +(respect to the class to verify.) show +0.0 0.0 0.0 setrgbcolor +newpath +816 -304 moveto +816 -256 lineto +stroke +1.0 1.0 1.0 setrgbcolor +%newpath +%960 -336 moveto +%-1 0 rlineto +%0 -39 rlineto +%1 0 rlineto +%closepath +%eofill +%0.0 0.0 0.0 setrgbcolor +%newpath +%960 -336 moveto +%-1 0 rlineto +%0 -39 rlineto +%1 0 rlineto +%closepath +%stroke +0.0 0.0 0.0 setrgbcolor +0.0 0.0 0.0 setrgbcolor +newpath +984 -424 moveto +984 -464 lineto +stroke +newpath +984 -424 moveto +984 -456 lineto +stroke +newpath +984 -432 moveto +984 -464 lineto +stroke +isolatin1encoding /_Helvetica /Helvetica RE +/_Helvetica findfont +9 scalefont setfont +73 -68 moveto +( : getName\(\)) show +156 -128 moveto +( : name) show +104 -148 moveto +( : getVerifier\(name\)) show +396 -188 moveto +( : create_if_not_cached) show +238 -248 moveto +( : verifier_responsible_for_name) show +173 -268 moveto +( : doPass2\(\)) show +607 -308 moveto +( : create_if_not_cached) show +647 -348 moveto +( : verify\(\)) show +737 -448 moveto +( : doPass1\(\)) show +650 -468 moveto +( : create_if_not_cached) show +690 -508 moveto +( : verify\(\)) show +960 -548 moveto +( : do_some_verifying_work) show +873 -608 moveto +( : okay) show +652 -628 moveto +( : okay) show +791 -668 moveto +( : do_some_verifying_work) show +747 -728 moveto +( : okay) show +414 -768 moveto +( : okayVerificationResult) show +791 -388 moveto +( : do_some_verifying_work) show +1.0 1.0 1.0 setrgbcolor +newpath +913 -392 moveto +115 0 rlineto +0 -34 rlineto +-115 0 rlineto +closepath +eofill +0.0 0.0 0.0 setrgbcolor +newpath +913 -392 moveto +115 0 rlineto +0 -34 rlineto +-115 0 rlineto +closepath +stroke +isolatin1encoding /_TimesRoman /TimesRoman RE +/_TimesRoman findfont +10 scalefont setfont +0.0 0.0 0.0 setrgbcolor +920 -408 moveto +(Single Pass1Verifier with) show +914 -423 moveto +(respect to the class to verify.) show +showpage +%%Trailer diff --git a/docs/verifier/VennDiag.eps b/docs/verifier/VennDiag.eps new file mode 100644 index 0000000000000000000000000000000000000000..9bf549a28122a96265407cbf32dce472b7c35e20 GIT binary patch literal 132738 zcmX?l;qoy#1_lNec18vzc1DJT{|s>O|G%nYK(MZ3N`6wRu92RBf@?sqo35dr5iggj zs#AVxUP@+Ox>J6Im4bnSfr6=tfr7b_0Z7idC^fMpzsO3#v8be2K~2FYwWK7qs8}Jm zJTt9C!KEm%9Hh!6Ke;qFHLoO~C_gzkwWQd}QOzgb7-SZ*Y;b8oK~83B3U*blc`45M zxgb-DL7JRW(=+p+Dv^yVElw>;$xJTMhge}`V4wivDioBK@Nz-Kl0aH{x%5k1719!O zic=L*Qq%N{$AkUWeRpRHh`kXTfdSjo!;a!b57j1O|Sey)CQ zK0<4Db$qr$VsS}+QK~{genBnBlltD(@!sfyyj=Qu`gy741&J_6_~}EvlA)iRlV6;Q zknyOl1zB92T9TYwnVp=UlV7Azo{?IVS`D&-m#Z4&CAd_ziGra*QGQO2f^oI6LS|k{ zYK1~#3Mf`mE0Qx5ic6CeQc4RH3>0!oK>8I7YBSRmjG=mJdAW*G3sMtH6pB+ziqexH zmVvAR`J^^8Ej6b&RX^UjIuRT}1^ER?wiqa+7S=+wC+4LnB<7{?as?zS?7Gw-erGhcYi%>U# zBLiwKFBd4vi&FDSz&?blM>aUQvX`aQ$Q? z!$64$lo~)dISu42uoFsLtBXsD^0QNGt1}YwQgTvLi;D7#c)6e{9~v79sTG+ewbjWL zprlfrUYuB#3NpN;s1#hLfXpsVEddz_)liG-5(VdMutTAWKziW?QY|P2fYTU~v%vOc zf)g{s#GHIshD}Z@POB~`sn#zxQUEyy6p{)B#mNfEX~hb~MhegXP=NYEzn}yW#I@DQ zX~ng?Tu{?N*+xG(t+=>4Ik6bxHHGBF3WemvN`>UabcLe)lEji!h2rGIoK&#!u+W7W z4vN9VVs!J7P0ueYLP+Z;`J-_23z8wlFfW(B8>n!KcUDNRsMbeG21 zwbj+B`CtYpAYcIm@(C}Oemn`L;4&kv8j-f$AW1hKSu7qZ7z`>nVQ4N-O{=Z01=Tuf`9+C2IS?rW1BLX|>f|(D zE|5x71BJ|#%rfN6R-2gy@mzQ{$j0QH%z|1_4ge(={dkCAYCc$)mkTZtR1Ha}pi)M` zP$9Jtl*J(C#Jhu2Cp`0m4Jyw4RGVZKFKUfEmkl$QZP`+O)M$OtN_`NSejD;;qh{%K&qDfqFit_om-j% zHLbKj0mK1S<;8_XB?`%9nIOIT#UKO0rh?i{V4g9ka_8l$1{ZVH5EWnvBLz_GrKF}o z^GGeI%mas|0@wr#aCC!>EhtU~`x@+@^wbhwF8!q9lA_GKbf|k$)AaN6k}^w*A<0WY zKR+!Ei3_&RKml5Xn1J05auxe)E1|f6eky@rsnZ-Rf9N?I7ls0 zfaw8Mfl$*y5dh+XT07u8SDlhs1`SV8y$33xAj!ismzN9N0Du?=iqiP<6a`2m#AlR1 zSzy^5P%RK&1g#IE4He>xD;0_}^T2d+ela-W;)^SIxgdfS3NXRE)N}DmFmYAAz~QhUU<#{IT^tz zt^_NCHj0apG8NbwNGBj3WG$Gf;F+rcG7V%1sAU8%IN?qSfH?)4%=EL1OAt;$I8XuA zg&;q{Tm`D1KsLho`k+um;vhS+4D5VxT940wvq2^#l@!DI`XKirOejx*%OHCwKB=TQ z8tl6=P(tVBGEgv30O^d+0Pz)!6ynRkEpJG3928~o845<=auhBU3#;SOGILTDK%NIR z#uHOAQY)Y#0&0h6<|d}6q6VIRQF>BAk%BQ&krkihtN<%_K$QTffeg_JZs96G60SbD z@e39Q2`GRXZxFK(T^I%Zq=E{C+~hJ|E?92@lwCo&s~W7fI<+D-xfWVy7$_Jj7(rXL zIjMQ+B^e5aAdmBMRhxiY$O<6M;P6B?%~(Mf)@Olg1}OtsYz)y=P+9_Z9Vi6SKn+Ml zVVqw8lBosz0-TogL7qpn{~&dzer0B%fUp{JbCb&yqN^dz z#QY*~N3^=Oy0#kZm1>YSuya8U0x@7seFZ~PP)P=kUQ=lANx{%e+06hh4C{!20tXz` zprQj*2Bwr2@NyZM7$~Gex?n~oppr-drXF1_$SSBxLsL*=80t(=VFh+7$XyCX3W%aH z1)59^QN_%`wKv#{u_>u(yj=Ru@Jt6P(xAyqzX&DcAdfW%Y<$;+U;kdt2oPU)y6 z0H_U{3hBy1>M^A8fokyR0H^?fNP+st5SD@^DA&WF4I7!dD)3kaxcaLEDI zQH|1hhDgIa3*jk%+zRR!n}PE$IA09GSFnyJvTYzWh*C&DD4-fF0`8_1 z@@kfz|SIp((b+P#Y8g zv%&;n2SS&jfdae`1jojj^ia zMDfA_W!L|FF)o0xXP!LaL(;^}(?Qj&FU?pcR+}9o_(!Flnhp z`k=Z8+;xpjE(5iVQcGY`3ZO=YKB%V%!iEZ(hM<}W-0e0%v@O7K z3>wme_BibRMaaI*^D`9NxFK?Zqvxu7mg%g-y(cgxQ!@rAVVLDdH+&`iJ; zAgBQV_8w?dr9=V5ErJ-JP@Iup4s%6PPD-?fQ+`g0riM#uZlI$>&P$2baL&(5NzK#L@JlQz$}fjVl|2o+d3oSI2X{mY13Pz@8i0rE$pIeO7o6(QYEkflc^KwDDH=rt4 zKQTEQoP$8Yf!sy_hm4sis51x-0R7^$YDhH>4l0ClUM_H(LIG4m!!w;iHDm}5Y>ElA z6#>>*oSImaoB>LHpoRhlhV}nS3!uYLpjHs5odIb$fGckh7o2d4lM;)o_0x)qp&b@b zGYA}Xpiw~mq`bsjUM{eu@T8WUotKO5jr6?4Tm?*L>F1=DDVTu5NFg~dMWGnf=`Knw zOi@TJtOm=0kbJ^RhA_1u`h9CWE~JNg1H<2Pe|xvSLtr1qCcD{1w2#Y^nfqpgu$sSOgNb3J{Te zXb%Gv=^(=)R)f^>azVlk)H5zjQ9xG+aWY6DYAm3s0|y2#7pNp~$t+4uF3B&d1ci$N zI1?t96)S)f2*`SfkHCHQ%rsE4OU%is)(15(@)C1XAq{M#p>G8ZP}mjgYiWXW6Er88 zfm+)NW{}WIPc6yJD@iRXOU!{-12Y_CIWHHg(V!RuB`Hu4f|3F_7?aELz(!T4W#*-T z?5nMY#0IE_MF{e8RfBrZ$*|alM6v=T8&@S)g9-@95GUAFPyqoQ_>9j@R)F+dAteMa z7rZeI>fD1ZS1 zUTU_2p^<)aBFIcbV~}Avsl~;ayj;eX`h}(WC8@=kdFeT+3YKOt=NXykCnXjs7#f-D z7Z)TZrz#j4S?DK~=H#T7C>R=9!kNYfP$n;zp|K&9tzc+ugkTyYm?j9ODS~N+V46dj zyj+GRrVyv)q^6Z97@C+tctx4%86d7XgqxC-1C_Uc3&51X9LdXNXlkIJng^bxGc+~S zPtAoe%?x0EGc$p<8FHTJ^$;{7FFf_A(2Rbj8p_!#Vs8oeoWNx6J zUzC!Tnwy!InU|_yXl|&VUYePclbV}f0&$$Vk$z5odS-HB4rs#3(A-!*qp~0aG^S%{ zZlYh5nx0u)l3J9SqF`ul3X6I}b2CWf8k(Ey7vz){=Vs=W7AqKhise~$bY$s#mS|h`5y&C3v+}ApKB%#7K4H|CBHmR!O+r3-w~QGERFRY!C8Zs%h1w9-w`Q$ z7+RX@J3?}Zp{1F=BRm@zTAJ%Sf^&kQrG>tutAe4WrM@#XPw;XX85rohLX0;uFw}Pi z8?RtwV5IMgWV(@ovA!$ZNFxIieNUJkQ+-dc9*|LH`kpA7%=JByG+F4omSiXx8CdH3 zK^$siXrS*8HOJ6U-ydddo{MQ4BWMPlP(y$U;96$qq~XL{MDt zav2#L=qIKs7#SPtCqpAc!N}N1KNak51tVi){Zy#w#wPly$fg^c>Ziht1Q}$ep9#}s zuAd3hWTBslqRCP}6Q)VQ$izTD6%-dHhWdG6hk^z+jP&!N=9n1k=R?ggG11RQHpj$N zKOd|^!N|l+KOf0RP|;hKnUV@J%0fRM8Wkp%`lV1)O%3!*p{AM|>X#y$YHFlkiZII5 zSicgikeAEI)I`4o5*4PV`js#>uu&jz^`!u=N%ey(bCdFO6!KCbd|1^7?#e)`S@2Q_ za9vgno5a<3^K?;2ErfI>L9NW%YDgy-)W-qwK^Rs+LTYociTbX2$@wXuadl810o=L< z6?-7nyj+m_OaU_64z=3|Jc?5dR*4t}D=mR`3CtAZK`YFR@D z#bF(S(gOG>o|!4w{b0@Dezy_0M-L%D%@&x90<5h7YQkmafve|QL=yqhB!Jb^#mObP z1+Y#6w95o(0DyGsgF0LV)euF+snEF*xL#0itXjV~F}Wlcrx9SqU~>|yAu2J<0nK`v zKv%VZntr*76|g=;PHHvCTcEKvP@5IhSk=$X%!5g%V@iV>pGDOmBf+a;6ymcDk(PWY zq~@hST$G-OtSG$%Ns)e0DyRzrX#<1S!IVSVI-oW#Tz^s$vi_tbB>iwpc)8&2(2vhH zKv}K=au;+t3pk|Xlaf&7(@T&Cl6krGD=HKq3wA0}pp2Y+C?gprk_%&0!Wh{wMs5*A zF~maODatR_dsFEH8l+sJ6J>^ zN+HHqLO7tFD?}e;<{}$i7#u9=W!0dNgXB9TP#h___oNmu4S1<-G1pM{6{OA(T2z68EIqvvEgOKk7}cOuo}8MQ11j-AgW-mt@p4d?KDDqqy$qxT zsi@FTFG@mLL}Q?klA%xpY9W>6D}d7nj02VdkEB3lA@kCp@XV-=2jw*I2olI;;4vcb zv>2=xl9Z$Xn&<|lGPoot`GK;B5qL-e6q6Yx3LpVvkN{|IrT{!E2eK0+3r@;l!bl+( zw8R54K?~Mm2+{&Ba}D&s!~Xgyh&d+(kS9Tt{-Cl3;(74!E;u?s9dWRsU?QVLAu$Ow z*ir$X|INwF%TLOxtp+bzODuxcFyKKkcoIm#6#)9V(EcyT13Bdi;M4#bZ3FQ$N_e?) zixfZ+2AVcT@h8+FU`K({T~G=*A)@$PADqu~ixfbrAmIf{tRS;M#)C3-MhQ4jz*dwN zD5T}&=NEx{u%J2#KA-@KGY~eYtp*tYO5E@Di7AD8wj#6GYxDQcp4ZMTcDXC(29Tx1#mWoMO+TJaHtm&sIR^ zc0g>fbQ+?X0F8(lnVN#UuAh?+5zi2c;)a0{}E0p#af_tuZ#Gqw*C1_F| zDi)AjZK4p6?8nOmUIPhAHZTmHIH|2RfloGqXGlTwlCW77Xmr$8LzF`DA}<%HYy>aq zGywSwUO<2Y0+j9Yld`J8#ZN{_H9Xuw;S8=Ib8|uEzac1yD^ozzhq<|+Lf;r9kPXiJ zpn5L@GQJEdl|W$)Hk+4AACk1IL3t%5LxHgQ3PxaKK>-W023#1JV#G+({ zG*F%gWouB)3(e{v8}&hUfU8Qd-TI)VAq7SG$)Lof03K&gF9XYf+8Lly6}(mqWughP zdoBb*0{Kwd657o09&JWwhCmw74hqOTIc%tkOl zH9IK%f@e0txiBZSIz6MdIz0s%uL_{Wx$s&5RForC+Th>?7gg|VQj}W2%Y{@|!NUYx z)PM>`&`McQ@&cO$H#r*=M4+XsPJbImL-7sx^=21f{(;N?mMEw@!wbwce*E2FzFf%sN zvrsU$u+TGxa!eIWEKKywk(8QR80r~8O))Vu&@+P>k8E=?FIN)GEr!M*3v+q73=J&x z%oHG8Ljyf?1!F_7Gc7E^ZZRY( z1qCcvyRoUIo(aq*kW1j!qPWD&5EQ7npy4BkOCSP<=7wOC%=9c2j10hPjLktYnG728 z06EXZ*Z`DT49vjM2jLi-fg%K^4itHo3dTktGmMQaK|yQ;F&*k02nXUESb_%8hDa&i z0F>g*Kt@2qIhU6U%(F1lGc;Am;pH+n)H78;rDsBvnAVFfPU}#_r@|?MWo+&6G3=K^5OiV$c z1(GrWWmR)SP`H95EWlx83Rei?n}Ur4hlM#fm4O@qa;AlzA;dtioCT-=H#C5F*$8H< zg%LyvI9e<~!ls~@v;Y+ph6Z4^Ioup@y#nTfJpE3n1HHaaAcc-JZ@^KX9+4y3=Kd<27+e+ib+s~4lV)>4MDjCE^7!%69^tS z$dJ^65+g#^6qI=oTw|CUK#^hy_BGf^V6FkEVuluspz7S%6yjcxB*OL3#A|2@cB7@9 zA;kA!uBowtp&`fwQ&7ko8iG;-mVuLLL7XT2xp`oRov4V-I0*GM(YUzMt8l=j|02DN! ziXRflMj#h}G=Y^Gg8goy05uzw7eSf~&Gg_BU>}>9g3L2S3Jpj>0tyCmP(utFJRonF z8iBI9A*dyxU164-^>2CVFO|ED9-rjKMXD2`DfPjg7#G z8Y1qGL(iGiMpse&oEh6IH!ly3|Yg=#d1`wwCVsGb1z zam-CYg@_r{vtT)}^T65=u7wr_CWas*!3sd`hj0<@Hvy*#4893C_n3f^gef@38Ja)> zAJmouvCTkkhxD01p#}DenS!B-38=4W3d#(ICSVE_5#Us20&1a|nksKRj3C022Vyb5emjh*c6Y$uA zp(&UR^%IC~3U1JV#4RB?*3cAEJc6?>$P?gv3$fVL5M2I1IFO1diI>aJ9Msb>F^AST z5FV%tX=o14qmcAt4laSgY>)%Z!Q&pFbOst80kr^4K^42XAvkg&4uo(_!C4ce3KG(0 z3WgxFKzR;QOqzot8|*QNOCUK6$_Bd_Y$2$ggm?fH?x21$sLcm5%>?XoQ<%BNpvE>> z3&?q(vI8V#1gh+e6%5Ud6u_kbM1g_{xL!6i2RjlJ8DLY4!C?;$LUV9e1u6q_DKra# z9RLnAuu1SBgr;(H&>$H&9e@%!m=Rag@OsV5d@7KP%eP_101hl7r+u7sL%ilfD;`k>w$S- zZ-RM{mK%8F3=#r{7LYz3cr+Jew}lxf@?nzTz5~RO77#Y5S_G?uaKSD$v;g;+OhAP_ zlx=DV%gzuvXu}6G77wbPL17BE8o~h^X$Eb3nu8?4!yTsJffz#z2nS&%IQv8F0DBI? zH&!sT0QFu$bsfkE@Mt@P12!M*dk7yiln!Yg8G=-TYamllHUKLGb4@HkDHvq8C8!Vr zDKiHZ?;sn%s=z#OWJ1FRRB*up6vPIr0*?%W3t&*tfGb8b1t=3V7z=HeTY$!O!LbF7 zJ8(Y;Bn|c+mx!{s9 zhnLI90Mexc^*z9BSg#7E4xJCqQV@;coB(!&kpZ|<2kEOD8G!o+;93YYj{)Vvdg~yy z77E}VI*4g%ipqv{*I{x9`yr;H^FhT4*g0SqAiM?U!sXd`x z%n;lF1o4bOV{PCxVgg!y4DKv~+TCDPkU)kG5*itTTI#SK3X})R&LC?b>Dd%&52)S& zCv=dtpgB@-C(XzZ)I2r;DKZ5Y@MfUG4Qdg5&=BlJkg*^`6hL|)1Ee75f&2i@5MWK9 z{vDVHato+I46eXo97GQVBw`8b--8DUp*(OHfm{yuyCu}&pv(8;?VI%s1u+D!(sy5+lCdPMuw0UJhTjjalwTshyw{3BT#^VW_2NjCdgbPaQh5g z9~v2fI;!9z6v_mJ4OEc@xIqfi51OL`*L_BYASR?}1F3>=!KEk2N^p)0Qm--7C@dc1f^Io4-^`p z4lbzVgt0-f0Vz6>XBj}XwuJ(y>j$0P24z=M1v4{HzX!`a1E|+ws$d8*3{+Wy3npVw zaskyRpzfck0)lI%2P*18X&x+V4q_o>!Q<#~t{JFuH3T=xL5j@`L0J+ZYov!{Fl6Zf z*byMLrl2|+!LtB$sEk3=4PZ&ounaX02S64XgW5MB zM;n@fZ30bffYT6&4{C`*#D6c>jfy!G57iM#Lx`XH!_3} z5TikCu=|Wb)f`j`IZ_d0CZBp!VKaT zuyRmdL5Xz>(8?-UU19;^AvqNs+3@6V0p>zS3cwu=Bk+VAsQX|Ha;_O@Lmnu6jX;$m z$hDTB3LVS?^*0Q_na2Q>m_S1epx_24Bunssx{;-Vp`|e>`+;_F6}mY~Uc2-naO z>`y~W1tSAcvma7@LR|t9)H4Cc6i60oAZYI;cwrrAkqgvlSZ!(vo(h80reN)<2~uZ5%m=fya9-31R56AGgdG%01v`|dPrb4C@euS3JxAn z?*l4h1S*$7iO0YQTI3mlSfDc5$N)6o2P!xqCV(<1xUd764blS6%?9B4FC%ci2fNJ( z)RX~R19B;>x`y}yl?U@h2B^;qQfvgCrUrS#4AeFPHIP7SXFw&RDcB803J^BfcXaIR2a!OfkAjgA zc-$8h2Br!y3&5p6SR;5jDNGXFGcp220jR?Q3N28}5~>cw1rMNsM;WMmeIIi#bD2Z z6~nmTNCS@qf!zT%4O}6CRw02x0Ne-ywHQDg(3m8I4R#lJLzZBMVR(03}wi9`FDbR0dqL8-dn785u#?pjjHQGSCbhDC|J(T#&QP6^tM{ zjUYBaBL{3Ym<`qis!WZ*TqE#m6C?22GbkIpZUUqXEM*8P5T@jw+egbkju2WbMO z0x$=x3*7Vt#SEmVhBSp?aR*Wk>d%16GsrS*P^krqCq#ro3T0?0g2o%5F$}7!^bElv z1zPJ3WrB)9P_GJPH^kGRx>O9(ti05%HLC4jVfjEupJEl^_? zY#+$=5PyJrf8d}sGByLH4N%Vz#6p+?YW^94x!`C9b3q{iu5CcI8^~sGTgVb>B)9<# zsTM)@f@@i@3qWZc>@rYe8&p>t8G}<3xZw zJ`)3IePje$uLCO94MAJ`LB%?#B?D0c;z6n%V{pm>H)tVDa5#cgLAYR>jEq6)6A~p5 z`ygzPG81q!2NFRhpgB<^3s9@x2*QS&W&*Mt5lIj(D3TyeZm{n_MuXdEuxJ8}Xu;wS z>;gy-L0kimDzFTAP8?(@s0sizm|<*KWSM{$WJ4kg5;CAh7RX9)uLeBBX=DuA-~bLB zuuX=Lr~JWWh1yo0R=RK2hPJ_E#Sr-xPuMV1kOwl{jlyeLD!~SURKj>kpdCVnpu!f^ssI^e2IiS7 z7@2{WwSp49f{__`0XUcqiW)QUY&Mu{1m3;`s^k=)Oi<|wRs;%ASmy#{8mPGq?Rvnt zAZLQupx_1%H$rU!C0j_*1sXpDWpI#YGjIV1>T8&R%49@e!wfXS4&j1)Xa-)w2Qov! z$P6@R3@MHvo&dAK?gQ5%U@mAwj4`O_08K7H0ss^o&}z*LJY5fNGk^mK!UZQsklR5; zIJiLqF&~tF!Bv78Xvqec2XX|ce-G(vfZPu50zx`uNTx$07QC|toc+Mof%7D+SOkxg zLQ6$6P(c8#n9RWK0SE`|Iq(25gl}XHY5Rg^G@xvFy#>ewpd4613FSgcN^{USHl$XAFk$5+m%h0*7%EuC<6JaTs2d>3HF#?t}1XTtg?}4`LgBp_%pMp~X*cTw< z!5)Xj6Da+F1;8Nz;vt*{Dn(Fvpl&O;69O790W~y1y+KQerJ#dJz{%E%Jr4{*wbGC@O z3n^BO4Z-uPkfIaB0Z$wmfy*{y@IDuq6sUU#(gWVPY6u!E0goeq_OTj5`z6MPpvgth zlpBZvEBL^okkB)P4v3nAT1TJ(P%~Y8bP_n5Zl3pCzK5>JE1&q(Fw8~RC|FMnJ_lA z@Pu-~r6-7O2pS?YQ2^NinqJcbH!?wHfhGd=Koa0+0GFM}Q35GEjUl5Vpx_0~A%gec zg3BFCQw0zQ)Nce=p~j%99%PjX0Dxue0muYUi^3SR zQx-gsWCR-`0NDg;27pQru!}%rr$!1;CTxfR$^``%C;@?74hmE=h)Y3THc%{q%mO#? z!Gp{oOW`tx(7H~~P{A0=h7J*cxJIBj1uyuA^1wp`AOk?I29EW8Y2vi@K zfSh0qN-P#o7P!|2RswG0fScpSMqsu9L`S04}_B-?-k9+G&Bz++xuHrQtH22L;+6adh1 z1P~Ln5gOD_1*rms8)#Sn6cnI<1vls*7C>4wAVrX<0cCthF=-5P9jJH!l>?y86DXp< zzC-EE7(+IP!;5c_HWUuLGXs)=bY?)C!Yvdaof*)EYjeodDA*O?t_`d+1Cj&>y&foG zfr?IWzXqxwTn&IVfn<;@1(|`)g}WZC7KMk1C~z(UPx*k#LeStas8bEu6KD+OnkyJX z2DCtH?96WAg0#yT!W>66TNy)~b_23{a3dW%Q z?_j^0C_qhyw%fh7t{p+xfMJ)Y7AOr0UB8a_ZmQf1Mxp7sG!Nv1Tr54s=q)f(FELE0OtZ@ zFx%Kb0d(F0s6>Hz0<`AaRKXa;1tnPUvSCntpR){%ZHpn7V&@Nms&)5`{ z2q5YqOi0ZLW)K!pg@h2Tk4PWU<@$|!hyOHREB~_+l|4F0QU-@Oo&+!VTc{3;C%(4LJ(#am<_G6AUktl#R-^) z$f2O&5m1o~X&4(rxS)0lDE6QWq`>2k#-`vgJaCl&Vq1cALAHcLx!^%$ur_e(1mYd2 zi6GmdOmI5}>`TzFHoO1;y9>qx6#?MWJ-`B>;05y#&IX^CfzAcbaey2E=_G;Xj1`PQ z8{EN7e=`MR@Zt}6bI}~qNd|RRjLpH*?4S%_ssQ7FN-K~%A#z}sfDH$0L*v4mi%>(s z69ORnK=WUacr=I9vXBD895Q7Bk%4#yRB{?anBc8*AgjS#xK-dVfbl><1Udr%+{OU6 zMa&^X51=e#Yz|&)15L&d4m6uUIiU8eF+>L>JAlmsGeH)E4iEu{nz;h#G!Kw3AUeQJ zdzevR4$Km;U%(l}7;F}p3C$}I0a#Ws2c;x%3Wd1>QXwAsnbJpn3snJ1DHcOlVdC?Fdi+mr9^C2ilndF4aMeJ17TS z!GM*4%Q&zTz+$ix53+UyR5C(XMxYI1#^xY3V1uDL3?bG)OFK(Y5er$<3bGi?MWk*^ z(Bg7*F1Y6nN{^P{NiN7_i?Jnmn{jKyr{)E!;%VQjY@c?!mcrhKA3$+^@ zyihjOWRMTQm7|FPSUIF*fEoqifI}4A@Q3h0PJn6wO?H4%GFS*|I#?ytR)`Zp_pHQAed)j0NPUqS zU;@c1;7MT+8(h4BlRT6M8|N`Ggsx$N)ZGxSAt=~$c)6fFa91XX z^&t|VwifuvDUe%0$6i5BodNMcV=tgm!vx|8NN6I3Gc<7+f=d)5@UdK=fCM=XJYopq zfa)jknhqETnmWM4X`qD(kiZ8wjx7{GHi5=;KtTm{D2xko5O_%*XstcyR1;9&4XOsT zN(pqHmmz39Hz$Y@4tN~H z#1K-`fO4vdA-G!t8^XLAAP<8g5@fVF zxR3;AXi)DR9KxXJhRl9~#==030TrLnaSV_{E#TuAP#(CJ1SteniQusdsM%mPC=kGP zI%KJXi4nL*0Un8mvSDKx5H4(~1Dpp+Szt}jBm_Ex4H6HKXa)_E!1$o72IYfd7t96O z2MT|1FoALbxWEDh1!xs3w5-bDql4pj8(%I^cGLIb zEjWm~;VuL>-9hF<)I)5Am<47-YiZCC51@WCq+|r`f`afsnH0hU4In{zph64WJ~0L7 zLP-0>6g=DpW`lzdI)e{#9H^dywgW*s!eIV{u)&E7G^_$joFLWU${v!iOu+>?sJ>S) zF$GU}K-z#{7lB4V!D$A}gUynefPI3>gXKa{6#!NYSuG1P65N?J2b&ICA!}j^s#igQ z19b#Ab3phekUd_Ih60QO4Qogt44#KIF$L=ZMV12CI7mdnTnj1!L8S}S0bsRIHrOms zX<-UltqrO>Km!>j5T3aL=-60Dy9mUFwUEK*Hkz10R;q%!)h1@(%m(V#Lz$o=w3 zJO$-~(;&$0klGF8C`cfIy1ZcjgLVvn2Z2G30M#9k7M&TmbOkrNz{(&212P>_!XR%N zGy)y9qX61l0xoTgOdz&`I`LSx3__|&Gw@(MXwkb7s9H5M0_7h=&{|Vd1v4X14Pyw( zzAz4GIlB>f9uFo7K2FdKVi@SCTNBVR!{GIgV6_lwV{r2ybj%z`8ge2P%v=Z$tQdSW zj2T405aJ#a@aP+u12Pz_0<0FaB;Cvy%m-~^0l6Eb0NO1AH7U%%tK{I;fKm@wC%BA< zNrGJpG6&Q+FoN>H6j&{oWd<&74Iy)SW}sbVrV21)Av~~JaG3*_2Cw-Cg$t<51!}%1 zK!O^q6g*oC;X|SkbX*)LXpBI$HYhfX!Rgb?1au%4$bZJ*^>-M2uzIjOL_Lh3#LERb z8O;|JkZ%{AYT}RTy1C!sw+U}PeTu20iD_giXw20WDJfW@H`dRp$cY@Q{ljtL*$@| z93~CfB5Dk-hs{8g0>}mv1qd6g54?^H!Us78P6Fj8aEk@1)(AY> z4C8>CMj#F>p1`FTNC0$dDP->eIC8-?Ehsj?jaQHYV{q;?Rse;L87P(^$AW-@6~qI@ zIix@WDFBIp#x|g-0K^6Lut1&zvBA{}Xk9Xl19m=mlQt+h8!8wYn<#*M0%qwMDu9wT zq%Z}AmJujrgChg%YRD)B$RQwc(6k)bIB=YTTGF7U8sOv!Ub+f03S75?&dURP1msYV zr%k}KS72*FN3?nk zkp>E&oDF3`Qaso&0|ii=f`&*T zgt!rW^bN>^mY}2zO5ZRJXt^AyhKKXP@eK_ba0w6b8Mw5EnrIGAUM32lBMrf^3fjv9 z=YXOJ(mn&7qX)7O9I>F}1v(N8l#D=1z_AG4O$U!f$eHwzlx=8Yp#Y6Du&p31P(JvO zH&~Jbo$&@va?m&g^)$d`CnyX-eu2dzn2i*V5I%U=9CQ+(r2;&%K!J&fN6?7?a4FEC z8Sr?7aKL3D*omMuOwf1*dk(?}xdS}E0*@|Gtq$dY^?{25WAK1K%q8H7Hy8&Vm!K2j zKz;)yKFCxf$U4wbd*De{P)dfB5l~4`S5W~LT9CK|1uBRIwiq-N0V+34V23iAflr!8 zi8g3Vf)7FisfA=m2p3$=g1l-D-qiu}6Ql@&@xj#`Q~@MZA%g47wY4<#@M?PW7F1|Mnx z)(GJvTm&`CZrVgRjn1K^L+<%aO1am> zfl?97|6o2?IoNoFZfK1UH2^d$jW7?K6T#}i+R?biAjM!=uxT(Z*maQB8?5;NIyGAX z5~g7F;Dm}W4a`Nj4WSq6Ht^|epmYdcwgB4AYzQiTzz2sJg31@rWIkw5H26{p5C;?i z7U0oLP#A!==YUEKP@Wl?G`VEw6 zV19y^g%;oh3(6KCe}ERQfXXsZ_CyLJXiW?A2*{tHD24IC4NlMjY@li$R0=4-tO0Yt z?gKT_L7@d&9tiHRnHhs8NkALq%|Rg!G8C*5JcI{oR)McW0L8rpXx0i;G(d8$1?apH z2p8;C2p8N-g&fxe@;0azwE&N~LwO*xEuoD_NV~)mJWLPrE@Vuhg7kkBgMegImiysrch8& zLkxvTLCR!U=s{8y#FvOv1x}c-R0WAXP^K_Mib_baY-9*3l|aoo&?;Q;K}jHOpbnxT zXq7LB1L}Aig4>-?9%u!tA?UPGC?9ml5U556jfKM4;O0A&18Kd3jvoTmk)Xyq=%gf2 zCWI`)0-FaKT7x7z(6K{MNzl$Ta1esx0MgEf%YuRrwEWl*ssP-82g!n3L!e?8WC=JC zfjD40V7b5od{~q@sLTQF@-qbW*g-acSAc>X4YnTCng?3|?jwT|321J}5L_fcTIg^a z!0mOg70~_zSO9d|6gYE%yOD4nI4Hr2;f)t?4FXdDX~e^M;M`(l2nt{@6RZcIgE$_kLO5ULW?@HRGt9B&0~6ob%ioysq z768@&KI9w516NF<7+06o) z1Oeqz$XZI!j1-6m$}eCO!3{d_gaT;$F+vKIFhDsUG}r=hA-r=5QfLOwzL1e*7#}n$ zXk-NH%77CH%y=*d z2Fk=>W#Dz2Fgeh;56JJJ#S=#0CW#TKfeTg$_6L{?3vOsR0#X4g4?xo%pfH96IB3H@ zG)zH*=-}22B*z$myS6Yn(2N?$O3>zRFdG`$;DsEZdIz+Q6`XQF#jqK8D=j#MfC3)u zFz_@XOcLTINberBix#XDwiE-jtr?uh!2+PP4@y3usDgwzcwh(=SKx33PZdIWV2dDQ zDxfwSXp1m7dx6RU&>3G)4m|K7e9%fVh*C(nfcyxa?u3Ll*icX%2H}ES2Py!d^Egna zfkPau65=&59~uLY>!jdKBO@3eG|L9=go0`^&{flVprRDoG6L=H1tl#I7rF};a0WF~bFT4TOSdjiZ$TbF_kOEgopy&ZNNx&v4fJ_0GFQ8lt+SClP55xw$6trXj znxdeA01ZVb57aaObvr>vK^TKmxiP2>14_0~F1TF;G8f#q1Z}T}cmwPNupRIL9nc&E zXh8!gb%Lrp@P1*WU_+P>izo2pw;5#C8f+&-0N!8+ZOR3C4pRVJPl1C1G`0(>RzPXf z7+hi*gHtGEZ!kFhLxLOJvWD`Fz-Q`%916 zFd@c4>@otc;WY+30z7dAb250s6l9n&cx5WolVBG^JPGkNWXTpx6J&uoG$g84p67U$OJN+g~5mQ7NPnPsR5!N9I>E~1zC#1K~f3nv?EM{@Ij3lm`;SXAh&~i ztS~8XWP*n3L5Tr0NCskqG8(w(1N#JQ9;~;P1ilL%w2cQ*2$?|3V^9>rk|}5(4=7)O z${dg>pc5m(^(9CGyxId4t)K-oP!1?_f)zsfpd<-)BxsTzQ6iauxsW2r6f}YcDPl}P z1q_%8HUm7l0g7-?;RHH39W#7Fdj6Hp}HUy0>nfx8{|g| zuw`H_$Wfpa1ga=OY-rd*Z3g#VK}iUb4xt`IjyIT}An^v{fg5fh<3PiEppXUm3C0Gy zz!==tfk=Ut(ZON{e2AYJG|nI#NDIpdypb7HJb)?^3&;Q;B-X(OLMswTB7wRCl765Z zh?z;eTt*h)V%H4RH2_UW!}#D`=iqpOPMtuv_!@yOLRByWOM}?pAOg3?K|E053@(ts zu7H#!p!H0U-k$}y97dG;7NDteP^AwU@iVf3bX~w}mOxg6Ml!%r50$qBo$iK3J*dA8 zQf~oH=^(Fw8V(kamN95~f&$D}U|&KiMbI`#P6gKOb4zR z;T%}i2onHj8PMWm@Zw2OF$hi>#!xOeV8PPhAVD}BrXQ9!KzvYx0-X;JDVSR^1wd&A zY6Zvygp0symO#}4BUVP&QO+FuFk z1b~OVU>wji5mX(hl7~7HBnv9*P`SpSvu{B5Lk)#QEu?}6g&b%DBdCf8u|Z}+mV!Vc z67C0xCWr@(L1hJ4C4>)7JRl1|3sGPJ1PwFLt+kK|JW##@ZG!~)1+>Qv5;x#}4rq%Z z)cfGI9-y6wpezNI1g-M`IR~_V4#EailpqIy>T3mfqr%w87}B7DwmD#Ya4Q3}brNI; zs6z^}9y~?|Dmx%u9gq_sLobFPS@5a}&=4@lDIhO_J2p@&L2U~#ALM7yXb4CFs4f91 z2DQIHEew!>VEaHEutx9#5m3nq@&_nRK%HmMo;IW~f(+Nd91d%4!1>_z2FNGiIvCWf zfLQ};bAX%xiA>OzK=Aq^aLoYm6ga`b0}mQnAU-syJ5X4dLVBlA)!_AGNV-9L*1+v8Ncn(d7tD6(h&8A$4zeDy7|9H@Z4uN4 z0T+Vi3dW|O0X=AY)EK-R3S-m9FXro!4KoZ(gx_LYow$D;X+c1DX0Jk zH$uU7K~fCZ4EPWLD3O3~0|2KHkRw280Guem3ZZ2ga#HUp@5wQ zEr39LP{@H+J%FbNU>uNfV1*FlKwN0tm_Zhfz>@})k4Ot<;OY+)6VT{~34n|O1%Vl8 zRTfAd6n19d<^YHX+I9n4N(F7sfLj^HFahx560l}?@6s4%E~t=$bHJCNfm{xi1-lch z5y{;!uYhka0mT5M7zdrx1F;?Ea%i@JS6yZh0feDQCZHM$o=XEo2-Hw`-2gQLoex$I zb|=J07$3Ct$PAp@z?Ond1askan;CTe15|2*4S@0yj)tg5=fh@FK^qT^!E<|{Qy$Dg z=Z8UOQjN_G!Q$Xcs~{ZMEGlSkC8+2DEvEu+v;?UH&7y)NK*bKYPYQ|$h=GXY0WuSf z2Xi@8DJmE2ZLq(<-hgpI;bIOde?hSi3Kb9s$y`vq2ufAZm^26TVVaFWieVg>N#GEN znFNm>h(1A__3j;oz{rKF|(D zNC!{>!~_*R;Nl8uC8!<)^FbcA04D&jv0%lJMurJ^rzqG4P@x6V2)ft{R1$*t&~O0N z(V(D!1PZ8ZhgNb>hr=s57#~u}fi49D`(%PL%VwZ6jX;y3;A`q( z7J#M94ZvMFBLf9<1F(eIgBEUsQYDlNuAIy)!OdJK z8#dq$<$@A`3CR7R*fCZBT`Q~rVSfa1mwJkDbR(u2lDRVcZ^EJdvNLGQ%PINxVGvJ&DQI5_< z%HWW(X>j7s<>dn3aSKvy0=jI<9Grl_mqnQ?fZPJf+~7NL!Ep)751@-PLA41qm%+HO zJPK8e#)al@uyye44dua=g1Qh0kAWQuw-u@uYAKipjhq~qFTk1E6uj65!UUNI3T>z_ zz+AA$Aw``zI2D0B4<5?|Uljx4nS%%6EWx|@p=?n5CYhHD$^-5D2CD}-*Hi&w5`+y> z1R7g~@XSHILQpm~QGhaG20rlmLT=3$p99}M{EVzdTzCi|*cq~j6 zz_-DI*x(T*C=cvBkS6eMXLAEn1*jG{16EN(#bK60^`miN4hF5KMEC~8gZLC=6T;t+ zG-YT2z6=MV0MvLh0Ph(D@l6yALDyB7Lh~4mV+r2;0$MExk%il22~K3N8WqZeIT5NG zl*k|j5?lb9(?EPnP~4;Q5hj3LifjT@0P1hJ38;KfnnPF#8juBNHju}`g%+qr0&zg& zt?()pCV-Ut3=P0>3yWI+p|AY4NO(3BRaE(R@b1am-n1-w28A_s91*ana`bgm_6YziR@ju%4%&=P7$ z%z@aTwihVWz;=VD-e7WIKS9a^Lx=}KZCG$E2jj!S2pS-8`;&ON3_+(mD42ncX#wRk z7#B3yYX~`E0pv+j1w+u02B63Xt#|-A!VtV03nmHbzJVNMq+n@a?}8HtPDKxKpe0&An$_0%N*<+&?qbDoKjFQLk4{j!3Pa5kR{Oa zz!fBW2^w;n1goLfO<|ApwtU;6lmcu zQVSonO9zzdz##-S7__Cy%mOrph{Odqkio`+iXm{X8nmy;L;>PLNMR0^2lvImI|N}| zSV02bEQQFHP%dbZBG@7j1JqYD29^DwGz&fm9#m<7g5AUbQv8{MH;sTi2Odi`G=_|C zL1xFm{sUz*P}G7}bc2rV2lwef;Q-E*pxbdl>xMwPoD3B}2^h3V0JO{>%mJx`jK6?R zWd*nDLHkn7z><~-T+So$KtTsu!~<)Kf-Qoz zqaZz1kZMTl5ZuZHaY3a$D89f!2ue=i00#vvs4osK(lU6tKzwjegU$kgqyW&-BcNs( zC}hBTpjq7*ytfBbVnAXR6c8{e$ONq=XciO{Uf^m6yaWa0R%6Kc5#+35a0G#x;^5s_ zkTpf10uz!5Adv|wY{32ir%zDn21;p=9BKl}u%MC>TFIF}5;QzxK|2qYkhn83N6v(x z8^=-j;6@(2K!>arf^k81n;L_z>V#zuQ}7rO$SEMVLzkC;f*7>52h=wNNkJyG3{4?E zgUXtKTRfn^G6!$;0T*?kooArnfk}dwcY-v6Ll2al4M9^nh#Uf1f&)tVpyJCAw8qBL zTmeeMG6z@`mNQHty?ju%04*E>r9@CxFa)_A+W!aHZwkJe9-1#e-2;#vpiNUCw}4#= z%Nd}hLg20?DBqca#)H5c3P9?>RXrrtLyZS>z~+Ny+dwe}s?ouhnu4l#Gf<#`2Z$}f z3*f*iA$-sTC)frE7m^*o8bQetlp9PTqj``47qCunSqYT}>xBrwBGV9}9TXj)AOme^ z1Vt8T*DNBAp;Zw$3}M*;%mF8Ba9n^+j0c4uXt)8M6HFm(NH8B17NGEhXaNN`C^188 zQc&Q6n+Kp zf>$9~fYud*!vr$?4dxp{W~D4as=)J8;LHeB1?m8UCni9uEWsJX1ZFi(JY6N56p1$e^(G|-_OaF|fyD{f6`-I3g*uo6YMw$js6y5h zS;E5{$_EEIcoZ9?5tQvf+o2%&A5!RAfLc;;N$`#vNN_{uK0u{2xWtEYA%SfHY1~XuO5u^u{JV85!z~(_XU`K)0J3_diOBq2GAXpD*uM{}rfj82?q`)N?=vGEE zaAOGM2C#V$2SG~-sFN+hV-uj8p24LyNG-@6piB=cTp%8SXErDoRC7YLz=IuZ1C$4K zvLPr*Kym@N90N5SK)dNco&j|-AdZGgfkyy9jt15H;8+2h2#pp{dIt4m!5)HCq+l*6 zOrRAh_=ZkQK4@byC2Fr7gk50f+-?n}Z5#&?T49#vY{0X$h)_!O@~% zXbCAfAqVV0Indn{P&tHs;4K+wTqNtk(lF~mT>+RC;A#uP0s9`@|A6of!7&7Cvw~`L zC2Zbvn`a!o#qVvFIJZPH40Gy{mkp({Z z54_Y5q!_fs&A?a>R!x9Q6VUyQ(8d5*8oUr6?;LC{5%pxO~U&}tS5*G2GV|yU2OmOA{8w*;-4~_mf zWB?Wb1raz87#Vpe=Hsb}eY=1hkP3RK9@N zps)w6fCE>RrV2)e;JG_clz}#+fjOXVD0o=~R1#zXxSIen6VyTg6-NE4WK5mIe4WL)I10WqzpWOZwBE*uBtZ!>49V$Gq`C`KByIJ4$%U20EesQjkOB&B5(Q$Xo{0I0y&gVnYQp2-h4mx@!j2 z17;&!4B>+J7DFa@pe}$q80JH}eU{+H2UH*Ek}+gH;lu5MC`adlV+N!fDh=wgfresD zK`B7bPyy;~GjJ&b@(;vRa4832 zc)$^92sHOw``37Vn zm<{m`oC|XT_!uS_2WDOpFBjx4dT7SB1oxaE`5H7u01gO41yElBl9a*Y1(u+)9vWKU z8XbH-BDf=92G7(GE+W3cdeFG=91SrMoS`itg`kBg$W~B;0OTo1FoALlG&jRsZKwca zLGv_}3%3X~2?#1|Fa%&}6{-P^YX-~Upm{kXa4 z14S{Yq%bsqjEJD~kz56yQ^MdwGdXB#4OCd6abcMp>PRHrpoSVaK|yQ>4FO|tVVN9i zI5?Su*sx3vH5H!8p?p|KCGm2B4hsY|%fP$rK*JJ7pmGv4!vi`a(Fm01K*Pf@4rr4G zsLuwzT?&*{jT8()I?O?R6PQ_G4p>1281g%*EXKs)VP}|B3l*K@q5+((%20$D` z1v9X7VCI22kQx^*1ZpNjoT~@VCt#O=PSymSdI+lN;I0L6Kyx;*gB?MU2vP*@*Mmb9 zoIF8iC4$l`Od9NbGl)hA8*Uu zp!fo14Nx~8%15LGh@j01uCXmP~+Vw7^4K=HMQwA?Uai1xURDiVi3jT%Ln8 z8bex-;FZXra~(m+6I5ry*x=L!)(9~ao>rj-q4D890^Mc>DJa1ngm7VL4mmU+^^76- zTwzdC2@*agmI@FK$ch?M{o|P zh5&iT6tcq*dabSrctyFH8EA$TZAS%IkePx8@gcr6 zg^a|RfCqEUKoXE>1MPZI00k4MtN@M3KodRWWMfE124z%J&fg5O`hJ&$!p(!Y+AUZ%SxKSVu)Dn;^%y!7~cH~k8 z=2%#%VhUc#0ZvQ`P**_96^N7IMHiF{E+U|sK-mD4I3Tt_cwh%ZI~I_kHHh;eWeb!I zcQ)9qF#907KmtYK1S z;G7Jy3?v0APeG0Vjah?Y0pb<#QZg{t5OkY2q(%armkb`_G6QYV23ri~!pkf(NP7}$ zF{l-Yuo%RHS_~fXhZ+v@rZB0aUYsoB?WLn1R<2!g(Mg!Rnx)1mZ*E$kG_J5E)Y1fNZq{_xHi&jUjlU z8mNg4n&O3WU>P6E1!aFjh#qkCfyTs9iazl412ifv%^*n_G;*&1N*AypeR#_aq8e&D zlFOh$1amAXT|pfSs#?Hh4Ad2nk^;toyB6##a83qEfi!`VK4^ah#1;q-6h@%V9JGl8 zl7_Tw!DS}Iao}PEtPmmvt||?ox}YwBm*!3JKV1LA`E4~{CZ^$@M-e9#U?P^f?=Nx;boloLQ4Xf6fa7lUZALrg{#xgckQ zd;!q}YR#FMK}U_DQV9FN4Idac2{dyAF2O2YC=Q4h2q4 zpo1yR!CeT@8~{kl9DM2zXu1Lv$&m46knM)hu`+NQ7nD#9L3e9_yaSr%gIZ(;atYiL z@X;S&z2GhvsQiJ%E7YCHi43%d1l+X&Zwv&TCj~0JL8X`x=vW4@FBL!soq^m4jTMjs zK~V)-YY8esK~vSB56^QR4Zh=(C;DgJM-3*$4 z0cAr&1&|a-6R27Noi&AMib6^f$mKz>WDW5IxE==`J_br;aEF843bPO1Gy`3!1~C)t zENFFX0zNquoZi6>2XhhG)C4rSfK)L;_^{rH5$GTYNG=9lr3Sjm7+TdBfez6E$$;u0 zP@tQFMzTSH4!SHJ()fZj>x@8a)F4R_TsJ`b(;!LEsabj!FcU$$dQeORH%h^I#K;sp z`3J4XARJh41S$viAt+0jg0_SrGCYI}s>8se_(o7ZxMDE^t#$)N2l%uwP;v%yz}^8b zECO?lAm>+rG8yQ+EYL<~GgyxVDu=KfRBRww4(1|R4&g&BH-Lr;C@fJd2VEWwif~Y) z1r!C)`V*9Bz|jS_9THn`+mYfLn$^Hp{vhTGpvPb#qTdu$1|UU0gbymCp`isia39jN zH-gN#fg>3d5@2sYdEhVuj{!jijLaazSde)GI1e^H4i^BO)CRut0TgN=4#ZU0`~l2P zFdxJL1(YdhnJLIGppgVnx&zw|_6mFs0VECTrhpr$kU0d95J(5u4WP^b^)2W`JBU9) z@eTDEByJ!%(-agDu#5?+=@mc;0Cc1wlmj*q>!1zdpnuFS7 zppbwn0iP)k%0y5jF!&(#V0o}}L6e}cQ^bwTAV;EuZ2=nz;UkQI4mLnr=tj`N2e5ju zkr4GTKG>Cz<0wHRf}n1-kr|W^ZvKH1DY)n`RxkpkPbeD{yyl?kY*0D`Nr4As%|OjR z=oUH92_4{)2*!uB49vhu1KczLGr>(iP=Wx@t%8;WKx_d;IV4#?q5w1;1(t=B7@*db z5y%0c3=D7jnM1-0(eyJ1jmd$vDu7gjt69)BbfA?9pkX|aH_X7R-a*X_n8zV?6^sY1 zvq6h5z%B+g&%hxM@(H*vZ3HgJK`9q>Q5V>3c*74=U4q;QZumiNYk>5nLGA%HGC;q#PytwyGJ?7k#s?)aOK?LBECLETOOQW7UISe)2tFSj zyt3KI63m8ALc#c;91ijjX!;WpmXNdrF377Ohd?DQ6yO|in;5DREDLIrg0`+h_g#WgAIM-(g9Vf$Ou)_t zcgR4|2-XQcKLH$&M$mpeXx|Qu4Oy^c30~4B#M8MbpQZRuE6_B$aJTvgPGFUNG0OW13FQ9yI(+Z{;RD(b?gL;YJ>KCjR zydo1K3DyhYgE9%23o!~5I||02MTwxw6=Vz|x*^S8c-VppE6^5ySWtr2hk*PC@;azI z1P3Lgf`bMUsHOv@9ME;);I0fP(Lp$%vJO%Zf>Qu^vINw{Hv`8ds54@$X9{r+$b3-g z4^C7lu7Raca8CxDX2I?QbKx1q*Z?##0?S5V9w-%n%6MbM&qJ5FMmK9LA?!7DgikX)LQ`sEW~tJ(F5jzodphXu(M!X(5Vri1y_)~1YX2# zYzS@`g5p8J*Z?#Y0P0K`fy{?+piO_69C(Ntq{#^EY(vNjE=c1UJZl6xgb~yi1(l-; zAPy)b%|VucjzR>5G3XQsP+EcPqC^ClA!uL;9%LXMxb*|_2ABgb+d+na#@>xVyICNs z$3TrtXox{KP?|zyL1PafuY!iOLGB0T32-w9Y&)cp2vB7N#hGtOA)1Dh*8Gc0qU` zV+J*`w3-dZfj2bZ0-!1i z92%ga801Ds6o4+t059f(jBCS`BeFB-rd3e60Bvc26o5)ESW^Sehv#^xTaiovuiHnm z5^{bgI6Z@11m(lp8!#im4Gz$el_1~2IpCxZ8z2YCf&`FDMk7cZfrY?f1>qyP2i&qn zv@VSyha7`K6B;HE9bgk+5daZ_b$38#WrFNQgaXt|cql>nph5=hMk7(<;4ss5lGxRGFQL8?DvMCAuE53TY8^(-KM z0gsS?&NKywDrnHx*c3ea4oYFBphHn11wMFR2*@>1S+HwB869*PH`L__E+UOUm17FP z3Jz0neu7Wo!JLAm0b1$8O9iOo5iWq3fWZfs31Bxt6@cOxWIm`MGlOs-X2W}Q#!$17 z^B-ubK5|$=`S6ku6yBgx3+5pxA5>_8iw)3%6p%bPr-P1b1y%asF;ldng4AF+hg%?{8SkiW;XF`s0*(BD5(H@A5_Fg=D5qH<%!f3u zKtTsm1d@OR2Bd)n4GN?t7R&=6-+`({7$01rfKMBI8r-J^*=qqZ6+AqlU<}^d3+jJ@j#vftdqArS!Mm}H zEkR@O#(I|Ev<>Ef=4*^CAuIbJJ!oT?+2DQv$bQhWc~EeG1&l2rD=r`!A#9L|V1-~V zJabusmU6;!7Kj5n8X3|S0P#RqV<>=(1LY~OPvBOAie|`!jy@AfKW%=Ro5- zpd<&k1RQ`MznekrfsD1ooMZwzgbJ|&!5Fa~9g+f(ErW!#i2>+L1xWq?T~H62)t6h~J?5o{T~Jo}d^0fVRMct3&WEU(j*3;C&D|yj;Pc6HLG- zIGI73{GjneNE^?@6kNeT6j_1~*8p`@4ZsE&ftF^1wrRm;CW3jnR8>QY5;JpBi+H(; zGxEy|64O%^Qu9)HxfmHZ85o%7)iW@#GfZM+U|?WiWnf_7VRE!E)B>@%nHUZ*9AIW( zV31>AVPIfjVdMqVOpHueRkAZMFo>}@{4jV0(#Ofb!0?L+WDWzv|Ns9Pl)!p*89}x& zF#KU+011OkWnf^?Wn=`)vN19;9AjW$P+?AFczwm0Y?nB@Cx(@;8 zBtOWWUHJanY0>w$PnEwrbMoZd(aAA?@89q` zH0%0-LlM^k4oh79aro}#tw+{fYC1aUV%)K=3+~6Kp0_)(<($LGXJ>s*>6}eE-FBw& z%;(d~&z79Ne2(KZ>xB)ctS{!AD!F8RYW-!|Q?IXxoKn9gdn)O=^{Lr6a!y^mx#1M^ zZI09WcS=r&-u-;KD|k1 z&m^vjJ&(B7^L*CzH_z|iFn*zWE9FJ@?fMrR?zFu4a<}A#*?s>PB@e`2tb2Is`Qt}f z&jp|ScxL&u>cKF$zyE#{-&wLc$T zU*Y)JdHK%={Yy7LJiIXf!|d|`9}>>Jd2evG^gYj+*Y7@`@_YCE?d^4O827m7#1pZ6Yie#UiJ?di-zj8Ci%U3>KY;F5>i4(2|Xc+lv6 z)4|Vo+YfHKv+!Wy?MnysZb=+^eWU!)%Ij|qWnHU2tb0}Q$k)qvkDR=;;^_K|O~+PU z$T+_JeC&xE=VDIsoJ%_ua<=mHhBH&o$er1FcERaK=S)uvUbuJ4<>Ks9RhP0(ZMy7x z>h%?uQ!3YdPsLo%IyLFW>{CZ?-aGZ>mg#BPI}1)b-jzEOdvC*;g8Lz7s~+&2t9*Fl zT;8MY=R+Q^yrB1F{l%Y8PF~vj^y}s5XS!EkJ!@AmaXrUwVkF1gQgw)^(C1()q(jFRLDAzB=WQ+cnuk-PiXVynLhN zpv*1jgQ>UG53akTbnxq4HX!X6*_6w;NA>czgKNf_D#2+rQ^Jd-lD2DDRsvG|3Ul@j4TY~mg6A(pi&z`L+k;S z35aq!^X;+A@o!gLa(X-IqR`vc3m4uroUeP+a!&fqq_ZntuRNpv`poGWuYR8T{nGGM z(96=3b6*@iare2>38Cjb$L*gnA5VJPd93z{%(01&_aB}AsNm@GhlWR2Jzze%;{MYk zi|<`OGW+iBBNOj@JkoYs>S*=P8VD-J#+oM&PviYOvE0-RHT#b1ge(loZ*z3kmQg1XqDY&`kN%gI#Pugz( zelqdS|0lEWetfd{-sLAN?k|0^>OtC*yiDlEf0mB z3qHL2Jn_NY7fbI4y}Wzx_e-vOGhXT5Re$YrXT|HF+tP2sZq>aBym{e`%MGEode@!a z3S5hS`}#`eTTtA9;sit^rvXSE3@K|tB&-f*0jCaPN?xIB{criM>A!t_#q#aR%ldEE zT@rpf=i=ixlP)ZJGvR#To9XA?zg}^+?)AYl|6V;mUHD4;^tG3Pr}SS=KUwqQ<%xaI zJx+Xmw&l3$Go9mJPq!S)c;a!a?(v(W{g37yo%Jx`=z<4EM;G1~IXeFy`_WlL+Q{`IBDa<1tf&$)X1c-fWQ6aAOvPwu*O=j7*$OHSEb zEIB>xg8!NS=MBzQo|ibsc%J?ItaHE4JDvM<;rH3M7mu8MeQD0w*Oyz*zP?g>_Vv}) zv#+nsIs5YZk+V;3{62f+Yc^ z^Y1NrvhaS{lLZefp3Hjq>T&<0zQ=Wsl^$n2S@p>4snR3WXMGR9K70FM-*fv1H7{E4 z>%ZK8@7l}vcMD&M-u?GV?@rxo``hndyWI+W<8pJ+8><_S-)LMHe#;9D{}Y$>-yXT# z|MvBjnQw)!^}jW_UijAUhU43~oB!UV-CF%7^|t$)s5_TlyWS0Wt$J_&tKat&ULCz( z`m*`Kz89ts|2)6-Q2%++qsV7}9#uW9cs%LJv&TywyF6L{Xv&i<53fAg@_^~-`uhq` zm*3NWI_IwT)BZamPaAH(eo}O6{gafN2~Waq{Cn(uz5TJ%wcn3yuEsxdxU%(O=;i+p zDlgeQSbwqL{+A20?s;C=eRuu&D|b}RKfAs9+~-?P=YHLMarV!R`DcG$Pdoeln%&ut zS5?oxz9M_}>1EZk_b=I&BSp6k9cj3| z`bhtsr7-)B0y<$=@DEe|IhUH|CA(It=Lj!k-U>sZy(l;e@l{v6kT zzVO7K=fNlUy%0QA`ttTEg;yI-?|(J%Ou*}!vzJ~Mo^yXwaDMfhiVOeVbX;_NyXaEk z+r!ZC2jvS;Zo`)AK;rZ$c?GXtd#QKj+{=K=J6={^n*4J4#e|o4FDSf}x^VeL-1({( ztImnN_;+^s^Qg1B&-b5M^-TAS+_R;pJD;kbe)DA0DfcHHr{+9qj^5&v~4G-~Gw&dvBi9-s^n&<*wYbT;c5wtuFiWYcy-xJ!z=S%hF$J_ z*?cMG<(7*^FW+AH{6hD_@)srN16~|D_x8EuxrXNzXE~nVKhyrq|IFW~Cr@WR^*w$5 z$*ohmPYO@9JQg{1?a{%LijOK!W<0b#x%vU$$(Q$Eo=~}e=|t?klP9L!J#*s3ojWJ~ z-2Q#S@V3Uu)LY3XXWm?Q^85{sQ|vbiPdQ$HajN-R=IIMpKcCjV+Hz*n75TF)R}P$Q zxtw{9|FZb`6_-w(_rBD0;rB)Ri#smsmGWYJpEBg1eukN^a z;i~2R=4%`7J6@N3z<#6n!TB5e9?ZP?^Fit@wTFhcT_66r9s2OZors51?)pEBy=U=I z<-W+nm-nAMSp8tdgN%oX50oD9J-GI0!~K@W?)P<{T)lVxN#wn(rI-{n@HJ z9M3uLG(1nZ{r35~TLCY=-dz5|^ycRmxi^en&cB}W^31i)mmi_wZ*XPaOPwqKUJ71i zd-eV5zn3?zJ%73R`k|NYH~LJbee3^=Tep_Hm~h+vh5em#&!621dft5Z>@%@@ z_RkjHTk%x!KIhZv_Yf=d^~= zSNC6Vy>j$I<>i|f)?fN@;rT_?i;5THE+$-9d~wnFuNPmQ3%O)^ZvUl@vlf>hp4oHR z>5Si%)u&%ykv%=_>Wovq*W^zLUf*=`?)9*ft8Z|gtiE~Xgzv4nC**I}o%nP+=fsga znJ1>*Ejf{Tult12{S7Dn-hX)F=mYta9S<{4xcvmF8005zjWxO*X8FgwV~k; z$``nD9Y~y(CGRTm*hDY`=hZ#WlCErfcHr`|XNs4*o^@PGefIgH*|U_3|DN8uu;*#m zh2p0P=TAI&cP`^e^Erkmht4WImOrcYX!aS!hiPY~Kd?N*`QZ2I=l5Qn4!ZZ~^q#v< zPpjPhc)I5f$C)p;wa&!c4m)$?R___TTNlpExG8^@^=A3m@*CIBe!gyZuKfDybFA0p z&d<3v?YzyksTXEkmA)8!b;(7EtA>}JUfF+X&y|47bFMtP+h~MLS8H$1xLSM5=Gxa=bFO9FX1#v(cKLOiJD;!5xl?}Q%N^F6 z&Ua_rY`d#>Ywz77w_e_jxy^m=%Wb85J$Ll(soXWZx96_ry`Xy%_nzOob(izO+Pl*q zRNPg3_~nk)qrf`~kH6fW{CL7`h9{eEop`eMX7N*tn|q$FyYcU-{0*~bUDs2eeZ1E7 zEcn{8XB)0=dj<+eP@GY>1dU<@jUcUN*mU*TvvpV7o^f97d6s&m?b)%*<F$+C0zAHO)u{Mh5H(4*sL_#RF^)BYg+ z%-{Q3XYSvVJmYsy=*;fBqG#0ZDx8^k$NbFS+Yx6nZa1H~d~4?!hg-kTti9=RR`%xn zvy*Q8Ju7e{>D=_|XU?f#w>^L0+NSf#*VbM*cvb&m-PLUuU9LJ@61sZ&(yJ?xmrq}L zetF9k&Z~>BXkXiMW#_fiSKP0^x^nrt(AAh5E>|DlsJoha^WfFQTglh1-8yj1{kHn` zjkl*?7rP^HqvXz{8>jEc-jukz_GZ*whg%cwUcR;aZpQ69cmLl0e0SoVe|OdHGTz&L z_t#y&doSXcl+MsskatCS#s0ssnX3! zPiNn_^pyVw=d;@D=FgsAi+<*Nt^CzUupXHT!)ob&YJt+!7$-Bx-cac9%x@;f$!?zZY=()!nVPHr@PVetb>jcEz=sw?wZ^y_tWN`=-X#h8u6Le7wHnO8oV{E2ppJ zUNOBEc7^k*^Od`o!>+hr&b_kvQr{J&OFOPiy7=Y_`$dhbwHNZQR-G5U_WxYPwXSoI zuSuN?zrOM8wd?+8V{Uvq^Y+HlGtD;>&&b@;JhS!IpVI-iZ=QaA`_Sq3J6lgH-Q9G0 z@7>*}!|t6q{r(>J8PNxpXO=(6KV$On+Zm@vbI#g6PB^FdZy!3p@|Nv|Pd86p2)UVl@!So;O9?lQUE;pceEHmU*DEWpb6uT#{oK`+ z*C$*%cis0o_YI~S2{+c9zudC8BXyhkuFCCmcZF|H zz4z)?`27{P1Rn(4I`rW2&9sNfH~&1maHH{&_Ki=E%CGxB-g<4y_*XO*;o!;|}w_l$>cq{n=|E<>-%5Jt?{BlF% zQrC^^m&|YUU;cC5`^t^$TvyLtKXLWO^_FXYuG?HUzw!Ed*Ny%gUv6mJEW5ekCjTvs zTL*8o-DG{y{=Iw`@Zp1ti zzH#zV%5~+(E3TzIz7KW3!IcS*wXVE-%z5?S5S{>U#O*1=qJ;x_|xGMY9`T7gyX^ zdBNzW_=T%CXP%#U%k+Hg?GNX4?wmUJ@6P^n=kH!PH|O5(b1C=j&Z|6_dH&V|&I`>C zdoRd7Qn|S7(fNzgk2@|^KMuHj=&?G~{h)Zk73&~z>gOEDST!h>NrBS_H-q`nJD<#t zwtbum#_Kwalvd$0_1K+HQ;)TMTnfe@Hfs2w zy9Jw{ahZXxmlpAC1&(KF2HE3rpR|wv|7dyq$w#l_w?4)kfAlfy_|K2!$Gtw4AJ6%u zcRc5l>G5TsY>)5y&dGE48c z*C(^%qMy8u|N9t!T=-Mkaj#DxF_0W6EfA9?bii&Cp}N~Z_9McUjX?lx4;ur>ec0TL zs-AXf$^q;SIfnPgdp`X?-t&p=#HLRYC-#5RI~)J{}>5Cf@dPoIvf zfBJj;?MKcN_dZITxcSlO#G8+HC)7XbolyUzaf0)c*onU%IZkkVVmhJpiRXmPC#4e} zpUh9heR4c8>66)sv!66i-1{VP;>joW6Zb#;K7Qd7$WD+yiHVoN;7&yRA>sq%eoE#@ z$RF*2m0mK(4}b7Ge)|LCNv*f%PYAsQ@j#seCfo7FK*T4^5@$pUVb@o;^mi>C(eKF zI`Q%gNDs(dZ0;r$N^A_&uo+wYQo9U?m3=%Xv%g54kv&=YMdjq?FFGfWf3ZAy?u*ySLtjEpF8Gpia>19-lefNDp8WVl<>a$3 z;wMjj0huLxGW?6`Nu@8AC%M1)omBV|dNTYANDL&0D^x+^$aMp(>;vhcrrRL)FhOUI z5M>|8ec0TLsveQos2vxu98`7k<(I0HlRtNXF^K*03&;)FQX)tkIm`%|L60;AbHluo zFTcz?Ir;NCFb1(n_XjRB=;@C`CxgBmI;s8T9~gt!K_tfqE;H!i4>fQpD9E6A>g5;3 zQ@me@#qbmegY*&~ zf7G^<9^qsM4kuZL=2M@)|)92DtuRb@Qdj5I(sZXDm zo#Owp=~V8QWv5PmnSScUmx-r7d;#feK6Um>>8Yb%vQMr5l5#5dOZF+PFQunMzBHfW z`7-g8$d}otw7x7lmHTD(sr6qbo;vykq#mRXl#hwY-%4ON@>AqSkX?xIWMhy6o5{-n zato<$M>UIfWh1Pgc%G{StB7^Gn3(mtQ=<*zJq+X_+s^ zr+L39otFI~bK3KZ4A>sx!)_qmN00D_wU1Vu&i=CPG|!hKr$2tadiwe2=cnI){(742 z3)7kKFHC1DzwA6+`Q^ar&0kKOKK|wE>2qJ6oj&yC!|4TI7|tyC^6~VoFIP{0{Bq#* zvoD)ZpZo$cYv<|kF9%O6eYtv?`^&4-3ST~+4*voY1IdB%6ftE1tbGL1Lru4V>_>zx zqJ0E%A2v6ms;6CEfc3fZ&b<5*2gb+01fF^F#qrGhFM4O5d{I1e{EOI`+%F1e1i$E> z`TE)6%6yb{bkD5)qJAd# zi|!fiFQ#Wizc`=a{St6S>`TNMy)SWRa=(D=1o@Mgcu@i8Spf!+9!lH^vJW{PVC6K( zJ*2uH)hyb@5iGxKK0EQt^0QaI%s%__OV8PlU&_xu|B`w3%$K;cxnDBR3V$g-`{i@( z**BlN&%XRT`|O9$%g-`>*?iXJ%i^;xU*?>Z`OQRpDX>M zb1v%(NDW9WvFXeL><1~j`2plEMBK13NPz9S&Yk%(?cBjHbIvXPGU;5~m)djXUoy@meTh3~@+I@!ug|6DUVm;m_w4h$b3Z?? zI%o1_);W_eQ_hKfX*$RCrR1FGm%MZOUn@RE2&Hu9K+^sKD&%OTA za_-}o;&X4lq@TO{1!O14pTv|CgTbAM_@sS&96UGk%f)juzuY*t|I4d$XTJP7ckm0- z`Ndy;oNN2?_+0sybLW!2964w5<@~u{pKqUg{rT0oXP;Tl|NJa)-sB6zd6O@{&WU|_ zagOWDt#hJZuAI~Va_^kymoMi+zi^(<{vv#S{uhq(x4!&7_xj7Lb05FlJoo0y*>iWl zfb1kSK0tZ~%ANFx4_KdB=)%h{LKk?yFoW^C&q5bK_{?XS3$s3(T$udXP3-3NhfH8=T>Tgh9N2opg z+2g|G&k+Kz3l-hfqtqd<}DN&V`p>axP5%Tm!}+ zHfs2wy9L`gA}%w~^@2w6sXZPFYp+eXko{%e1)eW!E`0pF_rmkf=P$hfeD?y|msc0U zzr4Co`DNjS$}cM}Z2q$0!tpPAFP!^w?!uujH!dvr^5VjRFE=mT`m*=J$1f``Jo_^H z!pScnvldw0_mZq+d%ds!WPl@0=W;H zn^D!%E=|Ge#D5oNe&M?~^NZ-k{a@5Cp7~;V@!%Kxi;KUQUTpiKaIyRg_r;_yj2BJ5 z@Lc@$S>odB&*~SSeRjO~^Rw?olP|UxO}?046#Jrjk?V{2MbR&U7xlkLU-bN9cro;g z+r{iJ0T<_galLr!i^av)U(_#t{33So%@?kVcfWw_1o;z`pFuPtd?5ZsPPc=>o#^fZ z~KzcytVskg4P(sYhflMLSW^D0GtFmwJnc{D!&xm}xdFJQWS7+XT{d4B~SFW>s z-^93ttY=qz6Fs})8{64O-(H>h`R(eN zci&E&x%dra*10qB->#j}`u6IK@VEbGG`_K&jsFG`1IghERggGx9)p#AAU)J{8^j*W zc{z~#u(=skJ)|rErCMso1uO??pZ)kv`|Rwm)?f@`fBXh=1Gbb15=Ra*LT1n-O~KsY zfA-@y|Fg5d#)C14O}amDnL$r~6rYXyR(#g@+j=ktv7<j z`t2|nfBSmrEC^rudgtt-uV2p2{`%$Yfv?Zb9{T#|?4z%b&VKv)1&l?%Jvs}*Aic!L zAGPhIM>xUeFGx`>MuJoJFx$WPa&Yk@RQV-Gx%E!dyZ`iyXNDsMg1lffMPsF?&$StJ09n~z_ zm5s2uv+{Evzm=c+_O%_1CBIEQ_x;}?(^ay`g-!Srg@wfEzBHv2S|NPo^{{7b(=f8hlcAoFs=JWC2HlJ_& zmUX`ITjBZL-zv|a|JHW?+PCTFPkmc>e#N(q=U04NbpFw|w(~!~6`p_hE#>^hZy>X> z&c}Z%ICWo&wpdO@aEg6^WVSSKmX?2rSs>%9Y0_C?c#aKZ}-ms{rd6z=dVl` z{(a@YApMR1!tAf|U<}e*`i=9#wr`9V&V2iP{>ry!=TCpTcYf=)8|O>E-8*mm?b&(R zZ(q)feq+2K_l@&{**E?RrQbkyg8WHLyujw=Kzb-~C&)hJc!15zf!sr?`%%rJT^zyk zOU1>R-*PVA`Id0;reE&`F;+1d87fZkCU6lT2bMentr;A^{23-93HR0lq zuQ?aFzExcG`Id3f=Ud`Mm2UwTMZP&-l>KIX(fFIm#o}+47q@(Kym;oD>&468{4QSo zmT>XNw~UK3zk%!l`Hh%(87Q|Q;*fUX4r_DwT>SX0=i=? zcKf2}x6>CDz8$&f`fck)*KY?ea(=sg@ypk57a6}XUNZZ}cxm@Hwo6yO@qqEiZ+|X+ z{syw+m7TKLW2(!y`%myUn)ymaMT^re&E5-+X( z7JjMko71KGZ@QPVzA0a_`KEV?>6_K1&tE++z5AMciSb+hC7W;Ymu$X8UXuIfeo5$? zB~2rOHaRn>;(Cf zm~vt;xDyedw2zOrOAEhEyR`7z+)Ky5t-o~T+rdjGza77{`rF=1ecx7Gs{c0mQr5T5 zOE%x8Tw?mR;L_)>>o2|gdh!zEx2uMP34NP?N%q^!OXlAeUkd!T z^HS`$bC-(0-MF;;+u2Kxz8$#q`P=$SKflep^yS;6OHaRn>?AclKzatso%DzgSfBaz z<&WQ9Ul#p#2aLaceSH~(uYCP_dC^ziE3?1yUODjf|K&qpe_wv|_4nm(UwN;9u;{nn zmq8e$m-sTD+IG?-oM82o;+2oz6t8^yY6!+4Hmbitc^#ql^jF0zv%eaGF^GNoE3xSh zVFt(!O#2XiM$F48UIE#GX&*u@?eaCuy{=b2esjGt`)eo|gV?CygYFh=!jmeE+)b3g5TGSK_}NzS8)u>Pq9c#w)wObzV9D zZQ7M<-EN8c4-P$Ctkm@@Z0k% z3%|X)a{L>^)hpkGuAclRadq`KzN>xTeqO2n_T);|w_8_izCFFd^zGx7&tDm?zWXY5 zmGPU}Rhw^OS8cutT$TIw?~2g34_9Qry}Dxl?aP(GZ(LVnzsX-M{-$|#`8T<%kG=_B z{rrvL>d$ZQuYCFT_{!67AUi?+1m$NCjR+rzf05JeU~nh8`)H9jVEewju6_Kbd+pm- zyKCRR24CCxE&bZJuNBw6eeJon^V`B}-@b0T_U-G`YahS0T>JPf|C;W%=xZOpf%JgF zk(ltLhCTEM4_KLZ?Apg~$F6<*dJT+0Y}7IjtDZ?U1$E*aNYJ>!}X8f3c%R^TlRI;Z!y!@=G)#Ia^F_p5c)RvhU~ZLH_X2+ zyb<_q`;FLdXKoaKyLMywx6?NsecN~A^S8A(etw&C zPjqfx{U&qs<2Ux3zrKCC@$}oP8ymm9yV3dW=Z(T|;x`k%Dc_9wrhU`roAyofZ^}2N zzKPxx{lf++_S_ebell_08Si9By9u<_5+eznR_q z{0(G>_RWRg6mFjU#&h%fxBoXzefxc5#W$v#z2Eq6Hh+`5S^G`58r(M_3F*{`&vU$FDqhzkZdt%lu90uI)FayC1&^fwBKL?z@WLe%}%K_TrApw}*H9zC8r% zCq7JQVJ|(x3zmmd@BaQ4c=y9Mr@NQGncXe@=5$y5Tj1SaU&HTy`kH$8{nyI7zrJ?d z75_HnZt1s{c`0kHyAbqKKuYL=^d-j{}-R{I1Nm)Vm_z zitoyNtG#RVt>td%x7xegzZKs-`wgTXqz{xAh$#bMc^IUJTsMO3LWCzG4};u7s@qY` zqFq{s<+HhWmA`MiyYt)jyKdh$-o5g5?%m9)Xn^%HKii zKyD)@OvyDH5r(w$w-dO3D$j8CUcmRW_r86-3&s-PUfuis_1C=*U-|C;{wjT6@|)WI zl5aBiFMi{@|MnZl{V(5s-TVIS)x9_0?%q59?Jihv!1ufNO1?e5XY}pOJ(+Jm?}>b4 zzc2fZ|GvpL(fcLe`0sD~#(w|Ix1aZ}etUE8%(o}^wtNGr2iZ$(IKtYFAU%}26=WwO zd=Y6B-spOiC2t(TW8&+6@Ht@eKDx6b?G-)7wZ^>yC;PhZ#EfB*Hs z{a;_t-xvRO`+n)S^Y<@*J8=KQw_W#td;{rQbN}kMdH2tLn{t2qx8D1u-=^F*`Zn*r z%(pf7MZWF2FZ1oleWP!u@0Wf%a)0}`UH8v^1E~k;1H~;dc^p=5g7lEa-+tbg{Kod+?^m7&-@Zyc`21Dt z!N0HO52U}DKlt|59gOdOvwdLsUH?JQcgY7)-~ZqD`2OiW|97Sb{NFhr=zW)bVEJ9^ zfx&m<2a?~-ADsWD_2A7nkR8$wu6*NraQYkDgRS2f9+ZA#ePH~J?}6+$nFpfZG#|)) zGkjq7&HO>>H^T?pzG*%<^9`gPqz@Dx#Ka?PtN^5k9{vHj3tOCn+)b)KQO%-VoWshB z=m#IaML+oVH5-g2zg0f?{Q2mzuAmm#%SPkjr5UFM(!jN|UhK+?i zcyRUGg$EzM?SAm<+p-5wzs-BF@!O&Yo!{0zDExN%LBhA|4`ROEf8g`&{sZ%G*B?lI zJNZEL+s+3H-!?sP{kHgl>$mj}IKQ2I@a5~12aMm|KQR0D{=x2VUmjff_6v+ZetY%c z^EZ$k_a7|$cICmzZwDS+|F-$Tsc-8atoXL=LGQQ251PMSdQkiA{)3`#AT=PhptvU` zeS`GS!w(>LA>sxx76x)RF@8hUPrJB`0*Rx!*5^Zz*z8`*27<4EgydT>izK7 z*RY48-%=j_`da$%Y5+AC5i+ULNE$ZRN zZ(d;R_s#X8$~V)8qTf^=s(zDu82C*NY!C7IVj$gzh(FqeKWvQc{iB)R9zVMC?fRpS z-%dRG`EB!~_urO2y7Fz-qtb6nA4z}P{OHfuosYhJJ^tw9*Xxgde0}_g>)ZQBKHu&? z^7(e-k;=E@k3_!hdL;X8(<9?=s~;7A+wf@1w;hkpeB1Nr^0%Xpu711z=*YMGk7j-Y z*#k;j#N?TQavMFu9oDuodi?vF+~W`5_#a>X#{9VS8~8sJ>_g~!} z|N0vGSo~Y!!{Z;{K>CaxU;U=?`0O{S$J@UNKQ8?y_1Nf}%43;t zMvq0lIXss6=JnXWiJ&ynO>#^21z9+)pl%HsP z(|QvB4I~DV1Nn`Zc!A9gfb>w)Z6N!R;|X>KH^_b1+>ELo5f>owf!$kv`|^pGi!UF0 zDRcSMmypY6zJT~3SK$g>(8xYWo)TAs^kdsw4$JKvr#>J1b~5<*lau+!@186>e(q%D z@y#c*kIz5pa(u$cW5?#7^flIbjO|pzv9Bi^ zj=ebPd+gjv>tnl4x*uD6GVR!+lgEy&J*j?t*GaeI2T%GRKX)?d_}!D<$6uZ_KmPsX z=VKr{LGHrlZ^C=i2ZPHI=@F5>Xtkf(;8fvpgHzJS9KaaFE?i^cr>ddi~r?wwk zcxu+M$)~0sYd*E$Sk0-U$8t{{Jyvh6$>!*YC(8CW9`w@HmVP}OJ-|HpowdUfpmsXfPjooYJ9cDneO=;^#;`llO@S)bl>O#Aen zW2&d;9TPr1=@{$jxySyW+J21l^u=THr|%v!IsN&V-D&mX#;22xtDP=BE_%B1ILqmh z<3CQN9tYV8@+UFzHyGSWkGux+XWD7S<7KB6kJp}dKi+>jP>G~e-# z)BleZpMG^L^Yor$C8wK?HJmO!)_*$h*viw5$F`o{b8PA9J;&yso_DPG^rU0;r{^B4 zJiYx`^XZGnW}d!#Y~AV4$99}nKfd;K((whSi;wr8t~_3My5xA#>D1#OJ4uZXke-2Z zCq3c=HiwXXw(xlN*{R23z_{#K_E``PIaYdB=~(Ys>0`ZT9gfwXbvjmkHtAUP*|KB3 zU_A9$^;r-G=_S6*r?#E+2q)N@)~#m?k8eF&cI+q^gV?D42IX~xTJK|9&q^OV3dSI| z_c3DAAHocf9hmkZ{ES%ty7er`4ov$HYH3%_!rc4zY~k^@XQhw*1!E8!HGI(Bf?S6Y zG6P*NsP#$hHVv%*qI&N0G2?SnjyayIJQj2=|5(bo@?%Bk`i|9~yML_y9OH4bbBxDr z&siULJ?DQs=v>(G>DK9XwZj?83Rc zW3SFN9{YA~&#`Cc_8fa~Zr-tT=O!IHaBl9gUFWtRJ96&gv0LZv9(#Z8^Rb`j)Q`VA zmvsE$x#Hs&&Q%`Yf3D>C=5wjXL3V=t3ChnP8WBDa|01W`!Qf7G_t7G6z}m_8FN7XH zf1&XBt_xMimtIIcKKFv*@r4&SkFUA#@z|*g4~|{CaOc>)3ulhqyRiM(wF|S3owzXd z*p3Sej%~bf^w^>cM~|($(0S~{g_2{BFEk!|cVXMHcNeUWf4&fM{3jR}9)EeE_&CUp zdlwXsU%udZeE)^;7j=oK<+}s4Pv|>Tu_Gl5euyU{XqU7=Pi!sNeFBTs6xmbDJ{9^ub&5I$& zxhp;r`*G z(6 z*mdl~#WTkqTs(8^=EWt)PF$RFZ1=^v$2MQwd~D6d&&M`iG&#QWqR;WY7lV% z#zmLo4=zd`2iZevxP$c2({1z&cZo}%kEvana?IpXSM<*6&$;LsruN9OEZsszVzkT%S(aBZ(qtie)Uqx z@#B}uk8i(}b9~h$|KqE`dM_Mbb?M8o4VN|@+j(iuv16B}9J_L9?y)C3S@ zm&}e|x#V;F*rm|pJ1_Yh-+0LctR7@9$gjkdMXn?xjf}q*X7D%voGf#TYI_u*zU`H$4*?n zf9%9%#^d#u8IQMJwm#l>+5hwa<87Doj#pj| zJPtCe{__1}?Uz>_n|*omu??439NT{R{xOgkNRHU>gq1HKJ=Am?$bLlFBFYz#`>?qg zRXy$E0@gnFxKeoB0*w8SYhTGZE`6o^ILDQo#<*#XC7m}QhQA5O7Su6 zD|N>#uFO7WaYg!=2N;9&em!P%#q7A&6`$iWS3-{SU-3T9e#P`SZo_&n-THP_pYsJTOuGJm0yf*uo%eAk^EU)<=*SVH+T#~O!eB_W4hNiA2Yu8^_cE8)8new zypKy<3pvhp&F47NH8Ze!ki8(k5))6bG7zMPQn!Na#1>cN_yN@{+Qk)Y&wA0dtH+D3 zZ9ZOeZS(QAYpaiUUz>Ei?^@OI%xh)Gs;`wDn|96d_{M8x#}0$ptB-eHyK)?)2jos- z!kHTOAi|b*;Q>nzGj0?fZ@7_tyzGX>@v<9JkEMfg*|D-4AS`{X?FI;!9h-3jgr^>B zy8*&l$GdKL9iMT-=Qv0|v0+1PJLwTl8Vn2!D$GI*2W}J|KX60(*aa}2e(dgz>SOP2 z6dwD1qx2a2&E{i*H}@VByjggh5sc3t`*UOIv9~v-9=ma4`LPQ(ZXde<)=&JnA}#Et zM|i>75SBMTA9KGsn7vzz?;^`BX9a2 zPrDg*y!@uu@y44P$0y#@INo$K>3G`B%Hx4I^NzdR3_K1p%j@R-V?j4p9ZS18`B?SM z6~~%x-aiHs1IZDa{$OngkREEf4P-weY!Ph;ko&N?8C5;)^0){%?Q$?g-!43Ee!J|L z=k2m%DYqSu*WWHXHt}}ZvE18*$3b!+_YhOIkzyVqJZR@XSX$e5`}46Qx2GJtbi4A{ zI&+5g3EmsQv@xFN9j}W0USkA6o>* zAU5f9Y`E-0_!%+BHt7z?4ov$HYH1ffusZ+dox*3XIE+-MjNl!<(>_hk&k&bZLhfqtqbObBwqwjt` zmU(x|vGTi>$2#ujADeZz{Md@SeaE)my?<=$UB=@%cNvct-?ctoeb@hZ$K9~wGw*sG zUwl{N_~yGB$CunqI^J=&@_6yxyyIzi1CN8u%DH?0SjpX0$2#s#J~sF6iepRe-aiHs z1IdBPPEdG*Xmmd!r#Dzx57I+Tx1rjLDC>2= ze%~!W#(%Hq82`OF$9~*hdhG4pE63h~)u5(fd|^qh+3041@+c@gXtB!E4cx9$WY};p z@6eQkiHGVBS|2Jp$aE<0;I4y32a68YAGAC;<)HAv4F}l{o;fId@ZmwrgYOO&9sG1~ z*THuOnGQWXXnp9+!Nfx#{TmLt9h!a6`cTh7*+Y#7cOC3G7;$j+LCb>+4;miaa8U2y z(Sw!;uN;gxc>mz8gI5m99y)r^`q2J^&WAwyK>9&`#Fj=0ulR(Ok|0wk^##Zkh!|jF zfUWiixsqJpp_)m%)C}usMIUlJ7mrEpg2W@FJhMtIetJj zi*{)mmKWC@c09E3aO|N8htm%=A5J<{emLY%?qR7zxrfsZ)`Bs|p_apDho&5MIkfz+ z$)R!>%nJW zoObZ*VG!m%$a(~X(+-Ls0pZqztVcjt>JaAPYz~3+gW{N!G61B98g|knoM1ci z4js)twC-raq4`Ih4^2M$^x*uX?FZK#%{sW{Xwtz$N8=A(JDPRy>CyIsACEpg`1Gjr zp=(DI4qZ5!aR{XE&{5YzTaMZuT6I+Y(Bh*{53V}8=-`&4JqHgRZ8>=1XwSi0M;9G@ zc=YMPTSwIoT{voc2&5jQkJxa9)zu(92zQr(Vf7VXop>aoN_s>fOn zih*(3LDgd*>~c{5n9xD@W84Sbj~N`aJZ5yz^jOeA(_?7|-NCr^py@FX2I);Cxtyhz zoro}}eK>tNo_Ofa@#sUBj%yscbiDQ8VK7cRcn0`>_#OZ@NVEx3WDO%V|kMM%^=%=1| zd~orJmV+BlWF91r%?@xR@xa`EogKJM{AKH4t{?MTlZig

        S-TSdSj0hnj8!*^dZYM2{ZiK5TAARZqJ-4%-Qped_3;>{AO46`WddsOr@0 zL$#-x57nMZJJ<`x-G`b_9XJG119BHEAA@Mv=vD10>w~qYxDWP%F^Fw_5Lqq4?-0Kr z_lL-F1HwGSC>1U@Ak;$a28|Fwej~;u7{qVN<4JwRMw%rr$P^HJ*9YP=c%6u zkDPjV@X@IY2j87KbMV`#JqN#?T7K}|sjh<$PPHDqaB9NAlc%;G+;wW}!DFW?4?Z}R za`5-5!h>w5mmOp~t$m35w96quFit$gcsltI$c}HP1P{GFWqIiODfdICPFWo~c1q&V z*;9WH-a7U9;LB5Q4}LrK=paZ9NG%Hk0|O|oKs0(-Ajbo2wJ}H!J^X;`9>i*6kh_WT z8>)WV#Vu_1EBtigA>-3&2VGC69ZWcFc&Pex+QHt_X$Lb;CmsUHf!sq(IFn)?dVJ9` z?S47!dg#gN#6#y#XC2ygI`q({(~5_-o&I_7;OU14@1MSK@b&342S1!&{-e0KWn!Oy239R#TXsU!E@(CWk7{a2^8L1M(X&`Cy>jhKM)XhkN8X z&O^TEd=5FDOFU$BF7uG=x%fl;=Ufi4oO^nZ|6KP$*>gDumCvOdG(4Ah(D7WxLEm## z2P4nzIp}$A&q1eiQw|!QYdNTLuJ@qKxy1)X&pkdUbx!4w(m9($YUi8}>7R2wg{9da(Cg`@uQqvJNgfmvnH$ zx%h)e&Sf3Ee6IcA{c}$bUOwl1=*YQ*L;KEU90KXvaL)D6qI0%~W}H($H1XWigEP)8 zI=JXu&%q7nS`O|z*K_d1xkU%hpL=@n#5wgt`_9=O0;vb-BR2eD{ceyRa@`2B3lW}( zemBT1q`Do|EZXG>8}RIj3bt(gZ<|d57mS5zJpcgryR^W-+D0W{M3WN=MNqXKA(8V8I1QGv^ziL zpx*h`gRfm~yb4%7$X-xd zBc^VEjWdGuQ0i8Yorv&7AUiPaLk>TLT96%>_94{LK70x;Bpxcbz!n588`cI|apCd7Z5LV&9=VWt@al#5gU>IdAN+cu?jX~}^9PwOemuDI!pDOL zE@&S*al!u3)eCNio?Wmy^x=ZUA%=?*hdy2iI&}3y=Ai=@;tp-T;CKjR*3Jv(4<5WQ z>)_Q3%?Dpym~rsqh4TkNVjwwC8V02s5RL9f(`~5sBE~{M?!)G0RQ0q= zQ?L~XS{D-!XIOCjka@`V5L!XN3f95G$P1>K7$N8CurV?*Tmskd=?wpFY<=?MM);G+8;MW$ zT@Qbvecj^8qH7#aRIVL=yy0s3WB03)kKbNd|7gJ#>qkjf_B}MYV*OD3%BBZASJWN| zU72xT_X_9zm@8HH7F>CM_xqK+yHQvF-8p%6{vF3_!FLW`6T9Pf{q^m0*Dv0Vym9jO zlN%Rr=iGdK`{PZqJB7D`@4UP<|4zj1e|L7@&bupg=l$KVJ5~2u?{MBX}(-?Vu01?v7?*TbJ| zxxV#DrUvy zpLY&CV7sgF;NP8|`w#DYytnR7*u9iH`|q;fF}XYI_O3gMw}bD@zxDsN=&gOXTW z{&1uCcI1uB+lQ_f-`2a{e|zq=eYb_L{l7i&YVaM2tGn*3zG8CM@5=tWELXzrUA+A9 z-j>Tf_t#w3c(C*Gfd@A(hd$)G^5mi4mF!0gue^N3d^P%U$<>38KV6l4QgbcgiQx4q zPc}f^4~iF1Y~#xP)K6WIv;wjZwsz*i(R)X>9KCpC{?XM(CLJw0(sxwr$fTo>4$nWj z^6-|U&4(`>Ej#??X!BvlV=E8y9eZ?G=$O_KzGFp47>}(!^5*EpBOv`3j&3`$`{?Q; zYmW9FS$I_I$eN=k4(~p?^6!;6&j8k`%ZNz*uypg}*u^7fj-5Vo=-7-ShmL(cycvwI9X@mn zgsTrzvhHAg`DL3R)mR@AnW9^nM*qwpLzILdSU z+F=UN8FEJIbwPI`Vr0JXO74m zUw=dftk>YE%<+&TO2>tcXdnM`*y8w?!*0j_9`-vfawOz<$PvHe(~h_uUvtFb_|_xZ z$JZQDK0f6LNIl42Qo|Rdhf=qK>_mhwqK^V{6RCbcH4Bo5XpyF2dGXxwjYke1KYL`u z@#{wxAHQ^D`tc)2dXIM<={v>%j#nNzcl_GndtiL= z$hqSnOnMnWO?wexPrLAf9&(OiCF5(nAe9=@Cw_F}z(TZy#B9^1_knCpRDI zJ{fvs`pNHymz}(Ic+JU6hj*PkfB4+VTZiwS{C@c5$YOzpIUI(@YJHix~C2u);)FYuss-mJ*;~Qgh6^Q5?$xR@(s1@M1(o*!U?vE zfAZ*@F-3r>3-nRZ&{$imZ)4zE3Z z`S708=MG;x{qXRk(=tacot8Or=JdbAyH0;Pyyo=Z!^=*KAK7r)@W`>#wnuKC4nFeq zbo-H8rw<)Dd;0Q`J*RITS$+D-k@=^O9s$`2N)N=84}-y-^oS2wnPPM1_7ROU7mi4t z*?ffeOz08GGv5zuoVj&a@64scHfPQs4mfk`aQvC?hqKRw9*IA*`AEQ-3rD=p+&BW# zXLDxj5xp~OkEooPenj?6=n<7OLPzw@{5foM=F4HPGk*?;oDn(_eJ1os$eHO!yw0pW z0#XmsM{Hcc$`p_ua@`2B3lW}(G6m!oQr(Vf7VYv1Y}|eFnTtmzpSgB;F&KY5y#CCs z!~4!$JbdBIt;4s^d_DZ~%&o(}&Rje!boTLK>9f*Dq|aVF!VSiHN7&A?9Qk(U>)~f- zSdZL4V|e8LnTtoxgR$O`Q)gI?>^k%H@X9l+M;4zkJhB*U5Ao&CK)MeRm$VCi*chbq z+2A9AXTKbdKYR0V!P)bNo6cT8JmKuS!*kEtADMeL@kq$o#3RvXXCFyEyZ%VQ*=k?6DMj`*G3cm!lt$XWX%F=x4s6rBBhxb-Z@k)E^m zM?hjAIZ)anrhI~pL4x#9(`_L85n+oMg9Nz`o10P9(=IMx<&?tt+ediLUpVsj+~y-6 z&xIcOd+z&Tp7Xa33!T4oSmFHn!zSl%9d`9Fsh&VM;-4H=hUL>cf-IgYdP(OV5Mw*Ta*~gK*c8>E~A+S$clW5s-e6n~4c)YTJnjbJ~Ry ztY3Kc{KX?@&sQJ53&!6MzdC>W@bB{%4|80&dRXMb-^WlPtUU-xqIIF$X&30;>&4T*h`P_f|b8+7lMz3T=;T0>B7y!#TU*WZoP2*@Z<~c z4llT1e`LXh#3SJs5|6}Pn0+Me!ulh{7q%T~xv=U;--V7N^DcB8>A!I3Nb!Z6N8&D= zI}&(d;}MWq;TP@{e_)_JO>6i8#>ArOFNX@02N765yKN5Lq%Mrgzp+_Pw{XU$2>CWNY zOIHq8U%Gg>`_hfW(=WX`y!evNk;#{Ij`Un&IZ}P;%i+9Be-Ec!5Wb&oTBOrS~aY{@XI8bh*N4Uf4`(KxCA9;4^!jbEjHXk{C zDfGzoOWzMayL9XDn@g7t|GISkFyG}{hh;B+KdgB<^oZ=`%}4kyUpT^X`Nk2DzF(KN z9(i+V?U6^9rXRU|DfGyrOF~E9T>5kP*QGCqIWGS>EOc4uh~(waBSM#_AK|#X_6SHl zNFTA`53BD%ddPJn$Sy>9BKjpDw~*>~RI_N8Ct&UVz{?kp1YW*&I1!9L9?rdd>u}BG zi--Fz-#R?=^4G)5FW)-6cgkN7{o>mA9S~1^D{0p(Dl;7AF#Uk)0N;O z3|GG#=DT|Hu>95YhYhb@KWu;X-C>`r_D6iKCLUqFns|ik>g*#zSJxkrzq;*+!PQkq ztgdz(@w(b^#QN%?Bl1^o9^txr?#SOO8;^j@V!mpBg!?Mj5&5g151U-&IAVR({s>46 zBnL_h#H0yWTNR{-nr;Kxj|f{tTNUI!Y;HzXPrEb)YfqM3y?CVL>b1iyVEps&q^s8t zFS~l_@Up9a4)T(c43L_2@O%3AH~7mo;EKYfJr`ivu-*S{YA zbq$2C9p=0a!qtZ*uY>Tl!`jzD`0HWG>mb~9ME3fsBih&390BPE#T7AWi`sV5Bb;D+ z(xzVDdZhLG#UlmRZykxge)LH2^@&HquV)@fx*m9>;kv_-p6fP8rd-!KGUdAXk)G?n z4%c1(dN}Vo!;$pssz)NOs~$Bjpbo;Uc8M&6J-nsr0qXz`7oN6K%kKazFh%n^_s(Kogn@w>75h}(^+M;va19&x=P ze8lg@-@`FCz8=oJ@$Ycq4Y4ETH$smT-k5eI^TwJZAoU=9pmab?xdKbyAU*W(56E4J zctW%-LGC8ipQvWhF3w?Xj`cT!kL@qDo10P9 z(=IMx^gYmV)b~iz|`momT`blkv!_n_muJzsYjs!cDy+7r^>a!xY{9$bBeU z*o$r-E&5%sdN1YH^&^3|&Kz;Mwf>0Zt8TypE);l^9P z4>#Vrc6cHf?>*9fOY&&tEu*8!x2%qO-qJW~bL;&PpIh&b1mEI2ntV(0Xvr;sqqVnw z9%;O_{z%EKGeZZeQVm0;#+HufYgKZ5u2xB^&UtMJ^TZ57b2bz^&ZIGr1}%pEZXG}Sh**5=i-rn zw@)AWa(l*+FSoxQehS9d4u81~!qtaa?tt*M!(w+p`0HVoJ0RS3gyYVtBVu>f90BPE zxfxW}fM`TGK-`X;Kd5adx?Qx$8?ZcWcjw{}yF1l~{lNJ9;pjWJ59i#uc)0S;)x)iK z9v|+%BYUL(&c!43V61JICX>^ol%huvX6;&;dTh#y!#>17Eu?WIR}!P-;X?*tz? zdgsgG%Xe-besbsh;cs`YA7;7x?y%rp`y+yP6OWv@lX&F(o!LjO-&ud;$(?OSzTR1N zAAP%$n<;bj?BF`@5sV?$wwC6t3JFLj2n)uym$D>oO@S~ zfb@ghOiUP4+fGEd(k`4}XQuGnzj);Kz3Rj7?o}TayT9a!-Tmsrf%mHqE8M?$1SCgn z7?5HfJ^ZHt?$`1$RNlXMr1F0C;VJj45AVD`;mG~_)rWt9@x>#r?t}2U!-wu)JhJir z#Uq{f*B$Nzt0%t9qJ}-#!UGiUl8Iu znHgAESQuDYSsB>a*cjN^*%>%EI2brNIT^UPxEQ#(xfytPco=wjc^UZl_!#*4`56QR z1Q-Mb1sQ~dgcyW{g&9OdL>NRxMH$4z#2CcI#Tg_dBp4(mB^jioq!^^7r5R*oWEf;+ zWf|n;3FtwHb7DbQpAXbs6;Z^ceK@^%)Ed3>XXz4H=A#j2MiKjTuZ#Oc+c}O&QG0%oxng z%^55#EEp^;Eg7t=tQf4Vtr=`=Y#3~9Z5izB>=^9r?HL>#92guO9T}XQoEV&)of%wQ zTo_zkT^Zcm+!);5-5ESQJQzGZJsG^bycoQ_y%~Ibd>DLveHr}x{22WG{TTuR0vG}V z0~vyXf*68>gBe0XLKs3rLm9%t!WhEC!xX3K$9t3mJ-viWrKEiy2BvN*GE@OBu?_${5Pa%NZ&v zDi|s&D;cV)su-%Ps~Ku)Y8Yy3YZ>b5>KN+l>lqpv8WRX4m^N)1!}RIX8D`9w!7y{?OomyrW--j3J)2?9oH-10=gwuA zH*X%p{Q2`47A#o6uyEl*hDD1OF)UuZm|@A1B@9cKE@fD@Y#GDy<;xjXtXRRYa^*^f zRjXDptX{pEVa=K~3~Se}Wmvav9mD$d>lrp|*ub!H<3@%}n>I0Q-n^M%%a$z+Teogy z*tTsO!}jgl8FuX0!LW1ZPKI5(b}{VUy_;dro;?hE_wHrbw{IWA{{8zI4jeeZaPZ(k zhC_!AF&sX8nBmBgBMe869%VRo>=?uGRWboIZV;;mnyc3}?@t zWjJ^49K-qZ=NT?sxWI7n;zfo_mo70}zI>VC%9Se&SFc`WxOVLt!}aUe8E)LT!Ep2D zO@>>yZZX`xeVgIVojVM7@7`s&ckdp<{rmSB9z1x!@bKY7hDVPcF+6_!nBmEjCk#)Y zK4p0J>>0!J=g%2lym-Oz^5sj0SFc_%yng+f;mw;j3~%4QWq9}Q9mD(g?-@RP_`vY- z<41;1pFS~s{`{HY%a<<pFa$L z|Ndq8_wOIW|Ns9%`2Q#v4S~@R7!3j9LV#hk%pfkHMpcc5z-S17LtwPb00+Y;F&YA+ zAwXmZjFuTh2Gpps(GVC70dNS6mKoq+7$rtSU^E1X41v)ygUEmyRW=#|qagqefzdJp z91NqxXb6mk0FfauT4oR#P@~F5Ltr!nz#%YNW`KiXlo$GGvLtr!nhzxPF>gnK7&q2O-apl6Xi_OUT|)`2h_9 z>PF>gnK7V|NpH(ZNj#*erMEvu?IS4!s2i1|Wd=!sKhzbIl6Xi_JJiEvn7g04Q8`*> z4D;lI>OE2t4=HLl{)N4=HMC>*`U{DGUMXM&)RkL1A_eJkZ=qO`}JOS)@cR!~g%JD5rA}!kjjmD2NDnSYQ#Mln5ng zK|Yw%$zXOH5g|P&l#r5m26=cxyfVlgIVd8X+GYP}nK4MBl|IgZWHjRJ8tmB-?3cmr zNaBK;)~dikMKw#Xl^I|$1_n^el;J;w17iPY0JH!9hlqhmkPui6$WV8 z!A5~(z$!qJU;hqs#SmGL(osxy2!I2TNZsHF0EIj#o zqzH^51d*N^naaT7MK!O3qYz;lD7rxy6b~RNFa|{~SP;ZOL>fW}!U8!Agdr+GCV()w zyZ{*k7lx>Y$bn1*>wys<8m<6?1JZ?n)m5CDZJv6?{90K%X+0%u@QEJC6aECi1X zu%RFVq8cO)VL`+&NstN<2Fbu^xDF5lgh3Jzr-GD0F$x7%1x;2Em7^r~5C8=mb{TR+ zLFoWVA2b@kDFYN~Aj`mFU;?2KE)GsT5J`|2LXf15pii6qEy| zK#D-ZU|moShyqK3jD<2F#(-3gVjLj=3N{>4WC)X0WF<1qt|A7?gAO&C>z`8&xAclg( zAuI?9F%7J8l)w=Jpg_hUMTRgW`@=OtqX8UE(8z&MPzkU?s0$DjL=wt}#37OiAaM|e zNPtNY7lgq{1jGPgu-PC2VjNfwNi|prm;k96#bkv5Dd7i=26PI-M;HWRLBt>_1r}vc zF^Dr^$pK9|j+Bzh2Rm@1G8upCGL$^bFJDnSH@16Bm7Yd~C(FgQtooB$F4J08S9mw||Z zNU+ghb)y7XApj0UB6WhI0fb@k1{u=;MFB(?fLsD*fJIR) z1M2{#83=}OLB=8(4^C?!13(6iVw@pB-5`QQ7Thv)!=ZdA1y=@UAOsOCumlzYSp_m1 zt`sZ?Cg4Kg1cAy!SAZlt$|NQPNC`j;wGaUa3AYTwg^+MTQ0ai+fLZ7&K!RW~FahGB zVo>RTDuTpA=m8gONHU{LY$1RMFKn`;iV<68V6hb;gfHSCsvso9amZ|l2#ADsZ9z;p zMpKFAR=BcJ2GJpa7NU6dVW@=&phY%Z5MdTb2+}M-h=EHHkOYztsFjK{PH~qRAX5<9 z5G-VqN7*PL017e`0g5Mr>=iT z%Z#Cz2FP|ZDT!x*$_$VbK^Wpk1Pj7PCP8u_j4Xzm4N?ihU=?r%m^bVR>Uwvy%oz3w z2HAt8B%T2(GeFKoI1|AFiDP0y@~ArCs^JV&`Qgf=u6HrZ4C82Da0}`55xtjL3Ra545S>{E)W|!H4iZsveW}kLhOc;Ak82{Ko*Y>4E8eB{0fN; zxN(rchjRx3gGBF=sC?i(NM8q&VjCzefG{{Sg3<{XgK`^06vP6BAIMB7hUQ9;C|DPG zi5EEMg0z4zWPuh$96~}wAtcC15DSFCDxv1W3W+zNZ29?3^JWUl3;s5Vi09eEg;=sV^L&4 z9FPn|4@e%w1JNS`Q`fiH$_%g=q=g7>T7qH>WGl4U2Wl*Wf*Pa@Bm`E2A`glpkSees zhyf7*vB0qgF&k9>fK`AD0oj2p4@wANNvKVrBmuGzWD-amq8V&8SSyqTW`pD)W}%WG zagbiHeIN$B{Rtd0_z5qR}cW;mRQl2nli?L>0Sj1?NE+AR(}eK@231 zLAYQU5P>8E^*KZVOdP}mOMnzZ!Wbk3u>%@&AYqUoC>lUCiX=z?Yyeyo#sg`CnhF!l2!q%lQ$cJH2C?aaNwEy%8xV##7Q_N!kYB(wL>R<{ z1_4+UL_jS8QQ+_br7@^Dm=9KukOdnAl81yEhy}u69!M3m%>Ypbk%5>9VuKZcRDfy_ zuoj3qR1)M$h-xG?bP4dmVF}3B)N=_a^pQ*h1uQt^LAJm-;7A6AJ5(h^6IcnT0SS_U zs)Z;3rwp((DC(dLkQAh02o-=(AQB`6G6dYR1X&Lj1ls~)K`=-!hy^kdhCzG~hVem$ zKwSb+jxGsS0Fr`R3Dyb~0ow>lfDl0l36%qDfN2N05yXZ#7-9)n4AgW2nF7KfHbfU# zDcm%WLa-L7BB&a=P+)tBv$<2ND381=0&r1abq^E|4&ciE1KDBiMM55|Akf zGeOcL0E5DldftSDFx)(Fe1L)!WDA^wR%U?YKyd)k1yKbd;UW+n;5Y&iU<{W8>4&NZ zM>bpn#DGeG+yLc*HA57FbV6i6EG%NE!Vm>;4G>AFaWKOnvS1P<4`x6-2XP5V5QIVM zQ6<3!frQ}FPzJKKXxiW=Ll_`gs3s7T_LvmQFw{Z>AS6DgVyJ)$fC3c4L`!ve3g6s#`jF5(Cf`~)dAe+HzK$anEMo2@IKrNs#MT%t@Y9Rs; zmt%J)Tm`B$L>LrKP!@=ZsstwwWF4e!0Mi6B1E&_k5>zmPuqA^?1$F(4rOW`g`#`pU zq6^G{ zbr2G+5>!kfao|j_GTdH(sRJv6abPr7L6{`fX;N$>MJ?4GI%*&_Lx8$bNo<*c#a4t6 zzU%@~1tF1w0V)8Zpo5GcCXxa;6Cw^Fp@MJ@oPnD05yDUn2nvf779mi%0}2@oDGULK z$ppLrQH1J7JYrBOT2MILkJTzt)M7PYRB*6_0Cl4hlrxZgMqR^^3?5|;iVz?reo0X~ zC_Fdn2wWjR-KZQbGjN6TuoNdH@sOf+SO(Vc@f3BVam7`_Gz{TVM*i1^|Aw}%~cxBW|;zNMCQ8`*>5FhfxKqV=OhZMELAZUiO7pNPR zm}Lf)%^!MEL1X~nQwCk{L9yTQ*+G`!q!pIfiON7fN~>h0>h@7kSW;o;1eUoJdj$nCCFK~YIP%h0?-{W1gVss!q}p9Uro7r=y65t1j);nXn& zVHYXpfz_g=4}?jhESw>L2s0Q9M&r~%V+n9nQq2xD-+;>uuo!q@H)2UP$X0ln3z35? zhz6AjAW6`AXwZfVh-T1=NiYkV{Ad5~2qr4Yn6)B^5{>BnC4XYz#;MNexsV z*cnhM7#l=`w1P3%wGhWZNRSyY%^;N!KG-8*AAp<%3SdxG1Chh(9Iz1(8^F#31r|g( z$N-Q8hzGI~#D*9F;(_#mjE7*b98@95cCa%*QXmZwb3r^RVUTUa8UI!jP`kmBU_M+9VGzU> zU`ruPkQ5w)bb;kS47ezS0Tzdv2&EuGAhlo?n1QMolnfvuNGzxTeJOAVQq4-Re-WmE z@*W6-Q!a=B!l0B3p+UkR9ykm@4gq1X07wRuIic!6Q34Z(2!T{WSctp@;)5_K7Qk+R zC<134uz_GBAS#eakQ`JGTrF4(q93daOh7b2EQGK@D!^Jn42Td&CxiteAzN6WvQR^y zJdiY01f&OyK?GD9VhvOP8mX2Hu0Fax9qq6(q}$_5F; z%?8VWRfB{;Qeah32Eq>@0aUe6E5VKe$$~JF8K_#pk|0@#E)W-l5h7r-!DfNPKyqMr zAaOt{K;j^pN|+SmAZo!01Vq3vB#(f2NI3zGi{x5R{R;{Lh-n}Rh+1S8x(J*PW`GHZ ztsqTM7D5!n0%5QOhylW2l@J2Ng<&L@fP^3lAS9R%B0w0)YhYQDd;wLAWEZ+|U^D4R zAOfEnmO=suZW1KfVx)d>7K2+1Vt^FF!v-pV&;|-F2nMMGXAF>H2nQm8lsBMKP;t0w z5FcbRI4wYxgG>M^M{zK?;0HSqRJ(wbz@$OiA<7~CgpeSELFR!lSOqLfAsh$^l7tuo zG7xM9#32w8qzEhxk_8(GayLj6NdP1SQUn$T8v$_ugapYzR3OQN1z>!rQ4obxAweb+ zYY_42Ud*1nGpZ z5G05N!XSr1X^>4ICX5D2ficWXBpPHS2!qsv)qojb7DyO^K?Z^KfEZu}U;-=&V;!Q^7$k+z0TKaWun2?!HwoeZ1Q*N#seu>>wh6=qF`#Op zGGIHvQXn}v18e|94kU)aP!^PeD+BSt90&tKg7t%)3o;wTgIEe7!D3J*NRCPv#cBd( zLe+v(2#A1TNNxi0U|AgGH?V4mAd0ylAsB|L2XP^4U@RC7RRFO8tOTA#QN%z}5IrCg zhN0yWk|7`&kXnckln14d3`8ga3qlk?NQe|%7$OKJ!30Bg@Z6fR(upfnCn@?h6NSs)dl zu!O3DQQ+_faX|SGVK9URG7aJ`1PRgr5=XKYY7JZu$S9C9kUPL~5C&8TEig48 z8mtByE^sAqRS*%7OF(K7w!?IR4Tea8grHogc8CZ_7HkY8M8R?h8IaK+9t4Bbf<-_K zh!B(nnGC{UlR!#9DnJ-6fMPIQ6ru-Y2!aLT(HDapOg$UXe1dK`lnozzUEA(fJ@LuozB5U=lDIqyrZQn}kae zuQ>TSu^UT@d3e+!r5YqA4lBXt5K=}+9%MEVYQRds1V{re3{wE3QPg1-gcfSpcD|l{|_8^0OpWHp!o!9INS&*A5??F#lQ@x1eguW z&?toiiUJf4R1cKGB85c=WHiXB7*ZGl5Mv=V0I1T2@X<+hZRmWkdi;if3JYk(2Ud*~ z3Q#_r!fHBP77v4LjkwGt#Xvl2K~Vv<0*MI~L8BlFAS9X;5*H*7!bn0GOhWSDL;@o) zbR!AC41&=}QlJI`3KzE)Q|wBQxtXR(ojA`9WhxRj~b96 z2**K9MyEiE(8UmZ?AjrEAS6O9oCWtgHWd&_2np9gR|YgHA22X5I5;>sfbAYFGr++x zN)QSGXyPHH3@lHITCj#uVz7n)EGkzqFlfJmI+A966R7#4)G!GFSmGhZJEW*3#=KEA z0~P}Cs9eRsAa;sUXP~v1;D%Fb?x_Aj83LrlFDYsVrDsPS1q%U0R9;nJV8B{veEt6w zrkW5vT4oRmpan~zt25n-eUC|7H8V)gMlpJ;;KuY|Q zqITE?)bR2UG%Bw$FlaZ3F_>ZToVEgknF1DZY(k@D#)tyY#6y&yNl{Cbfuo8BDgYJ$L0!XPrjF8s zB?L%`U$9zm=?Qi{m<8H}3u1soKr}e{z!{*OqhMViX%L3UK!iYSP+- zqF@?qE*cBW1rZQQWIdpb*5EbY5J3nDG7QQBQD9vV2E;+oHa18IVk(RUm4FC>$RUrR z9;T8%z#)k+i@Js*%pGM7ju0Rvej#c>SrLRm83{~-3I;Gn-u3}WMqqg`0rM?{1C|95 zAPh1HDh=j>vNi;RNQedy3#tZ5IYb1Mvmrw*AXOkof{X!|8XyH=22>s-0a64t11tr1 zHM%))#c&l+<3Q99$DmN6o);h?1vihnhQo~=Wek!KASHewYQYHvM8Gg41A=(q>SD4fgwpkqLNxpM}!X8MCuw2Hgc30L?J**{6f`&QwWHF zVMsOu@sP3<8W+vWU|BE$l7KTHCP7RA34$=P7)UWh7QzCNa5dm|0yx_vX@L|A2q_2) zTo!Qr#&=3+V4kADpDhXkN zI!vHU4{C^j)I!P+5DTgd%mk|d_g$c_hG<4s43z*YhdBqr8LA{SDyigrNQl7=qpsm_ zV@DZ-Bm_u_Uzl1@mIq;Q_5r6C5D$crGZ$C_lx;y76s8sAYfvTy(I9aM4O4~C4l)d6 z0EC9<2Js>45iAfNt_H+_7zK72*ffx3;Oq}B6);K0gz za%f{%h(dygbQ0C~h_C^RLktHqM~Pt=0;I$*R4pWhL2@J{e}PC?x`EOlMUdbEv7mxr z0XQ2X0m;i?HYj^SWWijBbqFRz3S!-pfyF?IAr6DEKp7w8IH(v%HAn)k7Qp~X zfmDKZfEgeWxMGkUAOR2tYXUKbFh&krh$l%SQN4~9A`rt-m5lO+PY93_zj)Llr5YqA z_F#f20Fz(>yDBWA2-OG{7G+=|s0wfq04Bhq6cJD(VQm4nSuLmq5+FZ(460ZSw3(UlahEy zQ9E!x8nu~-5TGn72d2yze1*nnnL#kAQI^mM8b7Llejz|vR1#BWfYg9&0bxjP2Mt6+ z7S(}R5Wj+!+kr>RLCT<65F!Rq3DOB=L9QhP8w(;pD`vo&z#NDk(7GCsX&?*|hRK5r z2C*RnFCZS+Fo-ii5>OV*6p-6MLQp9%1+fpL7sN$238WfkGsFatUXaT{7|aGM88!qs z0EqMrDQbx{a#Y#CgaBnx3CfSi?ndK7GZy52RBjk{70N$NKs3iiKD6pCfIjU|zLV&WU1ZM^$ zccby~8jc}}B7opvV?pvRlEuhOga)`M79qG1=yK?Ms3Blsq_P1j454s|gJr=w!K~p% zkm55^)DE|B8fN~XEGp5;2uP)i2q6^1Q8@4%i%<-z(~)^F^)MP#VI#{Uu~C@_4RCQR zLLfPCYXDsioexq7!myD~5E~ss<2xol6Xi_OHV(H z+C_2*P!^S=Wd_LsKAbd=l6Xi_JDkF382W{>s2nXbhGCK*-bR8Q}B+ z(gnhhg}*n@qm^H!vw%ez&atTfWf0PKpeOp5Qnf+M^)et0Z@SBSAkEK zP?>>G@2K364*^mV4>Y?XD9|YZ;4BVdfbusqK)}XA6oQx#7Dyh#gODJ#5E%p?Dh4l2 zQ1yUhAr?Ydqa>Lj019w2wSuAsO*>i{f+kD8J%d9hMcyGsGcjrgM^HdqL5h1J`5Tdo zLAe*CAJhs1iGsQk$jJwy9;^bS6pSG}2nlilk{Ylvu!b(g9EcD^HHZynfe4V+QA~aa zP!@)e$U)eS#;441gt3E#MTvii(o2-0!4ewaY)rIcAo&|qI)FTh;DKr$kSH93O#~+- zgd!9zP!3olNEeI`RgUZ|s1S1B1Z?~$K}iUJ0-SvP;HX8?j>f0Va3pgF3zGs55vP?n zRYNg2K-m|BA#DK&3*IXMc^ig7WdVo{&ikMQ1yT#bFaeMx2!l-mkBWk2pv4D5CCDJK z3_=Y=a~v_Ff`~zv4uQqMvfu;=9(sq5 z!h?JW=YUf!SS45wB+Y_SHdqx{Bd7%q@(WxQNF|H|(*RO1BrwQd#5xq@QD_iAiVBcs zkRT|qAt3-J5rF^-S5ON9qzIxDM1n*h5dk8>av&#w6oa&aOa&MzO;90FJ_lov7`RM7|@6%Jbck5L9Gb1bcU>Vluh#xK#M#Q z?L&_{G(Kg9ljs)ml!KfI%DB*E3d_r&gbI~{CSH&tm@G&!gpVQ#YIB36z%GI728low zLy82j448nKhh!T_9ISsR5TrPk6tzRa?<3faltm?483C#Ski(KP!;wv*85`t8c#a0y zg5W@fi!`H z!DR!80n!Y@Faa{Al*>KAOV;>Y!(J$CYS^X zf$V{Cz{;W8LB;k%Ayjjj2NQr3{W_XVlqO2l*B`dS~8q6s)c?bKv`6dmKpSmsX=HHDT#*^ zwS&;BqfSDE0A*1*T4o?Zas;wSNj#*e9f3hPl)Ow?RF0MzLn*GQ?p9I~4`@hu6c3LO zpeP}YmKpHigRIqnb4LV&q%vbfgvf~SBq`C386cx&1}scK;RwPo{)nJS@h~ZBM?~Na zT~AULm7`?_a?Dc}mdGXz5jH6vCPnQK@%~74CS_4MV#^FrzZ8^Yz}rv2%RM1$&_T?VI%z%i2NRWylk16vAG$X)60gX?Y z;c!z21q13e2nF^Sh(IngAZY|73Q0d87BoG9n6L$J5EBN4pD1+%*jq#zLW)`49p8QXr9`jX@zmtPe<0ORSl6R|oe5B$A=k05m?KX#pYyQVEHC z5D69o3DMofw6Ksek3d5U?l3eyWro8|9TW_x*Ps+=hdanw&~yT-WWX4i5Ar=I!N95* zs8%Qi(mm8M$cM!GffTjGnn`zcpu7+B2sCQJ(GGG5NE|ALLcuv81t5h(9#iHK^z@I$ zr_Aud7Pe5&fhjNnE(|~{NV0&iKz@eu!Sdj`2qXZKfE6`^&1+=32jV5-G?Sv1I1>jz z71$G?$b?2MxWGX0A-z+GAVd^S!p>kB07p~ZN^mHUZ7L|6AZteBQ)W1_!Gnwq_ZX;M z0r52Iya{BW94rGmS!a+rpIXj=2LllXlA@Lf;|4|v*b^WE9KWy{036Mr@&bavTyVkw z&!NDTgMa623+Feoz|$)G{U1a)jdjzae#oDXM!R1H^5 ziYG}?J7~iT6zw=X0uhFgQ1^p4&;|)qWOz^@f06H#5nE=EA7sNxCn<@C6t%-CjE13K zD2vL`GGiDf3F5s(O5!0!E%7cGRXG45Kv`6dmKg&OWrN2`QW6g-Y6p)GM_qy?1SpHj z(J})|kd7Q7QW6g-YDZ284oRO<7L}uA#*mD3YB`#e#6yZ&YPoOJ9GZjxWl=d=X3!*3 zhKix2Bpy=K4i*28P|z4A7wgMA}OmrAUD`jF_M@gUDbVSYMBp83P;s zNVb!eUdYl!S(yRa=n29|PRGRrDFb0#@<`&Kgb2b&LL-X_@;nF+eqW=z5}i+DACQ;i zY3!&0GM=okAWIXaWd`VsE21n0rzS8#FigR!zyv|1!&3p+?_grE`w!ib=zJQxpQw~a zV>b*IR!Aycu{00qG*&!4F5T_yn8l8`j8D))z04M~Y zDTJ7k0In3I4=;w92GxOA?XZ*_N&$c#N$C7x89}3-B0mIRiJOQSHh5ZsGjLi9Qvo*} zr^;a}F_Z!T=2lo#pz~qkqx5J9fI|SDKnP}UgaQN$Yy>8OPyja`Q_*l18Bzg&9!Kc> z;T%z;ej_~ukkSVd6RSB$@<>cdm15ODVbp9Z9_NcQ4CIk@mA;Gy5 zWTnV#EDlFbbOe-Q(LD@=Py=AFdkERJAh)9PL1LqLGz6d_fRa2=I8X%$3Pl!$gHQuu zp%xQ(l|nQOH*$yt0D26e^JyGC-eFL*goMUL31U<^ zG&@jK4pYt$3jkE-!tRx#TilSB`h5SdgWOf-(aoMDS#9bSd<7hGY&2N|AI8 zBj!*G0Q9&-=hHZ9$V>7xcGLhFPgYovrHR}!10!)@2*865Lk2^D9HnqQ!-|0(H0Wi> zVDl`dd+F*z@{&AVok%y!$O;RxG?7_mV5VhE5ol;(N??k>l|mVC3O!B2C59&h)4P}= zgUaXV&O_(Z*s5^u^TYdMPb2%LJww7 zp_dWpd>Xr*yd+O!M-7niWQ7G;n#e3O5aB|Ct+Y{!aLRCEkq}k`>235f0-aA|w+)d{ zqH!odj3+BB$kH@gWF%IW3x_}mkdU}(qjU&_5gAS-A*{$S zooZUp%LsHn)hrq{Xc&b635lCFN{3NcB6)>`utL&BcP4rnfzGG9gGMc+LkK{J+n_d~ z@UU^9X&E8K09wcc=0c1BGvPBMP#%gDgacX>29kyFKrD1k7*>JTsDo8PG!Zs}Sanpe z3e5;87wQ1gDN6N|ZX;Pb(8~yPK3Rs2Y8vJtKtkfCjncsxz9je+s|P66kJV7>3!;}1 z=zQwiIBMe14*?PqH*J&-&LAYguUI`mseY`6QeP0gj6mm8-^NiBhkgibm-o>KjE3KH}(0-aA|XAF^0qH!odj3+BB$kGI{j{=eeTS-$&f@%t!Pb;mIx}H+~ zwDK34x#(pCIv-6rwYftil&I}(tmcsw7G!C{YCS1}B-l!tQW8{?;$AwbrPTG5>Zg}C z(cDRCnSo{;AzzTFoRD#YOP)l}k*FNvSF$ugv{FElU@K`#86f-X!J1%GDj*Jcq6WMa z4JHbnx%m$lf+zq_vQXeJ3bleZinR67-^%5$Jppi~=hq(c2^{2U{^@2ogO< zqH;(ukfjNtl>(9kTZvE#O>-a$jG-j~r~m-D5o7`bsBnNvf|yV_h%kf$DmB15K@5-{ zP^kjaKXfp})q~!>pm;!bBsw2iju8wF)kQ9YDn}PiOM1VBuf)SD+MG8wh~kd zO>v-G8o^l}R3v~jAuy;A0EvPyNEG652n#F+(T74JOogZ(5+uY+gWjpou!Xx5oe!5F zl7Xdh2?_}?2GVEuK#Cx3Q>cO=PC>!~>MJk>@+|~|!veLP4Gwyc z5GWsjm4ij_2Lf0fekC-JCBaq#N}*l^Qy_oC+YFFk0&~IQAag(raH0Wu2_yh1CZIxK zGZ5(q!bR{wdImX$cxjM360`XR4QbNc4b=pqz!(~p;0TAa!4VGU!R5f22b4fS@?dEY z0}^^5!$@<A_-X~Iv-gMD;uf-N`Ybygh9TC zVpzPwxX_j)Qm%lCK#YKppfmx}Fr?xg>U1at@gUgupb&v#P=bcbKs^rOLrAC)#0&^I z2*UyrHCWRFx*%yvA>BDhc?#;LK?4O8c#sY(YS$Jj4GAY?65SO;gHJ+O4Wx%40gZ40 zIv*i}lLgfRp+Me-X|Spow4Q+!->_hVCT|#* zyv_jB5D*2%kYo-D0dNk1ml;q=q>KWRho}PyLUId;1c^aRfxB#IFhE`eWq*(dKx|0G z3Fbix0g#Wueg!i?ERb?A26-IJ0Et34AQGf`kc9=rNkqj6b(BI(fsiQHVi7`-rz?k2 z$55)DW}c-%nStb1NFITf5|B&-$}6DIz}dKjx(K9tkmU^|kCDNIgax>4fOruc3ZMc3 zR5XK&1CR*FWUxGl17^TN0TLo0`9X$3E+x`Qv{6c=<#bj?f?u(^j8gqr4W&pB>LO^W zgc^mOEYbN;WmKY|PCzydix9H(@MU9q98+Yl`kn-r(njgv3>Xspiq!*@>c?s*MS`&6 z07ioiL*alL#LB%A&rL<8xs6qqo7!v#n z*MrQUR6nv=)M0~$*69Y)_D^~j{)sNLs ziUdKW1q34*Gg@XK1;)TK$x1O~X`o-u$7Qebd(>2t_GC{ph6!x6hLD5_{efJU=PAjqJb}oGja%p1qn{2 zjZ#7(N`kF~jH09b;Bz&&cmS0d$W8+bA_WUNA4!T9Ok}6f!u+9R=AaD=Oow5L;0$Qm zD8*?VRDuLsp*jWwHTYZ&E)KvwQKawz3*zA;NsTf`Xb4~?WlRyAK|>p*IIV+9kYFoR z$6%lapR2*e1ISq*3=1N#AdCYZZ$jdXGDkxIlqN7j0XYR>NTLeRMk%Ttm^>0}#ne1t zB7@J>;NoGloiSi3V#rzy**60jL5EDKfcMaV1aR&l0?m+sb{&Be9cX(E5x%ElmZ73i zL^vF#gi>26)emzA^=Qyg1|k}v=0f5W$^q3WgU{Uv$BnY+7Xr|P0iwVdw9^odVPyui z1_GrS5QfQvgh6QuT&jQ>U=~yfgu>zzoDx{n5)h)IQ3Py4mZsEJO7$bVg-UEtp#j3k z#(~lUK0dPCD0{?&05n-ZC{R*{7X#pO0n)sHl^mb~0U9zOr4SX6q5{kY$$=#x#^G#r zfYpE$4^>R52PoA~i*N%K7|?iw8IQ)r8J{rqqx1*}0cfItQs5#1f0+SFSm1DhqC_s!KOkn{{1`rD5 zFtjoQ+=@VHXMhyJS``pBs2>awf%0KR2gFo}r;$mRGGwtK#irB)lEGq}P6nh-z~7(>nh0=W@he1OXgs3f>C0xKbqRDi`He2_{|SpzZy zYrx`^z^Zx>3R3C;O7&AeNI# zfq1-quqeor;LZp_2+V~PHy~O37^Drqia{<*sRt<4PyOHlmlt3H$!vIJL&ebf zP+?k8gD;e5b}BL(>PciFWHwY97e#_nTt*CS@xd1W(Bc4E^g}}zDhTBf zTO+`gQ_2{8p+u>V$k#uF!UEz{WD>>O5DAD7G8-a-lO#bYPBWkqR5S`|B0Z?V=W3XX zP>Kl@4&L4-O#%((CYl&N#0(umVL^gZX`_@-)RJH;A*1LhKloe?a}i20fx;OrGw7H= zFsy>b4~E3x6ClBt{A0;RtS)gxM`!5 zP;il8DL2hv6<$Pt(r5tcAp z5h9qXsU?DG2c`&dcEMatoN9Wg0v8ux0?9UX@1gUNlv0t2VGHWOEER1U{6=93i$U*b z5)wCUlwuDdL@I*WiV?WjHBuysVJkv_L~~)TCQ%y=mBYdhMuV+F;m~b710z(?odI^+ z$RNiWYciTwJ;+6o;4c5Wm8?BpVCSPqH>T zXg~=_6b{|m8EE4dTF zw#p$T2AUn{K1AoEDW@J661m_|qKTbgld0!inwkU&0Fa9zp+Zy3=xjL1S43J#f>PWj zLc$UxPtUM~*b4FhgaxvnbPUo@x-MGk0GAo)0g3KKbUy7I1hxqjN?-=n?E#rgbwg=o zAUFs>E(SAbWy^q=3-T3_7L%Y9kBRUggfs9crj`^WTfz7Jl4&e;0)R}*acP4V8%WaV z0gKK@Qc7(m$SP1MfoN)*4LQky`liyzL~xR$G{w=#Z4?>{ieVy+AVDb}6T!&|9F}+# zQC$jbE2VvV>I47{{02^+aC2dPg$bbZVd6BPK~~W&ZU<@j;|NFEh6N5w=^{)*JdmIi zpVJ{>iJHvusi%q@)H*0drjb+%05WaIp$**5K#>ClFtPwTA6bstZ1736l!Y>GCk@K* z$LU;9C_s<4!Kr3wN{|o_Bq+rf76TKOkc?vfYfd!CELFXe$QJ)EkT9{Y+PDL%hNY;)|!{7{mJT9hTSU_wY^dUk$2huz& zAt8!Ng7Oxs2&p{k1puiw6Ht#Do&#HEKv#nja4}iZgEste`35~EaH%6(e9(so^&Cj^ zu*4b(6x&L@0Kn=#3ItKShQh&YXMoDi;esg$GO*U+5)L4LfIUPa0n#^YFo}K#D<3wV zC#`IPcpDr75Q0#d0Z}y^NYVldi;pQb0E?LeBt({1$kH@G9wcNfS$-i)6Csxjgghx8 zfs_~^67JH`G6NnIgcziRG$FGFSe`7ekfmvWJ&MbEviw4pCR{EUNO2N80xB$E80O^B zG6NP81ZfgNnxI(&tbi=9kfmvWJ&MbEviw4pCR{EUNO2N80xB=SPK7hj&c4Aio&i=r zEC><;3cG(PHUPV^10hP5SIE*d5WXYAPO|($mL?(`Lw6;_djxsH1m3)WGoTJf;}dT> zRR7?mDE11)1`M9CAOql@aI*CSb}2iDxNs2E|^X z*Z@jgPhGuad4()Z)O9!2Oe4!LWND(Blc{JB@g6}@3FC~G8AQhgEXat~FnAS`=lX)z~?&p%8}(2vNX}xUqstRmS4!yM6{FW zsE`DYfXfUh0dwJKI|CLH1ZfgNnxI(&tbi=9kfmvWJ&MbEviw4pCR{EUNO6)p0xd9* z3JN49*cWJgl1v91FlY&iy+W}8gC}Un@(Nj+29KXnTtb##$kK#j?I7Wh=n-(Kf#h_w zGGerEf)qArOcFyHP4}SUlI0b$Gz}_mBOF7PU&zvguygRRNcRXzF@eGvT|161UP%vW ze5MVk99do=OVfaQ6Sw7L`GqV^xZN;tGNgJ0)X+e3?P!^S6d3rKq=qzp(*{(QEU%EI zX+XV++j6q}LY5}nZWuTjk~{(`FpwrqFxwTQeG}XwS#G!b;lz$hTgFJx&N82{n7l{k+;%M4Io z1kMDTJ6dLdgMk==xR55sqybk$mRHEqG~iyv?f|m$A1C4i}_=|YcQM3(44#i%f*nq(k zDr9+uEKP&Q&nPY-%P(YULa}y`aESK^yv#t>GFoO39goPtMzp5EsgNwMkfmvG`k#bc zgXDo>69B|}1X?^G4~Js3D@NCjBc%~ECh;MSrg89b$?^(Wng*ZW!7d`pFJx%~TQ|rE z;ynUW2`xJy{y^c3&YM621v?1~KkTwYN|Y?Gkfmvm1`An!AxqO>3;^Oi0#k`nOrUT^ z%M5%m3=2PeYKDj$SzaMa(;y8Hviw4prok8h#Crrjo`LL*(J})$H1M*C4{5x{3~=ol!G z@iJOw5E)Q7lntXiLzY*_(u5-{2U?gczmTPApnZzXe&Rg>Q;E{FK;evzXJ89qm>4Yl zVEiFWljRk%G!4=~BFisiX&Q_HK)OdziU}0XXqka8hDi@;e5MVk99do=OVfaQ6Sw7L z`GqV^xZN;tGQ@iXRy@FHu$xghqh$s-OmGmyhcpfY29GdVULi}<;PEqxOUUvIS(;F+ z9V8s$Ju*6;L0Oa$AJUZBLkHbtd4()Zbnpy0R*>ZvvNVz7I$G-?-Xo)B24!(Ud`MGf z4;^%qu9Zqc#pukAut;3G8E2e-vk^cI0)iH8ixUcN0= z`GqV^fgA>!Hviqh$us z5kz4~6KxM26q4l?vNX}bGvru7mS4!yM2_odt%pL7jFuThM-YV}O|(69P)L?n$kIdy z&yZsUS$-i)6FIJ>rLY5{vc!nG+$npzWn#ge-t@Tjokag zX(GpUwAMqRM@GvGq9cgHkRD8cEU%EIX)yU3$t`60g)B`-mJS*wg&r9#Gl-5!3PYM` zd+4B$EU%EIi4LA2#|pCiLY5|STt{m?6nbQ|%pf{~C=6+$?V*E0vb;i;COUYA94pB3 z3t5`TaUHGoQ0S4-GK1&{qA;Y1wucT1$?^(Wn&{vea;zZBFJx&V$91&UL!n1T%M79; zh{BL2+8#P6B+DygX`+K?$gzSfzmTPg9M{oW4}~5XEi;IYAPPg8XnW|OkSwo|rHKxn zA;$``{6dx{a$HAiJrsImw9Ftnf+!4WqV1uBLbAL>rLY5{vc!nG+$npzWn#ge-t@TjokagX(GpUwAMqRM@GvGq9cgHkS5w5Iw&N|D`aV+gJ;OGf-Jv~ zrHLHZ(OM6M9vLk&h>jo%Lz-xN=%A1+uaKpQ4xS;$3bOn{mL_ssM{7M4dStZBAUc95 z3~8e6p@TxQyh4^HI(UX0E6DN-S(?ak9j*0H=#kMfgXjpNFr?ybf?y#K2ds=T z0%RV^CXl5G$riYNkWWxk0!ZXPC_o@F5A`Kj6r>9jR^asTA1nlwMlzaYCdgF!XhPTm zw-e+Eke9#$kgNa_0{IZa1F=B*z@i{kAk`2-un?sI05TF}KA9NiNSJmsK82=((gDmWHW2O>Y z6%Y{~{2NYNioB$De5$2N40+~X(F1QY~G6GunA*A6fav3o9foKp0 z`5zh{P$s;H09yf40}Ch+8>SX4NeKZpjC>=gW&p?_5C*3Li2op5FdM`KVTddw6+uXl z(;+e-7A2T0Q^?YUkWz>ogajD~5(Cj>VoJ56=|?L=&}7MQBisZ~^BdIs z1epP~1u6$EBA^Pup$L)zHDAF^F%So&i!w~HDbzCn;!|k(3<(RE;mBbD5`&}@5DC!) z5~C~}K)T5?g)B`V+n^Y(ALVLwL|=m68(?> z0I2|BSeXG<2oeCrKe&hii9k3Ab4h1`j3iwbTn8kQ;9RIj;Cu>A2L%Pln^5y0X#wnc zun5F-5D5(jI0X@dkdUGmtbq~&WEds-DR%}aBw((9`V?YBgHr8i`q9b|G+EM}2l62}V}MKoml+VBgSZemFbNR^F+mOh ztAiD`pz4PVdoi?tZNv~IL4Z02Ao&y)E)avkB#3~kfCL3NP{2yTERYHk9F1KmS%#3M z3CVu2euU@1UV?HVRTW495{58o69^!)k(@>xlPpaLqruvt9)?hG5}L-Leg(xd2!k|$ z8rw)A1rdS-7s6yxSs+tL)q|uSF>z2Z zffRs36huP{4`f%8!-iN!j!vi^>KFhr1rijfVSyA5pil#O98`3I0|PC1pzfi70y%7OB2Eduyzmu@jsU62SqkWJy;P9 z0{~<`$R08=B<2vB(fAaa4)Qn1Y^=t>f)1nroKC^Tqz%zzMRT!$iG$9-b z)($2RVo(-H6dwJw4*-yLP@Bo2(8>sC;RiQ~LeoKI2B;ecHxHEoHXTer!wD)43O-OJ z3*}OWg4jcWS(F=qFDSqf0kHx?LR<=BLkm}k098nksU#ajmL?=yK)%Oe28s_MY9J&; zJBW><1R_iU2{Msn?PO^}*n-FZ@HRGBHN+kW2^Ik74k`u!ve6I=NFu>W6-fsgpF-1- z3?6VM#a^MVeu9ZqLXV7=8AL}Ag&|F}J#_Rv8gSzaMa6CFH5jumA2g)B|vxQ^C(DD=o^nL%^}Q5e!h+d~J1WO;=w zO?2=KIaZM67qT>w<2qXFq0l3vWd_j^L}5r1Z4Vt3lI0b$G||B`a5*5)HwPnK0=X+pA;Ad}`6AY4F}Rb**G*h!d0a|@tOpwJ#dWd?Zh+VCKt0Y)}8 zJVF8D3vvPhqH~y#BRc@d@jXHhfieT3kR~iDu7{k-oFF~1RGyn#F2%wh{=zJRb0Fq45chb_(!a-~_DA+++W=PaC zvez8UUcE2j_;t zpLRh`MRp}RA6bsNY_LtBdKJu|uGvG)G;k1%O50L zm01vrK%q1`qA}vbVl)6C83B~XAYlPw4OWcqLUcZ@+zqK(!F4OBK}IWUhJ?A$Foz@? zC}&7GoLY{A`gt?}KmiKP86f5$#n9-2yAGWXm!L8OY7aP>jMNr6G)Q5I1Qr%h;gLgO z3jnYfC`3SbxCaH;v!FBj!5)QV4X_x<^B@csA2bBSfe7cI^AR#sWr0Hk9!ev-cLED? zXySlzsT$sc+Ax@pAprnR8XzVJ4{CQ)&2d940AS9A`5&DR6Q?o_vj&^W>64_Ls~051q^Oqpl4QeK8;-u3ne;ROJiS=XFMz{M#~KH z!f)v7f~SDN?G^OQiq5C8>tUfpXKQKfEAotog~e!@L0SrFu1*fo>|fPG=4i0MN?_bUuwk8x~4*wwA`eBF}hOSd6wa$P2%ruM3_62DewxGb=iu z#;zYCp+w_QfEYjG!(uc5APHfxljvmxI-kbwAMwcqDSStKSd0b$Qfe5)O!P7Wolj$@ zkN9MQ6uu)qEJgzWDK!jYCVClx&Zn`{M|?6t3f~bQ7NY@xlo|#x6TOT;=hN8fBR-iR zh3|+Di_ri;N)3aUiC#va^J(n#5uZ$u!gs`n#b^K^rG`PwL@y)I`80O=h)*U+;XC5P zVl)7dQo|r-qL&fqd>T7_#3vJ^@E!4CF&Y3!sbLT^(aQ*QK8>9|;*$wd_>TCn7!3fV z)G&yd=w$>tpT!^fCgSPh+Q#_+)|417JX1F@TnX z0$>Q_1@zR3&Zlt*fCe9}!MNe3j9M#~IPpuxgow9Ej7#z@4F6hP-J zNP0k{I}n{ux``y|fP~U$nE?tkSXhjf8KBS@i5QXs=$r*f4`_4;qVq{Nkt7|EP#P^W zK!FAei_tOz6dEHDLs9^pvmogKjqX5nKItZsqyrL4qh$st&|qOPvdaw6ya6aQMk0o! z06J$u(gPaZf#`hFO(aPNER^VMElF;qmtsg*fahB2W#!O85g!(#0f3Ym1~C)8j6mnp*y$ranIMJlh!2a=066L~#HJMb*g~vpM%9gm z0O1gzEX|IV8H7U^zY5C2AHUh7vZEnDix8kJ%@R{)fYmTCfVTHDKn6U(Y|yT4n1`T_ zU;rrvu^IkDRD({&0Q14x!30zYEDBZyBS3l~#)C+x2_R+vL0Z7(L6pEPg_s8x1Ze@Q z1M33|fwY2oAPc}EAO_eRkO^S7g0w-^!Mp=D6eI>#4OIX!2P6s$0kDA}0g!}F0H<5B9SctSNV?JZpu7UYpo{^M0%K5S0tWxV2YuFNM?hSKnx!xM?+v}ga9b{lJ8PbA%LtKjStB#&^!m{K=?=&!!jAzB#<~n zDTIV%ZBW*N@FDUL5+n-Fjt~Y&KSU9T4`spiBWr;RLbX8n5ET#-WC937cpwt42E+kj zxBx;Ohz0Q;gaj#rxC25W$wPEQTn}=^C>{-gArbU z07}T@yA_;Ak+h@n;aLh~3!DSWG{|`cDv6TcKpdzBi182(goGFXRszX<5Yu2;8)_a@ zEhMXB(E^bGDTZi=*#i=R>V;DvF}QjV2a4eeK#l=nh&V(TLPA9m93-cJtOV%*(W7`Y z1cpcmP?luT$_Q-j3~*)v*#csKFeryYXi#>7fY(WHE#ggay)qtQTZ9 zj1N%(iUtr1QlNlXFcFB&5D^FoX>=eQ05S=}1KR_Z29I%qtpUq|#h@%G1y%vl05udu zfrmc9Vjvz!Aqa!a2GJlFjpES|7%CwEO33896`bmkw4?DM83as%vl%$+fLI_~!Tk-8 zUN8sD0BHwhZjd?<4a$*VS+E2+GeU(xDj=C2WE_YEQUWQnz&b#}2phnLLAW4Ua7Kl2 zAzGj$$Q)1^1ycidImlYD;b0>{1j4N#IjCNQaUjb;CV+K=)q_O9cESvYCBVGz-m3aL=Og(G7?4p%hdXga;v^Lg2iMU_)8xN?@w6h=X)Mvn+@SQwd^& zRf7o-4+VonLHQUW2;xCl;Cv5bqR^;zK&7DN8KjVaioqykL&0Jg0$|ZmVl)H>ZwOG9 zX3@$BXq5~1ExO@QJ|bU&R6+zHB!~~q;E<{qDgdUiWKhs>28vFwLI{DX9Igtl7Lb1s zDiOIJE(S3gPNLcY6^3~an@Iz8+d&_EoueE5X`Wr>#X7${}t4`g`L$K~{~ zWgx?G)b8OH0+glM(K3V5^gvnoQ)>ID{?QO1Jp?FAv&57cU^U=H*6@|n;5r;>(H7JZ zU=a`-vQ!Gpg6amXlY*E5+QJH1mN zrUI-Vq!lC$(hfBjDKG|Q6R;qN0nrL^1c(G@F|cy5ED=Irbs!y(yb3WH zZV}jgkQlPTFhP(mkQ~?u2m@jWR02VP+yO2;5JIS$K;j?_G6iB4xNv}QVGF&$MMiWtNoxDcjoAmc!$L%ahf zAzY{glmoQ_VjRqNuxX>jXb2325CA1)^4*D6Mu6*9B-7v-3}g$O1IaWXA*fPt_5yEM z1@{WT`3RyKstB}41W6QP05m6pD41S|{UA-K+QIn~Aq=q=Vkkrllmx2-bvq#1K}JJ# zfk>z%*d1Us5Jey<2n$s?*i#5egc6YJA$EggL7E`$86`(UU}%H@INg%%RH~F2ASWO& zlm*FSAP&TFa6U)~oF75C4V3pl0w6XhFM`#A1mMa+A`k%x3CryuagZ*MD5Mwwi-3gS zg#(BKl80Ca7lsIdH9@RFr~|Pe?tsWZm7;JU@*tHUSr84ed6XOtfuRus;B-s2Q;8@u z!1)Da3y1;2pv(rLq4@;-4|X1i1H~Xo5JuJoZYv?=!Db=!fmOp~p)}dSKdNyw1O^}k zK*^STYl$c`K-m?PZ$KEFbwK$GWGiIu0F)D<7}NxSNP^TsDtCw?FbN{y`amk++Cc6H z$wKlx$RZF1DFLYmDFYh@RRUHG76i*eyZ|9Vq98*c5+JvLN-Tsy5Mw|FK-~%{A0Wyh zMnFVB_Jc4;23AUd*bw7jR)CBHi-JuYB}PMFXoLV|X%>=C5I#lYqZ2oFL+ zg&=ts!GW;QmB3VC5eI1i=T#5`jNyvF3@`x}M%Dq}!Q zWCK8a5XKP05CEwf#iJoGh(my~G>cY7fZG&Eo<%nt$_Lf22vrb42niJhaUiV%r~sJ4 zl0o6)8DIsd1gdh7kzjeeT2TChMh5(&H zV6@DjQ$UYeGa3TJBm_pwjA0Uyquv+|0Xl`iXqiE$fF8AGGz5l82++FBpv?S%31sw< z-GOn%sI8+RFgQbivOJBRyU_SpmoE&?a6od^&~!DD2S%BrAwbIz7%ej}LU**xzzC92 zfzc2^gaGZ!3~<{6ybS}s+XA!|1F~ZS;t;4Kz)L?tY)GyJv!J>`YbzmUK=gs-pliB8 zY=|gy9V$d2$Plm;XnP09MzHZ92GmlhGO!w$H4rhV!4P$$B%x&iL>49pmH-<95eL}==0XXux=~^@1V%#uB?KV(1VxAh4k<D@Wr) zvLYliLo+CZf=WQOLJA6y459>psDQW*M8f$H4uphgfwCcnLDYdHpe(qNP-P$rq!dJh zFsyulD+ddL36Qc;JQ@O{A%GeJlw}UIG6LL~Kr$bi4k$e zP^JfWD|KO zC>{-g(GWll0m?E5BzMB_uVEqWFQ^AQ$~8G)^x0nWN0 zTR;pD1~md8G&qZbxX2h}Bt#lQLW=?j2SS2`AS{r%U{gR0aIpXp2Z=#hkOBau0Ry%U zq6482#D`0Ogh>sHQT3xCFfu{_l2yp{D=32_>qX;(vn@yrWDA@F%JQI`43Yq8hDw4v z7@%AW%KM<623Q=d2*d+*UBFox!hsY|ASGZyuq?;~kiifPI{F4I4;BX54lxUEC725_ z2TH;;LW~3{9L1v{Fd71AApp%)Xrjb&A=wV08jX)`IFt{ipxPij2niK}@!a`R9 zQ-wtwqybb)fM^JYD*`jX1VjRf1c^d)fmlcqqs-9|7!3h<2vC+g(8>rzbqz5e-Eb%$ z)R2HE0Fe+u2npgtivn!CKM)extWox82#kgR zECk?r2_`@ijh?&E_>>t=l1oMvkA}c#2+$`4D9hGpWdxyi27SCVYRhN{i~<^lz-XC4 z!@wOidNc%vVF-+t8N)DAN4+!}0yGSP(K3UEfjesSXb23$5TJFLL7Djj6X58hGy~&` zQCmktU~q;2WqBGsccJl7r#lB{0ARXmXu2BHAEP3pAwZK57%ej}f_1dazzC92fzc2^ zgaGZ!3~<{6vfl%=oEyAk3uG(OqAd^?Bo0yvVncE*m<197FAN9kg$schpoQijZ6M!3 zOarS1&G}hvRX7g zBsZeudQffz=U*g?!F*`01<8XjL@PuQh=lVY90&1`C6@$QWcKL>fXuivkD-LV|=KEU@cA1Oy`l z5iDrYfG9IS&VxvU?1!)*B*GaW8IZbBJQ@O{A%GqNpv;CYMm!&s!I4#?@xfUUBnGkt z&H-h4P)-I(fHXrT!5s`xwgqKxP)`Fa4ps!>f%+2QtPJ5miYJf~upn3#WCF-w2nJ2G zfaSr$Alo5k!L0;yA?83ys8JwCfK-j*(GVC70n8A9<|<4HqC_Cs4xto{k8U`W52c{m zAUp^O6@p}X1P8)GR{~RoMI597R7!wo2!<;HGr$By0*M5dM&JSiyF8N8QRZj}jMxyM zEO(%l5wPkS7MkdWL;0YF1WXAyi^6h0Oc10Fnt@?L5G5c9BoR>S0^JF4Xba+8H$T z$EeYxAut*O^a+8{GJ`(hJZj5m2n?4H7%ek~OH7XXV>ATl69S`U27SVL)Rxf@7%m|& zT4oHFm>l)TXb8|J1V+mY`h@eSEu$eYTtZ;9%or{)IqHwm5TH*8jFuVn3FlE;Mnhn@ zgaB>J4A7d(Q9K#~qaiS?LV%*eZ*)x;MZq_!c{BuuUaQkZNSHVg2h1uC7=sCrm0(dg50<4NG+YkCfCz%@0BMBk0Wl%c5E3K|5<`?3ARZD1F+nDQ zXs8yDkq8WxKnRSoMnhmU1h9nwD67E4NiH(b%LsHnG;>1E*a6uDWEW*nm1t1L4G>S(tAQpinAuO;2)EKA;#2^TXC=6hlk+VL+7?3Q~ zC=@{u2XrPVxbp#01QCE*2&149FzzTl8UmvsfIS32Sp^~k&8-j)kt8%z!&Rg4p_vmo zi$eDvL^i)FM0$RS&Xn z6px0$Xb9jA0Z>)}%OY|Qm`faiRz_g!n}G8vNFA5~>KK5mgm9oNQ04{M2N6Wc<{%Xy z0jLtV3WR}hA(-U|Da-~A$a*jaDFRuEz#yAI7$Gvs8V!Nb5Wo@w@N5EZxnog)R|q}p zq4B}_86*a37=Ss@3=3j|#X$tf2Cy?g1k@Q2aR`Z8W`NEO2AKjj5;_9{(F76!mn{%& zU_r2vU_nR$0ulscsG%UcAsD6-!W$(=Ltr!naD)ITtAM0H%?xrdNG}3Iax0t-?c4>Af}0azD^084-gl-2=A1X`egR1w4=^!|c-2#kinkO%?PYz-1Ra8=9$aRC#6Y%yFnCE7$O_O(ZjdZU5^O58 ztOD^t3Xv9VLYSbU11qlOcStU0@4FiO~=k4FRfz03^F1 z8-+Z80LhogviR9(>OpxIguz7x*d`DG#b60&&IT(05l}f$kpe0uz|v4dAyRN%5C)tC z6&GODP*WfhAPyMgclN04Xb6mk0MQ`;%86)-p?MS}io^tQ31T$$@Qe$x1%ly1psWlM zf|v>fX43J7l0RkaGYC#ww4&s5@7hn;HDG(AY0I^||91Vfd5THs3fU+AdgP{Ed zT+&#?i7GQd{RK#t23dgQ0Ei$spMy&P5DO#?!jLuugam1Wv@4(_NC8v_xRnGk2rLRw zi^Zv0Zgaj2EU<@fOU?kK? z7#Cs`NC&(n0ucghg^EM18Kp);U^E0M3IXb7C@f_LIP-$U!3Kv^IUfK)&- zJoxM!1}F*2^vF_RK3E;x1TX_?5{v?ChjKt#KsJox(GVC70cwN*C}UB>9Ecgv>Sl84Y>6Gn;A5Eu;sibH_9ISQO(5pKe3IEo~g11(h$`mwOU3em+O)?$@HS31fc z4S~@RpezKao6#Vd7w#ey!%;Zk?gd;OhzD+B!21#Cis4GJNARtLx2_` zK;4Xnugsu@>qpHT4S~@Rpmzw2mKpR8@lpFmLtto!z-XBoAYu>_dMx~~^!rHn6exzN z7Y3tc2KB;naGL~5H((5ka!@}7+$jOyB?0c5fbN?fzvmTWCI}~ia=~g7X`u}C5LSY zfTEguo*OMQs27%_CXI%`;0%G$GGlPY%c!eHLtwCmz-XBU zGU}?)5E!f>Fj{5|)|eS}*Jua~&JY+aGX`h8jJj$x1O{sejFuULHD*TLH5vkgGXzG< zjKLW%qplhafx#LAqh-cmjhUhAF6ySKp&Jgv)#cQUU-UIy;H}c5#ApbNhQM$N0jd^; zXk`Xf%^o#uh=c%SkJ=D%?5HybIs`_`jDe1Ufwv!Ap$@z=MqMyOLSVGa7$OlxLuZbb z88i&sVQBPdnK29_l{7CgfDhB4?l2i?E*Mokq(We{%otM9MFYoz1~Z_?@6f>XQ6q<6 z2#l5)!!J%r^ARWofR51^ZD^1dZX;JUD8-Ci-;etIKd6}jK7xESC5)y9;zD3Fr4ScR z!&VhI0f5>VV8*cZ=BUT07XqUxg?eE*6itG}Kd8(Y9S$Fg@i!1|hNPK+uzA$Z!4LwF z_=lDmU}`Y9YSaybIRqeSW-z;O)NM2j0ci9?3JVAaJiq}S;h>?tqec(m5P+nUA?$%s zr&ACDkn#b1#|h|qHBe#z6(1l>fvKZfhj$2olF9J);i&I$hX5@0p@js93u1yWZcU>y zBRm8^$z+5F!N~PKteFAoiGV`^yd)IX>;Q|55~Cr29s;9f26~8$AU-_uVGWDXGGheA zKG|M{CmXU&7}YpbLjV!?urdR(!VBK)7^)r{bvI2z0FiEJYR#zOgE|D@Wd@{Q0_TEu zuMKL4k2-DuLSVGa7=S<@bXLL(3A8d}w8b&#qG}L0Xtc~21d%Y{PCzO%pxqOQlSbPa zkZ>3!kwaj#%s>u}k;+CcGe&9{jQX3{5Ev~phz+UXtZuZ-7|yXvZNH6{8PpEZp=jP{ znK2Y&ZJ^vdT4oGX$PXraN6U=C6dQxxEu&?|V2>esxNo$~phqYV7duAFjNuZKl=x$` z%%CLnMw;HyGGnC0I5z)+&jSS!AW6tB6c7nITKGR~@^v(&fC6U}gA&AOD2#>xWE}>K z1TE|WwLBn&2r6s9!wP&E%P2u&2v9ZJMr#kM2Imkp3{qNv$_faEkcct^;w@0=0bvaw zIVc=4fc_`TYU&2sXqiD)Bn&f6C}jqy3IjDjK}iEtY(V&f<+xDlCjVg;kGQ-;-9Q5+ z3|uyiijR~KKq)goCw7574k|E^TO44)fhMS%{0G`Mbh4kifi_xZ&?(vmwKb4313Kgh zE;B%>486<%i4C|n28AOAJQPTD0CfXxw9Fte_=lx(Q0V|l3E;8=G-Cqpn;;V)_Mq@O zb(8;~@DlAELES(Dr4(d0gF3IHcr*l1LjXC23^1Fz$$x-7Loe&88)z712EDv7YR^yz z0Z3wlkb}d$gUKy}BSeUB1$6@rOPN7k3$Xc!dNyD)37Z%;SKt(**Z`a+4^fH16d;4i zEkh{&H@B)vpgWLmA z3lRe6Vu%bx3ZxgphiC+eLRcUYVi$-7UJ3w`L{2RD&>BB}5*o8CL9oxM2H0vLKxx3}QpHK}dvRxKgl1 zNa7Gak^tOFWHGS8U^Br4$Sx2D2}2wLVnL)pHbHqHB_Qr7hJ*kpSRkx{CkK;T20k>1 zbOCh(4Vu^Cc0=zU=EDtdR;dH12pcF_62!jk9#o!PaOu;dj z+yV}qp+HbK&}dX@tuH#3%#{q6K6n*f5YZ$Y_Wz z2nm)1se_mbG7736BnXuSSq9~T%m6C|sT{@d5CDYh;0&EzF0AaW&Q4G>` z5M}I;RWz8wV=%d8$V4c01C8i11E;l62`B}rydi;!5JKa_S^+2uKpaRb0HPXX5@bpwr1nK5L7Wz?ax z3jyjTIm+BQnA}2{Pw1$dx`8%YX3#O}hN@N6O>&fl!eDX>Wj>*!Zt4cwXqiFBs2i$Q zQ8&p^77ByOEtL6$j=HHEXrpBY9iwijT1DL?M_DKgCbv-L6FTaqZlH~p8FY-gp=uR% zlN@ECFqqsznNR4bo4SF9rOcqN1sEYiJ>#*NgiQ>?3HSskHUOXDLsV`sg~?!Y%aDmq z>INF!%M5BdADdaK%;iVYyiwjrT-Fa^nAa?6m2Jdh))8)!qi%)q^t3lvafV(Nx3 znT{A-+6GgQ3?{b>u2{n38tMib)-nSu2suXwy51YI3JbC13gQSbAH;;H1vwfd1l9vG z1Hu7qCWWlUf-eAtW_FM~mk zG7Cd1vH;i|uqqHSijhJ99J)ySfn*LQw+v)BkYqP?0}Yf5k*x>kPEclqF+eno56XNH z#b8H(2ykHnQUl_E)PXTb0L%d8V~`A38H@un215cx6-XAU5@H-=QwT^H%7+MmOoiJ8 zVn9`Zn6S-g5DicX5CxV5>x4*wd<7DRVGw^5!$JTQDlqmy(}T$^105Db+fUs3~as`MBHxwcO5<*~*&7&9=0?>eiaR-zhOl}#_fFQ+k z>INE>%M4IY0+Ja)&V=mv0I}e?5yk=0AZc*62jyC@09ZRjKS&H5EFe`7?O+n34lD~% z2oeC757@*&l3)xWzkA z=Rh(v$WW+SupuaVK_Valghe18#2By`gbOkf%mt|jb0Fdn5-fm_hH*g_k795LfWisP z7z6}7El}hZ0zSeg4Uz+4eD;InLCKeJ@d7o42*n^Xp{hxyDA9{)8MZP594#PgKnxHD zWi<#5$xtvka7KejK+QqOK!ic+Az~l}P%)4o2xCY~70>V(EKZMM z50!&c7>YnLU_mee;z2N&3%3d)MkEQ=N~GEmqHHh)2`ExQ7@R;rsTYhvIUgblVu7Ls z4FE25;U+-UA@d<@P_qWYLXc1~6cZ7$cvz(Cz+>1jks3^4 zg2j za19U@Aj2R!A$$-CQ34@B@=!4l6J!dAhDw5DKo%gJ4U!}WgH0kwBUU|x$_%WUMg>P! z2v9f4Q5JTH`~-3poCjfmgdoO)GB7y5fh9oVAPmWrU?DIQBnHNy+6l%0YlWEtGXs+I zK|HWBur!nfs-D1lAm+kJuo`fF2MK{xfwY4#h!5@tfpQ#h|4FD6=C(Ksgr5gHj-Q2!;s29ROi~>;)MM(g?zEMIZ@?5{M9p55{2CATf|~ zC5&{$jAZd^Uv`B!8gE|Qy3^M?%0;C+&MF5!w z%D#|N1Ed6;wZXz5gEnL{@O22-NIa0^5LLgEWzTq@w=a0WPkf_c#Vi_cgL zIj}|yQ4|3TC1?U@T!>z*f)FW!Bqe$=4IeEtFvDb21T6%po8-_8Cy|Tc7Ki}8+znTO z)hdWAsES9D1{nu!ctAzr%AkCl6d{Emd5F;nBS2yZ9<&*QB!K2RR2d?8Xyy~41D_Hs zWd?OEfLjhT7DmG*kQnG;i6lh<6Q7L~7&~&b4yFJcOl}!6DS*0xM!zxxT6*GhK1dFP zsT~)zFq7JD9L(kortlj~ZW+vRhT=Br1{xj93`n6t$oYiiQNn^q4lT?i(&}NMY%qo2 zU~Kf7J~3WDnP{rx)3%oh(#b15MCT*ks1P^5GPd+t<(=D zx6sOuR5zEpfdh4jB)DQrLHK}@NrG7BEg;su~y1CR1 zG~&t((6SXsHUur3hq?fqM?q|;3?xTGNw6d+&%!0)3`mGTxF8jX0t#vv)Cfpc2U!Rb z0Lh{EO(14KNU$74F+>2Q0mKK>5IaXn@b9WJYj42lG*KJ4h7>W0isHgs1>#aIiTbK63d27K9i9BSAtSWiUR74Z>hP#9$B? z>JzvCSPWF!K=BAj8np5vC@5)VHX(CC#Xho{fpiP9JBAdSx`77GY48vLWjPQA=V~wm zlr=$iLO4(sG#?`8c91+s7Bs|(p$8-h)&o`nwG_k#F(Hd`Axc1eutKO2U^O5%wB!J( z0$~srgh2zZP**@Hu>BxmxG`Yua378`NDcu|B#^9$Y8p^Wje&Iw)jUOCgQy#5&^!wF z0wg~|NN}EnZXVI1iqmkwlP~1k(-{1rQ+!2{H;&Y=A972!bTAV1f#; z=)opLEpxD$JrcwQJp4de1RBr-?iQ#!h7?8JK*L*Rpj(B`M}!+x21+5s;bjBD9#Ely zTK!|u1u+4q1Voxxl1j!9Yu)fuHwXd{UTO>iw+y`qrf#4i@-ieOsB1dJ%u#ZPhrpmn z6wp#*P`G8N#V2(GZM4i7YVkh+?xk*$Bi93vLSt~ag!p2;(YxRh1H9gciiVC5qo^B4Sj!BsAY{u1Xx%qty*7vhOMt@} z>I!f-0mO#%X}~P7A`lCt5Mm0bV+vZ?4HALY6nJ%lb;A+~cquqY7f2M0AtEpbfvg5u z1Cl})gINl96G#!rYOoO?oggQH1V&RMC?v3BP@rL#0fjeC8EQ&E6T@gMkrk+TBambh z!I=q37bqKnFgTBb7$6LaDF_V`2CIg+0z`syA4nXc0wM(BgVceg$^OF zAPN+EFbs|t5C;+~2o{77mWD7PQg9NIvd~D7au5dD0@8&jF~ISN?z~Yxp%6fdKtf81 zkcUPKTqPtj;c*CxIS>YCbR?U>d{9jTsvkh&5PcvL62TxbP;^5uNDQh4W;93$WHJbY zw80Dm@xd7EB&ZD36ch@=fsk;+U}*}Z59BnEsUU;E-UPV`jKMM>B@pEx-4Gr~=_tks z0Z^cU1;N1x4^wE^gDH>_Xc$5$kN{W@I5Ht(ASQ$bC&8LQ(Ew5pNg@zAkXndM(CC2} z1`&p`M=2sh02H`HDkVZ0G!?*A!Xpf14V(kX=pZ48LJ$jqp)81M1P7!Pi3dp#;5dh< zgcu4Efbdb&f;5BLv7qDxQUbyl3P1v21>ls2$^#hyF&8We<${cXG9i*6O;8M?KysrP zJp`a315GPX3LKP>Kt#kOsGk85L*#UjZipC23xowHK~{m3f}{|}K()XnA%zEs3swha zj1t6$04O|(S4~JIECImOfg%%x!Epm(fG{XuLTIosh>MItWTEQ|(u0>*~WU;`m$Ky*Q@0tkOJ`N7gPwu2b+l` z2<{PplLA;f$ShDI0cBkfjiM85D%1dwBnX4d1nC4h4@^UKfYd?^gKGfU0O} z6)XWU4MKt=4WtCb1;sMh90&msg0M$PB13?>fd-0DWQ);Fhw`BmR3(H5A)!Lxct^0Y zvOpR@7@Vw-RX_yMM8JZego7-OjSW_aCV@>1O$j=e3@zwJ3|Bt(paF@3;|H9EkSYgI z>j0F~K?=a>0;~Wb3M#w7B{oC|OoGdCkZEAGAQdGvAwbzzlGbLP}pSL2yk4F%PO1O2HK%7}#X6i6L}g zW09@{n<>LnjL5J-C_}I?0t6xjA(169MUZ6?Y+}_Rbd0h1J zGM^%pAy^n*2DK$XH3hbWhesRS9AebK6^}9?AwbZWd>jg}d7jJly}6?KywWuY*b+(Ma8=%|~zfi_xZ&@t+Us#VlYa+HO_U~&s( zKB1#->IT|qnL)>>8>&`OH_1^J3WLcll=*~?x~Uszqh$siqi(2LMcpJvSttx9w@~I2 zI_jowppBLpbd0*8Y87>p9A%*}nA}2{Pw1$dx`BpKW`H&sj^fb}KnVdlCT~JkQ8)P$ zvTc~iQ#a5s%8X$WN~7MOVhB(-$x-I8!Q>Xod_qUv)D1K&Wd?OEAP_R3>WqMrQR#sW z0lKCL0-haAZXw{*!6QxGKpXHf17nlx;0ftbmq0^+x=9XdD4En?atoPWpuaZi2HI$u zLH`&WayC*o$x-J0!Q>Xod_qUv)D1MOWd=wPWDN*I_R)g2r9%!i0I?vx1*rm`j)LU? z1gHuy1=ayF3bLgU%!23z?QcZ1Gr;N~WY!{4Wx-tz<-?Uh zvpGy2a!?OQ7E;bYltW068juVs4_O`96(9kSGLZ67JWwGpm||csxn-c@gJgTD8)(Fp z8K52mBzJ@6IiM~8YX!4Gf}k=5dzpbG3sM9!2P_2QfH2qyP~iX$3WO9y2-G8j^jg5u zqr?D&05paMz-CM<2a{VcT{lQYs2gbDjF03~P>u%I@E~j89FPJC2PzC!0u=>O(9#0Z zvH%Ofay+P1fXjk75Obg`7zH;Eq!+3JW&*-WkmM+)e+YnLfc~~(w{bAJ1-lCep(u3& z4O^K3&a)s1FawlzL3TnoP!=SQLxe#29$qRS2q^o*Sx^R2nE@3+qR=!W$&51T z83KbT9tM+J=otqT*+tzz!&_#cTZPU?DFi^0APn;ygbg7fVjwoCr2*kVNXU>UgpEOh zG++ph3eY_S22(r?Cb!T%BFMFnx`Bqb%pli^qxyzd2v9f4Q5H6X$t{%mgpRtY8)&0t z1|6ers9HtcBu7~&3?{cw<`X*Vrf#5(mKk)6x}jZWd>jg}d7jJly} z6?KywWuY*b+(Ma8=%|~zfi_xZ&@t+Us#VlYa+HO_U~&s(KB1#->IT|qnL)>>8>&`O zH_1^J3WLcll=*~?x~Uszqh$siqi(2LMcpJvSttx9w@~I2I_jowpkb65poN*Ecr*l1 zLV%9Rn~+r~?i%F~83Ketl_YtLGJ_=Dql!mF2vE10qAbV;lUpeB2_1D)H_%4Q3~ELl zb>oJbE~Ch-!Q`#MDT{n%E8CWBpTtVta4!N$Nw!XpStHIc$SauAs8M!Q`pIP6sGJKtT*i5g-yY1rCm8 zkT6&^Tm+mDpmHEtkaDn!;YEPFHduT_L$_c_10dT#y$euR1RBqffB+`}un0H}K-7Wx zkTd`iKq)go=?Xc0LCXweb08+uf`qz;N=Addf@BtTO-C|#a5F*PhD0_f-Vr>w7+44r z!C;?2(ib?rfOJ4o0F(t*Fq{aG=Ld^_Xy+D?$?*7wMkPcHLPCTPX#lDgoCc6pz>5kv z16d`=6sT%Mq5%oeGJvUT{%Dy2jw?{0LSq(0fiNsBK%_w71Y&_ygJ?*Z0V6?bVJbkf zAXUQ%4<;|s&MhF5ArTMG*I*_@3_`+&CO{Dj6M+>AFg{olI5mJ&ff*1XIEgSDEDJUO zY%)XxZAg&wsAn=Lr6Ze0UDJ_G9@K1*x4{@39-yKC+#&@We_2sj-;2&6OsG6-BAfYK32 z57-0@Wk>=bMYO_D*HFoLh*uDXQP*^Yxr3Vp@il}*xRekdq!L{XNNm{Q!Q@Grxdmb{ zgoMW+8W&V|z~$f!3`HOrupp?o0dWQzgB?RPM~s#kprC|=DTD;^!8HV=7J+g>6sRjZ zBEt(MU_c=;fS6`(ffx)Sq5cD9c~F}Z$^}uxrvZ>kXgUIE98iqnD~eq*BJ%*np*F${ zpl*_*Ebs=CTPX7h9d%PT&_>G)I!4`4wTik)jIT|qnSmqh z5leDF0S?BXNx}KH6-JxYdVs_LxBkm3=jnl2hch|$Z}yQ3zQlldr-i_AVm-v&`tvo51eL( zf>%j$Bh+Uk>7kY40dor|RY0Q`^9C{KE=TOT=NFX3gqps-)a|b;O8W2zl;#^3v z016Ta3tDDCx-D=ac$ooD8!*ElrVM=&6as_A7X#uJXsUox@CXMtJ3(7h!QByP839fm z5Lbej5Ed*&z)YZXXhI!9C0o%wL0!|SEmoV z*aGq=9jqbBiUD#9G*v(-kQ*QvLV`*Q7z^YHNLd0BgU*1}q%F zDFhNo;1UBQ4jCs034&Rm9t%i#$oY|I2M;FS4F

        +yE{mpz#k*3gA8pxM%=NgTz2W zLLP_>G>Nsh8m7))-V%qMizP2E5nEi>pC zbwkxE>LxkLLSZnug)*PeQ8#r1ZM4jwW7G{*tEijgC<}$bZq0A?A)J@$$8!a>F7Xod_qUv)D5)JGJ}p$H&m^n zZjz%c6b6%9DDw#&byGLcFv<+j`o~c`8UiRGK*!`w$SM?fjdF+#0Yafll015uL6YWC z#iJoG8UiCO1V+n@5f|m79v%$=ib7zt%%CXvMm3Lyz=#Wh(K2JiMfs?QM?-+35Ev~p zC3cgXzqaiTjLSVGa7;#ZP>fzB4peO`J%M6NwZ&dSW2#h!|T4s#6C?ECkXb4ag z0;6RHMZq_!c{Bt@TnLPo86z&rM?E|m0u+V7XqiD#@QrF74S^9C0;6Tdh>P-3508cb zMIkU+W>6G-qnbxUV8n&MXqhqMqI}fDqai?12#l5)6b0X?=Ft!saUn2TW{kKfANBBP Y2v8IPqh$s~!8fXTGz3Om2rw`J0AA){^Z)<= literal 0 HcmV?d00001 diff --git a/docs/verifier/VerificationAPI.eps b/docs/verifier/VerificationAPI.eps new file mode 100755 index 00000000..2eb5f4ff --- /dev/null +++ b/docs/verifier/VerificationAPI.eps @@ -0,0 +1,759 @@ +%!PS-Adobe-1.0 EPSF-1.2 +%%BoundingBox: 0 0 1074 740 +%%Creator: JASC, Inc. +%%Title: E:\JustIce-Paper\VerificationAPI.eps +%%CreationDate: 0 +%%EndComments +/width 1074 def +/height 740 def +/pixwidth 1074 def +/pixheight 740 def +/picstr width string def +/psppic { +gsave width height 8 +[width 0 0 height 0 height neg] +{currentfile picstr readhexstring pop} +image grestore } def +0 height neg translate pixwidth pixheight scale +psppic +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF0000FF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFF0000FFFFFFFF0000FFFF000000FF00FF0000FF00FFFFFF000000FFFFFFFFFFFFFF00FFFFFFFF000000FFFFFF00FFFF0000FF00FFFFFFFFFFFF000000FFFF00FFFFFF000000FFFFFFFF000000FF0000FFFFFFFFFF00000000FFFFFFFF000000FF00FFFF000000FFFF00FFFFFF00FFFFFF000000FFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFFFF0000FF00FFFF00FF0000FFFF00FFFF00FFFFFF000000FFFFFFFFFFFFFFFF00FFFFFFFFFF000000FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFF000000FF000000FFFF00FFFF000000FFFFFF00FFFFFF00FFFF00FFFFFFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FF00FFFF00FF0000FFFFFFFFFFFFFF00FFFFFFFF000000FFFFFF00FFFFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFF0000FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFF00FF00FFFF0000FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FFFF00FFFF0000FFFF0000FFFF00FF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF0000FFFF00FF00FFFFFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFF00FFFFFF00FFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FF00FFFFFFFFFFFFFF00FF00FFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFF00000000FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFF00FFFFFF00FFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF0000000000FFFFFF00000000FF00FFFFFF00FFFFFFFFFFFFFFFFFF00000000FFFF00FFFFFFFFFF00FFFFFF00FFFF0000000000FF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFF0000000000FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00000000FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF0000000000FFFFFF0000FFFFFF00FFFFFF00FFFF00FF00FFFFFFFFFFFFFF00FF00FFFF0000000000FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF0000000000FFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFF00FF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FF00FFFF0000FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFFFF00FF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FFFF00FFFFFF00FFFF0000FFFF00FF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF0000FFFF00FFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF0000FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFF0000FFFFFF000000FFFF000000FFFF000000FF00FFFFFF000000FFFFFFFFFF00FFFFFF00FFFF000000FFFFFF00FFFF0000FF00FFFFFFFFFFFF000000FFFF00FFFFFF000000FFFFFFFF000000FFFF00FF00FF00FFFFFFFFFFFFFFFFFF000000FFFFFFFF000000FFFF00FF0000FFFFFFFF000000FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF00FFFFFF00FFFF00FF0000FFFF00FFFF00FFFFFF000000FFFFFFFFFFFF00FFFFFF00FFFFFF000000FFFFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFF000000FF000000FFFF00FFFF000000FFFFFF00FF0000FFFFFF00FFFFFFFF00FFFFFF000000FFFFFFFF0000FFFFFF00FFFFFF00FFFF00000000FFFFFFFFFF00FFFFFF00FFFF000000FFFFFF00FF00FF00FF000000FF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFFFF0000FF00FFFF00FF0000FFFF00FFFF00FFFFFF000000FFFFFFFFFFFFFF00FFFFFFFF000000FFFFFF00FFFF0000FF00FFFFFFFFFFFFFF000000FF00FF0000FF00FFFFFF0000FF00FFFF00FFFFFF00FFFFFF00FFFF000000FFFFFF0000FFFFFFFF0000FFFFFFFF000000FF00FFFF0000FF00FFFFFF000000FFFF00FFFFFFFF00000000FFFFFFFF0000FF00FFFFFF00FFFF00FFFFFF00FFFF0000FF00FFFFFFFFFF00FFFF00FFFF00FFFFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFF000000FF00FFFF0000FF00FFFF000000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FFFF00FFFF0000FFFF0000FFFF00FF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFF00FF00FFFF0000FFFFFFFFFFFF00FFFFFF00FF00FFFF0000FFFF00FFFF0000FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF0000FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF0000FF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFF00FFFFFF00FFFF00FF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FF00FFFF00FF00FFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF0000FF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFF0000FFFFFFFF0000FFFF000000FF00FF0000FF00FFFFFF000000FFFFFFFFFFFFFF00FFFFFFFF000000FFFFFF00FFFF0000FF00FFFFFFFFFFFF000000FF00FFFF0000FF00FFFFFF0000FF00FFFFFF00000000FFFFFF00FFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFF00FFFFFFFF0000FF00FFFF000000FFFFFF00FFFF00FFFFFFFF0000FF00FF00FF0000FFFFFF00FFFF00FF0000FFFFFFFFFF00FFFFFF0000FFFFFF000000FFFFFF000000FFFFFF000000FFFFFFFF0000FF00FFFFFF000000FFFF00FFFFFFFF000000FFFF00FFFF000000FF00FFFF0000FFFFFFFF0000FFFFFF00FFFF00FFFF00FFFFFF000000FFFF00FFFFFFFF000000FFFFFF000000FF00FFFFFF00FFFFFFFF000000FF00FFFF00000000FFFFFF00FFFFFF000000FF00FF0000FFFFFFFF0000FFFFFFFFFFFFFFFF000000FFFF00FFFF000000FF00FFFF0000FFFFFFFF0000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFF00FFFFFF00FFFF00FF00FFFFFF00FFFFFFFFFFFFFF00000000FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FF00FFFF00FF0000000000FFFF0000FFFFFFFF0000FFFFFFFF00000000FFFF00FFFFFF00FFFF0000000000FF00FFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF0000000000FFFFFF0000FFFFFFFF0000FFFFFFFF00000000FFFF00FFFFFF00FF0000000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFF0000FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFF00FF00FFFF0000FFFFFFFFFF00FFFFFF00FFFF00FFFF0000FFFF00FFFF0000FFFF00FFFFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF0000FF0000FFFF00FFFFFFFFFF0000FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFF00FFFFFF00FFFFFF00FFFF00FFFFFFFF00FFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFFFF00FF00FF00FFFFFF00FF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFF0000FFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFF00FFFFFF00FFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FFFF00FFFFFF00FFFF0000FFFF00FF00FFFF00FFFF00FFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FF00FFFF0000FFFFFFFFFFFF00FFFFFF00FF00FFFF0000FFFF00FFFF0000FFFF00FF00FFFFFF00FF00FF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFFFF0000FFFFFFFFFFFF00FFFF0000FFFF00FFFF0000FFFF00FF00FFFF0000FFFFFFFFFF0000FF0000FF00FFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF0000FF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFF00000000FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFF00FFFFFF00FFFF00FF00FFFFFF00FFFFFFFFFFFF00000000FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFFFFFF00FFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFF00FFFFFF00FFFFFF00FF0000000000FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF0000000000FF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF0000000000FFFFFFFFFF00FFFFFFFFFF00FFFF00000000FFFFFF0000FFFFFFFF0000FFFFFF00FFFF00FFFF00FFFF0000000000FFFFFFFFFFFFFFFFFF00FFFF00000000FFFFFF00FF00FFFFFF00000000FF00FFFFFFFFFFFFFFFF00FFFFFF00000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00000000FFFFFF0000FFFFFFFF0000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF00FFFFFF00FFFF00FF0000FFFF00FFFF00FFFFFF000000FFFFFFFFFF00FFFFFF00FFFF000000FFFFFF00FFFF0000FF00FFFFFFFFFFFFFF000000FFFFFF0000FF00FFFFFF0000FF00FFFF0000FFFFFFFFFF0000FFFF000000FFFFFF0000FFFFFFFF0000FFFFFFFF000000FFFFFFFF0000FF00FFFFFF000000FFFFFF00FFFF00FFFFFFFFFFFFFF000000FF00FF00FF00FFFF00FF0000FFFFFF0000FF00FFFFFFFFFF00FF00FFFF00FFFFFFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFF000000FFFFFFFF0000FF00FFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FF00FFFF0000FFFFFFFFFF00FFFFFF00FFFF00FFFF0000FFFF00FFFF0000FF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FF0000FFFF00FFFFFFFFFF0000FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00000000FFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFF0000FFFFFF000000FFFF000000FFFF000000FF00FFFFFF000000FFFFFFFFFF00FFFFFF00FFFF000000FFFFFF00FFFF0000FF00FFFFFFFFFFFF000000FFFFFFFF0000FF00FFFFFF0000FF00FF00FFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFF00FFFFFF0000FF00FFFF000000FFFFFFFFFF000000FFFF00FFFFFF00FF00FF0000FFFFFFFFFFFF00FF0000FFFFFF00FFFFFF00000000FFFFFF000000FFFFFF000000FFFFFF000000FFFFFFFF0000FF00FFFFFF000000FFFFFFFFFFFFFF000000FFFF00FFFF000000FFFFFFFF0000FFFFFFFF0000FFFF000000FF00FFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFF00FFFF000000FFFFFF00FFFFFF00FFFF000000FFFF00FFFFFFFFFFFFFFFF00FFFFFF000000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFF000000FFFF00FFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFF00000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF0000FF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFF0000FF00FFFFFF000000FFFFFF00FFFF00FFFFFFFF0000FF00FF00FF0000FFFFFF00FFFF00FF0000FFFFFFFFFF00FFFFFF0000FFFF000000FFFFFFFF000000FFFFFF000000FFFFFFFF0000FF00FFFFFF000000FFFF00FFFFFFFF000000FFFF00FFFF000000FF00FFFF0000FFFFFFFF0000FFFFFF00FFFF00FFFF00FFFFFF000000FFFF00FFFFFFFF000000FFFFFF000000FF00FFFF00FFFFFFFF000000FF00FFFFFF00000000FFFFFF00FFFFFF000000FF00FF0000FFFFFFFF0000FFFFFFFFFFFFFF00FFFF000000FFFFFFFF000000FFFFFF00FFFFFF00FFFF0000FF00FF00FF0000FFFFFFFFFF00000000FFFFFF00FFFF000000FF00FFFF0000FFFFFFFF0000FFFFFF00FFFFFFFF00000000FFFFFF0000FFFF00FFFFFF00FF00FFFFFF00FFFFFF0000FF00FFFFFFFFFFFF000000FFFF00FFFFFF000000FF00FF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF000000FF00FF00FFFF00FFFF00FFFFFFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF0000000000FFFFFFFFFF000000000000FF000000000000FFFFFFFF000000000000FFFFFF000000000000FFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000000FFFFFF000000000000FFFFFFFF000000000000FFFFFF0000000000FFFFFFFF000000000000FFFFFFFF00000000FFFFFFFF00000000000000FFFFFFFF00000000FFFFFF000000000000FFFFFFFF00000000FFFFFF0000000000000000FF00000000FFFF000000FFFF00000000FFFFFFFF000000000000FFFFFFFF000000000000FFFF000000000000FFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000000FFFFFF000000000000FFFFFFFF000000000000FFFFFF0000000000FFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFF0000FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF0000FF0000FFFF00FFFFFFFFFF0000FFFF00FFFFFF00FF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFFFF00FFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF0000FF0000FFFF00FFFFFF00FFFFFFFF00FFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF0000FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF000000FF000000FFFF0000FF000000FFFFFF000000FF000000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF000000FFFF000000FFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFF000000FFFF000000FF0000FFFFFF0000FFFFFFFF0000FFFF0000FFFFFFFF0000FFFFFFFF000000FFFF000000FFFF0000FFFF0000FFFFFF0000FFFFFF0000FF000000FFFF000000FF0000FFFFFFFF0000FFFF0000FF000000FFFFFFFFFF0000FFFFFFFFFFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFF000000FF000000FFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF000000FFFF000000FFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFF00000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF0000FFFFFF0000FFFF0000FFFF0000FFFFFF0000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFF0000FFFF0000FFFF0000FFFFFF0000FFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000FFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFF00000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFF00FFFFFF00FFFF0000000000FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF0000000000FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF0000000000FFFFFFFFFF00FFFFFFFFFF00FFFF00000000FFFFFF0000FFFFFFFF0000FFFFFF00FFFF00FFFF00FFFF0000000000FFFFFFFFFFFFFFFFFF00FFFF00000000FFFF00FF00FFFFFF00000000FFFF00FFFFFFFFFFFFFFFF00FFFFFF00000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF0000FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFF00FFFF00000000FFFFFF0000FFFFFFFF0000FFFFFF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFF00000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF00000000FFFF00FFFF00FFFF00FFFFFF0000000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFF0000FFFF0000FFFF0000FFFFFF0000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF0000000000000000FFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFF0000FFFF0000FFFF0000FFFFFF0000FF0000FFFFFF0000000000000000FFFF000000000000FFFFFF0000FFFF0000FFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF0000000000000000FFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF0000FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFF0000FFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFF0000FFFF0000FFFF0000FFFFFF0000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000FFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFF000000000000FFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFF0000FFFF0000FFFF0000FFFFFF000000000000FFFF0000FFFFFFFF0000FF0000FFFFFFFFFFFFFFFF0000FFFF0000FFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF0000FFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FF0000FFFF00FFFFFFFFFF0000FFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFFFF00FFFFFF00FF0000FFFF00FFFF00FFFFFFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFF0000FFFFFFFFFF00FFFFFF0000FFFF00FF0000FFFF00FFFF00FFFF0000FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF0000FFFF00FFFF00FFFFFF00FFFF0000FF0000FF00FFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF000000FF000000FFFF0000FFFF0000FFFFFF000000FF000000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF000000FFFF000000FFFFFF000000FFFF0000FFFFFF0000FFFFFFFFFF0000000000FFFFFFFFFFFF0000FFFFFFFF000000FFFF000000FFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFF000000FFFF000000FFFF000000FF0000FFFFFF0000FFFFFF0000FF000000FFFF000000FF0000FFFFFFFF0000FFFF0000FFFF0000FFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000FFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFF000000FFFF000000FFFFFF000000FFFF0000FFFFFF0000FFFFFFFFFF0000000000FFFFFF0000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFF0000FF00FFFFFF000000FFFFFFFFFF000000FFFF00FFFFFF00FF00FF0000FFFFFFFFFFFF00FF0000FFFFFF00FFFFFF00000000FFFF000000FFFFFFFF000000FFFFFF000000FFFFFFFF0000FF00FFFFFF000000FFFFFFFFFFFFFF000000FFFF00FFFF000000FFFFFFFF0000FFFFFFFF0000FFFF000000FF00FFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFF00FFFF000000FFFF00FFFFFF00FFFF000000FFFFFF00FFFFFFFFFFFFFFFF00FFFFFF000000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FFFF000000FFFFFFFF000000FFFFFF00FFFF00FFFF00FFFFFF00FF00FF0000FFFFFF00FFFFFFFFFFFFFFFF00FFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFF00FFFF00FFFFFFFFFFFF000000FFFF00FF00FF00FF00FF0000FFFFFFFF0000FF00FFFFFFFFFFFF000000FFFF00FFFFFF000000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00FF0000FFFFFFFF000000FFFFFF00FF00FFFF00FFFFFFFFFF000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF000000000000FFFFFF000000FF000000FFFFFF0000000000FFFFFFFFFFFF0000FFFFFFFFFF00000000FFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFFFFFF00000000FFFFFF0000000000000000FFFF00000000FFFFFFFFFFFF0000FFFFFFFFFFFF00000000FFFFFFFFFFFF000000000000FFFF0000000000FFFFFF00000000000000FFFFFF00000000FFFFFFFFFFFF00000000FFFFFF000000000000FFFFFFFF0000FFFFFF0000FFFFFF00000000FFFFFFFF000000000000FFFF000000FF000000FFFFFFFFFF0000FFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFFFFFF00000000FFFFFF0000000000000000FFFF00000000FFFFFFFFFFFF0000FFFFFFFF00000000FFFF00000000FFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFD5C0C0C0C0C0C0C0FFFFFFFFFFEAC0C0EAFFC0C0E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00000000FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF6000000000000000FFFFFFFFFFC00000C0FF000080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFF00000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFE000000040404040FFFFFFFFFFC00000C0FF000080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFAA00002BEAFFFFFFFFFFFFFFEAC0C0EAFFC0C0E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFAA000016CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFD5200000CAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5FFF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFEA20002BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC016C016C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFA02000E0FF800000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA2B002BE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFD500002B80160036FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B20003620FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFAA0000000020D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0E000D5EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFF00000000FFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFEAC0C0D5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEAC0EAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF0000000000FFFFFFFFFF000000000000FF000000000000FFFFFFFF000000000000FFFFFF000000000000FFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFF00000000FFFF000000000000FFFFFFFF000000000000FFFF0000000000000000FFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00000000FFFFFFFFFFFF00000000FF00000000FFFF00000000FFFF00000000FFFFFFFF000000000000FFFFFF000000000000FFFFFF00000000000000FFFFFFFFFFFF0000FFFFFFFF00000000FFFFFFFF000000000000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF000000FF000000FFFF0000FF000000FFFFFF000000FF000000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFF000000FFFFFF0000FFFFFF0000FFFF0000FFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF0000FFFFFFFF0000000000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFF000000FFFF000000FFFFFF0000FFFF0000FF0000FFFFFFFF0000FF000000FFFF000000FF0000FFFFFFFF0000FF0000FFFFFFFF0000FF0000FFFFFF0000FFFFFFFF0000000000FFFF000000FFFF000000FF0000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF0000FFFFFF0000FFFF0000FFFF0000FFFFFF0000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF0000FFFF000000FF000000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF000000FF000000FFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FF0000FF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FF0000FFFFFF0000FFFF000000FF000000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFF0000FFFF0000FFFF0000FFFFFF0000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFF0000000000000000FFFFFF0000FFFFFFFFFF0000FF0000FF0000FF0000000000000000FFFF000000000000FFFFFF000000000000FFFF0000FFFFFF0000FFFF0000FFFFFF0000FFFF0000000000000000FFFF000000000000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFF0000FFFF0000FFFF0000FFFFFF0000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFF0000FFFFFFFF0000FFFFFF0000FFFFFFFFFF0000000000000000FF0000FFFFFFFF0000FF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000000000000FFFF0000FFFFFF0000FFFF0000FFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF000000FF000000FFFF0000FFFF0000FFFFFF000000FF000000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFF0000FFFFFFFFFFFFFF000000FFFF0000FFFFFF0000FFFFFFFFFF000000FF0000FFFF000000FF000000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF000000FF000000FFFF000000FFFF000000FFFFFF0000FFFFFFFFFF0000000000000000FF000000FFFF000000FF0000FFFFFFFF0000FF0000FFFFFFFF0000FFFFFFFFFFFF0000FFFF000000FF000000FFFF000000FFFF000000FF0000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF000000000000FFFFFF000000FF000000FFFFFF0000000000FFFFFFFFFFFF0000FFFFFFFFFF00000000FFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000000000000FFFF0000000000000000FFFF00000000FFFFFFFF000000000000FFFFFFFFFF000000000000FFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFF00000000FFFFFF00000000000000FFFF000000FFFF000000FFFFFF00000000FFFFFFFF000000000000FFFFFF000000000000FFFFFF0000000000FFFFFFFFFF000000000000FFFFFF00000000FFFFFFFF000000000000FFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF000000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFF00000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFFFFFF00FFFFFFFF000000FF00FF0000FFFF000000FFFFFFFFFFFFFF0000FF00FFFFFF000000FFFFFF00FFFF00FFFFFF0000FF00FFFF00FF0000FFFFFF00FFFF00FF0000FFFFFFFFFF00FFFFFF0000FFFF000000FFFFFFFF000000FFFFFF000000FFFFFF0000FF00FFFFFF000000FFFFFF00FFFFFF000000FFFF00FFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFF00FFFF00FFFF00FFFF000000FFFFFF00FFFFFF000000FFFFFF000000FF00FFFFFF00FFFFFFFF000000FF00FFFFFF00000000FFFFFF00FFFF000000FF00FFFF0000FFFFFFFF0000FFFFFF00FFFF00FFFFFFFFFFFFFF000000FFFFFF000000FF00FFFF000000FFFF00FFFFFF00FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFFFFFF00FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFF0000FFFF0000FFFF00FFFFFFFFFF0000FFFF00FFFFFF00FF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFFFF00FFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFF00FF00FFFFFFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00000000FFFF00FFFF0000000000FFFFFFFFFF00FFFFFF00FFFF0000000000FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF0000000000FFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF0000000000FFFFFFFFFF00FFFFFFFFFF00FFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFF00FFFF00FFFF00FF0000000000FFFFFFFFFFFFFFFFFF00FFFF00000000FFFFFF00FF00FFFFFF00000000FFFF00FFFFFFFFFFFFFFFF00FFFF00000000FFFFFF0000FFFFFFFF0000FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFFFF00000000FFFF00FFFFFFFFFF00FFFFFF00FF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF0000FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFFFFFFFF0000FFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FF00FF00FFFF00FFFFFF00FFFF000000FFFF000000FFFF000000FFFFFFFFFFFFFF0000FF00FFFFFF000000FFFFFFFFFF000000FF00FFFFFF00FFFF00FF0000FFFFFFFFFFFF00FF0000FFFFFF00FFFFFF00000000FFFF000000FFFFFFFF000000FFFFFF000000FFFFFF0000FF00FFFFFF000000FFFFFFFFFFFFFF000000FFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFF000000FF00FFFF00FFFF000000FFFFFFFFFFFFFFFFFFFF00FFFF000000FFFFFF00FFFFFF00FFFF000000FFFFFF00FFFFFFFFFFFFFFFF00FFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFF00FFFF00FFFFFFFFFFFFFF000000FFFFFF000000FFFFFFFF000000FFFF00FF0000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF00FFFFFF00FFFFFFFF00FFFFFFFF000000FF000000FFFFFF000000FFFFFFFFFFFFFF00000000FFFFFF0000FF00FFFFFF00FFFF00FFFFFF00FFFFFF0000FF00FF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFF000000FF00FFFF0000FF00FFFF000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FFFF00FFFFFF00FFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFF00FFFFFFFFFF00FFFFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF0000FF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF0000FF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00000000FF00FFFFFF0000000000FFFFFFFFFFFFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF0000000000FFFFFF0000FFFFFFFF0000FFFFFFFF00000000FFFF00FFFFFF00FF0000000000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFF0000FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FFFF0000FFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFFFF00FFFFFFFFFFFF0000FFFFFFFFFF00FFFF0000FFFF00FFFF0000FFFF00FFFF00FFFF0000FF00FFFFFF00FFFFFFFFFF0000FF0000FF00FFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF0000FF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF00FFFFFF000000FFFFFF00FFFF00FFFFFF0000FF00FFFF00FF0000FFFFFF00FFFF00FF0000FFFFFFFFFF00FFFFFF0000FFFF000000FFFFFFFF000000FFFFFF000000FFFFFFFF0000FF00FFFF000000FFFFFF00FFFF00FFFFFFFF00FFFFFFFF000000FFFFFF00FF0000FFFFFF000000FFFFFFFF0000FFFFFF00FFFF0000FFFF000000FFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF00FF00FF00FFFF00FFFFFF00FFFF000000FF000000FFFFFF000000FFFFFFFFFFFF00FFFFFFFFFFFF000000FF00FF00FF00FFFF00FF0000FFFFFFFF0000FF00FF00FFFFFF00FFFFFFFFFF00FF00FFFF00FFFFFFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFF000000FFFFFFFF0000FF00FFFF000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFF0000FFFF0000FFFF00FFFFFFFFFF0000FFFF00FFFFFF00FF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF0000FF00FFFFFF00FFFFFFFFFF00FFFFFFFF00FFFFFF00FFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF0000000000FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF0000000000FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF0000000000FFFFFFFFFF00FFFFFF00FFFFFFFF0000000000FFFF00FFFFFF00FF00FFFFFF00FFFFFF0000FFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF0000000000FFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFFFFFFFF0000FFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF0000FF00FFFFFF00FFFFFFFFFF00FFFFFFFF00FFFFFF00FFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF00FFFFFF000000FFFFFFFFFF000000FF00FFFFFF00FFFF00FF0000FFFFFFFFFFFF00FF0000FFFFFF00FFFFFF00000000FFFF000000FFFFFFFF000000FFFFFF000000FFFFFFFF0000FF00FFFF000000FFFFFFFFFFFF00FFFFFFFF00FFFFFFFF000000FFFFFF00FF0000FFFFFF000000FFFFFFFF0000FFFFFF00FF000000FFFF000000FFFFFF00FF00FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFF00FF00FFFFFF00FFFFFF0000FF00FFFF00FFFF000000FFFFFF0000FFFF000000FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFFFFFFFF00FFFFFFFFFF000000FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF0000FFFF00FF00FFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFF00FF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF0000000000FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFFFFFF00FF00FFFFFF0000000000FFFF00FFFFFF00FFFF00FFFF00FFFF0000000000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFF00FF0000FFFF00FFFF00FFFF0000FFFF00FF00FFFFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FF00FF0000FFFFFFFF0000FF00FFFF00FFFF000000FFFF000000FFFF000000FFFFFF00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFF00FFFFFF00FFFFFF000000FFFFFF00FF00FF00FF000000FF00FFFFFF000000FFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF0000000000000000FFFFFFFFFFFF00000000000000FFFFFF00FFFF00000000000000FFFFFFFFFFFF0000000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF0000000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF0000000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF0000000000000000FFFFFFFFFFFF00000000000000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF00FFFFFFFF000000FFFFFFFFFF00FFFFFF00FFFF0000FF00FFFFFF000000FFFFFFFFFFFFFF000000FFFF00FFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF0000FFFF00FFFF00FFFFFF00FFFFFF00FFFFFFFF00FFFFFF00FF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FFFFFF00FF00FFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF0000FFFFFF00FFFFFFFF000000FFFFFFFF00FFFFFF00FFFFFF0000FF00FFFFFF000000FFFFFFFFFFFFFF00000000FF00FFFF000000FF00FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF0000FFFF00FFFFFFFF000000FFFFFFFFFF00FFFFFF00FFFFFF0000FF00FFFF000000FFFFFFFFFFFFFF000000FF0000FFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FFFFFF00FF00FFFF00FF00FFFFFF00FFFF0000000000FFFFFFFFFF00FFFFFFFFFF00FFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF0000FFFF00FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFF00FF00FFFFFF00FFFFFF00FFFFFFFF00FFFFFF00FFFF00FFFF0000FF00FFFFFF00FFFFFFFFFF00FFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFFFF00FF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FFFF00FF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF0000FFFF00FFFF0000FFFF00FFFFFF00FFFF00FFFFFF00FF00FF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FFFF00FF00FFFF00FFFF00FFFFFF00FFFF0000000000FFFFFFFFFF00FFFFFFFFFF00FFFF00000000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFFFF00FF0000000000FFFFFFFFFF00FFFFFFFFFF00FFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF00FF00FFFF000000FFFFFF00FFFFFF00FF00FFFF0000FF00FFFFFF000000FFFFFFFFFFFFFF000000FFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF0000FFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFF00FF00FFFF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFF00FF0000FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF0000FF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF0000FFFFFF00FF00FFFF000000FFFF00FFFFFF00FF00FFFFFF0000FF00FFFFFF000000FFFFFFFFFFFFFF000000FFFF00FFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF0000FFFF00FF00FFFF000000FFFFFF00FFFFFF00FF00FFFFFF0000FF00FFFF000000FFFFFFFFFFFFFF000000FFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF0000000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF0000000000000000FFFFFFFFFFFF00000000000000FFFFFF00FFFF00000000000000FFFFFFFFFFFF0000000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF0000000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF00000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF0000FFFFFF00FFFFFFFF000000FFFFFF00FF00FFFFFF00FFFF0000FF00FFFFFF000000FFFFFFFFFFFFFF000000FFFF00FFFFFF000000FF00FF000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF00FF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF0000FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FF00FFFFFF00FF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FFFF0000FF00FFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFFFF00FFFFFFFFFFFF00FFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FFFF0000FF00FFFF00FF00FFFFFF00FFFF0000000000FFFFFFFFFF00FFFFFFFFFF00FFFFFF00000000FFFF000000FFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFFFF00FF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFF00FF00FFFF00FFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF0000FFFF00FFFF0000FFFF00FFFFFF00FFFF00FFFFFF00FF00FF00FFFF0000FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF0000FFFFFF00FF00FFFF000000FFFFFF00FFFFFF00FF00FFFF0000FF00FFFFFF000000FFFFFFFFFFFFFF000000FFFF00FFFFFF000000FFFFFF000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFF00FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF00FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF00FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF00FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF00FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF00FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF00FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF00FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFF00000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFF0000000000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FF00FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF000000FF00FF0000FFFFFFFF0000FFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF000000FFFFFF00FFFFFF00FF00FFFFFF00FFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFF0000000000FFFFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF000000FF00FF0000FFFFFFFF0000FFFFFFFF000000FFFFFFFF000000FF00FFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFFFF000000FFFFFF00FF0000FFFFFFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFFFFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFFFF00FFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00000000FFFF0000FFFFFFFF0000FFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFF0000000000FFFF00FFFFFF00FF00FFFFFF00FF0000000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFFFF00FFFFFFFFFFFFFF00FF00FFFFFF0000000000FF00FFFFFF00FFFF00FFFF00FFFF0000000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FFFFFF00000000FFFFFFFF00FF00FFFFFF0000000000FF00FFFFFF00FFFF00FFFF00FFFF0000000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FFFF00FFFFFF00FFFFFFFF00FF00FFFFFF0000000000FF00FFFFFF00FFFF00FFFF00FFFF0000000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF0000FFFF00FF00FFFFFF00FF00FFFFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFFFF0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFF0000FFFFFF0000FFFF00FFFFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF000000FFFFFF0000FFFFFFFF0000FFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF000000FFFFFF00FF00FF00000000FFFF00FFFF000000FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF000000FFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF000000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FFFFFF000000FFFFFFFF00FFFFFF00FFFFFF000000FFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FFFF00FF0000FFFFFFFF00FFFFFF00FFFFFF000000FFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF00FFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF00FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF00FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF00FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF00FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF00FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00FFFFFFFFFF0000FFFFFFFF000000FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00FFFFFFFFFF0000FFFFFFFF000000FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF00FFFFFFFFFFFF0000FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF00FFFFFFFFFFFF0000FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF0000FF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFFFFFF00FFFFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFF000000FF00FF0000FF00FFFFFF000000FFFF00FFFFFF00FFFF00FFFFFFFF00FFFFFFFF000000FFFFFF0000FFFFFFFF0000FF00FFFF00FFFF0000FFFFFFFFFFFF0000FF00FFFF000000FFFFFF00FFFFFFFFFFFFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFFFF000000FFFF00FF0000FFFFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFFFFFFFF00FFFF00FFFF00FFFFFFFF000000FFFFFF0000FF00FFFFFF00FFFFFF000000FFFFFFFF0000FF00FF00FFFFFFFFFF00FFFFFF0000FF00FFFF00FFFF00FFFF00FFFFFF00FF0000FFFFFF000000FFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFF0000FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFF0000FFFF00FFFF00FFFFFFFFFFFF00FFFF0000FF00FFFFFF00FFFF00FFFFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF0000FF00FFFFFFFF0000FFFF00FFFF0000FFFF00FFFF00FFFF00FFFFFF0000FFFF00FF00FFFFFF00FFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFF0000000000FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00000000FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFF0000000000FFFF0000FFFFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFF00FFFF00FFFFFF0000000000FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FF0000000000FFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF0000000000FFFFFFFF00FFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF0000000000FFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFF0000FF00FFFFFF00FFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFF0000FFFF0000FFFF00FFFF00FFFFFF00FFFF0000FFFF00FF00FFFFFFFFFFFF0000FF0000FF00FFFFFF00FFFFFF00FFFF00FFFF0000FFFF00FFFF00FFFFFF00FFFF00FFFF0000FF00FF00FFFFFF00FFFF00FFFFFF00FFFF0000FF0000FF00FFFFFF0000FFFF00FF00FFFFFF00FFFF0000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFF00FFFFFF00FFFFFFFF000000FFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFF000000FFFF000000FF00FFFFFF000000FFFF00FF0000FFFFFF00FFFFFFFF00FFFFFFFF000000FFFFFF0000FFFFFF00FFFFFF00FFFF00FF000000FFFFFFFFFFFF0000FF00FFFF000000FFFFFF00FFFFFFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FF00FF0000FFFFFFFF00FFFF00FFFF00FF0000FF000000FFFFFFFFFF00FF00FFFF00FFFFFFFFFF000000FFFF000000FF00FF0000FFFFFFFF000000FFFFFFFF0000FF00FF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFF00FF0000FFFFFF000000FFFFFF00FF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF0000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF00FFFFFFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF0000FF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFFFFFF00FFFFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFF000000FF00FF0000FF00FFFFFF000000FFFF00FFFFFF00FFFF00FFFFFFFF00FFFFFFFF000000FFFFFF0000FFFFFFFF0000FF00FFFF00FFFF0000FFFFFFFFFFFF0000FF00FFFF000000FFFFFF00FFFFFFFFFFFFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFFFF000000FFFFFF000000FF00FF00FFFFFF00FFFF00FFFFFF00FF0000FFFFFFFFFF00FFFF00FFFF00FFFFFFFF000000FFFFFF0000FF00FFFFFF00FFFFFF000000FFFFFFFF0000FF00FF00FFFFFFFFFF00FFFFFF0000FF00FFFF00FFFF00FFFF00FFFFFF00FF0000FFFFFF000000FFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFF0000FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFF0000FFFF00FFFF00FFFFFFFFFFFF00FFFF0000FF00FFFFFF00FFFF00FFFFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF0000FF00FFFFFFFF0000FFFF00FFFF0000FFFF00FFFF00FFFF00FFFFFF0000FFFF00FF00FFFFFF00FFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFF0000000000FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00000000FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFF0000000000FFFF0000FFFFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FFFF00000000FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFF00FFFF00FFFFFF0000000000FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FF0000000000FFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF0000000000FFFFFFFF00FFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF0000000000FFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFF0000FF00FFFFFF00FFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFF0000FFFF00FFFFFF00FFFF00FFFFFF00FFFF0000FFFF00FF00FFFFFFFFFFFF0000FF0000FF00FFFFFF00FFFFFF00FFFF00FFFF0000FFFF00FFFF00FFFFFF00FFFF00FFFF0000FF00FF00FFFFFF00FFFF00FFFFFF00FFFF0000FF0000FF00FFFFFF0000FFFF00FF00FFFFFF00FFFF0000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFF00FFFFFF00FFFFFFFF000000FFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFF000000FFFF000000FF00FFFFFF000000FFFF00FF0000FFFFFF00FFFFFFFF00FFFFFFFF000000FFFFFF0000FFFFFF00FFFFFF00FFFF00FF000000FFFFFFFFFFFF0000FF00FFFF000000FFFFFF00FFFFFFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FFFF000000FFFFFFFF00FFFF00FFFF00FF0000FF000000FFFFFFFFFF00FF00FFFF00FFFFFFFFFF000000FFFF000000FF00FF0000FFFFFFFF000000FFFFFFFF0000FF00FF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFF00FF0000FFFFFF000000FFFFFF00FF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF0000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF0000FF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFFFFFF00FFFFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFF000000FF00FF0000FF00FFFFFF000000FFFF00FFFFFF00FFFF00FFFFFFFF00FFFFFFFF000000FFFFFF0000FFFFFFFF0000FF00FFFF00FFFF0000FFFFFFFFFFFF0000FF00FFFF000000FFFFFF00FFFFFFFFFFFFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFF0000000000FF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFF0000FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFF0000FFFF00FFFF00FFFFFFFFFFFF00FFFF0000FF00FFFFFF00FFFF00FFFFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFF0000000000FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00000000FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFF0000000000FFFF0000FFFFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFFFF00FFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF0000000000FFFFFFFF00FFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF0000000000FFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFF0000FF00FFFFFF00FFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFF00FFFFFF00FFFFFFFF000000FFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFF000000FFFF000000FF00FFFFFF000000FFFF00FF0000FFFFFF00FFFFFFFF00FFFFFFFF000000FFFFFF0000FFFFFF00FFFFFF00FFFF00FF000000FFFFFFFFFFFF0000FF00FFFF000000FFFFFF00FFFFFFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF0000FF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFFFFFF00FFFFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFF000000FF00FF0000FF00FFFFFF000000FFFF00FFFFFF00FFFF00FFFFFFFF00FFFFFFFF000000FFFFFF0000FFFFFFFF0000FF00FFFF00FFFF0000FFFFFFFFFFFF0000FF00FFFF000000FFFFFF00FFFFFFFFFFFFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFFFFFF00FFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFF0000FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFF0000FFFF00FFFF00FFFFFFFFFFFF00FFFF0000FF00FFFFFF00FFFF00FFFFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFF00FFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFF0000000000FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00000000FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFF0000000000FFFF0000FFFFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFFFFFF00FFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF0000000000FFFFFFFF00FFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF0000000000FFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFF00FF00FFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFF0000FF00FFFFFF00FFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFF00FFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFF00FFFFFF00FFFFFFFF000000FFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFF000000FFFF000000FF00FFFFFF000000FFFF00FF0000FFFFFF00FFFFFFFF00FFFFFFFF000000FFFFFF0000FFFFFF00FFFFFF00FFFF00FF000000FFFFFFFFFFFF0000FF00FFFF000000FFFFFF00FFFFFFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFFFFFF00FFFFFFFF000000FF00FF0000FFFF000000FFFFFFFFFFFF00FFFFFFFFFFFFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF000000FFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FF0000FFFF0000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFFFFFF00FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FF00FF00FF00FF00FFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFF0000000000FFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00000000FFFF00FFFF0000000000FFFFFFFFFF00FFFFFFFFFFFFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFF0000000000FF00FFFFFF00FFFF00FFFF00FFFF0000000000FFFF00FFFFFFFFFFFF00FFFFFF00FFFF0000000000FFFF00FFFF00FFFF00FFFF0000000000FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF0000000000FFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFF0000000000FFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF0000FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFFFFFFFF0000FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FF00FF00FFFF00FFFFFF00FFFF000000FFFF000000FFFF000000FFFFFFFFFFFF00FFFFFFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF000000FFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFF00FF00FFFFFFFF00FF0000FFFFFFFF000000FFFF00FFFFFF00FFFFFF00FFFF00FF00FFFF000000FF000000FF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFFFFFF00FFFFFFFF000000FF00FF0000FFFF000000FFFFFFFFFFFFFF00000000FFFFFF0000FFFF00FFFFFF00FF00FFFFFF00FFFFFF0000FF00FFFFFFFFFFFF000000FFFF00FFFFFF000000FF00FF0000FFFFFFFF0000FFFFFF00FFFFFFFFFF00FFFFFF000000FF00FF00FFFF00FFFF00FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFFFFFF00FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF0000FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFF00FFFFFFFF0000FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00000000FFFF00FFFF0000000000FFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFF00000000FFFF0000FFFFFFFF0000FFFFFF00FFFFFF00FF00FFFFFF00000000FFFF00FFFF00FFFF00FFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFF0000FFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF0000FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFF0000FFFFFFFFFF00FFFFFF0000FFFF00FF0000FFFF00FFFF00FFFF0000FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF0000FF0000FF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FF00FF00FFFF00FFFFFF00FFFF000000FFFF000000FFFF000000FFFFFFFFFFFF00FFFFFFFFFFFF000000FFFF00FF00FF00FF00FF0000FFFFFFFF0000FF00FFFFFFFFFFFF000000FFFF00FFFFFF000000FFFFFF0000FFFFFFFF0000FFFFFF00FF00FFFFFF00FFFFFF000000FFFFFF00FF00FFFF00FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFFFF00FFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFF0000000000FF00FFFFFF00FFFF00FFFFFF00FF0000000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF000000FFFF00FF00FF00FF000000FFFF00FFFF000000FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF00FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF00FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00FFFFFFFFFF0000FFFFFFFF000000FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00FFFFFFFFFFFF0000FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF00FFFFFFFFFFFFFF0000FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00FFFFFFFFFFFFFF0000FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF000000FFFF00FFFFFFFF000000FFFFFF000000FF00FF0000FFFF000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFF0000000000FFFF00000000FFFF00FFFF0000000000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFF00FF0000FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF000000FFFF00FF00FFFF000000FFFFFF000000FFFF000000FFFF000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF0000FF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF0000FF00FFFFFFFFFFFF0000FF00FFFFFF000000FFFF0000FFFFFF000000FF00FF000000FFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFF000000FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFF00FFFFFF00FFFFFFFFFFFFFFFF000000FF00FF000000FFFF0000FFFFFF000000FFFF00FFFFFFFFFF00FFFFFFFFFF000000000000FFFF00FFFFFFFFFF00FFFFFFFFFF00000000FFFFFFFF00FF0000FFFFFF0000FFFFFFFF000000FFFFFF00FFFFFFFFFF00FFFFFFFF000000FFFFFF00FFFFFFFFFFFFFF000000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFF0000FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFFFFFF00FFFFFFFF00FFFFFF00FF00FFFF00FFFF0000FFFFFFFFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFFFF00FF00FFFFFF00FFFFFFFFFFFF00FF00FFFFFFFF00FF00FFFFFF00FFFFFFFF00FFFFFF0000FFFF00FF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFFFF00FF00FFFF00FFFFFFFFFFFFFF00FF00FFFFFFFF00FF00FFFF00FFFFFFFFFFFF00FFFF00FFFFFF00FFFFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFF00FF00FFFF00FFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF0000000000FF00FFFFFFFF00000000FF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FF00FFFFFF0000000000FFFF00FFFFFF00FFFF00FFFF00FFFF0000000000FF00FFFFFF00FFFFFFFFFFFFFFFF00000000FF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFF00FFFFFF00FFFF0000FFFFFF0000000000FFFF00FFFFFFFF00FF00FFFF0000000000FFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF0000000000FFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFFFFFFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF0000FFFFFFFFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00FF0000FFFF00FFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FF0000FFFF00FFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFFFF00FF0000FFFF00FFFFFF00FF00FFFFFFFFFFFFFF00FF0000FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFF0000FFFF00FF00FFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFF00FFFF0000FFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFF00FFFFFF00FFFFFF000000FFFF00FFFFFF0000FF00FFFFFFFFFFFF0000FF00FFFFFF000000FF000000FFFFFF000000FFFFFF000000FFFF00FF0000FFFFFFFF00FFFFFF00FFFFFF00FFFFFF000000FFFFFF00FF00FF00FF000000FF00FFFFFF000000FFFF00FF00FF00FFFFFFFFFFFFFFFF000000FFFFFF000000FF000000FFFFFF000000FFFF00FF00FF00FFFFFF00FF00FFFFFFFFFF0000FFFF00FF00FF00FFFFFF00FF00FFFFFFFFFFFF00FFFF00FF0000FFFFFF0000FFFFFFFF000000FFFFFF00FF00FF00FFFFFF00FFFF000000FFFFFF00FF00FFFFFFFFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF0000FF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF0000FF00FFFFFFFFFFFF000000FF00FF0000FF0000FFFF000000FF00FFFF000000FFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFFFF00FFFF000000FFFFFF00FFFFFF00FFFFFFFFFFFFFF000000FF00FFFF000000FFFF0000FFFF000000FFFFFF00FFFFFFFFFF00FFFFFFFFFF00000000FFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00000000FFFFFF00FF0000FFFFFFFF0000FFFFFFFF000000FFFFFF00FFFFFFFFFF00FFFFFFFF000000FFFFFF00FFFFFFFFFFFFFF000000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFF0000FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFFFFFF00FFFFFFFF00FFFFFF00FF00FFFF00FFFF0000FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFFFFFF00FF00FFFFFF00FFFFFFFF00FFFFFF00FFFFFFFF00FF00FFFFFF00FFFFFFFF00FFFF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFFFF00FF00FFFF00FFFFFFFFFFFF00FFFF00FFFFFFFF00FF00FFFF00FFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFF00FF00FFFF00FFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFFFFFFFFFF00000000FFFF00FFFF00FFFFFF00000000FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FF00FFFFFF0000000000FF00FFFFFF00FFFF00FFFFFF00FF0000000000FFFF00FFFFFF00FFFFFFFFFFFFFF00000000FFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FF00FFFFFF00FFFFFF0000FFFFFF0000000000FFFF00FFFFFFFF00FF00FFFF0000000000FFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF0000000000FFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF0000FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF0000FFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFFFFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFF00FFFF0000FFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFF00FFFFFF00FFFFFF000000FFFF00FFFFFF0000FF00FFFFFFFFFFFF000000FFFF000000000000FFFF000000FFFFFFFF000000FFFF00FF0000FFFFFFFF00FFFFFF00FFFFFF00FFFFFF000000FFFF00FF00FF00FF000000FFFF00FFFF000000FFFFFF00FF00FF00FFFFFFFFFFFFFF000000FFFFFFFF000000FF000000FFFF000000FFFFFF00FF00FF00FFFFFF00FF00FFFFFFFFFFFF00FFFF00FF00FF00FFFFFF00FF00FFFFFFFFFFFF00FF00FF0000FFFFFFFF0000FFFFFFFF000000FFFFFF00FF00FF00FFFFFF00FFFF000000FFFFFF00FF00FFFFFFFFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFFFF0000FF00FFFF00FF0000FFFF00FFFF00FFFFFF000000FFFFFFFFFFFFFF00FFFFFFFF000000FFFFFF00FFFF0000FF00FFFFFFFFFFFF0000FF00FFFF00FF0000FFFFFFFF0000FF00FFFFFF000000FF000000FFFFFF000000FFFF00FFFFFFFF00000000FFFFFF0000FFFF00FFFFFF00FF00FFFFFF00FFFFFF0000FF00FFFFFFFFFF00FFFFFF00FFFFFF000000FFFFFF00FFFFFF00FFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFFFF0000FF00FFFFFFFFFFFFFFFFFF000000FFFF00FFFFFF000000FF00FF0000FFFFFFFF0000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FFFF00FFFF0000FFFF0000FFFF00FF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFF00FF00FFFF0000FFFFFFFFFF00FFFF0000FFFF0000FFFF00FFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF0000FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF0000FFFFFFFFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFF00FFFFFF00FFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FF00FF00FF00FFFF00FFFFFF00FF00FFFFFFFFFFFFFFFFFFFF00FF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFFFF00FFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFF00FFFFFF00FFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00000000FF00FFFFFF0000000000FF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF0000000000FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFF0000000000FF00FFFFFF00FFFF00FFFF00FFFF0000000000FFFF00FFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00000000FFFF0000FFFFFFFF0000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFFFFFFFF0000FFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FFFF00FFFFFF00FFFF0000FFFF00FF00FFFF00FFFF00FFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FF00FFFF0000FFFFFFFFFF00FFFFFF00FFFF0000FFFF00FFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFFFF0000FFFFFFFFFF00FFFFFF0000FFFF00FF0000FFFF00FFFF00FFFF0000FFFFFFFFFF0000FFFF00FFFF00FFFFFF0000FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF0000FFFFFFFFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF00FFFFFF00FFFF00FF0000FFFF00FFFF00FFFFFF000000FFFFFFFFFF00FFFFFF00FFFF000000FFFFFF00FFFF0000FF00FFFFFFFFFF00FFFFFF00FFFF00FF0000FFFFFFFF0000FF00FFFFFF000000FF000000FFFFFF000000FFFFFF00FFFF00FFFFFFFFFFFF000000FFFF00FF00FF00FF00FF0000FFFFFFFF0000FF00FFFFFFFFFF00FF0000FFFFFFFF000000FF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFFFFFFFFFFFFFF00FFFFFF00FFFF000000FFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFFFF0000FF00FFFFFFFFFFFFFFFFFF000000FFFF00FFFFFF000000FFFFFF0000FFFFFFFF0000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFF00000000FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFFFFFF00FFFFFFFF000000FF00FF0000FFFF000000FFFFFFFFFFFFFFFF00FFFFFFFF000000FFFFFF00FFFFFF0000FF00FFFFFFFFFF00FFFFFF00FFFF000000FFFFFF0000FF00FFFF00FFFFFFFF00FFFFFF00FFFFFFFF00000000FFFFFF0000FFFF00FFFFFF00FF00FFFFFF00FFFFFF0000FF00FFFFFFFFFFFF000000FFFF00FFFFFF000000FF00FFFF0000FFFFFFFF0000FFFFFF00FFFFFF00FFFF000000FF00FF00FFFF00FFFF00FFFFFFFF00FFFF000000FF00FF00FFFF00FFFF00FFFFFFFF000000FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFFFFFF00FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFF00FFFF00FFFF0000FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF0000FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF0000FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF0000FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00000000FFFF00FFFF0000000000FFFFFFFFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFF00000000FFFFFF0000FFFFFFFF0000FFFFFF00FFFFFF00FFFF00000000FFFF00FFFF00FFFF00FFFFFF0000FFFF00000000FFFF00FFFF00FFFF00FFFFFF0000000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFFFFFFFF0000FFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFF0000FFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF0000FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF0000FFFFFFFFFF0000FFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFFFF0000FFFFFFFFFF00FFFFFF0000FFFF00FF0000FFFF00FFFF00FFFF0000FFFFFFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000FFFF00FF00FFFFFF00FFFF0000FF0000FF00FFFFFF0000FF00FFFFFF00FFFF0000FF0000FF00FFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FF00FF00FFFF00FFFFFF00FFFF000000FFFF000000FFFF000000FFFFFFFFFFFF00FFFFFF00FFFF000000FFFFFF00FFFFFF0000FF00FFFFFFFFFF00FF0000FFFFFF000000FFFF000000FF00FF000000FF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF000000FFFF00FF00FF00FF00FF0000FFFFFFFF0000FF00FFFFFFFFFFFF000000FFFF00FFFFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFF00FF0000FFFFFF000000FFFFFF00FF00FFFF00FFFFFFFFFFFFFFFF000000FFFFFF00FF00FFFF00FFFFFFFFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF0000FFFFFFFFFFFFFFFF00FFFF00000000FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFF0000000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF0000000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFF00000000000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFFFF0000FF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFFFFFF00FFFFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFF00FFFFFFFFFFFFFF0000FF00FFFFFF000000FFFF0000FFFFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFF00FFFFFF00FFFFFFFF00000000FFFFFF0000FF00FFFFFF00FFFF00FFFFFF00FFFFFF0000FF00FFFFFFFFFFFF000000FFFF00FFFF000000FF0000FFFFFFFFFFFF000000FFFF00FFFF000000FF00FFFF0000FFFFFFFF0000FFFFFF00FFFFFF00FFFFFF000000FF00FF00FFFF00FFFF00FFFFFFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFF0000FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFFFFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FFFFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF0000FFFFFFFFFF00FFFFFF00FF00FF00FFFFFF00FF00FFFFFFFFFF00FFFFFF00FF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF00FFFF00FF0000FFFFFF0000FF00FFFFFF000000FF00FF0000FFFF000000FFFFFFFFFFFF00FFFFFF00FFFFFF000000FFFFFF0000FF00FFFF00FFFF00FFFFFF000000FFFFFF000000FF000000FFFF00FFFF000000FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FF00FFFFFF00FF00FFFFFFFFFF00FFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF00FFFF0000FFFF0000FFFF00FF00FFFF0000FFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF0000FFFFFFFFFF0000000000FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFFFF00FF00FFFFFFFF0000000000FF00FFFFFF00FFFF00FFFF00FFFF0000000000FFFF00FFFFFFFFFFFF00FFFFFF00FFFF0000000000FF00FFFFFFFFFF00FF00FFFFFF0000000000FF00FFFFFF00FFFF00FFFF00FFFF0000000000FFFF00FFFFFF00FFFFFFFFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00000000FF00FFFFFFFFFF00FFFFFFFFFF00FFFF00000000FFFFFF0000FFFFFFFF0000FFFFFF00FFFFFF00FFFFFF00000000FFFF00FFFF00FFFF00FFFFFF0000000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFF0000FFFF0000000000FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFF00FF00FFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFFFF0000FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00FF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFFFFFFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00000000FFFF00FFFF0000000000FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00000000FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFFFF00000000FFFFFF0000FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFF0000FFFF00FFFF00FF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFFFFFFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFFFFFF0000FFFFFFFFFF00FFFF0000FFFF00FFFF0000FFFF00FFFF00FFFF0000FFFFFFFFFF00FFFFFF00FF00FF00FFFFFF00FF00FFFFFFFFFF00FFFFFF00FF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF0000FFFF00FFFF00FFFFFF00FFFF0000FF0000FF00FFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFF0000000000FFFF0000FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFF00FF0000FFFFFF00FF00FFFFFF000000FFFFFFFFFFFF00FFFFFF00FFFFFFFF000000FFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFF00FF00FFFFFFFFFF0000FF00FFFFFF000000FF000000FFFFFF00FFFFFF00FFFFFF000000FFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFF00FF00FFFF00FFFF00FFFFFFFFFFFF000000FF00FF00FF00FFFF00FF0000FFFFFFFF0000FF00FFFFFFFFFFFF000000FFFF00FFFF000000FFFF00FFFFFFFFFFFF000000FFFF00FFFF000000FFFFFFFF0000FFFFFFFF0000FFFFFF00FF0000FFFFFFFF000000FFFFFF00FF00FFFF00FFFFFFFFFF000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF00FFFFFF00FFFF0000FFFF00FF00FFFF0000FFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF0000FFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF0000FFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FF0000FFFFFF0000FF00FFFFFF000000FFFF000000FFFF000000FFFFFFFFFFFF00FF0000FFFFFFFF000000FFFF000000FF00FF000000FF00FFFFFF000000FFFFFF000000FF000000FFFF00FFFF000000FFFFFF00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00000000FFFFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FFFFFF00FFFFFFFF00FFFFFFFF000000FF00FF0000FFFF000000FFFFFFFFFFFFFF0000FFFFFF0000FFFFFF000000FF000000FFFF00FFFF000000FFFFFFFFFFFFFFFFFF00FFFFFFFFFF000000FFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFF000000FFFFFF000000FF00FFFF000000FFFF00FFFFFF00FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF00FFFFFF00FFFFFFFF00FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00000000FFFF00FFFF0000000000FFFFFFFFFFFF0000FFFFFF00FFFFFFFF00000000FF00FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFF0000000000FF00FFFFFF00FFFF00FFFF00FFFF0000000000FFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFFFF00000000FFFF00FFFFFFFFFF00FFFFFF00FF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFF00FF00FFFFFF00FF00FFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FFFF00FF0000FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFF00FFFF00FFFFFF00FFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FF0000FFFF00FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FF0000FFFF00FF00FF00FFFF00FFFFFF00FFFF000000FFFF000000FFFF000000FFFFFFFFFFFFFF0000FFFF000000FFFFFF000000FF000000FFFF00FFFF000000FFFFFFFFFFFFFF00FFFFFF00FFFFFF000000FFFF00FF00FF00FF000000FF00FFFFFF000000FFFFFF00FF00FF00FFFF00FFFFFFFFFFFFFF000000FFFFFF000000FFFFFFFF000000FFFF00FF0000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF000000FFFFFF00FFFFFF00FFFF00FFFF00FFFFFF000000FFFF00FFFFFF00FFFFFFFFFFFFFFFF000000FF00FF000000FFFF0000FFFFFF000000FFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF000000FFFFFF00FFFFFF00FF00FFFFFF00FFFF000000FFFFFF00FFFFFF00FFFFFFFFFFFFFF000000FF00FFFF000000FFFF0000FFFF000000FFFFFF00FFFFFFFFFF00FFFFFFFFFF00000000FFFFFF00FF0000FFFFFFFF0000FFFFFFFF000000FFFFFF00FFFFFFFFFF00FFFFFFFF000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFFFFFF00FF00FFFFFF00FFFFFFFF00FFFF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFFFF00FF00FFFF00FFFFFFFFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFF00FFFFFFFFFFFF00FFFFFFFF00FF00FFFF00FFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFF0000000000FFFF00FFFFFF00FFFF00FFFF00FFFF0000000000FF00FFFFFF00FFFFFFFFFFFFFFFF00000000FF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF00FFFFFF0000000000FFFF00FFFFFF00FF00FFFFFF00FF0000000000FFFF00FFFFFF00FFFFFFFFFFFFFF00000000FFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFFFFFFFFFF00FF00FFFFFF00FFFFFF0000FFFFFF0000000000FFFF00FFFFFFFF00FF00FFFF0000000000FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFF00FFFF00FFFFFF00FF00FFFFFF0000000000FFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF00FFFFFF0000000000FFFFFFFFFFFF00FFFF00FFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFFFFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FF0000FFFF00FFFFFFFFFFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFFFF00FF0000FFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FFFF0000FFFF00FF00FFFFFF00FF00FFFFFF00FFFF0000FFFF00FFFFFFFFFFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFFFFFFFF00FF0000FFFF00FFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFF00FFFFFF00FF00FFFFFF00FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF000000FFFFFF00FF00FF00FF000000FF00FFFFFF000000FFFF00FF00FF00FFFFFFFFFFFFFFFF000000FFFFFF000000FF000000FFFFFF000000FFFF00FF00FF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF000000FFFFFF00FF00FF00000000FFFF00FFFF000000FFFFFF00FF00FF00FFFFFFFFFFFFFF000000FFFFFFFF000000FF000000FFFF000000FFFFFF00FF00FF00FFFFFF00FF00FFFFFFFFFFFF00FF00FF0000FFFFFFFF0000FFFFFFFF000000FFFFFF00FF00FF00FFFFFF00FFFF000000FFFFFF00FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFF00FFFF0000FF00FFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF00FFFF00FFFFFF00FFFFFF0000FF00FF00FFFFFF000000FFFFFF0000FFFF000000FFFFFF00FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FFFFFF00FF0000FFFFFF000000FFFF00FFFFFF00FFFFFFFF000000FF00FF000000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF00FFFFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFF0000FF00FFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFF00FFFFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFFFFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFF00FFFFFF00FFFFFF00FFFFFF00FF00FFFFFFFFFF00FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF0000000000FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF0000000000FF00FFFFFF00FFFFFFFF00000000FF00FFFFFFFFFF0000000000FFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFF00FFFF00FFFFFF00FFFF00FFFFFF00FF00FFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFF00FFFFFF00FFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFF00FF00FFFFFF00FFFFFFFFFFFFFF00FF00FFFFFFFFFF00FFFFFF00FFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFFFFFF00FFFF0000FFFF00FFFF00FFFF0000FF00FFFF00FFFFFF00FFFF00FFFF00FFFFFF00FFFF0000FFFF00FF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFF00FFFFFF0000FFFF00FF00FFFFFF00FFFFFF00FF0000FFFF00FFFFFF00FFFFFF00FF00FFFFFF00FF00FFFFFF00FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF00FFFF00FF0000FFFFFFFF0000FF00FF00FFFFFF000000FFFF000000FFFF000000FFFFFF00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFF00FF0000FF000000FFFFFF000000FFFF00FF00000000FFFFFF000000FFFFFF000000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +%%Trailer diff --git a/docs/verifier/chap1.bmp b/docs/verifier/chap1.bmp new file mode 100755 index 0000000000000000000000000000000000000000..6d250866dc5db3c02907d97deeeab42b29bb608b GIT binary patch literal 752118 zcmZ?r{Z`4%00LzU3=A3!3=DTz85mwLGcYhRuz-Xa8ldtZjsOD#0|dt?gFG~xB52evR1Ef;R$3<^@Pmq3hBJQ@P%AplMs!y~POd;#(v*h?VBC>{*~^bi0i4p2%N9vI|3 zu$MrLQ9K#~=pg`39K$26gM0z<9@tAD#wZ>Q0rU_6Ck`-yE;9uA5Pv|(A?W;3C(}Lz zz=;D)(B3YZ+W_$ggrvD;qZSOs5CA6*FfkNekLG5GKOiKU)F^i}1VAAGP8?tY#2exm z;tvQp#Jw`=eA4+x1z*{IaW z4FPcC029L?3?Tl1ki)<`qh6qX2!Im@n4rGdbT<*=4+u$j%SSC73LyYa9AIK7xR!t$ zA^w1n1eA_SkIWDNCk`+{ivK?_@DotZKu`sK13oZdF@cafA@UFszwx88BQylSi33cK z5#`v;PZM6({0-Z8dbVaWn0+8~xfNEC@t&S(fgLI9jNzyyR(97#laCsY9tun3&q z(aj)~iy;1hkOa&hl^&TP08SiWf{_0~ieTyd0|P(2@CA#336Kh?DUgyFNdT=8Up|S{|6@yFo7*NKuZom35|i_ zKd3zoDs=fld=P^Hk|04!_(6P-3Xn3eIUo~3f>2#xIj|})!2lsaCV(;q*mRIKu#OKP zS$>!fkaZv%!Pfi-sRk*;fkC!Hy@W%>sPG660dNul6W9U*l*%Bf4V3=)L0nJ*{0~l; zC@cmBuoxu&K++sYHAwUWR1TsYEDB5SU=BzR#06k3B)x-81KEJgh2$`74uy!pOo8x5 z$s0TUQf;L;zIRzZdBe-ML#fge)%!c!wC<^KnZfzs*+SosdhBcQ?bp!5!DqQh7aqd@ZDIslYi7@%_CGz&5cl8V7K1~>^L z(mT|AP<1knd%ONC&;KfQo-`Hx*hdfYLi! z6CS|@75P}52^EC+142TDMyb&dKn?+L;s6uKqHs1SiGorr0)vt~B&CB{2njF?RFWgo zI|DfNf{SWU#sH~+q<0XD0o-gykkH{Eh^cTA&Hx!On%?0NGs++@1i(ohOkmXyOYfj^ z8#JH@O}n5n9@J_Fm(0*a4Hko@cTj;28ma`V0gvQ>(ltm0YI+BWfNBAdEZ+1EGM52b zZ(wyOSP$#g zg+>{pA%GkL;3NVjkVRo^P`d-l#;FD*59)q`XgG!?V7LGp149FvJPs~iM}RU8NFM=3 zASI)Cq=o=EaexVIAwYI|CzPH+@;GfpxCEpO!2=cYNIXm?#6$>*DLX1M8Um2YA7=`o zAiaae9&v{+C?Vst6`>8J48a49c#QOp zUk432D0PzQe90uMQ^#b)n0Gv3$1oh3PyNM8gKuEeZK^ zCk`+{eY5FqBE%mMlJ1s|S~wI!0Gv3$#87Z80XIVY0U-$}9hDxLAplMsU}6~fAL0)P zISjlr>ILeD061}g3F@0ocM~E0fRJ>zeAL3B5CY)D0ValmYYDg!;tvQ(K~>FGz7pQ08SiW0?ZxS1jHW@ za%lTx)b%t90dV2~6Ew1bp2kA_0U_yW@2FivCIrBV156AVC*yV~#2*k6x2jQ@5gY>G z!~rITK_Ec<0U?KhcSgNH{SW{r4lqG|v*~Uk#2*ln?v{^QI21wvoH)P)ja&a)!zcv6i33c~##5l; zortsbsAD|#2DIIdhHZ4rYFcabr2#Fy%Dli%X z&?_-$mO?;R(R={iISIbxhUVc7@dt#Yxn-jk48;%tCk`+{1J{F!_x~RlK)H%8Lo^V7 zKu8*RXVl1{9|GXS0VZhR7f|sIPVeA^PXi0kjD+|DLZV5Haz{e|6awJH0VY5^>S9PL z2bJ%Td-$kpIu_F){(z8Jq(_BDLjasOzy$Tf0$jX<%XiRCV|18gh4=$PQr|nHCJuuT z04EMGL3PhSig!qQr%wS7@dt#Yx_3qm91bA>P8?u@>c05^F&5mO0Tu96w*bRHh=mXm zW+Uq4F4_fXs3w4vLKQ&Wjw%o0!6l#yL1JhaYCoFjD0fhV0622M1l64bO%agv4!H=B z>UN+S2=NDm1l1@E{Ge3N07}OoF6cgb(E0{w%L-EefD$lR0Z0Y(ZhIsOtQMpOe4!xt z{%~+J4P*`jNF0P27(iEygNC7?R)BS(x^0v^@DUl@&PoxLK7-<{R5POUHA%814-{N2?z}m2Vtc24v`p5@1Ou4j2N6a zzyz&a2Tkv^G9KAnh(91C*7Oc8m0@#Vl%#ivL7=n_!lUUOITi*r8=N@61g)GoVCfx{ z;`u>M6%YoMyP(zx1cUtwO0(c%9a4;g5-zm)gWOO7DFsV`nk(RD3y245(|kZy1`-6d z*+3HiVL1w| zA*mabPNCgsP_hR38=kB|jQ=3X4-BA$3{Ki0osjen(g|s{fF!_bA$bMFgh+rY0Fafm z3dm7&sSpC7CLFpfqg25tSIR>Z% zNEDm{Ajulk3<4!`NIn2-gGfNrJ4l``tA#+G7{w%p0R7VY2Yyh(0XYv;h(hxi#Cp`~ zA1nq^hrl2qNTV367iJJb0fYro22OPlF1WA-CqGbnhc<0M1wL4sfdMQ6O1j`;9K?W? z@1UkXD1U$@K(>KQ0V@YFz~w*443HKO9!>9{&=?XJoJ7C`t(*%h-$7{yl3GAX4#Wbb zLU5`BB`uKkV0VCIz_|fjzJgOANC;fyf=W|<2Jix7(2zIC0FXWy2I~jwg@}Nx1Sefk z8w8yCAv~}w*k*8P4v_&RT(E6m2FOa}@*T_vWjQbd)Vjee-$5F|(hzrmZ5bs7R|tTk z229Y(U5NA!Y7{`z1B3#nVSX?hWIH$&fyKaS7M|Y0LJ(DutO7~3prRht0^PkQ^wHgYp?Xk%AbA^bRi6L25v1;SK;-M9}vA|NkKWfSdwS268*d1dx>= zhk>+>;=vaJ;KTtYXyrE4^bSrs2m+L3ASoGAT!Kn$2Jnt3P{ITy`wyUI2TU0#W$}ZX z6W~M#QjP3vh(91CNF3bG0Ht*h2GtE8K(zv>lm;hfm?$XCf*k=e8CK$h+z7G`WDbZ8 zRsgaP#DVGnF+q6-Y!6rgNCKt{q;nJxvJe0#4lqG0hr!Z2C@DZXjvy8&<$#h3C>4U( zAlpGH29(7Ae*ly4@*U(nNZAP$2Nj@@v|X@y`24?==O;OP)lhk$H?Bv4o>4H5xk zki`%TG8tkOs3w7>T#zL0nK?0Jp4B%6IT&J}5bXTnbC+ptK3%gS0|0ga;u(BJlJM zN|B(H4Y3s@1+oVu0!qdpHpp)9=5kp14s{ne<$|<<6e7|)NCe~#kTy_u1yk6z^T4oW4UBnKM#04HZK2b3Hk&3ACgjy=7D z5-3O;DBXclB`nn=+YI&$+&3VzK}i!?1%eG~m4Ff|Tm+nQ;XDWftO$~ZLH432WNca> z8b`@N8Uo-X0w!qXKzMp*VBiNg7C?yzRP}!VwQayT0Fp$(ok@@wB-KM$kn)}XKf?!5 zf&(iArF2lr2X|RfW_BR{fRG^NAe(S_3sM+^TQE=~uq9ro0U$?$%|pvRFfCAJIIJ2K z9z-DkP8?u@R*r(DcTf@s6}bouY7f9ld2sp84;hSsh(X3-KrIYVa)XS}fLKs*aHc!xe*h2n8@Lqv;(HCWD*>P8?u@Rt`l^ z?~qguPPrfgR8m8dEu?n|7lWp2aH$U|hapKEQtm?(qa`$mKOiJ1v7$*M`w)^;k<&Y} zEQ}2`U^KnM0%XY3;KTtYXzLYFsSawVgRBBI&_T^{aO(z4fJC8f6^H~#2_$)g+UlV6 z2FeHEtO82!AP%ghgXC_oF<^6$1PL%92_J_dXnMyX3mV@6OA$~8Rx?TriVy%N5il{3 z&cWpX3~>wr6jwuJAtZ{#C}%VTARz!w9AE;%9~cs=10c{*~^bi0i4p2%N9vI|3u$MrLQ9K#~ z=pg`39K$26gM0z<9@tAD#wZ>Q0rU_6Ck`-yE;9uA5Pv|(A?W;3C(}Lzz=;D)(B3YZ z+W_$ggrvD;qZSOs5CA6*FfkNekLG5GKOiKU)F^i}1VAAGP8?tY#2exm;tvQp#Jw`= zeA4+x1z*{IaW4FPcC029L? z3?Tl1ki)<`qh6qX2!Im@n4rGdbT<*=4+u$j%SSC73LyYa9AIK7xR!t$A^w1n1eA_S zkIWDNCk`+%4EzuA2ZS63-Wl}*^+N!hIKTw;&8EAF5Pv{Ox?4VK;ZO(xaN+h(93YF!0W(7pNZs;KTtYsBbpiO@#OZLekyxQ45Dc z2!Im@m>3GKCE!MgKOiIlrK8d#GX%hi156A9|3mx%A%}r?M!i7&5CA6*FhPB@>24y# z9}tr6mXBIE6hZ);IKaeEa4i8hLi_=_=EsBaexV``3ZEIFZeij@P<;b*`SmU!r+t+5(Ztmhjy4c73>GwMdJCu zRIql`h@le#;3NVjsODy9dIu+K(CO~r%f>)wVS|po24Rp4__AuMSqU`=;tvQ36&j^R zLjXAhz=;D)Ad6DO1|?_6okyU148UfC%61S2mG2;F@QpR2Bjd69V8Q0w$>DWq5iAHR2(u z50utH7?R#W;-l>us)hHcK_r9#IH`jP5;Wme3c70sd{HT+y#h8Hl-5BQp58&XD?#M( znnj`{*e*y8BT?t5@(~gO;3NVjsO4dJdIy#BnEh3-^l1B?TA@8^4rw6(PU>KSG<~>L zLlQLT+A&aqhm^LUvK@pWR^Ierb2E;1r5P~?`wn?=7{ng+;|6xLvOaGmd%j51WHoP&{2biQwV^QI+&oAuOR6i zbX6)!dIzU($oM;04$P;PoltWi{(z8Bp;2ly1du}joH)P)vM2>?@a!t6EC(lOP=6KD zIR$ee=^ey`w09`52b)%iKOiJF`BAYE9|GXS0Vb#v6yW=+LFpabZv`zQ_yArk14`r! zp!5zG2hF}x$x^5>5Pv{OsL&`i8Un~608SiW0$G#-HZ;96fEwux{2=oG2hd;)JiUWj zIbd1-52NjO3IcjmD>)$mPU>KS9Nk#-fJ<#~qDPYimHB8w)aF9`0U@bv_NaNoA_TyR z158lKJK$uEp58%%-~t|0;#0{YEXF|m0U@zSj|z>3061}g2`YsJC~1S5EGVl5K!T&` zok}4*Y77M-08Z*)f&xR3wStm1sMU^<-ogFU(efQRtVY>%4*_se2NSfk8k`9}Fo4Hr zXlM__9}tp;){GiGbOAVVfQg~&2e`{2{(z8h!BNI&2p~cLoH)P)LTt#gApU@mL)H_c z4yR=ZfD;FpprtKzG8^I#2uUX^N39uJAplMsU}9*w8>?#}{(z8J6^sgw^bi0i4lpqc zLIUCs2ssSAGwKEEhX6QnfC=iGO?ML^{(z8lw|vyXp%4P#!~rITf@=x55#kRBNkHkS z^vDbWaN+@2=NDmq`T##77m3F04EMGF%(=& zz>N@pKu7{gN2Nz*2!Im@m>35Bhxh|R4g>FudV%^O08SiWg8F9D-9(5#ASB%_AGL5O zga9~kfQg~tS^{o__ya-`P&z6-GD85IIKad(@IS;K5ONrJXVeSS4*_uE029pfi33aw1=kXABg7vNl7P}t>5&-%;KTvhYBwB6P$YuA1Y(Th(GWln z0dV3N4k;bt2axx`UIH;j@n{I3hX6QnK+?)^AVJ;(dkMrC#iJpB9s=ORF&t7l#1A0v zfxQG`jN;J{Ko5aom^g-^m(XKvluvF548z1R4825d?2hU~4}oErIEJB@&|__sPi_bd z!^ANRy+m&8j_N}X0Z2D*n33q79OaLO05k-KSxSd^2kN&`YBU7ULjaOMh8cnJAuyWW2QKVKZKiVw(BaT`I{RqUy3r88 z9Rj229e3D_$_&2{fb<`!eGlL83#U;Z4T}(f6z|~MJ%)vUMm;ea0{B7zblEnzh{vaB zRBki`hDiu8fbWtAU&%U5d^GBf(Gb8L0-%%*F5gjZ>%*;nRAw{;hHwagnlt}FxAKjS z!4KhB9CbReApmO5{AXbJ4=Uz~)ibJYGz5lf2!PW$B)yL|XohMej=G!J5CDxvg09*I zT`xa61W#obaGpdCKApmL4&^o<;V4zV(qCtp^ z8aa$Z0M>>97r-zM%)ekka8|%bt{>n-IdB%70nr9C1Wb=MXu!cRN(^)efG1b~gU2Jm zBrIWr3S`h41CR`4?v;TboQ@$9pr#K4KZp%s{r?Z{2!Msa+Q8%aARS-^$drNh>8Smq zAplB;kb)YVmO*J2+V1!OO1hx7J*dnFrC{)yGH|lyhb}$5C&T` zN{oiUz=Z&;IRh?(Aq^UcV?KbIFQAefRCt4uE?5AmdJZaFPet1)z)qHX2NTl!6(f#ApZ%TnIo%BSGzWup>YvIg|lve1kiqkZb@>!(b+; z*akImAO$;SdI#kZaQO~42uh5mcW6M2QUe(R@In|=n1dVwqrt^FC}l$gplKMM-of2e zP?P3AW_t!y^20I;$Vf0AP4D1f7$pWa1TfM&%sJq82|uJ5|IhFNQ~`hsd{9CMRRW-a z8HhBbmXabe^;PM?h)B`qhG`)j^VU!ry5P+24kk&VfOTbANR8oVJJeYu|cTgh; zT;PL+!7Q)|5ap1h4j!{dG7)YOlGrG7Gz11J1klqXs62+GWDp5X*r1^n*t8P3y#g-Z zA;}xu(7{OWNCiB)`2*$8QF}*202Bh~=@FFPA%m5mv<||c#ymJ#gNEY4=^Zp418U7c z8%3au0d3NQ1~Wk|dyvTxjBY+ebd($ofq@AD^z;Zy@8~W8tHB}x7lJcDt$7sPNHQqm zqnyzY7?2PEr)4CYu_aKj8Y~iUA#kG~(ue`8MVJSz0uTbDtkDn{$PhqFpP;4+hI7Db z;E5X{4Hv?h-a#We2=$|^(GVEu5CErTBuBv0Fp?Np4HgNw&}e!`3awG*U=9IrS{}>} z9Ch1h2v9KuM$3z^g(WnEd7y_f|or-}uYSf?)0krfE?}Ad#;qdLP z)H8C_q|p!{GX&7mI}OImN7Fl*Q8TKI1|fi&-f1yjPJ=3g2H`Mj5 zOJhJQ+!b3IWu_2;xD~J7{Gj zWDO)}y(6fd0}~-4y@QfDL^;Sn5C&N_ibq3Wz(W8vF@kvT^!^{Tx|bhxz6NNmJ7|Lw zbPpeN&mX8<2g^W;bx@%W+U)^aHVm!^7{CUAR?Z_DNdxZRQ3s6d5CElcLif|(4^<~Udc+C~8-dw6<>sDiX?Ae~u|2t+xkT7X$K zN{@!XfQJBTdIz<>k)4Dp3zLDX!Y&Oya}1_-lpYO%!4v|hNfy*nM|K^mEKG)&^bQ)? zgsC5;M?+w+gaBHK1~q7qoQ5U~l^IR%(0~}FhFl1srD%9k#^(_t6rtrCe5Q@cjfMdI zLI5qj)6e2jn?^%m0776iy$?X3k6JlkU^KlCSkRAJJOCjun%)N>&_}Htun-_2y@O_v zz{|u2%(0^ukA?t+AwXh!hu&IAp{1kRM?+wMLSQt#4^Y65T00;ifSKOG=OclM{}2-9 zF34qlFdl>kYe$U7qiO&x5{4)nB}YSGaD)Ij!NQ#a*=G$omjFRR7sG>>K7tzXkQI~Q zeSe^}@1S-)XnqMS4B65RmILj21sMXm+X;~+;C78NMni!9A%KzIL95w8%OAlB7qpKL zvh4$$fT0IiRN3eewgqc)C)0D1_Zr+3H}CU9bf zBxg`+MM~W$=Klv!QU>k#10BYJ)O`8Czz;Hs0b&$L(SZ1G)Y8!qKn?+1=^a#1 zW2ARbsz*)lkOm8A>jx-tqqS$i+|l%o9NeSq0S*CLrgvyp08}fCmhS@`&!g5uLI8Vu zhYZD#T)u<$@F6v6K>u4Z-IcoQ42tYyrOL_;l$w4U;R6c`?YX}2E zg3~*g2{~;8be<}Nix__gX$E(5!2>uDS*0efY-hsLwD% z05!d1%8!bShQM$Nfzk9noMLm-FN8v1G`$lFp;7ta6au5^eK^JDs9y+$z-W3W6hfo& z!zlzt)BA9W%~8J)3W3q|PAG&%<%d%UjHdVD6q}=d84ZEa5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu;sx`qH~chK;_bPcvq%Z6wO43D%9^2HF1fKg}DH3UE@Wq4q^2HU7*Lo@`2 zM_LE@Vu(h-sI%!B0>foWXt?-;u8}_iEgLTBWVrZa1SUbcdU?2{li}hIx<>v8v~0Mf zli}iz5tsz&>gC~*PKJv==o14S0gRYT30xcUZ>14S0V+1Bax_WuIq?6&|54uMF2()atq?6&|j}e#z z>FVX-l1_$;Kj<3yBha$pl1_$;KSp2@q^p;QOF9`Y{-A5*k3h?YOF9`Y{uqHtkgi@H zF6m^r_=B#IKLRZqF6m^r_+tbnLArW*xTKTe;t#q;{s^>exTKTe;*SxS1nKJK;gU{< zi$CZZ`6JM>;gU{&PKJv==pFwf&A#E1PKJv=Mq2u#w||FAIvFnhpm+R_ zH2a22IvFnh7-{K`-u@jf>14S0gWmB!((D^9>14S0W2B`&di!^{q?6&|4|>P{NV9La zq?6&|kCB%C=Ge@ZlMn*n_$NXAU{#9b4+b#!|NlRv!wTa4{{SKxAQV5C!w=zrk~~Ci zu=;G&UDON#q;x_}W9e=dl0U%7mjN}sL&d-pKbV9jeg=L}wt(aex;uK*Lb`_lQaYi# z-PE)Y$sds93@N|=LrQUQiO#?Pp`hsAQK=y(xL`m6iiBPJx&2V3&Yo zz;0Mqj_pW#ko*C%6_lpIc7Xb;&};?bgX{;%fg0`*b)fb;Oa{rkQReUr0i<+7h6h2d zaA@NNl!728fYZ}|21NR10FR6y_}~@}D4l^ZNIyg)B_xtRAn6!17z1(>*fpR84Z)D? z2g(7Xp8l$byml%CMi zJILc8VVvn5mKZ_$L5eBENdABno2pTm43o(GwJBSC%ca+&bs(WaJ z08%<3!@;0*1WGTUgbiYYjes*i$qgg|k_G1mkW!EUq)cZ3CpickEJ_Ih_QwYXP%{di zoI#~Hgaazm(bGG~Vo-XAc4k3C@Ss5?N*pn&chH9bIGvE~N>I`UC1OyD2C=~gK^fpQ z25QxSlRY@SgIORoU?sFo?_j&YZU9*gPWIpi6)f5F!+4N%56T;(%f>))GrTd4(>plu zK)C^w=)frqEJEY-4(^JAY=x(HP$3S=d!Td=b_S>;0hWcPdywF0dIv|&uqJ4m-a$zW zl#)QDCp3kDg=m!CLE}ImtH5?ZqYZ2ol#NLtC2@#mOeLct!zl!4o8Ccbd^Eier}Q$^ z{X&)W4sI($S}d^fZBV#?TJ|6s)Up6!@K6mn3xH*)-+qS_(NL>EHY2+R%15O}%Xif9 z81_7BrFZazDk!wTjbac3oVvj+3s3?CVXz21y@S#`sIdXUQ1uj0V1IyG=OBlGZ6(UE z(ezGKFby9?;B-Q^cVKB2RJKD?G%UTN&aZ-N07z*IPK=OI66hE?I17;N28c$mKSt9# zBrrxvoFM>CCpcvZNq`eKmi04`k{mp`jbK6*L(@AbZ9;|uDRTnUiBvHJYSt(14S0VZue4=5MF^n&uhP!5Apw-XKlSX>iUIk;6I`2&)KAtw)j*pOro*`5t9 z;E~chL=HADhGfX#_U)+a$PIzv62%CAfRgb4576=*G>;293l+519@dTrm+PRi9J)vo zv{M@re4vZ~VU3c*Gz1Xoggg&|Rs@4|!W+S$R0S?CVXX%wS(svw5Cl`L$&By^#1iE6 z4ms%wLV~OXC2K@_2X$0IqTn@d;PM~J8>NO}2q4l4S)KzGrl8afYBzvraH0XHeXs~L z`GDB4!%-nZAQ4cqgV1DIjj9RZ4^T=5rD5>Nzu*=2U`K-XwSsH}yAYiALFGJD1l6oj z-tY|pL^>hMkKptQPCej64l)BO1g0Qa0G!@X7ym+JL8%eM0%@ZVBm9Aq-od7W2=G}q z(9{j0K&n8E9Izb3nH0KURQpf}0Yo|>%eBzt0!h)}q8rA9$Y2oy+XIz_P}E3n2!DW5 zGNgP59l`<1hG1JD9H`~s911DlA(CM6QDXRq03w}`<5y5y8JeO%sRv{PD7k@!z-bDc z-XVuMf(mmG1}TChK5&@}VuFPzBM|-oIRKj8L1u&YaD&_fW<%^4E#D#GFcL{bIw8mR zptJ?TpaccN;Kng{s2j_9si4dO!XS%4wE$Q#I9Gr~D8vYVfUN+J&wz~l08a1x|384w zVEO>fe-K;2<1-K@Na-jZ0U>}$C**h*l-5BQRAM5fcaRXsIFK+jRfE$O_@H=jk^_ws zg11FcE4d;01KdIZjnDiCr*+VL6aNQrT>=>m0?UJ(h;S3gv7>k-gaA@HA;Y_%R0Aqc zK?xhgh9+((6V}85$wJyRputK=dIvQxAUv32GOS0^0`>>;d8weZ4NlpRff;am2RQ^} zDbz6_E?5cZm{rgyJ(78&%;6aV;B-Q^*Fb3%S9%9ESs*(opy>*v7?uUVyZb;Xk*ei8 zB)x+zhL-Q(NdT|_sOtc72wHlF$boADXhtMEFh(^Ffe@f^dIyI9D49WvR783Q7w{k% za5ey|ql5ta1CriBZ6(m)J19GWEP$kN7zv?4jU0$uz&TXgd!*ly+cOULFo!Jy+iea8qj3hkI)GA2hr&rWGQGE37#d8bs`KMWevL!0H+hOeFaUk z;FbaA_zbAz2N?}X@1O=WsHp)zOhqfGhwP&|m^lN+VcM6$lDuE680?(b4n{ z4T#}RQI^;c=^a#Bf=hEyvIk*Mz(Erfh=Pp$fzmuUy+e+pfwZtGa{|a7a8d^oFq`qV zXGYUIG|)yMMOk8lmeKIOCwN{HlJp^`>_HMY14sy*)8|)fHYGe zCgCaHL0wjmLqPcuqIk5wI#K{QosjKWNOA@DIU(a5pmG(I>R=@|EWLweK@w2=keHy9 zN45jt8lmRG`J;@{5Wp4!6s8k!x&@D+gHtr5dpvf!H7>L14S0gVOjM)sH^}hD$mbF8;tDTcfg+ zhQM%1C&R@bl*Z?%e*7UYT++#K@dy6c8kMCq1Sn1?AOkR_NRb2}Or)i^prtinSEGo5 zMJOOZ&Y(d1sMZk@0u-hb(8?I-Q5WFd9{<7SftQSdSA#)WU}ccSl3)?Yb`SUxGb)5N z*j_4_Git=}4gm_&2_*GGNN_-b%)?CG5Cw=FzyMnx57t8s0%R{W%o#Ofc!vOG=>(Fp zA*mTrzC-xPsT)%Ss*`GgOPN2Y=8RE;26+fjmQFzX`5;SsAwUpz zH$t21APRC=0ce{D)k23de^AXCqXrG~5TGobfKxW8s0O8Kuunnefs*up@PVn|<~;bA zbx;EaTH=G!IrzMz|NlRL^-zNV*-H&`M$H)BAwXF=fuw9uDUVdX!kP_-(kVVunY1EYA90HW36G*BB74YDa9-N#(MLj5qLrZhW-Y1X%tc3$j z?_eRS1ubR%pqevA4I1PjKv_D0q<3%&9%>K+?63k@>ISEGNREK!fYJ0m$kW7db{;gD zlIcZ6sg7V_lt^s5YvF02R_Z_|gnmqa9=(1jAD|yb?eX0UuWl(?bo< zfb67(IiqF_?+~CYoq&sN(EKWh0SYK^qa2jLK^WYe2Z=zh*MO#XkO+8uW;DHnf@~Di zGX$uV-eD(gz|t}bA9NTyNCNCH5CfDMAT(Hr8U$tjpoR-Z%@_(HKw&xor&@jp3GyzO z1?j(nxDXbs3yUNI?X!YQe6TR31cm;f)cR5VLnH(!O(&oP4o=mOqzmFgk~hTvpmU}n zXQRR_0?$5y)*isB0Ej|LNtp4Jnlq|@c!vPB(+Q}lf)rwy#-k}fQcDpN(;|wD8`V5a zLx9@p1XREy1r?_8qv;(fct)A@4gt&rNtp{q(>rD1H>#VqAwcc)4jY(+x*F5?(efP{ zG^5l&gaBrOq|gSZlj8r#pz8o&;WVrZa;8McKuz9$oli}izk&)^K&X>a_ zoeUR$3|vYW88#1>bTVB0F)~u!!1;2xq?6&|kAX`GBg5w5l1_$;KSoBX8#rGMmvk~* z{4sDTVPx1mT++#K@yEzWbpz+i;gU{7->e7J=0Z>XA9(drw zaMb3Z69U5{t%H0qbi#bprK2G*8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0)syUJ}?Y^H;%e+Gz6#>0;B1jS|K@V&X5QJ1_u5i;m%PiSU`+*-k1V5VKM*&(0fRY5L z@<$UM;#^RA2h~~NcFhp?%c%3I7y_U+?l4RgANc=+8Z?l`8Wn?U)TkjH0-&ZlC{26- zm4!pvCuolU!0;d3paFSqwAYFjI3tz|N$&p{_=jhDhh}0>i*3Y4@uEeT z9onGz|NsB+>z*LuaFj)K2*AocP~8tL3W?S`=oK=6S~4(K4!i0L=CM(l_z-|4cThP9 z>Dv*nckrtOr}tr(iwA$W4^|gKo9_QX#UN}fW3alF9Cv}%&J4d?OioCQ>H&oSV#y3> z9Ao&U3{ZLp`3&UOQ9K#~h$by4t%Fj>@Cp-KjT!0Gud5se@932A6)Y zk4Dq`;EI&N;2LnH4^AC}!8KHK1K3AkzfsM|QG?3g91s57+ zjE2B}NRj}jj$suV;B5SVbSc5Gic~6i22$k@*YpnY9TkFU)QDjc0?=}BnD_?a4T!%$ zb7=^%QPzkL0Z4P^|L`l{q2sNi4Vn?3#8CnOk{*U(wGU12!_a3a@i)pLEd(Id{xD1x z(DXjqpdl?i40F}cgbt;KlV{=SefTxihEp`r*)Ndh%zs$optJ3?v<~K_VVIR^8EnJc zY)ErvIH&i~2F)-}!lZZ)R`|gRLsIk(6}8YRY^XSQ)SWa80a#iX&gmVNr)e0Bqec&r z5P&vkhGTmM5d$z!B1A@6BQpfxMc;5P-$&QbjLgK1#n-Ur3>K+jBm~dZ!^lsgULhw0 zMo3LRLcB>%3K&s(MoPgqGODo=m2}DS>_|xm&^2*nh0&;{;S&NQrk)=$9vwbulLkH+ zDa{$s2|F|hzELBGSO|=i<_svkj~+BO#1bdZhNfX5z?c&VUN|p%y!% z?xl7JjHEJeB-LfqPA9{}ypfdzMpEV;CJB_v-WW;Enb8Ifl@repG;U;-cq6Me8-mG^ z)=nO231DPpZ(66Gp=bWcYR-%{Xog-2rLK!dT6s6p>ND!5mLYH2$cz4wmcfU75~ZpK zMp|=bv_V7Fc z<_zdo`O!te)JQu+(2SATocTX`F2@i|snl`u$ZX1v#6}!-(#udcWkfb-{*RuVI@HrG zneHE{1>MN3*2qjG!${jmjrWn7&xcXcCCe)#v^g`{pdl-@40%l>x0oBL72A+cvJ`n> zj zqYWA|(#sInGO~-fkzBbA@q|mJ^G9}!lfP2#0|NsCMO7oi$PRfjlPksAD2g+RZ69z0 z$o4)sy;E{G{fE)?J^-;lvYRs$?D~MDcS@GfQ&v3;Kw23NR*v*ShU^B-2L^snlBXaI zj5cT}2s|>i5{&L)pC1S{Xkg6_Y#{}c`;Q_C7e&Mg)|`Pw9YV(_izXpJusJjA(>tLM z0Ch_l82*DOesH=5HA6rcl!l?91Cj)#UJwSWgk&O+FjxgtDTEKM7QkgY$P}8y>ZqZ( zLI4smxMV?_JSpjt;W2m6NTC$XSX>23q|j6hQVdF^5Dbz6>i{u8X&s7T12-UHkV=SV z27V|XlKL4y8wx3D{)25EB}fVZQ2gQ704|^KD;eUl__I7Lae~t-KPbFFDVPD$cn6o# zpgu1H0|PXz!_qb=P{4W^82&@e7)|e>Kp9YsRGEVl_6Ja8qPPfDm7|nG7%EVd4?zx6 z7+`TdC`3TX8d4nNOz)tk4me?h(mQP07M9*YG^i;AqLFh7$TTcgjtbE%1mI;GxCnx@ zEMZZ{{~wgJ!EpoPn6TttAFu>1nb1E72ZKFJT-Mg%Db=^w>(3IRk^Ly|R^gcMUCDNuaDgIEXmAz*Ge!ye zgaEuMhZNgL4NOq=izwgW5e-o{yvq0g@KC@O=%B<2!k}yp4+c=kKoc`a4@e%Icp>Q> zq!gUMp-N!g*U|J23ao*|@RAKw3W1^n6r*5_l-@xx3G1jq)qx{;ARSIsyFpbMP6I(+ z1z}Jk2GxA9YK|Y8m_Zsr@}N)xVQ7f}P48e`;6MYZ1M@(JjJ9V$!9jP7h-h%j5)@V7 zK{8PMf#g6@3hKs!`&i(J28sOtKg`N^yywtB!U8h>4jPF82LsXNJ2-`prgyrhZ0r^y zDso6V2E{EXDnT^9^bRV=u$wqEMG@hE>3&F9fYLkv{}0I39H@u@Ny0jypi~XwLkkFy zN#N8DF3-WmJ-7me3{Qe&A-M;_8YSrw0`TSxD3QbB4P2OmA_-QKL5qAa7ZQWRt$YXN zZCv3EO2Qxv9$|;3cTgxm#UKgx1(dKssTf3q;tNEB$^Z}zs{24HA>!ab z0|hCF3rhbW8e}AhhKqwaqXex(0I3=WRnDOL6*j9fvdVXSBQ&7I3B~Yi4^G#h)C&nV z2n*Ev0TmDs9ysnmTnGkrP(Of%zd+(3<3RLidIyIB-3UZ;1{6o&Nt%0cNLRKA1NfyF_hpmq*8 z&_G&2WA*6i9ikkfbd;od2!QHlm?hA{2^?|Y@kj^@ocuvdXu}m$iGyMftbACdcTfQg z3k;HJaKZ%>s9HfG2g(}Y;DSuaf|@!ol`tAr(Z2rg<39NKHGuz5xXTrUG!n1rw-pps)g^cTf=l3NR=irV=cLs$-N# zyAVLB!@*GjD!xIHfJpD4IvFH|H2nmMIIx1@RKDXKf=7x1a?(3w;0qLNppb+V8XzM< z1DGIs6w@UH(26urTtHGcxFHWJgFs3DKX^q5xb+F?UV-8b)I=pVh0w(>lv{#a+2Jt_ zdwK_J0EHNsfgnI(3Mo}UETp;;+j@l!#Ox1J{(jeq~IaeNuY=x))7Qna1a}8qv{4r2oPDI!JIq%(>u700rT!CJ=_3^ z&6#1J-bu{=!!0=sd;gGFe-HcgKFs>x!#@3z=)uwA3_ZX|tnkpakMaj~2#m%qdh~#5 zFmy36AIm@^SR6k=o-X`mj>?i90wgwP$hKz)X~Y#I7 zj;43a5FR*@(dGkeP7F)Q0J-Q4z{R07ukPZt##c0egc6GRuZi%7aS_0tp(t zY8oCK5JTWx$dVc)F2pcMv|y@5QaH*aCj@X*-Q*ZGjPzg+6-e@fEPw$gOVDCD=vo-) zAqC)-bD+cuQVYSLB}U+eKZpy`0XnA*w0<6fAuA@qtE@q0f)v1v1hGMyhEc!{xL2^3 zWCQN30d@c=#bP=ER+xiQFDPw-Q!->FDd>(KG+9RMn0id7&C0eZIJ6I7Umwb%_ zunl^bVwPi|0tV8u1Vt$*20>8(i2zWvf#L@w0`eL}Eld=YAoxKE0wfHQ9>N&pZ*=E_ z!UN<-kQYHEHJFA7{0Hs8##6q7RY5C(|Nqg-cTj@`J-vf-4XFJD3u<)7jPl6|0W8r9 zO03|0tKc{SDF6jIB)vmAP@w1n#StjJAx%%P9&kAiigPHB9QOD!qfWg5nWOQ|`C{H33V=fWiXgJ&g1Y@-P1J8BhubsQ{^j zRFGhUz$2AlG4%2sEI3-eQ#%P@Da9B-#T4%J4vr^K4gfg?Tn~V&c2M2`w`;)iU>-=p z(8b`yjp}@`5ZG&wbP7(yApe3ACnz;TY5-7n0F~=73{nAB3NGJ4YC#nwSQKIoNN6;@ zqlPtYc;FaBGa7u(5|Qa0T#duk4y*KzWl=CJse=+P*wf&~2DFU_PVdli02HhsCIrJ$ zHb@01X^)ogXeo|J75|h;RKe2Hd;W&z>EN~!G#C-&>ygo zLp2l!m%FhvXFxFnNy8u(xP}Hr5~TeOi3Ct}437keT2Q$KQV&rI<_#{NlI|K%A&sgF zoD88s0390#b=RS37vyP>_rW78pez9qfCL1L-l0hVA_;E&gVd1is==ZWRPds> z1r#38>JOCVL8%oKR1g{(2;gu5g)2l9L_)#^yodl)po6qP6(h;QWWdQDnwg-gz(%4t zWRyc*2w+y(kOn!V%LX6S&6Z*YnP zc^2$xNZ}6hFN6zDoLJL4sLTLiM0y7$YuJ1RBw)e)f0&W5k^^kyPz}UE6U3Lv!tv{r_x0ntMnV+0R4y@SF5(x-=|a8M2amHVLd z3-&Q2y@OgMpfCYx00kPD4GLax8V8AhFr;_@kznm0vmnI{=#T`k4WsED9H^8NplHD~ z1(bl{{Z(*)gQ6MI30`qEw?RLgy2f`^5Wt8}usU!F14_K0atSlNgG4}u6ihQH4S>YJRWYoT0||l+ z8`1YQ42}=pm+tP zV^H#k$bnin@DvSVfRv!6_hC^9V+0U#;sbjcLj^d*N7Fkv7zP=EQG7w&2TJDPjwfXH z4^k|_+cTi_4HAOs2Jt~r5AI!o@&%|F3M>4fCJt2!!y6#a!aM^CCKwxyrX;Y&75V5&Kq-AVG}Y1l1>wW;G=vB3l_PO*Rbr#*9Ue%7h=IK>hB^>E zaYM^@s4Scs-sv67ngY1bM;Svb1TYFO6!(v&cTjMUS_OjijN-u=0{G){G`)jj4S$&c zQZb5$N(kU>&VUDFkbQ!qJ%g-dII{5v(s1=L7NRw>s@qx2&JPel0pDASW&cs_amT)jA#y0NI@r)K?`S~8%sf{9E8C_kaZPM zMIZ{4T0t1P$_|pqL4gU9gzgvtuQ&oNvj!=I83P;q1*-!uqX+34#pH(op61MGdPfOX zL@I?QTLcAKCkn%$qzTf8NV4Ef0pNKIh#2_94UiI$7;L91Jl}u>K^PqR(DV+~2g*=j zeWL`qA%GN#m_}e!vzSUok_e(f14`52R19K(7cPR5B5eB|qzC~?!9<`%HY9_9)=NXz zmqFA(QZuNS2jv-1S_ff}9IUtpvB787K=qBJP^Ye6kt%6SgJIExkO7H+dGLIKtqBWO zG5iQbSV8vLfdT`Bp=lkI?!ln}OYfl63tCPMSs)Ej3EKaMDBnQ^3OKccaso&{EP;c9 z7bFQS-$Bd|kb|~|U$D~EM~E^Di?z@w0);lH!~yTN1Qj))rY2YrWm7j61BRCnC=o(@ z1WL8w@*NZs;AS;6&4Vb=DX8Fp0jG0N7=i*1j3LtS^bXD)prj5~iJsm;Iw9#D#QG0C zh!x_1QIfn6Ktv%n{g7=QkQ5G%8*o_!i34bQhlqe96PpRcOAJvsfWidazy>8!P%4IE z5C!owIE_LA5VQpwe9kgh47_+A(k_AWL7G5J5Df`j(D)2EOd(v5B*;{d0uVil$qfNS z6^+dVNOXbX7F3Qw!XC^65wKbt#0J&c*bEqEV(`#{3xtU1b75ucORbg&j0`a2XM^{Zpx03@*Td* z36!Woy-|qgp?MyX^g&Y4^bT&7g9{4~0SQcyG;;Y4YS@7EgH(X%(efR8QlyS3yn@DV z93+asi5XI&fk>zzLO)Y7fX8P*DG-#_K{TlU3JMR9BzSxVBnZk3$SOfW z2uk|k^bXYt4qM3CR3I%N{RkmYB!JR7C?|krhj|dw(tEJz!(|6F_TUi!uAoP9dWSV= zAjuJ$T%i;wF@h2&DA|Jo6ru(-y+g&o6i5w74=gu;asq@8Dbzu1*l;|E4a*Q9eWRGH z5P((BxHN;(J0v!tB@DP`21gL6-HB+wgR6F2rVJ->ScriWAS7r|(kV;`5;UNK0<038 zz(JKMmT0*V2AR)W(zIE};8JDdlZ zRRPtqP&rV06`x_lLJn3Vf)XmE=?x~qLp6{9fEDlHfCBetAr&GdEJ6A}GW`D`?Qjqu zlDgsMfE9u#Q^C4HX&s~kltI8v|6vi11L6r-!iO@cnSQm_GV-YA3o5P((AxJ&@0YDirRO3$FQ4QY*n z#@@kl@Ln0H5E>cjoluxzge5q+f(Z;MA_O2!c_I{!Dj^&KgqkzpGz}s^EBe5dD7ATV!>)%=a|T?rg9&g86H&fHlR2cz z3QFnV_9blW0=s3yMwH|R4an!C=^Ydb1B}UvxdC?bz*|ppg9hZ}(ew@qg#pHdYi6>e zX@Gr3Q|k!_8%?brHJr>4AflieP48I3cC=c=5-3AJh=_O_P48IZk%)2vi>^_jfery8 z>gCb&jxCai2smuoM#Tm+1V)P~a)Y0UijiESNA=Mx1V&?x+@KvTDaZ}Efz&rzE0Z1i zqd`Y@&<&Wz(L##+pdYOo$q&1M(m5Ju^NJ;1ogx=8@qa@S`uC$}X@KL=q2!YWWnW8`)4L*v3kM5dBn=_OJ`Dpl27Jl^B zJ=&b1EW}3}G?axOopp~!7o`C{+MuB{1nH@Nv^u6Vv`0gb(h#Jl{?XEj($F5QAt?<( zI_e*dEXo6Ww8)@54C!UUXk|=!NRNgg%0qgzj-)&c>14uaR8b?KM+*&V zgd#o67_Ew_5z3>XNR3dWhZ&AdeOs)Cosgn=)DvQzwK+ z!;w1SNNZC@%O&cB@Mt|rop7YFDWlOutpFZfbVsd_q@_8d)iAX}cQhoa6_T_xXS6v( zwa^_6N~#4V%?uiC&QLFCM;kQM3rkv=G#W?L3)#^I4fVp3Rwj+s!Bh;{(ZHl)VA8~> z(ISbO!8)4WsTrEIFl)3qL(NeA0J*}7nnsSAMb!`(Es>}ioTG*f?hqJl&J6DO8Fd|X zLtr$$Q#U+EO&i=HFxuc8-0?H&y3r6A4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4FS?ZfMM7G()>NDdSr&cuu1L= zBQyR+eN9>jjHY+e!V8D$(O|?8FoR8aG@_^yBcs7cm0+a3A;V=0(g6EoG`-V4sZzy; z0Zu1W@dL<^0rtmedIv?q5WoYRPN)__1MH6hwtlz-Bh~zY)1c9a!WlHANQ?#}DWNrh zYDXiADuF*5j8q9m+8Z(&QB(=z(O{%XFw)+T(TJi-7>@=cRf3WBhKxoORl;~Q7^xDB zv^QilqNozaqrpg(V5GevqY*`wFdhv?sstnL4H=Cns)X@qFj6HLX>Z7AL{TM-M}v_n z!AN^UMk9(UVLTd)R0&4f8!{SER0-qJV5CYg(%z8Kh@wguj|L-Ef|2%yj7Ahy!gw?o zsS=E|H)J%Ts1nAb!AO;0q`e`~h+-J(S8+i7LHhv1Zo>dukKIvZhz=Kj;Pg7wgA7m_ zr@Fx|F~II0VC$(CJHy2vI0FRgL587Tz(f6k)1Ne!7+~wE=DXqI51au4^Wadw2^;1Q zoF1jE!~k1QHO~zff8Y!dmt;t!l*4D;Xz7z3xu!7VYs&L3dwsTMcG z#UD5W1n$8hK0*Wc2Tq^TRAPXwr<&h}i$8D%2;74ohW3ag+#fi7N>hmeww`K!8!rC9 z86a>Ej+XB@!-xn8crX&7b}%a$F8;t7#xM_#w%>6E5it_5U?fKEU{*6+{DCu!VICYE zpTQYK#7Mw`kr=guSODEjA0%eP475^h!_c2FcPD7Fsm6Z{=gZ=P!A6A(V71PJrNEKMx4Ps zR3wIrKX8UO)Ptkz-*JWzQ4-K#BuedIRy17vfisMu9vs?}P5(#BcbpMSngldCkfv!U zsU9vK9AJM8u=P|+al^$QI0Iz3cyNIIF~HX2j9yYDhKoON`g^!|aDe?Wz}Dl8UQ#87 zi$8Gsd$@RTfc-JR*5iy`QYD6qKXCdR*@HuQ4GpqCaC(+@5(8{K)jT#_{DCt-kUcn* zmjomG1E*(cCo#a*Q_W+;#UD5W1lfZhhVUpnvOjQomUa>YY(3RHHeCFHGeA&1h|0sM zX%I?4Tn=rKK`ScMNd@SN35Y_F4p`Xt zaSZkcI4}kz7-=7RU=PBrLFK`PhX4cYa&ScPLlQ4qdIu+T1_;Ry@(+XwAwhWpq!*S& zK=Pzvu=S*A8I-EQ{s099!+-=M?ZX7@LAW)jJh<=>V1Qi?jwooNW`HDnSow}D1y1h} z0SF0C?@%u3{smi4y0$^51MCk-C_st=`UWHI!vpL=xHYIPUbyfOV1WGrX~cjUFd)pp z0809xv<#`6A*J{K|KOvLL9q!HKvD;8%!B1g^fK6b67>v5Qde+CAAQ08TTmhX_R7qo2-D&LU=K%Qn`0408quK)l4gXBr{JJ@;> z^$bSkV1Eo;Fw#Cqz#c?c11{hY+@ZsQ_ybZCg9>QO^bYb1C<}mSaDfkEfCRwl9o*ap z=M<1I$rxfi$=U{;28cffEEs7Y9uN=0>;XkRj6Jkyus=Y~2gMaXXrKkXdu#-a#rxdig$Z!3c^Y+G21zfm;EJemG}HF~I%+M-(`ngIXpa&mgsDK;8kR=F#*H z3JDx|fP)c-tEeap_8{CmR32P-2r$4d2PJ3lI2!5YJGlK0&M%;BLb8X!)|0Gj@M!@1 zW8i|3_5lL+Alw>M9$a_`Fu*Pc7u}#i8BpgFT+TzvcTfaE1|7g8sJ#O2uY%GyIDddz zHy{i$Wi-7HTrko;p@Cu;VGAk`AwKw7V3&g;3Ooo2O5mU-4G4o0HE6H~BnD9cO7GCo zd59or%o4-`DFL_LF1 zIoKbNKpBW&q1s;Wm6k8w?YMh&`Yl8-z9V zNMwJI=X#2KkK20k+DGJhfpT5A{XwkR6a^!(mXNQGau1SkH#K!q?hlG03b*y3wgI@q zKuzD$%q-mgAl6EXf{|ED$X7?X2g$danmQ@>2SpKu+xpS;PR(eh*eu);MX}LzHGpz| zP&vIrc29v8pMhB)7(l@RawQ0Z*ia1WX+W8SfI@Q|87`tI7|F1YL@ktikVFe zrGqtOhHNnXL1I8qrX0z7NO}j8|H11pK?6S^E;w<67~m8RN$+5iGOMYo8_6G3HFwY$ zhUvl4^iD?PAO#~NMT1Frdj9~P^@Who@CB!IaA^-t{$$um3oS_gpoQ@RZziS(q45E6 z+GzO>2?s(XQZPb-3_Pn2PVb;uc2E-@l;lB0JP3o01L=V-(+Beh0|9c=U~mV`+<@sp zG?Bqn`rrX*uEwL1CQ``OgW4~kRxEho8FEU8utCjuup2;n!27De?R>D%fD<4$4Y(s{ z=>SX*fGaKLue^8*or6K)NSb7HyMuNkW0hF>KEU;3Lp3(LUI4I~xfC3%W zHjoH7Rz^a527Af|i;`5pg8~f^jG&?%l+5`-01ky8_-Vvcj7Zxbc zQ7u9f!7Tkyl@AggnyZO*6{w$rsTDl9LQ#4L-4_Tk7o5VuYiq%Sj}QVpa08MbP4C3U z6qVG00v**TG?Af{-a)-Y@ZDvQ0u%6#T;Og57j zcW|)*^*Xdr2L%a)2@(et1E3&-1QK{42O69p*&)}SL2AMb#qF9(LpN!@dw1?;Ia-XDHkZMgX07evmh?0UBmw$ycPhI-eIz! zSR}?RFzYeYg6zZ)9J~Txe}F>;l8QlHA21gbAdt~6P$Gwv3m`GDBxvLosuC3BpiF|) zCLUD21$%H%xrjW+!2AJD@1TeP#Q`Yr!4U!peNfs1Nx|+~grsgziv?5x;F1Mr6+(`J zS&vW$G7g+9_#u`fWI!b(G7r=}M6v{OatE3MdU3)200kMyLJ$oPPf);tihK|ak_0De zNa+EZ@&F0Lr6C-!s=-EpJvi7LMTUD|{(#31xMYU3K0zrOWF#mFf}#SR-a#o3Bmh+l zjW1A94-$oPK{^RynDwBv3(^b9Y2b7YPBV}JQBdLlnF*4ErEl@PIKVEM3II_frX&eDma+IsSGR%O1U6K;3N&NlEEnt(q9F|8(19D z(E_VQYR`abWw2=w284u|jF&_TMvx646Co~xSO5-LczQ=N6_VazT43oNmK*R|NfSx1 zKfvi7RLy`K4+=I=3lEf*!Sxkb3CMD=H$X~2zYN`_u>%qo?+(0P3^TQm8k=`LS z64;=DAi(|r1u7)B65#}JxdkSOP(1KTz#fD;gNEq=Y6F78V;4BM@uYW1S{bzI9Wu}Z zX`g@!M|ky)RKCN*0hZn&CHsH461W07Ga$(UoMoZq3Lyu8lRB6nq;gQmLp%s^$_EC1 zkS9Sk8At%y3IH=f;-DrQq!xgxfa--(Aa$VlMWrD;5Q$_QxWxe8>;_7^=t=(r$Rd7- z9T2l2Y>?fcb`AtX?#YJhg(w6?6v#-BeV7=o7*mQ;5s38=Q$W^$ngrlP0OCMWF(NS| zDTbwYP;m;*A`tZug9d~JT*%6E{};Q9i}z(au&A|7cZk8UV6}wDb-RHb|2Oq#4;TsG0Pl$h3Mmq<2t4 zgrs-y#2P5QgF4}m@)gpp0+sb(7AQJE=^e}gojU=}5oqZhk_Mm=3JO?=B2X&|!~@fy z8U-c{F%;B_0f~Te5vWlQwjX2^_#`NhMvyvCVgb_wM8Mqvb}l$$f`*Dffd;AwK{=Km z)T{xIbRa1P`-UIff&+O0qy!Z11LO-(-9BJe)5l_@um`0zaDoLTEl9G2rFYP1?Eep- zm_W2SKq|m#l>h$+a4dscL7?^xSQKO$q}+uYg493-X$GwR5mi zFSHndBxp$a4$jQrobaCk1i`5r6n3C$0F>`R0{kGEf%eCM*iUmyks=CI!a|ZFq!@*> zVQRop0pfrdpjHb=2Z#@HB`D6Ii4l?uKwy>vB|%A?;b??)`RjU*xz6=a9DuC1zJQP(mTi(kURixrhzj(xR`(vpw=MWeFAnf-EF0# zg~%QRrBHAI3`wDoWC@Niu!F!61S*2S@q?b;!RZ-p0yxe?*9jH41xP&ptOyU1my#0 zUIFCt#TlmtKpGN{f5n+j3_Dg!}j0%Q&-vp~!OtB2SQ3Jr+!K=y$eFCcRu z%0O*@XtM#N3}hCB9v~9pPKf0o4}k&;g9u161UFm3^#Mo>rUjDTK_cK(3^D|iB|rk8>;Y+pgDnLK zffF()MT0mXXMh|9aUMtnViA}HB0$*(Jl+pd1+gB=8W0NNPN>zOgbwl+$p26w5CvBQ zVSrUYm>^kjmW6S_au8Aak}wC**H${(hU`I5D1#CjJiS90kdy{aQ{a>aN$-#eB=EW{ zkQvYc36KJaE>Oxv(gRN1(DEJBT?6R>(TH3GOYaa7l=)StsUQkuEZCjk@fpzJ50JnD znFnDF2uY0fXlg*d0N0i<2amRAU?D+68aWa`F#y`%22Ze{HZ`br292{rTa_R+;G_;o zz|bY4pspvp(E-v0mIak>paLC~VZZ{QG7OxoAuV>0-5~Qo>G%Vvi33s$D!3tu8suw` z5|A!Pn;w)IL74<3KlIW&$UlP}L&AHoyOIL;;qo9TnL|=Bn&EH_5EW>$NL>8#AX!j4 z2PI)pzCh9lVIuceAtLA`q}c$~40jf~D*EsT*m|mYa=7>dXMo`HASgY8(>sKL&=1!D zk^o_Z6pRHCg^(~YD2=2WRFi-TYM4404OI!MQ$U43l#4-uSak^!IS_-~jt$fUUi&;Pf}tgHQ^m zG9n~E%LRx~Mk6Iu@Bk$)8(`}xaXO0L;o=XR0O~;~g;N<}34CLRgmqJ_f^rW~HRb7GaQX}GDyRn;7{Hg5fTrld1L$yh z*r+&UdLO)J6ttcNG_wgBWQVImpDsd3(1!)}2YoEVv}J&;$8->xBE!WWIK2<`AZRHI zXu%h#5e{KPR_lREZBV)fiGe4dKnxHDNq|l$0j-M!VZ=&BoL13P0_qQ%+JVRL0k$5G z%Se+NF8;vjYp4f7Nf@+R7na^ZY|t8YkU02YB*?})5EltUWFT{#&OpWK2Crv7GbwxfUU>wC^AHci$8FB9qK{oehO&e4(fb@ za{#Qj3RVS9@1SiNptd`th=-?lNaDw73+*MqE~LFRxNI0;>v1`YWbxtR51bx{dXUKU z4oc~e?R=nS4N`w~po@1q^>Oq3(9o#hqZNmd6bkMFO z$bw#Q4gfdwL8%|7H8hui`h({7;ILqTt;gXi(uIeMKXCdS>OpYp1<`&7pC7QaCidgT!&#K@SP2Kj>iff?Wt8*tGM8IOdfZm?=lvIn={LA=rQjx&UZlms+63@JC0jv0*ghMD~4Htjl42I$2!2$Ni09%hUdP$WSF8;vj@8ROX0rtlLTaPn( zNtGBb{=n();o`vo_QwEQk288nl^8Dm!0GSd;=uv-#{gT8GkQst7%u+6>F?pF?pF?pF?p2J_MOTz=>^ddbZhD$mb zF8;t7=ffkdgM5M0i}a8fF6m^r_ycF0gHp=yz&O1~4~gLsgdktgBeVw44v-gz2Ohvc z1f4H7JOXjpm+u3bN`{Z+!zHzkruX5KCTZ!D(ezHs&>b~SCCjp`YU^JZ&6-*;u(P%mu@kxNF02oatLGtz-T(b z8Z4uNXd!@}PQd(8Vl)I$LI65XjMP3sksjrYh5$GOM$-v67)A*KAuyUw2n5imG&lrC z(+M~jMhOBTFq%#X1kk87I0Q!12{;%=2?8N7nobA=(5N&x1V+;dI2c9=0wFM(P6!0h zs5CePM$-v67)A*KAuyUw2n5imG&lrC(+M~jMhOBTFq%#X1kk87I0Q!12{;%=2?8N7 znobA=(5N&x1V+;dI2c9=0wFM(P6!0hs5CePM$-v67)A*KAuyUw2n5imG&lrC(+M~j zMhOBTFq%#X1kk87I0Q!12{;%=2?8N7nobA=(5N&x1V+;dI2c9=0wFM(P6!0hs5CeP zM$-v67)A*KAuyUw2n5imG&lrC(+M~jMhOBTFq%#X1kk87I0Q!12{;%=2?8N7nobA= z(5N&x1V+;dI2c9=0wFM(P6!0hs5CePM$-v67)A*KAuyUw2n5imG&lrC(+M~jMhOBT zFq%#X1kk87I0Q!12{;%=2?8N7nobA=(5N&x1V+;dI2c9=0wFM(P6!0hs5CeP1~Q$X z9gIE7r91?{aY_qfG@Vc$IfKXqS|ky$nWO1s5XCa(P65X$Er`){LV4s2A`@tlM8IYa zY&rouVU(a&2tXr~TE-!p12uX;?#qDMjqIFJHYFiI!vKXEJ(^A^iJ!ru7aEzga1PYy z(R4zKz@@jD(8#2PwNRr+(+MpCm)>SVBa;@^LX93xC$tD$dYcK2Oj=kAHF`9i&?0c@ zZ6-7_X<;qY=+SgSi@>F~nb63jg|$$lN7D%{0+-%qLL-wF)1`%7GHGEg)acQ4LW{tqx0%q$q=mImqes&TEdrO`W z1_J|J48eft9eE^rXi+f)phgd(bOK5O3=9nXAWwdP(jYb%LnXl}1S6e*Md3aHs~=ee zG%{)7X{gcg(1r48VHJj%D0V?3nIEN8AS#_ebuvH;A{0|G>>SntH1s;u=z&is(2@dN zwLppgpgIU#t{`F;k|_8=Y2rTv13##|VPN0~X@=KWXgUyjhdm1#nY8dH)aZdvC*VW@ z^5F*t5D7{Ep!Nu6q<;WcNg$E|RD^)i5?t?psCPgnj6h67-$RWaMCk+)ztD67;h>P9 z6ap%6KxGOzU4Xp+CZK5sMfphLKm&mmUWOVy=+X%!HDL2GL&} z>Ic*><_8rgAO@&k4DKO=w1AC)8UbdHJc5S4hZ+rwm%)=xz#U?YaW+t@0QHMO2?Lx` z7(guW*c>=nK)nNIk352gzK0q;_|geDmPgYGI2ec}ppi+ea#GYmjUHU-gdbF7fPDdV z9+(X#K!pgR-T_rhAg6;16_7lJdXV6V!8G(e)M!v(gM$;w2eWBSpxXuILmH}tEob2W z4^K}p)lef~+!038(DzWI2R@yE3JOq%7}Q1uw@t{3W2kq?(mV7u(a`r$qX$h~WtuN`nAu^k_PvG$03qerROU!YNRr2R@yEnxe3J2UISMmM5e~ zH#9Oy*GO0g)aZdvC!lu8XgVPrVfa))BNLwza^;{#4~BH||34(1kn5FEebC6HML4X-6 zOK&rwkx2_{p+=9U6Iui=z0HJ1CM~Rm8a7TA_HplXgZ-{m|_@3X*z*M63kpQE=+jD z?B79nc$l#$OedfXO~@evS{01UhqG}eAh-&$8Bn7~%M-FgkT{LRF8al0+Gsk#7Ah2p zL6beQ8HgA{vu`oj+3ZNuR5Xmegtx!csA~3_CGGGc_ z49P68Jepw)C>5fB5c2cZVWf^04Vn+0+#gaJN7 z0jv`w267oRmZ22bAs_=GYCx_4YeX{)qymm1TA>;swnOBgLU1>thZaN?RY<7OgEXB$ zLJ!HK;4lRxClCXkPGGKwgc~@CfKEpNg)c-1w1or00*5J-2{HrB1aC|RvA`yR8K6cX zhyjX7nEhZrSOCHTnGZ7qt{$}Q86pkRhRgz6jU}Bx)Swy$(hI}T;sdG-WC}nO5E7~ZYAi?$ zsnG)x1^FE$JR-^yaM=&?Ehqp%G#G<2Dwu&Fpn(LYzyv5ZVQ~$P8c-yI3JY-S1RRJT zKuH8-1lT-?F7ROopxg{r0hR!p0+9tB5(w4+mIblE2@Jx6#2hq|L2{shFpvol36P;6 zQIKQ6Nd)XSkaCD9lmux28w$!UAX%txkYP|IU<&FWsA(V}s6r4EY6ysluol9jDhag* zoFhO6L-`;k%`v)NP(Cy-;<6qZY+wpZfO0HYE0_RBFet5od7$hD#{WT~4`P911`^$1 zPeY7A%8GCSh$3WXfTTc?3bx}vh=(3yU`r7Z22uhx0PG+%1EFfM8V1$`B|u3C%tST~ zEC5b_FcvxoNt_BysAIuF1~LxH2Qg`m(d~lq;f}%T0%&M~DKG&FXs}i=0gFCJ=z>xP z7=v;nhyjW#h%QiUf<(ZD2)1;BY5NDz38Wws!1_Qoz>I=L62u8`)8Nt{7(fSbpqdC( z3rXf^h9Rp2NrCyurhx@uwqoVL1gS$q9Se^dD4#lp6EFqcE*Kw_`EYB6h8CED5}+ms zxRL?s0*Qf40L3RP4nQVD;ufX?LW9Mi3PBr2f%Dl z1b`V3^FYB0jz^F-a14M5a3cmJg;ei=>;cC%Qp|$N9kAUHwP15W27xiySg0(>P*6h% z><5s|APkFpFdNk-PzwpH6>JiSfGL7I1LP4Dr+`#}f(5D%?ii>-kTl#73=T+udKhZY zpej$maSHJwD5FAHa1t6?;IIO-K?IlwiCPc|k5CW?67`^N1vGzyG(e1ltAj-_B5ol% zAtXdG$Q)R*g2XK>oj`3z#4$8fq4t3_f(U4QLydze0;L47xnN^Jo`))cQgAoG-3?I) zmPQzYupKNxWddr?;7TW;Sb&5nJd9x82E{B`3LLT^X^;pgaKU|LP_AVFM+qpugBXyZ z5NM2o)PvPR{0s6tvJl8%u({ym0@Dez8f+R^IVAqUOt3*90))X%0VxL=3^4=j42U?) zWRL=Iq=Mx@rh;oNFu?#$G*A^#3MqMj90)NNDu#d*KtTcxWDpZtvVtoM5Fd^~L5iGCAf*E&oj}7GJY)fm z7I>ln=>X{jB^{_LNNE8QgsTGC4;28%HHeLtPWZto5NtR&^+Bv>pi(-4B`mma!3=0v zfRYx-AK>x?$^exLk=?h^N7!Lv<@~8VI!;E)V5{q6QW=P$9Sya3q5Q z2^yr(IED&?1tGHFs061NP;7(rgC#*`g9Jdi92CePHrUr721pX53SNiQpcopeNH#$wkSUlVkY_Rt^z{wq~ zjur&e9(a&I`LwVK!%P&rz|$ijCE)A>CO|y$FgPl4YQ-jt;uah_AsHW$LU1TUiZE<8 z!F3_UHe3uV1ELU8)__VRc;G-C1TTMx@dQ>I2n#}u9t`OO<_1u(z}Q$k0Ch1I8H5nX z2m}wEg)R0Frec$Ym;j9_{Dy;53CuLyWl zJS0dEBrFaPA{Z>Jr8hzqw%9|MicJ=x7vwB3hDQuU9E}9$a)=miv%sxUuwf9D_(=40 z0#B%5{cs*A-QY8ZA~|UIz|%F9Pm!6#YDTdO5xQU&tir}L3q=>EG)RP;bOMii+;IzW z7{Pi6tPJD~P+J&oEJOf>ghVrn5OxmO%MjI|dIz2|ph9pv!0NCYL8&Oz=z&ispxgio z1ZaT__dA9Mp)SS{M-m{APLNb$Vd73FSQKLuLP{stq!D6Zg}6P6P>AMbG%ikc2notr zP&)@hIss4pgM9>d4VX7dpv_*OaS`DIjZB09^;l4&;V}c{Q_liCCehO_JkA(CQZx)u zsL`Y8WH_W2Xk^mDD^R0H(+MpCm)>SVBa;@^LX93xC$tD$dYcK2Oj=kAHF`9i&?0c@ zZ6-7_X<;qY=+SgSi@>F~nb63jg|$$lN7D%{0+-%qLL-wF)1`%7GHGEg)acQ4LW{tqx0%q$q=mImqes&TEdrO`WT$fSj}P@_lF2`vJb-ey80 zlNQ!OjUM=P0$#KOUa19Lr3Lma)Olbwh=8hs?~Vem@_}lAQeYvF+L4FRLyL+b05y8x z(+ND55lI2Ov<)@dVUpnep&%`Yb*3O57^CW-Vpt7&qo9#V3wJ_|9;E36V*w*ZI)QHV z0w)j{L5px25@tdplNN4;8a;^833yi>)IB)U33xRvI9(uEU@nLlu>}e=GKY0K0ar3m zA0n1AWAQmu65Nyl?^pn-0W-h^eD@sGtdT^4LV`yAg&Gabzo5)XBa5&Y3$+_A1Ls4N z0$c)x0hI)uw+1SDpiTzqg~&ii6fGl#0}2Eh`4wvP&`T$v^a0sQ1NH)lfTR!zNu%Hz z+{S_efkrNb8a)Kl38*Ckc0HVcq!0*6qu?6c#)3nFHco^ZJ@nEEq~`-_vVy$;A|NRQ zLeeI*2Dz!AK%kKmp+*nQbOJiH22}q*+rXpkSm=gI8l;s$o=%|7L-shdyZ}?+P7hcO zhyeGZ!347U5yS=s0*$;2HF}ViCzz2AYL$R08}Jb~;C3v?>7YsowCfur3-u9=!fQ|) zOGB?ijRplaI0&G8Fq_r{x?ONSxU2x#PDDBZClN4#NID>`BN4*`koum78a+tU3Fe>~ zsKfx5C!nztPFeQ4@wb`bOK2z;MxY%mIY5C zgU)?~%F-gR2D_Qi$fSicp+*mUI{5%PeiiIP@QI3G7KsGBx*}2Euu%?;Oj`H{YV^RT z6HtW$?$&`y4BV$F;R}P&bOH`Qd_hFE+|WxWP#0tR7}Q$96dg$-ID>}rK!6%Oh{_Xi zy8}-n1L|T-uaBk^oI!&bSfq+TjUM=P0`9FqT#rA(p)Q6fMJDlULsmIl**JrSat}j| z9t7zG)MSCBu1dTb^f{+^-ESy0@x%Z()4~ld`xo<|e3DC%-MJPax9!)2- z2wZxb35`rzSPM0JG@Z~QaOrI(G%{&nE!61IbV7^3rMH>T$fSj}P@_lF2`vJb-ey80 zlNQ!OjUG)Wv4X-6OK&rwkx2_{p+=9U6Iui=z0HJ1CM~Rm8a5e#Tt4Zd^&jz*m61hhyJ z65sHXANfHk0z!4fBfuw8((55g3eo$Eg zBKSeu1Hnf?!dU;o%F&Dgi^0qrMl_l?sp&JQ(U4F_#1%EIz-boLZn!*@527GPnZRX` z8PG@usRFqdlte%cUT|W8r4FzpB&|V}Bbxw8J18Q2B7Z3;$dhcLliJDKr0bY>H^C^2~Z;! zWDZms)f})IRH0$PgM7oe^W1Nekl2p=uzK#I|Xh6NWI znY8c=)ab#QPN2?1_Bk|?!L3wK%7FBpL0m8kER7&W(+P6ekiWE-ln=ypN)kVu5F zK?AhNx7SFw?{b$T8Lwn>_do0EHZlTm>~6lKDX6;L!9!BkNF% zh1v}f1800N6Vi177YkrMWdvqA0og87Mas;5EKKRlJPR~GHj8h&>Vl-apVt_KScna!b zEHYSyAfvL#QlRo`wBA7u5hB>oP#*;81k{*@I2aU>5EeEP>SAnC#EM~-F~sT|-0G+h zG`KtnHF{8_6I^Z_6(=$Tppi+WYLb*ejUG)WB!$`_RSb4qv>Q2MK{?_fkr0T z`tfLl8a+JI33x65TA<(wgJB~DjZ9kj2Ws>%O((Pnu|aGmG%{)7La5QB>4X-6OK&rw zkx2_{p+=9U6Iui=z0HJ1CM~Rm8aoSML=_JLv@ zgh2vZYV=@9Cus3VR5}5r2eA903GV$drSGHK-#AF#yVkaA-`T+68KX!jmf= zn<41}qyVBH!UvO(gff~=K!HPL3<>K&n@*t4L-sT{MSuk$lAw|VGcHX}svqQb zP!ks19fr1JA*~gdLXerD^n>+KKak`w!O#Gqg>RrngTfkYJd_V+)0#lB3mlJdXF#n6 z$2yb^p|GbDkSM6g0MVd96EKaM#=z!-35Y?%kwghl>Ut1rG(3W!eCk?)!!#7Tz)=V$ zkW>?uPC%s)I88tpps{}_YqUH;3QNkE(6}0;=>+qbdr(OMi+-rvL5(X26C?>LPC(5S z5F4ft6hz=82qr+h;fW!kKoh?~jUKG&1h1c=ZUX5igdyccLhElL0t^4 zZSbi>Z`+K{1L6xULUPbhhsO|b8Qd~v(h0$e1nPaL zi^0(j6~aoPrxRk$$75H^dQveL6J^| zW7N^rPteGug`H5NN7D%{0+-%qLL-wF)1`%7 zGHGEg)acQ4LW{tqx0%q$q=mImqlala0gbFd@bDfufu;;-WI}mVrJzO+&vXJFV}Ya- z&}sv!2HapY3>ulVa2nL;(R4zKz@@jD(8#2PwNRsnXF357!H$+E)JQkOJDpG?gocnA z(8#2Pi=jpj)AEECAvTE3ghnPUTnIIKG@Z~QaOrI(G%{&nE!61IbV7^3rMH>T$fSj} zP@_lF2`vJb-ey80lNQ!OjUEi?1a&O5p`!5gj6Z3y5ET;K!+Rt##M zAcPPa!D1jugwU{KfdhaxzJeMJ&Y~b2pnMRM<`~5;Fb9zaa9fU01J(jPs{)h^z@7j} zgD~=LQjlR_F)#t*4NnXS5SsW6YBV^AK^8#yASTT*ie2EW4kifLi->E8ekdPO`G6WB zpsEN|EI}op#({ZY0xB>JDM*0O#A8sS2SYjmcT+$SjNhY(xQ4hL%4Yy;A5ACt1CMN3 zNLYg!eGns{du{3Xl>AA5`yvd;vXJ36$I*5+EfY4Ca9e z5N~*5VuFuMpF@ov`0@mMIw9$tVNl9}rW4Qr8)_v6P9k7}%#a!a+Mtn13ztHT9{6+u zDGWg60J1kx;~G33j}U^m9o(4)6W|UINE*xo69}`wNd!zF#D*IS5+F4371Zc~PbXN* z6STMn*EOJo00|0&+d<6|PzMJ@gLa>SX@o+Ma&Qs>6CmF3#Lxhth3B9~4}3ZSxd0U$4r^k7IQ*v9SgdKl_< zTxw7g1+?Q#N;<@4@SqhZ5FnJe8*21mNGITdGQ#l)buqZM!RvFhN^Eo<5N~J^kc5W% zz^4;P;{w#oAkM{L_4t&cw}C+|8>nybX&cINH1rQJ~KR1rAZ;euEg=;aCFiVBM%LrVx6G_-Iu)aZdPPr$=uwD2L^OpJsBml-Y$ zXk^mDJ5ZwsLpq^__ePeP(8#2Pr=doVrW0BOF1^i!MkXz+g&IAYPG}Lh^fnV3nY6GL zYV>G2p+(@*+e~O=(!yG((WB{v7J*A|Gog`53u~c9kERn^1TMYJghnPUtc4mqnoejD zxb!v?8kw}P7HafpI-y12(%VdEWYWS~sL`Y8gcgBIZ!@8hNegSCMvtZwS_Ce=&4flK zEv$taJ(^Bv5xDd=6B?Pcuoi0cXgZ-q;L_VnXk^mDTBy;Z>4X-6OK&rwkx2_{p+=9U z6Iui=z0HJ1CM~Rm8a+Vi1hU3#l%!e+&?1R|%^Xc9REwj*U=TP?X+eyplfe+ZRC5C@ zk_gz$(R4z!I2sHFf#Z}G#6YGKTKH$wOxlFNXgZ-yxDGc{N7KnDASMJx(+M%5G^%Da zoeZutfVSCn&^T^1oeY|&06Szfoq&U3lpqiS@PTmx>gX*!TAt85#PQpQIKc(KI(o~F zrW1OHIDY#E>*m(cbb>$L=q(G{UQcg3iLq}`r4#U(N5r^#7^@ki70+NwCxbOF(KS^L z(u!v=r4!IZ8eQXLFj_W9Gs_@KC!l0P#JO98F>5;Y48BFq8>1QE*UtYomH6Hw@YN|ZsEmFOHJpmXE~UnmTgbOK5vAUya& zh~CKrRPhYH>UWT&6HpR?V7f=kptBHEv<^B)4UTjI3K~c<8GJd3{!umQ8EnBY z2+|2SnLsa98LZ2>=v$%;!is0$(+Mb0KsRrJ>zqMY;?g&XKx`X)!7$+I1e{Djy&P~G z7ED0GY9y0`ug5ds=>%NsfYJmwiGT?ZZ)9Uo<{4ZeFwp4)o=ia99q^qQgRKQOAn`Tm zDxSfRP9P}*(u9SO0}?lb$Xlj7AV4)OLaO6^ht>PKzbOKKa&6L($U@Q!B(z2@ImjxWL6lA)X=0F- zw-84S1Ua|@V$h|N(S|HEQ4X$(XRxFbcZrG$k# zY2+jaoIXVf7M!Z+A_0vQc>4g#r;FVPOHkS*1LFjQV+Idv5LGa=_rJcm_*4fj46ZS40i4YX(onGn!5YI4R(_e$Z4rgCd;_p5hgM ztkGX~(1grjNhkD=f+1n!ps9F9)5+jYFN3Ax85HScw7Y{du@07sXON_m(e4h8lrmT< zp23h#21}m75mf^#JV+{@(R4Df$$+5kgCr9Tl5|2axJImkK~nJyhIBI8jK!A=21ms+ zIMT^zGZr@(92L)KI>8-7gF|L;R6K(qoeYi)GdL0jHdhRaif3@76KugVDh3UKK~bQL zrW0sv3|?w9oj~Gdw7UZd2b|_AsMqv-@34TGK-=!$2c)5&OehsY#4z!lFRNGC)F z)CgBLz!lFxr;`EBCPOFj4RFOXnofpFQW@ABHSp;R~p1DH<0&KM;KhXAZVK{-T~ur}(b7)>YC2}e4Z zGLq8?yd0xLI1hCzU=`0uEKf$)+LMrap#{olIw2vPfAJw zS3Dyxoj}S_QUZ!ZwG4v!h-=*=0C6xAQdzN1H%YRC-BrsSvca> z4G!T!K;U*EF)~mOfRuh1q3HyYOF$t&6AUdaX<|0C{{PH=}cc`{UqA@Zz7(nTFtKobi8fDE(2O6CD6 zPvDj!g(-EJ)QKTV-9#lJ4lC`>5Sas@1*&^pwxc^B#jc-DsUu_>jt z810*}u+oy+E+^4Es)Z@E>LJm3swjv0VKkjkB{Z=c0u5vAlBlB4lrYc~s-r+Ws2>I> zoq$|GOAPfLDOP|Bcj}hxB)DRr6A09P%m9P>VIa~8+)hkaQA-5sJ5r1TrxOY%?$GQb z!4=SW8fXg51K<-U!D8?@Bf(E#jT8`cXt#Fu>nXYa4V_dH5_I@ zeFv5W#T|y7s2Lxm4z3Iu?;tTKlm924NAe~^0>qCOn+Q!LDna%QB#t5Z9c~OpI)OwnNFS61N)#|Alm;aQ zBom+tf} zz{-$a0T#ebkf0Q|A(YBsa|Bcj95NvDp?naNwiq0kw6y|MCZO4X6nkhgP%ha2Ah&@q zEb3vpz>?6^0#y$xdqC9;mCXPoZJBv_m5fA`R-M5VRGn1Dr;{EJ#@ZOBoQ|5E5c0sK5aw6G)nXXaO&J zMy{Qp!Z029XcCm-GlnubY>t46!E-m1PnktT=%!0E781))*MMvUVJH_$q5Bt{2*9BM zW`R=-tPX<2Jwynq9bDqTMWBX3+boc@16F}hO@IY8fq*I+OJj2cR16$4AnT!g5R;}D z9=0^K1=%;y*h8}qoEnhCK${;x1q7&b1MLVyJG|h!1iT#&R4^g5Fo2XoxKQiRZGs9z z)ZiycP>SCmN@TG)0xC9A(+Nfa1C3*FLl&G~_`%f(hzV!G3kpzVfMj5y2MtV!83g zl@N{Kf(Mc)5ZXb_RfrfkRY0x#z<|1W0xFEG4HugPrMQfsTpXJtpkm+v0oefMgP1hM z;9#ez4IsmjeFGji1qq^HWEEfuSgL>~0gxCZC4k52KumCw0EvSzOgUH(Y8ZN*3Ka$^ zCxl5*O2{bk<*_*eDmF6G32{LOP7q+F(7=JWW5L6(U>P`pEuBExyKp6>l+iF75t;{p zh0PIAF?y#H%<`Tl;Q{p>*lbwm7R(`yz^fJ3js>R}h`I34gmED>781Q!MRqV2<@6E4 z<_M@5+-FcetsR73G}FjFWZ!_}5m|tEJ4sC^AglN>izO@;j;0eVfr2CiPnSqyG+-hp z3sB^dX)USg1kxA=H(5ZQLUsj+kA%@3ghwf8NDoOTVJ1>ugc%E?@oUDW3MvM7FO-kp zAj)Oo_EByWJ`<3AL+f+`P8?9jfbF72IsvttK|?y=mJvMAki7-65o{eu7R~^V?twIe zq`@u&4f=otK&HWHaF?GSqzUd;ka~3Ek;FijfViZzxxnhlB+$!SGL0dm4cW(_;DCFR zkVX>ZVeJ!e2MMMR6cg~UM|K5F0hC5>r=cqanFEShlz2zi1deWyN^q2e7;xoa^I$%Q z(x6^DND%{MKnSb}?pBbyz?wh|Bn%aU2OyM>q=FVq44=}%5^!MA$Y3O65$WXr{||6+ zQ!SM;nR1hXeF-GWtOaV!Qqa4Hln*?Hjt%fi_Q{WI5KZF_@=>+6q znqzP<(b$#`h;e%yHsNyxJcB~?qAP`_0Df>`1xg0sj1NgT5FH>AstP_f2%Ta8mowlb z16hR!Iou6>s2OA`qRkC54&4z*VsPhTQv*^*U5wPkqOQScrqRbYXqIAd@woz8slfDL zQ3@3T7f{dy0u_R30?}Y;a4QC!l3+tP;N^N?BkuI)PgUa|TsuL@I>(j;f}UZWumSpw%H*ltP8TkqIWSIshgEqoGv`STmSFO%zy! z5XQnJ5hC!u7ChpxsX!s`ln$b+?GQ3@3T2N^6C zfYqW9Fc}yhp6C}>P$mqx94uqcHJfzuN>v0ya^ zmOfxKI7~nUxP1cA0+s_4@PGmHzyw4In1tF0X2S@m7}ymcF(@Czq#Z^pY$>$}6dY(6 zY9w8J1F;L?00;VvR|(JO2oabN)Nrr_ zxOEC}*qY`dA%trjKfCoKDIToc*A*kUXMX=5cm<=XCwu7w&F+gkXK%HIiFdDdr1JVoS zfr=$is}w|oM}ELN*T8zgCV>d3jUXl*L&e~Zh4SI@G-1GPqnhcE@BxJf2*Zt~i*LZT zAvpjw&=GkNtPYa^>xAjS;$Wx{$X}2`0yHcFQx7!`BncJ*F+doUPCzttEDgj2mmwg_ zz$peK0!mO28mt#;7AO_LnQ#We6%ZjPAHty(3H2`xj0bxgVJ=;KgRl+<3%@HsQ3oIA z!lD!^1ojyuJ~5jqAW5(shylXjfi(~V)N%pQ(6R$$8J2W{>TsxyD1uNicn*j1QPfbI zgXvFd*#Hg^B*W<88zk#+FbTK<+0j^(LWPhU5l|t7bs!^P=>$9~4=%+ZkqSy0AbGU% z1SAYAb--GYO+&C@EU1+bBf+M_WN1gzES-S-4)qYk^(Y*O&;XDGTmgzi&}=TqWmuF# zg}^ONkP^ZeT3i!|Q<#BpWpIO`Hp2NJ22>2L7|I7p(G0^}NNo!s$pkrb(8D)`eF1U> zI5FTSKn8)7f@m0K08Q?KITU0rbVI@B;UTc8hla>(jnY;5YGV(_Sg@?lzNLPN_% zYMTuXQ&h7l^bOoFlUoa{xE} zV7&>D95|!H6BO7SuyQ0JkR4Dld=yA8NGXVhVXzyZ9I#%9l~55R3SA?T6j~@C%V1|? zGYcvP2^spdV=1ULw1Er(3xJe?IA9Etffxbi5{xIX3AmKPV+P_Na?%OJXyQo}&p@?7#o(@i@}aUc zp^!>!>X{D?Yj9K|n~CZhs2XGic+v@2H8{GV@eUf_f(}i=(g`Tmpz1(OsL4?Ea1m5j zKoucVAPo>c7Ns9xeIZanftv|YP8$-7BVcKL$fpxfP(zk+A%`8Bk3ou%rNQMVYS2St z9kMhGobEtn6llpBs1*sSOkha|lx#qHLCGF01~(aG4Lm@>cEF{uGC+2MOd>)lR{hi# zL<=>r@lY|ix1fBm9E}LLT~st595vvjIEdVb7VKap7~aDW05wCvkp@Z=U=AoDK=LxU z!3rk8+Q2NxWsR2gk4Y>t46!Q&3fr=>$65kOTN zKp_q85Tlum>>IEeGWcQJsX5v|@q*a=mRVj8L##3U32NF0z!a4vqOaAmY*U~>dijE?C9 zZWXmW3kqmRX#%PZP)vpT4lD+bXfO{(;9eRANpj$H0x})M1sMTrw}Mx8fJ{M66Ce?A z>leZRlgO?B3m_9H#R;g;LY5pDHa7P{#o&<#<KA24#0vx*3Ga5OWfFc>iWE9_EODEvyN7DjzAlP7VxPYP( z#DIx_mmY%!K{Xke0ZCeLgHX#D6j#92Ko}r1k zX3S7z4Je!uZU$#_B=Zn5;7rbd8h;Qmq*wy!1VuYU2*d)13&akTGyxF;*F6wr5G^1B zKp52?6jy+xkuXR%3KxkpP)uy@g^Gd01LQ6!AH<{$MvqDgZ2^TdqOO4!1#mM_d;{KI ziyEJxdIzo;!T=cvQ3Op3;Nd!O_&^1~)`66POh*=j7yu%PPA4Gk5Zgf7us8=IOkWb@ zFLWEBV&HH9$wB!bCT%cv(+N1b5CM%hoq#805NZi~4-|5|2`d0(y|x903)B2LzN)JLkY{qJ|Zqm_%+G;7=zY)yVNj4HuxN z36Pnf$VavZPng0}8%Q6xkirF$gfr6VlQNiYrL88$~bGIM^Hk6&sT21QhR3_d~-7m4{K?qvu|zE;I_=5Hx9Y zE`{j?HQ|zIH@aJ>!^h?bs2JVS2{pSrpnMB%RKkM?>Kj~q8l@Asbx;P#UC7ao?kcD< z5QQ#<&IhTXJI3Y+s2Dxd3AOwUiVl=o2h(7v?_d(dB~mm^FwG>;X!ej`APGuIa1V(} zu{i=NMz?eVw}?cyV=4#NI>^};Qwdu81d9S%3872}K*N|AyGT$+XO9laLE( z?HfY&L*z+t1=v>uPe9y_OhWxYuXKV|b0fQiG&VRa32K4*j-Wc)Dj>lXU~dgPff*i9 zKhQCqV7h?}5pYlvXq*g|VJlK%SGQRIDa zGC>_V!EPSZci1KACOSA=L78`~8U#{}XQ2S5y7$WI}#AGtsFQzPU zAnB%eIzh6U3?}g-ClJG-zJqWEj2s-Upv?PFKhUQ4GllgtG1qIGGSTzy^(g0Z$-M2SA-Ogef|w6AD5K9ONYG2kRLG1c}Zbgvy6Z zIswNvsR0PqGzbV%-97l!(=(mGD>pKN0bJ`))CwlU(orq&5TI{5Av>Z+lL4fZN zEV$MgO(w|EMt3${(+PQTJ(^7Do+>ac90KVCTas7 zuIU7qBk+lXlL>hh7CvJ~p;-5qePLq;h?Y9NfNCl~_sOeX{#gQj3K znV<#80CMS;PDpRYf|JQ;8+HH_2a?r;IGv0(PLSehpqX?`CnPpBz{!L}Jp&z@!`FU# zr4y2yvEW)~G?@&Rlt;&OLXww9lL<+|MRUc2HJyNK9h&=o)B<8dfL`f@#O}^$G9fks z>74cQF1~{3JqJd7KHFB*Pl<8!&aWd!ngj2%rTbclCStr&di1e{Dp+pwfYB#qV6Eu9b>^Weq_v5ILNIHShH zLx4W%g!pDGIGK#LVd3#JSQvCmCq#M}T15b4n9>P2nT)n!$%sYTYoSXzA+ozO+Bl(oe3NSf zz0wI0?gJ+iqUt9i3>#HK-4GZ&=>%Nsj3yK6MlaP&qf0s=rn@tmOsE#8v@nQH>4b1O z0j_mu;loigsSyJ7NGHTJV@Hz-HDZ%?W(<;a0!}7`3mw{p!>GylLx4`{1ivFlxw@Kw zNu$!V2?2Vf6N1fHa2s}XfQ>dWOdV6{lTHZKDBxO$I{q0og*IR?q?6HPLYugyrm2G< zoq%f{0woSLy*z3b86iNQbb`-eqsatc=nNLQ0Z%93WHQ=@9W3bqmpkZ@PH@=`79VY# zfP-PM69b)2z{zB^aWdGG3GBvj_z(v)-GJN;j=}*YK&}|YgCYc=>0&gU42swoyp9-6 zCxbU`29wK1)5&0pjlt^{yy;|Moeg!`z&c{oc1Q?7BLjQ;1fpc1NT|~W%KA}zkwX9) z8Kdb0IZ#H~7$Gp4PB4OGQ~*l|jHVMTfifzD5dx#>1S3dB1+av`Xga|XD5F9cAuyUw zFoI-M080prrV}iIGAe`-0;A~!BS=OCu!O*9I>8bsqe2)VFq%##K4Mg_2h zz-T(b5-6iW7$Gp4PB4OGQ~*l|3~V}K`2QdGmQkqFusC{Di0&Z(jf{a=_xOQ<{{sWg z&45s+(LG2;EyNN6(8!=iIsxrCM@*GJe^94karCGV-9rEx83fV^boVG~EW`Gk z!rcr?2q2Y^_Q3QY^n}GpTnShc8 z$Y>D#A56d{kvxb&_TVd(=#Ln51j0oIB|DKns@6azGg!1X}Qg*pw&8>I#`1fY>IAn62B zJAqsPP9k6eDKJ11NZe88K!yM`G6p=IfICU3^%&G?0~tD_cEdsd8W{tUPQV>za7_fQ zfkx8_ELsK~O-VX|>P7YwtnPr(|G~)sq!7%2a1k097{EOpP%9Z!2_YmvERZe`J&FfG z2tXr)tnvgB^+=uo#WlE005QNuf*AbZv;Z4_LsAY(9*~AEv}8e%gUXQQ*hn}7T4sP{VZKIAC!^zRuuvJCG$rW-kB{K(SmcrjY8PDFXgYxh#h_@#AQ{3K+;qjWRt;(b0|TT`0w*gl0hItzNKOH9NAW<005me-$pFd+ISGXc zR{)a1jp2GA6%I-@gGCo2os5pNVF{i=Bm|9Ecrt+UK`umL!WDpIaAUY0lG6!D18TB@ zn}yrDQ5kxL05me-$pFd+S&zg7w?V}qbh-$g(^JC8;B5q zMh1a&0`9F4<2(jtP>T~t%LTXIQ5kxM05oFZaSG*woPfjxb3p`^ zF+81sMo-YqMzbGXdX!Jk5P(Jo5$S{$uKED&?_f0>>NKo!qk?n}0cd0lP&&cuS*X+S zsu`7}QwTsKV>F%6DZGcOHKXZdsKy+9-94I4=o{Wc)wTglC!mov2uAA=L&Fm4G$?PB z8qg4cM#ccNPrySakaU8wC=kMiZ;^VCjS(k~qL-Ld1{~2hvd}V3Q#PSQ*;zJ+l1}Rios9g#a`%z;Oz4 z1eA})ghV`AJQ9^ozzGawD3k$S!3Jf6EP-N(2$Tb*K)RsJQEH$=02&zt(g`R@z?HzA z4Bbo&=YtCcurf%rGk`aQf|jf?fQlHM23o}fQiO&v(+NlqC>ell07-)|X#GA&0;U@*1}0!4;G~4a8D$P^2td;XI2J)J zf%362(c=-M1|1{RKn#NN5v>wXc>+oyPzk7hFb_;X1wa(U1Q2T!4|oVbBZKzo1lo8R zO(z2$?5H~>iAPzbcJs!bn0HhF(K_v#LQUM7-b%TV!i4fjC z0oer-g((Cn1{)0~Ks+dhngHdEQUe+S(8vHsCCDLAJ~k$LJQ9^oAjt!Ksun15fT|pb z5Xvk7*k~{TvKWeyoB|aYr3NenppijNI>D?MKq&!MOh65WlpfGJ30fZz$3~G~r3K8(Q8LSLp0G%(4Y#2C+fC(g{ z;U*x7jWP!)1fY>YAf14t5UP|&hZ0Z?HW6+VxLbr;#DEeQTz-@>&>;YgPJ-zKyc~eA zW1+@@Ya6_((Gmq@eh^g$%q&#VQQm-r05mcPq!Vzw!)gtD?t~f#ZmQx_hu#K;G+9t} zK+QrG9OVs62tXrapwkIBVIj9z!0nlV36fD;v4jAT=>!~)ShS-HL5(A*9KAdN7g%V9 zLCr!F9pw&42tXr)PCf&5O{(F)2Lw5s1X#005mcP zmM0WjM7jY`r;)C4R0s7#02&#i>4f@0JFH9`O((-DI%(#a(R4zypdD5QkEWAh6`eHm z%xF5HSHad1f@7&@5<&mBFLwWLQNf%{()jPG}ai!^+^%bTX`>lV+Y7 zO(!%9+F@nzXgV2I(MdDUjHVNs1?{jhcr=|1tLUVeXGYTr&4PAV89bU!hE;UZ%rkh? z31k)gz>zfb^{Bz5hQMe#AvMHCruxxzGBV?xR9}y#6H-HLWU9xLPDW;cjQSdD2#lr^ ztiduWh!z5)=>#o6M!8r+U^Jaz4VFDXgVP#lt$HzrjyY$KuidXrW0a9 zX;jTDq;o+B zvs*{qHgF*@nob5T?1z%gqv>QQ#n!;N6*ZlJd85Q=2w)EZc>4sq^r+})2!KOiG@XEh zVU!>c0;B1KKmd(OgF|36oq&U3lpqiSqv?b|0F6q6Ltr$WfP-O_AP@qh>4ZQ4jY@+< uU^Jb8gJF~)5CWs=gg^j|N`pgSG@XEhVU!>c0;B1KKmd(OgF}FUfdK&6B$`A3 literal 0 HcmV?d00001 diff --git a/docs/verifier/conventcfg.eps b/docs/verifier/conventcfg.eps new file mode 100755 index 00000000..0f8ecde1 --- /dev/null +++ b/docs/verifier/conventcfg.eps @@ -0,0 +1,699 @@ +%!PS-Adobe-1.0 EPSF-1.2 +%%BoundingBox: 0 0 1098 680 +%%Creator: JASC, Inc. +%%Title: E:\JustIce-Paper\conventcfg.eps +%%CreationDate: 0 +%%EndComments +/width 1098 def +/height 680 def +/pixwidth 1098 def +/pixheight 680 def +/picstr width string def +/psppic { +gsave width height 4 +[width 0 0 height 0 height neg] +{currentfile picstr readhexstring pop} +image grestore } def +0 height neg translate pixwidth pixheight scale +psppic +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFF +FFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFF +FFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFF +FFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF000000000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000F00000000F000000000000FFF000000000000000FFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF00000000000000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000F000000000000FFF000000000000000FF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF000000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000F000000000000FF0000000000000000FF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFF00000FFFFF00000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFF000000FF00000F00000FFF00000FF00000000FFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF000FFFFFFFF00000FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF00000FF000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00000FF0000FF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000000000000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFF00000000000000F0000FF000000FFF0000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFF0000000000000000000F0000000FFF0000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF00000000000FFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFF0000000000000000000F0000000FFF0000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000F000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFF000000000000000000FFF000000FFF0000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF000000000000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFF00000000FF00000000FFFFFFFF00000FFFFFFFFFFFF000000000FFFFFF000000FFFF00000000FFFFF000000000000FFFFF0000000000000FFFFFFFFFFF0000000000FFFFF0000000000000000FFFFFFF00000000000FFF0000000000000000FFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFF000000000F000000FFFFFF00000000000FFFFFFF000000000000000FF0000000000000000FFFFFFFFF0000000000FFFFFFFFF00000FFFFFFFFFFFFFF00000FFFFFFFF000000000000000FFFFFF000000000F000000FFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFF00000000000000FFFFFFF00000FFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF000000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FF00000000FF00000000FFFFFFF000000FFFFFFFFFF0000000000000FFFF000000FFF000000000FFF000000000000000FFF000000000000000FFFFFFFFF0000000000000FF00000000000000000FFFFFF0000000000000FF0000000000000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFF00000000000000000FFFF000000000000000FFFF0000000000000000FF0000000000000000FFFFFFFF000000000000FFFFFFFF00000FFFFFFFFFFFFFF00000FFFFFFFF000000000000000FFFFF00000000000000000FFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFF000000000000000FFFFFFF00000FFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF000000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FF00000000FF00000000FFFFFFF000000FFFFFFFFF00000000000000FFFF000000FFF000000000FF00000000000000000FF0000000000000000FFFFFFF00000000000000F000000000000000000FFFFFF00000000000000F0000000000000000FFFF0000000000000000FFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFF00000000000000000FFF0000000000000000FFFF0000000000000000FF0000000000000000FFFFFFF00000000000000FFFFFF0000000FFFFFFFFFFFFF00000FFFFFFFF000000000000000FFFFF00000000000000000FFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFF000000000000000FFFFFFF00000FFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFF000000000000000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFF00000000FF00000000FFFFFF00000000FFFFFFFF0000000F0000000FFF000000FFF00000000FFF0000000FF00000000FF0000000FFF000000FFFFFFF00000FFF000000F00000FF0000000000FFFFFFF00000FF0000000FF000000000000000FFFF0000000FFF000000FFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFF000000FF0000000000FFF0000000FFF000000FFFF00000F000000000FFF000000000000000FFFFFFFF00000FF0000000FFFFFF0000000FFFFFFFFFFFFF00000FFFFFFFFF00000000000000FFFF000000FF0000000000FFF0000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFF00000000000000FFFFFFFFF0000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFFFF00000000FFFFFFF00000FFFFFF000000FFFF0000F0000000FFFFF00000FFFFFFFFFF00FFF0000FFFFFFFF0000FFFFFFF0000FFFFFFF000F0000FFFFFF00000FFFFFFFFF0000FFFFFF000FFFFFFFF0000FFFFFFFFF00000FFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFFF00000FFFF00000FFFFFFFFF000FFFF0000FFFFF00000FFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFF000FFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF00000FFFFFF00000FFFF00000FFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFFF0000000000FFFFFF0000FFFFFFFF00000FFFF00000000000FFFFFF000000000000000000FFF000FFFF00000000FFFFFFF0000FFFFFFFFFFF000000FFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFF00FFFFFFFF00000FFFFFF0000FFFF00000FFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFFF0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFFF00000F0000FFFFFF0000FFFFFFFFF0000FFFF0000000000FFFFFFF000000000000000000FFFFF000000000000FFFFFFFF0000FFFFFFFFFFF000000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF000000000000000FFFF0000FFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000000000000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFF00000FF00000FFFFF0000FFFFFFFFF0000FFFF00000000FFFFFFFFF000000000000000000FFFF000000000000FFFFFFFFF0000FFFFFFFFFFFF00000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF00000000000000FFFF0000FFFFFFFFFF00FFFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF00000000000000FFFF0000FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFF00000FFF0000FFFFF0000FFFFFFFF00000FFFF000000000FFFFFFFF000000000000000000FFF000000000000FFFFFFFFFF0000FFFFFFFFFFFFF0000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFF0000000000000FFFF00000FFFFFFFF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFF00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000000000FFFF00000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000FFFFF0000FFFFFF0000FFFF00000FFFF00000FFFFFFF00000FFFF0000000000FFFFFFF00000FFFFFFFF0000FFFF000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFF0000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFF00000000000FFFF00000FFFFFFF00000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF00000000000FFFF00000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000000FFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFF0000000FFF00000FFFF0000000FFF0000000FFF000000FFF000000FFFFF0000F00000000FFFFF000000FFFF000000FFFF00000FFFF00000FFFFFF0000000000000FFFFFF0000FFFF00000FFFFFF00000000000000FFFFFFF0000000FFFFFFFFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFF0000FFFFF00000FFFFF000000FFFF000000FF000000FFF0000000FFFFFFFFFF0000FFFFFFFFFFF0000000000000FFF0000000FFFF0000000FFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFF0000FFFFF00000FFFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFF0000000000000000FF0000000000F000000000FF000000000000000FFFFF0000FF00000000FFFF000000000000000FFFFF00000000000000FFFFF000000000000000FFFF00000000000000FFFFF0000000000000000FFFF000000000FFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000000000FF000FFF0000000000000FFFFFF0000000000000000F0000000FF00000000FFFFFFFFFF0000FFFFFFFFF0000000000000000F000000000FF000000000FFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF0000000000000FFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF00000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFF000000000000000FFF0000000000F000000000FFF0000000000000FFFFFF0000FF00000000FFFFF0000000000000FFFFFFF0000000000000FFFFF000000000000000FFFF00000000000000FFFFF0000000000000000FFFF000000000FFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000000000000FFFFFFF000000000000000F0000000FF00000000FFFFFFFFFF0000FFFFFFFFF0000000000000000F000000000FF000000000FFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF0000000000000FFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000FFFFFF00000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFF00000000000000FFFFF00000000FF000000000FFFF0000000000FFFFFFFF0000FF00000000FFFFFF00000000000FFFFFFFFF000000000000FFFFF000000000000000FFFFF000000000000FFFFFF000000000000000FFFFFF00000000FFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFF000FF0000FF000000000000FFFFFFFFF0000000000000FF0000000FF00000000FFFFFFFFFF0000FFFFFFFFFF000000000000000FF00000000FF000000000FFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFF000000000000FFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFF0000FFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFF000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFF0000000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFF0000FFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00000F0000FFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFF00000000000000FFFFFFF00000FFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFF00000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF000000000000000FFFFFF00000FFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF000000000000000FFFFF00000FFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00000000000000FFFFFF00000FFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFF00000000000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF000000000000FFFFFFFFF00000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF000000000000000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF00000000000000FFFFFFF00000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF000000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF000000000000000FFFFF0000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF00000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF0000000000000000FFFF00000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFFF0000FFFFF00000FFFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000FFFFFF000000FFFF0000FFFFFF0000FFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF00000000000FFFFF0000FFFFFF0000FFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000000FFFFFF0000FFFFFF0000FFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000000000FFFFFFF0000FFFFFF0000FFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000000FF0000FFFFF0000FFFFFF0000FFFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFF00000FFFFF0000FFFFFF0000FFFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFF00000000000000FFF000000FFF0000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFF00000000000000FF0000000FFF0000000FFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFF0000000000000FF0000000FFF0000000FFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFF0000000000FFFFF00000FFFF000000FFFFF0000F0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF000FF0000FFFFFFFFFF000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFF0000000FFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFF0000000000FFFFFFFFF00000000FFFFFFF000000FFFF000000FFFFF00000000000FFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFF000000000FFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFF00000000000000FFFFFF00000000000FFFF000000000F000000000FF00000000000000FFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFF00000000000FFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFF0000000000000000FFF00000000000000FFF000000000F000000000FF000000000000000FFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFF000000000000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF00000000000000000FFF000000000000000FF00000000FF00000000FFF000000000000000FFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000FFF00000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF000000FFFFFF00000FF000000FFFF000000FFFF0000FFFFFF0000FFFFF00000FFFFFF0000FFFFFFFF0000FFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFF00FFF00000FFFFFFF0000FFFF0000FFFFFF0000FFFFF0000FFFFFF00000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFF00000FFF0000FFFFFF0000FFFFFFFFF00000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFF0000FFFFFF0000FFFFFFF000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF0000FFF0000FFFFFFFF00000FFF0000FFFFFF0000FFFFFF000000000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF0000FFF00000FFFFFFF0000FFFF00000FFFFF0000FFFFFF000000000F000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFF000000FFFFF00000FFFF000000FFFF0000FFFFFF0000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFF000000000000000FFFF000000000000000FF0000000000000000FFFFFF00000000000000FFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFF000000000000000FFFF00000000000000FFF0000000000000000FFFFFF00000000000000FFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF0000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFF00000000000000FFFFF000000000000FFFF000000000000000FFFFFFFF0000000000000FFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFF000000000000FFFFFFF00000000FFFFFFF0000000000000FFFFFFFFFF00000000000FFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF00FFF0000FFFFFFFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFF00000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF000000FFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF0000000000000000FFFFFF0000000000FFFFFFF0000000000000000FFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF0000000000000000FFFFF0000000000000FFFF000000000000000000FF000000000000000000FFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF0000000000000000FFFF00000000000000FFFF000000000000000000FF000000000000000000FFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF000FFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFF00000000000000FFFF000000FFFF000000FFF0000FFFF00000000FFF000000FFFF00000000FFFFFFFFFFFFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFF0000FFFFFFF0000FFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF00000FF0000000FF000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFF0000FF000000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF00000FFF00000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF0000FFFFFF000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFFFFFFFF0000F0000FFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF00000FFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFF000000FF0000000FFFF000000FF000000FFFF0000000FF0000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFF00000000000000FFFFF00000000000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000000FFFFFF0000000000000FFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000FFFFFFFF00000000000FFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF000000F000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF0000000000000000FFFFFF0000000000FFFFFFFF000000000000000FFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF0000000000000000FFFFF000000000000FFFFF000000000000000000FFF00000000000000000FFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF0000000000000000FFFF00000000000000FFFF000000000000000000FF000000000000000000FFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF000000000000000FFFF0000000FF0000000FFF00000FF0000000000FF0000000FF0000000000FFFFFFFFFFFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFF0000FFFFFF00000FFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF00000FF000000FFFFF0000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFF0000FF000000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFF0000FFF00000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF00000FFFF0000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFFFFFF00000000000FFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFF0000FFFFFFFFF000000FFFF000000FFFFF0000FFFF00000FFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFF00000000000000FFFFF00000000000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000000FFFFFF0000000000000FFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000FFFFFFF000000000000FFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000FFFFFFFFFFFF0000000FFFFFFFFFFFFF000000F0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FF000000F000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFF00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFF00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFF00000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF00000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFF000000FFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF00000FFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFF000000FFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFF0000000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFF000000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF0000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FF0000FFFFFFFFF000000FFFFFFFFFFFFFFF000000FFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFF0000000000FFFFFFFFFFF00000000000FFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF00000000000000FFFFFFFFF000000000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFF0000000000000FFFFFFFFF00000000000000FFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF000000000000000FFFFFFF00000000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF00000000000000FFFFFFFF00000000000000FF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF000000000000000FFFFFF0000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFF0000000FFFF000000FFFF000000FFFFFFF0000FFFFF00000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFF000000000000FFFFFFFF00000FFF00000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF000000FFFF00000FFFFFF00000FFFFFFF0000FFFFFFF00FF00000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFF0000FFFFFFFFFFF00000FFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFF00000FFF00000FFFFFFFF0000FFFFFFF0000FFFFFFFFFFF0000FFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFF0000FFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFF0000FFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFF00000FFF00000FFFFFFFF0000FFFFFFF0000FFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFF0000FFFFFFFFFFF00000FFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFF00000FFFF0000FFFFFFFF0000FFFFFFF0000FFFFFFFFFFF00000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFF0000FFFFFFFFFFF0000000FF00000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF000000FFFF00000FFFFFF00000FFFFFFF0000FFFFFFFFFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFF0000F00000FFFFFFFFFFFF0000FFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000000F0000000000FF0000000FF000000FFFFF00000000000000FFFFF0000000F0000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFF0000FFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000FFF00000000000000FFFF0000000000000000FFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFF0000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFF000000000000FFFFF0000000000000000FFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFF0000FFFFFFFFFFF0000F00000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF000000000FFFFFFFF000000000000000FFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFF0000FFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFF0000FFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF000000000FFFFFFFFFFFFF00000000F000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF000000000FFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF00000000FFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFF000000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFF000000000000000FFFFFFFF000000000000FFFFFFFFFF0000000000FFFFFF000000000000000F000000000000000FFFF00000000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFF00000FFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFF000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FF000000000000000FFFFFF0000000000000000FFFFFFF0000000000000FFF0000000000000000F000000000000000FFFF00000000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFF000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FF000000000000000FFFFFF0000000000000000FFFFFF00000000000000FFF0000000000000000F000000000000000FFFF00000000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFF000000FF000000FFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF00000000000000FFFFF0000000FFF0000000FFFFFF00000FFF000000FFF00000F000000000FFF00000000000000FFFF00000000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000FFFFF00000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFF00000FFFFFFFFFF00FFFFFFF0000FFFFFFF000FFF0000FFFFF00000FFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFF000000000000000000FFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFF000000000000000000FFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFF000000000000000000FFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFFFFFFF000000000000000000FFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFF00000FFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000000000000FFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000FFFFFFFF00000FFFFFFFF00000FFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000000FFFFFFFFFF00000FFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000000000000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFF00000000000F0000FF000000FFFF000000FFFFF0000000000000FFFF000000FFF0000000FFFFF00000000000F0000FF0000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000000000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF00000000000000000FF0000000000000000FFFF000000000000000FF0000000FF00000000FFFF00000000000000000F0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF00000000000000000FFF00000000000000FFFFF000000000000000FF0000000FF00000000FFFF00000000000000000F000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF0000000F00000000FFFFFF0000000000FFFFFFF000000000000000FF0000000FF00000000FFFF0000000F00000000FF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFF000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F0000FFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFF0000000FFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF0000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000F00000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFF000000000000FFFFFFF0000000000FFFFF00000000FF00000000FFF0000000000000FFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFF0000FFFF0000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFF00000000000000FFFFF000000000000FFFF000000000F000000000FF00000000000000FFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFF0000000000000000FFF00000000000000FFF000000000F000000000FF000000000000000FFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF0000000FFFF000000FF0000000FF0000000FFF0000000FFF0000000FFF000000FFF000000FFFFFFFF00000FF0000000FFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFFF0000FF00000FFFFFF00000FFFF0000FFFFFF0000FFFFF0000FFFFFFF0000FFFFFFFF0000FFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFF00000FFF0000FFFFFF0000FFFFFF00FFFFF0000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFF0000FFFFFF0000FFFFFFFF000000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFF00FFFF0000FFFFFFFFF0000FFF0000FFFFFF0000FFFFFFF000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF0000FFF0000FFFFFFFF00000FFF0000FFFFFF0000FFFFFF00000000000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF00000FFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFF0000FFF00000FFFFFF00000FFFF00000FFFFF0000FFFFFF000000FFFF000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFF000000FFFF000000FFF000000FFFF000000FFF0000000FFF00000FFFFFF00000FFFF00000FFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFF000000000000000FFFF00000000000000FFF0000000000000000FFFFFF00000000000000FFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF00000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFF00000000000000FFFFF000000000000FFFF0000000000000000FFFFFF00000000000000FFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF00000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFF0000000000000FFFFFF0000000000FFFFF000000000000000FFFFFFFF000000000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFF00000FFFFFFFFFFFF0000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFF000000000000000FFFF00000000FF00000000FFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FF000000000000000FFFF00000000FF00000000FFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FF000000000000000FFFF00000000FF00000000FFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFF0000000000000FFFFFF000000FFFF000000FFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFF000000000000000000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFF000000000000000000FFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFF000000000000000000FFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFF000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFF00000FFFFF0000FFFF00000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF0000F00000FFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF00000000000000FFFF000000000FF00000FFFF0000000FF0000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF000000000000000FFF0000000000000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF000000000000000FFF000000000000000FFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF00000000000000FFFF00000000000000FFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF0000000000000000FFFFFF0000000000FFFFFFFF000000000000000FFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF0000000000000000FFFFF000000000000FFFFF000000000000000000FFF00000000000000000FFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF0000000000000000FFFF00000000000000FFFF000000000000000000FF000000000000000000FFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF000000F000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF000000000000000FFFF0000000FF0000000FFF00000FF0000000000FF0000000FF0000000000FFFFFFFFFFFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFF0000FFFFFF00000FFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF00000FF000000FFFFF0000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFF0000FF000000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFF0000FFF00000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF00000FFFF0000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFFFFFF00000000000FFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFF0000FFFFFFFFF000000FFFF000000FFFFF0000FFFF00000FFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFF00000000000000FFFFF00000000000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000000FFFFFF0000000000000FFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000FFFFFFF000000000000FFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000FFFFFFFFFFFF0000000FFFFFFFFFFFFF000000F0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000FFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF +FFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFF +FFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFF +FFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFF +FFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +%%Trailer diff --git a/docs/verifier/exframe.bmp b/docs/verifier/exframe.bmp new file mode 100755 index 0000000000000000000000000000000000000000..134b61666a8493de382a39895b440857bb77c74a GIT binary patch literal 581478 zcmZ?rO}o#*00LzU3=A3!3=A%;3=A>M3=E76EFfWq5BDJQAdUb70|N+y*bEE}V8qbS z0AewK$c6?6h64u@eUkKqa!{E4Eg{VO{0T8 ziblKxN7LwtPXdEJ07ld3ppT*v@4(SCI^vVSpbvo2G&<;`Xv8~kG>wk zNelsgcnX3uNHl?>Og0krT0B}ybFh&#A30~Nzy)F_HV zU;xr6y|N!A_Wb`pnno!~SJc!z0BLk^m!B}#jiym*CNql68cn0HM2SX^rcsL06*V=F zrct!C3FD5YQEDbLip(OMMmI2UQ(^;BM+w0MH5K{6<2#Tf!N9=q{{u*xfr0-&hy|uW zsy={NV5tuv?tiE(NG(JwhyVzO zJy;5cYJ`-Hpri;(=1_GY!y$OI937yfMKx>jr%?um-Mcq1fJmr?VCDt}?hTNt5K2KL z!E(Dn8bEv)52?h1F`>x_a`GcMmBA7ixN?T1V6ZGwISLi!hie9Fgb>JS6s8Vp6u4N1 zs3MJoco5{1Q9QsQfH#eT;v1Ys8FqtPrJ&>rVlr@pWEggXNN|FMCS{NaSUopL3et>) zB}~xqqtL<+Tz`X-B?yC44u}CR?_jA7bXF-y5L9eJk{O5x(g?z!iAu0OC;`(2G6JS< zG>r~$%A%h2_|hmiNpizTZcquyzyM93kmSk0z<`oQxfwvol!1X@8U=TK5J?T1ut2>i zP(cZC6i5&`jeA&p6eQ7t1R)6=p_FLWXgNx~L`I=WkmP_8 zbFf+(Tq1(1bx^{DmZRL@Gzuz4H-M5S!v;_q1*J()K?|0Hi0@`#*nqPf1t%j|nFqES zBmxou6@FkEBnlG5NTZ;<0ZPiyA{nF(#04csNE(HfvmgNohMNabODs8>Mk!2L)YFbH zjWU4ibx1)8Nu!`b6;xJ&c%an6y?X<=m<6>$p>hzZ-SC8trLKo1KAhz!$Y^kT6kOaw zib7D)2+{!73?>k%4I~E=0wqUidliyCK@uQAgi@keqiK|SiHt&%2&7R^c?hn#A=ZEr zBqWVOs(et|1SKetEL3iw(L5Nhr~v?K zj1F8m3ThoNfXYu89xX?QdP*gbM!~I1P%RGjC%C8tCqEDi)J%o+qd;jCBmzpEM3kf8 zR0FD;K^R>5f*4RyNS_JB0SSUq9H>Zy*8B_%5NWU!SSOf(Bu7Yl6eKX3M#0fFTnPMW zlpEX_1(9I?ZUD7V!R077s6z!#j-a#&YP-SYKs2~_57x1JHXMyY`f z0eoo`ocutAD7fPet=BbI zSRfWCF+$QFhzBZAK{P}YMmY+S0%K4oAH)C|1HvFS$`}B#sdO}rf}?LR5CqdGsKA7! zQCKq+lq^AFpacL;qo4={aX@7(lm^LzJcuQYf{H;VCKo$OIS%L?fk9kUFqU#3s?vHO`>O8ypx*#KDJ+K*1|W-Jj0F9LCR7ge6Dauk|2KqVvYR7z|b#o`4>VT_RYFq%ejMCMQsM#LjD z-GE9rQXGyWjlzvURPdndnBkUy8Q^v)n1ziPO{4HY9N7$t(>G=(kyXN$>7m6I=Is) zXwfD0Fg(#9O*z5E1}$SWjgF?#L7OCfeQghDnN-WYC8sQ zIIOM*B_syOPEW{$Jv42C#X$}Ny8yI;9>f5pRoL1Q5FfHx6eJ2#3ZX%%5o8Eh9-;uW zVie4UEYAn2054&I?;wFY3p)d>ca#_mApnVIlxSjLSVctuOPJu@8xVWIX%RV%f&v08 z4`D#$;b|1i1s}}}W-)-bkwDTW$UIQ$17SoO1?>?5nFPUzGz!%Yp$M$Ef~04N38Un| zhQJ_7qtLX2n!;e`IfK(EG^h}%4tp8}Cx56~h<-?lh6usaK1efeOx27^#XLU(jT&5O z6uf&LlvY8>5OOF9c!Mba2T&RXOMqIWNc;0(sSjMZ@`DO(kOC+MCwGuhFjb(69+XBw zs&OYzu*_&09W=RNAkru##eiy42n&?RKJ5# z6Nm<3kOZg#2WbKEK{~+c6Q&xZ;QxPcY6q>;2kFIwN7LwN8U-a!=q`AyX%v*akjg<& ziUTJy5CKbd;3Ni0k01<^02>PKj)C{ogNjRVISdj9mC>La2~h{uijNpgqoZjQlx(o1 zQSc5T4hym_Uff5YXnM!_XAxY+VIf(?z=gy? zV}d&CQ1cN?a2kTv!=Mxg#vnc@0fE!)e@Hn85(C%O7-jWn+s03I5 zq!4@t6o>~t_z^OO58{GTGCxEXWCd6=Zelcz4oG^$W+~BW6co)|t3V_eb0MWshyW#N z6xLn@nFLNtpu`5^K#M=Pms)L8pW1e21Jb5 zG`fI+0fIoul#77@nnppTE2u1GU?963g_LQa!~{x7pkf!2h(HxLD8a#b;I=481ez4V zBUIqj4Kf0x87cwQ3DpP{giP~;w8O+fDG@gwO``*n9RE6qM*Wa0VIKfn5)1o zfK}j@0J&)tT)cr&8nk!>IS7>Az++LMlnYH#peh}b7U5lUNCE>%fXi7>3l^*xC5?hr zgM>kIOCW=xNgbjYH#wR{u_c!Q5d$R&w1~n|X@d$;SQ-VVOSE#7VF4NCD9Bn+x&qNq z3@SxIOz45OpyUTmV<0gwhDw0b8(08AK#c+$0nv!)I{p6uFLXf~Ks_lCjSr8e(E&-1 z*es2Fy?3)1qI9~CN>0!PooU0KnW5w2n8A;h4z_1 zLR<^LLr|c$9u`|+2@^b$2`Rls(hq)|v$A6D06ElDX) zqu_*1T3rv;LK!hy*W*kx^p+qtjY8^kFbPVc(7GPfxre4)uoM>8V@adrB%aYUiY07E zh!D|f6jWG3#+pDZaCHyjLVEk4*(Ok0#S&;#N~7eYYl`%YmZMlAb6|vsPNV3~0~Mj@ zV%YejX%t(ijEa#E0;6dZM`=4+j*^gyXsdKIjgF>K+NLndO&?98qiK}#R76`7h)bgs zxM8$CN+FD9O<427qB?Lyx zQC#IHDWN#3mX;xaC5_^UG|GjCR(q6|p+0IhDIqWbX_OS_4V2o^x_+QS9*eyLkVYvl zkm+H<=$*EM`A%D!rGTMT*AJQ~8u1PpEk|)=$H+1Lq^l+Xd1MC@5)y(-4S(oJK(x zJb)4#xNQo)^b5=bC0Gy!bHExQ1Smzq#i3?_TBZ@I-=7kEb-w?qmUE@ zQwC0YkW>e$&q0Y2TN(u?e9(=}7z!W;l0=TC(a|&ts@lP+5R`I243GdQC8D-g!KErl z3R*mZQYl6f1j&KafJ>Sp*)R(8wI0v{UAzR)N#r{q)}*U#4+}SRJ$`kTA1Lp3`)k( zViqzefRr&n)jLcZtW!m)$42XV>Lf5Km_lh(BBd09OjtPzPEMdS2f|=o43G=x8K5%Y z0uh`tLB%ad6q24n(xB!lL<+1EOhD5pL=nhPkV3Ew`NU`%r9$eWju8WtMnPR4eo%4) z&2EDGKp+ti1{abb23QuHK0!QiVg)5-h%hXhw|1r%0 zrBO^#h}ne6(e~&-Cr!Bh1DZxbl{)TJL{b{XD5F7zEx7$aI5}cfF`7owj?(ZP@o z@ws6%jgF>KeCcB_$c?7a(KI?3(jh)KjHXdsX>_pmAV!|M22mOXZ4dz^7|?1c@G@u+ z2h4!3jlw>64^agsVJ3iS%#~2k8C0+=SUo;sbPRvcWQKuAqu{g#nqh~mokJuYkQhi7 zBmyb?p=+AJ3PEWXwD|+13M>Fw&=1l8Rt8>K0#N{7YXUL>w6+v12_``1LR3LhJ)T55 znnp*{C?cgn$~ABb1eJZDqy=792V#KI7z3CGS`P{m0ny+D2Tot0vs0L6iC=117D7U5+`_v94HCFQy54ToOr>apcIHC0#0?f(kNt0 zG*}xbAAm3@6+^X;rcuIaVz8+gOlcI9e!wXVRDDAVL~!xO07^aP>KYlPmmBO zae=negH?hP7_@+e2tYPAgVHCsrv*}tl14$LHK<4hZA1m@#z%~%(a|&tN_(Ib21>G=!c!VJU4klTP*n^%cLdz$hNdM*8UrOmBGM=*Q9_DjP;Cz8LG+KN(Ls~m z$Z^Pkw?`rA2P2Jwk|d~n1y%pxnj0hlV?c^cP$38^PeCTYQZYQ`g9PCEK`KVeQF4;U zpwKfI(kM9jfl?PJK|<3KI5~pEKp2$Zz>2^GNCcENQPL<#8>r-jj_X4xkV+5+rBSF3 zX!#5-t3d|f#G`fnph%w}M+|5hg(fU$$^#7zf$Mrur4LFwpri##w&3&%Rs<$Mx}Yfz zoOq$iARYeyAHZTD?VzSEsIG^Y3swag#R8iGQGuHrO{1XXF(~i=rcqF_2TEArGz3aF zpuRV#(gz8GPi6!+RYA%?NfJ~7f)g4@0F+Ka=?f+S5(63WA3P@os^mc@JA%qkkPL_q z(#{W-1*KcU-X2Y(gCc!`96>m;KuLi*7}lFcNok;T1QGzHAyCSL(U7zSO199sP^bhb zg@NV3ZbDC^5VfE*304Ch!w0iKg(`>vO2{B-ux@hqg#DJt7 zP)dRnf}kV|;enDOGB@El7J^(2m?Yw6E{+dhKPe&0w8noB~P&2Xc`?9=@aCL zL6JtmjZSbH0woV{vV^2aSP}yzMM&xbwN+t_R!GMPA`UL2!8*a_fR%uXXpqs6v=1>6 zlEjJd^=KLeC67UYiHI#wx}gdNrz2#OKnv**eE5mB5C%A1f|3-%i3kHwb%HuoU~|Aa zp&FqSNF1sfEDKVLFcBn+9gn8bL6JT|jvywwuty^4qOc?eYJL)}8(bJ7r8iWK*o?xd z7*#6)-e?*HC67UYN7E>dv^ttb2Sxe>Ibt-8j;2viIvC7&(5F#w62e)1W2@`IIw&Sa z%h5rTY)8{5j?_GwMn`lS#gQrom+)vB9ZjQyD@9_uW;BhCrcumPF}OrV)97d#9b73A z(>0@MbTo}(ri#HOGMYw5)9Bzzk(jO-O{1e}6f;!}E|JkRI+{iYSBk`R&1f1OO{18p zVsMF!rqR(fI=E6KrfWvi=x7?nOcjGmWHgPArqRKbA~9Vvnnp*{C}ye{Tq2`sbTo|) zt`v#s8t~qzQDQKJz(B0c!%Pr^P-HMf&Zrx}AuyUoapVth=!_DBAp}O#=x7=p4CxS` z8%EP8t~9!86bzCO7)_(2X>^bzMV!tUO{1e}6ldZXBod=(bTo|)lB9^!8KY@*G>zg+ z9D_t+G>wj?(Ls_FaXMo(jgF>KoQY$QNQ|b@(KI?pk|IuLjHc1iG>S8E3=)aaG&-6_ z2T4-I>5S1dI+{iYI~Yx)qiJ+BjUv(j>>Ou=$RK7h4EC5CIqn-RM{(qn(KI?}GQnsX z9ZjQyCNbi0$Y>fJO`|xH#-I@%O{1e}bkHP591a;xqoZjQN75KH!lP+)G>s0L#E8Qo zqiJ+Bjp9fegGP8XjgF?#L6aD9IAk=9j;2u@Nn_9mkEYSlG&*P!BMyg*rqR(fiX&+Z z8sX72I+{iYO=861kkK?cnnrOXjX@(knnp*{=%7iAI2`yeMjQ?qO{1e} z6i3n+G{U24bTo|)n#731A){$@G>zg&8iPi7G>zg)qxfzS7?q=E2#luD(KJfW^hSKdZssW>>5p@xYFpL=`xIXhm5At(KI^PGr?#Y9ZjR7X%vwL zM$dK}?5SaJx^J``MdTqA*67)egC@a_rcsoXiQtT;(a|)DNDYINHJV08)9Bz#nFv>n zrqR(fibxHElQo(~N7LxwOqmE*ji%AjG>S+KgOfFyMn}`=;7pkaSB<98(KL!k4TF<4 znnp*{=-^D52v?1!(a|)DNDYINHJV08)9Bz#nFv>nrqR(fibxHElQo(~N7LxwOqmE* zji%AjG>S+KgOfFyMn}`=U>G=;z$~UMtC%hj;7H;lNfP0WHgPArcoS8W6%hXrqR(fI%pCj4u_1U(a|)D zBWVm8;n6fYnnnjrV#MK)(KI@mMsXyKK_fhxMn}`=ph=8495R|lN7E>dq%mlON7LwN z8XYu=5r;!Y)97d##gQ}yjqqq19ZjQyCNbi0$Y>fJO`|xH#-I@%O{2KdC^@$ajOw99 z2#luD(KJenbVW@wN7LwN8l`4>qJ>$bX>>G=(jr|^)6CH{iYtu{nl8hLcgScO9ZjQy zJrj(k(a|(Innn?6VDx^b!JZlhr~5|BQA8d>VU6xx9yAGdG>xL9Oax~%jgF>KL~0nE ztkE<&nnnj_%0#$oG>wj?QABDOoUG9_I+{iYXUaslYBY_Grcp#{7@VxpG&-6_2WQGe zxN0KL~0nEtkE<&nnnj_%0#$oG>wj?QABDO zoUG9_I+{iYXUaslYBY_Grcp#{7@VxpG&-6_2WQGexN0KL~0nEtkE<&nnnj_%0#$oG>wj?QABDOoUG9_I+{iYXUaslYBY_Grcp#{ z7@VxpG&-6_2WQGexN0<@KOB5%KrqR(f zijp7(A!js=j;7H;m@HA8G@3?7(ymVmHEQ&&4bPOLQWg<8fh3cqgYK8#)(-MyRsX_VxmegHIp>iR(wMI+uJ^iQKW%B{gB zJX($pn!GWZMsZ}0(KI@mMsXyKK_fhxMn}`=ph=8495R|lN7E>dq%mlON7LwN8XYu= z5r;!Y)97d##gQ}yjqqq19ZjQyCNbi0$Y>fJO`|xH#-I@%O`{_^je;hQ_`$0-ASsf8 zf#LrL(B<|F4E+B=EHDjH^#Q~JOML)w|3hU#Y9U%dBuEA%0#X7}3&J3A%J66!9m#1F zl$Jng3Y0X#=?KICCoE`+1SL91QbnXukQgWhgK3a%uud=m5#oofR08P)i&I97rqPj{ zMv>AKBpDHrMj`1MT-<`SLo`B2umA(YXc`?fiHgb&q5oVcG`WG(6g-hZ3O`Ueijv~s zbNkQxYvrcHh*4OS14p@bYwqa!$tf>RhMNrD-mWCUV>1VD)pOv400$&DXGfMmb} z0U)J_#0^ph5(cZ`2g!l7gD^yf5^^++j;2v)Z4OFCu*3yQiSPy|ND!1f!RZeq14@jb zrYD#NX@g;C`3Xv+VENHBI%rZCbsR$f_9!gzA&Ntg2smLu>UvN@gQj4l_9$dP6{HlQ z5t2$_X%w2gK?xfoK@mAxj#4LqQNfg9ltw{m7nFv<$(^F~3DP{8MyZgxsAB~E(=74pA30OG_orQuJ1(uQn~{rBL)TraAOi&vqMuHIN^el8w02c2lGJEa1KZx6oZm1$cPV+<^Wg|>P!?= zAxYF|8l^(&qK***l14!-PS7Y5C_RFp=`C2G{d&Sy&o{i86ru^dP0+ zRQCatW)VV=WDT1yg-U`Il0%H9Q7WV^>KFk|B;>>)8G4`7@oAqg9{Dhh58KZpg@4%Grq&mTZVF#iY8A`~**3Dz>2MyZp)s9*{>k$@wG_5>(F zfouUKQgD9=QP)E|QXtoWWWfoI0hG|dEme>vP~i%tK@Ct4^8-i{RE~mLvj_u0W_@4) zm!lx_Kq|?=qiK{1sf#*BP!NkGM?5TzLN&sY8kCDhfn`D6Bs6hINedQ4q){*zl^9K< z)JY(Nz?6Yaqx>kHACyE!Y#IgivaopqoPe=OpxA<&Gg^)gg479d0tK;%JAQGQ*5*x9jGLUVef#ZQEH|sYMV8hMlsULKnaYdQ5=bT zG>r~alEkogG>zg)qmb#VQF7ozU^I=6rqO{sCSSO!SpXc`?&qXU%mh_-eRrBV3g zJY+ElbOAJYc|9~85t;-At)v1e1sed<4-$Z2urOpTG(-R&IXZ?(E2~HNnir9 z6Az*aq8+qM3ZxES@&wC`rcqiaJ)+Hr#56coXik9A4>(DJ%0m!_EGmH}84v|h0ZCl& zGz#Xz&Km=lgrL135S`#P`Jhw>-dh6I0^&o=0+FC%7?MW827z|zfrN3dTZM(fXc{Ft z4bfWRph=^UB*cK4!XV`!v>XMeErvA__@a^m!f6zIb_1w51SKtS0}{l5r%`Z+3wJpR zO5#Xq6udnjq8}xVg3Tr9@6j|$S;C^CZh~<|rSu6h274L>CmBd15|p68r6f32f+avg zU>+oCf{H<~3UFBokpR`?AY~vG&>|UfIvL0SkOZiF1xbSZ3T|0|Re@ZD2al#vDyA~Z zi~_|Qo|vMl6s|N1NR{esL?b^S=tyZ zx(76kf>InT`GG2FP(lTZArdJ{8U?p7!6_P~3#154gVHNV8z@bJ`~%{Hi&&7EuoMka z0MY?cG+K@hmgGm2J3w&?iaL5=jB*r|ZeSRco)BpivOfSM22Nw3qzF<7O0nQH3g&>^ z3`&nsWuT!?P|qEt7$gNQOTjuoBA{{^Bn#32F%zN&7dcwj6P14Gp=cn}D5yvSr8pRd zj5~n}Iq;}GD8+(=paLK+IH7?EkQg|1fs!1^9FPDAgOAVw34qUgf{fvVxZpto&`Elr z1P#Jq-FS%6G)j-;N0c3dA&r7tknofTN>Si63SxkgFDU6DB}Gul2$ljTFiZ(haSAzd z52OmA8pMP2??EiEW_-kG8YL?I&_mHcr%_Pp2uh>ijy<@1gCtgHN<&VgPzhM7gCsBl zX%yUo1*J(C17;vZHy&~{jnX6e5oN~!r%`Yf3`wKlBnWa2C`rMSELapYg9#f>0=F_j zN+9VAl14!(8ag`#QVWuXXauVUF+p=nAYo`)g=oe{j;2wf(hofpff5D2sG_DEN}ma2 zFr;S$Vu3MC9(w*VDEWcY7+4ZSKqbKG4a7&nP@}*`Ks16nN>BwKz|#VttN;=qrpNUE z|7aSeNAe@e4*I82P^kt^N}%*Y7=u$3yc>_99-1Ce#IcE?C?JM2nnsCAKlD&EnnrOX z*wHjfkK{*`9iwSsCKPzF%ZpiiUVBt%+W57t5{FbUO933wj?Q5;EQ z&SImFq%e3)94^cia4Dynnp*{D9*$&NF+wn=x7=pBuNpcGe*&Nf4R_ip4P4V{YWQZ?qi6kqJiA=%C32 zqiJ+BjSiZ`h{GYHX>>G=;z$~UMtC%hj;7H;lNfP0WHgPArcoS8W6%hXrqR(fI%pCj z4u_1U(a|)DBWVm8;n6fYnnnjrV#MK)(KI@mMsXyKK_fhxMn}`=ph=8495R|lN7E>d zq%mlON7LwN8XYu=5r;!Y)97d##gQ}yjqqq19ZjQyCNbi0$Y>fJO`|xH#-I@%O{1e} zbkHP591a;xqoZjQN75KH!lP+)G>s0L#E8QoqiJ+Bjp9fegGP8XjgF?#L6aD9IAk=9 zj;2u@Nn_9mkEYSlG&*P!BMyg*rqR(fiX&+Z8sX72I+{iYO=861kkK?cnnrOXjX@(k znnp*{=%7iAI25$Q*CU10LG>wj?Q5;EQ&4f$rYD8&vdA7@I_EhbApZGUErWB8F&1DMulR z4Lyybh=SBZbb?86l7tuv)dsZ)EK4piT8@H}$DqLUPovP}#(*P@!V(*phL@vY9s>hE zTr*PALrJ4Bg-G(`F-Ozrph%w}M+`_Bg_NQ2;t<3DH#$M74aE8XADV)Z(6LyD6xT)C5ZSBN{1iPov-z1}Zke3{VOJF+c*Kv<0SNf}rHd4B1Hi?nnpp%V^H8hm`1@(N=QNkm5iXIH=0HVMPeBs zM~tRX9A)ijIXXZo64Tn@lSaW6{%Bo~8O1|hg#Kw1+~NeaD?u1sh=CYTQAo!f!~qF{ zs(DB^9?XM`JwXJ(8X*Lz2?}cz@WT{Bq$nUq%h5rTwg)7QLXsIcIe}6U0|NsnZ9!(0 zpeYXC9tDX)MxsFJ5HvmtkpgLiV5km=B9NgVg%BwU$k8-9vePK2R|G0CL8%Kg?FiyS zFgW#sn4rW6o(lzW;L}GCO`vp$NPS=h;4}^rhv);%nj%z?#TrecBRGwMia}7x2~JJm zVjP^xAOyHk36}+zp&%Zp(g!I34K#sh$k5UU(7Y4GIA|J$X$P+c_)k$v9ZjPnIgNr7 zC$wlpN~7Rp1}jyei4vj|l-9s06SgV}Iv@W5)I@-$QHV;IcJSJg4UvNw2{H%@mW7pvpq3@528X0Qqy!C0MgNi0C{!ClA*i7M)&N#YIx(6? zM|2v6CKzbqgYwWRuq-HzqDz45d$1rRjY5+)SOkd}O{0S*jZx|lN{Sk!6hRadT1CUu zf*P8Th9yh{nI<-kf_qv2G0g#`QA|-}8}PG7%TY>`7S;3*U>XHCA#o-YlF}$z>IWG* znntOXMh4oTp`1p+!>Z7xD=1ka;}4^0bfA+K)$AX@Gz#vKBd04&HvaY~G>u|4XEcpc zEr|@cK?9jaarAaDlPa1BxEX*f1|1(j7NVFv+8!P7vR*Y!dmR3^gxHeXc`?&qXV4=3E4lIMn}^qp)@kk@}p^VG>r~)8YE=@ zph=^km3pA$0$L3PUH}c^fEmygcG&0cA*#S6%mgrvxe^LGg9?@ftH)1_j^PtZI&_n# ze;Ng+HP8$@c zfY+LU3W2Rq_3()Xr8l_trBxKQGNTcwi3EnCPN=4wL2}+G14kV3& zSzra=1P4x0pi~Y{@*oCO0aPoPhm=OaeDL;W5DTmuKQWp{2_+r6$q#fI1tlqH;Rh<` zKwJj!(oaxQ0;Mqs4^&*jMDV6j`0i#D)i6;=VLMum(k*#W#iGHJMnUNZoR%Qz5k!L1 z=znlI3Mwu^2^hSd4^(V|NRmtGJ_MjvL+Ak08#e)(fJdF{VMnTFTCqjYKD5MO9rBSef zU~vLT6D~cPMhPVyy2%fUGzu%`;As?8Cxef`1En!g;sZ4VAV~})g0&n4=|M`Ppu`VJ zr=Y?Ukw!t{;Cuj2jo2BZX_RhhkdQ?KpGHAx5tNKT`{to_Jt$Rz(h?+%fp|ouQIH1M zMNc5*;IS)cibgYcG>sBU7K2KDfYT@_aY70|l)4@zjggW@!967SRb!Ae4zUBAE+J(t zsA-G6@I(?FEk_4UIvw~l3QCXQwkL>y*2&;%9aIK_Fd~hDWI-Yrbv;A^oc5q{;M9mn zqsXEl#Yl+}2Xi!yj;2vi`T>urL(?dv;{>jtA*YUjia$`Y1*ccAA}|3;VbBx@PP|ZM zAfrG%d$1TJ*@03sR5h%@3)Tn{gQ&nqj;7JkGzxA$f>RwR;egU62!o10(D)?-D9wSp zP)K9=u;d8R3Qk@iogf`x0Z`I|jsEjP^@Gd@NrKWS$TX-4#8e)mX>>G=f|3p>A%a_w z;4}nEWY81`OeA8qiJ+Bje=4SB#nX_o#65hlsrJ<&_WSb41&`rSOGW@g9=GVZ4HtDi-UVhV4V;y zNC_y3f{X?wSurOFBR3nrEi9=O`WkG5YCW2&f;n6fYg3~Ct--0V;po@bGL!|VEDv!-5 zoQhGk66B4h(a|(YFp+>2jHc01u$#Dw51d{oCLonHw!#mm(W7Z}G>s1SGzw0hKpaBx<9ZjR7X_SQIG9XGv)97d# z9gu`af~BKrbTo~UkX!~t>1Y}qO``*n@JO(9G>wj?Q4*5NfG8bJqqx#2XifAe9tMn}^qzVtB|s0Dq=?fQqiJ+Bjp9rkgG6F9jgF?#L6Q`4I%71Aj;2wZ ziDQsRjHc1iG&)F^bzMV!tUO{1e}6ldZXBod=(bTo|)lB9^!8KY@*G>zg+9D_t+ zG>wj?(Ls_FaXMo(jgF>KoQY$QNQ|b@(KI?pk|IuLjHc1iG>S8E3=)aaG&-6_2T4-I z>5S1dI+{jtCXPWOF`7n4)94^cia4Dynnp*{D9*$&NF+wn=x7=pBuNpcGe*>G= z4w9sZ(;1^_6jvI>cZwj?QF^8~a_kySqoZk*oODA^J)>!KG>y_Ty^&+r zXd1y_Z$&qZ`Xc`?&qa-I9I%^nBqoZk*&Pk4B>qgV)Xc{Fs z(a>4LXc`?&qjXMkBwII{Mn}^q$%%%}8b;ITXd0z+k|Wu=(KI@mMoCUIbk;DMMn}^q zos%5N){Umo(KJeOqM@^f(KI@mM(Ld7NVaY?jgF>Kk`oP`HH@aw(KJfuBuBD!qiJ+B zjgp*b=&WHhjgF>KIwv`jts70FqiK}nL_=o{qiJ+BjnX;Ek!;;)8XZleBqtg=YZy(V zqiK}RNseUeM$_nM8YMZ=&{@N18XZlebWU<4TQ{0UN7E?DiH6P^M$_nM8l`iRBiXvq zG&-6_Nlr9$)-akzN7E>slN`y`ji%AjG)i)!p|gh3G&-6_>73+9wr(_yj;2wP6Ahg; zjHc1iG)m_rN3wOJX>>G=lALJhtYI{bj;2vMCpnU>8%?95X_VwdLuU=6X>>G=(mBbI zY~5%Y9ZjPoCmK3y7)_(2X_U@Mj%4db(y_CT~X7_(KI@m zMyZ*eXkpf98pQ!<5!j<>G=(kN+B&Dha2I+{kQmY8T{&}bSRO`|kQT2wQ3G>wj?QK}^-8W}X2 zMn}^qjgl7Cj2%s*qiK|CiHSxAji%AjG)kkSMKxnb)97d#rCMU5kwK$rbTp09C}~m6 z*wHjPnntOXm}q3sXc`?&qclodR5NxojgF>KswE~G88n(kN7E>ck`~pB9ZjR7X_RV- ziADyErqR(fN~5GjHDgE9=x7?HT4JJ+L8EDOG>y_IX;IDC(KI@mMyZyVXk^f68XZle zG)h`jGj=qMj;2wnB_Rk4N7E>dfT6$eut=i}4Af6i)Hjj-kvmLm z98IG*B62j1;s_Y}3lEDl`hkIg>i!r_qx4UVIBcYP+~TkYBus-E8D#AL|D$OX5)Q+Z z92RL5v>=(<@iSVEQaeP+HgDk5=m%(z2S#If1*-%DO7#vk0z)eW0;6e^g21D$)&WSP z(A4z-QuTvUAV>s8{|8sypuHOWkm3<40a6aG(?Nd91O#h04EAM`3+LJgHs=@Mh8{e{Qo~N@Pkv?2gnc- zN*aYpfCS;?C@6h`BtU`?qaZq|=#kNKl!}2#nNfovje-&xD2;+?kZ-^#4_1zXlH>pX zA3y~ysA>l_3LqGiV8JTE4OnRU2Wh7c9!;av2}dfJGVo~>;sQ{Tgn0*?@<0Nh^a-Lt z5+FfPvIG^wU>eE*$$_hW5QB<%G>uX*Fex(%l0qmmgIL|rvJRT+K#302eFrBnP&o=> zfSm)D0jYwdQII%lpJ_CW5*y^hLLE3!(8(vXO`}xy$!IxBr&K}M8Y;&uUJK!A6jU;T z8<^B7M?u9ZsMy78IjNGPX_V9uqnY|4nMOfPQBd-RrgKOdrE;R8vT-zvz!6~ZfTmFf z(9jbDIJJSAo{*#m?xurMAE^5dQUMy9LT!(Nw1GSMpwZR;450QaSU)x6Yc!2gGc+kO zYhcqT12}zw%0W;%1JNMQfKnc)IRL`2v0R{$;G)OD;@Ms#P zURY9S(jZ8qpi~A*V_+KO9i%i0E39Lq`?Bzg2^U*Yl zBVgz+JOF8w{+=Yq#?drNPN>mD&uALO5vR*Y;t(Gdrh5pCrcoS0KH6u(5is-@9!;Y-!hAH1;s_Y}3y-Ez9AQ41MsWlT z{e?%Ri&=r25)MsbAsXd1;4F!UE5O`|x%d^C;X2pIYckET%^VLqBhaRdzg zg-6pUjxZlhqc{SF{=%ba6i1kkrcoRLLx17XG>Rk4N7E>dfT6$eXd1;4=A&s8N5Ifu zcr=aT0HbLXN5Ifucr=aT2=mc2iX&j?FFcw?afJD38pRPX^cNmYqd3BRG>zg282Ss3 zrcoSWKAJ{x1PuL!N7E>dFdt2$I0Azg2^U*YlBVgz+Jeo#vg!yP1#St*{7amQcIKq51jp7Ix`U{Vy zQ5<1DnnrO14E=>i(>G=LX*OvrAE`}Xc`@~i4*Fu(KI@mMxjYz&{Csm6jvI>AwDWh z_YfFOqd0Ri&=r25)MsbAsXd1;4F!UE5O`|x%d^C;X2pIYckET%^VLqBhaRdzg zg-6pUjxZlhqc{SF{=%ba6i1kkrcoRLLx17XG>Rk4N7E>dfT6$eXd1;4=A&s8N5Ifu zcr=aT2=mc2iX&j?FFcw?afJD38pRPX^cNmYqd3BRG>zg282Ss3rcoSWKAJ{x1PuL! zN7E>dFdt2$I0ARi&=r25)MsbAspuNFhzg282Ss3rcoSWKAJ{x1PuL! zN7E>dFdt2$I0Azg2^U*YlBVgz+Jeo#vg!yP1#St*{7amQcIKq51jp7Ix`U{VyQ5<1DnnrO14E=>i z(Ri&=r25)MsbAsXd1;4F!UE5O`|x%d^C;X2pIYckET%^VLqBhaRdzgg-6pU zjxZlhqc{SF{=%ba6i1kkrcoRLLx17XG>Rk4N7E>dfT6$eXd1-M4rV$xKqn;j8X>S!7rq7gTOoIRRGM^I!B zQLm1s(IFafBgomKX>d+zv?yAd?_0P!xk=n;(`~Ai@w5DhW?X5K*XRh%Qj_11Axf zC^)5nkR}idBnD9n za=}o?V9yS9Pf+T9P_#nKfUuxZ&44wH!X#m(9YhOAJ5+`rlz1S?3nmImV4!pZQh}7X zK?*@aph$qyVAGJ4g83kIAR{1#LR3OhE@~Qu>jN>s`3tHGLBTV0T~8&KLlOeW zFfa=g!{CH~EsY{cg4KWsXi5Mv!3KbeNN_RsADWOs3ZSx}0EaQ*W-)+OgS5f)LzIAp zA*m5$1acaMYk{Z)>w}pGsp~;Js4kG#hAsvL+0b=8m0S*vV6a(W7ASJTNdR0TGW`Dl zZS8?2K}iCf1|X6kF0^+AD(ygAummJI!O|$GK?;%rD*?-c%?DWoHVe#SVEF$5qyQ=p zQV(Y0N~2)iAPo%QW-J3(F}Umpn+cWydupf?qiGb9nxF*^JQ;%G6%y+p8L%)Y(jn;p zQoKRZ2t*X59AOZsKm@BnOQVo-8JvQ^rh-g>l(b;gU@=gy3Tz!n5^Nn>8ilH20N3Sk zJHc8&$r>aAwgI9a>aZbAjiymhq=FI#co+y4)u4m`idQfnmVm$O)?(07^ncKnVbZVVWVTL5UNTy1|JO#DPeIwIHd6GGQes zgbP*#u>&Fi(vMk=f{ce~#GXbW4gr|}EmR=_Lz)~-qmXn2O%33b0*YNQh6+Mb4wM9| zfEQFS&CoOekp!hKhy;WLi-M93gbPbt5FXNCCMf-Z)FLSb83ij+p>}{Mkn3Q^fK-DU zq%Z+^17odL6F{O6{jf{|5{20T zk_G7jm*pTq5C??8UH}O|Y=ty9ApD_Cj;2v)Y5>JD4bmvcSWv2hr6^Ep1M?xt1|$u_ z#HUe^W{?hezaDHdNMtmPLc(--lAweGie>1uH;4-^i(thVsAPrJxDZK@YEWu{i9*8# zA_-Cs)(@+~LBdF?K}@IySOUXHqcDR(TH%r)O(2^=7&49p5&=tt)Pc+emBkRdK_U?8 zp-zsLqsZkbWUw9*yI>MbKoS9%gr!=rIG6w>NJzqf8U&+2DF#^&LN!PRqy;px4{ba` z6+$V5Qi$m=4N%3PB+39ui16eG)&eH}|A%zLK&s%em6uqEWg^rXWmw<2u zAT^*w1F2@g$rYv!ng+lszzGdv7Py!MD+Cizji4k4*7*MeD4Bwkg7tvYEyw|25s)f~ zE)W+oE(%r#;*}I*bv2_vUm0;Bfd2kX2iNVbRWdS$`6gMDQFhoRq<-0K^5S8BjVvOQR42AZZesyihbkZ3Gz$G6pnS1Tg{1gLIrA9FXx)r$U&Z zbO@4yxdP+}5Fca$NDgc`ND!iY2$P`j8N$w|j?*Dg3yxIeG=xZ2pm+x<0!29}{z0h; zsRIKN2D=2L4w8_-s=#R!n&u(>a8!*@8$k_9km(>vhzVfb;HZI$gOniK@c%z}xd2EO zmPSF+P<`O`D8%(3(V>pP0Ws7)L8<#eQ4LB3Fd7oQh*AtxjzZ%dmNFq$f>IO+LwI0q zp!5n#Y#+d>9V!W-z$pl#6vl+x2xdT9tsoO%@}LBWuo;s4LH(@%i1qi-gbpzmq#nFH z4-~H;GoivmngaP{NPB=9jt501Y8r)^3Q1g`ms0MR7aXeKxq_Qm%|w_{m>)>rC_2cG(rxf8^J?S zM3@8B2&HhVhgt&KSORMHVpj-C$=GFvqUdN{53TEmN*VnX literal 0 HcmV?d00001 diff --git a/docs/verifier/exframe.eps b/docs/verifier/exframe.eps new file mode 100755 index 00000000..6a730a67 --- /dev/null +++ b/docs/verifier/exframe.eps @@ -0,0 +1,879 @@ +%!PS-Adobe-1.0 EPSF-1.2 +%%BoundingBox: 0 0 1348 860 +%%Creator: JASC, Inc. +%%Title: E:\JustIce-Paper\exframe.eps +%%CreationDate: 0 +%%EndComments +/width 1348 def +/height 860 def +/pixwidth 1348 def +/pixheight 860 def +/picstr width string def +/psppic { +gsave width height 4 +[width 0 0 height 0 height neg] +{currentfile picstr readhexstring pop} +image grestore } def +0 height neg translate pixwidth pixheight scale +psppic +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF000000000FFFFF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFFFFF0000000000FFFFF00000000F000000FFFF00000FFFFF000000000FFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFF000000FFF00000FFFF0000000F00000FFF00000FFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFF00000000000FFFF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFFF0000000000000FFF000000000F000000FFFF00000FFFF00000000000FFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFF000000FFF00000FFF00000000000000FFF00000FFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000000000000FFF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFFF0000000000000FFF000000000F000000FFFF00000FFF0000000000000FFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFF000000FFF00000FFF00000000000000FFF00000FFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEE0000EEEEE0000000EEEEEEEEEEEEEEEEEE0000EEEEEEE0000EE000EEEEEEEEEEE000EEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEE000EEEEEEEE0000EEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000000000000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFF00000000000000FF0000000000F000000FFFF00000FF000000000000000FF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFF000000FFF00000FF000000000000000FFF00000FFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEE00000000EEE000000000EEE0000EEEEEE000000000EEE000000E0000000000EE00000000E0000EE00000EEEEE000000000EE0000EEE00000000EEE0000000EEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF000000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFF000000FFFFFF00FF000000FFFFF000000FFFF00000FF000000FFF000000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFF000000FFF00000FF000000FFF000000FFF00000FFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEE0000000000EE0000000000EE0000EEEEEE0000000000E000000000000000000E000000000E0000EE00000EEEEE0000000000E0000EE000000000EEE0000000EEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000FFFFFFFFFFF000000FFFFF000000FFFF00000FF00000FFFFF00000F000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFF000000FFF00000FF000000FFFF00000FFF00000FFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEE0000000000EE0000000000EE0000EEEEEE0000E00000E00000E000000E00000E00000E000E0000E00000EEEEEE0000E00000E0000E00000E00000EE0000E00EEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF00000FFFFFFFFFFFF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFF000000FFF00000FFF000000FFF00000FFF00000FFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEE0000EEE00000E0000EE00000E0000EEEEEE00EE000000E0000EEE0000EEE000000000EEEE0E000000000EEEEEEE00EE000000E0000E0000EEE0000EE0000EEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000000000000FF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFF000000FFF00000FFF00000000000000FFF00000FFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEE0000EEEE0000E0000EEE0000EEEEEEEEEEEEE00000000E0000EEE000000E00000000EEEEEEE000000000EEEEEEEEE00000000E0000E0000EEE0000EE0000EEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000000000000FF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFF000000FFF00000FFFF0000000000000FFF00000FFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEE0000EEEE0000E0000EEE0000EEEEEEEEEEEE000000000E0000EEEE00000000000000EEEEEEE00000000EEEEEEEEE000000000E0000E0000EEE0000EE0000EEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000000000000FF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFF000000FFF00000FFFFF000000000000FFF00000FFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEE0000EEE00000E0000EE00000EEEEEEEEEEE00000000EEE0000EEEEE00000000000000EEEEEE00000000EEEEEEEE00000000EEE0000E0000EEE0000EE0000EEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000FFFF000000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000FFFF00000FF000000FFFFF000000FFF000000FF000000FFFF00000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFF000000FFF00000FFFFFFFFFF0000000FFF00000FFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEE00000EE0000EE0000EE0000EEEEEEEEEEEE00000EEE00E0000EEEE0EEEE00000E0000EEE00E000000000EEEEEEE00000EEE00E0000E00000EE0000EE0000EEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF000000FF000000FFFFFFFFFFFF0000000F00000000F000000FFF00000FFFF00000FF000000FFFFF0000000F0000000FF000000FFF000000FF0000000FF000000FFFFFFFFFFFFFFFFFFFFFFFF000000F00000000F000000FFFF00FFFFF000000FFF00000FFF0000000F000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEE0000000000EE0000000000EEEEEEEEEEEE000000000000000000E0000000000E000000000E0000E00000EEEEEE0000000000E0000E00000000000000000000EEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000000000000FF0000000000FFFFFFFFF00000000000000000000000FFF00000000000000F00000000000F000000000000000FFF00000000000000FF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFF0000000000000FFF00000FFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEE000000000EEE0000000000EEEEEEEEEEEEE00000000000000000E000000000EEE00000000E0000E000000EEEEEE000000000E0000EE000000000E000000000EEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000000000000FF0000000000FFFFFFFFF00000000000000000000000FFFF000000000000FF00000000000F00000000000000FFFF0000000000000FFFF00000000000000FFFFFFFFFFF0000FF000FFFF0000000000000000000000FFFF000000000000FFFF00000FFF00000000000000FFFF000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEE000000EEEE000000000EEEEEEEEEEEEEEE0000000E00000000E00000000EEEEE0000000E0000EE00000EEEEEEE0000000EE0000EEE0000000EE000000000EEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFF00000000000FFF0000000000FFFFFFFFF0000000000000F00000000FFFFFF0000000000FFF00000000000F00000000000000FFFFF00000000000FFFFFF0000000000000FFFFFFFFFFF0000F0000FFFF000000000000000000000FFFFF000000000000FFFF00000FFF0000000000000FFFFF0000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEE0000EEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFF0000000FFFFF0000000000FFFFFFFFF000000F00000FFFF00000FFFFFFFF00000000FFFF00000000000F000000F000000FFFFFFFF0000000FFFFFFFFF000000000000FFFFFFFFFFF0000F0000FFFF00000F000000FFF00000FFFFFF0000000000FFFFFF00000FFF00000F000000FFFFFF0000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEE0000EEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEE0000EEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000F00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFF00000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEEEEEEEEEEE0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFF00000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000000FFFFF00000FFFFFFFFFFFF0000000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFF0000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000000000FF000000FFFF00000FFFFFF000000FFFFFFFF0000000000FFFFFFF00000000000F00000000000000FFFF000000000F00000FFFFF0000000000FFFFF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000F000000000000FFFFF000000000F0000000000000FFF00000FFFF00000FFFFF00000000000FFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000000000FF000000FFFF00000FFFFF00000000FFFFFF000000000000FFFFF000000000000F00000000000000FFF0000000000F00000FFFF000000000000FFFF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000F0000000000000FFF000000000000000000000000FFF00000FFFF00000FFFF000000000000FF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000000000FF000000FFFF00000FFFFF00000000FFFFF00000000000000FFF0000000000000000000000000000FFF0000000000F00000FFF00000000000000FFF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000F00000000000000FF000000000000000000000000FFF00000FFFF00000FFF0000000000000F00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000000000FF000000FFFF00000FFFFF00000000FFFFF000000FF0000000F0000000FFF0000000000FF0000000FFF000000FF00F00000FF0000000FF000000FFF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000F0000FFFF000000FF000000FF0000000FFF000000FFF00000FFFF00000FFF0000000FFF000F0000000FFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF00000FFFFF000000FFFF00000FFFF0000000000FFF000000FFFF000000F000000FFFFFF0000000FFFF000000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000F00FFFFFF000000FF00000FFFFF00000FFFF00000FFF00000FFFF00000FF000000FFFFFF00F00000FFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF00000FFFFF000000FFFF00000FFFF0000000000FFF000000FFFF000000F000000FFFFFFFF000000FFF000000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000FFFFF0000000000FF00000FFFFF00000FFFF00000FFF00000FFFF00000FF000000FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF00000FFFFF000000FFFF00000FFFF0000000000FFF000000FFFFF00000F00000FFFFFFFFF000000000000000FFF00000FFFFFF00000FF00000FFFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000FFF000000000000FF00000FFFFF00000000F00000FFF00000FFFF00000FF000000FFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF00000FFFFF000000FFFF00000FFF000000000000FF000000FFFFF00000F00000FFFFFFFFFF00000000000000FFF00000FFFFFF00000FF00000FFFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000FF000000000000FFF00000FFFFF00000000000000FFF00000FFFF00000FF000000FFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF00000FFFFF000000FFFF00000FFF00000FF00000FF000000FFFFF00000F000000FFFFFFFFFF0000000000000FFF00000FFFFFF00000FF00000FFFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000FF00000000000FFFF00000FFFFFF0000000000000FFF00000FFFF00000FF000000FFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF00000FFFFF000000FFF000000FFF00000FF00000FF000000FFFF000000F000000FFFFFFFFFFFF00000000000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000F000000000FFFFFFF00000FFFFFFFFF0000000000FFF00000FFFF00000FF000000FFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999900099999999900009999000999999999999999999999999999999000999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF00000FFFFF000000FFF000000FF000000FF000000F000000FFFF000000F000000FFFFF000FFFFFFFFF000000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFF000000FFFFFFFFFFF00000FFF000000FFF000000F000000FFFFF00FFF00000FFFFFFFFFFFFFF00000FFF000000FFF00000FF0000000FFFFF00F00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009990000000099990000000000000000009900009999999990000099990000000000900009999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF00000FFFFF000000000000000FF000000FF000000FF0000000F000000FFF0000000F00000F0000FF00000000F000000000000F00000FFF000000F0000000FFF00000000000000FFFFFFFFFFF00000FFF000000000000000F0000000FF0000F000000000000F0000FF0000000FFF00000000000000FFF0000000FF0000F000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009900000000099900000000000000000009900009999999990000099900000000000900009999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF00000FFFFF000000000000000FF00000FFFF00000FF00000000000000FFF0000000000000F0000000000000FF000000000000F00000FFF00000000000000FFF00000000000000FFFFFFFFFFF00000FFF00000000000000FFF000000000000F000000000000F0000000000000FFF00000000000000FFF0000000000000FF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009000009000009000009900000009000009900009999999900000009900000900000900009999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF00000FFFFF00000000000000FF000000FFFF000000FF000000000000FFFFF000000000000F0000000000000FF000000000000F00000FFFF000000000000FFFF0000000000000FFFFFFFFFFFF00000FFF00000000000000FFF000000000000F000000000000F000000000000FFFF00000000000000FFFF000000000000FF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009000099900009000099990000009900009900009999999900000009900009990000900009999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF00000FFFFF0000000000000FFF000000FFFF000000FFF0000000000FFFFFFF0000000000FF000000000000FFF000000000000F00000FFFFF0000000000FFFFF0000000000000FFFFFFFFFFFF00000FFF00000F0000000FFFFFF0000000000F000000000000F00000000000FFFFF00000F0000000FFFFFFF0000000000FFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009000099900009000099999900000000009900009999999900000009900000090000900009999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF00000FFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFFF00000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFF0000FFFFFF00000FFFFFFFFF00000FFFFFFFFFFFFFFFF000FFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009000099900009000099999900000000009900009999999000090000990000000000900009999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009000099900009000099999990000000009900009999999000090000999000000000900009999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009000009900009000009990000999900009900009999999000090000990999900000900000000999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009000000000009000000000000000000009900009999990000090000090000000000900000000999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009900000000099900000000000000000009900009999990000999000090000000009900000000999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009990000000999990000000900000000999900009999990000999000090000000099900009000999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009999999999999999999999999999999999900009999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009999999999999999999999999999999999900009999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009999999999999999999999999999999999900009999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999900009999999999999999999999999999999999900009999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF000000000FFFFF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFFFFF0000000000FFFFF00000000F000000FFFF00000FFFFF000000000FFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFF00000000FFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFF00000000000FFFF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFFF0000000000000FFF000000000F000000FFFF00000FFFF00000000000FFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF000000000000FFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000000000000FFF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFFF0000000000000FFF000000000F000000FFFF00000FFF0000000000000FFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF00000000000000FFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000000000000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFF00000000000000FF0000000000F000000FFFF00000FF000000000000000FF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF00000000000000FF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF000000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFF000000FFFFFF00FF000000FFFFF000000FFFF00000FF000000FFF000000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000FFF000000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000FFFFFFFFFFF000000FFFFF000000FFFF00000FF00000FFFFF00000F000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000FFFF000000F00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF00000FFFFFFFFFFFF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFF000000F00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000000000000FF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFF000000F00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000000000000FF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFF000000F00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000000000000FF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000FFFF000000F00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000FFFF000000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000FFFF00000FF000000FFFFF000000FFF000000FF000000FFFF00000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000FFFF000000F000000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF000000FF000000FFFFFFFFFFFF0000000F00000000F000000FFF00000FFFF00000FF000000FFFFF0000000F0000000FF000000FFF000000FF0000000FF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF0000000FF000000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF00000000000000FF0000000000FFFFFFFFF00000000000000000000000FFF00000000000000F00000000000F000000000000000FFF00000000000000FF000000000000000FFFFFFFFFFFFFFFFFFFFFF00000000000F00000000000000FFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000000000000FF0000000000FFFFFFFFF00000000000000000000000FFFF000000000000FF00000000000F00000000000000FFFF0000000000000FFFF00000000000000FFFFFFFFFFF0000FF000FF00000000000F0000000000000FFFF0000000000000FFFF0000FF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFF00000000000FFF0000000000FFFFFFFFF0000000000000F00000000FFFFFF0000000000FFF00000000000F00000000000000FFFFF00000000000FFFFFF0000000000000FFFFFFFFFFF0000F0000FF00000000000FF00000000000FFFFFF00000000000FFFFF0000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFF0000000FFFFF0000000000FFFFFFFFF000000F00000FFFF00000FFFFFFFF00000000FFFF00000000000F000000F000000FFFFFFFF0000000FFFFFFFFF000000000000FFFFFFFFFFF0000F0000FF00000000000FFFF00000000FFFFFFFFF0000000FFFFFFF0000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000F0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000F00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000F00000FFF000000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000F00000FFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00000F00000FFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00000F00000FFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFF0000000FFFFF00000FFFFFFFFFFFFF0000000FFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFF0000000FFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000FFFF00000FFFFFF000000FFFFFFFF00000000000FFFFFF00000000000FF0000000000000FFFF000000000F00000FFFFF0000000000FFFFF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF00000000000FFFFF000000000F0000000000000FFF00000FFFF000000FFFF00000000000FFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000FFFF00000FFFFFF0000000FFFFFF0000000000000FFFF000000000000F00000000000000FFF0000000000F00000FFFF000000000000FFFF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF000000000000FFF000000000000000000000000FFF00000FFFF000000FFF000000000000FF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000FFFF00000FFFFF00000000FFFFF00000000000000FFF0000000000000F00000000000000FFF0000000000F00000FFF00000000000000FFF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF0000000000000FF000000000000000000000000FFF00000FFFF000000FF0000000000000FF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000FFFF00000FFFFF00000000FFFFF000000FF0000000FF0000000FFF000000000FFF000000FFF000000FF00F00000FFF000000FF0000000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF000FFFF000000FF000000FF00000000FF000000FFF00000FFFF000000FF0000000FFF000F0000000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000FFFF00000FFFFF000000000FFFF00000FFFF000000F000000FFFFFF00000000FFFF00000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF0FFFFFF000000FF00000FFFFF00000FFFF00000FFF00000FFFF000000FF000000FFFFF00F000000FFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000FFFF00000FFFF0000000000FFF000000FFFFF00000F000000FFFFFFFF000000FFFF00000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FFFFF0000000000FF00000FFFFF000000FFF00000FFF00000FFFF000000F000000FFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000FFFF00000FFFF00000000000FF000000FFFFF00000F000000FFFFFFFFF00000000F00000FFF00000FFFFFF00000FF000000FFFFF00000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FFF000000000000FF00000FFFFF00000000000000FFF00000FFFF000000F000000FFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000FFFF00000FFFF00000F00000FF000000FFFFF00000F000000FFFFFFFFF00000000000000FFF00000FFFFFF00000FF000000FFFFF00000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF000000000000FFF00000FFFFFF0000000000000FFF00000FFFF000000F000000FFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000FFFF00000FFF000000F00000FF000000FFFFF00000F000000FFFFFFFFFF0000000000000FFF00000FFFFFF00000FF000000FFFFF00000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF00000000000FFFF00000FFFFFFF000000000000FFF00000FFFF000000F000000FFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000FFFF00000FFF00000FF000000FF00000FFFFF00000F000000FFFFFFFFFFFFF0000000000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFF000000FF00000000FFFFFFF00000FFFFFFFFF0000000000FFF00000FFFF000000FF00000FFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000FFF000000FF000000FF000000FF000000FFF000000F0000000FFFFF00FFFFFFFFF000000FFF00000FFFFFF00000FF000000FFFF000000FF000000FFF00000FFFFFFFFFFF00000FFF000000FFF000000FF00000FFFFFF0FFF00000FFFFFFFFFFFFFF00000FFF000000FFF000000FF000000FFFFF00F00000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000000000000FF000000FFF00000FF0000000F0000000FF0000000FF0000FF0000FF0000000F000000000000F00000FFF0000000F000000FFF00000000000000FFFFFFFFFFF00000FFF000000000000000FF000000FF0000F000000000000F0000FF0000000FFF000000000000000FF00000000F0000F000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF00000000000000FF00000FFFF000000FF0000000000000FFF0000000000000FF0000000000000F000000000000F00000FFF00000000000000FFF00000000000000FFFFFFFFFFF00000FFF000000000000000FF000000000000F000000000000F0000000000000FFF00000000000000FFFF000000000000FF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF0000000000000FF000000FFFF000000FF000000000000FFFFF000000000000FF000000000000FF000000000000F00000FFFF000000000000FFFF00000000000000FFFFFFFFFFF00000FFF00000000000000FFFF00000000000F000000000000F0000000000000FFF00000000000000FFFFF00000000000FFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFF0000000000000FF000000FFFFF00000FFFF000000000FFFFFFFF0000000000FF00000000000FFF000000000000F00000FFFFF0000000000FFFFF00000F0000000FFFFFFFFFFFF00000FFF0000000000000FFFFFF0000000000F000000000000F00000000000FFFFF00000F0000000FFFFFFF0000000000FFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF00000FFFFFFFF00000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFF0000FFFFFF00000FFFFFFFFF00000FFFFFFFFFFFFFFFF000FFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000000FFFFF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFFFFF0000000000FFFFF00000000F000000FFFF00000FFFFF000000000FFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFF0000000F00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFF00000000000FFFF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFFF0000000000000FFF000000000F000000FFFF00000FFFF00000000000FFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFF00000000000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000FFF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFFF0000000000000FFF000000000F000000FFFF00000FFF0000000000000FFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000FF00000000000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000000000000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFF00000000000000FF0000000000F000000FFFF00000FF000000000000000FF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000FF00000000000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF000000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFF000000FFFFFF00FF000000FFFFF000000FFFF00000FF000000FFF000000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFF000000FF00000FFFF00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000FFFFFFFFFFF000000FFFFF000000FFFF00000FF00000FFFFF00000F000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000F00000FFFF00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF00000FFFFFFFFFFFF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000F000000FFF00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000000000000FF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000F00000000000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000000000000FF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000FF0000000000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000000000000FF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000FFF000000000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000FFFF000000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000FFFF00000FF000000FFFFF000000FFF000000FF000000FFFF00000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000FFFFFFFF0000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF000000FF000000FFFFFFFFFFFF0000000F00000000F000000FFF00000FFFF00000FF000000FFFFF0000000F0000000FF000000FFF000000FF0000000FF000000FFFFFFFFFFFFFFFFFFFFFFFF000000FF0000000FF00FFFFF000000FFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000000000000FF0000000000FFFFFFFFF00000000000000000000000FFF00000000000000F00000000000F000000000000000FFF00000000000000FF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFF0000000000000FFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000FF0000000000FFFFFFFFF00000000000000000000000FFFF000000000000FF00000000000F00000000000000FFFF0000000000000FFFF00000000000000FFFFFFFFFFF0000FF000FFFF00000000000000FFF0000000000000FFF00000000000F0000FF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFF00000000000FFF0000000000FFFFFFFFF0000000000000F00000000FFFFFF0000000000FFF00000000000F00000000000000FFFFF00000000000FFFFFF0000000000000FFFFFFFFFFF0000F0000FFFF0000000000000FFFF000000000000FFFF00000F00000F0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF0000000FFFFF0000000000FFFFFFFFF000000F00000FFFF00000FFFFFFFF00000000FFFF00000000000F000000F000000FFFFFFFF0000000FFFFFFFFF000000000000FFFFFFFFFFF0000F0000FFFF00000F000000FFFFF0000000000FFFFFF00000FFF000F0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000F0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF0000000F00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000F00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000F00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00000F00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00000F00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000000FFFFF00000FFFFFFFFFFFF0000000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFF0000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000000000FF000000FFFF00000FFFFFF000000FFFFFFFF0000000000FFFFFFF00000000000F00000000000000FFFF000000000F00000FFFFF0000000000FFFFF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000F000000000000FFFFF000000000F0000000000000FFF00000FFFF00000FFFFF00000000000FFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000000000FF000000FFFF00000FFFFF00000000FFFFFF000000000000FFFFF000000000000F00000000000000FFF0000000000F00000FFFF000000000000FFFF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000F0000000000000FFF000000000000000000000000FFF00000FFFF00000FFFF000000000000FF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000000000FF000000FFFF00000FFFFF00000000FFFFF00000000000000FFF0000000000000000000000000000FFF0000000000F00000FFF00000000000000FFF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000F00000000000000FF000000000000000000000000FFF00000FFFF00000FFF0000000000000F00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000000000FF000000FFFF00000FFFFF00000000FFFFF000000FF0000000F0000000FFF0000000000FF0000000FFF000000FF00F00000FF0000000FF000000FFF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000F0000FFFF000000FF000000FF0000000FFF000000FFF00000FFFF00000FFF0000000FFF000F0000000FFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000FFFFF000000FFFF00000FFFF0000000000FFF000000FFFF000000F000000FFFFFF0000000FFFF000000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000F00FFFFFF000000FF00000FFFFF00000FFFF00000FFF00000FFFF00000FF000000FFFFFF00F00000FFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000FFFFF000000FFFF00000FFFF0000000000FFF000000FFFF000000F000000FFFFFFFF000000FFF000000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000FFFFF0000000000FF00000FFFFF00000FFFF00000FFF00000FFFF00000FF000000FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000FFFFF000000FFFF00000FFFF0000000000FFF000000FFFFF00000F00000FFFFFFFFF000000000000000FFF00000FFFFFF00000FF00000FFFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000FFF000000000000FF00000FFFFF00000000F00000FFF00000FFFF00000FF000000FFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000FFFFF000000FFFF00000FFF000000000000FF000000FFFFF00000F00000FFFFFFFFFF00000000000000FFF00000FFFFFF00000FF00000FFFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000FF000000000000FFF00000FFFFF00000000000000FFF00000FFFF00000FF000000FFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000FFFFF000000FFFF00000FFF00000FF00000FF000000FFFFF00000F000000FFFFFFFFFF0000000000000FFF00000FFFFFF00000FF00000FFFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000FF00000000000FFFF00000FFFFFF0000000000000FFF00000FFFF00000FF000000FFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000FFFFF000000FFF000000FFF00000FF00000FF000000FFFF000000F000000FFFFFFFFFFFF00000000000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF00000FFFF000000F000000000FFFFFFF00000FFFFFFFFF0000000000FFF00000FFFF00000FF000000FFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000FFFFF000000FFF000000FF000000FF000000F000000FFFF000000F000000FFFFF000FFFFFFFFF000000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFF000000FFFFFFFFFFF00000FFF000000FFF000000F000000FFFFF00FFF00000FFFFFFFFFFFFFF00000FFF000000FFF00000FF0000000FFFFF00F00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000FFFFF000000000000000FF000000FF000000FF0000000F000000FFF0000000F00000F0000FF00000000F000000000000F00000FFF000000F0000000FFF00000000000000FFFFFFFFFFF00000FFF000000000000000F0000000FF0000F000000000000F0000FF0000000FFF00000000000000FFF0000000FF0000F000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000FFFFF000000000000000FF00000FFFF00000FF00000000000000FFF0000000000000F0000000000000FF000000000000F00000FFF00000000000000FFF00000000000000FFFFFFFFFFF00000FFF00000000000000FFF000000000000F000000000000F0000000000000FFF00000000000000FFF0000000000000FF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000FFFFF00000000000000FF000000FFFF000000FF000000000000FFFFF000000000000F0000000000000FF000000000000F00000FFFF000000000000FFFF0000000000000FFFFFFFFFFFF00000FFF00000000000000FFF000000000000F000000000000F000000000000FFFF00000000000000FFFF000000000000FF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000FFFFF0000000000000FFF000000FFFF000000FFF0000000000FFFFFFF0000000000FF000000000000FFF000000000000F00000FFFFF0000000000FFFFF0000000000000FFFFFFFFFFFF00000FFF00000F0000000FFFFFF0000000000F000000000000F00000000000FFFFF00000F0000000FFFFFFF0000000000FFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF00000FFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFFF00000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFF0000FFFFFF00000FFFFFFFFF00000FFFFFFFFFFFFFFFF000FFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFF000000000FFFFF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFFFFF0000000000FFFFF00000000F000000FFFF00000FFFFF000000000FFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFF00000000FFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFF00000000000FFFF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFFF0000000000000FFF000000000F000000FFFF00000FFFF00000000000FFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF000000000000FFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000FFF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFFF0000000000000FFF000000000F000000FFFF00000FFF0000000000000FFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF00000000000000FFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000000000000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFF00000000000000FF0000000000F000000FFFF00000FF000000000000000FF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF00000000000000FF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF000000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FFF000000FFFFFF00FF000000FFFFF000000FFFF00000FF000000FFF000000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000FFF000000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000FFFFFFFFFFF000000FFFFF000000FFFF00000FF00000FFFFF00000F000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000FFFF000000F00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF00000FFFFFFFFFFFF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFF000000F00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000000000000FF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFF000000F00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000000000000FF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFF000000F00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF000000FFFFF00000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000000000000FF000000FFFFF000000FFFF00000FF00000FFFFF000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000FFFF000000F00000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000FFFF000000FF000000FFFFFFFFFFFF000000FFF00000FFFF00000FF000000FFFF00000FF000000FFFFF000000FFF000000FF000000FFFF00000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF000000FFFF000000F000000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF000000FF000000FFFFFFFFFFFF0000000F00000000F000000FFF00000FFFF00000FF000000FFFFF0000000F0000000FF000000FFF000000FF0000000FF000000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF0000000FF000000FF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF00000000000000FF0000000000FFFFFFFFF00000000000000000000000FFF00000000000000F00000000000F000000000000000FFF00000000000000FF000000000000000FFFFFFFFFFFFFFFFFFFFFF00000000000F00000000000000FFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000FF0000000000FFFFFFFFF00000000000000000000000FFFF000000000000FF00000000000F00000000000000FFFF0000000000000FFFF00000000000000FFFFFFFFFFF0000FF000FF00000000000F0000000000000FFFF0000000000000FFFF0000FF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFF00000000000FFF0000000000FFFFFFFFF0000000000000F00000000FFFFFF0000000000FFF00000000000F00000000000000FFFFF00000000000FFFFFF0000000000000FFFFFFFFFFF0000F0000FF00000000000FF00000000000FFFFFF00000000000FFFFF0000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFF0000000FFFFF0000000000FFFFFFFFF000000F00000FFFF00000FFFFFFFF00000000FFFF00000000000F000000F000000FFFFFFFF0000000FFFFFFFFF000000000000FFFFFFFFFFF0000F0000FF00000000000FFFF00000000FFFFFFFFF0000000FFFFFFF0000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000F0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF0000000F00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000F00000FFF000000FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF0000F00000FFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00000F00000FFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF00000F00000FFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFF0000000FFFFF00000FFFFFFFFFFFFF0000000FFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFF0000000FFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000FFFF00000FFFFFF000000FFFFFFFF00000000000FFFFFF00000000000FF0000000000000FFFF000000000F00000FFFFF0000000000FFFFF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF00000000000FFFFF000000000F0000000000000FFF00000FFFF000000FFFF00000000000FFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000FFFF00000FFFFFF0000000FFFFFF0000000000000FFFF000000000000F00000000000000FFF0000000000F00000FFFF000000000000FFFF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF000000000000FFF000000000000000000000000FFF00000FFFF000000FFF000000000000FF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000FFFF00000FFFFF00000000FFFFF00000000000000FFF0000000000000F00000000000000FFF0000000000F00000FFF00000000000000FFF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF0000000000000FF000000000000000000000000FFF00000FFFF000000FF0000000000000FF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000FFFF00000FFFFF00000000FFFFF000000FF0000000FF0000000FFF000000000FFF000000FFF000000FF00F00000FFF000000FF0000000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF000FFFF000000FF000000FF00000000FF000000FFF00000FFFF000000FF0000000FFF000F0000000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000FFFF00000FFFFF000000000FFFF00000FFFF000000F000000FFFFFF00000000FFFF00000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF0FFFFFF000000FF00000FFFFF00000FFFF00000FFF00000FFFF000000FF000000FFFFF00F000000FFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000FFFF00000FFFF0000000000FFF000000FFFFF00000F000000FFFFFFFF000000FFFF00000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FFFFF0000000000FF00000FFFFF000000FFF00000FFF00000FFFF000000F000000FFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000FFFF00000FFFF00000000000FF000000FFFFF00000F000000FFFFFFFFF00000000F00000FFF00000FFFFFF00000FF000000FFFFF00000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FFF000000000000FF00000FFFFF00000000000000FFF00000FFFF000000F000000FFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000FFFF00000FFFF00000F00000FF000000FFFFF00000F000000FFFFFFFFF00000000000000FFF00000FFFFFF00000FF000000FFFFF00000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF000000000000FFF00000FFFFFF0000000000000FFF00000FFFF000000F000000FFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000FFFF00000FFF000000F00000FF000000FFFFF00000F000000FFFFFFFFFF0000000000000FFF00000FFFFFF00000FF000000FFFFF00000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFFF00000FF00000000000FFFF00000FFFFFFF000000000000FFF00000FFFF000000F000000FFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000FFFF00000FFF00000FF000000FF00000FFFFF00000F000000FFFFFFFFFFFFF0000000000FFF00000FFFFFF00000FF000000FFFF000000FF00000FFFF00000FFFFFFFFFFF00000FFF000000FFF000000FF00000000FFFFFFF00000FFFFFFFFF0000000000FFF00000FFFF000000FF00000FFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000FFF000000FF000000FF000000FF000000FFF000000F0000000FFFFF00FFFFFFFFF000000FFF00000FFFFFF00000FF000000FFFF000000FF000000FFF00000FFFFFFFFFFF00000FFF000000FFF000000FF00000FFFFFF0FFF00000FFFFFFFFFFFFFF00000FFF000000FFF000000FF000000FFFFF00F00000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000000000000FF000000FFF00000FF0000000F0000000FF0000000FF0000FF0000FF0000000F000000000000F00000FFF0000000F000000FFF00000000000000FFFFFFFFFFF00000FFF000000000000000FF000000FF0000F000000000000F0000FF0000000FFF000000000000000FF00000000F0000F000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF00000000000000FF00000FFFF000000FF0000000000000FFF0000000000000FF0000000000000F000000000000F00000FFF00000000000000FFF00000000000000FFFFFFFFFFF00000FFF000000000000000FF000000000000F000000000000F0000000000000FFF00000000000000FFFF000000000000FF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF0000000000000FF000000FFFF000000FF000000000000FFFFF000000000000FF000000000000FF000000000000F00000FFFF000000000000FFFF00000000000000FFFFFFFFFFF00000FFF00000000000000FFFF00000000000F000000000000F0000000000000FFF00000000000000FFFFF00000000000FFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFF0000000000000FF000000FFFFF00000FFFF000000000FFFFFFFF0000000000FF00000000000FFF000000000000F00000FFFFF0000000000FFFFF00000F0000000FFFFFFFFFFFF00000FFF0000000000000FFFFFF0000000000F000000000000F00000000000FFFFF00000F0000000FFFFFFF0000000000FFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFF00000FFFFFFFF00000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFF0000FFFFFF00000FFFFFFFFF00000FFFFFFFFFFFFFFFF000FFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000FFFFFFFFFF00000FFFFFFFFF000000000000FFFF000000000000FFFFFFFFFF00000FFFF00000FFF000000FFFFF000000000000FF00000FFF000000FFF00000FFFFF00000000000FFFF00000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000FFFFFFFFFF00000FFFFFFFF0000000000000FFF0000000000000FFFFFFFFFF00000FFFF00000FFF000000FFF00000000000000FF00000FFF000000FFF00000FFFF0000000000000FFF00000FFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000FFFFFFFFFF00000FFFFFFF00000000000000FF00000000000000FFFFFFFFFF00000FFFF00000FFF000000FFF00000000000000FF00000FFF000000FFF00000FFF00000000000000FFF00000FFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000FFFFFFFFFF00000FFFFFF0000000FFFF0000F0000000FFFF0000FFFFFFFFFF00000FFFF00000FFF000000FF0000000FFFF0000FF00000FFF000000FFF00000FFF000000FF0000000FF00000FFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000FFFFFFFFFF00000FFFFFF000000FFFFFFF00F000000FFFFFFF00FFFFFFFFFF00000FFFF00000FFF000000FF000000FFFFFFF00FF00000FFF000000FFF00000FFF00000FFFF000000FF00000FFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000FFFFFFFFFF00000FFFFFF00000FFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFF00000FFFF00000FFF000000FF00000FFFFFFFFFFFF00000FFF000000FFF00000FF000000FFFFF00000FF00000FFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000FFFFFFFFFF00000FFFFFF000000000000000F000000000000000FFFFFFFFFF00000FFFF00000FFF000000FF000000000000000FF00000FFF000000FFF00000FF000000FFFFF00000FF00000FFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000FFFFFFFFFF00000FFFFFF000000000000000F000000000000000FFFFFFFFFF00000FFFF00000FFF000000FF000000000000000FF00000FFF000000FFF00000FF000000FFFFF00000FF00000FFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000FF00000FFFFFF000000000000000F000000000000000FFFFFFFFFF00000FFFF00000FFF000000FF000000000000000FF00000FFF000000FFF00000FF000000FFFFF00000FF00000FFFFFFF000000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000FF00000FFFFFF000000000000000F000000000000000FFFFFFFFFF00000FFFF00000FFF000000FF000000000000000FF00000FFF000000FFF00000FFF00000FFFFF00000FF00000FFFFFFF000000F000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000FF0000000FF00000000FFFF00000F000000FFFF00000FFFFFFFFFF000000FF000000FFF000000FF00000FFFF000000FF00000FFF000000FFF00000FFF000000FFF000000FF0000000FF00F00000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000FF00000000000F00000FFF000000FF00000FFF000000FFFFFFFFFF00000000000000000000000FF000000FFF00000FFF0000000000000000000000FFF0000000F0000000FF00000000000000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF0000000000000FF00000000000F0000000000000FFF0000000000000FFFFFFFFFFF0000000000000000000000FFFF0000000000000FFF0000000000000000000000FFFF0000000000000FFF00000000000000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000FFFFFFFFFF00000000000FF000000000000FFFF000000000000FFFFFFFFFFF0000000000000000000000FFFFF00000000000FFFF0000000000000000000000FFFF000000000000FFFF0000000000000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000FFFFFFFFFF00000FF0000FFF0000000000FFFFFF0000000000FFFFFFFFFFFF00000F000000FF0000000FFFFFFF000000000FFFFF000000000000FF0000000FFFFFFF000000000FFFFF00000FF000000000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF000FFFFF000FFFFFFFFFFFF0000FFFFFFFFFFFFFF000FFFFFF000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFF0000000FFFFFFFF00000FFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFF00000000FFFFF00000FFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF0000000FFFFFFF000000000000000FFFFF00000000000F0000000FFFFF0000000FFFFFFF000000000000FFFFFFFF000000000F0000000FFFFFFFFFFFFF000000000000000FFF000000FFFFFF000000FFFFFFFF00000000FFFFFFFFFFF000000000000FFFFFFFFFF0000000000000FFF000000000F0000000FFFFFF0000000000FF0000000FFFFFF000000000000FFFFFFF0000000FFFFF0000000FFFFFFFFFFFFFF000000000000000FFFFFFFFF00000000000FF000000000F0000000FFFFFFF0000000000000FF0000000FFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF0000000FFFFFF0000000000000000FFFF000000000000F0000000FFFFF0000000FFFFFF00000000000000FFFFFF000000000000000000FFFFFFFFFFFFF000000000000000FFF000000FFFFFF000000FFFFFFFF000000000FFFFFFFFF00000000000000FFFFFFFF00000000000000FF000000000000000000FFFFF00000000000FF0000000FFFFF00000000000000FFFFFF0000000FFFFF0000000FFFFFFFFFFFFF000000000000000000FFFFFF000000000000F000000000000000000FFFFF000000000000000FF0000000FFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF0000000FFFFF00000000000000000FFFF000000000000F0000000FFFFF0000000FFFFF0000000000000000FFFFF000000000000000000FFFFFFFFFFFFF000000000000000FFF000000FFFFFF000000FFFFFFFF000000000FFFFFFFF0000000000000000FFFFFF000000000000000FF000000000000000000FFFF000000000000FF0000000FFFF0000000000000000FFFFF0000000FFFFF0000000FFFFFFFFFFFFF0000000000000000000FFFFF000000000000F000000000000000000FFFF0000000000000000FF0000000FFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF0000000FFFF000000000000000000FFFF000000000000F0000000FFFFF0000000FFFF000000000000000000FFF0000000000000000000FFFFFFFFFFFFF000000000000000FFF000000FFFFFF000000FFFFFFF0000000000FFFFFFF000000000000000000FFFF0000000000000000F0000000000000000000FFFF000000000000FF0000000FFF000000000000000000FFFF0000000FFFFF0000000FFFFFFFFFFFFF00000000000000000000FFFF0000000000000000000000000000000FFFF0000000000000000FF0000000FFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF0000000FFFF000000000FFFF00000FFF00000000FFF00F0000000FFFFF0000000FFF000000000FF00000000FFF0000000000000000000FFFFFFFFFFFFF000000000000000FFF000000FFFFFF000000FFFFFFF00000000000FFFFFF00000000FF000000000FFF00000000FFFF0000F00000000FF000000000FFFF00000000FFF0FF0000000FFF00000000FF000000000FFF0000000FFFFF0000000FFFFFFFFFFFFF00000000000000000000FFF00000000FFF0000000000FF000000000FFF000000000FFFF0000FF0000000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF0000000FFF00000000FFFFFFFF000FFF0000000FFFFFFF0000000FFFFF0000000FFF00000000FFFF0000000FF00000000FFFFF0000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000FFFFFF000000FFFFFFF00000000000FFFFFF0000000FFFF00000000FF00000000FFFFFFF00F0000000FFFFF0000000FFFF0000000FFFFFFF0000000FFF0000000FFFF00000000FFF0000000FFFFF0000000FFFFFFFFFFFFF00000FFFFFFF00000000FFF0000000FFFFFF0000000FFFFF0000000FFF00000000FFFFFF000FF0000000F00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFF00000FFFF0000000FFF0000000FFFFFFFFFFFFFFF0000000FFFFFFF0000000FFFFF0000000FFF0000000FFFFF00000000F00000000FFFFF0000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000FFFFFF000000FFFFFF000000000000FFFFF00000000FFFFF0000000FF0000000FFFFFFFFFFF0000000FFFFF0000000FFFF0000000FFFFFFF0000000FF00000000FFFFF0000000FFF0000000FFFFF0000000FFFFFFFFFFFFF000FFFFFFFFFF00000000FF0000000FFFFFF0000000FFFFF0000000FF00000000FFFFFFFFFFFF0000000F00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFF0000000FFF0000000FFF0000000FFFFFFFFFFFFFFF0000000FFFFFFF0000000FFFFF0000000FFF0000000FFFFFF0000000F0000000FFFFFF0000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000FFFFFF000000FFFFFF0000000000000FFFF0000000FFFFFF0000000FF0000000FFFFFFFFFFF0000000FFFFF0000000FFFF0000000FFFFFFF0000000FF0000000FFFFFF0000000FFF0000000FFFFF0000000FFFFFFFFFFFFF0FFFFFFFFFFFF00000000FF0000000FFFFFF0000000FFFFF0000000FF0000000FFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFF0000000FFF0000000FFF0000000000000000000FFF0000000FFFFFFF0000000FFFFF0000000FFF0000000FFFFFF0000000F0000000FFFFFF0000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000FFFFFF000000FFFFFF0000000000000FFFF0000000FFFFFF0000000FF0000000FFFFFFFFFFFF000000000FF0000000FFFF0000000FFFFFFF0000000FF0000000FFFFFF0000000FFF0000000FFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFF000000000FF0000000FFFFFFF000000000FF0000000FF0000000FFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FF00000000FFF0000000FFF0000000000000000000FFF0000000FFFFFFF0000000FFFFF0000000FFF0000000FFFFFF0000000F0000000FFFFFF0000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000FFFFFF000000FFFFF0000000F0000000FFF0000000FFFFFF0000000FF0000000FFFFFFFFFFFF000000000000000000FFFF0000000FFFFFFF0000000FF0000000FFFFFF0000000FFF0000000FFFFF0000000FFFFFFFFFFFFFFFFFFFFF0000000000000FF0000000FFFFFFF000000000000000000FF0000000FFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FF000000000FF0000000FFF0000000000000000000FFF0000000FFFFFFF0000000FFFFF0000000FFF0000000FFFFFF0000000F0000000FFFFFF0000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000FFFFFF000000FFFFF0000000F0000000FFF0000000FFFFFF0000000FF0000000FFFFFFFFFFFFF00000000000000000FFFF0000000FFFFFFF0000000FF0000000FFFFFF0000000FFF0000000FFFFF0000000FFFFFFFFFFFFFFFFFF000000000000000FFF0000000FFFFFFFF00000000000000000FF0000000FFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000F0000000000FF0000000FFF0000000000000000000FFF0000000FFFFFFF0000000FFFFF0000000FFF0000000FFFFFF0000000F0000000FFFFFF0000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000FFFFFF000000FFFF00000000F0000000FFF0000000FFFFFF0000000FF0000000FFFFFFFFFFFFFF0000000000000000FFFF0000000FFFFFFF0000000FF0000000FFFFFF0000000FFF0000000FFFFF0000000FFFFFFFFFFFFFFFF00000000000000000FFF0000000FFFFFFFFF0000000000000000FF0000000FFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000F00000000000F0000000FFF0000000FFFFFF000000FFF0000000FFFFFFF0000000FFFFF0000000FFF0000000FFFFF00000000F00000000FFFFF0000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000FFFFF0000000FFFF0000000FFF0000000FF00000000FFFFF0000000FF0000000FFFFFFFFFFFFFFFFF0000000000000FFFF0000000FFFFFFF0000000FF00000000FFFFF0000000FFF0000000FFFFF0000000FFFFFFFFFFFFFFF00000000000000000FFFF0000000FFFFFFFFFFFF0000000000000FF00000000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000F00000000000F0000000FFF0000000FFFFF0000000FFF0000000FFFFFFF00000000FFFF0000000FFF0000000FFFFF0000000FFF0000000FFFFF0000000FFFFFFFFFFFFFFFFF0000000FFFFFFF0000000FFFF0000000FFFF0000000FFF0000000FFF0000000FFFFF0000000FF00000000FFFFFFF00FFFFFFFFFFFFF0000000FFFF0000000FFFFFFF0000000FFF0000000FFFFF0000000FFF0000000FFFF00000000FFFFFFFFFFFFFF00000000000000000FFFFF0000000FFFFFFFFFFFFFFFFFF0000000FFF0000000FFFFFFF000FF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000F0000000000000FFFF0000000FFFF0000000FFF0000000FFFFFFF0000000000000000000FFF00000000FFF00000000FFF00000000FFFF0000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000000000000000FFF00000000FFF0000000FFF00000000FFF00000000FF000000000FFFF0000FFF000FFFFFF00000000FFFF0000000FFFFFFF0000000FFF00000000FFF00000000FFF0000000000000000000FFFFFFFFFFFFF00000000000000000FFFFFF0000000FFFFFFFF000FFFFFF00000000FFF00000000FFFFF0000FF0000000F00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000F0000000000000FFFF00000000F000000000F000000000000000F0000000000000000000FFFF000000000000000000FFF0000000000000000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000000000000000FFF0000000FFFFF0000000FF000000000000000000FFFF0000000000000000FFF0000000000000000FFF00000000000000FF0000000FFF000000000000000000FFFF000000000000000000FFFFFFFFFFFFFF000000000000000FFFFFF000000000000000FF0000000000000000FFFF00000000000000000FF0000000F000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FF000000000000FFFFF0000000000000000FF000000000000000F0000000000000000000FFFF00000000000000000FFFFF000000000000000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000000000000000FFF0000000FFFFF0000000FFF00000000000000000FFFFF000000000000000FFF0000000000000000FFF00000000000000FF0000000FFFF00000000000000000FFFF000000000000000000FFFFFFFFFFFFFF00000000000FFFFFFFFFF000000000000000FF0000000000000000FFFFF0000000000000000FF0000000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFF000000000000FFFFFF00000000000000FFF000000000000000F000000000000000000FFFFFF000000000000000FFFFFFF00000000000000000FFFFFFFFFFFFFFFFF0000000FFFFFFF00000000000000000FFF00000000FFFFF0000000FFFF000000000000000FFFFFFF00000000000000FFF000000000000000FFFF00000000000000FF0000000FFFFF000000000000000FFFFF000000000000000000FFFFFFFFFFFFFF00000000FFFFFFFFFFFFF000000000000000FF000000000000000FFFFFFF000000000000000FF0000000FFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFF000000000000FFFFFFF000000000000FFFF000000000000000F0000000F000000000FFFFFFFF0000000000000FFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000F0000000000FFF0000000FFFFFF00000000FFFF0000000000000FFFFFFFFF0000000000000FFF00000000000000FFFFF00000000000000FF0000000FFFFFF0000000000000FFFFFF00000000000000000FFFFFFFFFFFFFFF0000000FFFFFFFFFFF00F000000000000000FF00000000000000FFFFFFFFF00000000000000FF0000000FFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFF00000000000FFFFFFFFF000000000FFFFF000000000000000F0000000FF0000000FFFFFFFFFFF000000000FFFFFFFFFFFF0000000F0000000FFFFFFFFFFFFFFFFF0000000FFFFFFF000000FFF000000FFFFF0000000FFFFFFF0000000FFFFFF000000000FFFFFFFFFFFFF000000000FFFFFF00000000000FFFFFFF00000000000000FF0000000FFFFFFFF000000000FFFFFFFF0000000FF0000000FFFFFFFFFFFFFFFF00000000FFFFFFFF0000F000000000000000FFF00000000000FFFFFFFFFFFFFF000000000FFFF0000000FFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFF000000FFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000FFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000FFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000FFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +%%Trailer diff --git a/docs/verifier/justicecfg.bmp b/docs/verifier/justicecfg.bmp new file mode 100755 index 0000000000000000000000000000000000000000..71510d2029ade27b3f659e08f86c16dbd1568059 GIT binary patch literal 377830 zcmZ?reRi0Y0R+kz7#K7d7#PklGcd3*GcYhRuz-Xa3ZU{JjsOD#0|?`XgrUM5EvQ09L>+8@jNm@U}X4mG(V5V^T-H+k>ShH{5-Wm-VT)(D*eGL|gaEu!{tue2gm?-`3?eW}4*3v3 zic>ff&KUB(8}$Gz1d!qs&V(~yibm-n9|A~m3TMI@L*93z9)N`aQk=q>a0X1#C_Usu z04Yx4OgLl6`)SO_4+DVzysz!Z(r zLp}tM;uOw=GlsnHMm+!v0i-yEGvN%FqEULthX7KX!kKUe+;@H#C+?igi|8v;mi z3TMI@a6<aHXsEeoC#;Zoq#C3J~ki)BAf|lz@3080+*saV?ZsZz4z#215zNunQ#W&378^qDcUmz z)Na4Fg|2GnxedyhUg zAO#|v31`5afGGl(qCI0kEvLQr=wky?Ai|k&2HXjlB5*0%GX~Uh+Ix>aHXsEeoC#;Z zoq#C3J~ki)BAf|lz@3080+*sa zV?ZsZz4z#215zNunQ#W&378^qDcUmz)NU@08JU^y(r2ZVYU3r1s64HqIt4P5ak1A7P{1tOdYXTY@}L?8=1 z82JDH|NjBRhA2VEL-=4R1_lO*8W00?EdxkB#Dka+42mg`Bsj`I40tqyO@c~;V-+Mj z8qbhmqag_ncZm6LCY%8g2gebN35pg5NVGzjAPG|A8KM)B+ehOW6pA#(NO1~h!WnRz z5hBp6$PX^ILD>~tz(OJ(t{k3GVVRx*tQ-=t;AF%9A5@rsU|;~72UE`vW`ImZE*}t< zBPd{KDwbct#H)y7Hls2C@^*gfl>*V2mOH<$zk<7!7T(YA^wd zU)bOX!FUGM(xB!VxQPehfDIb$KSP3nG7=hTAVc6xI0GaK#wa3C4m9Gx@*j}n1uOz@ ze}Nj*AQ4E;hr~M61c(|)f&ir&kTS3Wh!BVi!Z6h!_9!MZ1dsv|&V)1IW}=8dImq!0 ziA1<^P_~2$fub4IdjfTqz}+Tr3mc>t%7a8ONB}e}2I_8s`drBA25KLY>7z`NLjWld z;Y>IKZW@XRlmm_$P%j7^tH==p?nOc48KR1T0Tj<*HaL30EO4BH(g8vU(w&AxJ$B2% zt#pufxb!H4m=J(Q8b~Re31@&r!5BpZ$^iv7B$`2^8wBGS6ssUD;8X!(fNv!RM?aQ$ z2HOfHp!UHG0PBT`L6wYBghBu*z~D?c1FjiG1j<3KM4>`(_24)GM?ENSf?@`m$3fE= zpezg)0?C0mkaz~OKmkt$9EM`}I0-bKNz;sJ+{hF`3N<(r&VUCALIfPS zP;qd;4?sLaTlr8|j8epe03rtA`3Av&8-Sz=)RcyagCd%oc!udGj)qwdswY4;f@tD& zj;ex(04xxREw{nr6iB*pMKfFpv4;8=fY>0+EDxrguQVoCvKl zz|lO~93wFnV1YOU;u%z9fU0J2e4}@=N%Z!JQ$Cd9863gjiUX3T=}>13oAfZ0;u)5q zK|^Gam>xFKKy!}_sdxrQG&o4WS$nkM4Gs&Uh@lnFpy-8`){qR1@Q4M) zG6>V&2}9ooq(Fo-;S9La9x-pa4Fg|P%Q_=EK>dj$NT7@3Bg!E3Pd;) z&VcL26oE_8o`GsPIAW141x5U5mPQT{Y;2@Jgfrm`xCTrSxD@RfXqJQG6)8g_tt+Ix zQ--b$NP!4v!WnRHVT!<|XwN{m92C(gwt}HXa^9(-2rBR zq7}?Q5HPnPL`GStA%GO8a3-7qR|*Tq0ixmVfH1H$yFhUdavVy54pBWyfA z1Ec_qK|wfx80-cF0b2l!5CPAsLL7)9ILd*A08*U7nQ#V75qSOp5{v^v!rcL7U^;Mg zwh|gNxG1C`gEQd_T$%={I4lhgQs)h*vykEx&V(}t)MaE?K3YrT3^b%Tg)`v{oVo_B z#Auer5j9A03TMI@IP?r=VOW+P%x)YAw;{zToC#+Pgo7xy6Pl$*dsrwTi4>=BCY*ty za>#H-vow~dLW)y36VAY*en<$7W@(IQLW)y36VAX;JyZms5k0zV10G>WaSCU`8E{oY zjsYvXM{8+l)FH(woC#+@)lh+=fsq7UHJYVS0thJr;7m9JMI|L13eG+t+uG4AjU04H zaSCU`8ORDLVuLalMFxX+nxqI1|pGmS4eHYXGWBu)U)T5J1t06sK?| zoB>im4GhXuR5z3;he2!}7`usbAiWeJ1p%B1XHdxz&}=mT85-B(FJ#D%OLtGx!K2P<&IxMA8j`MJP-sb$tjk6++X}Y={lykVvkAGvN$!48+g_ zj$V+F;0VW%rjG!u?1mQJAm`A^Vp^I_zMGL;1!uw;k>D6d$k3Ms&C(D{ z!Onp&sZP?;Z1Nq8!E>>*e${@3UdaG#;=+@Sz4M+ zo{K=bkX!|4!Wke1)WI|`k`jl}(mAv=n|wbbxeCsNGsrgQO`1n?P6)Ghwn29%2p~loa@(3PEfT6Z7DAblosh z29`#06`ToYP|s;JFp?6-!JGq%DR4YPqYXTxg|TQ6DhXDM5zk;zexm>gz>v z6`ToYP|rFV7)goaV9tR?668WW5C>!^QSl5?48rgu06;py7-lw@GiV4TSHYQZ2K8J? z10yMM9Lzb;oC+?Qp#=B{3~;_iSOAJp&?F2f+kzLzfUmR#X-2yJ7N#6#HjFj_q=Au?I1b4*^geh1r za%h4D29`i_4vYz^pkZuG$BpJ^%rLt|>%3d|<{5|z-<#3C~wLP*YmGC?tiV1nZt z;WAJ*9*t*2c;IG1gAlg@`pO_V2g>}wzz-e@0l5Pz1Y$xkdOU-ASEJ=NBy3PgjG#l6 zrZ*4CIZ!5~p+(po4E+D$=>eu1Y6O&v%7Y3HIECaYI1|pGp6h5}Bqff6IR}(cK^-bk z8w;(hCc$`^X%H=_Jc!u9lSr?jG7lL z1tMS?Kx{M&N*~BVc$6Y5qca=HRd6PpK|Qz7z(`6Qhj0#P91LXAXgq^LfntmZSc;9J zh5^XVft1_SFco43ve^)k!9XIp3eJQxsOLZ$7)goaXz3hUnoYi+kz565!WrZni>{Lf zMxt9m3ZItFp{3cR_z_htlB?iMI0IEFB|I7!Iar-D$h-;-CL~wEnQ#VF4HYOF7)gn% zXz3hUnoYi+kz565!WrZni>{LfMxt9m3ZItFp{3cR_z_htlB?iMI0IEFB|I7!Iar-D z$h-;-CL~wEnQ#VF4HYOF7)gn%Xz3hUnoYi+kz565!WrZni>{LfMxt9m3ZItFp{3cR z_z_htlB?iMI0IEFB|I7!Iar-D$h-;-CL~wEnQ#VF4HYOF7)gn%Kx5Lh!<4v;R(g>l z0M3LnsAnk+jHJYIw2Nbq$&|Q^R(g>l0M3LnsAnk+jHJYIpxB@tro?5m(u))Ua3-8V zJxgg|BqffcT^xfpm#|3#r2;7e;7mA!dXA!j zk<@b>VUu7xuL!FgtSXQq0M3LnsOM-J7)d?H5i|+3cns%KP=dM#g#x4qfHUC?>bZ~x zMpDml1Wf{UmZ-gqjG(2|Re%%$a3-8VJ*#M7B=sCe$Rtp9#(i`NA>D&R9w`FgOgMvj zPNad6)N>pmlfc<|Nc#X~S2o-ya0a0OAYPsZMiOs1g(^RQ_B-0fdHh4UH55a3-8Vz3`)fk<@b>ev?2uHbDL7p`D?TA^^^WGw=rh zDY7&$k`(JHQ45M+P&|X;n-X&dRxeTnz?pCc^_)fnBdO;&ye5I87ZlHUP8Y*#z~GQX ziU2qh&Y+$XX<#Jv9EaB=P#FeFbo`l6ajE1oIyQj(ZERRIgYSNqxqR| z7=cxc#xpn=297|A05}uQpq{g6U?lY%N7$s%{7g8Ez$!-L85|4)M<7K2oC#-8&sj7u zl6sCKY|?0cCLBg!6{GPC4u*jvkRkxigfpn;EE*U|J;xC?X*53*4kNIN(Rc<2!@v

        N$%BMpDmlgiRXF&xFGW ztYS2t!ND+a1X2XRnQ#X6oJ9j8spmMtCXME2!eInfF&fX{U>G<8DFWb3ID>l5qJfdr za~xrlM)Nb_FaoO>jc0H$3><+J0dOXqK|N;?Yb12*!ze|C5I~7NqzHgB;S3a&6mf_( zk_z4%H3Av}C=rGf0dOXqfufQk4zWf;oj6KSAp}q&3@HNOOgIBYB}E)!jiiG2MvZ`m z07`@*MF5-$XP~I0h(oNA#HypnF(X1VT1X;s;Y>J#dI3VLk;JN_p38=-NoXO7#Dz2A z4C;jeu|^WBj(RQ|t|p;{BoY_SgfplY2E-aktUBtsY`B_)7LrI@I1|pGUKkK-B(dtK z=d$5y5?V+iap6ojgL+{=tdYd3qn^u#t4U}fiNu97;SB190kK9BtB!gu8?Gjyg(MOe z&V)0l7Y4){Nvt~Rxoo(agcg!WTsRZXpk5ddYb3GisOK`en*=$fispx%poJt77tVw; zs22vr8cD1=>bZ>WCQ%yCA5fDBt`I{LN8-Yna0d0lfLJ4mRYyIS(cL6U;~6c8(715# zpot@K;Y>IKu8Cp>u|^WBj$#K5oBz{HT1BeNmqqK7X;6hbl}4)cW>3o{g=07}9Hk<3EU z3RQ$80y7LM1E$c$kjw(h!w57VAaUVLI0L4Ka++8pq3WPBYy7arDWvHEm4v$nS^_eF zRq=y(pzwx!9ApUpe~=`^9DdL#mmoo~7=-a3%7)8=7^vOdxULOgICqf+_^DMncuW{SEOeL=+N~NX~&tLZTSN0|g>9P@zEq zj$(c=2SPG{0t#;ae^~f{%>WBy3Lz2!$b6^+z-qyv3Soha1vvr4gBgkz&mbv?S3ruv z=3vA#L=8wDVHj8?l)%scPcu-RFegGRg6aY}2$PAX1g?Mr2C+s$)xq72>{-&{8LAUG zo}oghp$`@0hgu1C0F(`tVgQ=~7J~&MA}zpKpr`?>0jD!K3(kO*0HCA+G8ht=7|{k( z4^Nb685%>wkd9|iK!7tIlmYQ9C@3Mp10ms(AO<)?LJK}nbb!P_7*cM7f)B)k6r`Z+ z4Gu_Xxd%!?;L}>cc7hT=*ffwbkVZ&6gS3MThS&|_fnyZJ0IOyIn+PVrCO~w8NT{ix zD1tD-?gE-;P`~-1=$Ie zMF@ZdAsBonH%K{HAIJu%Vvsag1DF7r3=#oFFGw{wV>4jHB2+CTnW7m6(GDR&QeYO` zG9;s5hJX|xvxh=FqmQF$aHW-LUe-c26I6gpbP|sY!j%305TD36p|v4ccF;}oT?B`fvAOAiCQ{9 zq@cD!IcOS@xNs(%0o6hUidZ8N>fkI;G(lVd$|w*PoP-8FIE2A$5CP^v0t7^Y3;?AA zP(A|354gnyB0xb6(f~0It`45L;GqdJ1{91S4G_g3DR6v%xS(i;^uEC6Gk}yL;tu8$ zm`z~k!8jo8APiFk(h4>gtO}GML9z%8aS7NOsAC`s!731jfQ$hP!3ZQNI1|o*DWaSv z)<}dpWEMDobf?oP@6zZq_m38g{y)yz$&Oh5Njkt9fAeThoJBWM=HWW zps)c6L4y!{SqTHEiv;TogTfV5UV;>WV;7_Y9Q9xZxFUtJKuREi4;BFH1hGKogRBOz z!O;q{9;|`?12{#2B;m0I9=8Ow5};myP+;XC3qWciePozP;1mcFMz{>gFoY@)3n_ZR zE(7ZYNq{iKCJ+mhL?JYkM3RCt;S8u6Dp154iBN}NfkGMN1aPJTG2j>!HXz@^!Vshq z7SHgC4iV1?Ap{F#1Ss?&T45OpED8!MumB>^L6*U6hqS}MBvd)f3{Y#D@_2@O3T7dg zhL_Tq5e{-MSPhs!3O^7Zi3?}K86XAJ!NeMgPzPm!vJlK~P$7hiK;a7tdT5Y9vnMzb zp}7|#3(h|9LK>tWq64Y{9M51~U>iWDLWDr7Kqi1Q4M-TI6^20p4JtvvhC|Z>NDZ_s z0hs;X|3l1x2!e}a5ECYe2rqDM1W94H53UoU1Qa)**Z><2NfjUoxUnD( z6vILvtQ0DSLBSM(EQiG{Hp5_*7{c919!D4gG6uyCBq=x(&OlK~5ra6$=xh5NtEpV0hp_ z9Rza@SQ4Qhi3?}K83<*RvWPVjst)W8u$>@pVPqw+448nb2eWYzAR}8Au92akaz_v1}9)J0n&gF0`Z1M{fr15FpKW-49gT)OLcHCf@^bd(8AS1#L-Bw z`ypa@;~Cs+L!>W=4y+_t5!hxZ3+e!<5R^AG;u+M8fHp@#&WE`j)8AmPVhSUR5XjHS zN-^2^;|5bbh6qwTW5}ThfED8QC_*iom(jRzb!g&9TsRZXfNP?dL9CGob?}K-Jhd~$ z&KimappE{bap68fgd|u9i3?}K8DJGuA&51SSano!)UY-LEhLe+a3-8Vy?`LrNMhAd z&t=2aB(#u3;=-A52KB;#SR;v5M?IGfSCh~}5{V0E!Wq;H17eLNRvq7ka0d0lfLJ4m zRYyIS4Of%ULK2A!XTllO3j<<}Bvu{uTsB-yLJLVGE}RKxP%jLKHIi6$)N|QzH3=;w zk+^UsoI$-XAl69GDCa1qP6(jH9#RCrnQ#V*N{Tqd8c7`=j+z1r0h9g0GtVDP%kuSU?lY%Hxf)jiU2qh&Y)fZ(7;IQIc_AFgcJdACY(XN0HA@9)N>qR zlPF$RLf8r#t3ZkXI1|pGp4~Jsl6sCKY|_wQ(}ENMa3-8VH~@%MK?5U+wVDd*Kx?;% zS-M39t7v5eQUt)6a0c}(rGb&ua~wgFK)n>`vP6Pv2dM(22!J!;4C=X=21ZiPafD0) zWoP&@X+nwzsXS5yz?pCc_1sJYBdO;&LMDN;^N{udXq`0NmvEoJ8E`3z88k4GVmA?M zzz5KVX8s|bp^+j0&V)0F4GF^PXka8^OR1y+ywMf3la)&54Tv#F5ddex8PszT4UD9o z4E$Kf>z9KE1;hVL-Pt9-CZB1Hh431?8x(KIlUdXB?u5-2-EwoQU#9Ix6zEQu5W za3-8VJ$KW4E#}PJZG(Qs# zBe06mcm@ZXMjHI692%9vTp9zN%SjA{OgM(q<2&4#rGvN&CIg18H zQqOUOO&ZP5gu@7|VlxPc1+q&S5$;S4lq zLC@V8a0<;?qg*0F04Yx4OgIBg|A0p@)B$MD8s!oZ0!VQRXTlk1`k}!*;1rs($l=o3 z59GLsrh1U#6wZV*&}^o4;1Fv*nzP8^5^EK?>d0{uP4ytfDVzyspxKN|98DRGxm0ll zx$#G=J{pGs>Bb|48k`Adpc#it98DRGxm0llvGGN&IvR%o>Bb|48k`Adpc#it98DRG zxm0llRSd!DQQDf0(^`BINKS$?;S4m5xWv(v(U?mWS5Uh)Wzz8I8GAaRpTj!Rb-jnvT<2d=f}bf-~U^G>y2#(UiftpvEfouazLx z6>#SuGpJ$+vVkaU+M14H6|o#7C&8I;2AUzb#L<+&xuAGvpn61;>I%4XkQr1l1ld3o zHf>Euv5Hs@l9S*}I0MZPT;gcT;9PJ#Q~mxBQe6Re4l;u(h9Db=!lte1C{_{6L2?qD z31^@gf=e7t8Js)#;~8?p38>70xD}Ep(ftWk#qj?>gat05pcd0{ghFMTU;IRaWK)5Jsw813#|3lUPhs8LQ z&w%Djs5uz64xj*%li*A^1I=AX;z&$1MabL_43LwnLBRqKI+#|>wRPCz8I;?Q4Tb4P z79*JrH3S+@{LqXF5&eJ`Yj8<;JoAI@kAdoiQOHh!n1d`b;A|u(!I^Ldn(N@=V86j5 z4yp=Uynz&g)PZP7nFz@eunYm!3Z>xj3|0=Y4V;&t@(>Cl4q=l`LJfghgorngfjHwC z5xWQ$)CAO|0W}?D*kHj(PJ%Px3^Yf=#KB>Y>a+h~pQEZrD1)#-5f058@C<~a13jKW z8o=QQV!&0xTmcs#hk-Bz&O)S9xDdi*s3h3a;B)msYQPLIfp(_?ND`rUP_U4k1ZTn- zXfA|_L!u3{JcZ_1m@aS>fkOt$0!hG_Fd8HV!&u@OY86Zch=#cW#3maf41u$tQHkA1 zsN@Hb7r~c`g0+DNhzx{;=>>_y*n@;dauS>gXP~(eCJsu%pa?*f28kkzfK-4mB=3UC zYf!cXUj_w^PzHW1%@>Fjh(rJ~6dbMylOakFe6m;wL*Ojbs6sOpE(vxTxSR(UVX&45 zTpp|sZYG#FC=k30#022Eq_H3*G%F#=<1Q(G1DdAb)^;2y!V*9-;|uCWJc}NF*o0nQ#W0 z15w3Md1y+(4J}XrfXZzU2E{vs4^{~Y7f@~mbHM~83?bD4L>?5+(BK5C0274l1uG&% zAPj-CU{+$)3Y7$vPY~aLwSfqT41|Pf1&PDhgM>zM5}XNVpt%uM9F>Qr6duo@0D!0j zv7iwLi*%GS0TPCgP=s~IAPOM*VK$)hV4@__2t(j3i2HDu1C<21ksr(kYXcFGvQr6duo@KmlQB7(p^9j04FFFs<0jZO~8)s6vFPf|&s4lf^(d z9?pVBCCF`%x&vV_$Yr2P2ihxS01udeIbhWwY3e%>VLdfiaBsqkR3rwP1#q>XAVF(G zfvQnd<={vJCv-3i+Qo#L0TF_baBUwzO>l5{B9+^;2}GzfK(2B$A;BH-K2Mt|2(GL7o5! zBB=(s8ihL;IB;(wxeiGT#fflnkjEf}F_Jt+#6whp)InJwD1`*2t(j3n3ezke?WE>$as*;pkiPLflF(!A3!XOaR5Y)0cjo_817Aw zv!PBx5`&6BD7ZM-v#|0GA_vlrCISi_kVY8bY!7{W+OQX&V)1290wN%hd!Dlyh=rgLn97S zN`p1Sq8?l?LZcL}9;zH1_ps0dl?HGH5C+&F2$OsgY6#d$kSSn?L9;A~PdtXX6j=w< zbY!7{W+OQX&V)1290wPNGtd;Ea}luwk5hzJxDZSiIMAV@u+W2YVM;(W!UPbHObj&y zY$eDDLh%e$4^oPXA>|aR*f1)$(L6>x7iWM$8efq31qDAOb78i9sS}7$XMijMmmi?v zceMHe#ZOT6C}LpFFppXsQODi{t?~6V5<$9$Xw04|IxWP=Ot|sY0P@;jV!4 z$)c!Y2u_=6YdTJA@kt;#3C@Hw&@|!_M^i>N7ZK0MV-@HnBUM~M6+>`(l(wehv=*NP zl9S*}I0H>1E^#zvWOI?@8Mh%+aRpTj!RbcYnvT<2d=f}bf-~U^G>y2#(Ug(TW%&Oe zrHICA5>;G56+^H(47M}!? zli*A^15G0?aWrK#=2FEKR51jnM`>$1PHXW=AUO%ngfq}I;u1$wMq@5jTmk7Z(2k^W z7?5r}QmDb1a0Z%jxWv(v(U?mWSI{noAtuu}3`jQ~Db(OhI0MZ%T;gcTXw0RGDK)Ufrp$2Ed8ED4g5=T=;V=h%(LAw}+m`vj^Al-PRP=hn!3^e0#iK8i_F?Vpd zg2tYty75S%24}()?%;3*jXguQ&V)12Y{Mmvri{ki!Ql!Tdy?wL zBZV5A31^_$hD#hx8I8Gv!xc34B-M>a3N<(r&OoybmpGa-8gmDSD`@OVsvD0KYH%i; zfo2;naWrK#<_->5(AbkyHy$a};7m9J%{EAvVc~Vw&4YZ3~d%6wZV*&@3DH7>2k2 z%~`bOf>tiURx#1qE}EH-6sK?|oIx{Nhm^tK#5JT`jK#4?aSCU`8CcYlD>QWLI8b&b zb8#!Vfkgv-NO1~h!WmSwZ|K%>;OtC`AfaOD5;h9S18^psL0CJnDnOZHXx4EbK$`~n zhkS-cic>ff&LB1x39AEV3c|_;p$hP>cIY`+gV1@zIteLG;Y>J#SVIV^17+u-nI%A{ zG=SO`L(}z$h(U@|I1|o5D5H=C&d$^~mO@t%qa75#pm+wwH!}YB_r7 z)^XtI1;sPwp(WG`9Qv4p6sK?|oIx!o4Ba{ol${|bHGpHBS^+|TbCBW`&V)0l7Q#cdO zppJdu=mm!rD8i{@CS6SdyPd8!Qr|M9IE6Fe4C+`1j$LqAfn%IHhSJj%u-oZrAr0(8 zic>ff&Y+@wLpiL5vfE)%h!m%ACY%9NL%ht*JaJ1pvu;uOw=Ghm9SKo8}x8p>{m zMIBO{!kKUeOc536p&V92+3m2XLyA*46V8Asq5?gX!)hqI9Ts&+aSCU`88Agupoel; z4Q02(q7Ere;Y>IKricpkP!6l1>~>hxA;l@231`3*QGp)HVKtQ94vRXZIE6Fe445J+ z&_g+_hO*mXQHK<#a3-7qQ$z)ND2LThb~`NUkm3~1gfn1@s6Y?puo}v4heaJyoWhxK z222qZ=%E}|L)q=Hs6&cVI1|o*DWU>Bl*4K$yB!vFNO1~h!Wl3{RG^1)SPf;j!=er; zPT@>A1Ez=y^iU3~q3m{8)FH(woC#;Z6j6a5%3(E>-42U7q&S5$;S87}D$qkYtcJ4N zVNr(^r*I~m0aHW;dMJn0PX70T&V(~yil{&j<**vcZihu3Qk=q>a0W~f73iTH zRzunCu&6_dQ#cdOfGMH^J(R<0D7zgNbx3gvXTljUMO2`Na##&zx5J_iDNf-`I0L4L z3iMD8tD)?6SkxiKDVzysz!Xt|9?D@gl-&-CI;1#-GvN%FA}Y{BIjn}V+hI|M6sK?| zoB>lr1$rol)lhajEb5Tr6wZV*V2Y?f59P2L%5H~69a5aanQ#V75f$j699Bcw?Xajr zic>ff&VVVR0zH(&YACxM7IjE*3TMI@Fhx|LhjLgAWw*nk4k=FIOgICkhzj&j4y&Q; zc39LQ#VMQ#XTTIufgZ|XHI&^Bi#nt@g)`v{m?A3BLpiL5vfE)%hZLu9CY%9NL% zht*JaJ1pvu;uOw=Ghm9SKo8}x8p>{mMIBO{!kKUeOc536p&V92+3m2XLyA*46V8As zq5?gX!)hqI9Ts&+aSCU`88Agupoel;4Q02(q7Ere;Y>IKricpkP!6l1>~>hxA;l@2 z31`3*QGp)HVKtQ94vRXZIE6Fe445J+&_g+_hO*mXQHK<#a3-7qQ$z)NID{1yf?>dn zK#Eg16V9Nbt48CQih)UnQAlwLXTlj|n1@TtXguQz8TyDL#VMQ#XHd}zqw!3|z$C*c zq&S5$;S4g&8`Uy6LjWmG;Y>JVa5{O^Rb+$!Qk=q>a0a@0&}(Z3jzV|PD4*C6K#Eg1 z6V5<4WZ)tgYBRcnM)|~s08*U7nQ#WWA<)nsI11fC#PJ8ty)c`Jb0;lTA;l@231^^N z40HB?(dZ5$jz3_|gKp%B85 z#}#Dc#uvHzFdT+Y0GFfx|Nl=H`|-IA)eUgxz!~UzaY~>oq>PU%$jG&xTz!=J0-<}L z?FYF8$qjHOoB>jRjB!dJE25k|8qbu6A-V}jQ3q$j8F&<#Wa-gulvIFM> zG$z2o3=18QT2zcsg(^;n2h|6P3~+S)2S*h+qk@>I7DD7eu0^n*IzfsV7{J2FQ3)0R zX@I)}svc%A)PA`1KroQp0B6D(=ng`X0DBJR5vV#OX|M=b4W#^nFhT0UVelUuWc(me zerS+^}!(vhxMhU0|ER@d2_I%mBLs**dTQSRvFc;DiAdU|@i_7o-{H zXt29L0$^nj7sIkY)B-RUE;C>ZXc&O(hcn>}kSH=nk^p-SBZM#nz#+sB4>MRW@`K|U zHEVz@0-K6t3tS`EU=#_Eaw0K8ACv`(0uTo2hYEq1FbpkmASo0QycJvN)2$jU1OJ4{i2=>lj#B1D1gjpfCW5BRLRZ7+4LAi`yoc3fj|1Zh$l440P+^5+FZ9OD%LY zsC=k@;TjQqFbhn83T>!i5I$BTAQ=i(ibx*Zc4*W=Y(a>k8v~JtDh9_hsDuHDf)Xes zUcq$|q~rlf;4lIrjN2xNJUvJxH^7;22D$^_66D462WV*xE;GTQ113QAHM9zb@KLQr zh{3H#RX~u3&<9~bOoXtZv58^^ME*axvH`^`q=5~f`1ObV66a%1ba+ny@CKz`> zXe2klnQ#WWi{KIvKZ8pxbTz1aaBzU*6_Otzd`RHI>Su7)0Oc68;DMS1(E{SYtp{;P zzzBU17Q{pt8(d)^nFdP3V4p$U1yTkQ0+l#05wOd_f}oTOWo@d9E3h73rv9tkb}_lgPa9* z0f-4!28v9O7(@WX0;gfH97GHp_Xv{^iF0Vj^9Rs)KG?s=enTs~z!?If2p$-q5CcU% zga)yoAqMVJLzF?ZzzjwN88}#B!X(g8eIG#MGGJ{W0Z66>b15Vc4ul!>fgeQ-WF1Uu zplBpFz?pCcx}y*h*y0&l`ypupMH?j2pwS9W+@S0Xi(GIv04W0*4OIjdLzsdHGLRaC zIPol~KCm@lU7+NJFcvIC0fA`}$R>!t!Nx-E2eSu?Kym||31^@?3P}RZE9fdQ_@Fq1 z2!f*-%!Fqta9s@&!VEG{

        KhBJLQ zI1|o5*MlrUqj<)&5>b&NTaT^|AD>)(_{=0lZlLW4xfRI`a3-7qQhjRjB!dJE215nT`l#iTfwmvy4en6ubY&mVhgA`Md!Vb=aGtdpfDS@t#Hv9p$o;IGM zlc`8y2WP?==x)F%fv%7?`~kL}HlCuBsYqc5XTlliZonylu8=nT0k)nto}!bfNMQ$O z!Wrmpz$t;QkT(1Qww^YgqLZmeVFzcz8R%}nDS@t#Hv9p$o;IGMlc`8y2WP?==x)F% zfv%7?`~kL}HlCuBsYqc5XTlliZUFZY29iK`&?ukS5I~AkI1|o5H)J5A7;HDXgGTwp zh5%BW!kKUex*_1O9!LV+L8E+PLjWmG;Y>IK-H?HdVlY5=&?ukS5I~AkI1|nw){s$k zgFXb1;uOw=GX}lu>Eb|?Jv4N&kp`9^#VMQ#XVAdDA!sCGBkvG&Jj}^RaSCU`88AiE zpoeU(0PVS>{tjSj1Su(IAjK)131^UE5FxcgHdhRf1|U+L!kKUep|~SKe#qtuki!vM zHc9aD;8Kbdr*I~mK}Dwy*<1m3I4weiih)anQAj?3GvN#(^b@IM$mR;jfjdJ#LnFm0 zoC#+T8Hq$F8?w0qa!?xl#2g~LIyjXe#VMQ#XHd<_LpE1{A{f+D81fk!DNf-`ID=~O zJY;hPD1Jfl42o~6g~mV_gcPT6CY(Vn2Z2Hf6k4EAqn4R;F$d&u$hpfy&gp33gA}K5 zCY*t$mTWF4kU;Sa4mPq)832tSheP6d$T=M?w2a0Ze(ikU+A14$jl%%K}v zL)Yaf_d&<(Aj>vE(>LyA*46V5L_Lo-Ow7kE=P(qq&S5$ z;S3~o6f=izXboMLBSjigoWhxK29i38nL{_UhOWzzA`K}{;Y>IKNgc(^p&MF5*X2l& zh7_l8CY*t!j$-D}4XvT;a->K@ic>ff&OlN}F>~mK*3fl1QlufpDVzysAgQC6Idns7 z=(-#!(vad5&V)0N)KSbFx}i06U5*rKNO1~h!Wl^FC}s}b&>FffM~XD0IE6Fe3?y|F zGly2dt)c63q)0=GQ#cdOKvG9BbLfWF&~-Udq#?yAoC#+jsiT-VbVFa0Ze(ikU+A14$jl%%K}vL)Yaf_d&<(Aj z>vE(>LyA*46V5L_Lo-Ow7kE=P(qq&S5$;S3~o6f=izXboMLBSjigoWhxK z29i38nZqKqC=P`IGXN=0;Y>J#nywm+XKIEf$z~zNDVzyskZjthhQS&FNO1~h!Wo0r z(WCAnIRud66wZV*NH%R$!(a^oq&S5$;f%rR=uvl(90Evj3TMI@n5IGRp&A$p(>bFe z#D)M;oWhxK2Bskc6TwhhF`Y9iLTm^i#VMQ#XJ8rv4e^1YFr7oB$iO%k$yOrWNke5w zaSCU`8JPAWxt;z@Oy>|OLVu^C*+`^2X{Zb-PT@>A1JhnSQkaUVD?)+QXrWGjE_FkK z9Mh0O56*-$Fb%{bg{hdjA{1Cn|AM>y@2EfI1|nQt3V;}NTH~s0fz#sDbPv{j|{N&U@suK0nUUoz$#D(JW?p?XuzSs zY6`Sc!y^N1J=hCKZh$l446q6m0*@4mIvQ{&u$ls`)bPjvTMzaEk{jSmI0LK#g}@_) zqK*a}3aq9;D>Xbaz}ADkfaC@^6V3puKq2r*p{Sz)hXSi9&`J%D46yZJFCe)A&V)0- zDo_YKQYh+Zz@flu3bazgBLi$b*b7K*fHUC?unH6cj}(eJ8gMAEngXrV@W=pL5B36* z8{kYh1FQmtz$1mCjs_eGtfoLKH9RuF)`Pu(_itsas!+RXP_(o{~wPOref-fP+&C$T8Z()htYT@CYXp+LqTLwpp_WM zjm9%Ep+u}23L=XFtwgzQG(Qs+OvEXoAhIaXN}Sv9s~TYI!Hz?61DpwGfK{Lnc%)F& zk;`HD|DOSeUJ9(HKr0T%kR&|7)`Q)O{zGhHL`jl*%W9c z(gwWB2H1MA+mPGFx>@{fX#i$5rlSaoAZY~~jBG4eGm-)@AFK)-hft4#8i!!!|NpRZ z2;_ON5Lg{p8<+rzff;ZD-E_DF9T`Y&fHUC?On1PfpaFrV06l|)GcH&V=hs3S^8F&-|d!Mm7(d zdStzL*hpHz(E!Sd$jXU|XK18CiX<=xnvB5-7H%9^207wE8sM@6#y|=JI1|pmbQO{m z5))G$Tm%-sFd81ukN^i&-f*?>5)m53a6MoZ#MuW{icTPD{lEaW1x*EN$pNlXLGcAn zYaj*#KS&pp0GS37gbSf08wOC2K?KW=;F{z=C_#YY z`9CNPB7{JuLNHhiqzb|XlVA;C*1!=+Zh$l43`}PsNg**Y)xkwT;Q`{nXrkj8oGqwd zZiCzcjx8_)4*_>D#Kqu<1*Jc5Z-F12R3J(qB+Mi*4@|&BUz}H>fjd+z$5?i3KfVE7aBB0O$34w|~j3x`jTu>}SSO~*mERtztgCGW@+KSCU zL|j31L-=44644_!p23wCN|=EH6*->yL9q)GWB^xnP!>W9SO65Rkf1~>(-G=OWPwbC zX@Oe-69Cc33P61DXb9Nh@PY)KHX)@ED7Atj97PCO8%Pq$2T@o|2MN;^Be?<2gflQ* zf+U5+gsLMUolaU3}L zf#Vlkwu4#7sS#{6m;f0J!RX$Eh|-rtas!+RXJ9%7CI$8%rZjF5PFNLs;B049*NBPoCggZu}x93}}81GnG646rPih0=-u8x1BP27ySJ z0U-83VI()enQ#WCqhL~C4`NDVioi60sy4JD4pT9xfdlErfN~fJBdLL#gd|2J6GKF+W;v<-X0ixk9M)D7m7`m%qQgn!CkQLxe19bz; zYABZ!3P~%tTme_EL>qvl8=D?P?1N;nnNPp~kT#lQBsajBa0aIBFez|lg(;0G0@DC( zOCv`drebhfgXjRoGK2+FhRTD95=A3v1r-wL%`mKH!1RC|f>i-j5M&^f38seIJO()7 zf_;XUfCU#Q3W*3`Sp5u17AUC#JXVS#g4beXNrWSy&Hz`l$SN?|P(1__G-fCY*uk4rD1J0t?ds0wVBu21N*}T5vp*XD70&!4XG9a)IgrD@Sz*Di1xL z!5UD_hZ=>dkIp{xP9;rL4Y2iKKOwmR&V)0- zDo_YKQYh+ZzyVuLUWNv1rGb-(G;)Bg2fGr<4R9u$0ak%R;E_U6M*|MnYVtBPSSt;j zM5K`eY(3bONN#{L;S8_}6atSFiaHu_AXbx=p&?pn;3ndX9AN9gjzn?;oC#-uRiF@f zq)^n+fCI6btPBm&N&`0$XXF4|4|XJy8{kYh1FQmtz$1mCjs_g4)#PMos8$*{iYOxo z*m|%Vk=y`h!Wm!{CMVxLqoOFz)?gQIl$I~-H7A{I1|nQt3V;}NTH~s z0S9I^85tU;l?JXN#>fG-9_&OUH^7;223Q3Ofkz5O9St}ztI5dFFs(Fj6){E*u=QXk zBDn$1gfqY@PzXFyDC%gyfm=;_hK6gUfwPD(a)7M|yAa6@a3-7qR)Ip`kwQ^N0}kA3 z(laz%D-E1QgpmVmJ=ldvZh$l446q6m0*@4mIvQ{gR+F5e5n5^BF2Y6*u=QXEBDn$1 zgfqY@Pzcau&wyc=OGwVpcsv9%la}-VTMzack{jSmI0LK#g&43n23ZVu38@(xkB8u9 z(vUI0)`NY9NQaQZw{`xfo_K+~ottK#Eg16VAYN70lrSLL;0* zVul_N*CJbraQQ&7km3~1gfj-pQ3UNJF+(E<`GBwqdWhxV82gfj-QZ%E6~gV-ZAgA{}4t`@XYg6@_MSqqWk6wZV*2Dh(>*iJpTJwQ*_A;l@231`sL zA*9ff&Y*(%5F@~0MT5YiLxu(?QCg%?NXXEOM2b^56V9NP zBOqZ#i@>6NhK3|j8l+Kb1uk*sAjK)131<*z1YuPS4EziXL>^p2*feAnG|$i-2M!iCQk=q>a0Zne35sFx0W&mc&d@qTgO7;<9otH!uox&~km3~1gfpn*C{S*I zoFYRd1CflOafSvZQBeOGAgF4;;g%$YhLz)B@Z8J2;$)I=!`++*a zF)*ee#VMQ#XHdsUps)hRGfe`ErWqRSVo*H84p^s7hzx)!NO1~h!WmR?4>+vA@l2b* zqGg5#CsA-bLwrG%02vTNkm3~1gfpnA+3_TjpgD9S9n4w4Gc@V`j4Kws;JP)RLrd@^}jpxA>&$P?Xqwzeb;+bX{dNiH~ zRXo!yLyyMu;EHEjW$4j(9$fKEs|-CF&x0(UX_TQy<9U$9GmSFzXgm+Lc&1H;9*yV0 z7SFWF(4+A@=;E0s8G1CH2VFeVBtwtJ^WckTT4dKS@8o(E+-Q$0hE#`EBeXKH8Y(Rd!5 z@l5RuJsQu0G@hxPp-1C+kj68WGxTUY57v05ZiXI>=fN7!)XmVN@jPhbnW`CjG@b`- zJX1A8kH+)hjc3rw?j*PluhP+Y#v44SlC(Tm3e_eEkBXO=jm9%1NQolp9nVzE(4+B8 zR18BD(L0|1Q?)4u@xxFik-{I&gfpnR>E9BEIpc`kwOY7PT@>A14$j62@UiCpx{m* zk^#%mABOzpQ$%_gpE9I4g)`v{Y#Ik3f}vJoa}8cGXoemZ?Pa_kB|;J@PT@>A1Dk%l zlGrp*NsJ78p&1$$&(P#D02GyifD&Vnf)CDwGq4$qR}z~BDv6O}FC;^c#`FLGkb7t# zQ2`H0I0GV%O5&A7RZ3MJIrc&`H1uN20m#TuE2$a~R~G#2GbE_M*5B z$q{fSoPnYe%E2oMRYMDkJbS?z8mbja(ZX?f%^WCuQ5=Qj2sjhYKv4r zz2FQD?Ld=f0_A=gD0@*{j^qe96V5zy`T&|8qb5OUxjE0W4jNW%yxA*#!?`V z8_%E&4bclBu^3Hbp@Fg&#al>@fHUC?6qQg8UP-7LvM3tGGblqt+zcVfavNbyuoMcu zNf=c*P3=Xs3O5hQ5pX7)flV7;No*R37DEITwgF+X?FFYFkR!-80i>A#23rF40J>6I z+KX-%PCk+&;7m9Jn=ZVP*fdZ{jC^}R!4Gl-`6hsL`r-3Fc~03|0dM%PDEd(kb!#Yb`koC#-O(}Y(Nn+7V0k!mj}cA@1zbd4{mCQ!-Y z$WuksGLm$2kUS4(!Wr0%!z+nR1C_)`wHF-EkeMn_lN+4nsN@t9jUmA9DFG8 z04p7#%0Lu2ve4ogtPx}el)=CN%h(`6kS;KW$by+r0!11sMhpdW1Sn-e)q{ngY&eB( zK3EYrX+qormIpIITEGk<3nQ>jkfwpeNREIr;S6jJ151LkE;tNORDk`BB!UrC{NTI` zidg>t3=I5Wc`ykQ0vim|4UvWMKs1UpNPuVzwuS)_&k#Ox>G7Y)L<-SKYGFja%Zc_P zVTDMJfHUC?Y}&z+pg{-_MpXcoLKT9SbI{rmq6w5Bz=}Z(gb+e2SPUeI5CW@5a7ki; zavwF~8DtJPc|#e*6-Jb}oFs4JQ;g&YI1|pmrV%U&jsh@&O$m}1W;}xmdr&lj!wV!0 z!l3*Fl7Q(1i-8H42sE9*xg;_`OG>~l2iKPjpmGJ-KCmdN03`2%^gtt(?7|3S28qt4 zzH%f-z?pCcHtWEWU;;HBu&G6kKCqVmP(6r@017=&07E69rhs{10xE#Wjc@^y84wqM zOahm@AX|~lfXN~WAshga1SL<1b}%25&JjWgePA(=Bvc5j7|I?n3ds?0CY*uIRbWXl zfd~d{>L6kWHDE1B@eIu`0}{{R`WP*qA?`&Xu{$0VjU*LD5TB!%On(lNBj8Lp1DkWe zl3)T64A|5`#1Lx0TA=X^3Mxp`i(x?G8C!maxEF=Q?s!lQf>e})k_$p1NI#edCO|w; z0RW)~l!OF7*a>hZoBp_kO`57t!H4w}L6A%H2W(a%0 zNF+zVnQ#U+SAiwL1d>-E3Q^+<99;+@uoh4}g8~OMXbKVlNrQtNOh8Nlkzk|21c(R5 zAmv~N*#yi4XpKSG9E1ZPS|NOr3nPeT!q(AL1(GA+OgICZ&0t9|0r56M4O(1*^DQVM zAu7OHK!q46BQStkXkZ4o2!*jAD!~baAEW}5S72gL{V*;WG|U9-@l3nI2xc!CPNtp~ zBuBuRa0WJOz>;8staye5GB_5&u?vn=Fbg?S!A64#xD&uu!g=H{;3i;L2Qm$jB0)T; zvtVw5Xay%^FafHgK_flL^G#H^_3sMGULi9nJYpCX97!FlRJOwiWlGH$r0wleV=tB|!w-eDE4{<1| zg%QkNWW(vsMsft431?t)4OkK!D_{bf60BlieIOZ7GYCY30umaI3=9mYkqYL439w2K z0oM=WkcD9;fE<7ktr!9z=Yg6LV5^{7At{8^!U(DvY|wxaNREIr;S6l90!xCU0L;Rs z1gjVU)nF6h8li0+Xfgl`6VMMJlU|s0b1TmITEE2qTGOXM$CO&4#hCs{>bdNK(|C z$AB3Na{-t}iU*iH9vZ9#Bo8VJKr|?~LlXhP!U(PztZ{${BuBuRa0WIvK_tNm8|qPP zs$gOe)u84Ilm(MOqtS~^u=${z16PM%KU^6e2FwI-Rt6Jz6r)PPw4#c_d8mm7oB@!` zC!iT_3QZYEj({`a3~V+-B*F1O!*~W4j40+q?8W9HV#Q!4fbt}Iy25G(k_MC{hoKlL zQbBTPg%Qjckko)-BuBuRa0WJ4K_tQPfK3`r45FI!{0u4=QNtE$5}Ns>aA78Z-45g6 zGXSavtR9~_^h5*B1PIqdjlpLE?d6ah0cXM)*sO<2f(s{X@>CK-4?A#=l`^xTE{7yK z7zdw`P&FjSGgt$nFoGI`&nDW-Avprhgfp;Nk5>|#1}ceBZZF&fa6AyC}|{t{D|0G6ay~6wZV*u$eIsF$}R2 zn`=hJhztRwIE6Fe3?j`KRW|rT04Yx4OgLlkJAc%LM1}xToWhxK29airDjWPEfE1^2 zCY&+&oj>YAB0~TvPT@>AgGe(*l@0z7K#Eg16V4d?&L4Flks*K-r*I~mL8KX@$_9T3 zAjK)131AWAHnF)P+Qb08*U7nQ#V?W{fHu{2_o8r*I~mG5DQ7>Ovwz z04Yx4OgMu`Ge(sS{t!TlQ#cdO82rv3bs>=*$Tub+pb=SKYm4}sBmh6ly4W{k%3 zu#R51=SJfh9u&ixF&fXqI(p%r8;xgpPz-CvXgm+==!JW3G@ju>F{~M*@jR@f7w);y Uc!meXux5 literal 0 HcmV?d00001 diff --git a/docs/verifier/justicecfg.eps b/docs/verifier/justicecfg.eps new file mode 100755 index 00000000..177d5a0d --- /dev/null +++ b/docs/verifier/justicecfg.eps @@ -0,0 +1,793 @@ +%!PS-Adobe-1.0 EPSF-1.2 +%%BoundingBox: 0 0 972 774 +%%Creator: JASC, Inc. +%%Title: E:\JustIce-Paper\justicecfg.eps +%%CreationDate: 0 +%%EndComments +/width 972 def +/height 774 def +/pixwidth 972 def +/pixheight 774 def +/picstr width string def +/psppic { +gsave width height 4 +[width 0 0 height 0 height neg] +{currentfile picstr readhexstring pop} +image grestore } def +0 height neg translate pixwidth pixheight scale +psppic +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000000000000000FFFFFFFF000000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFF000000000000000FFFFFFFF000000000000FFFFFFFFFF0000000000FFFFFF000000000000000F000000000000000FFFF00000000FF00000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000000000000000FFFFFFF000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FF000000000000000FFFFFF0000000000000000FFFFFFF0000000000000FFF0000000000000000F000000000000000FFFF00000000FF00000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000000000000000FFFFFFF000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FF000000000000000FFFFFF0000000000000000FFFFFF00000000000000FFF0000000000000000F000000000000000FFFF00000000FF00000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF00000000000000FFFFFF000000FF000000FFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF00000000000000FFFFF0000000FFF0000000FFFFFF00000FFF000000FFF00000F000000000FFF00000000000000FFFF00000000FF00000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000FFFFF00000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFF00000FFFFFFFFFF00FFFFFFF0000FFFFFFF000FFF0000FFFFF00000FFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFF000000000000000000FFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFF000000000000000000FFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFF000000000000000000FFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000FF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFFFFFFF000000000000000000FFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFF00000FFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000000000000FFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000FFFFFFFF00000FFFFFFFF00000FFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000000FFFFFFFFFF00000FFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000000000000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFF00000000000F0000FF000000FFFF000000FFFFF0000000000000FFFF000000FFF0000000FFFFF00000000000F0000FF0000000FFF00000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000000000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF00000000000000000FF0000000000000000FFFF000000000000000FF0000000FF00000000FFFF00000000000000000F0000000000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF00000000000000000FFF00000000000000FFFFF000000000000000FF0000000FF00000000FFFF00000000000000000F000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF0000000F00000000FFFFFF0000000000FFFFFFF000000000000000FF0000000FF00000000FFFF0000000F00000000FF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFF000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF00000F0000FFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFF0000000FFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000F000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000000FFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF000000000FFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000000FFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF000000000FFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000000000FFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FF0000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFF0000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFF0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF0000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000000000000FFFFF000000000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000F00000000F000000000000FFF000000000000000FFF000000000000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000000000000FFFF00000000000000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000F000000000000FFF000000000000000FF0000000000000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000000000000FFFF000000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000F000000000000FF0000000000000000FF0000000000000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000000000000FFFFF00000FFFFF00000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFF000000FF00000F00000FFF00000FF00000000FFFFF0000000000000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFF000FFFFFFFF00000FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF00000FF000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00000FF0000FF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000000000000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFF00000000000000F0000FF000000FFF0000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFF0000000000000000000F0000000FFF0000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF00000000000FFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFF0000000000000000000F0000000FFF0000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000F000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFF000000000000000000FFF000000FFF0000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF000000000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF00000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FF0000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFF0000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFF0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF0000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000000000000FFFF000000000000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFF00000000FF00000000FFFFFFFF00000FFFFFFFFFFFF000000000FFFFFF000000FFFF00000000FFFFF000000000000FFFFF0000000000000FFFFFFFFFFF0000000000FFFFF0000000000000000FFFFFFF00000000000FFF0000000000000000FFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFF000000000F000000FFFFFF00000000000FFFFFFF000000000000000FF0000000000000000FFFFFFFFF0000000000FFFFFFFFF00000FFFFFFFFFFFFFF00000FFFFFFFF000000000000000FFFFFF000000000F000000FFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFF00000000000000FFFFFFF00000FFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000000000000FFFF000000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FF00000000FF00000000FFFFFFF000000FFFFFFFFFF0000000000000FFFF000000FFF000000000FFF000000000000000FFF000000000000000FFFFFFFFF0000000000000FF00000000000000000FFFFFF0000000000000FF0000000000000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFF00000000000000000FFFF000000000000000FFFF0000000000000000FF0000000000000000FFFFFFFF000000000000FFFFFFFF00000FFFFFFFFFFFFFF00000FFFFFFFF000000000000000FFFFF00000000000000000FFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFF000000000000000FFFFFFF00000FFFFFFFFFFF000000000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000000000000FFFF000000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FF00000000FF00000000FFFFFFF000000FFFFFFFFF00000000000000FFFF000000FFF000000000FF00000000000000000FF0000000000000000FFFFFFF00000000000000F000000000000000000FFFFFF00000000000000F0000000000000000FFFF0000000000000000FFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFF00000000000000000FFF0000000000000000FFFF0000000000000000FF0000000000000000FFFFFFF00000000000000FFFFFF0000000FFFFFFFFFFFFF00000FFFFFFFF000000000000000FFFFF00000000000000000FFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFF000000000000000FFFFFFF00000FFFFFFFFFFF000000000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF00000000000000FFFF000000000000000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFF00000000FF00000000FFFFFF00000000FFFFFFFF0000000F0000000FFF000000FFF00000000FFF0000000FF00000000FF0000000FFF000000FFFFFFF00000FFF000000F00000FF0000000000FFFFFFF00000FF0000000FF000000000000000FFFF0000000FFF000000FFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFF000000FF0000000000FFF0000000FFF000000FFFF00000F000000000FFF000000000000000FFFFFFFF00000FF0000000FFFFFF0000000FFFFFFFFFFFFF00000FFFFFFFFF00000000000000FFFF000000FF0000000000FFF0000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFF00000000000000FFFFFFFFF0000FFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFF0000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFFFF00000000FFFFFFF00000FFFFFF000000FFFF0000F0000000FFFFF00000FFFFFFFFFF00FFF0000FFFFFFFF0000FFFFFFF0000FFFFFFF000F0000FFFFFF00000FFFFFFFFF0000FFFFFF000FFFFFFFF0000FFFFFFFFF00000FFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFFF00000FFFF00000FFFFFFFFF000FFFF0000FFFFF00000FFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFF000FFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF00000FFFFFF00000FFFF00000FFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFFF0000000000FFFFFF0000FFFFFFFF00000FFFF00000000000FFFFFF000000000000000000FFF000FFFF00000000FFFFFFF0000FFFFFFFFFFF000000FFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFF00FFFFFFFF00000FFFFFF0000FFFF00000FFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFFF0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFFF00000F0000FFFFFF0000FFFFFFFFF0000FFFF0000000000FFFFFFF000000000000000000FFFFF000000000000FFFFFFFF0000FFFFFFFFFFF000000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF000000000000000FFFF0000FFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000000000000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFF00000FF00000FFFFF0000FFFFFFFFF0000FFFF00000000FFFFFFFFF000000000000000000FFFF000000000000FFFFFFFFF0000FFFFFFFFFFFF00000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF00000000000000FFFF0000FFFFFFFFFF00FFFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF00000000000000FFFF0000FFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFF00000FFF0000FFFFF0000FFFFFFFF00000FFFF000000000FFFFFFFF000000000000000000FFF000000000000FFFFFFFFFF0000FFFFFFFFFFFFF0000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFF0000000000000FFFF00000FFFFFFFF0000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFF00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000000000FFFF00000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000000FFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000FFFFF0000FFFFFF0000FFFF00000FFFF00000FFFFFFF00000FFFF0000000000FFFFFFF00000FFFFFFFF0000FFFF000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFF0000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFF00000000000FFFF00000FFFFFFF00000FFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF00000000000FFFF00000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000000FFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFF0000000FFF00000FFFF0000000FFF0000000FFF000000FFF000000FFFFF0000F00000000FFFFF000000FFFF000000FFFF00000FFFF00000FFFFFF0000000000000FFFFFF0000FFFF00000FFFFFF00000000000000FFFFFFF0000000FFFFFFFFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFF0000FFFFF00000FFFFF000000FFFF000000FF000000FFF0000000FFFFFFFFFF0000FFFFFFFFFFF0000000000000FFF0000000FFFF0000000FFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFF0000FFFFF00000FFFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF00000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFF0000000000000000FF0000000000F000000000FF000000000000000FFFFF0000FF00000000FFFF000000000000000FFFFF00000000000000FFFFF000000000000000FFFF00000000000000FFFFF0000000000000000FFFF000000000FFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000000000FF000FFF0000000000000FFFFFF0000000000000000F0000000FF00000000FFFFFFFFFF0000FFFFFFFFF0000000000000000F000000000FF000000000FFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF0000000000000FFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF00000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFF000000000000000FFF0000000000F000000000FFF0000000000000FFFFFF0000FF00000000FFFFF0000000000000FFFFFFF0000000000000FFFFF000000000000000FFFF00000000000000FFFFF0000000000000000FFFF000000000FFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FF0000FF0000000000000FFFFFFF000000000000000F0000000FF00000000FFFFFFFFFF0000FFFFFFFFF0000000000000000F000000000FF000000000FFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF0000000000000FFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFF000FFFFFF00000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFF00000000000000FFFFF00000000FF000000000FFFF0000000000FFFFFFFF0000FF00000000FFFFFF00000000000FFFFFFFFF000000000000FFFFF000000000000000FFFFF000000000000FFFFFF000000000000000FFFFFF00000000FFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFF000FF0000FF000000000000FFFFFFFFF0000000000000FF0000000FF00000000FFFFFFFFFF0000FFFFFFFFFF000000000000000FF00000000FF000000000FFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFF000000000000FFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFF0000FFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFF000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFFFF0000000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFF0000FFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000F0000FFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFF00000000000000FFFFFFF00000FFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFFF00000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF000000000000000FFFFFF00000FFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF000000000000000FFFFF00000FFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00000000000000FFFFFF00000FFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000FFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FF0000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFF0000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFF0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF0000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF00000000000000FFFFF00000000000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF000000000000FFFFFFFFF00000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000000000000FFFF000000000000000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF00000000000000FFFFFFF00000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000000000000FFFF000000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF000000000000000FFFFF0000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFF0000000000FFFFFFFFFFFF0000000000FFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF00000000000000FFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000000000000FFFFF00000000000000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF0000000000000000FFFF00000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFF000000000000FFFFFFFFFF000000000000FFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF000000000000000FFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFFF0000FFFFF00000FFFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF00000000000000FFFFFFFF00000000000000FF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF000000000000000FFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000FFFFFF000000FFFF0000FFFFFF0000FFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF00000FFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000000F00000000FFFF0000000FF0000000FFFFFFF00000FF0000000FF0000000F0000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF00000000000000FFFFFFF00000FF000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF00000000000FFFFF0000FFFFFF0000FFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF000000FFFF00000FFFFFF00000FFFFFFF0000FFFFFF000FF00000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFF0000FFFFFFFFFFF00000FFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000000FFFFFF0000FFFFFF0000FFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFF00000FFF00000FFFFFFFF0000FFFFFFF0000FFFFFFFFFFF0000FFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFF0000FFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000000000FFFFFFF0000FFFFFF0000FFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFF0000FFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF00000000FF0000FFFFF0000FFFFFF0000FFFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF0000FFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFF0000FFFFFFFFFFF00000FFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFF00000FFFFF0000FFFFFF0000FFFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFF00000FFF00000FFFFFFFF0000FFFFFFF0000FFFFFFFFFFF0000FFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFF0000FFFFFFFFFFF000000FFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFF00000000000000FFF000000FFF0000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF000000FFFF00000FFFFFF00000FFFFFFF0000FFFFFFFFFFF00000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF0000F00000FFFFFFFFFFFF0000FFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFF00000000000000FF0000000FFF0000000FFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFF00000000FFF000000FFFF000000FFFFF0000000000000FFFFF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFF0000FFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFF0000000000000FF0000000FFF0000000FFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000FFF00000000000000FFFF0000000000000000FFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFF0000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFF0000000000FFFFF00000FFFF000000FFFFF0000F0000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFF000000000000FFFFF0000000000000000FFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFF0000FFFFFFFFFFF0000F000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000FF0000FFFFFFFFFF000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF0000000000FFFFFFF000000000000000FFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFF0000FFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFF000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFF0000FFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF000000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF000000000FFFFFFFFFFFFF0000000FF000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000000FFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF000000000FFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF000000000FFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFF000000FFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FF0000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFF0000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFF0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FF0000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF0000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFF0000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFF0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF0000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF0000000000000FFFFFFFFF0000000FFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFF0000000000FFFFFFFFF00000000FFFFFFF000000FFFF000000FFFFF00000000000FFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000000000000FFFFFFF000000000FFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFF00000000000000FFFFFF00000000000FFFF000000000F000000000FF00000000000000FFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000000000000FFFFFF00000000000FFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFF0000000000000000FFF00000000000000FFF000000000F000000000FF000000000000000FFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFF000000000000FFFFFFF0000000000FFFFF00000000FF00000000FFF0000000000000FFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000000000000FFFFFF000000000000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF00000000000000000FFF000000000000000FF00000000FF00000000FFF000000000000000FFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFF00000000000000FFFFF000000000000FFFF000000000F000000000FF00000000000000FFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFF00000FFF00000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF000000FFFFFF00000FF000000FFFF000000FFFF0000FFFFFF0000FFFFF00000FFFFFF0000FFFFFFFF0000FFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFF0000000000000000FFF00000000000000FFF000000000F000000000FF000000000000000FFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFF000000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFF00FFF00000FFFFFFF0000FFFF0000FFFFFF0000FFFFF0000FFFFFF00000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF0000000FFFF000000FF0000000FF0000000FFF0000000FFF0000000FFF000000FFF000000FFFFFFFF00000FF0000000FFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFF00000FFF0000FFFFFF0000FFFFFFFFF00000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFFF0000FF00000FFFFFF00000FFFF0000FFFFFF0000FFFFF0000FFFFFFF0000FFFFFFFF0000FFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFF0000FFFFFF0000FFFFFFF000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFF00000FFF0000FFFFFF0000FFFFFF00FFFFF0000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF0000FFF0000FFFFFFFF00000FFF0000FFFFFF0000FFFFFF000000000000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFF0000FFFFFF0000FFFFFFFF000000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF0000FFF00000FFFFFFF0000FFFF00000FFFFF0000FFFFFF000000000F000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFF00FFFF0000FFFFFFFFF0000FFF0000FFFFFF0000FFFFFFF000000000000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFF000000FFFFF00000FFFF000000FFFF0000FFFFFF0000FFFFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF0000FFF0000FFFFFFFF00000FFF0000FFFFFF0000FFFFFF00000000000FFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFF000000000000000FFFF000000000000000FF0000000000000000FFFFFF00000000000000FFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF00000FFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFFF0000FFF00000FFFFFF00000FFFF00000FFFFF0000FFFFFF000000FFFF000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFF0000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFF000000000000000FFFF00000000000000FFF0000000000000000FFFFFF00000000000000FFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF00000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFF000000FFFF000000FFF000000FFFF000000FFF0000000FFF00000FFFFFF00000FFFF00000FFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF0000FFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFF00000000000000FFFFF000000000000FFFF000000000000000FFFFFFFF0000000000000FFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF00000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFF000000000000000FFFF00000000000000FFF0000000000000000FFFFFF00000000000000FFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFF0000FFFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFF000000000000FFFFFFF00000000FFFFFFF0000000000000FFFFFFFFFF00000000000FFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF00000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFF00000000000000FFFFF000000000000FFFF0000000000000000FFFFFF00000000000000FFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF00FFF0000FFFFFFFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF00000F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFF0000000000000FFFFFF0000000000FFFFF000000000000000FFFFFFFF000000000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFFF00000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFF000000FFFFFFFFFFFFFFF00000FFFFFFFFFFFF0000000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF0000000000FFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000000FFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FF0000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFF0000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FF0000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFF0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFF0000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFF0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF0000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF0000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFF000000000000000FFFF00000000FF00000000FFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FF000000000000000FFFF00000000FF00000000FFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFF000000FFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FF000000000000000FFFF00000000FF00000000FFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF0000000000000000FFFFFF0000000000FFFFFFF0000000000000000FFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFF0000000000000FFFFFF000000FFFF000000FFF000000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF0000000000000000FFFFF0000000000000FFFF000000000000000000FF000000000000000000FFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF0000000000000000FFFF00000000000000FFFF000000000000000000FF000000000000000000FFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFF000000000000000000FFFFFFFFFFFFFFFFFFFFFF000000000000000FFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF000FFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFF00000000000000FFFF000000FFFF000000FFF0000FFFF00000000FFF000000FFFF00000000FFFFFFFFFFFFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFF000000000000000000FFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFF0000FFFFFFF0000FFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFF000000000000000000FFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFF000000FF000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF00000FF0000000FF000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFF0000FFF000000000000000000FFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFF0000FF000000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFFFFFFFF00000FFFFF0000FFFF00000FFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF0000F00000FFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF00000FFF00000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF00000000000000FFFF000000000FF00000FFFF0000000FF0000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF0000FFFFFF000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF000000000000000FFF0000000000000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFFFFFFFF0000F0000FFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF000000000000000FFF000000000000000FFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF00000FFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFF000000FF0000000FFFF000000FF000000FFFF0000000FF0000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFF00000000000000FFFF00000000000000FFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFF00000000000000FFFFF00000000000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000000FFFFFF0000000000000FFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000FFFFFFFF00000000000FFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF000000FF000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFF000000F000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FF0000FFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000F0000F00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FF0000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FF0000FF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFF0000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFF0000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFF0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFF0000FFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFF0000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF0000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFF0000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFF0000FFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFF0000FFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFF000FFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFF0000FFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF0000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFF000FFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFF0000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FF0000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000F0000FFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000F0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFF00000000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFF0000000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFF000000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FFFFFFF000000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000FFFFF000000FFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF0000000000000000FFFFFF0000000000FFFFFFFF000000000000000FFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000FF000000FFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF0000000000000000FFFFF000000000000FFFFF000000000000000000FFF00000000000000000FFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000FFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF0000000000000000FFFF00000000000000FFFF000000000000000000FF000000000000000000FFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF0000FFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF0000000000000000FFFFFF0000000000FFFFFFFF000000000000000FFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFF000000F000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF000000000000000FFFF0000000FF0000000FFF00000FF0000000000FF0000000FF0000000000FFFFFFFFFFFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000FFFF0000FFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF0000000000000000FFFFF000000000000FFFFF000000000000000000FFF00000000000000000FFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFF00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFF0000FFFFFF00000FFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFF0000FFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFF0000000000000000FFFF00000000000000FFFF000000000000000000FF000000000000000000FFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF00000FF000000FFFFF0000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000FFFF0000FFFFFFFFFFFF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000FFFF000000000000000FFFF0000000FF0000000FFF00000FF0000000000FF0000000FF0000000000FFFFFFFFFFFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFF0000FF000000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFF0000FFFFFF00000FFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFF0000FFF00000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF00000FF000000FFFFF0000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF00000FFFF0000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFF0000FF000000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFFFFFF00000000000FFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFFF0000FFF00000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFF0000FFFFFFFFF000000FFFF000000FFFFF0000FFFF00000FFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF0000FFFFFFFF00000FFFF0000000000000FFFF0000FFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFF00000000000000FFFFF00000000000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF0000FFFFFFFFF00000FFFFFF00000FFFFFFF00000000000FFFF00000FFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000000FFFFFF0000000000000FFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFF0000FFFFFFFFF000000FFFF000000FFFFF0000FFFF00000FFFF000000FFFF000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000FFFFFFF000000000000FFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFF00000000000000FFFFF00000000000000FFFFF000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000FFFFFFFFFFFF0000000FFFFFFFFFFFFF000000F0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000000FFFFFF0000000000000FFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFF0000FFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000000000FFFFFFF000000000000FFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFF00000FFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF0000FFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFF000000FFFFFFFFFFFF0000000FFFFFFFFFFFFF000000F0000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFF0000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000FFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFF00000FFFF00000FFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFF00000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF000000FFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFF00000FF00000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFF000000000000FFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFF0000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFF00000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +%%Trailer -- GitLab From 5f82fee61b9c1612a8d6ef23438f2d8bfe3c1b98 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 21 Mar 2002 08:30:38 +0000 Subject: [PATCH 0077/1313] doc fix git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152767 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/JavaClass.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index c0d1ef1b..56c0eded 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -362,29 +362,37 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { public ConstantPool getConstantPool() { return constant_pool; } /** - * @return Fields, i.e., variables of the class. + * @return Fields, i.e., variables of the class. Like the JVM spec + * mandates for the classfile format, these fields are those specific to + * this class, and not those of the superclass or superinterfaces. */ public Field[] getFields() { return fields; } + /** * @return File name of class, aka SourceFile attribute value */ public String getFileName() { return file_name; } + /** * @return Names of implemented interfaces. */ public String[] getInterfaceNames() { return interface_names; } + /** * @return Implemented interfaces. */ public int[] getInterfaces() { return interfaces; } + /** * @return Major number of compiler version. */ public int getMajor() { return major; } + /** * @return Methods of the class. */ public Method[] getMethods() { return methods; } + /** * @return Minor number of compiler version. */ @@ -399,6 +407,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { * @return Superclass name. */ public String getSuperclassName() { return superclass_name; } + /** * @return Class name index. */ @@ -426,84 +435,98 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { public void setAttributes(Attribute[] attributes) { this.attributes = attributes; } + /** * @param class_name. */ public void setClassName(String class_name) { this.class_name = class_name; } + /** * @param class_name_index. */ public void setClassNameIndex(int class_name_index) { this.class_name_index = class_name_index; } + /** * @param constant_pool. */ public void setConstantPool(ConstantPool constant_pool) { this.constant_pool = constant_pool; } + /** * @param fields. */ public void setFields(Field[] fields) { this.fields = fields; } + /** * Set File name of class, aka SourceFile attribute value */ public void setFileName(String file_name) { this.file_name = file_name; } + /** * @param interface_names. */ public void setInterfaceNames(String[] interface_names) { this.interface_names = interface_names; } + /** * @param interfaces. */ public void setInterfaces(int[] interfaces) { this.interfaces = interfaces; } + /** * @param major. */ public void setMajor(int major) { this.major = major; } + /** * @param methods. */ public void setMethods(Method[] methods) { this.methods = methods; } + /** * @param minor. */ public void setMinor(int minor) { this.minor = minor; } + /** * Set absolute path to file this class was read from. */ public void setSourceFileName(String source_file_name) { this.source_file_name = source_file_name; } + /** * @param superclass_name. */ public void setSuperclassName(String superclass_name) { this.superclass_name = superclass_name; } + /** * @param superclass_name_index. */ public void setSuperclassNameIndex(int superclass_name_index) { this.superclass_name_index = superclass_name_index; } + /** * @return String representing class contents. */ -- GitLab From 70012842c92e523e50258a184d8e90def7b30907 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Mon, 25 Mar 2002 17:49:44 +0000 Subject: [PATCH 0078/1313] Adding a maven build file and a maven project descriptor. I'm trying to generate a site for BCEL that looks like this: http://jakarta.apache.org/turbine/maven/ I will post more info to the list. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152768 13f79535-47bb-0310-9956-ffa450edef68 --- build-maven.xml | 98 +++++++++++++++++++++++++++++++++++++++++++++++++ project.xml | 96 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 194 insertions(+) create mode 100644 build-maven.xml create mode 100644 project.xml diff --git a/build-maven.xml b/build-maven.xml new file mode 100644 index 00000000..9b36beed --- /dev/null +++ b/build-maven.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/project.xml b/project.xml new file mode 100644 index 00000000..cfd98ac3 --- /dev/null +++ b/project.xml @@ -0,0 +1,96 @@ + + + + jakarta-bcel + bcel + 5.1-dev + Apache Software Foundation + 2002 + org.apache.bcel + + Bytecode Engineering Library + + + Bytecode Engineering Library + + + http://jakarta.apache.org/bcel/ + http://cvs.apache.org/viewcvs/jakarta-bcel/ + jakarta.apache.org + /www/jakarta.apache.org/bcel/ + + + + BCEL User List + bcel-user-subscribe@jakarta.apache.org + bcel-user-unsubscribe@jakarta.apache.org + http://www.mail-archive.com/bcel-user@jakarta.apache.org/ + + + BCEL Developer List + mailto:bcel-dev-subscribe@jakarta.apache.org + mailto:bcel-dev-unsubscribe@jakarta.apache.org + http://www.mail-archive.com/bcel-dev@jakarta.apache.org/ + + + + + + + Markus Dahm + mdahm + m.dahm@4flow.de + 4Flow + + + + Jason van Zyl + jvanzyl + jason@zenplex.com + Zenplex + + + + + + + jakarta-regexp + required + 1.2 + jakarta-regexp-1.2.jar + + + + + + + src/java + + + + src/java + + + + + + + + exclude = **/*.class + + + + + + + + + + + + + + + + + -- GitLab From 3a441f5c289e6b6e1097e779ef04a7e821ee2905 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 3 Apr 2002 14:42:28 +0000 Subject: [PATCH 0079/1313] align behaviour git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152769 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Repository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index 621b343e..bc9b363d 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -127,7 +127,8 @@ public abstract class Repository { InputStream is = clazz.getResourceAsStream(name + ".class"); j_class = new ClassParser(is, class_name).parse(); } catch(IOException e) { - throw new RuntimeException(e.getMessage()); + //System.err.println(e); + return null; // Use same behaviour as above } classes.put(class_name, j_class); -- GitLab From 93d029e3c29bda5d0c5e07cb70b8ead408e07ea9 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 5 Apr 2002 08:59:39 +0000 Subject: [PATCH 0080/1313] long, double take two git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152770 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/Utility.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 8d32face..27f1fafe 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -702,7 +702,8 @@ public abstract class Utility { index = 1; // current string position while(signature.charAt(index) != ')') { - buf.append(signatureToString(signature.substring(index), chopit)); + String param_type = signatureToString(signature.substring(index), chopit); + buf.append(param_type); if(vars != null) { LocalVariable l = vars.getLocalVariable(var_index); @@ -712,7 +713,11 @@ public abstract class Utility { } else buf.append(" arg" + var_index); - var_index++; + if("double".equals(param_type) || "long".equals(param_type)) + var_index += 2; + else + var_index++; + buf.append(", "); index += consumed_chars; // update position } -- GitLab From cb1dd3b8aeb788403668e99b77a6921f0e68a6bc Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 10 Apr 2002 07:40:59 +0000 Subject: [PATCH 0081/1313] rather return instruction git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152771 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/InstructionFactory.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/InstructionFactory.java b/src/java/org/apache/bcel/generic/InstructionFactory.java index 654363ee..a6213d89 100644 --- a/src/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/java/org/apache/bcel/generic/InstructionFactory.java @@ -534,8 +534,9 @@ public class InstructionFactory implements InstructionConstants { } /** Create new array of given size and type. + * @return an instruction that creates the corresponding array at runtime, i.e. is an AllocationInstruction */ - public AllocationInstruction createNewArray(Type t, short dim) { + public Instruction createNewArray(Type t, short dim) { if(dim == 1) { if(t instanceof ObjectType) return new ANEWARRAY(cp.addClass((ObjectType)t)); -- GitLab From 6a093793853dc040714190d25949abe86481b16e Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 11 Apr 2002 08:59:14 +0000 Subject: [PATCH 0082/1313] Ensure LDC_W opcode git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152772 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/LDC_W.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/java/org/apache/bcel/generic/LDC_W.java b/src/java/org/apache/bcel/generic/LDC_W.java index 1e658dea..9b724684 100644 --- a/src/java/org/apache/bcel/generic/LDC_W.java +++ b/src/java/org/apache/bcel/generic/LDC_W.java @@ -82,6 +82,8 @@ public class LDC_W extends LDC { throws IOException { setIndex(bytes.readUnsignedShort()); + // Override just in case it has been changed + opcode = org.apache.bcel.Constants.LDC_W; length = 3; } } -- GitLab From e0df617dcae156c3c2f8ee123c444798c5471170 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Thu, 11 Apr 2002 14:09:04 +0000 Subject: [PATCH 0083/1313] Applying doco patch supplied by Dale Martin. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152773 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AttributeReader.java | 42 +++++++++++++++---- xdocs/index.xml | 2 +- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/AttributeReader.java b/src/java/org/apache/bcel/classfile/AttributeReader.java index b9793e4a..a179e5fb 100644 --- a/src/java/org/apache/bcel/classfile/AttributeReader.java +++ b/src/java/org/apache/bcel/classfile/AttributeReader.java @@ -55,16 +55,44 @@ package org.apache.bcel.classfile; */ /** - * Unknown (non-standard) attributes may be read via user-defined - * factory objects that can be registered with the Attribute.addAttributeReader - * method. - * + + * Unknown (non-standard) attributes may be read via user-defined factory + * objects that can be registered with the Attribute.addAttributeReader + * method. These factory objects should implement this interface. + * @see Attribute * @version $Id$ * @author M. Dahm */ public interface AttributeReader { - public Attribute createAttribute(int name_index, int length, - java.io.DataInputStream file, - ConstantPool constant_pool); + /** + When this attribute reader is added via the static method + Attribute.addAttributeReader, an attribute name is associated with it. + As the class file parser parses attributes, it will call various + AttributeReaders based on the name of the attributes it is + constructing. + + @param name_index An index into the constant pool, indexing a + ConstantUtf8 that represents the name of the attribute. + + @param length The length of the data contained in the attribute. This + is written into the constant pool and should agree with what the + factory expects the length to be. + + @param file This is the data input stream that the factory needs to read + its data from. + + @param constant_pool This is the constant pool associated with the + Attribute that we are constructing. + + @return The user-defined AttributeReader should take this data and use + it to construct an attribute. In the case of errors, a null can be + returned which will cause the parsing of the class file to fail. + + @see Attribute#addAttributeReader( String, AttributeReader ) + */ + public Attribute createAttribute( int name_index, + int length, + java.io.DataInputStream file, + ConstantPool constant_pool ); } diff --git a/xdocs/index.xml b/xdocs/index.xml index c886f3d5..59eb48c7 100644 --- a/xdocs/index.xml +++ b/xdocs/index.xml @@ -31,7 +31,7 @@ BCEL is already being used successfully in several projects such as compilers, optimizers, obsfuscators and analysis tools, the most popular probably being the Xalan XSLT processor at Apache.

        -- GitLab From ec4e83bc4e85cb1d73a9a7d4d3933dc0475c27af Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 18 Apr 2002 07:52:13 +0000 Subject: [PATCH 0084/1313] JAR uses listclass as main class by default git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152774 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 5 +++-- manifest.txt | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 manifest.txt diff --git a/build.xml b/build.xml index 6d6e05e7..f5f6e98d 100644 --- a/build.xml +++ b/build.xml @@ -65,10 +65,11 @@ Available targets: - + diff --git a/manifest.txt b/manifest.txt new file mode 100644 index 00000000..2fe56ed3 --- /dev/null +++ b/manifest.txt @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 +Main-Class: listclass -- GitLab From 2f48e2ffca63bf2cc4ea0b43470815f638fa192a Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 23 Apr 2002 08:00:42 +0000 Subject: [PATCH 0085/1313] cleanup git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152775 13f79535-47bb-0310-9956-ffa450edef68 --- examples/JasminVisitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/JasminVisitor.java b/examples/JasminVisitor.java index 3e92f6ab..91f80103 100644 --- a/examples/JasminVisitor.java +++ b/examples/JasminVisitor.java @@ -1,4 +1,3 @@ -import org.apache.bcel.classfile.Visitor; import org.apache.bcel.classfile.*; import org.apache.bcel.generic.*; import java.io.*; @@ -79,6 +78,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { } public void visitDeprecated(Deprecated attribute) { printEndMethod(attribute); } + public void visitSynthetic(Synthetic attribute) { if(_method != null) printEndMethod(attribute); -- GitLab From 1cbbb4db061d5ffbd6e093a9b1e550b362034946 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Tue, 23 Apr 2002 20:55:54 +0000 Subject: [PATCH 0086/1313] Bullet-proof text representation of objects that trigger BCEL's beloved "ClassFormatError" trying to object.toString() them. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152776 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/statics/StringRepresentation.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java index c636a134..2743d4c0 100644 --- a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -112,6 +112,11 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor String s = obj.getClass().getName(); s = s.substring(s.lastIndexOf(".")+1); ret = "<<"+s+">>"; + } + catch(ClassFormatError e){ /* BCEL can be harsh e.g. trying to convert the "signature" of a ReturnaddressType LocalVariable (shouldn't occur, but people do crazy things) */ + String s = obj.getClass().getName(); + s = s.substring(s.lastIndexOf(".")+1); + ret = "<<"+s+">>"; } return ret; } -- GitLab From 39ef11c5c12aeb1d3e3262d9284bbbadbc26d105 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 24 Apr 2002 08:01:36 +0000 Subject: [PATCH 0087/1313] Don\'t accept ReturnaddressType as argument git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152777 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/generic/FieldGenOrMethodGen.java | 8 ++++- .../org/apache/bcel/generic/MethodGen.java | 34 ++++++++++++------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 08ef516b..52064b02 100644 --- a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -1,4 +1,5 @@ package org.apache.bcel.generic; +import org.apache.bcel.Constants; /* ==================================================================== * The Apache Software License, Version 1.1 @@ -74,7 +75,12 @@ public abstract class FieldGenOrMethodGen extends AccessFlags protected FieldGenOrMethodGen() {} - public void setType(Type type) { this.type = type; } + public void setType(Type type) { + if(type.getType() == Constants.T_ADDRESS) + throw new IllegalArgumentException("Type can not be " + type); + + this.type = type; + } public Type getType() { return type; } /** @return name of method/field. diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index adc572a9..18b8c86e 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -265,20 +265,28 @@ public class MethodGen extends FieldGenOrMethodGen { public LocalVariableGen addLocalVariable(String name, Type type, int slot, InstructionHandle start, InstructionHandle end) { - byte t = type.getType(); - int add = type.getSize(); - - if(slot + add > max_locals) - max_locals = slot + add; - - LocalVariableGen l = new LocalVariableGen(slot, name, type, start, end); - int i; + byte t = type.getType(); - if((i = variable_vec.indexOf(l)) >= 0) // Overwrite if necessary - variable_vec.set(i, l); - else - variable_vec.add(l); - return l; + if(t != Constants.T_ADDRESS) { + int add = type.getSize(); + + if(slot + add > max_locals) + max_locals = slot + add; + + LocalVariableGen l = new LocalVariableGen(slot, name, type, start, end); + int i; + + if((i = variable_vec.indexOf(l)) >= 0) // Overwrite if necessary + variable_vec.set(i, l); + else + variable_vec.add(l); + + return l; + } else { + throw new IllegalArgumentException("Can not use " + type + + " as type for local variable"); + + } } /** -- GitLab From 29ca260a41f2f3dfb023689d00cdc982ea123bd6 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 24 Apr 2002 08:11:30 +0000 Subject: [PATCH 0088/1313] Doc fix git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152778 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/MethodGen.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index 18b8c86e..8cc680e7 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -70,7 +70,6 @@ import java.util.*; * * @version $Id$ * @author M. Dahm - * @author Patrick C. Beard * @see InstructionList * @see Method */ @@ -443,7 +442,7 @@ public class MethodGen extends FieldGenOrMethodGen { * @param start_pc Start of region (inclusive) * @param end_pc End of region (inclusive) * @param handler_pc Where handling is done - * @param catch_type fully qualified class name of handled exception or null if any + * @param catch_type class type of handled exception or null if any * exception is handled * @return new exception handler object */ -- GitLab From 30defa70147ef6fdd15304c9dc4514697f13a665 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 24 Apr 2002 11:01:31 +0000 Subject: [PATCH 0089/1313] Don\'t throw anymore Errors but exceptions git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152779 13f79535-47bb-0310-9956-ffa450edef68 --- examples/patchclass.java | 1 - .../org/apache/bcel/classfile/Attribute.java | 7 +- .../bcel/classfile/ClassFormatException.java | 69 +++++++++++++++++++ .../apache/bcel/classfile/ClassParser.java | 42 +++++------ .../org/apache/bcel/classfile/Constant.java | 4 +- .../apache/bcel/classfile/ConstantPool.java | 22 +++--- .../apache/bcel/classfile/ConstantValue.java | 7 +- src/java/org/apache/bcel/classfile/Field.java | 2 +- .../apache/bcel/classfile/FieldOrMethod.java | 4 +- .../org/apache/bcel/classfile/Method.java | 4 +- .../org/apache/bcel/classfile/Utility.java | 60 ++++++++-------- src/java/org/apache/bcel/generic/Type.java | 8 +-- 12 files changed, 149 insertions(+), 81 deletions(-) create mode 100644 src/java/org/apache/bcel/classfile/ClassFormatException.java diff --git a/examples/patchclass.java b/examples/patchclass.java index a56c2a5c..ba0a278a 100644 --- a/examples/patchclass.java +++ b/examples/patchclass.java @@ -1,6 +1,5 @@ import java.io.*; import org.apache.bcel.classfile.*; -import org.apache.bcel.Constants; /** * Patch all Utf8 constants in the given class file file.class diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index 945330e8..270e7ce2 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -146,12 +146,11 @@ public abstract class Attribute implements Cloneable, Node { * @param constant_pool Array of constants * @return Attribute * @throws IOException - * @throws ClassFormatError - * @throws InternalError + * @throws ClassFormatException */ public static final Attribute readAttribute(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatError, InternalError + throws IOException, ClassFormatException { ConstantUtf8 c; String name; @@ -223,7 +222,7 @@ public abstract class Attribute implements Cloneable, Node { return new StackMap(name_index, length, file, constant_pool); default: // Never reached - throw new InternalError("Ooops! default case reached."); + throw new IllegalStateException("Ooops! default case reached."); } } diff --git a/src/java/org/apache/bcel/classfile/ClassFormatException.java b/src/java/org/apache/bcel/classfile/ClassFormatException.java new file mode 100644 index 00000000..c29a586a --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ClassFormatException.java @@ -0,0 +1,69 @@ +package org.apache.bcel.classfile; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Thrown when the BCEL attempts to read a class file and determines + * that the file is malformed or otherwise cannot be interpreted as a + * class file. + * + * @version $Id$ + * @author M. Dahm + */ +public class ClassFormatException extends RuntimeException { + public ClassFormatException() { super(); } + public ClassFormatException(String s) { super(s); } +} + diff --git a/src/java/org/apache/bcel/classfile/ClassParser.java b/src/java/org/apache/bcel/classfile/ClassParser.java index 379e2444..2dafc816 100644 --- a/src/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/java/org/apache/bcel/classfile/ClassParser.java @@ -141,15 +141,15 @@ public final class ClassParser { /** * Parse the given Java class file and return an object that represents * the contained data, i.e., constants, methods, fields and commands. - * A ClassFormatError is raised, if the file is not a valid + * A ClassFormatException is raised, if the file is not a valid * .class file. (This does not include verification of the byte code as it * is performed by the java interpreter). * * @return Class object representing the parsed class file * @throws IOException - * @throws ClassFormatError + * @throws ClassFormatException */ - public JavaClass parse() throws IOException, ClassFormatError + public JavaClass parse() throws IOException, ClassFormatException { /****************** Read headers ********************************/ // Check magic tag of class file @@ -210,9 +210,9 @@ public final class ClassParser { /** * Read information about the attributes of the attributes of the class. * @throws IOException - * @throws ClassFormatError + * @throws ClassFormatException */ - private final void readAttributes() throws IOException, ClassFormatError + private final void readAttributes() throws IOException, ClassFormatException { int attributes_count; @@ -226,9 +226,9 @@ public final class ClassParser { /** * Read information about the class and its super class. * @throws IOException - * @throws ClassFormatError + * @throws ClassFormatException */ - private final void readClassInfo() throws IOException, ClassFormatError + private final void readClassInfo() throws IOException, ClassFormatException { access_flags = file.readUnsignedShort(); @@ -240,7 +240,7 @@ public final class ClassParser { if(((access_flags & Constants.ACC_ABSTRACT) != 0) && ((access_flags & Constants.ACC_FINAL) != 0 )) - throw new ClassFormatError("Class can't be both final and abstract"); + throw new ClassFormatException("Class can't be both final and abstract"); class_name_index = file.readUnsignedShort(); superclass_name_index = file.readUnsignedShort(); @@ -248,9 +248,9 @@ public final class ClassParser { /** * Read constant pool entries. * @throws IOException - * @throws ClassFormatError + * @throws ClassFormatException */ - private final void readConstantPool() throws IOException, ClassFormatError + private final void readConstantPool() throws IOException, ClassFormatException { constant_pool = new ConstantPool(file); } @@ -258,9 +258,9 @@ public final class ClassParser { /** * Read information about the fields of the class, i.e., its variables. * @throws IOException - * @throws ClassFormatError + * @throws ClassFormatException */ - private final void readFields() throws IOException, ClassFormatError + private final void readFields() throws IOException, ClassFormatException { int fields_count; @@ -277,21 +277,21 @@ public final class ClassParser { * Check whether the header of the file is ok. * Of course, this has to be the first action on successive file reads. * @throws IOException - * @throws ClassFormatError + * @throws ClassFormatException */ - private final void readID() throws IOException, ClassFormatError + private final void readID() throws IOException, ClassFormatException { int magic = 0xCAFEBABE; if(file.readInt() != magic) - throw new ClassFormatError(file_name + " is not a Java .class file"); + throw new ClassFormatException(file_name + " is not a Java .class file"); } /** * Read information about the interfaces implemented by this class. * @throws IOException - * @throws ClassFormatError + * @throws ClassFormatException */ - private final void readInterfaces() throws IOException, ClassFormatError + private final void readInterfaces() throws IOException, ClassFormatException { int interfaces_count; @@ -304,9 +304,9 @@ public final class ClassParser { /** * Read information about the methods of the class. * @throws IOException - * @throws ClassFormatError + * @throws ClassFormatException */ - private final void readMethods() throws IOException, ClassFormatError + private final void readMethods() throws IOException, ClassFormatException { int methods_count; @@ -319,9 +319,9 @@ public final class ClassParser { /** * Read major and minor version of compiler which created the file. * @throws IOException - * @throws ClassFormatError + * @throws ClassFormatException */ - private final void readVersion() throws IOException, ClassFormatError + private final void readVersion() throws IOException, ClassFormatException { minor = file.readUnsignedShort(); major = file.readUnsignedShort(); diff --git a/src/java/org/apache/bcel/classfile/Constant.java b/src/java/org/apache/bcel/classfile/Constant.java index 62550614..9fdc15e5 100644 --- a/src/java/org/apache/bcel/classfile/Constant.java +++ b/src/java/org/apache/bcel/classfile/Constant.java @@ -124,7 +124,7 @@ public abstract class Constant implements Cloneable, Node { * @return Constant object */ static final Constant readConstant(DataInputStream file) - throws IOException, ClassFormatError + throws IOException, ClassFormatException { byte b = file.readByte(); // Read tag byte @@ -142,7 +142,7 @@ public abstract class Constant implements Cloneable, Node { case Constants.CONSTANT_NameAndType: return new ConstantNameAndType(file); case Constants.CONSTANT_Utf8: return new ConstantUtf8(file); default: - throw new ClassFormatError("Invalid byte tag in constant pool: " + b); + throw new ClassFormatException("Invalid byte tag in constant pool: " + b); } } } diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/java/org/apache/bcel/classfile/ConstantPool.java index 483a8f45..9c9e79eb 100644 --- a/src/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/java/org/apache/bcel/classfile/ConstantPool.java @@ -88,9 +88,9 @@ public class ConstantPool implements Cloneable, Node { * * @param file Input stream * @throws IOException - * @throws ClassFormatError + * @throws ClassFormatException */ - ConstantPool(DataInputStream file) throws IOException, ClassFormatError + ConstantPool(DataInputStream file) throws IOException, ClassFormatException { byte tag; @@ -134,7 +134,7 @@ public class ConstantPool implements Cloneable, Node { * @return String representation */ public String constantToString(Constant c) - throws ClassFormatError + throws ClassFormatException { String str; int i; @@ -210,7 +210,7 @@ public class ConstantPool implements Cloneable, Node { * @return String representation */ public String constantToString(int index, byte tag) - throws ClassFormatError + throws ClassFormatException { Constant c = getConstant(index, tag); return constantToString(c); @@ -240,7 +240,7 @@ public class ConstantPool implements Cloneable, Node { */ public Constant getConstant(int index) { if (index >= constant_pool.length || index < 0) - throw new ClassFormatError("Invalid constant pool reference: " + + throw new ClassFormatException("Invalid constant pool reference: " + index + ". Constant pool size is: " + constant_pool.length); return constant_pool[index]; @@ -254,22 +254,22 @@ public class ConstantPool implements Cloneable, Node { * @param tag Tag of expected constant, i.e., its type * @return Constant value * @see Constant - * @throws ClassFormatError + * @throws ClassFormatException */ public Constant getConstant(int index, byte tag) - throws ClassFormatError + throws ClassFormatException { Constant c; c = getConstant(index); if(c == null) - throw new ClassFormatError("Constant pool at index " + index + " is null."); + throw new ClassFormatException("Constant pool at index " + index + " is null."); if(c.getTag() == tag) return c; else - throw new ClassFormatError("Expected class `" + Constants.CONSTANT_NAMES[tag] + + throw new ClassFormatException("Expected class `" + Constants.CONSTANT_NAMES[tag] + "' at index " + index + " and got " + c); } @@ -289,10 +289,10 @@ public class ConstantPool implements Cloneable, Node { * @return Contents of string reference * @see ConstantClass * @see ConstantString - * @throws ClassFormatError + * @throws ClassFormatException */ public String getConstantString(int index, byte tag) - throws ClassFormatError + throws ClassFormatException { Constant c; int i; diff --git a/src/java/org/apache/bcel/classfile/ConstantValue.java b/src/java/org/apache/bcel/classfile/ConstantValue.java index 0177fec6..b46dc0dc 100644 --- a/src/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/java/org/apache/bcel/classfile/ConstantValue.java @@ -142,8 +142,7 @@ public final class ConstantValue extends Attribute { /** * @return String representation of constant value. */ - public final String toString() throws InternalError - { + public final String toString() { Constant c = constant_pool.getConstant(constantvalue_index); String buf; @@ -160,7 +159,9 @@ public final class ConstantValue extends Attribute { c = constant_pool.getConstant(i, Constants.CONSTANT_Utf8); buf = "\"" + Utility.convertString(((ConstantUtf8)c).getBytes()) + "\""; break; - default: throw new InternalError("Type of ConstValue invalid: " + c); + + default: + throw new IllegalStateException("Type of ConstValue invalid: " + c); } return buf; diff --git a/src/java/org/apache/bcel/classfile/Field.java b/src/java/org/apache/bcel/classfile/Field.java index 741f7e1d..967aa3d1 100644 --- a/src/java/org/apache/bcel/classfile/Field.java +++ b/src/java/org/apache/bcel/classfile/Field.java @@ -77,7 +77,7 @@ public final class Field extends FieldOrMethod { * @param file Input stream */ Field(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatError + throws IOException, ClassFormatException { super(file, constant_pool); } diff --git a/src/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/java/org/apache/bcel/classfile/FieldOrMethod.java index 1b758cd1..1850f1f7 100644 --- a/src/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -84,10 +84,10 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * Construct object from file stream. * @param file Input stream * @throws IOException - * @throws ClassFormatError + * @throws ClassFormatException */ protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatError + throws IOException, ClassFormatException { this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), null, constant_pool); diff --git a/src/java/org/apache/bcel/classfile/Method.java b/src/java/org/apache/bcel/classfile/Method.java index ad094931..173f6bb8 100644 --- a/src/java/org/apache/bcel/classfile/Method.java +++ b/src/java/org/apache/bcel/classfile/Method.java @@ -83,10 +83,10 @@ public final class Method extends FieldOrMethod { * Construct object from file stream. * @param file Input stream * @throws IOException - * @throws ClassFormatError + * @throws ClassFormatException */ Method(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatError + throws IOException, ClassFormatException { super(file, constant_pool); } diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 27f1fafe..132903ac 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -169,7 +169,7 @@ public abstract class Utility { } catch(IOException e) { System.out.println(buf.toString()); e.printStackTrace(); - throw new ClassFormatError("Byte code error: " + e); + throw new ClassFormatException("Byte code error: " + e); } return buf.toString(); @@ -536,7 +536,7 @@ public abstract class Utility { * @return Byte code representation of method signature */ public final static String methodTypeToSignature(String ret, String[] argv) - throws ClassFormatError + throws ClassFormatException { StringBuffer buf = new StringBuffer("("); String str; @@ -546,7 +546,7 @@ public abstract class Utility { str = getSignature(argv[i]); if(str.endsWith("V")) // void can't be a method argument - throw new ClassFormatError("Invalid type: " + argv[i]); + throw new ClassFormatException("Invalid type: " + argv[i]); buf.append(str); } @@ -561,10 +561,10 @@ public abstract class Utility { /** * @param signature Method signature * @return Array of argument types - * @throws ClassFormatError + * @throws ClassFormatException */ public static final String[] methodSignatureArgumentTypes(String signature) - throws ClassFormatError + throws ClassFormatException { return methodSignatureArgumentTypes(signature, true); } @@ -573,11 +573,11 @@ public abstract class Utility { * @param signature Method signature * @param chopit Shorten class names ? * @return Array of argument types - * @throws ClassFormatError + * @throws ClassFormatException */ public static final String[] methodSignatureArgumentTypes(String signature, boolean chopit) - throws ClassFormatError + throws ClassFormatException { ArrayList vec = new ArrayList(); int index; @@ -585,7 +585,7 @@ public abstract class Utility { try { // Read all declarations between for `(' and `)' if(signature.charAt(0) != '(') - throw new ClassFormatError("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature); index = 1; // current string position @@ -594,7 +594,7 @@ public abstract class Utility { index += consumed_chars; // update position } } catch(StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatError("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature); } types = new String[vec.size()]; @@ -604,10 +604,10 @@ public abstract class Utility { /** * @param signature Method signature * @return return type of method - * @throws ClassFormatError + * @throws ClassFormatException */ public static final String methodSignatureReturnType(String signature) - throws ClassFormatError + throws ClassFormatException { return methodSignatureReturnType(signature, true); } @@ -615,11 +615,11 @@ public abstract class Utility { * @param signature Method signature * @param chopit Shorten class names ? * @return return type of method - * @throws ClassFormatError + * @throws ClassFormatException */ public static final String methodSignatureReturnType(String signature, boolean chopit) - throws ClassFormatError + throws ClassFormatException { int index; String type; @@ -629,7 +629,7 @@ public abstract class Utility { index = signature.lastIndexOf(')') + 1; type = signatureToString(signature.substring(index), chopit); } catch(StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatError("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature); } return type; @@ -674,21 +674,21 @@ public abstract class Utility { * ::= * * * This method converts such a string into a Java type declaration like - * `void main(String[])' and throws a `ClassFormatError' when the parsed + * `void main(String[])' and throws a `ClassFormatException' when the parsed * type is invalid. * * @param signature Method signature * @param name Method name * @param access Method access rights * @return Java type declaration - * @throws ClassFormatError + * @throws ClassFormatException */ public static final String methodSignatureToString(String signature, String name, String access, boolean chopit, LocalVariableTable vars) - throws ClassFormatError + throws ClassFormatException { StringBuffer buf = new StringBuffer("("); String type; @@ -697,7 +697,7 @@ public abstract class Utility { try { // Read all declarations between for `(' and `)' if(signature.charAt(0) != '(') - throw new ClassFormatError("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature); index = 1; // current string position @@ -728,7 +728,7 @@ public abstract class Utility { type = signatureToString(signature.substring(index), chopit); } catch(StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatError("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature); } if(buf.length() > 1) // Tack off the extra ", " @@ -815,13 +815,13 @@ public abstract class Utility { *
* * This method converts this string into a Java type declaration such as - * `String[]' and throws a `ClassFormatError' when the parsed type is + * `String[]' and throws a `ClassFormatException' when the parsed type is * invalid. * * @param signature Class signature * @param chopit Flag that determines whether chopping is executed or not * @return Java type declaration - * @throws ClassFormatError + * @throws ClassFormatException */ public static final String signatureToString(String signature, boolean chopit) @@ -841,7 +841,7 @@ public abstract class Utility { int index = signature.indexOf(';'); // Look for closing `;' if(index < 0) - throw new ClassFormatError("Invalid signature: " + signature); + throw new ClassFormatException("Invalid signature: " + signature); consumed_chars = index + 1; // "Lblabla;" `L' and `;' are removed @@ -875,11 +875,11 @@ public abstract class Utility { case 'V' : return "void"; - default : throw new ClassFormatError("Invalid signature: `" + + default : throw new ClassFormatException("Invalid signature: `" + signature + "'"); } } catch(StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatError("Invalid signature: " + e + ":" + signature); + throw new ClassFormatException("Invalid signature: " + e + ":" + signature); } } @@ -982,18 +982,18 @@ public abstract class Utility { * @see Constants */ public static final byte typeOfMethodSignature(String signature) - throws ClassFormatError + throws ClassFormatException { int index; try { if(signature.charAt(0) != '(') - throw new ClassFormatError("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature); index = signature.lastIndexOf(')') + 1; return typeOfSignature(signature.substring(index)); } catch(StringIndexOutOfBoundsException e) { - throw new ClassFormatError("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature); } } @@ -1005,7 +1005,7 @@ public abstract class Utility { * @see Constants */ public static final byte typeOfSignature(String signature) - throws ClassFormatError + throws ClassFormatException { try { switch(signature.charAt(0)) { @@ -1021,10 +1021,10 @@ public abstract class Utility { case 'Z' : return Constants.T_BOOLEAN; case 'S' : return Constants.T_SHORT; default: - throw new ClassFormatError("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature); } } catch(StringIndexOutOfBoundsException e) { - throw new ClassFormatError("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature); } } diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index 2d1aacc9..1be04ad4 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -177,7 +177,7 @@ public abstract class Type { int index = signature.indexOf(';'); // Look for closing `;' if(index < 0) - throw new ClassFormatError("Invalid signature: " + signature); + throw new ClassFormatException("Invalid signature: " + signature); consumed_chars = index + 1; // "Lblabla;" `L' and `;' are removed @@ -197,7 +197,7 @@ public abstract class Type { int index = signature.lastIndexOf(')') + 1; return getType(signature.substring(index)); } catch(StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatError("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature); } } @@ -213,7 +213,7 @@ public abstract class Type { try { // Read all declarations between for `(' and `)' if(signature.charAt(0) != '(') - throw new ClassFormatError("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature); index = 1; // current string position @@ -222,7 +222,7 @@ public abstract class Type { index += consumed_chars; // update position } } catch(StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatError("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature); } types = new Type[vec.size()]; -- GitLab From 81cf52ca6d46637cf124850e9c744ec5e8c7f660 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 26 Apr 2002 09:30:11 +0000 Subject: [PATCH 0090/1313] Be less picky about padding bytes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152780 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/Select.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/java/org/apache/bcel/generic/Select.java b/src/java/org/apache/bcel/generic/Select.java index c56f6903..4e3707d3 100644 --- a/src/java/org/apache/bcel/generic/Select.java +++ b/src/java/org/apache/bcel/generic/Select.java @@ -153,9 +153,7 @@ public abstract class Select extends BranchInstruction padding = (4 - (bytes.getIndex() % 4)) % 4; // Compute number of pad bytes for(int i=0; i < padding; i++) { - byte b; - if((b=bytes.readByte()) != 0) - throw new ClassGenException("Padding byte != 0: " + b); + bytes.readByte(); } // Default branch target common for both cases (TABLESWITCH, LOOKUPSWITCH) -- GitLab From b45f1b2ba10408547cac0221f4ddcaf54c557fb8 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Fri, 26 Apr 2002 22:35:40 +0000 Subject: [PATCH 0091/1313] Add checks for missing or wrongly-typed referenced fields. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152781 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/statics/Pass3aVerifier.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 109006d6..7c740a70 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -290,7 +290,7 @@ public final class Pass3aVerifier extends PassVerifier{ // The last byte of the last instruction in the code array must be the byte at index // code_length-1 : See the do_verify() comments. We actually don't iterate through the // byte array, but use an InstructionList so we cannot check for this. But BCEL does - // things right, so it's implicitely okay. + // things right, so it's implicitly okay. // TODO: Check how BCEL handles (and will handle) instructions like IMPDEP1, IMPDEP2, // BREAKPOINT... that BCEL knows about but which are illegal anyway. @@ -483,6 +483,36 @@ public final class Pass3aVerifier extends PassVerifier{ if (! (c instanceof ConstantFieldref)){ constraintViolated(o, "Indexing a constant that's not a CONSTANT_Fieldref but a '"+c+"'."); } + + String field_name = o.getFieldName(cpg); + + JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + Field[] fields = jc.getFields(); + Field f = null; + for (int i=0; i Date: Thu, 2 May 2002 09:05:52 +0000 Subject: [PATCH 0092/1313] Updated contributor list git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152782 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/contributors.xml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/xdocs/contributors.xml b/xdocs/contributors.xml index d51f875c..1d650e4f 100644 --- a/xdocs/contributors.xml +++ b/xdocs/contributors.xml @@ -9,7 +9,7 @@ -
+

@@ -29,9 +29,29 @@ + + + + + + + +
Jason van Zyl jvanzyl@zenplex.com
David Dixon-Peughdixonpeugh@yahoo.com
Enver Haaseenver@convergence.de

+
+
+

+ + + + + +
Patrick Beardbeard@netscape.com
+

+ + -- GitLab From 2741d3d2d9228a9eba2369df99a040133b06ef86 Mon Sep 17 00:00:00 2001 From: David Dixon-Peugh Date: Wed, 8 May 2002 20:59:29 +0000 Subject: [PATCH 0093/1313] These changes are to allow BCEL to pull Classfiles from either a ClassLoader (such as AntClassLoader) or off of the ClassPath the way it used to. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152783 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/JavaClass.java | 82 +++++++++- .../org/apache/bcel/util/ClassLoader.java | 3 +- .../bcel/util/ClassLoaderRepository.java | 128 +++++++++++++++ src/java/org/apache/bcel/util/Repository.java | 78 +++++++++ .../apache/bcel/util/SyntheticRepository.java | 150 ++++++++++++++++++ .../org/apache/bcel/verifier/Verifier.java | 21 ++- 6 files changed, 455 insertions(+), 7 deletions(-) create mode 100644 src/java/org/apache/bcel/util/ClassLoaderRepository.java create mode 100644 src/java/org/apache/bcel/util/Repository.java create mode 100644 src/java/org/apache/bcel/util/SyntheticRepository.java diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 56c0eded..2cd0a445 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -56,6 +56,11 @@ package org.apache.bcel.classfile; import org.apache.bcel.Constants; import org.apache.bcel.Repository; +import org.apache.bcel.util.Repository; +import org.apache.bcel.util.SyntheticRepository; +import org.apache.bcel.util.ClassVector; +import org.apache.bcel.util.ClassQueue; + import java.io.*; import java.util.StringTokenizer; @@ -97,6 +102,14 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { static boolean debug = false; // Debugging on/off static char sep = '/'; // directory separator + /** + * In cases where we go ahead and create something, + * use the default SyntheticRepository, because we + * don't know any better. + */ + private org.apache.bcel.util.Repository repository = + SyntheticRepository.getInstance(); + /** * Constructor gets all contents as arguments. * @@ -622,7 +635,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { } public final boolean instanceOf(JavaClass super_class) { - return Repository.instanceOf(this, super_class); + return org.apache.bcel.Repository.instanceOf(this, super_class); } public final boolean isSuper() { @@ -638,4 +651,71 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { public final byte getSource() { return source; } + + // Added on 4/16/2002 to deprecate the old Repository class. -- DDP + + /** + * Gets the ClassRepository which holds its definition. + */ + public org.apache.bcel.util.Repository getRepository() { + return repository; + } + + /** + * Sets the ClassRepository which loaded the JavaClass. + * Should be called immediately after parsing is done. + */ + public void setRepository( org.apache.bcel.util.Repository repository ) { + this.repository = repository; + } + + /** + * Get the Superclass for this JavaClass object. + */ + public JavaClass getSuperclass() { + try { + return repository.loadClass( getSuperclassName() ); + } catch (ClassNotFoundException cnfe) { + System.err.println("WARNING: Could not find Superclass."); + cnfe.printStackTrace(); + return null; + } + } + + /** + * Get all interfaces implemented by the JavaClass object. + */ + public JavaClass [] getAllInterfaces() { + try { + ClassQueue queue = new ClassQueue(); + ClassVector vec = new ClassVector(); + + queue.enqueue( this ); + + while (!queue.empty()) { + JavaClass clazz = queue.dequeue(); + + JavaClass souper = clazz.getSuperclass(); + String interfaces[] = clazz.getInterfaceNames(); + + if (clazz.isInterface()) { + vec.addElement( clazz ); + } else { + if (souper != null) { + queue.enqueue( souper ); + } + } + + for (int i = 0; i < interfaces.length; i++) { + queue.enqueue( repository.loadClass( interfaces[i] )); + } + } + + return vec.toArray(); + } catch (ClassNotFoundException cnfe) { + System.err.println("WARNING: Class not found."); + cnfe.printStackTrace(); + return null; + } + } } diff --git a/src/java/org/apache/bcel/util/ClassLoader.java b/src/java/org/apache/bcel/util/ClassLoader.java index ce45e49d..12e43d10 100644 --- a/src/java/org/apache/bcel/util/ClassLoader.java +++ b/src/java/org/apache/bcel/util/ClassLoader.java @@ -89,6 +89,7 @@ public class ClassLoader extends java.lang.ClassLoader { private String[] ignored_packages = { "java.", "javax.", "sun." }; + private Repository repository = null; public ClassLoader() { } @@ -132,7 +133,7 @@ public class ClassLoader extends java.lang.ClassLoader { if(class_name.indexOf("$$BCEL$$") >= 0) clazz = createClass(class_name); else { // Fourth try: Load classes via repository - if((clazz = Repository.lookupClass(class_name)) != null) + if((clazz = org.apache.bcel.Repository.lookupClass(class_name)) != null) clazz = modifyClass(clazz); else throw new ClassNotFoundException(class_name); diff --git a/src/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/java/org/apache/bcel/util/ClassLoaderRepository.java new file mode 100644 index 00000000..50f4cea8 --- /dev/null +++ b/src/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -0,0 +1,128 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.io.*; + +import java.util.Map; +import java.util.HashMap; + +import org.apache.bcel.classfile.*; + +/** + * The repository maintains information about which classes have + * been loaded. + * + * It loads its data from the ClassLoader implementation + * passed into its constructor. + */ + +public class ClassLoaderRepository + implements Repository +{ + private java.lang.ClassLoader loader; + private Map loadedClasses = + new HashMap(); // CLASSNAME X JAVACLASS + + public ClassLoaderRepository( java.lang.ClassLoader loader ) { + this.loader = loader; + } + + /** + * Store a new JavaClass into this Repository. + */ + public void storeClass( JavaClass clazz ) { + loadedClasses.put( clazz.getClassName(), + clazz ); + clazz.setRepository( this ); + } + + /** + * Find an already defined JavaClass. + */ + public JavaClass findClass( String className ) { + if ( loadedClasses.containsKey( className )) { + return (JavaClass) loadedClasses.get( className ); + } else { + return null; + } + } + + /** + * Lookup a JavaClass object from the Class Name provided. + */ + public JavaClass loadClass( String className ) + throws ClassNotFoundException + { + String classFile = className.replace('.', '/'); + + JavaClass RC = findClass( className ); + if (RC != null) { return RC; } + + try { + InputStream is = + loader.getResourceAsStream( classFile + ".class" ); + + ClassParser parser = new ClassParser( is, className ); + RC = parser.parse(); + + storeClass( RC ); + + return RC; + } catch (IOException e) { + throw new ClassNotFoundException( e.toString() ); + } + } +} diff --git a/src/java/org/apache/bcel/util/Repository.java b/src/java/org/apache/bcel/util/Repository.java new file mode 100644 index 00000000..7b66d0cb --- /dev/null +++ b/src/java/org/apache/bcel/util/Repository.java @@ -0,0 +1,78 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import org.apache.bcel.classfile.JavaClass; + +public interface Repository +{ + /** + * Store the provided class under "clazz.getClassName()" + */ + public void storeClass( JavaClass clazz ); + + /** + * Find the class with the name provided, if the class + * isn't there, return NULL. + */ + public JavaClass findClass( String className ); + + /** + * Find the class with the name provided, if the class + * isn't there, make an attempt to load it. + */ + public JavaClass loadClass( String className ) + throws java.lang.ClassNotFoundException; +} diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/java/org/apache/bcel/util/SyntheticRepository.java new file mode 100644 index 00000000..b1b7865c --- /dev/null +++ b/src/java/org/apache/bcel/util/SyntheticRepository.java @@ -0,0 +1,150 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +import java.io.*; + +import java.util.Map; +import java.util.HashMap; + +import org.apache.bcel.classfile.*; + +/** + * This repository is used in situations where a + * Class is created outside the realm of a ClassLoader. + * + * It is designed to be used as a singleton, however it + * can also be used with custom classpaths. + */ + +public class SyntheticRepository + implements Repository +{ + private static Map instances = + new HashMap(); // CLASSPATH X REPOSITORY + + private ClassPath path = null; + private static String defaultPath = ClassPath.getClassPath(); + + private Map loadedClasses = + new HashMap(); // CLASSNAME X JAVACLASS + + public SyntheticRepository( String classPath ) { + path = new ClassPath( classPath ); + instances.put( classPath, this ); + } + + public SyntheticRepository( ) { + path = new ClassPath( ); + instances.put( ClassPath.getClassPath(), this ); + } + + public static SyntheticRepository getInstance() { + return (SyntheticRepository) instances.get( defaultPath ); + } + + public static SyntheticRepository getInstance(String classPath) { + return (SyntheticRepository) instances.get( classPath ); + } + + /** + * Store a new JavaClass into this Repository. + */ + public void storeClass( JavaClass clazz ) { + loadedClasses.put( clazz.getClassName(), + clazz ); + } + + /** + * Find an already defined JavaClass. + */ + public JavaClass findClass( String className ) { + if ( loadedClasses.containsKey( className )) { + return (JavaClass) loadedClasses.get( className ); + } else { + return null; + } + } + + /** + * Lookup a JavaClass object from the Class Name provided. + */ + public JavaClass loadClass( String className ) + throws ClassNotFoundException + { + JavaClass RC = findClass( className ); + if (RC != null) { + return RC; + } + + try { + + InputStream is = path.getInputStream( className, ".class" ); + if (is != null) { + ClassParser parser = new ClassParser( is, className ); + RC = parser.parse(); + + storeClass( RC ); + + return RC; + } + } catch (IOException e) { + throw new ClassNotFoundException("Exception looking for class " + + className + ": " + e.toString()); + + } + throw new ClassNotFoundException("SyntheticRepository does not load new classes."); + } +} diff --git a/src/java/org/apache/bcel/verifier/Verifier.java b/src/java/org/apache/bcel/verifier/Verifier.java index 61b4ecbf..6e8a4285 100644 --- a/src/java/org/apache/bcel/verifier/Verifier.java +++ b/src/java/org/apache/bcel/verifier/Verifier.java @@ -203,7 +203,12 @@ public class Verifier{ String[] p3am = pv.getMessages(); int meth = pv.getMethodNo(); for (int i=0; i Date: Fri, 10 May 2002 14:45:56 +0000 Subject: [PATCH 0094/1313] Fixed: Was using the SystemClassLoader when loading a class that is ignored by the ClassLoader. Now, it uses "deferTo". git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152784 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/util/ClassLoader.java | 40 ++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/java/org/apache/bcel/util/ClassLoader.java b/src/java/org/apache/bcel/util/ClassLoader.java index 12e43d10..926042a1 100644 --- a/src/java/org/apache/bcel/util/ClassLoader.java +++ b/src/java/org/apache/bcel/util/ClassLoader.java @@ -89,23 +89,42 @@ public class ClassLoader extends java.lang.ClassLoader { private String[] ignored_packages = { "java.", "javax.", "sun." }; - private Repository repository = null; + private Repository repository = + SyntheticRepository.getInstance(); + private java.lang.ClassLoader deferTo = ClassLoader.getSystemClassLoader(); public ClassLoader() { } + public ClassLoader( java.lang.ClassLoader deferTo ) { + this.deferTo = deferTo; + this.repository = new ClassLoaderRepository( deferTo ); + } + /** @param ignored_packages classes contained in these packages will be loaded * with the system class loader */ public ClassLoader(String[] ignored_packages) { - String[] new_p = new String[ignored_packages.length + this.ignored_packages.length]; + addIgnoredPkgs( ignored_packages ); + } - System.arraycopy(this.ignored_packages, 0, new_p, 0, this.ignored_packages.length); - System.arraycopy(ignored_packages, 0, new_p, this.ignored_packages.length, - ignored_packages.length); + public ClassLoader( java.lang.ClassLoader deferTo, + String [] ignored_packages ) { + this.deferTo = deferTo; + this.repository = new ClassLoaderRepository( deferTo ); - this.ignored_packages = new_p; - } + addIgnoredPkgs( ignored_packages ); + } + + private void addIgnoredPkgs( String[] ignored_packages ) { + String[] new_p = new String[ignored_packages.length + this.ignored_packages.length]; + + System.arraycopy(this.ignored_packages, 0, new_p, 0, this.ignored_packages.length); + System.arraycopy(ignored_packages, 0, new_p, this.ignored_packages.length, + ignored_packages.length); + + this.ignored_packages = new_p; + } protected Class loadClass(String class_name, boolean resolve) throws ClassNotFoundException @@ -120,7 +139,7 @@ public class ClassLoader extends java.lang.ClassLoader { */ for(int i=0; i < ignored_packages.length; i++) { if(class_name.startsWith(ignored_packages[i])) { - cl = Class.forName(class_name); + cl = deferTo.loadClass(class_name); break; } } @@ -133,8 +152,9 @@ public class ClassLoader extends java.lang.ClassLoader { if(class_name.indexOf("$$BCEL$$") >= 0) clazz = createClass(class_name); else { // Fourth try: Load classes via repository - if((clazz = org.apache.bcel.Repository.lookupClass(class_name)) != null) - clazz = modifyClass(clazz); + if ( (clazz = repository.loadClass( class_name )) != null) { + clazz = modifyClass( clazz ); + } else throw new ClassNotFoundException(class_name); } -- GitLab From e4fdde9dc0394ce396db0ca13ac6f5bf7b8f2a6c Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 13 May 2002 08:37:13 +0000 Subject: [PATCH 0095/1313] Removed duplicate visit git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152785 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/StoreInstruction.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/StoreInstruction.java b/src/java/org/apache/bcel/generic/StoreInstruction.java index a24249e0..b35a6988 100644 --- a/src/java/org/apache/bcel/generic/StoreInstruction.java +++ b/src/java/org/apache/bcel/generic/StoreInstruction.java @@ -93,7 +93,6 @@ public abstract class StoreInstruction extends LocalVariableInstruction public void accept(Visitor v) { v.visitStackConsumer(this); v.visitPopInstruction(this); - v.visitStoreInstruction(this); v.visitTypedInstruction(this); v.visitLocalVariableInstruction(this); v.visitStoreInstruction(this); -- GitLab From b409e12863b8a7f4e4478aed810d30929e776765 Mon Sep 17 00:00:00 2001 From: David Dixon-Peugh Date: Fri, 17 May 2002 19:24:04 +0000 Subject: [PATCH 0096/1313] Compile error with the Single Imports. Fixed. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152786 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/JavaClass.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 2cd0a445..c41d7c87 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -55,7 +55,7 @@ package org.apache.bcel.classfile; */ import org.apache.bcel.Constants; -import org.apache.bcel.Repository; +// import org.apache.bcel.Repository; import org.apache.bcel.util.Repository; import org.apache.bcel.util.SyntheticRepository; import org.apache.bcel.util.ClassVector; -- GitLab From d5590c115015a33da3f285b9682953670d26826d Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 21 May 2002 09:44:51 +0000 Subject: [PATCH 0097/1313] new project git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152787 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/projects.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/xdocs/projects.xml b/xdocs/projects.xml index 41dda6db..542ce2b9 100644 --- a/xdocs/projects.xml +++ b/xdocs/projects.xml @@ -73,6 +73,11 @@ >AspectJ: Aspect-oriented Java +
  • AOP ClassLoader Suite +
  • +
  • Brakes: Thread serialization -- GitLab From 1eb1e1df5ababe5cd9806a5d22488989294f5f6c Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sun, 26 May 2002 15:07:52 +0000 Subject: [PATCH 0098/1313] redundancy git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152788 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/ConstantPool.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/java/org/apache/bcel/classfile/ConstantPool.java index 9c9e79eb..3da591c0 100644 --- a/src/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/java/org/apache/bcel/classfile/ConstantPool.java @@ -296,7 +296,6 @@ public class ConstantPool implements Cloneable, Node { { Constant c; int i; - String s; c = getConstant(index, tag); -- GitLab From c704115d5d2c00935f7632b72887298941d0a180 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Sun, 2 Jun 2002 12:38:08 +0000 Subject: [PATCH 0099/1313] Updating to the v3 POM. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152789 13f79535-47bb-0310-9956-ffa450edef68 --- project.xml | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/project.xml b/project.xml index cfd98ac3..3c625353 100644 --- a/project.xml +++ b/project.xml @@ -1,10 +1,14 @@ + 3 jakarta-bcel bcel 5.1-dev - Apache Software Foundation + + Apache Software Foundation + http://www.apache.org + 2002 org.apache.bcel @@ -19,6 +23,11 @@ jakarta.apache.org /www/jakarta.apache.org/bcel/ + + scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-bcel + http://cvs.apache.org/viewcvs/jakarta-bcel/ + + BCEL User List @@ -54,34 +63,21 @@ - jakarta-regexp - required + regexp 1.2 - jakarta-regexp-1.2.jar - - src/java - - - - src/java - - - - + src/java + + src/java - - exclude = **/*.class - - - - - + + exclude = **/*.class + -- GitLab From 07a9af6ee0641f6852199d2be6c6d988611ef712 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 3 Jun 2002 09:06:37 +0000 Subject: [PATCH 0100/1313] Removed redundant vars git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152790 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Repository.java | 2 +- src/java/org/apache/bcel/classfile/JavaClass.java | 9 +++++---- src/java/org/apache/bcel/classfile/Method.java | 3 --- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index bc9b363d..82b8a9e6 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -231,7 +231,7 @@ public abstract class Repository { String s = clazz.getSuperclassName(); String[] interfaces = clazz.getInterfaceNames(); - +System.out.println(java.util.Arrays.asList(interfaces)); if(clazz.isInterface()) vec.addElement(clazz); else if(!s.equals("java.lang.Object")) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index c41d7c87..1f359b97 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -171,9 +171,6 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { } } - // Get class name and superclass name - ConstantUtf8 name; - /* According to the specification the following entries must be of type * `ConstantClass' but we check that anyway via the * `ConstPool.getConstant' method. @@ -293,7 +290,11 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { try { dump(ds); ds.close(); - } catch(IOException e) { e.printStackTrace(); } + } catch(IOException e) { + e.printStackTrace(); + } finally { + try { ds.close(); } catch(IOException e2) { e2.printStackTrace(); } + } return s.toByteArray(); } diff --git a/src/java/org/apache/bcel/classfile/Method.java b/src/java/org/apache/bcel/classfile/Method.java index 173f6bb8..a70c34e3 100644 --- a/src/java/org/apache/bcel/classfile/Method.java +++ b/src/java/org/apache/bcel/classfile/Method.java @@ -170,11 +170,8 @@ public final class Method extends FieldOrMethod { */ public final String toString() { ConstantUtf8 c; - ConstantValue cv; String name, signature, access; // Short cuts to constant pool - String exceptions; StringBuffer buf; - Attribute[] attr; access = Utility.accessToString(access_flags); -- GitLab From 927b4a443c433712f851172e1fdbc476897a0631 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 3 Jun 2002 09:11:26 +0000 Subject: [PATCH 0101/1313] Undo nonsense git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152791 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Repository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index 82b8a9e6..bc9b363d 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -231,7 +231,7 @@ public abstract class Repository { String s = clazz.getSuperclassName(); String[] interfaces = clazz.getInterfaceNames(); -System.out.println(java.util.Arrays.asList(interfaces)); + if(clazz.isInterface()) vec.addElement(clazz); else if(!s.equals("java.lang.Object")) -- GitLab From d3e10332651085e204baf6c9d3846505cb8f9857 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 4 Jun 2002 11:16:21 +0000 Subject: [PATCH 0102/1313] removed redundant vars git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152792 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/AttributeHTML.java | 1 - src/java/org/apache/bcel/util/BCELifier.java | 1 - src/java/org/apache/bcel/util/CodeHTML.java | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/java/org/apache/bcel/util/AttributeHTML.java b/src/java/org/apache/bcel/util/AttributeHTML.java index aef1284f..2fc44884 100644 --- a/src/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/java/org/apache/bcel/util/AttributeHTML.java @@ -118,7 +118,6 @@ final class AttributeHTML implements org.apache.bcel.Constants { switch(tag) { case ATTR_CODE: Code c = (Code)attribute; - Attribute[] attributes = c.getAttributes(); // Some directly printable values file.print("
    • Maximum stack size = " + c.getMaxStack() + diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java index ebce8dac..52027e50 100644 --- a/src/java/org/apache/bcel/util/BCELifier.java +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -72,7 +72,6 @@ import java.io.*; public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { private JavaClass _clazz; private PrintWriter _out; - private DescendingVisitor _visitor; private ConstantPoolGen _cp; /** @param clazz Java class to "decompile" diff --git a/src/java/org/apache/bcel/util/CodeHTML.java b/src/java/org/apache/bcel/util/CodeHTML.java index 38a442c7..08bd626b 100644 --- a/src/java/org/apache/bcel/util/CodeHTML.java +++ b/src/java/org/apache/bcel/util/CodeHTML.java @@ -105,7 +105,7 @@ final class CodeHTML implements org.apache.bcel.Constants { { short opcode = (short)bytes.readUnsignedByte(); StringBuffer buf; - String name, sig, signature; + String name, signature; int default_offset=0, low, high; int index, class_index, vindex, constant; int[] jump_table; -- GitLab From cd876a9a185329cb250ce597bcca38f2723b5e9b Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 5 Jun 2002 10:17:38 +0000 Subject: [PATCH 0103/1313] getInstance didnt return instance git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152793 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/SyntheticRepository.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/java/org/apache/bcel/util/SyntheticRepository.java index b1b7865c..561bf8ff 100644 --- a/src/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/java/org/apache/bcel/util/SyntheticRepository.java @@ -92,7 +92,14 @@ public class SyntheticRepository } public static SyntheticRepository getInstance() { - return (SyntheticRepository) instances.get( defaultPath ); + SyntheticRepository rep =(SyntheticRepository) + instances.get( defaultPath ); + + if(rep == null) { + rep = new SyntheticRepository(); // adds itself to instances + } + + return rep; } public static SyntheticRepository getInstance(String classPath) { -- GitLab From d1097aa1ee25ab0fbcd2e95d45c3a9c93537caec Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 5 Jun 2002 11:05:37 +0000 Subject: [PATCH 0104/1313] Convert class to type git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152794 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/Type.java | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index 1be04ad4..1063a217 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -229,4 +229,43 @@ public abstract class Type { vec.toArray(types); return types; } + + public static Type getType(Class cl) { + if(cl == null) { + throw new IllegalArgumentException("Class must not be null"); + } + + /* That's an amzingly easy case, because getName() returns + * the signature. That's what we would have liked anyway. + */ + if(cl.isArray()) { + return getType(cl.getName()); + } else if(cl.isPrimitive()) { + if(cl == Integer.TYPE) { + return INT; + } else if(cl == Void.TYPE) { + return VOID; + } else if(cl == Double.TYPE) { + return DOUBLE; + } else if(cl == Float.TYPE) { + return FLOAT; + } else if(cl == Boolean.TYPE) { + return BOOLEAN; + } else if(cl == Byte.TYPE) { + return BYTE; + } else if(cl == Short.TYPE) { + return SHORT; + } else if(cl == Byte.TYPE) { + return BYTE; + } else if(cl == Long.TYPE) { + return LONG; + } else if(cl == Character.TYPE) { + return CHAR; + } else { + throw new IllegalStateException("Ooops, what primitive type is " + cl); + } + } else { // "Real" class + return new ObjectType(cl.getName()); + } + } } -- GitLab From 1eebaead38900f49d50551cfec4d94190da934c8 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 5 Jun 2002 11:06:53 +0000 Subject: [PATCH 0105/1313] Convert class to type git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152795 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/Type.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index 1063a217..18f811b0 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -230,7 +230,11 @@ public abstract class Type { return types; } - public static Type getType(Class cl) { + /** Convert runtime java.lang.Class to BCEL Type object. + * @param cl Java class + * @return corresponding Type object + */ + public static Type getType(java.lang.Class cl) { if(cl == null) { throw new IllegalArgumentException("Class must not be null"); } -- GitLab From 7330038c3fb8b6c8860f025831cc4da035e33087 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 6 Jun 2002 11:30:27 +0000 Subject: [PATCH 0106/1313] new CLASS_TYPE_NAMES git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152796 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Constants.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/java/org/apache/bcel/Constants.java b/src/java/org/apache/bcel/Constants.java index bcc58d8f..89e1431b 100644 --- a/src/java/org/apache/bcel/Constants.java +++ b/src/java/org/apache/bcel/Constants.java @@ -420,12 +420,29 @@ public interface Constants { public static final byte T_UNKNOWN = 15; public static final byte T_ADDRESS = 16; + /** The primitive type names corresponding to the T_XX constants, + * e.g., TYPE_NAMES[T_INT] = "int" + */ public static final String[] TYPE_NAMES = { ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "boolean", "char", "float", "double", "byte", "short", "int", "long", "void", "array", "object", "unknown" // Non-standard }; + /** The primitive class names corresponding to the T_XX constants, + * e.g., CLASS_TYPE_NAMES[T_INT] = "java.lang.Integer" + */ + public static final String[] CLASS_TYPE_NAMES = { + ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, + "java.lang.Boolean", "java.lang.Character", "java.lang.Float", + "java.lang.Double", "java.lang.Byte", "java.lang.Short", + "java.lang.Integer", "java.lang.Long", "java.lang.Void", + ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE + }; + + /** The signature characters corresponding to primitive types, + * e.g., SHORT_TYPE_NAMES[T_INT] = "I" + */ public static final String[] SHORT_TYPE_NAMES = { ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "Z", "C", "F", "D", "B", "S", "I", "J", -- GitLab From 7642970f5d53d050ec76804634d870f96674dac2 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 6 Jun 2002 11:31:17 +0000 Subject: [PATCH 0107/1313] Delegate to Synthetic repository git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152797 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Repository.java | 163 +++++------------------ 1 file changed, 30 insertions(+), 133 deletions(-) diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index bc9b363d..73f16c83 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -54,56 +54,30 @@ package org.apache.bcel; * . */ -import org.apache.bcel.classfile.*; +import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.util.*; -import java.util.HashMap; import java.io.*; /** * The repository maintains informations about class interdependencies, e.g., - * whether a class is a sub-class of another. JavaClass objects are put - * into a cache which can be purged with clearCache(). - * - * All JavaClass objects used as arguments must have been obtained via - * the repository or been added with addClass() manually. This is - * because we have to check for real object identity (==). + * whether a class is a sub-class of another. Delegates actual class loading + * to SyntheticRepository. * * @version $Id$ - * @author M. DahmM. Dahm */ public abstract class Repository { - private static ClassPath class_path = new ClassPath(); - private static HashMap classes; - private static JavaClass OBJECT; // should be final ... - - static { clearCache(); } + private static org.apache.bcel.util.SyntheticRepository _repository = + SyntheticRepository.getInstance(); /** Lookup class somewhere found in your CLASSPATH. * @return class object for given fully qualified class name, or null * if the class could not be found or parsed correctly */ public static JavaClass lookupClass(String class_name) { - if(class_name == null || class_name.equals("")) - throw new RuntimeException("Invalid class name"); - - class_name = class_name.replace('/', '.'); - - JavaClass clazz = (JavaClass)classes.get(class_name); - - if(clazz == null) { - try { - InputStream is = class_path.getInputStream(class_name); - clazz = new ClassParser(is, class_name).parse(); - class_name = clazz.getClassName(); - } catch(IOException e) { - // Don't throw exception since there may be other ways to load - return null; - } - - classes.put(class_name, clazz); - } - - return clazz; + try { + return _repository.loadClass(class_name); + } catch(ClassNotFoundException ex) { return null; } } /** @@ -112,49 +86,23 @@ public abstract class Repository { * @return JavaClass object for given runtime class */ public static JavaClass lookupClass(Class clazz) { - String class_name = clazz.getName(); - - JavaClass j_class = (JavaClass)classes.get(class_name); - - if(j_class == null) { - String name = class_name; - int i = name.lastIndexOf('.'); - - if(i > 0) - name = name.substring(i + 1); - - try { - InputStream is = clazz.getResourceAsStream(name + ".class"); - j_class = new ClassParser(is, class_name).parse(); - } catch(IOException e) { - //System.err.println(e); - return null; // Use same behaviour as above - } - - classes.put(class_name, j_class); - } - - return j_class; + try { + return _repository.loadClass(clazz); + } catch(ClassNotFoundException ex) { return null; } } /** @return class file object for given Java class. */ public static ClassPath.ClassFile lookupClassFile(String class_name) { try { - return class_path.getClassFile(class_name); + return ClassPath.SYSTEM_CLASS_PATH.getClassFile(class_name); } catch(IOException e) { return null; } } /** Clear the repository. */ public static void clearCache() { - classes = new HashMap(); - OBJECT = lookupClass("java.lang.Object"); - - if(OBJECT == null) - System.err.println("Warning: java.lang.Object not found on CLASSPATH!"); - else - classes.put("java.lang.Object", OBJECT); + _repository.clear(); } /** @@ -163,35 +111,27 @@ public abstract class Repository { * @return old entry in repository */ public static JavaClass addClass(JavaClass clazz) { - String name = clazz.getClassName(); - JavaClass cl = (JavaClass)classes.get(name); - - if(cl == null) - classes.put(name, cl = clazz); - - return cl; + JavaClass old = _repository.findClass(clazz.getClassName()); + _repository.storeClass(clazz); + return old; } /** - * Remove class with given (fully qualifid) name from repository. + * Remove class with given (fully qualified) name from repository. */ public static void removeClass(String clazz) { - classes.remove(clazz); + _repository.removeClass(_repository.findClass(clazz)); } /** * Remove given class from repository. */ public static void removeClass(JavaClass clazz) { - removeClass(clazz.getClassName()); + _repository.removeClass(clazz); } - private static final JavaClass getSuperClass(JavaClass clazz) { - if(clazz == OBJECT) - return null; - - return lookupClass(clazz.getSuperclassName()); + return clazz.getSuperClass(); } /** @@ -199,17 +139,13 @@ public abstract class Repository { * Object is always the last element */ public static JavaClass[] getSuperClasses(JavaClass clazz) { - ClassVector vec = new ClassVector(); - - for(clazz = getSuperClass(clazz); clazz != null; clazz = getSuperClass(clazz)) - vec.addElement(clazz); - - return vec.toArray(); + return clazz.getSuperClasses(); } /** * @return list of super classes of clazz in ascending order, i.e., - * Object is always the last element. "null", if clazz cannot be found. + * Object is always the last element. return "null", if class + * cannot be found. */ public static JavaClass[] getSuperClasses(String class_name) { JavaClass jc = lookupClass(class_name); @@ -218,30 +154,11 @@ public abstract class Repository { /** * @return all interfaces implemented by class and its super - * classes and the interfaces that those interfaces extend, and so on + * classes and the interfaces that those interfaces extend, and so on. + * (Some people call this a transitive hull). */ public static JavaClass[] getInterfaces(JavaClass clazz) { - ClassVector vec = new ClassVector(); - ClassQueue queue = new ClassQueue(); - - queue.enqueue(clazz); - - while(!queue.empty()) { - clazz = queue.dequeue(); - - String s = clazz.getSuperclassName(); - String[] interfaces = clazz.getInterfaceNames(); - - if(clazz.isInterface()) - vec.addElement(clazz); - else if(!s.equals("java.lang.Object")) - queue.enqueue(lookupClass(s)); - - for(int i=0; i < interfaces.length; i++) - queue.enqueue(lookupClass(interfaces[i])); - } - - return vec.toArray(); + return clazz.getAllInterfaces(); } /** @@ -253,22 +170,11 @@ public abstract class Repository { } /** + * Equivalent to runtime "instanceof" operator. * @return true, if clazz is an instance of super_class */ public static boolean instanceOf(JavaClass clazz, JavaClass super_class) { - if(clazz == super_class) - return true; - - JavaClass[] super_classes = getSuperClasses(clazz); - - for(int i=0; i < super_classes.length; i++) - if(super_classes[i] == super_class) - return true; - - if(super_class.isInterface()) - return implementationOf(clazz, super_class); - - return false; + return clazz.instanceOf(super_class); } /** @@ -296,16 +202,7 @@ public abstract class Repository { * @return true, if clazz is an implementation of interface inter */ public static boolean implementationOf(JavaClass clazz, JavaClass inter) { - if(clazz == inter) - return true; - - JavaClass[] super_interfaces = getInterfaces(clazz); - - for(int i=0; i < super_interfaces.length; i++) - if(super_interfaces[i] == inter) - return true; - - return false; + return clazz.implementationOf(inter); } /** -- GitLab From 83bebf5b828816a663e5c6763d5bc325efba503f Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 6 Jun 2002 11:32:05 +0000 Subject: [PATCH 0108/1313] Cleanup/rebuild of Synthetic repository git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152798 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/util/SyntheticRepository.java | 185 +++++++++++------- 1 file changed, 112 insertions(+), 73 deletions(-) diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/java/org/apache/bcel/util/SyntheticRepository.java index 561bf8ff..db14a315 100644 --- a/src/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/java/org/apache/bcel/util/SyntheticRepository.java @@ -62,96 +62,135 @@ import java.util.HashMap; import org.apache.bcel.classfile.*; /** - * This repository is used in situations where a - * Class is created outside the realm of a ClassLoader. - * + * This repository is used in situations where a Class is created + * outside the realm of a ClassLoader. Classes are loaded from + * the file systems using the paths specified in the given + * class path. By default, this is the value returned by + * ClassPath.getClassPath(). + *
      * It is designed to be used as a singleton, however it * can also be used with custom classpaths. + * + * @version $Id$ + * @author M. Dahm + * @author David Dixon-Peugh */ +public class SyntheticRepository implements Repository { + private static final String DEFAULT_PATH = ClassPath.getClassPath(); + + private static HashMap _instances = new HashMap(); // CLASSPATH X REPOSITORY -public class SyntheticRepository - implements Repository -{ - private static Map instances = - new HashMap(); // CLASSPATH X REPOSITORY + private ClassPath _path = null; + private HashMap _loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS - private ClassPath path = null; - private static String defaultPath = ClassPath.getClassPath(); + private SyntheticRepository(ClassPath path) { + _path = path; + } - private Map loadedClasses = - new HashMap(); // CLASSNAME X JAVACLASS + public static SyntheticRepository getInstance() { + return getInstance(ClassPath.SYSTEM_CLASS_PATH); + } - public SyntheticRepository( String classPath ) { - path = new ClassPath( classPath ); - instances.put( classPath, this ); + public static SyntheticRepository getInstance(ClassPath classPath) { + SyntheticRepository rep = (SyntheticRepository)_instances.get(classPath); + + if(rep == null) { + rep = new SyntheticRepository(classPath); + _instances.put(classPath, rep); } - public SyntheticRepository( ) { - path = new ClassPath( ); - instances.put( ClassPath.getClassPath(), this ); + return rep; + } + + /** + * Store a new JavaClass instance into this Repository. + */ + public void storeClass(JavaClass clazz) { + _loadedClasses.put(clazz.getClassName(), clazz); + clazz.setRepository(this); + } + + /** + * Remove class from repository + */ + public void removeClass(JavaClass clazz) { + _loadedClasses.remove(clazz.getClassName()); + } + + /** + * Find an already defined JavaClass. + */ + public JavaClass findClass(String className) { + return (JavaClass)_loadedClasses.get(className); + } + + /** + * Lookup a JavaClass object from the class name provided. + */ + public JavaClass loadClass(String className) + throws ClassNotFoundException + { + if(className == null || className.equals("")) { + throw new IllegalArgumentException("Invalid class name " + className); } - public static SyntheticRepository getInstance() { - SyntheticRepository rep =(SyntheticRepository) - instances.get( defaultPath ); + className = className.replace('/', '.'); // Just in case, canonical form - if(rep == null) { - rep = new SyntheticRepository(); // adds itself to instances - } - - return rep; + try { + return loadClass(_path.getInputStream(className), className); + } catch(IOException e) { + throw new ClassNotFoundException("Exception while looking for class " + + className + ": " + e.toString()); } - - public static SyntheticRepository getInstance(String classPath) { - return (SyntheticRepository) instances.get( classPath ); + } + + /** + * Try to find class source via getResourceAsStream(). + * @see Class + * @return JavaClass object for given runtime class + */ + public JavaClass loadClass(Class clazz) throws ClassNotFoundException { + String className = clazz.getName(); + String name = className; + int i = name.lastIndexOf('.'); + + if(i > 0) { + name = name.substring(i + 1); } - /** - * Store a new JavaClass into this Repository. - */ - public void storeClass( JavaClass clazz ) { - loadedClasses.put( clazz.getClassName(), - clazz ); - } + return loadClass(clazz.getResourceAsStream(name + ".class"), className); + } + + private JavaClass loadClass(InputStream is, String className) + throws ClassNotFoundException + { + JavaClass clazz = findClass(className); - /** - * Find an already defined JavaClass. - */ - public JavaClass findClass( String className ) { - if ( loadedClasses.containsKey( className )) { - return (JavaClass) loadedClasses.get( className ); - } else { - return null; - } + if(clazz != null) { + return clazz; } - /** - * Lookup a JavaClass object from the Class Name provided. - */ - public JavaClass loadClass( String className ) - throws ClassNotFoundException - { - JavaClass RC = findClass( className ); - if (RC != null) { - return RC; - } - - try { - - InputStream is = path.getInputStream( className, ".class" ); - if (is != null) { - ClassParser parser = new ClassParser( is, className ); - RC = parser.parse(); - - storeClass( RC ); - - return RC; - } - } catch (IOException e) { - throw new ClassNotFoundException("Exception looking for class " + - className + ": " + e.toString()); - - } - throw new ClassNotFoundException("SyntheticRepository does not load new classes."); + try { + if(is != null) { + ClassParser parser = new ClassParser(is, className); + clazz = parser.parse(); + + storeClass(clazz); + + return clazz; + } + } catch(IOException e) { + throw new ClassNotFoundException("Exception while looking for class " + + className + ": " + e.toString()); } + + throw new ClassNotFoundException("SyntheticRepository could not load " + + className); + } + + /** Clear all entries from cache. + */ + public void clear() { + _loadedClasses.clear(); + } } -- GitLab From 510c0e4b24ee8804f54592a2f74932fe5660fbb7 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 6 Jun 2002 11:32:55 +0000 Subject: [PATCH 0109/1313] Remember class path, toString() git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152799 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/ClassPath.java | 26 +++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index 5725f311..a3d429d2 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -66,12 +66,17 @@ import java.io.*; * @author M. Dahm */ public class ClassPath { + public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(); + private PathEntry[] paths; + private String class_path; /** * Search for classes in given path. */ public ClassPath(String class_path) { + this.class_path = class_path; + ArrayList vec = new ArrayList(); for(StringTokenizer tok=new StringTokenizer(class_path, @@ -102,11 +107,30 @@ public class ClassPath { /** * Search for classes in CLASSPATH. + * @deprecated Use SYSTEM_CLASS_PATH constant */ public ClassPath() { this(getClassPath()); } + /** @return used class path string + */ + public String toString() { + return class_path; + } + + public int hashCode() { + return class_path.hashCode(); + } + + public boolean equals(Object o) { + if(o instanceof ClassPath) { + return class_path.equals(((ClassPath)o).class_path); + } + + return false; + } + private static final void getPathComponents(String path, ArrayList list) { if(path != null) { StringTokenizer tok = new StringTokenizer(path, File.pathSeparator); @@ -162,7 +186,7 @@ public class ClassPath { buf.append(File.pathSeparatorChar); } - return buf.toString(); + return buf.toString().intern(); } /** -- GitLab From 31545de2e1376a30636eb3a06beab9642b434235 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 6 Jun 2002 11:33:20 +0000 Subject: [PATCH 0110/1313] Added removeClass git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152800 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/util/ClassLoader.java | 48 +++++++++---------- .../bcel/util/ClassLoaderRepository.java | 7 +++ src/java/org/apache/bcel/util/Repository.java | 6 +++ 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/java/org/apache/bcel/util/ClassLoader.java b/src/java/org/apache/bcel/util/ClassLoader.java index 926042a1..1ffdde40 100644 --- a/src/java/org/apache/bcel/util/ClassLoader.java +++ b/src/java/org/apache/bcel/util/ClassLoader.java @@ -89,42 +89,40 @@ public class ClassLoader extends java.lang.ClassLoader { private String[] ignored_packages = { "java.", "javax.", "sun." }; - private Repository repository = - SyntheticRepository.getInstance(); - private java.lang.ClassLoader deferTo = ClassLoader.getSystemClassLoader(); + private Repository repository = SyntheticRepository.getInstance(); + private java.lang.ClassLoader deferTo = ClassLoader.getSystemClassLoader(); public ClassLoader() { } - public ClassLoader( java.lang.ClassLoader deferTo ) { - this.deferTo = deferTo; - this.repository = new ClassLoaderRepository( deferTo ); - } + public ClassLoader(java.lang.ClassLoader deferTo) { + this.deferTo = deferTo; + this.repository = new ClassLoaderRepository(deferTo); + } /** @param ignored_packages classes contained in these packages will be loaded * with the system class loader */ public ClassLoader(String[] ignored_packages) { - addIgnoredPkgs( ignored_packages ); + addIgnoredPkgs(ignored_packages); } - public ClassLoader( java.lang.ClassLoader deferTo, - String [] ignored_packages ) { - this.deferTo = deferTo; - this.repository = new ClassLoaderRepository( deferTo ); + public ClassLoader(java.lang.ClassLoader deferTo, String [] ignored_packages) { + this.deferTo = deferTo; + this.repository = new ClassLoaderRepository(deferTo); - addIgnoredPkgs( ignored_packages ); - } + addIgnoredPkgs(ignored_packages); + } - private void addIgnoredPkgs( String[] ignored_packages ) { - String[] new_p = new String[ignored_packages.length + this.ignored_packages.length]; + private void addIgnoredPkgs(String[] ignored_packages) { + String[] new_p = new String[ignored_packages.length + this.ignored_packages.length]; - System.arraycopy(this.ignored_packages, 0, new_p, 0, this.ignored_packages.length); - System.arraycopy(ignored_packages, 0, new_p, this.ignored_packages.length, - ignored_packages.length); + System.arraycopy(this.ignored_packages, 0, new_p, 0, this.ignored_packages.length); + System.arraycopy(ignored_packages, 0, new_p, this.ignored_packages.length, + ignored_packages.length); - this.ignored_packages = new_p; - } + this.ignored_packages = new_p; + } protected Class loadClass(String class_name, boolean resolve) throws ClassNotFoundException @@ -152,9 +150,9 @@ public class ClassLoader extends java.lang.ClassLoader { if(class_name.indexOf("$$BCEL$$") >= 0) clazz = createClass(class_name); else { // Fourth try: Load classes via repository - if ( (clazz = repository.loadClass( class_name )) != null) { - clazz = modifyClass( clazz ); - } + if ((clazz = repository.loadClass(class_name)) != null) { + clazz = modifyClass(clazz); + } else throw new ClassNotFoundException(class_name); } @@ -192,7 +190,7 @@ public class ClassLoader extends java.lang.ClassLoader { * * The default implementation interprets the string as a encoded compressed * Java class, unpacks and decodes it with the Utility.decode() method, and - * parses thee resulting byte array and returns the resulting JavaClass object. + * parses the resulting byte array and returns the resulting JavaClass object. * * @param class_name compressed byte code with "$$BCEL$$" in it */ diff --git a/src/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/java/org/apache/bcel/util/ClassLoaderRepository.java index 50f4cea8..d0fdf131 100644 --- a/src/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -89,6 +89,13 @@ public class ClassLoaderRepository clazz.setRepository( this ); } + /** + * Remove class from repository + */ + public void removeClass(JavaClass clazz) { + loadedClasses.remove(clazz.getClassName()); + } + /** * Find an already defined JavaClass. */ diff --git a/src/java/org/apache/bcel/util/Repository.java b/src/java/org/apache/bcel/util/Repository.java index 7b66d0cb..ff268c03 100644 --- a/src/java/org/apache/bcel/util/Repository.java +++ b/src/java/org/apache/bcel/util/Repository.java @@ -62,6 +62,11 @@ public interface Repository * Store the provided class under "clazz.getClassName()" */ public void storeClass( JavaClass clazz ); + + /** + * Remove class from repository + */ + public void removeClass( JavaClass clazz ); /** * Find the class with the name provided, if the class @@ -69,6 +74,7 @@ public interface Repository */ public JavaClass findClass( String className ); + /** * Find the class with the name provided, if the class * isn't there, make an attempt to load it. -- GitLab From 0bb773f5e811a1fe11c11c40c89a89c135027049 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 6 Jun 2002 11:35:43 +0000 Subject: [PATCH 0111/1313] Added repository functionality git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152801 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/JavaClass.java | 227 ++++++++++++------ 1 file changed, 151 insertions(+), 76 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 1f359b97..afde6428 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -55,8 +55,7 @@ package org.apache.bcel.classfile; */ import org.apache.bcel.Constants; -// import org.apache.bcel.Repository; -import org.apache.bcel.util.Repository; +import org.apache.bcel.Repository; import org.apache.bcel.util.SyntheticRepository; import org.apache.bcel.util.ClassVector; import org.apache.bcel.util.ClassQueue; @@ -102,13 +101,13 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { static boolean debug = false; // Debugging on/off static char sep = '/'; // directory separator - /** - * In cases where we go ahead and create something, - * use the default SyntheticRepository, because we - * don't know any better. - */ - private org.apache.bcel.util.Repository repository = - SyntheticRepository.getInstance(); + /** + * In cases where we go ahead and create something, + * use the default SyntheticRepository, because we + * don't know any better. + */ + private org.apache.bcel.util.Repository repository = + SyntheticRepository.getInstance(); /** * Constructor gets all contents as arguments. @@ -170,7 +169,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { break; } } - + /* According to the specification the following entries must be of type * `ConstantClass' but we check that anyway via the * `ConstPool.getConstant' method. @@ -289,11 +288,10 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { try { dump(ds); - ds.close(); } catch(IOException e) { e.printStackTrace(); } finally { - try { ds.close(); } catch(IOException e2) { e2.printStackTrace(); } + try { ds.close(); } catch(IOException e2) { e2.printStackTrace(); } } return s.toByteArray(); @@ -393,9 +391,9 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { public String[] getInterfaceNames() { return interface_names; } /** - * @return Implemented interfaces. + * @return Indices in constant pool of implemented interfaces. */ - public int[] getInterfaces() { return interfaces; } + public int[] getInterfaceIndices() { return interfaces; } /** * @return Major number of compiler version. @@ -440,7 +438,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { if(sep != null) try { JavaClass.sep = sep.charAt(0); - } catch(StringIndexOutOfBoundsException e) {} // Never reached + } catch(StringIndexOutOfBoundsException e) {} // Never reached } /** @@ -635,10 +633,6 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { return c; } - public final boolean instanceOf(JavaClass super_class) { - return org.apache.bcel.Repository.instanceOf(this, super_class); - } - public final boolean isSuper() { return (access_flags & Constants.ACC_SUPER) != 0; } @@ -653,70 +647,151 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { return source; } - // Added on 4/16/2002 to deprecate the old Repository class. -- DDP + /********************* New repository functionality *********************/ - /** - * Gets the ClassRepository which holds its definition. - */ - public org.apache.bcel.util.Repository getRepository() { - return repository; + /** + * Gets the ClassRepository which holds its definition. By default + * this is the same as SyntheticRepository.getInstance(); + */ + public org.apache.bcel.util.Repository getRepository() { + return repository; + } + + /** + * Sets the ClassRepository which loaded the JavaClass. + * Should be called immediately after parsing is done. + */ + public void setRepository(org.apache.bcel.util.Repository repository) { + this.repository = repository; + } + + /** Equivalent to runtime "instanceof" operator. + * + * @return true if this JavaClass is derived from teh super class + */ + public final boolean instanceOf(JavaClass super_class) { + if(this.equals(super_class)) + return true; + + JavaClass[] super_classes = getSuperClasses(); + + for(int i=0; i < super_classes.length; i++) { + if(super_classes[i].equals(super_class)) { + return true; + } } - /** - * Sets the ClassRepository which loaded the JavaClass. - * Should be called immediately after parsing is done. - */ - public void setRepository( org.apache.bcel.util.Repository repository ) { - this.repository = repository; + if(super_class.isInterface()) { + return implementationOf(super_class); } - /** - * Get the Superclass for this JavaClass object. - */ - public JavaClass getSuperclass() { - try { - return repository.loadClass( getSuperclassName() ); - } catch (ClassNotFoundException cnfe) { - System.err.println("WARNING: Could not find Superclass."); - cnfe.printStackTrace(); - return null; - } + return false; + } + + /** + * @return true, if clazz is an implementation of interface inter + */ + public boolean implementationOf(JavaClass inter) { + if(!inter.isInterface()) { + throw new IllegalArgumentException(inter.getClassName() + " is no interface"); } - /** - * Get all interfaces implemented by the JavaClass object. - */ - public JavaClass [] getAllInterfaces() { - try { - ClassQueue queue = new ClassQueue(); - ClassVector vec = new ClassVector(); - - queue.enqueue( this ); - - while (!queue.empty()) { - JavaClass clazz = queue.dequeue(); - - JavaClass souper = clazz.getSuperclass(); - String interfaces[] = clazz.getInterfaceNames(); - - if (clazz.isInterface()) { - vec.addElement( clazz ); - } else { - if (souper != null) { - queue.enqueue( souper ); - } - } - - for (int i = 0; i < interfaces.length; i++) { - queue.enqueue( repository.loadClass( interfaces[i] )); - } - } - - return vec.toArray(); - } catch (ClassNotFoundException cnfe) { - System.err.println("WARNING: Class not found."); - cnfe.printStackTrace(); - return null; + if(this.equals(inter)) { + return true; + } + + JavaClass[] super_interfaces = getAllInterfaces(); + + for(int i=0; i < super_interfaces.length; i++) { + if(super_interfaces[i].equals(inter)) { + return true; + } + } + + return false; + } + + /** + * @return the superclass for this JavaClass object, or null if this + * is java.lang.Object + */ + public JavaClass getSuperClass() { + if("java.lang.Object".equals(getSuperclassName())) { + return null; + } + + try { + return repository.loadClass(getSuperclassName()); + } catch(ClassNotFoundException e) { + System.err.println(e); + return null; + } + } + + /** + * @return list of super classes of this class in ascending order, i.e., + * java.lang.Object is always the last element + */ + public JavaClass[] getSuperClasses() { + JavaClass clazz = this; + ClassVector vec = new ClassVector(); + + for(clazz = clazz.getSuperClass(); clazz != null; + clazz = clazz.getSuperClass()) + { + vec.addElement(clazz); + } + + return vec.toArray(); + } + + /** + * Get interfaces directly implemented by this JavaClass. + */ + public JavaClass[] getInterfaces() { + String[] interfaces = getInterfaceNames(); + JavaClass[] classes = new JavaClass[interfaces.length]; + + try { + for(int i = 0; i < interfaces.length; i++) { + classes[i] = repository.loadClass(interfaces[i]); + } + } catch(ClassNotFoundException e) { + System.err.println(e); + return null; + } + + return classes; + } + + /** + * Get all interfaces implemented by this JavaClass (transitively). + */ + public JavaClass[] getAllInterfaces() { + ClassQueue queue = new ClassQueue(); + ClassVector vec = new ClassVector(); + + queue.enqueue(this); + + while(!queue.empty()) { + JavaClass clazz = queue.dequeue(); + + JavaClass souper = clazz.getSuperClass(); + JavaClass[] interfaces = clazz.getInterfaces(); + + if(clazz.isInterface()) { + vec.addElement(clazz); + } else { + if(souper != null) { + queue.enqueue(souper); } + } + + for(int i = 0; i < interfaces.length; i++) { + queue.enqueue(interfaces[i]); + } } + + return vec.toArray(); + } } -- GitLab From 3b034adec8be6773b262766ce37b464be6f1b657 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Wed, 12 Jun 2002 17:27:40 +0000 Subject: [PATCH 0112/1313] Making some updates in order to publish the Maven generated site. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152802 13f79535-47bb-0310-9956-ffa450edef68 --- LICENSE => LICENSE.txt | 0 build-maven.xml | 213 ++++++++++++++++++++++++++--------------- project.xml | 1 + 3 files changed, 138 insertions(+), 76 deletions(-) rename LICENSE => LICENSE.txt (100%) diff --git a/LICENSE b/LICENSE.txt similarity index 100% rename from LICENSE rename to LICENSE.txt diff --git a/build-maven.xml b/build-maven.xml index 9b36beed..1c6ed15e 100644 --- a/build-maven.xml +++ b/build-maven.xml @@ -17,82 +17,143 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/project.xml b/project.xml index 3c625353..9641eeca 100644 --- a/project.xml +++ b/project.xml @@ -8,6 +8,7 @@ Apache Software Foundation http://www.apache.org + bcel-logo.gif 2002 org.apache.bcel -- GitLab From 2c598045fe87fe4baf360279be64b664660f630b Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Wed, 12 Jun 2002 17:36:52 +0000 Subject: [PATCH 0113/1313] Fixing the logo entries. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152803 13f79535-47bb-0310-9956-ffa450edef68 --- project.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/project.xml b/project.xml index 9641eeca..4cb49999 100644 --- a/project.xml +++ b/project.xml @@ -8,11 +8,12 @@ Apache Software Foundation http://www.apache.org - bcel-logo.gif 2002 org.apache.bcel + bcel-logo.gif + Bytecode Engineering Library -- GitLab From 1178210ed67afd8ef5c71031c6750b3707263df1 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Thu, 13 Jun 2002 09:32:50 +0000 Subject: [PATCH 0114/1313] * Cleaned up the verifier (and some other) classes so that IntelliJ's IDEA and also (I suppose) JTest will not complain any more. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152804 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Repository.java | 6 +- .../org/apache/bcel/util/ClassLoader.java | 2 - .../bcel/verifier/VerificationResult.java | 3 - .../org/apache/bcel/verifier/Verifier.java | 28 ++--- .../bcel/verifier/VerifierAppFrame.java | 2 + .../exc/ClassConstraintException.java | 4 - .../verifier/exc/InvalidMethodException.java | 2 - .../bcel/verifier/exc/LoadingException.java | 5 +- .../verifier/statics/LocalVariableInfo.java | 1 - .../verifier/statics/LocalVariablesInfo.java | 7 -- .../bcel/verifier/statics/Pass1Verifier.java | 1 - .../bcel/verifier/statics/Pass2Verifier.java | 103 +++++++++--------- .../bcel/verifier/statics/Pass3aVerifier.java | 2 - 13 files changed, 68 insertions(+), 98 deletions(-) diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index 73f16c83..f6a0e953 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -58,7 +58,7 @@ import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.util.*; import java.io.*; -/** +/** * The repository maintains informations about class interdependencies, e.g., * whether a class is a sub-class of another. Delegates actual class loading * to SyntheticRepository. @@ -130,9 +130,11 @@ public abstract class Repository { _repository.removeClass(clazz); } + /* private static final JavaClass getSuperClass(JavaClass clazz) { return clazz.getSuperClass(); } + */ /** * @return list of super classes of clazz in ascending order, i.e., @@ -183,7 +185,7 @@ public abstract class Repository { public static boolean instanceOf(String clazz, String super_class) { return instanceOf(lookupClass(clazz), lookupClass(super_class)); } - + /** * @return true, if clazz is an instance of super_class */ diff --git a/src/java/org/apache/bcel/util/ClassLoader.java b/src/java/org/apache/bcel/util/ClassLoader.java index 1ffdde40..068e18dd 100644 --- a/src/java/org/apache/bcel/util/ClassLoader.java +++ b/src/java/org/apache/bcel/util/ClassLoader.java @@ -56,10 +56,8 @@ package org.apache.bcel.util; import java.util.Hashtable; import java.io.*; -import java.util.zip.*; import org.apache.bcel.*; import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; /** *

      Drop in replacement for the standard class loader of the JVM. You can use it diff --git a/src/java/org/apache/bcel/verifier/VerificationResult.java b/src/java/org/apache/bcel/verifier/VerificationResult.java index b296e1f6..d82a543f 100644 --- a/src/java/org/apache/bcel/verifier/VerificationResult.java +++ b/src/java/org/apache/bcel/verifier/VerificationResult.java @@ -96,9 +96,6 @@ public class VerificationResult{ /** The detailed message. */ private String detailMessage; - /** This class is not no-args instantiable. */ - private VerificationResult(){} - /** The usual constructor. */ public VerificationResult(int status, String message){ numeric = status; diff --git a/src/java/org/apache/bcel/verifier/Verifier.java b/src/java/org/apache/bcel/verifier/Verifier.java index 6e8a4285..2d3b4576 100644 --- a/src/java/org/apache/bcel/verifier/Verifier.java +++ b/src/java/org/apache/bcel/verifier/Verifier.java @@ -56,12 +56,8 @@ package org.apache.bcel.verifier; import org.apache.bcel.*; import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; -import org.apache.bcel.util.*; import org.apache.bcel.verifier.statics.*; import org.apache.bcel.verifier.structurals.*; -import org.apache.bcel.verifier.exc.*; -import org.apache.bcel.verifier.exc.Utility; // Ambigous if not declared explicitely. import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -76,7 +72,7 @@ import java.util.Iterator; * * A Verifier creates PassVerifier instances to perform the actual verification. * Verifier instances are usually generated by the VerifierFactory. - * + * * @version $Id$ * @author Enver Haase * @see org.apache.bcel.verifier.VerifierFactory @@ -112,7 +108,7 @@ public class Verifier{ } return p2v.verify(); } - + /** Returns the VerificationResult for the given pass. */ public VerificationResult doPass3a(int method_no){ String key = Integer.toString(method_no); @@ -136,13 +132,7 @@ public class Verifier{ } return p3bv.verify(); } - - /** - * This class may not be no-args instantiated. - */ - private Verifier(){ - classname = ""; // never executed anyway, make compiler happy. - }// not noargs-instantiable + /** * Instantiation is done by the VerifierFactory. @@ -230,7 +220,7 @@ public class Verifier{ for (int i=0; i< messages.size(); i++){ ret[i] = (String) messages.get(i); } - + return ret; } @@ -252,14 +242,14 @@ public class Verifier{ int dotclasspos = args[k].lastIndexOf(".class"); if (dotclasspos != -1) args[k] = args[k].substring(0,dotclasspos); } - + args[k] = args[k].replace('/', '.'); - + System.out.println("Now verifiying: "+args[k]+"\n"); Verifier v = VerifierFactory.getVerifier(args[k]); VerificationResult vr; - + vr = v.doPass1(); System.out.println("Pass 1:\n"+vr); @@ -277,7 +267,7 @@ public class Verifier{ System.out.println("Pass 3b, method number "+i+" ['"+jc.getMethods()[i]+"']:\n"+vr); } } - + System.out.println("Warnings:"); String[] warnings = v.getMessages(); if (warnings.length == 0) System.out.println(""); @@ -286,7 +276,7 @@ public class Verifier{ } System.out.println("\n"); - + // avoid swapping. v.flush(); org.apache.bcel.Repository.clearCache(); diff --git a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/java/org/apache/bcel/verifier/VerifierAppFrame.java index a18f2f2c..4a382252 100644 --- a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -291,10 +291,12 @@ public class VerifierAppFrame extends JFrame { pass2TextPane.setBackground(Color.green); JavaClass jc = Repository.lookupClass(current_class); + /* boolean all3aok = true; boolean all3bok = true; String all3amsg = ""; String all3bmsg = ""; + */ String[] methodnames = new String[jc.getMethods().length]; for (int i=0; iEnver Haase */ public class ClassConstraintException extends VerificationException{ - /** The specified error message. */ - private String detailMessage; - /** * Constructs a new ClassConstraintException with null as its error message string. */ @@ -78,6 +75,5 @@ public class ClassConstraintException extends VerificationException{ */ public ClassConstraintException(String message){ super (message); - detailMessage = message; } } diff --git a/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java index 5101b632..b7bc6bf7 100644 --- a/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java +++ b/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java @@ -61,8 +61,6 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class InvalidMethodException extends RuntimeException{ - /** Must not be no-args requested so there's always some error message. */ - private InvalidMethodException(){} /** Constructs an InvalidMethodException with the specified detail message. */ public InvalidMethodException(String message){ diff --git a/src/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/java/org/apache/bcel/verifier/exc/LoadingException.java index 4e17e6cd..e3c7c8b7 100644 --- a/src/java/org/apache/bcel/verifier/exc/LoadingException.java +++ b/src/java/org/apache/bcel/verifier/exc/LoadingException.java @@ -62,9 +62,7 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class LoadingException extends VerifierConstraintViolatedException{ - /** The specified error message. */ - private String detailMessage; - + /** * Constructs a new LoadingException with null as its error message string. */ @@ -77,6 +75,5 @@ public class LoadingException extends VerifierConstraintViolatedException{ */ public LoadingException(String message){ super (message); - detailMessage = message; } } diff --git a/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java index 2c9a7dec..1ce36e67 100644 --- a/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java +++ b/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java @@ -54,7 +54,6 @@ package org.apache.bcel.verifier.statics; * . */ -import org.apache.bcel.Constants; import org.apache.bcel.generic.Type; import org.apache.bcel.verifier.exc.*; import java.util.Hashtable; diff --git a/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java index 221e6ab9..ffb80cfe 100644 --- a/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java +++ b/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java @@ -54,7 +54,6 @@ package org.apache.bcel.verifier.statics; * . */ -import org.apache.bcel.Constants; import org.apache.bcel.generic.Type; import org.apache.bcel.verifier.exc.*; @@ -71,12 +70,6 @@ public class LocalVariablesInfo{ /** The information about the local variables is stored here. */ private LocalVariableInfo[] localVariableInfos; - /** - * The ints in the list represent code offsets where either instructions must start - * or the offset is the length of the code array. This will be verified in Pass 3a. - */ - private IntList instruction_offsets = new IntList(); - /** The constructor. */ LocalVariablesInfo(int max_locals){ localVariableInfos = new LocalVariableInfo[max_locals]; diff --git a/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index 4b1e8c00..a6064a22 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -59,7 +59,6 @@ import org.apache.bcel.Repository; import org.apache.bcel.verifier.*; import org.apache.bcel.verifier.exc.*; import org.apache.bcel.verifier.exc.Utility; -import java.util.ArrayList; /** * This PassVerifier verifies a class file according to pass 1 as diff --git a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 7c41d1fb..c9afa209 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -227,7 +227,6 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ while (supidx != 0){ supidx = jc.getSuperclassNameIndex(); - ConstantPoolGen cpg = new ConstantPoolGen(jc.getConstantPool()); Method[] methods = jc.getMethods(); for (int i=0; i= cplen)){ throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(referrer)+"'."); } Constant c = cp.getConstant(index); if (! shouldbe.isInstance(c)){ - String isnot = shouldbe.toString().substring(shouldbe.toString().lastIndexOf(".")+1); //Cut all before last "." + /* String isnot = shouldbe.toString().substring(shouldbe.toString().lastIndexOf(".")+1); //Cut all before last "." */ throw new ClassCastException("Illegal constant '"+tostring(c)+"' at index '"+index+"'. '"+tostring(referrer)+"' expects a '"+shouldbe+"'."); } } @@ -335,11 +338,11 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ Attribute[] atts = obj.getAttributes(); boolean foundSourceFile = false; boolean foundInnerClasses = false; - + // Is there an InnerClass referenced? // This is a costly check; existing verifiers don't do it! boolean hasInnerClass = new InnerClassDetector(jc).innerClassReferenced(); - + for (int i=0; i 1){ throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); } - + if (obj.isFinal() && obj.isVolatile()){ throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_FINAL, ACC_VOLATILE modifiers set."); } @@ -484,7 +487,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - + String name = obj.getName(); if (! validFieldName(name)){ throw new ClassConstraintException("Field '"+tostring(obj)+"' has illegal name '"+obj.getName()+"'."); @@ -492,16 +495,16 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ // A descriptor is often named signature in BCEL checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); - + String sig = ((ConstantUtf8) (cp.getConstant(obj.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) try{ - Type t = Type.getType(sig); + Type.getType(sig); /* Don't need the return value */ } catch (ClassFormatError cfe){ // sometimes BCEL is a little harsh describing exceptional situations. throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'."); } - + String nameanddesc = (name+sig); if (field_names_and_desc.contains(nameanddesc)){ throw new ClassConstraintException("No two fields (like '"+tostring(obj)+"') are allowed have same names and descriptors!"); @@ -511,7 +514,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } field_names_and_desc.add(nameanddesc); field_names.add(name); - + Attribute[] atts = obj.getAttributes(); for (int i=0; i 1){ throw new ClassConstraintException("Method '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); } - + if (obj.isAbstract()){ if (obj.isFinal()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_FINAL modifier set."); if (obj.isNative()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_NATIVE modifier set."); @@ -681,14 +684,14 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ // zero or one SourceFile attr per ClassFile: see visitJavaClass() checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); if (! name.equals("SourceFile")){ throw new ClassConstraintException("The SourceFile attribute '"+tostring(obj)+"' is not correctly named 'SourceFile' but '"+name+"'."); } checkIndex(obj, obj.getSourceFileIndex(), CONST_Utf8); - + String sourcefilename = ((ConstantUtf8) cp.getConstant(obj.getSourceFileIndex())).getBytes(); //==obj.getSourceFileName() ? String sourcefilenamelc = sourcefilename.toLowerCase(); @@ -717,7 +720,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ public void visitInnerClasses(InnerClasses obj){//vmspec2 4.7.5 // exactly one InnerClasses attr per ClassFile if some inner class is refernced: see visitJavaClass() - + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); @@ -726,7 +729,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } InnerClass[] ics = obj.getInnerClasses(); - + for (int i=0; i= code.getMaxLocals()){ throw new ClassConstraintException("LocalVariableTable attribute '"+tostring(lvt)+"' references a LocalVariable '"+tostring(localvariables[i])+"' with an index that exceeds the surrounding Code attribute's max_locals value of '"+code.getMaxLocals()+"'."); } - + try{ localVariablesInfos[method_number].add(localindex, localname, localvariables[i].getStartPC(), localvariables[i].getLength(), t); } @@ -936,7 +938,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+"' found in Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"'). "+lviie.getMessage()); } }// for all local variables localvariables[i] in the LocalVariableTable attribute atts[a] END - + num_of_lvt_attribs++; if (num_of_lvt_attribs > obj.getMaxLocals()){ throw new ClassConstraintException("Number of LocalVariableTable attributes of Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"') exceeds number of local variable slots '"+obj.getMaxLocals()+"' ('There may be no more than one LocalVariableTable attribute per local variable in the Code attribute.')."); @@ -944,7 +946,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ }// if atts[a] instanceof LocalVariableTable END }// for all attributes atts[a] END }// visitCode(Code) END - + public void visitExceptionTable(ExceptionTable obj){//vmspec2 4.7.4 // incorrectly named, it's the Exceptions attribute (vmspec2 4.7.4) checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -953,16 +955,16 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ if (! name.equals("Exceptions")){ throw new ClassConstraintException("The Exceptions attribute '"+tostring(obj)+"' is not correctly named 'Exceptions' but '"+name+"'."); } - + int[] exc_indices = obj.getExceptionIndexTable(); for (int i=0; i Date: Thu, 13 Jun 2002 13:43:24 +0000 Subject: [PATCH 0115/1313] getModifiers() alias git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152805 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/AccessFlags.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/AccessFlags.java b/src/java/org/apache/bcel/classfile/AccessFlags.java index b909ae0f..abb9e2d5 100644 --- a/src/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/java/org/apache/bcel/classfile/AccessFlags.java @@ -76,17 +76,29 @@ public abstract class AccessFlags { } /** - * @return Access flags of the object. + * @return Access flags of the object aka. "modifiers". */ public final int getAccessFlags() { return access_flags; } - /** + /** + * @return Access flags of the object aka. "modifiers". + */ + public final int getModifiers() { return access_flags; } + + /** Set access flags aka "modifiers". * @param access_flags Access flags of the object. */ public final void setAccessFlags(int access_flags) { this.access_flags = access_flags; } + /** Set access flags aka "modifiers". + * @param access_flags Access flags of the object. + */ + public final void setModifiers(int access_flags) { + setAccessFlags(access_flags); + } + private final void setFlag(int flag, boolean set) { if((access_flags & flag) != 0) { // Flag is set already if(!set) // Delete flag ? -- GitLab From a01974a6ded9e529dbcf84072913d2b8bb47be03 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 13 Jun 2002 13:44:23 +0000 Subject: [PATCH 0116/1313] getMethod() for reflect.method git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152806 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/JavaClass.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index afde6428..6b68cff0 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -59,6 +59,7 @@ import org.apache.bcel.Repository; import org.apache.bcel.util.SyntheticRepository; import org.apache.bcel.util.ClassVector; import org.apache.bcel.util.ClassQueue; +import org.apache.bcel.generic.Type; import java.io.*; import java.util.StringTokenizer; @@ -396,7 +397,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { public int[] getInterfaceIndices() { return interfaces; } /** - * @return Major number of compiler version. + * @return Major number of class file version. */ public int getMajor() { return major; } @@ -406,7 +407,25 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { public Method[] getMethods() { return methods; } /** - * @return Minor number of compiler version. + * @return A org.apache.bcel.classfile.Method corresponding to + * java.lang.reflect.Method if any + */ + public Method getMethod(java.lang.reflect.Method m) { + for(int i = 0; i < methods.length; i++) { + Method method = methods[i]; + + if(m.getName().equals(method.getName()) && + (m.getModifiers() == method.getModifiers()) && + Type.getSignature(m).equals(method.getSignature())) { + return method; + } + } + + return null; + } + + /** + * @return Minor number of class file version. */ public int getMinor() { return minor; } -- GitLab From 5e4a38cdbbf363b3be6cf200fcf0c8e82f02f1ed Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 13 Jun 2002 13:45:00 +0000 Subject: [PATCH 0117/1313] get signature of reflect.Method git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152807 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/Type.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index 18f811b0..768bcd19 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -272,4 +272,17 @@ public abstract class Type { return new ObjectType(cl.getName()); } } + + public static String getSignature(java.lang.reflect.Method meth) { + StringBuffer sb = new StringBuffer("("); + Class[] params = meth.getParameterTypes(); // avoid clone + + for(int j = 0; j < params.length; j++) { + sb.append(getType(params[j]).getSignature()); + } + + sb.append(")"); + sb.append(getType(meth.getReturnType()).getSignature()); + return sb.toString(); + } } -- GitLab From d9523a7f55f322c81356329fee5672dc8d17f351 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sat, 29 Jun 2002 15:14:43 +0000 Subject: [PATCH 0118/1313] Bug fix for finally git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152808 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/BCELFactory.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/util/BCELFactory.java b/src/java/org/apache/bcel/util/BCELFactory.java index 01386ec2..21cdcd3b 100644 --- a/src/java/org/apache/bcel/util/BCELFactory.java +++ b/src/java/org/apache/bcel/util/BCELFactory.java @@ -335,13 +335,15 @@ class BCELFactory extends EmptyVisitor { CodeExceptionGen[] handlers = _mg.getExceptionHandlers(); for(int i=0; i < handlers.length; i++) { - CodeExceptionGen h = handlers[i]; + CodeExceptionGen h = handlers[i]; + String type = (h.getCatchType() == null)? + "null" : BCELifier.printType(h.getCatchType()); _out.println(" method.addExceptionHandler(" + "ih_" + h.getStartPC().getPosition() + ", " + "ih_" + h.getEndPC().getPosition() + ", " + "ih_" + h.getHandlerPC().getPosition() + ", " + - BCELifier.printType(h.getCatchType()) + ");"); + type + ");"); } } } -- GitLab From 5da2618d00b5d8d1240a5ff93b94c644abf2432d Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sat, 29 Jun 2002 15:15:14 +0000 Subject: [PATCH 0119/1313] added createInstanceOf git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152809 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/InstructionFactory.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/java/org/apache/bcel/generic/InstructionFactory.java b/src/java/org/apache/bcel/generic/InstructionFactory.java index a6213d89..8aff73f7 100644 --- a/src/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/java/org/apache/bcel/generic/InstructionFactory.java @@ -525,6 +525,13 @@ public class InstructionFactory implements InstructionConstants { return new CHECKCAST(cp.addClass((ObjectType)t)); } + public INSTANCEOF createInstanceOf(ReferenceType t) { + if(t instanceof ArrayType) + return new INSTANCEOF(cp.addArrayClass((ArrayType)t)); + else + return new INSTANCEOF(cp.addClass((ObjectType)t)); + } + public NEW createNew(ObjectType t) { return new NEW(cp.addClass(t)); } -- GitLab From 8351625a7710f5e1eb146bef3adbf72e3bdfa0db Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Thu, 4 Jul 2002 21:12:34 +0000 Subject: [PATCH 0120/1313] Removed redundant import statement. Fixed two @param s. Changed a lot of undocumented @param s not to have a dot directly after the parameter name, but rather have a space in-between them. This helps not to confuse certain parsers, such as IDEA's. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152810 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/JavaClass.java | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 6b68cff0..4728171c 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -55,7 +55,6 @@ package org.apache.bcel.classfile; */ import org.apache.bcel.Constants; -import org.apache.bcel.Repository; import org.apache.bcel.util.SyntheticRepository; import org.apache.bcel.util.ClassVector; import org.apache.bcel.util.ClassQueue; @@ -203,8 +202,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { /** * Constructor gets all contents as arguments. * - * @param class_name Class name - * @param superclass_name Superclass name + * @param class_name_index Class name + * @param superclass_name_index Superclass name * @param file_name File name * @param major Major compiler version * @param minor Minor compiler version @@ -461,35 +460,35 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { } /** - * @param attributes. + * @param attributes . */ public void setAttributes(Attribute[] attributes) { this.attributes = attributes; } /** - * @param class_name. + * @param class_name . */ public void setClassName(String class_name) { this.class_name = class_name; } /** - * @param class_name_index. + * @param class_name_index . */ public void setClassNameIndex(int class_name_index) { this.class_name_index = class_name_index; } /** - * @param constant_pool. + * @param constant_pool . */ public void setConstantPool(ConstantPool constant_pool) { this.constant_pool = constant_pool; } /** - * @param fields. + * @param fields . */ public void setFields(Field[] fields) { this.fields = fields; @@ -503,35 +502,35 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { } /** - * @param interface_names. + * @param interface_names . */ public void setInterfaceNames(String[] interface_names) { this.interface_names = interface_names; } /** - * @param interfaces. + * @param interfaces . */ public void setInterfaces(int[] interfaces) { this.interfaces = interfaces; } /** - * @param major. + * @param major . */ public void setMajor(int major) { this.major = major; } /** - * @param methods. + * @param methods . */ public void setMethods(Method[] methods) { this.methods = methods; } /** - * @param minor. + * @param minor . */ public void setMinor(int minor) { this.minor = minor; @@ -545,14 +544,14 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { } /** - * @param superclass_name. + * @param superclass_name . */ public void setSuperclassName(String superclass_name) { this.superclass_name = superclass_name; } /** - * @param superclass_name_index. + * @param superclass_name_index . */ public void setSuperclassNameIndex(int superclass_name_index) { this.superclass_name_index = superclass_name_index; -- GitLab From 05d0ec96b7666073158866909e1311aed209c006 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Thu, 4 Jul 2002 21:44:42 +0000 Subject: [PATCH 0121/1313] Removed unnecessary import statement. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152811 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/structurals/Pass3bVerifier.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 642fc1e9..dfb99c1d 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -56,7 +56,6 @@ package org.apache.bcel.verifier.structurals; import java.io.*; import java.util.ArrayList; -import java.util.Iterator; import java.util.Random; import java.util.Vector; import org.apache.bcel.Constants; -- GitLab From 93c105990997b66b1a9f7569b2b24442dda3a240 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Thu, 4 Jul 2002 22:16:42 +0000 Subject: [PATCH 0122/1313] Fixed two minor bugs. Commented out assigns to unused variables. Removed unnecessary import statements. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152812 13f79535-47bb-0310-9956-ffa450edef68 --- .../structurals/InstConstraintVisitor.java | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index e2634c30..01bfeabb 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -62,19 +62,14 @@ import org.apache.bcel.classfile.ConstantDouble; import org.apache.bcel.classfile.ConstantInteger; import org.apache.bcel.classfile.ConstantFieldref; import org.apache.bcel.classfile.ConstantFloat; -import org.apache.bcel.classfile.ConstantInterfaceMethodref; import org.apache.bcel.classfile.ConstantLong; -import org.apache.bcel.classfile.ConstantNameAndType; import org.apache.bcel.classfile.ConstantString; -import org.apache.bcel.classfile.ConstantUtf8; import org.apache.bcel.classfile.Field; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.generic.*; import org.apache.bcel.verifier.*; import org.apache.bcel.verifier.exc.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Hashtable; + /** * A Visitor class testing for valid preconditions of JVM instructions. @@ -330,7 +325,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc // visitLoadClass(o) has been called before: Every FieldOrMethod // implements LoadClass. // visitCPInstruction(o) has been called before. -//TODO + //TODO } /** @@ -432,7 +427,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc constraintViolated(o, "Reference type expected on top of stack, but is: '"+stack().peek()+"'."); } referenceTypeIsInitialized(o, (ReferenceType) (stack().peek())); - ReferenceType objectref = (ReferenceType) (stack().peek()); + //ReferenceType objectref = (ReferenceType) (stack().peek()); // TODO: This can only be checked if using Staerk-et-al's "set of object types" instead of a // "wider cast object type" created during verification. //if (! (objectref.isAssignmentCompatibleWith(mg.getType())) ){ @@ -608,7 +603,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc Type value = stack().peek(0); indexOfInt(o, index); - valueOfInt(o, index); + valueOfInt(o, value); if (arrayrefOfArrayType(o, arrayref)){ if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ) @@ -650,7 +645,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc Type value = stack().peek(0); indexOfInt(o, index); - valueOfInt(o, index); + valueOfInt(o, value); if (arrayrefOfArrayType(o, arrayref)){ if (! ((ArrayType) arrayref).getElementType().equals(Type.CHAR) ){ constraintViolated(o, "The 'arrayref' does not refer to an array with elements of type char but to an array of type "+((ArrayType) arrayref).getElementType()+"."); @@ -1639,7 +1634,8 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc constraintViolated(o, "The 'count' argument must not be 0."); } // It is a ConstantInterfaceMethodref, Pass 3a made it sure. - ConstantInterfaceMethodref cimr = (ConstantInterfaceMethodref) (cpg.getConstant(o.getIndex())); + // TODO: Do we want to do anything with it? + //ConstantInterfaceMethodref cimr = (ConstantInterfaceMethodref) (cpg.getConstant(o.getIndex())); // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). @@ -1668,8 +1664,8 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } if (! fromStack.equals(fromDesc)){ if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ - ReferenceType rFromStack = (ReferenceType) fromStack; - ReferenceType rFromDesc = (ReferenceType) fromDesc; + //ReferenceType rFromStack = (ReferenceType) fromStack; + //ReferenceType rFromDesc = (ReferenceType) fromDesc; // TODO: This can only be checked when using Staerk-et-al's "set of object types" // instead of a "wider cast object type" created during verification. //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ @@ -1699,10 +1695,8 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } } - String objref_classname = ((ObjectType) objref).getClassName(); - - String theInterface = o.getClassName(cpg); - + // String objref_classname = ((ObjectType) objref).getClassName(); + // String theInterface = o.getClassName(cpg); // TODO: This can only be checked if we're using Staerk-et-al's "set of object types" // instead of "wider cast object types" generated during verification. //if ( ! Repository.implementationOf(objref_classname, theInterface) ){ -- GitLab From 002ec56d2ffd405e3fa61370c9b43d03df015575 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sat, 6 Jul 2002 15:49:49 +0000 Subject: [PATCH 0123/1313] Bug fix #10490 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152813 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/JavaClass.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 4728171c..8ec546cd 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -734,7 +734,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { * is java.lang.Object */ public JavaClass getSuperClass() { - if("java.lang.Object".equals(getSuperclassName())) { + if("java.lang.Object".equals(getClassName())) { return null; } -- GitLab From 6f6e87d76c0297c3dd5db18aa002e407be3754bf Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sat, 6 Jul 2002 15:51:34 +0000 Subject: [PATCH 0124/1313] Bug fix #10517 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152814 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Repository.java | 8 +++++++- src/java/org/apache/bcel/util/SyntheticRepository.java | 7 ++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index f6a0e953..bb610668 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -76,7 +76,13 @@ public abstract class Repository { */ public static JavaClass lookupClass(String class_name) { try { - return _repository.loadClass(class_name); + JavaClass clazz = _repository.findClass(class_name); + + if(clazz == null) { + return _repository.loadClass(class_name); + } else { + return clazz; + } } catch(ClassNotFoundException ex) { return null; } } diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/java/org/apache/bcel/util/SyntheticRepository.java index db14a315..4efb7021 100644 --- a/src/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/java/org/apache/bcel/util/SyntheticRepository.java @@ -108,7 +108,7 @@ public class SyntheticRepository implements Repository { public void storeClass(JavaClass clazz) { _loadedClasses.put(clazz.getClassName(), clazz); clazz.setRepository(this); - } + } /** * Remove class from repository @@ -118,14 +118,15 @@ public class SyntheticRepository implements Repository { } /** - * Find an already defined JavaClass. + * Find an already defined (cached) JavaClass object by name. */ public JavaClass findClass(String className) { return (JavaClass)_loadedClasses.get(className); } /** - * Lookup a JavaClass object from the class name provided. + * Load a JavaClass object for the given class name using + * the CLASSPATH environment variable. */ public JavaClass loadClass(String className) throws ClassNotFoundException -- GitLab From 88f2adc132a8cc84d62f403c82ebab3924cd15f2 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 11 Jul 2002 19:39:05 +0000 Subject: [PATCH 0125/1313] make everything serialzable git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152815 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/AccessFlags.java | 2 +- src/java/org/apache/bcel/classfile/Attribute.java | 6 +++--- .../org/apache/bcel/classfile/AttributeReader.java | 11 +++++------ src/java/org/apache/bcel/classfile/CodeException.java | 4 +++- src/java/org/apache/bcel/classfile/Constant.java | 2 +- src/java/org/apache/bcel/classfile/ConstantPool.java | 3 +-- src/java/org/apache/bcel/classfile/JavaClass.java | 2 +- src/java/org/apache/bcel/classfile/LineNumber.java | 2 +- src/java/org/apache/bcel/classfile/LocalVariable.java | 4 +++- .../org/apache/bcel/generic/CodeExceptionGen.java | 3 ++- src/java/org/apache/bcel/generic/ConstantPoolGen.java | 4 ++-- .../org/apache/bcel/generic/InstructionFactory.java | 4 +++- src/java/org/apache/bcel/generic/LineNumberGen.java | 4 +++- .../org/apache/bcel/generic/LocalVariableGen.java | 5 ++++- src/java/org/apache/bcel/generic/Type.java | 2 +- src/java/org/apache/bcel/util/ClassPath.java | 4 ++-- src/java/org/apache/bcel/util/ClassQueue.java | 2 +- src/java/org/apache/bcel/util/ClassStack.java | 2 +- src/java/org/apache/bcel/util/ClassVector.java | 2 +- src/java/org/apache/bcel/util/Repository.java | 3 +-- 20 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/AccessFlags.java b/src/java/org/apache/bcel/classfile/AccessFlags.java index abb9e2d5..121ad5b9 100644 --- a/src/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/java/org/apache/bcel/classfile/AccessFlags.java @@ -63,7 +63,7 @@ import org.apache.bcel.Constants; * @version $Id$ * @author M. Dahm */ -public abstract class AccessFlags { +public abstract class AccessFlags implements java.io.Serializable { protected int access_flags; public AccessFlags() {} diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index 270e7ce2..857c7e50 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -80,7 +80,7 @@ import java.util.HashMap; * @see Deprecated * @see Signature */ -public abstract class Attribute implements Cloneable, Node { +public abstract class Attribute implements Cloneable, Node, Serializable { protected int name_index; // Points to attribute name in constant pool protected int length; // Content length of attribute field protected byte tag; // Tag to distiguish subclasses @@ -149,7 +149,7 @@ public abstract class Attribute implements Cloneable, Node { * @throws ClassFormatException */ public static final Attribute readAttribute(DataInputStream file, - ConstantPool constant_pool) + ConstantPool constant_pool) throws IOException, ClassFormatException { ConstantUtf8 c; @@ -159,7 +159,7 @@ public abstract class Attribute implements Cloneable, Node { byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute // Get class name from constant pool via `name_index' indirection - name_index = (int)(file.readUnsignedShort()); + name_index = (int)file.readUnsignedShort(); c = (ConstantUtf8)constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8); name = c.getBytes(); diff --git a/src/java/org/apache/bcel/classfile/AttributeReader.java b/src/java/org/apache/bcel/classfile/AttributeReader.java index a179e5fb..c031345c 100644 --- a/src/java/org/apache/bcel/classfile/AttributeReader.java +++ b/src/java/org/apache/bcel/classfile/AttributeReader.java @@ -55,10 +55,9 @@ package org.apache.bcel.classfile; */ /** - * Unknown (non-standard) attributes may be read via user-defined factory * objects that can be registered with the Attribute.addAttributeReader - * method. These factory objects should implement this interface. + * method. These factory objects should implement this interface. * @see Attribute * @version $Id$ @@ -91,8 +90,8 @@ public interface AttributeReader { @see Attribute#addAttributeReader( String, AttributeReader ) */ - public Attribute createAttribute( int name_index, - int length, - java.io.DataInputStream file, - ConstantPool constant_pool ); + public Attribute createAttribute(int name_index, + int length, + java.io.DataInputStream file, + ConstantPool constant_pool); } diff --git a/src/java/org/apache/bcel/classfile/CodeException.java b/src/java/org/apache/bcel/classfile/CodeException.java index e90d70c0..6875ed9d 100644 --- a/src/java/org/apache/bcel/classfile/CodeException.java +++ b/src/java/org/apache/bcel/classfile/CodeException.java @@ -66,7 +66,9 @@ import java.io.*; * @author M. Dahm * @see Code */ -public final class CodeException implements Cloneable, Constants, Node { +public final class CodeException + implements Cloneable, Constants, Node, Serializable +{ private int start_pc; // Range in the code the exception handler is private int end_pc; // active. start_pc is inclusive, end_pc exclusive private int handler_pc; /* Starting address of exception handler, i.e., diff --git a/src/java/org/apache/bcel/classfile/Constant.java b/src/java/org/apache/bcel/classfile/Constant.java index 9fdc15e5..2a014a7c 100644 --- a/src/java/org/apache/bcel/classfile/Constant.java +++ b/src/java/org/apache/bcel/classfile/Constant.java @@ -65,7 +65,7 @@ import java.io.*; * @version $Id$ * @author M. Dahm */ -public abstract class Constant implements Cloneable, Node { +public abstract class Constant implements Cloneable, Node, Serializable { /* In fact this tag is redundant since we can distinguish different * `Constant' objects by their type, i.e., via `instanceof'. In some * places we will use the tag for switch()es anyway. diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/java/org/apache/bcel/classfile/ConstantPool.java index 3da591c0..524b775a 100644 --- a/src/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/java/org/apache/bcel/classfile/ConstantPool.java @@ -58,7 +58,6 @@ import org.apache.bcel.Constants; import java.io.*; /** - * This class represents the constant pool, i.e., a table of constants, of * a parsed classfile. It may contain null references, due to the JVM * specification that skips an entry after an 8-byte constant (double, @@ -71,7 +70,7 @@ import java.io.*; * @see org.apache.bcel.generic.ConstantPoolGen * @author M. Dahm */ -public class ConstantPool implements Cloneable, Node { +public class ConstantPool implements Cloneable, Node, Serializable { private int constant_pool_count; private Constant[] constant_pool; diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 8ec546cd..8f931fa6 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -106,7 +106,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { * use the default SyntheticRepository, because we * don't know any better. */ - private org.apache.bcel.util.Repository repository = + private transient org.apache.bcel.util.Repository repository = SyntheticRepository.getInstance(); /** diff --git a/src/java/org/apache/bcel/classfile/LineNumber.java b/src/java/org/apache/bcel/classfile/LineNumber.java index c7ff87ad..646cbf84 100644 --- a/src/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/java/org/apache/bcel/classfile/LineNumber.java @@ -66,7 +66,7 @@ import java.io.*; * @author M. Dahm * @see LineNumberTable */ -public final class LineNumber implements Cloneable, Node { +public final class LineNumber implements Cloneable, Node, Serializable { private int start_pc; // Program Counter (PC) corresponds to line private int line_number; // number in source file diff --git a/src/java/org/apache/bcel/classfile/LocalVariable.java b/src/java/org/apache/bcel/classfile/LocalVariable.java index 0ff01c67..e94006e7 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariable.java @@ -65,7 +65,9 @@ import java.io.*; * @author M. Dahm * @see LocalVariableTable */ -public final class LocalVariable implements Constants, Cloneable, Node { +public final class LocalVariable + implements Constants, Cloneable, Node, Serializable +{ private int start_pc; // Range in which the variable is valid private int length; private int name_index; // Index in constant pool of variable name diff --git a/src/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/java/org/apache/bcel/generic/CodeExceptionGen.java index 1f58b28d..d39aa7b3 100644 --- a/src/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -72,7 +72,8 @@ import org.apache.bcel.classfile.*; * @see CodeException * @see InstructionHandle */ -public final class CodeExceptionGen implements InstructionTargeter, Cloneable { +public final class CodeExceptionGen + implements InstructionTargeter, Cloneable, java.io.Serializable { private InstructionHandle start_pc; private InstructionHandle end_pc; private InstructionHandle handler_pc; diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/java/org/apache/bcel/generic/ConstantPoolGen.java index 0ec2a373..bdf77051 100644 --- a/src/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -72,7 +72,7 @@ import java.util.HashMap; * @author M. Dahm * @see Constant */ -public class ConstantPoolGen { +public class ConstantPoolGen implements java.io.Serializable { protected int size = 1024; // Inital size, sufficient in most cases protected Constant[] constants = new Constant[size]; protected int index = 1; // First entry (0) used by JVM @@ -82,7 +82,7 @@ public class ConstantPoolGen { private static final String FIELDREF_DELIM = "&"; private static final String NAT_DELIM = "%"; - private static class Index { + private static class Index implements java.io.Serializable { int index; Index(int i) { index = i; } } diff --git a/src/java/org/apache/bcel/generic/InstructionFactory.java b/src/java/org/apache/bcel/generic/InstructionFactory.java index 8aff73f7..cf6ed1ec 100644 --- a/src/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/java/org/apache/bcel/generic/InstructionFactory.java @@ -65,7 +65,9 @@ import org.apache.bcel.Constants; * @author M. Dahm * @see Constants */ -public class InstructionFactory implements InstructionConstants { +public class InstructionFactory + implements InstructionConstants, java.io.Serializable +{ protected ClassGen cg; protected ConstantPoolGen cp; diff --git a/src/java/org/apache/bcel/generic/LineNumberGen.java b/src/java/org/apache/bcel/generic/LineNumberGen.java index 8b7cbde2..053ffdda 100644 --- a/src/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/java/org/apache/bcel/generic/LineNumberGen.java @@ -66,7 +66,9 @@ import org.apache.bcel.classfile.*; * @see LineNumber * @see MethodGen */ -public class LineNumberGen implements InstructionTargeter, Cloneable { +public class LineNumberGen + implements InstructionTargeter, Cloneable, java.io.Serializable +{ private InstructionHandle ih; private int src_line; diff --git a/src/java/org/apache/bcel/generic/LocalVariableGen.java b/src/java/org/apache/bcel/generic/LocalVariableGen.java index 88ae71aa..2493c77f 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/java/org/apache/bcel/generic/LocalVariableGen.java @@ -68,7 +68,10 @@ import org.apache.bcel.classfile.*; * @see LocalVariable * @see MethodGen */ -public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Cloneable { +public class LocalVariableGen + implements InstructionTargeter, NamedAndTyped, Cloneable, + java.io.Serializable +{ private int index; private String name; private Type type; diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index 768bcd19..391169dd 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -66,7 +66,7 @@ import java.util.ArrayList; * @version $Id$ * @author M. Dahm */ -public abstract class Type { +public abstract class Type implements java.io.Serializable { protected byte type; protected String signature; // signature for the type diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index a3d429d2..a17690c3 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -65,7 +65,7 @@ import java.io.*; * @version $Id$ * @author M. Dahm */ -public class ClassPath { +public class ClassPath implements Serializable { public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(); private PathEntry[] paths; @@ -292,7 +292,7 @@ public class ClassPath { return getClassFile(name, suffix).getPath(); } - private static abstract class PathEntry { + private static abstract class PathEntry implements Serializable { abstract ClassFile getClassFile(String name, String suffix) throws IOException; } diff --git a/src/java/org/apache/bcel/util/ClassQueue.java b/src/java/org/apache/bcel/util/ClassQueue.java index 134c93b3..a8227f03 100644 --- a/src/java/org/apache/bcel/util/ClassQueue.java +++ b/src/java/org/apache/bcel/util/ClassQueue.java @@ -64,7 +64,7 @@ import org.apache.bcel.classfile.JavaClass; * @author M. Dahm * @see ClassVector */ -public class ClassQueue { +public class ClassQueue implements java.io.Serializable { protected ArrayList vec = new ArrayList(); public void enqueue(JavaClass clazz) { vec.add(clazz); } diff --git a/src/java/org/apache/bcel/util/ClassStack.java b/src/java/org/apache/bcel/util/ClassStack.java index 79b0af05..de3bd986 100644 --- a/src/java/org/apache/bcel/util/ClassStack.java +++ b/src/java/org/apache/bcel/util/ClassStack.java @@ -63,7 +63,7 @@ import org.apache.bcel.classfile.JavaClass; * @author M. Dahm * @see Stack */ -public class ClassStack { +public class ClassStack implements java.io.Serializable { private Stack stack = new Stack(); public void push(JavaClass clazz) { stack.push(clazz); } diff --git a/src/java/org/apache/bcel/util/ClassVector.java b/src/java/org/apache/bcel/util/ClassVector.java index a04f0721..58b221dd 100644 --- a/src/java/org/apache/bcel/util/ClassVector.java +++ b/src/java/org/apache/bcel/util/ClassVector.java @@ -64,7 +64,7 @@ import org.apache.bcel.classfile.JavaClass; * @author M. Dahm * @see ClassQueue */ -public class ClassVector { +public class ClassVector implements java.io.Serializable { protected ArrayList vec = new ArrayList(); public void addElement(JavaClass clazz) { vec.add(clazz); } diff --git a/src/java/org/apache/bcel/util/Repository.java b/src/java/org/apache/bcel/util/Repository.java index ff268c03..aac03859 100644 --- a/src/java/org/apache/bcel/util/Repository.java +++ b/src/java/org/apache/bcel/util/Repository.java @@ -56,8 +56,7 @@ package org.apache.bcel.util; import org.apache.bcel.classfile.JavaClass; -public interface Repository -{ +public interface Repository extends java.io.Serializable { /** * Store the provided class under "clazz.getClassName()" */ -- GitLab From 8e562f339ed058edd3b52641174f87fd712901fa Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Mon, 29 Jul 2002 20:32:05 +0000 Subject: [PATCH 0126/1313] Add WWW link. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152816 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/Verifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/Verifier.java b/src/java/org/apache/bcel/verifier/Verifier.java index 2d3b4576..932a39d3 100644 --- a/src/java/org/apache/bcel/verifier/Verifier.java +++ b/src/java/org/apache/bcel/verifier/Verifier.java @@ -235,7 +235,7 @@ public class Verifier{ * into the BCEL Repository yourself (via 'addClass(JavaClass)'). */ public static void main(String [] args){ - System.out.println("JustIce by Enver Haase, (C) 2001. http://bcel.sourceforge.net\n"); + System.out.println("JustIce by Enver Haase, (C) 2001-2002.\n\n\n"); for(int k=0; k < args.length; k++) { if (args[k].endsWith(".class")){ -- GitLab From 26119d241097374f6f800cfa3a81aa0c28f78bf0 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 31 Jul 2002 18:12:07 +0000 Subject: [PATCH 0127/1313] Check for null git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152817 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/ClassLoaderRepository.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/java/org/apache/bcel/util/ClassLoaderRepository.java index d0fdf131..10d19266 100644 --- a/src/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -121,6 +121,10 @@ public class ClassLoaderRepository try { InputStream is = loader.getResourceAsStream( classFile + ".class" ); + + if(is == null) { + throw new ClassNotFoundException(className + " not found."); + } ClassParser parser = new ClassParser( is, className ); RC = parser.parse(); -- GitLab From 51916ad90a28ec44874b6fa00d5e6c4fb0588e97 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Thu, 1 Aug 2002 22:36:07 +0000 Subject: [PATCH 0128/1313] Remove unused import. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152818 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/Type.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index 391169dd..79a0b3d1 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -56,7 +56,6 @@ package org.apache.bcel.generic; import org.apache.bcel.Constants; import org.apache.bcel.classfile.*; -import java.io.*; import java.util.ArrayList; /** -- GitLab From a16292c5022389fb151fe454f8a1a98a6435d9a2 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Thu, 1 Aug 2002 22:38:42 +0000 Subject: [PATCH 0129/1313] Changed firstCommonSuperClass semantics for ArrayTypes, i.e. return an ArrayType with the firstCommonSuperClass of the basic types as its basic types iff the dimensions match (instead of simply returning Object). Thanks Shagin Konstantin. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152819 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/generic/ReferenceType.java | 349 ++++++++++-------- 1 file changed, 185 insertions(+), 164 deletions(-) diff --git a/src/java/org/apache/bcel/generic/ReferenceType.java b/src/java/org/apache/bcel/generic/ReferenceType.java index dd958fa1..ca640204 100644 --- a/src/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/java/org/apache/bcel/generic/ReferenceType.java @@ -53,206 +53,227 @@ package org.apache.bcel.generic; * information on the Apache Software Foundation, please see * . */ + import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; -/** +/** * Super class for objects and arrays. * * @version $Id$ * @author M. Dahm */ public class ReferenceType extends Type { - protected ReferenceType(byte t, String s) { - super(t, s); - } + protected ReferenceType(byte t, String s) { + super(t, s); + } - /** Class is non-abstract but not instantiable from the outside - */ - ReferenceType() { - super(Constants.T_OBJECT, ""); - } + /** Class is non-abstract but not instantiable from the outside + */ + ReferenceType() { + super(Constants.T_OBJECT, ""); + } - /** - * Return true iff this type is castable to another type t as defined in - * the JVM specification. The case where this is Type.NULL is not - * defined (see the CHECKCAST definition in the JVM specification). - * However, because e.g. CHECKCAST doesn't throw a - * ClassCastException when casting a null reference to any Object, - * true is returned in this case. - */ - public boolean isCastableTo(Type t){ - if(this.equals(Type.NULL)) - return true; // If this is ever changed in isAssignmentCompatible() + /** + * Return true iff this type is castable to another type t as defined in + * the JVM specification. The case where this is Type.NULL is not + * defined (see the CHECKCAST definition in the JVM specification). + * However, because e.g. CHECKCAST doesn't throw a + * ClassCastException when casting a null reference to any Object, + * true is returned in this case. + */ + public boolean isCastableTo(Type t) { + if (this.equals(Type.NULL)) + return true; // If this is ever changed in isAssignmentCompatible() - return isAssignmentCompatibleWith(t); /* Yes, it's true: It's the same definition. - * See vmspec2 AASTORE / CHECKCAST definitions. - */ - } + return isAssignmentCompatibleWith(t); /* Yes, it's true: It's the same definition. + * See vmspec2 AASTORE / CHECKCAST definitions. + */ + } - /** - * Return true iff this is assignment compatible with another type t - * as defined in the JVM specification; see the AASTORE definition - * there. - */ - public boolean isAssignmentCompatibleWith(Type t) { - if(!(t instanceof ReferenceType)) - return false; + /** + * Return true iff this is assignment compatible with another type t + * as defined in the JVM specification; see the AASTORE definition + * there. + */ + public boolean isAssignmentCompatibleWith(Type t) { + if (!(t instanceof ReferenceType)) + return false; - ReferenceType T = (ReferenceType)t; + ReferenceType T = (ReferenceType) t; - if(this.equals(Type.NULL)) - return true; // This is not explicitely stated, but clear. Isn't it? + if (this.equals(Type.NULL)) + return true; // This is not explicitely stated, but clear. Isn't it? - /* If this is a class type then - */ - if((this instanceof ObjectType) && (((ObjectType) this).referencesClass())) { - /* If T is a class type, then this must be the same class as T, - or this must be a subclass of T; - */ - if((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) { - if(this.equals(T)) - return true; + /* If this is a class type then + */ + if ((this instanceof ObjectType) && (((ObjectType) this).referencesClass())) { + /* If T is a class type, then this must be the same class as T, + or this must be a subclass of T; + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) { + if (this.equals(T)) + return true; - if(Repository.instanceOf( ((ObjectType) this).getClassName(), - ((ObjectType) T).getClassName())) - return true; - } + if (Repository.instanceOf(((ObjectType) this).getClassName(), + ((ObjectType) T).getClassName())) + return true; + } - /* If T is an interface type, this must implement interface T. - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())) { - if (Repository.implementationOf( ((ObjectType) this).getClassName(), - ((ObjectType) T).getClassName() )) - return true; - } - } + /* If T is an interface type, this must implement interface T. + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())) { + if (Repository.implementationOf(((ObjectType) this).getClassName(), + ((ObjectType) T).getClassName())) + return true; + } + } - /* If this is an interface type, then: - */ - if ((this instanceof ObjectType) && (((ObjectType) this).referencesInterface())){ - /* If T is a class type, then T must be Object (§2.4.7). - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())){ - if (T.equals(Type.OBJECT)) return true; - } + /* If this is an interface type, then: + */ + if ((this instanceof ObjectType) && (((ObjectType) this).referencesInterface())) { + /* If T is a class type, then T must be Object (§2.4.7). + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) { + if (T.equals(Type.OBJECT)) return true; + } - /* If T is an interface type, then T must be the same interface - as this or a superinterface of this (§2.13.2). - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())){ - if (this.equals(T)) return true; - if (Repository.implementationOf( ((ObjectType) this).getClassName(), - ((ObjectType) T).getClassName() )) return true; - } - } + /* If T is an interface type, then T must be the same interface + as this or a superinterface of this (§2.13.2). + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())) { + if (this.equals(T)) return true; + if (Repository.implementationOf(((ObjectType) this).getClassName(), + ((ObjectType) T).getClassName())) + return true; + } + } - /* If this is an array type, namely, the type SC[], that is, an - array of components of type SC, then: - */ - if(this instanceof ArrayType){ - /* If T is a class type, then T must be Object (§2.4.7). - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())){ - if (T.equals(Type.OBJECT)) return true; - } + /* If this is an array type, namely, the type SC[], that is, an + array of components of type SC, then: + */ + if (this instanceof ArrayType) { + /* If T is a class type, then T must be Object (§2.4.7). + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) { + if (T.equals(Type.OBJECT)) return true; + } - /* If T is an array type TC[], that is, an array of components - of type TC, then one of the following must be true: - */ - if (T instanceof ArrayType) { - /* TC and SC are the same primitive type (§2.4.1). - */ - Type sc = ((ArrayType) this).getElementType(); - Type tc = ((ArrayType) this).getElementType(); + /* If T is an array type TC[], that is, an array of components + of type TC, then one of the following must be true: + */ + if (T instanceof ArrayType) { + /* TC and SC are the same primitive type (§2.4.1). + */ + Type sc = ((ArrayType) this).getElementType(); + Type tc = ((ArrayType) this).getElementType(); - if (sc instanceof BasicType && tc instanceof BasicType && sc.equals(tc)) - return true; + if (sc instanceof BasicType && tc instanceof BasicType && sc.equals(tc)) + return true; - /* TC and SC are reference types (§2.4.6), and type SC is - assignable to TC by these runtime rules.*/ - if (tc instanceof ReferenceType && sc instanceof ReferenceType && - ((ReferenceType) sc).isAssignmentCompatibleWith((ReferenceType) tc)) return true; - } + /* TC and SC are reference types (§2.4.6), and type SC is + assignable to TC by these runtime rules.*/ + if (tc instanceof ReferenceType && sc instanceof ReferenceType && + ((ReferenceType) sc).isAssignmentCompatibleWith((ReferenceType) tc)) + return true; + } - /* If T is an interface type, T must be one of the interfaces implemented by arrays (§2.15). */ - // TODO: Check if this is still valid or find a way to dynamically find out which - // interfaces arrays implement. However, as of the JVM specification edition 2, there - // are at least two different pages where assignment compatibility is defined and - // on one of them "interfaces implemented by arrays" is exchanged with "'Cloneable' or - // 'java.io.Serializable'" - if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())){ - for (int ii=0; ii */ - if (this.equals(t)) return this; + if ((this instanceof ArrayType) && (t instanceof ArrayType)) { + ArrayType arrType1 = (ArrayType) this; + ArrayType arrType2 = (ArrayType) t; + if ( + (arrType1.getDimensions() == arrType2.getDimensions()) && + arrType1.getBasicType() instanceof ObjectType && + arrType2.getBasicType() instanceof ObjectType) { + return new ArrayType( + ((ObjectType) arrType1.getBasicType()).firstCommonSuperclass((ObjectType) arrType2.getBasicType()), + arrType1.getDimensions() + ); - // TODO: This sounds a little arbitrary. On the other hand, there is - // no object referenced by Type.NULL so we can also say all the objects - // referenced by Type.NULL were derived from java.lang.Object. - // However, the Java Language's "instanceof" operator proves us wrong: - // "null" is not referring to an instance of java.lang.Object :) + } - if ((this instanceof ArrayType) || (t instanceof ArrayType)) - return Type.OBJECT; - // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? + if ((this instanceof ArrayType) || (t instanceof ArrayType)) + return Type.OBJECT; + // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? - if ( ((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) || - (( t instanceof ObjectType) && ((ObjectType) t).referencesInterface()) ) - return Type.OBJECT; - // TODO: The above line is correct comparing to the vmspec2. But one could - // make class file verification a bit stronger here by using the notion of - // superinterfaces or even castability or assignment compatibility. + if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) || + ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) + return Type.OBJECT; + // TODO: The above line is correct comparing to the vmspec2. But one could + // make class file verification a bit stronger here by using the notion of + // superinterfaces or even castability or assignment compatibility. - // this and t are ObjectTypes, see above. - ObjectType thiz = (ObjectType) this; - ObjectType other = (ObjectType) t; - JavaClass[] thiz_sups = Repository.getSuperClasses( thiz.getClassName()); - JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); + // this and t are ObjectTypes, see above. + ObjectType thiz = (ObjectType) this; + ObjectType other = (ObjectType) t; + JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); + JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); - if ((thiz_sups == null) || (other_sups==null)){ - return null; - } + if ((thiz_sups == null) || (other_sups == null)) { + return null; + } - // Waaahh... - JavaClass[] this_sups = new JavaClass[thiz_sups.length+1]; - JavaClass[] t_sups = new JavaClass[other_sups.length+1]; - System.arraycopy( thiz_sups, 0, this_sups, 1, thiz_sups.length); - System.arraycopy(other_sups, 0, t_sups , 1, other_sups.length); - this_sups[0] = Repository.lookupClass(thiz.getClassName()); - t_sups[0] = Repository.lookupClass(other.getClassName()); + // Waaahh... + JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; + JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; + System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); + System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); + this_sups[0] = Repository.lookupClass(thiz.getClassName()); + t_sups[0] = Repository.lookupClass(other.getClassName()); - for (int i=0; i Date: Thu, 1 Aug 2002 22:43:40 +0000 Subject: [PATCH 0130/1313] Sorry! The cat ate my curly brace just before commit. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152820 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/generic/ReferenceType.java | 63 ++++++++++--------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/src/java/org/apache/bcel/generic/ReferenceType.java b/src/java/org/apache/bcel/generic/ReferenceType.java index ca640204..d63e1051 100644 --- a/src/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/java/org/apache/bcel/generic/ReferenceType.java @@ -236,44 +236,45 @@ public class ReferenceType extends Type { ); } + } - if ((this instanceof ArrayType) || (t instanceof ArrayType)) - return Type.OBJECT; - // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? + if ((this instanceof ArrayType) || (t instanceof ArrayType)) + return Type.OBJECT; + // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? - if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) || - ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) - return Type.OBJECT; - // TODO: The above line is correct comparing to the vmspec2. But one could - // make class file verification a bit stronger here by using the notion of - // superinterfaces or even castability or assignment compatibility. + if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) || + ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) + return Type.OBJECT; + // TODO: The above line is correct comparing to the vmspec2. But one could + // make class file verification a bit stronger here by using the notion of + // superinterfaces or even castability or assignment compatibility. - // this and t are ObjectTypes, see above. - ObjectType thiz = (ObjectType) this; - ObjectType other = (ObjectType) t; - JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); - JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); + // this and t are ObjectTypes, see above. + ObjectType thiz = (ObjectType) this; + ObjectType other = (ObjectType) t; + JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); + JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); - if ((thiz_sups == null) || (other_sups == null)) { - return null; - } + if ((thiz_sups == null) || (other_sups == null)) { + return null; + } - // Waaahh... - JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; - JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; - System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); - System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); - this_sups[0] = Repository.lookupClass(thiz.getClassName()); - t_sups[0] = Repository.lookupClass(other.getClassName()); + // Waaahh... + JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; + JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; + System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); + System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); + this_sups[0] = Repository.lookupClass(thiz.getClassName()); + t_sups[0] = Repository.lookupClass(other.getClassName()); - for (int i = 0; i < t_sups.length; i++) { - for (int j = 0; j < this_sups.length; j++) { - if (this_sups[j].equals(t_sups[i])) return new ObjectType(this_sups[j].getClassName()); - } + for (int i = 0; i < t_sups.length; i++) { + for (int j = 0; j < this_sups.length; j++) { + if (this_sups[j].equals(t_sups[i])) return new ObjectType(this_sups[j].getClassName()); } - - // Huh? Did you ask for Type.OBJECT's superclass?? - return null; } + + // Huh? Did you ask for Type.OBJECT's superclass?? + return null; } +} -- GitLab From 58c68210d04d9f032323d13db63cee70df4a6e33 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Fri, 2 Aug 2002 11:57:51 +0000 Subject: [PATCH 0131/1313] I was convinced I should not break API even with the slightest changes. - Made firstCommonSuperclass(ReferenceType) behave like yesterday, but deprecated. - Created a new method getFirstCommonSuperclass(ReferenceType) with needed changes. - Reformatted some comments. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152821 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/generic/ReferenceType.java | 93 ++++++++++++++++--- .../verifier/structurals/LocalVariables.java | 2 +- .../verifier/structurals/OperandStack.java | 2 +- 3 files changed, 83 insertions(+), 14 deletions(-) diff --git a/src/java/org/apache/bcel/generic/ReferenceType.java b/src/java/org/apache/bcel/generic/ReferenceType.java index d63e1051..89db41a6 100644 --- a/src/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/java/org/apache/bcel/generic/ReferenceType.java @@ -87,9 +87,10 @@ public class ReferenceType extends Type { if (this.equals(Type.NULL)) return true; // If this is ever changed in isAssignmentCompatible() - return isAssignmentCompatibleWith(t); /* Yes, it's true: It's the same definition. - * See vmspec2 AASTORE / CHECKCAST definitions. - */ + return isAssignmentCompatibleWith(t); + /* Yes, it's true: It's the same definition. + * See vmspec2 AASTORE / CHECKCAST definitions. + */ } /** @@ -140,8 +141,8 @@ public class ReferenceType extends Type { } /* If T is an interface type, then T must be the same interface - as this or a superinterface of this (§2.13.2). - */ + * as this or a superinterface of this (§2.13.2). + */ if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())) { if (this.equals(T)) return true; if (Repository.implementationOf(((ObjectType) this).getClassName(), @@ -151,8 +152,8 @@ public class ReferenceType extends Type { } /* If this is an array type, namely, the type SC[], that is, an - array of components of type SC, then: - */ + * array of components of type SC, then: + */ if (this instanceof ArrayType) { /* If T is a class type, then T must be Object (§2.4.7). */ @@ -161,8 +162,8 @@ public class ReferenceType extends Type { } /* If T is an array type TC[], that is, an array of components - of type TC, then one of the following must be true: - */ + * of type TC, then one of the following must be true: + */ if (T instanceof ArrayType) { /* TC and SC are the same primitive type (§2.4.1). */ @@ -173,7 +174,8 @@ public class ReferenceType extends Type { return true; /* TC and SC are reference types (§2.4.6), and type SC is - assignable to TC by these runtime rules.*/ + * assignable to TC by these runtime rules. + */ if (tc instanceof ReferenceType && sc instanceof ReferenceType && ((ReferenceType) sc).isAssignmentCompatibleWith((ReferenceType) tc)) return true; @@ -209,7 +211,7 @@ public class ReferenceType extends Type { * If not all of the two classes' superclasses cannot be found, "null" is returned. * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". */ - public ReferenceType firstCommonSuperclass(ReferenceType t) { + public ReferenceType getFirstCommonSuperclass(ReferenceType t) { if (this.equals(Type.NULL)) return t; if (t.equals(Type.NULL)) return this; if (this.equals(t)) return this; @@ -231,7 +233,7 @@ public class ReferenceType extends Type { arrType1.getBasicType() instanceof ObjectType && arrType2.getBasicType() instanceof ObjectType) { return new ArrayType( - ((ObjectType) arrType1.getBasicType()).firstCommonSuperclass((ObjectType) arrType2.getBasicType()), + ((ObjectType) arrType1.getBasicType()).getFirstCommonSuperclass((ObjectType) arrType2.getBasicType()), arrType1.getDimensions() ); @@ -250,6 +252,73 @@ public class ReferenceType extends Type { // superinterfaces or even castability or assignment compatibility. + // this and t are ObjectTypes, see above. + ObjectType thiz = (ObjectType) this; + ObjectType other = (ObjectType) t; + JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); + JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); + + if ((thiz_sups == null) || (other_sups == null)) { + return null; + } + + // Waaahh... + JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; + JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; + System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); + System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); + this_sups[0] = Repository.lookupClass(thiz.getClassName()); + t_sups[0] = Repository.lookupClass(other.getClassName()); + + for (int i = 0; i < t_sups.length; i++) { + for (int j = 0; j < this_sups.length; j++) { + if (this_sups[j].equals(t_sups[i])) return new ObjectType(this_sups[j].getClassName()); + } + } + + // Huh? Did you ask for Type.OBJECT's superclass?? + return null; + } + + /** + * This commutative operation returns the first common superclass (narrowest ReferenceType + * referencing a class, not an interface). + * If one of the types is a superclass of the other, the former is returned. + * If "this" is Type.NULL, then t is returned. + * If t is Type.NULL, then "this" is returned. + * If "this" equals t ['this.equals(t)'] "this" is returned. + * If "this" or t is an ArrayType, then Type.OBJECT is returned. + * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. + * If not all of the two classes' superclasses cannot be found, "null" is returned. + * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". + * + * @deprecated use getFirstCommonSuperclass(ReferenceType t) which has + * slightly changed semantics. + */ + public ReferenceType firstCommonSuperclass(ReferenceType t) { + if (this.equals(Type.NULL)) return t; + if (t.equals(Type.NULL)) return this; + if (this.equals(t)) return this; + /* + * TODO: Above sounds a little arbitrary. On the other hand, there is + * no object referenced by Type.NULL so we can also say all the objects + * referenced by Type.NULL were derived from java.lang.Object. + * However, the Java Language's "instanceof" operator proves us wrong: + * "null" is not referring to an instance of java.lang.Object :) + */ + + if ((this instanceof ArrayType) || (t instanceof ArrayType)) + return Type.OBJECT; + // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? + + if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) || + ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) + return Type.OBJECT; + // TODO: The above line is correct comparing to the vmspec2. But one could + // make class file verification a bit stronger here by using the notion of + // superinterfaces or even castability or assignment compatibility. + + // this and t are ObjectTypes, see above. ObjectType thiz = (ObjectType) this; ObjectType other = (ObjectType) t; diff --git a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 6dad821b..9ffd719f 100644 --- a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -180,7 +180,7 @@ public class LocalVariables{ } if ((locals[i] instanceof ReferenceType) && (lv.locals[i] instanceof ReferenceType)){ if (! locals[i].equals(lv.locals[i])){ // needed in case of two UninitializedObjectType instances - Type sup = ((ReferenceType) locals[i]).firstCommonSuperclass((ReferenceType) (lv.locals[i])); + Type sup = ((ReferenceType) locals[i]).getFirstCommonSuperclass((ReferenceType) (lv.locals[i])); if (sup != null){ locals[i] = sup; diff --git a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/java/org/apache/bcel/verifier/structurals/OperandStack.java index d7f50895..b73cea1f 100644 --- a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -251,7 +251,7 @@ public class OperandStack{ if (! stack.get(i).equals(s.stack.get(i))){ if ( (stack.get(i) instanceof ReferenceType) && (s.stack.get(i) instanceof ReferenceType) ){ - stack.set(i, ((ReferenceType) stack.get(i)).firstCommonSuperclass((ReferenceType) (s.stack.get(i)))); + stack.set(i, ((ReferenceType) stack.get(i)).getFirstCommonSuperclass((ReferenceType) (s.stack.get(i)))); } else{ throw new StructuralCodeConstraintException("Cannot merge stacks of different types:\nStack A:\n"+this+"\nStack B:\n"+s); -- GitLab From 631b6eb55a00fab88bf36ad19e4f3b00579ba204 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Mon, 5 Aug 2002 17:31:32 +0000 Subject: [PATCH 0132/1313] Make the StringRepresentation aware of the new StackMap attribute. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152822 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/statics/StringRepresentation.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 2743d4c0..7e319fdb 100644 --- a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -211,6 +211,9 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor public void visitSourceFile(SourceFile obj){ tostring = toString(obj); } + public void visitStackMap(StackMap obj){ + tostring = toString(obj); + } public void visitSynthetic(Synthetic obj){ tostring = toString(obj); } -- GitLab From ced51c6d8581469aa1b1958f46f6f77742e7e90e Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Wed, 7 Aug 2002 14:33:37 +0000 Subject: [PATCH 0133/1313] typo git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152823 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/ClassParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/ClassParser.java b/src/java/org/apache/bcel/classfile/ClassParser.java index 2dafc816..f5ccc640 100644 --- a/src/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/java/org/apache/bcel/classfile/ClassParser.java @@ -208,7 +208,7 @@ public final class ClassParser { } /** - * Read information about the attributes of the attributes of the class. + * Read information about the attributes of the class. * @throws IOException * @throws ClassFormatException */ -- GitLab From 5e8a05f8fb5c9320595035129868925adbe8dd0d Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 7 Aug 2002 18:01:32 +0000 Subject: [PATCH 0134/1313] equals() method for instructions, semantics may be customized git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152824 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/BIPUSH.java | 1 - .../org/apache/bcel/generic/BREAKPOINT.java | 5 +- src/java/org/apache/bcel/generic/DCONST.java | 1 - src/java/org/apache/bcel/generic/FCONST.java | 1 - src/java/org/apache/bcel/generic/ICONST.java | 1 - .../org/apache/bcel/generic/Instruction.java | 23 +- .../bcel/generic/InstructionComparator.java | 107 ++++ .../apache/bcel/generic/JsrInstruction.java | 25 +- src/java/org/apache/bcel/generic/LCONST.java | 1 - .../generic/LocalVariableInstruction.java | 1 - .../org/apache/bcel/generic/NEWARRAY.java | 1 - .../apache/bcel/generic/ReferenceType.java | 538 +++++++++--------- src/java/org/apache/bcel/generic/SIPUSH.java | 1 - src/java/org/apache/bcel/generic/Type.java | 2 +- 14 files changed, 413 insertions(+), 295 deletions(-) create mode 100644 src/java/org/apache/bcel/generic/InstructionComparator.java diff --git a/src/java/org/apache/bcel/generic/BIPUSH.java b/src/java/org/apache/bcel/generic/BIPUSH.java index d9b6efd1..a3fd78de 100644 --- a/src/java/org/apache/bcel/generic/BIPUSH.java +++ b/src/java/org/apache/bcel/generic/BIPUSH.java @@ -113,7 +113,6 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { return Type.BYTE; } - /** * Call corresponding visitor method(s). The order is: * Call visitor methods of implemented interfaces first, then diff --git a/src/java/org/apache/bcel/generic/BREAKPOINT.java b/src/java/org/apache/bcel/generic/BREAKPOINT.java index 22547865..a0cecdad 100644 --- a/src/java/org/apache/bcel/generic/BREAKPOINT.java +++ b/src/java/org/apache/bcel/generic/BREAKPOINT.java @@ -55,17 +55,16 @@ package org.apache.bcel.generic; */ /** - * BREAKPOINT + * BREAKPOINT, JVM dependent, ignored by default * * @version $Id$ - * @author Enver Haase + * @author M. Dahm */ public class BREAKPOINT extends Instruction { public BREAKPOINT() { super(org.apache.bcel.Constants.BREAKPOINT, (short)1); } - /** * Call corresponding visitor method(s). The order is: * Call visitor methods of implemented interfaces first, then diff --git a/src/java/org/apache/bcel/generic/DCONST.java b/src/java/org/apache/bcel/generic/DCONST.java index 7a937d2a..6051072a 100644 --- a/src/java/org/apache/bcel/generic/DCONST.java +++ b/src/java/org/apache/bcel/generic/DCONST.java @@ -93,7 +93,6 @@ public class DCONST extends Instruction return Type.DOUBLE; } - /** * Call corresponding visitor method(s). The order is: * Call visitor methods of implemented interfaces first, then diff --git a/src/java/org/apache/bcel/generic/FCONST.java b/src/java/org/apache/bcel/generic/FCONST.java index cca350bf..ccd42323 100644 --- a/src/java/org/apache/bcel/generic/FCONST.java +++ b/src/java/org/apache/bcel/generic/FCONST.java @@ -95,7 +95,6 @@ public class FCONST extends Instruction return Type.FLOAT; } - /** * Call corresponding visitor method(s). The order is: * Call visitor methods of implemented interfaces first, then diff --git a/src/java/org/apache/bcel/generic/ICONST.java b/src/java/org/apache/bcel/generic/ICONST.java index 145f2e25..2340ce41 100644 --- a/src/java/org/apache/bcel/generic/ICONST.java +++ b/src/java/org/apache/bcel/generic/ICONST.java @@ -91,7 +91,6 @@ public class ICONST extends Instruction return Type.INT; } - /** * Call corresponding visitor method(s). The order is: * Call visitor methods of implemented interfaces first, then diff --git a/src/java/org/apache/bcel/generic/Instruction.java b/src/java/org/apache/bcel/generic/Instruction.java index 6a70ca8a..dd502f2c 100644 --- a/src/java/org/apache/bcel/generic/Instruction.java +++ b/src/java/org/apache/bcel/generic/Instruction.java @@ -70,6 +70,8 @@ public abstract class Instruction implements Cloneable, Serializable { protected short length = 1; // Length of instruction in bytes protected short opcode = -1; // Opcode number + private static InstructionComparator cmp = InstructionComparator.DEFAULT; + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. @@ -270,7 +272,7 @@ public abstract class Instruction implements Cloneable, Serializable { /** Some instructions may be reused, so don't do anything by default. */ - void dispose() { } + void dispose() {} /** * Call corresponding visitor method(s). The order is: @@ -281,4 +283,23 @@ public abstract class Instruction implements Cloneable, Serializable { * @param v Visitor object */ public abstract void accept(Visitor v); + + /** Get Comparator object used in the equals() method to determine + * equality of instructions. + * + * @return currently used comparator for equals() + */ + public static InstructionComparator getComparator() { return cmp; } + + /** Set comparator to be used for equals(). + */ + public static void setComparator(InstructionComparator c) { cmp = c; } + + /** Check for equality, delegated to comparator + * @return true if that is an Instruction and has the same opcode + */ + public boolean equals(Object that) { + return (that instanceof Instruction)? + cmp.equals(this, (Instruction)that) : false; + } } diff --git a/src/java/org/apache/bcel/generic/InstructionComparator.java b/src/java/org/apache/bcel/generic/InstructionComparator.java new file mode 100644 index 00000000..115689c8 --- /dev/null +++ b/src/java/org/apache/bcel/generic/InstructionComparator.java @@ -0,0 +1,107 @@ +package org.apache.bcel.generic; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +/** + * Equality of instructions isn't clearly to be defined. You might + * wish, for example, to compare whether instructions have the same + * meaning. E.g., whether two INVOKEVIRTUALs describe the same + * call.
      The DEFAULT comparator however, considers two instructions + * to be equal if they have same opcode and point to the same indexes + * (if any) in the constant pool or the same local variable index. Branch + * instructions must have the same target. + * + * @see Instruction + * @version $Id$ + * @author M. Dahm + */ +public interface InstructionComparator { + public static final InstructionComparator DEFAULT = + new InstructionComparator() { + public boolean equals(Instruction i1, Instruction i2) { + if(i1.opcode == i2.opcode) { + if(i1 instanceof Select) { + InstructionHandle[] t1 = ((Select)i1).getTargets(); + InstructionHandle[] t2 = ((Select)i2).getTargets(); + + if(t1.length == t2.length) { + for(int i = 0; i < t1.length; i++) { + if(t1[i] != t2[i]) { + return false; + } + } + + return true; + } + } else if(i1 instanceof BranchInstruction) { + return ((BranchInstruction)i1).target == + ((BranchInstruction)i2).target; + } else if(i1 instanceof ConstantPushInstruction) { + return ((ConstantPushInstruction)i1).getValue(). + equals(((ConstantPushInstruction)i2).getValue()); + } else if(i1 instanceof IndexedInstruction) { + return ((IndexedInstruction)i1).getIndex() == + ((IndexedInstruction)i2).getIndex(); + } else if(i1 instanceof NEWARRAY) { + return ((NEWARRAY)i1).type == ((NEWARRAY)i2).type; + } + } + + return false; + } + }; + + public boolean equals(Instruction i1, Instruction i2); +} diff --git a/src/java/org/apache/bcel/generic/JsrInstruction.java b/src/java/org/apache/bcel/generic/JsrInstruction.java index e5a4a4f8..89e8db66 100644 --- a/src/java/org/apache/bcel/generic/JsrInstruction.java +++ b/src/java/org/apache/bcel/generic/JsrInstruction.java @@ -79,21 +79,20 @@ public abstract class JsrInstruction extends BranchInstruction return new ReturnaddressType(physicalSuccessor()); } - - /** - * Returns an InstructionHandle to the physical successor - * of this JsrInstruction. For this method to work, - * this JsrInstruction object must not be shared between - * multiple InstructionHandle objects! - * Formally, there must not be InstructionHandle objects - * i, j where i != j and i.getInstruction() == this == - * j.getInstruction(). - * @return an InstructionHandle to the "next" instruction that - * will be executed when RETurned from a subroutine. - */ + /** + * Returns an InstructionHandle to the physical successor + * of this JsrInstruction. For this method to work, + * this JsrInstruction object must not be shared between + * multiple InstructionHandle objects! + * Formally, there must not be InstructionHandle objects + * i, j where i != j and i.getInstruction() == this == + * j.getInstruction(). + * @return an InstructionHandle to the "next" instruction that + * will be executed when RETurned from a subroutine. + */ public InstructionHandle physicalSuccessor(){ InstructionHandle ih = this.target; - + // Rewind! while(ih.getPrev() != null) ih = ih.getPrev(); diff --git a/src/java/org/apache/bcel/generic/LCONST.java b/src/java/org/apache/bcel/generic/LCONST.java index e5245c0f..3e758fe8 100644 --- a/src/java/org/apache/bcel/generic/LCONST.java +++ b/src/java/org/apache/bcel/generic/LCONST.java @@ -93,7 +93,6 @@ public class LCONST extends Instruction return Type.LONG; } - /** * Call corresponding visitor method(s). The order is: * Call visitor methods of implemented interfaces first, then diff --git a/src/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/java/org/apache/bcel/generic/LocalVariableInstruction.java index 74db9c2b..48919963 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -224,4 +224,3 @@ public abstract class LocalVariableInstruction extends Instruction } } } - diff --git a/src/java/org/apache/bcel/generic/NEWARRAY.java b/src/java/org/apache/bcel/generic/NEWARRAY.java index 97dfb74a..5d5cfa27 100644 --- a/src/java/org/apache/bcel/generic/NEWARRAY.java +++ b/src/java/org/apache/bcel/generic/NEWARRAY.java @@ -123,7 +123,6 @@ public class NEWARRAY extends Instruction return new Class[] { org.apache.bcel.ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION }; } - /** * Call corresponding visitor method(s). The order is: * Call visitor methods of implemented interfaces first, then diff --git a/src/java/org/apache/bcel/generic/ReferenceType.java b/src/java/org/apache/bcel/generic/ReferenceType.java index 89db41a6..b9855e91 100644 --- a/src/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/java/org/apache/bcel/generic/ReferenceType.java @@ -59,291 +59,291 @@ import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; /** - * Super class for objects and arrays. + * Super class for object and array types. * * @version $Id$ * @author M. Dahm */ -public class ReferenceType extends Type { - protected ReferenceType(byte t, String s) { - super(t, s); - } +public abstract class ReferenceType extends Type { + protected ReferenceType(byte t, String s) { + super(t, s); + } + + /** Class is non-abstract but not instantiable from the outside + */ + ReferenceType() { + super(Constants.T_OBJECT, ""); + } + + /** + * Return true iff this type is castable to another type t as defined in + * the JVM specification. The case where this is Type.NULL is not + * defined (see the CHECKCAST definition in the JVM specification). + * However, because e.g. CHECKCAST doesn't throw a + * ClassCastException when casting a null reference to any Object, + * true is returned in this case. + */ + public boolean isCastableTo(Type t) { + if (this.equals(Type.NULL)) + return true; // If this is ever changed in isAssignmentCompatible() + + return isAssignmentCompatibleWith(t); + /* Yes, it's true: It's the same definition. + * See vmspec2 AASTORE / CHECKCAST definitions. + */ + } + + /** + * Return true iff this is assignment compatible with another type t + * as defined in the JVM specification; see the AASTORE definition + * there. + */ + public boolean isAssignmentCompatibleWith(Type t) { + if (!(t instanceof ReferenceType)) + return false; - /** Class is non-abstract but not instantiable from the outside + ReferenceType T = (ReferenceType) t; + + if (this.equals(Type.NULL)) + return true; // This is not explicitely stated, but clear. Isn't it? + + /* If this is a class type then */ - ReferenceType() { - super(Constants.T_OBJECT, ""); + if ((this instanceof ObjectType) && (((ObjectType) this).referencesClass())) { + /* If T is a class type, then this must be the same class as T, + or this must be a subclass of T; + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) { + if (this.equals(T)) + return true; + + if (Repository.instanceOf(((ObjectType) this).getClassName(), + ((ObjectType) T).getClassName())) + return true; + } + + /* If T is an interface type, this must implement interface T. + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())) { + if (Repository.implementationOf(((ObjectType) this).getClassName(), + ((ObjectType) T).getClassName())) + return true; + } } - /** - * Return true iff this type is castable to another type t as defined in - * the JVM specification. The case where this is Type.NULL is not - * defined (see the CHECKCAST definition in the JVM specification). - * However, because e.g. CHECKCAST doesn't throw a - * ClassCastException when casting a null reference to any Object, - * true is returned in this case. + /* If this is an interface type, then: */ - public boolean isCastableTo(Type t) { - if (this.equals(Type.NULL)) - return true; // If this is ever changed in isAssignmentCompatible() - - return isAssignmentCompatibleWith(t); - /* Yes, it's true: It's the same definition. - * See vmspec2 AASTORE / CHECKCAST definitions. - */ + if ((this instanceof ObjectType) && (((ObjectType) this).referencesInterface())) { + /* If T is a class type, then T must be Object (§2.4.7). + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) { + if (T.equals(Type.OBJECT)) return true; + } + + /* If T is an interface type, then T must be the same interface + * as this or a superinterface of this (§2.13.2). + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())) { + if (this.equals(T)) return true; + if (Repository.implementationOf(((ObjectType) this).getClassName(), + ((ObjectType) T).getClassName())) + return true; + } } - /** - * Return true iff this is assignment compatible with another type t - * as defined in the JVM specification; see the AASTORE definition - * there. + /* If this is an array type, namely, the type SC[], that is, an + * array of components of type SC, then: */ - public boolean isAssignmentCompatibleWith(Type t) { - if (!(t instanceof ReferenceType)) - return false; - - ReferenceType T = (ReferenceType) t; - - if (this.equals(Type.NULL)) - return true; // This is not explicitely stated, but clear. Isn't it? - - /* If this is a class type then - */ - if ((this instanceof ObjectType) && (((ObjectType) this).referencesClass())) { - /* If T is a class type, then this must be the same class as T, - or this must be a subclass of T; - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) { - if (this.equals(T)) - return true; - - if (Repository.instanceOf(((ObjectType) this).getClassName(), - ((ObjectType) T).getClassName())) - return true; - } - - /* If T is an interface type, this must implement interface T. - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())) { - if (Repository.implementationOf(((ObjectType) this).getClassName(), - ((ObjectType) T).getClassName())) - return true; - } - } - - /* If this is an interface type, then: - */ - if ((this instanceof ObjectType) && (((ObjectType) this).referencesInterface())) { - /* If T is a class type, then T must be Object (§2.4.7). - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) { - if (T.equals(Type.OBJECT)) return true; - } - - /* If T is an interface type, then T must be the same interface - * as this or a superinterface of this (§2.13.2). - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())) { - if (this.equals(T)) return true; - if (Repository.implementationOf(((ObjectType) this).getClassName(), - ((ObjectType) T).getClassName())) - return true; - } - } - - /* If this is an array type, namely, the type SC[], that is, an - * array of components of type SC, then: - */ - if (this instanceof ArrayType) { - /* If T is a class type, then T must be Object (§2.4.7). - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) { - if (T.equals(Type.OBJECT)) return true; - } - - /* If T is an array type TC[], that is, an array of components - * of type TC, then one of the following must be true: - */ - if (T instanceof ArrayType) { - /* TC and SC are the same primitive type (§2.4.1). - */ - Type sc = ((ArrayType) this).getElementType(); - Type tc = ((ArrayType) this).getElementType(); - - if (sc instanceof BasicType && tc instanceof BasicType && sc.equals(tc)) - return true; - - /* TC and SC are reference types (§2.4.6), and type SC is - * assignable to TC by these runtime rules. - */ - if (tc instanceof ReferenceType && sc instanceof ReferenceType && - ((ReferenceType) sc).isAssignmentCompatibleWith((ReferenceType) tc)) - return true; - } - - /* If T is an interface type, T must be one of the interfaces implemented by arrays (§2.15). */ - // TODO: Check if this is still valid or find a way to dynamically find out which - // interfaces arrays implement. However, as of the JVM specification edition 2, there - // are at least two different pages where assignment compatibility is defined and - // on one of them "interfaces implemented by arrays" is exchanged with "'Cloneable' or - // 'java.io.Serializable'" - if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())) { - for (int ii = 0; ii < Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS.length; ii++) { - if (T.equals(new ObjectType(Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS[ii]))) return true; - } - } - } - return false; // default. + if (this instanceof ArrayType) { + /* If T is a class type, then T must be Object (§2.4.7). + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesClass())) { + if (T.equals(Type.OBJECT)) return true; + } + + /* If T is an array type TC[], that is, an array of components + * of type TC, then one of the following must be true: + */ + if (T instanceof ArrayType) { + /* TC and SC are the same primitive type (§2.4.1). + */ + Type sc = ((ArrayType) this).getElementType(); + Type tc = ((ArrayType) this).getElementType(); + + if (sc instanceof BasicType && tc instanceof BasicType && sc.equals(tc)) + return true; + + /* TC and SC are reference types (§2.4.6), and type SC is + * assignable to TC by these runtime rules. + */ + if (tc instanceof ReferenceType && sc instanceof ReferenceType && + ((ReferenceType) sc).isAssignmentCompatibleWith((ReferenceType) tc)) + return true; + } + + /* If T is an interface type, T must be one of the interfaces implemented by arrays (§2.15). */ + // TODO: Check if this is still valid or find a way to dynamically find out which + // interfaces arrays implement. However, as of the JVM specification edition 2, there + // are at least two different pages where assignment compatibility is defined and + // on one of them "interfaces implemented by arrays" is exchanged with "'Cloneable' or + // 'java.io.Serializable'" + if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterface())) { + for (int ii = 0; ii < Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS.length; ii++) { + if (T.equals(new ObjectType(Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS[ii]))) return true; + } + } } - - /** - * This commutative operation returns the first common superclass (narrowest ReferenceType - * referencing a class, not an interface). - * If one of the types is a superclass of the other, the former is returned. - * If "this" is Type.NULL, then t is returned. - * If t is Type.NULL, then "this" is returned. - * If "this" equals t ['this.equals(t)'] "this" is returned. - * If "this" or t is an ArrayType, then Type.OBJECT is returned; - * unless their dimensions match. Then an ArrayType of the same - * number of dimensions is returned, with its basic type being the - * first common super class of the basic types of "this" and t. - * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. - * If not all of the two classes' superclasses cannot be found, "null" is returned. - * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". + return false; // default. + } + + /** + * This commutative operation returns the first common superclass (narrowest ReferenceType + * referencing a class, not an interface). + * If one of the types is a superclass of the other, the former is returned. + * If "this" is Type.NULL, then t is returned. + * If t is Type.NULL, then "this" is returned. + * If "this" equals t ['this.equals(t)'] "this" is returned. + * If "this" or t is an ArrayType, then Type.OBJECT is returned; + * unless their dimensions match. Then an ArrayType of the same + * number of dimensions is returned, with its basic type being the + * first common super class of the basic types of "this" and t. + * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. + * If not all of the two classes' superclasses cannot be found, "null" is returned. + * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". + */ + public ReferenceType getFirstCommonSuperclass(ReferenceType t) { + if (this.equals(Type.NULL)) return t; + if (t.equals(Type.NULL)) return this; + if (this.equals(t)) return this; + /* + * TODO: Above sounds a little arbitrary. On the other hand, there is + * no object referenced by Type.NULL so we can also say all the objects + * referenced by Type.NULL were derived from java.lang.Object. + * However, the Java Language's "instanceof" operator proves us wrong: + * "null" is not referring to an instance of java.lang.Object :) */ - public ReferenceType getFirstCommonSuperclass(ReferenceType t) { - if (this.equals(Type.NULL)) return t; - if (t.equals(Type.NULL)) return this; - if (this.equals(t)) return this; - /* - * TODO: Above sounds a little arbitrary. On the other hand, there is - * no object referenced by Type.NULL so we can also say all the objects - * referenced by Type.NULL were derived from java.lang.Object. - * However, the Java Language's "instanceof" operator proves us wrong: - * "null" is not referring to an instance of java.lang.Object :) - */ - - /* This code is from a bug report by Konstantin Shagin */ - - if ((this instanceof ArrayType) && (t instanceof ArrayType)) { - ArrayType arrType1 = (ArrayType) this; - ArrayType arrType2 = (ArrayType) t; - if ( - (arrType1.getDimensions() == arrType2.getDimensions()) && - arrType1.getBasicType() instanceof ObjectType && - arrType2.getBasicType() instanceof ObjectType) { - return new ArrayType( - ((ObjectType) arrType1.getBasicType()).getFirstCommonSuperclass((ObjectType) arrType2.getBasicType()), - arrType1.getDimensions() - ); - - } - } - - if ((this instanceof ArrayType) || (t instanceof ArrayType)) - return Type.OBJECT; - // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? - - if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) || - ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) - return Type.OBJECT; - // TODO: The above line is correct comparing to the vmspec2. But one could - // make class file verification a bit stronger here by using the notion of - // superinterfaces or even castability or assignment compatibility. - - - // this and t are ObjectTypes, see above. - ObjectType thiz = (ObjectType) this; - ObjectType other = (ObjectType) t; - JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); - JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); - - if ((thiz_sups == null) || (other_sups == null)) { - return null; - } - - // Waaahh... - JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; - JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; - System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); - System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); - this_sups[0] = Repository.lookupClass(thiz.getClassName()); - t_sups[0] = Repository.lookupClass(other.getClassName()); - - for (int i = 0; i < t_sups.length; i++) { - for (int j = 0; j < this_sups.length; j++) { - if (this_sups[j].equals(t_sups[i])) return new ObjectType(this_sups[j].getClassName()); - } - } - - // Huh? Did you ask for Type.OBJECT's superclass?? - return null; + + /* This code is from a bug report by Konstantin Shagin */ + + if ((this instanceof ArrayType) && (t instanceof ArrayType)) { + ArrayType arrType1 = (ArrayType) this; + ArrayType arrType2 = (ArrayType) t; + if ( + (arrType1.getDimensions() == arrType2.getDimensions()) && + arrType1.getBasicType() instanceof ObjectType && + arrType2.getBasicType() instanceof ObjectType) { + return new ArrayType( + ((ObjectType) arrType1.getBasicType()).getFirstCommonSuperclass((ObjectType) arrType2.getBasicType()), + arrType1.getDimensions() + ); + + } } - /** - * This commutative operation returns the first common superclass (narrowest ReferenceType - * referencing a class, not an interface). - * If one of the types is a superclass of the other, the former is returned. - * If "this" is Type.NULL, then t is returned. - * If t is Type.NULL, then "this" is returned. - * If "this" equals t ['this.equals(t)'] "this" is returned. - * If "this" or t is an ArrayType, then Type.OBJECT is returned. - * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. - * If not all of the two classes' superclasses cannot be found, "null" is returned. - * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". - * - * @deprecated use getFirstCommonSuperclass(ReferenceType t) which has - * slightly changed semantics. + if ((this instanceof ArrayType) || (t instanceof ArrayType)) + return Type.OBJECT; + // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? + + if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) || + ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) + return Type.OBJECT; + // TODO: The above line is correct comparing to the vmspec2. But one could + // make class file verification a bit stronger here by using the notion of + // superinterfaces or even castability or assignment compatibility. + + + // this and t are ObjectTypes, see above. + ObjectType thiz = (ObjectType) this; + ObjectType other = (ObjectType) t; + JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); + JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); + + if ((thiz_sups == null) || (other_sups == null)) { + return null; + } + + // Waaahh... + JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; + JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; + System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); + System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); + this_sups[0] = Repository.lookupClass(thiz.getClassName()); + t_sups[0] = Repository.lookupClass(other.getClassName()); + + for (int i = 0; i < t_sups.length; i++) { + for (int j = 0; j < this_sups.length; j++) { + if (this_sups[j].equals(t_sups[i])) return new ObjectType(this_sups[j].getClassName()); + } + } + + // Huh? Did you ask for Type.OBJECT's superclass?? + return null; + } + + /** + * This commutative operation returns the first common superclass (narrowest ReferenceType + * referencing a class, not an interface). + * If one of the types is a superclass of the other, the former is returned. + * If "this" is Type.NULL, then t is returned. + * If t is Type.NULL, then "this" is returned. + * If "this" equals t ['this.equals(t)'] "this" is returned. + * If "this" or t is an ArrayType, then Type.OBJECT is returned. + * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. + * If not all of the two classes' superclasses cannot be found, "null" is returned. + * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". + * + * @deprecated use getFirstCommonSuperclass(ReferenceType t) which has + * slightly changed semantics. + */ + public ReferenceType firstCommonSuperclass(ReferenceType t) { + if (this.equals(Type.NULL)) return t; + if (t.equals(Type.NULL)) return this; + if (this.equals(t)) return this; + /* + * TODO: Above sounds a little arbitrary. On the other hand, there is + * no object referenced by Type.NULL so we can also say all the objects + * referenced by Type.NULL were derived from java.lang.Object. + * However, the Java Language's "instanceof" operator proves us wrong: + * "null" is not referring to an instance of java.lang.Object :) */ - public ReferenceType firstCommonSuperclass(ReferenceType t) { - if (this.equals(Type.NULL)) return t; - if (t.equals(Type.NULL)) return this; - if (this.equals(t)) return this; - /* - * TODO: Above sounds a little arbitrary. On the other hand, there is - * no object referenced by Type.NULL so we can also say all the objects - * referenced by Type.NULL were derived from java.lang.Object. - * However, the Java Language's "instanceof" operator proves us wrong: - * "null" is not referring to an instance of java.lang.Object :) - */ - - if ((this instanceof ArrayType) || (t instanceof ArrayType)) - return Type.OBJECT; - // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? - - if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) || - ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) - return Type.OBJECT; - // TODO: The above line is correct comparing to the vmspec2. But one could - // make class file verification a bit stronger here by using the notion of - // superinterfaces or even castability or assignment compatibility. - - - // this and t are ObjectTypes, see above. - ObjectType thiz = (ObjectType) this; - ObjectType other = (ObjectType) t; - JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); - JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); - - if ((thiz_sups == null) || (other_sups == null)) { - return null; - } - - // Waaahh... - JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; - JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; - System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); - System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); - this_sups[0] = Repository.lookupClass(thiz.getClassName()); - t_sups[0] = Repository.lookupClass(other.getClassName()); - - for (int i = 0; i < t_sups.length; i++) { - for (int j = 0; j < this_sups.length; j++) { - if (this_sups[j].equals(t_sups[i])) return new ObjectType(this_sups[j].getClassName()); - } - } - - // Huh? Did you ask for Type.OBJECT's superclass?? - return null; + + if ((this instanceof ArrayType) || (t instanceof ArrayType)) + return Type.OBJECT; + // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? + + if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) || + ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) + return Type.OBJECT; + // TODO: The above line is correct comparing to the vmspec2. But one could + // make class file verification a bit stronger here by using the notion of + // superinterfaces or even castability or assignment compatibility. + + + // this and t are ObjectTypes, see above. + ObjectType thiz = (ObjectType) this; + ObjectType other = (ObjectType) t; + JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); + JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); + + if ((thiz_sups == null) || (other_sups == null)) { + return null; } + + // Waaahh... + JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; + JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; + System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); + System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); + this_sups[0] = Repository.lookupClass(thiz.getClassName()); + t_sups[0] = Repository.lookupClass(other.getClassName()); + + for (int i = 0; i < t_sups.length; i++) { + for (int j = 0; j < this_sups.length; j++) { + if (this_sups[j].equals(t_sups[i])) return new ObjectType(this_sups[j].getClassName()); + } + } + + // Huh? Did you ask for Type.OBJECT's superclass?? + return null; + } } diff --git a/src/java/org/apache/bcel/generic/SIPUSH.java b/src/java/org/apache/bcel/generic/SIPUSH.java index e1e216b9..c2c40eb2 100644 --- a/src/java/org/apache/bcel/generic/SIPUSH.java +++ b/src/java/org/apache/bcel/generic/SIPUSH.java @@ -110,7 +110,6 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { return Type.SHORT; } - /** * Call corresponding visitor method(s). The order is: * Call visitor methods of implemented interfaces first, then diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index 79a0b3d1..dacb8e23 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -85,7 +85,7 @@ public abstract class Type implements java.io.Serializable { public static final ObjectType STRINGBUFFER = new ObjectType("java.lang.StringBuffer"); public static final ObjectType THROWABLE = new ObjectType("java.lang.Throwable"); public static final Type[] NO_ARGS = new Type[0]; - public static final ReferenceType NULL = new ReferenceType(); + public static final ReferenceType NULL = new ReferenceType(){}; public static final Type UNKNOWN = new Type(Constants.T_UNKNOWN, ""){}; -- GitLab From 8b85720148cc10b0f636e02c2ecf878bb5aa326e Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 7 Aug 2002 18:05:51 +0000 Subject: [PATCH 0135/1313] Fixed to getTypecode git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152825 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/InstructionComparator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/InstructionComparator.java b/src/java/org/apache/bcel/generic/InstructionComparator.java index 115689c8..ac63370b 100644 --- a/src/java/org/apache/bcel/generic/InstructionComparator.java +++ b/src/java/org/apache/bcel/generic/InstructionComparator.java @@ -95,7 +95,7 @@ public interface InstructionComparator { return ((IndexedInstruction)i1).getIndex() == ((IndexedInstruction)i2).getIndex(); } else if(i1 instanceof NEWARRAY) { - return ((NEWARRAY)i1).type == ((NEWARRAY)i2).type; + return ((NEWARRAY)i1).getTypecode() == ((NEWARRAY)i2).getTypecode(); } } -- GitLab From 85baa0aa33316118ab96f3f10b3cb41c42d419e6 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 9 Aug 2002 13:09:31 +0000 Subject: [PATCH 0136/1313] link fixed git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152826 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/ClassParser.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/ClassParser.java b/src/java/org/apache/bcel/classfile/ClassParser.java index f5ccc640..0e0eaf3a 100644 --- a/src/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/java/org/apache/bcel/classfile/ClassParser.java @@ -59,12 +59,11 @@ import java.io.*; import java.util.zip.*; /** - * Wrapper class that parses a given Java .class file. The method - * parse returns a - * + * Wrapper class that parses a given Java .class file. The method parse returns a * JavaClass object on success. When an I/O error or an - * inconsistency occurs an appropiate exception is propagated back - * to the caller. + * inconsistency occurs an appropiate exception is propagated back to + * the caller. * * The structure and the names comply, except for a few conveniences, * exactly with the @@ -72,7 +71,7 @@ import java.util.zip.*; * further details about the structure of a bytecode file. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class ClassParser { private DataInputStream file; -- GitLab From 3cc7dee81889f1c0f37a44c74d5701b45b059483 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Mon, 9 Sep 2002 03:20:27 +0000 Subject: [PATCH 0137/1313] o Adding navigation.xml file and removing the API link as it is generated by maven. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152827 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/navigation.xml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 xdocs/navigation.xml diff --git a/xdocs/navigation.xml b/xdocs/navigation.xml new file mode 100644 index 00000000..25d809f3 --- /dev/null +++ b/xdocs/navigation.xml @@ -0,0 +1,22 @@ + + + + BCEL + + +

      + + + + + + + + + + + + + + + -- GitLab From b40eb761f1cb991468487a714270c8ea5eeb1cc6 Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Mon, 9 Sep 2002 03:20:52 +0000 Subject: [PATCH 0138/1313] o Adding logo git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152828 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/images/logo.gif | Bin 0 -> 5128 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 xdocs/images/logo.gif diff --git a/xdocs/images/logo.gif b/xdocs/images/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee6553b553563e032991b2d04a45c897fde94d37 GIT binary patch literal 5128 zcmZ?wbhEHbbY#e7_|Cxa_3PIUA3nsy#6&rJG&VLqd-~MJ$7j-{NzrT0WT&g)XYH)1B=)8OPPDEHZ#75`g!-u}s78Y7+d-v{@ zmzV$b>z9s-Qd?V_j+T;kYn7!X9Cb84efsqB#fz0IR`76hJ32b9m_B96k|lxG zMzyuIot>Tc?%g|a;^e`D2WQTldGyF>8(non9hG}`?o92SaqQSJH#fIkyLK6Bsw9W_ z#5owxojdp6-@if5hA}QSnQnp3CMMgqZF4Zv@O3ixGB*x&wGMUEV`gId{{4HPo%Ng7 zuamv4lbr2bO*GG)JNNtd@3^?+*4A!kW7TLs?@O01smdut*%~Fd7;|y5NQp{Hh=_;? z@-1Js%+J|bQc_Y@Ld3_^GBqVD%hTFSUv0sH1vhWr6yW8I@(wL6sycP@?8i@E4(#7& zVr2dO`_HDTItw*511)8DQ(Z?BO(zq*j~_qUXsJs{Dzme)q{YR2c=wTqTcoPA?9QD# zE=F3@rcI3Uuu@XinlpQmow1<+pCAh}r=7aS|NnmtbyfcU{r}_JkG#A*H!E#1AxRru zBTiP%Y$qdmIZ1O(bv6zjF-duLcDC2AU%!6!>fgVAlP6Dp_3G8jmoGnk{P_FN@8{2- z|NQw=T}!X2tijd7YU8|B`31G<>FLptVV)lDrG=?8W=xndZO;35@1pE&K7IQ5`_JE> zKfZnW@@3xaIbXkiDk(1R?(XUB>8!3On9x5VFDvQQ%U5sTzU^pj+`Vjbc6RogH?Lm5 zdR<>qQC?P%otZadLdBjnEAstA?DQ0yo13fZ>OHMAR;}AyniQIwk(-;7Q|xVZXltW>h5bS-T5vbO3L^wZ+>p?V)fw9;suMlTok@>3Gl7eYc&k9tog8l!RZ{kMe>fcech2Mt_6bsG-npP z57O>D?%e+0&o$w`sw(@DC70aT+?a1fX20h7nJ?PM&!9A+qwjFT5e7B~_pT;$nhQQl*_ zd;=Wd)g-zU6Asa3+ae5qCY_Iy{!TE_RZU`TYoOgiHMSJCvOFRs$77zL* z3^)WBC8s-l>&mf+V-w;~*|6Yn!T${#jtU8#WMXEu6Hr*ruMn^xgz1(+z#*m@J%N6i z6+4tz42=~S`lhN&e7@yp+WNDf&uIdKUxv*K1_xIL28N@{=9F2niC3B^tXjbzbIFO% z@Yp0-`&`yWXE%n z!>?Mfq~OrhrI(s?)*MmF_TA!X;={!K;$a)Rz@5MrCV?X#*j7dBIC+^)%1pU%;>)xe zBW;HbclhIa>s(wWnsg{MG3j41;865A;n1v^v**Jh>3;#2+IwpReRWTHma8svy#M0k zF)k&C14lSq?;Jd$#&zPuF{SAz{uj90MQ?ZXF?c^K*W}jctELkSQgR%dMFn~kb_$vw z-g}bUQsJXEHgm_DNbZ|-vg7&EEiNfPF1K+^^wDh+EU7m5&0(}5u}kKs zLx7iH%Yw}(#I~~*|{K@OKZuEoEFxZ zPbRZT&k!iKIpjLOuH=@(QT0I8e=ibQgvBZ*a0m-HBpl%?zc8QamI9aA62^38j}~?g zM~;95CgzwE9G|on?O9^#qdYaBMe~w?rIUt&p!Np`9+3(CqAE@-@zE^OJqP*(pDgB( zGdQGnZab@gPD+!|$_FhepZnP)IAs$B9C`lhI2;mnaA1_zS;(HUfIYauiLus*OQc_im{S5;q4v~XQj4=nfbQli2?0vwepTMkj%b+7DWsyjE z1B0SbV2g>wN&62;_is)MpE_&KV%F#x&5EBAIkfL6Hk$8tR`Pn-s1(sCvWP)mF(Zsc zu;&1WfCLN6tqmL@M^?$lURn6+A0xM8j-!Y^$6?tUJ2<%o4t4xE94*+>&?vKD5$k4c zSKbfP`=g^2`~G>jxdi>R`}udVwB-#ZjjV(Y9v@yNZ3!37(<>TwX*yK&bu_*)3+&kS zR5?$sf>|xDKr>D0T%@R@gtXX%MuQXu=DooU92|lFTSR-_Pg`2Rd_QFZhs8Bt7P$j) z44DePX%apY+N0+!{ujujns7)^|G@#acbZJv5eEg9S|oA4Z#c3x@k@u;f+d1B2Uu8r z_?dG)95Zstlaj$gj@?_FboDlNm_InfTpr||gFb1E=6`aNYq6JtyRvzA7SyXypgZHb8jVhfnqLM&XTt2J$3^yPqp zi$RCW9)~sa*Jgg2)hU^}M@Tg6g_Cs%Lu_8k1A%EBw*?(N`z&)D`ELpwlx?xxYIG?_ zxW9%`>&b+B-`0L#CSG~y!n;3^&*!~#>=ZU z;aq}i8hGHZ_$JKUsE1jG7>v@ z;92Tn=^pM|?8TzWsUMCjeVNdx^P+j542QGKEy1=Z5A&jF3hdHF6WAoD82)Dy*w9eA zn9GLa33IWbU0zN?zzvxl$wJ{9^7%JxXzX3(kd+qSTm8`NMJ!BgW7pLjUr2|$9L9U6K?cM9pXvb;cnwm<0P3NcGO3qb|t+L4nANn#J*^(---B;mincNRq&-G{9ggp+wHO`Z8{b2CM zqrs6oVa6eqD+Uce^R@_Vx#9d*LE(vuN>Yom!jYJ-$62%!6ml9HYFzp^Y^wj!B(iMk zL5-|^Y@&aXm^CIeaYdc(h)TK0)W&d6nVr#frITQ1@rQN>3&r0TF8xrRTi_6J_X4x^ zo~a% zqu799vH;Wm2P{D!xU~vcV++_GJYZYI;3Jv9+GYMLkT2;Ww$J!RkR=((~pa>)Pt_7*x z5BP38U||+uD*P|Ns^P$XZ3DmcQ9kL^u&@M{W&tOG3;DSR*ls)2vNjfVerBJMz~$@8 zo+ZE+yn$`90&8Rf_fl8p2!RZNh~_s5ES&}%#!vWb3?#3nr-~iXhzMj~z92a70ZY6B zt0DuN#s!x84@}VxTzuOZ+XdLdUU>deVGa;Whp_b*{@MbjMh`et1z3_itp0jPvI(*@TrkcR;LQHPv*Q6jk7bQ?1FMV!YwHHiq6Zu` z6O_6h`*A3UZ8nq_`5(x)Goh_-0_U#+UZxGfk_}8z*I5GtIFt*RrUbBE4K!=)s1I;p zuyBx0IAZiafc<|F)B6d`;;zgl4UBP~%*6}XJp@etTXb@UK^ z8tTB9m!QHhdHTNw?a)Ngm?P;@0#Y3h7Ji7+z%f56XH zpd;GIyv%@E)R0X?fM0NeNI?L@T_f>dO`1goOu7L~stF7WZtAcpwsAjT;!EI>e8@F# z1A~2lpxFjRUIt#K2b{eBA2IN4;CF6dI5vSn#DMSR1g5(}st+zPSTXRGe({BY9!HHZ70#^SF+NUqzwsT6vH zQ0HMZi+-TaBA^}PXeGqRB>aJ2uz_LmL;m1O5z7ty;!=x65_skns8=+xt2|&hbCXHl zfYHW)+3^AcYXgVu0j^UAxGD-5j1TCXO_JQGz;33%@=t*A-vVyYkL)WJaPO#`BP5_F zn!qDiz{I_g!ApUGb{e#AWw@e~;(N6}Rdw6ByVTmRT-f5j^6&+F4L`0kfcif?5G*N9U@lTlMD_@^CC* z4t>?TEVBB)0=M7-X1xQf(;XPoPOkoSsh)2EZ{-FS{|EdVvZijFxWcSq?b-z9Zv{*S zf_hJ));+6Q_b`d)#xKT~3M?-lFjy&=EG(S$KY($jF|(QiOQMv{pIhtyof0T2;AC5% z<#j>e*Nf>(j00CWFnB4jiwJOQ8nDeZ+9(peQCM5$zXIc?25|?6*)0~bDplg54orCo zTo)1+Ys}uHHCyDEgStY1I?DlB(~FtrN@|k-1E;5bWZ-|mX?1$D&F#&$uQyxm-t3$$ z_U-31rVot&8n|^7gno(7mginOg^QohfKgR|k?#SU!se|`#iB>OdTwP+oxaiJ{{lYs z0H)sym_HUUrExZyHHw=*(zAQGEx~B>=ZieL2@EeinXDdgmCoL9^pvpm67hQLZJ!PK zizYC52{3X$nB(gyFMQA>(P>-5?XAj=o4+h%l)AO}!UsmJ%|er2>lD3Q*7BY;GX+?r#$0!yNMPF*}Hs$r?O0( zX!4L%Re(RQfQfqn_x#(T<}1w-oVGo(kiKOty{emAfq`$we*wnxky9;{wsrp6Qo7no zp+a)i1BQdG`J%)xt+_+dN&pmpzd|SZ_b;wg4I}CeBn;%Rm{;J4j%SC z9H^t1u-nV*weT5-87c|<{tK87aPL?aeU#(&G0}y4%DR>JHE`K1;9GZq!Sd;aBg~3z z)qzLK9d}$Z)b{OEW=v4={J?))Vc&rlTg`8tWMSq%rn&X_u2r5BSgs4rNEYCZQP|yZ zX5zNr{AUvw@*9{R8R@-vrMt3$*|LEnCV{D=fdA11rX34drbZriSu;P8o4H~G%Xdqi z3o>U97cos&n0$Nz@2Zzvw>wuz{Mk|LEy%OL=$iuD;-GWSYR>Tru;^Z}ThqWM62NFy zz;N>RN%N0~nz(s|4=`0Lo&CdecKQS+bs+|k15$hiddH&n6uuPpR$$L}V32yiDkX4H hK=z`L?M2bGj1CT52R1P{Brx55xbf<3env(HYXBmx5+MKp literal 0 HcmV?d00001 -- GitLab From 910ae17e4eedf792dce6137f7164cb2f31657d25 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 18 Sep 2002 18:01:30 +0000 Subject: [PATCH 0139/1313] Japanese site added PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152829 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/stylesheets/project.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xdocs/stylesheets/project.xml b/xdocs/stylesheets/project.xml index 797c314f..1b10c466 100644 --- a/xdocs/stylesheets/project.xml +++ b/xdocs/stylesheets/project.xml @@ -29,5 +29,8 @@ + + + -- GitLab From 36839ec8d05eef546a9a87f0bcee3053cb94d596 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 11 Oct 2002 20:33:07 +0000 Subject: [PATCH 0140/1313] else true git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152830 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/InstructionComparator.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/java/org/apache/bcel/generic/InstructionComparator.java b/src/java/org/apache/bcel/generic/InstructionComparator.java index ac63370b..b2e95528 100644 --- a/src/java/org/apache/bcel/generic/InstructionComparator.java +++ b/src/java/org/apache/bcel/generic/InstructionComparator.java @@ -96,6 +96,8 @@ public interface InstructionComparator { ((IndexedInstruction)i2).getIndex(); } else if(i1 instanceof NEWARRAY) { return ((NEWARRAY)i1).getTypecode() == ((NEWARRAY)i2).getTypecode(); + } else { + return true; } } -- GitLab From a496505e1559f781771e14a31de1a2ed4d079677 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 11 Oct 2002 20:34:47 +0000 Subject: [PATCH 0141/1313] Use generic repository git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152831 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Repository.java | 30 +++-- .../bcel/util/ClassLoaderRepository.java | 110 ++++++++++-------- src/java/org/apache/bcel/util/Repository.java | 60 +++++++--- .../apache/bcel/util/SyntheticRepository.java | 7 ++ 4 files changed, 132 insertions(+), 75 deletions(-) diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index bb610668..6ab4aadd 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -61,16 +61,33 @@ import java.io.*; /** * The repository maintains informations about class interdependencies, e.g., * whether a class is a sub-class of another. Delegates actual class loading - * to SyntheticRepository. + * to SyntheticRepository with current class path by default. + * + * @see org.apache.bcel.util.Repository + * @see org.apache.bcel.util.SyntheticRepository * * @version $Id$ * @author M. Dahm */ public abstract class Repository { - private static org.apache.bcel.util.SyntheticRepository _repository = + private static org.apache.bcel.util.Repository _repository = SyntheticRepository.getInstance(); - /** Lookup class somewhere found in your CLASSPATH. + /** @return currently used repository instance + */ + public static org.apache.bcel.util.Repository getRepository() { + return _repository; + } + + /** Set repository instance to be used for class loading + */ + public static void setRepository(org.apache.bcel.util.Repository rep) { + _repository = rep; + } + + /** Lookup class somewhere found on your CLASSPATH, or whereever the + * repository instance looks for it. + * * @return class object for given fully qualified class name, or null * if the class could not be found or parsed correctly */ @@ -136,12 +153,6 @@ public abstract class Repository { _repository.removeClass(clazz); } - /* - private static final JavaClass getSuperClass(JavaClass clazz) { - return clazz.getSuperClass(); - } - */ - /** * @return list of super classes of clazz in ascending order, i.e., * Object is always the last element @@ -234,3 +245,4 @@ public abstract class Repository { return implementationOf(lookupClass(clazz), inter); } } + diff --git a/src/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/java/org/apache/bcel/util/ClassLoaderRepository.java index 10d19266..acc3b54e 100644 --- a/src/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -67,27 +67,32 @@ import org.apache.bcel.classfile.*; * * It loads its data from the ClassLoader implementation * passed into its constructor. + * + * @see org.apache.bcel.Repository + * + * @version $Id$ + * @author M. Dahm + * @author David Dixon-Peugh */ - public class ClassLoaderRepository - implements Repository + implements Repository { - private java.lang.ClassLoader loader; - private Map loadedClasses = - new HashMap(); // CLASSNAME X JAVACLASS + private java.lang.ClassLoader loader; + private HashMap loadedClasses = + new HashMap(); // CLASSNAME X JAVACLASS - public ClassLoaderRepository( java.lang.ClassLoader loader ) { - this.loader = loader; - } + public ClassLoaderRepository( java.lang.ClassLoader loader ) { + this.loader = loader; + } - /** - * Store a new JavaClass into this Repository. - */ - public void storeClass( JavaClass clazz ) { - loadedClasses.put( clazz.getClassName(), - clazz ); - clazz.setRepository( this ); - } + /** + * Store a new JavaClass into this Repository. + */ + public void storeClass( JavaClass clazz ) { + loadedClasses.put( clazz.getClassName(), + clazz ); + clazz.setRepository( this ); + } /** * Remove class from repository @@ -96,44 +101,55 @@ public class ClassLoaderRepository loadedClasses.remove(clazz.getClassName()); } - /** - * Find an already defined JavaClass. - */ - public JavaClass findClass( String className ) { - if ( loadedClasses.containsKey( className )) { - return (JavaClass) loadedClasses.get( className ); - } else { - return null; - } + /** + * Find an already defined JavaClass. + */ + public JavaClass findClass( String className ) { + if ( loadedClasses.containsKey( className )) { + return (JavaClass) loadedClasses.get( className ); + } else { + return null; } + } - /** - * Lookup a JavaClass object from the Class Name provided. - */ - public JavaClass loadClass( String className ) - throws ClassNotFoundException - { - String classFile = className.replace('.', '/'); + /** + * Lookup a JavaClass object from the Class Name provided. + */ + public JavaClass loadClass( String className ) + throws ClassNotFoundException + { + String classFile = className.replace('.', '/'); - JavaClass RC = findClass( className ); - if (RC != null) { return RC; } + JavaClass RC = findClass( className ); + if (RC != null) { return RC; } - try { - InputStream is = - loader.getResourceAsStream( classFile + ".class" ); + try { + InputStream is = + loader.getResourceAsStream( classFile + ".class" ); - if(is == null) { - throw new ClassNotFoundException(className + " not found."); - } + if(is == null) { + throw new ClassNotFoundException(className + " not found."); + } - ClassParser parser = new ClassParser( is, className ); - RC = parser.parse(); + ClassParser parser = new ClassParser( is, className ); + RC = parser.parse(); - storeClass( RC ); + storeClass( RC ); - return RC; - } catch (IOException e) { - throw new ClassNotFoundException( e.toString() ); - } + return RC; + } catch (IOException e) { + throw new ClassNotFoundException( e.toString() ); } + } + + public JavaClass loadClass(Class clazz) throws ClassNotFoundException { + return loadClass(clazz.getName()); + } + + /** Clear all entries from cache. + */ + public void clear() { + loadedClasses.clear(); + } } + diff --git a/src/java/org/apache/bcel/util/Repository.java b/src/java/org/apache/bcel/util/Repository.java index aac03859..92556fd4 100644 --- a/src/java/org/apache/bcel/util/Repository.java +++ b/src/java/org/apache/bcel/util/Repository.java @@ -56,28 +56,50 @@ package org.apache.bcel.util; import org.apache.bcel.classfile.JavaClass; +/** + * Abstract definition of a class repository. Instances may be used + * to load classes from different sources and may be used in the + * Repository.setRpeository method. + * + * @see org.apache.bcel.Repository + * @version $Id$ + * @author M. Dahm + * @author David Dixon-Peugh + */ public interface Repository extends java.io.Serializable { - /** - * Store the provided class under "clazz.getClassName()" - */ - public void storeClass( JavaClass clazz ); + /** + * Store the provided class under "clazz.getClassName()" + */ + public void storeClass(JavaClass clazz); - /** - * Remove class from repository - */ - public void removeClass( JavaClass clazz ); + /** + * Remove class from repository + */ + public void removeClass(JavaClass clazz); - /** - * Find the class with the name provided, if the class - * isn't there, return NULL. - */ - public JavaClass findClass( String className ); + /** + * Find the class with the name provided, if the class + * isn't there, return NULL. + */ + public JavaClass findClass(String className); + + /** + * Find the class with the name provided, if the class + * isn't there, make an attempt to load it. + */ + public JavaClass loadClass(String className) + throws java.lang.ClassNotFoundException; + /** + * Find the JavaClass instance for the given run-time class object + */ + public JavaClass loadClass(Class clazz) + throws java.lang.ClassNotFoundException; - /** - * Find the class with the name provided, if the class - * isn't there, make an attempt to load it. - */ - public JavaClass loadClass( String className ) - throws java.lang.ClassNotFoundException; + /** Clear all entries from cache. + */ + public void clear(); } + + + diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/java/org/apache/bcel/util/SyntheticRepository.java index 4efb7021..cbe60333 100644 --- a/src/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/java/org/apache/bcel/util/SyntheticRepository.java @@ -71,6 +71,13 @@ import org.apache.bcel.classfile.*; * It is designed to be used as a singleton, however it * can also be used with custom classpaths. * +/** + * Abstract definition of a class repository. Instances may be used + * to load classes from different sources and may be used in the + * Repository.setRpeository method. + * + * @see org.apache.bcel.Repository + * * @version $Id$ * @author M. Dahm * @author David Dixon-Peugh -- GitLab From f8a4db0e0df081f0a72468adf740a9832c331817 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Sun, 13 Oct 2002 21:56:16 +0000 Subject: [PATCH 0142/1313] Corrected a typo. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152832 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/Verifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/Verifier.java b/src/java/org/apache/bcel/verifier/Verifier.java index 932a39d3..9624195a 100644 --- a/src/java/org/apache/bcel/verifier/Verifier.java +++ b/src/java/org/apache/bcel/verifier/Verifier.java @@ -245,7 +245,7 @@ public class Verifier{ args[k] = args[k].replace('/', '.'); - System.out.println("Now verifiying: "+args[k]+"\n"); + System.out.println("Now verifying: "+args[k]+"\n"); Verifier v = VerifierFactory.getVerifier(args[k]); VerificationResult vr; -- GitLab From 8abf7cfda27b9a6ba3cf0dfcdbae04a24dcc54db Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 29 Oct 2002 18:41:27 +0000 Subject: [PATCH 0143/1313] getBase() git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152833 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/ClassPath.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index a17690c3..3c7f30b0 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -298,7 +298,7 @@ public class ClassPath implements Serializable { /** Contains information about file/ZIP entry of the Java class. */ - public abstract static class ClassFile { + public interface ClassFile { /** @return input stream for class file. */ public abstract InputStream getInputStream() throws IOException; @@ -307,6 +307,11 @@ public class ClassPath implements Serializable { */ public abstract String getPath(); + /** @return base path of found class, i.e. class is contained relative + * to that path + */ + public abstract String getBase(); + /** @return modification time of class file. */ public abstract long getTime(); @@ -335,6 +340,8 @@ public class ClassPath implements Serializable { } public long getTime() { return file.lastModified(); } public long getSize() { return file.length(); } + public String getBase() { return dir; } + } : null; } @@ -354,6 +361,9 @@ public class ClassPath implements Serializable { public String getPath() { return entry.toString(); } public long getTime() { return entry.getTime(); } public long getSize() { return entry.getSize(); } + public String getBase() { + return zip.getName(); + } } : null; } } -- GitLab From 338623d5937e3e3b5e55f27bb2e483b720bcef60 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sat, 9 Nov 2002 17:09:03 +0000 Subject: [PATCH 0144/1313] New TransitiveHull example, may be extended soon git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152834 13f79535-47bb-0310-9956-ffa450edef68 --- examples/TransitiveHull.java | 150 ++++++++++++++++++ src/java/org/apache/bcel/util/ClassQueue.java | 4 +- src/java/org/apache/bcel/util/ClassSet.java | 96 +++++++++++ 3 files changed, 248 insertions(+), 2 deletions(-) create mode 100644 examples/TransitiveHull.java create mode 100644 src/java/org/apache/bcel/util/ClassSet.java diff --git a/examples/TransitiveHull.java b/examples/TransitiveHull.java new file mode 100644 index 00000000..2f8bbb93 --- /dev/null +++ b/examples/TransitiveHull.java @@ -0,0 +1,150 @@ +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.util.*; +import java.io.*; +import java.util.*; +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; + +/** + * Find all classes referenced by given start class and all classes + * referenced by tjose and so on. In other words: Compute the tranitive + * hull of classes used by a given class. This is done by checking all + * ConstantClass entries and all method and field signatures.
      This + * may be useful in order to put all class files of an application + * into a single JAR file. + *

      + * It fails however in the presence of reflection code. + * + * @version $Id$ + * @author M. Dahm + */ +public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { + private JavaClass _class; + private ClassQueue _queue; + private ClassSet _set; + private ConstantPool _cp; + + private String[] _ignored = { + "java[.].*", + "javax[.].*", + "com[.]sun[.].*" + }; + + + public TransitiveHull(JavaClass clazz) { + _queue = new ClassQueue(); + _queue.enqueue(clazz); + _set = new ClassSet(); + _set.add(clazz); + } + + public JavaClass[] getClasses() { + return _set.toArray(); + } + + public String[] getClassNames() { + return _set.getClassNames(); + } + + /** + * Start traversal using DescendingVisitor pattern. + */ + public void start() { + while(!_queue.empty()) { + JavaClass clazz = _queue.dequeue(); + _class = clazz; + _cp = clazz.getConstantPool(); + + new org.apache.bcel.classfile.DescendingVisitor(clazz, this).visit(); + } + } + + private void add(String class_name) { + class_name = class_name.replace('/', '.'); + + for(int i = 0; i < _ignored.length; i++) { + if(class_name.matches(_ignored[i])) { + return; // Ihh + } + } + + JavaClass clazz = Repository.lookupClass(class_name); + + if(clazz != null && _set.add(clazz)) { + _queue.enqueue(clazz); + } + } + + public void visitConstantClass(ConstantClass cc) { + String class_name = (String)cc.getConstantValue(_cp); + add(class_name); + } + + private void visitRef(ConstantCP ccp, boolean method) { + String class_name = ccp.getClass(_cp); + add(class_name); + + ConstantNameAndType cnat = (ConstantNameAndType)_cp. + getConstant(ccp.getNameAndTypeIndex(), Constants.CONSTANT_NameAndType); + + String signature = cnat.getSignature(_cp); + + if(method) { + Type type = Type.getReturnType(signature); + + if(type instanceof ObjectType) { + add(((ObjectType)type).getClassName()); + } + + Type[] types = Type.getArgumentTypes(signature); + + for(int i = 0; i < types.length; i++) { + type = types[i]; + if(type instanceof ObjectType) { + add(((ObjectType)type).getClassName()); + } + } + } else { + Type type = Type.getType(signature); + if(type instanceof ObjectType) { + add(((ObjectType)type).getClassName()); + } + } + } + + public void visitConstantMethodref(ConstantMethodref cmr) { + visitRef(cmr, true); + } + + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref cimr) { + visitRef(cimr, true); + } + + public void visitConstantFieldref(ConstantFieldref cfr) { + visitRef(cfr, false); + } + + public static void main(String[] argv) { + ClassParser parser=null; + JavaClass java_class; + + try { + if(argv.length == 0) { + System.err.println("transitive: No input files specified"); + } + else { + if((java_class = Repository.lookupClass(argv[0])) == null) { + java_class = new ClassParser(argv[0]).parse(); + } + + TransitiveHull hull = new TransitiveHull(java_class); + + hull.start(); + System.out.println(Arrays.asList(hull.getClassNames())); + } + } catch(Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/java/org/apache/bcel/util/ClassQueue.java b/src/java/org/apache/bcel/util/ClassQueue.java index a8227f03..3d28951a 100644 --- a/src/java/org/apache/bcel/util/ClassQueue.java +++ b/src/java/org/apache/bcel/util/ClassQueue.java @@ -53,7 +53,7 @@ package org.apache.bcel.util; * information on the Apache Software Foundation, please see * . */ -import java.util.ArrayList; +import java.util.LinkedList; import org.apache.bcel.classfile.JavaClass; /** @@ -65,7 +65,7 @@ import org.apache.bcel.classfile.JavaClass; * @see ClassVector */ public class ClassQueue implements java.io.Serializable { - protected ArrayList vec = new ArrayList(); + protected LinkedList vec = new LinkedList(); public void enqueue(JavaClass clazz) { vec.add(clazz); } diff --git a/src/java/org/apache/bcel/util/ClassSet.java b/src/java/org/apache/bcel/util/ClassSet.java new file mode 100644 index 00000000..fd740439 --- /dev/null +++ b/src/java/org/apache/bcel/util/ClassSet.java @@ -0,0 +1,96 @@ +package org.apache.bcel.util; + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache BCEL" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache BCEL", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +import java.util.HashMap; +import java.util.Collection; +import org.apache.bcel.classfile.JavaClass; + +/** + * Utility class implementing a (typesafe) set of JavaClass objects. + * Since JavaClass has no equals() method, the name of the class is + * used for comparison. + * + * @version $Id$ + * @author M. Dahm + * @see Stack +*/ +public class ClassSet implements java.io.Serializable { + private HashMap _map = new HashMap(); + + public boolean add(JavaClass clazz) { + boolean result = false; + + if(!_map.containsKey(clazz.getClassName())) { + result = true; + _map.put(clazz.getClassName(), clazz); + } + + return result; + } + + public void remove(JavaClass clazz) { _map.remove(clazz.getClassName()); } + public boolean empty() { return _map.isEmpty(); } + + public JavaClass[] toArray() { + Collection values = _map.values(); + JavaClass[] classes = new JavaClass[values.size()]; + values.toArray(classes); + return classes; + } + + public String[] getClassNames() { + return (String[])_map.keySet().toArray(new String[_map.keySet().size()]); + } +} -- GitLab From d664a2619aee6450b2773e7eb1c4aad3ca4fe104 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sun, 10 Nov 2002 18:30:05 +0000 Subject: [PATCH 0145/1313] TH works for arrays too, Dont use JDK1.4 regex git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152835 13f79535-47bb-0310-9956-ffa450edef68 --- examples/TransitiveHull.java | 77 +++++++++++++------ src/java/org/apache/bcel/util/ClassPath.java | 2 +- .../apache/bcel/util/SyntheticRepository.java | 2 +- 3 files changed, 56 insertions(+), 25 deletions(-) diff --git a/examples/TransitiveHull.java b/examples/TransitiveHull.java index 2f8bbb93..6d638386 100644 --- a/examples/TransitiveHull.java +++ b/examples/TransitiveHull.java @@ -5,16 +5,20 @@ import java.io.*; import java.util.*; import org.apache.bcel.Constants; import org.apache.bcel.Repository; +import org.apache.regexp.*; /** * Find all classes referenced by given start class and all classes - * referenced by tjose and so on. In other words: Compute the tranitive + * referenced by those and so on. In other words: Compute the transitive * hull of classes used by a given class. This is done by checking all * ConstantClass entries and all method and field signatures.
      This * may be useful in order to put all class files of an application - * into a single JAR file. + * into a single JAR file, e.g.. *

      - * It fails however in the presence of reflection code. + * It fails however in the presence of reflexive code aka introspection. + *

      + * You'll need Apache's regular expression library supplied together + * with BCEL to use this class. * * @version $Id$ * @author M. Dahm @@ -24,14 +28,20 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { private ClassQueue _queue; private ClassSet _set; private ConstantPool _cp; + private String[] _ignored = IGNORED; - private String[] _ignored = { + public static final String[] IGNORED = { "java[.].*", "javax[.].*", - "com[.]sun[.].*" + "sun[.].*", + "sunw[.].*", + "com[.]sun[.].*", + "org[.]omg[.].*", + "org[.]w3c[.].*", + "org[.]xml[.].*", + "net[.]jini[.].*" }; - public TransitiveHull(JavaClass clazz) { _queue = new ClassQueue(); _queue.enqueue(clazz); @@ -63,14 +73,21 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { private void add(String class_name) { class_name = class_name.replace('/', '.'); - for(int i = 0; i < _ignored.length; i++) { - if(class_name.matches(_ignored[i])) { - return; // Ihh + try { + for(int i = 0; i < _ignored.length; i++) { + RE regex = new RE(_ignored[i]); + + if(regex.match(class_name)) { + return; // Ihh + } } + } catch(RESyntaxException ex) { + System.out.println(ex); + return; } - + JavaClass clazz = Repository.lookupClass(class_name); - + if(clazz != null && _set.add(clazz)) { _queue.enqueue(clazz); } @@ -81,6 +98,16 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { add(class_name); } + private void checkType(Type type) { + if(type instanceof ArrayType) { + type = ((ArrayType)type).getBasicType(); + } + + if(type instanceof ObjectType) { + add(((ObjectType)type).getClassName()); + } + } + private void visitRef(ConstantCP ccp, boolean method) { String class_name = ccp.getClass(_cp); add(class_name); @@ -92,24 +119,16 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { if(method) { Type type = Type.getReturnType(signature); - - if(type instanceof ObjectType) { - add(((ObjectType)type).getClassName()); - } + + checkType(type); Type[] types = Type.getArgumentTypes(signature); for(int i = 0; i < types.length; i++) { - type = types[i]; - if(type instanceof ObjectType) { - add(((ObjectType)type).getClassName()); - } + checkType(types[i]); } } else { - Type type = Type.getType(signature); - if(type instanceof ObjectType) { - add(((ObjectType)type).getClassName()); - } + checkType(Type.getType(signature)); } } @@ -124,6 +143,18 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { public void visitConstantFieldref(ConstantFieldref cfr) { visitRef(cfr, false); } + + public String[] getIgnored() { + return _ignored; + } + + /** + * Set the value of _ignored. + * @param v Value to assign to _ignored. + */ + public void setIgnored(String[] v) { + _ignored = v; + } public static void main(String[] argv) { ClassParser parser=null; diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index 3c7f30b0..70d5d255 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -308,7 +308,7 @@ public class ClassPath implements Serializable { public abstract String getPath(); /** @return base path of found class, i.e. class is contained relative - * to that path + * to that path, which may either denote a directory, or zip file */ public abstract String getBase(); diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/java/org/apache/bcel/util/SyntheticRepository.java index cbe60333..8ab1f56b 100644 --- a/src/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/java/org/apache/bcel/util/SyntheticRepository.java @@ -74,7 +74,7 @@ import org.apache.bcel.classfile.*; /** * Abstract definition of a class repository. Instances may be used * to load classes from different sources and may be used in the - * Repository.setRpeository method. + * Repository.setRepository method. * * @see org.apache.bcel.Repository * -- GitLab From 86a23eee9094f3ac88c0748d5e010c8fbe22efee Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Tue, 19 Nov 2002 12:24:11 +0000 Subject: [PATCH 0146/1313] Repaired two references. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152836 13f79535-47bb-0310-9956-ffa450edef68 --- TODO.JustIce | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/TODO.JustIce b/TODO.JustIce index d6f43731..86b87c1f 100644 --- a/TODO.JustIce +++ b/TODO.JustIce @@ -8,12 +8,13 @@ Sun. However, there are better methods such as the idea proposed by Staerk et al.: using sets of object types. JustIce may reject code that is not rejected by traditional JVM-internal verifiers for this reason. The corresponding checks all have some "TODO" tag with an -explanation; they're all in the 'InstConstraint.java' file. Users -encountering problems should simply comment them out (or uncomment -them) as they like. The default is some setting that works well -when using 'java org.apache.bcel.verifier.TransHull java.lang.String' -- that is, there are no rejects caused by the above problem in a lot -of usual classes. +explanation; they're all in the 'InstConstraintVisitor.java' file. +Users encountering problems should simply comment them out (or +uncomment them) as they like. The default is some setting that works +well when using +$ java org.apache.bcel.verifier.TransitiveHull java.lang.String +meaning there are no rejects caused by the above problem in a lot of +usual classes. - There are a few bugs concerning access rights of referenced methods and probably fields. The tests for access rights that Sun defines -- GitLab From b34ddad1f13abb75a53d858cf5392ee944f6cd68 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 20 Nov 2002 18:40:55 +0000 Subject: [PATCH 0147/1313] slightly better linked list git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152837 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/ClassQueue.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/java/org/apache/bcel/util/ClassQueue.java b/src/java/org/apache/bcel/util/ClassQueue.java index 3d28951a..f5db197f 100644 --- a/src/java/org/apache/bcel/util/ClassQueue.java +++ b/src/java/org/apache/bcel/util/ClassQueue.java @@ -67,15 +67,13 @@ import org.apache.bcel.classfile.JavaClass; public class ClassQueue implements java.io.Serializable { protected LinkedList vec = new LinkedList(); - public void enqueue(JavaClass clazz) { vec.add(clazz); } + public void enqueue(JavaClass clazz) { vec.addLast(clazz); } public JavaClass dequeue() { - JavaClass clazz = (JavaClass)vec.get(0); - vec.remove(0); - return clazz; + return (JavaClass)vec.removeFirst(); } - public boolean empty() { return vec.size() == 0; } + public boolean empty() { return vec.isEmpty(); } public String toString() { return vec.toString(); -- GitLab From 0d7c0086eca2457168e676be8e990565e3e14d1d Mon Sep 17 00:00:00 2001 From: Jason van Zyl Date: Sat, 23 Nov 2002 00:42:39 +0000 Subject: [PATCH 0148/1313] o fixing mailing list links. PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152838 13f79535-47bb-0310-9956-ffa450edef68 --- project.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/project.xml b/project.xml index 4cb49999..c0e26de0 100644 --- a/project.xml +++ b/project.xml @@ -12,7 +12,7 @@ 2002 org.apache.bcel - bcel-logo.gif + /images/bcel-logo.gif Bytecode Engineering Library @@ -39,8 +39,8 @@ BCEL Developer List - mailto:bcel-dev-subscribe@jakarta.apache.org - mailto:bcel-dev-unsubscribe@jakarta.apache.org + bcel-dev-subscribe@jakarta.apache.org + bcel-dev-unsubscribe@jakarta.apache.org http://www.mail-archive.com/bcel-dev@jakarta.apache.org/ -- GitLab From 1b9b87256451d6477687dd0f7a32973d970779a3 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sat, 23 Nov 2002 15:36:40 +0000 Subject: [PATCH 0149/1313] new project git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152839 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/projects.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xdocs/projects.xml b/xdocs/projects.xml index 542ce2b9..a2d7aa06 100644 --- a/xdocs/projects.xml +++ b/xdocs/projects.xml @@ -28,6 +28,10 @@

    • SandMark: Software Watermarking for Java
    • +
    • jContractor - + Design by contract +
    • +
    • Byte code optimization -- GitLab From ef36f3d6938c8f953da7073406d60affec71bd89 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 28 Nov 2002 07:36:53 +0000 Subject: [PATCH 0150/1313] Bug fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152840 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/util/BCELFactory.java | 58 +++++++++++-------- src/java/org/apache/bcel/util/BCELifier.java | 4 ++ 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/java/org/apache/bcel/util/BCELFactory.java b/src/java/org/apache/bcel/util/BCELFactory.java index 21cdcd3b..8fcb316f 100644 --- a/src/java/org/apache/bcel/util/BCELFactory.java +++ b/src/java/org/apache/bcel/util/BCELFactory.java @@ -82,30 +82,32 @@ class BCELFactory extends EmptyVisitor { private HashMap branch_map = new HashMap(); // Map public void start() { - for(InstructionHandle ih = _mg.getInstructionList().getStart(); - ih != null; ih = ih.getNext()) { - Instruction i = ih.getInstruction(); + if(!_mg.isAbstract() && !_mg.isNative()) { + for(InstructionHandle ih = _mg.getInstructionList().getStart(); + ih != null; ih = ih.getNext()) { + Instruction i = ih.getInstruction(); - if(i instanceof BranchInstruction) { - branch_map.put(i, ih); // memorize container - } - - if(ih.hasTargeters()) { if(i instanceof BranchInstruction) { - _out.println(" InstructionHandle ih_" + ih.getPosition() + ";"); + branch_map.put(i, ih); // memorize container + } + + if(ih.hasTargeters()) { + if(i instanceof BranchInstruction) { + _out.println(" InstructionHandle ih_" + ih.getPosition() + ";"); + } else { + _out.print(" InstructionHandle ih_" + ih.getPosition() + " = "); + } } else { - _out.print(" InstructionHandle ih_" + ih.getPosition() + " = "); + _out.print(" "); } - } else { - _out.print(" "); + + if(!visitInstruction(i)) + i.accept(this); } - if(!visitInstruction(i)) - i.accept(this); + updateBranchTargets(); + updateExceptionHandlers(); } - - updateBranchTargets(); - updateExceptionHandlers(); } private boolean visitInstruction(Instruction i) { @@ -127,8 +129,8 @@ class BCELFactory extends EmptyVisitor { Type type = i.getType(_cp); if(opcode == Constants.IINC) { - _out.println("il.append(new IINC(" + i.getIndex() + ", " + - ((IINC)i).getIncrement() + "));"); + _out.println("il.append(new IINC(" + i.getIndex() + ", " + + ((IINC)i).getIncrement() + "));"); } else { String kind = (opcode < Constants.ISTORE)? "Load" : "Store"; _out.println("il.append(_factory.create" + kind + "(" + @@ -176,10 +178,16 @@ class BCELFactory extends EmptyVisitor { } public void visitAllocationInstruction(AllocationInstruction i) { - CPInstruction in = (CPInstruction)i; - Type type = in.getType(_cp); - short opcode = in.getOpcode(); - int dim = 1; + Type type; + + if(i instanceof CPInstruction) { + type = ((CPInstruction)i).getType(_cp); + } else { + type = ((NEWARRAY)i).getType(); + } + + short opcode = ((Instruction)i).getOpcode(); + int dim = 1; switch(opcode) { case Constants.NEW: @@ -192,8 +200,8 @@ class BCELFactory extends EmptyVisitor { case Constants.ANEWARRAY: case Constants.NEWARRAY: - _out.println("il.append(_factory.createNewArray(\"" + - BCELifier.printType(type) + ", " + dim + "));"); + _out.println("il.append(_factory.createNewArray(" + + BCELifier.printType(type) + ", (short) " + dim + "));"); break; default: diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java index 52027e50..93d32eb3 100644 --- a/src/java/org/apache/bcel/util/BCELifier.java +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -96,6 +96,10 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { String package_name = clazz.getPackageName(); String inter = Utility.printArray(clazz.getInterfaceNames(), false, true); + if(!"".equals(package_name)) { + class_name = class_name.substring(package_name.length() + 1); + _out.println("package " + package_name + ";\n"); + } _out.println("import org.apache.bcel.generic.*;"); _out.println("import org.apache.bcel.classfile.*;"); -- GitLab From 65514aa96d83e0fa1857828cfb7e9052ba7a5e40 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sat, 30 Nov 2002 11:12:21 +0000 Subject: [PATCH 0151/1313] spaces git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152841 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/BCELifier.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java index 93d32eb3..4af7cba2 100644 --- a/src/java/org/apache/bcel/util/BCELifier.java +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -108,8 +108,8 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { _out.println("public class " + class_name + "Creator implements Constants {"); _out.println(" private InstructionFactory _factory;"); - _out.println(" private ConstantPoolGen _cp;"); - _out.println(" private ClassGen _cg;\n"); + _out.println(" private ConstantPoolGen _cp;"); + _out.println(" private ClassGen _cg;\n"); _out.println(" public " + class_name + "Creator() {"); _out.println(" _cg = new ClassGen(\"" + -- GitLab From 2baad335dbc0a404ed07e6d0c1eda91f69355862 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sat, 30 Nov 2002 11:16:44 +0000 Subject: [PATCH 0152/1313] Bug fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152842 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/generic/MethodGen.java | 65 ++++++++++++------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index 8cc680e7..df248a1b 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -122,37 +122,47 @@ public class MethodGen extends FieldGenOrMethodGen { setInstructionList(il); setConstantPool(cp); - if((access_flags & (Constants.ACC_ABSTRACT | Constants.ACC_NATIVE)) == 0) { - InstructionHandle start = il.getStart(); - InstructionHandle end = il.getEnd(); + boolean abstract_ = isAbstract() || isNative(); + InstructionHandle start = null; + InstructionHandle end = null; + + if(!abstract_) { + start = il.getStart(); + end = il.getEnd(); /* Add local variables, namely the implicit `this' and the arguments */ - if(!isStatic() && (class_name != null)) // Instance method -> `this' is local var 0 + if(!isStatic() && (class_name != null)) { // Instance method -> `this' is local var 0 addLocalVariable("this", new ObjectType(class_name), start, end); + } + } - if(arg_types != null) { - int size = arg_types.length; - for(int i=0; i < size; i++) { - if(Type.VOID == arg_types[i]) - throw new ClassGenException("'void' is an illegal argument type for a method"); -} - - if(arg_names != null) { // Names for variables provided? - if(size != arg_names.length) - throw new ClassGenException("Mismatch in argument array lengths: " + - size + " vs. " + arg_names.length); - } else { // Give them dummy names - arg_names = new String[size]; - - for(int i=0; i < size; i++) - arg_names[i] = "arg" + i; + if(arg_types != null) { + int size = arg_types.length; - setArgumentNames(arg_names); + for(int i=0; i < size; i++) { + if(Type.VOID == arg_types[i]) { + throw new ClassGenException("'void' is an illegal argument type for a method"); } - + } + + if(arg_names != null) { // Names for variables provided? + if(size != arg_names.length) + throw new ClassGenException("Mismatch in argument array lengths: " + + size + " vs. " + arg_names.length); + } else { // Give them dummy names + arg_names = new String[size]; + for(int i=0; i < size; i++) + arg_names[i] = "arg" + i; + + setArgumentNames(arg_names); + } + + if(!abstract_) { + for(int i=0; i < size; i++) { addLocalVariable(arg_names[i], arg_types[i], start, end); + } } } } @@ -217,22 +227,29 @@ public class MethodGen extends FieldGenOrMethodGen { if(a instanceof LineNumberTable) { LineNumber[] ln = ((LineNumberTable)a).getLineNumberTable(); + for(int k=0; k < ln.length; k++) { LineNumber l = ln[k]; addLineNumber(il.findHandle(l.getStartPC()), l.getLineNumber()); } } else if(a instanceof LocalVariableTable) { LocalVariable[] lv = ((LocalVariableTable)a).getLocalVariableTable(); + + removeLocalVariables(); + for(int k=0; k < lv.length; k++) { LocalVariable l = lv[k]; InstructionHandle start = il.findHandle(l.getStartPC()); InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength()); // Repair malformed handles - if(start == null) + if(null == start) { start = il.getStart(); - if(end == null) + } + + if(null == end) { end = il.getEnd(); + } addLocalVariable(l.getName(), Type.getType(l.getSignature()), l.getIndex(), start, end); -- GitLab From 087456a425adcde0f7fada87c57bbdcbfccef8cd Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sun, 8 Dec 2002 16:04:38 +0000 Subject: [PATCH 0153/1313] Various bug fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152843 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/ConstantUtf8.java | 4 ++++ src/java/org/apache/bcel/classfile/Field.java | 8 ++++++++ .../apache/bcel/classfile/LineNumberTable.java | 6 ++++++ src/java/org/apache/bcel/classfile/Method.java | 17 ++++++++++++++++- .../apache/bcel/generic/ConstantPoolGen.java | 10 +++++++--- src/java/org/apache/bcel/generic/LCMP.java | 12 +++++++++++- src/java/org/apache/bcel/generic/LDC_W.java | 1 - src/java/org/apache/bcel/generic/PUTSTATIC.java | 4 ++-- src/java/org/apache/bcel/util/Repository.java | 2 +- 9 files changed, 55 insertions(+), 9 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/java/org/apache/bcel/classfile/ConstantUtf8.java index e5d9e5be..f02c5b9f 100644 --- a/src/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -95,6 +95,10 @@ public final class ConstantUtf8 extends Constant { public ConstantUtf8(String bytes) { super(Constants.CONSTANT_Utf8); + + if(bytes == null) + throw new IllegalArgumentException("bytes must not be null!"); + this.bytes = bytes; } diff --git a/src/java/org/apache/bcel/classfile/Field.java b/src/java/org/apache/bcel/classfile/Field.java index 967aa3d1..d7aa1bc5 100644 --- a/src/java/org/apache/bcel/classfile/Field.java +++ b/src/java/org/apache/bcel/classfile/Field.java @@ -54,6 +54,7 @@ package org.apache.bcel.classfile; * . */ import org.apache.bcel.Constants; +import org.apache.bcel.generic.Type; import java.io.*; /** @@ -154,4 +155,11 @@ public final class Field extends FieldOrMethod { public final Field copy(ConstantPool constant_pool) { return (Field)copy_(constant_pool); } + + /** + * @return type of field + */ + public Type getType() { + return Type.getReturnType(getSignature()); + } } diff --git a/src/java/org/apache/bcel/classfile/LineNumberTable.java b/src/java/org/apache/bcel/classfile/LineNumberTable.java index b0dc6fd3..127c416d 100644 --- a/src/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/java/org/apache/bcel/classfile/LineNumberTable.java @@ -213,6 +213,12 @@ public final class LineNumberTable extends Attribute { } } while(l <= r); + /* It's possible that we did not find any valid entry for the bytecode + * offset we were looking for. + */ + if (min_index < 0) + return -1; + return line_number_table[min_index].getLineNumber(); } diff --git a/src/java/org/apache/bcel/classfile/Method.java b/src/java/org/apache/bcel/classfile/Method.java index a70c34e3..b470d916 100644 --- a/src/java/org/apache/bcel/classfile/Method.java +++ b/src/java/org/apache/bcel/classfile/Method.java @@ -54,6 +54,7 @@ package org.apache.bcel.classfile; * . */ import org.apache.bcel.Constants; +import org.apache.bcel.generic.Type; import java.io.*; /** @@ -86,7 +87,7 @@ public final class Method extends FieldOrMethod { * @throws ClassFormatException */ Method(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatException + throws IOException, ClassFormatException { super(file, constant_pool); } @@ -210,4 +211,18 @@ public final class Method extends FieldOrMethod { public final Method copy(ConstantPool constant_pool) { return (Method)copy_(constant_pool); } + + /** + * @return return type of method + */ + public Type getReturnType() { + return Type.getReturnType(getSignature()); + } + + /** + * @return array of method argument types + */ + public Type[] getArgumentTypes() { + return Type.getArgumentTypes(getSignature()); + } } diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/java/org/apache/bcel/generic/ConstantPoolGen.java index bdf77051..92b846cb 100644 --- a/src/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -323,11 +323,13 @@ public class ConstantPoolGen implements java.io.Serializable { * @return index on success, -1 otherwise */ public int lookupFloat(float n) { + int bits = Float.floatToIntBits(n); + for(int i=1; i < index; i++) { if(constants[i] instanceof ConstantFloat) { ConstantFloat c = (ConstantFloat)constants[i]; - if(c.getBytes() == n) + if(Float.floatToIntBits(c.getBytes()) == bits) return i; } } @@ -438,11 +440,13 @@ public class ConstantPoolGen implements java.io.Serializable { * @return index on success, -1 otherwise */ public int lookupDouble(double n) { + long bits = Double.doubleToLongBits(n); + for(int i=1; i < index; i++) { if(constants[i] instanceof ConstantDouble) { ConstantDouble c = (ConstantDouble)constants[i]; - - if(c.getBytes() == n) + + if(Double.doubleToLongBits(c.getBytes()) == bits) return i; } } diff --git a/src/java/org/apache/bcel/generic/LCMP.java b/src/java/org/apache/bcel/generic/LCMP.java index b5b707bf..2a203eed 100644 --- a/src/java/org/apache/bcel/generic/LCMP.java +++ b/src/java/org/apache/bcel/generic/LCMP.java @@ -62,11 +62,18 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class LCMP extends Instruction { +public class LCMP extends Instruction + implements TypedInstruction, StackProducer, StackConsumer +{ public LCMP() { super(org.apache.bcel.Constants.LCMP, (short)1); } + /** @return Type.LONG + */ + public Type getType(ConstantPoolGen cp) { + return Type.LONG; + } /** * Call corresponding visitor method(s). The order is: @@ -77,6 +84,9 @@ public class LCMP extends Instruction { * @param v Visitor object */ public void accept(Visitor v) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); v.visitLCMP(this); } } diff --git a/src/java/org/apache/bcel/generic/LDC_W.java b/src/java/org/apache/bcel/generic/LDC_W.java index 9b724684..724adbab 100644 --- a/src/java/org/apache/bcel/generic/LDC_W.java +++ b/src/java/org/apache/bcel/generic/LDC_W.java @@ -84,6 +84,5 @@ public class LDC_W extends LDC { setIndex(bytes.readUnsignedShort()); // Override just in case it has been changed opcode = org.apache.bcel.Constants.LDC_W; - length = 3; } } diff --git a/src/java/org/apache/bcel/generic/PUTSTATIC.java b/src/java/org/apache/bcel/generic/PUTSTATIC.java index b3da2ec7..7fa60b20 100644 --- a/src/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/java/org/apache/bcel/generic/PUTSTATIC.java @@ -59,9 +59,9 @@ import org.apache.bcel.ExceptionConstants; /** * PUTSTATIC - Put static field in class - *
      Stack: ..., objectref, value -> ...
      + *
      Stack: ..., value -> ...
      * OR - *
      Stack: ..., objectref, value.word1, value.word2 -> ...
      + *
      Stack: ..., value.word1, value.word2 -> ...
      * * @version $Id$ * @author M. Dahm diff --git a/src/java/org/apache/bcel/util/Repository.java b/src/java/org/apache/bcel/util/Repository.java index 92556fd4..fcbada75 100644 --- a/src/java/org/apache/bcel/util/Repository.java +++ b/src/java/org/apache/bcel/util/Repository.java @@ -59,7 +59,7 @@ import org.apache.bcel.classfile.JavaClass; /** * Abstract definition of a class repository. Instances may be used * to load classes from different sources and may be used in the - * Repository.setRpeository method. + * Repository.setRepository method. * * @see org.apache.bcel.Repository * @version $Id$ -- GitLab From 6923aa13640dc9515140911cd57507eb11878376 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Tue, 28 Jan 2003 18:03:18 +0000 Subject: [PATCH 0154/1313] remind me of another check that I should implement one day ot the other .) PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152844 13f79535-47bb-0310-9956-ffa450edef68 --- TODO.JustIce | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TODO.JustIce b/TODO.JustIce index 86b87c1f..57e0a8f1 100644 --- a/TODO.JustIce +++ b/TODO.JustIce @@ -35,6 +35,8 @@ fields. Also, access modifiers have to be honoured (see above). - It is not verified if classes that propose they would implement an interface _really_ implement all the methods. +- It is not verified that interfaces are actually tagged 'abstract'. + - The InstructionContext.getSuccessors() method may return the same successor more than one time. For performance reasons the ControlFlow- Graph.InstructionContextImpl class should return an array where the -- GitLab From 81332c4186c3e779daa75a5820956df1284654c1 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Wed, 12 Feb 2003 10:15:29 +0000 Subject: [PATCH 0155/1313] Comment git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152845 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/structurals/InstConstraintVisitor.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 01bfeabb..8c47b6aa 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -2541,6 +2541,9 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc else{ constraintViolated(o, "The stack top type '"+value+"' is not of a reference type as expected."); } + // TODO: This can possibly only be checked using Staerk-et-al's "set-of-object types", not + // using "wider cast object types" created during verification. + // Comment it out if you encounter problems. See also the analogon at visitPUTFIELD. if (!(rvalue.isAssignmentCompatibleWith(shouldbe))){ constraintViolated(o, "The stack top type '"+value+"' is not assignment compatible with '"+shouldbe+"'."); } -- GitLab From b5d3486c1c701fcc5fb90c659f583c1a3c1230d0 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Thu, 13 Feb 2003 11:18:23 +0000 Subject: [PATCH 0156/1313] Make apidocs compliant with standard doclet 1.4.0 PR: Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152846 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/ConstantValue.java | 2 +- src/java/org/apache/bcel/generic/MethodGen.java | 2 +- src/java/org/apache/bcel/util/ClassSet.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/ConstantValue.java b/src/java/org/apache/bcel/classfile/ConstantValue.java index b46dc0dc..061e9727 100644 --- a/src/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/java/org/apache/bcel/classfile/ConstantValue.java @@ -120,7 +120,7 @@ public final class ConstantValue extends Attribute { * Dump constant value attribute to file stream on binary format. * * @param file Output file stream - * @throw IOException + * @throws IOException */ public final void dump(DataOutputStream file) throws IOException { diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index df248a1b..435d592b 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -70,6 +70,7 @@ import java.util.*; * * @version $Id$ * @author M. Dahm + * @author Patrick C. Beard [setMaxStack()] * @see InstructionList * @see Method */ @@ -747,7 +748,6 @@ public class MethodGen extends FieldGenOrMethodGen { /** * Computes max. stack size by performing control flow analysis. - * @author Patrick C. Beard */ public void setMaxStack() { if(il != null) diff --git a/src/java/org/apache/bcel/util/ClassSet.java b/src/java/org/apache/bcel/util/ClassSet.java index fd740439..c1cabdd6 100644 --- a/src/java/org/apache/bcel/util/ClassSet.java +++ b/src/java/org/apache/bcel/util/ClassSet.java @@ -64,7 +64,7 @@ import org.apache.bcel.classfile.JavaClass; * * @version $Id$ * @author M. Dahm - * @see Stack + * @see ClassStack */ public class ClassSet implements java.io.Serializable { private HashMap _map = new HashMap(); -- GitLab From de225705373b5f92d72ec6999c2fe408c510a100 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 14 Mar 2003 10:37:16 +0000 Subject: [PATCH 0157/1313] update git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152847 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/contributors.xml | 2 +- xdocs/navigation.xml | 5 +++++ xdocs/projects.xml | 5 ++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/xdocs/contributors.xml b/xdocs/contributors.xml index 1d650e4f..f3f66d3c 100644 --- a/xdocs/contributors.xml +++ b/xdocs/contributors.xml @@ -15,7 +15,7 @@ - + diff --git a/xdocs/navigation.xml b/xdocs/navigation.xml index 25d809f3..54c327c0 100644 --- a/xdocs/navigation.xml +++ b/xdocs/navigation.xml @@ -14,6 +14,11 @@ + + + + + diff --git a/xdocs/projects.xml b/xdocs/projects.xml index a2d7aa06..183b1935 100644 --- a/xdocs/projects.xml +++ b/xdocs/projects.xml @@ -13,11 +13,14 @@
      • - Apache's XalanXSLT Compiler + Apache's Xalan XSLT Compiler
      • ObjectScript
      • +
      • + JBoss +
      • Java Development Environment for Emacs
      • -- GitLab From 27dbdf1c084ffd68e5d8822ec01d97aaed6c6698 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 28 Mar 2003 14:55:42 +0000 Subject: [PATCH 0158/1313] 5.1 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152848 13f79535-47bb-0310-9956-ffa450edef68 --- default.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/default.properties b/default.properties index fdb7193e..d02335fe 100644 --- a/default.properties +++ b/default.properties @@ -7,7 +7,7 @@ # ------------------------------------------------------------------- project = bcel -version = 5.1-dev +version = 5.1 final.name = ${project}-${version} jakarta.site2 = ../jakarta-site2 docs.src = ./xdocs -- GitLab From 72f26e224cf5d5967b60040adc6ca0dad87d9039 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 28 Mar 2003 15:33:43 +0000 Subject: [PATCH 0159/1313] 5.1 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152849 13f79535-47bb-0310-9956-ffa450edef68 --- project.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.xml b/project.xml index c0e26de0..a84ba5fd 100644 --- a/project.xml +++ b/project.xml @@ -4,7 +4,7 @@ 3 jakarta-bcel bcel - 5.1-dev + 5.1 Apache Software Foundation http://www.apache.org -- GitLab From 59375ade39a55997dde03c4552b4a42c9ae54f50 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 25 Apr 2003 07:27:04 +0000 Subject: [PATCH 0160/1313] email update git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152850 13f79535-47bb-0310-9956-ffa450edef68 --- project.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project.xml b/project.xml index a84ba5fd..756c1055 100644 --- a/project.xml +++ b/project.xml @@ -50,8 +50,8 @@ Markus Dahm mdahm - m.dahm@4flow.de - 4Flow + markus.dahm@gmx.de + it-frameworksolutions -- GitLab From a7d1141f2b7688bb0ae690d74dd24efea60bae7a Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 25 Apr 2003 08:25:37 +0000 Subject: [PATCH 0161/1313] updates git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152851 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 5 +++-- project.xml | 2 +- xdocs/index.xml | 17 ++++++++--------- xdocs/navigation.xml | 8 ++------ xdocs/news.xml | 10 +++++++++- xdocs/projects.xml | 2 +- 6 files changed, 24 insertions(+), 20 deletions(-) diff --git a/build.xml b/build.xml index f5f6e98d..b9021e50 100644 --- a/build.xml +++ b/build.xml @@ -249,8 +249,9 @@ Available targets: - - + + + diff --git a/project.xml b/project.xml index 756c1055..8f02c4db 100644 --- a/project.xml +++ b/project.xml @@ -50,7 +50,7 @@ Markus Dahm mdahm - markus.dahm@gmx.de + m.dahm@gmx.de it-frameworksolutions diff --git a/xdocs/index.xml b/xdocs/index.xml index 59eb48c7..7aac68cf 100644 --- a/xdocs/index.xml +++ b/xdocs/index.xml @@ -11,11 +11,12 @@

        - The Byte Code Engineering Library (formerly known as JavaClass) is intended - to give users a convenient possibility to analyze, create, and manipulate - (binary) Java class files (those ending with .class). Classes are represented - by objects which contain all the symbolic information of the given class: - methods, fields and byte code instructions, in particular. + The Byte Code Engineering Library is intended to give users a + convenient possibility to analyze, create, and manipulate (binary) + Java class files (those ending with .class). Classes are + represented by objects which contain all the symbolic information + of the given class: methods, fields and byte code instructions, in + particular.

        @@ -29,10 +30,8 @@

        BCEL is already being used successfully in several projects such - as compilers, optimizers, obsfuscators and analysis tools, the - most popular probably being the Xalan XSLT processor at - Apache. + as compilers, optimizers, obsfuscators, code generators + and analysis tools.

        diff --git a/xdocs/navigation.xml b/xdocs/navigation.xml index 54c327c0..7d89e624 100644 --- a/xdocs/navigation.xml +++ b/xdocs/navigation.xml @@ -6,7 +6,8 @@ - + + @@ -14,11 +15,6 @@ - - - - - diff --git a/xdocs/news.xml b/xdocs/news.xml index 3ccf0ae3..2c0421e4 100644 --- a/xdocs/news.xml +++ b/xdocs/news.xml @@ -8,7 +8,7 @@ -
        +

        27 October 2001 - BCEL moves to Jakarta!

        @@ -18,6 +18,14 @@ for donating the code to the Jakarta Project.

        +

        25 April 2003 - BCEL 5.1 released!

        + +

        + The Byte Code Engineering Library version 5.1 has been released + after a long period of testing. It mainly contains bug fixes + and introduces the possibility to use custom repositories. +

        +
        diff --git a/xdocs/projects.xml b/xdocs/projects.xml index 183b1935..0029214a 100644 --- a/xdocs/projects.xml +++ b/xdocs/projects.xml @@ -13,7 +13,7 @@
        • - Apache's Xalan XSLT Compiler + Xalan XSLT Compiler
        • ObjectScript -- GitLab From ec8fe821fc3b8609c16dece4fb29933b85c838ca Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 8 May 2003 10:17:24 +0000 Subject: [PATCH 0162/1313] translation git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152852 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/navigation.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xdocs/navigation.xml b/xdocs/navigation.xml index 7d89e624..bdd4ec0f 100644 --- a/xdocs/navigation.xml +++ b/xdocs/navigation.xml @@ -7,17 +7,19 @@ - + + + -- GitLab From 85f2595a2a936fd020cac98093cdc307a1145111 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 23 May 2003 07:50:52 +0000 Subject: [PATCH 0163/1313] Added BCELComparator equals() and hascode() may be paramerized by a strategy object By default names and signatures have to be equal git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152853 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Constant.java | 56 +- src/java/org/apache/bcel/classfile/Field.java | 98 ++- .../org/apache/bcel/classfile/JavaClass.java | 570 +++++++++++------- .../org/apache/bcel/classfile/Method.java | 130 +++- .../org/apache/bcel/util/BCELComparator.java | 27 + 5 files changed, 591 insertions(+), 290 deletions(-) create mode 100644 src/java/org/apache/bcel/util/BCELComparator.java diff --git a/src/java/org/apache/bcel/classfile/Constant.java b/src/java/org/apache/bcel/classfile/Constant.java index 2a014a7c..3a395ab7 100644 --- a/src/java/org/apache/bcel/classfile/Constant.java +++ b/src/java/org/apache/bcel/classfile/Constant.java @@ -55,6 +55,8 @@ package org.apache.bcel.classfile; */ import org.apache.bcel.Constants; +import org.apache.bcel.util.BCELComparator; + import java.io.*; /** @@ -63,9 +65,23 @@ import java.io.*; * the JVM specification. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class Constant implements Cloneable, Node, Serializable { + private static BCELComparator _cmp = new BCELComparator() { + public boolean equals(Object o1, Object o2) { + Constant THIS = (Constant)o1; + Constant THAT = (Constant)o2; + + return THIS.toString().equals(THAT.toString()); + } + + public int hashCode(Object o) { + Constant THIS = (Constant)o; + return THIS.toString().hashCode(); + } + }; + /* In fact this tag is redundant since we can distinguish different * `Constant' objects by their type, i.e., via `instanceof'. In some * places we will use the tag for switch()es anyway. @@ -144,5 +160,41 @@ public abstract class Constant implements Cloneable, Node, Serializable { default: throw new ClassFormatException("Invalid byte tag in constant pool: " + b); } - } + } + + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; + } + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator(BCELComparator comparator) { + _cmp = comparator; + } + + /** + * Return value as defined by given BCELComparator strategy. + * By default two Constant objects are said to be equal when + * the result of toString() is equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + return _cmp.equals(this, obj); + } + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the result of toString(). + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); + } } diff --git a/src/java/org/apache/bcel/classfile/Field.java b/src/java/org/apache/bcel/classfile/Field.java index d7aa1bc5..7f038e90 100644 --- a/src/java/org/apache/bcel/classfile/Field.java +++ b/src/java/org/apache/bcel/classfile/Field.java @@ -53,8 +53,10 @@ package org.apache.bcel.classfile; * information on the Apache Software Foundation, please see * . */ -import org.apache.bcel.Constants; +import org.apache.bcel.Constants; import org.apache.bcel.generic.Type; +import org.apache.bcel.util.BCELComparator; + import java.io.*; /** @@ -62,13 +64,28 @@ import java.io.*; * for a variable in the class. See JVM specification for details. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class Field extends FieldOrMethod { + private static BCELComparator _cmp = new BCELComparator() { + public boolean equals(Object o1, Object o2) { + Field THIS = (Field)o1; + Field THAT = (Field)o2; + + return THIS.getName().equals(THAT.getName()) + && THIS.getSignature().equals(THAT.getSignature()); + } + + public int hashCode(Object o) { + Field THIS = (Field)o; + return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + } + }; + /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ public Field(Field c) { super(c); } @@ -78,8 +95,7 @@ public final class Field extends FieldOrMethod { * @param file Input stream */ Field(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatException - { + throws IOException, ClassFormatException { super(file, constant_pool); } @@ -90,9 +106,12 @@ public final class Field extends FieldOrMethod { * @param attributes Collection of attributes * @param constant_pool Array of constants */ - public Field(int access_flags, int name_index, int signature_index, - Attribute[] attributes, ConstantPool constant_pool) - { + public Field( + int access_flags, + int name_index, + int signature_index, + Attribute[] attributes, + ConstantPool constant_pool) { super(access_flags, name_index, signature_index, attributes, constant_pool); } @@ -111,9 +130,9 @@ public final class Field extends FieldOrMethod { * @return constant value associated with this field (may be null) */ public final ConstantValue getConstantValue() { - for(int i=0; i < attributes_count; i++) - if(attributes[i].getTag() == Constants.ATTR_CONSTANT_VALUE) - return (ConstantValue)attributes[i]; + for (int i = 0; i < attributes_count; i++) + if (attributes[i].getTag() == Constants.ATTR_CONSTANT_VALUE) + return (ConstantValue)attributes[i]; return null; } @@ -128,22 +147,22 @@ public final class Field extends FieldOrMethod { String name, signature, access; // Short cuts to constant pool // Get names from constant pool - access = Utility.accessToString(access_flags); - access = access.equals("")? "" : (access + " "); + access = Utility.accessToString(access_flags); + access = access.equals("") ? "" : (access + " "); signature = Utility.signatureToString(getSignature()); - name = getName(); + name = getName(); - StringBuffer buf = new StringBuffer(access + signature + " " + name); - ConstantValue cv = getConstantValue(); + StringBuffer buf = new StringBuffer(access + signature + " " + name); + ConstantValue cv = getConstantValue(); - if(cv != null) + if (cv != null) buf.append(" = " + cv); - for(int i=0; i < attributes_count; i++) { + for (int i = 0; i < attributes_count; i++) { Attribute a = attributes[i]; - if(!(a instanceof ConstantValue)) - buf.append(" [" + a.toString() + "]"); + if (!(a instanceof ConstantValue)) + buf.append(" [" + a.toString() + "]"); } return buf.toString(); @@ -162,4 +181,39 @@ public final class Field extends FieldOrMethod { public Type getType() { return Type.getReturnType(getSignature()); } + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; + } + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator(BCELComparator comparator) { + _cmp = comparator; + } + + /** + * Return value as defined by given BCELComparator strategy. + * By default two Field objects are said to be equal when + * their names and signatures are equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + return _cmp.equals(this, obj); + } + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the field's name XOR signature. + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); + } } diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 8f931fa6..4aa481f9 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -54,59 +54,72 @@ package org.apache.bcel.classfile; * . */ -import org.apache.bcel.Constants; -import org.apache.bcel.util.SyntheticRepository; -import org.apache.bcel.util.ClassVector; -import org.apache.bcel.util.ClassQueue; -import org.apache.bcel.generic.Type; +import org.apache.bcel.Constants; +import org.apache.bcel.util.BCELComparator; +import org.apache.bcel.util.SyntheticRepository; +import org.apache.bcel.util.ClassVector; +import org.apache.bcel.util.ClassQueue; +import org.apache.bcel.generic.Type; -import java.io.*; -import java.util.StringTokenizer; +import java.io.*; +import java.util.StringTokenizer; /** * Represents a Java class, i.e., the data structures, constant pool, * fields, methods and commands contained in a Java .class file. - * See JVM - * specification for details. - + * See JVM specification for details. * The intent of this class is to represent a parsed or otherwise existing * class file. Those interested in programatically generating classes * should see the ClassGen class. * @version $Id$ * @see org.apache.bcel.generic.ClassGen - * @author M. Dahm + * @author M. Dahm */ public class JavaClass extends AccessFlags implements Cloneable, Node { - private String file_name; - private String package_name; - private String source_file_name = ""; - private int class_name_index; - private int superclass_name_index; - private String class_name; - private String superclass_name; - private int major, minor; // Compiler version + private String file_name; + private String package_name; + private String source_file_name = ""; + private int class_name_index; + private int superclass_name_index; + private String class_name; + private String superclass_name; + private int major, minor; // Compiler version private ConstantPool constant_pool; // Constant pool - private int[] interfaces; // implemented interfaces - private String[] interface_names; - private Field[] fields; // Fields, i.e., variables of class - private Method[] methods; // methods defined in the class - private Attribute[] attributes; // attributes defined in the class - private byte source = HEAP; // Generated in memory + private int[] interfaces; // implemented interfaces + private String[] interface_names; + private Field[] fields; // Fields, i.e., variables of class + private Method[] methods; // methods defined in the class + private Attribute[] attributes; // attributes defined in the class + private byte source = HEAP; // Generated in memory public static final byte HEAP = 1; public static final byte FILE = 2; - public static final byte ZIP = 3; + public static final byte ZIP = 3; static boolean debug = false; // Debugging on/off - static char sep = '/'; // directory separator + static char sep = '/'; // directory separator + + private static BCELComparator _cmp = new BCELComparator() { + public boolean equals(Object o1, Object o2) { + JavaClass THIS = (JavaClass)o1; + JavaClass THAT = (JavaClass)o2; + + return THIS.getClassName().equals(THAT.getClassName()); + } + + public int hashCode(Object o) { + JavaClass THIS = (JavaClass)o; + return THIS.getClassName().hashCode(); + } + }; /** * In cases where we go ahead and create something, * use the default SyntheticRepository, because we * don't know any better. */ - private transient org.apache.bcel.util.Repository repository = + private transient org.apache.bcel.util.Repository repository = SyntheticRepository.getInstance(); /** @@ -127,46 +140,46 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { * @param attributes Class attributes * @param source Read from file or generated in memory? */ - public JavaClass(int class_name_index, - int superclass_name_index, - String file_name, - int major, - int minor, - int access_flags, - ConstantPool constant_pool, - int[] interfaces, - Field[] fields, - Method[] methods, - Attribute[] attributes, - byte source) - { - if(interfaces == null) // Allowed for backward compatibility + public JavaClass( + int class_name_index, + int superclass_name_index, + String file_name, + int major, + int minor, + int access_flags, + ConstantPool constant_pool, + int[] interfaces, + Field[] fields, + Method[] methods, + Attribute[] attributes, + byte source) { + if (interfaces == null) // Allowed for backward compatibility interfaces = new int[0]; - if(attributes == null) + if (attributes == null) this.attributes = new Attribute[0]; - if(fields == null) + if (fields == null) fields = new Field[0]; - if(methods == null) + if (methods == null) methods = new Method[0]; - this.class_name_index = class_name_index; + this.class_name_index = class_name_index; this.superclass_name_index = superclass_name_index; - this.file_name = file_name; - this.major = major; - this.minor = minor; - this.access_flags = access_flags; - this.constant_pool = constant_pool; - this.interfaces = interfaces; - this.fields = fields; - this.methods = methods; - this.attributes = attributes; - this.source = source; + this.file_name = file_name; + this.major = major; + this.minor = minor; + this.access_flags = access_flags; + this.constant_pool = constant_pool; + this.interfaces = interfaces; + this.fields = fields; + this.methods = methods; + this.attributes = attributes; + this.source = source; // Get source file name if available - for(int i=0; i < attributes.length; i++) { - if(attributes[i] instanceof SourceFile) { - source_file_name = ((SourceFile)attributes[i]).getSourceFileName(); - break; + for (int i = 0; i < attributes.length; i++) { + if (attributes[i] instanceof SourceFile) { + source_file_name = ((SourceFile)attributes[i]).getSourceFileName(); + break; } } @@ -174,27 +187,34 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { * `ConstantClass' but we check that anyway via the * `ConstPool.getConstant' method. */ - class_name = constant_pool.getConstantString(class_name_index, - Constants.CONSTANT_Class); + class_name = + constant_pool.getConstantString( + class_name_index, + Constants.CONSTANT_Class); class_name = Utility.compactClassName(class_name, false); int index = class_name.lastIndexOf('.'); - if(index < 0) + if (index < 0) package_name = ""; else package_name = class_name.substring(0, index); - if(superclass_name_index > 0) { // May be zero -> class is java.lang.Object - superclass_name = constant_pool.getConstantString(superclass_name_index, - Constants.CONSTANT_Class); + if (superclass_name_index > 0) { + // May be zero -> class is java.lang.Object + superclass_name = + constant_pool.getConstantString( + superclass_name_index, + Constants.CONSTANT_Class); superclass_name = Utility.compactClassName(superclass_name, false); - } - else - superclass_name = "java.lang.Object"; + } else + superclass_name = "java.lang.Object"; interface_names = new String[interfaces.length]; - for(int i=0; i < interfaces.length; i++) { - String str = constant_pool.getConstantString(interfaces[i], Constants.CONSTANT_Class); + for (int i = 0; i < interfaces.length; i++) { + String str = + constant_pool.getConstantString( + interfaces[i], + Constants.CONSTANT_Class); interface_names[i] = Utility.compactClassName(str, false); } } @@ -214,22 +234,33 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { * @param methods Class methods * @param attributes Class attributes */ - public JavaClass(int class_name_index, - int superclass_name_index, - String file_name, - int major, - int minor, - int access_flags, - ConstantPool constant_pool, - int[] interfaces, - Field[] fields, - Method[] methods, - Attribute[] attributes) { - this(class_name_index, superclass_name_index, file_name, major, minor, access_flags, - constant_pool, interfaces, fields, methods, attributes, HEAP); + public JavaClass( + int class_name_index, + int superclass_name_index, + String file_name, + int major, + int minor, + int access_flags, + ConstantPool constant_pool, + int[] interfaces, + Field[] fields, + Method[] methods, + Attribute[] attributes) { + this( + class_name_index, + superclass_name_index, + file_name, + major, + minor, + access_flags, + constant_pool, + interfaces, + fields, + methods, + attributes, + HEAP); } - /** * Called by objects that are traversing the nodes of the tree implicitely * defined by the contents of a Java class. I.e., the hierarchy of methods, @@ -244,7 +275,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { /* Print debug information depending on `JavaClass.debug' */ static final void Debug(String str) { - if(debug) + if (debug) System.out.println(str); } @@ -254,15 +285,14 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { * @param file Output file * @throws IOException */ - public void dump(File file) throws IOException - { + public void dump(File file) throws IOException { String parent = file.getParent(); - if(parent != null) { + if (parent != null) { File dir = new File(parent); - - if(dir != null) - dir.mkdirs(); + + if (dir != null) + dir.mkdirs(); } dump(new DataOutputStream(new FileOutputStream(file))); @@ -274,8 +304,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { * @param file_name Output file name * @exception IOException */ - public void dump(String file_name) throws IOException - { + public void dump(String file_name) throws IOException { dump(new File(file_name)); } @@ -283,15 +312,19 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { * @return class in binary format */ public byte[] getBytes() { - ByteArrayOutputStream s = new ByteArrayOutputStream(); - DataOutputStream ds = new DataOutputStream(s); + ByteArrayOutputStream s = new ByteArrayOutputStream(); + DataOutputStream ds = new DataOutputStream(s); try { dump(ds); - } catch(IOException e) { + } catch (IOException e) { e.printStackTrace(); } finally { - try { ds.close(); } catch(IOException e2) { e2.printStackTrace(); } + try { + ds.close(); + } catch (IOException e2) { + e2.printStackTrace(); + } } return s.toByteArray(); @@ -313,36 +346,34 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { * @param file Output stream * @exception IOException */ - public void dump(DataOutputStream file) throws IOException - { + public void dump(DataOutputStream file) throws IOException { file.writeInt(0xcafebabe); file.writeShort(minor); file.writeShort(major); constant_pool.dump(file); - + file.writeShort(access_flags); file.writeShort(class_name_index); file.writeShort(superclass_name_index); file.writeShort(interfaces.length); - for(int i=0; i < interfaces.length; i++) + for (int i = 0; i < interfaces.length; i++) file.writeShort(interfaces[i]); file.writeShort(fields.length); - for(int i=0; i < fields.length; i++) + for (int i = 0; i < fields.length; i++) fields[i].dump(file); file.writeShort(methods.length); - for(int i=0; i < methods.length; i++) + for (int i = 0; i < methods.length; i++) methods[i].dump(file); - if(attributes != null) { + if (attributes != null) { file.writeShort(attributes.length); - for(int i=0; i < attributes.length; i++) - attributes[i].dump(file); - } - else + for (int i = 0; i < attributes.length; i++) + attributes[i].dump(file); + } else file.writeShort(0); file.close(); @@ -351,72 +382,94 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { /** * @return Attributes of the class. */ - public Attribute[] getAttributes() { return attributes; } + public Attribute[] getAttributes() { + return attributes; + } /** * @return Class name. */ - public String getClassName() { return class_name; } + public String getClassName() { + return class_name; + } /** * @return Package name. */ - public String getPackageName() { return package_name; } + public String getPackageName() { + return package_name; + } /** * @return Class name index. */ - public int getClassNameIndex() { return class_name_index; } + public int getClassNameIndex() { + return class_name_index; + } /** * @return Constant pool. */ - public ConstantPool getConstantPool() { return constant_pool; } + public ConstantPool getConstantPool() { + return constant_pool; + } /** * @return Fields, i.e., variables of the class. Like the JVM spec * mandates for the classfile format, these fields are those specific to * this class, and not those of the superclass or superinterfaces. */ - public Field[] getFields() { return fields; } + public Field[] getFields() { + return fields; + } /** * @return File name of class, aka SourceFile attribute value */ - public String getFileName() { return file_name; } + public String getFileName() { + return file_name; + } /** * @return Names of implemented interfaces. */ - public String[] getInterfaceNames() { return interface_names; } + public String[] getInterfaceNames() { + return interface_names; + } /** * @return Indices in constant pool of implemented interfaces. */ - public int[] getInterfaceIndices() { return interfaces; } + public int[] getInterfaceIndices() { + return interfaces; + } /** * @return Major number of class file version. */ - public int getMajor() { return major; } + public int getMajor() { + return major; + } /** * @return Methods of the class. */ - public Method[] getMethods() { return methods; } + public Method[] getMethods() { + return methods; + } /** * @return A org.apache.bcel.classfile.Method corresponding to * java.lang.reflect.Method if any */ public Method getMethod(java.lang.reflect.Method m) { - for(int i = 0; i < methods.length; i++) { + for (int i = 0; i < methods.length; i++) { Method method = methods[i]; - if(m.getName().equals(method.getName()) && - (m.getModifiers() == method.getModifiers()) && - Type.getSignature(m).equals(method.getSignature())) { - return method; + if (m.getName().equals(method.getName()) + && (m.getModifiers() == method.getModifiers()) + && Type.getSignature(m).equals(method.getSignature())) { + return method; } } @@ -426,37 +479,46 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { /** * @return Minor number of class file version. */ - public int getMinor() { return minor; } + public int getMinor() { + return minor; + } /** * @return sbsolute path to file where this class was read from */ - public String getSourceFileName() { return source_file_name; } + public String getSourceFileName() { + return source_file_name; + } /** * @return Superclass name. */ - public String getSuperclassName() { return superclass_name; } + public String getSuperclassName() { + return superclass_name; + } /** * @return Class name index. */ - public int getSuperclassNameIndex() { return superclass_name_index; } + public int getSuperclassNameIndex() { + return superclass_name_index; + } static { // Debugging ... on/off String debug = System.getProperty("JavaClass.debug"); - if(debug != null) + if (debug != null) JavaClass.debug = new Boolean(debug).booleanValue(); // Get path separator either / or \ usually String sep = System.getProperty("file.separator"); - if(sep != null) + if (sep != null) try { - JavaClass.sep = sep.charAt(0); - } catch(StringIndexOutOfBoundsException e) {} // Never reached + JavaClass.sep = sep.charAt(0); + } catch (StringIndexOutOfBoundsException e) { + } // Never reached } /** @@ -464,121 +526,124 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { */ public void setAttributes(Attribute[] attributes) { this.attributes = attributes; - } + } /** * @param class_name . */ public void setClassName(String class_name) { this.class_name = class_name; - } + } /** * @param class_name_index . */ public void setClassNameIndex(int class_name_index) { this.class_name_index = class_name_index; - } + } /** * @param constant_pool . */ public void setConstantPool(ConstantPool constant_pool) { this.constant_pool = constant_pool; - } + } /** * @param fields . */ public void setFields(Field[] fields) { this.fields = fields; - } + } /** * Set File name of class, aka SourceFile attribute value */ public void setFileName(String file_name) { this.file_name = file_name; - } + } /** * @param interface_names . */ public void setInterfaceNames(String[] interface_names) { this.interface_names = interface_names; - } + } /** * @param interfaces . */ public void setInterfaces(int[] interfaces) { this.interfaces = interfaces; - } + } /** * @param major . */ public void setMajor(int major) { this.major = major; - } + } /** * @param methods . */ public void setMethods(Method[] methods) { this.methods = methods; - } + } /** * @param minor . */ public void setMinor(int minor) { this.minor = minor; - } + } /** * Set absolute path to file this class was read from. */ public void setSourceFileName(String source_file_name) { this.source_file_name = source_file_name; - } + } /** * @param superclass_name . */ public void setSuperclassName(String superclass_name) { this.superclass_name = superclass_name; - } + } /** * @param superclass_name_index . */ public void setSuperclassNameIndex(int superclass_name_index) { this.superclass_name_index = superclass_name_index; - } + } /** * @return String representing class contents. */ public String toString() { String access = Utility.accessToString(access_flags, true); - access = access.equals("")? "" : (access + " "); - - StringBuffer buf = new StringBuffer(access + - Utility.classOrInterface(access_flags) + - " " + - class_name + " extends " + - Utility.compactClassName(superclass_name, - false) + '\n'); + access = access.equals("") ? "" : (access + " "); + + StringBuffer buf = + new StringBuffer( + access + + Utility.classOrInterface(access_flags) + + " " + + class_name + + " extends " + + Utility.compactClassName(superclass_name, false) + + '\n'); int size = interfaces.length; - if(size > 0) { + if (size > 0) { buf.append("implements\t\t"); - for(int i=0; i < size; i++) { - buf.append(interface_names[i]); - if(i < size - 1) - buf.append(", "); + for (int i = 0; i < size; i++) { + buf.append(interface_names[i]); + if (i < size - 1) + buf.append(", "); } buf.append('\n'); @@ -591,32 +656,32 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { buf.append("constant pool\t\t" + constant_pool.getLength() + " entries\n"); buf.append("ACC_SUPER flag\t\t" + isSuper() + "\n"); - if(attributes.length > 0) { + if (attributes.length > 0) { buf.append("\nAttribute(s):\n"); - for(int i=0; i < attributes.length; i++) - buf.append(indent(attributes[i])); + for (int i = 0; i < attributes.length; i++) + buf.append(indent(attributes[i])); } - if(fields.length > 0) { + if (fields.length > 0) { buf.append("\n" + fields.length + " fields:\n"); - for(int i=0; i < fields.length; i++) - buf.append("\t" + fields[i] + '\n'); + for (int i = 0; i < fields.length; i++) + buf.append("\t" + fields[i] + '\n'); } - if(methods.length > 0) { + if (methods.length > 0) { buf.append("\n" + methods.length + " methods:\n"); - for(int i=0; i < methods.length; i++) - buf.append("\t" + methods[i] + '\n'); + for (int i = 0; i < methods.length; i++) + buf.append("\t" + methods[i] + '\n'); } return buf.toString(); - } + } private static final String indent(Object obj) { StringTokenizer tok = new StringTokenizer(obj.toString(), "\n"); StringBuffer buf = new StringBuffer(); - while(tok.hasMoreTokens()) + while (tok.hasMoreTokens()) buf.append("\t" + tok.nextToken() + "\n"); return buf.toString(); @@ -630,22 +695,23 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { try { c = (JavaClass)clone(); - } catch(CloneNotSupportedException e) {} + } catch (CloneNotSupportedException e) { + } - c.constant_pool = constant_pool.copy(); - c.interfaces = (int[])interfaces.clone(); + c.constant_pool = constant_pool.copy(); + c.interfaces = (int[])interfaces.clone(); c.interface_names = (String[])interface_names.clone(); c.fields = new Field[fields.length]; - for(int i=0; i < fields.length; i++) + for (int i = 0; i < fields.length; i++) c.fields[i] = fields[i].copy(c.constant_pool); c.methods = new Method[methods.length]; - for(int i=0; i < methods.length; i++) + for (int i = 0; i < methods.length; i++) c.methods[i] = methods[i].copy(c.constant_pool); c.attributes = new Attribute[attributes.length]; - for(int i=0; i < attributes.length; i++) + for (int i = 0; i < attributes.length; i++) c.attributes[i] = attributes[i].copy(c.constant_pool); return c; @@ -685,21 +751,25 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { /** Equivalent to runtime "instanceof" operator. * - * @return true if this JavaClass is derived from teh super class + * @return true if this JavaClass is derived from the super class + * @throws ClassNotFoundException if superclasses or superinterfaces + * of this object can't be found */ - public final boolean instanceOf(JavaClass super_class) { - if(this.equals(super_class)) + public final boolean instanceOf(JavaClass super_class) + throws ClassNotFoundException { + + if (this.equals(super_class)) return true; JavaClass[] super_classes = getSuperClasses(); - for(int i=0; i < super_classes.length; i++) { - if(super_classes[i].equals(super_class)) { - return true; + for (int i = 0; i < super_classes.length; i++) { + if (super_classes[i].equals(super_class)) { + return true; } } - if(super_class.isInterface()) { + if (super_class.isInterface()) { return implementationOf(super_class); } @@ -707,22 +777,27 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { } /** - * @return true, if clazz is an implementation of interface inter + * @return true, if this class is an implementation of interface inter + * @throws ClassNotFoundException if superclasses or superinterfaces + * of this class can't be found */ - public boolean implementationOf(JavaClass inter) { - if(!inter.isInterface()) { - throw new IllegalArgumentException(inter.getClassName() + " is no interface"); + public boolean implementationOf(JavaClass inter) + throws ClassNotFoundException { + + if (!inter.isInterface()) { + throw new IllegalArgumentException( + inter.getClassName() + " is no interface"); } - if(this.equals(inter)) { + if (this.equals(inter)) { return true; } JavaClass[] super_interfaces = getAllInterfaces(); - for(int i=0; i < super_interfaces.length; i++) { - if(super_interfaces[i].equals(inter)) { - return true; + for (int i = 0; i < super_interfaces.length; i++) { + if (super_interfaces[i].equals(inter)) { + return true; } } @@ -732,31 +807,28 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { /** * @return the superclass for this JavaClass object, or null if this * is java.lang.Object + * @throws ClassNotFoundException if the superclass can't be found */ - public JavaClass getSuperClass() { - if("java.lang.Object".equals(getClassName())) { + public JavaClass getSuperClass() throws ClassNotFoundException { + if ("java.lang.Object".equals(getClassName())) { return null; } - try { - return repository.loadClass(getSuperclassName()); - } catch(ClassNotFoundException e) { - System.err.println(e); - return null; - } + return repository.loadClass(getSuperclassName()); } /** * @return list of super classes of this class in ascending order, i.e., * java.lang.Object is always the last element + * @throws ClassNotFoundException if any of the superclasses can't be found */ - public JavaClass[] getSuperClasses() { - JavaClass clazz = this; - ClassVector vec = new ClassVector(); + public JavaClass[] getSuperClasses() throws ClassNotFoundException { + JavaClass clazz = this; + ClassVector vec = new ClassVector(); - for(clazz = clazz.getSuperClass(); clazz != null; - clazz = clazz.getSuperClass()) - { + for (clazz = clazz.getSuperClass(); + clazz != null; + clazz = clazz.getSuperClass()) { vec.addElement(clazz); } @@ -766,17 +838,12 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { /** * Get interfaces directly implemented by this JavaClass. */ - public JavaClass[] getInterfaces() { - String[] interfaces = getInterfaceNames(); - JavaClass[] classes = new JavaClass[interfaces.length]; + public JavaClass[] getInterfaces() throws ClassNotFoundException { + String[] interfaces = getInterfaceNames(); + JavaClass[] classes = new JavaClass[interfaces.length]; - try { - for(int i = 0; i < interfaces.length; i++) { - classes[i] = repository.loadClass(interfaces[i]); - } - } catch(ClassNotFoundException e) { - System.err.println(e); - return null; + for (int i = 0; i < interfaces.length; i++) { + classes[i] = repository.loadClass(interfaces[i]); } return classes; @@ -785,31 +852,66 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { /** * Get all interfaces implemented by this JavaClass (transitively). */ - public JavaClass[] getAllInterfaces() { - ClassQueue queue = new ClassQueue(); - ClassVector vec = new ClassVector(); - + public JavaClass[] getAllInterfaces() throws ClassNotFoundException { + ClassQueue queue = new ClassQueue(); + ClassVector vec = new ClassVector(); + queue.enqueue(this); - - while(!queue.empty()) { + + while (!queue.empty()) { JavaClass clazz = queue.dequeue(); - - JavaClass souper = clazz.getSuperClass(); + + JavaClass souper = clazz.getSuperClass(); JavaClass[] interfaces = clazz.getInterfaces(); - - if(clazz.isInterface()) { - vec.addElement(clazz); + + if (clazz.isInterface()) { + vec.addElement(clazz); } else { - if(souper != null) { - queue.enqueue(souper); - } + if (souper != null) { + queue.enqueue(souper); + } } - - for(int i = 0; i < interfaces.length; i++) { - queue.enqueue(interfaces[i]); + + for (int i = 0; i < interfaces.length; i++) { + queue.enqueue(interfaces[i]); } } - + return vec.toArray(); } + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; + } + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator(BCELComparator comparator) { + _cmp = comparator; + } + + /** + * Return value as defined by given BCELComparator strategy. + * By default two JavaClass objects are said to be equal when + * their class names are equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + return _cmp.equals(this, obj); + } + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the class name. + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); + } } diff --git a/src/java/org/apache/bcel/classfile/Method.java b/src/java/org/apache/bcel/classfile/Method.java index b470d916..eb097db5 100644 --- a/src/java/org/apache/bcel/classfile/Method.java +++ b/src/java/org/apache/bcel/classfile/Method.java @@ -53,9 +53,12 @@ package org.apache.bcel.classfile; * information on the Apache Software Foundation, please see * . */ +import java.io.DataInputStream; +import java.io.IOException; + import org.apache.bcel.Constants; import org.apache.bcel.generic.Type; -import java.io.*; +import org.apache.bcel.util.BCELComparator; /** * This class represents the method info structure, i.e., the representation @@ -63,14 +66,30 @@ import java.io.*; * A method has access flags, a name, a signature and a number of attributes. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class Method extends FieldOrMethod { + private static BCELComparator _cmp = new BCELComparator() { + public boolean equals(Object o1, Object o2) { + Method THIS = (Method)o1; + Method THAT = (Method)o2; + + return THIS.getName().equals(THAT.getName()) + && THIS.getSignature().equals(THAT.getSignature()); + } + + public int hashCode(Object o) { + Method THIS = (Method)o; + return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + } + }; + /** * Empty constructor, all attributes have to be defined via `setXXX' * methods. Use at your own risk. */ - public Method() {} + public Method() { + } /** * Initialize from another object. Note that both objects use the same @@ -87,8 +106,7 @@ public final class Method extends FieldOrMethod { * @throws ClassFormatException */ Method(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatException - { + throws IOException, ClassFormatException { super(file, constant_pool); } @@ -99,9 +117,12 @@ public final class Method extends FieldOrMethod { * @param attributes Collection of attributes * @param constant_pool Array of constants */ - public Method(int access_flags, int name_index, int signature_index, - Attribute[] attributes, ConstantPool constant_pool) - { + public Method( + int access_flags, + int name_index, + int signature_index, + Attribute[] attributes, + ConstantPool constant_pool) { super(access_flags, name_index, signature_index, attributes, constant_pool); } @@ -118,11 +139,11 @@ public final class Method extends FieldOrMethod { /** * @return Code attribute of method, if any - */ + */ public final Code getCode() { - for(int i=0; i < attributes_count; i++) - if(attributes[i] instanceof Code) - return (Code)attributes[i]; + for (int i = 0; i < attributes_count; i++) + if (attributes[i] instanceof Code) + return (Code)attributes[i]; return null; } @@ -132,9 +153,9 @@ public final class Method extends FieldOrMethod { * exceptions the method may throw not exception handlers! */ public final ExceptionTable getExceptionTable() { - for(int i=0; i < attributes_count; i++) - if(attributes[i] instanceof ExceptionTable) - return (ExceptionTable)attributes[i]; + for (int i = 0; i < attributes_count; i++) + if (attributes[i] instanceof ExceptionTable) + return (ExceptionTable)attributes[i]; return null; } @@ -145,7 +166,7 @@ public final class Method extends FieldOrMethod { public final LocalVariableTable getLocalVariableTable() { Code code = getCode(); - if(code != null) + if (code != null) return code.getLocalVariableTable(); else return null; @@ -157,7 +178,7 @@ public final class Method extends FieldOrMethod { public final LineNumberTable getLineNumberTable() { Code code = getCode(); - if(code != null) + if (code != null) return code.getLineNumberTable(); else return null; @@ -170,38 +191,48 @@ public final class Method extends FieldOrMethod { * @return String representation of the method. */ public final String toString() { - ConstantUtf8 c; - String name, signature, access; // Short cuts to constant pool - StringBuffer buf; + ConstantUtf8 c; + String name, signature, access; // Short cuts to constant pool + StringBuffer buf; access = Utility.accessToString(access_flags); // Get name and signature from constant pool - c = (ConstantUtf8)constant_pool.getConstant(signature_index, - Constants.CONSTANT_Utf8); + c = + (ConstantUtf8)constant_pool.getConstant( + signature_index, + Constants.CONSTANT_Utf8); signature = c.getBytes(); - c = (ConstantUtf8)constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8); + c = + (ConstantUtf8)constant_pool.getConstant( + name_index, + Constants.CONSTANT_Utf8); name = c.getBytes(); - signature = Utility.methodSignatureToString(signature, name, access, true, - getLocalVariableTable()); + signature = + Utility.methodSignatureToString( + signature, + name, + access, + true, + getLocalVariableTable()); buf = new StringBuffer(signature); - for(int i=0; i < attributes_count; i++) { + for (int i = 0; i < attributes_count; i++) { Attribute a = attributes[i]; - if(!((a instanceof Code) || (a instanceof ExceptionTable))) - buf.append(" [" + a.toString() + "]"); + if (!((a instanceof Code) || (a instanceof ExceptionTable))) + buf.append(" [" + a.toString() + "]"); } ExceptionTable e = getExceptionTable(); - if(e != null) { + if (e != null) { String str = e.toString(); - if(!str.equals("")) - buf.append("\n\t\tthrows " + str); + if (!str.equals("")) + buf.append("\n\t\tthrows " + str); } - + return buf.toString(); } @@ -225,4 +256,39 @@ public final class Method extends FieldOrMethod { public Type[] getArgumentTypes() { return Type.getArgumentTypes(getSignature()); } + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; + } + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator(BCELComparator comparator) { + _cmp = comparator; + } + + /** + * Return value as defined by given BCELComparator strategy. + * By default two method objects are said to be equal when + * their names and signatures are equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + return _cmp.equals(this, obj); + } + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the method's name XOR signature. + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); + } } diff --git a/src/java/org/apache/bcel/util/BCELComparator.java b/src/java/org/apache/bcel/util/BCELComparator.java new file mode 100644 index 00000000..5b6036ba --- /dev/null +++ b/src/java/org/apache/bcel/util/BCELComparator.java @@ -0,0 +1,27 @@ +package org.apache.bcel.util; + +/** + * Used for BCEL comparison strategy + * + * @author M. Dahm + * @version $Id$ + */ +public interface BCELComparator { + /** + * Compare two objects and return what THIS.equals(THAT) should return + * + * @param THIS + * @param THAT + * @return + */ + public boolean equals(Object THIS, Object THAT); + + /** + * Return hashcode for THIS.hashCode() + * + * @param THIS + * @param THAT + * @return + */ + public int hashCode(Object THIS); +} -- GitLab From a75952e2599c90c2dbda2885f8ab1a21060898fb Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 23 May 2003 07:52:22 +0000 Subject: [PATCH 0164/1313] equals() and hashCode() may be parameterized with strategy object git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152854 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/generic/ClassGen.java | 320 ++++-- .../org/apache/bcel/generic/FieldGen.java | 55 +- .../org/apache/bcel/generic/MethodGen.java | 910 +++++++++++------- 3 files changed, 817 insertions(+), 468 deletions(-) diff --git a/src/java/org/apache/bcel/generic/ClassGen.java b/src/java/org/apache/bcel/generic/ClassGen.java index aa56f5c9..8cd24ce7 100644 --- a/src/java/org/apache/bcel/generic/ClassGen.java +++ b/src/java/org/apache/bcel/generic/ClassGen.java @@ -56,6 +56,8 @@ package org.apache.bcel.generic; import org.apache.bcel.Constants; import org.apache.bcel.classfile.*; +import org.apache.bcel.util.BCELComparator; + import java.util.ArrayList; import java.util.Iterator; @@ -65,22 +67,36 @@ import java.util.Iterator; * * @see JavaClass * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ClassGen extends AccessFlags implements Cloneable { /* Corresponds to the fields found in a JavaClass object. */ - private String class_name, super_class_name, file_name; - private int class_name_index = -1, superclass_name_index = -1; - private int major = Constants.MAJOR_1_1, minor = Constants.MINOR_1_1; + private String class_name, super_class_name, file_name; + private int class_name_index = -1, superclass_name_index = -1; + private int major = Constants.MAJOR_1_1, minor = Constants.MINOR_1_1; private ConstantPoolGen cp; // Template for building up constant pool // ArrayLists instead of arrays to gather fields, methods, etc. - private ArrayList field_vec = new ArrayList(); - private ArrayList method_vec = new ArrayList(); - private ArrayList attribute_vec = new ArrayList(); - private ArrayList interface_vec = new ArrayList(); + private ArrayList field_vec = new ArrayList(); + private ArrayList method_vec = new ArrayList(); + private ArrayList attribute_vec = new ArrayList(); + private ArrayList interface_vec = new ArrayList(); + + private static BCELComparator _cmp = new BCELComparator() { + public boolean equals(Object o1, Object o2) { + ClassGen THIS = (ClassGen)o1; + ClassGen THAT = (ClassGen)o2; + + return THIS.getClassName().equals(THAT.getClassName()); + } + + public int hashCode(Object o) { + ClassGen THIS = (ClassGen)o; + return THIS.getClassName().hashCode(); + } + }; /** Convenience constructor to set up some important values initially. * @@ -91,25 +107,34 @@ public class ClassGen extends AccessFlags implements Cloneable { * @param interfaces implemented interfaces * @param cp constant pool to use */ - public ClassGen(String class_name, String super_class_name, String file_name, - int access_flags, String[] interfaces, ConstantPoolGen cp) { - this.class_name = class_name; + public ClassGen( + String class_name, + String super_class_name, + String file_name, + int access_flags, + String[] interfaces, + ConstantPoolGen cp) { + this.class_name = class_name; this.super_class_name = super_class_name; - this.file_name = file_name; - this.access_flags = access_flags; - this.cp = cp; + this.file_name = file_name; + this.access_flags = access_flags; + this.cp = cp; // Put everything needed by default into the constant pool and the vectors - if(file_name != null) - addAttribute(new SourceFile(cp.addUtf8("SourceFile"), 2, - cp.addUtf8(file_name), cp.getConstantPool())); - - class_name_index = cp.addClass(class_name); + if (file_name != null) + addAttribute( + new SourceFile( + cp.addUtf8("SourceFile"), + 2, + cp.addUtf8(file_name), + cp.getConstantPool())); + + class_name_index = cp.addClass(class_name); superclass_name_index = cp.addClass(super_class_name); - if(interfaces != null) - for(int i=0; i < interfaces.length; i++) - addInterface(interfaces[i]); + if (interfaces != null) + for (int i = 0; i < interfaces.length; i++) + addInterface(interfaces[i]); } /** Convenience constructor to set up some important values initially. @@ -120,10 +145,19 @@ public class ClassGen extends AccessFlags implements Cloneable { * @param access_flags access qualifiers * @param interfaces implemented interfaces */ - public ClassGen(String class_name, String super_class_name, String file_name, - int access_flags, String[] interfaces) { - this(class_name, super_class_name, file_name, access_flags, interfaces, - new ConstantPoolGen()); + public ClassGen( + String class_name, + String super_class_name, + String file_name, + int access_flags, + String[] interfaces) { + this( + class_name, + super_class_name, + file_name, + access_flags, + interfaces, + new ConstantPoolGen()); } /** @@ -131,31 +165,31 @@ public class ClassGen extends AccessFlags implements Cloneable { * @param clazz JavaClass object (e.g. read from file) */ public ClassGen(JavaClass clazz) { - class_name_index = clazz.getClassNameIndex(); + class_name_index = clazz.getClassNameIndex(); superclass_name_index = clazz.getSuperclassNameIndex(); - class_name = clazz.getClassName(); - super_class_name = clazz.getSuperclassName(); - file_name = clazz.getSourceFileName(); - access_flags = clazz.getAccessFlags(); - cp = new ConstantPoolGen(clazz.getConstantPool()); - major = clazz.getMajor(); - minor = clazz.getMinor(); + class_name = clazz.getClassName(); + super_class_name = clazz.getSuperclassName(); + file_name = clazz.getSourceFileName(); + access_flags = clazz.getAccessFlags(); + cp = new ConstantPoolGen(clazz.getConstantPool()); + major = clazz.getMajor(); + minor = clazz.getMinor(); Attribute[] attributes = clazz.getAttributes(); - Method[] methods = clazz.getMethods(); - Field[] fields = clazz.getFields(); - String[] interfaces = clazz.getInterfaceNames(); - - for(int i=0; i < interfaces.length; i++) + Method[] methods = clazz.getMethods(); + Field[] fields = clazz.getFields(); + String[] interfaces = clazz.getInterfaceNames(); + + for (int i = 0; i < interfaces.length; i++) addInterface(interfaces[i]); - for(int i=0; i < attributes.length; i++) + for (int i = 0; i < attributes.length; i++) addAttribute(attributes[i]); - for(int i=0; i < methods.length; i++) + for (int i = 0; i < methods.length; i++) addMethod(methods[i]); - for(int i=0; i < fields.length; i++) + for (int i = 0; i < fields.length; i++) addField(fields[i]); } @@ -163,17 +197,26 @@ public class ClassGen extends AccessFlags implements Cloneable { * @return the (finally) built up Java class object. */ public JavaClass getJavaClass() { - int[] interfaces = getInterfaces(); - Field[] fields = getFields(); - Method[] methods = getMethods(); - Attribute[] attributes = getAttributes(); + int[] interfaces = getInterfaces(); + Field[] fields = getFields(); + Method[] methods = getMethods(); + Attribute[] attributes = getAttributes(); // Must be last since the above calls may still add something to it - ConstantPool cp = this.cp.getFinalConstantPool(); - - return new JavaClass(class_name_index, superclass_name_index, - file_name, major, minor, access_flags, - cp, interfaces, fields, methods, attributes); + ConstantPool cp = this.cp.getFinalConstantPool(); + + return new JavaClass( + class_name_index, + superclass_name_index, + file_name, + major, + minor, + access_flags, + cp, + interfaces, + fields, + methods, + attributes); } /** @@ -195,38 +238,46 @@ public class ClassGen extends AccessFlags implements Cloneable { /** * @return major version number of class file */ - public int getMajor() { return major; } + public int getMajor() { + return major; + } /** Set major version number of class file, default value is 45 (JDK 1.1) * @param major major version number */ public void setMajor(int major) { this.major = major; - } + } /** Set minor version number of class file, default value is 3 (JDK 1.1) * @param minor minor version number */ public void setMinor(int minor) { this.minor = minor; - } + } /** * @return minor version number of class file */ - public int getMinor() { return minor; } + public int getMinor() { + return minor; + } /** * Add an attribute to this class. * @param a attribute to add */ - public void addAttribute(Attribute a) { attribute_vec.add(a); } + public void addAttribute(Attribute a) { + attribute_vec.add(a); + } /** * Add a method to this class. * @param m method to add */ - public void addMethod(Method m) { method_vec.add(m); } + public void addMethod(Method m) { + method_vec.add(m); + } /** * Convenience method. @@ -237,12 +288,20 @@ public class ClassGen extends AccessFlags implements Cloneable { public void addEmptyConstructor(int access_flags) { InstructionList il = new InstructionList(); il.append(InstructionConstants.THIS); // Push `this' - il.append(new INVOKESPECIAL(cp.addMethodref(super_class_name, - "", "()V"))); + il.append( + new INVOKESPECIAL(cp.addMethodref(super_class_name, "", "()V"))); il.append(InstructionConstants.RETURN); - MethodGen mg = new MethodGen(access_flags, Type.VOID, Type.NO_ARGS, null, - "", class_name, il, cp); + MethodGen mg = + new MethodGen( + access_flags, + Type.VOID, + Type.NO_ARGS, + null, + "", + class_name, + il, + cp); mg.setMaxStack(1); addMethod(mg.getMethod()); } @@ -251,17 +310,21 @@ public class ClassGen extends AccessFlags implements Cloneable { * Add a field to this class. * @param f field to add */ - public void addField(Field f) { field_vec.add(f); } + public void addField(Field f) { + field_vec.add(f); + } + + public boolean containsField(Field f) { + return field_vec.contains(f); + } - public boolean containsField(Field f) { return field_vec.contains(f); } - /** @return field object with given name, or null */ public Field containsField(String name) { - for(Iterator e=field_vec.iterator(); e.hasNext(); ) { + for (Iterator e = field_vec.iterator(); e.hasNext();) { Field f = (Field)e.next(); - if(f.getName().equals(name)) - return f; + if (f.getName().equals(name)) + return f; } return null; @@ -270,10 +333,10 @@ public class ClassGen extends AccessFlags implements Cloneable { /** @return method object with given name and signature, or null */ public Method containsMethod(String name, String signature) { - for(Iterator e=method_vec.iterator(); e.hasNext();) { + for (Iterator e = method_vec.iterator(); e.hasNext();) { Method m = (Method)e.next(); - if(m.getName().equals(name) && m.getSignature().equals(signature)) - return m; + if (m.getName().equals(name) && m.getSignature().equals(signature)) + return m; } return null; @@ -283,24 +346,28 @@ public class ClassGen extends AccessFlags implements Cloneable { * Remove an attribute from this class. * @param a attribute to remove */ - public void removeAttribute(Attribute a) { attribute_vec.remove(a); } + public void removeAttribute(Attribute a) { + attribute_vec.remove(a); + } /** * Remove a method from this class. * @param m method to remove */ - public void removeMethod(Method m) { method_vec.remove(m); } + public void removeMethod(Method m) { + method_vec.remove(m); + } /** Replace given method with new one. If the old one does not exist * add the new_ method to the class anyway. */ public void replaceMethod(Method old, Method new_) { - if(new_ == null) + if (new_ == null) throw new ClassGenException("Replacement method must not be null"); int i = method_vec.indexOf(old); - if(i < 0) + if (i < 0) method_vec.add(new_); else method_vec.set(i, new_); @@ -310,12 +377,12 @@ public class ClassGen extends AccessFlags implements Cloneable { * add the new_ field to the class anyway. */ public void replaceField(Field old, Field new_) { - if(new_ == null) + if (new_ == null) throw new ClassGenException("Replacement method must not be null"); int i = field_vec.indexOf(old); - if(i < 0) + if (i < 0) field_vec.add(new_); else field_vec.set(i, new_); @@ -325,11 +392,19 @@ public class ClassGen extends AccessFlags implements Cloneable { * Remove a field to this class. * @param f field to remove */ - public void removeField(Field f) { field_vec.remove(f); } + public void removeField(Field f) { + field_vec.remove(f); + } - public String getClassName() { return class_name; } - public String getSuperclassName() { return super_class_name; } - public String getFileName() { return file_name; } + public String getClassName() { + return class_name; + } + public String getSuperclassName() { + return super_class_name; + } + public String getFileName() { + return file_name; + } public void setClassName(String name) { class_name = name.replace('/', '.'); @@ -349,7 +424,7 @@ public class ClassGen extends AccessFlags implements Cloneable { public void setMethods(Method[] methods) { method_vec.clear(); - for(int m=0; mM. Dahm + * @author M. Dahm * @see Field */ public class FieldGen extends FieldGenOrMethodGen { private Object value = null; + private static BCELComparator _cmp = new BCELComparator() { + public boolean equals(Object o1, Object o2) { + FieldGen THIS = (FieldGen)o1; + FieldGen THAT = (FieldGen)o2; + + return THIS.getName().equals(THAT.getName()) + && THIS.getSignature().equals(THAT.getSignature()); + } + + public int hashCode(Object o) { + FieldGen THIS = (FieldGen)o; + return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + } + }; + /** * Declare a field. If it is static (isStatic() == true) and has a * basic type like int or String it may have an initial value @@ -307,4 +324,40 @@ public class FieldGen extends FieldGenOrMethodGen { fg.setConstantPool(cp); return fg; } + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; + } + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator(BCELComparator comparator) { + _cmp = comparator; + } + + /** + * Return value as defined by given BCELComparator strategy. + * By default two FieldGen objects are said to be equal when + * their names and signatures are equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + return _cmp.equals(this, obj); + } + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the field's name XOR signature. + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); + } } + diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index 435d592b..a192b302 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -56,6 +56,8 @@ package org.apache.bcel.generic; import org.apache.bcel.Constants; import org.apache.bcel.classfile.*; +import org.apache.bcel.util.BCELComparator; + import java.util.*; /** @@ -69,25 +71,40 @@ import java.util.*; * The resulting method object can be obtained via the `getMethod()' method. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @author Patrick C. Beard [setMaxStack()] * @see InstructionList * @see Method */ public class MethodGen extends FieldGenOrMethodGen { - private String class_name; - private Type[] arg_types; - private String[] arg_names; - private int max_locals; - private int max_stack; + private String class_name; + private Type[] arg_types; + private String[] arg_names; + private int max_locals; + private int max_stack; private InstructionList il; - private boolean strip_attributes; + private boolean strip_attributes; + + private ArrayList variable_vec = new ArrayList(); + private ArrayList line_number_vec = new ArrayList(); + private ArrayList exception_vec = new ArrayList(); + private ArrayList throws_vec = new ArrayList(); + private ArrayList code_attrs_vec = new ArrayList(); + + private static BCELComparator _cmp = new BCELComparator() { + public boolean equals(Object o1, Object o2) { + MethodGen THIS = (MethodGen)o1; + MethodGen THAT = (MethodGen)o2; + + return THIS.getName().equals(THAT.getName()) + && THIS.getSignature().equals(THAT.getSignature()); + } - private ArrayList variable_vec = new ArrayList(); - private ArrayList line_number_vec = new ArrayList(); - private ArrayList exception_vec = new ArrayList(); - private ArrayList throws_vec = new ArrayList(); - private ArrayList code_attrs_vec = new ArrayList(); + public int hashCode(Object o) { + MethodGen THIS = (MethodGen)o; + return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + } + }; /** * Declare method. If the method is non-static the constructor @@ -111,9 +128,15 @@ public class MethodGen extends FieldGenOrMethodGen { * abstract or native methods * @param cp constant pool */ - public MethodGen(int access_flags, Type return_type, Type[] arg_types, - String[] arg_names, String method_name, String class_name, - InstructionList il, ConstantPoolGen cp) { + public MethodGen( + int access_flags, + Type return_type, + Type[] arg_types, + String[] arg_names, + String method_name, + String class_name, + InstructionList il, + ConstantPoolGen cp) { setAccessFlags(access_flags); setType(return_type); setArgumentTypes(arg_types); @@ -125,45 +148,49 @@ public class MethodGen extends FieldGenOrMethodGen { boolean abstract_ = isAbstract() || isNative(); InstructionHandle start = null; - InstructionHandle end = null; + InstructionHandle end = null; - if(!abstract_) { + if (!abstract_) { start = il.getStart(); - end = il.getEnd(); + end = il.getEnd(); /* Add local variables, namely the implicit `this' and the arguments */ - if(!isStatic() && (class_name != null)) { // Instance method -> `this' is local var 0 - addLocalVariable("this", new ObjectType(class_name), start, end); + if (!isStatic() + && (class_name != null)) { // Instance method -> `this' is local var 0 + addLocalVariable("this", new ObjectType(class_name), start, end); } } - if(arg_types != null) { + if (arg_types != null) { int size = arg_types.length; - for(int i=0; i < size; i++) { - if(Type.VOID == arg_types[i]) { - throw new ClassGenException("'void' is an illegal argument type for a method"); - } + for (int i = 0; i < size; i++) { + if (Type.VOID == arg_types[i]) { + throw new ClassGenException("'void' is an illegal argument type for a method"); + } } - - if(arg_names != null) { // Names for variables provided? - if(size != arg_names.length) - throw new ClassGenException("Mismatch in argument array lengths: " + - size + " vs. " + arg_names.length); + + if (arg_names != null) { // Names for variables provided? + if (size != arg_names.length) + throw new ClassGenException( + "Mismatch in argument array lengths: " + + size + + " vs. " + + arg_names.length); } else { // Give them dummy names - arg_names = new String[size]; - - for(int i=0; i < size; i++) - arg_names[i] = "arg" + i; - - setArgumentNames(arg_names); + arg_names = new String[size]; + + for (int i = 0; i < size; i++) + arg_names[i] = "arg" + i; + + setArgumentNames(arg_names); } - - if(!abstract_) { - for(int i=0; i < size; i++) { - addLocalVariable(arg_names[i], arg_types[i], start, end); - } + + if (!abstract_) { + for (int i = 0; i < size; i++) { + addLocalVariable(arg_names[i], arg_types[i], start, end); + } } } } @@ -176,94 +203,113 @@ public class MethodGen extends FieldGenOrMethodGen { * @param cp constant pool */ public MethodGen(Method m, String class_name, ConstantPoolGen cp) { - this(m.getAccessFlags(), Type.getReturnType(m.getSignature()), - Type.getArgumentTypes(m.getSignature()), null /* may be overridden anyway */, - m.getName(), class_name, - ((m.getAccessFlags() & (Constants.ACC_ABSTRACT | Constants.ACC_NATIVE)) == 0)? - new InstructionList(m.getCode().getCode()) : null, - cp); + this( + m.getAccessFlags(), + Type.getReturnType(m.getSignature()), + Type.getArgumentTypes(m.getSignature()), + null /* may be overridden anyway */ + , +m.getName(), + class_name, + ((m.getAccessFlags() & (Constants.ACC_ABSTRACT | Constants.ACC_NATIVE)) + == 0) + ? new InstructionList(m.getCode().getCode()) + : null, + cp); Attribute[] attributes = m.getAttributes(); - for(int i=0; i < attributes.length; i++) { + for (int i = 0; i < attributes.length; i++) { Attribute a = attributes[i]; - if(a instanceof Code) { - Code c = (Code)a; - setMaxStack(c.getMaxStack()); - setMaxLocals(c.getMaxLocals()); - - CodeException[] ces = c.getExceptionTable(); - - if(ces != null) { - for(int j=0; j < ces.length; j++) { - CodeException ce = ces[j]; - int type = ce.getCatchType(); - ObjectType c_type = null; - - if(type > 0) { - String cen = m.getConstantPool().getConstantString(type, Constants.CONSTANT_Class); - c_type = new ObjectType(cen); - } - - int end_pc = ce.getEndPC(); - int length = m.getCode().getCode().length; - - InstructionHandle end; - - if(length == end_pc) { // May happen, because end_pc is exclusive - end = il.getEnd(); - } else { - end = il.findHandle(end_pc); - end = end.getPrev(); // Make it inclusive - } - - addExceptionHandler(il.findHandle(ce.getStartPC()), end, - il.findHandle(ce.getHandlerPC()), c_type); - } - } - - Attribute[] c_attributes = c.getAttributes(); - for(int j=0; j < c_attributes.length; j++) { - a = c_attributes[j]; - - if(a instanceof LineNumberTable) { - LineNumber[] ln = ((LineNumberTable)a).getLineNumberTable(); - - for(int k=0; k < ln.length; k++) { - LineNumber l = ln[k]; - addLineNumber(il.findHandle(l.getStartPC()), l.getLineNumber()); - } - } else if(a instanceof LocalVariableTable) { - LocalVariable[] lv = ((LocalVariableTable)a).getLocalVariableTable(); - - removeLocalVariables(); - - for(int k=0; k < lv.length; k++) { - LocalVariable l = lv[k]; - InstructionHandle start = il.findHandle(l.getStartPC()); - InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength()); - - // Repair malformed handles - if(null == start) { - start = il.getStart(); - } - - if(null == end) { - end = il.getEnd(); - } - - addLocalVariable(l.getName(), Type.getType(l.getSignature()), - l.getIndex(), start, end); - } - } else - addCodeAttribute(a); - } - } else if(a instanceof ExceptionTable) { - String[] names = ((ExceptionTable)a).getExceptionNames(); - for(int j=0; j < names.length; j++) - addException(names[j]); + if (a instanceof Code) { + Code c = (Code)a; + setMaxStack(c.getMaxStack()); + setMaxLocals(c.getMaxLocals()); + + CodeException[] ces = c.getExceptionTable(); + + if (ces != null) { + for (int j = 0; j < ces.length; j++) { + CodeException ce = ces[j]; + int type = ce.getCatchType(); + ObjectType c_type = null; + + if (type > 0) { + String cen = + m.getConstantPool().getConstantString( + type, + Constants.CONSTANT_Class); + c_type = new ObjectType(cen); + } + + int end_pc = ce.getEndPC(); + int length = m.getCode().getCode().length; + + InstructionHandle end; + + if (length == end_pc) { // May happen, because end_pc is exclusive + end = il.getEnd(); + } else { + end = il.findHandle(end_pc); + end = end.getPrev(); // Make it inclusive + } + + addExceptionHandler( + il.findHandle(ce.getStartPC()), + end, + il.findHandle(ce.getHandlerPC()), + c_type); + } + } + + Attribute[] c_attributes = c.getAttributes(); + for (int j = 0; j < c_attributes.length; j++) { + a = c_attributes[j]; + + if (a instanceof LineNumberTable) { + LineNumber[] ln = ((LineNumberTable)a).getLineNumberTable(); + + for (int k = 0; k < ln.length; k++) { + LineNumber l = ln[k]; + addLineNumber(il.findHandle(l.getStartPC()), l.getLineNumber()); + } + } else if (a instanceof LocalVariableTable) { + LocalVariable[] lv = + ((LocalVariableTable)a).getLocalVariableTable(); + + removeLocalVariables(); + + for (int k = 0; k < lv.length; k++) { + LocalVariable l = lv[k]; + InstructionHandle start = il.findHandle(l.getStartPC()); + InstructionHandle end = + il.findHandle(l.getStartPC() + l.getLength()); + + // Repair malformed handles + if (null == start) { + start = il.getStart(); + } + + if (null == end) { + end = il.getEnd(); + } + + addLocalVariable( + l.getName(), + Type.getType(l.getSignature()), + l.getIndex(), + start, + end); + } + } else + addCodeAttribute(a); + } + } else if (a instanceof ExceptionTable) { + String[] names = ((ExceptionTable)a).getExceptionNames(); + for (int j = 0; j < names.length; j++) + addException(names[j]); } else - addAttribute(a); + addAttribute(a); } } @@ -279,30 +325,33 @@ public class MethodGen extends FieldGenOrMethodGen { * @return new local variable object * @see LocalVariable */ - public LocalVariableGen addLocalVariable(String name, Type type, int slot, - InstructionHandle start, - InstructionHandle end) { + public LocalVariableGen addLocalVariable( + String name, + Type type, + int slot, + InstructionHandle start, + InstructionHandle end) { byte t = type.getType(); - if(t != Constants.T_ADDRESS) { - int add = type.getSize(); - - if(slot + add > max_locals) - max_locals = slot + add; - + if (t != Constants.T_ADDRESS) { + int add = type.getSize(); + + if (slot + add > max_locals) + max_locals = slot + add; + LocalVariableGen l = new LocalVariableGen(slot, name, type, start, end); int i; - - if((i = variable_vec.indexOf(l)) >= 0) // Overwrite if necessary - variable_vec.set(i, l); + + if ((i = variable_vec.indexOf(l)) >= 0) // Overwrite if necessary + variable_vec.set(i, l); else - variable_vec.add(l); + variable_vec.add(l); return l; } else { - throw new IllegalArgumentException("Can not use " + type + - " as type for local variable"); - + throw new IllegalArgumentException( + "Can not use " + type + " as type for local variable"); + } } @@ -318,9 +367,11 @@ public class MethodGen extends FieldGenOrMethodGen { * @return new local variable object * @see LocalVariable */ - public LocalVariableGen addLocalVariable(String name, Type type, - InstructionHandle start, - InstructionHandle end) { + public LocalVariableGen addLocalVariable( + String name, + Type type, + InstructionHandle start, + InstructionHandle end) { return addLocalVariable(name, type, max_locals, start, end); } @@ -329,7 +380,7 @@ public class MethodGen extends FieldGenOrMethodGen { * with an explicit index argument. */ public void removeLocalVariable(LocalVariableGen l) { - variable_vec.remove(l); + variable_vec.remove(l); } /** @@ -348,17 +399,25 @@ public class MethodGen extends FieldGenOrMethodGen { LocalVariableGen h; do { - while(vars[i].getIndex() < m) i++; - while(m < vars[j].getIndex()) j--; - - if(i <= j) { - h=vars[i]; vars[i]=vars[j]; vars[j]=h; // Swap elements - i++; j--; + while (vars[i].getIndex() < m) + i++; + while (m < vars[j].getIndex()) + j--; + + if (i <= j) { + h = vars[i]; + vars[i] = vars[j]; + vars[j] = h; // Swap elements + i++; + j--; } - } while(i <= j); + } + while (i <= j); - if(l < j) sort(vars, l, j); - if(i < r) sort(vars, i, r); + if (l < j) + sort(vars, l, j); + if (i < r) + sort(vars, i, r); } /* @@ -368,19 +427,19 @@ public class MethodGen extends FieldGenOrMethodGen { * @return array of declared local variables sorted by index */ public LocalVariableGen[] getLocalVariables() { - int size = variable_vec.size(); - LocalVariableGen[] lg = new LocalVariableGen[size]; + int size = variable_vec.size(); + LocalVariableGen[] lg = new LocalVariableGen[size]; variable_vec.toArray(lg); - - for(int i=0; i < size; i++) { - if(lg[i].getStart() == null) - lg[i].setStart(il.getStart()); - if(lg[i].getEnd() == null) - lg[i].setEnd(il.getEnd()); + for (int i = 0; i < size; i++) { + if (lg[i].getStart() == null) + lg[i].setStart(il.getStart()); + + if (lg[i].getEnd() == null) + lg[i].setEnd(il.getEnd()); } - if(size > 1) + if (size > 1) sort(lg, 0, size - 1); return lg; @@ -390,15 +449,18 @@ public class MethodGen extends FieldGenOrMethodGen { * @return `LocalVariableTable' attribute of all the local variables of this method. */ public LocalVariableTable getLocalVariableTable(ConstantPoolGen cp) { - LocalVariableGen[] lg = getLocalVariables(); - int size = lg.length; - LocalVariable[] lv = new LocalVariable[size]; + LocalVariableGen[] lg = getLocalVariables(); + int size = lg.length; + LocalVariable[] lv = new LocalVariable[size]; - for(int i=0; i < size; i++) + for (int i = 0; i < size; i++) lv[i] = lg[i].getLocalVariable(cp); - return new LocalVariableTable(cp.addUtf8("LocalVariableTable"), - 2 + lv.length * 10, lv, cp.getConstantPool()); + return new LocalVariableTable( + cp.addUtf8("LocalVariableTable"), + 2 + lv.length * 10, + lv, + cp.getConstantPool()); } /** @@ -418,7 +480,7 @@ public class MethodGen extends FieldGenOrMethodGen { * Remove a line number. */ public void removeLineNumber(LineNumberGen l) { - line_number_vec.remove(l); + line_number_vec.remove(l); } /** @@ -441,16 +503,20 @@ public class MethodGen extends FieldGenOrMethodGen { * @return `LineNumberTable' attribute of all the local variables of this method. */ public LineNumberTable getLineNumberTable(ConstantPoolGen cp) { - int size = line_number_vec.size(); - LineNumber[] ln = new LineNumber[size]; + int size = line_number_vec.size(); + LineNumber[] ln = new LineNumber[size]; try { - for(int i=0; i < size; i++) - ln[i] = ((LineNumberGen)line_number_vec.get(i)).getLineNumber(); - } catch(ArrayIndexOutOfBoundsException e) {} // Never occurs - - return new LineNumberTable(cp.addUtf8("LineNumberTable"), - 2 + ln.length * 4, ln, cp.getConstantPool()); + for (int i = 0; i < size; i++) + ln[i] = ((LineNumberGen)line_number_vec.get(i)).getLineNumber(); + } catch (ArrayIndexOutOfBoundsException e) { + } // Never occurs + + return new LineNumberTable( + cp.addUtf8("LineNumberTable"), + 2 + ln.length * 4, + ln, + cp.getConstantPool()); } /** @@ -464,15 +530,16 @@ public class MethodGen extends FieldGenOrMethodGen { * exception is handled * @return new exception handler object */ - public CodeExceptionGen addExceptionHandler(InstructionHandle start_pc, - InstructionHandle end_pc, - InstructionHandle handler_pc, - ObjectType catch_type) { - if((start_pc == null) || (end_pc == null) || (handler_pc == null)) + public CodeExceptionGen addExceptionHandler( + InstructionHandle start_pc, + InstructionHandle end_pc, + InstructionHandle handler_pc, + ObjectType catch_type) { + if ((start_pc == null) || (end_pc == null) || (handler_pc == null)) throw new ClassGenException("Exception handler target is null instruction"); - - CodeExceptionGen c = new CodeExceptionGen(start_pc, end_pc, - handler_pc, catch_type); + + CodeExceptionGen c = + new CodeExceptionGen(start_pc, end_pc, handler_pc, catch_type); exception_vec.add(c); return c; } @@ -481,7 +548,7 @@ public class MethodGen extends FieldGenOrMethodGen { * Remove an exception handler. */ public void removeExceptionHandler(CodeExceptionGen c) { - exception_vec.remove(c); + exception_vec.remove(c); } /** @@ -495,7 +562,7 @@ public class MethodGen extends FieldGenOrMethodGen { * @return array of declared exception handlers */ public CodeExceptionGen[] getExceptionHandlers() { - CodeExceptionGen[] cg = new CodeExceptionGen[exception_vec.size()]; + CodeExceptionGen[] cg = new CodeExceptionGen[exception_vec.size()]; exception_vec.toArray(cg); return cg; } @@ -504,16 +571,17 @@ public class MethodGen extends FieldGenOrMethodGen { * @return code exceptions for `Code' attribute */ private CodeException[] getCodeExceptions() { - int size = exception_vec.size(); + int size = exception_vec.size(); CodeException[] c_exc = new CodeException[size]; try { - for(int i=0; i < size; i++) { - CodeExceptionGen c = (CodeExceptionGen)exception_vec.get(i); - c_exc[i] = c.getCodeException(cp); + for (int i = 0; i < size; i++) { + CodeExceptionGen c = (CodeExceptionGen)exception_vec.get(i); + c_exc[i] = c.getCodeException(cp); } - } catch(ArrayIndexOutOfBoundsException e) {} - + } catch (ArrayIndexOutOfBoundsException e) { + } + return c_exc; } @@ -530,14 +598,14 @@ public class MethodGen extends FieldGenOrMethodGen { * Remove an exception. */ public void removeException(String c) { - throws_vec.remove(c); + throws_vec.remove(c); } /** * Remove all exceptions. */ public void removeExceptions() { - throws_vec.clear(); + throws_vec.clear(); } /* @@ -553,16 +621,20 @@ public class MethodGen extends FieldGenOrMethodGen { * @return `Exceptions' attribute of all the exceptions thrown by this method. */ private ExceptionTable getExceptionTable(ConstantPoolGen cp) { - int size = throws_vec.size(); - int[] ex = new int[size]; - + int size = throws_vec.size(); + int[] ex = new int[size]; + try { - for(int i=0; i < size; i++) - ex[i] = cp.addClass((String)throws_vec.get(i)); - } catch(ArrayIndexOutOfBoundsException e) {} - - return new ExceptionTable(cp.addUtf8("Exceptions"), - 2 + 2 * size, ex, cp.getConstantPool()); + for (int i = 0; i < size; i++) + ex[i] = cp.addClass((String)throws_vec.get(i)); + } catch (ArrayIndexOutOfBoundsException e) { + } + + return new ExceptionTable( + cp.addUtf8("Exceptions"), + 2 + 2 * size, + ex, + cp.getConstantPool()); } /** @@ -574,13 +646,17 @@ public class MethodGen extends FieldGenOrMethodGen { * * @param a attribute to be added */ - public void addCodeAttribute(Attribute a) { code_attrs_vec.add(a); } + public void addCodeAttribute(Attribute a) { + code_attrs_vec.add(a); + } /** * Remove a code attribute. */ - public void removeCodeAttribute(Attribute a) { code_attrs_vec.remove(a); } - + public void removeCodeAttribute(Attribute a) { + code_attrs_vec.remove(a); + } + /** * Remove all code attributes. */ @@ -604,76 +680,85 @@ public class MethodGen extends FieldGenOrMethodGen { * @return method object */ public Method getMethod() { - String signature = getSignature(); - int name_index = cp.addUtf8(name); - int signature_index = cp.addUtf8(signature); + String signature = getSignature(); + int name_index = cp.addUtf8(name); + int signature_index = cp.addUtf8(signature); /* Also updates positions of instructions, i.e., their indices */ byte[] byte_code = null; - if(il != null) + if (il != null) byte_code = il.getByteCode(); - LineNumberTable lnt = null; + LineNumberTable lnt = null; LocalVariableTable lvt = null; /* Create LocalVariableTable and LineNumberTable attributes (for debuggers, e.g.) */ - if((variable_vec.size() > 0) && !strip_attributes) + if ((variable_vec.size() > 0) && !strip_attributes) addCodeAttribute(lvt = getLocalVariableTable(cp)); - if((line_number_vec.size() > 0) && !strip_attributes) + if ((line_number_vec.size() > 0) && !strip_attributes) addCodeAttribute(lnt = getLineNumberTable(cp)); Attribute[] code_attrs = getCodeAttributes(); /* Each attribute causes 6 additional header bytes */ - int attrs_len = 0; - for(int i=0; i < code_attrs.length; i++) + int attrs_len = 0; + for (int i = 0; i < code_attrs.length; i++) attrs_len += (code_attrs[i].getLength() + 6); - CodeException[] c_exc = getCodeExceptions(); - int exc_len = c_exc.length * 8; // Every entry takes 8 bytes + CodeException[] c_exc = getCodeExceptions(); + int exc_len = c_exc.length * 8; // Every entry takes 8 bytes Code code = null; - if((il != null) && !isAbstract()) { + if ((il != null) && !isAbstract()) { // Remove any stale code attribute Attribute[] attributes = getAttributes(); - for(int i=0; i < attributes.length; i++) { - Attribute a = attributes[i]; + for (int i = 0; i < attributes.length; i++) { + Attribute a = attributes[i]; - if(a instanceof Code) - removeAttribute(a); + if (a instanceof Code) + removeAttribute(a); } - code = new Code(cp.addUtf8("Code"), - 8 + byte_code.length + // prologue byte code - 2 + exc_len + // exceptions - 2 + attrs_len, // attributes - max_stack, max_locals, - byte_code, c_exc, - code_attrs, - cp.getConstantPool()); - + code = + new Code( + cp.addUtf8("Code"), + 8 + byte_code.length + // prologue byte code + 2 + exc_len + // exceptions + 2 + attrs_len, // attributes + max_stack, max_locals, byte_code, c_exc, code_attrs, cp.getConstantPool()); + addAttribute(code); } ExceptionTable et = null; - - if(throws_vec.size() > 0) - addAttribute(et = getExceptionTable(cp)); // Add `Exceptions' if there are "throws" clauses - Method m = new Method(access_flags, name_index, signature_index, - getAttributes(), cp.getConstantPool()); + if (throws_vec.size() > 0) + addAttribute(et = getExceptionTable(cp)); + // Add `Exceptions' if there are "throws" clauses + + Method m = + new Method( + access_flags, + name_index, + signature_index, + getAttributes(), + cp.getConstantPool()); // Undo effects of adding attributes - if(lvt != null) removeCodeAttribute(lvt); - if(lnt != null) removeCodeAttribute(lnt); - if(code != null) removeAttribute(code); - if(et != null) removeAttribute(et); + if (lvt != null) + removeCodeAttribute(lvt); + if (lnt != null) + removeCodeAttribute(lnt); + if (code != null) + removeAttribute(code); + if (et != null) + removeAttribute(et); return m; } @@ -684,27 +769,27 @@ public class MethodGen extends FieldGenOrMethodGen { * exception handlers. */ public void removeNOPs() { - if(il != null) { + if (il != null) { InstructionHandle next; /* Check branch instructions. */ - for(InstructionHandle ih = il.getStart(); ih != null; ih = next) { - next = ih.next; - - if((next != null) && (ih.getInstruction() instanceof NOP)) { - try { - il.delete(ih); - } catch(TargetLostException e) { - InstructionHandle[] targets = e.getTargets(); - - for(int i=0; i < targets.length; i++) { - InstructionTargeter[] targeters = targets[i].getTargeters(); - - for(int j=0; j < targeters.length; j++) - targeters[j].updateTarget(targets[i], next); - } - } - } + for (InstructionHandle ih = il.getStart(); ih != null; ih = next) { + next = ih.next; + + if ((next != null) && (ih.getInstruction() instanceof NOP)) { + try { + il.delete(ih); + } catch (TargetLostException e) { + InstructionHandle[] targets = e.getTargets(); + + for (int i = 0; i < targets.length; i++) { + InstructionTargeter[] targeters = targets[i].getTargeters(); + + for (int j = 0; j < targeters.length; j++) + targeters[j].updateTarget(targets[i], next); + } + } + } } } } @@ -712,37 +797,73 @@ public class MethodGen extends FieldGenOrMethodGen { /** * Set maximum number of local variables. */ - public void setMaxLocals(int m) { max_locals = m; } - public int getMaxLocals() { return max_locals; } + public void setMaxLocals(int m) { + max_locals = m; + } + public int getMaxLocals() { + return max_locals; + } /** * Set maximum stack size for this method. */ - public void setMaxStack(int m) { max_stack = m; } - public int getMaxStack() { return max_stack; } + public void setMaxStack(int m) { + max_stack = m; + } + public int getMaxStack() { + return max_stack; + } /** @return class that contains this method */ - public String getClassName() { return class_name; } - public void setClassName(String class_name) { this.class_name = class_name; } + public String getClassName() { + return class_name; + } + public void setClassName(String class_name) { + this.class_name = class_name; + } - public void setReturnType(Type return_type) { setType(return_type); } - public Type getReturnType() { return getType(); } + public void setReturnType(Type return_type) { + setType(return_type); + } + public Type getReturnType() { + return getType(); + } - public void setArgumentTypes(Type[] arg_types) { this.arg_types = arg_types; } - public Type[] getArgumentTypes() { return (Type[])arg_types.clone(); } - public void setArgumentType(int i, Type type) { arg_types[i] = type; } - public Type getArgumentType(int i) { return arg_types[i]; } + public void setArgumentTypes(Type[] arg_types) { + this.arg_types = arg_types; + } + public Type[] getArgumentTypes() { + return (Type[])arg_types.clone(); + } + public void setArgumentType(int i, Type type) { + arg_types[i] = type; + } + public Type getArgumentType(int i) { + return arg_types[i]; + } - public void setArgumentNames(String[] arg_names) { this.arg_names = arg_names; } - public String[] getArgumentNames() { return (String[])arg_names.clone(); } - public void setArgumentName(int i, String name) { arg_names[i] = name; } - public String getArgumentName(int i) { return arg_names[i]; } + public void setArgumentNames(String[] arg_names) { + this.arg_names = arg_names; + } + public String[] getArgumentNames() { + return (String[])arg_names.clone(); + } + public void setArgumentName(int i, String name) { + arg_names[i] = name; + } + public String getArgumentName(int i) { + return arg_names[i]; + } - public InstructionList getInstructionList() { return il; } - public void setInstructionList(InstructionList il) { this.il = il; } + public InstructionList getInstructionList() { + return il; + } + public void setInstructionList(InstructionList il) { + this.il = il; + } - public String getSignature() { + public String getSignature() { return Type.getMethodSignature(type, arg_types); } @@ -750,7 +871,7 @@ public class MethodGen extends FieldGenOrMethodGen { * Computes max. stack size by performing control flow analysis. */ public void setMaxStack() { - if(il != null) + if (il != null) max_stack = getMaxStack(cp, il, getExceptionHandlers()); else max_stack = 0; @@ -760,25 +881,28 @@ public class MethodGen extends FieldGenOrMethodGen { * Compute maximum number of local variables. */ public void setMaxLocals() { - if(il != null) { - int max = isStatic()? 0 : 1; - - if(arg_types != null) - for(int i=0; i < arg_types.length; i++) - max += arg_types[i].getSize(); - - for(InstructionHandle ih = il.getStart(); ih != null; ih = ih.getNext()) { - Instruction ins = ih.getInstruction(); - - if((ins instanceof LocalVariableInstruction) || - (ins instanceof RET) || (ins instanceof IINC)) - { - int index = ((IndexedInstruction)ins).getIndex() + - ((TypedInstruction)ins).getType(cp).getSize(); - - if(index > max) - max = index; - } + if (il != null) { + int max = isStatic() ? 0 : 1; + + if (arg_types != null) + for (int i = 0; i < arg_types.length; i++) + max += arg_types[i].getSize(); + + for (InstructionHandle ih = il.getStart(); + ih != null; + ih = ih.getNext()) { + Instruction ins = ih.getInstruction(); + + if ((ins instanceof LocalVariableInstruction) + || (ins instanceof RET) + || (ins instanceof IINC)) { + int index = + ((IndexedInstruction)ins).getIndex() + + ((TypedInstruction)ins).getType(cp).getSize(); + + if (index > max) + max = index; + } } max_locals = max; @@ -789,45 +913,49 @@ public class MethodGen extends FieldGenOrMethodGen { /** Do not/Do produce attributes code attributesLineNumberTable and * LocalVariableTable, like javac -O */ - public void stripAttributes(boolean flag) { strip_attributes = flag; } + public void stripAttributes(boolean flag) { + strip_attributes = flag; + } static final class BranchTarget { InstructionHandle target; - int stackDepth; - + int stackDepth; + BranchTarget(InstructionHandle target, int stackDepth) { this.target = target; this.stackDepth = stackDepth; } } - + static final class BranchStack { - Stack branchTargets = new Stack(); + Stack branchTargets = new Stack(); Hashtable visitedTargets = new Hashtable(); public void push(InstructionHandle target, int stackDepth) { - if(visited(target)) - return; + if (visited(target)) + return; branchTargets.push(visit(target, stackDepth)); } - + public BranchTarget pop() { - if(!branchTargets.empty()) { - BranchTarget bt = (BranchTarget) branchTargets.pop(); - return bt; + if (!branchTargets.empty()) { + BranchTarget bt = (BranchTarget)branchTargets.pop(); + return bt; } return null; } - - private final BranchTarget visit(InstructionHandle target, int stackDepth) { + + private final BranchTarget visit( + InstructionHandle target, + int stackDepth) { BranchTarget bt = new BranchTarget(target, stackDepth); visitedTargets.put(target, bt); return bt; } - + private final boolean visited(InstructionHandle target) { return (visitedTargets.get(target) != null); } @@ -838,9 +966,12 @@ public class MethodGen extends FieldGenOrMethodGen { * * @return maximum stack depth used by method */ - public static int getMaxStack(ConstantPoolGen cp, InstructionList il, CodeExceptionGen[] et) { + public static int getMaxStack( + ConstantPoolGen cp, + InstructionList il, + CodeExceptionGen[] et) { BranchStack branchTargets = new BranchStack(); - + /* Initially, populate the branch stack with the exception * handlers, because these aren't (necessarily) branched to * explicitly. in each case, the stack will have depth 1, @@ -849,59 +980,60 @@ public class MethodGen extends FieldGenOrMethodGen { for (int i = 0; i < et.length; i++) { InstructionHandle handler_pc = et[i].getHandlerPC(); if (handler_pc != null) - branchTargets.push(handler_pc, 1); + branchTargets.push(handler_pc, 1); } - - int stackDepth = 0, maxStackDepth = 0; - InstructionHandle ih = il.getStart(); - while(ih != null) { + int stackDepth = 0, maxStackDepth = 0; + InstructionHandle ih = il.getStart(); + + while (ih != null) { Instruction instruction = ih.getInstruction(); short opcode = instruction.getOpcode(); int delta = instruction.produceStack(cp) - instruction.consumeStack(cp); stackDepth += delta; - if(stackDepth > maxStackDepth) - maxStackDepth = stackDepth; + if (stackDepth > maxStackDepth) + maxStackDepth = stackDepth; // choose the next instruction based on whether current is a branch. - if(instruction instanceof BranchInstruction) { - BranchInstruction branch = (BranchInstruction) instruction; - if(instruction instanceof Select) { - // explore all of the select's targets. the default target is handled below. - Select select = (Select) branch; - InstructionHandle[] targets = select.getTargets(); - for (int i = 0; i < targets.length; i++) - branchTargets.push(targets[i], stackDepth); - // nothing to fall through to. - ih = null; - } else if(!(branch instanceof IfInstruction)) { - // if an instruction that comes back to following PC, - // push next instruction, with stack depth reduced by 1. - if(opcode == Constants.JSR || opcode == Constants.JSR_W) - branchTargets.push(ih.getNext(), stackDepth - 1); - ih = null; - } - // for all branches, the target of the branch is pushed on the branch stack. - // conditional branches have a fall through case, selects don't, and - // jsr/jsr_w return to the next instruction. - branchTargets.push(branch.getTarget(), stackDepth); + if (instruction instanceof BranchInstruction) { + BranchInstruction branch = (BranchInstruction)instruction; + if (instruction instanceof Select) { + // explore all of the select's targets. the default target is handled below. + Select select = (Select)branch; + InstructionHandle[] targets = select.getTargets(); + for (int i = 0; i < targets.length; i++) + branchTargets.push(targets[i], stackDepth); + // nothing to fall through to. + ih = null; + } else if (!(branch instanceof IfInstruction)) { + // if an instruction that comes back to following PC, + // push next instruction, with stack depth reduced by 1. + if (opcode == Constants.JSR || opcode == Constants.JSR_W) + branchTargets.push(ih.getNext(), stackDepth - 1); + ih = null; + } + // for all branches, the target of the branch is pushed on the branch stack. + // conditional branches have a fall through case, selects don't, and + // jsr/jsr_w return to the next instruction. + branchTargets.push(branch.getTarget(), stackDepth); } else { - // check for instructions that terminate the method. - if(opcode == Constants.ATHROW || opcode == Constants.RET || - (opcode >= Constants.IRETURN && opcode <= Constants.RETURN)) - ih = null; + // check for instructions that terminate the method. + if (opcode == Constants.ATHROW + || opcode == Constants.RET + || (opcode >= Constants.IRETURN && opcode <= Constants.RETURN)) + ih = null; } // normal case, go to the next instruction. - if(ih != null) - ih = ih.getNext(); + if (ih != null) + ih = ih.getNext(); // if we have no more instructions, see if there are any deferred branches to explore. - if(ih == null) { - BranchTarget bt = branchTargets.pop(); - if (bt != null) { - ih = bt.target; - stackDepth = bt.stackDepth; - } + if (ih == null) { + BranchTarget bt = branchTargets.pop(); + if (bt != null) { + ih = bt.target; + stackDepth = bt.stackDepth; + } } } @@ -913,7 +1045,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** Add observer for this object. */ public void addObserver(MethodObserver o) { - if(observers == null) + if (observers == null) observers = new ArrayList(); observers.add(o); @@ -922,7 +1054,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** Remove observer for this object. */ public void removeObserver(MethodObserver o) { - if(observers != null) + if (observers != null) observers.remove(o); } @@ -931,9 +1063,9 @@ public class MethodGen extends FieldGenOrMethodGen { * called by the user after he has finished editing the object. */ public void update() { - if(observers != null) - for(Iterator e = observers.iterator(); e.hasNext(); ) - ((MethodObserver)e.next()).notify(this); + if (observers != null) + for (Iterator e = observers.iterator(); e.hasNext();) + ((MethodObserver)e.next()).notify(this); } /** @@ -943,33 +1075,73 @@ public class MethodGen extends FieldGenOrMethodGen { * @return String representation of the method. */ public final String toString() { - String access = Utility.accessToString(access_flags); + String access = Utility.accessToString(access_flags); String signature = Type.getMethodSignature(type, arg_types); - signature = Utility.methodSignatureToString(signature, name, access, - true, getLocalVariableTable(cp)); + signature = + Utility.methodSignatureToString( + signature, + name, + access, + true, + getLocalVariableTable(cp)); StringBuffer buf = new StringBuffer(signature); - if(throws_vec.size() > 0) { - for(Iterator e = throws_vec.iterator(); e.hasNext(); ) - buf.append("\n\t\tthrows " + e.next()); + if (throws_vec.size() > 0) { + for (Iterator e = throws_vec.iterator(); e.hasNext();) + buf.append("\n\t\tthrows " + e.next()); } - + return buf.toString(); } /** @return deep copy of this method */ public MethodGen copy(String class_name, ConstantPoolGen cp) { - Method m = ((MethodGen)clone()).getMethod(); + Method m = ((MethodGen)clone()).getMethod(); MethodGen mg = new MethodGen(m, class_name, this.cp); - if(this.cp != cp) { + if (this.cp != cp) { mg.setConstantPool(cp); mg.getInstructionList().replaceConstantPool(this.cp, cp); } return mg; - } + } + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; + } + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator(BCELComparator comparator) { + _cmp = comparator; + } + + /** + * Return value as defined by given BCELComparator strategy. + * By default two MethodGen objects are said to be equal when + * their names and signatures are equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + return _cmp.equals(this, obj); + } + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the method's name XOR signature. + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); + } } -- GitLab From 48de37f3607b8f091b2685965d18a229e49da38a Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 23 May 2003 07:54:07 +0000 Subject: [PATCH 0165/1313] Repository methods throw ClassNotFound instead of returning null Should provide more readable code git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152855 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Repository.java | 114 ++++++++++++------ .../bcel/util/ClassLoaderRepository.java | 67 +++++----- .../apache/bcel/util/SyntheticRepository.java | 69 ++++++----- 3 files changed, 146 insertions(+), 104 deletions(-) diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index 6ab4aadd..926a49fb 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -67,7 +67,7 @@ import java.io.*; * @see org.apache.bcel.util.SyntheticRepository * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class Repository { private static org.apache.bcel.util.Repository _repository = @@ -88,39 +88,45 @@ public abstract class Repository { /** Lookup class somewhere found on your CLASSPATH, or whereever the * repository instance looks for it. * - * @return class object for given fully qualified class name, or null - * if the class could not be found or parsed correctly + * @return class object for given fully qualified class name + * @throws ClassNotFoundException if the class could not be found or + * parsed correctly */ - public static JavaClass lookupClass(String class_name) { - try { - JavaClass clazz = _repository.findClass(class_name); + public static JavaClass lookupClass(String class_name) + throws ClassNotFoundException { - if(clazz == null) { - return _repository.loadClass(class_name); - } else { - return clazz; - } - } catch(ClassNotFoundException ex) { return null; } + return _repository.loadClass(class_name); } /** - * Try to find class source via getResourceAsStream(). + * Try to find class source using the internal repository instance. * @see Class * @return JavaClass object for given runtime class + * @throws ClassNotFoundException if the class could not be found or + * parsed correctly */ - public static JavaClass lookupClass(Class clazz) { - try { - return _repository.loadClass(clazz); - } catch(ClassNotFoundException ex) { return null; } + public static JavaClass lookupClass(Class clazz) + throws ClassNotFoundException { + return _repository.loadClass(clazz); } - /** @return class file object for given Java class. + /** + * @return class file object for given Java class by looking on the + * system class path; returns null if the class file can't be + * found */ - public static ClassPath.ClassFile lookupClassFile(String class_name) { - try { - return ClassPath.SYSTEM_CLASS_PATH.getClassFile(class_name); - } catch(IOException e) { return null; } - } + public static ClassPath.ClassFile lookupClassFile(String class_name) { + try { + ClassPath path = _repository.getClassPath(); + + if(path != null) { + return path.getClassFile(class_name); + } else { + return null; + } + + } catch(IOException e) { return null; } + } /** Clear the repository. */ @@ -156,92 +162,124 @@ public abstract class Repository { /** * @return list of super classes of clazz in ascending order, i.e., * Object is always the last element + * @throws ClassNotFoundException if any of the superclasses can't be found */ - public static JavaClass[] getSuperClasses(JavaClass clazz) { + public static JavaClass[] getSuperClasses(JavaClass clazz) + throws ClassNotFoundException { return clazz.getSuperClasses(); } /** * @return list of super classes of clazz in ascending order, i.e., - * Object is always the last element. return "null", if class - * cannot be found. + * Object is always the last element. + * @throws ClassNotFoundException if the named class or any of its + * superclasses can't be found */ - public static JavaClass[] getSuperClasses(String class_name) { + public static JavaClass[] getSuperClasses(String class_name) + throws ClassNotFoundException { JavaClass jc = lookupClass(class_name); - return (jc == null? null : getSuperClasses(jc)); + return getSuperClasses(jc); } /** * @return all interfaces implemented by class and its super * classes and the interfaces that those interfaces extend, and so on. * (Some people call this a transitive hull). + * @throws ClassNotFoundException if any of the class's + * superclasses or superinterfaces can't be found */ - public static JavaClass[] getInterfaces(JavaClass clazz) { + public static JavaClass[] getInterfaces(JavaClass clazz) + throws ClassNotFoundException { return clazz.getAllInterfaces(); } /** * @return all interfaces implemented by class and its super * classes and the interfaces that extend those interfaces, and so on + * @throws ClassNotFoundException if the named class can't be found, + * or if any of its superclasses or superinterfaces can't be found */ - public static JavaClass[] getInterfaces(String class_name) { + public static JavaClass[] getInterfaces(String class_name) + throws ClassNotFoundException { return getInterfaces(lookupClass(class_name)); } /** * Equivalent to runtime "instanceof" operator. * @return true, if clazz is an instance of super_class + * @throws ClassNotFoundException if any superclasses or superinterfaces + * of clazz can't be found */ - public static boolean instanceOf(JavaClass clazz, JavaClass super_class) { + public static boolean instanceOf(JavaClass clazz, JavaClass super_class) + throws ClassNotFoundException { return clazz.instanceOf(super_class); } /** * @return true, if clazz is an instance of super_class + * @throws ClassNotFoundException if either clazz or super_class + * can't be found */ - public static boolean instanceOf(String clazz, String super_class) { + public static boolean instanceOf(String clazz, String super_class) + throws ClassNotFoundException { return instanceOf(lookupClass(clazz), lookupClass(super_class)); } /** * @return true, if clazz is an instance of super_class + * @throws ClassNotFoundException if super_class can't be found */ - public static boolean instanceOf(JavaClass clazz, String super_class) { + public static boolean instanceOf(JavaClass clazz, String super_class) + throws ClassNotFoundException { return instanceOf(clazz, lookupClass(super_class)); } /** * @return true, if clazz is an instance of super_class + * @throws ClassNotFoundException if clazz can't be found */ - public static boolean instanceOf(String clazz, JavaClass super_class) { + public static boolean instanceOf(String clazz, JavaClass super_class) + throws ClassNotFoundException { return instanceOf(lookupClass(clazz), super_class); } /** * @return true, if clazz is an implementation of interface inter + * @throws ClassNotFoundException if any superclasses or superinterfaces + * of clazz can't be found */ - public static boolean implementationOf(JavaClass clazz, JavaClass inter) { + public static boolean implementationOf(JavaClass clazz, JavaClass inter) + throws ClassNotFoundException { return clazz.implementationOf(inter); } /** * @return true, if clazz is an implementation of interface inter + * @throws ClassNotFoundException if clazz, inter, or any superclasses + * or superinterfaces of clazz can't be found */ - public static boolean implementationOf(String clazz, String inter) { + public static boolean implementationOf(String clazz, String inter) + throws ClassNotFoundException { return implementationOf(lookupClass(clazz), lookupClass(inter)); } /** * @return true, if clazz is an implementation of interface inter + * @throws ClassNotFoundException if inter or any superclasses + * or superinterfaces of clazz can't be found */ - public static boolean implementationOf(JavaClass clazz, String inter) { + public static boolean implementationOf(JavaClass clazz, String inter) + throws ClassNotFoundException { return implementationOf(clazz, lookupClass(inter)); } /** * @return true, if clazz is an implementation of interface inter + * @throws ClassNotFoundException if clazz or any superclasses or + * superinterfaces of clazz can't be found */ - public static boolean implementationOf(String clazz, JavaClass inter) { + public static boolean implementationOf(String clazz, JavaClass inter) + throws ClassNotFoundException { return implementationOf(lookupClass(clazz), inter); } } diff --git a/src/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/java/org/apache/bcel/util/ClassLoaderRepository.java index acc3b54e..36127be5 100644 --- a/src/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -54,12 +54,12 @@ package org.apache.bcel.util; * . */ -import java.io.*; - -import java.util.Map; +import java.io.IOException; +import java.io.InputStream; import java.util.HashMap; -import org.apache.bcel.classfile.*; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.JavaClass; /** * The repository maintains information about which classes have @@ -71,27 +71,23 @@ import org.apache.bcel.classfile.*; * @see org.apache.bcel.Repository * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @author David Dixon-Peugh */ -public class ClassLoaderRepository - implements Repository -{ +public class ClassLoaderRepository implements Repository { private java.lang.ClassLoader loader; - private HashMap loadedClasses = - new HashMap(); // CLASSNAME X JAVACLASS + private HashMap loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS - public ClassLoaderRepository( java.lang.ClassLoader loader ) { + public ClassLoaderRepository(java.lang.ClassLoader loader) { this.loader = loader; } /** * Store a new JavaClass into this Repository. */ - public void storeClass( JavaClass clazz ) { - loadedClasses.put( clazz.getClassName(), - clazz ); - clazz.setRepository( this ); + public void storeClass(JavaClass clazz) { + loadedClasses.put(clazz.getClassName(), clazz); + clazz.setRepository(this); } /** @@ -104,9 +100,9 @@ public class ClassLoaderRepository /** * Find an already defined JavaClass. */ - public JavaClass findClass( String className ) { - if ( loadedClasses.containsKey( className )) { - return (JavaClass) loadedClasses.get( className ); + public JavaClass findClass(String className) { + if (loadedClasses.containsKey(className)) { + return (JavaClass)loadedClasses.get(className); } else { return null; } @@ -115,30 +111,29 @@ public class ClassLoaderRepository /** * Lookup a JavaClass object from the Class Name provided. */ - public JavaClass loadClass( String className ) - throws ClassNotFoundException - { + public JavaClass loadClass(String className) throws ClassNotFoundException { String classFile = className.replace('.', '/'); - JavaClass RC = findClass( className ); - if (RC != null) { return RC; } + JavaClass RC = findClass(className); + if (RC != null) { + return RC; + } try { - InputStream is = - loader.getResourceAsStream( classFile + ".class" ); - - if(is == null) { - throw new ClassNotFoundException(className + " not found."); + InputStream is = loader.getResourceAsStream(classFile + ".class"); + + if (is == null) { + throw new ClassNotFoundException(className + " not found."); } - ClassParser parser = new ClassParser( is, className ); + ClassParser parser = new ClassParser(is, className); RC = parser.parse(); - - storeClass( RC ); + + storeClass(RC); return RC; } catch (IOException e) { - throw new ClassNotFoundException( e.toString() ); + throw new ClassNotFoundException(e.toString()); } } @@ -151,5 +146,11 @@ public class ClassLoaderRepository public void clear() { loadedClasses.clear(); } -} + /* + * @return null + */ + public ClassPath getClassPath() { + return null; + } +} diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/java/org/apache/bcel/util/SyntheticRepository.java index 8ab1f56b..70184c6a 100644 --- a/src/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/java/org/apache/bcel/util/SyntheticRepository.java @@ -54,12 +54,12 @@ package org.apache.bcel.util; * . */ -import java.io.*; - -import java.util.Map; +import java.io.IOException; +import java.io.InputStream; import java.util.HashMap; -import org.apache.bcel.classfile.*; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.JavaClass; /** * This repository is used in situations where a Class is created @@ -79,7 +79,7 @@ import org.apache.bcel.classfile.*; * @see org.apache.bcel.Repository * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @author David Dixon-Peugh */ public class SyntheticRepository implements Repository { @@ -88,7 +88,7 @@ public class SyntheticRepository implements Repository { private static HashMap _instances = new HashMap(); // CLASSPATH X REPOSITORY private ClassPath _path = null; - private HashMap _loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS + private HashMap _loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS private SyntheticRepository(ClassPath path) { _path = path; @@ -101,7 +101,7 @@ public class SyntheticRepository implements Repository { public static SyntheticRepository getInstance(ClassPath classPath) { SyntheticRepository rep = (SyntheticRepository)_instances.get(classPath); - if(rep == null) { + if (rep == null) { rep = new SyntheticRepository(classPath); _instances.put(classPath, rep); } @@ -115,7 +115,7 @@ public class SyntheticRepository implements Repository { public void storeClass(JavaClass clazz) { _loadedClasses.put(clazz.getClassName(), clazz); clazz.setRepository(this); - } + } /** * Remove class from repository @@ -135,10 +135,8 @@ public class SyntheticRepository implements Repository { * Load a JavaClass object for the given class name using * the CLASSPATH environment variable. */ - public JavaClass loadClass(String className) - throws ClassNotFoundException - { - if(className == null || className.equals("")) { + public JavaClass loadClass(String className) throws ClassNotFoundException { + if (className == null || className.equals("")) { throw new IllegalArgumentException("Invalid class name " + className); } @@ -146,9 +144,9 @@ public class SyntheticRepository implements Repository { try { return loadClass(_path.getInputStream(className), className); - } catch(IOException e) { - throw new ClassNotFoundException("Exception while looking for class " + - className + ": " + e.toString()); + } catch (IOException e) { + throw new ClassNotFoundException( + "Exception while looking for class " + className + ": " + e.toString()); } } @@ -159,10 +157,10 @@ public class SyntheticRepository implements Repository { */ public JavaClass loadClass(Class clazz) throws ClassNotFoundException { String className = clazz.getName(); - String name = className; - int i = name.lastIndexOf('.'); + String name = className; + int i = name.lastIndexOf('.'); - if(i > 0) { + if (i > 0) { name = name.substring(i + 1); } @@ -170,30 +168,35 @@ public class SyntheticRepository implements Repository { } private JavaClass loadClass(InputStream is, String className) - throws ClassNotFoundException - { + throws ClassNotFoundException { JavaClass clazz = findClass(className); - if(clazz != null) { + if (clazz != null) { return clazz; } try { - if(is != null) { - ClassParser parser = new ClassParser(is, className); - clazz = parser.parse(); - - storeClass(clazz); - - return clazz; + if (is != null) { + ClassParser parser = new ClassParser(is, className); + clazz = parser.parse(); + + storeClass(clazz); + + return clazz; } - } catch(IOException e) { - throw new ClassNotFoundException("Exception while looking for class " + - className + ": " + e.toString()); + } catch (IOException e) { + throw new ClassNotFoundException( + "Exception while looking for class " + className + ": " + e.toString()); } - throw new ClassNotFoundException("SyntheticRepository could not load " + - className); + throw new ClassNotFoundException( + "SyntheticRepository could not load " + className); + } + + /** ClassPath associated with the Repository. + */ + public ClassPath getClassPath() { + return _path; } /** Clear all entries from cache. -- GitLab From 8fdfb968c883fda52edb700cb9f8b948dd4967e1 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Fri, 23 May 2003 07:55:36 +0000 Subject: [PATCH 0166/1313] Changed contact address git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152856 13f79535-47bb-0310-9956-ffa450edef68 --- examples/HelloWorldBuilder.java | 2 +- examples/JasminVisitor.java | 2 +- examples/Mini/ASTFactor.java | 2 +- examples/Mini/ASTFunAppl.java | 2 +- examples/Mini/ASTFunDecl.java | 2 +- examples/Mini/ASTIdent.java | 2 +- examples/Mini/ASTIfExpr.java | 2 +- examples/Mini/ASTInteger.java | 2 +- examples/Mini/ASTLetExpr.java | 2 +- examples/Mini/ASTProgram.java | 2 +- examples/Mini/ASTTerm.java | 2 +- examples/Mini/EnvEntry.java | 2 +- examples/Mini/Environment.java | 2 +- examples/Mini/Function.java | 2 +- examples/Mini/README | 2 +- examples/Mini/SimpleNode.java | 2 +- examples/Mini/Variable.java | 2 +- examples/Peephole.java | 2 +- examples/ProxyCreator.java | 2 +- examples/TransitiveHull.java | 18 ++- examples/helloify.java | 2 +- examples/id.java | 2 +- examples/listclass.java | 2 +- examples/maxstack.java | 2 +- examples/patchclass.java | 2 +- src/java/org/apache/bcel/Constants.java | 2 +- .../apache/bcel/classfile/AccessFlags.java | 2 +- .../org/apache/bcel/classfile/Attribute.java | 2 +- .../bcel/classfile/AttributeReader.java | 2 +- .../bcel/classfile/ClassFormatException.java | 2 +- .../apache/bcel/classfile/ClassParser.java | 2 +- src/java/org/apache/bcel/classfile/Code.java | 2 +- .../apache/bcel/classfile/CodeException.java | 2 +- .../org/apache/bcel/classfile/ConstantCP.java | 2 +- .../apache/bcel/classfile/ConstantClass.java | 2 +- .../apache/bcel/classfile/ConstantDouble.java | 2 +- .../bcel/classfile/ConstantFieldref.java | 2 +- .../apache/bcel/classfile/ConstantFloat.java | 2 +- .../bcel/classfile/ConstantInteger.java | 2 +- .../classfile/ConstantInterfaceMethodref.java | 2 +- .../apache/bcel/classfile/ConstantLong.java | 2 +- .../bcel/classfile/ConstantMethodref.java | 2 +- .../bcel/classfile/ConstantNameAndType.java | 2 +- .../apache/bcel/classfile/ConstantObject.java | 2 +- .../apache/bcel/classfile/ConstantPool.java | 2 +- .../apache/bcel/classfile/ConstantString.java | 2 +- .../apache/bcel/classfile/ConstantUtf8.java | 2 +- .../apache/bcel/classfile/ConstantValue.java | 2 +- .../org/apache/bcel/classfile/Deprecated.java | 2 +- .../bcel/classfile/DescendingVisitor.java | 2 +- .../apache/bcel/classfile/EmptyVisitor.java | 2 - .../apache/bcel/classfile/ExceptionTable.java | 2 +- .../apache/bcel/classfile/FieldOrMethod.java | 125 +++++++++++------- .../org/apache/bcel/classfile/InnerClass.java | 2 +- .../apache/bcel/classfile/InnerClasses.java | 2 +- .../org/apache/bcel/classfile/LineNumber.java | 8 +- .../bcel/classfile/LineNumberTable.java | 2 +- .../apache/bcel/classfile/LocalVariable.java | 2 +- .../bcel/classfile/LocalVariableTable.java | 2 +- src/java/org/apache/bcel/classfile/Node.java | 2 +- .../org/apache/bcel/classfile/PMGClass.java | 2 +- .../org/apache/bcel/classfile/Signature.java | 4 +- .../org/apache/bcel/classfile/SourceFile.java | 2 +- .../org/apache/bcel/classfile/StackMap.java | 2 +- .../apache/bcel/classfile/StackMapEntry.java | 7 +- .../apache/bcel/classfile/StackMapType.java | 2 +- .../org/apache/bcel/classfile/Synthetic.java | 2 +- .../org/apache/bcel/classfile/Unknown.java | 2 +- .../org/apache/bcel/classfile/Utility.java | 2 +- .../org/apache/bcel/classfile/Visitor.java | 2 +- src/java/org/apache/bcel/generic/AALOAD.java | 2 +- src/java/org/apache/bcel/generic/AASTORE.java | 2 +- .../org/apache/bcel/generic/ACONST_NULL.java | 2 +- src/java/org/apache/bcel/generic/ALOAD.java | 2 +- .../org/apache/bcel/generic/ANEWARRAY.java | 2 +- src/java/org/apache/bcel/generic/ARETURN.java | 2 +- .../org/apache/bcel/generic/ARRAYLENGTH.java | 2 +- src/java/org/apache/bcel/generic/ASTORE.java | 2 +- src/java/org/apache/bcel/generic/ATHROW.java | 2 +- .../bcel/generic/AllocationInstruction.java | 2 +- .../bcel/generic/ArithmeticInstruction.java | 2 +- .../apache/bcel/generic/ArrayInstruction.java | 2 +- .../org/apache/bcel/generic/ArrayType.java | 2 +- src/java/org/apache/bcel/generic/BALOAD.java | 2 +- src/java/org/apache/bcel/generic/BASTORE.java | 2 +- src/java/org/apache/bcel/generic/BIPUSH.java | 2 +- .../org/apache/bcel/generic/BREAKPOINT.java | 2 +- .../org/apache/bcel/generic/BasicType.java | 2 +- .../org/apache/bcel/generic/BranchHandle.java | 2 +- .../bcel/generic/BranchInstruction.java | 2 +- src/java/org/apache/bcel/generic/CALOAD.java | 2 +- src/java/org/apache/bcel/generic/CASTORE.java | 2 +- .../org/apache/bcel/generic/CHECKCAST.java | 2 +- .../apache/bcel/generic/CPInstruction.java | 11 +- .../bcel/generic/ClassGenException.java | 2 +- .../apache/bcel/generic/ClassObserver.java | 2 +- .../apache/bcel/generic/CodeExceptionGen.java | 5 +- .../bcel/generic/CompoundInstruction.java | 2 +- .../apache/bcel/generic/ConstantPoolGen.java | 2 +- .../bcel/generic/ConstantPushInstruction.java | 2 +- .../bcel/generic/ConversionInstruction.java | 2 +- src/java/org/apache/bcel/generic/D2F.java | 2 +- src/java/org/apache/bcel/generic/D2I.java | 2 +- src/java/org/apache/bcel/generic/D2L.java | 2 +- src/java/org/apache/bcel/generic/DADD.java | 2 +- src/java/org/apache/bcel/generic/DALOAD.java | 2 +- src/java/org/apache/bcel/generic/DASTORE.java | 2 +- src/java/org/apache/bcel/generic/DCMPG.java | 2 +- src/java/org/apache/bcel/generic/DCMPL.java | 2 +- src/java/org/apache/bcel/generic/DCONST.java | 2 +- src/java/org/apache/bcel/generic/DDIV.java | 2 +- src/java/org/apache/bcel/generic/DLOAD.java | 2 +- src/java/org/apache/bcel/generic/DMUL.java | 2 +- src/java/org/apache/bcel/generic/DNEG.java | 2 +- src/java/org/apache/bcel/generic/DREM.java | 2 +- src/java/org/apache/bcel/generic/DRETURN.java | 2 +- src/java/org/apache/bcel/generic/DSTORE.java | 2 +- src/java/org/apache/bcel/generic/DSUB.java | 2 +- src/java/org/apache/bcel/generic/DUP.java | 2 +- src/java/org/apache/bcel/generic/DUP2.java | 2 +- src/java/org/apache/bcel/generic/DUP2_X1.java | 2 +- src/java/org/apache/bcel/generic/DUP2_X2.java | 2 +- src/java/org/apache/bcel/generic/DUP_X1.java | 2 +- src/java/org/apache/bcel/generic/DUP_X2.java | 2 +- .../org/apache/bcel/generic/EmptyVisitor.java | 2 +- src/java/org/apache/bcel/generic/F2D.java | 2 +- src/java/org/apache/bcel/generic/F2I.java | 2 +- src/java/org/apache/bcel/generic/F2L.java | 2 +- src/java/org/apache/bcel/generic/FADD.java | 2 +- src/java/org/apache/bcel/generic/FALOAD.java | 2 +- src/java/org/apache/bcel/generic/FASTORE.java | 2 +- src/java/org/apache/bcel/generic/FCMPG.java | 2 +- src/java/org/apache/bcel/generic/FCMPL.java | 2 +- src/java/org/apache/bcel/generic/FCONST.java | 2 +- src/java/org/apache/bcel/generic/FDIV.java | 2 +- src/java/org/apache/bcel/generic/FLOAD.java | 2 +- src/java/org/apache/bcel/generic/FMUL.java | 2 +- src/java/org/apache/bcel/generic/FNEG.java | 2 +- src/java/org/apache/bcel/generic/FREM.java | 2 +- src/java/org/apache/bcel/generic/FRETURN.java | 2 +- src/java/org/apache/bcel/generic/FSTORE.java | 2 +- src/java/org/apache/bcel/generic/FSUB.java | 2 +- .../bcel/generic/FieldGenOrMethodGen.java | 2 +- .../apache/bcel/generic/FieldInstruction.java | 6 +- .../apache/bcel/generic/FieldObserver.java | 2 +- .../apache/bcel/generic/FieldOrMethod.java | 2 +- .../org/apache/bcel/generic/GETFIELD.java | 2 +- .../org/apache/bcel/generic/GETSTATIC.java | 2 +- src/java/org/apache/bcel/generic/GOTO.java | 2 +- src/java/org/apache/bcel/generic/GOTO_W.java | 2 +- .../apache/bcel/generic/GotoInstruction.java | 2 +- src/java/org/apache/bcel/generic/I2B.java | 2 +- src/java/org/apache/bcel/generic/I2C.java | 2 +- src/java/org/apache/bcel/generic/I2D.java | 2 +- src/java/org/apache/bcel/generic/I2F.java | 2 +- src/java/org/apache/bcel/generic/I2L.java | 2 +- src/java/org/apache/bcel/generic/I2S.java | 2 +- src/java/org/apache/bcel/generic/IADD.java | 2 +- src/java/org/apache/bcel/generic/IALOAD.java | 2 +- src/java/org/apache/bcel/generic/IAND.java | 2 +- src/java/org/apache/bcel/generic/IASTORE.java | 2 +- src/java/org/apache/bcel/generic/ICONST.java | 2 +- src/java/org/apache/bcel/generic/IDIV.java | 2 +- src/java/org/apache/bcel/generic/IFEQ.java | 2 +- src/java/org/apache/bcel/generic/IFGE.java | 2 +- src/java/org/apache/bcel/generic/IFGT.java | 2 +- src/java/org/apache/bcel/generic/IFLE.java | 2 +- src/java/org/apache/bcel/generic/IFLT.java | 2 +- src/java/org/apache/bcel/generic/IFNE.java | 2 +- .../org/apache/bcel/generic/IFNONNULL.java | 2 +- src/java/org/apache/bcel/generic/IFNULL.java | 2 +- .../org/apache/bcel/generic/IF_ACMPEQ.java | 2 +- .../org/apache/bcel/generic/IF_ACMPNE.java | 2 +- .../org/apache/bcel/generic/IF_ICMPEQ.java | 2 +- .../org/apache/bcel/generic/IF_ICMPGE.java | 2 +- .../org/apache/bcel/generic/IF_ICMPGT.java | 2 +- .../org/apache/bcel/generic/IF_ICMPLE.java | 2 +- .../org/apache/bcel/generic/IF_ICMPLT.java | 2 +- .../org/apache/bcel/generic/IF_ICMPNE.java | 2 +- src/java/org/apache/bcel/generic/IINC.java | 2 +- src/java/org/apache/bcel/generic/ILOAD.java | 2 +- src/java/org/apache/bcel/generic/IMPDEP1.java | 2 +- src/java/org/apache/bcel/generic/IMPDEP2.java | 2 +- src/java/org/apache/bcel/generic/IMUL.java | 2 +- src/java/org/apache/bcel/generic/INEG.java | 2 +- .../org/apache/bcel/generic/INSTANCEOF.java | 2 +- .../apache/bcel/generic/INVOKEINTERFACE.java | 2 +- .../apache/bcel/generic/INVOKESPECIAL.java | 2 +- .../org/apache/bcel/generic/INVOKESTATIC.java | 2 +- .../apache/bcel/generic/INVOKEVIRTUAL.java | 2 +- src/java/org/apache/bcel/generic/IOR.java | 2 +- src/java/org/apache/bcel/generic/IREM.java | 2 +- src/java/org/apache/bcel/generic/IRETURN.java | 2 +- src/java/org/apache/bcel/generic/ISHL.java | 2 +- src/java/org/apache/bcel/generic/ISHR.java | 2 +- src/java/org/apache/bcel/generic/ISTORE.java | 2 +- src/java/org/apache/bcel/generic/ISUB.java | 2 +- src/java/org/apache/bcel/generic/IUSHR.java | 2 +- src/java/org/apache/bcel/generic/IXOR.java | 2 +- .../apache/bcel/generic/IfInstruction.java | 2 +- .../bcel/generic/IndexedInstruction.java | 2 +- .../org/apache/bcel/generic/Instruction.java | 8 +- .../bcel/generic/InstructionComparator.java | 2 +- .../bcel/generic/InstructionConstants.java | 2 +- .../bcel/generic/InstructionFactory.java | 2 +- .../bcel/generic/InstructionHandle.java | 2 +- .../apache/bcel/generic/InstructionList.java | 2 +- .../bcel/generic/InstructionListObserver.java | 2 +- .../bcel/generic/InstructionTargeter.java | 2 +- .../bcel/generic/InvokeInstruction.java | 2 +- src/java/org/apache/bcel/generic/JSR.java | 2 +- src/java/org/apache/bcel/generic/JSR_W.java | 2 +- .../apache/bcel/generic/JsrInstruction.java | 2 +- src/java/org/apache/bcel/generic/L2D.java | 2 +- src/java/org/apache/bcel/generic/L2F.java | 2 +- src/java/org/apache/bcel/generic/L2I.java | 2 +- src/java/org/apache/bcel/generic/LADD.java | 2 +- src/java/org/apache/bcel/generic/LALOAD.java | 2 +- src/java/org/apache/bcel/generic/LAND.java | 2 +- src/java/org/apache/bcel/generic/LASTORE.java | 2 +- src/java/org/apache/bcel/generic/LCMP.java | 2 +- src/java/org/apache/bcel/generic/LCONST.java | 2 +- src/java/org/apache/bcel/generic/LDC.java | 2 +- src/java/org/apache/bcel/generic/LDC2_W.java | 2 +- src/java/org/apache/bcel/generic/LDC_W.java | 2 +- src/java/org/apache/bcel/generic/LDIV.java | 2 +- src/java/org/apache/bcel/generic/LLOAD.java | 2 +- src/java/org/apache/bcel/generic/LMUL.java | 2 +- src/java/org/apache/bcel/generic/LNEG.java | 2 +- .../org/apache/bcel/generic/LOOKUPSWITCH.java | 2 +- src/java/org/apache/bcel/generic/LOR.java | 2 +- src/java/org/apache/bcel/generic/LREM.java | 2 +- src/java/org/apache/bcel/generic/LRETURN.java | 2 +- src/java/org/apache/bcel/generic/LSHL.java | 2 +- src/java/org/apache/bcel/generic/LSHR.java | 2 +- src/java/org/apache/bcel/generic/LSTORE.java | 2 +- src/java/org/apache/bcel/generic/LSUB.java | 2 +- src/java/org/apache/bcel/generic/LUSHR.java | 2 +- src/java/org/apache/bcel/generic/LXOR.java | 2 +- .../apache/bcel/generic/LineNumberGen.java | 5 +- .../org/apache/bcel/generic/LoadClass.java | 2 +- .../apache/bcel/generic/LoadInstruction.java | 2 +- .../apache/bcel/generic/LocalVariableGen.java | 2 +- .../generic/LocalVariableInstruction.java | 9 +- .../org/apache/bcel/generic/MONITORENTER.java | 2 +- .../org/apache/bcel/generic/MONITOREXIT.java | 2 +- .../apache/bcel/generic/MULTIANEWARRAY.java | 2 +- .../apache/bcel/generic/MethodObserver.java | 2 +- src/java/org/apache/bcel/generic/NEW.java | 3 +- .../org/apache/bcel/generic/NEWARRAY.java | 2 +- src/java/org/apache/bcel/generic/NOP.java | 2 +- .../apache/bcel/generic/NamedAndTyped.java | 2 +- .../org/apache/bcel/generic/ObjectType.java | 35 +++-- src/java/org/apache/bcel/generic/POP.java | 2 +- src/java/org/apache/bcel/generic/POP2.java | 2 +- src/java/org/apache/bcel/generic/PUSH.java | 3 +- .../org/apache/bcel/generic/PUTFIELD.java | 2 +- .../org/apache/bcel/generic/PUTSTATIC.java | 2 +- .../apache/bcel/generic/PopInstruction.java | 2 +- .../apache/bcel/generic/PushInstruction.java | 2 +- src/java/org/apache/bcel/generic/RET.java | 2 +- src/java/org/apache/bcel/generic/RETURN.java | 2 +- .../apache/bcel/generic/ReferenceType.java | 26 +++- .../bcel/generic/ReturnInstruction.java | 2 +- src/java/org/apache/bcel/generic/SALOAD.java | 2 +- src/java/org/apache/bcel/generic/SASTORE.java | 2 +- src/java/org/apache/bcel/generic/SIPUSH.java | 2 +- src/java/org/apache/bcel/generic/SWAP.java | 2 +- src/java/org/apache/bcel/generic/SWITCH.java | 2 +- src/java/org/apache/bcel/generic/Select.java | 2 +- .../apache/bcel/generic/StackConsumer.java | 2 +- .../apache/bcel/generic/StackInstruction.java | 2 +- .../apache/bcel/generic/StackProducer.java | 2 +- .../apache/bcel/generic/StoreInstruction.java | 2 +- .../org/apache/bcel/generic/TABLESWITCH.java | 2 +- .../bcel/generic/TargetLostException.java | 2 +- src/java/org/apache/bcel/generic/Type.java | 2 +- .../apache/bcel/generic/TypedInstruction.java | 2 +- .../bcel/generic/UnconditionalBranch.java | 2 +- .../generic/VariableLengthInstruction.java | 2 +- src/java/org/apache/bcel/generic/Visitor.java | 2 +- .../org/apache/bcel/util/AttributeHTML.java | 2 +- .../org/apache/bcel/util/BCELFactory.java | 2 +- src/java/org/apache/bcel/util/BCELifier.java | 2 +- .../org/apache/bcel/util/ByteSequence.java | 2 +- src/java/org/apache/bcel/util/Class2HTML.java | 16 ++- .../org/apache/bcel/util/ClassLoader.java | 2 +- src/java/org/apache/bcel/util/ClassPath.java | 2 +- src/java/org/apache/bcel/util/ClassQueue.java | 2 +- src/java/org/apache/bcel/util/ClassSet.java | 2 +- src/java/org/apache/bcel/util/ClassStack.java | 2 +- .../org/apache/bcel/util/ClassVector.java | 2 +- src/java/org/apache/bcel/util/CodeHTML.java | 2 +- .../org/apache/bcel/util/ConstantHTML.java | 2 +- .../apache/bcel/util/InstructionFinder.java | 2 +- .../org/apache/bcel/util/JavaWrapper.java | 2 +- src/java/org/apache/bcel/util/MethodHTML.java | 2 +- src/java/org/apache/bcel/util/Repository.java | 7 +- .../bcel/verifier/GraphicalVerifier.java | 8 +- .../apache/bcel/verifier/TransitiveHull.java | 29 ++-- .../org/apache/bcel/verifier/Verifier.java | 23 ++-- .../bcel/verifier/VerifierAppFrame.java | 58 ++++++-- .../apache/bcel/verifier/VerifierFactory.java | 2 - .../verifier/VerifierFactoryListModel.java | 3 +- .../apache/bcel/verifier/VerifyDialog.java | 14 +- .../bcel/verifier/statics/Pass1Verifier.java | 9 +- .../bcel/verifier/statics/Pass2Verifier.java | 43 ++++++ .../bcel/verifier/statics/Pass3aVerifier.java | 50 +++++++ .../structurals/ControlFlowGraph.java | 20 ++- .../structurals/ExecutionVisitor.java | 12 +- .../bcel/verifier/structurals/Frame.java | 3 - .../structurals/InstConstraintVisitor.java | 54 +++++++- .../structurals/InstructionContext.java | 4 +- .../verifier/structurals/LocalVariables.java | 5 + .../verifier/structurals/OperandStack.java | 5 + .../verifier/structurals/Pass3bVerifier.java | 39 ++++-- xdocs/manual.xml | 2 +- 317 files changed, 771 insertions(+), 470 deletions(-) diff --git a/examples/HelloWorldBuilder.java b/examples/HelloWorldBuilder.java index 195f1ec2..59741e01 100644 --- a/examples/HelloWorldBuilder.java +++ b/examples/HelloWorldBuilder.java @@ -25,7 +25,7 @@ import org.apache.bcel.Constants; * * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class HelloWorldBuilder { public static void main(String[] argv) { diff --git a/examples/JasminVisitor.java b/examples/JasminVisitor.java index 91f80103..de223683 100644 --- a/examples/JasminVisitor.java +++ b/examples/JasminVisitor.java @@ -10,7 +10,7 @@ import org.apache.bcel.Repository; * JASMIN format. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { private JavaClass clazz; diff --git a/examples/Mini/ASTFactor.java b/examples/Mini/ASTFactor.java index 41c2bdcd..cc14daf7 100644 --- a/examples/Mini/ASTFactor.java +++ b/examples/Mini/ASTFactor.java @@ -6,7 +6,7 @@ package Mini; /** * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ASTFactor extends ASTExpr { // Generated methods diff --git a/examples/Mini/ASTFunAppl.java b/examples/Mini/ASTFunAppl.java index 87c9a955..468ef074 100644 --- a/examples/Mini/ASTFunAppl.java +++ b/examples/Mini/ASTFunAppl.java @@ -8,7 +8,7 @@ import org.apache.bcel.generic.*; /** * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, org.apache.bcel.Constants { diff --git a/examples/Mini/ASTFunDecl.java b/examples/Mini/ASTFunDecl.java index a008f74f..16678e49 100644 --- a/examples/Mini/ASTFunDecl.java +++ b/examples/Mini/ASTFunDecl.java @@ -11,7 +11,7 @@ import org.apache.bcel.util.InstructionFinder; /** * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ASTFunDecl extends SimpleNode implements MiniParserTreeConstants, org.apache.bcel.Constants { diff --git a/examples/Mini/ASTIdent.java b/examples/Mini/ASTIdent.java index 3d223e9a..5ac58feb 100644 --- a/examples/Mini/ASTIdent.java +++ b/examples/Mini/ASTIdent.java @@ -8,7 +8,7 @@ import org.apache.bcel.generic.*; /** * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { private String name; diff --git a/examples/Mini/ASTIfExpr.java b/examples/Mini/ASTIfExpr.java index d554dcf0..0b45ae9f 100644 --- a/examples/Mini/ASTIfExpr.java +++ b/examples/Mini/ASTIfExpr.java @@ -8,7 +8,7 @@ import org.apache.bcel.generic.*; /** * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { private ASTExpr if_expr, then_expr, else_expr; diff --git a/examples/Mini/ASTInteger.java b/examples/Mini/ASTInteger.java index ee025ada..120f3c92 100644 --- a/examples/Mini/ASTInteger.java +++ b/examples/Mini/ASTInteger.java @@ -8,7 +8,7 @@ import org.apache.bcel.generic.*; /** * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ASTInteger extends ASTExpr { private int value; diff --git a/examples/Mini/ASTLetExpr.java b/examples/Mini/ASTLetExpr.java index f1d90c27..51586df7 100644 --- a/examples/Mini/ASTLetExpr.java +++ b/examples/Mini/ASTLetExpr.java @@ -8,7 +8,7 @@ import org.apache.bcel.generic.*; /** * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { private ASTIdent[] idents; diff --git a/examples/Mini/ASTProgram.java b/examples/Mini/ASTProgram.java index 7a2c3e7a..feae3962 100644 --- a/examples/Mini/ASTProgram.java +++ b/examples/Mini/ASTProgram.java @@ -11,7 +11,7 @@ import org.apache.bcel.generic.*; * Root node of everything, direct children are nodes of type FunDecl * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ASTProgram extends SimpleNode implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constants { diff --git a/examples/Mini/ASTTerm.java b/examples/Mini/ASTTerm.java index eed7c9bf..7d467f15 100644 --- a/examples/Mini/ASTTerm.java +++ b/examples/Mini/ASTTerm.java @@ -6,7 +6,7 @@ package Mini; /** * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ASTTerm extends ASTExpr { // Generated methods diff --git a/examples/Mini/EnvEntry.java b/examples/Mini/EnvEntry.java index bc82cea9..6a2c39cf 100644 --- a/examples/Mini/EnvEntry.java +++ b/examples/Mini/EnvEntry.java @@ -4,7 +4,7 @@ package Mini; * Entry in environment. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface EnvEntry { public String getHashKey(); diff --git a/examples/Mini/Environment.java b/examples/Mini/Environment.java index 9c30e025..816aa45a 100644 --- a/examples/Mini/Environment.java +++ b/examples/Mini/Environment.java @@ -13,7 +13,7 @@ import java.util.Vector; * the maximum number of storable items is `SLOTS' * `SIZE'. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class Environment implements Cloneable { private static final int SIZE = 127; // Prime number large enough for most cases diff --git a/examples/Mini/Function.java b/examples/Mini/Function.java index 1ccc0d3e..06a12cb3 100644 --- a/examples/Mini/Function.java +++ b/examples/Mini/Function.java @@ -5,7 +5,7 @@ package Mini; * in the ASTIdent fields. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class Function implements org.apache.bcel.Constants, EnvEntry { private ASTIdent name; // Reference to the original declaration diff --git a/examples/Mini/README b/examples/Mini/README index 8d0ebe7c..52f92456 100644 --- a/examples/Mini/README +++ b/examples/Mini/README @@ -51,4 +51,4 @@ to examine the generated class. For example Send bug reports and suggestions to - markus.dahm@berlin.de (Markus Dahm) + m.dahm@gmx.de (Markus Dahm) diff --git a/examples/Mini/SimpleNode.java b/examples/Mini/SimpleNode.java index f74779ea..a3d4b458 100644 --- a/examples/Mini/SimpleNode.java +++ b/examples/Mini/SimpleNode.java @@ -6,7 +6,7 @@ package Mini; /** * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class SimpleNode implements Node { protected Node parent; diff --git a/examples/Mini/Variable.java b/examples/Mini/Variable.java index 11aa7c2b..c5b58f42 100644 --- a/examples/Mini/Variable.java +++ b/examples/Mini/Variable.java @@ -6,7 +6,7 @@ import org.apache.bcel.generic.*; * Represents a variable declared in a LET expression or a FUN declaration. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class Variable implements EnvEntry { private ASTIdent name; // Reference to the original declaration diff --git a/examples/Peephole.java b/examples/Peephole.java index 17d93874..fe860e12 100644 --- a/examples/Peephole.java +++ b/examples/Peephole.java @@ -10,7 +10,7 @@ import org.apache.bcel.util.InstructionFinder; * Remove NOPs from given class * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class Peephole { public static void main(String[] argv) { diff --git a/examples/ProxyCreator.java b/examples/ProxyCreator.java index 75b49711..96822750 100644 --- a/examples/ProxyCreator.java +++ b/examples/ProxyCreator.java @@ -20,7 +20,7 @@ import java.util.zip.*; * java.lang.reflect.Proxy, but much more flexible. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see org.apache.bcel.util.JavaWrapper * @see org.apache.bcel.util.ClassLoader * @see Utility diff --git a/examples/TransitiveHull.java b/examples/TransitiveHull.java index 6d638386..a94aacb2 100644 --- a/examples/TransitiveHull.java +++ b/examples/TransitiveHull.java @@ -21,9 +21,15 @@ import org.apache.regexp.*; * with BCEL to use this class. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { + private static class LookupFailure extends RuntimeException { + public LookupFailure(String msg) { + super(msg); + } + } + private JavaClass _class; private ClassQueue _queue; private ClassSet _set; @@ -86,10 +92,14 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { return; } - JavaClass clazz = Repository.lookupClass(class_name); + try { + JavaClass clazz = Repository.lookupClass(class_name); - if(clazz != null && _set.add(clazz)) { - _queue.enqueue(clazz); + if(_set.add(clazz)) { + _queue.enqueue(clazz); + } + } catch (ClassNotFoundException e) { + throw new LookupFailure("Missing class: " + e.toString()); } } diff --git a/examples/helloify.java b/examples/helloify.java index 3dab45e2..c7cc460b 100644 --- a/examples/helloify.java +++ b/examples/helloify.java @@ -7,7 +7,7 @@ import org.apache.bcel.Constants; * "hello" and their name and signature before doing anything else. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class helloify implements Constants { private static String class_name; diff --git a/examples/id.java b/examples/id.java index 13b83d9d..e4d1c13b 100644 --- a/examples/id.java +++ b/examples/id.java @@ -17,7 +17,7 @@ import org.apache.bcel.generic.*; *
            *
            * @version $Id$
          - * @author  M. Dahm
          + * @author M. Dahm
            */
           public class id {
             public static void main(String[] argv) throws Exception { 
          diff --git a/examples/listclass.java b/examples/listclass.java
          index 049c755f..d24af3bb 100644
          --- a/examples/listclass.java
          +++ b/examples/listclass.java
          @@ -46,7 +46,7 @@ import org.apache.bcel.*;
            * 

          * * @version $Id$ - * @author M. Dahm, + * @author M. Dahm, * Thomas Wheeler */ public class listclass { diff --git a/examples/maxstack.java b/examples/maxstack.java index 4f62b517..a4550b5a 100644 --- a/examples/maxstack.java +++ b/examples/maxstack.java @@ -8,7 +8,7 @@ import org.apache.bcel.*; * maximum stack depth used by analyzing control flow. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class maxstack { public static void main(String[] argv) { diff --git a/examples/patchclass.java b/examples/patchclass.java index ba0a278a..edc39003 100644 --- a/examples/patchclass.java +++ b/examples/patchclass.java @@ -8,7 +8,7 @@ import org.apache.bcel.classfile.*; * Usage: patch files * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class patchclass { public static void main(String[] argv) { diff --git a/src/java/org/apache/bcel/Constants.java b/src/java/org/apache/bcel/Constants.java index 89e1431b..d65e5d55 100644 --- a/src/java/org/apache/bcel/Constants.java +++ b/src/java/org/apache/bcel/Constants.java @@ -58,7 +58,7 @@ package org.apache.bcel; * Constants for the project, mostly defined in the JVM specification. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface Constants { /** Major and minor version of the code. diff --git a/src/java/org/apache/bcel/classfile/AccessFlags.java b/src/java/org/apache/bcel/classfile/AccessFlags.java index 121ad5b9..2d64d58b 100644 --- a/src/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/java/org/apache/bcel/classfile/AccessFlags.java @@ -61,7 +61,7 @@ import org.apache.bcel.Constants; * I.e. classes, fields, and methods. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class AccessFlags implements java.io.Serializable { protected int access_flags; diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index 857c7e50..2a3570e8 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -67,7 +67,7 @@ import java.util.HashMap; * Unknown attribute stands for non-standard-attributes. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see ConstantValue * @see SourceFile * @see Code diff --git a/src/java/org/apache/bcel/classfile/AttributeReader.java b/src/java/org/apache/bcel/classfile/AttributeReader.java index c031345c..2d5da435 100644 --- a/src/java/org/apache/bcel/classfile/AttributeReader.java +++ b/src/java/org/apache/bcel/classfile/AttributeReader.java @@ -61,7 +61,7 @@ package org.apache.bcel.classfile; * @see Attribute * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface AttributeReader { /** diff --git a/src/java/org/apache/bcel/classfile/ClassFormatException.java b/src/java/org/apache/bcel/classfile/ClassFormatException.java index c29a586a..7abe0640 100644 --- a/src/java/org/apache/bcel/classfile/ClassFormatException.java +++ b/src/java/org/apache/bcel/classfile/ClassFormatException.java @@ -60,7 +60,7 @@ package org.apache.bcel.classfile; * class file. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ClassFormatException extends RuntimeException { public ClassFormatException() { super(); } diff --git a/src/java/org/apache/bcel/classfile/ClassParser.java b/src/java/org/apache/bcel/classfile/ClassParser.java index 0e0eaf3a..fdd489a7 100644 --- a/src/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/java/org/apache/bcel/classfile/ClassParser.java @@ -71,7 +71,7 @@ import java.util.zip.*; * further details about the structure of a bytecode file. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class ClassParser { private DataInputStream file; diff --git a/src/java/org/apache/bcel/classfile/Code.java b/src/java/org/apache/bcel/classfile/Code.java index ed354d86..695418cd 100644 --- a/src/java/org/apache/bcel/classfile/Code.java +++ b/src/java/org/apache/bcel/classfile/Code.java @@ -70,7 +70,7 @@ import java.io.*; * contains information about the local variables. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Attribute * @see CodeException * @see LineNumberTable diff --git a/src/java/org/apache/bcel/classfile/CodeException.java b/src/java/org/apache/bcel/classfile/CodeException.java index 6875ed9d..c5356d0b 100644 --- a/src/java/org/apache/bcel/classfile/CodeException.java +++ b/src/java/org/apache/bcel/classfile/CodeException.java @@ -63,7 +63,7 @@ import java.io.*; * particular exception handler is active. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Code */ public final class CodeException diff --git a/src/java/org/apache/bcel/classfile/ConstantCP.java b/src/java/org/apache/bcel/classfile/ConstantCP.java index a4bf9f29..5ab4e808 100644 --- a/src/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/java/org/apache/bcel/classfile/ConstantCP.java @@ -60,7 +60,7 @@ import org.apache.bcel.Constants; * Abstract super class for Fieldref and Methodref constants. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see ConstantFieldref * @see ConstantMethodref * @see ConstantInterfaceMethodref diff --git a/src/java/org/apache/bcel/classfile/ConstantClass.java b/src/java/org/apache/bcel/classfile/ConstantClass.java index 30f82f82..bb812f1b 100644 --- a/src/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/java/org/apache/bcel/classfile/ConstantClass.java @@ -63,7 +63,7 @@ import java.io.*; * and represents a reference to a (external) class. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Constant */ public final class ConstantClass extends Constant implements ConstantObject { diff --git a/src/java/org/apache/bcel/classfile/ConstantDouble.java b/src/java/org/apache/bcel/classfile/ConstantDouble.java index ddf43db5..92099324 100644 --- a/src/java/org/apache/bcel/classfile/ConstantDouble.java +++ b/src/java/org/apache/bcel/classfile/ConstantDouble.java @@ -63,7 +63,7 @@ import java.io.*; * and represents a reference to a Double object. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Constant */ public final class ConstantDouble extends Constant implements ConstantObject { diff --git a/src/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/java/org/apache/bcel/classfile/ConstantFieldref.java index f3dc77a6..ed47f07b 100644 --- a/src/java/org/apache/bcel/classfile/ConstantFieldref.java +++ b/src/java/org/apache/bcel/classfile/ConstantFieldref.java @@ -61,7 +61,7 @@ import java.io.*; * This class represents a constant pool reference to a field. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class ConstantFieldref extends ConstantCP { /** diff --git a/src/java/org/apache/bcel/classfile/ConstantFloat.java b/src/java/org/apache/bcel/classfile/ConstantFloat.java index a1fd1f42..a04e53f5 100644 --- a/src/java/org/apache/bcel/classfile/ConstantFloat.java +++ b/src/java/org/apache/bcel/classfile/ConstantFloat.java @@ -63,7 +63,7 @@ import java.io.*; * and represents a reference to a float object. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Constant */ public final class ConstantFloat extends Constant implements ConstantObject { diff --git a/src/java/org/apache/bcel/classfile/ConstantInteger.java b/src/java/org/apache/bcel/classfile/ConstantInteger.java index 6b4e6e5c..05c82413 100644 --- a/src/java/org/apache/bcel/classfile/ConstantInteger.java +++ b/src/java/org/apache/bcel/classfile/ConstantInteger.java @@ -65,7 +65,7 @@ import java.io.*; * and represents a reference to an int object. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Constant */ public final class ConstantInteger extends Constant implements ConstantObject { diff --git a/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java index a1d1fdfe..92fb441e 100644 --- a/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java +++ b/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java @@ -61,7 +61,7 @@ import java.io.*; * This class represents a constant pool reference to an interface method. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class ConstantInterfaceMethodref extends ConstantCP { /** diff --git a/src/java/org/apache/bcel/classfile/ConstantLong.java b/src/java/org/apache/bcel/classfile/ConstantLong.java index 556c9e4d..759bef2e 100644 --- a/src/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/java/org/apache/bcel/classfile/ConstantLong.java @@ -63,7 +63,7 @@ import java.io.*; * and represents a reference to a long object. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Constant */ public final class ConstantLong extends Constant implements ConstantObject { diff --git a/src/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/java/org/apache/bcel/classfile/ConstantMethodref.java index 6b8c69d6..c190ba47 100644 --- a/src/java/org/apache/bcel/classfile/ConstantMethodref.java +++ b/src/java/org/apache/bcel/classfile/ConstantMethodref.java @@ -61,7 +61,7 @@ import java.io.*; * This class represents a constant pool reference to a method. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class ConstantMethodref extends ConstantCP { /** diff --git a/src/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/java/org/apache/bcel/classfile/ConstantNameAndType.java index 50dbfad3..a30269d2 100644 --- a/src/java/org/apache/bcel/classfile/ConstantNameAndType.java +++ b/src/java/org/apache/bcel/classfile/ConstantNameAndType.java @@ -64,7 +64,7 @@ import java.io.*; * of a field or method. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Constant */ public final class ConstantNameAndType extends Constant { diff --git a/src/java/org/apache/bcel/classfile/ConstantObject.java b/src/java/org/apache/bcel/classfile/ConstantObject.java index ff41502c..432984e2 100644 --- a/src/java/org/apache/bcel/classfile/ConstantObject.java +++ b/src/java/org/apache/bcel/classfile/ConstantObject.java @@ -59,7 +59,7 @@ package org.apache.bcel.classfile; * such as ConstantLong, ConstantString, etc.. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Constant */ public interface ConstantObject { diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/java/org/apache/bcel/classfile/ConstantPool.java index 524b775a..06bf9fff 100644 --- a/src/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/java/org/apache/bcel/classfile/ConstantPool.java @@ -68,7 +68,7 @@ import java.io.*; * @version $Id$ * @see Constant * @see org.apache.bcel.generic.ConstantPoolGen - * @author M. Dahm + * @author M. Dahm */ public class ConstantPool implements Cloneable, Node, Serializable { private int constant_pool_count; diff --git a/src/java/org/apache/bcel/classfile/ConstantString.java b/src/java/org/apache/bcel/classfile/ConstantString.java index e32b25ab..c87564cd 100644 --- a/src/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/java/org/apache/bcel/classfile/ConstantString.java @@ -63,7 +63,7 @@ import java.io.*; * and represents a reference to a String object. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Constant */ public final class ConstantString extends Constant implements ConstantObject { diff --git a/src/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/java/org/apache/bcel/classfile/ConstantUtf8.java index f02c5b9f..3f8063fc 100644 --- a/src/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -63,7 +63,7 @@ import java.io.*; * and represents a reference to a Utf8 encoded string. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Constant */ public final class ConstantUtf8 extends Constant { diff --git a/src/java/org/apache/bcel/classfile/ConstantValue.java b/src/java/org/apache/bcel/classfile/ConstantValue.java index 061e9727..c42f2ee9 100644 --- a/src/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/java/org/apache/bcel/classfile/ConstantValue.java @@ -63,7 +63,7 @@ import java.io.*; * This class is instantiated by the Attribute.readAttribute() method. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Attribute */ public final class ConstantValue extends Attribute { diff --git a/src/java/org/apache/bcel/classfile/Deprecated.java b/src/java/org/apache/bcel/classfile/Deprecated.java index 456f53e3..36ecfeef 100644 --- a/src/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/java/org/apache/bcel/classfile/Deprecated.java @@ -63,7 +63,7 @@ import java.io.*; * It is instantiated from the Attribute.readAttribute() method. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Attribute */ public final class Deprecated extends Attribute { diff --git a/src/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/java/org/apache/bcel/classfile/DescendingVisitor.java index 3f3f1031..19797f77 100644 --- a/src/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -62,7 +62,7 @@ import java.util.Stack; * of it. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DescendingVisitor implements Visitor { private JavaClass clazz; diff --git a/src/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/java/org/apache/bcel/classfile/EmptyVisitor.java index 5a4a9910..1e916cdc 100644 --- a/src/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -54,8 +54,6 @@ package org.apache.bcel.classfile; * . */ -import org.apache.bcel.classfile.*; -import org.apache.bcel.*; /** * Visitor with empty method bodies, can be extended and used in conjunction with the diff --git a/src/java/org/apache/bcel/classfile/ExceptionTable.java b/src/java/org/apache/bcel/classfile/ExceptionTable.java index a2ee795f..6718bb7d 100644 --- a/src/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/java/org/apache/bcel/classfile/ExceptionTable.java @@ -66,7 +66,7 @@ import java.io.*; * with the other classes). * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Code */ public final class ExceptionTable extends Attribute { diff --git a/src/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/java/org/apache/bcel/classfile/FieldOrMethod.java index 1850f1f7..01360329 100644 --- a/src/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -53,31 +53,38 @@ package org.apache.bcel.classfile; * information on the Apache Software Foundation, please see * . */ -import org.apache.bcel.Constants; +import org.apache.bcel.Constants; import java.io.*; /** * Abstract super class for fields and methods. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ -public abstract class FieldOrMethod extends AccessFlags implements Cloneable, Node { - protected int name_index; // Points to field name in constant pool - protected int signature_index; // Points to encoded signature - protected int attributes_count;// No. of attributes - protected Attribute[] attributes; // Collection of attributes +public abstract class FieldOrMethod extends AccessFlags + implements Cloneable, Node +{ + protected int name_index; // Points to field name in constant pool + protected int signature_index; // Points to encoded signature + protected int attributes_count; // No. of attributes + protected Attribute[] attributes; // Collection of attributes protected ConstantPool constant_pool; - FieldOrMethod() {} - + FieldOrMethod() { + } + /** * Initialize from another object. Note that both objects use the same * references (shallow copy). Use clone() for a physical copy. */ protected FieldOrMethod(FieldOrMethod c) { - this(c.getAccessFlags(), c.getNameIndex(), c.getSignatureIndex(), - c.getAttributes(), c.getConstantPool()); + this( + c.getAccessFlags(), + c.getNameIndex(), + c.getSignatureIndex(), + c.getAttributes(), + c.getConstantPool()); } /** @@ -87,14 +94,17 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * @throws ClassFormatException */ protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatException - { - this(file.readUnsignedShort(), file.readUnsignedShort(), - file.readUnsignedShort(), null, constant_pool); + throws IOException, ClassFormatException { + this( + file.readUnsignedShort(), + file.readUnsignedShort(), + file.readUnsignedShort(), + null, + constant_pool); attributes_count = file.readUnsignedShort(); - attributes = new Attribute[attributes_count]; - for(int i=0; i < attributes_count; i++) + attributes = new Attribute[attributes_count]; + for (int i = 0; i < attributes_count; i++) attributes[i] = Attribute.readAttribute(file, constant_pool); } @@ -105,13 +115,16 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * @param attributes Collection of attributes * @param constant_pool Array of constants */ - protected FieldOrMethod(int access_flags, int name_index, int signature_index, - Attribute[] attributes, ConstantPool constant_pool) - { - this.access_flags = access_flags; - this.name_index = name_index; + protected FieldOrMethod( + int access_flags, + int name_index, + int signature_index, + Attribute[] attributes, + ConstantPool constant_pool) { + this.access_flags = access_flags; + this.name_index = name_index; this.signature_index = signature_index; - this.constant_pool = constant_pool; + this.constant_pool = constant_pool; setAttributes(attributes); } @@ -121,47 +134,52 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * * @param file Output file stream * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { + */ + public final void dump(DataOutputStream file) throws IOException { file.writeShort(access_flags); file.writeShort(name_index); file.writeShort(signature_index); file.writeShort(attributes_count); - for(int i=0; i < attributes_count; i++) + for (int i = 0; i < attributes_count; i++) attributes[i].dump(file); } /** * @return Collection of object attributes. - */ - public final Attribute[] getAttributes() { return attributes; } + */ + public final Attribute[] getAttributes() { + return attributes; + } /** * @param attributes Collection of object attributes. */ public final void setAttributes(Attribute[] attributes) { - this.attributes = attributes; - attributes_count = (attributes == null)? 0 : attributes.length; + this.attributes = attributes; + attributes_count = (attributes == null) ? 0 : attributes.length; } /** * @return Constant pool used by this object. - */ - public final ConstantPool getConstantPool() { return constant_pool; } + */ + public final ConstantPool getConstantPool() { + return constant_pool; + } /** * @param constant_pool Constant pool to be used for this object. - */ + */ public final void setConstantPool(ConstantPool constant_pool) { this.constant_pool = constant_pool; } /** * @return Index in constant pool of object's name. - */ - public final int getNameIndex() { return name_index; } + */ + public final int getNameIndex() { + return name_index; + } /** * @param name_index Index in constant pool of object's name. @@ -172,8 +190,10 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No /** * @return Index in constant pool of field signature. - */ - public final int getSignatureIndex() { return signature_index; } + */ + public final int getSignatureIndex() { + return signature_index; + } /** * @param signature_index Index in constant pool of field signature. @@ -184,21 +204,25 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No /** * @return Name of object, i.e., method name or field name - */ + */ public final String getName() { - ConstantUtf8 c; - c = (ConstantUtf8)constant_pool.getConstant(name_index, - Constants.CONSTANT_Utf8); + ConstantUtf8 c; + c = + (ConstantUtf8)constant_pool.getConstant( + name_index, + Constants.CONSTANT_Utf8); return c.getBytes(); } /** * @return String representation of object's type signature (java style) - */ + */ public final String getSignature() { - ConstantUtf8 c; - c = (ConstantUtf8)constant_pool.getConstant(signature_index, - Constants.CONSTANT_Utf8); + ConstantUtf8 c; + c = + (ConstantUtf8)constant_pool.getConstant( + signature_index, + Constants.CONSTANT_Utf8); return c.getBytes(); } @@ -210,12 +234,13 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No try { c = (FieldOrMethod)clone(); - } catch(CloneNotSupportedException e) {} + } catch (CloneNotSupportedException e) { + } - c.constant_pool = constant_pool; - c.attributes = new Attribute[attributes_count]; + c.constant_pool = constant_pool; + c.attributes = new Attribute[attributes_count]; - for(int i=0; i < attributes_count; i++) + for (int i = 0; i < attributes_count; i++) c.attributes[i] = attributes[i].copy(constant_pool); return c; diff --git a/src/java/org/apache/bcel/classfile/InnerClass.java b/src/java/org/apache/bcel/classfile/InnerClass.java index 21642728..598a9d62 100644 --- a/src/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/java/org/apache/bcel/classfile/InnerClass.java @@ -63,7 +63,7 @@ import java.io.*; * of the inner class. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see InnerClasses */ public final class InnerClass implements Cloneable, Node { diff --git a/src/java/org/apache/bcel/classfile/InnerClasses.java b/src/java/org/apache/bcel/classfile/InnerClasses.java index 30cbf0dc..54ceed58 100644 --- a/src/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/java/org/apache/bcel/classfile/InnerClasses.java @@ -64,7 +64,7 @@ import java.io.*; * It is instantiated from the Attribute.readAttribute() method. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Attribute */ public final class InnerClasses extends Attribute { diff --git a/src/java/org/apache/bcel/classfile/LineNumber.java b/src/java/org/apache/bcel/classfile/LineNumber.java index 646cbf84..dee9b8ed 100644 --- a/src/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/java/org/apache/bcel/classfile/LineNumber.java @@ -54,8 +54,10 @@ package org.apache.bcel.classfile; * . */ -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.Serializable; /** * This class represents a (PC offset, line number) pair, i.e., a line number in @@ -63,7 +65,7 @@ import java.io.*; * is used for debugging purposes. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see LineNumberTable */ public final class LineNumber implements Cloneable, Node, Serializable { diff --git a/src/java/org/apache/bcel/classfile/LineNumberTable.java b/src/java/org/apache/bcel/classfile/LineNumberTable.java index 127c416d..9fd3a120 100644 --- a/src/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/java/org/apache/bcel/classfile/LineNumberTable.java @@ -63,7 +63,7 @@ import java.io.*; * contains pairs of PCs and line numbers. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Code * @see LineNumber */ diff --git a/src/java/org/apache/bcel/classfile/LocalVariable.java b/src/java/org/apache/bcel/classfile/LocalVariable.java index e94006e7..7d0a45cf 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariable.java @@ -62,7 +62,7 @@ import java.io.*; * scope, name, signature and index on the method's frame. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see LocalVariableTable */ public final class LocalVariable diff --git a/src/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/java/org/apache/bcel/classfile/LocalVariableTable.java index a440b838..888fbcc4 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -62,7 +62,7 @@ import java.io.*; * method. This attribute is contained in the Code attribute. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Code * @see LocalVariable */ diff --git a/src/java/org/apache/bcel/classfile/Node.java b/src/java/org/apache/bcel/classfile/Node.java index 28b8c6ff..61f6421d 100644 --- a/src/java/org/apache/bcel/classfile/Node.java +++ b/src/java/org/apache/bcel/classfile/Node.java @@ -58,7 +58,7 @@ package org.apache.bcel.classfile; * Denote class to have an accept method(); * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface Node { public void accept(Visitor obj); diff --git a/src/java/org/apache/bcel/classfile/PMGClass.java b/src/java/org/apache/bcel/classfile/PMGClass.java index 24aef906..d05d2b65 100644 --- a/src/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/java/org/apache/bcel/classfile/PMGClass.java @@ -63,7 +63,7 @@ import java.io.*; * attribute. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Attribute */ public final class PMGClass extends Attribute { diff --git a/src/java/org/apache/bcel/classfile/Signature.java b/src/java/org/apache/bcel/classfile/Signature.java index b6269f79..64b95c9c 100644 --- a/src/java/org/apache/bcel/classfile/Signature.java +++ b/src/java/org/apache/bcel/classfile/Signature.java @@ -62,7 +62,7 @@ import java.io.*; * to a GJ attribute. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Attribute */ public final class Signature extends Attribute { @@ -111,7 +111,7 @@ public final class Signature extends Attribute { * @param v Visitor object */ public void accept(Visitor v) { - System.err.println("Visiting non-standard Signature object"); + //System.err.println("Visiting non-standard Signature object"); v.visitSignature(this); } diff --git a/src/java/org/apache/bcel/classfile/SourceFile.java b/src/java/org/apache/bcel/classfile/SourceFile.java index cdb69547..51320e5d 100644 --- a/src/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/java/org/apache/bcel/classfile/SourceFile.java @@ -64,7 +64,7 @@ import java.io.*; * instantiated from the Attribute.readAttribute() method. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Attribute */ public final class SourceFile extends Attribute { diff --git a/src/java/org/apache/bcel/classfile/StackMap.java b/src/java/org/apache/bcel/classfile/StackMap.java index 064755e6..e9b73032 100644 --- a/src/java/org/apache/bcel/classfile/StackMap.java +++ b/src/java/org/apache/bcel/classfile/StackMap.java @@ -67,7 +67,7 @@ import java.io.*; * §5.3.1.2 * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Code * @see StackMapEntry * @see StackMapType diff --git a/src/java/org/apache/bcel/classfile/StackMapEntry.java b/src/java/org/apache/bcel/classfile/StackMapEntry.java index 0ee9a3e2..b1cfcef0 100644 --- a/src/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/java/org/apache/bcel/classfile/StackMapEntry.java @@ -54,8 +54,9 @@ package org.apache.bcel.classfile; * . */ -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; /** * This class represents a stack map entry recording the types of @@ -63,7 +64,7 @@ import java.io.*; * See CLDC specification §5.3.1.2 * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see StackMap * @see StackMapType */ diff --git a/src/java/org/apache/bcel/classfile/StackMapType.java b/src/java/org/apache/bcel/classfile/StackMapType.java index a212984f..ea2a42f8 100644 --- a/src/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/java/org/apache/bcel/classfile/StackMapType.java @@ -62,7 +62,7 @@ import java.io.*; * used in the StackMap entries. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see StackMapEntry * @see StackMap * @see Constants diff --git a/src/java/org/apache/bcel/classfile/Synthetic.java b/src/java/org/apache/bcel/classfile/Synthetic.java index 96523002..2026d434 100644 --- a/src/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/java/org/apache/bcel/classfile/Synthetic.java @@ -67,7 +67,7 @@ import java.io.*; * Attribute.readAttribute() method. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Attribute */ public final class Synthetic extends Attribute { diff --git a/src/java/org/apache/bcel/classfile/Unknown.java b/src/java/org/apache/bcel/classfile/Unknown.java index 60ac7049..8acf5804 100644 --- a/src/java/org/apache/bcel/classfile/Unknown.java +++ b/src/java/org/apache/bcel/classfile/Unknown.java @@ -72,7 +72,7 @@ import java.util.*; * @version $Id$ * @see org.apache.bcel.classfile.Attribute * @see org.apache.bcel.classfile.AttributeReader - * @author M. Dahm + * @author M. Dahm */ public final class Unknown extends Attribute { private byte[] bytes; diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 132903ac..411ab6e0 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -64,7 +64,7 @@ import java.util.zip.*; * Utility functions that do not really belong to any class in particular. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class Utility { private static int consumed_chars; /* How many chars have been consumed diff --git a/src/java/org/apache/bcel/classfile/Visitor.java b/src/java/org/apache/bcel/classfile/Visitor.java index 97a2d4f2..ee4b6dd2 100644 --- a/src/java/org/apache/bcel/classfile/Visitor.java +++ b/src/java/org/apache/bcel/classfile/Visitor.java @@ -63,7 +63,7 @@ package org.apache.bcel.classfile; * Boris Bokowski. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface Visitor { public void visitCode(Code obj); diff --git a/src/java/org/apache/bcel/generic/AALOAD.java b/src/java/org/apache/bcel/generic/AALOAD.java index 628dbb73..f2b0c3d7 100644 --- a/src/java/org/apache/bcel/generic/AALOAD.java +++ b/src/java/org/apache/bcel/generic/AALOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index -> value
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class AALOAD extends ArrayInstruction implements StackProducer { /** Load reference from array diff --git a/src/java/org/apache/bcel/generic/AASTORE.java b/src/java/org/apache/bcel/generic/AASTORE.java index c78e9bb6..12c18e85 100644 --- a/src/java/org/apache/bcel/generic/AASTORE.java +++ b/src/java/org/apache/bcel/generic/AASTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index, value -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class AASTORE extends ArrayInstruction implements StackConsumer { /** Store into reference array diff --git a/src/java/org/apache/bcel/generic/ACONST_NULL.java b/src/java/org/apache/bcel/generic/ACONST_NULL.java index c379a7f5..addbdbd9 100644 --- a/src/java/org/apache/bcel/generic/ACONST_NULL.java +++ b/src/java/org/apache/bcel/generic/ACONST_NULL.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ... -> ..., null
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ACONST_NULL extends Instruction implements PushInstruction, TypedInstruction { diff --git a/src/java/org/apache/bcel/generic/ALOAD.java b/src/java/org/apache/bcel/generic/ALOAD.java index 3ed5b466..a5d9109e 100644 --- a/src/java/org/apache/bcel/generic/ALOAD.java +++ b/src/java/org/apache/bcel/generic/ALOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ... -> ..., objectref
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ALOAD extends LoadInstruction { /** diff --git a/src/java/org/apache/bcel/generic/ANEWARRAY.java b/src/java/org/apache/bcel/generic/ANEWARRAY.java index 8248befe..31357e3c 100644 --- a/src/java/org/apache/bcel/generic/ANEWARRAY.java +++ b/src/java/org/apache/bcel/generic/ANEWARRAY.java @@ -60,7 +60,7 @@ import org.apache.bcel.ExceptionConstants; *
          Stack: ..., count -> ..., arrayref
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower, StackProducer { diff --git a/src/java/org/apache/bcel/generic/ARETURN.java b/src/java/org/apache/bcel/generic/ARETURN.java index 577a15f4..99d35c69 100644 --- a/src/java/org/apache/bcel/generic/ARETURN.java +++ b/src/java/org/apache/bcel/generic/ARETURN.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., objectref -> <empty>
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ARETURN extends ReturnInstruction { /** diff --git a/src/java/org/apache/bcel/generic/ARRAYLENGTH.java b/src/java/org/apache/bcel/generic/ARRAYLENGTH.java index 8bab6cb0..10883fad 100644 --- a/src/java/org/apache/bcel/generic/ARRAYLENGTH.java +++ b/src/java/org/apache/bcel/generic/ARRAYLENGTH.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref -> ..., length
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackProducer { diff --git a/src/java/org/apache/bcel/generic/ASTORE.java b/src/java/org/apache/bcel/generic/ASTORE.java index b123a571..eaee1455 100644 --- a/src/java/org/apache/bcel/generic/ASTORE.java +++ b/src/java/org/apache/bcel/generic/ASTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack ..., objectref -> ... 
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ASTORE extends StoreInstruction { /** diff --git a/src/java/org/apache/bcel/generic/ATHROW.java b/src/java/org/apache/bcel/generic/ATHROW.java index 89a8025d..f89ae484 100644 --- a/src/java/org/apache/bcel/generic/ATHROW.java +++ b/src/java/org/apache/bcel/generic/ATHROW.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., objectref -> objectref
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ATHROW extends Instruction implements UnconditionalBranch, ExceptionThrower { /** diff --git a/src/java/org/apache/bcel/generic/AllocationInstruction.java b/src/java/org/apache/bcel/generic/AllocationInstruction.java index b2922d4a..81cb667b 100644 --- a/src/java/org/apache/bcel/generic/AllocationInstruction.java +++ b/src/java/org/apache/bcel/generic/AllocationInstruction.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * Denote family of instructions that allocates space in the heap. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface AllocationInstruction {} diff --git a/src/java/org/apache/bcel/generic/ArithmeticInstruction.java b/src/java/org/apache/bcel/generic/ArithmeticInstruction.java index aa185924..6bf05b17 100644 --- a/src/java/org/apache/bcel/generic/ArithmeticInstruction.java +++ b/src/java/org/apache/bcel/generic/ArithmeticInstruction.java @@ -58,7 +58,7 @@ import org.apache.bcel.Constants; * Super class for the family of arithmetic instructions. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class ArithmeticInstruction extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/java/org/apache/bcel/generic/ArrayInstruction.java b/src/java/org/apache/bcel/generic/ArrayInstruction.java index b8586bd4..390c1bfd 100644 --- a/src/java/org/apache/bcel/generic/ArrayInstruction.java +++ b/src/java/org/apache/bcel/generic/ArrayInstruction.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * Super class for instructions dealing with array access such as IALOAD. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class ArrayInstruction extends Instruction implements ExceptionThrower, TypedInstruction { diff --git a/src/java/org/apache/bcel/generic/ArrayType.java b/src/java/org/apache/bcel/generic/ArrayType.java index 738a5990..a0033a4b 100644 --- a/src/java/org/apache/bcel/generic/ArrayType.java +++ b/src/java/org/apache/bcel/generic/ArrayType.java @@ -59,7 +59,7 @@ import org.apache.bcel.Constants; * Denotes array type, such as int[][] * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class ArrayType extends ReferenceType { private int dimensions; diff --git a/src/java/org/apache/bcel/generic/BALOAD.java b/src/java/org/apache/bcel/generic/BALOAD.java index ff309eb0..13b5ce1b 100644 --- a/src/java/org/apache/bcel/generic/BALOAD.java +++ b/src/java/org/apache/bcel/generic/BALOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index -> ..., value
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class BALOAD extends ArrayInstruction implements StackProducer { /** Load byte or boolean from array diff --git a/src/java/org/apache/bcel/generic/BASTORE.java b/src/java/org/apache/bcel/generic/BASTORE.java index ce5a1028..1100b53e 100644 --- a/src/java/org/apache/bcel/generic/BASTORE.java +++ b/src/java/org/apache/bcel/generic/BASTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index, value -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class BASTORE extends ArrayInstruction implements StackConsumer { /** Store byte or boolean into array diff --git a/src/java/org/apache/bcel/generic/BIPUSH.java b/src/java/org/apache/bcel/generic/BIPUSH.java index a3fd78de..5b9c3bf3 100644 --- a/src/java/org/apache/bcel/generic/BIPUSH.java +++ b/src/java/org/apache/bcel/generic/BIPUSH.java @@ -63,7 +63,7 @@ import org.apache.bcel.util.ByteSequence; *
          Stack: ... -> ..., value
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class BIPUSH extends Instruction implements ConstantPushInstruction { private byte b; diff --git a/src/java/org/apache/bcel/generic/BREAKPOINT.java b/src/java/org/apache/bcel/generic/BREAKPOINT.java index a0cecdad..30dca855 100644 --- a/src/java/org/apache/bcel/generic/BREAKPOINT.java +++ b/src/java/org/apache/bcel/generic/BREAKPOINT.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * BREAKPOINT, JVM dependent, ignored by default * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class BREAKPOINT extends Instruction { public BREAKPOINT() { diff --git a/src/java/org/apache/bcel/generic/BasicType.java b/src/java/org/apache/bcel/generic/BasicType.java index 00785e95..99a0dab0 100644 --- a/src/java/org/apache/bcel/generic/BasicType.java +++ b/src/java/org/apache/bcel/generic/BasicType.java @@ -59,7 +59,7 @@ import org.apache.bcel.Constants; * Denotes basic type such as int. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class BasicType extends Type { /** diff --git a/src/java/org/apache/bcel/generic/BranchHandle.java b/src/java/org/apache/bcel/generic/BranchHandle.java index 9ba154db..13e37613 100644 --- a/src/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/java/org/apache/bcel/generic/BranchHandle.java @@ -64,7 +64,7 @@ package org.apache.bcel.generic; * @see Instruction * @see InstructionList * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class BranchHandle extends InstructionHandle { private BranchInstruction bi; // An alias in fact, but saves lots of casts diff --git a/src/java/org/apache/bcel/generic/BranchInstruction.java b/src/java/org/apache/bcel/generic/BranchInstruction.java index 099eef20..09a0ed4a 100644 --- a/src/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/java/org/apache/bcel/generic/BranchInstruction.java @@ -64,7 +64,7 @@ import org.apache.bcel.util.ByteSequence; * * @see InstructionList * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class BranchInstruction extends Instruction implements InstructionTargeter { protected int index; // Branch target relative to this instruction diff --git a/src/java/org/apache/bcel/generic/CALOAD.java b/src/java/org/apache/bcel/generic/CALOAD.java index bf4f0c9f..009bad1c 100644 --- a/src/java/org/apache/bcel/generic/CALOAD.java +++ b/src/java/org/apache/bcel/generic/CALOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index -> ..., value
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class CALOAD extends ArrayInstruction implements StackProducer { /** Load char from array diff --git a/src/java/org/apache/bcel/generic/CASTORE.java b/src/java/org/apache/bcel/generic/CASTORE.java index 864a60b5..86681912 100644 --- a/src/java/org/apache/bcel/generic/CASTORE.java +++ b/src/java/org/apache/bcel/generic/CASTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index, value -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class CASTORE extends ArrayInstruction implements StackConsumer { /** Store char into array diff --git a/src/java/org/apache/bcel/generic/CHECKCAST.java b/src/java/org/apache/bcel/generic/CHECKCAST.java index 7bd66206..3d8df7ab 100644 --- a/src/java/org/apache/bcel/generic/CHECKCAST.java +++ b/src/java/org/apache/bcel/generic/CHECKCAST.java @@ -59,7 +59,7 @@ import org.apache.bcel.ExceptionConstants; *
          Stack: ..., objectref -> ..., objectref
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThrower, StackProducer, StackConsumer { diff --git a/src/java/org/apache/bcel/generic/CPInstruction.java b/src/java/org/apache/bcel/generic/CPInstruction.java index d6eb0d1f..860e3da4 100644 --- a/src/java/org/apache/bcel/generic/CPInstruction.java +++ b/src/java/org/apache/bcel/generic/CPInstruction.java @@ -54,10 +54,13 @@ package org.apache.bcel.generic; * . */ -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.util.ByteSequence; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.*; /** * Abstract super class for instructions that use an index into the @@ -68,7 +71,7 @@ import org.apache.bcel.classfile.*; * @see INVOKEVIRTUAL * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class CPInstruction extends Instruction implements TypedInstruction, IndexedInstruction diff --git a/src/java/org/apache/bcel/generic/ClassGenException.java b/src/java/org/apache/bcel/generic/ClassGenException.java index 56d21c28..b30c0ec1 100644 --- a/src/java/org/apache/bcel/generic/ClassGenException.java +++ b/src/java/org/apache/bcel/generic/ClassGenException.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * in the throws clause every time. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ClassGenException extends RuntimeException { public ClassGenException() { super(); } diff --git a/src/java/org/apache/bcel/generic/ClassObserver.java b/src/java/org/apache/bcel/generic/ClassObserver.java index ee37ceda..a47908b7 100644 --- a/src/java/org/apache/bcel/generic/ClassObserver.java +++ b/src/java/org/apache/bcel/generic/ClassObserver.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * and register yourself with addObserver(). * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface ClassObserver { public void notify(ClassGen clazz); diff --git a/src/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/java/org/apache/bcel/generic/CodeExceptionGen.java index d39aa7b3..0a5fcbc3 100644 --- a/src/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -54,8 +54,7 @@ package org.apache.bcel.generic; * . */ -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.*; +import org.apache.bcel.classfile.CodeException; /** * This class represents an exception handler, i.e., specifies the region where @@ -67,7 +66,7 @@ import org.apache.bcel.classfile.*; * getCodeException(), i.e., there is no difference semantically. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see MethodGen * @see CodeException * @see InstructionHandle diff --git a/src/java/org/apache/bcel/generic/CompoundInstruction.java b/src/java/org/apache/bcel/generic/CompoundInstruction.java index 5198dc43..dfea44de 100644 --- a/src/java/org/apache/bcel/generic/CompoundInstruction.java +++ b/src/java/org/apache/bcel/generic/CompoundInstruction.java @@ -66,7 +66,7 @@ package org.apache.bcel.generic; * `templates' or `macros' for such reuseable code patterns. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see PUSH * @see SWITCH */ diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/java/org/apache/bcel/generic/ConstantPoolGen.java index 92b846cb..552d8441 100644 --- a/src/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -69,7 +69,7 @@ import java.util.HashMap; * JVM and that Double and Long constants need two slots. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Constant */ public class ConstantPoolGen implements java.io.Serializable { diff --git a/src/java/org/apache/bcel/generic/ConstantPushInstruction.java b/src/java/org/apache/bcel/generic/ConstantPushInstruction.java index 95886618..4d54b616 100644 --- a/src/java/org/apache/bcel/generic/ConstantPushInstruction.java +++ b/src/java/org/apache/bcel/generic/ConstantPushInstruction.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * such as SIPUSH, BIPUSH, ICONST, etc. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see ICONST * @see SIPUSH diff --git a/src/java/org/apache/bcel/generic/ConversionInstruction.java b/src/java/org/apache/bcel/generic/ConversionInstruction.java index 8aba47a0..bd8c42a5 100644 --- a/src/java/org/apache/bcel/generic/ConversionInstruction.java +++ b/src/java/org/apache/bcel/generic/ConversionInstruction.java @@ -58,7 +58,7 @@ import org.apache.bcel.Constants; * Super class for the x2y family of instructions. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class ConversionInstruction extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/java/org/apache/bcel/generic/D2F.java b/src/java/org/apache/bcel/generic/D2F.java index 63c5714c..e706bfe8 100644 --- a/src/java/org/apache/bcel/generic/D2F.java +++ b/src/java/org/apache/bcel/generic/D2F.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value.word1, value.word2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class D2F extends ConversionInstruction { /** Convert double to float diff --git a/src/java/org/apache/bcel/generic/D2I.java b/src/java/org/apache/bcel/generic/D2I.java index cf8e29b6..d157c320 100644 --- a/src/java/org/apache/bcel/generic/D2I.java +++ b/src/java/org/apache/bcel/generic/D2I.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value.word1, value.word2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class D2I extends ConversionInstruction { /** Convert double to int diff --git a/src/java/org/apache/bcel/generic/D2L.java b/src/java/org/apache/bcel/generic/D2L.java index 1de3431f..553bb81a 100644 --- a/src/java/org/apache/bcel/generic/D2L.java +++ b/src/java/org/apache/bcel/generic/D2L.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class D2L extends ConversionInstruction { /** Convert double to long diff --git a/src/java/org/apache/bcel/generic/DADD.java b/src/java/org/apache/bcel/generic/DADD.java index 6caefba5..626c6ae9 100644 --- a/src/java/org/apache/bcel/generic/DADD.java +++ b/src/java/org/apache/bcel/generic/DADD.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result.word1, result1.word2 * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DADD extends ArithmeticInstruction { /** Add doubles diff --git a/src/java/org/apache/bcel/generic/DALOAD.java b/src/java/org/apache/bcel/generic/DALOAD.java index 21605003..c09ebe3c 100644 --- a/src/java/org/apache/bcel/generic/DALOAD.java +++ b/src/java/org/apache/bcel/generic/DALOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DALOAD extends ArrayInstruction implements StackProducer { /** Load double from array diff --git a/src/java/org/apache/bcel/generic/DASTORE.java b/src/java/org/apache/bcel/generic/DASTORE.java index afba81cf..c9a2ccc3 100644 --- a/src/java/org/apache/bcel/generic/DASTORE.java +++ b/src/java/org/apache/bcel/generic/DASTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index, value.word1, value.word2 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DASTORE extends ArrayInstruction implements StackConsumer { /** Store double into array diff --git a/src/java/org/apache/bcel/generic/DCMPG.java b/src/java/org/apache/bcel/generic/DCMPG.java index ac4bbc2b..3f44ec30 100644 --- a/src/java/org/apache/bcel/generic/DCMPG.java +++ b/src/java/org/apache/bcel/generic/DCMPG.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DCMPG extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/java/org/apache/bcel/generic/DCMPL.java b/src/java/org/apache/bcel/generic/DCMPL.java index c64a8e27..48e191b8 100644 --- a/src/java/org/apache/bcel/generic/DCMPL.java +++ b/src/java/org/apache/bcel/generic/DCMPL.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DCMPL extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/java/org/apache/bcel/generic/DCONST.java b/src/java/org/apache/bcel/generic/DCONST.java index 6051072a..3ef84b2d 100644 --- a/src/java/org/apache/bcel/generic/DCONST.java +++ b/src/java/org/apache/bcel/generic/DCONST.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ... -> ..., 
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DCONST extends Instruction implements ConstantPushInstruction, TypedInstruction { diff --git a/src/java/org/apache/bcel/generic/DDIV.java b/src/java/org/apache/bcel/generic/DDIV.java index 3eec9167..ded9f2a3 100644 --- a/src/java/org/apache/bcel/generic/DDIV.java +++ b/src/java/org/apache/bcel/generic/DDIV.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DDIV extends ArithmeticInstruction { /** Divide doubles diff --git a/src/java/org/apache/bcel/generic/DLOAD.java b/src/java/org/apache/bcel/generic/DLOAD.java index 8533c08c..2a59e9dc 100644 --- a/src/java/org/apache/bcel/generic/DLOAD.java +++ b/src/java/org/apache/bcel/generic/DLOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack ... -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DLOAD extends LoadInstruction { /** diff --git a/src/java/org/apache/bcel/generic/DMUL.java b/src/java/org/apache/bcel/generic/DMUL.java index d070a7f9..c88e766e 100644 --- a/src/java/org/apache/bcel/generic/DMUL.java +++ b/src/java/org/apache/bcel/generic/DMUL.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DMUL extends ArithmeticInstruction { /** Multiply doubles diff --git a/src/java/org/apache/bcel/generic/DNEG.java b/src/java/org/apache/bcel/generic/DNEG.java index c0911463..6b8d3adb 100644 --- a/src/java/org/apache/bcel/generic/DNEG.java +++ b/src/java/org/apache/bcel/generic/DNEG.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DNEG extends ArithmeticInstruction { public DNEG() { diff --git a/src/java/org/apache/bcel/generic/DREM.java b/src/java/org/apache/bcel/generic/DREM.java index e32e9add..ef5b3423 100644 --- a/src/java/org/apache/bcel/generic/DREM.java +++ b/src/java/org/apache/bcel/generic/DREM.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DREM extends ArithmeticInstruction { /** Remainder of doubles diff --git a/src/java/org/apache/bcel/generic/DRETURN.java b/src/java/org/apache/bcel/generic/DRETURN.java index 3acae91d..7d2fbd9b 100644 --- a/src/java/org/apache/bcel/generic/DRETURN.java +++ b/src/java/org/apache/bcel/generic/DRETURN.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value.word1, value.word2 -> <empty>
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DRETURN extends ReturnInstruction { /** Return double from method diff --git a/src/java/org/apache/bcel/generic/DSTORE.java b/src/java/org/apache/bcel/generic/DSTORE.java index d087afdd..4d581b3a 100644 --- a/src/java/org/apache/bcel/generic/DSTORE.java +++ b/src/java/org/apache/bcel/generic/DSTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value.word1, value.word2 -> ... 
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DSTORE extends StoreInstruction { /** diff --git a/src/java/org/apache/bcel/generic/DSUB.java b/src/java/org/apache/bcel/generic/DSUB.java index 96471865..66777747 100644 --- a/src/java/org/apache/bcel/generic/DSUB.java +++ b/src/java/org/apache/bcel/generic/DSUB.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DSUB extends ArithmeticInstruction { /** Substract doubles diff --git a/src/java/org/apache/bcel/generic/DUP.java b/src/java/org/apache/bcel/generic/DUP.java index d77acdc5..b94ae152 100644 --- a/src/java/org/apache/bcel/generic/DUP.java +++ b/src/java/org/apache/bcel/generic/DUP.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., word -> ..., word, word
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DUP extends StackInstruction implements PushInstruction { public DUP() { diff --git a/src/java/org/apache/bcel/generic/DUP2.java b/src/java/org/apache/bcel/generic/DUP2.java index aae4be13..517031ab 100644 --- a/src/java/org/apache/bcel/generic/DUP2.java +++ b/src/java/org/apache/bcel/generic/DUP2.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., word2, word1 -> ..., word2, word1, word2, word1
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DUP2 extends StackInstruction implements PushInstruction { public DUP2() { diff --git a/src/java/org/apache/bcel/generic/DUP2_X1.java b/src/java/org/apache/bcel/generic/DUP2_X1.java index 38eccc1d..67f9415e 100644 --- a/src/java/org/apache/bcel/generic/DUP2_X1.java +++ b/src/java/org/apache/bcel/generic/DUP2_X1.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., word3, word2, word1 -> ..., word2, word1, word3, word2, word1
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DUP2_X1 extends StackInstruction { public DUP2_X1() { diff --git a/src/java/org/apache/bcel/generic/DUP2_X2.java b/src/java/org/apache/bcel/generic/DUP2_X2.java index f68c22e8..d9bb44a8 100644 --- a/src/java/org/apache/bcel/generic/DUP2_X2.java +++ b/src/java/org/apache/bcel/generic/DUP2_X2.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., word4, word3, word2, word1 -> ..., word2, word1, word4, word3, word2, word1
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DUP2_X2 extends StackInstruction { public DUP2_X2() { diff --git a/src/java/org/apache/bcel/generic/DUP_X1.java b/src/java/org/apache/bcel/generic/DUP_X1.java index 1c8bdb64..95033fef 100644 --- a/src/java/org/apache/bcel/generic/DUP_X1.java +++ b/src/java/org/apache/bcel/generic/DUP_X1.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., word2, word1 -> ..., word1, word2, word1
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DUP_X1 extends StackInstruction { public DUP_X1() { diff --git a/src/java/org/apache/bcel/generic/DUP_X2.java b/src/java/org/apache/bcel/generic/DUP_X2.java index fd0b8bdd..39738054 100644 --- a/src/java/org/apache/bcel/generic/DUP_X2.java +++ b/src/java/org/apache/bcel/generic/DUP_X2.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., word3, word2, word1 -> ..., word1, word3, word2, word1
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class DUP_X2 extends StackInstruction { public DUP_X2() { diff --git a/src/java/org/apache/bcel/generic/EmptyVisitor.java b/src/java/org/apache/bcel/generic/EmptyVisitor.java index fdaf5270..dfd42cf6 100644 --- a/src/java/org/apache/bcel/generic/EmptyVisitor.java +++ b/src/java/org/apache/bcel/generic/EmptyVisitor.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * Supplies empty method bodies to be overridden by subclasses. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class EmptyVisitor implements Visitor { public void visitStackInstruction(StackInstruction obj) { } diff --git a/src/java/org/apache/bcel/generic/F2D.java b/src/java/org/apache/bcel/generic/F2D.java index 381d4284..9b08818e 100644 --- a/src/java/org/apache/bcel/generic/F2D.java +++ b/src/java/org/apache/bcel/generic/F2D.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class F2D extends ConversionInstruction { /** Convert float to double diff --git a/src/java/org/apache/bcel/generic/F2I.java b/src/java/org/apache/bcel/generic/F2I.java index 3d0092df..acc0e640 100644 --- a/src/java/org/apache/bcel/generic/F2I.java +++ b/src/java/org/apache/bcel/generic/F2I.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class F2I extends ConversionInstruction { /** Convert float to int diff --git a/src/java/org/apache/bcel/generic/F2L.java b/src/java/org/apache/bcel/generic/F2L.java index eb6689fc..650e06cf 100644 --- a/src/java/org/apache/bcel/generic/F2L.java +++ b/src/java/org/apache/bcel/generic/F2L.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class F2L extends ConversionInstruction { /** Convert float to long diff --git a/src/java/org/apache/bcel/generic/FADD.java b/src/java/org/apache/bcel/generic/FADD.java index c7ba2423..db92e1ab 100644 --- a/src/java/org/apache/bcel/generic/FADD.java +++ b/src/java/org/apache/bcel/generic/FADD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FADD extends ArithmeticInstruction { /** Add floats diff --git a/src/java/org/apache/bcel/generic/FALOAD.java b/src/java/org/apache/bcel/generic/FALOAD.java index 48d361d5..93a7cbe2 100644 --- a/src/java/org/apache/bcel/generic/FALOAD.java +++ b/src/java/org/apache/bcel/generic/FALOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index -> ..., value
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FALOAD extends ArrayInstruction implements StackProducer { /** Load float from array diff --git a/src/java/org/apache/bcel/generic/FASTORE.java b/src/java/org/apache/bcel/generic/FASTORE.java index a6ea273a..1f925d81 100644 --- a/src/java/org/apache/bcel/generic/FASTORE.java +++ b/src/java/org/apache/bcel/generic/FASTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index, value -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FASTORE extends ArrayInstruction implements StackConsumer { /** Store float into array diff --git a/src/java/org/apache/bcel/generic/FCMPG.java b/src/java/org/apache/bcel/generic/FCMPG.java index de638802..86f48c96 100644 --- a/src/java/org/apache/bcel/generic/FCMPG.java +++ b/src/java/org/apache/bcel/generic/FCMPG.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FCMPG extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/java/org/apache/bcel/generic/FCMPL.java b/src/java/org/apache/bcel/generic/FCMPL.java index 5f67ce75..5c9283d0 100644 --- a/src/java/org/apache/bcel/generic/FCMPL.java +++ b/src/java/org/apache/bcel/generic/FCMPL.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FCMPL extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/java/org/apache/bcel/generic/FCONST.java b/src/java/org/apache/bcel/generic/FCONST.java index ccd42323..e22040cb 100644 --- a/src/java/org/apache/bcel/generic/FCONST.java +++ b/src/java/org/apache/bcel/generic/FCONST.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ... -> ..., 
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FCONST extends Instruction implements ConstantPushInstruction, TypedInstruction { diff --git a/src/java/org/apache/bcel/generic/FDIV.java b/src/java/org/apache/bcel/generic/FDIV.java index 105fe4ec..b41a5c2c 100644 --- a/src/java/org/apache/bcel/generic/FDIV.java +++ b/src/java/org/apache/bcel/generic/FDIV.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FDIV extends ArithmeticInstruction { /** Divide floats diff --git a/src/java/org/apache/bcel/generic/FLOAD.java b/src/java/org/apache/bcel/generic/FLOAD.java index ae54b051..30da2069 100644 --- a/src/java/org/apache/bcel/generic/FLOAD.java +++ b/src/java/org/apache/bcel/generic/FLOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack ... -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FLOAD extends LoadInstruction { /** diff --git a/src/java/org/apache/bcel/generic/FMUL.java b/src/java/org/apache/bcel/generic/FMUL.java index 5bd6ce99..6b71363a 100644 --- a/src/java/org/apache/bcel/generic/FMUL.java +++ b/src/java/org/apache/bcel/generic/FMUL.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FMUL extends ArithmeticInstruction { /** Multiply floats diff --git a/src/java/org/apache/bcel/generic/FNEG.java b/src/java/org/apache/bcel/generic/FNEG.java index 7d7bb3d6..e72f53ee 100644 --- a/src/java/org/apache/bcel/generic/FNEG.java +++ b/src/java/org/apache/bcel/generic/FNEG.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FNEG extends ArithmeticInstruction { public FNEG() { diff --git a/src/java/org/apache/bcel/generic/FREM.java b/src/java/org/apache/bcel/generic/FREM.java index a4bc3aba..e689117d 100644 --- a/src/java/org/apache/bcel/generic/FREM.java +++ b/src/java/org/apache/bcel/generic/FREM.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FREM extends ArithmeticInstruction { /** Remainder of floats diff --git a/src/java/org/apache/bcel/generic/FRETURN.java b/src/java/org/apache/bcel/generic/FRETURN.java index c46f16d8..96b853a5 100644 --- a/src/java/org/apache/bcel/generic/FRETURN.java +++ b/src/java/org/apache/bcel/generic/FRETURN.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> <empty>
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FRETURN extends ReturnInstruction { /** Return float from method diff --git a/src/java/org/apache/bcel/generic/FSTORE.java b/src/java/org/apache/bcel/generic/FSTORE.java index 6c93ae08..d920a44b 100644 --- a/src/java/org/apache/bcel/generic/FSTORE.java +++ b/src/java/org/apache/bcel/generic/FSTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ... 
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FSTORE extends StoreInstruction { /** diff --git a/src/java/org/apache/bcel/generic/FSUB.java b/src/java/org/apache/bcel/generic/FSUB.java index 842ea1e6..127ca425 100644 --- a/src/java/org/apache/bcel/generic/FSUB.java +++ b/src/java/org/apache/bcel/generic/FSUB.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class FSUB extends ArithmeticInstruction { /** Substract floats diff --git a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 52064b02..08696da8 100644 --- a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -63,7 +63,7 @@ import java.util.ArrayList; * some methods in common! * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAndTyped, Cloneable diff --git a/src/java/org/apache/bcel/generic/FieldInstruction.java b/src/java/org/apache/bcel/generic/FieldInstruction.java index 028ed5cf..57a83e40 100644 --- a/src/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/java/org/apache/bcel/generic/FieldInstruction.java @@ -55,16 +55,12 @@ package org.apache.bcel.generic; */ import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantCP; -import org.apache.bcel.classfile.*; /** * Super class for the GET/PUTxxx family of instructions. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class FieldInstruction extends FieldOrMethod implements TypedInstruction { diff --git a/src/java/org/apache/bcel/generic/FieldObserver.java b/src/java/org/apache/bcel/generic/FieldObserver.java index e5593248..a2353488 100644 --- a/src/java/org/apache/bcel/generic/FieldObserver.java +++ b/src/java/org/apache/bcel/generic/FieldObserver.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * and register yourself with addObserver(). * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface FieldObserver { public void notify(FieldGen field); diff --git a/src/java/org/apache/bcel/generic/FieldOrMethod.java b/src/java/org/apache/bcel/generic/FieldOrMethod.java index 835ff380..358108d4 100644 --- a/src/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/java/org/apache/bcel/generic/FieldOrMethod.java @@ -60,7 +60,7 @@ import org.apache.bcel.classfile.*; * some methods in common! * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { /** diff --git a/src/java/org/apache/bcel/generic/GETFIELD.java b/src/java/org/apache/bcel/generic/GETFIELD.java index c6ec284a..96927fbc 100644 --- a/src/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/java/org/apache/bcel/generic/GETFIELD.java @@ -64,7 +64,7 @@ import org.apache.bcel.ExceptionConstants; *
          Stack: ..., objectref -> ..., value.word1, value.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class GETFIELD extends FieldInstruction implements ExceptionThrower, StackConsumer, StackProducer { diff --git a/src/java/org/apache/bcel/generic/GETSTATIC.java b/src/java/org/apache/bcel/generic/GETSTATIC.java index c7a783c3..346ab574 100644 --- a/src/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/java/org/apache/bcel/generic/GETSTATIC.java @@ -64,7 +64,7 @@ import org.apache.bcel.ExceptionConstants; *
          Stack: ..., -> ..., value.word1, value.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class GETSTATIC extends FieldInstruction implements PushInstruction, ExceptionThrower { /** diff --git a/src/java/org/apache/bcel/generic/GOTO.java b/src/java/org/apache/bcel/generic/GOTO.java index f77c84ea..b1e4f5dd 100644 --- a/src/java/org/apache/bcel/generic/GOTO.java +++ b/src/java/org/apache/bcel/generic/GOTO.java @@ -59,7 +59,7 @@ import java.io.*; * GOTO - Branch always (to relative offset, not absolute address) * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class GOTO extends GotoInstruction implements VariableLengthInstruction { /** diff --git a/src/java/org/apache/bcel/generic/GOTO_W.java b/src/java/org/apache/bcel/generic/GOTO_W.java index 93a867b4..969441e2 100644 --- a/src/java/org/apache/bcel/generic/GOTO_W.java +++ b/src/java/org/apache/bcel/generic/GOTO_W.java @@ -60,7 +60,7 @@ import org.apache.bcel.util.ByteSequence; * GOTO_W - Branch always (to relative offset, not absolute address) * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class GOTO_W extends GotoInstruction { /** diff --git a/src/java/org/apache/bcel/generic/GotoInstruction.java b/src/java/org/apache/bcel/generic/GotoInstruction.java index 3d768be1..fe1ec663 100644 --- a/src/java/org/apache/bcel/generic/GotoInstruction.java +++ b/src/java/org/apache/bcel/generic/GotoInstruction.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * Super class for GOTO * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class GotoInstruction extends BranchInstruction implements UnconditionalBranch diff --git a/src/java/org/apache/bcel/generic/I2B.java b/src/java/org/apache/bcel/generic/I2B.java index 9eddff96..f3ebfdbd 100644 --- a/src/java/org/apache/bcel/generic/I2B.java +++ b/src/java/org/apache/bcel/generic/I2B.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class I2B extends ConversionInstruction { /** Convert int to byte diff --git a/src/java/org/apache/bcel/generic/I2C.java b/src/java/org/apache/bcel/generic/I2C.java index 9d7c36df..31a450c6 100644 --- a/src/java/org/apache/bcel/generic/I2C.java +++ b/src/java/org/apache/bcel/generic/I2C.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class I2C extends ConversionInstruction { /** Convert int to char diff --git a/src/java/org/apache/bcel/generic/I2D.java b/src/java/org/apache/bcel/generic/I2D.java index c5148551..57a033bb 100644 --- a/src/java/org/apache/bcel/generic/I2D.java +++ b/src/java/org/apache/bcel/generic/I2D.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class I2D extends ConversionInstruction { /** Convert int to double diff --git a/src/java/org/apache/bcel/generic/I2F.java b/src/java/org/apache/bcel/generic/I2F.java index 570bf390..1ffd185b 100644 --- a/src/java/org/apache/bcel/generic/I2F.java +++ b/src/java/org/apache/bcel/generic/I2F.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class I2F extends ConversionInstruction { /** Convert int to float diff --git a/src/java/org/apache/bcel/generic/I2L.java b/src/java/org/apache/bcel/generic/I2L.java index d5d02971..456a21d1 100644 --- a/src/java/org/apache/bcel/generic/I2L.java +++ b/src/java/org/apache/bcel/generic/I2L.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class I2L extends ConversionInstruction { /** Convert int to long diff --git a/src/java/org/apache/bcel/generic/I2S.java b/src/java/org/apache/bcel/generic/I2S.java index 8ab5ff13..b170c6c8 100644 --- a/src/java/org/apache/bcel/generic/I2S.java +++ b/src/java/org/apache/bcel/generic/I2S.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class I2S extends ConversionInstruction { public I2S() { diff --git a/src/java/org/apache/bcel/generic/IADD.java b/src/java/org/apache/bcel/generic/IADD.java index 74b04958..230b3095 100644 --- a/src/java/org/apache/bcel/generic/IADD.java +++ b/src/java/org/apache/bcel/generic/IADD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IADD extends ArithmeticInstruction { /** Add ints diff --git a/src/java/org/apache/bcel/generic/IALOAD.java b/src/java/org/apache/bcel/generic/IALOAD.java index 33936b63..fa56cae4 100644 --- a/src/java/org/apache/bcel/generic/IALOAD.java +++ b/src/java/org/apache/bcel/generic/IALOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index -> ..., value
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IALOAD extends ArrayInstruction implements StackProducer { /** diff --git a/src/java/org/apache/bcel/generic/IAND.java b/src/java/org/apache/bcel/generic/IAND.java index ef5b0cab..d9a41fbd 100644 --- a/src/java/org/apache/bcel/generic/IAND.java +++ b/src/java/org/apache/bcel/generic/IAND.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IAND extends ArithmeticInstruction { public IAND() { diff --git a/src/java/org/apache/bcel/generic/IASTORE.java b/src/java/org/apache/bcel/generic/IASTORE.java index 2b0a24b4..8718d0eb 100644 --- a/src/java/org/apache/bcel/generic/IASTORE.java +++ b/src/java/org/apache/bcel/generic/IASTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index, value -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IASTORE extends ArrayInstruction implements StackConsumer { /** diff --git a/src/java/org/apache/bcel/generic/ICONST.java b/src/java/org/apache/bcel/generic/ICONST.java index 2340ce41..7f97bfad 100644 --- a/src/java/org/apache/bcel/generic/ICONST.java +++ b/src/java/org/apache/bcel/generic/ICONST.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ... -> ..., 
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ICONST extends Instruction implements ConstantPushInstruction, TypedInstruction { diff --git a/src/java/org/apache/bcel/generic/IDIV.java b/src/java/org/apache/bcel/generic/IDIV.java index 60453df9..92802129 100644 --- a/src/java/org/apache/bcel/generic/IDIV.java +++ b/src/java/org/apache/bcel/generic/IDIV.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IDIV extends ArithmeticInstruction implements ExceptionThrower { /** Divide ints diff --git a/src/java/org/apache/bcel/generic/IFEQ.java b/src/java/org/apache/bcel/generic/IFEQ.java index f9b6cb52..74e597bf 100644 --- a/src/java/org/apache/bcel/generic/IFEQ.java +++ b/src/java/org/apache/bcel/generic/IFEQ.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IFEQ extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IFGE.java b/src/java/org/apache/bcel/generic/IFGE.java index c7b1ff44..24c23c9b 100644 --- a/src/java/org/apache/bcel/generic/IFGE.java +++ b/src/java/org/apache/bcel/generic/IFGE.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IFGE extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IFGT.java b/src/java/org/apache/bcel/generic/IFGT.java index 0d0a5ad3..68c03cd0 100644 --- a/src/java/org/apache/bcel/generic/IFGT.java +++ b/src/java/org/apache/bcel/generic/IFGT.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IFGT extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IFLE.java b/src/java/org/apache/bcel/generic/IFLE.java index 0a75215d..93277f42 100644 --- a/src/java/org/apache/bcel/generic/IFLE.java +++ b/src/java/org/apache/bcel/generic/IFLE.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IFLE extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IFLT.java b/src/java/org/apache/bcel/generic/IFLT.java index a316ee30..49bb009d 100644 --- a/src/java/org/apache/bcel/generic/IFLT.java +++ b/src/java/org/apache/bcel/generic/IFLT.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IFLT extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IFNE.java b/src/java/org/apache/bcel/generic/IFNE.java index 47ed4248..27ffb1f5 100644 --- a/src/java/org/apache/bcel/generic/IFNE.java +++ b/src/java/org/apache/bcel/generic/IFNE.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IFNE extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IFNONNULL.java b/src/java/org/apache/bcel/generic/IFNONNULL.java index 75a80d6a..93083140 100644 --- a/src/java/org/apache/bcel/generic/IFNONNULL.java +++ b/src/java/org/apache/bcel/generic/IFNONNULL.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., reference -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IFNONNULL extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IFNULL.java b/src/java/org/apache/bcel/generic/IFNULL.java index 3e1346b7..eba4a8cb 100644 --- a/src/java/org/apache/bcel/generic/IFNULL.java +++ b/src/java/org/apache/bcel/generic/IFNULL.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., reference -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IFNULL extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IF_ACMPEQ.java b/src/java/org/apache/bcel/generic/IF_ACMPEQ.java index d8560fb2..a83611d6 100644 --- a/src/java/org/apache/bcel/generic/IF_ACMPEQ.java +++ b/src/java/org/apache/bcel/generic/IF_ACMPEQ.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IF_ACMPEQ extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IF_ACMPNE.java b/src/java/org/apache/bcel/generic/IF_ACMPNE.java index 89cd7f54..b0675040 100644 --- a/src/java/org/apache/bcel/generic/IF_ACMPNE.java +++ b/src/java/org/apache/bcel/generic/IF_ACMPNE.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IF_ACMPNE extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IF_ICMPEQ.java b/src/java/org/apache/bcel/generic/IF_ICMPEQ.java index c84f244f..23088ac2 100644 --- a/src/java/org/apache/bcel/generic/IF_ICMPEQ.java +++ b/src/java/org/apache/bcel/generic/IF_ICMPEQ.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IF_ICMPEQ extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IF_ICMPGE.java b/src/java/org/apache/bcel/generic/IF_ICMPGE.java index 354bed13..d4851aa8 100644 --- a/src/java/org/apache/bcel/generic/IF_ICMPGE.java +++ b/src/java/org/apache/bcel/generic/IF_ICMPGE.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IF_ICMPGE extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IF_ICMPGT.java b/src/java/org/apache/bcel/generic/IF_ICMPGT.java index 86519ceb..4d84ad2f 100644 --- a/src/java/org/apache/bcel/generic/IF_ICMPGT.java +++ b/src/java/org/apache/bcel/generic/IF_ICMPGT.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IF_ICMPGT extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IF_ICMPLE.java b/src/java/org/apache/bcel/generic/IF_ICMPLE.java index d7de2c8e..708315b0 100644 --- a/src/java/org/apache/bcel/generic/IF_ICMPLE.java +++ b/src/java/org/apache/bcel/generic/IF_ICMPLE.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IF_ICMPLE extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IF_ICMPLT.java b/src/java/org/apache/bcel/generic/IF_ICMPLT.java index 0bb03b4e..63206a81 100644 --- a/src/java/org/apache/bcel/generic/IF_ICMPLT.java +++ b/src/java/org/apache/bcel/generic/IF_ICMPLT.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IF_ICMPLT extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IF_ICMPNE.java b/src/java/org/apache/bcel/generic/IF_ICMPNE.java index 409e841c..1c97b8be 100644 --- a/src/java/org/apache/bcel/generic/IF_ICMPNE.java +++ b/src/java/org/apache/bcel/generic/IF_ICMPNE.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IF_ICMPNE extends IfInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IINC.java b/src/java/org/apache/bcel/generic/IINC.java index 2a163ef3..107d6290 100644 --- a/src/java/org/apache/bcel/generic/IINC.java +++ b/src/java/org/apache/bcel/generic/IINC.java @@ -60,7 +60,7 @@ import org.apache.bcel.util.ByteSequence; * IINC - Increment local variable by constant * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IINC extends LocalVariableInstruction { private boolean wide; diff --git a/src/java/org/apache/bcel/generic/ILOAD.java b/src/java/org/apache/bcel/generic/ILOAD.java index 320eb767..4289899c 100644 --- a/src/java/org/apache/bcel/generic/ILOAD.java +++ b/src/java/org/apache/bcel/generic/ILOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ... -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ILOAD extends LoadInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IMPDEP1.java b/src/java/org/apache/bcel/generic/IMPDEP1.java index 488eff09..b5754e18 100644 --- a/src/java/org/apache/bcel/generic/IMPDEP1.java +++ b/src/java/org/apache/bcel/generic/IMPDEP1.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * IMPDEP1 - Implementation dependent * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IMPDEP1 extends Instruction { public IMPDEP1() { diff --git a/src/java/org/apache/bcel/generic/IMPDEP2.java b/src/java/org/apache/bcel/generic/IMPDEP2.java index 8663c9e9..e7191b50 100644 --- a/src/java/org/apache/bcel/generic/IMPDEP2.java +++ b/src/java/org/apache/bcel/generic/IMPDEP2.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * IMPDEP2 - Implementation dependent * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IMPDEP2 extends Instruction { public IMPDEP2() { diff --git a/src/java/org/apache/bcel/generic/IMUL.java b/src/java/org/apache/bcel/generic/IMUL.java index ef8d337e..cc03ca75 100644 --- a/src/java/org/apache/bcel/generic/IMUL.java +++ b/src/java/org/apache/bcel/generic/IMUL.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IMUL extends ArithmeticInstruction { /** Multiply ints diff --git a/src/java/org/apache/bcel/generic/INEG.java b/src/java/org/apache/bcel/generic/INEG.java index 83b0582c..07f66b39 100644 --- a/src/java/org/apache/bcel/generic/INEG.java +++ b/src/java/org/apache/bcel/generic/INEG.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class INEG extends ArithmeticInstruction { public INEG() { diff --git a/src/java/org/apache/bcel/generic/INSTANCEOF.java b/src/java/org/apache/bcel/generic/INSTANCEOF.java index 4d147c6c..5ab39663 100644 --- a/src/java/org/apache/bcel/generic/INSTANCEOF.java +++ b/src/java/org/apache/bcel/generic/INSTANCEOF.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., objectref -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThrower, StackProducer, StackConsumer { diff --git a/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java index f61eca00..f202c9aa 100644 --- a/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -65,7 +65,7 @@ import org.apache.bcel.util.ByteSequence; *
          Stack: ..., objectref, [arg1, [arg2 ...]] -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class INVOKEINTERFACE extends InvokeInstruction { private int nargs; // Number of arguments on stack (number of stack slots), called "count" in vmspec2 diff --git a/src/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/java/org/apache/bcel/generic/INVOKESPECIAL.java index a73d8fab..33362dd2 100644 --- a/src/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -63,7 +63,7 @@ import org.apache.bcel.ExceptionConstants; *
          Stack: ..., objectref, [arg1, [arg2 ...]] -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class INVOKESPECIAL extends InvokeInstruction { /** diff --git a/src/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/java/org/apache/bcel/generic/INVOKESTATIC.java index 01abae76..8764736d 100644 --- a/src/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -62,7 +62,7 @@ import org.apache.bcel.ExceptionConstants; *
          Stack: ..., [arg1, [arg2 ...]] -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class INVOKESTATIC extends InvokeInstruction { /** diff --git a/src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java index dd84d142..b1ea2c87 100644 --- a/src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -62,7 +62,7 @@ import org.apache.bcel.ExceptionConstants; *
          Stack: ..., objectref, [arg1, [arg2 ...]] -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class INVOKEVIRTUAL extends InvokeInstruction { /** diff --git a/src/java/org/apache/bcel/generic/IOR.java b/src/java/org/apache/bcel/generic/IOR.java index 32b92110..1d263d5b 100644 --- a/src/java/org/apache/bcel/generic/IOR.java +++ b/src/java/org/apache/bcel/generic/IOR.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IOR extends ArithmeticInstruction { public IOR() { diff --git a/src/java/org/apache/bcel/generic/IREM.java b/src/java/org/apache/bcel/generic/IREM.java index 27ec0f15..c46ba494 100644 --- a/src/java/org/apache/bcel/generic/IREM.java +++ b/src/java/org/apache/bcel/generic/IREM.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IREM extends ArithmeticInstruction implements ExceptionThrower { /** Remainder of ints diff --git a/src/java/org/apache/bcel/generic/IRETURN.java b/src/java/org/apache/bcel/generic/IRETURN.java index db1d18bc..1b2c89fb 100644 --- a/src/java/org/apache/bcel/generic/IRETURN.java +++ b/src/java/org/apache/bcel/generic/IRETURN.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> <empty>
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IRETURN extends ReturnInstruction { /** Return int from method diff --git a/src/java/org/apache/bcel/generic/ISHL.java b/src/java/org/apache/bcel/generic/ISHL.java index 998772bd..5ae4d5c2 100644 --- a/src/java/org/apache/bcel/generic/ISHL.java +++ b/src/java/org/apache/bcel/generic/ISHL.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ISHL extends ArithmeticInstruction { public ISHL() { diff --git a/src/java/org/apache/bcel/generic/ISHR.java b/src/java/org/apache/bcel/generic/ISHR.java index 97919128..5f214f9e 100644 --- a/src/java/org/apache/bcel/generic/ISHR.java +++ b/src/java/org/apache/bcel/generic/ISHR.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ISHR extends ArithmeticInstruction { public ISHR() { diff --git a/src/java/org/apache/bcel/generic/ISTORE.java b/src/java/org/apache/bcel/generic/ISTORE.java index efca2fc3..ba7cf336 100644 --- a/src/java/org/apache/bcel/generic/ISTORE.java +++ b/src/java/org/apache/bcel/generic/ISTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value -> ... 
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ISTORE extends StoreInstruction { /** diff --git a/src/java/org/apache/bcel/generic/ISUB.java b/src/java/org/apache/bcel/generic/ISUB.java index b0c8411f..64a39d46 100644 --- a/src/java/org/apache/bcel/generic/ISUB.java +++ b/src/java/org/apache/bcel/generic/ISUB.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ISUB extends ArithmeticInstruction { /** Substract ints diff --git a/src/java/org/apache/bcel/generic/IUSHR.java b/src/java/org/apache/bcel/generic/IUSHR.java index c038cfda..72162171 100644 --- a/src/java/org/apache/bcel/generic/IUSHR.java +++ b/src/java/org/apache/bcel/generic/IUSHR.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IUSHR extends ArithmeticInstruction { public IUSHR() { diff --git a/src/java/org/apache/bcel/generic/IXOR.java b/src/java/org/apache/bcel/generic/IXOR.java index 5ce6afa0..9cacaae4 100644 --- a/src/java/org/apache/bcel/generic/IXOR.java +++ b/src/java/org/apache/bcel/generic/IXOR.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class IXOR extends ArithmeticInstruction { public IXOR() { diff --git a/src/java/org/apache/bcel/generic/IfInstruction.java b/src/java/org/apache/bcel/generic/IfInstruction.java index 22217fe0..0de2d948 100644 --- a/src/java/org/apache/bcel/generic/IfInstruction.java +++ b/src/java/org/apache/bcel/generic/IfInstruction.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * Super class for the IFxxx family of instructions. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class IfInstruction extends BranchInstruction implements StackConsumer { /** diff --git a/src/java/org/apache/bcel/generic/IndexedInstruction.java b/src/java/org/apache/bcel/generic/IndexedInstruction.java index 067e7089..1fbff9f7 100644 --- a/src/java/org/apache/bcel/generic/IndexedInstruction.java +++ b/src/java/org/apache/bcel/generic/IndexedInstruction.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * RET, CPInstruction, etc. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface IndexedInstruction { public int getIndex(); diff --git a/src/java/org/apache/bcel/generic/Instruction.java b/src/java/org/apache/bcel/generic/Instruction.java index dd502f2c..c1d357f4 100644 --- a/src/java/org/apache/bcel/generic/Instruction.java +++ b/src/java/org/apache/bcel/generic/Instruction.java @@ -54,17 +54,19 @@ package org.apache.bcel.generic; * . */ +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.Serializable; + import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Utility; import org.apache.bcel.classfile.ConstantPool; -import java.io.*; import org.apache.bcel.util.ByteSequence; /** * Abstract super class for all Java byte codes. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class Instruction implements Cloneable, Serializable { protected short length = 1; // Length of instruction in bytes diff --git a/src/java/org/apache/bcel/generic/InstructionComparator.java b/src/java/org/apache/bcel/generic/InstructionComparator.java index b2e95528..98a03a48 100644 --- a/src/java/org/apache/bcel/generic/InstructionComparator.java +++ b/src/java/org/apache/bcel/generic/InstructionComparator.java @@ -65,7 +65,7 @@ package org.apache.bcel.generic; * * @see Instruction * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface InstructionComparator { public static final InstructionComparator DEFAULT = diff --git a/src/java/org/apache/bcel/generic/InstructionConstants.java b/src/java/org/apache/bcel/generic/InstructionConstants.java index a4bfe225..7587a8dd 100644 --- a/src/java/org/apache/bcel/generic/InstructionConstants.java +++ b/src/java/org/apache/bcel/generic/InstructionConstants.java @@ -71,7 +71,7 @@ import org.apache.bcel.Constants; * it's possible to write il.append(Instruction.ICONST_0); * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface InstructionConstants { /** Predefined instruction objects diff --git a/src/java/org/apache/bcel/generic/InstructionFactory.java b/src/java/org/apache/bcel/generic/InstructionFactory.java index cf6ed1ec..69508517 100644 --- a/src/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/java/org/apache/bcel/generic/InstructionFactory.java @@ -62,7 +62,7 @@ import org.apache.bcel.Constants; * add your own create methods. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Constants */ public class InstructionFactory diff --git a/src/java/org/apache/bcel/generic/InstructionHandle.java b/src/java/org/apache/bcel/generic/InstructionHandle.java index 2c6cc548..643beee3 100644 --- a/src/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/java/org/apache/bcel/generic/InstructionHandle.java @@ -72,7 +72,7 @@ import java.util.HashMap; * InstructionList.elements(). * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Instruction * @see BranchHandle * @see InstructionList diff --git a/src/java/org/apache/bcel/generic/InstructionList.java b/src/java/org/apache/bcel/generic/InstructionList.java index d68724bd..38a19697 100644 --- a/src/java/org/apache/bcel/generic/InstructionList.java +++ b/src/java/org/apache/bcel/generic/InstructionList.java @@ -76,7 +76,7 @@ import java.util.ArrayList; * href="#getByteCode()">getByteCode. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Instruction * @see InstructionHandle * @see BranchHandle diff --git a/src/java/org/apache/bcel/generic/InstructionListObserver.java b/src/java/org/apache/bcel/generic/InstructionListObserver.java index 96bc647f..a6fe758e 100644 --- a/src/java/org/apache/bcel/generic/InstructionListObserver.java +++ b/src/java/org/apache/bcel/generic/InstructionListObserver.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * and register yourself with addObserver(). * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface InstructionListObserver { public void notify(InstructionList list); diff --git a/src/java/org/apache/bcel/generic/InstructionTargeter.java b/src/java/org/apache/bcel/generic/InstructionTargeter.java index 77e03adf..d4e2fbd6 100644 --- a/src/java/org/apache/bcel/generic/InstructionTargeter.java +++ b/src/java/org/apache/bcel/generic/InstructionTargeter.java @@ -62,7 +62,7 @@ package org.apache.bcel.generic; * @see LocalVariableGen * @see CodeExceptionGen * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface InstructionTargeter { public boolean containsTarget(InstructionHandle ih); diff --git a/src/java/org/apache/bcel/generic/InvokeInstruction.java b/src/java/org/apache/bcel/generic/InvokeInstruction.java index 70981203..336b8d20 100644 --- a/src/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/java/org/apache/bcel/generic/InvokeInstruction.java @@ -61,7 +61,7 @@ import java.util.StringTokenizer; * Super class for the INVOKExxx family of instructions. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class InvokeInstruction extends FieldOrMethod implements ExceptionThrower, TypedInstruction, StackConsumer, StackProducer { diff --git a/src/java/org/apache/bcel/generic/JSR.java b/src/java/org/apache/bcel/generic/JSR.java index 920e14d5..74a6055b 100644 --- a/src/java/org/apache/bcel/generic/JSR.java +++ b/src/java/org/apache/bcel/generic/JSR.java @@ -59,7 +59,7 @@ import java.io.*; * JSR - Jump to subroutine * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class JSR extends JsrInstruction implements VariableLengthInstruction { /** diff --git a/src/java/org/apache/bcel/generic/JSR_W.java b/src/java/org/apache/bcel/generic/JSR_W.java index 789ef037..36705263 100644 --- a/src/java/org/apache/bcel/generic/JSR_W.java +++ b/src/java/org/apache/bcel/generic/JSR_W.java @@ -60,7 +60,7 @@ import org.apache.bcel.util.ByteSequence; * JSR_W - Jump to subroutine * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class JSR_W extends JsrInstruction { /** diff --git a/src/java/org/apache/bcel/generic/JsrInstruction.java b/src/java/org/apache/bcel/generic/JsrInstruction.java index 89e8db66..6fb9d81e 100644 --- a/src/java/org/apache/bcel/generic/JsrInstruction.java +++ b/src/java/org/apache/bcel/generic/JsrInstruction.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * Super class for JSR - Jump to subroutine * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class JsrInstruction extends BranchInstruction implements UnconditionalBranch, TypedInstruction, StackProducer diff --git a/src/java/org/apache/bcel/generic/L2D.java b/src/java/org/apache/bcel/generic/L2D.java index 8edc5e02..c6ae79f7 100644 --- a/src/java/org/apache/bcel/generic/L2D.java +++ b/src/java/org/apache/bcel/generic/L2D.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class L2D extends ConversionInstruction { public L2D() { diff --git a/src/java/org/apache/bcel/generic/L2F.java b/src/java/org/apache/bcel/generic/L2F.java index c996dc68..9dd30380 100644 --- a/src/java/org/apache/bcel/generic/L2F.java +++ b/src/java/org/apache/bcel/generic/L2F.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value.word1, value.word2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class L2F extends ConversionInstruction { public L2F() { diff --git a/src/java/org/apache/bcel/generic/L2I.java b/src/java/org/apache/bcel/generic/L2I.java index c52d346d..7e70e9a5 100644 --- a/src/java/org/apache/bcel/generic/L2I.java +++ b/src/java/org/apache/bcel/generic/L2I.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value.word1, value.word2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class L2I extends ConversionInstruction { public L2I() { diff --git a/src/java/org/apache/bcel/generic/LADD.java b/src/java/org/apache/bcel/generic/LADD.java index 006adaaf..baaa6162 100644 --- a/src/java/org/apache/bcel/generic/LADD.java +++ b/src/java/org/apache/bcel/generic/LADD.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LADD extends ArithmeticInstruction { public LADD() { diff --git a/src/java/org/apache/bcel/generic/LALOAD.java b/src/java/org/apache/bcel/generic/LALOAD.java index a61d37a4..529e1471 100644 --- a/src/java/org/apache/bcel/generic/LALOAD.java +++ b/src/java/org/apache/bcel/generic/LALOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index -> ..., value1, value2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LALOAD extends ArrayInstruction implements StackProducer { /** Load long from array diff --git a/src/java/org/apache/bcel/generic/LAND.java b/src/java/org/apache/bcel/generic/LAND.java index ab56ad50..aa0270d0 100644 --- a/src/java/org/apache/bcel/generic/LAND.java +++ b/src/java/org/apache/bcel/generic/LAND.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LAND extends ArithmeticInstruction { public LAND() { diff --git a/src/java/org/apache/bcel/generic/LASTORE.java b/src/java/org/apache/bcel/generic/LASTORE.java index 7aff0803..e914cb75 100644 --- a/src/java/org/apache/bcel/generic/LASTORE.java +++ b/src/java/org/apache/bcel/generic/LASTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index, value.word1, value.word2 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LASTORE extends ArrayInstruction implements StackConsumer { /** Store long into array diff --git a/src/java/org/apache/bcel/generic/LCMP.java b/src/java/org/apache/bcel/generic/LCMP.java index 2a203eed..dee04bc7 100644 --- a/src/java/org/apache/bcel/generic/LCMP.java +++ b/src/java/org/apache/bcel/generic/LCMP.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result <= -1, 0, 1> * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LCMP extends Instruction implements TypedInstruction, StackProducer, StackConsumer diff --git a/src/java/org/apache/bcel/generic/LCONST.java b/src/java/org/apache/bcel/generic/LCONST.java index 3e758fe8..21ded44a 100644 --- a/src/java/org/apache/bcel/generic/LCONST.java +++ b/src/java/org/apache/bcel/generic/LCONST.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ... -> ..., 
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LCONST extends Instruction implements ConstantPushInstruction, TypedInstruction { diff --git a/src/java/org/apache/bcel/generic/LDC.java b/src/java/org/apache/bcel/generic/LDC.java index 2782ccd9..a5c99990 100644 --- a/src/java/org/apache/bcel/generic/LDC.java +++ b/src/java/org/apache/bcel/generic/LDC.java @@ -62,7 +62,7 @@ import org.apache.bcel.util.ByteSequence; *
          Stack: ... -> ..., item
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LDC extends CPInstruction implements PushInstruction, ExceptionThrower, TypedInstruction { diff --git a/src/java/org/apache/bcel/generic/LDC2_W.java b/src/java/org/apache/bcel/generic/LDC2_W.java index d576767d..dfaf69eb 100644 --- a/src/java/org/apache/bcel/generic/LDC2_W.java +++ b/src/java/org/apache/bcel/generic/LDC2_W.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ... -> ..., item.word1, item.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LDC2_W extends CPInstruction implements PushInstruction, TypedInstruction { diff --git a/src/java/org/apache/bcel/generic/LDC_W.java b/src/java/org/apache/bcel/generic/LDC_W.java index 724adbab..f524d04d 100644 --- a/src/java/org/apache/bcel/generic/LDC_W.java +++ b/src/java/org/apache/bcel/generic/LDC_W.java @@ -62,7 +62,7 @@ import org.apache.bcel.util.ByteSequence; *
          Stack: ... -> ..., item.word1, item.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LDC_W extends LDC { /** diff --git a/src/java/org/apache/bcel/generic/LDIV.java b/src/java/org/apache/bcel/generic/LDIV.java index fad7a9a8..a28c6fff 100644 --- a/src/java/org/apache/bcel/generic/LDIV.java +++ b/src/java/org/apache/bcel/generic/LDIV.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LDIV extends ArithmeticInstruction implements ExceptionThrower { public LDIV() { diff --git a/src/java/org/apache/bcel/generic/LLOAD.java b/src/java/org/apache/bcel/generic/LLOAD.java index bd61c2bd..7bfe9af6 100644 --- a/src/java/org/apache/bcel/generic/LLOAD.java +++ b/src/java/org/apache/bcel/generic/LLOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack ... -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LLOAD extends LoadInstruction { /** diff --git a/src/java/org/apache/bcel/generic/LMUL.java b/src/java/org/apache/bcel/generic/LMUL.java index c7c6dd50..3633d03e 100644 --- a/src/java/org/apache/bcel/generic/LMUL.java +++ b/src/java/org/apache/bcel/generic/LMUL.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LMUL extends ArithmeticInstruction { public LMUL() { diff --git a/src/java/org/apache/bcel/generic/LNEG.java b/src/java/org/apache/bcel/generic/LNEG.java index ae43ce81..b4fa0fe7 100644 --- a/src/java/org/apache/bcel/generic/LNEG.java +++ b/src/java/org/apache/bcel/generic/LNEG.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LNEG extends ArithmeticInstruction { public LNEG() { diff --git a/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java index af87245a..2eea026b 100644 --- a/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java +++ b/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java @@ -60,7 +60,7 @@ import org.apache.bcel.util.ByteSequence; * LOOKUPSWITCH - Switch with unordered set of values * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see SWITCH */ public class LOOKUPSWITCH extends Select { diff --git a/src/java/org/apache/bcel/generic/LOR.java b/src/java/org/apache/bcel/generic/LOR.java index 4eda00d1..59b31b39 100644 --- a/src/java/org/apache/bcel/generic/LOR.java +++ b/src/java/org/apache/bcel/generic/LOR.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LOR extends ArithmeticInstruction { public LOR() { diff --git a/src/java/org/apache/bcel/generic/LREM.java b/src/java/org/apache/bcel/generic/LREM.java index f985c275..b88b2e8c 100644 --- a/src/java/org/apache/bcel/generic/LREM.java +++ b/src/java/org/apache/bcel/generic/LREM.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LREM extends ArithmeticInstruction implements ExceptionThrower { public LREM() { diff --git a/src/java/org/apache/bcel/generic/LRETURN.java b/src/java/org/apache/bcel/generic/LRETURN.java index 090206a6..5370e40a 100644 --- a/src/java/org/apache/bcel/generic/LRETURN.java +++ b/src/java/org/apache/bcel/generic/LRETURN.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value.word1, value.word2 -> <empty>
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LRETURN extends ReturnInstruction { public LRETURN() { diff --git a/src/java/org/apache/bcel/generic/LSHL.java b/src/java/org/apache/bcel/generic/LSHL.java index 25eb8a36..6de46655 100644 --- a/src/java/org/apache/bcel/generic/LSHL.java +++ b/src/java/org/apache/bcel/generic/LSHL.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1.word1, value1.word2, value2 -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LSHL extends ArithmeticInstruction { public LSHL() { diff --git a/src/java/org/apache/bcel/generic/LSHR.java b/src/java/org/apache/bcel/generic/LSHR.java index 73fdc0a1..99ab6e8b 100644 --- a/src/java/org/apache/bcel/generic/LSHR.java +++ b/src/java/org/apache/bcel/generic/LSHR.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1.word1, value1.word2, value2 -> ..., result.word1, result.word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LSHR extends ArithmeticInstruction { public LSHR() { diff --git a/src/java/org/apache/bcel/generic/LSTORE.java b/src/java/org/apache/bcel/generic/LSTORE.java index 0f9ad29d..d5e2be92 100644 --- a/src/java/org/apache/bcel/generic/LSTORE.java +++ b/src/java/org/apache/bcel/generic/LSTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value.word1, value.word2 -> ... 
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LSTORE extends StoreInstruction { /** diff --git a/src/java/org/apache/bcel/generic/LSUB.java b/src/java/org/apache/bcel/generic/LSUB.java index 1863abfe..813b67dd 100644 --- a/src/java/org/apache/bcel/generic/LSUB.java +++ b/src/java/org/apache/bcel/generic/LSUB.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LSUB extends ArithmeticInstruction { public LSUB() { diff --git a/src/java/org/apache/bcel/generic/LUSHR.java b/src/java/org/apache/bcel/generic/LUSHR.java index fdc2f97d..1fcfea58 100644 --- a/src/java/org/apache/bcel/generic/LUSHR.java +++ b/src/java/org/apache/bcel/generic/LUSHR.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LUSHR extends ArithmeticInstruction { public LUSHR() { diff --git a/src/java/org/apache/bcel/generic/LXOR.java b/src/java/org/apache/bcel/generic/LXOR.java index 991a6eb7..6d1d8233 100644 --- a/src/java/org/apache/bcel/generic/LXOR.java +++ b/src/java/org/apache/bcel/generic/LXOR.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., value1, value2 -> ..., result
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class LXOR extends ArithmeticInstruction { public LXOR() { diff --git a/src/java/org/apache/bcel/generic/LineNumberGen.java b/src/java/org/apache/bcel/generic/LineNumberGen.java index 053ffdda..4a82d456 100644 --- a/src/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/java/org/apache/bcel/generic/LineNumberGen.java @@ -54,15 +54,14 @@ package org.apache.bcel.generic; * . */ -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.*; +import org.apache.bcel.classfile.LineNumber; /** * This class represents a line number within a method, i.e., give an instruction * a line number corresponding to the source code line. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see LineNumber * @see MethodGen */ diff --git a/src/java/org/apache/bcel/generic/LoadClass.java b/src/java/org/apache/bcel/generic/LoadClass.java index 7226d56a..33c99884 100644 --- a/src/java/org/apache/bcel/generic/LoadClass.java +++ b/src/java/org/apache/bcel/generic/LoadClass.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * the referenced class in the Virtual Machine. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface LoadClass { /** diff --git a/src/java/org/apache/bcel/generic/LoadInstruction.java b/src/java/org/apache/bcel/generic/LoadInstruction.java index 34f20ad1..2a48960c 100644 --- a/src/java/org/apache/bcel/generic/LoadInstruction.java +++ b/src/java/org/apache/bcel/generic/LoadInstruction.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * variable, e.g. ILOAD. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class LoadInstruction extends LocalVariableInstruction implements PushInstruction diff --git a/src/java/org/apache/bcel/generic/LocalVariableGen.java b/src/java/org/apache/bcel/generic/LocalVariableGen.java index 2493c77f..72beb74d 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/java/org/apache/bcel/generic/LocalVariableGen.java @@ -64,7 +64,7 @@ import org.apache.bcel.classfile.*; * pool as parameters. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see LocalVariable * @see MethodGen */ diff --git a/src/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/java/org/apache/bcel/generic/LocalVariableInstruction.java index 48919963..0f6e2d9b 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -53,16 +53,17 @@ package org.apache.bcel.generic; * information on the Apache Software Foundation, please see * . */ -import java.io.*; -import org.apache.bcel.util.ByteSequence; -import org.apache.bcel.classfile.Utility; +import java.io.DataOutputStream; +import java.io.IOException; + import org.apache.bcel.Constants; +import org.apache.bcel.util.ByteSequence; /** * Abstract super class for instructions dealing with local variables. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class LocalVariableInstruction extends Instruction implements TypedInstruction, IndexedInstruction { diff --git a/src/java/org/apache/bcel/generic/MONITORENTER.java b/src/java/org/apache/bcel/generic/MONITORENTER.java index 5f023f47..019db5f4 100644 --- a/src/java/org/apache/bcel/generic/MONITORENTER.java +++ b/src/java/org/apache/bcel/generic/MONITORENTER.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., objectref -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class MONITORENTER extends Instruction implements ExceptionThrower, StackConsumer { diff --git a/src/java/org/apache/bcel/generic/MONITOREXIT.java b/src/java/org/apache/bcel/generic/MONITOREXIT.java index c3bb27a6..c2f6cbe2 100644 --- a/src/java/org/apache/bcel/generic/MONITOREXIT.java +++ b/src/java/org/apache/bcel/generic/MONITOREXIT.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., objectref -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class MONITOREXIT extends Instruction implements ExceptionThrower, StackConsumer { diff --git a/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java index 039c4ece..750af77e 100644 --- a/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java +++ b/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java @@ -63,7 +63,7 @@ import org.apache.bcel.ExceptionConstants; *
          Stack: ..., count1, [count2, ...] -> ..., arrayref
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower { private short dimensions; diff --git a/src/java/org/apache/bcel/generic/MethodObserver.java b/src/java/org/apache/bcel/generic/MethodObserver.java index eab665eb..1f421ecd 100644 --- a/src/java/org/apache/bcel/generic/MethodObserver.java +++ b/src/java/org/apache/bcel/generic/MethodObserver.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * and register yourself with addObserver(). * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface MethodObserver { public void notify(MethodGen method); diff --git a/src/java/org/apache/bcel/generic/NEW.java b/src/java/org/apache/bcel/generic/NEW.java index f59e4633..55d62a21 100644 --- a/src/java/org/apache/bcel/generic/NEW.java +++ b/src/java/org/apache/bcel/generic/NEW.java @@ -53,7 +53,6 @@ package org.apache.bcel.generic; * information on the Apache Software Foundation, please see * . */ -import java.io.*; import org.apache.bcel.ExceptionConstants; /** @@ -61,7 +60,7 @@ import org.apache.bcel.ExceptionConstants; *
          Stack: ... -> ..., objectref
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class NEW extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower, StackProducer { diff --git a/src/java/org/apache/bcel/generic/NEWARRAY.java b/src/java/org/apache/bcel/generic/NEWARRAY.java index 5d5cfa27..564b5474 100644 --- a/src/java/org/apache/bcel/generic/NEWARRAY.java +++ b/src/java/org/apache/bcel/generic/NEWARRAY.java @@ -62,7 +62,7 @@ import org.apache.bcel.util.ByteSequence; * type must be one of T_INT, T_SHORT, ... * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class NEWARRAY extends Instruction implements AllocationInstruction, ExceptionThrower, StackProducer { diff --git a/src/java/org/apache/bcel/generic/NOP.java b/src/java/org/apache/bcel/generic/NOP.java index c670e3c6..fec5848b 100644 --- a/src/java/org/apache/bcel/generic/NOP.java +++ b/src/java/org/apache/bcel/generic/NOP.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * NOP - Do nothing * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class NOP extends Instruction { public NOP() { diff --git a/src/java/org/apache/bcel/generic/NamedAndTyped.java b/src/java/org/apache/bcel/generic/NamedAndTyped.java index a789e3bf..8fce9ee1 100644 --- a/src/java/org/apache/bcel/generic/NamedAndTyped.java +++ b/src/java/org/apache/bcel/generic/NamedAndTyped.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * methods and fields. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface NamedAndTyped { public String getName(); diff --git a/src/java/org/apache/bcel/generic/ObjectType.java b/src/java/org/apache/bcel/generic/ObjectType.java index d4476770..384c393b 100644 --- a/src/java/org/apache/bcel/generic/ObjectType.java +++ b/src/java/org/apache/bcel/generic/ObjectType.java @@ -61,7 +61,7 @@ import org.apache.bcel.classfile.JavaClass; * Denotes reference such as java.lang.String. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class ObjectType extends ReferenceType { private String class_name; // Class name of type @@ -93,12 +93,13 @@ public final class ObjectType extends ReferenceType { * If "this" doesn't reference a class, it references an interface * or a non-existant entity. */ - public boolean referencesClass(){ - JavaClass jc = Repository.lookupClass(class_name); - if (jc == null) - return false; - else + public boolean referencesClass() { + try { + JavaClass jc = Repository.lookupClass(class_name); return jc.isClass(); + } catch (ClassNotFoundException e) { + return false; + } } /** @@ -106,14 +107,22 @@ public final class ObjectType extends ReferenceType { * or a non-existant entity. */ public boolean referencesInterface(){ - JavaClass jc = Repository.lookupClass(class_name); - if (jc == null) - return false; - else + try { + JavaClass jc = Repository.lookupClass(class_name); return !jc.isClass(); + } catch (ClassNotFoundException e) { + return false; + } } - public boolean subclassOf(ObjectType superclass){ + /** + * Return true if this type is a subclass of given ObjectType. + * @throws ClassNotFoundException if any of this class's superclasses + * can't be found + */ + public boolean subclassOf(ObjectType superclass) + throws ClassNotFoundException { + if (this.referencesInterface() || superclass.referencesInterface()) return false; @@ -122,8 +131,10 @@ public final class ObjectType extends ReferenceType { /** * Java Virtual Machine Specification edition 2, § 5.4.4 Access Control + * @throws ClassNotFoundException if the class referenced by this type + * can't be found */ - public boolean accessibleTo(ObjectType accessor) { + public boolean accessibleTo(ObjectType accessor) throws ClassNotFoundException { JavaClass jc = Repository.lookupClass(class_name); if(jc.isPublic()) { diff --git a/src/java/org/apache/bcel/generic/POP.java b/src/java/org/apache/bcel/generic/POP.java index c5dac2c5..70386493 100644 --- a/src/java/org/apache/bcel/generic/POP.java +++ b/src/java/org/apache/bcel/generic/POP.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., word -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class POP extends StackInstruction implements PopInstruction { public POP() { diff --git a/src/java/org/apache/bcel/generic/POP2.java b/src/java/org/apache/bcel/generic/POP2.java index 8a7faeba..169b8ba0 100644 --- a/src/java/org/apache/bcel/generic/POP2.java +++ b/src/java/org/apache/bcel/generic/POP2.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; *
          Stack: ..., word2, word1 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class POP2 extends StackInstruction implements PopInstruction { public POP2() { diff --git a/src/java/org/apache/bcel/generic/PUSH.java b/src/java/org/apache/bcel/generic/PUSH.java index 7a77a1d2..ae14cad9 100644 --- a/src/java/org/apache/bcel/generic/PUSH.java +++ b/src/java/org/apache/bcel/generic/PUSH.java @@ -54,14 +54,13 @@ package org.apache.bcel.generic; * . */ import org.apache.bcel.Constants; -import java.io.*; /** * Wrapper class for push operations, which are implemented either as BIPUSH, * LDC or xCONST_n instructions. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class PUSH implements CompoundInstruction, VariableLengthInstruction, InstructionConstants diff --git a/src/java/org/apache/bcel/generic/PUTFIELD.java b/src/java/org/apache/bcel/generic/PUTFIELD.java index 2e4fbdf7..4c7e908a 100644 --- a/src/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/java/org/apache/bcel/generic/PUTFIELD.java @@ -64,7 +64,7 @@ import org.apache.bcel.ExceptionConstants; *
          Stack: ..., objectref, value.word1, value.word2 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class PUTFIELD extends FieldInstruction diff --git a/src/java/org/apache/bcel/generic/PUTSTATIC.java b/src/java/org/apache/bcel/generic/PUTSTATIC.java index 7fa60b20..14901aac 100644 --- a/src/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/java/org/apache/bcel/generic/PUTSTATIC.java @@ -64,7 +64,7 @@ import org.apache.bcel.ExceptionConstants; *
          Stack: ..., value.word1, value.word2 -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, PopInstruction { diff --git a/src/java/org/apache/bcel/generic/PopInstruction.java b/src/java/org/apache/bcel/generic/PopInstruction.java index df9cf3a0..5ece6866 100644 --- a/src/java/org/apache/bcel/generic/PopInstruction.java +++ b/src/java/org/apache/bcel/generic/PopInstruction.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * such as ISTORE, POP, PUTSTATIC. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see ISTORE * @see POP */ diff --git a/src/java/org/apache/bcel/generic/PushInstruction.java b/src/java/org/apache/bcel/generic/PushInstruction.java index 9b600441..254f42c0 100644 --- a/src/java/org/apache/bcel/generic/PushInstruction.java +++ b/src/java/org/apache/bcel/generic/PushInstruction.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * such as ILOAD, LDC, SIPUSH, DUP, ICONST, etc. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see ILOAD * @see ICONST diff --git a/src/java/org/apache/bcel/generic/RET.java b/src/java/org/apache/bcel/generic/RET.java index c916e0b2..46c7616e 100644 --- a/src/java/org/apache/bcel/generic/RET.java +++ b/src/java/org/apache/bcel/generic/RET.java @@ -62,7 +62,7 @@ import org.apache.bcel.util.ByteSequence; *
          Stack: ..., -> ..., address
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class RET extends Instruction implements IndexedInstruction, TypedInstruction { private boolean wide; diff --git a/src/java/org/apache/bcel/generic/RETURN.java b/src/java/org/apache/bcel/generic/RETURN.java index d8f4084c..52b83f12 100644 --- a/src/java/org/apache/bcel/generic/RETURN.java +++ b/src/java/org/apache/bcel/generic/RETURN.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ... -> <empty>
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class RETURN extends ReturnInstruction { public RETURN() { diff --git a/src/java/org/apache/bcel/generic/ReferenceType.java b/src/java/org/apache/bcel/generic/ReferenceType.java index b9855e91..1440a2be 100644 --- a/src/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/java/org/apache/bcel/generic/ReferenceType.java @@ -62,7 +62,7 @@ import org.apache.bcel.classfile.JavaClass; * Super class for object and array types. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class ReferenceType extends Type { protected ReferenceType(byte t, String s) { @@ -82,8 +82,11 @@ public abstract class ReferenceType extends Type { * However, because e.g. CHECKCAST doesn't throw a * ClassCastException when casting a null reference to any Object, * true is returned in this case. + * + * @throws ClassNotFoundException if any classes or interfaces required + * to determine assignment compatibility can't be found */ - public boolean isCastableTo(Type t) { + public boolean isCastableTo(Type t) throws ClassNotFoundException { if (this.equals(Type.NULL)) return true; // If this is ever changed in isAssignmentCompatible() @@ -97,8 +100,12 @@ public abstract class ReferenceType extends Type { * Return true iff this is assignment compatible with another type t * as defined in the JVM specification; see the AASTORE definition * there. + * @throws ClassNotFoundException if any classes or interfaces required + * to determine assignment compatibility can't be found */ - public boolean isAssignmentCompatibleWith(Type t) { + public boolean isAssignmentCompatibleWith(Type t) + throws ClassNotFoundException { + if (!(t instanceof ReferenceType)) return false; @@ -210,8 +217,13 @@ public abstract class ReferenceType extends Type { * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. * If not all of the two classes' superclasses cannot be found, "null" is returned. * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". + * + * @throws ClassNotFoundException on failure to find superclasses of this + * type, or the type passed as a parameter */ - public ReferenceType getFirstCommonSuperclass(ReferenceType t) { + public ReferenceType getFirstCommonSuperclass(ReferenceType t) + throws ClassNotFoundException { + if (this.equals(Type.NULL)) return t; if (t.equals(Type.NULL)) return this; if (this.equals(t)) return this; @@ -294,8 +306,12 @@ public abstract class ReferenceType extends Type { * * @deprecated use getFirstCommonSuperclass(ReferenceType t) which has * slightly changed semantics. + * @throws ClassNotFoundException on failure to find superclasses of this + * type, or the type passed as a parameter */ - public ReferenceType firstCommonSuperclass(ReferenceType t) { + public ReferenceType firstCommonSuperclass(ReferenceType t) + throws ClassNotFoundException { + if (this.equals(Type.NULL)) return t; if (t.equals(Type.NULL)) return this; if (this.equals(t)) return this; diff --git a/src/java/org/apache/bcel/generic/ReturnInstruction.java b/src/java/org/apache/bcel/generic/ReturnInstruction.java index abe1675f..c75a2604 100644 --- a/src/java/org/apache/bcel/generic/ReturnInstruction.java +++ b/src/java/org/apache/bcel/generic/ReturnInstruction.java @@ -60,7 +60,7 @@ import org.apache.bcel.ExceptionConstants; * Super class for the xRETURN family of instructions. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class ReturnInstruction extends Instruction implements ExceptionThrower, TypedInstruction, StackConsumer { diff --git a/src/java/org/apache/bcel/generic/SALOAD.java b/src/java/org/apache/bcel/generic/SALOAD.java index 17f18f74..0903d034 100644 --- a/src/java/org/apache/bcel/generic/SALOAD.java +++ b/src/java/org/apache/bcel/generic/SALOAD.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index -> ..., value
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class SALOAD extends ArrayInstruction implements StackProducer { public SALOAD() { diff --git a/src/java/org/apache/bcel/generic/SASTORE.java b/src/java/org/apache/bcel/generic/SASTORE.java index cc3088f3..354d6320 100644 --- a/src/java/org/apache/bcel/generic/SASTORE.java +++ b/src/java/org/apache/bcel/generic/SASTORE.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., arrayref, index, value -> ...
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class SASTORE extends ArrayInstruction implements StackConsumer { public SASTORE() { diff --git a/src/java/org/apache/bcel/generic/SIPUSH.java b/src/java/org/apache/bcel/generic/SIPUSH.java index c2c40eb2..bbf1efd6 100644 --- a/src/java/org/apache/bcel/generic/SIPUSH.java +++ b/src/java/org/apache/bcel/generic/SIPUSH.java @@ -62,7 +62,7 @@ import org.apache.bcel.util.ByteSequence; *
          Stack: ... -> ..., value
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class SIPUSH extends Instruction implements ConstantPushInstruction { private short b; diff --git a/src/java/org/apache/bcel/generic/SWAP.java b/src/java/org/apache/bcel/generic/SWAP.java index 9b23edc1..5face29a 100644 --- a/src/java/org/apache/bcel/generic/SWAP.java +++ b/src/java/org/apache/bcel/generic/SWAP.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; *
          Stack: ..., word2, word1 -> ..., word1, word2
          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class SWAP extends StackInstruction implements StackConsumer, StackProducer { public SWAP() { diff --git a/src/java/org/apache/bcel/generic/SWITCH.java b/src/java/org/apache/bcel/generic/SWITCH.java index d47bd2a1..b74a9884 100644 --- a/src/java/org/apache/bcel/generic/SWITCH.java +++ b/src/java/org/apache/bcel/generic/SWITCH.java @@ -60,7 +60,7 @@ package org.apache.bcel.generic; * sorted with no gaps between the numbers. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class SWITCH implements CompoundInstruction { private int[] match; diff --git a/src/java/org/apache/bcel/generic/Select.java b/src/java/org/apache/bcel/generic/Select.java index 4e3707d3..abb4b716 100644 --- a/src/java/org/apache/bcel/generic/Select.java +++ b/src/java/org/apache/bcel/generic/Select.java @@ -60,7 +60,7 @@ import org.apache.bcel.util.ByteSequence; * Select - Abstract super class for LOOKUPSWITCH and TABLESWITCH instructions. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see LOOKUPSWITCH * @see TABLESWITCH * @see InstructionList diff --git a/src/java/org/apache/bcel/generic/StackConsumer.java b/src/java/org/apache/bcel/generic/StackConsumer.java index fd97f60b..9325aa95 100644 --- a/src/java/org/apache/bcel/generic/StackConsumer.java +++ b/src/java/org/apache/bcel/generic/StackConsumer.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * Denote an instruction that may consume a value from the stack. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface StackConsumer { /** @return how many words are consumed from stack diff --git a/src/java/org/apache/bcel/generic/StackInstruction.java b/src/java/org/apache/bcel/generic/StackInstruction.java index 03a488e5..c63e2226 100644 --- a/src/java/org/apache/bcel/generic/StackInstruction.java +++ b/src/java/org/apache/bcel/generic/StackInstruction.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * Super class for stack operations like DUP and POP. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class StackInstruction extends Instruction { /** diff --git a/src/java/org/apache/bcel/generic/StackProducer.java b/src/java/org/apache/bcel/generic/StackProducer.java index 955b9c07..5a9d9f18 100644 --- a/src/java/org/apache/bcel/generic/StackProducer.java +++ b/src/java/org/apache/bcel/generic/StackProducer.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * (this excludes DUP_X1, e.g.) * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface StackProducer { /** @return how many words are produced on stack diff --git a/src/java/org/apache/bcel/generic/StoreInstruction.java b/src/java/org/apache/bcel/generic/StoreInstruction.java index b35a6988..e9f30bd3 100644 --- a/src/java/org/apache/bcel/generic/StoreInstruction.java +++ b/src/java/org/apache/bcel/generic/StoreInstruction.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * e.g. ISTORE. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class StoreInstruction extends LocalVariableInstruction implements PopInstruction diff --git a/src/java/org/apache/bcel/generic/TABLESWITCH.java b/src/java/org/apache/bcel/generic/TABLESWITCH.java index a2ef8d9b..6d4c6a1a 100644 --- a/src/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/java/org/apache/bcel/generic/TABLESWITCH.java @@ -60,7 +60,7 @@ import org.apache.bcel.util.ByteSequence; * TABLESWITCH - Switch within given range of values, i.e., low..high * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see SWITCH */ public class TABLESWITCH extends Select { diff --git a/src/java/org/apache/bcel/generic/TargetLostException.java b/src/java/org/apache/bcel/generic/TargetLostException.java index 3caf528f..5009ad14 100644 --- a/src/java/org/apache/bcel/generic/TargetLostException.java +++ b/src/java/org/apache/bcel/generic/TargetLostException.java @@ -83,7 +83,7 @@ package org.apache.bcel.generic; * @see InstructionList * @see InstructionTargeter * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class TargetLostException extends Exception { private InstructionHandle[] targets; diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index dacb8e23..544b788f 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -63,7 +63,7 @@ import java.util.ArrayList; * such as int, object types like String and array types, e.g. int[] * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public abstract class Type implements java.io.Serializable { protected byte type; diff --git a/src/java/org/apache/bcel/generic/TypedInstruction.java b/src/java/org/apache/bcel/generic/TypedInstruction.java index a2043d02..9d853372 100644 --- a/src/java/org/apache/bcel/generic/TypedInstruction.java +++ b/src/java/org/apache/bcel/generic/TypedInstruction.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * of the field of a PUTFIELD instruction, e.g.. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface TypedInstruction { public Type getType(ConstantPoolGen cpg); diff --git a/src/java/org/apache/bcel/generic/UnconditionalBranch.java b/src/java/org/apache/bcel/generic/UnconditionalBranch.java index 17d23f12..917e6d98 100644 --- a/src/java/org/apache/bcel/generic/UnconditionalBranch.java +++ b/src/java/org/apache/bcel/generic/UnconditionalBranch.java @@ -58,7 +58,7 @@ package org.apache.bcel.generic; * Denotes an instruction to perform an unconditional branch, i.e., GOTO, JSR. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see GOTO * @see JSR diff --git a/src/java/org/apache/bcel/generic/VariableLengthInstruction.java b/src/java/org/apache/bcel/generic/VariableLengthInstruction.java index e08a2e1e..02a4cc5c 100644 --- a/src/java/org/apache/bcel/generic/VariableLengthInstruction.java +++ b/src/java/org/apache/bcel/generic/VariableLengthInstruction.java @@ -59,7 +59,7 @@ package org.apache.bcel.generic; * GOTO, JSR, LOOKUPSWITCH and TABLESWITCH. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see GOTO * @see JSR diff --git a/src/java/org/apache/bcel/generic/Visitor.java b/src/java/org/apache/bcel/generic/Visitor.java index 836d9f93..00d73685 100644 --- a/src/java/org/apache/bcel/generic/Visitor.java +++ b/src/java/org/apache/bcel/generic/Visitor.java @@ -61,7 +61,7 @@ package org.apache.bcel.generic; * method. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public interface Visitor { public void visitStackInstruction(StackInstruction obj); diff --git a/src/java/org/apache/bcel/util/AttributeHTML.java b/src/java/org/apache/bcel/util/AttributeHTML.java index 2fc44884..d6bbd898 100644 --- a/src/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/java/org/apache/bcel/util/AttributeHTML.java @@ -61,7 +61,7 @@ import java.io.*; * Convert found attributes into HTML file. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * */ final class AttributeHTML implements org.apache.bcel.Constants { diff --git a/src/java/org/apache/bcel/util/BCELFactory.java b/src/java/org/apache/bcel/util/BCELFactory.java index 8fcb316f..9eb87aca 100644 --- a/src/java/org/apache/bcel/util/BCELFactory.java +++ b/src/java/org/apache/bcel/util/BCELFactory.java @@ -66,7 +66,7 @@ import java.util.*; * * @see BCELifier * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ class BCELFactory extends EmptyVisitor { private MethodGen _mg; diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java index 4af7cba2..e6ef33a3 100644 --- a/src/java/org/apache/bcel/util/BCELifier.java +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -67,7 +67,7 @@ import java.io.*; * but tries to mimic hand-written code as close as possible. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { private JavaClass _clazz; diff --git a/src/java/org/apache/bcel/util/ByteSequence.java b/src/java/org/apache/bcel/util/ByteSequence.java index db293414..b560013c 100644 --- a/src/java/org/apache/bcel/util/ByteSequence.java +++ b/src/java/org/apache/bcel/util/ByteSequence.java @@ -61,7 +61,7 @@ import java.io.*; * Java byte code stream to gain some more readability. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public final class ByteSequence extends DataInputStream { private ByteArrayStream byte_stream; diff --git a/src/java/org/apache/bcel/util/Class2HTML.java b/src/java/org/apache/bcel/util/Class2HTML.java index f7442f25..b7457297 100644 --- a/src/java/org/apache/bcel/util/Class2HTML.java +++ b/src/java/org/apache/bcel/util/Class2HTML.java @@ -54,10 +54,18 @@ package org.apache.bcel.util; * . */ -import java.io.*; -import java.util.BitSet; -import org.apache.bcel.classfile.*; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; + import org.apache.bcel.Constants; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; /** * Read class file(s) and convert them into HTML files. @@ -79,7 +87,7 @@ import org.apache.bcel.Constants; * the Code frame. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class Class2HTML implements Constants { diff --git a/src/java/org/apache/bcel/util/ClassLoader.java b/src/java/org/apache/bcel/util/ClassLoader.java index 068e18dd..a21e8c84 100644 --- a/src/java/org/apache/bcel/util/ClassLoader.java +++ b/src/java/org/apache/bcel/util/ClassLoader.java @@ -78,7 +78,7 @@ import org.apache.bcel.classfile.*; * "java.", "sun.", "javax."

          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see JavaWrapper * @see ClassPath */ diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index 70d5d255..da3c3a8e 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -63,7 +63,7 @@ import java.io.*; * sun.tools.ClassPath. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class ClassPath implements Serializable { public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(); diff --git a/src/java/org/apache/bcel/util/ClassQueue.java b/src/java/org/apache/bcel/util/ClassQueue.java index f5db197f..0fcdcf29 100644 --- a/src/java/org/apache/bcel/util/ClassQueue.java +++ b/src/java/org/apache/bcel/util/ClassQueue.java @@ -61,7 +61,7 @@ import org.apache.bcel.classfile.JavaClass; * objects. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see ClassVector */ public class ClassQueue implements java.io.Serializable { diff --git a/src/java/org/apache/bcel/util/ClassSet.java b/src/java/org/apache/bcel/util/ClassSet.java index c1cabdd6..3de89ec5 100644 --- a/src/java/org/apache/bcel/util/ClassSet.java +++ b/src/java/org/apache/bcel/util/ClassSet.java @@ -63,7 +63,7 @@ import org.apache.bcel.classfile.JavaClass; * used for comparison. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see ClassStack */ public class ClassSet implements java.io.Serializable { diff --git a/src/java/org/apache/bcel/util/ClassStack.java b/src/java/org/apache/bcel/util/ClassStack.java index de3bd986..0eab1d64 100644 --- a/src/java/org/apache/bcel/util/ClassStack.java +++ b/src/java/org/apache/bcel/util/ClassStack.java @@ -60,7 +60,7 @@ import org.apache.bcel.classfile.JavaClass; * Utility class implementing a (typesafe) stack of JavaClass objects. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Stack */ public class ClassStack implements java.io.Serializable { diff --git a/src/java/org/apache/bcel/util/ClassVector.java b/src/java/org/apache/bcel/util/ClassVector.java index 58b221dd..52fcfeb5 100644 --- a/src/java/org/apache/bcel/util/ClassVector.java +++ b/src/java/org/apache/bcel/util/ClassVector.java @@ -61,7 +61,7 @@ import org.apache.bcel.classfile.JavaClass; * objects. Contains the most important methods of a Vector. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see ClassQueue */ public class ClassVector implements java.io.Serializable { diff --git a/src/java/org/apache/bcel/util/CodeHTML.java b/src/java/org/apache/bcel/util/CodeHTML.java index 08bd626b..962a30b1 100644 --- a/src/java/org/apache/bcel/util/CodeHTML.java +++ b/src/java/org/apache/bcel/util/CodeHTML.java @@ -62,7 +62,7 @@ import java.util.BitSet; * Convert code into HTML file. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * */ final class CodeHTML implements org.apache.bcel.Constants { diff --git a/src/java/org/apache/bcel/util/ConstantHTML.java b/src/java/org/apache/bcel/util/ConstantHTML.java index 5c5819f2..f9944d47 100644 --- a/src/java/org/apache/bcel/util/ConstantHTML.java +++ b/src/java/org/apache/bcel/util/ConstantHTML.java @@ -62,7 +62,7 @@ import java.io.*; * Convert constant pool into HTML file. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * */ final class ConstantHTML implements org.apache.bcel.Constants { diff --git a/src/java/org/apache/bcel/util/InstructionFinder.java b/src/java/org/apache/bcel/util/InstructionFinder.java index 4e3370bb..1a029be1 100644 --- a/src/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/java/org/apache/bcel/util/InstructionFinder.java @@ -82,7 +82,7 @@ import org.apache.regexp.*; }
          * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Instruction * @see InstructionList */ diff --git a/src/java/org/apache/bcel/util/JavaWrapper.java b/src/java/org/apache/bcel/util/JavaWrapper.java index 89cd9736..b26edb79 100644 --- a/src/java/org/apache/bcel/util/JavaWrapper.java +++ b/src/java/org/apache/bcel/util/JavaWrapper.java @@ -69,7 +69,7 @@ import java.lang.reflect.*; *

          * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see ClassLoader */ public class JavaWrapper { diff --git a/src/java/org/apache/bcel/util/MethodHTML.java b/src/java/org/apache/bcel/util/MethodHTML.java index d7991940..ca128c4b 100644 --- a/src/java/org/apache/bcel/util/MethodHTML.java +++ b/src/java/org/apache/bcel/util/MethodHTML.java @@ -61,7 +61,7 @@ import java.io.*; * Convert methods and fields into HTML file. * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * */ final class MethodHTML implements org.apache.bcel.Constants { diff --git a/src/java/org/apache/bcel/util/Repository.java b/src/java/org/apache/bcel/util/Repository.java index fcbada75..87c4099f 100644 --- a/src/java/org/apache/bcel/util/Repository.java +++ b/src/java/org/apache/bcel/util/Repository.java @@ -63,7 +63,7 @@ import org.apache.bcel.classfile.JavaClass; * * @see org.apache.bcel.Repository * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @author David Dixon-Peugh */ public interface Repository extends java.io.Serializable { @@ -99,6 +99,11 @@ public interface Repository extends java.io.Serializable { /** Clear all entries from cache. */ public void clear(); + + /** Get the ClassPath associated with this Repository + */ + public ClassPath getClassPath(); + } diff --git a/src/java/org/apache/bcel/verifier/GraphicalVerifier.java b/src/java/org/apache/bcel/verifier/GraphicalVerifier.java index e8f729ef..db3b16ee 100644 --- a/src/java/org/apache/bcel/verifier/GraphicalVerifier.java +++ b/src/java/org/apache/bcel/verifier/GraphicalVerifier.java @@ -54,10 +54,12 @@ package org.apache.bcel.verifier; * . */ +import java.awt.Dimension; +import java.awt.Toolkit; + import javax.swing.UIManager; -import java.awt.*; -import org.apache.bcel.verifier.*; -import org.apache.bcel.generic.*; + +import org.apache.bcel.generic.Type; /** diff --git a/src/java/org/apache/bcel/verifier/TransitiveHull.java b/src/java/org/apache/bcel/verifier/TransitiveHull.java index f450a4c2..990c69d8 100644 --- a/src/java/org/apache/bcel/verifier/TransitiveHull.java +++ b/src/java/org/apache/bcel/verifier/TransitiveHull.java @@ -54,9 +54,8 @@ package org.apache.bcel.verifier; * . */ -import org.apache.bcel.verifier.*; -import org.apache.bcel.classfile.*; -import org.apache.bcel.*; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; /** * This class has a main method implementing a demonstration program @@ -77,7 +76,7 @@ public class TransitiveHull implements VerifierFactoryObserver{ } /* Implementing VerifierFactoryObserver. */ - public void update(String classname){ + public void update(String classname) { System.gc(); // avoid swapping if possible. @@ -99,15 +98,19 @@ public class TransitiveHull implements VerifierFactoryObserver{ System.out.println("Pass 2:\n"+vr); if (vr == VerificationResult.VR_OK){ - JavaClass jc = Repository.lookupClass(v.getClassName()); - for (int i=0; i. */ -import org.apache.bcel.*; -import org.apache.bcel.classfile.*; -import org.apache.bcel.verifier.statics.*; -import org.apache.bcel.verifier.structurals.*; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.verifier.statics.Pass1Verifier; +import org.apache.bcel.verifier.statics.Pass2Verifier; +import org.apache.bcel.verifier.statics.Pass3aVerifier; +import org.apache.bcel.verifier.structurals.Pass3bVerifier; + /** * A Verifier instance is there to verify a class file according to The Java Virtual * Machine Specification, 2nd Edition. @@ -172,7 +174,7 @@ public class Verifier{ * This returns all the (warning) messages collected during verification. * A prefix shows from which verifying pass a message originates. */ - public String[] getMessages(){ + public String[] getMessages() throws ClassNotFoundException { ArrayList messages = new ArrayList(); if (p1v != null){ @@ -237,7 +239,7 @@ public class Verifier{ public static void main(String [] args){ System.out.println("JustIce by Enver Haase, (C) 2001-2002.\n\n\n"); for(int k=0; k < args.length; k++) { - + try { if (args[k].endsWith(".class")){ int dotclasspos = args[k].lastIndexOf(".class"); if (dotclasspos != -1) args[k] = args[k].substring(0,dotclasspos); @@ -278,9 +280,12 @@ public class Verifier{ System.out.println("\n"); // avoid swapping. - v.flush(); - org.apache.bcel.Repository.clearCache(); - System.gc(); + v.flush(); + org.apache.bcel.Repository.clearCache(); + System.gc(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } } } } diff --git a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/java/org/apache/bcel/verifier/VerifierAppFrame.java index 4a382252..1f0d6de8 100644 --- a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -54,13 +54,30 @@ package org.apache.bcel.verifier; * . */ -import java.awt.*; -import java.awt.event.*; -import javax.swing.*; -import javax.swing.event.*; -import org.apache.bcel.*; -import org.apache.bcel.classfile.*; -import org.apache.bcel.verifier.*; +import java.awt.AWTEvent; +import java.awt.CardLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.WindowEvent; + +import javax.swing.BorderFactory; +import javax.swing.JFrame; +import javax.swing.JList; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JTextPane; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionEvent; + +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; /** * This class implements a machine-generated frame for use with @@ -242,11 +259,16 @@ public class VerifierAppFrame extends JFrame { synchronized void classNamesJList_valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) return; current_class = classNamesJList.getSelectedValue().toString(); - verify(); + try { + verify(); + } catch (ClassNotFoundException ex) { + // FIXME: report the error using the GUI + ex.printStackTrace(); + } classNamesJList.setSelectedValue(current_class, true); } - private void verify(){ + private void verify() throws ClassNotFoundException { setTitle("PLEASE WAIT"); Verifier v = VerifierFactory.getVerifier(current_class); @@ -345,7 +367,14 @@ public class VerifierAppFrame extends JFrame { all3aok = false; rejected = true; } - all3amsg += "Method '"+Repository.lookupClass(v.getClassName()).getMethods()[i]+"': "+vr.getMessage().replace('\n',' ')+"\n\n"; + JavaClass jc = null; + try { + jc = Repository.lookupClass(v.getClassName()); + } catch (ClassNotFoundException ex) { + // FIXME: handle the error + ex.printStackTrace(); + } + all3amsg += "Method '"+jc.getMethods()[i]+"': "+vr.getMessage().replace('\n',' ')+"\n\n"; } } pass3aTextPane.setText(all3amsg); @@ -370,7 +399,14 @@ public class VerifierAppFrame extends JFrame { all3bok = false; rejected = true; } - all3bmsg += "Method '"+Repository.lookupClass(v.getClassName()).getMethods()[i]+"': "+vr.getMessage().replace('\n',' ')+"\n\n"; + JavaClass jc = null; + try { + jc = Repository.lookupClass(v.getClassName()); + } catch (ClassNotFoundException ex) { + // FIXME: handle the error + ex.printStackTrace(); + } + all3bmsg += "Method '"+jc.getMethods()[i]+"': "+vr.getMessage().replace('\n',' ')+"\n\n"; } } pass3bTextPane.setText(all3bmsg); diff --git a/src/java/org/apache/bcel/verifier/VerifierFactory.java b/src/java/org/apache/bcel/verifier/VerifierFactory.java index 2c61ba1c..d63d279b 100644 --- a/src/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/java/org/apache/bcel/verifier/VerifierFactory.java @@ -91,8 +91,6 @@ public class VerifierFactory{ * @return the (only) verifier responsible for the class with the given name. */ public static Verifier getVerifier(String fully_qualified_classname){ - fully_qualified_classname = fully_qualified_classname; - Verifier v = (Verifier) (hashMap.get(fully_qualified_classname)); if (v==null){ v = new Verifier(fully_qualified_classname); diff --git a/src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index 38d4cd05..aae49c82 100644 --- a/src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -53,8 +53,7 @@ package org.apache.bcel.verifier; * information on the Apache Software Foundation, please see * . */ -import org.apache.bcel.verifier.*; -import javax.swing.event.*; +import javax.swing.event.ListDataEvent; /** * This class implements an adapter; it implements both a Swing ListModel and * a VerifierFactoryObserver. diff --git a/src/java/org/apache/bcel/verifier/VerifyDialog.java b/src/java/org/apache/bcel/verifier/VerifyDialog.java index 9fe642d0..e675e8ea 100644 --- a/src/java/org/apache/bcel/verifier/VerifyDialog.java +++ b/src/java/org/apache/bcel/verifier/VerifyDialog.java @@ -54,11 +54,11 @@ package org.apache.bcel.verifier; * . */ -import org.apache.bcel.*; -import org.apache.bcel.classfile.*; -import org.apache.bcel.verifier.*; import java.awt.Color; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; + /** * A class for simple graphical class file verification. * Use the main(String []) method with fully qualified @@ -539,7 +539,13 @@ public void pass4Button_ActionPerformed(java.awt.event.ActionEvent actionEvent) Verifier v = VerifierFactory.getVerifier(class_name); VerificationResult vr = v.doPass2(); if (vr.getStatus() == VerificationResult.VERIFIED_OK){ - JavaClass jc = Repository.lookupClass(class_name); + JavaClass jc = null; + try { + jc = Repository.lookupClass(class_name); + } catch (ClassNotFoundException ex) { + // FIXME: report the error + ex.printStackTrace(); + } int nr = jc.getMethods().length; for (int i=0; i. */ -import org.apache.bcel.generic.*; -import org.apache.bcel.verifier.VerifierFactory; -import org.apache.bcel.verifier.exc.*; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Hashtable; + +import org.apache.bcel.generic.ATHROW; +import org.apache.bcel.generic.BranchInstruction; +import org.apache.bcel.generic.GotoInstruction; +import org.apache.bcel.generic.Instruction; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.JsrInstruction; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.RET; +import org.apache.bcel.generic.ReturnInstruction; +import org.apache.bcel.generic.Select; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; /** * This class represents a control flow graph of a method. diff --git a/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index 330f3a2f..b639ed32 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -55,19 +55,13 @@ package org.apache.bcel.verifier.structurals; */ import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.generic.*; -import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Constant; import org.apache.bcel.classfile.ConstantDouble; import org.apache.bcel.classfile.ConstantFloat; import org.apache.bcel.classfile.ConstantInteger; import org.apache.bcel.classfile.ConstantLong; import org.apache.bcel.classfile.ConstantString; -import org.apache.bcel.verifier.Verifier; -import org.apache.bcel.verifier.exc.*; -import java.util.ArrayList; -import java.util.Hashtable; +import org.apache.bcel.generic.*; /** * This Visitor class may be used for a type-based Java Virtual Machine @@ -754,8 +748,8 @@ public class ExecutionVisitor extends EmptyVisitor implements Visitor{ public void visitINVOKESPECIAL(INVOKESPECIAL o){ if (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME)){ UninitializedObjectType t = (UninitializedObjectType) stack().peek(o.getArgumentTypes(cpg).length); - if (t == frame._this){ - frame._this = null; + if (t == Frame._this){ + Frame._this = null; } stack().initializeObject(t); locals().initializeObject(t); diff --git a/src/java/org/apache/bcel/verifier/structurals/Frame.java b/src/java/org/apache/bcel/verifier/structurals/Frame.java index cfff00f5..ed0a1b4f 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Frame.java +++ b/src/java/org/apache/bcel/verifier/structurals/Frame.java @@ -54,9 +54,6 @@ package org.apache.bcel.verifier.structurals; * . */ -import org.apache.bcel.generic.*; -import org.apache.bcel.verifier.exc.*; -import java.util.ArrayList; /** * This class represents a JVM execution frame; that means, diff --git a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 8c47b6aa..c30ff85c 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -59,16 +59,19 @@ import org.apache.bcel.Repository; import org.apache.bcel.classfile.Constant; import org.apache.bcel.classfile.ConstantClass; import org.apache.bcel.classfile.ConstantDouble; -import org.apache.bcel.classfile.ConstantInteger; import org.apache.bcel.classfile.ConstantFieldref; import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; import org.apache.bcel.classfile.ConstantLong; import org.apache.bcel.classfile.ConstantString; import org.apache.bcel.classfile.Field; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.generic.*; -import org.apache.bcel.verifier.*; -import org.apache.bcel.verifier.exc.*; +import org.apache.bcel.verifier.VerificationResult; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.VerifierFactory; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; /** @@ -473,6 +476,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc * Ensures the specific preconditions of the said instruction. */ public void visitAASTORE(AASTORE o){ + try { Type arrayref = stack().peek(2); Type index = stack().peek(1); Type value = stack().peek(0); @@ -493,6 +497,10 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc constraintViolated(o, "The type of 'value' ('"+value+"') is not assignment compatible to the components of the array 'arrayref' refers to. ('"+((ArrayType) arrayref).getElementType()+"')"); } } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString()); + } } /** @@ -563,6 +571,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc * Ensures the specific preconditions of the said instruction. */ public void visitATHROW(ATHROW o){ + try { // It's stated that 'objectref' must be of a ReferenceType --- but since Throwable is // not derived from an ArrayType, it follows that 'objectref' must be of an ObjectType or Type.NULL. if (! ((stack().peek() instanceof ObjectType) || (stack().peek().equals(Type.NULL))) ){ @@ -577,6 +586,10 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if ( (! (exc.subclassOf(throwable)) ) && (! (exc.equals(throwable))) ){ constraintViolated(o, "The 'objectref' is not of class Throwable or of a subclass of Throwable, but of '"+stack().peek()+"'."); } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString()); + } } /** @@ -1167,6 +1180,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc * Ensures the specific preconditions of the said instruction. */ public void visitGETFIELD(GETFIELD o){ + try { Type objectref = stack().peek(); if (! ( (objectref instanceof ObjectType) || (objectref == Type.NULL) ) ){ constraintViolated(o, "Stack top should be an object reference that's not an array reference, but is '"+objectref+"'."); @@ -1215,6 +1229,11 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (f.isStatic()){ constraintViolated(o, "Referenced field '"+f+"' is static which it shouldn't be."); } + + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString()); + } } /** @@ -1716,6 +1735,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc * Ensures the specific preconditions of the said instruction. */ public void visitINVOKESPECIAL(INVOKESPECIAL o){ + try { // Don't init an object twice. if ( (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME)) && (!(stack().peek(o.getArgumentTypes(cpg).length) instanceof UninitializedObjectType)) ){ constraintViolated(o, "Possibly initializing object twice. A valid instruction sequence must not have an uninitialized object on the operand stack or in a local variable during a backwards branch, or in a local variable in code protected by an exception handler. Please see The Java Virtual Machine Specification, Second Edition, 4.9.4 (pages 147 and 148) for details."); @@ -1796,12 +1816,17 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString()); + } } /** * Ensures the specific preconditions of the said instruction. */ public void visitINVOKESTATIC(INVOKESTATIC o){ + try { // Method is not native, otherwise pass 3 would not happen. Type t = o.getType(cpg); @@ -1841,12 +1866,17 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } } } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString()); + } } /** * Ensures the specific preconditions of the said instruction. */ public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ + try { // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). Type t = o.getType(cpg); @@ -1912,6 +1942,10 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if ( ! Repository.instanceOf(objref_classname, theClass) ){ constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString()); + } } /** @@ -2427,6 +2461,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc * Ensures the specific preconditions of the said instruction. */ public void visitPUTFIELD(PUTFIELD o){ + try { Type objectref = stack().peek(1); if (! ( (objectref instanceof ObjectType) || (objectref == Type.NULL) ) ){ @@ -2504,12 +2539,18 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (f.isStatic()){ constraintViolated(o, "Referenced field '"+f+"' is static which it shouldn't be."); } + + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString()); + } } /** * Ensures the specific preconditions of the said instruction. */ public void visitPUTSTATIC(PUTSTATIC o){ + try { String field_name = o.getFieldName(cpg); JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); Field[] fields = jc.getFields(); @@ -2555,6 +2596,11 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } // TODO: Interface fields may be assigned to only once. (Hard to implement in // JustIce's execution model). This may only happen in , see Pass 3a. + + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString()); + } } /** @@ -2576,7 +2622,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc */ public void visitRETURN(RETURN o){ if (mg.getName().equals(Constants.CONSTRUCTOR_NAME)){// If we leave an method - if ((frame._this != null) && (!(mg.getClassName().equals(Type.OBJECT.getClassName()))) ) { + if ((Frame._this != null) && (!(mg.getClassName().equals(Type.OBJECT.getClassName()))) ) { constraintViolated(o, "Leaving a constructor that itself did not call a constructor."); } } diff --git a/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java index f737bd12..5f6e2ed4 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -54,9 +54,9 @@ package org.apache.bcel.verifier.structurals; * . */ -import org.apache.bcel.generic.InstructionHandle; import java.util.ArrayList; -import java.util.Iterator; + +import org.apache.bcel.generic.InstructionHandle; /** * An InstructionContext offers convenient access diff --git a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 9ffd719f..4fa4be53 100644 --- a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -162,6 +162,7 @@ public class LocalVariables{ * @see #merge(LocalVariables) */ private void merge(LocalVariables lv, int i){ + try { // We won't accept an unitialized object if we know it was initialized; // compare vmspec2, 4.9.4, last paragraph. @@ -202,6 +203,10 @@ public class LocalVariables{ locals[i] = Type.UNKNOWN; } } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString()); + } } /** diff --git a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/java/org/apache/bcel/verifier/structurals/OperandStack.java index b73cea1f..cf50009e 100644 --- a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -228,6 +228,7 @@ public class OperandStack{ * for details. */ public void merge(OperandStack s){ + try { if ( (slotsUsed() != s.slotsUsed()) || (size() != s.size()) ) throw new StructuralCodeConstraintException("Cannot merge stacks of different size:\nOperandStack A:\n"+this+"\nOperandStack B:\n"+s); @@ -258,6 +259,10 @@ public class OperandStack{ } } } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString()); + } } /** diff --git a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index dfb99c1d..2ae19f81 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -54,17 +54,30 @@ package org.apache.bcel.verifier.structurals; * . */ -import java.io.*; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.ArrayList; import java.util.Random; import java.util.Vector; + import org.apache.bcel.Constants; import org.apache.bcel.Repository; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; -import org.apache.bcel.verifier.*; -import org.apache.bcel.verifier.statics.*; -import org.apache.bcel.verifier.exc.*; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.JsrInstruction; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.RET; +import org.apache.bcel.generic.ReturnInstruction; +import org.apache.bcel.generic.ReturnaddressType; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.PassVerifier; +import org.apache.bcel.verifier.VerificationResult; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.VerifierConstraintViolatedException; /** * This PassVerifier verifies a method of class file according to pass 3, @@ -292,7 +305,13 @@ public final class Pass3bVerifier extends PassVerifier{ // Pass 3a ran before, so it's safe to assume the JavaClass object is // in the BCEL repository. - JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + JavaClass jc; + try { + jc = Repository.lookupClass(myOwner.getClassName()); + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString()); + } ConstantPoolGen constantPoolGen = new ConstantPoolGen(jc.getConstantPool()); // Init Visitors @@ -319,11 +338,11 @@ public final class Pass3bVerifier extends PassVerifier{ Frame f = new Frame(mg.getMaxLocals(),mg.getMaxStack()); if ( !mg.isStatic() ){ if (mg.getName().equals(Constants.CONSTRUCTOR_NAME)){ - f._this = new UninitializedObjectType(new ObjectType(jc.getClassName())); - f.getLocals().set(0, f._this); + Frame._this = new UninitializedObjectType(new ObjectType(jc.getClassName())); + f.getLocals().set(0, Frame._this); } else{ - f._this = null; + Frame._this = null; f.getLocals().set(0, new ObjectType(jc.getClassName())); } } diff --git a/xdocs/manual.xml b/xdocs/manual.xml index f738d141..efd2e156 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -2,7 +2,7 @@ - Markus Dahm + Markus Dahm Byte Code Engineering Library (BCEL) -- GitLab From 7c662c3fea75e1d8dc4b10316c694eee63e9316e Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 12 Jun 2003 07:27:14 +0000 Subject: [PATCH 0167/1313] new project git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152857 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/projects.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xdocs/projects.xml b/xdocs/projects.xml index 0029214a..2ef39594 100644 --- a/xdocs/projects.xml +++ b/xdocs/projects.xml @@ -15,6 +15,9 @@
        • Xalan XSLT Compiler
        • +
        • + BeanShell +
        • ObjectScript
        • -- GitLab From daf982b669bb558944ca5ba0bcb292d0f078ceb4 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Thu, 12 Jun 2003 07:30:22 +0000 Subject: [PATCH 0168/1313] Bug fix: tc was same as sc git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152858 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/ReferenceType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/ReferenceType.java b/src/java/org/apache/bcel/generic/ReferenceType.java index 1440a2be..a2ccdd93 100644 --- a/src/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/java/org/apache/bcel/generic/ReferenceType.java @@ -175,7 +175,7 @@ public abstract class ReferenceType extends Type { /* TC and SC are the same primitive type (§2.4.1). */ Type sc = ((ArrayType) this).getElementType(); - Type tc = ((ArrayType) this).getElementType(); + Type tc = ((ArrayType) T).getElementType(); if (sc instanceof BasicType && tc instanceof BasicType && sc.equals(tc)) return true; -- GitLab From 6708062a67a78c7468e4a8a7e845aca4e884cd2d Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Thu, 24 Jul 2003 14:14:47 +0000 Subject: [PATCH 0169/1313] PR: This patch was submitted via the BCEL mailing list; it makes certain static variables thread safe (although BCEL was never designed with thread safety in mind, maybe one should check all the framework for thread safety). Obtained from: Submitted by: [forgot the name, I'm sorry] Reviewed by: Enver git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152859 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Utility.java | 38 +++++++++++++++---- src/java/org/apache/bcel/generic/Type.java | 31 ++++++++++++--- 2 files changed, 55 insertions(+), 14 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 411ab6e0..0d1a2e60 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -67,11 +67,25 @@ import java.util.zip.*; * @author M. Dahm */ public abstract class Utility { - private static int consumed_chars; /* How many chars have been consumed + + private static int unwrap(ThreadLocal tl) { + return ((Integer)tl.get()).intValue(); + } + + private static void wrap(ThreadLocal tl, int value) { + tl.set(new Integer(value)); + } + + private static ThreadLocal consumed_chars = new ThreadLocal() { + protected Object initialValue() { + return new Integer(0); + } + };/* How many chars have been consumed * during parsing in signatureToString(). * Read by methodSignatureToString(). * Set by side effect,but only internally. */ + private static boolean wide=false; /* The `WIDE' instruction is used in the * byte code to allow 16-bit wide indices * for local variables. This opcode @@ -591,7 +605,8 @@ public abstract class Utility { while(signature.charAt(index) != ')') { vec.add(signatureToString(signature.substring(index), chopit)); - index += consumed_chars; // update position + //corrected concurrent private static field acess + index += unwrap(consumed_chars); // update position } } catch(StringIndexOutOfBoundsException e) { // Should never occur throw new ClassFormatException("Invalid method signature: " + signature); @@ -719,7 +734,8 @@ public abstract class Utility { var_index++; buf.append(", "); - index += consumed_chars; // update position + //corrected concurrent private static field acess + index += unwrap(consumed_chars); // update position } index++; // update position @@ -826,7 +842,8 @@ public abstract class Utility { public static final String signatureToString(String signature, boolean chopit) { - consumed_chars = 1; // This is the default, read just one char like `B' + //corrected concurrent private static field acess + wrap(consumed_chars, 1); // This is the default, read just one char like `B' try { switch(signature.charAt(0)) { @@ -842,8 +859,9 @@ public abstract class Utility { if(index < 0) throw new ClassFormatException("Invalid signature: " + signature); - - consumed_chars = index + 1; // "Lblabla;" `L' and `;' are removed + + //corrected concurrent private static field acess + wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed return compactClassName(signature.substring(1, index), chopit); } @@ -868,8 +886,12 @@ public abstract class Utility { // The rest of the string denotes a `' type = signatureToString(signature.substring(n), chopit); - - Utility.consumed_chars += consumed_chars; + + //corrected concurrent private static field acess + //Utility.consumed_chars += consumed_chars; is replaced by: + int _temp = unwrap(Utility.consumed_chars)+consumed_chars; + wrap(Utility.consumed_chars, _temp); + return type + brackets.toString(); } diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index 544b788f..e0db8c7e 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -66,6 +66,7 @@ import java.util.ArrayList; * @author M. Dahm */ public abstract class Type implements java.io.Serializable { + protected byte type; protected String signature; // signature for the type @@ -145,7 +146,19 @@ public abstract class Type implements java.io.Serializable { return buf.toString(); } - private static int consumed_chars=0; // Remember position in string, see getArgumentTypes + private static ThreadLocal consumed_chars = new ThreadLocal() { + protected Object initialValue() { + return new Integer(0); + } + };//int consumed_chars=0; // Remember position in string, see getArgumentTypes + + private static int unwrap(ThreadLocal tl) { + return ((Integer)tl.get()).intValue(); + } + + private static void wrap(ThreadLocal tl, int value) { + tl.set(new Integer(value)); + } /** * Convert signature to a Type object. @@ -158,7 +171,8 @@ public abstract class Type implements java.io.Serializable { byte type = Utility.typeOfSignature(signature); if(type <= Constants.T_VOID) { - consumed_chars = 1; + //corrected concurrent private static field acess + wrap(consumed_chars, 1); return BasicType.getType(type); } else if(type == Constants.T_ARRAY) { int dim=0; @@ -169,7 +183,10 @@ public abstract class Type implements java.io.Serializable { // Recurse, but just once, if the signature is ok Type t = getType(signature.substring(dim)); - consumed_chars += dim; // update counter + //corrected concurrent private static field acess + // consumed_chars += dim; // update counter - is replaced by + int _temp = unwrap(consumed_chars) + dim; + wrap(consumed_chars, _temp); return new ArrayType(t, dim); } else { // type == T_REFERENCE @@ -177,8 +194,9 @@ public abstract class Type implements java.io.Serializable { if(index < 0) throw new ClassFormatException("Invalid signature: " + signature); - - consumed_chars = index + 1; // "Lblabla;" `L' and `;' are removed + + //corrected concurrent private static field acess + wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed return new ObjectType(signature.substring(1, index).replace('/', '.')); } @@ -218,7 +236,8 @@ public abstract class Type implements java.io.Serializable { while(signature.charAt(index) != ')') { vec.add(getType(signature.substring(index))); - index += consumed_chars; // update position + //corrected concurrent private static field acess + index += unwrap(consumed_chars); // update position } } catch(StringIndexOutOfBoundsException e) { // Should never occur throw new ClassFormatException("Invalid method signature: " + signature); -- GitLab From b4040ff90ffa92408e4a23972c9938daa11fdc28 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 28 Jul 2003 07:04:41 +0000 Subject: [PATCH 0170/1313] Bug fix: equals threw NullPointer git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152860 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/ReturnaddressType.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/ReturnaddressType.java b/src/java/org/apache/bcel/generic/ReturnaddressType.java index 4a1b4c57..ab445967 100644 --- a/src/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/java/org/apache/bcel/generic/ReturnaddressType.java @@ -90,7 +90,12 @@ public class ReturnaddressType extends Type { if(!(rat instanceof ReturnaddressType)) return false; - return ((ReturnaddressType)rat).returnTarget.equals(this.returnTarget); + ReturnaddressType that = (ReturnaddressType)rat; + + if(this.returnTarget == null || that.returnTarget == null) + return that.returnTarget == this.returnTarget; + + return that.returnTarget.equals(this.returnTarget); } /** -- GitLab From a2fd1fc81f4c95f673a2ff20f52e3194ce3b3b77 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 13 Aug 2003 14:09:47 +0000 Subject: [PATCH 0171/1313] new projects git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152861 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/projects.xml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/xdocs/projects.xml b/xdocs/projects.xml index 2ef39594..0380908d 100644 --- a/xdocs/projects.xml +++ b/xdocs/projects.xml @@ -15,9 +15,6 @@
        • Xalan XSLT Compiler
        • -
        • - BeanShell -
        • ObjectScript
        • @@ -27,6 +24,18 @@
        • Java Development Environment for Emacs
        • + +
        • + LIDO JDO-Implementation +
        • +
        • + BeanShell +
        • + +
        • + JCredo JDO-Implementation +
        • +
        • Venus Application Publisher
        • -- GitLab From fe3a9204c7423fb7a85471f93f9978f132425b84 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Wed, 13 Aug 2003 14:11:07 +0000 Subject: [PATCH 0172/1313] regard again .class files git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152862 13f79535-47bb-0310-9956-ffa450edef68 --- examples/listclass.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/listclass.java b/examples/listclass.java index d24af3bb..8adb934d 100644 --- a/examples/listclass.java +++ b/examples/listclass.java @@ -142,8 +142,11 @@ public class listclass { if(name.startsWith((String) exclude_name.elementAt(idx))) return; - if((java_class = Repository.lookupClass(name)) == null) + if(name.endsWith(".class")) { java_class = new ClassParser(name).parse(); // May throw IOException + } else { + java_class = Repository.lookupClass(name); + } if(nocontents) System.out.println(java_class.getClassName()); -- GitLab From 82e8161bffd04e97eb548bc05ecf29a5cc659c5f Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 18 Aug 2003 07:18:55 +0000 Subject: [PATCH 0173/1313] find classes in repository first, then in CLASSPATH git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152863 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/util/SyntheticRepository.java | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/java/org/apache/bcel/util/SyntheticRepository.java index 70184c6a..58f67557 100644 --- a/src/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/java/org/apache/bcel/util/SyntheticRepository.java @@ -132,8 +132,15 @@ public class SyntheticRepository implements Repository { } /** - * Load a JavaClass object for the given class name using - * the CLASSPATH environment variable. + * Find a JavaClass object by name. + * If it is already in this Repository, the Repository version + * is returned. Otherwise, the Repository's classpath is searched for + * the class (and it is added to the Repository if found). + * + * @param className the name of the class + * @return the JavaClass object + * @throws ClassNotFoundException if the class is not in the + * Repository, and could not be found on the classpath */ public JavaClass loadClass(String className) throws ClassNotFoundException { if (className == null || className.equals("")) { @@ -142,6 +149,11 @@ public class SyntheticRepository implements Repository { className = className.replace('/', '.'); // Just in case, canonical form + JavaClass clazz = findClass(className); + if (clazz != null) { + return clazz; + } + try { return loadClass(_path.getInputStream(className), className); } catch (IOException e) { @@ -151,12 +163,26 @@ public class SyntheticRepository implements Repository { } /** - * Try to find class source via getResourceAsStream(). + * Find the JavaClass object for a runtime Class object. + * If a class with the same name is already in this Repository, + * the Repository version is returned. Otherwise, getResourceAsStream() + * is called on the Class object to find the class's representation. + * If the representation is found, it is added to the Repository. + * * @see Class + * @param clazz the runtime Class object * @return JavaClass object for given runtime class + * @throws ClassNotFoundException if the class is not in the + * Repository, and its representation could not be found */ public JavaClass loadClass(Class clazz) throws ClassNotFoundException { String className = clazz.getName(); + + JavaClass repositoryClass = findClass(className); + if (repositoryClass != null) { + return repositoryClass; + } + String name = className; int i = name.lastIndexOf('.'); @@ -169,16 +195,11 @@ public class SyntheticRepository implements Repository { private JavaClass loadClass(InputStream is, String className) throws ClassNotFoundException { - JavaClass clazz = findClass(className); - - if (clazz != null) { - return clazz; - } try { if (is != null) { ClassParser parser = new ClassParser(is, className); - clazz = parser.parse(); + JavaClass clazz = parser.parse(); storeClass(clazz); -- GitLab From 1ba4b531eb4aaa9f96a0e98f7320702a35fc76c1 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Mon, 18 Aug 2003 14:16:00 +0000 Subject: [PATCH 0174/1313] new projects git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152864 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/projects.xml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/xdocs/projects.xml b/xdocs/projects.xml index 0380908d..a767f24e 100644 --- a/xdocs/projects.xml +++ b/xdocs/projects.xml @@ -25,9 +25,6 @@ Java Development Environment for Emacs -
        • - LIDO JDO-Implementation -
        • BeanShell
        • @@ -36,6 +33,14 @@ JCredo JDO-Implementation +
        • + LIDO JDO-Implementation +
        • + +
        • + JRelay JDO-Implementation +
        • +
        • Venus Application Publisher
        • -- GitLab From 321fd49e4933d4a513dd7eb7eca15930d6fd83f3 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Wed, 20 Aug 2003 11:44:13 +0000 Subject: [PATCH 0175/1313] Typo git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152865 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/structurals/ControlFlowGraph.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index f568c748..3b3c36fe 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -470,7 +470,7 @@ throw new AssertionViolatedException("DID YOU REALLY WANT TO ASK FOR RET'S SUCCS /** * Returns true, if and only if the said instruction is not reachable; that means, - * if it not part of this ControlFlowGraph. + * if it is not part of this ControlFlowGraph. */ public boolean isDead(InstructionHandle i){ return instructionContexts.containsKey(i); -- GitLab From c76438ff5ab889ad5be4753bbbc1e4e68c045225 Mon Sep 17 00:00:00 2001 From: Enver Haase Date: Wed, 20 Aug 2003 12:36:17 +0000 Subject: [PATCH 0176/1313] Darn obfuscators. Sun really allows them to create multiple fields of the same name with different types! So we do, too. Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152866 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/statics/Pass3aVerifier.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index f4eb8b41..64eff1da 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -505,8 +505,15 @@ public final class Pass3aVerifier extends PassVerifier{ Field f = null; for (int i=0; i Date: Wed, 20 Aug 2003 13:31:14 +0000 Subject: [PATCH 0177/1313] PR: Allow more than one field of the same name; with different types. Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152867 13f79535-47bb-0310-9956-ffa450edef68 --- .../structurals/InstConstraintVisitor.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index c30ff85c..1b37a72d 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -1193,8 +1193,15 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc Field f = null; for (int i=0; i Date: Mon, 25 Aug 2003 16:50:37 +0000 Subject: [PATCH 0178/1313] PR:Fixed typos. Fixed buggy ControlFlowGraph.isDead(InstructionHandle). Obtained from: Submitted by: Reviewed by: git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152868 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/statics/Pass3aVerifier.java | 6 +++--- .../apache/bcel/verifier/structurals/ControlFlowGraph.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 64eff1da..58cb4aee 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -989,7 +989,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature not found in class '"+jc.getClassName()+"'. The native verfier does allow the method to be declared in some superinterface, which the Java Virtual Machine Specification, Second Edition does not."); + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature not found in class '"+jc.getClassName()+"'. The native verifier does allow the method to be declared in some superinterface, which the Java Virtual Machine Specification, Second Edition does not."); } if (jc.isClass()){ constraintViolated(o, "Referenced class '"+jc.getClassName()+"' is a class, but not an interface as expected."); @@ -1020,7 +1020,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature not found in class '"+jc.getClassName()+"'. The native verfier does allow the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature not found in class '"+jc.getClassName()+"'. The native verifier does allow the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); } JavaClass current = Repository.lookupClass(myOwner.getClassName()); @@ -1117,7 +1117,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature not found in class '"+jc.getClassName()+"'. The native verfier does allow the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature not found in class '"+jc.getClassName()+"'. The native verifier does allow the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); } if (! (jc.isClass())){ constraintViolated(o, "Referenced class '"+jc.getClassName()+"' is an interface, but not a class as expected."); diff --git a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index 3b3c36fe..057eb5e8 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -473,6 +473,6 @@ throw new AssertionViolatedException("DID YOU REALLY WANT TO ASK FOR RET'S SUCCS * if it is not part of this ControlFlowGraph. */ public boolean isDead(InstructionHandle i){ - return instructionContexts.containsKey(i); + return subroutines.subroutineOf(i) == null; } } -- GitLab From e63931d774980c0f2823ea37be096f0a18ae6c15 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 2 Sep 2003 15:02:40 +0000 Subject: [PATCH 0179/1313] println() instead of \\n git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152869 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/BCELifier.java | 36 +++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java index e6ef33a3..e9b249ba 100644 --- a/src/java/org/apache/bcel/util/BCELifier.java +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -98,18 +98,21 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { false, true); if(!"".equals(package_name)) { class_name = class_name.substring(package_name.length() + 1); - _out.println("package " + package_name + ";\n"); - } + _out.println("package " + package_name + ";"); + _out.println(); + } _out.println("import org.apache.bcel.generic.*;"); _out.println("import org.apache.bcel.classfile.*;"); _out.println("import org.apache.bcel.*;"); - _out.println("import java.io.*;\n"); + _out.println("import java.io.*;"); + _out.println(); _out.println("public class " + class_name + "Creator implements Constants {"); _out.println(" private InstructionFactory _factory;"); _out.println(" private ConstantPoolGen _cp;"); - _out.println(" private ClassGen _cg;\n"); + _out.println(" private ClassGen _cg;"); + _out.println(); _out.println(" public " + class_name + "Creator() {"); _out.println(" _cg = new ClassGen(\"" + @@ -118,11 +121,13 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { "\", \"" + super_name + "\", " + "\"" + clazz.getSourceFileName() + "\", " + printFlags(clazz.getAccessFlags(), true) + ", " + - "new String[] { " + inter + " });\n"); - + "new String[] { " + inter + " });"); + _out.println(); + _out.println(" _cp = _cg.getConstantPool();"); _out.println(" _factory = new InstructionFactory(_cg, _cp);"); - _out.println(" }\n"); + _out.println(" }"); + _out.println(); printCreate(); @@ -136,7 +141,8 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { fields[i].accept(this); } - _out.println(" }\n"); + _out.println(" }"); + _out.println(); } Method[] methods = clazz.getMethods(); @@ -145,7 +151,8 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { _out.println(" private void createMethod_" + i + "() {"); methods[i].accept(this); - _out.println(" }\n"); + _out.println(" }"); + _out.println(); } printMain(); @@ -167,7 +174,8 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { _out.println(" _cg.getJavaClass().dump(out);"); - _out.println(" }\n"); + _out.println(" }"); + _out.println(); } private void printMain() { @@ -182,7 +190,8 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { } public void visitField(Field field) { - _out.println("\n field = new FieldGen(" + + _out.println(); + _out.println(" field = new FieldGen(" + printFlags(field.getAccessFlags()) + ", " + printType(field.getSignature()) + ", \"" + field.getName() + "\", _cp);"); @@ -211,8 +220,9 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { "new String[] { " + Utility.printArray(mg.getArgumentNames(), false, true) + " }, \"" + method.getName() + "\", \"" + - _clazz.getClassName() + "\", il, _cp);\n"); - + _clazz.getClassName() + "\", il, _cp);"); + _out.println(); + BCELFactory factory = new BCELFactory(mg, _out); factory.start(); -- GitLab From be666e28adffec211b8f43a169a7338e3c7eab8a Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Tue, 2 Sep 2003 15:14:38 +0000 Subject: [PATCH 0180/1313] additions git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152870 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/faq.xml | 7 +++++++ xdocs/index.xml | 8 +++++++- xdocs/projects.xml | 4 ++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/xdocs/faq.xml b/xdocs/faq.xml index d928ca55..46496e7c 100644 --- a/xdocs/faq.xml +++ b/xdocs/faq.xml @@ -63,6 +63,13 @@ util package, namely ClassLoader and JavaWrapper. Take a look at the ProxyCreator example.

          + +

          + Q: I get a verification error, what can I do? +
          + A: Use the JustIce verifier that comes together with BCEL + to get more detailed information. +

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ================================= WARNING ================================ + Junit isn't present in your ${ANT_HOME}/lib directory. Tests not executed. + ========================================================================== + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- GitLab From 08767c65f3010ef397b8d537ccc0866db552f7ca Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Wed, 9 Feb 2005 04:28:29 +0000 Subject: [PATCH 0217/1313] fixed scm info from cvs to svn git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152995 13f79535-47bb-0310-9956-ffa450edef68 --- project.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/project.xml b/project.xml index 7a17affa..ac7e6bbb 100644 --- a/project.xml +++ b/project.xml @@ -21,13 +21,12 @@ http://jakarta.apache.org/bcel/ - http://cvs.apache.org/viewcvs/jakarta-bcel/ jakarta.apache.org /www/jakarta.apache.org/bcel/ - scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-bcel - http://cvs.apache.org/viewcvs/jakarta-bcel/ + scm:svn:http://svn.apache.org/repos/asf/jakarta/bcel/trunk + http://svn.apache.org/viewcvs.cgi/jakarta/bcel/ -- GitLab From 6a18462d6f54702f1ccca48f9ea76d029f303b1b Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Wed, 9 Feb 2005 04:33:19 +0000 Subject: [PATCH 0218/1313] I suspect this file is very dead, but updating for cvs->svn anyway git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@152997 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/stylesheets/project.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xdocs/stylesheets/project.xml b/xdocs/stylesheets/project.xml index 1b10c466..4ce7fae4 100644 --- a/xdocs/stylesheets/project.xml +++ b/xdocs/stylesheets/project.xml @@ -22,7 +22,7 @@ - + -- GitLab From b72be09e6f1693723b62f652f1c953b2cbc08e45 Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Wed, 9 Feb 2005 04:56:25 +0000 Subject: [PATCH 0219/1313] using the same reports as commons lang (the changelog one breaks with svn) and added the apache/jakarta logo git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153006 13f79535-47bb-0310-9956-ffa450edef68 --- project.xml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/project.xml b/project.xml index ac7e6bbb..bc12c66d 100644 --- a/project.xml +++ b/project.xml @@ -8,6 +8,7 @@ Apache Software Foundation http://www.apache.org + http://jakarta.apache.org/images/jakarta-logo.gif 2002 org.apache.bcel @@ -96,5 +97,26 @@ + + + + + maven-checkstyle-plugin + maven-pmd-plugin + + maven-clover-plugin + + + maven-javadoc-plugin + + maven-junit-report-plugin + maven-jxr-plugin + maven-license-plugin + + + maven-tasklist-plugin + + + -- GitLab From 1e7605ee2bfddc26bfb901998e2a4fa834a88195 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 10 Feb 2005 05:56:24 +0000 Subject: [PATCH 0220/1313] Apply Patch 31630 from Rohan Lloyd. Fix parsing problems is java.ext.dirs contain multiple paths. This shows up (at least) on the mac. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153163 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/ClassPath.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index 56486296..f304d45a 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -136,8 +136,8 @@ public class ClassPath implements Serializable { }); if(extensions != null) - for(int i=0; i < extensions.length; i++) - list.add(ext_path + File.separatorChar + extensions[i]); + for(int i=0; i < extensions.length; i++) + list.add(ext_dir.getPath() + File.separatorChar + extensions[i]); } StringBuffer buf = new StringBuffer(); -- GitLab From 2f84a25dd8f29e897754ad886ff9e5dc9d9789c7 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 10 Feb 2005 06:13:01 +0000 Subject: [PATCH 0221/1313] Apply Patch 32077: add a getLocalVariable that takes the current pc, and deprecate the old one that is inprecise. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153168 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/LocalVariableTable.java | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/java/org/apache/bcel/classfile/LocalVariableTable.java index 6492b58c..88933a7d 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -108,7 +108,15 @@ public class LocalVariableTable extends Attribute { return local_variable_table; } - /** @return first matching variable using index + /** + * @return first matching variable using index + * + * @param index the variable slot + * + * @returns the first LocalVariable that matches the slot or null if not found + * + * @deprecated since 5.2 because multiple variables can share the + * same slot, use getLocalVariable(int index, int pc) instead. */ public final LocalVariable getLocalVariable(int index) { for(int i=0; i < local_variable_table_length; i++) @@ -118,6 +126,26 @@ public class LocalVariableTable extends Attribute { return null; } + /** + * @return matching variable using index when variable is used at supplied pc + * + * @param index the variable slot + * @param pc the current pc that this variable is alive + * + * @returns the LocalVariable that matches or null if not found + */ + public final LocalVariable getLocalVariable(int index, int pc) { + for(int i=0; i < local_variable_table_length; i++) + if(local_variable_table[i].getIndex() == index) { + int start_pc = local_variable_table[i].getStartPC(); + int end_pc = start_pc + local_variable_table[i].getLength(); + if ((pc >= start_pc) && (pc < end_pc)) + return local_variable_table[i]; + } + + return null; + } + public final void setLocalVariableTable(LocalVariable[] local_variable_table) { this.local_variable_table = local_variable_table; -- GitLab From da241ba8175bf654bc9871ca346224e1dde19445 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 10 Feb 2005 06:18:38 +0000 Subject: [PATCH 0222/1313] Apply Patch 33018 add missing hashCode methods for those classes that implement .equals(Object) and fix the capitalization of wrongly defined hashcode methods. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153170 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/ArrayType.java | 2 +- src/java/org/apache/bcel/generic/BasicType.java | 4 ++++ src/java/org/apache/bcel/generic/LocalVariableGen.java | 4 ++++ src/java/org/apache/bcel/generic/ReturnaddressType.java | 4 ++++ src/java/org/apache/bcel/verifier/VerificationResult.java | 4 ++++ src/java/org/apache/bcel/verifier/structurals/Frame.java | 4 ++++ .../org/apache/bcel/verifier/structurals/LocalVariables.java | 4 ++++ .../org/apache/bcel/verifier/structurals/OperandStack.java | 4 ++++ .../bcel/verifier/structurals/UninitializedObjectType.java | 4 ++++ 9 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/ArrayType.java b/src/java/org/apache/bcel/generic/ArrayType.java index c6d353d4..d2da786f 100644 --- a/src/java/org/apache/bcel/generic/ArrayType.java +++ b/src/java/org/apache/bcel/generic/ArrayType.java @@ -105,7 +105,7 @@ public final class ArrayType extends ReferenceType { /** @return a hash code value for the object. */ - public int hashcode() { return basic_type.hashCode() ^ dimensions; } + public int hashCode() { return basic_type.hashCode() ^ dimensions; } /** @return true if both type objects refer to the same array type. */ diff --git a/src/java/org/apache/bcel/generic/BasicType.java b/src/java/org/apache/bcel/generic/BasicType.java index f35cc17a..463b0e2f 100644 --- a/src/java/org/apache/bcel/generic/BasicType.java +++ b/src/java/org/apache/bcel/generic/BasicType.java @@ -55,6 +55,10 @@ public final class BasicType extends Type { } } + /** @return a hash code value for the object. + */ + public int hashCode() { return (int)type; } + /** @return true if both type objects refer to the same type */ public boolean equals(Object type) { diff --git a/src/java/org/apache/bcel/generic/LocalVariableGen.java b/src/java/org/apache/bcel/generic/LocalVariableGen.java index 45ae533b..b33959f4 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/java/org/apache/bcel/generic/LocalVariableGen.java @@ -139,6 +139,10 @@ public class LocalVariableGen return (start == ih) || (end == ih); } + /** @return a hash code value for the object. + */ + public int hashCode() { return index ^ start.hashCode() ^ end.hashCode(); } + /** * We consider to local variables to be equal, if the use the same index and * are valid in the same range. diff --git a/src/java/org/apache/bcel/generic/ReturnaddressType.java b/src/java/org/apache/bcel/generic/ReturnaddressType.java index b8a4a95b..105651e8 100644 --- a/src/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/java/org/apache/bcel/generic/ReturnaddressType.java @@ -46,6 +46,10 @@ public class ReturnaddressType extends Type { this.returnTarget = returnTarget; } + /** @return a hash code value for the object. + */ + public int hashCode() { return returnTarget.hashCode(); } + /** * Returns if the two Returnaddresses refer to the same target. */ diff --git a/src/java/org/apache/bcel/verifier/VerificationResult.java b/src/java/org/apache/bcel/verifier/VerificationResult.java index 9f55c13e..20eac408 100644 --- a/src/java/org/apache/bcel/verifier/VerificationResult.java +++ b/src/java/org/apache/bcel/verifier/VerificationResult.java @@ -75,6 +75,10 @@ public class VerificationResult{ return detailMessage; } + /** @return a hash code value for the object. + */ + public int hashCode() { return numeric ^ detailMessage.hashCode(); } + /** * Returns if two VerificationResult instances are equal. */ diff --git a/src/java/org/apache/bcel/verifier/structurals/Frame.java b/src/java/org/apache/bcel/verifier/structurals/Frame.java index 5e21ac72..10fc2c79 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Frame.java +++ b/src/java/org/apache/bcel/verifier/structurals/Frame.java @@ -91,6 +91,10 @@ public class Frame{ return stack; } + /** @return a hash code value for the object. + */ + public int hashCode() { return stack.hashCode() ^ locals.hashCode(); } + /** * */ diff --git a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 86ccc55b..0ddcb8ba 100644 --- a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -88,6 +88,10 @@ public class LocalVariables{ locals[i] = type; } + /** @return a hash code value for the object. + */ + public int hashCode() { return locals.length; } + /* * Fulfills the general contract of Object.equals(). */ diff --git a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/java/org/apache/bcel/verifier/structurals/OperandStack.java index 5cea4c13..9205e152 100644 --- a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -70,6 +70,10 @@ public class OperandStack{ stack = new ArrayList(); } + /** @return a hash code value for the object. + */ + public int hashCode() { return stack.hashCode(); } + /** * Returns true if and only if this OperandStack * equals another, meaning equal lengths and equal diff --git a/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index f9536970..bee7a5ed 100644 --- a/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -47,6 +47,10 @@ public class UninitializedObjectType extends ReferenceType implements Constants{ return initialized; } + /** @return a hash code value for the object. + */ + public int hashCode() { return initialized.hashCode(); } + /** * Returns true on equality of this and o. * Equality means the ObjectType instances of "initialized" -- GitLab From b0f7aa7fa00c94f194559c058fb23803c5519914 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 10 Feb 2005 06:35:15 +0000 Subject: [PATCH 0223/1313] Guard against null InstructionHandle's when calculating hashCode git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153173 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/LocalVariableGen.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/LocalVariableGen.java b/src/java/org/apache/bcel/generic/LocalVariableGen.java index b33959f4..fdacee37 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/java/org/apache/bcel/generic/LocalVariableGen.java @@ -141,7 +141,14 @@ public class LocalVariableGen /** @return a hash code value for the object. */ - public int hashCode() { return index ^ start.hashCode() ^ end.hashCode(); } + public int hashCode() { + int hc = index; + if (start != null) + hc ^= start.hashCode(); + if (end != null) + hc ^= end.hashCode(); + return hc; + } /** * We consider to local variables to be equal, if the use the same index and -- GitLab From c043e3f2934ed7b1eff49fc851016ce0c3b49cc9 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 10 Feb 2005 06:42:37 +0000 Subject: [PATCH 0224/1313] Apply Patch 32945 Make the SyntheticRepository a memory sensitive cache. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153176 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/SyntheticRepository.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/java/org/apache/bcel/util/SyntheticRepository.java index ab7b3e40..72ca2ef2 100644 --- a/src/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/java/org/apache/bcel/util/SyntheticRepository.java @@ -19,6 +19,7 @@ package org.apache.bcel.util; import java.io.IOException; import java.io.InputStream; +import java.lang.ref.SoftReference; import java.util.HashMap; import org.apache.bcel.classfile.ClassParser; @@ -76,7 +77,7 @@ public class SyntheticRepository implements Repository { * Store a new JavaClass instance into this Repository. */ public void storeClass(JavaClass clazz) { - _loadedClasses.put(clazz.getClassName(), clazz); + _loadedClasses.put(clazz.getClassName(), new SoftReference(clazz)); clazz.setRepository(this); } @@ -91,7 +92,10 @@ public class SyntheticRepository implements Repository { * Find an already defined (cached) JavaClass object by name. */ public JavaClass findClass(String className) { - return (JavaClass)_loadedClasses.get(className); + SoftReference ref = (SoftReference)_loadedClasses.get(className); + if (ref == null) + return null; + return (JavaClass)ref.get(); } /** -- GitLab From 54e0fd3bc540b1c1728cdf2ffb9c2411196eab25 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 10 Feb 2005 06:47:28 +0000 Subject: [PATCH 0225/1313] Apply Patch 33302 Expose support for new access flags; synthetic, Annotation, Enum. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153177 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Constants.java | 9 +++++++-- .../org/apache/bcel/classfile/AccessFlags.java | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/Constants.java b/src/java/org/apache/bcel/Constants.java index 02f95b6a..52373e55 100644 --- a/src/java/org/apache/bcel/Constants.java +++ b/src/java/org/apache/bcel/Constants.java @@ -42,15 +42,20 @@ public interface Constants { public final static short ACC_INTERFACE = 0x0200; public final static short ACC_ABSTRACT = 0x0400; public final static short ACC_STRICT = 0x0800; + + public final static short ACC_SYNTHETIC = 0x1000; + public final static short ACC_ANNOTATION = 0x2000; + public final static short ACC_ENUM = 0x4000; // Applies to classes compiled by new compilers only public final static short ACC_SUPER = 0x0020; - public final static short MAX_ACC_FLAG = ACC_STRICT; + public final static short MAX_ACC_FLAG = ACC_ENUM; public final static String[] ACCESS_NAMES = { "public", "private", "protected", "static", "final", "synchronized", - "volatile", "transient", "native", "interface", "abstract", "strictfp" + "volatile", "transient", "native", "interface", "abstract", "strictfp", + "synthetic", "annotation", "enum" }; /** Tags in constant pool to denote type of constant. diff --git a/src/java/org/apache/bcel/classfile/AccessFlags.java b/src/java/org/apache/bcel/classfile/AccessFlags.java index a020f4bf..3af30e8e 100644 --- a/src/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/java/org/apache/bcel/classfile/AccessFlags.java @@ -130,4 +130,19 @@ public abstract class AccessFlags implements java.io.Serializable { public final boolean isStrictfp() { return (access_flags & Constants.ACC_STRICT) != 0; } + + public final void isSynthetic(boolean flag) { setFlag(Constants.ACC_SYNTHETIC, flag); } + public final boolean isSynthetic() { + return (access_flags & Constants.ACC_SYNTHETIC) != 0; + } + + public final void isAnnotation(boolean flag) { setFlag(Constants.ACC_ANNOTATION, flag); } + public final boolean isAnnotation() { + return (access_flags & Constants.ACC_ANNOTATION) != 0; + } + + public final void isEnum(boolean flag) { setFlag(Constants.ACC_ENUM, flag); } + public final boolean isEnum() { + return (access_flags & Constants.ACC_ENUM) != 0; + } } -- GitLab From 6cb47ba686e871907a50459ca1288bbf0bda06e7 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 10 Feb 2005 06:50:44 +0000 Subject: [PATCH 0226/1313] add contact info git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153178 13f79535-47bb-0310-9956-ffa450edef68 --- project.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/project.xml b/project.xml index bc12c66d..b77cdd54 100644 --- a/project.xml +++ b/project.xml @@ -68,6 +68,13 @@ convergence + + Dave Brosius + dbrosius + dbrosius@qis.net + + + -- GitLab From ff53d1ee023ba56097fc1b0da5a0f3af67d8857f Mon Sep 17 00:00:00 2001 From: David Brosius Date: Fri, 11 Feb 2005 03:17:49 +0000 Subject: [PATCH 0227/1313] Apply Patch 27646 from Stephan Michels to change method OperandStack.size() to be public git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153332 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/structurals/OperandStack.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/java/org/apache/bcel/verifier/structurals/OperandStack.java index 9205e152..0297604b 100644 --- a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -158,7 +158,7 @@ public class OperandStack{ /** * Returns the size of this OperandStack; that means, how many Type objects there are. */ - int size(){ + public int size(){ return stack.size(); } -- GitLab From 3c391bc8e78574921bb2ef080ee802a6827b214d Mon Sep 17 00:00:00 2001 From: David Brosius Date: Fri, 11 Feb 2005 03:23:49 +0000 Subject: [PATCH 0228/1313] Bug Report 24274 from David Foster appears to have already been fixed, however this fixes hashCode to protect against null pointer exceptions in the same way. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153334 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/ReturnaddressType.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/ReturnaddressType.java b/src/java/org/apache/bcel/generic/ReturnaddressType.java index 105651e8..086c4ad8 100644 --- a/src/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/java/org/apache/bcel/generic/ReturnaddressType.java @@ -48,7 +48,11 @@ public class ReturnaddressType extends Type { /** @return a hash code value for the object. */ - public int hashCode() { return returnTarget.hashCode(); } + public int hashCode() { + if (returnTarget == null) + return 0; + return returnTarget.hashCode(); + } /** * Returns if the two Returnaddresses refer to the same target. -- GitLab From 8dede84ce5aaded444833f97c5a0501b609cd984 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Fri, 11 Feb 2005 03:30:25 +0000 Subject: [PATCH 0229/1313] Apply Patch 19784 from Mark Crocker to guard against StackMap indexes being invalid for ITEM_Objects. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153335 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/StackMapType.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/StackMapType.java b/src/java/org/apache/bcel/classfile/StackMapType.java index 19d47dc1..bb99d180 100644 --- a/src/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/java/org/apache/bcel/classfile/StackMapType.java @@ -95,9 +95,11 @@ public final class StackMapType implements Cloneable { } private String printIndex() { - if(type == Constants.ITEM_Object) - return ", class=" + constant_pool.constantToString(index, Constants.CONSTANT_Class); - else if(type == Constants.ITEM_NewObject) + if(type == Constants.ITEM_Object) { + if (index < 0) + return ", class="; + return ", class=" + constant_pool.constantToString(index, Constants.CONSTANT_Class); + } else if(type == Constants.ITEM_NewObject) return ", offset=" + index; else return ""; -- GitLab From 74aa43f584d21e770aea4feb5d341731ab2f0c5a Mon Sep 17 00:00:00 2001 From: David Brosius Date: Fri, 11 Feb 2005 04:01:09 +0000 Subject: [PATCH 0230/1313] Add newer class files format constants git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153340 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Constants.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/java/org/apache/bcel/Constants.java b/src/java/org/apache/bcel/Constants.java index 52373e55..622b6a32 100644 --- a/src/java/org/apache/bcel/Constants.java +++ b/src/java/org/apache/bcel/Constants.java @@ -15,6 +15,10 @@ public interface Constants { public final static short MINOR_1_2 = 0; public final static short MAJOR_1_3 = 47; public final static short MINOR_1_3 = 0; + public final static short MAJOR_1_4 = 48; + public final static short MINOR_1_4 = 0; + public final static short MAJOR_1_5 = 49; + public final static short MINOR_1_5 = 0; public final static short MAJOR = MAJOR_1_1; // Defaults public final static short MINOR = MINOR_1_1; -- GitLab From 816a777a77eeeebdd4f244e3ce968760d1e7550b Mon Sep 17 00:00:00 2001 From: David Brosius Date: Fri, 11 Feb 2005 06:22:47 +0000 Subject: [PATCH 0231/1313] JavaDoc and simple warnings cleanup git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153369 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/Code.java | 6 ++++-- src/java/org/apache/bcel/classfile/CodeException.java | 2 +- src/java/org/apache/bcel/classfile/ConstantClass.java | 2 +- src/java/org/apache/bcel/classfile/ConstantDouble.java | 2 +- src/java/org/apache/bcel/classfile/ConstantFloat.java | 2 +- src/java/org/apache/bcel/classfile/ConstantInteger.java | 2 +- src/java/org/apache/bcel/classfile/ConstantLong.java | 2 +- .../org/apache/bcel/classfile/ConstantNameAndType.java | 6 +++--- src/java/org/apache/bcel/classfile/ConstantString.java | 5 +++-- src/java/org/apache/bcel/classfile/ConstantUtf8.java | 2 +- src/java/org/apache/bcel/classfile/ConstantValue.java | 4 ++-- src/java/org/apache/bcel/classfile/Deprecated.java | 4 ++-- src/java/org/apache/bcel/classfile/ExceptionTable.java | 4 ++-- src/java/org/apache/bcel/classfile/InnerClass.java | 8 ++++---- src/java/org/apache/bcel/classfile/InnerClasses.java | 2 +- src/java/org/apache/bcel/classfile/LineNumber.java | 4 ++-- src/java/org/apache/bcel/classfile/LineNumberTable.java | 2 +- src/java/org/apache/bcel/classfile/LocalVariable.java | 8 ++++---- src/java/org/apache/bcel/classfile/PMGClass.java | 4 ++-- src/java/org/apache/bcel/classfile/Signature.java | 2 +- src/java/org/apache/bcel/classfile/SourceFile.java | 2 +- src/java/org/apache/bcel/classfile/Synthetic.java | 4 ++-- src/java/org/apache/bcel/classfile/Unknown.java | 2 +- src/java/org/apache/bcel/classfile/Utility.java | 2 +- 24 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/Code.java b/src/java/org/apache/bcel/classfile/Code.java index 004722d8..d47ec4c6 100644 --- a/src/java/org/apache/bcel/classfile/Code.java +++ b/src/java/org/apache/bcel/classfile/Code.java @@ -240,7 +240,7 @@ public final class Code extends Attribute { } /** - * @param attributes. + * @param attributes the attributes to set for this Code */ public final void setAttributes(Attribute[] attributes) { this.attributes = attributes; @@ -316,10 +316,12 @@ public final class Code extends Attribute { /** * @return deep copy of this attribute + * + * @param constant_pool the constant pool to duplicate */ public Attribute copy(ConstantPool constant_pool) { Code c = (Code)clone(); - c.code = (byte[])code.clone(); + c.code = code.clone(); c.constant_pool = constant_pool; c.exception_table = new CodeException[exception_table_length]; diff --git a/src/java/org/apache/bcel/classfile/CodeException.java b/src/java/org/apache/bcel/classfile/CodeException.java index 5cad57ee..91d24052 100644 --- a/src/java/org/apache/bcel/classfile/CodeException.java +++ b/src/java/org/apache/bcel/classfile/CodeException.java @@ -124,7 +124,7 @@ public final class CodeException public final int getStartPC() { return start_pc; } /** - * @param catch_type. + * @param catch_type the type of exception that is caught */ public final void setCatchType(int catch_type) { this.catch_type = catch_type; diff --git a/src/java/org/apache/bcel/classfile/ConstantClass.java b/src/java/org/apache/bcel/classfile/ConstantClass.java index 8528545d..c91ba38b 100644 --- a/src/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/java/org/apache/bcel/classfile/ConstantClass.java @@ -87,7 +87,7 @@ public final class ConstantClass extends Constant implements ConstantObject { public final int getNameIndex() { return name_index; } /** - * @param name_index. + * @param name_index the name index in the constant pool of this Constant Class */ public final void setNameIndex(int name_index) { this.name_index = name_index; diff --git a/src/java/org/apache/bcel/classfile/ConstantDouble.java b/src/java/org/apache/bcel/classfile/ConstantDouble.java index 02f83759..30f04df7 100644 --- a/src/java/org/apache/bcel/classfile/ConstantDouble.java +++ b/src/java/org/apache/bcel/classfile/ConstantDouble.java @@ -83,7 +83,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { */ public final double getBytes() { return bytes; } /** - * @param bytes. + * @param bytes the raw bytes that represent the double value */ public final void setBytes(double bytes) { this.bytes = bytes; diff --git a/src/java/org/apache/bcel/classfile/ConstantFloat.java b/src/java/org/apache/bcel/classfile/ConstantFloat.java index 88e1d4b7..d711a248 100644 --- a/src/java/org/apache/bcel/classfile/ConstantFloat.java +++ b/src/java/org/apache/bcel/classfile/ConstantFloat.java @@ -82,7 +82,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { */ public final float getBytes() { return bytes; } /** - * @param bytes. + * @param bytes the raw bytes that represent this float */ public final void setBytes(float bytes) { this.bytes = bytes; diff --git a/src/java/org/apache/bcel/classfile/ConstantInteger.java b/src/java/org/apache/bcel/classfile/ConstantInteger.java index 4b60fd6c..178a152e 100644 --- a/src/java/org/apache/bcel/classfile/ConstantInteger.java +++ b/src/java/org/apache/bcel/classfile/ConstantInteger.java @@ -87,7 +87,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { public final int getBytes() { return bytes; } /** - * @param bytes. + * @param bytes the raw bytes that represent this integer */ public final void setBytes(int bytes) { this.bytes = bytes; diff --git a/src/java/org/apache/bcel/classfile/ConstantLong.java b/src/java/org/apache/bcel/classfile/ConstantLong.java index e16ed038..d3e4a362 100644 --- a/src/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/java/org/apache/bcel/classfile/ConstantLong.java @@ -81,7 +81,7 @@ public final class ConstantLong extends Constant implements ConstantObject { */ public final long getBytes() { return bytes; } /** - * @param bytes. + * @param bytes thr raw bytes that represent this long */ public final void setBytes(long bytes) { this.bytes = bytes; diff --git a/src/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/java/org/apache/bcel/classfile/ConstantNameAndType.java index ccab886d..c8b67c49 100644 --- a/src/java/org/apache/bcel/classfile/ConstantNameAndType.java +++ b/src/java/org/apache/bcel/classfile/ConstantNameAndType.java @@ -48,7 +48,7 @@ public final class ConstantNameAndType extends Constant { */ ConstantNameAndType(DataInputStream file) throws IOException { - this((int)file.readUnsignedShort(), (int)file.readUnsignedShort()); + this(file.readUnsignedShort(), file.readUnsignedShort()); } /** @@ -110,14 +110,14 @@ public final class ConstantNameAndType extends Constant { } /** - * @param name_index. + * @param name_index the name index of this constant */ public final void setNameIndex(int name_index) { this.name_index = name_index; } /** - * @param signature_index. + * @param signature_index the signature index in the constant pool of this type */ public final void setSignatureIndex(int signature_index) { this.signature_index = signature_index; diff --git a/src/java/org/apache/bcel/classfile/ConstantString.java b/src/java/org/apache/bcel/classfile/ConstantString.java index 40107910..95c04148 100644 --- a/src/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/java/org/apache/bcel/classfile/ConstantString.java @@ -45,7 +45,7 @@ public final class ConstantString extends Constant implements ConstantObject { */ ConstantString(DataInputStream file) throws IOException { - this((int)file.readUnsignedShort()); + this(file.readUnsignedShort()); } /** * @param string_index Index of Constant_Utf8 in constant pool @@ -80,8 +80,9 @@ public final class ConstantString extends Constant implements ConstantObject { * @return Index in constant pool of the string (ConstantUtf8). */ public final int getStringIndex() { return string_index; } + /** - * @param string_index. + * @param string_index the index into the constant of the string value */ public final void setStringIndex(int string_index) { this.string_index = string_index; diff --git a/src/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/java/org/apache/bcel/classfile/ConstantUtf8.java index 20370a91..b790a0fa 100644 --- a/src/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -94,7 +94,7 @@ public final class ConstantUtf8 extends Constant { public final String getBytes() { return bytes; } /** - * @param bytes. + * @param bytes the raw bytes of this Utf-8 */ public final void setBytes(String bytes) { this.bytes = bytes; diff --git a/src/java/org/apache/bcel/classfile/ConstantValue.java b/src/java/org/apache/bcel/classfile/ConstantValue.java index 70e1b909..483587a3 100644 --- a/src/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/java/org/apache/bcel/classfile/ConstantValue.java @@ -52,7 +52,7 @@ public final class ConstantValue extends Attribute { ConstantValue(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException { - this(name_index, length, (int)file.readUnsignedShort(), constant_pool); + this(name_index, length, file.readUnsignedShort(), constant_pool); } /** @@ -96,7 +96,7 @@ public final class ConstantValue extends Attribute { public final int getConstantValueIndex() { return constantvalue_index; } /** - * @param constantvalue_index. + * @param constantvalue_index the index info the constant pool of this constant value */ public final void setConstantValueIndex(int constantvalue_index) { this.constantvalue_index = constantvalue_index; diff --git a/src/java/org/apache/bcel/classfile/Deprecated.java b/src/java/org/apache/bcel/classfile/Deprecated.java index 167340ab..cb592887 100644 --- a/src/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/java/org/apache/bcel/classfile/Deprecated.java @@ -104,7 +104,7 @@ public final class Deprecated extends Attribute { public final byte[] getBytes() { return bytes; } /** - * @param bytes. + * @param bytes the raw bytes that represents this byte array */ public final void setBytes(byte[] bytes) { this.bytes = bytes; @@ -124,7 +124,7 @@ public final class Deprecated extends Attribute { Deprecated c = (Deprecated)clone(); if(bytes != null) - c.bytes = (byte[])bytes.clone(); + c.bytes = bytes.clone(); c.constant_pool = constant_pool; return c; diff --git a/src/java/org/apache/bcel/classfile/ExceptionTable.java b/src/java/org/apache/bcel/classfile/ExceptionTable.java index e76eec17..062327f3 100644 --- a/src/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/java/org/apache/bcel/classfile/ExceptionTable.java @@ -126,7 +126,7 @@ public final class ExceptionTable extends Attribute { } /** - * @param exception_index_table. + * @param exception_index_table the list of exception indexes * Also redefines number_of_exceptions according to table length. */ public final void setExceptionIndexTable(int[] exception_index_table) { @@ -158,7 +158,7 @@ public final class ExceptionTable extends Attribute { */ public Attribute copy(ConstantPool constant_pool) { ExceptionTable c = (ExceptionTable)clone(); - c.exception_index_table = (int[])exception_index_table.clone(); + c.exception_index_table = exception_index_table.clone(); c.constant_pool = constant_pool; return c; } diff --git a/src/java/org/apache/bcel/classfile/InnerClass.java b/src/java/org/apache/bcel/classfile/InnerClass.java index d55da651..2345a7e7 100644 --- a/src/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/java/org/apache/bcel/classfile/InnerClass.java @@ -109,25 +109,25 @@ public final class InnerClass implements Cloneable, Node { */ public final int getOuterClassIndex() { return outer_class_index; } /** - * @param inner_access_flags. + * @param inner_access_flags access flags for this inner class */ public final void setInnerAccessFlags(int inner_access_flags) { this.inner_access_flags = inner_access_flags; } /** - * @param inner_class_index. + * @param inner_class_index index into the constant pool for this class */ public final void setInnerClassIndex(int inner_class_index) { this.inner_class_index = inner_class_index; } /** - * @param inner_name_index. + * @param inner_name_index index into the constant pool for this class's name */ public final void setInnerNameIndex(int inner_name_index) { this.inner_name_index = inner_name_index; } /** - * @param outer_class_index. + * @param outer_class_index index into the constant pool for the owning class */ public final void setOuterClassIndex(int outer_class_index) { this.outer_class_index = outer_class_index; diff --git a/src/java/org/apache/bcel/classfile/InnerClasses.java b/src/java/org/apache/bcel/classfile/InnerClasses.java index 159d2b48..5d954ee4 100644 --- a/src/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/java/org/apache/bcel/classfile/InnerClasses.java @@ -108,7 +108,7 @@ public final class InnerClasses extends Attribute { public final InnerClass[] getInnerClasses() { return inner_classes; } /** - * @param inner_classes. + * @param inner_classes the array of inner classes */ public final void setInnerClasses(InnerClass[] inner_classes) { this.inner_classes = inner_classes; diff --git a/src/java/org/apache/bcel/classfile/LineNumber.java b/src/java/org/apache/bcel/classfile/LineNumber.java index 11acd606..bc9a2640 100644 --- a/src/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/java/org/apache/bcel/classfile/LineNumber.java @@ -96,14 +96,14 @@ public final class LineNumber implements Cloneable, Node, Serializable { public final int getStartPC() { return start_pc; } /** - * @param line_number. + * @param line_number the source line number */ public final void setLineNumber(int line_number) { this.line_number = line_number; } /** - * @param start_pc. + * @param start_pc the pc for this line number */ public final void setStartPC(int start_pc) { this.start_pc = start_pc; diff --git a/src/java/org/apache/bcel/classfile/LineNumberTable.java b/src/java/org/apache/bcel/classfile/LineNumberTable.java index 39814c16..a65c933a 100644 --- a/src/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/java/org/apache/bcel/classfile/LineNumberTable.java @@ -105,7 +105,7 @@ public final class LineNumberTable extends Attribute { public final LineNumber[] getLineNumberTable() { return line_number_table; } /** - * @param line_number_table. + * @param line_number_table the line number entries for this table */ public final void setLineNumberTable(LineNumber[] line_number_table) { this.line_number_table = line_number_table; diff --git a/src/java/org/apache/bcel/classfile/LocalVariable.java b/src/java/org/apache/bcel/classfile/LocalVariable.java index 3114aa80..f9dcce2b 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariable.java @@ -167,28 +167,28 @@ public final class LocalVariable } /** - * @param length. + * @param length the length of this local variable */ public final void setLength(int length) { this.length = length; } /** - * @param name_index. + * @param name_index the index into the constant pool for the name of this variable */ public final void setNameIndex(int name_index) { this.name_index = name_index; } /** - * @param signature_index. + * @param signature_index the index into the constant pool for the signature of this variable */ public final void setSignatureIndex(int signature_index) { this.signature_index = signature_index; } /** - * @param index. + * @param index the index in the local variable table of this variable */ public final void setIndex(int index) { this.index = index; } diff --git a/src/java/org/apache/bcel/classfile/PMGClass.java b/src/java/org/apache/bcel/classfile/PMGClass.java index 6de2aba7..8585632e 100644 --- a/src/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/java/org/apache/bcel/classfile/PMGClass.java @@ -101,7 +101,7 @@ public final class PMGClass extends Attribute { public final int getPMGClassIndex() { return pmg_class_index; } /** - * @param PMGClass_index. + * @param pmg_class_index */ public final void setPMGClassIndex(int pmg_class_index) { this.pmg_class_index = pmg_class_index; @@ -113,7 +113,7 @@ public final class PMGClass extends Attribute { public final int getPMGIndex() { return pmg_index; } /** - * @param PMGClass_index. + * @param pmg_index */ public final void setPMGIndex(int pmg_index) { this.pmg_index = pmg_index; diff --git a/src/java/org/apache/bcel/classfile/Signature.java b/src/java/org/apache/bcel/classfile/Signature.java index 10ddc06d..319e3b55 100644 --- a/src/java/org/apache/bcel/classfile/Signature.java +++ b/src/java/org/apache/bcel/classfile/Signature.java @@ -96,7 +96,7 @@ public final class Signature extends Attribute { public final int getSignatureIndex() { return signature_index; } /** - * @param signature_index. + * @param signature_index the index info the constant pool of this signature */ public final void setSignatureIndex(int signature_index) { this.signature_index = signature_index; diff --git a/src/java/org/apache/bcel/classfile/SourceFile.java b/src/java/org/apache/bcel/classfile/SourceFile.java index 4c968d3d..a456526c 100644 --- a/src/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/java/org/apache/bcel/classfile/SourceFile.java @@ -105,7 +105,7 @@ public final class SourceFile extends Attribute { public final int getSourceFileIndex() { return sourcefile_index; } /** - * @param sourcefile_index. + * @param sourcefile_index */ public final void setSourceFileIndex(int sourcefile_index) { this.sourcefile_index = sourcefile_index; diff --git a/src/java/org/apache/bcel/classfile/Synthetic.java b/src/java/org/apache/bcel/classfile/Synthetic.java index 993ade28..b9982fed 100644 --- a/src/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/java/org/apache/bcel/classfile/Synthetic.java @@ -106,7 +106,7 @@ public final class Synthetic extends Attribute { public final byte[] getBytes() { return bytes; } /** - * @param bytes. + * @param bytes */ public final void setBytes(byte[] bytes) { this.bytes = bytes; @@ -131,7 +131,7 @@ public final class Synthetic extends Attribute { Synthetic c = (Synthetic)clone(); if(bytes != null) - c.bytes = (byte[])bytes.clone(); + c.bytes = bytes.clone(); c.constant_pool = constant_pool; return c; diff --git a/src/java/org/apache/bcel/classfile/Unknown.java b/src/java/org/apache/bcel/classfile/Unknown.java index 4b82cba2..6bff40de 100644 --- a/src/java/org/apache/bcel/classfile/Unknown.java +++ b/src/java/org/apache/bcel/classfile/Unknown.java @@ -168,7 +168,7 @@ public final class Unknown extends Attribute { Unknown c = (Unknown)clone(); if(bytes != null) - c.bytes = (byte[])bytes.clone(); + c.bytes = bytes.clone(); c.constant_pool = constant_pool; return c; diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 23e8c4d5..567dee72 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -1245,7 +1245,7 @@ public abstract class Utility { private static final char ESCAPE_CHAR = '$'; static { - int j = 0, k = 0; + int j = 0; for(int i='A'; i <= 'Z'; i++) { CHAR_MAP[j] = i; MAP_CHAR[i] = j; -- GitLab From 2d9218029f419a616bb6a757868ed304063d1ac6 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Fri, 11 Feb 2005 10:23:36 +0000 Subject: [PATCH 0232/1313] fixed the deep cloning git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153380 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/Code.java | 9 +++++++-- src/java/org/apache/bcel/classfile/Deprecated.java | 6 ++++-- src/java/org/apache/bcel/classfile/ExceptionTable.java | 7 ++++++- src/java/org/apache/bcel/classfile/Synthetic.java | 6 ++++-- src/java/org/apache/bcel/classfile/Unknown.java | 6 ++++-- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/Code.java b/src/java/org/apache/bcel/classfile/Code.java index d47ec4c6..9f85138f 100644 --- a/src/java/org/apache/bcel/classfile/Code.java +++ b/src/java/org/apache/bcel/classfile/Code.java @@ -320,8 +320,13 @@ public final class Code extends Attribute { * @param constant_pool the constant pool to duplicate */ public Attribute copy(ConstantPool constant_pool) { - Code c = (Code)clone(); - c.code = code.clone(); + Code c = (Code) clone(); + + if (code != null) { + c.code = new byte[code.length]; + System.arraycopy(code, 0, c.code, 0, code.length); + } + c.constant_pool = constant_pool; c.exception_table = new CodeException[exception_table_length]; diff --git a/src/java/org/apache/bcel/classfile/Deprecated.java b/src/java/org/apache/bcel/classfile/Deprecated.java index cb592887..fde6e337 100644 --- a/src/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/java/org/apache/bcel/classfile/Deprecated.java @@ -123,8 +123,10 @@ public final class Deprecated extends Attribute { public Attribute copy(ConstantPool constant_pool) { Deprecated c = (Deprecated)clone(); - if(bytes != null) - c.bytes = bytes.clone(); + if (bytes != null) { + c.bytes = new byte[bytes.length]; + System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); + } c.constant_pool = constant_pool; return c; diff --git a/src/java/org/apache/bcel/classfile/ExceptionTable.java b/src/java/org/apache/bcel/classfile/ExceptionTable.java index 062327f3..9e1c95f6 100644 --- a/src/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/java/org/apache/bcel/classfile/ExceptionTable.java @@ -158,7 +158,12 @@ public final class ExceptionTable extends Attribute { */ public Attribute copy(ConstantPool constant_pool) { ExceptionTable c = (ExceptionTable)clone(); - c.exception_index_table = exception_index_table.clone(); + + if (exception_index_table != null) { + c.exception_index_table = new int[exception_index_table.length]; + System.arraycopy(exception_index_table, 0, c.exception_index_table, 0, exception_index_table.length); + } + c.constant_pool = constant_pool; return c; } diff --git a/src/java/org/apache/bcel/classfile/Synthetic.java b/src/java/org/apache/bcel/classfile/Synthetic.java index b9982fed..78ee5d83 100644 --- a/src/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/java/org/apache/bcel/classfile/Synthetic.java @@ -130,8 +130,10 @@ public final class Synthetic extends Attribute { public Attribute copy(ConstantPool constant_pool) { Synthetic c = (Synthetic)clone(); - if(bytes != null) - c.bytes = bytes.clone(); + if (bytes != null) { + c.bytes = new byte[bytes.length]; + System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); + } c.constant_pool = constant_pool; return c; diff --git a/src/java/org/apache/bcel/classfile/Unknown.java b/src/java/org/apache/bcel/classfile/Unknown.java index 6bff40de..fe40c657 100644 --- a/src/java/org/apache/bcel/classfile/Unknown.java +++ b/src/java/org/apache/bcel/classfile/Unknown.java @@ -167,8 +167,10 @@ public final class Unknown extends Attribute { public Attribute copy(ConstantPool constant_pool) { Unknown c = (Unknown)clone(); - if(bytes != null) - c.bytes = bytes.clone(); + if (bytes != null) { + c.bytes = new byte[bytes.length]; + System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); + } c.constant_pool = constant_pool; return c; -- GitLab From 244a45c01154b9615e131128800f4294e66741ab Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sat, 12 Feb 2005 07:33:30 +0000 Subject: [PATCH 0233/1313] Apply Patch 26533 from Andrew Huntwork which fixes the IINC instruction size when the variable index is greater than 255. (setWide) git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153488 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/IINC.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/IINC.java b/src/java/org/apache/bcel/generic/IINC.java index 70b9533d..06bc63bf 100644 --- a/src/java/org/apache/bcel/generic/IINC.java +++ b/src/java/org/apache/bcel/generic/IINC.java @@ -69,7 +69,7 @@ public class IINC extends LocalVariableInstruction { } private final void setWide() { - if(wide = ((n > org.apache.bcel.Constants.MAX_SHORT) || + if(wide = ((n > org.apache.bcel.Constants.MAX_BYTE) || (Math.abs(c) > Byte.MAX_VALUE))) length = 6; // wide byte included else -- GitLab From 6575337f19e161dbde3a83e3c178408717275892 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 13 Feb 2005 03:15:08 +0000 Subject: [PATCH 0234/1313] Initial implementation for Annotations. This code is currently not used, as the break out of Attributes for Annotations is commented out in Attributes.read. The ElementValue class will be derived from to support the different ElementValue types, for now it's an icky 'union' class. The "Parameter' type of Annotations are to be added next. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153590 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Constants.java | 35 +++--- .../bcel/classfile/AnnotationEntry.java | 85 ++++++++++++++ .../apache/bcel/classfile/Annotations.java | 108 ++++++++++++++++++ .../org/apache/bcel/classfile/Attribute.java | 6 + .../bcel/classfile/DescendingVisitor.java | 16 +++ .../apache/bcel/classfile/ElementValue.java | 87 ++++++++++++++ .../bcel/classfile/ElementValuePair.java | 46 ++++++++ .../apache/bcel/classfile/EmptyVisitor.java | 2 + .../RuntimeInvisibleAnnotations.java | 54 +++++++++ .../classfile/RuntimeVisibleAnnotations.java | 54 +++++++++ .../org/apache/bcel/classfile/Visitor.java | 2 + 11 files changed, 479 insertions(+), 16 deletions(-) create mode 100644 src/java/org/apache/bcel/classfile/AnnotationEntry.java create mode 100644 src/java/org/apache/bcel/classfile/Annotations.java create mode 100644 src/java/org/apache/bcel/classfile/ElementValue.java create mode 100644 src/java/org/apache/bcel/classfile/ElementValuePair.java create mode 100644 src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java create mode 100644 src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java diff --git a/src/java/org/apache/bcel/Constants.java b/src/java/org/apache/bcel/Constants.java index 622b6a32..2f570035 100644 --- a/src/java/org/apache/bcel/Constants.java +++ b/src/java/org/apache/bcel/Constants.java @@ -698,27 +698,30 @@ public interface Constants { /** Attributes and their corresponding names. */ - public static final byte ATTR_UNKNOWN = -1; - public static final byte ATTR_SOURCE_FILE = 0; - public static final byte ATTR_CONSTANT_VALUE = 1; - public static final byte ATTR_CODE = 2; - public static final byte ATTR_EXCEPTIONS = 3; - public static final byte ATTR_LINE_NUMBER_TABLE = 4; - public static final byte ATTR_LOCAL_VARIABLE_TABLE = 5; - public static final byte ATTR_INNER_CLASSES = 6; - public static final byte ATTR_SYNTHETIC = 7; - public static final byte ATTR_DEPRECATED = 8; - public static final byte ATTR_PMG = 9; - public static final byte ATTR_SIGNATURE = 10; - public static final byte ATTR_STACK_MAP = 11; - - public static final short KNOWN_ATTRIBUTES = 12; + public static final byte ATTR_UNKNOWN = -1; + public static final byte ATTR_SOURCE_FILE = 0; + public static final byte ATTR_CONSTANT_VALUE = 1; + public static final byte ATTR_CODE = 2; + public static final byte ATTR_EXCEPTIONS = 3; + public static final byte ATTR_LINE_NUMBER_TABLE = 4; + public static final byte ATTR_LOCAL_VARIABLE_TABLE = 5; + public static final byte ATTR_INNER_CLASSES = 6; + public static final byte ATTR_SYNTHETIC = 7; + public static final byte ATTR_DEPRECATED = 8; + public static final byte ATTR_PMG = 9; + public static final byte ATTR_SIGNATURE = 10; + public static final byte ATTR_STACK_MAP = 11; + public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = 12; + public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = 13; + + public static final short KNOWN_ATTRIBUTES = 14; public static final String[] ATTRIBUTE_NAMES = { "SourceFile", "ConstantValue", "Code", "Exceptions", "LineNumberTable", "LocalVariableTable", "InnerClasses", "Synthetic", "Deprecated", - "PMGClass", "Signature", "StackMap" + "PMGClass", "Signature", "StackMap", + "RuntimeVisibleAnnotations", "RuntimeInvisibleAnnotations" }; /** Constants used in the StackMap attribute. diff --git a/src/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/java/org/apache/bcel/classfile/AnnotationEntry.java new file mode 100644 index 00000000..91a17d3b --- /dev/null +++ b/src/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -0,0 +1,85 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + + +/** + * represents one annotation in the annotation table + * + * @version $Id: AnnotationEntry + * @author D. Brosius + */ +public class AnnotationEntry implements Node, Constants +{ + private int type_index; + private int num_element_value_pairs; + private ElementValuePair[] element_value_pairs; + private ConstantPool constant_pool; + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + AnnotationEntry(DataInputStream file, ConstantPool constant_pool) + throws IOException + { + type_index = (file.readUnsignedShort()); + num_element_value_pairs = (file.readUnsignedShort()); + + element_value_pairs = new ElementValuePair[num_element_value_pairs]; + for(int i=0; i < num_element_value_pairs; i++) + element_value_pairs[i] = new ElementValuePair(file, constant_pool); + this.constant_pool = constant_pool; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitAnnotationEntry(this); + } + + /** + * @return the annotation type name + */ + public String getAnnotationType() { + ConstantUtf8 c; + + c = (ConstantUtf8)constant_pool.getConstant(type_index, CONSTANT_Utf8); + return c.getBytes(); + } + + /** + * @returns the number of element value pairs in this annotation entry + */ + public final int getNumElementValuePairs() { return num_element_value_pairs; } + + /** + * @return the element value pairs in this annotation entry + */ + public ElementValuePair[] getElementValuePairs() { return element_value_pairs; } +} diff --git a/src/java/org/apache/bcel/classfile/Annotations.java b/src/java/org/apache/bcel/classfile/Annotations.java new file mode 100644 index 00000000..50d130a3 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/Annotations.java @@ -0,0 +1,108 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * base class for annotations + * + * @version $Id: Annotations + * @author D. Brosius + */ +public abstract class Annotations extends Attribute { + + private int annotation_table_length; + private AnnotationEntry[] annotation_table; // Table of annotations + + /** + * @param annotation_type the subclass type of the annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + Annotations(byte annotation_type, int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool); + + annotation_table_length = (file.readUnsignedShort()); + annotation_table = new AnnotationEntry[annotation_table_length]; + + for(int i=0; i < annotation_table_length; i++) + annotation_table[i] = new AnnotationEntry(file, constant_pool); + } + + /** + * @param annotation_type the subclass type of the annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param annotation_table the actual annotations + * @param constant_pool Array of constants + */ + public Annotations(byte annotation_type, int name_index, int length, AnnotationEntry[] annotation_table, ConstantPool constant_pool) + { + super(annotation_type, name_index, length, constant_pool); + setAnnotationTable(annotation_table); + + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { + v.visitAnnotation(this); + } + + /** + * @param annotation_table the entries to set in this annotation + */ + public final void setAnnotationTable(AnnotationEntry[] annotation_table) + { + this.annotation_table = annotation_table; + annotation_table_length = (annotation_table == null)? 0 : + annotation_table.length; + } + + /** + * @returns the annotation entry table + */ + public final AnnotationEntry[] GetAnnotationTable() + { + return annotation_table; + } + + /** + * returns the array of annotation entries in this annotation + */ + public AnnotationEntry[] getAnnotationEntries() { + return annotation_table; + } + + /** + * @returns the number of annotation entries in this annotation + */ + public final int getNumAnnotation() { return annotation_table_length; } +} diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index 8c46c4cd..7b3a0fd3 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -183,6 +183,12 @@ public abstract class Attribute implements Cloneable, Node, Serializable { case Constants.ATTR_STACK_MAP: return new StackMap(name_index, length, file, constant_pool); +// case Constants.ATTR_RUNTIMEVISIBLE_ANNOTATIONS: +// return new RuntimeVisibleAnnotations(name_index, length, file, constant_pool); + +// case Constants.ATTR_RUNTIMEINVISIBLE_ANNOTATIONS: +// return new RuntimeInvisibleAnnotations(name_index, length, file, constant_pool); + default: // Never reached throw new IllegalStateException("Ooops! default case reached."); } diff --git a/src/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/java/org/apache/bcel/classfile/DescendingVisitor.java index ff5798d3..8b615348 100644 --- a/src/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -91,6 +91,22 @@ public class DescendingVisitor implements Visitor { stack.pop(); } + public void visitAnnotation(Annotations annotation) { + stack.push(annotation); + annotation.accept(visitor); + + AnnotationEntry[] entries = annotation.getAnnotationEntries(); + for (int i=0; i < entries.length; i++) + entries[i].accept(this); + stack.pop(); + } + + public void visitAnnotationEntry(AnnotationEntry annotationEntry) { + stack.push(annotationEntry); + annotationEntry.accept(visitor); + stack.pop(); + } + public void visitField(Field field) { stack.push(field); field.accept(visitor); diff --git a/src/java/org/apache/bcel/classfile/ElementValue.java b/src/java/org/apache/bcel/classfile/ElementValue.java new file mode 100644 index 00000000..8fff9c38 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ElementValue.java @@ -0,0 +1,87 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +/** + * an ElementValuePair's element value. This class will be broken out into + * different subclasses. This is a temporary implementation. + * + * @version $Id: ElementValue + * @author D. Brosius + */ + +public class ElementValue +{ + private byte tag; + private int const_value_index; + private int type_name_index; + private int const_name_index; + private int class_info_index; + private AnnotationEntry annotation; + private int num_values; + private ElementValue[] values; + /** + * Construct object from file stream. + * @param file Input stream + * @param constant_pool the constant pool + * @throws IOException + */ + ElementValue(DataInputStream file, ConstantPool constant_pool) + throws IOException + { + tag = (file.readByte()); + switch (tag) { + case 'B': + case 'C': + case 'D': + case 'F': + case 'I': + case 'J': + case 'S': + case 'Z': + case 's': + const_value_index = (file.readUnsignedShort()); + break; + + case 'e': + type_name_index = (file.readUnsignedShort()); + const_name_index = (file.readUnsignedShort()); + break; + + case 'c': + class_info_index = (file.readUnsignedShort()); + break; + + case '@': + annotation = new AnnotationEntry(file, constant_pool); + break; + + case '[': + num_values = (file.readUnsignedShort()); + values = new ElementValue[num_values]; + for (int i = 0; i < num_values; i++) + values[i] = new ElementValue(file, constant_pool); + break; + + default: + throw new IOException("Invalid ElementValue tag: " + tag ); + } + } +} diff --git a/src/java/org/apache/bcel/classfile/ElementValuePair.java b/src/java/org/apache/bcel/classfile/ElementValuePair.java new file mode 100644 index 00000000..f2ac5d35 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ElementValuePair.java @@ -0,0 +1,46 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + + +/** + * an annotation's element value pair + * + * @version $Id: ElementValuePair + * @author D. Brosius + */ +public class ElementValuePair +{ + private int element_name_index; + private ElementValue value; + + /** + * Construct object from file stream. + * @param file Input stream + * @param constant_pool the constant pool + * @throws IOException + */ + ElementValuePair(DataInputStream file, ConstantPool constant_pool) + throws IOException + { + element_name_index = (file.readUnsignedShort()); + value = new ElementValue(file, constant_pool); + } +} diff --git a/src/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/java/org/apache/bcel/classfile/EmptyVisitor.java index 20d8e6e9..d36e2196 100644 --- a/src/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -31,6 +31,8 @@ package org.apache.bcel.classfile; public class EmptyVisitor implements Visitor { protected EmptyVisitor() { } + public void visitAnnotation(Annotations obj) {} + public void visitAnnotationEntry(AnnotationEntry obj) {} public void visitCode(Code obj) {} public void visitCodeException(CodeException obj) {} public void visitConstantClass(ConstantClass obj) {} diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java new file mode 100644 index 00000000..80969a83 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * represents an annotation that is represented in the class file + * but is not provided to the JVM. + * + * @version $Id: RuntimeInvisibleAnnotations + * @author D. Brosius + */ +public class RuntimeInvisibleAnnotations extends Annotations +{ + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + RuntimeInvisibleAnnotations(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + super(Constants.ATTR_RUNTIMEINVISIBLE_ANNOTATIONS, name_index, length, file, constant_pool); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + Annotations c = (Annotations)clone(); + + return c; + } + +} diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java new file mode 100644 index 00000000..91e131b9 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * represents an annotation that is represented in the class file + * and is provided to the JVM. + * + * @version $Id: RuntimeVisibleAnnotations + * @author D. Brosius + */ +public class RuntimeVisibleAnnotations extends Annotations +{ + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + RuntimeVisibleAnnotations(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + super(Constants.ATTR_RUNTIMEVISIBLE_ANNOTATIONS, name_index, length, file, constant_pool); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + Annotations c = (Annotations)clone(); + + return c; + } + +} diff --git a/src/java/org/apache/bcel/classfile/Visitor.java b/src/java/org/apache/bcel/classfile/Visitor.java index 2122e99b..35aead73 100644 --- a/src/java/org/apache/bcel/classfile/Visitor.java +++ b/src/java/org/apache/bcel/classfile/Visitor.java @@ -29,6 +29,8 @@ package org.apache.bcel.classfile; * @author M. Dahm */ public interface Visitor { + public void visitAnnotation(Annotations obj); + public void visitAnnotationEntry(AnnotationEntry obj); public void visitCode(Code obj); public void visitCodeException(CodeException obj); public void visitConstantClass(ConstantClass obj); -- GitLab From 2e0a31c1a5041dfbb837fc77dd3939877a7da368 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 13 Feb 2005 03:34:50 +0000 Subject: [PATCH 0235/1313] Comment out the Visitor additions too, for now. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153592 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/EmptyVisitor.java | 4 ++-- src/java/org/apache/bcel/classfile/Visitor.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/java/org/apache/bcel/classfile/EmptyVisitor.java index d36e2196..60a8ca58 100644 --- a/src/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -31,8 +31,8 @@ package org.apache.bcel.classfile; public class EmptyVisitor implements Visitor { protected EmptyVisitor() { } - public void visitAnnotation(Annotations obj) {} - public void visitAnnotationEntry(AnnotationEntry obj) {} + //public void visitAnnotation(Annotations obj) {} + //public void visitAnnotationEntry(AnnotationEntry obj) {} public void visitCode(Code obj) {} public void visitCodeException(CodeException obj) {} public void visitConstantClass(ConstantClass obj) {} diff --git a/src/java/org/apache/bcel/classfile/Visitor.java b/src/java/org/apache/bcel/classfile/Visitor.java index 35aead73..643a1f12 100644 --- a/src/java/org/apache/bcel/classfile/Visitor.java +++ b/src/java/org/apache/bcel/classfile/Visitor.java @@ -29,8 +29,8 @@ package org.apache.bcel.classfile; * @author M. Dahm */ public interface Visitor { - public void visitAnnotation(Annotations obj); - public void visitAnnotationEntry(AnnotationEntry obj); + //public void visitAnnotation(Annotations obj); + //public void visitAnnotationEntry(AnnotationEntry obj); public void visitCode(Code obj); public void visitCodeException(CodeException obj); public void visitConstantClass(ConstantClass obj); -- GitLab From 912290e3e5f57bc9a1b4a3e55d406c5b00a18237 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 13 Feb 2005 03:44:02 +0000 Subject: [PATCH 0236/1313] more commenting out. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153594 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/AnnotationEntry.java | 2 +- src/java/org/apache/bcel/classfile/Annotations.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/java/org/apache/bcel/classfile/AnnotationEntry.java index 91a17d3b..1428e33f 100644 --- a/src/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -60,7 +60,7 @@ public class AnnotationEntry implements Node, Constants * @param v Visitor object */ public void accept(Visitor v) { - v.visitAnnotationEntry(this); +// v.visitAnnotationEntry(this); } /** diff --git a/src/java/org/apache/bcel/classfile/Annotations.java b/src/java/org/apache/bcel/classfile/Annotations.java index 50d130a3..a2fc3e18 100644 --- a/src/java/org/apache/bcel/classfile/Annotations.java +++ b/src/java/org/apache/bcel/classfile/Annotations.java @@ -73,7 +73,7 @@ public abstract class Annotations extends Attribute { * @param v Visitor object */ public void accept(Visitor v) { - v.visitAnnotation(this); +// v.visitAnnotation(this); } /** @@ -89,7 +89,7 @@ public abstract class Annotations extends Attribute { /** * @returns the annotation entry table */ - public final AnnotationEntry[] GetAnnotationTable() + public final AnnotationEntry[] getAnnotationTable() { return annotation_table; } -- GitLab From 5698a20d82e76310ff30b35305808bfb45b33368 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 13 Feb 2005 04:59:14 +0000 Subject: [PATCH 0237/1313] Start adding support for Parameter Annotations (still commnted out) git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153604 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Constants.java | 35 +++--- .../apache/bcel/classfile/Annotations.java | 2 +- .../org/apache/bcel/classfile/Attribute.java | 8 +- .../apache/bcel/classfile/EmptyVisitor.java | 5 +- .../classfile/ParameterAnnotationEntry.java | 73 ++++++++++++ .../bcel/classfile/ParameterAnnotations.java | 108 ++++++++++++++++++ .../org/apache/bcel/classfile/Visitor.java | 1 + 7 files changed, 212 insertions(+), 20 deletions(-) create mode 100644 src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java create mode 100644 src/java/org/apache/bcel/classfile/ParameterAnnotations.java diff --git a/src/java/org/apache/bcel/Constants.java b/src/java/org/apache/bcel/Constants.java index 2f570035..bb583e3a 100644 --- a/src/java/org/apache/bcel/Constants.java +++ b/src/java/org/apache/bcel/Constants.java @@ -698,21 +698,23 @@ public interface Constants { /** Attributes and their corresponding names. */ - public static final byte ATTR_UNKNOWN = -1; - public static final byte ATTR_SOURCE_FILE = 0; - public static final byte ATTR_CONSTANT_VALUE = 1; - public static final byte ATTR_CODE = 2; - public static final byte ATTR_EXCEPTIONS = 3; - public static final byte ATTR_LINE_NUMBER_TABLE = 4; - public static final byte ATTR_LOCAL_VARIABLE_TABLE = 5; - public static final byte ATTR_INNER_CLASSES = 6; - public static final byte ATTR_SYNTHETIC = 7; - public static final byte ATTR_DEPRECATED = 8; - public static final byte ATTR_PMG = 9; - public static final byte ATTR_SIGNATURE = 10; - public static final byte ATTR_STACK_MAP = 11; - public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = 12; - public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = 13; + public static final byte ATTR_UNKNOWN = -1; + public static final byte ATTR_SOURCE_FILE = 0; + public static final byte ATTR_CONSTANT_VALUE = 1; + public static final byte ATTR_CODE = 2; + public static final byte ATTR_EXCEPTIONS = 3; + public static final byte ATTR_LINE_NUMBER_TABLE = 4; + public static final byte ATTR_LOCAL_VARIABLE_TABLE = 5; + public static final byte ATTR_INNER_CLASSES = 6; + public static final byte ATTR_SYNTHETIC = 7; + public static final byte ATTR_DEPRECATED = 8; + public static final byte ATTR_PMG = 9; + public static final byte ATTR_SIGNATURE = 10; + public static final byte ATTR_STACK_MAP = 11; + public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = 12; + public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = 13; + public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = 14; + public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = 14; public static final short KNOWN_ATTRIBUTES = 14; @@ -721,7 +723,8 @@ public interface Constants { "LineNumberTable", "LocalVariableTable", "InnerClasses", "Synthetic", "Deprecated", "PMGClass", "Signature", "StackMap", - "RuntimeVisibleAnnotations", "RuntimeInvisibleAnnotations" + "RuntimeVisibleAnnotations", "RuntimeInvisibleAnnotations", + "RuntimeVisibleParameterAnnotations", "RuntimeInvisibleParameterAnnotations" }; /** Constants used in the StackMap attribute. diff --git a/src/java/org/apache/bcel/classfile/Annotations.java b/src/java/org/apache/bcel/classfile/Annotations.java index a2fc3e18..d5561ac3 100644 --- a/src/java/org/apache/bcel/classfile/Annotations.java +++ b/src/java/org/apache/bcel/classfile/Annotations.java @@ -104,5 +104,5 @@ public abstract class Annotations extends Attribute { /** * @returns the number of annotation entries in this annotation */ - public final int getNumAnnotation() { return annotation_table_length; } + public final int getNumAnnotations() { return annotation_table_length; } } diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index 7b3a0fd3..fceed1fa 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -184,11 +184,17 @@ public abstract class Attribute implements Cloneable, Node, Serializable { return new StackMap(name_index, length, file, constant_pool); // case Constants.ATTR_RUNTIMEVISIBLE_ANNOTATIONS: -// return new RuntimeVisibleAnnotations(name_index, length, file, constant_pool); +// return new RuntimeVisibleAnnotations(name_index, length, file, constant_pool); // case Constants.ATTR_RUNTIMEINVISIBLE_ANNOTATIONS: // return new RuntimeInvisibleAnnotations(name_index, length, file, constant_pool); +// case Constants.ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS: +// return new RuntimeVisibleParameterAnnotations(name_index, length, file, constant_pool); + +// case Constants.ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS: +// return new RuntimeInvisibleParameterAnnotations(name_index, length, file, constant_pool); + default: // Never reached throw new IllegalStateException("Ooops! default case reached."); } diff --git a/src/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/java/org/apache/bcel/classfile/EmptyVisitor.java index 60a8ca58..07694ddf 100644 --- a/src/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -31,8 +31,9 @@ package org.apache.bcel.classfile; public class EmptyVisitor implements Visitor { protected EmptyVisitor() { } - //public void visitAnnotation(Annotations obj) {} - //public void visitAnnotationEntry(AnnotationEntry obj) {} + public void visitAnnotation(Annotations obj) {} + public void visitParameterAnnotation(ParameterAnnotations obj) {} + public void visitAnnotationEntry(AnnotationEntry obj) {} public void visitCode(Code obj) {} public void visitCodeException(CodeException obj) {} public void visitConstantClass(ConstantClass obj) {} diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java new file mode 100644 index 00000000..17c7724e --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -0,0 +1,73 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + + +/** + * represents one parameter annotation in the parameter annotation table + * + * @version $Id: ParameterAnnotationEntry + * @author D. Brosius + */ +public class ParameterAnnotationEntry implements Node, Constants +{ + private int annotation_table_length; + private AnnotationEntry[] annotation_table; + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + ParameterAnnotationEntry(DataInputStream file, ConstantPool constant_pool) + throws IOException + { + annotation_table_length = (file.readUnsignedShort()); + + annotation_table = new AnnotationEntry[annotation_table_length]; + for(int i=0; i < annotation_table_length; i++) + annotation_table[i] = new AnnotationEntry(file, constant_pool); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { +// v.visitParameterAnnotationEntry(this); + } + + /** + * @returns the number of annotation entries in this parameter annotation + */ + public final int getNumAnnotations() { return annotation_table_length; } + + /** + * returns the array of annotation entries in this annotation + */ + public AnnotationEntry[] getAnnotationEntries() { + return annotation_table; + } +} diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/java/org/apache/bcel/classfile/ParameterAnnotations.java new file mode 100644 index 00000000..b9235f8e --- /dev/null +++ b/src/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -0,0 +1,108 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * base class for parameter annotations + * + * @version $Id: ParameterAnnotations + * @author D. Brosius + */ +public abstract class ParameterAnnotations extends Attribute { + + private int num_parameters; + private ParameterAnnotationEntry[] parameter_annotation_table; // Table of parameter annotations + + /** + * @param parameter_annotation_type the subclass type of the parameter annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(parameter_annotation_type, name_index, length, (ParameterAnnotationEntry[]) null, constant_pool); + + num_parameters = (file.readUnsignedShort()); + parameter_annotation_table = new ParameterAnnotationEntry[num_parameters]; + + for(int i=0; i < num_parameters; i++) + parameter_annotation_table[i] = new ParameterAnnotationEntry(file, constant_pool); + } + + /** + * @param parameter_annotation_type the subclass type of the parameter annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param parameter_annotation_table the actual parameter annotations + * @param constant_pool Array of constants + */ + public ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, ParameterAnnotationEntry[] parameter_annotation_table, ConstantPool constant_pool) + { + super(parameter_annotation_type, name_index, length, constant_pool); + setParameterAnnotationTable(parameter_annotation_table); + + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { +// v.visitParameterAnnotation(this); + } + + /** + * @param parameter_annotation_table the entries to set in this parameter annotation + */ + public final void setParameterAnnotationTable(ParameterAnnotationEntry[] parameter_annotation_table) + { + this.parameter_annotation_table = parameter_annotation_table; + num_parameters = (parameter_annotation_table == null)? 0 : + parameter_annotation_table.length; + } + + /** + * @returns the parameter annotation entry table + */ + public final ParameterAnnotationEntry[] getParameterAnnotationTable() + { + return parameter_annotation_table; + } + + /** + * returns the array of parameter annotation entries in this parameter annotation + */ + public ParameterAnnotationEntry[] getParameterAnnotationEntries() { + return parameter_annotation_table; + } + + /** + * @returns the number of parameter annotation entries in this parameter annotation + */ + public final int getNumParameterAnnotation() { return num_parameters; } +} diff --git a/src/java/org/apache/bcel/classfile/Visitor.java b/src/java/org/apache/bcel/classfile/Visitor.java index 643a1f12..115eb185 100644 --- a/src/java/org/apache/bcel/classfile/Visitor.java +++ b/src/java/org/apache/bcel/classfile/Visitor.java @@ -30,6 +30,7 @@ package org.apache.bcel.classfile; */ public interface Visitor { //public void visitAnnotation(Annotations obj); + //public void visitParameterAnnotation(ParameterAnnotations obj); //public void visitAnnotationEntry(AnnotationEntry obj); public void visitCode(Code obj); public void visitCodeException(CodeException obj); -- GitLab From 6d2abd897ae832e2cc05481db45d57597064e3b4 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 13 Feb 2005 05:09:18 +0000 Subject: [PATCH 0238/1313] More Parameter Annotation support (commented out) git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153605 13f79535-47bb-0310-9956-ffa450edef68 --- .../RuntimeInvisibleParameterAnnotations.java | 54 +++++++++++++++++++ .../RuntimeVisibleParameterAnnotations.java | 54 +++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java create mode 100644 src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java new file mode 100644 index 00000000..05c5da4f --- /dev/null +++ b/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * represents a parameter annotation that is represented in the class file + * but is not provided to the JVM. + * + * @version $Id: RuntimeInvisibleParameterAnnotations + * @author D. Brosius + */ +public class RuntimeInvisibleParameterAnnotations extends Annotations +{ + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + super(Constants.ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, constant_pool); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + Annotations c = (Annotations)clone(); + + return c; + } + +} diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java new file mode 100644 index 00000000..c4b00349 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * represents a parameter annotation that is represented in the class file + * and is provided to the JVM. + * + * @version $Id: RuntimeVisibleParameterAnnotations + * @author D. Brosius + */ +public class RuntimeVisibleParameterAnnotations extends Annotations +{ + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + RuntimeVisibleParameterAnnotations(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + super(Constants.ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, constant_pool); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + Annotations c = (Annotations)clone(); + + return c; + } + +} -- GitLab From 4823aa74687970a113b7d1e98282ffe8ce7b7778 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 13 Feb 2005 05:12:45 +0000 Subject: [PATCH 0239/1313] Both Parameter Annotations types extend ParameterAnnotations git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153606 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/RuntimeInvisibleParameterAnnotations.java | 2 +- .../bcel/classfile/RuntimeVisibleParameterAnnotations.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 05c5da4f..94c3ad08 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -28,7 +28,7 @@ import org.apache.bcel.Constants; * @version $Id: RuntimeInvisibleParameterAnnotations * @author D. Brosius */ -public class RuntimeInvisibleParameterAnnotations extends Annotations +public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { /** * @param name_index Index pointing to the name Code diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index c4b00349..d0ece1c5 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -28,7 +28,7 @@ import org.apache.bcel.Constants; * @version $Id: RuntimeVisibleParameterAnnotations * @author D. Brosius */ -public class RuntimeVisibleParameterAnnotations extends Annotations +public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { /** * @param name_index Index pointing to the name Code -- GitLab From 68431dba1d65889b015c40fa7f23d8ed0235f2c7 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 13 Feb 2005 06:07:50 +0000 Subject: [PATCH 0240/1313] Put the number of attribute types back to 12, so that annotations don't screw things up git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153607 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Constants.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/Constants.java b/src/java/org/apache/bcel/Constants.java index bb583e3a..c2d1c755 100644 --- a/src/java/org/apache/bcel/Constants.java +++ b/src/java/org/apache/bcel/Constants.java @@ -714,9 +714,9 @@ public interface Constants { public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = 12; public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = 13; public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = 14; - public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = 14; + public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = 15; - public static final short KNOWN_ATTRIBUTES = 14; + public static final short KNOWN_ATTRIBUTES = 12;//should be 16 public static final String[] ATTRIBUTE_NAMES = { "SourceFile", "ConstantValue", "Code", "Exceptions", -- GitLab From cc1ed55e26869e9927e89b0cb7e639c39f39d573 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 14 Feb 2005 00:09:58 +0000 Subject: [PATCH 0241/1313] Add support for the Attribute - AnnotationDefault , again commented out. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153682 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Constants.java | 6 +- .../bcel/classfile/AnnotationDefault.java | 87 +++++++++++++++++++ .../org/apache/bcel/classfile/Attribute.java | 3 + .../apache/bcel/classfile/EmptyVisitor.java | 1 + .../org/apache/bcel/classfile/Visitor.java | 1 + 5 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 src/java/org/apache/bcel/classfile/AnnotationDefault.java diff --git a/src/java/org/apache/bcel/Constants.java b/src/java/org/apache/bcel/Constants.java index c2d1c755..453b1319 100644 --- a/src/java/org/apache/bcel/Constants.java +++ b/src/java/org/apache/bcel/Constants.java @@ -715,8 +715,9 @@ public interface Constants { public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = 13; public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = 14; public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = 15; + public static final byte ATTR_ANNOTATION_DEFAULT = 16; - public static final short KNOWN_ATTRIBUTES = 12;//should be 16 + public static final short KNOWN_ATTRIBUTES = 12;//should be 17 public static final String[] ATTRIBUTE_NAMES = { "SourceFile", "ConstantValue", "Code", "Exceptions", @@ -724,7 +725,8 @@ public interface Constants { "InnerClasses", "Synthetic", "Deprecated", "PMGClass", "Signature", "StackMap", "RuntimeVisibleAnnotations", "RuntimeInvisibleAnnotations", - "RuntimeVisibleParameterAnnotations", "RuntimeInvisibleParameterAnnotations" + "RuntimeVisibleParameterAnnotations", "RuntimeInvisibleParameterAnnotations", + "AnnotationDefault" }; /** Constants used in the StackMap attribute. diff --git a/src/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/java/org/apache/bcel/classfile/AnnotationDefault.java new file mode 100644 index 00000000..c3823e27 --- /dev/null +++ b/src/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -0,0 +1,87 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * represents the default value of a annotation for a method info + * + * @version $Id: AnnotationDefault 1 2005-02-13 03:15:08Z dbrosius $ + * @author D. Brosius + */ +public abstract class AnnotationDefault extends Attribute { + + ElementValue default_value; + + /** + * @param annotation_type the subclass type of the annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + AnnotationDefault(byte annotation_type, int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException + { + this(annotation_type, name_index, length, (ElementValue) null, constant_pool); + default_value = new ElementValue(file, constant_pool); + } + + /** + * @param annotation_type the subclass type of the annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param defaultValue the annotation's default value + * @param constant_pool Array of constants + */ + public AnnotationDefault(byte annotation_type, int name_index, int length, ElementValue defaultValue, ConstantPool constant_pool) + { + super(annotation_type, name_index, length, constant_pool); + setDefaultValue(defaultValue); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept(Visitor v) { +// v.visitAnnotationDefault(this); + } + + /** + * @param defaultValue the default value of this methodinfo's annotation + */ + public final void setDefaultValue(ElementValue defaultValue) + { + default_value = defaultValue; + } + + /** + * @returns the default value + */ + public final ElementValue getDefaultValue() + { + return default_value; + } +} diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index fceed1fa..af342844 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -195,6 +195,9 @@ public abstract class Attribute implements Cloneable, Node, Serializable { // case Constants.ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS: // return new RuntimeInvisibleParameterAnnotations(name_index, length, file, constant_pool); +// case Constants.ATTR_ANNOTATION_DEFAULT: +// return new AnnotationDefault(name_index, length, file, constant_pool); + default: // Never reached throw new IllegalStateException("Ooops! default case reached."); } diff --git a/src/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/java/org/apache/bcel/classfile/EmptyVisitor.java index 07694ddf..e36b1f0b 100644 --- a/src/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -34,6 +34,7 @@ public class EmptyVisitor implements Visitor { public void visitAnnotation(Annotations obj) {} public void visitParameterAnnotation(ParameterAnnotations obj) {} public void visitAnnotationEntry(AnnotationEntry obj) {} + public void visitAnnotationDefault(AnnotationDefault obj) {} public void visitCode(Code obj) {} public void visitCodeException(CodeException obj) {} public void visitConstantClass(ConstantClass obj) {} diff --git a/src/java/org/apache/bcel/classfile/Visitor.java b/src/java/org/apache/bcel/classfile/Visitor.java index 115eb185..ef248f0e 100644 --- a/src/java/org/apache/bcel/classfile/Visitor.java +++ b/src/java/org/apache/bcel/classfile/Visitor.java @@ -32,6 +32,7 @@ public interface Visitor { //public void visitAnnotation(Annotations obj); //public void visitParameterAnnotation(ParameterAnnotations obj); //public void visitAnnotationEntry(AnnotationEntry obj); + //public void visitAnnotationDefault(AnnotationDefault obj); public void visitCode(Code obj); public void visitCodeException(CodeException obj); public void visitConstantClass(ConstantClass obj); -- GitLab From 748445f5fb0cf27804d911dfbcc8c0f060bd9e7a Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 14 Feb 2005 00:25:43 +0000 Subject: [PATCH 0242/1313] More Access Flags specific to 5.0, note these are aliased onto other access flags, but are partitioned by by type. These new values are specific to methods only. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153685 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Constants.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/java/org/apache/bcel/Constants.java b/src/java/org/apache/bcel/Constants.java index 453b1319..b4adf0a1 100644 --- a/src/java/org/apache/bcel/Constants.java +++ b/src/java/org/apache/bcel/Constants.java @@ -40,7 +40,9 @@ public interface Constants { public final static short ACC_FINAL = 0x0010; public final static short ACC_SYNCHRONIZED = 0x0020; public final static short ACC_VOLATILE = 0x0040; + public final static short ACC_BRIDGE = 0x0040; public final static short ACC_TRANSIENT = 0x0080; + public final static short ACC_VARARGS = 0x0080; public final static short ACC_NATIVE = 0x0100; public final static short ACC_INTERFACE = 0x0200; -- GitLab From 796cb13dceb36d511bc0d5c2c9244f8d6b44084c Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 14 Feb 2005 00:55:57 +0000 Subject: [PATCH 0243/1313] Update BCELifier to handle the new method access flags (ACC_BRIDGE, ACC_VARARGS) git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@153687 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/BCELifier.java | 24 +++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java index f8828056..a42cf5e0 100644 --- a/src/java/org/apache/bcel/util/BCELifier.java +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -33,6 +33,10 @@ import java.io.*; * @author M. Dahm */ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { + private static final int FLAG_FOR_UNKNOWN = -1; + private static final int FLAG_FOR_CLASS = 0; + private static final int FLAG_FOR_METHOD = 1; + private JavaClass _clazz; private PrintWriter _out; private ConstantPoolGen _cp; @@ -83,7 +87,7 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { package_name + "." + class_name) + "\", \"" + super_name + "\", " + "\"" + clazz.getSourceFileName() + "\", " + - printFlags(clazz.getAccessFlags(), true) + ", " + + printFlags(clazz.getAccessFlags(), FLAG_FOR_CLASS) + ", " + "new String[] { " + inter + " });"); _out.println(); @@ -177,7 +181,7 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { _out.println(" InstructionList il = new InstructionList();"); _out.println(" MethodGen method = new MethodGen(" + - printFlags(method.getAccessFlags()) + + printFlags(method.getAccessFlags(), FLAG_FOR_METHOD) + ", " + printType(result_type) + ", " + printArgumentTypes(arg_types) + ", " + "new String[] { " + @@ -196,20 +200,24 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { } static String printFlags(int flags) { - return printFlags(flags, false); + return printFlags(flags, FLAG_FOR_UNKNOWN); } - static String printFlags(int flags, boolean for_class) { + static String printFlags(int flags, int reason) { if(flags == 0) return "0"; StringBuffer buf = new StringBuffer(); for(int i=0, pow=1; i <= Constants.MAX_ACC_FLAG; i++) { if((flags & pow) != 0) { - if((pow == Constants.ACC_SYNCHRONIZED) && for_class) - buf.append("ACC_SUPER | "); - else - buf.append("ACC_" + Constants.ACCESS_NAMES[i].toUpperCase() + " | "); + if((pow == Constants.ACC_SYNCHRONIZED) && (reason == FLAG_FOR_CLASS)) + buf.append("ACC_SUPER | "); + else if ((pow == Constants.ACC_VOLATILE) && (reason == FLAG_FOR_METHOD)) + buf.append("ACC_BRIDGE | "); + else if ((pow == Constants.ACC_TRANSIENT) && (reason == FLAG_FOR_METHOD)) + buf.append("ACC_VARARGS | "); + else + buf.append("ACC_" + Constants.ACCESS_NAMES[i].toUpperCase() + " | "); } pow <<= 1; -- GitLab From 85d17208341c8082e23e4603cce984fc0a26a289 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 22 Feb 2005 06:21:31 +0000 Subject: [PATCH 0244/1313] Apply Patch 18731 from wombat@uni.de, do a deep copy on clone for select statements git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@154799 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/Select.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/java/org/apache/bcel/generic/Select.java b/src/java/org/apache/bcel/generic/Select.java index 9cb819da..4e947efe 100644 --- a/src/java/org/apache/bcel/generic/Select.java +++ b/src/java/org/apache/bcel/generic/Select.java @@ -192,6 +192,16 @@ public abstract class Select extends BranchInstruction return false; } + protected Object clone() throws CloneNotSupportedException { + Select copy = (Select) super.clone(); + + copy.match = (int[]) match.clone(); + copy.indices = (int[]) indices.clone(); + copy.targets = (InstructionHandle[]) targets.clone(); + + return copy; + } + /** * Inform targets that they're not targeted anymore. */ -- GitLab From 300bb79f24200fcb13ab809f99fe1c5394db7a95 Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Tue, 1 Mar 2005 02:40:10 +0000 Subject: [PATCH 0245/1313] updated download link to point to bcel download page git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@155738 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/navigation.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xdocs/navigation.xml b/xdocs/navigation.xml index bdd4ec0f..01dd35a2 100644 --- a/xdocs/navigation.xml +++ b/xdocs/navigation.xml @@ -7,7 +7,7 @@ - + -- GitLab From d4e9eaa7181852f2004b4006d781f97fce330445 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 1 Mar 2005 02:46:46 +0000 Subject: [PATCH 0246/1313] remove dead code git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@155741 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/structurals/Subroutines.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java index d27eac9f..c5f37a2d 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -356,7 +356,6 @@ public class Subroutines{ // Calculate "real" subroutines. HashSet sub_leaders = new HashSet(); // Elements: InstructionHandle - InstructionHandle ih = all[0]; for (int i=0; i Date: Tue, 1 Mar 2005 03:11:50 +0000 Subject: [PATCH 0247/1313] abstract-ize the private use of collections git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@155744 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AnnotationDefault.java | 2 - .../apache/bcel/classfile/Annotations.java | 2 - .../org/apache/bcel/classfile/Attribute.java | 11 ++- .../org/apache/bcel/classfile/Unknown.java | 2 +- .../apache/bcel/generic/ConstantPoolGen.java | 29 ++++++-- .../bcel/generic/InstructionHandle.java | 11 +-- .../apache/bcel/generic/InstructionList.java | 15 ++-- .../org/apache/bcel/util/BCELFactory.java | 2 +- .../bcel/util/ClassLoaderRepository.java | 3 +- src/java/org/apache/bcel/util/ClassSet.java | 6 +- .../apache/bcel/util/InstructionFinder.java | 2 +- .../apache/bcel/util/SyntheticRepository.java | 5 +- .../org/apache/bcel/verifier/Verifier.java | 5 +- .../apache/bcel/verifier/VerifierFactory.java | 3 +- .../bcel/verifier/statics/Pass2Verifier.java | 71 +++++++++++++++---- .../structurals/ControlFlowGraph.java | 6 +- .../structurals/ExceptionHandlers.java | 12 ++-- .../verifier/structurals/Subroutines.java | 38 +++++++--- 18 files changed, 158 insertions(+), 67 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/java/org/apache/bcel/classfile/AnnotationDefault.java index c3823e27..67d0ed0b 100644 --- a/src/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -19,8 +19,6 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.IOException; -import org.apache.bcel.Constants; - /** * represents the default value of a annotation for a method info * diff --git a/src/java/org/apache/bcel/classfile/Annotations.java b/src/java/org/apache/bcel/classfile/Annotations.java index d5561ac3..c2848e1c 100644 --- a/src/java/org/apache/bcel/classfile/Annotations.java +++ b/src/java/org/apache/bcel/classfile/Annotations.java @@ -19,8 +19,6 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.IOException; -import org.apache.bcel.Constants; - /** * base class for annotations * diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index af342844..c2449613 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -16,9 +16,14 @@ */ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.Serializable; import java.util.HashMap; +import java.util.Map; + +import org.apache.bcel.Constants; /** * Abstract super class for Attribute objects. Currently the @@ -77,7 +82,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable { file.writeInt(length); } - private static HashMap readers = new HashMap(); + private static Map readers = new HashMap(); /** Add an Attribute reader capable of parsing (user-defined) attributes * named "name". You should not add readers for the standard attributes diff --git a/src/java/org/apache/bcel/classfile/Unknown.java b/src/java/org/apache/bcel/classfile/Unknown.java index fe40c657..dd79bc73 100644 --- a/src/java/org/apache/bcel/classfile/Unknown.java +++ b/src/java/org/apache/bcel/classfile/Unknown.java @@ -41,7 +41,7 @@ public final class Unknown extends Attribute { private byte[] bytes; private String name; - private static HashMap unknown_attributes = new HashMap(); + private static Map unknown_attributes = new HashMap(); /** @return array of unknown attributes, but just one for each kind. */ diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/java/org/apache/bcel/generic/ConstantPoolGen.java index fe0e90d0..54a7881a 100644 --- a/src/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -17,9 +17,24 @@ package org.apache.bcel.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.*; import java.util.HashMap; +import java.util.Map; + +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantCP; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.ConstantUtf8; /** * This class is used to build up a constant pool. The user adds @@ -139,7 +154,7 @@ public class ConstantPoolGen implements java.io.Serializable { } } - private HashMap string_table = new HashMap(); + private Map string_table = new HashMap(); /** * Look for ConstantString in ConstantPool containing String `str'. @@ -178,7 +193,7 @@ public class ConstantPoolGen implements java.io.Serializable { return ret; } - private HashMap class_table = new HashMap(); + private Map class_table = new HashMap(); /** * Look for ConstantClass in ConstantPool named `str'. @@ -320,7 +335,7 @@ public class ConstantPoolGen implements java.io.Serializable { return ret; } - private HashMap utf8_table = new HashMap(); + private Map utf8_table = new HashMap(); /** * Look for ConstantUtf8 in ConstantPool. @@ -438,7 +453,7 @@ public class ConstantPoolGen implements java.io.Serializable { return ret; } - private HashMap n_a_t_table = new HashMap(); + private Map n_a_t_table = new HashMap(); /** * Look for ConstantNameAndType in ConstantPool. @@ -478,7 +493,7 @@ public class ConstantPoolGen implements java.io.Serializable { return ret; } - private HashMap cp_table = new HashMap(); + private Map cp_table = new HashMap(); /** * Look for ConstantMethodref in ConstantPool. diff --git a/src/java/org/apache/bcel/generic/InstructionHandle.java b/src/java/org/apache/bcel/generic/InstructionHandle.java index 3402cb95..56690aa2 100644 --- a/src/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/java/org/apache/bcel/generic/InstructionHandle.java @@ -17,10 +17,13 @@ package org.apache.bcel.generic; -import org.apache.bcel.classfile.Utility; -import java.util.HashSet; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.bcel.classfile.Utility; /** * Instances of this class give users a handle to the instructions contained in @@ -44,8 +47,8 @@ public class InstructionHandle implements java.io.Serializable { InstructionHandle next, prev; // Will be set from the outside Instruction instruction; protected int i_position = -1; // byte code offset of instruction - private HashSet targeters; - private HashMap attributes; + private Set targeters; + private Map attributes; public final InstructionHandle getNext() { return next; } public final InstructionHandle getPrev() { return prev; } diff --git a/src/java/org/apache/bcel/generic/InstructionList.java b/src/java/org/apache/bcel/generic/InstructionList.java index d2e83a07..30cef26b 100644 --- a/src/java/org/apache/bcel/generic/InstructionList.java +++ b/src/java/org/apache/bcel/generic/InstructionList.java @@ -17,13 +17,18 @@ package org.apache.bcel.generic; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.Constant; import org.apache.bcel.util.ByteSequence; -import java.io.*; -import java.util.Iterator; -import java.util.HashMap; -import java.util.ArrayList; /** * This class is a container for a list of + private Map branch_map = new HashMap(); // Map public void start() { if(!_mg.isAbstract() && !_mg.isNative()) { diff --git a/src/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/java/org/apache/bcel/util/ClassLoaderRepository.java index 6b562e6a..1aff3450 100644 --- a/src/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -20,6 +20,7 @@ package org.apache.bcel.util; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; +import java.util.Map; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; @@ -39,7 +40,7 @@ import org.apache.bcel.classfile.JavaClass; */ public class ClassLoaderRepository implements Repository { private java.lang.ClassLoader loader; - private HashMap loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS + private Map loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS public ClassLoaderRepository(java.lang.ClassLoader loader) { this.loader = loader; diff --git a/src/java/org/apache/bcel/util/ClassSet.java b/src/java/org/apache/bcel/util/ClassSet.java index 5ea55592..62e6ec86 100644 --- a/src/java/org/apache/bcel/util/ClassSet.java +++ b/src/java/org/apache/bcel/util/ClassSet.java @@ -16,8 +16,10 @@ */ package org.apache.bcel.util; -import java.util.HashMap; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + import org.apache.bcel.classfile.JavaClass; /** @@ -30,7 +32,7 @@ import org.apache.bcel.classfile.JavaClass; * @see ClassStack */ public class ClassSet implements java.io.Serializable { - private HashMap _map = new HashMap(); + private Map _map = new HashMap(); public boolean add(JavaClass clazz) { boolean result = false; diff --git a/src/java/org/apache/bcel/util/InstructionFinder.java b/src/java/org/apache/bcel/util/InstructionFinder.java index ec95dc0d..cbe57ff2 100644 --- a/src/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/java/org/apache/bcel/util/InstructionFinder.java @@ -53,7 +53,7 @@ public class InstructionFinder { private static final int OFFSET = 32767; // char + OFFSET is outside of LATIN-1 private static final int NO_OPCODES = 256; // Potential number, some are not used - private static final HashMap map = new HashMap(); // Map + private static final Map map = new HashMap(); // Map private InstructionList il; private String il_string; // instruction list as string diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/java/org/apache/bcel/util/SyntheticRepository.java index 72ca2ef2..f373b7dd 100644 --- a/src/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/java/org/apache/bcel/util/SyntheticRepository.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReference; import java.util.HashMap; +import java.util.Map; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; @@ -49,10 +50,10 @@ import org.apache.bcel.classfile.JavaClass; public class SyntheticRepository implements Repository { private static final String DEFAULT_PATH = ClassPath.getClassPath(); - private static HashMap _instances = new HashMap(); // CLASSPATH X REPOSITORY + private static Map _instances = new HashMap(); // CLASSPATH X REPOSITORY private ClassPath _path = null; - private HashMap _loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS + private Map _loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS private SyntheticRepository(ClassPath path) { _path = path; diff --git a/src/java/org/apache/bcel/verifier/Verifier.java b/src/java/org/apache/bcel/verifier/Verifier.java index 2aba52d6..86fbbb3b 100644 --- a/src/java/org/apache/bcel/verifier/Verifier.java +++ b/src/java/org/apache/bcel/verifier/Verifier.java @@ -20,6 +20,7 @@ package org.apache.bcel.verifier; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.verifier.statics.Pass1Verifier; @@ -54,9 +55,9 @@ public class Verifier{ /** A Pass2Verifier for this Verifier instance. */ private Pass2Verifier p2v; /** The Pass3aVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ - private HashMap p3avs = new HashMap(); + private Map p3avs = new HashMap(); /** The Pass3bVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ - private HashMap p3bvs = new HashMap(); + private Map p3bvs = new HashMap(); /** Returns the VerificationResult for the given pass. */ public VerificationResult doPass1(){ diff --git a/src/java/org/apache/bcel/verifier/VerifierFactory.java b/src/java/org/apache/bcel/verifier/VerifierFactory.java index ca792210..e0095f3c 100644 --- a/src/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/java/org/apache/bcel/verifier/VerifierFactory.java @@ -19,6 +19,7 @@ package org.apache.bcel.verifier; import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import java.util.Vector; /** @@ -36,7 +37,7 @@ public class VerifierFactory{ /** * The HashMap that holds the data about the already-constructed Verifier instances. */ - private static HashMap hashMap = new HashMap(); + private static Map hashMap = new HashMap(); /** * The VerifierFactoryObserver instances that observe the VerifierFactory. diff --git a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 05c6a3ec..689b9cd9 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -17,18 +17,59 @@ package org.apache.bcel.verifier.statics; -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.*; -import org.apache.bcel.classfile.DescendingVisitor; // Use _this_ one! -import org.apache.bcel.classfile.EmptyVisitor; // Use _this_ one! -import org.apache.bcel.classfile.Visitor; // Use _this_ one! -import org.apache.bcel.classfile.Deprecated; // Use _this_ one! -import org.apache.bcel.generic.*; -import org.apache.bcel.verifier.*; -import org.apache.bcel.verifier.exc.*; import java.util.HashMap; import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ClassFormatException; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Deprecated; +import org.apache.bcel.classfile.DescendingVisitor; +import org.apache.bcel.classfile.EmptyVisitor; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.InnerClass; +import org.apache.bcel.classfile.InnerClasses; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Node; +import org.apache.bcel.classfile.SourceFile; +import org.apache.bcel.classfile.Synthetic; +import org.apache.bcel.classfile.Unknown; +import org.apache.bcel.classfile.Visitor; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.PassVerifier; +import org.apache.bcel.verifier.VerificationResult; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.VerifierFactory; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.ClassConstraintException; +import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; /** * This PassVerifier verifies a class file according to @@ -147,7 +188,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ */ private void every_class_has_an_accessible_superclass(){ try { - HashSet hs = new HashSet(); // save class names to detect circular inheritance + Set hs = new HashSet(); // save class names to detect circular inheritance JavaClass jc = Repository.lookupClass(myOwner.getClassName()); int supidx = -1; @@ -197,7 +238,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ */ private void final_methods_are_not_overridden(){ try { - HashMap hashmap = new HashMap(); + Map hashmap = new HashMap(); JavaClass jc = Repository.lookupClass(myOwner.getClassName()); int supidx = -1; @@ -287,9 +328,9 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ private final int cplen; // == cp.getLength() -- to save computing power. private DescendingVisitor carrier; - private HashSet field_names = new HashSet(); - private HashSet field_names_and_desc = new HashSet(); - private HashSet method_names_and_desc = new HashSet(); + private Set field_names = new HashSet(); + private Set field_names_and_desc = new HashSet(); + private Set method_names_and_desc = new HashSet(); private CPESSC_Visitor(JavaClass _jc){ jc = _jc; diff --git a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index 3313e7e3..5bfd6ede 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -18,8 +18,8 @@ package org.apache.bcel.verifier.structurals; import java.util.ArrayList; -import java.util.HashMap; import java.util.Hashtable; +import java.util.Map; import org.apache.bcel.generic.ATHROW; import org.apache.bcel.generic.BranchInstruction; @@ -65,12 +65,12 @@ public class ControlFlowGraph{ /** * The 'incoming' execution Frames. */ - private HashMap inFrames; // key: the last-executed JSR + private Map inFrames; // key: the last-executed JSR /** * The 'outgoing' execution Frames. */ - private HashMap outFrames; // key: the last-executed JSR + private Map outFrames; // key: the last-executed JSR /** * The 'execution predecessors' - a list of type InstructionContext diff --git a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index f23b2428..812f956f 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -17,9 +17,13 @@ package org.apache.bcel.verifier.structurals; -import org.apache.bcel.generic.*; import java.util.HashSet; import java.util.Hashtable; +import java.util.Set; + +import org.apache.bcel.generic.CodeExceptionGen; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.MethodGen; /** * This class allows easy access to ExceptionHandler objects. @@ -43,8 +47,8 @@ public class ExceptionHandlers{ for (int i=0; i Date: Fri, 8 Apr 2005 02:47:39 +0000 Subject: [PATCH 0248/1313] Bug: 34318 JavaClass.dump only closes streams that it opens git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@160508 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/JavaClass.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 02a7c29f..b5dd5c3c 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -258,7 +258,15 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { dir.mkdirs(); } - dump(new DataOutputStream(new FileOutputStream(file))); + DataOutputStream dos = null; + try { + dos = new DataOutputStream(new FileOutputStream(file)); + dump(dos); + } + finally { + if (dos != null) + dos.close(); + } } /** @@ -338,8 +346,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { attributes[i].dump(file); } else file.writeShort(0); - - file.close(); + file.flush(); } /** -- GitLab From 2531956f2049749d3bdb759573c36baba49ea53c Mon Sep 17 00:00:00 2001 From: David Brosius Date: Fri, 8 Apr 2005 03:00:12 +0000 Subject: [PATCH 0249/1313] Bug 34318: Move owned stream allocation out of the constructors, and into parse so that the lifetime of the stream can be controlled thru try/finally. Also don't close a stream if the ClassParser didn't open it. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@160509 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/ClassParser.java | 134 ++++++++++-------- 1 file changed, 73 insertions(+), 61 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/ClassParser.java b/src/java/org/apache/bcel/classfile/ClassParser.java index 107ad7b3..0e919dd8 100644 --- a/src/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/java/org/apache/bcel/classfile/ClassParser.java @@ -37,8 +37,9 @@ import java.util.zip.*; */ public final class ClassParser { private DataInputStream file; - private ZipFile zip; + private boolean fileOwned; private String file_name; + private String zip_file; private int class_name_index, superclass_name_index; private int major, minor; // Compiler version private int access_flags; // Access rights of parsed class @@ -59,7 +60,7 @@ public final class ClassParser { */ public ClassParser(InputStream file, String file_name) { this.file_name = file_name; - + fileOwned = false; String clazz = file.getClass().getName(); // Not a very clean solution ... is_zip = clazz.startsWith("java.util.zip.") || clazz.startsWith("java.util.jar."); @@ -72,31 +73,25 @@ public final class ClassParser { /** Parse class from given .class file. * * @param file_name file name - * @throws IOException */ - public ClassParser(String file_name) throws IOException + public ClassParser(String file_name) { is_zip = false; this.file_name = file_name; - file = new DataInputStream(new BufferedInputStream - (new FileInputStream(file_name), BUFSIZE)); + fileOwned = true; } /** Parse class from given .class file in a ZIP-archive * + * @param zip_file zip file name * @param file_name file name - * @throws IOException */ - public ClassParser(String zip_file, String file_name) throws IOException + public ClassParser(String zip_file, String file_name) { is_zip = true; - zip = new ZipFile(zip_file); - ZipEntry entry = zip.getEntry(file_name); - + fileOwned = true; + this.zip_file = zip_file; this.file_name = file_name; - - file = new DataInputStream(new BufferedInputStream(zip.getInputStream(entry), - BUFSIZE)); } /** @@ -112,54 +107,71 @@ public final class ClassParser { */ public JavaClass parse() throws IOException, ClassFormatException { - /****************** Read headers ********************************/ - // Check magic tag of class file - readID(); - - // Get compiler version - readVersion(); - - /****************** Read constant pool and related **************/ - // Read constant pool entries - readConstantPool(); - - // Get class information - readClassInfo(); - - // Get interface information, i.e., implemented interfaces - readInterfaces(); - - /****************** Read class fields and methods ***************/ - // Read class fields, i.e., the variables of the class - readFields(); - - // Read class methods, i.e., the functions in the class - readMethods(); - - // Read class attributes - readAttributes(); - - // Check for unknown variables - //Unknown[] u = Unknown.getUnknownAttributes(); - //for(int i=0; i < u.length; i++) - // System.err.println("WARNING: " + u[i]); - - // Everything should have been read now - // if(file.available() > 0) { - // int bytes = file.available(); - // byte[] buf = new byte[bytes]; - // file.read(buf); + ZipFile zip = null; - // if(!(is_zip && (buf.length == 1))) { - // System.err.println("WARNING: Trailing garbage at end of " + file_name); - // System.err.println(bytes + " extra bytes: " + Utility.toHexString(buf)); - // } - // } - - // Read everything of interest, so close the file - file.close(); - if(zip != null) - zip.close(); + try { + if (fileOwned) { + if (is_zip) { + zip = new ZipFile(zip_file); + ZipEntry entry = zip.getEntry(file_name); + file = new DataInputStream(new BufferedInputStream(zip.getInputStream(entry), + BUFSIZE)); + } else { + file = new DataInputStream(new BufferedInputStream + (new FileInputStream(file_name), BUFSIZE)); + } + } + /****************** Read headers ********************************/ + // Check magic tag of class file + readID(); + + // Get compiler version + readVersion(); + + /****************** Read constant pool and related **************/ + // Read constant pool entries + readConstantPool(); + + // Get class information + readClassInfo(); + + // Get interface information, i.e., implemented interfaces + readInterfaces(); + + /****************** Read class fields and methods ***************/ + // Read class fields, i.e., the variables of the class + readFields(); + + // Read class methods, i.e., the functions in the class + readMethods(); + + // Read class attributes + readAttributes(); + + // Check for unknown variables + //Unknown[] u = Unknown.getUnknownAttributes(); + //for(int i=0; i < u.length; i++) + // System.err.println("WARNING: " + u[i]); + + // Everything should have been read now + // if(file.available() > 0) { + // int bytes = file.available(); + // byte[] buf = new byte[bytes]; + // file.read(buf); + + // if(!(is_zip && (buf.length == 1))) { + // System.err.println("WARNING: Trailing garbage at end of " + file_name); + // System.err.println(bytes + " extra bytes: " + Utility.toHexString(buf)); + // } + // } + } finally { + // Read everything of interest, so close the file + if (fileOwned) { + file.close(); + if (zip != null) + zip.close(); + } + } // Return the information we have gathered in a new object return new JavaClass(class_name_index, superclass_name_index, -- GitLab From 38eb8456f91d3d6ce51f1cced1bbfe9dfc08bcc5 Mon Sep 17 00:00:00 2001 From: Conor MacNeill Date: Wed, 13 Apr 2005 10:29:57 +0000 Subject: [PATCH 0250/1313] Removing an exception specification is not backward compatible. This change broke code in Ant I'm adding the throws clause back in. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@161171 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/ClassParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/ClassParser.java b/src/java/org/apache/bcel/classfile/ClassParser.java index 0e919dd8..d84dc0f7 100644 --- a/src/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/java/org/apache/bcel/classfile/ClassParser.java @@ -74,7 +74,7 @@ public final class ClassParser { * * @param file_name file name */ - public ClassParser(String file_name) + public ClassParser(String file_name) throws IOException { is_zip = false; this.file_name = file_name; -- GitLab From 34358032ad0c0ec2290366aa3972f1bee21726d4 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sat, 16 Apr 2005 00:52:35 +0000 Subject: [PATCH 0251/1313] Fix bug:19352 ANEWARRAY should implement StackConsumer git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@161530 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/ANEWARRAY.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/ANEWARRAY.java b/src/java/org/apache/bcel/generic/ANEWARRAY.java index cf3cd3fd..b95eb8b3 100644 --- a/src/java/org/apache/bcel/generic/ANEWARRAY.java +++ b/src/java/org/apache/bcel/generic/ANEWARRAY.java @@ -26,7 +26,7 @@ import org.apache.bcel.ExceptionConstants; * @author M. Dahm */ public class ANEWARRAY extends CPInstruction - implements LoadClass, AllocationInstruction, ExceptionThrower, StackProducer { + implements LoadClass, AllocationInstruction, ExceptionThrower, StackConsumer, StackProducer { /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. -- GitLab From 6ce8e738075e6e3a8035b19ba60c9b0f0bc82ec1 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Tue, 17 May 2005 01:01:26 +0000 Subject: [PATCH 0252/1313] fixed a "." vs "/" bug reported by Bjorn Blowqvist (darwin@forgeahead.hu), organized imports, formatting git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@170496 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/ClassPath.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index f304d45a..13b7d222 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -17,9 +17,18 @@ package org.apache.bcel.util; -import java.util.*; -import java.util.zip.*; -import java.io.*; +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.StringTokenizer; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; /** * Responsible for loading (class) files from the CLASSPATH. Inspired by @@ -157,7 +166,7 @@ public class ClassPath implements Serializable { * @return input stream for class */ public InputStream getInputStream(String name) throws IOException { - return getInputStream(name, ".class"); + return getInputStream(name.replace('.','/'), ".class"); } /** -- GitLab From 5d063eabaeeb26a849ad4b9f0517ec5a49196bf5 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Tue, 17 May 2005 01:04:32 +0000 Subject: [PATCH 0253/1313] organized imports, fixed some warnings git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@170497 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Repository.java | 5 +- .../apache/bcel/classfile/AccessFlags.java | 2 +- .../bcel/classfile/AnnotationEntry.java | 1 - .../org/apache/bcel/classfile/Attribute.java | 1 - .../apache/bcel/classfile/ClassParser.java | 11 ++- src/java/org/apache/bcel/classfile/Code.java | 6 +- .../apache/bcel/classfile/CodeException.java | 7 +- .../org/apache/bcel/classfile/Constant.java | 8 +- .../org/apache/bcel/classfile/ConstantCP.java | 6 +- .../apache/bcel/classfile/ConstantClass.java | 6 +- .../apache/bcel/classfile/ConstantDouble.java | 6 +- .../bcel/classfile/ConstantFieldref.java | 3 +- .../apache/bcel/classfile/ConstantFloat.java | 4 +- .../bcel/classfile/ConstantInteger.java | 6 +- .../classfile/ConstantInterfaceMethodref.java | 3 +- .../apache/bcel/classfile/ConstantLong.java | 6 +- .../bcel/classfile/ConstantMethodref.java | 3 +- .../bcel/classfile/ConstantNameAndType.java | 6 +- .../apache/bcel/classfile/ConstantPool.java | 7 +- .../apache/bcel/classfile/ConstantString.java | 6 +- .../apache/bcel/classfile/ConstantUtf8.java | 6 +- .../apache/bcel/classfile/ConstantValue.java | 6 +- .../org/apache/bcel/classfile/Deprecated.java | 6 +- .../apache/bcel/classfile/ExceptionTable.java | 6 +- src/java/org/apache/bcel/classfile/Field.java | 4 +- .../apache/bcel/classfile/FieldOrMethod.java | 4 +- .../org/apache/bcel/classfile/InnerClass.java | 6 +- .../apache/bcel/classfile/InnerClasses.java | 6 +- .../org/apache/bcel/classfile/JavaClass.java | 16 ++-- .../bcel/classfile/LineNumberTable.java | 6 +- .../apache/bcel/classfile/LocalVariable.java | 7 +- .../bcel/classfile/LocalVariableTable.java | 6 +- .../org/apache/bcel/classfile/Method.java | 1 - .../org/apache/bcel/classfile/PMGClass.java | 6 +- .../classfile/ParameterAnnotationEntry.java | 1 - .../bcel/classfile/ParameterAnnotations.java | 2 - .../RuntimeInvisibleAnnotations.java | 1 - .../RuntimeInvisibleParameterAnnotations.java | 1 - .../classfile/RuntimeVisibleAnnotations.java | 1 - .../RuntimeVisibleParameterAnnotations.java | 1 - .../org/apache/bcel/classfile/Signature.java | 7 +- .../org/apache/bcel/classfile/SourceFile.java | 6 +- .../org/apache/bcel/classfile/StackMap.java | 6 +- .../apache/bcel/classfile/StackMapType.java | 6 +- .../org/apache/bcel/classfile/Synthetic.java | 6 +- .../org/apache/bcel/classfile/Unknown.java | 8 +- .../org/apache/bcel/classfile/Utility.java | 17 +++- src/java/org/apache/bcel/generic/BIPUSH.java | 3 +- .../bcel/generic/BranchInstruction.java | 3 +- .../apache/bcel/generic/CPInstruction.java | 1 - .../org/apache/bcel/generic/ClassGen.java | 13 ++- .../apache/bcel/generic/ConstantPoolGen.java | 1 - .../org/apache/bcel/generic/FieldGen.java | 13 ++- .../bcel/generic/FieldGenOrMethodGen.java | 7 +- .../apache/bcel/generic/FieldOrMethod.java | 5 +- src/java/org/apache/bcel/generic/GOTO.java | 3 +- src/java/org/apache/bcel/generic/GOTO_W.java | 3 +- src/java/org/apache/bcel/generic/IINC.java | 13 +-- .../apache/bcel/generic/INVOKEINTERFACE.java | 6 +- .../org/apache/bcel/generic/Instruction.java | 1 - .../bcel/generic/InstructionHandle.java | 1 - .../apache/bcel/generic/InstructionList.java | 1 - .../bcel/generic/InvokeInstruction.java | 5 +- src/java/org/apache/bcel/generic/JSR.java | 3 +- src/java/org/apache/bcel/generic/JSR_W.java | 3 +- src/java/org/apache/bcel/generic/LDC.java | 3 +- .../org/apache/bcel/generic/LOOKUPSWITCH.java | 3 +- .../apache/bcel/generic/LocalVariableGen.java | 2 +- .../generic/LocalVariableInstruction.java | 1 - .../apache/bcel/generic/MULTIANEWARRAY.java | 7 +- .../org/apache/bcel/generic/MethodGen.java | 17 +++- .../org/apache/bcel/generic/NEWARRAY.java | 3 +- src/java/org/apache/bcel/generic/RET.java | 9 +- .../bcel/generic/ReturnaddressType.java | 1 - src/java/org/apache/bcel/generic/SIPUSH.java | 3 +- src/java/org/apache/bcel/generic/Select.java | 3 +- .../org/apache/bcel/generic/TABLESWITCH.java | 3 +- src/java/org/apache/bcel/generic/Type.java | 5 +- .../org/apache/bcel/util/AttributeHTML.java | 20 ++++- .../org/apache/bcel/util/BCELFactory.java | 38 ++++++++- src/java/org/apache/bcel/util/BCELifier.java | 17 +++- .../org/apache/bcel/util/ByteSequence.java | 3 +- src/java/org/apache/bcel/util/Class2HTML.java | 1 - .../org/apache/bcel/util/ClassLoader.java | 11 ++- .../bcel/util/ClassLoaderRepository.java | 1 - src/java/org/apache/bcel/util/ClassSet.java | 1 - src/java/org/apache/bcel/util/CodeHTML.java | 17 +++- .../org/apache/bcel/util/ConstantHTML.java | 15 +++- .../apache/bcel/util/InstructionFinder.java | 13 ++- .../org/apache/bcel/util/JavaWrapper.java | 3 +- src/java/org/apache/bcel/util/MethodHTML.java | 12 ++- .../apache/bcel/util/SyntheticRepository.java | 1 - .../bcel/verifier/GraphicalVerifier.java | 2 - .../org/apache/bcel/verifier/Verifier.java | 1 - .../bcel/verifier/VerifierAppFrame.java | 2 - .../apache/bcel/verifier/VerifyDialog.java | 1 - .../org/apache/bcel/verifier/exc/Utility.java | 3 +- .../verifier/statics/LocalVariableInfo.java | 4 +- .../verifier/statics/LocalVariablesInfo.java | 3 +- .../bcel/verifier/statics/Pass1Verifier.java | 9 +- .../bcel/verifier/statics/Pass2Verifier.java | 1 - .../bcel/verifier/statics/Pass3aVerifier.java | 84 +++++++++++++++++-- .../statics/StringRepresentation.java | 37 +++++++- .../structurals/ControlFlowGraph.java | 1 - .../structurals/ExceptionHandler.java | 3 +- .../structurals/ExceptionHandlers.java | 1 - .../structurals/InstructionContext.java | 1 - .../verifier/structurals/LocalVariables.java | 5 +- .../verifier/structurals/OperandStack.java | 9 +- .../verifier/structurals/Pass3bVerifier.java | 1 - .../bcel/verifier/structurals/Subroutine.java | 2 +- .../verifier/structurals/Subroutines.java | 1 - .../structurals/UninitializedObjectType.java | 5 +- 113 files changed, 520 insertions(+), 206 deletions(-) diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index 03e2b370..508abff8 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -17,9 +17,10 @@ package org.apache.bcel; +import java.io.IOException; import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.util.*; -import java.io.*; +import org.apache.bcel.util.ClassPath; +import org.apache.bcel.util.SyntheticRepository; /** * The repository maintains informations about class interdependencies, e.g., diff --git a/src/java/org/apache/bcel/classfile/AccessFlags.java b/src/java/org/apache/bcel/classfile/AccessFlags.java index 3af30e8e..564ee1fb 100644 --- a/src/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/java/org/apache/bcel/classfile/AccessFlags.java @@ -16,7 +16,7 @@ */ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; +import org.apache.bcel.Constants; /** * Super class for all objects that have modifiers like private, final, ... diff --git a/src/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/java/org/apache/bcel/classfile/AnnotationEntry.java index 1428e33f..e5794a47 100644 --- a/src/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -18,7 +18,6 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.IOException; - import org.apache.bcel.Constants; diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index c2449613..ca3734c4 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.io.Serializable; import java.util.HashMap; import java.util.Map; - import org.apache.bcel.Constants; /** diff --git a/src/java/org/apache/bcel/classfile/ClassParser.java b/src/java/org/apache/bcel/classfile/ClassParser.java index d84dc0f7..f663eab4 100644 --- a/src/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/java/org/apache/bcel/classfile/ClassParser.java @@ -16,9 +16,14 @@ */ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; -import java.util.zip.*; +import java.io.BufferedInputStream; +import java.io.DataInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import org.apache.bcel.Constants; /** * Wrapper class that parses a given Java .class file. The method Code diff --git a/src/java/org/apache/bcel/classfile/Constant.java b/src/java/org/apache/bcel/classfile/Constant.java index 8e7e41e2..4585ad8a 100644 --- a/src/java/org/apache/bcel/classfile/Constant.java +++ b/src/java/org/apache/bcel/classfile/Constant.java @@ -16,11 +16,13 @@ */ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.Serializable; +import org.apache.bcel.Constants; import org.apache.bcel.util.BCELComparator; -import java.io.*; - /** * Abstract superclass for classes to represent the different constant types * in the constant pool of a class file. The classes keep closely to diff --git a/src/java/org/apache/bcel/classfile/ConstantCP.java b/src/java/org/apache/bcel/classfile/ConstantCP.java index 5c15aa9b..0555f3da 100644 --- a/src/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/java/org/apache/bcel/classfile/ConstantCP.java @@ -16,8 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.*; -import org.apache.bcel.Constants; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * Abstract super class for Fieldref and Methodref constants. diff --git a/src/java/org/apache/bcel/classfile/ConstantClass.java b/src/java/org/apache/bcel/classfile/ConstantClass.java index c91ba38b..7a944135 100644 --- a/src/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/java/org/apache/bcel/classfile/ConstantClass.java @@ -16,8 +16,10 @@ */ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from the abstract diff --git a/src/java/org/apache/bcel/classfile/ConstantDouble.java b/src/java/org/apache/bcel/classfile/ConstantDouble.java index 30f04df7..fd372a7f 100644 --- a/src/java/org/apache/bcel/classfile/ConstantDouble.java +++ b/src/java/org/apache/bcel/classfile/ConstantDouble.java @@ -16,8 +16,10 @@ */ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from the abstract diff --git a/src/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/java/org/apache/bcel/classfile/ConstantFieldref.java index f9727f1e..05982bdb 100644 --- a/src/java/org/apache/bcel/classfile/ConstantFieldref.java +++ b/src/java/org/apache/bcel/classfile/ConstantFieldref.java @@ -16,8 +16,9 @@ */ package org.apache.bcel.classfile; +import java.io.DataInputStream; +import java.io.IOException; import org.apache.bcel.Constants; -import java.io.*; /** * This class represents a constant pool reference to a field. diff --git a/src/java/org/apache/bcel/classfile/ConstantFloat.java b/src/java/org/apache/bcel/classfile/ConstantFloat.java index d711a248..779e7b9c 100644 --- a/src/java/org/apache/bcel/classfile/ConstantFloat.java +++ b/src/java/org/apache/bcel/classfile/ConstantFloat.java @@ -16,8 +16,10 @@ */ package org.apache.bcel.classfile; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.Constants; -import java.io.*; /** * This class is derived from the abstract diff --git a/src/java/org/apache/bcel/classfile/ConstantInteger.java b/src/java/org/apache/bcel/classfile/ConstantInteger.java index 178a152e..6b9dd515 100644 --- a/src/java/org/apache/bcel/classfile/ConstantInteger.java +++ b/src/java/org/apache/bcel/classfile/ConstantInteger.java @@ -16,8 +16,10 @@ */ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from the abstract diff --git a/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java index 768af152..6317054b 100644 --- a/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java +++ b/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java @@ -16,8 +16,9 @@ */ package org.apache.bcel.classfile; +import java.io.DataInputStream; +import java.io.IOException; import org.apache.bcel.Constants; -import java.io.*; /** * This class represents a constant pool reference to an interface method. diff --git a/src/java/org/apache/bcel/classfile/ConstantLong.java b/src/java/org/apache/bcel/classfile/ConstantLong.java index d3e4a362..caf1195c 100644 --- a/src/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/java/org/apache/bcel/classfile/ConstantLong.java @@ -16,8 +16,10 @@ */ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from the abstract diff --git a/src/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/java/org/apache/bcel/classfile/ConstantMethodref.java index b96f7bfb..b8e901ef 100644 --- a/src/java/org/apache/bcel/classfile/ConstantMethodref.java +++ b/src/java/org/apache/bcel/classfile/ConstantMethodref.java @@ -16,8 +16,9 @@ */ package org.apache.bcel.classfile; +import java.io.DataInputStream; +import java.io.IOException; import org.apache.bcel.Constants; -import java.io.*; /** * This class represents a constant pool reference to a method. diff --git a/src/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/java/org/apache/bcel/classfile/ConstantNameAndType.java index c8b67c49..164f95af 100644 --- a/src/java/org/apache/bcel/classfile/ConstantNameAndType.java +++ b/src/java/org/apache/bcel/classfile/ConstantNameAndType.java @@ -16,8 +16,10 @@ */ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from the abstract diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/java/org/apache/bcel/classfile/ConstantPool.java index 84c1afd0..36ef3205 100644 --- a/src/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/java/org/apache/bcel/classfile/ConstantPool.java @@ -16,8 +16,11 @@ */ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.Serializable; +import org.apache.bcel.Constants; /** * This class represents the constant pool, i.e., a table of constants, of diff --git a/src/java/org/apache/bcel/classfile/ConstantString.java b/src/java/org/apache/bcel/classfile/ConstantString.java index 95c04148..837076a9 100644 --- a/src/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/java/org/apache/bcel/classfile/ConstantString.java @@ -16,8 +16,10 @@ */ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from the abstract diff --git a/src/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/java/org/apache/bcel/classfile/ConstantUtf8.java index b790a0fa..49ccb572 100644 --- a/src/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from the abstract diff --git a/src/java/org/apache/bcel/classfile/ConstantValue.java b/src/java/org/apache/bcel/classfile/ConstantValue.java index 483587a3..151c2633 100644 --- a/src/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/java/org/apache/bcel/classfile/ConstantValue.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from Attribute and represents a constant diff --git a/src/java/org/apache/bcel/classfile/Deprecated.java b/src/java/org/apache/bcel/classfile/Deprecated.java index fde6e337..8d1ebe2f 100644 --- a/src/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/java/org/apache/bcel/classfile/Deprecated.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from Attribute and denotes that this is a diff --git a/src/java/org/apache/bcel/classfile/ExceptionTable.java b/src/java/org/apache/bcel/classfile/ExceptionTable.java index 9e1c95f6..2725fcd8 100644 --- a/src/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/java/org/apache/bcel/classfile/ExceptionTable.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class represents the table of exceptions that are thrown by a diff --git a/src/java/org/apache/bcel/classfile/Field.java b/src/java/org/apache/bcel/classfile/Field.java index d24a9d53..9404212f 100644 --- a/src/java/org/apache/bcel/classfile/Field.java +++ b/src/java/org/apache/bcel/classfile/Field.java @@ -16,12 +16,12 @@ */ package org.apache.bcel.classfile; +import java.io.DataInputStream; +import java.io.IOException; import org.apache.bcel.Constants; import org.apache.bcel.generic.Type; import org.apache.bcel.util.BCELComparator; -import java.io.*; - /** * This class represents the field info structure, i.e., the representation * for a variable in the class. See JVM specification for details. diff --git a/src/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/java/org/apache/bcel/classfile/FieldOrMethod.java index a8f16375..5f3d8111 100644 --- a/src/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -16,8 +16,10 @@ */ package org.apache.bcel.classfile; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.Constants; -import java.io.*; /** * Abstract super class for fields and methods. diff --git a/src/java/org/apache/bcel/classfile/InnerClass.java b/src/java/org/apache/bcel/classfile/InnerClass.java index 2345a7e7..1af9452a 100644 --- a/src/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/java/org/apache/bcel/classfile/InnerClass.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class represents a inner class attribute, i.e., the class diff --git a/src/java/org/apache/bcel/classfile/InnerClasses.java b/src/java/org/apache/bcel/classfile/InnerClasses.java index 5d954ee4..caf01f4b 100644 --- a/src/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/java/org/apache/bcel/classfile/InnerClasses.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from Attribute and denotes that this class diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index b5dd5c3c..669700f2 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -17,15 +17,19 @@ package org.apache.bcel.classfile; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.StringTokenizer; import org.apache.bcel.Constants; +import org.apache.bcel.generic.Type; import org.apache.bcel.util.BCELComparator; -import org.apache.bcel.util.SyntheticRepository; -import org.apache.bcel.util.ClassVector; import org.apache.bcel.util.ClassQueue; -import org.apache.bcel.generic.Type; - -import java.io.*; -import java.util.StringTokenizer; +import org.apache.bcel.util.ClassVector; +import org.apache.bcel.util.SyntheticRepository; /** * Represents a Java class, i.e., the data structures, constant pool, diff --git a/src/java/org/apache/bcel/classfile/LineNumberTable.java b/src/java/org/apache/bcel/classfile/LineNumberTable.java index a65c933a..639c5c6d 100644 --- a/src/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/java/org/apache/bcel/classfile/LineNumberTable.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class represents a table of line numbers for debugging diff --git a/src/java/org/apache/bcel/classfile/LocalVariable.java b/src/java/org/apache/bcel/classfile/LocalVariable.java index f9dcce2b..79336e4e 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariable.java @@ -17,8 +17,11 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.Serializable; +import org.apache.bcel.Constants; /** * This class represents a local variable within a method. It contains its diff --git a/src/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/java/org/apache/bcel/classfile/LocalVariableTable.java index 88933a7d..c3c6ffff 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class represents colection of local variables in a diff --git a/src/java/org/apache/bcel/classfile/Method.java b/src/java/org/apache/bcel/classfile/Method.java index 0b013b53..2e979efb 100644 --- a/src/java/org/apache/bcel/classfile/Method.java +++ b/src/java/org/apache/bcel/classfile/Method.java @@ -18,7 +18,6 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.IOException; - import org.apache.bcel.Constants; import org.apache.bcel.generic.Type; import org.apache.bcel.util.BCELComparator; diff --git a/src/java/org/apache/bcel/classfile/PMGClass.java b/src/java/org/apache/bcel/classfile/PMGClass.java index 8585632e..8990bd93 100644 --- a/src/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/java/org/apache/bcel/classfile/PMGClass.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from Attribute and represents a reference diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index 17c7724e..d9d478d0 100644 --- a/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -18,7 +18,6 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.IOException; - import org.apache.bcel.Constants; diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/java/org/apache/bcel/classfile/ParameterAnnotations.java index b9235f8e..fe32b506 100644 --- a/src/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -19,8 +19,6 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.IOException; -import org.apache.bcel.Constants; - /** * base class for parameter annotations * diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 80969a83..63d7ca49 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -18,7 +18,6 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.IOException; - import org.apache.bcel.Constants; /** diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 94c3ad08..43b06458 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -18,7 +18,6 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.IOException; - import org.apache.bcel.Constants; /** diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 91e131b9..b5428961 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -18,7 +18,6 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.IOException; - import org.apache.bcel.Constants; /** diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index d0ece1c5..df3f1f69 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -18,7 +18,6 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.IOException; - import org.apache.bcel.Constants; /** diff --git a/src/java/org/apache/bcel/classfile/Signature.java b/src/java/org/apache/bcel/classfile/Signature.java index 319e3b55..8693a6d0 100644 --- a/src/java/org/apache/bcel/classfile/Signature.java +++ b/src/java/org/apache/bcel/classfile/Signature.java @@ -17,8 +17,11 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from Attribute and represents a reference diff --git a/src/java/org/apache/bcel/classfile/SourceFile.java b/src/java/org/apache/bcel/classfile/SourceFile.java index a456526c..b049f1ab 100644 --- a/src/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/java/org/apache/bcel/classfile/SourceFile.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from Attribute and represents a reference diff --git a/src/java/org/apache/bcel/classfile/StackMap.java b/src/java/org/apache/bcel/classfile/StackMap.java index d9a8af7a..ea66f7a1 100644 --- a/src/java/org/apache/bcel/classfile/StackMap.java +++ b/src/java/org/apache/bcel/classfile/StackMap.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class represents a stack map attribute used for diff --git a/src/java/org/apache/bcel/classfile/StackMapType.java b/src/java/org/apache/bcel/classfile/StackMapType.java index bb99d180..e3881f61 100644 --- a/src/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/java/org/apache/bcel/classfile/StackMapType.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class represents the type of a local variable or item on stack diff --git a/src/java/org/apache/bcel/classfile/Synthetic.java b/src/java/org/apache/bcel/classfile/Synthetic.java index 78ee5d83..5d6e62fa 100644 --- a/src/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/java/org/apache/bcel/classfile/Synthetic.java @@ -17,8 +17,10 @@ package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; /** * This class is derived from Attribute and declares this class as diff --git a/src/java/org/apache/bcel/classfile/Unknown.java b/src/java/org/apache/bcel/classfile/Unknown.java index dd79bc73..7b15a15e 100644 --- a/src/java/org/apache/bcel/classfile/Unknown.java +++ b/src/java/org/apache/bcel/classfile/Unknown.java @@ -17,9 +17,13 @@ package org.apache.bcel.classfile; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; import org.apache.bcel.Constants; -import java.io.*; -import java.util.*; /** * This class represents a reference to an unknown (i.e., diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 567dee72..0174249e 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -17,11 +17,22 @@ package org.apache.bcel.classfile; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.CharArrayReader; +import java.io.CharArrayWriter; +import java.io.FilterReader; +import java.io.FilterWriter; +import java.io.IOException; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.Reader; +import java.io.Writer; +import java.util.ArrayList; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; import org.apache.bcel.Constants; import org.apache.bcel.util.ByteSequence; -import java.io.*; -import java.util.ArrayList; -import java.util.zip.*; /** * Utility functions that do not really belong to any class in particular. diff --git a/src/java/org/apache/bcel/generic/BIPUSH.java b/src/java/org/apache/bcel/generic/BIPUSH.java index b681a0a1..7e33326f 100644 --- a/src/java/org/apache/bcel/generic/BIPUSH.java +++ b/src/java/org/apache/bcel/generic/BIPUSH.java @@ -17,7 +17,8 @@ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.util.ByteSequence; /** diff --git a/src/java/org/apache/bcel/generic/BranchInstruction.java b/src/java/org/apache/bcel/generic/BranchInstruction.java index 24173780..6a2a11f6 100644 --- a/src/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/java/org/apache/bcel/generic/BranchInstruction.java @@ -17,7 +17,8 @@ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.util.ByteSequence; /** diff --git a/src/java/org/apache/bcel/generic/CPInstruction.java b/src/java/org/apache/bcel/generic/CPInstruction.java index f752f2da..f3633456 100644 --- a/src/java/org/apache/bcel/generic/CPInstruction.java +++ b/src/java/org/apache/bcel/generic/CPInstruction.java @@ -19,7 +19,6 @@ package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; - import org.apache.bcel.classfile.Constant; import org.apache.bcel.classfile.ConstantClass; import org.apache.bcel.classfile.ConstantPool; diff --git a/src/java/org/apache/bcel/generic/ClassGen.java b/src/java/org/apache/bcel/generic/ClassGen.java index c8e694e1..b89871db 100644 --- a/src/java/org/apache/bcel/generic/ClassGen.java +++ b/src/java/org/apache/bcel/generic/ClassGen.java @@ -17,12 +17,17 @@ package org.apache.bcel.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.*; -import org.apache.bcel.util.BCELComparator; - import java.util.ArrayList; import java.util.Iterator; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.AccessFlags; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.SourceFile; +import org.apache.bcel.util.BCELComparator; /** * Template class for building up a java class. May be initialized with an diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/java/org/apache/bcel/generic/ConstantPoolGen.java index 54a7881a..e64cb9e2 100644 --- a/src/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -19,7 +19,6 @@ package org.apache.bcel.generic; import java.util.HashMap; import java.util.Map; - import org.apache.bcel.Constants; import org.apache.bcel.classfile.Constant; import org.apache.bcel.classfile.ConstantCP; diff --git a/src/java/org/apache/bcel/generic/FieldGen.java b/src/java/org/apache/bcel/generic/FieldGen.java index 50f82fa2..a67f432b 100644 --- a/src/java/org/apache/bcel/generic/FieldGen.java +++ b/src/java/org/apache/bcel/generic/FieldGen.java @@ -17,12 +17,17 @@ package org.apache.bcel.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.*; -import org.apache.bcel.util.BCELComparator; - import java.util.ArrayList; import java.util.Iterator; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantObject; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.util.BCELComparator; /** * Template class for building up a field. The only extraordinary thing diff --git a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 7a30e371..74dddb8d 100644 --- a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -1,9 +1,8 @@ package org.apache.bcel.generic; -import org.apache.bcel.Constants; - - -import org.apache.bcel.classfile.*; import java.util.ArrayList; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.AccessFlags; +import org.apache.bcel.classfile.Attribute; /** * Super class for FieldGen and MethodGen objects, since they have diff --git a/src/java/org/apache/bcel/generic/FieldOrMethod.java b/src/java/org/apache/bcel/generic/FieldOrMethod.java index 9031405a..43214d8f 100644 --- a/src/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/java/org/apache/bcel/generic/FieldOrMethod.java @@ -16,7 +16,10 @@ */ package org.apache.bcel.generic; -import org.apache.bcel.classfile.*; +import org.apache.bcel.classfile.ConstantCP; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; /** * Super class for InvokeInstruction and FieldInstruction, since they have diff --git a/src/java/org/apache/bcel/generic/GOTO.java b/src/java/org/apache/bcel/generic/GOTO.java index c9393189..2ad62f17 100644 --- a/src/java/org/apache/bcel/generic/GOTO.java +++ b/src/java/org/apache/bcel/generic/GOTO.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; /** * GOTO - Branch always (to relative offset, not absolute address) diff --git a/src/java/org/apache/bcel/generic/GOTO_W.java b/src/java/org/apache/bcel/generic/GOTO_W.java index 922e2980..c025d3ba 100644 --- a/src/java/org/apache/bcel/generic/GOTO_W.java +++ b/src/java/org/apache/bcel/generic/GOTO_W.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.util.ByteSequence; /** diff --git a/src/java/org/apache/bcel/generic/IINC.java b/src/java/org/apache/bcel/generic/IINC.java index 06bc63bf..e9388ea5 100644 --- a/src/java/org/apache/bcel/generic/IINC.java +++ b/src/java/org/apache/bcel/generic/IINC.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.util.ByteSequence; /** @@ -69,18 +70,18 @@ public class IINC extends LocalVariableInstruction { } private final void setWide() { - if(wide = ((n > org.apache.bcel.Constants.MAX_BYTE) || - (Math.abs(c) > Byte.MAX_VALUE))) + wide = (n > org.apache.bcel.Constants.MAX_BYTE) || (Math.abs(c) > Byte.MAX_VALUE); + if(wide) { length = 6; // wide byte included - else + } else { length = 3; + } } /** * Read needed data (e.g. index) from file. */ - protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException - { + protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException { this.wide = wide; if(wide) { diff --git a/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java index 30f3794e..7a3b5c66 100644 --- a/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -16,11 +16,11 @@ */ package org.apache.bcel.generic; -import org.apache.bcel.classfile.ConstantPool; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.Constants; import org.apache.bcel.ExceptionConstants; - -import java.io.*; +import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.util.ByteSequence; /** diff --git a/src/java/org/apache/bcel/generic/Instruction.java b/src/java/org/apache/bcel/generic/Instruction.java index d5cd90a2..af10caf6 100644 --- a/src/java/org/apache/bcel/generic/Instruction.java +++ b/src/java/org/apache/bcel/generic/Instruction.java @@ -20,7 +20,6 @@ package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; - import org.apache.bcel.Constants; import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.util.ByteSequence; diff --git a/src/java/org/apache/bcel/generic/InstructionHandle.java b/src/java/org/apache/bcel/generic/InstructionHandle.java index 56690aa2..c25873fc 100644 --- a/src/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/java/org/apache/bcel/generic/InstructionHandle.java @@ -22,7 +22,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; - import org.apache.bcel.classfile.Utility; /** diff --git a/src/java/org/apache/bcel/generic/InstructionList.java b/src/java/org/apache/bcel/generic/InstructionList.java index 30cef26b..eaa99db9 100644 --- a/src/java/org/apache/bcel/generic/InstructionList.java +++ b/src/java/org/apache/bcel/generic/InstructionList.java @@ -25,7 +25,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; - import org.apache.bcel.Constants; import org.apache.bcel.classfile.Constant; import org.apache.bcel.util.ByteSequence; diff --git a/src/java/org/apache/bcel/generic/InvokeInstruction.java b/src/java/org/apache/bcel/generic/InvokeInstruction.java index 2cb102f3..3d8010be 100644 --- a/src/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/java/org/apache/bcel/generic/InvokeInstruction.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.*; import java.util.StringTokenizer; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantPool; /** * Super class for the INVOKExxx family of instructions. diff --git a/src/java/org/apache/bcel/generic/JSR.java b/src/java/org/apache/bcel/generic/JSR.java index b0e24784..76a87414 100644 --- a/src/java/org/apache/bcel/generic/JSR.java +++ b/src/java/org/apache/bcel/generic/JSR.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; /** * JSR - Jump to subroutine diff --git a/src/java/org/apache/bcel/generic/JSR_W.java b/src/java/org/apache/bcel/generic/JSR_W.java index 408dacb8..4360a21e 100644 --- a/src/java/org/apache/bcel/generic/JSR_W.java +++ b/src/java/org/apache/bcel/generic/JSR_W.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.util.ByteSequence; /** diff --git a/src/java/org/apache/bcel/generic/LDC.java b/src/java/org/apache/bcel/generic/LDC.java index c80dde66..be645ad6 100644 --- a/src/java/org/apache/bcel/generic/LDC.java +++ b/src/java/org/apache/bcel/generic/LDC.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.util.ByteSequence; /** diff --git a/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java index 659a7599..f527fec2 100644 --- a/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java +++ b/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.util.ByteSequence; /** diff --git a/src/java/org/apache/bcel/generic/LocalVariableGen.java b/src/java/org/apache/bcel/generic/LocalVariableGen.java index fdacee37..afe57963 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/java/org/apache/bcel/generic/LocalVariableGen.java @@ -18,7 +18,7 @@ package org.apache.bcel.generic; import org.apache.bcel.Constants; -import org.apache.bcel.classfile.*; +import org.apache.bcel.classfile.LocalVariable; /** * This class represents a local variable within a method. It contains its diff --git a/src/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/java/org/apache/bcel/generic/LocalVariableInstruction.java index 14546b65..eb3142f4 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -18,7 +18,6 @@ package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; - import org.apache.bcel.Constants; import org.apache.bcel.util.ByteSequence; diff --git a/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java index dc3b4db2..80eb20e9 100644 --- a/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java +++ b/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java @@ -16,10 +16,11 @@ */ package org.apache.bcel.generic; -import java.io.*; -import org.apache.bcel.util.ByteSequence; -import org.apache.bcel.classfile.ConstantPool; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.ExceptionConstants; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.util.ByteSequence; /** * MULTIANEWARRAY - Create new mutidimensional array of references diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index 313b1232..34fbeaf6 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -17,12 +17,23 @@ package org.apache.bcel.generic; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.Stack; import org.apache.bcel.Constants; -import org.apache.bcel.classfile.*; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; import org.apache.bcel.util.BCELComparator; -import java.util.*; - /** * Template class for building up a method. This is done by defining exception * handlers, adding thrown exceptions, local variables and attributes, whereas diff --git a/src/java/org/apache/bcel/generic/NEWARRAY.java b/src/java/org/apache/bcel/generic/NEWARRAY.java index a144f656..c853ebde 100644 --- a/src/java/org/apache/bcel/generic/NEWARRAY.java +++ b/src/java/org/apache/bcel/generic/NEWARRAY.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.util.ByteSequence; /** diff --git a/src/java/org/apache/bcel/generic/RET.java b/src/java/org/apache/bcel/generic/RET.java index eb17b527..2e4b715e 100644 --- a/src/java/org/apache/bcel/generic/RET.java +++ b/src/java/org/apache/bcel/generic/RET.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.util.ByteSequence; /** @@ -59,10 +60,12 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc } private final void setWide() { - if(wide = index > org.apache.bcel.Constants.MAX_BYTE) + wide = index > org.apache.bcel.Constants.MAX_BYTE; + if(wide) { length = 4; // Including the wide byte - else + } else { length = 2; + } } /** diff --git a/src/java/org/apache/bcel/generic/ReturnaddressType.java b/src/java/org/apache/bcel/generic/ReturnaddressType.java index 086c4ad8..740d7cbf 100644 --- a/src/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/java/org/apache/bcel/generic/ReturnaddressType.java @@ -17,7 +17,6 @@ package org.apache.bcel.generic; import org.apache.bcel.Constants; -import org.apache.bcel.generic.InstructionHandle; /** * Returnaddress, the type JSR or JSR_W instructions push upon the stack. diff --git a/src/java/org/apache/bcel/generic/SIPUSH.java b/src/java/org/apache/bcel/generic/SIPUSH.java index 0c6efda8..531cff51 100644 --- a/src/java/org/apache/bcel/generic/SIPUSH.java +++ b/src/java/org/apache/bcel/generic/SIPUSH.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.util.ByteSequence; /** diff --git a/src/java/org/apache/bcel/generic/Select.java b/src/java/org/apache/bcel/generic/Select.java index 4e947efe..f0464e15 100644 --- a/src/java/org/apache/bcel/generic/Select.java +++ b/src/java/org/apache/bcel/generic/Select.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.util.ByteSequence; /** diff --git a/src/java/org/apache/bcel/generic/TABLESWITCH.java b/src/java/org/apache/bcel/generic/TABLESWITCH.java index c242d66c..3ed1c249 100644 --- a/src/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/java/org/apache/bcel/generic/TABLESWITCH.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.generic; -import java.io.*; +import java.io.DataOutputStream; +import java.io.IOException; import org.apache.bcel.util.ByteSequence; /** diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index bf958f36..9636d8f0 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -17,9 +17,10 @@ package org.apache.bcel.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.*; import java.util.ArrayList; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.ClassFormatException; +import org.apache.bcel.classfile.Utility; /** * Abstract super class for all possible java types, namely basic types diff --git a/src/java/org/apache/bcel/util/AttributeHTML.java b/src/java/org/apache/bcel/util/AttributeHTML.java index a1cf9124..8b1f17ba 100644 --- a/src/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/java/org/apache/bcel/util/AttributeHTML.java @@ -17,8 +17,24 @@ package org.apache.bcel.util; -import org.apache.bcel.classfile.*; -import java.io.*; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.InnerClass; +import org.apache.bcel.classfile.InnerClasses; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.SourceFile; +import org.apache.bcel.classfile.Utility; /** * Convert found attributes into HTML file. diff --git a/src/java/org/apache/bcel/util/BCELFactory.java b/src/java/org/apache/bcel/util/BCELFactory.java index ae3fb120..8e35b938 100644 --- a/src/java/org/apache/bcel/util/BCELFactory.java +++ b/src/java/org/apache/bcel/util/BCELFactory.java @@ -1,10 +1,40 @@ package org.apache.bcel.util; -import org.apache.bcel.generic.*; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.Constants; import java.io.PrintWriter; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.generic.AllocationInstruction; +import org.apache.bcel.generic.ArrayInstruction; +import org.apache.bcel.generic.BranchHandle; +import org.apache.bcel.generic.BranchInstruction; +import org.apache.bcel.generic.CHECKCAST; +import org.apache.bcel.generic.CPInstruction; +import org.apache.bcel.generic.CodeExceptionGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.ConstantPushInstruction; +import org.apache.bcel.generic.EmptyVisitor; +import org.apache.bcel.generic.FieldInstruction; +import org.apache.bcel.generic.IINC; +import org.apache.bcel.generic.INSTANCEOF; +import org.apache.bcel.generic.Instruction; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InvokeInstruction; +import org.apache.bcel.generic.LDC; +import org.apache.bcel.generic.LDC2_W; +import org.apache.bcel.generic.LocalVariableInstruction; +import org.apache.bcel.generic.MULTIANEWARRAY; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.NEWARRAY; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.RET; +import org.apache.bcel.generic.ReturnInstruction; +import org.apache.bcel.generic.Select; +import org.apache.bcel.generic.Type; /** diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java index a42cf5e0..c128a73c 100644 --- a/src/java/org/apache/bcel/util/BCELifier.java +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -16,11 +16,20 @@ */ package org.apache.bcel.util; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; -import org.apache.bcel.Repository; +import java.io.OutputStream; +import java.io.PrintWriter; import org.apache.bcel.Constants; -import java.io.*; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.Type; /** * This class takes a given JavaClass object and converts it to a diff --git a/src/java/org/apache/bcel/util/ByteSequence.java b/src/java/org/apache/bcel/util/ByteSequence.java index 8d8c939b..70ad8904 100644 --- a/src/java/org/apache/bcel/util/ByteSequence.java +++ b/src/java/org/apache/bcel/util/ByteSequence.java @@ -16,7 +16,8 @@ */ package org.apache.bcel.util; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; /** * Utility class that implements a sequence of bytes which can be read diff --git a/src/java/org/apache/bcel/util/Class2HTML.java b/src/java/org/apache/bcel/util/Class2HTML.java index 8afc684f..846ed951 100644 --- a/src/java/org/apache/bcel/util/Class2HTML.java +++ b/src/java/org/apache/bcel/util/Class2HTML.java @@ -21,7 +21,6 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; - import org.apache.bcel.Constants; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.ClassParser; diff --git a/src/java/org/apache/bcel/util/ClassLoader.java b/src/java/org/apache/bcel/util/ClassLoader.java index a249e0e4..61655e8e 100644 --- a/src/java/org/apache/bcel/util/ClassLoader.java +++ b/src/java/org/apache/bcel/util/ClassLoader.java @@ -17,10 +17,15 @@ package org.apache.bcel.util; +import java.io.ByteArrayInputStream; import java.util.Hashtable; -import java.io.*; -import org.apache.bcel.*; -import org.apache.bcel.classfile.*; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Utility; /** *

        Drop in replacement for the standard class loader of the JVM. You can use it diff --git a/src/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/java/org/apache/bcel/util/ClassLoaderRepository.java index 1aff3450..eff1373b 100644 --- a/src/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -21,7 +21,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; - import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; diff --git a/src/java/org/apache/bcel/util/ClassSet.java b/src/java/org/apache/bcel/util/ClassSet.java index 62e6ec86..36fb3e6b 100644 --- a/src/java/org/apache/bcel/util/ClassSet.java +++ b/src/java/org/apache/bcel/util/ClassSet.java @@ -19,7 +19,6 @@ package org.apache.bcel.util; import java.util.Collection; import java.util.HashMap; import java.util.Map; - import org.apache.bcel.classfile.JavaClass; /** diff --git a/src/java/org/apache/bcel/util/CodeHTML.java b/src/java/org/apache/bcel/util/CodeHTML.java index 2f30860a..1314257d 100644 --- a/src/java/org/apache/bcel/util/CodeHTML.java +++ b/src/java/org/apache/bcel/util/CodeHTML.java @@ -17,9 +17,22 @@ package org.apache.bcel.util; -import org.apache.bcel.classfile.*; -import java.io.*; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; import java.util.BitSet; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; /** * Convert code into HTML file. diff --git a/src/java/org/apache/bcel/util/ConstantHTML.java b/src/java/org/apache/bcel/util/ConstantHTML.java index 5ca4a7e7..d7fc5182 100644 --- a/src/java/org/apache/bcel/util/ConstantHTML.java +++ b/src/java/org/apache/bcel/util/ConstantHTML.java @@ -18,8 +18,19 @@ package org.apache.bcel.util; -import org.apache.bcel.classfile.*; -import java.io.*; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; /** * Convert constant pool into HTML file. diff --git a/src/java/org/apache/bcel/util/InstructionFinder.java b/src/java/org/apache/bcel/util/InstructionFinder.java index cbe57ff2..dd1fee33 100644 --- a/src/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/java/org/apache/bcel/util/InstructionFinder.java @@ -17,10 +17,17 @@ package org.apache.bcel.util; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; import org.apache.bcel.Constants; -import org.apache.bcel.generic.*; -import org.apache.regexp.*; +import org.apache.bcel.generic.ClassGenException; +import org.apache.bcel.generic.Instruction; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.regexp.RE; +import org.apache.regexp.RESyntaxException; /** * InstructionFinder is a tool to search for given instructions patterns, diff --git a/src/java/org/apache/bcel/util/JavaWrapper.java b/src/java/org/apache/bcel/util/JavaWrapper.java index 04236f6c..b7aa6b75 100644 --- a/src/java/org/apache/bcel/util/JavaWrapper.java +++ b/src/java/org/apache/bcel/util/JavaWrapper.java @@ -17,7 +17,8 @@ package org.apache.bcel.util; -import java.lang.reflect.*; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; /** * Java interpreter replacement, i.e., wrapper that uses its own ClassLoader diff --git a/src/java/org/apache/bcel/util/MethodHTML.java b/src/java/org/apache/bcel/util/MethodHTML.java index 7a5164c4..bad48fa9 100644 --- a/src/java/org/apache/bcel/util/MethodHTML.java +++ b/src/java/org/apache/bcel/util/MethodHTML.java @@ -17,8 +17,16 @@ package org.apache.bcel.util; -import org.apache.bcel.classfile.*; -import java.io.*; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; /** * Convert methods and fields into HTML file. diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/java/org/apache/bcel/util/SyntheticRepository.java index f373b7dd..b9e1942f 100644 --- a/src/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/java/org/apache/bcel/util/SyntheticRepository.java @@ -22,7 +22,6 @@ import java.io.InputStream; import java.lang.ref.SoftReference; import java.util.HashMap; import java.util.Map; - import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; diff --git a/src/java/org/apache/bcel/verifier/GraphicalVerifier.java b/src/java/org/apache/bcel/verifier/GraphicalVerifier.java index bdccef42..20c05cf2 100644 --- a/src/java/org/apache/bcel/verifier/GraphicalVerifier.java +++ b/src/java/org/apache/bcel/verifier/GraphicalVerifier.java @@ -19,9 +19,7 @@ package org.apache.bcel.verifier; import java.awt.Dimension; import java.awt.Toolkit; - import javax.swing.UIManager; - import org.apache.bcel.generic.Type; diff --git a/src/java/org/apache/bcel/verifier/Verifier.java b/src/java/org/apache/bcel/verifier/Verifier.java index 86fbbb3b..4bd7a50f 100644 --- a/src/java/org/apache/bcel/verifier/Verifier.java +++ b/src/java/org/apache/bcel/verifier/Verifier.java @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; - import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.verifier.statics.Pass1Verifier; import org.apache.bcel.verifier.statics.Pass2Verifier; diff --git a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/java/org/apache/bcel/verifier/VerifierAppFrame.java index 475bd394..10a46bd9 100644 --- a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -24,7 +24,6 @@ import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.WindowEvent; - import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JList; @@ -38,7 +37,6 @@ import javax.swing.JSplitPane; import javax.swing.JTextPane; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; - import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; diff --git a/src/java/org/apache/bcel/verifier/VerifyDialog.java b/src/java/org/apache/bcel/verifier/VerifyDialog.java index df73a5be..8c5eb336 100644 --- a/src/java/org/apache/bcel/verifier/VerifyDialog.java +++ b/src/java/org/apache/bcel/verifier/VerifyDialog.java @@ -18,7 +18,6 @@ package org.apache.bcel.verifier; import java.awt.Color; - import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; diff --git a/src/java/org/apache/bcel/verifier/exc/Utility.java b/src/java/org/apache/bcel/verifier/exc/Utility.java index 226e2d63..605de8eb 100644 --- a/src/java/org/apache/bcel/verifier/exc/Utility.java +++ b/src/java/org/apache/bcel/verifier/exc/Utility.java @@ -17,7 +17,8 @@ package org.apache.bcel.verifier.exc; -import java.io.*; +import java.io.PrintWriter; +import java.io.StringWriter; /** * A utility class providing convenience methods concerning Throwable instances. diff --git a/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java index 3b04c028..268df144 100644 --- a/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java +++ b/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java @@ -17,9 +17,9 @@ package org.apache.bcel.verifier.statics; -import org.apache.bcel.generic.Type; -import org.apache.bcel.verifier.exc.*; import java.util.Hashtable; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; /** * A utility class holding the information about diff --git a/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java index 1ecfbcd3..1dacd948 100644 --- a/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java +++ b/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java @@ -18,7 +18,8 @@ package org.apache.bcel.verifier.statics; import org.apache.bcel.generic.Type; -import org.apache.bcel.verifier.exc.*; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; /** * A utility class holding the information about diff --git a/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index 3afba05b..de925b93 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -17,10 +17,13 @@ package org.apache.bcel.verifier.statics; -import org.apache.bcel.classfile.*; import org.apache.bcel.Repository; -import org.apache.bcel.verifier.*; -import org.apache.bcel.verifier.exc.*; +import org.apache.bcel.classfile.ClassFormatException; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.verifier.PassVerifier; +import org.apache.bcel.verifier.VerificationResult; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.exc.LoadingException; import org.apache.bcel.verifier.exc.Utility; /** diff --git a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 689b9cd9..b94c6dd8 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -21,7 +21,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; - import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.Attribute; diff --git a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index c20ed835..35639146 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -17,11 +17,85 @@ package org.apache.bcel.verifier.statics; -import org.apache.bcel.*; -import org.apache.bcel.generic.*; -import org.apache.bcel.classfile.*; -import org.apache.bcel.verifier.*; -import org.apache.bcel.verifier.exc.*; +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ALOAD; +import org.apache.bcel.generic.ANEWARRAY; +import org.apache.bcel.generic.ASTORE; +import org.apache.bcel.generic.ATHROW; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.BREAKPOINT; +import org.apache.bcel.generic.CHECKCAST; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.DLOAD; +import org.apache.bcel.generic.DSTORE; +import org.apache.bcel.generic.FLOAD; +import org.apache.bcel.generic.FSTORE; +import org.apache.bcel.generic.FieldInstruction; +import org.apache.bcel.generic.GETSTATIC; +import org.apache.bcel.generic.GotoInstruction; +import org.apache.bcel.generic.IINC; +import org.apache.bcel.generic.ILOAD; +import org.apache.bcel.generic.IMPDEP1; +import org.apache.bcel.generic.IMPDEP2; +import org.apache.bcel.generic.INSTANCEOF; +import org.apache.bcel.generic.INVOKEINTERFACE; +import org.apache.bcel.generic.INVOKESPECIAL; +import org.apache.bcel.generic.INVOKESTATIC; +import org.apache.bcel.generic.INVOKEVIRTUAL; +import org.apache.bcel.generic.ISTORE; +import org.apache.bcel.generic.Instruction; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.InvokeInstruction; +import org.apache.bcel.generic.JsrInstruction; +import org.apache.bcel.generic.LDC; +import org.apache.bcel.generic.LDC2_W; +import org.apache.bcel.generic.LLOAD; +import org.apache.bcel.generic.LOOKUPSWITCH; +import org.apache.bcel.generic.LSTORE; +import org.apache.bcel.generic.LoadClass; +import org.apache.bcel.generic.MULTIANEWARRAY; +import org.apache.bcel.generic.NEW; +import org.apache.bcel.generic.NEWARRAY; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.PUTSTATIC; +import org.apache.bcel.generic.RET; +import org.apache.bcel.generic.ReturnInstruction; +import org.apache.bcel.generic.TABLESWITCH; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.PassVerifier; +import org.apache.bcel.verifier.VerificationResult; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.VerifierFactory; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.ClassConstraintException; +import org.apache.bcel.verifier.exc.InvalidMethodException; +import org.apache.bcel.verifier.exc.StaticCodeConstraintException; +import org.apache.bcel.verifier.exc.StaticCodeInstructionConstraintException; +import org.apache.bcel.verifier.exc.StaticCodeInstructionOperandConstraintException; /** * This PassVerifier verifies a class file according to diff --git a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 46911349..b1505cbe 100644 --- a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -17,9 +17,40 @@ package org.apache.bcel.verifier.statics; -import org.apache.bcel.classfile.*; -import org.apache.bcel.classfile.Deprecated; // use _this_ one! -import org.apache.bcel.verifier.exc.*; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Deprecated; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.InnerClass; +import org.apache.bcel.classfile.InnerClasses; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Node; +import org.apache.bcel.classfile.Signature; +import org.apache.bcel.classfile.SourceFile; +import org.apache.bcel.classfile.StackMap; +import org.apache.bcel.classfile.Synthetic; +import org.apache.bcel.classfile.Unknown; +import org.apache.bcel.classfile.Visitor; +import org.apache.bcel.verifier.exc.AssertionViolatedException; /** * BCEL's Node classes (those from the classfile API that accept() Visitor diff --git a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index 5bfd6ede..38bd91df 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -20,7 +20,6 @@ package org.apache.bcel.verifier.structurals; import java.util.ArrayList; import java.util.Hashtable; import java.util.Map; - import org.apache.bcel.generic.ATHROW; import org.apache.bcel.generic.BranchInstruction; import org.apache.bcel.generic.GotoInstruction; diff --git a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java index c710ba58..00939e2a 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java +++ b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java @@ -17,7 +17,8 @@ package org.apache.bcel.verifier.structurals; -import org.apache.bcel.generic.*; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.ObjectType; /** * This class represents an exception handler; that is, an ObjectType diff --git a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index 812f956f..af64357a 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -20,7 +20,6 @@ package org.apache.bcel.verifier.structurals; import java.util.HashSet; import java.util.Hashtable; import java.util.Set; - import org.apache.bcel.generic.CodeExceptionGen; import org.apache.bcel.generic.InstructionHandle; import org.apache.bcel.generic.MethodGen; diff --git a/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java index cc8c252a..f8bc6b54 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -18,7 +18,6 @@ package org.apache.bcel.verifier.structurals; import java.util.ArrayList; - import org.apache.bcel.generic.InstructionHandle; /** diff --git a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 0ddcb8ba..8c351582 100644 --- a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -17,9 +17,10 @@ package org.apache.bcel.verifier.structurals; -import org.apache.bcel.generic.Type; import org.apache.bcel.generic.ReferenceType; -import org.apache.bcel.verifier.exc.*; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; /** * This class implements an array of local variables used for symbolic JVM diff --git a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/java/org/apache/bcel/verifier/structurals/OperandStack.java index 0297604b..32d5f475 100644 --- a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -17,9 +17,12 @@ package org.apache.bcel.verifier.structurals; -import org.apache.bcel.generic.*; -import org.apache.bcel.verifier.exc.*; -import java.util.*; +import java.util.ArrayList; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.ReferenceType; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; /** * This class implements a stack used for symbolic JVM stack simulation. diff --git a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index e509d6e8..1c6838ef 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -22,7 +22,6 @@ import java.io.StringWriter; import java.util.ArrayList; import java.util.Random; import java.util.Vector; - import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; diff --git a/src/java/org/apache/bcel/verifier/structurals/Subroutine.java b/src/java/org/apache/bcel/verifier/structurals/Subroutine.java index 9f595993..d932e79d 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Subroutine.java +++ b/src/java/org/apache/bcel/verifier/structurals/Subroutine.java @@ -17,7 +17,7 @@ package org.apache.bcel.verifier.structurals; -import org.apache.bcel.generic.*; +import org.apache.bcel.generic.InstructionHandle; /** * This interface defines properties of JVM bytecode subroutines. diff --git a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java index 15d4591d..4ac698e0 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -24,7 +24,6 @@ import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.Set; - import org.apache.bcel.generic.ASTORE; import org.apache.bcel.generic.ATHROW; import org.apache.bcel.generic.BranchInstruction; diff --git a/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index bee7a5ed..a66191ee 100644 --- a/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -17,8 +17,9 @@ package org.apache.bcel.verifier.structurals; -import org.apache.bcel.*; -import org.apache.bcel.generic.*; +import org.apache.bcel.Constants; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.ReferenceType; /** * This class represents an uninitialized object type; see The Java -- GitLab From d01c03aa83438655a89f5036a31f56e274aecc18 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sat, 11 Jun 2005 00:47:39 +0000 Subject: [PATCH 0254/1313] For FieldOrMethod.getClassName changed to support java5.0 for old clients. thanks Dave Hovemeyer * @deprecated If the instruction references an array class, * this method will return "java.lang.Object". * For code generated by Java 1.5, this answer is * sometimes wrong (e.g., if the "clone()" method is * called on an array). A better idea is to use * the getReferenceType() method, which correctly distinguishes * between class types and array types. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@190050 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/generic/FieldOrMethod.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/FieldOrMethod.java b/src/java/org/apache/bcel/generic/FieldOrMethod.java index 43214d8f..f2879c46 100644 --- a/src/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/java/org/apache/bcel/generic/FieldOrMethod.java @@ -62,11 +62,23 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { } /** @return name of the referenced class/interface + * @deprecated If the instruction references an array class, + * this method will return "java.lang.Object". + * For code generated by Java 1.5, this answer is + * sometimes wrong (e.g., if the "clone()" method is + * called on an array). A better idea is to use + * the getReferenceType() method, which correctly distinguishes + * between class types and array types. */ public String getClassName(ConstantPoolGen cpg) { ConstantPool cp = cpg.getConstantPool(); ConstantCP cmr = (ConstantCP)cp.getConstant(index); - return cp.getConstantString(cmr.getClassIndex(), org.apache.bcel.Constants.CONSTANT_Class).replace('/', '.'); + String className = cp.getConstantString(cmr.getClassIndex(), org.apache.bcel.Constants.CONSTANT_Class); + if (className.startsWith("[")) { + // Turn array classes into java.lang.Object. + return "java.lang.Object"; + } + return className.replace('/', '.'); } /** @return type of the referenced class/interface -- GitLab From cee9cbd4e23188a38f48d27f493d7bedf9a6f3f7 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 17 Jul 2005 00:53:03 +0000 Subject: [PATCH 0255/1313] Bug 33822: Change Faculty to Factorial, as was the intention of the samples. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@219362 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 4 ++-- xdocs/manual.xml | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build.xml b/build.xml index 37494670..3bbd70d6 100644 --- a/build.xml +++ b/build.xml @@ -77,7 +77,7 @@ Available targets: - + @@ -139,7 +139,7 @@ Available targets: - + diff --git a/xdocs/manual.xml b/xdocs/manual.xml index 7897ad3b..914d9d52 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -430,7 +430,7 @@

        The following example program prompts for a number and prints the - faculty of it. The readLine() method reading from the + factorial of it. The readLine() method reading from the standard input may raise an IOException and if a misspelled number is passed to parseInt() it throws a NumberFormatException. Thus, the critical area of code @@ -440,7 +440,7 @@ import java.io.*; - public class Faculty { + public class Factorial { private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); @@ -460,7 +460,7 @@ public static void main(String[] argv) { int n = readInt(); - System.out.println("Faculty of " + n + " is " + fac(n)); + System.out.println("Factorial of " + n + " is " + fac(n)); } } @@ -479,7 +479,7 @@ 9: iload_0 10: iconst_1 11: isub - 12: invokestatic Faculty.fac (I)I (12) + 12: invokestatic Factorial.fac (I)I (12) 15: imul 16: ireturn @@ -513,7 +513,7 @@ 4: getstatic java.lang.System.out Ljava/io/PrintStream; 7: ldc "Please enter a number> " 9: invokevirtual java.io.PrintStream.print (Ljava/lang/String;)V - 12: getstatic Faculty.in Ljava/io/BufferedReader; + 12: getstatic Factorial.in Ljava/io/BufferedReader; 15: invokevirtual java.io.BufferedReader.readLine ()Ljava/lang/String; 18: invokestatic java.lang.Integer.parseInt (Ljava/lang/String;)I 21: istore_0 @@ -981,7 +981,7 @@

        Using instruction lists gives us a generic view upon the code: In Figure 5 we again present the code chunk - of the readInt() method of the faculty example in section + of the readInt() method of the factorial example in section 2.6: The local variables n and e1 both hold two references to instructions, defining their scope. There are two gotos -- GitLab From 3d2d0d45e7bb3f2ee3f2a35a87dd3e87d7135254 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 17 Jul 2005 01:01:03 +0000 Subject: [PATCH 0256/1313] Bug 34449: InnerClass should be serializable git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@219364 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/InnerClass.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/InnerClass.java b/src/java/org/apache/bcel/classfile/InnerClass.java index 1af9452a..1ae910af 100644 --- a/src/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/java/org/apache/bcel/classfile/InnerClass.java @@ -20,6 +20,8 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.io.Serializable; + import org.apache.bcel.Constants; /** @@ -31,7 +33,7 @@ import org.apache.bcel.Constants; * @author M. Dahm * @see InnerClasses */ -public final class InnerClass implements Cloneable, Node { +public final class InnerClass implements Cloneable, Node, Serializable { private int inner_class_index; private int outer_class_index; private int inner_name_index; -- GitLab From 51e30a0ab2d6873bdb7bc048a323dc3967e32015 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 17 Jul 2005 03:46:05 +0000 Subject: [PATCH 0257/1313] Bug: 26532 Update InstructionList's end, if moving to the last instruction. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@219368 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/InstructionList.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/InstructionList.java b/src/java/org/apache/bcel/generic/InstructionList.java index eaa99db9..94eae006 100644 --- a/src/java/org/apache/bcel/generic/InstructionList.java +++ b/src/java/org/apache/bcel/generic/InstructionList.java @@ -649,7 +649,9 @@ public class InstructionList implements Serializable { end.next = next; if(next != null) - next.prev = end; + next.prev = end; + else + this.end = end; } } -- GitLab From 3cd809ae5c56015ccf52fe10aa0c0fc78ad143a1 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 17 Jul 2005 22:42:58 +0000 Subject: [PATCH 0258/1313] fix JavaClass.getAllInterfaces to only return one copy of each interface it or it's super classes implement. As a by product, deprecate the dubious helper class 'ClassVector' git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@219413 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/JavaClass.java | 18 +++++++++++------- src/java/org/apache/bcel/util/ClassQueue.java | 1 - src/java/org/apache/bcel/util/ClassVector.java | 3 ++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 669700f2..e9f9137a 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -23,12 +23,16 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; import java.util.StringTokenizer; +import java.util.TreeSet; + import org.apache.bcel.Constants; import org.apache.bcel.generic.Type; import org.apache.bcel.util.BCELComparator; import org.apache.bcel.util.ClassQueue; -import org.apache.bcel.util.ClassVector; import org.apache.bcel.util.SyntheticRepository; /** @@ -798,15 +802,15 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { */ public JavaClass[] getSuperClasses() throws ClassNotFoundException { JavaClass clazz = this; - ClassVector vec = new ClassVector(); + List allSuperClasses = new ArrayList(); for (clazz = clazz.getSuperClass(); clazz != null; clazz = clazz.getSuperClass()) { - vec.addElement(clazz); + allSuperClasses.add(clazz); } - return vec.toArray(); + return (JavaClass[])allSuperClasses.toArray(new JavaClass[allSuperClasses.size()]); } /** @@ -828,7 +832,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { */ public JavaClass[] getAllInterfaces() throws ClassNotFoundException { ClassQueue queue = new ClassQueue(); - ClassVector vec = new ClassVector(); + Set allInterfaces = new TreeSet(); queue.enqueue(this); @@ -839,7 +843,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { JavaClass[] interfaces = clazz.getInterfaces(); if (clazz.isInterface()) { - vec.addElement(clazz); + allInterfaces.add(clazz); } else { if (souper != null) { queue.enqueue(souper); @@ -851,7 +855,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { } } - return vec.toArray(); + return (JavaClass[])allInterfaces.toArray(new JavaClass[allInterfaces.size()]); } /** diff --git a/src/java/org/apache/bcel/util/ClassQueue.java b/src/java/org/apache/bcel/util/ClassQueue.java index 58d5858d..cfd128d2 100644 --- a/src/java/org/apache/bcel/util/ClassQueue.java +++ b/src/java/org/apache/bcel/util/ClassQueue.java @@ -25,7 +25,6 @@ import org.apache.bcel.classfile.JavaClass; * * @version $Id$ * @author M. Dahm - * @see ClassVector */ public class ClassQueue implements java.io.Serializable { protected LinkedList vec = new LinkedList(); diff --git a/src/java/org/apache/bcel/util/ClassVector.java b/src/java/org/apache/bcel/util/ClassVector.java index 908b8ce3..8c9aa1b6 100644 --- a/src/java/org/apache/bcel/util/ClassVector.java +++ b/src/java/org/apache/bcel/util/ClassVector.java @@ -25,7 +25,8 @@ import org.apache.bcel.classfile.JavaClass; * * @version $Id$ * @author M. Dahm - * @see ClassQueue + * + * @deprecated as of 5.1.1 - 7/17/2005 */ public class ClassVector implements java.io.Serializable { protected ArrayList vec = new ArrayList(); -- GitLab From 2ef2cc3f7c170fdf4f4af1b8362af1225cb18352 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 24 Jul 2005 23:13:02 +0000 Subject: [PATCH 0259/1313] minor cleanups git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@224668 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/Attribute.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index ca3734c4..8a427e38 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -125,7 +125,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable { byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute // Get class name from constant pool via `name_index' indirection - name_index = (int)file.readUnsignedShort(); + name_index = file.readUnsignedShort(); c = (ConstantUtf8)constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8); name = c.getBytes(); @@ -147,9 +147,8 @@ public abstract class Attribute implements Cloneable, Node, Serializable { AttributeReader r = (AttributeReader)readers.get(name); if(r != null) - return r.createAttribute(name_index, length, file, constant_pool); - else - return new Unknown(name_index, length, file, constant_pool); + return r.createAttribute(name_index, length, file, constant_pool); + return new Unknown(name_index, length, file, constant_pool); case Constants.ATTR_CONSTANT_VALUE: return new ConstantValue(name_index, length, file, constant_pool); @@ -213,7 +212,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable { public final int getLength() { return length; } /** - * @param Attribute length in bytes. + * @param length length in bytes. */ public final void setLength(int length) { this.length = length; @@ -272,7 +271,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable { /** * @return deep copy of this attribute */ - public abstract Attribute copy(ConstantPool constant_pool); + public abstract Attribute copy(ConstantPool _constant_pool); /** * @return attribute name. -- GitLab From 19c850976b9346c4100ef38b3b2660e855609b14 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 31 Jul 2005 06:27:55 +0000 Subject: [PATCH 0260/1313] Fix 34418 If a Constant Pool Entry is not of the type expected, catch the exception and report, rather than just throwing the exception to the console, and terminating. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@226609 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 35639146..679c25a1 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -200,6 +200,9 @@ public final class Pass3aVerifier extends PassVerifier{ catch(StaticCodeConstraintException scce){ vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, scce.getMessage()); } + catch(ClassCastException cce){ + vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Class Cast Exception: " + cce.getMessage()); + } return vr; } else{ //did not pass Pass 2. -- GitLab From ed9198fe32dd8ec2b20bd4d3f45ace7695e7f717 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 31 Jul 2005 07:07:38 +0000 Subject: [PATCH 0261/1313] Fix 27855: If a GETFIELD is called and the field is not found in the class, look for public or protected members with the same name in a super class. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@226610 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/statics/Pass3aVerifier.java | 21 +++++++++++++++++-- .../structurals/InstConstraintVisitor.java | 21 ++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 679c25a1..6b9d3214 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -562,8 +562,25 @@ public final class Pass3aVerifier extends PassVerifier{ } } if (f == null){ - /* TODO: also look up if the field is inherited! */ - constraintViolated(o, "Referenced field '"+field_name+"' does not exist in class '"+jc.getClassName()+"'."); + JavaClass[] superclasses = jc.getSuperClasses(); + outer: + for (int j=0; j Date: Sun, 31 Jul 2005 17:15:35 +0000 Subject: [PATCH 0262/1313] simple warnings cleanups git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@226663 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/Repository.java | 6 +-- src/java/org/apache/bcel/classfile/Code.java | 8 +-- .../apache/bcel/classfile/ConstantPool.java | 6 +-- .../apache/bcel/classfile/ConstantValue.java | 4 +- .../org/apache/bcel/classfile/Deprecated.java | 4 +- .../bcel/classfile/DescendingVisitor.java | 14 ++--- .../apache/bcel/classfile/ExceptionTable.java | 4 +- src/java/org/apache/bcel/classfile/Field.java | 4 +- .../apache/bcel/classfile/FieldOrMethod.java | 6 +-- .../apache/bcel/classfile/InnerClasses.java | 4 +- .../org/apache/bcel/classfile/JavaClass.java | 31 +++++------ .../bcel/classfile/LineNumberTable.java | 4 +- .../bcel/classfile/LocalVariableTable.java | 4 +- .../org/apache/bcel/classfile/Method.java | 18 +++---- .../org/apache/bcel/classfile/PMGClass.java | 2 +- .../org/apache/bcel/classfile/Signature.java | 6 +-- .../org/apache/bcel/classfile/SourceFile.java | 2 +- .../org/apache/bcel/classfile/StackMap.java | 4 +- .../org/apache/bcel/classfile/Synthetic.java | 4 +- .../org/apache/bcel/classfile/Unknown.java | 6 +-- .../org/apache/bcel/classfile/Utility.java | 53 +++++++------------ .../org/apache/bcel/generic/ArrayType.java | 15 +++--- .../org/apache/bcel/generic/BasicType.java | 8 +-- .../org/apache/bcel/generic/BranchHandle.java | 11 ++-- .../bcel/generic/BranchInstruction.java | 10 ++-- .../org/apache/bcel/generic/ClassGen.java | 16 ++---- .../apache/bcel/generic/ConstantPoolGen.java | 4 +- 27 files changed, 115 insertions(+), 143 deletions(-) diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index 508abff8..f5dffc8d 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -83,11 +83,9 @@ public abstract class Repository { try { ClassPath path = _repository.getClassPath(); - if(path != null) { - return path.getClassFile(class_name); - } else { + if(path == null) return null; - } + return path.getClassFile(class_name); } catch(IOException e) { return null; } } diff --git a/src/java/org/apache/bcel/classfile/Code.java b/src/java/org/apache/bcel/classfile/Code.java index b051ebbd..04105613 100644 --- a/src/java/org/apache/bcel/classfile/Code.java +++ b/src/java/org/apache/bcel/classfile/Code.java @@ -319,9 +319,9 @@ public final class Code extends Attribute { /** * @return deep copy of this attribute * - * @param constant_pool the constant pool to duplicate + * @param _constant_pool the constant pool to duplicate */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { Code c = (Code) clone(); if (code != null) { @@ -329,7 +329,7 @@ public final class Code extends Attribute { System.arraycopy(code, 0, c.code, 0, code.length); } - c.constant_pool = constant_pool; + c.constant_pool = _constant_pool; c.exception_table = new CodeException[exception_table_length]; for(int i=0; i < exception_table_length; i++) @@ -337,7 +337,7 @@ public final class Code extends Attribute { c.attributes = new Attribute[attributes_count]; for(int i=0; i < attributes_count; i++) - c.attributes[i] = attributes[i].copy(constant_pool); + c.attributes[i] = attributes[i].copy(_constant_pool); return c; } diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/java/org/apache/bcel/classfile/ConstantPool.java index 36ef3205..652567f4 100644 --- a/src/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/java/org/apache/bcel/classfile/ConstantPool.java @@ -230,11 +230,11 @@ public class ConstantPool implements Cloneable, Node, Serializable { if(c == null) throw new ClassFormatException("Constant pool at index " + index + " is null."); - if(c.getTag() == tag) - return c; - else + if(c.getTag() != tag) throw new ClassFormatException("Expected class `" + Constants.CONSTANT_NAMES[tag] + "' at index " + index + " and got " + c); + + return c; } /** diff --git a/src/java/org/apache/bcel/classfile/ConstantValue.java b/src/java/org/apache/bcel/classfile/ConstantValue.java index 151c2633..c041fa16 100644 --- a/src/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/java/org/apache/bcel/classfile/ConstantValue.java @@ -135,9 +135,9 @@ public final class ConstantValue extends Attribute { /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { ConstantValue c = (ConstantValue)clone(); - c.constant_pool = constant_pool; + c.constant_pool = _constant_pool; return c; } } diff --git a/src/java/org/apache/bcel/classfile/Deprecated.java b/src/java/org/apache/bcel/classfile/Deprecated.java index 8d1ebe2f..3e155453 100644 --- a/src/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/java/org/apache/bcel/classfile/Deprecated.java @@ -122,7 +122,7 @@ public final class Deprecated extends Attribute { /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { Deprecated c = (Deprecated)clone(); if (bytes != null) { @@ -130,7 +130,7 @@ public final class Deprecated extends Attribute { System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); } - c.constant_pool = constant_pool; + c.constant_pool = _constant_pool; return c; } } diff --git a/src/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/java/org/apache/bcel/classfile/DescendingVisitor.java index 8b615348..f2ffb6b4 100644 --- a/src/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -71,23 +71,23 @@ public class DescendingVisitor implements Visitor { */ public void visit() { clazz.accept(this); } - public void visitJavaClass(JavaClass clazz) { - stack.push(clazz); - clazz.accept(visitor); + public void visitJavaClass(JavaClass _clazz) { + stack.push(_clazz); + _clazz.accept(visitor); - Field[] fields = clazz.getFields(); + Field[] fields = _clazz.getFields(); for(int i=0; i < fields.length; i++) fields[i].accept(this); - Method[] methods = clazz.getMethods(); + Method[] methods = _clazz.getMethods(); for(int i=0; i < methods.length; i++) methods[i].accept(this); - Attribute[] attributes = clazz.getAttributes(); + Attribute[] attributes = _clazz.getAttributes(); for(int i=0; i < attributes.length; i++) attributes[i].accept(this); - clazz.getConstantPool().accept(this); + _clazz.getConstantPool().accept(this); stack.pop(); } diff --git a/src/java/org/apache/bcel/classfile/ExceptionTable.java b/src/java/org/apache/bcel/classfile/ExceptionTable.java index 2725fcd8..420633ef 100644 --- a/src/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/java/org/apache/bcel/classfile/ExceptionTable.java @@ -158,7 +158,7 @@ public final class ExceptionTable extends Attribute { /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { ExceptionTable c = (ExceptionTable)clone(); if (exception_index_table != null) { @@ -166,7 +166,7 @@ public final class ExceptionTable extends Attribute { System.arraycopy(exception_index_table, 0, c.exception_index_table, 0, exception_index_table.length); } - c.constant_pool = constant_pool; + c.constant_pool = _constant_pool; return c; } } diff --git a/src/java/org/apache/bcel/classfile/Field.java b/src/java/org/apache/bcel/classfile/Field.java index 9404212f..52c37229 100644 --- a/src/java/org/apache/bcel/classfile/Field.java +++ b/src/java/org/apache/bcel/classfile/Field.java @@ -134,8 +134,8 @@ public final class Field extends FieldOrMethod { /** * @return deep copy of this field */ - public final Field copy(ConstantPool constant_pool) { - return (Field)copy_(constant_pool); + public final Field copy(ConstantPool _constant_pool) { + return (Field)copy_(_constant_pool); } /** diff --git a/src/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/java/org/apache/bcel/classfile/FieldOrMethod.java index 5f3d8111..6b4082ae 100644 --- a/src/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -194,7 +194,7 @@ public abstract class FieldOrMethod extends AccessFlags /** * @return deep copy of this field */ - protected FieldOrMethod copy_(ConstantPool constant_pool) { + protected FieldOrMethod copy_(ConstantPool _constant_pool) { FieldOrMethod c = null; try { @@ -202,11 +202,11 @@ public abstract class FieldOrMethod extends AccessFlags } catch (CloneNotSupportedException e) { } - c.constant_pool = constant_pool; + c.constant_pool = _constant_pool; c.attributes = new Attribute[attributes_count]; for (int i = 0; i < attributes_count; i++) - c.attributes[i] = attributes[i].copy(constant_pool); + c.attributes[i] = attributes[i].copy(_constant_pool); return c; } diff --git a/src/java/org/apache/bcel/classfile/InnerClasses.java b/src/java/org/apache/bcel/classfile/InnerClasses.java index caf01f4b..7d12d47f 100644 --- a/src/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/java/org/apache/bcel/classfile/InnerClasses.java @@ -132,14 +132,14 @@ public final class InnerClasses extends Attribute { /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { InnerClasses c = (InnerClasses)clone(); c.inner_classes = new InnerClass[number_of_classes]; for(int i=0; i < number_of_classes; i++) c.inner_classes[i] = inner_classes[i].copy(); - c.constant_pool = constant_pool; + c.constant_pool = _constant_pool; return c; } } diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index e9f9137a..e30c8ff7 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -280,11 +280,11 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { /** * Dump class to a file named file_name. * - * @param file_name Output file name + * @param _file_name Output file name * @exception IOException */ - public void dump(String file_name) throws IOException { - dump(new File(file_name)); + public void dump(String _file_name) throws IOException { + dump(new File(_file_name)); } /** @@ -484,17 +484,14 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { static { // Debugging ... on/off - String debug = System.getProperty("JavaClass.debug"); - - if (debug != null) - JavaClass.debug = new Boolean(debug).booleanValue(); + debug = Boolean.getBoolean("JavaClass.debug"); // Get path separator either / or \ usually - String sep = System.getProperty("file.separator"); + String _sep = System.getProperty("file.separator"); - if (sep != null) + if (_sep != null) try { - JavaClass.sep = sep.charAt(0); + JavaClass.sep = _sep.charAt(0); } catch (StringIndexOutOfBoundsException e) { } // Never reached } @@ -817,11 +814,11 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { * Get interfaces directly implemented by this JavaClass. */ public JavaClass[] getInterfaces() throws ClassNotFoundException { - String[] interfaces = getInterfaceNames(); - JavaClass[] classes = new JavaClass[interfaces.length]; + String[] _interfaces = getInterfaceNames(); + JavaClass[] classes = new JavaClass[_interfaces.length]; - for (int i = 0; i < interfaces.length; i++) { - classes[i] = repository.loadClass(interfaces[i]); + for (int i = 0; i < _interfaces.length; i++) { + classes[i] = repository.loadClass(_interfaces[i]); } return classes; @@ -840,7 +837,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { JavaClass clazz = queue.dequeue(); JavaClass souper = clazz.getSuperClass(); - JavaClass[] interfaces = clazz.getInterfaces(); + JavaClass[] _interfaces = clazz.getInterfaces(); if (clazz.isInterface()) { allInterfaces.add(clazz); @@ -850,8 +847,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { } } - for (int i = 0; i < interfaces.length; i++) { - queue.enqueue(interfaces[i]); + for (int i = 0; i < _interfaces.length; i++) { + queue.enqueue(_interfaces[i]); } } diff --git a/src/java/org/apache/bcel/classfile/LineNumberTable.java b/src/java/org/apache/bcel/classfile/LineNumberTable.java index 639c5c6d..d3bddc95 100644 --- a/src/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/java/org/apache/bcel/classfile/LineNumberTable.java @@ -190,14 +190,14 @@ public final class LineNumberTable extends Attribute { /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { LineNumberTable c = (LineNumberTable)clone(); c.line_number_table = new LineNumber[line_number_table_length]; for(int i=0; i < line_number_table_length; i++) c.line_number_table[i] = line_number_table[i].copy(); - c.constant_pool = constant_pool; + c.constant_pool = _constant_pool; return c; } diff --git a/src/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/java/org/apache/bcel/classfile/LocalVariableTable.java index c3c6ffff..67b7da23 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -174,14 +174,14 @@ public class LocalVariableTable extends Attribute { /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { LocalVariableTable c = (LocalVariableTable)clone(); c.local_variable_table = new LocalVariable[local_variable_table_length]; for(int i=0; i < local_variable_table_length; i++) c.local_variable_table[i] = local_variable_table[i].copy(); - c.constant_pool = constant_pool; + c.constant_pool = _constant_pool; return c; } diff --git a/src/java/org/apache/bcel/classfile/Method.java b/src/java/org/apache/bcel/classfile/Method.java index 2e979efb..29943af2 100644 --- a/src/java/org/apache/bcel/classfile/Method.java +++ b/src/java/org/apache/bcel/classfile/Method.java @@ -128,10 +128,10 @@ public final class Method extends FieldOrMethod { public final LocalVariableTable getLocalVariableTable() { Code code = getCode(); - if (code != null) - return code.getLocalVariableTable(); - else - return null; + if (code == null) + return null; + + return code.getLocalVariableTable(); } /** @return LineNumberTable of code attribute if any, i.e. the call is forwarded @@ -140,10 +140,10 @@ public final class Method extends FieldOrMethod { public final LineNumberTable getLineNumberTable() { Code code = getCode(); - if (code != null) - return code.getLineNumberTable(); - else + if (code == null) return null; + + return code.getLineNumberTable(); } /** @@ -201,8 +201,8 @@ public final class Method extends FieldOrMethod { /** * @return deep copy of this method */ - public final Method copy(ConstantPool constant_pool) { - return (Method)copy_(constant_pool); + public final Method copy(ConstantPool _constant_pool) { + return (Method)copy_(_constant_pool); } /** diff --git a/src/java/org/apache/bcel/classfile/PMGClass.java b/src/java/org/apache/bcel/classfile/PMGClass.java index 8990bd93..eee1bba6 100644 --- a/src/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/java/org/apache/bcel/classfile/PMGClass.java @@ -149,7 +149,7 @@ public final class PMGClass extends Attribute { /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { return (PMGClass)clone(); } } diff --git a/src/java/org/apache/bcel/classfile/Signature.java b/src/java/org/apache/bcel/classfile/Signature.java index 8693a6d0..d7460a93 100644 --- a/src/java/org/apache/bcel/classfile/Signature.java +++ b/src/java/org/apache/bcel/classfile/Signature.java @@ -129,10 +129,6 @@ public final class Signature extends Attribute { return ch == 'T' || ch == 'L'; } - private static boolean identPart(int ch) { - return ch == '/' || ch == ';'; - } - private static final void matchIdent(MyByteArrayInputStream in, StringBuffer buf) { int ch; @@ -256,7 +252,7 @@ public final class Signature extends Attribute { /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { return (Signature)clone(); } } diff --git a/src/java/org/apache/bcel/classfile/SourceFile.java b/src/java/org/apache/bcel/classfile/SourceFile.java index b049f1ab..5f9c0ef1 100644 --- a/src/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/java/org/apache/bcel/classfile/SourceFile.java @@ -132,7 +132,7 @@ public final class SourceFile extends Attribute { /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { return (SourceFile)clone(); } } diff --git a/src/java/org/apache/bcel/classfile/StackMap.java b/src/java/org/apache/bcel/classfile/StackMap.java index ea66f7a1..9dee2065 100644 --- a/src/java/org/apache/bcel/classfile/StackMap.java +++ b/src/java/org/apache/bcel/classfile/StackMap.java @@ -124,14 +124,14 @@ public final class StackMap extends Attribute implements Node { /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { StackMap c = (StackMap)clone(); c.map = new StackMapEntry[map_length]; for(int i=0; i < map_length; i++) c.map[i] = map[i].copy(); - c.constant_pool = constant_pool; + c.constant_pool = _constant_pool; return c; } diff --git a/src/java/org/apache/bcel/classfile/Synthetic.java b/src/java/org/apache/bcel/classfile/Synthetic.java index 5d6e62fa..86e275b2 100644 --- a/src/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/java/org/apache/bcel/classfile/Synthetic.java @@ -129,7 +129,7 @@ public final class Synthetic extends Attribute { /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { Synthetic c = (Synthetic)clone(); if (bytes != null) { @@ -137,7 +137,7 @@ public final class Synthetic extends Attribute { System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); } - c.constant_pool = constant_pool; + c.constant_pool = _constant_pool; return c; } } diff --git a/src/java/org/apache/bcel/classfile/Unknown.java b/src/java/org/apache/bcel/classfile/Unknown.java index 7b15a15e..28748e6c 100644 --- a/src/java/org/apache/bcel/classfile/Unknown.java +++ b/src/java/org/apache/bcel/classfile/Unknown.java @@ -140,7 +140,7 @@ public final class Unknown extends Attribute { public final String getName() { return name; } /** - * @param bytes. + * @param bytes the bytes to set */ public final void setBytes(byte[] bytes) { this.bytes = bytes; @@ -168,7 +168,7 @@ public final class Unknown extends Attribute { /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(ConstantPool _constant_pool) { Unknown c = (Unknown)clone(); if (bytes != null) { @@ -176,7 +176,7 @@ public final class Unknown extends Attribute { System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); } - c.constant_pool = constant_pool; + c.constant_pool = _constant_pool; return c; } } diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 0174249e..39be2e9b 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -485,14 +485,6 @@ public abstract class Utility { return compactClassName(str, "java.lang.", chopit); } - private static final boolean is_digit(char ch) { - return (ch >= '0') && (ch <= '9'); - } - - private static final boolean is_space(char ch) { - return (ch == ' ') || (ch == '\t') || (ch == '\r') || (ch == '\n'); - } - /** * @return `flag' with bit `i' set to 1 */ @@ -586,9 +578,7 @@ public abstract class Utility { throw new ClassFormatException("Invalid method signature: " + signature); } - types = new String[vec.size()]; - vec.toArray(types); - return types; + return (String[])vec.toArray(new String[vec.size()]); } /** * @param signature Method signature @@ -845,7 +835,7 @@ public abstract class Utility { case '[' : { // Array declaration int n; - StringBuffer buf, brackets; + StringBuffer brackets; String type; char ch; int consumed_chars; // Shadows global var @@ -1099,8 +1089,8 @@ public abstract class Utility { if(left_justify) return str + new String(buf); - else - return new String(buf) + str; + + return new String(buf) + str; } static final boolean equals(byte[] a, byte[] b) { @@ -1251,8 +1241,8 @@ public abstract class Utility { // A-Z, g-z, _, $ private static final int FREE_CHARS = 48; - private static int[] CHAR_MAP = new int[FREE_CHARS]; - private static int[] MAP_CHAR = new int[256]; // Reverse map + static int[] CHAR_MAP = new int[FREE_CHARS]; + static int[] MAP_CHAR = new int[256]; // Reverse map private static final char ESCAPE_CHAR = '$'; static { @@ -1288,28 +1278,25 @@ public abstract class Utility { public int read() throws IOException { int b = in.read(); - if(b != ESCAPE_CHAR) { - return b; - } else { - int i = in.read(); - - if(i < 0) - return -1; + if(b != ESCAPE_CHAR) + return b; + + int i = in.read(); + if(i < 0) + return -1; - if(((i >= '0') && (i <= '9')) || ((i >= 'a') && (i <= 'f'))) { // Normal escape - int j = in.read(); + if(((i >= '0') && (i <= '9')) || ((i >= 'a') && (i <= 'f'))) { // Normal escape + int j = in.read(); - if(j < 0) - return -1; + if(j < 0) + return -1; - char[] tmp = { (char)i, (char)j }; - int s = Integer.parseInt(new String(tmp), 16); + char[] tmp = { (char)i, (char)j }; + int s = Integer.parseInt(new String(tmp), 16); - return s; - } else { // Special escape + return s; + } return MAP_CHAR[i]; - } - } } public int read(char[] cbuf, int off, int len) throws IOException { diff --git a/src/java/org/apache/bcel/generic/ArrayType.java b/src/java/org/apache/bcel/generic/ArrayType.java index d2da786f..2ccbdd22 100644 --- a/src/java/org/apache/bcel/generic/ArrayType.java +++ b/src/java/org/apache/bcel/generic/ArrayType.java @@ -95,8 +95,8 @@ public final class ArrayType extends ReferenceType { public Type getElementType() { if(dimensions == 1) return basic_type; - else - return new ArrayType(basic_type, dimensions - 1); + + return new ArrayType(basic_type, dimensions - 1); } /** @return number of dimensions of array @@ -109,11 +109,12 @@ public final class ArrayType extends ReferenceType { /** @return true if both type objects refer to the same array type. */ - public boolean equals(Object type) { - if(type instanceof ArrayType) { - ArrayType array = (ArrayType)type; + public boolean equals(Object _type) { + if(_type instanceof ArrayType) { + ArrayType array = (ArrayType)_type; return (array.dimensions == dimensions) && array.basic_type.equals(basic_type); - } else - return false; + } + + return false; } } diff --git a/src/java/org/apache/bcel/generic/BasicType.java b/src/java/org/apache/bcel/generic/BasicType.java index 463b0e2f..61183387 100644 --- a/src/java/org/apache/bcel/generic/BasicType.java +++ b/src/java/org/apache/bcel/generic/BasicType.java @@ -57,12 +57,12 @@ public final class BasicType extends Type { /** @return a hash code value for the object. */ - public int hashCode() { return (int)type; } + public int hashCode() { return type; } /** @return true if both type objects refer to the same type */ - public boolean equals(Object type) { - return (type instanceof BasicType)? - ((BasicType)type).type == this.type : false; + public boolean equals(Object _type) { + return (_type instanceof BasicType)? + ((BasicType)_type).type == this.type : false; } } diff --git a/src/java/org/apache/bcel/generic/BranchHandle.java b/src/java/org/apache/bcel/generic/BranchHandle.java index e005a09e..9f2457da 100644 --- a/src/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/java/org/apache/bcel/generic/BranchHandle.java @@ -44,14 +44,13 @@ public final class BranchHandle extends InstructionHandle { static final BranchHandle getBranchHandle(BranchInstruction i) { if(bh_list == null) return new BranchHandle(i); - else { - BranchHandle bh = bh_list; - bh_list = (BranchHandle)bh.next; + + BranchHandle bh = bh_list; + bh_list = (BranchHandle)bh.next; - bh.setInstruction(i); + bh.setInstruction(i); - return bh; - } + return bh; } /** Handle adds itself to the list of resuable handles. diff --git a/src/java/org/apache/bcel/generic/BranchInstruction.java b/src/java/org/apache/bcel/generic/BranchInstruction.java index 6a2a11f6..4283f584 100644 --- a/src/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/java/org/apache/bcel/generic/BranchInstruction.java @@ -66,19 +66,19 @@ public abstract class BranchInstruction extends Instruction implements Instructi } /** - * @param target branch target + * @param _target branch target * @return the offset to `target' relative to this instruction */ - protected int getTargetOffset(InstructionHandle target) { - if(target == null) + protected int getTargetOffset(InstructionHandle _target) { + if(_target == null) throw new ClassGenException("Target of " + super.toString(true) + " is invalid null handle"); - int t = target.getPosition(); + int t = _target.getPosition(); if(t < 0) throw new ClassGenException("Invalid branch target position offset for " + - super.toString(true) + ":" + t + ":" + target); + super.toString(true) + ":" + t + ":" + _target); return t - position; } diff --git a/src/java/org/apache/bcel/generic/ClassGen.java b/src/java/org/apache/bcel/generic/ClassGen.java index b89871db..cd28f6cc 100644 --- a/src/java/org/apache/bcel/generic/ClassGen.java +++ b/src/java/org/apache/bcel/generic/ClassGen.java @@ -171,7 +171,7 @@ public class ClassGen extends AccessFlags implements Cloneable { Attribute[] attributes = getAttributes(); // Must be last since the above calls may still add something to it - ConstantPool cp = this.cp.getFinalConstantPool(); + ConstantPool _cp = this.cp.getFinalConstantPool(); return new JavaClass( class_name_index, @@ -180,7 +180,7 @@ public class ClassGen extends AccessFlags implements Cloneable { major, minor, access_flags, - cp, + _cp, interfaces, fields, methods, @@ -385,9 +385,7 @@ public class ClassGen extends AccessFlags implements Cloneable { } public Method[] getMethods() { - Method[] methods = new Method[method_vec.size()]; - method_vec.toArray(methods); - return methods; + return (Method[])method_vec.toArray(new Method[method_vec.size()]); } public void setMethods(Method[] methods) { @@ -423,15 +421,11 @@ public class ClassGen extends AccessFlags implements Cloneable { } public Field[] getFields() { - Field[] fields = new Field[field_vec.size()]; - field_vec.toArray(fields); - return fields; + return (Field[])field_vec.toArray(new Field[field_vec.size()]); } public Attribute[] getAttributes() { - Attribute[] attributes = new Attribute[attribute_vec.size()]; - attribute_vec.toArray(attributes); - return attributes; + return (Attribute[])attribute_vec.toArray(new Attribute[attribute_vec.size()]); } public ConstantPoolGen getConstantPool() { diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/java/org/apache/bcel/generic/ConstantPoolGen.java index e64cb9e2..f573b99f 100644 --- a/src/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -462,8 +462,8 @@ public class ConstantPoolGen implements java.io.Serializable { * @return index on success, -1 otherwise */ public int lookupNameAndType(String name, String signature) { - Index index = (Index)n_a_t_table.get(name + NAT_DELIM + signature); - return (index != null)? index.index : -1; + Index _index = (Index)n_a_t_table.get(name + NAT_DELIM + signature); + return (_index != null)? _index.index : -1; } /** -- GitLab From c75d5c3707e0eacf2eeb93e7216403cbdba80d8a Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 1 Aug 2005 00:23:35 +0000 Subject: [PATCH 0263/1313] improve string appending performance in loops git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@226705 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/structurals/LocalVariables.java | 9 ++++++--- .../bcel/verifier/structurals/OperandStack.java | 14 +++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 8c351582..404ac47b 100644 --- a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -181,11 +181,14 @@ public class LocalVariables{ * Returns a String representation of this object. */ public String toString(){ - String s = new String(); + StringBuffer sb = new StringBuffer(); for (int i=0; i Date: Mon, 1 Aug 2005 00:25:34 +0000 Subject: [PATCH 0264/1313] inner classes that can be static - should be git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@226706 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index b94c6dd8..d33cf3a5 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -1346,7 +1346,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * JustIce cannot repair this; please note that existing verifiers at this * time even fail to detect missing InnerClasses attributes in pass 2. */ - private class InnerClassDetector extends EmptyVisitor{ + private static class InnerClassDetector extends EmptyVisitor{ private boolean hasInnerClass = false; private JavaClass jc; private ConstantPool cp; -- GitLab From ca5bd8b012499ecd53424cabfade683949bc548b Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 1 Aug 2005 00:26:17 +0000 Subject: [PATCH 0265/1313] constants should be static git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@226707 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/structurals/Subroutines.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java index 4ac698e0..70768e18 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -75,7 +75,7 @@ public class Subroutines{ * field. This is used for the "top-level" Subroutine; * i.e. no subroutine. */ - private final int UNSET = -1; + private static final int UNSET = -1; /** * The Local Variable slot where the first -- GitLab From b9be582d08d95e8ea7d7fd29b446a0bdf677b6d8 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 4 Aug 2005 03:57:27 +0000 Subject: [PATCH 0266/1313] Bug 35991: When generating ANEWARRAY statements, pass the basic type to the createNewArray call, not the Array type itself. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@227300 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/BCELFactory.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/util/BCELFactory.java b/src/java/org/apache/bcel/util/BCELFactory.java index 8e35b938..cefafd14 100644 --- a/src/java/org/apache/bcel/util/BCELFactory.java +++ b/src/java/org/apache/bcel/util/BCELFactory.java @@ -5,10 +5,12 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.Utility; import org.apache.bcel.generic.AllocationInstruction; import org.apache.bcel.generic.ArrayInstruction; +import org.apache.bcel.generic.ArrayType; import org.apache.bcel.generic.BranchHandle; import org.apache.bcel.generic.BranchInstruction; import org.apache.bcel.generic.CHECKCAST; @@ -177,8 +179,10 @@ class BCELFactory extends EmptyVisitor { case Constants.ANEWARRAY: case Constants.NEWARRAY: + if (type instanceof ArrayType) + type = ((ArrayType)type).getBasicType(); _out.println("il.append(_factory.createNewArray(" + - BCELifier.printType(type) + ", (short) " + dim + "));"); + BCELifier.printType(type) + ", (short) " + dim + "));"); break; default: -- GitLab From 5d435ae2f457b0430557273801f76a946a35ee56 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 9 Aug 2005 03:30:38 +0000 Subject: [PATCH 0267/1313] use interface references, where possible git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@230959 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/Utility.java | 5 +++-- src/java/org/apache/bcel/generic/ClassGen.java | 10 ++++++---- src/java/org/apache/bcel/generic/FieldGen.java | 4 +++- .../apache/bcel/generic/FieldGenOrMethodGen.java | 4 +++- .../org/apache/bcel/generic/InstructionList.java | 12 ++++++------ src/java/org/apache/bcel/generic/MethodGen.java | 14 ++++++++------ src/java/org/apache/bcel/generic/Type.java | 4 +++- src/java/org/apache/bcel/util/BCELFactory.java | 3 ++- src/java/org/apache/bcel/util/ClassPath.java | 9 +++++---- src/java/org/apache/bcel/util/ClassVector.java | 4 +++- .../org/apache/bcel/util/InstructionFinder.java | 4 +++- .../org/apache/bcel/verifier/statics/IntList.java | 3 ++- 12 files changed, 47 insertions(+), 29 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 39be2e9b..3d1c4428 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -29,8 +29,10 @@ import java.io.PrintWriter; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; +import java.util.List; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; + import org.apache.bcel.Constants; import org.apache.bcel.util.ByteSequence; @@ -559,9 +561,8 @@ public abstract class Utility { boolean chopit) throws ClassFormatException { - ArrayList vec = new ArrayList(); + List vec = new ArrayList(); int index; - String[] types; try { // Read all declarations between for `(' and `)' if(signature.charAt(0) != '(') diff --git a/src/java/org/apache/bcel/generic/ClassGen.java b/src/java/org/apache/bcel/generic/ClassGen.java index cd28f6cc..0be2bd0c 100644 --- a/src/java/org/apache/bcel/generic/ClassGen.java +++ b/src/java/org/apache/bcel/generic/ClassGen.java @@ -19,6 +19,8 @@ package org.apache.bcel.generic; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.AccessFlags; import org.apache.bcel.classfile.Attribute; @@ -47,10 +49,10 @@ public class ClassGen extends AccessFlags implements Cloneable { private ConstantPoolGen cp; // Template for building up constant pool // ArrayLists instead of arrays to gather fields, methods, etc. - private ArrayList field_vec = new ArrayList(); - private ArrayList method_vec = new ArrayList(); - private ArrayList attribute_vec = new ArrayList(); - private ArrayList interface_vec = new ArrayList(); + private List field_vec = new ArrayList(); + private List method_vec = new ArrayList(); + private List attribute_vec = new ArrayList(); + private List interface_vec = new ArrayList(); private static BCELComparator _cmp = new BCELComparator() { public boolean equals(Object o1, Object o2) { diff --git a/src/java/org/apache/bcel/generic/FieldGen.java b/src/java/org/apache/bcel/generic/FieldGen.java index a67f432b..704f0303 100644 --- a/src/java/org/apache/bcel/generic/FieldGen.java +++ b/src/java/org/apache/bcel/generic/FieldGen.java @@ -19,6 +19,8 @@ package org.apache.bcel.generic; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.Constant; @@ -226,7 +228,7 @@ public class FieldGen extends FieldGenOrMethodGen { public String getSignature() { return type.getSignature(); } - private ArrayList observers; + private List observers; /** Add observer for this object. */ diff --git a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 74dddb8d..7d7a3e20 100644 --- a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -1,5 +1,7 @@ package org.apache.bcel.generic; import java.util.ArrayList; +import java.util.List; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.AccessFlags; import org.apache.bcel.classfile.Attribute; @@ -17,7 +19,7 @@ public abstract class FieldGenOrMethodGen extends AccessFlags protected String name; protected Type type; protected ConstantPoolGen cp; - private ArrayList attribute_vec = new ArrayList(); + private List attribute_vec = new ArrayList(); protected FieldGenOrMethodGen() {} diff --git a/src/java/org/apache/bcel/generic/InstructionList.java b/src/java/org/apache/bcel/generic/InstructionList.java index 94eae006..02b644c6 100644 --- a/src/java/org/apache/bcel/generic/InstructionList.java +++ b/src/java/org/apache/bcel/generic/InstructionList.java @@ -24,7 +24,9 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.Constant; import org.apache.bcel.util.ByteSequence; @@ -702,7 +704,7 @@ public class InstructionList implements Serializable { first.prev = null; // Completely separated from rest of list last.next = null; - ArrayList target_vec = new ArrayList(); + List target_vec = new ArrayList(); for(InstructionHandle ih=first; ih != null; ih = ih.next) ih.getInstruction().dispose(); // e.g. BranchInstructions release their targets @@ -963,7 +965,7 @@ public class InstructionList implements Serializable { */ public Instruction[] getInstructions() { ByteSequence bytes = new ByteSequence(getByteCode()); - ArrayList instructions = new ArrayList(); + List instructions = new ArrayList(); try { while(bytes.available() > 0) { @@ -971,9 +973,7 @@ public class InstructionList implements Serializable { } } catch(IOException e) { throw new ClassGenException(e.toString()); } - Instruction[] result = new Instruction[instructions.size()]; - instructions.toArray(result); - return result; + return (Instruction[])instructions.toArray(new Instruction[instructions.size()]); } public String toString() { @@ -1227,7 +1227,7 @@ public class InstructionList implements Serializable { } } - private ArrayList observers; + private List observers; /** Add observer for this object. */ diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index 34fbeaf6..df5eefab 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -20,7 +20,9 @@ package org.apache.bcel.generic; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; +import java.util.List; import java.util.Stack; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.Code; @@ -59,11 +61,11 @@ public class MethodGen extends FieldGenOrMethodGen { private InstructionList il; private boolean strip_attributes; - private ArrayList variable_vec = new ArrayList(); - private ArrayList line_number_vec = new ArrayList(); - private ArrayList exception_vec = new ArrayList(); - private ArrayList throws_vec = new ArrayList(); - private ArrayList code_attrs_vec = new ArrayList(); + private List variable_vec = new ArrayList(); + private List line_number_vec = new ArrayList(); + private List exception_vec = new ArrayList(); + private List throws_vec = new ArrayList(); + private List code_attrs_vec = new ArrayList(); private static BCELComparator _cmp = new BCELComparator() { public boolean equals(Object o1, Object o2) { @@ -1014,7 +1016,7 @@ m.getName(), return maxStackDepth; } - private ArrayList observers; + private List observers; /** Add observer for this object. */ diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index 9636d8f0..6c4db513 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -18,6 +18,8 @@ package org.apache.bcel.generic; import java.util.ArrayList; +import java.util.List; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.ClassFormatException; import org.apache.bcel.classfile.Utility; @@ -189,7 +191,7 @@ public abstract class Type implements java.io.Serializable { * @return array of argument types */ public static Type[] getArgumentTypes(String signature) { - ArrayList vec = new ArrayList(); + List vec = new ArrayList(); int index; Type[] types; diff --git a/src/java/org/apache/bcel/util/BCELFactory.java b/src/java/org/apache/bcel/util/BCELFactory.java index cefafd14..2d8028f7 100644 --- a/src/java/org/apache/bcel/util/BCELFactory.java +++ b/src/java/org/apache/bcel/util/BCELFactory.java @@ -4,6 +4,7 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import org.apache.bcel.Constants; @@ -235,7 +236,7 @@ class BCELFactory extends EmptyVisitor { } // Memorize BranchInstructions that need an update - private ArrayList branches = new ArrayList(); + private List branches = new ArrayList(); public void visitBranchInstruction(BranchInstruction bi) { BranchHandle bh = (BranchHandle)branch_map.get(bi); diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index 13b7d222..335cd75b 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -26,6 +26,7 @@ import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.StringTokenizer; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -49,7 +50,7 @@ public class ClassPath implements Serializable { public ClassPath(String class_path) { this.class_path = class_path; - ArrayList vec = new ArrayList(); + List vec = new ArrayList(); for(StringTokenizer tok=new StringTokenizer(class_path, System.getProperty("path.separator")); @@ -103,7 +104,7 @@ public class ClassPath implements Serializable { return false; } - private static final void getPathComponents(String path, ArrayList list) { + private static final void getPathComponents(String path, List list) { if(path != null) { StringTokenizer tok = new StringTokenizer(path, File.pathSeparator); @@ -127,12 +128,12 @@ public class ClassPath implements Serializable { String boot_path = System.getProperty("sun.boot.class.path"); String ext_path = System.getProperty("java.ext.dirs"); - ArrayList list = new ArrayList(); + List list = new ArrayList(); getPathComponents(class_path, list); getPathComponents(boot_path, list); - ArrayList dirs = new ArrayList(); + List dirs = new ArrayList(); getPathComponents(ext_path, dirs); for(Iterator e = dirs.iterator(); e.hasNext(); ) { diff --git a/src/java/org/apache/bcel/util/ClassVector.java b/src/java/org/apache/bcel/util/ClassVector.java index 8c9aa1b6..83c6fa6a 100644 --- a/src/java/org/apache/bcel/util/ClassVector.java +++ b/src/java/org/apache/bcel/util/ClassVector.java @@ -17,6 +17,8 @@ package org.apache.bcel.util; import java.util.ArrayList; +import java.util.List; + import org.apache.bcel.classfile.JavaClass; /** @@ -29,7 +31,7 @@ import org.apache.bcel.classfile.JavaClass; * @deprecated as of 5.1.1 - 7/17/2005 */ public class ClassVector implements java.io.Serializable { - protected ArrayList vec = new ArrayList(); + protected List vec = new ArrayList(); public void addElement(JavaClass clazz) { vec.add(clazz); } public JavaClass elementAt(int index) { return (JavaClass)vec.get(index); } diff --git a/src/java/org/apache/bcel/util/InstructionFinder.java b/src/java/org/apache/bcel/util/InstructionFinder.java index dd1fee33..0bfc2150 100644 --- a/src/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/java/org/apache/bcel/util/InstructionFinder.java @@ -20,7 +20,9 @@ package org.apache.bcel.util; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; + import org.apache.bcel.Constants; import org.apache.bcel.generic.ClassGenException; import org.apache.bcel.generic.Instruction; @@ -200,7 +202,7 @@ public class InstructionFinder { " not found in instruction list."); try { RE regex = new RE(search); - ArrayList matches = new ArrayList(); + List matches = new ArrayList(); while(start < il_string.length() && regex.match(il_string, start)) { int startExpr = regex.getParenStart(0); diff --git a/src/java/org/apache/bcel/verifier/statics/IntList.java b/src/java/org/apache/bcel/verifier/statics/IntList.java index 6c84ef7e..617e1a00 100644 --- a/src/java/org/apache/bcel/verifier/statics/IntList.java +++ b/src/java/org/apache/bcel/verifier/statics/IntList.java @@ -18,6 +18,7 @@ package org.apache.bcel.verifier.statics; import java.util.ArrayList; +import java.util.List; /** * A small utility class representing a set of basic int values. @@ -27,7 +28,7 @@ import java.util.ArrayList; */ public class IntList{ /** The int are stored as Integer objects here. */ - private ArrayList theList; + private List theList; /** This constructor creates an empty list. */ IntList(){ theList = new ArrayList(); -- GitLab From 6b7c137291865a6d066e5f31776c358366708bd1 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 9 Aug 2005 03:41:11 +0000 Subject: [PATCH 0268/1313] 'guard' against npe's git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@230960 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/ConstantPool.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/java/org/apache/bcel/classfile/ConstantPool.java index 652567f4..20852b60 100644 --- a/src/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/java/org/apache/bcel/classfile/ConstantPool.java @@ -323,14 +323,14 @@ public class ConstantPool implements Cloneable, Node, Serializable { try { c = (ConstantPool)clone(); - } catch(CloneNotSupportedException e) {} + c.constant_pool = new Constant[constant_pool_count]; - c.constant_pool = new Constant[constant_pool_count]; + for(int i=1; i < constant_pool_count; i++) { + if(constant_pool[i] != null) + c.constant_pool[i] = constant_pool[i].copy(); + } + } catch(CloneNotSupportedException e) {} - for(int i=1; i < constant_pool_count; i++) { - if(constant_pool[i] != null) - c.constant_pool[i] = constant_pool[i].copy(); - } return c; } -- GitLab From 0e3574bdaab211c2fbe6f200415e386ebb9681be Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 9 Aug 2005 03:43:46 +0000 Subject: [PATCH 0269/1313] 'guard' against npe's git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@230961 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/JavaClass.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index e30c8ff7..5e3bb905 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -670,24 +670,24 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { try { c = (JavaClass)clone(); - } catch (CloneNotSupportedException e) { - } - c.constant_pool = constant_pool.copy(); - c.interfaces = (int[])interfaces.clone(); - c.interface_names = (String[])interface_names.clone(); + c.constant_pool = constant_pool.copy(); + c.interfaces = (int[])interfaces.clone(); + c.interface_names = (String[])interface_names.clone(); - c.fields = new Field[fields.length]; - for (int i = 0; i < fields.length; i++) - c.fields[i] = fields[i].copy(c.constant_pool); + c.fields = new Field[fields.length]; + for (int i = 0; i < fields.length; i++) + c.fields[i] = fields[i].copy(c.constant_pool); - c.methods = new Method[methods.length]; - for (int i = 0; i < methods.length; i++) - c.methods[i] = methods[i].copy(c.constant_pool); + c.methods = new Method[methods.length]; + for (int i = 0; i < methods.length; i++) + c.methods[i] = methods[i].copy(c.constant_pool); - c.attributes = new Attribute[attributes.length]; - for (int i = 0; i < attributes.length; i++) - c.attributes[i] = attributes[i].copy(c.constant_pool); + c.attributes = new Attribute[attributes.length]; + for (int i = 0; i < attributes.length; i++) + c.attributes[i] = attributes[i].copy(c.constant_pool); + } catch (CloneNotSupportedException e) { + } return c; } -- GitLab From 26a073e80cce004a3a6f3408333011d1f7f39816 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 9 Aug 2005 03:45:35 +0000 Subject: [PATCH 0270/1313] 'guard' against npe's git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@230962 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/VerifierAppFrame.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/java/org/apache/bcel/verifier/VerifierAppFrame.java index 10a46bd9..5c5dd711 100644 --- a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -331,11 +331,11 @@ public class VerifierAppFrame extends JFrame { JavaClass jc = null; try { jc = Repository.lookupClass(v.getClassName()); + all3amsg += "Method '"+jc.getMethods()[i]+"': "+vr.getMessage().replace('\n',' ')+"\n\n"; } catch (ClassNotFoundException ex) { // FIXME: handle the error ex.printStackTrace(); } - all3amsg += "Method '"+jc.getMethods()[i]+"': "+vr.getMessage().replace('\n',' ')+"\n\n"; } } pass3aTextPane.setText(all3amsg); @@ -363,11 +363,11 @@ public class VerifierAppFrame extends JFrame { JavaClass jc = null; try { jc = Repository.lookupClass(v.getClassName()); + all3bmsg += "Method '"+jc.getMethods()[i]+"': "+vr.getMessage().replace('\n',' ')+"\n\n"; } catch (ClassNotFoundException ex) { // FIXME: handle the error ex.printStackTrace(); } - all3bmsg += "Method '"+jc.getMethods()[i]+"': "+vr.getMessage().replace('\n',' ')+"\n\n"; } } pass3bTextPane.setText(all3bmsg); -- GitLab From 0dbae7295aef6f772dcedf61f8f0ff1b07c96058 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 9 Aug 2005 03:46:52 +0000 Subject: [PATCH 0271/1313] 'guard' against npe's git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@230963 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/VerifyDialog.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/VerifyDialog.java b/src/java/org/apache/bcel/verifier/VerifyDialog.java index 8c5eb336..f2d4be97 100644 --- a/src/java/org/apache/bcel/verifier/VerifyDialog.java +++ b/src/java/org/apache/bcel/verifier/VerifyDialog.java @@ -504,18 +504,19 @@ public void pass4Button_ActionPerformed(java.awt.event.ActionEvent actionEvent) JavaClass jc = null; try { jc = Repository.lookupClass(class_name); + + int nr = jc.getMethods().length; + for (int i=0; i Date: Tue, 9 Aug 2005 03:50:43 +0000 Subject: [PATCH 0272/1313] make sure streams are closed, even on exception git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@230964 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/ClassPath.java | 21 ++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index 335cd75b..09ae354e 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -220,17 +220,22 @@ public class ClassPath implements Serializable { * @return byte array for file on class path */ public byte[] getBytes(String name, String suffix) throws IOException { - InputStream is = getInputStream(name, suffix); + DataInputStream dis = null; + try { + InputStream is = getInputStream(name, suffix); - if(is == null) - throw new IOException("Couldn't find: " + name + suffix); + if(is == null) + throw new IOException("Couldn't find: " + name + suffix); - DataInputStream dis = new DataInputStream(is); - byte[] bytes = new byte[is.available()]; - dis.readFully(bytes); - dis.close(); is.close(); + dis = new DataInputStream(is); + byte[] bytes = new byte[is.available()]; + dis.readFully(bytes); - return bytes; + return bytes; + } finally { + if (dis != null) + dis.close(); + } } /** -- GitLab From f07e2550989955261b915e630df4148f904338e4 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 11 Aug 2005 03:36:32 +0000 Subject: [PATCH 0273/1313] fix for 36110 - LocalVariableGen calls setStart and setEnd which add 'this' to a hashset. The problem is that the hash is computed using start and end. since start wasn't computed until after it is added, the add hash and remove hash will be different. Changed ctor to stuff the start and end values before calling setStart and setEnd git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@231385 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/LocalVariableGen.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/java/org/apache/bcel/generic/LocalVariableGen.java b/src/java/org/apache/bcel/generic/LocalVariableGen.java index afe57963..32a1ce17 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/java/org/apache/bcel/generic/LocalVariableGen.java @@ -58,6 +58,12 @@ public class LocalVariableGen this.name = name; this.type = type; this.index = index; + // setStart and setEnd add 'this' to a HashSet, causing the hash to compute. + // The hash uses start and end, so set them before calling setStart/setEnd. + // Otherwise, the remove will fail because the hash is different than the add. + // Icky, but should be ok. See Bug: 36110 -- dbrosius + this.start = start; + this.end = end; setStart(start); setEnd(end); } -- GitLab From a4aca59c746beebf81cb0aab941e77340762bfcf Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 11 Aug 2005 22:19:27 +0000 Subject: [PATCH 0274/1313] rollback git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@231527 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/LocalVariableGen.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/java/org/apache/bcel/generic/LocalVariableGen.java b/src/java/org/apache/bcel/generic/LocalVariableGen.java index 32a1ce17..afe57963 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/java/org/apache/bcel/generic/LocalVariableGen.java @@ -58,12 +58,6 @@ public class LocalVariableGen this.name = name; this.type = type; this.index = index; - // setStart and setEnd add 'this' to a HashSet, causing the hash to compute. - // The hash uses start and end, so set them before calling setStart/setEnd. - // Otherwise, the remove will fail because the hash is different than the add. - // Icky, but should be ok. See Bug: 36110 -- dbrosius - this.start = start; - this.end = end; setStart(start); setEnd(end); } -- GitLab From 4e56fa6b620e40202a3157b535d82d71fa610e9c Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 11 Aug 2005 22:53:03 +0000 Subject: [PATCH 0275/1313] remove start and end hashing from LocalVariableGen's hashCode, as these values are changed after this LocalVariableGen is added to a HashMap. Change hashCode to be based on index, name and type. These means the problem still occurs if a change is made to the name or type. But this 'might' happen, as opposed to start/end absolutely happening. -- A real fix should be developed in the future. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@231532 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/LocalVariableGen.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/java/org/apache/bcel/generic/LocalVariableGen.java b/src/java/org/apache/bcel/generic/LocalVariableGen.java index afe57963..91834c5f 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/java/org/apache/bcel/generic/LocalVariableGen.java @@ -142,11 +142,8 @@ public class LocalVariableGen /** @return a hash code value for the object. */ public int hashCode() { - int hc = index; - if (start != null) - hc ^= start.hashCode(); - if (end != null) - hc ^= end.hashCode(); + //If the user changes the name or type, problems with the targeter hashmap will occur + int hc = index ^ name.hashCode() ^ type.hashCode(); return hc; } -- GitLab From e62cb8390e70030a76ac88717b7d5af6906ab7c7 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 11 Sep 2005 04:27:01 +0000 Subject: [PATCH 0276/1313] =?UTF-8?q?the=20number=20of=20parameter=20annot?= =?UTF-8?q?ations=20is=20a=20byte=20not=20a=20short.=20Thanks=20-=20Jan=20?= =?UTF-8?q?M=C3=B6nnich?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@280067 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/ParameterAnnotations.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/java/org/apache/bcel/classfile/ParameterAnnotations.java index fe32b506..5afb7e80 100644 --- a/src/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -42,7 +42,7 @@ public abstract class ParameterAnnotations extends Attribute { { this(parameter_annotation_type, name_index, length, (ParameterAnnotationEntry[]) null, constant_pool); - num_parameters = (file.readUnsignedShort()); + num_parameters = (file.readUnsignedByte()); parameter_annotation_table = new ParameterAnnotationEntry[num_parameters]; for(int i=0; i < num_parameters; i++) -- GitLab From 2e5f2339f1aaeb72f5b3dadfe8ce344042971021 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 28 Sep 2005 03:09:18 +0000 Subject: [PATCH 0277/1313] minor performance improvement git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@292101 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/JavaClass.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 5e3bb905..75785331 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -657,7 +657,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { StringBuffer buf = new StringBuffer(); while (tok.hasMoreTokens()) - buf.append("\t" + tok.nextToken() + "\n"); + buf.append("\t").append(tok.nextToken()).append("\n"); return buf.toString(); } -- GitLab From bf21a628534c92e5147f284007dc7d758e8e4aae Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 28 Sep 2005 03:12:38 +0000 Subject: [PATCH 0278/1313] better try/catch handling git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@292102 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/FieldOrMethod.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/java/org/apache/bcel/classfile/FieldOrMethod.java index 6b4082ae..9e0a6d95 100644 --- a/src/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -195,19 +195,19 @@ public abstract class FieldOrMethod extends AccessFlags * @return deep copy of this field */ protected FieldOrMethod copy_(ConstantPool _constant_pool) { - FieldOrMethod c = null; try { - c = (FieldOrMethod)clone(); - } catch (CloneNotSupportedException e) { - } + FieldOrMethod c = (FieldOrMethod)clone(); + c.constant_pool = _constant_pool; + c.attributes = new Attribute[attributes_count]; - c.constant_pool = _constant_pool; - c.attributes = new Attribute[attributes_count]; + for (int i = 0; i < attributes_count; i++) + c.attributes[i] = attributes[i].copy(_constant_pool); - for (int i = 0; i < attributes_count; i++) - c.attributes[i] = attributes[i].copy(_constant_pool); + return c; + } catch (CloneNotSupportedException e) { + return null; + } - return c; } } -- GitLab From f95097e2e3e08d4e1e59a07a2cdd07ddaa461444 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 28 Sep 2005 03:42:08 +0000 Subject: [PATCH 0279/1313] don't convert lists to arrays manually, use toArray git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@292108 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/PassVerifier.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/PassVerifier.java b/src/java/org/apache/bcel/verifier/PassVerifier.java index a0d062bb..f5bb6e3b 100644 --- a/src/java/org/apache/bcel/verifier/PassVerifier.java +++ b/src/java/org/apache/bcel/verifier/PassVerifier.java @@ -18,6 +18,7 @@ package org.apache.bcel.verifier; import java.util.ArrayList; +import java.util.List; /** * A PassVerifier actually verifies a class file; it is instantiated @@ -48,7 +49,7 @@ import java.util.ArrayList; public abstract class PassVerifier{ /** The (warning) messages. */ - private ArrayList messages = new ArrayList(); //Type of elements: String + private List messages = new ArrayList(); //Type of elements: String /** The VerificationResult cache. */ private VerificationResult verificationResult = null; @@ -97,10 +98,7 @@ public abstract class PassVerifier{ */ public String[] getMessages(){ verify(); // create messages if not already done (cached!) - String[] ret = new String[messages.size()]; - for (int i=0; i Date: Wed, 28 Sep 2005 03:46:48 +0000 Subject: [PATCH 0280/1313] don't rely on the Vector 'interface' git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@292113 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/VerifierFactory.java | 7 ++++--- .../apache/bcel/verifier/structurals/Pass3bVerifier.java | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/VerifierFactory.java b/src/java/org/apache/bcel/verifier/VerifierFactory.java index e0095f3c..b7a7d693 100644 --- a/src/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/java/org/apache/bcel/verifier/VerifierFactory.java @@ -19,6 +19,7 @@ package org.apache.bcel.verifier; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Vector; @@ -42,7 +43,7 @@ public class VerifierFactory{ /** * The VerifierFactoryObserver instances that observe the VerifierFactory. */ - private static Vector observers = new Vector(); + private static List observers = new Vector(); /** * The VerifierFactory is not instantiable. @@ -93,13 +94,13 @@ public class VerifierFactory{ * Adds the VerifierFactoryObserver o to the list of observers. */ public static void attach(VerifierFactoryObserver o){ - observers.addElement(o); + observers.add(o); } /** * Removes the VerifierFactoryObserver o from the list of observers. */ public static void detach(VerifierFactoryObserver o){ - observers.removeElement(o); + observers.remove(o); } } diff --git a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 1c6838ef..8b9946f7 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -20,8 +20,10 @@ package org.apache.bcel.verifier.structurals; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; +import java.util.List; import java.util.Random; import java.util.Vector; + import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; @@ -72,8 +74,8 @@ public final class Pass3bVerifier extends PassVerifier{ * we have about its symbolic execution predecessors. */ private static final class InstructionContextQueue{ - private Vector ics = new Vector(); // Type: InstructionContext - private Vector ecs = new Vector(); // Type: ArrayList (of InstructionContext) + private List ics = new Vector(); // Type: InstructionContext + private List ecs = new Vector(); // Type: ArrayList (of InstructionContext) public void add(InstructionContext ic, ArrayList executionChain){ ics.add(ic); ecs.add(executionChain); -- GitLab From 7ae567bd0412390f25256b6b14c64f6c28410981 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 28 Sep 2005 03:52:39 +0000 Subject: [PATCH 0281/1313] don't rely on the Enumeration interface git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@292117 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/structurals/Subroutines.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java index 70768e18..b2f1d038 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -19,11 +19,11 @@ package org.apache.bcel.verifier.structurals; import java.awt.Color; import java.util.ArrayList; -import java.util.Enumeration; import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.Set; + import org.apache.bcel.generic.ASTORE; import org.apache.bcel.generic.ATHROW; import org.apache.bcel.generic.BranchInstruction; @@ -466,9 +466,9 @@ public class Subroutines{ for (int i=0; i Date: Sat, 1 Oct 2005 22:32:27 +0000 Subject: [PATCH 0282/1313] Bug 36845: If the LineNumberTable has a bad byte offset, don't add a LineNumberGen for that line to the MethodGen's list of LineNumbers. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@293036 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/MethodGen.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index df5eefab..5b4b074f 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -247,7 +247,9 @@ m.getName(), for (int k = 0; k < ln.length; k++) { LineNumber l = ln[k]; - addLineNumber(il.findHandle(l.getStartPC()), l.getLineNumber()); + InstructionHandle ih = il.findHandle(l.getStartPC()); + if (ih != null) + addLineNumber(ih, l.getLineNumber()); } } else if (a instanceof LocalVariableTable) { LocalVariable[] lv = -- GitLab From 49e3e14b6cdde779b6a5ef3469c97cb5d73301bc Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 10 Oct 2005 06:04:21 +0000 Subject: [PATCH 0283/1313] more efficient string buffering git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@312566 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/Code.java | 15 ++-- .../apache/bcel/classfile/ConstantPool.java | 2 +- src/java/org/apache/bcel/classfile/Field.java | 7 +- .../apache/bcel/classfile/InnerClasses.java | 2 +- .../org/apache/bcel/classfile/JavaClass.java | 36 ++++---- .../org/apache/bcel/classfile/Method.java | 4 +- .../apache/bcel/classfile/StackMapEntry.java | 15 ++-- .../org/apache/bcel/classfile/Synthetic.java | 2 +- .../org/apache/bcel/classfile/Utility.java | 90 +++++++++---------- .../apache/bcel/generic/ConstantPoolGen.java | 2 +- .../org/apache/bcel/generic/FieldGen.java | 5 +- .../apache/bcel/generic/InstructionList.java | 2 +- .../org/apache/bcel/generic/MethodGen.java | 2 +- src/java/org/apache/bcel/generic/Select.java | 2 +- src/java/org/apache/bcel/util/BCELifier.java | 2 +- src/java/org/apache/bcel/util/CodeHTML.java | 70 ++++++++------- 16 files changed, 130 insertions(+), 128 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/Code.java b/src/java/org/apache/bcel/classfile/Code.java index 04105613..656c5e48 100644 --- a/src/java/org/apache/bcel/classfile/Code.java +++ b/src/java/org/apache/bcel/classfile/Code.java @@ -287,23 +287,24 @@ public final class Code extends Attribute { public final String toString(boolean verbose) { StringBuffer buf; - buf = new StringBuffer("Code(max_stack = " + max_stack + - ", max_locals = " + max_locals + - ", code_length = " + code_length + ")\n" + - Utility.codeToString(code, constant_pool, 0, -1, verbose)); + buf = new StringBuffer(100); + buf.append("Code(max_stack = ").append(max_stack) + .append(", max_locals = ").append(max_locals) + .append(", code_length = ").append(code_length).append(")\n") + .append(Utility.codeToString(code, constant_pool, 0, -1, verbose)); if(exception_table_length > 0) { - buf.append("\nException handler(s) = \n" + "From\tTo\tHandler\tType\n"); + buf.append("\nException handler(s) = \n").append("From\tTo\tHandler\tType\n"); for(int i=0; i < exception_table_length; i++) - buf.append(exception_table[i].toString(constant_pool, verbose) + "\n"); + buf.append(exception_table[i].toString(constant_pool, verbose)).append("\n"); } if(attributes_count > 0) { buf.append("\nAttribute(s) = \n"); for(int i=0; i < attributes_count; i++) - buf.append(attributes[i].toString() + "\n"); + buf.append(attributes[i].toString()).append("\n"); } return buf.toString(); diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/java/org/apache/bcel/classfile/ConstantPool.java index 20852b60..3e8531ec 100644 --- a/src/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/java/org/apache/bcel/classfile/ConstantPool.java @@ -310,7 +310,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { StringBuffer buf = new StringBuffer(); for(int i=1; i < constant_pool_count; i++) - buf.append(i + ")" + constant_pool[i] + "\n"); + buf.append(i).append(")").append(constant_pool[i]).append("\n"); return buf.toString(); } diff --git a/src/java/org/apache/bcel/classfile/Field.java b/src/java/org/apache/bcel/classfile/Field.java index 52c37229..4d438821 100644 --- a/src/java/org/apache/bcel/classfile/Field.java +++ b/src/java/org/apache/bcel/classfile/Field.java @@ -115,17 +115,18 @@ public final class Field extends FieldOrMethod { signature = Utility.signatureToString(getSignature()); name = getName(); - StringBuffer buf = new StringBuffer(access + signature + " " + name); + StringBuffer buf = new StringBuffer(64); + buf.append(access).append(signature).append(" ").append(name); ConstantValue cv = getConstantValue(); if (cv != null) - buf.append(" = " + cv); + buf.append(" = ").append(cv); for (int i = 0; i < attributes_count; i++) { Attribute a = attributes[i]; if (!(a instanceof ConstantValue)) - buf.append(" [" + a.toString() + "]"); + buf.append(" [").append(a.toString()).append("]"); } return buf.toString(); diff --git a/src/java/org/apache/bcel/classfile/InnerClasses.java b/src/java/org/apache/bcel/classfile/InnerClasses.java index 7d12d47f..21baa114 100644 --- a/src/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/java/org/apache/bcel/classfile/InnerClasses.java @@ -124,7 +124,7 @@ public final class InnerClasses extends Attribute { StringBuffer buf = new StringBuffer(); for(int i=0; i < number_of_classes; i++) - buf.append(inner_classes[i].toString(constant_pool) + "\n"); + buf.append(inner_classes[i].toString(constant_pool)).append("\n"); return buf.toString(); } diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 75785331..63e38be0 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -602,14 +602,14 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { access = access.equals("") ? "" : (access + " "); StringBuffer buf = - new StringBuffer( - access - + Utility.classOrInterface(access_flags) - + " " - + class_name - + " extends " - + Utility.compactClassName(superclass_name, false) - + '\n'); + new StringBuffer(128); + buf.append(access) + .append(Utility.classOrInterface(access_flags)) + .append(" ") + .append(class_name) + .append(" extends ") + .append(Utility.compactClassName(superclass_name, false)) + .append('\n'); int size = interfaces.length; if (size > 0) { @@ -624,12 +624,12 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { buf.append('\n'); } - buf.append("filename\t\t" + file_name + '\n'); - buf.append("compiled from\t\t" + source_file_name + '\n'); - buf.append("compiler version\t" + major + "." + minor + '\n'); - buf.append("access flags\t\t" + access_flags + '\n'); - buf.append("constant pool\t\t" + constant_pool.getLength() + " entries\n"); - buf.append("ACC_SUPER flag\t\t" + isSuper() + "\n"); + buf.append("filename\t\t").append(file_name).append('\n'); + buf.append("compiled from\t\t").append(source_file_name).append('\n'); + buf.append("compiler version\t").append(major).append(".").append(minor).append('\n'); + buf.append("access flags\t\t").append(access_flags).append('\n'); + buf.append("constant pool\t\t").append(constant_pool.getLength()).append(" entries\n"); + buf.append("ACC_SUPER flag\t\t").append(isSuper()).append("\n"); if (attributes.length > 0) { buf.append("\nAttribute(s):\n"); @@ -638,15 +638,15 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { } if (fields.length > 0) { - buf.append("\n" + fields.length + " fields:\n"); + buf.append("\n").append(fields.length).append(" fields:\n"); for (int i = 0; i < fields.length; i++) - buf.append("\t" + fields[i] + '\n'); + buf.append("\t").append(fields[i]).append('\n'); } if (methods.length > 0) { - buf.append("\n" + methods.length + " methods:\n"); + buf.append("\n").append(methods.length).append(" methods:\n"); for (int i = 0; i < methods.length; i++) - buf.append("\t" + methods[i] + '\n'); + buf.append("\t").append(methods[i]).append('\n'); } return buf.toString(); diff --git a/src/java/org/apache/bcel/classfile/Method.java b/src/java/org/apache/bcel/classfile/Method.java index 29943af2..967b20ad 100644 --- a/src/java/org/apache/bcel/classfile/Method.java +++ b/src/java/org/apache/bcel/classfile/Method.java @@ -185,14 +185,14 @@ public final class Method extends FieldOrMethod { Attribute a = attributes[i]; if (!((a instanceof Code) || (a instanceof ExceptionTable))) - buf.append(" [" + a.toString() + "]"); + buf.append(" [").append(a.toString()).append("]"); } ExceptionTable e = getExceptionTable(); if (e != null) { String str = e.toString(); if (!str.equals("")) - buf.append("\n\t\tthrows " + str); + buf.append("\n\t\tthrows ").append(str); } return buf.toString(); diff --git a/src/java/org/apache/bcel/classfile/StackMapEntry.java b/src/java/org/apache/bcel/classfile/StackMapEntry.java index 257ecfe1..7043c068 100644 --- a/src/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/java/org/apache/bcel/classfile/StackMapEntry.java @@ -94,15 +94,16 @@ public final class StackMapEntry implements Cloneable { * @return String representation. */ public final String toString() { - StringBuffer buf = new StringBuffer("(offset=" + byte_code_offset); + StringBuffer buf = new StringBuffer(64); + buf.append("(offset=").append(byte_code_offset); if(number_of_locals > 0) { buf.append(", locals={"); for(int i=0; i < number_of_locals; i++) { - buf.append(types_of_locals[i]); - if(i < number_of_locals - 1) - buf.append(", "); + buf.append(types_of_locals[i]); + if(i < number_of_locals - 1) + buf.append(", "); } buf.append("}"); @@ -112,9 +113,9 @@ public final class StackMapEntry implements Cloneable { buf.append(", stack items={"); for(int i=0; i < number_of_stack_items; i++) { - buf.append(types_of_stack_items[i]); - if(i < number_of_stack_items - 1) - buf.append(", "); + buf.append(types_of_stack_items[i]); + if(i < number_of_stack_items - 1) + buf.append(", "); } buf.append("}"); diff --git a/src/java/org/apache/bcel/classfile/Synthetic.java b/src/java/org/apache/bcel/classfile/Synthetic.java index 86e275b2..03ed373c 100644 --- a/src/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/java/org/apache/bcel/classfile/Synthetic.java @@ -121,7 +121,7 @@ public final class Synthetic extends Attribute { StringBuffer buf = new StringBuffer("Synthetic"); if(length > 0) - buf.append(" " + Utility.toHexString(bytes)); + buf.append(" ").append(Utility.toHexString(bytes)); return buf.toString(); } diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 3d1c4428..7c44f976 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -111,7 +111,7 @@ public abstract class Utility { if(for_class && ((p == Constants.ACC_SUPER) || (p == Constants.ACC_INTERFACE))) continue; - buf.append(Constants.ACCESS_NAMES[i] + " "); + buf.append(Constants.ACCESS_NAMES[i]).append(" "); } } @@ -153,7 +153,7 @@ public abstract class Utility { for(int i=0; stream.available() > 0; i++) { if((length < 0) || (i < length)) { String indices = fillup(stream.getIndex() + ":", 6, true, ' '); - buf.append(indices + codeToString(stream, constant_pool, verbose) + '\n'); + buf.append(indices).append(codeToString(stream, constant_pool, verbose)).append('\n'); } } } catch(IOException e) { @@ -220,8 +220,8 @@ public abstract class Utility { offset = bytes.getIndex() - 12 - no_pad_bytes - 1; default_offset += offset; - buf.append("\tdefault = " + default_offset + ", low = " + low + - ", high = " + high + "("); + buf.append("\tdefault = ").append(default_offset).append(", low = ").append(low) + .append(", high = ").append(high).append("("); jump_table = new int[high - low + 1]; for(int i=0; i < jump_table.length; i++) { @@ -246,15 +246,15 @@ public abstract class Utility { jump_table = new int[npairs]; default_offset += offset; - buf.append("\tdefault = " + default_offset + ", npairs = " + npairs + - " ("); + buf.append("\tdefault = ").append(default_offset).append(", npairs = ").append(npairs) + .append(" ("); for(int i=0; i < npairs; i++) { match[i] = bytes.readInt(); jump_table[i] = offset + bytes.readInt(); - buf.append("(" + match[i] + ", " + jump_table[i] + ")"); + buf.append("(").append(match[i]).append(", ").append(jump_table[i]).append(")"); if(i < npairs - 1) buf.append(", "); @@ -271,13 +271,13 @@ public abstract class Utility { case Constants.IFNONNULL: case Constants.IFNULL: case Constants.IF_ACMPEQ: case Constants.IF_ACMPNE: case Constants.IF_ICMPEQ: case Constants.IF_ICMPGE: case Constants.IF_ICMPGT: case Constants.IF_ICMPLE: case Constants.IF_ICMPLT: case Constants.IF_ICMPNE: - buf.append("\t\t#" + ((bytes.getIndex() - 1) + bytes.readShort())); + buf.append("\t\t#").append((bytes.getIndex() - 1) + bytes.readShort()); break; /* 32-bit wide jumps */ case Constants.GOTO_W: case Constants.JSR_W: - buf.append("\t\t#" + ((bytes.getIndex() - 1) + bytes.readInt())); + buf.append("\t\t#").append(((bytes.getIndex() - 1) + bytes.readInt())); break; /* Index byte references local variable (register) @@ -292,7 +292,7 @@ public abstract class Utility { else vindex = bytes.readUnsignedByte(); - buf.append("\t\t%" + vindex); + buf.append("\t\t%").append(vindex); break; /* @@ -308,16 +308,16 @@ public abstract class Utility { /* Array of basic type. */ case Constants.NEWARRAY: - buf.append("\t\t<" + Constants.TYPE_NAMES[bytes.readByte()] + ">"); + buf.append("\t\t<").append(Constants.TYPE_NAMES[bytes.readByte()]).append(">"); break; /* Access object/class fields. */ case Constants.GETFIELD: case Constants.GETSTATIC: case Constants.PUTFIELD: case Constants.PUTSTATIC: index = bytes.readUnsignedShort(); - buf.append("\t\t" + - constant_pool.constantToString(index, Constants.CONSTANT_Fieldref) + - (verbose? " (" + index + ")" : "")); + buf.append("\t\t") + .append(constant_pool.constantToString(index, Constants.CONSTANT_Fieldref)) + .append((verbose? " (" + index + ")" : "")); break; /* Operands are references to classes in constant pool @@ -327,28 +327,26 @@ public abstract class Utility { buf.append("\t"); case Constants.INSTANCEOF: index = bytes.readUnsignedShort(); - buf.append("\t<" + constant_pool.constantToString(index, - Constants.CONSTANT_Class) + - ">" + (verbose? " (" + index + ")" : "")); + buf.append("\t<").append(constant_pool.constantToString(index, Constants.CONSTANT_Class)) + .append(">").append((verbose? " (" + index + ")" : "")); break; /* Operands are references to methods in constant pool */ case Constants.INVOKESPECIAL: case Constants.INVOKESTATIC: case Constants.INVOKEVIRTUAL: index = bytes.readUnsignedShort(); - buf.append("\t" + constant_pool.constantToString(index, - Constants.CONSTANT_Methodref) + - (verbose? " (" + index + ")" : "")); + buf.append("\t").append(constant_pool.constantToString(index, + Constants.CONSTANT_Methodref)) + .append((verbose? " (" + index + ")" : "")); break; case Constants.INVOKEINTERFACE: index = bytes.readUnsignedShort(); int nargs = bytes.readUnsignedByte(); // historical, redundant - buf.append("\t" + - constant_pool.constantToString(index, - Constants.CONSTANT_InterfaceMethodref) + - (verbose? " (" + index + ")\t" : "") + nargs + "\t" + - bytes.readUnsignedByte()); // Last byte is a reserved space + buf.append("\t").append(constant_pool.constantToString(index, + Constants.CONSTANT_InterfaceMethodref)) + .append(verbose? " (" + index + ")\t" : "").append(nargs).append("\t") + .append(bytes.readUnsignedByte()); // Last byte is a reserved space break; /* Operands are references to items in constant pool @@ -356,18 +354,17 @@ public abstract class Utility { case Constants.LDC_W: case Constants.LDC2_W: index = bytes.readUnsignedShort(); - buf.append("\t\t" + constant_pool.constantToString - (index, constant_pool.getConstant(index).getTag()) + - (verbose? " (" + index + ")" : "")); + buf.append("\t\t").append(constant_pool.constantToString + (index, constant_pool.getConstant(index).getTag())) + .append((verbose? " (" + index + ")" : "")); break; case Constants.LDC: index = bytes.readUnsignedByte(); - buf.append("\t\t" + - constant_pool.constantToString - (index, constant_pool.getConstant(index).getTag()) + - (verbose? " (" + index + ")" : "")); + buf.append("\t\t").append( + constant_pool.constantToString(index, constant_pool.getConstant(index).getTag())) + .append((verbose? " (" + index + ")" : "")); break; /* Array of references. @@ -375,9 +372,9 @@ public abstract class Utility { case Constants.ANEWARRAY: index = bytes.readUnsignedShort(); - buf.append("\t\t<" + compactClassName(constant_pool.getConstantString - (index, Constants.CONSTANT_Class), false) + - ">" + (verbose? " (" + index + ")": "")); + buf.append("\t\t<").append(compactClassName(constant_pool.getConstantString + (index, Constants.CONSTANT_Class), false)) + .append(">").append((verbose? " (" + index + ")": "")); break; /* Multidimensional array of references. @@ -386,9 +383,9 @@ public abstract class Utility { index = bytes.readUnsignedShort(); int dimensions = bytes.readUnsignedByte(); - buf.append("\t<" + compactClassName(constant_pool.getConstantString - (index, Constants.CONSTANT_Class), false) + - ">\t" + dimensions + (verbose? " (" + index + ")" : "")); + buf.append("\t<").append(compactClassName(constant_pool.getConstantString + (index, Constants.CONSTANT_Class), false)) + .append(">\t").append(dimensions).append((verbose? " (" + index + ")" : "")); } break; @@ -404,7 +401,7 @@ public abstract class Utility { vindex = bytes.readUnsignedByte(); constant = bytes.readByte(); } - buf.append("\t\t%" + vindex + "\t" + constant); + buf.append("\t\t%").append(vindex).append("\t").append(constant); break; default: @@ -535,7 +532,7 @@ public abstract class Utility { str = getSignature(ret); - buf.append(")" + str); + buf.append(")").append(str); return buf.toString(); } @@ -689,9 +686,9 @@ public abstract class Utility { LocalVariable l = vars.getLocalVariable(var_index); if(l != null) - buf.append(" " + l.getName()); + buf.append(" ").append(l.getName()); } else - buf.append(" arg" + var_index); + buf.append(" arg").append(var_index); if("double".equals(param_type) || "long".equals(param_type)) var_index += 2; @@ -838,7 +835,6 @@ public abstract class Utility { int n; StringBuffer brackets; String type; - char ch; int consumed_chars; // Shadows global var brackets = new StringBuffer(); // Accumulate []'s @@ -925,7 +921,7 @@ public abstract class Utility { } if(!found) // Class name - buf.append('L' + type.replace('.', '/') + ';'); + buf.append('L').append(type.replace('.', '/')).append(';'); return buf.toString(); } @@ -1134,13 +1130,13 @@ public abstract class Utility { for(int i=0; i < obj.length; i++) { if(obj[i] != null) { - buf.append((quote? "\"" : "") + obj[i].toString() + (quote? "\"" : "")); + buf.append((quote? "\"" : "")).append(obj[i].toString()).append((quote? "\"" : "")); } else { - buf.append("null"); + buf.append("null"); } if(i < obj.length - 1) { - buf.append(", "); + buf.append(", "); } } diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/java/org/apache/bcel/generic/ConstantPoolGen.java index f573b99f..e8913c41 100644 --- a/src/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -686,7 +686,7 @@ public class ConstantPoolGen implements java.io.Serializable { StringBuffer buf = new StringBuffer(); for(int i=1; i < index; i++) - buf.append(i + ")" + constants[i] + "\n"); + buf.append(i).append(")").append(constants[i]).append("\n"); return buf.toString(); } diff --git a/src/java/org/apache/bcel/generic/FieldGen.java b/src/java/org/apache/bcel/generic/FieldGen.java index 704f0303..b7cc3d2a 100644 --- a/src/java/org/apache/bcel/generic/FieldGen.java +++ b/src/java/org/apache/bcel/generic/FieldGen.java @@ -277,11 +277,12 @@ public class FieldGen extends FieldGenOrMethodGen { signature = type.toString(); name = getName(); - StringBuffer buf = new StringBuffer(access + signature + " " + name); + StringBuffer buf = new StringBuffer(32); + buf.append(access).append(signature).append(" ").append(name); String value = getInitValue(); if(value != null) - buf.append(" = " + value); + buf.append(" = ").append(value); return buf.toString(); } diff --git a/src/java/org/apache/bcel/generic/InstructionList.java b/src/java/org/apache/bcel/generic/InstructionList.java index 02b644c6..5dfe6bc6 100644 --- a/src/java/org/apache/bcel/generic/InstructionList.java +++ b/src/java/org/apache/bcel/generic/InstructionList.java @@ -988,7 +988,7 @@ public class InstructionList implements Serializable { StringBuffer buf = new StringBuffer(); for(InstructionHandle ih=start; ih != null; ih = ih.next) { - buf.append(ih.toString(verbose) + "\n"); + buf.append(ih.toString(verbose)).append("\n"); } return buf.toString(); diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index 5b4b074f..364e62c7 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -1068,7 +1068,7 @@ m.getName(), if (throws_vec.size() > 0) { for (Iterator e = throws_vec.iterator(); e.hasNext();) - buf.append("\n\t\tthrows " + e.next()); + buf.append("\n\t\tthrows ").append(e.next()); } return buf.toString(); diff --git a/src/java/org/apache/bcel/generic/Select.java b/src/java/org/apache/bcel/generic/Select.java index f0464e15..759fca52 100644 --- a/src/java/org/apache/bcel/generic/Select.java +++ b/src/java/org/apache/bcel/generic/Select.java @@ -139,7 +139,7 @@ public abstract class Select extends BranchInstruction if(targets[i] != null) s = targets[i].getInstruction().toString(); - buf.append("(" + match[i] + ", " + s + " = {" + indices[i] + "})"); + buf.append("(").append(match[i]).append(", ").append(s).append(" = {").append(indices[i]).append("})"); } } else diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java index c128a73c..d268ebc2 100644 --- a/src/java/org/apache/bcel/util/BCELifier.java +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -226,7 +226,7 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { else if ((pow == Constants.ACC_TRANSIENT) && (reason == FLAG_FOR_METHOD)) buf.append("ACC_VARARGS | "); else - buf.append("ACC_" + Constants.ACCESS_NAMES[i].toUpperCase() + " | "); + buf.append("ACC_").append(Constants.ACCESS_NAMES[i].toUpperCase()).append(" | "); } pow <<= 1; diff --git a/src/java/org/apache/bcel/util/CodeHTML.java b/src/java/org/apache/bcel/util/CodeHTML.java index 1314257d..b32cfaf4 100644 --- a/src/java/org/apache/bcel/util/CodeHTML.java +++ b/src/java/org/apache/bcel/util/CodeHTML.java @@ -87,7 +87,8 @@ final class CodeHTML implements org.apache.bcel.Constants { int[] jump_table; int no_pad_bytes=0, offset; - buf = new StringBuffer("" + OPCODE_NAMES[opcode] + "

      "); + buf.append(""); } buf.append("\n"); // Print target and default indices in second row for(int i=0; i < jump_table.length; i++) - buf.append(""); - buf.append("\n
      Markus Dahmmarkus.dahm@berlin.dem.dahm@gmx.de
      Conor MacNeill"); + buf = new StringBuffer(256); + buf.append("").append(OPCODE_NAMES[opcode]).append(""); /* Special case: Skip (0-3) padding bytes, i.e., the * following bytes are 4-byte-aligned @@ -118,16 +119,16 @@ final class CodeHTML implements org.apache.bcel.Constants { for(int i=0; i < jump_table.length; i++) { jump_table[i] = offset + bytes.readInt(); - buf.append("" + (low + i) + "").append(low + i).append("default
      " + jump_table[i] + "" + default_offset + "
      \n"); + buf.append("").append(jump_table[i]).append(""); + buf.append("").append(default_offset).append("\n\n"); break; @@ -146,16 +147,16 @@ final class CodeHTML implements org.apache.bcel.Constants { int match = bytes.readInt(); jump_table[i] = offset + bytes.readInt(); - buf.append("" + match + ""); + buf.append("").append(match).append(""); } buf.append("default\n"); // Print target and default indices in second row for(int i=0; i < npairs; i++) - buf.append("" + jump_table[i] + ""); - buf.append("" + default_offset + "\n\n"); + buf.append("").append(jump_table[i]).append(""); + buf.append("").append(default_offset).append("\n\n"); break; /* Two address bytes + offset from start of byte stream form the @@ -169,15 +170,16 @@ final class CodeHTML implements org.apache.bcel.Constants { index = (int)(bytes.getIndex() + bytes.readShort() - 1); - buf.append("" + index + ""); + buf.append("") + .append(index).append(""); break; /* Same for 32-bit wide jumps */ case GOTO_W: case JSR_W: int windex = bytes.getIndex() + bytes.readInt() - 1; - buf.append("" + - windex + ""); + buf.append("") + .append(windex).append(""); break; /* Index byte references local variable (register) @@ -192,7 +194,7 @@ final class CodeHTML implements org.apache.bcel.Constants { else vindex = bytes.readUnsignedByte(); - buf.append("%" + vindex); + buf.append("%").append(vindex); break; /* @@ -208,7 +210,7 @@ final class CodeHTML implements org.apache.bcel.Constants { /* Array of basic type. */ case NEWARRAY: - buf.append("" + TYPE_NAMES[bytes.readByte()] + ""); + buf.append("").append(TYPE_NAMES[bytes.readByte()]).append(""); break; /* Access object/class fields. @@ -225,11 +227,11 @@ final class CodeHTML implements org.apache.bcel.Constants { String field_name = constant_pool.constantToString(index, CONSTANT_NameAndType); if(name.equals(class_name)) { // Local field - buf.append("" + field_name + "\n"); + buf.append("").append(field_name).append("\n"); } else - buf.append(constant_html.referenceConstant(class_index) + "." + field_name); + buf.append(constant_html.referenceConstant(class_index)).append(".").append(field_name); break; @@ -275,8 +277,8 @@ final class CodeHTML implements org.apache.bcel.Constants { String[] args = Utility.methodSignatureArgumentTypes(signature, false); String type = Utility.methodSignatureReturnType(signature, false); - buf.append(name + "." + str + "" + "("); + buf.append(name).append(".").append(str).append("").append("("); // List arguments for(int i=0; i < args.length; i++) { @@ -286,7 +288,7 @@ final class CodeHTML implements org.apache.bcel.Constants { buf.append(", "); } // Attach return type - buf.append("):" + Class2HTML.referenceType(type)); + buf.append("):").append(Class2HTML.referenceType(type)); break; @@ -295,22 +297,22 @@ final class CodeHTML implements org.apache.bcel.Constants { case LDC_W: case LDC2_W: index = bytes.readShort(); - buf.append("" + - Class2HTML.toHTML(constant_pool.constantToString(index, + buf.append("") + .append(Class2HTML.toHTML(constant_pool.constantToString(index, constant_pool. - getConstant(index).getTag()))+ - ""); + getConstant(index).getTag()))) + .append(""); break; case LDC: index = bytes.readUnsignedByte(); - buf.append("" + - Class2HTML.toHTML(constant_pool.constantToString(index, + buf.append("") + .append(Class2HTML.toHTML(constant_pool.constantToString(index, constant_pool. - getConstant(index).getTag()))+ - ""); + getConstant(index).getTag()))) + .append(""); break; /* Array of references. @@ -326,7 +328,7 @@ final class CodeHTML implements org.apache.bcel.Constants { case MULTIANEWARRAY: index = bytes.readShort(); int dimensions = bytes.readByte(); - buf.append(constant_html.referenceConstant(index) + ":" + dimensions + "-dimensional"); + buf.append(constant_html.referenceConstant(index)).append(":").append(dimensions).append("-dimensional"); break; /* Increment local variable. @@ -341,7 +343,7 @@ final class CodeHTML implements org.apache.bcel.Constants { vindex = bytes.readUnsignedByte(); constant = bytes.readByte(); } - buf.append("%" + vindex + " " + constant); + buf.append("%").append(vindex).append(" ").append(constant); break; default: -- GitLab From 26f384f0d5cd53208a77df202da026654c19b552 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 10 Oct 2005 06:07:03 +0000 Subject: [PATCH 0284/1313] silly String ctor call git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@312567 13f79535-47bb-0310-9956-ffa450edef68 --- examples/listclass.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/listclass.java b/examples/listclass.java index 8adb934d..b7b60908 100644 --- a/examples/listclass.java +++ b/examples/listclass.java @@ -198,7 +198,7 @@ public class listclass { if(c != null && c.getTag() == Constants.CONSTANT_Class) { ConstantUtf8 c1 = (ConstantUtf8) pool.getConstant(((ConstantClass)c).getNameIndex()); buf.setLength(0); - buf.append(new String(c1.getBytes())); + buf.append(c1.getBytes()); for(int n = 0; n < buf.length(); n++) { if(buf.charAt(n) == '/') buf.setCharAt(n, '.'); -- GitLab From 13229681dee6c95eeb8dd35a4840e3d2cb1b1470 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 10 Oct 2005 06:12:00 +0000 Subject: [PATCH 0285/1313] Class is defined as Cloneable, so it should have a clone method. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@312568 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/structurals/GenericArray.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/java/org/apache/bcel/verifier/structurals/GenericArray.java b/src/java/org/apache/bcel/verifier/structurals/GenericArray.java index 895e6a33..b881b371 100644 --- a/src/java/org/apache/bcel/verifier/structurals/GenericArray.java +++ b/src/java/org/apache/bcel/verifier/structurals/GenericArray.java @@ -26,4 +26,8 @@ package org.apache.bcel.verifier.structurals; * @author Enver Haase */ public class GenericArray extends java.lang.Object implements java.lang.Cloneable, java.io.Serializable{ + + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } } -- GitLab From b82c04ff6726b70b4f0dd0e89d66bdd62d00185f Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 10 Oct 2005 06:16:52 +0000 Subject: [PATCH 0286/1313] guard against npe's git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@312569 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 6b9d3214..71d848fc 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -1146,9 +1146,7 @@ public final class Pass3aVerifier extends PassVerifier{ } if (m == null){ constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg) +"' not found in class '"+jc.getClassName()+"'. The native verifier possibly allows the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); - } - - if (! (m.isStatic())){ // implies it's not abstract, verified in pass 2. + } else if (! (m.isStatic())){ // implies it's not abstract, verified in pass 2. constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' has ACC_STATIC unset."); } -- GitLab From bd7e95a6c9b68d0a6e42372aa871ad1a9ae23c89 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 10 Oct 2005 06:20:20 +0000 Subject: [PATCH 0287/1313] unused member - remove git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@312570 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/InstructionFactory.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/InstructionFactory.java b/src/java/org/apache/bcel/generic/InstructionFactory.java index 6101644e..dbb2928e 100644 --- a/src/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/java/org/apache/bcel/generic/InstructionFactory.java @@ -126,7 +126,6 @@ public class InstructionFactory private static class MethodObject { Type[] arg_types; Type result_type; - String[] arg_names; String class_name; String name; int access; -- GitLab From e11634f0cd387813e85a04e7cbfe7163f83e5ed5 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 20 Oct 2005 04:35:38 +0000 Subject: [PATCH 0288/1313] Implement Comparable on JavaClass so that it behaves properly in SortedSets, et.al. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@326809 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/JavaClass.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 63e38be0..9a543003 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -47,7 +47,7 @@ import org.apache.bcel.util.SyntheticRepository; * @see org.apache.bcel.generic.ClassGen * @author M. Dahm */ -public class JavaClass extends AccessFlags implements Cloneable, Node { +public class JavaClass extends AccessFlags implements Cloneable, Node, Comparable { private String file_name; private String package_name; private String source_file_name = ""; @@ -879,6 +879,14 @@ public class JavaClass extends AccessFlags implements Cloneable, Node { public boolean equals(Object obj) { return _cmp.equals(this, obj); } + + /** + * Return the natural ordering of two JavaClasses. + * This ordering is based on the class name + */ + public int compareTo(Object obj) { + return getClassName().compareTo(((JavaClass)obj).getClassName()); + } /** * Return value as defined by given BCELComparator strategy. -- GitLab From c06035894ae52d074b86e2c5d97dfc4a20097470 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 29 Nov 2005 03:58:56 +0000 Subject: [PATCH 0289/1313] replace awt.Color with simple int constants, to remove a dependency on awt for the verifier. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@349608 13f79535-47bb-0310-9956-ffa450edef68 --- .../verifier/structurals/Subroutines.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java index b2f1d038..93e73013 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -16,8 +16,6 @@ */ package org.apache.bcel.verifier.structurals; - -import java.awt.Color; import java.util.ArrayList; import java.util.HashSet; import java.util.Hashtable; @@ -341,6 +339,11 @@ public class Subroutines{ }// end Inner Class SubrouteImpl + //Node coloring constants + private static final Integer WHITE = new Integer(0); + private static final Integer GRAY = new Integer(1); + private static final Integer BLACK = new Integer(2); + /** * The Hashtable containing the subroutines found. * Key: InstructionHandle of the leader of the subroutine. @@ -408,7 +411,7 @@ public class Subroutines{ // instructions that belong to a subroutine. Set instructions_assigned = new HashSet(); // we don't want to assign an instruction to two or more Subroutine objects. - Hashtable colors = new Hashtable(); //Graph colouring. Key: InstructionHandle, Value: java.awt.Color . + Hashtable colors = new Hashtable(); //Graph colouring. Key: InstructionHandle, Value: Integer . iter = sub_leaders.iterator(); while (iter.hasNext()){ @@ -416,9 +419,9 @@ public class Subroutines{ InstructionHandle actual = (InstructionHandle) (iter.next()); // Init colors for (int i=0; i Date: Sat, 10 Dec 2005 21:30:44 +0000 Subject: [PATCH 0290/1313] start cleaning up for a rc1 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@355785 13f79535-47bb-0310-9956-ffa450edef68 --- lib/Regex.jar | Bin 29871 -> 0 bytes project.xml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 lib/Regex.jar diff --git a/lib/Regex.jar b/lib/Regex.jar deleted file mode 100644 index 713441c523edd1e84551770423ea02f0254fb62e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29871 zcmWIWW@h1H0D;b!YE2Lg!<-BZ48E=*j=G+HZu%f)A`Bc191Q5nM39yFI{JCKxdw;m z`MQ1fJ#*T}TUYNQueYw&xijZC2N_&3e(=rJPL(S6&9tYr&bhz z)noT7$Z;U6p$0?M2c;&aq!u}6Bo-wmm!uYXmZTOXmgE=dCFdj-7ng>_=1aSZ*v^iv zmQJ6of82BS)?lYwNxMDoIC*MnYIb@aH0e9Z&byE!H8)?zJxzA)brYvOigH>4k0vT< zFli|Tv_wt0A;hSqc!b%$;r;>s2Q!O~-BT-^oMrO;+?l<_?=8#i{{4FY{JugmNB#7ei`ZuTZ0ep4or!y{M?@R1)j7CCvgtEV zd7pJsfW|Z*sXfa=wQe(|pDUS^wld|3#m6V!lapruSKQ%}HNCCnn%fDLjqDav<4leH z4hPL;_J33mC8X3ZB@}io#((PEE1z68=A?T6F8ckw=6U#=N4-^|ds#1^veXu0>nhVr zTO&DB)HrRnWpS-;*@6h4iVLp|TT`FrM5(NB>J{fYle&A&Z11NfC!dxb(Y&_su}pjq z&$@uJu5P}7&!qw8o!cF2TfTKyO#4)MPVMKWSu30`YSmmczWt)}-GR+FF1BbzZM!Hn zb^FD-em)_+z_QQ0OqzMK5?4ij`4G!$IsM4%V&}NjqM1?suR=>)wqIBkeqr0pJB{Uq z8=B5(ZTVfo8g+9?+kwHGOVXxGpDt@7Xc&kyFAig4qEpfVQ<%5(B{jTNTx*xcYUjXhx8$kXZ+Dvs{VzXqey;bj`ZFh{%DmG> zByo>lzvS0=8_!A~xxgKl4$CwOsxGK$oVMbS^UVVv0~{iygge-tHUu5K*gE0g*XI4s zvv*%{pCRz0N5SrSVeQGAxnW#YBPujEF=!d9$(ffPF=WVO=($4Get8ceTx>=~8?7fUwuS+dJLleIa-+g7yuvT@=3g*V@o zZsY&y{?65gZ%^Z-M423eHCz6>a(Ct_8cu9H?taH!V4g_h3HP}DyBFqbE9_5>&^=K7 zKXj&U%4MUg%M)c*rSnWZ`($szj2k|WLOw>k{j9P0*1Ko>BvwucXj}Q#Kumx0;)N4- z*GL5J4%~9TV*l>thcaTfdn8Usxg;LF@Y(f0PclS0|8U+dsk}4sk@Jk#(?nuA>!v6E zn*L(-!-XHN%3nBNeWFU`k%O$k84=yH8)8`a?T&Um5BD}aBf4=*ZCiEb3fXrBOIv!% zC$H7%`lWP2NpJU0k1i8aF0;S-D=(QZ{1)WDIWdbTsWUEyli{#USi$s9xvRXUoc?lg z@!}mGCzw**D$m%qem%;g6Szj|gXOC)TKSh|EYq7+_-f}<<179D9~IqM7_sp4jG0-n zetQ*sq%(K(mN7jyo^?Nyi83y!MxM+RUf& zpmdYG_>ICFMh1pDW_;-eRApnSl3ar;^GXscTq}}O3raHc^B_qmcfwh(!ww>?=eKO_ zG~9Me?Q42yVQ_tOw5Yh3>yjM?N;~FkyKE7pp6H=sH*L0YdmYBH4-l>*^6sWR+TQjlCvXX+eXIO2VcJVGVcfX_hT`v z^W?KvHVL==^}DFs^!#Loipj%wHh<mFl3**-v)rf02FPe=_rK z+23%{&s%2mxrm$&kWKUCnI^ARrJ$GUb~Vi>Iz#r=V>8yz8bVnoF8ulbUB5Btx&NsR zvab$27L>Q)^6z$7GBI4D;b70g>`+?n`CLfK9u(TM4rrN+Gcqu&W5gHQ>Ns+#OKMVSx^sSRL1s=W zwBqlbmYXv7i-ApwO=H+j-pB$`(w7qWPE7|zP*Ip*?Lfm8m^gY@3}GoF8Yxs5&JimCN? zoBhS_EWgjIo;N*zU40#=)|%s*eGKjs7Ef0`bMd&~!xzsdSUi$(mf`GEaqmjDcb}C! zL;3K;rxFh&k*R)UOL>dLVL9b{t|vMsAF2xaG51Iwo52RJHlggP>G2gRZ#vqA1KkZK z_o*(LEfI2U)m$F2)vFg=P0H0i;m!SV*_#6mQ`A<^S|d`@8d}z=DqFWH-Rkm2o|~;N z{Z=P!Tc1B)O z`O?CI_&Fu+_BxO_T~z0%PCz)mzMOd5L~M|(OR%Qq z#q$Y0JZ+a3E~#lK@%npn;S~G1Ju!b!hD{=;YT~BWCW|3t7W)ydxxt};(R#m%-WL1 z=_;24-7Q4>c)a>dbe}n#5?mlOUGz}#*W`%U6E)7gk|vrPv#r|iNGw-f85Fte+036$ zc1(f-Nyf-z(1^2HTgg&%d4eZ6lnSat9S?c*|SsjOgoy-RPwE8!fAeqQ4hZ;W#H zFwEYW!^K~6ZX%nb*VH45C*FEJ5=&V*=?llE2+wO=Nnw+u9C^Gh>3VFOWTSXONVSkF zDP&TXOhixbB-2+J=Lp1y(m{$lRy8PDdw zNQpBC}S_XxMk9+J^vFBihargwQ&ZOv>u9vM_cU@Ep-MO+_CUbVA?wl*7QK575gk*QV zSnRrHTc7@lD(>wsjwfykjn?Q^7C$x1Tdz6Oq(k(@5iXrybKLEIujq>`5qo>&P2}uK z(b(y;=R7XBab{J`CC@20Ry`L!xl#94;M+Gh-pHF33&!3&lfxx_`o!~lov-V4=Nxfd zqg2_IW$G6?XTi3L`R^X^KR70tb2u`q+xQBf{6gvH7n{$ouw0gTk4I=n2hY9(iZRP} z|KX}#UE?XQ9R5LWpIW8h{YTb+I^;ia*BuJ|({ul$_P=F?V*3qw*KJIilXQB;UIn{? zPqGgdsyA1d-8ky!l`UPwEPL%)Oy>)qcc;TWyjwNTn;-GrTOjf!m0h@RVqML??NXZS zHcWf=zB6c->av3GscSN~*R!sTyq_1(k#bH~$uD`*sg3g5hCb7lcZxn-SDjUP-TvMCYo5)iK5zN`PVqb2=Xa_<|4BdYKWVPlPc_&5 zTZHWzjOT0on!0GZ$lf(CL|xZwRry|g-E}YE%d$oB+Ev~c?`!{Jcg@%S)w`%Z-tG3HqWV+V8l{KrW=jbHIY>F8&X^Wilc zllDJq?Go3FTT{{bXld8tuH>%m+V>tluwq|dSg^NQT4v9+gS~wFE*oC1Jm;CGw|a+F4};C!A^i(6FVi>yF_|Iq`?WN`IDYsZ;5h z%;d-UW8;jE+nMGGef8)5(bN1zu@E6l4D01CuTqI)O$A}QBiWEW7PGJJN4eB+&vm=bNuMtMXEZ&t}VL*9bz1u z*1S)g-Tiw;%$~?8d5L8o!yd-zE9XtvXwG%RP2NyY*m@?{+;g)WY;G((?i|~;FCzVu zmG|cQ3EwPU_eR((V?P`_(N8(=%oW3gDeGQO>vO19xFXyA`)j7p&&*Zv>({Jq4s8A# zx;1^{Y_01CPZ#dD5-{Dh@WR|o_QRcdE0Q<8oILZ*E|a&*rt0n06?o<2();Mfmzh4Z z?ujyMT}YOF=#swrp3=UAj!Tb|KJfG;l;lpnSm1Z7#Kk!%|hj>&}LOmQs7?@kvadcHwa%kMwl4^7hAvBWzgrul$i1`R3^5@EIGpW_2wO z&*#YDno`QP>-OnuM;0%9_pMc}crE93Ls8N7C$x+erT=bniJmRU8qQq4mLs&b^TLUw zZgH;Zy4CLfW>iNi2yv82qy{dQjSdV8-)SY4*MI0% zV({|gJm#9d?Vgu6U7Wr7?a3ycN<G#b$NSKAUyfz}8y-?ZmAYU++tqTGTaL+hx^` z9hRq8rI)7q6pC$np)tqKCidCyO|`rBt*LP>b&h?i5_?|j!S6*AC>*^Yp3Lr&lk1b@f`O&N*hSHGHMgtA%29-L}|WxYU{1y(#Thz^<8IlDpJj+okeL zFVl>a^zNPJQe9Q5PiPyf+YfCT9sbTHBg*&<4B~8=PF9p2X;1#!eZd`@( zUbjtL!snjx-WHiXhjXz(aW>PcuMXv1p=V0s+N9nad~qpXwk?gVf5qx4$(hS^1b9{% z-*VP?ALwJ1=4&9;bwoE%CTtV;vyTsBg#BEa+eGYi*7jUWc6L!WJe%FYdW&~|-pgy< zv%Q^Pe@!c%c+KB^yN*yt`IMuFQ;QC4aXf#fBERNu$&$#&6Ic#1Dx?SAl7B7plJm%} z<2iXTtiXOP0B&0U$?6!i4fNBM)mv1JA`72b!%Bz^Z zR1jyH*m3bLSFO`#w<3YF3!WAV#49A6e8ykqljgUv>M|?#Z z(|nb9zGpVDxw~e%LOW|T7 zPkv0FB78?^Q=w{!fZs!w1V5KBp=^nb*Cap2%JZ_Q>iK%9_oVwI_e*V7WZl6u)n*pQ zvR4}p9oyp7xg7%@7fs6$a5!U$%?2mXIP@wND3ce zl6c*tc>Ux`ICxL+IPjdDeokt&#H@qT-6dWn)`fdq9&bDru*bQhQ>^gf#8tBb zM9pi%J{DBXHcdG5@P>+dP_Fcv7rKd3x4ZczwN@ zp`C4k3`6BRh6TYachCEBG>zURu$1&gGxWlqX?sOS% zfxrz0KE`~8cWiwO$8Y*_KCpYBd%&D2pZOl=9_|YM4{Hx>XTHx^qyA=ZxBKPh56=|L zz6Jhh;!SeTYW~;3JL!MdpJ)HCu}z(GW@rDWTGd-~RBHFmUp8gVl{5Qf|K9$Uc}2Kn za=PQBym#uM#>$?%`4qY2mtKG2yUIKFO?nAu!u|h?d+#>g=PjAB?IP!c$y=K1oOZup zeK7yB+>d>%_wKvxU$*y)*&nr^%bP`6N({poCH>;olsivOKgO_iy2?sz&vNz5^?xdY*gv zzQm8Gb^k4mKeB$qkLk67`!7Ax|7#QP^GQc)0pEVM##JhJAD%bN)DAMq_nVaW<@t^0 zPrps(*Uo#jTjp0+(d3f3>5AX(%?_SotuD)K{{GCr)b+J)p?qpzn0yf z7`7>I+lfI8%p4#;mW; zzus1_y7B(ia$i`N`8PM`AXvR`9&vX4F6L+K;t$w_C;j9}=lw z{h|BPpM7<+p6PE;(L151xFmMw&EQR1s<)q7>L>5nu8=zY^z)q&A)gIdm|M1;*Ou9` zZ$*Lp-fX>E?UuI{z<2Bjt5X*D#oMhZKHg{iJbCVCdY{QV`Z@ldtpn>{lUwg?9CpS%*Zj}1u${lpBi)H_ z%L2ETZj-ER=lQrTxyiRd^;+s#x9G-wk++nMC$(#|```YQQ#6P3-2&|#|Lmo=bXFM` z%Elgiz4h&_cO^5QwP!LvFu8QYU3q8Au}?g+&Mq~XpYF7c=lDaNTOHl0{CbniKg9ep zi+ADwVDroF{Bjlj1;I6jwuiZ2);_TRAY^rT`i9B+Pd#G}s_vQcyhv4V*69jc{p0Jq z)<2cXdm5GZT>FE<%EuDxpPs#Q!g}Y-?@o^t_s!yOs^@rrJz3__@(Skt9jo7Y?>JW1 zqy09s?}7N%r-etJJ@Vbg^lo$S}r_|qs)?A7^zx>VKKT~SW?UU{KZWT|coEN|4|0MYh`_Jg#y#FNp z?fZ|?-~4}u_Wsa4don*exN-T%>L|_km(xD}z9sX|VfCZ?SzBLR|JWX7TfZdtN&i;g z7vBq~ZkszjyZl4u+q?(WKZ0`)xZSd@vFkTHZ-4Bk`=|f^uk;2S?hRmmZr5@+PqSDx ztame0u=mtl%ej|T3x8b9z4|FsAxCI>gE&IRxj8$E3bhr6_dBM`(a_d;X zKhC=Bul=A@nG6p@nz@yFcgA%S|rK9~9L*VlvKa?`R5i)Z;W-mLSB*8oXnf zLMJy@+%a#iWv$<=+(h;?t>%h5zM+Y=Jtky>hRmMEbe5fK5;&EG_FRnca?+5R9eF)3 zyK_?76JhRcp(dXm^FE!#Vmd45s$b~!YbD)g`!ckql}O08p6vUia>bjkI@l@Rq;$*8 zlPfkyn+R(zj@i2M!q(`=k1{N7RXM!*yPvhm@96tFeUpK{?^metZo4IJ= z`Oy5-lI+0KQ&#ZFOEyfDk55cExF#y{Z&l!&ehc+UtYGt2ZK|N-8}x2JHT>|@q)kLsh3*-zY*eIj>J`pNMX`@nV%_BZdUq=*%k+0u;}yJMvU65Z&Ftdl)#WQI`C}{Q@7y@kv-NT1F43Ly7N37t z{lPY*^|O={|Bk-Z`$EIdT)nuxWSYgSFKiprj@ z^t)VKd930w?XRw9e9n72{qdU<_k4fU=%&gZ7dT#@IyWigfu7X|MpOBsx+B~_XNb)= z__tiAJ$_R3J=r4ppEH8xlvfGQmRKUPMzKb>NM5#3K0jGlaiZ&!%~E~(_rJd5y>tI} zuInUNUX=Cw|`_vm#^nES;_ZQbKXR*LJw9_D^N&|g;g)8>V1JA3VmFArqSRV?TT-(SId z;J8BTpItFrWvwLcAqhcDVh81k=8AfO?ba)?{qpR zu_))`qdCVe$molmYKt;hcBQ7ZWLnCHzGqywdQSyKT~@zZGH=bjjUP|$R^E7JYs8;l zE=d+gFBnafxZWKZ8!IKSR5E5|lI!`5!`1_IWvV)O_e=a zzj_@z5tzzW{>~wF!vFV=CunXBGTWl6HSapt$@;{#uC~&F-dSmm-7liTqV-(Wgn0ff zKEr#hWs?pEV*2zvn5R0>O!lZ0gLD62`xAHkGN|arPe#YH!jsa`lGPx z9Yf~cE%g(Zdp@kG7w_|b6n-#sSM0J{DZV>Kg8SH-gq{8bZ&Khp%FMZV5kWH)Jfo0i>U*=-*i z|CFu?YL)x^{KY?3P>xtzI_>;nCI$v!7P6|<%)E45)oRdbze5fpw$6>WqC^8fFxq`& zl*o9n&so#$fB&VVG3K#M(3%E+LNVcTO8J)WPgzaISa-2~J>~}xKc{=3}KYq2epecUkI?0o-4wW}cIj>WUogH7iTrEd4rm#Bq`_?3l zFPs1E6sx_stVE(GZS}1;0UJDv6Tf6^nUuxFkhEp~5tfG{bGuB|bGUB)(G^knmX+DR zBx#14jGF8Qe>rvo4I|Tw0ow&$^*l0WGs-<8zc010%b~S^Z{>tIj+cuikLEk?Z(es- zS?cZ7xx$zFKlzJ4-q>DuYvFR|UrMnNulMvUO22JT{nNcAvP(2*#h^pTc)4f!R5$f{uusfW3RJRnsp@>AuxU0kbHRc0G9RWf-zz-uoA1Y+gDuUz zB^!#^voGG@>NU++6PWBP6}@s}s8sf~h}p-Qq;9X-Sk{|+G2#U0=7&M*XB3V4PwaF_ zJD579{fKu8W6kUnPhHlXaQGxEv~SXba?f|wF8lnSXsL%Bx;oQ9ew|wA^$Bq+r6QJhck$m)0&TqdWgh@R)NVSLKtk z*ImCSd|7`Cp5FC*qNh|Yyt6%O_w=Cefv@U<{xd9fU>JzH$IC0oTPVun((o4xM zbv{oFmHLH$a(4ci5>?%FVsgs;$teeepPXBMQqX_*gWQT~CpeYX3;r~oXdWZc6Tjm| zO2yHm%NB6V<~lD}*?8i8Y>w2Q>D|8V;juYvdtN3PKQtEqEMVDwLMQBD(&o+(p*j5f z%QhBwh8%t$bB23=$wt?lN!_}~%5Dn%nA&~yK)2quDM6<@t_Vf?9r0%^ow7=OlT_dC z8Pw;K3RG%38L0x<|!#wp*le*uw#qYQw_rsFeY$Bt+=GsJqMN77nWhYc8 z6uB>0U0al_BlIe3{^10kw07mUlbP=}Uei5za$-Vtf&2F-Z1J@!cjP!r&Ka&+pQPZm zXKCEzg`1dCmS?VhcXN-W#LQ%_x$bL@tqF1tElGLFqv0_;c2=Ta~YfcAY)GVRp7^(JJQLqjw)>WVjb*yDLZ? z<@7KjD5VJTmMZx-5XMR*XzHN z^41M$g}%aOFK$2B-lds2HTaU+g^2j4UnRG$nR0piV$&P4+=;g{c>Q|s%v$%hu`eLH zaK~=Zw_3+Um6n@b5&iPLB#+B&7Sn923)}XT+_n3y%`4Wt=)eAl>EWi8({nzAnf}W9 z!(IE;PNi;({qZyL`!;P`xoq39{$sn($kfLk{A#~}?Sh>?|DJVr$~%5> z^B+RzboyGmm2G2_3kzPoG7tF~eZe+uQJ&znMJd6uRhK$fzS4TXiS52p@RnVC(x(=< zI8VL5`^cJSYu9FfnfcVNXxBs!j$cxHL%-SuzkIZ7nbqb~pH@xFn!oaX{Pis?zGkYg zHtbGYwXZBy*^PDSE2-?T>g?50g8a^R9;}XinY-$fd8Aj-+sd@9OV%7)wu&uy`An%a zjXMb$J}x0%aepVRnzHBBEv^5Xrr50CzjC3O>UpkhOZFV)4gKmJ^l93)aMJ}baY1r7 zr$_DFw(jQitdd&iUi;8>bxZHho|Vp88FcT|uc}MauYAZl{pz8F;zB*1tLq%x3k`%g z-L<+e7W3}o>MCcODY1O(3L#sUzkUl`O?i8LOaDdnD5WRwP`@MczWr7u`}_PXF3p0c9>)e9CY--(j%V97LE)%fmRLb$YA zRH0C4;?8SQ@7|b+SVtYcYn{C-DKW-2Ag$}NWW*(+l?Y+w@O$y4bq#n?TmI zg)0&dbp(`X^11j*|I*%KDbjOAn)mg}o6{Wo0=Ae*IM3Ztp)#pd&^z5t;}!q6M^dsX z){A;~$gyVbJd~;`l6z06i*@moR!74v*Ld~PR}^SmH!?Rbt@b!&G~M$~!XQz~6eZpa#33;hzP&Z|{*_JN50IltQmvk&xpS6!KK z^Pzc}Ec>!G7t2c${gm6ZxZ2J0``D8IJ>Uy@Y~(n1qx_A8Xoa@mq&wjeUkV>w(*4Q9 zbvd>Atj6&u*8fS1J#H5@uP;mw*V&L<5PaD9$jhK*_b*4he6x*p|E=E5>Mf3|c=HZq znMia@=-<5PWU+>E)_je~i&H8Ex1R0(crhTo+3Z#Ns~R`5J(dh#uDA#cBH z%#=0rd$&C->^Oew1Iv;0n;%?`JkE)5wz1o3|0YLT&(-E&+i3yu+aD^9BR2XB%K?f@azMtZPUfpyALYT&3EuW?O4C{M_Bjw zh?-?bw@2Se{utLiKe=$vMd_MtN6RB>rXBnonfd8Y>N}O+?#Vp=Mduxz^WETiPSvGD z@ow{;E8eKE|M6bc_k+F1Tn(N#h6M@il6%)ggdS`B$j3Ho_Q%B=Y?d||Nrf!Eu%dve za8XlIh{j>A(?QWclvlh_sp*PHsM{L&)pYeMpEX|o`MZ7xT5Nx+p`&Nbw7Sn}?d}g8 zZzO`I_&U9*J&`DXfa6-)qC4)13#Di8Q&@V} zCWlo-wB=C)k1F#f!@2JIKGT{?!@4Km*}3!h9R5SDV)3V+A4_cc&A4NQ!%F9EVv+L6 ztUGtIv)_{qvX?q6|HG!>!_Nt)S35k9(|E$2D6{NzrK*7$dtbD#sN(X#i7WJqDgs)) zW}Y$=nah1XdJ*@Wbxl}b3c*nmI%+M=g5buwM2x|Yc{=7({W@3UZv{jIQgj!Hlk^_BZs`hUrs39V;slJi>o)0Wj& zfxWj%ByFn=S8>#*G?`YZIhnog52D=@Pd+{w`@ooO`8S<_7p7NVojH2VYU7>vy4MUKO-;{IRhb4R-=j2IEy6GSKYf7V?SwO|%1DX?!L|%12 z2#RmY`6{XrRL`D#ML1yDKSr??>I=CppT2Va;{N9c<#i?>yAd{9S-@|mXx2W(KknWY zO{S`w3+H~`Hbu5|X+~7Jmu%&k6~(949F{vI#rNc>$+hE(hv%CA<=C?8v|LNvsY-^b zzQZ>xo?Mz$`p@oF?fgThxLj`^76?hWf8cgoy;4%XeTEI6)0yq7Lc1(v9?L~;;XgJ_ zRBBx%hu%r?8n#V;r)_XQmN+HU%hmbkt~>0zxi;$dYuQA}ybAR9luYGWd1!!&&?f=8Ucf$X{gg@+mczzmxGOlp0RK9gXvKALEL{FGV0&QV>SCs!4onm(9f-yl<| z+cV+1qg~&_j4wYdDs88nkWQGiM{wC`<_!+_c)FkJ2B_yZmwqbCm|E@-aE~|osqKx` zr5`rkTzw{bWB6f48GEfy9G6e|PL*VpOTSZCS=aV%&cnb`b=4=wB*SyRczAX78r#fT zch50<*_5&Pejoa0 z)rK1VBKcQqmbps(OnXw-eLeZTyJCFv=Pj&1qjH{WK6yQ{ed7CLf6nhzzr6PJ9?xA0 z^;I%20z%7Wt{ML}inQ-3dF@xaSZ{66LK%sQK+8Gn4!vwr|0jEJ;lZ-RU)j5sb?>@z zOLdo;*(JLYj^lGKiD>U?`#rPhzzM~hu~%F+Z8QBpZ`)V1Tx;Ll41d;NCj&ws7QUPr zVeeeNa6!n0&|TU4t6KYR=FZcJDlA=?&g&N>WH^0MtwDeFrpFZtMk&9JJeZZ3lJe@N zw6Nswm0|H_mp6Z1)6A@Ypeo#=f6&x|7XUnY1M{%N@MT1cy|fp zx+iAuuL-rxiMV!}*ZKF;&CANTWu@16l=ev3FOu5T7I-EsSmCjIVR*94ZiW{b7cxGk zb?0w7bz4VfYlVJc?2f|kHwqYJcKSt~?tOML|AzG8yPVnIW(wWx)X{P;w`Wnj+p4m0 z!mFrv%Upgn{E**V-mJAG)%wqY8^u1e!=ufnWo=|ngjQ}pY!^w`MUL==2DqxmT~^!yfv4d`pvB7FiJc(W;<-! z{W7vjtyOOSg%!qTJN*_pZTfQ3B7S1ooGFFJ9*Shd8$Z%*xc@ZF=WctvcHR1j$6Mv? zql`1J-|YHSqItK?swnfjqfh&lyeDzlG4qeDXaAUzT~q#OJM+h>Cm-KApXVpJNB8fW zQ&%3oOWz&5Y1`M$0k2kk-yEtL*?4Ep-!)pMmn{PO!zUQG|tEkEV>S!?Qn&HM+GtofEq$+w%rAtxNZ zbc(*!6btr+rhg4gkDmBeCoy-@)}8W3hT8dDe!N|E(`HLKd}~!Q{;ANx-JUIPk@nV3`JD7N z?TJ=!t|)r6!Ycf{oyCV>+vWC#wu(JoPkQd$-I4pn@?uX|vbardzRw(~6MDAAi`h@w zoiO4PjVOO$`9{KgyQOJr? ztKg&9iO1Or^Vhd>*2wxilYXFikL!4)^`1k{AGF>#_*bacoJ!Vd&QI5?vy(ntzG>qh zC$rx8BWa)Pwzb5cnfB@Q4XrxM+Xwa^-u3hQ4c0$e-+1eEcQ?IHzWzb_M(G~~>m&Jz z<)5N&CjT+}#pxZB(5$nso@{^Q-gExV{yz;}KO7gCYQHe$<9u!9ANo@| z|5z@aV!z(!vA)*kANf;D|A?kCFLR!8{a}2s(x1|&)qkcGi7v~3lCQbt+}%_50q>s4 zYxaNMuWkQyzNSA{fFIYoJ*pv3ofm4#b58%XQR3Wr(VsPYEhfJgWv$t-@rd13a(}eX zqwifS|HK*wr*ss%ESsV3b%g1mnB7K+|5-c}w{-13YW6YtqNbeq^KNxl7aQfOBb*nt{kpi1#2=CSIB!S5t|P8S(QhU$ zKEk@mp(eObbowc;kGYoOm%ERYr}pk}GwaSy?S3&`zf1b5bkhDm-4-hLqV`kfcUxca zDO^5F^Oj~lE)ZC3e-+Xsqws$Wrkv_ndGf7tf!=~wbQr(ZpNg!3y~VbEUB zIYIA5^H+TDF2ACFboZ<1N5WroKQ4VH^8d=6B!}p(J$xUzIB#jK%vinDncH*uHs5C% zyPq25u9sQ)^(52V*_%9e`^;M!tA0HD?F z+EwOMwZ;6YvZX&1!DiNJC$IKd7A-!kZ*CcO;%uMkrn?(G+hm@f=5r5uSMX+%wQTj1xZ_(tz3zKm z+5LFIo+EhR=d3U>$|}0 zz12SKpQl%RUy!=_Ol-&ZSr$_S@;jXkKYsqeH1pS@;0SScyDQt+Hx=mdF|*6_J^tyT z@ig7R(q4GkC#D$(-4Ey3u|4~=`M~Mphm-6W|I{e0d0?55{=Gi$x!mbzrbl zw&_pT*)nO*I^ET==;|YfXL_ zmCE%+oBP3nAlAaAQhCQev5U(8(q&WEwV%V{d49=;@)xq)Q_HJdWYQ$l)B9Dn$*rH0 zb&*jbGA?Y1_r{MLUoP&R)@AL#ZDMNLi&uY?V(;`!SK4HC$Nq!G$NZ2}H6kxe?j1G= zoL<2eeEM@}6IA!PQ6NxY8C8xRdE##F=)$)?MlXXCNS(RbRiu+8{t2CdioZh@H zj#K!``@`W>dz0cmTiq_?cv?i{g~d$+6NstuF=vw{Y` ztE_#6H;OSZWa=Ofe0QPku2;e_@Qu2OY_26|Mab2w&+k;HKT9=gOiZ{j>A(h#lPrgn zdU80uc?38)Ra;_DrlfhWO`2&i(?P&x%ayJFwmx9fW7&92)zy_lLoeiZ)X}aRS@plO zbJs>^XRj^YK55?PXJ^lFyX^b_`bqWkJH_vI{=WI{EcbHxdM=foqeYxwk{fth-Yk-D zzU*_0v!wRSgJ`xhuU}nyAjr#?^>5s{5`Pm=R zdGB3(P|Is~;eo!?pV;PplOOGD^4T9++2XT4Ol6DD{?NXJz+vW#F)@Rz@md)S{FE~1tXW#jRcG}WfJV={&TKCSIFt+U< zdCH7$9Dedvr-=P~k^1Cv!yBhFf z(SoVjxdpcxC3)WP7)hoa+|Bofb$?kxe#NOqzltl3wL4n7EB|IH$S@q2wV0sIW|(jA z=T4*L2XppkMYk0{s5Ga`T8Qi`UC_=h#nx|KpmSZ!NaFZk-zOK(r5kYeSr!=CJamx1 zel8(^<-Fwv3A>U9IX{*%KmRa6^+OM{_rr9)Io{q!D{X$%SUfslWYII>?MnWwznT|1 z?6`RU0cYFmLm$)n>vL^HKCf{*aFN4Ef4@t6D#zbXpH5%@Y5wcD=?~@7$EzM~ELf7a zD{iNV!%h-e(v086c|74#p*Y6YG3C5 zdOr25g6Ujq?~*LlHQ%kY&Z~q)?$#6O@IP-qyY<0a#|>-Pr``KIMXu%l{Kq>!pPOg? z{`ib}Kkn}p6s{8KKlbX_&)I((e_hxSu|n_4Et9;$my05{=snB-vuETaRIT1p+ zIb7x!GCG5!LX#5y{@5bf*jAt-qrYtLyhM>-XFjsqZvA)QS44-JWEYDQN9|1U72l8l zVGP^g(7b=AO_w(cPHe@zoGMQx!Y;)g68_-scHDNW zqW_Ym3lGNMb|_kM|EBYpjjrIVnq-Sd{q0RBO?h;3`F_lHnit}` zd3oghV3z94Y=tW#{FiwuR$NoFs>*h^!k=|w}Vs3s> zcdDP^(Hk%FIoLCw_HJD$@s@vX*J2$Z&ZAxxO^WxP8On^waZ3^GxUYCzUQ0WtJSMZ)Mw~^EI7R5=f7vaEKUpE z-)V5?&WrxZ`<8y&tiN&A%BkyE6>FKD(hFz*SrX3CJo(NNxg(1`pDz5oX2qTjCBCjt zAGK~i?a40`Qd;@*jpfs&o>iWzbH7~*TJ?Tz*cYdH+D*BIFCVp>y19Ch?nZ}gyHnNc2@7Iy;Z^@#mBFq3%vAn@#;|8dfT~eC}KKwME%i zw`2{ouc_5(VQ$l3hu1j1d*xBJ-e>O9kn-Tu#=Smkv=SY%CO*y2=wN%Mvdq_1te!cu zw{P~V%%frT!NDHe&FgiZ-IwVw%T=@fbbPT+u($fId1b0gCzdS^Ii*`AeI(`+<5`o# zC0`E}sQ8AM1v6z`ZJz-r&t`hg8(mgiZm8aFD%oor5 z5^B!0ij&>*dG14x1q)l}daKR#wz(#hAiVr7uXI}2sjy>3XT{ar-pn@Zob;q6^Zccl z#jf*B+I_e6Ep1y?$!R@Xx_6?~k{IsX2Qwcom0o?S!0m5!pW@wAbMxcQy(fQ`Z4a{& zeP;GDecHjJ&yM^&$rg4fj^*^3-HEDhv2)BWToSl@BXRPDEt%f7IaZQjDijUW6Ear{5MUG)(2Lt$avj(^iTr@8EBT)!+s`r`W8 z8P*s7r!O+@__w$7T7rU~!PoSq*+J9n_FflbEo(kA2bMD}I7&XJ&Ap41DJM zbf3vF?+c!$`xl$m&CjY>d-GFZL|gx%pkJ$AL_5WQHPnbIWbu-3z11A>TB?>uZGAzW z6;rXb;=UfsN~`1fkDk1q6D53nbup8gU*kE>Sr*A9esepG{hpi5uy|bRH@VZ;@i~ui zq1vlCX~NHI=3Y*EB{^*OQCT0hqpu_tZ2 zyl?&Mw_h$S_DF5iYYhw9uM@PlZppNpOR5gP6tkH1uHKmQ{PX3k`)n_%WLPOpzcS+r z&-xEm>8JfV&P;H9yW>tZ2h*yygdce~yjEBqe9 ze&T~xe!%pT_iYo4#KisKv~X@{OotbKLTYUZ7JwadQ;KR0`| zuJ6Rwo2%5)(@V?TUrDTQepq6V->7zvZTAm`O-I@dBL2vJI&$2=wT9{Fqxb+NyH>7` zmTN@foqB(m{|ShC;Fj4OYs5XbNaNe&!-X4UI(J^`KAg(eSRt_MmPPDlqGleQT7`e-i6I`+I5Q<dOJMoR^p^IsC)# z*Ae#ldkdaV+q*JUD(J6|dzHwm?+$I(O($&oA>pH*UzS*D&7=1slU-cz_dB~?acY+> zI8Jj}C7urK2;J6PJM+3}N0o1`1;4SvL64X3QgbiF%e%?9>U8g#FtvY9wQKUXqVT`} zXYXs>`TqT_b|#~P)BcwUuev;Y!i|ZC7GxR=eQhoO6j1BK{i1T=^q1VSPDT9}JmXo- z53V&}U4Oi`g5SsR%NGV|Dc2_tMYg&>&sul(?i9m^ChoQVh;zTfR%=*DBo$@wv@8rItM5w-w`KIg_u18U)5N2Vdn+WV?EO zrS!tUw=H6&+%c>2nzgUY%RBvU@|WM!8lQZXW%!i%`A^tP9*ei#KfQmwFMj&H%U>r|>RmKG7I9hEt)o!d;Y5OTsgk|#bayn-nT7NOPFNizS*vOqiitWMLU*{DaCn@NjRVL zb1hq)U2j}1k4_3XoWAh$_2zlLzqTYBWV5C+i~DZg{y07Ti1wa46=&tWpJuwj&Htx-tTXpQ>Nx=E&dU6=GOVZ`U!sp zOx~`Uw(m^Yhl-h5CFx@Cmee?^OYtPRtL-u_y;&QZzvMDY4A<2^_DTg@++Tzxr%0s) zWnGXC;}Bl`E5x0TR2fE@bbMSC=p!m<=7vTC4&J1h9ofecr_X=M0#f%6kh}d)m#u{cKN*692-9yOJzD zH)fP<%{8~!qc?rt+EZJ?s?J1NZswiyQg7+`N88>UGZzvT4!-o+DLP4Shqa;p+-H@Q zOZyKyTmIZzCgCD3ynUH8_gR;pId3myv;W^cVN*|S?E780)d$>NcP;v0)BaNOL{L&e zv)8Ls!`Q4zDi1|hwdL)!%i4Qn?ZsEktF_)QGMKse_rcp5l?yk{S$<^p%DF2Dx z#~u5rcFHH_GZX5M{`-_~;qgzlxI<3Y{-EKf;5jPx%d5{$kI>qG$mpl3-o*PC<}Txw zo_b)$q#KKJcEqMW;(L1Fb*R`qpD($mI?J`ix2@jyW5TO;_Nxpw>)0OahnU&gglitzLUphjsH`k^1N# zs%#g^_;D?lSHRax>#og|5lXVJxOXDDf3kB@bM7ZG88zwUN9zA3a(qs9aj2j8;nLD- z=KV4g*GDPpPUYS^<^Gi=>jbJ5mn+PjwyAU8^5-_n!jeaJsq2WoDR~m{P3?8xp+(6C z)kkkAZ+P%9WKtB*-pr)=&91eKk*~Z9R<2KI_$5_z#r#3wa>esa0U3b?SCd+Iit(P( zEsMx`$*Qfhcj385Z=PlRKAgPLU99_`ozVeru5!-vjkVXTY$vQgz0Plc*_TUScQhZ7 zZ~9kYzmfgIG8LMQP6OP3ef(yV(tXnx9_yI&*EMRI@bv*pP?UlGz6 zJH_EHliv;A+J|Kl4iyq_T0bw~J=b1aqP%P35%xoikNy48ePnUh3ZvckucoVB|F!MA z_cAuI!xxuN-Y$8QbFpY`!+opL=A&VUgn4W(9(XQYF{x2q`bPQ#ZXTPX2ZDKhtoik& zIv;u}8`@;5wDn~7{#xL;ercI*i*n22&f`KolAX%ek9X!NoH1H2(W&yea!q)Qq^#ar z<=Z!%BxPB-Q#B_|`Ic+s?)fzA+{fPu3=3EOJ~%TwyL7eG^B)Q)r|!BMxFclxg6KmD zPTAj`<6{rKv%$`(v>aKRo%qeHmFCV?>@uGT1-Hqb1j&;_%^-kZt z`S8q(f?L*eB4z#DkMGQTb@SZE+zp)x8#Hvq-so+UURAVat?ixF$Jw)e)^eTCnfm+g z+M=?u9dBfpr7xQMhp#QXS$KVGT?I4GVflj@cUXl#sLkj!U(8&doWDzCa`R!u9}HD5 zf^3-hA5_$^bbk~$r@n_lezEtr$0ZBvgrqsmA8xK-K6$tQd?Ne21MMGFZ90~}(E1x~ z)0O}D{m0lE?)!)HKQKQ$wm;z755?35`A)7sE;ao7U!+}Xp0ra~PNn$4^plEHnhQ_u zY23Wb>GU>RgM&E=mAM8wwQj3Uygrj$)Vz;h`bXBe%88$E=T3d|cG_>9og!~FOP4p> zpPzkN^QT*1^vhsB56RH`6IbQmz5TW5T%JMdr@KYV{^VH(TT8zQ_!~Ck{6~XBku8Ti zHkD|fDUHrldARv$QCrA@^xRu2&##&7`n}7P>*uv2E*;q`ALjTK-_ELG`Bt(wZP(v; zPPtph$^>571-z=;u$ukFvHOnO|IT+>XvMJk%3*_eTdt|E1auZ=>L~9CvgND$D#CKL zuw%u1$L=b&Z9=uHtN8N5&pR)-Vm!`izuNE6=T{!OCDG~fF>`fZ_Al@}6r{YmbbWs6^7As;277Irzn*?G|HR>a&Vnyucd_kful!(F z>3q&b?Xd8%34xOyD;OA?rmW*z^QPwdQ?{GejpxpA$;)EfdAHray-D$x^F?8k50_0k zAB!;6x&6Fs{G@FD(u5xpol^y-O8ilhn#C^fC#Y_{J*}?1Fuk}CXEUC3}Ri4{Y_d%<-uxZuvL)^zWc@{_U^-CU4IM>yr98mU*vF7&M7tfaV ze5gn=F9`e|&NXLI`=ulO-)G2QH+Ozi_*cxsX5IZnl^*uqmWhQ670oX%_*wY(_=Jil z7F?ajOY16j9GP%C>BPs!zwX-FO!oe3xJ)>#bi>_iB^9xUZ(guS*j4oPN=gf#?XlIt zg8O?V_?1hSwNI3JJbRIK_vI%#b5`$m4Xu?iZoc!{@2>9Ccj>>+UAmtrEN<|;BPMpv zd!Cd3G}!%0?{ePve*IK+ig-f|oAr~d9nR|-Yd4AAO6922di_vvr(E9&4jawKAJ*LQ z`S~{NheKX_|5MQwPxv*K@9nzt*wi8@uATK$l}-G+Bbr6x=O&pacJ7fCKVj|jTs^9SjitFBhJ9!t%Yx_U5mh2yGoF2P-0$sDrC`lZSZY> znN*SgyvFT&4PtV*-)`D{XV)X6wY#ToyTNqSWr^-Ik;7q=FJ(zg6J#q-KN**$D7E(B zmaSJMe0z?paFttS=GNKNoB1p2k^BYq`8D5ey1%wGeyo&rBW3@6%jdu6o}N>@FaF=3 zmv$jGeT@u!tRGw$Y8h=L+nSacWPR|EkSaU5(fY`7xrwt}vnD35U-8?e>%_%Xi@5{m zHkZEeP+X_nTPC~LV#Q;FTO~4rFExa$`Z}v(mekoSbMXDPXFGRCB zKAt*VS6B6@CWlXtPeJ1wnR6mqN7s~In&z?a%%b3Vn@^R6Ii6)bCu`L0T5K2{5%J_! z+L}3`X<-M-Htp=1a{bGD|GR0Ybf%pOi*q!{kNdVc@SYYI+vjbMXNN35H0Orj`~?ad zFPAR*Ww_NRpRq&yo2CH=jdu&fLB(g_Pps!kr@v}y{za&nDH zQk^R2I+s))sf!so!UxxSd{T1!F1Vn2o%`~{ z@)um(&S8A*^7k9QF>wPx8~M(-;ucxyvM`; z^Cz3;Fsoh>+wQ|9Y{xTs{(g};cZtPl%0ZR6hed4pC!bsFB)-8#ys$OyNN5%3b&F%| zQ;w#mJoK)Tynj*W-6feiHEI3~x&4>4fAoI(F<0h~BWvB><~e^ON=;&Ik}4Hv8_lwg z`@U%P9h2?x8%^{2w&X|F?l5hdn3d0N6FmQ!v{AyUp?;`=W;>l`{&Yk&!saKn_u({zu=m` zxPM(z$GV3qvBxE=+N-OC#b4T%6nYpAG57}pjO)z{l#+MqUay99_LITcfomEV&S{X2rq<4ObR%oaonDwlwyTs*c+3*J;d&S#wuj zl9ZiWSaV@x?TW(-jQae)GF~|M;lbkimi2x8|CrZ4e-`d&q&B(u{k+dRpI^6~{P*$4 z{OW?m!j+QKQ@)&hG5up#Pk1WN35h9&D#nSnQ4fGW? z6CIhRZ_rRwP4sNiON?}KYf?NoB|+1oZ${Gu0ml-~LPwi2?Tllex%?h3Y7(wE=-qG2 zCG~NUfWBtNq0>x#+7_BeIKTWdXg%$;=jmaYdtV;1xz+CI6qGmF^X~BPinHzfANu&W zIc#!zQgF0gl;`(`E^~=JT~WUbT)2Km_{`lSn6X zy|=2y{l|uH1{O1-W1g5j6kqjd+1#$oY13jJ8NL$Vs%2(rlQ>&5`t+BskkxY*%FI60 z`HHPv#p!sA>=n^#uCv$KG(Vq|_rlL!)FMT%psh{t@WX8jmxkuuUZ!gmVZTbcMrZoW z=ij!N%~#V1__BWXM$V#l0UU8BUVLeJ)^WLnlP!K}H@EoopmT|B$Ak=%Qe>^Cm%O;Q zndj7$nVTp7*`zn8ec3f0_tWB!SMS)(8q^>La_X5NxHs;hJtzntQ| z;+6%ksI)_!|G)EF4Cky()4g|PU(xCxD`MEs&Y!tBDqHuW$E(^z-^(kNMW5}_Xjyp9 zaQ%mxox+=vr)|H~HSOHTkFIkLX8t-XEH6Ie$9^SCU;pJ9savkOl`pVc!h1M$(!8c3 z#<(ShVJ@-CD;#AR%jFeKb~hU@zPOh?U{UqfYqnSZH*L7TzjsBo_}X{-bjx(5UdeU0 zW#yF}&z4iPxV^LcvvtPD>-mr0m{~pATH^5HuihoLY>(H|TUV$GiX3{cIq7!C9N}-z zAI)Q1>CQE2m#*IK>OIjOEPEJF?&`M^oFgbPh526hZVU17Z5Kj5#HsJmUOJ=e##V1> z|9@KS->06fTPl=$_cYVJ1$(xCObPz6^uk4>cWQfrFSu((R-JynDEdKi>V`&#tOf=Z zp^|0A^4G&3_KC^9GhZe8*tos-UFmdfk-N7m{`_^Wa^1E`P3*|#)>4MXLssp{OSSj( zn@y5DvB4w#@@ie~srSs*Ml8PH-toX}*9XD2LUzs?pC__P@0I%fPyVvBJ1G8xC;pN4 zuX~5D-#B9aL-78i@ThwA_w|$h=Gz>w|Iuff*lTn%;p~l+zgy%F@aG6b>p1?l{BtDl zLHe}ie|6VvD%A;YdoQYX@h5oOvS8;Wp%xYfhPUka8dJDVE_6xF&4-j{t>K&%A>pF` z^2P2w`FO%eQL{D4`KH?BM!}a{twM(`C8#MVNN}`Hf0Als5S@Onh2^N|>d@P}w%iI^ z6PCL;G|Is!lk?g&){UWSvhRj(iQ2ku>$a@d_4m%G7@rhL-)H&#&gQ$t?<~Kc+1tOj z;#1<3q=~bh9%_%Zcyq`-=EolH_|k_x-2FR0l#1_rcqo#0|J4su+U{rm*xR<;^pE3V zdDB0hhmEEFt$C;~^>5X~e5rry9?DD2yZXVO_k8A$>21$V_bhmLU+UlDhx?`Cu1vWU z(z(pbG<4a@BH7@J%NGYZOl`3F+)9}v7wd8hAB(nlA&;QX-rS8)ibUFGWU?|<3^uD3bvSM#vWJPmD zLBIj&(wHXm&Zp+xAEH_Igzl-DozU*`?J#Dx9%MTy;-TIr6al6-#?VabhpZwCyWVht8=#JR1-OdN*viUs{W_l-D zu)pCvr-a!DUmnQ{rul{+bZf31*#2=tC~6}(byp0 zb*KM>A+!B4ciulN^5!3c8SM|N^Zt=3m;Ax{&g_Ht!oOZE^|}w{?D!~clcn*XW#O_1 zr`s-laCP3v5;9?RiHzx$keZ_bY;!{{vxGbfZd-L|Id5pMpz~FZv%T!Rq20fEOl32j zuNEqX>i2N7oH@YUwo70+kE!r-ktyo}Zf#i9c*7=X-m$ROD*xo$ahvadnf*Jr-diVY z_QDlYBi04XPHs7yapAs@*<{b4<>CS6WpB6cdh7W_w@gWdSFe29jb#DPGj&hR4ei-y zb@le^HR~&*ehSvESHFMQ!$xfDqHmv$CAqYEcXRb$zNYSEyZWqxvhOXV?e@-J7e(5J`^2~VKH`S!yXV+~AwTVl6 zQWMv?)95^(+?tY4Dgz2^9%nURYFcB-YRN-r|pt(bJ{Zmr5E4#~BF zY8NaO!-5vB>Q!H1EBbPiQ1ns9)>$8~Y#qo zLagLc(Y9^-GA5*)(LEKBT)MQWNW&>neRh>Y(}qdirDklopKrC9hN&zw2vt$ucyyDR z?A;vJ;6&q#4$_?3GkK0KI=y0->NKyC=+{m{^QYZ3og{5lUR9^Do;Ha%9DKJ8GFfZ}oq zkvlV&9Dkg6`kT4+VF|u^TgSep}rcSdERl! zZ#L~nHJz+wet+JDt}2_b3qQM4jOM(5`{dus0>^cKqJN!nDOO74ORGxI`*x_=aN?}V zYiE5ZpEkKzBb$BK+8t*fg{_!(LzCNMX4H9Co0Xnor}&JTJPukV*LE+zwQ$*+fE(}s zOno9&ye;Rz{5$@O|M9*S^1C?Ib%y1%fNk%6^vm{%>S?*u zD~08)FGd-aZ)(}2JB7#ccVzD5ZD)Cw>rC@B$=G-y>&>0A{NATR&o>>vuySQZe`a)~ zd(6z4KNfxMp4q$i$hYW)3G;0Y+IT;$+C5=X};A5WgqD7Q+# zGG}8`)t*+NzM?YT`$Bt|lctrk^xg|R^ID>@UgCDAp2DwFiEFIXc2%@o=rua@wIz4Y zS+NkUHxa+P`SlseNYo!BW=lfk!=q514n&;uE)5jEVp;q1P>9HodmGBYJh7V9d^B3EfH~#`sR<8R^HS<}dTv zp{f*~;C=pP)Lda5dEq6eq~fm{G%;1l_D22M*KsLY-BWzS_LQ6Vgfl)a+t~9sD?KFh zjokf%%r*QByB{1Xt?_>I>~lK*d||acFAi~)B%4+h=;{Pj{p3xO|5ae?WYMyB$HdLE z1&^)mc)+p9qEEt2;JBujO&81L`A?J&Jgc=oy1Ldr?!W@AgN$)c_&=T7*W6jp$)9?; zZbIdx7_L_U7Y6D zzhJfOmg=OF_D75AXFdJLGu_TzEZ!<|xAbP|n=Z4nFYhorP+05!JM)ax(WA2a*b{pn z7@2n`sBX_qm5OD&f06T8{_@S`pIU1qdUtfM`L)r)Kdtxu()8PzKTOLP+>Mpfh_!54 z`tzB0W>uM#_8nChmuZv37MDj^{)94qOIXiwYHI5T|^|~$Ked%<|6I&X>J*q7% zpP4lKg*}_IrhocozlSC>jB_meKi{mMmj73M#<9&A&y7pDU*5ivWu>`!w*E!in&!48 zA5Z+&mp-oC(^Sh?eT4mAnBlbSOD|-O@?5+6s9}Pe;pW5UP2QI?#L~~0SoI|vZ_IW6 z&~>DY?efgxEy*0ElRJ;k5s7cpE}Ur0c5G3^NfsvOKX={Va7aJ@8_~eNLBd_r+@<&N z4leZzJ&Ds!37EP|+;#4Gqq2Bcdzt+5JkEV>`WCLs9u!8c`CSj{Ebc8`vV)J4fuUaz zU&~4X$1oMBWu;=M2fj`yH{i4vv!lS8li6p}l9Os0HIynkn)>F6IwrL^d`NIPKY7W` zo;T;(?w)+T*+x_D55s>Cm%=ogioylUyI-x#TJin;b@L~MEx!D#<*wPR`JJHg^Ta{! zfP+B|Y^QjBK09dZyzu76-0e4OMS>3=^(me;>Czv^Rf$H~(KTu2UeAL(YZFD*rg-o; zx@&qxPds6CN+K(E<%=|-@0xps|DMnZ$-5mcqJI3^^n>qJCzm)}ztneXZ|f!HOGOE9 zGW1Ljf7}0DzddP;0RXP>C* z%n(ICA0?h|Pkm4iixFSgW4}fN$Dt#+{@!_q0(fMc zJy`x8Xp3p!)p;PhV71nwAQcz!4N1>!)(Eh0R(Y8VlX5qcvya(7 zU!T9l@TkIp;D+=j^FDRK#1$KEd}g1`{Cs6(sNU(z)1~(+wmkk}C+}ummZM#`Q7yc6 zwrO;gglM$l7x75F)4yhPL>Cub@XQara_&_0HIsc;KVR>dia<#=9dHo=-og{Oc6jl{$Ayc(~m{Rwv{i#Cw=?3Dv%>uLR%=T!Tjp|J5t}o~w+_r{ceVNO;fjN3 zD&y{Lo3tNXk2|YMqwmsn zrmMduUNQ2Sdhbe9-L5Vv8zbK@vo_leF%=x^qbj_hJQCV9Q^lye58fI>1y(WB@^T|q{{*VQs z?sMm}{f`Vycqu>2bNb!O3mw*7&;Qz1yz$)j=XW1WNIzT5oU-rl1o8GciF5xu?Kz*( zJpcKG=YPCY{#<1&s!MIqtWRY4ZvB~wzf*NpL;0H=rS|U{3EZy7m_*O?%w07nbE574 zCN=RHTJn4TR6U)b%FKR*HP0wWXY+jxuGDS2=Rdp^|G>iBH1|>Q9qH_AJ322;sXO$` zVrB}D-o(FU&b!U8h#kKbnw4Ahao4t@?t=Co9XSiXfV+n-jeNNW7#SFTF@Z7?BNG<` z_S@Gu8PEaJEpm)ZA`Bw%d*qNWd;{GhhtLSRXa%kf=~lS_Z`>AxE`~#xFaw%e@#z3v z6o=5U3#tQpyBj`@po`-W8Xu!-gkB2=(vR%fYNUIhKnDmS^b0dWZnT414AqbKS~+yX zkuM7Z_0SQ9=dofn9O+^ybhD7J!U2_w2(y;4V>c@p+hs%O#v)&g0E%9Ou_Bz6yxq@1F*n<$c^#W=iBD`FfiQ6n#YZ2XL$n`vG&VHMP%`_afIl8gPH3O)TfN-Q> c4qjvNH5mfDS=m4ai86>XB(pIvnB{?Z07GXjNdN!< diff --git a/project.xml b/project.xml index b77cdd54..cc44b269 100644 --- a/project.xml +++ b/project.xml @@ -4,7 +4,7 @@ 3 jakarta-bcel bcel - 5.1 + 5.2rc1 Apache Software Foundation http://www.apache.org -- GitLab From 0c4fd6a8e811a8eb2370ee48a7ab1e813b6d4744 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Tue, 13 Dec 2005 17:32:43 +0000 Subject: [PATCH 0291/1313] update contributors git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@356548 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/contributors.xml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/xdocs/contributors.xml b/xdocs/contributors.xml index f3f66d3c..925d332a 100644 --- a/xdocs/contributors.xml +++ b/xdocs/contributors.xml @@ -4,7 +4,7 @@ BCEL Contributors - Jason van Zyl + Jason van Zyl @@ -13,29 +13,33 @@

      + + + + - + - + - + - + - + - +
      Dave Brosiusdbrosius at qis.net
      Markus Dahmm.dahm@gmx.dem.dahm at gmx.de
      Conor MacNeillconor@cortexbusiness.com.auconor at cortexbusiness.com.au
      Costin Manolachecmanolache@yahoo.comcmanolache at yahoo.com
      Jason van Zyljvanzyl@zenplex.comjvanzyl at zenplex.com
      David Dixon-Peughdixonpeugh@yahoo.comdixonpeugh at yahoo.com
      Enver Haaseenver@convergence.deenver at convergence.de

      @@ -46,7 +50,7 @@ - +
      Patrick Beardbeard@netscape.combeard at netscape.com

      -- GitLab From 6e204bcf64158788524eac55123dcaf1d4c2d965 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Tue, 13 Dec 2005 17:33:26 +0000 Subject: [PATCH 0292/1313] only build with maven, standard layout git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@356550 13f79535-47bb-0310-9956-ffa450edef68 --- README.JustIce => README.txt | 14 ++ REPORTING-BUGS | 13 -- build-maven.xml | 116 ------------ build.xml | 353 ----------------------------------- default.properties | 15 -- manifest.txt | 3 - 6 files changed, 14 insertions(+), 500 deletions(-) rename README.JustIce => README.txt (70%) delete mode 100644 REPORTING-BUGS delete mode 100644 build-maven.xml delete mode 100644 build.xml delete mode 100644 default.properties delete mode 100644 manifest.txt diff --git a/README.JustIce b/README.txt similarity index 70% rename from README.JustIce rename to README.txt index de6c4423..70e53ba3 100644 --- a/README.JustIce +++ b/README.txt @@ -1,4 +1,5 @@ + -------------------------------- RUNNING A CONSOLE-BASED VERIFIER -------------------------------- @@ -38,3 +39,16 @@ CONTACT THE AUTHOR If you do something useful with JustIce, I'd like to hear about it! Enver Haase +$Id$ + +------------------------------------------------------------------------------ +If you spot a bug in the BCEL or its accompanying verifier "JustIce" please +check with the BCEL mailing list + + http://jakarta.apache.org/site/mail2.html#BCEL + +and / or enter the issue into the BCEL bug database + + http://issues.apache.org/bugzilla/enter_bug.cgi?product=BCEL +------------------------------------------------------------------------------ + diff --git a/REPORTING-BUGS b/REPORTING-BUGS deleted file mode 100644 index 6aab48dc..00000000 --- a/REPORTING-BUGS +++ /dev/null @@ -1,13 +0,0 @@ -$Id$ - ------------------------------------------------------------------------------- -If you spot a bug in the BCEL or its accompanying verifier "JustIce" please -check with the BCEL mailing list - - http://jakarta.apache.org/site/mail2.html#BCEL - -and / or enter the issue into the BCEL bug database - - http://issues.apache.org/bugzilla/enter_bug.cgi?product=BCEL ------------------------------------------------------------------------------- - diff --git a/build-maven.xml b/build-maven.xml deleted file mode 100644 index d401f28f..00000000 --- a/build-maven.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ================================= WARNING ================================ - Junit isn't present in your ${ANT_HOME}/lib directory. Tests not executed. - ========================================================================== - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build.xml b/build.xml deleted file mode 100644 index 3bbd70d6..00000000 --- a/build.xml +++ /dev/null @@ -1,353 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The Jakarta-Site2 module is not present! Please check - to make sure that you have checked it out from CVS. - - <http://jakarta.apache.org/site/jakarta-site2.html> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +-------------------------------------------------------+ - | C R E A T I N G B I N A R Y D I S T R I B U T I O N | - +-------------------------------------------------------+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +-------------------------------------------------------+ - | C R E A T I N G S O U R C E D I S T R I B U T I O N | - +-------------------------------------------------------+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/default.properties b/default.properties deleted file mode 100644 index d02335fe..00000000 --- a/default.properties +++ /dev/null @@ -1,15 +0,0 @@ -# ------------------------------------------------------------------- -# B U I L D P R O P E R T I E S -# ------------------------------------------------------------------- -# These properties are used by the BCEL build, you may override -# any of these default values by placing property values in -# your ${user.home}/build.properties file. -# ------------------------------------------------------------------- - -project = bcel -version = 5.1 -final.name = ${project}-${version} -jakarta.site2 = ../jakarta-site2 -docs.src = ./xdocs -docs.dest = ./docs -jdom.jar = jdom-b7.jar diff --git a/manifest.txt b/manifest.txt deleted file mode 100644 index 3be184f7..00000000 --- a/manifest.txt +++ /dev/null @@ -1,3 +0,0 @@ -Created-By: Jakarta BCEL 5.1 -Manifest-Version: 1.0 -Main-Class: listclass -- GitLab From e5bfd0ee994f5e59488b4641bae59da0bb295f90 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 14 Dec 2005 03:58:23 +0000 Subject: [PATCH 0293/1313] new email git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@356724 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/contributors.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xdocs/contributors.xml b/xdocs/contributors.xml index 925d332a..8fc3c54c 100644 --- a/xdocs/contributors.xml +++ b/xdocs/contributors.xml @@ -15,7 +15,7 @@ - + -- GitLab From 3d83bcbc1a69e5e9beade4aa76f8c1673960a321 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sat, 24 Dec 2005 11:42:00 +0000 Subject: [PATCH 0294/1313] Eclipse settings added Removed dependency from apache.regex package, use java.util.regex instead MD git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@358927 13f79535-47bb-0310-9956-ffa450edef68 --- examples/TransitiveHull.java | 339 ++++---- .../apache/bcel/util/InstructionFinder.java | 823 ++++++++++-------- 2 files changed, 611 insertions(+), 551 deletions(-) diff --git a/examples/TransitiveHull.java b/examples/TransitiveHull.java index a94aacb2..97f498c8 100644 --- a/examples/TransitiveHull.java +++ b/examples/TransitiveHull.java @@ -1,191 +1,178 @@ -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; -import org.apache.bcel.util.*; -import java.io.*; -import java.util.*; +import java.util.Arrays; +import java.util.regex.Pattern; + import org.apache.bcel.Constants; import org.apache.bcel.Repository; -import org.apache.regexp.*; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.ConstantCP; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.Type; +import org.apache.bcel.util.ClassQueue; +import org.apache.bcel.util.ClassSet; /** - * Find all classes referenced by given start class and all classes - * referenced by those and so on. In other words: Compute the transitive - * hull of classes used by a given class. This is done by checking all - * ConstantClass entries and all method and field signatures.
      This - * may be useful in order to put all class files of an application - * into a single JAR file, e.g.. + * Find all classes referenced by given start class and all classes referenced + * by those and so on. In other words: Compute the transitive hull of classes + * used by a given class. This is done by checking all ConstantClass entries and + * all method and field signatures.
      + * This may be useful in order to put all class files of an application into a + * single JAR file, e.g.. *

      * It fails however in the presence of reflexive code aka introspection. *

      - * You'll need Apache's regular expression library supplied together - * with BCEL to use this class. - * + * You'll need Apache's regular expression library supplied together with BCEL + * to use this class. + * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { - private static class LookupFailure extends RuntimeException { - public LookupFailure(String msg) { - super(msg); - } - } - - private JavaClass _class; - private ClassQueue _queue; - private ClassSet _set; - private ConstantPool _cp; - private String[] _ignored = IGNORED; - - public static final String[] IGNORED = { - "java[.].*", - "javax[.].*", - "sun[.].*", - "sunw[.].*", - "com[.]sun[.].*", - "org[.]omg[.].*", - "org[.]w3c[.].*", - "org[.]xml[.].*", - "net[.]jini[.].*" - }; - - public TransitiveHull(JavaClass clazz) { - _queue = new ClassQueue(); - _queue.enqueue(clazz); - _set = new ClassSet(); - _set.add(clazz); - } - - public JavaClass[] getClasses() { - return _set.toArray(); - } - - public String[] getClassNames() { - return _set.getClassNames(); - } - - /** - * Start traversal using DescendingVisitor pattern. - */ - public void start() { - while(!_queue.empty()) { - JavaClass clazz = _queue.dequeue(); - _class = clazz; - _cp = clazz.getConstantPool(); - - new org.apache.bcel.classfile.DescendingVisitor(clazz, this).visit(); - } - } - - private void add(String class_name) { - class_name = class_name.replace('/', '.'); - - try { - for(int i = 0; i < _ignored.length; i++) { - RE regex = new RE(_ignored[i]); - - if(regex.match(class_name)) { - return; // Ihh + private ClassQueue _queue; + private ClassSet _set; + private ConstantPool _cp; + private String[] _ignored = IGNORED; + + public static final String[] IGNORED = { "java[.].*", "javax[.].*", "sun[.].*", "sunw[.].*", + "com[.]sun[.].*", "org[.]omg[.].*", "org[.]w3c[.].*", "org[.]xml[.].*", "net[.]jini[.].*" }; + + public TransitiveHull(JavaClass clazz) { + _queue = new ClassQueue(); + _queue.enqueue(clazz); + _set = new ClassSet(); + _set.add(clazz); + } + + public JavaClass[] getClasses() { + return _set.toArray(); + } + + public String[] getClassNames() { + return _set.getClassNames(); + } + + /** + * Start traversal using DescendingVisitor pattern. + */ + public void start() { + while (!_queue.empty()) { + JavaClass clazz = _queue.dequeue(); + _cp = clazz.getConstantPool(); + + new org.apache.bcel.classfile.DescendingVisitor(clazz, this).visit(); + } + } + + private void add(String class_name) { + class_name = class_name.replace('/', '.'); + + for (int i = 0; i < _ignored.length; i++) { + if (Pattern.matches(_ignored[i], class_name)) { + return; + } + } + + try { + JavaClass clazz = Repository.lookupClass(class_name); + + if (_set.add(clazz)) { + _queue.enqueue(clazz); + } + } catch (ClassNotFoundException e) { + throw new IllegalStateException("Missing class: " + e.toString()); + } } - } - } catch(RESyntaxException ex) { - System.out.println(ex); - return; - } - - try { - JavaClass clazz = Repository.lookupClass(class_name); - - if(_set.add(clazz)) { - _queue.enqueue(clazz); - } - } catch (ClassNotFoundException e) { - throw new LookupFailure("Missing class: " + e.toString()); - } - } - - public void visitConstantClass(ConstantClass cc) { - String class_name = (String)cc.getConstantValue(_cp); - add(class_name); - } - - private void checkType(Type type) { - if(type instanceof ArrayType) { - type = ((ArrayType)type).getBasicType(); - } - - if(type instanceof ObjectType) { - add(((ObjectType)type).getClassName()); - } - } - - private void visitRef(ConstantCP ccp, boolean method) { - String class_name = ccp.getClass(_cp); - add(class_name); - - ConstantNameAndType cnat = (ConstantNameAndType)_cp. - getConstant(ccp.getNameAndTypeIndex(), Constants.CONSTANT_NameAndType); - - String signature = cnat.getSignature(_cp); - - if(method) { - Type type = Type.getReturnType(signature); - - checkType(type); - - Type[] types = Type.getArgumentTypes(signature); - - for(int i = 0; i < types.length; i++) { - checkType(types[i]); - } - } else { - checkType(Type.getType(signature)); - } - } - - public void visitConstantMethodref(ConstantMethodref cmr) { - visitRef(cmr, true); - } - - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref cimr) { - visitRef(cimr, true); - } - - public void visitConstantFieldref(ConstantFieldref cfr) { - visitRef(cfr, false); - } - - public String[] getIgnored() { - return _ignored; - } - - /** - * Set the value of _ignored. - * @param v Value to assign to _ignored. - */ - public void setIgnored(String[] v) { - _ignored = v; - } - - public static void main(String[] argv) { - ClassParser parser=null; - JavaClass java_class; - - try { - if(argv.length == 0) { - System.err.println("transitive: No input files specified"); - } - else { - if((java_class = Repository.lookupClass(argv[0])) == null) { - java_class = new ClassParser(argv[0]).parse(); + + public void visitConstantClass(ConstantClass cc) { + String class_name = (String) cc.getConstantValue(_cp); + add(class_name); } - TransitiveHull hull = new TransitiveHull(java_class); + private void checkType(Type type) { + if (type instanceof ArrayType) { + type = ((ArrayType) type).getBasicType(); + } + + if (type instanceof ObjectType) { + add(((ObjectType) type).getClassName()); + } + } + + private void visitRef(ConstantCP ccp, boolean method) { + String class_name = ccp.getClass(_cp); + add(class_name); + + ConstantNameAndType cnat = (ConstantNameAndType) _cp.getConstant(ccp.getNameAndTypeIndex(), + Constants.CONSTANT_NameAndType); - hull.start(); - System.out.println(Arrays.asList(hull.getClassNames())); - } - } catch(Exception e) { - e.printStackTrace(); - } - } + String signature = cnat.getSignature(_cp); + + if (method) { + Type type = Type.getReturnType(signature); + + checkType(type); + + Type[] types = Type.getArgumentTypes(signature); + + for (int i = 0; i < types.length; i++) { + checkType(types[i]); + } + } else { + checkType(Type.getType(signature)); + } + } + + public void visitConstantMethodref(ConstantMethodref cmr) { + visitRef(cmr, true); + } + + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref cimr) { + visitRef(cimr, true); + } + + public void visitConstantFieldref(ConstantFieldref cfr) { + visitRef(cfr, false); + } + + public String[] getIgnored() { + return _ignored; + } + + /** + * Set the value of _ignored. + * + * @param v + * Value to assign to _ignored. + */ + public void setIgnored(String[] v) { + _ignored = v; + } + + public static void main(String[] argv) { + JavaClass java_class; + + try { + if (argv.length == 0) { + System.err.println("transitive: No input files specified"); + } else { + if ((java_class = Repository.lookupClass(argv[0])) == null) { + java_class = new ClassParser(argv[0]).parse(); + } + + TransitiveHull hull = new TransitiveHull(java_class); + + hull.start(); + System.out.println(Arrays.asList(hull.getClassNames())); + } + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/src/java/org/apache/bcel/util/InstructionFinder.java b/src/java/org/apache/bcel/util/InstructionFinder.java index 0bfc2150..459ca819 100644 --- a/src/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/java/org/apache/bcel/util/InstructionFinder.java @@ -13,400 +13,473 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; - import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.bcel.Constants; import org.apache.bcel.generic.ClassGenException; import org.apache.bcel.generic.Instruction; import org.apache.bcel.generic.InstructionHandle; import org.apache.bcel.generic.InstructionList; -import org.apache.regexp.RE; -import org.apache.regexp.RESyntaxException; - -/** - * InstructionFinder is a tool to search for given instructions patterns, - * i.e., match sequences of instructions in an instruction list via - * regular expressions. This can be used, e.g., in order to implement - * a peep hole optimizer that looks for code patterns and replaces - * them with faster equivalents. - * - *

      This class internally uses the + +/** + * InstructionFinder is a tool to search for given instructions patterns, i.e., + * match sequences of instructions in an instruction list via regular + * expressions. This can be used, e.g., in order to implement a peep hole + * optimizer that looks for code patterns and replaces them with faster + * equivalents. + * + *

      + * This class internally uses the * Regexp package to search for regular expressions. - * + * * A typical application would look like this: -

      -    InstructionFinder f   = new InstructionFinder(il);
      -    String            pat = "IfInstruction ICONST_0 GOTO ICONST_1 NOP (IFEQ|IFNE)";
      -    
      -    for(Iterator i = f.search(pat, constraint); i.hasNext(); ) {
      -      InstructionHandle[] match = (InstructionHandle[])i.next();
      -      ...
      -      il.delete(match[1], match[5]);
      -      ...
      -    }
      -
      + * + *
      + * 
      + *  
      + *   InstructionFinder f   = new InstructionFinder(il);
      + *   String            pat = "IfInstruction ICONST_0 GOTO ICONST_1 NOP (IFEQ|IFNE)";
      + *   
      + *   for(Iterator i = f.search(pat, constraint); i.hasNext(); ) {
      + *   InstructionHandle[] match = (InstructionHandle[])i.next();
      + *   ...
      + *   il.delete(match[1], match[5]);
      + *   ...
      + *   }
      + *   
      + *  
      + * 
      + * * @version $Id$ - * @author M. Dahm + * @author M. Dahm * @see Instruction * @see InstructionList */ public class InstructionFinder { - private static final int OFFSET = 32767; // char + OFFSET is outside of LATIN-1 - private static final int NO_OPCODES = 256; // Potential number, some are not used - - private static final Map map = new HashMap(); // Map - - private InstructionList il; - private String il_string; // instruction list as string - private InstructionHandle[] handles; // map instruction list to array - - /** - * @param il instruction list to search for given patterns - */ - public InstructionFinder(InstructionList il) { - this.il = il; - reread(); - } - - /** - * Reread the instruction list, e.g., after you've altered the list upon a match. - */ - public final void reread() { - int size = il.getLength(); - char[] buf = new char[size]; // Create a string with length equal to il length - handles = il.getInstructionHandles(); - - // Map opcodes to characters - for(int i=0; i < size; i++) - buf[i] = makeChar(handles[i].getInstruction().getOpcode()); - - il_string = new String(buf); - } - - /** - * Map symbolic instruction names like "getfield" to a single character. - * - * @param pattern instruction pattern in lower case - * @return encoded string for a pattern such as "BranchInstruction". - */ - private static final String mapName(String pattern) { - String result = (String)map.get(pattern); - - if(result != null) - return result; - - for(short i=0; i < NO_OPCODES; i++) - if(pattern.equals(Constants.OPCODE_NAMES[i])) - return "" + makeChar(i); - - throw new RuntimeException("Instruction unknown: " + pattern); - } - - /** - * Replace symbolic names of instructions with the appropiate character and remove - * all white space from string. Meta characters such as +, * are ignored. - * - * @param pattern The pattern to compile - * @return translated regular expression string - */ - private static final String compilePattern(String pattern) { - String lower = pattern.toLowerCase(); - StringBuffer buf = new StringBuffer(); - int size = pattern.length(); - - for(int i=0; i < size; i++) { - char ch = lower.charAt(i); - - if(Character.isLetterOrDigit(ch)) { - StringBuffer name = new StringBuffer(); - - while((Character.isLetterOrDigit(ch) || ch == '_') && i < size) { - name.append(ch); - - if(++i < size) - ch = lower.charAt(i); - else - break; + private static final int OFFSET = 32767; // char + OFFSET is + // outside of + // LATIN-1 + private static final int NO_OPCODES = 256; // Potential number, + // some are not used + + private static final Map map = new HashMap(); // Map + + private InstructionList il; + private String il_string; // instruction list + // as string + private InstructionHandle[] handles; // map instruction + + // list to array + + /** + * @param il + * instruction list to search for given patterns + */ + public InstructionFinder(InstructionList il) { + this.il = il; + reread(); + } + + /** + * Reread the instruction list, e.g., after you've altered the list upon a + * match. + */ + public final void reread() { + int size = il.getLength(); + char[] buf = new char[size]; // Create a string with length equal to il + // length + handles = il.getInstructionHandles(); + + // Map opcodes to characters + for (int i = 0; i < size; i++) + buf[i] = makeChar(handles[i].getInstruction().getOpcode()); + + il_string = new String(buf); + } + + /** + * Map symbolic instruction names like "getfield" to a single character. + * + * @param pattern + * instruction pattern in lower case + * @return encoded string for a pattern such as "BranchInstruction". + */ + private static final String mapName(String pattern) { + String result = (String) map.get(pattern); + + if (result != null) + return result; + + for (short i = 0; i < NO_OPCODES; i++) + if (pattern.equals(Constants.OPCODE_NAMES[i])) + return "" + makeChar(i); + + throw new RuntimeException("Instruction unknown: " + pattern); + } + + /** + * Replace symbolic names of instructions with the appropiate character and + * remove all white space from string. Meta characters such as +, * are + * ignored. + * + * @param pattern + * The pattern to compile + * @return translated regular expression string + */ + private static final String compilePattern(String pattern) { + String lower = pattern.toLowerCase(); + StringBuffer buf = new StringBuffer(); + int size = pattern.length(); + + for (int i = 0; i < size; i++) { + char ch = lower.charAt(i); + + if (Character.isLetterOrDigit(ch)) { + StringBuffer name = new StringBuffer(); + + while ((Character.isLetterOrDigit(ch) || ch == '_') && i < size) { + name.append(ch); + + if (++i < size) + ch = lower.charAt(i); + else + break; + } + + i--; + + buf.append(mapName(name.toString())); + } else if (!Character.isWhitespace(ch)) + buf.append(ch); + } + + return buf.toString(); + } + + /** + * @return the matched piece of code as an array of instruction (handles) + */ + private InstructionHandle[] getMatch(int matched_from, int match_length) { + InstructionHandle[] match = new InstructionHandle[match_length]; + System.arraycopy(handles, matched_from, match, 0, match_length); + + return match; + } + + /** + * Search for the given pattern in the instruction list. You can search for + * any valid opcode via its symbolic name, e.g. "istore". You can also use a + * super class or an interface name to match a whole set of instructions, e.g. + * "BranchInstruction" or "LoadInstruction". "istore" is also an alias for all + * "istore_x" instructions. Additional aliases are "if" for "ifxx", "if_icmp" + * for "if_icmpxx", "if_acmp" for "if_acmpxx". + * + * Consecutive instruction names must be separated by white space which will + * be removed during the compilation of the pattern. + * + * For the rest the usual pattern matching rules for regular expressions + * apply. + *

      + * Example pattern: + * + *

      +	 * search("BranchInstruction NOP ((IfInstruction|GOTO)+ ISTORE Instruction)*");
      +	 * 
      + * + *

      + * If you alter the instruction list upon a match such that other matching + * areas are affected, you should call reread() to update the finder and call + * search() again, because the matches are cached. + * + * @param pattern + * the instruction pattern to search for, where case is ignored + * @param from + * where to start the search in the instruction list + * @param constraint + * optional CodeConstraint to check the found code pattern for + * user-defined constraints + * @return iterator of matches where e.nextElement() returns an array of + * instruction handles describing the matched area + */ + public final Iterator search(String pattern, InstructionHandle from, CodeConstraint constraint) { + String search = compilePattern(pattern); + int start = -1; + + for (int i = 0; i < handles.length; i++) { + if (handles[i] == from) { + start = i; // Where to start search from (index) + break; + } + } + + if (start == -1) + throw new ClassGenException("Instruction handle " + from + " not found in instruction list."); + + Pattern regex = Pattern.compile(search); + List matches = new ArrayList(); + + Matcher matcher = regex.matcher(il_string); + + while (start < il_string.length() && matcher.find(start)) { + int startExpr = matcher.start(); + int endExpr = matcher.end(); + int lenExpr = (endExpr - startExpr) + 1; + + InstructionHandle[] match = getMatch(startExpr, lenExpr); + + if ((constraint == null) || constraint.checkCode(match)) { + matches.add(match); + } + + start = endExpr; + } + + return matches.iterator(); + + } + + /** + * Start search beginning from the start of the given instruction list. + * + * @param pattern + * the instruction pattern to search for, where case is ignored + * @return iterator of matches where e.nextElement() returns an array of + * instruction handles describing the matched area + */ + public final Iterator search(String pattern) { + return search(pattern, il.getStart(), null); + } + + /** + * Start search beginning from `from'. + * + * @param pattern + * the instruction pattern to search for, where case is ignored + * @param from + * where to start the search in the instruction list + * @return iterator of matches where e.nextElement() returns an array of + * instruction handles describing the matched area + */ + public final Iterator search(String pattern, InstructionHandle from) { + return search(pattern, from, null); + } + + /** + * Start search beginning from the start of the given instruction list. Check + * found matches with the constraint object. + * + * @param pattern + * the instruction pattern to search for, case is ignored + * @param constraint + * constraints to be checked on matching code + * @return instruction handle or `null' if the match failed + */ + public final Iterator search(String pattern, CodeConstraint constraint) { + return search(pattern, il.getStart(), constraint); + } + + /** + * Convert opcode number to char. + */ + private static final char makeChar(short opcode) { + return (char) (opcode + OFFSET); + } + + /** + * @return the inquired instruction list + */ + public final InstructionList getInstructionList() { + return il; + } + + /** + * Code patterns found may be checked using an additional user-defined + * constraint object whether they really match the needed criterion. I.e., + * check constraints that can not expressed with regular expressions. + * + */ + public static interface CodeConstraint { + /** + * @param match + * array of instructions matching the requested pattern + * @return true if the matched area is really useful + */ + public boolean checkCode(InstructionHandle[] match); + } + + // Initialize pattern map + + static { + map + .put( + "arithmeticinstruction", + "(irem|lrem|iand|ior|ineg|isub|lneg|fneg|fmul|ldiv|fadd|lxor|frem|idiv|land|ixor|ishr|fsub|lshl|fdiv|iadd|lor|dmul|lsub|ishl|imul|lmul|lushr|dneg|iushr|lshr|ddiv|drem|dadd|ladd|dsub)"); + map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial)"); + map + .put( + "arrayinstruction", + "(baload|aastore|saload|caload|fastore|lastore|iaload|castore|iastore|aaload|bastore|sastore|faload|laload|daload|dastore)"); + map.put("gotoinstruction", "(goto|goto_w)"); + map.put("conversioninstruction", + "(d2l|l2d|i2s|d2i|l2i|i2b|l2f|d2f|f2i|i2d|i2l|f2d|i2c|f2l|i2f)"); + map.put("localvariableinstruction", + "(fstore|iinc|lload|dstore|dload|iload|aload|astore|istore|fload|lstore)"); + map.put("loadinstruction", "(fload|dload|lload|iload|aload)"); + map.put("fieldinstruction", "(getfield|putstatic|getstatic|putfield)"); + map + .put( + "cpinstruction", + "(ldc2_w|invokeinterface|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)"); + map.put("stackinstruction", "(dup2|swap|dup2_x2|pop|pop2|dup|dup2_x1|dup_x2|dup_x1)"); + map + .put( + "branchinstruction", + "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); + map.put("returninstruction", "(lreturn|ireturn|freturn|dreturn|areturn|return)"); + map.put("storeinstruction", "(istore|fstore|dstore|astore|lstore)"); + map.put("select", "(tableswitch|lookupswitch)"); + map + .put( + "ifinstruction", + "(ifeq|ifgt|if_icmpne|if_icmpeq|ifge|ifnull|ifne|if_icmple|if_icmpge|if_acmpeq|if_icmplt|if_acmpne|ifnonnull|iflt|if_icmpgt|ifle)"); + map.put("jsrinstruction", "(jsr|jsr_w)"); + map.put("variablelengthinstruction", "(tableswitch|jsr|goto|lookupswitch)"); + map.put("unconditionalbranch", "(goto|jsr|jsr_w|athrow|goto_w)"); + map.put("constantpushinstruction", "(dconst|bipush|sipush|fconst|iconst|lconst)"); + map + .put( + "typedinstruction", + "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)"); + map.put("popinstruction", "(fstore|dstore|pop|pop2|astore|putstatic|istore|lstore)"); + map.put("allocationinstruction", "(multianewarray|new|anewarray|newarray)"); + map + .put( + "indexedinstruction", + "(lload|lstore|fload|ldc2_w|invokeinterface|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)"); + map + .put( + "pushinstruction", + "(dup|lload|dup2|bipush|fload|ldc2_w|sipush|lconst|fconst|dload|getstatic|ldc_w|aconst_null|dconst|iload|ldc|iconst|aload)"); + map + .put( + "stackproducer", + "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)"); + map + .put( + "stackconsumer", + "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)"); + map + .put( + "exceptionthrower", + "(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|ldc|invokestatic|daload)"); + map + .put( + "loadclass", + "(multianewarray|invokeinterface|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)"); + map + .put( + "instructiontargeter", + "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); + + // Some aliases + map.put("if_icmp", "(if_icmpne|if_icmpeq|if_icmple|if_icmpge|if_icmplt|if_icmpgt)"); + map.put("if_acmp", "(if_acmpeq|if_acmpne)"); + map.put("if", "(ifeq|ifne|iflt|ifge|ifgt|ifle)"); + + // Precompile some aliases first + map.put("iconst", precompile(Constants.ICONST_0, Constants.ICONST_5, Constants.ICONST_M1)); + map.put("lconst", new String(new char[] { '(', makeChar(Constants.LCONST_0), '|', + makeChar(Constants.LCONST_1), ')' })); + map.put("dconst", new String(new char[] { '(', makeChar(Constants.DCONST_0), '|', + makeChar(Constants.DCONST_1), ')' })); + map.put("fconst", new String(new char[] { '(', makeChar(Constants.FCONST_0), '|', + makeChar(Constants.FCONST_1), ')' })); + + map.put("iload", precompile(Constants.ILOAD_0, Constants.ILOAD_3, Constants.ILOAD)); + map.put("dload", precompile(Constants.DLOAD_0, Constants.DLOAD_3, Constants.DLOAD)); + map.put("fload", precompile(Constants.FLOAD_0, Constants.FLOAD_3, Constants.FLOAD)); + map.put("aload", precompile(Constants.ALOAD_0, Constants.ALOAD_3, Constants.ALOAD)); + + map.put("istore", precompile(Constants.ISTORE_0, Constants.ISTORE_3, Constants.ISTORE)); + map.put("dstore", precompile(Constants.DSTORE_0, Constants.DSTORE_3, Constants.DSTORE)); + map.put("fstore", precompile(Constants.FSTORE_0, Constants.FSTORE_3, Constants.FSTORE)); + map.put("astore", precompile(Constants.ASTORE_0, Constants.ASTORE_3, Constants.ASTORE)); + + // Compile strings + + for (Iterator i = map.keySet().iterator(); i.hasNext();) { + String key = (String) i.next(); + String value = (String) map.get(key); + + char ch = value.charAt(1); // Omit already precompiled patterns + if (ch < OFFSET) { + map.put(key, compilePattern(value)); // precompile all patterns + } + } + + // Add instruction alias to match anything + + StringBuffer buf = new StringBuffer("("); + + for (short i = 0; i < NO_OPCODES; i++) { + if (Constants.NO_OF_OPERANDS[i] != Constants.UNDEFINED) { // Not an + // invalid + // opcode + buf.append(makeChar(i)); + + if (i < NO_OPCODES - 1) + buf.append('|'); + } + } + buf.append(')'); + + map.put("instruction", buf.toString()); + } + + private static String precompile(short from, short to, short extra) { + StringBuffer buf = new StringBuffer("("); + + for (short i = from; i <= to; i++) { + buf.append(makeChar(i)); + buf.append('|'); + } + + buf.append(makeChar(extra)); + buf.append(")"); + return buf.toString(); + } + + /* + * Internal debugging routines. + */ + private static final String pattern2string(String pattern) { + return pattern2string(pattern, true); + } + + private static final String pattern2string(String pattern, boolean make_string) { + StringBuffer buf = new StringBuffer(); + + for (int i = 0; i < pattern.length(); i++) { + char ch = pattern.charAt(i); + + if (ch >= OFFSET) { + if (make_string) + buf.append(Constants.OPCODE_NAMES[ch - OFFSET]); + else + buf.append((int) (ch - OFFSET)); + } else + buf.append(ch); + } + + return buf.toString(); } - - i--; - - buf.append(mapName(name.toString())); - } else if(!Character.isWhitespace(ch)) - buf.append(ch); - } - - return buf.toString(); - } - - /** - * @return the matched piece of code as an array of instruction (handles) - */ - private InstructionHandle[] getMatch(int matched_from, int match_length) { - InstructionHandle[] match = new InstructionHandle[match_length]; - System.arraycopy(handles, matched_from, match, 0, match_length); - - return match; - } - - /** - * Search for the given pattern in the instruction list. You can search for any valid - * opcode via its symbolic name, e.g. "istore". You can also use a super class or - * an interface name to match a whole set of instructions, e.g. "BranchInstruction" or - * "LoadInstruction". "istore" is also an alias for all "istore_x" instructions. Additional - * aliases are "if" for "ifxx", "if_icmp" for "if_icmpxx", "if_acmp" for "if_acmpxx". - * - * Consecutive instruction names must be separated by white space which will be removed - * during the compilation of the pattern. - * - * For the rest the usual pattern matching rules for regular expressions apply.

      - * Example pattern: - *

      -     search("BranchInstruction NOP ((IfInstruction|GOTO)+ ISTORE Instruction)*");
      -   * 
      - * - *

      If you alter the instruction list upon a match such that other - * matching areas are affected, you should call reread() to update - * the finder and call search() again, because the matches are cached. - * - * @param pattern the instruction pattern to search for, where case is ignored - * @param from where to start the search in the instruction list - * @param constraint optional CodeConstraint to check the found code pattern for - * user-defined constraints - * @return iterator of matches where e.nextElement() returns an array of instruction handles - * describing the matched area - */ - public final Iterator search(String pattern, InstructionHandle from, - CodeConstraint constraint) - { - String search = compilePattern(pattern); - int start = -1; - - for(int i=0; i < handles.length; i++) { - if(handles[i] == from) { - start = i; // Where to start search from (index) - break; - } - } - - if(start == -1) - throw new ClassGenException("Instruction handle " + from + - " not found in instruction list."); - try { - RE regex = new RE(search); - List matches = new ArrayList(); - - while(start < il_string.length() && regex.match(il_string, start)) { - int startExpr = regex.getParenStart(0); - int endExpr = regex.getParenEnd(0); - int lenExpr = regex.getParenLength(0); - - InstructionHandle[] match = getMatch(startExpr, lenExpr); - - if((constraint == null) || constraint.checkCode(match)) - matches.add(match); - start = endExpr; - } - - return matches.iterator(); - } catch(RESyntaxException e) { - System.err.println(e); - } - - return null; - } - - /** - * Start search beginning from the start of the given instruction list. - * - * @param pattern the instruction pattern to search for, where case is ignored - * @return iterator of matches where e.nextElement() - * returns an array of instruction handles describing the matched - * area - */ - public final Iterator search(String pattern) { - return search(pattern, il.getStart(), null); - } - - /** - * Start search beginning from `from'. - * - * @param pattern the instruction pattern to search for, where case is ignored - * @param from where to start the search in the instruction list - * @return iterator of matches where e.nextElement() returns an array of instruction handles - * describing the matched area - */ - public final Iterator search(String pattern, InstructionHandle from) { - return search(pattern, from, null); - } - - /** - * Start search beginning from the start of the given instruction list. - * Check found matches with the constraint object. - * - * @param pattern the instruction pattern to search for, case is ignored - * @param constraint constraints to be checked on matching code - * @return instruction handle or `null' if the match failed - */ - public final Iterator search(String pattern, CodeConstraint constraint) { - return search(pattern, il.getStart(), constraint); - } - - /** - * Convert opcode number to char. - */ - private static final char makeChar(short opcode) { - return (char)(opcode + OFFSET); - } - - /** - * @return the inquired instruction list - */ - public final InstructionList getInstructionList() { return il; } - - /** - * Code patterns found may be checked using an additional - * user-defined constraint object whether they really match the needed criterion. - * I.e., check constraints that can not expressed with regular expressions. - * - */ - public static interface CodeConstraint { - /** - * @param match array of instructions matching the requested pattern - * @return true if the matched area is really useful - */ - public boolean checkCode(InstructionHandle[] match); - } - - // Initialize pattern map - - static { - map.put("arithmeticinstruction", "(irem|lrem|iand|ior|ineg|isub|lneg|fneg|fmul|ldiv|fadd|lxor|frem|idiv|land|ixor|ishr|fsub|lshl|fdiv|iadd|lor|dmul|lsub|ishl|imul|lmul|lushr|dneg|iushr|lshr|ddiv|drem|dadd|ladd|dsub)"); - map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial)"); - map.put("arrayinstruction", "(baload|aastore|saload|caload|fastore|lastore|iaload|castore|iastore|aaload|bastore|sastore|faload|laload|daload|dastore)"); - map.put("gotoinstruction", "(goto|goto_w)"); - map.put("conversioninstruction", "(d2l|l2d|i2s|d2i|l2i|i2b|l2f|d2f|f2i|i2d|i2l|f2d|i2c|f2l|i2f)"); - map.put("localvariableinstruction", "(fstore|iinc|lload|dstore|dload|iload|aload|astore|istore|fload|lstore)"); - map.put("loadinstruction", "(fload|dload|lload|iload|aload)"); - map.put("fieldinstruction", "(getfield|putstatic|getstatic|putfield)"); - map.put("cpinstruction", "(ldc2_w|invokeinterface|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)"); - map.put("stackinstruction", "(dup2|swap|dup2_x2|pop|pop2|dup|dup2_x1|dup_x2|dup_x1)"); - map.put("branchinstruction", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); - map.put("returninstruction", "(lreturn|ireturn|freturn|dreturn|areturn|return)"); - map.put("storeinstruction", "(istore|fstore|dstore|astore|lstore)"); - map.put("select", "(tableswitch|lookupswitch)"); - map.put("ifinstruction", "(ifeq|ifgt|if_icmpne|if_icmpeq|ifge|ifnull|ifne|if_icmple|if_icmpge|if_acmpeq|if_icmplt|if_acmpne|ifnonnull|iflt|if_icmpgt|ifle)"); - map.put("jsrinstruction", "(jsr|jsr_w)"); - map.put("variablelengthinstruction", "(tableswitch|jsr|goto|lookupswitch)"); - map.put("unconditionalbranch", "(goto|jsr|jsr_w|athrow|goto_w)"); - map.put("constantpushinstruction", "(dconst|bipush|sipush|fconst|iconst|lconst)"); - map.put("typedinstruction", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)"); - map.put("popinstruction", "(fstore|dstore|pop|pop2|astore|putstatic|istore|lstore)"); - map.put("allocationinstruction", "(multianewarray|new|anewarray|newarray)"); - map.put("indexedinstruction", "(lload|lstore|fload|ldc2_w|invokeinterface|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)"); - map.put("pushinstruction", "(dup|lload|dup2|bipush|fload|ldc2_w|sipush|lconst|fconst|dload|getstatic|ldc_w|aconst_null|dconst|iload|ldc|iconst|aload)"); - map.put("stackproducer", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)"); - map.put("stackconsumer", "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)"); - map.put("exceptionthrower", "(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|ldc|invokestatic|daload)"); - map.put("loadclass", "(multianewarray|invokeinterface|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)"); - map.put("instructiontargeter", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); - - // Some aliases - map.put("if_icmp", "(if_icmpne|if_icmpeq|if_icmple|if_icmpge|if_icmplt|if_icmpgt)"); - map.put("if_acmp", "(if_acmpeq|if_acmpne)"); - map.put("if", "(ifeq|ifne|iflt|ifge|ifgt|ifle)"); - - // Precompile some aliases first - map.put("iconst", precompile(Constants.ICONST_0, Constants.ICONST_5, Constants.ICONST_M1)); - map.put("lconst", new String(new char[] { '(', makeChar(Constants.LCONST_0), '|', - makeChar(Constants.LCONST_1), ')' })); - map.put("dconst", new String(new char[] { '(', makeChar(Constants.DCONST_0), '|', - makeChar(Constants.DCONST_1), ')' })); - map.put("fconst", new String(new char[] { '(', makeChar(Constants.FCONST_0), '|', - makeChar(Constants.FCONST_1), ')' })); - - map.put("iload", precompile(Constants.ILOAD_0, Constants.ILOAD_3, Constants.ILOAD)); - map.put("dload", precompile(Constants.DLOAD_0, Constants.DLOAD_3, Constants.DLOAD)); - map.put("fload", precompile(Constants.FLOAD_0, Constants.FLOAD_3, Constants.FLOAD)); - map.put("aload", precompile(Constants.ALOAD_0, Constants.ALOAD_3, Constants.ALOAD)); - - map.put("istore", precompile(Constants.ISTORE_0, Constants.ISTORE_3, Constants.ISTORE)); - map.put("dstore", precompile(Constants.DSTORE_0, Constants.DSTORE_3, Constants.DSTORE)); - map.put("fstore", precompile(Constants.FSTORE_0, Constants.FSTORE_3, Constants.FSTORE)); - map.put("astore", precompile(Constants.ASTORE_0, Constants.ASTORE_3, Constants.ASTORE)); - - // Compile strings - - for(Iterator i = map.keySet().iterator(); i.hasNext(); ) { - String key = (String)i.next(); - String value = (String)map.get(key); - - char ch = value.charAt(1); // Omit already precompiled patterns - if(ch < OFFSET) { - map.put(key, compilePattern(value)); // precompile all patterns - } - } - - // Add instruction alias to match anything - - StringBuffer buf = new StringBuffer("("); - - for(short i=0; i < NO_OPCODES; i++) { - if(Constants.NO_OF_OPERANDS[i] != Constants.UNDEFINED) { // Not an invalid opcode - buf.append(makeChar(i)); - - if(i < NO_OPCODES - 1) - buf.append('|'); - } - } - buf.append(')'); - - map.put("instruction", buf.toString()); - } - - private static String precompile(short from, short to, short extra) { - StringBuffer buf = new StringBuffer("("); - - for(short i=from; i <= to; i++) { - buf.append(makeChar(i)); - buf.append('|'); - } - - buf.append(makeChar(extra)); - buf.append(")"); - return buf.toString(); - } - - /* - * Internal debugging routines. - */ - private static final String pattern2string(String pattern) { - return pattern2string(pattern, true); - } - - private static final String pattern2string(String pattern, boolean make_string) { - StringBuffer buf = new StringBuffer(); - - for(int i=0; i < pattern.length(); i++) { - char ch = pattern.charAt(i); - - if(ch >= OFFSET) { - if(make_string) - buf.append(Constants.OPCODE_NAMES[ch - OFFSET]); - else - buf.append((int)(ch - OFFSET)); - } else - buf.append(ch); - } - - return buf.toString(); - } } -- GitLab From 4f7494f037a098da61b1b04a7a523d1832a9af61 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sat, 24 Dec 2005 11:43:38 +0000 Subject: [PATCH 0295/1313] Eclipse settings added Removed dependency from apache.regex package, use java.util.regex instead MD git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@358928 13f79535-47bb-0310-9956-ffa450edef68 --- .settings/org.eclipse.jdt.core.prefs | 12 ++++++++++++ .settings/org.eclipse.jdt.ui.prefs | 3 +++ 2 files changed, 15 insertions(+) create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.jdt.ui.prefs diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..4f219764 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +#Sat Dec 24 12:26:49 CET 2005 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.4 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning +org.eclipse.jdt.core.compiler.source=1.3 diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..cf051a11 --- /dev/null +++ b/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,3 @@ +#Sat Dec 24 12:26:49 CET 2005 +eclipse.preferences.version=1 +internal.default.compliance=default -- GitLab From cbfdcd5835caabe5bbd1b20de83b4629a64507d9 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sat, 24 Dec 2005 11:44:09 +0000 Subject: [PATCH 0296/1313] Eclipse settings added Removed dependency from apache.regex package, use java.util.regex instead MD git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@358929 13f79535-47bb-0310-9956-ffa450edef68 --- .classpath | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .classpath diff --git a/.classpath b/.classpath new file mode 100644 index 00000000..ee95bfdb --- /dev/null +++ b/.classpath @@ -0,0 +1,7 @@ + + + + + + + -- GitLab From 53c1168bddb72eba5a6ca833cd5a22070da43334 Mon Sep 17 00:00:00 2001 From: Markus Dahm Date: Sat, 24 Dec 2005 11:44:25 +0000 Subject: [PATCH 0297/1313] Eclipse settings added Removed dependency from apache.regex package, use java.util.regex instead MD git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@358930 13f79535-47bb-0310-9956-ffa450edef68 --- .project | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .project diff --git a/.project b/.project new file mode 100644 index 00000000..0edf1682 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + jakarta-bcel + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + -- GitLab From 3bde59ad3a6a8baa095c2b069b4b043fb1c445bf Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 8 Jan 2006 07:17:44 +0000 Subject: [PATCH 0298/1313] prepare for a 5.2rc1 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@367003 13f79535-47bb-0310-9956-ffa450edef68 --- project.properties | 28 +++++ project.xml | 68 ++++++----- xdocs/contributors.xml | 38 +++--- xdocs/faq.xml | 13 +-- xdocs/index.xml | 19 ++- xdocs/license.xml | 256 ++++++++++++++++++++++++++++++++--------- xdocs/manual.xml | 1 - xdocs/navigation.xml | 1 - xdocs/news.xml | 17 ++- xdocs/projects.xml | 9 +- 10 files changed, 316 insertions(+), 134 deletions(-) create mode 100644 project.properties diff --git a/project.properties b/project.properties new file mode 100644 index 00000000..7795b12f --- /dev/null +++ b/project.properties @@ -0,0 +1,28 @@ +#maven.mode.online = + +maven.username = ${user.name} + +maven.compile.debug = on +maven.compile.deprecation = off +maven.compile.optimize = off + +maven.jarResources.basedir = src/java +maven.jar.excludes = **/package.html +#maven.junit.fork = true + +maven.test.failure.ignore = true +maven.test.skip = false + +maven.javadoc.author = false +maven.javadoc.links = http://java.sun.com/products/jdk/1.4/docs/api + +maven.changelog.factory = org.apache.maven.svnlib.SvnChangeLogFactory + +maven.xdoc.jsl = ../commons-build/commons-site.jsl +maven.xdoc.date = bottom +maven.xdoc.poweredby.image = maven-feather.png +maven.xdoc.version = ${pom.currentVersion} +maven.xdoc.developmentProcessUrl = http://jakarta.apache.org/commons/charter.html +maven.xdoc.includeProjectDocumentation = yes + +maven.jar.override = off diff --git a/project.xml b/project.xml index cc44b269..c208fa34 100644 --- a/project.xml +++ b/project.xml @@ -21,13 +21,23 @@ Bytecode Engineering Library + + + The Apache Software License, Version 2.0 + /LICENSE.txt + repo + + + + jakarta http://jakarta.apache.org/bcel/ - jakarta.apache.org + http://issues.apache.org/bugzilla/ + minotaur.apache.org /www/jakarta.apache.org/bcel/ scm:svn:http://svn.apache.org/repos/asf/jakarta/bcel/trunk - http://svn.apache.org/viewcvs.cgi/jakarta/bcel/ + http://svn.apache.org/repos/asf/jakarta/bcel/trunk @@ -50,44 +60,58 @@ Markus Dahm mdahm - m.dahm@gmx.de + m.dahm at gmx.de it-frameworksolutions Jason van Zyl jvanzyl - jason@zenplex.com + jason at zenplex.com Zenplex Enver Haase ehaase - enver@convergence.de + enver at convergence.de convergence Dave Brosius dbrosius - dbrosius@qis.net - + dbrosius at qis.net + + + + Torsten Curdt + tcurdt + tcurdt at apache.org + regexp 1.2 + + + + maven-plugins + maven-cobertura-plugin + 1.1 + plugin + + src/java - src/java @@ -95,33 +119,23 @@ exclude = **/*.class - - - - - - - - - - - maven-checkstyle-plugin - maven-pmd-plugin - - maven-clover-plugin - - + maven-license-plugin + maven-changelog-plugin + maven-changes-plugin + maven-developer-activity-plugin maven-javadoc-plugin - maven-junit-report-plugin + maven-cobertura-plugin maven-jxr-plugin - maven-license-plugin + maven-pmd-plugin + maven-tasklist-plugin + + - maven-tasklist-plugin diff --git a/xdocs/contributors.xml b/xdocs/contributors.xml index 8fc3c54c..5f26fdc2 100644 --- a/xdocs/contributors.xml +++ b/xdocs/contributors.xml @@ -1,16 +1,13 @@ - BCEL Contributors - Jason van Zyl

      -

      Dave Brosiusdbrosius at qis.netdbrosius at mebigfatguy.com
      Markus Dahm
      @@ -21,6 +18,25 @@ + + + + +
      Markus Dahm m.dahm at gmx.de
      Torsten Curdttcurdt at apache.org
      +

      +
  • + +
    +

    + + + + + + + + + @@ -33,10 +49,6 @@ - - - - @@ -45,17 +57,5 @@

    -
    -

    -

    David Dixon-Peughdixonpeugh at yahoo.com
    Patrick Beardbeard at netscape.com
    Conor MacNeill conor at cortexbusiness.com.auJason van Zyl jvanzyl at zenplex.com
    David Dixon-Peughdixonpeugh at yahoo.com
    Enver Haase enver at convergence.de
    - - - - -
    Patrick Beardbeard at netscape.com
    -

    -
    - - diff --git a/xdocs/faq.xml b/xdocs/faq.xml index 3294b8fd..1324e900 100644 --- a/xdocs/faq.xml +++ b/xdocs/faq.xml @@ -4,8 +4,7 @@ BCEL FAQ - Jason van Zyl - + @@ -39,12 +38,10 @@

    Q: (Typically for users of Xalan (XSLTC)) I'm getting - -

    -    ClassGenException: Branch target offset too large for short
    -    
    - - when compiling large files. +
    +      ClassGenException: Branch target offset too large for short
    +      
    + when compiling large files.
    A: The answer lies in internal limitations of the JVM, diff --git a/xdocs/index.xml b/xdocs/index.xml index d47a0269..12dd7df5 100644 --- a/xdocs/index.xml +++ b/xdocs/index.xml @@ -2,11 +2,6 @@ - - - Jason van Zyl - -
    @@ -29,15 +24,17 @@

    - BCEL is already being used successfully in several projects such - as compilers, optimizers, obsfuscators, code generators - and analysis tools. + BCEL contains a byte code verifier named JustIce, which usually + gives you much better information about what's wrong with your + code than the standard JVM message.

    - It contains a byte code verifier named JustIce, which usually - gives you much better information about what's wrong with your - code than the standard JVM message. + BCEL is already being used successfully in several projects such + as compilers, optimizers, obsfuscators, code generators + and analysis tools. Unfortunately there hasn't been much development + going on over the past few years. Feel free to help out or you + might want to have a look into the ASM project at objectweb.

    diff --git a/xdocs/license.xml b/xdocs/license.xml index b253ef88..8fc6b6ef 100644 --- a/xdocs/license.xml +++ b/xdocs/license.xml @@ -3,69 +3,217 @@ Apache Software License - Jason van Zyl
    . +/* + * Apache License + * Version 2.0, January 2004 + * http://www.apache.org/licenses/ + * + * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + * + * 1. Definitions. + * + * "License" shall mean the terms and conditions for use, reproduction, + * and distribution as defined by Sections 1 through 9 of this document. + * + * "Licensor" shall mean the copyright owner or entity authorized by + * the copyright owner that is granting the License. + * + * "Legal Entity" shall mean the union of the acting entity and all + * other entities that control, are controlled by, or are under common + * control with that entity. For the purposes of this definition, + * "control" means (i) the power, direct or indirect, to cause the + * direction or management of such entity, whether by contract or + * otherwise, or (ii) ownership of fifty percent (50%) or more of the + * outstanding shares, or (iii) beneficial ownership of such entity. + * + * "You" (or "Your") shall mean an individual or Legal Entity + * exercising permissions granted by this License. + * + * "Source" form shall mean the preferred form for making modifications, + * including but not limited to software source code, documentation + * source, and configuration files. + * + * "Object" form shall mean any form resulting from mechanical + * transformation or translation of a Source form, including but + * not limited to compiled object code, generated documentation, + * and conversions to other media types. + * + * "Work" shall mean the work of authorship, whether in Source or + * Object form, made available under the License, as indicated by a + * copyright notice that is included in or attached to the work + * (an example is provided in the Appendix below). + * + * "Derivative Works" shall mean any work, whether in Source or Object + * form, that is based on (or derived from) the Work and for which the + * editorial revisions, annotations, elaborations, or other modifications + * represent, as a whole, an original work of authorship. For the purposes + * of this License, Derivative Works shall not include works that remain + * separable from, or merely link (or bind by name) to the interfaces of, + * the Work and Derivative Works thereof. + * + * "Contribution" shall mean any work of authorship, including + * the original version of the Work and any modifications or additions + * to that Work or Derivative Works thereof, that is intentionally + * submitted to Licensor for inclusion in the Work by the copyright owner + * or by an individual or Legal Entity authorized to submit on behalf of + * the copyright owner. For the purposes of this definition, "submitted" + * means any form of electronic, verbal, or written communication sent + * to the Licensor or its representatives, including but not limited to + * communication on electronic mailing lists, source code control systems, + * and issue tracking systems that are managed by, or on behalf of, the + * Licensor for the purpose of discussing and improving the Work, but + * excluding communication that is conspicuously marked or otherwise + * designated in writing by the copyright owner as "Not a Contribution." + * + * "Contributor" shall mean Licensor and any individual or Legal Entity + * on behalf of whom a Contribution has been received by Licensor and + * subsequently incorporated within the Work. + * + * 2. Grant of Copyright License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * copyright license to reproduce, prepare Derivative Works of, + * publicly display, publicly perform, sublicense, and distribute the + * Work and such Derivative Works in Source or Object form. + * + * 3. Grant of Patent License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * (except as stated in this section) patent license to make, have made, + * use, offer to sell, sell, import, and otherwise transfer the Work, + * where such license applies only to those patent claims licensable + * by such Contributor that are necessarily infringed by their + * Contribution(s) alone or by combination of their Contribution(s) + * with the Work to which such Contribution(s) was submitted. If You + * institute patent litigation against any entity (including a + * cross-claim or counterclaim in a lawsuit) alleging that the Work + * or a Contribution incorporated within the Work constitutes direct + * or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate + * as of the date such litigation is filed. + * + * 4. Redistribution. You may reproduce and distribute copies of the + * Work or Derivative Works thereof in any medium, with or without + * modifications, and in Source or Object form, provided that You + * meet the following conditions: + * + * (a) You must give any other recipients of the Work or + * Derivative Works a copy of this License; and + * + * (b) You must cause any modified files to carry prominent notices + * stating that You changed the files; and + * + * (c) You must retain, in the Source form of any Derivative Works + * that You distribute, all copyright, patent, trademark, and + * attribution notices from the Source form of the Work, + * excluding those notices that do not pertain to any part of + * the Derivative Works; and + * + * (d) If the Work includes a "NOTICE" text file as part of its + * distribution, then any Derivative Works that You distribute must + * include a readable copy of the attribution notices contained + * within such NOTICE file, excluding those notices that do not + * pertain to any part of the Derivative Works, in at least one + * of the following places: within a NOTICE text file distributed + * as part of the Derivative Works; within the Source form or + * documentation, if provided along with the Derivative Works; or, + * within a display generated by the Derivative Works, if and + * wherever such third-party notices normally appear. The contents + * of the NOTICE file are for informational purposes only and + * do not modify the License. You may add Your own attribution + * notices within Derivative Works that You distribute, alongside + * or as an addendum to the NOTICE text from the Work, provided + * that such additional attribution notices cannot be construed + * as modifying the License. + * + * You may add Your own copyright statement to Your modifications and + * may provide additional or different license terms and conditions + * for use, reproduction, or distribution of Your modifications, or + * for any such Derivative Works as a whole, provided Your use, + * reproduction, and distribution of the Work otherwise complies with + * the conditions stated in this License. + * + * 5. Submission of Contributions. Unless You explicitly state otherwise, + * any Contribution intentionally submitted for inclusion in the Work + * by You to the Licensor shall be under the terms and conditions of + * this License, without any additional terms or conditions. + * Notwithstanding the above, nothing herein shall supersede or modify + * the terms of any separate license agreement you may have executed + * with Licensor regarding such Contributions. + * + * 6. Trademarks. This License does not grant permission to use the trade + * names, trademarks, service marks, or product names of the Licensor, + * except as required for reasonable and customary use in describing the + * origin of the Work and reproducing the content of the NOTICE file. + * + * 7. Disclaimer of Warranty. Unless required by applicable law or + * agreed to in writing, Licensor provides the Work (and each + * Contributor provides its Contributions) on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied, including, without limitation, any warranties or conditions + * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + * PARTICULAR PURPOSE. You are solely responsible for determining the + * appropriateness of using or redistributing the Work and assume any + * risks associated with Your exercise of permissions under this License. + * + * 8. Limitation of Liability. In no event and under no legal theory, + * whether in tort (including negligence), contract, or otherwise, + * unless required by applicable law (such as deliberate and grossly + * negligent acts) or agreed to in writing, shall any Contributor be + * liable to You for damages, including any direct, indirect, special, + * incidental, or consequential damages of any character arising as a + * result of this License or out of the use or inability to use the + * Work (including but not limited to damages for loss of goodwill, + * work stoppage, computer failure or malfunction, or any and all + * other commercial damages or losses), even if such Contributor + * has been advised of the possibility of such damages. + * + * 9. Accepting Warranty or Additional Liability. While redistributing + * the Work or Derivative Works thereof, You may choose to offer, + * and charge a fee for, acceptance of support, warranty, indemnity, + * or other liability obligations and/or rights consistent with this + * License. However, in accepting such obligations, You may act only + * on Your own behalf and on Your sole responsibility, not on behalf + * of any other Contributor, and only if You agree to indemnify, + * defend, and hold each Contributor harmless for any liability + * incurred by, or claims asserted against, such Contributor by reason + * of your accepting any such warranty or additional liability. + * + * END OF TERMS AND CONDITIONS + * + * APPENDIX: How to apply the Apache License to your work. + * + * To apply the Apache License to your work, attach the following + * boilerplate notice, with the fields enclosed by brackets "[]" + * replaced with your own identifying information. (Don't include + * the brackets!) The text should be enclosed in the appropriate + * comment syntax for the file format. We also recommend that a + * file or class name and description of purpose be included on the + * same "printed page" as the copyright notice for easier + * identification within third-party archives. + * + * Copyright [yyyy] [name of copyright owner] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ ]]>
    - diff --git a/xdocs/manual.xml b/xdocs/manual.xml index 914d9d52..fe91b19c 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -2,7 +2,6 @@ - Markus Dahm Byte Code Engineering Library (BCEL) diff --git a/xdocs/navigation.xml b/xdocs/navigation.xml index 01dd35a2..af35d259 100644 --- a/xdocs/navigation.xml +++ b/xdocs/navigation.xml @@ -13,7 +13,6 @@ - diff --git a/xdocs/news.xml b/xdocs/news.xml index 2c0421e4..03e6130d 100644 --- a/xdocs/news.xml +++ b/xdocs/news.xml @@ -10,22 +10,27 @@
    -

    27 October 2001 - BCEL moves to Jakarta!

    - +

    1 February 2006 - BCEL 5.2 released!

    - The Byte Code Engineering Library is now an official - subproject of Jakarta. A special thanks goes to Markus Dahm - for donating the code to the Jakarta Project. + The Byte Code Engineering Library version 5.2 has been released + after a long period of testing. It mainly contains bug fixes + and introduces the possibility to use custom repositories.

    25 April 2003 - BCEL 5.1 released!

    -

    The Byte Code Engineering Library version 5.1 has been released after a long period of testing. It mainly contains bug fixes and introduces the possibility to use custom repositories.

    +

    27 October 2001 - BCEL moves to Jakarta!

    +

    + The Byte Code Engineering Library is now an official + subproject of Jakarta. A special thanks goes to Markus Dahm + for donating the code to the Jakarta Project. +

    +
    diff --git a/xdocs/projects.xml b/xdocs/projects.xml index efe84cc8..15830d83 100644 --- a/xdocs/projects.xml +++ b/xdocs/projects.xml @@ -166,18 +166,13 @@

    Related Projects

    -- GitLab From 52b7fbfc9dcc793f1a9806ad2cd266d13aeb9a3b Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 8 Jan 2006 18:12:30 +0000 Subject: [PATCH 0299/1313] update email addr git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@367058 13f79535-47bb-0310-9956-ffa450edef68 --- project.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.xml b/project.xml index c208fa34..8e536d20 100644 --- a/project.xml +++ b/project.xml @@ -81,7 +81,7 @@ Dave Brosius dbrosius - dbrosius at qis.net + dbrosius at mebigfatguy.com -- GitLab From 1ceee6de62bb0b43a262783bb4bb5302601d5142 Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Thu, 19 Jan 2006 15:09:37 +0000 Subject: [PATCH 0300/1313] using bcel as a test zone for projects.apache.org; hope you guys don't mind. this one is generated from a project.xml git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@370493 13f79535-47bb-0310-9956-ffa450edef68 --- jakarta-bcel-doap.xml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 jakarta-bcel-doap.xml diff --git a/jakarta-bcel-doap.xml b/jakarta-bcel-doap.xml new file mode 100644 index 00000000..9ed88f3b --- /dev/null +++ b/jakarta-bcel-doap.xml @@ -0,0 +1,24 @@ + + + + jakarta-bcel + + Java + + + + + + Bytecode Engineering Library + + Bytecode Engineering Library + + + + + + + + + + -- GitLab From 063745255b3c9463a2ca9daee6aa2e7f4c7e8604 Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Thu, 19 Jan 2006 15:20:06 +0000 Subject: [PATCH 0301/1313] Apache now hardcoded to the front of doap names git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@370498 13f79535-47bb-0310-9956-ffa450edef68 --- jakarta-bcel-doap.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jakarta-bcel-doap.xml b/jakarta-bcel-doap.xml index 9ed88f3b..6bdee2d1 100644 --- a/jakarta-bcel-doap.xml +++ b/jakarta-bcel-doap.xml @@ -1,7 +1,7 @@ - jakarta-bcel + Apache jakarta-bcel Java -- GitLab From ed11de1e7c59706f8adae5933607695d3ccddafe Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Thu, 19 Jan 2006 16:12:29 +0000 Subject: [PATCH 0302/1313] fixed by hand git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@370518 13f79535-47bb-0310-9956-ffa450edef68 --- jakarta-bcel-doap.xml | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/jakarta-bcel-doap.xml b/jakarta-bcel-doap.xml index 6bdee2d1..70baf86a 100644 --- a/jakarta-bcel-doap.xml +++ b/jakarta-bcel-doap.xml @@ -1,24 +1,33 @@ - - Apache jakarta-bcel + + Apache Jakarta BCEL Java - + + + - - - + + + Bytecode Engineering Library - Bytecode Engineering Library - + The Byte Code Engineering Library is intended to give users a convenient possibility to analyze, create, and manipulate (binary) Java class files (those ending with .class). Classes are represented by objects which contain all the symbolic information of the given class: methods, fields and byte code instructions, in particular. + - + + + bcel + 2003-09-06 + 5.1 + + + -- GitLab From 58ade24c18d14f7cc622eed76d697eabe8c8f814 Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Fri, 20 Jan 2006 14:41:02 +0000 Subject: [PATCH 0303/1313] removed big ugly url git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@370820 13f79535-47bb-0310-9956-ffa450edef68 --- jakarta-bcel-doap.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jakarta-bcel-doap.xml b/jakarta-bcel-doap.xml index 70baf86a..aa639181 100644 --- a/jakarta-bcel-doap.xml +++ b/jakarta-bcel-doap.xml @@ -8,7 +8,7 @@ - + Bytecode Engineering Library -- GitLab From f6034c9dab637dcf1aee51de3e33b062594bb31e Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Fri, 20 Jan 2006 14:44:31 +0000 Subject: [PATCH 0304/1313] renaming to fit current std git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@370825 13f79535-47bb-0310-9956-ffa450edef68 --- jakarta-bcel-doap.xml => doap_bcel.rdf | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename jakarta-bcel-doap.xml => doap_bcel.rdf (100%) diff --git a/jakarta-bcel-doap.xml b/doap_bcel.rdf similarity index 100% rename from jakarta-bcel-doap.xml rename to doap_bcel.rdf -- GitLab From b6d605e1beba3ad9c1e5a94e4235fb7353dcecd1 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Mon, 23 Jan 2006 14:08:00 +0000 Subject: [PATCH 0305/1313] fixed broken links etc for the upcoming release git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@371539 13f79535-47bb-0310-9956-ffa450edef68 --- .settings/org.eclipse.jdt.core.prefs | 24 +++++++++---------- docs/verifier/JustIce.lyx | 8 +++---- project.properties | 18 +++++++++++++- project.xml | 15 +++++++----- .../org/apache/bcel/ExceptionConstants.java | 2 +- .../org/apache/bcel/classfile/PMGClass.java | 3 +-- .../org/apache/bcel/classfile/Signature.java | 2 +- .../org/apache/bcel/classfile/Visitor.java | 3 --- .../apache/bcel/generic/ExceptionThrower.java | 2 +- .../bcel/generic/ReturnaddressType.java | 2 +- src/java/org/apache/bcel/package.html | 2 +- .../apache/bcel/verifier/NativeVerifier.java | 2 +- .../apache/bcel/verifier/PassVerifier.java | 2 +- .../apache/bcel/verifier/TransitiveHull.java | 2 +- .../bcel/verifier/VerificationResult.java | 2 +- .../org/apache/bcel/verifier/Verifier.java | 2 +- .../apache/bcel/verifier/VerifierFactory.java | 2 +- .../verifier/VerifierFactoryObserver.java | 2 +- .../apache/bcel/verifier/VerifyDialog.java | 2 +- .../exc/AssertionViolatedException.java | 2 +- .../exc/ClassConstraintException.java | 2 +- .../verifier/exc/CodeConstraintException.java | 2 +- .../verifier/exc/InvalidMethodException.java | 2 +- .../exc/LinkingConstraintException.java | 2 +- .../bcel/verifier/exc/LoadingException.java | 2 +- ...ocalVariableInfoInconsistentException.java | 2 +- .../exc/StaticCodeConstraintException.java | 2 +- ...ticCodeInstructionConstraintException.java | 2 +- ...InstructionOperandConstraintException.java | 2 +- .../StructuralCodeConstraintException.java | 2 +- .../org/apache/bcel/verifier/exc/Utility.java | 2 +- .../verifier/exc/VerificationException.java | 2 +- .../VerifierConstraintViolatedException.java | 2 +- .../org/apache/bcel/verifier/exc/package.html | 7 ------ .../org/apache/bcel/verifier/package.html | 7 ------ .../bcel/verifier/statics/DOUBLE_Upper.java | 2 +- .../apache/bcel/verifier/statics/IntList.java | 2 +- .../bcel/verifier/statics/LONG_Upper.java | 2 +- .../verifier/statics/LocalVariableInfo.java | 2 +- .../verifier/statics/LocalVariablesInfo.java | 2 +- .../bcel/verifier/statics/Pass1Verifier.java | 2 +- .../bcel/verifier/statics/Pass2Verifier.java | 2 +- .../bcel/verifier/statics/Pass3aVerifier.java | 2 +- .../statics/StringRepresentation.java | 2 +- .../apache/bcel/verifier/statics/package.html | 7 ------ .../structurals/ControlFlowGraph.java | 2 +- .../structurals/ExceptionHandler.java | 2 +- .../structurals/ExceptionHandlers.java | 2 +- .../structurals/ExecutionVisitor.java | 2 +- .../bcel/verifier/structurals/Frame.java | 2 +- .../verifier/structurals/GenericArray.java | 2 +- .../structurals/InstConstraintVisitor.java | 2 +- .../structurals/InstructionContext.java | 2 +- .../verifier/structurals/LocalVariables.java | 2 +- .../verifier/structurals/OperandStack.java | 2 +- .../verifier/structurals/Pass3bVerifier.java | 2 +- .../bcel/verifier/structurals/Subroutine.java | 2 +- .../verifier/structurals/Subroutines.java | 2 +- .../structurals/UninitializedObjectType.java | 2 +- .../bcel/verifier/structurals/package.html | 7 ------ xdocs/faq.xml | 2 +- xdocs/manual.xml | 14 +++++------ xdocs/navigation.xml | 2 +- xdocs/projects.xml | 17 ++----------- 64 files changed, 103 insertions(+), 131 deletions(-) diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 4f219764..23ba23d0 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,12 @@ -#Sat Dec 24 12:26:49 CET 2005 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.4 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning -org.eclipse.jdt.core.compiler.source=1.3 +#Tue Jan 24 00:19:24 EST 2006 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.4 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning +org.eclipse.jdt.core.compiler.source=1.3 diff --git a/docs/verifier/JustIce.lyx b/docs/verifier/JustIce.lyx index 6d6bde19..67b7ffe0 100644 --- a/docs/verifier/JustIce.lyx +++ b/docs/verifier/JustIce.lyx @@ -134,7 +134,7 @@ Gubener Stra \newline D-10243 Berlin \newline -http://www.inf.fu-berlin.de/~ehaase + \layout Standard @@ -10355,7 +10355,7 @@ import de.fub.bytecode.*; \newline 11\SpecialChar ~ \SpecialChar ~ -* @author Enver Haase +* @author Enver Haase \newline 12\SpecialChar ~ \SpecialChar ~ @@ -14104,7 +14104,7 @@ Robert Tolksdorf: Programming Languages for the Java Virtual Machine. \newline \emph on -http://grunge.cs.tu-berlin.de/~tolk/vmlanguages.html +http://www.robert-tolksdorf.de/vmlanguages.html \layout Bibliography \bibitem [PMG-WWW]{PMG-WWW} @@ -14114,7 +14114,7 @@ PMG. \newline \emph on -http://www.inf.fu-berlin.de/~bokowski/pmgjava/index.html + \layout Bibliography \bibitem [Qian]{Qian} diff --git a/project.properties b/project.properties index 7795b12f..5af3109e 100644 --- a/project.properties +++ b/project.properties @@ -1,3 +1,19 @@ +maven.repo.list=apache.snapshots + +maven.repo.apache.snapshots=scp://cvs.apache.org +maven.repo.apache.snapshots.directory=/www/cvs.apache.org/repository +maven.repo.apache.snapshots.username=${maven.repo.apache.username} +maven.repo.apache.snapshots.privatekey=${maven.repo.apache.privatekey} +maven.repo.apache.snapshots.passphrase=${maven.repo.apache.passphrase} +maven.repo.apache.snapshots.group=apcvs + +maven.repo.apache.releases=scp://people.apache.org +maven.repo.apache.releases.directory=/www/www.apache.org/dist/java-repository +maven.repo.apache.releases.group=apcvs +#maven.repo.apache.releases.username= +#maven.repo.apache.releases.privatekey= +#maven.repo.apache.releases.passphrase= + #maven.mode.online = maven.username = ${user.name} @@ -19,7 +35,7 @@ maven.javadoc.links = http://java.sun.com/products/jdk/1.4/docs/api maven.changelog.factory = org.apache.maven.svnlib.SvnChangeLogFactory maven.xdoc.jsl = ../commons-build/commons-site.jsl -maven.xdoc.date = bottom +maven.xdoc.date = left maven.xdoc.poweredby.image = maven-feather.png maven.xdoc.version = ${pom.currentVersion} maven.xdoc.developmentProcessUrl = http://jakarta.apache.org/commons/charter.html diff --git a/project.xml b/project.xml index 8e536d20..588225f8 100644 --- a/project.xml +++ b/project.xml @@ -99,25 +99,28 @@ 1.2 - + src/java + + exclude = **/*.class + --> @@ -127,12 +130,12 @@ maven-changes-plugin maven-developer-activity-plugin maven-javadoc-plugin - maven-junit-report-plugin - maven-cobertura-plugin + + maven-jxr-plugin maven-pmd-plugin - maven-tasklist-plugin - + + maven-linkcheck-plugin diff --git a/src/java/org/apache/bcel/ExceptionConstants.java b/src/java/org/apache/bcel/ExceptionConstants.java index f801706b..06b77fb9 100644 --- a/src/java/org/apache/bcel/ExceptionConstants.java +++ b/src/java/org/apache/bcel/ExceptionConstants.java @@ -21,7 +21,7 @@ package org.apache.bcel; * Exception constants. * * @version $Id$ - * @author E. Haase + * @author E. Haase */ public interface ExceptionConstants { /** The mother of all exceptions diff --git a/src/java/org/apache/bcel/classfile/PMGClass.java b/src/java/org/apache/bcel/classfile/PMGClass.java index eee1bba6..1846feba 100644 --- a/src/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/java/org/apache/bcel/classfile/PMGClass.java @@ -24,8 +24,7 @@ import org.apache.bcel.Constants; /** * This class is derived from Attribute and represents a reference - * to a PMG - * attribute. + * to a PMG attribute. * * @version $Id$ * @author M. Dahm diff --git a/src/java/org/apache/bcel/classfile/Signature.java b/src/java/org/apache/bcel/classfile/Signature.java index d7460a93..abd49a9b 100644 --- a/src/java/org/apache/bcel/classfile/Signature.java +++ b/src/java/org/apache/bcel/classfile/Signature.java @@ -25,7 +25,7 @@ import org.apache.bcel.Constants; /** * This class is derived from Attribute and represents a reference - * to a GJ attribute. + * to a GJ attribute. * * @version $Id$ * @author M. Dahm diff --git a/src/java/org/apache/bcel/classfile/Visitor.java b/src/java/org/apache/bcel/classfile/Visitor.java index ef248f0e..ce54ffff 100644 --- a/src/java/org/apache/bcel/classfile/Visitor.java +++ b/src/java/org/apache/bcel/classfile/Visitor.java @@ -22,9 +22,6 @@ package org.apache.bcel.classfile; * I.e. a class that implements this interface can traverse the contents of * a Java class just by calling the `accept' method which all classes have. * - * Implemented by wish of - * Boris Bokowski. - * * @version $Id$ * @author M. Dahm */ diff --git a/src/java/org/apache/bcel/generic/ExceptionThrower.java b/src/java/org/apache/bcel/generic/ExceptionThrower.java index bec184b9..93335939 100644 --- a/src/java/org/apache/bcel/generic/ExceptionThrower.java +++ b/src/java/org/apache/bcel/generic/ExceptionThrower.java @@ -35,7 +35,7 @@ package org.apache.bcel.generic; * and "Error" objects. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public interface ExceptionThrower { public java.lang.Class[] getExceptions(); diff --git a/src/java/org/apache/bcel/generic/ReturnaddressType.java b/src/java/org/apache/bcel/generic/ReturnaddressType.java index 740d7cbf..38f60853 100644 --- a/src/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/java/org/apache/bcel/generic/ReturnaddressType.java @@ -23,7 +23,7 @@ import org.apache.bcel.Constants; * * see vmspec2 §3.3.3 * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class ReturnaddressType extends Type { diff --git a/src/java/org/apache/bcel/package.html b/src/java/org/apache/bcel/package.html index 0ea9520c..773bac10 100644 --- a/src/java/org/apache/bcel/package.html +++ b/src/java/org/apache/bcel/package.html @@ -10,7 +10,7 @@ $Id$ This package contains basic classes for the Byte Code Engineering Library and constants defined by the - + JVM specification.

    diff --git a/src/java/org/apache/bcel/verifier/NativeVerifier.java b/src/java/org/apache/bcel/verifier/NativeVerifier.java index c6ada6b1..20d5cd6f 100644 --- a/src/java/org/apache/bcel/verifier/NativeVerifier.java +++ b/src/java/org/apache/bcel/verifier/NativeVerifier.java @@ -25,7 +25,7 @@ package org.apache.bcel.verifier; * and JustIce. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public abstract class NativeVerifier{ diff --git a/src/java/org/apache/bcel/verifier/PassVerifier.java b/src/java/org/apache/bcel/verifier/PassVerifier.java index f5bb6e3b..34c5aea3 100644 --- a/src/java/org/apache/bcel/verifier/PassVerifier.java +++ b/src/java/org/apache/bcel/verifier/PassVerifier.java @@ -42,7 +42,7 @@ import java.util.List; * pass you must use a new instance of a given PassVerifier. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase * @see org.apache.bcel.verifier.Verifier * @see #verify() */ diff --git a/src/java/org/apache/bcel/verifier/TransitiveHull.java b/src/java/org/apache/bcel/verifier/TransitiveHull.java index f583ed67..96b54daa 100644 --- a/src/java/org/apache/bcel/verifier/TransitiveHull.java +++ b/src/java/org/apache/bcel/verifier/TransitiveHull.java @@ -27,7 +27,7 @@ import org.apache.bcel.classfile.JavaClass; * more notably, memory. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class TransitiveHull implements VerifierFactoryObserver{ diff --git a/src/java/org/apache/bcel/verifier/VerificationResult.java b/src/java/org/apache/bcel/verifier/VerificationResult.java index 20eac408..69f388a1 100644 --- a/src/java/org/apache/bcel/verifier/VerificationResult.java +++ b/src/java/org/apache/bcel/verifier/VerificationResult.java @@ -22,7 +22,7 @@ package org.apache.bcel.verifier; * after verifying. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase * */ public class VerificationResult{ diff --git a/src/java/org/apache/bcel/verifier/Verifier.java b/src/java/org/apache/bcel/verifier/Verifier.java index 4bd7a50f..a4237486 100644 --- a/src/java/org/apache/bcel/verifier/Verifier.java +++ b/src/java/org/apache/bcel/verifier/Verifier.java @@ -39,7 +39,7 @@ import org.apache.bcel.verifier.structurals.Pass3bVerifier; * Verifier instances are usually generated by the VerifierFactory. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase * @see org.apache.bcel.verifier.VerifierFactory * @see org.apache.bcel.verifier.PassVerifier */ diff --git a/src/java/org/apache/bcel/verifier/VerifierFactory.java b/src/java/org/apache/bcel/verifier/VerifierFactory.java index b7a7d693..fe7eadbf 100644 --- a/src/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/java/org/apache/bcel/verifier/VerifierFactory.java @@ -30,7 +30,7 @@ import java.util.Vector; * class name) there is exactly one Verifier. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase * @see org.apache.bcel.verifier.Verifier */ public class VerifierFactory{ diff --git a/src/java/org/apache/bcel/verifier/VerifierFactoryObserver.java b/src/java/org/apache/bcel/verifier/VerifierFactoryObserver.java index 9d3025be..178bd83b 100644 --- a/src/java/org/apache/bcel/verifier/VerifierFactoryObserver.java +++ b/src/java/org/apache/bcel/verifier/VerifierFactoryObserver.java @@ -22,7 +22,7 @@ package org.apache.bcel.verifier; * instances are created. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase * * @see VerifierFactory#getVerifier(String) * @see VerifierFactory#getVerifiers() diff --git a/src/java/org/apache/bcel/verifier/VerifyDialog.java b/src/java/org/apache/bcel/verifier/VerifyDialog.java index f2d4be97..4aae888b 100644 --- a/src/java/org/apache/bcel/verifier/VerifyDialog.java +++ b/src/java/org/apache/bcel/verifier/VerifyDialog.java @@ -31,7 +31,7 @@ import org.apache.bcel.classfile.JavaClass; * [This class was created using VisualAge for Java, * but it does not work under VAJ itself (Version 3.02 JDK 1.2)] * @version $Id$ - * @author Enver Haase + * @author Enver Haase * @see #main(String[]) * @see #VerifyDialog(String) */ diff --git a/src/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java index d6c5c146..fdfdde49 100644 --- a/src/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ b/src/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java @@ -22,7 +22,7 @@ package org.apache.bcel.verifier.exc; * this is due to an INTERNAL ERROR of BCEL's class file verifier "JustIce". * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public final class AssertionViolatedException extends RuntimeException{ /** The error message. */ diff --git a/src/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/java/org/apache/bcel/verifier/exc/ClassConstraintException.java index 656c7213..18bf94bc 100644 --- a/src/java/org/apache/bcel/verifier/exc/ClassConstraintException.java +++ b/src/java/org/apache/bcel/verifier/exc/ClassConstraintException.java @@ -23,7 +23,7 @@ package org.apache.bcel.verifier.exc; * in the Java Virtual Machine specification, 2nd edition. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class ClassConstraintException extends VerificationException{ /** diff --git a/src/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/java/org/apache/bcel/verifier/exc/CodeConstraintException.java index b2df5697..dae1bc89 100644 --- a/src/java/org/apache/bcel/verifier/exc/CodeConstraintException.java +++ b/src/java/org/apache/bcel/verifier/exc/CodeConstraintException.java @@ -22,7 +22,7 @@ package org.apache.bcel.verifier.exc; * "JustIce" involves verification that is usually delayed to pass 4. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public abstract class CodeConstraintException extends VerificationException{ /** diff --git a/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java index 50cd6b48..93fd7624 100644 --- a/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java +++ b/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java @@ -21,7 +21,7 @@ package org.apache.bcel.verifier.exc; * when the verification of a method is requested that does not exist. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class InvalidMethodException extends RuntimeException{ diff --git a/src/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java b/src/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java index 6f730490..2720f8e5 100644 --- a/src/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java +++ b/src/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java @@ -31,7 +31,7 @@ package org.apache.bcel.verifier.exc; * TODO: At this time, this class is not used in JustIce. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class LinkingConstraintException extends StructuralCodeConstraintException{ } diff --git a/src/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/java/org/apache/bcel/verifier/exc/LoadingException.java index 18f68eb2..d8c7e53d 100644 --- a/src/java/org/apache/bcel/verifier/exc/LoadingException.java +++ b/src/java/org/apache/bcel/verifier/exc/LoadingException.java @@ -22,7 +22,7 @@ package org.apache.bcel.verifier.exc; * the class file is malformed; so it is not conforming to the "Pass 1" verification * process as described in the Java Virtual Machine specification, 2nd. edition. * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class LoadingException extends VerifierConstraintViolatedException{ diff --git a/src/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java index 93eaae40..1121f2d8 100644 --- a/src/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java +++ b/src/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java @@ -25,7 +25,7 @@ package org.apache.bcel.verifier.exc; * Method object. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class LocalVariableInfoInconsistentException extends ClassConstraintException{ /** diff --git a/src/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java index 1fa6c246..ef24d1fc 100644 --- a/src/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java +++ b/src/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java @@ -25,7 +25,7 @@ package org.apache.bcel.verifier.exc; * is called pass 3a in JustIce. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public abstract class StaticCodeConstraintException extends CodeConstraintException{ public StaticCodeConstraintException(String message){ diff --git a/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java index 10e0937c..9e522381 100644 --- a/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java +++ b/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java @@ -28,7 +28,7 @@ package org.apache.bcel.verifier.exc; * Second Edition. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class StaticCodeInstructionConstraintException extends StaticCodeConstraintException{ public StaticCodeInstructionConstraintException(String message){ diff --git a/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java index 97af1d96..b1c125a1 100644 --- a/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java +++ b/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -28,7 +28,7 @@ package org.apache.bcel.verifier.exc; * Second Edition. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class StaticCodeInstructionOperandConstraintException extends StaticCodeConstraintException{ public StaticCodeInstructionOperandConstraintException(String message){ diff --git a/src/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java index 877787c3..4ddeb1b5 100644 --- a/src/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java +++ b/src/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java @@ -27,7 +27,7 @@ package org.apache.bcel.verifier.exc; * The data flow analysis of pass 3 is called pass 3b in JustIce. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class StructuralCodeConstraintException extends CodeConstraintException{ /** diff --git a/src/java/org/apache/bcel/verifier/exc/Utility.java b/src/java/org/apache/bcel/verifier/exc/Utility.java index 605de8eb..56a99c31 100644 --- a/src/java/org/apache/bcel/verifier/exc/Utility.java +++ b/src/java/org/apache/bcel/verifier/exc/Utility.java @@ -23,7 +23,7 @@ import java.io.StringWriter; /** * A utility class providing convenience methods concerning Throwable instances. * @version $Id$ - * @author Enver Haase + * @author Enver Haase * @see java.lang.Throwable */ public final class Utility{ diff --git a/src/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/java/org/apache/bcel/verifier/exc/VerificationException.java index ec98599d..c6b43178 100644 --- a/src/java/org/apache/bcel/verifier/exc/VerificationException.java +++ b/src/java/org/apache/bcel/verifier/exc/VerificationException.java @@ -27,7 +27,7 @@ package org.apache.bcel.verifier.exc; * defined to be the verification happening in passes 2 and 3. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public abstract class VerificationException extends VerifierConstraintViolatedException{ /** diff --git a/src/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java index 6488cd73..fe1f4168 100644 --- a/src/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java @@ -26,7 +26,7 @@ package org.apache.bcel.verifier.exc; * throw. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public abstract class VerifierConstraintViolatedException extends RuntimeException{ // /** The name of the offending class that did not pass the verifier. */ diff --git a/src/java/org/apache/bcel/verifier/exc/package.html b/src/java/org/apache/bcel/verifier/exc/package.html index 3d04b1b5..1ec56e3f 100644 --- a/src/java/org/apache/bcel/verifier/exc/package.html +++ b/src/java/org/apache/bcel/verifier/exc/package.html @@ -13,12 +13,5 @@ Exception classes used by JustIce, mostly used internally. You don't need to bot Contained in this package are Exception classes for use with the JustIce verifier. -

    Related Documentation

    - -For a simple demonstration of JustIce working, please see: - - diff --git a/src/java/org/apache/bcel/verifier/package.html b/src/java/org/apache/bcel/verifier/package.html index 5f73d77d..79cc44e1 100644 --- a/src/java/org/apache/bcel/verifier/package.html +++ b/src/java/org/apache/bcel/verifier/package.html @@ -14,12 +14,5 @@ BCEL's verifier JustIce is there to help you dump correct Java class files creat This is the top-level package of the JustIce verifier. To actually use it, have a look at the VerifierFactory and Verifier classes. -

    Related Documentation

    - -For a simple demonstration of JustIce working, please see: - - diff --git a/src/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java index b79b34a7..61ef4036 100644 --- a/src/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java +++ b/src/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java @@ -23,7 +23,7 @@ import org.apache.bcel.generic.Type; /** * This class represents the upper half of a DOUBLE variable. * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public final class DOUBLE_Upper extends Type{ diff --git a/src/java/org/apache/bcel/verifier/statics/IntList.java b/src/java/org/apache/bcel/verifier/statics/IntList.java index 617e1a00..3ac88c77 100644 --- a/src/java/org/apache/bcel/verifier/statics/IntList.java +++ b/src/java/org/apache/bcel/verifier/statics/IntList.java @@ -24,7 +24,7 @@ import java.util.List; * A small utility class representing a set of basic int values. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class IntList{ /** The int are stored as Integer objects here. */ diff --git a/src/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/java/org/apache/bcel/verifier/statics/LONG_Upper.java index ad0b8c0d..3e5cff41 100644 --- a/src/java/org/apache/bcel/verifier/statics/LONG_Upper.java +++ b/src/java/org/apache/bcel/verifier/statics/LONG_Upper.java @@ -23,7 +23,7 @@ import org.apache.bcel.generic.Type; /** * This class represents the upper half of a LONG variable. * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public final class LONG_Upper extends Type{ diff --git a/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java index 268df144..2f04457f 100644 --- a/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java +++ b/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java @@ -28,7 +28,7 @@ import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; * often changes in course of byte code offsets. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class LocalVariableInfo{ diff --git a/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java index 1dacd948..303cd58f 100644 --- a/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java +++ b/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java @@ -27,7 +27,7 @@ import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; * a given method. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class LocalVariablesInfo{ diff --git a/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index de925b93..d4b4fdfe 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -33,7 +33,7 @@ import org.apache.bcel.verifier.exc.Utility; * documentation. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase * @see #do_verify() */ public final class Pass1Verifier extends PassVerifier{ diff --git a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index d33cf3a5..b808748b 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -78,7 +78,7 @@ import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; * method's documentation. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase * @see #do_verify() */ public final class Pass2Verifier extends PassVerifier implements Constants{ diff --git a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 71d848fc..b99dea5a 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -105,7 +105,7 @@ import org.apache.bcel.verifier.exc.StaticCodeInstructionOperandConstraintExcept * method's documentation. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase * @see #do_verify() */ public final class Pass3aVerifier extends PassVerifier{ diff --git a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java index b1505cbe..66070fb2 100644 --- a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -65,7 +65,7 @@ import org.apache.bcel.verifier.exc.AssertionViolatedException; * handling in future versions of JustIce. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor implements Visitor { /** The string representation, created by a visitXXX() method, output by toString(). */ diff --git a/src/java/org/apache/bcel/verifier/statics/package.html b/src/java/org/apache/bcel/verifier/statics/package.html index b86c53b9..e0b624e3 100644 --- a/src/java/org/apache/bcel/verifier/statics/package.html +++ b/src/java/org/apache/bcel/verifier/statics/package.html @@ -15,12 +15,5 @@ Contained in this package are PassVerifier classes for use with the JustIce veri Only the passes performing what Sun calls 'static constraints' have PassVerifier classes here. -

    Related Documentation

    - -For a simple demonstration of JustIce working, please see: - - diff --git a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index 38bd91df..ca318810 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -37,7 +37,7 @@ import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; * This class represents a control flow graph of a method. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class ControlFlowGraph{ diff --git a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java index 00939e2a..1dcb7df3 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java +++ b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java @@ -26,7 +26,7 @@ import org.apache.bcel.generic.ObjectType; * the handler starts off (represented by an InstructionContext). * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class ExceptionHandler{ /** The type of the exception to catch. NULL means ANY. */ diff --git a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index af64357a..44fe9509 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -28,7 +28,7 @@ import org.apache.bcel.generic.MethodGen; * This class allows easy access to ExceptionHandler objects. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class ExceptionHandlers{ /** diff --git a/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index e5451dad..ffe02cf6 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -50,7 +50,7 @@ import org.apache.bcel.generic.*; * is given the type Type.UNKNOWN. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase * @see #visitDSTORE(DSTORE o) * @see InstConstraintVisitor */ diff --git a/src/java/org/apache/bcel/verifier/structurals/Frame.java b/src/java/org/apache/bcel/verifier/structurals/Frame.java index 10fc2c79..91182a27 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Frame.java +++ b/src/java/org/apache/bcel/verifier/structurals/Frame.java @@ -23,7 +23,7 @@ package org.apache.bcel.verifier.structurals; * a local variable array and an operand stack. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class Frame{ diff --git a/src/java/org/apache/bcel/verifier/structurals/GenericArray.java b/src/java/org/apache/bcel/verifier/structurals/GenericArray.java index b881b371..a2948be9 100644 --- a/src/java/org/apache/bcel/verifier/structurals/GenericArray.java +++ b/src/java/org/apache/bcel/verifier/structurals/GenericArray.java @@ -23,7 +23,7 @@ package org.apache.bcel.verifier.structurals; * and java.io.Serializable and they extend java.lang.Object. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class GenericArray extends java.lang.Object implements java.lang.Cloneable, java.io.Serializable{ diff --git a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 8cab025c..b51a9632 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -46,7 +46,7 @@ import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; * MONITOREXIT) is not modeled in JustIce. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase * @see org.apache.bcel.verifier.exc.StructuralCodeConstraintException * @see org.apache.bcel.verifier.exc.LinkingConstraintException */ diff --git a/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java index f8bc6b54..7d7cda9e 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -26,7 +26,7 @@ import org.apache.bcel.generic.InstructionHandle; * such. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public interface InstructionContext{ diff --git a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 404ac47b..8ddd74f6 100644 --- a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -27,7 +27,7 @@ import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; * simulation. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class LocalVariables{ /** The Type[] containing the local variable slots. */ diff --git a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/java/org/apache/bcel/verifier/structurals/OperandStack.java index 445018dd..8a50df94 100644 --- a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -30,7 +30,7 @@ import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; * Elements of this stack are org.apache.bcel.generic.Type objects. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class OperandStack{ diff --git a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 8b9946f7..a339e220 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -51,7 +51,7 @@ import org.apache.bcel.verifier.exc.VerifierConstraintViolatedException; * documentation. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase * @see #do_verify() */ diff --git a/src/java/org/apache/bcel/verifier/structurals/Subroutine.java b/src/java/org/apache/bcel/verifier/structurals/Subroutine.java index d932e79d..20274d8e 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Subroutine.java +++ b/src/java/org/apache/bcel/verifier/structurals/Subroutine.java @@ -25,7 +25,7 @@ import org.apache.bcel.generic.InstructionHandle; * consistent fashion, too. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public interface Subroutine{ /** diff --git a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java index 93e73013..0718e0a8 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -60,7 +60,7 @@ import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; * TODO: refer to the paper. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase * @see #getTopLevel() */ public class Subroutines{ diff --git a/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index a66191ee..bb05c00b 100644 --- a/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -27,7 +27,7 @@ import org.apache.bcel.generic.ReferenceType; * more details. * * @version $Id$ - * @author Enver Haase + * @author Enver Haase */ public class UninitializedObjectType extends ReferenceType implements Constants{ diff --git a/src/java/org/apache/bcel/verifier/structurals/package.html b/src/java/org/apache/bcel/verifier/structurals/package.html index 915ff5e9..94ba2fa8 100644 --- a/src/java/org/apache/bcel/verifier/structurals/package.html +++ b/src/java/org/apache/bcel/verifier/structurals/package.html @@ -16,12 +16,5 @@ Contained in this package is a PassVerifier class for use with the JustIce verif Only the pass performing what Sun calls "Structural Constraints on Java Virtual Machine Code" has a PassVerifier class here. JustIce calls this pass "Pass 3b". -

    Related Documentation

    - -For a simple demonstration of JustIce working, please see: - - diff --git a/xdocs/faq.xml b/xdocs/faq.xml index 1324e900..f623f4db 100644 --- a/xdocs/faq.xml +++ b/xdocs/faq.xml @@ -33,7 +33,7 @@ A: Yes, this is covered by the Apache License, if you add a note about the original author and where to find the sources, i.e., - http://jakarta.apace.org/bcel/ + http://jakarta.apace.org/bcel/

    diff --git a/xdocs/manual.xml b/xdocs/manual.xml index fe91b19c..882ddbcf 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -14,7 +14,7 @@ the subject of a large number of research projects and proposals. There are projects, for instance, to add parameterized types to Java, to implement Aspect-Oriented Programming, to + href="http://www.eclipse.org/aspectj/">Aspect-Oriented Programming, to perform sophisticated static analysis, and to improve the run-time performance.

    @@ -131,7 +131,7 @@ meanings: on the one hand, Java as a programming language, on the other hand, the Java Virtual Machine, which is not necessarily targeted by the Java language exclusively, but may be used by other + href="http://www.robert-tolksdorf.de/vmlanguages.html">other languages as well. We assume the reader to be familiar with the Java language and to have a general understanding of the Virtual Machine. @@ -1224,7 +1224,7 @@ classes by inserting calls to profiling methods into the code. Further examples are extending Java with Eiffel-like assertions, automated delegation, or with the concepts of Aspect-Oriented Programming.
    A + href="http://www.eclipse.org/aspectj/">Aspect-Oriented Programming.
    A list of projects using BCEL can be found here.

    @@ -1276,17 +1276,15 @@ original byte code. In fact, class loaders may even create classes ad hoc without loading a file at all.
    BCEL has already builtin support for - dynamically creating classes, an example is the ProxyCreator class. + dynamically creating classes, an example is the ProxyCreator class.

    - The "Poor - Man's Genericity" project that extends Java with parameterized - classes, for example, uses BCEL in two places to generate instances of parameterized classes: During compile-time (with the standard javac with some slightly changed classes) and at diff --git a/xdocs/navigation.xml b/xdocs/navigation.xml index af35d259..eca41986 100644 --- a/xdocs/navigation.xml +++ b/xdocs/navigation.xml @@ -7,7 +7,7 @@

    - + diff --git a/xdocs/projects.xml b/xdocs/projects.xml index 15830d83..73c4a228 100644 --- a/xdocs/projects.xml +++ b/xdocs/projects.xml @@ -72,10 +72,6 @@
  • Gretel - Residual Test Coverage Tool
  • -
  • - Poor Man's Genericity -
  • -
  • Mobile Code Security Through Java Byte-Code Modification
  • @@ -105,7 +101,7 @@
  • AspectJ: Aspect-oriented Java
  • @@ -148,11 +144,6 @@ Heap Usage Profiling -
  • Prolog -
  • - -
  • JHEAT
  • -
  • Import Scrubber
  • @@ -166,14 +157,10 @@

    Related Projects

    -- GitLab From ae6d54e80864e91787c86d79a54eeee87d485ed7 Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Tue, 24 Jan 2006 14:31:21 +0000 Subject: [PATCH 0306/1313] fixing pmc git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@371926 13f79535-47bb-0310-9956-ffa450edef68 --- doap_bcel.rdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doap_bcel.rdf b/doap_bcel.rdf index aa639181..58c81f64 100644 --- a/doap_bcel.rdf +++ b/doap_bcel.rdf @@ -10,7 +10,7 @@ - + Bytecode Engineering Library The Byte Code Engineering Library is intended to give users a convenient possibility to analyze, create, and manipulate (binary) Java class files (those ending with .class). Classes are represented by objects which contain all the symbolic information of the given class: methods, fields and byte code instructions, in particular. -- GitLab From 0fc434dd6868c1b3d40f998a670af9b48e9ca180 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Fri, 27 Jan 2006 12:34:16 +0000 Subject: [PATCH 0307/1313] compile for 1.3 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@372823 13f79535-47bb-0310-9956-ffa450edef68 --- project.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/project.properties b/project.properties index 5af3109e..fd52d399 100644 --- a/project.properties +++ b/project.properties @@ -21,6 +21,8 @@ maven.username = ${user.name} maven.compile.debug = on maven.compile.deprecation = off maven.compile.optimize = off +maven.compile.source = 1.3 +maven.compile.target = 1.3 maven.jarResources.basedir = src/java maven.jar.excludes = **/package.html -- GitLab From 9e91928455484dc215a14742cbf4e46b16f25f61 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Fri, 27 Jan 2006 13:27:25 +0000 Subject: [PATCH 0308/1313] include the notice as well git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@372842 13f79535-47bb-0310-9956-ffa450edef68 --- maven.xml | 33 +++++++++++++++++++++++++++++++++ project.xml | 12 +++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 maven.xml diff --git a/maven.xml b/maven.xml new file mode 100644 index 00000000..c5f1f8d7 --- /dev/null +++ b/maven.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + diff --git a/project.xml b/project.xml index 588225f8..29f4c7ae 100644 --- a/project.xml +++ b/project.xml @@ -114,6 +114,16 @@ src/java + + + ${basedir} + + NOTICE.txt + + META-INF + + + - maven-linkcheck-plugin + -- GitLab From 034c46a950d994454d150c2a272b33ce783d26ef Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Thu, 2 Feb 2006 03:09:59 +0000 Subject: [PATCH 0309/1313] fixed bug 38424 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@374237 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/LineNumberTable.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/LineNumberTable.java b/src/java/org/apache/bcel/classfile/LineNumberTable.java index d3bddc95..09ca71c5 100644 --- a/src/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/java/org/apache/bcel/classfile/LineNumberTable.java @@ -19,6 +19,7 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.DataOutputStream; +import java.io.File; import java.io.IOException; import org.apache.bcel.Constants; @@ -122,17 +123,19 @@ public final class LineNumberTable extends Attribute { public final String toString() { StringBuffer buf = new StringBuffer(); StringBuffer line = new StringBuffer(); + String newLine = System.getProperty("line.separator", "\n"); for(int i=0; i < line_number_table_length; i++) { line.append(line_number_table[i].toString()); - if(i < line_number_table_length - 1) - line.append(", "); + if(i < line_number_table_length - 1) { + line.append(", "); + } if(line.length() > 72) { - line.append('\n'); - buf.append(line); - line.setLength(0); + line.append(newLine); + buf.append(line.toString()); + line.setLength(0); } } -- GitLab From ff2d1dc34bd2da10ea8f71dceb50208564297d2e Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 14 Feb 2006 02:05:16 +0000 Subject: [PATCH 0310/1313] add javadoc with warning about tricky autoboxing issue with the PUSH constructor. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@377575 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/PUSH.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/java/org/apache/bcel/generic/PUSH.java b/src/java/org/apache/bcel/generic/PUSH.java index c05d197c..25c7944c 100644 --- a/src/java/org/apache/bcel/generic/PUSH.java +++ b/src/java/org/apache/bcel/generic/PUSH.java @@ -125,6 +125,9 @@ public final class PUSH } /** + * creates a push object from a Character value. Warning: Make sure not to attempt to allow + * autoboxing to create this value parameter, as an alternative constructor will be called + * * @param cp Constant pool * @param value to be pushed */ -- GitLab From 2b0c79fc9b37d0c5f4dec23c94aa5ccbbc463e56 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 27 Feb 2006 01:11:17 +0000 Subject: [PATCH 0311/1313] Bug: 38787 - Instructions are assumed to be english, to avoid odd Locale issues git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@381213 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/InstructionFinder.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/util/InstructionFinder.java b/src/java/org/apache/bcel/util/InstructionFinder.java index 459ca819..0374526a 100644 --- a/src/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/java/org/apache/bcel/util/InstructionFinder.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -136,7 +137,8 @@ public class InstructionFinder { * @return translated regular expression string */ private static final String compilePattern(String pattern) { - String lower = pattern.toLowerCase(); + //Bug: 38787 - Instructions are assumed to be english, to avoid odd Locale issues + String lower = pattern.toLowerCase(Locale.ENGLISH); StringBuffer buf = new StringBuffer(); int size = pattern.length(); -- GitLab From 2e296faf208a8331e24633c85acfbcbeab63de0c Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Thu, 2 Mar 2006 02:10:23 +0000 Subject: [PATCH 0312/1313] fixes http://issues.apache.org/bugzilla/show_bug.cgi?id=38377 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382242 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/ClassLoader.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/java/org/apache/bcel/util/ClassLoader.java b/src/java/org/apache/bcel/util/ClassLoader.java index 61655e8e..5ede489f 100644 --- a/src/java/org/apache/bcel/util/ClassLoader.java +++ b/src/java/org/apache/bcel/util/ClassLoader.java @@ -60,7 +60,6 @@ public class ClassLoader extends java.lang.ClassLoader { private String[] ignored_packages; private Repository repository = SyntheticRepository.getInstance(); - private java.lang.ClassLoader deferTo = ClassLoader.getSystemClassLoader(); /** Ignored packages are by default ( "java.", "sun.", * "javax."), i.e. loaded by system class loader @@ -72,8 +71,8 @@ public class ClassLoader extends java.lang.ClassLoader { /** @param deferTo delegate class loader to use for ignored packages */ public ClassLoader(java.lang.ClassLoader deferTo) { - this(); - this.deferTo = deferTo; + super(deferTo); + this.ignored_packages = DEFAULT_IGNORED_PACKAGES; this.repository = new ClassLoaderRepository(deferTo); } @@ -90,7 +89,6 @@ public class ClassLoader extends java.lang.ClassLoader { */ public ClassLoader(java.lang.ClassLoader deferTo, String [] ignored_packages) { this(ignored_packages); - this.deferTo = deferTo; this.repository = new ClassLoaderRepository(deferTo); } @@ -107,7 +105,7 @@ public class ClassLoader extends java.lang.ClassLoader { */ for(int i=0; i < ignored_packages.length; i++) { if(class_name.startsWith(ignored_packages[i])) { - cl = deferTo.loadClass(class_name); + cl = getParent().loadClass(class_name); break; } } -- GitLab From 4ddb0bee87c8deccef0cbc59e50fc029cb3e6288 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 2 Mar 2006 03:21:13 +0000 Subject: [PATCH 0313/1313] javadoc fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382262 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/AnnotationDefault.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/java/org/apache/bcel/classfile/AnnotationDefault.java index 67d0ed0b..89df75e7 100644 --- a/src/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -76,7 +76,7 @@ public abstract class AnnotationDefault extends Attribute { } /** - * @returns the default value + * @return the default value */ public final ElementValue getDefaultValue() { -- GitLab From d1ffa4a26ed0a62dfd663f1f03899d3c35da0bc1 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 2 Mar 2006 03:21:54 +0000 Subject: [PATCH 0314/1313] javadoc fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382263 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/AnnotationEntry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/java/org/apache/bcel/classfile/AnnotationEntry.java index e5794a47..63c417b8 100644 --- a/src/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -73,7 +73,7 @@ public class AnnotationEntry implements Node, Constants } /** - * @returns the number of element value pairs in this annotation entry + * @return the number of element value pairs in this annotation entry */ public final int getNumElementValuePairs() { return num_element_value_pairs; } -- GitLab From 53a5690851939ec6ae0ce988a7683565fc353d57 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 2 Mar 2006 03:22:22 +0000 Subject: [PATCH 0315/1313] javadoc fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382264 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/Annotations.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/Annotations.java b/src/java/org/apache/bcel/classfile/Annotations.java index c2848e1c..1d808731 100644 --- a/src/java/org/apache/bcel/classfile/Annotations.java +++ b/src/java/org/apache/bcel/classfile/Annotations.java @@ -85,7 +85,7 @@ public abstract class Annotations extends Attribute { } /** - * @returns the annotation entry table + * @return the annotation entry table */ public final AnnotationEntry[] getAnnotationTable() { @@ -100,7 +100,7 @@ public abstract class Annotations extends Attribute { } /** - * @returns the number of annotation entries in this annotation + * @return the number of annotation entries in this annotation */ public final int getNumAnnotations() { return annotation_table_length; } } -- GitLab From b278d6a85189d7df38cba762131ccd3473121177 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Thu, 2 Mar 2006 03:22:59 +0000 Subject: [PATCH 0316/1313] applied http://issues.apache.org/bugzilla/show_bug.cgi?id=26049 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382265 13f79535-47bb-0310-9956-ffa450edef68 --- .../structurals/InstConstraintVisitor.java | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index b51a9632..ec53c58f 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -371,9 +371,9 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if ( (!(stacktop instanceof ReferenceType)) && (!(stacktop instanceof ReturnaddressType)) ){ constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction expects a ReferenceType or a ReturnadressType."); } - if (stacktop instanceof ReferenceType){ - referenceTypeIsInitialized(o, (ReferenceType) stacktop); - } + //if (stacktop instanceof ReferenceType){ + // referenceTypeIsInitialized(o, (ReferenceType) stacktop); + //} } } @@ -437,7 +437,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); } - referenceTypeIsInitialized(o, (ReferenceType) (((ArrayType) arrayref).getElementType())); + //referenceTypeIsInitialized(o, (ReferenceType) (((ArrayType) arrayref).getElementType())); } } @@ -454,7 +454,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (!(value instanceof ReferenceType)){ constraintViolated(o, "The 'value' is not of a ReferenceType but of type "+value+"."); }else{ - referenceTypeIsInitialized(o, (ReferenceType) value); + //referenceTypeIsInitialized(o, (ReferenceType) value); } // Don't bother further with "referenceTypeIsInitialized()", there are no arrays // of an uninitialized object type. @@ -531,9 +531,9 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (! ( (stack().peek() instanceof ReferenceType) || (stack().peek() instanceof ReturnaddressType) ) ){ constraintViolated(o, "The 'objectref' is not of a ReferenceType or of ReturnaddressType but of "+stack().peek()+"."); } - if (stack().peek() instanceof ReferenceType){ - referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); - } + //if (stack().peek() instanceof ReferenceType){ + // referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + //} } /** @@ -644,9 +644,9 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (!(objectref instanceof ReferenceType)){ constraintViolated(o, "The 'objectref' is not of a ReferenceType but of type "+objectref+"."); } - else{ - referenceTypeIsInitialized(o, (ReferenceType) objectref); - } + //else{ + // referenceTypeIsInitialized(o, (ReferenceType) objectref); + //} // The unsigned indexbyte1 and indexbyte2 are used to construct an index into the runtime constant pool of the // current class (§3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant // pool item at the index must be a symbolic reference to a class, array, or interface type. @@ -1393,12 +1393,12 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (!(stack().peek() instanceof ReferenceType)){ constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); } - referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); if (!(stack().peek(1) instanceof ReferenceType)){ constraintViolated(o, "The value at the stack next-to-top is not of a ReferenceType, but of type '"+stack().peek(1)+"'."); } - referenceTypeIsInitialized(o, (ReferenceType) (stack().peek(1)) ); + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek(1)) ); } @@ -1408,11 +1408,11 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc public void visitIF_ACMPNE(IF_ACMPNE o){ if (!(stack().peek() instanceof ReferenceType)){ constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); - referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); } if (!(stack().peek(1) instanceof ReferenceType)){ constraintViolated(o, "The value at the stack next-to-top is not of a ReferenceType, but of type '"+stack().peek(1)+"'."); - referenceTypeIsInitialized(o, (ReferenceType) (stack().peek(1)) ); + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek(1)) ); } } @@ -1625,9 +1625,9 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (!(objectref instanceof ReferenceType)){ constraintViolated(o, "The 'objectref' is not of a ReferenceType but of type "+objectref+"."); } - else{ - referenceTypeIsInitialized(o, (ReferenceType) objectref); - } + //else{ + // referenceTypeIsInitialized(o, (ReferenceType) objectref); + //} // The unsigned indexbyte1 and indexbyte2 are used to construct an index into the runtime constant pool of the // current class (§3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant // pool item at the index must be a symbolic reference to a class, array, or interface type. @@ -1678,13 +1678,14 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } if (! fromStack.equals(fromDesc)){ if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ - //ReferenceType rFromStack = (ReferenceType) fromStack; + ReferenceType rFromStack = (ReferenceType) fromStack; //ReferenceType rFromDesc = (ReferenceType) fromDesc; // TODO: This can only be checked when using Staerk-et-al's "set of object types" // instead of a "wider cast object type" created during verification. //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); //} + referenceTypeIsInitialized(o, rFromStack); } else{ constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); @@ -1770,6 +1771,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); } + referenceTypeIsInitialized(o, rFromStack); } else{ constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); @@ -1855,6 +1857,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); } + referenceTypeIsInitialized(o, rFromStack); } else{ constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); @@ -1906,6 +1909,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); } + referenceTypeIsInitialized(o, rFromStack); } else{ constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); @@ -2368,7 +2372,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (! ((stack().peek()) instanceof ReferenceType)){ constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); } - referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); } /** @@ -2378,7 +2382,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (! ((stack().peek()) instanceof ReferenceType)){ constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); } - referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); } /** -- GitLab From 3888394f430e7d338af532faf41d1145ae44fb42 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 2 Mar 2006 03:25:14 +0000 Subject: [PATCH 0317/1313] javadoc fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382269 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/ConstantValue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/ConstantValue.java b/src/java/org/apache/bcel/classfile/ConstantValue.java index c041fa16..21e8c189 100644 --- a/src/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/java/org/apache/bcel/classfile/ConstantValue.java @@ -49,7 +49,7 @@ public final class ConstantValue extends Attribute { * @param length Content length in bytes * @param file Input stream * @param constant_pool Array of constants - * @throw IOException + * @throws IOException */ ConstantValue(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException -- GitLab From 87ef0ad4e4760c57a6140cfbd42efaf8d628a20b Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Thu, 2 Mar 2006 03:31:46 +0000 Subject: [PATCH 0318/1313] applied http://issues.apache.org/bugzilla/show_bug.cgi?id=27854 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382272 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/structurals/ControlFlowGraph.java | 13 +++++++++++++ .../verifier/structurals/InstructionContext.java | 2 ++ 2 files changed, 15 insertions(+) diff --git a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index ca318810..2118dc26 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -124,6 +124,19 @@ public class ControlFlowGraph{ return org.getClone(); } + public Frame getInFrame() { + Frame org; + + InstructionContext jsr = lastExecutionJSR(); + + org = (Frame) inFrames.get(jsr); + + if (org == null){ + throw new AssertionViolatedException("inFrame not set! This:\n"+this+"\nInFrames: '"+inFrames+"'."); + } + return org.getClone(); + } + /** * "Merges in" (vmspec2, page 146) the "incoming" frame situation; * executes the instructions symbolically diff --git a/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java index 7d7cda9e..774072e6 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -73,6 +73,8 @@ public interface InstructionContext{ */ boolean execute(Frame inFrame, ArrayList executionPredecessors, InstConstraintVisitor icv, ExecutionVisitor ev); + Frame getInFrame(); + /** * This method returns the outgoing execution frame situation; * therefore it has to be calculated by execute(Frame, ArrayList) -- GitLab From 770ceafed9ec829314b8e095e01ff39474566908 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 2 Mar 2006 03:32:47 +0000 Subject: [PATCH 0319/1313] if attributes parameter is null, would get NPE, fixed. Problem exacerbated by hidding member name with parameter name. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382273 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/JavaClass.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 9a543003..0e646e57 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -127,7 +127,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl if (interfaces == null) // Allowed for backward compatibility interfaces = new int[0]; if (attributes == null) - this.attributes = new Attribute[0]; + attributes = new Attribute[0]; if (fields == null) fields = new Field[0]; if (methods == null) @@ -261,9 +261,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl if (parent != null) { File dir = new File(parent); - - if (dir != null) - dir.mkdirs(); + dir.mkdirs(); } DataOutputStream dos = null; -- GitLab From 45ffef315f40d0b2e553b53ee53bd02acae46306 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 2 Mar 2006 03:33:21 +0000 Subject: [PATCH 0320/1313] organize imports git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382274 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/LineNumberTable.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/LineNumberTable.java b/src/java/org/apache/bcel/classfile/LineNumberTable.java index 09ca71c5..c99d73f7 100644 --- a/src/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/java/org/apache/bcel/classfile/LineNumberTable.java @@ -19,7 +19,6 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.DataOutputStream; -import java.io.File; import java.io.IOException; import org.apache.bcel.Constants; -- GitLab From 7945ef82318516ff6fe228f28bba24e1264002a1 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 2 Mar 2006 03:33:56 +0000 Subject: [PATCH 0321/1313] javadoc fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382275 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/LocalVariableTable.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/java/org/apache/bcel/classfile/LocalVariableTable.java index 67b7da23..37caaa13 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -115,7 +115,7 @@ public class LocalVariableTable extends Attribute { * * @param index the variable slot * - * @returns the first LocalVariable that matches the slot or null if not found + * @return the first LocalVariable that matches the slot or null if not found * * @deprecated since 5.2 because multiple variables can share the * same slot, use getLocalVariable(int index, int pc) instead. @@ -134,7 +134,7 @@ public class LocalVariableTable extends Attribute { * @param index the variable slot * @param pc the current pc that this variable is alive * - * @returns the LocalVariable that matches or null if not found + * @return the LocalVariable that matches or null if not found */ public final LocalVariable getLocalVariable(int index, int pc) { for(int i=0; i < local_variable_table_length; i++) -- GitLab From 69ce6659f7c9e4fcae2864d26151cd27b4c0dd59 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 2 Mar 2006 03:34:26 +0000 Subject: [PATCH 0322/1313] javadoc fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382276 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/ParameterAnnotationEntry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index d9d478d0..5676beaa 100644 --- a/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -59,7 +59,7 @@ public class ParameterAnnotationEntry implements Node, Constants } /** - * @returns the number of annotation entries in this parameter annotation + * @return the number of annotation entries in this parameter annotation */ public final int getNumAnnotations() { return annotation_table_length; } -- GitLab From cef0ee4b770ad8f4f12991ce1000457419de429b Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 2 Mar 2006 03:34:54 +0000 Subject: [PATCH 0323/1313] javadoc fixes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382277 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/ParameterAnnotations.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/java/org/apache/bcel/classfile/ParameterAnnotations.java index 5afb7e80..7e8d3700 100644 --- a/src/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -85,7 +85,7 @@ public abstract class ParameterAnnotations extends Attribute { } /** - * @returns the parameter annotation entry table + * @return the parameter annotation entry table */ public final ParameterAnnotationEntry[] getParameterAnnotationTable() { @@ -100,7 +100,7 @@ public abstract class ParameterAnnotations extends Attribute { } /** - * @returns the number of parameter annotation entries in this parameter annotation + * @return the number of parameter annotation entries in this parameter annotation */ public final int getNumParameterAnnotation() { return num_parameters; } } -- GitLab From ec123d1c1930c7133c584e932af3b3bf39e57700 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Thu, 2 Mar 2006 03:39:28 +0000 Subject: [PATCH 0324/1313] applied http://issues.apache.org/bugzilla/show_bug.cgi?id=37648 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382279 13f79535-47bb-0310-9956-ffa450edef68 --- examples/JasminVisitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/JasminVisitor.java b/examples/JasminVisitor.java index b1992184..e277f1fd 100644 --- a/examples/JasminVisitor.java +++ b/examples/JasminVisitor.java @@ -55,7 +55,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { public void visitField(Field field) { out.print(".field " + Utility.accessToString(field.getAccessFlags()) + - " " + field.getName() + " " + field.getSignature()); + " \"" +field.getName() + "\"" + field.getSignature()); if(field.getAttributes().length == 0) out.print("\n"); } -- GitLab From ac72b64cb73a5a680f8059b695f2ca22d520613b Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Thu, 2 Mar 2006 03:50:02 +0000 Subject: [PATCH 0325/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=24766 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382284 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/Utility.java | 3 ++- src/java/org/apache/bcel/generic/Instruction.java | 3 ++- src/java/org/apache/bcel/util/BCELFactory.java | 11 ++++++----- src/java/org/apache/bcel/util/BCELifier.java | 4 ++-- src/java/org/apache/bcel/util/ClassPath.java | 3 ++- .../apache/bcel/verifier/statics/Pass2Verifier.java | 3 ++- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 7c44f976..992acfa4 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -30,6 +30,7 @@ import java.io.Reader; import java.io.Writer; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; @@ -1014,7 +1015,7 @@ public abstract class Utility { /** Map opcode names to opcode numbers. E.g., return Constants.ALOAD for "aload" */ public static short searchOpcode(String name) { - name = name.toLowerCase(); + name = name.toLowerCase(Locale.ENGLISH); for(short i=0; i < Constants.OPCODE_NAMES.length; i++) if(Constants.OPCODE_NAMES[i].equals(name)) diff --git a/src/java/org/apache/bcel/generic/Instruction.java b/src/java/org/apache/bcel/generic/Instruction.java index af10caf6..ee385a0d 100644 --- a/src/java/org/apache/bcel/generic/Instruction.java +++ b/src/java/org/apache/bcel/generic/Instruction.java @@ -20,6 +20,7 @@ package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; +import java.util.Locale; import org.apache.bcel.Constants; import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.util.ByteSequence; @@ -178,7 +179,7 @@ public abstract class Instruction implements Cloneable, Serializable { } private static final String className(short opcode) { - String name = Constants.OPCODE_NAMES[opcode].toUpperCase(); + String name = Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH); /* ICONST_0, etc. will be shortened to ICONST, etc., since ICONST_0 and the like * are not implemented (directly). diff --git a/src/java/org/apache/bcel/util/BCELFactory.java b/src/java/org/apache/bcel/util/BCELFactory.java index 2d8028f7..bcedd409 100644 --- a/src/java/org/apache/bcel/util/BCELFactory.java +++ b/src/java/org/apache/bcel/util/BCELFactory.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.Map; import org.apache.bcel.Constants; @@ -97,7 +98,7 @@ class BCELFactory extends EmptyVisitor { !(i instanceof ConstantPushInstruction) && !(i instanceof ReturnInstruction)) { // Handled below _out.println("il.append(InstructionConstants." + - i.getName().toUpperCase() + ");"); + i.getName().toUpperCase(Locale.ENGLISH) + ");"); return true; } @@ -138,7 +139,7 @@ class BCELFactory extends EmptyVisitor { _out.println("il.append(_factory.createFieldAccess(\"" + class_name + "\", \"" + field_name + "\", " + BCELifier.printType(type) + ", " + - "Constants." + Constants.OPCODE_NAMES[opcode].toUpperCase() + + "Constants." + Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH) + "));"); } @@ -153,7 +154,7 @@ class BCELFactory extends EmptyVisitor { class_name + "\", \"" + method_name + "\", " + BCELifier.printType(type) + ", " + BCELifier.printArgumentTypes(arg_types) + ", " + - "Constants." + Constants.OPCODE_NAMES[opcode].toUpperCase() + + "Constants." + Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH) + "));"); } @@ -260,7 +261,7 @@ class BCELFactory extends EmptyVisitor { args.append(" }"); _out.print("Select " + name + " = new " + - bi.getName().toUpperCase() + "(" + args + + bi.getName().toUpperCase(Locale.ENGLISH) + "(" + args + ", new InstructionHandle[] { "); for(int i=0; i < matchs.length; i++) { @@ -284,7 +285,7 @@ class BCELFactory extends EmptyVisitor { _out.println(" BranchInstruction " + name + " = _factory.createBranchInstruction(" + - "Constants." + bi.getName().toUpperCase() + ", " + + "Constants." + bi.getName().toUpperCase(Locale.ENGLISH) + ", " + target + ");"); } diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java index d268ebc2..7c6d2e28 100644 --- a/src/java/org/apache/bcel/util/BCELifier.java +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -226,7 +226,7 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { else if ((pow == Constants.ACC_TRANSIENT) && (reason == FLAG_FOR_METHOD)) buf.append("ACC_VARARGS | "); else - buf.append("ACC_").append(Constants.ACCESS_NAMES[i].toUpperCase()).append(" | "); + buf.append("ACC_").append(Constants.ACCESS_NAMES[i].toUpperCase(Locale.ENGLISH)).append(" | "); } pow <<= 1; @@ -261,7 +261,7 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { byte t = type.getType(); if(t <= Constants.T_VOID) { - return "Type." + Constants.TYPE_NAMES[t].toUpperCase(); + return "Type." + Constants.TYPE_NAMES[t].toUpperCase(Locale.ENGLISH); } else if(type.toString().equals("java.lang.String")) { return "Type.STRING"; } else if(type.toString().equals("java.lang.Object")) { diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index 09ae354e..92025c49 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -27,6 +27,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Locale; import java.util.StringTokenizer; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -140,7 +141,7 @@ public class ClassPath implements Serializable { File ext_dir = new File((String)e.next()); String[] extensions = ext_dir.list(new FilenameFilter() { public boolean accept(File dir, String name) { - name = name.toLowerCase(); + name = name.toLowerCase(Locale.ENGLISH); return name.endsWith(".zip") || name.endsWith(".jar"); } }); diff --git a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index b808748b..908de28a 100644 --- a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -19,6 +19,7 @@ package org.apache.bcel.verifier.statics; import java.util.HashMap; import java.util.HashSet; +import java.util.Locale; import java.util.Map; import java.util.Set; import org.apache.bcel.Constants; @@ -725,7 +726,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ checkIndex(obj, obj.getSourceFileIndex(), CONST_Utf8); String sourcefilename = ((ConstantUtf8) cp.getConstant(obj.getSourceFileIndex())).getBytes(); //==obj.getSourceFileName() ? - String sourcefilenamelc = sourcefilename.toLowerCase(); + String sourcefilenamelc = sourcefilename.toLowerCase(Locale.ENGLISH); if ( (sourcefilename.indexOf('/') != -1) || (sourcefilename.indexOf('\\') != -1) || -- GitLab From 72b901548b56402b77c8d0208439f4b952f9b6de Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Thu, 2 Mar 2006 03:58:40 +0000 Subject: [PATCH 0326/1313] fixed http://issues.apache.org/bugzilla/show_bug.cgi?id=24258 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382286 13f79535-47bb-0310-9956-ffa450edef68 --- xdocs/manual.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xdocs/manual.xml b/xdocs/manual.xml index 882ddbcf..2fd83a2e 100644 --- a/xdocs/manual.xml +++ b/xdocs/manual.xml @@ -1128,7 +1128,7 @@ ... try { il.delete(match[1], match[5]); - } catch(TargetLostException e) { ... } + } catch(TargetLostException ex) { ... } } -- GitLab From fe8fdd95ada8078ce29922f739cad07a7454f700 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Thu, 2 Mar 2006 04:10:20 +0000 Subject: [PATCH 0327/1313] fixed an import git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382289 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/BCELifier.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java index 7c6d2e28..3b1c2972 100644 --- a/src/java/org/apache/bcel/util/BCELifier.java +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -18,6 +18,7 @@ package org.apache.bcel.util; import java.io.OutputStream; import java.io.PrintWriter; +import java.util.Locale; import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.ClassParser; -- GitLab From 7271a6611eb3d097bb5af499f0e08d7a7e8f1078 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Fri, 3 Mar 2006 00:49:34 +0000 Subject: [PATCH 0328/1313] applied http://issues.apache.org/bugzilla/show_bug.cgi?id=38834 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@382594 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/InstructionHandle.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/InstructionHandle.java b/src/java/org/apache/bcel/generic/InstructionHandle.java index c25873fc..460b2f29 100644 --- a/src/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/java/org/apache/bcel/generic/InstructionHandle.java @@ -159,7 +159,9 @@ public class InstructionHandle implements java.io.Serializable { * Denote this handle isn't referenced anymore by t. */ public void removeTargeter(InstructionTargeter t) { - targeters.remove(t); + if(targeters != null) { + targeters.remove(t); + } } /** @@ -236,6 +238,9 @@ public class InstructionHandle implements java.io.Serializable { /** @return all attributes associated with this handle */ public Collection getAttributes() { + if(attributes == null) { + attributes = new HashMap(3); + } return attributes.values(); } -- GitLab From 2a6b3ba9796c7674508b3002099e5f1e9afb95ac Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Fri, 10 Mar 2006 10:38:59 +0000 Subject: [PATCH 0329/1313] organized imports git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@384759 13f79535-47bb-0310-9956-ffa450edef68 --- examples/HelloWorldBuilder.java | 16 ++++++++- examples/JasminVisitor.java | 36 ++++++++++++++++--- examples/Mini/ASTExpr.java | 15 ++++++-- examples/Mini/ASTFunAppl.java | 7 ++-- examples/Mini/ASTFunDecl.java | 21 +++++++++-- examples/Mini/ASTIdent.java | 8 +++-- examples/Mini/ASTIfExpr.java | 9 +++-- examples/Mini/ASTInteger.java | 6 ++-- examples/Mini/ASTLetExpr.java | 10 ++++-- examples/Mini/ASTProgram.java | 21 +++++++++-- examples/Mini/MiniC.java | 9 +++-- examples/Mini/MiniParserTokenManager.java | 12 +++---- examples/Mini/Variable.java | 3 +- examples/Package.java | 24 +++++++++---- examples/Peephole.java | 12 ++++--- examples/ProxyCreator.java | 24 ++++++++----- examples/TransitiveHull.java | 1 - examples/helloify.java | 18 ++++++++-- examples/id.java | 12 ++++--- examples/listclass.java | 17 ++++++--- examples/maxstack.java | 10 +++--- examples/patchclass.java | 6 ++-- .../org/apache/bcel/classfile/InnerClass.java | 1 - .../org/apache/bcel/classfile/JavaClass.java | 1 - .../org/apache/bcel/classfile/Utility.java | 1 - .../org/apache/bcel/generic/ClassGen.java | 1 - .../org/apache/bcel/generic/FieldGen.java | 1 - .../bcel/generic/FieldGenOrMethodGen.java | 1 - .../apache/bcel/generic/InstructionList.java | 1 - .../org/apache/bcel/generic/MethodGen.java | 1 - src/java/org/apache/bcel/generic/Type.java | 1 - .../org/apache/bcel/util/BCELFactory.java | 1 - .../org/apache/bcel/util/ClassVector.java | 1 - .../apache/bcel/util/InstructionFinder.java | 1 - .../verifier/structurals/Pass3bVerifier.java | 1 - .../verifier/structurals/Subroutines.java | 1 - 36 files changed, 227 insertions(+), 84 deletions(-) diff --git a/examples/HelloWorldBuilder.java b/examples/HelloWorldBuilder.java index 59741e01..67ec3dec 100644 --- a/examples/HelloWorldBuilder.java +++ b/examples/HelloWorldBuilder.java @@ -1,5 +1,19 @@ -import org.apache.bcel.generic.*; import org.apache.bcel.Constants; +import org.apache.bcel.generic.ALOAD; +import org.apache.bcel.generic.ASTORE; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GOTO; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.LocalVariableGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.Type; /** * Create HelloWorld class: diff --git a/examples/JasminVisitor.java b/examples/JasminVisitor.java index e277f1fd..3e939966 100644 --- a/examples/JasminVisitor.java +++ b/examples/JasminVisitor.java @@ -1,10 +1,36 @@ -import org.apache.bcel.classfile.Deprecated; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; -import java.io.*; -import java.util.*; +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.util.Date; +import java.util.Hashtable; +import java.util.StringTokenizer; import org.apache.bcel.Constants; import org.apache.bcel.Repository; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Deprecated; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Synthetic; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.generic.BranchHandle; +import org.apache.bcel.generic.BranchInstruction; +import org.apache.bcel.generic.CodeExceptionGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.Instruction; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.LineNumberGen; +import org.apache.bcel.generic.LocalVariableGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.Select; +import org.apache.bcel.generic.TABLESWITCH; /** * Disassemble Java class object into the diff --git a/examples/Mini/ASTExpr.java b/examples/Mini/ASTExpr.java index 149c288a..4b98fa93 100644 --- a/examples/Mini/ASTExpr.java +++ b/examples/Mini/ASTExpr.java @@ -2,8 +2,19 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; +import org.apache.bcel.generic.BranchHandle; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GOTO; +import org.apache.bcel.generic.IF_ICMPEQ; +import org.apache.bcel.generic.IF_ICMPGE; +import org.apache.bcel.generic.IF_ICMPGT; +import org.apache.bcel.generic.IF_ICMPLE; +import org.apache.bcel.generic.IF_ICMPLT; +import org.apache.bcel.generic.IF_ICMPNE; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.PUSH; /** * Represents arithmetic expressions such as `(a + 12 == b) OR c'. diff --git a/examples/Mini/ASTFunAppl.java b/examples/Mini/ASTFunAppl.java index 468ef074..bbee7e6e 100644 --- a/examples/Mini/ASTFunAppl.java +++ b/examples/Mini/ASTFunAppl.java @@ -2,8 +2,11 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.INVOKESTATIC; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.Type; /** * diff --git a/examples/Mini/ASTFunDecl.java b/examples/Mini/ASTFunDecl.java index 16678e49..5f628596 100644 --- a/examples/Mini/ASTFunDecl.java +++ b/examples/Mini/ASTFunDecl.java @@ -4,8 +4,25 @@ package Mini; import java.io.PrintWriter; import java.util.Iterator; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; +import org.apache.bcel.generic.ALOAD; +import org.apache.bcel.generic.ASTORE; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.BranchHandle; +import org.apache.bcel.generic.BranchInstruction; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GETSTATIC; +import org.apache.bcel.generic.GOTO; +import org.apache.bcel.generic.INVOKEVIRTUAL; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.InstructionTargeter; +import org.apache.bcel.generic.LocalVariableGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.TargetLostException; +import org.apache.bcel.generic.Type; import org.apache.bcel.util.InstructionFinder; /** diff --git a/examples/Mini/ASTIdent.java b/examples/Mini/ASTIdent.java index 5ac58feb..f8fd0a70 100644 --- a/examples/Mini/ASTIdent.java +++ b/examples/Mini/ASTIdent.java @@ -2,8 +2,12 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.ILOAD; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.LocalVariableGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.PUSH; /** * diff --git a/examples/Mini/ASTIfExpr.java b/examples/Mini/ASTIfExpr.java index 0b45ae9f..b98b7862 100644 --- a/examples/Mini/ASTIfExpr.java +++ b/examples/Mini/ASTIfExpr.java @@ -2,8 +2,13 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; +import org.apache.bcel.generic.BranchHandle; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GOTO; +import org.apache.bcel.generic.IFEQ; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; /** * diff --git a/examples/Mini/ASTInteger.java b/examples/Mini/ASTInteger.java index 120f3c92..69605717 100644 --- a/examples/Mini/ASTInteger.java +++ b/examples/Mini/ASTInteger.java @@ -2,8 +2,10 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.PUSH; /** * diff --git a/examples/Mini/ASTLetExpr.java b/examples/Mini/ASTLetExpr.java index 51586df7..c8c1839d 100644 --- a/examples/Mini/ASTLetExpr.java +++ b/examples/Mini/ASTLetExpr.java @@ -2,8 +2,14 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; +import org.apache.bcel.generic.BasicType; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.ISTORE; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.LocalVariableGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.Type; /** * diff --git a/examples/Mini/ASTProgram.java b/examples/Mini/ASTProgram.java index feae3962..0187f2e8 100644 --- a/examples/Mini/ASTProgram.java +++ b/examples/Mini/ASTProgram.java @@ -3,9 +3,24 @@ package Mini; import java.io.PrintWriter; -import java.util.Vector; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ALOAD; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GETSTATIC; +import org.apache.bcel.generic.ILOAD; +import org.apache.bcel.generic.INVOKESPECIAL; +import org.apache.bcel.generic.INVOKESTATIC; +import org.apache.bcel.generic.INVOKEVIRTUAL; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.NEW; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.PUTSTATIC; +import org.apache.bcel.generic.RETURN; +import org.apache.bcel.generic.Type; /** * Root node of everything, direct children are nodes of type FunDecl diff --git a/examples/Mini/MiniC.java b/examples/Mini/MiniC.java index 6052aca7..5782ccb8 100644 --- a/examples/Mini/MiniC.java +++ b/examples/Mini/MiniC.java @@ -1,8 +1,11 @@ package Mini; +import java.io.File; +import java.io.FileOutputStream; +import java.io.PrintWriter; import java.util.Vector; -import java.io.*; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; public class MiniC implements org.apache.bcel.Constants { private static Vector errors = null; diff --git a/examples/Mini/MiniParserTokenManager.java b/examples/Mini/MiniParserTokenManager.java index 4a34dee1..731aeb66 100644 --- a/examples/Mini/MiniParserTokenManager.java +++ b/examples/Mini/MiniParserTokenManager.java @@ -52,7 +52,7 @@ static private final int jjMoveNfa_1(int startState, int curPos) if (curChar < 64) { long l = 1L << curChar; - MatchLoop: do + do { switch(jjstateSet[--i]) { @@ -80,7 +80,7 @@ static private final int jjMoveNfa_1(int startState, int curPos) else if (curChar < 128) { long l = 1L << (curChar & 077); - MatchLoop: do + do { switch(jjstateSet[--i]) { @@ -92,7 +92,7 @@ static private final int jjMoveNfa_1(int startState, int curPos) { int i2 = (curChar & 0xff) >> 6; long l2 = 1L << (curChar & 077); - MatchLoop: do + do { switch(jjstateSet[--i]) { @@ -399,7 +399,7 @@ static private final int jjMoveNfa_0(int startState, int curPos) if (curChar < 64) { long l = 1L << curChar; - MatchLoop: do + do { switch(jjstateSet[--i]) { @@ -446,7 +446,7 @@ static private final int jjMoveNfa_0(int startState, int curPos) else if (curChar < 128) { long l = 1L << (curChar & 077); - MatchLoop: do + do { switch(jjstateSet[--i]) { @@ -475,7 +475,7 @@ static private final int jjMoveNfa_0(int startState, int curPos) { int i2 = (curChar & 0xff) >> 6; long l2 = 1L << (curChar & 077); - MatchLoop: do + do { switch(jjstateSet[--i]) { diff --git a/examples/Mini/Variable.java b/examples/Mini/Variable.java index c5b58f42..df103b74 100644 --- a/examples/Mini/Variable.java +++ b/examples/Mini/Variable.java @@ -1,6 +1,5 @@ package Mini; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; +import org.apache.bcel.generic.LocalVariableGen; /** * Represents a variable declared in a LET expression or a FUN declaration. diff --git a/examples/Package.java b/examples/Package.java index 3b47ecd2..45d48d2c 100644 --- a/examples/Package.java +++ b/examples/Package.java @@ -1,9 +1,19 @@ -import java.util.*; -import java.util.jar.*; -import java.util.zip.*; -import java.io.*; -import org.apache.bcel.classfile.*; -import org.apache.bcel.*; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.TreeMap; +import java.util.jar.JarOutputStream; +import java.util.zip.ZipEntry; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.util.ClassPath; /** @@ -38,7 +48,7 @@ public class Package { * We use a "default ClassPath object which uses the environments * CLASSPATH */ - ClassPath classPath = new ClassPath(); + ClassPath classPath = ClassPath.SYSTEM_CLASS_PATH; /** * A map for all Classes, the ones we're going to package. diff --git a/examples/Peephole.java b/examples/Peephole.java index fe860e12..2bb6dd25 100644 --- a/examples/Peephole.java +++ b/examples/Peephole.java @@ -1,9 +1,13 @@ -import java.io.*; - import java.util.Iterator; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.InstructionTargeter; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.TargetLostException; import org.apache.bcel.util.InstructionFinder; /** diff --git a/examples/ProxyCreator.java b/examples/ProxyCreator.java index 96822750..3a8a5b96 100644 --- a/examples/ProxyCreator.java +++ b/examples/ProxyCreator.java @@ -1,11 +1,19 @@ -import java.io.*; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; -import org.apache.bcel.util.ByteSequence; -import org.apache.bcel.*; -import java.awt.event.*; -import java.util.Vector; -import java.util.zip.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.generic.ALOAD; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GETSTATIC; +import org.apache.bcel.generic.INVOKEVIRTUAL; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.Type; /** * Dynamically creates and uses a proxy for java.awt.event.ActionListener diff --git a/examples/TransitiveHull.java b/examples/TransitiveHull.java index 97f498c8..230f435d 100644 --- a/examples/TransitiveHull.java +++ b/examples/TransitiveHull.java @@ -1,6 +1,5 @@ import java.util.Arrays; import java.util.regex.Pattern; - import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.ClassParser; diff --git a/examples/helloify.java b/examples/helloify.java index c7cc460b..945641f3 100644 --- a/examples/helloify.java +++ b/examples/helloify.java @@ -1,6 +1,20 @@ -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; import org.apache.bcel.Constants; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GETSTATIC; +import org.apache.bcel.generic.INVOKESPECIAL; +import org.apache.bcel.generic.INVOKEVIRTUAL; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.PUSH; /** * Read class file(s) and patch all of its methods, so that they print diff --git a/examples/id.java b/examples/id.java index e4d1c13b..1d13208a 100644 --- a/examples/id.java +++ b/examples/id.java @@ -1,7 +1,11 @@ -import java.io.*; -import org.apache.bcel.classfile.*; -import org.apache.bcel.*; -import org.apache.bcel.generic.*; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.FieldGen; +import org.apache.bcel.generic.MethodGen; /** * Test BCEL if an input file is identical to the outfile generated diff --git a/examples/listclass.java b/examples/listclass.java index b7b60908..35d794c5 100644 --- a/examples/listclass.java +++ b/examples/listclass.java @@ -1,7 +1,16 @@ -import java.io.*; -import java.util.*; -import org.apache.bcel.classfile.*; -import org.apache.bcel.*; +import java.io.IOException; +import java.util.Hashtable; +import java.util.Vector; +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; /** * Read class file(s) and display its contents. The command line usage is: diff --git a/examples/maxstack.java b/examples/maxstack.java index a4550b5a..7ddede8d 100644 --- a/examples/maxstack.java +++ b/examples/maxstack.java @@ -1,7 +1,9 @@ -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; -import org.apache.bcel.Constants; -import org.apache.bcel.*; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.MethodGen; /** * Read class file(s) and examine all of its methods, determining the diff --git a/examples/patchclass.java b/examples/patchclass.java index edc39003..8c4bb9bf 100644 --- a/examples/patchclass.java +++ b/examples/patchclass.java @@ -1,5 +1,7 @@ -import java.io.*; -import org.apache.bcel.classfile.*; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.JavaClass; /** * Patch all Utf8 constants in the given class file file.class diff --git a/src/java/org/apache/bcel/classfile/InnerClass.java b/src/java/org/apache/bcel/classfile/InnerClass.java index 1ae910af..fb3b2a98 100644 --- a/src/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/java/org/apache/bcel/classfile/InnerClass.java @@ -21,7 +21,6 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; - import org.apache.bcel.Constants; /** diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 0e646e57..5c78a33b 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -28,7 +28,6 @@ import java.util.List; import java.util.Set; import java.util.StringTokenizer; import java.util.TreeSet; - import org.apache.bcel.Constants; import org.apache.bcel.generic.Type; import org.apache.bcel.util.BCELComparator; diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index 992acfa4..a1170573 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -33,7 +33,6 @@ import java.util.List; import java.util.Locale; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; - import org.apache.bcel.Constants; import org.apache.bcel.util.ByteSequence; diff --git a/src/java/org/apache/bcel/generic/ClassGen.java b/src/java/org/apache/bcel/generic/ClassGen.java index 0be2bd0c..4c05a2be 100644 --- a/src/java/org/apache/bcel/generic/ClassGen.java +++ b/src/java/org/apache/bcel/generic/ClassGen.java @@ -20,7 +20,6 @@ package org.apache.bcel.generic; import java.util.ArrayList; import java.util.Iterator; import java.util.List; - import org.apache.bcel.Constants; import org.apache.bcel.classfile.AccessFlags; import org.apache.bcel.classfile.Attribute; diff --git a/src/java/org/apache/bcel/generic/FieldGen.java b/src/java/org/apache/bcel/generic/FieldGen.java index b7cc3d2a..101e33ad 100644 --- a/src/java/org/apache/bcel/generic/FieldGen.java +++ b/src/java/org/apache/bcel/generic/FieldGen.java @@ -20,7 +20,6 @@ package org.apache.bcel.generic; import java.util.ArrayList; import java.util.Iterator; import java.util.List; - import org.apache.bcel.Constants; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.Constant; diff --git a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 7d7a3e20..854a0346 100644 --- a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -1,7 +1,6 @@ package org.apache.bcel.generic; import java.util.ArrayList; import java.util.List; - import org.apache.bcel.Constants; import org.apache.bcel.classfile.AccessFlags; import org.apache.bcel.classfile.Attribute; diff --git a/src/java/org/apache/bcel/generic/InstructionList.java b/src/java/org/apache/bcel/generic/InstructionList.java index 5dfe6bc6..80ee84d8 100644 --- a/src/java/org/apache/bcel/generic/InstructionList.java +++ b/src/java/org/apache/bcel/generic/InstructionList.java @@ -26,7 +26,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; - import org.apache.bcel.Constants; import org.apache.bcel.classfile.Constant; import org.apache.bcel.util.ByteSequence; diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index 364e62c7..cdad95fe 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -22,7 +22,6 @@ import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Stack; - import org.apache.bcel.Constants; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.Code; diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index 6c4db513..b14557a7 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -19,7 +19,6 @@ package org.apache.bcel.generic; import java.util.ArrayList; import java.util.List; - import org.apache.bcel.Constants; import org.apache.bcel.classfile.ClassFormatException; import org.apache.bcel.classfile.Utility; diff --git a/src/java/org/apache/bcel/util/BCELFactory.java b/src/java/org/apache/bcel/util/BCELFactory.java index bcedd409..bed15762 100644 --- a/src/java/org/apache/bcel/util/BCELFactory.java +++ b/src/java/org/apache/bcel/util/BCELFactory.java @@ -7,7 +7,6 @@ import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; - import org.apache.bcel.Constants; import org.apache.bcel.classfile.Utility; import org.apache.bcel.generic.AllocationInstruction; diff --git a/src/java/org/apache/bcel/util/ClassVector.java b/src/java/org/apache/bcel/util/ClassVector.java index 83c6fa6a..4b3c679a 100644 --- a/src/java/org/apache/bcel/util/ClassVector.java +++ b/src/java/org/apache/bcel/util/ClassVector.java @@ -18,7 +18,6 @@ package org.apache.bcel.util; import java.util.ArrayList; import java.util.List; - import org.apache.bcel.classfile.JavaClass; /** diff --git a/src/java/org/apache/bcel/util/InstructionFinder.java b/src/java/org/apache/bcel/util/InstructionFinder.java index 0374526a..b8eb8a37 100644 --- a/src/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/java/org/apache/bcel/util/InstructionFinder.java @@ -24,7 +24,6 @@ import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; - import org.apache.bcel.Constants; import org.apache.bcel.generic.ClassGenException; import org.apache.bcel.generic.Instruction; diff --git a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index a339e220..9df51fbf 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Vector; - import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; diff --git a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java index 0718e0a8..3ff6344f 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -21,7 +21,6 @@ import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.Set; - import org.apache.bcel.generic.ASTORE; import org.apache.bcel.generic.ATHROW; import org.apache.bcel.generic.BranchInstruction; -- GitLab From 38bf6843ce6fc6c878a5b0b55c49c034a3720184 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Fri, 10 Mar 2006 13:03:07 +0000 Subject: [PATCH 0330/1313] fixed http://issues.apache.org/bugzilla/show_bug.cgi?id=18031 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@384783 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/generic/ConstantPoolGen.java | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/java/org/apache/bcel/generic/ConstantPoolGen.java index e8913c41..5b09e7d2 100644 --- a/src/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -87,22 +87,30 @@ public class ConstantPoolGen implements java.io.Serializable { ConstantString s = (ConstantString)c; ConstantUtf8 u8 = (ConstantUtf8)constants[s.getStringIndex()]; - string_table.put(u8.getBytes(), new Index(i)); + String key = u8.getBytes(); + if (!string_table.containsKey(key)) + string_table.put(key, new Index(i)); } else if(c instanceof ConstantClass) { ConstantClass s = (ConstantClass)c; ConstantUtf8 u8 = (ConstantUtf8)constants[s.getNameIndex()]; - class_table.put(u8.getBytes(), new Index(i)); + String key = u8.getBytes(); + if (!class_table.containsKey(key)) + class_table.put(key, new Index(i)); } else if(c instanceof ConstantNameAndType) { ConstantNameAndType n = (ConstantNameAndType)c; ConstantUtf8 u8 = (ConstantUtf8)constants[n.getNameIndex()]; ConstantUtf8 u8_2 = (ConstantUtf8)constants[n.getSignatureIndex()]; - n_a_t_table.put(u8.getBytes() + NAT_DELIM + u8_2.getBytes(), new Index(i)); + String key = u8.getBytes() + NAT_DELIM + u8_2.getBytes(); + if (!n_a_t_table.containsKey(key)) + n_a_t_table.put(key, new Index(i)); } else if(c instanceof ConstantUtf8) { ConstantUtf8 u = (ConstantUtf8)c; - utf8_table.put(u.getBytes(), new Index(i)); + String key = u.getBytes(); + if (!utf8_table.containsKey(key)) + utf8_table.put(key, new Index(i)); } else if(c instanceof ConstantCP) { ConstantCP m = (ConstantCP)c; ConstantClass clazz = (ConstantClass)constants[m.getClassIndex()]; @@ -187,6 +195,7 @@ public class ConstantPoolGen implements java.io.Serializable { ret = index; constants[index++] = s; + if (!string_table.containsKey(str)) string_table.put(str, new Index(ret)); return ret; @@ -218,6 +227,7 @@ public class ConstantPoolGen implements java.io.Serializable { ret = index; constants[index++] = c; + if (!class_table.containsKey(clazz)) class_table.put(clazz, new Index(ret)); return ret; @@ -365,6 +375,7 @@ public class ConstantPoolGen implements java.io.Serializable { ret = index; constants[index++] = new ConstantUtf8(n); + if (!utf8_table.containsKey(n)) utf8_table.put(n, new Index(ret)); return ret; @@ -488,7 +499,9 @@ public class ConstantPoolGen implements java.io.Serializable { ret = index; constants[index++] = new ConstantNameAndType(name_index, signature_index); - n_a_t_table.put(name + NAT_DELIM + signature, new Index(ret)); + String key = name + NAT_DELIM + signature; + if (!n_a_t_table.containsKey(key)) + n_a_t_table.put(key, new Index(ret)); return ret; } @@ -535,8 +548,10 @@ public class ConstantPoolGen implements java.io.Serializable { ret = index; constants[index++] = new ConstantMethodref(class_index, name_and_type_index); - cp_table.put(class_name + METHODREF_DELIM + method_name + - METHODREF_DELIM + signature, new Index(ret)); + String key = class_name + METHODREF_DELIM + method_name + METHODREF_DELIM + signature; + + if (!cp_table.containsKey(key)) + cp_table.put(key, new Index(ret)); return ret; } @@ -587,8 +602,9 @@ public class ConstantPoolGen implements java.io.Serializable { ret = index; constants[index++] = new ConstantInterfaceMethodref(class_index, name_and_type_index); - cp_table.put(class_name + IMETHODREF_DELIM + method_name + - IMETHODREF_DELIM + signature, new Index(ret)); + String key = class_name + IMETHODREF_DELIM + method_name + IMETHODREF_DELIM + signature; + if (!cp_table.containsKey(key)) + cp_table.put(key, new Index(ret)); return ret; } @@ -635,7 +651,9 @@ public class ConstantPoolGen implements java.io.Serializable { ret = index; constants[index++] = new ConstantFieldref(class_index, name_and_type_index); - cp_table.put(class_name + FIELDREF_DELIM + field_name + FIELDREF_DELIM + signature, new Index(ret)); + String key = class_name + FIELDREF_DELIM + field_name + FIELDREF_DELIM + signature; + if (!cp_table.containsKey(key)) + cp_table.put(key, new Index(ret)); return ret; } -- GitLab From 66a5265e4892e959269e915d14f4351f608e84b1 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Fri, 10 Mar 2006 13:09:52 +0000 Subject: [PATCH 0331/1313] forgot one git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@384784 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/ConstantPoolGen.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/java/org/apache/bcel/generic/ConstantPoolGen.java index 5b09e7d2..dd63d024 100644 --- a/src/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -132,7 +132,9 @@ public class ConstantPoolGen implements java.io.Serializable { else if(c instanceof ConstantFieldref) delim = FIELDREF_DELIM; - cp_table.put(class_name + delim + method_name + delim + signature, new Index(i)); + String key = class_name + delim + method_name + delim + signature; + if (!cp_table.containsKey(key)) + cp_table.put(key, new Index(i)); } } } -- GitLab From d532ec1089fdfd05004f143c87b96ed036a9abbf Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Wed, 15 Mar 2006 11:31:56 +0000 Subject: [PATCH 0332/1313] code formatting and cleanups git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@386056 13f79535-47bb-0310-9956-ffa450edef68 --- examples/JasminVisitor.java | 79 +- examples/Mini/ASCII_CharStream.java | 70 +- examples/Mini/ASTExpr.java | 71 +- examples/Mini/ASTFactor.java | 9 +- examples/Mini/ASTFunAppl.java | 80 +- examples/Mini/ASTFunDecl.java | 85 +- examples/Mini/ASTIdent.java | 48 +- examples/Mini/ASTIfExpr.java | 58 +- examples/Mini/ASTLetExpr.java | 21 +- examples/Mini/ASTProgram.java | 53 +- examples/Mini/ASTTerm.java | 9 +- examples/Mini/Environment.java | 39 +- examples/Mini/Function.java | 14 +- examples/Mini/MiniC.java | 74 +- examples/Mini/MiniParser.java | 323 ++- examples/Mini/MiniParserTokenManager.java | 247 +- examples/Mini/ParseException.java | 4 +- examples/Mini/Variable.java | 9 +- examples/Peephole.java | 15 +- examples/ProxyCreator.java | 5 +- examples/helloify.java | 20 +- examples/id.java | 5 +- examples/listclass.java | 95 +- examples/maxstack.java | 27 +- examples/patchclass.java | 5 +- .../org/apache/bcel/ExceptionConstants.java | 110 +- src/java/org/apache/bcel/Repository.java | 439 +-- .../apache/bcel/classfile/AccessFlags.java | 328 ++- .../bcel/classfile/AnnotationDefault.java | 108 +- .../bcel/classfile/AnnotationEntry.java | 111 +- .../apache/bcel/classfile/Annotations.java | 155 +- .../org/apache/bcel/classfile/Attribute.java | 448 ++- .../bcel/classfile/AttributeReader.java | 12 +- .../bcel/classfile/ClassFormatException.java | 13 +- .../apache/bcel/classfile/ClassParser.java | 464 ++-- src/java/org/apache/bcel/classfile/Code.java | 581 ++-- .../apache/bcel/classfile/CodeException.java | 341 +-- .../org/apache/bcel/classfile/Constant.java | 280 +- .../org/apache/bcel/classfile/ConstantCP.java | 182 +- .../apache/bcel/classfile/ConstantClass.java | 178 +- .../apache/bcel/classfile/ConstantDouble.java | 157 +- .../bcel/classfile/ConstantFieldref.java | 70 +- .../apache/bcel/classfile/ConstantFloat.java | 157 +- .../bcel/classfile/ConstantInteger.java | 161 +- .../classfile/ConstantInterfaceMethodref.java | 70 +- .../apache/bcel/classfile/ConstantLong.java | 154 +- .../bcel/classfile/ConstantMethodref.java | 70 +- .../bcel/classfile/ConstantNameAndType.java | 213 +- .../apache/bcel/classfile/ConstantObject.java | 7 +- .../apache/bcel/classfile/ConstantPool.java | 596 ++-- .../apache/bcel/classfile/ConstantString.java | 171 +- .../apache/bcel/classfile/ConstantUtf8.java | 162 +- .../apache/bcel/classfile/ConstantValue.java | 228 +- .../org/apache/bcel/classfile/Deprecated.java | 204 +- .../bcel/classfile/DescendingVisitor.java | 650 ++--- .../apache/bcel/classfile/ElementValue.java | 109 +- .../bcel/classfile/ElementValuePair.java | 32 +- .../apache/bcel/classfile/EmptyVisitor.java | 189 +- .../apache/bcel/classfile/ExceptionTable.java | 270 +- src/java/org/apache/bcel/classfile/Field.java | 297 +- .../apache/bcel/classfile/FieldOrMethod.java | 361 ++- .../org/apache/bcel/classfile/InnerClass.java | 333 +-- .../apache/bcel/classfile/InnerClasses.java | 227 +- .../org/apache/bcel/classfile/JavaClass.java | 1615 ++++++----- .../org/apache/bcel/classfile/LineNumber.java | 204 +- .../bcel/classfile/LineNumberTable.java | 321 +-- .../apache/bcel/classfile/LocalVariable.java | 409 +-- .../bcel/classfile/LocalVariableTable.java | 308 ++- .../org/apache/bcel/classfile/Method.java | 428 ++- src/java/org/apache/bcel/classfile/Node.java | 6 +- .../org/apache/bcel/classfile/PMGClass.java | 257 +- .../classfile/ParameterAnnotationEntry.java | 87 +- .../bcel/classfile/ParameterAnnotations.java | 159 +- .../RuntimeInvisibleAnnotations.java | 42 +- .../RuntimeInvisibleParameterAnnotations.java | 43 +- .../classfile/RuntimeVisibleAnnotations.java | 42 +- .../RuntimeVisibleParameterAnnotations.java | 43 +- .../org/apache/bcel/classfile/Signature.java | 457 ++-- .../org/apache/bcel/classfile/SourceFile.java | 215 +- .../org/apache/bcel/classfile/StackMap.java | 221 +- .../apache/bcel/classfile/StackMapEntry.java | 320 ++- .../apache/bcel/classfile/StackMapType.java | 232 +- .../org/apache/bcel/classfile/Synthetic.java | 213 +- .../org/apache/bcel/classfile/Unknown.java | 270 +- .../org/apache/bcel/classfile/Utility.java | 2424 ++++++++--------- .../org/apache/bcel/classfile/Visitor.java | 138 +- src/java/org/apache/bcel/generic/AALOAD.java | 44 +- src/java/org/apache/bcel/generic/AASTORE.java | 44 +- .../org/apache/bcel/generic/ACONST_NULL.java | 58 +- src/java/org/apache/bcel/generic/ALOAD.java | 56 +- .../org/apache/bcel/generic/ANEWARRAY.java | 90 +- src/java/org/apache/bcel/generic/ARETURN.java | 46 +- .../org/apache/bcel/generic/ARRAYLENGTH.java | 56 +- src/java/org/apache/bcel/generic/ASTORE.java | 56 +- src/java/org/apache/bcel/generic/ATHROW.java | 55 +- .../bcel/generic/AllocationInstruction.java | 7 +- .../bcel/generic/ArithmeticInstruction.java | 101 +- .../apache/bcel/generic/ArrayInstruction.java | 92 +- .../org/apache/bcel/generic/ArrayType.java | 187 +- src/java/org/apache/bcel/generic/BALOAD.java | 44 +- src/java/org/apache/bcel/generic/BASTORE.java | 44 +- src/java/org/apache/bcel/generic/BIPUSH.java | 138 +- .../org/apache/bcel/generic/BREAKPOINT.java | 33 +- .../org/apache/bcel/generic/BasicType.java | 83 +- .../org/apache/bcel/generic/BranchHandle.java | 172 +- .../bcel/generic/BranchInstruction.java | 372 +-- src/java/org/apache/bcel/generic/CALOAD.java | 44 +- src/java/org/apache/bcel/generic/CASTORE.java | 44 +- .../org/apache/bcel/generic/CHECKCAST.java | 98 +- .../apache/bcel/generic/CPInstruction.java | 197 +- .../org/apache/bcel/generic/ClassGen.java | 999 +++---- .../bcel/generic/ClassGenException.java | 15 +- .../apache/bcel/generic/ClassObserver.java | 7 +- .../apache/bcel/generic/CodeExceptionGen.java | 264 +- .../bcel/generic/CompoundInstruction.java | 7 +- .../apache/bcel/generic/ConstantPoolGen.java | 1412 +++++----- .../bcel/generic/ConstantPushInstruction.java | 7 +- .../bcel/generic/ConversionInstruction.java | 85 +- src/java/org/apache/bcel/generic/D2F.java | 44 +- src/java/org/apache/bcel/generic/D2I.java | 44 +- src/java/org/apache/bcel/generic/D2L.java | 44 +- src/java/org/apache/bcel/generic/DADD.java | 44 +- src/java/org/apache/bcel/generic/DALOAD.java | 44 +- src/java/org/apache/bcel/generic/DASTORE.java | 44 +- src/java/org/apache/bcel/generic/DCMPG.java | 51 +- src/java/org/apache/bcel/generic/DCMPL.java | 52 +- src/java/org/apache/bcel/generic/DCONST.java | 88 +- src/java/org/apache/bcel/generic/DDIV.java | 44 +- src/java/org/apache/bcel/generic/DLOAD.java | 56 +- src/java/org/apache/bcel/generic/DMUL.java | 44 +- src/java/org/apache/bcel/generic/DNEG.java | 40 +- src/java/org/apache/bcel/generic/DREM.java | 44 +- src/java/org/apache/bcel/generic/DRETURN.java | 44 +- src/java/org/apache/bcel/generic/DSTORE.java | 56 +- src/java/org/apache/bcel/generic/DSUB.java | 44 +- src/java/org/apache/bcel/generic/DUP.java | 38 +- src/java/org/apache/bcel/generic/DUP2.java | 38 +- src/java/org/apache/bcel/generic/DUP2_X1.java | 34 +- src/java/org/apache/bcel/generic/DUP2_X2.java | 34 +- src/java/org/apache/bcel/generic/DUP_X1.java | 34 +- src/java/org/apache/bcel/generic/DUP_X2.java | 34 +- .../org/apache/bcel/generic/EmptyVisitor.java | 902 ++++-- .../apache/bcel/generic/ExceptionThrower.java | 6 +- src/java/org/apache/bcel/generic/F2D.java | 44 +- src/java/org/apache/bcel/generic/F2I.java | 44 +- src/java/org/apache/bcel/generic/F2L.java | 44 +- src/java/org/apache/bcel/generic/FADD.java | 44 +- src/java/org/apache/bcel/generic/FALOAD.java | 44 +- src/java/org/apache/bcel/generic/FASTORE.java | 44 +- src/java/org/apache/bcel/generic/FCMPG.java | 52 +- src/java/org/apache/bcel/generic/FCMPL.java | 52 +- src/java/org/apache/bcel/generic/FCONST.java | 92 +- src/java/org/apache/bcel/generic/FDIV.java | 44 +- src/java/org/apache/bcel/generic/FLOAD.java | 56 +- src/java/org/apache/bcel/generic/FMUL.java | 44 +- src/java/org/apache/bcel/generic/FNEG.java | 40 +- src/java/org/apache/bcel/generic/FREM.java | 44 +- src/java/org/apache/bcel/generic/FRETURN.java | 44 +- src/java/org/apache/bcel/generic/FSTORE.java | 56 +- src/java/org/apache/bcel/generic/FSUB.java | 44 +- .../org/apache/bcel/generic/FieldGen.java | 590 ++-- .../bcel/generic/FieldGenOrMethodGen.java | 165 +- .../apache/bcel/generic/FieldInstruction.java | 93 +- .../apache/bcel/generic/FieldObserver.java | 7 +- .../apache/bcel/generic/FieldOrMethod.java | 178 +- .../org/apache/bcel/generic/GETFIELD.java | 85 +- .../org/apache/bcel/generic/GETSTATIC.java | 79 +- src/java/org/apache/bcel/generic/GOTO.java | 101 +- src/java/org/apache/bcel/generic/GOTO_W.java | 87 +- .../apache/bcel/generic/GotoInstruction.java | 26 +- src/java/org/apache/bcel/generic/I2B.java | 44 +- src/java/org/apache/bcel/generic/I2C.java | 44 +- src/java/org/apache/bcel/generic/I2D.java | 44 +- src/java/org/apache/bcel/generic/I2F.java | 44 +- src/java/org/apache/bcel/generic/I2L.java | 44 +- src/java/org/apache/bcel/generic/I2S.java | 40 +- src/java/org/apache/bcel/generic/IADD.java | 44 +- src/java/org/apache/bcel/generic/IALOAD.java | 46 +- src/java/org/apache/bcel/generic/IAND.java | 40 +- src/java/org/apache/bcel/generic/IASTORE.java | 46 +- src/java/org/apache/bcel/generic/ICONST.java | 88 +- src/java/org/apache/bcel/generic/IDIV.java | 59 +- src/java/org/apache/bcel/generic/IFEQ.java | 71 +- src/java/org/apache/bcel/generic/IFGE.java | 71 +- src/java/org/apache/bcel/generic/IFGT.java | 71 +- src/java/org/apache/bcel/generic/IFLE.java | 71 +- src/java/org/apache/bcel/generic/IFLT.java | 71 +- src/java/org/apache/bcel/generic/IFNE.java | 71 +- .../org/apache/bcel/generic/IFNONNULL.java | 70 +- src/java/org/apache/bcel/generic/IFNULL.java | 71 +- .../org/apache/bcel/generic/IF_ACMPEQ.java | 70 +- .../org/apache/bcel/generic/IF_ACMPNE.java | 71 +- .../org/apache/bcel/generic/IF_ICMPEQ.java | 71 +- .../org/apache/bcel/generic/IF_ICMPGE.java | 71 +- .../org/apache/bcel/generic/IF_ICMPGT.java | 71 +- .../org/apache/bcel/generic/IF_ICMPLE.java | 71 +- .../org/apache/bcel/generic/IF_ICMPLT.java | 71 +- .../org/apache/bcel/generic/IF_ICMPNE.java | 71 +- src/java/org/apache/bcel/generic/IINC.java | 241 +- src/java/org/apache/bcel/generic/ILOAD.java | 56 +- src/java/org/apache/bcel/generic/IMPDEP1.java | 32 +- src/java/org/apache/bcel/generic/IMPDEP2.java | 32 +- src/java/org/apache/bcel/generic/IMUL.java | 44 +- src/java/org/apache/bcel/generic/INEG.java | 40 +- .../org/apache/bcel/generic/INSTANCEOF.java | 80 +- .../apache/bcel/generic/INVOKEINTERFACE.java | 192 +- .../apache/bcel/generic/INVOKESPECIAL.java | 77 +- .../org/apache/bcel/generic/INVOKESTATIC.java | 73 +- .../apache/bcel/generic/INVOKEVIRTUAL.java | 77 +- src/java/org/apache/bcel/generic/IOR.java | 40 +- src/java/org/apache/bcel/generic/IREM.java | 59 +- src/java/org/apache/bcel/generic/IRETURN.java | 44 +- src/java/org/apache/bcel/generic/ISHL.java | 40 +- src/java/org/apache/bcel/generic/ISHR.java | 40 +- src/java/org/apache/bcel/generic/ISTORE.java | 56 +- src/java/org/apache/bcel/generic/ISUB.java | 44 +- src/java/org/apache/bcel/generic/IUSHR.java | 40 +- src/java/org/apache/bcel/generic/IXOR.java | 40 +- .../apache/bcel/generic/IfInstruction.java | 40 +- .../bcel/generic/IndexedInstruction.java | 11 +- .../org/apache/bcel/generic/Instruction.java | 468 ++-- .../bcel/generic/InstructionComparator.java | 71 +- .../bcel/generic/InstructionConstants.java | 491 ++-- .../bcel/generic/InstructionFactory.java | 1268 +++++---- .../bcel/generic/InstructionHandle.java | 456 ++-- .../apache/bcel/generic/InstructionList.java | 2396 ++++++++-------- .../bcel/generic/InstructionListObserver.java | 7 +- .../bcel/generic/InstructionTargeter.java | 10 +- .../bcel/generic/InvokeInstruction.java | 170 +- src/java/org/apache/bcel/generic/JSR.java | 95 +- src/java/org/apache/bcel/generic/JSR_W.java | 87 +- .../apache/bcel/generic/JsrInstruction.java | 101 +- src/java/org/apache/bcel/generic/L2D.java | 40 +- src/java/org/apache/bcel/generic/L2F.java | 40 +- src/java/org/apache/bcel/generic/L2I.java | 40 +- src/java/org/apache/bcel/generic/LADD.java | 40 +- src/java/org/apache/bcel/generic/LALOAD.java | 44 +- src/java/org/apache/bcel/generic/LAND.java | 40 +- src/java/org/apache/bcel/generic/LASTORE.java | 44 +- src/java/org/apache/bcel/generic/LCMP.java | 54 +- src/java/org/apache/bcel/generic/LCONST.java | 88 +- src/java/org/apache/bcel/generic/LDC.java | 224 +- src/java/org/apache/bcel/generic/LDC2_W.java | 93 +- src/java/org/apache/bcel/generic/LDC_W.java | 42 +- src/java/org/apache/bcel/generic/LDIV.java | 53 +- src/java/org/apache/bcel/generic/LLOAD.java | 50 +- src/java/org/apache/bcel/generic/LMUL.java | 40 +- src/java/org/apache/bcel/generic/LNEG.java | 40 +- .../org/apache/bcel/generic/LOOKUPSWITCH.java | 112 +- src/java/org/apache/bcel/generic/LOR.java | 40 +- src/java/org/apache/bcel/generic/LREM.java | 49 +- src/java/org/apache/bcel/generic/LRETURN.java | 40 +- src/java/org/apache/bcel/generic/LSHL.java | 40 +- src/java/org/apache/bcel/generic/LSHR.java | 40 +- src/java/org/apache/bcel/generic/LSTORE.java | 50 +- src/java/org/apache/bcel/generic/LSUB.java | 40 +- src/java/org/apache/bcel/generic/LUSHR.java | 40 +- src/java/org/apache/bcel/generic/LXOR.java | 40 +- .../apache/bcel/generic/LineNumberGen.java | 139 +- .../org/apache/bcel/generic/LoadClass.java | 47 +- .../apache/bcel/generic/LoadInstruction.java | 73 +- .../apache/bcel/generic/LocalVariableGen.java | 318 ++- .../generic/LocalVariableInstruction.java | 325 +-- .../org/apache/bcel/generic/MONITORENTER.java | 48 +- .../org/apache/bcel/generic/MONITOREXIT.java | 48 +- .../apache/bcel/generic/MULTIANEWARRAY.java | 218 +- .../org/apache/bcel/generic/MethodGen.java | 1998 +++++++------- .../apache/bcel/generic/MethodObserver.java | 7 +- src/java/org/apache/bcel/generic/NEW.java | 81 +- .../org/apache/bcel/generic/NEWARRAY.java | 164 +- src/java/org/apache/bcel/generic/NOP.java | 32 +- .../apache/bcel/generic/NamedAndTyped.java | 18 +- .../org/apache/bcel/generic/ObjectType.java | 233 +- src/java/org/apache/bcel/generic/POP.java | 38 +- src/java/org/apache/bcel/generic/POP2.java | 38 +- src/java/org/apache/bcel/generic/PUSH.java | 285 +- .../org/apache/bcel/generic/PUTFIELD.java | 85 +- .../org/apache/bcel/generic/PUTSTATIC.java | 82 +- .../apache/bcel/generic/PopInstruction.java | 4 +- .../apache/bcel/generic/PushInstruction.java | 4 +- src/java/org/apache/bcel/generic/RET.java | 200 +- src/java/org/apache/bcel/generic/RETURN.java | 40 +- .../apache/bcel/generic/ReferenceType.java | 560 ++-- .../bcel/generic/ReturnInstruction.java | 82 +- .../bcel/generic/ReturnaddressType.java | 95 +- src/java/org/apache/bcel/generic/SALOAD.java | 40 +- src/java/org/apache/bcel/generic/SASTORE.java | 40 +- src/java/org/apache/bcel/generic/SIPUSH.java | 133 +- src/java/org/apache/bcel/generic/SWAP.java | 38 +- src/java/org/apache/bcel/generic/SWITCH.java | 243 +- src/java/org/apache/bcel/generic/Select.java | 388 +-- .../apache/bcel/generic/StackConsumer.java | 11 +- .../apache/bcel/generic/StackInstruction.java | 40 +- .../apache/bcel/generic/StackProducer.java | 11 +- .../apache/bcel/generic/StoreInstruction.java | 73 +- .../org/apache/bcel/generic/TABLESWITCH.java | 138 +- .../bcel/generic/TargetLostException.java | 26 +- src/java/org/apache/bcel/generic/Type.java | 473 ++-- .../apache/bcel/generic/TypedInstruction.java | 7 +- .../bcel/generic/UnconditionalBranch.java | 7 +- .../generic/VariableLengthInstruction.java | 7 +- src/java/org/apache/bcel/generic/Visitor.java | 722 +++-- .../org/apache/bcel/util/AttributeHTML.java | 331 ++- .../org/apache/bcel/util/BCELComparator.java | 34 +- .../org/apache/bcel/util/BCELFactory.java | 515 ++-- src/java/org/apache/bcel/util/BCELifier.java | 407 ++- .../org/apache/bcel/util/ByteSequence.java | 48 +- src/java/org/apache/bcel/util/Class2HTML.java | 339 ++- .../org/apache/bcel/util/ClassLoader.java | 255 +- .../bcel/util/ClassLoaderRepository.java | 142 +- src/java/org/apache/bcel/util/ClassPath.java | 593 ++-- src/java/org/apache/bcel/util/ClassQueue.java | 33 +- src/java/org/apache/bcel/util/ClassSet.java | 53 +- src/java/org/apache/bcel/util/ClassStack.java | 32 +- .../org/apache/bcel/util/ClassVector.java | 39 +- src/java/org/apache/bcel/util/CodeHTML.java | 1050 ++++--- .../org/apache/bcel/util/ConstantHTML.java | 372 ++- .../apache/bcel/util/InstructionFinder.java | 822 +++--- .../org/apache/bcel/util/JavaWrapper.java | 131 +- src/java/org/apache/bcel/util/MethodHTML.java | 234 +- src/java/org/apache/bcel/util/Repository.java | 70 +- .../apache/bcel/util/SyntheticRepository.java | 243 +- .../bcel/verifier/GraphicalVerifier.java | 76 +- .../apache/bcel/verifier/NativeVerifier.java | 91 +- .../apache/bcel/verifier/PassVerifier.java | 105 +- .../apache/bcel/verifier/TransitiveHull.java | 134 +- .../bcel/verifier/VerificationResult.java | 143 +- .../org/apache/bcel/verifier/Verifier.java | 414 ++- .../bcel/verifier/VerifierAppFrame.java | 629 ++--- .../apache/bcel/verifier/VerifierFactory.java | 136 +- .../verifier/VerifierFactoryListModel.java | 68 +- .../verifier/VerifierFactoryObserver.java | 18 +- .../apache/bcel/verifier/VerifyDialog.java | 1005 +++---- .../exc/AssertionViolatedException.java | 12 +- .../VerifierConstraintViolatedException.java | 12 +- .../apache/bcel/verifier/statics/IntList.java | 4 +- .../verifier/statics/LocalVariablesInfo.java | 8 +- .../bcel/verifier/statics/Pass2Verifier.java | 126 +- .../bcel/verifier/statics/Pass3aVerifier.java | 23 +- .../statics/StringRepresentation.java | 4 +- .../structurals/ControlFlowGraph.java | 12 +- .../structurals/ExceptionHandlers.java | 5 +- .../structurals/ExecutionVisitor.java | 39 +- .../bcel/verifier/structurals/Frame.java | 4 +- .../structurals/InstConstraintVisitor.java | 39 +- .../verifier/structurals/LocalVariables.java | 8 +- .../verifier/structurals/OperandStack.java | 13 +- .../verifier/structurals/Subroutines.java | 8 +- .../structurals/UninitializedObjectType.java | 4 +- 349 files changed, 28558 insertions(+), 25886 deletions(-) diff --git a/examples/JasminVisitor.java b/examples/JasminVisitor.java index 3e939966..53b0dde7 100644 --- a/examples/JasminVisitor.java +++ b/examples/JasminVisitor.java @@ -73,8 +73,9 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { String[] interfaces = clazz.getInterfaceNames(); - for(int i=0; i < interfaces.length; i++) - out.println(".implements " + interfaces[i].replace('.', '/')); + for(int i=0; i < interfaces.length; i++) { + out.println(".implements " + interfaces[i].replace('.', '/')); + } out.print("\n"); } @@ -82,8 +83,9 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { public void visitField(Field field) { out.print(".field " + Utility.accessToString(field.getAccessFlags()) + " \"" +field.getName() + "\"" + field.getSignature()); - if(field.getAttributes().length == 0) - out.print("\n"); + if(field.getAttributes().length == 0) { + out.print("\n"); + } } public void visitConstantValue(ConstantValue cv) { @@ -100,15 +102,17 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { private final void printEndMethod(Attribute attr) { Attribute[] attributes = _method.getAttributes(); - if(attr == attributes[attributes.length - 1]) - out.println(".end method"); + if(attr == attributes[attributes.length - 1]) { + out.println(".end method"); + } } public void visitDeprecated(Deprecated attribute) { printEndMethod(attribute); } public void visitSynthetic(Synthetic attribute) { - if(_method != null) - printEndMethod(attribute); + if(_method != null) { + printEndMethod(attribute); + } } public void visitMethod(Method method) { @@ -118,14 +122,16 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { " " + _method.getName() + _method.getSignature()); Attribute[] attributes = _method.getAttributes(); - if((attributes == null) || (attributes.length == 0)) - out.println(".end method"); + if((attributes == null) || (attributes.length == 0)) { + out.println(".end method"); + } } public void visitExceptionTable(ExceptionTable e) { String[] names = e.getExceptionNames(); - for(int i=0; i < names.length; i++) - out.println(".throws " + names[i].replace('.', '/')); + for(int i=0; i < names.length; i++) { + out.println(".throws " + names[i].replace('.', '/')); + } printEndMethod(e); } @@ -154,8 +160,9 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { if(bi instanceof Select) { // Special cases LOOKUPSWITCH and TABLESWITCH InstructionHandle[] targets = ((Select)bi).getTargets(); - for(int j=0; j < targets.length; j++) - put(targets[j], "Label" + label_counter++ + ":"); + for(int j=0; j < targets.length; j++) { + put(targets[j], "Label" + label_counter++ + ":"); + } } InstructionHandle ih = bi.getTarget(); @@ -206,8 +213,9 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { Instruction inst = ih.getInstruction(); String str = (String)map.get(ih); - if(str != null) - out.println(str); + if(str != null) { + out.println(str); + } if(inst instanceof BranchInstruction) { if(inst instanceof Select) { // Special cases LOOKUPSWITCH and TABLESWITCH @@ -219,14 +227,16 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { out.println("\ttableswitch " + matchs[0] + " " + matchs[matchs.length - 1]); - for(int j=0; j < targets.length; j++) - out.println("\t\t" + get(targets[j])); + for(int j=0; j < targets.length; j++) { + out.println("\t\t" + get(targets[j])); + } } else { // LOOKUPSWITCH out.println("\tlookupswitch "); - for(int j=0; j < targets.length; j++) - out.println("\t\t" + matchs[j] + " : " + get(targets[j])); + for(int j=0; j < targets.length; j++) { + out.println("\t\t" + matchs[j] + " : " + get(targets[j])); + } } out.println("\t\tdefault: " + get(s.getTarget())); // Applies for both @@ -236,9 +246,9 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { str = get(ih); out.println("\t" + Constants.OPCODE_NAMES[bi.getOpcode()] + " " + str); } - } - else - out.println("\t" + inst.toString(cp.getConstantPool())); + } else { + out.println("\t" + inst.toString(cp.getConstantPool())); + } } out.print("\n"); @@ -265,27 +275,28 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { private final void put(InstructionHandle ih, String line) { String str = (String)map.get(ih); - if(str == null) - map.put(ih, line); - else { - if(line.startsWith("Label") || str.endsWith(line)) // Already have a label in the map - return; + if(str == null) { + map.put(ih, line); + } else { + if(line.startsWith("Label") || str.endsWith(line)) { + return; + } map.put(ih, str + "\n" + line); // append } } public static void main(String[] argv) { - ClassParser parser=null; JavaClass java_class; try { - if(argv.length == 0) - System.err.println("disassemble: No input files specified"); - else { + if(argv.length == 0) { + System.err.println("disassemble: No input files specified"); + } else { for(int i=0; i < argv.length; i++) { - if((java_class = Repository.lookupClass(argv[i])) == null) - java_class = new ClassParser(argv[i]).parse(); + if((java_class = Repository.lookupClass(argv[i])) == null) { + java_class = new ClassParser(argv[i]).parse(); + } String class_name = java_class.getClassName(); int index = class_name.lastIndexOf('.'); diff --git a/examples/Mini/ASCII_CharStream.java b/examples/Mini/ASCII_CharStream.java index 4ddad520..f582a489 100644 --- a/examples/Mini/ASCII_CharStream.java +++ b/examples/Mini/ASCII_CharStream.java @@ -89,17 +89,19 @@ public final class ASCII_CharStream bufpos = maxNextCharInd = 0; available = tokenBegin; } - else if (tokenBegin < 0) - bufpos = maxNextCharInd = 0; - else - ExpandBuff(false); + else if (tokenBegin < 0) { + bufpos = maxNextCharInd = 0; + } else { + ExpandBuff(false); + } + } + else if (available > tokenBegin) { + available = bufsize; + } else if ((tokenBegin - available) < 2048) { + ExpandBuff(true); + } else { + available = tokenBegin; } - else if (available > tokenBegin) - available = bufsize; - else if ((tokenBegin - available) < 2048) - ExpandBuff(true); - else - available = tokenBegin; } int i; @@ -109,16 +111,17 @@ public final class ASCII_CharStream { inputStream.close(); throw new java.io.IOException(); + } else { + maxNextCharInd += i; } - else - maxNextCharInd += i; return; } catch(java.io.IOException e) { --bufpos; backup(0); - if (tokenBegin == -1) - tokenBegin = bufpos; + if (tokenBegin == -1) { + tokenBegin = bufpos; + } throw e; } } @@ -147,9 +150,9 @@ public final class ASCII_CharStream if (c == '\n') { prevCharIsLF = true; + } else { + line += (column = 1); } - else - line += (column = 1); } switch (c) @@ -180,8 +183,9 @@ public final class ASCII_CharStream return (char)((char)0xff & buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos]); } - if (++bufpos >= maxNextCharInd) + if (++bufpos >= maxNextCharInd) { FillBuff(); + } char c = (char)((char)0xff & buffer[bufpos]); @@ -226,17 +230,19 @@ public final class ASCII_CharStream static public final void backup(int amount) { inBuf += amount; - if ((bufpos -= amount) < 0) - bufpos += bufsize; + if ((bufpos -= amount) < 0) { + bufpos += bufsize; + } } public ASCII_CharStream(java.io.Reader dstream, int startline, int startcolumn, int buffersize) { - if (inputStream != null) - throw new Error("\n ERROR: Second call to the constructor of a static ASCII_CharStream. You must\n" + - " either use ReInit() or set the JavaCC option STATIC to false\n" + - " during the generation of this class."); + if (inputStream != null) { + throw new Error("\n ERROR: Second call to the constructor of a static ASCII_CharStream. You must\n" + + " either use ReInit() or set the JavaCC option STATIC to false\n" + + " during the generation of this class."); + } inputStream = dstream; line = startline; column = startcolumn - 1; @@ -300,20 +306,21 @@ public final class ASCII_CharStream } static public final String GetImage() { - if (bufpos >= tokenBegin) + if (bufpos >= tokenBegin) { return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); - else + } else { return new String(buffer, tokenBegin, bufsize - tokenBegin) + new String(buffer, 0, bufpos + 1); + } } static public final char[] GetSuffix(int len) { char[] ret = new char[len]; - if ((bufpos + 1) >= len) + if ((bufpos + 1) >= len) { System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); - else + } else { System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, len - bufpos - 1); @@ -367,10 +374,11 @@ public final class ASCII_CharStream while (i++ < len) { - if (bufline[j = start % bufsize] != bufline[++start % bufsize]) - bufline[j] = newLine++; - else - bufline[j] = newLine; + if (bufline[j = start % bufsize] != bufline[++start % bufsize]) { + bufline[j] = newLine++; + } else { + bufline[j] = newLine; + } } } diff --git a/examples/Mini/ASTExpr.java b/examples/Mini/ASTExpr.java index 4b98fa93..451af529 100644 --- a/examples/Mini/ASTExpr.java +++ b/examples/Mini/ASTExpr.java @@ -83,10 +83,11 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan public String toString() { String op=""; int len = (children != null)? children.length : 0; - if(unop != -1) - op = tokenImage[unop]; - else if(kind != -1) - op = tokenImage[kind]; + if(unop != -1) { + op = tokenImage[unop]; + } else if(kind != -1) { + op = tokenImage[kind]; + } return jjtNodeName[id] + "(" + op + ")[" + len + "]<" + TYPE_NAMES[type] + "> @" + line + ", " + column; @@ -114,11 +115,12 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan public ASTExpr traverse(Environment env) { this.env = env; - if((kind == -1) && (unop == -1)) // Redundant node (built thru op precedence) ? - return exprs[0].traverse(env); // --> Replaced by successor - else { - for(int i=0; i < exprs.length; i++) // Traverse children - exprs[i] = exprs[i].traverse(env); // References may change + if((kind == -1) && (unop == -1)) { + return exprs[0].traverse(env); // --> Replaced by successor + } else { + for(int i=0; i < exprs.length; i++) { + exprs[i] = exprs[i].traverse(env); // References may change + } return this; } @@ -136,19 +138,20 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan // Determine expected node type depending on used operator. if(unop != -1) { - if(unop == MINUS) - child_type = type = T_INT; // - - else - child_type = type = T_BOOLEAN; // ! + if(unop == MINUS) { + child_type = type = T_INT; // - + } else { + child_type = type = T_BOOLEAN; // ! + } } else { // Compute expected type if((kind == PLUS) || (kind == MINUS) || (kind == MULT) || - (kind == MOD) || (kind == DIV)) - child_type = type = T_INT; - else if((kind == AND) || (kind == OR)) - child_type = type = T_BOOLEAN; - else { // LEQ, GT, etc. + (kind == MOD) || (kind == DIV)) { + child_type = type = T_INT; + } else if((kind == AND) || (kind == OR)) { + child_type = type = T_BOOLEAN; + } else { // LEQ, GT, etc. child_type = T_INT; type = T_BOOLEAN; } @@ -158,10 +161,11 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan for(int i=0; i < exprs.length; i++) { t = exprs[i].eval(child_type); - if(t != child_type) - MiniC.addError(exprs[i].getLine(), exprs[i].getColumn(), - "Expression has not expected type " + TYPE_NAMES[child_type] + - " but " + TYPE_NAMES[t] + "."); + if(t != child_type) { + MiniC.addError(exprs[i].getLine(), exprs[i].getColumn(), + "Expression has not expected type " + TYPE_NAMES[child_type] + + " but " + TYPE_NAMES[t] + "."); + } is_simple = is_simple && exprs[i].isSimple(); } @@ -184,10 +188,11 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan if(unop != -1) { exprs[0].code(buf); String top = ASTFunDecl.pop(); - if(unop == MINUS) - ASTFunDecl.push(buf, "-" + top); - else - ASTFunDecl.push(buf, "(" + top + " == 1)? 0 : 1)"); + if(unop == MINUS) { + ASTFunDecl.push(buf, "-" + top); + } else { + ASTFunDecl.push(buf, "(" + top + " == 1)? 0 : 1)"); + } } else { exprs[0].code(buf); @@ -231,9 +236,9 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan exprs[0].byte_code(il, method, cp); if(unop != -1) { // Apply unary operand - if(unop == MINUS) - il.append(InstructionConstants.INEG); - else { // == NOT + if(unop == MINUS) { + il.append(InstructionConstants.INEG); + } else { // == NOT il.append(new PUSH(cp, 1)); ASTFunDecl.push(); // Push TRUE il.append(InstructionConstants.IXOR); ASTFunDecl.pop(); } @@ -296,8 +301,10 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan public void dump(String prefix) { System.out.println(toString(prefix)); - if(exprs != null) // Children may have no subchildren - for(int i=0; i < exprs.length; ++i) - exprs[i].dump(prefix + " "); + if(exprs != null) { + for(int i=0; i < exprs.length; ++i) { + exprs[i].dump(prefix + " "); + } + } } } diff --git a/examples/Mini/ASTFactor.java b/examples/Mini/ASTFactor.java index cc14daf7..25a58973 100644 --- a/examples/Mini/ASTFactor.java +++ b/examples/Mini/ASTFactor.java @@ -29,9 +29,10 @@ public class ASTFactor extends ASTExpr { * and may be safely replaced with it. */ public ASTExpr traverse(Environment env) { - if(kind == -1) // Drop it - return exprs[0].traverse(env); - else // Or convert it to Expr node & copy children - return new ASTExpr(exprs, kind, line, column).traverse(env); + if(kind == -1) { + return exprs[0].traverse(env); + } else { + return new ASTExpr(exprs, kind, line, column).traverse(env); + } } } diff --git a/examples/Mini/ASTFunAppl.java b/examples/Mini/ASTFunAppl.java index bbee7e6e..1c966446 100644 --- a/examples/Mini/ASTFunAppl.java +++ b/examples/Mini/ASTFunAppl.java @@ -66,31 +66,33 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, this.env = env; - if(entry == null) // Applying unknown function - MiniC.addError(name.getLine(), name.getColumn(), - "Applying unknown function " + fname + "."); - else { - if(!(entry instanceof Function)) - MiniC.addError(name.getLine(), name.getColumn(), - "Applying non-function " + fname + "."); - else { + if(entry == null) { + MiniC.addError(name.getLine(), name.getColumn(), + "Applying unknown function " + fname + "."); + } else { + if(!(entry instanceof Function)) { + MiniC.addError(name.getLine(), name.getColumn(), + "Applying non-function " + fname + "."); + } else { int len = (exprs != null)? exprs.length : 0; Function fun = (Function)entry; - if(len != fun.getNoArgs()) - MiniC.addError(name.getLine(), name.getColumn(), - "Function " + fname + " expects " + fun.getNoArgs() + - " arguments, you supplied " + len + "."); - else { // Adjust references + if(len != fun.getNoArgs()) { + MiniC.addError(name.getLine(), name.getColumn(), + "Function " + fname + " expects " + fun.getNoArgs() + + " arguments, you supplied " + len + "."); + } else { // Adjust references function = fun; name = fun.getName(); } } } - if(exprs != null) // Argument list may be empty - for(int i=0; i < exprs.length; i++) - exprs[i] = exprs[i].traverse(env); + if(exprs != null) { + for(int i=0; i < exprs.length; i++) { + exprs[i] = exprs[i].traverse(env); + } + } return this; } @@ -116,20 +118,22 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, int expect = args[i].getType(); // May be T_UNKNOWN int t_e = exprs[i].eval(expect); // May be T_UNKNOWN - if((expect != T_UNKNOWN) && (t_e != expect)) - MiniC.addError(exprs[i].getLine(), exprs[i].getColumn(), - "Argument " + (i + 1) + " in application of " + fname + - " is not of type " + TYPE_NAMES[expect] + " but " + - TYPE_NAMES[t_e]); - else - args[i].setType(t_e); // Update, may be identical + if((expect != T_UNKNOWN) && (t_e != expect)) { + MiniC.addError(exprs[i].getLine(), exprs[i].getColumn(), + "Argument " + (i + 1) + " in application of " + fname + + " is not of type " + TYPE_NAMES[expect] + " but " + + TYPE_NAMES[t_e]); + } else { + args[i].setType(t_e); // Update, may be identical + } is_simple = is_simple && exprs[i].isSimple(); // Check condition } } - if(t == T_UNKNOWN) // Function type yet unknown - fun.setType(t = expected); // May be still T_UNKNOWN + if(t == T_UNKNOWN) { + fun.setType(t = expected); // May be still T_UNKNOWN + } return type = t; } @@ -142,16 +146,17 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, Function f = function; ASTIdent[] args = f.getArgs(); - if(fname.equals("READ")) - ASTFunDecl.push(buf, "_readInt()"); - else if(fname.equals("WRITE")) { + if(fname.equals("READ")) { + ASTFunDecl.push(buf, "_readInt()"); + } else if(fname.equals("WRITE")) { exprs[0].code(buf); ASTFunDecl.push(buf, "_writeInt(" + ASTFunDecl.pop() + ")"); } else { // Normal function if(exprs != null) { // Output in reverse odrder - for(int i = exprs.length - 1; i >= 0; i--) - exprs[i].code(buf); + for(int i = exprs.length - 1; i >= 0; i--) { + exprs[i].code(buf); + } } StringBuffer call = new StringBuffer(fname + "("); @@ -160,8 +165,9 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, if(exprs != null) { for(int i=0; i < exprs.length; i++) { call.append(ASTFunDecl.pop()); - if(i < exprs.length - 1) - call.append(", "); + if(i < exprs.length - 1) { + call.append(", "); + } } } call.append(")"); @@ -180,11 +186,11 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, ASTIdent[] args = f.getArgs(); String class_name = method.getClassName(); - if(fname.equals("READ")) - il.append(new INVOKESTATIC(cp.addMethodref(class_name, - "_readInt", - "()I"))); - else if(fname.equals("WRITE")) { + if(fname.equals("READ")) { + il.append(new INVOKESTATIC(cp.addMethodref(class_name, + "_readInt", + "()I"))); + } else if(fname.equals("WRITE")) { exprs[0].byte_code(il, method, cp); ASTFunDecl.pop(); il.append(new INVOKESTATIC(cp.addMethodref(class_name, diff --git a/examples/Mini/ASTFunDecl.java b/examples/Mini/ASTFunDecl.java index 5f628596..e5d30681 100644 --- a/examples/Mini/ASTFunDecl.java +++ b/examples/Mini/ASTFunDecl.java @@ -73,8 +73,9 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { body = (ASTExpr)children[children.length - 1]; argv = new ASTIdent[children.length - 2]; // May be 0-size array - for(int i = 1; i < children.length - 1; i++) - argv[i - 1] = (ASTIdent)children[i]; + for(int i = 1; i < children.length - 1; i++) { + argv[i - 1] = (ASTIdent)children[i]; + } children=null; // Throw away old reference } @@ -89,11 +90,12 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { for(int i=0; i < argv.length; i++) { EnvEntry entry = env.get(argv[i].getName()); - if(entry != null) - MiniC.addError(argv[i].getLine(), argv[i].getColumn(), - "Redeclaration of " + entry + "."); - else - env.put(new Variable(argv[i])); + if(entry != null) { + MiniC.addError(argv[i].getLine(), argv[i].getColumn(), + "Redeclaration of " + entry + "."); + } else { + env.put(new Variable(argv[i])); + } } /* Update entry of this function, i.e. set argument references. @@ -117,17 +119,19 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { int expected = name.getType(); // Maybe other function has already called us type = body.eval(expected); // And updated the env - if((expected != T_UNKNOWN) && (type != expected)) - MiniC.addError(line, column, - "Function f ist not of type " + TYPE_NAMES[expected] + - " as previously assumed, but " + TYPE_NAMES[type]); + if((expected != T_UNKNOWN) && (type != expected)) { + MiniC.addError(line, column, + "Function f ist not of type " + TYPE_NAMES[expected] + + " as previously assumed, but " + TYPE_NAMES[type]); + } name.setType(type); is_simple = body.isSimple(); - if(pass == 2 && type == T_UNKNOWN) - is_recursive = true; + if(pass == 2 && type == T_UNKNOWN) { + is_recursive = true; + } return type; } @@ -155,8 +159,9 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { for(int i = 0; i < argv.length; i++) { out.print("int " + argv[i].getName()); - if(i < argv.length - 1) - out.print(", "); + if(i < argv.length - 1) { + out.print(", "); + } } out.println(")\n throws IOException\n {"); @@ -170,15 +175,17 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { expr = buf.toString(); - if(main) - out.println(" try {"); + if(main) { + out.println(" try {"); + } out.println(expr); - if(main) - out.println(" } catch(Exception e) { System.err.println(e); }\n }\n"); - else - out.println("\n return " + pop() + ";\n }\n"); + if(main) { + out.println(" } catch(Exception e) { System.err.println(e); }\n }\n"); + } else { + out.println("\n return " + pop() + ";\n }\n"); + } } reset(); @@ -255,9 +262,9 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { end_handler = il.append(InstructionConstants.RETURN); method.addExceptionHandler(start, end, handler, e_type); exc.setStart(handler); exc.setEnd(end_handler); - } - else - il.append(InstructionConstants.IRETURN); // Reuse object to save memory + } else { + il.append(InstructionConstants.IRETURN); // Reuse object to save memory + } method.removeNOPs(); // First optimization pass, provided by MethodGen optimizeIFs(il); // Second optimization pass, application-specific @@ -297,8 +304,6 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { for(Iterator it = f.search(pat, my_constraint); it.hasNext();) { InstructionHandle[] match = (InstructionHandle[])it.next(); - int len = match.length; - // Everything ok, update code BranchInstruction ifeq = (BranchInstruction)(match[4].getInstruction()); BranchHandle if_icmp = (BranchHandle)match[0]; @@ -315,9 +320,11 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { for(int i=0; i < targets.length; i++) { InstructionTargeter[] targeters = targets[i].getTargeters(); - for(int j=0; j < targeters.length; j++) - if((targets[i] != match[4]) || (targeters[j] != match[2])) - System.err.println("Ooops: " + e); + for(int j=0; j < targeters.length; j++) { + if((targets[i] != match[4]) || (targeters[j] != match[2])) { + System.err.println("Ooops: " + e); + } + } } } } @@ -332,8 +339,9 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { for(int i = 0; i < argv.length; i++) { buf.append(argv[i].getName()); - if(i < argv.length - 1) - buf.append(", "); + if(i < argv.length - 1) { + buf.append(", "); + } } buf.append(")"); @@ -362,8 +370,9 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { public void dump(String prefix) { System.out.println(toString(prefix)); - for(int i = 0; i < argv.length; i++) - argv[i].dump(prefix + " "); + for(int i = 0; i < argv.length; i++) { + argv[i].dump(prefix + " "); + } body.dump(prefix + " "); } @@ -380,8 +389,9 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { for(int i=0; i < max_size; i++) { buf.append("_s" + i); - if(i < max_size - 1) - buf.append(", "); + if(i < max_size - 1) { + buf.append(", "); + } } buf.append(";\n"); @@ -394,8 +404,9 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { static final void push(int s) { size += s; - if(size > max_size) - max_size = size; + if(size > max_size) { + max_size = size; + } } static final void push() { push(1); } diff --git a/examples/Mini/ASTIdent.java b/examples/Mini/ASTIdent.java index f8fd0a70..874fbf28 100644 --- a/examples/Mini/ASTIdent.java +++ b/examples/Mini/ASTIdent.java @@ -53,13 +53,14 @@ public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { public ASTExpr traverse(Environment env) { EnvEntry entry = env.get(name); - if(entry == null) - MiniC.addError(line, column, "Undeclared identifier " + name); - else if(entry instanceof Function) - MiniC.addError(line, column, - "Function " + name + " used as an identifier."); - else - reference = (Variable)entry; + if(entry == null) { + MiniC.addError(line, column, "Undeclared identifier " + name); + } else if(entry instanceof Function) { + MiniC.addError(line, column, + "Function " + name + " used as an identifier."); + } else { + reference = (Variable)entry; + } return this; // Nothing to reduce/traverse further here } @@ -73,18 +74,18 @@ public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { is_simple = true; // (Very) simple expression, always true - if((t == T_UNKNOWN) && (expected == T_UNKNOWN)) - type = T_UNKNOWN; - else if((t == T_UNKNOWN) && (expected != T_UNKNOWN)) { + if((t == T_UNKNOWN) && (expected == T_UNKNOWN)) { + type = T_UNKNOWN; + } else if((t == T_UNKNOWN) && (expected != T_UNKNOWN)) { ident.setType(expected); type = expected; } else if((t != T_UNKNOWN) && (expected == T_UNKNOWN)) { ident.setType(t); type = t; + } else { + type = t; // Caller has to check for an error, i.e. t != expected } - else // (t != T_UNKNOWN) && (expected != T_UNKNOWN) - type = t; // Caller has to check for an error, i.e. t != expected return type; } @@ -93,23 +94,24 @@ public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { * Fourth pass, produce Java code. */ public void code(StringBuffer buf) { - if(name.equals("TRUE")) - ASTFunDecl.push(buf, "1"); - else if(name.equals("FALSE")) - ASTFunDecl.push(buf, "0"); - else - ASTFunDecl.push(buf, name); + if(name.equals("TRUE")) { + ASTFunDecl.push(buf, "1"); + } else if(name.equals("FALSE")) { + ASTFunDecl.push(buf, "0"); + } else { + ASTFunDecl.push(buf, name); + } } /** * Fifth pass, produce Java byte code. */ public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { - if(name.equals("TRUE")) - il.append(new PUSH(cp, 1)); - else if(name.equals("FALSE")) - il.append(new PUSH(cp, 0)); - else { + if(name.equals("TRUE")) { + il.append(new PUSH(cp, 1)); + } else if(name.equals("FALSE")) { + il.append(new PUSH(cp, 0)); + } else { LocalVariableGen local_var = reference.getLocalVariable(); il.append(new ILOAD(local_var.getIndex())); } diff --git a/examples/Mini/ASTIfExpr.java b/examples/Mini/ASTIfExpr.java index b98b7862..1a929add 100644 --- a/examples/Mini/ASTIfExpr.java +++ b/examples/Mini/ASTIfExpr.java @@ -39,11 +39,12 @@ public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { if_expr = (ASTExpr)children[0]; then_expr = (ASTExpr)children[1]; - if(children.length == 3) // has else branch - else_expr = (ASTExpr)children[2]; - else - MiniC.addError(if_expr.getLine(), if_expr.getColumn(), - "IF expression has no ELSE branch"); + if(children.length == 3) { + else_expr = (ASTExpr)children[2]; + } else { + MiniC.addError(if_expr.getLine(), if_expr.getColumn(), + "IF expression has no ELSE branch"); + } children=null; // Throw away } @@ -57,8 +58,9 @@ public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { if_expr = if_expr.traverse(env); then_expr = then_expr.traverse(env); - if(else_expr != null) - else_expr = else_expr.traverse(env); + if(else_expr != null) { + else_expr = else_expr.traverse(env); + } return this; } @@ -72,26 +74,28 @@ public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { public int eval(int expected) { int then_type, else_type, if_type; - if((if_type=if_expr.eval(T_BOOLEAN)) != T_BOOLEAN) - MiniC.addError(if_expr.getLine(), if_expr.getColumn(), - "IF expression is not of type boolean, but " + - TYPE_NAMES[if_type] + "."); + if((if_type=if_expr.eval(T_BOOLEAN)) != T_BOOLEAN) { + MiniC.addError(if_expr.getLine(), if_expr.getColumn(), + "IF expression is not of type boolean, but " + + TYPE_NAMES[if_type] + "."); + } then_type=then_expr.eval(expected); - if((expected != T_UNKNOWN) && (then_type != expected)) - MiniC.addError(then_expr.getLine(), then_expr.getColumn(), - "THEN expression is not of expected type " + - TYPE_NAMES[expected] + " but " + TYPE_NAMES[then_type] + "."); + if((expected != T_UNKNOWN) && (then_type != expected)) { + MiniC.addError(then_expr.getLine(), then_expr.getColumn(), + "THEN expression is not of expected type " + + TYPE_NAMES[expected] + " but " + TYPE_NAMES[then_type] + "."); + } if(else_expr != null) { else_type = else_expr.eval(expected); - if((expected != T_UNKNOWN) && (else_type != expected)) - MiniC.addError(else_expr.getLine(), else_expr.getColumn(), - "ELSE expression is not of expected type " + - TYPE_NAMES[expected] + " but " + TYPE_NAMES[else_type] + "."); - else if(then_type == T_UNKNOWN) { + if((expected != T_UNKNOWN) && (else_type != expected)) { + MiniC.addError(else_expr.getLine(), else_expr.getColumn(), + "ELSE expression is not of expected type " + + TYPE_NAMES[expected] + " but " + TYPE_NAMES[else_type] + "."); + } else if(then_type == T_UNKNOWN) { then_type = else_type; then_expr.setType(else_type); } @@ -101,10 +105,11 @@ public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { else_expr = then_expr; } - if(then_type != else_type) - MiniC.addError(line, column, - "Type mismatch in THEN-ELSE: " + - TYPE_NAMES[then_type] + " vs. " + TYPE_NAMES[else_type] + "."); + if(then_type != else_type) { + MiniC.addError(line, column, + "Type mismatch in THEN-ELSE: " + + TYPE_NAMES[then_type] + " vs. " + TYPE_NAMES[else_type] + "."); + } type = then_type; @@ -155,7 +160,8 @@ public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { if_expr.dump(prefix + " "); then_expr.dump(prefix + " "); - if(else_expr != null) - else_expr.dump(prefix + " "); + if(else_expr != null) { + else_expr.dump(prefix + " "); + } } } diff --git a/examples/Mini/ASTLetExpr.java b/examples/Mini/ASTLetExpr.java index c8c1839d..883ea73f 100644 --- a/examples/Mini/ASTLetExpr.java +++ b/examples/Mini/ASTLetExpr.java @@ -62,8 +62,9 @@ public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { this.env = env; // Traverse RHS exprs first, so no references to LHS vars are allowed - for(int i=0; i < exprs.length; i++) - exprs[i] = exprs[i].traverse((Environment)env.clone()); + for(int i=0; i < exprs.length; i++) { + exprs[i] = exprs[i].traverse((Environment)env.clone()); + } // Put argument names into hash table aka. environment for(int i=0; i < idents.length; i++) { @@ -71,11 +72,12 @@ public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { String name = id.getName(); EnvEntry entry = env.get(name); - if(entry != null) - MiniC.addError(id.getLine(), id.getColumn(), - "Redeclaration of " + entry + "."); - else - env.put(new Variable(id)); + if(entry != null) { + MiniC.addError(id.getLine(), id.getColumn(), + "Redeclaration of " + entry + "."); + } else { + env.put(new Variable(id)); + } } body = body.traverse(env); @@ -147,8 +149,9 @@ public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { body.byte_code(il, method, cp); InstructionHandle end = il.getEnd(); - for(int i=0; i < size; i++) - l[i].setEnd(end); + for(int i=0; i < size; i++) { + l[i].setEnd(end); + } } public void dump(String prefix) { diff --git a/examples/Mini/ASTProgram.java b/examples/Mini/ASTProgram.java index 0187f2e8..68ffd8d0 100644 --- a/examples/Mini/ASTProgram.java +++ b/examples/Mini/ASTProgram.java @@ -106,11 +106,12 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan fname = name.getName(); fun = env.get(fname); // Lookup in env - if(fun != null) - MiniC.addError(f.getLine(), f.getColumn(), - "Redeclaration of " + fun + "."); - else - env.put(new Function(name, null)); // `args' will be set by FunDecl.traverse() + if(fun != null) { + MiniC.addError(f.getLine(), f.getColumn(), + "Redeclaration of " + fun + "."); + } else { + env.put(new Function(name, null)); // `args' will be set by FunDecl.traverse() + } } @@ -121,15 +122,17 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan // Look for `main' routine fname = fun_decls[i].getName().getName(); - if(fname.equals("main")) - main = (Function)env.get(fname); + if(fname.equals("main")) { + main = (Function)env.get(fname); + } } - if(main == null) - MiniC.addError(0, 0, "You didn't declare a `main' function."); - else if(main.getNoArgs() != 0) - MiniC.addError(main.getLine(), main.getColumn(), - "Main function has too many arguments declared."); + if(main == null) { + MiniC.addError(0, 0, "You didn't declare a `main' function."); + } else if(main.getNoArgs() != 0) { + MiniC.addError(main.getLine(), main.getColumn(), + "Main function has too many arguments declared."); + } } return this; @@ -147,10 +150,11 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan if(pass == 3) { // Final check for unresolved types ASTIdent name = fun_decls[i].getName(); - if(name.getType() == T_UNKNOWN) - MiniC.addError(name.getColumn(), name.getLine(), - "Type of function " + name.getName() + - " can not be determined (infinite recursion?)."); + if(name.getType() == T_UNKNOWN) { + MiniC.addError(name.getColumn(), name.getLine(), + "Type of function " + name.getName() + + " can not be determined (infinite recursion?)."); + } } } } @@ -174,8 +178,9 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan out.println(" private static final int _writeInt(int n) {\n" + " System.out.println(\"Result: \" + n);\n return 0;\n }\n"); - for(int i=0; i < fun_decls.length; i++) - fun_decls[i].code(out); + for(int i=0; i < fun_decls.length; i++) { + fun_decls[i].code(out); + } out.println("}"); } @@ -192,9 +197,7 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan null, cp.getConstantPool())); MethodGen method; - Method m; InstructionList il = new InstructionList(); - byte[] byte_code; String class_name = class_gen.getClassName(); /* Often used constant pool entries @@ -303,14 +306,16 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan method.setMaxStack(5); class_gen.addMethod(method.getMethod()); - for(int i=0; i < fun_decls.length; i++) - fun_decls[i].byte_code(class_gen, cp); + for(int i=0; i < fun_decls.length; i++) { + fun_decls[i].byte_code(class_gen, cp); + } } public void dump(String prefix) { System.out.println(toString(prefix)); - for(int i = 0; i < fun_decls.length; ++i) - fun_decls[i].dump(prefix + " "); + for(int i = 0; i < fun_decls.length; ++i) { + fun_decls[i].dump(prefix + " "); + } } } diff --git a/examples/Mini/ASTTerm.java b/examples/Mini/ASTTerm.java index 7d467f15..691be0c6 100644 --- a/examples/Mini/ASTTerm.java +++ b/examples/Mini/ASTTerm.java @@ -29,9 +29,10 @@ public class ASTTerm extends ASTExpr { * and may be safely replaced with it. */ public ASTExpr traverse(Environment env) { - if(kind == -1) // Drop it - return exprs[0].traverse(env); - else // Or convert it to Expr node, copy children - return new ASTExpr(exprs, kind, line, column).traverse(env); + if(kind == -1) { + return exprs[0].traverse(env); + } else { + return new ASTExpr(exprs, kind, line, column).traverse(env); + } } } diff --git a/examples/Mini/Environment.java b/examples/Mini/Environment.java index 816aa45a..ded86ee6 100644 --- a/examples/Mini/Environment.java +++ b/examples/Mini/Environment.java @@ -55,9 +55,9 @@ public class Environment implements Cloneable { elements++; // Count - if(v == null) // Not yet initialized - table[hash] = v = new Vector(SLOTS); - else { + if(v == null) { + table[hash] = v = new Vector(SLOTS); + } else { try { int index = lookup(v, key); @@ -82,14 +82,16 @@ public class Environment implements Cloneable { hash = hashCode(key); v = table[hash]; - if(v == null) - return null; + if(v == null) { + return null; + } try { int index = lookup(v, key); - if(index >= 0) - entry = (EnvEntry)v.elementAt(index); + if(index >= 0) { + entry = (EnvEntry)v.elementAt(index); + } } catch(ArrayIndexOutOfBoundsException e) {} return entry; @@ -105,8 +107,9 @@ public class Environment implements Cloneable { hash = hashCode(key); v = table[hash]; - if(v == null) - return; + if(v == null) { + return; + } try { int index = lookup(v, key); @@ -126,8 +129,9 @@ public class Environment implements Cloneable { for(int i=0; i < len; i++) { EnvEntry entry = (EnvEntry)v.elementAt(i); - if(entry.getHashKey().equals(key)) // Found index - return i; + if(entry.getHashKey().equals(key)) { + return i; + } } return -1; @@ -157,9 +161,11 @@ public class Environment implements Cloneable { public String toString() { StringBuffer buf = new StringBuffer(); - for(int i=0; i < size; i++) - if(table[i] != null) - buf.append(table[i] + "\n"); + for(int i=0; i < size; i++) { + if(table[i] != null) { + buf.append(table[i] + "\n"); + } + } return buf.toString(); } @@ -173,8 +179,9 @@ public class Environment implements Cloneable { if((v = table[i]) != null) { int len = v.size(); try { - for(int j=0; j < len; j++) - entries[k++] = (EnvEntry)v.elementAt(j); + for(int j=0; j < len; j++) { + entries[k++] = (EnvEntry)v.elementAt(j); + } } catch(ArrayIndexOutOfBoundsException e) {} } } diff --git a/examples/Mini/Function.java b/examples/Mini/Function.java index 06a12cb3..51ccf87c 100644 --- a/examples/Mini/Function.java +++ b/examples/Mini/Function.java @@ -37,16 +37,18 @@ public class Function implements org.apache.bcel.Constants, EnvEntry { for(int i=0; i < no_args; i++) { buf.append(args[i].getName()); - if(i < no_args - 1) - buf.append(", "); + if(i < no_args - 1) { + buf.append(", "); + } } String prefix = "Function " + fun_name + "(" + buf.toString() + ")"; - if(!reserved) - return prefix + " declared at line " + line + ", column " + column; - else - return prefix + " "; + if(!reserved) { + return prefix + " declared at line " + line + ", column " + column; + } else { + return prefix + " "; + } } public int getNoArgs() { return no_args; } diff --git a/examples/Mini/MiniC.java b/examples/Mini/MiniC.java index 5782ccb8..22a0c5c5 100644 --- a/examples/Mini/MiniC.java +++ b/examples/Mini/MiniC.java @@ -25,39 +25,44 @@ public class MiniC implements org.apache.bcel.Constants { */ for(int i=0; i < argv.length; i++) { if(argv[i].charAt(0) == '-') { // command line switch - if(argv[i].equals("-java")) - byte_code=false; - else if(argv[i].equals("-bytecode")) - byte_code=true; - else - throw new Exception("Unknown option: " + argv[i]); + if(argv[i].equals("-java")) { + byte_code=false; + } else if(argv[i].equals("-bytecode")) { + byte_code=true; + } else { + throw new Exception("Unknown option: " + argv[i]); + } } else { // add file name to list file_name[files++] = argv[i]; } } - if(files == 0) - System.err.println("Nothing to compile."); + if(files == 0) { + System.err.println("Nothing to compile."); + } for(int j=0; j < files; j++) { errors = new Vector(); warnings = new Vector(); pass = 0; - if(j == 0) - parser = new MiniParser(new java.io.FileInputStream(file_name[0])); - else - parser.ReInit(new java.io.FileInputStream(file_name[j])); + if(j == 0) { + parser = new MiniParser(new java.io.FileInputStream(file_name[0])); + } else { + parser.ReInit(new java.io.FileInputStream(file_name[j])); + } int index = file_name[j].lastIndexOf('.'); - if(index > 0) - base_name = file_name[j].substring(0, index); - else - base_name = file_name[j]; + if(index > 0) { + base_name = file_name[j].substring(0, index); + } else { + base_name = file_name[j]; + } - if((index = base_name.lastIndexOf(File.separatorChar)) > 0) - base_name = base_name.substring(index + 1); + if((index = base_name.lastIndexOf(File.separatorChar)) > 0) { + base_name = base_name.substring(index + 1); + } file = file_name[j]; @@ -80,11 +85,13 @@ public class MiniC implements org.apache.bcel.Constants { program.eval(pass=3); } - for(int i=0; i < errors.size(); i++) - System.out.println(errors.elementAt(i)); + for(int i=0; i < errors.size(); i++) { + System.out.println(errors.elementAt(i)); + } - for(int i=0; i < warnings.size(); i++) - System.out.println(warnings.elementAt(i)); + for(int i=0; i < warnings.size(); i++) { + System.out.println(warnings.elementAt(i)); + } if(errors.size() == 0) { if(byte_code) { @@ -118,18 +125,20 @@ public class MiniC implements org.apache.bcel.Constants { } } - if((errors.size() > 0) || (warnings.size() > 0)) - System.out.println(errors.size() + " errors and " + warnings.size() + - " warnings."); + if((errors.size() > 0) || (warnings.size() > 0)) { + System.out.println(errors.size() + " errors and " + warnings.size() + + " warnings."); + } } } catch(Exception e) { e.printStackTrace(); } } final static void addError(int line, int column, String err) { - if(pass != 2) - errors.addElement(file + ":" + fillup(line, 3) + "," + fillup(column, 2) + - ": " + err); + if(pass != 2) { + errors.addElement(file + ":" + fillup(line, 3) + "," + fillup(column, 2) + + ": " + err); + } } final static void addWarning(int line, int column, String err) { @@ -144,13 +153,14 @@ public class MiniC implements org.apache.bcel.Constants { if(diff > 0) { char[] chs = new char[diff]; - for(int i=0; i < diff; i++) - chs[i] = ' '; + for(int i=0; i < diff; i++) { + chs[i] = ' '; + } return new String(chs) + str; + } else { + return str; } - else - return str; } final static void addWarning(String err) { warnings.addElement(err); } diff --git a/examples/Mini/MiniParser.java b/examples/Mini/MiniParser.java index ce568c48..72b1fc40 100644 --- a/examples/Mini/MiniParser.java +++ b/examples/Mini/MiniParser.java @@ -38,12 +38,18 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jjtree.popNode(); } if (jjte000 instanceof ParseException) { - {if (true) throw (ParseException)jjte000;} + {if (true) { + throw (ParseException)jjte000; + }} } if (jjte000 instanceof RuntimeException) { - {if (true) throw (RuntimeException)jjte000;} + {if (true) { + throw (RuntimeException)jjte000; + }} } - {if (true) throw (Error)jjte000;} + {if (true) { + throw (Error)jjte000; + }} } finally { if (jjtc000) { jjtree.closeNodeScope(jjtn000, true); @@ -59,8 +65,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini ASTFunDecl jjtn000 = new ASTFunDecl(JJTFUNDECL); boolean jjtc000 = true; jjtree.openNodeScope(jjtn000); - jjtreeOpenNodeScope(jjtn000);String s; - Token t; + jjtreeOpenNodeScope(jjtn000);Token t; try { t = jj_consume_token(9); jjtn000.setPosition(t.beginLine, t.beginColumn); @@ -102,12 +107,18 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jjtree.popNode(); } if (jjte000 instanceof ParseException) { - {if (true) throw (ParseException)jjte000;} + {if (true) { + throw (ParseException)jjte000; + }} } if (jjte000 instanceof RuntimeException) { - {if (true) throw (RuntimeException)jjte000;} + {if (true) { + throw (RuntimeException)jjte000; + }} } - {if (true) throw (Error)jjte000;} + {if (true) { + throw (Error)jjte000; + }} } finally { if (jjtc000) { jjtree.closeNodeScope(jjtn000, true); @@ -171,12 +182,18 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jjtree.popNode(); } if (jjte000 instanceof ParseException) { - {if (true) throw (ParseException)jjte000;} + {if (true) { + throw (ParseException)jjte000; + }} } if (jjte000 instanceof RuntimeException) { - {if (true) throw (RuntimeException)jjte000;} + {if (true) { + throw (RuntimeException)jjte000; + }} } - {if (true) throw (Error)jjte000;} + {if (true) { + throw (Error)jjte000; + }} } finally { if (jjtc000) { jjtree.closeNodeScope(jjtn000, true); @@ -220,12 +237,18 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jjtree.popNode(); } if (jjte000 instanceof ParseException) { - {if (true) throw (ParseException)jjte000;} + {if (true) { + throw (ParseException)jjte000; + }} } if (jjte000 instanceof RuntimeException) { - {if (true) throw (RuntimeException)jjte000;} + {if (true) { + throw (RuntimeException)jjte000; + }} } - {if (true) throw (Error)jjte000;} + {if (true) { + throw (Error)jjte000; + }} } finally { if (jjtc000) { jjtree.closeNodeScope(jjtn000, true); @@ -271,12 +294,18 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jjtree.popNode(); } if (jjte000 instanceof ParseException) { - {if (true) throw (ParseException)jjte000;} + {if (true) { + throw (ParseException)jjte000; + }} } if (jjte000 instanceof RuntimeException) { - {if (true) throw (RuntimeException)jjte000;} + {if (true) { + throw (RuntimeException)jjte000; + }} } - {if (true) throw (Error)jjte000;} + {if (true) { + throw (Error)jjte000; + }} } finally { if (jjtc000) { jjtree.closeNodeScope(jjtn000, true); @@ -330,7 +359,9 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jjtree.closeNodeScope(jjtn000, true); jjtc000 = false; jjtreeCloseNodeScope(jjtn000); - {if (true) return t;} + {if (true) { + return t; + }} } catch (Throwable jjte000) { if (jjtc000) { jjtree.clearNodeScope(jjtn000); @@ -339,12 +370,18 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jjtree.popNode(); } if (jjte000 instanceof ParseException) { - {if (true) throw (ParseException)jjte000;} + {if (true) { + throw (ParseException)jjte000; + }} } if (jjte000 instanceof RuntimeException) { - {if (true) throw (RuntimeException)jjte000;} + {if (true) { + throw (RuntimeException)jjte000; + }} } - {if (true) throw (Error)jjte000;} + {if (true) { + throw (Error)jjte000; + }} } finally { if (jjtc000) { jjtree.closeNodeScope(jjtn000, true); @@ -387,12 +424,18 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jjtree.popNode(); } if (jjte000 instanceof ParseException) { - {if (true) throw (ParseException)jjte000;} + {if (true) { + throw (ParseException)jjte000; + }} } if (jjte000 instanceof RuntimeException) { - {if (true) throw (RuntimeException)jjte000;} + {if (true) { + throw (RuntimeException)jjte000; + }} } - {if (true) throw (Error)jjte000;} + {if (true) { + throw (Error)jjte000; + }} } finally { if (jjtc000) { jjtree.closeNodeScope(jjtn000, true); @@ -436,12 +479,18 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jjtree.popNode(); } if (jjte000 instanceof ParseException) { - {if (true) throw (ParseException)jjte000;} + {if (true) { + throw (ParseException)jjte000; + }} } if (jjte000 instanceof RuntimeException) { - {if (true) throw (RuntimeException)jjte000;} + {if (true) { + throw (RuntimeException)jjte000; + }} } - {if (true) throw (Error)jjte000;} + {if (true) { + throw (Error)jjte000; + }} } finally { if (jjtc000) { jjtree.closeNodeScope(jjtn000, true); @@ -483,8 +532,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini ASTInteger jjtn000 = new ASTInteger(JJTINTEGER); boolean jjtc000 = true; jjtree.openNodeScope(jjtn000); - jjtreeOpenNodeScope(jjtn000);int num; - Token t; + jjtreeOpenNodeScope(jjtn000);Token t; try { t = jj_consume_token(INTEGER); jjtree.closeNodeScope(jjtn000, true); @@ -492,7 +540,9 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jjtreeCloseNodeScope(jjtn000); jjtn000.setValue(Integer.parseInt(t.image)); jjtn000.setPosition(t.beginLine, t.beginColumn); - {if (true) return t;} + {if (true) { + return t; + }} } finally { if (jjtc000) { jjtree.closeNodeScope(jjtn000, true); @@ -507,8 +557,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini ASTIdent jjtn000 = new ASTIdent(JJTIDENT); boolean jjtc000 = true; jjtree.openNodeScope(jjtn000); - jjtreeOpenNodeScope(jjtn000);String name; - Token t; + jjtreeOpenNodeScope(jjtn000);Token t; try { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case TRUE: @@ -536,7 +585,9 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jjtreeCloseNodeScope(jjtn000); jjtn000.setName(t.image); jjtn000.setPosition(t.beginLine, t.beginColumn); - {if (true) return t;} + {if (true) { + return t; + }} } finally { if (jjtc000) { jjtree.closeNodeScope(jjtn000, true); @@ -563,7 +614,9 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jj_consume_token(-1); throw new ParseException(); } - {if (true) return t.kind;} + {if (true) { + return t.kind; + }} throw new Error("Missing return statement in function"); } @@ -587,7 +640,9 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jj_consume_token(-1); throw new ParseException(); } - {if (true) return t.kind;} + {if (true) { + return t.kind; + }} throw new Error("Missing return statement in function"); } @@ -617,7 +672,9 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jj_consume_token(-1); throw new ParseException(); } - {if (true) return t.kind;} + {if (true) { + return t.kind; + }} throw new Error("Missing return statement in function"); } @@ -635,7 +692,9 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jj_consume_token(-1); throw new ParseException(); } - {if (true) return t.kind;} + {if (true) { + return t.kind; + }} throw new Error("Missing return statement in function"); } @@ -647,20 +706,32 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini } static final private boolean jj_3R_8() { - if (jj_scan_token(FALSE)) return true; - if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_scan_token(FALSE)) { + return true; + } + if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } return false; } static final private boolean jj_3R_11() { - if (jj_scan_token(IDENT)) return true; - if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_scan_token(IDENT)) { + return true; + } + if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } return false; } static final private boolean jj_3R_7() { - if (jj_scan_token(TRUE)) return true; - if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_scan_token(TRUE)) { + return true; + } + if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } return false; } @@ -675,38 +746,70 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jj_scanpos = xsp; if (jj_3R_10()) { jj_scanpos = xsp; - if (jj_3R_11()) return true; - if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; - } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; - } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; - } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; - } else if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_3R_11()) { + return true; + } + if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } + } else if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } return false; } static final private boolean jj_3_1() { - if (jj_3R_5()) return true; - if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_3R_5()) { + return true; + } + if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } return false; } static final private boolean jj_3R_5() { - if (jj_3R_6()) return true; - if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; - if (jj_scan_token(LPAREN)) return true; - if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_3R_6()) { + return true; + } + if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } + if (jj_scan_token(LPAREN)) { + return true; + } + if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } return false; } static final private boolean jj_3R_10() { - if (jj_scan_token(WRITE)) return true; - if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_scan_token(WRITE)) { + return true; + } + if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } return false; } static final private boolean jj_3R_9() { - if (jj_scan_token(READ)) return true; - if (jj_la == 0 && jj_scanpos == jj_lastpos) return false; + if (jj_scan_token(READ)) { + return true; + } + if (jj_la == 0 && jj_scanpos == jj_lastpos) { + return false; + } return false; } @@ -740,8 +843,12 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 17; i++) jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + for (int i = 0; i < 17; i++) { + jj_la1[i] = -1; + } + for (int i = 0; i < jj_2_rtns.length; i++) { + jj_2_rtns[i] = new JJCalls(); + } } static public void ReInit(java.io.InputStream stream) { @@ -751,8 +858,12 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 17; i++) jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + for (int i = 0; i < 17; i++) { + jj_la1[i] = -1; + } + for (int i = 0; i < jj_2_rtns.length; i++) { + jj_2_rtns[i] = new JJCalls(); + } } public MiniParser(java.io.Reader stream) { @@ -768,8 +879,12 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 17; i++) jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + for (int i = 0; i < 17; i++) { + jj_la1[i] = -1; + } + for (int i = 0; i < jj_2_rtns.length; i++) { + jj_2_rtns[i] = new JJCalls(); + } } static public void ReInit(java.io.Reader stream) { @@ -779,8 +894,12 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 17; i++) jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + for (int i = 0; i < 17; i++) { + jj_la1[i] = -1; + } + for (int i = 0; i < jj_2_rtns.length; i++) { + jj_2_rtns[i] = new JJCalls(); + } } public MiniParser(MiniParserTokenManager tm) { @@ -795,8 +914,12 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini token = new Token(); jj_ntk = -1; jj_gen = 0; - for (int i = 0; i < 17; i++) jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + for (int i = 0; i < 17; i++) { + jj_la1[i] = -1; + } + for (int i = 0; i < jj_2_rtns.length; i++) { + jj_2_rtns[i] = new JJCalls(); + } } public void ReInit(MiniParserTokenManager tm) { @@ -805,14 +928,21 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jj_ntk = -1; jjtree.reset(); jj_gen = 0; - for (int i = 0; i < 17; i++) jj_la1[i] = -1; - for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); + for (int i = 0; i < 17; i++) { + jj_la1[i] = -1; + } + for (int i = 0; i < jj_2_rtns.length; i++) { + jj_2_rtns[i] = new JJCalls(); + } } static final private Token jj_consume_token(int kind) throws ParseException { Token oldToken; - if ((oldToken = token).next != null) token = token.next; - else token = token.next = token_source.getNextToken(); + if ((oldToken = token).next != null) { + token = token.next; + } else { + token = token.next = token_source.getNextToken(); + } jj_ntk = -1; if (token.kind == kind) { jj_gen++; @@ -821,7 +951,9 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini for (int i = 0; i < jj_2_rtns.length; i++) { JJCalls c = jj_2_rtns[i]; while (c != null) { - if (c.gen < jj_gen) c.first = null; + if (c.gen < jj_gen) { + c.first = null; + } c = c.next; } } @@ -847,14 +979,19 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini if (jj_rescan) { int i = 0; Token tok = token; while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; } - if (tok != null) jj_add_error_token(kind, i); + if (tok != null) { + jj_add_error_token(kind, i); + } } return (jj_scanpos.kind != kind); } static final public Token getNextToken() { - if (token.next != null) token = token.next; - else token = token.next = token_source.getNextToken(); + if (token.next != null) { + token = token.next; + } else { + token = token.next = token_source.getNextToken(); + } jj_ntk = -1; jj_gen++; return token; @@ -863,17 +1000,21 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini static final public Token getToken(int index) { Token t = lookingAhead ? jj_scanpos : token; for (int i = 0; i < index; i++) { - if (t.next != null) t = t.next; - else t = t.next = token_source.getNextToken(); + if (t.next != null) { + t = t.next; + } else { + t = t.next = token_source.getNextToken(); + } } return t; } static final private int jj_ntk() { - if ((jj_nt=token.next) == null) - return (jj_ntk = (token.next=token_source.getNextToken()).kind); - else - return (jj_ntk = jj_nt.kind); + if ((jj_nt=token.next) == null) { + return (jj_ntk = (token.next=token_source.getNextToken()).kind); + } else { + return (jj_ntk = jj_nt.kind); + } } static private java.util.Vector jj_expentries = new java.util.Vector(); @@ -883,7 +1024,9 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini static private int jj_endpos; static private void jj_add_error_token(int kind, int pos) { - if (pos >= 100) return; + if (pos >= 100) { + return; + } if (pos == jj_endpos + 1) { jj_lasttokens[jj_endpos++] = kind; } else if (jj_endpos != 0) { @@ -902,11 +1045,17 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini break; } } - if (exists) break; + if (exists) { + break; + } } } - if (!exists) jj_expentries.addElement(jj_expentry); - if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind; + if (!exists) { + jj_expentries.addElement(jj_expentry); + } + if (pos != 0) { + jj_lasttokens[(jj_endpos = pos) - 1] = kind; + } } } diff --git a/examples/Mini/MiniParserTokenManager.java b/examples/Mini/MiniParserTokenManager.java index 731aeb66..b1a8c114 100644 --- a/examples/Mini/MiniParserTokenManager.java +++ b/examples/Mini/MiniParserTokenManager.java @@ -39,16 +39,16 @@ static private final void jjCheckNAddStates(int start) } static private final int jjMoveNfa_1(int startState, int curPos) { - int[] nextStates; int startsAt = 0; jjnewStateCnt = 3; int i = 1; jjstateSet[0] = startState; - int j, kind = 0x7fffffff; + int kind = 0x7fffffff; for (;;) { - if (++jjround == 0x7fffffff) - ReInitRounds(); + if (++jjround == 0x7fffffff) { + ReInitRounds(); + } if (curChar < 64) { long l = 1L << curChar; @@ -59,19 +59,23 @@ static private final int jjMoveNfa_1(int startState, int curPos) case 0: if ((0x2400L & l) != 0L) { - if (kind > 7) + if (kind > 7) { kind = 7; + } } - if (curChar == 13) - jjstateSet[jjnewStateCnt++] = 1; + if (curChar == 13) { + jjstateSet[jjnewStateCnt++] = 1; + } break; case 1: - if (curChar == 10 && kind > 7) - kind = 7; + if (curChar == 10 && kind > 7) { + kind = 7; + } break; case 2: - if (curChar == 13) - jjstateSet[jjnewStateCnt++] = 1; + if (curChar == 13) { + jjstateSet[jjnewStateCnt++] = 1; + } break; default : break; } @@ -79,7 +83,6 @@ static private final int jjMoveNfa_1(int startState, int curPos) } else if (curChar < 128) { - long l = 1L << (curChar & 077); do { switch(jjstateSet[--i]) @@ -90,8 +93,6 @@ static private final int jjMoveNfa_1(int startState, int curPos) } else { - int i2 = (curChar & 0xff) >> 6; - long l2 = 1L << (curChar & 077); do { switch(jjstateSet[--i]) @@ -107,8 +108,9 @@ static private final int jjMoveNfa_1(int startState, int curPos) kind = 0x7fffffff; } ++curPos; - if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt))) - return curPos; + if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt))) { + return curPos; + } try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { return curPos; } } @@ -125,8 +127,9 @@ private static final int jjStopStringLiteralDfa_0(int pos, long active0) } return -1; case 1: - if ((active0 & 0x400a400L) != 0L) + if ((active0 & 0x400a400L) != 0L) { return 1; + } if ((active0 & 0x3003805a00L) != 0L) { jjmatchedKind = 40; @@ -135,8 +138,9 @@ private static final int jjStopStringLiteralDfa_0(int pos, long active0) } return -1; case 2: - if ((active0 & 0x2004200L) != 0L) + if ((active0 & 0x2004200L) != 0L) { return 1; + } if ((active0 & 0x3001801800L) != 0L) { jjmatchedKind = 40; @@ -151,8 +155,9 @@ private static final int jjStopStringLiteralDfa_0(int pos, long active0) jjmatchedPos = 3; return 1; } - if ((active0 & 0x1001001800L) != 0L) + if ((active0 & 0x1001001800L) != 0L) { return 1; + } return -1; default : return -1; @@ -241,42 +246,48 @@ static private final int jjMoveStringLiteralDfa1_0(long active0) switch(curChar) { case 45: - if ((active0 & 0x40L) != 0L) + if ((active0 & 0x40L) != 0L) { return jjStopAtPos(1, 6); + } break; case 61: - if ((active0 & 0x40000L) != 0L) + if ((active0 & 0x40000L) != 0L) { return jjStopAtPos(1, 18); - else if ((active0 & 0x80000L) != 0L) + } else if ((active0 & 0x80000L) != 0L) { return jjStopAtPos(1, 19); - else if ((active0 & 0x100000L) != 0L) + } else if ((active0 & 0x100000L) != 0L) { return jjStopAtPos(1, 20); - else if ((active0 & 0x200000L) != 0L) + } else if ((active0 & 0x200000L) != 0L) { return jjStopAtPos(1, 21); + } break; case 65: return jjMoveStringLiteralDfa2_0(active0, 0x800000L); case 69: return jjMoveStringLiteralDfa2_0(active0, 0x1000004000L); case 70: - if ((active0 & 0x400L) != 0L) + if ((active0 & 0x400L) != 0L) { return jjStartNfaWithStates_0(1, 10, 1); + } break; case 72: return jjMoveStringLiteralDfa2_0(active0, 0x800L); case 73: - if ((active0 & 0x2000L) != 0L) + if ((active0 & 0x2000L) != 0L) { return jjStartNfaWithStates_0(1, 13, 1); + } break; case 76: return jjMoveStringLiteralDfa2_0(active0, 0x1000L); case 78: - if ((active0 & 0x8000L) != 0L) + if ((active0 & 0x8000L) != 0L) { return jjStartNfaWithStates_0(1, 15, 1); + } return jjMoveStringLiteralDfa2_0(active0, 0x2000000L); case 82: - if ((active0 & 0x4000000L) != 0L) + if ((active0 & 0x4000000L) != 0L) { return jjStartNfaWithStates_0(1, 26, 1); + } return jjMoveStringLiteralDfa2_0(active0, 0x2001000000L); case 85: return jjMoveStringLiteralDfa2_0(active0, 0x200L); @@ -287,8 +298,9 @@ static private final int jjMoveStringLiteralDfa1_0(long active0) } static private final int jjMoveStringLiteralDfa2_0(long old0, long active0) { - if (((active0 &= old0)) == 0L) - return jjStartNfa_0(0, old0); + if (((active0 &= old0)) == 0L) { + return jjStartNfa_0(0, old0); +} try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { jjStopStringLiteralDfa_0(1, active0); @@ -299,8 +311,9 @@ static private final int jjMoveStringLiteralDfa2_0(long old0, long active0) case 65: return jjMoveStringLiteralDfa3_0(active0, 0x1000000000L); case 68: - if ((active0 & 0x2000000L) != 0L) + if ((active0 & 0x2000000L) != 0L) { return jjStartNfaWithStates_0(2, 25, 1); + } break; case 69: return jjMoveStringLiteralDfa3_0(active0, 0x800L); @@ -309,14 +322,16 @@ static private final int jjMoveStringLiteralDfa2_0(long old0, long active0) case 76: return jjMoveStringLiteralDfa3_0(active0, 0x800000L); case 78: - if ((active0 & 0x200L) != 0L) + if ((active0 & 0x200L) != 0L) { return jjStartNfaWithStates_0(2, 9, 1); + } break; case 83: return jjMoveStringLiteralDfa3_0(active0, 0x1000L); case 84: - if ((active0 & 0x4000L) != 0L) + if ((active0 & 0x4000L) != 0L) { return jjStartNfaWithStates_0(2, 14, 1); + } break; case 85: return jjMoveStringLiteralDfa3_0(active0, 0x1000000L); @@ -327,8 +342,9 @@ static private final int jjMoveStringLiteralDfa2_0(long old0, long active0) } static private final int jjMoveStringLiteralDfa3_0(long old0, long active0) { - if (((active0 &= old0)) == 0L) - return jjStartNfa_0(1, old0); + if (((active0 &= old0)) == 0L) { + return jjStartNfa_0(1, old0); +} try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { jjStopStringLiteralDfa_0(2, active0); @@ -337,18 +353,21 @@ static private final int jjMoveStringLiteralDfa3_0(long old0, long active0) switch(curChar) { case 68: - if ((active0 & 0x1000000000L) != 0L) + if ((active0 & 0x1000000000L) != 0L) { return jjStartNfaWithStates_0(3, 36, 1); + } break; case 69: - if ((active0 & 0x1000L) != 0L) + if ((active0 & 0x1000L) != 0L) { return jjStartNfaWithStates_0(3, 12, 1); - else if ((active0 & 0x1000000L) != 0L) + } else if ((active0 & 0x1000000L) != 0L) { return jjStartNfaWithStates_0(3, 24, 1); + } break; case 78: - if ((active0 & 0x800L) != 0L) + if ((active0 & 0x800L) != 0L) { return jjStartNfaWithStates_0(3, 11, 1); + } break; case 83: return jjMoveStringLiteralDfa4_0(active0, 0x800000L); @@ -361,8 +380,9 @@ static private final int jjMoveStringLiteralDfa3_0(long old0, long active0) } static private final int jjMoveStringLiteralDfa4_0(long old0, long active0) { - if (((active0 &= old0)) == 0L) - return jjStartNfa_0(2, old0); + if (((active0 &= old0)) == 0L) { + return jjStartNfa_0(2, old0); +} try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { jjStopStringLiteralDfa_0(3, active0); @@ -371,10 +391,11 @@ static private final int jjMoveStringLiteralDfa4_0(long old0, long active0) switch(curChar) { case 69: - if ((active0 & 0x800000L) != 0L) + if ((active0 & 0x800000L) != 0L) { return jjStartNfaWithStates_0(4, 23, 1); - else if ((active0 & 0x2000000000L) != 0L) + } else if ((active0 & 0x2000000000L) != 0L) { return jjStartNfaWithStates_0(4, 37, 1); + } break; default : break; @@ -386,16 +407,16 @@ static final long[] jjbitVec0 = { }; static private final int jjMoveNfa_0(int startState, int curPos) { - int[] nextStates; int startsAt = 0; jjnewStateCnt = 6; int i = 1; jjstateSet[0] = startState; - int j, kind = 0x7fffffff; + int kind = 0x7fffffff; for (;;) { - if (++jjround == 0x7fffffff) - ReInitRounds(); + if (++jjround == 0x7fffffff) { + ReInitRounds(); + } if (curChar < 64) { long l = 1L << curChar; @@ -406,38 +427,47 @@ static private final int jjMoveNfa_0(int startState, int curPos) case 0: if ((0x3ff000000000000L & l) != 0L) { - if (kind > 41) + if (kind > 41) { kind = 41; + } jjCheckNAdd(2); } - else if (curChar == 34) - jjCheckNAddTwoStates(4, 5); + else if (curChar == 34) { + jjCheckNAddTwoStates(4, 5); + } break; case 1: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 40) - kind = 40; + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 40) { + kind = 40; + } jjstateSet[jjnewStateCnt++] = 1; break; case 2: - if ((0x3ff000000000000L & l) == 0L) - break; - if (kind > 41) - kind = 41; + if ((0x3ff000000000000L & l) == 0L) { + break; + } + if (kind > 41) { + kind = 41; + } jjCheckNAdd(2); break; case 3: - if (curChar == 34) - jjCheckNAddTwoStates(4, 5); + if (curChar == 34) { + jjCheckNAddTwoStates(4, 5); + } break; case 4: - if ((0xfffffffbffffdbffL & l) != 0L) - jjCheckNAddTwoStates(4, 5); + if ((0xfffffffbffffdbffL & l) != 0L) { + jjCheckNAddTwoStates(4, 5); + } break; case 5: - if (curChar == 34 && kind > 42) - kind = 42; + if (curChar == 34 && kind > 42) { + kind = 42; + } break; default : break; } @@ -451,17 +481,21 @@ static private final int jjMoveNfa_0(int startState, int curPos) switch(jjstateSet[--i]) { case 0: - if ((0x7fffffe07fffffeL & l) == 0L) - break; - if (kind > 40) - kind = 40; + if ((0x7fffffe07fffffeL & l) == 0L) { + break; + } + if (kind > 40) { + kind = 40; + } jjCheckNAdd(1); break; case 1: - if ((0x7fffffe87fffffeL & l) == 0L) - break; - if (kind > 40) - kind = 40; + if ((0x7fffffe87fffffeL & l) == 0L) { + break; + } + if (kind > 40) { + kind = 40; + } jjCheckNAdd(1); break; case 4: @@ -480,8 +514,9 @@ static private final int jjMoveNfa_0(int startState, int curPos) switch(jjstateSet[--i]) { case 4: - if ((jjbitVec0[i2] & l2) != 0L) - jjAddStates(0, 1); + if ((jjbitVec0[i2] & l2) != 0L) { + jjAddStates(0, 1); + } break; default : break; } @@ -494,8 +529,9 @@ static private final int jjMoveNfa_0(int startState, int curPos) kind = 0x7fffffff; } ++curPos; - if ((i = jjnewStateCnt) == (startsAt = 6 - (jjnewStateCnt = startsAt))) - return curPos; + if ((i = jjnewStateCnt) == (startsAt = 6 - (jjnewStateCnt = startsAt))) { + return curPos; + } try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { return curPos; } } @@ -539,8 +575,9 @@ static int lengthOfMatch; static protected char curChar; public MiniParserTokenManager(ASCII_CharStream stream) { - if (input_stream != null) - throw new TokenMgrError("ERROR: Second call to constructor of static lexer. You must use ReInit() to initialize the static variables.", TokenMgrError.STATIC_LEXER_ERROR); + if (input_stream != null) { + throw new TokenMgrError("ERROR: Second call to constructor of static lexer. You must use ReInit() to initialize the static variables.", TokenMgrError.STATIC_LEXER_ERROR); +} input_stream = stream; } public MiniParserTokenManager(ASCII_CharStream stream, int lexState) @@ -559,8 +596,9 @@ static private final void ReInitRounds() { int i; jjround = 0x80000001; - for (i = 6; i-- > 0;) - jjrounds[i] = 0x80000000; + for (i = 6; i-- > 0;) { + jjrounds[i] = 0x80000000; +} } static public void ReInit(ASCII_CharStream stream, int lexState) { @@ -569,10 +607,11 @@ static public void ReInit(ASCII_CharStream stream, int lexState) } static public void SwitchTo(int lexState) { - if (lexState >= 2 || lexState < 0) - throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE); - else - curLexState = lexState; + if (lexState >= 2 || lexState < 0) { + throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE); +} else { + curLexState = lexState; +} } static private final Token jjFillToken() @@ -597,7 +636,6 @@ static int jjmatchedKind; public static final Token getNextToken() { - int kind; Token specialToken = null; Token matchedToken; int curPos = 0; @@ -625,8 +663,9 @@ public static final Token getNextToken() { case 0: try { input_stream.backup(0); - while (curChar <= 32 && (0x100003600L & (1L << curChar)) != 0L) - curChar = input_stream.BeginToken(); + while (curChar <= 32 && (0x100003600L & (1L << curChar)) != 0L) { + curChar = input_stream.BeginToken(); + } } catch (java.io.IOException e1) { continue EOFLoop; } jjmatchedKind = 0x7fffffff; @@ -645,14 +684,16 @@ public static final Token getNextToken() } if (jjmatchedKind != 0x7fffffff) { - if (jjmatchedPos + 1 < curPos) - input_stream.backup(curPos - jjmatchedPos - 1); + if (jjmatchedPos + 1 < curPos) { + input_stream.backup(curPos - jjmatchedPos - 1); + } if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) { matchedToken = jjFillToken(); matchedToken.specialToken = specialToken; - if (jjnewLexState[jjmatchedKind] != -1) - curLexState = jjnewLexState[jjmatchedKind]; + if (jjnewLexState[jjmatchedKind] != -1) { + curLexState = jjnewLexState[jjmatchedKind]; + } return matchedToken; } else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) @@ -660,24 +701,26 @@ public static final Token getNextToken() if ((jjtoSpecial[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) { matchedToken = jjFillToken(); - if (specialToken == null) - specialToken = matchedToken; - else + if (specialToken == null) { + specialToken = matchedToken; + } else { matchedToken.specialToken = specialToken; specialToken = (specialToken.next = matchedToken); } SkipLexicalActions(matchedToken); - } - else - SkipLexicalActions(null); - if (jjnewLexState[jjmatchedKind] != -1) - curLexState = jjnewLexState[jjmatchedKind]; + } else { + SkipLexicalActions(null); + } + if (jjnewLexState[jjmatchedKind] != -1) { + curLexState = jjnewLexState[jjmatchedKind]; + } continue EOFLoop; } jjimageLen += jjmatchedPos + 1; - if (jjnewLexState[jjmatchedKind] != -1) + if (jjnewLexState[jjmatchedKind] != -1) { curLexState = jjnewLexState[jjmatchedKind]; + } curPos = 0; jjmatchedKind = 0x7fffffff; try { @@ -697,9 +740,9 @@ public static final Token getNextToken() if (curChar == '\n' || curChar == '\r') { error_line++; error_column = 0; + } else { + error_column++; } - else - error_column++; } if (!EOFSeen) { input_stream.backup(1); diff --git a/examples/Mini/ParseException.java b/examples/Mini/ParseException.java index 8f5b4f55..b23a3ea3 100644 --- a/examples/Mini/ParseException.java +++ b/examples/Mini/ParseException.java @@ -115,7 +115,9 @@ public class ParseException extends Exception { String retval = "Encountered \""; Token tok = currentToken.next; for (int i = 0; i < maxSize; i++) { - if (i != 0) retval += " "; + if (i != 0) { + retval += " "; + } if (tok.kind == 0) { retval += tokenImage[0]; break; diff --git a/examples/Mini/Variable.java b/examples/Mini/Variable.java index df103b74..6f8215eb 100644 --- a/examples/Mini/Variable.java +++ b/examples/Mini/Variable.java @@ -29,10 +29,11 @@ public class Variable implements EnvEntry { } public String toString() { - if(!reserved) - return var_name + " declared at line " + line + ", column " + column; - else - return var_name + " "; + if(!reserved) { + return var_name + " declared at line " + line + ", column " + column; + } else { + return var_name + " "; + } } public ASTIdent getName() { return name; } diff --git a/examples/Peephole.java b/examples/Peephole.java index 2bb6dd25..2a644451 100644 --- a/examples/Peephole.java +++ b/examples/Peephole.java @@ -31,8 +31,9 @@ public class Peephole { clazz.getClassName(), cp); Method stripped = removeNOPs(mg); - if(stripped != null) // Any NOPs stripped? - methods[i] = stripped; // Overwrite with stripped method + if(stripped != null) { + methods[i] = stripped; // Overwrite with stripped method + } } } @@ -57,8 +58,9 @@ public class Peephole { /* Some nasty Java compilers may add NOP at end of method. */ - if((next = last.getNext()) == null) - break; + if((next = last.getNext()) == null) { + break; + } count += match.length; @@ -72,8 +74,9 @@ public class Peephole { for(int i=0; i < targets.length; i++) { InstructionTargeter[] targeters = targets[i].getTargeters(); - for(int j=0; j < targeters.length; j++) - targeters[j].updateTarget(targets[i], next); + for(int j=0; j < targeters.length; j++) { + targeters[j].updateTarget(targets[i], next); + } } } } diff --git a/examples/ProxyCreator.java b/examples/ProxyCreator.java index 3a8a5b96..a226f053 100644 --- a/examples/ProxyCreator.java +++ b/examples/ProxyCreator.java @@ -106,8 +106,9 @@ public class ProxyCreator { System.out.println("Done. Now calling actionPerformed()"); a.actionPerformed(new ActionEvent(a, ActionEvent.ACTION_PERFORMED, "hello")); - } else - System.err.println("Call me with java org.apache.bcel.util.JavaWrapper ProxyCreator"); + } else { + System.err.println("Call me with java org.apache.bcel.util.JavaWrapper ProxyCreator"); + } } } diff --git a/examples/helloify.java b/examples/helloify.java index 945641f3..df6a8304 100644 --- a/examples/helloify.java +++ b/examples/helloify.java @@ -49,8 +49,9 @@ public final class helloify implements Constants { */ Method[] methods = java_class.getMethods(); - for(int j=0; j < methods.length; j++) // Directly use array - methods[j] = helloifyMethod(methods[j]); + for(int j=0; j < methods.length; j++) { + methods[j] = helloifyMethod(methods[j]); + } /* Finally dump it back to a file. */ @@ -82,8 +83,9 @@ public final class helloify implements Constants { String name = m.getName(); // Sanity check - if(m.isNative() || m.isAbstract() || (code == null)) - return m; + if(m.isNative() || m.isAbstract() || (code == null)) { + return m; + } /* Create instruction list to be inserted at method start. */ @@ -106,13 +108,15 @@ public final class helloify implements Constants { break; } } - } else - il.insert(ihs[0], patch); + } else { + il.insert(ihs[0], patch); + } /* Stack size must be at least 2, since the println method takes 2 argument. */ - if(code.getMaxStack() < 2) - mg.setMaxStack(2); + if(code.getMaxStack() < 2) { + mg.setMaxStack(2); + } m = mg.getMethod(); diff --git a/examples/id.java b/examples/id.java index 1d13208a..4b2828de 100644 --- a/examples/id.java +++ b/examples/id.java @@ -27,8 +27,9 @@ public class id { public static void main(String[] argv) throws Exception { JavaClass clazz = null; - if((clazz = Repository.lookupClass(argv[0])) == null) - clazz = new ClassParser(argv[0]).parse(); // May throw IOException + if((clazz = Repository.lookupClass(argv[0])) == null) { + clazz = new ClassParser(argv[0]).parse(); // May throw IOException + } ClassGen cg = new ClassGen(clazz); diff --git a/examples/listclass.java b/examples/listclass.java index 35d794c5..c56ef6a9 100644 --- a/examples/listclass.java +++ b/examples/listclass.java @@ -74,21 +74,21 @@ public class listclass { */ for(int i=0; i < argv.length; i++) { if(argv[i].charAt(0) == '-') { // command line switch - if(argv[i].equals("-constants")) - constants=true; - else if(argv[i].equals("-code")) - code=true; - else if(argv[i].equals("-brief")) - verbose=false; - else if(argv[i].equals("-dependencies")) - classdep=true; - else if(argv[i].equals("-nocontents")) - nocontents=true; - else if(argv[i].equals("-recurse")) - recurse=true; - else if(argv[i].equals("-exclude")) - exclude=true; - else if(argv[i].equals("-help")) { + if(argv[i].equals("-constants")) { + constants=true; + } else if(argv[i].equals("-code")) { + code=true; + } else if(argv[i].equals("-brief")) { + verbose=false; + } else if(argv[i].equals("-dependencies")) { + classdep=true; + } else if(argv[i].equals("-nocontents")) { + nocontents=true; + } else if(argv[i].equals("-recurse")) { + recurse=true; + } else if(argv[i].equals("-exclude")) { + exclude=true; + } else if(argv[i].equals("-help")) { System.out.println( "Usage: java listclass [-constants] [-code] [-brief] " + "[-dependencies] [-nocontents] [-recurse] class... " + "[-exclude ]\n" + @@ -101,19 +101,21 @@ public class listclass { "-exclude Do not list classes beginning with " + "strings in " ); System.exit( 0 ); - } else - System.err.println("Unknown switch " + argv[i] + " ignored."); + } else { + System.err.println("Unknown switch " + argv[i] + " ignored."); + } } else { // add file name to list - if(exclude) - exclude_name.addElement(argv[i]); - else - file_name.addElement(argv[i]); + if(exclude) { + exclude_name.addElement(argv[i]); + } else { + file_name.addElement(argv[i]); + } } } - if(file_name.size() == 0) - System.err.println("list: No input files specified"); - else { + if(file_name.size() == 0) { + System.err.println("list: No input files specified"); + } else { listclass listClass = new listclass(code, constants, verbose, classdep, nocontents, recurse, exclude_name); @@ -144,12 +146,15 @@ public class listclass { try { JavaClass java_class; - if((listedClasses.get(name) != null) || name.startsWith("[")) + if((listedClasses.get(name) != null) || name.startsWith("[")) { return; + } - for(int idx = 0; idx < exclude_name.size(); idx++) - if(name.startsWith((String) exclude_name.elementAt(idx))) - return; + for(int idx = 0; idx < exclude_name.size(); idx++) { + if(name.startsWith((String) exclude_name.elementAt(idx))) { + return; + } + } if(name.endsWith(".class")) { java_class = new ClassParser(name).parse(); // May throw IOException @@ -157,27 +162,32 @@ public class listclass { java_class = Repository.lookupClass(name); } - if(nocontents) + if(nocontents) { System.out.println(java_class.getClassName()); - else + } else { System.out.println(java_class); // Dump the contents + } - if(constants) // Dump the constant pool ? - System.out.println(java_class.getConstantPool()); + if(constants) { + System.out.println(java_class.getConstantPool()); + } - if(code) // Dump the method code ? + if(code) { printCode(java_class.getMethods(), verbose); + } - if(classdep) + if(classdep) { printClassDependencies(java_class.getConstantPool()); + } listedClasses.put(name, name); if(recurse) { String[] dependencies = getClassDependencies(java_class.getConstantPool()); - for(int idx = 0; idx < dependencies.length; idx++) - list(dependencies[idx]); + for(int idx = 0; idx < dependencies.length; idx++) { + list(dependencies[idx]); + } } } catch(IOException e) { System.out.println("Error loading class " + name + " (" + e.getMessage() + ")"); @@ -193,8 +203,9 @@ public class listclass { public static void printClassDependencies(ConstantPool pool) { String[] names = getClassDependencies(pool); System.out.println("Dependencies:"); - for(int idx = 0; idx < names.length; idx++) - System.out.println("\t" + names[idx]); + for(int idx = 0; idx < names.length; idx++) { + System.out.println("\t" + names[idx]); + } } public static String[] getClassDependencies(ConstantPool pool) { @@ -209,8 +220,9 @@ public class listclass { buf.setLength(0); buf.append(c1.getBytes()); for(int n = 0; n < buf.length(); n++) { - if(buf.charAt(n) == '/') + if(buf.charAt(n) == '/') { buf.setCharAt(n, '.'); + } } tempArray[size++] = buf.toString(); @@ -230,8 +242,9 @@ public class listclass { System.out.println(methods[i]); Code code = methods[i].getCode(); - if(code != null) - System.out.println(code.toString(verbose)); + if(code != null) { + System.out.println(code.toString(verbose)); + } } } } diff --git a/examples/maxstack.java b/examples/maxstack.java index 7ddede8d..589c2d0c 100644 --- a/examples/maxstack.java +++ b/examples/maxstack.java @@ -19,8 +19,9 @@ public final class maxstack { String class_name = argv[i]; JavaClass java_class = Repository.lookupClass(class_name); - if(java_class == null) // Look for .class file? - java_class = new ClassParser(class_name).parse(); + if(java_class == null) { + java_class = new ClassParser(class_name).parse(); + } ConstantPoolGen cp = new ConstantPoolGen(java_class.getConstantPool()); Method[] methods = java_class.getMethods(); @@ -42,17 +43,19 @@ public final class maxstack { System.out.println(m); - if(computed_stack == compiled_stack) - System.out.println("Stack ok(" + computed_stack + ")"); - else - System.out.println("\nCompiled stack size " + compiled_stack + - " computed size " + computed_stack); + if(computed_stack == compiled_stack) { + System.out.println("Stack ok(" + computed_stack + ")"); + } else { + System.out.println("\nCompiled stack size " + compiled_stack + + " computed size " + computed_stack); + } - if(computed_locals == compiled_locals) - System.out.println("Locals ok(" + computed_locals + ")"); - else - System.out.println("\nCompiled locals " + compiled_locals + - " computed size " + computed_locals); + if(computed_locals == compiled_locals) { + System.out.println("Locals ok(" + computed_locals + ")"); + } else { + System.out.println("\nCompiled locals " + compiled_locals + + " computed size " + computed_locals); + } } } } diff --git a/examples/patchclass.java b/examples/patchclass.java index 8c4bb9bf..e008d88b 100644 --- a/examples/patchclass.java +++ b/examples/patchclass.java @@ -25,8 +25,9 @@ public class patchclass { } try { - for(int i=2; i < argv.length; i++) - file_name[files++] = argv[i]; + for(int i=2; i < argv.length; i++) { + file_name[files++] = argv[i]; + } for(int i=0; i < files; i++) { parser = new ClassParser(file_name[i]); diff --git a/src/java/org/apache/bcel/ExceptionConstants.java b/src/java/org/apache/bcel/ExceptionConstants.java index 06b77fb9..4f59ead2 100644 --- a/src/java/org/apache/bcel/ExceptionConstants.java +++ b/src/java/org/apache/bcel/ExceptionConstants.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel; - /** * Exception constants. * @@ -24,63 +23,54 @@ package org.apache.bcel; * @author E. Haase */ public interface ExceptionConstants { - /** The mother of all exceptions - */ - public static final Class THROWABLE = Throwable.class; - - /** Super class of any run-time exception - */ - public static final Class RUNTIME_EXCEPTION = RuntimeException.class; - - /** Super class of any linking exception (aka Linkage Error) - */ - public static final Class LINKING_EXCEPTION = LinkageError.class; - - /** Linking Exceptions - */ - public static final Class CLASS_CIRCULARITY_ERROR = ClassCircularityError.class; - public static final Class CLASS_FORMAT_ERROR = ClassFormatError.class; - public static final Class EXCEPTION_IN_INITIALIZER_ERROR = ExceptionInInitializerError.class; - public static final Class INCOMPATIBLE_CLASS_CHANGE_ERROR = IncompatibleClassChangeError.class; - public static final Class ABSTRACT_METHOD_ERROR = AbstractMethodError.class; - public static final Class ILLEGAL_ACCESS_ERROR = IllegalAccessError.class; - public static final Class INSTANTIATION_ERROR = InstantiationError.class; - public static final Class NO_SUCH_FIELD_ERROR = NoSuchFieldError.class; - public static final Class NO_SUCH_METHOD_ERROR = NoSuchMethodError.class; - public static final Class NO_CLASS_DEF_FOUND_ERROR = NoClassDefFoundError.class; - public static final Class UNSATISFIED_LINK_ERROR = UnsatisfiedLinkError.class; - public static final Class VERIFY_ERROR = VerifyError.class; - - /* UnsupportedClassVersionError is new in JDK 1.2 */ - //public static final Class UnsupportedClassVersionError = UnsupportedClassVersionError.class; - - /** Run-Time Exceptions - */ - public static final Class NULL_POINTER_EXCEPTION = NullPointerException.class; - public static final Class ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION = ArrayIndexOutOfBoundsException.class; - public static final Class ARITHMETIC_EXCEPTION = ArithmeticException.class; - public static final Class NEGATIVE_ARRAY_SIZE_EXCEPTION = NegativeArraySizeException.class; - public static final Class CLASS_CAST_EXCEPTION = ClassCastException.class; - public static final Class ILLEGAL_MONITOR_STATE = IllegalMonitorStateException.class; - - /** Pre-defined exception arrays according to chapters 5.1-5.4 of the Java Virtual - * Machine Specification - */ - public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION = { - NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR, - EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR - }; // Chapter 5.1 - - public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION = { - NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR, NO_SUCH_METHOD_ERROR - }; // Chapter 5.2 - - public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION = new Class[0]; // Chapter 5.3 (as below) - public static final Class[] EXCS_STRING_RESOLUTION = new Class[0]; - // Chapter 5.4 (no errors but the ones that _always_ could happen! How stupid.) - - public static final Class[] EXCS_ARRAY_EXCEPTION = { - NULL_POINTER_EXCEPTION, ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION - }; + /** The mother of all exceptions + */ + public static final Class THROWABLE = Throwable.class; + /** Super class of any run-time exception + */ + public static final Class RUNTIME_EXCEPTION = RuntimeException.class; + /** Super class of any linking exception (aka Linkage Error) + */ + public static final Class LINKING_EXCEPTION = LinkageError.class; + /** Linking Exceptions + */ + public static final Class CLASS_CIRCULARITY_ERROR = ClassCircularityError.class; + public static final Class CLASS_FORMAT_ERROR = ClassFormatError.class; + public static final Class EXCEPTION_IN_INITIALIZER_ERROR = ExceptionInInitializerError.class; + public static final Class INCOMPATIBLE_CLASS_CHANGE_ERROR = IncompatibleClassChangeError.class; + public static final Class ABSTRACT_METHOD_ERROR = AbstractMethodError.class; + public static final Class ILLEGAL_ACCESS_ERROR = IllegalAccessError.class; + public static final Class INSTANTIATION_ERROR = InstantiationError.class; + public static final Class NO_SUCH_FIELD_ERROR = NoSuchFieldError.class; + public static final Class NO_SUCH_METHOD_ERROR = NoSuchMethodError.class; + public static final Class NO_CLASS_DEF_FOUND_ERROR = NoClassDefFoundError.class; + public static final Class UNSATISFIED_LINK_ERROR = UnsatisfiedLinkError.class; + public static final Class VERIFY_ERROR = VerifyError.class; + /* UnsupportedClassVersionError is new in JDK 1.2 */ + //public static final Class UnsupportedClassVersionError = UnsupportedClassVersionError.class; + /** Run-Time Exceptions + */ + public static final Class NULL_POINTER_EXCEPTION = NullPointerException.class; + public static final Class ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION = ArrayIndexOutOfBoundsException.class; + public static final Class ARITHMETIC_EXCEPTION = ArithmeticException.class; + public static final Class NEGATIVE_ARRAY_SIZE_EXCEPTION = NegativeArraySizeException.class; + public static final Class CLASS_CAST_EXCEPTION = ClassCastException.class; + public static final Class ILLEGAL_MONITOR_STATE = IllegalMonitorStateException.class; + /** Pre-defined exception arrays according to chapters 5.1-5.4 of the Java Virtual + * Machine Specification + */ + public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION = { + NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR, + EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR + }; // Chapter 5.1 + public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION = { + NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR, NO_SUCH_METHOD_ERROR + }; // Chapter 5.2 + public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION = new Class[0]; // Chapter 5.3 (as below) + public static final Class[] EXCS_STRING_RESOLUTION = new Class[0]; + // Chapter 5.4 (no errors but the ones that _always_ could happen! How stupid.) + public static final Class[] EXCS_ARRAY_EXCEPTION = { + NULL_POINTER_EXCEPTION, ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION + }; } diff --git a/src/java/org/apache/bcel/Repository.java b/src/java/org/apache/bcel/Repository.java index f5dffc8d..e3ae5ed9 100644 --- a/src/java/org/apache/bcel/Repository.java +++ b/src/java/org/apache/bcel/Repository.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel; - import java.io.IOException; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.util.ClassPath; @@ -34,215 +33,229 @@ import org.apache.bcel.util.SyntheticRepository; * @author M. Dahm */ public abstract class Repository { - private static org.apache.bcel.util.Repository _repository = - SyntheticRepository.getInstance(); - - /** @return currently used repository instance - */ - public static org.apache.bcel.util.Repository getRepository() { - return _repository; - } - - /** Set repository instance to be used for class loading - */ - public static void setRepository(org.apache.bcel.util.Repository rep) { - _repository = rep; - } - - /** Lookup class somewhere found on your CLASSPATH, or whereever the - * repository instance looks for it. - * - * @return class object for given fully qualified class name - * @throws ClassNotFoundException if the class could not be found or - * parsed correctly - */ - public static JavaClass lookupClass(String class_name) - throws ClassNotFoundException { - - return _repository.loadClass(class_name); - } - - /** - * Try to find class source using the internal repository instance. - * @see Class - * @return JavaClass object for given runtime class - * @throws ClassNotFoundException if the class could not be found or - * parsed correctly - */ - public static JavaClass lookupClass(Class clazz) - throws ClassNotFoundException { - return _repository.loadClass(clazz); - } - - /** - * @return class file object for given Java class by looking on the - * system class path; returns null if the class file can't be - * found - */ - public static ClassPath.ClassFile lookupClassFile(String class_name) { - try { - ClassPath path = _repository.getClassPath(); - - if(path == null) - return null; - return path.getClassFile(class_name); - - } catch(IOException e) { return null; } - } - - /** Clear the repository. - */ - public static void clearCache() { - _repository.clear(); - } - - /** - * Add clazz to repository if there isn't an equally named class already in there. - * - * @return old entry in repository - */ - public static JavaClass addClass(JavaClass clazz) { - JavaClass old = _repository.findClass(clazz.getClassName()); - _repository.storeClass(clazz); - return old; - } - - /** - * Remove class with given (fully qualified) name from repository. - */ - public static void removeClass(String clazz) { - _repository.removeClass(_repository.findClass(clazz)); - } - - /** - * Remove given class from repository. - */ - public static void removeClass(JavaClass clazz) { - _repository.removeClass(clazz); - } - - /** - * @return list of super classes of clazz in ascending order, i.e., - * Object is always the last element - * @throws ClassNotFoundException if any of the superclasses can't be found - */ - public static JavaClass[] getSuperClasses(JavaClass clazz) - throws ClassNotFoundException { - return clazz.getSuperClasses(); - } - - /** - * @return list of super classes of clazz in ascending order, i.e., - * Object is always the last element. - * @throws ClassNotFoundException if the named class or any of its - * superclasses can't be found - */ - public static JavaClass[] getSuperClasses(String class_name) - throws ClassNotFoundException { - JavaClass jc = lookupClass(class_name); - return getSuperClasses(jc); - } - - /** - * @return all interfaces implemented by class and its super - * classes and the interfaces that those interfaces extend, and so on. - * (Some people call this a transitive hull). - * @throws ClassNotFoundException if any of the class's - * superclasses or superinterfaces can't be found - */ - public static JavaClass[] getInterfaces(JavaClass clazz) - throws ClassNotFoundException { - return clazz.getAllInterfaces(); - } - - /** - * @return all interfaces implemented by class and its super - * classes and the interfaces that extend those interfaces, and so on - * @throws ClassNotFoundException if the named class can't be found, - * or if any of its superclasses or superinterfaces can't be found - */ - public static JavaClass[] getInterfaces(String class_name) - throws ClassNotFoundException { - return getInterfaces(lookupClass(class_name)); - } - - /** - * Equivalent to runtime "instanceof" operator. - * @return true, if clazz is an instance of super_class - * @throws ClassNotFoundException if any superclasses or superinterfaces - * of clazz can't be found - */ - public static boolean instanceOf(JavaClass clazz, JavaClass super_class) - throws ClassNotFoundException { - return clazz.instanceOf(super_class); - } - - /** - * @return true, if clazz is an instance of super_class - * @throws ClassNotFoundException if either clazz or super_class - * can't be found - */ - public static boolean instanceOf(String clazz, String super_class) - throws ClassNotFoundException { - return instanceOf(lookupClass(clazz), lookupClass(super_class)); - } - - /** - * @return true, if clazz is an instance of super_class - * @throws ClassNotFoundException if super_class can't be found - */ - public static boolean instanceOf(JavaClass clazz, String super_class) - throws ClassNotFoundException { - return instanceOf(clazz, lookupClass(super_class)); - } - - /** - * @return true, if clazz is an instance of super_class - * @throws ClassNotFoundException if clazz can't be found - */ - public static boolean instanceOf(String clazz, JavaClass super_class) - throws ClassNotFoundException { - return instanceOf(lookupClass(clazz), super_class); - } - - /** - * @return true, if clazz is an implementation of interface inter - * @throws ClassNotFoundException if any superclasses or superinterfaces - * of clazz can't be found - */ - public static boolean implementationOf(JavaClass clazz, JavaClass inter) - throws ClassNotFoundException { - return clazz.implementationOf(inter); - } - - /** - * @return true, if clazz is an implementation of interface inter - * @throws ClassNotFoundException if clazz, inter, or any superclasses - * or superinterfaces of clazz can't be found - */ - public static boolean implementationOf(String clazz, String inter) - throws ClassNotFoundException { - return implementationOf(lookupClass(clazz), lookupClass(inter)); - } - - /** - * @return true, if clazz is an implementation of interface inter - * @throws ClassNotFoundException if inter or any superclasses - * or superinterfaces of clazz can't be found - */ - public static boolean implementationOf(JavaClass clazz, String inter) - throws ClassNotFoundException { - return implementationOf(clazz, lookupClass(inter)); - } - - /** - * @return true, if clazz is an implementation of interface inter - * @throws ClassNotFoundException if clazz or any superclasses or - * superinterfaces of clazz can't be found - */ - public static boolean implementationOf(String clazz, JavaClass inter) - throws ClassNotFoundException { - return implementationOf(lookupClass(clazz), inter); - } -} + private static org.apache.bcel.util.Repository _repository = SyntheticRepository.getInstance(); + + + /** @return currently used repository instance + */ + public static org.apache.bcel.util.Repository getRepository() { + return _repository; + } + + + /** Set repository instance to be used for class loading + */ + public static void setRepository( org.apache.bcel.util.Repository rep ) { + _repository = rep; + } + + + /** Lookup class somewhere found on your CLASSPATH, or whereever the + * repository instance looks for it. + * + * @return class object for given fully qualified class name + * @throws ClassNotFoundException if the class could not be found or + * parsed correctly + */ + public static JavaClass lookupClass( String class_name ) throws ClassNotFoundException { + return _repository.loadClass(class_name); + } + + + /** + * Try to find class source using the internal repository instance. + * @see Class + * @return JavaClass object for given runtime class + * @throws ClassNotFoundException if the class could not be found or + * parsed correctly + */ + public static JavaClass lookupClass( Class clazz ) throws ClassNotFoundException { + return _repository.loadClass(clazz); + } + + + /** + * @return class file object for given Java class by looking on the + * system class path; returns null if the class file can't be + * found + */ + public static ClassPath.ClassFile lookupClassFile( String class_name ) { + try { + ClassPath path = _repository.getClassPath(); + if (path == null) { + return null; + } + return path.getClassFile(class_name); + } catch (IOException e) { + return null; + } + } + + + /** Clear the repository. + */ + public static void clearCache() { + _repository.clear(); + } + + + /** + * Add clazz to repository if there isn't an equally named class already in there. + * + * @return old entry in repository + */ + public static JavaClass addClass( JavaClass clazz ) { + JavaClass old = _repository.findClass(clazz.getClassName()); + _repository.storeClass(clazz); + return old; + } + + + /** + * Remove class with given (fully qualified) name from repository. + */ + public static void removeClass( String clazz ) { + _repository.removeClass(_repository.findClass(clazz)); + } + + + /** + * Remove given class from repository. + */ + public static void removeClass( JavaClass clazz ) { + _repository.removeClass(clazz); + } + + + /** + * @return list of super classes of clazz in ascending order, i.e., + * Object is always the last element + * @throws ClassNotFoundException if any of the superclasses can't be found + */ + public static JavaClass[] getSuperClasses( JavaClass clazz ) throws ClassNotFoundException { + return clazz.getSuperClasses(); + } + + + /** + * @return list of super classes of clazz in ascending order, i.e., + * Object is always the last element. + * @throws ClassNotFoundException if the named class or any of its + * superclasses can't be found + */ + public static JavaClass[] getSuperClasses( String class_name ) throws ClassNotFoundException { + JavaClass jc = lookupClass(class_name); + return getSuperClasses(jc); + } + + + /** + * @return all interfaces implemented by class and its super + * classes and the interfaces that those interfaces extend, and so on. + * (Some people call this a transitive hull). + * @throws ClassNotFoundException if any of the class's + * superclasses or superinterfaces can't be found + */ + public static JavaClass[] getInterfaces( JavaClass clazz ) throws ClassNotFoundException { + return clazz.getAllInterfaces(); + } + + + /** + * @return all interfaces implemented by class and its super + * classes and the interfaces that extend those interfaces, and so on + * @throws ClassNotFoundException if the named class can't be found, + * or if any of its superclasses or superinterfaces can't be found + */ + public static JavaClass[] getInterfaces( String class_name ) throws ClassNotFoundException { + return getInterfaces(lookupClass(class_name)); + } + + + /** + * Equivalent to runtime "instanceof" operator. + * @return true, if clazz is an instance of super_class + * @throws ClassNotFoundException if any superclasses or superinterfaces + * of clazz can't be found + */ + public static boolean instanceOf( JavaClass clazz, JavaClass super_class ) + throws ClassNotFoundException { + return clazz.instanceOf(super_class); + } + + + /** + * @return true, if clazz is an instance of super_class + * @throws ClassNotFoundException if either clazz or super_class + * can't be found + */ + public static boolean instanceOf( String clazz, String super_class ) + throws ClassNotFoundException { + return instanceOf(lookupClass(clazz), lookupClass(super_class)); + } + + + /** + * @return true, if clazz is an instance of super_class + * @throws ClassNotFoundException if super_class can't be found + */ + public static boolean instanceOf( JavaClass clazz, String super_class ) + throws ClassNotFoundException { + return instanceOf(clazz, lookupClass(super_class)); + } + + + /** + * @return true, if clazz is an instance of super_class + * @throws ClassNotFoundException if clazz can't be found + */ + public static boolean instanceOf( String clazz, JavaClass super_class ) + throws ClassNotFoundException { + return instanceOf(lookupClass(clazz), super_class); + } + + + /** + * @return true, if clazz is an implementation of interface inter + * @throws ClassNotFoundException if any superclasses or superinterfaces + * of clazz can't be found + */ + public static boolean implementationOf( JavaClass clazz, JavaClass inter ) + throws ClassNotFoundException { + return clazz.implementationOf(inter); + } + + + /** + * @return true, if clazz is an implementation of interface inter + * @throws ClassNotFoundException if clazz, inter, or any superclasses + * or superinterfaces of clazz can't be found + */ + public static boolean implementationOf( String clazz, String inter ) + throws ClassNotFoundException { + return implementationOf(lookupClass(clazz), lookupClass(inter)); + } + + + /** + * @return true, if clazz is an implementation of interface inter + * @throws ClassNotFoundException if inter or any superclasses + * or superinterfaces of clazz can't be found + */ + public static boolean implementationOf( JavaClass clazz, String inter ) + throws ClassNotFoundException { + return implementationOf(clazz, lookupClass(inter)); + } + + + /** + * @return true, if clazz is an implementation of interface inter + * @throws ClassNotFoundException if clazz or any superclasses or + * superinterfaces of clazz can't be found + */ + public static boolean implementationOf( String clazz, JavaClass inter ) + throws ClassNotFoundException { + return implementationOf(lookupClass(clazz), inter); + } +} diff --git a/src/java/org/apache/bcel/classfile/AccessFlags.java b/src/java/org/apache/bcel/classfile/AccessFlags.java index 564ee1fb..19402109 100644 --- a/src/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/java/org/apache/bcel/classfile/AccessFlags.java @@ -26,123 +26,213 @@ import org.apache.bcel.Constants; * @author M. Dahm */ public abstract class AccessFlags implements java.io.Serializable { - protected int access_flags; - - public AccessFlags() {} - - /** - * @param a inital access flags - */ - public AccessFlags(int a) { - access_flags = a; - } - - /** - * @return Access flags of the object aka. "modifiers". - */ - public final int getAccessFlags() { return access_flags; } - - /** - * @return Access flags of the object aka. "modifiers". - */ - public final int getModifiers() { return access_flags; } - - /** Set access flags aka "modifiers". - * @param access_flags Access flags of the object. - */ - public final void setAccessFlags(int access_flags) { - this.access_flags = access_flags; - } - - /** Set access flags aka "modifiers". - * @param access_flags Access flags of the object. - */ - public final void setModifiers(int access_flags) { - setAccessFlags(access_flags); - } - - private final void setFlag(int flag, boolean set) { - if((access_flags & flag) != 0) { // Flag is set already - if(!set) // Delete flag ? - access_flags ^= flag; - } else { // Flag not set - if(set) // Set flag ? - access_flags |= flag; - } - } - - public final void isPublic(boolean flag) { setFlag(Constants.ACC_PUBLIC, flag); } - public final boolean isPublic() { - return (access_flags & Constants.ACC_PUBLIC) != 0; - } - - public final void isPrivate(boolean flag) { setFlag(Constants.ACC_PRIVATE, flag); } - public final boolean isPrivate() { - return (access_flags & Constants.ACC_PRIVATE) != 0; - } - - public final void isProtected(boolean flag) { setFlag(Constants.ACC_PROTECTED, flag); } - public final boolean isProtected() { - return (access_flags & Constants.ACC_PROTECTED) != 0; - } - - public final void isStatic(boolean flag) { setFlag(Constants.ACC_STATIC, flag); } - public final boolean isStatic() { - return (access_flags & Constants.ACC_STATIC) != 0; - } - - public final void isFinal(boolean flag) { setFlag(Constants.ACC_FINAL, flag); } - public final boolean isFinal() { - return (access_flags & Constants.ACC_FINAL) != 0; - } - - public final void isSynchronized(boolean flag) { setFlag(Constants.ACC_SYNCHRONIZED, flag); } - public final boolean isSynchronized() { - return (access_flags & Constants.ACC_SYNCHRONIZED) != 0; - } - - public final void isVolatile(boolean flag) { setFlag(Constants.ACC_VOLATILE, flag); } - public final boolean isVolatile() { - return (access_flags & Constants.ACC_VOLATILE) != 0; - } - - public final void isTransient(boolean flag) { setFlag(Constants.ACC_TRANSIENT, flag); } - public final boolean isTransient() { - return (access_flags & Constants.ACC_TRANSIENT) != 0; - } - - public final void isNative(boolean flag) { setFlag(Constants.ACC_NATIVE, flag); } - public final boolean isNative() { - return (access_flags & Constants.ACC_NATIVE) != 0; - } - - public final void isInterface(boolean flag) { setFlag(Constants.ACC_INTERFACE, flag); } - public final boolean isInterface() { - return (access_flags & Constants.ACC_INTERFACE) != 0; - } - - public final void isAbstract(boolean flag) { setFlag(Constants.ACC_ABSTRACT, flag); } - public final boolean isAbstract() { - return (access_flags & Constants.ACC_ABSTRACT) != 0; - } - - public final void isStrictfp(boolean flag) { setFlag(Constants.ACC_STRICT, flag); } - public final boolean isStrictfp() { - return (access_flags & Constants.ACC_STRICT) != 0; - } - - public final void isSynthetic(boolean flag) { setFlag(Constants.ACC_SYNTHETIC, flag); } - public final boolean isSynthetic() { - return (access_flags & Constants.ACC_SYNTHETIC) != 0; - } - - public final void isAnnotation(boolean flag) { setFlag(Constants.ACC_ANNOTATION, flag); } - public final boolean isAnnotation() { - return (access_flags & Constants.ACC_ANNOTATION) != 0; - } - - public final void isEnum(boolean flag) { setFlag(Constants.ACC_ENUM, flag); } - public final boolean isEnum() { - return (access_flags & Constants.ACC_ENUM) != 0; - } + + protected int access_flags; + + + public AccessFlags() { + } + + + /** + * @param a inital access flags + */ + public AccessFlags(int a) { + access_flags = a; + } + + + /** + * @return Access flags of the object aka. "modifiers". + */ + public final int getAccessFlags() { + return access_flags; + } + + + /** + * @return Access flags of the object aka. "modifiers". + */ + public final int getModifiers() { + return access_flags; + } + + + /** Set access flags aka "modifiers". + * @param access_flags Access flags of the object. + */ + public final void setAccessFlags( int access_flags ) { + this.access_flags = access_flags; + } + + + /** Set access flags aka "modifiers". + * @param access_flags Access flags of the object. + */ + public final void setModifiers( int access_flags ) { + setAccessFlags(access_flags); + } + + + private final void setFlag( int flag, boolean set ) { + if ((access_flags & flag) != 0) { // Flag is set already + if (!set) { + access_flags ^= flag; + } + } else { // Flag not set + if (set) { + access_flags |= flag; + } + } + } + + + public final void isPublic( boolean flag ) { + setFlag(Constants.ACC_PUBLIC, flag); + } + + + public final boolean isPublic() { + return (access_flags & Constants.ACC_PUBLIC) != 0; + } + + + public final void isPrivate( boolean flag ) { + setFlag(Constants.ACC_PRIVATE, flag); + } + + + public final boolean isPrivate() { + return (access_flags & Constants.ACC_PRIVATE) != 0; + } + + + public final void isProtected( boolean flag ) { + setFlag(Constants.ACC_PROTECTED, flag); + } + + + public final boolean isProtected() { + return (access_flags & Constants.ACC_PROTECTED) != 0; + } + + + public final void isStatic( boolean flag ) { + setFlag(Constants.ACC_STATIC, flag); + } + + + public final boolean isStatic() { + return (access_flags & Constants.ACC_STATIC) != 0; + } + + + public final void isFinal( boolean flag ) { + setFlag(Constants.ACC_FINAL, flag); + } + + + public final boolean isFinal() { + return (access_flags & Constants.ACC_FINAL) != 0; + } + + + public final void isSynchronized( boolean flag ) { + setFlag(Constants.ACC_SYNCHRONIZED, flag); + } + + + public final boolean isSynchronized() { + return (access_flags & Constants.ACC_SYNCHRONIZED) != 0; + } + + + public final void isVolatile( boolean flag ) { + setFlag(Constants.ACC_VOLATILE, flag); + } + + + public final boolean isVolatile() { + return (access_flags & Constants.ACC_VOLATILE) != 0; + } + + + public final void isTransient( boolean flag ) { + setFlag(Constants.ACC_TRANSIENT, flag); + } + + + public final boolean isTransient() { + return (access_flags & Constants.ACC_TRANSIENT) != 0; + } + + + public final void isNative( boolean flag ) { + setFlag(Constants.ACC_NATIVE, flag); + } + + + public final boolean isNative() { + return (access_flags & Constants.ACC_NATIVE) != 0; + } + + + public final void isInterface( boolean flag ) { + setFlag(Constants.ACC_INTERFACE, flag); + } + + + public final boolean isInterface() { + return (access_flags & Constants.ACC_INTERFACE) != 0; + } + + + public final void isAbstract( boolean flag ) { + setFlag(Constants.ACC_ABSTRACT, flag); + } + + + public final boolean isAbstract() { + return (access_flags & Constants.ACC_ABSTRACT) != 0; + } + + + public final void isStrictfp( boolean flag ) { + setFlag(Constants.ACC_STRICT, flag); + } + + + public final boolean isStrictfp() { + return (access_flags & Constants.ACC_STRICT) != 0; + } + + + public final void isSynthetic( boolean flag ) { + setFlag(Constants.ACC_SYNTHETIC, flag); + } + + + public final boolean isSynthetic() { + return (access_flags & Constants.ACC_SYNTHETIC) != 0; + } + + + public final void isAnnotation( boolean flag ) { + setFlag(Constants.ACC_ANNOTATION, flag); + } + + + public final boolean isAnnotation() { + return (access_flags & Constants.ACC_ANNOTATION) != 0; + } + + + public final void isEnum( boolean flag ) { + setFlag(Constants.ACC_ENUM, flag); + } + + + public final boolean isEnum() { + return (access_flags & Constants.ACC_ENUM) != 0; + } } diff --git a/src/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/java/org/apache/bcel/classfile/AnnotationDefault.java index 89df75e7..3fe48d3f 100644 --- a/src/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -27,59 +27,61 @@ import java.io.IOException; */ public abstract class AnnotationDefault extends Attribute { - ElementValue default_value; + ElementValue default_value; - /** - * @param annotation_type the subclass type of the annotation - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - AnnotationDefault(byte annotation_type, int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(annotation_type, name_index, length, (ElementValue) null, constant_pool); - default_value = new ElementValue(file, constant_pool); - } - - /** - * @param annotation_type the subclass type of the annotation - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param defaultValue the annotation's default value - * @param constant_pool Array of constants - */ - public AnnotationDefault(byte annotation_type, int name_index, int length, ElementValue defaultValue, ConstantPool constant_pool) - { - super(annotation_type, name_index, length, constant_pool); - setDefaultValue(defaultValue); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { -// v.visitAnnotationDefault(this); - } - - /** - * @param defaultValue the default value of this methodinfo's annotation - */ - public final void setDefaultValue(ElementValue defaultValue) - { - default_value = defaultValue; - } - /** - * @return the default value - */ - public final ElementValue getDefaultValue() - { - return default_value; - } + /** + * @param annotation_type the subclass type of the annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + AnnotationDefault(byte annotation_type, int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException { + this(annotation_type, name_index, length, (ElementValue) null, constant_pool); + default_value = new ElementValue(file, constant_pool); + } + + + /** + * @param annotation_type the subclass type of the annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param defaultValue the annotation's default value + * @param constant_pool Array of constants + */ + public AnnotationDefault(byte annotation_type, int name_index, int length, + ElementValue defaultValue, ConstantPool constant_pool) { + super(annotation_type, name_index, length, constant_pool); + setDefaultValue(defaultValue); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + // v.visitAnnotationDefault(this); + } + + + /** + * @param defaultValue the default value of this methodinfo's annotation + */ + public final void setDefaultValue( ElementValue defaultValue ) { + default_value = defaultValue; + } + + + /** + * @return the default value + */ + public final ElementValue getDefaultValue() { + return default_value; + } } diff --git a/src/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/java/org/apache/bcel/classfile/AnnotationEntry.java index 63c417b8..fd03091d 100644 --- a/src/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -20,65 +20,70 @@ import java.io.DataInputStream; import java.io.IOException; import org.apache.bcel.Constants; - /** * represents one annotation in the annotation table * * @version $Id: AnnotationEntry * @author D. Brosius */ -public class AnnotationEntry implements Node, Constants -{ - private int type_index; - private int num_element_value_pairs; - private ElementValuePair[] element_value_pairs; - private ConstantPool constant_pool; - - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - */ - AnnotationEntry(DataInputStream file, ConstantPool constant_pool) - throws IOException - { - type_index = (file.readUnsignedShort()); - num_element_value_pairs = (file.readUnsignedShort()); +public class AnnotationEntry implements Node, Constants { + + private int type_index; + private int num_element_value_pairs; + private ElementValuePair[] element_value_pairs; + private ConstantPool constant_pool; + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + AnnotationEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { + type_index = (file.readUnsignedShort()); + num_element_value_pairs = (file.readUnsignedShort()); + element_value_pairs = new ElementValuePair[num_element_value_pairs]; + for (int i = 0; i < num_element_value_pairs; i++) { + element_value_pairs[i] = new ElementValuePair(file, constant_pool); + } + this.constant_pool = constant_pool; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + // v.visitAnnotationEntry(this); + } + + + /** + * @return the annotation type name + */ + public String getAnnotationType() { + ConstantUtf8 c; + c = (ConstantUtf8) constant_pool.getConstant(type_index, CONSTANT_Utf8); + return c.getBytes(); + } + + + /** + * @return the number of element value pairs in this annotation entry + */ + public final int getNumElementValuePairs() { + return num_element_value_pairs; + } - element_value_pairs = new ElementValuePair[num_element_value_pairs]; - for(int i=0; i < num_element_value_pairs; i++) - element_value_pairs[i] = new ElementValuePair(file, constant_pool); - this.constant_pool = constant_pool; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { -// v.visitAnnotationEntry(this); - } - - /** - * @return the annotation type name - */ - public String getAnnotationType() { - ConstantUtf8 c; - c = (ConstantUtf8)constant_pool.getConstant(type_index, CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return the number of element value pairs in this annotation entry - */ - public final int getNumElementValuePairs() { return num_element_value_pairs; } - - /** - * @return the element value pairs in this annotation entry - */ - public ElementValuePair[] getElementValuePairs() { return element_value_pairs; } + /** + * @return the element value pairs in this annotation entry + */ + public ElementValuePair[] getElementValuePairs() { + return element_value_pairs; + } } diff --git a/src/java/org/apache/bcel/classfile/Annotations.java b/src/java/org/apache/bcel/classfile/Annotations.java index 1d808731..df3cbaed 100644 --- a/src/java/org/apache/bcel/classfile/Annotations.java +++ b/src/java/org/apache/bcel/classfile/Annotations.java @@ -27,80 +27,83 @@ import java.io.IOException; */ public abstract class Annotations extends Attribute { - private int annotation_table_length; - private AnnotationEntry[] annotation_table; // Table of annotations - - /** - * @param annotation_type the subclass type of the annotation - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - Annotations(byte annotation_type, int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool); - - annotation_table_length = (file.readUnsignedShort()); - annotation_table = new AnnotationEntry[annotation_table_length]; - - for(int i=0; i < annotation_table_length; i++) - annotation_table[i] = new AnnotationEntry(file, constant_pool); - } - - /** - * @param annotation_type the subclass type of the annotation - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param annotation_table the actual annotations - * @param constant_pool Array of constants - */ - public Annotations(byte annotation_type, int name_index, int length, AnnotationEntry[] annotation_table, ConstantPool constant_pool) - { - super(annotation_type, name_index, length, constant_pool); - setAnnotationTable(annotation_table); - - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { -// v.visitAnnotation(this); - } - - /** - * @param annotation_table the entries to set in this annotation - */ - public final void setAnnotationTable(AnnotationEntry[] annotation_table) - { - this.annotation_table = annotation_table; - annotation_table_length = (annotation_table == null)? 0 : - annotation_table.length; - } - - /** - * @return the annotation entry table - */ - public final AnnotationEntry[] getAnnotationTable() - { - return annotation_table; - } - - /** - * returns the array of annotation entries in this annotation - */ - public AnnotationEntry[] getAnnotationEntries() { - return annotation_table; - } - - /** - * @return the number of annotation entries in this annotation - */ - public final int getNumAnnotations() { return annotation_table_length; } + private int annotation_table_length; + private AnnotationEntry[] annotation_table; // Table of annotations + + + /** + * @param annotation_type the subclass type of the annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + Annotations(byte annotation_type, int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException { + this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool); + annotation_table_length = (file.readUnsignedShort()); + annotation_table = new AnnotationEntry[annotation_table_length]; + for (int i = 0; i < annotation_table_length; i++) { + annotation_table[i] = new AnnotationEntry(file, constant_pool); + } + } + + + /** + * @param annotation_type the subclass type of the annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param annotation_table the actual annotations + * @param constant_pool Array of constants + */ + public Annotations(byte annotation_type, int name_index, int length, + AnnotationEntry[] annotation_table, ConstantPool constant_pool) { + super(annotation_type, name_index, length, constant_pool); + setAnnotationTable(annotation_table); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + // v.visitAnnotation(this); + } + + + /** + * @param annotation_table the entries to set in this annotation + */ + public final void setAnnotationTable( AnnotationEntry[] annotation_table ) { + this.annotation_table = annotation_table; + annotation_table_length = (annotation_table == null) ? 0 : annotation_table.length; + } + + + /** + * @return the annotation entry table + */ + public final AnnotationEntry[] getAnnotationTable() { + return annotation_table; + } + + + /** + * returns the array of annotation entries in this annotation + */ + public AnnotationEntry[] getAnnotationEntries() { + return annotation_table; + } + + + /** + * @return the number of annotation entries in this annotation + */ + public final int getNumAnnotations() { + return annotation_table_length; + } } diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/java/org/apache/bcel/classfile/Attribute.java index 8a427e38..7bc634c1 100644 --- a/src/java/org/apache/bcel/classfile/Attribute.java +++ b/src/java/org/apache/bcel/classfile/Attribute.java @@ -45,238 +45,234 @@ import org.apache.bcel.Constants; * @see Synthetic * @see Deprecated * @see Signature -*/ + */ public abstract class Attribute implements Cloneable, Node, Serializable { - protected int name_index; // Points to attribute name in constant pool - protected int length; // Content length of attribute field - protected byte tag; // Tag to distiguish subclasses - protected ConstantPool constant_pool; - - protected Attribute(byte tag, int name_index, int length, - ConstantPool constant_pool) { - this.tag = tag; - this.name_index = name_index; - this.length = length; - this.constant_pool = constant_pool; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public abstract void accept(Visitor v); - - /** - * Dump attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public void dump(DataOutputStream file) throws IOException - { - file.writeShort(name_index); - file.writeInt(length); - } - - private static Map readers = new HashMap(); - - /** Add an Attribute reader capable of parsing (user-defined) attributes - * named "name". You should not add readers for the standard attributes - * such as "LineNumberTable", because those are handled internally. - * - * @param name the name of the attribute as stored in the class file - * @param r the reader object - */ - public static void addAttributeReader(String name, AttributeReader r) { - readers.put(name, r); - } - - /** Remove attribute reader - * - * @param name the name of the attribute as stored in the class file - */ - public static void removeAttributeReader(String name) { - readers.remove(name); - } - - /* Class method reads one attribute from the input data stream. - * This method must not be accessible from the outside. It is - * called by the Field and Method constructor methods. - * - * @see Field - * @see Method - * @param file Input stream - * @param constant_pool Array of constants - * @return Attribute - * @throws IOException - * @throws ClassFormatException - */ - public static final Attribute readAttribute(DataInputStream file, - ConstantPool constant_pool) - throws IOException, ClassFormatException - { - ConstantUtf8 c; - String name; - int name_index; - int length; - byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute - - // Get class name from constant pool via `name_index' indirection - name_index = file.readUnsignedShort(); - c = (ConstantUtf8)constant_pool.getConstant(name_index, - Constants.CONSTANT_Utf8); - name = c.getBytes(); - - // Length of data in bytes - length = file.readInt(); - - // Compare strings to find known attribute - for(byte i=0; i < Constants.KNOWN_ATTRIBUTES; i++) { - if(name.equals(Constants.ATTRIBUTE_NAMES[i])) { - tag = i; // found! - break; - } + + protected int name_index; // Points to attribute name in constant pool + protected int length; // Content length of attribute field + protected byte tag; // Tag to distiguish subclasses + protected ConstantPool constant_pool; + + + protected Attribute(byte tag, int name_index, int length, ConstantPool constant_pool) { + this.tag = tag; + this.name_index = name_index; + this.length = length; + this.constant_pool = constant_pool; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public abstract void accept( Visitor v ); + + + /** + * Dump attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public void dump( DataOutputStream file ) throws IOException { + file.writeShort(name_index); + file.writeInt(length); + } + + private static Map readers = new HashMap(); + + + /** Add an Attribute reader capable of parsing (user-defined) attributes + * named "name". You should not add readers for the standard attributes + * such as "LineNumberTable", because those are handled internally. + * + * @param name the name of the attribute as stored in the class file + * @param r the reader object + */ + public static void addAttributeReader( String name, AttributeReader r ) { + readers.put(name, r); + } + + + /** Remove attribute reader + * + * @param name the name of the attribute as stored in the class file + */ + public static void removeAttributeReader( String name ) { + readers.remove(name); + } + + + /* Class method reads one attribute from the input data stream. + * This method must not be accessible from the outside. It is + * called by the Field and Method constructor methods. + * + * @see Field + * @see Method + * @param file Input stream + * @param constant_pool Array of constants + * @return Attribute + * @throws IOException + * @throws ClassFormatException + */ + public static final Attribute readAttribute( DataInputStream file, ConstantPool constant_pool ) + throws IOException, ClassFormatException { + ConstantUtf8 c; + String name; + int name_index; + int length; + byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute + // Get class name from constant pool via `name_index' indirection + name_index = file.readUnsignedShort(); + c = (ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8); + name = c.getBytes(); + // Length of data in bytes + length = file.readInt(); + // Compare strings to find known attribute + for (byte i = 0; i < Constants.KNOWN_ATTRIBUTES; i++) { + if (name.equals(Constants.ATTRIBUTE_NAMES[i])) { + tag = i; // found! + break; + } + } + // Call proper constructor, depending on `tag' + switch (tag) { + case Constants.ATTR_UNKNOWN: + AttributeReader r = (AttributeReader) readers.get(name); + if (r != null) { + return r.createAttribute(name_index, length, file, constant_pool); + } + return new Unknown(name_index, length, file, constant_pool); + case Constants.ATTR_CONSTANT_VALUE: + return new ConstantValue(name_index, length, file, constant_pool); + case Constants.ATTR_SOURCE_FILE: + return new SourceFile(name_index, length, file, constant_pool); + case Constants.ATTR_CODE: + return new Code(name_index, length, file, constant_pool); + case Constants.ATTR_EXCEPTIONS: + return new ExceptionTable(name_index, length, file, constant_pool); + case Constants.ATTR_LINE_NUMBER_TABLE: + return new LineNumberTable(name_index, length, file, constant_pool); + case Constants.ATTR_LOCAL_VARIABLE_TABLE: + return new LocalVariableTable(name_index, length, file, constant_pool); + case Constants.ATTR_INNER_CLASSES: + return new InnerClasses(name_index, length, file, constant_pool); + case Constants.ATTR_SYNTHETIC: + return new Synthetic(name_index, length, file, constant_pool); + case Constants.ATTR_DEPRECATED: + return new Deprecated(name_index, length, file, constant_pool); + case Constants.ATTR_PMG: + return new PMGClass(name_index, length, file, constant_pool); + case Constants.ATTR_SIGNATURE: + return new Signature(name_index, length, file, constant_pool); + case Constants.ATTR_STACK_MAP: + return new StackMap(name_index, length, file, constant_pool); + // case Constants.ATTR_RUNTIMEVISIBLE_ANNOTATIONS: + // return new RuntimeVisibleAnnotations(name_index, length, file, constant_pool); + // case Constants.ATTR_RUNTIMEINVISIBLE_ANNOTATIONS: + // return new RuntimeInvisibleAnnotations(name_index, length, file, constant_pool); + // case Constants.ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS: + // return new RuntimeVisibleParameterAnnotations(name_index, length, file, constant_pool); + // case Constants.ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS: + // return new RuntimeInvisibleParameterAnnotations(name_index, length, file, constant_pool); + // case Constants.ATTR_ANNOTATION_DEFAULT: + // return new AnnotationDefault(name_index, length, file, constant_pool); + default: // Never reached + throw new IllegalStateException("Ooops! default case reached."); + } + } + + + /** + * @return Length of attribute field in bytes. + */ + public final int getLength() { + return length; } - // Call proper constructor, depending on `tag' - switch(tag) { - case Constants.ATTR_UNKNOWN: - AttributeReader r = (AttributeReader)readers.get(name); - - if(r != null) - return r.createAttribute(name_index, length, file, constant_pool); - return new Unknown(name_index, length, file, constant_pool); - - case Constants.ATTR_CONSTANT_VALUE: - return new ConstantValue(name_index, length, file, constant_pool); - - case Constants.ATTR_SOURCE_FILE: - return new SourceFile(name_index, length, file, constant_pool); - - case Constants.ATTR_CODE: - return new Code(name_index, length, file, constant_pool); - - case Constants.ATTR_EXCEPTIONS: - return new ExceptionTable(name_index, length, file, constant_pool); - - case Constants.ATTR_LINE_NUMBER_TABLE: - return new LineNumberTable(name_index, length, file, constant_pool); - - case Constants.ATTR_LOCAL_VARIABLE_TABLE: - return new LocalVariableTable(name_index, length, file, constant_pool); - - case Constants.ATTR_INNER_CLASSES: - return new InnerClasses(name_index, length, file, constant_pool); - - case Constants.ATTR_SYNTHETIC: - return new Synthetic(name_index, length, file, constant_pool); - - case Constants.ATTR_DEPRECATED: - return new Deprecated(name_index, length, file, constant_pool); - - case Constants.ATTR_PMG: - return new PMGClass(name_index, length, file, constant_pool); - - case Constants.ATTR_SIGNATURE: - return new Signature(name_index, length, file, constant_pool); - - case Constants.ATTR_STACK_MAP: - return new StackMap(name_index, length, file, constant_pool); - -// case Constants.ATTR_RUNTIMEVISIBLE_ANNOTATIONS: -// return new RuntimeVisibleAnnotations(name_index, length, file, constant_pool); - -// case Constants.ATTR_RUNTIMEINVISIBLE_ANNOTATIONS: -// return new RuntimeInvisibleAnnotations(name_index, length, file, constant_pool); - -// case Constants.ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS: -// return new RuntimeVisibleParameterAnnotations(name_index, length, file, constant_pool); - -// case Constants.ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS: -// return new RuntimeInvisibleParameterAnnotations(name_index, length, file, constant_pool); - -// case Constants.ATTR_ANNOTATION_DEFAULT: -// return new AnnotationDefault(name_index, length, file, constant_pool); - - default: // Never reached - throw new IllegalStateException("Ooops! default case reached."); + + /** + * @param length length in bytes. + */ + public final void setLength( int length ) { + this.length = length; + } + + + /** + * @param name_index of attribute. + */ + public final void setNameIndex( int name_index ) { + this.name_index = name_index; + } + + + /** + * @return Name index in constant pool of attribute name. + */ + public final int getNameIndex() { + return name_index; + } + + + /** + * @return Tag of attribute, i.e., its type. Value may not be altered, thus + * there is no setTag() method. + */ + public final byte getTag() { + return tag; } - } - - /** - * @return Length of attribute field in bytes. - */ - public final int getLength() { return length; } - - /** - * @param length length in bytes. - */ - public final void setLength(int length) { - this.length = length; - } - - /** - * @param name_index of attribute. - */ - public final void setNameIndex(int name_index) { - this.name_index = name_index; - } - - /** - * @return Name index in constant pool of attribute name. - */ - public final int getNameIndex() { return name_index; } - - /** - * @return Tag of attribute, i.e., its type. Value may not be altered, thus - * there is no setTag() method. - */ - public final byte getTag() { return tag; } - - /** - * @return Constant pool used by this object. - * @see ConstantPool - */ - public final ConstantPool getConstantPool() { return constant_pool; } - - /** - * @param constant_pool Constant pool to be used for this object. - * @see ConstantPool - */ - public final void setConstantPool(ConstantPool constant_pool) { - this.constant_pool = constant_pool; - } - - /** - * Use copy() if you want to have a deep copy(), i.e., with all references - * copied correctly. - * - * @return shallow copy of this attribute - */ - public Object clone() { - Object o = null; - - try { - o = super.clone(); - } catch(CloneNotSupportedException e) { - e.printStackTrace(); // Never occurs + + + /** + * @return Constant pool used by this object. + * @see ConstantPool + */ + public final ConstantPool getConstantPool() { + return constant_pool; + } + + + /** + * @param constant_pool Constant pool to be used for this object. + * @see ConstantPool + */ + public final void setConstantPool( ConstantPool constant_pool ) { + this.constant_pool = constant_pool; } - return o; - } - /** - * @return deep copy of this attribute - */ - public abstract Attribute copy(ConstantPool _constant_pool); + /** + * Use copy() if you want to have a deep copy(), i.e., with all references + * copied correctly. + * + * @return shallow copy of this attribute + */ + public Object clone() { + Object o = null; + try { + o = super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); // Never occurs + } + return o; + } + + + /** + * @return deep copy of this attribute + */ + public abstract Attribute copy( ConstantPool _constant_pool ); - /** - * @return attribute name. - */ - public String toString() { - return Constants.ATTRIBUTE_NAMES[tag]; - } + + /** + * @return attribute name. + */ + public String toString() { + return Constants.ATTRIBUTE_NAMES[tag]; + } } diff --git a/src/java/org/apache/bcel/classfile/AttributeReader.java b/src/java/org/apache/bcel/classfile/AttributeReader.java index 7ab16bf1..65267e70 100644 --- a/src/java/org/apache/bcel/classfile/AttributeReader.java +++ b/src/java/org/apache/bcel/classfile/AttributeReader.java @@ -16,7 +16,6 @@ */ package org.apache.bcel.classfile; - /** * Unknown (non-standard) attributes may be read via user-defined factory * objects that can be registered with the Attribute.addAttributeReader @@ -27,7 +26,8 @@ package org.apache.bcel.classfile; * @author M. Dahm */ public interface AttributeReader { - /** + + /** When this attribute reader is added via the static method Attribute.addAttributeReader, an attribute name is associated with it. As the class file parser parses attributes, it will call various @@ -52,9 +52,7 @@ public interface AttributeReader { returned which will cause the parsing of the class file to fail. @see Attribute#addAttributeReader( String, AttributeReader ) - */ - public Attribute createAttribute(int name_index, - int length, - java.io.DataInputStream file, - ConstantPool constant_pool); + */ + public Attribute createAttribute( int name_index, int length, java.io.DataInputStream file, + ConstantPool constant_pool ); } diff --git a/src/java/org/apache/bcel/classfile/ClassFormatException.java b/src/java/org/apache/bcel/classfile/ClassFormatException.java index 25dec175..14940110 100644 --- a/src/java/org/apache/bcel/classfile/ClassFormatException.java +++ b/src/java/org/apache/bcel/classfile/ClassFormatException.java @@ -16,7 +16,6 @@ */ package org.apache.bcel.classfile; - /** * Thrown when the BCEL attempts to read a class file and determines * that the file is malformed or otherwise cannot be interpreted as a @@ -26,7 +25,13 @@ package org.apache.bcel.classfile; * @author M. Dahm */ public class ClassFormatException extends RuntimeException { - public ClassFormatException() { super(); } - public ClassFormatException(String s) { super(s); } -} + public ClassFormatException() { + super(); + } + + + public ClassFormatException(String s) { + super(s); + } +} diff --git a/src/java/org/apache/bcel/classfile/ClassParser.java b/src/java/org/apache/bcel/classfile/ClassParser.java index f663eab4..cbf90ec6 100644 --- a/src/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/java/org/apache/bcel/classfile/ClassParser.java @@ -41,267 +41,255 @@ import org.apache.bcel.Constants; * @author M. Dahm */ public final class ClassParser { - private DataInputStream file; - private boolean fileOwned; - private String file_name; - private String zip_file; - private int class_name_index, superclass_name_index; - private int major, minor; // Compiler version - private int access_flags; // Access rights of parsed class - private int[] interfaces; // Names of implemented interfaces - private ConstantPool constant_pool; // collection of constants - private Field[] fields; // class fields, i.e., its variables - private Method[] methods; // methods defined in the class - private Attribute[] attributes; // attributes defined in the class - private boolean is_zip; // Loaded from zip file - private static final int BUFSIZE = 8192; + private DataInputStream file; + private boolean fileOwned; + private String file_name; + private String zip_file; + private int class_name_index, superclass_name_index; + private int major, minor; // Compiler version + private int access_flags; // Access rights of parsed class + private int[] interfaces; // Names of implemented interfaces + private ConstantPool constant_pool; // collection of constants + private Field[] fields; // class fields, i.e., its variables + private Method[] methods; // methods defined in the class + private Attribute[] attributes; // attributes defined in the class + private boolean is_zip; // Loaded from zip file + private static final int BUFSIZE = 8192; - /** - * Parse class from the given stream. - * - * @param file Input stream - * @param file_name File name - */ - public ClassParser(InputStream file, String file_name) { - this.file_name = file_name; - fileOwned = false; - String clazz = file.getClass().getName(); // Not a very clean solution ... - is_zip = clazz.startsWith("java.util.zip.") || clazz.startsWith("java.util.jar."); - if(file instanceof DataInputStream) // Is already a data stream - this.file = (DataInputStream)file; - else - this.file = new DataInputStream(new BufferedInputStream(file, BUFSIZE)); - } + /** + * Parse class from the given stream. + * + * @param file Input stream + * @param file_name File name + */ + public ClassParser(InputStream file, String file_name) { + this.file_name = file_name; + fileOwned = false; + String clazz = file.getClass().getName(); // Not a very clean solution ... + is_zip = clazz.startsWith("java.util.zip.") || clazz.startsWith("java.util.jar."); + if (file instanceof DataInputStream) { + this.file = (DataInputStream) file; + } else { + this.file = new DataInputStream(new BufferedInputStream(file, BUFSIZE)); + } + } + - /** Parse class from given .class file. - * - * @param file_name file name - */ - public ClassParser(String file_name) throws IOException - { - is_zip = false; - this.file_name = file_name; - fileOwned = true; - } + /** Parse class from given .class file. + * + * @param file_name file name + */ + public ClassParser(String file_name) throws IOException { + is_zip = false; + this.file_name = file_name; + fileOwned = true; + } - /** Parse class from given .class file in a ZIP-archive - * - * @param zip_file zip file name - * @param file_name file name - */ - public ClassParser(String zip_file, String file_name) - { - is_zip = true; - fileOwned = true; - this.zip_file = zip_file; - this.file_name = file_name; - } - /** - * Parse the given Java class file and return an object that represents - * the contained data, i.e., constants, methods, fields and commands. - * A ClassFormatException is raised, if the file is not a valid - * .class file. (This does not include verification of the byte code as it - * is performed by the java interpreter). - * - * @return Class object representing the parsed class file - * @throws IOException - * @throws ClassFormatException - */ - public JavaClass parse() throws IOException, ClassFormatException - { - ZipFile zip = null; - - try { - if (fileOwned) { - if (is_zip) { - zip = new ZipFile(zip_file); - ZipEntry entry = zip.getEntry(file_name); - file = new DataInputStream(new BufferedInputStream(zip.getInputStream(entry), - BUFSIZE)); - } else { - file = new DataInputStream(new BufferedInputStream - (new FileInputStream(file_name), BUFSIZE)); - } - } - /****************** Read headers ********************************/ - // Check magic tag of class file - readID(); - - // Get compiler version - readVersion(); - - /****************** Read constant pool and related **************/ - // Read constant pool entries - readConstantPool(); - - // Get class information - readClassInfo(); - - // Get interface information, i.e., implemented interfaces - readInterfaces(); - - /****************** Read class fields and methods ***************/ - // Read class fields, i.e., the variables of the class - readFields(); - - // Read class methods, i.e., the functions in the class - readMethods(); - - // Read class attributes - readAttributes(); - - // Check for unknown variables - //Unknown[] u = Unknown.getUnknownAttributes(); - //for(int i=0; i < u.length; i++) - // System.err.println("WARNING: " + u[i]); - - // Everything should have been read now - // if(file.available() > 0) { - // int bytes = file.available(); - // byte[] buf = new byte[bytes]; - // file.read(buf); - - // if(!(is_zip && (buf.length == 1))) { - // System.err.println("WARNING: Trailing garbage at end of " + file_name); - // System.err.println(bytes + " extra bytes: " + Utility.toHexString(buf)); - // } - // } - } finally { - // Read everything of interest, so close the file - if (fileOwned) { - file.close(); - if (zip != null) - zip.close(); - } - } + /** Parse class from given .class file in a ZIP-archive + * + * @param zip_file zip file name + * @param file_name file name + */ + public ClassParser(String zip_file, String file_name) { + is_zip = true; + fileOwned = true; + this.zip_file = zip_file; + this.file_name = file_name; + } - // Return the information we have gathered in a new object - return new JavaClass(class_name_index, superclass_name_index, - file_name, major, minor, access_flags, - constant_pool, interfaces, fields, - methods, attributes, is_zip? JavaClass.ZIP : JavaClass.FILE); - } - /** - * Read information about the attributes of the class. - * @throws IOException - * @throws ClassFormatException - */ - private final void readAttributes() throws IOException, ClassFormatException - { - int attributes_count; + /** + * Parse the given Java class file and return an object that represents + * the contained data, i.e., constants, methods, fields and commands. + * A ClassFormatException is raised, if the file is not a valid + * .class file. (This does not include verification of the byte code as it + * is performed by the java interpreter). + * + * @return Class object representing the parsed class file + * @throws IOException + * @throws ClassFormatException + */ + public JavaClass parse() throws IOException, ClassFormatException { + ZipFile zip = null; + try { + if (fileOwned) { + if (is_zip) { + zip = new ZipFile(zip_file); + ZipEntry entry = zip.getEntry(file_name); + file = new DataInputStream(new BufferedInputStream(zip.getInputStream(entry), + BUFSIZE)); + } else { + file = new DataInputStream(new BufferedInputStream(new FileInputStream( + file_name), BUFSIZE)); + } + } + /****************** Read headers ********************************/ + // Check magic tag of class file + readID(); + // Get compiler version + readVersion(); + /****************** Read constant pool and related **************/ + // Read constant pool entries + readConstantPool(); + // Get class information + readClassInfo(); + // Get interface information, i.e., implemented interfaces + readInterfaces(); + /****************** Read class fields and methods ***************/ + // Read class fields, i.e., the variables of the class + readFields(); + // Read class methods, i.e., the functions in the class + readMethods(); + // Read class attributes + readAttributes(); + // Check for unknown variables + //Unknown[] u = Unknown.getUnknownAttributes(); + //for(int i=0; i < u.length; i++) + // System.err.println("WARNING: " + u[i]); + // Everything should have been read now + // if(file.available() > 0) { + // int bytes = file.available(); + // byte[] buf = new byte[bytes]; + // file.read(buf); + // if(!(is_zip && (buf.length == 1))) { + // System.err.println("WARNING: Trailing garbage at end of " + file_name); + // System.err.println(bytes + " extra bytes: " + Utility.toHexString(buf)); + // } + // } + } finally { + // Read everything of interest, so close the file + if (fileOwned) { + file.close(); + if (zip != null) { + zip.close(); + } + } + } + // Return the information we have gathered in a new object + return new JavaClass(class_name_index, superclass_name_index, file_name, major, minor, + access_flags, constant_pool, interfaces, fields, methods, attributes, is_zip + ? JavaClass.ZIP + : JavaClass.FILE); + } - attributes_count = file.readUnsignedShort(); - attributes = new Attribute[attributes_count]; - for(int i=0; i < attributes_count; i++) - attributes[i] = Attribute.readAttribute(file, constant_pool); - } + /** + * Read information about the attributes of the class. + * @throws IOException + * @throws ClassFormatException + */ + private final void readAttributes() throws IOException, ClassFormatException { + int attributes_count; + attributes_count = file.readUnsignedShort(); + attributes = new Attribute[attributes_count]; + for (int i = 0; i < attributes_count; i++) { + attributes[i] = Attribute.readAttribute(file, constant_pool); + } + } - /** - * Read information about the class and its super class. - * @throws IOException - * @throws ClassFormatException - */ - private final void readClassInfo() throws IOException, ClassFormatException - { - access_flags = file.readUnsignedShort(); - /* Interfaces are implicitely abstract, the flag should be set - * according to the JVM specification. + /** + * Read information about the class and its super class. + * @throws IOException + * @throws ClassFormatException */ - if((access_flags & Constants.ACC_INTERFACE) != 0) - access_flags |= Constants.ACC_ABSTRACT; + private final void readClassInfo() throws IOException, ClassFormatException { + access_flags = file.readUnsignedShort(); + /* Interfaces are implicitely abstract, the flag should be set + * according to the JVM specification. + */ + if ((access_flags & Constants.ACC_INTERFACE) != 0) { + access_flags |= Constants.ACC_ABSTRACT; + } + if (((access_flags & Constants.ACC_ABSTRACT) != 0) + && ((access_flags & Constants.ACC_FINAL) != 0)) { + throw new ClassFormatException("Class can't be both final and abstract"); + } + class_name_index = file.readUnsignedShort(); + superclass_name_index = file.readUnsignedShort(); + } - if(((access_flags & Constants.ACC_ABSTRACT) != 0) && - ((access_flags & Constants.ACC_FINAL) != 0 )) - throw new ClassFormatException("Class can't be both final and abstract"); - class_name_index = file.readUnsignedShort(); - superclass_name_index = file.readUnsignedShort(); - } - /** - * Read constant pool entries. - * @throws IOException - * @throws ClassFormatException - */ - private final void readConstantPool() throws IOException, ClassFormatException - { - constant_pool = new ConstantPool(file); - } + /** + * Read constant pool entries. + * @throws IOException + * @throws ClassFormatException + */ + private final void readConstantPool() throws IOException, ClassFormatException { + constant_pool = new ConstantPool(file); + } - /** - * Read information about the fields of the class, i.e., its variables. - * @throws IOException - * @throws ClassFormatException - */ - private final void readFields() throws IOException, ClassFormatException - { - int fields_count; - fields_count = file.readUnsignedShort(); - fields = new Field[fields_count]; + /** + * Read information about the fields of the class, i.e., its variables. + * @throws IOException + * @throws ClassFormatException + */ + private final void readFields() throws IOException, ClassFormatException { + int fields_count; + fields_count = file.readUnsignedShort(); + fields = new Field[fields_count]; + for (int i = 0; i < fields_count; i++) { + fields[i] = new Field(file, constant_pool); + } + } - for(int i=0; i < fields_count; i++) - fields[i] = new Field(file, constant_pool); - } - /******************** Private utility methods **********************/ + /******************** Private utility methods **********************/ + /** + * Check whether the header of the file is ok. + * Of course, this has to be the first action on successive file reads. + * @throws IOException + * @throws ClassFormatException + */ + private final void readID() throws IOException, ClassFormatException { + int magic = 0xCAFEBABE; + if (file.readInt() != magic) { + throw new ClassFormatException(file_name + " is not a Java .class file"); + } + } - /** - * Check whether the header of the file is ok. - * Of course, this has to be the first action on successive file reads. - * @throws IOException - * @throws ClassFormatException - */ - private final void readID() throws IOException, ClassFormatException - { - int magic = 0xCAFEBABE; - if(file.readInt() != magic) - throw new ClassFormatException(file_name + " is not a Java .class file"); - } - /** - * Read information about the interfaces implemented by this class. - * @throws IOException - * @throws ClassFormatException - */ - private final void readInterfaces() throws IOException, ClassFormatException - { - int interfaces_count; + /** + * Read information about the interfaces implemented by this class. + * @throws IOException + * @throws ClassFormatException + */ + private final void readInterfaces() throws IOException, ClassFormatException { + int interfaces_count; + interfaces_count = file.readUnsignedShort(); + interfaces = new int[interfaces_count]; + for (int i = 0; i < interfaces_count; i++) { + interfaces[i] = file.readUnsignedShort(); + } + } - interfaces_count = file.readUnsignedShort(); - interfaces = new int[interfaces_count]; - for(int i=0; i < interfaces_count; i++) - interfaces[i] = file.readUnsignedShort(); - } - /** - * Read information about the methods of the class. - * @throws IOException - * @throws ClassFormatException - */ - private final void readMethods() throws IOException, ClassFormatException - { - int methods_count; + /** + * Read information about the methods of the class. + * @throws IOException + * @throws ClassFormatException + */ + private final void readMethods() throws IOException, ClassFormatException { + int methods_count; + methods_count = file.readUnsignedShort(); + methods = new Method[methods_count]; + for (int i = 0; i < methods_count; i++) { + methods[i] = new Method(file, constant_pool); + } + } - methods_count = file.readUnsignedShort(); - methods = new Method[methods_count]; - for(int i=0; i < methods_count; i++) - methods[i] = new Method(file, constant_pool); - } - /** - * Read major and minor version of compiler which created the file. - * @throws IOException - * @throws ClassFormatException - */ - private final void readVersion() throws IOException, ClassFormatException - { - minor = file.readUnsignedShort(); - major = file.readUnsignedShort(); - } + /** + * Read major and minor version of compiler which created the file. + * @throws IOException + * @throws ClassFormatException + */ + private final void readVersion() throws IOException, ClassFormatException { + minor = file.readUnsignedShort(); + major = file.readUnsignedShort(); + } } diff --git a/src/java/org/apache/bcel/classfile/Code.java b/src/java/org/apache/bcel/classfile/Code.java index 656c5e48..bad70a37 100644 --- a/src/java/org/apache/bcel/classfile/Code.java +++ b/src/java/org/apache/bcel/classfile/Code.java @@ -41,305 +41,312 @@ import org.apache.bcel.Constants; * @see LocalVariableTable */ public final class Code extends Attribute { - private int max_stack; // Maximum size of stack used by this method - private int max_locals; // Number of local variables - private int code_length; // Length of code in bytes - private byte[] code; // Actual byte code - - private int exception_table_length; - private CodeException[] exception_table; // Table of handled exceptions - private int attributes_count; // Attributes of code: LineNumber - private Attribute[] attributes; // or LocalVariable - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use copy() for a physical copy. - */ - public Code(Code c) { - this(c.getNameIndex(), c.getLength(), c.getMaxStack(), c.getMaxLocals(), - c.getCode(), c.getExceptionTable(), c.getAttributes(), - c.getConstantPool()); - } - - /** - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - Code(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - // Initialize with some default values which will be overwritten later - this(name_index, length, - file.readUnsignedShort(), file.readUnsignedShort(), - (byte[])null, (CodeException[])null, (Attribute[])null, - constant_pool); - - code_length = file.readInt(); - code = new byte[code_length]; // Read byte code - file.readFully(code); - - /* Read exception table that contains all regions where an exception - * handler is active, i.e., a try { ... } catch() block. + + private int max_stack; // Maximum size of stack used by this method + private int max_locals; // Number of local variables + private int code_length; // Length of code in bytes + private byte[] code; // Actual byte code + private int exception_table_length; + private CodeException[] exception_table; // Table of handled exceptions + private int attributes_count; // Attributes of code: LineNumber + private Attribute[] attributes; // or LocalVariable + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use copy() for a physical copy. + */ + public Code(Code c) { + this(c.getNameIndex(), c.getLength(), c.getMaxStack(), c.getMaxLocals(), c.getCode(), c + .getExceptionTable(), c.getAttributes(), c.getConstantPool()); + } + + + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + Code(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + // Initialize with some default values which will be overwritten later + this(name_index, length, file.readUnsignedShort(), file.readUnsignedShort(), (byte[]) null, + (CodeException[]) null, (Attribute[]) null, constant_pool); + code_length = file.readInt(); + code = new byte[code_length]; // Read byte code + file.readFully(code); + /* Read exception table that contains all regions where an exception + * handler is active, i.e., a try { ... } catch() block. + */ + exception_table_length = file.readUnsignedShort(); + exception_table = new CodeException[exception_table_length]; + for (int i = 0; i < exception_table_length; i++) { + exception_table[i] = new CodeException(file); + } + /* Read all attributes, currently `LineNumberTable' and + * `LocalVariableTable' + */ + attributes_count = file.readUnsignedShort(); + attributes = new Attribute[attributes_count]; + for (int i = 0; i < attributes_count; i++) { + attributes[i] = Attribute.readAttribute(file, constant_pool); + } + /* Adjust length, because of setAttributes in this(), s.b. length + * is incorrect, because it didn't take the internal attributes + * into account yet! Very subtle bug, fixed in 3.1.1. + */ + this.length = length; + } + + + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param max_stack Maximum size of stack + * @param max_locals Number of local variables + * @param code Actual byte code + * @param exception_table Table of handled exceptions + * @param attributes Attributes of code: LineNumber or LocalVariable + * @param constant_pool Array of constants + */ + public Code(int name_index, int length, int max_stack, int max_locals, byte[] code, + CodeException[] exception_table, Attribute[] attributes, ConstantPool constant_pool) { + super(Constants.ATTR_CODE, name_index, length, constant_pool); + this.max_stack = max_stack; + this.max_locals = max_locals; + setCode(code); + setExceptionTable(exception_table); + setAttributes(attributes); // Overwrites length! + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitCode(this); + } + + + /** + * Dump code attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException */ - exception_table_length = file.readUnsignedShort(); - exception_table = new CodeException[exception_table_length]; + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + file.writeShort(max_stack); + file.writeShort(max_locals); + file.writeInt(code_length); + file.write(code, 0, code_length); + file.writeShort(exception_table_length); + for (int i = 0; i < exception_table_length; i++) { + exception_table[i].dump(file); + } + file.writeShort(attributes_count); + for (int i = 0; i < attributes_count; i++) { + attributes[i].dump(file); + } + } - for(int i=0; i < exception_table_length; i++) - exception_table[i] = new CodeException(file); - /* Read all attributes, currently `LineNumberTable' and - * `LocalVariableTable' + /** + * @return Collection of code attributes. + * @see Attribute */ - attributes_count = file.readUnsignedShort(); - attributes = new Attribute[attributes_count]; - for(int i=0; i < attributes_count; i++) - attributes[i] = Attribute.readAttribute(file, constant_pool); - - /* Adjust length, because of setAttributes in this(), s.b. length - * is incorrect, because it didn't take the internal attributes - * into account yet! Very subtle bug, fixed in 3.1.1. + public final Attribute[] getAttributes() { + return attributes; + } + + + /** + * @return LineNumberTable of Code, if it has one */ - this.length = length; - } - - /** - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param max_stack Maximum size of stack - * @param max_locals Number of local variables - * @param code Actual byte code - * @param exception_table Table of handled exceptions - * @param attributes Attributes of code: LineNumber or LocalVariable - * @param constant_pool Array of constants - */ - public Code(int name_index, int length, - int max_stack, int max_locals, - byte[] code, - CodeException[] exception_table, - Attribute[] attributes, - ConstantPool constant_pool) - { - super(Constants.ATTR_CODE, name_index, length, constant_pool); - - this.max_stack = max_stack; - this.max_locals = max_locals; - - setCode(code); - setExceptionTable(exception_table); - setAttributes(attributes); // Overwrites length! - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitCode(this); - } - - /** - * Dump code attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - - file.writeShort(max_stack); - file.writeShort(max_locals); - file.writeInt(code_length); - file.write(code, 0, code_length); - - file.writeShort(exception_table_length); - for(int i=0; i < exception_table_length; i++) - exception_table[i].dump(file); - - file.writeShort(attributes_count); - for(int i=0; i < attributes_count; i++) - attributes[i].dump(file); - } - - /** - * @return Collection of code attributes. - * @see Attribute - */ - public final Attribute[] getAttributes() { return attributes; } - - /** - * @return LineNumberTable of Code, if it has one - */ - public LineNumberTable getLineNumberTable() { - for(int i=0; i < attributes_count; i++) - if(attributes[i] instanceof LineNumberTable) - return (LineNumberTable)attributes[i]; - - return null; - } - - /** - * @return LocalVariableTable of Code, if it has one - */ - public LocalVariableTable getLocalVariableTable() { - for(int i=0; i < attributes_count; i++) - if(attributes[i] instanceof LocalVariableTable) - return (LocalVariableTable)attributes[i]; - - return null; - } - - /** - * @return Actual byte code of the method. - */ - public final byte[] getCode() { return code; } - - /** - * @return Table of handled exceptions. - * @see CodeException - */ - public final CodeException[] getExceptionTable() { return exception_table; } - - /** - * @return Number of local variables. - */ - public final int getMaxLocals() { return max_locals; } - - /** - * @return Maximum size of stack used by this method. - */ - - public final int getMaxStack() { return max_stack; } - - /** - * @return the internal length of this code attribute (minus the first 6 bytes) - * and excluding all its attributes - */ - private final int getInternalLength() { - return 2 /*max_stack*/ + 2 /*max_locals*/ + 4 /*code length*/ - + code_length /*byte-code*/ - + 2 /*exception-table length*/ - + 8 * exception_table_length /* exception table */ - + 2 /* attributes count */; - } - - /** - * @return the full size of this code attribute, minus its first 6 bytes, - * including the size of all its contained attributes - */ - private final int calculateLength() { - int len = 0; - - for(int i=0; i < attributes_count; i++) - len += attributes[i].length + 6 /*attribute header size*/; - - return len + getInternalLength(); - } - - /** - * @param attributes the attributes to set for this Code - */ - public final void setAttributes(Attribute[] attributes) { - this.attributes = attributes; - attributes_count = (attributes == null)? 0 : attributes.length; - length = calculateLength(); // Adjust length - } - - /** - * @param code byte code - */ - public final void setCode(byte[] code) { - this.code = code; - code_length = (code == null)? 0 : code.length; - } - - /** - * @param exception_table exception table - */ - public final void setExceptionTable(CodeException[] exception_table) { - this.exception_table = exception_table; - exception_table_length = (exception_table == null)? 0 : - exception_table.length; - } - - /** - * @param max_locals maximum number of local variables - */ - public final void setMaxLocals(int max_locals) { - this.max_locals = max_locals; - } - - /** - * @param max_stack maximum stack size - */ - public final void setMaxStack(int max_stack) { - this.max_stack = max_stack; - } - - /** - * @return String representation of code chunk. - */ - public final String toString(boolean verbose) { - StringBuffer buf; - - buf = new StringBuffer(100); - buf.append("Code(max_stack = ").append(max_stack) - .append(", max_locals = ").append(max_locals) - .append(", code_length = ").append(code_length).append(")\n") - .append(Utility.codeToString(code, constant_pool, 0, -1, verbose)); - - if(exception_table_length > 0) { - buf.append("\nException handler(s) = \n").append("From\tTo\tHandler\tType\n"); - - for(int i=0; i < exception_table_length; i++) - buf.append(exception_table[i].toString(constant_pool, verbose)).append("\n"); + public LineNumberTable getLineNumberTable() { + for (int i = 0; i < attributes_count; i++) { + if (attributes[i] instanceof LineNumberTable) { + return (LineNumberTable) attributes[i]; + } + } + return null; } - if(attributes_count > 0) { - buf.append("\nAttribute(s) = \n"); - for(int i=0; i < attributes_count; i++) - buf.append(attributes[i].toString()).append("\n"); + /** + * @return LocalVariableTable of Code, if it has one + */ + public LocalVariableTable getLocalVariableTable() { + for (int i = 0; i < attributes_count; i++) { + if (attributes[i] instanceof LocalVariableTable) { + return (LocalVariableTable) attributes[i]; + } + } + return null; } - return buf.toString(); - } - - /** - * @return String representation of code chunk. - */ - public final String toString() { - return toString(true); - } - - /** - * @return deep copy of this attribute - * - * @param _constant_pool the constant pool to duplicate - */ - public Attribute copy(ConstantPool _constant_pool) { - Code c = (Code) clone(); - - if (code != null) { - c.code = new byte[code.length]; - System.arraycopy(code, 0, c.code, 0, code.length); + + /** + * @return Actual byte code of the method. + */ + public final byte[] getCode() { + return code; } - c.constant_pool = _constant_pool; - - c.exception_table = new CodeException[exception_table_length]; - for(int i=0; i < exception_table_length; i++) - c.exception_table[i] = exception_table[i].copy(); - c.attributes = new Attribute[attributes_count]; - for(int i=0; i < attributes_count; i++) - c.attributes[i] = attributes[i].copy(_constant_pool); + /** + * @return Table of handled exceptions. + * @see CodeException + */ + public final CodeException[] getExceptionTable() { + return exception_table; + } + - return c; - } + /** + * @return Number of local variables. + */ + public final int getMaxLocals() { + return max_locals; + } + + + /** + * @return Maximum size of stack used by this method. + */ + public final int getMaxStack() { + return max_stack; + } + + + /** + * @return the internal length of this code attribute (minus the first 6 bytes) + * and excluding all its attributes + */ + private final int getInternalLength() { + return 2 /*max_stack*/+ 2 /*max_locals*/+ 4 /*code length*/ + + code_length /*byte-code*/ + + 2 /*exception-table length*/ + + 8 * exception_table_length /* exception table */ + + 2 /* attributes count */; + } + + + /** + * @return the full size of this code attribute, minus its first 6 bytes, + * including the size of all its contained attributes + */ + private final int calculateLength() { + int len = 0; + for (int i = 0; i < attributes_count; i++) { + len += attributes[i].length + 6 /*attribute header size*/; + } + return len + getInternalLength(); + } + + + /** + * @param attributes the attributes to set for this Code + */ + public final void setAttributes( Attribute[] attributes ) { + this.attributes = attributes; + attributes_count = (attributes == null) ? 0 : attributes.length; + length = calculateLength(); // Adjust length + } + + + /** + * @param code byte code + */ + public final void setCode( byte[] code ) { + this.code = code; + code_length = (code == null) ? 0 : code.length; + } + + + /** + * @param exception_table exception table + */ + public final void setExceptionTable( CodeException[] exception_table ) { + this.exception_table = exception_table; + exception_table_length = (exception_table == null) ? 0 : exception_table.length; + } + + + /** + * @param max_locals maximum number of local variables + */ + public final void setMaxLocals( int max_locals ) { + this.max_locals = max_locals; + } + + + /** + * @param max_stack maximum stack size + */ + public final void setMaxStack( int max_stack ) { + this.max_stack = max_stack; + } + + + /** + * @return String representation of code chunk. + */ + public final String toString( boolean verbose ) { + StringBuffer buf; + buf = new StringBuffer(100); + buf.append("Code(max_stack = ").append(max_stack).append(", max_locals = ").append( + max_locals).append(", code_length = ").append(code_length).append(")\n").append( + Utility.codeToString(code, constant_pool, 0, -1, verbose)); + if (exception_table_length > 0) { + buf.append("\nException handler(s) = \n").append("From\tTo\tHandler\tType\n"); + for (int i = 0; i < exception_table_length; i++) { + buf.append(exception_table[i].toString(constant_pool, verbose)).append("\n"); + } + } + if (attributes_count > 0) { + buf.append("\nAttribute(s) = \n"); + for (int i = 0; i < attributes_count; i++) { + buf.append(attributes[i].toString()).append("\n"); + } + } + return buf.toString(); + } + + + /** + * @return String representation of code chunk. + */ + public final String toString() { + return toString(true); + } + + + /** + * @return deep copy of this attribute + * + * @param _constant_pool the constant pool to duplicate + */ + public Attribute copy( ConstantPool _constant_pool ) { + Code c = (Code) clone(); + if (code != null) { + c.code = new byte[code.length]; + System.arraycopy(code, 0, c.code, 0, code.length); + } + c.constant_pool = _constant_pool; + c.exception_table = new CodeException[exception_table_length]; + for (int i = 0; i < exception_table_length; i++) { + c.exception_table[i] = exception_table[i].copy(); + } + c.attributes = new Attribute[attributes_count]; + for (int i = 0; i < attributes_count; i++) { + c.attributes[i] = attributes[i].copy(_constant_pool); + } + return c; + } } diff --git a/src/java/org/apache/bcel/classfile/CodeException.java b/src/java/org/apache/bcel/classfile/CodeException.java index 30fc6197..36d64678 100644 --- a/src/java/org/apache/bcel/classfile/CodeException.java +++ b/src/java/org/apache/bcel/classfile/CodeException.java @@ -16,7 +16,6 @@ */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -32,164 +31,184 @@ import org.apache.bcel.Constants; * @author M. Dahm * @see Code */ -public final class CodeException - implements Cloneable, Constants, Node, Serializable -{ - private int start_pc; // Range in the code the exception handler is - private int end_pc; // active. start_pc is inclusive, end_pc exclusive - private int handler_pc; /* Starting address of exception handler, i.e., - * an offset from start of code. - */ - private int catch_type; /* If this is zero the handler catches any - * exception, otherwise it points to the - * exception class which is to be caught. - */ - /** - * Initialize from another object. - */ - public CodeException(CodeException c) { - this(c.getStartPC(), c.getEndPC(), c.getHandlerPC(), c.getCatchType()); - } - - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - */ - CodeException(DataInputStream file) throws IOException - { - this(file.readUnsignedShort(), file.readUnsignedShort(), - file.readUnsignedShort(), file.readUnsignedShort()); - } - - /** - * @param start_pc Range in the code the exception handler is active, - * start_pc is inclusive while - * @param end_pc is exclusive - * @param handler_pc Starting address of exception handler, i.e., - * an offset from start of code. - * @param catch_type If zero the handler catches any - * exception, otherwise it points to the exception class which is - * to be caught. - */ - public CodeException(int start_pc, int end_pc, int handler_pc, - int catch_type) - { - this.start_pc = start_pc; - this.end_pc = end_pc; - this.handler_pc = handler_pc; - this.catch_type = catch_type; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitCodeException(this); - } - /** - * Dump code exception to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeShort(start_pc); - file.writeShort(end_pc); - file.writeShort(handler_pc); - file.writeShort(catch_type); - } - - /** - * @return 0, if the handler catches any exception, otherwise it points to - * the exception class which is to be caught. - */ - public final int getCatchType() { return catch_type; } - - /** - * @return Exclusive end index of the region where the handler is active. - */ - public final int getEndPC() { return end_pc; } - - /** - * @return Starting address of exception handler, relative to the code. - */ - public final int getHandlerPC() { return handler_pc; } - - /** - * @return Inclusive start index of the region where the handler is active. - */ - public final int getStartPC() { return start_pc; } - - /** - * @param catch_type the type of exception that is caught - */ - public final void setCatchType(int catch_type) { - this.catch_type = catch_type; - } - - /** - * @param end_pc end of handled block - */ - public final void setEndPC(int end_pc) { - this.end_pc = end_pc; - } - - /** - * @param handler_pc where the actual code is - */ - public final void setHandlerPC(int handler_pc) { - this.handler_pc = handler_pc; - } - - /** - * @param start_pc start of handled block - */ - public final void setStartPC(int start_pc) { - this.start_pc = start_pc; - } - - /** - * @return String representation. - */ - public final String toString() { - return "CodeException(start_pc = " + start_pc + - ", end_pc = " + end_pc + - ", handler_pc = " + handler_pc + ", catch_type = " + catch_type + ")"; - } - - /** - * @return String representation. - */ - public final String toString(ConstantPool cp, boolean verbose) { - String str; - - if(catch_type == 0) - str = "(0)"; - else - str = Utility.compactClassName(cp.getConstantString(catch_type, CONSTANT_Class), false) + - (verbose? "(" + catch_type + ")" : ""); - - return start_pc + "\t" + end_pc + "\t" + handler_pc + "\t" + str; - } - - public final String toString(ConstantPool cp) { - return toString(cp, true); - } - - /** - * @return deep copy of this object - */ - public CodeException copy() { - try { - return (CodeException)clone(); - } catch(CloneNotSupportedException e) {} - - return null; - } +public final class CodeException implements Cloneable, Constants, Node, Serializable { + + private int start_pc; // Range in the code the exception handler is + private int end_pc; // active. start_pc is inclusive, end_pc exclusive + private int handler_pc; /* Starting address of exception handler, i.e., + * an offset from start of code. + */ + private int catch_type; /* If this is zero the handler catches any + * exception, otherwise it points to the + * exception class which is to be caught. + */ + + + /** + * Initialize from another object. + */ + public CodeException(CodeException c) { + this(c.getStartPC(), c.getEndPC(), c.getHandlerPC(), c.getCatchType()); + } + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + CodeException(DataInputStream file) throws IOException { + this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), file + .readUnsignedShort()); + } + + + /** + * @param start_pc Range in the code the exception handler is active, + * start_pc is inclusive while + * @param end_pc is exclusive + * @param handler_pc Starting address of exception handler, i.e., + * an offset from start of code. + * @param catch_type If zero the handler catches any + * exception, otherwise it points to the exception class which is + * to be caught. + */ + public CodeException(int start_pc, int end_pc, int handler_pc, int catch_type) { + this.start_pc = start_pc; + this.end_pc = end_pc; + this.handler_pc = handler_pc; + this.catch_type = catch_type; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitCodeException(this); + } + + + /** + * Dump code exception to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeShort(start_pc); + file.writeShort(end_pc); + file.writeShort(handler_pc); + file.writeShort(catch_type); + } + + + /** + * @return 0, if the handler catches any exception, otherwise it points to + * the exception class which is to be caught. + */ + public final int getCatchType() { + return catch_type; + } + + + /** + * @return Exclusive end index of the region where the handler is active. + */ + public final int getEndPC() { + return end_pc; + } + + + /** + * @return Starting address of exception handler, relative to the code. + */ + public final int getHandlerPC() { + return handler_pc; + } + + + /** + * @return Inclusive start index of the region where the handler is active. + */ + public final int getStartPC() { + return start_pc; + } + + + /** + * @param catch_type the type of exception that is caught + */ + public final void setCatchType( int catch_type ) { + this.catch_type = catch_type; + } + + + /** + * @param end_pc end of handled block + */ + public final void setEndPC( int end_pc ) { + this.end_pc = end_pc; + } + + + /** + * @param handler_pc where the actual code is + */ + public final void setHandlerPC( int handler_pc ) { + this.handler_pc = handler_pc; + } + + + /** + * @param start_pc start of handled block + */ + public final void setStartPC( int start_pc ) { + this.start_pc = start_pc; + } + + + /** + * @return String representation. + */ + public final String toString() { + return "CodeException(start_pc = " + start_pc + ", end_pc = " + end_pc + ", handler_pc = " + + handler_pc + ", catch_type = " + catch_type + ")"; + } + + + /** + * @return String representation. + */ + public final String toString( ConstantPool cp, boolean verbose ) { + String str; + if (catch_type == 0) { + str = "(0)"; + } else { + str = Utility.compactClassName(cp.getConstantString(catch_type, CONSTANT_Class), false) + + (verbose ? "(" + catch_type + ")" : ""); + } + return start_pc + "\t" + end_pc + "\t" + handler_pc + "\t" + str; + } + + + public final String toString( ConstantPool cp ) { + return toString(cp, true); + } + + + /** + * @return deep copy of this object + */ + public CodeException copy() { + try { + return (CodeException) clone(); + } catch (CloneNotSupportedException e) { + } + return null; + } } diff --git a/src/java/org/apache/bcel/classfile/Constant.java b/src/java/org/apache/bcel/classfile/Constant.java index 4585ad8a..17b1db8d 100644 --- a/src/java/org/apache/bcel/classfile/Constant.java +++ b/src/java/org/apache/bcel/classfile/Constant.java @@ -32,133 +32,157 @@ import org.apache.bcel.util.BCELComparator; * @author M. Dahm */ public abstract class Constant implements Cloneable, Node, Serializable { - private static BCELComparator _cmp = new BCELComparator() { - public boolean equals(Object o1, Object o2) { - Constant THIS = (Constant)o1; - Constant THAT = (Constant)o2; - - return THIS.toString().equals(THAT.toString()); - } - - public int hashCode(Object o) { - Constant THIS = (Constant)o; - return THIS.toString().hashCode(); - } - }; - - /* In fact this tag is redundant since we can distinguish different - * `Constant' objects by their type, i.e., via `instanceof'. In some - * places we will use the tag for switch()es anyway. - * - * First, we want match the specification as closely as possible. Second we - * need the tag as an index to select the corresponding class name from the - * `CONSTANT_NAMES' array. - */ - protected byte tag; - - Constant(byte tag) { this.tag = tag; } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public abstract void accept(Visitor v); - - public abstract void dump(DataOutputStream file) throws IOException; - - /** - * @return Tag of constant, i.e., its type. No setTag() method to avoid - * confusion. - */ - public final byte getTag() { return tag; } - - /** - * @return String representation. - */ - public String toString() { - return Constants.CONSTANT_NAMES[tag] + "[" + tag + "]"; - } - - /** - * @return deep copy of this constant - */ - public Constant copy() { - try { - return (Constant)super.clone(); - } catch(CloneNotSupportedException e) {} - - return null; - } - - public Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - /** - * Read one constant from the given file, the type depends on a tag byte. - * - * @param file Input stream - * @return Constant object - */ - static final Constant readConstant(DataInputStream file) - throws IOException, ClassFormatException - { - byte b = file.readByte(); // Read tag byte - - switch(b) { - case Constants.CONSTANT_Class: return new ConstantClass(file); - case Constants.CONSTANT_Fieldref: return new ConstantFieldref(file); - case Constants.CONSTANT_Methodref: return new ConstantMethodref(file); - case Constants.CONSTANT_InterfaceMethodref: return new - ConstantInterfaceMethodref(file); - case Constants.CONSTANT_String: return new ConstantString(file); - case Constants.CONSTANT_Integer: return new ConstantInteger(file); - case Constants.CONSTANT_Float: return new ConstantFloat(file); - case Constants.CONSTANT_Long: return new ConstantLong(file); - case Constants.CONSTANT_Double: return new ConstantDouble(file); - case Constants.CONSTANT_NameAndType: return new ConstantNameAndType(file); - case Constants.CONSTANT_Utf8: return new ConstantUtf8(file); - default: - throw new ClassFormatException("Invalid byte tag in constant pool: " + b); + + private static BCELComparator _cmp = new BCELComparator() { + + public boolean equals( Object o1, Object o2 ) { + Constant THIS = (Constant) o1; + Constant THAT = (Constant) o2; + return THIS.toString().equals(THAT.toString()); + } + + + public int hashCode( Object o ) { + Constant THIS = (Constant) o; + return THIS.toString().hashCode(); + } + }; + /* In fact this tag is redundant since we can distinguish different + * `Constant' objects by their type, i.e., via `instanceof'. In some + * places we will use the tag for switch()es anyway. + * + * First, we want match the specification as closely as possible. Second we + * need the tag as an index to select the corresponding class name from the + * `CONSTANT_NAMES' array. + */ + protected byte tag; + + + Constant(byte tag) { + this.tag = tag; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public abstract void accept( Visitor v ); + + + public abstract void dump( DataOutputStream file ) throws IOException; + + + /** + * @return Tag of constant, i.e., its type. No setTag() method to avoid + * confusion. + */ + public final byte getTag() { + return tag; + } + + + /** + * @return String representation. + */ + public String toString() { + return Constants.CONSTANT_NAMES[tag] + "[" + tag + "]"; + } + + + /** + * @return deep copy of this constant + */ + public Constant copy() { + try { + return (Constant) super.clone(); + } catch (CloneNotSupportedException e) { + } + return null; + } + + + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + + + /** + * Read one constant from the given file, the type depends on a tag byte. + * + * @param file Input stream + * @return Constant object + */ + static final Constant readConstant( DataInputStream file ) throws IOException, + ClassFormatException { + byte b = file.readByte(); // Read tag byte + switch (b) { + case Constants.CONSTANT_Class: + return new ConstantClass(file); + case Constants.CONSTANT_Fieldref: + return new ConstantFieldref(file); + case Constants.CONSTANT_Methodref: + return new ConstantMethodref(file); + case Constants.CONSTANT_InterfaceMethodref: + return new ConstantInterfaceMethodref(file); + case Constants.CONSTANT_String: + return new ConstantString(file); + case Constants.CONSTANT_Integer: + return new ConstantInteger(file); + case Constants.CONSTANT_Float: + return new ConstantFloat(file); + case Constants.CONSTANT_Long: + return new ConstantLong(file); + case Constants.CONSTANT_Double: + return new ConstantDouble(file); + case Constants.CONSTANT_NameAndType: + return new ConstantNameAndType(file); + case Constants.CONSTANT_Utf8: + return new ConstantUtf8(file); + default: + throw new ClassFormatException("Invalid byte tag in constant pool: " + b); + } + } + + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; + } + + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator( BCELComparator comparator ) { + _cmp = comparator; + } + + + /** + * Return value as defined by given BCELComparator strategy. + * By default two Constant objects are said to be equal when + * the result of toString() is equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals( Object obj ) { + return _cmp.equals(this, obj); + } + + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the result of toString(). + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); } - } - - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default two Constant objects are said to be equal when - * the result of toString() is equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default return the hashcode of the result of toString(). - * - * @see java.lang.Object#hashCode() - */ - public int hashCode() { - return _cmp.hashCode(this); - } } diff --git a/src/java/org/apache/bcel/classfile/ConstantCP.java b/src/java/org/apache/bcel/classfile/ConstantCP.java index 0555f3da..b3ca86cb 100644 --- a/src/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/java/org/apache/bcel/classfile/ConstantCP.java @@ -31,89 +31,101 @@ import org.apache.bcel.Constants; * @see ConstantInterfaceMethodref */ public abstract class ConstantCP extends Constant { - /** References to the constants containing the class and the field signature - */ - protected int class_index, name_and_type_index; - - /** - * Initialize from another object. - */ - public ConstantCP(ConstantCP c) { - this(c.getTag(), c.getClassIndex(), c.getNameAndTypeIndex()); - } - - /** - * Initialize instance from file data. - * - * @param tag Constant type tag - * @param file Input stream - * @throws IOException - */ - ConstantCP(byte tag, DataInputStream file) throws IOException - { - this(tag, file.readUnsignedShort(), file.readUnsignedShort()); - } - - /** - * @param class_index Reference to the class containing the field - * @param name_and_type_index and the field signature - */ - protected ConstantCP(byte tag, int class_index, - int name_and_type_index) { - super(tag); - this.class_index = class_index; - this.name_and_type_index = name_and_type_index; - } - - /** - * Dump constant field reference to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeByte(tag); - file.writeShort(class_index); - file.writeShort(name_and_type_index); - } - - /** - * @return Reference (index) to class this field or method belongs to. - */ - public final int getClassIndex() { return class_index; } - - /** - * @return Reference (index) to signature of the field. - */ - public final int getNameAndTypeIndex() { return name_and_type_index; } - - /** - * @param class_index points to Constant_class - */ - public final void setClassIndex(int class_index) { - this.class_index = class_index; - } - - /** - * @return Class this field belongs to. - */ - public String getClass(ConstantPool cp) { - return cp.constantToString(class_index, Constants.CONSTANT_Class); - } - - /** - * @param name_and_type_index points to Constant_NameAndType - */ - public final void setNameAndTypeIndex(int name_and_type_index) { - this.name_and_type_index = name_and_type_index; - } - - /** - * @return String representation. - */ - public final String toString() { - return super.toString() + "(class_index = " + class_index + - ", name_and_type_index = " + name_and_type_index + ")"; - } + + /** References to the constants containing the class and the field signature + */ + protected int class_index, name_and_type_index; + + + /** + * Initialize from another object. + */ + public ConstantCP(ConstantCP c) { + this(c.getTag(), c.getClassIndex(), c.getNameAndTypeIndex()); + } + + + /** + * Initialize instance from file data. + * + * @param tag Constant type tag + * @param file Input stream + * @throws IOException + */ + ConstantCP(byte tag, DataInputStream file) throws IOException { + this(tag, file.readUnsignedShort(), file.readUnsignedShort()); + } + + + /** + * @param class_index Reference to the class containing the field + * @param name_and_type_index and the field signature + */ + protected ConstantCP(byte tag, int class_index, int name_and_type_index) { + super(tag); + this.class_index = class_index; + this.name_and_type_index = name_and_type_index; + } + + + /** + * Dump constant field reference to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(tag); + file.writeShort(class_index); + file.writeShort(name_and_type_index); + } + + + /** + * @return Reference (index) to class this field or method belongs to. + */ + public final int getClassIndex() { + return class_index; + } + + + /** + * @return Reference (index) to signature of the field. + */ + public final int getNameAndTypeIndex() { + return name_and_type_index; + } + + + /** + * @param class_index points to Constant_class + */ + public final void setClassIndex( int class_index ) { + this.class_index = class_index; + } + + + /** + * @return Class this field belongs to. + */ + public String getClass( ConstantPool cp ) { + return cp.constantToString(class_index, Constants.CONSTANT_Class); + } + + + /** + * @param name_and_type_index points to Constant_NameAndType + */ + public final void setNameAndTypeIndex( int name_and_type_index ) { + this.name_and_type_index = name_and_type_index; + } + + + /** + * @return String representation. + */ + public final String toString() { + return super.toString() + "(class_index = " + class_index + ", name_and_type_index = " + + name_and_type_index + ")"; + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantClass.java b/src/java/org/apache/bcel/classfile/ConstantClass.java index 7a944135..f0e45e0e 100644 --- a/src/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/java/org/apache/bcel/classfile/ConstantClass.java @@ -31,88 +31,98 @@ import org.apache.bcel.Constants; * @see Constant */ public final class ConstantClass extends Constant implements ConstantObject { - private int name_index; // Identical to ConstantString except for the name - - /** - * Initialize from another object. - */ - public ConstantClass(ConstantClass c) { - this(c.getNameIndex()); - } - - /** - * Initialize instance from file data. - * - * @param file Input stream - * @throws IOException - */ - ConstantClass(DataInputStream file) throws IOException - { - this(file.readUnsignedShort()); - } - - /** - * @param name_index Name index in constant pool. Should refer to a - * ConstantUtf8. - */ - public ConstantClass(int name_index) { - super(Constants.CONSTANT_Class); - this.name_index = name_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantClass(this); - } - - /** - * Dump constant class to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeByte(tag); - file.writeShort(name_index); - } - - /** - * @return Name index in constant pool of class name. - */ - public final int getNameIndex() { return name_index; } - - /** - * @param name_index the name index in the constant pool of this Constant Class - */ - public final void setNameIndex(int name_index) { - this.name_index = name_index; - } - - - /** @return String object - */ - public Object getConstantValue(ConstantPool cp) { - Constant c = cp.getConstant(name_index, Constants.CONSTANT_Utf8); - return ((ConstantUtf8)c).getBytes(); - } - - /** @return dereferenced string - */ - public String getBytes(ConstantPool cp) { - return (String)getConstantValue(cp); - } - - /** - * @return String representation. - */ - public final String toString() { - return super.toString() + "(name_index = " + name_index + ")"; - } + + private int name_index; // Identical to ConstantString except for the name + + + /** + * Initialize from another object. + */ + public ConstantClass(ConstantClass c) { + this(c.getNameIndex()); + } + + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throws IOException + */ + ConstantClass(DataInputStream file) throws IOException { + this(file.readUnsignedShort()); + } + + + /** + * @param name_index Name index in constant pool. Should refer to a + * ConstantUtf8. + */ + public ConstantClass(int name_index) { + super(Constants.CONSTANT_Class); + this.name_index = name_index; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantClass(this); + } + + + /** + * Dump constant class to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(tag); + file.writeShort(name_index); + } + + + /** + * @return Name index in constant pool of class name. + */ + public final int getNameIndex() { + return name_index; + } + + + /** + * @param name_index the name index in the constant pool of this Constant Class + */ + public final void setNameIndex( int name_index ) { + this.name_index = name_index; + } + + + /** @return String object + */ + public Object getConstantValue( ConstantPool cp ) { + Constant c = cp.getConstant(name_index, Constants.CONSTANT_Utf8); + return ((ConstantUtf8) c).getBytes(); + } + + + /** @return dereferenced string + */ + public String getBytes( ConstantPool cp ) { + return (String) getConstantValue(cp); + } + + + /** + * @return String representation. + */ + public final String toString() { + return super.toString() + "(name_index = " + name_index + ")"; + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantDouble.java b/src/java/org/apache/bcel/classfile/ConstantDouble.java index fd372a7f..b344f267 100644 --- a/src/java/org/apache/bcel/classfile/ConstantDouble.java +++ b/src/java/org/apache/bcel/classfile/ConstantDouble.java @@ -31,76 +31,89 @@ import org.apache.bcel.Constants; * @see Constant */ public final class ConstantDouble extends Constant implements ConstantObject { - private double bytes; - - /** - * @param bytes Data - */ - public ConstantDouble(double bytes) { - super(Constants.CONSTANT_Double); - this.bytes = bytes; - } - - /** - * Initialize from another object. - */ - public ConstantDouble(ConstantDouble c) { - this(c.getBytes()); - } - - /** - * Initialize instance from file data. - * - * @param file Input stream - * @throws IOException - */ - ConstantDouble(DataInputStream file) throws IOException - { - this(file.readDouble()); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantDouble(this); - } - /** - * Dump constant double to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeByte(tag); - file.writeDouble(bytes); - } - /** - * @return data, i.e., 8 bytes. - */ - public final double getBytes() { return bytes; } - /** - * @param bytes the raw bytes that represent the double value - */ - public final void setBytes(double bytes) { - this.bytes = bytes; - } - /** - * @return String representation. - */ - public final String toString() - { - return super.toString() + "(bytes = " + bytes + ")"; - } - - /** @return Double object - */ - public Object getConstantValue(ConstantPool cp) { - return new Double(bytes); - } + + private double bytes; + + + /** + * @param bytes Data + */ + public ConstantDouble(double bytes) { + super(Constants.CONSTANT_Double); + this.bytes = bytes; + } + + + /** + * Initialize from another object. + */ + public ConstantDouble(ConstantDouble c) { + this(c.getBytes()); + } + + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throws IOException + */ + ConstantDouble(DataInputStream file) throws IOException { + this(file.readDouble()); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantDouble(this); + } + + + /** + * Dump constant double to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(tag); + file.writeDouble(bytes); + } + + + /** + * @return data, i.e., 8 bytes. + */ + public final double getBytes() { + return bytes; + } + + + /** + * @param bytes the raw bytes that represent the double value + */ + public final void setBytes( double bytes ) { + this.bytes = bytes; + } + + + /** + * @return String representation. + */ + public final String toString() { + return super.toString() + "(bytes = " + bytes + ")"; + } + + + /** @return Double object + */ + public Object getConstantValue( ConstantPool cp ) { + return new Double(bytes); + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/java/org/apache/bcel/classfile/ConstantFieldref.java index 05982bdb..d9b68882 100644 --- a/src/java/org/apache/bcel/classfile/ConstantFieldref.java +++ b/src/java/org/apache/bcel/classfile/ConstantFieldref.java @@ -27,41 +27,43 @@ import org.apache.bcel.Constants; * @author M. Dahm */ public final class ConstantFieldref extends ConstantCP { - /** - * Initialize from another object. - */ - public ConstantFieldref(ConstantFieldref c) { - super(Constants.CONSTANT_Fieldref, c.getClassIndex(), c.getNameAndTypeIndex()); - } - /** - * Initialize instance from file data. - * - * @param file input stream - * @throws IOException - */ - ConstantFieldref(DataInputStream file) throws IOException - { - super(Constants.CONSTANT_Fieldref, file); - } + /** + * Initialize from another object. + */ + public ConstantFieldref(ConstantFieldref c) { + super(Constants.CONSTANT_Fieldref, c.getClassIndex(), c.getNameAndTypeIndex()); + } - /** - * @param class_index Reference to the class containing the Field - * @param name_and_type_index and the Field signature - */ - public ConstantFieldref(int class_index, - int name_and_type_index) { - super(Constants.CONSTANT_Fieldref, class_index, name_and_type_index); - } - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of Fields, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantFieldref(this); - } + /** + * Initialize instance from file data. + * + * @param file input stream + * @throws IOException + */ + ConstantFieldref(DataInputStream file) throws IOException { + super(Constants.CONSTANT_Fieldref, file); + } + + + /** + * @param class_index Reference to the class containing the Field + * @param name_and_type_index and the Field signature + */ + public ConstantFieldref(int class_index, int name_and_type_index) { + super(Constants.CONSTANT_Fieldref, class_index, name_and_type_index); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of Fields, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantFieldref(this); + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantFloat.java b/src/java/org/apache/bcel/classfile/ConstantFloat.java index 779e7b9c..c9426ef1 100644 --- a/src/java/org/apache/bcel/classfile/ConstantFloat.java +++ b/src/java/org/apache/bcel/classfile/ConstantFloat.java @@ -31,75 +31,90 @@ import org.apache.bcel.Constants; * @see Constant */ public final class ConstantFloat extends Constant implements ConstantObject { - private float bytes; - - /** - * @param bytes Data - */ - public ConstantFloat(float bytes) - { - super(Constants.CONSTANT_Float); - this.bytes = bytes; - } - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public ConstantFloat(ConstantFloat c) { - this(c.getBytes()); - } - /** - * Initialize instance from file data. - * - * @param file Input stream - * @throws IOException - */ - ConstantFloat(DataInputStream file) throws IOException - { - this(file.readFloat()); - } - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantFloat(this); - } - /** - * Dump constant float to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeByte(tag); - file.writeFloat(bytes); - } - /** - * @return data, i.e., 4 bytes. - */ - public final float getBytes() { return bytes; } - /** - * @param bytes the raw bytes that represent this float - */ - public final void setBytes(float bytes) { - this.bytes = bytes; - } - - /** - * @return String representation. - */ - public final String toString() { - return super.toString() + "(bytes = " + bytes + ")"; - } - - /** @return Float object - */ - public Object getConstantValue(ConstantPool cp) { - return new Float(bytes); - } + + private float bytes; + + + /** + * @param bytes Data + */ + public ConstantFloat(float bytes) { + super(Constants.CONSTANT_Float); + this.bytes = bytes; + } + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public ConstantFloat(ConstantFloat c) { + this(c.getBytes()); + } + + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throws IOException + */ + ConstantFloat(DataInputStream file) throws IOException { + this(file.readFloat()); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantFloat(this); + } + + + /** + * Dump constant float to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(tag); + file.writeFloat(bytes); + } + + + /** + * @return data, i.e., 4 bytes. + */ + public final float getBytes() { + return bytes; + } + + + /** + * @param bytes the raw bytes that represent this float + */ + public final void setBytes( float bytes ) { + this.bytes = bytes; + } + + + /** + * @return String representation. + */ + public final String toString() { + return super.toString() + "(bytes = " + bytes + ")"; + } + + + /** @return Float object + */ + public Object getConstantValue( ConstantPool cp ) { + return new Float(bytes); + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantInteger.java b/src/java/org/apache/bcel/classfile/ConstantInteger.java index 6b9dd515..76a6e862 100644 --- a/src/java/org/apache/bcel/classfile/ConstantInteger.java +++ b/src/java/org/apache/bcel/classfile/ConstantInteger.java @@ -31,80 +31,89 @@ import org.apache.bcel.Constants; * @see Constant */ public final class ConstantInteger extends Constant implements ConstantObject { - private int bytes; - - /** - * @param bytes Data - */ - public ConstantInteger(int bytes) - { - super(Constants.CONSTANT_Integer); - this.bytes = bytes; - } - - /** - * Initialize from another object. - */ - public ConstantInteger(ConstantInteger c) { - this(c.getBytes()); - } - - /** - * Initialize instance from file data. - * - * @param file Input stream - * @throws IOException - */ - ConstantInteger(DataInputStream file) throws IOException - { - this(file.readInt()); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantInteger(this); - } - - /** - * Dump constant integer to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeByte(tag); - file.writeInt(bytes); - } - - /** - * @return data, i.e., 4 bytes. - */ - public final int getBytes() { return bytes; } - - /** - * @param bytes the raw bytes that represent this integer - */ - public final void setBytes(int bytes) { - this.bytes = bytes; - } - - /** - * @return String representation. - */ - public final String toString() { - return super.toString() + "(bytes = " + bytes + ")"; - } - - /** @return Integer object - */ - public Object getConstantValue(ConstantPool cp) { - return new Integer(bytes); - } + + private int bytes; + + + /** + * @param bytes Data + */ + public ConstantInteger(int bytes) { + super(Constants.CONSTANT_Integer); + this.bytes = bytes; + } + + + /** + * Initialize from another object. + */ + public ConstantInteger(ConstantInteger c) { + this(c.getBytes()); + } + + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throws IOException + */ + ConstantInteger(DataInputStream file) throws IOException { + this(file.readInt()); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantInteger(this); + } + + + /** + * Dump constant integer to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(tag); + file.writeInt(bytes); + } + + + /** + * @return data, i.e., 4 bytes. + */ + public final int getBytes() { + return bytes; + } + + + /** + * @param bytes the raw bytes that represent this integer + */ + public final void setBytes( int bytes ) { + this.bytes = bytes; + } + + + /** + * @return String representation. + */ + public final String toString() { + return super.toString() + "(bytes = " + bytes + ")"; + } + + + /** @return Integer object + */ + public Object getConstantValue( ConstantPool cp ) { + return new Integer(bytes); + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java index 6317054b..57d11c50 100644 --- a/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java +++ b/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java @@ -27,41 +27,43 @@ import org.apache.bcel.Constants; * @author M. Dahm */ public final class ConstantInterfaceMethodref extends ConstantCP { - /** - * Initialize from another object. - */ - public ConstantInterfaceMethodref(ConstantInterfaceMethodref c) { - super(Constants.CONSTANT_InterfaceMethodref, c.getClassIndex(), c.getNameAndTypeIndex()); - } - /** - * Initialize instance from file data. - * - * @param file input stream - * @throws IOException - */ - ConstantInterfaceMethodref(DataInputStream file) throws IOException - { - super(Constants.CONSTANT_InterfaceMethodref, file); - } + /** + * Initialize from another object. + */ + public ConstantInterfaceMethodref(ConstantInterfaceMethodref c) { + super(Constants.CONSTANT_InterfaceMethodref, c.getClassIndex(), c.getNameAndTypeIndex()); + } - /** - * @param class_index Reference to the class containing the method - * @param name_and_type_index and the method signature - */ - public ConstantInterfaceMethodref(int class_index, - int name_and_type_index) { - super(Constants.CONSTANT_InterfaceMethodref, class_index, name_and_type_index); - } - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantInterfaceMethodref(this); - } + /** + * Initialize instance from file data. + * + * @param file input stream + * @throws IOException + */ + ConstantInterfaceMethodref(DataInputStream file) throws IOException { + super(Constants.CONSTANT_InterfaceMethodref, file); + } + + + /** + * @param class_index Reference to the class containing the method + * @param name_and_type_index and the method signature + */ + public ConstantInterfaceMethodref(int class_index, int name_and_type_index) { + super(Constants.CONSTANT_InterfaceMethodref, class_index, name_and_type_index); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantInterfaceMethodref(this); + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantLong.java b/src/java/org/apache/bcel/classfile/ConstantLong.java index caf1195c..d6997935 100644 --- a/src/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/java/org/apache/bcel/classfile/ConstantLong.java @@ -31,73 +31,89 @@ import org.apache.bcel.Constants; * @see Constant */ public final class ConstantLong extends Constant implements ConstantObject { - private long bytes; - - /** - * @param bytes Data - */ - public ConstantLong(long bytes) - { - super(Constants.CONSTANT_Long); - this.bytes = bytes; - } - /** - * Initialize from another object. - */ - public ConstantLong(ConstantLong c) { - this(c.getBytes()); - } - /** - * Initialize instance from file data. - * - * @param file Input stream - * @throws IOException - */ - ConstantLong(DataInputStream file) throws IOException - { - this(file.readLong()); - } - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantLong(this); - } - /** - * Dump constant long to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeByte(tag); - file.writeLong(bytes); - } - /** - * @return data, i.e., 8 bytes. - */ - public final long getBytes() { return bytes; } - /** - * @param bytes thr raw bytes that represent this long - */ - public final void setBytes(long bytes) { - this.bytes = bytes; - } - /** - * @return String representation. - */ - public final String toString() { - return super.toString() + "(bytes = " + bytes + ")"; - } - - /** @return Long object - */ - public Object getConstantValue(ConstantPool cp) { - return new Long(bytes); - } + + private long bytes; + + + /** + * @param bytes Data + */ + public ConstantLong(long bytes) { + super(Constants.CONSTANT_Long); + this.bytes = bytes; + } + + + /** + * Initialize from another object. + */ + public ConstantLong(ConstantLong c) { + this(c.getBytes()); + } + + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throws IOException + */ + ConstantLong(DataInputStream file) throws IOException { + this(file.readLong()); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantLong(this); + } + + + /** + * Dump constant long to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(tag); + file.writeLong(bytes); + } + + + /** + * @return data, i.e., 8 bytes. + */ + public final long getBytes() { + return bytes; + } + + + /** + * @param bytes thr raw bytes that represent this long + */ + public final void setBytes( long bytes ) { + this.bytes = bytes; + } + + + /** + * @return String representation. + */ + public final String toString() { + return super.toString() + "(bytes = " + bytes + ")"; + } + + + /** @return Long object + */ + public Object getConstantValue( ConstantPool cp ) { + return new Long(bytes); + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/java/org/apache/bcel/classfile/ConstantMethodref.java index b8e901ef..e9ce4eb9 100644 --- a/src/java/org/apache/bcel/classfile/ConstantMethodref.java +++ b/src/java/org/apache/bcel/classfile/ConstantMethodref.java @@ -27,41 +27,43 @@ import org.apache.bcel.Constants; * @author M. Dahm */ public final class ConstantMethodref extends ConstantCP { - /** - * Initialize from another object. - */ - public ConstantMethodref(ConstantMethodref c) { - super(Constants.CONSTANT_Methodref, c.getClassIndex(), c.getNameAndTypeIndex()); - } - /** - * Initialize instance from file data. - * - * @param file input stream - * @throws IOException - */ - ConstantMethodref(DataInputStream file) throws IOException - { - super(Constants.CONSTANT_Methodref, file); - } + /** + * Initialize from another object. + */ + public ConstantMethodref(ConstantMethodref c) { + super(Constants.CONSTANT_Methodref, c.getClassIndex(), c.getNameAndTypeIndex()); + } - /** - * @param class_index Reference to the class containing the method - * @param name_and_type_index and the method signature - */ - public ConstantMethodref(int class_index, - int name_and_type_index) { - super(Constants.CONSTANT_Methodref, class_index, name_and_type_index); - } - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantMethodref(this); - } + /** + * Initialize instance from file data. + * + * @param file input stream + * @throws IOException + */ + ConstantMethodref(DataInputStream file) throws IOException { + super(Constants.CONSTANT_Methodref, file); + } + + + /** + * @param class_index Reference to the class containing the method + * @param name_and_type_index and the method signature + */ + public ConstantMethodref(int class_index, int name_and_type_index) { + super(Constants.CONSTANT_Methodref, class_index, name_and_type_index); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantMethodref(this); + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/java/org/apache/bcel/classfile/ConstantNameAndType.java index 164f95af..18f42e79 100644 --- a/src/java/org/apache/bcel/classfile/ConstantNameAndType.java +++ b/src/java/org/apache/bcel/classfile/ConstantNameAndType.java @@ -32,104 +32,117 @@ import org.apache.bcel.Constants; * @see Constant */ public final class ConstantNameAndType extends Constant { - private int name_index; // Name of field/method - private int signature_index; // and its signature. - - /** - * Initialize from another object. - */ - public ConstantNameAndType(ConstantNameAndType c) { - this(c.getNameIndex(), c.getSignatureIndex()); - } - - /** - * Initialize instance from file data. - * - * @param file Input stream - * @throws IOException - */ - ConstantNameAndType(DataInputStream file) throws IOException - { - this(file.readUnsignedShort(), file.readUnsignedShort()); - } - - /** - * @param name_index Name of field/method - * @param signature_index and its signature - */ - public ConstantNameAndType(int name_index, - int signature_index) - { - super(Constants.CONSTANT_NameAndType); - this.name_index = name_index; - this.signature_index = signature_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantNameAndType(this); - } - - /** - * Dump name and signature index to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeByte(tag); - file.writeShort(name_index); - file.writeShort(signature_index); - } - - /** - * @return Name index in constant pool of field/method name. - */ - public final int getNameIndex() { return name_index; } - - /** @return name - */ - public final String getName(ConstantPool cp) { - return cp.constantToString(getNameIndex(), Constants.CONSTANT_Utf8); - } - - /** - * @return Index in constant pool of field/method signature. - */ - public final int getSignatureIndex() { return signature_index; } - - /** @return signature - */ - public final String getSignature(ConstantPool cp) { - return cp.constantToString(getSignatureIndex(), Constants.CONSTANT_Utf8); - } - - /** - * @param name_index the name index of this constant - */ - public final void setNameIndex(int name_index) { - this.name_index = name_index; - } - - /** - * @param signature_index the signature index in the constant pool of this type - */ - public final void setSignatureIndex(int signature_index) { - this.signature_index = signature_index; - } - - /** - * @return String representation - */ - public final String toString() { - return super.toString() + "(name_index = " + name_index + - ", signature_index = " + signature_index + ")"; - } + + private int name_index; // Name of field/method + private int signature_index; // and its signature. + + + /** + * Initialize from another object. + */ + public ConstantNameAndType(ConstantNameAndType c) { + this(c.getNameIndex(), c.getSignatureIndex()); + } + + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throws IOException + */ + ConstantNameAndType(DataInputStream file) throws IOException { + this(file.readUnsignedShort(), file.readUnsignedShort()); + } + + + /** + * @param name_index Name of field/method + * @param signature_index and its signature + */ + public ConstantNameAndType(int name_index, int signature_index) { + super(Constants.CONSTANT_NameAndType); + this.name_index = name_index; + this.signature_index = signature_index; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantNameAndType(this); + } + + + /** + * Dump name and signature index to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(tag); + file.writeShort(name_index); + file.writeShort(signature_index); + } + + + /** + * @return Name index in constant pool of field/method name. + */ + public final int getNameIndex() { + return name_index; + } + + + /** @return name + */ + public final String getName( ConstantPool cp ) { + return cp.constantToString(getNameIndex(), Constants.CONSTANT_Utf8); + } + + + /** + * @return Index in constant pool of field/method signature. + */ + public final int getSignatureIndex() { + return signature_index; + } + + + /** @return signature + */ + public final String getSignature( ConstantPool cp ) { + return cp.constantToString(getSignatureIndex(), Constants.CONSTANT_Utf8); + } + + + /** + * @param name_index the name index of this constant + */ + public final void setNameIndex( int name_index ) { + this.name_index = name_index; + } + + + /** + * @param signature_index the signature index in the constant pool of this type + */ + public final void setSignatureIndex( int signature_index ) { + this.signature_index = signature_index; + } + + + /** + * @return String representation + */ + public final String toString() { + return super.toString() + "(name_index = " + name_index + ", signature_index = " + + signature_index + ")"; + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantObject.java b/src/java/org/apache/bcel/classfile/ConstantObject.java index b4975348..1465bb67 100644 --- a/src/java/org/apache/bcel/classfile/ConstantObject.java +++ b/src/java/org/apache/bcel/classfile/ConstantObject.java @@ -25,7 +25,8 @@ package org.apache.bcel.classfile; * @see Constant */ public interface ConstantObject { - /** @return object representing the constant, e.g., Long for ConstantLong - */ - public abstract Object getConstantValue(ConstantPool cp); + + /** @return object representing the constant, e.g., Long for ConstantLong + */ + public abstract Object getConstantValue( ConstantPool cp ); } diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/java/org/apache/bcel/classfile/ConstantPool.java index 3e8531ec..8c666cf9 100644 --- a/src/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/java/org/apache/bcel/classfile/ConstantPool.java @@ -36,302 +36,318 @@ import org.apache.bcel.Constants; * @author M. Dahm */ public class ConstantPool implements Cloneable, Node, Serializable { - private int constant_pool_count; - private Constant[] constant_pool; - - /** - * @param constant_pool Array of constants - */ - public ConstantPool(Constant[] constant_pool) - { - setConstantPool(constant_pool); - } - - /** - * Read constants from given file stream. - * - * @param file Input stream - * @throws IOException - * @throws ClassFormatException - */ - ConstantPool(DataInputStream file) throws IOException, ClassFormatException - { - byte tag; - - constant_pool_count = file.readUnsignedShort(); - constant_pool = new Constant[constant_pool_count]; - - /* constant_pool[0] is unused by the compiler and may be used freely - * by the implementation. + + private int constant_pool_count; + private Constant[] constant_pool; + + + /** + * @param constant_pool Array of constants + */ + public ConstantPool(Constant[] constant_pool) { + setConstantPool(constant_pool); + } + + + /** + * Read constants from given file stream. + * + * @param file Input stream + * @throws IOException + * @throws ClassFormatException + */ + ConstantPool(DataInputStream file) throws IOException, ClassFormatException { + byte tag; + constant_pool_count = file.readUnsignedShort(); + constant_pool = new Constant[constant_pool_count]; + /* constant_pool[0] is unused by the compiler and may be used freely + * by the implementation. + */ + for (int i = 1; i < constant_pool_count; i++) { + constant_pool[i] = Constant.readConstant(file); + /* Quote from the JVM specification: + * "All eight byte constants take up two spots in the constant pool. + * If this is the n'th byte in the constant pool, then the next item + * will be numbered n+2" + * + * Thus we have to increment the index counter. + */ + tag = constant_pool[i].getTag(); + if ((tag == Constants.CONSTANT_Double) || (tag == Constants.CONSTANT_Long)) { + i++; + } + } + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantPool(this); + } + + + /** + * Resolve constant to a string representation. + * + * @param c Constant to be printed + * @return String representation + */ + public String constantToString( Constant c ) throws ClassFormatException { + String str; + int i; + byte tag = c.getTag(); + switch (tag) { + case Constants.CONSTANT_Class: + i = ((ConstantClass) c).getNameIndex(); + c = getConstant(i, Constants.CONSTANT_Utf8); + str = Utility.compactClassName(((ConstantUtf8) c).getBytes(), false); + break; + case Constants.CONSTANT_String: + i = ((ConstantString) c).getStringIndex(); + c = getConstant(i, Constants.CONSTANT_Utf8); + str = "\"" + escape(((ConstantUtf8) c).getBytes()) + "\""; + break; + case Constants.CONSTANT_Utf8: + str = ((ConstantUtf8) c).getBytes(); + break; + case Constants.CONSTANT_Double: + str = "" + ((ConstantDouble) c).getBytes(); + break; + case Constants.CONSTANT_Float: + str = "" + ((ConstantFloat) c).getBytes(); + break; + case Constants.CONSTANT_Long: + str = "" + ((ConstantLong) c).getBytes(); + break; + case Constants.CONSTANT_Integer: + str = "" + ((ConstantInteger) c).getBytes(); + break; + case Constants.CONSTANT_NameAndType: + str = (constantToString(((ConstantNameAndType) c).getNameIndex(), + Constants.CONSTANT_Utf8) + + " " + constantToString(((ConstantNameAndType) c).getSignatureIndex(), + Constants.CONSTANT_Utf8)); + break; + case Constants.CONSTANT_InterfaceMethodref: + case Constants.CONSTANT_Methodref: + case Constants.CONSTANT_Fieldref: + str = (constantToString(((ConstantCP) c).getClassIndex(), Constants.CONSTANT_Class) + + "." + constantToString(((ConstantCP) c).getNameAndTypeIndex(), + Constants.CONSTANT_NameAndType)); + break; + default: // Never reached + throw new RuntimeException("Unknown constant type " + tag); + } + return str; + } + + + private static final String escape( String str ) { + int len = str.length(); + StringBuffer buf = new StringBuffer(len + 5); + char[] ch = str.toCharArray(); + for (int i = 0; i < len; i++) { + switch (ch[i]) { + case '\n': + buf.append("\\n"); + break; + case '\r': + buf.append("\\r"); + break; + case '\t': + buf.append("\\t"); + break; + case '\b': + buf.append("\\b"); + break; + case '"': + buf.append("\\\""); + break; + default: + buf.append(ch[i]); + } + } + return buf.toString(); + } + + + /** + * Retrieve constant at `index' from constant pool and resolve it to + * a string representation. + * + * @param index of constant in constant pool + * @param tag expected type + * @return String representation + */ + public String constantToString( int index, byte tag ) throws ClassFormatException { + Constant c = getConstant(index, tag); + return constantToString(c); + } + + + /** + * Dump constant pool to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public void dump( DataOutputStream file ) throws IOException { + file.writeShort(constant_pool_count); + for (int i = 1; i < constant_pool_count; i++) { + if (constant_pool[i] != null) { + constant_pool[i].dump(file); + } + } + } + + + /** + * Get constant from constant pool. + * + * @param index Index in constant pool + * @return Constant value + * @see Constant + */ + public Constant getConstant( int index ) { + if (index >= constant_pool.length || index < 0) { + throw new ClassFormatException("Invalid constant pool reference: " + index + + ". Constant pool size is: " + constant_pool.length); + } + return constant_pool[index]; + } + + + /** + * Get constant from constant pool and check whether it has the + * expected type. + * + * @param index Index in constant pool + * @param tag Tag of expected constant, i.e., its type + * @return Constant value + * @see Constant + * @throws ClassFormatException + */ + public Constant getConstant( int index, byte tag ) throws ClassFormatException { + Constant c; + c = getConstant(index); + if (c == null) { + throw new ClassFormatException("Constant pool at index " + index + " is null."); + } + if (c.getTag() != tag) { + throw new ClassFormatException("Expected class `" + Constants.CONSTANT_NAMES[tag] + + "' at index " + index + " and got " + c); + } + return c; + } + + + /** + * @return Array of constants. + * @see Constant + */ + public Constant[] getConstantPool() { + return constant_pool; + } + + + /** + * Get string from constant pool and bypass the indirection of + * `ConstantClass' and `ConstantString' objects. I.e. these classes have + * an index field that points to another entry of the constant pool of + * type `ConstantUtf8' which contains the real data. + * + * @param index Index in constant pool + * @param tag Tag of expected constant, either ConstantClass or ConstantString + * @return Contents of string reference + * @see ConstantClass + * @see ConstantString + * @throws ClassFormatException */ - for(int i=1; i < constant_pool_count; i++) { - constant_pool[i] = Constant.readConstant(file); - - /* Quote from the JVM specification: - * "All eight byte constants take up two spots in the constant pool. - * If this is the n'th byte in the constant pool, then the next item - * will be numbered n+2" - * - * Thus we have to increment the index counter. - */ - tag = constant_pool[i].getTag(); - if((tag == Constants.CONSTANT_Double) || (tag == Constants.CONSTANT_Long)) - i++; + public String getConstantString( int index, byte tag ) throws ClassFormatException { + Constant c; + int i; + c = getConstant(index, tag); + /* This switch() is not that elegant, since the two classes have the + * same contents, they just differ in the name of the index + * field variable. + * But we want to stick to the JVM naming conventions closely though + * we could have solved these more elegantly by using the same + * variable name or by subclassing. + */ + switch (tag) { + case Constants.CONSTANT_Class: + i = ((ConstantClass) c).getNameIndex(); + break; + case Constants.CONSTANT_String: + i = ((ConstantString) c).getStringIndex(); + break; + default: + throw new RuntimeException("getConstantString called with illegal tag " + tag); + } + // Finally get the string from the constant pool + c = getConstant(i, Constants.CONSTANT_Utf8); + return ((ConstantUtf8) c).getBytes(); } - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantPool(this); - } - - /** - * Resolve constant to a string representation. - * - * @param c Constant to be printed - * @return String representation - */ - public String constantToString(Constant c) - throws ClassFormatException - { - String str; - int i; - byte tag = c.getTag(); - - switch(tag) { - case Constants.CONSTANT_Class: - i = ((ConstantClass)c).getNameIndex(); - c = getConstant(i, Constants.CONSTANT_Utf8); - str = Utility.compactClassName(((ConstantUtf8)c).getBytes(), false); - break; - - case Constants.CONSTANT_String: - i = ((ConstantString)c).getStringIndex(); - c = getConstant(i, Constants.CONSTANT_Utf8); - str = "\"" + escape(((ConstantUtf8)c).getBytes()) + "\""; - break; - - case Constants.CONSTANT_Utf8: str = ((ConstantUtf8)c).getBytes(); break; - case Constants.CONSTANT_Double: str = "" + ((ConstantDouble)c).getBytes(); break; - case Constants.CONSTANT_Float: str = "" + ((ConstantFloat)c).getBytes(); break; - case Constants.CONSTANT_Long: str = "" + ((ConstantLong)c).getBytes(); break; - case Constants.CONSTANT_Integer: str = "" + ((ConstantInteger)c).getBytes(); break; - - case Constants.CONSTANT_NameAndType: - str = (constantToString(((ConstantNameAndType)c).getNameIndex(), - Constants.CONSTANT_Utf8) + " " + - constantToString(((ConstantNameAndType)c).getSignatureIndex(), - Constants.CONSTANT_Utf8)); - break; - - case Constants.CONSTANT_InterfaceMethodref: case Constants.CONSTANT_Methodref: - case Constants.CONSTANT_Fieldref: - str = (constantToString(((ConstantCP)c).getClassIndex(), - Constants.CONSTANT_Class) + "." + - constantToString(((ConstantCP)c).getNameAndTypeIndex(), - Constants.CONSTANT_NameAndType)); - break; - - default: // Never reached - throw new RuntimeException("Unknown constant type " + tag); + + + /** + * @return Length of constant pool. + */ + public int getLength() { + return constant_pool_count; + } + + + /** + * @param constant Constant to set + */ + public void setConstant( int index, Constant constant ) { + constant_pool[index] = constant; } - - return str; - } - - private static final String escape(String str) { - int len = str.length(); - StringBuffer buf = new StringBuffer(len + 5); - char[] ch = str.toCharArray(); - - for(int i=0; i < len; i++) { - switch(ch[i]) { - case '\n' : buf.append("\\n"); break; - case '\r' : buf.append("\\r"); break; - case '\t' : buf.append("\\t"); break; - case '\b' : buf.append("\\b"); break; - case '"' : buf.append("\\\""); break; - default: buf.append(ch[i]); - } + + + /** + * @param constant_pool + */ + public void setConstantPool( Constant[] constant_pool ) { + this.constant_pool = constant_pool; + constant_pool_count = (constant_pool == null) ? 0 : constant_pool.length; } - return buf.toString(); - } - - - /** - * Retrieve constant at `index' from constant pool and resolve it to - * a string representation. - * - * @param index of constant in constant pool - * @param tag expected type - * @return String representation - */ - public String constantToString(int index, byte tag) - throws ClassFormatException - { - Constant c = getConstant(index, tag); - return constantToString(c); - } - - /** - * Dump constant pool to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public void dump(DataOutputStream file) throws IOException - { - file.writeShort(constant_pool_count); - - for(int i=1; i < constant_pool_count; i++) - if(constant_pool[i] != null) - constant_pool[i].dump(file); - } - - /** - * Get constant from constant pool. - * - * @param index Index in constant pool - * @return Constant value - * @see Constant - */ - public Constant getConstant(int index) { - if (index >= constant_pool.length || index < 0) - throw new ClassFormatException("Invalid constant pool reference: " + - index + ". Constant pool size is: " + - constant_pool.length); - return constant_pool[index]; - } - - /** - * Get constant from constant pool and check whether it has the - * expected type. - * - * @param index Index in constant pool - * @param tag Tag of expected constant, i.e., its type - * @return Constant value - * @see Constant - * @throws ClassFormatException - */ - public Constant getConstant(int index, byte tag) - throws ClassFormatException - { - Constant c; - - c = getConstant(index); - - if(c == null) - throw new ClassFormatException("Constant pool at index " + index + " is null."); - - if(c.getTag() != tag) - throw new ClassFormatException("Expected class `" + Constants.CONSTANT_NAMES[tag] + - "' at index " + index + " and got " + c); - - return c; - } - - /** - * @return Array of constants. - * @see Constant - */ - public Constant[] getConstantPool() { return constant_pool; } - /** - * Get string from constant pool and bypass the indirection of - * `ConstantClass' and `ConstantString' objects. I.e. these classes have - * an index field that points to another entry of the constant pool of - * type `ConstantUtf8' which contains the real data. - * - * @param index Index in constant pool - * @param tag Tag of expected constant, either ConstantClass or ConstantString - * @return Contents of string reference - * @see ConstantClass - * @see ConstantString - * @throws ClassFormatException - */ - public String getConstantString(int index, byte tag) - throws ClassFormatException - { - Constant c; - int i; - - c = getConstant(index, tag); - - /* This switch() is not that elegant, since the two classes have the - * same contents, they just differ in the name of the index - * field variable. - * But we want to stick to the JVM naming conventions closely though - * we could have solved these more elegantly by using the same - * variable name or by subclassing. + + /** + * @return String representation. */ - switch(tag) { - case Constants.CONSTANT_Class: i = ((ConstantClass)c).getNameIndex(); break; - case Constants.CONSTANT_String: i = ((ConstantString)c).getStringIndex(); break; - default: - throw new RuntimeException("getConstantString called with illegal tag " + tag); + public String toString() { + StringBuffer buf = new StringBuffer(); + for (int i = 1; i < constant_pool_count; i++) { + buf.append(i).append(")").append(constant_pool[i]).append("\n"); + } + return buf.toString(); } - // Finally get the string from the constant pool - c = getConstant(i, Constants.CONSTANT_Utf8); - return ((ConstantUtf8)c).getBytes(); - } - /** - * @return Length of constant pool. - */ - public int getLength() - { - return constant_pool_count; - } - - /** - * @param constant Constant to set - */ - public void setConstant(int index, Constant constant) { - constant_pool[index] = constant; - } - - /** - * @param constant_pool - */ - public void setConstantPool(Constant[] constant_pool) { - this.constant_pool = constant_pool; - constant_pool_count = (constant_pool == null)? 0 : constant_pool.length; - } - /** - * @return String representation. - */ - public String toString() { - StringBuffer buf = new StringBuffer(); - - for(int i=1; i < constant_pool_count; i++) - buf.append(i).append(")").append(constant_pool[i]).append("\n"); - - return buf.toString(); - } - - /** - * @return deep copy of this constant pool - */ - public ConstantPool copy() { - ConstantPool c = null; - - try { - c = (ConstantPool)clone(); - c.constant_pool = new Constant[constant_pool_count]; - - for(int i=1; i < constant_pool_count; i++) { - if(constant_pool[i] != null) - c.constant_pool[i] = constant_pool[i].copy(); - } - } catch(CloneNotSupportedException e) {} - - - return c; - } + + /** + * @return deep copy of this constant pool + */ + public ConstantPool copy() { + ConstantPool c = null; + try { + c = (ConstantPool) clone(); + c.constant_pool = new Constant[constant_pool_count]; + for (int i = 1; i < constant_pool_count; i++) { + if (constant_pool[i] != null) { + c.constant_pool[i] = constant_pool[i].copy(); + } + } + } catch (CloneNotSupportedException e) { + } + return c; + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantString.java b/src/java/org/apache/bcel/classfile/ConstantString.java index 837076a9..64e4fd77 100644 --- a/src/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/java/org/apache/bcel/classfile/ConstantString.java @@ -31,82 +31,97 @@ import org.apache.bcel.Constants; * @see Constant */ public final class ConstantString extends Constant implements ConstantObject { - private int string_index; // Identical to ConstantClass except for this name - - /** - * Initialize from another object. - */ - public ConstantString(ConstantString c) { - this(c.getStringIndex()); - } - /** - * Initialize instance from file data. - * - * @param file Input stream - * @throws IOException - */ - ConstantString(DataInputStream file) throws IOException - { - this(file.readUnsignedShort()); - } - /** - * @param string_index Index of Constant_Utf8 in constant pool - */ - public ConstantString(int string_index) - { - super(Constants.CONSTANT_String); - this.string_index = string_index; - } - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantString(this); - } - /** - * Dump constant field reference to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeByte(tag); - file.writeShort(string_index); - } - /** - * @return Index in constant pool of the string (ConstantUtf8). - */ - public final int getStringIndex() { return string_index; } - - /** - * @param string_index the index into the constant of the string value - */ - public final void setStringIndex(int string_index) { - this.string_index = string_index; - } - /** - * @return String representation. - */ - public final String toString() - { - return super.toString() + "(string_index = " + string_index + ")"; - } - - /** @return String object - */ - public Object getConstantValue(ConstantPool cp) { - Constant c = cp.getConstant(string_index, Constants.CONSTANT_Utf8); - return ((ConstantUtf8)c).getBytes(); - } - - /** @return dereferenced string - */ - public String getBytes(ConstantPool cp) { - return (String)getConstantValue(cp); - } + + private int string_index; // Identical to ConstantClass except for this name + + + /** + * Initialize from another object. + */ + public ConstantString(ConstantString c) { + this(c.getStringIndex()); + } + + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throws IOException + */ + ConstantString(DataInputStream file) throws IOException { + this(file.readUnsignedShort()); + } + + + /** + * @param string_index Index of Constant_Utf8 in constant pool + */ + public ConstantString(int string_index) { + super(Constants.CONSTANT_String); + this.string_index = string_index; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantString(this); + } + + + /** + * Dump constant field reference to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(tag); + file.writeShort(string_index); + } + + + /** + * @return Index in constant pool of the string (ConstantUtf8). + */ + public final int getStringIndex() { + return string_index; + } + + + /** + * @param string_index the index into the constant of the string value + */ + public final void setStringIndex( int string_index ) { + this.string_index = string_index; + } + + + /** + * @return String representation. + */ + public final String toString() { + return super.toString() + "(string_index = " + string_index + ")"; + } + + + /** @return String object + */ + public Object getConstantValue( ConstantPool cp ) { + Constant c = cp.getConstant(string_index, Constants.CONSTANT_Utf8); + return ((ConstantUtf8) c).getBytes(); + } + + + /** @return dereferenced string + */ + public String getBytes( ConstantPool cp ) { + return (String) getConstantValue(cp); + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/java/org/apache/bcel/classfile/ConstantUtf8.java index 49ccb572..593e64da 100644 --- a/src/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -32,81 +31,86 @@ import org.apache.bcel.Constants; * @see Constant */ public final class ConstantUtf8 extends Constant { - private String bytes; - - /** - * Initialize from another object. - */ - public ConstantUtf8(ConstantUtf8 c) { - this(c.getBytes()); - } - - /** - * Initialize instance from file data. - * - * @param file Input stream - * @throws IOException - */ - ConstantUtf8(DataInputStream file) throws IOException - { - super(Constants.CONSTANT_Utf8); - - bytes = file.readUTF(); - } - - /** - * @param bytes Data - */ - public ConstantUtf8(String bytes) - { - super(Constants.CONSTANT_Utf8); - - if(bytes == null) - throw new IllegalArgumentException("bytes must not be null!"); - - this.bytes = bytes; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantUtf8(this); - } - - /** - * Dump String in Utf8 format to file stream. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeByte(tag); - file.writeUTF(bytes); - } - - /** - * @return Data converted to string. - */ - public final String getBytes() { return bytes; } - - /** - * @param bytes the raw bytes of this Utf-8 - */ - public final void setBytes(String bytes) { - this.bytes = bytes; - } - - /** - * @return String representation - */ - public final String toString() - { - return super.toString() + "(\"" + Utility.replace(bytes, "\n", "\\n") + "\")"; - } + + private String bytes; + + + /** + * Initialize from another object. + */ + public ConstantUtf8(ConstantUtf8 c) { + this(c.getBytes()); + } + + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throws IOException + */ + ConstantUtf8(DataInputStream file) throws IOException { + super(Constants.CONSTANT_Utf8); + bytes = file.readUTF(); + } + + + /** + * @param bytes Data + */ + public ConstantUtf8(String bytes) { + super(Constants.CONSTANT_Utf8); + if (bytes == null) { + throw new IllegalArgumentException("bytes must not be null!"); + } + this.bytes = bytes; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantUtf8(this); + } + + + /** + * Dump String in Utf8 format to file stream. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(tag); + file.writeUTF(bytes); + } + + + /** + * @return Data converted to string. + */ + public final String getBytes() { + return bytes; + } + + + /** + * @param bytes the raw bytes of this Utf-8 + */ + public final void setBytes( String bytes ) { + this.bytes = bytes; + } + + + /** + * @return String representation + */ + public final String toString() { + return super.toString() + "(\"" + Utility.replace(bytes, "\n", "\\n") + "\")"; + } } diff --git a/src/java/org/apache/bcel/classfile/ConstantValue.java b/src/java/org/apache/bcel/classfile/ConstantValue.java index 21e8c189..f18a6b55 100644 --- a/src/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/java/org/apache/bcel/classfile/ConstantValue.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -32,112 +31,125 @@ import org.apache.bcel.Constants; * @see Attribute */ public final class ConstantValue extends Attribute { - private int constantvalue_index; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public ConstantValue(ConstantValue c) { - this(c.getNameIndex(), c.getLength(), c.getConstantValueIndex(), - c.getConstantPool()); - } - - /** - * Construct object from file stream. - * @param name_index Name index in constant pool - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - * @throws IOException - */ - ConstantValue(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(name_index, length, file.readUnsignedShort(), constant_pool); - } - - /** - * @param name_index Name index in constant pool - * @param length Content length in bytes - * @param constantvalue_index Index in constant pool - * @param constant_pool Array of constants - */ - public ConstantValue(int name_index, int length, - int constantvalue_index, - ConstantPool constant_pool) - { - super(Constants.ATTR_CONSTANT_VALUE, name_index, length, constant_pool); - this.constantvalue_index = constantvalue_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitConstantValue(this); - } - /** - * Dump constant value attribute to file stream on binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - file.writeShort(constantvalue_index); - } - /** - * @return Index in constant pool of constant value. - */ - public final int getConstantValueIndex() { return constantvalue_index; } - - /** - * @param constantvalue_index the index info the constant pool of this constant value - */ - public final void setConstantValueIndex(int constantvalue_index) { - this.constantvalue_index = constantvalue_index; - } - - /** - * @return String representation of constant value. - */ - public final String toString() { - Constant c = constant_pool.getConstant(constantvalue_index); - - String buf; - int i; - - // Print constant to string depending on its type - switch(c.getTag()) { - case Constants.CONSTANT_Long: buf = "" + ((ConstantLong)c).getBytes(); break; - case Constants.CONSTANT_Float: buf = "" + ((ConstantFloat)c).getBytes(); break; - case Constants.CONSTANT_Double: buf = "" + ((ConstantDouble)c).getBytes(); break; - case Constants.CONSTANT_Integer: buf = "" + ((ConstantInteger)c).getBytes(); break; - case Constants.CONSTANT_String: - i = ((ConstantString)c).getStringIndex(); - c = constant_pool.getConstant(i, Constants.CONSTANT_Utf8); - buf = "\"" + Utility.convertString(((ConstantUtf8)c).getBytes()) + "\""; - break; - - default: - throw new IllegalStateException("Type of ConstValue invalid: " + c); + + private int constantvalue_index; + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public ConstantValue(ConstantValue c) { + this(c.getNameIndex(), c.getLength(), c.getConstantValueIndex(), c.getConstantPool()); + } + + + /** + * Construct object from file stream. + * @param name_index Name index in constant pool + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + ConstantValue(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, file.readUnsignedShort(), constant_pool); + } + + + /** + * @param name_index Name index in constant pool + * @param length Content length in bytes + * @param constantvalue_index Index in constant pool + * @param constant_pool Array of constants + */ + public ConstantValue(int name_index, int length, int constantvalue_index, + ConstantPool constant_pool) { + super(Constants.ATTR_CONSTANT_VALUE, name_index, length, constant_pool); + this.constantvalue_index = constantvalue_index; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitConstantValue(this); } - return buf; - } - - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool _constant_pool) { - ConstantValue c = (ConstantValue)clone(); - c.constant_pool = _constant_pool; - return c; - } + + /** + * Dump constant value attribute to file stream on binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + file.writeShort(constantvalue_index); + } + + + /** + * @return Index in constant pool of constant value. + */ + public final int getConstantValueIndex() { + return constantvalue_index; + } + + + /** + * @param constantvalue_index the index info the constant pool of this constant value + */ + public final void setConstantValueIndex( int constantvalue_index ) { + this.constantvalue_index = constantvalue_index; + } + + + /** + * @return String representation of constant value. + */ + public final String toString() { + Constant c = constant_pool.getConstant(constantvalue_index); + String buf; + int i; + // Print constant to string depending on its type + switch (c.getTag()) { + case Constants.CONSTANT_Long: + buf = "" + ((ConstantLong) c).getBytes(); + break; + case Constants.CONSTANT_Float: + buf = "" + ((ConstantFloat) c).getBytes(); + break; + case Constants.CONSTANT_Double: + buf = "" + ((ConstantDouble) c).getBytes(); + break; + case Constants.CONSTANT_Integer: + buf = "" + ((ConstantInteger) c).getBytes(); + break; + case Constants.CONSTANT_String: + i = ((ConstantString) c).getStringIndex(); + c = constant_pool.getConstant(i, Constants.CONSTANT_Utf8); + buf = "\"" + Utility.convertString(((ConstantUtf8) c).getBytes()) + "\""; + break; + default: + throw new IllegalStateException("Type of ConstValue invalid: " + c); + } + return buf; + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + ConstantValue c = (ConstantValue) clone(); + c.constant_pool = _constant_pool; + return c; + } } diff --git a/src/java/org/apache/bcel/classfile/Deprecated.java b/src/java/org/apache/bcel/classfile/Deprecated.java index 3e155453..e38a373f 100644 --- a/src/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/java/org/apache/bcel/classfile/Deprecated.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -32,105 +31,110 @@ import org.apache.bcel.Constants; * @see Attribute */ public final class Deprecated extends Attribute { - private byte[] bytes; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public Deprecated(Deprecated c) { - this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); - } - - /** - * @param name_index Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes - * @param bytes Attribute contents - * @param constant_pool Array of constants - */ - public Deprecated(int name_index, int length, byte[] bytes, - ConstantPool constant_pool) - { - super(Constants.ATTR_DEPRECATED, name_index, length, constant_pool); - this.bytes = bytes; - } - - /** - * Construct object from file stream. - * @param name_index Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - * @throws IOException - */ - Deprecated(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(name_index, length, (byte [])null, constant_pool); - - if(length > 0) { - bytes = new byte[length]; - file.readFully(bytes); - System.err.println("Deprecated attribute with length > 0"); + + private byte[] bytes; + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public Deprecated(Deprecated c) { + this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); + } + + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param bytes Attribute contents + * @param constant_pool Array of constants + */ + public Deprecated(int name_index, int length, byte[] bytes, ConstantPool constant_pool) { + super(Constants.ATTR_DEPRECATED, name_index, length, constant_pool); + this.bytes = bytes; } - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitDeprecated(this); - } - - /** - * Dump source file attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - - if(length > 0) - file.write(bytes, 0, length); - } - - /** - * @return data bytes. - */ - public final byte[] getBytes() { return bytes; } - - /** - * @param bytes the raw bytes that represents this byte array - */ - public final void setBytes(byte[] bytes) { - this.bytes = bytes; - } - - /** - * @return attribute name - */ - public final String toString() { - return Constants.ATTRIBUTE_NAMES[Constants.ATTR_DEPRECATED]; - } - - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool _constant_pool) { - Deprecated c = (Deprecated)clone(); - - if (bytes != null) { - c.bytes = new byte[bytes.length]; - System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); + + + /** + * Construct object from file stream. + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + Deprecated(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, (byte[]) null, constant_pool); + if (length > 0) { + bytes = new byte[length]; + file.readFully(bytes); + System.err.println("Deprecated attribute with length > 0"); + } } - c.constant_pool = _constant_pool; - return c; - } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitDeprecated(this); + } + + + /** + * Dump source file attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + if (length > 0) { + file.write(bytes, 0, length); + } + } + + + /** + * @return data bytes. + */ + public final byte[] getBytes() { + return bytes; + } + + + /** + * @param bytes the raw bytes that represents this byte array + */ + public final void setBytes( byte[] bytes ) { + this.bytes = bytes; + } + + + /** + * @return attribute name + */ + public final String toString() { + return Constants.ATTRIBUTE_NAMES[Constants.ATTR_DEPRECATED]; + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + Deprecated c = (Deprecated) clone(); + if (bytes != null) { + c.bytes = new byte[bytes.length]; + System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); + } + c.constant_pool = _constant_pool; + return c; + } } diff --git a/src/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/java/org/apache/bcel/classfile/DescendingVisitor.java index f2ffb6b4..4f80560c 100644 --- a/src/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; import java.util.Stack; @@ -28,309 +28,347 @@ import java.util.Stack; * @author M. Dahm */ public class DescendingVisitor implements Visitor { - private JavaClass clazz; - private Visitor visitor; - private Stack stack = new Stack(); - - /** @return container of current entitity, i.e., predecessor during traversal - */ - public Object predecessor() { - return predecessor(0); - } - - /** - * @param level nesting level, i.e., 0 returns the direct predecessor - * @return container of current entitity, i.e., predecessor during traversal - */ - public Object predecessor(int level) { - int size = stack.size(); - - if((size < 2) || (level < 0)) - return null; - else - return stack.elementAt(size - (level + 2)); // size - 1 == current - } - - /** @return current object - */ - public Object current() { - return stack.peek(); - } - - /** - * @param clazz Class to traverse - * @param visitor visitor object to apply to all components - */ - public DescendingVisitor(JavaClass clazz, Visitor visitor) { - this.clazz = clazz; - this.visitor = visitor; - } - - /** - * Start traversal. - */ - public void visit() { clazz.accept(this); } - - public void visitJavaClass(JavaClass _clazz) { - stack.push(_clazz); - _clazz.accept(visitor); - - Field[] fields = _clazz.getFields(); - for(int i=0; i < fields.length; i++) - fields[i].accept(this); - - Method[] methods = _clazz.getMethods(); - for(int i=0; i < methods.length; i++) - methods[i].accept(this); - - Attribute[] attributes = _clazz.getAttributes(); - for(int i=0; i < attributes.length; i++) - attributes[i].accept(this); - - _clazz.getConstantPool().accept(this); - stack.pop(); - } - - public void visitAnnotation(Annotations annotation) { - stack.push(annotation); - annotation.accept(visitor); - - AnnotationEntry[] entries = annotation.getAnnotationEntries(); - for (int i=0; i < entries.length; i++) - entries[i].accept(this); - stack.pop(); - } - - public void visitAnnotationEntry(AnnotationEntry annotationEntry) { - stack.push(annotationEntry); - annotationEntry.accept(visitor); - stack.pop(); - } - - public void visitField(Field field) { - stack.push(field); - field.accept(visitor); - - Attribute[] attributes = field.getAttributes(); - for(int i=0; i < attributes.length; i++) - attributes[i].accept(this); - stack.pop(); - } - - public void visitConstantValue(ConstantValue cv) { - stack.push(cv); - cv.accept(visitor); - stack.pop(); - } - - public void visitMethod(Method method) { - stack.push(method); - method.accept(visitor); - - Attribute[] attributes = method.getAttributes(); - for(int i=0; i < attributes.length; i++) - attributes[i].accept(this); - - stack.pop(); - } - - public void visitExceptionTable(ExceptionTable table) { - stack.push(table); - table.accept(visitor); - stack.pop(); - } - - public void visitCode(Code code) { - stack.push(code); - code.accept(visitor); - - CodeException[] table = code.getExceptionTable(); - for(int i=0; i < table.length; i++) - table[i].accept(this); - - Attribute[] attributes = code.getAttributes(); - for(int i=0; i < attributes.length; i++) - attributes[i].accept(this); - stack.pop(); - } - - public void visitCodeException(CodeException ce) { - stack.push(ce); - ce.accept(visitor); - stack.pop(); - } - - public void visitLineNumberTable(LineNumberTable table) { - stack.push(table); - table.accept(visitor); - - LineNumber[] numbers = table.getLineNumberTable(); - for(int i=0; i < numbers.length; i++) - numbers[i].accept(this); - stack.pop(); - } - - public void visitLineNumber(LineNumber number) { - stack.push(number); - number.accept(visitor); - stack.pop(); - } - - public void visitLocalVariableTable(LocalVariableTable table) { - stack.push(table); - table.accept(visitor); - - LocalVariable[] vars = table.getLocalVariableTable(); - for(int i=0; i < vars.length; i++) - vars[i].accept(this); - stack.pop(); - } - - public void visitStackMap(StackMap table) { - stack.push(table); - table.accept(visitor); - - StackMapEntry[] vars = table.getStackMap(); - - for(int i=0; i < vars.length; i++) - vars[i].accept(this); - stack.pop(); - } - - public void visitStackMapEntry(StackMapEntry var) { - stack.push(var); - var.accept(visitor); - stack.pop(); - } - - public void visitLocalVariable(LocalVariable var) { - stack.push(var); - var.accept(visitor); - stack.pop(); - } - - public void visitConstantPool(ConstantPool cp) { - stack.push(cp); - cp.accept(visitor); - - Constant[] constants = cp.getConstantPool(); - for(int i=1; i < constants.length; i++) { - if(constants[i] != null) - constants[i].accept(this); - } - - stack.pop(); - } - - public void visitConstantClass(ConstantClass constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantDouble(ConstantDouble constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantFieldref(ConstantFieldref constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantFloat(ConstantFloat constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantInteger(ConstantInteger constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantLong(ConstantLong constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantMethodref(ConstantMethodref constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantNameAndType(ConstantNameAndType constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantString(ConstantString constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantUtf8(ConstantUtf8 constant) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitInnerClasses(InnerClasses ic) { - stack.push(ic); - ic.accept(visitor); - - InnerClass[] ics = ic.getInnerClasses(); - for(int i=0; i < ics.length; i++) - ics[i].accept(this); - stack.pop(); - } - - public void visitInnerClass(InnerClass inner) { - stack.push(inner); - inner.accept(visitor); - stack.pop(); - } - - public void visitDeprecated(Deprecated attribute) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - public void visitSignature(Signature attribute) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - public void visitSourceFile(SourceFile attribute) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - public void visitSynthetic(Synthetic attribute) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - public void visitUnknown(Unknown attribute) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } + + private JavaClass clazz; + private Visitor visitor; + private Stack stack = new Stack(); + + + /** @return container of current entitity, i.e., predecessor during traversal + */ + public Object predecessor() { + return predecessor(0); + } + + + /** + * @param level nesting level, i.e., 0 returns the direct predecessor + * @return container of current entitity, i.e., predecessor during traversal + */ + public Object predecessor( int level ) { + int size = stack.size(); + if ((size < 2) || (level < 0)) { + return null; + } else { + return stack.elementAt(size - (level + 2)); // size - 1 == current + } + } + + + /** @return current object + */ + public Object current() { + return stack.peek(); + } + + + /** + * @param clazz Class to traverse + * @param visitor visitor object to apply to all components + */ + public DescendingVisitor(JavaClass clazz, Visitor visitor) { + this.clazz = clazz; + this.visitor = visitor; + } + + + /** + * Start traversal. + */ + public void visit() { + clazz.accept(this); + } + + + public void visitJavaClass( JavaClass _clazz ) { + stack.push(_clazz); + _clazz.accept(visitor); + Field[] fields = _clazz.getFields(); + for (int i = 0; i < fields.length; i++) { + fields[i].accept(this); + } + Method[] methods = _clazz.getMethods(); + for (int i = 0; i < methods.length; i++) { + methods[i].accept(this); + } + Attribute[] attributes = _clazz.getAttributes(); + for (int i = 0; i < attributes.length; i++) { + attributes[i].accept(this); + } + _clazz.getConstantPool().accept(this); + stack.pop(); + } + + + public void visitAnnotation( Annotations annotation ) { + stack.push(annotation); + annotation.accept(visitor); + AnnotationEntry[] entries = annotation.getAnnotationEntries(); + for (int i = 0; i < entries.length; i++) { + entries[i].accept(this); + } + stack.pop(); + } + + + public void visitAnnotationEntry( AnnotationEntry annotationEntry ) { + stack.push(annotationEntry); + annotationEntry.accept(visitor); + stack.pop(); + } + + + public void visitField( Field field ) { + stack.push(field); + field.accept(visitor); + Attribute[] attributes = field.getAttributes(); + for (int i = 0; i < attributes.length; i++) { + attributes[i].accept(this); + } + stack.pop(); + } + + + public void visitConstantValue( ConstantValue cv ) { + stack.push(cv); + cv.accept(visitor); + stack.pop(); + } + + + public void visitMethod( Method method ) { + stack.push(method); + method.accept(visitor); + Attribute[] attributes = method.getAttributes(); + for (int i = 0; i < attributes.length; i++) { + attributes[i].accept(this); + } + stack.pop(); + } + + + public void visitExceptionTable( ExceptionTable table ) { + stack.push(table); + table.accept(visitor); + stack.pop(); + } + + + public void visitCode( Code code ) { + stack.push(code); + code.accept(visitor); + CodeException[] table = code.getExceptionTable(); + for (int i = 0; i < table.length; i++) { + table[i].accept(this); + } + Attribute[] attributes = code.getAttributes(); + for (int i = 0; i < attributes.length; i++) { + attributes[i].accept(this); + } + stack.pop(); + } + + + public void visitCodeException( CodeException ce ) { + stack.push(ce); + ce.accept(visitor); + stack.pop(); + } + + + public void visitLineNumberTable( LineNumberTable table ) { + stack.push(table); + table.accept(visitor); + LineNumber[] numbers = table.getLineNumberTable(); + for (int i = 0; i < numbers.length; i++) { + numbers[i].accept(this); + } + stack.pop(); + } + + + public void visitLineNumber( LineNumber number ) { + stack.push(number); + number.accept(visitor); + stack.pop(); + } + + + public void visitLocalVariableTable( LocalVariableTable table ) { + stack.push(table); + table.accept(visitor); + LocalVariable[] vars = table.getLocalVariableTable(); + for (int i = 0; i < vars.length; i++) { + vars[i].accept(this); + } + stack.pop(); + } + + + public void visitStackMap( StackMap table ) { + stack.push(table); + table.accept(visitor); + StackMapEntry[] vars = table.getStackMap(); + for (int i = 0; i < vars.length; i++) { + vars[i].accept(this); + } + stack.pop(); + } + + + public void visitStackMapEntry( StackMapEntry var ) { + stack.push(var); + var.accept(visitor); + stack.pop(); + } + + + public void visitLocalVariable( LocalVariable var ) { + stack.push(var); + var.accept(visitor); + stack.pop(); + } + + + public void visitConstantPool( ConstantPool cp ) { + stack.push(cp); + cp.accept(visitor); + Constant[] constants = cp.getConstantPool(); + for (int i = 1; i < constants.length; i++) { + if (constants[i] != null) { + constants[i].accept(this); + } + } + stack.pop(); + } + + + public void visitConstantClass( ConstantClass constant ) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + + public void visitConstantDouble( ConstantDouble constant ) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + + public void visitConstantFieldref( ConstantFieldref constant ) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + + public void visitConstantFloat( ConstantFloat constant ) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + + public void visitConstantInteger( ConstantInteger constant ) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + + public void visitConstantInterfaceMethodref( ConstantInterfaceMethodref constant ) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + + public void visitConstantLong( ConstantLong constant ) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + + public void visitConstantMethodref( ConstantMethodref constant ) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + + public void visitConstantNameAndType( ConstantNameAndType constant ) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + + public void visitConstantString( ConstantString constant ) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + + public void visitConstantUtf8( ConstantUtf8 constant ) { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + + public void visitInnerClasses( InnerClasses ic ) { + stack.push(ic); + ic.accept(visitor); + InnerClass[] ics = ic.getInnerClasses(); + for (int i = 0; i < ics.length; i++) { + ics[i].accept(this); + } + stack.pop(); + } + + + public void visitInnerClass( InnerClass inner ) { + stack.push(inner); + inner.accept(visitor); + stack.pop(); + } + + + public void visitDeprecated( Deprecated attribute ) { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + + public void visitSignature( Signature attribute ) { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + + public void visitSourceFile( SourceFile attribute ) { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + + public void visitSynthetic( Synthetic attribute ) { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + + public void visitUnknown( Unknown attribute ) { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } } diff --git a/src/java/org/apache/bcel/classfile/ElementValue.java b/src/java/org/apache/bcel/classfile/ElementValue.java index 8fff9c38..17910eb8 100644 --- a/src/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/java/org/apache/bcel/classfile/ElementValue.java @@ -26,62 +26,57 @@ import java.io.IOException; * @version $Id: ElementValue * @author D. Brosius */ +public class ElementValue { -public class ElementValue -{ - private byte tag; - private int const_value_index; - private int type_name_index; - private int const_name_index; - private int class_info_index; - private AnnotationEntry annotation; - private int num_values; - private ElementValue[] values; - /** - * Construct object from file stream. - * @param file Input stream - * @param constant_pool the constant pool - * @throws IOException - */ - ElementValue(DataInputStream file, ConstantPool constant_pool) - throws IOException - { - tag = (file.readByte()); - switch (tag) { - case 'B': - case 'C': - case 'D': - case 'F': - case 'I': - case 'J': - case 'S': - case 'Z': - case 's': - const_value_index = (file.readUnsignedShort()); - break; - - case 'e': - type_name_index = (file.readUnsignedShort()); - const_name_index = (file.readUnsignedShort()); - break; - - case 'c': - class_info_index = (file.readUnsignedShort()); - break; - - case '@': - annotation = new AnnotationEntry(file, constant_pool); - break; - - case '[': - num_values = (file.readUnsignedShort()); - values = new ElementValue[num_values]; - for (int i = 0; i < num_values; i++) - values[i] = new ElementValue(file, constant_pool); - break; - - default: - throw new IOException("Invalid ElementValue tag: " + tag ); - } - } + private byte tag; + private int const_value_index; + private int type_name_index; + private int const_name_index; + private int class_info_index; + private AnnotationEntry annotation; + private int num_values; + private ElementValue[] values; + + + /** + * Construct object from file stream. + * @param file Input stream + * @param constant_pool the constant pool + * @throws IOException + */ + ElementValue(DataInputStream file, ConstantPool constant_pool) throws IOException { + tag = (file.readByte()); + switch (tag) { + case 'B': + case 'C': + case 'D': + case 'F': + case 'I': + case 'J': + case 'S': + case 'Z': + case 's': + const_value_index = (file.readUnsignedShort()); + break; + case 'e': + type_name_index = (file.readUnsignedShort()); + const_name_index = (file.readUnsignedShort()); + break; + case 'c': + class_info_index = (file.readUnsignedShort()); + break; + case '@': + annotation = new AnnotationEntry(file, constant_pool); + break; + case '[': + num_values = (file.readUnsignedShort()); + values = new ElementValue[num_values]; + for (int i = 0; i < num_values; i++) { + values[i] = new ElementValue(file, constant_pool); + } + break; + default: + throw new IOException("Invalid ElementValue tag: " + tag); + } + } } diff --git a/src/java/org/apache/bcel/classfile/ElementValuePair.java b/src/java/org/apache/bcel/classfile/ElementValuePair.java index f2ac5d35..717d6798 100644 --- a/src/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/java/org/apache/bcel/classfile/ElementValuePair.java @@ -19,28 +19,26 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.IOException; - /** * an annotation's element value pair * * @version $Id: ElementValuePair * @author D. Brosius */ -public class ElementValuePair -{ - private int element_name_index; - private ElementValue value; +public class ElementValuePair { + + private int element_name_index; + private ElementValue value; + - /** - * Construct object from file stream. - * @param file Input stream - * @param constant_pool the constant pool - * @throws IOException - */ - ElementValuePair(DataInputStream file, ConstantPool constant_pool) - throws IOException - { - element_name_index = (file.readUnsignedShort()); - value = new ElementValue(file, constant_pool); - } + /** + * Construct object from file stream. + * @param file Input stream + * @param constant_pool the constant pool + * @throws IOException + */ + ElementValuePair(DataInputStream file, ConstantPool constant_pool) throws IOException { + element_name_index = (file.readUnsignedShort()); + value = new ElementValue(file, constant_pool); + } } diff --git a/src/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/java/org/apache/bcel/classfile/EmptyVisitor.java index e36b1f0b..6291e628 100644 --- a/src/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -13,11 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - - /** * Visitor with empty method bodies, can be extended and used in conjunction with the * DescendingVisitor class, e.g. @@ -29,42 +27,151 @@ package org.apache.bcel.classfile; * */ public class EmptyVisitor implements Visitor { - protected EmptyVisitor() { } - - public void visitAnnotation(Annotations obj) {} - public void visitParameterAnnotation(ParameterAnnotations obj) {} - public void visitAnnotationEntry(AnnotationEntry obj) {} - public void visitAnnotationDefault(AnnotationDefault obj) {} - public void visitCode(Code obj) {} - public void visitCodeException(CodeException obj) {} - public void visitConstantClass(ConstantClass obj) {} - public void visitConstantDouble(ConstantDouble obj) {} - public void visitConstantFieldref(ConstantFieldref obj) {} - public void visitConstantFloat(ConstantFloat obj) {} - public void visitConstantInteger(ConstantInteger obj) {} - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) {} - public void visitConstantLong(ConstantLong obj) {} - public void visitConstantMethodref(ConstantMethodref obj) {} - public void visitConstantNameAndType(ConstantNameAndType obj) {} - public void visitConstantPool(ConstantPool obj) {} - public void visitConstantString(ConstantString obj) {} - public void visitConstantUtf8(ConstantUtf8 obj) {} - public void visitConstantValue(ConstantValue obj) {} - public void visitDeprecated(Deprecated obj) {} - public void visitExceptionTable(ExceptionTable obj) {} - public void visitField(Field obj) {} - public void visitInnerClass(InnerClass obj) {} - public void visitInnerClasses(InnerClasses obj) {} - public void visitJavaClass(JavaClass obj) {} - public void visitLineNumber(LineNumber obj) {} - public void visitLineNumberTable(LineNumberTable obj) {} - public void visitLocalVariable(LocalVariable obj) {} - public void visitLocalVariableTable(LocalVariableTable obj) {} - public void visitMethod(Method obj) {} - public void visitSignature(Signature obj) {} - public void visitSourceFile(SourceFile obj) {} - public void visitSynthetic(Synthetic obj) {} - public void visitUnknown(Unknown obj) {} - public void visitStackMap(StackMap obj) {} - public void visitStackMapEntry(StackMapEntry obj) {} + + protected EmptyVisitor() { + } + + + public void visitAnnotation( Annotations obj ) { + } + + + public void visitParameterAnnotation( ParameterAnnotations obj ) { + } + + + public void visitAnnotationEntry( AnnotationEntry obj ) { + } + + + public void visitAnnotationDefault( AnnotationDefault obj ) { + } + + + public void visitCode( Code obj ) { + } + + + public void visitCodeException( CodeException obj ) { + } + + + public void visitConstantClass( ConstantClass obj ) { + } + + + public void visitConstantDouble( ConstantDouble obj ) { + } + + + public void visitConstantFieldref( ConstantFieldref obj ) { + } + + + public void visitConstantFloat( ConstantFloat obj ) { + } + + + public void visitConstantInteger( ConstantInteger obj ) { + } + + + public void visitConstantInterfaceMethodref( ConstantInterfaceMethodref obj ) { + } + + + public void visitConstantLong( ConstantLong obj ) { + } + + + public void visitConstantMethodref( ConstantMethodref obj ) { + } + + + public void visitConstantNameAndType( ConstantNameAndType obj ) { + } + + + public void visitConstantPool( ConstantPool obj ) { + } + + + public void visitConstantString( ConstantString obj ) { + } + + + public void visitConstantUtf8( ConstantUtf8 obj ) { + } + + + public void visitConstantValue( ConstantValue obj ) { + } + + + public void visitDeprecated( Deprecated obj ) { + } + + + public void visitExceptionTable( ExceptionTable obj ) { + } + + + public void visitField( Field obj ) { + } + + + public void visitInnerClass( InnerClass obj ) { + } + + + public void visitInnerClasses( InnerClasses obj ) { + } + + + public void visitJavaClass( JavaClass obj ) { + } + + + public void visitLineNumber( LineNumber obj ) { + } + + + public void visitLineNumberTable( LineNumberTable obj ) { + } + + + public void visitLocalVariable( LocalVariable obj ) { + } + + + public void visitLocalVariableTable( LocalVariableTable obj ) { + } + + + public void visitMethod( Method obj ) { + } + + + public void visitSignature( Signature obj ) { + } + + + public void visitSourceFile( SourceFile obj ) { + } + + + public void visitSynthetic( Synthetic obj ) { + } + + + public void visitUnknown( Unknown obj ) { + } + + + public void visitStackMap( StackMap obj ) { + } + + + public void visitStackMapEntry( StackMapEntry obj ) { + } } diff --git a/src/java/org/apache/bcel/classfile/ExceptionTable.java b/src/java/org/apache/bcel/classfile/ExceptionTable.java index 420633ef..aeb036d0 100644 --- a/src/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/java/org/apache/bcel/classfile/ExceptionTable.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -35,138 +34,147 @@ import org.apache.bcel.Constants; * @see Code */ public final class ExceptionTable extends Attribute { - private int number_of_exceptions; // Table of indices into - private int[] exception_index_table; // constant pool - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use copy() for a physical copy. - */ - public ExceptionTable(ExceptionTable c) { - this(c.getNameIndex(), c.getLength(), c.getExceptionIndexTable(), - c.getConstantPool()); - } - - /** - * @param name_index Index in constant pool - * @param length Content length in bytes - * @param exception_index_table Table of indices in constant pool - * @param constant_pool Array of constants - */ - public ExceptionTable(int name_index, int length, - int[] exception_index_table, - ConstantPool constant_pool) - { - super(Constants.ATTR_EXCEPTIONS, name_index, length, constant_pool); - setExceptionIndexTable(exception_index_table); - } - - /** - * Construct object from file stream. - * @param name_index Index in constant pool - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - * @throws IOException - */ - ExceptionTable(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(name_index, length, (int[])null, constant_pool); - - number_of_exceptions = file.readUnsignedShort(); - exception_index_table = new int[number_of_exceptions]; - - for(int i=0; i < number_of_exceptions; i++) - exception_index_table[i] = file.readUnsignedShort(); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionTable(this); - } - - /** - * Dump exceptions attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - file.writeShort(number_of_exceptions); - for(int i=0; i < number_of_exceptions; i++) - file.writeShort(exception_index_table[i]); - } - - /** - * @return Array of indices into constant pool of thrown exceptions. - */ - public final int[] getExceptionIndexTable() {return exception_index_table;} - /** - * @return Length of exception table. - */ - public final int getNumberOfExceptions() { return number_of_exceptions; } - - /** - * @return class names of thrown exceptions - */ - public final String[] getExceptionNames() { - String[] names = new String[number_of_exceptions]; - for(int i=0; i < number_of_exceptions; i++) - names[i] = constant_pool.getConstantString(exception_index_table[i], - Constants.CONSTANT_Class). - replace('/', '.'); - return names; - } - - /** - * @param exception_index_table the list of exception indexes - * Also redefines number_of_exceptions according to table length. - */ - public final void setExceptionIndexTable(int[] exception_index_table) { - this.exception_index_table = exception_index_table; - number_of_exceptions = (exception_index_table == null)? 0 : - exception_index_table.length; - } - /** - * @return String representation, i.e., a list of thrown exceptions. - */ - public final String toString() { - StringBuffer buf = new StringBuffer(""); - String str; - - for(int i=0; i < number_of_exceptions; i++) { - str = constant_pool.getConstantString(exception_index_table[i], - Constants.CONSTANT_Class); - buf.append(Utility.compactClassName(str, false)); - - if(i < number_of_exceptions - 1) - buf.append(", "); + + private int number_of_exceptions; // Table of indices into + private int[] exception_index_table; // constant pool + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use copy() for a physical copy. + */ + public ExceptionTable(ExceptionTable c) { + this(c.getNameIndex(), c.getLength(), c.getExceptionIndexTable(), c.getConstantPool()); + } + + + /** + * @param name_index Index in constant pool + * @param length Content length in bytes + * @param exception_index_table Table of indices in constant pool + * @param constant_pool Array of constants + */ + public ExceptionTable(int name_index, int length, int[] exception_index_table, + ConstantPool constant_pool) { + super(Constants.ATTR_EXCEPTIONS, name_index, length, constant_pool); + setExceptionIndexTable(exception_index_table); } - return buf.toString(); - } - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool _constant_pool) { - ExceptionTable c = (ExceptionTable)clone(); + /** + * Construct object from file stream. + * @param name_index Index in constant pool + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + ExceptionTable(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, (int[]) null, constant_pool); + number_of_exceptions = file.readUnsignedShort(); + exception_index_table = new int[number_of_exceptions]; + for (int i = 0; i < number_of_exceptions; i++) { + exception_index_table[i] = file.readUnsignedShort(); + } + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionTable(this); + } + + + /** + * Dump exceptions attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + file.writeShort(number_of_exceptions); + for (int i = 0; i < number_of_exceptions; i++) { + file.writeShort(exception_index_table[i]); + } + } + + + /** + * @return Array of indices into constant pool of thrown exceptions. + */ + public final int[] getExceptionIndexTable() { + return exception_index_table; + } + + + /** + * @return Length of exception table. + */ + public final int getNumberOfExceptions() { + return number_of_exceptions; + } + + + /** + * @return class names of thrown exceptions + */ + public final String[] getExceptionNames() { + String[] names = new String[number_of_exceptions]; + for (int i = 0; i < number_of_exceptions; i++) { + names[i] = constant_pool.getConstantString(exception_index_table[i], + Constants.CONSTANT_Class).replace('/', '.'); + } + return names; + } + + + /** + * @param exception_index_table the list of exception indexes + * Also redefines number_of_exceptions according to table length. + */ + public final void setExceptionIndexTable( int[] exception_index_table ) { + this.exception_index_table = exception_index_table; + number_of_exceptions = (exception_index_table == null) ? 0 : exception_index_table.length; + } + + + /** + * @return String representation, i.e., a list of thrown exceptions. + */ + public final String toString() { + StringBuffer buf = new StringBuffer(""); + String str; + for (int i = 0; i < number_of_exceptions; i++) { + str = constant_pool.getConstantString(exception_index_table[i], + Constants.CONSTANT_Class); + buf.append(Utility.compactClassName(str, false)); + if (i < number_of_exceptions - 1) { + buf.append(", "); + } + } + return buf.toString(); + } + - if (exception_index_table != null) { - c.exception_index_table = new int[exception_index_table.length]; - System.arraycopy(exception_index_table, 0, c.exception_index_table, 0, exception_index_table.length); + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + ExceptionTable c = (ExceptionTable) clone(); + if (exception_index_table != null) { + c.exception_index_table = new int[exception_index_table.length]; + System.arraycopy(exception_index_table, 0, c.exception_index_table, 0, + exception_index_table.length); + } + c.constant_pool = _constant_pool; + return c; } - - c.constant_pool = _constant_pool; - return c; - } } diff --git a/src/java/org/apache/bcel/classfile/Field.java b/src/java/org/apache/bcel/classfile/Field.java index 4d438821..29db8a42 100644 --- a/src/java/org/apache/bcel/classfile/Field.java +++ b/src/java/org/apache/bcel/classfile/Field.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; import java.io.DataInputStream; @@ -30,154 +30,161 @@ import org.apache.bcel.util.BCELComparator; * @author M. Dahm */ public final class Field extends FieldOrMethod { - private static BCELComparator _cmp = new BCELComparator() { - public boolean equals(Object o1, Object o2) { - Field THIS = (Field)o1; - Field THAT = (Field)o2; - return THIS.getName().equals(THAT.getName()) - && THIS.getSignature().equals(THAT.getSignature()); + private static BCELComparator _cmp = new BCELComparator() { + + public boolean equals( Object o1, Object o2 ) { + Field THIS = (Field) o1; + Field THAT = (Field) o2; + return THIS.getName().equals(THAT.getName()) + && THIS.getSignature().equals(THAT.getSignature()); + } + + + public int hashCode( Object o ) { + Field THIS = (Field) o; + return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + } + }; + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public Field(Field c) { + super(c); + } + + + /** + * Construct object from file stream. + * @param file Input stream + */ + Field(DataInputStream file, ConstantPool constant_pool) throws IOException, + ClassFormatException { + super(file, constant_pool); } - public int hashCode(Object o) { - Field THIS = (Field)o; - return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + + /** + * @param access_flags Access rights of field + * @param name_index Points to field name in constant pool + * @param signature_index Points to encoded signature + * @param attributes Collection of attributes + * @param constant_pool Array of constants + */ + public Field(int access_flags, int name_index, int signature_index, Attribute[] attributes, + ConstantPool constant_pool) { + super(access_flags, name_index, signature_index, attributes, constant_pool); } - }; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public Field(Field c) { - super(c); - } - - /** - * Construct object from file stream. - * @param file Input stream - */ - Field(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatException { - super(file, constant_pool); - } - - /** - * @param access_flags Access rights of field - * @param name_index Points to field name in constant pool - * @param signature_index Points to encoded signature - * @param attributes Collection of attributes - * @param constant_pool Array of constants - */ - public Field( - int access_flags, - int name_index, - int signature_index, - Attribute[] attributes, - ConstantPool constant_pool) { - super(access_flags, name_index, signature_index, attributes, constant_pool); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitField(this); - } - - /** - * @return constant value associated with this field (may be null) - */ - public final ConstantValue getConstantValue() { - for (int i = 0; i < attributes_count; i++) - if (attributes[i].getTag() == Constants.ATTR_CONSTANT_VALUE) - return (ConstantValue)attributes[i]; - - return null; - } - - /** - * Return string representation close to declaration format, - * `public static final short MAX = 100', e.g.. - * - * @return String representation of field, including the signature. - */ - public final String toString() { - String name, signature, access; // Short cuts to constant pool - - // Get names from constant pool - access = Utility.accessToString(access_flags); - access = access.equals("") ? "" : (access + " "); - signature = Utility.signatureToString(getSignature()); - name = getName(); - - StringBuffer buf = new StringBuffer(64); - buf.append(access).append(signature).append(" ").append(name); - ConstantValue cv = getConstantValue(); - - if (cv != null) - buf.append(" = ").append(cv); - - for (int i = 0; i < attributes_count; i++) { - Attribute a = attributes[i]; - - if (!(a instanceof ConstantValue)) - buf.append(" [").append(a.toString()).append("]"); + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitField(this); + } + + + /** + * @return constant value associated with this field (may be null) + */ + public final ConstantValue getConstantValue() { + for (int i = 0; i < attributes_count; i++) { + if (attributes[i].getTag() == Constants.ATTR_CONSTANT_VALUE) { + return (ConstantValue) attributes[i]; + } + } + return null; + } + + + /** + * Return string representation close to declaration format, + * `public static final short MAX = 100', e.g.. + * + * @return String representation of field, including the signature. + */ + public final String toString() { + String name, signature, access; // Short cuts to constant pool + // Get names from constant pool + access = Utility.accessToString(access_flags); + access = access.equals("") ? "" : (access + " "); + signature = Utility.signatureToString(getSignature()); + name = getName(); + StringBuffer buf = new StringBuffer(64); + buf.append(access).append(signature).append(" ").append(name); + ConstantValue cv = getConstantValue(); + if (cv != null) { + buf.append(" = ").append(cv); + } + for (int i = 0; i < attributes_count; i++) { + Attribute a = attributes[i]; + if (!(a instanceof ConstantValue)) { + buf.append(" [").append(a.toString()).append("]"); + } + } + return buf.toString(); } - return buf.toString(); - } - - /** - * @return deep copy of this field - */ - public final Field copy(ConstantPool _constant_pool) { - return (Field)copy_(_constant_pool); - } - - /** - * @return type of field - */ - public Type getType() { - return Type.getReturnType(getSignature()); - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default two Field objects are said to be equal when - * their names and signatures are equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default return the hashcode of the field's name XOR signature. - * - * @see java.lang.Object#hashCode() - */ - public int hashCode() { - return _cmp.hashCode(this); - } + + /** + * @return deep copy of this field + */ + public final Field copy( ConstantPool _constant_pool ) { + return (Field) copy_(_constant_pool); + } + + + /** + * @return type of field + */ + public Type getType() { + return Type.getReturnType(getSignature()); + } + + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; + } + + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator( BCELComparator comparator ) { + _cmp = comparator; + } + + + /** + * Return value as defined by given BCELComparator strategy. + * By default two Field objects are said to be equal when + * their names and signatures are equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals( Object obj ) { + return _cmp.equals(this, obj); + } + + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the field's name XOR signature. + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); + } } diff --git a/src/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/java/org/apache/bcel/classfile/FieldOrMethod.java index 9e0a6d95..0d1adcd3 100644 --- a/src/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; import java.io.DataInputStream; @@ -27,187 +27,180 @@ import org.apache.bcel.Constants; * @version $Id$ * @author M. Dahm */ -public abstract class FieldOrMethod extends AccessFlags - implements Cloneable, Node -{ - protected int name_index; // Points to field name in constant pool - protected int signature_index; // Points to encoded signature - protected int attributes_count; // No. of attributes - protected Attribute[] attributes; // Collection of attributes - protected ConstantPool constant_pool; - - FieldOrMethod() { - } - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - protected FieldOrMethod(FieldOrMethod c) { - this( - c.getAccessFlags(), - c.getNameIndex(), - c.getSignatureIndex(), - c.getAttributes(), - c.getConstantPool()); - } - - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - * @throws ClassFormatException - */ - protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatException { - this( - file.readUnsignedShort(), - file.readUnsignedShort(), - file.readUnsignedShort(), - null, - constant_pool); - - attributes_count = file.readUnsignedShort(); - attributes = new Attribute[attributes_count]; - for (int i = 0; i < attributes_count; i++) - attributes[i] = Attribute.readAttribute(file, constant_pool); - } - - /** - * @param access_flags Access rights of method - * @param name_index Points to field name in constant pool - * @param signature_index Points to encoded signature - * @param attributes Collection of attributes - * @param constant_pool Array of constants - */ - protected FieldOrMethod( - int access_flags, - int name_index, - int signature_index, - Attribute[] attributes, - ConstantPool constant_pool) { - this.access_flags = access_flags; - this.name_index = name_index; - this.signature_index = signature_index; - this.constant_pool = constant_pool; - - setAttributes(attributes); - } - - /** - * Dump object to file stream on binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException { - file.writeShort(access_flags); - file.writeShort(name_index); - file.writeShort(signature_index); - file.writeShort(attributes_count); - - for (int i = 0; i < attributes_count; i++) - attributes[i].dump(file); - } - - /** - * @return Collection of object attributes. - */ - public final Attribute[] getAttributes() { - return attributes; - } - - /** - * @param attributes Collection of object attributes. - */ - public final void setAttributes(Attribute[] attributes) { - this.attributes = attributes; - attributes_count = (attributes == null) ? 0 : attributes.length; - } - - /** - * @return Constant pool used by this object. - */ - public final ConstantPool getConstantPool() { - return constant_pool; - } - - /** - * @param constant_pool Constant pool to be used for this object. - */ - public final void setConstantPool(ConstantPool constant_pool) { - this.constant_pool = constant_pool; - } - - /** - * @return Index in constant pool of object's name. - */ - public final int getNameIndex() { - return name_index; - } - - /** - * @param name_index Index in constant pool of object's name. - */ - public final void setNameIndex(int name_index) { - this.name_index = name_index; - } - - /** - * @return Index in constant pool of field signature. - */ - public final int getSignatureIndex() { - return signature_index; - } - - /** - * @param signature_index Index in constant pool of field signature. - */ - public final void setSignatureIndex(int signature_index) { - this.signature_index = signature_index; - } - - /** - * @return Name of object, i.e., method name or field name - */ - public final String getName() { - ConstantUtf8 c; - c = - (ConstantUtf8)constant_pool.getConstant( - name_index, - Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return String representation of object's type signature (java style) - */ - public final String getSignature() { - ConstantUtf8 c; - c = - (ConstantUtf8)constant_pool.getConstant( - signature_index, - Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return deep copy of this field - */ - protected FieldOrMethod copy_(ConstantPool _constant_pool) { - - try { - FieldOrMethod c = (FieldOrMethod)clone(); - c.constant_pool = _constant_pool; - c.attributes = new Attribute[attributes_count]; - - for (int i = 0; i < attributes_count; i++) - c.attributes[i] = attributes[i].copy(_constant_pool); - - return c; - } catch (CloneNotSupportedException e) { - return null; - } - - } +public abstract class FieldOrMethod extends AccessFlags implements Cloneable, Node { + + protected int name_index; // Points to field name in constant pool + protected int signature_index; // Points to encoded signature + protected int attributes_count; // No. of attributes + protected Attribute[] attributes; // Collection of attributes + protected ConstantPool constant_pool; + + + FieldOrMethod() { + } + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + protected FieldOrMethod(FieldOrMethod c) { + this(c.getAccessFlags(), c.getNameIndex(), c.getSignatureIndex(), c.getAttributes(), c + .getConstantPool()); + } + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + * @throws ClassFormatException + */ + protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) throws IOException, + ClassFormatException { + this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), null, + constant_pool); + attributes_count = file.readUnsignedShort(); + attributes = new Attribute[attributes_count]; + for (int i = 0; i < attributes_count; i++) { + attributes[i] = Attribute.readAttribute(file, constant_pool); + } + } + + + /** + * @param access_flags Access rights of method + * @param name_index Points to field name in constant pool + * @param signature_index Points to encoded signature + * @param attributes Collection of attributes + * @param constant_pool Array of constants + */ + protected FieldOrMethod(int access_flags, int name_index, int signature_index, + Attribute[] attributes, ConstantPool constant_pool) { + this.access_flags = access_flags; + this.name_index = name_index; + this.signature_index = signature_index; + this.constant_pool = constant_pool; + setAttributes(attributes); + } + + + /** + * Dump object to file stream on binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeShort(access_flags); + file.writeShort(name_index); + file.writeShort(signature_index); + file.writeShort(attributes_count); + for (int i = 0; i < attributes_count; i++) { + attributes[i].dump(file); + } + } + + + /** + * @return Collection of object attributes. + */ + public final Attribute[] getAttributes() { + return attributes; + } + + + /** + * @param attributes Collection of object attributes. + */ + public final void setAttributes( Attribute[] attributes ) { + this.attributes = attributes; + attributes_count = (attributes == null) ? 0 : attributes.length; + } + + + /** + * @return Constant pool used by this object. + */ + public final ConstantPool getConstantPool() { + return constant_pool; + } + + + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool( ConstantPool constant_pool ) { + this.constant_pool = constant_pool; + } + + + /** + * @return Index in constant pool of object's name. + */ + public final int getNameIndex() { + return name_index; + } + + + /** + * @param name_index Index in constant pool of object's name. + */ + public final void setNameIndex( int name_index ) { + this.name_index = name_index; + } + + + /** + * @return Index in constant pool of field signature. + */ + public final int getSignatureIndex() { + return signature_index; + } + + + /** + * @param signature_index Index in constant pool of field signature. + */ + public final void setSignatureIndex( int signature_index ) { + this.signature_index = signature_index; + } + + + /** + * @return Name of object, i.e., method name or field name + */ + public final String getName() { + ConstantUtf8 c; + c = (ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + + /** + * @return String representation of object's type signature (java style) + */ + public final String getSignature() { + ConstantUtf8 c; + c = (ConstantUtf8) constant_pool.getConstant(signature_index, Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + + /** + * @return deep copy of this field + */ + protected FieldOrMethod copy_( ConstantPool _constant_pool ) { + try { + FieldOrMethod c = (FieldOrMethod) clone(); + c.constant_pool = _constant_pool; + c.attributes = new Attribute[attributes_count]; + for (int i = 0; i < attributes_count; i++) { + c.attributes[i] = attributes[i].copy(_constant_pool); + } + return c; + } catch (CloneNotSupportedException e) { + return null; + } + } } diff --git a/src/java/org/apache/bcel/classfile/InnerClass.java b/src/java/org/apache/bcel/classfile/InnerClass.java index fb3b2a98..7bee7a27 100644 --- a/src/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/java/org/apache/bcel/classfile/InnerClass.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -33,155 +32,183 @@ import org.apache.bcel.Constants; * @see InnerClasses */ public final class InnerClass implements Cloneable, Node, Serializable { - private int inner_class_index; - private int outer_class_index; - private int inner_name_index; - private int inner_access_flags; - - /** - * Initialize from another object. - */ - public InnerClass(InnerClass c) { - this(c.getInnerClassIndex(), c.getOuterClassIndex(), c.getInnerNameIndex(), - c.getInnerAccessFlags()); - } - - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - */ - InnerClass(DataInputStream file) throws IOException - { - this(file.readUnsignedShort(), file.readUnsignedShort(), - file.readUnsignedShort(), file.readUnsignedShort()); - } - - /** - * @param inner_class_index Class index in constant pool of inner class - * @param outer_class_index Class index in constant pool of outer class - * @param inner_name_index Name index in constant pool of inner class - * @param inner_access_flags Access flags of inner class - */ - public InnerClass(int inner_class_index, int outer_class_index, - int inner_name_index, int inner_access_flags) - { - this.inner_class_index = inner_class_index; - this.outer_class_index = outer_class_index; - this.inner_name_index = inner_name_index; - this.inner_access_flags = inner_access_flags; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitInnerClass(this); - } - /** - * Dump inner class attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeShort(inner_class_index); - file.writeShort(outer_class_index); - file.writeShort(inner_name_index); - file.writeShort(inner_access_flags); - } - /** - * @return access flags of inner class. - */ - public final int getInnerAccessFlags() { return inner_access_flags; } - /** - * @return class index of inner class. - */ - public final int getInnerClassIndex() { return inner_class_index; } - /** - * @return name index of inner class. - */ - public final int getInnerNameIndex() { return inner_name_index; } - /** - * @return class index of outer class. - */ - public final int getOuterClassIndex() { return outer_class_index; } - /** - * @param inner_access_flags access flags for this inner class - */ - public final void setInnerAccessFlags(int inner_access_flags) { - this.inner_access_flags = inner_access_flags; - } - /** - * @param inner_class_index index into the constant pool for this class - */ - public final void setInnerClassIndex(int inner_class_index) { - this.inner_class_index = inner_class_index; - } - /** - * @param inner_name_index index into the constant pool for this class's name - */ - public final void setInnerNameIndex(int inner_name_index) { - this.inner_name_index = inner_name_index; - } - /** - * @param outer_class_index index into the constant pool for the owning class - */ - public final void setOuterClassIndex(int outer_class_index) { - this.outer_class_index = outer_class_index; - } - /** - * @return String representation. - */ - public final String toString() { - return "InnerClass(" + inner_class_index + ", " + outer_class_index + - ", " + inner_name_index + ", " + inner_access_flags + ")"; - } - - /** - * @return Resolved string representation - */ - public final String toString(ConstantPool constant_pool) { - String inner_class_name, outer_class_name, inner_name, access; - - inner_class_name = constant_pool.getConstantString(inner_class_index, - Constants.CONSTANT_Class); - inner_class_name = Utility.compactClassName(inner_class_name); - - if (outer_class_index != 0) { - outer_class_name = constant_pool.getConstantString(outer_class_index, - Constants.CONSTANT_Class); - outer_class_name = Utility.compactClassName(outer_class_name); - } - else - outer_class_name = ""; - - if(inner_name_index != 0) - inner_name = ((ConstantUtf8)constant_pool. - getConstant(inner_name_index, Constants.CONSTANT_Utf8)).getBytes(); - else - inner_name = ""; - - access = Utility.accessToString(inner_access_flags, true); - access = access.equals("")? "" : (access + " "); - - return "InnerClass:" + access + inner_class_name + - "(\"" + outer_class_name + "\", \"" + inner_name + "\")"; - } - - /** - * @return deep copy of this object - */ - public InnerClass copy() { - try { - return (InnerClass)clone(); - } catch(CloneNotSupportedException e) {} - - return null; - } + + private int inner_class_index; + private int outer_class_index; + private int inner_name_index; + private int inner_access_flags; + + + /** + * Initialize from another object. + */ + public InnerClass(InnerClass c) { + this(c.getInnerClassIndex(), c.getOuterClassIndex(), c.getInnerNameIndex(), c + .getInnerAccessFlags()); + } + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + InnerClass(DataInputStream file) throws IOException { + this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), file + .readUnsignedShort()); + } + + + /** + * @param inner_class_index Class index in constant pool of inner class + * @param outer_class_index Class index in constant pool of outer class + * @param inner_name_index Name index in constant pool of inner class + * @param inner_access_flags Access flags of inner class + */ + public InnerClass(int inner_class_index, int outer_class_index, int inner_name_index, + int inner_access_flags) { + this.inner_class_index = inner_class_index; + this.outer_class_index = outer_class_index; + this.inner_name_index = inner_name_index; + this.inner_access_flags = inner_access_flags; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitInnerClass(this); + } + + + /** + * Dump inner class attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeShort(inner_class_index); + file.writeShort(outer_class_index); + file.writeShort(inner_name_index); + file.writeShort(inner_access_flags); + } + + + /** + * @return access flags of inner class. + */ + public final int getInnerAccessFlags() { + return inner_access_flags; + } + + + /** + * @return class index of inner class. + */ + public final int getInnerClassIndex() { + return inner_class_index; + } + + + /** + * @return name index of inner class. + */ + public final int getInnerNameIndex() { + return inner_name_index; + } + + + /** + * @return class index of outer class. + */ + public final int getOuterClassIndex() { + return outer_class_index; + } + + + /** + * @param inner_access_flags access flags for this inner class + */ + public final void setInnerAccessFlags( int inner_access_flags ) { + this.inner_access_flags = inner_access_flags; + } + + + /** + * @param inner_class_index index into the constant pool for this class + */ + public final void setInnerClassIndex( int inner_class_index ) { + this.inner_class_index = inner_class_index; + } + + + /** + * @param inner_name_index index into the constant pool for this class's name + */ + public final void setInnerNameIndex( int inner_name_index ) { + this.inner_name_index = inner_name_index; + } + + + /** + * @param outer_class_index index into the constant pool for the owning class + */ + public final void setOuterClassIndex( int outer_class_index ) { + this.outer_class_index = outer_class_index; + } + + + /** + * @return String representation. + */ + public final String toString() { + return "InnerClass(" + inner_class_index + ", " + outer_class_index + ", " + + inner_name_index + ", " + inner_access_flags + ")"; + } + + + /** + * @return Resolved string representation + */ + public final String toString( ConstantPool constant_pool ) { + String inner_class_name, outer_class_name, inner_name, access; + inner_class_name = constant_pool.getConstantString(inner_class_index, + Constants.CONSTANT_Class); + inner_class_name = Utility.compactClassName(inner_class_name); + if (outer_class_index != 0) { + outer_class_name = constant_pool.getConstantString(outer_class_index, + Constants.CONSTANT_Class); + outer_class_name = Utility.compactClassName(outer_class_name); + } else { + outer_class_name = ""; + } + if (inner_name_index != 0) { + inner_name = ((ConstantUtf8) constant_pool.getConstant(inner_name_index, + Constants.CONSTANT_Utf8)).getBytes(); + } else { + inner_name = ""; + } + access = Utility.accessToString(inner_access_flags, true); + access = access.equals("") ? "" : (access + " "); + return "InnerClass:" + access + inner_class_name + "(\"" + outer_class_name + "\", \"" + + inner_name + "\")"; + } + + + /** + * @return deep copy of this object + */ + public InnerClass copy() { + try { + return (InnerClass) clone(); + } catch (CloneNotSupportedException e) { + } + return null; + } } diff --git a/src/java/org/apache/bcel/classfile/InnerClasses.java b/src/java/org/apache/bcel/classfile/InnerClasses.java index 21baa114..34a7a7e0 100644 --- a/src/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/java/org/apache/bcel/classfile/InnerClasses.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -33,113 +32,119 @@ import org.apache.bcel.Constants; * @see Attribute */ public final class InnerClasses extends Attribute { - private InnerClass[] inner_classes; - private int number_of_classes; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public InnerClasses(InnerClasses c) { - this(c.getNameIndex(), c.getLength(), c.getInnerClasses(), - c.getConstantPool()); - } - - /** - * @param name_index Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes - * @param inner_classes array of inner classes attributes - * @param constant_pool Array of constants - */ - public InnerClasses(int name_index, int length, - InnerClass[] inner_classes, - ConstantPool constant_pool) - { - super(Constants.ATTR_INNER_CLASSES, name_index, length, constant_pool); - setInnerClasses(inner_classes); - } - - /** - * Construct object from file stream. - * - * @param name_index Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - * @throws IOException - */ - InnerClasses(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(name_index, length, (InnerClass[])null, constant_pool); - - number_of_classes = file.readUnsignedShort(); - inner_classes = new InnerClass[number_of_classes]; - - for(int i=0; i < number_of_classes; i++) - inner_classes[i] = new InnerClass(file); - } - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitInnerClasses(this); - } - /** - * Dump source file attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - file.writeShort(number_of_classes); - - for(int i=0; i < number_of_classes; i++) - inner_classes[i].dump(file); - } - - /** - * @return array of inner class "records" - */ - public final InnerClass[] getInnerClasses() { return inner_classes; } - - /** - * @param inner_classes the array of inner classes - */ - public final void setInnerClasses(InnerClass[] inner_classes) { - this.inner_classes = inner_classes; - number_of_classes = (inner_classes == null)? 0 : inner_classes.length; - } - - /** - * @return String representation. - */ - public final String toString() { - StringBuffer buf = new StringBuffer(); - - for(int i=0; i < number_of_classes; i++) - buf.append(inner_classes[i].toString(constant_pool)).append("\n"); - - return buf.toString(); - } - - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool _constant_pool) { - InnerClasses c = (InnerClasses)clone(); - - c.inner_classes = new InnerClass[number_of_classes]; - for(int i=0; i < number_of_classes; i++) - c.inner_classes[i] = inner_classes[i].copy(); - - c.constant_pool = _constant_pool; - return c; - } + + private InnerClass[] inner_classes; + private int number_of_classes; + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public InnerClasses(InnerClasses c) { + this(c.getNameIndex(), c.getLength(), c.getInnerClasses(), c.getConstantPool()); + } + + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param inner_classes array of inner classes attributes + * @param constant_pool Array of constants + */ + public InnerClasses(int name_index, int length, InnerClass[] inner_classes, + ConstantPool constant_pool) { + super(Constants.ATTR_INNER_CLASSES, name_index, length, constant_pool); + setInnerClasses(inner_classes); + } + + + /** + * Construct object from file stream. + * + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + InnerClasses(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, (InnerClass[]) null, constant_pool); + number_of_classes = file.readUnsignedShort(); + inner_classes = new InnerClass[number_of_classes]; + for (int i = 0; i < number_of_classes; i++) { + inner_classes[i] = new InnerClass(file); + } + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitInnerClasses(this); + } + + + /** + * Dump source file attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + file.writeShort(number_of_classes); + for (int i = 0; i < number_of_classes; i++) { + inner_classes[i].dump(file); + } + } + + + /** + * @return array of inner class "records" + */ + public final InnerClass[] getInnerClasses() { + return inner_classes; + } + + + /** + * @param inner_classes the array of inner classes + */ + public final void setInnerClasses( InnerClass[] inner_classes ) { + this.inner_classes = inner_classes; + number_of_classes = (inner_classes == null) ? 0 : inner_classes.length; + } + + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < number_of_classes; i++) { + buf.append(inner_classes[i].toString(constant_pool)).append("\n"); + } + return buf.toString(); + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + InnerClasses c = (InnerClasses) clone(); + c.inner_classes = new InnerClass[number_of_classes]; + for (int i = 0; i < number_of_classes; i++) { + c.inner_classes[i] = inner_classes[i].copy(); + } + c.constant_pool = _constant_pool; + return c; + } } diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/java/org/apache/bcel/classfile/JavaClass.java index 5c78a33b..27bdf02a 100644 --- a/src/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/java/org/apache/bcel/classfile/JavaClass.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; @@ -47,851 +46,821 @@ import org.apache.bcel.util.SyntheticRepository; * @author M. Dahm */ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparable { - private String file_name; - private String package_name; - private String source_file_name = ""; - private int class_name_index; - private int superclass_name_index; - private String class_name; - private String superclass_name; - private int major, minor; // Compiler version - private ConstantPool constant_pool; // Constant pool - private int[] interfaces; // implemented interfaces - private String[] interface_names; - private Field[] fields; // Fields, i.e., variables of class - private Method[] methods; // methods defined in the class - private Attribute[] attributes; // attributes defined in the class - private byte source = HEAP; // Generated in memory - - public static final byte HEAP = 1; - public static final byte FILE = 2; - public static final byte ZIP = 3; - - static boolean debug = false; // Debugging on/off - static char sep = '/'; // directory separator - - private static BCELComparator _cmp = new BCELComparator() { - public boolean equals(Object o1, Object o2) { - JavaClass THIS = (JavaClass)o1; - JavaClass THAT = (JavaClass)o2; - - return THIS.getClassName().equals(THAT.getClassName()); - } - - public int hashCode(Object o) { - JavaClass THIS = (JavaClass)o; - return THIS.getClassName().hashCode(); - } - }; - - /** - * In cases where we go ahead and create something, - * use the default SyntheticRepository, because we - * don't know any better. - */ - private transient org.apache.bcel.util.Repository repository = - SyntheticRepository.getInstance(); - - /** - * Constructor gets all contents as arguments. - * - * @param class_name_index Index into constant pool referencing a - * ConstantClass that represents this class. - * @param superclass_name_index Index into constant pool referencing a - * ConstantClass that represents this class's superclass. - * @param file_name File name - * @param major Major compiler version - * @param minor Minor compiler version - * @param access_flags Access rights defined by bit flags - * @param constant_pool Array of constants - * @param interfaces Implemented interfaces - * @param fields Class fields - * @param methods Class methods - * @param attributes Class attributes - * @param source Read from file or generated in memory? - */ - public JavaClass( - int class_name_index, - int superclass_name_index, - String file_name, - int major, - int minor, - int access_flags, - ConstantPool constant_pool, - int[] interfaces, - Field[] fields, - Method[] methods, - Attribute[] attributes, - byte source) { - if (interfaces == null) // Allowed for backward compatibility - interfaces = new int[0]; - if (attributes == null) - attributes = new Attribute[0]; - if (fields == null) - fields = new Field[0]; - if (methods == null) - methods = new Method[0]; - - this.class_name_index = class_name_index; - this.superclass_name_index = superclass_name_index; - this.file_name = file_name; - this.major = major; - this.minor = minor; - this.access_flags = access_flags; - this.constant_pool = constant_pool; - this.interfaces = interfaces; - this.fields = fields; - this.methods = methods; - this.attributes = attributes; - this.source = source; - - // Get source file name if available - for (int i = 0; i < attributes.length; i++) { - if (attributes[i] instanceof SourceFile) { - source_file_name = ((SourceFile)attributes[i]).getSourceFileName(); - break; - } - } - - /* According to the specification the following entries must be of type - * `ConstantClass' but we check that anyway via the - * `ConstPool.getConstant' method. - */ - class_name = - constant_pool.getConstantString( - class_name_index, - Constants.CONSTANT_Class); - class_name = Utility.compactClassName(class_name, false); - - int index = class_name.lastIndexOf('.'); - if (index < 0) - package_name = ""; - else - package_name = class_name.substring(0, index); - - if (superclass_name_index > 0) { - // May be zero -> class is java.lang.Object - superclass_name = - constant_pool.getConstantString( - superclass_name_index, - Constants.CONSTANT_Class); - superclass_name = Utility.compactClassName(superclass_name, false); - } else - superclass_name = "java.lang.Object"; - - interface_names = new String[interfaces.length]; - for (int i = 0; i < interfaces.length; i++) { - String str = - constant_pool.getConstantString( - interfaces[i], - Constants.CONSTANT_Class); - interface_names[i] = Utility.compactClassName(str, false); - } - } - - /** - * Constructor gets all contents as arguments. - * - * @param class_name_index Class name - * @param superclass_name_index Superclass name - * @param file_name File name - * @param major Major compiler version - * @param minor Minor compiler version - * @param access_flags Access rights defined by bit flags - * @param constant_pool Array of constants - * @param interfaces Implemented interfaces - * @param fields Class fields - * @param methods Class methods - * @param attributes Class attributes - */ - public JavaClass( - int class_name_index, - int superclass_name_index, - String file_name, - int major, - int minor, - int access_flags, - ConstantPool constant_pool, - int[] interfaces, - Field[] fields, - Method[] methods, - Attribute[] attributes) { - this( - class_name_index, - superclass_name_index, - file_name, - major, - minor, - access_flags, - constant_pool, - interfaces, - fields, - methods, - attributes, - HEAP); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitJavaClass(this); - } - - /* Print debug information depending on `JavaClass.debug' - */ - static final void Debug(String str) { - if (debug) - System.out.println(str); - } - - /** - * Dump class to a file. - * - * @param file Output file - * @throws IOException - */ - public void dump(File file) throws IOException { - String parent = file.getParent(); - - if (parent != null) { - File dir = new File(parent); - dir.mkdirs(); - } - - DataOutputStream dos = null; - try { - dos = new DataOutputStream(new FileOutputStream(file)); - dump(dos); - } - finally { - if (dos != null) - dos.close(); - } - } - - /** - * Dump class to a file named file_name. - * - * @param _file_name Output file name - * @exception IOException - */ - public void dump(String _file_name) throws IOException { - dump(new File(_file_name)); - } - - /** - * @return class in binary format - */ - public byte[] getBytes() { - ByteArrayOutputStream s = new ByteArrayOutputStream(); - DataOutputStream ds = new DataOutputStream(s); - - try { - dump(ds); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - ds.close(); - } catch (IOException e2) { - e2.printStackTrace(); - } - } - - return s.toByteArray(); - } - - /** - * Dump Java class to output stream in binary format. - * - * @param file Output stream - * @exception IOException - */ - public void dump(OutputStream file) throws IOException { - dump(new DataOutputStream(file)); - } - - /** - * Dump Java class to output stream in binary format. - * - * @param file Output stream - * @exception IOException - */ - public void dump(DataOutputStream file) throws IOException { - file.writeInt(0xcafebabe); - file.writeShort(minor); - file.writeShort(major); - - constant_pool.dump(file); - - file.writeShort(access_flags); - file.writeShort(class_name_index); - file.writeShort(superclass_name_index); - - file.writeShort(interfaces.length); - for (int i = 0; i < interfaces.length; i++) - file.writeShort(interfaces[i]); - - file.writeShort(fields.length); - for (int i = 0; i < fields.length; i++) - fields[i].dump(file); - - file.writeShort(methods.length); - for (int i = 0; i < methods.length; i++) - methods[i].dump(file); - - if (attributes != null) { - file.writeShort(attributes.length); - for (int i = 0; i < attributes.length; i++) - attributes[i].dump(file); - } else - file.writeShort(0); - file.flush(); - } - - /** - * @return Attributes of the class. - */ - public Attribute[] getAttributes() { - return attributes; - } - - /** - * @return Class name. - */ - public String getClassName() { - return class_name; - } - - /** - * @return Package name. - */ - public String getPackageName() { - return package_name; - } - - /** - * @return Class name index. - */ - public int getClassNameIndex() { - return class_name_index; - } - - /** - * @return Constant pool. - */ - public ConstantPool getConstantPool() { - return constant_pool; - } - - /** - * @return Fields, i.e., variables of the class. Like the JVM spec - * mandates for the classfile format, these fields are those specific to - * this class, and not those of the superclass or superinterfaces. - */ - public Field[] getFields() { - return fields; - } - - /** - * @return File name of class, aka SourceFile attribute value - */ - public String getFileName() { - return file_name; - } - - /** - * @return Names of implemented interfaces. - */ - public String[] getInterfaceNames() { - return interface_names; - } - - /** - * @return Indices in constant pool of implemented interfaces. - */ - public int[] getInterfaceIndices() { - return interfaces; - } - - /** - * @return Major number of class file version. - */ - public int getMajor() { - return major; - } - - /** - * @return Methods of the class. - */ - public Method[] getMethods() { - return methods; - } - - /** - * @return A org.apache.bcel.classfile.Method corresponding to - * java.lang.reflect.Method if any - */ - public Method getMethod(java.lang.reflect.Method m) { - for (int i = 0; i < methods.length; i++) { - Method method = methods[i]; - - if (m.getName().equals(method.getName()) - && (m.getModifiers() == method.getModifiers()) - && Type.getSignature(m).equals(method.getSignature())) { - return method; - } - } - - return null; - } - - /** - * @return Minor number of class file version. - */ - public int getMinor() { - return minor; - } - - /** - * @return sbsolute path to file where this class was read from - */ - public String getSourceFileName() { - return source_file_name; - } - - /** - * @return Superclass name. - */ - public String getSuperclassName() { - return superclass_name; - } - - /** - * @return Class name index. - */ - public int getSuperclassNameIndex() { - return superclass_name_index; - } - - static { - // Debugging ... on/off - debug = Boolean.getBoolean("JavaClass.debug"); - - // Get path separator either / or \ usually - String _sep = System.getProperty("file.separator"); - - if (_sep != null) - try { - JavaClass.sep = _sep.charAt(0); - } catch (StringIndexOutOfBoundsException e) { - } // Never reached - } - - /** - * @param attributes . - */ - public void setAttributes(Attribute[] attributes) { - this.attributes = attributes; - } - - /** - * @param class_name . - */ - public void setClassName(String class_name) { - this.class_name = class_name; - } - - /** - * @param class_name_index . - */ - public void setClassNameIndex(int class_name_index) { - this.class_name_index = class_name_index; - } - - /** - * @param constant_pool . - */ - public void setConstantPool(ConstantPool constant_pool) { - this.constant_pool = constant_pool; - } - - /** - * @param fields . - */ - public void setFields(Field[] fields) { - this.fields = fields; - } - - /** - * Set File name of class, aka SourceFile attribute value - */ - public void setFileName(String file_name) { - this.file_name = file_name; - } - - /** - * @param interface_names . - */ - public void setInterfaceNames(String[] interface_names) { - this.interface_names = interface_names; - } - - /** - * @param interfaces . - */ - public void setInterfaces(int[] interfaces) { - this.interfaces = interfaces; - } - - /** - * @param major . - */ - public void setMajor(int major) { - this.major = major; - } - - /** - * @param methods . - */ - public void setMethods(Method[] methods) { - this.methods = methods; - } - - /** - * @param minor . - */ - public void setMinor(int minor) { - this.minor = minor; - } - - /** - * Set absolute path to file this class was read from. - */ - public void setSourceFileName(String source_file_name) { - this.source_file_name = source_file_name; - } - - /** - * @param superclass_name . - */ - public void setSuperclassName(String superclass_name) { - this.superclass_name = superclass_name; - } - - /** - * @param superclass_name_index . - */ - public void setSuperclassNameIndex(int superclass_name_index) { - this.superclass_name_index = superclass_name_index; - } - - /** - * @return String representing class contents. - */ - public String toString() { - String access = Utility.accessToString(access_flags, true); - access = access.equals("") ? "" : (access + " "); - - StringBuffer buf = - new StringBuffer(128); - buf.append(access) - .append(Utility.classOrInterface(access_flags)) - .append(" ") - .append(class_name) - .append(" extends ") - .append(Utility.compactClassName(superclass_name, false)) - .append('\n'); - int size = interfaces.length; - - if (size > 0) { - buf.append("implements\t\t"); - - for (int i = 0; i < size; i++) { - buf.append(interface_names[i]); - if (i < size - 1) - buf.append(", "); - } - - buf.append('\n'); - } - - buf.append("filename\t\t").append(file_name).append('\n'); - buf.append("compiled from\t\t").append(source_file_name).append('\n'); - buf.append("compiler version\t").append(major).append(".").append(minor).append('\n'); - buf.append("access flags\t\t").append(access_flags).append('\n'); - buf.append("constant pool\t\t").append(constant_pool.getLength()).append(" entries\n"); - buf.append("ACC_SUPER flag\t\t").append(isSuper()).append("\n"); - - if (attributes.length > 0) { - buf.append("\nAttribute(s):\n"); - for (int i = 0; i < attributes.length; i++) - buf.append(indent(attributes[i])); - } - - if (fields.length > 0) { - buf.append("\n").append(fields.length).append(" fields:\n"); - for (int i = 0; i < fields.length; i++) - buf.append("\t").append(fields[i]).append('\n'); - } - - if (methods.length > 0) { - buf.append("\n").append(methods.length).append(" methods:\n"); - for (int i = 0; i < methods.length; i++) - buf.append("\t").append(methods[i]).append('\n'); - } - - return buf.toString(); - } - - private static final String indent(Object obj) { - StringTokenizer tok = new StringTokenizer(obj.toString(), "\n"); - StringBuffer buf = new StringBuffer(); - - while (tok.hasMoreTokens()) - buf.append("\t").append(tok.nextToken()).append("\n"); - - return buf.toString(); - } - - /** - * @return deep copy of this class - */ - public JavaClass copy() { - JavaClass c = null; - - try { - c = (JavaClass)clone(); - - c.constant_pool = constant_pool.copy(); - c.interfaces = (int[])interfaces.clone(); - c.interface_names = (String[])interface_names.clone(); - - c.fields = new Field[fields.length]; - for (int i = 0; i < fields.length; i++) - c.fields[i] = fields[i].copy(c.constant_pool); - c.methods = new Method[methods.length]; - for (int i = 0; i < methods.length; i++) - c.methods[i] = methods[i].copy(c.constant_pool); + private String file_name; + private String package_name; + private String source_file_name = ""; + private int class_name_index; + private int superclass_name_index; + private String class_name; + private String superclass_name; + private int major, minor; // Compiler version + private ConstantPool constant_pool; // Constant pool + private int[] interfaces; // implemented interfaces + private String[] interface_names; + private Field[] fields; // Fields, i.e., variables of class + private Method[] methods; // methods defined in the class + private Attribute[] attributes; // attributes defined in the class + private byte source = HEAP; // Generated in memory + public static final byte HEAP = 1; + public static final byte FILE = 2; + public static final byte ZIP = 3; + static boolean debug = false; // Debugging on/off + static char sep = '/'; // directory separator + private static BCELComparator _cmp = new BCELComparator() { + + public boolean equals( Object o1, Object o2 ) { + JavaClass THIS = (JavaClass) o1; + JavaClass THAT = (JavaClass) o2; + return THIS.getClassName().equals(THAT.getClassName()); + } + + + public int hashCode( Object o ) { + JavaClass THIS = (JavaClass) o; + return THIS.getClassName().hashCode(); + } + }; + /** + * In cases where we go ahead and create something, + * use the default SyntheticRepository, because we + * don't know any better. + */ + private transient org.apache.bcel.util.Repository repository = SyntheticRepository + .getInstance(); + + + /** + * Constructor gets all contents as arguments. + * + * @param class_name_index Index into constant pool referencing a + * ConstantClass that represents this class. + * @param superclass_name_index Index into constant pool referencing a + * ConstantClass that represents this class's superclass. + * @param file_name File name + * @param major Major compiler version + * @param minor Minor compiler version + * @param access_flags Access rights defined by bit flags + * @param constant_pool Array of constants + * @param interfaces Implemented interfaces + * @param fields Class fields + * @param methods Class methods + * @param attributes Class attributes + * @param source Read from file or generated in memory? + */ + public JavaClass(int class_name_index, int superclass_name_index, String file_name, int major, + int minor, int access_flags, ConstantPool constant_pool, int[] interfaces, + Field[] fields, Method[] methods, Attribute[] attributes, byte source) { + if (interfaces == null) { + interfaces = new int[0]; + } + if (attributes == null) { + attributes = new Attribute[0]; + } + if (fields == null) { + fields = new Field[0]; + } + if (methods == null) { + methods = new Method[0]; + } + this.class_name_index = class_name_index; + this.superclass_name_index = superclass_name_index; + this.file_name = file_name; + this.major = major; + this.minor = minor; + this.access_flags = access_flags; + this.constant_pool = constant_pool; + this.interfaces = interfaces; + this.fields = fields; + this.methods = methods; + this.attributes = attributes; + this.source = source; + // Get source file name if available + for (int i = 0; i < attributes.length; i++) { + if (attributes[i] instanceof SourceFile) { + source_file_name = ((SourceFile) attributes[i]).getSourceFileName(); + break; + } + } + /* According to the specification the following entries must be of type + * `ConstantClass' but we check that anyway via the + * `ConstPool.getConstant' method. + */ + class_name = constant_pool.getConstantString(class_name_index, Constants.CONSTANT_Class); + class_name = Utility.compactClassName(class_name, false); + int index = class_name.lastIndexOf('.'); + if (index < 0) { + package_name = ""; + } else { + package_name = class_name.substring(0, index); + } + if (superclass_name_index > 0) { + // May be zero -> class is java.lang.Object + superclass_name = constant_pool.getConstantString(superclass_name_index, + Constants.CONSTANT_Class); + superclass_name = Utility.compactClassName(superclass_name, false); + } else { + superclass_name = "java.lang.Object"; + } + interface_names = new String[interfaces.length]; + for (int i = 0; i < interfaces.length; i++) { + String str = constant_pool.getConstantString(interfaces[i], Constants.CONSTANT_Class); + interface_names[i] = Utility.compactClassName(str, false); + } + } + + + /** + * Constructor gets all contents as arguments. + * + * @param class_name_index Class name + * @param superclass_name_index Superclass name + * @param file_name File name + * @param major Major compiler version + * @param minor Minor compiler version + * @param access_flags Access rights defined by bit flags + * @param constant_pool Array of constants + * @param interfaces Implemented interfaces + * @param fields Class fields + * @param methods Class methods + * @param attributes Class attributes + */ + public JavaClass(int class_name_index, int superclass_name_index, String file_name, int major, + int minor, int access_flags, ConstantPool constant_pool, int[] interfaces, + Field[] fields, Method[] methods, Attribute[] attributes) { + this(class_name_index, superclass_name_index, file_name, major, minor, access_flags, + constant_pool, interfaces, fields, methods, attributes, HEAP); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitJavaClass(this); + } + + + /* Print debug information depending on `JavaClass.debug' + */ + static final void Debug( String str ) { + if (debug) { + System.out.println(str); + } + } + - c.attributes = new Attribute[attributes.length]; - for (int i = 0; i < attributes.length; i++) - c.attributes[i] = attributes[i].copy(c.constant_pool); - } catch (CloneNotSupportedException e) { + /** + * Dump class to a file. + * + * @param file Output file + * @throws IOException + */ + public void dump( File file ) throws IOException { + String parent = file.getParent(); + if (parent != null) { + File dir = new File(parent); + dir.mkdirs(); + } + DataOutputStream dos = null; + try { + dos = new DataOutputStream(new FileOutputStream(file)); + dump(dos); + } finally { + if (dos != null) { + dos.close(); + } + } } - return c; - } - public final boolean isSuper() { - return (access_flags & Constants.ACC_SUPER) != 0; - } + /** + * Dump class to a file named file_name. + * + * @param _file_name Output file name + * @exception IOException + */ + public void dump( String _file_name ) throws IOException { + dump(new File(_file_name)); + } - public final boolean isClass() { - return (access_flags & Constants.ACC_INTERFACE) == 0; - } - /** @return returns either HEAP (generated), FILE, or ZIP - */ - public final byte getSource() { - return source; - } + /** + * @return class in binary format + */ + public byte[] getBytes() { + ByteArrayOutputStream s = new ByteArrayOutputStream(); + DataOutputStream ds = new DataOutputStream(s); + try { + dump(ds); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + ds.close(); + } catch (IOException e2) { + e2.printStackTrace(); + } + } + return s.toByteArray(); + } - /********************* New repository functionality *********************/ - /** - * Gets the ClassRepository which holds its definition. By default - * this is the same as SyntheticRepository.getInstance(); - */ - public org.apache.bcel.util.Repository getRepository() { - return repository; - } + /** + * Dump Java class to output stream in binary format. + * + * @param file Output stream + * @exception IOException + */ + public void dump( OutputStream file ) throws IOException { + dump(new DataOutputStream(file)); + } - /** - * Sets the ClassRepository which loaded the JavaClass. - * Should be called immediately after parsing is done. - */ - public void setRepository(org.apache.bcel.util.Repository repository) { - this.repository = repository; - } - /** Equivalent to runtime "instanceof" operator. - * - * @return true if this JavaClass is derived from the super class - * @throws ClassNotFoundException if superclasses or superinterfaces - * of this object can't be found - */ - public final boolean instanceOf(JavaClass super_class) - throws ClassNotFoundException { + /** + * Dump Java class to output stream in binary format. + * + * @param file Output stream + * @exception IOException + */ + public void dump( DataOutputStream file ) throws IOException { + file.writeInt(0xcafebabe); + file.writeShort(minor); + file.writeShort(major); + constant_pool.dump(file); + file.writeShort(access_flags); + file.writeShort(class_name_index); + file.writeShort(superclass_name_index); + file.writeShort(interfaces.length); + for (int i = 0; i < interfaces.length; i++) { + file.writeShort(interfaces[i]); + } + file.writeShort(fields.length); + for (int i = 0; i < fields.length; i++) { + fields[i].dump(file); + } + file.writeShort(methods.length); + for (int i = 0; i < methods.length; i++) { + methods[i].dump(file); + } + if (attributes != null) { + file.writeShort(attributes.length); + for (int i = 0; i < attributes.length; i++) { + attributes[i].dump(file); + } + } else { + file.writeShort(0); + } + file.flush(); + } - if (this.equals(super_class)) - return true; - JavaClass[] super_classes = getSuperClasses(); + /** + * @return Attributes of the class. + */ + public Attribute[] getAttributes() { + return attributes; + } - for (int i = 0; i < super_classes.length; i++) { - if (super_classes[i].equals(super_class)) { - return true; - } + + /** + * @return Class name. + */ + public String getClassName() { + return class_name; } - if (super_class.isInterface()) { - return implementationOf(super_class); + + /** + * @return Package name. + */ + public String getPackageName() { + return package_name; } - return false; - } - /** - * @return true, if this class is an implementation of interface inter - * @throws ClassNotFoundException if superclasses or superinterfaces - * of this class can't be found - */ - public boolean implementationOf(JavaClass inter) - throws ClassNotFoundException { + /** + * @return Class name index. + */ + public int getClassNameIndex() { + return class_name_index; + } - if (!inter.isInterface()) { - throw new IllegalArgumentException( - inter.getClassName() + " is no interface"); + + /** + * @return Constant pool. + */ + public ConstantPool getConstantPool() { + return constant_pool; } - if (this.equals(inter)) { - return true; + + /** + * @return Fields, i.e., variables of the class. Like the JVM spec + * mandates for the classfile format, these fields are those specific to + * this class, and not those of the superclass or superinterfaces. + */ + public Field[] getFields() { + return fields; + } + + + /** + * @return File name of class, aka SourceFile attribute value + */ + public String getFileName() { + return file_name; + } + + + /** + * @return Names of implemented interfaces. + */ + public String[] getInterfaceNames() { + return interface_names; + } + + + /** + * @return Indices in constant pool of implemented interfaces. + */ + public int[] getInterfaceIndices() { + return interfaces; + } + + + /** + * @return Major number of class file version. + */ + public int getMajor() { + return major; + } + + + /** + * @return Methods of the class. + */ + public Method[] getMethods() { + return methods; + } + + + /** + * @return A org.apache.bcel.classfile.Method corresponding to + * java.lang.reflect.Method if any + */ + public Method getMethod( java.lang.reflect.Method m ) { + for (int i = 0; i < methods.length; i++) { + Method method = methods[i]; + if (m.getName().equals(method.getName()) && (m.getModifiers() == method.getModifiers()) + && Type.getSignature(m).equals(method.getSignature())) { + return method; + } + } + return null; + } + + + /** + * @return Minor number of class file version. + */ + public int getMinor() { + return minor; + } + + + /** + * @return sbsolute path to file where this class was read from + */ + public String getSourceFileName() { + return source_file_name; + } + + + /** + * @return Superclass name. + */ + public String getSuperclassName() { + return superclass_name; + } + + + /** + * @return Class name index. + */ + public int getSuperclassNameIndex() { + return superclass_name_index; + } + + static { + // Debugging ... on/off + debug = Boolean.getBoolean("JavaClass.debug"); + // Get path separator either / or \ usually + String _sep = System.getProperty("file.separator"); + if (_sep != null) { + try { + JavaClass.sep = _sep.charAt(0); + } catch (StringIndexOutOfBoundsException e) { + } // Never reached + } + } + + + /** + * @param attributes . + */ + public void setAttributes( Attribute[] attributes ) { + this.attributes = attributes; + } + + + /** + * @param class_name . + */ + public void setClassName( String class_name ) { + this.class_name = class_name; + } + + + /** + * @param class_name_index . + */ + public void setClassNameIndex( int class_name_index ) { + this.class_name_index = class_name_index; + } + + + /** + * @param constant_pool . + */ + public void setConstantPool( ConstantPool constant_pool ) { + this.constant_pool = constant_pool; + } + + + /** + * @param fields . + */ + public void setFields( Field[] fields ) { + this.fields = fields; } - JavaClass[] super_interfaces = getAllInterfaces(); - for (int i = 0; i < super_interfaces.length; i++) { - if (super_interfaces[i].equals(inter)) { - return true; - } + /** + * Set File name of class, aka SourceFile attribute value + */ + public void setFileName( String file_name ) { + this.file_name = file_name; + } + + + /** + * @param interface_names . + */ + public void setInterfaceNames( String[] interface_names ) { + this.interface_names = interface_names; + } + + + /** + * @param interfaces . + */ + public void setInterfaces( int[] interfaces ) { + this.interfaces = interfaces; + } + + + /** + * @param major . + */ + public void setMajor( int major ) { + this.major = major; + } + + + /** + * @param methods . + */ + public void setMethods( Method[] methods ) { + this.methods = methods; + } + + + /** + * @param minor . + */ + public void setMinor( int minor ) { + this.minor = minor; + } + + + /** + * Set absolute path to file this class was read from. + */ + public void setSourceFileName( String source_file_name ) { + this.source_file_name = source_file_name; + } + + + /** + * @param superclass_name . + */ + public void setSuperclassName( String superclass_name ) { + this.superclass_name = superclass_name; + } + + + /** + * @param superclass_name_index . + */ + public void setSuperclassNameIndex( int superclass_name_index ) { + this.superclass_name_index = superclass_name_index; + } + + + /** + * @return String representing class contents. + */ + public String toString() { + String access = Utility.accessToString(access_flags, true); + access = access.equals("") ? "" : (access + " "); + StringBuffer buf = new StringBuffer(128); + buf.append(access).append(Utility.classOrInterface(access_flags)).append(" ").append( + class_name).append(" extends ").append( + Utility.compactClassName(superclass_name, false)).append('\n'); + int size = interfaces.length; + if (size > 0) { + buf.append("implements\t\t"); + for (int i = 0; i < size; i++) { + buf.append(interface_names[i]); + if (i < size - 1) { + buf.append(", "); + } + } + buf.append('\n'); + } + buf.append("filename\t\t").append(file_name).append('\n'); + buf.append("compiled from\t\t").append(source_file_name).append('\n'); + buf.append("compiler version\t").append(major).append(".").append(minor).append('\n'); + buf.append("access flags\t\t").append(access_flags).append('\n'); + buf.append("constant pool\t\t").append(constant_pool.getLength()).append(" entries\n"); + buf.append("ACC_SUPER flag\t\t").append(isSuper()).append("\n"); + if (attributes.length > 0) { + buf.append("\nAttribute(s):\n"); + for (int i = 0; i < attributes.length; i++) { + buf.append(indent(attributes[i])); + } + } + if (fields.length > 0) { + buf.append("\n").append(fields.length).append(" fields:\n"); + for (int i = 0; i < fields.length; i++) { + buf.append("\t").append(fields[i]).append('\n'); + } + } + if (methods.length > 0) { + buf.append("\n").append(methods.length).append(" methods:\n"); + for (int i = 0; i < methods.length; i++) { + buf.append("\t").append(methods[i]).append('\n'); + } + } + return buf.toString(); + } + + + private static final String indent( Object obj ) { + StringTokenizer tok = new StringTokenizer(obj.toString(), "\n"); + StringBuffer buf = new StringBuffer(); + while (tok.hasMoreTokens()) { + buf.append("\t").append(tok.nextToken()).append("\n"); + } + return buf.toString(); + } + + + /** + * @return deep copy of this class + */ + public JavaClass copy() { + JavaClass c = null; + try { + c = (JavaClass) clone(); + c.constant_pool = constant_pool.copy(); + c.interfaces = (int[]) interfaces.clone(); + c.interface_names = (String[]) interface_names.clone(); + c.fields = new Field[fields.length]; + for (int i = 0; i < fields.length; i++) { + c.fields[i] = fields[i].copy(c.constant_pool); + } + c.methods = new Method[methods.length]; + for (int i = 0; i < methods.length; i++) { + c.methods[i] = methods[i].copy(c.constant_pool); + } + c.attributes = new Attribute[attributes.length]; + for (int i = 0; i < attributes.length; i++) { + c.attributes[i] = attributes[i].copy(c.constant_pool); + } + } catch (CloneNotSupportedException e) { + } + return c; + } + + + public final boolean isSuper() { + return (access_flags & Constants.ACC_SUPER) != 0; + } + + + public final boolean isClass() { + return (access_flags & Constants.ACC_INTERFACE) == 0; + } + + + /** @return returns either HEAP (generated), FILE, or ZIP + */ + public final byte getSource() { + return source; + } + + + /********************* New repository functionality *********************/ + /** + * Gets the ClassRepository which holds its definition. By default + * this is the same as SyntheticRepository.getInstance(); + */ + public org.apache.bcel.util.Repository getRepository() { + return repository; + } + + + /** + * Sets the ClassRepository which loaded the JavaClass. + * Should be called immediately after parsing is done. + */ + public void setRepository( org.apache.bcel.util.Repository repository ) { + this.repository = repository; + } + + + /** Equivalent to runtime "instanceof" operator. + * + * @return true if this JavaClass is derived from the super class + * @throws ClassNotFoundException if superclasses or superinterfaces + * of this object can't be found + */ + public final boolean instanceOf( JavaClass super_class ) throws ClassNotFoundException { + if (this.equals(super_class)) { + return true; + } + JavaClass[] super_classes = getSuperClasses(); + for (int i = 0; i < super_classes.length; i++) { + if (super_classes[i].equals(super_class)) { + return true; + } + } + if (super_class.isInterface()) { + return implementationOf(super_class); + } + return false; + } + + + /** + * @return true, if this class is an implementation of interface inter + * @throws ClassNotFoundException if superclasses or superinterfaces + * of this class can't be found + */ + public boolean implementationOf( JavaClass inter ) throws ClassNotFoundException { + if (!inter.isInterface()) { + throw new IllegalArgumentException(inter.getClassName() + " is no interface"); + } + if (this.equals(inter)) { + return true; + } + JavaClass[] super_interfaces = getAllInterfaces(); + for (int i = 0; i < super_interfaces.length; i++) { + if (super_interfaces[i].equals(inter)) { + return true; + } + } + return false; + } + + + /** + * @return the superclass for this JavaClass object, or null if this + * is java.lang.Object + * @throws ClassNotFoundException if the superclass can't be found + */ + public JavaClass getSuperClass() throws ClassNotFoundException { + if ("java.lang.Object".equals(getClassName())) { + return null; + } + return repository.loadClass(getSuperclassName()); + } + + + /** + * @return list of super classes of this class in ascending order, i.e., + * java.lang.Object is always the last element + * @throws ClassNotFoundException if any of the superclasses can't be found + */ + public JavaClass[] getSuperClasses() throws ClassNotFoundException { + JavaClass clazz = this; + List allSuperClasses = new ArrayList(); + for (clazz = clazz.getSuperClass(); clazz != null; clazz = clazz.getSuperClass()) { + allSuperClasses.add(clazz); + } + return (JavaClass[]) allSuperClasses.toArray(new JavaClass[allSuperClasses.size()]); + } + + + /** + * Get interfaces directly implemented by this JavaClass. + */ + public JavaClass[] getInterfaces() throws ClassNotFoundException { + String[] _interfaces = getInterfaceNames(); + JavaClass[] classes = new JavaClass[_interfaces.length]; + for (int i = 0; i < _interfaces.length; i++) { + classes[i] = repository.loadClass(_interfaces[i]); + } + return classes; + } + + + /** + * Get all interfaces implemented by this JavaClass (transitively). + */ + public JavaClass[] getAllInterfaces() throws ClassNotFoundException { + ClassQueue queue = new ClassQueue(); + Set allInterfaces = new TreeSet(); + queue.enqueue(this); + while (!queue.empty()) { + JavaClass clazz = queue.dequeue(); + JavaClass souper = clazz.getSuperClass(); + JavaClass[] _interfaces = clazz.getInterfaces(); + if (clazz.isInterface()) { + allInterfaces.add(clazz); + } else { + if (souper != null) { + queue.enqueue(souper); + } + } + for (int i = 0; i < _interfaces.length; i++) { + queue.enqueue(_interfaces[i]); + } + } + return (JavaClass[]) allInterfaces.toArray(new JavaClass[allInterfaces.size()]); + } + + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; + } + + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator( BCELComparator comparator ) { + _cmp = comparator; + } + + + /** + * Return value as defined by given BCELComparator strategy. + * By default two JavaClass objects are said to be equal when + * their class names are equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals( Object obj ) { + return _cmp.equals(this, obj); + } + + + /** + * Return the natural ordering of two JavaClasses. + * This ordering is based on the class name + */ + public int compareTo( Object obj ) { + return getClassName().compareTo(((JavaClass) obj).getClassName()); + } + + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the class name. + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); } - - return false; - } - - /** - * @return the superclass for this JavaClass object, or null if this - * is java.lang.Object - * @throws ClassNotFoundException if the superclass can't be found - */ - public JavaClass getSuperClass() throws ClassNotFoundException { - if ("java.lang.Object".equals(getClassName())) { - return null; - } - - return repository.loadClass(getSuperclassName()); - } - - /** - * @return list of super classes of this class in ascending order, i.e., - * java.lang.Object is always the last element - * @throws ClassNotFoundException if any of the superclasses can't be found - */ - public JavaClass[] getSuperClasses() throws ClassNotFoundException { - JavaClass clazz = this; - List allSuperClasses = new ArrayList(); - - for (clazz = clazz.getSuperClass(); - clazz != null; - clazz = clazz.getSuperClass()) { - allSuperClasses.add(clazz); - } - - return (JavaClass[])allSuperClasses.toArray(new JavaClass[allSuperClasses.size()]); - } - - /** - * Get interfaces directly implemented by this JavaClass. - */ - public JavaClass[] getInterfaces() throws ClassNotFoundException { - String[] _interfaces = getInterfaceNames(); - JavaClass[] classes = new JavaClass[_interfaces.length]; - - for (int i = 0; i < _interfaces.length; i++) { - classes[i] = repository.loadClass(_interfaces[i]); - } - - return classes; - } - - /** - * Get all interfaces implemented by this JavaClass (transitively). - */ - public JavaClass[] getAllInterfaces() throws ClassNotFoundException { - ClassQueue queue = new ClassQueue(); - Set allInterfaces = new TreeSet(); - - queue.enqueue(this); - - while (!queue.empty()) { - JavaClass clazz = queue.dequeue(); - - JavaClass souper = clazz.getSuperClass(); - JavaClass[] _interfaces = clazz.getInterfaces(); - - if (clazz.isInterface()) { - allInterfaces.add(clazz); - } else { - if (souper != null) { - queue.enqueue(souper); - } - } - - for (int i = 0; i < _interfaces.length; i++) { - queue.enqueue(_interfaces[i]); - } - } - - return (JavaClass[])allInterfaces.toArray(new JavaClass[allInterfaces.size()]); - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default two JavaClass objects are said to be equal when - * their class names are equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return the natural ordering of two JavaClasses. - * This ordering is based on the class name - */ - public int compareTo(Object obj) { - return getClassName().compareTo(((JavaClass)obj).getClassName()); - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default return the hashcode of the class name. - * - * @see java.lang.Object#hashCode() - */ - public int hashCode() { - return _cmp.hashCode(this); - } } diff --git a/src/java/org/apache/bcel/classfile/LineNumber.java b/src/java/org/apache/bcel/classfile/LineNumber.java index bc9a2640..645c4c88 100644 --- a/src/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/java/org/apache/bcel/classfile/LineNumber.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -32,98 +31,111 @@ import java.io.Serializable; * @see LineNumberTable */ public final class LineNumber implements Cloneable, Node, Serializable { - private int start_pc; // Program Counter (PC) corresponds to line - private int line_number; // number in source file - - /** - * Initialize from another object. - */ - public LineNumber(LineNumber c) { - this(c.getStartPC(), c.getLineNumber()); - } - - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - */ - LineNumber(DataInputStream file) throws IOException - { - this(file.readUnsignedShort(), file.readUnsignedShort()); - } - - /** - * @param start_pc Program Counter (PC) corresponds to - * @param line_number line number in source file - */ - public LineNumber(int start_pc, int line_number) - { - this.start_pc = start_pc; - this.line_number = line_number; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitLineNumber(this); - } - - /** - * Dump line number/pc pair to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeShort(start_pc); - file.writeShort(line_number); - - } - /** - * @return Corresponding source line - */ - public final int getLineNumber() { return line_number; } - - /** - * @return PC in code - */ - public final int getStartPC() { return start_pc; } - - /** - * @param line_number the source line number - */ - public final void setLineNumber(int line_number) { - this.line_number = line_number; - } - - /** - * @param start_pc the pc for this line number - */ - public final void setStartPC(int start_pc) { - this.start_pc = start_pc; - } - - /** - * @return String representation - */ - public final String toString() { - return "LineNumber(" + start_pc + ", " + line_number + ")"; - } - - /** - * @return deep copy of this object - */ - public LineNumber copy() { - try { - return (LineNumber)clone(); - } catch(CloneNotSupportedException e) {} - - return null; - } + + private int start_pc; // Program Counter (PC) corresponds to line + private int line_number; // number in source file + + + /** + * Initialize from another object. + */ + public LineNumber(LineNumber c) { + this(c.getStartPC(), c.getLineNumber()); + } + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + LineNumber(DataInputStream file) throws IOException { + this(file.readUnsignedShort(), file.readUnsignedShort()); + } + + + /** + * @param start_pc Program Counter (PC) corresponds to + * @param line_number line number in source file + */ + public LineNumber(int start_pc, int line_number) { + this.start_pc = start_pc; + this.line_number = line_number; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitLineNumber(this); + } + + + /** + * Dump line number/pc pair to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeShort(start_pc); + file.writeShort(line_number); + } + + + /** + * @return Corresponding source line + */ + public final int getLineNumber() { + return line_number; + } + + + /** + * @return PC in code + */ + public final int getStartPC() { + return start_pc; + } + + + /** + * @param line_number the source line number + */ + public final void setLineNumber( int line_number ) { + this.line_number = line_number; + } + + + /** + * @param start_pc the pc for this line number + */ + public final void setStartPC( int start_pc ) { + this.start_pc = start_pc; + } + + + /** + * @return String representation + */ + public final String toString() { + return "LineNumber(" + start_pc + ", " + line_number + ")"; + } + + + /** + * @return deep copy of this object + */ + public LineNumber copy() { + try { + return (LineNumber) clone(); + } catch (CloneNotSupportedException e) { + } + return null; + } } diff --git a/src/java/org/apache/bcel/classfile/LineNumberTable.java b/src/java/org/apache/bcel/classfile/LineNumberTable.java index c99d73f7..d4513add 100644 --- a/src/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/java/org/apache/bcel/classfile/LineNumberTable.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -33,175 +32,177 @@ import org.apache.bcel.Constants; * @see LineNumber */ public final class LineNumberTable extends Attribute { - private int line_number_table_length; - private LineNumber[] line_number_table; // Table of line/numbers pairs - - /* - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use copy() for a physical copy. - */ - public LineNumberTable(LineNumberTable c) { - this(c.getNameIndex(), c.getLength(), c.getLineNumberTable(), - c.getConstantPool()); - } - - /* - * @param name_index Index of name - * @param length Content length in bytes - * @param line_number_table Table of line/numbers pairs - * @param constant_pool Array of constants - */ - public LineNumberTable(int name_index, int length, - LineNumber[] line_number_table, - ConstantPool constant_pool) - { - super(Constants.ATTR_LINE_NUMBER_TABLE, name_index, length, constant_pool); - setLineNumberTable(line_number_table); - } - - /** - * Construct object from file stream. - * @param name_index Index of name - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - * @throws IOException - */ - LineNumberTable(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(name_index, length, (LineNumber[])null, constant_pool); - line_number_table_length = (file.readUnsignedShort()); - line_number_table = new LineNumber[line_number_table_length]; - - for(int i=0; i < line_number_table_length; i++) - line_number_table[i] = new LineNumber(file); - } - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitLineNumberTable(this); - } - /** - * Dump line number table attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - file.writeShort(line_number_table_length); - for(int i=0; i < line_number_table_length; i++) - line_number_table[i].dump(file); - } - - /** - * @return Array of (pc offset, line number) pairs. - */ - public final LineNumber[] getLineNumberTable() { return line_number_table; } - - /** - * @param line_number_table the line number entries for this table - */ - public final void setLineNumberTable(LineNumber[] line_number_table) { - this.line_number_table = line_number_table; - - line_number_table_length = (line_number_table == null)? 0 : - line_number_table.length; - } - - /** - * @return String representation. - */ - public final String toString() { - StringBuffer buf = new StringBuffer(); - StringBuffer line = new StringBuffer(); - String newLine = System.getProperty("line.separator", "\n"); - - for(int i=0; i < line_number_table_length; i++) { - line.append(line_number_table[i].toString()); - - if(i < line_number_table_length - 1) { - line.append(", "); - } - - if(line.length() > 72) { - line.append(newLine); - buf.append(line.toString()); - line.setLength(0); - } + + private int line_number_table_length; + private LineNumber[] line_number_table; // Table of line/numbers pairs + + + /* + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use copy() for a physical copy. + */ + public LineNumberTable(LineNumberTable c) { + this(c.getNameIndex(), c.getLength(), c.getLineNumberTable(), c.getConstantPool()); } - buf.append(line); - return buf.toString(); - } + /* + * @param name_index Index of name + * @param length Content length in bytes + * @param line_number_table Table of line/numbers pairs + * @param constant_pool Array of constants + */ + public LineNumberTable(int name_index, int length, LineNumber[] line_number_table, + ConstantPool constant_pool) { + super(Constants.ATTR_LINE_NUMBER_TABLE, name_index, length, constant_pool); + setLineNumberTable(line_number_table); + } - /** - * Map byte code positions to source code lines. - * - * @param pos byte code offset - * @return corresponding line in source code - */ - public int getSourceLine(int pos) { - int l = 0, r = line_number_table_length-1; - if(r < 0) // array is empty - return -1; + /** + * Construct object from file stream. + * @param name_index Index of name + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + LineNumberTable(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, (LineNumber[]) null, constant_pool); + line_number_table_length = (file.readUnsignedShort()); + line_number_table = new LineNumber[line_number_table_length]; + for (int i = 0; i < line_number_table_length; i++) { + line_number_table[i] = new LineNumber(file); + } + } + - int min_index = -1, min=-1; - - /* Do a binary search since the array is ordered. + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object */ - do { - int i = (l + r) / 2; - int j = line_number_table[i].getStartPC(); - - if(j == pos) - return line_number_table[i].getLineNumber(); - else if(pos < j) // else constrain search area - r = i - 1; - else // pos > j - l = i + 1; - - /* If exact match can't be found (which is the most common case) - * return the line number that corresponds to the greatest index less - * than pos. - */ - if(j < pos && j > min) { - min = j; - min_index = i; - } - } while(l <= r); - - /* It's possible that we did not find any valid entry for the bytecode - * offset we were looking for. + public void accept( Visitor v ) { + v.visitLineNumberTable(this); + } + + + /** + * Dump line number table attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException */ - if (min_index < 0) - return -1; + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + file.writeShort(line_number_table_length); + for (int i = 0; i < line_number_table_length; i++) { + line_number_table[i].dump(file); + } + } - return line_number_table[min_index].getLineNumber(); - } - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool _constant_pool) { - LineNumberTable c = (LineNumberTable)clone(); + /** + * @return Array of (pc offset, line number) pairs. + */ + public final LineNumber[] getLineNumberTable() { + return line_number_table; + } - c.line_number_table = new LineNumber[line_number_table_length]; - for(int i=0; i < line_number_table_length; i++) - c.line_number_table[i] = line_number_table[i].copy(); - c.constant_pool = _constant_pool; - return c; - } + /** + * @param line_number_table the line number entries for this table + */ + public final void setLineNumberTable( LineNumber[] line_number_table ) { + this.line_number_table = line_number_table; + line_number_table_length = (line_number_table == null) ? 0 : line_number_table.length; + } + + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer(); + StringBuffer line = new StringBuffer(); + String newLine = System.getProperty("line.separator", "\n"); + for (int i = 0; i < line_number_table_length; i++) { + line.append(line_number_table[i].toString()); + if (i < line_number_table_length - 1) { + line.append(", "); + } + if (line.length() > 72) { + line.append(newLine); + buf.append(line.toString()); + line.setLength(0); + } + } + buf.append(line); + return buf.toString(); + } + + + /** + * Map byte code positions to source code lines. + * + * @param pos byte code offset + * @return corresponding line in source code + */ + public int getSourceLine( int pos ) { + int l = 0, r = line_number_table_length - 1; + if (r < 0) { + return -1; + } + int min_index = -1, min = -1; + /* Do a binary search since the array is ordered. + */ + do { + int i = (l + r) / 2; + int j = line_number_table[i].getStartPC(); + if (j == pos) { + return line_number_table[i].getLineNumber(); + } else if (pos < j) { + r = i - 1; + } else { + l = i + 1; + } + /* If exact match can't be found (which is the most common case) + * return the line number that corresponds to the greatest index less + * than pos. + */ + if (j < pos && j > min) { + min = j; + min_index = i; + } + } while (l <= r); + /* It's possible that we did not find any valid entry for the bytecode + * offset we were looking for. + */ + if (min_index < 0) { + return -1; + } + return line_number_table[min_index].getLineNumber(); + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + LineNumberTable c = (LineNumberTable) clone(); + c.line_number_table = new LineNumber[line_number_table_length]; + for (int i = 0; i < line_number_table_length; i++) { + c.line_number_table[i] = line_number_table[i].copy(); + } + c.constant_pool = _constant_pool; + return c; + } - public final int getTableLength() { return line_number_table_length; } + + public final int getTableLength() { + return line_number_table_length; + } } diff --git a/src/java/org/apache/bcel/classfile/LocalVariable.java b/src/java/org/apache/bcel/classfile/LocalVariable.java index 79336e4e..abb27652 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariable.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -31,195 +30,219 @@ import org.apache.bcel.Constants; * @author M. Dahm * @see LocalVariableTable */ -public final class LocalVariable - implements Constants, Cloneable, Node, Serializable -{ - private int start_pc; // Range in which the variable is valid - private int length; - private int name_index; // Index in constant pool of variable name - private int signature_index; // Index of variable signature - private int index; /* Variable is `index'th local variable on - * this method's frame. - */ - - private ConstantPool constant_pool; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use copy() for a physical copy. - */ - public LocalVariable(LocalVariable c) { - this(c.getStartPC(), c.getLength(), c.getNameIndex(), - c.getSignatureIndex(), c.getIndex(), c.getConstantPool()); - } - - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - */ - LocalVariable(DataInputStream file, ConstantPool constant_pool) - throws IOException - { - this(file.readUnsignedShort(), file.readUnsignedShort(), - file.readUnsignedShort(), file.readUnsignedShort(), - file.readUnsignedShort(), constant_pool); - } - - /** - * @param start_pc Range in which the variable - * @param length ... is valid - * @param name_index Index in constant pool of variable name - * @param signature_index Index of variable's signature - * @param index Variable is `index'th local variable on the method's frame - * @param constant_pool Array of constants - */ - public LocalVariable(int start_pc, int length, int name_index, - int signature_index, int index, - ConstantPool constant_pool) - { - this.start_pc = start_pc; - this.length = length; - this.name_index = name_index; - this.signature_index = signature_index; - this.index = index; - this.constant_pool = constant_pool; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitLocalVariable(this); - } - - /** - * Dump local variable to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeShort(start_pc); - file.writeShort(length); - file.writeShort(name_index); - file.writeShort(signature_index); - file.writeShort(index); - } - - /** - * @return Constant pool used by this object. - */ - public final ConstantPool getConstantPool() { return constant_pool; } - - /** - * @return Variable is valid within getStartPC() .. getStartPC()+getLength() - */ - public final int getLength() { return length; } - - /** - * @return Variable name. - */ - public final String getName() { - ConstantUtf8 c; - - c = (ConstantUtf8)constant_pool.getConstant(name_index, CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return Index in constant pool of variable name. - */ - public final int getNameIndex() { return name_index; } - - /** - * @return Signature. - */ - public final String getSignature() { - ConstantUtf8 c; - c = (ConstantUtf8)constant_pool.getConstant(signature_index, - CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return Index in constant pool of variable signature. - */ - public final int getSignatureIndex() { return signature_index; } - - /** - * @return index of register where variable is stored - */ - public final int getIndex() { return index; } - - /** - * @return Start of range where he variable is valid - */ - public final int getStartPC() { return start_pc; } - - /** - * @param constant_pool Constant pool to be used for this object. - */ - public final void setConstantPool(ConstantPool constant_pool) { - this.constant_pool = constant_pool; - } - - /** - * @param length the length of this local variable - */ - public final void setLength(int length) { - this.length = length; - } - - /** - * @param name_index the index into the constant pool for the name of this variable - */ - public final void setNameIndex(int name_index) { - this.name_index = name_index; - } - - /** - * @param signature_index the index into the constant pool for the signature of this variable - */ - public final void setSignatureIndex(int signature_index) { - this.signature_index = signature_index; - } - - /** - * @param index the index in the local variable table of this variable - */ - public final void setIndex(int index) { this.index = index; } - - /** - * @param start_pc Specify range where the local variable is valid. - */ - public final void setStartPC(int start_pc) { - this.start_pc = start_pc; - } - - /** - * @return string representation. - */ - public final String toString() { - String name = getName(), signature = Utility.signatureToString(getSignature()); - - return "LocalVariable(start_pc = " + start_pc + ", length = " + length + - ", index = " + index + ":" + signature + " " + name + ")"; - } - - /** - * @return deep copy of this object - */ - public LocalVariable copy() { - try { - return (LocalVariable)clone(); - } catch(CloneNotSupportedException e) {} - - return null; - } +public final class LocalVariable implements Constants, Cloneable, Node, Serializable { + + private int start_pc; // Range in which the variable is valid + private int length; + private int name_index; // Index in constant pool of variable name + private int signature_index; // Index of variable signature + private int index; /* Variable is `index'th local variable on + * this method's frame. + */ + private ConstantPool constant_pool; + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use copy() for a physical copy. + */ + public LocalVariable(LocalVariable c) { + this(c.getStartPC(), c.getLength(), c.getNameIndex(), c.getSignatureIndex(), c.getIndex(), + c.getConstantPool()); + } + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + LocalVariable(DataInputStream file, ConstantPool constant_pool) throws IOException { + this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), file + .readUnsignedShort(), file.readUnsignedShort(), constant_pool); + } + + + /** + * @param start_pc Range in which the variable + * @param length ... is valid + * @param name_index Index in constant pool of variable name + * @param signature_index Index of variable's signature + * @param index Variable is `index'th local variable on the method's frame + * @param constant_pool Array of constants + */ + public LocalVariable(int start_pc, int length, int name_index, int signature_index, int index, + ConstantPool constant_pool) { + this.start_pc = start_pc; + this.length = length; + this.name_index = name_index; + this.signature_index = signature_index; + this.index = index; + this.constant_pool = constant_pool; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitLocalVariable(this); + } + + + /** + * Dump local variable to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeShort(start_pc); + file.writeShort(length); + file.writeShort(name_index); + file.writeShort(signature_index); + file.writeShort(index); + } + + + /** + * @return Constant pool used by this object. + */ + public final ConstantPool getConstantPool() { + return constant_pool; + } + + + /** + * @return Variable is valid within getStartPC() .. getStartPC()+getLength() + */ + public final int getLength() { + return length; + } + + + /** + * @return Variable name. + */ + public final String getName() { + ConstantUtf8 c; + c = (ConstantUtf8) constant_pool.getConstant(name_index, CONSTANT_Utf8); + return c.getBytes(); + } + + + /** + * @return Index in constant pool of variable name. + */ + public final int getNameIndex() { + return name_index; + } + + + /** + * @return Signature. + */ + public final String getSignature() { + ConstantUtf8 c; + c = (ConstantUtf8) constant_pool.getConstant(signature_index, CONSTANT_Utf8); + return c.getBytes(); + } + + + /** + * @return Index in constant pool of variable signature. + */ + public final int getSignatureIndex() { + return signature_index; + } + + + /** + * @return index of register where variable is stored + */ + public final int getIndex() { + return index; + } + + + /** + * @return Start of range where he variable is valid + */ + public final int getStartPC() { + return start_pc; + } + + + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool( ConstantPool constant_pool ) { + this.constant_pool = constant_pool; + } + + + /** + * @param length the length of this local variable + */ + public final void setLength( int length ) { + this.length = length; + } + + + /** + * @param name_index the index into the constant pool for the name of this variable + */ + public final void setNameIndex( int name_index ) { + this.name_index = name_index; + } + + + /** + * @param signature_index the index into the constant pool for the signature of this variable + */ + public final void setSignatureIndex( int signature_index ) { + this.signature_index = signature_index; + } + + + /** + * @param index the index in the local variable table of this variable + */ + public final void setIndex( int index ) { + this.index = index; + } + + + /** + * @param start_pc Specify range where the local variable is valid. + */ + public final void setStartPC( int start_pc ) { + this.start_pc = start_pc; + } + + + /** + * @return string representation. + */ + public final String toString() { + String name = getName(), signature = Utility.signatureToString(getSignature()); + return "LocalVariable(start_pc = " + start_pc + ", length = " + length + ", index = " + + index + ":" + signature + " " + name + ")"; + } + + + /** + * @return deep copy of this object + */ + public LocalVariable copy() { + try { + return (LocalVariable) clone(); + } catch (CloneNotSupportedException e) { + } + return null; + } } diff --git a/src/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/java/org/apache/bcel/classfile/LocalVariableTable.java index 37caaa13..700c6382 100644 --- a/src/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -32,158 +31,167 @@ import org.apache.bcel.Constants; * @see LocalVariable */ public class LocalVariableTable extends Attribute { - private int local_variable_table_length; // Table of local - private LocalVariable[] local_variable_table; // variables - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use copy() for a physical copy. - */ - public LocalVariableTable(LocalVariableTable c) { - this(c.getNameIndex(), c.getLength(), c.getLocalVariableTable(), - c.getConstantPool()); - } - - /** - * @param name_index Index in constant pool to `LocalVariableTable' - * @param length Content length in bytes - * @param local_variable_table Table of local variables - * @param constant_pool Array of constants - */ - public LocalVariableTable(int name_index, int length, - LocalVariable[] local_variable_table, - ConstantPool constant_pool) - { - super(Constants.ATTR_LOCAL_VARIABLE_TABLE, name_index, length, constant_pool); - setLocalVariableTable(local_variable_table); - } - - /** - * Construct object from file stream. - * @param name_index Index in constant pool - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - * @throws IOException - */ - LocalVariableTable(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(name_index, length, (LocalVariable[])null, constant_pool); - - local_variable_table_length = (file.readUnsignedShort()); - local_variable_table = new LocalVariable[local_variable_table_length]; - - for(int i=0; i < local_variable_table_length; i++) - local_variable_table[i] = new LocalVariable(file, constant_pool); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitLocalVariableTable(this); - } - - /** - * Dump local variable table attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - file.writeShort(local_variable_table_length); - for(int i=0; i < local_variable_table_length; i++) - local_variable_table[i].dump(file); - } - - /** - * @return Array of local variables of method. - */ - public final LocalVariable[] getLocalVariableTable() { - return local_variable_table; - } - - /** - * @return first matching variable using index - * - * @param index the variable slot - * - * @return the first LocalVariable that matches the slot or null if not found - * - * @deprecated since 5.2 because multiple variables can share the - * same slot, use getLocalVariable(int index, int pc) instead. - */ - public final LocalVariable getLocalVariable(int index) { - for(int i=0; i < local_variable_table_length; i++) - if(local_variable_table[i].getIndex() == index) - return local_variable_table[i]; - - return null; - } - - /** - * @return matching variable using index when variable is used at supplied pc - * - * @param index the variable slot - * @param pc the current pc that this variable is alive - * - * @return the LocalVariable that matches or null if not found - */ - public final LocalVariable getLocalVariable(int index, int pc) { - for(int i=0; i < local_variable_table_length; i++) - if(local_variable_table[i].getIndex() == index) { - int start_pc = local_variable_table[i].getStartPC(); - int end_pc = start_pc + local_variable_table[i].getLength(); - if ((pc >= start_pc) && (pc < end_pc)) - return local_variable_table[i]; - } - - return null; - } - - public final void setLocalVariableTable(LocalVariable[] local_variable_table) - { - this.local_variable_table = local_variable_table; - local_variable_table_length = (local_variable_table == null)? 0 : - local_variable_table.length; - } - - /** - * @return String representation. - */ - public final String toString() { - StringBuffer buf = new StringBuffer(""); - - for(int i=0; i < local_variable_table_length; i++) { - buf.append(local_variable_table[i].toString()); - - if(i < local_variable_table_length - 1) - buf.append('\n'); + + private int local_variable_table_length; // Table of local + private LocalVariable[] local_variable_table; // variables + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use copy() for a physical copy. + */ + public LocalVariableTable(LocalVariableTable c) { + this(c.getNameIndex(), c.getLength(), c.getLocalVariableTable(), c.getConstantPool()); } - return buf.toString(); - } - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool _constant_pool) { - LocalVariableTable c = (LocalVariableTable)clone(); + /** + * @param name_index Index in constant pool to `LocalVariableTable' + * @param length Content length in bytes + * @param local_variable_table Table of local variables + * @param constant_pool Array of constants + */ + public LocalVariableTable(int name_index, int length, LocalVariable[] local_variable_table, + ConstantPool constant_pool) { + super(Constants.ATTR_LOCAL_VARIABLE_TABLE, name_index, length, constant_pool); + setLocalVariableTable(local_variable_table); + } + + + /** + * Construct object from file stream. + * @param name_index Index in constant pool + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + LocalVariableTable(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, (LocalVariable[]) null, constant_pool); + local_variable_table_length = (file.readUnsignedShort()); + local_variable_table = new LocalVariable[local_variable_table_length]; + for (int i = 0; i < local_variable_table_length; i++) { + local_variable_table[i] = new LocalVariable(file, constant_pool); + } + } - c.local_variable_table = new LocalVariable[local_variable_table_length]; - for(int i=0; i < local_variable_table_length; i++) - c.local_variable_table[i] = local_variable_table[i].copy(); - c.constant_pool = _constant_pool; - return c; - } + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitLocalVariableTable(this); + } + + + /** + * Dump local variable table attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + file.writeShort(local_variable_table_length); + for (int i = 0; i < local_variable_table_length; i++) { + local_variable_table[i].dump(file); + } + } + + + /** + * @return Array of local variables of method. + */ + public final LocalVariable[] getLocalVariableTable() { + return local_variable_table; + } + - public final int getTableLength() { return local_variable_table_length; } + /** + * @return first matching variable using index + * + * @param index the variable slot + * + * @return the first LocalVariable that matches the slot or null if not found + * + * @deprecated since 5.2 because multiple variables can share the + * same slot, use getLocalVariable(int index, int pc) instead. + */ + public final LocalVariable getLocalVariable( int index ) { + for (int i = 0; i < local_variable_table_length; i++) { + if (local_variable_table[i].getIndex() == index) { + return local_variable_table[i]; + } + } + return null; + } + + + /** + * @return matching variable using index when variable is used at supplied pc + * + * @param index the variable slot + * @param pc the current pc that this variable is alive + * + * @return the LocalVariable that matches or null if not found + */ + public final LocalVariable getLocalVariable( int index, int pc ) { + for (int i = 0; i < local_variable_table_length; i++) { + if (local_variable_table[i].getIndex() == index) { + int start_pc = local_variable_table[i].getStartPC(); + int end_pc = start_pc + local_variable_table[i].getLength(); + if ((pc >= start_pc) && (pc < end_pc)) { + return local_variable_table[i]; + } + } + } + return null; + } + + + public final void setLocalVariableTable( LocalVariable[] local_variable_table ) { + this.local_variable_table = local_variable_table; + local_variable_table_length = (local_variable_table == null) + ? 0 + : local_variable_table.length; + } + + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer(""); + for (int i = 0; i < local_variable_table_length; i++) { + buf.append(local_variable_table[i].toString()); + if (i < local_variable_table_length - 1) { + buf.append('\n'); + } + } + return buf.toString(); + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + LocalVariableTable c = (LocalVariableTable) clone(); + c.local_variable_table = new LocalVariable[local_variable_table_length]; + for (int i = 0; i < local_variable_table_length; i++) { + c.local_variable_table[i] = local_variable_table[i].copy(); + } + c.constant_pool = _constant_pool; + return c; + } + + + public final int getTableLength() { + return local_variable_table_length; + } } diff --git a/src/java/org/apache/bcel/classfile/Method.java b/src/java/org/apache/bcel/classfile/Method.java index 967b20ad..e5368d6c 100644 --- a/src/java/org/apache/bcel/classfile/Method.java +++ b/src/java/org/apache/bcel/classfile/Method.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; import java.io.DataInputStream; @@ -31,226 +31,224 @@ import org.apache.bcel.util.BCELComparator; * @author M. Dahm */ public final class Method extends FieldOrMethod { - private static BCELComparator _cmp = new BCELComparator() { - public boolean equals(Object o1, Object o2) { - Method THIS = (Method)o1; - Method THAT = (Method)o2; - return THIS.getName().equals(THAT.getName()) - && THIS.getSignature().equals(THAT.getSignature()); + private static BCELComparator _cmp = new BCELComparator() { + + public boolean equals( Object o1, Object o2 ) { + Method THIS = (Method) o1; + Method THAT = (Method) o2; + return THIS.getName().equals(THAT.getName()) + && THIS.getSignature().equals(THAT.getSignature()); + } + + + public int hashCode( Object o ) { + Method THIS = (Method) o; + return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + } + }; + + + /** + * Empty constructor, all attributes have to be defined via `setXXX' + * methods. Use at your own risk. + */ + public Method() { + } + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public Method(Method c) { + super(c); + } + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + * @throws ClassFormatException + */ + Method(DataInputStream file, ConstantPool constant_pool) throws IOException, + ClassFormatException { + super(file, constant_pool); + } + + + /** + * @param access_flags Access rights of method + * @param name_index Points to field name in constant pool + * @param signature_index Points to encoded signature + * @param attributes Collection of attributes + * @param constant_pool Array of constants + */ + public Method(int access_flags, int name_index, int signature_index, Attribute[] attributes, + ConstantPool constant_pool) { + super(access_flags, name_index, signature_index, attributes, constant_pool); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitMethod(this); + } + + + /** + * @return Code attribute of method, if any + */ + public final Code getCode() { + for (int i = 0; i < attributes_count; i++) { + if (attributes[i] instanceof Code) { + return (Code) attributes[i]; + } + } + return null; + } + + + /** + * @return ExceptionTable attribute of method, if any, i.e., list all + * exceptions the method may throw not exception handlers! + */ + public final ExceptionTable getExceptionTable() { + for (int i = 0; i < attributes_count; i++) { + if (attributes[i] instanceof ExceptionTable) { + return (ExceptionTable) attributes[i]; + } + } + return null; } - public int hashCode(Object o) { - Method THIS = (Method)o; - return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + + /** @return LocalVariableTable of code attribute if any, i.e. the call is forwarded + * to the Code atribute. + */ + public final LocalVariableTable getLocalVariableTable() { + Code code = getCode(); + if (code == null) { + return null; + } + return code.getLocalVariableTable(); + } + + + /** @return LineNumberTable of code attribute if any, i.e. the call is forwarded + * to the Code atribute. + */ + public final LineNumberTable getLineNumberTable() { + Code code = getCode(); + if (code == null) { + return null; + } + return code.getLineNumberTable(); + } + + + /** + * Return string representation close to declaration format, + * `public static void main(String[] args) throws IOException', e.g. + * + * @return String representation of the method. + */ + public final String toString() { + ConstantUtf8 c; + String name, signature, access; // Short cuts to constant pool + StringBuffer buf; + access = Utility.accessToString(access_flags); + // Get name and signature from constant pool + c = (ConstantUtf8) constant_pool.getConstant(signature_index, Constants.CONSTANT_Utf8); + signature = c.getBytes(); + c = (ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8); + name = c.getBytes(); + signature = Utility.methodSignatureToString(signature, name, access, true, + getLocalVariableTable()); + buf = new StringBuffer(signature); + for (int i = 0; i < attributes_count; i++) { + Attribute a = attributes[i]; + if (!((a instanceof Code) || (a instanceof ExceptionTable))) { + buf.append(" [").append(a.toString()).append("]"); + } + } + ExceptionTable e = getExceptionTable(); + if (e != null) { + String str = e.toString(); + if (!str.equals("")) { + buf.append("\n\t\tthrows ").append(str); + } + } + return buf.toString(); + } + + + /** + * @return deep copy of this method + */ + public final Method copy( ConstantPool _constant_pool ) { + return (Method) copy_(_constant_pool); + } + + + /** + * @return return type of method + */ + public Type getReturnType() { + return Type.getReturnType(getSignature()); + } + + + /** + * @return array of method argument types + */ + public Type[] getArgumentTypes() { + return Type.getArgumentTypes(getSignature()); + } + + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; } - }; - - /** - * Empty constructor, all attributes have to be defined via `setXXX' - * methods. Use at your own risk. - */ - public Method() { - } - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public Method(Method c) { - super(c); - } - - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - * @throws ClassFormatException - */ - Method(DataInputStream file, ConstantPool constant_pool) - throws IOException, ClassFormatException { - super(file, constant_pool); - } - - /** - * @param access_flags Access rights of method - * @param name_index Points to field name in constant pool - * @param signature_index Points to encoded signature - * @param attributes Collection of attributes - * @param constant_pool Array of constants - */ - public Method( - int access_flags, - int name_index, - int signature_index, - Attribute[] attributes, - ConstantPool constant_pool) { - super(access_flags, name_index, signature_index, attributes, constant_pool); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitMethod(this); - } - - /** - * @return Code attribute of method, if any - */ - public final Code getCode() { - for (int i = 0; i < attributes_count; i++) - if (attributes[i] instanceof Code) - return (Code)attributes[i]; - - return null; - } - - /** - * @return ExceptionTable attribute of method, if any, i.e., list all - * exceptions the method may throw not exception handlers! - */ - public final ExceptionTable getExceptionTable() { - for (int i = 0; i < attributes_count; i++) - if (attributes[i] instanceof ExceptionTable) - return (ExceptionTable)attributes[i]; - - return null; - } - - /** @return LocalVariableTable of code attribute if any, i.e. the call is forwarded - * to the Code atribute. - */ - public final LocalVariableTable getLocalVariableTable() { - Code code = getCode(); - - if (code == null) - return null; - - return code.getLocalVariableTable(); - } - - /** @return LineNumberTable of code attribute if any, i.e. the call is forwarded - * to the Code atribute. - */ - public final LineNumberTable getLineNumberTable() { - Code code = getCode(); - - if (code == null) - return null; - - return code.getLineNumberTable(); - } - - /** - * Return string representation close to declaration format, - * `public static void main(String[] args) throws IOException', e.g. - * - * @return String representation of the method. - */ - public final String toString() { - ConstantUtf8 c; - String name, signature, access; // Short cuts to constant pool - StringBuffer buf; - - access = Utility.accessToString(access_flags); - - // Get name and signature from constant pool - c = - (ConstantUtf8)constant_pool.getConstant( - signature_index, - Constants.CONSTANT_Utf8); - signature = c.getBytes(); - - c = - (ConstantUtf8)constant_pool.getConstant( - name_index, - Constants.CONSTANT_Utf8); - name = c.getBytes(); - - signature = - Utility.methodSignatureToString( - signature, - name, - access, - true, - getLocalVariableTable()); - buf = new StringBuffer(signature); - - for (int i = 0; i < attributes_count; i++) { - Attribute a = attributes[i]; - - if (!((a instanceof Code) || (a instanceof ExceptionTable))) - buf.append(" [").append(a.toString()).append("]"); + + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator( BCELComparator comparator ) { + _cmp = comparator; } - ExceptionTable e = getExceptionTable(); - if (e != null) { - String str = e.toString(); - if (!str.equals("")) - buf.append("\n\t\tthrows ").append(str); + + /** + * Return value as defined by given BCELComparator strategy. + * By default two method objects are said to be equal when + * their names and signatures are equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals( Object obj ) { + return _cmp.equals(this, obj); } - return buf.toString(); - } - - /** - * @return deep copy of this method - */ - public final Method copy(ConstantPool _constant_pool) { - return (Method)copy_(_constant_pool); - } - - /** - * @return return type of method - */ - public Type getReturnType() { - return Type.getReturnType(getSignature()); - } - - /** - * @return array of method argument types - */ - public Type[] getArgumentTypes() { - return Type.getArgumentTypes(getSignature()); - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default two method objects are said to be equal when - * their names and signatures are equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default return the hashcode of the method's name XOR signature. - * - * @see java.lang.Object#hashCode() - */ - public int hashCode() { - return _cmp.hashCode(this); - } + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the method's name XOR signature. + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); + } } diff --git a/src/java/org/apache/bcel/classfile/Node.java b/src/java/org/apache/bcel/classfile/Node.java index 23cd8c3e..c1fa8d9b 100644 --- a/src/java/org/apache/bcel/classfile/Node.java +++ b/src/java/org/apache/bcel/classfile/Node.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - /** * Denote class to have an accept method(); * @@ -24,5 +23,6 @@ package org.apache.bcel.classfile; * @author M. Dahm */ public interface Node { - public void accept(Visitor obj); + + public void accept( Visitor obj ); } diff --git a/src/java/org/apache/bcel/classfile/PMGClass.java b/src/java/org/apache/bcel/classfile/PMGClass.java index 1846feba..709e3ddd 100644 --- a/src/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/java/org/apache/bcel/classfile/PMGClass.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -31,124 +30,138 @@ import org.apache.bcel.Constants; * @see Attribute */ public final class PMGClass extends Attribute { - private int pmg_class_index, pmg_index; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public PMGClass(PMGClass c) { - this(c.getNameIndex(), c.getLength(), c.getPMGIndex(), c.getPMGClassIndex(), - c.getConstantPool()); - } - - /** - * Construct object from file stream. - * @param name_index Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - * @throws IOException - */ - PMGClass(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(name_index, length, file.readUnsignedShort(), file.readUnsignedShort(), - constant_pool); - } - - /** - * @param name_index Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes - * @param pmg_index index in constant pool for source file name - * @param pmg_class_index Index in constant pool to CONSTANT_Utf8 - * @param constant_pool Array of constants - */ - public PMGClass(int name_index, int length, int pmg_index, int pmg_class_index, - ConstantPool constant_pool) - { - super(Constants.ATTR_PMG, name_index, length, constant_pool); - this.pmg_index = pmg_index; - this.pmg_class_index = pmg_class_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - System.err.println("Visiting non-standard PMGClass object"); - } - - /** - * Dump source file attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - file.writeShort(pmg_index); - file.writeShort(pmg_class_index); - } - - /** - * @return Index in constant pool of source file name. - */ - public final int getPMGClassIndex() { return pmg_class_index; } - - /** - * @param pmg_class_index - */ - public final void setPMGClassIndex(int pmg_class_index) { - this.pmg_class_index = pmg_class_index; - } - - /** - * @return Index in constant pool of source file name. - */ - public final int getPMGIndex() { return pmg_index; } - - /** - * @param pmg_index - */ - public final void setPMGIndex(int pmg_index) { - this.pmg_index = pmg_index; - } - - /** - * @return PMG name. - */ - public final String getPMGName() { - ConstantUtf8 c = (ConstantUtf8)constant_pool.getConstant(pmg_index, - Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return PMG class name. - */ - public final String getPMGClassName() { - ConstantUtf8 c = (ConstantUtf8)constant_pool.getConstant(pmg_class_index, - Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return String representation - */ - public final String toString() { - return "PMGClass(" + getPMGName() + ", " + getPMGClassName() + ")"; - } - - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool _constant_pool) { - return (PMGClass)clone(); - } + + private int pmg_class_index, pmg_index; + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public PMGClass(PMGClass c) { + this(c.getNameIndex(), c.getLength(), c.getPMGIndex(), c.getPMGClassIndex(), c + .getConstantPool()); + } + + + /** + * Construct object from file stream. + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + PMGClass(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, file.readUnsignedShort(), file.readUnsignedShort(), constant_pool); + } + + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param pmg_index index in constant pool for source file name + * @param pmg_class_index Index in constant pool to CONSTANT_Utf8 + * @param constant_pool Array of constants + */ + public PMGClass(int name_index, int length, int pmg_index, int pmg_class_index, + ConstantPool constant_pool) { + super(Constants.ATTR_PMG, name_index, length, constant_pool); + this.pmg_index = pmg_index; + this.pmg_class_index = pmg_class_index; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + System.err.println("Visiting non-standard PMGClass object"); + } + + + /** + * Dump source file attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + file.writeShort(pmg_index); + file.writeShort(pmg_class_index); + } + + + /** + * @return Index in constant pool of source file name. + */ + public final int getPMGClassIndex() { + return pmg_class_index; + } + + + /** + * @param pmg_class_index + */ + public final void setPMGClassIndex( int pmg_class_index ) { + this.pmg_class_index = pmg_class_index; + } + + + /** + * @return Index in constant pool of source file name. + */ + public final int getPMGIndex() { + return pmg_index; + } + + + /** + * @param pmg_index + */ + public final void setPMGIndex( int pmg_index ) { + this.pmg_index = pmg_index; + } + + + /** + * @return PMG name. + */ + public final String getPMGName() { + ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(pmg_index, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + + /** + * @return PMG class name. + */ + public final String getPMGClassName() { + ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(pmg_class_index, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + + /** + * @return String representation + */ + public final String toString() { + return "PMGClass(" + getPMGName() + ", " + getPMGClassName() + ")"; + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + return (PMGClass) clone(); + } } diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index 5676beaa..3d210c4e 100644 --- a/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -20,53 +20,56 @@ import java.io.DataInputStream; import java.io.IOException; import org.apache.bcel.Constants; - /** * represents one parameter annotation in the parameter annotation table * * @version $Id: ParameterAnnotationEntry * @author D. Brosius */ -public class ParameterAnnotationEntry implements Node, Constants -{ - private int annotation_table_length; - private AnnotationEntry[] annotation_table; - - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - */ - ParameterAnnotationEntry(DataInputStream file, ConstantPool constant_pool) - throws IOException - { - annotation_table_length = (file.readUnsignedShort()); +public class ParameterAnnotationEntry implements Node, Constants { + + private int annotation_table_length; + private AnnotationEntry[] annotation_table; + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + ParameterAnnotationEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { + annotation_table_length = (file.readUnsignedShort()); + annotation_table = new AnnotationEntry[annotation_table_length]; + for (int i = 0; i < annotation_table_length; i++) { + annotation_table[i] = new AnnotationEntry(file, constant_pool); + } + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + // v.visitParameterAnnotationEntry(this); + } + + + /** + * @return the number of annotation entries in this parameter annotation + */ + public final int getNumAnnotations() { + return annotation_table_length; + } + - annotation_table = new AnnotationEntry[annotation_table_length]; - for(int i=0; i < annotation_table_length; i++) - annotation_table[i] = new AnnotationEntry(file, constant_pool); - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { -// v.visitParameterAnnotationEntry(this); - } - - /** - * @return the number of annotation entries in this parameter annotation - */ - public final int getNumAnnotations() { return annotation_table_length; } - - /** - * returns the array of annotation entries in this annotation - */ - public AnnotationEntry[] getAnnotationEntries() { - return annotation_table; - } + /** + * returns the array of annotation entries in this annotation + */ + public AnnotationEntry[] getAnnotationEntries() { + return annotation_table; + } } diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/java/org/apache/bcel/classfile/ParameterAnnotations.java index 7e8d3700..706ed1cd 100644 --- a/src/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -27,80 +27,87 @@ import java.io.IOException; */ public abstract class ParameterAnnotations extends Attribute { - private int num_parameters; - private ParameterAnnotationEntry[] parameter_annotation_table; // Table of parameter annotations - - /** - * @param parameter_annotation_type the subclass type of the parameter annotation - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(parameter_annotation_type, name_index, length, (ParameterAnnotationEntry[]) null, constant_pool); - - num_parameters = (file.readUnsignedByte()); - parameter_annotation_table = new ParameterAnnotationEntry[num_parameters]; - - for(int i=0; i < num_parameters; i++) - parameter_annotation_table[i] = new ParameterAnnotationEntry(file, constant_pool); - } - - /** - * @param parameter_annotation_type the subclass type of the parameter annotation - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param parameter_annotation_table the actual parameter annotations - * @param constant_pool Array of constants - */ - public ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, ParameterAnnotationEntry[] parameter_annotation_table, ConstantPool constant_pool) - { - super(parameter_annotation_type, name_index, length, constant_pool); - setParameterAnnotationTable(parameter_annotation_table); - - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { -// v.visitParameterAnnotation(this); - } - - /** - * @param parameter_annotation_table the entries to set in this parameter annotation - */ - public final void setParameterAnnotationTable(ParameterAnnotationEntry[] parameter_annotation_table) - { - this.parameter_annotation_table = parameter_annotation_table; - num_parameters = (parameter_annotation_table == null)? 0 : - parameter_annotation_table.length; - } - - /** - * @return the parameter annotation entry table - */ - public final ParameterAnnotationEntry[] getParameterAnnotationTable() - { - return parameter_annotation_table; - } - - /** - * returns the array of parameter annotation entries in this parameter annotation - */ - public ParameterAnnotationEntry[] getParameterAnnotationEntries() { - return parameter_annotation_table; - } - - /** - * @return the number of parameter annotation entries in this parameter annotation - */ - public final int getNumParameterAnnotation() { return num_parameters; } + private int num_parameters; + private ParameterAnnotationEntry[] parameter_annotation_table; // Table of parameter annotations + + + /** + * @param parameter_annotation_type the subclass type of the parameter annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, + DataInputStream file, ConstantPool constant_pool) throws IOException { + this(parameter_annotation_type, name_index, length, (ParameterAnnotationEntry[]) null, + constant_pool); + num_parameters = (file.readUnsignedByte()); + parameter_annotation_table = new ParameterAnnotationEntry[num_parameters]; + for (int i = 0; i < num_parameters; i++) { + parameter_annotation_table[i] = new ParameterAnnotationEntry(file, constant_pool); + } + } + + + /** + * @param parameter_annotation_type the subclass type of the parameter annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param parameter_annotation_table the actual parameter annotations + * @param constant_pool Array of constants + */ + public ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, + ParameterAnnotationEntry[] parameter_annotation_table, ConstantPool constant_pool) { + super(parameter_annotation_type, name_index, length, constant_pool); + setParameterAnnotationTable(parameter_annotation_table); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + // v.visitParameterAnnotation(this); + } + + + /** + * @param parameter_annotation_table the entries to set in this parameter annotation + */ + public final void setParameterAnnotationTable( + ParameterAnnotationEntry[] parameter_annotation_table ) { + this.parameter_annotation_table = parameter_annotation_table; + num_parameters = (parameter_annotation_table == null) + ? 0 + : parameter_annotation_table.length; + } + + + /** + * @return the parameter annotation entry table + */ + public final ParameterAnnotationEntry[] getParameterAnnotationTable() { + return parameter_annotation_table; + } + + + /** + * returns the array of parameter annotation entries in this parameter annotation + */ + public ParameterAnnotationEntry[] getParameterAnnotationEntries() { + return parameter_annotation_table; + } + + + /** + * @return the number of parameter annotation entries in this parameter annotation + */ + public final int getNumParameterAnnotation() { + return num_parameters; + } } diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 63d7ca49..2e5042c5 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; import java.io.DataInputStream; @@ -27,27 +27,25 @@ import org.apache.bcel.Constants; * @version $Id: RuntimeInvisibleAnnotations * @author D. Brosius */ -public class RuntimeInvisibleAnnotations extends Annotations -{ - /** - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - RuntimeInvisibleAnnotations(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - super(Constants.ATTR_RUNTIMEINVISIBLE_ANNOTATIONS, name_index, length, file, constant_pool); - } +public class RuntimeInvisibleAnnotations extends Annotations { + + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + RuntimeInvisibleAnnotations(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException { + super(Constants.ATTR_RUNTIMEINVISIBLE_ANNOTATIONS, name_index, length, file, constant_pool); + } - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool constant_pool) { - Annotations c = (Annotations)clone(); - - return c; - } + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool constant_pool ) { + Annotations c = (Annotations) clone(); + return c; + } } diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 43b06458..327f786e 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; import java.io.DataInputStream; @@ -27,27 +27,26 @@ import org.apache.bcel.Constants; * @version $Id: RuntimeInvisibleParameterAnnotations * @author D. Brosius */ -public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations -{ - /** - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - super(Constants.ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, constant_pool); - } +public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { + + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException { + super(Constants.ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, + constant_pool); + } - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool constant_pool) { - Annotations c = (Annotations)clone(); - - return c; - } + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool constant_pool ) { + Annotations c = (Annotations) clone(); + return c; + } } diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index b5428961..0836631f 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; import java.io.DataInputStream; @@ -27,27 +27,25 @@ import org.apache.bcel.Constants; * @version $Id: RuntimeVisibleAnnotations * @author D. Brosius */ -public class RuntimeVisibleAnnotations extends Annotations -{ - /** - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - RuntimeVisibleAnnotations(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - super(Constants.ATTR_RUNTIMEVISIBLE_ANNOTATIONS, name_index, length, file, constant_pool); - } +public class RuntimeVisibleAnnotations extends Annotations { + + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + RuntimeVisibleAnnotations(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException { + super(Constants.ATTR_RUNTIMEVISIBLE_ANNOTATIONS, name_index, length, file, constant_pool); + } - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool constant_pool) { - Annotations c = (Annotations)clone(); - - return c; - } + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool constant_pool ) { + Annotations c = (Annotations) clone(); + return c; + } } diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index df3f1f69..2dd9067b 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; import java.io.DataInputStream; @@ -27,27 +27,26 @@ import org.apache.bcel.Constants; * @version $Id: RuntimeVisibleParameterAnnotations * @author D. Brosius */ -public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations -{ - /** - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - RuntimeVisibleParameterAnnotations(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - super(Constants.ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, constant_pool); - } +public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { + + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + RuntimeVisibleParameterAnnotations(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException { + super(Constants.ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, + constant_pool); + } - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool constant_pool) { - Annotations c = (Annotations)clone(); - - return c; - } + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool constant_pool ) { + Annotations c = (Annotations) clone(); + return c; + } } diff --git a/src/java/org/apache/bcel/classfile/Signature.java b/src/java/org/apache/bcel/classfile/Signature.java index abd49a9b..340c76ee 100644 --- a/src/java/org/apache/bcel/classfile/Signature.java +++ b/src/java/org/apache/bcel/classfile/Signature.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -32,227 +31,243 @@ import org.apache.bcel.Constants; * @see Attribute */ public final class Signature extends Attribute { - private int signature_index; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public Signature(Signature c) { - this(c.getNameIndex(), c.getLength(), c.getSignatureIndex(), c.getConstantPool()); - } - - /** - * Construct object from file stream. - * @param name_index Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - * @throws IOException - */ - Signature(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(name_index, length, file.readUnsignedShort(), constant_pool); - } - - /** - * @param name_index Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes - * @param signature_index Index in constant pool to CONSTANT_Utf8 - * @param constant_pool Array of constants - */ - public Signature(int name_index, int length, int signature_index, - ConstantPool constant_pool) - { - super(Constants.ATTR_SIGNATURE, name_index, length, constant_pool); - this.signature_index = signature_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - //System.err.println("Visiting non-standard Signature object"); - v.visitSignature(this); - } - - /** - * Dump source file attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - file.writeShort(signature_index); - } - - /** - * @return Index in constant pool of source file name. - */ - public final int getSignatureIndex() { return signature_index; } - - /** - * @param signature_index the index info the constant pool of this signature - */ - public final void setSignatureIndex(int signature_index) { - this.signature_index = signature_index; - } - - /** - * @return GJ signature. - */ - public final String getSignature() { - ConstantUtf8 c = (ConstantUtf8)constant_pool.getConstant(signature_index, - Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * Extends ByteArrayInputStream to make 'unreading' chars possible. - */ - private static final class MyByteArrayInputStream extends ByteArrayInputStream { - MyByteArrayInputStream(String data) { super(data.getBytes()); } - final int mark() { return pos; } - final String getData() { return new String(buf); } - final void reset(int p) { pos = p; } - final void unread() { if(pos > 0) pos--; } - } - - private static boolean identStart(int ch) { - return ch == 'T' || ch == 'L'; - } - - private static final void matchIdent(MyByteArrayInputStream in, StringBuffer buf) { - int ch; - - if((ch = in.read()) == -1) - throw new RuntimeException("Illegal signature: " + in.getData() + - " no ident, reaching EOF"); - - //System.out.println("return from ident:" + (char)ch); - - if(!identStart(ch)) { - StringBuffer buf2 = new StringBuffer(); - - int count = 1; - while(Character.isJavaIdentifierPart((char)ch)) { - buf2.append((char)ch); - count++; - ch = in.read(); - } - - if(ch == ':') { // Ok, formal parameter - in.skip("Ljava/lang/Object".length()); - buf.append(buf2); + private int signature_index; + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public Signature(Signature c) { + this(c.getNameIndex(), c.getLength(), c.getSignatureIndex(), c.getConstantPool()); + } + + + /** + * Construct object from file stream. + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + Signature(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, file.readUnsignedShort(), constant_pool); + } + + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param signature_index Index in constant pool to CONSTANT_Utf8 + * @param constant_pool Array of constants + */ + public Signature(int name_index, int length, int signature_index, ConstantPool constant_pool) { + super(Constants.ATTR_SIGNATURE, name_index, length, constant_pool); + this.signature_index = signature_index; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + //System.err.println("Visiting non-standard Signature object"); + v.visitSignature(this); + } + + + /** + * Dump source file attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + file.writeShort(signature_index); + } + + + /** + * @return Index in constant pool of source file name. + */ + public final int getSignatureIndex() { + return signature_index; + } + + + /** + * @param signature_index the index info the constant pool of this signature + */ + public final void setSignatureIndex( int signature_index ) { + this.signature_index = signature_index; + } + + + /** + * @return GJ signature. + */ + public final String getSignature() { + ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(signature_index, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + /** + * Extends ByteArrayInputStream to make 'unreading' chars possible. + */ + private static final class MyByteArrayInputStream extends ByteArrayInputStream { + + MyByteArrayInputStream(String data) { + super(data.getBytes()); + } + + + final int mark() { + return pos; + } + + + final String getData() { + return new String(buf); + } + + + final void reset( int p ) { + pos = p; + } + + + final void unread() { + if (pos > 0) { + pos--; + } + } + } + + + private static boolean identStart( int ch ) { + return ch == 'T' || ch == 'L'; + } + + + private static final void matchIdent( MyByteArrayInputStream in, StringBuffer buf ) { + int ch; + if ((ch = in.read()) == -1) { + throw new RuntimeException("Illegal signature: " + in.getData() + + " no ident, reaching EOF"); + } + //System.out.println("return from ident:" + (char)ch); + if (!identStart(ch)) { + StringBuffer buf2 = new StringBuffer(); + int count = 1; + while (Character.isJavaIdentifierPart((char) ch)) { + buf2.append((char) ch); + count++; + ch = in.read(); + } + if (ch == ':') { // Ok, formal parameter + in.skip("Ljava/lang/Object".length()); + buf.append(buf2); + ch = in.read(); + in.unread(); + //System.out.println("so far:" + buf2 + ":next:" +(char)ch); + } else { + for (int i = 0; i < count; i++) { + in.unread(); + } + } + return; + } + StringBuffer buf2 = new StringBuffer(); + ch = in.read(); + do { + buf2.append((char) ch); + ch = in.read(); + //System.out.println("within ident:"+ (char)ch); + } while ((ch != -1) && (Character.isJavaIdentifierPart((char) ch) || (ch == '/'))); + buf.append(buf2.toString().replace('/', '.')); + //System.out.println("regular return ident:"+ (char)ch + ":" + buf2); + if (ch != -1) { + in.unread(); + } + } + + + private static final void matchGJIdent( MyByteArrayInputStream in, StringBuffer buf ) { + int ch; + matchIdent(in, buf); ch = in.read(); - in.unread(); - //System.out.println("so far:" + buf2 + ":next:" +(char)ch); - } else { - for(int i=0; i < count; i++) - in.unread(); - } - - return; + if ((ch == '<') || ch == '(') { // Parameterized or method + //System.out.println("Enter <"); + buf.append((char) ch); + matchGJIdent(in, buf); + while (((ch = in.read()) != '>') && (ch != ')')) { // List of parameters + if (ch == -1) { + throw new RuntimeException("Illegal signature: " + in.getData() + + " reaching EOF"); + } + //System.out.println("Still no >"); + buf.append(", "); + in.unread(); + matchGJIdent(in, buf); // Recursive call + } + //System.out.println("Exit >"); + buf.append((char) ch); + } else { + in.unread(); + } + ch = in.read(); + if (identStart(ch)) { + in.unread(); + matchGJIdent(in, buf); + } else if (ch == ')') { + in.unread(); + return; + } else if (ch != ';') { + throw new RuntimeException("Illegal signature: " + in.getData() + " read " + (char) ch); + } + } + + + public static String translate( String s ) { + //System.out.println("Sig:" + s); + StringBuffer buf = new StringBuffer(); + matchGJIdent(new MyByteArrayInputStream(s), buf); + return buf.toString(); } - StringBuffer buf2 = new StringBuffer(); - ch = in.read(); - - do { - buf2.append((char)ch); - ch = in.read(); - //System.out.println("within ident:"+ (char)ch); - - } while((ch != -1) && (Character.isJavaIdentifierPart((char)ch) || (ch == '/'))); - - buf.append(buf2.toString().replace('/', '.')); - - //System.out.println("regular return ident:"+ (char)ch + ":" + buf2); - - if(ch != -1) - in.unread(); - } - - private static final void matchGJIdent(MyByteArrayInputStream in, - StringBuffer buf) - { - int ch; - - matchIdent(in, buf); - - ch = in.read(); - if((ch == '<') || ch == '(') { // Parameterized or method - //System.out.println("Enter <"); - buf.append((char)ch); - matchGJIdent(in, buf); - - while(((ch = in.read()) != '>') && (ch != ')')) { // List of parameters - if(ch == -1) - throw new RuntimeException("Illegal signature: " + in.getData() + - " reaching EOF"); - - //System.out.println("Still no >"); - buf.append(", "); - in.unread(); - matchGJIdent(in, buf); // Recursive call - } - - //System.out.println("Exit >"); - - buf.append((char)ch); - } else - in.unread(); - - ch = in.read(); - if(identStart(ch)) { - in.unread(); - matchGJIdent(in, buf); - } else if(ch == ')') { - in.unread(); - return; - } else if(ch != ';') - throw new RuntimeException("Illegal signature: " + in.getData() + " read " + - (char)ch); - } - - public static String translate(String s) { - //System.out.println("Sig:" + s); - StringBuffer buf = new StringBuffer(); - - matchGJIdent(new MyByteArrayInputStream(s), buf); - - return buf.toString(); - } - - public static final boolean isFormalParameterList(String s) { - return s.startsWith("<") && (s.indexOf(':') > 0); - } - - public static final boolean isActualParameterList(String s) { - return s.startsWith("L") && s.endsWith(">;"); - } - - /** - * @return String representation - */ - public final String toString() { - String s = getSignature(); - - return "Signature(" + s + ")"; - } - - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool _constant_pool) { - return (Signature)clone(); - } + + public static final boolean isFormalParameterList( String s ) { + return s.startsWith("<") && (s.indexOf(':') > 0); + } + + + public static final boolean isActualParameterList( String s ) { + return s.startsWith("L") && s.endsWith(">;"); + } + + + /** + * @return String representation + */ + public final String toString() { + String s = getSignature(); + return "Signature(" + s + ")"; + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + return (Signature) clone(); + } } diff --git a/src/java/org/apache/bcel/classfile/SourceFile.java b/src/java/org/apache/bcel/classfile/SourceFile.java index 5f9c0ef1..e1443bf4 100644 --- a/src/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/java/org/apache/bcel/classfile/SourceFile.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -33,106 +32,114 @@ import org.apache.bcel.Constants; * @see Attribute */ public final class SourceFile extends Attribute { - private int sourcefile_index; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public SourceFile(SourceFile c) { - this(c.getNameIndex(), c.getLength(), c.getSourceFileIndex(), - c.getConstantPool()); - } - - /** - * Construct object from file stream. - * @param name_index Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - * @throws IOException - */ - SourceFile(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(name_index, length, file.readUnsignedShort(), constant_pool); - } - - /** - * @param name_index Index in constant pool to CONSTANT_Utf8, which - * should represent the string "SourceFile". - * @param length Content length in bytes, the value should be 2. - * @param constant_pool The constant pool that this attribute is - * associated with. - * @param sourcefile_index Index in constant pool to CONSTANT_Utf8. This - * string will be interpreted as the name of the file from which this - * class was compiled. It will not be interpreted as indicating the name - * of the directory contqining the file or an absolute path; this - * information has to be supplied the consumer of this attribute - in - * many cases, the JVM. - */ - public SourceFile(int name_index, int length, int sourcefile_index, - ConstantPool constant_pool) - { - super(Constants.ATTR_SOURCE_FILE, name_index, length, constant_pool); - this.sourcefile_index = sourcefile_index; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitSourceFile(this); - } - - /** - * Dump source file attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - file.writeShort(sourcefile_index); - } - - /** - * @return Index in constant pool of source file name. - */ - public final int getSourceFileIndex() { return sourcefile_index; } - - /** - * @param sourcefile_index - */ - public final void setSourceFileIndex(int sourcefile_index) { - this.sourcefile_index = sourcefile_index; - } - - /** - * @return Source file name. - */ - public final String getSourceFileName() { - ConstantUtf8 c = (ConstantUtf8)constant_pool.getConstant(sourcefile_index, - Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - /** - * @return String representation - */ - public final String toString() { - return "SourceFile(" + getSourceFileName() + ")"; - } - - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool _constant_pool) { - return (SourceFile)clone(); - } + + private int sourcefile_index; + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public SourceFile(SourceFile c) { + this(c.getNameIndex(), c.getLength(), c.getSourceFileIndex(), c.getConstantPool()); + } + + + /** + * Construct object from file stream. + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + SourceFile(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, file.readUnsignedShort(), constant_pool); + } + + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8, which + * should represent the string "SourceFile". + * @param length Content length in bytes, the value should be 2. + * @param constant_pool The constant pool that this attribute is + * associated with. + * @param sourcefile_index Index in constant pool to CONSTANT_Utf8. This + * string will be interpreted as the name of the file from which this + * class was compiled. It will not be interpreted as indicating the name + * of the directory contqining the file or an absolute path; this + * information has to be supplied the consumer of this attribute - in + * many cases, the JVM. + */ + public SourceFile(int name_index, int length, int sourcefile_index, ConstantPool constant_pool) { + super(Constants.ATTR_SOURCE_FILE, name_index, length, constant_pool); + this.sourcefile_index = sourcefile_index; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitSourceFile(this); + } + + + /** + * Dump source file attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + file.writeShort(sourcefile_index); + } + + + /** + * @return Index in constant pool of source file name. + */ + public final int getSourceFileIndex() { + return sourcefile_index; + } + + + /** + * @param sourcefile_index + */ + public final void setSourceFileIndex( int sourcefile_index ) { + this.sourcefile_index = sourcefile_index; + } + + + /** + * @return Source file name. + */ + public final String getSourceFileName() { + ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(sourcefile_index, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + + /** + * @return String representation + */ + public final String toString() { + return "SourceFile(" + getSourceFileName() + ")"; + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + return (SourceFile) clone(); + } } diff --git a/src/java/org/apache/bcel/classfile/StackMap.java b/src/java/org/apache/bcel/classfile/StackMap.java index 9dee2065..c6f8ae56 100644 --- a/src/java/org/apache/bcel/classfile/StackMap.java +++ b/src/java/org/apache/bcel/classfile/StackMap.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -38,113 +37,117 @@ import org.apache.bcel.Constants; * @see StackMapType */ public final class StackMap extends Attribute implements Node { - private int map_length; - private StackMapEntry[] map; // Table of stack map entries - - /* - * @param name_index Index of name - * @param length Content length in bytes - * @param map Table of stack map entries - * @param constant_pool Array of constants - */ - public StackMap(int name_index, int length, StackMapEntry[] map, - ConstantPool constant_pool) - { - super(Constants.ATTR_STACK_MAP, name_index, length, constant_pool); - - setStackMap(map); - } - - /** - * Construct object from file stream. - * @param name_index Index of name - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - * @throws IOException - */ - StackMap(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(name_index, length, (StackMapEntry[])null, constant_pool); - - map_length = file.readUnsignedShort(); - map = new StackMapEntry[map_length]; - - for(int i=0; i < map_length; i++) - map[i] = new StackMapEntry(file, constant_pool); - } - - /** - * Dump line number table attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - file.writeShort(map_length); - for(int i=0; i < map_length; i++) - map[i].dump(file); - } - - /** - * @return Array of stack map entries - */ - public final StackMapEntry[] getStackMap() { return map; } - - /** - * @param map Array of stack map entries - */ - public final void setStackMap(StackMapEntry[] map) { - this.map = map; - - map_length = (map == null)? 0 : map.length; - } - - /** - * @return String representation. - */ - public final String toString() { - StringBuffer buf = new StringBuffer("StackMap("); - - for(int i=0; i < map_length; i++) { - buf.append(map[i].toString()); - - if(i < map_length - 1) - buf.append(", "); + + private int map_length; + private StackMapEntry[] map; // Table of stack map entries + + + /* + * @param name_index Index of name + * @param length Content length in bytes + * @param map Table of stack map entries + * @param constant_pool Array of constants + */ + public StackMap(int name_index, int length, StackMapEntry[] map, ConstantPool constant_pool) { + super(Constants.ATTR_STACK_MAP, name_index, length, constant_pool); + setStackMap(map); + } + + + /** + * Construct object from file stream. + * @param name_index Index of name + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + StackMap(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, (StackMapEntry[]) null, constant_pool); + map_length = file.readUnsignedShort(); + map = new StackMapEntry[map_length]; + for (int i = 0; i < map_length; i++) { + map[i] = new StackMapEntry(file, constant_pool); + } + } + + + /** + * Dump line number table attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + file.writeShort(map_length); + for (int i = 0; i < map_length; i++) { + map[i].dump(file); + } + } + + + /** + * @return Array of stack map entries + */ + public final StackMapEntry[] getStackMap() { + return map; } - buf.append(')'); - - return buf.toString(); - } - - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool _constant_pool) { - StackMap c = (StackMap)clone(); - - c.map = new StackMapEntry[map_length]; - for(int i=0; i < map_length; i++) - c.map[i] = map[i].copy(); - - c.constant_pool = _constant_pool; - return c; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackMap(this); - } - - public final int getMapLength() { return map_length; } + + /** + * @param map Array of stack map entries + */ + public final void setStackMap( StackMapEntry[] map ) { + this.map = map; + map_length = (map == null) ? 0 : map.length; + } + + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer("StackMap("); + for (int i = 0; i < map_length; i++) { + buf.append(map[i].toString()); + if (i < map_length - 1) { + buf.append(", "); + } + } + buf.append(')'); + return buf.toString(); + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + StackMap c = (StackMap) clone(); + c.map = new StackMapEntry[map_length]; + for (int i = 0; i < map_length; i++) { + c.map[i] = map[i].copy(); + } + c.constant_pool = _constant_pool; + return c; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackMap(this); + } + + + public final int getMapLength() { + return map_length; + } } diff --git a/src/java/org/apache/bcel/classfile/StackMapEntry.java b/src/java/org/apache/bcel/classfile/StackMapEntry.java index 7043c068..fbf22d32 100644 --- a/src/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/java/org/apache/bcel/classfile/StackMapEntry.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -32,143 +31,182 @@ import java.io.IOException; * @see StackMapType */ public final class StackMapEntry implements Cloneable { - private int byte_code_offset; - private int number_of_locals; - private StackMapType[] types_of_locals; - private int number_of_stack_items; - private StackMapType[] types_of_stack_items; - private ConstantPool constant_pool; - - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - */ - StackMapEntry(DataInputStream file, ConstantPool constant_pool) throws IOException - { - this(file.readShort(), file.readShort(), null, -1, null, constant_pool); - - types_of_locals = new StackMapType[number_of_locals]; - for(int i=0; i < number_of_locals; i++) - types_of_locals[i] = new StackMapType(file, constant_pool); - - number_of_stack_items = file.readShort(); - types_of_stack_items = new StackMapType[number_of_stack_items]; - for(int i=0; i < number_of_stack_items; i++) - types_of_stack_items[i] = new StackMapType(file, constant_pool); - } - - public StackMapEntry(int byte_code_offset, int number_of_locals, - StackMapType[] types_of_locals, - int number_of_stack_items, - StackMapType[] types_of_stack_items, - ConstantPool constant_pool) { - this.byte_code_offset = byte_code_offset; - this.number_of_locals = number_of_locals; - this.types_of_locals = types_of_locals; - this.number_of_stack_items = number_of_stack_items; - this.types_of_stack_items = types_of_stack_items; - this.constant_pool = constant_pool; - } - - /** - * Dump stack map entry - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeShort(byte_code_offset); - - file.writeShort(number_of_locals); - for(int i=0; i < number_of_locals; i++) - types_of_locals[i].dump(file); - - file.writeShort(number_of_stack_items); - for(int i=0; i < number_of_stack_items; i++) - types_of_stack_items[i].dump(file); - } - - /** - * @return String representation. - */ - public final String toString() { - StringBuffer buf = new StringBuffer(64); - buf.append("(offset=").append(byte_code_offset); - - if(number_of_locals > 0) { - buf.append(", locals={"); - - for(int i=0; i < number_of_locals; i++) { - buf.append(types_of_locals[i]); - if(i < number_of_locals - 1) - buf.append(", "); - } - - buf.append("}"); - } - - if(number_of_stack_items > 0) { - buf.append(", stack items={"); - - for(int i=0; i < number_of_stack_items; i++) { - buf.append(types_of_stack_items[i]); - if(i < number_of_stack_items - 1) - buf.append(", "); - } - - buf.append("}"); - } - - buf.append(")"); - - return buf.toString(); - } - - - public void setByteCodeOffset(int b) { byte_code_offset = b; } - public int getByteCodeOffset() { return byte_code_offset; } - public void setNumberOfLocals(int n) { number_of_locals = n; } - public int getNumberOfLocals() { return number_of_locals; } - public void setTypesOfLocals(StackMapType[] t) { types_of_locals = t; } - public StackMapType[] getTypesOfLocals() { return types_of_locals; } - public void setNumberOfStackItems(int n) { number_of_stack_items = n; } - public int getNumberOfStackItems() { return number_of_stack_items; } - public void setTypesOfStackItems(StackMapType[] t) { types_of_stack_items = t; } - public StackMapType[] getTypesOfStackItems() { return types_of_stack_items; } - - /** - * @return deep copy of this object - */ - public StackMapEntry copy() { - try { - return (StackMapEntry)clone(); - } catch(CloneNotSupportedException e) {} - - return null; - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackMapEntry(this); - } - - /** - * @return Constant pool used by this object. - */ - public final ConstantPool getConstantPool() { return constant_pool; } - - /** - * @param constant_pool Constant pool to be used for this object. - */ - public final void setConstantPool(ConstantPool constant_pool) { - this.constant_pool = constant_pool; - } + + private int byte_code_offset; + private int number_of_locals; + private StackMapType[] types_of_locals; + private int number_of_stack_items; + private StackMapType[] types_of_stack_items; + private ConstantPool constant_pool; + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + StackMapEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { + this(file.readShort(), file.readShort(), null, -1, null, constant_pool); + types_of_locals = new StackMapType[number_of_locals]; + for (int i = 0; i < number_of_locals; i++) { + types_of_locals[i] = new StackMapType(file, constant_pool); + } + number_of_stack_items = file.readShort(); + types_of_stack_items = new StackMapType[number_of_stack_items]; + for (int i = 0; i < number_of_stack_items; i++) { + types_of_stack_items[i] = new StackMapType(file, constant_pool); + } + } + + + public StackMapEntry(int byte_code_offset, int number_of_locals, + StackMapType[] types_of_locals, int number_of_stack_items, + StackMapType[] types_of_stack_items, ConstantPool constant_pool) { + this.byte_code_offset = byte_code_offset; + this.number_of_locals = number_of_locals; + this.types_of_locals = types_of_locals; + this.number_of_stack_items = number_of_stack_items; + this.types_of_stack_items = types_of_stack_items; + this.constant_pool = constant_pool; + } + + + /** + * Dump stack map entry + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeShort(byte_code_offset); + file.writeShort(number_of_locals); + for (int i = 0; i < number_of_locals; i++) { + types_of_locals[i].dump(file); + } + file.writeShort(number_of_stack_items); + for (int i = 0; i < number_of_stack_items; i++) { + types_of_stack_items[i].dump(file); + } + } + + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer(64); + buf.append("(offset=").append(byte_code_offset); + if (number_of_locals > 0) { + buf.append(", locals={"); + for (int i = 0; i < number_of_locals; i++) { + buf.append(types_of_locals[i]); + if (i < number_of_locals - 1) { + buf.append(", "); + } + } + buf.append("}"); + } + if (number_of_stack_items > 0) { + buf.append(", stack items={"); + for (int i = 0; i < number_of_stack_items; i++) { + buf.append(types_of_stack_items[i]); + if (i < number_of_stack_items - 1) { + buf.append(", "); + } + } + buf.append("}"); + } + buf.append(")"); + return buf.toString(); + } + + + public void setByteCodeOffset( int b ) { + byte_code_offset = b; + } + + + public int getByteCodeOffset() { + return byte_code_offset; + } + + + public void setNumberOfLocals( int n ) { + number_of_locals = n; + } + + + public int getNumberOfLocals() { + return number_of_locals; + } + + + public void setTypesOfLocals( StackMapType[] t ) { + types_of_locals = t; + } + + + public StackMapType[] getTypesOfLocals() { + return types_of_locals; + } + + + public void setNumberOfStackItems( int n ) { + number_of_stack_items = n; + } + + + public int getNumberOfStackItems() { + return number_of_stack_items; + } + + + public void setTypesOfStackItems( StackMapType[] t ) { + types_of_stack_items = t; + } + + + public StackMapType[] getTypesOfStackItems() { + return types_of_stack_items; + } + + + /** + * @return deep copy of this object + */ + public StackMapEntry copy() { + try { + return (StackMapEntry) clone(); + } catch (CloneNotSupportedException e) { + } + return null; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackMapEntry(this); + } + + + /** + * @return Constant pool used by this object. + */ + public final ConstantPool getConstantPool() { + return constant_pool; + } + + + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool( ConstantPool constant_pool ) { + this.constant_pool = constant_pool; + } } diff --git a/src/java/org/apache/bcel/classfile/StackMapType.java b/src/java/org/apache/bcel/classfile/StackMapType.java index e3881f61..6166abfd 100644 --- a/src/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/java/org/apache/bcel/classfile/StackMapType.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -33,107 +32,130 @@ import org.apache.bcel.Constants; * @see Constants */ public final class StackMapType implements Cloneable { - private byte type; - private int index = -1; // Index to CONSTANT_Class or offset - private ConstantPool constant_pool; - - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - */ - StackMapType(DataInputStream file, ConstantPool constant_pool) throws IOException - { - this(file.readByte(), -1, constant_pool); - - if(hasIndex()) - setIndex(file.readShort()); - - setConstantPool(constant_pool); - } - - /** - * @param type type tag as defined in the Constants interface - * @param index index to constant pool, or byte code offset - */ - public StackMapType(byte type, int index, ConstantPool constant_pool) { - setType(type); - setIndex(index); - setConstantPool(constant_pool); - } - - public void setType(byte t) { - if((t < Constants.ITEM_Bogus) || (t > Constants.ITEM_NewObject)) - throw new RuntimeException("Illegal type for StackMapType: " + t); - type = t; - } - - public byte getType() { return type; } - public void setIndex(int t) { index = t; } - - /** @return index to constant pool if type == ITEM_Object, or offset - * in byte code, if type == ITEM_NewObject, and -1 otherwise - */ - public int getIndex() { return index; } - - /** - * Dump type entries to file. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - file.writeByte(type); - if(hasIndex()) - file.writeShort(getIndex()); - } - - /** @return true, if type is either ITEM_Object or ITEM_NewObject - */ - public final boolean hasIndex() { - return ((type == Constants.ITEM_Object) || - (type == Constants.ITEM_NewObject)); - } - - private String printIndex() { - if(type == Constants.ITEM_Object) { - if (index < 0) - return ", class="; - return ", class=" + constant_pool.constantToString(index, Constants.CONSTANT_Class); - } else if(type == Constants.ITEM_NewObject) - return ", offset=" + index; - else - return ""; - } - - /** - * @return String representation - */ - public final String toString() { - return "(type=" + Constants.ITEM_NAMES[type] + printIndex() + ")"; - } - - /** - * @return deep copy of this object - */ - public StackMapType copy() { - try { - return (StackMapType)clone(); - } catch(CloneNotSupportedException e) {} - - return null; - } - - /** - * @return Constant pool used by this object. - */ - public final ConstantPool getConstantPool() { return constant_pool; } - - /** - * @param constant_pool Constant pool to be used for this object. - */ - public final void setConstantPool(ConstantPool constant_pool) { - this.constant_pool = constant_pool; - } + + private byte type; + private int index = -1; // Index to CONSTANT_Class or offset + private ConstantPool constant_pool; + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + StackMapType(DataInputStream file, ConstantPool constant_pool) throws IOException { + this(file.readByte(), -1, constant_pool); + if (hasIndex()) { + setIndex(file.readShort()); + } + setConstantPool(constant_pool); + } + + + /** + * @param type type tag as defined in the Constants interface + * @param index index to constant pool, or byte code offset + */ + public StackMapType(byte type, int index, ConstantPool constant_pool) { + setType(type); + setIndex(index); + setConstantPool(constant_pool); + } + + + public void setType( byte t ) { + if ((t < Constants.ITEM_Bogus) || (t > Constants.ITEM_NewObject)) { + throw new RuntimeException("Illegal type for StackMapType: " + t); + } + type = t; + } + + + public byte getType() { + return type; + } + + + public void setIndex( int t ) { + index = t; + } + + + /** @return index to constant pool if type == ITEM_Object, or offset + * in byte code, if type == ITEM_NewObject, and -1 otherwise + */ + public int getIndex() { + return index; + } + + + /** + * Dump type entries to file. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(type); + if (hasIndex()) { + file.writeShort(getIndex()); + } + } + + + /** @return true, if type is either ITEM_Object or ITEM_NewObject + */ + public final boolean hasIndex() { + return ((type == Constants.ITEM_Object) || (type == Constants.ITEM_NewObject)); + } + + + private String printIndex() { + if (type == Constants.ITEM_Object) { + if (index < 0) { + return ", class="; + } + return ", class=" + constant_pool.constantToString(index, Constants.CONSTANT_Class); + } else if (type == Constants.ITEM_NewObject) { + return ", offset=" + index; + } else { + return ""; + } + } + + + /** + * @return String representation + */ + public final String toString() { + return "(type=" + Constants.ITEM_NAMES[type] + printIndex() + ")"; + } + + + /** + * @return deep copy of this object + */ + public StackMapType copy() { + try { + return (StackMapType) clone(); + } catch (CloneNotSupportedException e) { + } + return null; + } + + + /** + * @return Constant pool used by this object. + */ + public final ConstantPool getConstantPool() { + return constant_pool; + } + + + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool( ConstantPool constant_pool ) { + this.constant_pool = constant_pool; + } } diff --git a/src/java/org/apache/bcel/classfile/Synthetic.java b/src/java/org/apache/bcel/classfile/Synthetic.java index 03ed373c..3f24d392 100644 --- a/src/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/java/org/apache/bcel/classfile/Synthetic.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -36,108 +35,116 @@ import org.apache.bcel.Constants; * @see Attribute */ public final class Synthetic extends Attribute { - private byte[] bytes; - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use copy() for a physical copy. - */ - public Synthetic(Synthetic c) { - this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); - } - - /** - * @param name_index Index in constant pool to CONSTANT_Utf8, which - * should represent the string "Synthetic". - * @param length Content length in bytes - should be zero. - * @param bytes Attribute contents - * @param constant_pool The constant pool this attribute is associated - * with. - */ - public Synthetic(int name_index, int length, byte[] bytes, - ConstantPool constant_pool) - { - super(Constants.ATTR_SYNTHETIC, name_index, length, constant_pool); - this.bytes = bytes; - } - - /** - * Construct object from file stream. - * @param name_index Index in constant pool to CONSTANT_Utf8 - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - * @throws IOException - */ - Synthetic(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException - { - this(name_index, length, (byte [])null, constant_pool); - - if(length > 0) { - bytes = new byte[length]; - file.readFully(bytes); - System.err.println("Synthetic attribute with length > 0"); + + private byte[] bytes; + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use copy() for a physical copy. + */ + public Synthetic(Synthetic c) { + this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); + } + + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8, which + * should represent the string "Synthetic". + * @param length Content length in bytes - should be zero. + * @param bytes Attribute contents + * @param constant_pool The constant pool this attribute is associated + * with. + */ + public Synthetic(int name_index, int length, byte[] bytes, ConstantPool constant_pool) { + super(Constants.ATTR_SYNTHETIC, name_index, length, constant_pool); + this.bytes = bytes; } - } - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitSynthetic(this); - } - /** - * Dump source file attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - if(length > 0) - file.write(bytes, 0, length); - } - /** - * @return data bytes. - */ - public final byte[] getBytes() { return bytes; } - - /** - * @param bytes - */ - public final void setBytes(byte[] bytes) { - this.bytes = bytes; - } - - /** - * @return String representation. - */ - public final String toString() { - StringBuffer buf = new StringBuffer("Synthetic"); - - if(length > 0) - buf.append(" ").append(Utility.toHexString(bytes)); - - return buf.toString(); - } - - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool _constant_pool) { - Synthetic c = (Synthetic)clone(); - - if (bytes != null) { - c.bytes = new byte[bytes.length]; - System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); + + + /** + * Construct object from file stream. + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + Synthetic(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, (byte[]) null, constant_pool); + if (length > 0) { + bytes = new byte[length]; + file.readFully(bytes); + System.err.println("Synthetic attribute with length > 0"); + } } - c.constant_pool = _constant_pool; - return c; - } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitSynthetic(this); + } + + + /** + * Dump source file attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + if (length > 0) { + file.write(bytes, 0, length); + } + } + + + /** + * @return data bytes. + */ + public final byte[] getBytes() { + return bytes; + } + + + /** + * @param bytes + */ + public final void setBytes( byte[] bytes ) { + this.bytes = bytes; + } + + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer("Synthetic"); + if (length > 0) { + buf.append(" ").append(Utility.toHexString(bytes)); + } + return buf.toString(); + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + Synthetic c = (Synthetic) clone(); + if (bytes != null) { + c.bytes = new byte[bytes.length]; + System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); + } + c.constant_pool = _constant_pool; + return c; + } } diff --git a/src/java/org/apache/bcel/classfile/Unknown.java b/src/java/org/apache/bcel/classfile/Unknown.java index 28748e6c..0d7825bc 100644 --- a/src/java/org/apache/bcel/classfile/Unknown.java +++ b/src/java/org/apache/bcel/classfile/Unknown.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -42,141 +41,148 @@ import org.apache.bcel.Constants; * @author M. Dahm */ public final class Unknown extends Attribute { - private byte[] bytes; - private String name; - - private static Map unknown_attributes = new HashMap(); - - /** @return array of unknown attributes, but just one for each kind. - */ - static Unknown[] getUnknownAttributes() { - Unknown[] unknowns = new Unknown[unknown_attributes.size()]; - Iterator entries = unknown_attributes.values().iterator(); - - for(int i=0; entries.hasNext(); i++) - unknowns[i] = (Unknown)entries.next(); - - unknown_attributes.clear(); - return unknowns; - } - - /** - * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. - */ - public Unknown(Unknown c) { - this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); - } - - /** - * Create a non-standard attribute. - * - * @param name_index Index in constant pool - * @param length Content length in bytes - * @param bytes Attribute contents - * @param constant_pool Array of constants - */ - public Unknown(int name_index, int length, byte[] bytes, - ConstantPool constant_pool) - { - super(Constants.ATTR_UNKNOWN, name_index, length, constant_pool); - this.bytes = bytes; - - name = ((ConstantUtf8)constant_pool.getConstant(name_index, - Constants.CONSTANT_Utf8)).getBytes(); - unknown_attributes.put(name, this); - } - - /** - * Construct object from file stream. - * @param name_index Index in constant pool - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - * @throws IOException - */ - Unknown(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) - throws IOException - { - this(name_index, length, (byte [])null, constant_pool); - - if(length > 0) { - bytes = new byte[length]; - file.readFully(bytes); + + private byte[] bytes; + private String name; + private static Map unknown_attributes = new HashMap(); + + + /** @return array of unknown attributes, but just one for each kind. + */ + static Unknown[] getUnknownAttributes() { + Unknown[] unknowns = new Unknown[unknown_attributes.size()]; + Iterator entries = unknown_attributes.values().iterator(); + for (int i = 0; entries.hasNext(); i++) { + unknowns[i] = (Unknown) entries.next(); + } + unknown_attributes.clear(); + return unknowns; + } + + + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public Unknown(Unknown c) { + this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); + } + + + /** + * Create a non-standard attribute. + * + * @param name_index Index in constant pool + * @param length Content length in bytes + * @param bytes Attribute contents + * @param constant_pool Array of constants + */ + public Unknown(int name_index, int length, byte[] bytes, ConstantPool constant_pool) { + super(Constants.ATTR_UNKNOWN, name_index, length, constant_pool); + this.bytes = bytes; + name = ((ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8)) + .getBytes(); + unknown_attributes.put(name, this); } - } - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitUnknown(this); - } - /** - * Dump unknown bytes to file stream. - * - * @param file Output file stream - * @throws IOException - */ - public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - if(length > 0) - file.write(bytes, 0, length); - } - /** - * @return data bytes. - */ - public final byte[] getBytes() { return bytes; } - - /** - * @return name of attribute. - */ - public final String getName() { return name; } - - /** - * @param bytes the bytes to set - */ - public final void setBytes(byte[] bytes) { - this.bytes = bytes; - } - - /** - * @return String representation. - */ - public final String toString() { - if(length == 0 || bytes == null) - return "(Unknown attribute " + name + ")"; - - String hex; - if(length > 10) { - byte[] tmp = new byte[10]; - System.arraycopy(bytes, 0, tmp, 0, 10); - hex = Utility.toHexString(tmp) + "... (truncated)"; + + + /** + * Construct object from file stream. + * @param name_index Index in constant pool + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + Unknown(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, (byte[]) null, constant_pool); + if (length > 0) { + bytes = new byte[length]; + file.readFully(bytes); + } } - else - hex = Utility.toHexString(bytes); - return "(Unknown attribute " + name + ": " + hex + ")"; - } - /** - * @return deep copy of this attribute - */ - public Attribute copy(ConstantPool _constant_pool) { - Unknown c = (Unknown)clone(); + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitUnknown(this); + } + - if (bytes != null) { - c.bytes = new byte[bytes.length]; - System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); + /** + * Dump unknown bytes to file stream. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + if (length > 0) { + file.write(bytes, 0, length); + } } - c.constant_pool = _constant_pool; - return c; - } + + /** + * @return data bytes. + */ + public final byte[] getBytes() { + return bytes; + } + + + /** + * @return name of attribute. + */ + public final String getName() { + return name; + } + + + /** + * @param bytes the bytes to set + */ + public final void setBytes( byte[] bytes ) { + this.bytes = bytes; + } + + + /** + * @return String representation. + */ + public final String toString() { + if (length == 0 || bytes == null) { + return "(Unknown attribute " + name + ")"; + } + String hex; + if (length > 10) { + byte[] tmp = new byte[10]; + System.arraycopy(bytes, 0, tmp, 0, 10); + hex = Utility.toHexString(tmp) + "... (truncated)"; + } else { + hex = Utility.toHexString(bytes); + } + return "(Unknown attribute " + name + ": " + hex + ")"; + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + Unknown c = (Unknown) clone(); + if (bytes != null) { + c.bytes = new byte[bytes.length]; + System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); + } + c.constant_pool = _constant_pool; + return c; + } } diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/java/org/apache/bcel/classfile/Utility.java index a1170573..14008a42 100644 --- a/src/java/org/apache/bcel/classfile/Utility.java +++ b/src/java/org/apache/bcel/classfile/Utility.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.CharArrayReader; @@ -44,1331 +43,1300 @@ import org.apache.bcel.util.ByteSequence; */ public abstract class Utility { - private static int unwrap(ThreadLocal tl) { - return ((Integer)tl.get()).intValue(); + private static int unwrap( ThreadLocal tl ) { + return ((Integer) tl.get()).intValue(); } - private static void wrap(ThreadLocal tl, int value) { - tl.set(new Integer(value)); - } - private static ThreadLocal consumed_chars = new ThreadLocal() { - protected Object initialValue() { - return new Integer(0); - } - };/* How many chars have been consumed - * during parsing in signatureToString(). - * Read by methodSignatureToString(). - * Set by side effect,but only internally. - */ - - private static boolean wide=false; /* The `WIDE' instruction is used in the - * byte code to allow 16-bit wide indices - * for local variables. This opcode - * precedes an `ILOAD', e.g.. The opcode - * immediately following takes an extra - * byte which is combined with the - * following byte to form a - * 16-bit value. - */ - /** - * Convert bit field of flags into string such as `static final'. - * - * @param access_flags Access flags - * @return String representation of flags - */ - public static final String accessToString(int access_flags) { - return accessToString(access_flags, false); - } - - /** - * Convert bit field of flags into string such as `static final'. - * - * Special case: Classes compiled with new compilers and with the - * `ACC_SUPER' flag would be said to be "synchronized". This is - * because SUN used the same value for the flags `ACC_SUPER' and - * `ACC_SYNCHRONIZED'. - * - * @param access_flags Access flags - * @param for_class access flags are for class qualifiers ? - * @return String representation of flags - */ - public static final String accessToString(int access_flags, - boolean for_class) - { - StringBuffer buf = new StringBuffer(); - - int p = 0; - for(int i=0; p < Constants.MAX_ACC_FLAG; i++) { // Loop through known flags - p = pow2(i); - - if((access_flags & p) != 0) { - /* Special case: Classes compiled with new compilers and with the - * `ACC_SUPER' flag would be said to be "synchronized". This is - * because SUN used the same value for the flags `ACC_SUPER' and - * `ACC_SYNCHRONIZED'. - */ - if(for_class && ((p == Constants.ACC_SUPER) || (p == Constants.ACC_INTERFACE))) - continue; - - buf.append(Constants.ACCESS_NAMES[i]).append(" "); - } + private static void wrap( ThreadLocal tl, int value ) { + tl.set(new Integer(value)); } - return buf.toString().trim(); - } - - /** - * @return "class" or "interface", depending on the ACC_INTERFACE flag - */ - public static final String classOrInterface(int access_flags) { - return ((access_flags & Constants.ACC_INTERFACE) != 0)? "interface" : "class"; - } - - /** - * Disassemble a byte array of JVM byte codes starting from code line - * `index' and return the disassembled string representation. Decode only - * `num' opcodes (including their operands), use -1 if you want to - * decompile everything. - * - * @param code byte code array - * @param constant_pool Array of constants - * @param index offset in `code' array - * (number of opcodes, not bytes!) - * @param length number of opcodes to decompile, -1 for all - * @param verbose be verbose, e.g. print constant pool index - * @return String representation of byte codes - */ - public static final String codeToString(byte[] code, - ConstantPool constant_pool, - int index, int length, boolean verbose) - { - StringBuffer buf = new StringBuffer(code.length * 20); // Should be sufficient - ByteSequence stream = new ByteSequence(code); - - try { - for(int i=0; i < index; i++) // Skip `index' lines of code - codeToString(stream, constant_pool, verbose); - - for(int i=0; stream.available() > 0; i++) { - if((length < 0) || (i < length)) { - String indices = fillup(stream.getIndex() + ":", 6, true, ' '); - buf.append(indices).append(codeToString(stream, constant_pool, verbose)).append('\n'); - } - } - } catch(IOException e) { - System.out.println(buf.toString()); - e.printStackTrace(); - throw new ClassFormatException("Byte code error: " + e); - } + private static ThreadLocal consumed_chars = new ThreadLocal() { - return buf.toString(); - } - - public static final String codeToString(byte[] code, - ConstantPool constant_pool, - int index, int length) { - return codeToString(code, constant_pool, index, length, true); - } - - /** - * Disassemble a stream of byte codes and return the - * string representation. - * - * @param bytes stream of bytes - * @param constant_pool Array of constants - * @param verbose be verbose, e.g. print constant pool index - * @return String representation of byte code - */ - public static final String codeToString(ByteSequence bytes, - ConstantPool constant_pool, boolean verbose) - throws IOException - { - short opcode = (short)bytes.readUnsignedByte(); - int default_offset=0, low, high, npairs; - int index, vindex, constant; - int[] match, jump_table; - int no_pad_bytes=0, offset; - StringBuffer buf = new StringBuffer(Constants.OPCODE_NAMES[opcode]); - - /* Special case: Skip (0-3) padding bytes, i.e., the - * following bytes are 4-byte-aligned + protected Object initialValue() { + return new Integer(0); + } + };/* How many chars have been consumed + * during parsing in signatureToString(). + * Read by methodSignatureToString(). + * Set by side effect,but only internally. + */ + private static boolean wide = false; /* The `WIDE' instruction is used in the + * byte code to allow 16-bit wide indices + * for local variables. This opcode + * precedes an `ILOAD', e.g.. The opcode + * immediately following takes an extra + * byte which is combined with the + * following byte to form a + * 16-bit value. */ - if((opcode == Constants.TABLESWITCH) || (opcode == Constants.LOOKUPSWITCH)) { - int remainder = bytes.getIndex() % 4; - no_pad_bytes = (remainder == 0)? 0 : 4 - remainder; - - for(int i=0; i < no_pad_bytes; i++) { - byte b; - if((b=bytes.readByte()) != 0) - System.err.println("Warning: Padding byte != 0 in " + - Constants.OPCODE_NAMES[opcode] + ":" + b); - } - // Both cases have a field default_offset in common - default_offset = bytes.readInt(); + /** + * Convert bit field of flags into string such as `static final'. + * + * @param access_flags Access flags + * @return String representation of flags + */ + public static final String accessToString( int access_flags ) { + return accessToString(access_flags, false); } - switch(opcode) { - /* Table switch has variable length arguments. - */ - case Constants.TABLESWITCH: - low = bytes.readInt(); - high = bytes.readInt(); - offset = bytes.getIndex() - 12 - no_pad_bytes - 1; - default_offset += offset; + /** + * Convert bit field of flags into string such as `static final'. + * + * Special case: Classes compiled with new compilers and with the + * `ACC_SUPER' flag would be said to be "synchronized". This is + * because SUN used the same value for the flags `ACC_SUPER' and + * `ACC_SYNCHRONIZED'. + * + * @param access_flags Access flags + * @param for_class access flags are for class qualifiers ? + * @return String representation of flags + */ + public static final String accessToString( int access_flags, boolean for_class ) { + StringBuffer buf = new StringBuffer(); + int p = 0; + for (int i = 0; p < Constants.MAX_ACC_FLAG; i++) { // Loop through known flags + p = pow2(i); + if ((access_flags & p) != 0) { + /* Special case: Classes compiled with new compilers and with the + * `ACC_SUPER' flag would be said to be "synchronized". This is + * because SUN used the same value for the flags `ACC_SUPER' and + * `ACC_SYNCHRONIZED'. + */ + if (for_class && ((p == Constants.ACC_SUPER) || (p == Constants.ACC_INTERFACE))) { + continue; + } + buf.append(Constants.ACCESS_NAMES[i]).append(" "); + } + } + return buf.toString().trim(); + } + - buf.append("\tdefault = ").append(default_offset).append(", low = ").append(low) - .append(", high = ").append(high).append("("); + /** + * @return "class" or "interface", depending on the ACC_INTERFACE flag + */ + public static final String classOrInterface( int access_flags ) { + return ((access_flags & Constants.ACC_INTERFACE) != 0) ? "interface" : "class"; + } - jump_table = new int[high - low + 1]; - for(int i=0; i < jump_table.length; i++) { - jump_table[i] = offset + bytes.readInt(); - buf.append(jump_table[i]); - if(i < jump_table.length - 1) - buf.append(", "); - } - buf.append(")"); + /** + * Disassemble a byte array of JVM byte codes starting from code line + * `index' and return the disassembled string representation. Decode only + * `num' opcodes (including their operands), use -1 if you want to + * decompile everything. + * + * @param code byte code array + * @param constant_pool Array of constants + * @param index offset in `code' array + * (number of opcodes, not bytes!) + * @param length number of opcodes to decompile, -1 for all + * @param verbose be verbose, e.g. print constant pool index + * @return String representation of byte codes + */ + public static final String codeToString( byte[] code, ConstantPool constant_pool, int index, + int length, boolean verbose ) { + StringBuffer buf = new StringBuffer(code.length * 20); // Should be sufficient + ByteSequence stream = new ByteSequence(code); + try { + for (int i = 0; i < index; i++) { + codeToString(stream, constant_pool, verbose); + } + for (int i = 0; stream.available() > 0; i++) { + if ((length < 0) || (i < length)) { + String indices = fillup(stream.getIndex() + ":", 6, true, ' '); + buf.append(indices).append(codeToString(stream, constant_pool, verbose)) + .append('\n'); + } + } + } catch (IOException e) { + System.out.println(buf.toString()); + e.printStackTrace(); + throw new ClassFormatException("Byte code error: " + e); + } + return buf.toString(); + } - break; - /* Lookup switch has variable length arguments. - */ - case Constants.LOOKUPSWITCH: { + public static final String codeToString( byte[] code, ConstantPool constant_pool, int index, + int length ) { + return codeToString(code, constant_pool, index, length, true); + } - npairs = bytes.readInt(); - offset = bytes.getIndex() - 8 - no_pad_bytes - 1; - - match = new int[npairs]; - jump_table = new int[npairs]; - default_offset += offset; - buf.append("\tdefault = ").append(default_offset).append(", npairs = ").append(npairs) - .append(" ("); + /** + * Disassemble a stream of byte codes and return the + * string representation. + * + * @param bytes stream of bytes + * @param constant_pool Array of constants + * @param verbose be verbose, e.g. print constant pool index + * @return String representation of byte code + */ + public static final String codeToString( ByteSequence bytes, ConstantPool constant_pool, + boolean verbose ) throws IOException { + short opcode = (short) bytes.readUnsignedByte(); + int default_offset = 0, low, high, npairs; + int index, vindex, constant; + int[] match, jump_table; + int no_pad_bytes = 0, offset; + StringBuffer buf = new StringBuffer(Constants.OPCODE_NAMES[opcode]); + /* Special case: Skip (0-3) padding bytes, i.e., the + * following bytes are 4-byte-aligned + */ + if ((opcode == Constants.TABLESWITCH) || (opcode == Constants.LOOKUPSWITCH)) { + int remainder = bytes.getIndex() % 4; + no_pad_bytes = (remainder == 0) ? 0 : 4 - remainder; + for (int i = 0; i < no_pad_bytes; i++) { + byte b; + if ((b = bytes.readByte()) != 0) { + System.err.println("Warning: Padding byte != 0 in " + + Constants.OPCODE_NAMES[opcode] + ":" + b); + } + } + // Both cases have a field default_offset in common + default_offset = bytes.readInt(); + } + switch (opcode) { + /* Table switch has variable length arguments. + */ + case Constants.TABLESWITCH: + low = bytes.readInt(); + high = bytes.readInt(); + offset = bytes.getIndex() - 12 - no_pad_bytes - 1; + default_offset += offset; + buf.append("\tdefault = ").append(default_offset).append(", low = ").append(low) + .append(", high = ").append(high).append("("); + jump_table = new int[high - low + 1]; + for (int i = 0; i < jump_table.length; i++) { + jump_table[i] = offset + bytes.readInt(); + buf.append(jump_table[i]); + if (i < jump_table.length - 1) { + buf.append(", "); + } + } + buf.append(")"); + break; + /* Lookup switch has variable length arguments. + */ + case Constants.LOOKUPSWITCH: { + npairs = bytes.readInt(); + offset = bytes.getIndex() - 8 - no_pad_bytes - 1; + match = new int[npairs]; + jump_table = new int[npairs]; + default_offset += offset; + buf.append("\tdefault = ").append(default_offset).append(", npairs = ").append( + npairs).append(" ("); + for (int i = 0; i < npairs; i++) { + match[i] = bytes.readInt(); + jump_table[i] = offset + bytes.readInt(); + buf.append("(").append(match[i]).append(", ").append(jump_table[i]).append(")"); + if (i < npairs - 1) { + buf.append(", "); + } + } + buf.append(")"); + } + break; + /* Two address bytes + offset from start of byte stream form the + * jump target + */ + case Constants.GOTO: + case Constants.IFEQ: + case Constants.IFGE: + case Constants.IFGT: + case Constants.IFLE: + case Constants.IFLT: + case Constants.JSR: + case Constants.IFNE: + case Constants.IFNONNULL: + case Constants.IFNULL: + case Constants.IF_ACMPEQ: + case Constants.IF_ACMPNE: + case Constants.IF_ICMPEQ: + case Constants.IF_ICMPGE: + case Constants.IF_ICMPGT: + case Constants.IF_ICMPLE: + case Constants.IF_ICMPLT: + case Constants.IF_ICMPNE: + buf.append("\t\t#").append((bytes.getIndex() - 1) + bytes.readShort()); + break; + /* 32-bit wide jumps + */ + case Constants.GOTO_W: + case Constants.JSR_W: + buf.append("\t\t#").append(((bytes.getIndex() - 1) + bytes.readInt())); + break; + /* Index byte references local variable (register) + */ + case Constants.ALOAD: + case Constants.ASTORE: + case Constants.DLOAD: + case Constants.DSTORE: + case Constants.FLOAD: + case Constants.FSTORE: + case Constants.ILOAD: + case Constants.ISTORE: + case Constants.LLOAD: + case Constants.LSTORE: + case Constants.RET: + if (wide) { + vindex = bytes.readUnsignedShort(); + wide = false; // Clear flag + } else { + vindex = bytes.readUnsignedByte(); + } + buf.append("\t\t%").append(vindex); + break; + /* + * Remember wide byte which is used to form a 16-bit address in the + * following instruction. Relies on that the method is called again with + * the following opcode. + */ + case Constants.WIDE: + wide = true; + buf.append("\t(wide)"); + break; + /* Array of basic type. + */ + case Constants.NEWARRAY: + buf.append("\t\t<").append(Constants.TYPE_NAMES[bytes.readByte()]).append(">"); + break; + /* Access object/class fields. + */ + case Constants.GETFIELD: + case Constants.GETSTATIC: + case Constants.PUTFIELD: + case Constants.PUTSTATIC: + index = bytes.readUnsignedShort(); + buf.append("\t\t").append( + constant_pool.constantToString(index, Constants.CONSTANT_Fieldref)).append( + (verbose ? " (" + index + ")" : "")); + break; + /* Operands are references to classes in constant pool + */ + case Constants.NEW: + case Constants.CHECKCAST: + buf.append("\t"); + case Constants.INSTANCEOF: + index = bytes.readUnsignedShort(); + buf.append("\t<").append( + constant_pool.constantToString(index, Constants.CONSTANT_Class)) + .append(">").append((verbose ? " (" + index + ")" : "")); + break; + /* Operands are references to methods in constant pool + */ + case Constants.INVOKESPECIAL: + case Constants.INVOKESTATIC: + case Constants.INVOKEVIRTUAL: + index = bytes.readUnsignedShort(); + buf.append("\t").append( + constant_pool.constantToString(index, Constants.CONSTANT_Methodref)) + .append((verbose ? " (" + index + ")" : "")); + break; + case Constants.INVOKEINTERFACE: + index = bytes.readUnsignedShort(); + int nargs = bytes.readUnsignedByte(); // historical, redundant + buf.append("\t").append( + constant_pool + .constantToString(index, Constants.CONSTANT_InterfaceMethodref)) + .append(verbose ? " (" + index + ")\t" : "").append(nargs).append("\t") + .append(bytes.readUnsignedByte()); // Last byte is a reserved space + break; + /* Operands are references to items in constant pool + */ + case Constants.LDC_W: + case Constants.LDC2_W: + index = bytes.readUnsignedShort(); + buf.append("\t\t").append( + constant_pool.constantToString(index, constant_pool.getConstant(index) + .getTag())).append((verbose ? " (" + index + ")" : "")); + break; + case Constants.LDC: + index = bytes.readUnsignedByte(); + buf.append("\t\t").append( + constant_pool.constantToString(index, constant_pool.getConstant(index) + .getTag())).append((verbose ? " (" + index + ")" : "")); + break; + /* Array of references. + */ + case Constants.ANEWARRAY: + index = bytes.readUnsignedShort(); + buf.append("\t\t<").append( + compactClassName(constant_pool.getConstantString(index, + Constants.CONSTANT_Class), false)).append(">").append( + (verbose ? " (" + index + ")" : "")); + break; + /* Multidimensional array of references. + */ + case Constants.MULTIANEWARRAY: { + index = bytes.readUnsignedShort(); + int dimensions = bytes.readUnsignedByte(); + buf.append("\t<").append( + compactClassName(constant_pool.getConstantString(index, + Constants.CONSTANT_Class), false)).append(">\t").append(dimensions) + .append((verbose ? " (" + index + ")" : "")); + } + break; + /* Increment local variable. + */ + case Constants.IINC: + if (wide) { + vindex = bytes.readUnsignedShort(); + constant = bytes.readShort(); + wide = false; + } else { + vindex = bytes.readUnsignedByte(); + constant = bytes.readByte(); + } + buf.append("\t\t%").append(vindex).append("\t").append(constant); + break; + default: + if (Constants.NO_OF_OPERANDS[opcode] > 0) { + for (int i = 0; i < Constants.TYPE_OF_OPERANDS[opcode].length; i++) { + buf.append("\t\t"); + switch (Constants.TYPE_OF_OPERANDS[opcode][i]) { + case Constants.T_BYTE: + buf.append(bytes.readByte()); + break; + case Constants.T_SHORT: + buf.append(bytes.readShort()); + break; + case Constants.T_INT: + buf.append(bytes.readInt()); + break; + default: // Never reached + System.err.println("Unreachable default case reached!"); + System.exit(-1); + } + } + } + } + return buf.toString(); + } - for(int i=0; i < npairs; i++) { - match[i] = bytes.readInt(); - jump_table[i] = offset + bytes.readInt(); + public static final String codeToString( ByteSequence bytes, ConstantPool constant_pool ) + throws IOException { + return codeToString(bytes, constant_pool, true); + } - buf.append("(").append(match[i]).append(", ").append(jump_table[i]).append(")"); - if(i < npairs - 1) - buf.append(", "); - } - buf.append(")"); + /** + * Shorten long class names, java/lang/String becomes + * String. + * + * @param str The long class name + * @return Compacted class name + */ + public static final String compactClassName( String str ) { + return compactClassName(str, true); } - break; - /* Two address bytes + offset from start of byte stream form the - * jump target + + /** + * Shorten long class name str, i.e., chop off the prefix, + * if the + * class name starts with this string and the flag chopit is true. + * Slashes / are converted to dots .. + * + * @param str The long class name + * @param prefix The prefix the get rid off + * @param chopit Flag that determines whether chopping is executed or not + * @return Compacted class name */ - case Constants.GOTO: case Constants.IFEQ: case Constants.IFGE: case Constants.IFGT: - case Constants.IFLE: case Constants.IFLT: case Constants.JSR: case Constants.IFNE: - case Constants.IFNONNULL: case Constants.IFNULL: case Constants.IF_ACMPEQ: - case Constants.IF_ACMPNE: case Constants.IF_ICMPEQ: case Constants.IF_ICMPGE: case Constants.IF_ICMPGT: - case Constants.IF_ICMPLE: case Constants.IF_ICMPLT: case Constants.IF_ICMPNE: - buf.append("\t\t#").append((bytes.getIndex() - 1) + bytes.readShort()); - break; - - /* 32-bit wide jumps - */ - case Constants.GOTO_W: case Constants.JSR_W: - buf.append("\t\t#").append(((bytes.getIndex() - 1) + bytes.readInt())); - break; - - /* Index byte references local variable (register) - */ - case Constants.ALOAD: case Constants.ASTORE: case Constants.DLOAD: case Constants.DSTORE: case Constants.FLOAD: - case Constants.FSTORE: case Constants.ILOAD: case Constants.ISTORE: case Constants.LLOAD: case Constants.LSTORE: - case Constants.RET: - if(wide) { - vindex = bytes.readUnsignedShort(); - wide=false; // Clear flag - } - else - vindex = bytes.readUnsignedByte(); - - buf.append("\t\t%").append(vindex); - break; - - /* - * Remember wide byte which is used to form a 16-bit address in the - * following instruction. Relies on that the method is called again with - * the following opcode. - */ - case Constants.WIDE: - wide = true; - buf.append("\t(wide)"); - break; - - /* Array of basic type. - */ - case Constants.NEWARRAY: - buf.append("\t\t<").append(Constants.TYPE_NAMES[bytes.readByte()]).append(">"); - break; - - /* Access object/class fields. - */ - case Constants.GETFIELD: case Constants.GETSTATIC: case Constants.PUTFIELD: case Constants.PUTSTATIC: - index = bytes.readUnsignedShort(); - buf.append("\t\t") - .append(constant_pool.constantToString(index, Constants.CONSTANT_Fieldref)) - .append((verbose? " (" + index + ")" : "")); - break; - - /* Operands are references to classes in constant pool - */ - case Constants.NEW: - case Constants.CHECKCAST: - buf.append("\t"); - case Constants.INSTANCEOF: - index = bytes.readUnsignedShort(); - buf.append("\t<").append(constant_pool.constantToString(index, Constants.CONSTANT_Class)) - .append(">").append((verbose? " (" + index + ")" : "")); - break; - - /* Operands are references to methods in constant pool - */ - case Constants.INVOKESPECIAL: case Constants.INVOKESTATIC: case Constants.INVOKEVIRTUAL: - index = bytes.readUnsignedShort(); - buf.append("\t").append(constant_pool.constantToString(index, - Constants.CONSTANT_Methodref)) - .append((verbose? " (" + index + ")" : "")); - break; - - case Constants.INVOKEINTERFACE: - index = bytes.readUnsignedShort(); - int nargs = bytes.readUnsignedByte(); // historical, redundant - buf.append("\t").append(constant_pool.constantToString(index, - Constants.CONSTANT_InterfaceMethodref)) - .append(verbose? " (" + index + ")\t" : "").append(nargs).append("\t") - .append(bytes.readUnsignedByte()); // Last byte is a reserved space - break; - - /* Operands are references to items in constant pool - */ - case Constants.LDC_W: case Constants.LDC2_W: - index = bytes.readUnsignedShort(); - - buf.append("\t\t").append(constant_pool.constantToString - (index, constant_pool.getConstant(index).getTag())) - .append((verbose? " (" + index + ")" : "")); - break; - - case Constants.LDC: - index = bytes.readUnsignedByte(); - - buf.append("\t\t").append( - constant_pool.constantToString(index, constant_pool.getConstant(index).getTag())) - .append((verbose? " (" + index + ")" : "")); - break; - - /* Array of references. - */ - case Constants.ANEWARRAY: - index = bytes.readUnsignedShort(); - - buf.append("\t\t<").append(compactClassName(constant_pool.getConstantString - (index, Constants.CONSTANT_Class), false)) - .append(">").append((verbose? " (" + index + ")": "")); - break; - - /* Multidimensional array of references. - */ - case Constants.MULTIANEWARRAY: { - index = bytes.readUnsignedShort(); - int dimensions = bytes.readUnsignedByte(); - - buf.append("\t<").append(compactClassName(constant_pool.getConstantString - (index, Constants.CONSTANT_Class), false)) - .append(">\t").append(dimensions).append((verbose? " (" + index + ")" : "")); + public static final String compactClassName( String str, String prefix, boolean chopit ) { + int len = prefix.length(); + str = str.replace('/', '.'); // Is `/' on all systems, even DOS + if (chopit) { + // If string starts with `prefix' and contains no further dots + if (str.startsWith(prefix) && (str.substring(len).indexOf('.') == -1)) { + str = str.substring(len); + } + } + return str; } - break; - /* Increment local variable. + + /** + * Shorten long class names, java/lang/String becomes + * java.lang.String, + * e.g.. If chopit is true the prefix java.lang + * is also removed. + * + * @param str The long class name + * @param chopit Flag that determines whether chopping is executed or not + * @return Compacted class name */ - case Constants.IINC: - if(wide) { - vindex = bytes.readUnsignedShort(); - constant = bytes.readShort(); - wide = false; - } - else { - vindex = bytes.readUnsignedByte(); - constant = bytes.readByte(); - } - buf.append("\t\t%").append(vindex).append("\t").append(constant); - break; - - default: - if(Constants.NO_OF_OPERANDS[opcode] > 0) { - for(int i=0; i < Constants.TYPE_OF_OPERANDS[opcode].length; i++) { - buf.append("\t\t"); - switch(Constants.TYPE_OF_OPERANDS[opcode][i]) { - case Constants.T_BYTE: buf.append(bytes.readByte()); break; - case Constants.T_SHORT: buf.append(bytes.readShort()); break; - case Constants.T_INT: buf.append(bytes.readInt()); break; - - default: // Never reached - System.err.println("Unreachable default case reached!"); - System.exit(-1); - } - } - } + public static final String compactClassName( String str, boolean chopit ) { + return compactClassName(str, "java.lang.", chopit); } - return buf.toString(); - } - - public static final String codeToString(ByteSequence bytes, ConstantPool constant_pool) - throws IOException - { - return codeToString(bytes, constant_pool, true); - } - - /** - * Shorten long class names, java/lang/String becomes - * String. - * - * @param str The long class name - * @return Compacted class name - */ - public static final String compactClassName(String str) { - return compactClassName(str, true); - } - - /** - * Shorten long class name str, i.e., chop off the prefix, - * if the - * class name starts with this string and the flag chopit is true. - * Slashes / are converted to dots .. - * - * @param str The long class name - * @param prefix The prefix the get rid off - * @param chopit Flag that determines whether chopping is executed or not - * @return Compacted class name - */ - public static final String compactClassName(String str, - String prefix, - boolean chopit) - { - int len = prefix.length(); - - str = str.replace('/', '.'); // Is `/' on all systems, even DOS - - if(chopit) { - // If string starts with `prefix' and contains no further dots - if(str.startsWith(prefix) && - (str.substring(len).indexOf('.') == -1)) - str = str.substring(len); + + /** + * @return `flag' with bit `i' set to 1 + */ + public static final int setBit( int flag, int i ) { + return flag | pow2(i); } - - return str; - } - - /** - * Shorten long class names, java/lang/String becomes - * java.lang.String, - * e.g.. If chopit is true the prefix java.lang - * is also removed. - * - * @param str The long class name - * @param chopit Flag that determines whether chopping is executed or not - * @return Compacted class name - */ - public static final String compactClassName(String str, boolean chopit) { - return compactClassName(str, "java.lang.", chopit); - } - - /** - * @return `flag' with bit `i' set to 1 - */ - public static final int setBit(int flag, int i) { - return flag | pow2(i); - } - - /** - * @return `flag' with bit `i' set to 0 - */ - public static final int clearBit(int flag, int i) { - int bit = pow2(i); - return (flag & bit) == 0? flag : flag ^ bit; - } - - /** - * @return true, if bit `i' in `flag' is set - */ - public static final boolean isSet(int flag, int i) { - return (flag & pow2(i)) != 0; - } - - /** - * Converts string containing the method return and argument types - * to a byte code method signature. - * - * @param ret Return type of method - * @param argv Types of method arguments - * @return Byte code representation of method signature - */ - public final static String methodTypeToSignature(String ret, String[] argv) - throws ClassFormatException - { - StringBuffer buf = new StringBuffer("("); - String str; - - if(argv != null) - for(int i=0; i < argv.length; i++) { - str = getSignature(argv[i]); - - if(str.endsWith("V")) // void can't be a method argument - throw new ClassFormatException("Invalid type: " + argv[i]); - - buf.append(str); - } - - str = getSignature(ret); - - buf.append(")").append(str); - - return buf.toString(); - } - - /** - * @param signature Method signature - * @return Array of argument types - * @throws ClassFormatException - */ - public static final String[] methodSignatureArgumentTypes(String signature) - throws ClassFormatException - { - return methodSignatureArgumentTypes(signature, true); - } - - /** - * @param signature Method signature - * @param chopit Shorten class names ? - * @return Array of argument types - * @throws ClassFormatException - */ - public static final String[] methodSignatureArgumentTypes(String signature, - boolean chopit) - throws ClassFormatException - { - List vec = new ArrayList(); - int index; - - try { // Read all declarations between for `(' and `)' - if(signature.charAt(0) != '(') - throw new ClassFormatException("Invalid method signature: " + signature); - - index = 1; // current string position - - while(signature.charAt(index) != ')') { - vec.add(signatureToString(signature.substring(index), chopit)); - //corrected concurrent private static field acess - index += unwrap(consumed_chars); // update position - } - } catch(StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature); + + + /** + * @return `flag' with bit `i' set to 0 + */ + public static final int clearBit( int flag, int i ) { + int bit = pow2(i); + return (flag & bit) == 0 ? flag : flag ^ bit; } - - return (String[])vec.toArray(new String[vec.size()]); - } - /** - * @param signature Method signature - * @return return type of method - * @throws ClassFormatException - */ - public static final String methodSignatureReturnType(String signature) - throws ClassFormatException - { - return methodSignatureReturnType(signature, true); - } - /** - * @param signature Method signature - * @param chopit Shorten class names ? - * @return return type of method - * @throws ClassFormatException - */ - public static final String methodSignatureReturnType(String signature, - boolean chopit) - throws ClassFormatException - { - int index; - String type; - - try { - // Read return type after `)' - index = signature.lastIndexOf(')') + 1; - type = signatureToString(signature.substring(index), chopit); - } catch(StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature); + + + /** + * @return true, if bit `i' in `flag' is set + */ + public static final boolean isSet( int flag, int i ) { + return (flag & pow2(i)) != 0; } - return type; - } - - /** - * Converts method signature to string with all class names compacted. - * - * @param signature to convert - * @param name of method - * @param access flags of method - * @return Human readable signature - */ - public static final String methodSignatureToString(String signature, - String name, - String access) { - return methodSignatureToString(signature, name, access, true); - } - - public static final String methodSignatureToString(String signature, - String name, - String access, - boolean chopit) { - return methodSignatureToString(signature, name, access, chopit, null); - } - - /** - * A return­type signature represents the return value from a method. - * It is a series of bytes in the following grammar: - * - * ::= | V - * - * The character V indicates that the method returns no value. Otherwise, the - * signature indicates the type of the return value. - * An argument signature represents an argument passed to a method: - * - * ::= - * - * A method signature represents the arguments that the method expects, and - * the value that it returns. - * ::= () - * ::= * - * - * This method converts such a string into a Java type declaration like - * `void main(String[])' and throws a `ClassFormatException' when the parsed - * type is invalid. - * - * @param signature Method signature - * @param name Method name - * @param access Method access rights - * @return Java type declaration - * @throws ClassFormatException - */ - public static final String methodSignatureToString(String signature, - String name, - String access, - boolean chopit, - LocalVariableTable vars) - throws ClassFormatException - { - StringBuffer buf = new StringBuffer("("); - String type; - int index; - int var_index = (access.indexOf("static") >= 0)? 0 : 1; - - try { // Read all declarations between for `(' and `)' - if(signature.charAt(0) != '(') - throw new ClassFormatException("Invalid method signature: " + signature); - - index = 1; // current string position - - while(signature.charAt(index) != ')') { - String param_type = signatureToString(signature.substring(index), chopit); - buf.append(param_type); - - if(vars != null) { - LocalVariable l = vars.getLocalVariable(var_index); - - if(l != null) - buf.append(" ").append(l.getName()); - } else - buf.append(" arg").append(var_index); - - if("double".equals(param_type) || "long".equals(param_type)) - var_index += 2; - else - var_index++; - - buf.append(", "); - //corrected concurrent private static field acess - index += unwrap(consumed_chars); // update position - } - - index++; // update position - - // Read return type after `)' - type = signatureToString(signature.substring(index), chopit); - - } catch(StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature); + + /** + * Converts string containing the method return and argument types + * to a byte code method signature. + * + * @param ret Return type of method + * @param argv Types of method arguments + * @return Byte code representation of method signature + */ + public final static String methodTypeToSignature( String ret, String[] argv ) + throws ClassFormatException { + StringBuffer buf = new StringBuffer("("); + String str; + if (argv != null) { + for (int i = 0; i < argv.length; i++) { + str = getSignature(argv[i]); + if (str.endsWith("V")) { + throw new ClassFormatException("Invalid type: " + argv[i]); + } + buf.append(str); + } + } + str = getSignature(ret); + buf.append(")").append(str); + return buf.toString(); } - if(buf.length() > 1) // Tack off the extra ", " - buf.setLength(buf.length() - 2); - - buf.append(")"); - - return access + ((access.length() > 0)? " " : "") + // May be an empty string - type + " " + name + buf.toString(); - } - - // Guess what this does - private static final int pow2(int n) { - return 1 << n; - } - - /** - * Replace all occurences of old in str with new. - * - * @param str String to permute - * @param old String to be replaced - * @param new_ Replacement string - * @return new String object - */ - public static final String replace(String str, String old, String new_) { - int index, old_index; - StringBuffer buf = new StringBuffer(); - - try { - if((index = str.indexOf(old)) != -1) { // `old' found in str - old_index = 0; // String start offset - - // While we have something to replace - while((index = str.indexOf(old, old_index)) != -1) { - buf.append(str.substring(old_index, index)); // append prefix - buf.append(new_); // append replacement - - old_index = index + old.length(); // Skip `old'.length chars - } - - buf.append(str.substring(old_index)); // append rest of string - str = buf.toString(); - } - } catch(StringIndexOutOfBoundsException e) { // Should not occur - System.err.println(e); + + /** + * @param signature Method signature + * @return Array of argument types + * @throws ClassFormatException + */ + public static final String[] methodSignatureArgumentTypes( String signature ) + throws ClassFormatException { + return methodSignatureArgumentTypes(signature, true); } - return str; - } - - /** - * Converts signature to string with all class names compacted. - * - * @param signature to convert - * @return Human readable signature - */ - public static final String signatureToString(String signature) { - return signatureToString(signature, true); - } - - /** - * The field signature represents the value of an argument to a function or - * the value of a variable. It is a series of bytes generated by the - * following grammar: - * - *
    -   *  ::= 
    -   *       ::= ||
    -   *        ::= B|C|D|F|I|J|S|Z
    -   *      ::= L;
    -   *       ::= [
    -   *
    -   * The meaning of the base types is as follows:
    -   * B byte signed byte
    -   * C char character
    -   * D double double precision IEEE float
    -   * F float single precision IEEE float
    -   * I int integer
    -   * J long long integer
    -   * L; ... an object of the given class
    -   * S short signed short
    -   * Z boolean true or false
    -   * [ ... array
    -   * 
    - * - * This method converts this string into a Java type declaration such as - * `String[]' and throws a `ClassFormatException' when the parsed type is - * invalid. - * - * @param signature Class signature - * @param chopit Flag that determines whether chopping is executed or not - * @return Java type declaration - * @throws ClassFormatException - */ - public static final String signatureToString(String signature, - boolean chopit) - { - //corrected concurrent private static field acess - wrap(consumed_chars, 1); // This is the default, read just one char like `B' - - try { - switch(signature.charAt(0)) { - case 'B' : return "byte"; - case 'C' : return "char"; - case 'D' : return "double"; - case 'F' : return "float"; - case 'I' : return "int"; - case 'J' : return "long"; - - case 'L' : { // Full class name - int index = signature.indexOf(';'); // Look for closing `;' - - if(index < 0) - throw new ClassFormatException("Invalid signature: " + signature); - - //corrected concurrent private static field acess - wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed - - return compactClassName(signature.substring(1, index), chopit); - } - - case 'S' : return "short"; - case 'Z' : return "boolean"; - - case '[' : { // Array declaration - int n; - StringBuffer brackets; - String type; - int consumed_chars; // Shadows global var - - brackets = new StringBuffer(); // Accumulate []'s - - // Count opening brackets and look for optional size argument - for(n=0; signature.charAt(n) == '['; n++) - brackets.append("[]"); - - consumed_chars = n; // Remember value - - // The rest of the string denotes a `' - type = signatureToString(signature.substring(n), chopit); - - //corrected concurrent private static field acess - //Utility.consumed_chars += consumed_chars; is replaced by: - int _temp = unwrap(Utility.consumed_chars)+consumed_chars; - wrap(Utility.consumed_chars, _temp); - - return type + brackets.toString(); - } - - case 'V' : return "void"; - - default : throw new ClassFormatException("Invalid signature: `" + - signature + "'"); - } - } catch(StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid signature: " + e + ":" + signature); + + /** + * @param signature Method signature + * @param chopit Shorten class names ? + * @return Array of argument types + * @throws ClassFormatException + */ + public static final String[] methodSignatureArgumentTypes( String signature, boolean chopit ) + throws ClassFormatException { + List vec = new ArrayList(); + int index; + try { // Read all declarations between for `(' and `)' + if (signature.charAt(0) != '(') { + throw new ClassFormatException("Invalid method signature: " + signature); + } + index = 1; // current string position + while (signature.charAt(index) != ')') { + vec.add(signatureToString(signature.substring(index), chopit)); + //corrected concurrent private static field acess + index += unwrap(consumed_chars); // update position + } + } catch (StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatException("Invalid method signature: " + signature); + } + return (String[]) vec.toArray(new String[vec.size()]); } - } - - /** Parse Java type such as "char", or "java.lang.String[]" and return the - * signature in byte code format, e.g. "C" or "[Ljava/lang/String;" respectively. - * - * @param type Java type - * @return byte code signature - */ - public static String getSignature(String type) { - StringBuffer buf = new StringBuffer(); - char[] chars = type.toCharArray(); - boolean char_found = false, delim = false; - int index = -1; - - loop: - for(int i=0; i < chars.length; i++) { - switch(chars[i]) { - case ' ': case '\t': case '\n': case '\r': case '\f': - if(char_found) - delim = true; - break; - - case '[': - if(!char_found) - throw new RuntimeException("Illegal type: " + type); - - index = i; - break loop; - - default: - char_found = true; - if(!delim) - buf.append(chars[i]); - } + + + /** + * @param signature Method signature + * @return return type of method + * @throws ClassFormatException + */ + public static final String methodSignatureReturnType( String signature ) + throws ClassFormatException { + return methodSignatureReturnType(signature, true); } - int brackets = 0; - if(index > 0) - brackets = countBrackets(type.substring(index)); + /** + * @param signature Method signature + * @param chopit Shorten class names ? + * @return return type of method + * @throws ClassFormatException + */ + public static final String methodSignatureReturnType( String signature, boolean chopit ) + throws ClassFormatException { + int index; + String type; + try { + // Read return type after `)' + index = signature.lastIndexOf(')') + 1; + type = signatureToString(signature.substring(index), chopit); + } catch (StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatException("Invalid method signature: " + signature); + } + return type; + } - type = buf.toString(); - buf.setLength(0); - for(int i=0; i < brackets; i++) - buf.append('['); + /** + * Converts method signature to string with all class names compacted. + * + * @param signature to convert + * @param name of method + * @param access flags of method + * @return Human readable signature + */ + public static final String methodSignatureToString( String signature, String name, String access ) { + return methodSignatureToString(signature, name, access, true); + } - boolean found = false; - for(int i=Constants.T_BOOLEAN; (i <= Constants.T_VOID) && !found; i++) { - if(Constants.TYPE_NAMES[i].equals(type)) { - found = true; - buf.append(Constants.SHORT_TYPE_NAMES[i]); - } + public static final String methodSignatureToString( String signature, String name, + String access, boolean chopit ) { + return methodSignatureToString(signature, name, access, chopit, null); } - - if(!found) // Class name - buf.append('L').append(type.replace('.', '/')).append(';'); - - return buf.toString(); - } - - private static int countBrackets(String brackets) { - char[] chars = brackets.toCharArray(); - int count = 0; - boolean open = false; - - for(int i=0; i ::= | V + * + * The character V indicates that the method returns no value. Otherwise, the + * signature indicates the type of the return value. + * An argument signature represents an argument passed to a method: + * + * ::= + * + * A method signature represents the arguments that the method expects, and + * the value that it returns. + * ::= () + * ::= * + * + * This method converts such a string into a Java type declaration like + * `void main(String[])' and throws a `ClassFormatException' when the parsed + * type is invalid. + * + * @param signature Method signature + * @param name Method name + * @param access Method access rights + * @return Java type declaration + * @throws ClassFormatException + */ + public static final String methodSignatureToString( String signature, String name, + String access, boolean chopit, LocalVariableTable vars ) throws ClassFormatException { + StringBuffer buf = new StringBuffer("("); + String type; + int index; + int var_index = (access.indexOf("static") >= 0) ? 0 : 1; + try { // Read all declarations between for `(' and `)' + if (signature.charAt(0) != '(') { + throw new ClassFormatException("Invalid method signature: " + signature); + } + index = 1; // current string position + while (signature.charAt(index) != ')') { + String param_type = signatureToString(signature.substring(index), chopit); + buf.append(param_type); + if (vars != null) { + LocalVariable l = vars.getLocalVariable(var_index); + if (l != null) { + buf.append(" ").append(l.getName()); + } + } else { + buf.append(" arg").append(var_index); + } + if ("double".equals(param_type) || "long".equals(param_type)) { + var_index += 2; + } else { + var_index++; + } + buf.append(", "); + //corrected concurrent private static field acess + index += unwrap(consumed_chars); // update position + } + index++; // update position + // Read return type after `)' + type = signatureToString(signature.substring(index), chopit); + } catch (StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatException("Invalid method signature: " + signature); + } + if (buf.length() > 1) { + buf.setLength(buf.length() - 2); + } + buf.append(")"); + return access + ((access.length() > 0) ? " " : "") + // May be an empty string + type + " " + name + buf.toString(); } - if(open) - throw new RuntimeException("Illegally nested brackets:" + brackets); - - return count; - } - - /** - * Return type of method signature as a byte value as defined in Constants - * - * @param signature in format described above - * @return type of method signature - * @see Constants - */ - public static final byte typeOfMethodSignature(String signature) - throws ClassFormatException - { - int index; - - try { - if(signature.charAt(0) != '(') - throw new ClassFormatException("Invalid method signature: " + signature); - - index = signature.lastIndexOf(')') + 1; - return typeOfSignature(signature.substring(index)); - } catch(StringIndexOutOfBoundsException e) { - throw new ClassFormatException("Invalid method signature: " + signature); + + // Guess what this does + private static final int pow2( int n ) { + return 1 << n; } - } - - /** - * Return type of signature as a byte value as defined in Constants - * - * @param signature in format described above - * @return type of signature - * @see Constants - */ - public static final byte typeOfSignature(String signature) - throws ClassFormatException - { - try { - switch(signature.charAt(0)) { - case 'B' : return Constants.T_BYTE; - case 'C' : return Constants.T_CHAR; - case 'D' : return Constants.T_DOUBLE; - case 'F' : return Constants.T_FLOAT; - case 'I' : return Constants.T_INT; - case 'J' : return Constants.T_LONG; - case 'L' : return Constants.T_REFERENCE; - case '[' : return Constants.T_ARRAY; - case 'V' : return Constants.T_VOID; - case 'Z' : return Constants.T_BOOLEAN; - case 'S' : return Constants.T_SHORT; - default: - throw new ClassFormatException("Invalid method signature: " + signature); - } - } catch(StringIndexOutOfBoundsException e) { - throw new ClassFormatException("Invalid method signature: " + signature); + + + /** + * Replace all occurences of old in str with new. + * + * @param str String to permute + * @param old String to be replaced + * @param new_ Replacement string + * @return new String object + */ + public static final String replace( String str, String old, String new_ ) { + int index, old_index; + StringBuffer buf = new StringBuffer(); + try { + if ((index = str.indexOf(old)) != -1) { // `old' found in str + old_index = 0; // String start offset + // While we have something to replace + while ((index = str.indexOf(old, old_index)) != -1) { + buf.append(str.substring(old_index, index)); // append prefix + buf.append(new_); // append replacement + old_index = index + old.length(); // Skip `old'.length chars + } + buf.append(str.substring(old_index)); // append rest of string + str = buf.toString(); + } + } catch (StringIndexOutOfBoundsException e) { // Should not occur + System.err.println(e); + } + return str; } - } - - /** Map opcode names to opcode numbers. E.g., return Constants.ALOAD for "aload" - */ - public static short searchOpcode(String name) { - name = name.toLowerCase(Locale.ENGLISH); - - for(short i=0; i < Constants.OPCODE_NAMES.length; i++) - if(Constants.OPCODE_NAMES[i].equals(name)) - return i; - - return -1; - } - - /** - * Convert (signed) byte to (unsigned) short value, i.e., all negative - * values become positive. - */ - private static final short byteToShort(byte b) { - return (b < 0)? (short)(256 + b) : (short)b; - } - - /** Convert bytes into hexidecimal string - * - * @return bytes as hexidecimal string, e.g. 00 FA 12 ... - */ - public static final String toHexString(byte[] bytes) { - StringBuffer buf = new StringBuffer(); - - for(int i=0; i < bytes.length; i++) { - short b = byteToShort(bytes[i]); - String hex = Integer.toString(b, 0x10); - - if(b < 0x10) // just one digit, prepend '0' - buf.append('0'); - - buf.append(hex); - - if(i < bytes.length - 1) - buf.append(' '); + + + /** + * Converts signature to string with all class names compacted. + * + * @param signature to convert + * @return Human readable signature + */ + public static final String signatureToString( String signature ) { + return signatureToString(signature, true); } - return buf.toString(); - } - - /** - * Return a string for an integer justified left or right and filled up with - * `fill' characters if necessary. - * - * @param i integer to format - * @param length length of desired string - * @param left_justify format left or right - * @param fill fill character - * @return formatted int - */ - public static final String format(int i, int length, boolean left_justify, char fill) { - return fillup(Integer.toString(i), length, left_justify, fill); - } - - /** - * Fillup char with up to length characters with char `fill' and justify it left or right. - * - * @param str string to format - * @param length length of desired string - * @param left_justify format left or right - * @param fill fill character - * @return formatted string - */ - public static final String fillup(String str, int length, boolean left_justify, char fill) { - int len = length - str.length(); - char[] buf = new char[(len < 0)? 0 : len]; - - for(int j=0; j < buf.length; j++) - buf[j] = fill; - - if(left_justify) - return str + new String(buf); - - return new String(buf) + str; - } - - static final boolean equals(byte[] a, byte[] b) { - int size; - - if((size=a.length) != b.length) - return false; - - for(int i=0; i < size; i++) - if(a[i] != b[i]) - return false; - - return true; - } - - public static final void printArray(PrintStream out, Object[] obj) { - out.println(printArray(obj, true)); - } - - public static final void printArray(PrintWriter out, Object[] obj) { - out.println(printArray(obj, true)); - } - - public static final String printArray(Object[] obj) { - return printArray(obj, true); - } - - public static final String printArray(Object[] obj, boolean braces) { - return printArray(obj, braces, false); - } - - public static final String printArray(Object[] obj, boolean braces, - boolean quote) { - if(obj == null) - return null; - - StringBuffer buf = new StringBuffer(); - if(braces) - buf.append('{'); - - for(int i=0; i < obj.length; i++) { - if(obj[i] != null) { - buf.append((quote? "\"" : "")).append(obj[i].toString()).append((quote? "\"" : "")); - } else { - buf.append("null"); - } - - if(i < obj.length - 1) { - buf.append(", "); - } + + /** + * The field signature represents the value of an argument to a function or + * the value of a variable. It is a series of bytes generated by the + * following grammar: + * + *
    +     *  ::= 
    +     *       ::= ||
    +     *        ::= B|C|D|F|I|J|S|Z
    +     *      ::= L;
    +     *       ::= [
    +     *
    +     * The meaning of the base types is as follows:
    +     * B byte signed byte
    +     * C char character
    +     * D double double precision IEEE float
    +     * F float single precision IEEE float
    +     * I int integer
    +     * J long long integer
    +     * L; ... an object of the given class
    +     * S short signed short
    +     * Z boolean true or false
    +     * [ ... array
    +     * 
    + * + * This method converts this string into a Java type declaration such as + * `String[]' and throws a `ClassFormatException' when the parsed type is + * invalid. + * + * @param signature Class signature + * @param chopit Flag that determines whether chopping is executed or not + * @return Java type declaration + * @throws ClassFormatException + */ + public static final String signatureToString( String signature, boolean chopit ) { + //corrected concurrent private static field acess + wrap(consumed_chars, 1); // This is the default, read just one char like `B' + try { + switch (signature.charAt(0)) { + case 'B': + return "byte"; + case 'C': + return "char"; + case 'D': + return "double"; + case 'F': + return "float"; + case 'I': + return "int"; + case 'J': + return "long"; + case 'L': { // Full class name + int index = signature.indexOf(';'); // Look for closing `;' + if (index < 0) { + throw new ClassFormatException("Invalid signature: " + signature); + } + //corrected concurrent private static field acess + wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed + return compactClassName(signature.substring(1, index), chopit); + } + case 'S': + return "short"; + case 'Z': + return "boolean"; + case '[': { // Array declaration + int n; + StringBuffer brackets; + String type; + int consumed_chars; // Shadows global var + brackets = new StringBuffer(); // Accumulate []'s + // Count opening brackets and look for optional size argument + for (n = 0; signature.charAt(n) == '['; n++) { + brackets.append("[]"); + } + consumed_chars = n; // Remember value + // The rest of the string denotes a `' + type = signatureToString(signature.substring(n), chopit); + //corrected concurrent private static field acess + //Utility.consumed_chars += consumed_chars; is replaced by: + int _temp = unwrap(Utility.consumed_chars) + consumed_chars; + wrap(Utility.consumed_chars, _temp); + return type + brackets.toString(); + } + case 'V': + return "void"; + default: + throw new ClassFormatException("Invalid signature: `" + signature + "'"); + } + } catch (StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatException("Invalid signature: " + e + ":" + signature); + } } - if(braces) - buf.append('}'); - - return buf.toString(); - } - - /** @return true, if character is one of (a, ... z, A, ... Z, 0, ... 9, _) - */ - public static boolean isJavaIdentifierPart(char ch) { - return ((ch >= 'a') && (ch <= 'z')) || - ((ch >= 'A') && (ch <= 'Z')) || - ((ch >= '0') && (ch <= '9')) || - (ch == '_'); - } - - /** Encode byte array it into Java identifier string, i.e., a string - * that only contains the following characters: (a, ... z, A, ... Z, - * 0, ... 9, _, $). The encoding algorithm itself is not too - * clever: if the current byte's ASCII value already is a valid Java - * identifier part, leave it as it is. Otherwise it writes the - * escape character($) followed by

    • the ASCII value as a - * hexadecimal string, if the value is not in the range - * 200..247
    • a Java identifier char not used in a lowercase - * hexadecimal string, if the value is in the range - * 200..247
      • - * - *

        This operation inflates the original byte array by roughly 40-50%

        - * - * @param bytes the byte array to convert - * @param compress use gzip to minimize string - */ - public static String encode(byte[] bytes, boolean compress) throws IOException { - if(compress) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - GZIPOutputStream gos = new GZIPOutputStream(baos); - - gos.write(bytes, 0, bytes.length); - gos.close(); - baos.close(); - - bytes = baos.toByteArray(); + + /** Parse Java type such as "char", or "java.lang.String[]" and return the + * signature in byte code format, e.g. "C" or "[Ljava/lang/String;" respectively. + * + * @param type Java type + * @return byte code signature + */ + public static String getSignature( String type ) { + StringBuffer buf = new StringBuffer(); + char[] chars = type.toCharArray(); + boolean char_found = false, delim = false; + int index = -1; + loop: for (int i = 0; i < chars.length; i++) { + switch (chars[i]) { + case ' ': + case '\t': + case '\n': + case '\r': + case '\f': + if (char_found) { + delim = true; + } + break; + case '[': + if (!char_found) { + throw new RuntimeException("Illegal type: " + type); + } + index = i; + break loop; + default: + char_found = true; + if (!delim) { + buf.append(chars[i]); + } + } + } + int brackets = 0; + if (index > 0) { + brackets = countBrackets(type.substring(index)); + } + type = buf.toString(); + buf.setLength(0); + for (int i = 0; i < brackets; i++) { + buf.append('['); + } + boolean found = false; + for (int i = Constants.T_BOOLEAN; (i <= Constants.T_VOID) && !found; i++) { + if (Constants.TYPE_NAMES[i].equals(type)) { + found = true; + buf.append(Constants.SHORT_TYPE_NAMES[i]); + } + } + if (!found) { + buf.append('L').append(type.replace('.', '/')).append(';'); + } + return buf.toString(); } - CharArrayWriter caw = new CharArrayWriter(); - JavaWriter jw = new JavaWriter(caw); - for(int i=0; i < bytes.length; i++) { - int in = bytes[i] & 0x000000ff; // Normalize to unsigned - jw.write(in); + private static int countBrackets( String brackets ) { + char[] chars = brackets.toCharArray(); + int count = 0; + boolean open = false; + for (int i = 0; i < chars.length; i++) { + switch (chars[i]) { + case '[': + if (open) { + throw new RuntimeException("Illegally nested brackets:" + brackets); + } + open = true; + break; + case ']': + if (!open) { + throw new RuntimeException("Illegally nested brackets:" + brackets); + } + open = false; + count++; + break; + default: + // Don't care + } + } + if (open) { + throw new RuntimeException("Illegally nested brackets:" + brackets); + } + return count; } - return caw.toString(); - } - /** Decode a string back to a byte array. - * - * @param s the string to convert - * @param uncompress use gzip to uncompress the stream of bytes - */ - public static byte[] decode(String s, boolean uncompress) throws IOException { - char[] chars = s.toCharArray(); + /** + * Return type of method signature as a byte value as defined in Constants + * + * @param signature in format described above + * @return type of method signature + * @see Constants + */ + public static final byte typeOfMethodSignature( String signature ) throws ClassFormatException { + int index; + try { + if (signature.charAt(0) != '(') { + throw new ClassFormatException("Invalid method signature: " + signature); + } + index = signature.lastIndexOf(')') + 1; + return typeOfSignature(signature.substring(index)); + } catch (StringIndexOutOfBoundsException e) { + throw new ClassFormatException("Invalid method signature: " + signature); + } + } - CharArrayReader car = new CharArrayReader(chars); - JavaReader jr = new JavaReader(car); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + /** + * Return type of signature as a byte value as defined in Constants + * + * @param signature in format described above + * @return type of signature + * @see Constants + */ + public static final byte typeOfSignature( String signature ) throws ClassFormatException { + try { + switch (signature.charAt(0)) { + case 'B': + return Constants.T_BYTE; + case 'C': + return Constants.T_CHAR; + case 'D': + return Constants.T_DOUBLE; + case 'F': + return Constants.T_FLOAT; + case 'I': + return Constants.T_INT; + case 'J': + return Constants.T_LONG; + case 'L': + return Constants.T_REFERENCE; + case '[': + return Constants.T_ARRAY; + case 'V': + return Constants.T_VOID; + case 'Z': + return Constants.T_BOOLEAN; + case 'S': + return Constants.T_SHORT; + default: + throw new ClassFormatException("Invalid method signature: " + signature); + } + } catch (StringIndexOutOfBoundsException e) { + throw new ClassFormatException("Invalid method signature: " + signature); + } + } - int ch; - while((ch = jr.read()) >= 0) { - bos.write(ch); + /** Map opcode names to opcode numbers. E.g., return Constants.ALOAD for "aload" + */ + public static short searchOpcode( String name ) { + name = name.toLowerCase(Locale.ENGLISH); + for (short i = 0; i < Constants.OPCODE_NAMES.length; i++) { + if (Constants.OPCODE_NAMES[i].equals(name)) { + return i; + } + } + return -1; } - bos.close(); - car.close(); - jr.close(); - byte[] bytes = bos.toByteArray(); + /** + * Convert (signed) byte to (unsigned) short value, i.e., all negative + * values become positive. + */ + private static final short byteToShort( byte b ) { + return (b < 0) ? (short) (256 + b) : (short) b; + } - if(uncompress) { - GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes)); - byte[] tmp = new byte[bytes.length * 3]; // Rough estimate - int count = 0; - int b; + /** Convert bytes into hexidecimal string + * + * @return bytes as hexidecimal string, e.g. 00 FA 12 ... + */ + public static final String toHexString( byte[] bytes ) { + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < bytes.length; i++) { + short b = byteToShort(bytes[i]); + String hex = Integer.toString(b, 0x10); + if (b < 0x10) { + buf.append('0'); + } + buf.append(hex); + if (i < bytes.length - 1) { + buf.append(' '); + } + } + return buf.toString(); + } - while((b = gis.read()) >= 0) - tmp[count++] = (byte)b; - bytes = new byte[count]; - System.arraycopy(tmp, 0, bytes, 0, count); + /** + * Return a string for an integer justified left or right and filled up with + * `fill' characters if necessary. + * + * @param i integer to format + * @param length length of desired string + * @param left_justify format left or right + * @param fill fill character + * @return formatted int + */ + public static final String format( int i, int length, boolean left_justify, char fill ) { + return fillup(Integer.toString(i), length, left_justify, fill); } - return bytes; - } - - // A-Z, g-z, _, $ - private static final int FREE_CHARS = 48; - static int[] CHAR_MAP = new int[FREE_CHARS]; - static int[] MAP_CHAR = new int[256]; // Reverse map - private static final char ESCAPE_CHAR = '$'; - - static { - int j = 0; - for(int i='A'; i <= 'Z'; i++) { - CHAR_MAP[j] = i; - MAP_CHAR[i] = j; - j++; + + /** + * Fillup char with up to length characters with char `fill' and justify it left or right. + * + * @param str string to format + * @param length length of desired string + * @param left_justify format left or right + * @param fill fill character + * @return formatted string + */ + public static final String fillup( String str, int length, boolean left_justify, char fill ) { + int len = length - str.length(); + char[] buf = new char[(len < 0) ? 0 : len]; + for (int j = 0; j < buf.length; j++) { + buf[j] = fill; + } + if (left_justify) { + return str + new String(buf); + } + return new String(buf) + str; } - for(int i='g'; i <= 'z'; i++) { - CHAR_MAP[j] = i; - MAP_CHAR[i] = j; - j++; + + static final boolean equals( byte[] a, byte[] b ) { + int size; + if ((size = a.length) != b.length) { + return false; + } + for (int i = 0; i < size; i++) { + if (a[i] != b[i]) { + return false; + } + } + return true; } - CHAR_MAP[j] = '$'; - MAP_CHAR['$'] = j; - j++; - CHAR_MAP[j] = '_'; - MAP_CHAR['_'] = j; - } + public static final void printArray( PrintStream out, Object[] obj ) { + out.println(printArray(obj, true)); + } - /** Decode characters into bytes. - * Used by decode() - */ - private static class JavaReader extends FilterReader { - public JavaReader(Reader in) { - super(in); + + public static final void printArray( PrintWriter out, Object[] obj ) { + out.println(printArray(obj, true)); } - public int read() throws IOException { - int b = in.read(); - if(b != ESCAPE_CHAR) - return b; - - int i = in.read(); - if(i < 0) - return -1; + public static final String printArray( Object[] obj ) { + return printArray(obj, true); + } - if(((i >= '0') && (i <= '9')) || ((i >= 'a') && (i <= 'f'))) { // Normal escape - int j = in.read(); - if(j < 0) - return -1; + public static final String printArray( Object[] obj, boolean braces ) { + return printArray(obj, braces, false); + } - char[] tmp = { (char)i, (char)j }; - int s = Integer.parseInt(new String(tmp), 16); - return s; - } - return MAP_CHAR[i]; + public static final String printArray( Object[] obj, boolean braces, boolean quote ) { + if (obj == null) { + return null; + } + StringBuffer buf = new StringBuffer(); + if (braces) { + buf.append('{'); + } + for (int i = 0; i < obj.length; i++) { + if (obj[i] != null) { + buf.append((quote ? "\"" : "")).append(obj[i].toString()).append( + (quote ? "\"" : "")); + } else { + buf.append("null"); + } + if (i < obj.length - 1) { + buf.append(", "); + } + } + if (braces) { + buf.append('}'); + } + return buf.toString(); } - public int read(char[] cbuf, int off, int len) throws IOException { - for(int i=0; i < len; i++) - cbuf[off + i] = (char)read(); - return len; + /** @return true, if character is one of (a, ... z, A, ... Z, 0, ... 9, _) + */ + public static boolean isJavaIdentifierPart( char ch ) { + return ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) + || ((ch >= '0') && (ch <= '9')) || (ch == '_'); } - } - - /** Encode bytes into valid java identifier characters. - * Used by encode() - */ - private static class JavaWriter extends FilterWriter { - public JavaWriter(Writer out) { - super(out); + + + /** Encode byte array it into Java identifier string, i.e., a string + * that only contains the following characters: (a, ... z, A, ... Z, + * 0, ... 9, _, $). The encoding algorithm itself is not too + * clever: if the current byte's ASCII value already is a valid Java + * identifier part, leave it as it is. Otherwise it writes the + * escape character($) followed by

        • the ASCII value as a + * hexadecimal string, if the value is not in the range + * 200..247
        • a Java identifier char not used in a lowercase + * hexadecimal string, if the value is in the range + * 200..247
          • + * + *

            This operation inflates the original byte array by roughly 40-50%

            + * + * @param bytes the byte array to convert + * @param compress use gzip to minimize string + */ + public static String encode( byte[] bytes, boolean compress ) throws IOException { + if (compress) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + GZIPOutputStream gos = new GZIPOutputStream(baos); + gos.write(bytes, 0, bytes.length); + gos.close(); + baos.close(); + bytes = baos.toByteArray(); + } + CharArrayWriter caw = new CharArrayWriter(); + JavaWriter jw = new JavaWriter(caw); + for (int i = 0; i < bytes.length; i++) { + int in = bytes[i] & 0x000000ff; // Normalize to unsigned + jw.write(in); + } + return caw.toString(); } - public void write(int b) throws IOException { - if(isJavaIdentifierPart((char)b) && (b != ESCAPE_CHAR)) { - out.write(b); - } else { - out.write(ESCAPE_CHAR); // Escape character - - // Special escape - if(b >= 0 && b < FREE_CHARS) { - out.write(CHAR_MAP[b]); - } else { // Normal escape - char[] tmp = Integer.toHexString(b).toCharArray(); - - if(tmp.length == 1) { - out.write('0'); - out.write(tmp[0]); - } else { - out.write(tmp[0]); - out.write(tmp[1]); - } - } - } + + /** Decode a string back to a byte array. + * + * @param s the string to convert + * @param uncompress use gzip to uncompress the stream of bytes + */ + public static byte[] decode( String s, boolean uncompress ) throws IOException { + char[] chars = s.toCharArray(); + CharArrayReader car = new CharArrayReader(chars); + JavaReader jr = new JavaReader(car); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + int ch; + while ((ch = jr.read()) >= 0) { + bos.write(ch); + } + bos.close(); + car.close(); + jr.close(); + byte[] bytes = bos.toByteArray(); + if (uncompress) { + GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes)); + byte[] tmp = new byte[bytes.length * 3]; // Rough estimate + int count = 0; + int b; + while ((b = gis.read()) >= 0) { + tmp[count++] = (byte) b; + } + bytes = new byte[count]; + System.arraycopy(tmp, 0, bytes, 0, count); + } + return bytes; } - public void write(char[] cbuf, int off, int len) throws IOException { - for(int i=0; i < len; i++) - write(cbuf[off + i]); + // A-Z, g-z, _, $ + private static final int FREE_CHARS = 48; + static int[] CHAR_MAP = new int[FREE_CHARS]; + static int[] MAP_CHAR = new int[256]; // Reverse map + private static final char ESCAPE_CHAR = '$'; + static { + int j = 0; + for (int i = 'A'; i <= 'Z'; i++) { + CHAR_MAP[j] = i; + MAP_CHAR[i] = j; + j++; + } + for (int i = 'g'; i <= 'z'; i++) { + CHAR_MAP[j] = i; + MAP_CHAR[i] = j; + j++; + } + CHAR_MAP[j] = '$'; + MAP_CHAR['$'] = j; + j++; + CHAR_MAP[j] = '_'; + MAP_CHAR['_'] = j; } - public void write(String str, int off, int len) throws IOException { - write(str.toCharArray(), off, len); + /** Decode characters into bytes. + * Used by decode() + */ + private static class JavaReader extends FilterReader { + + public JavaReader(Reader in) { + super(in); + } + + + public int read() throws IOException { + int b = in.read(); + if (b != ESCAPE_CHAR) { + return b; + } + int i = in.read(); + if (i < 0) { + return -1; + } + if (((i >= '0') && (i <= '9')) || ((i >= 'a') && (i <= 'f'))) { // Normal escape + int j = in.read(); + if (j < 0) { + return -1; + } + char[] tmp = { + (char) i, (char) j + }; + int s = Integer.parseInt(new String(tmp), 16); + return s; + } + return MAP_CHAR[i]; + } + + + public int read( char[] cbuf, int off, int len ) throws IOException { + for (int i = 0; i < len; i++) { + cbuf[off + i] = (char) read(); + } + return len; + } } - } - - /** - * Escape all occurences of newline chars '\n', quotes \", etc. - */ - public static final String convertString(String label) { - char[] ch = label.toCharArray(); - StringBuffer buf = new StringBuffer(); - - for(int i=0; i < ch.length; i++) { - switch(ch[i]) { - case '\n': - buf.append("\\n"); break; - case '\r': - buf.append("\\r"); break; - case '\"': - buf.append("\\\""); break; - case '\'': - buf.append("\\'"); break; - case '\\': - buf.append("\\\\"); break; - default: - buf.append(ch[i]); break; - } + + /** Encode bytes into valid java identifier characters. + * Used by encode() + */ + private static class JavaWriter extends FilterWriter { + + public JavaWriter(Writer out) { + super(out); + } + + + public void write( int b ) throws IOException { + if (isJavaIdentifierPart((char) b) && (b != ESCAPE_CHAR)) { + out.write(b); + } else { + out.write(ESCAPE_CHAR); // Escape character + // Special escape + if (b >= 0 && b < FREE_CHARS) { + out.write(CHAR_MAP[b]); + } else { // Normal escape + char[] tmp = Integer.toHexString(b).toCharArray(); + if (tmp.length == 1) { + out.write('0'); + out.write(tmp[0]); + } else { + out.write(tmp[0]); + out.write(tmp[1]); + } + } + } + } + + + public void write( char[] cbuf, int off, int len ) throws IOException { + for (int i = 0; i < len; i++) { + write(cbuf[off + i]); + } + } + + + public void write( String str, int off, int len ) throws IOException { + write(str.toCharArray(), off, len); + } } - return buf.toString(); - } + + /** + * Escape all occurences of newline chars '\n', quotes \", etc. + */ + public static final String convertString( String label ) { + char[] ch = label.toCharArray(); + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < ch.length; i++) { + switch (ch[i]) { + case '\n': + buf.append("\\n"); + break; + case '\r': + buf.append("\\r"); + break; + case '\"': + buf.append("\\\""); + break; + case '\'': + buf.append("\\'"); + break; + case '\\': + buf.append("\\\\"); + break; + default: + buf.append(ch[i]); + break; + } + } + return buf.toString(); + } } diff --git a/src/java/org/apache/bcel/classfile/Visitor.java b/src/java/org/apache/bcel/classfile/Visitor.java index ce54ffff..23bd6366 100644 --- a/src/java/org/apache/bcel/classfile/Visitor.java +++ b/src/java/org/apache/bcel/classfile/Visitor.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.classfile; - /** * Interface to make use of the Visitor pattern programming style. * I.e. a class that implements this interface can traverse the contents of @@ -26,40 +25,103 @@ package org.apache.bcel.classfile; * @author M. Dahm */ public interface Visitor { - //public void visitAnnotation(Annotations obj); - //public void visitParameterAnnotation(ParameterAnnotations obj); - //public void visitAnnotationEntry(AnnotationEntry obj); - //public void visitAnnotationDefault(AnnotationDefault obj); - public void visitCode(Code obj); - public void visitCodeException(CodeException obj); - public void visitConstantClass(ConstantClass obj); - public void visitConstantDouble(ConstantDouble obj); - public void visitConstantFieldref(ConstantFieldref obj); - public void visitConstantFloat(ConstantFloat obj); - public void visitConstantInteger(ConstantInteger obj); - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj); - public void visitConstantLong(ConstantLong obj); - public void visitConstantMethodref(ConstantMethodref obj); - public void visitConstantNameAndType(ConstantNameAndType obj); - public void visitConstantPool(ConstantPool obj); - public void visitConstantString(ConstantString obj); - public void visitConstantUtf8(ConstantUtf8 obj); - public void visitConstantValue(ConstantValue obj); - public void visitDeprecated(Deprecated obj); - public void visitExceptionTable(ExceptionTable obj); - public void visitField(Field obj); - public void visitInnerClass(InnerClass obj); - public void visitInnerClasses(InnerClasses obj); - public void visitJavaClass(JavaClass obj); - public void visitLineNumber(LineNumber obj); - public void visitLineNumberTable(LineNumberTable obj); - public void visitLocalVariable(LocalVariable obj); - public void visitLocalVariableTable(LocalVariableTable obj); - public void visitMethod(Method obj); - public void visitSignature(Signature obj); - public void visitSourceFile(SourceFile obj); - public void visitSynthetic(Synthetic obj); - public void visitUnknown(Unknown obj); - public void visitStackMap(StackMap obj); - public void visitStackMapEntry(StackMapEntry obj); + + //public void visitAnnotation(Annotations obj); + //public void visitParameterAnnotation(ParameterAnnotations obj); + //public void visitAnnotationEntry(AnnotationEntry obj); + //public void visitAnnotationDefault(AnnotationDefault obj); + public void visitCode( Code obj ); + + + public void visitCodeException( CodeException obj ); + + + public void visitConstantClass( ConstantClass obj ); + + + public void visitConstantDouble( ConstantDouble obj ); + + + public void visitConstantFieldref( ConstantFieldref obj ); + + + public void visitConstantFloat( ConstantFloat obj ); + + + public void visitConstantInteger( ConstantInteger obj ); + + + public void visitConstantInterfaceMethodref( ConstantInterfaceMethodref obj ); + + + public void visitConstantLong( ConstantLong obj ); + + + public void visitConstantMethodref( ConstantMethodref obj ); + + + public void visitConstantNameAndType( ConstantNameAndType obj ); + + + public void visitConstantPool( ConstantPool obj ); + + + public void visitConstantString( ConstantString obj ); + + + public void visitConstantUtf8( ConstantUtf8 obj ); + + + public void visitConstantValue( ConstantValue obj ); + + + public void visitDeprecated( Deprecated obj ); + + + public void visitExceptionTable( ExceptionTable obj ); + + + public void visitField( Field obj ); + + + public void visitInnerClass( InnerClass obj ); + + + public void visitInnerClasses( InnerClasses obj ); + + + public void visitJavaClass( JavaClass obj ); + + + public void visitLineNumber( LineNumber obj ); + + + public void visitLineNumberTable( LineNumberTable obj ); + + + public void visitLocalVariable( LocalVariable obj ); + + + public void visitLocalVariableTable( LocalVariableTable obj ); + + + public void visitMethod( Method obj ); + + + public void visitSignature( Signature obj ); + + + public void visitSourceFile( SourceFile obj ); + + + public void visitSynthetic( Synthetic obj ); + + + public void visitUnknown( Unknown obj ); + + + public void visitStackMap( StackMap obj ); + + + public void visitStackMapEntry( StackMapEntry obj ); } diff --git a/src/java/org/apache/bcel/generic/AALOAD.java b/src/java/org/apache/bcel/generic/AALOAD.java index 7f4de9b4..31e0a48a 100644 --- a/src/java/org/apache/bcel/generic/AALOAD.java +++ b/src/java/org/apache/bcel/generic/AALOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * AALOAD - Load reference from array *
            Stack: ..., arrayref, index -> value
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class AALOAD extends ArrayInstruction implements StackProducer { - /** Load reference from array - */ - public AALOAD() { - super(org.apache.bcel.Constants.AALOAD); - } + + /** Load reference from array + */ + public AALOAD() { + super(org.apache.bcel.Constants.AALOAD); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitAALOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitAALOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/AASTORE.java b/src/java/org/apache/bcel/generic/AASTORE.java index 0e4425ad..ac8a1ba3 100644 --- a/src/java/org/apache/bcel/generic/AASTORE.java +++ b/src/java/org/apache/bcel/generic/AASTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * AASTORE - Store into reference array *
            Stack: ..., arrayref, index, value -> ...
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class AASTORE extends ArrayInstruction implements StackConsumer { - /** Store into reference array - */ - public AASTORE() { - super(org.apache.bcel.Constants.AASTORE); - } + + /** Store into reference array + */ + public AASTORE() { + super(org.apache.bcel.Constants.AASTORE); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitAASTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitAASTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/ACONST_NULL.java b/src/java/org/apache/bcel/generic/ACONST_NULL.java index 12363f28..58e93906 100644 --- a/src/java/org/apache/bcel/generic/ACONST_NULL.java +++ b/src/java/org/apache/bcel/generic/ACONST_NULL.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * ACONST_NULL - Push null reference *
            Stack: ... -> ..., null
            @@ -24,34 +23,35 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class ACONST_NULL extends Instruction - implements PushInstruction, TypedInstruction { - /** - * Push null reference - */ - public ACONST_NULL() { - super(org.apache.bcel.Constants.ACONST_NULL, (short)1); - } +public class ACONST_NULL extends Instruction implements PushInstruction, TypedInstruction { + + /** + * Push null reference + */ + public ACONST_NULL() { + super(org.apache.bcel.Constants.ACONST_NULL, (short) 1); + } + - /** @return Type.NULL - */ - public Type getType(ConstantPoolGen cp) { - return Type.NULL; - } + /** @return Type.NULL + */ + public Type getType( ConstantPoolGen cp ) { + return Type.NULL; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitTypedInstruction(this); - v.visitACONST_NULL(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitTypedInstruction(this); + v.visitACONST_NULL(this); + } } diff --git a/src/java/org/apache/bcel/generic/ALOAD.java b/src/java/org/apache/bcel/generic/ALOAD.java index 173851f5..06d86284 100644 --- a/src/java/org/apache/bcel/generic/ALOAD.java +++ b/src/java/org/apache/bcel/generic/ALOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * ALOAD - Load reference from local variable *
            Stack: ... -> ..., objectref
            @@ -25,31 +24,34 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class ALOAD extends LoadInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ALOAD() { - super(org.apache.bcel.Constants.ALOAD, org.apache.bcel.Constants.ALOAD_0); - } - /** Load reference from local variable - * @param n index of local variable - */ - public ALOAD(int n) { - super(org.apache.bcel.Constants.ALOAD, org.apache.bcel.Constants.ALOAD_0, n); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ALOAD() { + super(org.apache.bcel.Constants.ALOAD, org.apache.bcel.Constants.ALOAD_0); + } + + + /** Load reference from local variable + * @param n index of local variable + */ + public ALOAD(int n) { + super(org.apache.bcel.Constants.ALOAD, org.apache.bcel.Constants.ALOAD_0, n); + } + - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - super.accept(v); - v.visitALOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + super.accept(v); + v.visitALOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/ANEWARRAY.java b/src/java/org/apache/bcel/generic/ANEWARRAY.java index b95eb8b3..b0ce51c4 100644 --- a/src/java/org/apache/bcel/generic/ANEWARRAY.java +++ b/src/java/org/apache/bcel/generic/ANEWARRAY.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.ExceptionConstants; @@ -25,53 +25,55 @@ import org.apache.bcel.ExceptionConstants; * @version $Id$ * @author M. Dahm */ -public class ANEWARRAY extends CPInstruction - implements LoadClass, AllocationInstruction, ExceptionThrower, StackConsumer, StackProducer { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ANEWARRAY() {} +public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationInstruction, + ExceptionThrower, StackConsumer, StackProducer { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ANEWARRAY() { + } - public ANEWARRAY(int index) { - super(org.apache.bcel.Constants.ANEWARRAY, index); - } - public Class[] getExceptions(){ - Class[] cs = new Class[1 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; + public ANEWARRAY(int index) { + super(org.apache.bcel.Constants.ANEWARRAY, index); + } + - System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, - cs, 0, ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = - ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION; - return cs; - } + public Class[] getExceptions() { + Class[] cs = new Class[1 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); + cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION; + return cs; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitLoadClass(this); + v.visitAllocationInstruction(this); + v.visitExceptionThrower(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitANEWARRAY(this); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitLoadClass(this); - v.visitAllocationInstruction(this); - v.visitExceptionThrower(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitANEWARRAY(this); - } - public ObjectType getLoadClassType(ConstantPoolGen cpg) { - Type t = getType(cpg); - - if (t instanceof ArrayType){ - t = ((ArrayType) t).getBasicType(); + public ObjectType getLoadClassType( ConstantPoolGen cpg ) { + Type t = getType(cpg); + if (t instanceof ArrayType) { + t = ((ArrayType) t).getBasicType(); + } + return (t instanceof ObjectType) ? (ObjectType) t : null; } - - return (t instanceof ObjectType)? (ObjectType) t : null; - } } diff --git a/src/java/org/apache/bcel/generic/ARETURN.java b/src/java/org/apache/bcel/generic/ARETURN.java index 03de20a9..deb57f45 100644 --- a/src/java/org/apache/bcel/generic/ARETURN.java +++ b/src/java/org/apache/bcel/generic/ARETURN.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * ARETURN - Return reference from method *
            Stack: ..., objectref -> <empty>
            @@ -25,27 +24,28 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class ARETURN extends ReturnInstruction { - /** - * Return reference from method - */ - public ARETURN() { - super(org.apache.bcel.Constants.ARETURN); - } + + /** + * Return reference from method + */ + public ARETURN() { + super(org.apache.bcel.Constants.ARETURN); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitReturnInstruction(this); - v.visitARETURN(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitReturnInstruction(this); + v.visitARETURN(this); + } } diff --git a/src/java/org/apache/bcel/generic/ARRAYLENGTH.java b/src/java/org/apache/bcel/generic/ARRAYLENGTH.java index 3e83f798..d12dda42 100644 --- a/src/java/org/apache/bcel/generic/ARRAYLENGTH.java +++ b/src/java/org/apache/bcel/generic/ARRAYLENGTH.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * ARRAYLENGTH - Get length of array *
            Stack: ..., arrayref -> ..., length
            @@ -24,32 +23,35 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class ARRAYLENGTH extends Instruction - implements ExceptionThrower, StackProducer { - /** Get length of array - */ - public ARRAYLENGTH() { - super(org.apache.bcel.Constants.ARRAYLENGTH, (short)1); - } +public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackProducer { + + /** Get length of array + */ + public ARRAYLENGTH() { + super(org.apache.bcel.Constants.ARRAYLENGTH, (short) 1); + } + - /** @return exceptions this instruction may cause - */ - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION }; - } + /** @return exceptions this instruction may cause + */ + public Class[] getExceptions() { + return new Class[] { + org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION + }; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitStackProducer(this); - v.visitARRAYLENGTH(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitStackProducer(this); + v.visitARRAYLENGTH(this); + } } diff --git a/src/java/org/apache/bcel/generic/ASTORE.java b/src/java/org/apache/bcel/generic/ASTORE.java index 74de8179..ae1a2fbe 100644 --- a/src/java/org/apache/bcel/generic/ASTORE.java +++ b/src/java/org/apache/bcel/generic/ASTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * ASTORE - Store reference into local variable *
            Stack ..., objectref -> ... 
            @@ -25,31 +24,34 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class ASTORE extends StoreInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ASTORE() { - super(org.apache.bcel.Constants.ASTORE, org.apache.bcel.Constants.ASTORE_0); - } - /** Store reference into local variable - * @param n index of local variable - */ - public ASTORE(int n) { - super(org.apache.bcel.Constants.ASTORE, org.apache.bcel.Constants.ASTORE_0, n); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ASTORE() { + super(org.apache.bcel.Constants.ASTORE, org.apache.bcel.Constants.ASTORE_0); + } + + + /** Store reference into local variable + * @param n index of local variable + */ + public ASTORE(int n) { + super(org.apache.bcel.Constants.ASTORE, org.apache.bcel.Constants.ASTORE_0, n); + } + - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - super.accept(v); - v.visitASTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + super.accept(v); + v.visitASTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/ATHROW.java b/src/java/org/apache/bcel/generic/ATHROW.java index 93eceddd..f5411a9f 100644 --- a/src/java/org/apache/bcel/generic/ATHROW.java +++ b/src/java/org/apache/bcel/generic/ATHROW.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * ATHROW - Throw exception *
            Stack: ..., objectref -> objectref
            @@ -25,31 +24,35 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class ATHROW extends Instruction implements UnconditionalBranch, ExceptionThrower { - /** - * Throw exception - */ - public ATHROW() { - super(org.apache.bcel.Constants.ATHROW, (short)1); - } - /** @return exceptions this instruction may cause - */ - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.THROWABLE }; - } + /** + * Throw exception + */ + public ATHROW() { + super(org.apache.bcel.Constants.ATHROW, (short) 1); + } + + + /** @return exceptions this instruction may cause + */ + public Class[] getExceptions() { + return new Class[] { + org.apache.bcel.ExceptionConstants.THROWABLE + }; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitUnconditionalBranch(this); - v.visitExceptionThrower(this); - v.visitATHROW(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitUnconditionalBranch(this); + v.visitExceptionThrower(this); + v.visitATHROW(this); + } } diff --git a/src/java/org/apache/bcel/generic/AllocationInstruction.java b/src/java/org/apache/bcel/generic/AllocationInstruction.java index 86f8ada1..31ce261a 100644 --- a/src/java/org/apache/bcel/generic/AllocationInstruction.java +++ b/src/java/org/apache/bcel/generic/AllocationInstruction.java @@ -13,15 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denote family of instructions that allocates space in the heap. * * @version $Id$ * @author M. Dahm */ -public interface AllocationInstruction {} - +public interface AllocationInstruction { +} diff --git a/src/java/org/apache/bcel/generic/ArithmeticInstruction.java b/src/java/org/apache/bcel/generic/ArithmeticInstruction.java index 03a183e8..da060785 100644 --- a/src/java/org/apache/bcel/generic/ArithmeticInstruction.java +++ b/src/java/org/apache/bcel/generic/ArithmeticInstruction.java @@ -13,57 +13,82 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.Constants; + /** * Super class for the family of arithmetic instructions. * * @version $Id$ * @author M. Dahm */ -public abstract class ArithmeticInstruction extends Instruction - implements TypedInstruction, StackProducer, StackConsumer { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ArithmeticInstruction() {} - - /** - * @param opcode of instruction - */ - protected ArithmeticInstruction(short opcode) { - super(opcode, (short)1); - } +public abstract class ArithmeticInstruction extends Instruction implements TypedInstruction, + StackProducer, StackConsumer { - /** @return type associated with the instruction - */ - public Type getType(ConstantPoolGen cp) { - switch(opcode) { - case Constants.DADD: case Constants.DDIV: case Constants.DMUL: - case Constants.DNEG: case Constants.DREM: case Constants.DSUB: - return Type.DOUBLE; + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ArithmeticInstruction() { + } - case Constants.FADD: case Constants.FDIV: case Constants.FMUL: - case Constants.FNEG: case Constants.FREM: case Constants.FSUB: - return Type.FLOAT; - case Constants.IADD: case Constants.IAND: case Constants.IDIV: - case Constants.IMUL: case Constants.INEG: case Constants.IOR: case Constants.IREM: - case Constants.ISHL: case Constants.ISHR: case Constants.ISUB: - case Constants.IUSHR: case Constants.IXOR: - return Type.INT; + /** + * @param opcode of instruction + */ + protected ArithmeticInstruction(short opcode) { + super(opcode, (short) 1); + } - case Constants.LADD: case Constants.LAND: case Constants.LDIV: - case Constants.LMUL: case Constants.LNEG: case Constants.LOR: case Constants.LREM: - case Constants.LSHL: case Constants.LSHR: case Constants.LSUB: - case Constants.LUSHR: case Constants.LXOR: - return Type.LONG; - default: // Never reached - throw new ClassGenException("Unknown type " + opcode); + /** @return type associated with the instruction + */ + public Type getType( ConstantPoolGen cp ) { + switch (opcode) { + case Constants.DADD: + case Constants.DDIV: + case Constants.DMUL: + case Constants.DNEG: + case Constants.DREM: + case Constants.DSUB: + return Type.DOUBLE; + case Constants.FADD: + case Constants.FDIV: + case Constants.FMUL: + case Constants.FNEG: + case Constants.FREM: + case Constants.FSUB: + return Type.FLOAT; + case Constants.IADD: + case Constants.IAND: + case Constants.IDIV: + case Constants.IMUL: + case Constants.INEG: + case Constants.IOR: + case Constants.IREM: + case Constants.ISHL: + case Constants.ISHR: + case Constants.ISUB: + case Constants.IUSHR: + case Constants.IXOR: + return Type.INT; + case Constants.LADD: + case Constants.LAND: + case Constants.LDIV: + case Constants.LMUL: + case Constants.LNEG: + case Constants.LOR: + case Constants.LREM: + case Constants.LSHL: + case Constants.LSHR: + case Constants.LSUB: + case Constants.LUSHR: + case Constants.LXOR: + return Type.LONG; + default: // Never reached + throw new ClassGenException("Unknown type " + opcode); + } } - } } diff --git a/src/java/org/apache/bcel/generic/ArrayInstruction.java b/src/java/org/apache/bcel/generic/ArrayInstruction.java index 42e9d9fb..4b0377da 100644 --- a/src/java/org/apache/bcel/generic/ArrayInstruction.java +++ b/src/java/org/apache/bcel/generic/ArrayInstruction.java @@ -13,57 +13,69 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Super class for instructions dealing with array access such as IALOAD. * * @version $Id$ * @author M. Dahm */ -public abstract class ArrayInstruction extends Instruction - implements ExceptionThrower, TypedInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ArrayInstruction() {} +public abstract class ArrayInstruction extends Instruction implements ExceptionThrower, + TypedInstruction { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ArrayInstruction() { + } - /** - * @param opcode of instruction - */ - protected ArrayInstruction(short opcode) { - super(opcode, (short)1); - } - public Class[] getExceptions() { - return org.apache.bcel.ExceptionConstants.EXCS_ARRAY_EXCEPTION; - } + /** + * @param opcode of instruction + */ + protected ArrayInstruction(short opcode) { + super(opcode, (short) 1); + } + + + public Class[] getExceptions() { + return org.apache.bcel.ExceptionConstants.EXCS_ARRAY_EXCEPTION; + } - /** @return type associated with the instruction - */ - public Type getType(ConstantPoolGen cp) { - switch(opcode) { - case org.apache.bcel.Constants.IALOAD: case org.apache.bcel.Constants.IASTORE: - return Type.INT; - case org.apache.bcel.Constants.CALOAD: case org.apache.bcel.Constants.CASTORE: - return Type.CHAR; - case org.apache.bcel.Constants.BALOAD: case org.apache.bcel.Constants.BASTORE: - return Type.BYTE; - case org.apache.bcel.Constants.SALOAD: case org.apache.bcel.Constants.SASTORE: - return Type.SHORT; - case org.apache.bcel.Constants.LALOAD: case org.apache.bcel.Constants.LASTORE: - return Type.LONG; - case org.apache.bcel.Constants.DALOAD: case org.apache.bcel.Constants.DASTORE: - return Type.DOUBLE; - case org.apache.bcel.Constants.FALOAD: case org.apache.bcel.Constants.FASTORE: - return Type.FLOAT; - case org.apache.bcel.Constants.AALOAD: case org.apache.bcel.Constants.AASTORE: - return Type.OBJECT; - default: throw new ClassGenException("Oops: unknown case in switch" + opcode); + /** @return type associated with the instruction + */ + public Type getType( ConstantPoolGen cp ) { + switch (opcode) { + case org.apache.bcel.Constants.IALOAD: + case org.apache.bcel.Constants.IASTORE: + return Type.INT; + case org.apache.bcel.Constants.CALOAD: + case org.apache.bcel.Constants.CASTORE: + return Type.CHAR; + case org.apache.bcel.Constants.BALOAD: + case org.apache.bcel.Constants.BASTORE: + return Type.BYTE; + case org.apache.bcel.Constants.SALOAD: + case org.apache.bcel.Constants.SASTORE: + return Type.SHORT; + case org.apache.bcel.Constants.LALOAD: + case org.apache.bcel.Constants.LASTORE: + return Type.LONG; + case org.apache.bcel.Constants.DALOAD: + case org.apache.bcel.Constants.DASTORE: + return Type.DOUBLE; + case org.apache.bcel.Constants.FALOAD: + case org.apache.bcel.Constants.FASTORE: + return Type.FLOAT; + case org.apache.bcel.Constants.AALOAD: + case org.apache.bcel.Constants.AASTORE: + return Type.OBJECT; + default: + throw new ClassGenException("Oops: unknown case in switch" + opcode); + } } - } } diff --git a/src/java/org/apache/bcel/generic/ArrayType.java b/src/java/org/apache/bcel/generic/ArrayType.java index 2ccbdd22..fc6ea3e4 100644 --- a/src/java/org/apache/bcel/generic/ArrayType.java +++ b/src/java/org/apache/bcel/generic/ArrayType.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.Constants; @@ -25,96 +25,103 @@ import org.apache.bcel.Constants; * @author M. Dahm */ public final class ArrayType extends ReferenceType { - private int dimensions; - private Type basic_type; - - /** - * Convenience constructor for array type, e.g. int[] - * - * @param type array type, e.g. T_INT - */ - public ArrayType(byte type, int dimensions) { - this(BasicType.getType(type), dimensions); - } - - /** - * Convenience constructor for reference array type, e.g. Object[] - * - * @param class_name complete name of class (java.lang.String, e.g.) - */ - public ArrayType(String class_name, int dimensions) { - this(new ObjectType(class_name), dimensions); - } - - /** - * Constructor for array of given type - * - * @param type type of array (may be an array itself) - */ - public ArrayType(Type type, int dimensions) { - super(Constants.T_ARRAY, ""); - - if((dimensions < 1) || (dimensions > Constants.MAX_BYTE)) - throw new ClassGenException("Invalid number of dimensions: " + dimensions); - - switch(type.getType()) { - case Constants.T_ARRAY: - ArrayType array = (ArrayType)type; - this.dimensions = dimensions + array.dimensions; - basic_type = array.basic_type; - break; - - case Constants.T_VOID: - throw new ClassGenException("Invalid type: void[]"); - - default: // Basic type or reference - this.dimensions = dimensions; - basic_type = type; - break; + + private int dimensions; + private Type basic_type; + + + /** + * Convenience constructor for array type, e.g. int[] + * + * @param type array type, e.g. T_INT + */ + public ArrayType(byte type, int dimensions) { + this(BasicType.getType(type), dimensions); + } + + + /** + * Convenience constructor for reference array type, e.g. Object[] + * + * @param class_name complete name of class (java.lang.String, e.g.) + */ + public ArrayType(String class_name, int dimensions) { + this(new ObjectType(class_name), dimensions); + } + + + /** + * Constructor for array of given type + * + * @param type type of array (may be an array itself) + */ + public ArrayType(Type type, int dimensions) { + super(Constants.T_ARRAY, ""); + if ((dimensions < 1) || (dimensions > Constants.MAX_BYTE)) { + throw new ClassGenException("Invalid number of dimensions: " + dimensions); + } + switch (type.getType()) { + case Constants.T_ARRAY: + ArrayType array = (ArrayType) type; + this.dimensions = dimensions + array.dimensions; + basic_type = array.basic_type; + break; + case Constants.T_VOID: + throw new ClassGenException("Invalid type: void[]"); + default: // Basic type or reference + this.dimensions = dimensions; + basic_type = type; + break; + } + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < this.dimensions; i++) { + buf.append('['); + } + buf.append(basic_type.getSignature()); + signature = buf.toString(); } - StringBuffer buf = new StringBuffer(); - for(int i=0; i < this.dimensions; i++) - buf.append('['); - - buf.append(basic_type.getSignature()); - - signature = buf.toString(); - } - - /** - * @return basic type of array, i.e., for int[][][] the basic type is int - */ - public Type getBasicType() { - return basic_type; - } - - /** - * @return element type of array, i.e., for int[][][] the element type is int[][] - */ - public Type getElementType() { - if(dimensions == 1) - return basic_type; - - return new ArrayType(basic_type, dimensions - 1); - } - - /** @return number of dimensions of array - */ - public int getDimensions() { return dimensions; } - - /** @return a hash code value for the object. - */ - public int hashCode() { return basic_type.hashCode() ^ dimensions; } - - /** @return true if both type objects refer to the same array type. - */ - public boolean equals(Object _type) { - if(_type instanceof ArrayType) { - ArrayType array = (ArrayType)_type; - return (array.dimensions == dimensions) && array.basic_type.equals(basic_type); + + /** + * @return basic type of array, i.e., for int[][][] the basic type is int + */ + public Type getBasicType() { + return basic_type; + } + + + /** + * @return element type of array, i.e., for int[][][] the element type is int[][] + */ + public Type getElementType() { + if (dimensions == 1) { + return basic_type; + } + return new ArrayType(basic_type, dimensions - 1); + } + + + /** @return number of dimensions of array + */ + public int getDimensions() { + return dimensions; + } + + + /** @return a hash code value for the object. + */ + public int hashCode() { + return basic_type.hashCode() ^ dimensions; + } + + + /** @return true if both type objects refer to the same array type. + */ + public boolean equals( Object _type ) { + if (_type instanceof ArrayType) { + ArrayType array = (ArrayType) _type; + return (array.dimensions == dimensions) && array.basic_type.equals(basic_type); + } + return false; } - - return false; - } } diff --git a/src/java/org/apache/bcel/generic/BALOAD.java b/src/java/org/apache/bcel/generic/BALOAD.java index c7ef902a..3519960a 100644 --- a/src/java/org/apache/bcel/generic/BALOAD.java +++ b/src/java/org/apache/bcel/generic/BALOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * BALOAD - Load byte or boolean from array *
            Stack: ..., arrayref, index -> ..., value
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class BALOAD extends ArrayInstruction implements StackProducer { - /** Load byte or boolean from array - */ - public BALOAD() { - super(org.apache.bcel.Constants.BALOAD); - } + + /** Load byte or boolean from array + */ + public BALOAD() { + super(org.apache.bcel.Constants.BALOAD); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitBALOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitBALOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/BASTORE.java b/src/java/org/apache/bcel/generic/BASTORE.java index e8925a95..385c30c5 100644 --- a/src/java/org/apache/bcel/generic/BASTORE.java +++ b/src/java/org/apache/bcel/generic/BASTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * BASTORE - Store into byte or boolean array *
            Stack: ..., arrayref, index, value -> ...
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class BASTORE extends ArrayInstruction implements StackConsumer { - /** Store byte or boolean into array - */ - public BASTORE() { - super(org.apache.bcel.Constants.BASTORE); - } + + /** Store byte or boolean into array + */ + public BASTORE() { + super(org.apache.bcel.Constants.BASTORE); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitBASTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitBASTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/BIPUSH.java b/src/java/org/apache/bcel/generic/BIPUSH.java index 7e33326f..3f0996cf 100644 --- a/src/java/org/apache/bcel/generic/BIPUSH.java +++ b/src/java/org/apache/bcel/generic/BIPUSH.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.util.ByteSequence; @@ -30,66 +29,77 @@ import org.apache.bcel.util.ByteSequence; * @author M. Dahm */ public class BIPUSH extends Instruction implements ConstantPushInstruction { - private byte b; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - BIPUSH() {} - - /** Push byte on stack - */ - public BIPUSH(byte b) { - super(org.apache.bcel.Constants.BIPUSH, (short)2); - this.b = b; - } - - /** - * Dump instruction as byte code to stream out. - */ - public void dump(DataOutputStream out) throws IOException { - super.dump(out); - out.writeByte(b); - } - - /** - * @return mnemonic for instruction - */ - public String toString(boolean verbose) { - return super.toString(verbose) + " " + b; - } - - /** - * Read needed data (e.g. index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException - { - length = 2; - b = bytes.readByte(); - } - - public Number getValue() { return new Integer(b); } - - /** @return Type.BYTE - */ - public Type getType(ConstantPoolGen cp) { - return Type.BYTE; - } - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitPushInstruction(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitConstantPushInstruction(this); - v.visitBIPUSH(this); - } + + private byte b; + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + BIPUSH() { + } + + + /** Push byte on stack + */ + public BIPUSH(byte b) { + super(org.apache.bcel.Constants.BIPUSH, (short) 2); + this.b = b; + } + + + /** + * Dump instruction as byte code to stream out. + */ + public void dump( DataOutputStream out ) throws IOException { + super.dump(out); + out.writeByte(b); + } + + + /** + * @return mnemonic for instruction + */ + public String toString( boolean verbose ) { + return super.toString(verbose) + " " + b; + } + + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + length = 2; + b = bytes.readByte(); + } + + + public Number getValue() { + return new Integer(b); + } + + + /** @return Type.BYTE + */ + public Type getType( ConstantPoolGen cp ) { + return Type.BYTE; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitPushInstruction(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitConstantPushInstruction(this); + v.visitBIPUSH(this); + } } diff --git a/src/java/org/apache/bcel/generic/BREAKPOINT.java b/src/java/org/apache/bcel/generic/BREAKPOINT.java index 09ad65eb..2d828c10 100644 --- a/src/java/org/apache/bcel/generic/BREAKPOINT.java +++ b/src/java/org/apache/bcel/generic/BREAKPOINT.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * BREAKPOINT, JVM dependent, ignored by default * @@ -24,19 +23,21 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class BREAKPOINT extends Instruction { - public BREAKPOINT() { - super(org.apache.bcel.Constants.BREAKPOINT, (short)1); - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitBREAKPOINT(this); - } + public BREAKPOINT() { + super(org.apache.bcel.Constants.BREAKPOINT, (short) 1); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitBREAKPOINT(this); + } } diff --git a/src/java/org/apache/bcel/generic/BasicType.java b/src/java/org/apache/bcel/generic/BasicType.java index 61183387..8890e7bc 100644 --- a/src/java/org/apache/bcel/generic/BasicType.java +++ b/src/java/org/apache/bcel/generic/BasicType.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.Constants; @@ -25,44 +25,57 @@ import org.apache.bcel.Constants; * @author M. Dahm */ public final class BasicType extends Type { - /** - * Constructor for basic types such as int, long, `void' - * - * @param type one of T_INT, T_BOOLEAN, ..., T_VOID - * @see org.apache.bcel.Constants - */ - BasicType(byte type) { - super(type, Constants.SHORT_TYPE_NAMES[type]); - if((type < Constants.T_BOOLEAN) || (type > Constants.T_VOID)) - throw new ClassGenException("Invalid type: " + type); - } + /** + * Constructor for basic types such as int, long, `void' + * + * @param type one of T_INT, T_BOOLEAN, ..., T_VOID + * @see org.apache.bcel.Constants + */ + BasicType(byte type) { + super(type, Constants.SHORT_TYPE_NAMES[type]); + if ((type < Constants.T_BOOLEAN) || (type > Constants.T_VOID)) { + throw new ClassGenException("Invalid type: " + type); + } + } + + + public static final BasicType getType( byte type ) { + switch (type) { + case Constants.T_VOID: + return VOID; + case Constants.T_BOOLEAN: + return BOOLEAN; + case Constants.T_BYTE: + return BYTE; + case Constants.T_SHORT: + return SHORT; + case Constants.T_CHAR: + return CHAR; + case Constants.T_INT: + return INT; + case Constants.T_LONG: + return LONG; + case Constants.T_DOUBLE: + return DOUBLE; + case Constants.T_FLOAT: + return FLOAT; + default: + throw new ClassGenException("Invalid type: " + type); + } + } - public static final BasicType getType(byte type) { - switch(type) { - case Constants.T_VOID: return VOID; - case Constants.T_BOOLEAN: return BOOLEAN; - case Constants.T_BYTE: return BYTE; - case Constants.T_SHORT: return SHORT; - case Constants.T_CHAR: return CHAR; - case Constants.T_INT: return INT; - case Constants.T_LONG: return LONG; - case Constants.T_DOUBLE: return DOUBLE; - case Constants.T_FLOAT: return FLOAT; - default: - throw new ClassGenException("Invalid type: " + type); + /** @return a hash code value for the object. + */ + public int hashCode() { + return type; } - } - /** @return a hash code value for the object. - */ - public int hashCode() { return type; } - /** @return true if both type objects refer to the same type - */ - public boolean equals(Object _type) { - return (_type instanceof BasicType)? - ((BasicType)_type).type == this.type : false; - } + /** @return true if both type objects refer to the same type + */ + public boolean equals( Object _type ) { + return (_type instanceof BasicType) ? ((BasicType) _type).type == this.type : false; + } } diff --git a/src/java/org/apache/bcel/generic/BranchHandle.java b/src/java/org/apache/bcel/generic/BranchHandle.java index 9f2457da..4772cf8b 100644 --- a/src/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/java/org/apache/bcel/generic/BranchHandle.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * BranchHandle is returned by specialized InstructionList.append() whenever a * BranchInstruction is appended. This is useful when the target of this @@ -30,84 +29,93 @@ package org.apache.bcel.generic; * @author M. Dahm */ public final class BranchHandle extends InstructionHandle { - private BranchInstruction bi; // An alias in fact, but saves lots of casts - - private BranchHandle(BranchInstruction i) { - super(i); - bi = i; - } - - /** Factory methods. - */ - private static BranchHandle bh_list = null; // List of reusable handles - - static final BranchHandle getBranchHandle(BranchInstruction i) { - if(bh_list == null) - return new BranchHandle(i); - - BranchHandle bh = bh_list; - bh_list = (BranchHandle)bh.next; - - bh.setInstruction(i); - - return bh; - } - - /** Handle adds itself to the list of resuable handles. - */ - protected void addHandle() { - next = bh_list; - bh_list = this; - } - - /* Override InstructionHandle methods: delegate to branch instruction. - * Through this overriding all access to the private i_position field should - * be prevented. - */ - public int getPosition() { return bi.position; } - - void setPosition(int pos) { - i_position = bi.position = pos; - } - - protected int updatePosition(int offset, int max_offset) { - int x = bi.updatePosition(offset, max_offset); - i_position = bi.position; - return x; - } - - /** - * Pass new target to instruction. - */ - public void setTarget(InstructionHandle ih) { - bi.setTarget(ih); - } - - /** - * Update target of instruction. - */ - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { - bi.updateTarget(old_ih, new_ih); - } - - /** - * @return target of instruction. - */ - public InstructionHandle getTarget() { - return bi.getTarget(); - } - - /** - * Set new contents. Old instruction is disposed and may not be used anymore. - */ - public void setInstruction(Instruction i) { - super.setInstruction(i); - - if(!(i instanceof BranchInstruction)) - throw new ClassGenException("Assigning " + i + - " to branch handle which is not a branch instruction"); - - bi = (BranchInstruction)i; - } -} + private BranchInstruction bi; // An alias in fact, but saves lots of casts + + + private BranchHandle(BranchInstruction i) { + super(i); + bi = i; + } + + /** Factory methods. + */ + private static BranchHandle bh_list = null; // List of reusable handles + + + static final BranchHandle getBranchHandle( BranchInstruction i ) { + if (bh_list == null) { + return new BranchHandle(i); + } + BranchHandle bh = bh_list; + bh_list = (BranchHandle) bh.next; + bh.setInstruction(i); + return bh; + } + + + /** Handle adds itself to the list of resuable handles. + */ + protected void addHandle() { + next = bh_list; + bh_list = this; + } + + + /* Override InstructionHandle methods: delegate to branch instruction. + * Through this overriding all access to the private i_position field should + * be prevented. + */ + public int getPosition() { + return bi.position; + } + + + void setPosition( int pos ) { + i_position = bi.position = pos; + } + + + protected int updatePosition( int offset, int max_offset ) { + int x = bi.updatePosition(offset, max_offset); + i_position = bi.position; + return x; + } + + + /** + * Pass new target to instruction. + */ + public void setTarget( InstructionHandle ih ) { + bi.setTarget(ih); + } + + + /** + * Update target of instruction. + */ + public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { + bi.updateTarget(old_ih, new_ih); + } + + + /** + * @return target of instruction. + */ + public InstructionHandle getTarget() { + return bi.getTarget(); + } + + + /** + * Set new contents. Old instruction is disposed and may not be used anymore. + */ + public void setInstruction( Instruction i ) { + super.setInstruction(i); + if (!(i instanceof BranchInstruction)) { + throw new ClassGenException("Assigning " + i + + " to branch handle which is not a branch instruction"); + } + bi = (BranchInstruction) i; + } +} diff --git a/src/java/org/apache/bcel/generic/BranchInstruction.java b/src/java/org/apache/bcel/generic/BranchInstruction.java index 4283f584..a0568d41 100644 --- a/src/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/java/org/apache/bcel/generic/BranchInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.util.ByteSequence; @@ -31,180 +30,201 @@ import org.apache.bcel.util.ByteSequence; * @author M. Dahm */ public abstract class BranchInstruction extends Instruction implements InstructionTargeter { - protected int index; // Branch target relative to this instruction - protected InstructionHandle target; // Target object in instruction list - protected int position; // Byte code offset - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - BranchInstruction() {} - - /** Common super constructor - * @param opcode Instruction opcode - * @param target instruction to branch to - */ - protected BranchInstruction(short opcode, InstructionHandle target) { - super(opcode, (short)3); - setTarget(target); - } - - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - - index = getTargetOffset(); - - if(Math.abs(index) >= 32767) // too large for short - throw new ClassGenException("Branch target offset too large for short"); - - out.writeShort(index); // May be negative, i.e., point backwards - } - - /** - * @param _target branch target - * @return the offset to `target' relative to this instruction - */ - protected int getTargetOffset(InstructionHandle _target) { - if(_target == null) - throw new ClassGenException("Target of " + super.toString(true) + - " is invalid null handle"); - - int t = _target.getPosition(); - - if(t < 0) - throw new ClassGenException("Invalid branch target position offset for " + - super.toString(true) + ":" + t + ":" + _target); - - return t - position; - } - - /** - * @return the offset to this instruction's target - */ - protected int getTargetOffset() { return getTargetOffset(target); } - - /** - * Called by InstructionList.setPositions when setting the position for every - * instruction. In the presence of variable length instructions `setPositions' - * performs multiple passes over the instruction list to calculate the - * correct (byte) positions and offsets by calling this function. - * - * @param offset additional offset caused by preceding (variable length) instructions - * @param max_offset the maximum offset that may be caused by these instructions - * @return additional offset caused by possible change of this instruction's length - */ - protected int updatePosition(int offset, int max_offset) { - position += offset; - return 0; - } - - /** - * Long output format: - * - * <position in byte code> - * <name of opcode> "["<opcode number>"]" - * "("<length of instruction>")" - * "<"<target instruction>">" "@"<branch target offset> - * - * @param verbose long/short format switch - * @return mnemonic for instruction - */ - public String toString(boolean verbose) { - String s = super.toString(verbose); - String t = "null"; - - if(verbose) { - if(target != null) { - if(target.getInstruction() == this) - t = ""; - else if(target.getInstruction() == null) - t = ""; - else - t = target.getInstruction().toString(false); // Avoid circles - } - } else { - if(target != null) { - index = getTargetOffset(); - t = "" + (index + position); - } + + protected int index; // Branch target relative to this instruction + protected InstructionHandle target; // Target object in instruction list + protected int position; // Byte code offset + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + BranchInstruction() { + } + + + /** Common super constructor + * @param opcode Instruction opcode + * @param target instruction to branch to + */ + protected BranchInstruction(short opcode, InstructionHandle target) { + super(opcode, (short) 3); + setTarget(target); + } + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + out.writeByte(opcode); + index = getTargetOffset(); + if (Math.abs(index) >= 32767) { + throw new ClassGenException("Branch target offset too large for short"); + } + out.writeShort(index); // May be negative, i.e., point backwards + } + + + /** + * @param _target branch target + * @return the offset to `target' relative to this instruction + */ + protected int getTargetOffset( InstructionHandle _target ) { + if (_target == null) { + throw new ClassGenException("Target of " + super.toString(true) + + " is invalid null handle"); + } + int t = _target.getPosition(); + if (t < 0) { + throw new ClassGenException("Invalid branch target position offset for " + + super.toString(true) + ":" + t + ":" + _target); + } + return t - position; + } + + + /** + * @return the offset to this instruction's target + */ + protected int getTargetOffset() { + return getTargetOffset(target); + } + + + /** + * Called by InstructionList.setPositions when setting the position for every + * instruction. In the presence of variable length instructions `setPositions' + * performs multiple passes over the instruction list to calculate the + * correct (byte) positions and offsets by calling this function. + * + * @param offset additional offset caused by preceding (variable length) instructions + * @param max_offset the maximum offset that may be caused by these instructions + * @return additional offset caused by possible change of this instruction's length + */ + protected int updatePosition( int offset, int max_offset ) { + position += offset; + return 0; + } + + + /** + * Long output format: + * + * <position in byte code> + * <name of opcode> "["<opcode number>"]" + * "("<length of instruction>")" + * "<"<target instruction>">" "@"<branch target offset> + * + * @param verbose long/short format switch + * @return mnemonic for instruction + */ + public String toString( boolean verbose ) { + String s = super.toString(verbose); + String t = "null"; + if (verbose) { + if (target != null) { + if (target.getInstruction() == this) { + t = ""; + } else if (target.getInstruction() == null) { + t = ""; + } else { + t = target.getInstruction().toString(false); // Avoid circles + } + } + } else { + if (target != null) { + index = getTargetOffset(); + t = "" + (index + position); + } + } + return s + " -> " + t; } - return s + " -> " + t; - } - - /** - * Read needed data (e.g. index) from file. Conversion to a InstructionHandle - * is done in InstructionList(byte[]). - * - * @param bytes input stream - * @param wide wide prefix? - * @see InstructionList - */ - protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException - { - length = 3; - index = bytes.readShort(); - } - - /** - * @return target offset in byte code - */ - public final int getIndex() { return index; } - - /** - * @return target of branch instruction - */ - public InstructionHandle getTarget() { return target; } - - /** - * Set branch target - * @param target branch target - */ - public void setTarget(InstructionHandle target) { - notifyTarget(this.target, target, this); - this.target = target; - } - - /** - * Used by BranchInstruction, LocalVariableGen, CodeExceptionGen - */ - static final void notifyTarget(InstructionHandle old_ih, InstructionHandle new_ih, - InstructionTargeter t) { - if(old_ih != null) - old_ih.removeTargeter(t); - if(new_ih != null) - new_ih.addTargeter(t); - } - - /** - * @param old_ih old target - * @param new_ih new target - */ - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { - if(target == old_ih) - setTarget(new_ih); - else - throw new ClassGenException("Not targeting " + old_ih + ", but " + target); - } - - /** - * @return true, if ih is target of this instruction - */ - public boolean containsTarget(InstructionHandle ih) { - return (target == ih); - } - - /** - * Inform target that it's not targeted anymore. - */ - void dispose() { - setTarget(null); - index=-1; - position=-1; - } + + /** + * Read needed data (e.g. index) from file. Conversion to a InstructionHandle + * is done in InstructionList(byte[]). + * + * @param bytes input stream + * @param wide wide prefix? + * @see InstructionList + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + length = 3; + index = bytes.readShort(); + } + + + /** + * @return target offset in byte code + */ + public final int getIndex() { + return index; + } + + + /** + * @return target of branch instruction + */ + public InstructionHandle getTarget() { + return target; + } + + + /** + * Set branch target + * @param target branch target + */ + public void setTarget( InstructionHandle target ) { + notifyTarget(this.target, target, this); + this.target = target; + } + + + /** + * Used by BranchInstruction, LocalVariableGen, CodeExceptionGen + */ + static final void notifyTarget( InstructionHandle old_ih, InstructionHandle new_ih, + InstructionTargeter t ) { + if (old_ih != null) { + old_ih.removeTargeter(t); + } + if (new_ih != null) { + new_ih.addTargeter(t); + } + } + + + /** + * @param old_ih old target + * @param new_ih new target + */ + public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { + if (target == old_ih) { + setTarget(new_ih); + } else { + throw new ClassGenException("Not targeting " + old_ih + ", but " + target); + } + } + + + /** + * @return true, if ih is target of this instruction + */ + public boolean containsTarget( InstructionHandle ih ) { + return (target == ih); + } + + + /** + * Inform target that it's not targeted anymore. + */ + void dispose() { + setTarget(null); + index = -1; + position = -1; + } } diff --git a/src/java/org/apache/bcel/generic/CALOAD.java b/src/java/org/apache/bcel/generic/CALOAD.java index 79ba809e..32bb49f6 100644 --- a/src/java/org/apache/bcel/generic/CALOAD.java +++ b/src/java/org/apache/bcel/generic/CALOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * CALOAD - Load char from array *
            Stack: ..., arrayref, index -> ..., value
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class CALOAD extends ArrayInstruction implements StackProducer { - /** Load char from array - */ - public CALOAD() { - super(org.apache.bcel.Constants.CALOAD); - } + + /** Load char from array + */ + public CALOAD() { + super(org.apache.bcel.Constants.CALOAD); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitCALOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitCALOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/CASTORE.java b/src/java/org/apache/bcel/generic/CASTORE.java index 2119eda7..30ef90bd 100644 --- a/src/java/org/apache/bcel/generic/CASTORE.java +++ b/src/java/org/apache/bcel/generic/CASTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * CASTORE - Store into char array *
            Stack: ..., arrayref, index, value -> ...
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class CASTORE extends ArrayInstruction implements StackConsumer { - /** Store char into array - */ - public CASTORE() { - super(org.apache.bcel.Constants.CASTORE); - } + + /** Store char into array + */ + public CASTORE() { + super(org.apache.bcel.Constants.CASTORE); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitCASTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitCASTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/CHECKCAST.java b/src/java/org/apache/bcel/generic/CHECKCAST.java index 3fbec9b9..1b3e1978 100644 --- a/src/java/org/apache/bcel/generic/CHECKCAST.java +++ b/src/java/org/apache/bcel/generic/CHECKCAST.java @@ -13,10 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.ExceptionConstants; + /** * CHECKCAST - Check whether object is of given type *
            Stack: ..., objectref -> ..., objectref
            @@ -24,57 +25,60 @@ import org.apache.bcel.ExceptionConstants; * @version $Id$ * @author M. Dahm */ -public class CHECKCAST extends CPInstruction - implements LoadClass, ExceptionThrower, StackProducer, StackConsumer { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - CHECKCAST() {} +public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThrower, StackProducer, + StackConsumer { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + CHECKCAST() { + } + - /** Check whether object is of given type - * @param index index to class in constant pool - */ - public CHECKCAST(int index) { - super(org.apache.bcel.Constants.CHECKCAST, index); - } + /** Check whether object is of given type + * @param index index to class in constant pool + */ + public CHECKCAST(int index) { + super(org.apache.bcel.Constants.CHECKCAST, index); + } - /** @return exceptions this instruction may cause - */ - public Class[] getExceptions() { - Class[] cs = new Class[1 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, - cs, 0, ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = - ExceptionConstants.CLASS_CAST_EXCEPTION; - return cs; - } + /** @return exceptions this instruction may cause + */ + public Class[] getExceptions() { + Class[] cs = new Class[1 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); + cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.CLASS_CAST_EXCEPTION; + return cs; + } - public ObjectType getLoadClassType(ConstantPoolGen cpg) { - Type t = getType(cpg); - if(t instanceof ArrayType) - t = ((ArrayType) t).getBasicType(); + public ObjectType getLoadClassType( ConstantPoolGen cpg ) { + Type t = getType(cpg); + if (t instanceof ArrayType) { + t = ((ArrayType) t).getBasicType(); + } + return (t instanceof ObjectType) ? (ObjectType) t : null; + } - return (t instanceof ObjectType)? (ObjectType) t : null; - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitLoadClass(this); - v.visitExceptionThrower(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitCHECKCAST(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitLoadClass(this); + v.visitExceptionThrower(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitCHECKCAST(this); + } } diff --git a/src/java/org/apache/bcel/generic/CPInstruction.java b/src/java/org/apache/bcel/generic/CPInstruction.java index f3633456..135dd8f4 100644 --- a/src/java/org/apache/bcel/generic/CPInstruction.java +++ b/src/java/org/apache/bcel/generic/CPInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.classfile.Constant; @@ -35,97 +34,105 @@ import org.apache.bcel.util.ByteSequence; * @version $Id$ * @author M. Dahm */ -public abstract class CPInstruction extends Instruction - implements TypedInstruction, IndexedInstruction -{ - protected int index; // index to constant pool - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - CPInstruction() {} - - /** - * @param index to constant pool - */ - protected CPInstruction(short opcode, int index) { - super(opcode, (short)3); - setIndex(index); - } - - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - out.writeShort(index); - } - - /** - * Long output format: - * - * <name of opcode> "["<opcode number>"]" - * "("<length of instruction>")" "<"< constant pool index>">" - * - * @param verbose long/short format switch - * @return mnemonic for instruction - */ - public String toString(boolean verbose) { - return super.toString(verbose) + " " + index; - } - - /** - * @return mnemonic for instruction with symbolic references resolved - */ - public String toString(ConstantPool cp) { - Constant c = cp.getConstant(index); - String str = cp.constantToString(c); - - if(c instanceof ConstantClass) - str = str.replace('.', '/'); - - return org.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " + str; - } - - /** - * Read needed data (i.e., index) from file. - * @param bytes input stream - * @param wide wide prefix? - */ - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException - { - setIndex(bytes.readUnsignedShort()); - length = 3; - } - - /** - * @return index in constant pool referred by this instruction. - */ - public final int getIndex() { return index; } - - /** - * Set the index to constant pool. - * @param index in constant pool. - */ - public void setIndex(int index) { - if(index < 0) - throw new ClassGenException("Negative index value: " + index); - - this.index = index; - } - - /** @return type related with this instruction. - */ - public Type getType(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - String name = cp.getConstantString(index, org.apache.bcel.Constants.CONSTANT_Class); - - if(!name.startsWith("[")) - name = "L" + name + ";"; - - return Type.getType(name); - } +public abstract class CPInstruction extends Instruction implements TypedInstruction, + IndexedInstruction { + + protected int index; // index to constant pool + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + CPInstruction() { + } + + + /** + * @param index to constant pool + */ + protected CPInstruction(short opcode, int index) { + super(opcode, (short) 3); + setIndex(index); + } + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + out.writeByte(opcode); + out.writeShort(index); + } + + + /** + * Long output format: + * + * <name of opcode> "["<opcode number>"]" + * "("<length of instruction>")" "<"< constant pool index>">" + * + * @param verbose long/short format switch + * @return mnemonic for instruction + */ + public String toString( boolean verbose ) { + return super.toString(verbose) + " " + index; + } + + + /** + * @return mnemonic for instruction with symbolic references resolved + */ + public String toString( ConstantPool cp ) { + Constant c = cp.getConstant(index); + String str = cp.constantToString(c); + if (c instanceof ConstantClass) { + str = str.replace('.', '/'); + } + return org.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " + str; + } + + + /** + * Read needed data (i.e., index) from file. + * @param bytes input stream + * @param wide wide prefix? + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + setIndex(bytes.readUnsignedShort()); + length = 3; + } + + + /** + * @return index in constant pool referred by this instruction. + */ + public final int getIndex() { + return index; + } + + + /** + * Set the index to constant pool. + * @param index in constant pool. + */ + public void setIndex( int index ) { + if (index < 0) { + throw new ClassGenException("Negative index value: " + index); + } + this.index = index; + } + + + /** @return type related with this instruction. + */ + public Type getType( ConstantPoolGen cpg ) { + ConstantPool cp = cpg.getConstantPool(); + String name = cp.getConstantString(index, org.apache.bcel.Constants.CONSTANT_Class); + if (!name.startsWith("[")) { + name = "L" + name + ";"; + } + return Type.getType(name); + } } diff --git a/src/java/org/apache/bcel/generic/ClassGen.java b/src/java/org/apache/bcel/generic/ClassGen.java index 4c05a2be..7a1fc20d 100644 --- a/src/java/org/apache/bcel/generic/ClassGen.java +++ b/src/java/org/apache/bcel/generic/ClassGen.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -39,500 +38,504 @@ import org.apache.bcel.util.BCELComparator; * @author M. Dahm */ public class ClassGen extends AccessFlags implements Cloneable { - /* Corresponds to the fields found in a JavaClass object. - */ - private String class_name, super_class_name, file_name; - private int class_name_index = -1, superclass_name_index = -1; - private int major = Constants.MAJOR_1_1, minor = Constants.MINOR_1_1; - - private ConstantPoolGen cp; // Template for building up constant pool - - // ArrayLists instead of arrays to gather fields, methods, etc. - private List field_vec = new ArrayList(); - private List method_vec = new ArrayList(); - private List attribute_vec = new ArrayList(); - private List interface_vec = new ArrayList(); - - private static BCELComparator _cmp = new BCELComparator() { - public boolean equals(Object o1, Object o2) { - ClassGen THIS = (ClassGen)o1; - ClassGen THAT = (ClassGen)o2; - - return THIS.getClassName().equals(THAT.getClassName()); - } - - public int hashCode(Object o) { - ClassGen THIS = (ClassGen)o; - return THIS.getClassName().hashCode(); - } - }; - - /** Convenience constructor to set up some important values initially. - * - * @param class_name fully qualified class name - * @param super_class_name fully qualified superclass name - * @param file_name source file name - * @param access_flags access qualifiers - * @param interfaces implemented interfaces - * @param cp constant pool to use - */ - public ClassGen( - String class_name, - String super_class_name, - String file_name, - int access_flags, - String[] interfaces, - ConstantPoolGen cp) { - this.class_name = class_name; - this.super_class_name = super_class_name; - this.file_name = file_name; - this.access_flags = access_flags; - this.cp = cp; - - // Put everything needed by default into the constant pool and the vectors - if (file_name != null) - addAttribute( - new SourceFile( - cp.addUtf8("SourceFile"), - 2, - cp.addUtf8(file_name), - cp.getConstantPool())); - - class_name_index = cp.addClass(class_name); - superclass_name_index = cp.addClass(super_class_name); - - if (interfaces != null) - for (int i = 0; i < interfaces.length; i++) - addInterface(interfaces[i]); - } - - /** Convenience constructor to set up some important values initially. - * - * @param class_name fully qualified class name - * @param super_class_name fully qualified superclass name - * @param file_name source file name - * @param access_flags access qualifiers - * @param interfaces implemented interfaces - */ - public ClassGen( - String class_name, - String super_class_name, - String file_name, - int access_flags, - String[] interfaces) { - this( - class_name, - super_class_name, - file_name, - access_flags, - interfaces, - new ConstantPoolGen()); - } - - /** - * Initialize with existing class. - * @param clazz JavaClass object (e.g. read from file) - */ - public ClassGen(JavaClass clazz) { - class_name_index = clazz.getClassNameIndex(); - superclass_name_index = clazz.getSuperclassNameIndex(); - class_name = clazz.getClassName(); - super_class_name = clazz.getSuperclassName(); - file_name = clazz.getSourceFileName(); - access_flags = clazz.getAccessFlags(); - cp = new ConstantPoolGen(clazz.getConstantPool()); - major = clazz.getMajor(); - minor = clazz.getMinor(); - - Attribute[] attributes = clazz.getAttributes(); - Method[] methods = clazz.getMethods(); - Field[] fields = clazz.getFields(); - String[] interfaces = clazz.getInterfaceNames(); - - for (int i = 0; i < interfaces.length; i++) - addInterface(interfaces[i]); - - for (int i = 0; i < attributes.length; i++) - addAttribute(attributes[i]); - - for (int i = 0; i < methods.length; i++) - addMethod(methods[i]); - - for (int i = 0; i < fields.length; i++) - addField(fields[i]); - } - - /** - * @return the (finally) built up Java class object. - */ - public JavaClass getJavaClass() { - int[] interfaces = getInterfaces(); - Field[] fields = getFields(); - Method[] methods = getMethods(); - Attribute[] attributes = getAttributes(); - - // Must be last since the above calls may still add something to it - ConstantPool _cp = this.cp.getFinalConstantPool(); - - return new JavaClass( - class_name_index, - superclass_name_index, - file_name, - major, - minor, - access_flags, - _cp, - interfaces, - fields, - methods, - attributes); - } - - /** - * Add an interface to this class, i.e., this class has to implement it. - * @param name interface to implement (fully qualified class name) - */ - public void addInterface(String name) { - interface_vec.add(name); - } - - /** - * Remove an interface from this class. - * @param name interface to remove (fully qualified name) - */ - public void removeInterface(String name) { - interface_vec.remove(name); - } - - /** - * @return major version number of class file - */ - public int getMajor() { - return major; - } - - /** Set major version number of class file, default value is 45 (JDK 1.1) - * @param major major version number - */ - public void setMajor(int major) { - this.major = major; - } - - /** Set minor version number of class file, default value is 3 (JDK 1.1) - * @param minor minor version number - */ - public void setMinor(int minor) { - this.minor = minor; - } - - /** - * @return minor version number of class file - */ - public int getMinor() { - return minor; - } - - /** - * Add an attribute to this class. - * @param a attribute to add - */ - public void addAttribute(Attribute a) { - attribute_vec.add(a); - } - - /** - * Add a method to this class. - * @param m method to add - */ - public void addMethod(Method m) { - method_vec.add(m); - } - - /** - * Convenience method. - * - * Add an empty constructor to this class that does nothing but calling super(). - * @param access_flags rights for constructor - */ - public void addEmptyConstructor(int access_flags) { - InstructionList il = new InstructionList(); - il.append(InstructionConstants.THIS); // Push `this' - il.append( - new INVOKESPECIAL(cp.addMethodref(super_class_name, "", "()V"))); - il.append(InstructionConstants.RETURN); - - MethodGen mg = - new MethodGen( - access_flags, - Type.VOID, - Type.NO_ARGS, - null, - "", - class_name, - il, - cp); - mg.setMaxStack(1); - addMethod(mg.getMethod()); - } - - /** - * Add a field to this class. - * @param f field to add - */ - public void addField(Field f) { - field_vec.add(f); - } - - public boolean containsField(Field f) { - return field_vec.contains(f); - } - - /** @return field object with given name, or null - */ - public Field containsField(String name) { - for (Iterator e = field_vec.iterator(); e.hasNext();) { - Field f = (Field)e.next(); - if (f.getName().equals(name)) - return f; - } - - return null; - } - - /** @return method object with given name and signature, or null - */ - public Method containsMethod(String name, String signature) { - for (Iterator e = method_vec.iterator(); e.hasNext();) { - Method m = (Method)e.next(); - if (m.getName().equals(name) && m.getSignature().equals(signature)) - return m; - } - - return null; - } - - /** - * Remove an attribute from this class. - * @param a attribute to remove - */ - public void removeAttribute(Attribute a) { - attribute_vec.remove(a); - } - - /** - * Remove a method from this class. - * @param m method to remove - */ - public void removeMethod(Method m) { - method_vec.remove(m); - } - - /** Replace given method with new one. If the old one does not exist - * add the new_ method to the class anyway. - */ - public void replaceMethod(Method old, Method new_) { - if (new_ == null) - throw new ClassGenException("Replacement method must not be null"); - - int i = method_vec.indexOf(old); - - if (i < 0) - method_vec.add(new_); - else - method_vec.set(i, new_); - } - - /** Replace given field with new one. If the old one does not exist - * add the new_ field to the class anyway. - */ - public void replaceField(Field old, Field new_) { - if (new_ == null) - throw new ClassGenException("Replacement method must not be null"); - - int i = field_vec.indexOf(old); - - if (i < 0) - field_vec.add(new_); - else - field_vec.set(i, new_); - } - - /** - * Remove a field to this class. - * @param f field to remove - */ - public void removeField(Field f) { - field_vec.remove(f); - } - - public String getClassName() { - return class_name; - } - public String getSuperclassName() { - return super_class_name; - } - public String getFileName() { - return file_name; - } - - public void setClassName(String name) { - class_name = name.replace('/', '.'); - class_name_index = cp.addClass(name); - } - - public void setSuperclassName(String name) { - super_class_name = name.replace('/', '.'); - superclass_name_index = cp.addClass(name); - } - - public Method[] getMethods() { - return (Method[])method_vec.toArray(new Method[method_vec.size()]); - } - - public void setMethods(Method[] methods) { - method_vec.clear(); - for (int m = 0; m < methods.length; m++) - addMethod(methods[m]); - } - - public void setMethodAt(Method method, int pos) { - method_vec.set(pos, method); - } - - public Method getMethodAt(int pos) { - return (Method)method_vec.get(pos); - } - - public String[] getInterfaceNames() { - int size = interface_vec.size(); - String[] interfaces = new String[size]; - - interface_vec.toArray(interfaces); - return interfaces; - } - - public int[] getInterfaces() { - int size = interface_vec.size(); - int[] interfaces = new int[size]; - - for (int i = 0; i < size; i++) - interfaces[i] = cp.addClass((String)interface_vec.get(i)); - - return interfaces; - } - - public Field[] getFields() { - return (Field[])field_vec.toArray(new Field[field_vec.size()]); - } - - public Attribute[] getAttributes() { - return (Attribute[])attribute_vec.toArray(new Attribute[attribute_vec.size()]); - } - - public ConstantPoolGen getConstantPool() { - return cp; - } - public void setConstantPool(ConstantPoolGen constant_pool) { - cp = constant_pool; - } - - public void setClassNameIndex(int class_name_index) { - this.class_name_index = class_name_index; - class_name = - cp - .getConstantPool() - .getConstantString(class_name_index, Constants.CONSTANT_Class) - .replace('/', '.'); - } - - public void setSuperclassNameIndex(int superclass_name_index) { - this.superclass_name_index = superclass_name_index; - super_class_name = - cp - .getConstantPool() - .getConstantString(superclass_name_index, Constants.CONSTANT_Class) - .replace('/', '.'); - } - - public int getSuperclassNameIndex() { - return superclass_name_index; - } - - public int getClassNameIndex() { - return class_name_index; - } - - private ArrayList observers; - - /** Add observer for this object. - */ - public void addObserver(ClassObserver o) { - if (observers == null) - observers = new ArrayList(); - - observers.add(o); - } - - /** Remove observer for this object. - */ - public void removeObserver(ClassObserver o) { - if (observers != null) - observers.remove(o); - } - - /** Call notify() method on all observers. This method is not called - * automatically whenever the state has changed, but has to be - * called by the user after he has finished editing the object. - */ - public void update() { - if (observers != null) { - for (Iterator e = observers.iterator(); e.hasNext();) { - ((ClassObserver)e.next()).notify(this); - } - } - } - - public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException e) { - System.err.println(e); - return null; - } - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default two ClassGen objects are said to be equal when - * their class names are equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default return the hashcode of the class name. - * - * @see java.lang.Object#hashCode() - */ - public int hashCode() { - return _cmp.hashCode(this); - } + + /* Corresponds to the fields found in a JavaClass object. + */ + private String class_name, super_class_name, file_name; + private int class_name_index = -1, superclass_name_index = -1; + private int major = Constants.MAJOR_1_1, minor = Constants.MINOR_1_1; + private ConstantPoolGen cp; // Template for building up constant pool + // ArrayLists instead of arrays to gather fields, methods, etc. + private List field_vec = new ArrayList(); + private List method_vec = new ArrayList(); + private List attribute_vec = new ArrayList(); + private List interface_vec = new ArrayList(); + private static BCELComparator _cmp = new BCELComparator() { + + public boolean equals( Object o1, Object o2 ) { + ClassGen THIS = (ClassGen) o1; + ClassGen THAT = (ClassGen) o2; + return THIS.getClassName().equals(THAT.getClassName()); + } + + + public int hashCode( Object o ) { + ClassGen THIS = (ClassGen) o; + return THIS.getClassName().hashCode(); + } + }; + + + /** Convenience constructor to set up some important values initially. + * + * @param class_name fully qualified class name + * @param super_class_name fully qualified superclass name + * @param file_name source file name + * @param access_flags access qualifiers + * @param interfaces implemented interfaces + * @param cp constant pool to use + */ + public ClassGen(String class_name, String super_class_name, String file_name, int access_flags, + String[] interfaces, ConstantPoolGen cp) { + this.class_name = class_name; + this.super_class_name = super_class_name; + this.file_name = file_name; + this.access_flags = access_flags; + this.cp = cp; + // Put everything needed by default into the constant pool and the vectors + if (file_name != null) { + addAttribute(new SourceFile(cp.addUtf8("SourceFile"), 2, cp.addUtf8(file_name), cp + .getConstantPool())); + } + class_name_index = cp.addClass(class_name); + superclass_name_index = cp.addClass(super_class_name); + if (interfaces != null) { + for (int i = 0; i < interfaces.length; i++) { + addInterface(interfaces[i]); + } + } + } + + + /** Convenience constructor to set up some important values initially. + * + * @param class_name fully qualified class name + * @param super_class_name fully qualified superclass name + * @param file_name source file name + * @param access_flags access qualifiers + * @param interfaces implemented interfaces + */ + public ClassGen(String class_name, String super_class_name, String file_name, int access_flags, + String[] interfaces) { + this(class_name, super_class_name, file_name, access_flags, interfaces, + new ConstantPoolGen()); + } + + + /** + * Initialize with existing class. + * @param clazz JavaClass object (e.g. read from file) + */ + public ClassGen(JavaClass clazz) { + class_name_index = clazz.getClassNameIndex(); + superclass_name_index = clazz.getSuperclassNameIndex(); + class_name = clazz.getClassName(); + super_class_name = clazz.getSuperclassName(); + file_name = clazz.getSourceFileName(); + access_flags = clazz.getAccessFlags(); + cp = new ConstantPoolGen(clazz.getConstantPool()); + major = clazz.getMajor(); + minor = clazz.getMinor(); + Attribute[] attributes = clazz.getAttributes(); + Method[] methods = clazz.getMethods(); + Field[] fields = clazz.getFields(); + String[] interfaces = clazz.getInterfaceNames(); + for (int i = 0; i < interfaces.length; i++) { + addInterface(interfaces[i]); + } + for (int i = 0; i < attributes.length; i++) { + addAttribute(attributes[i]); + } + for (int i = 0; i < methods.length; i++) { + addMethod(methods[i]); + } + for (int i = 0; i < fields.length; i++) { + addField(fields[i]); + } + } + + + /** + * @return the (finally) built up Java class object. + */ + public JavaClass getJavaClass() { + int[] interfaces = getInterfaces(); + Field[] fields = getFields(); + Method[] methods = getMethods(); + Attribute[] attributes = getAttributes(); + // Must be last since the above calls may still add something to it + ConstantPool _cp = this.cp.getFinalConstantPool(); + return new JavaClass(class_name_index, superclass_name_index, file_name, major, minor, + access_flags, _cp, interfaces, fields, methods, attributes); + } + + + /** + * Add an interface to this class, i.e., this class has to implement it. + * @param name interface to implement (fully qualified class name) + */ + public void addInterface( String name ) { + interface_vec.add(name); + } + + + /** + * Remove an interface from this class. + * @param name interface to remove (fully qualified name) + */ + public void removeInterface( String name ) { + interface_vec.remove(name); + } + + + /** + * @return major version number of class file + */ + public int getMajor() { + return major; + } + + + /** Set major version number of class file, default value is 45 (JDK 1.1) + * @param major major version number + */ + public void setMajor( int major ) { + this.major = major; + } + + + /** Set minor version number of class file, default value is 3 (JDK 1.1) + * @param minor minor version number + */ + public void setMinor( int minor ) { + this.minor = minor; + } + + + /** + * @return minor version number of class file + */ + public int getMinor() { + return minor; + } + + + /** + * Add an attribute to this class. + * @param a attribute to add + */ + public void addAttribute( Attribute a ) { + attribute_vec.add(a); + } + + + /** + * Add a method to this class. + * @param m method to add + */ + public void addMethod( Method m ) { + method_vec.add(m); + } + + + /** + * Convenience method. + * + * Add an empty constructor to this class that does nothing but calling super(). + * @param access_flags rights for constructor + */ + public void addEmptyConstructor( int access_flags ) { + InstructionList il = new InstructionList(); + il.append(InstructionConstants.THIS); // Push `this' + il.append(new INVOKESPECIAL(cp.addMethodref(super_class_name, "", "()V"))); + il.append(InstructionConstants.RETURN); + MethodGen mg = new MethodGen(access_flags, Type.VOID, Type.NO_ARGS, null, "", + class_name, il, cp); + mg.setMaxStack(1); + addMethod(mg.getMethod()); + } + + + /** + * Add a field to this class. + * @param f field to add + */ + public void addField( Field f ) { + field_vec.add(f); + } + + + public boolean containsField( Field f ) { + return field_vec.contains(f); + } + + + /** @return field object with given name, or null + */ + public Field containsField( String name ) { + for (Iterator e = field_vec.iterator(); e.hasNext();) { + Field f = (Field) e.next(); + if (f.getName().equals(name)) { + return f; + } + } + return null; + } + + + /** @return method object with given name and signature, or null + */ + public Method containsMethod( String name, String signature ) { + for (Iterator e = method_vec.iterator(); e.hasNext();) { + Method m = (Method) e.next(); + if (m.getName().equals(name) && m.getSignature().equals(signature)) { + return m; + } + } + return null; + } + + + /** + * Remove an attribute from this class. + * @param a attribute to remove + */ + public void removeAttribute( Attribute a ) { + attribute_vec.remove(a); + } + + + /** + * Remove a method from this class. + * @param m method to remove + */ + public void removeMethod( Method m ) { + method_vec.remove(m); + } + + + /** Replace given method with new one. If the old one does not exist + * add the new_ method to the class anyway. + */ + public void replaceMethod( Method old, Method new_ ) { + if (new_ == null) { + throw new ClassGenException("Replacement method must not be null"); + } + int i = method_vec.indexOf(old); + if (i < 0) { + method_vec.add(new_); + } else { + method_vec.set(i, new_); + } + } + + + /** Replace given field with new one. If the old one does not exist + * add the new_ field to the class anyway. + */ + public void replaceField( Field old, Field new_ ) { + if (new_ == null) { + throw new ClassGenException("Replacement method must not be null"); + } + int i = field_vec.indexOf(old); + if (i < 0) { + field_vec.add(new_); + } else { + field_vec.set(i, new_); + } + } + + + /** + * Remove a field to this class. + * @param f field to remove + */ + public void removeField( Field f ) { + field_vec.remove(f); + } + + + public String getClassName() { + return class_name; + } + + + public String getSuperclassName() { + return super_class_name; + } + + + public String getFileName() { + return file_name; + } + + + public void setClassName( String name ) { + class_name = name.replace('/', '.'); + class_name_index = cp.addClass(name); + } + + + public void setSuperclassName( String name ) { + super_class_name = name.replace('/', '.'); + superclass_name_index = cp.addClass(name); + } + + + public Method[] getMethods() { + return (Method[]) method_vec.toArray(new Method[method_vec.size()]); + } + + + public void setMethods( Method[] methods ) { + method_vec.clear(); + for (int m = 0; m < methods.length; m++) { + addMethod(methods[m]); + } + } + + + public void setMethodAt( Method method, int pos ) { + method_vec.set(pos, method); + } + + + public Method getMethodAt( int pos ) { + return (Method) method_vec.get(pos); + } + + + public String[] getInterfaceNames() { + int size = interface_vec.size(); + String[] interfaces = new String[size]; + interface_vec.toArray(interfaces); + return interfaces; + } + + + public int[] getInterfaces() { + int size = interface_vec.size(); + int[] interfaces = new int[size]; + for (int i = 0; i < size; i++) { + interfaces[i] = cp.addClass((String) interface_vec.get(i)); + } + return interfaces; + } + + + public Field[] getFields() { + return (Field[]) field_vec.toArray(new Field[field_vec.size()]); + } + + + public Attribute[] getAttributes() { + return (Attribute[]) attribute_vec.toArray(new Attribute[attribute_vec.size()]); + } + + + public ConstantPoolGen getConstantPool() { + return cp; + } + + + public void setConstantPool( ConstantPoolGen constant_pool ) { + cp = constant_pool; + } + + + public void setClassNameIndex( int class_name_index ) { + this.class_name_index = class_name_index; + class_name = cp.getConstantPool().getConstantString(class_name_index, + Constants.CONSTANT_Class).replace('/', '.'); + } + + + public void setSuperclassNameIndex( int superclass_name_index ) { + this.superclass_name_index = superclass_name_index; + super_class_name = cp.getConstantPool().getConstantString(superclass_name_index, + Constants.CONSTANT_Class).replace('/', '.'); + } + + + public int getSuperclassNameIndex() { + return superclass_name_index; + } + + + public int getClassNameIndex() { + return class_name_index; + } + + private ArrayList observers; + + + /** Add observer for this object. + */ + public void addObserver( ClassObserver o ) { + if (observers == null) { + observers = new ArrayList(); + } + observers.add(o); + } + + + /** Remove observer for this object. + */ + public void removeObserver( ClassObserver o ) { + if (observers != null) { + observers.remove(o); + } + } + + + /** Call notify() method on all observers. This method is not called + * automatically whenever the state has changed, but has to be + * called by the user after he has finished editing the object. + */ + public void update() { + if (observers != null) { + for (Iterator e = observers.iterator(); e.hasNext();) { + ((ClassObserver) e.next()).notify(this); + } + } + } + + + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException e) { + System.err.println(e); + return null; + } + } + + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; + } + + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator( BCELComparator comparator ) { + _cmp = comparator; + } + + + /** + * Return value as defined by given BCELComparator strategy. + * By default two ClassGen objects are said to be equal when + * their class names are equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals( Object obj ) { + return _cmp.equals(this, obj); + } + + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the class name. + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); + } } diff --git a/src/java/org/apache/bcel/generic/ClassGenException.java b/src/java/org/apache/bcel/generic/ClassGenException.java index 1d37368a..9e3ce8e1 100644 --- a/src/java/org/apache/bcel/generic/ClassGenException.java +++ b/src/java/org/apache/bcel/generic/ClassGenException.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Thrown on internal errors. Extends RuntimeException so it hasn't to be declared * in the throws clause every time. @@ -25,7 +24,13 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class ClassGenException extends RuntimeException { - public ClassGenException() { super(); } - public ClassGenException(String s) { super(s); } -} + public ClassGenException() { + super(); + } + + + public ClassGenException(String s) { + super(s); + } +} diff --git a/src/java/org/apache/bcel/generic/ClassObserver.java b/src/java/org/apache/bcel/generic/ClassObserver.java index ad8ddb0e..20b1e0c6 100644 --- a/src/java/org/apache/bcel/generic/ClassObserver.java +++ b/src/java/org/apache/bcel/generic/ClassObserver.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Implement this interface if you're interested in changes to a ClassGen object * and register yourself with addObserver(). @@ -25,6 +24,6 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface ClassObserver { - public void notify(ClassGen clazz); -} + public void notify( ClassGen clazz ); +} diff --git a/src/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/java/org/apache/bcel/generic/CodeExceptionGen.java index 8ffb7ecd..5fa43d95 100644 --- a/src/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import org.apache.bcel.classfile.CodeException; /** @@ -34,131 +33,152 @@ import org.apache.bcel.classfile.CodeException; * @see CodeException * @see InstructionHandle */ -public final class CodeExceptionGen - implements InstructionTargeter, Cloneable, java.io.Serializable { - private InstructionHandle start_pc; - private InstructionHandle end_pc; - private InstructionHandle handler_pc; - private ObjectType catch_type; - - /** - * Add an exception handler, i.e., specify region where a handler is active and an - * instruction where the actual handling is done. - * - * @param start_pc Start of handled region (inclusive) - * @param end_pc End of handled region (inclusive) - * @param handler_pc Where handling is done - * @param catch_type which exception is handled, null for ANY - */ - public CodeExceptionGen(InstructionHandle start_pc, InstructionHandle end_pc, - InstructionHandle handler_pc, ObjectType catch_type) { - setStartPC(start_pc); - setEndPC(end_pc); - setHandlerPC(handler_pc); - this.catch_type = catch_type; - } - - /** - * Get CodeException object.
            - * - * This relies on that the instruction list has already been dumped - * to byte code or or that the `setPositions' methods has been - * called for the instruction list. - * - * @param cp constant pool - */ - public CodeException getCodeException(ConstantPoolGen cp) { - return new CodeException(start_pc.getPosition(), - end_pc.getPosition() + end_pc.getInstruction().getLength(), - handler_pc.getPosition(), - (catch_type == null)? 0 : cp.addClass(catch_type)); - } - - /* Set start of handler - * @param start_pc Start of handled region (inclusive) - */ - public void setStartPC(InstructionHandle start_pc) { - BranchInstruction.notifyTarget(this.start_pc, start_pc, this); - this.start_pc = start_pc; - } - - /* Set end of handler - * @param end_pc End of handled region (inclusive) - */ - public void setEndPC(InstructionHandle end_pc) { - BranchInstruction.notifyTarget(this.end_pc, end_pc, this); - this.end_pc = end_pc; - } - - /* Set handler code - * @param handler_pc Start of handler - */ - public void setHandlerPC(InstructionHandle handler_pc) { - BranchInstruction.notifyTarget(this.handler_pc, handler_pc, this); - this.handler_pc = handler_pc; - } - - /** - * @param old_ih old target, either start or end - * @param new_ih new target - */ - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { - boolean targeted = false; - - if(start_pc == old_ih) { - targeted = true; - setStartPC(new_ih); +public final class CodeExceptionGen implements InstructionTargeter, Cloneable, java.io.Serializable { + + private InstructionHandle start_pc; + private InstructionHandle end_pc; + private InstructionHandle handler_pc; + private ObjectType catch_type; + + + /** + * Add an exception handler, i.e., specify region where a handler is active and an + * instruction where the actual handling is done. + * + * @param start_pc Start of handled region (inclusive) + * @param end_pc End of handled region (inclusive) + * @param handler_pc Where handling is done + * @param catch_type which exception is handled, null for ANY + */ + public CodeExceptionGen(InstructionHandle start_pc, InstructionHandle end_pc, + InstructionHandle handler_pc, ObjectType catch_type) { + setStartPC(start_pc); + setEndPC(end_pc); + setHandlerPC(handler_pc); + this.catch_type = catch_type; + } + + + /** + * Get CodeException object.
            + * + * This relies on that the instruction list has already been dumped + * to byte code or or that the `setPositions' methods has been + * called for the instruction list. + * + * @param cp constant pool + */ + public CodeException getCodeException( ConstantPoolGen cp ) { + return new CodeException(start_pc.getPosition(), end_pc.getPosition() + + end_pc.getInstruction().getLength(), handler_pc.getPosition(), + (catch_type == null) ? 0 : cp.addClass(catch_type)); + } + + + /* Set start of handler + * @param start_pc Start of handled region (inclusive) + */ + public void setStartPC( InstructionHandle start_pc ) { + BranchInstruction.notifyTarget(this.start_pc, start_pc, this); + this.start_pc = start_pc; + } + + + /* Set end of handler + * @param end_pc End of handled region (inclusive) + */ + public void setEndPC( InstructionHandle end_pc ) { + BranchInstruction.notifyTarget(this.end_pc, end_pc, this); + this.end_pc = end_pc; } - if(end_pc == old_ih) { - targeted = true; - setEndPC(new_ih); + + /* Set handler code + * @param handler_pc Start of handler + */ + public void setHandlerPC( InstructionHandle handler_pc ) { + BranchInstruction.notifyTarget(this.handler_pc, handler_pc, this); + this.handler_pc = handler_pc; } - if(handler_pc == old_ih) { - targeted = true; - setHandlerPC(new_ih); + + /** + * @param old_ih old target, either start or end + * @param new_ih new target + */ + public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { + boolean targeted = false; + if (start_pc == old_ih) { + targeted = true; + setStartPC(new_ih); + } + if (end_pc == old_ih) { + targeted = true; + setEndPC(new_ih); + } + if (handler_pc == old_ih) { + targeted = true; + setHandlerPC(new_ih); + } + if (!targeted) { + throw new ClassGenException("Not targeting " + old_ih + ", but {" + start_pc + ", " + + end_pc + ", " + handler_pc + "}"); + } } - if(!targeted) - throw new ClassGenException("Not targeting " + old_ih + ", but {" + start_pc + ", " + - end_pc + ", " + handler_pc + "}"); - } - - /** - * @return true, if ih is target of this handler - */ - public boolean containsTarget(InstructionHandle ih) { - return (start_pc == ih) || (end_pc == ih) || (handler_pc == ih); - } - - /** Sets the type of the Exception to catch. Set 'null' for ANY. */ - public void setCatchType(ObjectType catch_type) { this.catch_type = catch_type; } - /** Gets the type of the Exception to catch, 'null' for ANY. */ - public ObjectType getCatchType() { return catch_type; } - - /** @return start of handled region (inclusive) - */ - public InstructionHandle getStartPC() { return start_pc; } - - /** @return end of handled region (inclusive) - */ - public InstructionHandle getEndPC() { return end_pc; } - - /** @return start of handler - */ - public InstructionHandle getHandlerPC() { return handler_pc; } - - public String toString() { - return "CodeExceptionGen(" + start_pc + ", " + end_pc + ", " + handler_pc + ")"; - } - - public Object clone() { - try { - return super.clone(); - } catch(CloneNotSupportedException e) { - System.err.println(e); - return null; + + /** + * @return true, if ih is target of this handler + */ + public boolean containsTarget( InstructionHandle ih ) { + return (start_pc == ih) || (end_pc == ih) || (handler_pc == ih); + } + + + /** Sets the type of the Exception to catch. Set 'null' for ANY. */ + public void setCatchType( ObjectType catch_type ) { + this.catch_type = catch_type; + } + + + /** Gets the type of the Exception to catch, 'null' for ANY. */ + public ObjectType getCatchType() { + return catch_type; + } + + + /** @return start of handled region (inclusive) + */ + public InstructionHandle getStartPC() { + return start_pc; + } + + + /** @return end of handled region (inclusive) + */ + public InstructionHandle getEndPC() { + return end_pc; + } + + + /** @return start of handler + */ + public InstructionHandle getHandlerPC() { + return handler_pc; + } + + + public String toString() { + return "CodeExceptionGen(" + start_pc + ", " + end_pc + ", " + handler_pc + ")"; + } + + + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException e) { + System.err.println(e); + return null; + } } - } } diff --git a/src/java/org/apache/bcel/generic/CompoundInstruction.java b/src/java/org/apache/bcel/generic/CompoundInstruction.java index 7c7bb4b5..5117334a 100644 --- a/src/java/org/apache/bcel/generic/CompoundInstruction.java +++ b/src/java/org/apache/bcel/generic/CompoundInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Wrapper class for `compound' operations, virtual instructions that * don't exist as byte code, but give a useful meaning. For example, @@ -34,6 +33,6 @@ package org.apache.bcel.generic; * @see SWITCH */ public interface CompoundInstruction { - public InstructionList getInstructionList(); -} + public InstructionList getInstructionList(); +} diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/java/org/apache/bcel/generic/ConstantPoolGen.java index dd63d024..fd533be8 100644 --- a/src/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import java.util.HashMap; import java.util.Map; import org.apache.bcel.Constants; @@ -50,741 +49,716 @@ import org.apache.bcel.classfile.ConstantUtf8; * @see Constant */ public class ConstantPoolGen implements java.io.Serializable { - protected int size = 1024; // Inital size, sufficient in most cases - protected Constant[] constants = new Constant[size]; - protected int index = 1; // First entry (0) used by JVM - - private static final String METHODREF_DELIM = ":"; - private static final String IMETHODREF_DELIM = "#"; - private static final String FIELDREF_DELIM = "&"; - private static final String NAT_DELIM = "%"; - - private static class Index implements java.io.Serializable { - int index; - Index(int i) { index = i; } - } - - /** - * Initialize with given array of constants. - * - * @param cs array of given constants, new ones will be appended - */ - public ConstantPoolGen(Constant[] cs) { - if(cs.length > size) { - size = cs.length; - constants = new Constant[size]; - } - - System.arraycopy(cs, 0, constants, 0, cs.length); - - if(cs.length > 0) - index = cs.length; - - for(int i=1; i < index; i++) { - Constant c = constants[i]; - - if(c instanceof ConstantString) { - ConstantString s = (ConstantString)c; - ConstantUtf8 u8 = (ConstantUtf8)constants[s.getStringIndex()]; - - String key = u8.getBytes(); - if (!string_table.containsKey(key)) - string_table.put(key, new Index(i)); - } else if(c instanceof ConstantClass) { - ConstantClass s = (ConstantClass)c; - ConstantUtf8 u8 = (ConstantUtf8)constants[s.getNameIndex()]; - - String key = u8.getBytes(); - if (!class_table.containsKey(key)) - class_table.put(key, new Index(i)); - } else if(c instanceof ConstantNameAndType) { - ConstantNameAndType n = (ConstantNameAndType)c; - ConstantUtf8 u8 = (ConstantUtf8)constants[n.getNameIndex()]; - ConstantUtf8 u8_2 = (ConstantUtf8)constants[n.getSignatureIndex()]; - - String key = u8.getBytes() + NAT_DELIM + u8_2.getBytes(); - if (!n_a_t_table.containsKey(key)) - n_a_t_table.put(key, new Index(i)); - } else if(c instanceof ConstantUtf8) { - ConstantUtf8 u = (ConstantUtf8)c; - - String key = u.getBytes(); - if (!utf8_table.containsKey(key)) - utf8_table.put(key, new Index(i)); - } else if(c instanceof ConstantCP) { - ConstantCP m = (ConstantCP)c; - ConstantClass clazz = (ConstantClass)constants[m.getClassIndex()]; - ConstantNameAndType n = (ConstantNameAndType)constants[m.getNameAndTypeIndex()]; - - ConstantUtf8 u8 = (ConstantUtf8)constants[clazz.getNameIndex()]; - String class_name = u8.getBytes().replace('/', '.'); - - u8 = (ConstantUtf8)constants[n.getNameIndex()]; - String method_name = u8.getBytes(); - - u8 = (ConstantUtf8)constants[n.getSignatureIndex()]; - String signature = u8.getBytes(); - - String delim = METHODREF_DELIM; - - if(c instanceof ConstantInterfaceMethodref) - delim = IMETHODREF_DELIM; - else if(c instanceof ConstantFieldref) - delim = FIELDREF_DELIM; - - String key = class_name + delim + method_name + delim + signature; - if (!cp_table.containsKey(key)) - cp_table.put(key, new Index(i)); - } - } - } - - /** - * Initialize with given constant pool. - */ - public ConstantPoolGen(ConstantPool cp) { - this(cp.getConstantPool()); - } - - /** - * Create empty constant pool. - */ - public ConstantPoolGen() {} - - /** Resize internal array of constants. - */ - protected void adjustSize() { - if(index + 3 >= size) { - Constant[] cs = constants; - - size *= 2; - constants = new Constant[size]; - System.arraycopy(cs, 0, constants, 0, index); - } - } - - private Map string_table = new HashMap(); - - /** - * Look for ConstantString in ConstantPool containing String `str'. - * - * @param str String to search for - * @return index on success, -1 otherwise - */ - public int lookupString(String str) { - Index index = (Index)string_table.get(str); - return (index != null)? index.index : -1; - } - - /** - * Add a new String constant to the ConstantPool, if it is not already in there. - * - * @param str String to add - * @return index of entry - */ - public int addString(String str) { - int ret; - - if((ret = lookupString(str)) != -1) - return ret; // Already in CP - - int utf8 = addUtf8(str); - - adjustSize(); - - ConstantString s = new ConstantString(utf8); - - ret = index; - constants[index++] = s; - - if (!string_table.containsKey(str)) - string_table.put(str, new Index(ret)); - - return ret; - } - - private Map class_table = new HashMap(); - - /** - * Look for ConstantClass in ConstantPool named `str'. - * - * @param str String to search for - * @return index on success, -1 otherwise - */ - public int lookupClass(String str) { - Index index = (Index)class_table.get(str.replace('.', '/')); - return (index != null)? index.index : -1; - } - - private int addClass_(String clazz) { - int ret; - - if((ret = lookupClass(clazz)) != -1) - return ret; // Already in CP - - adjustSize(); - - ConstantClass c = new ConstantClass(addUtf8(clazz)); - - ret = index; - constants[index++] = c; - - if (!class_table.containsKey(clazz)) - class_table.put(clazz, new Index(ret)); - - return ret; - } - - /** - * Add a new Class reference to the ConstantPool, if it is not already in there. - * - * @param str Class to add - * @return index of entry - */ - public int addClass(String str) { - return addClass_(str.replace('.', '/')); - } - - /** - * Add a new Class reference to the ConstantPool for a given type. - * - * @param type Class to add - * @return index of entry - */ - public int addClass(ObjectType type) { - return addClass(type.getClassName()); - } - - /** - * Add a reference to an array class (e.g. String[][]) as needed by MULTIANEWARRAY - * instruction, e.g. to the ConstantPool. - * - * @param type type of array class - * @return index of entry - */ - public int addArrayClass(ArrayType type) { - return addClass_(type.getSignature()); - } - - /** - * Look for ConstantInteger in ConstantPool. - * - * @param n integer number to look for - * @return index on success, -1 otherwise - */ - public int lookupInteger(int n) { - for(int i=1; i < index; i++) { - if(constants[i] instanceof ConstantInteger) { - ConstantInteger c = (ConstantInteger)constants[i]; - - if(c.getBytes() == n) - return i; - } - } - - return -1; - } - - /** - * Add a new Integer constant to the ConstantPool, if it is not already in there. - * - * @param n integer number to add - * @return index of entry - */ - public int addInteger(int n) { - int ret; - - if((ret = lookupInteger(n)) != -1) - return ret; // Already in CP - - adjustSize(); - - ret = index; - constants[index++] = new ConstantInteger(n); - - return ret; - } - - /** - * Look for ConstantFloat in ConstantPool. - * - * @param n Float number to look for - * @return index on success, -1 otherwise - */ - public int lookupFloat(float n) { - int bits = Float.floatToIntBits(n); - - for(int i=1; i < index; i++) { - if(constants[i] instanceof ConstantFloat) { - ConstantFloat c = (ConstantFloat)constants[i]; - - if(Float.floatToIntBits(c.getBytes()) == bits) - return i; - } - } - - return -1; - } - - /** - * Add a new Float constant to the ConstantPool, if it is not already in there. - * - * @param n Float number to add - * @return index of entry - */ - public int addFloat(float n) { - int ret; - - if((ret = lookupFloat(n)) != -1) - return ret; // Already in CP - - adjustSize(); - - ret = index; - constants[index++] = new ConstantFloat(n); - - return ret; - } - - private Map utf8_table = new HashMap(); - - /** - * Look for ConstantUtf8 in ConstantPool. - * - * @param n Utf8 string to look for - * @return index on success, -1 otherwise - */ - public int lookupUtf8(String n) { - Index index = (Index)utf8_table.get(n); - - return (index != null)? index.index : -1; - } - - /** - * Add a new Utf8 constant to the ConstantPool, if it is not already in there. - * - * @param n Utf8 string to add - * @return index of entry - */ - public int addUtf8(String n) { - int ret; - - if((ret = lookupUtf8(n)) != -1) - return ret; // Already in CP - - adjustSize(); - - ret = index; - constants[index++] = new ConstantUtf8(n); - - if (!utf8_table.containsKey(n)) - utf8_table.put(n, new Index(ret)); - - return ret; - } - - /** - * Look for ConstantLong in ConstantPool. - * - * @param n Long number to look for - * @return index on success, -1 otherwise - */ - public int lookupLong(long n) { - for(int i=1; i < index; i++) { - if(constants[i] instanceof ConstantLong) { - ConstantLong c = (ConstantLong)constants[i]; - - if(c.getBytes() == n) - return i; - } - } - - return -1; - } - - /** - * Add a new long constant to the ConstantPool, if it is not already in there. - * - * @param n Long number to add - * @return index of entry - */ - public int addLong(long n) { - int ret; - - if((ret = lookupLong(n)) != -1) - return ret; // Already in CP - - adjustSize(); - - ret = index; - constants[index] = new ConstantLong(n); - index += 2; // Wastes one entry according to spec - - return ret; - } - - /** - * Look for ConstantDouble in ConstantPool. - * - * @param n Double number to look for - * @return index on success, -1 otherwise - */ - public int lookupDouble(double n) { - long bits = Double.doubleToLongBits(n); - - for(int i=1; i < index; i++) { - if(constants[i] instanceof ConstantDouble) { - ConstantDouble c = (ConstantDouble)constants[i]; - - if(Double.doubleToLongBits(c.getBytes()) == bits) - return i; - } - } - - return -1; - } - - /** - * Add a new double constant to the ConstantPool, if it is not already in there. - * - * @param n Double number to add - * @return index of entry - */ - public int addDouble(double n) { - int ret; - - if((ret = lookupDouble(n)) != -1) - return ret; // Already in CP - - adjustSize(); - - ret = index; - constants[index] = new ConstantDouble(n); - index += 2; // Wastes one entry according to spec - - return ret; - } - - private Map n_a_t_table = new HashMap(); - - /** - * Look for ConstantNameAndType in ConstantPool. - * - * @param name of variable/method - * @param signature of variable/method - * @return index on success, -1 otherwise - */ - public int lookupNameAndType(String name, String signature) { - Index _index = (Index)n_a_t_table.get(name + NAT_DELIM + signature); - return (_index != null)? _index.index : -1; - } - - /** - * Add a new NameAndType constant to the ConstantPool if it is not already - * in there. - * - * @param name Name string to add - * @param signature signature string to add - * @return index of entry - */ - public int addNameAndType(String name, String signature) { - int ret; - int name_index, signature_index; - - if((ret = lookupNameAndType(name, signature)) != -1) - return ret; // Already in CP - - adjustSize(); - - name_index = addUtf8(name); - signature_index = addUtf8(signature); - ret = index; - constants[index++] = new ConstantNameAndType(name_index, signature_index); - - String key = name + NAT_DELIM + signature; - if (!n_a_t_table.containsKey(key)) - n_a_t_table.put(key, new Index(ret)); - return ret; - } - - private Map cp_table = new HashMap(); - - /** - * Look for ConstantMethodref in ConstantPool. - * - * @param class_name Where to find method - * @param method_name Guess what - * @param signature return and argument types - * @return index on success, -1 otherwise - */ - public int lookupMethodref(String class_name, String method_name, String signature) { - Index index = (Index)cp_table.get(class_name + METHODREF_DELIM + method_name + - METHODREF_DELIM + signature); - return (index != null)? index.index : -1; - } - - public int lookupMethodref(MethodGen method) { - return lookupMethodref(method.getClassName(), method.getName(), - method.getSignature()); - } - - /** - * Add a new Methodref constant to the ConstantPool, if it is not already - * in there. - * - * @param class_name class name string to add - * @param method_name method name string to add - * @param signature method signature string to add - * @return index of entry - */ - public int addMethodref(String class_name, String method_name, String signature) { - int ret, class_index, name_and_type_index; - - if((ret = lookupMethodref(class_name, method_name, signature)) != -1) - return ret; // Already in CP - - adjustSize(); - - name_and_type_index = addNameAndType(method_name, signature); - class_index = addClass(class_name); - ret = index; - constants[index++] = new ConstantMethodref(class_index, name_and_type_index); - - String key = class_name + METHODREF_DELIM + method_name + METHODREF_DELIM + signature; - - if (!cp_table.containsKey(key)) - cp_table.put(key, new Index(ret)); - - return ret; - } - - public int addMethodref(MethodGen method) { - return addMethodref(method.getClassName(), method.getName(), - method.getSignature()); - } - - /** - * Look for ConstantInterfaceMethodref in ConstantPool. - * - * @param class_name Where to find method - * @param method_name Guess what - * @param signature return and argument types - * @return index on success, -1 otherwise - */ - public int lookupInterfaceMethodref(String class_name, String method_name, String signature) { - Index index = (Index)cp_table.get(class_name + IMETHODREF_DELIM + method_name + - IMETHODREF_DELIM + signature); - return (index != null)? index.index : -1; - } - - public int lookupInterfaceMethodref(MethodGen method) { - return lookupInterfaceMethodref(method.getClassName(), method.getName(), - method.getSignature()); - } - - /** - * Add a new InterfaceMethodref constant to the ConstantPool, if it is not already - * in there. - * - * @param class_name class name string to add - * @param method_name method name string to add - * @param signature signature string to add - * @return index of entry - */ - public int addInterfaceMethodref(String class_name, String method_name, String signature) { - int ret, class_index, name_and_type_index; - - if((ret = lookupInterfaceMethodref(class_name, method_name, signature)) != -1) - return ret; // Already in CP - - adjustSize(); - - class_index = addClass(class_name); - name_and_type_index = addNameAndType(method_name, signature); - ret = index; - constants[index++] = new ConstantInterfaceMethodref(class_index, name_and_type_index); - - String key = class_name + IMETHODREF_DELIM + method_name + IMETHODREF_DELIM + signature; - if (!cp_table.containsKey(key)) - cp_table.put(key, new Index(ret)); - - return ret; - } - - public int addInterfaceMethodref(MethodGen method) { - return addInterfaceMethodref(method.getClassName(), method.getName(), - method.getSignature()); - } - - /** - * Look for ConstantFieldref in ConstantPool. - * - * @param class_name Where to find method - * @param field_name Guess what - * @param signature return and argument types - * @return index on success, -1 otherwise - */ - public int lookupFieldref(String class_name, String field_name, String signature) { - Index index = (Index)cp_table.get(class_name + FIELDREF_DELIM + field_name + - FIELDREF_DELIM + signature); - return (index != null)? index.index : -1; - } - - /** - * Add a new Fieldref constant to the ConstantPool, if it is not already - * in there. - * - * @param class_name class name string to add - * @param field_name field name string to add - * @param signature signature string to add - * @return index of entry - */ - public int addFieldref(String class_name, String field_name, String signature) { - int ret; - int class_index, name_and_type_index; - - if((ret = lookupFieldref(class_name, field_name, signature)) != -1) - return ret; // Already in CP - - adjustSize(); - - class_index = addClass(class_name); - name_and_type_index = addNameAndType(field_name, signature); - ret = index; - constants[index++] = new ConstantFieldref(class_index, name_and_type_index); - - String key = class_name + FIELDREF_DELIM + field_name + FIELDREF_DELIM + signature; - if (!cp_table.containsKey(key)) - cp_table.put(key, new Index(ret)); - - return ret; - } - - /** - * @param i index in constant pool - * @return constant pool entry at index i - */ - public Constant getConstant(int i) { return constants[i]; } - - /** - * Use with care! - * - * @param i index in constant pool - * @param c new constant pool entry at index i - */ - public void setConstant(int i, Constant c) { constants[i] = c; } - - /** - * @return intermediate constant pool - */ - public ConstantPool getConstantPool() { - return new ConstantPool(constants); - } - - /** - * @return current size of constant pool - */ - public int getSize() { - return index; - } - - /** - * @return constant pool with proper length - */ - public ConstantPool getFinalConstantPool() { - Constant[] cs = new Constant[index]; - - System.arraycopy(constants, 0, cs, 0, index); - - return new ConstantPool(cs); - } - - /** - * @return String representation. - */ - public String toString() { - StringBuffer buf = new StringBuffer(); - - for(int i=1; i < index; i++) - buf.append(i).append(")").append(constants[i]).append("\n"); - - return buf.toString(); - } - - /** Import constant from another ConstantPool and return new index. - */ - public int addConstant(Constant c, ConstantPoolGen cp) { - Constant[] constants = cp.getConstantPool().getConstantPool(); - - switch(c.getTag()) { - case Constants.CONSTANT_String: { - ConstantString s = (ConstantString)c; - ConstantUtf8 u8 = (ConstantUtf8)constants[s.getStringIndex()]; - - return addString(u8.getBytes()); - } - - case Constants.CONSTANT_Class: { - ConstantClass s = (ConstantClass)c; - ConstantUtf8 u8 = (ConstantUtf8)constants[s.getNameIndex()]; - return addClass(u8.getBytes()); + protected int size = 1024; // Inital size, sufficient in most cases + protected Constant[] constants = new Constant[size]; + protected int index = 1; // First entry (0) used by JVM + private static final String METHODREF_DELIM = ":"; + private static final String IMETHODREF_DELIM = "#"; + private static final String FIELDREF_DELIM = "&"; + private static final String NAT_DELIM = "%"; + + private static class Index implements java.io.Serializable { + + int index; + + + Index(int i) { + index = i; + } + } + + + /** + * Initialize with given array of constants. + * + * @param cs array of given constants, new ones will be appended + */ + public ConstantPoolGen(Constant[] cs) { + if (cs.length > size) { + size = cs.length; + constants = new Constant[size]; + } + System.arraycopy(cs, 0, constants, 0, cs.length); + if (cs.length > 0) { + index = cs.length; + } + for (int i = 1; i < index; i++) { + Constant c = constants[i]; + if (c instanceof ConstantString) { + ConstantString s = (ConstantString) c; + ConstantUtf8 u8 = (ConstantUtf8) constants[s.getStringIndex()]; + String key = u8.getBytes(); + if (!string_table.containsKey(key)) { + string_table.put(key, new Index(i)); + } + } else if (c instanceof ConstantClass) { + ConstantClass s = (ConstantClass) c; + ConstantUtf8 u8 = (ConstantUtf8) constants[s.getNameIndex()]; + String key = u8.getBytes(); + if (!class_table.containsKey(key)) { + class_table.put(key, new Index(i)); + } + } else if (c instanceof ConstantNameAndType) { + ConstantNameAndType n = (ConstantNameAndType) c; + ConstantUtf8 u8 = (ConstantUtf8) constants[n.getNameIndex()]; + ConstantUtf8 u8_2 = (ConstantUtf8) constants[n.getSignatureIndex()]; + String key = u8.getBytes() + NAT_DELIM + u8_2.getBytes(); + if (!n_a_t_table.containsKey(key)) { + n_a_t_table.put(key, new Index(i)); + } + } else if (c instanceof ConstantUtf8) { + ConstantUtf8 u = (ConstantUtf8) c; + String key = u.getBytes(); + if (!utf8_table.containsKey(key)) { + utf8_table.put(key, new Index(i)); + } + } else if (c instanceof ConstantCP) { + ConstantCP m = (ConstantCP) c; + ConstantClass clazz = (ConstantClass) constants[m.getClassIndex()]; + ConstantNameAndType n = (ConstantNameAndType) constants[m.getNameAndTypeIndex()]; + ConstantUtf8 u8 = (ConstantUtf8) constants[clazz.getNameIndex()]; + String class_name = u8.getBytes().replace('/', '.'); + u8 = (ConstantUtf8) constants[n.getNameIndex()]; + String method_name = u8.getBytes(); + u8 = (ConstantUtf8) constants[n.getSignatureIndex()]; + String signature = u8.getBytes(); + String delim = METHODREF_DELIM; + if (c instanceof ConstantInterfaceMethodref) { + delim = IMETHODREF_DELIM; + } else if (c instanceof ConstantFieldref) { + delim = FIELDREF_DELIM; + } + String key = class_name + delim + method_name + delim + signature; + if (!cp_table.containsKey(key)) { + cp_table.put(key, new Index(i)); + } + } + } + } + + + /** + * Initialize with given constant pool. + */ + public ConstantPoolGen(ConstantPool cp) { + this(cp.getConstantPool()); + } + + + /** + * Create empty constant pool. + */ + public ConstantPoolGen() { + } + + + /** Resize internal array of constants. + */ + protected void adjustSize() { + if (index + 3 >= size) { + Constant[] cs = constants; + size *= 2; + constants = new Constant[size]; + System.arraycopy(cs, 0, constants, 0, index); + } + } + + private Map string_table = new HashMap(); + + + /** + * Look for ConstantString in ConstantPool containing String `str'. + * + * @param str String to search for + * @return index on success, -1 otherwise + */ + public int lookupString( String str ) { + Index index = (Index) string_table.get(str); + return (index != null) ? index.index : -1; + } + + + /** + * Add a new String constant to the ConstantPool, if it is not already in there. + * + * @param str String to add + * @return index of entry + */ + public int addString( String str ) { + int ret; + if ((ret = lookupString(str)) != -1) { + return ret; // Already in CP + } + int utf8 = addUtf8(str); + adjustSize(); + ConstantString s = new ConstantString(utf8); + ret = index; + constants[index++] = s; + if (!string_table.containsKey(str)) { + string_table.put(str, new Index(ret)); + } + return ret; + } + + private Map class_table = new HashMap(); + + + /** + * Look for ConstantClass in ConstantPool named `str'. + * + * @param str String to search for + * @return index on success, -1 otherwise + */ + public int lookupClass( String str ) { + Index index = (Index) class_table.get(str.replace('.', '/')); + return (index != null) ? index.index : -1; + } + + + private int addClass_( String clazz ) { + int ret; + if ((ret = lookupClass(clazz)) != -1) { + return ret; // Already in CP + } + adjustSize(); + ConstantClass c = new ConstantClass(addUtf8(clazz)); + ret = index; + constants[index++] = c; + if (!class_table.containsKey(clazz)) { + class_table.put(clazz, new Index(ret)); + } + return ret; + } + + + /** + * Add a new Class reference to the ConstantPool, if it is not already in there. + * + * @param str Class to add + * @return index of entry + */ + public int addClass( String str ) { + return addClass_(str.replace('.', '/')); + } + + + /** + * Add a new Class reference to the ConstantPool for a given type. + * + * @param type Class to add + * @return index of entry + */ + public int addClass( ObjectType type ) { + return addClass(type.getClassName()); + } + + + /** + * Add a reference to an array class (e.g. String[][]) as needed by MULTIANEWARRAY + * instruction, e.g. to the ConstantPool. + * + * @param type type of array class + * @return index of entry + */ + public int addArrayClass( ArrayType type ) { + return addClass_(type.getSignature()); + } + + + /** + * Look for ConstantInteger in ConstantPool. + * + * @param n integer number to look for + * @return index on success, -1 otherwise + */ + public int lookupInteger( int n ) { + for (int i = 1; i < index; i++) { + if (constants[i] instanceof ConstantInteger) { + ConstantInteger c = (ConstantInteger) constants[i]; + if (c.getBytes() == n) { + return i; + } + } + } + return -1; + } + + + /** + * Add a new Integer constant to the ConstantPool, if it is not already in there. + * + * @param n integer number to add + * @return index of entry + */ + public int addInteger( int n ) { + int ret; + if ((ret = lookupInteger(n)) != -1) { + return ret; // Already in CP + } + adjustSize(); + ret = index; + constants[index++] = new ConstantInteger(n); + return ret; + } + + + /** + * Look for ConstantFloat in ConstantPool. + * + * @param n Float number to look for + * @return index on success, -1 otherwise + */ + public int lookupFloat( float n ) { + int bits = Float.floatToIntBits(n); + for (int i = 1; i < index; i++) { + if (constants[i] instanceof ConstantFloat) { + ConstantFloat c = (ConstantFloat) constants[i]; + if (Float.floatToIntBits(c.getBytes()) == bits) { + return i; + } + } + } + return -1; } - case Constants.CONSTANT_NameAndType: { - ConstantNameAndType n = (ConstantNameAndType)c; - ConstantUtf8 u8 = (ConstantUtf8)constants[n.getNameIndex()]; - ConstantUtf8 u8_2 = (ConstantUtf8)constants[n.getSignatureIndex()]; - return addNameAndType(u8.getBytes(), u8_2.getBytes()); + /** + * Add a new Float constant to the ConstantPool, if it is not already in there. + * + * @param n Float number to add + * @return index of entry + */ + public int addFloat( float n ) { + int ret; + if ((ret = lookupFloat(n)) != -1) { + return ret; // Already in CP + } + adjustSize(); + ret = index; + constants[index++] = new ConstantFloat(n); + return ret; } - case Constants.CONSTANT_Utf8: - return addUtf8(((ConstantUtf8)c).getBytes()); + private Map utf8_table = new HashMap(); - case Constants.CONSTANT_Double: - return addDouble(((ConstantDouble)c).getBytes()); - case Constants.CONSTANT_Float: - return addFloat(((ConstantFloat)c).getBytes()); + /** + * Look for ConstantUtf8 in ConstantPool. + * + * @param n Utf8 string to look for + * @return index on success, -1 otherwise + */ + public int lookupUtf8( String n ) { + Index index = (Index) utf8_table.get(n); + return (index != null) ? index.index : -1; + } - case Constants.CONSTANT_Long: - return addLong(((ConstantLong)c).getBytes()); - case Constants.CONSTANT_Integer: - return addInteger(((ConstantInteger)c).getBytes()); + /** + * Add a new Utf8 constant to the ConstantPool, if it is not already in there. + * + * @param n Utf8 string to add + * @return index of entry + */ + public int addUtf8( String n ) { + int ret; + if ((ret = lookupUtf8(n)) != -1) { + return ret; // Already in CP + } + adjustSize(); + ret = index; + constants[index++] = new ConstantUtf8(n); + if (!utf8_table.containsKey(n)) { + utf8_table.put(n, new Index(ret)); + } + return ret; + } - case Constants.CONSTANT_InterfaceMethodref: case Constants.CONSTANT_Methodref: - case Constants.CONSTANT_Fieldref: { - ConstantCP m = (ConstantCP)c; - ConstantClass clazz = (ConstantClass)constants[m.getClassIndex()]; - ConstantNameAndType n = (ConstantNameAndType)constants[m.getNameAndTypeIndex()]; - ConstantUtf8 u8 = (ConstantUtf8)constants[clazz.getNameIndex()]; - String class_name = u8.getBytes().replace('/', '.'); - u8 = (ConstantUtf8)constants[n.getNameIndex()]; - String name = u8.getBytes(); + /** + * Look for ConstantLong in ConstantPool. + * + * @param n Long number to look for + * @return index on success, -1 otherwise + */ + public int lookupLong( long n ) { + for (int i = 1; i < index; i++) { + if (constants[i] instanceof ConstantLong) { + ConstantLong c = (ConstantLong) constants[i]; + if (c.getBytes() == n) { + return i; + } + } + } + return -1; + } - u8 = (ConstantUtf8)constants[n.getSignatureIndex()]; - String signature = u8.getBytes(); - switch(c.getTag()) { - case Constants.CONSTANT_InterfaceMethodref: - return addInterfaceMethodref(class_name, name, signature); + /** + * Add a new long constant to the ConstantPool, if it is not already in there. + * + * @param n Long number to add + * @return index of entry + */ + public int addLong( long n ) { + int ret; + if ((ret = lookupLong(n)) != -1) { + return ret; // Already in CP + } + adjustSize(); + ret = index; + constants[index] = new ConstantLong(n); + index += 2; // Wastes one entry according to spec + return ret; + } + - case Constants.CONSTANT_Methodref: - return addMethodref(class_name, name, signature); + /** + * Look for ConstantDouble in ConstantPool. + * + * @param n Double number to look for + * @return index on success, -1 otherwise + */ + public int lookupDouble( double n ) { + long bits = Double.doubleToLongBits(n); + for (int i = 1; i < index; i++) { + if (constants[i] instanceof ConstantDouble) { + ConstantDouble c = (ConstantDouble) constants[i]; + if (Double.doubleToLongBits(c.getBytes()) == bits) { + return i; + } + } + } + return -1; + } - case Constants.CONSTANT_Fieldref: - return addFieldref(class_name, name, signature); - default: // Never reached - throw new RuntimeException("Unknown constant type " + c); - } + /** + * Add a new double constant to the ConstantPool, if it is not already in there. + * + * @param n Double number to add + * @return index of entry + */ + public int addDouble( double n ) { + int ret; + if ((ret = lookupDouble(n)) != -1) { + return ret; // Already in CP + } + adjustSize(); + ret = index; + constants[index] = new ConstantDouble(n); + index += 2; // Wastes one entry according to spec + return ret; } - default: // Never reached - throw new RuntimeException("Unknown constant type " + c); + private Map n_a_t_table = new HashMap(); + + + /** + * Look for ConstantNameAndType in ConstantPool. + * + * @param name of variable/method + * @param signature of variable/method + * @return index on success, -1 otherwise + */ + public int lookupNameAndType( String name, String signature ) { + Index _index = (Index) n_a_t_table.get(name + NAT_DELIM + signature); + return (_index != null) ? _index.index : -1; + } + + + /** + * Add a new NameAndType constant to the ConstantPool if it is not already + * in there. + * + * @param name Name string to add + * @param signature signature string to add + * @return index of entry + */ + public int addNameAndType( String name, String signature ) { + int ret; + int name_index, signature_index; + if ((ret = lookupNameAndType(name, signature)) != -1) { + return ret; // Already in CP + } + adjustSize(); + name_index = addUtf8(name); + signature_index = addUtf8(signature); + ret = index; + constants[index++] = new ConstantNameAndType(name_index, signature_index); + String key = name + NAT_DELIM + signature; + if (!n_a_t_table.containsKey(key)) { + n_a_t_table.put(key, new Index(ret)); + } + return ret; + } + + private Map cp_table = new HashMap(); + + + /** + * Look for ConstantMethodref in ConstantPool. + * + * @param class_name Where to find method + * @param method_name Guess what + * @param signature return and argument types + * @return index on success, -1 otherwise + */ + public int lookupMethodref( String class_name, String method_name, String signature ) { + Index index = (Index) cp_table.get(class_name + METHODREF_DELIM + method_name + + METHODREF_DELIM + signature); + return (index != null) ? index.index : -1; + } + + + public int lookupMethodref( MethodGen method ) { + return lookupMethodref(method.getClassName(), method.getName(), method.getSignature()); + } + + + /** + * Add a new Methodref constant to the ConstantPool, if it is not already + * in there. + * + * @param class_name class name string to add + * @param method_name method name string to add + * @param signature method signature string to add + * @return index of entry + */ + public int addMethodref( String class_name, String method_name, String signature ) { + int ret, class_index, name_and_type_index; + if ((ret = lookupMethodref(class_name, method_name, signature)) != -1) { + return ret; // Already in CP + } + adjustSize(); + name_and_type_index = addNameAndType(method_name, signature); + class_index = addClass(class_name); + ret = index; + constants[index++] = new ConstantMethodref(class_index, name_and_type_index); + String key = class_name + METHODREF_DELIM + method_name + METHODREF_DELIM + signature; + if (!cp_table.containsKey(key)) { + cp_table.put(key, new Index(ret)); + } + return ret; + } + + + public int addMethodref( MethodGen method ) { + return addMethodref(method.getClassName(), method.getName(), method.getSignature()); + } + + + /** + * Look for ConstantInterfaceMethodref in ConstantPool. + * + * @param class_name Where to find method + * @param method_name Guess what + * @param signature return and argument types + * @return index on success, -1 otherwise + */ + public int lookupInterfaceMethodref( String class_name, String method_name, String signature ) { + Index index = (Index) cp_table.get(class_name + IMETHODREF_DELIM + method_name + + IMETHODREF_DELIM + signature); + return (index != null) ? index.index : -1; + } + + + public int lookupInterfaceMethodref( MethodGen method ) { + return lookupInterfaceMethodref(method.getClassName(), method.getName(), method + .getSignature()); + } + + + /** + * Add a new InterfaceMethodref constant to the ConstantPool, if it is not already + * in there. + * + * @param class_name class name string to add + * @param method_name method name string to add + * @param signature signature string to add + * @return index of entry + */ + public int addInterfaceMethodref( String class_name, String method_name, String signature ) { + int ret, class_index, name_and_type_index; + if ((ret = lookupInterfaceMethodref(class_name, method_name, signature)) != -1) { + return ret; // Already in CP + } + adjustSize(); + class_index = addClass(class_name); + name_and_type_index = addNameAndType(method_name, signature); + ret = index; + constants[index++] = new ConstantInterfaceMethodref(class_index, name_and_type_index); + String key = class_name + IMETHODREF_DELIM + method_name + IMETHODREF_DELIM + signature; + if (!cp_table.containsKey(key)) { + cp_table.put(key, new Index(ret)); + } + return ret; + } + + + public int addInterfaceMethodref( MethodGen method ) { + return addInterfaceMethodref(method.getClassName(), method.getName(), method.getSignature()); + } + + + /** + * Look for ConstantFieldref in ConstantPool. + * + * @param class_name Where to find method + * @param field_name Guess what + * @param signature return and argument types + * @return index on success, -1 otherwise + */ + public int lookupFieldref( String class_name, String field_name, String signature ) { + Index index = (Index) cp_table.get(class_name + FIELDREF_DELIM + field_name + + FIELDREF_DELIM + signature); + return (index != null) ? index.index : -1; + } + + + /** + * Add a new Fieldref constant to the ConstantPool, if it is not already + * in there. + * + * @param class_name class name string to add + * @param field_name field name string to add + * @param signature signature string to add + * @return index of entry + */ + public int addFieldref( String class_name, String field_name, String signature ) { + int ret; + int class_index, name_and_type_index; + if ((ret = lookupFieldref(class_name, field_name, signature)) != -1) { + return ret; // Already in CP + } + adjustSize(); + class_index = addClass(class_name); + name_and_type_index = addNameAndType(field_name, signature); + ret = index; + constants[index++] = new ConstantFieldref(class_index, name_and_type_index); + String key = class_name + FIELDREF_DELIM + field_name + FIELDREF_DELIM + signature; + if (!cp_table.containsKey(key)) { + cp_table.put(key, new Index(ret)); + } + return ret; + } + + + /** + * @param i index in constant pool + * @return constant pool entry at index i + */ + public Constant getConstant( int i ) { + return constants[i]; + } + + + /** + * Use with care! + * + * @param i index in constant pool + * @param c new constant pool entry at index i + */ + public void setConstant( int i, Constant c ) { + constants[i] = c; + } + + + /** + * @return intermediate constant pool + */ + public ConstantPool getConstantPool() { + return new ConstantPool(constants); + } + + + /** + * @return current size of constant pool + */ + public int getSize() { + return index; + } + + + /** + * @return constant pool with proper length + */ + public ConstantPool getFinalConstantPool() { + Constant[] cs = new Constant[index]; + System.arraycopy(constants, 0, cs, 0, index); + return new ConstantPool(cs); + } + + + /** + * @return String representation. + */ + public String toString() { + StringBuffer buf = new StringBuffer(); + for (int i = 1; i < index; i++) { + buf.append(i).append(")").append(constants[i]).append("\n"); + } + return buf.toString(); + } + + + /** Import constant from another ConstantPool and return new index. + */ + public int addConstant( Constant c, ConstantPoolGen cp ) { + Constant[] constants = cp.getConstantPool().getConstantPool(); + switch (c.getTag()) { + case Constants.CONSTANT_String: { + ConstantString s = (ConstantString) c; + ConstantUtf8 u8 = (ConstantUtf8) constants[s.getStringIndex()]; + return addString(u8.getBytes()); + } + case Constants.CONSTANT_Class: { + ConstantClass s = (ConstantClass) c; + ConstantUtf8 u8 = (ConstantUtf8) constants[s.getNameIndex()]; + return addClass(u8.getBytes()); + } + case Constants.CONSTANT_NameAndType: { + ConstantNameAndType n = (ConstantNameAndType) c; + ConstantUtf8 u8 = (ConstantUtf8) constants[n.getNameIndex()]; + ConstantUtf8 u8_2 = (ConstantUtf8) constants[n.getSignatureIndex()]; + return addNameAndType(u8.getBytes(), u8_2.getBytes()); + } + case Constants.CONSTANT_Utf8: + return addUtf8(((ConstantUtf8) c).getBytes()); + case Constants.CONSTANT_Double: + return addDouble(((ConstantDouble) c).getBytes()); + case Constants.CONSTANT_Float: + return addFloat(((ConstantFloat) c).getBytes()); + case Constants.CONSTANT_Long: + return addLong(((ConstantLong) c).getBytes()); + case Constants.CONSTANT_Integer: + return addInteger(((ConstantInteger) c).getBytes()); + case Constants.CONSTANT_InterfaceMethodref: + case Constants.CONSTANT_Methodref: + case Constants.CONSTANT_Fieldref: { + ConstantCP m = (ConstantCP) c; + ConstantClass clazz = (ConstantClass) constants[m.getClassIndex()]; + ConstantNameAndType n = (ConstantNameAndType) constants[m.getNameAndTypeIndex()]; + ConstantUtf8 u8 = (ConstantUtf8) constants[clazz.getNameIndex()]; + String class_name = u8.getBytes().replace('/', '.'); + u8 = (ConstantUtf8) constants[n.getNameIndex()]; + String name = u8.getBytes(); + u8 = (ConstantUtf8) constants[n.getSignatureIndex()]; + String signature = u8.getBytes(); + switch (c.getTag()) { + case Constants.CONSTANT_InterfaceMethodref: + return addInterfaceMethodref(class_name, name, signature); + case Constants.CONSTANT_Methodref: + return addMethodref(class_name, name, signature); + case Constants.CONSTANT_Fieldref: + return addFieldref(class_name, name, signature); + default: // Never reached + throw new RuntimeException("Unknown constant type " + c); + } + } + default: // Never reached + throw new RuntimeException("Unknown constant type " + c); + } } - } } diff --git a/src/java/org/apache/bcel/generic/ConstantPushInstruction.java b/src/java/org/apache/bcel/generic/ConstantPushInstruction.java index 6b6110ef..c5c97c62 100644 --- a/src/java/org/apache/bcel/generic/ConstantPushInstruction.java +++ b/src/java/org/apache/bcel/generic/ConstantPushInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denotes a push instruction that produces a literal on the stack * such as SIPUSH, BIPUSH, ICONST, etc. @@ -28,6 +27,6 @@ package org.apache.bcel.generic; * @see SIPUSH */ public interface ConstantPushInstruction extends PushInstruction, TypedInstruction { - public Number getValue(); -} + public Number getValue(); +} diff --git a/src/java/org/apache/bcel/generic/ConversionInstruction.java b/src/java/org/apache/bcel/generic/ConversionInstruction.java index 8a3e6096..86ada6d8 100644 --- a/src/java/org/apache/bcel/generic/ConversionInstruction.java +++ b/src/java/org/apache/bcel/generic/ConversionInstruction.java @@ -13,53 +13,64 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.Constants; + /** * Super class for the x2y family of instructions. * * @version $Id$ * @author M. Dahm */ -public abstract class ConversionInstruction extends Instruction - implements TypedInstruction, StackProducer, StackConsumer { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ConversionInstruction() {} +public abstract class ConversionInstruction extends Instruction implements TypedInstruction, + StackProducer, StackConsumer { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ConversionInstruction() { + } - /** - * @param opcode opcode of instruction - */ - protected ConversionInstruction(short opcode) { - super(opcode, (short)1); - } - /** @return type associated with the instruction - */ - public Type getType(ConstantPoolGen cp) { - switch(opcode) { - case Constants.D2I: case Constants.F2I: case Constants.L2I: - return Type.INT; - case Constants.D2F: case Constants.I2F: case Constants.L2F: - return Type.FLOAT; - case Constants.D2L: case Constants.F2L: case Constants.I2L: - return Type.LONG; - case Constants.F2D: case Constants.I2D: case Constants.L2D: - return Type.DOUBLE; - case Constants.I2B: - return Type.BYTE; - case Constants.I2C: - return Type.CHAR; - case Constants.I2S: - return Type.SHORT; - - default: // Never reached - throw new ClassGenException("Unknown type " + opcode); + /** + * @param opcode opcode of instruction + */ + protected ConversionInstruction(short opcode) { + super(opcode, (short) 1); } - } -} + + /** @return type associated with the instruction + */ + public Type getType( ConstantPoolGen cp ) { + switch (opcode) { + case Constants.D2I: + case Constants.F2I: + case Constants.L2I: + return Type.INT; + case Constants.D2F: + case Constants.I2F: + case Constants.L2F: + return Type.FLOAT; + case Constants.D2L: + case Constants.F2L: + case Constants.I2L: + return Type.LONG; + case Constants.F2D: + case Constants.I2D: + case Constants.L2D: + return Type.DOUBLE; + case Constants.I2B: + return Type.BYTE; + case Constants.I2C: + return Type.CHAR; + case Constants.I2S: + return Type.SHORT; + default: // Never reached + throw new ClassGenException("Unknown type " + opcode); + } + } +} diff --git a/src/java/org/apache/bcel/generic/D2F.java b/src/java/org/apache/bcel/generic/D2F.java index 163935db..30d69df6 100644 --- a/src/java/org/apache/bcel/generic/D2F.java +++ b/src/java/org/apache/bcel/generic/D2F.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * D2F - Convert double to float *
            Stack: ..., value.word1, value.word2 -> ..., result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class D2F extends ConversionInstruction { - /** Convert double to float - */ - public D2F() { - super(org.apache.bcel.Constants.D2F); - } + + /** Convert double to float + */ + public D2F() { + super(org.apache.bcel.Constants.D2F); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitD2F(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitD2F(this); + } } diff --git a/src/java/org/apache/bcel/generic/D2I.java b/src/java/org/apache/bcel/generic/D2I.java index 3c513191..041b4b3a 100644 --- a/src/java/org/apache/bcel/generic/D2I.java +++ b/src/java/org/apache/bcel/generic/D2I.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * D2I - Convert double to int *
            Stack: ..., value.word1, value.word2 -> ..., result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class D2I extends ConversionInstruction { - /** Convert double to int - */ - public D2I() { - super(org.apache.bcel.Constants.D2I); - } + + /** Convert double to int + */ + public D2I() { + super(org.apache.bcel.Constants.D2I); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitD2I(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitD2I(this); + } } diff --git a/src/java/org/apache/bcel/generic/D2L.java b/src/java/org/apache/bcel/generic/D2L.java index e98620a2..240f4689 100644 --- a/src/java/org/apache/bcel/generic/D2L.java +++ b/src/java/org/apache/bcel/generic/D2L.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * D2L - Convert double to long *
            Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class D2L extends ConversionInstruction { - /** Convert double to long - */ - public D2L() { - super(org.apache.bcel.Constants.D2L); - } + + /** Convert double to long + */ + public D2L() { + super(org.apache.bcel.Constants.D2L); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitD2L(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitD2L(this); + } } diff --git a/src/java/org/apache/bcel/generic/DADD.java b/src/java/org/apache/bcel/generic/DADD.java index 8bd67a45..0a333291 100644 --- a/src/java/org/apache/bcel/generic/DADD.java +++ b/src/java/org/apache/bcel/generic/DADD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DADD - Add doubles *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -26,26 +25,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DADD extends ArithmeticInstruction { - /** Add doubles - */ - public DADD() { - super(org.apache.bcel.Constants.DADD); - } + + /** Add doubles + */ + public DADD() { + super(org.apache.bcel.Constants.DADD); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitDADD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitDADD(this); + } } diff --git a/src/java/org/apache/bcel/generic/DALOAD.java b/src/java/org/apache/bcel/generic/DALOAD.java index c1a58aae..27673453 100644 --- a/src/java/org/apache/bcel/generic/DALOAD.java +++ b/src/java/org/apache/bcel/generic/DALOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DALOAD - Load double from array *
            Stack: ..., arrayref, index -> ..., result.word1, result.word2
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DALOAD extends ArrayInstruction implements StackProducer { - /** Load double from array - */ - public DALOAD() { - super(org.apache.bcel.Constants.DALOAD); - } + + /** Load double from array + */ + public DALOAD() { + super(org.apache.bcel.Constants.DALOAD); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitDALOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitDALOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/DASTORE.java b/src/java/org/apache/bcel/generic/DASTORE.java index 8ea5b936..5780079a 100644 --- a/src/java/org/apache/bcel/generic/DASTORE.java +++ b/src/java/org/apache/bcel/generic/DASTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DASTORE - Store into double array *
            Stack: ..., arrayref, index, value.word1, value.word2 -> ...
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DASTORE extends ArrayInstruction implements StackConsumer { - /** Store double into array - */ - public DASTORE() { - super(org.apache.bcel.Constants.DASTORE); - } + + /** Store double into array + */ + public DASTORE() { + super(org.apache.bcel.Constants.DASTORE); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitDASTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitDASTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/DCMPG.java b/src/java/org/apache/bcel/generic/DCMPG.java index 351d1bf9..95af1841 100644 --- a/src/java/org/apache/bcel/generic/DCMPG.java +++ b/src/java/org/apache/bcel/generic/DCMPG.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DCMPG - Compare doubles: value1 > value2 *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -25,32 +24,32 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class DCMPG extends Instruction - implements TypedInstruction, StackProducer, StackConsumer { +public class DCMPG extends Instruction implements TypedInstruction, StackProducer, StackConsumer { + + public DCMPG() { + super(org.apache.bcel.Constants.DCMPG, (short) 1); + } - public DCMPG() { - super(org.apache.bcel.Constants.DCMPG, (short)1); - } - /** @return Type.DOUBLE - */ - public Type getType(ConstantPoolGen cp) { - return Type.DOUBLE; - } + /** @return Type.DOUBLE + */ + public Type getType( ConstantPoolGen cp ) { + return Type.DOUBLE; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitDCMPG(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitDCMPG(this); + } } diff --git a/src/java/org/apache/bcel/generic/DCMPL.java b/src/java/org/apache/bcel/generic/DCMPL.java index 7c3f7424..df5030da 100644 --- a/src/java/org/apache/bcel/generic/DCMPL.java +++ b/src/java/org/apache/bcel/generic/DCMPL.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DCMPL - Compare doubles: value1 < value2 *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -25,31 +24,32 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class DCMPL extends Instruction - implements TypedInstruction, StackProducer, StackConsumer { - public DCMPL() { - super(org.apache.bcel.Constants.DCMPL, (short)1); - } +public class DCMPL extends Instruction implements TypedInstruction, StackProducer, StackConsumer { + + public DCMPL() { + super(org.apache.bcel.Constants.DCMPL, (short) 1); + } + - /** @return Type.DOUBLE - */ - public Type getType(ConstantPoolGen cp) { - return Type.DOUBLE; - } + /** @return Type.DOUBLE + */ + public Type getType( ConstantPoolGen cp ) { + return Type.DOUBLE; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitDCMPL(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitDCMPL(this); + } } diff --git a/src/java/org/apache/bcel/generic/DCONST.java b/src/java/org/apache/bcel/generic/DCONST.java index 81aa49d3..e7a462b0 100644 --- a/src/java/org/apache/bcel/generic/DCONST.java +++ b/src/java/org/apache/bcel/generic/DCONST.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DCONST - Push 0.0 or 1.0, other values cause an exception * @@ -25,50 +24,57 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class DCONST extends Instruction - implements ConstantPushInstruction, TypedInstruction { - private double value; +public class DCONST extends Instruction implements ConstantPushInstruction, TypedInstruction { + + private double value; + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + DCONST() { + } + - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - DCONST() {} + public DCONST(double f) { + super(org.apache.bcel.Constants.DCONST_0, (short) 1); + if (f == 0.0) { + opcode = org.apache.bcel.Constants.DCONST_0; + } else if (f == 1.0) { + opcode = org.apache.bcel.Constants.DCONST_1; + } else { + throw new ClassGenException("DCONST can be used only for 0.0 and 1.0: " + f); + } + value = f; + } - public DCONST(double f) { - super(org.apache.bcel.Constants.DCONST_0, (short)1); - if(f == 0.0) - opcode = org.apache.bcel.Constants.DCONST_0; - else if(f == 1.0) - opcode = org.apache.bcel.Constants.DCONST_1; - else - throw new ClassGenException("DCONST can be used only for 0.0 and 1.0: " + f); + public Number getValue() { + return new Double(value); + } - value = f; - } - public Number getValue() { return new Double(value); } + /** @return Type.DOUBLE + */ + public Type getType( ConstantPoolGen cp ) { + return Type.DOUBLE; + } - /** @return Type.DOUBLE - */ - public Type getType(ConstantPoolGen cp) { - return Type.DOUBLE; - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitPushInstruction(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitConstantPushInstruction(this); - v.visitDCONST(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitPushInstruction(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitConstantPushInstruction(this); + v.visitDCONST(this); + } } diff --git a/src/java/org/apache/bcel/generic/DDIV.java b/src/java/org/apache/bcel/generic/DDIV.java index cce0e683..ea991c1b 100644 --- a/src/java/org/apache/bcel/generic/DDIV.java +++ b/src/java/org/apache/bcel/generic/DDIV.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DDIV - Divide doubles *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -26,26 +25,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DDIV extends ArithmeticInstruction { - /** Divide doubles - */ - public DDIV() { - super(org.apache.bcel.Constants.DDIV); - } + + /** Divide doubles + */ + public DDIV() { + super(org.apache.bcel.Constants.DDIV); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitDDIV(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitDDIV(this); + } } diff --git a/src/java/org/apache/bcel/generic/DLOAD.java b/src/java/org/apache/bcel/generic/DLOAD.java index a2315c6a..f444d77f 100644 --- a/src/java/org/apache/bcel/generic/DLOAD.java +++ b/src/java/org/apache/bcel/generic/DLOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DLOAD - Load double from local variable *
            Stack ... -> ..., result.word1, result.word2
            @@ -25,31 +24,34 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DLOAD extends LoadInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - DLOAD() { - super(org.apache.bcel.Constants.DLOAD, org.apache.bcel.Constants.DLOAD_0); - } - /** Load double from local variable - * @param n index of local variable - */ - public DLOAD(int n) { - super(org.apache.bcel.Constants.DLOAD, org.apache.bcel.Constants.DLOAD_0, n); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + DLOAD() { + super(org.apache.bcel.Constants.DLOAD, org.apache.bcel.Constants.DLOAD_0); + } + + + /** Load double from local variable + * @param n index of local variable + */ + public DLOAD(int n) { + super(org.apache.bcel.Constants.DLOAD, org.apache.bcel.Constants.DLOAD_0, n); + } + - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - super.accept(v); - v.visitDLOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + super.accept(v); + v.visitDLOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/DMUL.java b/src/java/org/apache/bcel/generic/DMUL.java index f05a2c77..bb1d0208 100644 --- a/src/java/org/apache/bcel/generic/DMUL.java +++ b/src/java/org/apache/bcel/generic/DMUL.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DMUL - Multiply doubles *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -26,26 +25,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DMUL extends ArithmeticInstruction { - /** Multiply doubles - */ - public DMUL() { - super(org.apache.bcel.Constants.DMUL); - } + + /** Multiply doubles + */ + public DMUL() { + super(org.apache.bcel.Constants.DMUL); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitDMUL(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitDMUL(this); + } } diff --git a/src/java/org/apache/bcel/generic/DNEG.java b/src/java/org/apache/bcel/generic/DNEG.java index d41a81ea..05c2b531 100644 --- a/src/java/org/apache/bcel/generic/DNEG.java +++ b/src/java/org/apache/bcel/generic/DNEG.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DNEG - Negate double *
            Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DNEG extends ArithmeticInstruction { - public DNEG() { - super(org.apache.bcel.Constants.DNEG); - } + + public DNEG() { + super(org.apache.bcel.Constants.DNEG); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitDNEG(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitDNEG(this); + } } diff --git a/src/java/org/apache/bcel/generic/DREM.java b/src/java/org/apache/bcel/generic/DREM.java index cf481039..2b966a92 100644 --- a/src/java/org/apache/bcel/generic/DREM.java +++ b/src/java/org/apache/bcel/generic/DREM.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DREM - Remainder of doubles *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -26,26 +25,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DREM extends ArithmeticInstruction { - /** Remainder of doubles - */ - public DREM() { - super(org.apache.bcel.Constants.DREM); - } + + /** Remainder of doubles + */ + public DREM() { + super(org.apache.bcel.Constants.DREM); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitDREM(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitDREM(this); + } } diff --git a/src/java/org/apache/bcel/generic/DRETURN.java b/src/java/org/apache/bcel/generic/DRETURN.java index 0a9aad3d..2b2624c5 100644 --- a/src/java/org/apache/bcel/generic/DRETURN.java +++ b/src/java/org/apache/bcel/generic/DRETURN.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DRETURN - Return double from method *
            Stack: ..., value.word1, value.word2 -> <empty>
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DRETURN extends ReturnInstruction { - /** Return double from method - */ - public DRETURN() { - super(org.apache.bcel.Constants.DRETURN); - } + + /** Return double from method + */ + public DRETURN() { + super(org.apache.bcel.Constants.DRETURN); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitReturnInstruction(this); - v.visitDRETURN(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitReturnInstruction(this); + v.visitDRETURN(this); + } } diff --git a/src/java/org/apache/bcel/generic/DSTORE.java b/src/java/org/apache/bcel/generic/DSTORE.java index 4a00b64e..3f5750dc 100644 --- a/src/java/org/apache/bcel/generic/DSTORE.java +++ b/src/java/org/apache/bcel/generic/DSTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DSTORE - Store double into local variable *
            Stack: ..., value.word1, value.word2 -> ... 
            @@ -25,31 +24,34 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DSTORE extends StoreInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - DSTORE() { - super(org.apache.bcel.Constants.DSTORE, org.apache.bcel.Constants.DSTORE_0); - } - /** Store double into local variable - * @param n index of local variable - */ - public DSTORE(int n) { - super(org.apache.bcel.Constants.DSTORE, org.apache.bcel.Constants.DSTORE_0, n); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + DSTORE() { + super(org.apache.bcel.Constants.DSTORE, org.apache.bcel.Constants.DSTORE_0); + } + + + /** Store double into local variable + * @param n index of local variable + */ + public DSTORE(int n) { + super(org.apache.bcel.Constants.DSTORE, org.apache.bcel.Constants.DSTORE_0, n); + } + - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - super.accept(v); - v.visitDSTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + super.accept(v); + v.visitDSTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/DSUB.java b/src/java/org/apache/bcel/generic/DSUB.java index 38f7e184..4acde4d1 100644 --- a/src/java/org/apache/bcel/generic/DSUB.java +++ b/src/java/org/apache/bcel/generic/DSUB.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DSUB - Substract doubles *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -26,26 +25,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DSUB extends ArithmeticInstruction { - /** Substract doubles - */ - public DSUB() { - super(org.apache.bcel.Constants.DSUB); - } + + /** Substract doubles + */ + public DSUB() { + super(org.apache.bcel.Constants.DSUB); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitDSUB(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitDSUB(this); + } } diff --git a/src/java/org/apache/bcel/generic/DUP.java b/src/java/org/apache/bcel/generic/DUP.java index 5dd69125..4ab038c7 100644 --- a/src/java/org/apache/bcel/generic/DUP.java +++ b/src/java/org/apache/bcel/generic/DUP.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DUP - Duplicate top operand stack word *
            Stack: ..., word -> ..., word, word
            @@ -25,23 +24,24 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DUP extends StackInstruction implements PushInstruction { - public DUP() { - super(org.apache.bcel.Constants.DUP); - } + + public DUP() { + super(org.apache.bcel.Constants.DUP); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitStackInstruction(this); - v.visitDUP(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitStackInstruction(this); + v.visitDUP(this); + } } diff --git a/src/java/org/apache/bcel/generic/DUP2.java b/src/java/org/apache/bcel/generic/DUP2.java index 9021f5d3..a37c0b9e 100644 --- a/src/java/org/apache/bcel/generic/DUP2.java +++ b/src/java/org/apache/bcel/generic/DUP2.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DUP2 - Duplicate two top operand stack words *
            Stack: ..., word2, word1 -> ..., word2, word1, word2, word1
            @@ -25,23 +24,24 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DUP2 extends StackInstruction implements PushInstruction { - public DUP2() { - super(org.apache.bcel.Constants.DUP2); - } + + public DUP2() { + super(org.apache.bcel.Constants.DUP2); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitStackInstruction(this); - v.visitDUP2(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitStackInstruction(this); + v.visitDUP2(this); + } } diff --git a/src/java/org/apache/bcel/generic/DUP2_X1.java b/src/java/org/apache/bcel/generic/DUP2_X1.java index 790675b2..f6cdb335 100644 --- a/src/java/org/apache/bcel/generic/DUP2_X1.java +++ b/src/java/org/apache/bcel/generic/DUP2_X1.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DUP2_X1 - Duplicate two top operand stack words and put three down *
            Stack: ..., word3, word2, word1 -> ..., word2, word1, word3, word2, word1
            @@ -25,21 +24,22 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DUP2_X1 extends StackInstruction { - public DUP2_X1() { - super(org.apache.bcel.Constants.DUP2_X1); - } + + public DUP2_X1() { + super(org.apache.bcel.Constants.DUP2_X1); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackInstruction(this); - v.visitDUP2_X1(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackInstruction(this); + v.visitDUP2_X1(this); + } } diff --git a/src/java/org/apache/bcel/generic/DUP2_X2.java b/src/java/org/apache/bcel/generic/DUP2_X2.java index f96adda7..dc6d9b54 100644 --- a/src/java/org/apache/bcel/generic/DUP2_X2.java +++ b/src/java/org/apache/bcel/generic/DUP2_X2.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DUP2_X2 - Duplicate two top operand stack words and put four down *
            Stack: ..., word4, word3, word2, word1 -> ..., word2, word1, word4, word3, word2, word1
            @@ -25,21 +24,22 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DUP2_X2 extends StackInstruction { - public DUP2_X2() { - super(org.apache.bcel.Constants.DUP2_X2); - } + + public DUP2_X2() { + super(org.apache.bcel.Constants.DUP2_X2); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackInstruction(this); - v.visitDUP2_X2(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackInstruction(this); + v.visitDUP2_X2(this); + } } diff --git a/src/java/org/apache/bcel/generic/DUP_X1.java b/src/java/org/apache/bcel/generic/DUP_X1.java index c5d31d3f..60b6a773 100644 --- a/src/java/org/apache/bcel/generic/DUP_X1.java +++ b/src/java/org/apache/bcel/generic/DUP_X1.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DUP_X1 - Duplicate top operand stack word and put two down *
            Stack: ..., word2, word1 -> ..., word1, word2, word1
            @@ -25,21 +24,22 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DUP_X1 extends StackInstruction { - public DUP_X1() { - super(org.apache.bcel.Constants.DUP_X1); - } + + public DUP_X1() { + super(org.apache.bcel.Constants.DUP_X1); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackInstruction(this); - v.visitDUP_X1(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackInstruction(this); + v.visitDUP_X1(this); + } } diff --git a/src/java/org/apache/bcel/generic/DUP_X2.java b/src/java/org/apache/bcel/generic/DUP_X2.java index 7c1e6915..e2f46769 100644 --- a/src/java/org/apache/bcel/generic/DUP_X2.java +++ b/src/java/org/apache/bcel/generic/DUP_X2.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * DUP_X2 - Duplicate top operand stack word and put three down *
            Stack: ..., word3, word2, word1 -> ..., word1, word3, word2, word1
            @@ -25,21 +24,22 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class DUP_X2 extends StackInstruction { - public DUP_X2() { - super(org.apache.bcel.Constants.DUP_X2); - } + + public DUP_X2() { + super(org.apache.bcel.Constants.DUP_X2); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackInstruction(this); - v.visitDUP_X2(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackInstruction(this); + v.visitDUP_X2(this); + } } diff --git a/src/java/org/apache/bcel/generic/EmptyVisitor.java b/src/java/org/apache/bcel/generic/EmptyVisitor.java index 2862348f..2bce6d7f 100644 --- a/src/java/org/apache/bcel/generic/EmptyVisitor.java +++ b/src/java/org/apache/bcel/generic/EmptyVisitor.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Supplies empty method bodies to be overridden by subclasses. * @@ -24,184 +23,723 @@ package org.apache.bcel.generic; * @author M. Dahm */ public abstract class EmptyVisitor implements Visitor { - public void visitStackInstruction(StackInstruction obj) { } - public void visitLocalVariableInstruction(LocalVariableInstruction obj) { } - public void visitBranchInstruction(BranchInstruction obj) { } - public void visitLoadClass(LoadClass obj) { } - public void visitFieldInstruction(FieldInstruction obj) { } - public void visitIfInstruction(IfInstruction obj) { } - public void visitConversionInstruction(ConversionInstruction obj) { } - public void visitPopInstruction(PopInstruction obj) { } - public void visitJsrInstruction(JsrInstruction obj) { } - public void visitGotoInstruction(GotoInstruction obj) { } - public void visitStoreInstruction(StoreInstruction obj) { } - public void visitTypedInstruction(TypedInstruction obj) { } - public void visitSelect(Select obj) { } - public void visitUnconditionalBranch(UnconditionalBranch obj) { } - public void visitPushInstruction(PushInstruction obj) { } - public void visitArithmeticInstruction(ArithmeticInstruction obj) { } - public void visitCPInstruction(CPInstruction obj) { } - public void visitInvokeInstruction(InvokeInstruction obj) { } - public void visitArrayInstruction(ArrayInstruction obj) { } - public void visitAllocationInstruction(AllocationInstruction obj) { } - public void visitReturnInstruction(ReturnInstruction obj) { } - public void visitFieldOrMethod(FieldOrMethod obj) { } - public void visitConstantPushInstruction(ConstantPushInstruction obj) { } - public void visitExceptionThrower(ExceptionThrower obj) { } - public void visitLoadInstruction(LoadInstruction obj) { } - public void visitVariableLengthInstruction(VariableLengthInstruction obj) { } - public void visitStackProducer(StackProducer obj) { } - public void visitStackConsumer(StackConsumer obj) { } - public void visitACONST_NULL(ACONST_NULL obj) { } - public void visitGETSTATIC(GETSTATIC obj) { } - public void visitIF_ICMPLT(IF_ICMPLT obj) { } - public void visitMONITOREXIT(MONITOREXIT obj) { } - public void visitIFLT(IFLT obj) { } - public void visitLSTORE(LSTORE obj) { } - public void visitPOP2(POP2 obj) { } - public void visitBASTORE(BASTORE obj) { } - public void visitISTORE(ISTORE obj) { } - public void visitCHECKCAST(CHECKCAST obj) { } - public void visitFCMPG(FCMPG obj) { } - public void visitI2F(I2F obj) { } - public void visitATHROW(ATHROW obj) { } - public void visitDCMPL(DCMPL obj) { } - public void visitARRAYLENGTH(ARRAYLENGTH obj) { } - public void visitDUP(DUP obj) { } - public void visitINVOKESTATIC(INVOKESTATIC obj) { } - public void visitLCONST(LCONST obj) { } - public void visitDREM(DREM obj) { } - public void visitIFGE(IFGE obj) { } - public void visitCALOAD(CALOAD obj) { } - public void visitLASTORE(LASTORE obj) { } - public void visitI2D(I2D obj) { } - public void visitDADD(DADD obj) { } - public void visitINVOKESPECIAL(INVOKESPECIAL obj) { } - public void visitIAND(IAND obj) { } - public void visitPUTFIELD(PUTFIELD obj) { } - public void visitILOAD(ILOAD obj) { } - public void visitDLOAD(DLOAD obj) { } - public void visitDCONST(DCONST obj) { } - public void visitNEW(NEW obj) { } - public void visitIFNULL(IFNULL obj) { } - public void visitLSUB(LSUB obj) { } - public void visitL2I(L2I obj) { } - public void visitISHR(ISHR obj) { } - public void visitTABLESWITCH(TABLESWITCH obj) { } - public void visitIINC(IINC obj) { } - public void visitDRETURN(DRETURN obj) { } - public void visitFSTORE(FSTORE obj) { } - public void visitDASTORE(DASTORE obj) { } - public void visitIALOAD(IALOAD obj) { } - public void visitDDIV(DDIV obj) { } - public void visitIF_ICMPGE(IF_ICMPGE obj) { } - public void visitLAND(LAND obj) { } - public void visitIDIV(IDIV obj) { } - public void visitLOR(LOR obj) { } - public void visitCASTORE(CASTORE obj) { } - public void visitFREM(FREM obj) { } - public void visitLDC(LDC obj) { } - public void visitBIPUSH(BIPUSH obj) { } - public void visitDSTORE(DSTORE obj) { } - public void visitF2L(F2L obj) { } - public void visitFMUL(FMUL obj) { } - public void visitLLOAD(LLOAD obj) { } - public void visitJSR(JSR obj) { } - public void visitFSUB(FSUB obj) { } - public void visitSASTORE(SASTORE obj) { } - public void visitALOAD(ALOAD obj) { } - public void visitDUP2_X2(DUP2_X2 obj) { } - public void visitRETURN(RETURN obj) { } - public void visitDALOAD(DALOAD obj) { } - public void visitSIPUSH(SIPUSH obj) { } - public void visitDSUB(DSUB obj) { } - public void visitL2F(L2F obj) { } - public void visitIF_ICMPGT(IF_ICMPGT obj) { } - public void visitF2D(F2D obj) { } - public void visitI2L(I2L obj) { } - public void visitIF_ACMPNE(IF_ACMPNE obj) { } - public void visitPOP(POP obj) { } - public void visitI2S(I2S obj) { } - public void visitIFEQ(IFEQ obj) { } - public void visitSWAP(SWAP obj) { } - public void visitIOR(IOR obj) { } - public void visitIREM(IREM obj) { } - public void visitIASTORE(IASTORE obj) { } - public void visitNEWARRAY(NEWARRAY obj) { } - public void visitINVOKEINTERFACE(INVOKEINTERFACE obj) { } - public void visitINEG(INEG obj) { } - public void visitLCMP(LCMP obj) { } - public void visitJSR_W(JSR_W obj) { } - public void visitMULTIANEWARRAY(MULTIANEWARRAY obj) { } - public void visitDUP_X2(DUP_X2 obj) { } - public void visitSALOAD(SALOAD obj) { } - public void visitIFNONNULL(IFNONNULL obj) { } - public void visitDMUL(DMUL obj) { } - public void visitIFNE(IFNE obj) { } - public void visitIF_ICMPLE(IF_ICMPLE obj) { } - public void visitLDC2_W(LDC2_W obj) { } - public void visitGETFIELD(GETFIELD obj) { } - public void visitLADD(LADD obj) { } - public void visitNOP(NOP obj) { } - public void visitFALOAD(FALOAD obj) { } - public void visitINSTANCEOF(INSTANCEOF obj) { } - public void visitIFLE(IFLE obj) { } - public void visitLXOR(LXOR obj) { } - public void visitLRETURN(LRETURN obj) { } - public void visitFCONST(FCONST obj) { } - public void visitIUSHR(IUSHR obj) { } - public void visitBALOAD(BALOAD obj) { } - public void visitDUP2(DUP2 obj) { } - public void visitIF_ACMPEQ(IF_ACMPEQ obj) { } - public void visitIMPDEP1(IMPDEP1 obj) { } - public void visitMONITORENTER(MONITORENTER obj) { } - public void visitLSHL(LSHL obj) { } - public void visitDCMPG(DCMPG obj) { } - public void visitD2L(D2L obj) { } - public void visitIMPDEP2(IMPDEP2 obj) { } - public void visitL2D(L2D obj) { } - public void visitRET(RET obj) { } - public void visitIFGT(IFGT obj) { } - public void visitIXOR(IXOR obj) { } - public void visitINVOKEVIRTUAL(INVOKEVIRTUAL obj) { } - public void visitFASTORE(FASTORE obj) { } - public void visitIRETURN(IRETURN obj) { } - public void visitIF_ICMPNE(IF_ICMPNE obj) { } - public void visitFLOAD(FLOAD obj) { } - public void visitLDIV(LDIV obj) { } - public void visitPUTSTATIC(PUTSTATIC obj) { } - public void visitAALOAD(AALOAD obj) { } - public void visitD2I(D2I obj) { } - public void visitIF_ICMPEQ(IF_ICMPEQ obj) { } - public void visitAASTORE(AASTORE obj) { } - public void visitARETURN(ARETURN obj) { } - public void visitDUP2_X1(DUP2_X1 obj) { } - public void visitFNEG(FNEG obj) { } - public void visitGOTO_W(GOTO_W obj) { } - public void visitD2F(D2F obj) { } - public void visitGOTO(GOTO obj) { } - public void visitISUB(ISUB obj) { } - public void visitF2I(F2I obj) { } - public void visitDNEG(DNEG obj) { } - public void visitICONST(ICONST obj) { } - public void visitFDIV(FDIV obj) { } - public void visitI2B(I2B obj) { } - public void visitLNEG(LNEG obj) { } - public void visitLREM(LREM obj) { } - public void visitIMUL(IMUL obj) { } - public void visitIADD(IADD obj) { } - public void visitLSHR(LSHR obj) { } - public void visitLOOKUPSWITCH(LOOKUPSWITCH obj) { } - public void visitDUP_X1(DUP_X1 obj) { } - public void visitFCMPL(FCMPL obj) { } - public void visitI2C(I2C obj) { } - public void visitLMUL(LMUL obj) { } - public void visitLUSHR(LUSHR obj) { } - public void visitISHL(ISHL obj) { } - public void visitLALOAD(LALOAD obj) { } - public void visitASTORE(ASTORE obj) { } - public void visitANEWARRAY(ANEWARRAY obj) { } - public void visitFRETURN(FRETURN obj) { } - public void visitFADD(FADD obj) { } - public void visitBREAKPOINT(BREAKPOINT obj) { } + + public void visitStackInstruction( StackInstruction obj ) { + } + + + public void visitLocalVariableInstruction( LocalVariableInstruction obj ) { + } + + + public void visitBranchInstruction( BranchInstruction obj ) { + } + + + public void visitLoadClass( LoadClass obj ) { + } + + + public void visitFieldInstruction( FieldInstruction obj ) { + } + + + public void visitIfInstruction( IfInstruction obj ) { + } + + + public void visitConversionInstruction( ConversionInstruction obj ) { + } + + + public void visitPopInstruction( PopInstruction obj ) { + } + + + public void visitJsrInstruction( JsrInstruction obj ) { + } + + + public void visitGotoInstruction( GotoInstruction obj ) { + } + + + public void visitStoreInstruction( StoreInstruction obj ) { + } + + + public void visitTypedInstruction( TypedInstruction obj ) { + } + + + public void visitSelect( Select obj ) { + } + + + public void visitUnconditionalBranch( UnconditionalBranch obj ) { + } + + + public void visitPushInstruction( PushInstruction obj ) { + } + + + public void visitArithmeticInstruction( ArithmeticInstruction obj ) { + } + + + public void visitCPInstruction( CPInstruction obj ) { + } + + + public void visitInvokeInstruction( InvokeInstruction obj ) { + } + + + public void visitArrayInstruction( ArrayInstruction obj ) { + } + + + public void visitAllocationInstruction( AllocationInstruction obj ) { + } + + + public void visitReturnInstruction( ReturnInstruction obj ) { + } + + + public void visitFieldOrMethod( FieldOrMethod obj ) { + } + + + public void visitConstantPushInstruction( ConstantPushInstruction obj ) { + } + + + public void visitExceptionThrower( ExceptionThrower obj ) { + } + + + public void visitLoadInstruction( LoadInstruction obj ) { + } + + + public void visitVariableLengthInstruction( VariableLengthInstruction obj ) { + } + + + public void visitStackProducer( StackProducer obj ) { + } + + + public void visitStackConsumer( StackConsumer obj ) { + } + + + public void visitACONST_NULL( ACONST_NULL obj ) { + } + + + public void visitGETSTATIC( GETSTATIC obj ) { + } + + + public void visitIF_ICMPLT( IF_ICMPLT obj ) { + } + + + public void visitMONITOREXIT( MONITOREXIT obj ) { + } + + + public void visitIFLT( IFLT obj ) { + } + + + public void visitLSTORE( LSTORE obj ) { + } + + + public void visitPOP2( POP2 obj ) { + } + + + public void visitBASTORE( BASTORE obj ) { + } + + + public void visitISTORE( ISTORE obj ) { + } + + + public void visitCHECKCAST( CHECKCAST obj ) { + } + + + public void visitFCMPG( FCMPG obj ) { + } + + + public void visitI2F( I2F obj ) { + } + + + public void visitATHROW( ATHROW obj ) { + } + + + public void visitDCMPL( DCMPL obj ) { + } + + + public void visitARRAYLENGTH( ARRAYLENGTH obj ) { + } + + + public void visitDUP( DUP obj ) { + } + + + public void visitINVOKESTATIC( INVOKESTATIC obj ) { + } + + + public void visitLCONST( LCONST obj ) { + } + + + public void visitDREM( DREM obj ) { + } + + + public void visitIFGE( IFGE obj ) { + } + + + public void visitCALOAD( CALOAD obj ) { + } + + + public void visitLASTORE( LASTORE obj ) { + } + + + public void visitI2D( I2D obj ) { + } + + + public void visitDADD( DADD obj ) { + } + + + public void visitINVOKESPECIAL( INVOKESPECIAL obj ) { + } + + + public void visitIAND( IAND obj ) { + } + + + public void visitPUTFIELD( PUTFIELD obj ) { + } + + + public void visitILOAD( ILOAD obj ) { + } + + + public void visitDLOAD( DLOAD obj ) { + } + + + public void visitDCONST( DCONST obj ) { + } + + + public void visitNEW( NEW obj ) { + } + + + public void visitIFNULL( IFNULL obj ) { + } + + + public void visitLSUB( LSUB obj ) { + } + + + public void visitL2I( L2I obj ) { + } + + + public void visitISHR( ISHR obj ) { + } + + + public void visitTABLESWITCH( TABLESWITCH obj ) { + } + + + public void visitIINC( IINC obj ) { + } + + + public void visitDRETURN( DRETURN obj ) { + } + + + public void visitFSTORE( FSTORE obj ) { + } + + + public void visitDASTORE( DASTORE obj ) { + } + + + public void visitIALOAD( IALOAD obj ) { + } + + + public void visitDDIV( DDIV obj ) { + } + + + public void visitIF_ICMPGE( IF_ICMPGE obj ) { + } + + + public void visitLAND( LAND obj ) { + } + + + public void visitIDIV( IDIV obj ) { + } + + + public void visitLOR( LOR obj ) { + } + + + public void visitCASTORE( CASTORE obj ) { + } + + + public void visitFREM( FREM obj ) { + } + + + public void visitLDC( LDC obj ) { + } + + + public void visitBIPUSH( BIPUSH obj ) { + } + + + public void visitDSTORE( DSTORE obj ) { + } + + + public void visitF2L( F2L obj ) { + } + + + public void visitFMUL( FMUL obj ) { + } + + + public void visitLLOAD( LLOAD obj ) { + } + + + public void visitJSR( JSR obj ) { + } + + + public void visitFSUB( FSUB obj ) { + } + + + public void visitSASTORE( SASTORE obj ) { + } + + + public void visitALOAD( ALOAD obj ) { + } + + + public void visitDUP2_X2( DUP2_X2 obj ) { + } + + + public void visitRETURN( RETURN obj ) { + } + + + public void visitDALOAD( DALOAD obj ) { + } + + + public void visitSIPUSH( SIPUSH obj ) { + } + + + public void visitDSUB( DSUB obj ) { + } + + + public void visitL2F( L2F obj ) { + } + + + public void visitIF_ICMPGT( IF_ICMPGT obj ) { + } + + + public void visitF2D( F2D obj ) { + } + + + public void visitI2L( I2L obj ) { + } + + + public void visitIF_ACMPNE( IF_ACMPNE obj ) { + } + + + public void visitPOP( POP obj ) { + } + + + public void visitI2S( I2S obj ) { + } + + + public void visitIFEQ( IFEQ obj ) { + } + + + public void visitSWAP( SWAP obj ) { + } + + + public void visitIOR( IOR obj ) { + } + + + public void visitIREM( IREM obj ) { + } + + + public void visitIASTORE( IASTORE obj ) { + } + + + public void visitNEWARRAY( NEWARRAY obj ) { + } + + + public void visitINVOKEINTERFACE( INVOKEINTERFACE obj ) { + } + + + public void visitINEG( INEG obj ) { + } + + + public void visitLCMP( LCMP obj ) { + } + + + public void visitJSR_W( JSR_W obj ) { + } + + + public void visitMULTIANEWARRAY( MULTIANEWARRAY obj ) { + } + + + public void visitDUP_X2( DUP_X2 obj ) { + } + + + public void visitSALOAD( SALOAD obj ) { + } + + + public void visitIFNONNULL( IFNONNULL obj ) { + } + + + public void visitDMUL( DMUL obj ) { + } + + + public void visitIFNE( IFNE obj ) { + } + + + public void visitIF_ICMPLE( IF_ICMPLE obj ) { + } + + + public void visitLDC2_W( LDC2_W obj ) { + } + + + public void visitGETFIELD( GETFIELD obj ) { + } + + + public void visitLADD( LADD obj ) { + } + + + public void visitNOP( NOP obj ) { + } + + + public void visitFALOAD( FALOAD obj ) { + } + + + public void visitINSTANCEOF( INSTANCEOF obj ) { + } + + + public void visitIFLE( IFLE obj ) { + } + + + public void visitLXOR( LXOR obj ) { + } + + + public void visitLRETURN( LRETURN obj ) { + } + + + public void visitFCONST( FCONST obj ) { + } + + + public void visitIUSHR( IUSHR obj ) { + } + + + public void visitBALOAD( BALOAD obj ) { + } + + + public void visitDUP2( DUP2 obj ) { + } + + + public void visitIF_ACMPEQ( IF_ACMPEQ obj ) { + } + + + public void visitIMPDEP1( IMPDEP1 obj ) { + } + + + public void visitMONITORENTER( MONITORENTER obj ) { + } + + + public void visitLSHL( LSHL obj ) { + } + + + public void visitDCMPG( DCMPG obj ) { + } + + + public void visitD2L( D2L obj ) { + } + + + public void visitIMPDEP2( IMPDEP2 obj ) { + } + + + public void visitL2D( L2D obj ) { + } + + + public void visitRET( RET obj ) { + } + + + public void visitIFGT( IFGT obj ) { + } + + + public void visitIXOR( IXOR obj ) { + } + + + public void visitINVOKEVIRTUAL( INVOKEVIRTUAL obj ) { + } + + + public void visitFASTORE( FASTORE obj ) { + } + + + public void visitIRETURN( IRETURN obj ) { + } + + + public void visitIF_ICMPNE( IF_ICMPNE obj ) { + } + + + public void visitFLOAD( FLOAD obj ) { + } + + + public void visitLDIV( LDIV obj ) { + } + + + public void visitPUTSTATIC( PUTSTATIC obj ) { + } + + + public void visitAALOAD( AALOAD obj ) { + } + + + public void visitD2I( D2I obj ) { + } + + + public void visitIF_ICMPEQ( IF_ICMPEQ obj ) { + } + + + public void visitAASTORE( AASTORE obj ) { + } + + + public void visitARETURN( ARETURN obj ) { + } + + + public void visitDUP2_X1( DUP2_X1 obj ) { + } + + + public void visitFNEG( FNEG obj ) { + } + + + public void visitGOTO_W( GOTO_W obj ) { + } + + + public void visitD2F( D2F obj ) { + } + + + public void visitGOTO( GOTO obj ) { + } + + + public void visitISUB( ISUB obj ) { + } + + + public void visitF2I( F2I obj ) { + } + + + public void visitDNEG( DNEG obj ) { + } + + + public void visitICONST( ICONST obj ) { + } + + + public void visitFDIV( FDIV obj ) { + } + + + public void visitI2B( I2B obj ) { + } + + + public void visitLNEG( LNEG obj ) { + } + + + public void visitLREM( LREM obj ) { + } + + + public void visitIMUL( IMUL obj ) { + } + + + public void visitIADD( IADD obj ) { + } + + + public void visitLSHR( LSHR obj ) { + } + + + public void visitLOOKUPSWITCH( LOOKUPSWITCH obj ) { + } + + + public void visitDUP_X1( DUP_X1 obj ) { + } + + + public void visitFCMPL( FCMPL obj ) { + } + + + public void visitI2C( I2C obj ) { + } + + + public void visitLMUL( LMUL obj ) { + } + + + public void visitLUSHR( LUSHR obj ) { + } + + + public void visitISHL( ISHL obj ) { + } + + + public void visitLALOAD( LALOAD obj ) { + } + + + public void visitASTORE( ASTORE obj ) { + } + + + public void visitANEWARRAY( ANEWARRAY obj ) { + } + + + public void visitFRETURN( FRETURN obj ) { + } + + + public void visitFADD( FADD obj ) { + } + + + public void visitBREAKPOINT( BREAKPOINT obj ) { + } } diff --git a/src/java/org/apache/bcel/generic/ExceptionThrower.java b/src/java/org/apache/bcel/generic/ExceptionThrower.java index 93335939..c0071f52 100644 --- a/src/java/org/apache/bcel/generic/ExceptionThrower.java +++ b/src/java/org/apache/bcel/generic/ExceptionThrower.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denote an instruction that may throw a run-time or a linking * exception (or both) during execution. This is not quite the truth @@ -38,5 +37,6 @@ package org.apache.bcel.generic; * @author Enver Haase */ public interface ExceptionThrower { - public java.lang.Class[] getExceptions(); + + public java.lang.Class[] getExceptions(); } diff --git a/src/java/org/apache/bcel/generic/F2D.java b/src/java/org/apache/bcel/generic/F2D.java index 86a53b4a..e3af2452 100644 --- a/src/java/org/apache/bcel/generic/F2D.java +++ b/src/java/org/apache/bcel/generic/F2D.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * F2D - Convert float to double *
            Stack: ..., value -> ..., result.word1, result.word2
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class F2D extends ConversionInstruction { - /** Convert float to double - */ - public F2D() { - super(org.apache.bcel.Constants.F2D); - } + + /** Convert float to double + */ + public F2D() { + super(org.apache.bcel.Constants.F2D); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitF2D(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitF2D(this); + } } diff --git a/src/java/org/apache/bcel/generic/F2I.java b/src/java/org/apache/bcel/generic/F2I.java index 3994423f..42061dcf 100644 --- a/src/java/org/apache/bcel/generic/F2I.java +++ b/src/java/org/apache/bcel/generic/F2I.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * F2I - Convert float to int *
            Stack: ..., value -> ..., result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class F2I extends ConversionInstruction { - /** Convert float to int - */ - public F2I() { - super(org.apache.bcel.Constants.F2I); - } + + /** Convert float to int + */ + public F2I() { + super(org.apache.bcel.Constants.F2I); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitF2I(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitF2I(this); + } } diff --git a/src/java/org/apache/bcel/generic/F2L.java b/src/java/org/apache/bcel/generic/F2L.java index 622a984d..fb66f9a6 100644 --- a/src/java/org/apache/bcel/generic/F2L.java +++ b/src/java/org/apache/bcel/generic/F2L.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * F2L - Convert float to long *
            Stack: ..., value -> ..., result.word1, result.word2
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class F2L extends ConversionInstruction { - /** Convert float to long - */ - public F2L() { - super(org.apache.bcel.Constants.F2L); - } + + /** Convert float to long + */ + public F2L() { + super(org.apache.bcel.Constants.F2L); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitF2L(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitF2L(this); + } } diff --git a/src/java/org/apache/bcel/generic/FADD.java b/src/java/org/apache/bcel/generic/FADD.java index 1dea9e4d..0029d227 100644 --- a/src/java/org/apache/bcel/generic/FADD.java +++ b/src/java/org/apache/bcel/generic/FADD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FADD - Add floats *
            Stack: ..., value1, value2 -> result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class FADD extends ArithmeticInstruction { - /** Add floats - */ - public FADD() { - super(org.apache.bcel.Constants.FADD); - } + + /** Add floats + */ + public FADD() { + super(org.apache.bcel.Constants.FADD); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitFADD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitFADD(this); + } } diff --git a/src/java/org/apache/bcel/generic/FALOAD.java b/src/java/org/apache/bcel/generic/FALOAD.java index e845cdcd..62fc7ea5 100644 --- a/src/java/org/apache/bcel/generic/FALOAD.java +++ b/src/java/org/apache/bcel/generic/FALOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FALOAD - Load float from array *
            Stack: ..., arrayref, index -> ..., value
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class FALOAD extends ArrayInstruction implements StackProducer { - /** Load float from array - */ - public FALOAD() { - super(org.apache.bcel.Constants.FALOAD); - } + + /** Load float from array + */ + public FALOAD() { + super(org.apache.bcel.Constants.FALOAD); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitFALOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitFALOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/FASTORE.java b/src/java/org/apache/bcel/generic/FASTORE.java index d9406040..1d9af2f2 100644 --- a/src/java/org/apache/bcel/generic/FASTORE.java +++ b/src/java/org/apache/bcel/generic/FASTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FASTORE - Store into float array *
            Stack: ..., arrayref, index, value -> ...
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class FASTORE extends ArrayInstruction implements StackConsumer { - /** Store float into array - */ - public FASTORE() { - super(org.apache.bcel.Constants.FASTORE); - } + + /** Store float into array + */ + public FASTORE() { + super(org.apache.bcel.Constants.FASTORE); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitFASTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitFASTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/FCMPG.java b/src/java/org/apache/bcel/generic/FCMPG.java index d090d8e2..ed2cff11 100644 --- a/src/java/org/apache/bcel/generic/FCMPG.java +++ b/src/java/org/apache/bcel/generic/FCMPG.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FCMPG - Compare floats: value1 > value2 *
            Stack: ..., value1, value2 -> ..., result
            @@ -24,31 +23,32 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class FCMPG extends Instruction - implements TypedInstruction, StackProducer, StackConsumer { - public FCMPG() { - super(org.apache.bcel.Constants.FCMPG, (short)1); - } +public class FCMPG extends Instruction implements TypedInstruction, StackProducer, StackConsumer { + + public FCMPG() { + super(org.apache.bcel.Constants.FCMPG, (short) 1); + } + - /** @return Type.FLOAT - */ - public Type getType(ConstantPoolGen cp) { - return Type.FLOAT; - } + /** @return Type.FLOAT + */ + public Type getType( ConstantPoolGen cp ) { + return Type.FLOAT; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitFCMPG(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitFCMPG(this); + } } diff --git a/src/java/org/apache/bcel/generic/FCMPL.java b/src/java/org/apache/bcel/generic/FCMPL.java index 1632d420..09902d6d 100644 --- a/src/java/org/apache/bcel/generic/FCMPL.java +++ b/src/java/org/apache/bcel/generic/FCMPL.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FCMPL - Compare floats: value1 < value2 *
            Stack: ..., value1, value2 -> ..., result
            @@ -24,31 +23,32 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class FCMPL extends Instruction - implements TypedInstruction, StackProducer, StackConsumer { - public FCMPL() { - super(org.apache.bcel.Constants.FCMPL, (short)1); - } +public class FCMPL extends Instruction implements TypedInstruction, StackProducer, StackConsumer { + + public FCMPL() { + super(org.apache.bcel.Constants.FCMPL, (short) 1); + } + - /** @return Type.FLOAT - */ - public Type getType(ConstantPoolGen cp) { - return Type.FLOAT; - } + /** @return Type.FLOAT + */ + public Type getType( ConstantPoolGen cp ) { + return Type.FLOAT; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitFCMPL(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitFCMPL(this); + } } diff --git a/src/java/org/apache/bcel/generic/FCONST.java b/src/java/org/apache/bcel/generic/FCONST.java index c7a49bbe..e81d23d5 100644 --- a/src/java/org/apache/bcel/generic/FCONST.java +++ b/src/java/org/apache/bcel/generic/FCONST.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FCONST - Push 0.0, 1.0 or 2.0, other values cause an exception * @@ -25,52 +24,59 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class FCONST extends Instruction - implements ConstantPushInstruction, TypedInstruction { - private float value; +public class FCONST extends Instruction implements ConstantPushInstruction, TypedInstruction { + + private float value; + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + FCONST() { + } + - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - FCONST() {} + public FCONST(float f) { + super(org.apache.bcel.Constants.FCONST_0, (short) 1); + if (f == 0.0) { + opcode = org.apache.bcel.Constants.FCONST_0; + } else if (f == 1.0) { + opcode = org.apache.bcel.Constants.FCONST_1; + } else if (f == 2.0) { + opcode = org.apache.bcel.Constants.FCONST_2; + } else { + throw new ClassGenException("FCONST can be used only for 0.0, 1.0 and 2.0: " + f); + } + value = f; + } - public FCONST(float f) { - super(org.apache.bcel.Constants.FCONST_0, (short)1); - if(f == 0.0) - opcode = org.apache.bcel.Constants.FCONST_0; - else if(f == 1.0) - opcode = org.apache.bcel.Constants.FCONST_1; - else if(f == 2.0) - opcode = org.apache.bcel.Constants.FCONST_2; - else - throw new ClassGenException("FCONST can be used only for 0.0, 1.0 and 2.0: " + f); + public Number getValue() { + return new Float(value); + } - value = f; - } - public Number getValue() { return new Float(value); } + /** @return Type.FLOAT + */ + public Type getType( ConstantPoolGen cp ) { + return Type.FLOAT; + } - /** @return Type.FLOAT - */ - public Type getType(ConstantPoolGen cp) { - return Type.FLOAT; - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitPushInstruction(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitConstantPushInstruction(this); - v.visitFCONST(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitPushInstruction(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitConstantPushInstruction(this); + v.visitFCONST(this); + } } diff --git a/src/java/org/apache/bcel/generic/FDIV.java b/src/java/org/apache/bcel/generic/FDIV.java index 7fc5ce35..61f3151c 100644 --- a/src/java/org/apache/bcel/generic/FDIV.java +++ b/src/java/org/apache/bcel/generic/FDIV.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FDIV - Divide floats *
            Stack: ..., value1, value2 -> result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class FDIV extends ArithmeticInstruction { - /** Divide floats - */ - public FDIV() { - super(org.apache.bcel.Constants.FDIV); - } + + /** Divide floats + */ + public FDIV() { + super(org.apache.bcel.Constants.FDIV); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitFDIV(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitFDIV(this); + } } diff --git a/src/java/org/apache/bcel/generic/FLOAD.java b/src/java/org/apache/bcel/generic/FLOAD.java index 1a9aa447..aec021b1 100644 --- a/src/java/org/apache/bcel/generic/FLOAD.java +++ b/src/java/org/apache/bcel/generic/FLOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FLOAD - Load float from local variable *
            Stack ... -> ..., result
            @@ -25,31 +24,34 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class FLOAD extends LoadInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - FLOAD() { - super(org.apache.bcel.Constants.FLOAD, org.apache.bcel.Constants.FLOAD_0); - } - /** Load float from local variable - * @param n index of local variable - */ - public FLOAD(int n) { - super(org.apache.bcel.Constants.FLOAD, org.apache.bcel.Constants.FLOAD_0, n); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + FLOAD() { + super(org.apache.bcel.Constants.FLOAD, org.apache.bcel.Constants.FLOAD_0); + } + + + /** Load float from local variable + * @param n index of local variable + */ + public FLOAD(int n) { + super(org.apache.bcel.Constants.FLOAD, org.apache.bcel.Constants.FLOAD_0, n); + } + - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - super.accept(v); - v.visitFLOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + super.accept(v); + v.visitFLOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/FMUL.java b/src/java/org/apache/bcel/generic/FMUL.java index be8ce9a9..d1d02364 100644 --- a/src/java/org/apache/bcel/generic/FMUL.java +++ b/src/java/org/apache/bcel/generic/FMUL.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FMUL - Multiply floats *
            Stack: ..., value1, value2 -> result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class FMUL extends ArithmeticInstruction { - /** Multiply floats - */ - public FMUL() { - super(org.apache.bcel.Constants.FMUL); - } + + /** Multiply floats + */ + public FMUL() { + super(org.apache.bcel.Constants.FMUL); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitFMUL(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitFMUL(this); + } } diff --git a/src/java/org/apache/bcel/generic/FNEG.java b/src/java/org/apache/bcel/generic/FNEG.java index eefdc320..98659921 100644 --- a/src/java/org/apache/bcel/generic/FNEG.java +++ b/src/java/org/apache/bcel/generic/FNEG.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FNEG - Negate float *
            Stack: ..., value -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class FNEG extends ArithmeticInstruction { - public FNEG() { - super(org.apache.bcel.Constants.FNEG); - } + + public FNEG() { + super(org.apache.bcel.Constants.FNEG); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitFNEG(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitFNEG(this); + } } diff --git a/src/java/org/apache/bcel/generic/FREM.java b/src/java/org/apache/bcel/generic/FREM.java index 8b676438..3b4a6a01 100644 --- a/src/java/org/apache/bcel/generic/FREM.java +++ b/src/java/org/apache/bcel/generic/FREM.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FREM - Remainder of floats *
            Stack: ..., value1, value2 -> result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class FREM extends ArithmeticInstruction { - /** Remainder of floats - */ - public FREM() { - super(org.apache.bcel.Constants.FREM); - } + + /** Remainder of floats + */ + public FREM() { + super(org.apache.bcel.Constants.FREM); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitFREM(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitFREM(this); + } } diff --git a/src/java/org/apache/bcel/generic/FRETURN.java b/src/java/org/apache/bcel/generic/FRETURN.java index 6de61b3f..02258ff3 100644 --- a/src/java/org/apache/bcel/generic/FRETURN.java +++ b/src/java/org/apache/bcel/generic/FRETURN.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FRETURN - Return float from method *
            Stack: ..., value -> <empty>
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class FRETURN extends ReturnInstruction { - /** Return float from method - */ - public FRETURN() { - super(org.apache.bcel.Constants.FRETURN); - } + + /** Return float from method + */ + public FRETURN() { + super(org.apache.bcel.Constants.FRETURN); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitReturnInstruction(this); - v.visitFRETURN(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitReturnInstruction(this); + v.visitFRETURN(this); + } } diff --git a/src/java/org/apache/bcel/generic/FSTORE.java b/src/java/org/apache/bcel/generic/FSTORE.java index 94ae3124..0d126518 100644 --- a/src/java/org/apache/bcel/generic/FSTORE.java +++ b/src/java/org/apache/bcel/generic/FSTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FSTORE - Store float into local variable *
            Stack: ..., value -> ... 
            @@ -25,31 +24,34 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class FSTORE extends StoreInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - FSTORE() { - super(org.apache.bcel.Constants.FSTORE, org.apache.bcel.Constants.FSTORE_0); - } - /** Store float into local variable - * @param n index of local variable - */ - public FSTORE(int n) { - super(org.apache.bcel.Constants.FSTORE, org.apache.bcel.Constants.FSTORE_0, n); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + FSTORE() { + super(org.apache.bcel.Constants.FSTORE, org.apache.bcel.Constants.FSTORE_0); + } + + + /** Store float into local variable + * @param n index of local variable + */ + public FSTORE(int n) { + super(org.apache.bcel.Constants.FSTORE, org.apache.bcel.Constants.FSTORE_0, n); + } + - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - super.accept(v); - v.visitFSTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + super.accept(v); + v.visitFSTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/FSUB.java b/src/java/org/apache/bcel/generic/FSUB.java index 9b72e991..6df62702 100644 --- a/src/java/org/apache/bcel/generic/FSUB.java +++ b/src/java/org/apache/bcel/generic/FSUB.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * FSUB - Substract floats *
            Stack: ..., value1, value2 -> result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class FSUB extends ArithmeticInstruction { - /** Substract floats - */ - public FSUB() { - super(org.apache.bcel.Constants.FSUB); - } + + /** Substract floats + */ + public FSUB() { + super(org.apache.bcel.Constants.FSUB); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitFSUB(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitFSUB(this); + } } diff --git a/src/java/org/apache/bcel/generic/FieldGen.java b/src/java/org/apache/bcel/generic/FieldGen.java index 101e33ad..239775be 100644 --- a/src/java/org/apache/bcel/generic/FieldGen.java +++ b/src/java/org/apache/bcel/generic/FieldGen.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -40,294 +39,319 @@ import org.apache.bcel.util.BCELComparator; * @see Field */ public class FieldGen extends FieldGenOrMethodGen { - private Object value = null; - - private static BCELComparator _cmp = new BCELComparator() { - public boolean equals(Object o1, Object o2) { - FieldGen THIS = (FieldGen)o1; - FieldGen THAT = (FieldGen)o2; - - return THIS.getName().equals(THAT.getName()) - && THIS.getSignature().equals(THAT.getSignature()); - } - - public int hashCode(Object o) { - FieldGen THIS = (FieldGen)o; - return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); - } - }; - - /** - * Declare a field. If it is static (isStatic() == true) and has a - * basic type like int or String it may have an initial value - * associated with it as defined by setInitValue(). - * - * @param access_flags access qualifiers - * @param type field type - * @param name field name - * @param cp constant pool - */ - public FieldGen(int access_flags, Type type, String name, ConstantPoolGen cp) { - setAccessFlags(access_flags); - setType(type); - setName(name); - setConstantPool(cp); - } - - /** - * Instantiate from existing field. - * - * @param field Field object - * @param cp constant pool (must contain the same entries as the field's constant pool) - */ - public FieldGen(Field field, ConstantPoolGen cp) { - this(field.getAccessFlags(), Type.getType(field.getSignature()), field.getName(), cp); - - Attribute[] attrs = field.getAttributes(); - - for(int i=0; i < attrs.length; i++) { - if(attrs[i] instanceof ConstantValue) - setValue(((ConstantValue)attrs[i]).getConstantValueIndex()); - else - addAttribute(attrs[i]); + + private Object value = null; + private static BCELComparator _cmp = new BCELComparator() { + + public boolean equals( Object o1, Object o2 ) { + FieldGen THIS = (FieldGen) o1; + FieldGen THAT = (FieldGen) o2; + return THIS.getName().equals(THAT.getName()) + && THIS.getSignature().equals(THAT.getSignature()); + } + + + public int hashCode( Object o ) { + FieldGen THIS = (FieldGen) o; + return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + } + }; + + + /** + * Declare a field. If it is static (isStatic() == true) and has a + * basic type like int or String it may have an initial value + * associated with it as defined by setInitValue(). + * + * @param access_flags access qualifiers + * @param type field type + * @param name field name + * @param cp constant pool + */ + public FieldGen(int access_flags, Type type, String name, ConstantPoolGen cp) { + setAccessFlags(access_flags); + setType(type); + setName(name); + setConstantPool(cp); } - } - - private void setValue(int index) { - ConstantPool cp = this.cp.getConstantPool(); - Constant c = cp.getConstant(index); - value = ((ConstantObject)c).getConstantValue(cp); - } - - /** - * Set (optional) initial value of field, otherwise it will be set to null/0/false - * by the JVM automatically. - */ - public void setInitValue(String str) { - checkType(new ObjectType("java.lang.String")); - - if(str != null) - value = str; - } - - public void setInitValue(long l) { - checkType(Type.LONG); - - if(l != 0L) - value = new Long(l); - } - - public void setInitValue(int i) { - checkType(Type.INT); - - if(i != 0) - value = new Integer(i); - } - - public void setInitValue(short s) { - checkType(Type.SHORT); - - if(s != 0) - value = new Integer(s); - } - - public void setInitValue(char c) { - checkType(Type.CHAR); - - if(c != 0) - value = new Integer(c); - } - - public void setInitValue(byte b) { - checkType(Type.BYTE); - - if(b != 0) - value = new Integer(b); - } - - public void setInitValue(boolean b) { - checkType(Type.BOOLEAN); - - if(b) - value = new Integer(1); - } - - public void setInitValue(float f) { - checkType(Type.FLOAT); - - if(f != 0.0) - value = new Float(f); - } - - public void setInitValue(double d) { - checkType(Type.DOUBLE); - - if(d != 0.0) - value = new Double(d); - } - - /** Remove any initial value. - */ - public void cancelInitValue() { - value = null; - } - - private void checkType(Type atype) { - if(type == null) - throw new ClassGenException("You haven't defined the type of the field yet"); - - if(!isFinal()) - throw new ClassGenException("Only final fields may have an initial value!"); - - if(!type.equals(atype)) - throw new ClassGenException("Types are not compatible: " + type + " vs. " + atype); - } - - /** - * Get field object after having set up all necessary values. - */ - public Field getField() { - String signature = getSignature(); - int name_index = cp.addUtf8(name); - int signature_index = cp.addUtf8(signature); - - if(value != null) { - checkType(type); - int index = addConstant(); - addAttribute(new ConstantValue(cp.addUtf8("ConstantValue"), - 2, index, cp.getConstantPool())); + + + /** + * Instantiate from existing field. + * + * @param field Field object + * @param cp constant pool (must contain the same entries as the field's constant pool) + */ + public FieldGen(Field field, ConstantPoolGen cp) { + this(field.getAccessFlags(), Type.getType(field.getSignature()), field.getName(), cp); + Attribute[] attrs = field.getAttributes(); + for (int i = 0; i < attrs.length; i++) { + if (attrs[i] instanceof ConstantValue) { + setValue(((ConstantValue) attrs[i]).getConstantValueIndex()); + } else { + addAttribute(attrs[i]); + } + } } - return new Field(access_flags, name_index, signature_index, getAttributes(), - cp.getConstantPool()); - } - private int addConstant() { - switch(type.getType()) { - case Constants.T_INT: case Constants.T_CHAR: case Constants.T_BYTE: - case Constants.T_BOOLEAN: case Constants.T_SHORT: - return cp.addInteger(((Integer)value).intValue()); - - case Constants.T_FLOAT: - return cp.addFloat(((Float)value).floatValue()); + private void setValue( int index ) { + ConstantPool cp = this.cp.getConstantPool(); + Constant c = cp.getConstant(index); + value = ((ConstantObject) c).getConstantValue(cp); + } - case Constants.T_DOUBLE: - return cp.addDouble(((Double)value).doubleValue()); - case Constants.T_LONG: - return cp.addLong(((Long)value).longValue()); + /** + * Set (optional) initial value of field, otherwise it will be set to null/0/false + * by the JVM automatically. + */ + public void setInitValue( String str ) { + checkType(new ObjectType("java.lang.String")); + if (str != null) { + value = str; + } + } - case Constants.T_REFERENCE: - return cp.addString(((String)value)); - default: - throw new RuntimeException("Oops: Unhandled : " + type.getType()); + public void setInitValue( long l ) { + checkType(Type.LONG); + if (l != 0L) { + value = new Long(l); + } + } + + + public void setInitValue( int i ) { + checkType(Type.INT); + if (i != 0) { + value = new Integer(i); + } + } + + + public void setInitValue( short s ) { + checkType(Type.SHORT); + if (s != 0) { + value = new Integer(s); + } + } + + + public void setInitValue( char c ) { + checkType(Type.CHAR); + if (c != 0) { + value = new Integer(c); + } + } + + + public void setInitValue( byte b ) { + checkType(Type.BYTE); + if (b != 0) { + value = new Integer(b); + } + } + + + public void setInitValue( boolean b ) { + checkType(Type.BOOLEAN); + if (b) { + value = new Integer(1); + } + } + + + public void setInitValue( float f ) { + checkType(Type.FLOAT); + if (f != 0.0) { + value = new Float(f); + } + } + + + public void setInitValue( double d ) { + checkType(Type.DOUBLE); + if (d != 0.0) { + value = new Double(d); + } + } + + + /** Remove any initial value. + */ + public void cancelInitValue() { + value = null; + } + + + private void checkType( Type atype ) { + if (type == null) { + throw new ClassGenException("You haven't defined the type of the field yet"); + } + if (!isFinal()) { + throw new ClassGenException("Only final fields may have an initial value!"); + } + if (!type.equals(atype)) { + throw new ClassGenException("Types are not compatible: " + type + " vs. " + atype); + } + } + + + /** + * Get field object after having set up all necessary values. + */ + public Field getField() { + String signature = getSignature(); + int name_index = cp.addUtf8(name); + int signature_index = cp.addUtf8(signature); + if (value != null) { + checkType(type); + int index = addConstant(); + addAttribute(new ConstantValue(cp.addUtf8("ConstantValue"), 2, index, cp + .getConstantPool())); + } + return new Field(access_flags, name_index, signature_index, getAttributes(), cp + .getConstantPool()); } - } - - public String getSignature() { return type.getSignature(); } - - private List observers; - - /** Add observer for this object. - */ - public void addObserver(FieldObserver o) { - if(observers == null) - observers = new ArrayList(); - - observers.add(o); - } - - /** Remove observer for this object. - */ - public void removeObserver(FieldObserver o) { - if(observers != null) - observers.remove(o); - } - - /** Call notify() method on all observers. This method is not called - * automatically whenever the state has changed, but has to be - * called by the user after he has finished editing the object. - */ - public void update() { - if(observers != null) - for(Iterator e = observers.iterator(); e.hasNext(); ) - ((FieldObserver)e.next()).notify(this); - } - - public String getInitValue() { - if(value != null) { - return value.toString(); - } else - return null; - } - - /** - * Return string representation close to declaration format, - * `public static final short MAX = 100', e.g.. - * - * @return String representation of field - */ - public final String toString() { - String name, signature, access; // Short cuts to constant pool - - access = Utility.accessToString(access_flags); - access = access.equals("")? "" : (access + " "); - signature = type.toString(); - name = getName(); - - StringBuffer buf = new StringBuffer(32); - buf.append(access).append(signature).append(" ").append(name); - String value = getInitValue(); - - if(value != null) - buf.append(" = ").append(value); - - return buf.toString(); - } - - /** @return deep copy of this field - */ - public FieldGen copy(ConstantPoolGen cp) { - FieldGen fg = (FieldGen)clone(); - - fg.setConstantPool(cp); - return fg; - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default two FieldGen objects are said to be equal when - * their names and signatures are equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default return the hashcode of the field's name XOR signature. - * - * @see java.lang.Object#hashCode() - */ - public int hashCode() { - return _cmp.hashCode(this); - } -} + + private int addConstant() { + switch (type.getType()) { + case Constants.T_INT: + case Constants.T_CHAR: + case Constants.T_BYTE: + case Constants.T_BOOLEAN: + case Constants.T_SHORT: + return cp.addInteger(((Integer) value).intValue()); + case Constants.T_FLOAT: + return cp.addFloat(((Float) value).floatValue()); + case Constants.T_DOUBLE: + return cp.addDouble(((Double) value).doubleValue()); + case Constants.T_LONG: + return cp.addLong(((Long) value).longValue()); + case Constants.T_REFERENCE: + return cp.addString(((String) value)); + default: + throw new RuntimeException("Oops: Unhandled : " + type.getType()); + } + } + + + public String getSignature() { + return type.getSignature(); + } + + private List observers; + + + /** Add observer for this object. + */ + public void addObserver( FieldObserver o ) { + if (observers == null) { + observers = new ArrayList(); + } + observers.add(o); + } + + + /** Remove observer for this object. + */ + public void removeObserver( FieldObserver o ) { + if (observers != null) { + observers.remove(o); + } + } + + + /** Call notify() method on all observers. This method is not called + * automatically whenever the state has changed, but has to be + * called by the user after he has finished editing the object. + */ + public void update() { + if (observers != null) { + for (Iterator e = observers.iterator(); e.hasNext();) { + ((FieldObserver) e.next()).notify(this); + } + } + } + + + public String getInitValue() { + if (value != null) { + return value.toString(); + } else { + return null; + } + } + + + /** + * Return string representation close to declaration format, + * `public static final short MAX = 100', e.g.. + * + * @return String representation of field + */ + public final String toString() { + String name, signature, access; // Short cuts to constant pool + access = Utility.accessToString(access_flags); + access = access.equals("") ? "" : (access + " "); + signature = type.toString(); + name = getName(); + StringBuffer buf = new StringBuffer(32); + buf.append(access).append(signature).append(" ").append(name); + String value = getInitValue(); + if (value != null) { + buf.append(" = ").append(value); + } + return buf.toString(); + } + + + /** @return deep copy of this field + */ + public FieldGen copy( ConstantPoolGen cp ) { + FieldGen fg = (FieldGen) clone(); + fg.setConstantPool(cp); + return fg; + } + + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; + } + + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator( BCELComparator comparator ) { + _cmp = comparator; + } + + + /** + * Return value as defined by given BCELComparator strategy. + * By default two FieldGen objects are said to be equal when + * their names and signatures are equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals( Object obj ) { + return _cmp.equals(this, obj); + } + + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the field's name XOR signature. + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); + } +} diff --git a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 854a0346..745fb2bd 100644 --- a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -1,4 +1,5 @@ package org.apache.bcel.generic; + import java.util.ArrayList; import java.util.List; import org.apache.bcel.Constants; @@ -12,71 +13,103 @@ import org.apache.bcel.classfile.Attribute; * @version $Id$ * @author M. Dahm */ -public abstract class FieldGenOrMethodGen extends AccessFlags - implements NamedAndTyped, Cloneable -{ - protected String name; - protected Type type; - protected ConstantPoolGen cp; - private List attribute_vec = new ArrayList(); - - protected FieldGenOrMethodGen() {} - - public void setType(Type type) { - if(type.getType() == Constants.T_ADDRESS) - throw new IllegalArgumentException("Type can not be " + type); - - this.type = type; - } - public Type getType() { return type; } - - /** @return name of method/field. - */ - public String getName() { return name; } - public void setName(String name) { this.name = name; } - - public ConstantPoolGen getConstantPool() { return cp; } - public void setConstantPool(ConstantPoolGen cp) { this.cp = cp; } - - /** - * Add an attribute to this method. Currently, the JVM knows about - * the `Code', `ConstantValue', `Synthetic' and `Exceptions' - * attributes. Other attributes will be ignored by the JVM but do no - * harm. - * - * @param a attribute to be added - */ - public void addAttribute(Attribute a) { attribute_vec.add(a); } - - /** - * Remove an attribute. - */ - public void removeAttribute(Attribute a) { attribute_vec.remove(a); } - - /** - * Remove all attributes. - */ - public void removeAttributes() { attribute_vec.clear(); } - - /** - * @return all attributes of this method. - */ - public Attribute[] getAttributes() { - Attribute[] attributes = new Attribute[attribute_vec.size()]; - attribute_vec.toArray(attributes); - return attributes; - } - - /** @return signature of method/field. - */ - public abstract String getSignature(); - - public Object clone() { - try { - return super.clone(); - } catch(CloneNotSupportedException e) { - System.err.println(e); - return null; +public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAndTyped, Cloneable { + + protected String name; + protected Type type; + protected ConstantPoolGen cp; + private List attribute_vec = new ArrayList(); + + + protected FieldGenOrMethodGen() { + } + + + public void setType( Type type ) { + if (type.getType() == Constants.T_ADDRESS) { + throw new IllegalArgumentException("Type can not be " + type); + } + this.type = type; + } + + + public Type getType() { + return type; + } + + + /** @return name of method/field. + */ + public String getName() { + return name; + } + + + public void setName( String name ) { + this.name = name; + } + + + public ConstantPoolGen getConstantPool() { + return cp; + } + + + public void setConstantPool( ConstantPoolGen cp ) { + this.cp = cp; + } + + + /** + * Add an attribute to this method. Currently, the JVM knows about + * the `Code', `ConstantValue', `Synthetic' and `Exceptions' + * attributes. Other attributes will be ignored by the JVM but do no + * harm. + * + * @param a attribute to be added + */ + public void addAttribute( Attribute a ) { + attribute_vec.add(a); + } + + + /** + * Remove an attribute. + */ + public void removeAttribute( Attribute a ) { + attribute_vec.remove(a); + } + + + /** + * Remove all attributes. + */ + public void removeAttributes() { + attribute_vec.clear(); + } + + + /** + * @return all attributes of this method. + */ + public Attribute[] getAttributes() { + Attribute[] attributes = new Attribute[attribute_vec.size()]; + attribute_vec.toArray(attributes); + return attributes; + } + + + /** @return signature of method/field. + */ + public abstract String getSignature(); + + + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException e) { + System.err.println(e); + return null; + } } - } } diff --git a/src/java/org/apache/bcel/generic/FieldInstruction.java b/src/java/org/apache/bcel/generic/FieldInstruction.java index 7eaba3f4..21c0759a 100644 --- a/src/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/java/org/apache/bcel/generic/FieldInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import org.apache.bcel.classfile.ConstantPool; /** @@ -25,51 +24,57 @@ import org.apache.bcel.classfile.ConstantPool; * @version $Id$ * @author M. Dahm */ -public abstract class FieldInstruction extends FieldOrMethod - implements TypedInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - FieldInstruction() {} +public abstract class FieldInstruction extends FieldOrMethod implements TypedInstruction { - /** - * @param index to constant pool - */ - protected FieldInstruction(short opcode, int index) { - super(opcode, index); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + FieldInstruction() { + } - /** - * @return mnemonic for instruction with symbolic references resolved - */ - public String toString(ConstantPool cp) { - return org.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " + - cp.constantToString(index, org.apache.bcel.Constants.CONSTANT_Fieldref); - } - - /** @return size of field (1 or 2) - */ - protected int getFieldSize(ConstantPoolGen cpg) { - return getType(cpg).getSize(); - } - /** @return return type of referenced field - */ - public Type getType(ConstantPoolGen cpg) { - return getFieldType(cpg); - } + /** + * @param index to constant pool + */ + protected FieldInstruction(short opcode, int index) { + super(opcode, index); + } - /** @return type of field - */ - public Type getFieldType(ConstantPoolGen cpg) { - return Type.getType(getSignature(cpg)); - } - /** @return name of referenced field. - */ - public String getFieldName(ConstantPoolGen cpg) { - return getName(cpg); - } -} + /** + * @return mnemonic for instruction with symbolic references resolved + */ + public String toString( ConstantPool cp ) { + return org.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " + + cp.constantToString(index, org.apache.bcel.Constants.CONSTANT_Fieldref); + } + + + /** @return size of field (1 or 2) + */ + protected int getFieldSize( ConstantPoolGen cpg ) { + return getType(cpg).getSize(); + } + + /** @return return type of referenced field + */ + public Type getType( ConstantPoolGen cpg ) { + return getFieldType(cpg); + } + + + /** @return type of field + */ + public Type getFieldType( ConstantPoolGen cpg ) { + return Type.getType(getSignature(cpg)); + } + + + /** @return name of referenced field. + */ + public String getFieldName( ConstantPoolGen cpg ) { + return getName(cpg); + } +} diff --git a/src/java/org/apache/bcel/generic/FieldObserver.java b/src/java/org/apache/bcel/generic/FieldObserver.java index b7787b18..334d47c7 100644 --- a/src/java/org/apache/bcel/generic/FieldObserver.java +++ b/src/java/org/apache/bcel/generic/FieldObserver.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Imnplement this interface if you're interested in changes to a FieldGen object * and register yourself with addObserver(). @@ -25,6 +24,6 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface FieldObserver { - public void notify(FieldGen field); -} + public void notify( FieldGen field ); +} diff --git a/src/java/org/apache/bcel/generic/FieldOrMethod.java b/src/java/org/apache/bcel/generic/FieldOrMethod.java index f2879c46..bb0526a6 100644 --- a/src/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/java/org/apache/bcel/generic/FieldOrMethod.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.classfile.ConstantCP; @@ -29,90 +29,100 @@ import org.apache.bcel.classfile.ConstantUtf8; * @author M. Dahm */ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - FieldOrMethod() {} - - /** - * @param index to constant pool - */ - protected FieldOrMethod(short opcode, int index) { - super(opcode, index); - } - - /** @return signature of referenced method/field. - */ - public String getSignature(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP)cp.getConstant(index); - ConstantNameAndType cnat = (ConstantNameAndType)cp.getConstant(cmr.getNameAndTypeIndex()); - - return ((ConstantUtf8)cp.getConstant(cnat.getSignatureIndex())).getBytes(); - } - - /** @return name of referenced method/field. - */ - public String getName(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP)cp.getConstant(index); - ConstantNameAndType cnat = (ConstantNameAndType)cp.getConstant(cmr.getNameAndTypeIndex()); - return ((ConstantUtf8)cp.getConstant(cnat.getNameIndex())).getBytes(); - } - - /** @return name of the referenced class/interface - * @deprecated If the instruction references an array class, - * this method will return "java.lang.Object". - * For code generated by Java 1.5, this answer is - * sometimes wrong (e.g., if the "clone()" method is - * called on an array). A better idea is to use - * the getReferenceType() method, which correctly distinguishes - * between class types and array types. - */ - public String getClassName(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP)cp.getConstant(index); - String className = cp.getConstantString(cmr.getClassIndex(), org.apache.bcel.Constants.CONSTANT_Class); - if (className.startsWith("[")) { - // Turn array classes into java.lang.Object. - return "java.lang.Object"; + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + FieldOrMethod() { } - return className.replace('/', '.'); - } - - /** @return type of the referenced class/interface - * @deprecated If the instruction references an array class, - * the ObjectType returned will be invalid. Use - * getReferenceType() instead. - */ - public ObjectType getClassType(ConstantPoolGen cpg) { - return new ObjectType(getClassName(cpg)); - } - - /** - * Return the reference type representing the class, interface, - * or array class referenced by the instruction. - * @param cpg the ConstantPoolGen used to create the instruction - * @return an ObjectType (if the referenced class type is a class - * or interface), or an ArrayType (if the referenced class - * type is an array class) - */ - public ReferenceType getReferenceType(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP)cp.getConstant(index); - String className = cp.getConstantString(cmr.getClassIndex(), org.apache.bcel.Constants.CONSTANT_Class); - if (className.startsWith("[")) { - return (ArrayType) Type.getType(className); - } else { - className = className.replace('/', '.'); - return new ObjectType(className); + + + /** + * @param index to constant pool + */ + protected FieldOrMethod(short opcode, int index) { + super(opcode, index); } - } - /** @return type of the referenced class/interface - */ - public ObjectType getLoadClassType(ConstantPoolGen cpg) { - return getClassType(cpg); - } + + /** @return signature of referenced method/field. + */ + public String getSignature( ConstantPoolGen cpg ) { + ConstantPool cp = cpg.getConstantPool(); + ConstantCP cmr = (ConstantCP) cp.getConstant(index); + ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); + return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes(); + } + + + /** @return name of referenced method/field. + */ + public String getName( ConstantPoolGen cpg ) { + ConstantPool cp = cpg.getConstantPool(); + ConstantCP cmr = (ConstantCP) cp.getConstant(index); + ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); + return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); + } + + + /** @return name of the referenced class/interface + * @deprecated If the instruction references an array class, + * this method will return "java.lang.Object". + * For code generated by Java 1.5, this answer is + * sometimes wrong (e.g., if the "clone()" method is + * called on an array). A better idea is to use + * the getReferenceType() method, which correctly distinguishes + * between class types and array types. + */ + public String getClassName( ConstantPoolGen cpg ) { + ConstantPool cp = cpg.getConstantPool(); + ConstantCP cmr = (ConstantCP) cp.getConstant(index); + String className = cp.getConstantString(cmr.getClassIndex(), + org.apache.bcel.Constants.CONSTANT_Class); + if (className.startsWith("[")) { + // Turn array classes into java.lang.Object. + return "java.lang.Object"; + } + return className.replace('/', '.'); + } + + + /** @return type of the referenced class/interface + * @deprecated If the instruction references an array class, + * the ObjectType returned will be invalid. Use + * getReferenceType() instead. + */ + public ObjectType getClassType( ConstantPoolGen cpg ) { + return new ObjectType(getClassName(cpg)); + } + + + /** + * Return the reference type representing the class, interface, + * or array class referenced by the instruction. + * @param cpg the ConstantPoolGen used to create the instruction + * @return an ObjectType (if the referenced class type is a class + * or interface), or an ArrayType (if the referenced class + * type is an array class) + */ + public ReferenceType getReferenceType( ConstantPoolGen cpg ) { + ConstantPool cp = cpg.getConstantPool(); + ConstantCP cmr = (ConstantCP) cp.getConstant(index); + String className = cp.getConstantString(cmr.getClassIndex(), + org.apache.bcel.Constants.CONSTANT_Class); + if (className.startsWith("[")) { + return (ArrayType) Type.getType(className); + } else { + className = className.replace('/', '.'); + return new ObjectType(className); + } + } + + + /** @return type of the referenced class/interface + */ + public ObjectType getLoadClassType( ConstantPoolGen cpg ) { + return getClassType(cpg); + } } diff --git a/src/java/org/apache/bcel/generic/GETFIELD.java b/src/java/org/apache/bcel/generic/GETFIELD.java index d378919b..98288cf3 100644 --- a/src/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/java/org/apache/bcel/generic/GETFIELD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import org.apache.bcel.Constants; import org.apache.bcel.ExceptionConstants; @@ -29,52 +28,54 @@ import org.apache.bcel.ExceptionConstants; * @version $Id$ * @author M. Dahm */ -public class GETFIELD extends FieldInstruction - implements ExceptionThrower, StackConsumer, StackProducer { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - GETFIELD() {} +public class GETFIELD extends FieldInstruction implements ExceptionThrower, StackConsumer, + StackProducer { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + GETFIELD() { + } - public GETFIELD(int index) { - super(Constants.GETFIELD, index); - } - public int produceStack(ConstantPoolGen cpg) { return getFieldSize(cpg); } + public GETFIELD(int index) { + super(Constants.GETFIELD, index); + } - public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, - cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + public int produceStack( ConstantPoolGen cpg ) { + return getFieldSize(cpg); + } - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+1] = - ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = - ExceptionConstants.NULL_POINTER_EXCEPTION; - return cs; - } + public Class[] getExceptions() { + Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; + return cs; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitStackConsumer(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitFieldInstruction(this); - v.visitGETFIELD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitFieldInstruction(this); + v.visitGETFIELD(this); + } } diff --git a/src/java/org/apache/bcel/generic/GETSTATIC.java b/src/java/org/apache/bcel/generic/GETSTATIC.java index 24a9a5c1..5be65f80 100644 --- a/src/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/java/org/apache/bcel/generic/GETSTATIC.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import org.apache.bcel.Constants; import org.apache.bcel.ExceptionConstants; @@ -30,47 +29,51 @@ import org.apache.bcel.ExceptionConstants; * @author M. Dahm */ public class GETSTATIC extends FieldInstruction implements PushInstruction, ExceptionThrower { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - GETSTATIC() {} - public GETSTATIC(int index) { - super(Constants.GETSTATIC, index); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + GETSTATIC() { + } + + + public GETSTATIC(int index) { + super(Constants.GETSTATIC, index); + } - public int produceStack(ConstantPoolGen cpg) { return getFieldSize(cpg); } - public Class[] getExceptions() { - Class[] cs = new Class[1 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + public int produceStack( ConstantPoolGen cpg ) { + return getFieldSize(cpg); + } - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, - cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = - ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - return cs; - } + public Class[] getExceptions() { + Class[] cs = new Class[1 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + return cs; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitFieldInstruction(this); - v.visitGETSTATIC(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitFieldInstruction(this); + v.visitGETSTATIC(this); + } } diff --git a/src/java/org/apache/bcel/generic/GOTO.java b/src/java/org/apache/bcel/generic/GOTO.java index 2ad62f17..b23b224e 100644 --- a/src/java/org/apache/bcel/generic/GOTO.java +++ b/src/java/org/apache/bcel/generic/GOTO.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -26,61 +26,64 @@ import java.io.IOException; * @author M. Dahm */ public class GOTO extends GotoInstruction implements VariableLengthInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - GOTO() {} - public GOTO(InstructionHandle target) { - super(org.apache.bcel.Constants.GOTO, target); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + GOTO() { + } + - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - index = getTargetOffset(); - if(opcode == org.apache.bcel.Constants.GOTO) - super.dump(out); - else { // GOTO_W - index = getTargetOffset(); - out.writeByte(opcode); - out.writeInt(index); + public GOTO(InstructionHandle target) { + super(org.apache.bcel.Constants.GOTO, target); } - } - /** Called in pass 2 of InstructionList.setPositions() in order to update - * the branch target, that may shift due to variable length instructions. - */ - protected int updatePosition(int offset, int max_offset) { - int i = getTargetOffset(); // Depending on old position value - position += offset; // Position may be shifted by preceding expansions + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + index = getTargetOffset(); + if (opcode == org.apache.bcel.Constants.GOTO) { + super.dump(out); + } else { // GOTO_W + index = getTargetOffset(); + out.writeByte(opcode); + out.writeInt(index); + } + } + - if(Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) - opcode = org.apache.bcel.Constants.GOTO_W; - length = 5; - return 2; // 5 - 3 + /** Called in pass 2 of InstructionList.setPositions() in order to update + * the branch target, that may shift due to variable length instructions. + */ + protected int updatePosition( int offset, int max_offset ) { + int i = getTargetOffset(); // Depending on old position value + position += offset; // Position may be shifted by preceding expansions + if (Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) + opcode = org.apache.bcel.Constants.GOTO_W; + length = 5; + return 2; // 5 - 3 + } + return 0; } - return 0; - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitVariableLengthInstruction(this); - v.visitUnconditionalBranch(this); - v.visitBranchInstruction(this); - v.visitGotoInstruction(this); - v.visitGOTO(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitVariableLengthInstruction(this); + v.visitUnconditionalBranch(this); + v.visitBranchInstruction(this); + v.visitGotoInstruction(this); + v.visitGOTO(this); + } } diff --git a/src/java/org/apache/bcel/generic/GOTO_W.java b/src/java/org/apache/bcel/generic/GOTO_W.java index c025d3ba..a3f2df31 100644 --- a/src/java/org/apache/bcel/generic/GOTO_W.java +++ b/src/java/org/apache/bcel/generic/GOTO_W.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -27,48 +27,53 @@ import org.apache.bcel.util.ByteSequence; * @author M. Dahm */ public class GOTO_W extends GotoInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - GOTO_W() {} - public GOTO_W(InstructionHandle target) { - super(org.apache.bcel.Constants.GOTO_W, target); - length = 5; - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + GOTO_W() { + } + + + public GOTO_W(InstructionHandle target) { + super(org.apache.bcel.Constants.GOTO_W, target); + length = 5; + } + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + index = getTargetOffset(); + out.writeByte(opcode); + out.writeInt(index); + } + - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - index = getTargetOffset(); - out.writeByte(opcode); - out.writeInt(index); - } + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + index = bytes.readInt(); + length = 5; + } - /** - * Read needed data (e.g. index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException - { - index = bytes.readInt(); - length = 5; - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitUnconditionalBranch(this); - v.visitBranchInstruction(this); - v.visitGotoInstruction(this); - v.visitGOTO_W(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitUnconditionalBranch(this); + v.visitBranchInstruction(this); + v.visitGotoInstruction(this); + v.visitGOTO_W(this); + } } diff --git a/src/java/org/apache/bcel/generic/GotoInstruction.java b/src/java/org/apache/bcel/generic/GotoInstruction.java index 9e185cbb..a7b6546c 100644 --- a/src/java/org/apache/bcel/generic/GotoInstruction.java +++ b/src/java/org/apache/bcel/generic/GotoInstruction.java @@ -13,26 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Super class for GOTO * * @version $Id$ * @author M. Dahm */ -public abstract class GotoInstruction extends BranchInstruction - implements UnconditionalBranch -{ - GotoInstruction(short opcode, InstructionHandle target) { - super(opcode, target); - } +public abstract class GotoInstruction extends BranchInstruction implements UnconditionalBranch { + + GotoInstruction(short opcode, InstructionHandle target) { + super(opcode, target); + } + - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - GotoInstruction(){} + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + GotoInstruction() { + } } diff --git a/src/java/org/apache/bcel/generic/I2B.java b/src/java/org/apache/bcel/generic/I2B.java index 431fe3c4..5b230d9c 100644 --- a/src/java/org/apache/bcel/generic/I2B.java +++ b/src/java/org/apache/bcel/generic/I2B.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * I2B - Convert int to byte *
            Stack: ..., value -> ..., result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class I2B extends ConversionInstruction { - /** Convert int to byte - */ - public I2B() { - super(org.apache.bcel.Constants.I2B); - } + + /** Convert int to byte + */ + public I2B() { + super(org.apache.bcel.Constants.I2B); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitI2B(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitI2B(this); + } } diff --git a/src/java/org/apache/bcel/generic/I2C.java b/src/java/org/apache/bcel/generic/I2C.java index f107055c..7d759296 100644 --- a/src/java/org/apache/bcel/generic/I2C.java +++ b/src/java/org/apache/bcel/generic/I2C.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * I2C - Convert int to char *
            Stack: ..., value -> ..., result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class I2C extends ConversionInstruction { - /** Convert int to char - */ - public I2C() { - super(org.apache.bcel.Constants.I2C); - } + + /** Convert int to char + */ + public I2C() { + super(org.apache.bcel.Constants.I2C); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitI2C(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitI2C(this); + } } diff --git a/src/java/org/apache/bcel/generic/I2D.java b/src/java/org/apache/bcel/generic/I2D.java index 7e1e6ab7..239cac63 100644 --- a/src/java/org/apache/bcel/generic/I2D.java +++ b/src/java/org/apache/bcel/generic/I2D.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * I2D - Convert int to double *
            Stack: ..., value -> ..., result.word1, result.word2
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class I2D extends ConversionInstruction { - /** Convert int to double - */ - public I2D() { - super(org.apache.bcel.Constants.I2D); - } + + /** Convert int to double + */ + public I2D() { + super(org.apache.bcel.Constants.I2D); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitI2D(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitI2D(this); + } } diff --git a/src/java/org/apache/bcel/generic/I2F.java b/src/java/org/apache/bcel/generic/I2F.java index 59cd8006..439788e8 100644 --- a/src/java/org/apache/bcel/generic/I2F.java +++ b/src/java/org/apache/bcel/generic/I2F.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * I2F - Convert int to float *
            Stack: ..., value -> ..., result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class I2F extends ConversionInstruction { - /** Convert int to float - */ - public I2F() { - super(org.apache.bcel.Constants.I2F); - } + + /** Convert int to float + */ + public I2F() { + super(org.apache.bcel.Constants.I2F); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitI2F(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitI2F(this); + } } diff --git a/src/java/org/apache/bcel/generic/I2L.java b/src/java/org/apache/bcel/generic/I2L.java index 96e0e71c..a8cebe61 100644 --- a/src/java/org/apache/bcel/generic/I2L.java +++ b/src/java/org/apache/bcel/generic/I2L.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * I2L - Convert int to long *
            Stack: ..., value -> ..., result.word1, result.word2
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class I2L extends ConversionInstruction { - /** Convert int to long - */ - public I2L() { - super(org.apache.bcel.Constants.I2L); - } + + /** Convert int to long + */ + public I2L() { + super(org.apache.bcel.Constants.I2L); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitI2L(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitI2L(this); + } } diff --git a/src/java/org/apache/bcel/generic/I2S.java b/src/java/org/apache/bcel/generic/I2S.java index 2a20725f..4a35bf20 100644 --- a/src/java/org/apache/bcel/generic/I2S.java +++ b/src/java/org/apache/bcel/generic/I2S.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * I2S - Convert int to short *
            Stack: ..., value -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class I2S extends ConversionInstruction { - public I2S() { - super(org.apache.bcel.Constants.I2S); - } + + public I2S() { + super(org.apache.bcel.Constants.I2S); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitI2S(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitI2S(this); + } } diff --git a/src/java/org/apache/bcel/generic/IADD.java b/src/java/org/apache/bcel/generic/IADD.java index 0decc909..9b647112 100644 --- a/src/java/org/apache/bcel/generic/IADD.java +++ b/src/java/org/apache/bcel/generic/IADD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IADD - Add ints *
            Stack: ..., value1, value2 -> result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IADD extends ArithmeticInstruction { - /** Add ints - */ - public IADD() { - super(org.apache.bcel.Constants.IADD); - } + + /** Add ints + */ + public IADD() { + super(org.apache.bcel.Constants.IADD); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIADD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIADD(this); + } } diff --git a/src/java/org/apache/bcel/generic/IALOAD.java b/src/java/org/apache/bcel/generic/IALOAD.java index 9efbb761..5b59cc77 100644 --- a/src/java/org/apache/bcel/generic/IALOAD.java +++ b/src/java/org/apache/bcel/generic/IALOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IALOAD - Load int from array *
            Stack: ..., arrayref, index -> ..., value
            @@ -25,27 +24,28 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IALOAD extends ArrayInstruction implements StackProducer { - /** - * Load int from array - */ - public IALOAD() { - super(org.apache.bcel.Constants.IALOAD); - } + + /** + * Load int from array + */ + public IALOAD() { + super(org.apache.bcel.Constants.IALOAD); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitIALOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitIALOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/IAND.java b/src/java/org/apache/bcel/generic/IAND.java index 61bbb39e..80c91f76 100644 --- a/src/java/org/apache/bcel/generic/IAND.java +++ b/src/java/org/apache/bcel/generic/IAND.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IAND - Bitwise AND int *
            Stack: ..., value1, value2 -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IAND extends ArithmeticInstruction { - public IAND() { - super(org.apache.bcel.Constants.IAND); - } + + public IAND() { + super(org.apache.bcel.Constants.IAND); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIAND(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIAND(this); + } } diff --git a/src/java/org/apache/bcel/generic/IASTORE.java b/src/java/org/apache/bcel/generic/IASTORE.java index 842c0de7..2a2cd301 100644 --- a/src/java/org/apache/bcel/generic/IASTORE.java +++ b/src/java/org/apache/bcel/generic/IASTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IASTORE - Store into int array *
            Stack: ..., arrayref, index, value -> ...
            @@ -25,27 +24,28 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IASTORE extends ArrayInstruction implements StackConsumer { - /** - * Store into int array - */ - public IASTORE() { - super(org.apache.bcel.Constants.IASTORE); - } + + /** + * Store into int array + */ + public IASTORE() { + super(org.apache.bcel.Constants.IASTORE); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitIASTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitIASTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/ICONST.java b/src/java/org/apache/bcel/generic/ICONST.java index 988a5d18..587f7b63 100644 --- a/src/java/org/apache/bcel/generic/ICONST.java +++ b/src/java/org/apache/bcel/generic/ICONST.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * ICONST - Push value between -1, ..., 5, other values cause an exception * @@ -25,48 +24,55 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class ICONST extends Instruction - implements ConstantPushInstruction, TypedInstruction { - private int value; +public class ICONST extends Instruction implements ConstantPushInstruction, TypedInstruction { + + private int value; + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ICONST() { + } + + + public ICONST(int i) { + super(org.apache.bcel.Constants.ICONST_0, (short) 1); + if ((i >= -1) && (i <= 5)) { + opcode = (short) (org.apache.bcel.Constants.ICONST_0 + i); // Even works for i == -1 + } else { + throw new ClassGenException("ICONST can be used only for value between -1 and 5: " + i); + } + value = i; + } + - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ICONST() {} + public Number getValue() { + return new Integer(value); + } - public ICONST(int i) { - super(org.apache.bcel.Constants.ICONST_0, (short)1); - if((i >= -1) && (i <= 5)) - opcode = (short)(org.apache.bcel.Constants.ICONST_0 + i); // Even works for i == -1 - else - throw new ClassGenException("ICONST can be used only for value between -1 and 5: " + - i); - value = i; - } - - public Number getValue() { return new Integer(value); } + /** @return Type.INT + */ + public Type getType( ConstantPoolGen cp ) { + return Type.INT; + } - /** @return Type.INT - */ - public Type getType(ConstantPoolGen cp) { - return Type.INT; - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitPushInstruction(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitConstantPushInstruction(this); - v.visitICONST(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitPushInstruction(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitConstantPushInstruction(this); + v.visitICONST(this); + } } diff --git a/src/java/org/apache/bcel/generic/IDIV.java b/src/java/org/apache/bcel/generic/IDIV.java index d26d526d..7dbee662 100644 --- a/src/java/org/apache/bcel/generic/IDIV.java +++ b/src/java/org/apache/bcel/generic/IDIV.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IDIV - Divide ints *
            Stack: ..., value1, value2 -> result
            @@ -25,33 +24,37 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IDIV extends ArithmeticInstruction implements ExceptionThrower { - /** Divide ints - */ - public IDIV() { - super(org.apache.bcel.Constants.IDIV); - } - /** @return exceptions this instruction may cause - */ - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION }; - } + /** Divide ints + */ + public IDIV() { + super(org.apache.bcel.Constants.IDIV); + } + + + /** @return exceptions this instruction may cause + */ + public Class[] getExceptions() { + return new Class[] { + org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION + }; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIDIV(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIDIV(this); + } } diff --git a/src/java/org/apache/bcel/generic/IFEQ.java b/src/java/org/apache/bcel/generic/IFEQ.java index 78d78147..ad25a3bd 100644 --- a/src/java/org/apache/bcel/generic/IFEQ.java +++ b/src/java/org/apache/bcel/generic/IFEQ.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IFEQ - Branch if int comparison with zero succeeds * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IFEQ extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFEQ() {} - - public IFEQ(InstructionHandle target) { - super(org.apache.bcel.Constants.IFEQ, target); - } - - /** - * @return negation of instruction, e.g. IFEQ.negate() == IFNE - */ - public IfInstruction negate() { - return new IFNE(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFEQ(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFEQ() { + } + + + public IFEQ(InstructionHandle target) { + super(org.apache.bcel.Constants.IFEQ, target); + } + + + /** + * @return negation of instruction, e.g. IFEQ.negate() == IFNE + */ + public IfInstruction negate() { + return new IFNE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFEQ(this); + } } diff --git a/src/java/org/apache/bcel/generic/IFGE.java b/src/java/org/apache/bcel/generic/IFGE.java index 810f81c3..af407e0c 100644 --- a/src/java/org/apache/bcel/generic/IFGE.java +++ b/src/java/org/apache/bcel/generic/IFGE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IFGE - Branch if int comparison with zero succeeds * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IFGE extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFGE() {} - - public IFGE(InstructionHandle target) { - super(org.apache.bcel.Constants.IFGE, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IFLT(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFGE(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFGE() { + } + + + public IFGE(InstructionHandle target) { + super(org.apache.bcel.Constants.IFGE, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFLT(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFGE(this); + } } diff --git a/src/java/org/apache/bcel/generic/IFGT.java b/src/java/org/apache/bcel/generic/IFGT.java index 68e53177..ab7f0b7c 100644 --- a/src/java/org/apache/bcel/generic/IFGT.java +++ b/src/java/org/apache/bcel/generic/IFGT.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IFGT - Branch if int comparison with zero succeeds * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IFGT extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFGT() {} - - public IFGT(InstructionHandle target) { - super(org.apache.bcel.Constants.IFGT, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IFLE(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFGT(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFGT() { + } + + + public IFGT(InstructionHandle target) { + super(org.apache.bcel.Constants.IFGT, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFLE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFGT(this); + } } diff --git a/src/java/org/apache/bcel/generic/IFLE.java b/src/java/org/apache/bcel/generic/IFLE.java index 9b851039..7ee6189f 100644 --- a/src/java/org/apache/bcel/generic/IFLE.java +++ b/src/java/org/apache/bcel/generic/IFLE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IFLE - Branch if int comparison with zero succeeds * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IFLE extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFLE() {} - - public IFLE(InstructionHandle target) { - super(org.apache.bcel.Constants.IFLE, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IFGT(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFLE(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFLE() { + } + + + public IFLE(InstructionHandle target) { + super(org.apache.bcel.Constants.IFLE, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFGT(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFLE(this); + } } diff --git a/src/java/org/apache/bcel/generic/IFLT.java b/src/java/org/apache/bcel/generic/IFLT.java index d2f31cde..990a0e65 100644 --- a/src/java/org/apache/bcel/generic/IFLT.java +++ b/src/java/org/apache/bcel/generic/IFLT.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IFLT - Branch if int comparison with zero succeeds * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IFLT extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFLT() {} - - public IFLT(InstructionHandle target) { - super(org.apache.bcel.Constants.IFLT, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IFGE(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFLT(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFLT() { + } + + + public IFLT(InstructionHandle target) { + super(org.apache.bcel.Constants.IFLT, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFGE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFLT(this); + } } diff --git a/src/java/org/apache/bcel/generic/IFNE.java b/src/java/org/apache/bcel/generic/IFNE.java index bfe08438..e38de95b 100644 --- a/src/java/org/apache/bcel/generic/IFNE.java +++ b/src/java/org/apache/bcel/generic/IFNE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IFNE - Branch if int comparison with zero succeeds * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IFNE extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFNE() {} - - public IFNE(InstructionHandle target) { - super(org.apache.bcel.Constants.IFNE, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IFEQ(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFNE(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFNE() { + } + + + public IFNE(InstructionHandle target) { + super(org.apache.bcel.Constants.IFNE, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFEQ(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFNE(this); + } } diff --git a/src/java/org/apache/bcel/generic/IFNONNULL.java b/src/java/org/apache/bcel/generic/IFNONNULL.java index b47605d9..50b67cdd 100644 --- a/src/java/org/apache/bcel/generic/IFNONNULL.java +++ b/src/java/org/apache/bcel/generic/IFNONNULL.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IFNONNULL - Branch if reference is not null * @@ -26,35 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IFNONNULL extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFNONNULL() {} - - public IFNONNULL(InstructionHandle target) { - super(org.apache.bcel.Constants.IFNONNULL, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IFNULL(target); - } - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFNONNULL(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFNONNULL() { + } + + + public IFNONNULL(InstructionHandle target) { + super(org.apache.bcel.Constants.IFNONNULL, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFNULL(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFNONNULL(this); + } } diff --git a/src/java/org/apache/bcel/generic/IFNULL.java b/src/java/org/apache/bcel/generic/IFNULL.java index 19f1e9f5..9213f6b4 100644 --- a/src/java/org/apache/bcel/generic/IFNULL.java +++ b/src/java/org/apache/bcel/generic/IFNULL.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IFNULL - Branch if reference is not null * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IFNULL extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IFNULL() {} - - public IFNULL(InstructionHandle target) { - super(org.apache.bcel.Constants.IFNULL, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IFNONNULL(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIFNULL(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IFNULL() { + } + + + public IFNULL(InstructionHandle target) { + super(org.apache.bcel.Constants.IFNULL, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IFNONNULL(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIFNULL(this); + } } diff --git a/src/java/org/apache/bcel/generic/IF_ACMPEQ.java b/src/java/org/apache/bcel/generic/IF_ACMPEQ.java index ede00558..342668d2 100644 --- a/src/java/org/apache/bcel/generic/IF_ACMPEQ.java +++ b/src/java/org/apache/bcel/generic/IF_ACMPEQ.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IF_ACMPEQ - Branch if reference comparison succeeds * @@ -26,35 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IF_ACMPEQ extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ACMPEQ() {} - - public IF_ACMPEQ(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ACMPEQ, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IF_ACMPNE(target); - } - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ACMPEQ(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ACMPEQ() { + } + + + public IF_ACMPEQ(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ACMPEQ, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ACMPNE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ACMPEQ(this); + } } diff --git a/src/java/org/apache/bcel/generic/IF_ACMPNE.java b/src/java/org/apache/bcel/generic/IF_ACMPNE.java index 8f8bca2f..44502fa4 100644 --- a/src/java/org/apache/bcel/generic/IF_ACMPNE.java +++ b/src/java/org/apache/bcel/generic/IF_ACMPNE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IF_ACMPNE - Branch if reference comparison doesn't succeed * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IF_ACMPNE extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ACMPNE() {} - - public IF_ACMPNE(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ACMPNE, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IF_ACMPEQ(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ACMPNE(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ACMPNE() { + } + + + public IF_ACMPNE(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ACMPNE, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ACMPEQ(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ACMPNE(this); + } } diff --git a/src/java/org/apache/bcel/generic/IF_ICMPEQ.java b/src/java/org/apache/bcel/generic/IF_ICMPEQ.java index 5079ea4a..e5426aa7 100644 --- a/src/java/org/apache/bcel/generic/IF_ICMPEQ.java +++ b/src/java/org/apache/bcel/generic/IF_ICMPEQ.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IF_ICMPEQ - Branch if int comparison succeeds * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IF_ICMPEQ extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ICMPEQ() {} - - public IF_ICMPEQ(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPEQ, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IF_ICMPNE(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ICMPEQ(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ICMPEQ() { + } + + + public IF_ICMPEQ(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ICMPEQ, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ICMPNE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ICMPEQ(this); + } } diff --git a/src/java/org/apache/bcel/generic/IF_ICMPGE.java b/src/java/org/apache/bcel/generic/IF_ICMPGE.java index 3e0f06e8..2878e72c 100644 --- a/src/java/org/apache/bcel/generic/IF_ICMPGE.java +++ b/src/java/org/apache/bcel/generic/IF_ICMPGE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IF_ICMPGE - Branch if int comparison succeeds * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IF_ICMPGE extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ICMPGE() {} - - public IF_ICMPGE(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPGE, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IF_ICMPLT(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ICMPGE(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ICMPGE() { + } + + + public IF_ICMPGE(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ICMPGE, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ICMPLT(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ICMPGE(this); + } } diff --git a/src/java/org/apache/bcel/generic/IF_ICMPGT.java b/src/java/org/apache/bcel/generic/IF_ICMPGT.java index bd8149f2..ae3e9660 100644 --- a/src/java/org/apache/bcel/generic/IF_ICMPGT.java +++ b/src/java/org/apache/bcel/generic/IF_ICMPGT.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IF_ICMPGT - Branch if int comparison succeeds * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IF_ICMPGT extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ICMPGT() {} - - public IF_ICMPGT(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPGT, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IF_ICMPLE(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ICMPGT(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ICMPGT() { + } + + + public IF_ICMPGT(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ICMPGT, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ICMPLE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ICMPGT(this); + } } diff --git a/src/java/org/apache/bcel/generic/IF_ICMPLE.java b/src/java/org/apache/bcel/generic/IF_ICMPLE.java index 8ccdcad7..1762550e 100644 --- a/src/java/org/apache/bcel/generic/IF_ICMPLE.java +++ b/src/java/org/apache/bcel/generic/IF_ICMPLE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IF_ICMPLE - Branch if int comparison succeeds * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IF_ICMPLE extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ICMPLE() {} - - public IF_ICMPLE(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPLE, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IF_ICMPGT(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ICMPLE(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ICMPLE() { + } + + + public IF_ICMPLE(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ICMPLE, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ICMPGT(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ICMPLE(this); + } } diff --git a/src/java/org/apache/bcel/generic/IF_ICMPLT.java b/src/java/org/apache/bcel/generic/IF_ICMPLT.java index be9568ad..7aaba07c 100644 --- a/src/java/org/apache/bcel/generic/IF_ICMPLT.java +++ b/src/java/org/apache/bcel/generic/IF_ICMPLT.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IF_ICMPLT - Branch if int comparison succeeds * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IF_ICMPLT extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ICMPLT() {} - - public IF_ICMPLT(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPLT, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IF_ICMPGE(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ICMPLT(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ICMPLT() { + } + + + public IF_ICMPLT(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ICMPLT, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ICMPGE(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ICMPLT(this); + } } diff --git a/src/java/org/apache/bcel/generic/IF_ICMPNE.java b/src/java/org/apache/bcel/generic/IF_ICMPNE.java index b3e5c6ce..62b8882b 100644 --- a/src/java/org/apache/bcel/generic/IF_ICMPNE.java +++ b/src/java/org/apache/bcel/generic/IF_ICMPNE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IF_ICMPNE - Branch if int comparison doesn't succeed * @@ -26,36 +25,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IF_ICMPNE extends IfInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IF_ICMPNE() {} - - public IF_ICMPNE(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPNE, target); - } - - /** - * @return negation of instruction - */ - public IfInstruction negate() { - return new IF_ICMPEQ(target); - } - - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitBranchInstruction(this); - v.visitIfInstruction(this); - v.visitIF_ICMPNE(this); - } + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IF_ICMPNE() { + } + + + public IF_ICMPNE(InstructionHandle target) { + super(org.apache.bcel.Constants.IF_ICMPNE, target); + } + + + /** + * @return negation of instruction + */ + public IfInstruction negate() { + return new IF_ICMPEQ(target); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitBranchInstruction(this); + v.visitIfInstruction(this); + v.visitIF_ICMPNE(this); + } } diff --git a/src/java/org/apache/bcel/generic/IINC.java b/src/java/org/apache/bcel/generic/IINC.java index e9388ea5..e529f658 100644 --- a/src/java/org/apache/bcel/generic/IINC.java +++ b/src/java/org/apache/bcel/generic/IINC.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -27,121 +27,132 @@ import org.apache.bcel.util.ByteSequence; * @author M. Dahm */ public class IINC extends LocalVariableInstruction { - private boolean wide; - private int c; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IINC() {} - - /** - * @param n index of local variable - * @param c increment factor - */ - public IINC(int n, int c) { - super(); // Default behaviour of LocalVariableInstruction causes error - - this.opcode = org.apache.bcel.Constants.IINC; - this.length = (short)3; - - setIndex(n); // May set wide as side effect - setIncrement(c); - } - - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - if(wide) // Need WIDE prefix ? - out.writeByte(org.apache.bcel.Constants.WIDE); - - out.writeByte(opcode); - - if(wide) { - out.writeShort(n); - out.writeShort(c); - } else { - out.writeByte(n); - out.writeByte(c); + + private boolean wide; + private int c; + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IINC() { + } + + + /** + * @param n index of local variable + * @param c increment factor + */ + public IINC(int n, int c) { + super(); // Default behaviour of LocalVariableInstruction causes error + this.opcode = org.apache.bcel.Constants.IINC; + this.length = (short) 3; + setIndex(n); // May set wide as side effect + setIncrement(c); + } + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + if (wide) { + out.writeByte(org.apache.bcel.Constants.WIDE); + } + out.writeByte(opcode); + if (wide) { + out.writeShort(n); + out.writeShort(c); + } else { + out.writeByte(n); + out.writeByte(c); + } + } + + + private final void setWide() { + wide = (n > org.apache.bcel.Constants.MAX_BYTE) || (Math.abs(c) > Byte.MAX_VALUE); + if (wide) { + length = 6; // wide byte included + } else { + length = 3; + } + } + + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + this.wide = wide; + if (wide) { + length = 6; + n = bytes.readUnsignedShort(); + c = bytes.readShort(); + } else { + length = 3; + n = bytes.readUnsignedByte(); + c = bytes.readByte(); + } } - } - - private final void setWide() { - wide = (n > org.apache.bcel.Constants.MAX_BYTE) || (Math.abs(c) > Byte.MAX_VALUE); - if(wide) { - length = 6; // wide byte included - } else { - length = 3; + + + /** + * @return mnemonic for instruction + */ + public String toString( boolean verbose ) { + return super.toString(verbose) + " " + c; + } + + + /** + * Set index of local variable. + */ + public final void setIndex( int n ) { + if (n < 0) { + throw new ClassGenException("Negative index value: " + n); + } + this.n = n; + setWide(); + } + + + /** + * @return increment factor + */ + public final int getIncrement() { + return c; } - } - - /** - * Read needed data (e.g. index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException { - this.wide = wide; - - if(wide) { - length = 6; - n = bytes.readUnsignedShort(); - c = bytes.readShort(); - } else { - length = 3; - n = bytes.readUnsignedByte(); - c = bytes.readByte(); + + + /** + * Set increment factor. + */ + public final void setIncrement( int c ) { + this.c = c; + setWide(); + } + + + /** @return int type + */ + public Type getType( ConstantPoolGen cp ) { + return Type.INT; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitLocalVariableInstruction(this); + v.visitIINC(this); } - } - - /** - * @return mnemonic for instruction - */ - public String toString(boolean verbose) { - return super.toString(verbose) + " " + c; - } - - /** - * Set index of local variable. - */ - public final void setIndex(int n) { - if(n < 0) - throw new ClassGenException("Negative index value: " + n); - - this.n = n; - setWide(); - } - - /** - * @return increment factor - */ - public final int getIncrement() { return c; } - - /** - * Set increment factor. - */ - public final void setIncrement(int c) { - this.c = c; - setWide(); - } - - /** @return int type - */ - public Type getType(ConstantPoolGen cp) { - return Type.INT; - } - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitLocalVariableInstruction(this); - v.visitIINC(this); - } } diff --git a/src/java/org/apache/bcel/generic/ILOAD.java b/src/java/org/apache/bcel/generic/ILOAD.java index 747efe93..be66b423 100644 --- a/src/java/org/apache/bcel/generic/ILOAD.java +++ b/src/java/org/apache/bcel/generic/ILOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * ILOAD - Load int from local variable onto stack *
            Stack: ... -> ..., result
            @@ -25,31 +24,34 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class ILOAD extends LoadInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ILOAD() { - super(org.apache.bcel.Constants.ILOAD, org.apache.bcel.Constants.ILOAD_0); - } - /** Load int from local variable - * @param n index of local variable - */ - public ILOAD(int n) { - super(org.apache.bcel.Constants.ILOAD, org.apache.bcel.Constants.ILOAD_0, n); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ILOAD() { + super(org.apache.bcel.Constants.ILOAD, org.apache.bcel.Constants.ILOAD_0); + } + + + /** Load int from local variable + * @param n index of local variable + */ + public ILOAD(int n) { + super(org.apache.bcel.Constants.ILOAD, org.apache.bcel.Constants.ILOAD_0, n); + } + - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - super.accept(v); - v.visitILOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + super.accept(v); + v.visitILOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/IMPDEP1.java b/src/java/org/apache/bcel/generic/IMPDEP1.java index 536d8dc8..16fd4d71 100644 --- a/src/java/org/apache/bcel/generic/IMPDEP1.java +++ b/src/java/org/apache/bcel/generic/IMPDEP1.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IMPDEP1 - Implementation dependent * @@ -24,20 +23,21 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IMPDEP1 extends Instruction { - public IMPDEP1() { - super(org.apache.bcel.Constants.IMPDEP1, (short)1); - } + + public IMPDEP1() { + super(org.apache.bcel.Constants.IMPDEP1, (short) 1); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitIMPDEP1(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitIMPDEP1(this); + } } diff --git a/src/java/org/apache/bcel/generic/IMPDEP2.java b/src/java/org/apache/bcel/generic/IMPDEP2.java index ac722c2e..18273497 100644 --- a/src/java/org/apache/bcel/generic/IMPDEP2.java +++ b/src/java/org/apache/bcel/generic/IMPDEP2.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IMPDEP2 - Implementation dependent * @@ -24,20 +23,21 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IMPDEP2 extends Instruction { - public IMPDEP2() { - super(org.apache.bcel.Constants.IMPDEP2, (short)1); - } + + public IMPDEP2() { + super(org.apache.bcel.Constants.IMPDEP2, (short) 1); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitIMPDEP2(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitIMPDEP2(this); + } } diff --git a/src/java/org/apache/bcel/generic/IMUL.java b/src/java/org/apache/bcel/generic/IMUL.java index 38226675..5518a1b4 100644 --- a/src/java/org/apache/bcel/generic/IMUL.java +++ b/src/java/org/apache/bcel/generic/IMUL.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IMUL - Multiply ints *
            Stack: ..., value1, value2 -> result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IMUL extends ArithmeticInstruction { - /** Multiply ints - */ - public IMUL() { - super(org.apache.bcel.Constants.IMUL); - } + + /** Multiply ints + */ + public IMUL() { + super(org.apache.bcel.Constants.IMUL); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIMUL(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIMUL(this); + } } diff --git a/src/java/org/apache/bcel/generic/INEG.java b/src/java/org/apache/bcel/generic/INEG.java index a51f498b..290658e0 100644 --- a/src/java/org/apache/bcel/generic/INEG.java +++ b/src/java/org/apache/bcel/generic/INEG.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * INEG - Negate int *
            Stack: ..., value -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class INEG extends ArithmeticInstruction { - public INEG() { - super(org.apache.bcel.Constants.INEG); - } + + public INEG() { + super(org.apache.bcel.Constants.INEG); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitINEG(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitINEG(this); + } } diff --git a/src/java/org/apache/bcel/generic/INSTANCEOF.java b/src/java/org/apache/bcel/generic/INSTANCEOF.java index 40acf3fb..1562e156 100644 --- a/src/java/org/apache/bcel/generic/INSTANCEOF.java +++ b/src/java/org/apache/bcel/generic/INSTANCEOF.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * INSTANCEOF - Determine if object is of given type *
            Stack: ..., objectref -> ..., result
            @@ -24,46 +23,51 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class INSTANCEOF extends CPInstruction - implements LoadClass, ExceptionThrower, StackProducer, StackConsumer { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - INSTANCEOF() {} +public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThrower, + StackProducer, StackConsumer { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + INSTANCEOF() { + } + + + public INSTANCEOF(int index) { + super(org.apache.bcel.Constants.INSTANCEOF, index); + } - public INSTANCEOF(int index) { - super(org.apache.bcel.Constants.INSTANCEOF, index); - } - public Class[] getExceptions() { - return org.apache.bcel.ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION; - } + public Class[] getExceptions() { + return org.apache.bcel.ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION; + } - public ObjectType getLoadClassType(ConstantPoolGen cpg) { - Type t = getType(cpg); - if(t instanceof ArrayType) - t = ((ArrayType) t).getBasicType(); + public ObjectType getLoadClassType( ConstantPoolGen cpg ) { + Type t = getType(cpg); + if (t instanceof ArrayType) { + t = ((ArrayType) t).getBasicType(); + } + return (t instanceof ObjectType) ? (ObjectType) t : null; + } - return (t instanceof ObjectType)? (ObjectType) t : null; - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitLoadClass(this); - v.visitExceptionThrower(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitINSTANCEOF(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitLoadClass(this); + v.visitExceptionThrower(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitINSTANCEOF(this); + } } diff --git a/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java index 7a3b5c66..db5118aa 100644 --- a/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -31,96 +31,102 @@ import org.apache.bcel.util.ByteSequence; * @author M. Dahm */ public final class INVOKEINTERFACE extends InvokeInstruction { - private int nargs; // Number of arguments on stack (number of stack slots), called "count" in vmspec2 - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - INVOKEINTERFACE() {} - - public INVOKEINTERFACE(int index, int nargs) { - super(Constants.INVOKEINTERFACE, index); - length = 5; - - if(nargs < 1) - throw new ClassGenException("Number of arguments must be > 0 " + nargs); - - this.nargs = nargs; - } - - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - out.writeShort(index); - out.writeByte(nargs); - out.writeByte(0); - } - - /** - * The count argument according to the Java Language Specification, - * Second Edition. - */ - public int getCount() { return nargs; } - - /** - * Read needed data (i.e., index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException - { - super.initFromFile(bytes, wide); - - length = 5; - nargs = bytes.readUnsignedByte(); - bytes.readByte(); // Skip 0 byte - } - - /** - * @return mnemonic for instruction with symbolic references resolved - */ - public String toString(ConstantPool cp) { - return super.toString(cp) + " " + nargs; - } - - public int consumeStack(ConstantPoolGen cpg) { // nargs is given in byte-code - return nargs; // nargs includes this reference - } - - public Class[] getExceptions() { - Class[] cs = new Class[4 + ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length]; - - System.arraycopy(ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION, 0, - cs, 0, ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length); - - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length+3] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length+2] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length+1] = ExceptionConstants.ABSTRACT_METHOD_ERROR; - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - - return cs; - } - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitStackProducer(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitInvokeInstruction(this); - v.visitINVOKEINTERFACE(this); - } + + private int nargs; // Number of arguments on stack (number of stack slots), called "count" in vmspec2 + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + INVOKEINTERFACE() { + } + + + public INVOKEINTERFACE(int index, int nargs) { + super(Constants.INVOKEINTERFACE, index); + length = 5; + if (nargs < 1) { + throw new ClassGenException("Number of arguments must be > 0 " + nargs); + } + this.nargs = nargs; + } + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + out.writeByte(opcode); + out.writeShort(index); + out.writeByte(nargs); + out.writeByte(0); + } + + + /** + * The count argument according to the Java Language Specification, + * Second Edition. + */ + public int getCount() { + return nargs; + } + + + /** + * Read needed data (i.e., index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + super.initFromFile(bytes, wide); + length = 5; + nargs = bytes.readUnsignedByte(); + bytes.readByte(); // Skip 0 byte + } + + + /** + * @return mnemonic for instruction with symbolic references resolved + */ + public String toString( ConstantPool cp ) { + return super.toString(cp) + " " + nargs; + } + + + public int consumeStack( ConstantPoolGen cpg ) { // nargs is given in byte-code + return nargs; // nargs includes this reference + } + + + public Class[] getExceptions() { + Class[] cs = new Class[4 + ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length); + cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 3] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 2] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; + cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 1] = ExceptionConstants.ABSTRACT_METHOD_ERROR; + cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length] = ExceptionConstants.UNSATISFIED_LINK_ERROR; + return cs; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitInvokeInstruction(this); + v.visitINVOKEINTERFACE(this); + } } diff --git a/src/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/java/org/apache/bcel/generic/INVOKESPECIAL.java index 4063afe2..ed09e72f 100644 --- a/src/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.Constants; @@ -29,48 +29,49 @@ import org.apache.bcel.ExceptionConstants; * @author M. Dahm */ public class INVOKESPECIAL extends InvokeInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - INVOKESPECIAL() {} - public INVOKESPECIAL(int index) { - super(Constants.INVOKESPECIAL, index); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + INVOKESPECIAL() { + } - public Class[] getExceptions() { - Class[] cs = new Class[4 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, - cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + public INVOKESPECIAL(int index) { + super(Constants.INVOKESPECIAL, index); + } - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+3] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+2] = ExceptionConstants.ABSTRACT_METHOD_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; - return cs; - } + public Class[] getExceptions() { + Class[] cs = new Class[4 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 3] = ExceptionConstants.UNSATISFIED_LINK_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 2] = ExceptionConstants.ABSTRACT_METHOD_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; + return cs; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitStackProducer(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitInvokeInstruction(this); - v.visitINVOKESPECIAL(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitInvokeInstruction(this); + v.visitINVOKESPECIAL(this); + } } diff --git a/src/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/java/org/apache/bcel/generic/INVOKESTATIC.java index f1d3a85b..1e1d14cc 100644 --- a/src/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.Constants; @@ -28,46 +28,47 @@ import org.apache.bcel.ExceptionConstants; * @author M. Dahm */ public class INVOKESTATIC extends InvokeInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - INVOKESTATIC() {} - public INVOKESTATIC(int index) { - super(Constants.INVOKESTATIC, index); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + INVOKESTATIC() { + } - public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, - cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + public INVOKESTATIC(int index) { + super(Constants.INVOKESTATIC, index); + } - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - return cs; - } + public Class[] getExceptions() { + Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.UNSATISFIED_LINK_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + return cs; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitStackProducer(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitInvokeInstruction(this); - v.visitINVOKESTATIC(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitInvokeInstruction(this); + v.visitINVOKESTATIC(this); + } } diff --git a/src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java index 5c1391ca..b967a67c 100644 --- a/src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.Constants; @@ -28,48 +28,49 @@ import org.apache.bcel.ExceptionConstants; * @author M. Dahm */ public class INVOKEVIRTUAL extends InvokeInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - INVOKEVIRTUAL() {} - public INVOKEVIRTUAL(int index) { - super(Constants.INVOKEVIRTUAL, index); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + INVOKEVIRTUAL() { + } - public Class[] getExceptions() { - Class[] cs = new Class[4 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, - cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + public INVOKEVIRTUAL(int index) { + super(Constants.INVOKEVIRTUAL, index); + } - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+3] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+2] = ExceptionConstants.ABSTRACT_METHOD_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; - return cs; - } + public Class[] getExceptions() { + Class[] cs = new Class[4 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 3] = ExceptionConstants.UNSATISFIED_LINK_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 2] = ExceptionConstants.ABSTRACT_METHOD_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; + return cs; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitStackProducer(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitInvokeInstruction(this); - v.visitINVOKEVIRTUAL(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitInvokeInstruction(this); + v.visitINVOKEVIRTUAL(this); + } } diff --git a/src/java/org/apache/bcel/generic/IOR.java b/src/java/org/apache/bcel/generic/IOR.java index 5e106ffa..34c35917 100644 --- a/src/java/org/apache/bcel/generic/IOR.java +++ b/src/java/org/apache/bcel/generic/IOR.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IOR - Bitwise OR int *
            Stack: ..., value1, value2 -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IOR extends ArithmeticInstruction { - public IOR() { - super(org.apache.bcel.Constants.IOR); - } + + public IOR() { + super(org.apache.bcel.Constants.IOR); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIOR(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIOR(this); + } } diff --git a/src/java/org/apache/bcel/generic/IREM.java b/src/java/org/apache/bcel/generic/IREM.java index a868d97a..3ec21502 100644 --- a/src/java/org/apache/bcel/generic/IREM.java +++ b/src/java/org/apache/bcel/generic/IREM.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IREM - Remainder of int *
            Stack: ..., value1, value2 -> result
            @@ -25,33 +24,37 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IREM extends ArithmeticInstruction implements ExceptionThrower { - /** Remainder of ints - */ - public IREM() { - super(org.apache.bcel.Constants.IREM); - } - /** @return exceptions this instruction may cause - */ - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION }; - } + /** Remainder of ints + */ + public IREM() { + super(org.apache.bcel.Constants.IREM); + } + + + /** @return exceptions this instruction may cause + */ + public Class[] getExceptions() { + return new Class[] { + org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION + }; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIREM(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIREM(this); + } } diff --git a/src/java/org/apache/bcel/generic/IRETURN.java b/src/java/org/apache/bcel/generic/IRETURN.java index 3b09cc19..7e9788dd 100644 --- a/src/java/org/apache/bcel/generic/IRETURN.java +++ b/src/java/org/apache/bcel/generic/IRETURN.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IRETURN - Return int from method *
            Stack: ..., value -> <empty>
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IRETURN extends ReturnInstruction { - /** Return int from method - */ - public IRETURN() { - super(org.apache.bcel.Constants.IRETURN); - } + + /** Return int from method + */ + public IRETURN() { + super(org.apache.bcel.Constants.IRETURN); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitReturnInstruction(this); - v.visitIRETURN(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitReturnInstruction(this); + v.visitIRETURN(this); + } } diff --git a/src/java/org/apache/bcel/generic/ISHL.java b/src/java/org/apache/bcel/generic/ISHL.java index 9a6ba41f..abb8db2b 100644 --- a/src/java/org/apache/bcel/generic/ISHL.java +++ b/src/java/org/apache/bcel/generic/ISHL.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * ISHL - Arithmetic shift left int *
            Stack: ..., value1, value2 -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class ISHL extends ArithmeticInstruction { - public ISHL() { - super(org.apache.bcel.Constants.ISHL); - } + + public ISHL() { + super(org.apache.bcel.Constants.ISHL); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitISHL(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitISHL(this); + } } diff --git a/src/java/org/apache/bcel/generic/ISHR.java b/src/java/org/apache/bcel/generic/ISHR.java index 347df43e..1ce4f8bf 100644 --- a/src/java/org/apache/bcel/generic/ISHR.java +++ b/src/java/org/apache/bcel/generic/ISHR.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * ISHR - Arithmetic shift right int *
            Stack: ..., value1, value2 -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class ISHR extends ArithmeticInstruction { - public ISHR() { - super(org.apache.bcel.Constants.ISHR); - } + + public ISHR() { + super(org.apache.bcel.Constants.ISHR); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitISHR(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitISHR(this); + } } diff --git a/src/java/org/apache/bcel/generic/ISTORE.java b/src/java/org/apache/bcel/generic/ISTORE.java index f7ee83b5..af49f237 100644 --- a/src/java/org/apache/bcel/generic/ISTORE.java +++ b/src/java/org/apache/bcel/generic/ISTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * ISTORE - Store int from stack into local variable *
            Stack: ..., value -> ... 
            @@ -25,31 +24,34 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class ISTORE extends StoreInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ISTORE() { - super(org.apache.bcel.Constants.ISTORE, org.apache.bcel.Constants.ISTORE_0); - } - /** Store int into local variable - * @param n index of local variable - */ - public ISTORE(int n) { - super(org.apache.bcel.Constants.ISTORE, org.apache.bcel.Constants.ISTORE_0, n); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ISTORE() { + super(org.apache.bcel.Constants.ISTORE, org.apache.bcel.Constants.ISTORE_0); + } + + + /** Store int into local variable + * @param n index of local variable + */ + public ISTORE(int n) { + super(org.apache.bcel.Constants.ISTORE, org.apache.bcel.Constants.ISTORE_0, n); + } + - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - super.accept(v); - v.visitISTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + super.accept(v); + v.visitISTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/ISUB.java b/src/java/org/apache/bcel/generic/ISUB.java index 19d1f459..4e86e0b7 100644 --- a/src/java/org/apache/bcel/generic/ISUB.java +++ b/src/java/org/apache/bcel/generic/ISUB.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * ISUB - Substract ints *
            Stack: ..., value1, value2 -> result
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class ISUB extends ArithmeticInstruction { - /** Substract ints - */ - public ISUB() { - super(org.apache.bcel.Constants.ISUB); - } + + /** Substract ints + */ + public ISUB() { + super(org.apache.bcel.Constants.ISUB); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitISUB(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitISUB(this); + } } diff --git a/src/java/org/apache/bcel/generic/IUSHR.java b/src/java/org/apache/bcel/generic/IUSHR.java index aab9e988..10d68515 100644 --- a/src/java/org/apache/bcel/generic/IUSHR.java +++ b/src/java/org/apache/bcel/generic/IUSHR.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IUSHR - Logical shift right int *
            Stack: ..., value1, value2 -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IUSHR extends ArithmeticInstruction { - public IUSHR() { - super(org.apache.bcel.Constants.IUSHR); - } + + public IUSHR() { + super(org.apache.bcel.Constants.IUSHR); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIUSHR(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIUSHR(this); + } } diff --git a/src/java/org/apache/bcel/generic/IXOR.java b/src/java/org/apache/bcel/generic/IXOR.java index 430d1461..6bcf7beb 100644 --- a/src/java/org/apache/bcel/generic/IXOR.java +++ b/src/java/org/apache/bcel/generic/IXOR.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * IXOR - Bitwise XOR int *
            Stack: ..., value1, value2 -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class IXOR extends ArithmeticInstruction { - public IXOR() { - super(org.apache.bcel.Constants.IXOR); - } + + public IXOR() { + super(org.apache.bcel.Constants.IXOR); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitIXOR(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitIXOR(this); + } } diff --git a/src/java/org/apache/bcel/generic/IfInstruction.java b/src/java/org/apache/bcel/generic/IfInstruction.java index b35e0edb..60460ea7 100644 --- a/src/java/org/apache/bcel/generic/IfInstruction.java +++ b/src/java/org/apache/bcel/generic/IfInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Super class for the IFxxx family of instructions. * @@ -24,23 +23,26 @@ package org.apache.bcel.generic; * @author M. Dahm */ public abstract class IfInstruction extends BranchInstruction implements StackConsumer { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - IfInstruction() {} - /** - * @param opcode opcode of instruction - * @param target Target instruction to branch to - */ - protected IfInstruction(short opcode, InstructionHandle target) { - super(opcode, target); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + IfInstruction() { + } - /** - * @return negation of instruction, e.g. IFEQ.negate() == IFNE - */ - public abstract IfInstruction negate(); -} + /** + * @param opcode opcode of instruction + * @param target Target instruction to branch to + */ + protected IfInstruction(short opcode, InstructionHandle target) { + super(opcode, target); + } + + + /** + * @return negation of instruction, e.g. IFEQ.negate() == IFNE + */ + public abstract IfInstruction negate(); +} diff --git a/src/java/org/apache/bcel/generic/IndexedInstruction.java b/src/java/org/apache/bcel/generic/IndexedInstruction.java index 2fbdf502..88b3e642 100644 --- a/src/java/org/apache/bcel/generic/IndexedInstruction.java +++ b/src/java/org/apache/bcel/generic/IndexedInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denote entity that refers to an index, e.g. local variable instructions, * RET, CPInstruction, etc. @@ -25,7 +24,9 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface IndexedInstruction { - public int getIndex(); - public void setIndex(int index); -} + public int getIndex(); + + + public void setIndex( int index ); +} diff --git a/src/java/org/apache/bcel/generic/Instruction.java b/src/java/org/apache/bcel/generic/Instruction.java index ee385a0d..31501fe9 100644 --- a/src/java/org/apache/bcel/generic/Instruction.java +++ b/src/java/org/apache/bcel/generic/Instruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; @@ -32,239 +31,262 @@ import org.apache.bcel.util.ByteSequence; * @author M. Dahm */ public abstract class Instruction implements Cloneable, Serializable { - protected short length = 1; // Length of instruction in bytes - protected short opcode = -1; // Opcode number - - private static InstructionComparator cmp = InstructionComparator.DEFAULT; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - Instruction() {} - - public Instruction(short opcode, short length) { - this.length = length; - this.opcode = opcode; - } - - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); // Common for all instructions - } - - /** @return name of instruction, i.e., opcode name - */ - public String getName() { - return Constants.OPCODE_NAMES[opcode]; - } - - /** - * Long output format: - * - * <name of opcode> "["<opcode number>"]" - * "("<length of instruction>")" - * - * @param verbose long/short format switch - * @return mnemonic for instruction - */ - public String toString(boolean verbose) { - if(verbose) - return getName() + "[" + opcode + "](" + length + ")"; - else - return getName(); - } - - /** - * @return mnemonic for instruction in verbose format - */ - public String toString() { - return toString(true); - } - - /** - * @return mnemonic for instruction with sumbolic references resolved - */ - public String toString(ConstantPool cp) { - return toString(false); - } - - /** - * Use with caution, since `BranchInstruction's have a `target' reference which - * is not copied correctly (only basic types are). This also applies for - * `Select' instructions with their multiple branch targets. - * - * @see BranchInstruction - * @return (shallow) copy of an instruction - */ - public Instruction copy() { - Instruction i = null; - - // "Constant" instruction, no need to duplicate - if(InstructionConstants.INSTRUCTIONS[this.getOpcode()] != null) - i = this; - else { - try { - i = (Instruction)clone(); - } catch(CloneNotSupportedException e) { - System.err.println(e); - } + + protected short length = 1; // Length of instruction in bytes + protected short opcode = -1; // Opcode number + private static InstructionComparator cmp = InstructionComparator.DEFAULT; + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + Instruction() { + } + + + public Instruction(short opcode, short length) { + this.length = length; + this.opcode = opcode; + } + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + out.writeByte(opcode); // Common for all instructions + } + + + /** @return name of instruction, i.e., opcode name + */ + public String getName() { + return Constants.OPCODE_NAMES[opcode]; + } + + + /** + * Long output format: + * + * <name of opcode> "["<opcode number>"]" + * "("<length of instruction>")" + * + * @param verbose long/short format switch + * @return mnemonic for instruction + */ + public String toString( boolean verbose ) { + if (verbose) { + return getName() + "[" + opcode + "](" + length + ")"; + } else { + return getName(); + } + } + + + /** + * @return mnemonic for instruction in verbose format + */ + public String toString() { + return toString(true); + } + + + /** + * @return mnemonic for instruction with sumbolic references resolved + */ + public String toString( ConstantPool cp ) { + return toString(false); + } + + + /** + * Use with caution, since `BranchInstruction's have a `target' reference which + * is not copied correctly (only basic types are). This also applies for + * `Select' instructions with their multiple branch targets. + * + * @see BranchInstruction + * @return (shallow) copy of an instruction + */ + public Instruction copy() { + Instruction i = null; + // "Constant" instruction, no need to duplicate + if (InstructionConstants.INSTRUCTIONS[this.getOpcode()] != null) { + i = this; + } else { + try { + i = (Instruction) clone(); + } catch (CloneNotSupportedException e) { + System.err.println(e); + } + } + return i; + } + + + /** + * Read needed data (e.g. index) from file. + * + * @param bytes byte sequence to read from + * @param wide "wide" instruction flag + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + } + + + /** + * Read an instruction from (byte code) input stream and return the + * appropiate object. + * + * @param bytes input stream bytes + * @return instruction object being read + */ + public static final Instruction readInstruction( ByteSequence bytes ) throws IOException { + boolean wide = false; + short opcode = (short) bytes.readUnsignedByte(); + Instruction obj = null; + if (opcode == Constants.WIDE) { // Read next opcode after wide byte + wide = true; + opcode = (short) bytes.readUnsignedByte(); + } + if (InstructionConstants.INSTRUCTIONS[opcode] != null) { + return InstructionConstants.INSTRUCTIONS[opcode]; // Used predefined immutable object, if available + } + /* Find appropiate class, instantiate an (empty) instruction object + * and initialize it by hand. + */ + Class clazz; + try { + clazz = Class.forName(className(opcode)); + } catch (ClassNotFoundException cnfe) { + // If a class by that name does not exist, the opcode is illegal. + // Note that IMPDEP1, IMPDEP2, BREAKPOINT are also illegal in a sense. + throw new ClassGenException("Illegal opcode detected."); + } + try { + obj = (Instruction) clazz.newInstance(); + if (wide + && !((obj instanceof LocalVariableInstruction) || (obj instanceof IINC) || (obj instanceof RET))) { + throw new Exception("Illegal opcode after wide: " + opcode); + } + obj.setOpcode(opcode); + obj.initFromFile(bytes, wide); // Do further initializations, if any + // Byte code offset set in InstructionList + } catch (Exception e) { + throw new ClassGenException(e.toString()); + } + return obj; + } + + + private static final String className( short opcode ) { + String name = Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH); + /* ICONST_0, etc. will be shortened to ICONST, etc., since ICONST_0 and the like + * are not implemented (directly). + */ + try { + int len = name.length(); + char ch1 = name.charAt(len - 2), ch2 = name.charAt(len - 1); + if ((ch1 == '_') && (ch2 >= '0') && (ch2 <= '5')) { + name = name.substring(0, len - 2); + } + if (name.equals("ICONST_M1")) { + name = "ICONST"; + } + } catch (StringIndexOutOfBoundsException e) { + System.err.println(e); + } + return "org.apache.bcel.generic." + name; } - return i; - } - - /** - * Read needed data (e.g. index) from file. - * - * @param bytes byte sequence to read from - * @param wide "wide" instruction flag - */ - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException - {} - - /** - * Read an instruction from (byte code) input stream and return the - * appropiate object. - * - * @param bytes input stream bytes - * @return instruction object being read - */ - public static final Instruction readInstruction(ByteSequence bytes) - throws IOException - { - boolean wide = false; - short opcode = (short)bytes.readUnsignedByte(); - Instruction obj = null; - - if(opcode == Constants.WIDE) { // Read next opcode after wide byte - wide = true; - opcode = (short)bytes.readUnsignedByte(); + + /** + * This method also gives right results for instructions whose + * effect on the stack depends on the constant pool entry they + * reference. + * @return Number of words consumed from stack by this instruction, + * or Constants.UNPREDICTABLE, if this can not be computed statically + */ + public int consumeStack( ConstantPoolGen cpg ) { + return Constants.CONSUME_STACK[opcode]; } - if(InstructionConstants.INSTRUCTIONS[opcode] != null) - return InstructionConstants.INSTRUCTIONS[opcode]; // Used predefined immutable object, if available - /* Find appropiate class, instantiate an (empty) instruction object - * and initialize it by hand. + /** + * This method also gives right results for instructions whose + * effect on the stack depends on the constant pool entry they + * reference. + * @return Number of words produced onto stack by this instruction, + * or Constants.UNPREDICTABLE, if this can not be computed statically */ - Class clazz; - - try { - clazz = Class.forName(className(opcode)); - } catch (ClassNotFoundException cnfe){ - // If a class by that name does not exist, the opcode is illegal. - // Note that IMPDEP1, IMPDEP2, BREAKPOINT are also illegal in a sense. - throw new ClassGenException("Illegal opcode detected."); + public int produceStack( ConstantPoolGen cpg ) { + return Constants.PRODUCE_STACK[opcode]; } - try { - obj = (Instruction)clazz.newInstance(); - if(wide && !((obj instanceof LocalVariableInstruction) || - (obj instanceof IINC) || - (obj instanceof RET))) - throw new Exception("Illegal opcode after wide: " + opcode); + /** + * @return this instructions opcode + */ + public short getOpcode() { + return opcode; + } - obj.setOpcode(opcode); - obj.initFromFile(bytes, wide); // Do further initializations, if any - // Byte code offset set in InstructionList - } catch(Exception e) { throw new ClassGenException(e.toString()); } - return obj; - } + /** + * @return length (in bytes) of instruction + */ + public int getLength() { + return length; + } - private static final String className(short opcode) { - String name = Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH); - /* ICONST_0, etc. will be shortened to ICONST, etc., since ICONST_0 and the like - * are not implemented (directly). + /** + * Needed in readInstruction. */ - try { - int len = name.length(); - char ch1 = name.charAt(len - 2), ch2 = name.charAt(len - 1); - - if((ch1 == '_') && (ch2 >= '0') && (ch2 <= '5')) - name = name.substring(0, len - 2); - - if(name.equals("ICONST_M1")) // Special case - name = "ICONST"; - } catch(StringIndexOutOfBoundsException e) { System.err.println(e); } - - return "org.apache.bcel.generic." + name; - } - - /** - * This method also gives right results for instructions whose - * effect on the stack depends on the constant pool entry they - * reference. - * @return Number of words consumed from stack by this instruction, - * or Constants.UNPREDICTABLE, if this can not be computed statically - */ - public int consumeStack(ConstantPoolGen cpg) { - return Constants.CONSUME_STACK[opcode]; - } - - /** - * This method also gives right results for instructions whose - * effect on the stack depends on the constant pool entry they - * reference. - * @return Number of words produced onto stack by this instruction, - * or Constants.UNPREDICTABLE, if this can not be computed statically - */ - public int produceStack(ConstantPoolGen cpg) { - return Constants.PRODUCE_STACK[opcode]; - } - - /** - * @return this instructions opcode - */ - public short getOpcode() { return opcode; } - - /** - * @return length (in bytes) of instruction - */ - public int getLength() { return length; } - - /** - * Needed in readInstruction. - */ - private void setOpcode(short opcode) { this.opcode = opcode; } - - /** Some instructions may be reused, so don't do anything by default. - */ - void dispose() {} - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public abstract void accept(Visitor v); - - /** Get Comparator object used in the equals() method to determine - * equality of instructions. - * - * @return currently used comparator for equals() - */ - public static InstructionComparator getComparator() { return cmp; } - - /** Set comparator to be used for equals(). - */ - public static void setComparator(InstructionComparator c) { cmp = c; } - - /** Check for equality, delegated to comparator - * @return true if that is an Instruction and has the same opcode - */ - public boolean equals(Object that) { - return (that instanceof Instruction)? - cmp.equals(this, (Instruction)that) : false; - } + private void setOpcode( short opcode ) { + this.opcode = opcode; + } + + + /** Some instructions may be reused, so don't do anything by default. + */ + void dispose() { + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public abstract void accept( Visitor v ); + + + /** Get Comparator object used in the equals() method to determine + * equality of instructions. + * + * @return currently used comparator for equals() + */ + public static InstructionComparator getComparator() { + return cmp; + } + + + /** Set comparator to be used for equals(). + */ + public static void setComparator( InstructionComparator c ) { + cmp = c; + } + + + /** Check for equality, delegated to comparator + * @return true if that is an Instruction and has the same opcode + */ + public boolean equals( Object that ) { + return (that instanceof Instruction) ? cmp.equals(this, (Instruction) that) : false; + } } diff --git a/src/java/org/apache/bcel/generic/InstructionComparator.java b/src/java/org/apache/bcel/generic/InstructionComparator.java index 01945a47..87a6ddb6 100644 --- a/src/java/org/apache/bcel/generic/InstructionComparator.java +++ b/src/java/org/apache/bcel/generic/InstructionComparator.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Equality of instructions isn't clearly to be defined. You might * wish, for example, to compare whether instructions have the same @@ -31,42 +30,40 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface InstructionComparator { - public static final InstructionComparator DEFAULT = - new InstructionComparator() { - public boolean equals(Instruction i1, Instruction i2) { - if(i1.opcode == i2.opcode) { - if(i1 instanceof Select) { - InstructionHandle[] t1 = ((Select)i1).getTargets(); - InstructionHandle[] t2 = ((Select)i2).getTargets(); - if(t1.length == t2.length) { - for(int i = 0; i < t1.length; i++) { - if(t1[i] != t2[i]) { - return false; - } - } - - return true; - } - } else if(i1 instanceof BranchInstruction) { - return ((BranchInstruction)i1).target == - ((BranchInstruction)i2).target; - } else if(i1 instanceof ConstantPushInstruction) { - return ((ConstantPushInstruction)i1).getValue(). - equals(((ConstantPushInstruction)i2).getValue()); - } else if(i1 instanceof IndexedInstruction) { - return ((IndexedInstruction)i1).getIndex() == - ((IndexedInstruction)i2).getIndex(); - } else if(i1 instanceof NEWARRAY) { - return ((NEWARRAY)i1).getTypecode() == ((NEWARRAY)i2).getTypecode(); - } else { - return true; - } - } + public static final InstructionComparator DEFAULT = new InstructionComparator() { + + public boolean equals( Instruction i1, Instruction i2 ) { + if (i1.opcode == i2.opcode) { + if (i1 instanceof Select) { + InstructionHandle[] t1 = ((Select) i1).getTargets(); + InstructionHandle[] t2 = ((Select) i2).getTargets(); + if (t1.length == t2.length) { + for (int i = 0; i < t1.length; i++) { + if (t1[i] != t2[i]) { + return false; + } + } + return true; + } + } else if (i1 instanceof BranchInstruction) { + return ((BranchInstruction) i1).target == ((BranchInstruction) i2).target; + } else if (i1 instanceof ConstantPushInstruction) { + return ((ConstantPushInstruction) i1).getValue().equals( + ((ConstantPushInstruction) i2).getValue()); + } else if (i1 instanceof IndexedInstruction) { + return ((IndexedInstruction) i1).getIndex() == ((IndexedInstruction) i2) + .getIndex(); + } else if (i1 instanceof NEWARRAY) { + return ((NEWARRAY) i1).getTypecode() == ((NEWARRAY) i2).getTypecode(); + } else { + return true; + } + } + return false; + } + }; - return false; - } - }; - public boolean equals(Instruction i1, Instruction i2); + public boolean equals( Instruction i1, Instruction i2 ); } diff --git a/src/java/org/apache/bcel/generic/InstructionConstants.java b/src/java/org/apache/bcel/generic/InstructionConstants.java index 531e6092..ff85c67b 100644 --- a/src/java/org/apache/bcel/generic/InstructionConstants.java +++ b/src/java/org/apache/bcel/generic/InstructionConstants.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import org.apache.bcel.Constants; /** @@ -37,253 +36,251 @@ import org.apache.bcel.Constants; * @author M. Dahm */ public interface InstructionConstants { - /** Predefined instruction objects - */ - public static final Instruction NOP = new NOP(); - public static final Instruction ACONST_NULL = new ACONST_NULL(); - public static final Instruction ICONST_M1 = new ICONST(-1); - public static final Instruction ICONST_0 = new ICONST(0); - public static final Instruction ICONST_1 = new ICONST(1); - public static final Instruction ICONST_2 = new ICONST(2); - public static final Instruction ICONST_3 = new ICONST(3); - public static final Instruction ICONST_4 = new ICONST(4); - public static final Instruction ICONST_5 = new ICONST(5); - public static final Instruction LCONST_0 = new LCONST(0); - public static final Instruction LCONST_1 = new LCONST(1); - public static final Instruction FCONST_0 = new FCONST(0); - public static final Instruction FCONST_1 = new FCONST(1); - public static final Instruction FCONST_2 = new FCONST(2); - public static final Instruction DCONST_0 = new DCONST(0); - public static final Instruction DCONST_1 = new DCONST(1); - public static final ArrayInstruction IALOAD = new IALOAD(); - public static final ArrayInstruction LALOAD = new LALOAD(); - public static final ArrayInstruction FALOAD = new FALOAD(); - public static final ArrayInstruction DALOAD = new DALOAD(); - public static final ArrayInstruction AALOAD = new AALOAD(); - public static final ArrayInstruction BALOAD = new BALOAD(); - public static final ArrayInstruction CALOAD = new CALOAD(); - public static final ArrayInstruction SALOAD = new SALOAD(); - public static final ArrayInstruction IASTORE = new IASTORE(); - public static final ArrayInstruction LASTORE = new LASTORE(); - public static final ArrayInstruction FASTORE = new FASTORE(); - public static final ArrayInstruction DASTORE = new DASTORE(); - public static final ArrayInstruction AASTORE = new AASTORE(); - public static final ArrayInstruction BASTORE = new BASTORE(); - public static final ArrayInstruction CASTORE = new CASTORE(); - public static final ArrayInstruction SASTORE = new SASTORE(); - public static final StackInstruction POP = new POP(); - public static final StackInstruction POP2 = new POP2(); - public static final StackInstruction DUP = new DUP(); - public static final StackInstruction DUP_X1 = new DUP_X1(); - public static final StackInstruction DUP_X2 = new DUP_X2(); - public static final StackInstruction DUP2 = new DUP2(); - public static final StackInstruction DUP2_X1 = new DUP2_X1(); - public static final StackInstruction DUP2_X2 = new DUP2_X2(); - public static final StackInstruction SWAP = new SWAP(); - public static final ArithmeticInstruction IADD = new IADD(); - public static final ArithmeticInstruction LADD = new LADD(); - public static final ArithmeticInstruction FADD = new FADD(); - public static final ArithmeticInstruction DADD = new DADD(); - public static final ArithmeticInstruction ISUB = new ISUB(); - public static final ArithmeticInstruction LSUB = new LSUB(); - public static final ArithmeticInstruction FSUB = new FSUB(); - public static final ArithmeticInstruction DSUB = new DSUB(); - public static final ArithmeticInstruction IMUL = new IMUL(); - public static final ArithmeticInstruction LMUL = new LMUL(); - public static final ArithmeticInstruction FMUL = new FMUL(); - public static final ArithmeticInstruction DMUL = new DMUL(); - public static final ArithmeticInstruction IDIV = new IDIV(); - public static final ArithmeticInstruction LDIV = new LDIV(); - public static final ArithmeticInstruction FDIV = new FDIV(); - public static final ArithmeticInstruction DDIV = new DDIV(); - public static final ArithmeticInstruction IREM = new IREM(); - public static final ArithmeticInstruction LREM = new LREM(); - public static final ArithmeticInstruction FREM = new FREM(); - public static final ArithmeticInstruction DREM = new DREM(); - public static final ArithmeticInstruction INEG = new INEG(); - public static final ArithmeticInstruction LNEG = new LNEG(); - public static final ArithmeticInstruction FNEG = new FNEG(); - public static final ArithmeticInstruction DNEG = new DNEG(); - public static final ArithmeticInstruction ISHL = new ISHL(); - public static final ArithmeticInstruction LSHL = new LSHL(); - public static final ArithmeticInstruction ISHR = new ISHR(); - public static final ArithmeticInstruction LSHR = new LSHR(); - public static final ArithmeticInstruction IUSHR = new IUSHR(); - public static final ArithmeticInstruction LUSHR = new LUSHR(); - public static final ArithmeticInstruction IAND = new IAND(); - public static final ArithmeticInstruction LAND = new LAND(); - public static final ArithmeticInstruction IOR = new IOR(); - public static final ArithmeticInstruction LOR = new LOR(); - public static final ArithmeticInstruction IXOR = new IXOR(); - public static final ArithmeticInstruction LXOR = new LXOR(); - public static final ConversionInstruction I2L = new I2L(); - public static final ConversionInstruction I2F = new I2F(); - public static final ConversionInstruction I2D = new I2D(); - public static final ConversionInstruction L2I = new L2I(); - public static final ConversionInstruction L2F = new L2F(); - public static final ConversionInstruction L2D = new L2D(); - public static final ConversionInstruction F2I = new F2I(); - public static final ConversionInstruction F2L = new F2L(); - public static final ConversionInstruction F2D = new F2D(); - public static final ConversionInstruction D2I = new D2I(); - public static final ConversionInstruction D2L = new D2L(); - public static final ConversionInstruction D2F = new D2F(); - public static final ConversionInstruction I2B = new I2B(); - public static final ConversionInstruction I2C = new I2C(); - public static final ConversionInstruction I2S = new I2S(); - public static final Instruction LCMP = new LCMP(); - public static final Instruction FCMPL = new FCMPL(); - public static final Instruction FCMPG = new FCMPG(); - public static final Instruction DCMPL = new DCMPL(); - public static final Instruction DCMPG = new DCMPG(); - public static final ReturnInstruction IRETURN = new IRETURN(); - public static final ReturnInstruction LRETURN = new LRETURN(); - public static final ReturnInstruction FRETURN = new FRETURN(); - public static final ReturnInstruction DRETURN = new DRETURN(); - public static final ReturnInstruction ARETURN = new ARETURN(); - public static final ReturnInstruction RETURN = new RETURN(); - public static final Instruction ARRAYLENGTH = new ARRAYLENGTH(); - public static final Instruction ATHROW = new ATHROW(); - public static final Instruction MONITORENTER = new MONITORENTER(); - public static final Instruction MONITOREXIT = new MONITOREXIT(); - - /** You can use these constants in multiple places safely, if you can guarantee - * that you will never alter their internal values, e.g. call setIndex(). - */ - public static final LocalVariableInstruction THIS = new ALOAD(0); - public static final LocalVariableInstruction ALOAD_0 = THIS; - public static final LocalVariableInstruction ALOAD_1 = new ALOAD(1); - public static final LocalVariableInstruction ALOAD_2 = new ALOAD(2); - public static final LocalVariableInstruction ILOAD_0 = new ILOAD(0); - public static final LocalVariableInstruction ILOAD_1 = new ILOAD(1); - public static final LocalVariableInstruction ILOAD_2 = new ILOAD(2); - public static final LocalVariableInstruction ASTORE_0 = new ASTORE(0); - public static final LocalVariableInstruction ASTORE_1 = new ASTORE(1); - public static final LocalVariableInstruction ASTORE_2 = new ASTORE(2); - public static final LocalVariableInstruction ISTORE_0 = new ISTORE(0); - public static final LocalVariableInstruction ISTORE_1 = new ISTORE(1); - public static final LocalVariableInstruction ISTORE_2 = new ISTORE(2); + /** Predefined instruction objects + */ + public static final Instruction NOP = new NOP(); + public static final Instruction ACONST_NULL = new ACONST_NULL(); + public static final Instruction ICONST_M1 = new ICONST(-1); + public static final Instruction ICONST_0 = new ICONST(0); + public static final Instruction ICONST_1 = new ICONST(1); + public static final Instruction ICONST_2 = new ICONST(2); + public static final Instruction ICONST_3 = new ICONST(3); + public static final Instruction ICONST_4 = new ICONST(4); + public static final Instruction ICONST_5 = new ICONST(5); + public static final Instruction LCONST_0 = new LCONST(0); + public static final Instruction LCONST_1 = new LCONST(1); + public static final Instruction FCONST_0 = new FCONST(0); + public static final Instruction FCONST_1 = new FCONST(1); + public static final Instruction FCONST_2 = new FCONST(2); + public static final Instruction DCONST_0 = new DCONST(0); + public static final Instruction DCONST_1 = new DCONST(1); + public static final ArrayInstruction IALOAD = new IALOAD(); + public static final ArrayInstruction LALOAD = new LALOAD(); + public static final ArrayInstruction FALOAD = new FALOAD(); + public static final ArrayInstruction DALOAD = new DALOAD(); + public static final ArrayInstruction AALOAD = new AALOAD(); + public static final ArrayInstruction BALOAD = new BALOAD(); + public static final ArrayInstruction CALOAD = new CALOAD(); + public static final ArrayInstruction SALOAD = new SALOAD(); + public static final ArrayInstruction IASTORE = new IASTORE(); + public static final ArrayInstruction LASTORE = new LASTORE(); + public static final ArrayInstruction FASTORE = new FASTORE(); + public static final ArrayInstruction DASTORE = new DASTORE(); + public static final ArrayInstruction AASTORE = new AASTORE(); + public static final ArrayInstruction BASTORE = new BASTORE(); + public static final ArrayInstruction CASTORE = new CASTORE(); + public static final ArrayInstruction SASTORE = new SASTORE(); + public static final StackInstruction POP = new POP(); + public static final StackInstruction POP2 = new POP2(); + public static final StackInstruction DUP = new DUP(); + public static final StackInstruction DUP_X1 = new DUP_X1(); + public static final StackInstruction DUP_X2 = new DUP_X2(); + public static final StackInstruction DUP2 = new DUP2(); + public static final StackInstruction DUP2_X1 = new DUP2_X1(); + public static final StackInstruction DUP2_X2 = new DUP2_X2(); + public static final StackInstruction SWAP = new SWAP(); + public static final ArithmeticInstruction IADD = new IADD(); + public static final ArithmeticInstruction LADD = new LADD(); + public static final ArithmeticInstruction FADD = new FADD(); + public static final ArithmeticInstruction DADD = new DADD(); + public static final ArithmeticInstruction ISUB = new ISUB(); + public static final ArithmeticInstruction LSUB = new LSUB(); + public static final ArithmeticInstruction FSUB = new FSUB(); + public static final ArithmeticInstruction DSUB = new DSUB(); + public static final ArithmeticInstruction IMUL = new IMUL(); + public static final ArithmeticInstruction LMUL = new LMUL(); + public static final ArithmeticInstruction FMUL = new FMUL(); + public static final ArithmeticInstruction DMUL = new DMUL(); + public static final ArithmeticInstruction IDIV = new IDIV(); + public static final ArithmeticInstruction LDIV = new LDIV(); + public static final ArithmeticInstruction FDIV = new FDIV(); + public static final ArithmeticInstruction DDIV = new DDIV(); + public static final ArithmeticInstruction IREM = new IREM(); + public static final ArithmeticInstruction LREM = new LREM(); + public static final ArithmeticInstruction FREM = new FREM(); + public static final ArithmeticInstruction DREM = new DREM(); + public static final ArithmeticInstruction INEG = new INEG(); + public static final ArithmeticInstruction LNEG = new LNEG(); + public static final ArithmeticInstruction FNEG = new FNEG(); + public static final ArithmeticInstruction DNEG = new DNEG(); + public static final ArithmeticInstruction ISHL = new ISHL(); + public static final ArithmeticInstruction LSHL = new LSHL(); + public static final ArithmeticInstruction ISHR = new ISHR(); + public static final ArithmeticInstruction LSHR = new LSHR(); + public static final ArithmeticInstruction IUSHR = new IUSHR(); + public static final ArithmeticInstruction LUSHR = new LUSHR(); + public static final ArithmeticInstruction IAND = new IAND(); + public static final ArithmeticInstruction LAND = new LAND(); + public static final ArithmeticInstruction IOR = new IOR(); + public static final ArithmeticInstruction LOR = new LOR(); + public static final ArithmeticInstruction IXOR = new IXOR(); + public static final ArithmeticInstruction LXOR = new LXOR(); + public static final ConversionInstruction I2L = new I2L(); + public static final ConversionInstruction I2F = new I2F(); + public static final ConversionInstruction I2D = new I2D(); + public static final ConversionInstruction L2I = new L2I(); + public static final ConversionInstruction L2F = new L2F(); + public static final ConversionInstruction L2D = new L2D(); + public static final ConversionInstruction F2I = new F2I(); + public static final ConversionInstruction F2L = new F2L(); + public static final ConversionInstruction F2D = new F2D(); + public static final ConversionInstruction D2I = new D2I(); + public static final ConversionInstruction D2L = new D2L(); + public static final ConversionInstruction D2F = new D2F(); + public static final ConversionInstruction I2B = new I2B(); + public static final ConversionInstruction I2C = new I2C(); + public static final ConversionInstruction I2S = new I2S(); + public static final Instruction LCMP = new LCMP(); + public static final Instruction FCMPL = new FCMPL(); + public static final Instruction FCMPG = new FCMPG(); + public static final Instruction DCMPL = new DCMPL(); + public static final Instruction DCMPG = new DCMPG(); + public static final ReturnInstruction IRETURN = new IRETURN(); + public static final ReturnInstruction LRETURN = new LRETURN(); + public static final ReturnInstruction FRETURN = new FRETURN(); + public static final ReturnInstruction DRETURN = new DRETURN(); + public static final ReturnInstruction ARETURN = new ARETURN(); + public static final ReturnInstruction RETURN = new RETURN(); + public static final Instruction ARRAYLENGTH = new ARRAYLENGTH(); + public static final Instruction ATHROW = new ATHROW(); + public static final Instruction MONITORENTER = new MONITORENTER(); + public static final Instruction MONITOREXIT = new MONITOREXIT(); + /** You can use these constants in multiple places safely, if you can guarantee + * that you will never alter their internal values, e.g. call setIndex(). + */ + public static final LocalVariableInstruction THIS = new ALOAD(0); + public static final LocalVariableInstruction ALOAD_0 = THIS; + public static final LocalVariableInstruction ALOAD_1 = new ALOAD(1); + public static final LocalVariableInstruction ALOAD_2 = new ALOAD(2); + public static final LocalVariableInstruction ILOAD_0 = new ILOAD(0); + public static final LocalVariableInstruction ILOAD_1 = new ILOAD(1); + public static final LocalVariableInstruction ILOAD_2 = new ILOAD(2); + public static final LocalVariableInstruction ASTORE_0 = new ASTORE(0); + public static final LocalVariableInstruction ASTORE_1 = new ASTORE(1); + public static final LocalVariableInstruction ASTORE_2 = new ASTORE(2); + public static final LocalVariableInstruction ISTORE_0 = new ISTORE(0); + public static final LocalVariableInstruction ISTORE_1 = new ISTORE(1); + public static final LocalVariableInstruction ISTORE_2 = new ISTORE(2); + /** Get object via its opcode, for immutable instructions like + * branch instructions entries are set to null. + */ + public static final Instruction[] INSTRUCTIONS = new Instruction[256]; + /** Interfaces may have no static initializers, so we simulate this + * with an inner class. + */ + static final Clinit bla = new Clinit(); - /** Get object via its opcode, for immutable instructions like - * branch instructions entries are set to null. - */ - public static final Instruction[] INSTRUCTIONS = new Instruction[256]; - - /** Interfaces may have no static initializers, so we simulate this - * with an inner class. - */ - static final Clinit bla = new Clinit(); + static class Clinit { - static class Clinit { - Clinit() { - INSTRUCTIONS[Constants.NOP] = NOP; - INSTRUCTIONS[Constants.ACONST_NULL] = ACONST_NULL; - INSTRUCTIONS[Constants.ICONST_M1] = ICONST_M1; - INSTRUCTIONS[Constants.ICONST_0] = ICONST_0; - INSTRUCTIONS[Constants.ICONST_1] = ICONST_1; - INSTRUCTIONS[Constants.ICONST_2] = ICONST_2; - INSTRUCTIONS[Constants.ICONST_3] = ICONST_3; - INSTRUCTIONS[Constants.ICONST_4] = ICONST_4; - INSTRUCTIONS[Constants.ICONST_5] = ICONST_5; - INSTRUCTIONS[Constants.LCONST_0] = LCONST_0; - INSTRUCTIONS[Constants.LCONST_1] = LCONST_1; - INSTRUCTIONS[Constants.FCONST_0] = FCONST_0; - INSTRUCTIONS[Constants.FCONST_1] = FCONST_1; - INSTRUCTIONS[Constants.FCONST_2] = FCONST_2; - INSTRUCTIONS[Constants.DCONST_0] = DCONST_0; - INSTRUCTIONS[Constants.DCONST_1] = DCONST_1; - INSTRUCTIONS[Constants.IALOAD] = IALOAD; - INSTRUCTIONS[Constants.LALOAD] = LALOAD; - INSTRUCTIONS[Constants.FALOAD] = FALOAD; - INSTRUCTIONS[Constants.DALOAD] = DALOAD; - INSTRUCTIONS[Constants.AALOAD] = AALOAD; - INSTRUCTIONS[Constants.BALOAD] = BALOAD; - INSTRUCTIONS[Constants.CALOAD] = CALOAD; - INSTRUCTIONS[Constants.SALOAD] = SALOAD; - INSTRUCTIONS[Constants.IASTORE] = IASTORE; - INSTRUCTIONS[Constants.LASTORE] = LASTORE; - INSTRUCTIONS[Constants.FASTORE] = FASTORE; - INSTRUCTIONS[Constants.DASTORE] = DASTORE; - INSTRUCTIONS[Constants.AASTORE] = AASTORE; - INSTRUCTIONS[Constants.BASTORE] = BASTORE; - INSTRUCTIONS[Constants.CASTORE] = CASTORE; - INSTRUCTIONS[Constants.SASTORE] = SASTORE; - INSTRUCTIONS[Constants.POP] = POP; - INSTRUCTIONS[Constants.POP2] = POP2; - INSTRUCTIONS[Constants.DUP] = DUP; - INSTRUCTIONS[Constants.DUP_X1] = DUP_X1; - INSTRUCTIONS[Constants.DUP_X2] = DUP_X2; - INSTRUCTIONS[Constants.DUP2] = DUP2; - INSTRUCTIONS[Constants.DUP2_X1] = DUP2_X1; - INSTRUCTIONS[Constants.DUP2_X2] = DUP2_X2; - INSTRUCTIONS[Constants.SWAP] = SWAP; - INSTRUCTIONS[Constants.IADD] = IADD; - INSTRUCTIONS[Constants.LADD] = LADD; - INSTRUCTIONS[Constants.FADD] = FADD; - INSTRUCTIONS[Constants.DADD] = DADD; - INSTRUCTIONS[Constants.ISUB] = ISUB; - INSTRUCTIONS[Constants.LSUB] = LSUB; - INSTRUCTIONS[Constants.FSUB] = FSUB; - INSTRUCTIONS[Constants.DSUB] = DSUB; - INSTRUCTIONS[Constants.IMUL] = IMUL; - INSTRUCTIONS[Constants.LMUL] = LMUL; - INSTRUCTIONS[Constants.FMUL] = FMUL; - INSTRUCTIONS[Constants.DMUL] = DMUL; - INSTRUCTIONS[Constants.IDIV] = IDIV; - INSTRUCTIONS[Constants.LDIV] = LDIV; - INSTRUCTIONS[Constants.FDIV] = FDIV; - INSTRUCTIONS[Constants.DDIV] = DDIV; - INSTRUCTIONS[Constants.IREM] = IREM; - INSTRUCTIONS[Constants.LREM] = LREM; - INSTRUCTIONS[Constants.FREM] = FREM; - INSTRUCTIONS[Constants.DREM] = DREM; - INSTRUCTIONS[Constants.INEG] = INEG; - INSTRUCTIONS[Constants.LNEG] = LNEG; - INSTRUCTIONS[Constants.FNEG] = FNEG; - INSTRUCTIONS[Constants.DNEG] = DNEG; - INSTRUCTIONS[Constants.ISHL] = ISHL; - INSTRUCTIONS[Constants.LSHL] = LSHL; - INSTRUCTIONS[Constants.ISHR] = ISHR; - INSTRUCTIONS[Constants.LSHR] = LSHR; - INSTRUCTIONS[Constants.IUSHR] = IUSHR; - INSTRUCTIONS[Constants.LUSHR] = LUSHR; - INSTRUCTIONS[Constants.IAND] = IAND; - INSTRUCTIONS[Constants.LAND] = LAND; - INSTRUCTIONS[Constants.IOR] = IOR; - INSTRUCTIONS[Constants.LOR] = LOR; - INSTRUCTIONS[Constants.IXOR] = IXOR; - INSTRUCTIONS[Constants.LXOR] = LXOR; - INSTRUCTIONS[Constants.I2L] = I2L; - INSTRUCTIONS[Constants.I2F] = I2F; - INSTRUCTIONS[Constants.I2D] = I2D; - INSTRUCTIONS[Constants.L2I] = L2I; - INSTRUCTIONS[Constants.L2F] = L2F; - INSTRUCTIONS[Constants.L2D] = L2D; - INSTRUCTIONS[Constants.F2I] = F2I; - INSTRUCTIONS[Constants.F2L] = F2L; - INSTRUCTIONS[Constants.F2D] = F2D; - INSTRUCTIONS[Constants.D2I] = D2I; - INSTRUCTIONS[Constants.D2L] = D2L; - INSTRUCTIONS[Constants.D2F] = D2F; - INSTRUCTIONS[Constants.I2B] = I2B; - INSTRUCTIONS[Constants.I2C] = I2C; - INSTRUCTIONS[Constants.I2S] = I2S; - INSTRUCTIONS[Constants.LCMP] = LCMP; - INSTRUCTIONS[Constants.FCMPL] = FCMPL; - INSTRUCTIONS[Constants.FCMPG] = FCMPG; - INSTRUCTIONS[Constants.DCMPL] = DCMPL; - INSTRUCTIONS[Constants.DCMPG] = DCMPG; - INSTRUCTIONS[Constants.IRETURN] = IRETURN; - INSTRUCTIONS[Constants.LRETURN] = LRETURN; - INSTRUCTIONS[Constants.FRETURN] = FRETURN; - INSTRUCTIONS[Constants.DRETURN] = DRETURN; - INSTRUCTIONS[Constants.ARETURN] = ARETURN; - INSTRUCTIONS[Constants.RETURN] = RETURN; - INSTRUCTIONS[Constants.ARRAYLENGTH] = ARRAYLENGTH; - INSTRUCTIONS[Constants.ATHROW] = ATHROW; - INSTRUCTIONS[Constants.MONITORENTER] = MONITORENTER; - INSTRUCTIONS[Constants.MONITOREXIT] = MONITOREXIT; + Clinit() { + INSTRUCTIONS[Constants.NOP] = NOP; + INSTRUCTIONS[Constants.ACONST_NULL] = ACONST_NULL; + INSTRUCTIONS[Constants.ICONST_M1] = ICONST_M1; + INSTRUCTIONS[Constants.ICONST_0] = ICONST_0; + INSTRUCTIONS[Constants.ICONST_1] = ICONST_1; + INSTRUCTIONS[Constants.ICONST_2] = ICONST_2; + INSTRUCTIONS[Constants.ICONST_3] = ICONST_3; + INSTRUCTIONS[Constants.ICONST_4] = ICONST_4; + INSTRUCTIONS[Constants.ICONST_5] = ICONST_5; + INSTRUCTIONS[Constants.LCONST_0] = LCONST_0; + INSTRUCTIONS[Constants.LCONST_1] = LCONST_1; + INSTRUCTIONS[Constants.FCONST_0] = FCONST_0; + INSTRUCTIONS[Constants.FCONST_1] = FCONST_1; + INSTRUCTIONS[Constants.FCONST_2] = FCONST_2; + INSTRUCTIONS[Constants.DCONST_0] = DCONST_0; + INSTRUCTIONS[Constants.DCONST_1] = DCONST_1; + INSTRUCTIONS[Constants.IALOAD] = IALOAD; + INSTRUCTIONS[Constants.LALOAD] = LALOAD; + INSTRUCTIONS[Constants.FALOAD] = FALOAD; + INSTRUCTIONS[Constants.DALOAD] = DALOAD; + INSTRUCTIONS[Constants.AALOAD] = AALOAD; + INSTRUCTIONS[Constants.BALOAD] = BALOAD; + INSTRUCTIONS[Constants.CALOAD] = CALOAD; + INSTRUCTIONS[Constants.SALOAD] = SALOAD; + INSTRUCTIONS[Constants.IASTORE] = IASTORE; + INSTRUCTIONS[Constants.LASTORE] = LASTORE; + INSTRUCTIONS[Constants.FASTORE] = FASTORE; + INSTRUCTIONS[Constants.DASTORE] = DASTORE; + INSTRUCTIONS[Constants.AASTORE] = AASTORE; + INSTRUCTIONS[Constants.BASTORE] = BASTORE; + INSTRUCTIONS[Constants.CASTORE] = CASTORE; + INSTRUCTIONS[Constants.SASTORE] = SASTORE; + INSTRUCTIONS[Constants.POP] = POP; + INSTRUCTIONS[Constants.POP2] = POP2; + INSTRUCTIONS[Constants.DUP] = DUP; + INSTRUCTIONS[Constants.DUP_X1] = DUP_X1; + INSTRUCTIONS[Constants.DUP_X2] = DUP_X2; + INSTRUCTIONS[Constants.DUP2] = DUP2; + INSTRUCTIONS[Constants.DUP2_X1] = DUP2_X1; + INSTRUCTIONS[Constants.DUP2_X2] = DUP2_X2; + INSTRUCTIONS[Constants.SWAP] = SWAP; + INSTRUCTIONS[Constants.IADD] = IADD; + INSTRUCTIONS[Constants.LADD] = LADD; + INSTRUCTIONS[Constants.FADD] = FADD; + INSTRUCTIONS[Constants.DADD] = DADD; + INSTRUCTIONS[Constants.ISUB] = ISUB; + INSTRUCTIONS[Constants.LSUB] = LSUB; + INSTRUCTIONS[Constants.FSUB] = FSUB; + INSTRUCTIONS[Constants.DSUB] = DSUB; + INSTRUCTIONS[Constants.IMUL] = IMUL; + INSTRUCTIONS[Constants.LMUL] = LMUL; + INSTRUCTIONS[Constants.FMUL] = FMUL; + INSTRUCTIONS[Constants.DMUL] = DMUL; + INSTRUCTIONS[Constants.IDIV] = IDIV; + INSTRUCTIONS[Constants.LDIV] = LDIV; + INSTRUCTIONS[Constants.FDIV] = FDIV; + INSTRUCTIONS[Constants.DDIV] = DDIV; + INSTRUCTIONS[Constants.IREM] = IREM; + INSTRUCTIONS[Constants.LREM] = LREM; + INSTRUCTIONS[Constants.FREM] = FREM; + INSTRUCTIONS[Constants.DREM] = DREM; + INSTRUCTIONS[Constants.INEG] = INEG; + INSTRUCTIONS[Constants.LNEG] = LNEG; + INSTRUCTIONS[Constants.FNEG] = FNEG; + INSTRUCTIONS[Constants.DNEG] = DNEG; + INSTRUCTIONS[Constants.ISHL] = ISHL; + INSTRUCTIONS[Constants.LSHL] = LSHL; + INSTRUCTIONS[Constants.ISHR] = ISHR; + INSTRUCTIONS[Constants.LSHR] = LSHR; + INSTRUCTIONS[Constants.IUSHR] = IUSHR; + INSTRUCTIONS[Constants.LUSHR] = LUSHR; + INSTRUCTIONS[Constants.IAND] = IAND; + INSTRUCTIONS[Constants.LAND] = LAND; + INSTRUCTIONS[Constants.IOR] = IOR; + INSTRUCTIONS[Constants.LOR] = LOR; + INSTRUCTIONS[Constants.IXOR] = IXOR; + INSTRUCTIONS[Constants.LXOR] = LXOR; + INSTRUCTIONS[Constants.I2L] = I2L; + INSTRUCTIONS[Constants.I2F] = I2F; + INSTRUCTIONS[Constants.I2D] = I2D; + INSTRUCTIONS[Constants.L2I] = L2I; + INSTRUCTIONS[Constants.L2F] = L2F; + INSTRUCTIONS[Constants.L2D] = L2D; + INSTRUCTIONS[Constants.F2I] = F2I; + INSTRUCTIONS[Constants.F2L] = F2L; + INSTRUCTIONS[Constants.F2D] = F2D; + INSTRUCTIONS[Constants.D2I] = D2I; + INSTRUCTIONS[Constants.D2L] = D2L; + INSTRUCTIONS[Constants.D2F] = D2F; + INSTRUCTIONS[Constants.I2B] = I2B; + INSTRUCTIONS[Constants.I2C] = I2C; + INSTRUCTIONS[Constants.I2S] = I2S; + INSTRUCTIONS[Constants.LCMP] = LCMP; + INSTRUCTIONS[Constants.FCMPL] = FCMPL; + INSTRUCTIONS[Constants.FCMPG] = FCMPG; + INSTRUCTIONS[Constants.DCMPL] = DCMPL; + INSTRUCTIONS[Constants.DCMPG] = DCMPG; + INSTRUCTIONS[Constants.IRETURN] = IRETURN; + INSTRUCTIONS[Constants.LRETURN] = LRETURN; + INSTRUCTIONS[Constants.FRETURN] = FRETURN; + INSTRUCTIONS[Constants.DRETURN] = DRETURN; + INSTRUCTIONS[Constants.ARETURN] = ARETURN; + INSTRUCTIONS[Constants.RETURN] = RETURN; + INSTRUCTIONS[Constants.ARRAYLENGTH] = ARRAYLENGTH; + INSTRUCTIONS[Constants.ATHROW] = ATHROW; + INSTRUCTIONS[Constants.MONITORENTER] = MONITORENTER; + INSTRUCTIONS[Constants.MONITOREXIT] = MONITOREXIT; + } } - } } diff --git a/src/java/org/apache/bcel/generic/InstructionFactory.java b/src/java/org/apache/bcel/generic/InstructionFactory.java index dbb2928e..5d633922 100644 --- a/src/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/java/org/apache/bcel/generic/InstructionFactory.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.Constants; @@ -28,558 +28,716 @@ import org.apache.bcel.Constants; * @author M. Dahm * @see Constants */ -public class InstructionFactory - implements InstructionConstants, java.io.Serializable -{ - protected ClassGen cg; - protected ConstantPoolGen cp; - - public InstructionFactory(ClassGen cg, ConstantPoolGen cp) { - this.cg = cg; - this.cp = cp; - } - - /** Initialize with ClassGen object - */ - public InstructionFactory(ClassGen cg) { - this(cg, cg.getConstantPool()); - } - - /** Initialize just with ConstantPoolGen object - */ - public InstructionFactory(ConstantPoolGen cp) { - this(null, cp); - } - - /** Create an invoke instruction. - * - * @param class_name name of the called class - * @param name name of the called method - * @param ret_type return type of method - * @param arg_types argument types of method - * @param kind how to invoke, i.e., INVOKEINTERFACE, INVOKESTATIC, INVOKEVIRTUAL, - * or INVOKESPECIAL - * @see Constants - */ - public InvokeInstruction createInvoke(String class_name, String name, Type ret_type, - Type[] arg_types, short kind) { - int index; - int nargs = 0; - String signature = Type.getMethodSignature(ret_type, arg_types); - - for(int i=0; i < arg_types.length; i++) // Count size of arguments - nargs += arg_types[i].getSize(); - - if(kind == Constants.INVOKEINTERFACE) - index = cp.addInterfaceMethodref(class_name, name, signature); - else - index = cp.addMethodref(class_name, name, signature); - - switch(kind) { - case Constants.INVOKESPECIAL: return new INVOKESPECIAL(index); - case Constants.INVOKEVIRTUAL: return new INVOKEVIRTUAL(index); - case Constants.INVOKESTATIC: return new INVOKESTATIC(index); - case Constants.INVOKEINTERFACE: return new INVOKEINTERFACE(index, nargs + 1); - default: - throw new RuntimeException("Oops: Unknown invoke kind:" + kind); - } - } - - /** Create a call to the most popular System.out.println() method. - * - * @param s the string to print - */ - public InstructionList createPrintln(String s) { - InstructionList il = new InstructionList(); - int out = cp.addFieldref("java.lang.System", "out", - "Ljava/io/PrintStream;"); - int println = cp.addMethodref("java.io.PrintStream", "println", - "(Ljava/lang/String;)V"); - - il.append(new GETSTATIC(out)); - il.append(new PUSH(cp, s)); - il.append(new INVOKEVIRTUAL(println)); - - return il; - } - - /** Uses PUSH to push a constant value onto the stack. - * @param value must be of type Number, Boolean, Character or String - */ - public Instruction createConstant(Object value) { - PUSH push; - - if(value instanceof Number) - push = new PUSH(cp, (Number)value); - else if(value instanceof String) - push = new PUSH(cp, (String)value); - else if(value instanceof Boolean) - push = new PUSH(cp, (Boolean)value); - else if(value instanceof Character) - push = new PUSH(cp, (Character)value); - else - throw new ClassGenException("Illegal type: " + value.getClass()); - - return push.getInstruction(); - } - - private static class MethodObject { - Type[] arg_types; - Type result_type; - String class_name; - String name; - int access; - - MethodObject(String c, String n, Type r, Type[] a, int acc) { - class_name = c; - name = n; - result_type = r; - arg_types = a; - access = acc; - } - } - - private InvokeInstruction createInvoke(MethodObject m, short kind) { - return createInvoke(m.class_name, m.name, m.result_type, m.arg_types, kind); - } - - private static MethodObject[] append_mos = { - new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, - new Type[] { Type.STRING }, Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, - new Type[] { Type.OBJECT }, Constants.ACC_PUBLIC), - null, null, // indices 2, 3 - new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, - new Type[] { Type.BOOLEAN }, Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, - new Type[] { Type.CHAR }, Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, - new Type[] { Type.FLOAT }, Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, - new Type[] { Type.DOUBLE }, Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, - new Type[] { Type.INT }, Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, // No append(byte) - new Type[] { Type.INT }, Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, // No append(short) - new Type[] { Type.INT }, Constants.ACC_PUBLIC), - new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, - new Type[] { Type.LONG }, Constants.ACC_PUBLIC) - }; - - private static final boolean isString(Type type) { - return ((type instanceof ObjectType) && - ((ObjectType)type).getClassName().equals("java.lang.String")); - } - - public Instruction createAppend(Type type) { - byte t = type.getType(); - - if(isString(type)) - return createInvoke(append_mos[0], Constants.INVOKEVIRTUAL); - - switch(t) { - case Constants.T_BOOLEAN: - case Constants.T_CHAR: - case Constants.T_FLOAT: - case Constants.T_DOUBLE: - case Constants.T_BYTE: - case Constants.T_SHORT: - case Constants.T_INT: - case Constants.T_LONG - : return createInvoke(append_mos[t], Constants.INVOKEVIRTUAL); - case Constants.T_ARRAY: - case Constants.T_OBJECT: - return createInvoke(append_mos[1], Constants.INVOKEVIRTUAL); - default: - throw new RuntimeException("Oops: No append for this type? " + type); - } - } - - /** Create a field instruction. - * - * @param class_name name of the accessed class - * @param name name of the referenced field - * @param type type of field - * @param kind how to access, i.e., GETFIELD, PUTFIELD, GETSTATIC, PUTSTATIC - * @see Constants - */ - public FieldInstruction createFieldAccess(String class_name, String name, Type type, short kind) { - int index; - String signature = type.getSignature(); - - index = cp.addFieldref(class_name, name, signature); - - switch(kind) { - case Constants.GETFIELD: return new GETFIELD(index); - case Constants.PUTFIELD: return new PUTFIELD(index); - case Constants.GETSTATIC: return new GETSTATIC(index); - case Constants.PUTSTATIC: return new PUTSTATIC(index); - - default: - throw new RuntimeException("Oops: Unknown getfield kind:" + kind); - } - } - - /** Create reference to `this' - */ - public static Instruction createThis() { - return new ALOAD(0); - } - - /** Create typed return - */ - public static ReturnInstruction createReturn(Type type) { - switch(type.getType()) { - case Constants.T_ARRAY: - case Constants.T_OBJECT: return ARETURN; - case Constants.T_INT: - case Constants.T_SHORT: - case Constants.T_BOOLEAN: - case Constants.T_CHAR: - case Constants.T_BYTE: return IRETURN; - case Constants.T_FLOAT: return FRETURN; - case Constants.T_DOUBLE: return DRETURN; - case Constants.T_LONG: return LRETURN; - case Constants.T_VOID: return RETURN; - - default: - throw new RuntimeException("Invalid type: " + type); - } - } - - private static final ArithmeticInstruction createBinaryIntOp(char first, String op) { - switch(first) { - case '-' : return ISUB; - case '+' : return IADD; - case '%' : return IREM; - case '*' : return IMUL; - case '/' : return IDIV; - case '&' : return IAND; - case '|' : return IOR; - case '^' : return IXOR; - case '<' : return ISHL; - case '>' : return op.equals(">>>")? (ArithmeticInstruction)IUSHR : - (ArithmeticInstruction)ISHR; - default: throw new RuntimeException("Invalid operand " + op); - } - } - - private static final ArithmeticInstruction createBinaryLongOp(char first, String op) { - switch(first) { - case '-' : return LSUB; - case '+' : return LADD; - case '%' : return LREM; - case '*' : return LMUL; - case '/' : return LDIV; - case '&' : return LAND; - case '|' : return LOR; - case '^' : return LXOR; - case '<' : return LSHL; - case '>' : return op.equals(">>>")? (ArithmeticInstruction)LUSHR : - (ArithmeticInstruction)LSHR; - default: throw new RuntimeException("Invalid operand " + op); - } - } - - private static final ArithmeticInstruction createBinaryFloatOp(char op) { - switch(op) { - case '-' : return FSUB; - case '+' : return FADD; - case '*' : return FMUL; - case '/' : return FDIV; - default: throw new RuntimeException("Invalid operand " + op); - } - } - - private static final ArithmeticInstruction createBinaryDoubleOp(char op) { - switch(op) { - case '-' : return DSUB; - case '+' : return DADD; - case '*' : return DMUL; - case '/' : return DDIV; - default: throw new RuntimeException("Invalid operand " + op); - } - } - - /** - * Create binary operation for simple basic types, such as int and float. - * - * @param op operation, such as "+", "*", "<<", etc. - */ - public static ArithmeticInstruction createBinaryOperation(String op, Type type) { - char first = op.toCharArray()[0]; - - switch(type.getType()) { - case Constants.T_BYTE: - case Constants.T_SHORT: - case Constants.T_INT: - case Constants.T_CHAR: return createBinaryIntOp(first, op); - case Constants.T_LONG: return createBinaryLongOp(first, op); - case Constants.T_FLOAT: return createBinaryFloatOp(first); - case Constants.T_DOUBLE: return createBinaryDoubleOp(first); - default: throw new RuntimeException("Invalid type " + type); - } - } - - /** - * @param size size of operand, either 1 (int, e.g.) or 2 (double) - */ - public static StackInstruction createPop(int size) { - return (size == 2)? (StackInstruction)POP2 : - (StackInstruction)POP; - } - - /** - * @param size size of operand, either 1 (int, e.g.) or 2 (double) - */ - public static StackInstruction createDup(int size) { - return (size == 2)? (StackInstruction)DUP2 : - (StackInstruction)DUP; - } - - /** - * @param size size of operand, either 1 (int, e.g.) or 2 (double) - */ - public static StackInstruction createDup_2(int size) { - return (size == 2)? (StackInstruction)DUP2_X2 : - (StackInstruction)DUP_X2; - } - - /** - * @param size size of operand, either 1 (int, e.g.) or 2 (double) - */ - public static StackInstruction createDup_1(int size) { - return (size == 2)? (StackInstruction)DUP2_X1 : - (StackInstruction)DUP_X1; - } - - /** - * @param index index of local variable - */ - public static LocalVariableInstruction createStore(Type type, int index) { - switch(type.getType()) { - case Constants.T_BOOLEAN: - case Constants.T_CHAR: - case Constants.T_BYTE: - case Constants.T_SHORT: - case Constants.T_INT: return new ISTORE(index); - case Constants.T_FLOAT: return new FSTORE(index); - case Constants.T_DOUBLE: return new DSTORE(index); - case Constants.T_LONG: return new LSTORE(index); - case Constants.T_ARRAY: - case Constants.T_OBJECT: return new ASTORE(index); - default: throw new RuntimeException("Invalid type " + type); - } - } - - /** - * @param index index of local variable - */ - public static LocalVariableInstruction createLoad(Type type, int index) { - switch(type.getType()) { - case Constants.T_BOOLEAN: - case Constants.T_CHAR: - case Constants.T_BYTE: - case Constants.T_SHORT: - case Constants.T_INT: return new ILOAD(index); - case Constants.T_FLOAT: return new FLOAD(index); - case Constants.T_DOUBLE: return new DLOAD(index); - case Constants.T_LONG: return new LLOAD(index); - case Constants.T_ARRAY: - case Constants.T_OBJECT: return new ALOAD(index); - default: throw new RuntimeException("Invalid type " + type); - } - } - - /** - * @param type type of elements of array, i.e., array.getElementType() - */ - public static ArrayInstruction createArrayLoad(Type type) { - switch(type.getType()) { - case Constants.T_BOOLEAN: - case Constants.T_BYTE: return BALOAD; - case Constants.T_CHAR: return CALOAD; - case Constants.T_SHORT: return SALOAD; - case Constants.T_INT: return IALOAD; - case Constants.T_FLOAT: return FALOAD; - case Constants.T_DOUBLE: return DALOAD; - case Constants.T_LONG: return LALOAD; - case Constants.T_ARRAY: - case Constants.T_OBJECT: return AALOAD; - default: throw new RuntimeException("Invalid type " + type); - } - } - - /** - * @param type type of elements of array, i.e., array.getElementType() - */ - public static ArrayInstruction createArrayStore(Type type) { - switch(type.getType()) { - case Constants.T_BOOLEAN: - case Constants.T_BYTE: return BASTORE; - case Constants.T_CHAR: return CASTORE; - case Constants.T_SHORT: return SASTORE; - case Constants.T_INT: return IASTORE; - case Constants.T_FLOAT: return FASTORE; - case Constants.T_DOUBLE: return DASTORE; - case Constants.T_LONG: return LASTORE; - case Constants.T_ARRAY: - case Constants.T_OBJECT: return AASTORE; - default: throw new RuntimeException("Invalid type " + type); - } - } - - - /** Create conversion operation for two stack operands, this may be an I2C, instruction, e.g., - * if the operands are basic types and CHECKCAST if they are reference types. - */ - public Instruction createCast(Type src_type, Type dest_type) { - if((src_type instanceof BasicType) && (dest_type instanceof BasicType)) { - byte dest = dest_type.getType(); - byte src = src_type.getType(); - - if(dest == Constants.T_LONG && (src == Constants.T_CHAR || src == Constants.T_BYTE || - src == Constants.T_SHORT)) - src = Constants.T_INT; - - String[] short_names = { "C", "F", "D", "B", "S", "I", "L" }; - - String name = "org.apache.bcel.generic." + short_names[src - Constants.T_CHAR] + - "2" + short_names[dest - Constants.T_CHAR]; - - Instruction i = null; - try { - i = (Instruction)java.lang.Class.forName(name).newInstance(); - } catch(Exception e) { - throw new RuntimeException("Could not find instruction: " + name); - } - - return i; - } else if((src_type instanceof ReferenceType) && (dest_type instanceof ReferenceType)) { - if(dest_type instanceof ArrayType) - return new CHECKCAST(cp.addArrayClass((ArrayType)dest_type)); - else - return new CHECKCAST(cp.addClass(((ObjectType)dest_type).getClassName())); - } - else - throw new RuntimeException("Can not cast " + src_type + " to " + dest_type); - } - - public GETFIELD createGetField(String class_name, String name, Type t) { - return new GETFIELD(cp.addFieldref(class_name, name, t.getSignature())); - } - - public GETSTATIC createGetStatic(String class_name, String name, Type t) { - return new GETSTATIC(cp.addFieldref(class_name, name, t.getSignature())); - } - - public PUTFIELD createPutField(String class_name, String name, Type t) { - return new PUTFIELD(cp.addFieldref(class_name, name, t.getSignature())); - } - - public PUTSTATIC createPutStatic(String class_name, String name, Type t) { - return new PUTSTATIC(cp.addFieldref(class_name, name, t.getSignature())); - } - - public CHECKCAST createCheckCast(ReferenceType t) { - if(t instanceof ArrayType) - return new CHECKCAST(cp.addArrayClass((ArrayType)t)); - else - return new CHECKCAST(cp.addClass((ObjectType)t)); - } - - public INSTANCEOF createInstanceOf(ReferenceType t) { - if(t instanceof ArrayType) - return new INSTANCEOF(cp.addArrayClass((ArrayType)t)); - else - return new INSTANCEOF(cp.addClass((ObjectType)t)); - } - - public NEW createNew(ObjectType t) { - return new NEW(cp.addClass(t)); - } - - public NEW createNew(String s) { - return createNew(new ObjectType(s)); - } - - /** Create new array of given size and type. - * @return an instruction that creates the corresponding array at runtime, i.e. is an AllocationInstruction - */ - public Instruction createNewArray(Type t, short dim) { - if(dim == 1) { - if(t instanceof ObjectType) - return new ANEWARRAY(cp.addClass((ObjectType)t)); - else if(t instanceof ArrayType) - return new ANEWARRAY(cp.addArrayClass((ArrayType)t)); - else - return new NEWARRAY(((BasicType)t).getType()); - } else { - ArrayType at; - - if(t instanceof ArrayType) - at = (ArrayType)t; - else - at = new ArrayType(t, dim); - - return new MULTIANEWARRAY(cp.addArrayClass(at), dim); - } - } - - /** Create "null" value for reference types, 0 for basic types like int - */ - public static Instruction createNull(Type type) { - switch(type.getType()) { - case Constants.T_ARRAY: - case Constants.T_OBJECT: return ACONST_NULL; - case Constants.T_INT: - case Constants.T_SHORT: - case Constants.T_BOOLEAN: - case Constants.T_CHAR: - case Constants.T_BYTE: return ICONST_0; - case Constants.T_FLOAT: return FCONST_0; - case Constants.T_DOUBLE: return DCONST_0; - case Constants.T_LONG: return LCONST_0; - case Constants.T_VOID: return NOP; - - default: - throw new RuntimeException("Invalid type: " + type); - } - } - - /** Create branch instruction by given opcode, except LOOKUPSWITCH and TABLESWITCH. - * For those you should use the SWITCH compound instruction. - */ - public static BranchInstruction createBranchInstruction(short opcode, InstructionHandle target) { - switch(opcode) { - case Constants.IFEQ: return new IFEQ(target); - case Constants.IFNE: return new IFNE(target); - case Constants.IFLT: return new IFLT(target); - case Constants.IFGE: return new IFGE(target); - case Constants.IFGT: return new IFGT(target); - case Constants.IFLE: return new IFLE(target); - case Constants.IF_ICMPEQ: return new IF_ICMPEQ(target); - case Constants.IF_ICMPNE: return new IF_ICMPNE(target); - case Constants.IF_ICMPLT: return new IF_ICMPLT(target); - case Constants.IF_ICMPGE: return new IF_ICMPGE(target); - case Constants.IF_ICMPGT: return new IF_ICMPGT(target); - case Constants.IF_ICMPLE: return new IF_ICMPLE(target); - case Constants.IF_ACMPEQ: return new IF_ACMPEQ(target); - case Constants.IF_ACMPNE: return new IF_ACMPNE(target); - case Constants.GOTO: return new GOTO(target); - case Constants.JSR: return new JSR(target); - case Constants.IFNULL: return new IFNULL(target); - case Constants.IFNONNULL: return new IFNONNULL(target); - case Constants.GOTO_W: return new GOTO_W(target); - case Constants.JSR_W: return new JSR_W(target); - default: - throw new RuntimeException("Invalid opcode: " + opcode); - } - } - - public void setClassGen(ClassGen c) { cg = c; } - public ClassGen getClassGen() { return cg; } - public void setConstantPool(ConstantPoolGen c) { cp = c; } - public ConstantPoolGen getConstantPool() { return cp; } +public class InstructionFactory implements InstructionConstants, java.io.Serializable { + + protected ClassGen cg; + protected ConstantPoolGen cp; + + + public InstructionFactory(ClassGen cg, ConstantPoolGen cp) { + this.cg = cg; + this.cp = cp; + } + + + /** Initialize with ClassGen object + */ + public InstructionFactory(ClassGen cg) { + this(cg, cg.getConstantPool()); + } + + + /** Initialize just with ConstantPoolGen object + */ + public InstructionFactory(ConstantPoolGen cp) { + this(null, cp); + } + + + /** Create an invoke instruction. + * + * @param class_name name of the called class + * @param name name of the called method + * @param ret_type return type of method + * @param arg_types argument types of method + * @param kind how to invoke, i.e., INVOKEINTERFACE, INVOKESTATIC, INVOKEVIRTUAL, + * or INVOKESPECIAL + * @see Constants + */ + public InvokeInstruction createInvoke( String class_name, String name, Type ret_type, + Type[] arg_types, short kind ) { + int index; + int nargs = 0; + String signature = Type.getMethodSignature(ret_type, arg_types); + for (int i = 0; i < arg_types.length; i++) { + nargs += arg_types[i].getSize(); + } + if (kind == Constants.INVOKEINTERFACE) { + index = cp.addInterfaceMethodref(class_name, name, signature); + } else { + index = cp.addMethodref(class_name, name, signature); + } + switch (kind) { + case Constants.INVOKESPECIAL: + return new INVOKESPECIAL(index); + case Constants.INVOKEVIRTUAL: + return new INVOKEVIRTUAL(index); + case Constants.INVOKESTATIC: + return new INVOKESTATIC(index); + case Constants.INVOKEINTERFACE: + return new INVOKEINTERFACE(index, nargs + 1); + default: + throw new RuntimeException("Oops: Unknown invoke kind:" + kind); + } + } + + + /** Create a call to the most popular System.out.println() method. + * + * @param s the string to print + */ + public InstructionList createPrintln( String s ) { + InstructionList il = new InstructionList(); + int out = cp.addFieldref("java.lang.System", "out", "Ljava/io/PrintStream;"); + int println = cp.addMethodref("java.io.PrintStream", "println", "(Ljava/lang/String;)V"); + il.append(new GETSTATIC(out)); + il.append(new PUSH(cp, s)); + il.append(new INVOKEVIRTUAL(println)); + return il; + } + + + /** Uses PUSH to push a constant value onto the stack. + * @param value must be of type Number, Boolean, Character or String + */ + public Instruction createConstant( Object value ) { + PUSH push; + if (value instanceof Number) { + push = new PUSH(cp, (Number) value); + } else if (value instanceof String) { + push = new PUSH(cp, (String) value); + } else if (value instanceof Boolean) { + push = new PUSH(cp, (Boolean) value); + } else if (value instanceof Character) { + push = new PUSH(cp, (Character) value); + } else { + throw new ClassGenException("Illegal type: " + value.getClass()); + } + return push.getInstruction(); + } + + private static class MethodObject { + + Type[] arg_types; + Type result_type; + String class_name; + String name; + int access; + + + MethodObject(String c, String n, Type r, Type[] a, int acc) { + class_name = c; + name = n; + result_type = r; + arg_types = a; + access = acc; + } + } + + + private InvokeInstruction createInvoke( MethodObject m, short kind ) { + return createInvoke(m.class_name, m.name, m.result_type, m.arg_types, kind); + } + + private static MethodObject[] append_mos = { + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { + Type.STRING + }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { + Type.OBJECT + }, Constants.ACC_PUBLIC), + null, + null, // indices 2, 3 + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { + Type.BOOLEAN + }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { + Type.CHAR + }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { + Type.FLOAT + }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { + Type.DOUBLE + }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { + Type.INT + }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, // No append(byte) + new Type[] { + Type.INT + }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, // No append(short) + new Type[] { + Type.INT + }, Constants.ACC_PUBLIC), + new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { + Type.LONG + }, Constants.ACC_PUBLIC) + }; + + + private static final boolean isString( Type type ) { + return ((type instanceof ObjectType) && ((ObjectType) type).getClassName().equals( + "java.lang.String")); + } + + + public Instruction createAppend( Type type ) { + byte t = type.getType(); + if (isString(type)) { + return createInvoke(append_mos[0], Constants.INVOKEVIRTUAL); + } + switch (t) { + case Constants.T_BOOLEAN: + case Constants.T_CHAR: + case Constants.T_FLOAT: + case Constants.T_DOUBLE: + case Constants.T_BYTE: + case Constants.T_SHORT: + case Constants.T_INT: + case Constants.T_LONG: + return createInvoke(append_mos[t], Constants.INVOKEVIRTUAL); + case Constants.T_ARRAY: + case Constants.T_OBJECT: + return createInvoke(append_mos[1], Constants.INVOKEVIRTUAL); + default: + throw new RuntimeException("Oops: No append for this type? " + type); + } + } + + + /** Create a field instruction. + * + * @param class_name name of the accessed class + * @param name name of the referenced field + * @param type type of field + * @param kind how to access, i.e., GETFIELD, PUTFIELD, GETSTATIC, PUTSTATIC + * @see Constants + */ + public FieldInstruction createFieldAccess( String class_name, String name, Type type, short kind ) { + int index; + String signature = type.getSignature(); + index = cp.addFieldref(class_name, name, signature); + switch (kind) { + case Constants.GETFIELD: + return new GETFIELD(index); + case Constants.PUTFIELD: + return new PUTFIELD(index); + case Constants.GETSTATIC: + return new GETSTATIC(index); + case Constants.PUTSTATIC: + return new PUTSTATIC(index); + default: + throw new RuntimeException("Oops: Unknown getfield kind:" + kind); + } + } + + + /** Create reference to `this' + */ + public static Instruction createThis() { + return new ALOAD(0); + } + + + /** Create typed return + */ + public static ReturnInstruction createReturn( Type type ) { + switch (type.getType()) { + case Constants.T_ARRAY: + case Constants.T_OBJECT: + return ARETURN; + case Constants.T_INT: + case Constants.T_SHORT: + case Constants.T_BOOLEAN: + case Constants.T_CHAR: + case Constants.T_BYTE: + return IRETURN; + case Constants.T_FLOAT: + return FRETURN; + case Constants.T_DOUBLE: + return DRETURN; + case Constants.T_LONG: + return LRETURN; + case Constants.T_VOID: + return RETURN; + default: + throw new RuntimeException("Invalid type: " + type); + } + } + + + private static final ArithmeticInstruction createBinaryIntOp( char first, String op ) { + switch (first) { + case '-': + return ISUB; + case '+': + return IADD; + case '%': + return IREM; + case '*': + return IMUL; + case '/': + return IDIV; + case '&': + return IAND; + case '|': + return IOR; + case '^': + return IXOR; + case '<': + return ISHL; + case '>': + return op.equals(">>>") + ? (ArithmeticInstruction) IUSHR + : (ArithmeticInstruction) ISHR; + default: + throw new RuntimeException("Invalid operand " + op); + } + } + + + private static final ArithmeticInstruction createBinaryLongOp( char first, String op ) { + switch (first) { + case '-': + return LSUB; + case '+': + return LADD; + case '%': + return LREM; + case '*': + return LMUL; + case '/': + return LDIV; + case '&': + return LAND; + case '|': + return LOR; + case '^': + return LXOR; + case '<': + return LSHL; + case '>': + return op.equals(">>>") + ? (ArithmeticInstruction) LUSHR + : (ArithmeticInstruction) LSHR; + default: + throw new RuntimeException("Invalid operand " + op); + } + } + + + private static final ArithmeticInstruction createBinaryFloatOp( char op ) { + switch (op) { + case '-': + return FSUB; + case '+': + return FADD; + case '*': + return FMUL; + case '/': + return FDIV; + default: + throw new RuntimeException("Invalid operand " + op); + } + } + + + private static final ArithmeticInstruction createBinaryDoubleOp( char op ) { + switch (op) { + case '-': + return DSUB; + case '+': + return DADD; + case '*': + return DMUL; + case '/': + return DDIV; + default: + throw new RuntimeException("Invalid operand " + op); + } + } + + + /** + * Create binary operation for simple basic types, such as int and float. + * + * @param op operation, such as "+", "*", "<<", etc. + */ + public static ArithmeticInstruction createBinaryOperation( String op, Type type ) { + char first = op.toCharArray()[0]; + switch (type.getType()) { + case Constants.T_BYTE: + case Constants.T_SHORT: + case Constants.T_INT: + case Constants.T_CHAR: + return createBinaryIntOp(first, op); + case Constants.T_LONG: + return createBinaryLongOp(first, op); + case Constants.T_FLOAT: + return createBinaryFloatOp(first); + case Constants.T_DOUBLE: + return createBinaryDoubleOp(first); + default: + throw new RuntimeException("Invalid type " + type); + } + } + + + /** + * @param size size of operand, either 1 (int, e.g.) or 2 (double) + */ + public static StackInstruction createPop( int size ) { + return (size == 2) ? (StackInstruction) POP2 : (StackInstruction) POP; + } + + + /** + * @param size size of operand, either 1 (int, e.g.) or 2 (double) + */ + public static StackInstruction createDup( int size ) { + return (size == 2) ? (StackInstruction) DUP2 : (StackInstruction) DUP; + } + + + /** + * @param size size of operand, either 1 (int, e.g.) or 2 (double) + */ + public static StackInstruction createDup_2( int size ) { + return (size == 2) ? (StackInstruction) DUP2_X2 : (StackInstruction) DUP_X2; + } + + + /** + * @param size size of operand, either 1 (int, e.g.) or 2 (double) + */ + public static StackInstruction createDup_1( int size ) { + return (size == 2) ? (StackInstruction) DUP2_X1 : (StackInstruction) DUP_X1; + } + + + /** + * @param index index of local variable + */ + public static LocalVariableInstruction createStore( Type type, int index ) { + switch (type.getType()) { + case Constants.T_BOOLEAN: + case Constants.T_CHAR: + case Constants.T_BYTE: + case Constants.T_SHORT: + case Constants.T_INT: + return new ISTORE(index); + case Constants.T_FLOAT: + return new FSTORE(index); + case Constants.T_DOUBLE: + return new DSTORE(index); + case Constants.T_LONG: + return new LSTORE(index); + case Constants.T_ARRAY: + case Constants.T_OBJECT: + return new ASTORE(index); + default: + throw new RuntimeException("Invalid type " + type); + } + } + + + /** + * @param index index of local variable + */ + public static LocalVariableInstruction createLoad( Type type, int index ) { + switch (type.getType()) { + case Constants.T_BOOLEAN: + case Constants.T_CHAR: + case Constants.T_BYTE: + case Constants.T_SHORT: + case Constants.T_INT: + return new ILOAD(index); + case Constants.T_FLOAT: + return new FLOAD(index); + case Constants.T_DOUBLE: + return new DLOAD(index); + case Constants.T_LONG: + return new LLOAD(index); + case Constants.T_ARRAY: + case Constants.T_OBJECT: + return new ALOAD(index); + default: + throw new RuntimeException("Invalid type " + type); + } + } + + + /** + * @param type type of elements of array, i.e., array.getElementType() + */ + public static ArrayInstruction createArrayLoad( Type type ) { + switch (type.getType()) { + case Constants.T_BOOLEAN: + case Constants.T_BYTE: + return BALOAD; + case Constants.T_CHAR: + return CALOAD; + case Constants.T_SHORT: + return SALOAD; + case Constants.T_INT: + return IALOAD; + case Constants.T_FLOAT: + return FALOAD; + case Constants.T_DOUBLE: + return DALOAD; + case Constants.T_LONG: + return LALOAD; + case Constants.T_ARRAY: + case Constants.T_OBJECT: + return AALOAD; + default: + throw new RuntimeException("Invalid type " + type); + } + } + + + /** + * @param type type of elements of array, i.e., array.getElementType() + */ + public static ArrayInstruction createArrayStore( Type type ) { + switch (type.getType()) { + case Constants.T_BOOLEAN: + case Constants.T_BYTE: + return BASTORE; + case Constants.T_CHAR: + return CASTORE; + case Constants.T_SHORT: + return SASTORE; + case Constants.T_INT: + return IASTORE; + case Constants.T_FLOAT: + return FASTORE; + case Constants.T_DOUBLE: + return DASTORE; + case Constants.T_LONG: + return LASTORE; + case Constants.T_ARRAY: + case Constants.T_OBJECT: + return AASTORE; + default: + throw new RuntimeException("Invalid type " + type); + } + } + + + /** Create conversion operation for two stack operands, this may be an I2C, instruction, e.g., + * if the operands are basic types and CHECKCAST if they are reference types. + */ + public Instruction createCast( Type src_type, Type dest_type ) { + if ((src_type instanceof BasicType) && (dest_type instanceof BasicType)) { + byte dest = dest_type.getType(); + byte src = src_type.getType(); + if (dest == Constants.T_LONG + && (src == Constants.T_CHAR || src == Constants.T_BYTE || src == Constants.T_SHORT)) { + src = Constants.T_INT; + } + String[] short_names = { + "C", "F", "D", "B", "S", "I", "L" + }; + String name = "org.apache.bcel.generic." + short_names[src - Constants.T_CHAR] + "2" + + short_names[dest - Constants.T_CHAR]; + Instruction i = null; + try { + i = (Instruction) java.lang.Class.forName(name).newInstance(); + } catch (Exception e) { + throw new RuntimeException("Could not find instruction: " + name); + } + return i; + } else if ((src_type instanceof ReferenceType) && (dest_type instanceof ReferenceType)) { + if (dest_type instanceof ArrayType) { + return new CHECKCAST(cp.addArrayClass((ArrayType) dest_type)); + } else { + return new CHECKCAST(cp.addClass(((ObjectType) dest_type).getClassName())); + } + } else { + throw new RuntimeException("Can not cast " + src_type + " to " + dest_type); + } + } + + + public GETFIELD createGetField( String class_name, String name, Type t ) { + return new GETFIELD(cp.addFieldref(class_name, name, t.getSignature())); + } + + + public GETSTATIC createGetStatic( String class_name, String name, Type t ) { + return new GETSTATIC(cp.addFieldref(class_name, name, t.getSignature())); + } + + + public PUTFIELD createPutField( String class_name, String name, Type t ) { + return new PUTFIELD(cp.addFieldref(class_name, name, t.getSignature())); + } + + + public PUTSTATIC createPutStatic( String class_name, String name, Type t ) { + return new PUTSTATIC(cp.addFieldref(class_name, name, t.getSignature())); + } + + + public CHECKCAST createCheckCast( ReferenceType t ) { + if (t instanceof ArrayType) { + return new CHECKCAST(cp.addArrayClass((ArrayType) t)); + } else { + return new CHECKCAST(cp.addClass((ObjectType) t)); + } + } + + + public INSTANCEOF createInstanceOf( ReferenceType t ) { + if (t instanceof ArrayType) { + return new INSTANCEOF(cp.addArrayClass((ArrayType) t)); + } else { + return new INSTANCEOF(cp.addClass((ObjectType) t)); + } + } + + + public NEW createNew( ObjectType t ) { + return new NEW(cp.addClass(t)); + } + + + public NEW createNew( String s ) { + return createNew(new ObjectType(s)); + } + + + /** Create new array of given size and type. + * @return an instruction that creates the corresponding array at runtime, i.e. is an AllocationInstruction + */ + public Instruction createNewArray( Type t, short dim ) { + if (dim == 1) { + if (t instanceof ObjectType) { + return new ANEWARRAY(cp.addClass((ObjectType) t)); + } else if (t instanceof ArrayType) { + return new ANEWARRAY(cp.addArrayClass((ArrayType) t)); + } else { + return new NEWARRAY(((BasicType) t).getType()); + } + } else { + ArrayType at; + if (t instanceof ArrayType) { + at = (ArrayType) t; + } else { + at = new ArrayType(t, dim); + } + return new MULTIANEWARRAY(cp.addArrayClass(at), dim); + } + } + + + /** Create "null" value for reference types, 0 for basic types like int + */ + public static Instruction createNull( Type type ) { + switch (type.getType()) { + case Constants.T_ARRAY: + case Constants.T_OBJECT: + return ACONST_NULL; + case Constants.T_INT: + case Constants.T_SHORT: + case Constants.T_BOOLEAN: + case Constants.T_CHAR: + case Constants.T_BYTE: + return ICONST_0; + case Constants.T_FLOAT: + return FCONST_0; + case Constants.T_DOUBLE: + return DCONST_0; + case Constants.T_LONG: + return LCONST_0; + case Constants.T_VOID: + return NOP; + default: + throw new RuntimeException("Invalid type: " + type); + } + } + + + /** Create branch instruction by given opcode, except LOOKUPSWITCH and TABLESWITCH. + * For those you should use the SWITCH compound instruction. + */ + public static BranchInstruction createBranchInstruction( short opcode, InstructionHandle target ) { + switch (opcode) { + case Constants.IFEQ: + return new IFEQ(target); + case Constants.IFNE: + return new IFNE(target); + case Constants.IFLT: + return new IFLT(target); + case Constants.IFGE: + return new IFGE(target); + case Constants.IFGT: + return new IFGT(target); + case Constants.IFLE: + return new IFLE(target); + case Constants.IF_ICMPEQ: + return new IF_ICMPEQ(target); + case Constants.IF_ICMPNE: + return new IF_ICMPNE(target); + case Constants.IF_ICMPLT: + return new IF_ICMPLT(target); + case Constants.IF_ICMPGE: + return new IF_ICMPGE(target); + case Constants.IF_ICMPGT: + return new IF_ICMPGT(target); + case Constants.IF_ICMPLE: + return new IF_ICMPLE(target); + case Constants.IF_ACMPEQ: + return new IF_ACMPEQ(target); + case Constants.IF_ACMPNE: + return new IF_ACMPNE(target); + case Constants.GOTO: + return new GOTO(target); + case Constants.JSR: + return new JSR(target); + case Constants.IFNULL: + return new IFNULL(target); + case Constants.IFNONNULL: + return new IFNONNULL(target); + case Constants.GOTO_W: + return new GOTO_W(target); + case Constants.JSR_W: + return new JSR_W(target); + default: + throw new RuntimeException("Invalid opcode: " + opcode); + } + } + + + public void setClassGen( ClassGen c ) { + cg = c; + } + + + public ClassGen getClassGen() { + return cg; + } + + + public void setConstantPool( ConstantPoolGen c ) { + cp = c; + } + + + public ConstantPoolGen getConstantPool() { + return cp; + } } diff --git a/src/java/org/apache/bcel/generic/InstructionHandle.java b/src/java/org/apache/bcel/generic/InstructionHandle.java index 460b2f29..6e739151 100644 --- a/src/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/java/org/apache/bcel/generic/InstructionHandle.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -43,212 +42,249 @@ import org.apache.bcel.classfile.Utility; * @see InstructionList */ public class InstructionHandle implements java.io.Serializable { - InstructionHandle next, prev; // Will be set from the outside - Instruction instruction; - protected int i_position = -1; // byte code offset of instruction - private Set targeters; - private Map attributes; - - public final InstructionHandle getNext() { return next; } - public final InstructionHandle getPrev() { return prev; } - public final Instruction getInstruction() { return instruction; } - - /** - * Replace current instruction contained in this handle. - * Old instruction is disposed using Instruction.dispose(). - */ - public void setInstruction(Instruction i) { // Overridden in BranchHandle - if(i == null) - throw new ClassGenException("Assigning null to handle"); - - if((this.getClass() != BranchHandle.class) && (i instanceof BranchInstruction)) - throw new ClassGenException("Assigning branch instruction " + i + " to plain handle"); - - if(instruction != null) - instruction.dispose(); - - instruction = i; - } - - /** - * Temporarily swap the current instruction, without disturbing - * anything. Meant to be used by a debugger, implementing - * breakpoints. Current instruction is returned. - */ - public Instruction swapInstruction(Instruction i) { - Instruction oldInstruction = instruction; - instruction = i; - return oldInstruction; - } - - /*private*/ protected InstructionHandle(Instruction i) { - setInstruction(i); - } - - private static InstructionHandle ih_list = null; // List of reusable handles - - /** Factory method. - */ - static final InstructionHandle getInstructionHandle(Instruction i) { - if(ih_list == null) - return new InstructionHandle(i); - else { - InstructionHandle ih = ih_list; - ih_list = ih.next; - - ih.setInstruction(i); - - return ih; - } - } - - /** - * Called by InstructionList.setPositions when setting the position for every - * instruction. In the presence of variable length instructions `setPositions()' - * performs multiple passes over the instruction list to calculate the - * correct (byte) positions and offsets by calling this function. - * - * @param offset additional offset caused by preceding (variable length) instructions - * @param max_offset the maximum offset that may be caused by these instructions - * @return additional offset caused by possible change of this instruction's length - */ - protected int updatePosition(int offset, int max_offset) { - i_position += offset; - return 0; - } - - /** @return the position, i.e., the byte code offset of the contained - * instruction. This is accurate only after - * InstructionList.setPositions() has been called. - */ - public int getPosition() { return i_position; } - - /** Set the position, i.e., the byte code offset of the contained - * instruction. - */ - void setPosition(int pos) { i_position = pos; } - - /** Overridden in BranchHandle - */ - protected void addHandle() { - next = ih_list; - ih_list = this; - } - - /** - * Delete contents, i.e., remove user access and make handle reusable. - */ - void dispose() { - next = prev = null; - instruction.dispose(); - instruction = null; - i_position = -1; - attributes = null; - removeAllTargeters(); - addHandle(); - } - - /** Remove all targeters, if any. - */ - public void removeAllTargeters() { - if(targeters != null) - targeters.clear(); - } - - /** - * Denote this handle isn't referenced anymore by t. - */ - public void removeTargeter(InstructionTargeter t) { - if(targeters != null) { - targeters.remove(t); - } - } - - /** - * Denote this handle is being referenced by t. - */ - public void addTargeter(InstructionTargeter t) { - if(targeters == null) - targeters = new HashSet(); - - //if(!targeters.contains(t)) - targeters.add(t); - } - - public boolean hasTargeters() { - return (targeters != null) && (targeters.size() > 0); - } - - /** - * @return null, if there are no targeters - */ - public InstructionTargeter[] getTargeters() { - if(!hasTargeters()) - return null; - - InstructionTargeter[] t = new InstructionTargeter[targeters.size()]; - targeters.toArray(t); - return t; - } - - /** @return a (verbose) string representation of the contained instruction. - */ - public String toString(boolean verbose) { - return Utility.format(i_position, 4, false, ' ') + ": " + instruction.toString(verbose); - } - - /** @return a string representation of the contained instruction. - */ - public String toString() { - return toString(true); - } - - /** Add an attribute to an instruction handle. - * - * @param key the key object to store/retrieve the attribute - * @param attr the attribute to associate with this handle - */ - public void addAttribute(Object key, Object attr) { - if(attributes == null) - attributes = new HashMap(3); - - attributes.put(key, attr); - } - - /** Delete an attribute of an instruction handle. - * - * @param key the key object to retrieve the attribute - */ - public void removeAttribute(Object key) { - if(attributes != null) - attributes.remove(key); - } - - /** Get attribute of an instruction handle. - * - * @param key the key object to store/retrieve the attribute - */ - public Object getAttribute(Object key) { - if(attributes != null) - return attributes.get(key); - - return null; - } - - /** @return all attributes associated with this handle - */ - public Collection getAttributes() { - if(attributes == null) { - attributes = new HashMap(3); - } - return attributes.values(); - } - - /** Convenience method, simply calls accept() on the contained instruction. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - instruction.accept(v); - } + + InstructionHandle next, prev; // Will be set from the outside + Instruction instruction; + protected int i_position = -1; // byte code offset of instruction + private Set targeters; + private Map attributes; + + + public final InstructionHandle getNext() { + return next; + } + + + public final InstructionHandle getPrev() { + return prev; + } + + + public final Instruction getInstruction() { + return instruction; + } + + + /** + * Replace current instruction contained in this handle. + * Old instruction is disposed using Instruction.dispose(). + */ + public void setInstruction( Instruction i ) { // Overridden in BranchHandle + if (i == null) { + throw new ClassGenException("Assigning null to handle"); + } + if ((this.getClass() != BranchHandle.class) && (i instanceof BranchInstruction)) { + throw new ClassGenException("Assigning branch instruction " + i + " to plain handle"); + } + if (instruction != null) { + instruction.dispose(); + } + instruction = i; + } + + + /** + * Temporarily swap the current instruction, without disturbing + * anything. Meant to be used by a debugger, implementing + * breakpoints. Current instruction is returned. + */ + public Instruction swapInstruction( Instruction i ) { + Instruction oldInstruction = instruction; + instruction = i; + return oldInstruction; + } + + + /*private*/protected InstructionHandle(Instruction i) { + setInstruction(i); + } + + private static InstructionHandle ih_list = null; // List of reusable handles + + + /** Factory method. + */ + static final InstructionHandle getInstructionHandle( Instruction i ) { + if (ih_list == null) { + return new InstructionHandle(i); + } else { + InstructionHandle ih = ih_list; + ih_list = ih.next; + ih.setInstruction(i); + return ih; + } + } + + + /** + * Called by InstructionList.setPositions when setting the position for every + * instruction. In the presence of variable length instructions `setPositions()' + * performs multiple passes over the instruction list to calculate the + * correct (byte) positions and offsets by calling this function. + * + * @param offset additional offset caused by preceding (variable length) instructions + * @param max_offset the maximum offset that may be caused by these instructions + * @return additional offset caused by possible change of this instruction's length + */ + protected int updatePosition( int offset, int max_offset ) { + i_position += offset; + return 0; + } + + + /** @return the position, i.e., the byte code offset of the contained + * instruction. This is accurate only after + * InstructionList.setPositions() has been called. + */ + public int getPosition() { + return i_position; + } + + + /** Set the position, i.e., the byte code offset of the contained + * instruction. + */ + void setPosition( int pos ) { + i_position = pos; + } + + + /** Overridden in BranchHandle + */ + protected void addHandle() { + next = ih_list; + ih_list = this; + } + + + /** + * Delete contents, i.e., remove user access and make handle reusable. + */ + void dispose() { + next = prev = null; + instruction.dispose(); + instruction = null; + i_position = -1; + attributes = null; + removeAllTargeters(); + addHandle(); + } + + + /** Remove all targeters, if any. + */ + public void removeAllTargeters() { + if (targeters != null) { + targeters.clear(); + } + } + + + /** + * Denote this handle isn't referenced anymore by t. + */ + public void removeTargeter( InstructionTargeter t ) { + if (targeters != null) { + targeters.remove(t); + } + } + + + /** + * Denote this handle is being referenced by t. + */ + public void addTargeter( InstructionTargeter t ) { + if (targeters == null) { + targeters = new HashSet(); + } + //if(!targeters.contains(t)) + targeters.add(t); + } + + + public boolean hasTargeters() { + return (targeters != null) && (targeters.size() > 0); + } + + + /** + * @return null, if there are no targeters + */ + public InstructionTargeter[] getTargeters() { + if (!hasTargeters()) { + return null; + } + InstructionTargeter[] t = new InstructionTargeter[targeters.size()]; + targeters.toArray(t); + return t; + } + + + /** @return a (verbose) string representation of the contained instruction. + */ + public String toString( boolean verbose ) { + return Utility.format(i_position, 4, false, ' ') + ": " + instruction.toString(verbose); + } + + + /** @return a string representation of the contained instruction. + */ + public String toString() { + return toString(true); + } + + + /** Add an attribute to an instruction handle. + * + * @param key the key object to store/retrieve the attribute + * @param attr the attribute to associate with this handle + */ + public void addAttribute( Object key, Object attr ) { + if (attributes == null) { + attributes = new HashMap(3); + } + attributes.put(key, attr); + } + + + /** Delete an attribute of an instruction handle. + * + * @param key the key object to retrieve the attribute + */ + public void removeAttribute( Object key ) { + if (attributes != null) { + attributes.remove(key); + } + } + + + /** Get attribute of an instruction handle. + * + * @param key the key object to store/retrieve the attribute + */ + public Object getAttribute( Object key ) { + if (attributes != null) { + return attributes.get(key); + } + return null; + } + + + /** @return all attributes associated with this handle + */ + public Collection getAttributes() { + if (attributes == null) { + attributes = new HashMap(3); + } + return attributes.values(); + } + + + /** Convenience method, simply calls accept() on the contained instruction. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + instruction.accept(v); + } } diff --git a/src/java/org/apache/bcel/generic/InstructionList.java b/src/java/org/apache/bcel/generic/InstructionList.java index 80ee84d8..048b7f05 100644 --- a/src/java/org/apache/bcel/generic/InstructionList.java +++ b/src/java/org/apache/bcel/generic/InstructionList.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -50,1208 +49,1217 @@ import org.apache.bcel.util.ByteSequence; * @see BranchHandle */ public class InstructionList implements Serializable { - private InstructionHandle start = null, end = null; - private int length = 0; // number of elements in list - private int[] byte_positions; // byte code offsets corresponding to instructions - - /** - * Create (empty) instruction list. - */ - public InstructionList() {} - - /** - * Create instruction list containing one instruction. - * @param i initial instruction - */ - public InstructionList(Instruction i) { - append(i); - } - - /** - * Create instruction list containing one instruction. - * @param i initial instruction - */ - public InstructionList(BranchInstruction i) { - append(i); - } - - /** - * Initialize list with (nonnull) compound instruction. Consumes argument - * list, i.e., it becomes empty. - * - * @param c compound instruction (list) - */ - public InstructionList(CompoundInstruction c) { - append(c.getInstructionList()); - } - - /** - * Test for empty list. - */ - public boolean isEmpty() { return start == null; } // && end == null - - /** - * Find the target instruction (handle) that corresponds to the given target - * position (byte code offset). - * - * @param ihs array of instruction handles, i.e. il.getInstructionHandles() - * @param pos array of positions corresponding to ihs, i.e. il.getInstructionPositions() - * @param count length of arrays - * @param target target position to search for - * @return target position's instruction handle if available - */ - public static InstructionHandle findHandle(InstructionHandle[] ihs, - int[] pos, int count, - int target) { - int l=0, r = count - 1; - - /* Do a binary search since the pos array is orderd. + + private InstructionHandle start = null, end = null; + private int length = 0; // number of elements in list + private int[] byte_positions; // byte code offsets corresponding to instructions + + + /** + * Create (empty) instruction list. + */ + public InstructionList() { + } + + + /** + * Create instruction list containing one instruction. + * @param i initial instruction */ - do { - int i = (l + r) / 2; - int j = pos[i]; - - if(j == target) // target found - return ihs[i]; - else if(target < j) // else constrain search area - r = i - 1; - else // target > j - l = i + 1; - } while(l <= r); - - return null; - } - - /** - * Get instruction handle for instruction at byte code position pos. - * This only works properly, if the list is freshly initialized from a byte array or - * setPositions() has been called before this method. - * - * @param pos byte code position to search for - * @return target position's instruction handle if available - */ - public InstructionHandle findHandle(int pos) { - InstructionHandle[] ihs = getInstructionHandles(); - return findHandle(ihs, byte_positions, length, pos); - } - - /** - * Initialize instruction list from byte array. - * - * @param code byte array containing the instructions - */ - public InstructionList(byte[] code) { - ByteSequence bytes = new ByteSequence(code); - InstructionHandle[] ihs = new InstructionHandle[code.length]; - int[] pos = new int[code.length]; // Can't be more than that - int count = 0; // Contains actual length - - /* Pass 1: Create an object for each byte code and append them - * to the list. + public InstructionList(Instruction i) { + append(i); + } + + + /** + * Create instruction list containing one instruction. + * @param i initial instruction */ - try { - while(bytes.available() > 0) { - // Remember byte offset and associate it with the instruction - int off = bytes.getIndex(); - pos[count] = off; - - /* Read one instruction from the byte stream, the byte position is set - * accordingly. - */ - Instruction i = Instruction.readInstruction(bytes); - InstructionHandle ih; - if(i instanceof BranchInstruction) // Use proper append() method - ih = append((BranchInstruction)i); - else - ih = append(i); - - ih.setPosition(off); - ihs[count] = ih; - - count++; - } - } catch(IOException e) { throw new ClassGenException(e.toString()); } - - byte_positions = new int[count]; // Trim to proper size - System.arraycopy(pos, 0, byte_positions, 0, count); - - /* Pass 2: Look for BranchInstruction and update their targets, i.e., - * convert offsets to instruction handles. + public InstructionList(BranchInstruction i) { + append(i); + } + + + /** + * Initialize list with (nonnull) compound instruction. Consumes argument + * list, i.e., it becomes empty. + * + * @param c compound instruction (list) */ - for(int i=0; i < count; i++) { - if(ihs[i] instanceof BranchHandle) { - BranchInstruction bi = (BranchInstruction)ihs[i].instruction; - int target = bi.position + bi.getIndex(); /* Byte code position: - * relative -> absolute. */ - // Search for target position - InstructionHandle ih = findHandle(ihs, pos, count, target); - - if(ih == null) // Search failed - throw new ClassGenException("Couldn't find target for branch: " + bi); - - bi.setTarget(ih); // Update target - - // If it is a Select instruction, update all branch targets - if(bi instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH - Select s = (Select)bi; - int[] indices = s.getIndices(); - - for(int j=0; j < indices.length; j++) { - target = bi.position + indices[j]; - ih = findHandle(ihs, pos, count, target); - - if(ih == null) // Search failed - throw new ClassGenException("Couldn't find target for switch: " + bi); - - s.setTarget(j, ih); // Update target - } - } - } - } - } - - /** - * Append another list after instruction (handle) ih contained in this list. - * Consumes argument list, i.e., it becomes empty. - * - * @param ih where to append the instruction list - * @param il Instruction list to append to this one - * @return instruction handle pointing to the first appended instruction - */ - public InstructionHandle append(InstructionHandle ih, InstructionList il) { - if(il == null) - throw new ClassGenException("Appending null InstructionList"); - - if(il.isEmpty()) // Nothing to do - return ih; - - InstructionHandle next = ih.next, ret = il.start; - - ih.next = il.start; - il.start.prev = ih; - - il.end.next = next; - - if(next != null) // i == end ? - next.prev = il.end; - else - end = il.end; // Update end ... - - length += il.length; // Update length - - il.clear(); - - return ret; - } - - /** - * Append another list after instruction i contained in this list. - * Consumes argument list, i.e., it becomes empty. - * - * @param i where to append the instruction list - * @param il Instruction list to append to this one - * @return instruction handle pointing to the first appended instruction - */ - public InstructionHandle append(Instruction i, InstructionList il) { - InstructionHandle ih; - - if((ih = findInstruction2(i)) == null) // Also applies for empty list - throw new ClassGenException("Instruction " + i + - " is not contained in this list."); - - return append(ih, il); - } - - /** - * Append another list to this one. - * Consumes argument list, i.e., it becomes empty. - * - * @param il list to append to end of this list - * @return instruction handle of the first appended instruction - */ - public InstructionHandle append(InstructionList il) { - if(il == null) - throw new ClassGenException("Appending null InstructionList"); - - if(il.isEmpty()) // Nothing to do - return null; - - if(isEmpty()) { - start = il.start; - end = il.end; - length = il.length; - - il.clear(); - - return start; - } else - return append(end, il); // was end.instruction - } - - /** - * Append an instruction to the end of this list. - * - * @param ih instruction to append - */ - private void append(InstructionHandle ih) { - if(isEmpty()) { - start = end = ih; - ih.next = ih.prev = null; - } - else { - end.next = ih; - ih.prev = end; - ih.next = null; - end = ih; - } - - length++; // Update length - } - - /** - * Append an instruction to the end of this list. - * - * @param i instruction to append - * @return instruction handle of the appended instruction - */ - public InstructionHandle append(Instruction i) { - InstructionHandle ih = InstructionHandle.getInstructionHandle(i); - append(ih); - - return ih; - } - - /** - * Append a branch instruction to the end of this list. - * - * @param i branch instruction to append - * @return branch instruction handle of the appended instruction - */ - public BranchHandle append(BranchInstruction i) { - BranchHandle ih = BranchHandle.getBranchHandle(i); - append(ih); - - return ih; - } - - /** - * Append a single instruction j after another instruction i, which - * must be in this list of course! - * - * @param i Instruction in list - * @param j Instruction to append after i in list - * @return instruction handle of the first appended instruction - */ - public InstructionHandle append(Instruction i, Instruction j) { - return append(i, new InstructionList(j)); - } - - /** - * Append a compound instruction, after instruction i. - * - * @param i Instruction in list - * @param c The composite instruction (containing an InstructionList) - * @return instruction handle of the first appended instruction - */ - public InstructionHandle append(Instruction i, CompoundInstruction c) { - return append(i, c.getInstructionList()); - } - - /** - * Append a compound instruction. - * - * @param c The composite instruction (containing an InstructionList) - * @return instruction handle of the first appended instruction - */ - public InstructionHandle append(CompoundInstruction c) { - return append(c.getInstructionList()); - } - - /** - * Append a compound instruction. - * - * @param ih where to append the instruction list - * @param c The composite instruction (containing an InstructionList) - * @return instruction handle of the first appended instruction - */ - public InstructionHandle append(InstructionHandle ih, CompoundInstruction c) { - return append(ih, c.getInstructionList()); - } - - /** - * Append an instruction after instruction (handle) ih contained in this list. - * - * @param ih where to append the instruction list - * @param i Instruction to append - * @return instruction handle pointing to the first appended instruction - */ - public InstructionHandle append(InstructionHandle ih, Instruction i) { - return append(ih, new InstructionList(i)); - } - - /** - * Append an instruction after instruction (handle) ih contained in this list. - * - * @param ih where to append the instruction list - * @param i Instruction to append - * @return instruction handle pointing to the first appended instruction - */ - public BranchHandle append(InstructionHandle ih, BranchInstruction i) { - BranchHandle bh = BranchHandle.getBranchHandle(i); - InstructionList il = new InstructionList(); - il.append(bh); - - append(ih, il); - - return bh; - } - - /** - * Insert another list before Instruction handle ih contained in this list. - * Consumes argument list, i.e., it becomes empty. - * - * @param ih where to append the instruction list - * @param il Instruction list to insert - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(InstructionHandle ih, InstructionList il) { - if(il == null) - throw new ClassGenException("Inserting null InstructionList"); - - if(il.isEmpty()) // Nothing to do - return ih; - - InstructionHandle prev = ih.prev, ret = il.start; - - ih.prev = il.end; - il.end.next = ih; - - il.start.prev = prev; - - if(prev != null) // ih == start ? - prev.next = il.start; - else - start = il.start; // Update start ... - - length += il.length; // Update length - - il.clear(); - - return ret; - } - - /** - * Insert another list. - * - * @param il list to insert before start of this list - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(InstructionList il) { - if(isEmpty()) { - append(il); // Code is identical for this case - return start; - } - else - return insert(start, il); - } - - /** - * Insert an instruction at start of this list. - * - * @param ih instruction to insert - */ - private void insert(InstructionHandle ih) { - if(isEmpty()) { - start = end = ih; - ih.next = ih.prev = null; - } else { - start.prev = ih; - ih.next = start; - ih.prev = null; - start = ih; - } - - length++; - } - - /** - * Insert another list before Instruction i contained in this list. - * Consumes argument list, i.e., it becomes empty. - * - * @param i where to append the instruction list - * @param il Instruction list to insert - * @return instruction handle pointing to the first inserted instruction, - * i.e., il.getStart() - */ - public InstructionHandle insert(Instruction i, InstructionList il) { - InstructionHandle ih; - - if((ih = findInstruction1(i)) == null) - throw new ClassGenException("Instruction " + i + - " is not contained in this list."); - - return insert(ih, il); - } - - /** - * Insert an instruction at start of this list. - * - * @param i instruction to insert - * @return instruction handle of the inserted instruction - */ - public InstructionHandle insert(Instruction i) { - InstructionHandle ih = InstructionHandle.getInstructionHandle(i); - insert(ih); - - return ih; - } - - /** - * Insert a branch instruction at start of this list. - * - * @param i branch instruction to insert - * @return branch instruction handle of the appended instruction - */ - public BranchHandle insert(BranchInstruction i) { - BranchHandle ih = BranchHandle.getBranchHandle(i); - insert(ih); - return ih; - } - - /** - * Insert a single instruction j before another instruction i, which - * must be in this list of course! - * - * @param i Instruction in list - * @param j Instruction to insert before i in list - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(Instruction i, Instruction j) { - return insert(i, new InstructionList(j)); - } - - /** - * Insert a compound instruction before instruction i. - * - * @param i Instruction in list - * @param c The composite instruction (containing an InstructionList) - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(Instruction i, CompoundInstruction c) { - return insert(i, c.getInstructionList()); - } - - /** - * Insert a compound instruction. - * - * @param c The composite instruction (containing an InstructionList) - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(CompoundInstruction c) { - return insert(c.getInstructionList()); - } - - /** - * Insert an instruction before instruction (handle) ih contained in this list. - * - * @param ih where to insert to the instruction list - * @param i Instruction to insert - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(InstructionHandle ih, Instruction i) { - return insert(ih, new InstructionList(i)); - } - - /** - * Insert a compound instruction. - * - * @param ih where to insert the instruction list - * @param c The composite instruction (containing an InstructionList) - * @return instruction handle of the first inserted instruction - */ - public InstructionHandle insert(InstructionHandle ih, CompoundInstruction c) { - return insert(ih, c.getInstructionList()); - } - - /** - * Insert an instruction before instruction (handle) ih contained in this list. - * - * @param ih where to insert to the instruction list - * @param i Instruction to insert - * @return instruction handle of the first inserted instruction - */ - public BranchHandle insert(InstructionHandle ih, BranchInstruction i) { - BranchHandle bh = BranchHandle.getBranchHandle(i); - InstructionList il = new InstructionList(); - il.append(bh); - - insert(ih, il); - - return bh; - } - - /** - * Take all instructions (handles) from "start" to "end" and append them after the - * new location "target". Of course, "end" must be after "start" and target must - * not be located withing this range. If you want to move something to the start of - * the list use null as value for target.
            - * Any instruction targeters pointing to handles within the block, keep their targets. - * - * @param start of moved block - * @param end of moved block - * @param target of moved block - */ - public void move(InstructionHandle start, InstructionHandle end, InstructionHandle target) { - // Step 1: Check constraints - - if((start == null) || (end == null)) - throw new ClassGenException("Invalid null handle: From " + start + " to " + end); - - if((target == start) || (target == end)) - throw new ClassGenException("Invalid range: From " + start + " to " + end + - " contains target " + target); - - for(InstructionHandle ih = start; ih != end.next; ih = ih.next) { - if(ih == null) // At end of list, end not found yet - throw new ClassGenException("Invalid range: From " + start + " to " + end); - else if(ih == target) // target may be null - throw new ClassGenException("Invalid range: From " + start + " to " + end + - " contains target " + target); - } - - // Step 2: Temporarily remove the given instructions from the list - - InstructionHandle prev = start.prev, next = end.next; - - if(prev != null) - prev.next = next; - else // start == this.start! - this.start = next; - - if(next != null) - next.prev = prev; - else // end == this.end! - this.end = prev; - - start.prev = end.next = null; - - // Step 3: append after target - - if(target == null) { // append to start of list - if (this.start != null) - this.start.prev = end; - end.next = this.start; - this.start = start; - } else { - next = target.next; - - target.next = start; - start.prev = target; - end.next = next; - - if(next != null) - next.prev = end; - else - this.end = end; - } - } - - /** - * Move a single instruction (handle) to a new location. - * - * @param ih moved instruction - * @param target new location of moved instruction - */ - public void move(InstructionHandle ih, InstructionHandle target) { - move(ih, ih, target); - } - - /** - * Remove from instruction `prev' to instruction `next' both contained - * in this list. Throws TargetLostException when one of the removed instruction handles - * is still being targeted. - * - * @param prev where to start deleting (predecessor, exclusive) - * @param next where to end deleting (successor, exclusive) - */ - private void remove(InstructionHandle prev, InstructionHandle next) - throws TargetLostException - { - InstructionHandle first, last; // First and last deleted instruction - - if((prev == null) && (next == null)) { // singleton list - first = last = start; - start = end = null; - } else { - if(prev == null) { // At start of list - first = start; - start = next; - } else { - first = prev.next; - prev.next = next; - } - - if(next == null) { // At end of list - last = end; - end = prev; - } else { - last = next.prev; - next.prev = prev; - } - } - - first.prev = null; // Completely separated from rest of list - last.next = null; - - List target_vec = new ArrayList(); - - for(InstructionHandle ih=first; ih != null; ih = ih.next) - ih.getInstruction().dispose(); // e.g. BranchInstructions release their targets - - StringBuffer buf = new StringBuffer("{ "); - for(InstructionHandle ih=first; ih != null; ih = next) { - next = ih.next; - length--; - - if(ih.hasTargeters()) { // Still got targeters? - target_vec.add(ih); - buf.append(ih.toString(true) + " "); - ih.next = ih.prev = null; - } else - ih.dispose(); - } - - buf.append("}"); - - if(!target_vec.isEmpty()) { - InstructionHandle[] targeted = new InstructionHandle[target_vec.size()]; - target_vec.toArray(targeted); - throw new TargetLostException(targeted, buf.toString()); - } - } - - /** - * Remove instruction from this list. The corresponding Instruction - * handles must not be reused! - * - * @param ih instruction (handle) to remove - */ - public void delete(InstructionHandle ih) throws TargetLostException { - remove(ih.prev, ih.next); - } - - /** - * Remove instruction from this list. The corresponding Instruction - * handles must not be reused! - * - * @param i instruction to remove - */ - public void delete(Instruction i) throws TargetLostException { - InstructionHandle ih; - - if((ih = findInstruction1(i)) == null) - throw new ClassGenException("Instruction " + i + - " is not contained in this list."); - delete(ih); - } - - /** - * Remove instructions from instruction `from' to instruction `to' contained - * in this list. The user must ensure that `from' is an instruction before - * `to', or risk havoc. The corresponding Instruction handles must not be reused! - * - * @param from where to start deleting (inclusive) - * @param to where to end deleting (inclusive) - */ - public void delete(InstructionHandle from, InstructionHandle to) - throws TargetLostException - { - remove(from.prev, to.next); - } - - /** - * Remove instructions from instruction `from' to instruction `to' contained - * in this list. The user must ensure that `from' is an instruction before - * `to', or risk havoc. The corresponding Instruction handles must not be reused! - * - * @param from where to start deleting (inclusive) - * @param to where to end deleting (inclusive) - */ - public void delete(Instruction from, Instruction to) throws TargetLostException { - InstructionHandle from_ih, to_ih; - - if((from_ih = findInstruction1(from)) == null) - throw new ClassGenException("Instruction " + from + - " is not contained in this list."); - - if((to_ih = findInstruction2(to)) == null) - throw new ClassGenException("Instruction " + to + - " is not contained in this list."); - delete(from_ih, to_ih); - } - - /** - * Search for given Instruction reference, start at beginning of list. - * - * @param i instruction to search for - * @return instruction found on success, null otherwise - */ - private InstructionHandle findInstruction1(Instruction i) { - for(InstructionHandle ih=start; ih != null; ih = ih.next) - if(ih.instruction == i) - return ih; - - return null; - } - - /** - * Search for given Instruction reference, start at end of list - * - * @param i instruction to search for - * @return instruction found on success, null otherwise - */ - private InstructionHandle findInstruction2(Instruction i) { - for(InstructionHandle ih=end; ih != null; ih = ih.prev) - if(ih.instruction == i) - return ih; - - return null; - } - - public boolean contains(InstructionHandle i) { - if(i == null) - return false; - - for(InstructionHandle ih=start; ih != null; ih = ih.next) - if(ih == i) - return true; - - return false; - } - - public boolean contains(Instruction i) { - return findInstruction1(i) != null; - } - - public void setPositions() { - setPositions(false); - } - - /** - * Give all instructions their position number (offset in byte stream), i.e., - * make the list ready to be dumped. - * - * @param check Perform sanity checks, e.g. if all targeted instructions really belong - * to this list - */ - public void setPositions(boolean check) { - int max_additional_bytes = 0, additional_bytes = 0; - int index = 0, count = 0; - int[] pos = new int[length]; - - /* Pass 0: Sanity checks + public InstructionList(CompoundInstruction c) { + append(c.getInstructionList()); + } + + + /** + * Test for empty list. */ - if(check) { - for(InstructionHandle ih=start; ih != null; ih = ih.next) { - Instruction i = ih.instruction; - - if(i instanceof BranchInstruction) { // target instruction within list? - Instruction inst = ((BranchInstruction)i).getTarget().instruction; - if(!contains(inst)) - throw new ClassGenException("Branch target of " + - Constants.OPCODE_NAMES[i.opcode] + ":" + - inst + " not in instruction list"); - - if(i instanceof Select) { - InstructionHandle[] targets = ((Select)i).getTargets(); - - for(int j=0; j < targets.length; j++) { - inst = targets[j].instruction; - if(!contains(inst)) - throw new ClassGenException("Branch target of " + - Constants.OPCODE_NAMES[i.opcode] + ":" + - inst + " not in instruction list"); - } - } - - if(!(ih instanceof BranchHandle)) - throw new ClassGenException("Branch instruction " + - Constants.OPCODE_NAMES[i.opcode] + ":" + - inst + " not contained in BranchHandle."); - - } - } - } - - /* Pass 1: Set position numbers and sum up the maximum number of bytes an - * instruction may be shifted. + public boolean isEmpty() { + return start == null; + } // && end == null + + + /** + * Find the target instruction (handle) that corresponds to the given target + * position (byte code offset). + * + * @param ihs array of instruction handles, i.e. il.getInstructionHandles() + * @param pos array of positions corresponding to ihs, i.e. il.getInstructionPositions() + * @param count length of arrays + * @param target target position to search for + * @return target position's instruction handle if available */ - for(InstructionHandle ih=start; ih != null; ih = ih.next) { - Instruction i = ih.instruction; - - ih.setPosition(index); - pos[count++] = index; - - /* Get an estimate about how many additional bytes may be added, because - * BranchInstructions may have variable length depending on the target - * offset (short vs. int) or alignment issues (TABLESWITCH and - * LOOKUPSWITCH). - */ - switch(i.getOpcode()) { - case Constants.JSR: case Constants.GOTO: - max_additional_bytes += 2; - break; - - case Constants.TABLESWITCH: case Constants.LOOKUPSWITCH: - max_additional_bytes += 3; - break; - } - - index += i.getLength(); - } - - /* Pass 2: Expand the variable-length (Branch)Instructions depending on - * the target offset (short or int) and ensure that branch targets are - * within this list. + public static InstructionHandle findHandle( InstructionHandle[] ihs, int[] pos, int count, + int target ) { + int l = 0, r = count - 1; + /* Do a binary search since the pos array is orderd. + */ + do { + int i = (l + r) / 2; + int j = pos[i]; + if (j == target) { + return ihs[i]; + } else if (target < j) { + r = i - 1; + } else { + l = i + 1; + } + } while (l <= r); + return null; + } + + + /** + * Get instruction handle for instruction at byte code position pos. + * This only works properly, if the list is freshly initialized from a byte array or + * setPositions() has been called before this method. + * + * @param pos byte code position to search for + * @return target position's instruction handle if available */ - for(InstructionHandle ih=start; ih != null; ih = ih.next) - additional_bytes += ih.updatePosition(additional_bytes, max_additional_bytes); + public InstructionHandle findHandle( int pos ) { + InstructionHandle[] ihs = getInstructionHandles(); + return findHandle(ihs, byte_positions, length, pos); + } - /* Pass 3: Update position numbers (which may have changed due to the - * preceding expansions), like pass 1. + + /** + * Initialize instruction list from byte array. + * + * @param code byte array containing the instructions */ - index=count=0; - for(InstructionHandle ih=start; ih != null; ih = ih.next) { - Instruction i = ih.instruction; - - ih.setPosition(index); - pos[count++] = index; - index += i.getLength(); - } - - byte_positions = new int[count]; // Trim to proper size - System.arraycopy(pos, 0, byte_positions, 0, count); - } - - /** - * When everything is finished, use this method to convert the instruction - * list into an array of bytes. - * - * @return the byte code ready to be dumped - */ - public byte[] getByteCode() { - // Update position indices of instructions - setPositions(); - - ByteArrayOutputStream b = new ByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(b); - - try { - for(InstructionHandle ih=start; ih != null; ih = ih.next) { - Instruction i = ih.instruction; - i.dump(out); // Traverse list - } - } catch(IOException e) { - System.err.println(e); - return null; - } - - return b.toByteArray(); - } - - /** - * @return an array of instructions without target information for branch instructions. - */ - public Instruction[] getInstructions() { - ByteSequence bytes = new ByteSequence(getByteCode()); - List instructions = new ArrayList(); - - try { - while(bytes.available() > 0) { - instructions.add(Instruction.readInstruction(bytes)); - } - } catch(IOException e) { throw new ClassGenException(e.toString()); } - - return (Instruction[])instructions.toArray(new Instruction[instructions.size()]); - } - - public String toString() { - return toString(true); - } - - /** - * @param verbose toggle output format - * @return String containing all instructions in this list. - */ - public String toString(boolean verbose) { - StringBuffer buf = new StringBuffer(); - - for(InstructionHandle ih=start; ih != null; ih = ih.next) { - buf.append(ih.toString(verbose)).append("\n"); - } - - return buf.toString(); - } - - /** - * @return Enumeration that lists all instructions (handles) - */ - public Iterator iterator() { - return new Iterator() { - private InstructionHandle ih = start; - - public Object next() { - InstructionHandle i = ih; - ih = ih.next; - return i; - } - - public void remove() { - throw new UnsupportedOperationException(); - } - - public boolean hasNext() { return ih != null; } - }; - } - - /** - * @return array containing all instructions (handles) - */ - public InstructionHandle[] getInstructionHandles() { - InstructionHandle[] ihs = new InstructionHandle[length]; - InstructionHandle ih = start; - - for(int i=0; i < length; i++) { - ihs[i] = ih; - ih = ih.next; - } - - return ihs; - } - - /** - * Get positions (offsets) of all instructions in the list. This relies on that - * the list has been freshly created from an byte code array, or that setPositions() - * has been called. Otherwise this may be inaccurate. - * - * @return array containing all instruction's offset in byte code - */ - public int[] getInstructionPositions() { return byte_positions; } - - /** - * @return complete, i.e., deep copy of this list - */ - public InstructionList copy() { - Map map = new HashMap(); - InstructionList il = new InstructionList(); - - /* Pass 1: Make copies of all instructions, append them to the new list - * and associate old instruction references with the new ones, i.e., - * a 1:1 mapping. + public InstructionList(byte[] code) { + ByteSequence bytes = new ByteSequence(code); + InstructionHandle[] ihs = new InstructionHandle[code.length]; + int[] pos = new int[code.length]; // Can't be more than that + int count = 0; // Contains actual length + /* Pass 1: Create an object for each byte code and append them + * to the list. + */ + try { + while (bytes.available() > 0) { + // Remember byte offset and associate it with the instruction + int off = bytes.getIndex(); + pos[count] = off; + /* Read one instruction from the byte stream, the byte position is set + * accordingly. + */ + Instruction i = Instruction.readInstruction(bytes); + InstructionHandle ih; + if (i instanceof BranchInstruction) { + ih = append((BranchInstruction) i); + } else { + ih = append(i); + } + ih.setPosition(off); + ihs[count] = ih; + count++; + } + } catch (IOException e) { + throw new ClassGenException(e.toString()); + } + byte_positions = new int[count]; // Trim to proper size + System.arraycopy(pos, 0, byte_positions, 0, count); + /* Pass 2: Look for BranchInstruction and update their targets, i.e., + * convert offsets to instruction handles. + */ + for (int i = 0; i < count; i++) { + if (ihs[i] instanceof BranchHandle) { + BranchInstruction bi = (BranchInstruction) ihs[i].instruction; + int target = bi.position + bi.getIndex(); /* Byte code position: + * relative -> absolute. */ + // Search for target position + InstructionHandle ih = findHandle(ihs, pos, count, target); + if (ih == null) { + throw new ClassGenException("Couldn't find target for branch: " + bi); + } + bi.setTarget(ih); // Update target + // If it is a Select instruction, update all branch targets + if (bi instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH + Select s = (Select) bi; + int[] indices = s.getIndices(); + for (int j = 0; j < indices.length; j++) { + target = bi.position + indices[j]; + ih = findHandle(ihs, pos, count, target); + if (ih == null) { + throw new ClassGenException("Couldn't find target for switch: " + bi); + } + s.setTarget(j, ih); // Update target + } + } + } + } + } + + + /** + * Append another list after instruction (handle) ih contained in this list. + * Consumes argument list, i.e., it becomes empty. + * + * @param ih where to append the instruction list + * @param il Instruction list to append to this one + * @return instruction handle pointing to the first appended instruction */ - for(InstructionHandle ih=start; ih != null; ih = ih.next) { - Instruction i = ih.instruction; - Instruction c = i.copy(); // Use clone for shallow copy + public InstructionHandle append( InstructionHandle ih, InstructionList il ) { + if (il == null) { + throw new ClassGenException("Appending null InstructionList"); + } + if (il.isEmpty()) { + return ih; + } + InstructionHandle next = ih.next, ret = il.start; + ih.next = il.start; + il.start.prev = ih; + il.end.next = next; + if (next != null) { + next.prev = il.end; + } else { + end = il.end; // Update end ... + } + length += il.length; // Update length + il.clear(); + return ret; + } + - if(c instanceof BranchInstruction) - map.put(ih, il.append((BranchInstruction)c)); - else - map.put(ih, il.append(c)); + /** + * Append another list after instruction i contained in this list. + * Consumes argument list, i.e., it becomes empty. + * + * @param i where to append the instruction list + * @param il Instruction list to append to this one + * @return instruction handle pointing to the first appended instruction + */ + public InstructionHandle append( Instruction i, InstructionList il ) { + InstructionHandle ih; + if ((ih = findInstruction2(i)) == null) { + throw new ClassGenException("Instruction " + i + " is not contained in this list."); + } + return append(ih, il); } - - /* Pass 2: Update branch targets. + + + /** + * Append another list to this one. + * Consumes argument list, i.e., it becomes empty. + * + * @param il list to append to end of this list + * @return instruction handle of the first appended instruction */ - InstructionHandle ih=start; - InstructionHandle ch=il.start; - - while(ih != null) { - Instruction i = ih.instruction; - Instruction c = ch.instruction; - - if(i instanceof BranchInstruction) { - BranchInstruction bi = (BranchInstruction)i; - BranchInstruction bc = (BranchInstruction)c; - InstructionHandle itarget = bi.getTarget(); // old target - - // New target is in hash map - bc.setTarget((InstructionHandle)map.get(itarget)); - - if(bi instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH - InstructionHandle[] itargets = ((Select)bi).getTargets(); - InstructionHandle[] ctargets = ((Select)bc).getTargets(); - - for(int j=0; j < itargets.length; j++) { // Update all targets - ctargets[j] = (InstructionHandle)map.get(itargets[j]); - } - } - } - - ih = ih.next; - ch = ch.next; - } - - return il; - } - - /** Replace all references to the old constant pool with references to the new - * constant pool - */ - public void replaceConstantPool(ConstantPoolGen old_cp, ConstantPoolGen new_cp) { - for(InstructionHandle ih=start; ih != null; ih = ih.next) { - Instruction i = ih.instruction; - - if(i instanceof CPInstruction) { - CPInstruction ci = (CPInstruction)i; - Constant c = old_cp.getConstant(ci.getIndex()); - ci.setIndex(new_cp.addConstant(c, old_cp)); - } - } - } - - private void clear() { - start = end = null; - length = 0; - } - - /** - * Delete contents of list. Provides besser memory utilization, - * because the system then may reuse the instruction handles. This - * method is typically called right after - * MethodGen.getMethod(). - */ - public void dispose() { - // Traverse in reverse order, because ih.next is overwritten - for(InstructionHandle ih=end; ih != null; ih = ih.prev) - /* Causes BranchInstructions to release target and targeters, because it - * calls dispose() on the contained instruction. - */ - ih.dispose(); - - clear(); - } - - /** - * @return start of list - */ - public InstructionHandle getStart() { return start; } - - /** - * @return end of list - */ - public InstructionHandle getEnd() { return end; } - - /** - * @return length of list (Number of instructions, not bytes) - */ - public int getLength() { return length; } - - /** - * @return length of list (Number of instructions, not bytes) - */ - public int size() { return length; } - - /** - * Redirect all references from old_target to new_target, i.e., update targets - * of branch instructions. - * - * @param old_target the old target instruction handle - * @param new_target the new target instruction handle - */ - public void redirectBranches(InstructionHandle old_target, - InstructionHandle new_target) { - for(InstructionHandle ih = start; ih != null; ih = ih.next) { - Instruction i = ih.getInstruction(); - - if(i instanceof BranchInstruction) { - BranchInstruction b = (BranchInstruction)i; - InstructionHandle target = b.getTarget(); - - if(target == old_target) - b.setTarget(new_target); - - if(b instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH - InstructionHandle[] targets = ((Select)b).getTargets(); - - for(int j=0; j < targets.length; j++) // Update targets - if(targets[j] == old_target) - ((Select)b).setTarget(j, new_target); - } - } - } - } - - /** - * Redirect all references of local variables from old_target to new_target. - * - * @param lg array of local variables - * @param old_target the old target instruction handle - * @param new_target the new target instruction handle - * @see MethodGen - */ - public void redirectLocalVariables(LocalVariableGen[] lg, - InstructionHandle old_target, - InstructionHandle new_target) { - for(int i=0; i < lg.length; i++) { - InstructionHandle start = lg[i].getStart(); - InstructionHandle end = lg[i].getEnd(); - - if(start == old_target) - lg[i].setStart(new_target); - - if(end == old_target) - lg[i].setEnd(new_target); - } - } - - /** - * Redirect all references of exception handlers from old_target to new_target. - * - * @param exceptions array of exception handlers - * @param old_target the old target instruction handle - * @param new_target the new target instruction handle - * @see MethodGen - */ - public void redirectExceptionHandlers(CodeExceptionGen[] exceptions, - InstructionHandle old_target, - InstructionHandle new_target) { - for(int i=0; i < exceptions.length; i++) { - if(exceptions[i].getStartPC() == old_target) - exceptions[i].setStartPC(new_target); - - if(exceptions[i].getEndPC() == old_target) - exceptions[i].setEndPC(new_target); - - if(exceptions[i].getHandlerPC() == old_target) - exceptions[i].setHandlerPC(new_target); - } - } - - private List observers; - - /** Add observer for this object. - */ - public void addObserver(InstructionListObserver o) { - if(observers == null) - observers = new ArrayList(); - - observers.add(o); - } - - /** Remove observer for this object. - */ - public void removeObserver(InstructionListObserver o) { - if(observers != null) - observers.remove(o); - } - - /** Call notify() method on all observers. This method is not called - * automatically whenever the state has changed, but has to be - * called by the user after he has finished editing the object. - */ - public void update() { - if(observers != null) - for(Iterator e = observers.iterator(); e.hasNext(); ) - ((InstructionListObserver)e.next()).notify(this); - } -} + public InstructionHandle append( InstructionList il ) { + if (il == null) { + throw new ClassGenException("Appending null InstructionList"); + } + if (il.isEmpty()) { + return null; + } + if (isEmpty()) { + start = il.start; + end = il.end; + length = il.length; + il.clear(); + return start; + } else { + return append(end, il); // was end.instruction + } + } + + + /** + * Append an instruction to the end of this list. + * + * @param ih instruction to append + */ + private void append( InstructionHandle ih ) { + if (isEmpty()) { + start = end = ih; + ih.next = ih.prev = null; + } else { + end.next = ih; + ih.prev = end; + ih.next = null; + end = ih; + } + length++; // Update length + } + + + /** + * Append an instruction to the end of this list. + * + * @param i instruction to append + * @return instruction handle of the appended instruction + */ + public InstructionHandle append( Instruction i ) { + InstructionHandle ih = InstructionHandle.getInstructionHandle(i); + append(ih); + return ih; + } + + + /** + * Append a branch instruction to the end of this list. + * + * @param i branch instruction to append + * @return branch instruction handle of the appended instruction + */ + public BranchHandle append( BranchInstruction i ) { + BranchHandle ih = BranchHandle.getBranchHandle(i); + append(ih); + return ih; + } + + + /** + * Append a single instruction j after another instruction i, which + * must be in this list of course! + * + * @param i Instruction in list + * @param j Instruction to append after i in list + * @return instruction handle of the first appended instruction + */ + public InstructionHandle append( Instruction i, Instruction j ) { + return append(i, new InstructionList(j)); + } + + + /** + * Append a compound instruction, after instruction i. + * + * @param i Instruction in list + * @param c The composite instruction (containing an InstructionList) + * @return instruction handle of the first appended instruction + */ + public InstructionHandle append( Instruction i, CompoundInstruction c ) { + return append(i, c.getInstructionList()); + } + + + /** + * Append a compound instruction. + * + * @param c The composite instruction (containing an InstructionList) + * @return instruction handle of the first appended instruction + */ + public InstructionHandle append( CompoundInstruction c ) { + return append(c.getInstructionList()); + } + + + /** + * Append a compound instruction. + * + * @param ih where to append the instruction list + * @param c The composite instruction (containing an InstructionList) + * @return instruction handle of the first appended instruction + */ + public InstructionHandle append( InstructionHandle ih, CompoundInstruction c ) { + return append(ih, c.getInstructionList()); + } + + + /** + * Append an instruction after instruction (handle) ih contained in this list. + * + * @param ih where to append the instruction list + * @param i Instruction to append + * @return instruction handle pointing to the first appended instruction + */ + public InstructionHandle append( InstructionHandle ih, Instruction i ) { + return append(ih, new InstructionList(i)); + } + + + /** + * Append an instruction after instruction (handle) ih contained in this list. + * + * @param ih where to append the instruction list + * @param i Instruction to append + * @return instruction handle pointing to the first appended instruction + */ + public BranchHandle append( InstructionHandle ih, BranchInstruction i ) { + BranchHandle bh = BranchHandle.getBranchHandle(i); + InstructionList il = new InstructionList(); + il.append(bh); + append(ih, il); + return bh; + } + + + /** + * Insert another list before Instruction handle ih contained in this list. + * Consumes argument list, i.e., it becomes empty. + * + * @param ih where to append the instruction list + * @param il Instruction list to insert + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert( InstructionHandle ih, InstructionList il ) { + if (il == null) { + throw new ClassGenException("Inserting null InstructionList"); + } + if (il.isEmpty()) { + return ih; + } + InstructionHandle prev = ih.prev, ret = il.start; + ih.prev = il.end; + il.end.next = ih; + il.start.prev = prev; + if (prev != null) { + prev.next = il.start; + } else { + start = il.start; // Update start ... + } + length += il.length; // Update length + il.clear(); + return ret; + } + + + /** + * Insert another list. + * + * @param il list to insert before start of this list + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert( InstructionList il ) { + if (isEmpty()) { + append(il); // Code is identical for this case + return start; + } else { + return insert(start, il); + } + } + + + /** + * Insert an instruction at start of this list. + * + * @param ih instruction to insert + */ + private void insert( InstructionHandle ih ) { + if (isEmpty()) { + start = end = ih; + ih.next = ih.prev = null; + } else { + start.prev = ih; + ih.next = start; + ih.prev = null; + start = ih; + } + length++; + } + + + /** + * Insert another list before Instruction i contained in this list. + * Consumes argument list, i.e., it becomes empty. + * + * @param i where to append the instruction list + * @param il Instruction list to insert + * @return instruction handle pointing to the first inserted instruction, + * i.e., il.getStart() + */ + public InstructionHandle insert( Instruction i, InstructionList il ) { + InstructionHandle ih; + if ((ih = findInstruction1(i)) == null) { + throw new ClassGenException("Instruction " + i + " is not contained in this list."); + } + return insert(ih, il); + } + + + /** + * Insert an instruction at start of this list. + * + * @param i instruction to insert + * @return instruction handle of the inserted instruction + */ + public InstructionHandle insert( Instruction i ) { + InstructionHandle ih = InstructionHandle.getInstructionHandle(i); + insert(ih); + return ih; + } + + + /** + * Insert a branch instruction at start of this list. + * + * @param i branch instruction to insert + * @return branch instruction handle of the appended instruction + */ + public BranchHandle insert( BranchInstruction i ) { + BranchHandle ih = BranchHandle.getBranchHandle(i); + insert(ih); + return ih; + } + + + /** + * Insert a single instruction j before another instruction i, which + * must be in this list of course! + * + * @param i Instruction in list + * @param j Instruction to insert before i in list + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert( Instruction i, Instruction j ) { + return insert(i, new InstructionList(j)); + } + + + /** + * Insert a compound instruction before instruction i. + * + * @param i Instruction in list + * @param c The composite instruction (containing an InstructionList) + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert( Instruction i, CompoundInstruction c ) { + return insert(i, c.getInstructionList()); + } + + + /** + * Insert a compound instruction. + * + * @param c The composite instruction (containing an InstructionList) + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert( CompoundInstruction c ) { + return insert(c.getInstructionList()); + } + + + /** + * Insert an instruction before instruction (handle) ih contained in this list. + * + * @param ih where to insert to the instruction list + * @param i Instruction to insert + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert( InstructionHandle ih, Instruction i ) { + return insert(ih, new InstructionList(i)); + } + + + /** + * Insert a compound instruction. + * + * @param ih where to insert the instruction list + * @param c The composite instruction (containing an InstructionList) + * @return instruction handle of the first inserted instruction + */ + public InstructionHandle insert( InstructionHandle ih, CompoundInstruction c ) { + return insert(ih, c.getInstructionList()); + } + + + /** + * Insert an instruction before instruction (handle) ih contained in this list. + * + * @param ih where to insert to the instruction list + * @param i Instruction to insert + * @return instruction handle of the first inserted instruction + */ + public BranchHandle insert( InstructionHandle ih, BranchInstruction i ) { + BranchHandle bh = BranchHandle.getBranchHandle(i); + InstructionList il = new InstructionList(); + il.append(bh); + insert(ih, il); + return bh; + } + + + /** + * Take all instructions (handles) from "start" to "end" and append them after the + * new location "target". Of course, "end" must be after "start" and target must + * not be located withing this range. If you want to move something to the start of + * the list use null as value for target.
            + * Any instruction targeters pointing to handles within the block, keep their targets. + * + * @param start of moved block + * @param end of moved block + * @param target of moved block + */ + public void move( InstructionHandle start, InstructionHandle end, InstructionHandle target ) { + // Step 1: Check constraints + if ((start == null) || (end == null)) { + throw new ClassGenException("Invalid null handle: From " + start + " to " + end); + } + if ((target == start) || (target == end)) { + throw new ClassGenException("Invalid range: From " + start + " to " + end + + " contains target " + target); + } + for (InstructionHandle ih = start; ih != end.next; ih = ih.next) { + if (ih == null) { + throw new ClassGenException("Invalid range: From " + start + " to " + end); + } else if (ih == target) { + throw new ClassGenException("Invalid range: From " + start + " to " + end + + " contains target " + target); + } + } + // Step 2: Temporarily remove the given instructions from the list + InstructionHandle prev = start.prev, next = end.next; + if (prev != null) { + prev.next = next; + } else { + this.start = next; + } + if (next != null) { + next.prev = prev; + } else { + this.end = prev; + } + start.prev = end.next = null; + // Step 3: append after target + if (target == null) { // append to start of list + if (this.start != null) { + this.start.prev = end; + } + end.next = this.start; + this.start = start; + } else { + next = target.next; + target.next = start; + start.prev = target; + end.next = next; + if (next != null) { + next.prev = end; + } else { + this.end = end; + } + } + } + + + /** + * Move a single instruction (handle) to a new location. + * + * @param ih moved instruction + * @param target new location of moved instruction + */ + public void move( InstructionHandle ih, InstructionHandle target ) { + move(ih, ih, target); + } + + + /** + * Remove from instruction `prev' to instruction `next' both contained + * in this list. Throws TargetLostException when one of the removed instruction handles + * is still being targeted. + * + * @param prev where to start deleting (predecessor, exclusive) + * @param next where to end deleting (successor, exclusive) + */ + private void remove( InstructionHandle prev, InstructionHandle next ) + throws TargetLostException { + InstructionHandle first, last; // First and last deleted instruction + if ((prev == null) && (next == null)) { // singleton list + first = last = start; + start = end = null; + } else { + if (prev == null) { // At start of list + first = start; + start = next; + } else { + first = prev.next; + prev.next = next; + } + if (next == null) { // At end of list + last = end; + end = prev; + } else { + last = next.prev; + next.prev = prev; + } + } + first.prev = null; // Completely separated from rest of list + last.next = null; + List target_vec = new ArrayList(); + for (InstructionHandle ih = first; ih != null; ih = ih.next) { + ih.getInstruction().dispose(); // e.g. BranchInstructions release their targets + } + StringBuffer buf = new StringBuffer("{ "); + for (InstructionHandle ih = first; ih != null; ih = next) { + next = ih.next; + length--; + if (ih.hasTargeters()) { // Still got targeters? + target_vec.add(ih); + buf.append(ih.toString(true) + " "); + ih.next = ih.prev = null; + } else { + ih.dispose(); + } + } + buf.append("}"); + if (!target_vec.isEmpty()) { + InstructionHandle[] targeted = new InstructionHandle[target_vec.size()]; + target_vec.toArray(targeted); + throw new TargetLostException(targeted, buf.toString()); + } + } + + + /** + * Remove instruction from this list. The corresponding Instruction + * handles must not be reused! + * + * @param ih instruction (handle) to remove + */ + public void delete( InstructionHandle ih ) throws TargetLostException { + remove(ih.prev, ih.next); + } + + + /** + * Remove instruction from this list. The corresponding Instruction + * handles must not be reused! + * + * @param i instruction to remove + */ + public void delete( Instruction i ) throws TargetLostException { + InstructionHandle ih; + if ((ih = findInstruction1(i)) == null) { + throw new ClassGenException("Instruction " + i + " is not contained in this list."); + } + delete(ih); + } + + + /** + * Remove instructions from instruction `from' to instruction `to' contained + * in this list. The user must ensure that `from' is an instruction before + * `to', or risk havoc. The corresponding Instruction handles must not be reused! + * + * @param from where to start deleting (inclusive) + * @param to where to end deleting (inclusive) + */ + public void delete( InstructionHandle from, InstructionHandle to ) throws TargetLostException { + remove(from.prev, to.next); + } + + + /** + * Remove instructions from instruction `from' to instruction `to' contained + * in this list. The user must ensure that `from' is an instruction before + * `to', or risk havoc. The corresponding Instruction handles must not be reused! + * + * @param from where to start deleting (inclusive) + * @param to where to end deleting (inclusive) + */ + public void delete( Instruction from, Instruction to ) throws TargetLostException { + InstructionHandle from_ih, to_ih; + if ((from_ih = findInstruction1(from)) == null) { + throw new ClassGenException("Instruction " + from + " is not contained in this list."); + } + if ((to_ih = findInstruction2(to)) == null) { + throw new ClassGenException("Instruction " + to + " is not contained in this list."); + } + delete(from_ih, to_ih); + } + + + /** + * Search for given Instruction reference, start at beginning of list. + * + * @param i instruction to search for + * @return instruction found on success, null otherwise + */ + private InstructionHandle findInstruction1( Instruction i ) { + for (InstructionHandle ih = start; ih != null; ih = ih.next) { + if (ih.instruction == i) { + return ih; + } + } + return null; + } + + + /** + * Search for given Instruction reference, start at end of list + * + * @param i instruction to search for + * @return instruction found on success, null otherwise + */ + private InstructionHandle findInstruction2( Instruction i ) { + for (InstructionHandle ih = end; ih != null; ih = ih.prev) { + if (ih.instruction == i) { + return ih; + } + } + return null; + } + + + public boolean contains( InstructionHandle i ) { + if (i == null) { + return false; + } + for (InstructionHandle ih = start; ih != null; ih = ih.next) { + if (ih == i) { + return true; + } + } + return false; + } + + + public boolean contains( Instruction i ) { + return findInstruction1(i) != null; + } + + + public void setPositions() { + setPositions(false); + } + + + /** + * Give all instructions their position number (offset in byte stream), i.e., + * make the list ready to be dumped. + * + * @param check Perform sanity checks, e.g. if all targeted instructions really belong + * to this list + */ + public void setPositions( boolean check ) { + int max_additional_bytes = 0, additional_bytes = 0; + int index = 0, count = 0; + int[] pos = new int[length]; + /* Pass 0: Sanity checks + */ + if (check) { + for (InstructionHandle ih = start; ih != null; ih = ih.next) { + Instruction i = ih.instruction; + if (i instanceof BranchInstruction) { // target instruction within list? + Instruction inst = ((BranchInstruction) i).getTarget().instruction; + if (!contains(inst)) { + throw new ClassGenException("Branch target of " + + Constants.OPCODE_NAMES[i.opcode] + ":" + inst + + " not in instruction list"); + } + if (i instanceof Select) { + InstructionHandle[] targets = ((Select) i).getTargets(); + for (int j = 0; j < targets.length; j++) { + inst = targets[j].instruction; + if (!contains(inst)) { + throw new ClassGenException("Branch target of " + + Constants.OPCODE_NAMES[i.opcode] + ":" + inst + + " not in instruction list"); + } + } + } + if (!(ih instanceof BranchHandle)) { + throw new ClassGenException("Branch instruction " + + Constants.OPCODE_NAMES[i.opcode] + ":" + inst + + " not contained in BranchHandle."); + } + } + } + } + /* Pass 1: Set position numbers and sum up the maximum number of bytes an + * instruction may be shifted. + */ + for (InstructionHandle ih = start; ih != null; ih = ih.next) { + Instruction i = ih.instruction; + ih.setPosition(index); + pos[count++] = index; + /* Get an estimate about how many additional bytes may be added, because + * BranchInstructions may have variable length depending on the target + * offset (short vs. int) or alignment issues (TABLESWITCH and + * LOOKUPSWITCH). + */ + switch (i.getOpcode()) { + case Constants.JSR: + case Constants.GOTO: + max_additional_bytes += 2; + break; + case Constants.TABLESWITCH: + case Constants.LOOKUPSWITCH: + max_additional_bytes += 3; + break; + } + index += i.getLength(); + } + /* Pass 2: Expand the variable-length (Branch)Instructions depending on + * the target offset (short or int) and ensure that branch targets are + * within this list. + */ + for (InstructionHandle ih = start; ih != null; ih = ih.next) { + additional_bytes += ih.updatePosition(additional_bytes, max_additional_bytes); + } + /* Pass 3: Update position numbers (which may have changed due to the + * preceding expansions), like pass 1. + */ + index = count = 0; + for (InstructionHandle ih = start; ih != null; ih = ih.next) { + Instruction i = ih.instruction; + ih.setPosition(index); + pos[count++] = index; + index += i.getLength(); + } + byte_positions = new int[count]; // Trim to proper size + System.arraycopy(pos, 0, byte_positions, 0, count); + } + + + /** + * When everything is finished, use this method to convert the instruction + * list into an array of bytes. + * + * @return the byte code ready to be dumped + */ + public byte[] getByteCode() { + // Update position indices of instructions + setPositions(); + ByteArrayOutputStream b = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(b); + try { + for (InstructionHandle ih = start; ih != null; ih = ih.next) { + Instruction i = ih.instruction; + i.dump(out); // Traverse list + } + } catch (IOException e) { + System.err.println(e); + return null; + } + return b.toByteArray(); + } + + + /** + * @return an array of instructions without target information for branch instructions. + */ + public Instruction[] getInstructions() { + ByteSequence bytes = new ByteSequence(getByteCode()); + List instructions = new ArrayList(); + try { + while (bytes.available() > 0) { + instructions.add(Instruction.readInstruction(bytes)); + } + } catch (IOException e) { + throw new ClassGenException(e.toString()); + } + return (Instruction[]) instructions.toArray(new Instruction[instructions.size()]); + } + + + public String toString() { + return toString(true); + } + + + /** + * @param verbose toggle output format + * @return String containing all instructions in this list. + */ + public String toString( boolean verbose ) { + StringBuffer buf = new StringBuffer(); + for (InstructionHandle ih = start; ih != null; ih = ih.next) { + buf.append(ih.toString(verbose)).append("\n"); + } + return buf.toString(); + } + + + /** + * @return Enumeration that lists all instructions (handles) + */ + public Iterator iterator() { + return new Iterator() { + + private InstructionHandle ih = start; + + + public Object next() { + InstructionHandle i = ih; + ih = ih.next; + return i; + } + + + public void remove() { + throw new UnsupportedOperationException(); + } + + + public boolean hasNext() { + return ih != null; + } + }; + } + + /** + * @return array containing all instructions (handles) + */ + public InstructionHandle[] getInstructionHandles() { + InstructionHandle[] ihs = new InstructionHandle[length]; + InstructionHandle ih = start; + for (int i = 0; i < length; i++) { + ihs[i] = ih; + ih = ih.next; + } + return ihs; + } + + + /** + * Get positions (offsets) of all instructions in the list. This relies on that + * the list has been freshly created from an byte code array, or that setPositions() + * has been called. Otherwise this may be inaccurate. + * + * @return array containing all instruction's offset in byte code + */ + public int[] getInstructionPositions() { + return byte_positions; + } + + + /** + * @return complete, i.e., deep copy of this list + */ + public InstructionList copy() { + Map map = new HashMap(); + InstructionList il = new InstructionList(); + /* Pass 1: Make copies of all instructions, append them to the new list + * and associate old instruction references with the new ones, i.e., + * a 1:1 mapping. + */ + for (InstructionHandle ih = start; ih != null; ih = ih.next) { + Instruction i = ih.instruction; + Instruction c = i.copy(); // Use clone for shallow copy + if (c instanceof BranchInstruction) { + map.put(ih, il.append((BranchInstruction) c)); + } else { + map.put(ih, il.append(c)); + } + } + /* Pass 2: Update branch targets. + */ + InstructionHandle ih = start; + InstructionHandle ch = il.start; + while (ih != null) { + Instruction i = ih.instruction; + Instruction c = ch.instruction; + if (i instanceof BranchInstruction) { + BranchInstruction bi = (BranchInstruction) i; + BranchInstruction bc = (BranchInstruction) c; + InstructionHandle itarget = bi.getTarget(); // old target + // New target is in hash map + bc.setTarget((InstructionHandle) map.get(itarget)); + if (bi instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH + InstructionHandle[] itargets = ((Select) bi).getTargets(); + InstructionHandle[] ctargets = ((Select) bc).getTargets(); + for (int j = 0; j < itargets.length; j++) { // Update all targets + ctargets[j] = (InstructionHandle) map.get(itargets[j]); + } + } + } + ih = ih.next; + ch = ch.next; + } + return il; + } + + + /** Replace all references to the old constant pool with references to the new + * constant pool + */ + public void replaceConstantPool( ConstantPoolGen old_cp, ConstantPoolGen new_cp ) { + for (InstructionHandle ih = start; ih != null; ih = ih.next) { + Instruction i = ih.instruction; + if (i instanceof CPInstruction) { + CPInstruction ci = (CPInstruction) i; + Constant c = old_cp.getConstant(ci.getIndex()); + ci.setIndex(new_cp.addConstant(c, old_cp)); + } + } + } + + + private void clear() { + start = end = null; + length = 0; + } + + + /** + * Delete contents of list. Provides besser memory utilization, + * because the system then may reuse the instruction handles. This + * method is typically called right after + * MethodGen.getMethod(). + */ + public void dispose() { + // Traverse in reverse order, because ih.next is overwritten + for (InstructionHandle ih = end; ih != null; ih = ih.prev) { + /* Causes BranchInstructions to release target and targeters, because it + * calls dispose() on the contained instruction. + */ + ih.dispose(); + } + clear(); + } + + + /** + * @return start of list + */ + public InstructionHandle getStart() { + return start; + } + + + /** + * @return end of list + */ + public InstructionHandle getEnd() { + return end; + } + + + /** + * @return length of list (Number of instructions, not bytes) + */ + public int getLength() { + return length; + } + + + /** + * @return length of list (Number of instructions, not bytes) + */ + public int size() { + return length; + } + + + /** + * Redirect all references from old_target to new_target, i.e., update targets + * of branch instructions. + * + * @param old_target the old target instruction handle + * @param new_target the new target instruction handle + */ + public void redirectBranches( InstructionHandle old_target, InstructionHandle new_target ) { + for (InstructionHandle ih = start; ih != null; ih = ih.next) { + Instruction i = ih.getInstruction(); + if (i instanceof BranchInstruction) { + BranchInstruction b = (BranchInstruction) i; + InstructionHandle target = b.getTarget(); + if (target == old_target) { + b.setTarget(new_target); + } + if (b instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH + InstructionHandle[] targets = ((Select) b).getTargets(); + for (int j = 0; j < targets.length; j++) { + if (targets[j] == old_target) { + ((Select) b).setTarget(j, new_target); + } + } + } + } + } + } + + + /** + * Redirect all references of local variables from old_target to new_target. + * + * @param lg array of local variables + * @param old_target the old target instruction handle + * @param new_target the new target instruction handle + * @see MethodGen + */ + public void redirectLocalVariables( LocalVariableGen[] lg, InstructionHandle old_target, + InstructionHandle new_target ) { + for (int i = 0; i < lg.length; i++) { + InstructionHandle start = lg[i].getStart(); + InstructionHandle end = lg[i].getEnd(); + if (start == old_target) { + lg[i].setStart(new_target); + } + if (end == old_target) { + lg[i].setEnd(new_target); + } + } + } + + + /** + * Redirect all references of exception handlers from old_target to new_target. + * + * @param exceptions array of exception handlers + * @param old_target the old target instruction handle + * @param new_target the new target instruction handle + * @see MethodGen + */ + public void redirectExceptionHandlers( CodeExceptionGen[] exceptions, + InstructionHandle old_target, InstructionHandle new_target ) { + for (int i = 0; i < exceptions.length; i++) { + if (exceptions[i].getStartPC() == old_target) { + exceptions[i].setStartPC(new_target); + } + if (exceptions[i].getEndPC() == old_target) { + exceptions[i].setEndPC(new_target); + } + if (exceptions[i].getHandlerPC() == old_target) { + exceptions[i].setHandlerPC(new_target); + } + } + } + + private List observers; + + + /** Add observer for this object. + */ + public void addObserver( InstructionListObserver o ) { + if (observers == null) { + observers = new ArrayList(); + } + observers.add(o); + } + + + /** Remove observer for this object. + */ + public void removeObserver( InstructionListObserver o ) { + if (observers != null) { + observers.remove(o); + } + } + + + /** Call notify() method on all observers. This method is not called + * automatically whenever the state has changed, but has to be + * called by the user after he has finished editing the object. + */ + public void update() { + if (observers != null) { + for (Iterator e = observers.iterator(); e.hasNext();) { + ((InstructionListObserver) e.next()).notify(this); + } + } + } +} diff --git a/src/java/org/apache/bcel/generic/InstructionListObserver.java b/src/java/org/apache/bcel/generic/InstructionListObserver.java index 2dcd7e0d..ee4be7c0 100644 --- a/src/java/org/apache/bcel/generic/InstructionListObserver.java +++ b/src/java/org/apache/bcel/generic/InstructionListObserver.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Implement this interface if you're interested in changes to an InstructionList object * and register yourself with addObserver(). @@ -25,6 +24,6 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface InstructionListObserver { - public void notify(InstructionList list); -} + public void notify( InstructionList list ); +} diff --git a/src/java/org/apache/bcel/generic/InstructionTargeter.java b/src/java/org/apache/bcel/generic/InstructionTargeter.java index 7efeae42..5e21d8d4 100644 --- a/src/java/org/apache/bcel/generic/InstructionTargeter.java +++ b/src/java/org/apache/bcel/generic/InstructionTargeter.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denote that a class targets InstructionHandles within an InstructionList. Namely * the following implementers: @@ -28,6 +27,9 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface InstructionTargeter { - public boolean containsTarget(InstructionHandle ih); - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih); + + public boolean containsTarget( InstructionHandle ih ); + + + public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ); } diff --git a/src/java/org/apache/bcel/generic/InvokeInstruction.java b/src/java/org/apache/bcel/generic/InvokeInstruction.java index 3d8010be..ee28f8f3 100644 --- a/src/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/java/org/apache/bcel/generic/InvokeInstruction.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.util.StringTokenizer; @@ -27,84 +27,92 @@ import org.apache.bcel.classfile.ConstantPool; * @version $Id$ * @author M. Dahm */ -public abstract class InvokeInstruction extends FieldOrMethod - implements ExceptionThrower, TypedInstruction, StackConsumer, StackProducer { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - InvokeInstruction() {} - - /** - * @param index to constant pool - */ - protected InvokeInstruction(short opcode, int index) { - super(opcode, index); - } - - /** - * @return mnemonic for instruction with symbolic references resolved - */ - public String toString(ConstantPool cp) { - Constant c = cp.getConstant(index); - StringTokenizer tok = new StringTokenizer(cp.constantToString(c)); - - return Constants.OPCODE_NAMES[opcode] + " " + - tok.nextToken().replace('.', '/') + tok.nextToken(); - } - - /** - * Also works for instructions whose stack effect depends on the - * constant pool entry they reference. - * @return Number of words consumed from stack by this instruction - */ - public int consumeStack(ConstantPoolGen cpg) { - String signature = getSignature(cpg); - Type[] args = Type.getArgumentTypes(signature); - int sum; - - if(opcode == Constants.INVOKESTATIC) - sum = 0; - else - sum = 1; // this reference - - int n = args.length; - for (int i = 0; i < n; i++) - sum += args[i].getSize(); - - return sum; - } - - /** - * Also works for instructions whose stack effect depends on the - * constant pool entry they reference. - * @return Number of words produced onto stack by this instruction - */ - public int produceStack(ConstantPoolGen cpg) { - return getReturnType(cpg).getSize(); - } - - /** @return return type of referenced method. - */ - public Type getType(ConstantPoolGen cpg) { - return getReturnType(cpg); - } - - /** @return name of referenced method. - */ - public String getMethodName(ConstantPoolGen cpg) { - return getName(cpg); - } - - /** @return return type of referenced method. - */ - public Type getReturnType(ConstantPoolGen cpg) { - return Type.getReturnType(getSignature(cpg)); - } - - /** @return argument types of referenced method. - */ - public Type[] getArgumentTypes(ConstantPoolGen cpg) { - return Type.getArgumentTypes(getSignature(cpg)); - } +public abstract class InvokeInstruction extends FieldOrMethod implements ExceptionThrower, + TypedInstruction, StackConsumer, StackProducer { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + InvokeInstruction() { + } + + + /** + * @param index to constant pool + */ + protected InvokeInstruction(short opcode, int index) { + super(opcode, index); + } + + + /** + * @return mnemonic for instruction with symbolic references resolved + */ + public String toString( ConstantPool cp ) { + Constant c = cp.getConstant(index); + StringTokenizer tok = new StringTokenizer(cp.constantToString(c)); + return Constants.OPCODE_NAMES[opcode] + " " + tok.nextToken().replace('.', '/') + + tok.nextToken(); + } + + + /** + * Also works for instructions whose stack effect depends on the + * constant pool entry they reference. + * @return Number of words consumed from stack by this instruction + */ + public int consumeStack( ConstantPoolGen cpg ) { + String signature = getSignature(cpg); + Type[] args = Type.getArgumentTypes(signature); + int sum; + if (opcode == Constants.INVOKESTATIC) { + sum = 0; + } else { + sum = 1; // this reference + } + int n = args.length; + for (int i = 0; i < n; i++) { + sum += args[i].getSize(); + } + return sum; + } + + + /** + * Also works for instructions whose stack effect depends on the + * constant pool entry they reference. + * @return Number of words produced onto stack by this instruction + */ + public int produceStack( ConstantPoolGen cpg ) { + return getReturnType(cpg).getSize(); + } + + + /** @return return type of referenced method. + */ + public Type getType( ConstantPoolGen cpg ) { + return getReturnType(cpg); + } + + + /** @return name of referenced method. + */ + public String getMethodName( ConstantPoolGen cpg ) { + return getName(cpg); + } + + + /** @return return type of referenced method. + */ + public Type getReturnType( ConstantPoolGen cpg ) { + return Type.getReturnType(getSignature(cpg)); + } + + + /** @return argument types of referenced method. + */ + public Type[] getArgumentTypes( ConstantPoolGen cpg ) { + return Type.getArgumentTypes(getSignature(cpg)); + } } diff --git a/src/java/org/apache/bcel/generic/JSR.java b/src/java/org/apache/bcel/generic/JSR.java index 76a87414..1255f2f2 100644 --- a/src/java/org/apache/bcel/generic/JSR.java +++ b/src/java/org/apache/bcel/generic/JSR.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -26,58 +26,61 @@ import java.io.IOException; * @author M. Dahm */ public class JSR extends JsrInstruction implements VariableLengthInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - JSR() {} - public JSR(InstructionHandle target) { - super(org.apache.bcel.Constants.JSR, target); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + JSR() { + } + - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - index = getTargetOffset(); - if(opcode == org.apache.bcel.Constants.JSR) - super.dump(out); - else { // JSR_W - index = getTargetOffset(); - out.writeByte(opcode); - out.writeInt(index); + public JSR(InstructionHandle target) { + super(org.apache.bcel.Constants.JSR, target); } - } - protected int updatePosition(int offset, int max_offset) { - int i = getTargetOffset(); // Depending on old position value - position += offset; // Position may be shifted by preceding expansions + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + index = getTargetOffset(); + if (opcode == org.apache.bcel.Constants.JSR) { + super.dump(out); + } else { // JSR_W + index = getTargetOffset(); + out.writeByte(opcode); + out.writeInt(index); + } + } + - if(Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) - opcode = org.apache.bcel.Constants.JSR_W; - length = 5; - return 2; // 5 - 3 + protected int updatePosition( int offset, int max_offset ) { + int i = getTargetOffset(); // Depending on old position value + position += offset; // Position may be shifted by preceding expansions + if (Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) + opcode = org.apache.bcel.Constants.JSR_W; + length = 5; + return 2; // 5 - 3 + } + return 0; } - return 0; - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitVariableLengthInstruction(this); - v.visitBranchInstruction(this); - v.visitJsrInstruction(this); - v.visitJSR(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitVariableLengthInstruction(this); + v.visitBranchInstruction(this); + v.visitJsrInstruction(this); + v.visitJSR(this); + } } diff --git a/src/java/org/apache/bcel/generic/JSR_W.java b/src/java/org/apache/bcel/generic/JSR_W.java index 4360a21e..dee8ba81 100644 --- a/src/java/org/apache/bcel/generic/JSR_W.java +++ b/src/java/org/apache/bcel/generic/JSR_W.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -27,48 +27,53 @@ import org.apache.bcel.util.ByteSequence; * @author M. Dahm */ public class JSR_W extends JsrInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - JSR_W() {} - public JSR_W(InstructionHandle target) { - super(org.apache.bcel.Constants.JSR_W, target); - length = 5; - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + JSR_W() { + } + + + public JSR_W(InstructionHandle target) { + super(org.apache.bcel.Constants.JSR_W, target); + length = 5; + } + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + index = getTargetOffset(); + out.writeByte(opcode); + out.writeInt(index); + } + - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - index = getTargetOffset(); - out.writeByte(opcode); - out.writeInt(index); - } + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + index = bytes.readInt(); + length = 5; + } - /** - * Read needed data (e.g. index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException - { - index = bytes.readInt(); - length = 5; - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitBranchInstruction(this); - v.visitJsrInstruction(this); - v.visitJSR_W(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitBranchInstruction(this); + v.visitJsrInstruction(this); + v.visitJSR_W(this); + } } diff --git a/src/java/org/apache/bcel/generic/JsrInstruction.java b/src/java/org/apache/bcel/generic/JsrInstruction.java index de18fcd2..16b12491 100644 --- a/src/java/org/apache/bcel/generic/JsrInstruction.java +++ b/src/java/org/apache/bcel/generic/JsrInstruction.java @@ -13,66 +13,67 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Super class for JSR - Jump to subroutine * * @version $Id$ * @author M. Dahm */ -public abstract class JsrInstruction extends BranchInstruction - implements UnconditionalBranch, TypedInstruction, StackProducer -{ - JsrInstruction(short opcode, InstructionHandle target) { - super(opcode, target); - } +public abstract class JsrInstruction extends BranchInstruction implements UnconditionalBranch, + TypedInstruction, StackProducer { + + JsrInstruction(short opcode, InstructionHandle target) { + super(opcode, target); + } + - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - JsrInstruction(){} + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + JsrInstruction() { + } + + + /** @return return address type + */ + public Type getType( ConstantPoolGen cp ) { + return new ReturnaddressType(physicalSuccessor()); + } - /** @return return address type - */ - public Type getType(ConstantPoolGen cp) { - return new ReturnaddressType(physicalSuccessor()); - } - /** - * Returns an InstructionHandle to the physical successor - * of this JsrInstruction. For this method to work, - * this JsrInstruction object must not be shared between - * multiple InstructionHandle objects! - * Formally, there must not be InstructionHandle objects - * i, j where i != j and i.getInstruction() == this == - * j.getInstruction(). - * @return an InstructionHandle to the "next" instruction that - * will be executed when RETurned from a subroutine. - */ - public InstructionHandle physicalSuccessor(){ - InstructionHandle ih = this.target; - - // Rewind! - while(ih.getPrev() != null) - ih = ih.getPrev(); - - // Find the handle for "this" JsrInstruction object. - while(ih.getInstruction() != this) - ih = ih.getNext(); - - InstructionHandle toThis = ih; - - while(ih != null){ - ih = ih.getNext(); - if ((ih != null) && (ih.getInstruction() == this)) - throw new RuntimeException("physicalSuccessor() called on a shared JsrInstruction."); + /** + * Returns an InstructionHandle to the physical successor + * of this JsrInstruction. For this method to work, + * this JsrInstruction object must not be shared between + * multiple InstructionHandle objects! + * Formally, there must not be InstructionHandle objects + * i, j where i != j and i.getInstruction() == this == + * j.getInstruction(). + * @return an InstructionHandle to the "next" instruction that + * will be executed when RETurned from a subroutine. + */ + public InstructionHandle physicalSuccessor() { + InstructionHandle ih = this.target; + // Rewind! + while (ih.getPrev() != null) { + ih = ih.getPrev(); + } + // Find the handle for "this" JsrInstruction object. + while (ih.getInstruction() != this) { + ih = ih.getNext(); + } + InstructionHandle toThis = ih; + while (ih != null) { + ih = ih.getNext(); + if ((ih != null) && (ih.getInstruction() == this)) { + throw new RuntimeException("physicalSuccessor() called on a shared JsrInstruction."); + } + } + // Return the physical successor + return toThis.getNext(); } - - // Return the physical successor - return toThis.getNext(); - } } diff --git a/src/java/org/apache/bcel/generic/L2D.java b/src/java/org/apache/bcel/generic/L2D.java index 08884299..73f3b49a 100644 --- a/src/java/org/apache/bcel/generic/L2D.java +++ b/src/java/org/apache/bcel/generic/L2D.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * L2D - Convert long to double *
            Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class L2D extends ConversionInstruction { - public L2D() { - super(org.apache.bcel.Constants.L2D); - } + + public L2D() { + super(org.apache.bcel.Constants.L2D); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitL2D(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitL2D(this); + } } diff --git a/src/java/org/apache/bcel/generic/L2F.java b/src/java/org/apache/bcel/generic/L2F.java index 6a0f2b38..36218976 100644 --- a/src/java/org/apache/bcel/generic/L2F.java +++ b/src/java/org/apache/bcel/generic/L2F.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * L2F - Convert long to float *
            Stack: ..., value.word1, value.word2 -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class L2F extends ConversionInstruction { - public L2F() { - super(org.apache.bcel.Constants.L2F); - } + + public L2F() { + super(org.apache.bcel.Constants.L2F); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitL2F(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitL2F(this); + } } diff --git a/src/java/org/apache/bcel/generic/L2I.java b/src/java/org/apache/bcel/generic/L2I.java index 2b0dacef..34727173 100644 --- a/src/java/org/apache/bcel/generic/L2I.java +++ b/src/java/org/apache/bcel/generic/L2I.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * L2I - Convert long to int *
            Stack: ..., value.word1, value.word2 -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class L2I extends ConversionInstruction { - public L2I() { - super(org.apache.bcel.Constants.L2I); - } + + public L2I() { + super(org.apache.bcel.Constants.L2I); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitConversionInstruction(this); - v.visitL2I(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitConversionInstruction(this); + v.visitL2I(this); + } } diff --git a/src/java/org/apache/bcel/generic/LADD.java b/src/java/org/apache/bcel/generic/LADD.java index fba59dd8..fa62ed36 100644 --- a/src/java/org/apache/bcel/generic/LADD.java +++ b/src/java/org/apache/bcel/generic/LADD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LADD - Add longs *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -26,24 +25,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LADD extends ArithmeticInstruction { - public LADD() { - super(org.apache.bcel.Constants.LADD); - } + + public LADD() { + super(org.apache.bcel.Constants.LADD); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLADD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLADD(this); + } } diff --git a/src/java/org/apache/bcel/generic/LALOAD.java b/src/java/org/apache/bcel/generic/LALOAD.java index 2e64bab5..789f60a4 100644 --- a/src/java/org/apache/bcel/generic/LALOAD.java +++ b/src/java/org/apache/bcel/generic/LALOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LALOAD - Load long from array *
            Stack: ..., arrayref, index -> ..., value1, value2
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LALOAD extends ArrayInstruction implements StackProducer { - /** Load long from array - */ - public LALOAD() { - super(org.apache.bcel.Constants.LALOAD); - } + + /** Load long from array + */ + public LALOAD() { + super(org.apache.bcel.Constants.LALOAD); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitLALOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitLALOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/LAND.java b/src/java/org/apache/bcel/generic/LAND.java index 56355a1a..855c19f8 100644 --- a/src/java/org/apache/bcel/generic/LAND.java +++ b/src/java/org/apache/bcel/generic/LAND.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LAND - Bitwise AND longs *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -26,24 +25,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LAND extends ArithmeticInstruction { - public LAND() { - super(org.apache.bcel.Constants.LAND); - } + + public LAND() { + super(org.apache.bcel.Constants.LAND); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLAND(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLAND(this); + } } diff --git a/src/java/org/apache/bcel/generic/LASTORE.java b/src/java/org/apache/bcel/generic/LASTORE.java index 9d4402d4..e7214254 100644 --- a/src/java/org/apache/bcel/generic/LASTORE.java +++ b/src/java/org/apache/bcel/generic/LASTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LASTORE - Store into long array *
            Stack: ..., arrayref, index, value.word1, value.word2 -> ...
            @@ -25,26 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LASTORE extends ArrayInstruction implements StackConsumer { - /** Store long into array - */ - public LASTORE() { - super(org.apache.bcel.Constants.LASTORE); - } + + /** Store long into array + */ + public LASTORE() { + super(org.apache.bcel.Constants.LASTORE); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitLASTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitLASTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/LCMP.java b/src/java/org/apache/bcel/generic/LCMP.java index 9bdefb71..c993abf5 100644 --- a/src/java/org/apache/bcel/generic/LCMP.java +++ b/src/java/org/apache/bcel/generic/LCMP.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LCMP - Compare longs: *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -25,31 +24,32 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class LCMP extends Instruction - implements TypedInstruction, StackProducer, StackConsumer -{ - public LCMP() { - super(org.apache.bcel.Constants.LCMP, (short)1); - } +public class LCMP extends Instruction implements TypedInstruction, StackProducer, StackConsumer { + + public LCMP() { + super(org.apache.bcel.Constants.LCMP, (short) 1); + } + + + /** @return Type.LONG + */ + public Type getType( ConstantPoolGen cp ) { + return Type.LONG; + } - /** @return Type.LONG - */ - public Type getType(ConstantPoolGen cp) { - return Type.LONG; - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitLCMP(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitLCMP(this); + } } diff --git a/src/java/org/apache/bcel/generic/LCONST.java b/src/java/org/apache/bcel/generic/LCONST.java index ac190e21..97c1f3bc 100644 --- a/src/java/org/apache/bcel/generic/LCONST.java +++ b/src/java/org/apache/bcel/generic/LCONST.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LCONST - Push 0 or 1, other values cause an exception * @@ -25,50 +24,57 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class LCONST extends Instruction - implements ConstantPushInstruction, TypedInstruction { - private long value; +public class LCONST extends Instruction implements ConstantPushInstruction, TypedInstruction { + + private long value; + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LCONST() { + } + - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LCONST() {} + public LCONST(long l) { + super(org.apache.bcel.Constants.LCONST_0, (short) 1); + if (l == 0) { + opcode = org.apache.bcel.Constants.LCONST_0; + } else if (l == 1) { + opcode = org.apache.bcel.Constants.LCONST_1; + } else { + throw new ClassGenException("LCONST can be used only for 0 and 1: " + l); + } + value = l; + } - public LCONST(long l) { - super(org.apache.bcel.Constants.LCONST_0, (short)1); - if(l == 0) - opcode = org.apache.bcel.Constants.LCONST_0; - else if(l == 1) - opcode = org.apache.bcel.Constants.LCONST_1; - else - throw new ClassGenException("LCONST can be used only for 0 and 1: " + l); + public Number getValue() { + return new Long(value); + } - value = l; - } - public Number getValue() { return new Long(value); } + /** @return Type.LONG + */ + public Type getType( ConstantPoolGen cp ) { + return Type.LONG; + } - /** @return Type.LONG - */ - public Type getType(ConstantPoolGen cp) { - return Type.LONG; - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitPushInstruction(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitConstantPushInstruction(this); - v.visitLCONST(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitPushInstruction(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitConstantPushInstruction(this); + v.visitLCONST(this); + } } diff --git a/src/java/org/apache/bcel/generic/LDC.java b/src/java/org/apache/bcel/generic/LDC.java index be645ad6..421414f9 100644 --- a/src/java/org/apache/bcel/generic/LDC.java +++ b/src/java/org/apache/bcel/generic/LDC.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -28,113 +28,121 @@ import org.apache.bcel.util.ByteSequence; * @version $Id$ * @author M. Dahm */ -public class LDC extends CPInstruction - implements PushInstruction, ExceptionThrower, TypedInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LDC() {} - - public LDC(int index) { - super(org.apache.bcel.Constants.LDC_W, index); - setSize(); - } - - // Adjust to proper size - protected final void setSize() { - if(index <= org.apache.bcel.Constants.MAX_BYTE) { // Fits in one byte? - opcode = org.apache.bcel.Constants.LDC; - length = 2; - } else { - opcode = org.apache.bcel.Constants.LDC_W; - length = 3; +public class LDC extends CPInstruction implements PushInstruction, ExceptionThrower, + TypedInstruction { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LDC() { + } + + + public LDC(int index) { + super(org.apache.bcel.Constants.LDC_W, index); + setSize(); + } + + + // Adjust to proper size + protected final void setSize() { + if (index <= org.apache.bcel.Constants.MAX_BYTE) { // Fits in one byte? + opcode = org.apache.bcel.Constants.LDC; + length = 2; + } else { + opcode = org.apache.bcel.Constants.LDC_W; + length = 3; + } } - } - - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - - if(length == 2) - out.writeByte(index); - else // Applies for LDC_W - out.writeShort(index); - } - - /** - * Set the index to constant pool and adjust size. - */ - public final void setIndex(int index) { - super.setIndex(index); - setSize(); - } - - /** - * Read needed data (e.g. index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException - { - length = 2; - index = bytes.readUnsignedByte(); - } - - public Object getValue(ConstantPoolGen cpg) { - org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(index); - - switch(c.getTag()) { - case org.apache.bcel.Constants.CONSTANT_String: - int i = ((org.apache.bcel.classfile.ConstantString)c).getStringIndex(); - c = cpg.getConstantPool().getConstant(i); - return ((org.apache.bcel.classfile.ConstantUtf8)c).getBytes(); - - case org.apache.bcel.Constants.CONSTANT_Float: - return new Float(((org.apache.bcel.classfile.ConstantFloat)c).getBytes()); - - case org.apache.bcel.Constants.CONSTANT_Integer: - return new Integer(((org.apache.bcel.classfile.ConstantInteger)c).getBytes()); - - case org.apache.bcel.Constants.CONSTANT_Class: - return (org.apache.bcel.classfile.ConstantClass) c; - - default: // Never reached - throw new RuntimeException("Unknown or invalid constant type at " + index); - } - } - - public Type getType(ConstantPoolGen cpg) { - switch(cpg.getConstantPool().getConstant(index).getTag()) { - case org.apache.bcel.Constants.CONSTANT_String: return Type.STRING; - case org.apache.bcel.Constants.CONSTANT_Float: return Type.FLOAT; - case org.apache.bcel.Constants.CONSTANT_Integer: return Type.INT; - case org.apache.bcel.Constants.CONSTANT_Class: return Type.CLASS; - default: // Never reached - throw new RuntimeException("Unknown or invalid constant type at " + index); + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + out.writeByte(opcode); + if (length == 2) { + out.writeByte(index); + } else { + out.writeShort(index); + } + } + + + /** + * Set the index to constant pool and adjust size. + */ + public final void setIndex( int index ) { + super.setIndex(index); + setSize(); + } + + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + length = 2; + index = bytes.readUnsignedByte(); + } + + + public Object getValue( ConstantPoolGen cpg ) { + org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(index); + switch (c.getTag()) { + case org.apache.bcel.Constants.CONSTANT_String: + int i = ((org.apache.bcel.classfile.ConstantString) c).getStringIndex(); + c = cpg.getConstantPool().getConstant(i); + return ((org.apache.bcel.classfile.ConstantUtf8) c).getBytes(); + case org.apache.bcel.Constants.CONSTANT_Float: + return new Float(((org.apache.bcel.classfile.ConstantFloat) c).getBytes()); + case org.apache.bcel.Constants.CONSTANT_Integer: + return new Integer(((org.apache.bcel.classfile.ConstantInteger) c).getBytes()); + case org.apache.bcel.Constants.CONSTANT_Class: + return c; + default: // Never reached + throw new RuntimeException("Unknown or invalid constant type at " + index); + } + } + + + public Type getType( ConstantPoolGen cpg ) { + switch (cpg.getConstantPool().getConstant(index).getTag()) { + case org.apache.bcel.Constants.CONSTANT_String: + return Type.STRING; + case org.apache.bcel.Constants.CONSTANT_Float: + return Type.FLOAT; + case org.apache.bcel.Constants.CONSTANT_Integer: + return Type.INT; + case org.apache.bcel.Constants.CONSTANT_Class: + return Type.CLASS; + default: // Never reached + throw new RuntimeException("Unknown or invalid constant type at " + index); + } + } + + + public Class[] getExceptions() { + return org.apache.bcel.ExceptionConstants.EXCS_STRING_RESOLUTION; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitLDC(this); } - } - - public Class[] getExceptions() { - return org.apache.bcel.ExceptionConstants.EXCS_STRING_RESOLUTION; - } - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitLDC(this); - } } diff --git a/src/java/org/apache/bcel/generic/LDC2_W.java b/src/java/org/apache/bcel/generic/LDC2_W.java index fea90599..bec4d7a1 100644 --- a/src/java/org/apache/bcel/generic/LDC2_W.java +++ b/src/java/org/apache/bcel/generic/LDC2_W.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LDC2_W - Push long or double from constant pool * @@ -25,55 +24,59 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class LDC2_W extends CPInstruction - implements PushInstruction, TypedInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LDC2_W() {} +public class LDC2_W extends CPInstruction implements PushInstruction, TypedInstruction { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LDC2_W() { + } - public LDC2_W(int index) { - super(org.apache.bcel.Constants.LDC2_W, index); - } - public Type getType(ConstantPoolGen cpg) { - switch(cpg.getConstantPool().getConstant(index).getTag()) { - case org.apache.bcel.Constants.CONSTANT_Long: return Type.LONG; - case org.apache.bcel.Constants.CONSTANT_Double: return Type.DOUBLE; - default: // Never reached - throw new RuntimeException("Unknown constant type " + opcode); + public LDC2_W(int index) { + super(org.apache.bcel.Constants.LDC2_W, index); } - } - public Number getValue(ConstantPoolGen cpg) { - org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(index); - switch(c.getTag()) { - case org.apache.bcel.Constants.CONSTANT_Long: - return new Long(((org.apache.bcel.classfile.ConstantLong)c).getBytes()); + public Type getType( ConstantPoolGen cpg ) { + switch (cpg.getConstantPool().getConstant(index).getTag()) { + case org.apache.bcel.Constants.CONSTANT_Long: + return Type.LONG; + case org.apache.bcel.Constants.CONSTANT_Double: + return Type.DOUBLE; + default: // Never reached + throw new RuntimeException("Unknown constant type " + opcode); + } + } + - case org.apache.bcel.Constants.CONSTANT_Double: - return new Double(((org.apache.bcel.classfile.ConstantDouble)c).getBytes()); + public Number getValue( ConstantPoolGen cpg ) { + org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(index); + switch (c.getTag()) { + case org.apache.bcel.Constants.CONSTANT_Long: + return new Long(((org.apache.bcel.classfile.ConstantLong) c).getBytes()); + case org.apache.bcel.Constants.CONSTANT_Double: + return new Double(((org.apache.bcel.classfile.ConstantDouble) c).getBytes()); + default: // Never reached + throw new RuntimeException("Unknown or invalid constant type at " + index); + } + } - default: // Never reached - throw new RuntimeException("Unknown or invalid constant type at " + index); - } - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitLDC2_W(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitLDC2_W(this); + } } diff --git a/src/java/org/apache/bcel/generic/LDC_W.java b/src/java/org/apache/bcel/generic/LDC_W.java index bcea4089..af45adeb 100644 --- a/src/java/org/apache/bcel/generic/LDC_W.java +++ b/src/java/org/apache/bcel/generic/LDC_W.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.IOException; @@ -28,25 +28,27 @@ import org.apache.bcel.util.ByteSequence; * @author M. Dahm */ public class LDC_W extends LDC { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LDC_W() {} - public LDC_W(int index) { - super(index); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LDC_W() { + } + + + public LDC_W(int index) { + super(index); + } + - /** - * Read needed data (i.e., index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException - { - setIndex(bytes.readUnsignedShort()); - // Override just in case it has been changed - opcode = org.apache.bcel.Constants.LDC_W; - length = 3; - } + /** + * Read needed data (i.e., index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + setIndex(bytes.readUnsignedShort()); + // Override just in case it has been changed + opcode = org.apache.bcel.Constants.LDC_W; + length = 3; + } } diff --git a/src/java/org/apache/bcel/generic/LDIV.java b/src/java/org/apache/bcel/generic/LDIV.java index d2c12f68..75ba4748 100644 --- a/src/java/org/apache/bcel/generic/LDIV.java +++ b/src/java/org/apache/bcel/generic/LDIV.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LDIV - Divide longs *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -25,30 +24,34 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class LDIV extends ArithmeticInstruction implements ExceptionThrower { - public LDIV() { - super(org.apache.bcel.Constants.LDIV); - } +public class LDIV extends ArithmeticInstruction implements ExceptionThrower { + + public LDIV() { + super(org.apache.bcel.Constants.LDIV); + } + - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION }; - } + public Class[] getExceptions() { + return new Class[] { + org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION + }; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLDIV(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLDIV(this); + } } diff --git a/src/java/org/apache/bcel/generic/LLOAD.java b/src/java/org/apache/bcel/generic/LLOAD.java index c8cab5f9..722c7c8e 100644 --- a/src/java/org/apache/bcel/generic/LLOAD.java +++ b/src/java/org/apache/bcel/generic/LLOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LLOAD - Load long from local variable *
            Stack ... -> ..., result.word1, result.word2
            @@ -25,28 +24,31 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LLOAD extends LoadInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LLOAD() { - super(org.apache.bcel.Constants.LLOAD, org.apache.bcel.Constants.LLOAD_0); - } - public LLOAD(int n) { - super(org.apache.bcel.Constants.LLOAD, org.apache.bcel.Constants.LLOAD_0, n); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LLOAD() { + super(org.apache.bcel.Constants.LLOAD, org.apache.bcel.Constants.LLOAD_0); + } + + + public LLOAD(int n) { + super(org.apache.bcel.Constants.LLOAD, org.apache.bcel.Constants.LLOAD_0, n); + } + - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - super.accept(v); - v.visitLLOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + super.accept(v); + v.visitLLOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/LMUL.java b/src/java/org/apache/bcel/generic/LMUL.java index 8360d13f..54f069c1 100644 --- a/src/java/org/apache/bcel/generic/LMUL.java +++ b/src/java/org/apache/bcel/generic/LMUL.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LMUL - Multiply longs *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -26,24 +25,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LMUL extends ArithmeticInstruction { - public LMUL() { - super(org.apache.bcel.Constants.LMUL); - } + + public LMUL() { + super(org.apache.bcel.Constants.LMUL); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLMUL(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLMUL(this); + } } diff --git a/src/java/org/apache/bcel/generic/LNEG.java b/src/java/org/apache/bcel/generic/LNEG.java index 91869baa..721ef278 100644 --- a/src/java/org/apache/bcel/generic/LNEG.java +++ b/src/java/org/apache/bcel/generic/LNEG.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LNEG - Negate long *
            Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LNEG extends ArithmeticInstruction { - public LNEG() { - super(org.apache.bcel.Constants.LNEG); - } + + public LNEG() { + super(org.apache.bcel.Constants.LNEG); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLNEG(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLNEG(this); + } } diff --git a/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java index f527fec2..f2104981 100644 --- a/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java +++ b/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -28,70 +28,68 @@ import org.apache.bcel.util.ByteSequence; * @see SWITCH */ public class LOOKUPSWITCH extends Select { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LOOKUPSWITCH() {} - public LOOKUPSWITCH(int[] match, InstructionHandle[] targets, - InstructionHandle defaultTarget) { - super(org.apache.bcel.Constants.LOOKUPSWITCH, match, targets, defaultTarget); - - length = (short)(9 + match_length * 8); /* alignment remainder assumed - * 0 here, until dump time. */ - fixed_length = length; - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LOOKUPSWITCH() { + } - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - super.dump(out); - out.writeInt(match_length); // npairs - for(int i=0; i < match_length; i++) { - out.writeInt(match[i]); // match-offset pairs - out.writeInt(indices[i] = getTargetOffset(targets[i])); + public LOOKUPSWITCH(int[] match, InstructionHandle[] targets, InstructionHandle defaultTarget) { + super(org.apache.bcel.Constants.LOOKUPSWITCH, match, targets, defaultTarget); + length = (short) (9 + match_length * 8); /* alignment remainder assumed + * 0 here, until dump time. */ + fixed_length = length; } - } - /** - * Read needed data (e.g. index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException - { - super.initFromFile(bytes, wide); // reads padding - match_length = bytes.readInt(); - fixed_length = (short)(9 + match_length * 8); - length = (short)(fixed_length + padding); - - match = new int[match_length]; - indices = new int[match_length]; - targets = new InstructionHandle[match_length]; + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + super.dump(out); + out.writeInt(match_length); // npairs + for (int i = 0; i < match_length; i++) { + out.writeInt(match[i]); // match-offset pairs + out.writeInt(indices[i] = getTargetOffset(targets[i])); + } + } - for(int i=0; i < match_length; i++) { - match[i] = bytes.readInt(); - indices[i] = bytes.readInt(); + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + super.initFromFile(bytes, wide); // reads padding + match_length = bytes.readInt(); + fixed_length = (short) (9 + match_length * 8); + length = (short) (fixed_length + padding); + match = new int[match_length]; + indices = new int[match_length]; + targets = new InstructionHandle[match_length]; + for (int i = 0; i < match_length; i++) { + match[i] = bytes.readInt(); + indices[i] = bytes.readInt(); + } } - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitVariableLengthInstruction(this); - v.visitStackProducer(this); - v.visitBranchInstruction(this); - v.visitSelect(this); - v.visitLOOKUPSWITCH(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitVariableLengthInstruction(this); + v.visitStackProducer(this); + v.visitBranchInstruction(this); + v.visitSelect(this); + v.visitLOOKUPSWITCH(this); + } } diff --git a/src/java/org/apache/bcel/generic/LOR.java b/src/java/org/apache/bcel/generic/LOR.java index c39eaeaf..4fcf881c 100644 --- a/src/java/org/apache/bcel/generic/LOR.java +++ b/src/java/org/apache/bcel/generic/LOR.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LOR - Bitwise OR long *
            Stack: ..., value1, value2 -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LOR extends ArithmeticInstruction { - public LOR() { - super(org.apache.bcel.Constants.LOR); - } + + public LOR() { + super(org.apache.bcel.Constants.LOR); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLOR(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLOR(this); + } } diff --git a/src/java/org/apache/bcel/generic/LREM.java b/src/java/org/apache/bcel/generic/LREM.java index 2d72f568..7f430252 100644 --- a/src/java/org/apache/bcel/generic/LREM.java +++ b/src/java/org/apache/bcel/generic/LREM.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LREM - Remainder of long *
            Stack: ..., value1, value2 -> result
            @@ -25,27 +24,33 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LREM extends ArithmeticInstruction implements ExceptionThrower { - public LREM() { - super(org.apache.bcel.Constants.LREM); - } - public Class[] getExceptions() { return new Class[] { org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION }; } + public LREM() { + super(org.apache.bcel.Constants.LREM); + } + + + public Class[] getExceptions() { + return new Class[] { + org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION + }; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLREM(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLREM(this); + } } diff --git a/src/java/org/apache/bcel/generic/LRETURN.java b/src/java/org/apache/bcel/generic/LRETURN.java index fac7c9f4..ed5e36c3 100644 --- a/src/java/org/apache/bcel/generic/LRETURN.java +++ b/src/java/org/apache/bcel/generic/LRETURN.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LRETURN - Return long from method *
            Stack: ..., value.word1, value.word2 -> <empty>
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LRETURN extends ReturnInstruction { - public LRETURN() { - super(org.apache.bcel.Constants.LRETURN); - } + + public LRETURN() { + super(org.apache.bcel.Constants.LRETURN); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitReturnInstruction(this); - v.visitLRETURN(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitReturnInstruction(this); + v.visitLRETURN(this); + } } diff --git a/src/java/org/apache/bcel/generic/LSHL.java b/src/java/org/apache/bcel/generic/LSHL.java index cf8dc449..3a3d25e3 100644 --- a/src/java/org/apache/bcel/generic/LSHL.java +++ b/src/java/org/apache/bcel/generic/LSHL.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LSHL - Arithmetic shift left long *
            Stack: ..., value1.word1, value1.word2, value2 -> ..., result.word1, result.word2
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LSHL extends ArithmeticInstruction { - public LSHL() { - super(org.apache.bcel.Constants.LSHL); - } + + public LSHL() { + super(org.apache.bcel.Constants.LSHL); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLSHL(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLSHL(this); + } } diff --git a/src/java/org/apache/bcel/generic/LSHR.java b/src/java/org/apache/bcel/generic/LSHR.java index e10c44a7..eda943bd 100644 --- a/src/java/org/apache/bcel/generic/LSHR.java +++ b/src/java/org/apache/bcel/generic/LSHR.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LSHR - Arithmetic shift right long *
            Stack: ..., value1.word1, value1.word2, value2 -> ..., result.word1, result.word2
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LSHR extends ArithmeticInstruction { - public LSHR() { - super(org.apache.bcel.Constants.LSHR); - } + + public LSHR() { + super(org.apache.bcel.Constants.LSHR); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLSHR(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLSHR(this); + } } diff --git a/src/java/org/apache/bcel/generic/LSTORE.java b/src/java/org/apache/bcel/generic/LSTORE.java index f7c6fec8..f9a5e795 100644 --- a/src/java/org/apache/bcel/generic/LSTORE.java +++ b/src/java/org/apache/bcel/generic/LSTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LSTORE - Store long into local variable *
            Stack: ..., value.word1, value.word2 -> ... 
            @@ -25,28 +24,31 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LSTORE extends StoreInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - LSTORE() { - super(org.apache.bcel.Constants.LSTORE, org.apache.bcel.Constants.LSTORE_0); - } - public LSTORE(int n) { - super(org.apache.bcel.Constants.LSTORE, org.apache.bcel.Constants.LSTORE_0, n); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + LSTORE() { + super(org.apache.bcel.Constants.LSTORE, org.apache.bcel.Constants.LSTORE_0); + } + + + public LSTORE(int n) { + super(org.apache.bcel.Constants.LSTORE, org.apache.bcel.Constants.LSTORE_0, n); + } + - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - super.accept(v); - v.visitLSTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + super.accept(v); + v.visitLSTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/LSUB.java b/src/java/org/apache/bcel/generic/LSUB.java index a7a54dc0..99345ab5 100644 --- a/src/java/org/apache/bcel/generic/LSUB.java +++ b/src/java/org/apache/bcel/generic/LSUB.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LSUB - Substract longs *
            Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
            @@ -26,24 +25,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LSUB extends ArithmeticInstruction { - public LSUB() { - super(org.apache.bcel.Constants.LSUB); - } + + public LSUB() { + super(org.apache.bcel.Constants.LSUB); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLSUB(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLSUB(this); + } } diff --git a/src/java/org/apache/bcel/generic/LUSHR.java b/src/java/org/apache/bcel/generic/LUSHR.java index d4b3cf36..10449fa6 100644 --- a/src/java/org/apache/bcel/generic/LUSHR.java +++ b/src/java/org/apache/bcel/generic/LUSHR.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LUSHR - Logical shift right long *
            Stack: ..., value1, value2 -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LUSHR extends ArithmeticInstruction { - public LUSHR() { - super(org.apache.bcel.Constants.LUSHR); - } + + public LUSHR() { + super(org.apache.bcel.Constants.LUSHR); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLUSHR(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLUSHR(this); + } } diff --git a/src/java/org/apache/bcel/generic/LXOR.java b/src/java/org/apache/bcel/generic/LXOR.java index ddcc517c..3961cea1 100644 --- a/src/java/org/apache/bcel/generic/LXOR.java +++ b/src/java/org/apache/bcel/generic/LXOR.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * LXOR - Bitwise XOR long *
            Stack: ..., value1, value2 -> ..., result
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class LXOR extends ArithmeticInstruction { - public LXOR() { - super(org.apache.bcel.Constants.LXOR); - } + + public LXOR() { + super(org.apache.bcel.Constants.LXOR); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitTypedInstruction(this); - v.visitStackProducer(this); - v.visitStackConsumer(this); - v.visitArithmeticInstruction(this); - v.visitLXOR(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitTypedInstruction(this); + v.visitStackProducer(this); + v.visitStackConsumer(this); + v.visitArithmeticInstruction(this); + v.visitLXOR(this); + } } diff --git a/src/java/org/apache/bcel/generic/LineNumberGen.java b/src/java/org/apache/bcel/generic/LineNumberGen.java index eb4293c0..7d1fb32f 100644 --- a/src/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/java/org/apache/bcel/generic/LineNumberGen.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import org.apache.bcel.classfile.LineNumber; /** @@ -28,66 +27,82 @@ import org.apache.bcel.classfile.LineNumber; * @see LineNumber * @see MethodGen */ -public class LineNumberGen - implements InstructionTargeter, Cloneable, java.io.Serializable -{ - private InstructionHandle ih; - private int src_line; - - /** - * Create a line number. - * - * @param ih instruction handle to reference - */ - public LineNumberGen(InstructionHandle ih, int src_line) { - setInstruction(ih); - setSourceLine(src_line); - } - - /** - * @return true, if ih is target of this line number - */ - public boolean containsTarget(InstructionHandle ih) { - return this.ih == ih; - } - - /** - * @param old_ih old target - * @param new_ih new target - */ - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { - if(old_ih != ih) - throw new ClassGenException("Not targeting " + old_ih + ", but " + ih + "}"); - else - setInstruction(new_ih); - } - - /** - * Get LineNumber attribute . - * - * This relies on that the instruction list has already been dumped to byte code or - * or that the `setPositions' methods has been called for the instruction list. - */ - public LineNumber getLineNumber() { - return new LineNumber(ih.getPosition(), src_line); - } - - public void setInstruction(InstructionHandle ih) { - BranchInstruction.notifyTarget(this.ih, ih, this); - - this.ih = ih; - } - - public Object clone() { - try { - return super.clone(); - } catch(CloneNotSupportedException e) { - System.err.println(e); - return null; +public class LineNumberGen implements InstructionTargeter, Cloneable, java.io.Serializable { + + private InstructionHandle ih; + private int src_line; + + + /** + * Create a line number. + * + * @param ih instruction handle to reference + */ + public LineNumberGen(InstructionHandle ih, int src_line) { + setInstruction(ih); + setSourceLine(src_line); + } + + + /** + * @return true, if ih is target of this line number + */ + public boolean containsTarget( InstructionHandle ih ) { + return this.ih == ih; + } + + + /** + * @param old_ih old target + * @param new_ih new target + */ + public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { + if (old_ih != ih) { + throw new ClassGenException("Not targeting " + old_ih + ", but " + ih + "}"); + } else { + setInstruction(new_ih); + } + } + + + /** + * Get LineNumber attribute . + * + * This relies on that the instruction list has already been dumped to byte code or + * or that the `setPositions' methods has been called for the instruction list. + */ + public LineNumber getLineNumber() { + return new LineNumber(ih.getPosition(), src_line); } - } - public InstructionHandle getInstruction() { return ih; } - public void setSourceLine(int src_line) { this.src_line = src_line; } - public int getSourceLine() { return src_line; } + + public void setInstruction( InstructionHandle ih ) { + BranchInstruction.notifyTarget(this.ih, ih, this); + this.ih = ih; + } + + + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException e) { + System.err.println(e); + return null; + } + } + + + public InstructionHandle getInstruction() { + return ih; + } + + + public void setSourceLine( int src_line ) { + this.src_line = src_line; + } + + + public int getSourceLine() { + return src_line; + } } diff --git a/src/java/org/apache/bcel/generic/LoadClass.java b/src/java/org/apache/bcel/generic/LoadClass.java index 1ee5235c..e115c269 100644 --- a/src/java/org/apache/bcel/generic/LoadClass.java +++ b/src/java/org/apache/bcel/generic/LoadClass.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denotes that an instruction may start the process of loading and resolving * the referenced class in the Virtual Machine. @@ -25,25 +24,27 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface LoadClass { - /** - * Returns the ObjectType of the referenced class or interface - * that may be loaded and resolved. - * @return object type that may be loaded or null if a primitive is - * referenced - */ - public ObjectType getLoadClassType(ConstantPoolGen cpg); - - /** - * Returns the type associated with this instruction. - * LoadClass instances are always typed, but this type - * does not always refer to the type of the class or interface - * that it possibly forces to load. For example, GETFIELD would - * return the type of the field and not the type of the class - * where the field is defined. - * If no class is forced to be loaded, null is returned. - * An example for this is an ANEWARRAY instruction that creates - * an int[][]. - * @see #getLoadClassType(ConstantPoolGen) - */ - public Type getType(ConstantPoolGen cpg); + + /** + * Returns the ObjectType of the referenced class or interface + * that may be loaded and resolved. + * @return object type that may be loaded or null if a primitive is + * referenced + */ + public ObjectType getLoadClassType( ConstantPoolGen cpg ); + + + /** + * Returns the type associated with this instruction. + * LoadClass instances are always typed, but this type + * does not always refer to the type of the class or interface + * that it possibly forces to load. For example, GETFIELD would + * return the type of the field and not the type of the class + * where the field is defined. + * If no class is forced to be loaded, null is returned. + * An example for this is an ANEWARRAY instruction that creates + * an int[][]. + * @see #getLoadClassType(ConstantPoolGen) + */ + public Type getType( ConstantPoolGen cpg ); } diff --git a/src/java/org/apache/bcel/generic/LoadInstruction.java b/src/java/org/apache/bcel/generic/LoadInstruction.java index c38fc101..ab88a52c 100644 --- a/src/java/org/apache/bcel/generic/LoadInstruction.java +++ b/src/java/org/apache/bcel/generic/LoadInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denotes an unparameterized instruction to load a value from a local * variable, e.g. ILOAD. @@ -24,41 +23,41 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public abstract class LoadInstruction extends LocalVariableInstruction - implements PushInstruction -{ - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - * tag and length are defined in readInstruction and initFromFile, respectively. - */ - LoadInstruction(short canon_tag, short c_tag) { - super(canon_tag, c_tag); - } +public abstract class LoadInstruction extends LocalVariableInstruction implements PushInstruction { - /** - * @param opcode Instruction opcode - * @param c_tag Instruction number for compact version, ALOAD_0, e.g. - * @param n local variable index (unsigned short) - */ - protected LoadInstruction(short opcode, short c_tag, int n) { - super(opcode, c_tag, n); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + * tag and length are defined in readInstruction and initFromFile, respectively. + */ + LoadInstruction(short canon_tag, short c_tag) { + super(canon_tag, c_tag); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitPushInstruction(this); - v.visitTypedInstruction(this); - v.visitLocalVariableInstruction(this); - v.visitLoadInstruction(this); - } -} + /** + * @param opcode Instruction opcode + * @param c_tag Instruction number for compact version, ALOAD_0, e.g. + * @param n local variable index (unsigned short) + */ + protected LoadInstruction(short opcode, short c_tag, int n) { + super(opcode, c_tag, n); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitPushInstruction(this); + v.visitTypedInstruction(this); + v.visitLocalVariableInstruction(this); + v.visitLoadInstruction(this); + } +} diff --git a/src/java/org/apache/bcel/generic/LocalVariableGen.java b/src/java/org/apache/bcel/generic/LocalVariableGen.java index 91834c5f..67a84b56 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/java/org/apache/bcel/generic/LocalVariableGen.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import org.apache.bcel.Constants; import org.apache.bcel.classfile.LocalVariable; @@ -31,144 +30,179 @@ import org.apache.bcel.classfile.LocalVariable; * @see LocalVariable * @see MethodGen */ -public class LocalVariableGen - implements InstructionTargeter, NamedAndTyped, Cloneable, - java.io.Serializable -{ - private int index; - private String name; - private Type type; - private InstructionHandle start, end; - - /** - * Generate a local variable that with index `index'. Note that double and long - * variables need two indexs. Index indices have to be provided by the user. - * - * @param index index of local variable - * @param name its name - * @param type its type - * @param start from where the instruction is valid (null means from the start) - * @param end until where the instruction is valid (null means to the end) - */ - public LocalVariableGen(int index, String name, Type type, - InstructionHandle start, InstructionHandle end) { - if((index < 0) || (index > Constants.MAX_SHORT)) - throw new ClassGenException("Invalid index index: " + index); - - this.name = name; - this.type = type; - this.index = index; - setStart(start); - setEnd(end); - } - - /** - * Get LocalVariable object. - * - * This relies on that the instruction list has already been dumped to byte code or - * or that the `setPositions' methods has been called for the instruction list. - * - * Note that for local variables whose scope end at the last - * instruction of the method's code, the JVM specification is ambiguous: - * both a start_pc+length ending at the last instruction and - * start_pc+length ending at first index beyond the end of the code are - * valid. - * - * @param cp constant pool - */ - public LocalVariable getLocalVariable(ConstantPoolGen cp) { - int start_pc = start.getPosition(); - int length = end.getPosition() - start_pc; - - if(length > 0) - length += end.getInstruction().getLength(); - - int name_index = cp.addUtf8(name); - int signature_index = cp.addUtf8(type.getSignature()); - - return new LocalVariable(start_pc, length, name_index, - signature_index, index, cp.getConstantPool()); - } - - public void setIndex(int index) { this.index = index; } - public int getIndex() { return index; } - public void setName(String name) { this.name = name; } - public String getName() { return name; } - public void setType(Type type) { this.type = type; } - public Type getType() { return type; } - - public InstructionHandle getStart() { return start; } - public InstructionHandle getEnd() { return end; } - - public void setStart(InstructionHandle start) { - BranchInstruction.notifyTarget(this.start, start, this); - this.start = start; - } - - public void setEnd(InstructionHandle end) { - BranchInstruction.notifyTarget(this.end, end, this); - this.end = end; - } - - /** - * @param old_ih old target, either start or end - * @param new_ih new target - */ - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { - boolean targeted = false; - - if(start == old_ih) { - targeted = true; - setStart(new_ih); - } - - if(end == old_ih) { - targeted = true; - setEnd(new_ih); - } - - if(!targeted) - throw new ClassGenException("Not targeting " + old_ih + ", but {" + start + ", " + - end + "}"); - } - - /** - * @return true, if ih is target of this variable - */ - public boolean containsTarget(InstructionHandle ih) { - return (start == ih) || (end == ih); - } - - /** @return a hash code value for the object. - */ - public int hashCode() { - //If the user changes the name or type, problems with the targeter hashmap will occur - int hc = index ^ name.hashCode() ^ type.hashCode(); - return hc; - } - - /** - * We consider to local variables to be equal, if the use the same index and - * are valid in the same range. - */ - public boolean equals(Object o) { - if(!(o instanceof LocalVariableGen)) - return false; - - LocalVariableGen l = (LocalVariableGen)o; - return (l.index == index) && (l.start == start) && (l.end == end); - } - - public String toString() { - return "LocalVariableGen(" + name + ", " + type + ", " + start + ", " + end + ")"; - } - - public Object clone() { - try { - return super.clone(); - } catch(CloneNotSupportedException e) { - System.err.println(e); - return null; - } - } +public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Cloneable, + java.io.Serializable { + + private int index; + private String name; + private Type type; + private InstructionHandle start, end; + + + /** + * Generate a local variable that with index `index'. Note that double and long + * variables need two indexs. Index indices have to be provided by the user. + * + * @param index index of local variable + * @param name its name + * @param type its type + * @param start from where the instruction is valid (null means from the start) + * @param end until where the instruction is valid (null means to the end) + */ + public LocalVariableGen(int index, String name, Type type, InstructionHandle start, + InstructionHandle end) { + if ((index < 0) || (index > Constants.MAX_SHORT)) { + throw new ClassGenException("Invalid index index: " + index); + } + this.name = name; + this.type = type; + this.index = index; + setStart(start); + setEnd(end); + } + + + /** + * Get LocalVariable object. + * + * This relies on that the instruction list has already been dumped to byte code or + * or that the `setPositions' methods has been called for the instruction list. + * + * Note that for local variables whose scope end at the last + * instruction of the method's code, the JVM specification is ambiguous: + * both a start_pc+length ending at the last instruction and + * start_pc+length ending at first index beyond the end of the code are + * valid. + * + * @param cp constant pool + */ + public LocalVariable getLocalVariable( ConstantPoolGen cp ) { + int start_pc = start.getPosition(); + int length = end.getPosition() - start_pc; + if (length > 0) { + length += end.getInstruction().getLength(); + } + int name_index = cp.addUtf8(name); + int signature_index = cp.addUtf8(type.getSignature()); + return new LocalVariable(start_pc, length, name_index, signature_index, index, cp + .getConstantPool()); + } + + + public void setIndex( int index ) { + this.index = index; + } + + + public int getIndex() { + return index; + } + + + public void setName( String name ) { + this.name = name; + } + + + public String getName() { + return name; + } + + + public void setType( Type type ) { + this.type = type; + } + + + public Type getType() { + return type; + } + + + public InstructionHandle getStart() { + return start; + } + + + public InstructionHandle getEnd() { + return end; + } + + + public void setStart( InstructionHandle start ) { + BranchInstruction.notifyTarget(this.start, start, this); + this.start = start; + } + + + public void setEnd( InstructionHandle end ) { + BranchInstruction.notifyTarget(this.end, end, this); + this.end = end; + } + + + /** + * @param old_ih old target, either start or end + * @param new_ih new target + */ + public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { + boolean targeted = false; + if (start == old_ih) { + targeted = true; + setStart(new_ih); + } + if (end == old_ih) { + targeted = true; + setEnd(new_ih); + } + if (!targeted) { + throw new ClassGenException("Not targeting " + old_ih + ", but {" + start + ", " + end + + "}"); + } + } + + + /** + * @return true, if ih is target of this variable + */ + public boolean containsTarget( InstructionHandle ih ) { + return (start == ih) || (end == ih); + } + + + /** @return a hash code value for the object. + */ + public int hashCode() { + //If the user changes the name or type, problems with the targeter hashmap will occur + int hc = index ^ name.hashCode() ^ type.hashCode(); + return hc; + } + + + /** + * We consider to local variables to be equal, if the use the same index and + * are valid in the same range. + */ + public boolean equals( Object o ) { + if (!(o instanceof LocalVariableGen)) { + return false; + } + LocalVariableGen l = (LocalVariableGen) o; + return (l.index == index) && (l.start == start) && (l.end == end); + } + + + public String toString() { + return "LocalVariableGen(" + name + ", " + type + ", " + start + ", " + end + ")"; + } + + + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException e) { + System.err.println(e); + return null; + } + } } diff --git a/src/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/java/org/apache/bcel/generic/LocalVariableInstruction.java index eb3142f4..61a1f9b3 100644 --- a/src/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -27,163 +27,176 @@ import org.apache.bcel.util.ByteSequence; * @version $Id$ * @author M. Dahm */ -public abstract class LocalVariableInstruction extends Instruction - implements TypedInstruction, IndexedInstruction { - protected int n = -1; // index of referenced variable - private short c_tag = -1; // compact version, such as ILOAD_0 - private short canon_tag = -1; // canonical tag such as ILOAD - - private final boolean wide() { return n > Constants.MAX_BYTE; } - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - * tag and length are defined in readInstruction and initFromFile, respectively. - */ - LocalVariableInstruction(short canon_tag, short c_tag) { - super(); - this.canon_tag = canon_tag; - this.c_tag = c_tag; - } - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Also used by IINC()! - */ - LocalVariableInstruction() { - } - - /** - * @param opcode Instruction opcode - * @param c_tag Instruction number for compact version, ALOAD_0, e.g. - * @param n local variable index (unsigned short) - */ - protected LocalVariableInstruction(short opcode, short c_tag, int n) { - super(opcode, (short)2); - - this.c_tag = c_tag; - canon_tag = opcode; - - setIndex(n); - } - - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - if(wide()) // Need WIDE prefix ? - out.writeByte(Constants.WIDE); - - out.writeByte(opcode); - - if(length > 1) { // Otherwise ILOAD_n, instruction, e.g. - if(wide()) - out.writeShort(n); - else - out.writeByte(n); +public abstract class LocalVariableInstruction extends Instruction implements TypedInstruction, + IndexedInstruction { + + protected int n = -1; // index of referenced variable + private short c_tag = -1; // compact version, such as ILOAD_0 + private short canon_tag = -1; // canonical tag such as ILOAD + + + private final boolean wide() { + return n > Constants.MAX_BYTE; + } + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + * tag and length are defined in readInstruction and initFromFile, respectively. + */ + LocalVariableInstruction(short canon_tag, short c_tag) { + super(); + this.canon_tag = canon_tag; + this.c_tag = c_tag; + } + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Also used by IINC()! + */ + LocalVariableInstruction() { } - } - - /** - * Long output format: - * - * <name of opcode> "["<opcode number>"]" - * "("<length of instruction>")" "<"< local variable index>">" - * - * @param verbose long/short format switch - * @return mnemonic for instruction - */ - public String toString(boolean verbose) { - if(((opcode >= Constants.ILOAD_0) && - (opcode <= Constants.ALOAD_3)) || - ((opcode >= Constants.ISTORE_0) && - (opcode <= Constants.ASTORE_3))) - return super.toString(verbose); - else - return super.toString(verbose) + " " + n; - } - - /** - * Read needed data (e.g. index) from file. - * PRE: (ILOAD <= tag <= ALOAD_3) || (ISTORE <= tag <= ASTORE_3) - */ - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException - { - if(wide) { - n = bytes.readUnsignedShort(); - length = 4; - } else if(((opcode >= Constants.ILOAD) && - (opcode <= Constants.ALOAD)) || - ((opcode >= Constants.ISTORE) && - (opcode <= Constants.ASTORE))) { - n = bytes.readUnsignedByte(); - length = 2; - } else if(opcode <= Constants.ALOAD_3) { // compact load instruction such as ILOAD_2 - n = (opcode - Constants.ILOAD_0) % 4; - length = 1; - } else { // Assert ISTORE_0 <= tag <= ASTORE_3 - n = (opcode - Constants.ISTORE_0) % 4; - length = 1; + + + /** + * @param opcode Instruction opcode + * @param c_tag Instruction number for compact version, ALOAD_0, e.g. + * @param n local variable index (unsigned short) + */ + protected LocalVariableInstruction(short opcode, short c_tag, int n) { + super(opcode, (short) 2); + this.c_tag = c_tag; + canon_tag = opcode; + setIndex(n); } - } - - /** - * @return local variable index referred by this instruction. - */ - public final int getIndex() { return n; } - - /** - * Set the local variable index - */ - public void setIndex(int n) { - if((n < 0) || (n > Constants.MAX_SHORT)) - throw new ClassGenException("Illegal value: " + n); - - this.n = n; - - if(n >= 0 && n <= 3) { // Use more compact instruction xLOAD_n - opcode = (short)(c_tag + n); - length = 1; - } else { - opcode = canon_tag; - - if(wide()) // Need WIDE prefix ? - length = 4; - else - length = 2; + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + if (wide()) { + out.writeByte(Constants.WIDE); + } + out.writeByte(opcode); + if (length > 1) { // Otherwise ILOAD_n, instruction, e.g. + if (wide()) { + out.writeShort(n); + } else { + out.writeByte(n); + } + } } - } - - /** @return canonical tag for instruction, e.g., ALOAD for ALOAD_0 - */ - public short getCanonicalTag() { - return canon_tag; - } - - /** - * Returns the type associated with the instruction - - * in case of ALOAD or ASTORE Type.OBJECT is returned. - * This is just a bit incorrect, because ALOAD and ASTORE - * may work on every ReferenceType (including Type.NULL) and - * ASTORE may even work on a ReturnaddressType . - * @return type associated with the instruction - */ - public Type getType(ConstantPoolGen cp) { - switch(canon_tag) { - case Constants.ILOAD: case Constants.ISTORE: - return Type.INT; - case Constants.LLOAD: case Constants.LSTORE: - return Type.LONG; - case Constants.DLOAD: case Constants.DSTORE: - return Type.DOUBLE; - case Constants.FLOAD: case Constants.FSTORE: - return Type.FLOAT; - case Constants.ALOAD: case Constants.ASTORE: - return Type.OBJECT; - - default: throw new ClassGenException("Oops: unknown case in switch" + canon_tag); + + + /** + * Long output format: + * + * <name of opcode> "["<opcode number>"]" + * "("<length of instruction>")" "<"< local variable index>">" + * + * @param verbose long/short format switch + * @return mnemonic for instruction + */ + public String toString( boolean verbose ) { + if (((opcode >= Constants.ILOAD_0) && (opcode <= Constants.ALOAD_3)) + || ((opcode >= Constants.ISTORE_0) && (opcode <= Constants.ASTORE_3))) { + return super.toString(verbose); + } else { + return super.toString(verbose) + " " + n; + } + } + + + /** + * Read needed data (e.g. index) from file. + * PRE: (ILOAD <= tag <= ALOAD_3) || (ISTORE <= tag <= ASTORE_3) + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + if (wide) { + n = bytes.readUnsignedShort(); + length = 4; + } else if (((opcode >= Constants.ILOAD) && (opcode <= Constants.ALOAD)) + || ((opcode >= Constants.ISTORE) && (opcode <= Constants.ASTORE))) { + n = bytes.readUnsignedByte(); + length = 2; + } else if (opcode <= Constants.ALOAD_3) { // compact load instruction such as ILOAD_2 + n = (opcode - Constants.ILOAD_0) % 4; + length = 1; + } else { // Assert ISTORE_0 <= tag <= ASTORE_3 + n = (opcode - Constants.ISTORE_0) % 4; + length = 1; + } + } + + + /** + * @return local variable index referred by this instruction. + */ + public final int getIndex() { + return n; + } + + + /** + * Set the local variable index + */ + public void setIndex( int n ) { + if ((n < 0) || (n > Constants.MAX_SHORT)) { + throw new ClassGenException("Illegal value: " + n); + } + this.n = n; + if (n >= 0 && n <= 3) { // Use more compact instruction xLOAD_n + opcode = (short) (c_tag + n); + length = 1; + } else { + opcode = canon_tag; + if (wide()) { + length = 4; + } else { + length = 2; + } + } + } + + + /** @return canonical tag for instruction, e.g., ALOAD for ALOAD_0 + */ + public short getCanonicalTag() { + return canon_tag; + } + + + /** + * Returns the type associated with the instruction - + * in case of ALOAD or ASTORE Type.OBJECT is returned. + * This is just a bit incorrect, because ALOAD and ASTORE + * may work on every ReferenceType (including Type.NULL) and + * ASTORE may even work on a ReturnaddressType . + * @return type associated with the instruction + */ + public Type getType( ConstantPoolGen cp ) { + switch (canon_tag) { + case Constants.ILOAD: + case Constants.ISTORE: + return Type.INT; + case Constants.LLOAD: + case Constants.LSTORE: + return Type.LONG; + case Constants.DLOAD: + case Constants.DSTORE: + return Type.DOUBLE; + case Constants.FLOAD: + case Constants.FSTORE: + return Type.FLOAT; + case Constants.ALOAD: + case Constants.ASTORE: + return Type.OBJECT; + default: + throw new ClassGenException("Oops: unknown case in switch" + canon_tag); + } } - } } diff --git a/src/java/org/apache/bcel/generic/MONITORENTER.java b/src/java/org/apache/bcel/generic/MONITORENTER.java index d914f0ed..0f42ca31 100644 --- a/src/java/org/apache/bcel/generic/MONITORENTER.java +++ b/src/java/org/apache/bcel/generic/MONITORENTER.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * MONITORENTER - Enter monitor for object *
            Stack: ..., objectref -> ...
            @@ -24,28 +23,31 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class MONITORENTER extends Instruction - implements ExceptionThrower, StackConsumer { - public MONITORENTER() { - super(org.apache.bcel.Constants.MONITORENTER, (short)1); - } +public class MONITORENTER extends Instruction implements ExceptionThrower, StackConsumer { + + public MONITORENTER() { + super(org.apache.bcel.Constants.MONITORENTER, (short) 1); + } + - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION }; - } + public Class[] getExceptions() { + return new Class[] { + org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION + }; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitStackConsumer(this); - v.visitMONITORENTER(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitStackConsumer(this); + v.visitMONITORENTER(this); + } } diff --git a/src/java/org/apache/bcel/generic/MONITOREXIT.java b/src/java/org/apache/bcel/generic/MONITOREXIT.java index 8b845a55..95396f6e 100644 --- a/src/java/org/apache/bcel/generic/MONITOREXIT.java +++ b/src/java/org/apache/bcel/generic/MONITOREXIT.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * MONITOREXIT - Exit monitor for object *
            Stack: ..., objectref -> ...
            @@ -24,28 +23,31 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class MONITOREXIT extends Instruction - implements ExceptionThrower, StackConsumer { - public MONITOREXIT() { - super(org.apache.bcel.Constants.MONITOREXIT, (short)1); - } +public class MONITOREXIT extends Instruction implements ExceptionThrower, StackConsumer { + + public MONITOREXIT() { + super(org.apache.bcel.Constants.MONITOREXIT, (short) 1); + } + - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION }; - } + public Class[] getExceptions() { + return new Class[] { + org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION + }; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitStackConsumer(this); - v.visitMONITOREXIT(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitStackConsumer(this); + v.visitMONITOREXIT(this); + } } diff --git a/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java index 80eb20e9..3eed2a19 100644 --- a/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java +++ b/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -29,108 +29,118 @@ import org.apache.bcel.util.ByteSequence; * @version $Id$ * @author M. Dahm */ -public class MULTIANEWARRAY extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower { - private short dimensions; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - MULTIANEWARRAY() {} - - public MULTIANEWARRAY(int index, short dimensions) { - super(org.apache.bcel.Constants.MULTIANEWARRAY, index); - - if(dimensions < 1) - throw new ClassGenException("Invalid dimensions value: " + dimensions); - - this.dimensions = dimensions; - length = 4; - } - - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - out.writeShort(index); - out.writeByte(dimensions); - } - - /** - * Read needed data (i.e., no. dimension) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) - throws IOException - { - super.initFromFile(bytes, wide); - dimensions = bytes.readByte(); - length = 4; - } - - /** - * @return number of dimensions to be created - */ - public final short getDimensions() { return dimensions; } - - /** - * @return mnemonic for instruction - */ - public String toString(boolean verbose) { - return super.toString(verbose) + " " + index + " " + dimensions; - } - - /** - * @return mnemonic for instruction with symbolic references resolved - */ - public String toString(ConstantPool cp) { - return super.toString(cp) + " " + dimensions; - } - - /** - * Also works for instructions whose stack effect depends on the - * constant pool entry they reference. - * @return Number of words consumed from stack by this instruction - */ - public int consumeStack(ConstantPoolGen cpg) { return dimensions; } - - public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; - - System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, - cs, 0, ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); - - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length+1] = ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION; - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; - - return cs; - } - - public ObjectType getLoadClassType(ConstantPoolGen cpg) { - Type t = getType(cpg); - - if (t instanceof ArrayType){ - t = ((ArrayType) t).getBasicType(); +public class MULTIANEWARRAY extends CPInstruction implements LoadClass, AllocationInstruction, + ExceptionThrower { + + private short dimensions; + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + MULTIANEWARRAY() { + } + + + public MULTIANEWARRAY(int index, short dimensions) { + super(org.apache.bcel.Constants.MULTIANEWARRAY, index); + if (dimensions < 1) { + throw new ClassGenException("Invalid dimensions value: " + dimensions); + } + this.dimensions = dimensions; + length = 4; + } + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + out.writeByte(opcode); + out.writeShort(index); + out.writeByte(dimensions); + } + + + /** + * Read needed data (i.e., no. dimension) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + super.initFromFile(bytes, wide); + dimensions = bytes.readByte(); + length = 4; + } + + + /** + * @return number of dimensions to be created + */ + public final short getDimensions() { + return dimensions; + } + + + /** + * @return mnemonic for instruction + */ + public String toString( boolean verbose ) { + return super.toString(verbose) + " " + index + " " + dimensions; + } + + + /** + * @return mnemonic for instruction with symbolic references resolved + */ + public String toString( ConstantPool cp ) { + return super.toString(cp) + " " + dimensions; + } + + + /** + * Also works for instructions whose stack effect depends on the + * constant pool entry they reference. + * @return Number of words consumed from stack by this instruction + */ + public int consumeStack( ConstantPoolGen cpg ) { + return dimensions; + } + + + public Class[] getExceptions() { + Class[] cs = new Class[2 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); + cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length + 1] = ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION; + cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; + return cs; + } + + + public ObjectType getLoadClassType( ConstantPoolGen cpg ) { + Type t = getType(cpg); + if (t instanceof ArrayType) { + t = ((ArrayType) t).getBasicType(); + } + return (t instanceof ObjectType) ? (ObjectType) t : null; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitLoadClass(this); + v.visitAllocationInstruction(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitMULTIANEWARRAY(this); } - - return (t instanceof ObjectType)? (ObjectType) t : null; - } - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitLoadClass(this); - v.visitAllocationInstruction(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitMULTIANEWARRAY(this); - } } diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/java/org/apache/bcel/generic/MethodGen.java index cdad95fe..4f481804 100644 --- a/src/java/org/apache/bcel/generic/MethodGen.java +++ b/src/java/org/apache/bcel/generic/MethodGen.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; @@ -52,1073 +51,1036 @@ import org.apache.bcel.util.BCELComparator; * @see Method */ public class MethodGen extends FieldGenOrMethodGen { - private String class_name; - private Type[] arg_types; - private String[] arg_names; - private int max_locals; - private int max_stack; - private InstructionList il; - private boolean strip_attributes; - - private List variable_vec = new ArrayList(); - private List line_number_vec = new ArrayList(); - private List exception_vec = new ArrayList(); - private List throws_vec = new ArrayList(); - private List code_attrs_vec = new ArrayList(); - - private static BCELComparator _cmp = new BCELComparator() { - public boolean equals(Object o1, Object o2) { - MethodGen THIS = (MethodGen)o1; - MethodGen THAT = (MethodGen)o2; - - return THIS.getName().equals(THAT.getName()) - && THIS.getSignature().equals(THAT.getSignature()); - } - - public int hashCode(Object o) { - MethodGen THIS = (MethodGen)o; - return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); - } - }; - - /** - * Declare method. If the method is non-static the constructor - * automatically declares a local variable `$this' in slot 0. The - * actual code is contained in the `il' parameter, which may further - * manipulated by the user. But he must take care not to remove any - * instruction (handles) that are still referenced from this object. - * - * For example one may not add a local variable and later remove the - * instructions it refers to without causing havoc. It is safe - * however if you remove that local variable, too. - * - * @param access_flags access qualifiers - * @param return_type method type - * @param arg_types argument types - * @param arg_names argument names (if this is null, default names will be provided - * for them) - * @param method_name name of method - * @param class_name class name containing this method (may be null, if you don't care) - * @param il instruction list associated with this method, may be null only for - * abstract or native methods - * @param cp constant pool - */ - public MethodGen( - int access_flags, - Type return_type, - Type[] arg_types, - String[] arg_names, - String method_name, - String class_name, - InstructionList il, - ConstantPoolGen cp) { - setAccessFlags(access_flags); - setType(return_type); - setArgumentTypes(arg_types); - setArgumentNames(arg_names); - setName(method_name); - setClassName(class_name); - setInstructionList(il); - setConstantPool(cp); - - boolean abstract_ = isAbstract() || isNative(); - InstructionHandle start = null; - InstructionHandle end = null; - - if (!abstract_) { - start = il.getStart(); - end = il.getEnd(); - - /* Add local variables, namely the implicit `this' and the arguments - */ - if (!isStatic() - && (class_name != null)) { // Instance method -> `this' is local var 0 - addLocalVariable("this", new ObjectType(class_name), start, end); - } - } - - if (arg_types != null) { - int size = arg_types.length; - - for (int i = 0; i < size; i++) { - if (Type.VOID == arg_types[i]) { - throw new ClassGenException("'void' is an illegal argument type for a method"); - } - } - if (arg_names != null) { // Names for variables provided? - if (size != arg_names.length) - throw new ClassGenException( - "Mismatch in argument array lengths: " - + size - + " vs. " - + arg_names.length); - } else { // Give them dummy names - arg_names = new String[size]; + private String class_name; + private Type[] arg_types; + private String[] arg_names; + private int max_locals; + private int max_stack; + private InstructionList il; + private boolean strip_attributes; + private List variable_vec = new ArrayList(); + private List line_number_vec = new ArrayList(); + private List exception_vec = new ArrayList(); + private List throws_vec = new ArrayList(); + private List code_attrs_vec = new ArrayList(); + private static BCELComparator _cmp = new BCELComparator() { + + public boolean equals( Object o1, Object o2 ) { + MethodGen THIS = (MethodGen) o1; + MethodGen THAT = (MethodGen) o2; + return THIS.getName().equals(THAT.getName()) + && THIS.getSignature().equals(THAT.getSignature()); + } - for (int i = 0; i < size; i++) - arg_names[i] = "arg" + i; + public int hashCode( Object o ) { + MethodGen THIS = (MethodGen) o; + return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); + } + }; + + + /** + * Declare method. If the method is non-static the constructor + * automatically declares a local variable `$this' in slot 0. The + * actual code is contained in the `il' parameter, which may further + * manipulated by the user. But he must take care not to remove any + * instruction (handles) that are still referenced from this object. + * + * For example one may not add a local variable and later remove the + * instructions it refers to without causing havoc. It is safe + * however if you remove that local variable, too. + * + * @param access_flags access qualifiers + * @param return_type method type + * @param arg_types argument types + * @param arg_names argument names (if this is null, default names will be provided + * for them) + * @param method_name name of method + * @param class_name class name containing this method (may be null, if you don't care) + * @param il instruction list associated with this method, may be null only for + * abstract or native methods + * @param cp constant pool + */ + public MethodGen(int access_flags, Type return_type, Type[] arg_types, String[] arg_names, + String method_name, String class_name, InstructionList il, ConstantPoolGen cp) { + setAccessFlags(access_flags); + setType(return_type); + setArgumentTypes(arg_types); setArgumentNames(arg_names); - } - - if (!abstract_) { - for (int i = 0; i < size; i++) { - addLocalVariable(arg_names[i], arg_types[i], start, end); + setName(method_name); + setClassName(class_name); + setInstructionList(il); + setConstantPool(cp); + boolean abstract_ = isAbstract() || isNative(); + InstructionHandle start = null; + InstructionHandle end = null; + if (!abstract_) { + start = il.getStart(); + end = il.getEnd(); + /* Add local variables, namely the implicit `this' and the arguments + */ + if (!isStatic() && (class_name != null)) { // Instance method -> `this' is local var 0 + addLocalVariable("this", new ObjectType(class_name), start, end); + } } - } - } - } - - /** - * Instantiate from existing method. - * - * @param m method - * @param class_name class name containing this method - * @param cp constant pool - */ - public MethodGen(Method m, String class_name, ConstantPoolGen cp) { - this( - m.getAccessFlags(), - Type.getReturnType(m.getSignature()), - Type.getArgumentTypes(m.getSignature()), - null /* may be overridden anyway */ - , -m.getName(), - class_name, - ((m.getAccessFlags() & (Constants.ACC_ABSTRACT | Constants.ACC_NATIVE)) - == 0) - ? new InstructionList(m.getCode().getCode()) - : null, - cp); - - Attribute[] attributes = m.getAttributes(); - for (int i = 0; i < attributes.length; i++) { - Attribute a = attributes[i]; - - if (a instanceof Code) { - Code c = (Code)a; - setMaxStack(c.getMaxStack()); - setMaxLocals(c.getMaxLocals()); - - CodeException[] ces = c.getExceptionTable(); - - if (ces != null) { - for (int j = 0; j < ces.length; j++) { - CodeException ce = ces[j]; - int type = ce.getCatchType(); - ObjectType c_type = null; - - if (type > 0) { - String cen = - m.getConstantPool().getConstantString( - type, - Constants.CONSTANT_Class); - c_type = new ObjectType(cen); + if (arg_types != null) { + int size = arg_types.length; + for (int i = 0; i < size; i++) { + if (Type.VOID == arg_types[i]) { + throw new ClassGenException("'void' is an illegal argument type for a method"); + } } + if (arg_names != null) { // Names for variables provided? + if (size != arg_names.length) { + throw new ClassGenException("Mismatch in argument array lengths: " + size + + " vs. " + arg_names.length); + } + } else { // Give them dummy names + arg_names = new String[size]; + for (int i = 0; i < size; i++) { + arg_names[i] = "arg" + i; + } + setArgumentNames(arg_names); + } + if (!abstract_) { + for (int i = 0; i < size; i++) { + addLocalVariable(arg_names[i], arg_types[i], start, end); + } + } + } + } - int end_pc = ce.getEndPC(); - int length = m.getCode().getCode().length; - InstructionHandle end; + /** + * Instantiate from existing method. + * + * @param m method + * @param class_name class name containing this method + * @param cp constant pool + */ + public MethodGen(Method m, String class_name, ConstantPoolGen cp) { + this(m.getAccessFlags(), Type.getReturnType(m.getSignature()), Type.getArgumentTypes(m + .getSignature()), null /* may be overridden anyway */ + , m.getName(), class_name, + ((m.getAccessFlags() & (Constants.ACC_ABSTRACT | Constants.ACC_NATIVE)) == 0) + ? new InstructionList(m.getCode().getCode()) + : null, cp); + Attribute[] attributes = m.getAttributes(); + for (int i = 0; i < attributes.length; i++) { + Attribute a = attributes[i]; + if (a instanceof Code) { + Code c = (Code) a; + setMaxStack(c.getMaxStack()); + setMaxLocals(c.getMaxLocals()); + CodeException[] ces = c.getExceptionTable(); + if (ces != null) { + for (int j = 0; j < ces.length; j++) { + CodeException ce = ces[j]; + int type = ce.getCatchType(); + ObjectType c_type = null; + if (type > 0) { + String cen = m.getConstantPool().getConstantString(type, + Constants.CONSTANT_Class); + c_type = new ObjectType(cen); + } + int end_pc = ce.getEndPC(); + int length = m.getCode().getCode().length; + InstructionHandle end; + if (length == end_pc) { // May happen, because end_pc is exclusive + end = il.getEnd(); + } else { + end = il.findHandle(end_pc); + end = end.getPrev(); // Make it inclusive + } + addExceptionHandler(il.findHandle(ce.getStartPC()), end, il.findHandle(ce + .getHandlerPC()), c_type); + } + } + Attribute[] c_attributes = c.getAttributes(); + for (int j = 0; j < c_attributes.length; j++) { + a = c_attributes[j]; + if (a instanceof LineNumberTable) { + LineNumber[] ln = ((LineNumberTable) a).getLineNumberTable(); + for (int k = 0; k < ln.length; k++) { + LineNumber l = ln[k]; + InstructionHandle ih = il.findHandle(l.getStartPC()); + if (ih != null) { + addLineNumber(ih, l.getLineNumber()); + } + } + } else if (a instanceof LocalVariableTable) { + LocalVariable[] lv = ((LocalVariableTable) a).getLocalVariableTable(); + removeLocalVariables(); + for (int k = 0; k < lv.length; k++) { + LocalVariable l = lv[k]; + InstructionHandle start = il.findHandle(l.getStartPC()); + InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength()); + // Repair malformed handles + if (null == start) { + start = il.getStart(); + } + if (null == end) { + end = il.getEnd(); + } + addLocalVariable(l.getName(), Type.getType(l.getSignature()), l + .getIndex(), start, end); + } + } else { + addCodeAttribute(a); + } + } + } else if (a instanceof ExceptionTable) { + String[] names = ((ExceptionTable) a).getExceptionNames(); + for (int j = 0; j < names.length; j++) { + addException(names[j]); + } + } else { + addAttribute(a); + } + } + } - if (length == end_pc) { // May happen, because end_pc is exclusive - end = il.getEnd(); + + /** + * Adds a local variable to this method. + * + * @param name variable name + * @param type variable type + * @param slot the index of the local variable, if type is long or double, the next available + * index is slot+2 + * @param start from where the variable is valid + * @param end until where the variable is valid + * @return new local variable object + * @see LocalVariable + */ + public LocalVariableGen addLocalVariable( String name, Type type, int slot, + InstructionHandle start, InstructionHandle end ) { + byte t = type.getType(); + if (t != Constants.T_ADDRESS) { + int add = type.getSize(); + if (slot + add > max_locals) { + max_locals = slot + add; + } + LocalVariableGen l = new LocalVariableGen(slot, name, type, start, end); + int i; + if ((i = variable_vec.indexOf(l)) >= 0) { + variable_vec.set(i, l); } else { - end = il.findHandle(end_pc); - end = end.getPrev(); // Make it inclusive + variable_vec.add(l); + } + return l; + } else { + throw new IllegalArgumentException("Can not use " + type + + " as type for local variable"); + } + } + + + /** + * Adds a local variable to this method and assigns an index automatically. + * + * @param name variable name + * @param type variable type + * @param start from where the variable is valid, if this is null, + * it is valid from the start + * @param end until where the variable is valid, if this is null, + * it is valid to the end + * @return new local variable object + * @see LocalVariable + */ + public LocalVariableGen addLocalVariable( String name, Type type, InstructionHandle start, + InstructionHandle end ) { + return addLocalVariable(name, type, max_locals, start, end); + } + + + /** + * Remove a local variable, its slot will not be reused, if you do not use addLocalVariable + * with an explicit index argument. + */ + public void removeLocalVariable( LocalVariableGen l ) { + variable_vec.remove(l); + } + + + /** + * Remove all local variables. + */ + public void removeLocalVariables() { + variable_vec.clear(); + } + + + /** + * Sort local variables by index + */ + private static final void sort( LocalVariableGen[] vars, int l, int r ) { + int i = l, j = r; + int m = vars[(l + r) / 2].getIndex(); + LocalVariableGen h; + do { + while (vars[i].getIndex() < m) { + i++; + } + while (m < vars[j].getIndex()) { + j--; + } + if (i <= j) { + h = vars[i]; + vars[i] = vars[j]; + vars[j] = h; // Swap elements + i++; + j--; + } + } while (i <= j); + if (l < j) { + sort(vars, l, j); + } + if (i < r) { + sort(vars, i, r); + } + } + + + /* + * If the range of the variable has not been set yet, it will be set to be valid from + * the start to the end of the instruction list. + * + * @return array of declared local variables sorted by index + */ + public LocalVariableGen[] getLocalVariables() { + int size = variable_vec.size(); + LocalVariableGen[] lg = new LocalVariableGen[size]; + variable_vec.toArray(lg); + for (int i = 0; i < size; i++) { + if (lg[i].getStart() == null) { + lg[i].setStart(il.getStart()); + } + if (lg[i].getEnd() == null) { + lg[i].setEnd(il.getEnd()); + } + } + if (size > 1) { + sort(lg, 0, size - 1); + } + return lg; + } + + + /** + * @return `LocalVariableTable' attribute of all the local variables of this method. + */ + public LocalVariableTable getLocalVariableTable( ConstantPoolGen cp ) { + LocalVariableGen[] lg = getLocalVariables(); + int size = lg.length; + LocalVariable[] lv = new LocalVariable[size]; + for (int i = 0; i < size; i++) { + lv[i] = lg[i].getLocalVariable(cp); + } + return new LocalVariableTable(cp.addUtf8("LocalVariableTable"), 2 + lv.length * 10, lv, cp + .getConstantPool()); + } + + + /** + * Give an instruction a line number corresponding to the source code line. + * + * @param ih instruction to tag + * @return new line number object + * @see LineNumber + */ + public LineNumberGen addLineNumber( InstructionHandle ih, int src_line ) { + LineNumberGen l = new LineNumberGen(ih, src_line); + line_number_vec.add(l); + return l; + } + + + /** + * Remove a line number. + */ + public void removeLineNumber( LineNumberGen l ) { + line_number_vec.remove(l); + } + + + /** + * Remove all line numbers. + */ + public void removeLineNumbers() { + line_number_vec.clear(); + } + + + /* + * @return array of line numbers + */ + public LineNumberGen[] getLineNumbers() { + LineNumberGen[] lg = new LineNumberGen[line_number_vec.size()]; + line_number_vec.toArray(lg); + return lg; + } + + + /** + * @return `LineNumberTable' attribute of all the local variables of this method. + */ + public LineNumberTable getLineNumberTable( ConstantPoolGen cp ) { + int size = line_number_vec.size(); + LineNumber[] ln = new LineNumber[size]; + try { + for (int i = 0; i < size; i++) { + ln[i] = ((LineNumberGen) line_number_vec.get(i)).getLineNumber(); } + } catch (ArrayIndexOutOfBoundsException e) { + } // Never occurs + return new LineNumberTable(cp.addUtf8("LineNumberTable"), 2 + ln.length * 4, ln, cp + .getConstantPool()); + } + - addExceptionHandler( - il.findHandle(ce.getStartPC()), - end, - il.findHandle(ce.getHandlerPC()), - c_type); - } + /** + * Add an exception handler, i.e., specify region where a handler is active and an + * instruction where the actual handling is done. + * + * @param start_pc Start of region (inclusive) + * @param end_pc End of region (inclusive) + * @param handler_pc Where handling is done + * @param catch_type class type of handled exception or null if any + * exception is handled + * @return new exception handler object + */ + public CodeExceptionGen addExceptionHandler( InstructionHandle start_pc, + InstructionHandle end_pc, InstructionHandle handler_pc, ObjectType catch_type ) { + if ((start_pc == null) || (end_pc == null) || (handler_pc == null)) { + throw new ClassGenException("Exception handler target is null instruction"); } + CodeExceptionGen c = new CodeExceptionGen(start_pc, end_pc, handler_pc, catch_type); + exception_vec.add(c); + return c; + } - Attribute[] c_attributes = c.getAttributes(); - for (int j = 0; j < c_attributes.length; j++) { - a = c_attributes[j]; - if (a instanceof LineNumberTable) { - LineNumber[] ln = ((LineNumberTable)a).getLineNumberTable(); + /** + * Remove an exception handler. + */ + public void removeExceptionHandler( CodeExceptionGen c ) { + exception_vec.remove(c); + } - for (int k = 0; k < ln.length; k++) { - LineNumber l = ln[k]; - InstructionHandle ih = il.findHandle(l.getStartPC()); - if (ih != null) - addLineNumber(ih, l.getLineNumber()); + + /** + * Remove all line numbers. + */ + public void removeExceptionHandlers() { + exception_vec.clear(); + } + + + /* + * @return array of declared exception handlers + */ + public CodeExceptionGen[] getExceptionHandlers() { + CodeExceptionGen[] cg = new CodeExceptionGen[exception_vec.size()]; + exception_vec.toArray(cg); + return cg; + } + + + /** + * @return code exceptions for `Code' attribute + */ + private CodeException[] getCodeExceptions() { + int size = exception_vec.size(); + CodeException[] c_exc = new CodeException[size]; + try { + for (int i = 0; i < size; i++) { + CodeExceptionGen c = (CodeExceptionGen) exception_vec.get(i); + c_exc[i] = c.getCodeException(cp); } - } else if (a instanceof LocalVariableTable) { - LocalVariable[] lv = - ((LocalVariableTable)a).getLocalVariableTable(); - - removeLocalVariables(); - - for (int k = 0; k < lv.length; k++) { - LocalVariable l = lv[k]; - InstructionHandle start = il.findHandle(l.getStartPC()); - InstructionHandle end = - il.findHandle(l.getStartPC() + l.getLength()); - - // Repair malformed handles - if (null == start) { - start = il.getStart(); - } - - if (null == end) { - end = il.getEnd(); - } - - addLocalVariable( - l.getName(), - Type.getType(l.getSignature()), - l.getIndex(), - start, - end); + } catch (ArrayIndexOutOfBoundsException e) { + } + return c_exc; + } + + + /** + * Add an exception possibly thrown by this method. + * + * @param class_name (fully qualified) name of exception + */ + public void addException( String class_name ) { + throws_vec.add(class_name); + } + + + /** + * Remove an exception. + */ + public void removeException( String c ) { + throws_vec.remove(c); + } + + + /** + * Remove all exceptions. + */ + public void removeExceptions() { + throws_vec.clear(); + } + + + /* + * @return array of thrown exceptions + */ + public String[] getExceptions() { + String[] e = new String[throws_vec.size()]; + throws_vec.toArray(e); + return e; + } + + + /** + * @return `Exceptions' attribute of all the exceptions thrown by this method. + */ + private ExceptionTable getExceptionTable( ConstantPoolGen cp ) { + int size = throws_vec.size(); + int[] ex = new int[size]; + try { + for (int i = 0; i < size; i++) { + ex[i] = cp.addClass((String) throws_vec.get(i)); } - } else - addCodeAttribute(a); + } catch (ArrayIndexOutOfBoundsException e) { } - } else if (a instanceof ExceptionTable) { - String[] names = ((ExceptionTable)a).getExceptionNames(); - for (int j = 0; j < names.length; j++) - addException(names[j]); - } else - addAttribute(a); - } - } - - /** - * Adds a local variable to this method. - * - * @param name variable name - * @param type variable type - * @param slot the index of the local variable, if type is long or double, the next available - * index is slot+2 - * @param start from where the variable is valid - * @param end until where the variable is valid - * @return new local variable object - * @see LocalVariable - */ - public LocalVariableGen addLocalVariable( - String name, - Type type, - int slot, - InstructionHandle start, - InstructionHandle end) { - byte t = type.getType(); - - if (t != Constants.T_ADDRESS) { - int add = type.getSize(); - - if (slot + add > max_locals) - max_locals = slot + add; - - LocalVariableGen l = new LocalVariableGen(slot, name, type, start, end); - int i; - - if ((i = variable_vec.indexOf(l)) >= 0) // Overwrite if necessary - variable_vec.set(i, l); - else - variable_vec.add(l); - - return l; - } else { - throw new IllegalArgumentException( - "Can not use " + type + " as type for local variable"); - - } - } - - /** - * Adds a local variable to this method and assigns an index automatically. - * - * @param name variable name - * @param type variable type - * @param start from where the variable is valid, if this is null, - * it is valid from the start - * @param end until where the variable is valid, if this is null, - * it is valid to the end - * @return new local variable object - * @see LocalVariable - */ - public LocalVariableGen addLocalVariable( - String name, - Type type, - InstructionHandle start, - InstructionHandle end) { - return addLocalVariable(name, type, max_locals, start, end); - } - - /** - * Remove a local variable, its slot will not be reused, if you do not use addLocalVariable - * with an explicit index argument. - */ - public void removeLocalVariable(LocalVariableGen l) { - variable_vec.remove(l); - } - - /** - * Remove all local variables. - */ - public void removeLocalVariables() { - variable_vec.clear(); - } - - /** - * Sort local variables by index - */ - private static final void sort(LocalVariableGen[] vars, int l, int r) { - int i = l, j = r; - int m = vars[(l + r) / 2].getIndex(); - LocalVariableGen h; - - do { - while (vars[i].getIndex() < m) - i++; - while (m < vars[j].getIndex()) - j--; - - if (i <= j) { - h = vars[i]; - vars[i] = vars[j]; - vars[j] = h; // Swap elements - i++; - j--; - } - } - while (i <= j); - - if (l < j) - sort(vars, l, j); - if (i < r) - sort(vars, i, r); - } - - /* - * If the range of the variable has not been set yet, it will be set to be valid from - * the start to the end of the instruction list. - * - * @return array of declared local variables sorted by index - */ - public LocalVariableGen[] getLocalVariables() { - int size = variable_vec.size(); - LocalVariableGen[] lg = new LocalVariableGen[size]; - variable_vec.toArray(lg); - - for (int i = 0; i < size; i++) { - if (lg[i].getStart() == null) - lg[i].setStart(il.getStart()); - - if (lg[i].getEnd() == null) - lg[i].setEnd(il.getEnd()); - } - - if (size > 1) - sort(lg, 0, size - 1); - - return lg; - } - - /** - * @return `LocalVariableTable' attribute of all the local variables of this method. - */ - public LocalVariableTable getLocalVariableTable(ConstantPoolGen cp) { - LocalVariableGen[] lg = getLocalVariables(); - int size = lg.length; - LocalVariable[] lv = new LocalVariable[size]; - - for (int i = 0; i < size; i++) - lv[i] = lg[i].getLocalVariable(cp); - - return new LocalVariableTable( - cp.addUtf8("LocalVariableTable"), - 2 + lv.length * 10, - lv, - cp.getConstantPool()); - } - - /** - * Give an instruction a line number corresponding to the source code line. - * - * @param ih instruction to tag - * @return new line number object - * @see LineNumber - */ - public LineNumberGen addLineNumber(InstructionHandle ih, int src_line) { - LineNumberGen l = new LineNumberGen(ih, src_line); - line_number_vec.add(l); - return l; - } - - /** - * Remove a line number. - */ - public void removeLineNumber(LineNumberGen l) { - line_number_vec.remove(l); - } - - /** - * Remove all line numbers. - */ - public void removeLineNumbers() { - line_number_vec.clear(); - } - - /* - * @return array of line numbers - */ - public LineNumberGen[] getLineNumbers() { - LineNumberGen[] lg = new LineNumberGen[line_number_vec.size()]; - line_number_vec.toArray(lg); - return lg; - } - - /** - * @return `LineNumberTable' attribute of all the local variables of this method. - */ - public LineNumberTable getLineNumberTable(ConstantPoolGen cp) { - int size = line_number_vec.size(); - LineNumber[] ln = new LineNumber[size]; - - try { - for (int i = 0; i < size; i++) - ln[i] = ((LineNumberGen)line_number_vec.get(i)).getLineNumber(); - } catch (ArrayIndexOutOfBoundsException e) { - } // Never occurs - - return new LineNumberTable( - cp.addUtf8("LineNumberTable"), - 2 + ln.length * 4, - ln, - cp.getConstantPool()); - } - - /** - * Add an exception handler, i.e., specify region where a handler is active and an - * instruction where the actual handling is done. - * - * @param start_pc Start of region (inclusive) - * @param end_pc End of region (inclusive) - * @param handler_pc Where handling is done - * @param catch_type class type of handled exception or null if any - * exception is handled - * @return new exception handler object - */ - public CodeExceptionGen addExceptionHandler( - InstructionHandle start_pc, - InstructionHandle end_pc, - InstructionHandle handler_pc, - ObjectType catch_type) { - if ((start_pc == null) || (end_pc == null) || (handler_pc == null)) - throw new ClassGenException("Exception handler target is null instruction"); - - CodeExceptionGen c = - new CodeExceptionGen(start_pc, end_pc, handler_pc, catch_type); - exception_vec.add(c); - return c; - } - - /** - * Remove an exception handler. - */ - public void removeExceptionHandler(CodeExceptionGen c) { - exception_vec.remove(c); - } - - /** - * Remove all line numbers. - */ - public void removeExceptionHandlers() { - exception_vec.clear(); - } - - /* - * @return array of declared exception handlers - */ - public CodeExceptionGen[] getExceptionHandlers() { - CodeExceptionGen[] cg = new CodeExceptionGen[exception_vec.size()]; - exception_vec.toArray(cg); - return cg; - } - - /** - * @return code exceptions for `Code' attribute - */ - private CodeException[] getCodeExceptions() { - int size = exception_vec.size(); - CodeException[] c_exc = new CodeException[size]; - - try { - for (int i = 0; i < size; i++) { - CodeExceptionGen c = (CodeExceptionGen)exception_vec.get(i); - c_exc[i] = c.getCodeException(cp); - } - } catch (ArrayIndexOutOfBoundsException e) { - } - - return c_exc; - } - - /** - * Add an exception possibly thrown by this method. - * - * @param class_name (fully qualified) name of exception - */ - public void addException(String class_name) { - throws_vec.add(class_name); - } - - /** - * Remove an exception. - */ - public void removeException(String c) { - throws_vec.remove(c); - } - - /** - * Remove all exceptions. - */ - public void removeExceptions() { - throws_vec.clear(); - } - - /* - * @return array of thrown exceptions - */ - public String[] getExceptions() { - String[] e = new String[throws_vec.size()]; - throws_vec.toArray(e); - return e; - } - - /** - * @return `Exceptions' attribute of all the exceptions thrown by this method. - */ - private ExceptionTable getExceptionTable(ConstantPoolGen cp) { - int size = throws_vec.size(); - int[] ex = new int[size]; - - try { - for (int i = 0; i < size; i++) - ex[i] = cp.addClass((String)throws_vec.get(i)); - } catch (ArrayIndexOutOfBoundsException e) { - } - - return new ExceptionTable( - cp.addUtf8("Exceptions"), - 2 + 2 * size, - ex, - cp.getConstantPool()); - } - - /** - * Add an attribute to the code. Currently, the JVM knows about the - * LineNumberTable, LocalVariableTable and StackMap attributes, - * where the former two will be generated automatically and the - * latter is used for the MIDP only. Other attributes will be - * ignored by the JVM but do no harm. - * - * @param a attribute to be added - */ - public void addCodeAttribute(Attribute a) { - code_attrs_vec.add(a); - } - - /** - * Remove a code attribute. - */ - public void removeCodeAttribute(Attribute a) { - code_attrs_vec.remove(a); - } - - /** - * Remove all code attributes. - */ - public void removeCodeAttributes() { - code_attrs_vec.clear(); - } - - /** - * @return all attributes of this method. - */ - public Attribute[] getCodeAttributes() { - Attribute[] attributes = new Attribute[code_attrs_vec.size()]; - code_attrs_vec.toArray(attributes); - return attributes; - } - - /** - * Get method object. Never forget to call setMaxStack() or setMaxStack(max), respectively, - * before calling this method (the same applies for max locals). - * - * @return method object - */ - public Method getMethod() { - String signature = getSignature(); - int name_index = cp.addUtf8(name); - int signature_index = cp.addUtf8(signature); - - /* Also updates positions of instructions, i.e., their indices + return new ExceptionTable(cp.addUtf8("Exceptions"), 2 + 2 * size, ex, cp.getConstantPool()); + } + + + /** + * Add an attribute to the code. Currently, the JVM knows about the + * LineNumberTable, LocalVariableTable and StackMap attributes, + * where the former two will be generated automatically and the + * latter is used for the MIDP only. Other attributes will be + * ignored by the JVM but do no harm. + * + * @param a attribute to be added */ - byte[] byte_code = null; + public void addCodeAttribute( Attribute a ) { + code_attrs_vec.add(a); + } + - if (il != null) - byte_code = il.getByteCode(); + /** + * Remove a code attribute. + */ + public void removeCodeAttribute( Attribute a ) { + code_attrs_vec.remove(a); + } - LineNumberTable lnt = null; - LocalVariableTable lvt = null; - /* Create LocalVariableTable and LineNumberTable attributes (for debuggers, e.g.) + /** + * Remove all code attributes. */ - if ((variable_vec.size() > 0) && !strip_attributes) - addCodeAttribute(lvt = getLocalVariableTable(cp)); + public void removeCodeAttributes() { + code_attrs_vec.clear(); + } - if ((line_number_vec.size() > 0) && !strip_attributes) - addCodeAttribute(lnt = getLineNumberTable(cp)); - Attribute[] code_attrs = getCodeAttributes(); + /** + * @return all attributes of this method. + */ + public Attribute[] getCodeAttributes() { + Attribute[] attributes = new Attribute[code_attrs_vec.size()]; + code_attrs_vec.toArray(attributes); + return attributes; + } - /* Each attribute causes 6 additional header bytes + + /** + * Get method object. Never forget to call setMaxStack() or setMaxStack(max), respectively, + * before calling this method (the same applies for max locals). + * + * @return method object */ - int attrs_len = 0; - for (int i = 0; i < code_attrs.length; i++) - attrs_len += (code_attrs[i].getLength() + 6); - - CodeException[] c_exc = getCodeExceptions(); - int exc_len = c_exc.length * 8; // Every entry takes 8 bytes - - Code code = null; - - if ((il != null) && !isAbstract() && !isNative()) { - // Remove any stale code attribute - Attribute[] attributes = getAttributes(); - for (int i = 0; i < attributes.length; i++) { - Attribute a = attributes[i]; - - if (a instanceof Code) - removeAttribute(a); - } - - code = - new Code( - cp.addUtf8("Code"), - 8 + byte_code.length + // prologue byte code - 2 + exc_len + // exceptions - 2 + attrs_len, // attributes - max_stack, max_locals, byte_code, c_exc, code_attrs, cp.getConstantPool()); - - addAttribute(code); - } - - ExceptionTable et = null; - - if (throws_vec.size() > 0) - addAttribute(et = getExceptionTable(cp)); - // Add `Exceptions' if there are "throws" clauses - - Method m = - new Method( - access_flags, - name_index, - signature_index, - getAttributes(), - cp.getConstantPool()); - - // Undo effects of adding attributes - if (lvt != null) - removeCodeAttribute(lvt); - if (lnt != null) - removeCodeAttribute(lnt); - if (code != null) - removeAttribute(code); - if (et != null) - removeAttribute(et); - - return m; - } - - /** - * Remove all NOPs from the instruction list (if possible) and update every - * object refering to them, i.e., branch instructions, local variables and - * exception handlers. - */ - public void removeNOPs() { - if (il != null) { - InstructionHandle next; - /* Check branch instructions. - */ - for (InstructionHandle ih = il.getStart(); ih != null; ih = next) { - next = ih.next; - - if ((next != null) && (ih.getInstruction() instanceof NOP)) { - try { - il.delete(ih); - } catch (TargetLostException e) { - InstructionHandle[] targets = e.getTargets(); - - for (int i = 0; i < targets.length; i++) { - InstructionTargeter[] targeters = targets[i].getTargeters(); - - for (int j = 0; j < targeters.length; j++) - targeters[j].updateTarget(targets[i], next); + public Method getMethod() { + String signature = getSignature(); + int name_index = cp.addUtf8(name); + int signature_index = cp.addUtf8(signature); + /* Also updates positions of instructions, i.e., their indices + */ + byte[] byte_code = null; + if (il != null) { + byte_code = il.getByteCode(); + } + LineNumberTable lnt = null; + LocalVariableTable lvt = null; + /* Create LocalVariableTable and LineNumberTable attributes (for debuggers, e.g.) + */ + if ((variable_vec.size() > 0) && !strip_attributes) { + addCodeAttribute(lvt = getLocalVariableTable(cp)); + } + if ((line_number_vec.size() > 0) && !strip_attributes) { + addCodeAttribute(lnt = getLineNumberTable(cp)); + } + Attribute[] code_attrs = getCodeAttributes(); + /* Each attribute causes 6 additional header bytes + */ + int attrs_len = 0; + for (int i = 0; i < code_attrs.length; i++) { + attrs_len += (code_attrs[i].getLength() + 6); + } + CodeException[] c_exc = getCodeExceptions(); + int exc_len = c_exc.length * 8; // Every entry takes 8 bytes + Code code = null; + if ((il != null) && !isAbstract() && !isNative()) { + // Remove any stale code attribute + Attribute[] attributes = getAttributes(); + for (int i = 0; i < attributes.length; i++) { + Attribute a = attributes[i]; + if (a instanceof Code) { + removeAttribute(a); + } } - } + code = new Code(cp.addUtf8("Code"), 8 + byte_code.length + // prologue byte code + 2 + exc_len + // exceptions + 2 + attrs_len, // attributes + max_stack, max_locals, byte_code, c_exc, code_attrs, cp.getConstantPool()); + addAttribute(code); + } + ExceptionTable et = null; + if (throws_vec.size() > 0) { + addAttribute(et = getExceptionTable(cp)); + // Add `Exceptions' if there are "throws" clauses + } + Method m = new Method(access_flags, name_index, signature_index, getAttributes(), cp + .getConstantPool()); + // Undo effects of adding attributes + if (lvt != null) { + removeCodeAttribute(lvt); + } + if (lnt != null) { + removeCodeAttribute(lnt); } - } - } - } - - /** - * Set maximum number of local variables. - */ - public void setMaxLocals(int m) { - max_locals = m; - } - public int getMaxLocals() { - return max_locals; - } - - /** - * Set maximum stack size for this method. - */ - public void setMaxStack(int m) { - max_stack = m; - } - public int getMaxStack() { - return max_stack; - } - - /** @return class that contains this method - */ - public String getClassName() { - return class_name; - } - public void setClassName(String class_name) { - this.class_name = class_name; - } - - public void setReturnType(Type return_type) { - setType(return_type); - } - public Type getReturnType() { - return getType(); - } - - public void setArgumentTypes(Type[] arg_types) { - this.arg_types = arg_types; - } - public Type[] getArgumentTypes() { - return (Type[])arg_types.clone(); - } - public void setArgumentType(int i, Type type) { - arg_types[i] = type; - } - public Type getArgumentType(int i) { - return arg_types[i]; - } - - public void setArgumentNames(String[] arg_names) { - this.arg_names = arg_names; - } - public String[] getArgumentNames() { - return (String[])arg_names.clone(); - } - public void setArgumentName(int i, String name) { - arg_names[i] = name; - } - public String getArgumentName(int i) { - return arg_names[i]; - } - - public InstructionList getInstructionList() { - return il; - } - public void setInstructionList(InstructionList il) { - this.il = il; - } - - public String getSignature() { - return Type.getMethodSignature(type, arg_types); - } - - /** - * Computes max. stack size by performing control flow analysis. - */ - public void setMaxStack() { - if (il != null) - max_stack = getMaxStack(cp, il, getExceptionHandlers()); - else - max_stack = 0; - } - - /** - * Compute maximum number of local variables. - */ - public void setMaxLocals() { - if (il != null) { - int max = isStatic() ? 0 : 1; - - if (arg_types != null) - for (int i = 0; i < arg_types.length; i++) - max += arg_types[i].getSize(); - - for (InstructionHandle ih = il.getStart(); - ih != null; - ih = ih.getNext()) { - Instruction ins = ih.getInstruction(); - - if ((ins instanceof LocalVariableInstruction) - || (ins instanceof RET) - || (ins instanceof IINC)) { - int index = - ((IndexedInstruction)ins).getIndex() - + ((TypedInstruction)ins).getType(cp).getSize(); - - if (index > max) - max = index; + if (code != null) { + removeAttribute(code); } - } + if (et != null) { + removeAttribute(et); + } + return m; + } - max_locals = max; - } else - max_locals = 0; - } - /** Do not/Do produce attributes code attributesLineNumberTable and - * LocalVariableTable, like javac -O - */ - public void stripAttributes(boolean flag) { - strip_attributes = flag; - } + /** + * Remove all NOPs from the instruction list (if possible) and update every + * object refering to them, i.e., branch instructions, local variables and + * exception handlers. + */ + public void removeNOPs() { + if (il != null) { + InstructionHandle next; + /* Check branch instructions. + */ + for (InstructionHandle ih = il.getStart(); ih != null; ih = next) { + next = ih.next; + if ((next != null) && (ih.getInstruction() instanceof NOP)) { + try { + il.delete(ih); + } catch (TargetLostException e) { + InstructionHandle[] targets = e.getTargets(); + for (int i = 0; i < targets.length; i++) { + InstructionTargeter[] targeters = targets[i].getTargeters(); + for (int j = 0; j < targeters.length; j++) { + targeters[j].updateTarget(targets[i], next); + } + } + } + } + } + } + } + + + /** + * Set maximum number of local variables. + */ + public void setMaxLocals( int m ) { + max_locals = m; + } + + + public int getMaxLocals() { + return max_locals; + } - static final class BranchTarget { - InstructionHandle target; - int stackDepth; - BranchTarget(InstructionHandle target, int stackDepth) { - this.target = target; - this.stackDepth = stackDepth; + /** + * Set maximum stack size for this method. + */ + public void setMaxStack( int m ) { + max_stack = m; } - } - static final class BranchStack { - Stack branchTargets = new Stack(); - Hashtable visitedTargets = new Hashtable(); - public void push(InstructionHandle target, int stackDepth) { - if (visited(target)) - return; + public int getMaxStack() { + return max_stack; + } + - branchTargets.push(visit(target, stackDepth)); + /** @return class that contains this method + */ + public String getClassName() { + return class_name; } - public BranchTarget pop() { - if (!branchTargets.empty()) { - BranchTarget bt = (BranchTarget)branchTargets.pop(); - return bt; - } - return null; + public void setClassName( String class_name ) { + this.class_name = class_name; } - private final BranchTarget visit( - InstructionHandle target, - int stackDepth) { - BranchTarget bt = new BranchTarget(target, stackDepth); - visitedTargets.put(target, bt); - return bt; + public void setReturnType( Type return_type ) { + setType(return_type); } - private final boolean visited(InstructionHandle target) { - return (visitedTargets.get(target) != null); + + public Type getReturnType() { + return getType(); + } + + + public void setArgumentTypes( Type[] arg_types ) { + this.arg_types = arg_types; + } + + + public Type[] getArgumentTypes() { + return (Type[]) arg_types.clone(); + } + + + public void setArgumentType( int i, Type type ) { + arg_types[i] = type; + } + + + public Type getArgumentType( int i ) { + return arg_types[i]; + } + + + public void setArgumentNames( String[] arg_names ) { + this.arg_names = arg_names; + } + + + public String[] getArgumentNames() { + return (String[]) arg_names.clone(); + } + + + public void setArgumentName( int i, String name ) { + arg_names[i] = name; } - } - /** - * Computes stack usage of an instruction list by performing control flow analysis. - * - * @return maximum stack depth used by method - */ - public static int getMaxStack( - ConstantPoolGen cp, - InstructionList il, - CodeExceptionGen[] et) { - BranchStack branchTargets = new BranchStack(); - /* Initially, populate the branch stack with the exception - * handlers, because these aren't (necessarily) branched to - * explicitly. in each case, the stack will have depth 1, - * containing the exception object. + public String getArgumentName( int i ) { + return arg_names[i]; + } + + + public InstructionList getInstructionList() { + return il; + } + + + public void setInstructionList( InstructionList il ) { + this.il = il; + } + + + public String getSignature() { + return Type.getMethodSignature(type, arg_types); + } + + + /** + * Computes max. stack size by performing control flow analysis. + */ + public void setMaxStack() { + if (il != null) { + max_stack = getMaxStack(cp, il, getExceptionHandlers()); + } else { + max_stack = 0; + } + } + + + /** + * Compute maximum number of local variables. */ - for (int i = 0; i < et.length; i++) { - InstructionHandle handler_pc = et[i].getHandlerPC(); - if (handler_pc != null) - branchTargets.push(handler_pc, 1); - } - - int stackDepth = 0, maxStackDepth = 0; - InstructionHandle ih = il.getStart(); - - while (ih != null) { - Instruction instruction = ih.getInstruction(); - short opcode = instruction.getOpcode(); - int delta = instruction.produceStack(cp) - instruction.consumeStack(cp); - - stackDepth += delta; - if (stackDepth > maxStackDepth) - maxStackDepth = stackDepth; - - // choose the next instruction based on whether current is a branch. - if (instruction instanceof BranchInstruction) { - BranchInstruction branch = (BranchInstruction)instruction; - if (instruction instanceof Select) { - // explore all of the select's targets. the default target is handled below. - Select select = (Select)branch; - InstructionHandle[] targets = select.getTargets(); - for (int i = 0; i < targets.length; i++) - branchTargets.push(targets[i], stackDepth); - // nothing to fall through to. - ih = null; - } else if (!(branch instanceof IfInstruction)) { - // if an instruction that comes back to following PC, - // push next instruction, with stack depth reduced by 1. - if (opcode == Constants.JSR || opcode == Constants.JSR_W) - branchTargets.push(ih.getNext(), stackDepth - 1); - ih = null; + public void setMaxLocals() { + if (il != null) { + int max = isStatic() ? 0 : 1; + if (arg_types != null) { + for (int i = 0; i < arg_types.length; i++) { + max += arg_types[i].getSize(); + } + } + for (InstructionHandle ih = il.getStart(); ih != null; ih = ih.getNext()) { + Instruction ins = ih.getInstruction(); + if ((ins instanceof LocalVariableInstruction) || (ins instanceof RET) + || (ins instanceof IINC)) { + int index = ((IndexedInstruction) ins).getIndex() + + ((TypedInstruction) ins).getType(cp).getSize(); + if (index > max) { + max = index; + } + } + } + max_locals = max; + } else { + max_locals = 0; } - // for all branches, the target of the branch is pushed on the branch stack. - // conditional branches have a fall through case, selects don't, and - // jsr/jsr_w return to the next instruction. - branchTargets.push(branch.getTarget(), stackDepth); - } else { - // check for instructions that terminate the method. - if (opcode == Constants.ATHROW - || opcode == Constants.RET - || (opcode >= Constants.IRETURN && opcode <= Constants.RETURN)) - ih = null; - } - // normal case, go to the next instruction. - if (ih != null) - ih = ih.getNext(); - // if we have no more instructions, see if there are any deferred branches to explore. - if (ih == null) { - BranchTarget bt = branchTargets.pop(); - if (bt != null) { - ih = bt.target; - stackDepth = bt.stackDepth; + } + + + /** Do not/Do produce attributes code attributesLineNumberTable and + * LocalVariableTable, like javac -O + */ + public void stripAttributes( boolean flag ) { + strip_attributes = flag; + } + + static final class BranchTarget { + + InstructionHandle target; + int stackDepth; + + + BranchTarget(InstructionHandle target, int stackDepth) { + this.target = target; + this.stackDepth = stackDepth; } - } - } - - return maxStackDepth; - } - - private List observers; - - /** Add observer for this object. - */ - public void addObserver(MethodObserver o) { - if (observers == null) - observers = new ArrayList(); - - observers.add(o); - } - - /** Remove observer for this object. - */ - public void removeObserver(MethodObserver o) { - if (observers != null) - observers.remove(o); - } - - /** Call notify() method on all observers. This method is not called - * automatically whenever the state has changed, but has to be - * called by the user after he has finished editing the object. - */ - public void update() { - if (observers != null) - for (Iterator e = observers.iterator(); e.hasNext();) - ((MethodObserver)e.next()).notify(this); - } - - /** - * Return string representation close to declaration format, - * `public static void main(String[]) throws IOException', e.g. - * - * @return String representation of the method. - */ - public final String toString() { - String access = Utility.accessToString(access_flags); - String signature = Type.getMethodSignature(type, arg_types); - - signature = - Utility.methodSignatureToString( - signature, - name, - access, - true, - getLocalVariableTable(cp)); - - StringBuffer buf = new StringBuffer(signature); - - if (throws_vec.size() > 0) { - for (Iterator e = throws_vec.iterator(); e.hasNext();) - buf.append("\n\t\tthrows ").append(e.next()); - } - - return buf.toString(); - } - - /** @return deep copy of this method - */ - public MethodGen copy(String class_name, ConstantPoolGen cp) { - Method m = ((MethodGen)clone()).getMethod(); - MethodGen mg = new MethodGen(m, class_name, this.cp); - - if (this.cp != cp) { - mg.setConstantPool(cp); - mg.getInstructionList().replaceConstantPool(this.cp, cp); - } - - return mg; - } - - /** - * @return Comparison strategy object - */ - public static BCELComparator getComparator() { - return _cmp; - } - - /** - * @param comparator Comparison strategy object - */ - public static void setComparator(BCELComparator comparator) { - _cmp = comparator; - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default two MethodGen objects are said to be equal when - * their names and signatures are equal. - * - * @see java.lang.Object#equals(java.lang.Object) - */ - public boolean equals(Object obj) { - return _cmp.equals(this, obj); - } - - /** - * Return value as defined by given BCELComparator strategy. - * By default return the hashcode of the method's name XOR signature. - * - * @see java.lang.Object#hashCode() - */ - public int hashCode() { - return _cmp.hashCode(this); - } + } + + static final class BranchStack { + + Stack branchTargets = new Stack(); + Hashtable visitedTargets = new Hashtable(); + + + public void push( InstructionHandle target, int stackDepth ) { + if (visited(target)) { + return; + } + branchTargets.push(visit(target, stackDepth)); + } + + + public BranchTarget pop() { + if (!branchTargets.empty()) { + BranchTarget bt = (BranchTarget) branchTargets.pop(); + return bt; + } + return null; + } + + + private final BranchTarget visit( InstructionHandle target, int stackDepth ) { + BranchTarget bt = new BranchTarget(target, stackDepth); + visitedTargets.put(target, bt); + return bt; + } + + + private final boolean visited( InstructionHandle target ) { + return (visitedTargets.get(target) != null); + } + } + + + /** + * Computes stack usage of an instruction list by performing control flow analysis. + * + * @return maximum stack depth used by method + */ + public static int getMaxStack( ConstantPoolGen cp, InstructionList il, CodeExceptionGen[] et ) { + BranchStack branchTargets = new BranchStack(); + /* Initially, populate the branch stack with the exception + * handlers, because these aren't (necessarily) branched to + * explicitly. in each case, the stack will have depth 1, + * containing the exception object. + */ + for (int i = 0; i < et.length; i++) { + InstructionHandle handler_pc = et[i].getHandlerPC(); + if (handler_pc != null) { + branchTargets.push(handler_pc, 1); + } + } + int stackDepth = 0, maxStackDepth = 0; + InstructionHandle ih = il.getStart(); + while (ih != null) { + Instruction instruction = ih.getInstruction(); + short opcode = instruction.getOpcode(); + int delta = instruction.produceStack(cp) - instruction.consumeStack(cp); + stackDepth += delta; + if (stackDepth > maxStackDepth) { + maxStackDepth = stackDepth; + } + // choose the next instruction based on whether current is a branch. + if (instruction instanceof BranchInstruction) { + BranchInstruction branch = (BranchInstruction) instruction; + if (instruction instanceof Select) { + // explore all of the select's targets. the default target is handled below. + Select select = (Select) branch; + InstructionHandle[] targets = select.getTargets(); + for (int i = 0; i < targets.length; i++) { + branchTargets.push(targets[i], stackDepth); + } + // nothing to fall through to. + ih = null; + } else if (!(branch instanceof IfInstruction)) { + // if an instruction that comes back to following PC, + // push next instruction, with stack depth reduced by 1. + if (opcode == Constants.JSR || opcode == Constants.JSR_W) { + branchTargets.push(ih.getNext(), stackDepth - 1); + } + ih = null; + } + // for all branches, the target of the branch is pushed on the branch stack. + // conditional branches have a fall through case, selects don't, and + // jsr/jsr_w return to the next instruction. + branchTargets.push(branch.getTarget(), stackDepth); + } else { + // check for instructions that terminate the method. + if (opcode == Constants.ATHROW || opcode == Constants.RET + || (opcode >= Constants.IRETURN && opcode <= Constants.RETURN)) { + ih = null; + } + } + // normal case, go to the next instruction. + if (ih != null) { + ih = ih.getNext(); + } + // if we have no more instructions, see if there are any deferred branches to explore. + if (ih == null) { + BranchTarget bt = branchTargets.pop(); + if (bt != null) { + ih = bt.target; + stackDepth = bt.stackDepth; + } + } + } + return maxStackDepth; + } + + private List observers; + + + /** Add observer for this object. + */ + public void addObserver( MethodObserver o ) { + if (observers == null) { + observers = new ArrayList(); + } + observers.add(o); + } + + + /** Remove observer for this object. + */ + public void removeObserver( MethodObserver o ) { + if (observers != null) { + observers.remove(o); + } + } + + + /** Call notify() method on all observers. This method is not called + * automatically whenever the state has changed, but has to be + * called by the user after he has finished editing the object. + */ + public void update() { + if (observers != null) { + for (Iterator e = observers.iterator(); e.hasNext();) { + ((MethodObserver) e.next()).notify(this); + } + } + } + + + /** + * Return string representation close to declaration format, + * `public static void main(String[]) throws IOException', e.g. + * + * @return String representation of the method. + */ + public final String toString() { + String access = Utility.accessToString(access_flags); + String signature = Type.getMethodSignature(type, arg_types); + signature = Utility.methodSignatureToString(signature, name, access, true, + getLocalVariableTable(cp)); + StringBuffer buf = new StringBuffer(signature); + if (throws_vec.size() > 0) { + for (Iterator e = throws_vec.iterator(); e.hasNext();) { + buf.append("\n\t\tthrows ").append(e.next()); + } + } + return buf.toString(); + } + + + /** @return deep copy of this method + */ + public MethodGen copy( String class_name, ConstantPoolGen cp ) { + Method m = ((MethodGen) clone()).getMethod(); + MethodGen mg = new MethodGen(m, class_name, this.cp); + if (this.cp != cp) { + mg.setConstantPool(cp); + mg.getInstructionList().replaceConstantPool(this.cp, cp); + } + return mg; + } + + + /** + * @return Comparison strategy object + */ + public static BCELComparator getComparator() { + return _cmp; + } + + + /** + * @param comparator Comparison strategy object + */ + public static void setComparator( BCELComparator comparator ) { + _cmp = comparator; + } + + + /** + * Return value as defined by given BCELComparator strategy. + * By default two MethodGen objects are said to be equal when + * their names and signatures are equal. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals( Object obj ) { + return _cmp.equals(this, obj); + } + + + /** + * Return value as defined by given BCELComparator strategy. + * By default return the hashcode of the method's name XOR signature. + * + * @see java.lang.Object#hashCode() + */ + public int hashCode() { + return _cmp.hashCode(this); + } } diff --git a/src/java/org/apache/bcel/generic/MethodObserver.java b/src/java/org/apache/bcel/generic/MethodObserver.java index a41d20e4..60f4947c 100644 --- a/src/java/org/apache/bcel/generic/MethodObserver.java +++ b/src/java/org/apache/bcel/generic/MethodObserver.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Implement this interface if you're interested in changes to a MethodGen object * and register yourself with addObserver(). @@ -25,6 +24,6 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface MethodObserver { - public void notify(MethodGen method); -} + public void notify( MethodGen method ); +} diff --git a/src/java/org/apache/bcel/generic/NEW.java b/src/java/org/apache/bcel/generic/NEW.java index 04835f21..02dd27c7 100644 --- a/src/java/org/apache/bcel/generic/NEW.java +++ b/src/java/org/apache/bcel/generic/NEW.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.ExceptionConstants; @@ -25,49 +25,52 @@ import org.apache.bcel.ExceptionConstants; * @version $Id$ * @author M. Dahm */ -public class NEW extends CPInstruction - implements LoadClass, AllocationInstruction, ExceptionThrower, StackProducer { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - NEW() {} +public class NEW extends CPInstruction implements LoadClass, AllocationInstruction, + ExceptionThrower, StackProducer { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + NEW() { + } + - public NEW(int index) { - super(org.apache.bcel.Constants.NEW, index); - } + public NEW(int index) { + super(org.apache.bcel.Constants.NEW, index); + } - public Class[] getExceptions(){ - Class[] cs = new Class[2 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, - cs, 0, ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); + public Class[] getExceptions() { + Class[] cs = new Class[2 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); + cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length + 1] = ExceptionConstants.INSTANTIATION_ERROR; + cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; + return cs; + } - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length+1] = ExceptionConstants.INSTANTIATION_ERROR; - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; - return cs; - } + public ObjectType getLoadClassType( ConstantPoolGen cpg ) { + return (ObjectType) getType(cpg); + } - public ObjectType getLoadClassType(ConstantPoolGen cpg) { - return (ObjectType)getType(cpg); - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitLoadClass(this); - v.visitAllocationInstruction(this); - v.visitExceptionThrower(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitCPInstruction(this); - v.visitNEW(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitLoadClass(this); + v.visitAllocationInstruction(this); + v.visitExceptionThrower(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitCPInstruction(this); + v.visitNEW(this); + } } diff --git a/src/java/org/apache/bcel/generic/NEWARRAY.java b/src/java/org/apache/bcel/generic/NEWARRAY.java index c853ebde..3b0808ef 100644 --- a/src/java/org/apache/bcel/generic/NEWARRAY.java +++ b/src/java/org/apache/bcel/generic/NEWARRAY.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -28,77 +28,93 @@ import org.apache.bcel.util.ByteSequence; * @version $Id$ * @author M. Dahm */ -public class NEWARRAY extends Instruction - implements AllocationInstruction, ExceptionThrower, StackProducer { - private byte type; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - NEWARRAY() {} - - public NEWARRAY(byte type) { - super(org.apache.bcel.Constants.NEWARRAY, (short)2); - this.type = type; - } - - public NEWARRAY(BasicType type) { - this(type.getType()); - } - - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - out.writeByte(type); - } - - /** - * @return numeric code for basic element type - */ - public final byte getTypecode() { return type; } - - /** - * @return type of constructed array - */ - public final Type getType() { - return new ArrayType(BasicType.getType(type), 1); - } - - /** - * @return mnemonic for instruction - */ - public String toString(boolean verbose) { - return super.toString(verbose) + " " + org.apache.bcel.Constants.TYPE_NAMES[type]; - } - /** - * Read needed data (e.g. index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException - { - type = bytes.readByte(); - length = 2; - } - - public Class[] getExceptions() { - return new Class[] { org.apache.bcel.ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION }; - } - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitAllocationInstruction(this); - v.visitExceptionThrower(this); - v.visitStackProducer(this); - v.visitNEWARRAY(this); - } +public class NEWARRAY extends Instruction implements AllocationInstruction, ExceptionThrower, + StackProducer { + + private byte type; + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + NEWARRAY() { + } + + + public NEWARRAY(byte type) { + super(org.apache.bcel.Constants.NEWARRAY, (short) 2); + this.type = type; + } + + + public NEWARRAY(BasicType type) { + this(type.getType()); + } + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + out.writeByte(opcode); + out.writeByte(type); + } + + + /** + * @return numeric code for basic element type + */ + public final byte getTypecode() { + return type; + } + + + /** + * @return type of constructed array + */ + public final Type getType() { + return new ArrayType(BasicType.getType(type), 1); + } + + + /** + * @return mnemonic for instruction + */ + public String toString( boolean verbose ) { + return super.toString(verbose) + " " + org.apache.bcel.Constants.TYPE_NAMES[type]; + } + + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + type = bytes.readByte(); + length = 2; + } + + + public Class[] getExceptions() { + return new Class[] { + org.apache.bcel.ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION + }; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitAllocationInstruction(this); + v.visitExceptionThrower(this); + v.visitStackProducer(this); + v.visitNEWARRAY(this); + } } diff --git a/src/java/org/apache/bcel/generic/NOP.java b/src/java/org/apache/bcel/generic/NOP.java index 1dba3ec4..17bd47f8 100644 --- a/src/java/org/apache/bcel/generic/NOP.java +++ b/src/java/org/apache/bcel/generic/NOP.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * NOP - Do nothing * @@ -24,20 +23,21 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class NOP extends Instruction { - public NOP() { - super(org.apache.bcel.Constants.NOP, (short)1); - } + + public NOP() { + super(org.apache.bcel.Constants.NOP, (short) 1); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitNOP(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitNOP(this); + } } diff --git a/src/java/org/apache/bcel/generic/NamedAndTyped.java b/src/java/org/apache/bcel/generic/NamedAndTyped.java index f52cca0f..8dc91b4f 100644 --- a/src/java/org/apache/bcel/generic/NamedAndTyped.java +++ b/src/java/org/apache/bcel/generic/NamedAndTyped.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denote entity that has both name and type. This is true for local variables, * methods and fields. @@ -25,10 +24,15 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface NamedAndTyped { - public String getName(); - public Type getType(); - public void setName(String name); - public void setType(Type type); -} + public String getName(); + + + public Type getType(); + + public void setName( String name ); + + + public void setType( Type type ); +} diff --git a/src/java/org/apache/bcel/generic/ObjectType.java b/src/java/org/apache/bcel/generic/ObjectType.java index 0be4c709..24ca3138 100644 --- a/src/java/org/apache/bcel/generic/ObjectType.java +++ b/src/java/org/apache/bcel/generic/ObjectType.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.Constants; @@ -27,116 +27,129 @@ import org.apache.bcel.classfile.JavaClass; * @author M. Dahm */ public class ObjectType extends ReferenceType { - private String class_name; // Class name of type - - /** - * @param class_name fully qualified class name, e.g. java.lang.String - */ - public ObjectType(String class_name) { - super(Constants.T_REFERENCE, "L" + class_name.replace('.', '/') + ";"); - this.class_name = class_name.replace('/', '.'); - } - - /** @return name of referenced class - */ - public String getClassName() { return class_name; } - - /** @return a hash code value for the object. - */ - public int hashCode() { return class_name.hashCode(); } - - /** @return true if both type objects refer to the same class. - */ - public boolean equals(Object type) { - return (type instanceof ObjectType)? - ((ObjectType)type).class_name.equals(class_name) : false; - } - - /** - * If "this" doesn't reference a class, it references an interface - * or a non-existant entity. - * @deprecated this method returns an inaccurate result - * if the class or interface referenced cannot - * be found: use referencesClassExact() instead - */ - public boolean referencesClass() { - try { - JavaClass jc = Repository.lookupClass(class_name); - return jc.isClass(); - } catch (ClassNotFoundException e) { - return false; + + private String class_name; // Class name of type + + + /** + * @param class_name fully qualified class name, e.g. java.lang.String + */ + public ObjectType(String class_name) { + super(Constants.T_REFERENCE, "L" + class_name.replace('.', '/') + ";"); + this.class_name = class_name.replace('/', '.'); } - } - - /** - * If "this" doesn't reference an interface, it references a class - * or a non-existant entity. - * @deprecated this method returns an inaccurate result - * if the class or interface referenced cannot - * be found: use referencesInterfaceExact() instead - */ - public boolean referencesInterface(){ - try { - JavaClass jc = Repository.lookupClass(class_name); - return !jc.isClass(); - } catch (ClassNotFoundException e) { - return false; + + + /** @return name of referenced class + */ + public String getClassName() { + return class_name; + } + + + /** @return a hash code value for the object. + */ + public int hashCode() { + return class_name.hashCode(); + } + + + /** @return true if both type objects refer to the same class. + */ + public boolean equals( Object type ) { + return (type instanceof ObjectType) + ? ((ObjectType) type).class_name.equals(class_name) + : false; + } + + + /** + * If "this" doesn't reference a class, it references an interface + * or a non-existant entity. + * @deprecated this method returns an inaccurate result + * if the class or interface referenced cannot + * be found: use referencesClassExact() instead + */ + public boolean referencesClass() { + try { + JavaClass jc = Repository.lookupClass(class_name); + return jc.isClass(); + } catch (ClassNotFoundException e) { + return false; + } } - } - - /** - * Return true if this type references a class, - * false if it references an interface. - * @return true if the type references a class, false if - * it references an interface - * @throws ClassNotFoundException if the class or interface - * referenced by this type can't be found - */ - public boolean referencesClassExact() throws ClassNotFoundException { - JavaClass jc = Repository.lookupClass(class_name); - return jc.isClass(); - } - - /** - * Return true if this type references an interface, - * false if it references a class. - * @return true if the type references an interface, false if - * it references a class - * @throws ClassNotFoundException if the class or interface - * referenced by this type can't be found - */ - public boolean referencesInterfaceExact() throws ClassNotFoundException { - JavaClass jc = Repository.lookupClass(class_name); - return !jc.isClass(); - } - - /** - * Return true if this type is a subclass of given ObjectType. - * @throws ClassNotFoundException if any of this class's superclasses - * can't be found - */ - public boolean subclassOf(ObjectType superclass) - throws ClassNotFoundException { - - if (this.referencesInterface() || superclass.referencesInterface()) - return false; - - return Repository.instanceOf(this.class_name, superclass.class_name); - } - - /** - * Java Virtual Machine Specification edition 2, § 5.4.4 Access Control - * @throws ClassNotFoundException if the class referenced by this type - * can't be found - */ - public boolean accessibleTo(ObjectType accessor) throws ClassNotFoundException { - JavaClass jc = Repository.lookupClass(class_name); - - if(jc.isPublic()) { - return true; - } else { - JavaClass acc = Repository.lookupClass(accessor.class_name); - return acc.getPackageName().equals(jc.getPackageName()); + + + /** + * If "this" doesn't reference an interface, it references a class + * or a non-existant entity. + * @deprecated this method returns an inaccurate result + * if the class or interface referenced cannot + * be found: use referencesInterfaceExact() instead + */ + public boolean referencesInterface() { + try { + JavaClass jc = Repository.lookupClass(class_name); + return !jc.isClass(); + } catch (ClassNotFoundException e) { + return false; + } + } + + + /** + * Return true if this type references a class, + * false if it references an interface. + * @return true if the type references a class, false if + * it references an interface + * @throws ClassNotFoundException if the class or interface + * referenced by this type can't be found + */ + public boolean referencesClassExact() throws ClassNotFoundException { + JavaClass jc = Repository.lookupClass(class_name); + return jc.isClass(); + } + + + /** + * Return true if this type references an interface, + * false if it references a class. + * @return true if the type references an interface, false if + * it references a class + * @throws ClassNotFoundException if the class or interface + * referenced by this type can't be found + */ + public boolean referencesInterfaceExact() throws ClassNotFoundException { + JavaClass jc = Repository.lookupClass(class_name); + return !jc.isClass(); + } + + + /** + * Return true if this type is a subclass of given ObjectType. + * @throws ClassNotFoundException if any of this class's superclasses + * can't be found + */ + public boolean subclassOf( ObjectType superclass ) throws ClassNotFoundException { + if (this.referencesInterface() || superclass.referencesInterface()) { + return false; + } + return Repository.instanceOf(this.class_name, superclass.class_name); + } + + + /** + * Java Virtual Machine Specification edition 2, § 5.4.4 Access Control + * @throws ClassNotFoundException if the class referenced by this type + * can't be found + */ + public boolean accessibleTo( ObjectType accessor ) throws ClassNotFoundException { + JavaClass jc = Repository.lookupClass(class_name); + if (jc.isPublic()) { + return true; + } else { + JavaClass acc = Repository.lookupClass(accessor.class_name); + return acc.getPackageName().equals(jc.getPackageName()); + } } - } } diff --git a/src/java/org/apache/bcel/generic/POP.java b/src/java/org/apache/bcel/generic/POP.java index ea446c7a..3a2c6a38 100644 --- a/src/java/org/apache/bcel/generic/POP.java +++ b/src/java/org/apache/bcel/generic/POP.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * POP - Pop top operand stack word * @@ -26,23 +25,24 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class POP extends StackInstruction implements PopInstruction { - public POP() { - super(org.apache.bcel.Constants.POP); - } + + public POP() { + super(org.apache.bcel.Constants.POP); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitPopInstruction(this); - v.visitStackInstruction(this); - v.visitPOP(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitPopInstruction(this); + v.visitStackInstruction(this); + v.visitPOP(this); + } } diff --git a/src/java/org/apache/bcel/generic/POP2.java b/src/java/org/apache/bcel/generic/POP2.java index cd6c9c83..3ee18f7e 100644 --- a/src/java/org/apache/bcel/generic/POP2.java +++ b/src/java/org/apache/bcel/generic/POP2.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * POP2 - Pop two top operand stack words * @@ -26,23 +25,24 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class POP2 extends StackInstruction implements PopInstruction { - public POP2() { - super(org.apache.bcel.Constants.POP2); - } + + public POP2() { + super(org.apache.bcel.Constants.POP2); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitPopInstruction(this); - v.visitStackInstruction(this); - v.visitPOP2(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitPopInstruction(this); + v.visitStackInstruction(this); + v.visitPOP2(this); + } } diff --git a/src/java/org/apache/bcel/generic/PUSH.java b/src/java/org/apache/bcel/generic/PUSH.java index 25c7944c..e42dc9b0 100644 --- a/src/java/org/apache/bcel/generic/PUSH.java +++ b/src/java/org/apache/bcel/generic/PUSH.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.Constants; @@ -25,137 +25,154 @@ import org.apache.bcel.Constants; * @version $Id$ * @author M. Dahm */ -public final class PUSH - implements CompoundInstruction, VariableLengthInstruction, InstructionConstants -{ - private Instruction instruction; - - /** - * This constructor also applies for values of type short, char, byte - * - * @param cp Constant pool - * @param value to be pushed - */ - public PUSH(ConstantPoolGen cp, int value) { - if((value >= -1) && (value <= 5)) // Use ICONST_n - instruction = INSTRUCTIONS[Constants.ICONST_0 + value]; - else if((value >= -128) && (value <= 127)) // Use BIPUSH - instruction = new BIPUSH((byte)value); - else if((value >= -32768) && (value <= 32767)) // Use SIPUSH - instruction = new SIPUSH((short)value); - else // If everything fails create a Constant pool entry - instruction = new LDC(cp.addInteger(value)); - } - - /** - * @param cp Constant pool - * @param value to be pushed - */ - public PUSH(ConstantPoolGen cp, boolean value) { - instruction = INSTRUCTIONS[Constants.ICONST_0 + (value? 1 : 0)]; - } - - /** - * @param cp Constant pool - * @param value to be pushed - */ - public PUSH(ConstantPoolGen cp, float value) { - if(value == 0.0) - instruction = FCONST_0; - else if(value == 1.0) - instruction = FCONST_1; - else if(value == 2.0) - instruction = FCONST_2; - else // Create a Constant pool entry - instruction = new LDC(cp.addFloat(value)); - } - - /** - * @param cp Constant pool - * @param value to be pushed - */ - public PUSH(ConstantPoolGen cp, long value) { - if(value == 0) - instruction = LCONST_0; - else if(value == 1) - instruction = LCONST_1; - else // Create a Constant pool entry - instruction = new LDC2_W(cp.addLong(value)); - } - - /** - * @param cp Constant pool - * @param value to be pushed - */ - public PUSH(ConstantPoolGen cp, double value) { - if(value == 0.0) - instruction = DCONST_0; - else if(value == 1.0) - instruction = DCONST_1; - else // Create a Constant pool entry - instruction = new LDC2_W(cp.addDouble(value)); - } - - /** - * @param cp Constant pool - * @param value to be pushed - */ - public PUSH(ConstantPoolGen cp, String value) { - if(value == null) - instruction = ACONST_NULL; - else // Create a Constant pool entry - instruction = new LDC(cp.addString(value)); - } - - /** - * @param cp Constant pool - * @param value to be pushed - */ - public PUSH(ConstantPoolGen cp, Number value) { - if((value instanceof Integer) || (value instanceof Short) || (value instanceof Byte)) - instruction = new PUSH(cp, value.intValue()).instruction; - else if(value instanceof Double) - instruction = new PUSH(cp, value.doubleValue()).instruction; - else if(value instanceof Float) - instruction = new PUSH(cp, value.floatValue()).instruction; - else if(value instanceof Long) - instruction = new PUSH(cp, value.longValue()).instruction; - else - throw new ClassGenException("What's this: " + value); - } - - /** - * creates a push object from a Character value. Warning: Make sure not to attempt to allow - * autoboxing to create this value parameter, as an alternative constructor will be called - * - * @param cp Constant pool - * @param value to be pushed - */ - public PUSH(ConstantPoolGen cp, Character value) { - this(cp, (int)value.charValue()); - } - - /** - * @param cp Constant pool - * @param value to be pushed - */ - public PUSH(ConstantPoolGen cp, Boolean value) { - this(cp, value.booleanValue()); - } - - public final InstructionList getInstructionList() { - return new InstructionList(instruction); - } - - public final Instruction getInstruction() { - return instruction; - } - - /** - * @return mnemonic for instruction - */ - public String toString() { - return instruction.toString() + " (PUSH)"; - } -} +public final class PUSH implements CompoundInstruction, VariableLengthInstruction, + InstructionConstants { + + private Instruction instruction; + + + /** + * This constructor also applies for values of type short, char, byte + * + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, int value) { + if ((value >= -1) && (value <= 5)) { + instruction = INSTRUCTIONS[Constants.ICONST_0 + value]; + } else if ((value >= -128) && (value <= 127)) { + instruction = new BIPUSH((byte) value); + } else if ((value >= -32768) && (value <= 32767)) { + instruction = new SIPUSH((short) value); + } else { + instruction = new LDC(cp.addInteger(value)); + } + } + + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, boolean value) { + instruction = INSTRUCTIONS[Constants.ICONST_0 + (value ? 1 : 0)]; + } + + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, float value) { + if (value == 0.0) { + instruction = FCONST_0; + } else if (value == 1.0) { + instruction = FCONST_1; + } else if (value == 2.0) { + instruction = FCONST_2; + } else { + instruction = new LDC(cp.addFloat(value)); + } + } + + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, long value) { + if (value == 0) { + instruction = LCONST_0; + } else if (value == 1) { + instruction = LCONST_1; + } else { + instruction = new LDC2_W(cp.addLong(value)); + } + } + + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, double value) { + if (value == 0.0) { + instruction = DCONST_0; + } else if (value == 1.0) { + instruction = DCONST_1; + } else { + instruction = new LDC2_W(cp.addDouble(value)); + } + } + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, String value) { + if (value == null) { + instruction = ACONST_NULL; + } else { + instruction = new LDC(cp.addString(value)); + } + } + + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, Number value) { + if ((value instanceof Integer) || (value instanceof Short) || (value instanceof Byte)) { + instruction = new PUSH(cp, value.intValue()).instruction; + } else if (value instanceof Double) { + instruction = new PUSH(cp, value.doubleValue()).instruction; + } else if (value instanceof Float) { + instruction = new PUSH(cp, value.floatValue()).instruction; + } else if (value instanceof Long) { + instruction = new PUSH(cp, value.longValue()).instruction; + } else { + throw new ClassGenException("What's this: " + value); + } + } + + + /** + * creates a push object from a Character value. Warning: Make sure not to attempt to allow + * autoboxing to create this value parameter, as an alternative constructor will be called + * + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, Character value) { + this(cp, value.charValue()); + } + + + /** + * @param cp Constant pool + * @param value to be pushed + */ + public PUSH(ConstantPoolGen cp, Boolean value) { + this(cp, value.booleanValue()); + } + + + public final InstructionList getInstructionList() { + return new InstructionList(instruction); + } + + + public final Instruction getInstruction() { + return instruction; + } + + + /** + * @return mnemonic for instruction + */ + public String toString() { + return instruction.toString() + " (PUSH)"; + } +} diff --git a/src/java/org/apache/bcel/generic/PUTFIELD.java b/src/java/org/apache/bcel/generic/PUTFIELD.java index 6b557fe1..2e8da0c1 100644 --- a/src/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/java/org/apache/bcel/generic/PUTFIELD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import org.apache.bcel.Constants; import org.apache.bcel.ExceptionConstants; @@ -29,53 +28,53 @@ import org.apache.bcel.ExceptionConstants; * @version $Id$ * @author M. Dahm */ -public class PUTFIELD - extends FieldInstruction - implements PopInstruction,ExceptionThrower{ - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - PUTFIELD() {} +public class PUTFIELD extends FieldInstruction implements PopInstruction, ExceptionThrower { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + PUTFIELD() { + } - public PUTFIELD(int index) { - super(Constants.PUTFIELD, index); - } - public int consumeStack(ConstantPoolGen cpg) { return getFieldSize(cpg) + 1; } + public PUTFIELD(int index) { + super(Constants.PUTFIELD, index); + } - public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, - cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + public int consumeStack( ConstantPoolGen cpg ) { + return getFieldSize(cpg) + 1; + } - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length+1] = - ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = - ExceptionConstants.NULL_POINTER_EXCEPTION; - return cs; - } + public Class[] getExceptions() { + Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; + return cs; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitStackConsumer(this); - v.visitPopInstruction(this); - v.visitTypedInstruction(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitFieldInstruction(this); - v.visitPUTFIELD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitStackConsumer(this); + v.visitPopInstruction(this); + v.visitTypedInstruction(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitFieldInstruction(this); + v.visitPUTFIELD(this); + } } diff --git a/src/java/org/apache/bcel/generic/PUTSTATIC.java b/src/java/org/apache/bcel/generic/PUTSTATIC.java index f327f15a..c152bf5f 100644 --- a/src/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/java/org/apache/bcel/generic/PUTSTATIC.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import org.apache.bcel.Constants; import org.apache.bcel.ExceptionConstants; @@ -29,49 +28,52 @@ import org.apache.bcel.ExceptionConstants; * @version $Id$ * @author M. Dahm */ -public class PUTSTATIC extends FieldInstruction - implements ExceptionThrower, PopInstruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - PUTSTATIC() {} +public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, PopInstruction { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + PUTSTATIC() { + } + - public PUTSTATIC(int index) { - super(Constants.PUTSTATIC, index); - } + public PUTSTATIC(int index) { + super(Constants.PUTSTATIC, index); + } - public int consumeStack(ConstantPoolGen cpg) { return getFieldSize(cpg); } - public Class[] getExceptions() { - Class[] cs = new Class[1 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + public int consumeStack( ConstantPoolGen cpg ) { + return getFieldSize(cpg); + } - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, - cs, 0, ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = - ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - return cs; - } + public Class[] getExceptions() { + Class[] cs = new Class[1 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); + cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + return cs; + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitStackConsumer(this); - v.visitPopInstruction(this); - v.visitTypedInstruction(this); - v.visitLoadClass(this); - v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - v.visitFieldInstruction(this); - v.visitPUTSTATIC(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitStackConsumer(this); + v.visitPopInstruction(this); + v.visitTypedInstruction(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + v.visitFieldInstruction(this); + v.visitPUTSTATIC(this); + } } diff --git a/src/java/org/apache/bcel/generic/PopInstruction.java b/src/java/org/apache/bcel/generic/PopInstruction.java index f58f95fe..4e88e3fd 100644 --- a/src/java/org/apache/bcel/generic/PopInstruction.java +++ b/src/java/org/apache/bcel/generic/PopInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denotes an unparameterized instruction to pop a value on top from the stack, * such as ISTORE, POP, PUTSTATIC. @@ -28,4 +27,3 @@ package org.apache.bcel.generic; */ public interface PopInstruction extends StackConsumer { } - diff --git a/src/java/org/apache/bcel/generic/PushInstruction.java b/src/java/org/apache/bcel/generic/PushInstruction.java index 90a52023..d5d4eea8 100644 --- a/src/java/org/apache/bcel/generic/PushInstruction.java +++ b/src/java/org/apache/bcel/generic/PushInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denotes an unparameterized instruction to produce a value on top of the stack, * such as ILOAD, LDC, SIPUSH, DUP, ICONST, etc. @@ -33,4 +32,3 @@ package org.apache.bcel.generic; */ public interface PushInstruction extends StackProducer { } - diff --git a/src/java/org/apache/bcel/generic/RET.java b/src/java/org/apache/bcel/generic/RET.java index 2e4b715e..50e47090 100644 --- a/src/java/org/apache/bcel/generic/RET.java +++ b/src/java/org/apache/bcel/generic/RET.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -29,99 +29,111 @@ import org.apache.bcel.util.ByteSequence; * @author M. Dahm */ public class RET extends Instruction implements IndexedInstruction, TypedInstruction { - private boolean wide; - private int index; // index to local variable containg the return address - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - RET() {} - - public RET(int index) { - super(org.apache.bcel.Constants.RET, (short)2); - setIndex(index); // May set wide as side effect - } - - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - if(wide) - out.writeByte(org.apache.bcel.Constants.WIDE); - - out.writeByte(opcode); - - if(wide) - out.writeShort(index); - else - out.writeByte(index); - } - - private final void setWide() { - wide = index > org.apache.bcel.Constants.MAX_BYTE; - if(wide) { - length = 4; // Including the wide byte - } else { - length = 2; + + private boolean wide; + private int index; // index to local variable containg the return address + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + RET() { + } + + + public RET(int index) { + super(org.apache.bcel.Constants.RET, (short) 2); + setIndex(index); // May set wide as side effect + } + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + if (wide) { + out.writeByte(org.apache.bcel.Constants.WIDE); + } + out.writeByte(opcode); + if (wide) { + out.writeShort(index); + } else { + out.writeByte(index); + } + } + + + private final void setWide() { + wide = index > org.apache.bcel.Constants.MAX_BYTE; + if (wide) { + length = 4; // Including the wide byte + } else { + length = 2; + } + } + + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + this.wide = wide; + if (wide) { + index = bytes.readUnsignedShort(); + length = 4; + } else { + index = bytes.readUnsignedByte(); + length = 2; + } + } + + + /** + * @return index of local variable containg the return address + */ + public final int getIndex() { + return index; } - } - - /** - * Read needed data (e.g. index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException - { - this.wide = wide; - - if(wide) { - index = bytes.readUnsignedShort(); - length = 4; - } else { - index = bytes.readUnsignedByte(); - length = 2; + + + /** + * Set index of local variable containg the return address + */ + public final void setIndex( int n ) { + if (n < 0) { + throw new ClassGenException("Negative index value: " + n); + } + index = n; + setWide(); + } + + + /** + * @return mnemonic for instruction + */ + public String toString( boolean verbose ) { + return super.toString(verbose) + " " + index; + } + + + /** @return return address type + */ + public Type getType( ConstantPoolGen cp ) { + return ReturnaddressType.NO_TARGET; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitRET(this); } - } - - /** - * @return index of local variable containg the return address - */ - public final int getIndex() { return index; } - - /** - * Set index of local variable containg the return address - */ - public final void setIndex(int n) { - if(n < 0) - throw new ClassGenException("Negative index value: " + n); - - index = n; - setWide(); - } - - /** - * @return mnemonic for instruction - */ - public String toString(boolean verbose) { - return super.toString(verbose) + " " + index; - } - - /** @return return address type - */ - public Type getType(ConstantPoolGen cp) { - return ReturnaddressType.NO_TARGET; - } - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitRET(this); - } } diff --git a/src/java/org/apache/bcel/generic/RETURN.java b/src/java/org/apache/bcel/generic/RETURN.java index e0f6290d..f46e999d 100644 --- a/src/java/org/apache/bcel/generic/RETURN.java +++ b/src/java/org/apache/bcel/generic/RETURN.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * RETURN - Return from void method *
            Stack: ... -> <empty>
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class RETURN extends ReturnInstruction { - public RETURN() { - super(org.apache.bcel.Constants.RETURN); - } + + public RETURN() { + super(org.apache.bcel.Constants.RETURN); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitStackConsumer(this); - v.visitReturnInstruction(this); - v.visitRETURN(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitReturnInstruction(this); + v.visitRETURN(this); + } } diff --git a/src/java/org/apache/bcel/generic/ReferenceType.java b/src/java/org/apache/bcel/generic/ReferenceType.java index 854be12b..b024dda6 100644 --- a/src/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/java/org/apache/bcel/generic/ReferenceType.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; @@ -28,301 +27,304 @@ import org.apache.bcel.classfile.JavaClass; * @author M. Dahm */ public abstract class ReferenceType extends Type { - protected ReferenceType(byte t, String s) { - super(t, s); - } - - /** Class is non-abstract but not instantiable from the outside - */ - ReferenceType() { - super(Constants.T_OBJECT, ""); - } - - /** - * Return true iff this type is castable to another type t as defined in - * the JVM specification. The case where this is Type.NULL is not - * defined (see the CHECKCAST definition in the JVM specification). - * However, because e.g. CHECKCAST doesn't throw a - * ClassCastException when casting a null reference to any Object, - * true is returned in this case. - * - * @throws ClassNotFoundException if any classes or interfaces required - * to determine assignment compatibility can't be found - */ - public boolean isCastableTo(Type t) throws ClassNotFoundException { - if (this.equals(Type.NULL)) - return true; // If this is ever changed in isAssignmentCompatible() - - return isAssignmentCompatibleWith(t); - /* Yes, it's true: It's the same definition. - * See vmspec2 AASTORE / CHECKCAST definitions. - */ - } - - /** - * Return true iff this is assignment compatible with another type t - * as defined in the JVM specification; see the AASTORE definition - * there. - * @throws ClassNotFoundException if any classes or interfaces required - * to determine assignment compatibility can't be found - */ - public boolean isAssignmentCompatibleWith(Type t) - throws ClassNotFoundException { - - if (!(t instanceof ReferenceType)) - return false; - - ReferenceType T = (ReferenceType) t; - - if (this.equals(Type.NULL)) - return true; // This is not explicitely stated, but clear. Isn't it? - /* If this is a class type then - */ - if ((this instanceof ObjectType) && (((ObjectType) this).referencesClassExact())) { - /* If T is a class type, then this must be the same class as T, - or this must be a subclass of T; - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesClassExact())) { - if (this.equals(T)) - return true; - - if (Repository.instanceOf(((ObjectType) this).getClassName(), - ((ObjectType) T).getClassName())) - return true; - } - - /* If T is an interface type, this must implement interface T. - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact())) { - if (Repository.implementationOf(((ObjectType) this).getClassName(), - ((ObjectType) T).getClassName())) - return true; - } + protected ReferenceType(byte t, String s) { + super(t, s); } - /* If this is an interface type, then: - */ - if ((this instanceof ObjectType) && (((ObjectType) this).referencesInterfaceExact())) { - /* If T is a class type, then T must be Object (§2.4.7). - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesClassExact())) { - if (T.equals(Type.OBJECT)) return true; - } - /* If T is an interface type, then T must be the same interface - * as this or a superinterface of this (§2.13.2). - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact())) { - if (this.equals(T)) return true; - if (Repository.implementationOf(((ObjectType) this).getClassName(), - ((ObjectType) T).getClassName())) - return true; - } - } - - /* If this is an array type, namely, the type SC[], that is, an - * array of components of type SC, then: + /** Class is non-abstract but not instantiable from the outside */ - if (this instanceof ArrayType) { - /* If T is a class type, then T must be Object (§2.4.7). - */ - if ((T instanceof ObjectType) && (((ObjectType) T).referencesClassExact())) { - if (T.equals(Type.OBJECT)) return true; - } - - /* If T is an array type TC[], that is, an array of components - * of type TC, then one of the following must be true: - */ - if (T instanceof ArrayType) { - /* TC and SC are the same primitive type (§2.4.1). - */ - Type sc = ((ArrayType) this).getElementType(); - Type tc = ((ArrayType) T).getElementType(); - - if (sc instanceof BasicType && tc instanceof BasicType && sc.equals(tc)) - return true; - - /* TC and SC are reference types (§2.4.6), and type SC is - * assignable to TC by these runtime rules. - */ - if (tc instanceof ReferenceType && sc instanceof ReferenceType && - ((ReferenceType) sc).isAssignmentCompatibleWith((ReferenceType) tc)) - return true; - } - - /* If T is an interface type, T must be one of the interfaces implemented by arrays (§2.15). */ - // TODO: Check if this is still valid or find a way to dynamically find out which - // interfaces arrays implement. However, as of the JVM specification edition 2, there - // are at least two different pages where assignment compatibility is defined and - // on one of them "interfaces implemented by arrays" is exchanged with "'Cloneable' or - // 'java.io.Serializable'" - if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact())) { - for (int ii = 0; ii < Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS.length; ii++) { - if (T.equals(new ObjectType(Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS[ii]))) return true; - } - } + ReferenceType() { + super(Constants.T_OBJECT, ""); } - return false; // default. - } - /** - * This commutative operation returns the first common superclass (narrowest ReferenceType - * referencing a class, not an interface). - * If one of the types is a superclass of the other, the former is returned. - * If "this" is Type.NULL, then t is returned. - * If t is Type.NULL, then "this" is returned. - * If "this" equals t ['this.equals(t)'] "this" is returned. - * If "this" or t is an ArrayType, then Type.OBJECT is returned; - * unless their dimensions match. Then an ArrayType of the same - * number of dimensions is returned, with its basic type being the - * first common super class of the basic types of "this" and t. - * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. - * If not all of the two classes' superclasses cannot be found, "null" is returned. - * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". - * - * @throws ClassNotFoundException on failure to find superclasses of this - * type, or the type passed as a parameter - */ - public ReferenceType getFirstCommonSuperclass(ReferenceType t) - throws ClassNotFoundException { - if (this.equals(Type.NULL)) return t; - if (t.equals(Type.NULL)) return this; - if (this.equals(t)) return this; - /* - * TODO: Above sounds a little arbitrary. On the other hand, there is - * no object referenced by Type.NULL so we can also say all the objects - * referenced by Type.NULL were derived from java.lang.Object. - * However, the Java Language's "instanceof" operator proves us wrong: - * "null" is not referring to an instance of java.lang.Object :) + /** + * Return true iff this type is castable to another type t as defined in + * the JVM specification. The case where this is Type.NULL is not + * defined (see the CHECKCAST definition in the JVM specification). + * However, because e.g. CHECKCAST doesn't throw a + * ClassCastException when casting a null reference to any Object, + * true is returned in this case. + * + * @throws ClassNotFoundException if any classes or interfaces required + * to determine assignment compatibility can't be found */ - - /* This code is from a bug report by Konstantin Shagin */ - - if ((this instanceof ArrayType) && (t instanceof ArrayType)) { - ArrayType arrType1 = (ArrayType) this; - ArrayType arrType2 = (ArrayType) t; - if ( - (arrType1.getDimensions() == arrType2.getDimensions()) && - arrType1.getBasicType() instanceof ObjectType && - arrType2.getBasicType() instanceof ObjectType) { - return new ArrayType( - ((ObjectType) arrType1.getBasicType()).getFirstCommonSuperclass((ObjectType) arrType2.getBasicType()), - arrType1.getDimensions() - ); - - } - } - - if ((this instanceof ArrayType) || (t instanceof ArrayType)) - return Type.OBJECT; - // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? - - if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) || - ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) - return Type.OBJECT; - // TODO: The above line is correct comparing to the vmspec2. But one could - // make class file verification a bit stronger here by using the notion of - // superinterfaces or even castability or assignment compatibility. - - - // this and t are ObjectTypes, see above. - ObjectType thiz = (ObjectType) this; - ObjectType other = (ObjectType) t; - JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); - JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); - - if ((thiz_sups == null) || (other_sups == null)) { - return null; + public boolean isCastableTo( Type t ) throws ClassNotFoundException { + if (this.equals(Type.NULL)) { + return true; // If this is ever changed in isAssignmentCompatible() + } + return isAssignmentCompatibleWith(t); + /* Yes, it's true: It's the same definition. + * See vmspec2 AASTORE / CHECKCAST definitions. + */ } - // Waaahh... - JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; - JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; - System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); - System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); - this_sups[0] = Repository.lookupClass(thiz.getClassName()); - t_sups[0] = Repository.lookupClass(other.getClassName()); - for (int i = 0; i < t_sups.length; i++) { - for (int j = 0; j < this_sups.length; j++) { - if (this_sups[j].equals(t_sups[i])) return new ObjectType(this_sups[j].getClassName()); - } + /** + * Return true iff this is assignment compatible with another type t + * as defined in the JVM specification; see the AASTORE definition + * there. + * @throws ClassNotFoundException if any classes or interfaces required + * to determine assignment compatibility can't be found + */ + public boolean isAssignmentCompatibleWith( Type t ) throws ClassNotFoundException { + if (!(t instanceof ReferenceType)) { + return false; + } + ReferenceType T = (ReferenceType) t; + if (this.equals(Type.NULL)) { + return true; // This is not explicitely stated, but clear. Isn't it? + } + /* If this is a class type then + */ + if ((this instanceof ObjectType) && (((ObjectType) this).referencesClassExact())) { + /* If T is a class type, then this must be the same class as T, + or this must be a subclass of T; + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesClassExact())) { + if (this.equals(T)) { + return true; + } + if (Repository.instanceOf(((ObjectType) this).getClassName(), ((ObjectType) T) + .getClassName())) { + return true; + } + } + /* If T is an interface type, this must implement interface T. + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact())) { + if (Repository.implementationOf(((ObjectType) this).getClassName(), + ((ObjectType) T).getClassName())) { + return true; + } + } + } + /* If this is an interface type, then: + */ + if ((this instanceof ObjectType) && (((ObjectType) this).referencesInterfaceExact())) { + /* If T is a class type, then T must be Object (§2.4.7). + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesClassExact())) { + if (T.equals(Type.OBJECT)) { + return true; + } + } + /* If T is an interface type, then T must be the same interface + * as this or a superinterface of this (§2.13.2). + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact())) { + if (this.equals(T)) { + return true; + } + if (Repository.implementationOf(((ObjectType) this).getClassName(), + ((ObjectType) T).getClassName())) { + return true; + } + } + } + /* If this is an array type, namely, the type SC[], that is, an + * array of components of type SC, then: + */ + if (this instanceof ArrayType) { + /* If T is a class type, then T must be Object (§2.4.7). + */ + if ((T instanceof ObjectType) && (((ObjectType) T).referencesClassExact())) { + if (T.equals(Type.OBJECT)) { + return true; + } + } + /* If T is an array type TC[], that is, an array of components + * of type TC, then one of the following must be true: + */ + if (T instanceof ArrayType) { + /* TC and SC are the same primitive type (§2.4.1). + */ + Type sc = ((ArrayType) this).getElementType(); + Type tc = ((ArrayType) T).getElementType(); + if (sc instanceof BasicType && tc instanceof BasicType && sc.equals(tc)) { + return true; + } + /* TC and SC are reference types (§2.4.6), and type SC is + * assignable to TC by these runtime rules. + */ + if (tc instanceof ReferenceType && sc instanceof ReferenceType + && ((ReferenceType) sc).isAssignmentCompatibleWith(tc)) { + return true; + } + } + /* If T is an interface type, T must be one of the interfaces implemented by arrays (§2.15). */ + // TODO: Check if this is still valid or find a way to dynamically find out which + // interfaces arrays implement. However, as of the JVM specification edition 2, there + // are at least two different pages where assignment compatibility is defined and + // on one of them "interfaces implemented by arrays" is exchanged with "'Cloneable' or + // 'java.io.Serializable'" + if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact())) { + for (int ii = 0; ii < Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS.length; ii++) { + if (T.equals(new ObjectType(Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS[ii]))) { + return true; + } + } + } + } + return false; // default. } - // Huh? Did you ask for Type.OBJECT's superclass?? - return null; - } - - /** - * This commutative operation returns the first common superclass (narrowest ReferenceType - * referencing a class, not an interface). - * If one of the types is a superclass of the other, the former is returned. - * If "this" is Type.NULL, then t is returned. - * If t is Type.NULL, then "this" is returned. - * If "this" equals t ['this.equals(t)'] "this" is returned. - * If "this" or t is an ArrayType, then Type.OBJECT is returned. - * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. - * If not all of the two classes' superclasses cannot be found, "null" is returned. - * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". - * - * @deprecated use getFirstCommonSuperclass(ReferenceType t) which has - * slightly changed semantics. - * @throws ClassNotFoundException on failure to find superclasses of this - * type, or the type passed as a parameter - */ - public ReferenceType firstCommonSuperclass(ReferenceType t) - throws ClassNotFoundException { - if (this.equals(Type.NULL)) return t; - if (t.equals(Type.NULL)) return this; - if (this.equals(t)) return this; - /* - * TODO: Above sounds a little arbitrary. On the other hand, there is - * no object referenced by Type.NULL so we can also say all the objects - * referenced by Type.NULL were derived from java.lang.Object. - * However, the Java Language's "instanceof" operator proves us wrong: - * "null" is not referring to an instance of java.lang.Object :) + /** + * This commutative operation returns the first common superclass (narrowest ReferenceType + * referencing a class, not an interface). + * If one of the types is a superclass of the other, the former is returned. + * If "this" is Type.NULL, then t is returned. + * If t is Type.NULL, then "this" is returned. + * If "this" equals t ['this.equals(t)'] "this" is returned. + * If "this" or t is an ArrayType, then Type.OBJECT is returned; + * unless their dimensions match. Then an ArrayType of the same + * number of dimensions is returned, with its basic type being the + * first common super class of the basic types of "this" and t. + * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. + * If not all of the two classes' superclasses cannot be found, "null" is returned. + * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". + * + * @throws ClassNotFoundException on failure to find superclasses of this + * type, or the type passed as a parameter */ - - if ((this instanceof ArrayType) || (t instanceof ArrayType)) - return Type.OBJECT; - // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? - - if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) || - ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) - return Type.OBJECT; - // TODO: The above line is correct comparing to the vmspec2. But one could - // make class file verification a bit stronger here by using the notion of - // superinterfaces or even castability or assignment compatibility. - - - // this and t are ObjectTypes, see above. - ObjectType thiz = (ObjectType) this; - ObjectType other = (ObjectType) t; - JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); - JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); - - if ((thiz_sups == null) || (other_sups == null)) { - return null; + public ReferenceType getFirstCommonSuperclass( ReferenceType t ) throws ClassNotFoundException { + if (this.equals(Type.NULL)) { + return t; + } + if (t.equals(Type.NULL)) { + return this; + } + if (this.equals(t)) { + return this; + /* + * TODO: Above sounds a little arbitrary. On the other hand, there is + * no object referenced by Type.NULL so we can also say all the objects + * referenced by Type.NULL were derived from java.lang.Object. + * However, the Java Language's "instanceof" operator proves us wrong: + * "null" is not referring to an instance of java.lang.Object :) + */ + } + /* This code is from a bug report by Konstantin Shagin */ + if ((this instanceof ArrayType) && (t instanceof ArrayType)) { + ArrayType arrType1 = (ArrayType) this; + ArrayType arrType2 = (ArrayType) t; + if ((arrType1.getDimensions() == arrType2.getDimensions()) + && arrType1.getBasicType() instanceof ObjectType + && arrType2.getBasicType() instanceof ObjectType) { + return new ArrayType(((ObjectType) arrType1.getBasicType()) + .getFirstCommonSuperclass((ObjectType) arrType2.getBasicType()), arrType1 + .getDimensions()); + } + } + if ((this instanceof ArrayType) || (t instanceof ArrayType)) { + return Type.OBJECT; + // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? + } + if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) + || ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) { + return Type.OBJECT; + // TODO: The above line is correct comparing to the vmspec2. But one could + // make class file verification a bit stronger here by using the notion of + // superinterfaces or even castability or assignment compatibility. + } + // this and t are ObjectTypes, see above. + ObjectType thiz = (ObjectType) this; + ObjectType other = (ObjectType) t; + JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); + JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); + if ((thiz_sups == null) || (other_sups == null)) { + return null; + } + // Waaahh... + JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; + JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; + System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); + System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); + this_sups[0] = Repository.lookupClass(thiz.getClassName()); + t_sups[0] = Repository.lookupClass(other.getClassName()); + for (int i = 0; i < t_sups.length; i++) { + for (int j = 0; j < this_sups.length; j++) { + if (this_sups[j].equals(t_sups[i])) { + return new ObjectType(this_sups[j].getClassName()); + } + } + } + // Huh? Did you ask for Type.OBJECT's superclass?? + return null; } - // Waaahh... - JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; - JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; - System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); - System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); - this_sups[0] = Repository.lookupClass(thiz.getClassName()); - t_sups[0] = Repository.lookupClass(other.getClassName()); - for (int i = 0; i < t_sups.length; i++) { - for (int j = 0; j < this_sups.length; j++) { - if (this_sups[j].equals(t_sups[i])) return new ObjectType(this_sups[j].getClassName()); - } + /** + * This commutative operation returns the first common superclass (narrowest ReferenceType + * referencing a class, not an interface). + * If one of the types is a superclass of the other, the former is returned. + * If "this" is Type.NULL, then t is returned. + * If t is Type.NULL, then "this" is returned. + * If "this" equals t ['this.equals(t)'] "this" is returned. + * If "this" or t is an ArrayType, then Type.OBJECT is returned. + * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. + * If not all of the two classes' superclasses cannot be found, "null" is returned. + * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". + * + * @deprecated use getFirstCommonSuperclass(ReferenceType t) which has + * slightly changed semantics. + * @throws ClassNotFoundException on failure to find superclasses of this + * type, or the type passed as a parameter + */ + public ReferenceType firstCommonSuperclass( ReferenceType t ) throws ClassNotFoundException { + if (this.equals(Type.NULL)) { + return t; + } + if (t.equals(Type.NULL)) { + return this; + } + if (this.equals(t)) { + return this; + /* + * TODO: Above sounds a little arbitrary. On the other hand, there is + * no object referenced by Type.NULL so we can also say all the objects + * referenced by Type.NULL were derived from java.lang.Object. + * However, the Java Language's "instanceof" operator proves us wrong: + * "null" is not referring to an instance of java.lang.Object :) + */ + } + if ((this instanceof ArrayType) || (t instanceof ArrayType)) { + return Type.OBJECT; + // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? + } + if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) + || ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) { + return Type.OBJECT; + // TODO: The above line is correct comparing to the vmspec2. But one could + // make class file verification a bit stronger here by using the notion of + // superinterfaces or even castability or assignment compatibility. + } + // this and t are ObjectTypes, see above. + ObjectType thiz = (ObjectType) this; + ObjectType other = (ObjectType) t; + JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); + JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); + if ((thiz_sups == null) || (other_sups == null)) { + return null; + } + // Waaahh... + JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; + JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; + System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); + System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); + this_sups[0] = Repository.lookupClass(thiz.getClassName()); + t_sups[0] = Repository.lookupClass(other.getClassName()); + for (int i = 0; i < t_sups.length; i++) { + for (int j = 0; j < this_sups.length; j++) { + if (this_sups[j].equals(t_sups[i])) { + return new ObjectType(this_sups[j].getClassName()); + } + } + } + // Huh? Did you ask for Type.OBJECT's superclass?? + return null; } - - // Huh? Did you ask for Type.OBJECT's superclass?? - return null; - } } diff --git a/src/java/org/apache/bcel/generic/ReturnInstruction.java b/src/java/org/apache/bcel/generic/ReturnInstruction.java index 11e76f7b..052085e4 100644 --- a/src/java/org/apache/bcel/generic/ReturnInstruction.java +++ b/src/java/org/apache/bcel/generic/ReturnInstruction.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.Constants; @@ -25,43 +25,55 @@ import org.apache.bcel.ExceptionConstants; * @version $Id$ * @author M. Dahm */ -public abstract class ReturnInstruction extends Instruction - implements ExceptionThrower, TypedInstruction, StackConsumer { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - ReturnInstruction() {} +public abstract class ReturnInstruction extends Instruction implements ExceptionThrower, + TypedInstruction, StackConsumer { + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + ReturnInstruction() { + } - /** - * @param opcode of instruction - */ - protected ReturnInstruction(short opcode) { - super(opcode, (short)1); - } - public Type getType() { - switch(opcode) { - case Constants.IRETURN: return Type.INT; - case Constants.LRETURN: return Type.LONG; - case Constants.FRETURN: return Type.FLOAT; - case Constants.DRETURN: return Type.DOUBLE; - case Constants.ARETURN: return Type.OBJECT; - case Constants.RETURN: return Type.VOID; - - default: // Never reached - throw new ClassGenException("Unknown type " + opcode); + /** + * @param opcode of instruction + */ + protected ReturnInstruction(short opcode) { + super(opcode, (short) 1); } - } - public Class[] getExceptions() { - return new Class[] { ExceptionConstants.ILLEGAL_MONITOR_STATE }; - } - /** @return type associated with the instruction - */ - public Type getType(ConstantPoolGen cp) { - return getType(); - } -} + public Type getType() { + switch (opcode) { + case Constants.IRETURN: + return Type.INT; + case Constants.LRETURN: + return Type.LONG; + case Constants.FRETURN: + return Type.FLOAT; + case Constants.DRETURN: + return Type.DOUBLE; + case Constants.ARETURN: + return Type.OBJECT; + case Constants.RETURN: + return Type.VOID; + default: // Never reached + throw new ClassGenException("Unknown type " + opcode); + } + } + + public Class[] getExceptions() { + return new Class[] { + ExceptionConstants.ILLEGAL_MONITOR_STATE + }; + } + + + /** @return type associated with the instruction + */ + public Type getType( ConstantPoolGen cp ) { + return getType(); + } +} diff --git a/src/java/org/apache/bcel/generic/ReturnaddressType.java b/src/java/org/apache/bcel/generic/ReturnaddressType.java index 38f60853..bfb182a5 100644 --- a/src/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/java/org/apache/bcel/generic/ReturnaddressType.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import org.apache.bcel.Constants; @@ -27,51 +27,56 @@ import org.apache.bcel.Constants; */ public class ReturnaddressType extends Type { - public static final ReturnaddressType NO_TARGET = new ReturnaddressType(); - private InstructionHandle returnTarget; - - /** - * A Returnaddress [that doesn't know where to return to]. - */ - private ReturnaddressType(){ - super(Constants.T_ADDRESS, ""); - } - - /** - * Creates a ReturnaddressType object with a target. - */ - public ReturnaddressType(InstructionHandle returnTarget) { - super(Constants.T_ADDRESS, ""); - this.returnTarget = returnTarget; - } - - /** @return a hash code value for the object. - */ - public int hashCode() { - if (returnTarget == null) - return 0; - return returnTarget.hashCode(); - } + public static final ReturnaddressType NO_TARGET = new ReturnaddressType(); + private InstructionHandle returnTarget; + + + /** + * A Returnaddress [that doesn't know where to return to]. + */ + private ReturnaddressType() { + super(Constants.T_ADDRESS, ""); + } + + + /** + * Creates a ReturnaddressType object with a target. + */ + public ReturnaddressType(InstructionHandle returnTarget) { + super(Constants.T_ADDRESS, ""); + this.returnTarget = returnTarget; + } + + + /** @return a hash code value for the object. + */ + public int hashCode() { + if (returnTarget == null) { + return 0; + } + return returnTarget.hashCode(); + } + - /** - * Returns if the two Returnaddresses refer to the same target. - */ - public boolean equals(Object rat){ - if(!(rat instanceof ReturnaddressType)) - return false; + /** + * Returns if the two Returnaddresses refer to the same target. + */ + public boolean equals( Object rat ) { + if (!(rat instanceof ReturnaddressType)) { + return false; + } + ReturnaddressType that = (ReturnaddressType) rat; + if (this.returnTarget == null || that.returnTarget == null) { + return that.returnTarget == this.returnTarget; + } + return that.returnTarget.equals(this.returnTarget); + } - ReturnaddressType that = (ReturnaddressType)rat; - - if(this.returnTarget == null || that.returnTarget == null) - return that.returnTarget == this.returnTarget; - - return that.returnTarget.equals(this.returnTarget); - } - /** - * @return the target of this ReturnaddressType - */ - public InstructionHandle getTarget(){ - return returnTarget; - } + /** + * @return the target of this ReturnaddressType + */ + public InstructionHandle getTarget() { + return returnTarget; + } } diff --git a/src/java/org/apache/bcel/generic/SALOAD.java b/src/java/org/apache/bcel/generic/SALOAD.java index b0dc7ae8..80744ad6 100644 --- a/src/java/org/apache/bcel/generic/SALOAD.java +++ b/src/java/org/apache/bcel/generic/SALOAD.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * SALOAD - Load short from array *
            Stack: ..., arrayref, index -> ..., value
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class SALOAD extends ArrayInstruction implements StackProducer { - public SALOAD() { - super(org.apache.bcel.Constants.SALOAD); - } + + public SALOAD() { + super(org.apache.bcel.Constants.SALOAD); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackProducer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitSALOAD(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackProducer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitSALOAD(this); + } } diff --git a/src/java/org/apache/bcel/generic/SASTORE.java b/src/java/org/apache/bcel/generic/SASTORE.java index 86f8b904..2eb6bf42 100644 --- a/src/java/org/apache/bcel/generic/SASTORE.java +++ b/src/java/org/apache/bcel/generic/SASTORE.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * SASTORE - Store into short array *
            Stack: ..., arrayref, index, value -> ...
            @@ -25,24 +24,25 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class SASTORE extends ArrayInstruction implements StackConsumer { - public SASTORE() { - super(org.apache.bcel.Constants.SASTORE); - } + + public SASTORE() { + super(org.apache.bcel.Constants.SASTORE); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitExceptionThrower(this); - v.visitTypedInstruction(this); - v.visitArrayInstruction(this); - v.visitSASTORE(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitArrayInstruction(this); + v.visitSASTORE(this); + } } diff --git a/src/java/org/apache/bcel/generic/SIPUSH.java b/src/java/org/apache/bcel/generic/SIPUSH.java index 531cff51..1e5d26c8 100644 --- a/src/java/org/apache/bcel/generic/SIPUSH.java +++ b/src/java/org/apache/bcel/generic/SIPUSH.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -29,64 +29,75 @@ import org.apache.bcel.util.ByteSequence; * @author M. Dahm */ public class SIPUSH extends Instruction implements ConstantPushInstruction { - private short b; - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - SIPUSH() {} - - public SIPUSH(short b) { - super(org.apache.bcel.Constants.SIPUSH, (short)3); - this.b = b; - } - - /** - * Dump instruction as short code to stream out. - */ - public void dump(DataOutputStream out) throws IOException { - super.dump(out); - out.writeShort(b); - } - - /** - * @return mnemonic for instruction - */ - public String toString(boolean verbose) { - return super.toString(verbose) + " " + b; - } - - /** - * Read needed data (e.g. index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException - { - length = 3; - b = bytes.readShort(); - } - - public Number getValue() { return new Integer(b); } - - /** @return Type.SHORT - */ - public Type getType(ConstantPoolGen cp) { - return Type.SHORT; - } - - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitPushInstruction(this); - v.visitStackProducer(this); - v.visitTypedInstruction(this); - v.visitConstantPushInstruction(this); - v.visitSIPUSH(this); - } + + private short b; + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + SIPUSH() { + } + + + public SIPUSH(short b) { + super(org.apache.bcel.Constants.SIPUSH, (short) 3); + this.b = b; + } + + + /** + * Dump instruction as short code to stream out. + */ + public void dump( DataOutputStream out ) throws IOException { + super.dump(out); + out.writeShort(b); + } + + + /** + * @return mnemonic for instruction + */ + public String toString( boolean verbose ) { + return super.toString(verbose) + " " + b; + } + + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + length = 3; + b = bytes.readShort(); + } + + + public Number getValue() { + return new Integer(b); + } + + + /** @return Type.SHORT + */ + public Type getType( ConstantPoolGen cp ) { + return Type.SHORT; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitPushInstruction(this); + v.visitStackProducer(this); + v.visitTypedInstruction(this); + v.visitConstantPushInstruction(this); + v.visitSIPUSH(this); + } } diff --git a/src/java/org/apache/bcel/generic/SWAP.java b/src/java/org/apache/bcel/generic/SWAP.java index 755cd0aa..fb7ffc82 100644 --- a/src/java/org/apache/bcel/generic/SWAP.java +++ b/src/java/org/apache/bcel/generic/SWAP.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * SWAP - Swa top operand stack word *
            Stack: ..., word2, word1 -> ..., word1, word2
            @@ -25,23 +24,24 @@ package org.apache.bcel.generic; * @author M. Dahm */ public class SWAP extends StackInstruction implements StackConsumer, StackProducer { - public SWAP() { - super(org.apache.bcel.Constants.SWAP); - } + + public SWAP() { + super(org.apache.bcel.Constants.SWAP); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitStackProducer(this); - v.visitStackInstruction(this); - v.visitSWAP(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitStackInstruction(this); + v.visitSWAP(this); + } } diff --git a/src/java/org/apache/bcel/generic/SWITCH.java b/src/java/org/apache/bcel/generic/SWITCH.java index 66b80c86..1f942ca9 100644 --- a/src/java/org/apache/bcel/generic/SWITCH.java +++ b/src/java/org/apache/bcel/generic/SWITCH.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * SWITCH - Branch depending on int value, generates either LOOKUPSWITCH or * TABLESWITCH instruction, depending on whether the match values (int[]) can be @@ -26,121 +25,129 @@ package org.apache.bcel.generic; * @author M. Dahm */ public final class SWITCH implements CompoundInstruction { - private int[] match; - private InstructionHandle[] targets; - private Select instruction; - private int match_length; - - /** - * Template for switch() constructs. If the match array can be - * sorted in ascending order with gaps no larger than max_gap - * between the numbers, a TABLESWITCH instruction is generated, and - * a LOOKUPSWITCH otherwise. The former may be more efficient, but - * needs more space. - * - * Note, that the key array always will be sorted, though we leave - * the original arrays unaltered. - * - * @param match array of match values (case 2: ... case 7: ..., etc.) - * @param targets the instructions to be branched to for each case - * @param target the default target - * @param max_gap maximum gap that may between case branches - */ - public SWITCH(int[] match, InstructionHandle[] targets, - InstructionHandle target, int max_gap) { - this.match = (int[])match.clone(); - this.targets = (InstructionHandle[])targets.clone(); - - if((match_length = match.length) < 2) // (almost) empty switch, or just default - instruction = new TABLESWITCH(match, targets, target); - else { - sort(0, match_length - 1); - - if(matchIsOrdered(max_gap)) { - fillup(max_gap, target); - - instruction = new TABLESWITCH(this.match, this.targets, target); - } - else - instruction = new LOOKUPSWITCH(this.match, this.targets, target); + + private int[] match; + private InstructionHandle[] targets; + private Select instruction; + private int match_length; + + + /** + * Template for switch() constructs. If the match array can be + * sorted in ascending order with gaps no larger than max_gap + * between the numbers, a TABLESWITCH instruction is generated, and + * a LOOKUPSWITCH otherwise. The former may be more efficient, but + * needs more space. + * + * Note, that the key array always will be sorted, though we leave + * the original arrays unaltered. + * + * @param match array of match values (case 2: ... case 7: ..., etc.) + * @param targets the instructions to be branched to for each case + * @param target the default target + * @param max_gap maximum gap that may between case branches + */ + public SWITCH(int[] match, InstructionHandle[] targets, InstructionHandle target, int max_gap) { + this.match = (int[]) match.clone(); + this.targets = (InstructionHandle[]) targets.clone(); + if ((match_length = match.length) < 2) { + instruction = new TABLESWITCH(match, targets, target); + } else { + sort(0, match_length - 1); + if (matchIsOrdered(max_gap)) { + fillup(max_gap, target); + instruction = new TABLESWITCH(this.match, this.targets, target); + } else { + instruction = new LOOKUPSWITCH(this.match, this.targets, target); + } + } + } + + + public SWITCH(int[] match, InstructionHandle[] targets, InstructionHandle target) { + this(match, targets, target, 1); + } + + + private final void fillup( int max_gap, InstructionHandle target ) { + int max_size = match_length + match_length * max_gap; + int[] m_vec = new int[max_size]; + InstructionHandle[] t_vec = new InstructionHandle[max_size]; + int count = 1; + m_vec[0] = match[0]; + t_vec[0] = targets[0]; + for (int i = 1; i < match_length; i++) { + int prev = match[i - 1]; + int gap = match[i] - prev; + for (int j = 1; j < gap; j++) { + m_vec[count] = prev + j; + t_vec[count] = target; + count++; + } + m_vec[count] = match[i]; + t_vec[count] = targets[i]; + count++; + } + match = new int[count]; + targets = new InstructionHandle[count]; + System.arraycopy(m_vec, 0, match, 0, count); + System.arraycopy(t_vec, 0, targets, 0, count); + } + + + /** + * Sort match and targets array with QuickSort. + */ + private final void sort( int l, int r ) { + int i = l, j = r; + int h, m = match[(l + r) / 2]; + InstructionHandle h2; + do { + while (match[i] < m) { + i++; + } + while (m < match[j]) { + j--; + } + if (i <= j) { + h = match[i]; + match[i] = match[j]; + match[j] = h; // Swap elements + h2 = targets[i]; + targets[i] = targets[j]; + targets[j] = h2; // Swap instructions, too + i++; + j--; + } + } while (i <= j); + if (l < j) { + sort(l, j); + } + if (i < r) { + sort(i, r); + } + } + + + /** + * @return match is sorted in ascending order with no gap bigger than max_gap? + */ + private final boolean matchIsOrdered( int max_gap ) { + for (int i = 1; i < match_length; i++) { + if (match[i] - match[i - 1] > max_gap) { + return false; + } + } + return true; + } + + + public final InstructionList getInstructionList() { + return new InstructionList(instruction); + } + + + public final Instruction getInstruction() { + return instruction; } - } - - public SWITCH(int[] match, InstructionHandle[] targets, - InstructionHandle target) { - this(match, targets, target, 1); - } - - private final void fillup(int max_gap, InstructionHandle target) { - int max_size = match_length + match_length * max_gap; - int[] m_vec = new int[max_size]; - InstructionHandle[] t_vec = new InstructionHandle[max_size]; - int count = 1; - - m_vec[0] = match[0]; - t_vec[0] = targets[0]; - - for(int i=1; i < match_length; i++) { - int prev = match[i-1]; - int gap = match[i] - prev; - - for(int j=1; j < gap; j++) { - m_vec[count] = prev + j; - t_vec[count] = target; - count++; - } - - m_vec[count] = match[i]; - t_vec[count] = targets[i]; - count++; - } - - match = new int[count]; - targets = new InstructionHandle[count]; - - System.arraycopy(m_vec, 0, match, 0, count); - System.arraycopy(t_vec, 0, targets, 0, count); - } - - /** - * Sort match and targets array with QuickSort. - */ - private final void sort(int l, int r) { - int i = l, j = r; - int h, m = match[(l + r) / 2]; - InstructionHandle h2; - - do { - while(match[i] < m) i++; - while(m < match[j]) j--; - - if(i <= j) { - h=match[i]; match[i]=match[j]; match[j]=h; // Swap elements - h2=targets[i]; targets[i]=targets[j]; targets[j]=h2; // Swap instructions, too - i++; j--; - } - } while(i <= j); - - if(l < j) sort(l, j); - if(i < r) sort(i, r); - } - - /** - * @return match is sorted in ascending order with no gap bigger than max_gap? - */ - private final boolean matchIsOrdered(int max_gap) { - for(int i=1; i < match_length; i++) - if(match[i] - match[i-1] > max_gap) - return false; - - return true; - } - - public final InstructionList getInstructionList() { - return new InstructionList(instruction); - } - - public final Instruction getInstruction() { - return instruction; - } } diff --git a/src/java/org/apache/bcel/generic/Select.java b/src/java/org/apache/bcel/generic/Select.java index 759fca52..afe702eb 100644 --- a/src/java/org/apache/bcel/generic/Select.java +++ b/src/java/org/apache/bcel/generic/Select.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -31,200 +31,206 @@ import org.apache.bcel.util.ByteSequence; * @see TABLESWITCH * @see InstructionList */ -public abstract class Select extends BranchInstruction - implements VariableLengthInstruction, StackProducer -{ - protected int[] match; // matches, i.e., case 1: ... - protected int[] indices; // target offsets - protected InstructionHandle[] targets; // target objects in instruction list - protected int fixed_length; // fixed length defined by subclasses - protected int match_length; // number of cases - protected int padding = 0; // number of pad bytes for alignment - - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - Select() {} - - /** - * (Match, target) pairs for switch. - * `Match' and `targets' must have the same length of course. - * - * @param match array of matching values - * @param targets instruction targets - * @param defaultTarget default instruction target - */ - Select(short opcode, int[] match, InstructionHandle[] targets, - InstructionHandle defaultTarget) { - super(opcode, defaultTarget); - - this.targets = targets; - for(int i=0; i < targets.length; i++) - notifyTarget(null, targets[i], this); - - this.match = match; - - if((match_length = match.length) != targets.length) - throw new ClassGenException("Match and target array have not the same length"); - - indices = new int[match_length]; - } - - /** - * Since this is a variable length instruction, it may shift the following - * instructions which then need to update their position. - * - * Called by InstructionList.setPositions when setting the position for every - * instruction. In the presence of variable length instructions `setPositions' - * performs multiple passes over the instruction list to calculate the - * correct (byte) positions and offsets by calling this function. - * - * @param offset additional offset caused by preceding (variable length) instructions - * @param max_offset the maximum offset that may be caused by these instructions - * @return additional offset caused by possible change of this instruction's length - */ - protected int updatePosition(int offset, int max_offset) { - position += offset; // Additional offset caused by preceding SWITCHs, GOTOs, etc. - - short old_length = length; - - /* Alignment on 4-byte-boundary, + 1, because of tag byte. +public abstract class Select extends BranchInstruction implements VariableLengthInstruction, + StackProducer { + + protected int[] match; // matches, i.e., case 1: ... + protected int[] indices; // target offsets + protected InstructionHandle[] targets; // target objects in instruction list + protected int fixed_length; // fixed length defined by subclasses + protected int match_length; // number of cases + protected int padding = 0; // number of pad bytes for alignment + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + Select() { + } + + + /** + * (Match, target) pairs for switch. + * `Match' and `targets' must have the same length of course. + * + * @param match array of matching values + * @param targets instruction targets + * @param defaultTarget default instruction target + */ + Select(short opcode, int[] match, InstructionHandle[] targets, InstructionHandle defaultTarget) { + super(opcode, defaultTarget); + this.targets = targets; + for (int i = 0; i < targets.length; i++) { + notifyTarget(null, targets[i], this); + } + this.match = match; + if ((match_length = match.length) != targets.length) { + throw new ClassGenException("Match and target array have not the same length"); + } + indices = new int[match_length]; + } + + + /** + * Since this is a variable length instruction, it may shift the following + * instructions which then need to update their position. + * + * Called by InstructionList.setPositions when setting the position for every + * instruction. In the presence of variable length instructions `setPositions' + * performs multiple passes over the instruction list to calculate the + * correct (byte) positions and offsets by calling this function. + * + * @param offset additional offset caused by preceding (variable length) instructions + * @param max_offset the maximum offset that may be caused by these instructions + * @return additional offset caused by possible change of this instruction's length + */ + protected int updatePosition( int offset, int max_offset ) { + position += offset; // Additional offset caused by preceding SWITCHs, GOTOs, etc. + short old_length = length; + /* Alignment on 4-byte-boundary, + 1, because of tag byte. + */ + padding = (4 - ((position + 1) % 4)) % 4; + length = (short) (fixed_length + padding); // Update length + return length - old_length; + } + + + /** + * Dump instruction as byte code to stream out. + * @param out Output stream */ - padding = (4 - ((position + 1) % 4)) % 4; - length = (short)(fixed_length + padding); // Update length - - return length - old_length; - } - - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - out.writeByte(opcode); - - for(int i=0; i < padding; i++) // Padding bytes - out.writeByte(0); - - index = getTargetOffset(); // Write default target offset - out.writeInt(index); - } - - /** - * Read needed data (e.g. index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException - { - padding = (4 - (bytes.getIndex() % 4)) % 4; // Compute number of pad bytes - - for(int i=0; i < padding; i++) { - bytes.readByte(); + public void dump( DataOutputStream out ) throws IOException { + out.writeByte(opcode); + for (int i = 0; i < padding; i++) { + out.writeByte(0); + } + index = getTargetOffset(); // Write default target offset + out.writeInt(index); } - - // Default branch target common for both cases (TABLESWITCH, LOOKUPSWITCH) - index = bytes.readInt(); - } - - /** - * @return mnemonic for instruction - */ - public String toString(boolean verbose) { - StringBuffer buf = new StringBuffer(super.toString(verbose)); - - if(verbose) { - for(int i=0; i < match_length; i++) { - String s = "null"; - - if(targets[i] != null) - s = targets[i].getInstruction().toString(); - - buf.append("(").append(match[i]).append(", ").append(s).append(" = {").append(indices[i]).append("})"); - } + + + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + padding = (4 - (bytes.getIndex() % 4)) % 4; // Compute number of pad bytes + for (int i = 0; i < padding; i++) { + bytes.readByte(); + } + // Default branch target common for both cases (TABLESWITCH, LOOKUPSWITCH) + index = bytes.readInt(); } - else - buf.append(" ..."); - - return buf.toString(); - } - - /** - * Set branch target for `i'th case - */ - public void setTarget(int i, InstructionHandle target) { - notifyTarget(targets[i], target, this); - targets[i] = target; - } - - /** - * @param old_ih old target - * @param new_ih new target - */ - public void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) { - boolean targeted = false; - - if(target == old_ih) { - targeted = true; - setTarget(new_ih); + + + /** + * @return mnemonic for instruction + */ + public String toString( boolean verbose ) { + StringBuffer buf = new StringBuffer(super.toString(verbose)); + if (verbose) { + for (int i = 0; i < match_length; i++) { + String s = "null"; + if (targets[i] != null) { + s = targets[i].getInstruction().toString(); + } + buf.append("(").append(match[i]).append(", ").append(s).append(" = {").append( + indices[i]).append("})"); + } + } else { + buf.append(" ..."); + } + return buf.toString(); + } + + + /** + * Set branch target for `i'th case + */ + public void setTarget( int i, InstructionHandle target ) { + notifyTarget(targets[i], target, this); + targets[i] = target; } - for(int i=0; i < targets.length; i++) { - if(targets[i] == old_ih) { - targeted = true; - setTarget(i, new_ih); - } + + /** + * @param old_ih old target + * @param new_ih new target + */ + public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { + boolean targeted = false; + if (target == old_ih) { + targeted = true; + setTarget(new_ih); + } + for (int i = 0; i < targets.length; i++) { + if (targets[i] == old_ih) { + targeted = true; + setTarget(i, new_ih); + } + } + if (!targeted) { + throw new ClassGenException("Not targeting " + old_ih); + } + } + + + /** + * @return true, if ih is target of this instruction + */ + public boolean containsTarget( InstructionHandle ih ) { + if (target == ih) { + return true; + } + for (int i = 0; i < targets.length; i++) { + if (targets[i] == ih) { + return true; + } + } + return false; + } + + + protected Object clone() throws CloneNotSupportedException { + Select copy = (Select) super.clone(); + copy.match = (int[]) match.clone(); + copy.indices = (int[]) indices.clone(); + copy.targets = (InstructionHandle[]) targets.clone(); + return copy; + } + + + /** + * Inform targets that they're not targeted anymore. + */ + void dispose() { + super.dispose(); + for (int i = 0; i < targets.length; i++) { + targets[i].removeTargeter(this); + } + } + + + /** + * @return array of match indices + */ + public int[] getMatchs() { + return match; + } + + + /** + * @return array of match target offsets + */ + public int[] getIndices() { + return indices; + } + + + /** + * @return array of match targets + */ + public InstructionHandle[] getTargets() { + return targets; } - - if(!targeted) - throw new ClassGenException("Not targeting " + old_ih); - } - - /** - * @return true, if ih is target of this instruction - */ - public boolean containsTarget(InstructionHandle ih) { - if(target == ih) - return true; - - for(int i=0; i < targets.length; i++) - if(targets[i] == ih) - return true; - - return false; - } - - protected Object clone() throws CloneNotSupportedException { - Select copy = (Select) super.clone(); - - copy.match = (int[]) match.clone(); - copy.indices = (int[]) indices.clone(); - copy.targets = (InstructionHandle[]) targets.clone(); - - return copy; - } - - /** - * Inform targets that they're not targeted anymore. - */ - void dispose() { - super.dispose(); - - for(int i=0; i < targets.length; i++) - targets[i].removeTargeter(this); - } - - /** - * @return array of match indices - */ - public int[] getMatchs() { return match; } - - /** - * @return array of match target offsets - */ - public int[] getIndices() { return indices; } - - /** - * @return array of match targets - */ - public InstructionHandle[] getTargets() { return targets; } } diff --git a/src/java/org/apache/bcel/generic/StackConsumer.java b/src/java/org/apache/bcel/generic/StackConsumer.java index 22b39469..6f0b9fb3 100644 --- a/src/java/org/apache/bcel/generic/StackConsumer.java +++ b/src/java/org/apache/bcel/generic/StackConsumer.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denote an instruction that may consume a value from the stack. * @@ -24,8 +23,8 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface StackConsumer { - /** @return how many words are consumed from stack - */ - public int consumeStack(ConstantPoolGen cpg); -} + /** @return how many words are consumed from stack + */ + public int consumeStack( ConstantPoolGen cpg ); +} diff --git a/src/java/org/apache/bcel/generic/StackInstruction.java b/src/java/org/apache/bcel/generic/StackInstruction.java index 03a00960..d94aefd4 100644 --- a/src/java/org/apache/bcel/generic/StackInstruction.java +++ b/src/java/org/apache/bcel/generic/StackInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Super class for stack operations like DUP and POP. * @@ -24,23 +23,26 @@ package org.apache.bcel.generic; * @author M. Dahm */ public abstract class StackInstruction extends Instruction { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - StackInstruction() {} - /** - * @param opcode instruction opcode - */ - protected StackInstruction(short opcode) { - super(opcode, (short)1); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + StackInstruction() { + } - /** @return Type.UNKNOWN - */ - public Type getType(ConstantPoolGen cp) { - return Type.UNKNOWN; - } -} + /** + * @param opcode instruction opcode + */ + protected StackInstruction(short opcode) { + super(opcode, (short) 1); + } + + + /** @return Type.UNKNOWN + */ + public Type getType( ConstantPoolGen cp ) { + return Type.UNKNOWN; + } +} diff --git a/src/java/org/apache/bcel/generic/StackProducer.java b/src/java/org/apache/bcel/generic/StackProducer.java index 936d7b2a..ddab7ede 100644 --- a/src/java/org/apache/bcel/generic/StackProducer.java +++ b/src/java/org/apache/bcel/generic/StackProducer.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denote an instruction that may produce a value on top of the stack * (this excludes DUP_X1, e.g.) @@ -25,8 +24,8 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface StackProducer { - /** @return how many words are produced on stack - */ - public int produceStack(ConstantPoolGen cpg); -} + /** @return how many words are produced on stack + */ + public int produceStack( ConstantPoolGen cpg ); +} diff --git a/src/java/org/apache/bcel/generic/StoreInstruction.java b/src/java/org/apache/bcel/generic/StoreInstruction.java index 479a6bb9..a1980d32 100644 --- a/src/java/org/apache/bcel/generic/StoreInstruction.java +++ b/src/java/org/apache/bcel/generic/StoreInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denotes an unparameterized instruction to store a value into a local variable, * e.g. ISTORE. @@ -24,41 +23,41 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public abstract class StoreInstruction extends LocalVariableInstruction - implements PopInstruction -{ - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - * tag and length are defined in readInstruction and initFromFile, respectively. - */ - StoreInstruction(short canon_tag, short c_tag) { - super(canon_tag, c_tag); - } +public abstract class StoreInstruction extends LocalVariableInstruction implements PopInstruction { - /** - * @param opcode Instruction opcode - * @param c_tag Instruction number for compact version, ASTORE_0, e.g. - * @param n local variable index (unsigned short) - */ - protected StoreInstruction(short opcode, short c_tag, int n) { - super(opcode, c_tag, n); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + * tag and length are defined in readInstruction and initFromFile, respectively. + */ + StoreInstruction(short canon_tag, short c_tag) { + super(canon_tag, c_tag); + } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitStackConsumer(this); - v.visitPopInstruction(this); - v.visitTypedInstruction(this); - v.visitLocalVariableInstruction(this); - v.visitStoreInstruction(this); - } -} + /** + * @param opcode Instruction opcode + * @param c_tag Instruction number for compact version, ASTORE_0, e.g. + * @param n local variable index (unsigned short) + */ + protected StoreInstruction(short opcode, short c_tag, int n) { + super(opcode, c_tag, n); + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackConsumer(this); + v.visitPopInstruction(this); + v.visitTypedInstruction(this); + v.visitLocalVariableInstruction(this); + v.visitStoreInstruction(this); + } +} diff --git a/src/java/org/apache/bcel/generic/TABLESWITCH.java b/src/java/org/apache/bcel/generic/TABLESWITCH.java index 3ed1c249..ee572383 100644 --- a/src/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/java/org/apache/bcel/generic/TABLESWITCH.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; import java.io.DataOutputStream; @@ -28,84 +28,80 @@ import org.apache.bcel.util.ByteSequence; * @see SWITCH */ public class TABLESWITCH extends Select { - /** - * Empty constructor needed for the Class.newInstance() statement in - * Instruction.readInstruction(). Not to be used otherwise. - */ - TABLESWITCH() {} - - /** - * @param match sorted array of match values, match[0] must be low value, - * match[match_length - 1] high value - * @param targets where to branch for matched values - * @param defaultTarget default branch - */ - public TABLESWITCH(int[] match, InstructionHandle[] targets, - InstructionHandle defaultTarget) { - super(org.apache.bcel.Constants.TABLESWITCH, match, targets, defaultTarget); - - length = (short)(13 + match_length * 4); /* Alignment remainder assumed - * 0 here, until dump time */ - fixed_length = length; - } - - /** - * Dump instruction as byte code to stream out. - * @param out Output stream - */ - public void dump(DataOutputStream out) throws IOException { - super.dump(out); - - int low = (match_length > 0)? match[0] : 0; - out.writeInt(low); - - int high = (match_length > 0)? match[match_length - 1] : 0; - out.writeInt(high); - for(int i=0; i < match_length; i++) // jump offsets - out.writeInt(indices[i] = getTargetOffset(targets[i])); - } + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + TABLESWITCH() { + } - /** - * Read needed data (e.g. index) from file. - */ - protected void initFromFile(ByteSequence bytes, boolean wide) throws IOException - { - super.initFromFile(bytes, wide); - int low = bytes.readInt(); - int high = bytes.readInt(); + /** + * @param match sorted array of match values, match[0] must be low value, + * match[match_length - 1] high value + * @param targets where to branch for matched values + * @param defaultTarget default branch + */ + public TABLESWITCH(int[] match, InstructionHandle[] targets, InstructionHandle defaultTarget) { + super(org.apache.bcel.Constants.TABLESWITCH, match, targets, defaultTarget); + length = (short) (13 + match_length * 4); /* Alignment remainder assumed + * 0 here, until dump time */ + fixed_length = length; + } - match_length = high - low + 1; - fixed_length = (short)(13 + match_length * 4); - length = (short)(fixed_length + padding); - match = new int[match_length]; - indices = new int[match_length]; - targets = new InstructionHandle[match_length]; + /** + * Dump instruction as byte code to stream out. + * @param out Output stream + */ + public void dump( DataOutputStream out ) throws IOException { + super.dump(out); + int low = (match_length > 0) ? match[0] : 0; + out.writeInt(low); + int high = (match_length > 0) ? match[match_length - 1] : 0; + out.writeInt(high); + for (int i = 0; i < match_length; i++) { + out.writeInt(indices[i] = getTargetOffset(targets[i])); + } + } - for(int i=low; i <= high; i++) - match[i - low] = i; - for(int i=0; i < match_length; i++) { - indices[i] = bytes.readInt(); + /** + * Read needed data (e.g. index) from file. + */ + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + super.initFromFile(bytes, wide); + int low = bytes.readInt(); + int high = bytes.readInt(); + match_length = high - low + 1; + fixed_length = (short) (13 + match_length * 4); + length = (short) (fixed_length + padding); + match = new int[match_length]; + indices = new int[match_length]; + targets = new InstructionHandle[match_length]; + for (int i = low; i <= high; i++) { + match[i - low] = i; + } + for (int i = 0; i < match_length; i++) { + indices[i] = bytes.readInt(); + } } - } - /** - * Call corresponding visitor method(s). The order is: - * Call visitor methods of implemented interfaces first, then - * call methods according to the class hierarchy in descending order, - * i.e., the most specific visitXXX() call comes last. - * - * @param v Visitor object - */ - public void accept(Visitor v) { - v.visitVariableLengthInstruction(this); - v.visitStackProducer(this); - v.visitBranchInstruction(this); - v.visitSelect(this); - v.visitTABLESWITCH(this); - } + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitVariableLengthInstruction(this); + v.visitStackProducer(this); + v.visitBranchInstruction(this); + v.visitSelect(this); + v.visitTABLESWITCH(this); + } } diff --git a/src/java/org/apache/bcel/generic/TargetLostException.java b/src/java/org/apache/bcel/generic/TargetLostException.java index 16977e0b..663dc9a1 100644 --- a/src/java/org/apache/bcel/generic/TargetLostException.java +++ b/src/java/org/apache/bcel/generic/TargetLostException.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Thrown by InstructionList.remove() when one or multiple disposed instruction * are still being referenced by a InstructionTargeter object. I.e. the @@ -49,15 +48,20 @@ package org.apache.bcel.generic; * @author M. Dahm */ public final class TargetLostException extends Exception { - private InstructionHandle[] targets; - TargetLostException(InstructionHandle[] t, String mesg) { - super(mesg); - targets = t; - } + private InstructionHandle[] targets; + + + TargetLostException(InstructionHandle[] t, String mesg) { + super(mesg); + targets = t; + } + - /** - * @return list of instructions still being targeted. - */ - public InstructionHandle[] getTargets() { return targets; } + /** + * @return list of instructions still being targeted. + */ + public InstructionHandle[] getTargets() { + return targets; + } } diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index b14557a7..5bee448c 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - import java.util.ArrayList; import java.util.List; import org.apache.bcel.Constants; @@ -32,254 +31,260 @@ import org.apache.bcel.classfile.Utility; */ public abstract class Type implements java.io.Serializable { - protected byte type; - protected String signature; // signature for the type - - /** Predefined constants - */ - public static final BasicType VOID = new BasicType(Constants.T_VOID); - public static final BasicType BOOLEAN = new BasicType(Constants.T_BOOLEAN); - public static final BasicType INT = new BasicType(Constants.T_INT); - public static final BasicType SHORT = new BasicType(Constants.T_SHORT); - public static final BasicType BYTE = new BasicType(Constants.T_BYTE); - public static final BasicType LONG = new BasicType(Constants.T_LONG); - public static final BasicType DOUBLE = new BasicType(Constants.T_DOUBLE); - public static final BasicType FLOAT = new BasicType(Constants.T_FLOAT); - public static final BasicType CHAR = new BasicType(Constants.T_CHAR); - public static final ObjectType OBJECT = new ObjectType("java.lang.Object"); - public static final ObjectType CLASS = new ObjectType("java.lang.Class"); - public static final ObjectType STRING = new ObjectType("java.lang.String"); - public static final ObjectType STRINGBUFFER = new ObjectType("java.lang.StringBuffer"); - public static final ObjectType THROWABLE = new ObjectType("java.lang.Throwable"); - public static final Type[] NO_ARGS = new Type[0]; - public static final ReferenceType NULL = new ReferenceType(){}; - public static final Type UNKNOWN = new Type(Constants.T_UNKNOWN, - ""){}; - - protected Type(byte t, String s) { - type = t; - signature = s; - } - - /** - * @return signature for given type. - */ - public String getSignature() { return signature; } - - /** - * @return type as defined in Constants - */ - public byte getType() { return type; } - - /** - * @return stack size of this type (2 for long and double, 0 for void, 1 otherwise) - */ - public int getSize() { - switch(type) { - case Constants.T_DOUBLE: - case Constants.T_LONG: return 2; - case Constants.T_VOID: return 0; - default: return 1; + protected byte type; + protected String signature; // signature for the type + /** Predefined constants + */ + public static final BasicType VOID = new BasicType(Constants.T_VOID); + public static final BasicType BOOLEAN = new BasicType(Constants.T_BOOLEAN); + public static final BasicType INT = new BasicType(Constants.T_INT); + public static final BasicType SHORT = new BasicType(Constants.T_SHORT); + public static final BasicType BYTE = new BasicType(Constants.T_BYTE); + public static final BasicType LONG = new BasicType(Constants.T_LONG); + public static final BasicType DOUBLE = new BasicType(Constants.T_DOUBLE); + public static final BasicType FLOAT = new BasicType(Constants.T_FLOAT); + public static final BasicType CHAR = new BasicType(Constants.T_CHAR); + public static final ObjectType OBJECT = new ObjectType("java.lang.Object"); + public static final ObjectType CLASS = new ObjectType("java.lang.Class"); + public static final ObjectType STRING = new ObjectType("java.lang.String"); + public static final ObjectType STRINGBUFFER = new ObjectType("java.lang.StringBuffer"); + public static final ObjectType THROWABLE = new ObjectType("java.lang.Throwable"); + public static final Type[] NO_ARGS = new Type[0]; + public static final ReferenceType NULL = new ReferenceType() { + }; + public static final Type UNKNOWN = new Type(Constants.T_UNKNOWN, "") { + }; + + + protected Type(byte t, String s) { + type = t; + signature = s; + } + + + /** + * @return signature for given type. + */ + public String getSignature() { + return signature; + } + + + /** + * @return type as defined in Constants + */ + public byte getType() { + return type; + } + + + /** + * @return stack size of this type (2 for long and double, 0 for void, 1 otherwise) + */ + public int getSize() { + switch (type) { + case Constants.T_DOUBLE: + case Constants.T_LONG: + return 2; + case Constants.T_VOID: + return 0; + default: + return 1; + } + } + + + /** + * @return Type string, e.g. `int[]' + */ + public String toString() { + return ((this.equals(Type.NULL) || (type >= Constants.T_UNKNOWN))) ? signature : Utility + .signatureToString(signature, false); + } + + + /** + * Convert type to Java method signature, e.g. int[] f(java.lang.String x) + * becomes (Ljava/lang/String;)[I + * + * @param return_type what the method returns + * @param arg_types what are the argument types + * @return method signature for given type(s). + */ + public static String getMethodSignature( Type return_type, Type[] arg_types ) { + StringBuffer buf = new StringBuffer("("); + int length = (arg_types == null) ? 0 : arg_types.length; + for (int i = 0; i < length; i++) { + buf.append(arg_types[i].getSignature()); + } + buf.append(')'); + buf.append(return_type.getSignature()); + return buf.toString(); } - } - - /** - * @return Type string, e.g. `int[]' - */ - public String toString() { - return ((this.equals(Type.NULL) || (type >= Constants.T_UNKNOWN)))? signature : - Utility.signatureToString(signature, false); - } - - /** - * Convert type to Java method signature, e.g. int[] f(java.lang.String x) - * becomes (Ljava/lang/String;)[I - * - * @param return_type what the method returns - * @param arg_types what are the argument types - * @return method signature for given type(s). - */ - public static String getMethodSignature(Type return_type, Type[] arg_types) { - StringBuffer buf = new StringBuffer("("); - int length = (arg_types == null)? 0 : arg_types.length; - - for(int i=0; i < length; i++) - buf.append(arg_types[i].getSignature()); - - buf.append(')'); - buf.append(return_type.getSignature()); - - return buf.toString(); - } private static ThreadLocal consumed_chars = new ThreadLocal() { - protected Object initialValue() { - return new Integer(0); - } + + protected Object initialValue() { + return new Integer(0); + } };//int consumed_chars=0; // Remember position in string, see getArgumentTypes - private static int unwrap(ThreadLocal tl) { - return ((Integer)tl.get()).intValue(); + + private static int unwrap( ThreadLocal tl ) { + return ((Integer) tl.get()).intValue(); } - private static void wrap(ThreadLocal tl, int value) { + + private static void wrap( ThreadLocal tl, int value ) { tl.set(new Integer(value)); } - /** - * Convert signature to a Type object. - * @param signature signature string such as Ljava/lang/String; - * @return type object - */ - public static final Type getType(String signature) - throws StringIndexOutOfBoundsException - { - byte type = Utility.typeOfSignature(signature); - - if(type <= Constants.T_VOID) { - //corrected concurrent private static field acess - wrap(consumed_chars, 1); - return BasicType.getType(type); - } else if(type == Constants.T_ARRAY) { - int dim=0; - do { // Count dimensions - dim++; - } while(signature.charAt(dim) == '['); - - // Recurse, but just once, if the signature is ok - Type t = getType(signature.substring(dim)); - - //corrected concurrent private static field acess - // consumed_chars += dim; // update counter - is replaced by - int _temp = unwrap(consumed_chars) + dim; - wrap(consumed_chars, _temp); - - return new ArrayType(t, dim); - } else { // type == T_REFERENCE - int index = signature.indexOf(';'); // Look for closing `;' - - if(index < 0) - throw new ClassFormatException("Invalid signature: " + signature); - - //corrected concurrent private static field acess - wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed - - return new ObjectType(signature.substring(1, index).replace('/', '.')); - } - } - - /** - * Convert return value of a method (signature) to a Type object. - * - * @param signature signature string such as (Ljava/lang/String;)V - * @return return type - */ - public static Type getReturnType(String signature) { - try { - // Read return type after `)' - int index = signature.lastIndexOf(')') + 1; - return getType(signature.substring(index)); - } catch(StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature); + + /** + * Convert signature to a Type object. + * @param signature signature string such as Ljava/lang/String; + * @return type object + */ + public static final Type getType( String signature ) throws StringIndexOutOfBoundsException { + byte type = Utility.typeOfSignature(signature); + if (type <= Constants.T_VOID) { + //corrected concurrent private static field acess + wrap(consumed_chars, 1); + return BasicType.getType(type); + } else if (type == Constants.T_ARRAY) { + int dim = 0; + do { // Count dimensions + dim++; + } while (signature.charAt(dim) == '['); + // Recurse, but just once, if the signature is ok + Type t = getType(signature.substring(dim)); + //corrected concurrent private static field acess + // consumed_chars += dim; // update counter - is replaced by + int _temp = unwrap(consumed_chars) + dim; + wrap(consumed_chars, _temp); + return new ArrayType(t, dim); + } else { // type == T_REFERENCE + int index = signature.indexOf(';'); // Look for closing `;' + if (index < 0) { + throw new ClassFormatException("Invalid signature: " + signature); + } + //corrected concurrent private static field acess + wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed + return new ObjectType(signature.substring(1, index).replace('/', '.')); + } } - } - - /** - * Convert arguments of a method (signature) to an array of Type objects. - * @param signature signature string such as (Ljava/lang/String;)V - * @return array of argument types - */ - public static Type[] getArgumentTypes(String signature) { - List vec = new ArrayList(); - int index; - Type[] types; - - try { // Read all declarations between for `(' and `)' - if(signature.charAt(0) != '(') - throw new ClassFormatException("Invalid method signature: " + signature); - - index = 1; // current string position - - while(signature.charAt(index) != ')') { - vec.add(getType(signature.substring(index))); - //corrected concurrent private static field acess - index += unwrap(consumed_chars); // update position - } - } catch(StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature); + + + /** + * Convert return value of a method (signature) to a Type object. + * + * @param signature signature string such as (Ljava/lang/String;)V + * @return return type + */ + public static Type getReturnType( String signature ) { + try { + // Read return type after `)' + int index = signature.lastIndexOf(')') + 1; + return getType(signature.substring(index)); + } catch (StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatException("Invalid method signature: " + signature); + } } - - types = new Type[vec.size()]; - vec.toArray(types); - return types; - } - - /** Convert runtime java.lang.Class to BCEL Type object. - * @param cl Java class - * @return corresponding Type object - */ - public static Type getType(java.lang.Class cl) { - if(cl == null) { - throw new IllegalArgumentException("Class must not be null"); + + + /** + * Convert arguments of a method (signature) to an array of Type objects. + * @param signature signature string such as (Ljava/lang/String;)V + * @return array of argument types + */ + public static Type[] getArgumentTypes( String signature ) { + List vec = new ArrayList(); + int index; + Type[] types; + try { // Read all declarations between for `(' and `)' + if (signature.charAt(0) != '(') { + throw new ClassFormatException("Invalid method signature: " + signature); + } + index = 1; // current string position + while (signature.charAt(index) != ')') { + vec.add(getType(signature.substring(index))); + //corrected concurrent private static field acess + index += unwrap(consumed_chars); // update position + } + } catch (StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatException("Invalid method signature: " + signature); + } + types = new Type[vec.size()]; + vec.toArray(types); + return types; } - /* That's an amzingly easy case, because getName() returns - * the signature. That's what we would have liked anyway. + + /** Convert runtime java.lang.Class to BCEL Type object. + * @param cl Java class + * @return corresponding Type object */ - if(cl.isArray()) { - return getType(cl.getName()); - } else if(cl.isPrimitive()) { - if(cl == Integer.TYPE) { - return INT; - } else if(cl == Void.TYPE) { - return VOID; - } else if(cl == Double.TYPE) { - return DOUBLE; - } else if(cl == Float.TYPE) { - return FLOAT; - } else if(cl == Boolean.TYPE) { - return BOOLEAN; - } else if(cl == Byte.TYPE) { - return BYTE; - } else if(cl == Short.TYPE) { - return SHORT; - } else if(cl == Byte.TYPE) { - return BYTE; - } else if(cl == Long.TYPE) { - return LONG; - } else if(cl == Character.TYPE) { - return CHAR; - } else { - throw new IllegalStateException("Ooops, what primitive type is " + cl); - } - } else { // "Real" class - return new ObjectType(cl.getName()); + public static Type getType( java.lang.Class cl ) { + if (cl == null) { + throw new IllegalArgumentException("Class must not be null"); + } + /* That's an amzingly easy case, because getName() returns + * the signature. That's what we would have liked anyway. + */ + if (cl.isArray()) { + return getType(cl.getName()); + } else if (cl.isPrimitive()) { + if (cl == Integer.TYPE) { + return INT; + } else if (cl == Void.TYPE) { + return VOID; + } else if (cl == Double.TYPE) { + return DOUBLE; + } else if (cl == Float.TYPE) { + return FLOAT; + } else if (cl == Boolean.TYPE) { + return BOOLEAN; + } else if (cl == Byte.TYPE) { + return BYTE; + } else if (cl == Short.TYPE) { + return SHORT; + } else if (cl == Byte.TYPE) { + return BYTE; + } else if (cl == Long.TYPE) { + return LONG; + } else if (cl == Character.TYPE) { + return CHAR; + } else { + throw new IllegalStateException("Ooops, what primitive type is " + cl); + } + } else { // "Real" class + return new ObjectType(cl.getName()); + } } - } - - /** - * Convert runtime java.lang.Class[] to BCEL Type objects. - * @param classes an array of runtime class objects - * @return array of corresponding Type objects - */ - public static Type[] getTypes(java.lang.Class[] classes){ - Type[] ret = new Type[classes.length]; - for (int i = 0; i < ret.length; i++) { - ret[i] = getType(classes[i]); - } - return ret; - } - - public static String getSignature(java.lang.reflect.Method meth) { - StringBuffer sb = new StringBuffer("("); - Class[] params = meth.getParameterTypes(); // avoid clone - - for(int j = 0; j < params.length; j++) { - sb.append(getType(params[j]).getSignature()); + + + /** + * Convert runtime java.lang.Class[] to BCEL Type objects. + * @param classes an array of runtime class objects + * @return array of corresponding Type objects + */ + public static Type[] getTypes( java.lang.Class[] classes ) { + Type[] ret = new Type[classes.length]; + for (int i = 0; i < ret.length; i++) { + ret[i] = getType(classes[i]); + } + return ret; } - sb.append(")"); - sb.append(getType(meth.getReturnType()).getSignature()); - return sb.toString(); - } + + public static String getSignature( java.lang.reflect.Method meth ) { + StringBuffer sb = new StringBuffer("("); + Class[] params = meth.getParameterTypes(); // avoid clone + for (int j = 0; j < params.length; j++) { + sb.append(getType(params[j]).getSignature()); + } + sb.append(")"); + sb.append(getType(meth.getReturnType()).getSignature()); + return sb.toString(); + } } diff --git a/src/java/org/apache/bcel/generic/TypedInstruction.java b/src/java/org/apache/bcel/generic/TypedInstruction.java index 20594a1b..a0ad7517 100644 --- a/src/java/org/apache/bcel/generic/TypedInstruction.java +++ b/src/java/org/apache/bcel/generic/TypedInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Get the type associated with an instruction, int for ILOAD, or the type * of the field of a PUTFIELD instruction, e.g.. @@ -25,6 +24,6 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface TypedInstruction { - public Type getType(ConstantPoolGen cpg); -} + public Type getType( ConstantPoolGen cpg ); +} diff --git a/src/java/org/apache/bcel/generic/UnconditionalBranch.java b/src/java/org/apache/bcel/generic/UnconditionalBranch.java index 6236cf47..aab5e2a6 100644 --- a/src/java/org/apache/bcel/generic/UnconditionalBranch.java +++ b/src/java/org/apache/bcel/generic/UnconditionalBranch.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denotes an instruction to perform an unconditional branch, i.e., GOTO, JSR. * @@ -26,5 +25,5 @@ package org.apache.bcel.generic; * @see GOTO * @see JSR */ -public interface UnconditionalBranch {} - +public interface UnconditionalBranch { +} diff --git a/src/java/org/apache/bcel/generic/VariableLengthInstruction.java b/src/java/org/apache/bcel/generic/VariableLengthInstruction.java index 8320843d..61d63688 100644 --- a/src/java/org/apache/bcel/generic/VariableLengthInstruction.java +++ b/src/java/org/apache/bcel/generic/VariableLengthInstruction.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Denotes an instruction to be a variable length instruction, such as * GOTO, JSR, LOOKUPSWITCH and TABLESWITCH. @@ -29,5 +28,5 @@ package org.apache.bcel.generic; * @see LOOKUPSWITCH * @see TABLESWITCH */ -public interface VariableLengthInstruction {} - +public interface VariableLengthInstruction { +} diff --git a/src/java/org/apache/bcel/generic/Visitor.java b/src/java/org/apache/bcel/generic/Visitor.java index 4f3b7f0b..94814389 100644 --- a/src/java/org/apache/bcel/generic/Visitor.java +++ b/src/java/org/apache/bcel/generic/Visitor.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.generic; - /** * Interface implementing the Visitor pattern programming style. * I.e., a class that implements this interface can handle all types of @@ -27,184 +26,543 @@ package org.apache.bcel.generic; * @author M. Dahm */ public interface Visitor { - public void visitStackInstruction(StackInstruction obj); - public void visitLocalVariableInstruction(LocalVariableInstruction obj); - public void visitBranchInstruction(BranchInstruction obj); - public void visitLoadClass(LoadClass obj); - public void visitFieldInstruction(FieldInstruction obj); - public void visitIfInstruction(IfInstruction obj); - public void visitConversionInstruction(ConversionInstruction obj); - public void visitPopInstruction(PopInstruction obj); - public void visitStoreInstruction(StoreInstruction obj); - public void visitTypedInstruction(TypedInstruction obj); - public void visitSelect(Select obj); - public void visitJsrInstruction(JsrInstruction obj); - public void visitGotoInstruction(GotoInstruction obj); - public void visitUnconditionalBranch(UnconditionalBranch obj); - public void visitPushInstruction(PushInstruction obj); - public void visitArithmeticInstruction(ArithmeticInstruction obj); - public void visitCPInstruction(CPInstruction obj); - public void visitInvokeInstruction(InvokeInstruction obj); - public void visitArrayInstruction(ArrayInstruction obj); - public void visitAllocationInstruction(AllocationInstruction obj); - public void visitReturnInstruction(ReturnInstruction obj); - public void visitFieldOrMethod(FieldOrMethod obj); - public void visitConstantPushInstruction(ConstantPushInstruction obj); - public void visitExceptionThrower(ExceptionThrower obj); - public void visitLoadInstruction(LoadInstruction obj); - public void visitVariableLengthInstruction(VariableLengthInstruction obj); - public void visitStackProducer(StackProducer obj); - public void visitStackConsumer(StackConsumer obj); - public void visitACONST_NULL(ACONST_NULL obj); - public void visitGETSTATIC(GETSTATIC obj); - public void visitIF_ICMPLT(IF_ICMPLT obj); - public void visitMONITOREXIT(MONITOREXIT obj); - public void visitIFLT(IFLT obj); - public void visitLSTORE(LSTORE obj); - public void visitPOP2(POP2 obj); - public void visitBASTORE(BASTORE obj); - public void visitISTORE(ISTORE obj); - public void visitCHECKCAST(CHECKCAST obj); - public void visitFCMPG(FCMPG obj); - public void visitI2F(I2F obj); - public void visitATHROW(ATHROW obj); - public void visitDCMPL(DCMPL obj); - public void visitARRAYLENGTH(ARRAYLENGTH obj); - public void visitDUP(DUP obj); - public void visitINVOKESTATIC(INVOKESTATIC obj); - public void visitLCONST(LCONST obj); - public void visitDREM(DREM obj); - public void visitIFGE(IFGE obj); - public void visitCALOAD(CALOAD obj); - public void visitLASTORE(LASTORE obj); - public void visitI2D(I2D obj); - public void visitDADD(DADD obj); - public void visitINVOKESPECIAL(INVOKESPECIAL obj); - public void visitIAND(IAND obj); - public void visitPUTFIELD(PUTFIELD obj); - public void visitILOAD(ILOAD obj); - public void visitDLOAD(DLOAD obj); - public void visitDCONST(DCONST obj); - public void visitNEW(NEW obj); - public void visitIFNULL(IFNULL obj); - public void visitLSUB(LSUB obj); - public void visitL2I(L2I obj); - public void visitISHR(ISHR obj); - public void visitTABLESWITCH(TABLESWITCH obj); - public void visitIINC(IINC obj); - public void visitDRETURN(DRETURN obj); - public void visitFSTORE(FSTORE obj); - public void visitDASTORE(DASTORE obj); - public void visitIALOAD(IALOAD obj); - public void visitDDIV(DDIV obj); - public void visitIF_ICMPGE(IF_ICMPGE obj); - public void visitLAND(LAND obj); - public void visitIDIV(IDIV obj); - public void visitLOR(LOR obj); - public void visitCASTORE(CASTORE obj); - public void visitFREM(FREM obj); - public void visitLDC(LDC obj); - public void visitBIPUSH(BIPUSH obj); - public void visitDSTORE(DSTORE obj); - public void visitF2L(F2L obj); - public void visitFMUL(FMUL obj); - public void visitLLOAD(LLOAD obj); - public void visitJSR(JSR obj); - public void visitFSUB(FSUB obj); - public void visitSASTORE(SASTORE obj); - public void visitALOAD(ALOAD obj); - public void visitDUP2_X2(DUP2_X2 obj); - public void visitRETURN(RETURN obj); - public void visitDALOAD(DALOAD obj); - public void visitSIPUSH(SIPUSH obj); - public void visitDSUB(DSUB obj); - public void visitL2F(L2F obj); - public void visitIF_ICMPGT(IF_ICMPGT obj); - public void visitF2D(F2D obj); - public void visitI2L(I2L obj); - public void visitIF_ACMPNE(IF_ACMPNE obj); - public void visitPOP(POP obj); - public void visitI2S(I2S obj); - public void visitIFEQ(IFEQ obj); - public void visitSWAP(SWAP obj); - public void visitIOR(IOR obj); - public void visitIREM(IREM obj); - public void visitIASTORE(IASTORE obj); - public void visitNEWARRAY(NEWARRAY obj); - public void visitINVOKEINTERFACE(INVOKEINTERFACE obj); - public void visitINEG(INEG obj); - public void visitLCMP(LCMP obj); - public void visitJSR_W(JSR_W obj); - public void visitMULTIANEWARRAY(MULTIANEWARRAY obj); - public void visitDUP_X2(DUP_X2 obj); - public void visitSALOAD(SALOAD obj); - public void visitIFNONNULL(IFNONNULL obj); - public void visitDMUL(DMUL obj); - public void visitIFNE(IFNE obj); - public void visitIF_ICMPLE(IF_ICMPLE obj); - public void visitLDC2_W(LDC2_W obj); - public void visitGETFIELD(GETFIELD obj); - public void visitLADD(LADD obj); - public void visitNOP(NOP obj); - public void visitFALOAD(FALOAD obj); - public void visitINSTANCEOF(INSTANCEOF obj); - public void visitIFLE(IFLE obj); - public void visitLXOR(LXOR obj); - public void visitLRETURN(LRETURN obj); - public void visitFCONST(FCONST obj); - public void visitIUSHR(IUSHR obj); - public void visitBALOAD(BALOAD obj); - public void visitDUP2(DUP2 obj); - public void visitIF_ACMPEQ(IF_ACMPEQ obj); - public void visitIMPDEP1(IMPDEP1 obj); - public void visitMONITORENTER(MONITORENTER obj); - public void visitLSHL(LSHL obj); - public void visitDCMPG(DCMPG obj); - public void visitD2L(D2L obj); - public void visitIMPDEP2(IMPDEP2 obj); - public void visitL2D(L2D obj); - public void visitRET(RET obj); - public void visitIFGT(IFGT obj); - public void visitIXOR(IXOR obj); - public void visitINVOKEVIRTUAL(INVOKEVIRTUAL obj); - public void visitFASTORE(FASTORE obj); - public void visitIRETURN(IRETURN obj); - public void visitIF_ICMPNE(IF_ICMPNE obj); - public void visitFLOAD(FLOAD obj); - public void visitLDIV(LDIV obj); - public void visitPUTSTATIC(PUTSTATIC obj); - public void visitAALOAD(AALOAD obj); - public void visitD2I(D2I obj); - public void visitIF_ICMPEQ(IF_ICMPEQ obj); - public void visitAASTORE(AASTORE obj); - public void visitARETURN(ARETURN obj); - public void visitDUP2_X1(DUP2_X1 obj); - public void visitFNEG(FNEG obj); - public void visitGOTO_W(GOTO_W obj); - public void visitD2F(D2F obj); - public void visitGOTO(GOTO obj); - public void visitISUB(ISUB obj); - public void visitF2I(F2I obj); - public void visitDNEG(DNEG obj); - public void visitICONST(ICONST obj); - public void visitFDIV(FDIV obj); - public void visitI2B(I2B obj); - public void visitLNEG(LNEG obj); - public void visitLREM(LREM obj); - public void visitIMUL(IMUL obj); - public void visitIADD(IADD obj); - public void visitLSHR(LSHR obj); - public void visitLOOKUPSWITCH(LOOKUPSWITCH obj); - public void visitDUP_X1(DUP_X1 obj); - public void visitFCMPL(FCMPL obj); - public void visitI2C(I2C obj); - public void visitLMUL(LMUL obj); - public void visitLUSHR(LUSHR obj); - public void visitISHL(ISHL obj); - public void visitLALOAD(LALOAD obj); - public void visitASTORE(ASTORE obj); - public void visitANEWARRAY(ANEWARRAY obj); - public void visitFRETURN(FRETURN obj); - public void visitFADD(FADD obj); - public void visitBREAKPOINT(BREAKPOINT obj); + + public void visitStackInstruction( StackInstruction obj ); + + + public void visitLocalVariableInstruction( LocalVariableInstruction obj ); + + + public void visitBranchInstruction( BranchInstruction obj ); + + + public void visitLoadClass( LoadClass obj ); + + + public void visitFieldInstruction( FieldInstruction obj ); + + + public void visitIfInstruction( IfInstruction obj ); + + + public void visitConversionInstruction( ConversionInstruction obj ); + + + public void visitPopInstruction( PopInstruction obj ); + + + public void visitStoreInstruction( StoreInstruction obj ); + + + public void visitTypedInstruction( TypedInstruction obj ); + + + public void visitSelect( Select obj ); + + + public void visitJsrInstruction( JsrInstruction obj ); + + + public void visitGotoInstruction( GotoInstruction obj ); + + + public void visitUnconditionalBranch( UnconditionalBranch obj ); + + + public void visitPushInstruction( PushInstruction obj ); + + + public void visitArithmeticInstruction( ArithmeticInstruction obj ); + + + public void visitCPInstruction( CPInstruction obj ); + + + public void visitInvokeInstruction( InvokeInstruction obj ); + + + public void visitArrayInstruction( ArrayInstruction obj ); + + + public void visitAllocationInstruction( AllocationInstruction obj ); + + + public void visitReturnInstruction( ReturnInstruction obj ); + + + public void visitFieldOrMethod( FieldOrMethod obj ); + + + public void visitConstantPushInstruction( ConstantPushInstruction obj ); + + + public void visitExceptionThrower( ExceptionThrower obj ); + + + public void visitLoadInstruction( LoadInstruction obj ); + + + public void visitVariableLengthInstruction( VariableLengthInstruction obj ); + + + public void visitStackProducer( StackProducer obj ); + + + public void visitStackConsumer( StackConsumer obj ); + + + public void visitACONST_NULL( ACONST_NULL obj ); + + + public void visitGETSTATIC( GETSTATIC obj ); + + + public void visitIF_ICMPLT( IF_ICMPLT obj ); + + + public void visitMONITOREXIT( MONITOREXIT obj ); + + + public void visitIFLT( IFLT obj ); + + + public void visitLSTORE( LSTORE obj ); + + + public void visitPOP2( POP2 obj ); + + + public void visitBASTORE( BASTORE obj ); + + + public void visitISTORE( ISTORE obj ); + + + public void visitCHECKCAST( CHECKCAST obj ); + + + public void visitFCMPG( FCMPG obj ); + + + public void visitI2F( I2F obj ); + + + public void visitATHROW( ATHROW obj ); + + + public void visitDCMPL( DCMPL obj ); + + + public void visitARRAYLENGTH( ARRAYLENGTH obj ); + + + public void visitDUP( DUP obj ); + + + public void visitINVOKESTATIC( INVOKESTATIC obj ); + + + public void visitLCONST( LCONST obj ); + + + public void visitDREM( DREM obj ); + + + public void visitIFGE( IFGE obj ); + + + public void visitCALOAD( CALOAD obj ); + + + public void visitLASTORE( LASTORE obj ); + + + public void visitI2D( I2D obj ); + + + public void visitDADD( DADD obj ); + + + public void visitINVOKESPECIAL( INVOKESPECIAL obj ); + + + public void visitIAND( IAND obj ); + + + public void visitPUTFIELD( PUTFIELD obj ); + + + public void visitILOAD( ILOAD obj ); + + + public void visitDLOAD( DLOAD obj ); + + + public void visitDCONST( DCONST obj ); + + + public void visitNEW( NEW obj ); + + + public void visitIFNULL( IFNULL obj ); + + + public void visitLSUB( LSUB obj ); + + + public void visitL2I( L2I obj ); + + + public void visitISHR( ISHR obj ); + + + public void visitTABLESWITCH( TABLESWITCH obj ); + + + public void visitIINC( IINC obj ); + + + public void visitDRETURN( DRETURN obj ); + + + public void visitFSTORE( FSTORE obj ); + + + public void visitDASTORE( DASTORE obj ); + + + public void visitIALOAD( IALOAD obj ); + + + public void visitDDIV( DDIV obj ); + + + public void visitIF_ICMPGE( IF_ICMPGE obj ); + + + public void visitLAND( LAND obj ); + + + public void visitIDIV( IDIV obj ); + + + public void visitLOR( LOR obj ); + + + public void visitCASTORE( CASTORE obj ); + + + public void visitFREM( FREM obj ); + + + public void visitLDC( LDC obj ); + + + public void visitBIPUSH( BIPUSH obj ); + + + public void visitDSTORE( DSTORE obj ); + + + public void visitF2L( F2L obj ); + + + public void visitFMUL( FMUL obj ); + + + public void visitLLOAD( LLOAD obj ); + + + public void visitJSR( JSR obj ); + + + public void visitFSUB( FSUB obj ); + + + public void visitSASTORE( SASTORE obj ); + + + public void visitALOAD( ALOAD obj ); + + + public void visitDUP2_X2( DUP2_X2 obj ); + + + public void visitRETURN( RETURN obj ); + + + public void visitDALOAD( DALOAD obj ); + + + public void visitSIPUSH( SIPUSH obj ); + + + public void visitDSUB( DSUB obj ); + + + public void visitL2F( L2F obj ); + + + public void visitIF_ICMPGT( IF_ICMPGT obj ); + + + public void visitF2D( F2D obj ); + + + public void visitI2L( I2L obj ); + + + public void visitIF_ACMPNE( IF_ACMPNE obj ); + + + public void visitPOP( POP obj ); + + + public void visitI2S( I2S obj ); + + + public void visitIFEQ( IFEQ obj ); + + + public void visitSWAP( SWAP obj ); + + + public void visitIOR( IOR obj ); + + + public void visitIREM( IREM obj ); + + + public void visitIASTORE( IASTORE obj ); + + + public void visitNEWARRAY( NEWARRAY obj ); + + + public void visitINVOKEINTERFACE( INVOKEINTERFACE obj ); + + + public void visitINEG( INEG obj ); + + + public void visitLCMP( LCMP obj ); + + + public void visitJSR_W( JSR_W obj ); + + + public void visitMULTIANEWARRAY( MULTIANEWARRAY obj ); + + + public void visitDUP_X2( DUP_X2 obj ); + + + public void visitSALOAD( SALOAD obj ); + + + public void visitIFNONNULL( IFNONNULL obj ); + + + public void visitDMUL( DMUL obj ); + + + public void visitIFNE( IFNE obj ); + + + public void visitIF_ICMPLE( IF_ICMPLE obj ); + + + public void visitLDC2_W( LDC2_W obj ); + + + public void visitGETFIELD( GETFIELD obj ); + + + public void visitLADD( LADD obj ); + + + public void visitNOP( NOP obj ); + + + public void visitFALOAD( FALOAD obj ); + + + public void visitINSTANCEOF( INSTANCEOF obj ); + + + public void visitIFLE( IFLE obj ); + + + public void visitLXOR( LXOR obj ); + + + public void visitLRETURN( LRETURN obj ); + + + public void visitFCONST( FCONST obj ); + + + public void visitIUSHR( IUSHR obj ); + + + public void visitBALOAD( BALOAD obj ); + + + public void visitDUP2( DUP2 obj ); + + + public void visitIF_ACMPEQ( IF_ACMPEQ obj ); + + + public void visitIMPDEP1( IMPDEP1 obj ); + + + public void visitMONITORENTER( MONITORENTER obj ); + + + public void visitLSHL( LSHL obj ); + + + public void visitDCMPG( DCMPG obj ); + + + public void visitD2L( D2L obj ); + + + public void visitIMPDEP2( IMPDEP2 obj ); + + + public void visitL2D( L2D obj ); + + + public void visitRET( RET obj ); + + + public void visitIFGT( IFGT obj ); + + + public void visitIXOR( IXOR obj ); + + + public void visitINVOKEVIRTUAL( INVOKEVIRTUAL obj ); + + + public void visitFASTORE( FASTORE obj ); + + + public void visitIRETURN( IRETURN obj ); + + + public void visitIF_ICMPNE( IF_ICMPNE obj ); + + + public void visitFLOAD( FLOAD obj ); + + + public void visitLDIV( LDIV obj ); + + + public void visitPUTSTATIC( PUTSTATIC obj ); + + + public void visitAALOAD( AALOAD obj ); + + + public void visitD2I( D2I obj ); + + + public void visitIF_ICMPEQ( IF_ICMPEQ obj ); + + + public void visitAASTORE( AASTORE obj ); + + + public void visitARETURN( ARETURN obj ); + + + public void visitDUP2_X1( DUP2_X1 obj ); + + + public void visitFNEG( FNEG obj ); + + + public void visitGOTO_W( GOTO_W obj ); + + + public void visitD2F( D2F obj ); + + + public void visitGOTO( GOTO obj ); + + + public void visitISUB( ISUB obj ); + + + public void visitF2I( F2I obj ); + + + public void visitDNEG( DNEG obj ); + + + public void visitICONST( ICONST obj ); + + + public void visitFDIV( FDIV obj ); + + + public void visitI2B( I2B obj ); + + + public void visitLNEG( LNEG obj ); + + + public void visitLREM( LREM obj ); + + + public void visitIMUL( IMUL obj ); + + + public void visitIADD( IADD obj ); + + + public void visitLSHR( LSHR obj ); + + + public void visitLOOKUPSWITCH( LOOKUPSWITCH obj ); + + + public void visitDUP_X1( DUP_X1 obj ); + + + public void visitFCMPL( FCMPL obj ); + + + public void visitI2C( I2C obj ); + + + public void visitLMUL( LMUL obj ); + + + public void visitLUSHR( LUSHR obj ); + + + public void visitISHL( ISHL obj ); + + + public void visitLALOAD( LALOAD obj ); + + + public void visitASTORE( ASTORE obj ); + + + public void visitANEWARRAY( ANEWARRAY obj ); + + + public void visitFRETURN( FRETURN obj ); + + + public void visitFADD( FADD obj ); + + + public void visitBREAKPOINT( BREAKPOINT obj ); } diff --git a/src/java/org/apache/bcel/util/AttributeHTML.java b/src/java/org/apache/bcel/util/AttributeHTML.java index 8b1f17ba..c333173f 100644 --- a/src/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/java/org/apache/bcel/util/AttributeHTML.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; - import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; @@ -44,191 +43,169 @@ import org.apache.bcel.classfile.Utility; * */ final class AttributeHTML implements org.apache.bcel.Constants { - private String class_name; // name of current class - private PrintWriter file; // file to write to - private int attr_count = 0; - private ConstantHTML constant_html; - private ConstantPool constant_pool; - - AttributeHTML(String dir, String class_name, ConstantPool constant_pool, - ConstantHTML constant_html) throws IOException - { - this.class_name = class_name; - this.constant_pool = constant_pool; - this.constant_html = constant_html; - - file = new PrintWriter(new FileOutputStream(dir + class_name + "_attributes.html")); - file.println(""); - } - - private final String codeLink(int link, int method_number) { - return "" + - link + ""; - } - - final void close() { - file.println("
            "); - file.close(); - } - - final void writeAttribute(Attribute attribute, String anchor) throws IOException { - writeAttribute(attribute, anchor, 0); - } - - final void writeAttribute(Attribute attribute, String anchor, int method_number) throws IOException { - byte tag = attribute.getTag(); - int index; - - if(tag == ATTR_UNKNOWN) // Don't know what to do about this one - return; - - attr_count++; // Increment number of attributes found so far - - if(attr_count % 2 == 0) - file.print(""); - else - file.print(""); - - file.println("

            " + attr_count + " " + ATTRIBUTE_NAMES[tag] + "

            "); - - /* Handle different attributes - */ - switch(tag) { - case ATTR_CODE: - Code c = (Code)attribute; - - // Some directly printable values - file.print("
            • Maximum stack size = " + c.getMaxStack() + - "
            • \n
            • Number of local variables = " + - c.getMaxLocals() + "
            • \n
            • Byte code
            \n"); - - // Get handled exceptions and list them - CodeException[] ce = c.getExceptionTable(); - int len = ce.length; - - if(len > 0) { - file.print("

            Exceptions handled

              "); - - for(int i=0; i < len; i++) { - int catch_type = ce[i].getCatchType(); // Index in constant pool - - file.print("
            • "); - - if(catch_type != 0) - file.print(constant_html.referenceConstant(catch_type)); // Create Link to _cp.html - else - file.print("Any Exception"); - - file.print("
              (Ranging from lines " + codeLink(ce[i].getStartPC(), method_number) + - " to " + codeLink(ce[i].getEndPC(), method_number) + ", handled at line " + - codeLink(ce[i].getHandlerPC(), method_number) + ")
            • "); - } - file.print("
            "); - } - break; - case ATTR_CONSTANT_VALUE: - index = ((ConstantValue)attribute).getConstantValueIndex(); + private String class_name; // name of current class + private PrintWriter file; // file to write to + private int attr_count = 0; + private ConstantHTML constant_html; + private ConstantPool constant_pool; - // Reference _cp.html - file.print("\n"); - break; - case ATTR_SOURCE_FILE: - index = ((SourceFile)attribute).getSourceFileIndex(); - - // Reference _cp.html - file.print("\n"); - break; - - case ATTR_EXCEPTIONS: - // List thrown exceptions - int[] indices = ((ExceptionTable)attribute).getExceptionIndexTable(); - - file.print("\n"); - break; - - case ATTR_LINE_NUMBER_TABLE: - LineNumber[] line_numbers =((LineNumberTable)attribute).getLineNumberTable(); - - // List line number pairs - file.print("

            "); - - for(int i=0; i < line_numbers.length; i++) { - file.print("(" + line_numbers[i].getStartPC() + ", " + line_numbers[i].getLineNumber() + ")"); - - if(i < line_numbers.length - 1) - file.print(", "); // breakable - } - break; - - case ATTR_LOCAL_VARIABLE_TABLE: - LocalVariable[] vars = ((LocalVariableTable)attribute).getLocalVariableTable(); - - // List name, range and type - file.print("

              "); - - for(int i=0; i < vars.length; i++) { - index = vars[i].getSignatureIndex(); - String signature = ((ConstantUtf8)constant_pool.getConstant(index, CONSTANT_Utf8)).getBytes(); - signature = Utility.signatureToString(signature, false); - int start = vars[i].getStartPC(); - int end = (start + vars[i].getLength()); - - file.println("
            • " + Class2HTML.referenceType(signature) + - " " + vars[i].getName() + " in slot %" + vars[i].getIndex() + - "
              Valid from lines " + - "" + - start + " to " + - "" + - end + "
            • "); - } - file.print("
            \n"); + AttributeHTML(String dir, String class_name, ConstantPool constant_pool, + ConstantHTML constant_html) throws IOException { + this.class_name = class_name; + this.constant_pool = constant_pool; + this.constant_html = constant_html; + file = new PrintWriter(new FileOutputStream(dir + class_name + "_attributes.html")); + file.println(""); + } - break; - case ATTR_INNER_CLASSES: - InnerClass[] classes = ((InnerClasses)attribute).getInnerClasses(); + private final String codeLink( int link, int method_number ) { + return "" + link + ""; + } - // List inner classes - file.print("
              "); - for(int i=0; i < classes.length; i++) { - String name, access; - - index = classes[i].getInnerNameIndex(); - if(index > 0) - name =((ConstantUtf8)constant_pool.getConstant(index, CONSTANT_Utf8)).getBytes(); - else - name = "<anonymous>"; + final void close() { + file.println("
            "); + file.close(); + } - access = Utility.accessToString(classes[i].getInnerAccessFlags()); - file.print("
          • " + access + " "+ - constant_html.referenceConstant(classes[i].getInnerClassIndex()) + - " in class " + - constant_html.referenceConstant(classes[i].getOuterClassIndex()) + - " named " + name + "
          • \n"); - } + final void writeAttribute( Attribute attribute, String anchor ) throws IOException { + writeAttribute(attribute, anchor, 0); + } - file.print("
          \n"); - break; - default: // Such as Unknown attribute or Deprecated - file.print("

          " + attribute.toString()); + final void writeAttribute( Attribute attribute, String anchor, int method_number ) + throws IOException { + byte tag = attribute.getTag(); + int index; + if (tag == ATTR_UNKNOWN) { + return; + } + attr_count++; // Increment number of attributes found so far + if (attr_count % 2 == 0) { + file.print(""); + } else { + file.print(""); + } + file.println("

          " + attr_count + " " + ATTRIBUTE_NAMES[tag] + + "

          "); + /* Handle different attributes + */ + switch (tag) { + case ATTR_CODE: + Code c = (Code) attribute; + // Some directly printable values + file.print("
          • Maximum stack size = " + c.getMaxStack() + + "
          • \n
          • Number of local variables = " + c.getMaxLocals() + + "
          • \n
          • Byte code
          \n"); + // Get handled exceptions and list them + CodeException[] ce = c.getExceptionTable(); + int len = ce.length; + if (len > 0) { + file.print("

          Exceptions handled

            "); + for (int i = 0; i < len; i++) { + int catch_type = ce[i].getCatchType(); // Index in constant pool + file.print("
          • "); + if (catch_type != 0) { + file.print(constant_html.referenceConstant(catch_type)); // Create Link to _cp.html + } else { + file.print("Any Exception"); + } + file.print("
            (Ranging from lines " + + codeLink(ce[i].getStartPC(), method_number) + " to " + + codeLink(ce[i].getEndPC(), method_number) + ", handled at line " + + codeLink(ce[i].getHandlerPC(), method_number) + ")
          • "); + } + file.print("
          "); + } + break; + case ATTR_CONSTANT_VALUE: + index = ((ConstantValue) attribute).getConstantValueIndex(); + // Reference _cp.html + file.print("\n"); + break; + case ATTR_SOURCE_FILE: + index = ((SourceFile) attribute).getSourceFileIndex(); + // Reference _cp.html + file.print("\n"); + break; + case ATTR_EXCEPTIONS: + // List thrown exceptions + int[] indices = ((ExceptionTable) attribute).getExceptionIndexTable(); + file.print("\n"); + break; + case ATTR_LINE_NUMBER_TABLE: + LineNumber[] line_numbers = ((LineNumberTable) attribute).getLineNumberTable(); + // List line number pairs + file.print("

          "); + for (int i = 0; i < line_numbers.length; i++) { + file.print("(" + line_numbers[i].getStartPC() + ", " + + line_numbers[i].getLineNumber() + ")"); + if (i < line_numbers.length - 1) { + file.print(", "); // breakable + } + } + break; + case ATTR_LOCAL_VARIABLE_TABLE: + LocalVariable[] vars = ((LocalVariableTable) attribute).getLocalVariableTable(); + // List name, range and type + file.print("

            "); + for (int i = 0; i < vars.length; i++) { + index = vars[i].getSignatureIndex(); + String signature = ((ConstantUtf8) constant_pool.getConstant(index, + CONSTANT_Utf8)).getBytes(); + signature = Utility.signatureToString(signature, false); + int start = vars[i].getStartPC(); + int end = (start + vars[i].getLength()); + file.println("
          • " + Class2HTML.referenceType(signature) + " " + + vars[i].getName() + " in slot %" + vars[i].getIndex() + + "
            Valid from lines " + "" + + start + " to " + "" + end + "
          • "); + } + file.print("
          \n"); + break; + case ATTR_INNER_CLASSES: + InnerClass[] classes = ((InnerClasses) attribute).getInnerClasses(); + // List inner classes + file.print("
            "); + for (int i = 0; i < classes.length; i++) { + String name, access; + index = classes[i].getInnerNameIndex(); + if (index > 0) { + name = ((ConstantUtf8) constant_pool.getConstant(index, CONSTANT_Utf8)) + .getBytes(); + } else { + name = "<anonymous>"; + } + access = Utility.accessToString(classes[i].getInnerAccessFlags()); + file.print("
          • " + access + " " + + constant_html.referenceConstant(classes[i].getInnerClassIndex()) + + " in class " + + constant_html.referenceConstant(classes[i].getOuterClassIndex()) + + " named " + name + "
          • \n"); + } + file.print("
          \n"); + break; + default: // Such as Unknown attribute or Deprecated + file.print("

          " + attribute.toString()); + } + file.println(""); + file.flush(); } - - file.println(""); - file.flush(); - } } diff --git a/src/java/org/apache/bcel/util/BCELComparator.java b/src/java/org/apache/bcel/util/BCELComparator.java index d6083fa2..2b3008bb 100644 --- a/src/java/org/apache/bcel/util/BCELComparator.java +++ b/src/java/org/apache/bcel/util/BCELComparator.java @@ -7,20 +7,22 @@ package org.apache.bcel.util; * @version $Id$ */ public interface BCELComparator { - /** - * Compare two objects and return what THIS.equals(THAT) should return - * - * @param THIS - * @param THAT - * @return true if and only if THIS equals THAT - */ - public boolean equals(Object THIS, Object THAT); - - /** - * Return hashcode for THIS.hashCode() - * - * @param THIS - * @return hashcode for THIS.hashCode() - */ - public int hashCode(Object THIS); + + /** + * Compare two objects and return what THIS.equals(THAT) should return + * + * @param THIS + * @param THAT + * @return true if and only if THIS equals THAT + */ + public boolean equals( Object THIS, Object THAT ); + + + /** + * Return hashcode for THIS.hashCode() + * + * @param THIS + * @return hashcode for THIS.hashCode() + */ + public int hashCode( Object THIS ); } diff --git a/src/java/org/apache/bcel/util/BCELFactory.java b/src/java/org/apache/bcel/util/BCELFactory.java index bed15762..a3c8c5bf 100644 --- a/src/java/org/apache/bcel/util/BCELFactory.java +++ b/src/java/org/apache/bcel/util/BCELFactory.java @@ -39,7 +39,6 @@ import org.apache.bcel.generic.ReturnInstruction; import org.apache.bcel.generic.Select; import org.apache.bcel.generic.Type; - /** * Factory creates il.append() statements, and sets instruction targets. * A helper class for BCELifier. @@ -49,291 +48,263 @@ import org.apache.bcel.generic.Type; * @author M. Dahm */ class BCELFactory extends EmptyVisitor { - private MethodGen _mg; - private PrintWriter _out; - private ConstantPoolGen _cp; - - BCELFactory(MethodGen mg, PrintWriter out) { - _mg = mg; - _cp = mg.getConstantPool(); - _out = out; - } - - private Map branch_map = new HashMap(); // Map - - public void start() { - if(!_mg.isAbstract() && !_mg.isNative()) { - for(InstructionHandle ih = _mg.getInstructionList().getStart(); - ih != null; ih = ih.getNext()) { - Instruction i = ih.getInstruction(); - - if(i instanceof BranchInstruction) { - branch_map.put(i, ih); // memorize container - } - - if(ih.hasTargeters()) { - if(i instanceof BranchInstruction) { - _out.println(" InstructionHandle ih_" + ih.getPosition() + ";"); - } else { - _out.print(" InstructionHandle ih_" + ih.getPosition() + " = "); - } - } else { - _out.print(" "); - } - - if(!visitInstruction(i)) - i.accept(this); - } - - updateBranchTargets(); - updateExceptionHandlers(); + + private MethodGen _mg; + private PrintWriter _out; + private ConstantPoolGen _cp; + + + BCELFactory(MethodGen mg, PrintWriter out) { + _mg = mg; + _cp = mg.getConstantPool(); + _out = out; } - } - - private boolean visitInstruction(Instruction i) { - short opcode = i.getOpcode(); - - if((InstructionConstants.INSTRUCTIONS[opcode] != null) && - !(i instanceof ConstantPushInstruction) && - !(i instanceof ReturnInstruction)) { // Handled below - _out.println("il.append(InstructionConstants." + - i.getName().toUpperCase(Locale.ENGLISH) + ");"); - return true; + + private Map branch_map = new HashMap(); // Map + + + public void start() { + if (!_mg.isAbstract() && !_mg.isNative()) { + for (InstructionHandle ih = _mg.getInstructionList().getStart(); ih != null; ih = ih + .getNext()) { + Instruction i = ih.getInstruction(); + if (i instanceof BranchInstruction) { + branch_map.put(i, ih); // memorize container + } + if (ih.hasTargeters()) { + if (i instanceof BranchInstruction) { + _out.println(" InstructionHandle ih_" + ih.getPosition() + ";"); + } else { + _out.print(" InstructionHandle ih_" + ih.getPosition() + " = "); + } + } else { + _out.print(" "); + } + if (!visitInstruction(i)) { + i.accept(this); + } + } + updateBranchTargets(); + updateExceptionHandlers(); + } } - return false; - } - - public void visitLocalVariableInstruction(LocalVariableInstruction i) { - short opcode = i.getOpcode(); - Type type = i.getType(_cp); - - if(opcode == Constants.IINC) { - _out.println("il.append(new IINC(" + i.getIndex() + ", " + - ((IINC)i).getIncrement() + "));"); - } else { - String kind = (opcode < Constants.ISTORE)? "Load" : "Store"; - _out.println("il.append(_factory.create" + kind + "(" + - BCELifier.printType(type) + ", " + - i.getIndex() + "));"); + + private boolean visitInstruction( Instruction i ) { + short opcode = i.getOpcode(); + if ((InstructionConstants.INSTRUCTIONS[opcode] != null) + && !(i instanceof ConstantPushInstruction) && !(i instanceof ReturnInstruction)) { // Handled below + _out.println("il.append(InstructionConstants." + + i.getName().toUpperCase(Locale.ENGLISH) + ");"); + return true; + } + return false; } - } - - public void visitArrayInstruction(ArrayInstruction i) { - short opcode = i.getOpcode(); - Type type = i.getType(_cp); - String kind = (opcode < Constants.IASTORE)? "Load" : "Store"; - - _out.println("il.append(_factory.createArray" + kind + "(" + - BCELifier.printType(type) + "));"); - } - - public void visitFieldInstruction(FieldInstruction i) { - short opcode = i.getOpcode(); - - String class_name = i.getClassName(_cp); - String field_name = i.getFieldName(_cp); - Type type = i.getFieldType(_cp); - - _out.println("il.append(_factory.createFieldAccess(\"" + - class_name + "\", \"" + field_name + "\", " + - BCELifier.printType(type) + ", " + - "Constants." + Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH) + - "));"); - } - - public void visitInvokeInstruction(InvokeInstruction i) { - short opcode = i.getOpcode(); - String class_name = i.getClassName(_cp); - String method_name = i.getMethodName(_cp); - Type type = i.getReturnType(_cp); - Type[] arg_types = i.getArgumentTypes(_cp); - - _out.println("il.append(_factory.createInvoke(\"" + - class_name + "\", \"" + method_name + "\", " + - BCELifier.printType(type) + ", " + - BCELifier.printArgumentTypes(arg_types) + ", " + - "Constants." + Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH) + - "));"); - } - - public void visitAllocationInstruction(AllocationInstruction i) { - Type type; - - if(i instanceof CPInstruction) { - type = ((CPInstruction)i).getType(_cp); - } else { - type = ((NEWARRAY)i).getType(); + + + public void visitLocalVariableInstruction( LocalVariableInstruction i ) { + short opcode = i.getOpcode(); + Type type = i.getType(_cp); + if (opcode == Constants.IINC) { + _out.println("il.append(new IINC(" + i.getIndex() + ", " + ((IINC) i).getIncrement() + + "));"); + } else { + String kind = (opcode < Constants.ISTORE) ? "Load" : "Store"; + _out.println("il.append(_factory.create" + kind + "(" + BCELifier.printType(type) + + ", " + i.getIndex() + "));"); + } } - short opcode = ((Instruction)i).getOpcode(); - int dim = 1; - switch(opcode) { - case Constants.NEW: - _out.println("il.append(_factory.createNew(\"" + - ((ObjectType)type).getClassName() + "\"));"); - break; + public void visitArrayInstruction( ArrayInstruction i ) { + short opcode = i.getOpcode(); + Type type = i.getType(_cp); + String kind = (opcode < Constants.IASTORE) ? "Load" : "Store"; + _out.println("il.append(_factory.createArray" + kind + "(" + BCELifier.printType(type) + + "));"); + } - case Constants.MULTIANEWARRAY: - dim = ((MULTIANEWARRAY)i).getDimensions(); - case Constants.ANEWARRAY: - case Constants.NEWARRAY: - if (type instanceof ArrayType) - type = ((ArrayType)type).getBasicType(); - _out.println("il.append(_factory.createNewArray(" + - BCELifier.printType(type) + ", (short) " + dim + "));"); - break; + public void visitFieldInstruction( FieldInstruction i ) { + short opcode = i.getOpcode(); + String class_name = i.getClassName(_cp); + String field_name = i.getFieldName(_cp); + Type type = i.getFieldType(_cp); + _out.println("il.append(_factory.createFieldAccess(\"" + class_name + "\", \"" + field_name + + "\", " + BCELifier.printType(type) + ", " + "Constants." + + Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH) + "));"); + } + - default: - throw new RuntimeException("Oops: " + opcode); + public void visitInvokeInstruction( InvokeInstruction i ) { + short opcode = i.getOpcode(); + String class_name = i.getClassName(_cp); + String method_name = i.getMethodName(_cp); + Type type = i.getReturnType(_cp); + Type[] arg_types = i.getArgumentTypes(_cp); + _out.println("il.append(_factory.createInvoke(\"" + class_name + "\", \"" + method_name + + "\", " + BCELifier.printType(type) + ", " + + BCELifier.printArgumentTypes(arg_types) + ", " + "Constants." + + Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH) + "));"); } - } - - private void createConstant(Object value) { - String embed = value.toString(); - - if(value instanceof String) - embed = '"' + Utility.convertString(value.toString()) + '"'; - else if(value instanceof Character) - embed = "(char)0x" + Integer.toHexString(((Character)value).charValue()); - - _out.println("il.append(new PUSH(_cp, " + embed + "));"); - } - - public void visitLDC(LDC i) { - createConstant(i.getValue(_cp)); - } - - public void visitLDC2_W(LDC2_W i) { - createConstant(i.getValue(_cp)); - } - - public void visitConstantPushInstruction(ConstantPushInstruction i) { - createConstant(i.getValue()); - } - - public void visitINSTANCEOF(INSTANCEOF i) { - Type type = i.getType(_cp); - - _out.println("il.append(new INSTANCEOF(_cp.addClass(" + - BCELifier.printType(type) + ")));"); - } - - public void visitCHECKCAST(CHECKCAST i) { - Type type = i.getType(_cp); - - _out.println("il.append(_factory.createCheckCast(" + - BCELifier.printType(type) + "));"); - } - - public void visitReturnInstruction(ReturnInstruction i) { - Type type = i.getType(_cp); - - _out.println("il.append(_factory.createReturn(" + - BCELifier.printType(type) + "));"); - } - - // Memorize BranchInstructions that need an update - private List branches = new ArrayList(); - - public void visitBranchInstruction(BranchInstruction bi) { - BranchHandle bh = (BranchHandle)branch_map.get(bi); - int pos = bh.getPosition(); - String name = bi.getName() + "_" + pos; - - if(bi instanceof Select) { - Select s = (Select)bi; - branches.add(bi); - - StringBuffer args = new StringBuffer("new int[] { "); - int[] matchs = s.getMatchs(); - - for(int i=0; i < matchs.length; i++) { - args.append(matchs[i]); - - if(i < matchs.length - 1) - args.append(", "); - } - - args.append(" }"); - - _out.print("Select " + name + " = new " + - bi.getName().toUpperCase(Locale.ENGLISH) + "(" + args + - ", new InstructionHandle[] { "); - - for(int i=0; i < matchs.length; i++) { - _out.print("null"); - - if(i < matchs.length - 1) - _out.print(", "); - } - - _out.println(" }, null);"); - } else { - int t_pos = bh.getTarget().getPosition(); - String target; - - if(pos > t_pos) { - target = "ih_" + t_pos; - } else { - branches.add(bi); - target = "null"; - } - - _out.println(" BranchInstruction " + name + - " = _factory.createBranchInstruction(" + - "Constants." + bi.getName().toUpperCase(Locale.ENGLISH) + ", " + - target + ");"); - } - - if(bh.hasTargeters()) - _out.println(" ih_" + pos + " = il.append(" + name + ");"); - else - _out.println(" il.append(" + name + ");"); - } - - public void visitRET(RET i) { - _out.println("il.append(new RET(" + i.getIndex() + ")));"); - } - - private void updateBranchTargets() { - for(Iterator i = branches.iterator(); i.hasNext(); ) { - BranchInstruction bi = (BranchInstruction)i.next(); - BranchHandle bh = (BranchHandle)branch_map.get(bi); - int pos = bh.getPosition(); - String name = bi.getName() + "_" + pos; - int t_pos = bh.getTarget().getPosition(); - - _out.println(" " + name + ".setTarget(ih_" + t_pos + ");"); - - if(bi instanceof Select) { - InstructionHandle[] ihs = ((Select)bi).getTargets(); - - for(int j = 0; j < ihs.length; j++) { - t_pos = ihs[j].getPosition(); - - _out.println(" " + name + ".setTarget(" + j + - ", ih_" + t_pos + ");"); - } - } + + + public void visitAllocationInstruction( AllocationInstruction i ) { + Type type; + if (i instanceof CPInstruction) { + type = ((CPInstruction) i).getType(_cp); + } else { + type = ((NEWARRAY) i).getType(); + } + short opcode = ((Instruction) i).getOpcode(); + int dim = 1; + switch (opcode) { + case Constants.NEW: + _out.println("il.append(_factory.createNew(\"" + ((ObjectType) type).getClassName() + + "\"));"); + break; + case Constants.MULTIANEWARRAY: + dim = ((MULTIANEWARRAY) i).getDimensions(); + case Constants.ANEWARRAY: + case Constants.NEWARRAY: + if (type instanceof ArrayType) { + type = ((ArrayType) type).getBasicType(); + } + _out.println("il.append(_factory.createNewArray(" + BCELifier.printType(type) + + ", (short) " + dim + "));"); + break; + default: + throw new RuntimeException("Oops: " + opcode); + } + } + + + private void createConstant( Object value ) { + String embed = value.toString(); + if (value instanceof String) { + embed = '"' + Utility.convertString(value.toString()) + '"'; + } else if (value instanceof Character) { + embed = "(char)0x" + Integer.toHexString(((Character) value).charValue()); + } + _out.println("il.append(new PUSH(_cp, " + embed + "));"); } - } - private void updateExceptionHandlers() { - CodeExceptionGen[] handlers = _mg.getExceptionHandlers(); - for(int i=0; i < handlers.length; i++) { - CodeExceptionGen h = handlers[i]; - String type = (h.getCatchType() == null)? - "null" : BCELifier.printType(h.getCatchType()); + public void visitLDC( LDC i ) { + createConstant(i.getValue(_cp)); + } + + + public void visitLDC2_W( LDC2_W i ) { + createConstant(i.getValue(_cp)); + } + + + public void visitConstantPushInstruction( ConstantPushInstruction i ) { + createConstant(i.getValue()); + } + + + public void visitINSTANCEOF( INSTANCEOF i ) { + Type type = i.getType(_cp); + _out.println("il.append(new INSTANCEOF(_cp.addClass(" + BCELifier.printType(type) + ")));"); + } + + + public void visitCHECKCAST( CHECKCAST i ) { + Type type = i.getType(_cp); + _out.println("il.append(_factory.createCheckCast(" + BCELifier.printType(type) + "));"); + } + + + public void visitReturnInstruction( ReturnInstruction i ) { + Type type = i.getType(_cp); + _out.println("il.append(_factory.createReturn(" + BCELifier.printType(type) + "));"); + } + + // Memorize BranchInstructions that need an update + private List branches = new ArrayList(); + + + public void visitBranchInstruction( BranchInstruction bi ) { + BranchHandle bh = (BranchHandle) branch_map.get(bi); + int pos = bh.getPosition(); + String name = bi.getName() + "_" + pos; + if (bi instanceof Select) { + Select s = (Select) bi; + branches.add(bi); + StringBuffer args = new StringBuffer("new int[] { "); + int[] matchs = s.getMatchs(); + for (int i = 0; i < matchs.length; i++) { + args.append(matchs[i]); + if (i < matchs.length - 1) { + args.append(", "); + } + } + args.append(" }"); + _out.print("Select " + name + " = new " + bi.getName().toUpperCase(Locale.ENGLISH) + + "(" + args + ", new InstructionHandle[] { "); + for (int i = 0; i < matchs.length; i++) { + _out.print("null"); + if (i < matchs.length - 1) { + _out.print(", "); + } + } + _out.println(" }, null);"); + } else { + int t_pos = bh.getTarget().getPosition(); + String target; + if (pos > t_pos) { + target = "ih_" + t_pos; + } else { + branches.add(bi); + target = "null"; + } + _out.println(" BranchInstruction " + name + " = _factory.createBranchInstruction(" + + "Constants." + bi.getName().toUpperCase(Locale.ENGLISH) + ", " + target + + ");"); + } + if (bh.hasTargeters()) { + _out.println(" ih_" + pos + " = il.append(" + name + ");"); + } else { + _out.println(" il.append(" + name + ");"); + } + } + + + public void visitRET( RET i ) { + _out.println("il.append(new RET(" + i.getIndex() + ")));"); + } + + + private void updateBranchTargets() { + for (Iterator i = branches.iterator(); i.hasNext();) { + BranchInstruction bi = (BranchInstruction) i.next(); + BranchHandle bh = (BranchHandle) branch_map.get(bi); + int pos = bh.getPosition(); + String name = bi.getName() + "_" + pos; + int t_pos = bh.getTarget().getPosition(); + _out.println(" " + name + ".setTarget(ih_" + t_pos + ");"); + if (bi instanceof Select) { + InstructionHandle[] ihs = ((Select) bi).getTargets(); + for (int j = 0; j < ihs.length; j++) { + t_pos = ihs[j].getPosition(); + _out.println(" " + name + ".setTarget(" + j + ", ih_" + t_pos + ");"); + } + } + } + } + - _out.println(" method.addExceptionHandler(" + - "ih_" + h.getStartPC().getPosition() + ", " + - "ih_" + h.getEndPC().getPosition() + ", " + - "ih_" + h.getHandlerPC().getPosition() + ", " + - type + ");"); + private void updateExceptionHandlers() { + CodeExceptionGen[] handlers = _mg.getExceptionHandlers(); + for (int i = 0; i < handlers.length; i++) { + CodeExceptionGen h = handlers[i]; + String type = (h.getCatchType() == null) ? "null" : BCELifier.printType(h + .getCatchType()); + _out.println(" method.addExceptionHandler(" + "ih_" + h.getStartPC().getPosition() + + ", " + "ih_" + h.getEndPC().getPosition() + ", " + "ih_" + + h.getHandlerPC().getPosition() + ", " + type + ");"); + } } - } } diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java index 3b1c2972..60b771a7 100644 --- a/src/java/org/apache/bcel/util/BCELifier.java +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; import java.io.OutputStream; @@ -43,253 +43,226 @@ import org.apache.bcel.generic.Type; * @author M. Dahm */ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { - private static final int FLAG_FOR_UNKNOWN = -1; - private static final int FLAG_FOR_CLASS = 0; - private static final int FLAG_FOR_METHOD = 1; - - private JavaClass _clazz; - private PrintWriter _out; - private ConstantPoolGen _cp; - - /** @param clazz Java class to "decompile" - * @param out where to output Java program - */ - public BCELifier(JavaClass clazz, OutputStream out) { - _clazz = clazz; - _out = new PrintWriter(out); - _cp = new ConstantPoolGen(_clazz.getConstantPool()); - } - /** Start Java code generation - */ - public void start() { - visitJavaClass(_clazz); - _out.flush(); - } - - public void visitJavaClass(JavaClass clazz) { - String class_name = clazz.getClassName(); - String super_name = clazz.getSuperclassName(); - String package_name = clazz.getPackageName(); - String inter = Utility.printArray(clazz.getInterfaceNames(), - false, true); - if(!"".equals(package_name)) { - class_name = class_name.substring(package_name.length() + 1); - _out.println("package " + package_name + ";"); - _out.println(); + private static final int FLAG_FOR_UNKNOWN = -1; + private static final int FLAG_FOR_CLASS = 0; + private static final int FLAG_FOR_METHOD = 1; + private JavaClass _clazz; + private PrintWriter _out; + private ConstantPoolGen _cp; + + + /** @param clazz Java class to "decompile" + * @param out where to output Java program + */ + public BCELifier(JavaClass clazz, OutputStream out) { + _clazz = clazz; + _out = new PrintWriter(out); + _cp = new ConstantPoolGen(_clazz.getConstantPool()); } - _out.println("import org.apache.bcel.generic.*;"); - _out.println("import org.apache.bcel.classfile.*;"); - _out.println("import org.apache.bcel.*;"); - _out.println("import java.io.*;"); - _out.println(); - - _out.println("public class " + class_name + "Creator implements Constants {"); - _out.println(" private InstructionFactory _factory;"); - _out.println(" private ConstantPoolGen _cp;"); - _out.println(" private ClassGen _cg;"); - _out.println(); - - _out.println(" public " + class_name + "Creator() {"); - _out.println(" _cg = new ClassGen(\"" + - (("".equals(package_name))? class_name : - package_name + "." + class_name) + - "\", \"" + super_name + "\", " + - "\"" + clazz.getSourceFileName() + "\", " + - printFlags(clazz.getAccessFlags(), FLAG_FOR_CLASS) + ", " + - "new String[] { " + inter + " });"); - _out.println(); - - _out.println(" _cp = _cg.getConstantPool();"); - _out.println(" _factory = new InstructionFactory(_cg, _cp);"); - _out.println(" }"); - _out.println(); - - printCreate(); - - Field[] fields = clazz.getFields(); - if(fields.length > 0) { - _out.println(" private void createFields() {"); - _out.println(" FieldGen field;"); - - for(int i=0; i < fields.length; i++) { - fields[i].accept(this); - } - - _out.println(" }"); - _out.println(); + /** Start Java code generation + */ + public void start() { + visitJavaClass(_clazz); + _out.flush(); } - Method[] methods = clazz.getMethods(); - for(int i=0; i < methods.length; i++) { - _out.println(" private void createMethod_" + i + "() {"); - - methods[i].accept(this); - _out.println(" }"); - _out.println(); + public void visitJavaClass( JavaClass clazz ) { + String class_name = clazz.getClassName(); + String super_name = clazz.getSuperclassName(); + String package_name = clazz.getPackageName(); + String inter = Utility.printArray(clazz.getInterfaceNames(), false, true); + if (!"".equals(package_name)) { + class_name = class_name.substring(package_name.length() + 1); + _out.println("package " + package_name + ";"); + _out.println(); + } + _out.println("import org.apache.bcel.generic.*;"); + _out.println("import org.apache.bcel.classfile.*;"); + _out.println("import org.apache.bcel.*;"); + _out.println("import java.io.*;"); + _out.println(); + _out.println("public class " + class_name + "Creator implements Constants {"); + _out.println(" private InstructionFactory _factory;"); + _out.println(" private ConstantPoolGen _cp;"); + _out.println(" private ClassGen _cg;"); + _out.println(); + _out.println(" public " + class_name + "Creator() {"); + _out.println(" _cg = new ClassGen(\"" + + (("".equals(package_name)) ? class_name : package_name + "." + class_name) + + "\", \"" + super_name + "\", " + "\"" + clazz.getSourceFileName() + "\", " + + printFlags(clazz.getAccessFlags(), FLAG_FOR_CLASS) + ", " + "new String[] { " + + inter + " });"); + _out.println(); + _out.println(" _cp = _cg.getConstantPool();"); + _out.println(" _factory = new InstructionFactory(_cg, _cp);"); + _out.println(" }"); + _out.println(); + printCreate(); + Field[] fields = clazz.getFields(); + if (fields.length > 0) { + _out.println(" private void createFields() {"); + _out.println(" FieldGen field;"); + for (int i = 0; i < fields.length; i++) { + fields[i].accept(this); + } + _out.println(" }"); + _out.println(); + } + Method[] methods = clazz.getMethods(); + for (int i = 0; i < methods.length; i++) { + _out.println(" private void createMethod_" + i + "() {"); + methods[i].accept(this); + _out.println(" }"); + _out.println(); + } + printMain(); + _out.println("}"); } - printMain(); - _out.println("}"); - } - - private void printCreate() { - _out.println(" public void create(OutputStream out) throws IOException {"); - Field[] fields = _clazz.getFields(); - if(fields.length > 0) { - _out.println(" createFields();"); + private void printCreate() { + _out.println(" public void create(OutputStream out) throws IOException {"); + Field[] fields = _clazz.getFields(); + if (fields.length > 0) { + _out.println(" createFields();"); + } + Method[] methods = _clazz.getMethods(); + for (int i = 0; i < methods.length; i++) { + _out.println(" createMethod_" + i + "();"); + } + _out.println(" _cg.getJavaClass().dump(out);"); + _out.println(" }"); + _out.println(); } - Method[] methods = _clazz.getMethods(); - for(int i=0; i < methods.length; i++) { - _out.println(" createMethod_" + i + "();"); - } - - _out.println(" _cg.getJavaClass().dump(out);"); - - _out.println(" }"); - _out.println(); - } - - private void printMain() { - String class_name = _clazz.getClassName(); - - _out.println(" public static void main(String[] args) throws Exception {"); - _out.println(" " + class_name + "Creator creator = new " + - class_name + "Creator();"); - _out.println(" creator.create(new FileOutputStream(\"" + class_name + - ".class\"));"); - _out.println(" }"); - } - - public void visitField(Field field) { - _out.println(); - _out.println(" field = new FieldGen(" + - printFlags(field.getAccessFlags()) + - ", " + printType(field.getSignature()) + ", \"" + - field.getName() + "\", _cp);"); - ConstantValue cv = field.getConstantValue(); - - if(cv != null) { - String value = cv.toString(); - _out.println(" field.setInitValue(" + value + ")"); + private void printMain() { + String class_name = _clazz.getClassName(); + _out.println(" public static void main(String[] args) throws Exception {"); + _out.println(" " + class_name + "Creator creator = new " + class_name + "Creator();"); + _out.println(" creator.create(new FileOutputStream(\"" + class_name + ".class\"));"); + _out.println(" }"); } - _out.println(" _cg.addField(field.getField());"); - } - - public void visitMethod(Method method) { - MethodGen mg = new MethodGen(method, _clazz.getClassName(), _cp); - - Type result_type = mg.getReturnType(); - Type[] arg_types = mg.getArgumentTypes(); - - _out.println(" InstructionList il = new InstructionList();"); - _out.println(" MethodGen method = new MethodGen(" + - printFlags(method.getAccessFlags(), FLAG_FOR_METHOD) + - ", " + printType(result_type) + - ", " + printArgumentTypes(arg_types) + ", " + - "new String[] { " + - Utility.printArray(mg.getArgumentNames(), false, true) + - " }, \"" + method.getName() + "\", \"" + - _clazz.getClassName() + "\", il, _cp);"); - _out.println(); - BCELFactory factory = new BCELFactory(mg, _out); - factory.start(); - - _out.println(" method.setMaxStack();"); - _out.println(" method.setMaxLocals();"); - _out.println(" _cg.addMethod(method.getMethod());"); - _out.println(" il.dispose();"); - } + public void visitField( Field field ) { + _out.println(); + _out.println(" field = new FieldGen(" + printFlags(field.getAccessFlags()) + ", " + + printType(field.getSignature()) + ", \"" + field.getName() + "\", _cp);"); + ConstantValue cv = field.getConstantValue(); + if (cv != null) { + String value = cv.toString(); + _out.println(" field.setInitValue(" + value + ")"); + } + _out.println(" _cg.addField(field.getField());"); + } - static String printFlags(int flags) { - return printFlags(flags, FLAG_FOR_UNKNOWN); - } - static String printFlags(int flags, int reason) { - if(flags == 0) - return "0"; + public void visitMethod( Method method ) { + MethodGen mg = new MethodGen(method, _clazz.getClassName(), _cp); + Type result_type = mg.getReturnType(); + Type[] arg_types = mg.getArgumentTypes(); + _out.println(" InstructionList il = new InstructionList();"); + _out.println(" MethodGen method = new MethodGen(" + + printFlags(method.getAccessFlags(), FLAG_FOR_METHOD) + ", " + + printType(result_type) + ", " + printArgumentTypes(arg_types) + ", " + + "new String[] { " + Utility.printArray(mg.getArgumentNames(), false, true) + + " }, \"" + method.getName() + "\", \"" + _clazz.getClassName() + "\", il, _cp);"); + _out.println(); + BCELFactory factory = new BCELFactory(mg, _out); + factory.start(); + _out.println(" method.setMaxStack();"); + _out.println(" method.setMaxLocals();"); + _out.println(" _cg.addMethod(method.getMethod());"); + _out.println(" il.dispose();"); + } - StringBuffer buf = new StringBuffer(); - for(int i=0, pow=1; i <= Constants.MAX_ACC_FLAG; i++) { - if((flags & pow) != 0) { - if((pow == Constants.ACC_SYNCHRONIZED) && (reason == FLAG_FOR_CLASS)) - buf.append("ACC_SUPER | "); - else if ((pow == Constants.ACC_VOLATILE) && (reason == FLAG_FOR_METHOD)) - buf.append("ACC_BRIDGE | "); - else if ((pow == Constants.ACC_TRANSIENT) && (reason == FLAG_FOR_METHOD)) - buf.append("ACC_VARARGS | "); - else - buf.append("ACC_").append(Constants.ACCESS_NAMES[i].toUpperCase(Locale.ENGLISH)).append(" | "); - } - pow <<= 1; + static String printFlags( int flags ) { + return printFlags(flags, FLAG_FOR_UNKNOWN); } - String str = buf.toString(); - return str.substring(0, str.length() - 3); - } - static String printArgumentTypes(Type[] arg_types) { - if(arg_types.length == 0) - return "Type.NO_ARGS"; - - StringBuffer args = new StringBuffer(); + static String printFlags( int flags, int reason ) { + if (flags == 0) { + return "0"; + } + StringBuffer buf = new StringBuffer(); + for (int i = 0, pow = 1; i <= Constants.MAX_ACC_FLAG; i++) { + if ((flags & pow) != 0) { + if ((pow == Constants.ACC_SYNCHRONIZED) && (reason == FLAG_FOR_CLASS)) { + buf.append("ACC_SUPER | "); + } else if ((pow == Constants.ACC_VOLATILE) && (reason == FLAG_FOR_METHOD)) { + buf.append("ACC_BRIDGE | "); + } else if ((pow == Constants.ACC_TRANSIENT) && (reason == FLAG_FOR_METHOD)) { + buf.append("ACC_VARARGS | "); + } else { + buf.append("ACC_") + .append(Constants.ACCESS_NAMES[i].toUpperCase(Locale.ENGLISH)).append( + " | "); + } + } + pow <<= 1; + } + String str = buf.toString(); + return str.substring(0, str.length() - 3); + } - for(int i=0; i < arg_types.length; i++) { - args.append(printType(arg_types[i])); - if(i < arg_types.length - 1) - args.append(", "); + static String printArgumentTypes( Type[] arg_types ) { + if (arg_types.length == 0) { + return "Type.NO_ARGS"; + } + StringBuffer args = new StringBuffer(); + for (int i = 0; i < arg_types.length; i++) { + args.append(printType(arg_types[i])); + if (i < arg_types.length - 1) { + args.append(", "); + } + } + return "new Type[] { " + args.toString() + " }"; } - return "new Type[] { " + args.toString() + " }"; - } - - static String printType(Type type) { - return printType(type.getSignature()); - } - static String printType(String signature) { - Type type = Type.getType(signature); - byte t = type.getType(); + static String printType( Type type ) { + return printType(type.getSignature()); + } - if(t <= Constants.T_VOID) { - return "Type." + Constants.TYPE_NAMES[t].toUpperCase(Locale.ENGLISH); - } else if(type.toString().equals("java.lang.String")) { - return "Type.STRING"; - } else if(type.toString().equals("java.lang.Object")) { - return "Type.OBJECT"; - } else if(type.toString().equals("java.lang.StringBuffer")) { - return "Type.STRINGBUFFER"; - } else if(type instanceof ArrayType) { - ArrayType at = (ArrayType)type; - return "new ArrayType(" + printType(at.getBasicType()) + - ", " + at.getDimensions() + ")"; - } else { - return "new ObjectType(\"" + Utility.signatureToString(signature, false) + - "\")"; + static String printType( String signature ) { + Type type = Type.getType(signature); + byte t = type.getType(); + if (t <= Constants.T_VOID) { + return "Type." + Constants.TYPE_NAMES[t].toUpperCase(Locale.ENGLISH); + } else if (type.toString().equals("java.lang.String")) { + return "Type.STRING"; + } else if (type.toString().equals("java.lang.Object")) { + return "Type.OBJECT"; + } else if (type.toString().equals("java.lang.StringBuffer")) { + return "Type.STRINGBUFFER"; + } else if (type instanceof ArrayType) { + ArrayType at = (ArrayType) type; + return "new ArrayType(" + printType(at.getBasicType()) + ", " + at.getDimensions() + + ")"; + } else { + return "new ObjectType(\"" + Utility.signatureToString(signature, false) + "\")"; + } } - } - - /** Default main method - */ - public static void main(String[] argv) throws Exception { - JavaClass java_class; - String name = argv[0]; - if((java_class = Repository.lookupClass(name)) == null) - java_class = new ClassParser(name).parse(); // May throw IOException - BCELifier bcelifier = new BCELifier(java_class, System.out); - bcelifier.start(); - } + /** Default main method + */ + public static void main( String[] argv ) throws Exception { + JavaClass java_class; + String name = argv[0]; + if ((java_class = Repository.lookupClass(name)) == null) { + java_class = new ClassParser(name).parse(); // May throw IOException + } + BCELifier bcelifier = new BCELifier(java_class, System.out); + bcelifier.start(); + } } diff --git a/src/java/org/apache/bcel/util/ByteSequence.java b/src/java/org/apache/bcel/util/ByteSequence.java index 70ad8904..fe8e631f 100644 --- a/src/java/org/apache/bcel/util/ByteSequence.java +++ b/src/java/org/apache/bcel/util/ByteSequence.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; import java.io.ByteArrayInputStream; @@ -28,19 +28,41 @@ import java.io.DataInputStream; * @author M. Dahm */ public final class ByteSequence extends DataInputStream { - private ByteArrayStream byte_stream; - public ByteSequence(byte[] bytes) { - super(new ByteArrayStream(bytes)); - byte_stream = (ByteArrayStream)in; - } + private ByteArrayStream byte_stream; + + + public ByteSequence(byte[] bytes) { + super(new ByteArrayStream(bytes)); + byte_stream = (ByteArrayStream) in; + } + + + public final int getIndex() { + return byte_stream.getPosition(); + } + + + final void unreadByte() { + byte_stream.unreadByte(); + } + + private static final class ByteArrayStream extends ByteArrayInputStream { + + ByteArrayStream(byte[] bytes) { + super(bytes); + } + + + final int getPosition() { + return pos; + } // is protected in ByteArrayInputStream - public final int getIndex() { return byte_stream.getPosition(); } - final void unreadByte() { byte_stream.unreadByte(); } - private static final class ByteArrayStream extends ByteArrayInputStream { - ByteArrayStream(byte[] bytes) { super(bytes); } - final int getPosition() { return pos; } // is protected in ByteArrayInputStream - final void unreadByte() { if(pos > 0) pos--; } - } + final void unreadByte() { + if (pos > 0) { + pos--; + } + } + } } diff --git a/src/java/org/apache/bcel/util/Class2HTML.java b/src/java/org/apache/bcel/util/Class2HTML.java index 846ed951..80df501e 100644 --- a/src/java/org/apache/bcel/util/Class2HTML.java +++ b/src/java/org/apache/bcel/util/Class2HTML.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; - import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -50,193 +49,183 @@ import org.apache.bcel.classfile.Utility; * * @version $Id$ * @author M. Dahm -*/ -public class Class2HTML implements Constants -{ - private JavaClass java_class; // current class object - private String dir; - - private static String class_package; // name of package, unclean to make it static, but ... - private static String class_name; // name of current class, dito - private static ConstantPool constant_pool; + */ +public class Class2HTML implements Constants { - /** - * Write contents of the given JavaClass into HTML files. - * - * @param java_class The class to write - * @param dir The directory to put the files in - */ - public Class2HTML(JavaClass java_class, String dir) throws IOException { - Method[] methods = java_class.getMethods(); + private JavaClass java_class; // current class object + private String dir; + private static String class_package; // name of package, unclean to make it static, but ... + private static String class_name; // name of current class, dito + private static ConstantPool constant_pool; - this.java_class = java_class; - this.dir = dir; - class_name = java_class.getClassName(); // Remember full name - constant_pool = java_class.getConstantPool(); - // Get package name by tacking off everything after the last `.' - int index = class_name.lastIndexOf('.'); - if(index > -1) - class_package = class_name.substring(0, index); - else - class_package = ""; // default package - - ConstantHTML constant_html = new ConstantHTML(dir, class_name, class_package, methods, - constant_pool); - - /* Attributes can't be written in one step, so we just open a file - * which will be written consequently. + /** + * Write contents of the given JavaClass into HTML files. + * + * @param java_class The class to write + * @param dir The directory to put the files in */ - AttributeHTML attribute_html = new AttributeHTML(dir, class_name, constant_pool, constant_html); - - MethodHTML method_html = new MethodHTML(dir, class_name, methods, java_class.getFields(), - constant_html, attribute_html); - // Write main file (with frames, yuk) - writeMainHTML(attribute_html); - new CodeHTML(dir, class_name, methods, constant_pool, constant_html); - attribute_html.close(); - } - - public static void main(String argv[]) - { - String[] file_name = new String[argv.length]; - int files=0; - ClassParser parser=null; - JavaClass java_class=null; - String zip_file = null; - char sep = System.getProperty("file.separator").toCharArray()[0]; - String dir = "." + sep; // Where to store HTML files - - try { - /* Parse command line arguments. - */ - for(int i=0; i < argv.length; i++) { - if(argv[i].charAt(0) == '-') { // command line switch - if(argv[i].equals("-d")) { // Specify target directory, default `.´ - dir = argv[++i]; - - if(!dir.endsWith("" + sep)) - dir = dir + sep; - - new File(dir).mkdirs(); // Create target directory if necessary - } - else if(argv[i].equals("-zip")) - zip_file = argv[++i]; - else - System.out.println("Unknown option " + argv[i]); - } - else // add file name to list */ - file_name[files++] = argv[i]; - } - - if(files == 0) - System.err.println("Class2HTML: No input files specified."); - else { // Loop through files ... - for(int i=0; i < files; i++) { - System.out.print("Processing " + file_name[i] + "..."); - if(zip_file == null) - parser = new ClassParser(file_name[i]); // Create parser object from file - else - parser = new ClassParser(zip_file, file_name[i]); // Create parser object from zip file - - java_class = parser.parse(); - new Class2HTML(java_class, dir); - System.out.println("Done."); - } - } - } catch(Exception e) { - System.out.println(e); - e.printStackTrace(System.out); + public Class2HTML(JavaClass java_class, String dir) throws IOException { + Method[] methods = java_class.getMethods(); + this.java_class = java_class; + this.dir = dir; + class_name = java_class.getClassName(); // Remember full name + constant_pool = java_class.getConstantPool(); + // Get package name by tacking off everything after the last `.' + int index = class_name.lastIndexOf('.'); + if (index > -1) { + class_package = class_name.substring(0, index); + } else { + class_package = ""; // default package + } + ConstantHTML constant_html = new ConstantHTML(dir, class_name, class_package, methods, + constant_pool); + /* Attributes can't be written in one step, so we just open a file + * which will be written consequently. + */ + AttributeHTML attribute_html = new AttributeHTML(dir, class_name, constant_pool, + constant_html); + MethodHTML method_html = new MethodHTML(dir, class_name, methods, java_class.getFields(), + constant_html, attribute_html); + // Write main file (with frames, yuk) + writeMainHTML(attribute_html); + new CodeHTML(dir, class_name, methods, constant_pool, constant_html); + attribute_html.close(); } - } - /** - * Utility method that converts a class reference in the constant pool, - * i.e., an index to a string. - */ - static String referenceClass(int index) { - String str = constant_pool.getConstantString(index, CONSTANT_Class); - str = Utility.compactClassName(str); - str = Utility.compactClassName(str, class_package + ".", true); - - return "" + str + ""; - } - static final String referenceType(String type) { - String short_type = Utility.compactClassName(type); - short_type = Utility.compactClassName(short_type, class_package + ".", true); + public static void main( String argv[] ) { + String[] file_name = new String[argv.length]; + int files = 0; + ClassParser parser = null; + JavaClass java_class = null; + String zip_file = null; + char sep = System.getProperty("file.separator").toCharArray()[0]; + String dir = "." + sep; // Where to store HTML files + try { + /* Parse command line arguments. + */ + for (int i = 0; i < argv.length; i++) { + if (argv[i].charAt(0) == '-') { // command line switch + if (argv[i].equals("-d")) { // Specify target directory, default `.´ + dir = argv[++i]; + if (!dir.endsWith("" + sep)) { + dir = dir + sep; + } + new File(dir).mkdirs(); // Create target directory if necessary + } else if (argv[i].equals("-zip")) { + zip_file = argv[++i]; + } else { + System.out.println("Unknown option " + argv[i]); + } + } else { + file_name[files++] = argv[i]; + } + } + if (files == 0) { + System.err.println("Class2HTML: No input files specified."); + } else { // Loop through files ... + for (int i = 0; i < files; i++) { + System.out.print("Processing " + file_name[i] + "..."); + if (zip_file == null) { + parser = new ClassParser(file_name[i]); // Create parser object from file + } else { + parser = new ClassParser(zip_file, file_name[i]); // Create parser object from zip file + } + java_class = parser.parse(); + new Class2HTML(java_class, dir); + System.out.println("Done."); + } + } + } catch (Exception e) { + System.out.println(e); + e.printStackTrace(System.out); + } + } - int index = type.indexOf('['); // Type is an array? - String base_type = type; - if (index > -1) { - base_type = type.substring(0, index); // Tack of the `[' + /** + * Utility method that converts a class reference in the constant pool, + * i.e., an index to a string. + */ + static String referenceClass( int index ) { + String str = constant_pool.getConstantString(index, CONSTANT_Class); + str = Utility.compactClassName(str); + str = Utility.compactClassName(str, class_package + ".", true); + return "" + str + + ""; } - // test for basic type - if (base_type.equals("int") - || base_type.equals("short") - || base_type.equals("boolean") - || base_type.equals("void") - || base_type.equals("char") - || base_type.equals("byte") - || base_type.equals("long") - || base_type.equals("double") - || base_type.equals("float")) { - return "" + type + ""; - } else { - return "" + short_type + ""; - } - } - static String toHTML(String str) { - StringBuffer buf = new StringBuffer(); + static final String referenceType( String type ) { + String short_type = Utility.compactClassName(type); + short_type = Utility.compactClassName(short_type, class_package + ".", true); + int index = type.indexOf('['); // Type is an array? + String base_type = type; + if (index > -1) { + base_type = type.substring(0, index); // Tack of the `[' + } + // test for basic type + if (base_type.equals("int") || base_type.equals("short") || base_type.equals("boolean") + || base_type.equals("void") || base_type.equals("char") || base_type.equals("byte") + || base_type.equals("long") || base_type.equals("double") + || base_type.equals("float")) { + return "" + type + ""; + } else { + return "" + short_type + ""; + } + } - try { // Filter any characters HTML doesn't like such as < and > in particular - for(int i=0; i < str.length(); i++) { - char ch; - - switch(ch=str.charAt(i)) { - case '<': buf.append("<"); break; - case '>': buf.append(">"); break; - case '\n': buf.append("\\n"); break; - case '\r': buf.append("\\r"); break; - default: buf.append(ch); - } - } - } catch(StringIndexOutOfBoundsException e) {} // Never occurs - return buf.toString(); - } - - private void writeMainHTML(AttributeHTML attribute_html) throws IOException { - PrintWriter file = new PrintWriter(new FileOutputStream(dir + class_name + ".html")); - Attribute[] attributes = java_class.getAttributes(); - - file.println("\n" + "Documentation for " + class_name + "" + - "\n" + - "\n" + - "\n" + - - "\n" + - "\n" + - "\n" + - - "\n" + - "\n" + - "\n" + - "" - ); + static String toHTML( String str ) { + StringBuffer buf = new StringBuffer(); + try { // Filter any characters HTML doesn't like such as < and > in particular + for (int i = 0; i < str.length(); i++) { + char ch; + switch (ch = str.charAt(i)) { + case '<': + buf.append("<"); + break; + case '>': + buf.append(">"); + break; + case '\n': + buf.append("\\n"); + break; + case '\r': + buf.append("\\r"); + break; + default: + buf.append(ch); + } + } + } catch (StringIndexOutOfBoundsException e) { + } // Never occurs + return buf.toString(); + } - file.close(); - for(int i=0; i < attributes.length; i++) - attribute_html.writeAttribute(attributes[i], "class" + i); - } + private void writeMainHTML( AttributeHTML attribute_html ) throws IOException { + PrintWriter file = new PrintWriter(new FileOutputStream(dir + class_name + ".html")); + Attribute[] attributes = java_class.getAttributes(); + file.println("\n" + "Documentation for " + class_name + "" + + "\n" + "\n" + + "\n" + "\n" + + "\n" + "\n" + + "\n" + "\n" + + "\n" + + ""); + file.close(); + for (int i = 0; i < attributes.length; i++) { + attribute_html.writeAttribute(attributes[i], "class" + i); + } + } } diff --git a/src/java/org/apache/bcel/util/ClassLoader.java b/src/java/org/apache/bcel/util/ClassLoader.java index 5ede489f..15f5f9c9 100644 --- a/src/java/org/apache/bcel/util/ClassLoader.java +++ b/src/java/org/apache/bcel/util/ClassLoader.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; - import java.io.ByteArrayInputStream; import java.util.Hashtable; import org.apache.bcel.Constants; @@ -52,140 +51,134 @@ import org.apache.bcel.classfile.Utility; * @see ClassPath */ public class ClassLoader extends java.lang.ClassLoader { - public static final String[] DEFAULT_IGNORED_PACKAGES = { - "java.", "javax.", "sun." - }; - - private Hashtable classes = new Hashtable(); // Hashtable is synchronized thus thread-safe - private String[] ignored_packages; - - private Repository repository = SyntheticRepository.getInstance(); - - /** Ignored packages are by default ( "java.", "sun.", - * "javax."), i.e. loaded by system class loader - */ - public ClassLoader() { - this(DEFAULT_IGNORED_PACKAGES); - } - - /** @param deferTo delegate class loader to use for ignored packages - */ - public ClassLoader(java.lang.ClassLoader deferTo) { - super(deferTo); - this.ignored_packages = DEFAULT_IGNORED_PACKAGES; - this.repository = new ClassLoaderRepository(deferTo); - } - - /** @param ignored_packages classes contained in these packages will be loaded - * with the system class loader - */ - public ClassLoader(String[] ignored_packages) { - this.ignored_packages = ignored_packages; - } - - /** @param ignored_packages classes contained in these packages will be loaded - * with the system class loader - * @param deferTo delegate class loader to use for ignored packages - */ - public ClassLoader(java.lang.ClassLoader deferTo, String [] ignored_packages) { - this(ignored_packages); - this.repository = new ClassLoaderRepository(deferTo); - } - - protected Class loadClass(String class_name, boolean resolve) - throws ClassNotFoundException - { - Class cl = null; - - /* First try: lookup hash table. + + public static final String[] DEFAULT_IGNORED_PACKAGES = { + "java.", "javax.", "sun." + }; + private Hashtable classes = new Hashtable(); // Hashtable is synchronized thus thread-safe + private String[] ignored_packages; + private Repository repository = SyntheticRepository.getInstance(); + + + /** Ignored packages are by default ( "java.", "sun.", + * "javax."), i.e. loaded by system class loader */ - if((cl=(Class)classes.get(class_name)) == null) { - /* Second try: Load system class using system class loader. You better - * don't mess around with them. - */ - for(int i=0; i < ignored_packages.length; i++) { - if(class_name.startsWith(ignored_packages[i])) { - cl = getParent().loadClass(class_name); - break; - } - } - - if(cl == null) { - JavaClass clazz = null; - - /* Third try: Special request? - */ - if(class_name.indexOf("$$BCEL$$") >= 0) - clazz = createClass(class_name); - else { // Fourth try: Load classes via repository - if ((clazz = repository.loadClass(class_name)) != null) { - clazz = modifyClass(clazz); - } - else - throw new ClassNotFoundException(class_name); - } - - if(clazz != null) { - byte[] bytes = clazz.getBytes(); - cl = defineClass(class_name, bytes, 0, bytes.length); - } else // Fourth try: Use default class loader - cl = Class.forName(class_name); - } - - if(resolve) - resolveClass(cl); + public ClassLoader() { + this(DEFAULT_IGNORED_PACKAGES); } - classes.put(class_name, cl); - - return cl; - } - - /** Override this method if you want to alter a class before it gets actually - * loaded. Does nothing by default. - */ - protected JavaClass modifyClass(JavaClass clazz) { - return clazz; - } - - /** - * Override this method to create you own classes on the fly. The - * name contains the special token $$BCEL$$. Everything before that - * token is consddered to be a package name. You can encode you own - * arguments into the subsequent string. You must regard however not - * to use any "illegal" characters, i.e., characters that may not - * appear in a Java class name too
          - * - * The default implementation interprets the string as a encoded compressed - * Java class, unpacks and decodes it with the Utility.decode() method, and - * parses the resulting byte array and returns the resulting JavaClass object. - * - * @param class_name compressed byte code with "$$BCEL$$" in it - */ - protected JavaClass createClass(String class_name) { - int index = class_name.indexOf("$$BCEL$$"); - String real_name = class_name.substring(index + 8); - - JavaClass clazz = null; - try { - byte[] bytes = Utility.decode(real_name, true); - ClassParser parser = new ClassParser(new ByteArrayInputStream(bytes), "foo"); - - clazz = parser.parse(); - } catch(Throwable e) { - e.printStackTrace(); - return null; + + /** @param deferTo delegate class loader to use for ignored packages + */ + public ClassLoader(java.lang.ClassLoader deferTo) { + super(deferTo); + this.ignored_packages = DEFAULT_IGNORED_PACKAGES; + this.repository = new ClassLoaderRepository(deferTo); } - // Adapt the class name to the passed value - ConstantPool cp = clazz.getConstantPool(); - ConstantClass cl = (ConstantClass)cp.getConstant(clazz.getClassNameIndex(), - Constants.CONSTANT_Class); - ConstantUtf8 name = (ConstantUtf8)cp.getConstant(cl.getNameIndex(), - Constants.CONSTANT_Utf8); - name.setBytes(class_name.replace('.', '/')); + /** @param ignored_packages classes contained in these packages will be loaded + * with the system class loader + */ + public ClassLoader(String[] ignored_packages) { + this.ignored_packages = ignored_packages; + } + - return clazz; - } + /** @param ignored_packages classes contained in these packages will be loaded + * with the system class loader + * @param deferTo delegate class loader to use for ignored packages + */ + public ClassLoader(java.lang.ClassLoader deferTo, String[] ignored_packages) { + this(ignored_packages); + this.repository = new ClassLoaderRepository(deferTo); + } + + + protected Class loadClass( String class_name, boolean resolve ) throws ClassNotFoundException { + Class cl = null; + /* First try: lookup hash table. + */ + if ((cl = (Class) classes.get(class_name)) == null) { + /* Second try: Load system class using system class loader. You better + * don't mess around with them. + */ + for (int i = 0; i < ignored_packages.length; i++) { + if (class_name.startsWith(ignored_packages[i])) { + cl = getParent().loadClass(class_name); + break; + } + } + if (cl == null) { + JavaClass clazz = null; + /* Third try: Special request? + */ + if (class_name.indexOf("$$BCEL$$") >= 0) { + clazz = createClass(class_name); + } else { // Fourth try: Load classes via repository + if ((clazz = repository.loadClass(class_name)) != null) { + clazz = modifyClass(clazz); + } else { + throw new ClassNotFoundException(class_name); + } + } + if (clazz != null) { + byte[] bytes = clazz.getBytes(); + cl = defineClass(class_name, bytes, 0, bytes.length); + } else { + cl = Class.forName(class_name); + } + } + if (resolve) { + resolveClass(cl); + } + } + classes.put(class_name, cl); + return cl; + } + + + /** Override this method if you want to alter a class before it gets actually + * loaded. Does nothing by default. + */ + protected JavaClass modifyClass( JavaClass clazz ) { + return clazz; + } + + + /** + * Override this method to create you own classes on the fly. The + * name contains the special token $$BCEL$$. Everything before that + * token is consddered to be a package name. You can encode you own + * arguments into the subsequent string. You must regard however not + * to use any "illegal" characters, i.e., characters that may not + * appear in a Java class name too
          + * + * The default implementation interprets the string as a encoded compressed + * Java class, unpacks and decodes it with the Utility.decode() method, and + * parses the resulting byte array and returns the resulting JavaClass object. + * + * @param class_name compressed byte code with "$$BCEL$$" in it + */ + protected JavaClass createClass( String class_name ) { + int index = class_name.indexOf("$$BCEL$$"); + String real_name = class_name.substring(index + 8); + JavaClass clazz = null; + try { + byte[] bytes = Utility.decode(real_name, true); + ClassParser parser = new ClassParser(new ByteArrayInputStream(bytes), "foo"); + clazz = parser.parse(); + } catch (Throwable e) { + e.printStackTrace(); + return null; + } + // Adapt the class name to the passed value + ConstantPool cp = clazz.getConstantPool(); + ConstantClass cl = (ConstantClass) cp.getConstant(clazz.getClassNameIndex(), + Constants.CONSTANT_Class); + ConstantUtf8 name = (ConstantUtf8) cp.getConstant(cl.getNameIndex(), + Constants.CONSTANT_Utf8); + name.setBytes(class_name.replace('.', '/')); + return clazz; + } } diff --git a/src/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/java/org/apache/bcel/util/ClassLoaderRepository.java index eff1373b..3a3c2906 100644 --- a/src/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; - import java.io.IOException; import java.io.InputStream; import java.util.HashMap; @@ -38,82 +37,85 @@ import org.apache.bcel.classfile.JavaClass; * @author David Dixon-Peugh */ public class ClassLoaderRepository implements Repository { - private java.lang.ClassLoader loader; - private Map loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS - - public ClassLoaderRepository(java.lang.ClassLoader loader) { - this.loader = loader; - } - - /** - * Store a new JavaClass into this Repository. - */ - public void storeClass(JavaClass clazz) { - loadedClasses.put(clazz.getClassName(), clazz); - clazz.setRepository(this); - } - - /** - * Remove class from repository - */ - public void removeClass(JavaClass clazz) { - loadedClasses.remove(clazz.getClassName()); - } - - /** - * Find an already defined JavaClass. - */ - public JavaClass findClass(String className) { - if (loadedClasses.containsKey(className)) { - return (JavaClass)loadedClasses.get(className); - } else { - return null; + + private java.lang.ClassLoader loader; + private Map loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS + + + public ClassLoaderRepository(java.lang.ClassLoader loader) { + this.loader = loader; } - } - /** - * Lookup a JavaClass object from the Class Name provided. - */ - public JavaClass loadClass(String className) throws ClassNotFoundException { - String classFile = className.replace('.', '/'); - JavaClass RC = findClass(className); - if (RC != null) { - return RC; + /** + * Store a new JavaClass into this Repository. + */ + public void storeClass( JavaClass clazz ) { + loadedClasses.put(clazz.getClassName(), clazz); + clazz.setRepository(this); } - try { - InputStream is = loader.getResourceAsStream(classFile + ".class"); - if (is == null) { - throw new ClassNotFoundException(className + " not found."); - } + /** + * Remove class from repository + */ + public void removeClass( JavaClass clazz ) { + loadedClasses.remove(clazz.getClassName()); + } + + + /** + * Find an already defined JavaClass. + */ + public JavaClass findClass( String className ) { + if (loadedClasses.containsKey(className)) { + return (JavaClass) loadedClasses.get(className); + } else { + return null; + } + } - ClassParser parser = new ClassParser(is, className); - RC = parser.parse(); - storeClass(RC); + /** + * Lookup a JavaClass object from the Class Name provided. + */ + public JavaClass loadClass( String className ) throws ClassNotFoundException { + String classFile = className.replace('.', '/'); + JavaClass RC = findClass(className); + if (RC != null) { + return RC; + } + try { + InputStream is = loader.getResourceAsStream(classFile + ".class"); + if (is == null) { + throw new ClassNotFoundException(className + " not found."); + } + ClassParser parser = new ClassParser(is, className); + RC = parser.parse(); + storeClass(RC); + return RC; + } catch (IOException e) { + throw new ClassNotFoundException(e.toString()); + } + } + + + public JavaClass loadClass( Class clazz ) throws ClassNotFoundException { + return loadClass(clazz.getName()); + } + + + /** Clear all entries from cache. + */ + public void clear() { + loadedClasses.clear(); + } + - return RC; - } catch (IOException e) { - throw new ClassNotFoundException(e.toString()); + /* + * @return null + */ + public ClassPath getClassPath() { + return null; } - } - - public JavaClass loadClass(Class clazz) throws ClassNotFoundException { - return loadClass(clazz.getName()); - } - - /** Clear all entries from cache. - */ - public void clear() { - loadedClasses.clear(); - } - - /* - * @return null - */ - public ClassPath getClassPath() { - return null; - } } diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/java/org/apache/bcel/util/ClassPath.java index 92025c49..c83716a1 100644 --- a/src/java/org/apache/bcel/util/ClassPath.java +++ b/src/java/org/apache/bcel/util/ClassPath.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; - import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; @@ -40,312 +39,358 @@ import java.util.zip.ZipFile; * @author M. Dahm */ public class ClassPath implements Serializable { - public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(); - - private PathEntry[] paths; - private String class_path; - - /** - * Search for classes in given path. - */ - public ClassPath(String class_path) { - this.class_path = class_path; - - List vec = new ArrayList(); - - for(StringTokenizer tok=new StringTokenizer(class_path, - System.getProperty("path.separator")); - tok.hasMoreTokens();) - { - String path = tok.nextToken(); - - if(!path.equals("")) { - File file = new File(path); - - try { - if(file.exists()) { - if(file.isDirectory()) - vec.add(new Dir(path)); - else - vec.add(new Zip(new ZipFile(file))); - } - } catch(IOException e) { - System.err.println("CLASSPATH component " + file + ": " + e); - } - } + + public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(); + private PathEntry[] paths; + private String class_path; + + + /** + * Search for classes in given path. + */ + public ClassPath(String class_path) { + this.class_path = class_path; + List vec = new ArrayList(); + for (StringTokenizer tok = new StringTokenizer(class_path, System + .getProperty("path.separator")); tok.hasMoreTokens();) { + String path = tok.nextToken(); + if (!path.equals("")) { + File file = new File(path); + try { + if (file.exists()) { + if (file.isDirectory()) { + vec.add(new Dir(path)); + } else { + vec.add(new Zip(new ZipFile(file))); + } + } + } catch (IOException e) { + System.err.println("CLASSPATH component " + file + ": " + e); + } + } + } + paths = new PathEntry[vec.size()]; + vec.toArray(paths); } - paths = new PathEntry[vec.size()]; - vec.toArray(paths); - } - - /** - * Search for classes in CLASSPATH. - * @deprecated Use SYSTEM_CLASS_PATH constant - */ - public ClassPath() { - this(getClassPath()); - } - - /** @return used class path string - */ - public String toString() { - return class_path; - } - - public int hashCode() { - return class_path.hashCode(); - } - - public boolean equals(Object o) { - if(o instanceof ClassPath) { - return class_path.equals(((ClassPath)o).class_path); + + /** + * Search for classes in CLASSPATH. + * @deprecated Use SYSTEM_CLASS_PATH constant + */ + public ClassPath() { + this(getClassPath()); } - return false; - } - private static final void getPathComponents(String path, List list) { - if(path != null) { - StringTokenizer tok = new StringTokenizer(path, File.pathSeparator); + /** @return used class path string + */ + public String toString() { + return class_path; + } - while(tok.hasMoreTokens()) { - String name = tok.nextToken(); - File file = new File(name); - if(file.exists()) - list.add(name); - } + public int hashCode() { + return class_path.hashCode(); } - } - - /** Checks for class path components in the following properties: - * "java.class.path", "sun.boot.class.path", "java.ext.dirs" - * - * @return class path as used by default by BCEL - */ - public static final String getClassPath() { - String class_path = System.getProperty("java.class.path"); - String boot_path = System.getProperty("sun.boot.class.path"); - String ext_path = System.getProperty("java.ext.dirs"); - - List list = new ArrayList(); - - getPathComponents(class_path, list); - getPathComponents(boot_path, list); - - List dirs = new ArrayList(); - getPathComponents(ext_path, dirs); - - for(Iterator e = dirs.iterator(); e.hasNext(); ) { - File ext_dir = new File((String)e.next()); - String[] extensions = ext_dir.list(new FilenameFilter() { - public boolean accept(File dir, String name) { - name = name.toLowerCase(Locale.ENGLISH); - return name.endsWith(".zip") || name.endsWith(".jar"); - } - }); - - if(extensions != null) - for(int i=0; i < extensions.length; i++) - list.add(ext_dir.getPath() + File.separatorChar + extensions[i]); + + + public boolean equals( Object o ) { + if (o instanceof ClassPath) { + return class_path.equals(((ClassPath) o).class_path); + } + return false; } - StringBuffer buf = new StringBuffer(); - for(Iterator e = list.iterator(); e.hasNext(); ) { - buf.append((String)e.next()); + private static final void getPathComponents( String path, List list ) { + if (path != null) { + StringTokenizer tok = new StringTokenizer(path, File.pathSeparator); + while (tok.hasMoreTokens()) { + String name = tok.nextToken(); + File file = new File(name); + if (file.exists()) { + list.add(name); + } + } + } + } - if(e.hasNext()) - buf.append(File.pathSeparatorChar); + + /** Checks for class path components in the following properties: + * "java.class.path", "sun.boot.class.path", "java.ext.dirs" + * + * @return class path as used by default by BCEL + */ + public static final String getClassPath() { + String class_path = System.getProperty("java.class.path"); + String boot_path = System.getProperty("sun.boot.class.path"); + String ext_path = System.getProperty("java.ext.dirs"); + List list = new ArrayList(); + getPathComponents(class_path, list); + getPathComponents(boot_path, list); + List dirs = new ArrayList(); + getPathComponents(ext_path, dirs); + for (Iterator e = dirs.iterator(); e.hasNext();) { + File ext_dir = new File((String) e.next()); + String[] extensions = ext_dir.list(new FilenameFilter() { + + public boolean accept( File dir, String name ) { + name = name.toLowerCase(Locale.ENGLISH); + return name.endsWith(".zip") || name.endsWith(".jar"); + } + }); + if (extensions != null) { + for (int i = 0; i < extensions.length; i++) { + list.add(ext_dir.getPath() + File.separatorChar + extensions[i]); + } + } + } + StringBuffer buf = new StringBuffer(); + for (Iterator e = list.iterator(); e.hasNext();) { + buf.append((String) e.next()); + if (e.hasNext()) { + buf.append(File.pathSeparatorChar); + } + } + return buf.toString().intern(); + } + + + /** + * @param name fully qualified class name, e.g. java.lang.String + * @return input stream for class + */ + public InputStream getInputStream( String name ) throws IOException { + return getInputStream(name.replace('.', '/'), ".class"); } - return buf.toString().intern(); - } - - /** - * @param name fully qualified class name, e.g. java.lang.String - * @return input stream for class - */ - public InputStream getInputStream(String name) throws IOException { - return getInputStream(name.replace('.','/'), ".class"); - } - - /** - * Return stream for class or resource on CLASSPATH. - * - * @param name fully qualified file name, e.g. java/lang/String - * @param suffix file name ends with suff, e.g. .java - * @return input stream for file on class path - */ - public InputStream getInputStream(String name, String suffix) throws IOException { - InputStream is = null; - - try { - is = getClass().getClassLoader().getResourceAsStream(name + suffix); - } catch(Exception e) { } - - if(is != null) - return is; - - return getClassFile(name, suffix).getInputStream(); - } - - /** - * @param name fully qualified file name, e.g. java/lang/String - * @param suffix file name ends with suff, e.g. .java - * @return class file for the java class - */ - public ClassFile getClassFile(String name, String suffix) throws IOException { - for(int i=0; i < paths.length; i++) { - ClassFile cf; - - if((cf = paths[i].getClassFile(name, suffix)) != null) - return cf; + + /** + * Return stream for class or resource on CLASSPATH. + * + * @param name fully qualified file name, e.g. java/lang/String + * @param suffix file name ends with suff, e.g. .java + * @return input stream for file on class path + */ + public InputStream getInputStream( String name, String suffix ) throws IOException { + InputStream is = null; + try { + is = getClass().getClassLoader().getResourceAsStream(name + suffix); + } catch (Exception e) { + } + if (is != null) { + return is; + } + return getClassFile(name, suffix).getInputStream(); } - throw new IOException("Couldn't find: " + name + suffix); - } - - /** - * @param name fully qualified class name, e.g. java.lang.String - * @return input stream for class - */ - public ClassFile getClassFile(String name) throws IOException { - return getClassFile(name, ".class"); - } - - /** - * @param name fully qualified file name, e.g. java/lang/String - * @param suffix file name ends with suffix, e.g. .java - * @return byte array for file on class path - */ - public byte[] getBytes(String name, String suffix) throws IOException { - DataInputStream dis = null; - try { - InputStream is = getInputStream(name, suffix); - - if(is == null) + + /** + * @param name fully qualified file name, e.g. java/lang/String + * @param suffix file name ends with suff, e.g. .java + * @return class file for the java class + */ + public ClassFile getClassFile( String name, String suffix ) throws IOException { + for (int i = 0; i < paths.length; i++) { + ClassFile cf; + if ((cf = paths[i].getClassFile(name, suffix)) != null) { + return cf; + } + } throw new IOException("Couldn't find: " + name + suffix); + } - dis = new DataInputStream(is); - byte[] bytes = new byte[is.available()]; - dis.readFully(bytes); - - return bytes; - } finally { - if (dis != null) - dis.close(); - } - } - - /** - * @return byte array for class - */ - public byte[] getBytes(String name) throws IOException { - return getBytes(name, ".class"); - } - - /** - * @param name name of file to search for, e.g. java/lang/String.java - * @return full (canonical) path for file - */ - public String getPath(String name) throws IOException { - int index = name.lastIndexOf('.'); - String suffix = ""; - - if(index > 0) { - suffix = name.substring(index); - name = name.substring(0, index); + + /** + * @param name fully qualified class name, e.g. java.lang.String + * @return input stream for class + */ + public ClassFile getClassFile( String name ) throws IOException { + return getClassFile(name, ".class"); } - - return getPath(name, suffix); - } - - /** - * @param name name of file to search for, e.g. java/lang/String - * @param suffix file name suffix, e.g. .java - * @return full (canonical) path for file, if it exists - */ - public String getPath(String name, String suffix) throws IOException { - return getClassFile(name, suffix).getPath(); - } - - private static abstract class PathEntry implements Serializable { - abstract ClassFile getClassFile(String name, String suffix) throws IOException; - } - - /** Contains information about file/ZIP entry of the Java class. - */ - public interface ClassFile { - /** @return input stream for class file. + + + /** + * @param name fully qualified file name, e.g. java/lang/String + * @param suffix file name ends with suffix, e.g. .java + * @return byte array for file on class path */ - public abstract InputStream getInputStream() throws IOException; + public byte[] getBytes( String name, String suffix ) throws IOException { + DataInputStream dis = null; + try { + InputStream is = getInputStream(name, suffix); + if (is == null) { + throw new IOException("Couldn't find: " + name + suffix); + } + dis = new DataInputStream(is); + byte[] bytes = new byte[is.available()]; + dis.readFully(bytes); + return bytes; + } finally { + if (dis != null) { + dis.close(); + } + } + } - /** @return canonical path to class file. + + /** + * @return byte array for class */ - public abstract String getPath(); + public byte[] getBytes( String name ) throws IOException { + return getBytes(name, ".class"); + } + - /** @return base path of found class, i.e. class is contained relative - * to that path, which may either denote a directory, or zip file + /** + * @param name name of file to search for, e.g. java/lang/String.java + * @return full (canonical) path for file */ - public abstract String getBase(); + public String getPath( String name ) throws IOException { + int index = name.lastIndexOf('.'); + String suffix = ""; + if (index > 0) { + suffix = name.substring(index); + name = name.substring(0, index); + } + return getPath(name, suffix); + } + - /** @return modification time of class file. + /** + * @param name name of file to search for, e.g. java/lang/String + * @param suffix file name suffix, e.g. .java + * @return full (canonical) path for file, if it exists */ - public abstract long getTime(); + public String getPath( String name, String suffix ) throws IOException { + return getClassFile(name, suffix).getPath(); + } + + private static abstract class PathEntry implements Serializable { + + abstract ClassFile getClassFile( String name, String suffix ) throws IOException; + } - /** @return size of class file. + /** Contains information about file/ZIP entry of the Java class. */ - public abstract long getSize(); - } - - private static class Dir extends PathEntry { - private String dir; - - Dir(String d) { dir = d; } - - ClassFile getClassFile(String name, String suffix) throws IOException { - final File file = new File(dir + File.separatorChar + - name.replace('.', File.separatorChar) + suffix); - - return file.exists()? new ClassFile() { - public InputStream getInputStream() throws IOException { return new FileInputStream(file); } - - public String getPath() { try { - return file.getCanonicalPath(); - } catch(IOException e) { return null; } - - } - public long getTime() { return file.lastModified(); } - public long getSize() { return file.length(); } - public String getBase() { return dir; } - - } : null; + public interface ClassFile { + + /** @return input stream for class file. + */ + public abstract InputStream getInputStream() throws IOException; + + + /** @return canonical path to class file. + */ + public abstract String getPath(); + + + /** @return base path of found class, i.e. class is contained relative + * to that path, which may either denote a directory, or zip file + */ + public abstract String getBase(); + + + /** @return modification time of class file. + */ + public abstract long getTime(); + + + /** @return size of class file. + */ + public abstract long getSize(); } - public String toString() { return dir; } - } + private static class Dir extends PathEntry { + + private String dir; + + + Dir(String d) { + dir = d; + } + + + ClassFile getClassFile( String name, String suffix ) throws IOException { + final File file = new File(dir + File.separatorChar + + name.replace('.', File.separatorChar) + suffix); + return file.exists() ? new ClassFile() { + + public InputStream getInputStream() throws IOException { + return new FileInputStream(file); + } + + + public String getPath() { + try { + return file.getCanonicalPath(); + } catch (IOException e) { + return null; + } + } + + + public long getTime() { + return file.lastModified(); + } - private static class Zip extends PathEntry { - private ZipFile zip; - Zip(ZipFile z) { zip = z; } + public long getSize() { + return file.length(); + } - ClassFile getClassFile(String name, String suffix) throws IOException { - final ZipEntry entry = zip.getEntry(name.replace('.', '/') + suffix); - return (entry != null)? new ClassFile() { - public InputStream getInputStream() throws IOException { return zip.getInputStream(entry); } - public String getPath() { return entry.toString(); } - public long getTime() { return entry.getTime(); } - public long getSize() { return entry.getSize(); } - public String getBase() { - return zip.getName(); - } - } : null; + public String getBase() { + return dir; + } + } : null; + } + + + public String toString() { + return dir; + } } - } -} + private static class Zip extends PathEntry { + + private ZipFile zip; + + + Zip(ZipFile z) { + zip = z; + } + + + ClassFile getClassFile( String name, String suffix ) throws IOException { + final ZipEntry entry = zip.getEntry(name.replace('.', '/') + suffix); + return (entry != null) ? new ClassFile() { + + public InputStream getInputStream() throws IOException { + return zip.getInputStream(entry); + } + + public String getPath() { + return entry.toString(); + } + + + public long getTime() { + return entry.getTime(); + } + + + public long getSize() { + return entry.getSize(); + } + + + public String getBase() { + return zip.getName(); + } + } : null; + } + } +} diff --git a/src/java/org/apache/bcel/util/ClassQueue.java b/src/java/org/apache/bcel/util/ClassQueue.java index cfd128d2..209c2c2f 100644 --- a/src/java/org/apache/bcel/util/ClassQueue.java +++ b/src/java/org/apache/bcel/util/ClassQueue.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; import java.util.LinkedList; @@ -25,19 +25,28 @@ import org.apache.bcel.classfile.JavaClass; * * @version $Id$ * @author M. Dahm -*/ + */ public class ClassQueue implements java.io.Serializable { - protected LinkedList vec = new LinkedList(); - public void enqueue(JavaClass clazz) { vec.addLast(clazz); } + protected LinkedList vec = new LinkedList(); - public JavaClass dequeue() { - return (JavaClass)vec.removeFirst(); - } - public boolean empty() { return vec.isEmpty(); } + public void enqueue( JavaClass clazz ) { + vec.addLast(clazz); + } - public String toString() { - return vec.toString(); - } -} + + public JavaClass dequeue() { + return (JavaClass) vec.removeFirst(); + } + + + public boolean empty() { + return vec.isEmpty(); + } + + + public String toString() { + return vec.toString(); + } +} diff --git a/src/java/org/apache/bcel/util/ClassSet.java b/src/java/org/apache/bcel/util/ClassSet.java index 36fb3e6b..ea21aad6 100644 --- a/src/java/org/apache/bcel/util/ClassSet.java +++ b/src/java/org/apache/bcel/util/ClassSet.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; import java.util.Collection; @@ -29,32 +29,41 @@ import org.apache.bcel.classfile.JavaClass; * @version $Id$ * @author M. Dahm * @see ClassStack -*/ + */ public class ClassSet implements java.io.Serializable { - private Map _map = new HashMap(); - public boolean add(JavaClass clazz) { - boolean result = false; + private Map _map = new HashMap(); - if(!_map.containsKey(clazz.getClassName())) { - result = true; - _map.put(clazz.getClassName(), clazz); + + public boolean add( JavaClass clazz ) { + boolean result = false; + if (!_map.containsKey(clazz.getClassName())) { + result = true; + _map.put(clazz.getClassName(), clazz); + } + return result; } - return result; - } - public void remove(JavaClass clazz) { _map.remove(clazz.getClassName()); } - public boolean empty() { return _map.isEmpty(); } + public void remove( JavaClass clazz ) { + _map.remove(clazz.getClassName()); + } + + + public boolean empty() { + return _map.isEmpty(); + } - public JavaClass[] toArray() { - Collection values = _map.values(); - JavaClass[] classes = new JavaClass[values.size()]; - values.toArray(classes); - return classes; - } - public String[] getClassNames() { - return (String[])_map.keySet().toArray(new String[_map.keySet().size()]); - } -} + public JavaClass[] toArray() { + Collection values = _map.values(); + JavaClass[] classes = new JavaClass[values.size()]; + values.toArray(classes); + return classes; + } + + + public String[] getClassNames() { + return (String[]) _map.keySet().toArray(new String[_map.keySet().size()]); + } +} diff --git a/src/java/org/apache/bcel/util/ClassStack.java b/src/java/org/apache/bcel/util/ClassStack.java index 93cde30d..16fd7037 100644 --- a/src/java/org/apache/bcel/util/ClassStack.java +++ b/src/java/org/apache/bcel/util/ClassStack.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; import java.util.Stack; @@ -25,12 +25,28 @@ import org.apache.bcel.classfile.JavaClass; * @version $Id$ * @author M. Dahm * @see Stack -*/ + */ public class ClassStack implements java.io.Serializable { - private Stack stack = new Stack(); - public void push(JavaClass clazz) { stack.push(clazz); } - public JavaClass pop() { return (JavaClass)stack.pop(); } - public JavaClass top() { return (JavaClass)stack.peek(); } - public boolean empty() { return stack.empty(); } -} + private Stack stack = new Stack(); + + + public void push( JavaClass clazz ) { + stack.push(clazz); + } + + + public JavaClass pop() { + return (JavaClass) stack.pop(); + } + + + public JavaClass top() { + return (JavaClass) stack.peek(); + } + + + public boolean empty() { + return stack.empty(); + } +} diff --git a/src/java/org/apache/bcel/util/ClassVector.java b/src/java/org/apache/bcel/util/ClassVector.java index 4b3c679a..b421e3ea 100644 --- a/src/java/org/apache/bcel/util/ClassVector.java +++ b/src/java/org/apache/bcel/util/ClassVector.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; import java.util.ArrayList; @@ -28,17 +28,30 @@ import org.apache.bcel.classfile.JavaClass; * @author M. Dahm * * @deprecated as of 5.1.1 - 7/17/2005 -*/ + */ public class ClassVector implements java.io.Serializable { - protected List vec = new ArrayList(); - - public void addElement(JavaClass clazz) { vec.add(clazz); } - public JavaClass elementAt(int index) { return (JavaClass)vec.get(index); } - public void removeElementAt(int index) { vec.remove(index); } - - public JavaClass[] toArray() { - JavaClass[] classes = new JavaClass[vec.size()]; - vec.toArray(classes); - return classes; - } + + protected List vec = new ArrayList(); + + + public void addElement( JavaClass clazz ) { + vec.add(clazz); + } + + + public JavaClass elementAt( int index ) { + return (JavaClass) vec.get(index); + } + + + public void removeElementAt( int index ) { + vec.remove(index); + } + + + public JavaClass[] toArray() { + JavaClass[] classes = new JavaClass[vec.size()]; + vec.toArray(classes); + return classes; + } } diff --git a/src/java/org/apache/bcel/util/CodeHTML.java b/src/java/org/apache/bcel/util/CodeHTML.java index b32cfaf4..10b2c7c1 100644 --- a/src/java/org/apache/bcel/util/CodeHTML.java +++ b/src/java/org/apache/bcel/util/CodeHTML.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; - import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; @@ -42,555 +41,524 @@ import org.apache.bcel.classfile.Utility; * */ final class CodeHTML implements org.apache.bcel.Constants { - private String class_name; // name of current class - private Method[] methods; // Methods to print - private PrintWriter file; // file to write to - private BitSet goto_set; - private ConstantPool constant_pool; - private ConstantHTML constant_html; - private static boolean wide=false; - - CodeHTML(String dir, String class_name, - Method[] methods, ConstantPool constant_pool, - ConstantHTML constant_html) throws IOException - { - this.class_name = class_name; - this.methods = methods; - this.constant_pool = constant_pool; - this.constant_html = constant_html; - - file = new PrintWriter(new FileOutputStream(dir + class_name + "_code.html")); - file.println(""); - - for(int i=0; i < methods.length; i++) - writeMethod(methods[i], i); - - file.println(""); - file.close(); - } - - /** - * Disassemble a stream of byte codes and return the - * string representation. - * - * @param stream data input stream - * @return String representation of byte code - */ - private final String codeToHTML(ByteSequence bytes, int method_number) - throws IOException - { - short opcode = (short)bytes.readUnsignedByte(); - StringBuffer buf; - String name, signature; - int default_offset=0, low, high; - int index, class_index, vindex, constant; - int[] jump_table; - int no_pad_bytes=0, offset; - - buf = new StringBuffer(256); - buf.append("").append(OPCODE_NAMES[opcode]).append(""); - - /* Special case: Skip (0-3) padding bytes, i.e., the - * following bytes are 4-byte-aligned - */ - if((opcode == TABLESWITCH) || (opcode == LOOKUPSWITCH)) { - int remainder = bytes.getIndex() % 4; - no_pad_bytes = (remainder == 0)? 0 : 4 - remainder; - - for(int i=0; i < no_pad_bytes; i++) - bytes.readByte(); - - // Both cases have a field default_offset in common - default_offset = bytes.readInt(); - } - - switch(opcode) { - case TABLESWITCH: - low = bytes.readInt(); - high = bytes.readInt(); - - offset = bytes.getIndex() - 12 - no_pad_bytes - 1; - default_offset += offset; - - buf.append(""); - - // Print switch indices in first row (and default) - jump_table = new int[high - low + 1]; - for(int i=0; i < jump_table.length; i++) { - jump_table[i] = offset + bytes.readInt(); - - buf.append(""); - } - buf.append("\n"); - - // Print target and default indices in second row - for(int i=0; i < jump_table.length; i++) - buf.append(""); - buf.append("\n
          ").append(low + i).append("default
          ").append(jump_table[i]).append("").append(default_offset).append("
          \n"); - - break; - - /* Lookup switch has variable length arguments. - */ - case LOOKUPSWITCH: - int npairs = bytes.readInt(); - offset = bytes.getIndex() - 8 - no_pad_bytes - 1; - jump_table = new int[npairs]; - default_offset += offset; - - buf.append(""); - - // Print switch indices in first row (and default) - for(int i=0; i < npairs; i++) { - int match = bytes.readInt(); - - jump_table[i] = offset + bytes.readInt(); - buf.append(""); - } - buf.append("\n"); - - // Print target and default indices in second row - for(int i=0; i < npairs; i++) - buf.append(""); - buf.append("\n
          ").append(match).append("default
          ").append(jump_table[i]).append("").append(default_offset).append("
          \n"); - break; - - /* Two address bytes + offset from start of byte stream form the - * jump target. - */ - case GOTO: case IFEQ: case IFGE: case IFGT: - case IFLE: case IFLT: - case IFNE: case IFNONNULL: case IFNULL: case IF_ACMPEQ: - case IF_ACMPNE: case IF_ICMPEQ: case IF_ICMPGE: case IF_ICMPGT: - case IF_ICMPLE: case IF_ICMPLT: case IF_ICMPNE: case JSR: - - index = (int)(bytes.getIndex() + bytes.readShort() - 1); - - buf.append("") - .append(index).append(""); - break; - - /* Same for 32-bit wide jumps - */ - case GOTO_W: case JSR_W: - int windex = bytes.getIndex() + bytes.readInt() - 1; - buf.append("") - .append(windex).append(""); - break; - - /* Index byte references local variable (register) - */ - case ALOAD: case ASTORE: case DLOAD: case DSTORE: case FLOAD: - case FSTORE: case ILOAD: case ISTORE: case LLOAD: case LSTORE: - case RET: - if(wide) { - vindex = bytes.readShort(); - wide=false; // Clear flag - } - else - vindex = bytes.readUnsignedByte(); - - buf.append("%").append(vindex); - break; - - /* - * Remember wide byte which is used to form a 16-bit address in the - * following instruction. Relies on that the method is called again with - * the following opcode. - */ - case WIDE: - wide = true; - buf.append("(wide)"); - break; - - /* Array of basic type. - */ - case NEWARRAY: - buf.append("").append(TYPE_NAMES[bytes.readByte()]).append(""); - break; - - /* Access object/class fields. - */ - case GETFIELD: case GETSTATIC: case PUTFIELD: case PUTSTATIC: - index = bytes.readShort(); - ConstantFieldref c1 = (ConstantFieldref)constant_pool.getConstant(index, CONSTANT_Fieldref); - - class_index = c1.getClassIndex(); - name = constant_pool.getConstantString(class_index, CONSTANT_Class); - name = Utility.compactClassName(name, false); - - index = c1.getNameAndTypeIndex(); - String field_name = constant_pool.constantToString(index, CONSTANT_NameAndType); - - if(name.equals(class_name)) { // Local field - buf.append("").append(field_name).append("\n"); - } - else - buf.append(constant_html.referenceConstant(class_index)).append(".").append(field_name); - - break; - - /* Operands are references to classes in constant pool - */ - case CHECKCAST: case INSTANCEOF: case NEW: - index = bytes.readShort(); - buf.append(constant_html.referenceConstant(index)); - break; - - /* Operands are references to methods in constant pool - */ - case INVOKESPECIAL: case INVOKESTATIC: case INVOKEVIRTUAL: case INVOKEINTERFACE: - int m_index = bytes.readShort(); - String str; - - if(opcode == INVOKEINTERFACE) { // Special treatment needed - int nargs = bytes.readUnsignedByte(); // Redundant - int reserved = bytes.readUnsignedByte(); // Reserved - - ConstantInterfaceMethodref c=(ConstantInterfaceMethodref)constant_pool.getConstant(m_index, CONSTANT_InterfaceMethodref); - - class_index = c.getClassIndex(); - str = constant_pool.constantToString(c); - index = c.getNameAndTypeIndex(); - } - else { - ConstantMethodref c = (ConstantMethodref)constant_pool.getConstant(m_index, CONSTANT_Methodref); - class_index = c.getClassIndex(); - - str = constant_pool.constantToString(c); - index = c.getNameAndTypeIndex(); - } - - name = Class2HTML.referenceClass(class_index); - str = Class2HTML.toHTML(constant_pool.constantToString(constant_pool.getConstant(index, CONSTANT_NameAndType))); - - // Get signature, i.e., types - ConstantNameAndType c2 = (ConstantNameAndType)constant_pool. - getConstant(index, CONSTANT_NameAndType); - signature = constant_pool.constantToString(c2.getSignatureIndex(), - CONSTANT_Utf8); - String[] args = Utility.methodSignatureArgumentTypes(signature, false); - String type = Utility.methodSignatureReturnType(signature, false); - - buf.append(name).append(".").append(str).append("").append("("); - - // List arguments - for(int i=0; i < args.length; i++) { - buf.append(Class2HTML.referenceType(args[i])); - - if(i < args.length - 1) - buf.append(", "); - } - // Attach return type - buf.append("):").append(Class2HTML.referenceType(type)); - - break; - - /* Operands are references to items in constant pool - */ - case LDC_W: case LDC2_W: - index = bytes.readShort(); - buf.append("") - .append(Class2HTML.toHTML(constant_pool.constantToString(index, - constant_pool. - getConstant(index).getTag()))) - .append(""); - break; - - case LDC: - index = bytes.readUnsignedByte(); - buf.append("") - .append(Class2HTML.toHTML(constant_pool.constantToString(index, - constant_pool. - getConstant(index).getTag()))) - .append(""); - break; - - /* Array of references. - */ - case ANEWARRAY: - index = bytes.readShort(); - - buf.append(constant_html.referenceConstant(index)); - break; - - /* Multidimensional array of references. - */ - case MULTIANEWARRAY: - index = bytes.readShort(); - int dimensions = bytes.readByte(); - buf.append(constant_html.referenceConstant(index)).append(":").append(dimensions).append("-dimensional"); - break; - - /* Increment local variable. - */ - case IINC: - if(wide) { - vindex = bytes.readShort(); - constant = bytes.readShort(); - wide = false; - } - else { - vindex = bytes.readUnsignedByte(); - constant = bytes.readByte(); - } - buf.append("%").append(vindex).append(" ").append(constant); - break; - - default: - if(NO_OF_OPERANDS[opcode] > 0) { - for(int i=0; i < TYPE_OF_OPERANDS[opcode].length; i++) { - switch(TYPE_OF_OPERANDS[opcode][i]) { - case T_BYTE: - buf.append(bytes.readUnsignedByte()); - break; - - case T_SHORT: // Either branch or index - buf.append(bytes.readShort()); - break; - - case T_INT: - buf.append(bytes.readInt()); - break; - - default: // Never reached - System.err.println("Unreachable default case reached!"); - System.exit(-1); - } - buf.append(" "); - } - } + private String class_name; // name of current class + private Method[] methods; // Methods to print + private PrintWriter file; // file to write to + private BitSet goto_set; + private ConstantPool constant_pool; + private ConstantHTML constant_html; + private static boolean wide = false; + + + CodeHTML(String dir, String class_name, Method[] methods, ConstantPool constant_pool, + ConstantHTML constant_html) throws IOException { + this.class_name = class_name; + this.methods = methods; + this.constant_pool = constant_pool; + this.constant_html = constant_html; + file = new PrintWriter(new FileOutputStream(dir + class_name + "_code.html")); + file.println(""); + for (int i = 0; i < methods.length; i++) { + writeMethod(methods[i], i); + } + file.println(""); + file.close(); } - buf.append(""); - return buf.toString(); - } - /** - * Find all target addresses in code, so that they can be marked - * with <A NAME = ...>. Target addresses are kept in an BitSet object. - */ - private final void findGotos(ByteSequence bytes, Method method, Code code) - throws IOException - { - int index; - goto_set = new BitSet(bytes.available()); - int opcode; - - /* First get Code attribute from method and the exceptions handled - * (try .. catch) in this method. We only need the line number here. + /** + * Disassemble a stream of byte codes and return the + * string representation. + * + * @param stream data input stream + * @return String representation of byte code */ - - if(code != null) { - CodeException[] ce = code.getExceptionTable(); - int len = ce.length; - - for(int i=0; i < len; i++) { - goto_set.set(ce[i].getStartPC()); - goto_set.set(ce[i].getEndPC()); - goto_set.set(ce[i].getHandlerPC()); - } - - // Look for local variables and their range - Attribute[] attributes = code.getAttributes(); - for(int i=0; i < attributes.length; i++) { - if(attributes[i].getTag() == ATTR_LOCAL_VARIABLE_TABLE) { - LocalVariable[] vars = ((LocalVariableTable)attributes[i]).getLocalVariableTable(); - - for(int j=0; j < vars.length; j++) { - int start = vars[j].getStartPC(); - int end = (int)(start + vars[j].getLength()); - goto_set.set(start); - goto_set.set(end); - } - break; - } - } + private final String codeToHTML( ByteSequence bytes, int method_number ) throws IOException { + short opcode = (short) bytes.readUnsignedByte(); + StringBuffer buf; + String name, signature; + int default_offset = 0, low, high; + int index, class_index, vindex, constant; + int[] jump_table; + int no_pad_bytes = 0, offset; + buf = new StringBuffer(256); + buf.append("").append(OPCODE_NAMES[opcode]).append(""); + /* Special case: Skip (0-3) padding bytes, i.e., the + * following bytes are 4-byte-aligned + */ + if ((opcode == TABLESWITCH) || (opcode == LOOKUPSWITCH)) { + int remainder = bytes.getIndex() % 4; + no_pad_bytes = (remainder == 0) ? 0 : 4 - remainder; + for (int i = 0; i < no_pad_bytes; i++) { + bytes.readByte(); + } + // Both cases have a field default_offset in common + default_offset = bytes.readInt(); + } + switch (opcode) { + case TABLESWITCH: + low = bytes.readInt(); + high = bytes.readInt(); + offset = bytes.getIndex() - 12 - no_pad_bytes - 1; + default_offset += offset; + buf.append(""); + // Print switch indices in first row (and default) + jump_table = new int[high - low + 1]; + for (int i = 0; i < jump_table.length; i++) { + jump_table[i] = offset + bytes.readInt(); + buf.append(""); + } + buf.append("\n"); + // Print target and default indices in second row + for (int i = 0; i < jump_table.length; i++) { + buf.append(""); + } + buf.append("\n
          ").append(low + i).append("default
          ").append(jump_table[i]).append("").append(default_offset).append( + "
          \n"); + break; + /* Lookup switch has variable length arguments. + */ + case LOOKUPSWITCH: + int npairs = bytes.readInt(); + offset = bytes.getIndex() - 8 - no_pad_bytes - 1; + jump_table = new int[npairs]; + default_offset += offset; + buf.append(""); + // Print switch indices in first row (and default) + for (int i = 0; i < npairs; i++) { + int match = bytes.readInt(); + jump_table[i] = offset + bytes.readInt(); + buf.append(""); + } + buf.append("\n"); + // Print target and default indices in second row + for (int i = 0; i < npairs; i++) { + buf.append(""); + } + buf.append("\n
          ").append(match).append("default
          ").append(jump_table[i]).append("").append(default_offset).append( + "
          \n"); + break; + /* Two address bytes + offset from start of byte stream form the + * jump target. + */ + case GOTO: + case IFEQ: + case IFGE: + case IFGT: + case IFLE: + case IFLT: + case IFNE: + case IFNONNULL: + case IFNULL: + case IF_ACMPEQ: + case IF_ACMPNE: + case IF_ICMPEQ: + case IF_ICMPGE: + case IF_ICMPGT: + case IF_ICMPLE: + case IF_ICMPLT: + case IF_ICMPNE: + case JSR: + index = (int) (bytes.getIndex() + bytes.readShort() - 1); + buf.append("").append(index).append(""); + break; + /* Same for 32-bit wide jumps + */ + case GOTO_W: + case JSR_W: + int windex = bytes.getIndex() + bytes.readInt() - 1; + buf.append("").append(windex).append(""); + break; + /* Index byte references local variable (register) + */ + case ALOAD: + case ASTORE: + case DLOAD: + case DSTORE: + case FLOAD: + case FSTORE: + case ILOAD: + case ISTORE: + case LLOAD: + case LSTORE: + case RET: + if (wide) { + vindex = bytes.readShort(); + wide = false; // Clear flag + } else { + vindex = bytes.readUnsignedByte(); + } + buf.append("%").append(vindex); + break; + /* + * Remember wide byte which is used to form a 16-bit address in the + * following instruction. Relies on that the method is called again with + * the following opcode. + */ + case WIDE: + wide = true; + buf.append("(wide)"); + break; + /* Array of basic type. + */ + case NEWARRAY: + buf.append("").append(TYPE_NAMES[bytes.readByte()]).append( + ""); + break; + /* Access object/class fields. + */ + case GETFIELD: + case GETSTATIC: + case PUTFIELD: + case PUTSTATIC: + index = bytes.readShort(); + ConstantFieldref c1 = (ConstantFieldref) constant_pool.getConstant(index, + CONSTANT_Fieldref); + class_index = c1.getClassIndex(); + name = constant_pool.getConstantString(class_index, CONSTANT_Class); + name = Utility.compactClassName(name, false); + index = c1.getNameAndTypeIndex(); + String field_name = constant_pool.constantToString(index, CONSTANT_NameAndType); + if (name.equals(class_name)) { // Local field + buf.append("").append(field_name) + .append("\n"); + } else { + buf.append(constant_html.referenceConstant(class_index)).append(".").append( + field_name); + } + break; + /* Operands are references to classes in constant pool + */ + case CHECKCAST: + case INSTANCEOF: + case NEW: + index = bytes.readShort(); + buf.append(constant_html.referenceConstant(index)); + break; + /* Operands are references to methods in constant pool + */ + case INVOKESPECIAL: + case INVOKESTATIC: + case INVOKEVIRTUAL: + case INVOKEINTERFACE: + int m_index = bytes.readShort(); + String str; + if (opcode == INVOKEINTERFACE) { // Special treatment needed + int nargs = bytes.readUnsignedByte(); // Redundant + int reserved = bytes.readUnsignedByte(); // Reserved + ConstantInterfaceMethodref c = (ConstantInterfaceMethodref) constant_pool + .getConstant(m_index, CONSTANT_InterfaceMethodref); + class_index = c.getClassIndex(); + str = constant_pool.constantToString(c); + index = c.getNameAndTypeIndex(); + } else { + ConstantMethodref c = (ConstantMethodref) constant_pool.getConstant(m_index, + CONSTANT_Methodref); + class_index = c.getClassIndex(); + str = constant_pool.constantToString(c); + index = c.getNameAndTypeIndex(); + } + name = Class2HTML.referenceClass(class_index); + str = Class2HTML.toHTML(constant_pool.constantToString(constant_pool.getConstant( + index, CONSTANT_NameAndType))); + // Get signature, i.e., types + ConstantNameAndType c2 = (ConstantNameAndType) constant_pool.getConstant(index, + CONSTANT_NameAndType); + signature = constant_pool.constantToString(c2.getSignatureIndex(), CONSTANT_Utf8); + String[] args = Utility.methodSignatureArgumentTypes(signature, false); + String type = Utility.methodSignatureReturnType(signature, false); + buf.append(name).append(".").append(str).append( + "").append("("); + // List arguments + for (int i = 0; i < args.length; i++) { + buf.append(Class2HTML.referenceType(args[i])); + if (i < args.length - 1) { + buf.append(", "); + } + } + // Attach return type + buf.append("):").append(Class2HTML.referenceType(type)); + break; + /* Operands are references to items in constant pool + */ + case LDC_W: + case LDC2_W: + index = bytes.readShort(); + buf.append("").append( + Class2HTML.toHTML(constant_pool.constantToString(index, + constant_pool.getConstant(index).getTag()))).append(""); + break; + case LDC: + index = bytes.readUnsignedByte(); + buf.append("").append( + Class2HTML.toHTML(constant_pool.constantToString(index, + constant_pool.getConstant(index).getTag()))).append(""); + break; + /* Array of references. + */ + case ANEWARRAY: + index = bytes.readShort(); + buf.append(constant_html.referenceConstant(index)); + break; + /* Multidimensional array of references. + */ + case MULTIANEWARRAY: + index = bytes.readShort(); + int dimensions = bytes.readByte(); + buf.append(constant_html.referenceConstant(index)).append(":").append(dimensions) + .append("-dimensional"); + break; + /* Increment local variable. + */ + case IINC: + if (wide) { + vindex = bytes.readShort(); + constant = bytes.readShort(); + wide = false; + } else { + vindex = bytes.readUnsignedByte(); + constant = bytes.readByte(); + } + buf.append("%").append(vindex).append(" ").append(constant); + break; + default: + if (NO_OF_OPERANDS[opcode] > 0) { + for (int i = 0; i < TYPE_OF_OPERANDS[opcode].length; i++) { + switch (TYPE_OF_OPERANDS[opcode][i]) { + case T_BYTE: + buf.append(bytes.readUnsignedByte()); + break; + case T_SHORT: // Either branch or index + buf.append(bytes.readShort()); + break; + case T_INT: + buf.append(bytes.readInt()); + break; + default: // Never reached + System.err.println("Unreachable default case reached!"); + System.exit(-1); + } + buf.append(" "); + } + } + } + buf.append(""); + return buf.toString(); } - // Get target addresses from GOTO, JSR, TABLESWITCH, etc. - for(int i=0; bytes.available() > 0; i++) { - opcode = bytes.readUnsignedByte(); - //System.out.println(OPCODE_NAMES[opcode]); - switch(opcode) { - case TABLESWITCH: case LOOKUPSWITCH: - //bytes.readByte(); // Skip already read byte - - int remainder = bytes.getIndex() % 4; - int no_pad_bytes = (remainder == 0)? 0 : 4 - remainder; - int default_offset, offset; - - for(int j=0; j < no_pad_bytes; j++) - bytes.readByte(); - - // Both cases have a field default_offset in common - default_offset = bytes.readInt(); - - if(opcode == TABLESWITCH) { - int low = bytes.readInt(); - int high = bytes.readInt(); - - offset = bytes.getIndex() - 12 - no_pad_bytes - 1; - default_offset += offset; - goto_set.set(default_offset); - - for(int j=0; j < (high - low + 1); j++) { - index = offset + bytes.readInt(); - goto_set.set(index); - } - } - else { // LOOKUPSWITCH - int npairs = bytes.readInt(); - - offset = bytes.getIndex() - 8 - no_pad_bytes - 1; - default_offset += offset; - goto_set.set(default_offset); - - for(int j=0; j < npairs; j++) { - int match = bytes.readInt(); - - index = offset + bytes.readInt(); - goto_set.set(index); - } - } - break; - - case GOTO: case IFEQ: case IFGE: case IFGT: - case IFLE: case IFLT: - case IFNE: case IFNONNULL: case IFNULL: case IF_ACMPEQ: - case IF_ACMPNE: case IF_ICMPEQ: case IF_ICMPGE: case IF_ICMPGT: - case IF_ICMPLE: case IF_ICMPLT: case IF_ICMPNE: case JSR: - //bytes.readByte(); // Skip already read byte - index = bytes.getIndex() + bytes.readShort() - 1; - - goto_set.set(index); - break; - - case GOTO_W: case JSR_W: - //bytes.readByte(); // Skip already read byte - index = bytes.getIndex() + bytes.readInt() - 1; - goto_set.set(index); - break; - default: - bytes.unreadByte(); - codeToHTML(bytes, 0); // Ignore output - } - } - } - - /** - * Write a single method with the byte code associated with it. - */ - private void writeMethod(Method method, int method_number) - throws IOException - { - // Get raw signature - String signature = method.getSignature(); - // Get array of strings containing the argument types - String[] args = Utility.methodSignatureArgumentTypes(signature, false); - // Get return type string - String type = Utility.methodSignatureReturnType(signature, false); - // Get method name - String name = method.getName(); - String html_name = Class2HTML.toHTML(name); - // Get method's access flags - String access = Utility.accessToString(method.getAccessFlags()); - access = Utility.replace(access, " ", " "); - // Get the method's attributes, the Code Attribute in particular - Attribute[] attributes= method.getAttributes(); - - file.print("

          " + access + " " + - "" + Class2HTML.referenceType(type) + - " " + html_name + "("); - - for(int i=0; i < args.length; i++) { - file.print(Class2HTML.referenceType(args[i])); - if(i < args.length - 1) - file.print(", "); - } - - file.println(")

          "); - - Code c=null; - byte[] code=null; - - if(attributes.length > 0) { - file.print("

          Attributes

            \n"); - for(int i=0; i < attributes.length; i++) { - byte tag = attributes[i].getTag(); - - if(tag != ATTR_UNKNOWN) - file.print("
          • " + ATTRIBUTE_NAMES[tag] + "
          • \n"); - else - file.print("
          • " + attributes[i] + "
          • "); - - if(tag == ATTR_CODE) { - c = (Code)attributes[i]; - Attribute[] attributes2 = c.getAttributes(); - code = c.getCode(); - - file.print("
              "); - for(int j=0; j < attributes2.length; j++) { - tag = attributes2[j].getTag(); - file.print("
            • " + - ATTRIBUTE_NAMES[tag] + "
            • \n"); - - } - file.print("
            "); - } - } - file.println("
          "); + /** + * Find all target addresses in code, so that they can be marked + * with <A NAME = ...>. Target addresses are kept in an BitSet object. + */ + private final void findGotos( ByteSequence bytes, Method method, Code code ) throws IOException { + int index; + goto_set = new BitSet(bytes.available()); + int opcode; + /* First get Code attribute from method and the exceptions handled + * (try .. catch) in this method. We only need the line number here. + */ + if (code != null) { + CodeException[] ce = code.getExceptionTable(); + int len = ce.length; + for (int i = 0; i < len; i++) { + goto_set.set(ce[i].getStartPC()); + goto_set.set(ce[i].getEndPC()); + goto_set.set(ce[i].getHandlerPC()); + } + // Look for local variables and their range + Attribute[] attributes = code.getAttributes(); + for (int i = 0; i < attributes.length; i++) { + if (attributes[i].getTag() == ATTR_LOCAL_VARIABLE_TABLE) { + LocalVariable[] vars = ((LocalVariableTable) attributes[i]) + .getLocalVariableTable(); + for (int j = 0; j < vars.length; j++) { + int start = vars[j].getStartPC(); + int end = (int) (start + vars[j].getLength()); + goto_set.set(start); + goto_set.set(end); + } + break; + } + } + } + // Get target addresses from GOTO, JSR, TABLESWITCH, etc. + for (int i = 0; bytes.available() > 0; i++) { + opcode = bytes.readUnsignedByte(); + //System.out.println(OPCODE_NAMES[opcode]); + switch (opcode) { + case TABLESWITCH: + case LOOKUPSWITCH: + //bytes.readByte(); // Skip already read byte + int remainder = bytes.getIndex() % 4; + int no_pad_bytes = (remainder == 0) ? 0 : 4 - remainder; + int default_offset, + offset; + for (int j = 0; j < no_pad_bytes; j++) { + bytes.readByte(); + } + // Both cases have a field default_offset in common + default_offset = bytes.readInt(); + if (opcode == TABLESWITCH) { + int low = bytes.readInt(); + int high = bytes.readInt(); + offset = bytes.getIndex() - 12 - no_pad_bytes - 1; + default_offset += offset; + goto_set.set(default_offset); + for (int j = 0; j < (high - low + 1); j++) { + index = offset + bytes.readInt(); + goto_set.set(index); + } + } else { // LOOKUPSWITCH + int npairs = bytes.readInt(); + offset = bytes.getIndex() - 8 - no_pad_bytes - 1; + default_offset += offset; + goto_set.set(default_offset); + for (int j = 0; j < npairs; j++) { + int match = bytes.readInt(); + index = offset + bytes.readInt(); + goto_set.set(index); + } + } + break; + case GOTO: + case IFEQ: + case IFGE: + case IFGT: + case IFLE: + case IFLT: + case IFNE: + case IFNONNULL: + case IFNULL: + case IF_ACMPEQ: + case IF_ACMPNE: + case IF_ICMPEQ: + case IF_ICMPGE: + case IF_ICMPGT: + case IF_ICMPLE: + case IF_ICMPLT: + case IF_ICMPNE: + case JSR: + //bytes.readByte(); // Skip already read byte + index = bytes.getIndex() + bytes.readShort() - 1; + goto_set.set(index); + break; + case GOTO_W: + case JSR_W: + //bytes.readByte(); // Skip already read byte + index = bytes.getIndex() + bytes.readInt() - 1; + goto_set.set(index); + break; + default: + bytes.unreadByte(); + codeToHTML(bytes, 0); // Ignore output + } + } } - if(code != null) { // No code, an abstract method, e.g. - //System.out.println(name + "\n" + Utility.codeToString(code, constant_pool, 0, -1)); - - // Print the byte code - ByteSequence stream = new ByteSequence(code); - stream.mark(stream.available()); - findGotos(stream, method, c); - stream.reset(); - - file.println("" + - ""); - - for(int i=0; stream.available() > 0; i++) { - int offset = stream.getIndex(); - String str = codeToHTML(stream, method_number); - String anchor = ""; - /* Set an anchor mark if this line is targetted by a goto, jsr, etc. - * Defining an anchor for every line is very inefficient! - */ - if(goto_set.get(offset)) - anchor = ""; - - String anchor2; - if(stream.getIndex() == code.length) // last loop - anchor2 = "" + offset + ""; - else - anchor2 = "" + offset; - - file.println(""); - } - - // Mark last line, may be targetted from Attributes window - file.println(""); - file.println("
          Byte
          offset
          InstructionArgument
          " + anchor2 + "" + anchor + str + "
          "); + /** + * Write a single method with the byte code associated with it. + */ + private void writeMethod( Method method, int method_number ) throws IOException { + // Get raw signature + String signature = method.getSignature(); + // Get array of strings containing the argument types + String[] args = Utility.methodSignatureArgumentTypes(signature, false); + // Get return type string + String type = Utility.methodSignatureReturnType(signature, false); + // Get method name + String name = method.getName(); + String html_name = Class2HTML.toHTML(name); + // Get method's access flags + String access = Utility.accessToString(method.getAccessFlags()); + access = Utility.replace(access, " ", " "); + // Get the method's attributes, the Code Attribute in particular + Attribute[] attributes = method.getAttributes(); + file.print("

          " + access + " " + "" + Class2HTML.referenceType(type) + " " + + html_name + "("); + for (int i = 0; i < args.length; i++) { + file.print(Class2HTML.referenceType(args[i])); + if (i < args.length - 1) { + file.print(", "); + } + } + file.println(")

          "); + Code c = null; + byte[] code = null; + if (attributes.length > 0) { + file.print("

          Attributes

            \n"); + for (int i = 0; i < attributes.length; i++) { + byte tag = attributes[i].getTag(); + if (tag != ATTR_UNKNOWN) { + file.print("
          • " + + ATTRIBUTE_NAMES[tag] + "
          • \n"); + } else { + file.print("
          • " + attributes[i] + "
          • "); + } + if (tag == ATTR_CODE) { + c = (Code) attributes[i]; + Attribute[] attributes2 = c.getAttributes(); + code = c.getCode(); + file.print("
              "); + for (int j = 0; j < attributes2.length; j++) { + tag = attributes2[j].getTag(); + file.print("
            • " + + ATTRIBUTE_NAMES[tag] + "
            • \n"); + } + file.print("
            "); + } + } + file.println("
          "); + } + if (code != null) { // No code, an abstract method, e.g. + //System.out.println(name + "\n" + Utility.codeToString(code, constant_pool, 0, -1)); + // Print the byte code + ByteSequence stream = new ByteSequence(code); + stream.mark(stream.available()); + findGotos(stream, method, c); + stream.reset(); + file.println("" + + ""); + for (int i = 0; stream.available() > 0; i++) { + int offset = stream.getIndex(); + String str = codeToHTML(stream, method_number); + String anchor = ""; + /* Set an anchor mark if this line is targetted by a goto, jsr, etc. + * Defining an anchor for every line is very inefficient! + */ + if (goto_set.get(offset)) { + anchor = ""; + } + String anchor2; + if (stream.getIndex() == code.length) { + anchor2 = "" + offset + + ""; + } else { + anchor2 = "" + offset; + } + file + .println(""); + } + // Mark last line, may be targetted from Attributes window + file.println(""); + file.println("
          Byte
          offset
          InstructionArgument
          " + anchor2 + "" + anchor + str + + "
          "); + } } - - } } diff --git a/src/java/org/apache/bcel/util/ConstantHTML.java b/src/java/org/apache/bcel/util/ConstantHTML.java index d7fc5182..8c37f310 100644 --- a/src/java/org/apache/bcel/util/ConstantHTML.java +++ b/src/java/org/apache/bcel/util/ConstantHTML.java @@ -1,4 +1,3 @@ - /* * Copyright 2000-2004 The Apache Software Foundation * @@ -14,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; - import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; @@ -40,197 +38,197 @@ import org.apache.bcel.classfile.Utility; * */ final class ConstantHTML implements org.apache.bcel.Constants { - private String class_name; // name of current class - private String class_package; // name of package - private ConstantPool constant_pool; // reference to constant pool - private PrintWriter file; // file to write to - private String[] constant_ref; // String to return for cp[i] - private Constant[] constants; // The constants in the cp - private Method[] methods; - ConstantHTML(String dir, String class_name, String class_package, Method[] methods, - ConstantPool constant_pool) throws IOException - { - this.class_name = class_name; - this.class_package = class_package; - this.constant_pool = constant_pool; - this.methods = methods; - constants = constant_pool.getConstantPool(); - file = new PrintWriter(new FileOutputStream(dir + class_name + "_cp.html")); - constant_ref = new String[constants.length]; - constant_ref[0] = "<unknown>"; - - file.println(""); - - // Loop through constants, constants[0] is reserved - for(int i=1; i < constants.length; i++) { - if(i % 2 == 0) - file.print("\n"); + private String class_name; // name of current class + private String class_package; // name of package + private ConstantPool constant_pool; // reference to constant pool + private PrintWriter file; // file to write to + private String[] constant_ref; // String to return for cp[i] + private Constant[] constants; // The constants in the cp + private Method[] methods; + + + ConstantHTML(String dir, String class_name, String class_package, Method[] methods, + ConstantPool constant_pool) throws IOException { + this.class_name = class_name; + this.class_package = class_package; + this.constant_pool = constant_pool; + this.methods = methods; + constants = constant_pool.getConstantPool(); + file = new PrintWriter(new FileOutputStream(dir + class_name + "_cp.html")); + constant_ref = new String[constants.length]; + constant_ref[0] = "<unknown>"; + file.println("
          "); - else - file.print("
          "); - - if(constants[i] != null) - writeConstant(i); - - file.print("
          "); + // Loop through constants, constants[0] is reserved + for (int i = 1; i < constants.length; i++) { + if (i % 2 == 0) { + file.print("\n"); + } + file.println("
          "); + } else { + file.print("
          "); + } + if (constants[i] != null) { + writeConstant(i); + } + file.print("
          "); + file.close(); } - - file.println(""); - file.close(); - } - - String referenceConstant(int index) { - return constant_ref[index]; - } - - private void writeConstant(int index) { - byte tag = constants[index].getTag(); - int class_index, name_index; - String ref; - - // The header is always the same - file.println("

          " + index + " " + CONSTANT_NAMES[tag] + "

          "); - - /* For every constant type get the needed parameters and print them appropiately - */ - switch(tag) { - case CONSTANT_InterfaceMethodref: - case CONSTANT_Methodref: - // Get class_index and name_and_type_index, depending on type - if(tag == CONSTANT_Methodref) { - ConstantMethodref c = (ConstantMethodref)constant_pool.getConstant(index, CONSTANT_Methodref); - class_index = c.getClassIndex(); - name_index = c.getNameAndTypeIndex(); - } - else { - ConstantInterfaceMethodref c1 = (ConstantInterfaceMethodref)constant_pool.getConstant(index, CONSTANT_InterfaceMethodref); - class_index = c1.getClassIndex(); - name_index = c1.getNameAndTypeIndex(); - } - - // Get method name and its class - String method_name = constant_pool.constantToString(name_index, CONSTANT_NameAndType); - String html_method_name = Class2HTML.toHTML(method_name); - - // Partially compacted class name, i.e., / -> . - String method_class = constant_pool.constantToString(class_index, CONSTANT_Class); - String short_method_class = Utility.compactClassName(method_class); // I.e., remove java.lang. - short_method_class = Utility.compactClassName(method_class); // I.e., remove java.lang. - short_method_class = Utility.compactClassName(short_method_class, class_package + ".", true); // Remove class package prefix - - // Get method signature - ConstantNameAndType c2 = (ConstantNameAndType)constant_pool.getConstant(name_index, CONSTANT_NameAndType); - String signature = constant_pool.constantToString(c2.getSignatureIndex(), CONSTANT_Utf8); - // Get array of strings containing the argument types - String[] args = Utility.methodSignatureArgumentTypes(signature, false); - - // Get return type string - String type = Utility.methodSignatureReturnType(signature, false); - String ret_type = Class2HTML.referenceType(type); - - StringBuffer buf = new StringBuffer("("); - for(int i=0; i < args.length; i++) { - buf.append(Class2HTML.referenceType(args[i])); - if(i < args.length - 1) - buf.append(", "); - } - buf.append(")"); - String arg_types = buf.toString(); - - if(method_class.equals(class_name)) // Method is local to class - ref = "" + html_method_name + ""; - else - ref = "" + short_method_class + - "." + html_method_name; - constant_ref[index] = ret_type + " " + - short_method_class + "." + html_method_name + " " + arg_types; - - file.println("

          " + ret_type + " " + ref + arg_types + " \n

          "); - break; - - case CONSTANT_Fieldref: - // Get class_index and name_and_type_index - ConstantFieldref c3 = (ConstantFieldref)constant_pool.getConstant(index, CONSTANT_Fieldref); - class_index = c3.getClassIndex(); - name_index = c3.getNameAndTypeIndex(); - - // Get method name and its class (compacted) - String field_class = constant_pool.constantToString(class_index, CONSTANT_Class); - String short_field_class = Utility.compactClassName(field_class); // I.e., remove java.lang. - short_field_class = Utility.compactClassName(short_field_class, class_package + ".", true); // Remove class package prefix - - String field_name = constant_pool.constantToString(name_index, CONSTANT_NameAndType); - - if(field_class.equals(class_name)) // Field is local to class - ref = "" + field_name + ""; - else - ref = "" + - short_field_class + "." + field_name + "\n"; - - constant_ref[index] = "" + - short_field_class + "." + field_name + ""; - - file.println("

          " + ref + "
          \n" + "

          "); - break; - - case CONSTANT_Class: - ConstantClass c4 = (ConstantClass)constant_pool.getConstant(index, CONSTANT_Class); - name_index = c4.getNameIndex(); - String class_name2 = constant_pool.constantToString(index, tag); // / -> . - String short_class_name = Utility.compactClassName(class_name2); // I.e., remove java.lang. - short_class_name = Utility.compactClassName(short_class_name, class_package + ".", true); // Remove class package prefix - - ref = "" + short_class_name + ""; - constant_ref[index] = "" + short_class_name + ""; - - file.println("

          " + ref + "

          \n"); - break; - - case CONSTANT_String: - ConstantString c5 = (ConstantString)constant_pool.getConstant(index, CONSTANT_String); - name_index = c5.getStringIndex(); + String referenceConstant( int index ) { + return constant_ref[index]; + } - String str = Class2HTML.toHTML(constant_pool.constantToString(index, tag)); - - file.println("

          " + str + "

          \n"); - break; - - case CONSTANT_NameAndType: - ConstantNameAndType c6 = (ConstantNameAndType)constant_pool.getConstant(index, CONSTANT_NameAndType); - name_index = c6.getNameIndex(); - int signature_index = c6.getSignatureIndex(); - file.println("

          " + Class2HTML.toHTML(constant_pool.constantToString(index, tag)) + "

          \n"); - break; + private void writeConstant( int index ) { + byte tag = constants[index].getTag(); + int class_index, name_index; + String ref; + // The header is always the same + file.println("

          " + index + " " + CONSTANT_NAMES[tag] + + "

          "); + /* For every constant type get the needed parameters and print them appropiately + */ + switch (tag) { + case CONSTANT_InterfaceMethodref: + case CONSTANT_Methodref: + // Get class_index and name_and_type_index, depending on type + if (tag == CONSTANT_Methodref) { + ConstantMethodref c = (ConstantMethodref) constant_pool.getConstant(index, + CONSTANT_Methodref); + class_index = c.getClassIndex(); + name_index = c.getNameAndTypeIndex(); + } else { + ConstantInterfaceMethodref c1 = (ConstantInterfaceMethodref) constant_pool + .getConstant(index, CONSTANT_InterfaceMethodref); + class_index = c1.getClassIndex(); + name_index = c1.getNameAndTypeIndex(); + } + // Get method name and its class + String method_name = constant_pool.constantToString(name_index, + CONSTANT_NameAndType); + String html_method_name = Class2HTML.toHTML(method_name); + // Partially compacted class name, i.e., / -> . + String method_class = constant_pool.constantToString(class_index, CONSTANT_Class); + String short_method_class = Utility.compactClassName(method_class); // I.e., remove java.lang. + short_method_class = Utility.compactClassName(method_class); // I.e., remove java.lang. + short_method_class = Utility.compactClassName(short_method_class, class_package + + ".", true); // Remove class package prefix + // Get method signature + ConstantNameAndType c2 = (ConstantNameAndType) constant_pool.getConstant( + name_index, CONSTANT_NameAndType); + String signature = constant_pool.constantToString(c2.getSignatureIndex(), + CONSTANT_Utf8); + // Get array of strings containing the argument types + String[] args = Utility.methodSignatureArgumentTypes(signature, false); + // Get return type string + String type = Utility.methodSignatureReturnType(signature, false); + String ret_type = Class2HTML.referenceType(type); + StringBuffer buf = new StringBuffer("("); + for (int i = 0; i < args.length; i++) { + buf.append(Class2HTML.referenceType(args[i])); + if (i < args.length - 1) { + buf.append(", "); + } + } + buf.append(")"); + String arg_types = buf.toString(); + if (method_class.equals(class_name)) { + ref = "" + + html_method_name + ""; + } else { + ref = "" + + short_method_class + "." + html_method_name; + } + constant_ref[index] = ret_type + " " + short_method_class + + "." + html_method_name + " " + arg_types; + file.println("

          " + ret_type + " " + ref + arg_types + + " \n

          "); + break; + case CONSTANT_Fieldref: + // Get class_index and name_and_type_index + ConstantFieldref c3 = (ConstantFieldref) constant_pool.getConstant(index, + CONSTANT_Fieldref); + class_index = c3.getClassIndex(); + name_index = c3.getNameAndTypeIndex(); + // Get method name and its class (compacted) + String field_class = constant_pool.constantToString(class_index, CONSTANT_Class); + String short_field_class = Utility.compactClassName(field_class); // I.e., remove java.lang. + short_field_class = Utility.compactClassName(short_field_class, + class_package + ".", true); // Remove class package prefix + String field_name = constant_pool + .constantToString(name_index, CONSTANT_NameAndType); + if (field_class.equals(class_name)) { + ref = "" + field_name + ""; + } else { + ref = "" + short_field_class + + "." + field_name + "\n"; + } + constant_ref[index] = "" + short_field_class + "." + + field_name + ""; + file.println("

          " + ref + "
          \n" + "

          "); + break; + case CONSTANT_Class: + ConstantClass c4 = (ConstantClass) constant_pool.getConstant(index, CONSTANT_Class); + name_index = c4.getNameIndex(); + String class_name2 = constant_pool.constantToString(index, tag); // / -> . + String short_class_name = Utility.compactClassName(class_name2); // I.e., remove java.lang. + short_class_name = Utility.compactClassName(short_class_name, class_package + ".", + true); // Remove class package prefix + ref = "" + short_class_name + + ""; + constant_ref[index] = "" + short_class_name + ""; + file.println("

          " + ref + "

          \n"); + break; + case CONSTANT_String: + ConstantString c5 = (ConstantString) constant_pool.getConstant(index, + CONSTANT_String); + name_index = c5.getStringIndex(); + String str = Class2HTML.toHTML(constant_pool.constantToString(index, tag)); + file.println("

          " + str + "

          \n"); + break; + case CONSTANT_NameAndType: + ConstantNameAndType c6 = (ConstantNameAndType) constant_pool.getConstant(index, + CONSTANT_NameAndType); + name_index = c6.getNameIndex(); + int signature_index = c6.getSignatureIndex(); + file.println("

          " + + Class2HTML.toHTML(constant_pool.constantToString(index, tag)) + + "

          \n"); + break; + default: + file + .println("

          " + + Class2HTML.toHTML(constant_pool.constantToString(index, tag)) + + "\n"); + } // switch + } - default: - file.println("

          " + Class2HTML.toHTML(constant_pool.constantToString(index, tag)) + "\n"); - } // switch - } - private final int getMethodNumber(String str) { - for(int i=0; i < methods.length; i++) { - String cmp = methods[i].getName() + methods[i].getSignature(); - if(cmp.equals(str)) - return i; + private final int getMethodNumber( String str ) { + for (int i = 0; i < methods.length; i++) { + String cmp = methods[i].getName() + methods[i].getSignature(); + if (cmp.equals(str)) { + return i; + } + } + return -1; } - return -1; - } } diff --git a/src/java/org/apache/bcel/util/InstructionFinder.java b/src/java/org/apache/bcel/util/InstructionFinder.java index b8eb8a37..57cb55ba 100644 --- a/src/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/java/org/apache/bcel/util/InstructionFinder.java @@ -65,422 +65,408 @@ import org.apache.bcel.generic.InstructionList; * @see InstructionList */ public class InstructionFinder { - private static final int OFFSET = 32767; // char + OFFSET is - // outside of - // LATIN-1 - private static final int NO_OPCODES = 256; // Potential number, - // some are not used - - private static final Map map = new HashMap(); // Map - - private InstructionList il; - private String il_string; // instruction list - // as string - private InstructionHandle[] handles; // map instruction - - // list to array - - /** - * @param il - * instruction list to search for given patterns - */ - public InstructionFinder(InstructionList il) { - this.il = il; - reread(); - } - - /** - * Reread the instruction list, e.g., after you've altered the list upon a - * match. - */ - public final void reread() { - int size = il.getLength(); - char[] buf = new char[size]; // Create a string with length equal to il - // length - handles = il.getInstructionHandles(); - - // Map opcodes to characters - for (int i = 0; i < size; i++) - buf[i] = makeChar(handles[i].getInstruction().getOpcode()); - - il_string = new String(buf); - } - - /** - * Map symbolic instruction names like "getfield" to a single character. - * - * @param pattern - * instruction pattern in lower case - * @return encoded string for a pattern such as "BranchInstruction". - */ - private static final String mapName(String pattern) { - String result = (String) map.get(pattern); - - if (result != null) - return result; - - for (short i = 0; i < NO_OPCODES; i++) - if (pattern.equals(Constants.OPCODE_NAMES[i])) - return "" + makeChar(i); - - throw new RuntimeException("Instruction unknown: " + pattern); - } - - /** - * Replace symbolic names of instructions with the appropiate character and - * remove all white space from string. Meta characters such as +, * are - * ignored. - * - * @param pattern - * The pattern to compile - * @return translated regular expression string - */ - private static final String compilePattern(String pattern) { - //Bug: 38787 - Instructions are assumed to be english, to avoid odd Locale issues - String lower = pattern.toLowerCase(Locale.ENGLISH); - StringBuffer buf = new StringBuffer(); - int size = pattern.length(); - - for (int i = 0; i < size; i++) { - char ch = lower.charAt(i); - - if (Character.isLetterOrDigit(ch)) { - StringBuffer name = new StringBuffer(); - - while ((Character.isLetterOrDigit(ch) || ch == '_') && i < size) { - name.append(ch); - - if (++i < size) - ch = lower.charAt(i); - else - break; - } - - i--; - - buf.append(mapName(name.toString())); - } else if (!Character.isWhitespace(ch)) - buf.append(ch); - } - - return buf.toString(); - } - - /** - * @return the matched piece of code as an array of instruction (handles) - */ - private InstructionHandle[] getMatch(int matched_from, int match_length) { - InstructionHandle[] match = new InstructionHandle[match_length]; - System.arraycopy(handles, matched_from, match, 0, match_length); - - return match; - } - - /** - * Search for the given pattern in the instruction list. You can search for - * any valid opcode via its symbolic name, e.g. "istore". You can also use a - * super class or an interface name to match a whole set of instructions, e.g. - * "BranchInstruction" or "LoadInstruction". "istore" is also an alias for all - * "istore_x" instructions. Additional aliases are "if" for "ifxx", "if_icmp" - * for "if_icmpxx", "if_acmp" for "if_acmpxx". - * - * Consecutive instruction names must be separated by white space which will - * be removed during the compilation of the pattern. - * - * For the rest the usual pattern matching rules for regular expressions - * apply. - *

          - * Example pattern: - * - *

          -	 * search("BranchInstruction NOP ((IfInstruction|GOTO)+ ISTORE Instruction)*");
          -	 * 
          - * - *

          - * If you alter the instruction list upon a match such that other matching - * areas are affected, you should call reread() to update the finder and call - * search() again, because the matches are cached. - * - * @param pattern - * the instruction pattern to search for, where case is ignored - * @param from - * where to start the search in the instruction list - * @param constraint - * optional CodeConstraint to check the found code pattern for - * user-defined constraints - * @return iterator of matches where e.nextElement() returns an array of - * instruction handles describing the matched area - */ - public final Iterator search(String pattern, InstructionHandle from, CodeConstraint constraint) { - String search = compilePattern(pattern); - int start = -1; - - for (int i = 0; i < handles.length; i++) { - if (handles[i] == from) { - start = i; // Where to start search from (index) - break; - } - } - - if (start == -1) - throw new ClassGenException("Instruction handle " + from + " not found in instruction list."); - - Pattern regex = Pattern.compile(search); - List matches = new ArrayList(); - - Matcher matcher = regex.matcher(il_string); - - while (start < il_string.length() && matcher.find(start)) { - int startExpr = matcher.start(); - int endExpr = matcher.end(); - int lenExpr = (endExpr - startExpr) + 1; - - InstructionHandle[] match = getMatch(startExpr, lenExpr); - - if ((constraint == null) || constraint.checkCode(match)) { - matches.add(match); - } - - start = endExpr; - } - - return matches.iterator(); - - } - - /** - * Start search beginning from the start of the given instruction list. - * - * @param pattern - * the instruction pattern to search for, where case is ignored - * @return iterator of matches where e.nextElement() returns an array of - * instruction handles describing the matched area - */ - public final Iterator search(String pattern) { - return search(pattern, il.getStart(), null); - } - - /** - * Start search beginning from `from'. - * - * @param pattern - * the instruction pattern to search for, where case is ignored - * @param from - * where to start the search in the instruction list - * @return iterator of matches where e.nextElement() returns an array of - * instruction handles describing the matched area - */ - public final Iterator search(String pattern, InstructionHandle from) { - return search(pattern, from, null); - } - - /** - * Start search beginning from the start of the given instruction list. Check - * found matches with the constraint object. - * - * @param pattern - * the instruction pattern to search for, case is ignored - * @param constraint - * constraints to be checked on matching code - * @return instruction handle or `null' if the match failed - */ - public final Iterator search(String pattern, CodeConstraint constraint) { - return search(pattern, il.getStart(), constraint); - } - - /** - * Convert opcode number to char. - */ - private static final char makeChar(short opcode) { - return (char) (opcode + OFFSET); - } - - /** - * @return the inquired instruction list - */ - public final InstructionList getInstructionList() { - return il; - } - - /** - * Code patterns found may be checked using an additional user-defined - * constraint object whether they really match the needed criterion. I.e., - * check constraints that can not expressed with regular expressions. - * - */ - public static interface CodeConstraint { - /** - * @param match - * array of instructions matching the requested pattern - * @return true if the matched area is really useful - */ - public boolean checkCode(InstructionHandle[] match); - } - - // Initialize pattern map - - static { - map - .put( - "arithmeticinstruction", - "(irem|lrem|iand|ior|ineg|isub|lneg|fneg|fmul|ldiv|fadd|lxor|frem|idiv|land|ixor|ishr|fsub|lshl|fdiv|iadd|lor|dmul|lsub|ishl|imul|lmul|lushr|dneg|iushr|lshr|ddiv|drem|dadd|ladd|dsub)"); - map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial)"); - map - .put( - "arrayinstruction", - "(baload|aastore|saload|caload|fastore|lastore|iaload|castore|iastore|aaload|bastore|sastore|faload|laload|daload|dastore)"); - map.put("gotoinstruction", "(goto|goto_w)"); - map.put("conversioninstruction", - "(d2l|l2d|i2s|d2i|l2i|i2b|l2f|d2f|f2i|i2d|i2l|f2d|i2c|f2l|i2f)"); - map.put("localvariableinstruction", - "(fstore|iinc|lload|dstore|dload|iload|aload|astore|istore|fload|lstore)"); - map.put("loadinstruction", "(fload|dload|lload|iload|aload)"); - map.put("fieldinstruction", "(getfield|putstatic|getstatic|putfield)"); - map - .put( - "cpinstruction", - "(ldc2_w|invokeinterface|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)"); - map.put("stackinstruction", "(dup2|swap|dup2_x2|pop|pop2|dup|dup2_x1|dup_x2|dup_x1)"); - map - .put( - "branchinstruction", - "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); - map.put("returninstruction", "(lreturn|ireturn|freturn|dreturn|areturn|return)"); - map.put("storeinstruction", "(istore|fstore|dstore|astore|lstore)"); - map.put("select", "(tableswitch|lookupswitch)"); - map - .put( - "ifinstruction", - "(ifeq|ifgt|if_icmpne|if_icmpeq|ifge|ifnull|ifne|if_icmple|if_icmpge|if_acmpeq|if_icmplt|if_acmpne|ifnonnull|iflt|if_icmpgt|ifle)"); - map.put("jsrinstruction", "(jsr|jsr_w)"); - map.put("variablelengthinstruction", "(tableswitch|jsr|goto|lookupswitch)"); - map.put("unconditionalbranch", "(goto|jsr|jsr_w|athrow|goto_w)"); - map.put("constantpushinstruction", "(dconst|bipush|sipush|fconst|iconst|lconst)"); - map - .put( - "typedinstruction", - "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)"); - map.put("popinstruction", "(fstore|dstore|pop|pop2|astore|putstatic|istore|lstore)"); - map.put("allocationinstruction", "(multianewarray|new|anewarray|newarray)"); - map - .put( - "indexedinstruction", - "(lload|lstore|fload|ldc2_w|invokeinterface|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)"); - map - .put( - "pushinstruction", - "(dup|lload|dup2|bipush|fload|ldc2_w|sipush|lconst|fconst|dload|getstatic|ldc_w|aconst_null|dconst|iload|ldc|iconst|aload)"); - map - .put( - "stackproducer", - "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)"); - map - .put( - "stackconsumer", - "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)"); - map - .put( - "exceptionthrower", - "(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|ldc|invokestatic|daload)"); - map - .put( - "loadclass", - "(multianewarray|invokeinterface|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)"); - map - .put( - "instructiontargeter", - "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); - - // Some aliases - map.put("if_icmp", "(if_icmpne|if_icmpeq|if_icmple|if_icmpge|if_icmplt|if_icmpgt)"); - map.put("if_acmp", "(if_acmpeq|if_acmpne)"); - map.put("if", "(ifeq|ifne|iflt|ifge|ifgt|ifle)"); - - // Precompile some aliases first - map.put("iconst", precompile(Constants.ICONST_0, Constants.ICONST_5, Constants.ICONST_M1)); - map.put("lconst", new String(new char[] { '(', makeChar(Constants.LCONST_0), '|', - makeChar(Constants.LCONST_1), ')' })); - map.put("dconst", new String(new char[] { '(', makeChar(Constants.DCONST_0), '|', - makeChar(Constants.DCONST_1), ')' })); - map.put("fconst", new String(new char[] { '(', makeChar(Constants.FCONST_0), '|', - makeChar(Constants.FCONST_1), ')' })); - - map.put("iload", precompile(Constants.ILOAD_0, Constants.ILOAD_3, Constants.ILOAD)); - map.put("dload", precompile(Constants.DLOAD_0, Constants.DLOAD_3, Constants.DLOAD)); - map.put("fload", precompile(Constants.FLOAD_0, Constants.FLOAD_3, Constants.FLOAD)); - map.put("aload", precompile(Constants.ALOAD_0, Constants.ALOAD_3, Constants.ALOAD)); - - map.put("istore", precompile(Constants.ISTORE_0, Constants.ISTORE_3, Constants.ISTORE)); - map.put("dstore", precompile(Constants.DSTORE_0, Constants.DSTORE_3, Constants.DSTORE)); - map.put("fstore", precompile(Constants.FSTORE_0, Constants.FSTORE_3, Constants.FSTORE)); - map.put("astore", precompile(Constants.ASTORE_0, Constants.ASTORE_3, Constants.ASTORE)); - - // Compile strings - - for (Iterator i = map.keySet().iterator(); i.hasNext();) { - String key = (String) i.next(); - String value = (String) map.get(key); - - char ch = value.charAt(1); // Omit already precompiled patterns - if (ch < OFFSET) { - map.put(key, compilePattern(value)); // precompile all patterns - } - } - - // Add instruction alias to match anything - - StringBuffer buf = new StringBuffer("("); - - for (short i = 0; i < NO_OPCODES; i++) { - if (Constants.NO_OF_OPERANDS[i] != Constants.UNDEFINED) { // Not an - // invalid - // opcode - buf.append(makeChar(i)); - - if (i < NO_OPCODES - 1) - buf.append('|'); - } - } - buf.append(')'); - - map.put("instruction", buf.toString()); - } - - private static String precompile(short from, short to, short extra) { - StringBuffer buf = new StringBuffer("("); - - for (short i = from; i <= to; i++) { - buf.append(makeChar(i)); - buf.append('|'); - } - - buf.append(makeChar(extra)); - buf.append(")"); - return buf.toString(); - } - - /* - * Internal debugging routines. - */ - private static final String pattern2string(String pattern) { - return pattern2string(pattern, true); - } - - private static final String pattern2string(String pattern, boolean make_string) { - StringBuffer buf = new StringBuffer(); - - for (int i = 0; i < pattern.length(); i++) { - char ch = pattern.charAt(i); - - if (ch >= OFFSET) { - if (make_string) - buf.append(Constants.OPCODE_NAMES[ch - OFFSET]); - else - buf.append((int) (ch - OFFSET)); - } else - buf.append(ch); - } - - return buf.toString(); - } + + private static final int OFFSET = 32767; // char + OFFSET is + // outside of + // LATIN-1 + private static final int NO_OPCODES = 256; // Potential number, + // some are not used + private static final Map map = new HashMap(); // Map + private InstructionList il; + private String il_string; // instruction list + // as string + private InstructionHandle[] handles; // map instruction + + + // list to array + /** + * @param il + * instruction list to search for given patterns + */ + public InstructionFinder(InstructionList il) { + this.il = il; + reread(); + } + + + /** + * Reread the instruction list, e.g., after you've altered the list upon a + * match. + */ + public final void reread() { + int size = il.getLength(); + char[] buf = new char[size]; // Create a string with length equal to il + // length + handles = il.getInstructionHandles(); + // Map opcodes to characters + for (int i = 0; i < size; i++) { + buf[i] = makeChar(handles[i].getInstruction().getOpcode()); + } + il_string = new String(buf); + } + + + /** + * Map symbolic instruction names like "getfield" to a single character. + * + * @param pattern + * instruction pattern in lower case + * @return encoded string for a pattern such as "BranchInstruction". + */ + private static final String mapName( String pattern ) { + String result = (String) map.get(pattern); + if (result != null) { + return result; + } + for (short i = 0; i < NO_OPCODES; i++) { + if (pattern.equals(Constants.OPCODE_NAMES[i])) { + return "" + makeChar(i); + } + } + throw new RuntimeException("Instruction unknown: " + pattern); + } + + + /** + * Replace symbolic names of instructions with the appropiate character and + * remove all white space from string. Meta characters such as +, * are + * ignored. + * + * @param pattern + * The pattern to compile + * @return translated regular expression string + */ + private static final String compilePattern( String pattern ) { + //Bug: 38787 - Instructions are assumed to be english, to avoid odd Locale issues + String lower = pattern.toLowerCase(Locale.ENGLISH); + StringBuffer buf = new StringBuffer(); + int size = pattern.length(); + for (int i = 0; i < size; i++) { + char ch = lower.charAt(i); + if (Character.isLetterOrDigit(ch)) { + StringBuffer name = new StringBuffer(); + while ((Character.isLetterOrDigit(ch) || ch == '_') && i < size) { + name.append(ch); + if (++i < size) { + ch = lower.charAt(i); + } else { + break; + } + } + i--; + buf.append(mapName(name.toString())); + } else if (!Character.isWhitespace(ch)) { + buf.append(ch); + } + } + return buf.toString(); + } + + + /** + * @return the matched piece of code as an array of instruction (handles) + */ + private InstructionHandle[] getMatch( int matched_from, int match_length ) { + InstructionHandle[] match = new InstructionHandle[match_length]; + System.arraycopy(handles, matched_from, match, 0, match_length); + return match; + } + + + /** + * Search for the given pattern in the instruction list. You can search for + * any valid opcode via its symbolic name, e.g. "istore". You can also use a + * super class or an interface name to match a whole set of instructions, e.g. + * "BranchInstruction" or "LoadInstruction". "istore" is also an alias for all + * "istore_x" instructions. Additional aliases are "if" for "ifxx", "if_icmp" + * for "if_icmpxx", "if_acmp" for "if_acmpxx". + * + * Consecutive instruction names must be separated by white space which will + * be removed during the compilation of the pattern. + * + * For the rest the usual pattern matching rules for regular expressions + * apply. + *

          + * Example pattern: + * + *

          +     * search("BranchInstruction NOP ((IfInstruction|GOTO)+ ISTORE Instruction)*");
          +     * 
          + * + *

          + * If you alter the instruction list upon a match such that other matching + * areas are affected, you should call reread() to update the finder and call + * search() again, because the matches are cached. + * + * @param pattern + * the instruction pattern to search for, where case is ignored + * @param from + * where to start the search in the instruction list + * @param constraint + * optional CodeConstraint to check the found code pattern for + * user-defined constraints + * @return iterator of matches where e.nextElement() returns an array of + * instruction handles describing the matched area + */ + public final Iterator search( String pattern, InstructionHandle from, CodeConstraint constraint ) { + String search = compilePattern(pattern); + int start = -1; + for (int i = 0; i < handles.length; i++) { + if (handles[i] == from) { + start = i; // Where to start search from (index) + break; + } + } + if (start == -1) { + throw new ClassGenException("Instruction handle " + from + + " not found in instruction list."); + } + Pattern regex = Pattern.compile(search); + List matches = new ArrayList(); + Matcher matcher = regex.matcher(il_string); + while (start < il_string.length() && matcher.find(start)) { + int startExpr = matcher.start(); + int endExpr = matcher.end(); + int lenExpr = (endExpr - startExpr) + 1; + InstructionHandle[] match = getMatch(startExpr, lenExpr); + if ((constraint == null) || constraint.checkCode(match)) { + matches.add(match); + } + start = endExpr; + } + return matches.iterator(); + } + + + /** + * Start search beginning from the start of the given instruction list. + * + * @param pattern + * the instruction pattern to search for, where case is ignored + * @return iterator of matches where e.nextElement() returns an array of + * instruction handles describing the matched area + */ + public final Iterator search( String pattern ) { + return search(pattern, il.getStart(), null); + } + + + /** + * Start search beginning from `from'. + * + * @param pattern + * the instruction pattern to search for, where case is ignored + * @param from + * where to start the search in the instruction list + * @return iterator of matches where e.nextElement() returns an array of + * instruction handles describing the matched area + */ + public final Iterator search( String pattern, InstructionHandle from ) { + return search(pattern, from, null); + } + + + /** + * Start search beginning from the start of the given instruction list. Check + * found matches with the constraint object. + * + * @param pattern + * the instruction pattern to search for, case is ignored + * @param constraint + * constraints to be checked on matching code + * @return instruction handle or `null' if the match failed + */ + public final Iterator search( String pattern, CodeConstraint constraint ) { + return search(pattern, il.getStart(), constraint); + } + + + /** + * Convert opcode number to char. + */ + private static final char makeChar( short opcode ) { + return (char) (opcode + OFFSET); + } + + + /** + * @return the inquired instruction list + */ + public final InstructionList getInstructionList() { + return il; + } + + /** + * Code patterns found may be checked using an additional user-defined + * constraint object whether they really match the needed criterion. I.e., + * check constraints that can not expressed with regular expressions. + * + */ + public static interface CodeConstraint { + + /** + * @param match + * array of instructions matching the requested pattern + * @return true if the matched area is really useful + */ + public boolean checkCode( InstructionHandle[] match ); + } + + // Initialize pattern map + static { + map + .put( + "arithmeticinstruction", + "(irem|lrem|iand|ior|ineg|isub|lneg|fneg|fmul|ldiv|fadd|lxor|frem|idiv|land|ixor|ishr|fsub|lshl|fdiv|iadd|lor|dmul|lsub|ishl|imul|lmul|lushr|dneg|iushr|lshr|ddiv|drem|dadd|ladd|dsub)"); + map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial)"); + map + .put( + "arrayinstruction", + "(baload|aastore|saload|caload|fastore|lastore|iaload|castore|iastore|aaload|bastore|sastore|faload|laload|daload|dastore)"); + map.put("gotoinstruction", "(goto|goto_w)"); + map.put("conversioninstruction", + "(d2l|l2d|i2s|d2i|l2i|i2b|l2f|d2f|f2i|i2d|i2l|f2d|i2c|f2l|i2f)"); + map.put("localvariableinstruction", + "(fstore|iinc|lload|dstore|dload|iload|aload|astore|istore|fload|lstore)"); + map.put("loadinstruction", "(fload|dload|lload|iload|aload)"); + map.put("fieldinstruction", "(getfield|putstatic|getstatic|putfield)"); + map + .put( + "cpinstruction", + "(ldc2_w|invokeinterface|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)"); + map.put("stackinstruction", "(dup2|swap|dup2_x2|pop|pop2|dup|dup2_x1|dup_x2|dup_x1)"); + map + .put( + "branchinstruction", + "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); + map.put("returninstruction", "(lreturn|ireturn|freturn|dreturn|areturn|return)"); + map.put("storeinstruction", "(istore|fstore|dstore|astore|lstore)"); + map.put("select", "(tableswitch|lookupswitch)"); + map + .put( + "ifinstruction", + "(ifeq|ifgt|if_icmpne|if_icmpeq|ifge|ifnull|ifne|if_icmple|if_icmpge|if_acmpeq|if_icmplt|if_acmpne|ifnonnull|iflt|if_icmpgt|ifle)"); + map.put("jsrinstruction", "(jsr|jsr_w)"); + map.put("variablelengthinstruction", "(tableswitch|jsr|goto|lookupswitch)"); + map.put("unconditionalbranch", "(goto|jsr|jsr_w|athrow|goto_w)"); + map.put("constantpushinstruction", "(dconst|bipush|sipush|fconst|iconst|lconst)"); + map + .put( + "typedinstruction", + "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)"); + map.put("popinstruction", "(fstore|dstore|pop|pop2|astore|putstatic|istore|lstore)"); + map.put("allocationinstruction", "(multianewarray|new|anewarray|newarray)"); + map + .put( + "indexedinstruction", + "(lload|lstore|fload|ldc2_w|invokeinterface|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)"); + map + .put( + "pushinstruction", + "(dup|lload|dup2|bipush|fload|ldc2_w|sipush|lconst|fconst|dload|getstatic|ldc_w|aconst_null|dconst|iload|ldc|iconst|aload)"); + map + .put( + "stackproducer", + "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)"); + map + .put( + "stackconsumer", + "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)"); + map + .put( + "exceptionthrower", + "(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|ldc|invokestatic|daload)"); + map + .put( + "loadclass", + "(multianewarray|invokeinterface|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)"); + map + .put( + "instructiontargeter", + "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); + // Some aliases + map.put("if_icmp", "(if_icmpne|if_icmpeq|if_icmple|if_icmpge|if_icmplt|if_icmpgt)"); + map.put("if_acmp", "(if_acmpeq|if_acmpne)"); + map.put("if", "(ifeq|ifne|iflt|ifge|ifgt|ifle)"); + // Precompile some aliases first + map.put("iconst", precompile(Constants.ICONST_0, Constants.ICONST_5, Constants.ICONST_M1)); + map.put("lconst", new String(new char[] { + '(', makeChar(Constants.LCONST_0), '|', makeChar(Constants.LCONST_1), ')' + })); + map.put("dconst", new String(new char[] { + '(', makeChar(Constants.DCONST_0), '|', makeChar(Constants.DCONST_1), ')' + })); + map.put("fconst", new String(new char[] { + '(', makeChar(Constants.FCONST_0), '|', makeChar(Constants.FCONST_1), ')' + })); + map.put("iload", precompile(Constants.ILOAD_0, Constants.ILOAD_3, Constants.ILOAD)); + map.put("dload", precompile(Constants.DLOAD_0, Constants.DLOAD_3, Constants.DLOAD)); + map.put("fload", precompile(Constants.FLOAD_0, Constants.FLOAD_3, Constants.FLOAD)); + map.put("aload", precompile(Constants.ALOAD_0, Constants.ALOAD_3, Constants.ALOAD)); + map.put("istore", precompile(Constants.ISTORE_0, Constants.ISTORE_3, Constants.ISTORE)); + map.put("dstore", precompile(Constants.DSTORE_0, Constants.DSTORE_3, Constants.DSTORE)); + map.put("fstore", precompile(Constants.FSTORE_0, Constants.FSTORE_3, Constants.FSTORE)); + map.put("astore", precompile(Constants.ASTORE_0, Constants.ASTORE_3, Constants.ASTORE)); + // Compile strings + for (Iterator i = map.keySet().iterator(); i.hasNext();) { + String key = (String) i.next(); + String value = (String) map.get(key); + char ch = value.charAt(1); // Omit already precompiled patterns + if (ch < OFFSET) { + map.put(key, compilePattern(value)); // precompile all patterns + } + } + // Add instruction alias to match anything + StringBuffer buf = new StringBuffer("("); + for (short i = 0; i < NO_OPCODES; i++) { + if (Constants.NO_OF_OPERANDS[i] != Constants.UNDEFINED) { // Not an + // invalid + // opcode + buf.append(makeChar(i)); + if (i < NO_OPCODES - 1) { + buf.append('|'); + } + } + } + buf.append(')'); + map.put("instruction", buf.toString()); + } + + + private static String precompile( short from, short to, short extra ) { + StringBuffer buf = new StringBuffer("("); + for (short i = from; i <= to; i++) { + buf.append(makeChar(i)); + buf.append('|'); + } + buf.append(makeChar(extra)); + buf.append(")"); + return buf.toString(); + } + + + /* + * Internal debugging routines. + */ + private static final String pattern2string( String pattern ) { + return pattern2string(pattern, true); + } + + + private static final String pattern2string( String pattern, boolean make_string ) { + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < pattern.length(); i++) { + char ch = pattern.charAt(i); + if (ch >= OFFSET) { + if (make_string) { + buf.append(Constants.OPCODE_NAMES[ch - OFFSET]); + } else { + buf.append((ch - OFFSET)); + } + } else { + buf.append(ch); + } + } + return buf.toString(); + } } diff --git a/src/java/org/apache/bcel/util/JavaWrapper.java b/src/java/org/apache/bcel/util/JavaWrapper.java index b7aa6b75..e7e96bc0 100644 --- a/src/java/org/apache/bcel/util/JavaWrapper.java +++ b/src/java/org/apache/bcel/util/JavaWrapper.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; - import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -37,80 +36,82 @@ import java.lang.reflect.Modifier; * @see ClassLoader */ public class JavaWrapper { - private java.lang.ClassLoader loader; - private static java.lang.ClassLoader getClassLoader() { - String s = System.getProperty("bcel.classloader"); + private java.lang.ClassLoader loader; - if((s == null) || "".equals(s)) - s = "org.apache.bcel.util.ClassLoader"; - try { - return (java.lang.ClassLoader)Class.forName(s).newInstance(); - } catch(Exception e) { - throw new RuntimeException(e.toString()); + private static java.lang.ClassLoader getClassLoader() { + String s = System.getProperty("bcel.classloader"); + if ((s == null) || "".equals(s)) { + s = "org.apache.bcel.util.ClassLoader"; + } + try { + return (java.lang.ClassLoader) Class.forName(s).newInstance(); + } catch (Exception e) { + throw new RuntimeException(e.toString()); + } } - } - - public JavaWrapper(java.lang.ClassLoader loader) { - this.loader = loader; - } - - public JavaWrapper() { - this(getClassLoader()); - } - /** Runs the main method of the given class with the arguments passed in argv - * - * @param class_name the fully qualified class name - * @param argv the arguments just as you would pass them directly - */ - public void runMain(String class_name, String[] argv) throws ClassNotFoundException - { - Class cl = loader.loadClass(class_name); - Method method = null; - try { - method = cl.getMethod("main", new Class[] { argv.getClass() }); - - /* Method main is sane ? - */ - int m = method.getModifiers(); - Class r = method.getReturnType(); - - if(!(Modifier.isPublic(m) && Modifier.isStatic(m)) || - Modifier.isAbstract(m) || (r != Void.TYPE)) - throw new NoSuchMethodException(); - } catch(NoSuchMethodException no) { - System.out.println("In class " + class_name + - ": public static void main(String[] argv) is not defined"); - return; + public JavaWrapper(java.lang.ClassLoader loader) { + this.loader = loader; } - - try { - method.invoke(null, new Object[] { argv }); - } catch(Exception ex) { - ex.printStackTrace(); + + + public JavaWrapper() { + this(getClassLoader()); } - } - /** Default main method used as wrapper, expects the fully qualified class name - * of the real class as the first argument. - */ - public static void main(String[] argv) throws Exception { - /* Expects class name as first argument, other arguments are by-passed. + + /** Runs the main method of the given class with the arguments passed in argv + * + * @param class_name the fully qualified class name + * @param argv the arguments just as you would pass them directly */ - if(argv.length == 0) { - System.out.println("Missing class name."); - return; + public void runMain( String class_name, String[] argv ) throws ClassNotFoundException { + Class cl = loader.loadClass(class_name); + Method method = null; + try { + method = cl.getMethod("main", new Class[] { + argv.getClass() + }); + /* Method main is sane ? + */ + int m = method.getModifiers(); + Class r = method.getReturnType(); + if (!(Modifier.isPublic(m) && Modifier.isStatic(m)) || Modifier.isAbstract(m) + || (r != Void.TYPE)) { + throw new NoSuchMethodException(); + } + } catch (NoSuchMethodException no) { + System.out.println("In class " + class_name + + ": public static void main(String[] argv) is not defined"); + return; + } + try { + method.invoke(null, new Object[] { + argv + }); + } catch (Exception ex) { + ex.printStackTrace(); + } } - String class_name = argv[0]; - String[] new_argv = new String[argv.length - 1]; - System.arraycopy(argv, 1, new_argv, 0, new_argv.length); - JavaWrapper wrapper = new JavaWrapper(); - wrapper.runMain(class_name, new_argv); - } + /** Default main method used as wrapper, expects the fully qualified class name + * of the real class as the first argument. + */ + public static void main( String[] argv ) throws Exception { + /* Expects class name as first argument, other arguments are by-passed. + */ + if (argv.length == 0) { + System.out.println("Missing class name."); + return; + } + String class_name = argv[0]; + String[] new_argv = new String[argv.length - 1]; + System.arraycopy(argv, 1, new_argv, 0, new_argv.length); + JavaWrapper wrapper = new JavaWrapper(); + wrapper.runMain(class_name, new_argv); + } } - diff --git a/src/java/org/apache/bcel/util/MethodHTML.java b/src/java/org/apache/bcel/util/MethodHTML.java index bad48fa9..8d9ce075 100644 --- a/src/java/org/apache/bcel/util/MethodHTML.java +++ b/src/java/org/apache/bcel/util/MethodHTML.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; - import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; @@ -36,135 +35,122 @@ import org.apache.bcel.classfile.Utility; * */ final class MethodHTML implements org.apache.bcel.Constants { - private String class_name; // name of current class - private PrintWriter file; // file to write to - private ConstantHTML constant_html; - private AttributeHTML attribute_html; - - MethodHTML(String dir, String class_name, - Method[] methods, Field[] fields, - ConstantHTML constant_html, AttributeHTML attribute_html) throws IOException - { - this.class_name = class_name; - this.attribute_html = attribute_html; - this.constant_html = constant_html; - - file = new PrintWriter(new FileOutputStream(dir + class_name + "_methods.html")); - - file.println(""); - file.println("" + - ""); - for(int i=0; i < fields.length; i++) - writeField(fields[i]); - file.println("
          Access flagsTypeField name
          "); - - file.println("" + - "" + - ""); - for(int i=0; i < methods.length; i++) - writeMethod(methods[i], i); - - file.println("
          Access flagsReturn typeMethod nameArguments
          "); - file.close(); - } - - /** - * Print field of class. - * - * @param field field to print - * @exception java.io.IOException - */ - private void writeField(Field field) throws IOException { - String type = Utility.signatureToString(field.getSignature()); - String name = field.getName(); - String access = Utility.accessToString(field.getAccessFlags()); - Attribute[] attributes; - - access = Utility.replace(access, " ", " "); - - file.print("" + access + "\n" + - Class2HTML.referenceType(type) + "" + - name + ""); - - attributes = field.getAttributes(); - // Write them to the Attributes.html file with anchor "[]" - for(int i=0; i < attributes.length; i++) - attribute_html.writeAttribute(attributes[i], name + "@" + i); - - for(int i=0; i < attributes.length; i++) { - if(attributes[i].getTag() == ATTR_CONSTANT_VALUE) { // Default value - String str = ((ConstantValue)attributes[i]).toString(); - - // Reference attribute in _attributes.html - file.print("= " + str + "\n"); - break; - } + private String class_name; // name of current class + private PrintWriter file; // file to write to + private ConstantHTML constant_html; + private AttributeHTML attribute_html; + + + MethodHTML(String dir, String class_name, Method[] methods, Field[] fields, + ConstantHTML constant_html, AttributeHTML attribute_html) throws IOException { + this.class_name = class_name; + this.attribute_html = attribute_html; + this.constant_html = constant_html; + file = new PrintWriter(new FileOutputStream(dir + class_name + "_methods.html")); + file.println(""); + file.println("" + + ""); + for (int i = 0; i < fields.length; i++) { + writeField(fields[i]); + } + file.println("
          Access flagsTypeField name
          "); + file.println("" + + "" + + ""); + for (int i = 0; i < methods.length; i++) { + writeMethod(methods[i], i); + } + file.println("
          Access flagsReturn typeMethod nameArguments
          "); + file.close(); } - - file.println(""); - } - private final void writeMethod(Method method, int method_number) throws IOException { - // Get raw signature - String signature = method.getSignature(); - // Get array of strings containing the argument types - String[] args = Utility.methodSignatureArgumentTypes(signature, false); - // Get return type string - String type = Utility.methodSignatureReturnType(signature, false); - // Get method name - String name = method.getName(), html_name; - // Get method's access flags - String access = Utility.accessToString(method.getAccessFlags()); - // Get the method's attributes, the Code Attribute in particular - Attribute[] attributes = method.getAttributes(); - /* HTML doesn't like names like and spaces are places to break - * lines. Both we don't want... + /** + * Print field of class. + * + * @param field field to print + * @exception java.io.IOException */ - access = Utility.replace(access, " ", " "); - html_name = Class2HTML.toHTML(name); - - file.print("
          " + - access + ""); - - file.print("" + Class2HTML.referenceType(type) + "" + - "" + html_name + "\n("); - - for(int i=0; i < args.length; i++) { - file.print(Class2HTML.referenceType(args[i])); - if(i < args.length - 1) - file.print(", "); + private void writeField( Field field ) throws IOException { + String type = Utility.signatureToString(field.getSignature()); + String name = field.getName(); + String access = Utility.accessToString(field.getAccessFlags()); + Attribute[] attributes; + access = Utility.replace(access, " ", " "); + file.print("" + access + "\n" + + Class2HTML.referenceType(type) + "" + name + + ""); + attributes = field.getAttributes(); + // Write them to the Attributes.html file with anchor "[]" + for (int i = 0; i < attributes.length; i++) { + attribute_html.writeAttribute(attributes[i], name + "@" + i); + } + for (int i = 0; i < attributes.length; i++) { + if (attributes[i].getTag() == ATTR_CONSTANT_VALUE) { // Default value + String str = ((ConstantValue) attributes[i]).toString(); + // Reference attribute in _attributes.html + file.print("= " + str + "\n"); + break; + } + } + file.println(""); } - file.print(")"); - - // Check for thrown exceptions - for(int i=0; i < attributes.length; i++) { - attribute_html.writeAttribute(attributes[i], "method" + method_number + "@" + i, - method_number); - - byte tag = attributes[i].getTag(); - if(tag == ATTR_EXCEPTIONS) { - file.print("throws"); - int[] exceptions = ((ExceptionTable)attributes[i]).getExceptionIndexTable(); - - for(int j=0; j < exceptions.length; j++) { - file.print(constant_html.referenceConstant(exceptions[j])); - - if(j < exceptions.length - 1) - file.print(", "); - } - file.println(""); - } else if(tag == ATTR_CODE) { - Attribute[] c_a = ((Code)attributes[i]).getAttributes(); - for(int j=0; j < c_a.length; j++) - attribute_html.writeAttribute(c_a[j], "method" + method_number + "@" + i + "@" + j, - method_number); - } + private final void writeMethod( Method method, int method_number ) throws IOException { + // Get raw signature + String signature = method.getSignature(); + // Get array of strings containing the argument types + String[] args = Utility.methodSignatureArgumentTypes(signature, false); + // Get return type string + String type = Utility.methodSignatureReturnType(signature, false); + // Get method name + String name = method.getName(), html_name; + // Get method's access flags + String access = Utility.accessToString(method.getAccessFlags()); + // Get the method's attributes, the Code Attribute in particular + Attribute[] attributes = method.getAttributes(); + /* HTML doesn't like names like and spaces are places to break + * lines. Both we don't want... + */ + access = Utility.replace(access, " ", " "); + html_name = Class2HTML.toHTML(name); + file.print("" + access + ""); + file.print("" + Class2HTML.referenceType(type) + "" + "" + html_name + + "\n("); + for (int i = 0; i < args.length; i++) { + file.print(Class2HTML.referenceType(args[i])); + if (i < args.length - 1) { + file.print(", "); + } + } + file.print(")"); + // Check for thrown exceptions + for (int i = 0; i < attributes.length; i++) { + attribute_html.writeAttribute(attributes[i], "method" + method_number + "@" + i, + method_number); + byte tag = attributes[i].getTag(); + if (tag == ATTR_EXCEPTIONS) { + file.print("throws"); + int[] exceptions = ((ExceptionTable) attributes[i]).getExceptionIndexTable(); + for (int j = 0; j < exceptions.length; j++) { + file.print(constant_html.referenceConstant(exceptions[j])); + if (j < exceptions.length - 1) { + file.print(", "); + } + } + file.println(""); + } else if (tag == ATTR_CODE) { + Attribute[] c_a = ((Code) attributes[i]).getAttributes(); + for (int j = 0; j < c_a.length; j++) { + attribute_html.writeAttribute(c_a[j], "method" + method_number + "@" + i + "@" + + j, method_number); + } + } + } } - } } diff --git a/src/java/org/apache/bcel/util/Repository.java b/src/java/org/apache/bcel/util/Repository.java index 391483f5..4069ab4b 100644 --- a/src/java/org/apache/bcel/util/Repository.java +++ b/src/java/org/apache/bcel/util/Repository.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; - import org.apache.bcel.classfile.JavaClass; /** @@ -30,44 +29,45 @@ import org.apache.bcel.classfile.JavaClass; * @author David Dixon-Peugh */ public interface Repository extends java.io.Serializable { - /** - * Store the provided class under "clazz.getClassName()" - */ - public void storeClass(JavaClass clazz); - /** - * Remove class from repository - */ - public void removeClass(JavaClass clazz); - - /** - * Find the class with the name provided, if the class - * isn't there, return NULL. - */ - public JavaClass findClass(String className); + /** + * Store the provided class under "clazz.getClassName()" + */ + public void storeClass( JavaClass clazz ); - /** - * Find the class with the name provided, if the class - * isn't there, make an attempt to load it. - */ - public JavaClass loadClass(String className) - throws java.lang.ClassNotFoundException; - /** - * Find the JavaClass instance for the given run-time class object - */ - public JavaClass loadClass(Class clazz) - throws java.lang.ClassNotFoundException; + /** + * Remove class from repository + */ + public void removeClass( JavaClass clazz ); - /** Clear all entries from cache. - */ - public void clear(); - - /** Get the ClassPath associated with this Repository - */ - public ClassPath getClassPath(); -} + /** + * Find the class with the name provided, if the class + * isn't there, return NULL. + */ + public JavaClass findClass( String className ); + + + /** + * Find the class with the name provided, if the class + * isn't there, make an attempt to load it. + */ + public JavaClass loadClass( String className ) throws java.lang.ClassNotFoundException; + /** + * Find the JavaClass instance for the given run-time class object + */ + public JavaClass loadClass( Class clazz ) throws java.lang.ClassNotFoundException; + + /** Clear all entries from cache. + */ + public void clear(); + + + /** Get the ClassPath associated with this Repository + */ + public ClassPath getClassPath(); +} diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/java/org/apache/bcel/util/SyntheticRepository.java index b9e1942f..b8620e4a 100644 --- a/src/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/java/org/apache/bcel/util/SyntheticRepository.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.util; - import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReference; @@ -35,7 +34,7 @@ import org.apache.bcel.classfile.JavaClass; * It is designed to be used as a singleton, however it * can also be used with custom classpaths. * -/** + /** * Abstract definition of a class repository. Instances may be used * to load classes from different sources and may be used in the * Repository.setRepository method. @@ -47,149 +46,145 @@ import org.apache.bcel.classfile.JavaClass; * @author David Dixon-Peugh */ public class SyntheticRepository implements Repository { - private static final String DEFAULT_PATH = ClassPath.getClassPath(); - - private static Map _instances = new HashMap(); // CLASSPATH X REPOSITORY - private ClassPath _path = null; - private Map _loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS + private static final String DEFAULT_PATH = ClassPath.getClassPath(); + private static Map _instances = new HashMap(); // CLASSPATH X REPOSITORY + private ClassPath _path = null; + private Map _loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS - private SyntheticRepository(ClassPath path) { - _path = path; - } - public static SyntheticRepository getInstance() { - return getInstance(ClassPath.SYSTEM_CLASS_PATH); - } + private SyntheticRepository(ClassPath path) { + _path = path; + } - public static SyntheticRepository getInstance(ClassPath classPath) { - SyntheticRepository rep = (SyntheticRepository)_instances.get(classPath); - if (rep == null) { - rep = new SyntheticRepository(classPath); - _instances.put(classPath, rep); + public static SyntheticRepository getInstance() { + return getInstance(ClassPath.SYSTEM_CLASS_PATH); } - return rep; - } - - /** - * Store a new JavaClass instance into this Repository. - */ - public void storeClass(JavaClass clazz) { - _loadedClasses.put(clazz.getClassName(), new SoftReference(clazz)); - clazz.setRepository(this); - } - - /** - * Remove class from repository - */ - public void removeClass(JavaClass clazz) { - _loadedClasses.remove(clazz.getClassName()); - } - - /** - * Find an already defined (cached) JavaClass object by name. - */ - public JavaClass findClass(String className) { - SoftReference ref = (SoftReference)_loadedClasses.get(className); - if (ref == null) - return null; - return (JavaClass)ref.get(); - } - - /** - * Find a JavaClass object by name. - * If it is already in this Repository, the Repository version - * is returned. Otherwise, the Repository's classpath is searched for - * the class (and it is added to the Repository if found). - * - * @param className the name of the class - * @return the JavaClass object - * @throws ClassNotFoundException if the class is not in the - * Repository, and could not be found on the classpath - */ - public JavaClass loadClass(String className) throws ClassNotFoundException { - if (className == null || className.equals("")) { - throw new IllegalArgumentException("Invalid class name " + className); + + public static SyntheticRepository getInstance( ClassPath classPath ) { + SyntheticRepository rep = (SyntheticRepository) _instances.get(classPath); + if (rep == null) { + rep = new SyntheticRepository(classPath); + _instances.put(classPath, rep); + } + return rep; } - className = className.replace('/', '.'); // Just in case, canonical form - JavaClass clazz = findClass(className); - if (clazz != null) { - return clazz; + /** + * Store a new JavaClass instance into this Repository. + */ + public void storeClass( JavaClass clazz ) { + _loadedClasses.put(clazz.getClassName(), new SoftReference(clazz)); + clazz.setRepository(this); } - try { - return loadClass(_path.getInputStream(className), className); - } catch (IOException e) { - throw new ClassNotFoundException( - "Exception while looking for class " + className + ": " + e.toString()); + + /** + * Remove class from repository + */ + public void removeClass( JavaClass clazz ) { + _loadedClasses.remove(clazz.getClassName()); } - } - - /** - * Find the JavaClass object for a runtime Class object. - * If a class with the same name is already in this Repository, - * the Repository version is returned. Otherwise, getResourceAsStream() - * is called on the Class object to find the class's representation. - * If the representation is found, it is added to the Repository. - * - * @see Class - * @param clazz the runtime Class object - * @return JavaClass object for given runtime class - * @throws ClassNotFoundException if the class is not in the - * Repository, and its representation could not be found - */ - public JavaClass loadClass(Class clazz) throws ClassNotFoundException { - String className = clazz.getName(); - - JavaClass repositoryClass = findClass(className); - if (repositoryClass != null) { - return repositoryClass; + + + /** + * Find an already defined (cached) JavaClass object by name. + */ + public JavaClass findClass( String className ) { + SoftReference ref = (SoftReference) _loadedClasses.get(className); + if (ref == null) { + return null; + } + return (JavaClass) ref.get(); } - String name = className; - int i = name.lastIndexOf('.'); - if (i > 0) { - name = name.substring(i + 1); + /** + * Find a JavaClass object by name. + * If it is already in this Repository, the Repository version + * is returned. Otherwise, the Repository's classpath is searched for + * the class (and it is added to the Repository if found). + * + * @param className the name of the class + * @return the JavaClass object + * @throws ClassNotFoundException if the class is not in the + * Repository, and could not be found on the classpath + */ + public JavaClass loadClass( String className ) throws ClassNotFoundException { + if (className == null || className.equals("")) { + throw new IllegalArgumentException("Invalid class name " + className); + } + className = className.replace('/', '.'); // Just in case, canonical form + JavaClass clazz = findClass(className); + if (clazz != null) { + return clazz; + } + try { + return loadClass(_path.getInputStream(className), className); + } catch (IOException e) { + throw new ClassNotFoundException("Exception while looking for class " + className + + ": " + e.toString()); + } } - return loadClass(clazz.getResourceAsStream(name + ".class"), className); - } - private JavaClass loadClass(InputStream is, String className) - throws ClassNotFoundException { + /** + * Find the JavaClass object for a runtime Class object. + * If a class with the same name is already in this Repository, + * the Repository version is returned. Otherwise, getResourceAsStream() + * is called on the Class object to find the class's representation. + * If the representation is found, it is added to the Repository. + * + * @see Class + * @param clazz the runtime Class object + * @return JavaClass object for given runtime class + * @throws ClassNotFoundException if the class is not in the + * Repository, and its representation could not be found + */ + public JavaClass loadClass( Class clazz ) throws ClassNotFoundException { + String className = clazz.getName(); + JavaClass repositoryClass = findClass(className); + if (repositoryClass != null) { + return repositoryClass; + } + String name = className; + int i = name.lastIndexOf('.'); + if (i > 0) { + name = name.substring(i + 1); + } + return loadClass(clazz.getResourceAsStream(name + ".class"), className); + } - try { - if (is != null) { - ClassParser parser = new ClassParser(is, className); - JavaClass clazz = parser.parse(); - storeClass(clazz); + private JavaClass loadClass( InputStream is, String className ) throws ClassNotFoundException { + try { + if (is != null) { + ClassParser parser = new ClassParser(is, className); + JavaClass clazz = parser.parse(); + storeClass(clazz); + return clazz; + } + } catch (IOException e) { + throw new ClassNotFoundException("Exception while looking for class " + className + + ": " + e.toString()); + } + throw new ClassNotFoundException("SyntheticRepository could not load " + className); + } - return clazz; - } - } catch (IOException e) { - throw new ClassNotFoundException( - "Exception while looking for class " + className + ": " + e.toString()); + + /** ClassPath associated with the Repository. + */ + public ClassPath getClassPath() { + return _path; } - throw new ClassNotFoundException( - "SyntheticRepository could not load " + className); - } - - /** ClassPath associated with the Repository. - */ - public ClassPath getClassPath() { - return _path; - } - - /** Clear all entries from cache. - */ - public void clear() { - _loadedClasses.clear(); - } + + /** Clear all entries from cache. + */ + public void clear() { + _loadedClasses.clear(); + } } diff --git a/src/java/org/apache/bcel/verifier/GraphicalVerifier.java b/src/java/org/apache/bcel/verifier/GraphicalVerifier.java index 20c05cf2..db2049c6 100644 --- a/src/java/org/apache/bcel/verifier/GraphicalVerifier.java +++ b/src/java/org/apache/bcel/verifier/GraphicalVerifier.java @@ -13,16 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.verifier; - import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.UIManager; import org.apache.bcel.generic.Type; - /** * A graphical user interface application demonstrating JustIce. * @@ -30,43 +28,45 @@ import org.apache.bcel.generic.Type; * @author Enver Haase */ public class GraphicalVerifier { - boolean packFrame = false; - /** Constructor. */ - public GraphicalVerifier() { - VerifierAppFrame frame = new VerifierAppFrame(); - //Frames überprüfen, die voreingestellte Größe haben - //Frames packen, die nutzbare bevorzugte Größeninformationen enthalten, z.B. aus ihrem Layout - if (packFrame) { - frame.pack(); - } - else { - frame.validate(); - } - //Das Fenster zentrieren - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - Dimension frameSize = frame.getSize(); - if (frameSize.height > screenSize.height) { - frameSize.height = screenSize.height; - } - if (frameSize.width > screenSize.width) { - frameSize.width = screenSize.width; - } - frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); - frame.setVisible(true); + boolean packFrame = false; + - frame.classNamesJList.setModel(new VerifierFactoryListModel()); - VerifierFactory.getVerifier(Type.OBJECT.getClassName()); // Fill list with java.lang.Object - frame.classNamesJList.setSelectedIndex(0); // default, will verify java.lang.Object - } - /** Main method. */ - public static void main(String[] args) { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + /** Constructor. */ + public GraphicalVerifier() { + VerifierAppFrame frame = new VerifierAppFrame(); + //Frames überprüfen, die voreingestellte Größe haben + //Frames packen, die nutzbare bevorzugte Größeninformationen enthalten, z.B. aus ihrem Layout + if (packFrame) { + frame.pack(); + } else { + frame.validate(); + } + //Das Fenster zentrieren + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + Dimension frameSize = frame.getSize(); + if (frameSize.height > screenSize.height) { + frameSize.height = screenSize.height; + } + if (frameSize.width > screenSize.width) { + frameSize.width = screenSize.width; + } + frame.setLocation((screenSize.width - frameSize.width) / 2, + (screenSize.height - frameSize.height) / 2); + frame.setVisible(true); + frame.classNamesJList.setModel(new VerifierFactoryListModel()); + VerifierFactory.getVerifier(Type.OBJECT.getClassName()); // Fill list with java.lang.Object + frame.classNamesJList.setSelectedIndex(0); // default, will verify java.lang.Object } - catch(Exception e) { - e.printStackTrace(); + + + /** Main method. */ + public static void main( String[] args ) { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception e) { + e.printStackTrace(); + } + new GraphicalVerifier(); } - new GraphicalVerifier(); - } } diff --git a/src/java/org/apache/bcel/verifier/NativeVerifier.java b/src/java/org/apache/bcel/verifier/NativeVerifier.java index 20d5cd6f..b828eecb 100644 --- a/src/java/org/apache/bcel/verifier/NativeVerifier.java +++ b/src/java/org/apache/bcel/verifier/NativeVerifier.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.verifier; - /** * The NativeVerifier class implements a main(String[] args) method that's * roughly compatible to the one in the Verifier class, but that uses the @@ -27,53 +26,49 @@ package org.apache.bcel.verifier; * @version $Id$ * @author Enver Haase */ -public abstract class NativeVerifier{ - - /** - * This class must not be instantiated. - */ - private NativeVerifier(){ - } - - /** - * Works only on the first argument. - */ - public static void main(String [] args){ - if (args.length != 1){ - System.out.println("Verifier front-end: need exactly one argument."); - System.exit(1); - } +public abstract class NativeVerifier { - int dotclasspos = args[0].lastIndexOf(".class"); - if (dotclasspos != -1) args[0] = args[0].substring(0,dotclasspos); - args[0] = args[0].replace('/','.'); - //System.out.println(args[0]); + /** + * This class must not be instantiated. + */ + private NativeVerifier() { + } - - try{ - Class.forName(args[0]); - } - catch(ExceptionInInitializerError eiie){ //subclass of LinkageError! - System.out.println("NativeVerifier: ExceptionInInitializerError encountered on '"+args[0]+"'."); - System.out.println(eiie); - System.exit(1); - } - catch(LinkageError le){ - System.out.println("NativeVerifier: LinkageError encountered on '"+args[0]+"'."); - System.out.println(le); - System.exit(1); - } - catch(ClassNotFoundException cnfe){ - System.out.println("NativeVerifier: FILE NOT FOUND: '"+args[0]+"'."); - System.exit(1); - } - catch(Throwable t){ - System.out.println("NativeVerifier: Unspecified verification error on'"+args[0]+"'."); - System.exit(1); - } - - System.out.println("NativeVerifier: Class file '"+args[0]+"' seems to be okay."); - System.exit(0); - } + /** + * Works only on the first argument. + */ + public static void main( String[] args ) { + if (args.length != 1) { + System.out.println("Verifier front-end: need exactly one argument."); + System.exit(1); + } + int dotclasspos = args[0].lastIndexOf(".class"); + if (dotclasspos != -1) { + args[0] = args[0].substring(0, dotclasspos); + } + args[0] = args[0].replace('/', '.'); + //System.out.println(args[0]); + try { + Class.forName(args[0]); + } catch (ExceptionInInitializerError eiie) { //subclass of LinkageError! + System.out.println("NativeVerifier: ExceptionInInitializerError encountered on '" + + args[0] + "'."); + System.out.println(eiie); + System.exit(1); + } catch (LinkageError le) { + System.out.println("NativeVerifier: LinkageError encountered on '" + args[0] + "'."); + System.out.println(le); + System.exit(1); + } catch (ClassNotFoundException cnfe) { + System.out.println("NativeVerifier: FILE NOT FOUND: '" + args[0] + "'."); + System.exit(1); + } catch (Throwable t) { + System.out.println("NativeVerifier: Unspecified verification error on'" + args[0] + + "'."); + System.exit(1); + } + System.out.println("NativeVerifier: Class file '" + args[0] + "' seems to be okay."); + System.exit(0); + } } diff --git a/src/java/org/apache/bcel/verifier/PassVerifier.java b/src/java/org/apache/bcel/verifier/PassVerifier.java index 34c5aea3..49193e90 100644 --- a/src/java/org/apache/bcel/verifier/PassVerifier.java +++ b/src/java/org/apache/bcel/verifier/PassVerifier.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.verifier; - import java.util.ArrayList; import java.util.List; @@ -46,59 +45,61 @@ import java.util.List; * @see org.apache.bcel.verifier.Verifier * @see #verify() */ -public abstract class PassVerifier{ +public abstract class PassVerifier { + + /** The (warning) messages. */ + private List messages = new ArrayList(); //Type of elements: String + /** The VerificationResult cache. */ + private VerificationResult verificationResult = null; + + + /** + * This method runs a verification pass conforming to the + * Java Virtual Machine Specification, 2nd edition, on a + * class file. + * PassVerifier instances perform caching; + * i.e. if the verify() method once determined a VerificationResult, + * then this result may be returned after every invocation of this + * method instead of running the verification pass anew; likewise with + * the result of getMessages(). + * + * @see #getMessages() + * @see #addMessage(String) + */ + public VerificationResult verify() { + if (verificationResult == null) { + verificationResult = do_verify(); + } + return verificationResult; + } + - /** The (warning) messages. */ - private List messages = new ArrayList(); //Type of elements: String - - /** The VerificationResult cache. */ - private VerificationResult verificationResult = null; + /** Does the real verification work, uncached. */ + public abstract VerificationResult do_verify(); - /** - * This method runs a verification pass conforming to the - * Java Virtual Machine Specification, 2nd edition, on a - * class file. - * PassVerifier instances perform caching; - * i.e. if the verify() method once determined a VerificationResult, - * then this result may be returned after every invocation of this - * method instead of running the verification pass anew; likewise with - * the result of getMessages(). - * - * @see #getMessages() - * @see #addMessage(String) - */ - public VerificationResult verify(){ - if (verificationResult == null){ - verificationResult = do_verify(); - } - return verificationResult; - } - /** Does the real verification work, uncached. */ - public abstract VerificationResult do_verify(); + /** + * This method adds a (warning) message to the message pool of this + * PassVerifier. This method is normally only internally used by + * BCEL's class file verifier "JustIce" and should not be used from + * the outside. + * + * @see #getMessages() + */ + public void addMessage( String message ) { + messages.add(message); + } - /** - * This method adds a (warning) message to the message pool of this - * PassVerifier. This method is normally only internally used by - * BCEL's class file verifier "JustIce" and should not be used from - * the outside. - * - * @see #getMessages() - */ - public void addMessage(String message){ - messages.add(message); - } - /** - * Returns the (warning) messages that this PassVerifier accumulated - * during its do_verify()ing work. - * - * @see #addMessage(String) - * @see #do_verify() - */ - public String[] getMessages(){ - verify(); // create messages if not already done (cached!) - - return (String[]) messages.toArray(new String[messages.size()]); - } + /** + * Returns the (warning) messages that this PassVerifier accumulated + * during its do_verify()ing work. + * + * @see #addMessage(String) + * @see #do_verify() + */ + public String[] getMessages() { + verify(); // create messages if not already done (cached!) + return (String[]) messages.toArray(new String[messages.size()]); + } } diff --git a/src/java/org/apache/bcel/verifier/TransitiveHull.java b/src/java/org/apache/bcel/verifier/TransitiveHull.java index 96b54daa..ebe9772d 100644 --- a/src/java/org/apache/bcel/verifier/TransitiveHull.java +++ b/src/java/org/apache/bcel/verifier/TransitiveHull.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.verifier; - import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; @@ -29,76 +28,77 @@ import org.apache.bcel.classfile.JavaClass; * @version $Id$ * @author Enver Haase */ -public class TransitiveHull implements VerifierFactoryObserver{ - - /** Used for indentation. */ - private int indent = 0; - - /** Not publicly instantiable. */ - private TransitiveHull(){ - } - - /* Implementing VerifierFactoryObserver. */ - public void update(String classname) { - - System.gc(); // avoid swapping if possible. +public class TransitiveHull implements VerifierFactoryObserver { - for (int i=0; i\n\n"); - for(int k=0; k < args.length; k++) { - try { - if (args[k].endsWith(".class")){ - int dotclasspos = args[k].lastIndexOf(".class"); - if (dotclasspos != -1) args[k] = args[k].substring(0,dotclasspos); - } - - args[k] = args[k].replace('/', '.'); - - System.out.println("Now verifying: "+args[k]+"\n"); - - Verifier v = VerifierFactory.getVerifier(args[k]); - VerificationResult vr; - - vr = v.doPass1(); - System.out.println("Pass 1:\n"+vr); - - vr = v.doPass2(); - System.out.println("Pass 2:\n"+vr); - - if (vr == VerificationResult.VR_OK){ - JavaClass jc = org.apache.bcel.Repository - .lookupClass(args[k]); - for (int i=0; i"); - for (int j=0; j\n\n"); + for (int k = 0; k < args.length; k++) { + try { + if (args[k].endsWith(".class")) { + int dotclasspos = args[k].lastIndexOf(".class"); + if (dotclasspos != -1) { + args[k] = args[k].substring(0, dotclasspos); + } + } + args[k] = args[k].replace('/', '.'); + System.out.println("Now verifying: " + args[k] + "\n"); + Verifier v = VerifierFactory.getVerifier(args[k]); + VerificationResult vr; + vr = v.doPass1(); + System.out.println("Pass 1:\n" + vr); + vr = v.doPass2(); + System.out.println("Pass 2:\n" + vr); + if (vr == VerificationResult.VR_OK) { + JavaClass jc = org.apache.bcel.Repository.lookupClass(args[k]); + for (int i = 0; i < jc.getMethods().length; i++) { + vr = v.doPass3a(i); + System.out.println("Pass 3a, method number " + i + " ['" + + jc.getMethods()[i] + "']:\n" + vr); + vr = v.doPass3b(i); + System.out.println("Pass 3b, method number " + i + " ['" + + jc.getMethods()[i] + "']:\n" + vr); + } + } + System.out.println("Warnings:"); + String[] warnings = v.getMessages(); + if (warnings.length == 0) { + System.out.println(""); + } + for (int j = 0; j < warnings.length; j++) { + System.out.println(warnings[j]); + } + System.out.println("\n"); + // avoid swapping. + v.flush(); + org.apache.bcel.Repository.clearCache(); + System.gc(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + } } diff --git a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/java/org/apache/bcel/verifier/VerifierAppFrame.java index 5c5dd711..3da656e3 100644 --- a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.verifier; - import java.awt.AWTEvent; import java.awt.CardLayout; import java.awt.Color; @@ -49,341 +48,349 @@ import org.apache.bcel.classfile.JavaClass; * @see GraphicalVerifier */ public class VerifierAppFrame extends JFrame { - JPanel contentPane; - JSplitPane jSplitPane1 = new JSplitPane(); - JPanel jPanel1 = new JPanel(); - JPanel jPanel2 = new JPanel(); - JSplitPane jSplitPane2 = new JSplitPane(); - JPanel jPanel3 = new JPanel(); - JList classNamesJList = new JList(); - GridLayout gridLayout1 = new GridLayout(); - JPanel messagesPanel = new JPanel(); - GridLayout gridLayout2 = new GridLayout(); - JMenuBar jMenuBar1 = new JMenuBar(); - JMenu jMenu1 = new JMenu(); - JScrollPane jScrollPane1 = new JScrollPane(); - JScrollPane messagesScrollPane = new JScrollPane(); - JScrollPane jScrollPane3 = new JScrollPane(); - GridLayout gridLayout4 = new GridLayout(); - JScrollPane jScrollPane4 = new JScrollPane(); - CardLayout cardLayout1 = new CardLayout(); - - private String JUSTICE_VERSION = "JustIce by Enver Haase"; - private String current_class; - GridLayout gridLayout3 = new GridLayout(); - JTextPane pass1TextPane = new JTextPane(); - JTextPane pass2TextPane = new JTextPane(); - JTextPane messagesTextPane = new JTextPane(); - JMenuItem newFileMenuItem = new JMenuItem(); - JSplitPane jSplitPane3 = new JSplitPane(); - JSplitPane jSplitPane4 = new JSplitPane(); - JScrollPane jScrollPane2 = new JScrollPane(); - JScrollPane jScrollPane5 = new JScrollPane(); - JScrollPane jScrollPane6 = new JScrollPane(); - JScrollPane jScrollPane7 = new JScrollPane(); - JList pass3aJList = new JList(); - JList pass3bJList = new JList(); - JTextPane pass3aTextPane = new JTextPane(); - JTextPane pass3bTextPane = new JTextPane(); - JMenu jMenu2 = new JMenu(); - JMenuItem whatisMenuItem = new JMenuItem(); - JMenuItem aboutMenuItem = new JMenuItem(); - /** Constructor. */ - public VerifierAppFrame() { - enableEvents(AWTEvent.WINDOW_EVENT_MASK); - try { - jbInit(); - } - catch(Exception e) { - e.printStackTrace(); + JPanel contentPane; + JSplitPane jSplitPane1 = new JSplitPane(); + JPanel jPanel1 = new JPanel(); + JPanel jPanel2 = new JPanel(); + JSplitPane jSplitPane2 = new JSplitPane(); + JPanel jPanel3 = new JPanel(); + JList classNamesJList = new JList(); + GridLayout gridLayout1 = new GridLayout(); + JPanel messagesPanel = new JPanel(); + GridLayout gridLayout2 = new GridLayout(); + JMenuBar jMenuBar1 = new JMenuBar(); + JMenu jMenu1 = new JMenu(); + JScrollPane jScrollPane1 = new JScrollPane(); + JScrollPane messagesScrollPane = new JScrollPane(); + JScrollPane jScrollPane3 = new JScrollPane(); + GridLayout gridLayout4 = new GridLayout(); + JScrollPane jScrollPane4 = new JScrollPane(); + CardLayout cardLayout1 = new CardLayout(); + private String JUSTICE_VERSION = "JustIce by Enver Haase"; + private String current_class; + GridLayout gridLayout3 = new GridLayout(); + JTextPane pass1TextPane = new JTextPane(); + JTextPane pass2TextPane = new JTextPane(); + JTextPane messagesTextPane = new JTextPane(); + JMenuItem newFileMenuItem = new JMenuItem(); + JSplitPane jSplitPane3 = new JSplitPane(); + JSplitPane jSplitPane4 = new JSplitPane(); + JScrollPane jScrollPane2 = new JScrollPane(); + JScrollPane jScrollPane5 = new JScrollPane(); + JScrollPane jScrollPane6 = new JScrollPane(); + JScrollPane jScrollPane7 = new JScrollPane(); + JList pass3aJList = new JList(); + JList pass3bJList = new JList(); + JTextPane pass3aTextPane = new JTextPane(); + JTextPane pass3bTextPane = new JTextPane(); + JMenu jMenu2 = new JMenu(); + JMenuItem whatisMenuItem = new JMenuItem(); + JMenuItem aboutMenuItem = new JMenuItem(); + + + /** Constructor. */ + public VerifierAppFrame() { + enableEvents(AWTEvent.WINDOW_EVENT_MASK); + try { + jbInit(); + } catch (Exception e) { + e.printStackTrace(); + } } - } - /** Initizalization of the components. */ - private void jbInit() throws Exception { - //setIconImage(Toolkit.getDefaultToolkit().createImage(Frame1.class.getResource("[Ihr Symbol]"))); - contentPane = (JPanel) this.getContentPane(); - contentPane.setLayout(cardLayout1); - this.setJMenuBar(jMenuBar1); - this.setSize(new Dimension(708, 451)); - this.setTitle("JustIce"); - jPanel1.setMinimumSize(new Dimension(100, 100)); - jPanel1.setPreferredSize(new Dimension(100, 100)); - jPanel1.setLayout(gridLayout1); - jSplitPane2.setOrientation(JSplitPane.VERTICAL_SPLIT); - jPanel2.setLayout(gridLayout2); - jPanel3.setMinimumSize(new Dimension(200, 100)); - jPanel3.setPreferredSize(new Dimension(400, 400)); - jPanel3.setLayout(gridLayout4); - messagesPanel.setMinimumSize(new Dimension(100, 100)); - messagesPanel.setLayout(gridLayout3); - jPanel2.setMinimumSize(new Dimension(200, 100)); - jMenu1.setText("File"); - jScrollPane1.getViewport().setBackground(Color.red); - messagesScrollPane.getViewport().setBackground(Color.red); - messagesScrollPane.setPreferredSize(new Dimension(10, 10)); - classNamesJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { - public void valueChanged(ListSelectionEvent e) { - classNamesJList_valueChanged(e); - } - }); - classNamesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - jScrollPane3.setBorder(BorderFactory.createLineBorder(Color.black)); - jScrollPane3.setPreferredSize(new Dimension(100, 100)); - gridLayout4.setRows(4); - gridLayout4.setColumns(1); - gridLayout4.setHgap(1); - jScrollPane4.setBorder(BorderFactory.createLineBorder(Color.black)); - jScrollPane4.setPreferredSize(new Dimension(100, 100)); - pass1TextPane.setBorder(BorderFactory.createRaisedBevelBorder()); - pass1TextPane.setToolTipText(""); - pass1TextPane.setEditable(false); - pass2TextPane.setBorder(BorderFactory.createRaisedBevelBorder()); - pass2TextPane.setEditable(false); - messagesTextPane.setBorder(BorderFactory.createRaisedBevelBorder()); - messagesTextPane.setEditable(false); - newFileMenuItem.setText("New..."); - newFileMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(78, java.awt.event.KeyEvent.CTRL_MASK, true)); - newFileMenuItem.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - newFileMenuItem_actionPerformed(e); - } - }); - pass3aTextPane.setEditable(false); - pass3bTextPane.setEditable(false); - pass3aJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { - public void valueChanged(ListSelectionEvent e) { - pass3aJList_valueChanged(e); - } - }); - pass3bJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { - public void valueChanged(ListSelectionEvent e) { - pass3bJList_valueChanged(e); - } - }); - jMenu2.setText("Help"); - whatisMenuItem.setText("What is..."); - whatisMenuItem.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - whatisMenuItem_actionPerformed(e); - } - }); - aboutMenuItem.setText("About"); - aboutMenuItem.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(ActionEvent e) { - aboutMenuItem_actionPerformed(e); - } - }); - jSplitPane2.add(messagesPanel, JSplitPane.BOTTOM); - messagesPanel.add(messagesScrollPane, null); - messagesScrollPane.getViewport().add(messagesTextPane, null); - jSplitPane2.add(jPanel3, JSplitPane.TOP); - jPanel3.add(jScrollPane3, null); - jScrollPane3.getViewport().add(pass1TextPane, null); - jPanel3.add(jScrollPane4, null); - jPanel3.add(jSplitPane3, null); - jSplitPane3.add(jScrollPane2, JSplitPane.LEFT); - jScrollPane2.getViewport().add(pass3aJList, null); - jSplitPane3.add(jScrollPane5, JSplitPane.RIGHT); - jScrollPane5.getViewport().add(pass3aTextPane, null); - jPanel3.add(jSplitPane4, null); - jSplitPane4.add(jScrollPane6, JSplitPane.LEFT); - jScrollPane6.getViewport().add(pass3bJList, null); - jSplitPane4.add(jScrollPane7, JSplitPane.RIGHT); - jScrollPane7.getViewport().add(pass3bTextPane, null); - jScrollPane4.getViewport().add(pass2TextPane, null); - jSplitPane1.add(jPanel2, JSplitPane.TOP); - jPanel2.add(jScrollPane1, null); - jSplitPane1.add(jPanel1, JSplitPane.BOTTOM); - jPanel1.add(jSplitPane2, null); - jScrollPane1.getViewport().add(classNamesJList, null); - jMenuBar1.add(jMenu1); - jMenuBar1.add(jMenu2); - contentPane.add(jSplitPane1, "jSplitPane1"); - jMenu1.add(newFileMenuItem); - jMenu2.add(whatisMenuItem); - jMenu2.add(aboutMenuItem); - jSplitPane2.setDividerLocation(300); - jSplitPane3.setDividerLocation(150); - jSplitPane4.setDividerLocation(150); - } - /** Overridden to stop the application on a closing window. */ - protected void processWindowEvent(WindowEvent e) { - super.processWindowEvent(e); - if (e.getID() == WindowEvent.WINDOW_CLOSING) { - System.exit(0); + /** Initizalization of the components. */ + private void jbInit() throws Exception { + //setIconImage(Toolkit.getDefaultToolkit().createImage(Frame1.class.getResource("[Ihr Symbol]"))); + contentPane = (JPanel) this.getContentPane(); + contentPane.setLayout(cardLayout1); + this.setJMenuBar(jMenuBar1); + this.setSize(new Dimension(708, 451)); + this.setTitle("JustIce"); + jPanel1.setMinimumSize(new Dimension(100, 100)); + jPanel1.setPreferredSize(new Dimension(100, 100)); + jPanel1.setLayout(gridLayout1); + jSplitPane2.setOrientation(JSplitPane.VERTICAL_SPLIT); + jPanel2.setLayout(gridLayout2); + jPanel3.setMinimumSize(new Dimension(200, 100)); + jPanel3.setPreferredSize(new Dimension(400, 400)); + jPanel3.setLayout(gridLayout4); + messagesPanel.setMinimumSize(new Dimension(100, 100)); + messagesPanel.setLayout(gridLayout3); + jPanel2.setMinimumSize(new Dimension(200, 100)); + jMenu1.setText("File"); + jScrollPane1.getViewport().setBackground(Color.red); + messagesScrollPane.getViewport().setBackground(Color.red); + messagesScrollPane.setPreferredSize(new Dimension(10, 10)); + classNamesJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + + public void valueChanged( ListSelectionEvent e ) { + classNamesJList_valueChanged(e); + } + }); + classNamesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + jScrollPane3.setBorder(BorderFactory.createLineBorder(Color.black)); + jScrollPane3.setPreferredSize(new Dimension(100, 100)); + gridLayout4.setRows(4); + gridLayout4.setColumns(1); + gridLayout4.setHgap(1); + jScrollPane4.setBorder(BorderFactory.createLineBorder(Color.black)); + jScrollPane4.setPreferredSize(new Dimension(100, 100)); + pass1TextPane.setBorder(BorderFactory.createRaisedBevelBorder()); + pass1TextPane.setToolTipText(""); + pass1TextPane.setEditable(false); + pass2TextPane.setBorder(BorderFactory.createRaisedBevelBorder()); + pass2TextPane.setEditable(false); + messagesTextPane.setBorder(BorderFactory.createRaisedBevelBorder()); + messagesTextPane.setEditable(false); + newFileMenuItem.setText("New..."); + newFileMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(78, + java.awt.event.KeyEvent.CTRL_MASK, true)); + newFileMenuItem.addActionListener(new java.awt.event.ActionListener() { + + public void actionPerformed( ActionEvent e ) { + newFileMenuItem_actionPerformed(e); + } + }); + pass3aTextPane.setEditable(false); + pass3bTextPane.setEditable(false); + pass3aJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + + public void valueChanged( ListSelectionEvent e ) { + pass3aJList_valueChanged(e); + } + }); + pass3bJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + + public void valueChanged( ListSelectionEvent e ) { + pass3bJList_valueChanged(e); + } + }); + jMenu2.setText("Help"); + whatisMenuItem.setText("What is..."); + whatisMenuItem.addActionListener(new java.awt.event.ActionListener() { + + public void actionPerformed( ActionEvent e ) { + whatisMenuItem_actionPerformed(e); + } + }); + aboutMenuItem.setText("About"); + aboutMenuItem.addActionListener(new java.awt.event.ActionListener() { + + public void actionPerformed( ActionEvent e ) { + aboutMenuItem_actionPerformed(e); + } + }); + jSplitPane2.add(messagesPanel, JSplitPane.BOTTOM); + messagesPanel.add(messagesScrollPane, null); + messagesScrollPane.getViewport().add(messagesTextPane, null); + jSplitPane2.add(jPanel3, JSplitPane.TOP); + jPanel3.add(jScrollPane3, null); + jScrollPane3.getViewport().add(pass1TextPane, null); + jPanel3.add(jScrollPane4, null); + jPanel3.add(jSplitPane3, null); + jSplitPane3.add(jScrollPane2, JSplitPane.LEFT); + jScrollPane2.getViewport().add(pass3aJList, null); + jSplitPane3.add(jScrollPane5, JSplitPane.RIGHT); + jScrollPane5.getViewport().add(pass3aTextPane, null); + jPanel3.add(jSplitPane4, null); + jSplitPane4.add(jScrollPane6, JSplitPane.LEFT); + jScrollPane6.getViewport().add(pass3bJList, null); + jSplitPane4.add(jScrollPane7, JSplitPane.RIGHT); + jScrollPane7.getViewport().add(pass3bTextPane, null); + jScrollPane4.getViewport().add(pass2TextPane, null); + jSplitPane1.add(jPanel2, JSplitPane.TOP); + jPanel2.add(jScrollPane1, null); + jSplitPane1.add(jPanel1, JSplitPane.BOTTOM); + jPanel1.add(jSplitPane2, null); + jScrollPane1.getViewport().add(classNamesJList, null); + jMenuBar1.add(jMenu1); + jMenuBar1.add(jMenu2); + contentPane.add(jSplitPane1, "jSplitPane1"); + jMenu1.add(newFileMenuItem); + jMenu2.add(whatisMenuItem); + jMenu2.add(aboutMenuItem); + jSplitPane2.setDividerLocation(300); + jSplitPane3.setDividerLocation(150); + jSplitPane4.setDividerLocation(150); } - } - - synchronized void classNamesJList_valueChanged(ListSelectionEvent e) { - if (e.getValueIsAdjusting()) return; - current_class = classNamesJList.getSelectedValue().toString(); - try { - verify(); - } catch (ClassNotFoundException ex) { - // FIXME: report the error using the GUI - ex.printStackTrace(); - } - classNamesJList.setSelectedValue(current_class, true); - } - - private void verify() throws ClassNotFoundException { - setTitle("PLEASE WAIT"); - - Verifier v = VerifierFactory.getVerifier(current_class); - v.flush(); // Don't cache the verification result for this class. - VerificationResult vr; - - vr = v.doPass1(); - if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED){ - pass1TextPane.setText(vr.getMessage()); - pass1TextPane.setBackground(Color.red); - - pass2TextPane.setText(""); - pass2TextPane.setBackground(Color.yellow); - pass3aTextPane.setText(""); - pass3aJList.setListData(new Object[0]); - pass3aTextPane.setBackground(Color.yellow); - - pass3bTextPane.setText(""); - pass3bJList.setListData(new Object[0]); - pass3bTextPane.setBackground(Color.yellow); + /** Overridden to stop the application on a closing window. */ + protected void processWindowEvent( WindowEvent e ) { + super.processWindowEvent(e); + if (e.getID() == WindowEvent.WINDOW_CLOSING) { + System.exit(0); + } } - else{ // Must be VERIFIED_OK, Pass 1 does not know VERIFIED_NOTYET - pass1TextPane.setBackground(Color.green); - pass1TextPane.setText(vr.getMessage()); - - vr = v.doPass2(); - if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED){ - pass2TextPane.setText(vr.getMessage()); - pass2TextPane.setBackground(Color.red); - pass3aTextPane.setText(""); - pass3aTextPane.setBackground(Color.yellow); - pass3aJList.setListData(new Object[0]); - pass3bTextPane.setText(""); - pass3bTextPane.setBackground(Color.yellow); - pass3bJList.setListData(new Object[0]); - } - else{ // must be Verified_OK, because Pass1 was OK (cannot be Verified_NOTYET). - pass2TextPane.setText(vr.getMessage()); - pass2TextPane.setBackground(Color.green); - JavaClass jc = Repository.lookupClass(current_class); - /* - boolean all3aok = true; - boolean all3bok = true; - String all3amsg = ""; - String all3bmsg = ""; - */ - - String[] methodnames = new String[jc.getMethods().length]; - for (int i=0; i", - JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); - } + void aboutMenuItem_actionPerformed( ActionEvent e ) { + JOptionPane + .showMessageDialog( + this, + "JustIce is a Java class file verifier.\nIt was implemented by Enver Haase in 2001, 2002.\n", + JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); + } + - void whatisMenuItem_actionPerformed(ActionEvent e) { - JOptionPane.showMessageDialog(this, - "The upper four boxes to the right reflect verification passes according to The Java Virtual Machine Specification.\nThese are (in that order): Pass one, Pass two, Pass three (before data flow analysis), Pass three (data flow analysis).\nThe bottom box to the right shows (warning) messages; warnings do not cause a class to be rejected.", - JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); - } + void whatisMenuItem_actionPerformed( ActionEvent e ) { + JOptionPane + .showMessageDialog( + this, + "The upper four boxes to the right reflect verification passes according to The Java Virtual Machine Specification.\nThese are (in that order): Pass one, Pass two, Pass three (before data flow analysis), Pass three (data flow analysis).\nThe bottom box to the right shows (warning) messages; warnings do not cause a class to be rejected.", + JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); + } } diff --git a/src/java/org/apache/bcel/verifier/VerifierFactory.java b/src/java/org/apache/bcel/verifier/VerifierFactory.java index fe7eadbf..c787ec24 100644 --- a/src/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/java/org/apache/bcel/verifier/VerifierFactory.java @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.verifier; - import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -33,74 +32,79 @@ import java.util.Vector; * @author Enver Haase * @see org.apache.bcel.verifier.Verifier */ -public class VerifierFactory{ +public class VerifierFactory { + + /** + * The HashMap that holds the data about the already-constructed Verifier instances. + */ + private static Map hashMap = new HashMap(); + /** + * The VerifierFactoryObserver instances that observe the VerifierFactory. + */ + private static List observers = new Vector(); + + + /** + * The VerifierFactory is not instantiable. + */ + private VerifierFactory() { + } + + + /** + * Returns the (only) verifier responsible for the class with the given name. + * Possibly a new Verifier object is transparently created. + * @return the (only) verifier responsible for the class with the given name. + */ + public static Verifier getVerifier( String fully_qualified_classname ) { + Verifier v = (Verifier) (hashMap.get(fully_qualified_classname)); + if (v == null) { + v = new Verifier(fully_qualified_classname); + hashMap.put(fully_qualified_classname, v); + notify(fully_qualified_classname); + } + return v; + } + + + /** + * Notifies the observers of a newly generated Verifier. + */ + private static void notify( String fully_qualified_classname ) { + // notify the observers + Iterator i = observers.iterator(); + while (i.hasNext()) { + VerifierFactoryObserver vfo = (VerifierFactoryObserver) i.next(); + vfo.update(fully_qualified_classname); + } + } - /** - * The HashMap that holds the data about the already-constructed Verifier instances. - */ - private static Map hashMap = new HashMap(); - /** - * The VerifierFactoryObserver instances that observe the VerifierFactory. - */ - private static List observers = new Vector(); + /** + * Returns all Verifier instances created so far. + * This is useful when a Verifier recursively lets + * the VerifierFactory create other Verifier instances + * and if you want to verify the transitive hull of + * referenced class files. + */ + public static Verifier[] getVerifiers() { + Verifier[] vs = new Verifier[hashMap.values().size()]; + return (Verifier[]) (hashMap.values().toArray(vs)); // Because vs is big enough, vs is used to store the values into and returned! + } - /** - * The VerifierFactory is not instantiable. - */ - private VerifierFactory(){} - - /** - * Returns the (only) verifier responsible for the class with the given name. - * Possibly a new Verifier object is transparently created. - * @return the (only) verifier responsible for the class with the given name. - */ - public static Verifier getVerifier(String fully_qualified_classname){ - Verifier v = (Verifier) (hashMap.get(fully_qualified_classname)); - if (v==null){ - v = new Verifier(fully_qualified_classname); - hashMap.put(fully_qualified_classname, v); - notify(fully_qualified_classname); - } - - return v; - } - /** - * Notifies the observers of a newly generated Verifier. - */ - private static void notify(String fully_qualified_classname){ - // notify the observers - Iterator i = observers.iterator(); - while (i.hasNext()){ - VerifierFactoryObserver vfo = (VerifierFactoryObserver) i.next(); - vfo.update(fully_qualified_classname); - } - } + /** + * Adds the VerifierFactoryObserver o to the list of observers. + */ + public static void attach( VerifierFactoryObserver o ) { + observers.add(o); + } - /** - * Returns all Verifier instances created so far. - * This is useful when a Verifier recursively lets - * the VerifierFactory create other Verifier instances - * and if you want to verify the transitive hull of - * referenced class files. - */ - public static Verifier[] getVerifiers(){ - Verifier[] vs = new Verifier[hashMap.values().size()]; - return (Verifier[]) (hashMap.values().toArray(vs)); // Because vs is big enough, vs is used to store the values into and returned! - } - /** - * Adds the VerifierFactoryObserver o to the list of observers. - */ - public static void attach(VerifierFactoryObserver o){ - observers.add(o); - } - - /** - * Removes the VerifierFactoryObserver o from the list of observers. - */ - public static void detach(VerifierFactoryObserver o){ - observers.remove(o); - } + /** + * Removes the VerifierFactoryObserver o from the list of observers. + */ + public static void detach( VerifierFactoryObserver o ) { + observers.remove(o); + } } diff --git a/src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index 423cd6d4..c08fefb0 100644 --- a/src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -13,10 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */ + */ package org.apache.bcel.verifier; import javax.swing.event.ListDataEvent; + /** * This class implements an adapter; it implements both a Swing ListModel and * a VerifierFactoryObserver. @@ -24,46 +25,51 @@ import javax.swing.event.ListDataEvent; * @version $Id$ * @author Enver Haase */ -public class VerifierFactoryListModel implements org.apache.bcel.verifier.VerifierFactoryObserver, javax.swing.ListModel{ +public class VerifierFactoryListModel implements org.apache.bcel.verifier.VerifierFactoryObserver, + javax.swing.ListModel { - private java.util.ArrayList listeners = new java.util.ArrayList(); + private java.util.ArrayList listeners = new java.util.ArrayList(); + private java.util.TreeSet cache = new java.util.TreeSet(); - private java.util.TreeSet cache = new java.util.TreeSet(); - public VerifierFactoryListModel() { - VerifierFactory.attach(this); - update(null); // fill cache. - } + public VerifierFactoryListModel() { + VerifierFactory.attach(this); + update(null); // fill cache. + } - public synchronized void update(String s){ - int size = listeners.size(); - Verifier[] verifiers = VerifierFactory.getVerifiers(); - int num_of_verifiers = verifiers.length; - cache.clear(); - for (int i=0; i= localVariablesInfos.length){ throw new AssertionViolatedException("Method number out of range."); } @@ -163,9 +165,9 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); } return vr; - } - else - return VerificationResult.VR_NOTYET; + } else { + return VerificationResult.VR_NOTYET; + } } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. @@ -386,13 +388,17 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } if (atts[i] instanceof SourceFile){ - if (foundSourceFile == false) foundSourceFile = true; - else throw new ClassConstraintException("A ClassFile structure (like '"+tostring(obj)+"') may have no more than one SourceFile attribute."); //vmspec2 4.7.7 + if (foundSourceFile == false) { + foundSourceFile = true; + } else { + throw new ClassConstraintException("A ClassFile structure (like '"+tostring(obj)+"') may have no more than one SourceFile attribute."); //vmspec2 4.7.7 + } } if (atts[i] instanceof InnerClasses){ - if (foundInnerClasses == false) foundInnerClasses = true; - else{ + if (foundInnerClasses == false) { + foundInnerClasses = true; + } else{ if (hasInnerClass){ throw new ClassConstraintException("A Classfile structure (like '"+tostring(obj)+"') must have exactly one InnerClasses attribute if at least one Inner Class is referenced (which is the case). More than one InnerClasses attribute was found."); } @@ -493,9 +499,15 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ if (jc.isClass()){ int maxone=0; - if (obj.isPrivate()) maxone++; - if (obj.isProtected()) maxone++; - if (obj.isPublic()) maxone++; + if (obj.isPrivate()) { + maxone++; + } + if (obj.isProtected()) { + maxone++; + } + if (obj.isPublic()) { + maxone++; + } if (maxone > 1){ throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); } @@ -590,7 +602,9 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ // Check if referenced objects exist. Type act = t; - if (act instanceof ArrayType) act = ((ArrayType) act).getBasicType(); + if (act instanceof ArrayType) { + act = ((ArrayType) act).getBasicType(); + } if (act instanceof ObjectType){ Verifier v = VerifierFactory.getVerifier( ((ObjectType) act).getClassName() ); VerificationResult vr = v.doPass1(); @@ -601,7 +615,9 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ for (int i=0; i 1){ throw new ClassConstraintException("Method '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); } if (obj.isAbstract()){ - if (obj.isFinal()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_FINAL modifier set."); - if (obj.isNative()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_NATIVE modifier set."); - if (obj.isPrivate()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_PRIVATE modifier set."); - if (obj.isStatic()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STATIC modifier set."); - if (obj.isStrictfp()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STRICT modifier set."); - if (obj.isSynchronized()) throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_SYNCHRONIZED modifier set."); + if (obj.isFinal()) { + throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_FINAL modifier set."); + } + if (obj.isNative()) { + throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_NATIVE modifier set."); + } + if (obj.isPrivate()) { + throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_PRIVATE modifier set."); + } + if (obj.isStatic()) { + throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STATIC modifier set."); + } + if (obj.isStrictfp()) { + throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STRICT modifier set."); + } + if (obj.isSynchronized()) { + throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_SYNCHRONIZED modifier set."); + } } } else{ // isInterface! @@ -703,7 +737,9 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ if ((atts[i] instanceof Code) && (obj.isNative() || obj.isAbstract())){ throw new ClassConstraintException("Native or abstract methods like '"+tostring(obj)+"' must not have a Code attribute like '"+tostring(atts[i])+"'."); //vmspec2 page120, 4.7.3 } - if (atts[i] instanceof Code) num_code_atts++; + if (atts[i] instanceof Code) { + num_code_atts++; + } } if ( !obj.isNative() && !obj.isAbstract() && num_code_atts != 1){ throw new ClassConstraintException("Non-native, non-abstract methods like '"+tostring(obj)+"' must have exactly one Code attribute (found: "+num_code_atts+")."); @@ -880,7 +916,9 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ JavaClass t = Repository.lookupClass(Type.THROWABLE.getClassName()); JavaClass o = Repository.lookupClass(Type.OBJECT.getClassName()); while (e != o){ - if (e == t) break; // It's a subclass of Throwable, OKAY, leave. + if (e == t) { + break; // It's a subclass of Throwable, OKAY, leave. + } v = VerifierFactory.getVerifier(e.getSuperclassName()); vr = v.doPass1(); @@ -891,7 +929,9 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ e = Repository.lookupClass(e.getSuperclassName()); } } - if (e != t) throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(exc_table[i])+"' that references '"+cname+"' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); + if (e != t) { + throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(exc_table[i])+"' that references '"+cname+"' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); + } } } } @@ -1019,7 +1059,9 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ JavaClass t = Repository.lookupClass(Type.THROWABLE.getClassName()); JavaClass o = Repository.lookupClass(Type.OBJECT.getClassName()); while (e != o){ - if (e == t) break; // It's a subclass of Throwable, OKAY, leave. + if (e == t) { + break; // It's a subclass of Throwable, OKAY, leave. + } v = VerifierFactory.getVerifier(e.getSuperclassName()); vr = v.doPass1(); @@ -1030,7 +1072,9 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ e = Repository.lookupClass(e.getSuperclassName()); } } - if (e != t) throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); + if (e != t) { + throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); + } } } @@ -1258,7 +1302,9 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * for the class/interface initialization method may be allowed. */ private static boolean validMethodName(String name, boolean allowStaticInit){ - if (validJavaLangMethodName(name)) return true; + if (validJavaLangMethodName(name)) { + return true; + } if (allowStaticInit){ return (name.equals(CONSTRUCTOR_NAME) || name.equals(STATIC_INITIALIZER_NAME)); @@ -1284,10 +1330,14 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * Conforming to: The Java Virtual Machine Specification, Second Edition, §2.7, §2.7.1, §2.2. */ private static boolean validJavaLangMethodName(String name){ - if (!Character.isJavaIdentifierStart(name.charAt(0))) return false; + if (!Character.isJavaIdentifierStart(name.charAt(0))) { + return false; + } for (int i=1; i, thanks! + if (name.length() == 0) { + return false; // must not be empty, reported by , thanks! + } // vmspec2 2.7, vmspec2 2.2 - if (!Character.isJavaIdentifierStart(name.charAt(0))) return false; + if (!Character.isJavaIdentifierStart(name.charAt(0))) { + return false; + } for (int i=1; i=0; i--){ InstructionContextImpl current = (InstructionContextImpl) (executionPredecessors.get(i)); Instruction currentlast = current.getInstruction().getInstruction(); - if (currentlast instanceof RET) retcount++; + if (currentlast instanceof RET) { + retcount++; + } if (currentlast instanceof JsrInstruction){ retcount--; - if (retcount == -1) return current; + if (retcount == -1) { + return current; + } } } return null; diff --git a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index 44fe9509..8c5d5899 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -63,8 +63,9 @@ public class ExceptionHandlers{ */ public ExceptionHandler[] getExceptionHandlers(InstructionHandle ih){ Set hs = (Set) exceptionhandlers.get(ih); - if (hs == null) return new ExceptionHandler[0]; - else{ + if (hs == null) { + return new ExceptionHandler[0]; + } else{ ExceptionHandler[] ret = new ExceptionHandler[hs.size()]; return (ExceptionHandler[]) (hs.toArray(ret)); } diff --git a/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index ffe02cf6..1be9db22 100644 --- a/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -167,10 +167,11 @@ public class ExecutionVisitor extends EmptyVisitor implements Visitor{ public void visitATHROW(ATHROW o){ Type t = stack().pop(); stack().clear(); - if (t.equals(Type.NULL)) - stack().push(Type.getType("Ljava/lang/NullPointerException;")); - else - stack().push(t); + if (t.equals(Type.NULL)) { + stack().push(Type.getType("Ljava/lang/NullPointerException;")); + } else { + stack().push(t); + } } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @@ -505,8 +506,9 @@ public class ExecutionVisitor extends EmptyVisitor implements Visitor{ if ( t.equals(Type.BOOLEAN) || t.equals(Type.CHAR) || t.equals(Type.BYTE) || - t.equals(Type.SHORT) ) - t = Type.INT; + t.equals(Type.SHORT) ) { + t = Type.INT; + } stack().push(t); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @@ -515,8 +517,9 @@ public class ExecutionVisitor extends EmptyVisitor implements Visitor{ if ( t.equals(Type.BOOLEAN) || t.equals(Type.CHAR) || t.equals(Type.BYTE) || - t.equals(Type.SHORT) ) - t = Type.INT; + t.equals(Type.SHORT) ) { + t = Type.INT; + } stack().push(t); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @@ -702,8 +705,9 @@ public class ExecutionVisitor extends EmptyVisitor implements Visitor{ if ( t.equals(Type.BOOLEAN) || t.equals(Type.CHAR) || t.equals(Type.BYTE) || - t.equals(Type.SHORT) ) - t = Type.INT; + t.equals(Type.SHORT) ) { + t = Type.INT; + } stack().push(t); } } @@ -730,8 +734,9 @@ public class ExecutionVisitor extends EmptyVisitor implements Visitor{ if ( t.equals(Type.BOOLEAN) || t.equals(Type.CHAR) || t.equals(Type.BYTE) || - t.equals(Type.SHORT) ) - t = Type.INT; + t.equals(Type.SHORT) ) { + t = Type.INT; + } stack().push(t); } } @@ -749,8 +754,9 @@ public class ExecutionVisitor extends EmptyVisitor implements Visitor{ if ( t.equals(Type.BOOLEAN) || t.equals(Type.CHAR) || t.equals(Type.BYTE) || - t.equals(Type.SHORT) ) - t = Type.INT; + t.equals(Type.SHORT) ) { + t = Type.INT; + } stack().push(t); } } @@ -769,8 +775,9 @@ public class ExecutionVisitor extends EmptyVisitor implements Visitor{ if ( t.equals(Type.BOOLEAN) || t.equals(Type.CHAR) || t.equals(Type.BYTE) || - t.equals(Type.SHORT) ) - t = Type.INT; + t.equals(Type.SHORT) ) { + t = Type.INT; + } stack().push(t); } } diff --git a/src/java/org/apache/bcel/verifier/structurals/Frame.java b/src/java/org/apache/bcel/verifier/structurals/Frame.java index 91182a27..8cd62c92 100644 --- a/src/java/org/apache/bcel/verifier/structurals/Frame.java +++ b/src/java/org/apache/bcel/verifier/structurals/Frame.java @@ -99,7 +99,9 @@ public class Frame{ * */ public boolean equals(Object o){ - if (!(o instanceof Frame)) return false; // implies "null" is non-equal. + if (!(o instanceof Frame)) { + return false; // implies "null" is non-equal. + } Frame f = (Frame) o; return this.stack.equals(f.stack) && this.locals.equals(f.locals); } diff --git a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index ec53c58f..0a44ea58 100644 --- a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -146,8 +146,9 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc * @throws org.apache.bcel.verifier.exc.StructuralCodeConstraintException if the above constraint is not satisfied. */ private void indexOfInt(Instruction o, Type index){ - if (! index.equals(Type.INT)) - constraintViolated(o, "The 'index' is not of type int but of type "+index+"."); + if (! index.equals(Type.INT)) { + constraintViolated(o, "The 'index' is not of type int but of type "+index+"."); + } } /** @@ -164,8 +165,9 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc /** Assures value is of type INT. */ private void valueOfInt(Instruction o, Type value){ - if (! value.equals(Type.INT)) - constraintViolated(o, "The 'value' is not of type int but of type "+value+"."); + if (! value.equals(Type.INT)) { + constraintViolated(o, "The 'value' is not of type int but of type "+value+"."); + } } /** @@ -174,8 +176,9 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc * @throws org.apache.bcel.verifier.exc.StructuralCodeConstraintException if the above constraint is violated. */ private boolean arrayrefOfArrayType(Instruction o, Type arrayref){ - if (! ((arrayref instanceof ArrayType) || arrayref.equals(Type.NULL)) ) - constraintViolated(o, "The 'arrayref' does not refer to an array but is of type "+arrayref+"."); + if (! ((arrayref instanceof ArrayType) || arrayref.equals(Type.NULL)) ) { + constraintViolated(o, "The 'arrayref' does not refer to an array but is of type "+arrayref+"."); + } return (arrayref instanceof ArrayType); } @@ -492,10 +495,11 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc * Ensures the specific preconditions of the said instruction. */ public void visitANEWARRAY(ANEWARRAY o){ - if (!stack().peek().equals(Type.INT)) - constraintViolated(o, "The 'count' at the stack top is not of type '"+Type.INT+"' but of type '"+stack().peek()+"'."); + if (!stack().peek().equals(Type.INT)) { + constraintViolated(o, "The 'count' at the stack top is not of type '"+Type.INT+"' but of type '"+stack().peek()+"'."); // The runtime constant pool item at that index must be a symbolic reference to a class, // array, or interface type. See Pass 3a. + } } /** @@ -548,7 +552,9 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } // NULL is a subclass of every class, so to speak. - if (stack().peek().equals(Type.NULL)) return; + if (stack().peek().equals(Type.NULL)) { + return; + } ObjectType exc = (ObjectType) (stack().peek()); ObjectType throwable = (ObjectType) (Type.getType("Ljava/lang/Throwable;")); @@ -588,8 +594,9 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc valueOfInt(o, value); if (arrayrefOfArrayType(o, arrayref)){ if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || - (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ) - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); + (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ) { + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); + } } } @@ -1185,15 +1192,17 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc Type o_type = o.getType(cpg); if (f_type.equals(o_type)){ f = fields[i]; - if ((f.getAccessFlags() & (Constants.ACC_PUBLIC | Constants.ACC_PROTECTED)) == 0) - f = null; + if ((f.getAccessFlags() & (Constants.ACC_PUBLIC | Constants.ACC_PROTECTED)) == 0) { + f = null; + } break outer; } } } } - if (f == null) - throw new AssertionViolatedException("Field '"+field_name+"' not found?!?"); + if (f == null) { + throw new AssertionViolatedException("Field '"+field_name+"' not found?!?"); + } } if (f.isProtected()){ diff --git a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 8ddd74f6..05a0ab97 100644 --- a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -97,9 +97,13 @@ public class LocalVariables{ * Fulfills the general contract of Object.equals(). */ public boolean equals(Object o){ - if (!(o instanceof LocalVariables)) return false; + if (!(o instanceof LocalVariables)) { + return false; + } LocalVariables lv = (LocalVariables) o; - if (this.locals.length != lv.locals.length) return false; + if (this.locals.length != lv.locals.length) { + return false; + } for (int i=0; i Date: Mon, 20 Mar 2006 12:41:31 +0000 Subject: [PATCH 0333/1313] added @since git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@387205 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/classfile/AnnotationDefault.java | 1 + src/java/org/apache/bcel/classfile/AnnotationEntry.java | 1 + src/java/org/apache/bcel/classfile/Annotations.java | 1 + src/java/org/apache/bcel/classfile/ElementValue.java | 1 + src/java/org/apache/bcel/classfile/ElementValuePair.java | 1 + src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java | 1 + src/java/org/apache/bcel/classfile/ParameterAnnotations.java | 1 + .../org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java | 1 + .../bcel/classfile/RuntimeInvisibleParameterAnnotations.java | 1 + .../org/apache/bcel/classfile/RuntimeVisibleAnnotations.java | 1 + .../bcel/classfile/RuntimeVisibleParameterAnnotations.java | 1 + src/java/org/apache/bcel/util/BCELComparator.java | 1 + 12 files changed, 12 insertions(+) diff --git a/src/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/java/org/apache/bcel/classfile/AnnotationDefault.java index 3fe48d3f..119b9274 100644 --- a/src/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -24,6 +24,7 @@ import java.io.IOException; * * @version $Id: AnnotationDefault 1 2005-02-13 03:15:08Z dbrosius $ * @author D. Brosius + * @since 5.2 */ public abstract class AnnotationDefault extends Attribute { diff --git a/src/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/java/org/apache/bcel/classfile/AnnotationEntry.java index fd03091d..40b68063 100644 --- a/src/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -25,6 +25,7 @@ import org.apache.bcel.Constants; * * @version $Id: AnnotationEntry * @author D. Brosius + * @since 5.2 */ public class AnnotationEntry implements Node, Constants { diff --git a/src/java/org/apache/bcel/classfile/Annotations.java b/src/java/org/apache/bcel/classfile/Annotations.java index df3cbaed..2b3ab652 100644 --- a/src/java/org/apache/bcel/classfile/Annotations.java +++ b/src/java/org/apache/bcel/classfile/Annotations.java @@ -24,6 +24,7 @@ import java.io.IOException; * * @version $Id: Annotations * @author D. Brosius + * @since 5.2 */ public abstract class Annotations extends Attribute { diff --git a/src/java/org/apache/bcel/classfile/ElementValue.java b/src/java/org/apache/bcel/classfile/ElementValue.java index 17910eb8..4cda0883 100644 --- a/src/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/java/org/apache/bcel/classfile/ElementValue.java @@ -25,6 +25,7 @@ import java.io.IOException; * * @version $Id: ElementValue * @author D. Brosius + * @since 5.2 */ public class ElementValue { diff --git a/src/java/org/apache/bcel/classfile/ElementValuePair.java b/src/java/org/apache/bcel/classfile/ElementValuePair.java index 717d6798..95d4777d 100644 --- a/src/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/java/org/apache/bcel/classfile/ElementValuePair.java @@ -24,6 +24,7 @@ import java.io.IOException; * * @version $Id: ElementValuePair * @author D. Brosius + * @since 5.2 */ public class ElementValuePair { diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index 3d210c4e..cd6d71ca 100644 --- a/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -25,6 +25,7 @@ import org.apache.bcel.Constants; * * @version $Id: ParameterAnnotationEntry * @author D. Brosius + * @since 5.2 */ public class ParameterAnnotationEntry implements Node, Constants { diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/java/org/apache/bcel/classfile/ParameterAnnotations.java index 706ed1cd..fea23b34 100644 --- a/src/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -24,6 +24,7 @@ import java.io.IOException; * * @version $Id: ParameterAnnotations * @author D. Brosius + * @since 5.2 */ public abstract class ParameterAnnotations extends Attribute { diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 2e5042c5..80cf2816 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -26,6 +26,7 @@ import org.apache.bcel.Constants; * * @version $Id: RuntimeInvisibleAnnotations * @author D. Brosius + * @since 5.2 */ public class RuntimeInvisibleAnnotations extends Annotations { diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 327f786e..e7c8f4f1 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -26,6 +26,7 @@ import org.apache.bcel.Constants; * * @version $Id: RuntimeInvisibleParameterAnnotations * @author D. Brosius + * @since 5.2 */ public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 0836631f..498bfa21 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -26,6 +26,7 @@ import org.apache.bcel.Constants; * * @version $Id: RuntimeVisibleAnnotations * @author D. Brosius + * @since 5.2 */ public class RuntimeVisibleAnnotations extends Annotations { diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index 2dd9067b..61f08aa5 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -26,6 +26,7 @@ import org.apache.bcel.Constants; * * @version $Id: RuntimeVisibleParameterAnnotations * @author D. Brosius + * @since 5.2 */ public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { diff --git a/src/java/org/apache/bcel/util/BCELComparator.java b/src/java/org/apache/bcel/util/BCELComparator.java index 2b3008bb..b3a8f583 100644 --- a/src/java/org/apache/bcel/util/BCELComparator.java +++ b/src/java/org/apache/bcel/util/BCELComparator.java @@ -5,6 +5,7 @@ package org.apache.bcel.util; * * @author M. Dahm * @version $Id$ + * @since 5.2 */ public interface BCELComparator { -- GitLab From 080e5e7ccb47a70b6f3530259d02f17d866ff27e Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Mon, 20 Mar 2006 12:42:16 +0000 Subject: [PATCH 0334/1313] manifest additions git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@387206 13f79535-47bb-0310-9956-ffa450edef68 --- project.properties | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/project.properties b/project.properties index fd52d399..a5269b5a 100644 --- a/project.properties +++ b/project.properties @@ -24,6 +24,10 @@ maven.compile.optimize = off maven.compile.source = 1.3 maven.compile.target = 1.3 +maven.jar.manifest.attributes.list=X-Compile-Source-JDK,X-Compile-Target-JDK +maven.jar.manifest.attribute.X-Compile-Source-JDK=${maven.compile.source} +maven.jar.manifest.attribute.X-Compile-Target-JDK=${maven.compile.target} + maven.jarResources.basedir = src/java maven.jar.excludes = **/package.html #maven.junit.fork = true -- GitLab From e71856fc12fa22940b8c39867fe409c931964350 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Mon, 20 Mar 2006 12:43:18 +0000 Subject: [PATCH 0335/1313] preparing readme and release notes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@387207 13f79535-47bb-0310-9956-ffa450edef68 --- README.txt | 58 ++++++++++++++++------------------------------- RELEASE-NOTES.txt | 39 +++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 38 deletions(-) create mode 100644 RELEASE-NOTES.txt diff --git a/README.txt b/README.txt index 70e53ba3..4f30d9cf 100644 --- a/README.txt +++ b/README.txt @@ -1,54 +1,36 @@ +Running a console based verifier + java org.apache.bcel.verifier.Verifier fully.qualified.class.Name --------------------------------- -RUNNING A CONSOLE-BASED VERIFIER --------------------------------- + lets JustIce work standalone. + If you get a "java.lang.OutOfMemoryError", you should increase the + maximum Java heap space. A command like -A command like + java -Xmx1887436800 org.apache.bcel.verifier.Verifier f.q.c.Name - java org.apache.bcel.verifier.Verifier fully.qualified.class.Name + will usually resolve the problem. The value above is suitable for + big server machines; if your machine starts swapping to disk, try + to lower the value. -lets JustIce work standalone. -If you get a "java.lang.OutOfMemoryError", you should increase the -maximum Java heap space. A command like +Running a graphics based verifier - java -Xmx1887436800 org.apache.bcel.verifier.Verifier f.q.c.Name + If you prefer a graphical application, you should use a command like -will usually resolve the problem. The value above is suitable for -big server machines; if your machine starts swapping to disk, try -to lower the value. + java org.apache.bcel.verifier.GraphicalVerifier + to launch one. Again, you may have to resolve a memory issue depending + on the classes to verify. ---------------------------------- -RUNNING A GRAPHICS-BASED VERIFIER ---------------------------------- -If you prefer a graphical application, you should use a command like +Contact - java org.apache.bcel.verifier.GraphicalVerifier + If you spot a bug in the BCEL or its accompanying verifier "JustIce" please + check with the BCEL mailing list -to launch one. Again, you may have to resolve a memory issue depending -on the classes to verify. + http://jakarta.apache.org/bcel + or enter the issue into the BCEL bug database ------------------- -CONTACT THE AUTHOR ------------------- - -If you do something useful with JustIce, I'd like to hear about it! -Enver Haase -$Id$ - ------------------------------------------------------------------------------- -If you spot a bug in the BCEL or its accompanying verifier "JustIce" please -check with the BCEL mailing list - - http://jakarta.apache.org/site/mail2.html#BCEL - -and / or enter the issue into the BCEL bug database - - http://issues.apache.org/bugzilla/enter_bug.cgi?product=BCEL ------------------------------------------------------------------------------- - + http://issues.apache.org/bugzilla/enter_bug.cgi?product=BCEL diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt new file mode 100644 index 00000000..e5d36d5f --- /dev/null +++ b/RELEASE-NOTES.txt @@ -0,0 +1,39 @@ +BCEL 5.2 RELESE NOTES +===================== + + +INTRODUCTION: + + +Compatibility with 5.1 +---------------------- +Binary compatible - No + +Source compatible - No + +Semantic compatible - No + + +Deprecations from 5.1 +--------------------- + + +Bug fixes from 5.1 +------------------ + + +Enhancements from 5.1 +--------------------- + + +Feedback +-------- +Open source works best when you give feedback: +http://jakarta.apache.org/bcel + +Please direct all bug reports to Bugzilla +http://issues.apache.org/bugzilla/buglist.cgi?product=BCEL + +Or subscribe to the bcel-user mailing list + +The BCEL Team -- GitLab From ea27ae4b861ca17d36835bd75b5e1de8bd9640db Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 25 Mar 2006 04:31:35 +0000 Subject: [PATCH 0336/1313] bugs we closed git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@388700 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 74 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index e5d36d5f..ab7d1223 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,30 +1,88 @@ -BCEL 5.2 RELESE NOTES +BCEL 5.2 RELEASE NOTES ===================== -INTRODUCTION: - - Compatibility with 5.1 ---------------------- -Binary compatible - No +Binary compatible - Yes -Source compatible - No +Source compatible - Yes -Semantic compatible - No +Semantic compatible - Yes Deprecations from 5.1 --------------------- +public final org.apache.bcel.classfile.LocalVariable getLocalVariable(int) +public java.lang.String getClassName(org.apache.bcel.generic.ConstantPoolGen) +public org.apache.bcel.generic.ObjectType getClassType(org.apache.bcel.generic.ConstantPoolGen) +public boolean referencesClass() +public boolean referencesInterface() +public org.apache.bcel.util.ClassVector implements java.io.Serializable + Bug fixes from 5.1 ------------------ +32664 Examples with enum breaks Gump (JDK1.5) +32901 Truncated "class" string in returned class name +32980 Simple Javadoc cleanup +33018 Fix hashCode methods +34318 JavaClass.dump(OutputStream/DataOutputStream) shouldnt ca... +34449 InnerClass doesn't implement Serializable +35991 Unable to generate method that returns an array of integers +36110 A bug in LocalVariableGen +37648 JasminVisitor is outdated +37666 BCEL depends on AWT +38377 BCEL cannot be used as java.system.class.loader +38834 nullpointer exception in InstructionHandle +12568 Typo in javadocs +18031 ConstantPoolGen.lookupClass(String) finds LAST entry rath... +18323 Size of LDC_W's operand can be incorrect +18731 InstructionList.copy() fails with Select instruction. +19014 annoying print statement in org.apache.bcel.classfile.Sig... +19068 JavaClass.getAllInterfaces() can throw NullPointerExcepti... +19122 Repository ignores classes that have been added to it +19352 ANEWARRAY does not implement StackConsumer +19476 Repository.instanceOf() can throw NullPointerException +19784 StackMapType.printIndex fails if index is -1 +24274 ReturnaddressType.equals() fails with NullPointerException +24315 Verification failure when nested finally blocks +24350 PUTFIELD error msg wrong +24766 Suggestion to solve the Problem with generic.Instruction ... +26049 Incorrect verification of class files +26087 OutOfRange exception in Pass2Verifier.validJavaIdentifier +26179 Code attribute set for native (and abstract?) methods. +26532 InstructionList.move is broken when target == il.getEnd() +26533 bad iinc behavior with large local variable index +27855 StructuralVerifier can't find protected fields of ... +28329 BCEL does not compile with JDK 1.5.0-beta-b32c +29275 Corrupted instruction list created on valid class file +29903 LDC_W emits output with only one parameter byte +31604 Build problems against jdk1.5 +31630 ClassPath.getClassPath() does not handle multiple java.ex... +27646 Public modifier for OperandStack.size() +17753 Version information missing from MANIFEST.MF file. +33822 Wrong word in manual: use 'factorial', not 'faculty' +32205 A security issue with public mutable static fields in BECL +33513 Unnecessary string object allocation in ConstantPoolGen +34418 ClassCastException on justice +38787 XSLT transforms broken in Turkish Locale. +35405 Branch target offset too large for short +33235 "Illegal Opcode Detected" exception thrown in "new Method... +35610 Source downloads are broken +38424 LineNumberTable toString method uses jdk 1.4 StringBuffer... Enhancements from 5.1 --------------------- +32077 LocalVariableTable.getLocalVariable isn't good en... +20465 Verifer does not report the signature of methods not found +27854 Allow to get the InFrame of the ControlFlowGraph +33302 Add support for new Jdk5.0 access flags +32945 Wrap JavaClass repository class (map values) with... + Feedback -------- @@ -36,4 +94,4 @@ http://issues.apache.org/bugzilla/buglist.cgi?product=BCEL Or subscribe to the bcel-user mailing list -The BCEL Team +The BCEL Team \ No newline at end of file -- GitLab From dc9b33240febab90f93d66a1900a5d94574620ad Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 9 Apr 2006 20:02:13 +0000 Subject: [PATCH 0337/1313] implement hashCode and equals for Type git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@392823 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/generic/Type.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/java/org/apache/bcel/generic/Type.java index 5bee448c..beae234e 100644 --- a/src/java/org/apache/bcel/generic/Type.java +++ b/src/java/org/apache/bcel/generic/Type.java @@ -62,6 +62,26 @@ public abstract class Type implements java.io.Serializable { } + /** + * @return hashcode of Type + */ + public int hashCode() { + return type ^ signature.hashCode(); + } + + + /** + * @return whether the Types are equal + */ + public boolean equals(Object o) { + if (o instanceof Type) { + Type t = (Type)o; + return (type == t.type) && signature.equals(t.signature); + } + return false; + } + + /** * @return signature for given type. */ -- GitLab From 6f1fff6c11443cc64669b85264cc5cd40603c5b1 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Tue, 18 Apr 2006 13:23:09 +0000 Subject: [PATCH 0338/1313] fixed the ACC_FLAG loop git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@394938 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/bcel/util/BCELifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/java/org/apache/bcel/util/BCELifier.java index 60b771a7..4c35d642 100644 --- a/src/java/org/apache/bcel/util/BCELifier.java +++ b/src/java/org/apache/bcel/util/BCELifier.java @@ -192,7 +192,7 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { return "0"; } StringBuffer buf = new StringBuffer(); - for (int i = 0, pow = 1; i <= Constants.MAX_ACC_FLAG; i++) { + for (int i = 0, pow = 1; pow <= Constants.MAX_ACC_FLAG; i++) { if ((flags & pow) != 0) { if ((pow == Constants.ACC_SYNCHRONIZED) && (reason == FLAG_FOR_CLASS)) { buf.append("ACC_SUPER | "); -- GitLab From e1498d8c4f0d6273c30569df772f9a9ac9001e85 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Mon, 29 May 2006 12:13:21 +0000 Subject: [PATCH 0339/1313] fixed license headers git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@410088 13f79535-47bb-0310-9956-ffa450edef68 --- examples/HelloWorldBuilder.java | 16 ++++++++++++++++ examples/JasminVisitor.java | 16 ++++++++++++++++ examples/Mini/ASCII_CharStream.java | 16 ++++++++++++++++ examples/Mini/ASTExpr.java | 16 ++++++++++++++++ examples/Mini/ASTFactor.java | 16 ++++++++++++++++ examples/Mini/ASTFunAppl.java | 16 ++++++++++++++++ examples/Mini/ASTFunDecl.java | 16 ++++++++++++++++ examples/Mini/ASTIdent.java | 16 ++++++++++++++++ examples/Mini/ASTIfExpr.java | 16 ++++++++++++++++ examples/Mini/ASTInteger.java | 16 ++++++++++++++++ examples/Mini/ASTLetExpr.java | 16 ++++++++++++++++ examples/Mini/ASTProgram.java | 16 ++++++++++++++++ examples/Mini/ASTTerm.java | 16 ++++++++++++++++ examples/Mini/EnvEntry.java | 16 ++++++++++++++++ examples/Mini/Environment.java | 16 ++++++++++++++++ examples/Mini/Function.java | 16 ++++++++++++++++ examples/Mini/JJTMiniParserState.java | 16 ++++++++++++++++ examples/Mini/MiniC.java | 16 ++++++++++++++++ examples/Mini/MiniParser.java | 16 ++++++++++++++++ examples/Mini/MiniParserConstants.java | 16 ++++++++++++++++ examples/Mini/MiniParserTokenManager.java | 16 ++++++++++++++++ examples/Mini/MiniParserTreeConstants.java | 16 ++++++++++++++++ examples/Mini/Node.java | 16 ++++++++++++++++ examples/Mini/ParseException.java | 16 ++++++++++++++++ examples/Mini/SimpleNode.java | 16 ++++++++++++++++ examples/Mini/Token.java | 16 ++++++++++++++++ examples/Mini/TokenMgrError.java | 16 ++++++++++++++++ examples/Mini/Variable.java | 16 ++++++++++++++++ examples/Package.java | 16 ++++++++++++++++ examples/Peephole.java | 16 ++++++++++++++++ examples/ProxyCreator.java | 16 ++++++++++++++++ examples/TransitiveHull.java | 16 ++++++++++++++++ examples/helloify.java | 16 ++++++++++++++++ examples/id.java | 16 ++++++++++++++++ examples/listclass.java | 16 ++++++++++++++++ examples/maxstack.java | 16 ++++++++++++++++ examples/patchclass.java | 16 ++++++++++++++++ src/java/org/apache/bcel/Constants.java | 16 ++++++++++++++++ .../classfile/RuntimeInvisibleAnnotations.java | 2 +- .../RuntimeInvisibleParameterAnnotations.java | 2 +- .../classfile/RuntimeVisibleAnnotations.java | 2 +- .../RuntimeVisibleParameterAnnotations.java | 2 +- .../apache/bcel/generic/FieldGenOrMethodGen.java | 16 ++++++++++++++++ .../org/apache/bcel/util/BCELComparator.java | 16 ++++++++++++++++ src/java/org/apache/bcel/util/BCELFactory.java | 16 ++++++++++++++++ 45 files changed, 660 insertions(+), 4 deletions(-) diff --git a/examples/HelloWorldBuilder.java b/examples/HelloWorldBuilder.java index 67ec3dec..44665775 100644 --- a/examples/HelloWorldBuilder.java +++ b/examples/HelloWorldBuilder.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ import org.apache.bcel.Constants; import org.apache.bcel.generic.ALOAD; import org.apache.bcel.generic.ASTORE; diff --git a/examples/JasminVisitor.java b/examples/JasminVisitor.java index 53b0dde7..222e8643 100644 --- a/examples/JasminVisitor.java +++ b/examples/JasminVisitor.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; diff --git a/examples/Mini/ASCII_CharStream.java b/examples/Mini/ASCII_CharStream.java index f582a489..529ee479 100644 --- a/examples/Mini/ASCII_CharStream.java +++ b/examples/Mini/ASCII_CharStream.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JavaCC: Do not edit this line. ASCII_CharStream.java Version 0.7pre6 */ package Mini; diff --git a/examples/Mini/ASTExpr.java b/examples/Mini/ASTExpr.java index 451af529..f256bf15 100644 --- a/examples/Mini/ASTExpr.java +++ b/examples/Mini/ASTExpr.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. ASTExpr.java */ /* JJT: 0.3pre1 */ diff --git a/examples/Mini/ASTFactor.java b/examples/Mini/ASTFactor.java index 25a58973..ea0a23ee 100644 --- a/examples/Mini/ASTFactor.java +++ b/examples/Mini/ASTFactor.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. ASTFactor.java */ /* JJT: 0.3pre1 */ diff --git a/examples/Mini/ASTFunAppl.java b/examples/Mini/ASTFunAppl.java index 1c966446..58a023b8 100644 --- a/examples/Mini/ASTFunAppl.java +++ b/examples/Mini/ASTFunAppl.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. ASTFunAppl.java */ /* JJT: 0.3pre1 */ diff --git a/examples/Mini/ASTFunDecl.java b/examples/Mini/ASTFunDecl.java index e5d30681..911f9a64 100644 --- a/examples/Mini/ASTFunDecl.java +++ b/examples/Mini/ASTFunDecl.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. ASTFunDecl.java */ /* JJT: 0.3pre1 */ diff --git a/examples/Mini/ASTIdent.java b/examples/Mini/ASTIdent.java index 874fbf28..33332256 100644 --- a/examples/Mini/ASTIdent.java +++ b/examples/Mini/ASTIdent.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. ASTIdent.java */ /* JJT: 0.3pre1 */ diff --git a/examples/Mini/ASTIfExpr.java b/examples/Mini/ASTIfExpr.java index 1a929add..931e7426 100644 --- a/examples/Mini/ASTIfExpr.java +++ b/examples/Mini/ASTIfExpr.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. ASTIfExpr.java */ /* JJT: 0.3pre1 */ diff --git a/examples/Mini/ASTInteger.java b/examples/Mini/ASTInteger.java index 69605717..008f9f12 100644 --- a/examples/Mini/ASTInteger.java +++ b/examples/Mini/ASTInteger.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. ASTInteger.java */ /* JJT: 0.3pre1 */ diff --git a/examples/Mini/ASTLetExpr.java b/examples/Mini/ASTLetExpr.java index 883ea73f..bd1716eb 100644 --- a/examples/Mini/ASTLetExpr.java +++ b/examples/Mini/ASTLetExpr.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. ASTLetExpr.java */ /* JJT: 0.3pre1 */ diff --git a/examples/Mini/ASTProgram.java b/examples/Mini/ASTProgram.java index 68ffd8d0..ac6c3829 100644 --- a/examples/Mini/ASTProgram.java +++ b/examples/Mini/ASTProgram.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. ASTProgram.java */ /* JJT: 0.3pre1 */ diff --git a/examples/Mini/ASTTerm.java b/examples/Mini/ASTTerm.java index 691be0c6..ea3d558e 100644 --- a/examples/Mini/ASTTerm.java +++ b/examples/Mini/ASTTerm.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. ASTTerm.java */ /* JJT: 0.3pre1 */ diff --git a/examples/Mini/EnvEntry.java b/examples/Mini/EnvEntry.java index 6a2c39cf..dba1a59a 100644 --- a/examples/Mini/EnvEntry.java +++ b/examples/Mini/EnvEntry.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package Mini; /** diff --git a/examples/Mini/Environment.java b/examples/Mini/Environment.java index ded86ee6..7d932bad 100644 --- a/examples/Mini/Environment.java +++ b/examples/Mini/Environment.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package Mini; import java.util.Vector; diff --git a/examples/Mini/Function.java b/examples/Mini/Function.java index 51ccf87c..5c21cd87 100644 --- a/examples/Mini/Function.java +++ b/examples/Mini/Function.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package Mini; /** diff --git a/examples/Mini/JJTMiniParserState.java b/examples/Mini/JJTMiniParserState.java index dec0e0b1..b0218878 100644 --- a/examples/Mini/JJTMiniParserState.java +++ b/examples/Mini/JJTMiniParserState.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. JJTMiniParserState.java */ package Mini; diff --git a/examples/Mini/MiniC.java b/examples/Mini/MiniC.java index 22a0c5c5..b6fc084f 100644 --- a/examples/Mini/MiniC.java +++ b/examples/Mini/MiniC.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package Mini; import java.io.File; import java.io.FileOutputStream; diff --git a/examples/Mini/MiniParser.java b/examples/Mini/MiniParser.java index 72b1fc40..ee1a4079 100644 --- a/examples/Mini/MiniParser.java +++ b/examples/Mini/MiniParser.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree&JavaCC: Do not edit this line. MiniParser.java */ package Mini; diff --git a/examples/Mini/MiniParserConstants.java b/examples/Mini/MiniParserConstants.java index 0986a4d2..632543de 100644 --- a/examples/Mini/MiniParserConstants.java +++ b/examples/Mini/MiniParserConstants.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree&JavaCC: Do not edit this line. MiniParserConstants.java */ package Mini; diff --git a/examples/Mini/MiniParserTokenManager.java b/examples/Mini/MiniParserTokenManager.java index b1a8c114..2254b142 100644 --- a/examples/Mini/MiniParserTokenManager.java +++ b/examples/Mini/MiniParserTokenManager.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree&JavaCC: Do not edit this line. MiniParserTokenManager.java */ package Mini; diff --git a/examples/Mini/MiniParserTreeConstants.java b/examples/Mini/MiniParserTreeConstants.java index 5f4c54f6..ae3d66cd 100644 --- a/examples/Mini/MiniParserTreeConstants.java +++ b/examples/Mini/MiniParserTreeConstants.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. MiniParserTreeConstants.java */ package Mini; diff --git a/examples/Mini/Node.java b/examples/Mini/Node.java index eb1e2cac..27740c14 100644 --- a/examples/Mini/Node.java +++ b/examples/Mini/Node.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. Node.java */ /* JJT: 0.3pre1 */ diff --git a/examples/Mini/ParseException.java b/examples/Mini/ParseException.java index b23a3ea3..43fb346f 100644 --- a/examples/Mini/ParseException.java +++ b/examples/Mini/ParseException.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JavaCC: Do not edit this line. ParseException.java Version 0.7pre6 */ package Mini; diff --git a/examples/Mini/SimpleNode.java b/examples/Mini/SimpleNode.java index a3d4b458..bfd100ac 100644 --- a/examples/Mini/SimpleNode.java +++ b/examples/Mini/SimpleNode.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JJTree: Do not edit this line. SimpleNode.java */ /* JJT: 0.3pre1 */ diff --git a/examples/Mini/Token.java b/examples/Mini/Token.java index 402f8946..22e19429 100644 --- a/examples/Mini/Token.java +++ b/examples/Mini/Token.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JavaCC: Do not edit this line. Token.java Version 0.7pre3 */ package Mini; diff --git a/examples/Mini/TokenMgrError.java b/examples/Mini/TokenMgrError.java index e922f5e5..883d9b9b 100644 --- a/examples/Mini/TokenMgrError.java +++ b/examples/Mini/TokenMgrError.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ /* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 0.7pre2 */ package Mini; diff --git a/examples/Mini/Variable.java b/examples/Mini/Variable.java index 6f8215eb..36a655cd 100644 --- a/examples/Mini/Variable.java +++ b/examples/Mini/Variable.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package Mini; import org.apache.bcel.generic.LocalVariableGen; diff --git a/examples/Package.java b/examples/Package.java index 45d48d2c..010bae39 100644 --- a/examples/Package.java +++ b/examples/Package.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; diff --git a/examples/Peephole.java b/examples/Peephole.java index 2a644451..66bb9933 100644 --- a/examples/Peephole.java +++ b/examples/Peephole.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ import java.util.Iterator; import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; diff --git a/examples/ProxyCreator.java b/examples/ProxyCreator.java index a226f053..dc136aab 100644 --- a/examples/ProxyCreator.java +++ b/examples/ProxyCreator.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import org.apache.bcel.Constants; diff --git a/examples/TransitiveHull.java b/examples/TransitiveHull.java index 230f435d..a6d7feb9 100644 --- a/examples/TransitiveHull.java +++ b/examples/TransitiveHull.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ import java.util.Arrays; import java.util.regex.Pattern; import org.apache.bcel.Constants; diff --git a/examples/helloify.java b/examples/helloify.java index df6a8304..7cb7d209 100644 --- a/examples/helloify.java +++ b/examples/helloify.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ import org.apache.bcel.Constants; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.Code; diff --git a/examples/id.java b/examples/id.java index 4b2828de..8280f15e 100644 --- a/examples/id.java +++ b/examples/id.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ import org.apache.bcel.Repository; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.Field; diff --git a/examples/listclass.java b/examples/listclass.java index c56ef6a9..829f26ea 100644 --- a/examples/listclass.java +++ b/examples/listclass.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ import java.io.IOException; import java.util.Hashtable; import java.util.Vector; diff --git a/examples/maxstack.java b/examples/maxstack.java index 589c2d0c..72d16d33 100644 --- a/examples/maxstack.java +++ b/examples/maxstack.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ import org.apache.bcel.Repository; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; diff --git a/examples/patchclass.java b/examples/patchclass.java index e008d88b..87ba3a22 100644 --- a/examples/patchclass.java +++ b/examples/patchclass.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.Constant; import org.apache.bcel.classfile.ConstantUtf8; diff --git a/src/java/org/apache/bcel/Constants.java b/src/java/org/apache/bcel/Constants.java index b4adf0a1..f906e64a 100644 --- a/src/java/org/apache/bcel/Constants.java +++ b/src/java/org/apache/bcel/Constants.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel; /** diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 80cf2816..d0a4bbe1 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 The Apache Software Foundation + * Copyright 2000-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index e7c8f4f1..8efb6843 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 The Apache Software Foundation + * Copyright 2000-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 498bfa21..c25ba3d8 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 The Apache Software Foundation + * Copyright 2000-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index 61f08aa5..ed0616f7 100644 --- a/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2005 The Apache Software Foundation + * Copyright 2000-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 745fb2bd..fb6ee7b3 100644 --- a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.generic; import java.util.ArrayList; diff --git a/src/java/org/apache/bcel/util/BCELComparator.java b/src/java/org/apache/bcel/util/BCELComparator.java index b3a8f583..2caf1255 100644 --- a/src/java/org/apache/bcel/util/BCELComparator.java +++ b/src/java/org/apache/bcel/util/BCELComparator.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.util; /** diff --git a/src/java/org/apache/bcel/util/BCELFactory.java b/src/java/org/apache/bcel/util/BCELFactory.java index a3c8c5bf..a38be74e 100644 --- a/src/java/org/apache/bcel/util/BCELFactory.java +++ b/src/java/org/apache/bcel/util/BCELFactory.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.util; import java.io.PrintWriter; -- GitLab From e230db45fa7aa5a75ca4bb046e3438acdfb08bdd Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 4 Jun 2006 14:45:49 +0000 Subject: [PATCH 0340/1313] project layout changes git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@411568 13f79535-47bb-0310-9956-ffa450edef68 -- GitLab From f2478d242ce7d50ab04b4188facf1b9111e72be6 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 4 Jun 2006 14:47:44 +0000 Subject: [PATCH 0341/1313] moved the example under src git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@411569 13f79535-47bb-0310-9956-ffa450edef68 --- {examples => src/examples}/HelloWorldBuilder.java | 0 {examples => src/examples}/JasminVisitor.java | 0 .../examples}/Mini/ASCII_CharStream.java | 0 {examples => src/examples}/Mini/ASTExpr.java | 0 {examples => src/examples}/Mini/ASTFactor.java | 0 {examples => src/examples}/Mini/ASTFunAppl.java | 0 {examples => src/examples}/Mini/ASTFunDecl.java | 0 {examples => src/examples}/Mini/ASTIdent.java | 0 {examples => src/examples}/Mini/ASTIfExpr.java | 0 {examples => src/examples}/Mini/ASTInteger.java | 0 {examples => src/examples}/Mini/ASTLetExpr.java | 0 {examples => src/examples}/Mini/ASTProgram.java | 0 {examples => src/examples}/Mini/ASTTerm.java | 0 {examples => src/examples}/Mini/EnvEntry.java | 0 {examples => src/examples}/Mini/Environment.java | 0 {examples => src/examples}/Mini/Function.java | 0 .../examples}/Mini/JJTMiniParserState.java | 0 {examples => src/examples}/Mini/Mini.bnf | 0 {examples => src/examples}/Mini/Mini.jj | 0 {examples => src/examples}/Mini/Mini.jjt | 0 {examples => src/examples}/Mini/MiniC.java | 0 {examples => src/examples}/Mini/MiniParser$JJCalls | Bin {examples => src/examples}/Mini/MiniParser.java | 0 .../examples}/Mini/MiniParserConstants.java | 0 .../examples}/Mini/MiniParserTokenManager.java | 0 .../examples}/Mini/MiniParserTreeConstants.java | 0 {examples => src/examples}/Mini/Node.java | 0 {examples => src/examples}/Mini/ParseException.java | 0 {examples => src/examples}/Mini/README | 0 {examples => src/examples}/Mini/SimpleNode.java | 0 {examples => src/examples}/Mini/Token.java | 0 {examples => src/examples}/Mini/TokenMgrError.java | 0 {examples => src/examples}/Mini/Variable.java | 0 {examples => src/examples}/Mini/fac.mini | 0 {examples => src/examples}/Mini/fib.mini | 0 {examples => src/examples}/Mini/max.mini | 0 {examples => src/examples}/Package.java | 0 {examples => src/examples}/Peephole.java | 0 {examples => src/examples}/ProxyCreator.java | 0 {examples => src/examples}/TransitiveHull.java | 0 {examples => src/examples}/helloify.java | 0 {examples => src/examples}/id.java | 0 {examples => src/examples}/listclass.java | 0 {examples => src/examples}/maxstack.java | 0 {examples => src/examples}/patchclass.java | 0 45 files changed, 0 insertions(+), 0 deletions(-) rename {examples => src/examples}/HelloWorldBuilder.java (100%) rename {examples => src/examples}/JasminVisitor.java (100%) rename {examples => src/examples}/Mini/ASCII_CharStream.java (100%) rename {examples => src/examples}/Mini/ASTExpr.java (100%) rename {examples => src/examples}/Mini/ASTFactor.java (100%) rename {examples => src/examples}/Mini/ASTFunAppl.java (100%) rename {examples => src/examples}/Mini/ASTFunDecl.java (100%) rename {examples => src/examples}/Mini/ASTIdent.java (100%) rename {examples => src/examples}/Mini/ASTIfExpr.java (100%) rename {examples => src/examples}/Mini/ASTInteger.java (100%) rename {examples => src/examples}/Mini/ASTLetExpr.java (100%) rename {examples => src/examples}/Mini/ASTProgram.java (100%) rename {examples => src/examples}/Mini/ASTTerm.java (100%) rename {examples => src/examples}/Mini/EnvEntry.java (100%) rename {examples => src/examples}/Mini/Environment.java (100%) rename {examples => src/examples}/Mini/Function.java (100%) rename {examples => src/examples}/Mini/JJTMiniParserState.java (100%) rename {examples => src/examples}/Mini/Mini.bnf (100%) rename {examples => src/examples}/Mini/Mini.jj (100%) rename {examples => src/examples}/Mini/Mini.jjt (100%) rename {examples => src/examples}/Mini/MiniC.java (100%) rename {examples => src/examples}/Mini/MiniParser$JJCalls (100%) rename {examples => src/examples}/Mini/MiniParser.java (100%) rename {examples => src/examples}/Mini/MiniParserConstants.java (100%) rename {examples => src/examples}/Mini/MiniParserTokenManager.java (100%) rename {examples => src/examples}/Mini/MiniParserTreeConstants.java (100%) rename {examples => src/examples}/Mini/Node.java (100%) rename {examples => src/examples}/Mini/ParseException.java (100%) rename {examples => src/examples}/Mini/README (100%) rename {examples => src/examples}/Mini/SimpleNode.java (100%) rename {examples => src/examples}/Mini/Token.java (100%) rename {examples => src/examples}/Mini/TokenMgrError.java (100%) rename {examples => src/examples}/Mini/Variable.java (100%) rename {examples => src/examples}/Mini/fac.mini (100%) rename {examples => src/examples}/Mini/fib.mini (100%) rename {examples => src/examples}/Mini/max.mini (100%) rename {examples => src/examples}/Package.java (100%) rename {examples => src/examples}/Peephole.java (100%) rename {examples => src/examples}/ProxyCreator.java (100%) rename {examples => src/examples}/TransitiveHull.java (100%) rename {examples => src/examples}/helloify.java (100%) rename {examples => src/examples}/id.java (100%) rename {examples => src/examples}/listclass.java (100%) rename {examples => src/examples}/maxstack.java (100%) rename {examples => src/examples}/patchclass.java (100%) diff --git a/examples/HelloWorldBuilder.java b/src/examples/HelloWorldBuilder.java similarity index 100% rename from examples/HelloWorldBuilder.java rename to src/examples/HelloWorldBuilder.java diff --git a/examples/JasminVisitor.java b/src/examples/JasminVisitor.java similarity index 100% rename from examples/JasminVisitor.java rename to src/examples/JasminVisitor.java diff --git a/examples/Mini/ASCII_CharStream.java b/src/examples/Mini/ASCII_CharStream.java similarity index 100% rename from examples/Mini/ASCII_CharStream.java rename to src/examples/Mini/ASCII_CharStream.java diff --git a/examples/Mini/ASTExpr.java b/src/examples/Mini/ASTExpr.java similarity index 100% rename from examples/Mini/ASTExpr.java rename to src/examples/Mini/ASTExpr.java diff --git a/examples/Mini/ASTFactor.java b/src/examples/Mini/ASTFactor.java similarity index 100% rename from examples/Mini/ASTFactor.java rename to src/examples/Mini/ASTFactor.java diff --git a/examples/Mini/ASTFunAppl.java b/src/examples/Mini/ASTFunAppl.java similarity index 100% rename from examples/Mini/ASTFunAppl.java rename to src/examples/Mini/ASTFunAppl.java diff --git a/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java similarity index 100% rename from examples/Mini/ASTFunDecl.java rename to src/examples/Mini/ASTFunDecl.java diff --git a/examples/Mini/ASTIdent.java b/src/examples/Mini/ASTIdent.java similarity index 100% rename from examples/Mini/ASTIdent.java rename to src/examples/Mini/ASTIdent.java diff --git a/examples/Mini/ASTIfExpr.java b/src/examples/Mini/ASTIfExpr.java similarity index 100% rename from examples/Mini/ASTIfExpr.java rename to src/examples/Mini/ASTIfExpr.java diff --git a/examples/Mini/ASTInteger.java b/src/examples/Mini/ASTInteger.java similarity index 100% rename from examples/Mini/ASTInteger.java rename to src/examples/Mini/ASTInteger.java diff --git a/examples/Mini/ASTLetExpr.java b/src/examples/Mini/ASTLetExpr.java similarity index 100% rename from examples/Mini/ASTLetExpr.java rename to src/examples/Mini/ASTLetExpr.java diff --git a/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java similarity index 100% rename from examples/Mini/ASTProgram.java rename to src/examples/Mini/ASTProgram.java diff --git a/examples/Mini/ASTTerm.java b/src/examples/Mini/ASTTerm.java similarity index 100% rename from examples/Mini/ASTTerm.java rename to src/examples/Mini/ASTTerm.java diff --git a/examples/Mini/EnvEntry.java b/src/examples/Mini/EnvEntry.java similarity index 100% rename from examples/Mini/EnvEntry.java rename to src/examples/Mini/EnvEntry.java diff --git a/examples/Mini/Environment.java b/src/examples/Mini/Environment.java similarity index 100% rename from examples/Mini/Environment.java rename to src/examples/Mini/Environment.java diff --git a/examples/Mini/Function.java b/src/examples/Mini/Function.java similarity index 100% rename from examples/Mini/Function.java rename to src/examples/Mini/Function.java diff --git a/examples/Mini/JJTMiniParserState.java b/src/examples/Mini/JJTMiniParserState.java similarity index 100% rename from examples/Mini/JJTMiniParserState.java rename to src/examples/Mini/JJTMiniParserState.java diff --git a/examples/Mini/Mini.bnf b/src/examples/Mini/Mini.bnf similarity index 100% rename from examples/Mini/Mini.bnf rename to src/examples/Mini/Mini.bnf diff --git a/examples/Mini/Mini.jj b/src/examples/Mini/Mini.jj similarity index 100% rename from examples/Mini/Mini.jj rename to src/examples/Mini/Mini.jj diff --git a/examples/Mini/Mini.jjt b/src/examples/Mini/Mini.jjt similarity index 100% rename from examples/Mini/Mini.jjt rename to src/examples/Mini/Mini.jjt diff --git a/examples/Mini/MiniC.java b/src/examples/Mini/MiniC.java similarity index 100% rename from examples/Mini/MiniC.java rename to src/examples/Mini/MiniC.java diff --git a/examples/Mini/MiniParser$JJCalls b/src/examples/Mini/MiniParser$JJCalls similarity index 100% rename from examples/Mini/MiniParser$JJCalls rename to src/examples/Mini/MiniParser$JJCalls diff --git a/examples/Mini/MiniParser.java b/src/examples/Mini/MiniParser.java similarity index 100% rename from examples/Mini/MiniParser.java rename to src/examples/Mini/MiniParser.java diff --git a/examples/Mini/MiniParserConstants.java b/src/examples/Mini/MiniParserConstants.java similarity index 100% rename from examples/Mini/MiniParserConstants.java rename to src/examples/Mini/MiniParserConstants.java diff --git a/examples/Mini/MiniParserTokenManager.java b/src/examples/Mini/MiniParserTokenManager.java similarity index 100% rename from examples/Mini/MiniParserTokenManager.java rename to src/examples/Mini/MiniParserTokenManager.java diff --git a/examples/Mini/MiniParserTreeConstants.java b/src/examples/Mini/MiniParserTreeConstants.java similarity index 100% rename from examples/Mini/MiniParserTreeConstants.java rename to src/examples/Mini/MiniParserTreeConstants.java diff --git a/examples/Mini/Node.java b/src/examples/Mini/Node.java similarity index 100% rename from examples/Mini/Node.java rename to src/examples/Mini/Node.java diff --git a/examples/Mini/ParseException.java b/src/examples/Mini/ParseException.java similarity index 100% rename from examples/Mini/ParseException.java rename to src/examples/Mini/ParseException.java diff --git a/examples/Mini/README b/src/examples/Mini/README similarity index 100% rename from examples/Mini/README rename to src/examples/Mini/README diff --git a/examples/Mini/SimpleNode.java b/src/examples/Mini/SimpleNode.java similarity index 100% rename from examples/Mini/SimpleNode.java rename to src/examples/Mini/SimpleNode.java diff --git a/examples/Mini/Token.java b/src/examples/Mini/Token.java similarity index 100% rename from examples/Mini/Token.java rename to src/examples/Mini/Token.java diff --git a/examples/Mini/TokenMgrError.java b/src/examples/Mini/TokenMgrError.java similarity index 100% rename from examples/Mini/TokenMgrError.java rename to src/examples/Mini/TokenMgrError.java diff --git a/examples/Mini/Variable.java b/src/examples/Mini/Variable.java similarity index 100% rename from examples/Mini/Variable.java rename to src/examples/Mini/Variable.java diff --git a/examples/Mini/fac.mini b/src/examples/Mini/fac.mini similarity index 100% rename from examples/Mini/fac.mini rename to src/examples/Mini/fac.mini diff --git a/examples/Mini/fib.mini b/src/examples/Mini/fib.mini similarity index 100% rename from examples/Mini/fib.mini rename to src/examples/Mini/fib.mini diff --git a/examples/Mini/max.mini b/src/examples/Mini/max.mini similarity index 100% rename from examples/Mini/max.mini rename to src/examples/Mini/max.mini diff --git a/examples/Package.java b/src/examples/Package.java similarity index 100% rename from examples/Package.java rename to src/examples/Package.java diff --git a/examples/Peephole.java b/src/examples/Peephole.java similarity index 100% rename from examples/Peephole.java rename to src/examples/Peephole.java diff --git a/examples/ProxyCreator.java b/src/examples/ProxyCreator.java similarity index 100% rename from examples/ProxyCreator.java rename to src/examples/ProxyCreator.java diff --git a/examples/TransitiveHull.java b/src/examples/TransitiveHull.java similarity index 100% rename from examples/TransitiveHull.java rename to src/examples/TransitiveHull.java diff --git a/examples/helloify.java b/src/examples/helloify.java similarity index 100% rename from examples/helloify.java rename to src/examples/helloify.java diff --git a/examples/id.java b/src/examples/id.java similarity index 100% rename from examples/id.java rename to src/examples/id.java diff --git a/examples/listclass.java b/src/examples/listclass.java similarity index 100% rename from examples/listclass.java rename to src/examples/listclass.java diff --git a/examples/maxstack.java b/src/examples/maxstack.java similarity index 100% rename from examples/maxstack.java rename to src/examples/maxstack.java diff --git a/examples/patchclass.java b/src/examples/patchclass.java similarity index 100% rename from examples/patchclass.java rename to src/examples/patchclass.java -- GitLab From 7386db2ffc074582cd46d0881a83a20e9f8dbb2f Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 4 Jun 2006 14:49:40 +0000 Subject: [PATCH 0342/1313] moved xdocs under site git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@411570 13f79535-47bb-0310-9956-ffa450edef68 --- {xdocs => src/site/xdoc}/contributors.xml | 0 {xdocs => src/site/xdoc}/faq.xml | 0 {xdocs => src/site/xdoc}/images/bcel-logo.gif | Bin {xdocs => src/site/xdoc}/images/classfile.gif | Bin {xdocs => src/site/xdoc}/images/classgen.gif | Bin {xdocs => src/site/xdoc}/images/classloader.gif | Bin {xdocs => src/site/xdoc}/images/constantpool.gif | Bin {xdocs => src/site/xdoc}/images/il.gif | Bin {xdocs => src/site/xdoc}/images/instructions.gif | Bin {xdocs => src/site/xdoc}/images/javaclass.gif | Bin {xdocs => src/site/xdoc}/images/jvm.gif | Bin {xdocs => src/site/xdoc}/images/logo.gif | Bin {xdocs => src/site/xdoc}/index.xml | 0 {xdocs => src/site/xdoc}/license.xml | 0 {xdocs => src/site/xdoc}/manual.xml | 0 {xdocs => src/site/xdoc}/navigation.xml | 0 {xdocs => src/site/xdoc}/news.xml | 0 {xdocs => src/site/xdoc}/projects.xml | 0 {xdocs => src/site/xdoc}/stylesheets/project.xml | 0 19 files changed, 0 insertions(+), 0 deletions(-) rename {xdocs => src/site/xdoc}/contributors.xml (100%) rename {xdocs => src/site/xdoc}/faq.xml (100%) rename {xdocs => src/site/xdoc}/images/bcel-logo.gif (100%) rename {xdocs => src/site/xdoc}/images/classfile.gif (100%) rename {xdocs => src/site/xdoc}/images/classgen.gif (100%) rename {xdocs => src/site/xdoc}/images/classloader.gif (100%) rename {xdocs => src/site/xdoc}/images/constantpool.gif (100%) rename {xdocs => src/site/xdoc}/images/il.gif (100%) rename {xdocs => src/site/xdoc}/images/instructions.gif (100%) rename {xdocs => src/site/xdoc}/images/javaclass.gif (100%) rename {xdocs => src/site/xdoc}/images/jvm.gif (100%) rename {xdocs => src/site/xdoc}/images/logo.gif (100%) rename {xdocs => src/site/xdoc}/index.xml (100%) rename {xdocs => src/site/xdoc}/license.xml (100%) rename {xdocs => src/site/xdoc}/manual.xml (100%) rename {xdocs => src/site/xdoc}/navigation.xml (100%) rename {xdocs => src/site/xdoc}/news.xml (100%) rename {xdocs => src/site/xdoc}/projects.xml (100%) rename {xdocs => src/site/xdoc}/stylesheets/project.xml (100%) diff --git a/xdocs/contributors.xml b/src/site/xdoc/contributors.xml similarity index 100% rename from xdocs/contributors.xml rename to src/site/xdoc/contributors.xml diff --git a/xdocs/faq.xml b/src/site/xdoc/faq.xml similarity index 100% rename from xdocs/faq.xml rename to src/site/xdoc/faq.xml diff --git a/xdocs/images/bcel-logo.gif b/src/site/xdoc/images/bcel-logo.gif similarity index 100% rename from xdocs/images/bcel-logo.gif rename to src/site/xdoc/images/bcel-logo.gif diff --git a/xdocs/images/classfile.gif b/src/site/xdoc/images/classfile.gif similarity index 100% rename from xdocs/images/classfile.gif rename to src/site/xdoc/images/classfile.gif diff --git a/xdocs/images/classgen.gif b/src/site/xdoc/images/classgen.gif similarity index 100% rename from xdocs/images/classgen.gif rename to src/site/xdoc/images/classgen.gif diff --git a/xdocs/images/classloader.gif b/src/site/xdoc/images/classloader.gif similarity index 100% rename from xdocs/images/classloader.gif rename to src/site/xdoc/images/classloader.gif diff --git a/xdocs/images/constantpool.gif b/src/site/xdoc/images/constantpool.gif similarity index 100% rename from xdocs/images/constantpool.gif rename to src/site/xdoc/images/constantpool.gif diff --git a/xdocs/images/il.gif b/src/site/xdoc/images/il.gif similarity index 100% rename from xdocs/images/il.gif rename to src/site/xdoc/images/il.gif diff --git a/xdocs/images/instructions.gif b/src/site/xdoc/images/instructions.gif similarity index 100% rename from xdocs/images/instructions.gif rename to src/site/xdoc/images/instructions.gif diff --git a/xdocs/images/javaclass.gif b/src/site/xdoc/images/javaclass.gif similarity index 100% rename from xdocs/images/javaclass.gif rename to src/site/xdoc/images/javaclass.gif diff --git a/xdocs/images/jvm.gif b/src/site/xdoc/images/jvm.gif similarity index 100% rename from xdocs/images/jvm.gif rename to src/site/xdoc/images/jvm.gif diff --git a/xdocs/images/logo.gif b/src/site/xdoc/images/logo.gif similarity index 100% rename from xdocs/images/logo.gif rename to src/site/xdoc/images/logo.gif diff --git a/xdocs/index.xml b/src/site/xdoc/index.xml similarity index 100% rename from xdocs/index.xml rename to src/site/xdoc/index.xml diff --git a/xdocs/license.xml b/src/site/xdoc/license.xml similarity index 100% rename from xdocs/license.xml rename to src/site/xdoc/license.xml diff --git a/xdocs/manual.xml b/src/site/xdoc/manual.xml similarity index 100% rename from xdocs/manual.xml rename to src/site/xdoc/manual.xml diff --git a/xdocs/navigation.xml b/src/site/xdoc/navigation.xml similarity index 100% rename from xdocs/navigation.xml rename to src/site/xdoc/navigation.xml diff --git a/xdocs/news.xml b/src/site/xdoc/news.xml similarity index 100% rename from xdocs/news.xml rename to src/site/xdoc/news.xml diff --git a/xdocs/projects.xml b/src/site/xdoc/projects.xml similarity index 100% rename from xdocs/projects.xml rename to src/site/xdoc/projects.xml diff --git a/xdocs/stylesheets/project.xml b/src/site/xdoc/stylesheets/project.xml similarity index 100% rename from xdocs/stylesheets/project.xml rename to src/site/xdoc/stylesheets/project.xml -- GitLab From b3eb11323704cdfaa15419572aa8053696cc842c Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 4 Jun 2006 14:51:08 +0000 Subject: [PATCH 0343/1313] site resources git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@411571 13f79535-47bb-0310-9956-ffa450edef68 -- GitLab From f7283a50db60c3d61d66c61fda030fde3a29fb68 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 4 Jun 2006 14:52:23 +0000 Subject: [PATCH 0344/1313] separate resource from xdocs git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@411572 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/{xdoc => resources}/images/bcel-logo.gif | Bin src/site/{xdoc => resources}/images/classfile.gif | Bin src/site/{xdoc => resources}/images/classgen.gif | Bin src/site/{xdoc => resources}/images/classloader.gif | Bin .../{xdoc => resources}/images/constantpool.gif | Bin src/site/{xdoc => resources}/images/il.gif | Bin .../{xdoc => resources}/images/instructions.gif | Bin src/site/{xdoc => resources}/images/javaclass.gif | Bin src/site/{xdoc => resources}/images/jvm.gif | Bin src/site/{xdoc => resources}/images/logo.gif | Bin .../{xdoc => resources}/stylesheets/project.xml | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename src/site/{xdoc => resources}/images/bcel-logo.gif (100%) rename src/site/{xdoc => resources}/images/classfile.gif (100%) rename src/site/{xdoc => resources}/images/classgen.gif (100%) rename src/site/{xdoc => resources}/images/classloader.gif (100%) rename src/site/{xdoc => resources}/images/constantpool.gif (100%) rename src/site/{xdoc => resources}/images/il.gif (100%) rename src/site/{xdoc => resources}/images/instructions.gif (100%) rename src/site/{xdoc => resources}/images/javaclass.gif (100%) rename src/site/{xdoc => resources}/images/jvm.gif (100%) rename src/site/{xdoc => resources}/images/logo.gif (100%) rename src/site/{xdoc => resources}/stylesheets/project.xml (100%) diff --git a/src/site/xdoc/images/bcel-logo.gif b/src/site/resources/images/bcel-logo.gif similarity index 100% rename from src/site/xdoc/images/bcel-logo.gif rename to src/site/resources/images/bcel-logo.gif diff --git a/src/site/xdoc/images/classfile.gif b/src/site/resources/images/classfile.gif similarity index 100% rename from src/site/xdoc/images/classfile.gif rename to src/site/resources/images/classfile.gif diff --git a/src/site/xdoc/images/classgen.gif b/src/site/resources/images/classgen.gif similarity index 100% rename from src/site/xdoc/images/classgen.gif rename to src/site/resources/images/classgen.gif diff --git a/src/site/xdoc/images/classloader.gif b/src/site/resources/images/classloader.gif similarity index 100% rename from src/site/xdoc/images/classloader.gif rename to src/site/resources/images/classloader.gif diff --git a/src/site/xdoc/images/constantpool.gif b/src/site/resources/images/constantpool.gif similarity index 100% rename from src/site/xdoc/images/constantpool.gif rename to src/site/resources/images/constantpool.gif diff --git a/src/site/xdoc/images/il.gif b/src/site/resources/images/il.gif similarity index 100% rename from src/site/xdoc/images/il.gif rename to src/site/resources/images/il.gif diff --git a/src/site/xdoc/images/instructions.gif b/src/site/resources/images/instructions.gif similarity index 100% rename from src/site/xdoc/images/instructions.gif rename to src/site/resources/images/instructions.gif diff --git a/src/site/xdoc/images/javaclass.gif b/src/site/resources/images/javaclass.gif similarity index 100% rename from src/site/xdoc/images/javaclass.gif rename to src/site/resources/images/javaclass.gif diff --git a/src/site/xdoc/images/jvm.gif b/src/site/resources/images/jvm.gif similarity index 100% rename from src/site/xdoc/images/jvm.gif rename to src/site/resources/images/jvm.gif diff --git a/src/site/xdoc/images/logo.gif b/src/site/resources/images/logo.gif similarity index 100% rename from src/site/xdoc/images/logo.gif rename to src/site/resources/images/logo.gif diff --git a/src/site/xdoc/stylesheets/project.xml b/src/site/resources/stylesheets/project.xml similarity index 100% rename from src/site/xdoc/stylesheets/project.xml rename to src/site/resources/stylesheets/project.xml -- GitLab From 7fd9d86fc02c09b316755394e0079fda64f0be98 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 4 Jun 2006 14:54:02 +0000 Subject: [PATCH 0345/1313] standard maven2 layout git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@411573 13f79535-47bb-0310-9956-ffa450edef68 --- src/{ => main}/java/org/apache/bcel/Constants.java | 0 src/{ => main}/java/org/apache/bcel/ExceptionConstants.java | 0 src/{ => main}/java/org/apache/bcel/Repository.java | 0 src/{ => main}/java/org/apache/bcel/classfile/AccessFlags.java | 0 .../java/org/apache/bcel/classfile/AnnotationDefault.java | 0 .../java/org/apache/bcel/classfile/AnnotationEntry.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Annotations.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Attribute.java | 0 .../java/org/apache/bcel/classfile/AttributeReader.java | 0 .../java/org/apache/bcel/classfile/ClassFormatException.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ClassParser.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Code.java | 0 src/{ => main}/java/org/apache/bcel/classfile/CodeException.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Constant.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ConstantCP.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ConstantClass.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ConstantDouble.java | 0 .../java/org/apache/bcel/classfile/ConstantFieldref.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ConstantFloat.java | 0 .../java/org/apache/bcel/classfile/ConstantInteger.java | 0 .../org/apache/bcel/classfile/ConstantInterfaceMethodref.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ConstantLong.java | 0 .../java/org/apache/bcel/classfile/ConstantMethodref.java | 0 .../java/org/apache/bcel/classfile/ConstantNameAndType.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ConstantObject.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ConstantPool.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ConstantString.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ConstantUtf8.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ConstantValue.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Deprecated.java | 0 .../java/org/apache/bcel/classfile/DescendingVisitor.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ElementValue.java | 0 .../java/org/apache/bcel/classfile/ElementValuePair.java | 0 src/{ => main}/java/org/apache/bcel/classfile/EmptyVisitor.java | 0 src/{ => main}/java/org/apache/bcel/classfile/ExceptionTable.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Field.java | 0 src/{ => main}/java/org/apache/bcel/classfile/FieldOrMethod.java | 0 src/{ => main}/java/org/apache/bcel/classfile/InnerClass.java | 0 src/{ => main}/java/org/apache/bcel/classfile/InnerClasses.java | 0 src/{ => main}/java/org/apache/bcel/classfile/JavaClass.java | 0 src/{ => main}/java/org/apache/bcel/classfile/LineNumber.java | 0 .../java/org/apache/bcel/classfile/LineNumberTable.java | 0 src/{ => main}/java/org/apache/bcel/classfile/LocalVariable.java | 0 .../java/org/apache/bcel/classfile/LocalVariableTable.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Method.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Node.java | 0 src/{ => main}/java/org/apache/bcel/classfile/PMGClass.java | 0 .../java/org/apache/bcel/classfile/ParameterAnnotationEntry.java | 0 .../java/org/apache/bcel/classfile/ParameterAnnotations.java | 0 .../org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java | 0 .../bcel/classfile/RuntimeInvisibleParameterAnnotations.java | 0 .../java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java | 0 .../apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Signature.java | 0 src/{ => main}/java/org/apache/bcel/classfile/SourceFile.java | 0 src/{ => main}/java/org/apache/bcel/classfile/StackMap.java | 0 src/{ => main}/java/org/apache/bcel/classfile/StackMapEntry.java | 0 src/{ => main}/java/org/apache/bcel/classfile/StackMapType.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Synthetic.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Unknown.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Utility.java | 0 src/{ => main}/java/org/apache/bcel/classfile/Visitor.java | 0 src/{ => main}/java/org/apache/bcel/classfile/package.html | 0 src/{ => main}/java/org/apache/bcel/generic/AALOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/AASTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/ACONST_NULL.java | 0 src/{ => main}/java/org/apache/bcel/generic/ALOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/ANEWARRAY.java | 0 src/{ => main}/java/org/apache/bcel/generic/ARETURN.java | 0 src/{ => main}/java/org/apache/bcel/generic/ARRAYLENGTH.java | 0 src/{ => main}/java/org/apache/bcel/generic/ASTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/ATHROW.java | 0 .../java/org/apache/bcel/generic/AllocationInstruction.java | 0 .../java/org/apache/bcel/generic/ArithmeticInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/ArrayInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/ArrayType.java | 0 src/{ => main}/java/org/apache/bcel/generic/BALOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/BASTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/BIPUSH.java | 0 src/{ => main}/java/org/apache/bcel/generic/BREAKPOINT.java | 0 src/{ => main}/java/org/apache/bcel/generic/BasicType.java | 0 src/{ => main}/java/org/apache/bcel/generic/BranchHandle.java | 0 .../java/org/apache/bcel/generic/BranchInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/CALOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/CASTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/CHECKCAST.java | 0 src/{ => main}/java/org/apache/bcel/generic/CPInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/ClassGen.java | 0 .../java/org/apache/bcel/generic/ClassGenException.java | 0 src/{ => main}/java/org/apache/bcel/generic/ClassObserver.java | 0 src/{ => main}/java/org/apache/bcel/generic/CodeExceptionGen.java | 0 .../java/org/apache/bcel/generic/CompoundInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/ConstantPoolGen.java | 0 .../java/org/apache/bcel/generic/ConstantPushInstruction.java | 0 .../java/org/apache/bcel/generic/ConversionInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/D2F.java | 0 src/{ => main}/java/org/apache/bcel/generic/D2I.java | 0 src/{ => main}/java/org/apache/bcel/generic/D2L.java | 0 src/{ => main}/java/org/apache/bcel/generic/DADD.java | 0 src/{ => main}/java/org/apache/bcel/generic/DALOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/DASTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/DCMPG.java | 0 src/{ => main}/java/org/apache/bcel/generic/DCMPL.java | 0 src/{ => main}/java/org/apache/bcel/generic/DCONST.java | 0 src/{ => main}/java/org/apache/bcel/generic/DDIV.java | 0 src/{ => main}/java/org/apache/bcel/generic/DLOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/DMUL.java | 0 src/{ => main}/java/org/apache/bcel/generic/DNEG.java | 0 src/{ => main}/java/org/apache/bcel/generic/DREM.java | 0 src/{ => main}/java/org/apache/bcel/generic/DRETURN.java | 0 src/{ => main}/java/org/apache/bcel/generic/DSTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/DSUB.java | 0 src/{ => main}/java/org/apache/bcel/generic/DUP.java | 0 src/{ => main}/java/org/apache/bcel/generic/DUP2.java | 0 src/{ => main}/java/org/apache/bcel/generic/DUP2_X1.java | 0 src/{ => main}/java/org/apache/bcel/generic/DUP2_X2.java | 0 src/{ => main}/java/org/apache/bcel/generic/DUP_X1.java | 0 src/{ => main}/java/org/apache/bcel/generic/DUP_X2.java | 0 src/{ => main}/java/org/apache/bcel/generic/EmptyVisitor.java | 0 src/{ => main}/java/org/apache/bcel/generic/ExceptionThrower.java | 0 src/{ => main}/java/org/apache/bcel/generic/F2D.java | 0 src/{ => main}/java/org/apache/bcel/generic/F2I.java | 0 src/{ => main}/java/org/apache/bcel/generic/F2L.java | 0 src/{ => main}/java/org/apache/bcel/generic/FADD.java | 0 src/{ => main}/java/org/apache/bcel/generic/FALOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/FASTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/FCMPG.java | 0 src/{ => main}/java/org/apache/bcel/generic/FCMPL.java | 0 src/{ => main}/java/org/apache/bcel/generic/FCONST.java | 0 src/{ => main}/java/org/apache/bcel/generic/FDIV.java | 0 src/{ => main}/java/org/apache/bcel/generic/FLOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/FMUL.java | 0 src/{ => main}/java/org/apache/bcel/generic/FNEG.java | 0 src/{ => main}/java/org/apache/bcel/generic/FREM.java | 0 src/{ => main}/java/org/apache/bcel/generic/FRETURN.java | 0 src/{ => main}/java/org/apache/bcel/generic/FSTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/FSUB.java | 0 src/{ => main}/java/org/apache/bcel/generic/FieldGen.java | 0 .../java/org/apache/bcel/generic/FieldGenOrMethodGen.java | 0 src/{ => main}/java/org/apache/bcel/generic/FieldInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/FieldObserver.java | 0 src/{ => main}/java/org/apache/bcel/generic/FieldOrMethod.java | 0 src/{ => main}/java/org/apache/bcel/generic/GETFIELD.java | 0 src/{ => main}/java/org/apache/bcel/generic/GETSTATIC.java | 0 src/{ => main}/java/org/apache/bcel/generic/GOTO.java | 0 src/{ => main}/java/org/apache/bcel/generic/GOTO_W.java | 0 src/{ => main}/java/org/apache/bcel/generic/GotoInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/I2B.java | 0 src/{ => main}/java/org/apache/bcel/generic/I2C.java | 0 src/{ => main}/java/org/apache/bcel/generic/I2D.java | 0 src/{ => main}/java/org/apache/bcel/generic/I2F.java | 0 src/{ => main}/java/org/apache/bcel/generic/I2L.java | 0 src/{ => main}/java/org/apache/bcel/generic/I2S.java | 0 src/{ => main}/java/org/apache/bcel/generic/IADD.java | 0 src/{ => main}/java/org/apache/bcel/generic/IALOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/IAND.java | 0 src/{ => main}/java/org/apache/bcel/generic/IASTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/ICONST.java | 0 src/{ => main}/java/org/apache/bcel/generic/IDIV.java | 0 src/{ => main}/java/org/apache/bcel/generic/IFEQ.java | 0 src/{ => main}/java/org/apache/bcel/generic/IFGE.java | 0 src/{ => main}/java/org/apache/bcel/generic/IFGT.java | 0 src/{ => main}/java/org/apache/bcel/generic/IFLE.java | 0 src/{ => main}/java/org/apache/bcel/generic/IFLT.java | 0 src/{ => main}/java/org/apache/bcel/generic/IFNE.java | 0 src/{ => main}/java/org/apache/bcel/generic/IFNONNULL.java | 0 src/{ => main}/java/org/apache/bcel/generic/IFNULL.java | 0 src/{ => main}/java/org/apache/bcel/generic/IF_ACMPEQ.java | 0 src/{ => main}/java/org/apache/bcel/generic/IF_ACMPNE.java | 0 src/{ => main}/java/org/apache/bcel/generic/IF_ICMPEQ.java | 0 src/{ => main}/java/org/apache/bcel/generic/IF_ICMPGE.java | 0 src/{ => main}/java/org/apache/bcel/generic/IF_ICMPGT.java | 0 src/{ => main}/java/org/apache/bcel/generic/IF_ICMPLE.java | 0 src/{ => main}/java/org/apache/bcel/generic/IF_ICMPLT.java | 0 src/{ => main}/java/org/apache/bcel/generic/IF_ICMPNE.java | 0 src/{ => main}/java/org/apache/bcel/generic/IINC.java | 0 src/{ => main}/java/org/apache/bcel/generic/ILOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/IMPDEP1.java | 0 src/{ => main}/java/org/apache/bcel/generic/IMPDEP2.java | 0 src/{ => main}/java/org/apache/bcel/generic/IMUL.java | 0 src/{ => main}/java/org/apache/bcel/generic/INEG.java | 0 src/{ => main}/java/org/apache/bcel/generic/INSTANCEOF.java | 0 src/{ => main}/java/org/apache/bcel/generic/INVOKEINTERFACE.java | 0 src/{ => main}/java/org/apache/bcel/generic/INVOKESPECIAL.java | 0 src/{ => main}/java/org/apache/bcel/generic/INVOKESTATIC.java | 0 src/{ => main}/java/org/apache/bcel/generic/INVOKEVIRTUAL.java | 0 src/{ => main}/java/org/apache/bcel/generic/IOR.java | 0 src/{ => main}/java/org/apache/bcel/generic/IREM.java | 0 src/{ => main}/java/org/apache/bcel/generic/IRETURN.java | 0 src/{ => main}/java/org/apache/bcel/generic/ISHL.java | 0 src/{ => main}/java/org/apache/bcel/generic/ISHR.java | 0 src/{ => main}/java/org/apache/bcel/generic/ISTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/ISUB.java | 0 src/{ => main}/java/org/apache/bcel/generic/IUSHR.java | 0 src/{ => main}/java/org/apache/bcel/generic/IXOR.java | 0 src/{ => main}/java/org/apache/bcel/generic/IfInstruction.java | 0 .../java/org/apache/bcel/generic/IndexedInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/Instruction.java | 0 .../java/org/apache/bcel/generic/InstructionComparator.java | 0 .../java/org/apache/bcel/generic/InstructionConstants.java | 0 .../java/org/apache/bcel/generic/InstructionFactory.java | 0 .../java/org/apache/bcel/generic/InstructionHandle.java | 0 src/{ => main}/java/org/apache/bcel/generic/InstructionList.java | 0 .../java/org/apache/bcel/generic/InstructionListObserver.java | 0 .../java/org/apache/bcel/generic/InstructionTargeter.java | 0 .../java/org/apache/bcel/generic/InvokeInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/JSR.java | 0 src/{ => main}/java/org/apache/bcel/generic/JSR_W.java | 0 src/{ => main}/java/org/apache/bcel/generic/JsrInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/L2D.java | 0 src/{ => main}/java/org/apache/bcel/generic/L2F.java | 0 src/{ => main}/java/org/apache/bcel/generic/L2I.java | 0 src/{ => main}/java/org/apache/bcel/generic/LADD.java | 0 src/{ => main}/java/org/apache/bcel/generic/LALOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/LAND.java | 0 src/{ => main}/java/org/apache/bcel/generic/LASTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/LCMP.java | 0 src/{ => main}/java/org/apache/bcel/generic/LCONST.java | 0 src/{ => main}/java/org/apache/bcel/generic/LDC.java | 0 src/{ => main}/java/org/apache/bcel/generic/LDC2_W.java | 0 src/{ => main}/java/org/apache/bcel/generic/LDC_W.java | 0 src/{ => main}/java/org/apache/bcel/generic/LDIV.java | 0 src/{ => main}/java/org/apache/bcel/generic/LLOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/LMUL.java | 0 src/{ => main}/java/org/apache/bcel/generic/LNEG.java | 0 src/{ => main}/java/org/apache/bcel/generic/LOOKUPSWITCH.java | 0 src/{ => main}/java/org/apache/bcel/generic/LOR.java | 0 src/{ => main}/java/org/apache/bcel/generic/LREM.java | 0 src/{ => main}/java/org/apache/bcel/generic/LRETURN.java | 0 src/{ => main}/java/org/apache/bcel/generic/LSHL.java | 0 src/{ => main}/java/org/apache/bcel/generic/LSHR.java | 0 src/{ => main}/java/org/apache/bcel/generic/LSTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/LSUB.java | 0 src/{ => main}/java/org/apache/bcel/generic/LUSHR.java | 0 src/{ => main}/java/org/apache/bcel/generic/LXOR.java | 0 src/{ => main}/java/org/apache/bcel/generic/LineNumberGen.java | 0 src/{ => main}/java/org/apache/bcel/generic/LoadClass.java | 0 src/{ => main}/java/org/apache/bcel/generic/LoadInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/LocalVariableGen.java | 0 .../java/org/apache/bcel/generic/LocalVariableInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/MONITORENTER.java | 0 src/{ => main}/java/org/apache/bcel/generic/MONITOREXIT.java | 0 src/{ => main}/java/org/apache/bcel/generic/MULTIANEWARRAY.java | 0 src/{ => main}/java/org/apache/bcel/generic/MethodGen.java | 0 src/{ => main}/java/org/apache/bcel/generic/MethodObserver.java | 0 src/{ => main}/java/org/apache/bcel/generic/NEW.java | 0 src/{ => main}/java/org/apache/bcel/generic/NEWARRAY.java | 0 src/{ => main}/java/org/apache/bcel/generic/NOP.java | 0 src/{ => main}/java/org/apache/bcel/generic/NamedAndTyped.java | 0 src/{ => main}/java/org/apache/bcel/generic/ObjectType.java | 0 src/{ => main}/java/org/apache/bcel/generic/POP.java | 0 src/{ => main}/java/org/apache/bcel/generic/POP2.java | 0 src/{ => main}/java/org/apache/bcel/generic/PUSH.java | 0 src/{ => main}/java/org/apache/bcel/generic/PUTFIELD.java | 0 src/{ => main}/java/org/apache/bcel/generic/PUTSTATIC.java | 0 src/{ => main}/java/org/apache/bcel/generic/PopInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/PushInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/RET.java | 0 src/{ => main}/java/org/apache/bcel/generic/RETURN.java | 0 src/{ => main}/java/org/apache/bcel/generic/ReferenceType.java | 0 .../java/org/apache/bcel/generic/ReturnInstruction.java | 0 .../java/org/apache/bcel/generic/ReturnaddressType.java | 0 src/{ => main}/java/org/apache/bcel/generic/SALOAD.java | 0 src/{ => main}/java/org/apache/bcel/generic/SASTORE.java | 0 src/{ => main}/java/org/apache/bcel/generic/SIPUSH.java | 0 src/{ => main}/java/org/apache/bcel/generic/SWAP.java | 0 src/{ => main}/java/org/apache/bcel/generic/SWITCH.java | 0 src/{ => main}/java/org/apache/bcel/generic/Select.java | 0 src/{ => main}/java/org/apache/bcel/generic/StackConsumer.java | 0 src/{ => main}/java/org/apache/bcel/generic/StackInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/StackProducer.java | 0 src/{ => main}/java/org/apache/bcel/generic/StoreInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/TABLESWITCH.java | 0 .../java/org/apache/bcel/generic/TargetLostException.java | 0 src/{ => main}/java/org/apache/bcel/generic/Type.java | 0 src/{ => main}/java/org/apache/bcel/generic/TypedInstruction.java | 0 .../java/org/apache/bcel/generic/UnconditionalBranch.java | 0 .../java/org/apache/bcel/generic/VariableLengthInstruction.java | 0 src/{ => main}/java/org/apache/bcel/generic/Visitor.java | 0 src/{ => main}/java/org/apache/bcel/generic/package.html | 0 src/{ => main}/java/org/apache/bcel/package.html | 0 src/{ => main}/java/org/apache/bcel/util/AttributeHTML.java | 0 src/{ => main}/java/org/apache/bcel/util/BCELComparator.java | 0 src/{ => main}/java/org/apache/bcel/util/BCELFactory.java | 0 src/{ => main}/java/org/apache/bcel/util/BCELifier.java | 0 src/{ => main}/java/org/apache/bcel/util/ByteSequence.java | 0 src/{ => main}/java/org/apache/bcel/util/Class2HTML.java | 0 src/{ => main}/java/org/apache/bcel/util/ClassLoader.java | 0 .../java/org/apache/bcel/util/ClassLoaderRepository.java | 0 src/{ => main}/java/org/apache/bcel/util/ClassPath.java | 0 src/{ => main}/java/org/apache/bcel/util/ClassQueue.java | 0 src/{ => main}/java/org/apache/bcel/util/ClassSet.java | 0 src/{ => main}/java/org/apache/bcel/util/ClassStack.java | 0 src/{ => main}/java/org/apache/bcel/util/ClassVector.java | 0 src/{ => main}/java/org/apache/bcel/util/CodeHTML.java | 0 src/{ => main}/java/org/apache/bcel/util/ConstantHTML.java | 0 src/{ => main}/java/org/apache/bcel/util/InstructionFinder.java | 0 src/{ => main}/java/org/apache/bcel/util/JavaWrapper.java | 0 src/{ => main}/java/org/apache/bcel/util/MethodHTML.java | 0 src/{ => main}/java/org/apache/bcel/util/Repository.java | 0 src/{ => main}/java/org/apache/bcel/util/SyntheticRepository.java | 0 src/{ => main}/java/org/apache/bcel/util/package.html | 0 .../java/org/apache/bcel/verifier/GraphicalVerifier.java | 0 src/{ => main}/java/org/apache/bcel/verifier/NativeVerifier.java | 0 src/{ => main}/java/org/apache/bcel/verifier/PassVerifier.java | 0 src/{ => main}/java/org/apache/bcel/verifier/TransitiveHull.java | 0 .../java/org/apache/bcel/verifier/VerificationResult.java | 0 src/{ => main}/java/org/apache/bcel/verifier/Verifier.java | 0 .../java/org/apache/bcel/verifier/VerifierAppFrame.java | 0 src/{ => main}/java/org/apache/bcel/verifier/VerifierFactory.java | 0 .../java/org/apache/bcel/verifier/VerifierFactoryListModel.java | 0 .../java/org/apache/bcel/verifier/VerifierFactoryObserver.java | 0 src/{ => main}/java/org/apache/bcel/verifier/VerifyDialog.java | 0 .../org/apache/bcel/verifier/exc/AssertionViolatedException.java | 0 .../org/apache/bcel/verifier/exc/ClassConstraintException.java | 0 .../org/apache/bcel/verifier/exc/CodeConstraintException.java | 0 .../java/org/apache/bcel/verifier/exc/InvalidMethodException.java | 0 .../org/apache/bcel/verifier/exc/LinkingConstraintException.java | 0 .../java/org/apache/bcel/verifier/exc/LoadingException.java | 0 .../bcel/verifier/exc/LocalVariableInfoInconsistentException.java | 0 .../apache/bcel/verifier/exc/StaticCodeConstraintException.java | 0 .../verifier/exc/StaticCodeInstructionConstraintException.java | 0 .../exc/StaticCodeInstructionOperandConstraintException.java | 0 .../bcel/verifier/exc/StructuralCodeConstraintException.java | 0 src/{ => main}/java/org/apache/bcel/verifier/exc/Utility.java | 0 .../java/org/apache/bcel/verifier/exc/VerificationException.java | 0 .../bcel/verifier/exc/VerifierConstraintViolatedException.java | 0 src/{ => main}/java/org/apache/bcel/verifier/exc/package.html | 0 src/{ => main}/java/org/apache/bcel/verifier/package.html | 0 .../java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java | 0 src/{ => main}/java/org/apache/bcel/verifier/statics/IntList.java | 0 .../java/org/apache/bcel/verifier/statics/LONG_Upper.java | 0 .../java/org/apache/bcel/verifier/statics/LocalVariableInfo.java | 0 .../java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java | 0 .../java/org/apache/bcel/verifier/statics/Pass1Verifier.java | 0 .../java/org/apache/bcel/verifier/statics/Pass2Verifier.java | 0 .../java/org/apache/bcel/verifier/statics/Pass3aVerifier.java | 0 .../org/apache/bcel/verifier/statics/StringRepresentation.java | 0 src/{ => main}/java/org/apache/bcel/verifier/statics/package.html | 0 .../org/apache/bcel/verifier/structurals/ControlFlowGraph.java | 0 .../org/apache/bcel/verifier/structurals/ExceptionHandler.java | 0 .../org/apache/bcel/verifier/structurals/ExceptionHandlers.java | 0 .../org/apache/bcel/verifier/structurals/ExecutionVisitor.java | 0 .../java/org/apache/bcel/verifier/structurals/Frame.java | 0 .../java/org/apache/bcel/verifier/structurals/GenericArray.java | 0 .../apache/bcel/verifier/structurals/InstConstraintVisitor.java | 0 .../org/apache/bcel/verifier/structurals/InstructionContext.java | 0 .../java/org/apache/bcel/verifier/structurals/LocalVariables.java | 0 .../java/org/apache/bcel/verifier/structurals/OperandStack.java | 0 .../java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java | 0 .../java/org/apache/bcel/verifier/structurals/Subroutine.java | 0 .../java/org/apache/bcel/verifier/structurals/Subroutines.java | 0 .../apache/bcel/verifier/structurals/UninitializedObjectType.java | 0 .../java/org/apache/bcel/verifier/structurals/package.html | 0 354 files changed, 0 insertions(+), 0 deletions(-) rename src/{ => main}/java/org/apache/bcel/Constants.java (100%) rename src/{ => main}/java/org/apache/bcel/ExceptionConstants.java (100%) rename src/{ => main}/java/org/apache/bcel/Repository.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/AccessFlags.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/AnnotationDefault.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/AnnotationEntry.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Annotations.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Attribute.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/AttributeReader.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ClassFormatException.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ClassParser.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Code.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/CodeException.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Constant.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantCP.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantClass.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantDouble.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantFieldref.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantFloat.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantInteger.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantLong.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantMethodref.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantNameAndType.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantObject.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantPool.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantString.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantUtf8.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ConstantValue.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Deprecated.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/DescendingVisitor.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ElementValue.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ElementValuePair.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/EmptyVisitor.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ExceptionTable.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Field.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/FieldOrMethod.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/InnerClass.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/InnerClasses.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/JavaClass.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/LineNumber.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/LineNumberTable.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/LocalVariable.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/LocalVariableTable.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Method.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Node.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/PMGClass.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/ParameterAnnotations.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Signature.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/SourceFile.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/StackMap.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/StackMapEntry.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/StackMapType.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Synthetic.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Unknown.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Utility.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/Visitor.java (100%) rename src/{ => main}/java/org/apache/bcel/classfile/package.html (100%) rename src/{ => main}/java/org/apache/bcel/generic/AALOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/AASTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ACONST_NULL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ALOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ANEWARRAY.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ARETURN.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ARRAYLENGTH.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ASTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ATHROW.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/AllocationInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ArithmeticInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ArrayInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ArrayType.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/BALOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/BASTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/BIPUSH.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/BREAKPOINT.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/BasicType.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/BranchHandle.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/BranchInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/CALOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/CASTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/CHECKCAST.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/CPInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ClassGen.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ClassGenException.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ClassObserver.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/CodeExceptionGen.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/CompoundInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ConstantPoolGen.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ConstantPushInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ConversionInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/D2F.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/D2I.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/D2L.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DADD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DALOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DASTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DCMPG.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DCMPL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DCONST.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DDIV.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DLOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DMUL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DNEG.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DREM.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DRETURN.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DSTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DSUB.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DUP.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DUP2.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DUP2_X1.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DUP2_X2.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DUP_X1.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/DUP_X2.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/EmptyVisitor.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ExceptionThrower.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/F2D.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/F2I.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/F2L.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FADD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FALOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FASTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FCMPG.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FCMPL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FCONST.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FDIV.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FLOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FMUL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FNEG.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FREM.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FRETURN.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FSTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FSUB.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FieldGen.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FieldGenOrMethodGen.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FieldInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FieldObserver.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/FieldOrMethod.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/GETFIELD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/GETSTATIC.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/GOTO.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/GOTO_W.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/GotoInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/I2B.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/I2C.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/I2D.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/I2F.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/I2L.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/I2S.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IADD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IALOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IAND.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IASTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ICONST.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IDIV.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IFEQ.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IFGE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IFGT.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IFLE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IFLT.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IFNE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IFNONNULL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IFNULL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IF_ACMPEQ.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IF_ACMPNE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IF_ICMPEQ.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IF_ICMPGE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IF_ICMPGT.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IF_ICMPLE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IF_ICMPLT.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IF_ICMPNE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IINC.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ILOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IMPDEP1.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IMPDEP2.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IMUL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/INEG.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/INSTANCEOF.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/INVOKEINTERFACE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/INVOKESPECIAL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/INVOKESTATIC.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/INVOKEVIRTUAL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IOR.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IREM.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IRETURN.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ISHL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ISHR.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ISTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ISUB.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IUSHR.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IXOR.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IfInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/IndexedInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/Instruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/InstructionComparator.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/InstructionConstants.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/InstructionFactory.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/InstructionHandle.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/InstructionList.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/InstructionListObserver.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/InstructionTargeter.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/InvokeInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/JSR.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/JSR_W.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/JsrInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/L2D.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/L2F.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/L2I.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LADD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LALOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LAND.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LASTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LCMP.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LCONST.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LDC.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LDC2_W.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LDC_W.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LDIV.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LLOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LMUL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LNEG.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LOOKUPSWITCH.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LOR.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LREM.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LRETURN.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LSHL.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LSHR.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LSTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LSUB.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LUSHR.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LXOR.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LineNumberGen.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LoadClass.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LoadInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LocalVariableGen.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/LocalVariableInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/MONITORENTER.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/MONITOREXIT.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/MULTIANEWARRAY.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/MethodGen.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/MethodObserver.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/NEW.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/NEWARRAY.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/NOP.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/NamedAndTyped.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ObjectType.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/POP.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/POP2.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/PUSH.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/PUTFIELD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/PUTSTATIC.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/PopInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/PushInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/RET.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/RETURN.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ReferenceType.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ReturnInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/ReturnaddressType.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/SALOAD.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/SASTORE.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/SIPUSH.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/SWAP.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/SWITCH.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/Select.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/StackConsumer.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/StackInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/StackProducer.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/StoreInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/TABLESWITCH.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/TargetLostException.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/Type.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/TypedInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/UnconditionalBranch.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/VariableLengthInstruction.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/Visitor.java (100%) rename src/{ => main}/java/org/apache/bcel/generic/package.html (100%) rename src/{ => main}/java/org/apache/bcel/package.html (100%) rename src/{ => main}/java/org/apache/bcel/util/AttributeHTML.java (100%) rename src/{ => main}/java/org/apache/bcel/util/BCELComparator.java (100%) rename src/{ => main}/java/org/apache/bcel/util/BCELFactory.java (100%) rename src/{ => main}/java/org/apache/bcel/util/BCELifier.java (100%) rename src/{ => main}/java/org/apache/bcel/util/ByteSequence.java (100%) rename src/{ => main}/java/org/apache/bcel/util/Class2HTML.java (100%) rename src/{ => main}/java/org/apache/bcel/util/ClassLoader.java (100%) rename src/{ => main}/java/org/apache/bcel/util/ClassLoaderRepository.java (100%) rename src/{ => main}/java/org/apache/bcel/util/ClassPath.java (100%) rename src/{ => main}/java/org/apache/bcel/util/ClassQueue.java (100%) rename src/{ => main}/java/org/apache/bcel/util/ClassSet.java (100%) rename src/{ => main}/java/org/apache/bcel/util/ClassStack.java (100%) rename src/{ => main}/java/org/apache/bcel/util/ClassVector.java (100%) rename src/{ => main}/java/org/apache/bcel/util/CodeHTML.java (100%) rename src/{ => main}/java/org/apache/bcel/util/ConstantHTML.java (100%) rename src/{ => main}/java/org/apache/bcel/util/InstructionFinder.java (100%) rename src/{ => main}/java/org/apache/bcel/util/JavaWrapper.java (100%) rename src/{ => main}/java/org/apache/bcel/util/MethodHTML.java (100%) rename src/{ => main}/java/org/apache/bcel/util/Repository.java (100%) rename src/{ => main}/java/org/apache/bcel/util/SyntheticRepository.java (100%) rename src/{ => main}/java/org/apache/bcel/util/package.html (100%) rename src/{ => main}/java/org/apache/bcel/verifier/GraphicalVerifier.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/NativeVerifier.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/PassVerifier.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/TransitiveHull.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/VerificationResult.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/Verifier.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/VerifierAppFrame.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/VerifierFactory.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/VerifierFactoryListModel.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/VerifierFactoryObserver.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/VerifyDialog.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/ClassConstraintException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/CodeConstraintException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/InvalidMethodException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/LoadingException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/Utility.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/VerificationException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/exc/package.html (100%) rename src/{ => main}/java/org/apache/bcel/verifier/package.html (100%) rename src/{ => main}/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/statics/IntList.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/statics/LONG_Upper.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/statics/Pass1Verifier.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/statics/Pass2Verifier.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/statics/StringRepresentation.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/statics/package.html (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/Frame.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/GenericArray.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/InstructionContext.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/LocalVariables.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/OperandStack.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/Subroutine.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/Subroutines.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java (100%) rename src/{ => main}/java/org/apache/bcel/verifier/structurals/package.html (100%) diff --git a/src/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java similarity index 100% rename from src/java/org/apache/bcel/Constants.java rename to src/main/java/org/apache/bcel/Constants.java diff --git a/src/java/org/apache/bcel/ExceptionConstants.java b/src/main/java/org/apache/bcel/ExceptionConstants.java similarity index 100% rename from src/java/org/apache/bcel/ExceptionConstants.java rename to src/main/java/org/apache/bcel/ExceptionConstants.java diff --git a/src/java/org/apache/bcel/Repository.java b/src/main/java/org/apache/bcel/Repository.java similarity index 100% rename from src/java/org/apache/bcel/Repository.java rename to src/main/java/org/apache/bcel/Repository.java diff --git a/src/java/org/apache/bcel/classfile/AccessFlags.java b/src/main/java/org/apache/bcel/classfile/AccessFlags.java similarity index 100% rename from src/java/org/apache/bcel/classfile/AccessFlags.java rename to src/main/java/org/apache/bcel/classfile/AccessFlags.java diff --git a/src/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java similarity index 100% rename from src/java/org/apache/bcel/classfile/AnnotationDefault.java rename to src/main/java/org/apache/bcel/classfile/AnnotationDefault.java diff --git a/src/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java similarity index 100% rename from src/java/org/apache/bcel/classfile/AnnotationEntry.java rename to src/main/java/org/apache/bcel/classfile/AnnotationEntry.java diff --git a/src/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Annotations.java rename to src/main/java/org/apache/bcel/classfile/Annotations.java diff --git a/src/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Attribute.java rename to src/main/java/org/apache/bcel/classfile/Attribute.java diff --git a/src/java/org/apache/bcel/classfile/AttributeReader.java b/src/main/java/org/apache/bcel/classfile/AttributeReader.java similarity index 100% rename from src/java/org/apache/bcel/classfile/AttributeReader.java rename to src/main/java/org/apache/bcel/classfile/AttributeReader.java diff --git a/src/java/org/apache/bcel/classfile/ClassFormatException.java b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ClassFormatException.java rename to src/main/java/org/apache/bcel/classfile/ClassFormatException.java diff --git a/src/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ClassParser.java rename to src/main/java/org/apache/bcel/classfile/ClassParser.java diff --git a/src/java/org/apache/bcel/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Code.java rename to src/main/java/org/apache/bcel/classfile/Code.java diff --git a/src/java/org/apache/bcel/classfile/CodeException.java b/src/main/java/org/apache/bcel/classfile/CodeException.java similarity index 100% rename from src/java/org/apache/bcel/classfile/CodeException.java rename to src/main/java/org/apache/bcel/classfile/CodeException.java diff --git a/src/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Constant.java rename to src/main/java/org/apache/bcel/classfile/Constant.java diff --git a/src/java/org/apache/bcel/classfile/ConstantCP.java b/src/main/java/org/apache/bcel/classfile/ConstantCP.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantCP.java rename to src/main/java/org/apache/bcel/classfile/ConstantCP.java diff --git a/src/java/org/apache/bcel/classfile/ConstantClass.java b/src/main/java/org/apache/bcel/classfile/ConstantClass.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantClass.java rename to src/main/java/org/apache/bcel/classfile/ConstantClass.java diff --git a/src/java/org/apache/bcel/classfile/ConstantDouble.java b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantDouble.java rename to src/main/java/org/apache/bcel/classfile/ConstantDouble.java diff --git a/src/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantFieldref.java rename to src/main/java/org/apache/bcel/classfile/ConstantFieldref.java diff --git a/src/java/org/apache/bcel/classfile/ConstantFloat.java b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantFloat.java rename to src/main/java/org/apache/bcel/classfile/ConstantFloat.java diff --git a/src/java/org/apache/bcel/classfile/ConstantInteger.java b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantInteger.java rename to src/main/java/org/apache/bcel/classfile/ConstantInteger.java diff --git a/src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java rename to src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java diff --git a/src/java/org/apache/bcel/classfile/ConstantLong.java b/src/main/java/org/apache/bcel/classfile/ConstantLong.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantLong.java rename to src/main/java/org/apache/bcel/classfile/ConstantLong.java diff --git a/src/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantMethodref.java rename to src/main/java/org/apache/bcel/classfile/ConstantMethodref.java diff --git a/src/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantNameAndType.java rename to src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java diff --git a/src/java/org/apache/bcel/classfile/ConstantObject.java b/src/main/java/org/apache/bcel/classfile/ConstantObject.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantObject.java rename to src/main/java/org/apache/bcel/classfile/ConstantObject.java diff --git a/src/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantPool.java rename to src/main/java/org/apache/bcel/classfile/ConstantPool.java diff --git a/src/java/org/apache/bcel/classfile/ConstantString.java b/src/main/java/org/apache/bcel/classfile/ConstantString.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantString.java rename to src/main/java/org/apache/bcel/classfile/ConstantString.java diff --git a/src/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantUtf8.java rename to src/main/java/org/apache/bcel/classfile/ConstantUtf8.java diff --git a/src/java/org/apache/bcel/classfile/ConstantValue.java b/src/main/java/org/apache/bcel/classfile/ConstantValue.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ConstantValue.java rename to src/main/java/org/apache/bcel/classfile/ConstantValue.java diff --git a/src/java/org/apache/bcel/classfile/Deprecated.java b/src/main/java/org/apache/bcel/classfile/Deprecated.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Deprecated.java rename to src/main/java/org/apache/bcel/classfile/Deprecated.java diff --git a/src/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java similarity index 100% rename from src/java/org/apache/bcel/classfile/DescendingVisitor.java rename to src/main/java/org/apache/bcel/classfile/DescendingVisitor.java diff --git a/src/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ElementValue.java rename to src/main/java/org/apache/bcel/classfile/ElementValue.java diff --git a/src/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ElementValuePair.java rename to src/main/java/org/apache/bcel/classfile/ElementValuePair.java diff --git a/src/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java similarity index 100% rename from src/java/org/apache/bcel/classfile/EmptyVisitor.java rename to src/main/java/org/apache/bcel/classfile/EmptyVisitor.java diff --git a/src/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ExceptionTable.java rename to src/main/java/org/apache/bcel/classfile/ExceptionTable.java diff --git a/src/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Field.java rename to src/main/java/org/apache/bcel/classfile/Field.java diff --git a/src/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java similarity index 100% rename from src/java/org/apache/bcel/classfile/FieldOrMethod.java rename to src/main/java/org/apache/bcel/classfile/FieldOrMethod.java diff --git a/src/java/org/apache/bcel/classfile/InnerClass.java b/src/main/java/org/apache/bcel/classfile/InnerClass.java similarity index 100% rename from src/java/org/apache/bcel/classfile/InnerClass.java rename to src/main/java/org/apache/bcel/classfile/InnerClass.java diff --git a/src/java/org/apache/bcel/classfile/InnerClasses.java b/src/main/java/org/apache/bcel/classfile/InnerClasses.java similarity index 100% rename from src/java/org/apache/bcel/classfile/InnerClasses.java rename to src/main/java/org/apache/bcel/classfile/InnerClasses.java diff --git a/src/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java similarity index 100% rename from src/java/org/apache/bcel/classfile/JavaClass.java rename to src/main/java/org/apache/bcel/classfile/JavaClass.java diff --git a/src/java/org/apache/bcel/classfile/LineNumber.java b/src/main/java/org/apache/bcel/classfile/LineNumber.java similarity index 100% rename from src/java/org/apache/bcel/classfile/LineNumber.java rename to src/main/java/org/apache/bcel/classfile/LineNumber.java diff --git a/src/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java similarity index 100% rename from src/java/org/apache/bcel/classfile/LineNumberTable.java rename to src/main/java/org/apache/bcel/classfile/LineNumberTable.java diff --git a/src/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java similarity index 100% rename from src/java/org/apache/bcel/classfile/LocalVariable.java rename to src/main/java/org/apache/bcel/classfile/LocalVariable.java diff --git a/src/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java similarity index 100% rename from src/java/org/apache/bcel/classfile/LocalVariableTable.java rename to src/main/java/org/apache/bcel/classfile/LocalVariableTable.java diff --git a/src/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Method.java rename to src/main/java/org/apache/bcel/classfile/Method.java diff --git a/src/java/org/apache/bcel/classfile/Node.java b/src/main/java/org/apache/bcel/classfile/Node.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Node.java rename to src/main/java/org/apache/bcel/classfile/Node.java diff --git a/src/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java similarity index 100% rename from src/java/org/apache/bcel/classfile/PMGClass.java rename to src/main/java/org/apache/bcel/classfile/PMGClass.java diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java rename to src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java diff --git a/src/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java similarity index 100% rename from src/java/org/apache/bcel/classfile/ParameterAnnotations.java rename to src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java similarity index 100% rename from src/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java rename to src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java diff --git a/src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java similarity index 100% rename from src/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java rename to src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java similarity index 100% rename from src/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java rename to src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java diff --git a/src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java similarity index 100% rename from src/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java rename to src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java diff --git a/src/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Signature.java rename to src/main/java/org/apache/bcel/classfile/Signature.java diff --git a/src/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java similarity index 100% rename from src/java/org/apache/bcel/classfile/SourceFile.java rename to src/main/java/org/apache/bcel/classfile/SourceFile.java diff --git a/src/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java similarity index 100% rename from src/java/org/apache/bcel/classfile/StackMap.java rename to src/main/java/org/apache/bcel/classfile/StackMap.java diff --git a/src/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java similarity index 100% rename from src/java/org/apache/bcel/classfile/StackMapEntry.java rename to src/main/java/org/apache/bcel/classfile/StackMapEntry.java diff --git a/src/java/org/apache/bcel/classfile/StackMapType.java b/src/main/java/org/apache/bcel/classfile/StackMapType.java similarity index 100% rename from src/java/org/apache/bcel/classfile/StackMapType.java rename to src/main/java/org/apache/bcel/classfile/StackMapType.java diff --git a/src/java/org/apache/bcel/classfile/Synthetic.java b/src/main/java/org/apache/bcel/classfile/Synthetic.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Synthetic.java rename to src/main/java/org/apache/bcel/classfile/Synthetic.java diff --git a/src/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Unknown.java rename to src/main/java/org/apache/bcel/classfile/Unknown.java diff --git a/src/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Utility.java rename to src/main/java/org/apache/bcel/classfile/Utility.java diff --git a/src/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java similarity index 100% rename from src/java/org/apache/bcel/classfile/Visitor.java rename to src/main/java/org/apache/bcel/classfile/Visitor.java diff --git a/src/java/org/apache/bcel/classfile/package.html b/src/main/java/org/apache/bcel/classfile/package.html similarity index 100% rename from src/java/org/apache/bcel/classfile/package.html rename to src/main/java/org/apache/bcel/classfile/package.html diff --git a/src/java/org/apache/bcel/generic/AALOAD.java b/src/main/java/org/apache/bcel/generic/AALOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/AALOAD.java rename to src/main/java/org/apache/bcel/generic/AALOAD.java diff --git a/src/java/org/apache/bcel/generic/AASTORE.java b/src/main/java/org/apache/bcel/generic/AASTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/AASTORE.java rename to src/main/java/org/apache/bcel/generic/AASTORE.java diff --git a/src/java/org/apache/bcel/generic/ACONST_NULL.java b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java similarity index 100% rename from src/java/org/apache/bcel/generic/ACONST_NULL.java rename to src/main/java/org/apache/bcel/generic/ACONST_NULL.java diff --git a/src/java/org/apache/bcel/generic/ALOAD.java b/src/main/java/org/apache/bcel/generic/ALOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/ALOAD.java rename to src/main/java/org/apache/bcel/generic/ALOAD.java diff --git a/src/java/org/apache/bcel/generic/ANEWARRAY.java b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java similarity index 100% rename from src/java/org/apache/bcel/generic/ANEWARRAY.java rename to src/main/java/org/apache/bcel/generic/ANEWARRAY.java diff --git a/src/java/org/apache/bcel/generic/ARETURN.java b/src/main/java/org/apache/bcel/generic/ARETURN.java similarity index 100% rename from src/java/org/apache/bcel/generic/ARETURN.java rename to src/main/java/org/apache/bcel/generic/ARETURN.java diff --git a/src/java/org/apache/bcel/generic/ARRAYLENGTH.java b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java similarity index 100% rename from src/java/org/apache/bcel/generic/ARRAYLENGTH.java rename to src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java diff --git a/src/java/org/apache/bcel/generic/ASTORE.java b/src/main/java/org/apache/bcel/generic/ASTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/ASTORE.java rename to src/main/java/org/apache/bcel/generic/ASTORE.java diff --git a/src/java/org/apache/bcel/generic/ATHROW.java b/src/main/java/org/apache/bcel/generic/ATHROW.java similarity index 100% rename from src/java/org/apache/bcel/generic/ATHROW.java rename to src/main/java/org/apache/bcel/generic/ATHROW.java diff --git a/src/java/org/apache/bcel/generic/AllocationInstruction.java b/src/main/java/org/apache/bcel/generic/AllocationInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/AllocationInstruction.java rename to src/main/java/org/apache/bcel/generic/AllocationInstruction.java diff --git a/src/java/org/apache/bcel/generic/ArithmeticInstruction.java b/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/ArithmeticInstruction.java rename to src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java diff --git a/src/java/org/apache/bcel/generic/ArrayInstruction.java b/src/main/java/org/apache/bcel/generic/ArrayInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/ArrayInstruction.java rename to src/main/java/org/apache/bcel/generic/ArrayInstruction.java diff --git a/src/java/org/apache/bcel/generic/ArrayType.java b/src/main/java/org/apache/bcel/generic/ArrayType.java similarity index 100% rename from src/java/org/apache/bcel/generic/ArrayType.java rename to src/main/java/org/apache/bcel/generic/ArrayType.java diff --git a/src/java/org/apache/bcel/generic/BALOAD.java b/src/main/java/org/apache/bcel/generic/BALOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/BALOAD.java rename to src/main/java/org/apache/bcel/generic/BALOAD.java diff --git a/src/java/org/apache/bcel/generic/BASTORE.java b/src/main/java/org/apache/bcel/generic/BASTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/BASTORE.java rename to src/main/java/org/apache/bcel/generic/BASTORE.java diff --git a/src/java/org/apache/bcel/generic/BIPUSH.java b/src/main/java/org/apache/bcel/generic/BIPUSH.java similarity index 100% rename from src/java/org/apache/bcel/generic/BIPUSH.java rename to src/main/java/org/apache/bcel/generic/BIPUSH.java diff --git a/src/java/org/apache/bcel/generic/BREAKPOINT.java b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java similarity index 100% rename from src/java/org/apache/bcel/generic/BREAKPOINT.java rename to src/main/java/org/apache/bcel/generic/BREAKPOINT.java diff --git a/src/java/org/apache/bcel/generic/BasicType.java b/src/main/java/org/apache/bcel/generic/BasicType.java similarity index 100% rename from src/java/org/apache/bcel/generic/BasicType.java rename to src/main/java/org/apache/bcel/generic/BasicType.java diff --git a/src/java/org/apache/bcel/generic/BranchHandle.java b/src/main/java/org/apache/bcel/generic/BranchHandle.java similarity index 100% rename from src/java/org/apache/bcel/generic/BranchHandle.java rename to src/main/java/org/apache/bcel/generic/BranchHandle.java diff --git a/src/java/org/apache/bcel/generic/BranchInstruction.java b/src/main/java/org/apache/bcel/generic/BranchInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/BranchInstruction.java rename to src/main/java/org/apache/bcel/generic/BranchInstruction.java diff --git a/src/java/org/apache/bcel/generic/CALOAD.java b/src/main/java/org/apache/bcel/generic/CALOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/CALOAD.java rename to src/main/java/org/apache/bcel/generic/CALOAD.java diff --git a/src/java/org/apache/bcel/generic/CASTORE.java b/src/main/java/org/apache/bcel/generic/CASTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/CASTORE.java rename to src/main/java/org/apache/bcel/generic/CASTORE.java diff --git a/src/java/org/apache/bcel/generic/CHECKCAST.java b/src/main/java/org/apache/bcel/generic/CHECKCAST.java similarity index 100% rename from src/java/org/apache/bcel/generic/CHECKCAST.java rename to src/main/java/org/apache/bcel/generic/CHECKCAST.java diff --git a/src/java/org/apache/bcel/generic/CPInstruction.java b/src/main/java/org/apache/bcel/generic/CPInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/CPInstruction.java rename to src/main/java/org/apache/bcel/generic/CPInstruction.java diff --git a/src/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java similarity index 100% rename from src/java/org/apache/bcel/generic/ClassGen.java rename to src/main/java/org/apache/bcel/generic/ClassGen.java diff --git a/src/java/org/apache/bcel/generic/ClassGenException.java b/src/main/java/org/apache/bcel/generic/ClassGenException.java similarity index 100% rename from src/java/org/apache/bcel/generic/ClassGenException.java rename to src/main/java/org/apache/bcel/generic/ClassGenException.java diff --git a/src/java/org/apache/bcel/generic/ClassObserver.java b/src/main/java/org/apache/bcel/generic/ClassObserver.java similarity index 100% rename from src/java/org/apache/bcel/generic/ClassObserver.java rename to src/main/java/org/apache/bcel/generic/ClassObserver.java diff --git a/src/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java similarity index 100% rename from src/java/org/apache/bcel/generic/CodeExceptionGen.java rename to src/main/java/org/apache/bcel/generic/CodeExceptionGen.java diff --git a/src/java/org/apache/bcel/generic/CompoundInstruction.java b/src/main/java/org/apache/bcel/generic/CompoundInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/CompoundInstruction.java rename to src/main/java/org/apache/bcel/generic/CompoundInstruction.java diff --git a/src/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java similarity index 100% rename from src/java/org/apache/bcel/generic/ConstantPoolGen.java rename to src/main/java/org/apache/bcel/generic/ConstantPoolGen.java diff --git a/src/java/org/apache/bcel/generic/ConstantPushInstruction.java b/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/ConstantPushInstruction.java rename to src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java diff --git a/src/java/org/apache/bcel/generic/ConversionInstruction.java b/src/main/java/org/apache/bcel/generic/ConversionInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/ConversionInstruction.java rename to src/main/java/org/apache/bcel/generic/ConversionInstruction.java diff --git a/src/java/org/apache/bcel/generic/D2F.java b/src/main/java/org/apache/bcel/generic/D2F.java similarity index 100% rename from src/java/org/apache/bcel/generic/D2F.java rename to src/main/java/org/apache/bcel/generic/D2F.java diff --git a/src/java/org/apache/bcel/generic/D2I.java b/src/main/java/org/apache/bcel/generic/D2I.java similarity index 100% rename from src/java/org/apache/bcel/generic/D2I.java rename to src/main/java/org/apache/bcel/generic/D2I.java diff --git a/src/java/org/apache/bcel/generic/D2L.java b/src/main/java/org/apache/bcel/generic/D2L.java similarity index 100% rename from src/java/org/apache/bcel/generic/D2L.java rename to src/main/java/org/apache/bcel/generic/D2L.java diff --git a/src/java/org/apache/bcel/generic/DADD.java b/src/main/java/org/apache/bcel/generic/DADD.java similarity index 100% rename from src/java/org/apache/bcel/generic/DADD.java rename to src/main/java/org/apache/bcel/generic/DADD.java diff --git a/src/java/org/apache/bcel/generic/DALOAD.java b/src/main/java/org/apache/bcel/generic/DALOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/DALOAD.java rename to src/main/java/org/apache/bcel/generic/DALOAD.java diff --git a/src/java/org/apache/bcel/generic/DASTORE.java b/src/main/java/org/apache/bcel/generic/DASTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/DASTORE.java rename to src/main/java/org/apache/bcel/generic/DASTORE.java diff --git a/src/java/org/apache/bcel/generic/DCMPG.java b/src/main/java/org/apache/bcel/generic/DCMPG.java similarity index 100% rename from src/java/org/apache/bcel/generic/DCMPG.java rename to src/main/java/org/apache/bcel/generic/DCMPG.java diff --git a/src/java/org/apache/bcel/generic/DCMPL.java b/src/main/java/org/apache/bcel/generic/DCMPL.java similarity index 100% rename from src/java/org/apache/bcel/generic/DCMPL.java rename to src/main/java/org/apache/bcel/generic/DCMPL.java diff --git a/src/java/org/apache/bcel/generic/DCONST.java b/src/main/java/org/apache/bcel/generic/DCONST.java similarity index 100% rename from src/java/org/apache/bcel/generic/DCONST.java rename to src/main/java/org/apache/bcel/generic/DCONST.java diff --git a/src/java/org/apache/bcel/generic/DDIV.java b/src/main/java/org/apache/bcel/generic/DDIV.java similarity index 100% rename from src/java/org/apache/bcel/generic/DDIV.java rename to src/main/java/org/apache/bcel/generic/DDIV.java diff --git a/src/java/org/apache/bcel/generic/DLOAD.java b/src/main/java/org/apache/bcel/generic/DLOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/DLOAD.java rename to src/main/java/org/apache/bcel/generic/DLOAD.java diff --git a/src/java/org/apache/bcel/generic/DMUL.java b/src/main/java/org/apache/bcel/generic/DMUL.java similarity index 100% rename from src/java/org/apache/bcel/generic/DMUL.java rename to src/main/java/org/apache/bcel/generic/DMUL.java diff --git a/src/java/org/apache/bcel/generic/DNEG.java b/src/main/java/org/apache/bcel/generic/DNEG.java similarity index 100% rename from src/java/org/apache/bcel/generic/DNEG.java rename to src/main/java/org/apache/bcel/generic/DNEG.java diff --git a/src/java/org/apache/bcel/generic/DREM.java b/src/main/java/org/apache/bcel/generic/DREM.java similarity index 100% rename from src/java/org/apache/bcel/generic/DREM.java rename to src/main/java/org/apache/bcel/generic/DREM.java diff --git a/src/java/org/apache/bcel/generic/DRETURN.java b/src/main/java/org/apache/bcel/generic/DRETURN.java similarity index 100% rename from src/java/org/apache/bcel/generic/DRETURN.java rename to src/main/java/org/apache/bcel/generic/DRETURN.java diff --git a/src/java/org/apache/bcel/generic/DSTORE.java b/src/main/java/org/apache/bcel/generic/DSTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/DSTORE.java rename to src/main/java/org/apache/bcel/generic/DSTORE.java diff --git a/src/java/org/apache/bcel/generic/DSUB.java b/src/main/java/org/apache/bcel/generic/DSUB.java similarity index 100% rename from src/java/org/apache/bcel/generic/DSUB.java rename to src/main/java/org/apache/bcel/generic/DSUB.java diff --git a/src/java/org/apache/bcel/generic/DUP.java b/src/main/java/org/apache/bcel/generic/DUP.java similarity index 100% rename from src/java/org/apache/bcel/generic/DUP.java rename to src/main/java/org/apache/bcel/generic/DUP.java diff --git a/src/java/org/apache/bcel/generic/DUP2.java b/src/main/java/org/apache/bcel/generic/DUP2.java similarity index 100% rename from src/java/org/apache/bcel/generic/DUP2.java rename to src/main/java/org/apache/bcel/generic/DUP2.java diff --git a/src/java/org/apache/bcel/generic/DUP2_X1.java b/src/main/java/org/apache/bcel/generic/DUP2_X1.java similarity index 100% rename from src/java/org/apache/bcel/generic/DUP2_X1.java rename to src/main/java/org/apache/bcel/generic/DUP2_X1.java diff --git a/src/java/org/apache/bcel/generic/DUP2_X2.java b/src/main/java/org/apache/bcel/generic/DUP2_X2.java similarity index 100% rename from src/java/org/apache/bcel/generic/DUP2_X2.java rename to src/main/java/org/apache/bcel/generic/DUP2_X2.java diff --git a/src/java/org/apache/bcel/generic/DUP_X1.java b/src/main/java/org/apache/bcel/generic/DUP_X1.java similarity index 100% rename from src/java/org/apache/bcel/generic/DUP_X1.java rename to src/main/java/org/apache/bcel/generic/DUP_X1.java diff --git a/src/java/org/apache/bcel/generic/DUP_X2.java b/src/main/java/org/apache/bcel/generic/DUP_X2.java similarity index 100% rename from src/java/org/apache/bcel/generic/DUP_X2.java rename to src/main/java/org/apache/bcel/generic/DUP_X2.java diff --git a/src/java/org/apache/bcel/generic/EmptyVisitor.java b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java similarity index 100% rename from src/java/org/apache/bcel/generic/EmptyVisitor.java rename to src/main/java/org/apache/bcel/generic/EmptyVisitor.java diff --git a/src/java/org/apache/bcel/generic/ExceptionThrower.java b/src/main/java/org/apache/bcel/generic/ExceptionThrower.java similarity index 100% rename from src/java/org/apache/bcel/generic/ExceptionThrower.java rename to src/main/java/org/apache/bcel/generic/ExceptionThrower.java diff --git a/src/java/org/apache/bcel/generic/F2D.java b/src/main/java/org/apache/bcel/generic/F2D.java similarity index 100% rename from src/java/org/apache/bcel/generic/F2D.java rename to src/main/java/org/apache/bcel/generic/F2D.java diff --git a/src/java/org/apache/bcel/generic/F2I.java b/src/main/java/org/apache/bcel/generic/F2I.java similarity index 100% rename from src/java/org/apache/bcel/generic/F2I.java rename to src/main/java/org/apache/bcel/generic/F2I.java diff --git a/src/java/org/apache/bcel/generic/F2L.java b/src/main/java/org/apache/bcel/generic/F2L.java similarity index 100% rename from src/java/org/apache/bcel/generic/F2L.java rename to src/main/java/org/apache/bcel/generic/F2L.java diff --git a/src/java/org/apache/bcel/generic/FADD.java b/src/main/java/org/apache/bcel/generic/FADD.java similarity index 100% rename from src/java/org/apache/bcel/generic/FADD.java rename to src/main/java/org/apache/bcel/generic/FADD.java diff --git a/src/java/org/apache/bcel/generic/FALOAD.java b/src/main/java/org/apache/bcel/generic/FALOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/FALOAD.java rename to src/main/java/org/apache/bcel/generic/FALOAD.java diff --git a/src/java/org/apache/bcel/generic/FASTORE.java b/src/main/java/org/apache/bcel/generic/FASTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/FASTORE.java rename to src/main/java/org/apache/bcel/generic/FASTORE.java diff --git a/src/java/org/apache/bcel/generic/FCMPG.java b/src/main/java/org/apache/bcel/generic/FCMPG.java similarity index 100% rename from src/java/org/apache/bcel/generic/FCMPG.java rename to src/main/java/org/apache/bcel/generic/FCMPG.java diff --git a/src/java/org/apache/bcel/generic/FCMPL.java b/src/main/java/org/apache/bcel/generic/FCMPL.java similarity index 100% rename from src/java/org/apache/bcel/generic/FCMPL.java rename to src/main/java/org/apache/bcel/generic/FCMPL.java diff --git a/src/java/org/apache/bcel/generic/FCONST.java b/src/main/java/org/apache/bcel/generic/FCONST.java similarity index 100% rename from src/java/org/apache/bcel/generic/FCONST.java rename to src/main/java/org/apache/bcel/generic/FCONST.java diff --git a/src/java/org/apache/bcel/generic/FDIV.java b/src/main/java/org/apache/bcel/generic/FDIV.java similarity index 100% rename from src/java/org/apache/bcel/generic/FDIV.java rename to src/main/java/org/apache/bcel/generic/FDIV.java diff --git a/src/java/org/apache/bcel/generic/FLOAD.java b/src/main/java/org/apache/bcel/generic/FLOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/FLOAD.java rename to src/main/java/org/apache/bcel/generic/FLOAD.java diff --git a/src/java/org/apache/bcel/generic/FMUL.java b/src/main/java/org/apache/bcel/generic/FMUL.java similarity index 100% rename from src/java/org/apache/bcel/generic/FMUL.java rename to src/main/java/org/apache/bcel/generic/FMUL.java diff --git a/src/java/org/apache/bcel/generic/FNEG.java b/src/main/java/org/apache/bcel/generic/FNEG.java similarity index 100% rename from src/java/org/apache/bcel/generic/FNEG.java rename to src/main/java/org/apache/bcel/generic/FNEG.java diff --git a/src/java/org/apache/bcel/generic/FREM.java b/src/main/java/org/apache/bcel/generic/FREM.java similarity index 100% rename from src/java/org/apache/bcel/generic/FREM.java rename to src/main/java/org/apache/bcel/generic/FREM.java diff --git a/src/java/org/apache/bcel/generic/FRETURN.java b/src/main/java/org/apache/bcel/generic/FRETURN.java similarity index 100% rename from src/java/org/apache/bcel/generic/FRETURN.java rename to src/main/java/org/apache/bcel/generic/FRETURN.java diff --git a/src/java/org/apache/bcel/generic/FSTORE.java b/src/main/java/org/apache/bcel/generic/FSTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/FSTORE.java rename to src/main/java/org/apache/bcel/generic/FSTORE.java diff --git a/src/java/org/apache/bcel/generic/FSUB.java b/src/main/java/org/apache/bcel/generic/FSUB.java similarity index 100% rename from src/java/org/apache/bcel/generic/FSUB.java rename to src/main/java/org/apache/bcel/generic/FSUB.java diff --git a/src/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java similarity index 100% rename from src/java/org/apache/bcel/generic/FieldGen.java rename to src/main/java/org/apache/bcel/generic/FieldGen.java diff --git a/src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java similarity index 100% rename from src/java/org/apache/bcel/generic/FieldGenOrMethodGen.java rename to src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java diff --git a/src/java/org/apache/bcel/generic/FieldInstruction.java b/src/main/java/org/apache/bcel/generic/FieldInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/FieldInstruction.java rename to src/main/java/org/apache/bcel/generic/FieldInstruction.java diff --git a/src/java/org/apache/bcel/generic/FieldObserver.java b/src/main/java/org/apache/bcel/generic/FieldObserver.java similarity index 100% rename from src/java/org/apache/bcel/generic/FieldObserver.java rename to src/main/java/org/apache/bcel/generic/FieldObserver.java diff --git a/src/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java similarity index 100% rename from src/java/org/apache/bcel/generic/FieldOrMethod.java rename to src/main/java/org/apache/bcel/generic/FieldOrMethod.java diff --git a/src/java/org/apache/bcel/generic/GETFIELD.java b/src/main/java/org/apache/bcel/generic/GETFIELD.java similarity index 100% rename from src/java/org/apache/bcel/generic/GETFIELD.java rename to src/main/java/org/apache/bcel/generic/GETFIELD.java diff --git a/src/java/org/apache/bcel/generic/GETSTATIC.java b/src/main/java/org/apache/bcel/generic/GETSTATIC.java similarity index 100% rename from src/java/org/apache/bcel/generic/GETSTATIC.java rename to src/main/java/org/apache/bcel/generic/GETSTATIC.java diff --git a/src/java/org/apache/bcel/generic/GOTO.java b/src/main/java/org/apache/bcel/generic/GOTO.java similarity index 100% rename from src/java/org/apache/bcel/generic/GOTO.java rename to src/main/java/org/apache/bcel/generic/GOTO.java diff --git a/src/java/org/apache/bcel/generic/GOTO_W.java b/src/main/java/org/apache/bcel/generic/GOTO_W.java similarity index 100% rename from src/java/org/apache/bcel/generic/GOTO_W.java rename to src/main/java/org/apache/bcel/generic/GOTO_W.java diff --git a/src/java/org/apache/bcel/generic/GotoInstruction.java b/src/main/java/org/apache/bcel/generic/GotoInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/GotoInstruction.java rename to src/main/java/org/apache/bcel/generic/GotoInstruction.java diff --git a/src/java/org/apache/bcel/generic/I2B.java b/src/main/java/org/apache/bcel/generic/I2B.java similarity index 100% rename from src/java/org/apache/bcel/generic/I2B.java rename to src/main/java/org/apache/bcel/generic/I2B.java diff --git a/src/java/org/apache/bcel/generic/I2C.java b/src/main/java/org/apache/bcel/generic/I2C.java similarity index 100% rename from src/java/org/apache/bcel/generic/I2C.java rename to src/main/java/org/apache/bcel/generic/I2C.java diff --git a/src/java/org/apache/bcel/generic/I2D.java b/src/main/java/org/apache/bcel/generic/I2D.java similarity index 100% rename from src/java/org/apache/bcel/generic/I2D.java rename to src/main/java/org/apache/bcel/generic/I2D.java diff --git a/src/java/org/apache/bcel/generic/I2F.java b/src/main/java/org/apache/bcel/generic/I2F.java similarity index 100% rename from src/java/org/apache/bcel/generic/I2F.java rename to src/main/java/org/apache/bcel/generic/I2F.java diff --git a/src/java/org/apache/bcel/generic/I2L.java b/src/main/java/org/apache/bcel/generic/I2L.java similarity index 100% rename from src/java/org/apache/bcel/generic/I2L.java rename to src/main/java/org/apache/bcel/generic/I2L.java diff --git a/src/java/org/apache/bcel/generic/I2S.java b/src/main/java/org/apache/bcel/generic/I2S.java similarity index 100% rename from src/java/org/apache/bcel/generic/I2S.java rename to src/main/java/org/apache/bcel/generic/I2S.java diff --git a/src/java/org/apache/bcel/generic/IADD.java b/src/main/java/org/apache/bcel/generic/IADD.java similarity index 100% rename from src/java/org/apache/bcel/generic/IADD.java rename to src/main/java/org/apache/bcel/generic/IADD.java diff --git a/src/java/org/apache/bcel/generic/IALOAD.java b/src/main/java/org/apache/bcel/generic/IALOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/IALOAD.java rename to src/main/java/org/apache/bcel/generic/IALOAD.java diff --git a/src/java/org/apache/bcel/generic/IAND.java b/src/main/java/org/apache/bcel/generic/IAND.java similarity index 100% rename from src/java/org/apache/bcel/generic/IAND.java rename to src/main/java/org/apache/bcel/generic/IAND.java diff --git a/src/java/org/apache/bcel/generic/IASTORE.java b/src/main/java/org/apache/bcel/generic/IASTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/IASTORE.java rename to src/main/java/org/apache/bcel/generic/IASTORE.java diff --git a/src/java/org/apache/bcel/generic/ICONST.java b/src/main/java/org/apache/bcel/generic/ICONST.java similarity index 100% rename from src/java/org/apache/bcel/generic/ICONST.java rename to src/main/java/org/apache/bcel/generic/ICONST.java diff --git a/src/java/org/apache/bcel/generic/IDIV.java b/src/main/java/org/apache/bcel/generic/IDIV.java similarity index 100% rename from src/java/org/apache/bcel/generic/IDIV.java rename to src/main/java/org/apache/bcel/generic/IDIV.java diff --git a/src/java/org/apache/bcel/generic/IFEQ.java b/src/main/java/org/apache/bcel/generic/IFEQ.java similarity index 100% rename from src/java/org/apache/bcel/generic/IFEQ.java rename to src/main/java/org/apache/bcel/generic/IFEQ.java diff --git a/src/java/org/apache/bcel/generic/IFGE.java b/src/main/java/org/apache/bcel/generic/IFGE.java similarity index 100% rename from src/java/org/apache/bcel/generic/IFGE.java rename to src/main/java/org/apache/bcel/generic/IFGE.java diff --git a/src/java/org/apache/bcel/generic/IFGT.java b/src/main/java/org/apache/bcel/generic/IFGT.java similarity index 100% rename from src/java/org/apache/bcel/generic/IFGT.java rename to src/main/java/org/apache/bcel/generic/IFGT.java diff --git a/src/java/org/apache/bcel/generic/IFLE.java b/src/main/java/org/apache/bcel/generic/IFLE.java similarity index 100% rename from src/java/org/apache/bcel/generic/IFLE.java rename to src/main/java/org/apache/bcel/generic/IFLE.java diff --git a/src/java/org/apache/bcel/generic/IFLT.java b/src/main/java/org/apache/bcel/generic/IFLT.java similarity index 100% rename from src/java/org/apache/bcel/generic/IFLT.java rename to src/main/java/org/apache/bcel/generic/IFLT.java diff --git a/src/java/org/apache/bcel/generic/IFNE.java b/src/main/java/org/apache/bcel/generic/IFNE.java similarity index 100% rename from src/java/org/apache/bcel/generic/IFNE.java rename to src/main/java/org/apache/bcel/generic/IFNE.java diff --git a/src/java/org/apache/bcel/generic/IFNONNULL.java b/src/main/java/org/apache/bcel/generic/IFNONNULL.java similarity index 100% rename from src/java/org/apache/bcel/generic/IFNONNULL.java rename to src/main/java/org/apache/bcel/generic/IFNONNULL.java diff --git a/src/java/org/apache/bcel/generic/IFNULL.java b/src/main/java/org/apache/bcel/generic/IFNULL.java similarity index 100% rename from src/java/org/apache/bcel/generic/IFNULL.java rename to src/main/java/org/apache/bcel/generic/IFNULL.java diff --git a/src/java/org/apache/bcel/generic/IF_ACMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java similarity index 100% rename from src/java/org/apache/bcel/generic/IF_ACMPEQ.java rename to src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java diff --git a/src/java/org/apache/bcel/generic/IF_ACMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java similarity index 100% rename from src/java/org/apache/bcel/generic/IF_ACMPNE.java rename to src/main/java/org/apache/bcel/generic/IF_ACMPNE.java diff --git a/src/java/org/apache/bcel/generic/IF_ICMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java similarity index 100% rename from src/java/org/apache/bcel/generic/IF_ICMPEQ.java rename to src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java diff --git a/src/java/org/apache/bcel/generic/IF_ICMPGE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java similarity index 100% rename from src/java/org/apache/bcel/generic/IF_ICMPGE.java rename to src/main/java/org/apache/bcel/generic/IF_ICMPGE.java diff --git a/src/java/org/apache/bcel/generic/IF_ICMPGT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java similarity index 100% rename from src/java/org/apache/bcel/generic/IF_ICMPGT.java rename to src/main/java/org/apache/bcel/generic/IF_ICMPGT.java diff --git a/src/java/org/apache/bcel/generic/IF_ICMPLE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java similarity index 100% rename from src/java/org/apache/bcel/generic/IF_ICMPLE.java rename to src/main/java/org/apache/bcel/generic/IF_ICMPLE.java diff --git a/src/java/org/apache/bcel/generic/IF_ICMPLT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java similarity index 100% rename from src/java/org/apache/bcel/generic/IF_ICMPLT.java rename to src/main/java/org/apache/bcel/generic/IF_ICMPLT.java diff --git a/src/java/org/apache/bcel/generic/IF_ICMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java similarity index 100% rename from src/java/org/apache/bcel/generic/IF_ICMPNE.java rename to src/main/java/org/apache/bcel/generic/IF_ICMPNE.java diff --git a/src/java/org/apache/bcel/generic/IINC.java b/src/main/java/org/apache/bcel/generic/IINC.java similarity index 100% rename from src/java/org/apache/bcel/generic/IINC.java rename to src/main/java/org/apache/bcel/generic/IINC.java diff --git a/src/java/org/apache/bcel/generic/ILOAD.java b/src/main/java/org/apache/bcel/generic/ILOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/ILOAD.java rename to src/main/java/org/apache/bcel/generic/ILOAD.java diff --git a/src/java/org/apache/bcel/generic/IMPDEP1.java b/src/main/java/org/apache/bcel/generic/IMPDEP1.java similarity index 100% rename from src/java/org/apache/bcel/generic/IMPDEP1.java rename to src/main/java/org/apache/bcel/generic/IMPDEP1.java diff --git a/src/java/org/apache/bcel/generic/IMPDEP2.java b/src/main/java/org/apache/bcel/generic/IMPDEP2.java similarity index 100% rename from src/java/org/apache/bcel/generic/IMPDEP2.java rename to src/main/java/org/apache/bcel/generic/IMPDEP2.java diff --git a/src/java/org/apache/bcel/generic/IMUL.java b/src/main/java/org/apache/bcel/generic/IMUL.java similarity index 100% rename from src/java/org/apache/bcel/generic/IMUL.java rename to src/main/java/org/apache/bcel/generic/IMUL.java diff --git a/src/java/org/apache/bcel/generic/INEG.java b/src/main/java/org/apache/bcel/generic/INEG.java similarity index 100% rename from src/java/org/apache/bcel/generic/INEG.java rename to src/main/java/org/apache/bcel/generic/INEG.java diff --git a/src/java/org/apache/bcel/generic/INSTANCEOF.java b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java similarity index 100% rename from src/java/org/apache/bcel/generic/INSTANCEOF.java rename to src/main/java/org/apache/bcel/generic/INSTANCEOF.java diff --git a/src/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java similarity index 100% rename from src/java/org/apache/bcel/generic/INVOKEINTERFACE.java rename to src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java diff --git a/src/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java similarity index 100% rename from src/java/org/apache/bcel/generic/INVOKESPECIAL.java rename to src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java diff --git a/src/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java similarity index 100% rename from src/java/org/apache/bcel/generic/INVOKESTATIC.java rename to src/main/java/org/apache/bcel/generic/INVOKESTATIC.java diff --git a/src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java similarity index 100% rename from src/java/org/apache/bcel/generic/INVOKEVIRTUAL.java rename to src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java diff --git a/src/java/org/apache/bcel/generic/IOR.java b/src/main/java/org/apache/bcel/generic/IOR.java similarity index 100% rename from src/java/org/apache/bcel/generic/IOR.java rename to src/main/java/org/apache/bcel/generic/IOR.java diff --git a/src/java/org/apache/bcel/generic/IREM.java b/src/main/java/org/apache/bcel/generic/IREM.java similarity index 100% rename from src/java/org/apache/bcel/generic/IREM.java rename to src/main/java/org/apache/bcel/generic/IREM.java diff --git a/src/java/org/apache/bcel/generic/IRETURN.java b/src/main/java/org/apache/bcel/generic/IRETURN.java similarity index 100% rename from src/java/org/apache/bcel/generic/IRETURN.java rename to src/main/java/org/apache/bcel/generic/IRETURN.java diff --git a/src/java/org/apache/bcel/generic/ISHL.java b/src/main/java/org/apache/bcel/generic/ISHL.java similarity index 100% rename from src/java/org/apache/bcel/generic/ISHL.java rename to src/main/java/org/apache/bcel/generic/ISHL.java diff --git a/src/java/org/apache/bcel/generic/ISHR.java b/src/main/java/org/apache/bcel/generic/ISHR.java similarity index 100% rename from src/java/org/apache/bcel/generic/ISHR.java rename to src/main/java/org/apache/bcel/generic/ISHR.java diff --git a/src/java/org/apache/bcel/generic/ISTORE.java b/src/main/java/org/apache/bcel/generic/ISTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/ISTORE.java rename to src/main/java/org/apache/bcel/generic/ISTORE.java diff --git a/src/java/org/apache/bcel/generic/ISUB.java b/src/main/java/org/apache/bcel/generic/ISUB.java similarity index 100% rename from src/java/org/apache/bcel/generic/ISUB.java rename to src/main/java/org/apache/bcel/generic/ISUB.java diff --git a/src/java/org/apache/bcel/generic/IUSHR.java b/src/main/java/org/apache/bcel/generic/IUSHR.java similarity index 100% rename from src/java/org/apache/bcel/generic/IUSHR.java rename to src/main/java/org/apache/bcel/generic/IUSHR.java diff --git a/src/java/org/apache/bcel/generic/IXOR.java b/src/main/java/org/apache/bcel/generic/IXOR.java similarity index 100% rename from src/java/org/apache/bcel/generic/IXOR.java rename to src/main/java/org/apache/bcel/generic/IXOR.java diff --git a/src/java/org/apache/bcel/generic/IfInstruction.java b/src/main/java/org/apache/bcel/generic/IfInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/IfInstruction.java rename to src/main/java/org/apache/bcel/generic/IfInstruction.java diff --git a/src/java/org/apache/bcel/generic/IndexedInstruction.java b/src/main/java/org/apache/bcel/generic/IndexedInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/IndexedInstruction.java rename to src/main/java/org/apache/bcel/generic/IndexedInstruction.java diff --git a/src/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/Instruction.java rename to src/main/java/org/apache/bcel/generic/Instruction.java diff --git a/src/java/org/apache/bcel/generic/InstructionComparator.java b/src/main/java/org/apache/bcel/generic/InstructionComparator.java similarity index 100% rename from src/java/org/apache/bcel/generic/InstructionComparator.java rename to src/main/java/org/apache/bcel/generic/InstructionComparator.java diff --git a/src/java/org/apache/bcel/generic/InstructionConstants.java b/src/main/java/org/apache/bcel/generic/InstructionConstants.java similarity index 100% rename from src/java/org/apache/bcel/generic/InstructionConstants.java rename to src/main/java/org/apache/bcel/generic/InstructionConstants.java diff --git a/src/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java similarity index 100% rename from src/java/org/apache/bcel/generic/InstructionFactory.java rename to src/main/java/org/apache/bcel/generic/InstructionFactory.java diff --git a/src/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java similarity index 100% rename from src/java/org/apache/bcel/generic/InstructionHandle.java rename to src/main/java/org/apache/bcel/generic/InstructionHandle.java diff --git a/src/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java similarity index 100% rename from src/java/org/apache/bcel/generic/InstructionList.java rename to src/main/java/org/apache/bcel/generic/InstructionList.java diff --git a/src/java/org/apache/bcel/generic/InstructionListObserver.java b/src/main/java/org/apache/bcel/generic/InstructionListObserver.java similarity index 100% rename from src/java/org/apache/bcel/generic/InstructionListObserver.java rename to src/main/java/org/apache/bcel/generic/InstructionListObserver.java diff --git a/src/java/org/apache/bcel/generic/InstructionTargeter.java b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java similarity index 100% rename from src/java/org/apache/bcel/generic/InstructionTargeter.java rename to src/main/java/org/apache/bcel/generic/InstructionTargeter.java diff --git a/src/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/InvokeInstruction.java rename to src/main/java/org/apache/bcel/generic/InvokeInstruction.java diff --git a/src/java/org/apache/bcel/generic/JSR.java b/src/main/java/org/apache/bcel/generic/JSR.java similarity index 100% rename from src/java/org/apache/bcel/generic/JSR.java rename to src/main/java/org/apache/bcel/generic/JSR.java diff --git a/src/java/org/apache/bcel/generic/JSR_W.java b/src/main/java/org/apache/bcel/generic/JSR_W.java similarity index 100% rename from src/java/org/apache/bcel/generic/JSR_W.java rename to src/main/java/org/apache/bcel/generic/JSR_W.java diff --git a/src/java/org/apache/bcel/generic/JsrInstruction.java b/src/main/java/org/apache/bcel/generic/JsrInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/JsrInstruction.java rename to src/main/java/org/apache/bcel/generic/JsrInstruction.java diff --git a/src/java/org/apache/bcel/generic/L2D.java b/src/main/java/org/apache/bcel/generic/L2D.java similarity index 100% rename from src/java/org/apache/bcel/generic/L2D.java rename to src/main/java/org/apache/bcel/generic/L2D.java diff --git a/src/java/org/apache/bcel/generic/L2F.java b/src/main/java/org/apache/bcel/generic/L2F.java similarity index 100% rename from src/java/org/apache/bcel/generic/L2F.java rename to src/main/java/org/apache/bcel/generic/L2F.java diff --git a/src/java/org/apache/bcel/generic/L2I.java b/src/main/java/org/apache/bcel/generic/L2I.java similarity index 100% rename from src/java/org/apache/bcel/generic/L2I.java rename to src/main/java/org/apache/bcel/generic/L2I.java diff --git a/src/java/org/apache/bcel/generic/LADD.java b/src/main/java/org/apache/bcel/generic/LADD.java similarity index 100% rename from src/java/org/apache/bcel/generic/LADD.java rename to src/main/java/org/apache/bcel/generic/LADD.java diff --git a/src/java/org/apache/bcel/generic/LALOAD.java b/src/main/java/org/apache/bcel/generic/LALOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/LALOAD.java rename to src/main/java/org/apache/bcel/generic/LALOAD.java diff --git a/src/java/org/apache/bcel/generic/LAND.java b/src/main/java/org/apache/bcel/generic/LAND.java similarity index 100% rename from src/java/org/apache/bcel/generic/LAND.java rename to src/main/java/org/apache/bcel/generic/LAND.java diff --git a/src/java/org/apache/bcel/generic/LASTORE.java b/src/main/java/org/apache/bcel/generic/LASTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/LASTORE.java rename to src/main/java/org/apache/bcel/generic/LASTORE.java diff --git a/src/java/org/apache/bcel/generic/LCMP.java b/src/main/java/org/apache/bcel/generic/LCMP.java similarity index 100% rename from src/java/org/apache/bcel/generic/LCMP.java rename to src/main/java/org/apache/bcel/generic/LCMP.java diff --git a/src/java/org/apache/bcel/generic/LCONST.java b/src/main/java/org/apache/bcel/generic/LCONST.java similarity index 100% rename from src/java/org/apache/bcel/generic/LCONST.java rename to src/main/java/org/apache/bcel/generic/LCONST.java diff --git a/src/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java similarity index 100% rename from src/java/org/apache/bcel/generic/LDC.java rename to src/main/java/org/apache/bcel/generic/LDC.java diff --git a/src/java/org/apache/bcel/generic/LDC2_W.java b/src/main/java/org/apache/bcel/generic/LDC2_W.java similarity index 100% rename from src/java/org/apache/bcel/generic/LDC2_W.java rename to src/main/java/org/apache/bcel/generic/LDC2_W.java diff --git a/src/java/org/apache/bcel/generic/LDC_W.java b/src/main/java/org/apache/bcel/generic/LDC_W.java similarity index 100% rename from src/java/org/apache/bcel/generic/LDC_W.java rename to src/main/java/org/apache/bcel/generic/LDC_W.java diff --git a/src/java/org/apache/bcel/generic/LDIV.java b/src/main/java/org/apache/bcel/generic/LDIV.java similarity index 100% rename from src/java/org/apache/bcel/generic/LDIV.java rename to src/main/java/org/apache/bcel/generic/LDIV.java diff --git a/src/java/org/apache/bcel/generic/LLOAD.java b/src/main/java/org/apache/bcel/generic/LLOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/LLOAD.java rename to src/main/java/org/apache/bcel/generic/LLOAD.java diff --git a/src/java/org/apache/bcel/generic/LMUL.java b/src/main/java/org/apache/bcel/generic/LMUL.java similarity index 100% rename from src/java/org/apache/bcel/generic/LMUL.java rename to src/main/java/org/apache/bcel/generic/LMUL.java diff --git a/src/java/org/apache/bcel/generic/LNEG.java b/src/main/java/org/apache/bcel/generic/LNEG.java similarity index 100% rename from src/java/org/apache/bcel/generic/LNEG.java rename to src/main/java/org/apache/bcel/generic/LNEG.java diff --git a/src/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java similarity index 100% rename from src/java/org/apache/bcel/generic/LOOKUPSWITCH.java rename to src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java diff --git a/src/java/org/apache/bcel/generic/LOR.java b/src/main/java/org/apache/bcel/generic/LOR.java similarity index 100% rename from src/java/org/apache/bcel/generic/LOR.java rename to src/main/java/org/apache/bcel/generic/LOR.java diff --git a/src/java/org/apache/bcel/generic/LREM.java b/src/main/java/org/apache/bcel/generic/LREM.java similarity index 100% rename from src/java/org/apache/bcel/generic/LREM.java rename to src/main/java/org/apache/bcel/generic/LREM.java diff --git a/src/java/org/apache/bcel/generic/LRETURN.java b/src/main/java/org/apache/bcel/generic/LRETURN.java similarity index 100% rename from src/java/org/apache/bcel/generic/LRETURN.java rename to src/main/java/org/apache/bcel/generic/LRETURN.java diff --git a/src/java/org/apache/bcel/generic/LSHL.java b/src/main/java/org/apache/bcel/generic/LSHL.java similarity index 100% rename from src/java/org/apache/bcel/generic/LSHL.java rename to src/main/java/org/apache/bcel/generic/LSHL.java diff --git a/src/java/org/apache/bcel/generic/LSHR.java b/src/main/java/org/apache/bcel/generic/LSHR.java similarity index 100% rename from src/java/org/apache/bcel/generic/LSHR.java rename to src/main/java/org/apache/bcel/generic/LSHR.java diff --git a/src/java/org/apache/bcel/generic/LSTORE.java b/src/main/java/org/apache/bcel/generic/LSTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/LSTORE.java rename to src/main/java/org/apache/bcel/generic/LSTORE.java diff --git a/src/java/org/apache/bcel/generic/LSUB.java b/src/main/java/org/apache/bcel/generic/LSUB.java similarity index 100% rename from src/java/org/apache/bcel/generic/LSUB.java rename to src/main/java/org/apache/bcel/generic/LSUB.java diff --git a/src/java/org/apache/bcel/generic/LUSHR.java b/src/main/java/org/apache/bcel/generic/LUSHR.java similarity index 100% rename from src/java/org/apache/bcel/generic/LUSHR.java rename to src/main/java/org/apache/bcel/generic/LUSHR.java diff --git a/src/java/org/apache/bcel/generic/LXOR.java b/src/main/java/org/apache/bcel/generic/LXOR.java similarity index 100% rename from src/java/org/apache/bcel/generic/LXOR.java rename to src/main/java/org/apache/bcel/generic/LXOR.java diff --git a/src/java/org/apache/bcel/generic/LineNumberGen.java b/src/main/java/org/apache/bcel/generic/LineNumberGen.java similarity index 100% rename from src/java/org/apache/bcel/generic/LineNumberGen.java rename to src/main/java/org/apache/bcel/generic/LineNumberGen.java diff --git a/src/java/org/apache/bcel/generic/LoadClass.java b/src/main/java/org/apache/bcel/generic/LoadClass.java similarity index 100% rename from src/java/org/apache/bcel/generic/LoadClass.java rename to src/main/java/org/apache/bcel/generic/LoadClass.java diff --git a/src/java/org/apache/bcel/generic/LoadInstruction.java b/src/main/java/org/apache/bcel/generic/LoadInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/LoadInstruction.java rename to src/main/java/org/apache/bcel/generic/LoadInstruction.java diff --git a/src/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java similarity index 100% rename from src/java/org/apache/bcel/generic/LocalVariableGen.java rename to src/main/java/org/apache/bcel/generic/LocalVariableGen.java diff --git a/src/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/LocalVariableInstruction.java rename to src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java diff --git a/src/java/org/apache/bcel/generic/MONITORENTER.java b/src/main/java/org/apache/bcel/generic/MONITORENTER.java similarity index 100% rename from src/java/org/apache/bcel/generic/MONITORENTER.java rename to src/main/java/org/apache/bcel/generic/MONITORENTER.java diff --git a/src/java/org/apache/bcel/generic/MONITOREXIT.java b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java similarity index 100% rename from src/java/org/apache/bcel/generic/MONITOREXIT.java rename to src/main/java/org/apache/bcel/generic/MONITOREXIT.java diff --git a/src/java/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java similarity index 100% rename from src/java/org/apache/bcel/generic/MULTIANEWARRAY.java rename to src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java diff --git a/src/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java similarity index 100% rename from src/java/org/apache/bcel/generic/MethodGen.java rename to src/main/java/org/apache/bcel/generic/MethodGen.java diff --git a/src/java/org/apache/bcel/generic/MethodObserver.java b/src/main/java/org/apache/bcel/generic/MethodObserver.java similarity index 100% rename from src/java/org/apache/bcel/generic/MethodObserver.java rename to src/main/java/org/apache/bcel/generic/MethodObserver.java diff --git a/src/java/org/apache/bcel/generic/NEW.java b/src/main/java/org/apache/bcel/generic/NEW.java similarity index 100% rename from src/java/org/apache/bcel/generic/NEW.java rename to src/main/java/org/apache/bcel/generic/NEW.java diff --git a/src/java/org/apache/bcel/generic/NEWARRAY.java b/src/main/java/org/apache/bcel/generic/NEWARRAY.java similarity index 100% rename from src/java/org/apache/bcel/generic/NEWARRAY.java rename to src/main/java/org/apache/bcel/generic/NEWARRAY.java diff --git a/src/java/org/apache/bcel/generic/NOP.java b/src/main/java/org/apache/bcel/generic/NOP.java similarity index 100% rename from src/java/org/apache/bcel/generic/NOP.java rename to src/main/java/org/apache/bcel/generic/NOP.java diff --git a/src/java/org/apache/bcel/generic/NamedAndTyped.java b/src/main/java/org/apache/bcel/generic/NamedAndTyped.java similarity index 100% rename from src/java/org/apache/bcel/generic/NamedAndTyped.java rename to src/main/java/org/apache/bcel/generic/NamedAndTyped.java diff --git a/src/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java similarity index 100% rename from src/java/org/apache/bcel/generic/ObjectType.java rename to src/main/java/org/apache/bcel/generic/ObjectType.java diff --git a/src/java/org/apache/bcel/generic/POP.java b/src/main/java/org/apache/bcel/generic/POP.java similarity index 100% rename from src/java/org/apache/bcel/generic/POP.java rename to src/main/java/org/apache/bcel/generic/POP.java diff --git a/src/java/org/apache/bcel/generic/POP2.java b/src/main/java/org/apache/bcel/generic/POP2.java similarity index 100% rename from src/java/org/apache/bcel/generic/POP2.java rename to src/main/java/org/apache/bcel/generic/POP2.java diff --git a/src/java/org/apache/bcel/generic/PUSH.java b/src/main/java/org/apache/bcel/generic/PUSH.java similarity index 100% rename from src/java/org/apache/bcel/generic/PUSH.java rename to src/main/java/org/apache/bcel/generic/PUSH.java diff --git a/src/java/org/apache/bcel/generic/PUTFIELD.java b/src/main/java/org/apache/bcel/generic/PUTFIELD.java similarity index 100% rename from src/java/org/apache/bcel/generic/PUTFIELD.java rename to src/main/java/org/apache/bcel/generic/PUTFIELD.java diff --git a/src/java/org/apache/bcel/generic/PUTSTATIC.java b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java similarity index 100% rename from src/java/org/apache/bcel/generic/PUTSTATIC.java rename to src/main/java/org/apache/bcel/generic/PUTSTATIC.java diff --git a/src/java/org/apache/bcel/generic/PopInstruction.java b/src/main/java/org/apache/bcel/generic/PopInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/PopInstruction.java rename to src/main/java/org/apache/bcel/generic/PopInstruction.java diff --git a/src/java/org/apache/bcel/generic/PushInstruction.java b/src/main/java/org/apache/bcel/generic/PushInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/PushInstruction.java rename to src/main/java/org/apache/bcel/generic/PushInstruction.java diff --git a/src/java/org/apache/bcel/generic/RET.java b/src/main/java/org/apache/bcel/generic/RET.java similarity index 100% rename from src/java/org/apache/bcel/generic/RET.java rename to src/main/java/org/apache/bcel/generic/RET.java diff --git a/src/java/org/apache/bcel/generic/RETURN.java b/src/main/java/org/apache/bcel/generic/RETURN.java similarity index 100% rename from src/java/org/apache/bcel/generic/RETURN.java rename to src/main/java/org/apache/bcel/generic/RETURN.java diff --git a/src/java/org/apache/bcel/generic/ReferenceType.java b/src/main/java/org/apache/bcel/generic/ReferenceType.java similarity index 100% rename from src/java/org/apache/bcel/generic/ReferenceType.java rename to src/main/java/org/apache/bcel/generic/ReferenceType.java diff --git a/src/java/org/apache/bcel/generic/ReturnInstruction.java b/src/main/java/org/apache/bcel/generic/ReturnInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/ReturnInstruction.java rename to src/main/java/org/apache/bcel/generic/ReturnInstruction.java diff --git a/src/java/org/apache/bcel/generic/ReturnaddressType.java b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java similarity index 100% rename from src/java/org/apache/bcel/generic/ReturnaddressType.java rename to src/main/java/org/apache/bcel/generic/ReturnaddressType.java diff --git a/src/java/org/apache/bcel/generic/SALOAD.java b/src/main/java/org/apache/bcel/generic/SALOAD.java similarity index 100% rename from src/java/org/apache/bcel/generic/SALOAD.java rename to src/main/java/org/apache/bcel/generic/SALOAD.java diff --git a/src/java/org/apache/bcel/generic/SASTORE.java b/src/main/java/org/apache/bcel/generic/SASTORE.java similarity index 100% rename from src/java/org/apache/bcel/generic/SASTORE.java rename to src/main/java/org/apache/bcel/generic/SASTORE.java diff --git a/src/java/org/apache/bcel/generic/SIPUSH.java b/src/main/java/org/apache/bcel/generic/SIPUSH.java similarity index 100% rename from src/java/org/apache/bcel/generic/SIPUSH.java rename to src/main/java/org/apache/bcel/generic/SIPUSH.java diff --git a/src/java/org/apache/bcel/generic/SWAP.java b/src/main/java/org/apache/bcel/generic/SWAP.java similarity index 100% rename from src/java/org/apache/bcel/generic/SWAP.java rename to src/main/java/org/apache/bcel/generic/SWAP.java diff --git a/src/java/org/apache/bcel/generic/SWITCH.java b/src/main/java/org/apache/bcel/generic/SWITCH.java similarity index 100% rename from src/java/org/apache/bcel/generic/SWITCH.java rename to src/main/java/org/apache/bcel/generic/SWITCH.java diff --git a/src/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java similarity index 100% rename from src/java/org/apache/bcel/generic/Select.java rename to src/main/java/org/apache/bcel/generic/Select.java diff --git a/src/java/org/apache/bcel/generic/StackConsumer.java b/src/main/java/org/apache/bcel/generic/StackConsumer.java similarity index 100% rename from src/java/org/apache/bcel/generic/StackConsumer.java rename to src/main/java/org/apache/bcel/generic/StackConsumer.java diff --git a/src/java/org/apache/bcel/generic/StackInstruction.java b/src/main/java/org/apache/bcel/generic/StackInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/StackInstruction.java rename to src/main/java/org/apache/bcel/generic/StackInstruction.java diff --git a/src/java/org/apache/bcel/generic/StackProducer.java b/src/main/java/org/apache/bcel/generic/StackProducer.java similarity index 100% rename from src/java/org/apache/bcel/generic/StackProducer.java rename to src/main/java/org/apache/bcel/generic/StackProducer.java diff --git a/src/java/org/apache/bcel/generic/StoreInstruction.java b/src/main/java/org/apache/bcel/generic/StoreInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/StoreInstruction.java rename to src/main/java/org/apache/bcel/generic/StoreInstruction.java diff --git a/src/java/org/apache/bcel/generic/TABLESWITCH.java b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java similarity index 100% rename from src/java/org/apache/bcel/generic/TABLESWITCH.java rename to src/main/java/org/apache/bcel/generic/TABLESWITCH.java diff --git a/src/java/org/apache/bcel/generic/TargetLostException.java b/src/main/java/org/apache/bcel/generic/TargetLostException.java similarity index 100% rename from src/java/org/apache/bcel/generic/TargetLostException.java rename to src/main/java/org/apache/bcel/generic/TargetLostException.java diff --git a/src/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java similarity index 100% rename from src/java/org/apache/bcel/generic/Type.java rename to src/main/java/org/apache/bcel/generic/Type.java diff --git a/src/java/org/apache/bcel/generic/TypedInstruction.java b/src/main/java/org/apache/bcel/generic/TypedInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/TypedInstruction.java rename to src/main/java/org/apache/bcel/generic/TypedInstruction.java diff --git a/src/java/org/apache/bcel/generic/UnconditionalBranch.java b/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java similarity index 100% rename from src/java/org/apache/bcel/generic/UnconditionalBranch.java rename to src/main/java/org/apache/bcel/generic/UnconditionalBranch.java diff --git a/src/java/org/apache/bcel/generic/VariableLengthInstruction.java b/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java similarity index 100% rename from src/java/org/apache/bcel/generic/VariableLengthInstruction.java rename to src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java diff --git a/src/java/org/apache/bcel/generic/Visitor.java b/src/main/java/org/apache/bcel/generic/Visitor.java similarity index 100% rename from src/java/org/apache/bcel/generic/Visitor.java rename to src/main/java/org/apache/bcel/generic/Visitor.java diff --git a/src/java/org/apache/bcel/generic/package.html b/src/main/java/org/apache/bcel/generic/package.html similarity index 100% rename from src/java/org/apache/bcel/generic/package.html rename to src/main/java/org/apache/bcel/generic/package.html diff --git a/src/java/org/apache/bcel/package.html b/src/main/java/org/apache/bcel/package.html similarity index 100% rename from src/java/org/apache/bcel/package.html rename to src/main/java/org/apache/bcel/package.html diff --git a/src/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java similarity index 100% rename from src/java/org/apache/bcel/util/AttributeHTML.java rename to src/main/java/org/apache/bcel/util/AttributeHTML.java diff --git a/src/java/org/apache/bcel/util/BCELComparator.java b/src/main/java/org/apache/bcel/util/BCELComparator.java similarity index 100% rename from src/java/org/apache/bcel/util/BCELComparator.java rename to src/main/java/org/apache/bcel/util/BCELComparator.java diff --git a/src/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java similarity index 100% rename from src/java/org/apache/bcel/util/BCELFactory.java rename to src/main/java/org/apache/bcel/util/BCELFactory.java diff --git a/src/java/org/apache/bcel/util/BCELifier.java b/src/main/java/org/apache/bcel/util/BCELifier.java similarity index 100% rename from src/java/org/apache/bcel/util/BCELifier.java rename to src/main/java/org/apache/bcel/util/BCELifier.java diff --git a/src/java/org/apache/bcel/util/ByteSequence.java b/src/main/java/org/apache/bcel/util/ByteSequence.java similarity index 100% rename from src/java/org/apache/bcel/util/ByteSequence.java rename to src/main/java/org/apache/bcel/util/ByteSequence.java diff --git a/src/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java similarity index 100% rename from src/java/org/apache/bcel/util/Class2HTML.java rename to src/main/java/org/apache/bcel/util/Class2HTML.java diff --git a/src/java/org/apache/bcel/util/ClassLoader.java b/src/main/java/org/apache/bcel/util/ClassLoader.java similarity index 100% rename from src/java/org/apache/bcel/util/ClassLoader.java rename to src/main/java/org/apache/bcel/util/ClassLoader.java diff --git a/src/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java similarity index 100% rename from src/java/org/apache/bcel/util/ClassLoaderRepository.java rename to src/main/java/org/apache/bcel/util/ClassLoaderRepository.java diff --git a/src/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java similarity index 100% rename from src/java/org/apache/bcel/util/ClassPath.java rename to src/main/java/org/apache/bcel/util/ClassPath.java diff --git a/src/java/org/apache/bcel/util/ClassQueue.java b/src/main/java/org/apache/bcel/util/ClassQueue.java similarity index 100% rename from src/java/org/apache/bcel/util/ClassQueue.java rename to src/main/java/org/apache/bcel/util/ClassQueue.java diff --git a/src/java/org/apache/bcel/util/ClassSet.java b/src/main/java/org/apache/bcel/util/ClassSet.java similarity index 100% rename from src/java/org/apache/bcel/util/ClassSet.java rename to src/main/java/org/apache/bcel/util/ClassSet.java diff --git a/src/java/org/apache/bcel/util/ClassStack.java b/src/main/java/org/apache/bcel/util/ClassStack.java similarity index 100% rename from src/java/org/apache/bcel/util/ClassStack.java rename to src/main/java/org/apache/bcel/util/ClassStack.java diff --git a/src/java/org/apache/bcel/util/ClassVector.java b/src/main/java/org/apache/bcel/util/ClassVector.java similarity index 100% rename from src/java/org/apache/bcel/util/ClassVector.java rename to src/main/java/org/apache/bcel/util/ClassVector.java diff --git a/src/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java similarity index 100% rename from src/java/org/apache/bcel/util/CodeHTML.java rename to src/main/java/org/apache/bcel/util/CodeHTML.java diff --git a/src/java/org/apache/bcel/util/ConstantHTML.java b/src/main/java/org/apache/bcel/util/ConstantHTML.java similarity index 100% rename from src/java/org/apache/bcel/util/ConstantHTML.java rename to src/main/java/org/apache/bcel/util/ConstantHTML.java diff --git a/src/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java similarity index 100% rename from src/java/org/apache/bcel/util/InstructionFinder.java rename to src/main/java/org/apache/bcel/util/InstructionFinder.java diff --git a/src/java/org/apache/bcel/util/JavaWrapper.java b/src/main/java/org/apache/bcel/util/JavaWrapper.java similarity index 100% rename from src/java/org/apache/bcel/util/JavaWrapper.java rename to src/main/java/org/apache/bcel/util/JavaWrapper.java diff --git a/src/java/org/apache/bcel/util/MethodHTML.java b/src/main/java/org/apache/bcel/util/MethodHTML.java similarity index 100% rename from src/java/org/apache/bcel/util/MethodHTML.java rename to src/main/java/org/apache/bcel/util/MethodHTML.java diff --git a/src/java/org/apache/bcel/util/Repository.java b/src/main/java/org/apache/bcel/util/Repository.java similarity index 100% rename from src/java/org/apache/bcel/util/Repository.java rename to src/main/java/org/apache/bcel/util/Repository.java diff --git a/src/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java similarity index 100% rename from src/java/org/apache/bcel/util/SyntheticRepository.java rename to src/main/java/org/apache/bcel/util/SyntheticRepository.java diff --git a/src/java/org/apache/bcel/util/package.html b/src/main/java/org/apache/bcel/util/package.html similarity index 100% rename from src/java/org/apache/bcel/util/package.html rename to src/main/java/org/apache/bcel/util/package.html diff --git a/src/java/org/apache/bcel/verifier/GraphicalVerifier.java b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java similarity index 100% rename from src/java/org/apache/bcel/verifier/GraphicalVerifier.java rename to src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java diff --git a/src/java/org/apache/bcel/verifier/NativeVerifier.java b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java similarity index 100% rename from src/java/org/apache/bcel/verifier/NativeVerifier.java rename to src/main/java/org/apache/bcel/verifier/NativeVerifier.java diff --git a/src/java/org/apache/bcel/verifier/PassVerifier.java b/src/main/java/org/apache/bcel/verifier/PassVerifier.java similarity index 100% rename from src/java/org/apache/bcel/verifier/PassVerifier.java rename to src/main/java/org/apache/bcel/verifier/PassVerifier.java diff --git a/src/java/org/apache/bcel/verifier/TransitiveHull.java b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java similarity index 100% rename from src/java/org/apache/bcel/verifier/TransitiveHull.java rename to src/main/java/org/apache/bcel/verifier/TransitiveHull.java diff --git a/src/java/org/apache/bcel/verifier/VerificationResult.java b/src/main/java/org/apache/bcel/verifier/VerificationResult.java similarity index 100% rename from src/java/org/apache/bcel/verifier/VerificationResult.java rename to src/main/java/org/apache/bcel/verifier/VerificationResult.java diff --git a/src/java/org/apache/bcel/verifier/Verifier.java b/src/main/java/org/apache/bcel/verifier/Verifier.java similarity index 100% rename from src/java/org/apache/bcel/verifier/Verifier.java rename to src/main/java/org/apache/bcel/verifier/Verifier.java diff --git a/src/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java similarity index 100% rename from src/java/org/apache/bcel/verifier/VerifierAppFrame.java rename to src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java diff --git a/src/java/org/apache/bcel/verifier/VerifierFactory.java b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java similarity index 100% rename from src/java/org/apache/bcel/verifier/VerifierFactory.java rename to src/main/java/org/apache/bcel/verifier/VerifierFactory.java diff --git a/src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java similarity index 100% rename from src/java/org/apache/bcel/verifier/VerifierFactoryListModel.java rename to src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java diff --git a/src/java/org/apache/bcel/verifier/VerifierFactoryObserver.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java similarity index 100% rename from src/java/org/apache/bcel/verifier/VerifierFactoryObserver.java rename to src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java diff --git a/src/java/org/apache/bcel/verifier/VerifyDialog.java b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java similarity index 100% rename from src/java/org/apache/bcel/verifier/VerifyDialog.java rename to src/main/java/org/apache/bcel/verifier/VerifyDialog.java diff --git a/src/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java rename to src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java diff --git a/src/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/ClassConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java diff --git a/src/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/CodeConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java diff --git a/src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/InvalidMethodException.java rename to src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java diff --git a/src/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java diff --git a/src/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/LoadingException.java rename to src/main/java/org/apache/bcel/verifier/exc/LoadingException.java diff --git a/src/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java rename to src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java diff --git a/src/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java diff --git a/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java diff --git a/src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java diff --git a/src/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java diff --git a/src/java/org/apache/bcel/verifier/exc/Utility.java b/src/main/java/org/apache/bcel/verifier/exc/Utility.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/Utility.java rename to src/main/java/org/apache/bcel/verifier/exc/Utility.java diff --git a/src/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/VerificationException.java rename to src/main/java/org/apache/bcel/verifier/exc/VerificationException.java diff --git a/src/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java rename to src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java diff --git a/src/java/org/apache/bcel/verifier/exc/package.html b/src/main/java/org/apache/bcel/verifier/exc/package.html similarity index 100% rename from src/java/org/apache/bcel/verifier/exc/package.html rename to src/main/java/org/apache/bcel/verifier/exc/package.html diff --git a/src/java/org/apache/bcel/verifier/package.html b/src/main/java/org/apache/bcel/verifier/package.html similarity index 100% rename from src/java/org/apache/bcel/verifier/package.html rename to src/main/java/org/apache/bcel/verifier/package.html diff --git a/src/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java similarity index 100% rename from src/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java rename to src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java diff --git a/src/java/org/apache/bcel/verifier/statics/IntList.java b/src/main/java/org/apache/bcel/verifier/statics/IntList.java similarity index 100% rename from src/java/org/apache/bcel/verifier/statics/IntList.java rename to src/main/java/org/apache/bcel/verifier/statics/IntList.java diff --git a/src/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java similarity index 100% rename from src/java/org/apache/bcel/verifier/statics/LONG_Upper.java rename to src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java diff --git a/src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java similarity index 100% rename from src/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java rename to src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java diff --git a/src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java similarity index 100% rename from src/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java rename to src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java diff --git a/src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java similarity index 100% rename from src/java/org/apache/bcel/verifier/statics/Pass1Verifier.java rename to src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java diff --git a/src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java similarity index 100% rename from src/java/org/apache/bcel/verifier/statics/Pass2Verifier.java rename to src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java diff --git a/src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java similarity index 100% rename from src/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java rename to src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java diff --git a/src/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java similarity index 100% rename from src/java/org/apache/bcel/verifier/statics/StringRepresentation.java rename to src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java diff --git a/src/java/org/apache/bcel/verifier/statics/package.html b/src/main/java/org/apache/bcel/verifier/statics/package.html similarity index 100% rename from src/java/org/apache/bcel/verifier/statics/package.html rename to src/main/java/org/apache/bcel/verifier/statics/package.html diff --git a/src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java rename to src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java diff --git a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java rename to src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java diff --git a/src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java rename to src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java diff --git a/src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java rename to src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java diff --git a/src/java/org/apache/bcel/verifier/structurals/Frame.java b/src/main/java/org/apache/bcel/verifier/structurals/Frame.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/Frame.java rename to src/main/java/org/apache/bcel/verifier/structurals/Frame.java diff --git a/src/java/org/apache/bcel/verifier/structurals/GenericArray.java b/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/GenericArray.java rename to src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java diff --git a/src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java rename to src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java diff --git a/src/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/InstructionContext.java rename to src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java diff --git a/src/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/LocalVariables.java rename to src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java diff --git a/src/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/OperandStack.java rename to src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java diff --git a/src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java rename to src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java diff --git a/src/java/org/apache/bcel/verifier/structurals/Subroutine.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/Subroutine.java rename to src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java diff --git a/src/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/Subroutines.java rename to src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java diff --git a/src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java rename to src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java diff --git a/src/java/org/apache/bcel/verifier/structurals/package.html b/src/main/java/org/apache/bcel/verifier/structurals/package.html similarity index 100% rename from src/java/org/apache/bcel/verifier/structurals/package.html rename to src/main/java/org/apache/bcel/verifier/structurals/package.html -- GitLab From 14347856c9fd7cd7e1b7a15989b8b0f1aba24c9c Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 4 Jun 2006 15:52:18 +0000 Subject: [PATCH 0346/1313] GSoC port to maven2, first code changes by Dmitriy Khayredinov git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@411580 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 18 +- .../bcel/classfile/AnnotationDefault.java | 196 +++-- .../bcel/classfile/AnnotationEntry.java | 180 ++--- .../apache/bcel/classfile/Annotations.java | 220 ++--- .../org/apache/bcel/classfile/Attribute.java | 522 ++++++------ .../bcel/classfile/DescendingVisitor.java | 752 ++++++++++-------- .../apache/bcel/classfile/ElementValue.java | 166 ++-- .../bcel/classfile/ElementValuePair.java | 90 +-- .../apache/bcel/classfile/EmptyVisitor.java | 262 +++--- .../bcel/classfile/EnclosingMethod.java | 87 ++ .../classfile/LocalVariableTypeTable.java | 135 ++++ .../classfile/ParameterAnnotationEntry.java | 152 ++-- .../bcel/classfile/ParameterAnnotations.java | 228 +++--- .../RuntimeInvisibleAnnotations.java | 104 +-- .../RuntimeInvisibleParameterAnnotations.java | 106 +-- .../classfile/RuntimeVisibleAnnotations.java | 104 +-- .../RuntimeVisibleParameterAnnotations.java | 106 +-- .../org/apache/bcel/classfile/Visitor.java | 113 ++- .../bcel/AbstractCounterVisitorTestCase.java | 31 + .../apache/bcel/CounterVisitorTestCase.java | 266 +++++++ .../java/org/apache/bcel/data/MarkedType.java | 48 ++ .../apache/bcel/data/MarkerAnnotation.java | 10 + .../bcel/data/MarkerAnnotationInvisible.java | 9 + .../apache/bcel/data/SimpleAnnotation.java | 10 + .../org/apache/bcel/data/package-info.java | 4 + .../apache/bcel/visitors/CounterVisitor.java | 310 ++++++++ 26 files changed, 2616 insertions(+), 1613 deletions(-) create mode 100755 src/main/java/org/apache/bcel/classfile/EnclosingMethod.java create mode 100755 src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java create mode 100755 src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java create mode 100755 src/test/java/org/apache/bcel/CounterVisitorTestCase.java create mode 100755 src/test/java/org/apache/bcel/data/MarkedType.java create mode 100755 src/test/java/org/apache/bcel/data/MarkerAnnotation.java create mode 100755 src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java create mode 100755 src/test/java/org/apache/bcel/data/SimpleAnnotation.java create mode 100755 src/test/java/org/apache/bcel/data/package-info.java create mode 100755 src/test/java/org/apache/bcel/visitors/CounterVisitor.java diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index f906e64a..f3beb581 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -35,6 +35,8 @@ public interface Constants { public final static short MINOR_1_4 = 0; public final static short MAJOR_1_5 = 49; public final static short MINOR_1_5 = 0; + public final static short MAJOR_1_6 = 50; + public final static short MINOR_1_6 = 0; public final static short MAJOR = MAJOR_1_1; // Defaults public final static short MINOR = MINOR_1_1; @@ -55,6 +57,7 @@ public interface Constants { public final static short ACC_FINAL = 0x0010; public final static short ACC_SYNCHRONIZED = 0x0020; + public final static short ACC_SYPER = 0x0020; public final static short ACC_VOLATILE = 0x0040; public final static short ACC_BRIDGE = 0x0040; public final static short ACC_TRANSIENT = 0x0080; @@ -729,14 +732,17 @@ public interface Constants { public static final byte ATTR_PMG = 9; public static final byte ATTR_SIGNATURE = 10; public static final byte ATTR_STACK_MAP = 11; - public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = 12; - public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = 13; - public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = 14; - public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = 15; + public static final byte ATTR_RUNTIME_VISIBLE_ANNOTATIONS = 12; + public static final byte ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS = 13; + public static final byte ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS = 14; + public static final byte ATTR_RUNTIMEIN_VISIBLE_PARAMETER_ANNOTATIONS = 15; public static final byte ATTR_ANNOTATION_DEFAULT = 16; + public static final byte ATTR_LOCAL_VARIABLE_TYPE_TABLE = 17; + public static final byte ATTR_ENCLOSING_METHOD = 18; - public static final short KNOWN_ATTRIBUTES = 12;//should be 17 + public static final short KNOWN_ATTRIBUTES = 19; + // TOFO: FIXXXXX public static final String[] ATTRIBUTE_NAMES = { "SourceFile", "ConstantValue", "Code", "Exceptions", "LineNumberTable", "LocalVariableTable", @@ -744,7 +750,7 @@ public interface Constants { "PMGClass", "Signature", "StackMap", "RuntimeVisibleAnnotations", "RuntimeInvisibleAnnotations", "RuntimeVisibleParameterAnnotations", "RuntimeInvisibleParameterAnnotations", - "AnnotationDefault" + "AnnotationDefault", "LocalVariableTypeTable", "EnclosingMethod" }; /** Constants used in the StackMap attribute. diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index 119b9274..96194846 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -1,88 +1,108 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; - -/** - * represents the default value of a annotation for a method info - * - * @version $Id: AnnotationDefault 1 2005-02-13 03:15:08Z dbrosius $ - * @author D. Brosius - * @since 5.2 - */ -public abstract class AnnotationDefault extends Attribute { - - ElementValue default_value; - - - /** - * @param annotation_type the subclass type of the annotation - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - AnnotationDefault(byte annotation_type, int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(annotation_type, name_index, length, (ElementValue) null, constant_pool); - default_value = new ElementValue(file, constant_pool); - } - - - /** - * @param annotation_type the subclass type of the annotation - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param defaultValue the annotation's default value - * @param constant_pool Array of constants - */ - public AnnotationDefault(byte annotation_type, int name_index, int length, - ElementValue defaultValue, ConstantPool constant_pool) { - super(annotation_type, name_index, length, constant_pool); - setDefaultValue(defaultValue); - } - - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept( Visitor v ) { - // v.visitAnnotationDefault(this); - } - - - /** - * @param defaultValue the default value of this methodinfo's annotation - */ - public final void setDefaultValue( ElementValue defaultValue ) { - default_value = defaultValue; - } - - - /** - * @return the default value - */ - public final ElementValue getDefaultValue() { - return default_value; - } -} +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; +import org.apache.bcel.Constants; + +/** + * represents the default value of a annotation for a method info + * + * @version $Id: AnnotationDefault 1 2005-02-13 03:15:08Z dbrosius $ + * @author D. Brosius + * @since 5.2 + */ +public class AnnotationDefault extends Attribute +{ + ElementValue default_value; + + /** + * @param annotation_type + * the subclass type of the annotation + * @param name_index + * Index pointing to the name Code + * @param length + * Content length in bytes + * @param file + * Input stream + * @param constant_pool + * Array of constants + */ + public AnnotationDefault(int name_index, int length, + DataInputStream file, ConstantPool constant_pool) + throws IOException + { + this(name_index, length, (ElementValue) null, + constant_pool); + default_value = new ElementValue(file, constant_pool); + } + + /** + * @param annotation_type + * the subclass type of the annotation + * @param name_index + * Index pointing to the name Code + * @param length + * Content length in bytes + * @param defaultValue + * the annotation's default value + * @param constant_pool + * Array of constants + */ + public AnnotationDefault(int name_index, int length, + ElementValue defaultValue, ConstantPool constant_pool) + { + super(Constants.ATTR_ANNOTATION_DEFAULT, name_index, length, constant_pool); + setDefaultValue(defaultValue); + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v + * Visitor object + */ + public void accept(Visitor v) + { + // v.visitAnnotationDefault(this); + } + + /** + * @param defaultValue + * the default value of this methodinfo's annotation + */ + public final void setDefaultValue(ElementValue defaultValue) + { + default_value = defaultValue; + } + + /** + * @return the default value + */ + public final ElementValue getDefaultValue() + { + return default_value; + } + + public Attribute copy(ConstantPool _constant_pool) + { + throw new RuntimeException("Not implemented yet!"); + } +} diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 40b68063..b0963fe8 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -1,90 +1,90 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * represents one annotation in the annotation table - * - * @version $Id: AnnotationEntry - * @author D. Brosius - * @since 5.2 - */ -public class AnnotationEntry implements Node, Constants { - - private int type_index; - private int num_element_value_pairs; - private ElementValuePair[] element_value_pairs; - private ConstantPool constant_pool; - - - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - */ - AnnotationEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { - type_index = (file.readUnsignedShort()); - num_element_value_pairs = (file.readUnsignedShort()); - element_value_pairs = new ElementValuePair[num_element_value_pairs]; - for (int i = 0; i < num_element_value_pairs; i++) { - element_value_pairs[i] = new ElementValuePair(file, constant_pool); - } - this.constant_pool = constant_pool; - } - - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept( Visitor v ) { - // v.visitAnnotationEntry(this); - } - - - /** - * @return the annotation type name - */ - public String getAnnotationType() { - ConstantUtf8 c; - c = (ConstantUtf8) constant_pool.getConstant(type_index, CONSTANT_Utf8); - return c.getBytes(); - } - - - /** - * @return the number of element value pairs in this annotation entry - */ - public final int getNumElementValuePairs() { - return num_element_value_pairs; - } - - - /** - * @return the element value pairs in this annotation entry - */ - public ElementValuePair[] getElementValuePairs() { - return element_value_pairs; - } -} +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; +import org.apache.bcel.Constants; + +/** + * represents one annotation in the annotation table + * + * @version $Id: AnnotationEntry + * @author D. Brosius + * @since 5.2 + */ +public class AnnotationEntry implements Node, Constants { + + private int type_index; + private int num_element_value_pairs; + private ElementValuePair[] element_value_pairs; + private ConstantPool constant_pool; + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + AnnotationEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { + type_index = (file.readUnsignedShort()); + num_element_value_pairs = (file.readUnsignedShort()); + element_value_pairs = new ElementValuePair[num_element_value_pairs]; + for (int i = 0; i < num_element_value_pairs; i++) { + element_value_pairs[i] = new ElementValuePair(file, constant_pool); + } + this.constant_pool = constant_pool; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + // v.visitAnnotationEntry(this); + } + + + /** + * @return the annotation type name + */ + public String getAnnotationType() { + ConstantUtf8 c; + c = (ConstantUtf8) constant_pool.getConstant(type_index, CONSTANT_Utf8); + return c.getBytes(); + } + + + /** + * @return the number of element value pairs in this annotation entry + */ + public final int getNumElementValuePairs() { + return num_element_value_pairs; + } + + + /** + * @return the element value pairs in this annotation entry + */ + public ElementValuePair[] getElementValuePairs() { + return element_value_pairs; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index 2b3ab652..b38fb951 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -1,110 +1,110 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; - -/** - * base class for annotations - * - * @version $Id: Annotations - * @author D. Brosius - * @since 5.2 - */ -public abstract class Annotations extends Attribute { - - private int annotation_table_length; - private AnnotationEntry[] annotation_table; // Table of annotations - - - /** - * @param annotation_type the subclass type of the annotation - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - Annotations(byte annotation_type, int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool); - annotation_table_length = (file.readUnsignedShort()); - annotation_table = new AnnotationEntry[annotation_table_length]; - for (int i = 0; i < annotation_table_length; i++) { - annotation_table[i] = new AnnotationEntry(file, constant_pool); - } - } - - - /** - * @param annotation_type the subclass type of the annotation - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param annotation_table the actual annotations - * @param constant_pool Array of constants - */ - public Annotations(byte annotation_type, int name_index, int length, - AnnotationEntry[] annotation_table, ConstantPool constant_pool) { - super(annotation_type, name_index, length, constant_pool); - setAnnotationTable(annotation_table); - } - - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept( Visitor v ) { - // v.visitAnnotation(this); - } - - - /** - * @param annotation_table the entries to set in this annotation - */ - public final void setAnnotationTable( AnnotationEntry[] annotation_table ) { - this.annotation_table = annotation_table; - annotation_table_length = (annotation_table == null) ? 0 : annotation_table.length; - } - - - /** - * @return the annotation entry table - */ - public final AnnotationEntry[] getAnnotationTable() { - return annotation_table; - } - - - /** - * returns the array of annotation entries in this annotation - */ - public AnnotationEntry[] getAnnotationEntries() { - return annotation_table; - } - - - /** - * @return the number of annotation entries in this annotation - */ - public final int getNumAnnotations() { - return annotation_table_length; - } -} +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +/** + * base class for annotations + * + * @version $Id: Annotations + * @author D. Brosius + * @since 5.2 + */ +public abstract class Annotations extends Attribute { + + private int annotation_table_length; + private AnnotationEntry[] annotation_table; // Table of annotations + + + /** + * @param annotation_type the subclass type of the annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + Annotations(byte annotation_type, int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException { + this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool); + annotation_table_length = (file.readUnsignedShort()); + annotation_table = new AnnotationEntry[annotation_table_length]; + for (int i = 0; i < annotation_table_length; i++) { + annotation_table[i] = new AnnotationEntry(file, constant_pool); + } + } + + + /** + * @param annotation_type the subclass type of the annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param annotation_table the actual annotations + * @param constant_pool Array of constants + */ + public Annotations(byte annotation_type, int name_index, int length, + AnnotationEntry[] annotation_table, ConstantPool constant_pool) { + super(annotation_type, name_index, length, constant_pool); + setAnnotationTable(annotation_table); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitAnnotation(this); + } + + + /** + * @param annotation_table the entries to set in this annotation + */ + public final void setAnnotationTable( AnnotationEntry[] annotation_table ) { + this.annotation_table = annotation_table; + annotation_table_length = (annotation_table == null) ? 0 : annotation_table.length; + } + + + /** + * @return the annotation entry table + */ + public final AnnotationEntry[] getAnnotationTable() { + return annotation_table; + } + + + /** + * returns the array of annotation entries in this annotation + */ + public AnnotationEntry[] getAnnotationEntries() { + return annotation_table; + } + + + /** + * @return the number of annotation entries in this annotation + */ + public final int getNumAnnotations() { + return annotation_table_length; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 7bc634c1..584ef3c9 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -27,252 +27,284 @@ import org.apache.bcel.Constants; /** * Abstract super class for Attribute objects. Currently the * ConstantValue, SourceFile, Code, - * Exceptiontable, LineNumberTable, + * Exceptiontable, LineNumberTable, * LocalVariableTable, InnerClasses and - * Synthetic attributes are supported. The - * Unknown attribute stands for non-standard-attributes. - * + * Synthetic attributes are supported. The Unknown + * attribute stands for non-standard-attributes. + * * @version $Id$ - * @author M. Dahm - * @see ConstantValue - * @see SourceFile - * @see Code - * @see Unknown - * @see ExceptionTable - * @see LineNumberTable - * @see LocalVariableTable - * @see InnerClasses - * @see Synthetic - * @see Deprecated - * @see Signature + * @author M. Dahm + * @see ConstantValue + * @see SourceFile + * @see Code + * @see Unknown + * @see ExceptionTable + * @see LineNumberTable + * @see LocalVariableTable + * @see InnerClasses + * @see Synthetic + * @see Deprecated + * @see Signature */ -public abstract class Attribute implements Cloneable, Node, Serializable { - - protected int name_index; // Points to attribute name in constant pool - protected int length; // Content length of attribute field - protected byte tag; // Tag to distiguish subclasses - protected ConstantPool constant_pool; - - - protected Attribute(byte tag, int name_index, int length, ConstantPool constant_pool) { - this.tag = tag; - this.name_index = name_index; - this.length = length; - this.constant_pool = constant_pool; - } - - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public abstract void accept( Visitor v ); - - - /** - * Dump attribute to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - public void dump( DataOutputStream file ) throws IOException { - file.writeShort(name_index); - file.writeInt(length); - } - - private static Map readers = new HashMap(); - - - /** Add an Attribute reader capable of parsing (user-defined) attributes - * named "name". You should not add readers for the standard attributes - * such as "LineNumberTable", because those are handled internally. - * - * @param name the name of the attribute as stored in the class file - * @param r the reader object - */ - public static void addAttributeReader( String name, AttributeReader r ) { - readers.put(name, r); - } - - - /** Remove attribute reader - * - * @param name the name of the attribute as stored in the class file - */ - public static void removeAttributeReader( String name ) { - readers.remove(name); - } - - - /* Class method reads one attribute from the input data stream. - * This method must not be accessible from the outside. It is - * called by the Field and Method constructor methods. - * - * @see Field - * @see Method - * @param file Input stream - * @param constant_pool Array of constants - * @return Attribute - * @throws IOException - * @throws ClassFormatException - */ - public static final Attribute readAttribute( DataInputStream file, ConstantPool constant_pool ) - throws IOException, ClassFormatException { - ConstantUtf8 c; - String name; - int name_index; - int length; - byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute - // Get class name from constant pool via `name_index' indirection - name_index = file.readUnsignedShort(); - c = (ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8); - name = c.getBytes(); - // Length of data in bytes - length = file.readInt(); - // Compare strings to find known attribute - for (byte i = 0; i < Constants.KNOWN_ATTRIBUTES; i++) { - if (name.equals(Constants.ATTRIBUTE_NAMES[i])) { - tag = i; // found! - break; - } - } - // Call proper constructor, depending on `tag' - switch (tag) { - case Constants.ATTR_UNKNOWN: - AttributeReader r = (AttributeReader) readers.get(name); - if (r != null) { - return r.createAttribute(name_index, length, file, constant_pool); - } - return new Unknown(name_index, length, file, constant_pool); - case Constants.ATTR_CONSTANT_VALUE: - return new ConstantValue(name_index, length, file, constant_pool); - case Constants.ATTR_SOURCE_FILE: - return new SourceFile(name_index, length, file, constant_pool); - case Constants.ATTR_CODE: - return new Code(name_index, length, file, constant_pool); - case Constants.ATTR_EXCEPTIONS: - return new ExceptionTable(name_index, length, file, constant_pool); - case Constants.ATTR_LINE_NUMBER_TABLE: - return new LineNumberTable(name_index, length, file, constant_pool); - case Constants.ATTR_LOCAL_VARIABLE_TABLE: - return new LocalVariableTable(name_index, length, file, constant_pool); - case Constants.ATTR_INNER_CLASSES: - return new InnerClasses(name_index, length, file, constant_pool); - case Constants.ATTR_SYNTHETIC: - return new Synthetic(name_index, length, file, constant_pool); - case Constants.ATTR_DEPRECATED: - return new Deprecated(name_index, length, file, constant_pool); - case Constants.ATTR_PMG: - return new PMGClass(name_index, length, file, constant_pool); - case Constants.ATTR_SIGNATURE: - return new Signature(name_index, length, file, constant_pool); - case Constants.ATTR_STACK_MAP: - return new StackMap(name_index, length, file, constant_pool); - // case Constants.ATTR_RUNTIMEVISIBLE_ANNOTATIONS: - // return new RuntimeVisibleAnnotations(name_index, length, file, constant_pool); - // case Constants.ATTR_RUNTIMEINVISIBLE_ANNOTATIONS: - // return new RuntimeInvisibleAnnotations(name_index, length, file, constant_pool); - // case Constants.ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS: - // return new RuntimeVisibleParameterAnnotations(name_index, length, file, constant_pool); - // case Constants.ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS: - // return new RuntimeInvisibleParameterAnnotations(name_index, length, file, constant_pool); - // case Constants.ATTR_ANNOTATION_DEFAULT: - // return new AnnotationDefault(name_index, length, file, constant_pool); - default: // Never reached - throw new IllegalStateException("Ooops! default case reached."); - } - } - - - /** - * @return Length of attribute field in bytes. - */ - public final int getLength() { - return length; - } - - - /** - * @param length length in bytes. - */ - public final void setLength( int length ) { - this.length = length; - } - - - /** - * @param name_index of attribute. - */ - public final void setNameIndex( int name_index ) { - this.name_index = name_index; - } - - - /** - * @return Name index in constant pool of attribute name. - */ - public final int getNameIndex() { - return name_index; - } - - - /** - * @return Tag of attribute, i.e., its type. Value may not be altered, thus - * there is no setTag() method. - */ - public final byte getTag() { - return tag; - } - - - /** - * @return Constant pool used by this object. - * @see ConstantPool - */ - public final ConstantPool getConstantPool() { - return constant_pool; - } - - - /** - * @param constant_pool Constant pool to be used for this object. - * @see ConstantPool - */ - public final void setConstantPool( ConstantPool constant_pool ) { - this.constant_pool = constant_pool; - } - - - /** - * Use copy() if you want to have a deep copy(), i.e., with all references - * copied correctly. - * - * @return shallow copy of this attribute - */ - public Object clone() { - Object o = null; - try { - o = super.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); // Never occurs - } - return o; - } - - - /** - * @return deep copy of this attribute - */ - public abstract Attribute copy( ConstantPool _constant_pool ); - - - /** - * @return attribute name. - */ - public String toString() { - return Constants.ATTRIBUTE_NAMES[tag]; - } +public abstract class Attribute implements Cloneable, Node, Serializable +{ + protected int name_index; // Points to attribute name in constant pool + + protected int length; // Content length of attribute field + + protected byte tag; // Tag to distiguish subclasses + + protected ConstantPool constant_pool; + + protected Attribute(byte tag, int name_index, int length, + ConstantPool constant_pool) + { + this.tag = tag; + this.name_index = name_index; + this.length = length; + this.constant_pool = constant_pool; + } + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v + * Visitor object + */ + public abstract void accept(Visitor v); + + /** + * Dump attribute to file stream in binary format. + * + * @param file + * Output file stream + * @throws IOException + */ + public void dump(DataOutputStream file) throws IOException + { + file.writeShort(name_index); + file.writeInt(length); + } + + private static Map readers = new HashMap(); + + /** + * Add an Attribute reader capable of parsing (user-defined) attributes + * named "name". You should not add readers for the standard attributes such + * as "LineNumberTable", because those are handled internally. + * + * @param name + * the name of the attribute as stored in the class file + * @param r + * the reader object + */ + public static void addAttributeReader(String name, AttributeReader r) + { + readers.put(name, r); + } + + /** + * Remove attribute reader + * + * @param name + * the name of the attribute as stored in the class file + */ + public static void removeAttributeReader(String name) + { + readers.remove(name); + } + + /* + * Class method reads one attribute from the input data stream. This method + * must not be accessible from the outside. It is called by the Field and + * Method constructor methods. + * + * @see Field + * @see Method @param file Input stream @param constant_pool Array of + * constants @return Attribute @throws IOException @throws + * ClassFormatException + */ + public static final Attribute readAttribute(DataInputStream file, + ConstantPool constant_pool) throws IOException, + ClassFormatException + { + ConstantUtf8 c; + String name; + int name_index; + int length; + byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute + // Get class name from constant pool via `name_index' indirection + name_index = file.readUnsignedShort(); + c = (ConstantUtf8) constant_pool.getConstant(name_index, + Constants.CONSTANT_Utf8); + name = c.getBytes(); + // Length of data in bytes + length = file.readInt(); + // Compare strings to find known attribute + System.out.println(name); + for (byte i = 0; i < Constants.KNOWN_ATTRIBUTES; i++) + { + if (name.equals(Constants.ATTRIBUTE_NAMES[i])) + { + tag = i; // found! + break; + } + } + // Call proper constructor, depending on `tag' + switch (tag) + { + case Constants.ATTR_UNKNOWN: + AttributeReader r = (AttributeReader) readers.get(name); + if (r != null) + { + return r.createAttribute(name_index, length, file, + constant_pool); + } + return new Unknown(name_index, length, file, constant_pool); + case Constants.ATTR_CONSTANT_VALUE: + return new ConstantValue(name_index, length, file, constant_pool); + case Constants.ATTR_SOURCE_FILE: + return new SourceFile(name_index, length, file, constant_pool); + case Constants.ATTR_CODE: + return new Code(name_index, length, file, constant_pool); + case Constants.ATTR_EXCEPTIONS: + return new ExceptionTable(name_index, length, file, constant_pool); + case Constants.ATTR_LINE_NUMBER_TABLE: + return new LineNumberTable(name_index, length, file, constant_pool); + case Constants.ATTR_LOCAL_VARIABLE_TABLE: + return new LocalVariableTable(name_index, length, file, + constant_pool); + case Constants.ATTR_INNER_CLASSES: + return new InnerClasses(name_index, length, file, constant_pool); + case Constants.ATTR_SYNTHETIC: + return new Synthetic(name_index, length, file, constant_pool); + case Constants.ATTR_DEPRECATED: + return new Deprecated(name_index, length, file, constant_pool); + case Constants.ATTR_PMG: + return new PMGClass(name_index, length, file, constant_pool); + case Constants.ATTR_SIGNATURE: + return new Signature(name_index, length, file, constant_pool); + case Constants.ATTR_STACK_MAP: + return new StackMap(name_index, length, file, constant_pool); + case Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS: + return new RuntimeVisibleAnnotations(name_index, length, file, + constant_pool); + case Constants.ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS: + return new RuntimeInvisibleAnnotations(name_index, length, file, + constant_pool); + case Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS: + return new RuntimeVisibleParameterAnnotations(name_index, length, + file, constant_pool); + case Constants.ATTR_RUNTIMEIN_VISIBLE_PARAMETER_ANNOTATIONS: + return new RuntimeInvisibleParameterAnnotations(name_index, length, + file, constant_pool); + case Constants.ATTR_ANNOTATION_DEFAULT: + return new AnnotationDefault(name_index, length, file, + constant_pool); + case Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE: + return new LocalVariableTypeTable(name_index, length, file, + constant_pool); + case Constants.ATTR_ENCLOSING_METHOD: + return new EnclosingMethod(name_index, length, file, constant_pool); + default: // Never reached + throw new IllegalStateException("Ooops! default case reached."); + } + } + + /** + * @return Length of attribute field in bytes. + */ + public final int getLength() + { + return length; + } + + /** + * @param length + * length in bytes. + */ + public final void setLength(int length) + { + this.length = length; + } + + /** + * @param name_index + * of attribute. + */ + public final void setNameIndex(int name_index) + { + this.name_index = name_index; + } + + /** + * @return Name index in constant pool of attribute name. + */ + public final int getNameIndex() + { + return name_index; + } + + /** + * @return Tag of attribute, i.e., its type. Value may not be altered, thus + * there is no setTag() method. + */ + public final byte getTag() + { + return tag; + } + + /** + * @return Constant pool used by this object. + * @see ConstantPool + */ + public final ConstantPool getConstantPool() + { + return constant_pool; + } + + /** + * @param constant_pool + * Constant pool to be used for this object. + * @see ConstantPool + */ + public final void setConstantPool(ConstantPool constant_pool) + { + this.constant_pool = constant_pool; + } + + /** + * Use copy() if you want to have a deep copy(), i.e., with all references + * copied correctly. + * + * @return shallow copy of this attribute + */ + public Object clone() + { + Object o = null; + try + { + o = super.clone(); + } + catch (CloneNotSupportedException e) + { + e.printStackTrace(); // Never occurs + } + return o; + } + + /** + * @return deep copy of this attribute + */ + public abstract Attribute copy(ConstantPool _constant_pool); + + /** + * @return attribute name. + */ + public String toString() + { + return Constants.ATTRIBUTE_NAMES[tag]; + } } diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index 4f80560c..bc73d05c 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -19,356 +19,408 @@ package org.apache.bcel.classfile; import java.util.Stack; /** - * Traverses a JavaClass with another Visitor object 'piggy-backed' - * that is applied to all components of a JavaClass object. I.e. this - * class supplies the traversal strategy, other classes can make use - * of it. - * + * Traverses a JavaClass with another Visitor object 'piggy-backed' that is + * applied to all components of a JavaClass object. I.e. this class supplies the + * traversal strategy, other classes can make use of it. + * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ -public class DescendingVisitor implements Visitor { - - private JavaClass clazz; - private Visitor visitor; - private Stack stack = new Stack(); - - - /** @return container of current entitity, i.e., predecessor during traversal - */ - public Object predecessor() { - return predecessor(0); - } - - - /** - * @param level nesting level, i.e., 0 returns the direct predecessor - * @return container of current entitity, i.e., predecessor during traversal - */ - public Object predecessor( int level ) { - int size = stack.size(); - if ((size < 2) || (level < 0)) { - return null; - } else { - return stack.elementAt(size - (level + 2)); // size - 1 == current - } - } - - - /** @return current object - */ - public Object current() { - return stack.peek(); - } - - - /** - * @param clazz Class to traverse - * @param visitor visitor object to apply to all components - */ - public DescendingVisitor(JavaClass clazz, Visitor visitor) { - this.clazz = clazz; - this.visitor = visitor; - } - - - /** - * Start traversal. - */ - public void visit() { - clazz.accept(this); - } - - - public void visitJavaClass( JavaClass _clazz ) { - stack.push(_clazz); - _clazz.accept(visitor); - Field[] fields = _clazz.getFields(); - for (int i = 0; i < fields.length; i++) { - fields[i].accept(this); - } - Method[] methods = _clazz.getMethods(); - for (int i = 0; i < methods.length; i++) { - methods[i].accept(this); - } - Attribute[] attributes = _clazz.getAttributes(); - for (int i = 0; i < attributes.length; i++) { - attributes[i].accept(this); - } - _clazz.getConstantPool().accept(this); - stack.pop(); - } - - - public void visitAnnotation( Annotations annotation ) { - stack.push(annotation); - annotation.accept(visitor); - AnnotationEntry[] entries = annotation.getAnnotationEntries(); - for (int i = 0; i < entries.length; i++) { - entries[i].accept(this); - } - stack.pop(); - } - - - public void visitAnnotationEntry( AnnotationEntry annotationEntry ) { - stack.push(annotationEntry); - annotationEntry.accept(visitor); - stack.pop(); - } - - - public void visitField( Field field ) { - stack.push(field); - field.accept(visitor); - Attribute[] attributes = field.getAttributes(); - for (int i = 0; i < attributes.length; i++) { - attributes[i].accept(this); - } - stack.pop(); - } - - - public void visitConstantValue( ConstantValue cv ) { - stack.push(cv); - cv.accept(visitor); - stack.pop(); - } - - - public void visitMethod( Method method ) { - stack.push(method); - method.accept(visitor); - Attribute[] attributes = method.getAttributes(); - for (int i = 0; i < attributes.length; i++) { - attributes[i].accept(this); - } - stack.pop(); - } - - - public void visitExceptionTable( ExceptionTable table ) { - stack.push(table); - table.accept(visitor); - stack.pop(); - } - - - public void visitCode( Code code ) { - stack.push(code); - code.accept(visitor); - CodeException[] table = code.getExceptionTable(); - for (int i = 0; i < table.length; i++) { - table[i].accept(this); - } - Attribute[] attributes = code.getAttributes(); - for (int i = 0; i < attributes.length; i++) { - attributes[i].accept(this); - } - stack.pop(); - } - - - public void visitCodeException( CodeException ce ) { - stack.push(ce); - ce.accept(visitor); - stack.pop(); - } - - - public void visitLineNumberTable( LineNumberTable table ) { - stack.push(table); - table.accept(visitor); - LineNumber[] numbers = table.getLineNumberTable(); - for (int i = 0; i < numbers.length; i++) { - numbers[i].accept(this); - } - stack.pop(); - } - - - public void visitLineNumber( LineNumber number ) { - stack.push(number); - number.accept(visitor); - stack.pop(); - } - - - public void visitLocalVariableTable( LocalVariableTable table ) { - stack.push(table); - table.accept(visitor); - LocalVariable[] vars = table.getLocalVariableTable(); - for (int i = 0; i < vars.length; i++) { - vars[i].accept(this); - } - stack.pop(); - } - - - public void visitStackMap( StackMap table ) { - stack.push(table); - table.accept(visitor); - StackMapEntry[] vars = table.getStackMap(); - for (int i = 0; i < vars.length; i++) { - vars[i].accept(this); - } - stack.pop(); - } - - - public void visitStackMapEntry( StackMapEntry var ) { - stack.push(var); - var.accept(visitor); - stack.pop(); - } - - - public void visitLocalVariable( LocalVariable var ) { - stack.push(var); - var.accept(visitor); - stack.pop(); - } - - - public void visitConstantPool( ConstantPool cp ) { - stack.push(cp); - cp.accept(visitor); - Constant[] constants = cp.getConstantPool(); - for (int i = 1; i < constants.length; i++) { - if (constants[i] != null) { - constants[i].accept(this); - } - } - stack.pop(); - } - - - public void visitConstantClass( ConstantClass constant ) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - - public void visitConstantDouble( ConstantDouble constant ) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - - public void visitConstantFieldref( ConstantFieldref constant ) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - - public void visitConstantFloat( ConstantFloat constant ) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - - public void visitConstantInteger( ConstantInteger constant ) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - - public void visitConstantInterfaceMethodref( ConstantInterfaceMethodref constant ) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - - public void visitConstantLong( ConstantLong constant ) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - - public void visitConstantMethodref( ConstantMethodref constant ) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - - public void visitConstantNameAndType( ConstantNameAndType constant ) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - - public void visitConstantString( ConstantString constant ) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - - public void visitConstantUtf8( ConstantUtf8 constant ) { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - - public void visitInnerClasses( InnerClasses ic ) { - stack.push(ic); - ic.accept(visitor); - InnerClass[] ics = ic.getInnerClasses(); - for (int i = 0; i < ics.length; i++) { - ics[i].accept(this); - } - stack.pop(); - } - - - public void visitInnerClass( InnerClass inner ) { - stack.push(inner); - inner.accept(visitor); - stack.pop(); - } - - - public void visitDeprecated( Deprecated attribute ) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - - public void visitSignature( Signature attribute ) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - - public void visitSourceFile( SourceFile attribute ) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - - public void visitSynthetic( Synthetic attribute ) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - - public void visitUnknown( Unknown attribute ) { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } +public class DescendingVisitor implements Visitor +{ + private JavaClass clazz; + + private Visitor visitor; + + private Stack stack = new Stack(); + + /** + * @return container of current entitity, i.e., predecessor during traversal + */ + public Object predecessor() + { + return predecessor(0); + } + + /** + * @param level + * nesting level, i.e., 0 returns the direct predecessor + * @return container of current entitity, i.e., predecessor during traversal + */ + public Object predecessor(int level) + { + int size = stack.size(); + if ((size < 2) || (level < 0)) + { + return null; + } + else + { + return stack.elementAt(size - (level + 2)); // size - 1 == current + } + } + + /** + * @return current object + */ + public Object current() + { + return stack.peek(); + } + + /** + * @param clazz + * Class to traverse + * @param visitor + * visitor object to apply to all components + */ + public DescendingVisitor(JavaClass clazz, Visitor visitor) + { + this.clazz = clazz; + this.visitor = visitor; + } + + /** + * Start traversal. + */ + public void visit() + { + clazz.accept(this); + } + + public void visitJavaClass(JavaClass _clazz) + { + stack.push(_clazz); + _clazz.accept(visitor); + Field[] fields = _clazz.getFields(); + for (int i = 0; i < fields.length; i++) + { + fields[i].accept(this); + } + Method[] methods = _clazz.getMethods(); + for (int i = 0; i < methods.length; i++) + { + methods[i].accept(this); + } + Attribute[] attributes = _clazz.getAttributes(); + for (int i = 0; i < attributes.length; i++) + { + attributes[i].accept(this); + } + _clazz.getConstantPool().accept(this); + stack.pop(); + } + + public void visitAnnotation(Annotations annotation) + { + stack.push(annotation); + annotation.accept(visitor); + AnnotationEntry[] entries = annotation.getAnnotationEntries(); + for (int i = 0; i < entries.length; i++) + { + entries[i].accept(this); + } + stack.pop(); + } + + public void visitAnnotationEntry(AnnotationEntry annotationEntry) + { + stack.push(annotationEntry); + annotationEntry.accept(visitor); + stack.pop(); + } + + public void visitField(Field field) + { + stack.push(field); + field.accept(visitor); + Attribute[] attributes = field.getAttributes(); + for (int i = 0; i < attributes.length; i++) + { + attributes[i].accept(this); + } + stack.pop(); + } + + public void visitConstantValue(ConstantValue cv) + { + stack.push(cv); + cv.accept(visitor); + stack.pop(); + } + + public void visitMethod(Method method) + { + stack.push(method); + method.accept(visitor); + Attribute[] attributes = method.getAttributes(); + for (int i = 0; i < attributes.length; i++) + { + attributes[i].accept(this); + } + stack.pop(); + } + + public void visitExceptionTable(ExceptionTable table) + { + stack.push(table); + table.accept(visitor); + stack.pop(); + } + + public void visitCode(Code code) + { + stack.push(code); + code.accept(visitor); + CodeException[] table = code.getExceptionTable(); + for (int i = 0; i < table.length; i++) + { + table[i].accept(this); + } + Attribute[] attributes = code.getAttributes(); + for (int i = 0; i < attributes.length; i++) + { + attributes[i].accept(this); + } + stack.pop(); + } + + public void visitCodeException(CodeException ce) + { + stack.push(ce); + ce.accept(visitor); + stack.pop(); + } + + public void visitLineNumberTable(LineNumberTable table) + { + stack.push(table); + table.accept(visitor); + LineNumber[] numbers = table.getLineNumberTable(); + for (int i = 0; i < numbers.length; i++) + { + numbers[i].accept(this); + } + stack.pop(); + } + + public void visitLineNumber(LineNumber number) + { + stack.push(number); + number.accept(visitor); + stack.pop(); + } + + public void visitLocalVariableTable(LocalVariableTable table) + { + stack.push(table); + table.accept(visitor); + LocalVariable[] vars = table.getLocalVariableTable(); + for (int i = 0; i < vars.length; i++) + { + vars[i].accept(this); + } + stack.pop(); + } + + public void visitStackMap(StackMap table) + { + stack.push(table); + table.accept(visitor); + StackMapEntry[] vars = table.getStackMap(); + for (int i = 0; i < vars.length; i++) + { + vars[i].accept(this); + } + stack.pop(); + } + + public void visitStackMapEntry(StackMapEntry var) + { + stack.push(var); + var.accept(visitor); + stack.pop(); + } + + public void visitLocalVariable(LocalVariable var) + { + stack.push(var); + var.accept(visitor); + stack.pop(); + } + + public void visitConstantPool(ConstantPool cp) + { + stack.push(cp); + cp.accept(visitor); + Constant[] constants = cp.getConstantPool(); + for (int i = 1; i < constants.length; i++) + { + if (constants[i] != null) + { + constants[i].accept(this); + } + } + stack.pop(); + } + + public void visitConstantClass(ConstantClass constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantDouble(ConstantDouble constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantFieldref(ConstantFieldref constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantFloat(ConstantFloat constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantInteger(ConstantInteger constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantInterfaceMethodref( + ConstantInterfaceMethodref constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantLong(ConstantLong constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantMethodref(ConstantMethodref constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantNameAndType(ConstantNameAndType constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantString(ConstantString constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantUtf8(ConstantUtf8 constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitInnerClasses(InnerClasses ic) + { + stack.push(ic); + ic.accept(visitor); + InnerClass[] ics = ic.getInnerClasses(); + for (int i = 0; i < ics.length; i++) + { + ics[i].accept(this); + } + stack.pop(); + } + + public void visitInnerClass(InnerClass inner) + { + stack.push(inner); + inner.accept(visitor); + stack.pop(); + } + + public void visitDeprecated(Deprecated attribute) + { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitSignature(Signature attribute) + { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitSourceFile(SourceFile attribute) + { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitSynthetic(Synthetic attribute) + { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitUnknown(Unknown attribute) + { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitAnnotationDefault(AnnotationDefault obj) + { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } + + public void visitEnclosingMethod(EnclosingMethod obj) + { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } + + public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) + { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } + + public void visitParameterAnnotation(ParameterAnnotations obj) + { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } } diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index 4cda0883..7deb1362 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -1,83 +1,83 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; - -/** - * an ElementValuePair's element value. This class will be broken out into - * different subclasses. This is a temporary implementation. - * - * @version $Id: ElementValue - * @author D. Brosius - * @since 5.2 - */ -public class ElementValue { - - private byte tag; - private int const_value_index; - private int type_name_index; - private int const_name_index; - private int class_info_index; - private AnnotationEntry annotation; - private int num_values; - private ElementValue[] values; - - - /** - * Construct object from file stream. - * @param file Input stream - * @param constant_pool the constant pool - * @throws IOException - */ - ElementValue(DataInputStream file, ConstantPool constant_pool) throws IOException { - tag = (file.readByte()); - switch (tag) { - case 'B': - case 'C': - case 'D': - case 'F': - case 'I': - case 'J': - case 'S': - case 'Z': - case 's': - const_value_index = (file.readUnsignedShort()); - break; - case 'e': - type_name_index = (file.readUnsignedShort()); - const_name_index = (file.readUnsignedShort()); - break; - case 'c': - class_info_index = (file.readUnsignedShort()); - break; - case '@': - annotation = new AnnotationEntry(file, constant_pool); - break; - case '[': - num_values = (file.readUnsignedShort()); - values = new ElementValue[num_values]; - for (int i = 0; i < num_values; i++) { - values[i] = new ElementValue(file, constant_pool); - } - break; - default: - throw new IOException("Invalid ElementValue tag: " + tag); - } - } -} +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +/** + * an ElementValuePair's element value. This class will be broken out into + * different subclasses. This is a temporary implementation. + * + * @version $Id: ElementValue + * @author D. Brosius + * @since 5.2 + */ +public class ElementValue { + + private byte tag; + private int const_value_index; + private int type_name_index; + private int const_name_index; + private int class_info_index; + private AnnotationEntry annotation; + private int num_values; + private ElementValue[] values; + + + /** + * Construct object from file stream. + * @param file Input stream + * @param constant_pool the constant pool + * @throws IOException + */ + ElementValue(DataInputStream file, ConstantPool constant_pool) throws IOException { + tag = (file.readByte()); + switch (tag) { + case 'B': + case 'C': + case 'D': + case 'F': + case 'I': + case 'J': + case 'S': + case 'Z': + case 's': + const_value_index = (file.readUnsignedShort()); + break; + case 'e': + type_name_index = (file.readUnsignedShort()); + const_name_index = (file.readUnsignedShort()); + break; + case 'c': + class_info_index = (file.readUnsignedShort()); + break; + case '@': + annotation = new AnnotationEntry(file, constant_pool); + break; + case '[': + num_values = (file.readUnsignedShort()); + values = new ElementValue[num_values]; + for (int i = 0; i < num_values; i++) { + values[i] = new ElementValue(file, constant_pool); + } + break; + default: + throw new IOException("Invalid ElementValue tag: " + tag); + } + } +} diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index 95d4777d..a5e05ac5 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -1,45 +1,45 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; - -/** - * an annotation's element value pair - * - * @version $Id: ElementValuePair - * @author D. Brosius - * @since 5.2 - */ -public class ElementValuePair { - - private int element_name_index; - private ElementValue value; - - - /** - * Construct object from file stream. - * @param file Input stream - * @param constant_pool the constant pool - * @throws IOException - */ - ElementValuePair(DataInputStream file, ConstantPool constant_pool) throws IOException { - element_name_index = (file.readUnsignedShort()); - value = new ElementValue(file, constant_pool); - } -} +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +/** + * an annotation's element value pair + * + * @version $Id: ElementValuePair + * @author D. Brosius + * @since 5.2 + */ +public class ElementValuePair { + + private int element_name_index; + private ElementValue value; + + + /** + * Construct object from file stream. + * @param file Input stream + * @param constant_pool the constant pool + * @throws IOException + */ + ElementValuePair(DataInputStream file, ConstantPool constant_pool) throws IOException { + element_name_index = (file.readUnsignedShort()); + value = new ElementValue(file, constant_pool); + } +} diff --git a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java index 6291e628..edc8be27 100644 --- a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -17,161 +17,167 @@ package org.apache.bcel.classfile; /** - * Visitor with empty method bodies, can be extended and used in conjunction with the - * DescendingVisitor class, e.g. - * - * By courtesy of David Spencer. - * + * Visitor with empty method bodies, can be extended and used in conjunction + * with the DescendingVisitor class, e.g. By courtesy of David Spencer. + * * @see DescendingVisitor * @version $Id$ - * */ -public class EmptyVisitor implements Visitor { - - protected EmptyVisitor() { - } - - - public void visitAnnotation( Annotations obj ) { - } - - - public void visitParameterAnnotation( ParameterAnnotations obj ) { - } - - - public void visitAnnotationEntry( AnnotationEntry obj ) { - } - - - public void visitAnnotationDefault( AnnotationDefault obj ) { - } - - - public void visitCode( Code obj ) { - } - - - public void visitCodeException( CodeException obj ) { - } - - - public void visitConstantClass( ConstantClass obj ) { - } - - - public void visitConstantDouble( ConstantDouble obj ) { - } - - - public void visitConstantFieldref( ConstantFieldref obj ) { - } - - - public void visitConstantFloat( ConstantFloat obj ) { - } - - - public void visitConstantInteger( ConstantInteger obj ) { - } - - - public void visitConstantInterfaceMethodref( ConstantInterfaceMethodref obj ) { - } - - - public void visitConstantLong( ConstantLong obj ) { - } - - - public void visitConstantMethodref( ConstantMethodref obj ) { - } - - - public void visitConstantNameAndType( ConstantNameAndType obj ) { - } - - - public void visitConstantPool( ConstantPool obj ) { - } - - - public void visitConstantString( ConstantString obj ) { - } - - - public void visitConstantUtf8( ConstantUtf8 obj ) { - } - - - public void visitConstantValue( ConstantValue obj ) { - } - - - public void visitDeprecated( Deprecated obj ) { - } - - - public void visitExceptionTable( ExceptionTable obj ) { - } - - - public void visitField( Field obj ) { - } - - - public void visitInnerClass( InnerClass obj ) { - } +public class EmptyVisitor implements Visitor +{ + protected EmptyVisitor() + { + } + public void visitAnnotation(Annotations obj) + { + } - public void visitInnerClasses( InnerClasses obj ) { - } + public void visitParameterAnnotation(ParameterAnnotations obj) + { + } + public void visitAnnotationEntry(AnnotationEntry obj) + { + } - public void visitJavaClass( JavaClass obj ) { - } + public void visitAnnotationDefault(AnnotationDefault obj) + { + } + public void visitCode(Code obj) + { + } - public void visitLineNumber( LineNumber obj ) { - } + public void visitCodeException(CodeException obj) + { + } + public void visitConstantClass(ConstantClass obj) + { + } - public void visitLineNumberTable( LineNumberTable obj ) { - } + public void visitConstantDouble(ConstantDouble obj) + { + } + public void visitConstantFieldref(ConstantFieldref obj) + { + } - public void visitLocalVariable( LocalVariable obj ) { - } + public void visitConstantFloat(ConstantFloat obj) + { + } + public void visitConstantInteger(ConstantInteger obj) + { + } - public void visitLocalVariableTable( LocalVariableTable obj ) { - } + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) + { + } + public void visitConstantLong(ConstantLong obj) + { + } + + public void visitConstantMethodref(ConstantMethodref obj) + { + } + + public void visitConstantNameAndType(ConstantNameAndType obj) + { + } + + public void visitConstantPool(ConstantPool obj) + { + } + + public void visitConstantString(ConstantString obj) + { + } + + public void visitConstantUtf8(ConstantUtf8 obj) + { + } + + public void visitConstantValue(ConstantValue obj) + { + } + + public void visitDeprecated(Deprecated obj) + { + } + + public void visitExceptionTable(ExceptionTable obj) + { + } + + public void visitField(Field obj) + { + } + + public void visitInnerClass(InnerClass obj) + { + } + + public void visitInnerClasses(InnerClasses obj) + { + } + + public void visitJavaClass(JavaClass obj) + { + } - public void visitMethod( Method obj ) { - } + public void visitLineNumber(LineNumber obj) + { + } + public void visitLineNumberTable(LineNumberTable obj) + { + } - public void visitSignature( Signature obj ) { - } + public void visitLocalVariable(LocalVariable obj) + { + } + public void visitLocalVariableTable(LocalVariableTable obj) + { + } - public void visitSourceFile( SourceFile obj ) { - } + public void visitMethod(Method obj) + { + } + public void visitSignature(Signature obj) + { + } - public void visitSynthetic( Synthetic obj ) { - } + public void visitSourceFile(SourceFile obj) + { + } + public void visitSynthetic(Synthetic obj) + { + } - public void visitUnknown( Unknown obj ) { - } + public void visitUnknown(Unknown obj) + { + } + public void visitStackMap(StackMap obj) + { + } - public void visitStackMap( StackMap obj ) { - } + public void visitStackMapEntry(StackMapEntry obj) + { + } + public void visitEnclosingMethod(EnclosingMethod obj) + { + } - public void visitStackMapEntry( StackMapEntry obj ) { - } + public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) + { + } } diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java new file mode 100755 index 00000000..bab8c96b --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -0,0 +1,87 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation + * + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Common Public License v1.0 + * which accompanies this distribution and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Andy Clement initial implementation + * ******************************************************************/ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * This attribute exists for local or + * anonymous classes and ... there can be only one. + */ +public class EnclosingMethod extends Attribute { + + // Pointer to the CONSTANT_Class_info structure representing the + // innermost class that encloses the declaration of the current class. + private int classIndex; + + // If the current class is not immediately enclosed by a method or + // constructor, then the value of the method_index item must be zero. + // Otherwise, the value of the method_index item must point to a + // CONSTANT_NameAndType_info structure representing the name and the + // type of a method in the class referenced by the class we point + // to in the class_index. *It is the compiler responsibility* to + // ensure that the method identified by this index is the closest + // lexically enclosing method that includes the local/anonymous class. + private int methodIndex; + + // Ctors - and code to read an attribute in. + public EnclosingMethod(int nameIndex, int len, DataInputStream dis, ConstantPool cpool) throws IOException { + this(nameIndex, len, dis.readUnsignedShort(), dis.readUnsignedShort(), cpool); + } + + private EnclosingMethod(int nameIndex, int len, int classIdx,int methodIdx, ConstantPool cpool) { + super(Constants.ATTR_ENCLOSING_METHOD, nameIndex, len, cpool); + classIndex = classIdx; + methodIndex = methodIdx; + } + + public void accept(Visitor v) { + v.visitEnclosingMethod(this); + } + + public Attribute copy(ConstantPool constant_pool) { + throw new RuntimeException("Not implemented yet!"); + // is this next line sufficient? + // return (EnclosingMethod)clone(); + } + + // Accessors + public final int getEnclosingClassIndex() { return classIndex; } + public final int getEnclosingMethodIndex(){ return methodIndex;} + + public final void setEnclosingClassIndex(int idx) {classIndex = idx;} + public final void setEnclosingMethodIndex(int idx){methodIndex= idx;} + + public final ConstantClass getEnclosingClass() { + ConstantClass c = + (ConstantClass)constant_pool.getConstant(classIndex,Constants.CONSTANT_Class); + return c; + } + + public final ConstantNameAndType getEnclosingMethod() { + if (methodIndex == 0) return null; + ConstantNameAndType nat = + (ConstantNameAndType)constant_pool.getConstant(methodIndex,Constants.CONSTANT_NameAndType); + return nat; + } + + public final void dump(DataOutputStream file) throws IOException { + super.dump(file); + file.writeShort(classIndex); + file.writeShort(methodIndex); + } +} diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java new file mode 100755 index 00000000..d68fc6af --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -0,0 +1,135 @@ +/* ******************************************************************* + * Copyright (c) 2004 IBM Corporation + * + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Common Public License v1.0 + * which accompanies this distribution and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Andy Clement initial implementation + * Heavily based on LocalVariableTable + * ******************************************************************/ +package org.apache.bcel.classfile; + + +import org.apache.bcel.Constants; +import java.io.*; + +// The new table is used when generic types are about... + +//LocalVariableTable_attribute { +// u2 attribute_name_index; +// u4 attribute_length; +// u2 local_variable_table_length; +// { u2 start_pc; +// u2 length; +// u2 name_index; +// u2 descriptor_index; +// u2 index; +// } local_variable_table[local_variable_table_length]; +// } + +//LocalVariableTypeTable_attribute { +// u2 attribute_name_index; +// u4 attribute_length; +// u2 local_variable_type_table_length; +// { +// u2 start_pc; +// u2 length; +// u2 name_index; +// u2 signature_index; +// u2 index; +// } local_variable_type_table[local_variable_type_table_length]; +// } +// J5TODO: Needs some testing ! +public class LocalVariableTypeTable extends Attribute { + private int local_variable_type_table_length; // Table of local + private LocalVariable[] local_variable_type_table; // variables + + public LocalVariableTypeTable(LocalVariableTypeTable c) { + this(c.getNameIndex(), c.getLength(), c.getLocalVariableTypeTable(), + c.getConstantPool()); + } + + public LocalVariableTypeTable(int name_index, int length, + LocalVariable[] local_variable_table, + ConstantPool constant_pool) + { + super(Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE, name_index, length, constant_pool); + setLocalVariableTable(local_variable_table); + } + + LocalVariableTypeTable(int nameIdx, int len, DataInputStream dis,ConstantPool cpool) throws IOException { + this(nameIdx, len, (LocalVariable[])null, cpool); + + local_variable_type_table_length = (dis.readUnsignedShort()); + local_variable_type_table = new LocalVariable[local_variable_type_table_length]; + + for(int i=0; i < local_variable_type_table_length; i++) + local_variable_type_table[i] = new LocalVariable(dis, cpool); + } + + public void accept(Visitor v) { + v.visitLocalVariableTypeTable(this); + } + + public final void dump(DataOutputStream file) throws IOException + { + super.dump(file); + file.writeShort(local_variable_type_table_length); + for(int i=0; i < local_variable_type_table_length; i++) + local_variable_type_table[i].dump(file); + } + + public final LocalVariable[] getLocalVariableTypeTable() { + return local_variable_type_table; + } + + public final LocalVariable getLocalVariable(int index) { + for(int i=0; i < local_variable_type_table_length; i++) + if(local_variable_type_table[i].getIndex() == index) + return local_variable_type_table[i]; + + return null; + } + + public final void setLocalVariableTable(LocalVariable[] local_variable_table) + { + this.local_variable_type_table = local_variable_table; + local_variable_type_table_length = (local_variable_table == null)? 0 : + local_variable_table.length; + } + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer(""); + + for(int i=0; i < local_variable_type_table_length; i++) { + buf.append(local_variable_type_table[i].toString()); + + if(i < local_variable_type_table_length - 1) buf.append('\n'); + } + + return buf.toString(); + } + + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) { + LocalVariableTypeTable c = (LocalVariableTypeTable)clone(); + + c.local_variable_type_table = new LocalVariable[local_variable_type_table_length]; + for(int i=0; i < local_variable_type_table_length; i++) + c.local_variable_type_table[i] = local_variable_type_table[i].copy(); + + c.constant_pool = constant_pool; + return c; + } + + public final int getTableLength() { return local_variable_type_table_length; } +} diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index cd6d71ca..bb2d817c 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -1,76 +1,76 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * represents one parameter annotation in the parameter annotation table - * - * @version $Id: ParameterAnnotationEntry - * @author D. Brosius - * @since 5.2 - */ -public class ParameterAnnotationEntry implements Node, Constants { - - private int annotation_table_length; - private AnnotationEntry[] annotation_table; - - - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - */ - ParameterAnnotationEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { - annotation_table_length = (file.readUnsignedShort()); - annotation_table = new AnnotationEntry[annotation_table_length]; - for (int i = 0; i < annotation_table_length; i++) { - annotation_table[i] = new AnnotationEntry(file, constant_pool); - } - } - - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept( Visitor v ) { - // v.visitParameterAnnotationEntry(this); - } - - - /** - * @return the number of annotation entries in this parameter annotation - */ - public final int getNumAnnotations() { - return annotation_table_length; - } - - - /** - * returns the array of annotation entries in this annotation - */ - public AnnotationEntry[] getAnnotationEntries() { - return annotation_table; - } -} +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; +import org.apache.bcel.Constants; + +/** + * represents one parameter annotation in the parameter annotation table + * + * @version $Id: ParameterAnnotationEntry + * @author D. Brosius + * @since 5.2 + */ +public class ParameterAnnotationEntry implements Node, Constants { + + private int annotation_table_length; + private AnnotationEntry[] annotation_table; + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + ParameterAnnotationEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { + annotation_table_length = (file.readUnsignedShort()); + annotation_table = new AnnotationEntry[annotation_table_length]; + for (int i = 0; i < annotation_table_length; i++) { + annotation_table[i] = new AnnotationEntry(file, constant_pool); + } + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + // v.visitParameterAnnotationEntry(this); + } + + + /** + * @return the number of annotation entries in this parameter annotation + */ + public final int getNumAnnotations() { + return annotation_table_length; + } + + + /** + * returns the array of annotation entries in this annotation + */ + public AnnotationEntry[] getAnnotationEntries() { + return annotation_table; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index fea23b34..365bd3c1 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -1,114 +1,114 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; - -/** - * base class for parameter annotations - * - * @version $Id: ParameterAnnotations - * @author D. Brosius - * @since 5.2 - */ -public abstract class ParameterAnnotations extends Attribute { - - private int num_parameters; - private ParameterAnnotationEntry[] parameter_annotation_table; // Table of parameter annotations - - - /** - * @param parameter_annotation_type the subclass type of the parameter annotation - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, - DataInputStream file, ConstantPool constant_pool) throws IOException { - this(parameter_annotation_type, name_index, length, (ParameterAnnotationEntry[]) null, - constant_pool); - num_parameters = (file.readUnsignedByte()); - parameter_annotation_table = new ParameterAnnotationEntry[num_parameters]; - for (int i = 0; i < num_parameters; i++) { - parameter_annotation_table[i] = new ParameterAnnotationEntry(file, constant_pool); - } - } - - - /** - * @param parameter_annotation_type the subclass type of the parameter annotation - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param parameter_annotation_table the actual parameter annotations - * @param constant_pool Array of constants - */ - public ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, - ParameterAnnotationEntry[] parameter_annotation_table, ConstantPool constant_pool) { - super(parameter_annotation_type, name_index, length, constant_pool); - setParameterAnnotationTable(parameter_annotation_table); - } - - - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v Visitor object - */ - public void accept( Visitor v ) { - // v.visitParameterAnnotation(this); - } - - - /** - * @param parameter_annotation_table the entries to set in this parameter annotation - */ - public final void setParameterAnnotationTable( - ParameterAnnotationEntry[] parameter_annotation_table ) { - this.parameter_annotation_table = parameter_annotation_table; - num_parameters = (parameter_annotation_table == null) - ? 0 - : parameter_annotation_table.length; - } - - - /** - * @return the parameter annotation entry table - */ - public final ParameterAnnotationEntry[] getParameterAnnotationTable() { - return parameter_annotation_table; - } - - - /** - * returns the array of parameter annotation entries in this parameter annotation - */ - public ParameterAnnotationEntry[] getParameterAnnotationEntries() { - return parameter_annotation_table; - } - - - /** - * @return the number of parameter annotation entries in this parameter annotation - */ - public final int getNumParameterAnnotation() { - return num_parameters; - } -} +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; + +/** + * base class for parameter annotations + * + * @version $Id: ParameterAnnotations + * @author D. Brosius + * @since 5.2 + */ +public abstract class ParameterAnnotations extends Attribute { + + private int num_parameters; + private ParameterAnnotationEntry[] parameter_annotation_table; // Table of parameter annotations + + + /** + * @param parameter_annotation_type the subclass type of the parameter annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, + DataInputStream file, ConstantPool constant_pool) throws IOException { + this(parameter_annotation_type, name_index, length, (ParameterAnnotationEntry[]) null, + constant_pool); + num_parameters = (file.readUnsignedByte()); + parameter_annotation_table = new ParameterAnnotationEntry[num_parameters]; + for (int i = 0; i < num_parameters; i++) { + parameter_annotation_table[i] = new ParameterAnnotationEntry(file, constant_pool); + } + } + + + /** + * @param parameter_annotation_type the subclass type of the parameter annotation + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param parameter_annotation_table the actual parameter annotations + * @param constant_pool Array of constants + */ + public ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, + ParameterAnnotationEntry[] parameter_annotation_table, ConstantPool constant_pool) { + super(parameter_annotation_type, name_index, length, constant_pool); + setParameterAnnotationTable(parameter_annotation_table); + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + // v.visitParameterAnnotation(this); + } + + + /** + * @param parameter_annotation_table the entries to set in this parameter annotation + */ + public final void setParameterAnnotationTable( + ParameterAnnotationEntry[] parameter_annotation_table ) { + this.parameter_annotation_table = parameter_annotation_table; + num_parameters = (parameter_annotation_table == null) + ? 0 + : parameter_annotation_table.length; + } + + + /** + * @return the parameter annotation entry table + */ + public final ParameterAnnotationEntry[] getParameterAnnotationTable() { + return parameter_annotation_table; + } + + + /** + * returns the array of parameter annotation entries in this parameter annotation + */ + public ParameterAnnotationEntry[] getParameterAnnotationEntries() { + return parameter_annotation_table; + } + + + /** + * @return the number of parameter annotation entries in this parameter annotation + */ + public final int getNumParameterAnnotation() { + return num_parameters; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index d0a4bbe1..b547eff2 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -1,52 +1,52 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * represents an annotation that is represented in the class file - * but is not provided to the JVM. - * - * @version $Id: RuntimeInvisibleAnnotations - * @author D. Brosius - * @since 5.2 - */ -public class RuntimeInvisibleAnnotations extends Annotations { - - /** - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - RuntimeInvisibleAnnotations(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIMEINVISIBLE_ANNOTATIONS, name_index, length, file, constant_pool); - } - - - /** - * @return deep copy of this attribute - */ - public Attribute copy( ConstantPool constant_pool ) { - Annotations c = (Annotations) clone(); - return c; - } -} +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; +import org.apache.bcel.Constants; + +/** + * represents an annotation that is represented in the class file + * but is not provided to the JVM. + * + * @version $Id: RuntimeInvisibleAnnotations + * @author D. Brosius + * @since 5.2 + */ +public class RuntimeInvisibleAnnotations extends Annotations { + + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + RuntimeInvisibleAnnotations(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException { + super(Constants.ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS, name_index, length, file, constant_pool); + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool constant_pool ) { + Annotations c = (Annotations) clone(); + return c; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 8efb6843..86f0c37e 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -1,53 +1,53 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * represents a parameter annotation that is represented in the class file - * but is not provided to the JVM. - * - * @version $Id: RuntimeInvisibleParameterAnnotations - * @author D. Brosius - * @since 5.2 - */ -public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { - - /** - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, - constant_pool); - } - - - /** - * @return deep copy of this attribute - */ - public Attribute copy( ConstantPool constant_pool ) { - Annotations c = (Annotations) clone(); - return c; - } -} +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; +import org.apache.bcel.Constants; + +/** + * represents a parameter annotation that is represented in the class file + * but is not provided to the JVM. + * + * @version $Id: RuntimeInvisibleParameterAnnotations + * @author D. Brosius + * @since 5.2 + */ +public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { + + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException { + super(Constants.ATTR_RUNTIMEIN_VISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, + constant_pool); + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool constant_pool ) { + Annotations c = (Annotations) clone(); + return c; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index c25ba3d8..d8a3f7ba 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -1,52 +1,52 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * represents an annotation that is represented in the class file - * and is provided to the JVM. - * - * @version $Id: RuntimeVisibleAnnotations - * @author D. Brosius - * @since 5.2 - */ -public class RuntimeVisibleAnnotations extends Annotations { - - /** - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - RuntimeVisibleAnnotations(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIMEVISIBLE_ANNOTATIONS, name_index, length, file, constant_pool); - } - - - /** - * @return deep copy of this attribute - */ - public Attribute copy( ConstantPool constant_pool ) { - Annotations c = (Annotations) clone(); - return c; - } -} +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; +import org.apache.bcel.Constants; + +/** + * represents an annotation that is represented in the class file + * and is provided to the JVM. + * + * @version $Id: RuntimeVisibleAnnotations + * @author D. Brosius + * @since 5.2 + */ +public class RuntimeVisibleAnnotations extends Annotations { + + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + RuntimeVisibleAnnotations(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException { + super(Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS, name_index, length, file, constant_pool); + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool constant_pool ) { + Annotations c = (Annotations) clone(); + return c; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index ed0616f7..a24b6729 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -1,53 +1,53 @@ -/* - * Copyright 2000-2004 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.classfile; - -import java.io.DataInputStream; -import java.io.IOException; -import org.apache.bcel.Constants; - -/** - * represents a parameter annotation that is represented in the class file - * and is provided to the JVM. - * - * @version $Id: RuntimeVisibleParameterAnnotations - * @author D. Brosius - * @since 5.2 - */ -public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { - - /** - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - RuntimeVisibleParameterAnnotations(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, - constant_pool); - } - - - /** - * @return deep copy of this attribute - */ - public Attribute copy( ConstantPool constant_pool ) { - Annotations c = (Annotations) clone(); - return c; - } -} +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.IOException; +import org.apache.bcel.Constants; + +/** + * represents a parameter annotation that is represented in the class file + * and is provided to the JVM. + * + * @version $Id: RuntimeVisibleParameterAnnotations + * @author D. Brosius + * @since 5.2 + */ +public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { + + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + */ + RuntimeVisibleParameterAnnotations(int name_index, int length, DataInputStream file, + ConstantPool constant_pool) throws IOException { + super(Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, + constant_pool); + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool constant_pool ) { + Annotations c = (Annotations) clone(); + return c; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java index 23bd6366..0e8eeb91 100644 --- a/src/main/java/org/apache/bcel/classfile/Visitor.java +++ b/src/main/java/org/apache/bcel/classfile/Visitor.java @@ -17,111 +17,88 @@ package org.apache.bcel.classfile; /** - * Interface to make use of the Visitor pattern programming style. - * I.e. a class that implements this interface can traverse the contents of - * a Java class just by calling the `accept' method which all classes have. - * + * Interface to make use of the Visitor pattern programming style. I.e. a class + * that implements this interface can traverse the contents of a Java class just + * by calling the `accept' method which all classes have. + * * @version $Id$ - * @author M. Dahm + * @author M. Dahm */ -public interface Visitor { - - //public void visitAnnotation(Annotations obj); - //public void visitParameterAnnotation(ParameterAnnotations obj); - //public void visitAnnotationEntry(AnnotationEntry obj); - //public void visitAnnotationDefault(AnnotationDefault obj); - public void visitCode( Code obj ); - - - public void visitCodeException( CodeException obj ); - - - public void visitConstantClass( ConstantClass obj ); - - - public void visitConstantDouble( ConstantDouble obj ); - - - public void visitConstantFieldref( ConstantFieldref obj ); - - - public void visitConstantFloat( ConstantFloat obj ); - - - public void visitConstantInteger( ConstantInteger obj ); - - - public void visitConstantInterfaceMethodref( ConstantInterfaceMethodref obj ); - - - public void visitConstantLong( ConstantLong obj ); - - - public void visitConstantMethodref( ConstantMethodref obj ); - - - public void visitConstantNameAndType( ConstantNameAndType obj ); - - - public void visitConstantPool( ConstantPool obj ); - - - public void visitConstantString( ConstantString obj ); - +public interface Visitor +{ + public void visitCode(Code obj); - public void visitConstantUtf8( ConstantUtf8 obj ); + public void visitCodeException(CodeException obj); + public void visitConstantClass(ConstantClass obj); - public void visitConstantValue( ConstantValue obj ); + public void visitConstantDouble(ConstantDouble obj); + public void visitConstantFieldref(ConstantFieldref obj); - public void visitDeprecated( Deprecated obj ); + public void visitConstantFloat(ConstantFloat obj); + public void visitConstantInteger(ConstantInteger obj); - public void visitExceptionTable( ExceptionTable obj ); + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj); + public void visitConstantLong(ConstantLong obj); - public void visitField( Field obj ); + public void visitConstantMethodref(ConstantMethodref obj); + public void visitConstantNameAndType(ConstantNameAndType obj); - public void visitInnerClass( InnerClass obj ); + public void visitConstantPool(ConstantPool obj); + public void visitConstantString(ConstantString obj); - public void visitInnerClasses( InnerClasses obj ); + public void visitConstantUtf8(ConstantUtf8 obj); + public void visitConstantValue(ConstantValue obj); - public void visitJavaClass( JavaClass obj ); + public void visitDeprecated(Deprecated obj); + public void visitExceptionTable(ExceptionTable obj); - public void visitLineNumber( LineNumber obj ); + public void visitField(Field obj); + public void visitInnerClass(InnerClass obj); - public void visitLineNumberTable( LineNumberTable obj ); + public void visitInnerClasses(InnerClasses obj); + public void visitJavaClass(JavaClass obj); - public void visitLocalVariable( LocalVariable obj ); + public void visitLineNumber(LineNumber obj); + public void visitLineNumberTable(LineNumberTable obj); - public void visitLocalVariableTable( LocalVariableTable obj ); + public void visitLocalVariable(LocalVariable obj); + public void visitLocalVariableTable(LocalVariableTable obj); - public void visitMethod( Method obj ); + public void visitMethod(Method obj); + public void visitSignature(Signature obj); - public void visitSignature( Signature obj ); + public void visitSourceFile(SourceFile obj); + public void visitSynthetic(Synthetic obj); - public void visitSourceFile( SourceFile obj ); + public void visitUnknown(Unknown obj); + public void visitStackMap(StackMap obj); - public void visitSynthetic( Synthetic obj ); + public void visitStackMapEntry(StackMapEntry obj); + public void visitAnnotation(Annotations obj); - public void visitUnknown( Unknown obj ); + public void visitParameterAnnotation(ParameterAnnotations obj); + public void visitAnnotationEntry(AnnotationEntry obj); - public void visitStackMap( StackMap obj ); + public void visitAnnotationDefault(AnnotationDefault obj); + public void visitLocalVariableTypeTable(LocalVariableTypeTable obj); - public void visitStackMapEntry( StackMapEntry obj ); + public void visitEnclosingMethod(EnclosingMethod obj); } diff --git a/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java new file mode 100755 index 00000000..72aa92ad --- /dev/null +++ b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java @@ -0,0 +1,31 @@ +package org.apache.bcel; + +import junit.framework.TestCase; +import org.apache.bcel.classfile.DescendingVisitor; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.visitors.CounterVisitor; + +public abstract class AbstractCounterVisitorTestCase extends TestCase +{ + protected abstract JavaClass getTestClass() throws ClassNotFoundException; + + private CounterVisitor visitor = null; + + public void setUp() throws ClassNotFoundException + { + visitor = new CounterVisitor(); + new DescendingVisitor(getTestClass(), getVisitor()).visit(); + } + + public CounterVisitor getVisitor() + { + if (visitor == null) + visitor = new CounterVisitor(); + return visitor; + } + + public void setVisitor(CounterVisitor visitor) + { + this.visitor = visitor; + } +} diff --git a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java new file mode 100755 index 00000000..d171bdf3 --- /dev/null +++ b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java @@ -0,0 +1,266 @@ +package org.apache.bcel; + +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.util.ClassPath; +import org.apache.bcel.util.SyntheticRepository; + +public class CounterVisitorTestCase extends AbstractCounterVisitorTestCase +{ + protected JavaClass getTestClass() throws ClassNotFoundException + { + JavaClass javaClass = SyntheticRepository.getInstance( + new ClassPath( + "file://F:/GSoC/Dmitriy/bcel-j5/target/test-classes/")) + .loadClass("org.apache.bcel.data.package-info"); + System.out.println(javaClass.isAbstract()); + return javaClass; + } + + public void testAnnotationsCount() + { + System.out + .println("AnnotationsCount = " + getVisitor().annotationCount); + assertTrue(getVisitor().annotationCount == 2); + } + + public void testAnnotationDefaultCount() + { + System.out.println("AnnotationDefaultCount = " + + getVisitor().annotationDefaultCount); + assertTrue(getVisitor().annotationDefaultCount == 0); + } + + public void testAnnotationEntryCount() + { + System.out.println("AnnotationEntryCount = " + + getVisitor().annotationEntryCount); + assertTrue(getVisitor().annotationEntryCount == 0); + } + + public void testCodeCount() + { + System.out.println("CodeCount = " + getVisitor().codeCount); + assertTrue(getVisitor().codeCount == 1); + } + + public void testCodeExceptionCount() + { + System.out.println("CodeExceptionCount = " + + getVisitor().codeExceptionCount); + assertTrue(getVisitor().codeExceptionCount == 0); + } + + public void testConstantClassCount() + { + System.out.println("ConstantClassCount = " + + getVisitor().constantClassCount); + assertTrue(getVisitor().constantClassCount == 2); + } + + public void testConstantDoubleCount() + { + System.out.println("ConstantDoubleCount = " + + getVisitor().constantDoubleCount); + assertTrue(getVisitor().constantDoubleCount == 0); + } + + public void testConstantFieldrefCount() + { + System.out.println("ConstantFieldrefCount = " + + getVisitor().constantFieldrefCount); + assertTrue(getVisitor().constantFieldrefCount == 0); + } + + public void testConstantFloatCount() + { + System.out.println("ConstantFloatCount = " + + getVisitor().constantFloatCount); + assertTrue(getVisitor().constantFloatCount == 0); + } + + public void testConstantIntegerCount() + { + System.out.println("ConstantIntegerCount = " + + getVisitor().constantIntegerCount); + assertTrue(getVisitor().constantIntegerCount == 0); + } + + public void testConstantInterfaceMethodrefCount() + { + System.out.println("ConstantInterfaceMethodrefCount = " + + getVisitor().constantInterfaceMethodrefCount); + assertTrue(getVisitor().constantInterfaceMethodrefCount == 0); + } + + public void testConstantLongCount() + { + System.out.println("ConstantLongCount = " + + getVisitor().constantLongCount); + assertTrue(getVisitor().constantLongCount == 0); + } + + public void testConstantMethodrefCount() + { + System.out.println("ConstantMethodrefCount = " + + getVisitor().constantMethodrefCount); + assertTrue(getVisitor().constantMethodrefCount == 1); + } + + public void testConstantNameAndTypeCount() + { + System.out.println("ConstantNameAndTypeCount = " + + getVisitor().constantNameAndTypeCount); + assertTrue(getVisitor().constantNameAndTypeCount == 1); + } + + public void testConstantPoolCount() + { + System.out.println("ConstantPoolCount = " + + getVisitor().constantPoolCount); + assertTrue(getVisitor().constantPoolCount == 1); + } + + public void testConstantStringCount() + { + System.out.println("ConstantStringCount = " + + getVisitor().constantStringCount); + assertTrue(getVisitor().constantStringCount == 0); + } + + public void testConstantValueCount() + { + System.out.println("ConstantValueCount = " + + getVisitor().constantValueCount); + assertTrue(getVisitor().constantValueCount == 0); + } + + public void testDeprecatedCount() + { + System.out.println("DeprecatedCount = " + getVisitor().deprecatedCount); + assertTrue(getVisitor().deprecatedCount == 0); + } + + public void testEnclosingMethodCount() + { + System.out.println("EnclosingMethodCount = " + + getVisitor().enclosingMethodCount); + assertTrue(getVisitor().enclosingMethodCount == 0); + } + + public void testExceptionTableCount() + { + System.out.println("ExceptionTableCount = " + + getVisitor().exceptionTableCount); + assertTrue(getVisitor().exceptionTableCount == 0); + } + + public void testFieldCount() + { + System.out.println("FieldCount = " + getVisitor().fieldCount); + assertTrue(getVisitor().fieldCount == 0); + } + + public void testInnerClassCount() + { + System.out.println("InnerClassCount = " + getVisitor().innerClassCount); + assertTrue(getVisitor().innerClassCount == 0); + } + + public void testInnerClassesCount() + { + System.out.println("InnerClassesCount = " + + getVisitor().innerClassesCount); + assertTrue(getVisitor().innerClassesCount == 0); + } + + public void testJavaClassCount() + { + System.out.println("JavaClassCount = " + getVisitor().javaClassCount); + assertTrue(getVisitor().javaClassCount == 1); + } + + public void testLineNumberCount() + { + System.out.println("LineNumberCount = " + getVisitor().lineNumberCount); + assertTrue(getVisitor().lineNumberCount == 1); + } + + public void testLineNumberTableCount() + { + System.out.println("LineNumberTableCount = " + + getVisitor().lineNumberTableCount); + assertTrue(getVisitor().lineNumberTableCount == 1); + } + + public void testLocalVariableCount() + { + System.out.println("LocalVariableCount = " + + getVisitor().localVariableCount); + assertTrue(getVisitor().localVariableCount == 1); + } + + public void testLocalVariableTableCount() + { + System.out.println("LocalVariableTableCount = " + + getVisitor().localVariableTableCount); + assertTrue(getVisitor().localVariableTableCount == 1); + } + + public void testLocalVariableTypeTableCount() + { + System.out.println("LocalVariableTypeTableCount = " + + getVisitor().localVariableTypeTableCount); + assertTrue(getVisitor().localVariableTypeTableCount == 0); + } + + public void testMethodCount() + { + System.out.println("MethodCount = " + getVisitor().methodCount); + assertTrue(getVisitor().methodCount == 1); + } + + public void testParameterAnnotationCount() + { + System.out.println("ParameterAnnotationCount = " + + getVisitor().methodCount); + assertTrue(getVisitor().methodCount == 1); + } + + public void testSignatureCount() + { + System.out.println("SignatureCount = " + + getVisitor().signatureAnnotationCount); + assertTrue(getVisitor().signatureAnnotationCount == 0); + } + + public void testSourceFileCount() + { + System.out.println("SourceFileCount = " + getVisitor().sourceFileCount); + assertTrue(getVisitor().sourceFileCount == 1); + } + + public void testStackMapCount() + { + System.out.println("StackMapCount = " + getVisitor().stackMapCount); + assertTrue(getVisitor().stackMapCount == 0); + } + + public void testStackMapEntryCount() + { + System.out.println("StackMapEntryCount = " + + getVisitor().stackMapEntryCount); + assertTrue(getVisitor().stackMapEntryCount == 0); + } + + public void testSyntheticCount() + { + System.out.println("SyntheticCount = " + getVisitor().syntheticCount); + assertTrue(getVisitor().syntheticCount == 0); + } + + public void testUnknownCount() + { + System.out.println("UnknownCount = " + getVisitor().unknownCount); + assertTrue(getVisitor().unknownCount == 0); + } +} \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/data/MarkedType.java b/src/test/java/org/apache/bcel/data/MarkedType.java new file mode 100755 index 00000000..52e0357e --- /dev/null +++ b/src/test/java/org/apache/bcel/data/MarkedType.java @@ -0,0 +1,48 @@ +package org.apache.bcel.data; + +@MarkerAnnotationInvisible +@MarkerAnnotation +@SimpleAnnotation(id = 1) +public abstract class MarkedType +{ + @MarkerAnnotationInvisible + @MarkerAnnotation + class InnerClass + { + } + + @MarkerAnnotationInvisible + @MarkerAnnotation + int annotatedField; + + @Deprecated + void deprecatedMthod() + { + } + + native void nativeMthod(); + + abstract void abstractMethod(); + + @MarkerAnnotationInvisible + @MarkerAnnotation + void annotatedMethod() + { + } + + void annotatedParamentrMethod(@MarkerAnnotationInvisible + @MarkerAnnotation + int i) + { + } + + void constantedMethod() + { + int i1 = 1; + int i2 = 200000; + long l1 = 1; + long l2 = 200000; + float f = 0.1F; + String s = ""; + } +} diff --git a/src/test/java/org/apache/bcel/data/MarkerAnnotation.java b/src/test/java/org/apache/bcel/data/MarkerAnnotation.java new file mode 100755 index 00000000..331d1c3d --- /dev/null +++ b/src/test/java/org/apache/bcel/data/MarkerAnnotation.java @@ -0,0 +1,10 @@ +package org.apache.bcel.data; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface MarkerAnnotation +{ + String value() default ""; +} diff --git a/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java b/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java new file mode 100755 index 00000000..8496c103 --- /dev/null +++ b/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java @@ -0,0 +1,9 @@ +package org.apache.bcel.data; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.CLASS) +public @interface MarkerAnnotationInvisible +{ +} diff --git a/src/test/java/org/apache/bcel/data/SimpleAnnotation.java b/src/test/java/org/apache/bcel/data/SimpleAnnotation.java new file mode 100755 index 00000000..065ff0eb --- /dev/null +++ b/src/test/java/org/apache/bcel/data/SimpleAnnotation.java @@ -0,0 +1,10 @@ +package org.apache.bcel.data; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface SimpleAnnotation { + int id(); + String fruit() default "bananas"; +} diff --git a/src/test/java/org/apache/bcel/data/package-info.java b/src/test/java/org/apache/bcel/data/package-info.java new file mode 100755 index 00000000..4d6ffff8 --- /dev/null +++ b/src/test/java/org/apache/bcel/data/package-info.java @@ -0,0 +1,4 @@ +@MarkerAnnotationInvisible +@MarkerAnnotation +@SimpleAnnotation(id = 1) +package org.apache.bcel.data; \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java new file mode 100755 index 00000000..1abe79d1 --- /dev/null +++ b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java @@ -0,0 +1,310 @@ +package org.apache.bcel.visitors; + +import org.apache.bcel.classfile.AnnotationDefault; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Annotations; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Deprecated; +import org.apache.bcel.classfile.EnclosingMethod; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.InnerClass; +import org.apache.bcel.classfile.InnerClasses; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.LocalVariableTypeTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.ParameterAnnotations; +import org.apache.bcel.classfile.Signature; +import org.apache.bcel.classfile.SourceFile; +import org.apache.bcel.classfile.StackMap; +import org.apache.bcel.classfile.StackMapEntry; +import org.apache.bcel.classfile.Synthetic; +import org.apache.bcel.classfile.Unknown; +import org.apache.bcel.classfile.Visitor; + +public class CounterVisitor implements Visitor +{ + public int unknownCount = 0; + + public int syntheticCount = 0; + + public int stackMapEntryCount = 0; + + public int stackMapCount = 0; + + public int sourceFileCount = 0; + + public int signatureAnnotationCount = 0; + + public int parameterAnnotationCount = 0; + + public int methodCount = 0; + + public int localVariableTypeTableCount = 0; + + public int localVariableTableCount = 0; + + public int localVariableCount = 0; + + public int lineNumberTableCount = 0; + + public int lineNumberCount = 0; + + public int javaClassCount = 0; + + public int innerClassesCount = 0; + + public int innerClassCount = 0; + + public int fieldCount = 0; + + public int exceptionTableCount = 0; + + public int enclosingMethodCount = 0; + + public int deprecatedCount = 0; + + public int constantValueCount = 0; + + public int constantUtf8Count = 0; + + public int constantStringCount = 0; + + public int constantNameAndTypeCount = 0; + + public int constantPoolCount = 0; + + public int constantMethodrefCount = 0; + + public int constantLongCount = 0; + + public int constantIntegerCount = 0; + + public int constantInterfaceMethodrefCount = 0; + + public int constantFloatCount = 0; + + public int constantFieldrefCount = 0; + + public int constantClassCount = 0; + + public int constantDoubleCount = 0; + + public int codeExceptionCount = 0; + + public int codeCount = 0; + + public int annotationEntryCount = 0; + + public int annotationDefaultCount = 0; + + public int annotationCount = 0; + + public void visitAnnotation(Annotations obj) + { + annotationCount++; + } + + public void visitAnnotationDefault(AnnotationDefault obj) + { + annotationDefaultCount++; + } + + public void visitAnnotationEntry(AnnotationEntry obj) + { + annotationEntryCount++; + } + + public void visitCode(Code obj) + { + codeCount++; + } + + public void visitCodeException(CodeException obj) + { + codeExceptionCount++; + } + + public void visitConstantClass(ConstantClass obj) + { + constantClassCount++; + } + + public void visitConstantDouble(ConstantDouble obj) + { + constantDoubleCount++; + } + + public void visitConstantFieldref(ConstantFieldref obj) + { + constantFieldrefCount++; + } + + public void visitConstantFloat(ConstantFloat obj) + { + constantFloatCount++; + } + + public void visitConstantInteger(ConstantInteger obj) + { + constantIntegerCount++; + } + + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) + { + constantInterfaceMethodrefCount++; + } + + public void visitConstantLong(ConstantLong obj) + { + constantLongCount++; + } + + public void visitConstantMethodref(ConstantMethodref obj) + { + constantMethodrefCount++; + } + + public void visitConstantNameAndType(ConstantNameAndType obj) + { + constantNameAndTypeCount++; + } + + public void visitConstantPool(ConstantPool obj) + { + constantPoolCount++; + } + + public void visitConstantString(ConstantString obj) + { + constantStringCount++; + } + + public void visitConstantUtf8(ConstantUtf8 obj) + { + constantUtf8Count++; + } + + public void visitConstantValue(ConstantValue obj) + { + constantValueCount++; + } + + public void visitDeprecated(Deprecated obj) + { + deprecatedCount++; + } + + public void visitEnclosingMethod(EnclosingMethod obj) + { + enclosingMethodCount++; + } + + public void visitExceptionTable(ExceptionTable obj) + { + exceptionTableCount++; + } + + public void visitField(Field obj) + { + fieldCount++; + } + + public void visitInnerClass(InnerClass obj) + { + innerClassCount++; + } + + public void visitInnerClasses(InnerClasses obj) + { + innerClassesCount++; + } + + public void visitJavaClass(JavaClass obj) + { + javaClassCount++; + } + + public void visitLineNumber(LineNumber obj) + { + lineNumberCount++; + } + + public void visitLineNumberTable(LineNumberTable obj) + { + lineNumberTableCount++; + } + + public void visitLocalVariable(LocalVariable obj) + { + localVariableCount++; + } + + public void visitLocalVariableTable(LocalVariableTable obj) + { + localVariableTableCount++; + } + + public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) + { + localVariableTypeTableCount++; + } + + public void visitMethod(Method obj) + { + methodCount++; + } + + public void visitParameterAnnotation(ParameterAnnotations obj) + { + parameterAnnotationCount++; + } + + public void visitSignature(Signature obj) + { + signatureAnnotationCount++; + } + + public void visitSourceFile(SourceFile obj) + { + sourceFileCount++; + } + + public void visitStackMap(StackMap obj) + { + stackMapCount++; + } + + public void visitStackMapEntry(StackMapEntry obj) + { + stackMapEntryCount++; + } + + public void visitSynthetic(Synthetic obj) + { + syntheticCount++; + } + + public void visitUnknown(Unknown obj) + { + unknownCount++; + } +} -- GitLab From 7ca3d8ec6278548833e5ce6d41ae2040b1d41f7a Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Wed, 14 Jun 2006 10:55:10 +0000 Subject: [PATCH 0347/1313] GSoC: more testcases, annotation support by Dmitriy Khayredinov git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@414190 13f79535-47bb-0310-9956-ffa450edef68 --- .classpath | 7 - .project | 17 -- .settings/org.eclipse.jdt.core.prefs | 12 - .settings/org.eclipse.jdt.ui.prefs | 3 - .../bcel/classfile/AnnotationDefault.java | 2 +- .../classfile/AnnotationElementValue.java | 43 ++++ .../bcel/classfile/AnnotationEntry.java | 7 + .../bcel/classfile/ArrayElementValue.java | 67 ++++++ .../org/apache/bcel/classfile/Attribute.java | 13 +- .../bcel/classfile/ClassElementValue.java | 44 ++++ .../apache/bcel/classfile/ElementValue.java | 175 ++++++++++----- .../bcel/classfile/ElementValuePair.java | 2 +- .../bcel/classfile/EnumElementValue.java | 62 ++++++ .../bcel/classfile/SimpleElementValue.java | 209 ++++++++++++++++++ .../apache/bcel/generic/AnnotationGen.java | 5 + .../bcel/generic/ElementNameValuePairGen.java | 5 + .../apache/bcel/generic/ElementValueGen.java | 164 ++++++++++++++ .../bcel/generic/SimpleElementValueGen.java | 5 + .../bcel/AbstractCounterVisitorTestCase.java | 3 +- .../org/apache/bcel/AbstractTestCase.java | 48 ++++ .../bcel/AnnotationAccessFlagTestCase.java | 23 ++ .../AnnotationDefaultAttributeTestCase.java | 28 +++ .../apache/bcel/AnnotationGenTestCase.java | 162 ++++++++++++++ .../apache/bcel/CounterVisitorTestCase.java | 141 ++++++------ .../java/org/apache/bcel/data/MarkedType.java | 48 ---- .../apache/bcel/data/MarkerAnnotation.java | 10 - .../bcel/data/MarkerAnnotationInvisible.java | 9 - .../apache/bcel/data/SimpleAnnotation.java | 11 +- .../org/apache/bcel/data/SimpleClass.java | 9 + .../java/org/apache/bcel/data/SimpleEnum.java | 3 + .../org/apache/bcel/data/package-info.java | 4 - 31 files changed, 1093 insertions(+), 248 deletions(-) delete mode 100644 .classpath delete mode 100644 .project delete mode 100644 .settings/org.eclipse.jdt.core.prefs delete mode 100644 .settings/org.eclipse.jdt.ui.prefs create mode 100644 src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java create mode 100644 src/main/java/org/apache/bcel/classfile/ArrayElementValue.java create mode 100644 src/main/java/org/apache/bcel/classfile/ClassElementValue.java create mode 100644 src/main/java/org/apache/bcel/classfile/EnumElementValue.java create mode 100644 src/main/java/org/apache/bcel/classfile/SimpleElementValue.java create mode 100644 src/main/java/org/apache/bcel/generic/AnnotationGen.java create mode 100644 src/main/java/org/apache/bcel/generic/ElementNameValuePairGen.java create mode 100644 src/main/java/org/apache/bcel/generic/ElementValueGen.java create mode 100644 src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java create mode 100644 src/test/java/org/apache/bcel/AbstractTestCase.java create mode 100644 src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java create mode 100644 src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java create mode 100644 src/test/java/org/apache/bcel/AnnotationGenTestCase.java create mode 100644 src/test/java/org/apache/bcel/data/SimpleClass.java create mode 100644 src/test/java/org/apache/bcel/data/SimpleEnum.java diff --git a/.classpath b/.classpath deleted file mode 100644 index ee95bfdb..00000000 --- a/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/.project b/.project deleted file mode 100644 index 0edf1682..00000000 --- a/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - jakarta-bcel - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 23ba23d0..00000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -#Tue Jan 24 00:19:24 EST 2006 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.4 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning -org.eclipse.jdt.core.compiler.source=1.3 diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index cf051a11..00000000 --- a/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,3 +0,0 @@ -#Sat Dec 24 12:26:49 CET 2005 -eclipse.preferences.version=1 -internal.default.compliance=default diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index 96194846..50a3fd42 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -49,7 +49,7 @@ public class AnnotationDefault extends Attribute { this(name_index, length, (ElementValue) null, constant_pool); - default_value = new ElementValue(file, constant_pool); + default_value = ElementValue.readElementValue(file, constant_pool); } /** diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java new file mode 100644 index 00000000..361d5ea9 --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java @@ -0,0 +1,43 @@ +package org.apache.bcel.classfile; + +import java.io.DataOutputStream; +import java.io.IOException; + +public class AnnotationElementValue extends ElementValue +{ + // For annotation element values, this is the annotation + private AnnotationEntry annotationEntry; + + public AnnotationElementValue(int type, AnnotationEntry annotationEntry, + ConstantPool cpool) + { + super(type, cpool); + if (type != ANNOTATION) + throw new RuntimeException( + "Only element values of type annotation can be built with this ctor"); + this.annotationEntry = annotationEntry; + } + + public void dump(DataOutputStream dos) throws IOException + { + dos.writeByte(type); // u1 type of value (ANNOTATION == '@') + annotationEntry.dump(dos); + } + + public String stringifyValue() + { + StringBuffer sb = new StringBuffer(); + sb.append(annotationEntry.toString()); + return sb.toString(); + } + + public String toString() + { + return stringifyValue(); + } + + public AnnotationEntry getAnnotationEntry() + { + return annotationEntry; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index b0963fe8..c8ee3eac 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -17,6 +17,7 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -87,4 +88,10 @@ public class AnnotationEntry implements Node, Constants { public ElementValuePair[] getElementValuePairs() { return element_value_pairs; } + + + public void dump(DataOutputStream dos) + { + // TODO Auto-generated method stub + } } diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java new file mode 100644 index 00000000..f018d3d8 --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -0,0 +1,67 @@ +package org.apache.bcel.classfile; + +import java.io.DataOutputStream; +import java.io.IOException; + +public class ArrayElementValue extends ElementValue +{ + // For array types, this is the array + private ElementValue[] evalues; + + public String toString() + { + StringBuffer sb = new StringBuffer(); + sb.append("{"); + for (int i = 0; i < evalues.length; i++) + { + sb.append(evalues[i].toString()); + if ((i + 1) < evalues.length) + sb.append(","); + } + sb.append("}"); + return sb.toString(); + } + + public ArrayElementValue(int type, ElementValue[] datums, ConstantPool cpool) + { + super(type, cpool); + if (type != ARRAY) + throw new RuntimeException( + "Only element values of type array can be built with this ctor"); + this.evalues = datums; + } + + public void dump(DataOutputStream dos) throws IOException + { + dos.writeByte(type); // u1 type of value (ARRAY == '[') + dos.writeShort(evalues.length); + for (int i = 0; i < evalues.length; i++) + { + evalues[i].dump(dos); + } + } + + public String stringifyValue() + { + StringBuffer sb = new StringBuffer(); + sb.append("["); + for (int i = 0; i < evalues.length; i++) + { + sb.append(evalues[i].stringifyValue()); + if ((i + 1) < evalues.length) + sb.append(","); + } + sb.append("]"); + return sb.toString(); + } + + public ElementValue[] getElementValuesArray() + { + return evalues; + } + + public int getElementValuesArraySize() + { + return evalues.length; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 584ef3c9..c4395281 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -23,6 +23,7 @@ import java.io.Serializable; import java.util.HashMap; import java.util.Map; import org.apache.bcel.Constants; +import org.apache.bcel.classfile.ConstantUtf8; /** * Abstract super class for Attribute objects. Currently the @@ -143,7 +144,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable // Length of data in bytes length = file.readInt(); // Compare strings to find known attribute - System.out.println(name); + // System.out.println(name); for (byte i = 0; i < Constants.KNOWN_ATTRIBUTES; i++) { if (name.equals(Constants.ATTRIBUTE_NAMES[i])) @@ -213,6 +214,16 @@ public abstract class Attribute implements Cloneable, Node, Serializable } } + /** + * @return Name of attribute + */ + public String getName() + { + ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + /** * @return Length of attribute field in bytes. */ diff --git a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java new file mode 100644 index 00000000..ffc999d0 --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java @@ -0,0 +1,44 @@ +package org.apache.bcel.classfile; + +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; + +public class ClassElementValue extends ElementValue +{ + // For primitive types and string type, this points to the value entry in + // the cpool + // For 'class' this points to the class entry in the cpool + private int idx; + + public ClassElementValue(int type, int idx, ConstantPool cpool) + { + super(type, cpool); + this.idx = idx; + } + + public int getIndex() + { + return idx; + } + + public String getClassString() + { + ConstantUtf8 c = (ConstantUtf8) cpool.getConstant(idx, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + public String stringifyValue() + { + ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(idx, + Constants.CONSTANT_Utf8); + return cu8.getBytes(); + } + + public void dump(DataOutputStream dos) throws IOException + { + dos.writeByte(type); // u1 kind of value + dos.writeShort(idx); + } +} diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index 7deb1362..6550eb62 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -17,67 +17,128 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; /** - * an ElementValuePair's element value. This class will be broken out into - * different subclasses. This is a temporary implementation. - * * @version $Id: ElementValue - * @author D. Brosius + * @author D. Brosius * @since 5.2 */ -public class ElementValue { - - private byte tag; - private int const_value_index; - private int type_name_index; - private int const_name_index; - private int class_info_index; - private AnnotationEntry annotation; - private int num_values; - private ElementValue[] values; - - - /** - * Construct object from file stream. - * @param file Input stream - * @param constant_pool the constant pool - * @throws IOException - */ - ElementValue(DataInputStream file, ConstantPool constant_pool) throws IOException { - tag = (file.readByte()); - switch (tag) { - case 'B': - case 'C': - case 'D': - case 'F': - case 'I': - case 'J': - case 'S': - case 'Z': - case 's': - const_value_index = (file.readUnsignedShort()); - break; - case 'e': - type_name_index = (file.readUnsignedShort()); - const_name_index = (file.readUnsignedShort()); - break; - case 'c': - class_info_index = (file.readUnsignedShort()); - break; - case '@': - annotation = new AnnotationEntry(file, constant_pool); - break; - case '[': - num_values = (file.readUnsignedShort()); - values = new ElementValue[num_values]; - for (int i = 0; i < num_values; i++) { - values[i] = new ElementValue(file, constant_pool); - } - break; - default: - throw new IOException("Invalid ElementValue tag: " + tag); - } - } +public abstract class ElementValue +{ + protected int type; + + protected ConstantPool cpool; + + public String toString() + { + return stringifyValue(); + } + + protected ElementValue(int type, ConstantPool cpool) + { + this.type = type; + this.cpool = cpool; + } + + public int getElementValueType() + { + return type; + } + + public abstract String stringifyValue(); + + public abstract void dump(DataOutputStream dos) throws IOException; + + public static final int STRING = 's'; + + public static final int ENUM_CONSTANT = 'e'; + + public static final int CLASS = 'c'; + + public static final int ANNOTATION = '@'; + + public static final int ARRAY = '['; + + public static final int PRIMITIVE_INT = 'I'; + + public static final int PRIMITIVE_BYTE = 'B'; + + public static final int PRIMITIVE_CHAR = 'C'; + + public static final int PRIMITIVE_DOUBLE = 'D'; + + public static final int PRIMITIVE_FLOAT = 'F'; + + public static final int PRIMITIVE_LONG = 'J'; + + public static final int PRIMITIVE_SHORT = 'S'; + + public static final int PRIMITIVE_BOOLEAN = 'Z'; + + public static ElementValue readElementValue(DataInputStream dis, + ConstantPool cpool) throws IOException + { + byte type = dis.readByte(); + switch (type) + { + case 'B': // byte + return new SimpleElementValue(PRIMITIVE_BYTE, dis + .readUnsignedShort(), cpool); + case 'C': // char + return new SimpleElementValue(PRIMITIVE_CHAR, dis + .readUnsignedShort(), cpool); + case 'D': // double + return new SimpleElementValue(PRIMITIVE_DOUBLE, dis + .readUnsignedShort(), cpool); + case 'F': // float + return new SimpleElementValue(PRIMITIVE_FLOAT, dis + .readUnsignedShort(), cpool); + case 'I': // int + return new SimpleElementValue(PRIMITIVE_INT, dis + .readUnsignedShort(), cpool); + case 'J': // long + return new SimpleElementValue(PRIMITIVE_LONG, dis + .readUnsignedShort(), cpool); + case 'S': // short + return new SimpleElementValue(PRIMITIVE_SHORT, dis + .readUnsignedShort(), cpool); + case 'Z': // boolean + return new SimpleElementValue(PRIMITIVE_BOOLEAN, dis + .readUnsignedShort(), cpool); + case 's': // String + return new SimpleElementValue(STRING, dis.readUnsignedShort(), + cpool); + case 'e': // Enum constant + return new EnumElementValue(ENUM_CONSTANT, dis.readUnsignedShort(), + dis.readUnsignedShort(), cpool); + case 'c': // Class + return new ClassElementValue(CLASS, dis.readUnsignedShort(), cpool); + case '@': // Annotation + return new AnnotationElementValue(ANNOTATION, new AnnotationEntry( + dis, cpool), cpool); + case '[': // Array + int numArrayVals = dis.readUnsignedShort(); + List arrayVals = new ArrayList(); + ElementValue[] evalues = new ElementValue[numArrayVals]; + for (int j = 0; j < numArrayVals; j++) + { + evalues[j] = ElementValue.readElementValue(dis, cpool); + } + return new ArrayElementValue(ARRAY, evalues, cpool); + default: + throw new RuntimeException( + "Unexpected element value kind in annotation: " + type); + } + } + + public String toShortString() + { + StringBuffer result = new StringBuffer(); + result.append(stringifyValue()); + return result.toString(); + } } diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index a5e05ac5..61dd0e13 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -40,6 +40,6 @@ public class ElementValuePair { */ ElementValuePair(DataInputStream file, ConstantPool constant_pool) throws IOException { element_name_index = (file.readUnsignedShort()); - value = new ElementValue(file, constant_pool); + value = ElementValue.readElementValue(file, constant_pool); } } diff --git a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java new file mode 100644 index 00000000..7a6bc244 --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java @@ -0,0 +1,62 @@ +package org.apache.bcel.classfile; + +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; + +public class EnumElementValue extends ElementValue +{ + // For enum types, these two indices point to the type and value + private int typeIdx; + + private int valueIdx; + + public EnumElementValue(int type, int typeIdx, int valueIdx, + ConstantPool cpool) + { + super(type, cpool); + if (type != ENUM_CONSTANT) + throw new RuntimeException( + "Only element values of type enum can be built with this ctor"); + this.typeIdx = typeIdx; + this.valueIdx = valueIdx; + } + + public void dump(DataOutputStream dos) throws IOException + { + dos.writeByte(type); // u1 type of value (ENUM_CONSTANT == 'e') + dos.writeShort(typeIdx); // u2 + dos.writeShort(valueIdx); // u2 + } + + public String stringifyValue() + { + ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(valueIdx, + Constants.CONSTANT_Utf8); + return cu8.getBytes(); + } + + public String getEnumTypeString() + { + ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(typeIdx, + Constants.CONSTANT_Utf8); + return cu8.getBytes();// Utility.signatureToString(cu8.getBytes()); + } + + public String getEnumValueString() + { + ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(valueIdx, + Constants.CONSTANT_Utf8); + return cu8.getBytes(); + } + + public int getValueIndex() + { + return valueIdx; + } + + public int getTypeIndex() + { + return typeIdx; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java new file mode 100644 index 00000000..1f776a75 --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -0,0 +1,209 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; + +public class SimpleElementValue extends ElementValue +{ + private int index; + + protected SimpleElementValue(int type, int index, ConstantPool cpool) + { + super(type, cpool); + this.index = index; + } + + /** + * @return Value entry index in the cpool + */ + public int getIndex() + { + return index; + } + + public void setIndex(int index) + { + this.index = index; + } + + public String getValueString() + { + if (type != STRING) + throw new RuntimeException( + "Dont call getValueString() on a non STRING ElementValue"); + ConstantUtf8 c = (ConstantUtf8) cpool.getConstant(getIndex(), + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + public int getValueInt() + { + if (type != PRIMITIVE_INT) + throw new RuntimeException( + "Dont call getValueString() on a non STRING ElementValue"); + ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), + Constants.CONSTANT_Integer); + return c.getBytes(); + } + + public byte getValueByte() + { + if (type != PRIMITIVE_BYTE) + throw new RuntimeException( + "Dont call getValueByte() on a non BYTE ElementValue"); + ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), + Constants.CONSTANT_Integer); + return (byte) c.getBytes(); + } + + public char getValueChar() + { + if (type != PRIMITIVE_CHAR) + throw new RuntimeException( + "Dont call getValueChar() on a non CHAR ElementValue"); + ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), + Constants.CONSTANT_Integer); + return (char) c.getBytes(); + } + + public long getValueLong() + { + if (type != PRIMITIVE_LONG) + throw new RuntimeException( + "Dont call getValueLong() on a non LONG ElementValue"); + ConstantLong j = (ConstantLong) cpool.getConstant(getIndex()); + return j.getBytes(); + } + + public float getValueFloat() + { + if (type != PRIMITIVE_FLOAT) + throw new RuntimeException( + "Dont call getValueFloat() on a non FLOAT ElementValue"); + ConstantFloat f = (ConstantFloat) cpool.getConstant(getIndex()); + return f.getBytes(); + } + + public double getValueDouble() + { + if (type != PRIMITIVE_DOUBLE) + throw new RuntimeException( + "Dont call getValueDouble() on a non DOUBLE ElementValue"); + ConstantDouble d = (ConstantDouble) cpool.getConstant(getIndex()); + return d.getBytes(); + } + + public boolean getValueBoolean() + { + if (type != PRIMITIVE_BOOLEAN) + throw new RuntimeException( + "Dont call getValueBoolean() on a non BOOLEAN ElementValue"); + ConstantInteger bo = (ConstantInteger) cpool.getConstant(getIndex()); + return (bo.getBytes() != 0); + } + + public short getValueShort() + { + if (type != PRIMITIVE_SHORT) + throw new RuntimeException( + "Dont call getValueShort() on a non SHORT ElementValue"); + ConstantInteger s = (ConstantInteger) cpool.getConstant(getIndex()); + return (short) s.getBytes(); + } + + public String toString() + { + return stringifyValue(); + } + + // Whatever kind of value it is, return it as a string + public String stringifyValue() + { + switch (type) + { + case PRIMITIVE_INT: + ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), + Constants.CONSTANT_Integer); + return Integer.toString(c.getBytes()); + case PRIMITIVE_LONG: + ConstantLong j = (ConstantLong) cpool.getConstant(getIndex(), + Constants.CONSTANT_Long); + return Long.toString(j.getBytes()); + case PRIMITIVE_DOUBLE: + ConstantDouble d = (ConstantDouble) cpool.getConstant(getIndex(), + Constants.CONSTANT_Double); + return Double.toString(d.getBytes()); + case PRIMITIVE_FLOAT: + ConstantFloat f = (ConstantFloat) cpool.getConstant(getIndex(), + Constants.CONSTANT_Float); + return Float.toString(f.getBytes()); + case PRIMITIVE_SHORT: + ConstantInteger s = (ConstantInteger) cpool.getConstant(getIndex(), + Constants.CONSTANT_Integer); + return Integer.toString(s.getBytes()); + case PRIMITIVE_BYTE: + ConstantInteger b = (ConstantInteger) cpool.getConstant(getIndex(), + Constants.CONSTANT_Integer); + return Integer.toString(b.getBytes()); + case PRIMITIVE_CHAR: + ConstantInteger ch = (ConstantInteger) cpool.getConstant( + getIndex(), Constants.CONSTANT_Integer); + return new Character((char) ch.getBytes()).toString(); + case PRIMITIVE_BOOLEAN: + ConstantInteger bo = (ConstantInteger) cpool.getConstant( + getIndex(), Constants.CONSTANT_Integer); + if (bo.getBytes() == 0) + return "false"; + if (bo.getBytes() != 0) + return "true"; + case STRING: + ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(getIndex(), + Constants.CONSTANT_Utf8); + return cu8.getBytes(); + default: + throw new RuntimeException( + "SimpleElementValue class does not know how to stringify type " + + type); + } + } + + public void dump(DataOutputStream dos) throws IOException + { + dos.writeByte(type); // u1 kind of value + switch (type) + { + case PRIMITIVE_INT: + case PRIMITIVE_BYTE: + case PRIMITIVE_CHAR: + case PRIMITIVE_FLOAT: + case PRIMITIVE_LONG: + case PRIMITIVE_BOOLEAN: + case PRIMITIVE_SHORT: + case PRIMITIVE_DOUBLE: + case STRING: + dos.writeShort(getIndex()); + break; + default: + throw new RuntimeException( + "SimpleElementValue doesnt know how to write out type " + + type); + } + } +} diff --git a/src/main/java/org/apache/bcel/generic/AnnotationGen.java b/src/main/java/org/apache/bcel/generic/AnnotationGen.java new file mode 100644 index 00000000..fbea506f --- /dev/null +++ b/src/main/java/org/apache/bcel/generic/AnnotationGen.java @@ -0,0 +1,5 @@ +package org.apache.bcel.generic; + +public class AnnotationGen +{ +} diff --git a/src/main/java/org/apache/bcel/generic/ElementNameValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementNameValuePairGen.java new file mode 100644 index 00000000..c0cd4598 --- /dev/null +++ b/src/main/java/org/apache/bcel/generic/ElementNameValuePairGen.java @@ -0,0 +1,5 @@ +package org.apache.bcel.generic; + +public class ElementNameValuePairGen +{ +} diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java new file mode 100644 index 00000000..95ed4cd5 --- /dev/null +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -0,0 +1,164 @@ +package org.apache.bcel.generic; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.classfile.AnnotationElementValue; +import org.apache.bcel.classfile.ArrayElementValue; +import org.apache.bcel.classfile.ClassElementValue; +import org.apache.bcel.classfile.ElementValue; +import org.apache.bcel.classfile.EnumElementValue; +import org.apache.bcel.classfile.SimpleElementValue; + +public abstract class ElementValueGen +{ + protected int type; + + protected ConstantPoolGen cpGen; + + protected ElementValueGen(int type, ConstantPoolGen cpGen) + { + this.type = type; + this.cpGen = cpGen; + } + + /** + * Subtypes return an immutable variant of the ElementValueGen + */ + public abstract ElementValue getElementValue(); + + public int getElementValueType() + { + return type; + } + + public abstract String stringifyValue(); + + public abstract void dump(DataOutputStream dos) throws IOException; + + public static final int STRING = 's'; + + public static final int ENUM_CONSTANT = 'e'; + + public static final int CLASS = 'c'; + + public static final int ANNOTATION = '@'; + + public static final int ARRAY = '['; + + public static final int PRIMITIVE_INT = 'I'; + + public static final int PRIMITIVE_BYTE = 'B'; + + public static final int PRIMITIVE_CHAR = 'C'; + + public static final int PRIMITIVE_DOUBLE = 'D'; + + public static final int PRIMITIVE_FLOAT = 'F'; + + public static final int PRIMITIVE_LONG = 'J'; + + public static final int PRIMITIVE_SHORT = 'S'; + + public static final int PRIMITIVE_BOOLEAN = 'Z'; + + public static ElementValueGen readElementValue(DataInputStream dis, + ConstantPoolGen cpGen) throws IOException + { + int type = dis.readUnsignedByte(); + switch (type) + { + case 'B': // byte + return new SimpleElementValueGen(PRIMITIVE_BYTE, dis + .readUnsignedShort(), cpGen); + case 'C': // char + return new SimpleElementValueGen(PRIMITIVE_CHAR, dis + .readUnsignedShort(), cpGen); + case 'D': // double + return new SimpleElementValueGen(PRIMITIVE_DOUBLE, dis + .readUnsignedShort(), cpGen); + case 'F': // float + return new SimpleElementValueGen(PRIMITIVE_FLOAT, dis + .readUnsignedShort(), cpGen); + case 'I': // int + return new SimpleElementValueGen(PRIMITIVE_INT, dis + .readUnsignedShort(), cpGen); + case 'J': // long + return new SimpleElementValueGen(PRIMITIVE_LONG, dis + .readUnsignedShort(), cpGen); + case 'S': // short + return new SimpleElementValueGen(PRIMITIVE_SHORT, dis + .readUnsignedShort(), cpGen); + case 'Z': // boolean + return new SimpleElementValueGen(PRIMITIVE_BOOLEAN, dis + .readUnsignedShort(), cpGen); + case 's': // String + return new SimpleElementValueGen(STRING, dis.readUnsignedShort(), + cpGen); + case 'e': // Enum constant + return new EnumElementValueGen(dis.readUnsignedShort(), dis + .readUnsignedShort(), cpGen); + case 'c': // Class + return new ClassElementValueGen(dis.readUnsignedShort(), cpGen); + // + // case '@': // Annotation + // return new + // AnnotationElementValueGen(ANNOTATION,Annotation.read(dis,cpGen),cpGen); + // + // case '[': // Array + // int numArrayVals = dis.readUnsignedShort(); + // List arrayVals = new ArrayList(); + // ElementValue[] evalues = new ElementValue[numArrayVals]; + // for (int j=0;j", + Constants.ACC_PUBLIC | Constants.ACC_SUPER, null); + } + + /** + * Programmatically construct an mutable annotation (AnnotationGen) object. + */ + public void testConstructMutableAnnotation() + { + // Create the containing class + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + // Create the simple primitive value '4' of type 'int' + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_INT, cp, 4); + // Give it a name, call it 'id' + ElementNameValuePairGen nvGen = new ElementNameValuePairGen("id", evg, + cp); + // Check it looks right + assertTrue( + "Should include string 'id=4' but says: " + nvGen.toString(), + nvGen.toString().indexOf("id=4") != -1); + ObjectType t = new ObjectType("SimpleAnnotation"); + List elements = new ArrayList(); + elements.add(nvGen); + // Build an annotation of type 'SimpleAnnotation' with 'id=4' as the + // only value :) + AnnotationGen a = new AnnotationGen(t, elements, true, cp); + // Check we can save and load it ok + checkSerialize(a, cp); + } + + public void testVisibleInvisibleAnnotationGen() + { + // Create the containing class + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + // Create the simple primitive value '4' of type 'int' + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_INT, cp, 4); + // Give it a name, call it 'id' + ElementNameValuePairGen nvGen = new ElementNameValuePairGen("id", evg, + cp); + // Check it looks right + assertTrue( + "Should include string 'id=4' but says: " + nvGen.toString(), + nvGen.toString().indexOf("id=4") != -1); + ObjectType t = new ObjectType("SimpleAnnotation"); + List elements = new ArrayList(); + elements.add(nvGen); + // Build a RV annotation of type 'SimpleAnnotation' with 'id=4' as the + // only value :) + AnnotationGen a = new AnnotationGen(t, elements, true, cp); + Vector v = new Vector(); + v.add(a); + Attribute[] attributes = Utility.getAnnotationAttributes(cp, v); + boolean foundRV = false; + for (int i = 0; i < attributes.length; i++) + { + Attribute attribute = attributes[i]; + if (attribute instanceof RuntimeVisibleAnnotations) + { + assertTrue(((RuntimeAnnotations) attribute).areVisible()); + foundRV = true; + } + } + assertTrue("Should have seen a RuntimeVisibleAnnotation", foundRV); + // Build a RIV annotation of type 'SimpleAnnotation' with 'id=4' as the + // only value :) + AnnotationGen a2 = new AnnotationGen(t, elements, false, cp); + Vector v2 = new Vector(); + v2.add(a2); + Attribute[] attributes2 = Utility.getAnnotationAttributes(cp, v2); + boolean foundRIV = false; + for (int i = 0; i < attributes2.length; i++) + { + Attribute attribute = attributes2[i]; + if (attribute instanceof RuntimeInvisibleAnnotations) + { + assertFalse(((RuntimeAnnotations) attribute).areVisible()); + foundRIV = true; + } + } + assertTrue("Should have seen a RuntimeInvisibleAnnotation", foundRIV); + } + + private void checkSerialize(AnnotationGen a, ConstantPoolGen cpg) + { + try + { + String beforeName = a.getTypeName(); + List beforeValues = a.getValues(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + a.dump(dos); + dos.flush(); + dos.close(); + byte[] bs = baos.toByteArray(); + ByteArrayInputStream bais = new ByteArrayInputStream(bs); + DataInputStream dis = new DataInputStream(bais); + AnnotationGen annAfter = AnnotationGen.read(dis, cpg, a + .isRuntimeVisible()); + dis.close(); + String afterName = annAfter.getTypeName(); + List afterValues = annAfter.getValues(); + if (!beforeName.equals(afterName)) + { + fail("Deserialization failed: before type='" + beforeName + + "' after type='" + afterName + "'"); + } + if (a.getValues().size() != annAfter.getValues().size()) + { + fail("Different numbers of element name value pairs?? " + + a.getValues().size() + "!=" + + annAfter.getValues().size()); + } + for (int i = 0; i < a.getValues().size(); i++) + { + ElementNameValuePairGen beforeElement = (ElementNameValuePairGen) a + .getValues().get(i); + ElementNameValuePairGen afterElement = (ElementNameValuePairGen) annAfter + .getValues().get(i); + if (!beforeElement.getNameString().equals( + afterElement.getNameString())) + { + fail("Different names?? " + beforeElement.getNameString() + + "!=" + afterElement.getNameString()); + } + } + } + catch (IOException ioe) + { + fail("Unexpected exception whilst checking serialization: " + ioe); + } + } +} diff --git a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java index d171bdf3..24e0dde5 100755 --- a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java +++ b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java @@ -1,266 +1,265 @@ package org.apache.bcel; import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.util.ClassPath; -import org.apache.bcel.util.SyntheticRepository; public class CounterVisitorTestCase extends AbstractCounterVisitorTestCase { protected JavaClass getTestClass() throws ClassNotFoundException { - JavaClass javaClass = SyntheticRepository.getInstance( - new ClassPath( - "file://F:/GSoC/Dmitriy/bcel-j5/target/test-classes/")) - .loadClass("org.apache.bcel.data.package-info"); - System.out.println(javaClass.isAbstract()); - return javaClass; + return getTestClass("org.apache.bcel.data.MarkedType$1"); } public void testAnnotationsCount() { - System.out - .println("AnnotationsCount = " + getVisitor().annotationCount); + // System.out + // .println("AnnotationsCount = " + getVisitor().annotationCount); assertTrue(getVisitor().annotationCount == 2); } public void testAnnotationDefaultCount() { - System.out.println("AnnotationDefaultCount = " - + getVisitor().annotationDefaultCount); + // System.out.println("AnnotationDefaultCount = " + // + getVisitor().annotationDefaultCount); assertTrue(getVisitor().annotationDefaultCount == 0); } public void testAnnotationEntryCount() { - System.out.println("AnnotationEntryCount = " - + getVisitor().annotationEntryCount); + // System.out.println("AnnotationEntryCount = " + // + getVisitor().annotationEntryCount); assertTrue(getVisitor().annotationEntryCount == 0); } public void testCodeCount() { - System.out.println("CodeCount = " + getVisitor().codeCount); + // System.out.println("CodeCount = " + getVisitor().codeCount); assertTrue(getVisitor().codeCount == 1); } public void testCodeExceptionCount() { - System.out.println("CodeExceptionCount = " - + getVisitor().codeExceptionCount); + // System.out.println("CodeExceptionCount = " + // + getVisitor().codeExceptionCount); assertTrue(getVisitor().codeExceptionCount == 0); } public void testConstantClassCount() { - System.out.println("ConstantClassCount = " - + getVisitor().constantClassCount); + // System.out.println("ConstantClassCount = " + // + getVisitor().constantClassCount); assertTrue(getVisitor().constantClassCount == 2); } public void testConstantDoubleCount() { - System.out.println("ConstantDoubleCount = " - + getVisitor().constantDoubleCount); + // System.out.println("ConstantDoubleCount = " + // + getVisitor().constantDoubleCount); assertTrue(getVisitor().constantDoubleCount == 0); } public void testConstantFieldrefCount() { - System.out.println("ConstantFieldrefCount = " - + getVisitor().constantFieldrefCount); + // System.out.println("ConstantFieldrefCount = " + // + getVisitor().constantFieldrefCount); assertTrue(getVisitor().constantFieldrefCount == 0); } public void testConstantFloatCount() { - System.out.println("ConstantFloatCount = " - + getVisitor().constantFloatCount); + // System.out.println("ConstantFloatCount = " + // + getVisitor().constantFloatCount); assertTrue(getVisitor().constantFloatCount == 0); } public void testConstantIntegerCount() { - System.out.println("ConstantIntegerCount = " - + getVisitor().constantIntegerCount); + // System.out.println("ConstantIntegerCount = " + // + getVisitor().constantIntegerCount); assertTrue(getVisitor().constantIntegerCount == 0); } public void testConstantInterfaceMethodrefCount() { - System.out.println("ConstantInterfaceMethodrefCount = " - + getVisitor().constantInterfaceMethodrefCount); + // System.out.println("ConstantInterfaceMethodrefCount = " + // + getVisitor().constantInterfaceMethodrefCount); assertTrue(getVisitor().constantInterfaceMethodrefCount == 0); } public void testConstantLongCount() { - System.out.println("ConstantLongCount = " - + getVisitor().constantLongCount); + // System.out.println("ConstantLongCount = " + // + getVisitor().constantLongCount); assertTrue(getVisitor().constantLongCount == 0); } public void testConstantMethodrefCount() { - System.out.println("ConstantMethodrefCount = " - + getVisitor().constantMethodrefCount); + // System.out.println("ConstantMethodrefCount = " + // + getVisitor().constantMethodrefCount); assertTrue(getVisitor().constantMethodrefCount == 1); } public void testConstantNameAndTypeCount() { - System.out.println("ConstantNameAndTypeCount = " - + getVisitor().constantNameAndTypeCount); + // System.out.println("ConstantNameAndTypeCount = " + // + getVisitor().constantNameAndTypeCount); assertTrue(getVisitor().constantNameAndTypeCount == 1); } public void testConstantPoolCount() { - System.out.println("ConstantPoolCount = " - + getVisitor().constantPoolCount); + // System.out.println("ConstantPoolCount = " + // + getVisitor().constantPoolCount); assertTrue(getVisitor().constantPoolCount == 1); } public void testConstantStringCount() { - System.out.println("ConstantStringCount = " - + getVisitor().constantStringCount); + // System.out.println("ConstantStringCount = " + // + getVisitor().constantStringCount); assertTrue(getVisitor().constantStringCount == 0); } public void testConstantValueCount() { - System.out.println("ConstantValueCount = " - + getVisitor().constantValueCount); + // System.out.println("ConstantValueCount = " + // + getVisitor().constantValueCount); assertTrue(getVisitor().constantValueCount == 0); } public void testDeprecatedCount() { - System.out.println("DeprecatedCount = " + getVisitor().deprecatedCount); + // System.out.println("DeprecatedCount = " + + // getVisitor().deprecatedCount); assertTrue(getVisitor().deprecatedCount == 0); } public void testEnclosingMethodCount() { - System.out.println("EnclosingMethodCount = " - + getVisitor().enclosingMethodCount); + // System.out.println("EnclosingMethodCount = " + // + getVisitor().enclosingMethodCount); assertTrue(getVisitor().enclosingMethodCount == 0); } public void testExceptionTableCount() { - System.out.println("ExceptionTableCount = " - + getVisitor().exceptionTableCount); + // System.out.println("ExceptionTableCount = " + // + getVisitor().exceptionTableCount); assertTrue(getVisitor().exceptionTableCount == 0); } public void testFieldCount() { - System.out.println("FieldCount = " + getVisitor().fieldCount); + // System.out.println("FieldCount = " + getVisitor().fieldCount); assertTrue(getVisitor().fieldCount == 0); } public void testInnerClassCount() { - System.out.println("InnerClassCount = " + getVisitor().innerClassCount); + // System.out.println("InnerClassCount = " + + // getVisitor().innerClassCount); assertTrue(getVisitor().innerClassCount == 0); } public void testInnerClassesCount() { - System.out.println("InnerClassesCount = " - + getVisitor().innerClassesCount); + // System.out.println("InnerClassesCount = " + // + getVisitor().innerClassesCount); assertTrue(getVisitor().innerClassesCount == 0); } public void testJavaClassCount() { - System.out.println("JavaClassCount = " + getVisitor().javaClassCount); + // System.out.println("JavaClassCount = " + + // getVisitor().javaClassCount); assertTrue(getVisitor().javaClassCount == 1); } public void testLineNumberCount() { - System.out.println("LineNumberCount = " + getVisitor().lineNumberCount); + // System.out.println("LineNumberCount = " + + // getVisitor().lineNumberCount); assertTrue(getVisitor().lineNumberCount == 1); } public void testLineNumberTableCount() { - System.out.println("LineNumberTableCount = " - + getVisitor().lineNumberTableCount); + // System.out.println("LineNumberTableCount = " + // + getVisitor().lineNumberTableCount); assertTrue(getVisitor().lineNumberTableCount == 1); } public void testLocalVariableCount() { - System.out.println("LocalVariableCount = " - + getVisitor().localVariableCount); + // System.out.println("LocalVariableCount = " + // + getVisitor().localVariableCount); assertTrue(getVisitor().localVariableCount == 1); } public void testLocalVariableTableCount() { - System.out.println("LocalVariableTableCount = " - + getVisitor().localVariableTableCount); + // System.out.println("LocalVariableTableCount = " + // + getVisitor().localVariableTableCount); assertTrue(getVisitor().localVariableTableCount == 1); } public void testLocalVariableTypeTableCount() { - System.out.println("LocalVariableTypeTableCount = " - + getVisitor().localVariableTypeTableCount); + // System.out.println("LocalVariableTypeTableCount = " + // + getVisitor().localVariableTypeTableCount); assertTrue(getVisitor().localVariableTypeTableCount == 0); } public void testMethodCount() { - System.out.println("MethodCount = " + getVisitor().methodCount); + // System.out.println("MethodCount = " + getVisitor().methodCount); assertTrue(getVisitor().methodCount == 1); } public void testParameterAnnotationCount() { - System.out.println("ParameterAnnotationCount = " - + getVisitor().methodCount); + // System.out.println("ParameterAnnotationCount = " + // + getVisitor().methodCount); assertTrue(getVisitor().methodCount == 1); } public void testSignatureCount() { - System.out.println("SignatureCount = " - + getVisitor().signatureAnnotationCount); + // System.out.println("SignatureCount = " + // + getVisitor().signatureAnnotationCount); assertTrue(getVisitor().signatureAnnotationCount == 0); } public void testSourceFileCount() { - System.out.println("SourceFileCount = " + getVisitor().sourceFileCount); + // System.out.println("SourceFileCount = " + + // getVisitor().sourceFileCount); assertTrue(getVisitor().sourceFileCount == 1); } public void testStackMapCount() { - System.out.println("StackMapCount = " + getVisitor().stackMapCount); + // System.out.println("StackMapCount = " + getVisitor().stackMapCount); assertTrue(getVisitor().stackMapCount == 0); } public void testStackMapEntryCount() { - System.out.println("StackMapEntryCount = " - + getVisitor().stackMapEntryCount); + // System.out.println("StackMapEntryCount = " + // + getVisitor().stackMapEntryCount); assertTrue(getVisitor().stackMapEntryCount == 0); } public void testSyntheticCount() { - System.out.println("SyntheticCount = " + getVisitor().syntheticCount); + // System.out.println("SyntheticCount = " + + // getVisitor().syntheticCount); assertTrue(getVisitor().syntheticCount == 0); } public void testUnknownCount() { - System.out.println("UnknownCount = " + getVisitor().unknownCount); + // System.out.println("UnknownCount = " + getVisitor().unknownCount); assertTrue(getVisitor().unknownCount == 0); } } \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/data/MarkedType.java b/src/test/java/org/apache/bcel/data/MarkedType.java index 52e0357e..e69de29b 100755 --- a/src/test/java/org/apache/bcel/data/MarkedType.java +++ b/src/test/java/org/apache/bcel/data/MarkedType.java @@ -1,48 +0,0 @@ -package org.apache.bcel.data; - -@MarkerAnnotationInvisible -@MarkerAnnotation -@SimpleAnnotation(id = 1) -public abstract class MarkedType -{ - @MarkerAnnotationInvisible - @MarkerAnnotation - class InnerClass - { - } - - @MarkerAnnotationInvisible - @MarkerAnnotation - int annotatedField; - - @Deprecated - void deprecatedMthod() - { - } - - native void nativeMthod(); - - abstract void abstractMethod(); - - @MarkerAnnotationInvisible - @MarkerAnnotation - void annotatedMethod() - { - } - - void annotatedParamentrMethod(@MarkerAnnotationInvisible - @MarkerAnnotation - int i) - { - } - - void constantedMethod() - { - int i1 = 1; - int i2 = 200000; - long l1 = 1; - long l2 = 200000; - float f = 0.1F; - String s = ""; - } -} diff --git a/src/test/java/org/apache/bcel/data/MarkerAnnotation.java b/src/test/java/org/apache/bcel/data/MarkerAnnotation.java index 331d1c3d..e69de29b 100755 --- a/src/test/java/org/apache/bcel/data/MarkerAnnotation.java +++ b/src/test/java/org/apache/bcel/data/MarkerAnnotation.java @@ -1,10 +0,0 @@ -package org.apache.bcel.data; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) -public @interface MarkerAnnotation -{ - String value() default ""; -} diff --git a/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java b/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java index 8496c103..e69de29b 100755 --- a/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java +++ b/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java @@ -1,9 +0,0 @@ -package org.apache.bcel.data; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.CLASS) -public @interface MarkerAnnotationInvisible -{ -} diff --git a/src/test/java/org/apache/bcel/data/SimpleAnnotation.java b/src/test/java/org/apache/bcel/data/SimpleAnnotation.java index 065ff0eb..6520eb02 100755 --- a/src/test/java/org/apache/bcel/data/SimpleAnnotation.java +++ b/src/test/java/org/apache/bcel/data/SimpleAnnotation.java @@ -1,10 +1,11 @@ package org.apache.bcel.data; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) -public @interface SimpleAnnotation { - int id(); - String fruit() default "bananas"; +public @interface SimpleAnnotation +{ + int id(); + + String fruit() default "bananas"; } diff --git a/src/test/java/org/apache/bcel/data/SimpleClass.java b/src/test/java/org/apache/bcel/data/SimpleClass.java new file mode 100644 index 00000000..9231442d --- /dev/null +++ b/src/test/java/org/apache/bcel/data/SimpleClass.java @@ -0,0 +1,9 @@ +package org.apache.bcel.data; + +public class SimpleClass +{ + public static void main(String[] argv) + { + // Nothing unusual in this class + } +} diff --git a/src/test/java/org/apache/bcel/data/SimpleEnum.java b/src/test/java/org/apache/bcel/data/SimpleEnum.java new file mode 100644 index 00000000..bf1986d3 --- /dev/null +++ b/src/test/java/org/apache/bcel/data/SimpleEnum.java @@ -0,0 +1,3 @@ +package org.apache.bcel.data; + +public enum SimpleEnum { Red,Orange,Yellow,Green,Blue,Indigo,Violet }; diff --git a/src/test/java/org/apache/bcel/data/package-info.java b/src/test/java/org/apache/bcel/data/package-info.java index 4d6ffff8..e69de29b 100755 --- a/src/test/java/org/apache/bcel/data/package-info.java +++ b/src/test/java/org/apache/bcel/data/package-info.java @@ -1,4 +0,0 @@ -@MarkerAnnotationInvisible -@MarkerAnnotation -@SimpleAnnotation(id = 1) -package org.apache.bcel.data; \ No newline at end of file -- GitLab From 57f47914edea6252f1144c69ae56d1a4567ae1ad Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Tue, 20 Jun 2006 02:56:49 +0000 Subject: [PATCH 0348/1313] forgot to add git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@415488 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 183 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100755 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100755 index 00000000..485ec686 --- /dev/null +++ b/pom.xml @@ -0,0 +1,183 @@ + + + + 4.0.0 + + bcel + bcel + jar + 5.3-SNAPSHOT + Jakarta BCEL + Bytecode Engineering Library + + http://jakarta.apache.org/bcel + 2004 + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + The Apache Software Foundation + http://www.apache.org/ + + + + + Markus Dahm + mdahm + m.dahm at gmx.de + it-frameworksolutions + + + + Jason van Zyl + jvanzyl + jason at zenplex.com + Zenplex + + + + Enver Haase + ehaase + enver at convergence.de + convergence + + + + Dave Brosius + dbrosius + dbrosius at mebigfatguy.com + + + + Torsten Curdt + tcurdt + tcurdt at apache.org + ASF + http://www.apache.org/ + +10 + + + + + + BCEL User List + + bcel-user-subscribe@jakarta.apache.org + + + bcel-user-unsubscribe@jakarta.apache.org + + + http://www.mail-archive.com/bcel-user@jakarta.apache.org/ + + + + BCEL Developer List + bcel-dev-subscribe@jakarta.apache.org + + bcel-dev-unsubscribe@jakarta.apache.org + + + http://www.mail-archive.com/bcel-dev@jakarta.apache.org/ + + + + + + bugzilla + https://issues.apache.org/bugzilla + + + + + scm:svn:http://svn.apache.org/repos/asf/jakarta/bcel/trunk + + + scm:svn:http://svn.apache.org/repos/asf/jakarta/bcel/trunk + + http://svn.apache.org/repos/asf/jakarta/bcel/trunk + + + + + apache-snapshots + Apache Maven2 Repository + http://cvs.apache.org/maven-snapshot-repository + + + codehaus-snapshot + Maven snapshot Repository + http://snapshots.maven.codehaus.org/maven2 + + + + + + apache-maven-snapshot + repository + + scpexe://people.apache.org/www/cvs.apache.org/maven-snapshot-repository + + + + apache-maven-snapshot + repository + + scpexe://people.apache.org/www/cvs.apache.org/maven-snapshot-repository + + + + website + + scpexe://people.apache.org/www/jakarta.apache.org/commons/sandbox/jci + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + true + 1.4 + 1.4 + + + + maven-surefire-plugin + + + **/*TestCase.java + + + **/Abstract* + + true + + + + + + + + jakarta-regexp + jakarta-regexp + 1.4 + + + junit + junit + 3.8.1 + + + \ No newline at end of file -- GitLab From 9c63ab3fa09e73c65f1b44500b35e6cc904fb7d7 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Wed, 21 Jun 2006 01:46:48 +0000 Subject: [PATCH 0349/1313] not a maven1 build anymore git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@415867 13f79535-47bb-0310-9956-ffa450edef68 --- maven.xml | 33 ---------- project.properties | 50 --------------- project.xml | 156 --------------------------------------------- 3 files changed, 239 deletions(-) delete mode 100644 maven.xml delete mode 100644 project.properties delete mode 100644 project.xml diff --git a/maven.xml b/maven.xml deleted file mode 100644 index c5f1f8d7..00000000 --- a/maven.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/project.properties b/project.properties deleted file mode 100644 index a5269b5a..00000000 --- a/project.properties +++ /dev/null @@ -1,50 +0,0 @@ -maven.repo.list=apache.snapshots - -maven.repo.apache.snapshots=scp://cvs.apache.org -maven.repo.apache.snapshots.directory=/www/cvs.apache.org/repository -maven.repo.apache.snapshots.username=${maven.repo.apache.username} -maven.repo.apache.snapshots.privatekey=${maven.repo.apache.privatekey} -maven.repo.apache.snapshots.passphrase=${maven.repo.apache.passphrase} -maven.repo.apache.snapshots.group=apcvs - -maven.repo.apache.releases=scp://people.apache.org -maven.repo.apache.releases.directory=/www/www.apache.org/dist/java-repository -maven.repo.apache.releases.group=apcvs -#maven.repo.apache.releases.username= -#maven.repo.apache.releases.privatekey= -#maven.repo.apache.releases.passphrase= - -#maven.mode.online = - -maven.username = ${user.name} - -maven.compile.debug = on -maven.compile.deprecation = off -maven.compile.optimize = off -maven.compile.source = 1.3 -maven.compile.target = 1.3 - -maven.jar.manifest.attributes.list=X-Compile-Source-JDK,X-Compile-Target-JDK -maven.jar.manifest.attribute.X-Compile-Source-JDK=${maven.compile.source} -maven.jar.manifest.attribute.X-Compile-Target-JDK=${maven.compile.target} - -maven.jarResources.basedir = src/java -maven.jar.excludes = **/package.html -#maven.junit.fork = true - -maven.test.failure.ignore = true -maven.test.skip = false - -maven.javadoc.author = false -maven.javadoc.links = http://java.sun.com/products/jdk/1.4/docs/api - -maven.changelog.factory = org.apache.maven.svnlib.SvnChangeLogFactory - -maven.xdoc.jsl = ../commons-build/commons-site.jsl -maven.xdoc.date = left -maven.xdoc.poweredby.image = maven-feather.png -maven.xdoc.version = ${pom.currentVersion} -maven.xdoc.developmentProcessUrl = http://jakarta.apache.org/commons/charter.html -maven.xdoc.includeProjectDocumentation = yes - -maven.jar.override = off diff --git a/project.xml b/project.xml deleted file mode 100644 index 29f4c7ae..00000000 --- a/project.xml +++ /dev/null @@ -1,156 +0,0 @@ - - - - 3 - jakarta-bcel - bcel - 5.2rc1 - - Apache Software Foundation - http://www.apache.org - http://jakarta.apache.org/images/jakarta-logo.gif - - 2002 - org.apache.bcel - - /images/bcel-logo.gif - - Bytecode Engineering Library - - - Bytecode Engineering Library - - - - - The Apache Software License, Version 2.0 - /LICENSE.txt - repo - - - - jakarta - http://jakarta.apache.org/bcel/ - http://issues.apache.org/bugzilla/ - minotaur.apache.org - /www/jakarta.apache.org/bcel/ - - - scm:svn:http://svn.apache.org/repos/asf/jakarta/bcel/trunk - http://svn.apache.org/repos/asf/jakarta/bcel/trunk - - - - - BCEL User List - bcel-user-subscribe@jakarta.apache.org - bcel-user-unsubscribe@jakarta.apache.org - http://www.mail-archive.com/bcel-user@jakarta.apache.org/ - - - BCEL Developer List - bcel-dev-subscribe@jakarta.apache.org - bcel-dev-unsubscribe@jakarta.apache.org - http://www.mail-archive.com/bcel-dev@jakarta.apache.org/ - - - - - - - Markus Dahm - mdahm - m.dahm at gmx.de - it-frameworksolutions - - - - Jason van Zyl - jvanzyl - jason at zenplex.com - Zenplex - - - - Enver Haase - ehaase - enver at convergence.de - convergence - - - - Dave Brosius - dbrosius - dbrosius at mebigfatguy.com - - - - Torsten Curdt - tcurdt - tcurdt at apache.org - - - - - - - - regexp - 1.2 - - - - - - - - - src/java - - - - ${basedir} - - NOTICE.txt - - META-INF - - - - - - - - - maven-license-plugin - maven-changelog-plugin - maven-changes-plugin - maven-developer-activity-plugin - maven-javadoc-plugin - - - maven-jxr-plugin - maven-pmd-plugin - - - - - - - - - - -- GitLab From f4865c297547619b5865fc59786b72ae48de73f7 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 25 Jun 2006 17:18:37 +0000 Subject: [PATCH 0350/1313] Enhancement 39855 by Len Trigg: [PATCH] Add support for getResource and getResourceAsStream to ClassPath git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@417033 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/util/ClassPath.java | 77 ++++++++++++++++++- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index c83716a1..59a4923a 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -23,6 +23,8 @@ import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; +import java.net.MalformedURLException; +import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -185,6 +187,33 @@ public class ClassPath implements Serializable { return getClassFile(name, suffix).getInputStream(); } + /** + * @param name fully qualified resource name, e.g. java/lang/String.class + * @return InputStream supplying the resource, or null if no resource with that name. + */ + public InputStream getResourceAsStream(String name) { + for (int i = 0; i < paths.length; i++) { + InputStream is; + if ((is = paths[i].getResourceAsStream(name)) != null) { + return is; + } + } + return null; + } + + /** + * @param name fully qualified resource name, e.g. java/lang/String.class + * @return URL supplying the resource, or null if no resource with that name. + */ + public URL getResource(String name) { + for (int i = 0; i < paths.length; i++) { + URL url; + if ((url = paths[i].getResource(name)) != null) { + return url; + } + } + return null; + } /** * @param name fully qualified file name, e.g. java/lang/String @@ -270,6 +299,8 @@ public class ClassPath implements Serializable { private static abstract class PathEntry implements Serializable { abstract ClassFile getClassFile( String name, String suffix ) throws IOException; + abstract URL getResource(String name); + abstract InputStream getResourceAsStream(String name); } /** Contains information about file/ZIP entry of the Java class. @@ -311,6 +342,25 @@ public class ClassPath implements Serializable { dir = d; } + URL getResource(String name) { + // Resource specification uses '/' whatever the platform + final File file = new File(dir + File.separatorChar + name.replace('/', File.separatorChar)); + try { + return file.exists() ? file.toURL() : null; + } catch (MalformedURLException e) { + return null; + } + } + + InputStream getResourceAsStream(String name) { + // Resource specification uses '/' whatever the platform + final File file = new File(dir + File.separatorChar + name.replace('/', File.separatorChar)); + try { + return file.exists() ? new FileInputStream(file) : null; + } catch (IOException e) { + return null; + } + } ClassFile getClassFile( String name, String suffix ) throws IOException { final File file = new File(dir + File.separatorChar @@ -362,10 +412,31 @@ public class ClassPath implements Serializable { zip = z; } - + URL getResource(String name) { + final ZipEntry entry = zip.getEntry(name); + try { + return (entry != null) ? new URL("jar:file:" + zip.getName() + "!/" + name) : null; + } catch (MalformedURLException e) { + return null; + } + } + + InputStream getResourceAsStream(String name) { + final ZipEntry entry = zip.getEntry(name); + try { + return (entry != null) ? zip.getInputStream(entry) : null; + } catch (IOException e) { + return null; + } + } + ClassFile getClassFile( String name, String suffix ) throws IOException { final ZipEntry entry = zip.getEntry(name.replace('.', '/') + suffix); - return (entry != null) ? new ClassFile() { + + if (entry == null) + return null; + + return new ClassFile() { public InputStream getInputStream() throws IOException { return zip.getInputStream(entry); @@ -390,7 +461,7 @@ public class ClassPath implements Serializable { public String getBase() { return zip.getName(); } - } : null; + }; } } } -- GitLab From 555a09fd92af88a171f1302231ce6a3aaff1cffd Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Mon, 26 Jun 2006 10:19:54 +0000 Subject: [PATCH 0351/1313] GSoC: latest changes from Dmitriy Khayredinov git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@417157 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 6 +- .../bcel/classfile/AnnotationEntry.java | 49 +++- .../apache/bcel/classfile/Annotations.java | 17 +- .../apache/bcel/classfile/ElementValue.java | 5 +- .../bcel/classfile/ElementValuePair.java | 53 ++-- .../classfile/ParameterAnnotationEntry.java | 3 +- .../RuntimeInvisibleAnnotations.java | 2 +- .../classfile/RuntimeVisibleAnnotations.java | 8 +- .../bcel/classfile/SimpleElementValue.java | 2 +- .../org/apache/bcel/classfile/Utility.java | 73 ++++++ .../bcel/generic/AnnotationEntryGen.java | 190 ++++++++++++++ .../apache/bcel/generic/AnnotationGen.java | 5 - .../bcel/generic/ElementNameValuePairGen.java | 5 - .../apache/bcel/generic/ElementValueGen.java | 22 +- .../bcel/generic/ElementValuePairGen.java | 93 +++++++ .../bcel/generic/EnumElementValueGen.java | 119 +++++++++ .../bcel/generic/SimpleElementValueGen.java | 240 ++++++++++++++++++ .../apache/bcel/AnnotationGenTestCase.java | 27 +- 18 files changed, 840 insertions(+), 79 deletions(-) create mode 100755 src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java create mode 100755 src/main/java/org/apache/bcel/generic/ElementValuePairGen.java create mode 100644 src/main/java/org/apache/bcel/generic/EnumElementValueGen.java diff --git a/pom.xml b/pom.xml index 485ec686..fc9a7ba5 100755 --- a/pom.xml +++ b/pom.xml @@ -149,8 +149,8 @@ maven-compiler-plugin true - 1.4 - 1.4 + 1.5 + 1.5 @@ -180,4 +180,4 @@ 3.8.1 - \ No newline at end of file + diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index c8ee3eac..7ee21574 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -19,6 +19,8 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.apache.bcel.Constants; /** @@ -32,8 +34,9 @@ public class AnnotationEntry implements Node, Constants { private int type_index; private int num_element_value_pairs; - private ElementValuePair[] element_value_pairs; + private List element_value_pairs; private ConstantPool constant_pool; + private boolean isRuntimeVisible; /** @@ -41,14 +44,22 @@ public class AnnotationEntry implements Node, Constants { * @param file Input stream * @throws IOException */ - AnnotationEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { - type_index = (file.readUnsignedShort()); - num_element_value_pairs = (file.readUnsignedShort()); - element_value_pairs = new ElementValuePair[num_element_value_pairs]; - for (int i = 0; i < num_element_value_pairs; i++) { - element_value_pairs[i] = new ElementValuePair(file, constant_pool); - } + public AnnotationEntry(int type_index, ConstantPool constant_pool, boolean isRuntimeVisible) { + this.type_index = type_index; + this.constant_pool = constant_pool; + this.isRuntimeVisible = isRuntimeVisible; + } + + public static AnnotationEntry read(DataInputStream file, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException + { + AnnotationEntry annotationEntry = new AnnotationEntry(file.readUnsignedShort(), constant_pool, isRuntimeVisible); + annotationEntry.num_element_value_pairs = (file.readUnsignedShort()); + annotationEntry.element_value_pairs = new ArrayList(); + for (int i = 0; i < annotationEntry.num_element_value_pairs; i++) { + annotationEntry.element_value_pairs.add(new ElementValuePair(file.readUnsignedShort(), ElementValue.readElementValue(file, constant_pool), constant_pool)); + } + return annotationEntry; } @@ -72,6 +83,14 @@ public class AnnotationEntry implements Node, Constants { c = (ConstantUtf8) constant_pool.getConstant(type_index, CONSTANT_Utf8); return c.getBytes(); } + + /** + * @return the annotation type index + */ + public int getAnnotationTypeIndex() + { + return type_index; + } /** @@ -86,7 +105,8 @@ public class AnnotationEntry implements Node, Constants { * @return the element value pairs in this annotation entry */ public ElementValuePair[] getElementValuePairs() { - return element_value_pairs; + // TOFO return List + return (ElementValuePair[]) element_value_pairs.toArray(); } @@ -94,4 +114,15 @@ public class AnnotationEntry implements Node, Constants { { // TODO Auto-generated method stub } + + + public boolean isRuntimeVisible() + { + return isRuntimeVisible; + } + + public void addElementNameValuePair(ElementValuePair elementNameValuePair) + { + element_value_pairs.add(elementNameValuePair); + } } diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index b38fb951..ce932d8a 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -30,6 +30,7 @@ public abstract class Annotations extends Attribute { private int annotation_table_length; private AnnotationEntry[] annotation_table; // Table of annotations + private boolean isRuntimeVisible; /** @@ -39,13 +40,13 @@ public abstract class Annotations extends Attribute { * @param file Input stream * @param constant_pool Array of constants */ - Annotations(byte annotation_type, int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool); + public Annotations(byte annotation_type, int name_index, int length, DataInputStream file, + ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { + this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool, isRuntimeVisible); annotation_table_length = (file.readUnsignedShort()); annotation_table = new AnnotationEntry[annotation_table_length]; for (int i = 0; i < annotation_table_length; i++) { - annotation_table[i] = new AnnotationEntry(file, constant_pool); + annotation_table[i] = AnnotationEntry.read(file, constant_pool, isRuntimeVisible); } } @@ -58,9 +59,10 @@ public abstract class Annotations extends Attribute { * @param constant_pool Array of constants */ public Annotations(byte annotation_type, int name_index, int length, - AnnotationEntry[] annotation_table, ConstantPool constant_pool) { + AnnotationEntry[] annotation_table, ConstantPool constant_pool , boolean isRuntimeVisible) { super(annotation_type, name_index, length, constant_pool); setAnnotationTable(annotation_table); + this.isRuntimeVisible = isRuntimeVisible; } @@ -107,4 +109,9 @@ public abstract class Annotations extends Attribute { public final int getNumAnnotations() { return annotation_table_length; } + + public boolean isRuntimeVisible() + { + return isRuntimeVisible; + } } diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index 6550eb62..a4d94667 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -118,8 +118,9 @@ public abstract class ElementValue case 'c': // Class return new ClassElementValue(CLASS, dis.readUnsignedShort(), cpool); case '@': // Annotation - return new AnnotationElementValue(ANNOTATION, new AnnotationEntry( - dis, cpool), cpool); + // TODO isRuntimeVisible + return new AnnotationElementValue(ANNOTATION, AnnotationEntry.read( + dis, cpool, false), cpool); case '[': // Array int numArrayVals = dis.readUnsignedShort(); List arrayVals = new ArrayList(); diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index 61dd0e13..74754639 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -16,30 +16,45 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; -import java.io.IOException; +import org.apache.bcel.Constants; /** * an annotation's element value pair * * @version $Id: ElementValuePair - * @author D. Brosius + * @author D. Brosius * @since 5.2 */ -public class ElementValuePair { - - private int element_name_index; - private ElementValue value; - - - /** - * Construct object from file stream. - * @param file Input stream - * @param constant_pool the constant pool - * @throws IOException - */ - ElementValuePair(DataInputStream file, ConstantPool constant_pool) throws IOException { - element_name_index = (file.readUnsignedShort()); - value = ElementValue.readElementValue(file, constant_pool); - } +public class ElementValuePair +{ + private ElementValue elementValue; + + private ConstantPool constantPool; + + private int elementNameIndex; + + public ElementValuePair(int elementNameIndex, ElementValue elementValue, + ConstantPool constantPool) + { + this.elementValue = elementValue; + this.elementNameIndex = elementNameIndex; + this.constantPool = constantPool; + } + + public String getNameString() + { + ConstantUtf8 c = (ConstantUtf8) constantPool.getConstant( + elementNameIndex, Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + public final ElementValue getValue() + { + return elementValue; + } + + public int getNameIndex() + { + return elementNameIndex; + } } diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index bb2d817c..ae6b9069 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -42,7 +42,8 @@ public class ParameterAnnotationEntry implements Node, Constants { annotation_table_length = (file.readUnsignedShort()); annotation_table = new AnnotationEntry[annotation_table_length]; for (int i = 0; i < annotation_table_length; i++) { - annotation_table[i] = new AnnotationEntry(file, constant_pool); +// TODO isRuntimeVisible + annotation_table[i] = AnnotationEntry.read(file, constant_pool, false); } } diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index b547eff2..39429862 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -38,7 +38,7 @@ public class RuntimeInvisibleAnnotations extends Annotations { */ RuntimeInvisibleAnnotations(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS, name_index, length, file, constant_pool); + super(Constants.ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS, name_index, length, file, constant_pool, false); } diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index d8a3f7ba..d0d41cc2 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -36,12 +36,12 @@ public class RuntimeVisibleAnnotations extends Annotations { * @param file Input stream * @param constant_pool Array of constants */ - RuntimeVisibleAnnotations(int name_index, int length, DataInputStream file, + public RuntimeVisibleAnnotations(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS, name_index, length, file, constant_pool); + super(Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS, name_index, length, file, constant_pool, true); } - - + + /** * @return deep copy of this attribute */ diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java index 1f776a75..d22f3cbb 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -24,7 +24,7 @@ public class SimpleElementValue extends ElementValue { private int index; - protected SimpleElementValue(int type, int index, ConstantPool cpool) + public SimpleElementValue(int type, int index, ConstantPool cpool) { super(type, cpool); this.index = index; diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 14008a42..86508350 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -20,6 +20,8 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.CharArrayReader; import java.io.CharArrayWriter; +import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.FilterReader; import java.io.FilterWriter; import java.io.IOException; @@ -33,6 +35,8 @@ import java.util.Locale; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import org.apache.bcel.Constants; +import org.apache.bcel.generic.AnnotationEntryGen; +import org.apache.bcel.generic.ConstantPoolGen; import org.apache.bcel.util.ByteSequence; /** @@ -1339,4 +1343,73 @@ public abstract class Utility { } return buf.toString(); } + + + /** + * Converts a list of AnnotationGen objects into a set of attributes + * that can be attached to the class file. + * + * @param cp The constant pool gen where we can create the necessary name refs + * @param vec A list of AnnotationGen objects + */ + public static Attribute[] getAnnotationAttributes(ConstantPoolGen cp,List vec) { + + if (vec.size()==0) return null; + + try { + int countVisible = 0; + int countInvisible = 0; + + // put the annotations in the right output stream + for (int i=0; i2) rvaIndex = cp.addUtf8("RuntimeVisibleAnnotations"); + if (riaData.length>2) riaIndex = cp.addUtf8("RuntimeInvisibleAnnotations"); + + List newAttributes = new ArrayList(); + if (rvaData.length>2) { + + newAttributes.add( + new RuntimeVisibleAnnotations(rvaIndex,rvaData.length,new DataInputStream(new ByteArrayInputStream(rvaData)),cp.getConstantPool())); + } + if (riaData.length>2) { + newAttributes.add( + new RuntimeInvisibleAnnotations(riaIndex,riaData.length,new DataInputStream(new ByteArrayInputStream(riaData)),cp.getConstantPool())); + } + + return (Attribute[])newAttributes.toArray(new Attribute[]{}); + } catch (IOException e) { + System.err.println("IOException whilst processing annotations"); + e.printStackTrace(); + } + return null; + } } diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java new file mode 100755 index 00000000..c54cd796 --- /dev/null +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -0,0 +1,190 @@ +package org.apache.bcel.generic; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ElementValuePair; + + +public class AnnotationEntryGen +{ + private int typeIndex; + + private List /* ElementNameValuePairGen */evs; + + private ConstantPoolGen cpool; + + private boolean isRuntimeVisible = false; + + /** + * Here we are taking a fixed annotation of type Annotation and building a + * modifiable AnnotationGen object. If the pool passed in is for a different + * class file, then copyPoolEntries should have been passed as true as that + * will force us to do a deep copy of the annotation and move the cpool + * entries across. We need to copy the type and the element name value pairs + * and the visibility. + */ + public AnnotationEntryGen(AnnotationEntry a, ConstantPoolGen cpool, + boolean copyPoolEntries) + { + this.cpool = cpool; + if (copyPoolEntries) + { + typeIndex = cpool.addUtf8(a.getAnnotationType()); + } + else + { + typeIndex = a.getAnnotationTypeIndex(); + } + isRuntimeVisible = a.isRuntimeVisible(); + evs = copyValues(a.getElementValuePairs(), cpool, copyPoolEntries); + } + + private List copyValues(ElementValuePair[] in, ConstantPoolGen cpool, + boolean copyPoolEntries) + { + List out = new ArrayList(); + int l = in.length; + for (int i = 0; i < l; i++) + { + ElementValuePair nvp = (ElementValuePair) in[i]; + out.add(new ElementValuePairGen(nvp, cpool, copyPoolEntries)); + } + return out; + } + + private AnnotationEntryGen(ConstantPoolGen cpool) + { + this.cpool = cpool; + } + + /** + * Retrieve an immutable version of this AnnotationGen + */ + public AnnotationEntry getAnnotation() + { + AnnotationEntry a = new AnnotationEntry(typeIndex, cpool.getConstantPool(), + isRuntimeVisible); + for (Iterator iter = evs.iterator(); iter.hasNext();) + { + ElementValuePairGen element = (ElementValuePairGen) iter + .next(); + a.addElementNameValuePair(element.getElementNameValuePair()); + } + return a; + } + + public AnnotationEntryGen(ObjectType type, + List /* ElementNameValuePairGen */elements, boolean vis, + ConstantPoolGen cpool) + { + this.cpool = cpool; + this.typeIndex = cpool.addUtf8(type.getSignature()); + evs = elements; + isRuntimeVisible = vis; + } + + public static AnnotationEntryGen read(DataInputStream dis, + ConstantPoolGen cpool, boolean b) throws IOException + { + AnnotationEntryGen a = new AnnotationEntryGen(cpool); + a.typeIndex = dis.readUnsignedShort(); + int elemValuePairCount = dis.readUnsignedShort(); + for (int i = 0; i < elemValuePairCount; i++) + { + int nidx = dis.readUnsignedShort(); + a.addElementNameValuePair(new ElementValuePairGen(nidx, + ElementValueGen.readElementValue(dis, cpool), cpool)); + } + a.isRuntimeVisible(b); + return a; + } + + public void dump(DataOutputStream dos) throws IOException + { + dos.writeShort(typeIndex); // u2 index of type name in cpool + dos.writeShort(evs.size()); // u2 element_value pair count + for (int i = 0; i < evs.size(); i++) + { + ElementValuePairGen envp = (ElementValuePairGen) evs.get(i); + envp.dump(dos); + } + } + + public void addElementNameValuePair(ElementValuePairGen evp) + { + if (evs == null) + evs = new ArrayList(); + evs.add(evp); + } + + public int getTypeIndex() + { + return typeIndex; + } + + public final String getTypeSignature() + { + // ConstantClass c = (ConstantClass)cpool.getConstant(typeIndex); + ConstantUtf8 utf8 = (ConstantUtf8) cpool + .getConstant(typeIndex/* c.getNameIndex() */); + return utf8.getBytes(); + } + + public final String getTypeName() + { + return getTypeSignature();// BCELBUG: Should I use this instead? + // Utility.signatureToString(getTypeSignature()); + } + + /** + * Returns list of ElementNameValuePair objects + */ + public List getValues() + { + return evs; + } + + public String toString() + { + StringBuffer s = new StringBuffer(); + s.append("AnnotationGen:[" + getTypeName() + " #" + evs.size() + " {"); + for (int i = 0; i < evs.size(); i++) + { + s.append(evs.get(i)); + if (i + 1 < evs.size()) + s.append(","); + } + s.append("}]"); + return s.toString(); + } + + public String toShortString() + { + StringBuffer s = new StringBuffer(); + s.append("@" + getTypeName() + "("); + for (int i = 0; i < evs.size(); i++) + { + s.append(evs.get(i)); + if (i + 1 < evs.size()) + s.append(","); + } + s.append(")"); + return s.toString(); + } + + private void isRuntimeVisible(boolean b) + { + isRuntimeVisible = b; + } + + public boolean isRuntimeVisible() + { + return isRuntimeVisible; + } +} diff --git a/src/main/java/org/apache/bcel/generic/AnnotationGen.java b/src/main/java/org/apache/bcel/generic/AnnotationGen.java index fbea506f..e69de29b 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationGen.java @@ -1,5 +0,0 @@ -package org.apache.bcel.generic; - -public class AnnotationGen -{ -} diff --git a/src/main/java/org/apache/bcel/generic/ElementNameValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementNameValuePairGen.java index c0cd4598..e69de29b 100644 --- a/src/main/java/org/apache/bcel/generic/ElementNameValuePairGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementNameValuePairGen.java @@ -1,5 +0,0 @@ -package org.apache.bcel.generic; - -public class ElementNameValuePairGen -{ -} diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java index 95ed4cd5..27f7f0cc 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -98,8 +98,8 @@ public abstract class ElementValueGen case 'e': // Enum constant return new EnumElementValueGen(dis.readUnsignedShort(), dis .readUnsignedShort(), cpGen); - case 'c': // Class - return new ClassElementValueGen(dis.readUnsignedShort(), cpGen); + // case 'c': // Class + // return new ClassElementValueGen(dis.readUnsignedShort(), cpGen); // // case '@': // Annotation // return new @@ -147,15 +147,15 @@ public abstract class ElementValueGen case 'e': // Enum constant return new EnumElementValueGen((EnumElementValue) value, cpool, copyPoolEntries); - case '@': // Annotation - return new AnnotationElementValueGen( - (AnnotationElementValue) value, cpool, copyPoolEntries); - case '[': // Array - return new ArrayElementValueGen((ArrayElementValue) value, cpool, - copyPoolEntries); - case 'c': // Class - return new ClassElementValueGen((ClassElementValue) value, cpool, - copyPoolEntries); + // case '@': // Annotation + // return new AnnotationElementValueGen( + // (AnnotationElementValue) value, cpool, copyPoolEntries); + // case '[': // Array + // return new ArrayElementValueGen((ArrayElementValue) value, cpool, + // copyPoolEntries); + // case 'c': // Class + // return new ClassElementValueGen((ClassElementValue) value, cpool, + // copyPoolEntries); default: throw new RuntimeException("Not implemented yet! (" + value.getElementValueType() + ")"); diff --git a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java new file mode 100755 index 00000000..81e69d41 --- /dev/null +++ b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java @@ -0,0 +1,93 @@ +package org.apache.bcel.generic; + +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ElementValue; +import org.apache.bcel.classfile.ElementValuePair; + +public class ElementValuePairGen +{ + private int nameIdx; + + private ElementValueGen value; + + private ConstantPoolGen cpool; + + public ElementValuePairGen(ElementValuePair nvp, ConstantPoolGen cpool, + boolean copyPoolEntries) + { + this.cpool = cpool; + // J5ASSERT: + // Could assert nvp.getNameString() points to the same thing as + // cpool.getConstant(nvp.getNameIndex()) + // if + // (!nvp.getNameString().equals(((ConstantUtf8)cpool.getConstant(nvp.getNameIndex())).getBytes())) + // { + // throw new RuntimeException("envp buggered"); + // } + if (copyPoolEntries) + { + nameIdx = cpool.addUtf8(nvp.getNameString()); + } + else + { + nameIdx = nvp.getNameIndex(); + } + value = ElementValueGen.copy(nvp.getValue(), cpool, copyPoolEntries); + } + + /** + * Retrieve an immutable version of this ElementNameValuePairGen + */ + public ElementValuePair getElementNameValuePair() + { + ElementValue immutableValue = value.getElementValue(); + return new ElementValuePair(nameIdx, immutableValue, cpool + .getConstantPool()); + } + + protected ElementValuePairGen(int idx, ElementValueGen value, + ConstantPoolGen cpool) + { + this.nameIdx = idx; + this.value = value; + this.cpool = cpool; + } + + public ElementValuePairGen(String name, ElementValueGen value, + ConstantPoolGen cpool) + { + this.nameIdx = cpool.addUtf8(name); + this.value = value; + this.cpool = cpool; + } + + protected void dump(DataOutputStream dos) throws IOException + { + dos.writeShort(nameIdx); // u2 name of the element + value.dump(dos); + } + + public int getNameIndex() + { + return nameIdx; + } + + public final String getNameString() + { + // ConstantString cu8 = (ConstantString)cpool.getConstant(nameIdx); + return ((ConstantUtf8) cpool.getConstant(nameIdx)).getBytes(); + } + + public final ElementValueGen getValue() + { + return value; + } + + public String toString() + { + return "ElementValuePair:[" + getNameString() + "=" + + value.stringifyValue() + "]"; + } +} diff --git a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java new file mode 100644 index 00000000..a2f56870 --- /dev/null +++ b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java @@ -0,0 +1,119 @@ +package org.apache.bcel.generic; + +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ElementValue; +import org.apache.bcel.classfile.EnumElementValue; + +public class EnumElementValueGen extends ElementValueGen +{ + // For enum types, these two indices point to the type and value + private int typeIdx; + + private int valueIdx; + + /** + * This ctor assumes the constant pool already contains the right type and + * value - as indicated by typeIdx and valueIdx. This ctor is used for + * deserialization + */ + protected EnumElementValueGen(int typeIdx, int valueIdx, + ConstantPoolGen cpool) + { + super(ElementValueGen.ENUM_CONSTANT, cpool); + if (type != ENUM_CONSTANT) + throw new RuntimeException( + "Only element values of type enum can be built with this ctor"); + this.typeIdx = typeIdx; + this.valueIdx = valueIdx; + } + + /** + * Return immutable variant of this EnumElementValue + */ + public ElementValue getElementValue() + { + System.err.println("Duplicating value: " + getEnumTypeString() + ":" + + getEnumValueString()); + return new EnumElementValue(type, typeIdx, valueIdx, cpGen + .getConstantPool()); + } + + public EnumElementValueGen(ObjectType t, String value, ConstantPoolGen cpool) + { + super(ElementValueGen.ENUM_CONSTANT, cpool); + typeIdx = cpool.addUtf8(t.getSignature());// was addClass(t); + valueIdx = cpool.addUtf8(value);// was addString(value); + } + + public EnumElementValueGen(EnumElementValue value, ConstantPoolGen cpool, + boolean copyPoolEntries) + { + super(ENUM_CONSTANT, cpool); + if (copyPoolEntries) + { + typeIdx = cpool.addUtf8(value.getEnumTypeString());// was + // addClass(value.getEnumTypeString()); + valueIdx = cpool.addUtf8(value.getEnumValueString()); // was + // addString(value.getEnumValueString()); + } + else + { + typeIdx = value.getTypeIndex(); + valueIdx = value.getValueIndex(); + } + } + + public void dump(DataOutputStream dos) throws IOException + { + dos.writeByte(type); // u1 type of value (ENUM_CONSTANT == 'e') + dos.writeShort(typeIdx); // u2 + dos.writeShort(valueIdx); // u2 + } + + public String stringifyValue() + { + ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant( + valueIdx); + return cu8.getBytes(); + // ConstantString cu8 = + // (ConstantString)getConstantPool().getConstant(valueIdx); + // return + // ((ConstantUtf8)getConstantPool().getConstant(cu8.getStringIndex())).getBytes(); + } + + // BCELBUG: Should we need to call utility.signatureToString() on the output + // here? + public String getEnumTypeString() + { + // Constant cc = getConstantPool().getConstant(typeIdx); + // ConstantClass cu8 = + // (ConstantClass)getConstantPool().getConstant(typeIdx); + // return + // ((ConstantUtf8)getConstantPool().getConstant(cu8.getNameIndex())).getBytes(); + return ((ConstantUtf8) getConstantPool().getConstant(typeIdx)) + .getBytes(); + // return Utility.signatureToString(cu8.getBytes()); + } + + public String getEnumValueString() + { + return ((ConstantUtf8) getConstantPool().getConstant(valueIdx)) + .getBytes(); + // ConstantString cu8 = + // (ConstantString)getConstantPool().getConstant(valueIdx); + // return + // ((ConstantUtf8)getConstantPool().getConstant(cu8.getStringIndex())).getBytes(); + } + + public int getValueIndex() + { + return valueIdx; + } + + public int getTypeIndex() + { + return typeIdx; + } +} diff --git a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java index 66d3e0b3..e026d68e 100644 --- a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java @@ -1,5 +1,245 @@ package org.apache.bcel.generic; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ElementValue; +import org.apache.bcel.classfile.SimpleElementValue; + public class SimpleElementValueGen extends ElementValueGen { + // For primitive types and string type, this points to the value entry in + // the cpGen + // For 'class' this points to the class entry in the cpGen + private int idx; + + // ctors for each supported type... type could be inferred but for now lets + // force it to be passed + /** + * Protected ctor used for deserialization, doesn't *put* an entry in the + * constant pool, assumes the one at the supplied index is correct. + */ + protected SimpleElementValueGen(int type, int idx, ConstantPoolGen cpGen) + { + super(type, cpGen); + this.idx = idx; + } + + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, int value) + { + super(type, cpGen); + idx = cpGen.addInteger(value); + } + + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, long value) + { + super(type, cpGen); + idx = cpGen.addLong(value); + } + + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, double value) + { + super(type, cpGen); + idx = cpGen.addDouble(value); + } + + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, float value) + { + super(type, cpGen); + idx = cpGen.addFloat(value); + } + + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, short value) + { + super(type, cpGen); + idx = cpGen.addInteger(value); + } + + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, byte value) + { + super(type, cpGen); + idx = cpGen.addInteger(value); + } + + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, char value) + { + super(type, cpGen); + idx = cpGen.addInteger(value); + } + + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, boolean value) + { + super(type, cpGen); + if (value) + idx = cpGen.addInteger(1); + else + idx = cpGen.addInteger(0); + } + + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, String value) + { + super(type, cpGen); + idx = cpGen.addUtf8(value); + } + + /** + * The boolean controls whether we copy info from the 'old' constant pool to + * the 'new'. You need to use this ctor if the annotation is being copied + * from one file to another. + */ + public SimpleElementValueGen(SimpleElementValue value, + ConstantPoolGen cpool, boolean copyPoolEntries) + { + super(value.getElementValueType(), cpool); + if (!copyPoolEntries) + { + // J5ASSERT: Could assert value.stringifyValue() is the same as + // cpool.getConstant(SimpleElementValuevalue.getIndex()) + idx = value.getIndex(); + } + else + { + switch (value.getElementValueType()) + { + case STRING: + idx = cpool.addUtf8(value.getValueString()); + break; + case PRIMITIVE_INT: + idx = cpool.addInteger(value.getValueInt()); + break; + case PRIMITIVE_BYTE: + idx = cpool.addInteger(value.getValueByte()); + break; + case PRIMITIVE_CHAR: + idx = cpool.addInteger(value.getValueChar()); + break; + case PRIMITIVE_LONG: + idx = cpool.addLong(value.getValueLong()); + break; + case PRIMITIVE_FLOAT: + idx = cpool.addFloat(value.getValueFloat()); + break; + case PRIMITIVE_DOUBLE: + idx = cpool.addDouble(value.getValueDouble()); + break; + case PRIMITIVE_BOOLEAN: + if (value.getValueBoolean()) + { + idx = cpool.addInteger(1); + } + else + { + idx = cpool.addInteger(0); + } + break; + case PRIMITIVE_SHORT: + idx = cpool.addInteger(value.getValueShort()); + break; + default: + throw new RuntimeException( + "SimpleElementValueGen class does not know how " + + "to copy this type " + type); + } + } + } + + /** + * Return immutable variant + */ + public ElementValue getElementValue() + { + return new SimpleElementValue(type, idx, cpGen.getConstantPool()); + } + + public int getIndex() + { + return idx; + } + + public String getValueString() + { + if (type != STRING) + throw new RuntimeException( + "Dont call getValueString() on a non STRING ElementValue"); + ConstantUtf8 c = (ConstantUtf8) cpGen.getConstant(idx); + return c.getBytes(); + } + + public int getValueInt() + { + if (type != PRIMITIVE_INT) + throw new RuntimeException( + "Dont call getValueString() on a non STRING ElementValue"); + ConstantInteger c = (ConstantInteger) cpGen.getConstant(idx); + return c.getBytes(); + } + + // Whatever kind of value it is, return it as a string + public String stringifyValue() + { + switch (type) + { + case PRIMITIVE_INT: + ConstantInteger c = (ConstantInteger) cpGen.getConstant(idx); + return Integer.toString(c.getBytes()); + case PRIMITIVE_LONG: + ConstantLong j = (ConstantLong) cpGen.getConstant(idx); + return Long.toString(j.getBytes()); + case PRIMITIVE_DOUBLE: + ConstantDouble d = (ConstantDouble) cpGen.getConstant(idx); + return Double.toString(d.getBytes()); + case PRIMITIVE_FLOAT: + ConstantFloat f = (ConstantFloat) cpGen.getConstant(idx); + return Float.toString(f.getBytes()); + case PRIMITIVE_SHORT: + ConstantInteger s = (ConstantInteger) cpGen.getConstant(idx); + return Integer.toString(s.getBytes()); + case PRIMITIVE_BYTE: + ConstantInteger b = (ConstantInteger) cpGen.getConstant(idx); + return Integer.toString(b.getBytes()); + case PRIMITIVE_CHAR: + ConstantInteger ch = (ConstantInteger) cpGen.getConstant(idx); + return Integer.toString(ch.getBytes()); + case PRIMITIVE_BOOLEAN: + ConstantInteger bo = (ConstantInteger) cpGen.getConstant(idx); + if (bo.getBytes() == 0) + return "false"; + if (bo.getBytes() != 0) + return "true"; + case STRING: + ConstantUtf8 cu8 = (ConstantUtf8) cpGen.getConstant(idx); + return cu8.getBytes(); + default: + throw new RuntimeException( + "SimpleElementValueGen class does not know how to stringify type " + + type); + } + } + + public void dump(DataOutputStream dos) throws IOException + { + dos.writeByte(type); // u1 kind of value + switch (type) + { + case PRIMITIVE_INT: + case PRIMITIVE_BYTE: + case PRIMITIVE_CHAR: + case PRIMITIVE_FLOAT: + case PRIMITIVE_LONG: + case PRIMITIVE_BOOLEAN: + case PRIMITIVE_SHORT: + case PRIMITIVE_DOUBLE: + case STRING: + dos.writeShort(idx); + break; + default: + throw new RuntimeException( + "SimpleElementValueGen doesnt know how to write out type " + + type); + } + } } diff --git a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java b/src/test/java/org/apache/bcel/AnnotationGenTestCase.java index e8928ca9..f2efe85a 100644 --- a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/bcel/AnnotationGenTestCase.java @@ -8,15 +8,16 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Vector; +import org.apache.bcel.classfile.Annotations; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.RuntimeInvisibleAnnotations; import org.apache.bcel.classfile.RuntimeVisibleAnnotations; import org.apache.bcel.classfile.Utility; -import org.apache.bcel.generic.AnnotationGen; +import org.apache.bcel.generic.AnnotationEntryGen; import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.ElementNameValuePairGen; import org.apache.bcel.generic.ElementValueGen; +import org.apache.bcel.generic.ElementValuePairGen; import org.apache.bcel.generic.ObjectType; import org.apache.bcel.generic.SimpleElementValueGen; @@ -40,7 +41,7 @@ public class AnnotationGenTestCase extends AbstractTestCase SimpleElementValueGen evg = new SimpleElementValueGen( ElementValueGen.PRIMITIVE_INT, cp, 4); // Give it a name, call it 'id' - ElementNameValuePairGen nvGen = new ElementNameValuePairGen("id", evg, + ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, cp); // Check it looks right assertTrue( @@ -51,7 +52,7 @@ public class AnnotationGenTestCase extends AbstractTestCase elements.add(nvGen); // Build an annotation of type 'SimpleAnnotation' with 'id=4' as the // only value :) - AnnotationGen a = new AnnotationGen(t, elements, true, cp); + AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); // Check we can save and load it ok checkSerialize(a, cp); } @@ -65,7 +66,7 @@ public class AnnotationGenTestCase extends AbstractTestCase SimpleElementValueGen evg = new SimpleElementValueGen( ElementValueGen.PRIMITIVE_INT, cp, 4); // Give it a name, call it 'id' - ElementNameValuePairGen nvGen = new ElementNameValuePairGen("id", evg, + ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, cp); // Check it looks right assertTrue( @@ -76,7 +77,7 @@ public class AnnotationGenTestCase extends AbstractTestCase elements.add(nvGen); // Build a RV annotation of type 'SimpleAnnotation' with 'id=4' as the // only value :) - AnnotationGen a = new AnnotationGen(t, elements, true, cp); + AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); Vector v = new Vector(); v.add(a); Attribute[] attributes = Utility.getAnnotationAttributes(cp, v); @@ -86,14 +87,14 @@ public class AnnotationGenTestCase extends AbstractTestCase Attribute attribute = attributes[i]; if (attribute instanceof RuntimeVisibleAnnotations) { - assertTrue(((RuntimeAnnotations) attribute).areVisible()); + assertTrue(((Annotations) attribute).isRuntimeVisible()); foundRV = true; } } assertTrue("Should have seen a RuntimeVisibleAnnotation", foundRV); // Build a RIV annotation of type 'SimpleAnnotation' with 'id=4' as the // only value :) - AnnotationGen a2 = new AnnotationGen(t, elements, false, cp); + AnnotationEntryGen a2 = new AnnotationEntryGen(t, elements, false, cp); Vector v2 = new Vector(); v2.add(a2); Attribute[] attributes2 = Utility.getAnnotationAttributes(cp, v2); @@ -103,14 +104,14 @@ public class AnnotationGenTestCase extends AbstractTestCase Attribute attribute = attributes2[i]; if (attribute instanceof RuntimeInvisibleAnnotations) { - assertFalse(((RuntimeAnnotations) attribute).areVisible()); + assertFalse(((Annotations) attribute).isRuntimeVisible()); foundRIV = true; } } assertTrue("Should have seen a RuntimeInvisibleAnnotation", foundRIV); } - private void checkSerialize(AnnotationGen a, ConstantPoolGen cpg) + private void checkSerialize(AnnotationEntryGen a, ConstantPoolGen cpg) { try { @@ -124,7 +125,7 @@ public class AnnotationGenTestCase extends AbstractTestCase byte[] bs = baos.toByteArray(); ByteArrayInputStream bais = new ByteArrayInputStream(bs); DataInputStream dis = new DataInputStream(bais); - AnnotationGen annAfter = AnnotationGen.read(dis, cpg, a + AnnotationEntryGen annAfter = AnnotationEntryGen.read(dis, cpg, a .isRuntimeVisible()); dis.close(); String afterName = annAfter.getTypeName(); @@ -142,9 +143,9 @@ public class AnnotationGenTestCase extends AbstractTestCase } for (int i = 0; i < a.getValues().size(); i++) { - ElementNameValuePairGen beforeElement = (ElementNameValuePairGen) a + ElementValuePairGen beforeElement = (ElementValuePairGen) a .getValues().get(i); - ElementNameValuePairGen afterElement = (ElementNameValuePairGen) annAfter + ElementValuePairGen afterElement = (ElementValuePairGen) annAfter .getValues().get(i); if (!beforeElement.getNameString().equals( afterElement.getNameString())) -- GitLab From da4ec29493d9497e9fc4b41910716613826530de Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Tue, 11 Jul 2006 01:57:19 +0000 Subject: [PATCH 0352/1313] GSoC: latest changes from Dmitriy Khayredinov git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@420672 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AnnotationEntry.java | 20 +++- .../apache/bcel/classfile/Annotations.java | 4 +- .../bcel/classfile/ElementValuePair.java | 8 ++ .../apache/bcel/classfile/FieldOrMethod.java | 102 ++++++++++++++-- .../org/apache/bcel/classfile/JavaClass.java | 72 +++++++++++- .../org/apache/bcel/generic/ClassGen.java | 69 ++++++++++- .../apache/bcel/generic/ElementValueGen.java | 38 +++--- .../bcel/generic/FieldGenOrMethodGen.java | 22 ++++ .../org/apache/bcel/AbstractTestCase.java | 109 ++++++++++++++++++ .../apache/bcel/CounterVisitorTestCase.java | 2 +- .../java/org/apache/bcel/data/MarkedType.java | 7 ++ .../apache/bcel/data/MarkerAnnotation.java | 8 ++ .../bcel/data/MarkerAnnotationInvisible.java | 6 + 13 files changed, 433 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 7ee21574..3a1f45b0 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -106,7 +106,7 @@ public class AnnotationEntry implements Node, Constants { */ public ElementValuePair[] getElementValuePairs() { // TOFO return List - return (ElementValuePair[]) element_value_pairs.toArray(); + return (ElementValuePair[]) element_value_pairs.toArray(new ElementValuePair[element_value_pairs.size()]); } @@ -125,4 +125,22 @@ public class AnnotationEntry implements Node, Constants { { element_value_pairs.add(elementNameValuePair); } + + public String toShortString() + { + StringBuffer result = new StringBuffer(); + result.append("@"); + result.append(getAnnotationType()); + if (getElementValuePairs().length > 0) + { + result.append("("); + for (int i = 0; i < getElementValuePairs().length; i++) + { + ElementValuePair element = getElementValuePairs()[i]; + result.append(element.toShortString()); + } + result.append(")"); + } + return result.toString(); + } } diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index ce932d8a..235cbce1 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -87,12 +87,14 @@ public abstract class Annotations extends Attribute { } + // TODO: update method names /** * @return the annotation entry table */ + /* public final AnnotationEntry[] getAnnotationTable() { return annotation_table; - } + }*/ /** diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index 74754639..f24a7aac 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -57,4 +57,12 @@ public class ElementValuePair { return elementNameIndex; } + + public String toShortString() + { + StringBuffer result = new StringBuffer(); + result.append(getNameString()).append("=").append( + getValue().toShortString()); + return result.toString(); + } } diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index 0d1adcd3..63a970c1 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -19,7 +19,11 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import org.apache.bcel.Constants; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Signature; /** * Abstract super class for fields and methods. @@ -33,8 +37,15 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No protected int signature_index; // Points to encoded signature protected int attributes_count; // No. of attributes protected Attribute[] attributes; // Collection of attributes + protected AnnotationEntry[] annotationEntries; // annotations defined on the field or method protected ConstantPool constant_pool; + private String signatureAttributeString = null; + private boolean searchedForSignatureAttribute = false; + + + // Annotations are collected from certain attributes, don't do it more than necessary! + private boolean annotationsOutOfDate = true; FieldOrMethod() { } @@ -191,16 +202,87 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * @return deep copy of this field */ protected FieldOrMethod copy_( ConstantPool _constant_pool ) { + FieldOrMethod c = null; + try { - FieldOrMethod c = (FieldOrMethod) clone(); - c.constant_pool = _constant_pool; - c.attributes = new Attribute[attributes_count]; - for (int i = 0; i < attributes_count; i++) { - c.attributes[i] = attributes[i].copy(_constant_pool); - } - return c; - } catch (CloneNotSupportedException e) { - return null; - } + c = (FieldOrMethod)clone(); + } catch(CloneNotSupportedException e) {} + + c.constant_pool = constant_pool; + c.attributes = new Attribute[attributes_count]; + + for(int i=0; i < attributes_count; i++) + c.attributes[i] = attributes[i].copy(constant_pool); + + return c; } + + /** + * Ensure we have unpacked any attributes that contain annotations. + * We don't remove these annotation attributes from the attributes list, they + * remain there. + */ + private void ensureAnnotationsUpToDate() + { + if (annotationsOutOfDate) + { + // Find attributes that contain annotation data + Attribute[] attrs = getAttributes(); + List accumulatedAnnotations = new ArrayList(); + for (int i = 0; i < attrs.length; i++) + { + Attribute attribute = attrs[i]; + if (attribute instanceof Annotations) + { + Annotations annotations = (Annotations) attribute; + for (int j = 0; i < annotations.getAnnotationEntries().length; i++) + accumulatedAnnotations.add(annotations + .getAnnotationEntries()[j]); + } + } + annotationEntries = (AnnotationEntry[]) accumulatedAnnotations + .toArray(new AnnotationEntry[] {}); + annotationsOutOfDate = false; + } + } + + public AnnotationEntry[] getAnnotationEntries() + { + ensureAnnotationsUpToDate(); + return annotationEntries; + } + + public void addAnnotationEntry(AnnotationEntry a) + { + ensureAnnotationsUpToDate(); + int len = annotationEntries.length; + AnnotationEntry[] newAnnotations = new AnnotationEntry[len + 1]; + System.arraycopy(annotationEntries, 0, newAnnotations, 0, len); + newAnnotations[len] = a; + annotationEntries = newAnnotations; + } + + /** + * Hunts for a signature attribute on the member and returns its contents. So where the 'regular' signature + * may be (Ljava/util/Vector;)V the signature attribute may in fact say 'Ljava/lang/Vector;' + * Coded for performance - searches for the attribute only when requested - only searches for it once. + */ + public final String getGenericSignature() + { + if (!searchedForSignatureAttribute) + { + boolean found = false; + for (int i = 0; !found && i < attributes_count; i++) + { + if (attributes[i] instanceof Signature) + { + signatureAttributeString = ((Signature) attributes[i]) + .getSignature(); + found = true; + } + } + searchedForSignatureAttribute = true; + } + return signatureAttributeString; + } } diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 27bdf02a..e019e0dc 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -61,12 +61,21 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl private Field[] fields; // Fields, i.e., variables of class private Method[] methods; // methods defined in the class private Attribute[] attributes; // attributes defined in the class + private AnnotationEntry[] annotations; // annotations defined on the class private byte source = HEAP; // Generated in memory + private boolean isGeneric = false; + private boolean isAnonymous = false; + private boolean isNested = false; + private boolean computedNestedTypeStatus = false; public static final byte HEAP = 1; public static final byte FILE = 2; public static final byte ZIP = 3; static boolean debug = false; // Debugging on/off static char sep = '/'; // directory separator + + // Annotations are collected from certain attributes, don't do it more than necessary! + private boolean annotationsOutOfDate = true; + private static BCELComparator _cmp = new BCELComparator() { public boolean equals( Object o1, Object o2 ) { @@ -134,6 +143,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl this.fields = fields; this.methods = methods; this.attributes = attributes; + annotationsOutOfDate = true; this.source = source; // Get source file name if available for (int i = 0; i < attributes.length; i++) { @@ -325,8 +335,25 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public Attribute[] getAttributes() { return attributes; } - - + + public AnnotationEntry[] getAnnotationEntries() { + if (annotationsOutOfDate) { + // Find attributes that contain annotation data + Attribute[] attrs = getAttributes(); + List accumulatedAnnotations = new ArrayList(); + for (int i = 0; i < attrs.length; i++) { + Attribute attribute = attrs[i]; + if (attribute instanceof Annotations) { + Annotations runtimeAnnotations = (Annotations)attribute; + for(int j = 0; j < runtimeAnnotations.getAnnotationEntries().length; j++) + accumulatedAnnotations.add(runtimeAnnotations.getAnnotationEntries()[j]); + } + } + annotations = (AnnotationEntry[])accumulatedAnnotations.toArray(new AnnotationEntry[]{}); + annotationsOutOfDate = false; + } + return annotations; + } /** * @return Class name. */ @@ -615,6 +642,12 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl buf.append(indent(attributes[i])); } } + AnnotationEntry[] annotations = getAnnotationEntries(); + if (annotations!=null && annotations.length>0) { + buf.append("\nAnnotation(s):\n"); + for (int i=0; i 0) { buf.append("\n").append(fields.length).append(" fields:\n"); for (int i = 0; i < fields.length; i++) { @@ -677,6 +710,41 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public final boolean isClass() { return (access_flags & Constants.ACC_INTERFACE) == 0; } + + public final boolean isAnonymous() { + computeNestedTypeStatus(); + return this.isAnonymous; + } + + public final boolean isNested() { + computeNestedTypeStatus(); + return this.isNested; + } + + private final void computeNestedTypeStatus() { + if (computedNestedTypeStatus) return; + for (int i = 0; i < this.attributes.length; i++) { + if (this.attributes[i] instanceof InnerClasses) { + InnerClass[] innerClasses = ((InnerClasses) this.attributes[i]).getInnerClasses(); + for (int j = 0; j < innerClasses.length; j++) { + boolean innerClassAttributeRefersToMe = false; + String inner_class_name = constant_pool.getConstantString(innerClasses[j].getInnerClassIndex(), + Constants.CONSTANT_Class); + inner_class_name = Utility.compactClassName(inner_class_name); + if (inner_class_name.equals(getClassName())) { + innerClassAttributeRefersToMe = true; + } + if (innerClassAttributeRefersToMe) { + this.isNested = true; + if (innerClasses[j].getInnerNameIndex() == 0) { + this.isAnonymous = true; + } + } + } + } + } + this.computedNestedTypeStatus = true; + } /** @return returns either HEAP (generated), FILE, or ZIP diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 7a1fc20d..7ead2518 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -21,12 +21,16 @@ import java.util.Iterator; import java.util.List; import org.apache.bcel.Constants; import org.apache.bcel.classfile.AccessFlags; +import org.apache.bcel.classfile.AnnotationEntry; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.classfile.Field; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.RuntimeInvisibleAnnotations; +import org.apache.bcel.classfile.RuntimeVisibleAnnotations; import org.apache.bcel.classfile.SourceFile; +import org.apache.bcel.classfile.Utility; import org.apache.bcel.util.BCELComparator; /** @@ -50,6 +54,9 @@ public class ClassGen extends AccessFlags implements Cloneable { private List method_vec = new ArrayList(); private List attribute_vec = new ArrayList(); private List interface_vec = new ArrayList(); + private List annotation_vec = new ArrayList(); + private boolean unpackedAnnotations = false; + private static BCELComparator _cmp = new BCELComparator() { public boolean equals( Object o1, Object o2 ) { @@ -127,6 +134,8 @@ public class ClassGen extends AccessFlags implements Cloneable { major = clazz.getMajor(); minor = clazz.getMinor(); Attribute[] attributes = clazz.getAttributes(); + // J5TODO: Could make unpacking lazy, done on first reference + AnnotationEntryGen[] annotations = unpackAnnotations(attributes); Method[] methods = clazz.getMethods(); Field[] fields = clazz.getFields(); String[] interfaces = clazz.getInterfaceNames(); @@ -136,6 +145,9 @@ public class ClassGen extends AccessFlags implements Cloneable { for (int i = 0; i < attributes.length; i++) { addAttribute(attributes[i]); } + for(int i=0; i < annotations.length; i++) { + addAnnotationEntry(annotations[i]); + } for (int i = 0; i < methods.length; i++) { addMethod(methods[i]); } @@ -143,6 +155,43 @@ public class ClassGen extends AccessFlags implements Cloneable { addField(fields[i]); } } + + /** + * Look for attributes representing annotations and unpack them. + */ + private AnnotationEntryGen[] unpackAnnotations(Attribute[] attrs) + { + List /* AnnotationGen */annotationGenObjs = new ArrayList(); + for (int i = 0; i < attrs.length; i++) + { + Attribute attr = attrs[i]; + if (attr instanceof RuntimeVisibleAnnotations) + { + RuntimeVisibleAnnotations rva = (RuntimeVisibleAnnotations) attr; + AnnotationEntry[] annos = rva.getAnnotationEntries(); + for (int j = 0; i < annos.length; i++) + { + AnnotationEntry a = annos[i]; + annotationGenObjs.add(new AnnotationEntryGen(a, + getConstantPool(), false)); + } + } + else + if (attr instanceof RuntimeInvisibleAnnotations) + { + RuntimeInvisibleAnnotations ria = (RuntimeInvisibleAnnotations) attr; + AnnotationEntry[] annos = ria.getAnnotationEntries(); + for (int j = 0; i < annos.length; i++) + { + AnnotationEntry a = annos[i]; + annotationGenObjs.add(new AnnotationEntryGen(a, + getConstantPool(), false)); + } + } + } + return (AnnotationEntryGen[]) annotationGenObjs + .toArray(new AnnotationEntryGen[] {}); + } /** @@ -152,7 +201,16 @@ public class ClassGen extends AccessFlags implements Cloneable { int[] interfaces = getInterfaces(); Field[] fields = getFields(); Method[] methods = getMethods(); - Attribute[] attributes = getAttributes(); + Attribute[] attributes = null; + if (annotation_vec.size()==0) { + attributes = getAttributes(); + } else { + // TODO: Sometime later, trash any attributes called 'RuntimeVisibleAnnotations' or 'RuntimeInvisibleAnnotations' + Attribute[] annAttributes = Utility.getAnnotationAttributes(cp,annotation_vec); + attributes = new Attribute[attribute_vec.size()+annAttributes.length]; + attribute_vec.toArray(attributes); + System.arraycopy(annAttributes,0,attributes,attribute_vec.size(),annAttributes.length); + } // Must be last since the above calls may still add something to it ConstantPool _cp = this.cp.getFinalConstantPool(); return new JavaClass(class_name_index, superclass_name_index, file_name, major, minor, @@ -217,6 +275,10 @@ public class ClassGen extends AccessFlags implements Cloneable { public void addAttribute( Attribute a ) { attribute_vec.add(a); } + + public void addAnnotationEntry(AnnotationEntryGen a) { + annotation_vec.add(a); + } /** @@ -421,6 +483,11 @@ public class ClassGen extends AccessFlags implements Cloneable { public Attribute[] getAttributes() { return (Attribute[]) attribute_vec.toArray(new Attribute[attribute_vec.size()]); } + + // J5TODO: Should we make calling unpackAnnotations() lazy and put it in here? + public AnnotationEntryGen[] getAnnotationEntries() { + return (AnnotationEntryGen[]) annotation_vec.toArray(new AnnotationEntryGen[annotation_vec.size()]); + } public ConstantPoolGen getConstantPool() { diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java index 27f7f0cc..f7b241e6 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -3,9 +3,10 @@ package org.apache.bcel.generic; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.classfile.AnnotationElementValue; +import java.util.ArrayList; +import java.util.List; +import org.apache.bcel.classfile.AnnotationEntry; import org.apache.bcel.classfile.ArrayElementValue; -import org.apache.bcel.classfile.ClassElementValue; import org.apache.bcel.classfile.ElementValue; import org.apache.bcel.classfile.EnumElementValue; import org.apache.bcel.classfile.SimpleElementValue; @@ -98,21 +99,22 @@ public abstract class ElementValueGen case 'e': // Enum constant return new EnumElementValueGen(dis.readUnsignedShort(), dis .readUnsignedShort(), cpGen); - // case 'c': // Class - // return new ClassElementValueGen(dis.readUnsignedShort(), cpGen); - // - // case '@': // Annotation - // return new - // AnnotationElementValueGen(ANNOTATION,Annotation.read(dis,cpGen),cpGen); - // - // case '[': // Array - // int numArrayVals = dis.readUnsignedShort(); - // List arrayVals = new ArrayList(); - // ElementValue[] evalues = new ElementValue[numArrayVals]; - // for (int j=0;j Date: Wed, 2 Aug 2006 09:39:32 +0000 Subject: [PATCH 0353/1313] GSoC: latest changes from Dmitriy Khayredinov git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@427943 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AnnotationEntry.java | 9 +- .../apache/bcel/classfile/Annotations.java | 8 + .../bcel/classfile/ElementValuePair.java | 7 + .../apache/bcel/classfile/FieldOrMethod.java | 6 +- .../RuntimeInvisibleAnnotations.java | 58 +- .../classfile/RuntimeVisibleAnnotations.java | 60 +- .../org/apache/bcel/classfile/Utility.java | 109 ++++ .../generic/AnnotationElementValueGen.java | 60 ++ .../bcel/generic/ArrayElementValueGen.java | 109 ++++ .../bcel/generic/ClassElementValueGen.java | 80 +++ .../org/apache/bcel/generic/ClassGen.java | 9 +- .../org/apache/bcel/generic/FieldGen.java | 19 + .../org/apache/bcel/generic/MethodGen.java | 142 +++- .../org/apache/bcel/AbstractTestCase.java | 18 +- .../apache/bcel/AnonymousClassTestCase.java | 40 ++ .../apache/bcel/ElementValueGenTestCase.java | 223 +++++++ .../EnclosingMethodAttributeTestCase.java | 89 +++ .../apache/bcel/EnumAccessFlagTestCase.java | 23 + .../apache/bcel/FieldAnnotationsTestCase.java | 145 +++++ .../GeneratingAnnotatedClassesTestCase.java | 609 ++++++++++++++++++ .../org/apache/bcel/data/AnnotatedFields.java | 7 + .../data/AnnotatedWithCombinedAnnotation.java | 6 + .../bcel/data/AnnotatedWithEnumClass.java | 6 + .../bcel/data/AnnotationEnumElement.java | 10 + .../apache/bcel/data/AnonymousClassTest.java | 22 + .../bcel/data/AttributeTestClassEM01.java | 15 + .../bcel/data/AttributeTestClassEM02.java | 16 + .../apache/bcel/data/CombinedAnnotation.java | 10 + .../bcel/data/ComplexAnnotatedClass.java | 6 + .../apache/bcel/data/ComplexAnnotation.java | 24 + .../bcel/data/SimpleAnnotatedClass.java | 6 + 31 files changed, 1888 insertions(+), 63 deletions(-) create mode 100644 src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java create mode 100644 src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java create mode 100644 src/main/java/org/apache/bcel/generic/ClassElementValueGen.java create mode 100644 src/test/java/org/apache/bcel/AnonymousClassTestCase.java create mode 100644 src/test/java/org/apache/bcel/ElementValueGenTestCase.java create mode 100644 src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java create mode 100644 src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java create mode 100644 src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java create mode 100644 src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java create mode 100644 src/test/java/org/apache/bcel/data/AnnotatedFields.java create mode 100644 src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java create mode 100644 src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java create mode 100644 src/test/java/org/apache/bcel/data/AnnotationEnumElement.java create mode 100644 src/test/java/org/apache/bcel/data/AnonymousClassTest.java create mode 100644 src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java create mode 100644 src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java create mode 100644 src/test/java/org/apache/bcel/data/CombinedAnnotation.java create mode 100644 src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java create mode 100644 src/test/java/org/apache/bcel/data/ComplexAnnotation.java create mode 100644 src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 3a1f45b0..6c29a392 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -110,9 +110,14 @@ public class AnnotationEntry implements Node, Constants { } - public void dump(DataOutputStream dos) + public void dump(DataOutputStream dos) throws IOException { - // TODO Auto-generated method stub + dos.writeShort(type_index); // u2 index of type name in cpool + dos.writeShort(element_value_pairs.size()); // u2 element_value pair count + for (int i = 0 ; iD. Brosius + * @author D. Brosius * @since 5.2 */ -public class RuntimeInvisibleAnnotations extends Annotations { +public class RuntimeInvisibleAnnotations extends Annotations +{ + /** + * @param name_index + * Index pointing to the name Code + * @param length + * Content length in bytes + * @param file + * Input stream + * @param constant_pool + * Array of constants + */ + RuntimeInvisibleAnnotations(int name_index, int length, + DataInputStream file, ConstantPool constant_pool) + throws IOException + { + super(Constants.ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS, name_index, length, + file, constant_pool, false); + } - /** - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - RuntimeInvisibleAnnotations(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS, name_index, length, file, constant_pool, false); - } + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) + { + Annotations c = (Annotations) clone(); + return c; + } - - /** - * @return deep copy of this attribute - */ - public Attribute copy( ConstantPool constant_pool ) { - Annotations c = (Annotations) clone(); - return c; - } + public final void dump(DataOutputStream dos) throws IOException + { + super.dump(dos); + writeAnnotations(dos); + } } diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index d0d41cc2..662d1af1 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -17,36 +17,50 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; /** - * represents an annotation that is represented in the class file - * and is provided to the JVM. + * represents an annotation that is represented in the class file and is + * provided to the JVM. * * @version $Id: RuntimeVisibleAnnotations - * @author D. Brosius + * @author D. Brosius * @since 5.2 */ -public class RuntimeVisibleAnnotations extends Annotations { +public class RuntimeVisibleAnnotations extends Annotations +{ + /** + * @param name_index + * Index pointing to the name Code + * @param length + * Content length in bytes + * @param file + * Input stream + * @param constant_pool + * Array of constants + */ + public RuntimeVisibleAnnotations(int name_index, int length, + DataInputStream file, ConstantPool constant_pool) + throws IOException + { + super(Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS, name_index, length, + file, constant_pool, true); + } - /** - * @param name_index Index pointing to the name Code - * @param length Content length in bytes - * @param file Input stream - * @param constant_pool Array of constants - */ - public RuntimeVisibleAnnotations(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS, name_index, length, file, constant_pool, true); - } - - - /** - * @return deep copy of this attribute - */ - public Attribute copy( ConstantPool constant_pool ) { - Annotations c = (Annotations) clone(); - return c; - } + /** + * @return deep copy of this attribute + */ + public Attribute copy(ConstantPool constant_pool) + { + Annotations c = (Annotations) clone(); + return c; + } + + public final void dump(DataOutputStream dos) throws IOException + { + super.dump(dos); + writeAnnotations(dos); + } } diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 86508350..94ba1882 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -30,6 +30,7 @@ import java.io.PrintWriter; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.zip.GZIPInputStream; @@ -1412,4 +1413,112 @@ public abstract class Utility { } return null; } + + + /** + * Annotations against a class are stored in one of four attribute kinds: + * - RuntimeVisibleParameterAnnotations + * - RuntimeInvisibleParameterAnnotations + */ + public static Attribute[] getParameterAnnotationAttributes( + ConstantPoolGen cp, + List[] /*Array of lists, array size depends on #params */vec) + { + int visCount[] = new int[vec.length]; + int totalVisCount = 0; + int invisCount[] = new int[vec.length]; + int totalInvisCount = 0; + try + { + for (int i = 0; i < vec.length; i++) + { + List l = vec[i]; + if (l != null) + { + for (Iterator iter = l.iterator(); iter.hasNext();) + { + AnnotationEntryGen element = (AnnotationEntryGen) iter.next(); + if (element.isRuntimeVisible()) + { + visCount[i]++; + totalVisCount++; + } + else + { + invisCount[i]++; + totalInvisCount++; + } + } + } + } + // Lets do the visible ones + ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); + DataOutputStream rvaDos = new DataOutputStream(rvaBytes); + rvaDos.writeByte(vec.length); // First goes number of parameters + for (int i = 0; i < vec.length; i++) + { + rvaDos.writeShort(visCount[i]); + if (visCount[i] > 0) + { + List l = vec[i]; + for (Iterator iter = l.iterator(); iter.hasNext();) + { + AnnotationEntryGen element = (AnnotationEntryGen) iter.next(); + if (element.isRuntimeVisible()) + element.dump(rvaDos); + } + } + } + rvaDos.close(); + // Lets do the invisible ones + ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); + DataOutputStream riaDos = new DataOutputStream(riaBytes); + riaDos.writeByte(vec.length); // First goes number of parameters + for (int i = 0; i < vec.length; i++) + { + riaDos.writeShort(invisCount[i]); + if (invisCount[i] > 0) + { + List l = vec[i]; + for (Iterator iter = l.iterator(); iter.hasNext();) + { + AnnotationEntryGen element = (AnnotationEntryGen) iter.next(); + if (!element.isRuntimeVisible()) + element.dump(riaDos); + } + } + } + riaDos.close(); + byte[] rvaData = rvaBytes.toByteArray(); + byte[] riaData = riaBytes.toByteArray(); + int rvaIndex = -1; + int riaIndex = -1; + if (totalVisCount > 0) + rvaIndex = cp.addUtf8("RuntimeVisibleParameterAnnotations"); + if (totalInvisCount > 0) + riaIndex = cp.addUtf8("RuntimeInvisibleParameterAnnotations"); + List newAttributes = new ArrayList(); + if (totalVisCount > 0) + { + newAttributes + .add(new RuntimeVisibleParameterAnnotations(rvaIndex, + rvaData.length, new DataInputStream(new ByteArrayInputStream(rvaData)), cp.getConstantPool())); + } + if (totalInvisCount > 0) + { + newAttributes + .add(new RuntimeInvisibleParameterAnnotations(riaIndex, + riaData.length, new DataInputStream(new ByteArrayInputStream(riaData)), cp.getConstantPool())); + } + return (Attribute[]) newAttributes.toArray(new Attribute[] {}); + } + catch (IOException e) + { + System.err + .println("IOException whilst processing parameter annotations"); + e.printStackTrace(); + } + return null; + } + } diff --git a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java new file mode 100644 index 00000000..e4906d16 --- /dev/null +++ b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java @@ -0,0 +1,60 @@ +package org.apache.bcel.generic; + +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.classfile.AnnotationElementValue; +import org.apache.bcel.classfile.ElementValue; + +public class AnnotationElementValueGen extends ElementValueGen +{ + // For annotation element values, this is the annotation + private AnnotationEntryGen a; + + public AnnotationElementValueGen(AnnotationEntryGen a, ConstantPoolGen cpool) + { + super(ANNOTATION, cpool); + this.a = a; + } + + public AnnotationElementValueGen(int type, AnnotationEntryGen annotation, + ConstantPoolGen cpool) + { + super(type, cpool); + if (type != ANNOTATION) + throw new RuntimeException( + "Only element values of type annotation can be built with this ctor"); + this.a = annotation; + } + + public AnnotationElementValueGen(AnnotationElementValue value, + ConstantPoolGen cpool, boolean copyPoolEntries) + { + super(ANNOTATION, cpool); + a = new AnnotationEntryGen(value.getAnnotationEntry(), cpool, copyPoolEntries); + } + + public void dump(DataOutputStream dos) throws IOException + { + dos.writeByte(type); // u1 type of value (ANNOTATION == '@') + a.dump(dos); + } + + public String stringifyValue() + { + throw new RuntimeException("Not implemented yet"); + } + + /** + * Return immutable variant of this AnnotationElementValueGen + */ + public ElementValue getElementValue() + { + return new AnnotationElementValue(this.type, a.getAnnotation(), cpGen + .getConstantPool()); + } + + public AnnotationEntryGen getAnnotation() + { + return a; + } +} diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java new file mode 100644 index 00000000..14b9432e --- /dev/null +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -0,0 +1,109 @@ +package org.apache.bcel.generic; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.apache.bcel.classfile.ArrayElementValue; +import org.apache.bcel.classfile.ElementValue; + +public class ArrayElementValueGen extends ElementValueGen +{ + // J5TODO: Should we make this an array or a list? A list would be easier to + // modify ... + private List /* ElementValueGen */evalues; + + public ArrayElementValueGen(ConstantPoolGen cp) + { + super(ARRAY, cp); + evalues = new ArrayList(); + } + + public ArrayElementValueGen(int type, ElementValue[] datums, + ConstantPoolGen cpool) + { + super(type, cpool); + if (type != ARRAY) + throw new RuntimeException( + "Only element values of type array can be built with this ctor"); + this.evalues = new ArrayList(); + for (int i = 0; i < datums.length; i++) + { + evalues.add(datums[i]); + } + } + + /** + * Return immutable variant of this ArrayElementValueGen + */ + public ElementValue getElementValue() + { + ElementValue[] immutableData = new ElementValue[evalues.size()]; + int i = 0; + for (Iterator iter = evalues.iterator(); iter.hasNext();) + { + ElementValueGen element = (ElementValueGen) iter.next(); + immutableData[i++] = element.getElementValue(); + } + return new ArrayElementValue(type, immutableData, cpGen + .getConstantPool()); + } + + /** + * @param value + * @param cpool + */ + public ArrayElementValueGen(ArrayElementValue value, ConstantPoolGen cpool, + boolean copyPoolEntries) + { + super(ARRAY, cpool); + evalues = new ArrayList(); + ElementValue[] in = value.getElementValuesArray(); + for (int i = 0; i < in.length; i++) + { + evalues.add(ElementValueGen.copy(in[i], cpool, copyPoolEntries)); + } + } + + public void dump(DataOutputStream dos) throws IOException + { + dos.writeByte(type); // u1 type of value (ARRAY == '[') + dos.writeShort(evalues.size()); + for (Iterator iter = evalues.iterator(); iter.hasNext();) + { + ElementValueGen element = (ElementValueGen) iter.next(); + element.dump(dos); + } + } + + public String stringifyValue() + { + StringBuffer sb = new StringBuffer(); + sb.append("["); + for (Iterator iter = evalues.iterator(); iter.hasNext();) + { + ElementValueGen element = (ElementValueGen) iter.next(); + sb.append(element.stringifyValue()); + if (iter.hasNext()) + sb.append(","); + } + sb.append("]"); + return sb.toString(); + } + + public List getElementValues() + { + return evalues; + } + + public int getElementValuesSize() + { + return evalues.size(); + } + + public void addElement(ElementValueGen gen) + { + evalues.add(gen); + } +} diff --git a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java new file mode 100644 index 00000000..6767011a --- /dev/null +++ b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java @@ -0,0 +1,80 @@ +package org.apache.bcel.generic; + +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.classfile.ElementValue; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ClassElementValue; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.ElementValueGen; + +public class ClassElementValueGen extends ElementValueGen +{ + // For primitive types and string type, this points to the value entry in + // the cpool + // For 'class' this points to the class entry in the cpool + private int idx; + + protected ClassElementValueGen(int typeIdx, ConstantPoolGen cpool) + { + super(ElementValueGen.CLASS, cpool); + this.idx = typeIdx; + } + + public ClassElementValueGen(ObjectType t, ConstantPoolGen cpool) + { + super(ElementValueGen.CLASS, cpool); + // this.idx = cpool.addClass(t); + idx = cpool.addUtf8(t.getSignature()); + } + + /** + * Return immutable variant of this ClassElementValueGen + */ + public ElementValue getElementValue() + { + return new ClassElementValue(type, idx, cpGen.getConstantPool()); + } + + public ClassElementValueGen(ClassElementValue value, ConstantPoolGen cpool, + boolean copyPoolEntries) + { + super(CLASS, cpool); + if (copyPoolEntries) + { + // idx = cpool.addClass(value.getClassString()); + idx = cpool.addUtf8(value.getClassString()); + } + else + { + idx = value.getIndex(); + } + } + + public int getIndex() + { + return idx; + } + + public String getClassString() + { + ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(idx); + return cu8.getBytes(); + // ConstantClass c = (ConstantClass)getConstantPool().getConstant(idx); + // ConstantUtf8 utf8 = + // (ConstantUtf8)getConstantPool().getConstant(c.getNameIndex()); + // return utf8.getBytes(); + } + + public String stringifyValue() + { + return getClassString(); + } + + public void dump(DataOutputStream dos) throws IOException + { + dos.writeByte(type); // u1 kind of value + dos.writeShort(idx); + } +} diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 7ead2518..963fb10e 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -22,6 +22,7 @@ import java.util.List; import org.apache.bcel.Constants; import org.apache.bcel.classfile.AccessFlags; import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Annotations; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.classfile.Field; @@ -169,9 +170,9 @@ public class ClassGen extends AccessFlags implements Cloneable { { RuntimeVisibleAnnotations rva = (RuntimeVisibleAnnotations) attr; AnnotationEntry[] annos = rva.getAnnotationEntries(); - for (int j = 0; i < annos.length; i++) + for (int j = 0; j < annos.length; j++) { - AnnotationEntry a = annos[i]; + AnnotationEntry a = annos[j]; annotationGenObjs.add(new AnnotationEntryGen(a, getConstantPool(), false)); } @@ -181,9 +182,9 @@ public class ClassGen extends AccessFlags implements Cloneable { { RuntimeInvisibleAnnotations ria = (RuntimeInvisibleAnnotations) attr; AnnotationEntry[] annos = ria.getAnnotationEntries(); - for (int j = 0; i < annos.length; i++) + for (int j = 0; j < annos.length; j++) { - AnnotationEntry a = annos[i]; + AnnotationEntry a = annos[j]; annotationGenObjs.add(new AnnotationEntryGen(a, getConstantPool(), false)); } diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index 239775be..5f4115e4 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -20,6 +20,8 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.bcel.Constants; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Annotations; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.Constant; import org.apache.bcel.classfile.ConstantObject; @@ -88,6 +90,13 @@ public class FieldGen extends FieldGenOrMethodGen { for (int i = 0; i < attrs.length; i++) { if (attrs[i] instanceof ConstantValue) { setValue(((ConstantValue) attrs[i]).getConstantValueIndex()); + } else if (attrs[i] instanceof Annotations) { + Annotations runtimeAnnotations = (Annotations)attrs[i]; + AnnotationEntry[] annotationEntries = runtimeAnnotations.getAnnotationEntries(); + for (int j = 0; j < annotationEntries.length; j++) { + AnnotationEntry element = annotationEntries[j]; + addAnnotationEntry(new AnnotationEntryGen(element,cp,false)); + } } else { addAttribute(attrs[i]); } @@ -211,9 +220,19 @@ public class FieldGen extends FieldGenOrMethodGen { addAttribute(new ConstantValue(cp.addUtf8("ConstantValue"), 2, index, cp .getConstantPool())); } + addAnnotationsAsAttribute(cp); return new Field(access_flags, name_index, signature_index, getAttributes(), cp .getConstantPool()); } + + private void addAnnotationsAsAttribute(ConstantPoolGen cp) { + Attribute[] attrs = Utility.getAnnotationAttributes(cp,annotation_vec); + if (attrs!=null) { + for (int i = 0; i < attrs.length; i++) { + addAttribute(attrs[i]); + } + } + } private int addConstant() { diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 4f481804..ccc7f4df 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -22,6 +22,8 @@ import java.util.Iterator; import java.util.List; import java.util.Stack; import org.apache.bcel.Constants; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Annotations; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.Code; import org.apache.bcel.classfile.CodeException; @@ -31,6 +33,9 @@ import org.apache.bcel.classfile.LineNumberTable; import org.apache.bcel.classfile.LocalVariable; import org.apache.bcel.classfile.LocalVariableTable; import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.ParameterAnnotationEntry; +import org.apache.bcel.classfile.ParameterAnnotations; +import org.apache.bcel.classfile.RuntimeVisibleParameterAnnotations; import org.apache.bcel.classfile.Utility; import org.apache.bcel.util.BCELComparator; @@ -64,6 +69,11 @@ public class MethodGen extends FieldGenOrMethodGen { private List exception_vec = new ArrayList(); private List throws_vec = new ArrayList(); private List code_attrs_vec = new ArrayList(); + + private List[] param_annotations; // Array of lists containing AnnotationGen objects + private boolean hasParameterAnnotations = false; + private boolean haveUnpackedParameterAnnotations = false; + private static BCELComparator _cmp = new BCELComparator() { public boolean equals( Object o1, Object o2 ) { @@ -236,6 +246,13 @@ public class MethodGen extends FieldGenOrMethodGen { for (int j = 0; j < names.length; j++) { addException(names[j]); } + } else if (a instanceof Annotations) { + Annotations runtimeAnnotations = (Annotations) a; + AnnotationEntry[] aes = runtimeAnnotations.getAnnotationEntries(); + for (int k = 0; k < aes.length; k++) { + AnnotationEntry element = aes[k]; + addAnnotationEntry(new AnnotationEntryGen(element, cp, false)); + } } else { addAttribute(a); } @@ -596,6 +613,25 @@ public class MethodGen extends FieldGenOrMethodGen { code_attrs_vec.toArray(attributes); return attributes; } + + public void addAnnotationsAsAttribute(ConstantPoolGen cp) { + Attribute[] attrs = Utility.getAnnotationAttributes(cp,annotation_vec); + if (attrs!=null) { + for (int i = 0; i < attrs.length; i++) { + addAttribute(attrs[i]); + } + } + } + + public void addParameterAnnotationsAsAttribute(ConstantPoolGen cp) { + if (!hasParameterAnnotations) return; + Attribute[] attrs = Utility.getParameterAnnotationAttributes(cp,param_annotations); + if (attrs!=null) { + for (int i = 0; i < attrs.length; i++) { + addAttribute(attrs[i]); + } + } + } /** @@ -649,6 +685,8 @@ public class MethodGen extends FieldGenOrMethodGen { max_stack, max_locals, byte_code, c_exc, code_attrs, cp.getConstantPool()); addAttribute(code); } + addAnnotationsAsAttribute(cp); + addParameterAnnotationsAsAttribute(cp); ExceptionTable et = null; if (throws_vec.size() > 0) { addAttribute(et = getExceptionTable(cp)); @@ -1044,11 +1082,111 @@ public class MethodGen extends FieldGenOrMethodGen { } return mg; } + + //J5TODO: Should param_annotations be an array of arrays? Rather than an array of lists, this + // is more likely to suggest to the caller it is readonly (which a List does not). + /** + * Return a list of AnnotationGen objects representing parameter annotations + */ + public List getAnnotationsOnParameter(int i) { + ensureExistingParameterAnnotationsUnpacked(); + if (!hasParameterAnnotations || i>arg_types.length) return null; + return param_annotations[i]; + } + + /** + * Goes through the attributes on the method and identifies any that are + * RuntimeParameterAnnotations, extracting their contents and storing them + * as parameter annotations. There are two kinds of parameter annotation - + * visible and invisible. Once they have been unpacked, these attributes are + * deleted. (The annotations will be rebuilt as attributes when someone + * builds a Method object out of this MethodGen object). + */ + private void ensureExistingParameterAnnotationsUnpacked() + { + if (haveUnpackedParameterAnnotations) + return; + // Find attributes that contain parameter annotation data + Attribute[] attrs = getAttributes(); + ParameterAnnotations paramAnnVisAttr = null; + ParameterAnnotations paramAnnInvisAttr = null; + List accumulatedAnnotations = new ArrayList(); + for (int i = 0; i < attrs.length; i++) + { + Attribute attribute = attrs[i]; + if (attribute instanceof ParameterAnnotations) + { + // Initialize param_annotations + if (!hasParameterAnnotations) + { + param_annotations = new List[arg_types.length]; + for (int j = 0; j < arg_types.length; j++) + param_annotations[j] = new ArrayList(); + } + hasParameterAnnotations = true; + ParameterAnnotations rpa = (ParameterAnnotations) attribute; + if (rpa instanceof RuntimeVisibleParameterAnnotations) + paramAnnVisAttr = rpa; + else + paramAnnInvisAttr = rpa; + for (int j = 0; j < arg_types.length; j++) + { + // This returns Annotation[] ... + ParameterAnnotationEntry immutableArray = rpa + .getParameterAnnotationEntries()[j]; + // ... which needs transforming into an AnnotationGen[] ... + List mutable = makeMutableVersion(immutableArray.getAnnotationEntries()); + // ... then add these to any we already know about + param_annotations[j].addAll(mutable); + } + } + } + if (paramAnnVisAttr != null) + removeAttribute(paramAnnVisAttr); + if (paramAnnInvisAttr != null) + removeAttribute(paramAnnInvisAttr); + haveUnpackedParameterAnnotations = true; + } + + private List /* AnnotationGen */makeMutableVersion(AnnotationEntry[] mutableArray) + { + List result = new ArrayList(); + for (int i = 0; i < mutableArray.length; i++) + { + result.add(new AnnotationEntryGen(mutableArray[i], getConstantPool(), + false)); + } + return result; + } + + public void addParameterAnnotation(int parameterIndex, + AnnotationEntryGen annotation) + { + ensureExistingParameterAnnotationsUnpacked(); + if (!hasParameterAnnotations) + { + param_annotations = new List[arg_types.length]; + hasParameterAnnotations = true; + } + List existingAnnotations = param_annotations[parameterIndex]; + if (existingAnnotations != null) + { + existingAnnotations.add(annotation); + } + else + { + List l = new ArrayList(); + l.add(annotation); + param_annotations[parameterIndex] = l; + } + } + + /** - * @return Comparison strategy object - */ + * @return Comparison strategy object + */ public static BCELComparator getComparator() { return _cmp; } diff --git a/src/test/java/org/apache/bcel/AbstractTestCase.java b/src/test/java/org/apache/bcel/AbstractTestCase.java index b1341089..5d8434a4 100644 --- a/src/test/java/org/apache/bcel/AbstractTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractTestCase.java @@ -1,6 +1,7 @@ package org.apache.bcel; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import junit.framework.TestCase; @@ -66,8 +67,7 @@ public class AbstractTestCase extends TestCase public SyntheticRepository createRepos(String cpentry) { ClassPath cp = new ClassPath("target" + File.separator + "testdata" - + File.separator + cpentry + File.pathSeparator - + System.getProperty("java.class.path")); + + File.separator + cpentry + File.separator); return SyntheticRepository.getInstance(cp); } @@ -129,14 +129,17 @@ public class AbstractTestCase extends TestCase result.append("]"); return result.toString(); } - - protected String dumpAnnotationEntries(AnnotationEntryGen[] as) { + + protected String dumpAnnotationEntries(AnnotationEntryGen[] as) + { StringBuffer result = new StringBuffer(); result.append("["); - for (int i = 0; i < as.length; i++) { + for (int i = 0; i < as.length; i++) + { AnnotationEntryGen annotation = as[i]; result.append(annotation.toShortString()); - if (i+1", + Constants.ACC_PUBLIC | Constants.ACC_SUPER, null); + } + + /** + * Create primitive element values + */ + public void testCreateIntegerElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_INT, cp, 555); + // Creation of an element like that should leave a new entry in the + // cpool + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + cp.lookupInteger(555), + evg.getIndex() == cp.lookupInteger(555)); + checkSerialize(evg, cp); + } + + public void testCreateFloatElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_FLOAT, cp, 111.222f); + // Creation of an element like that should leave a new entry in the + // cpool + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + cp.lookupFloat(111.222f), evg + .getIndex() == cp.lookupFloat(111.222f)); + checkSerialize(evg, cp); + } + + public void testCreateDoubleElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_DOUBLE, cp, 333.44); + // Creation of an element like that should leave a new entry in the + // cpool + int idx = cp.lookupDouble(333.44); + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); + checkSerialize(evg, cp); + } + + public void testCreateLongElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_LONG, cp, 3334455L); + // Creation of an element like that should leave a new entry in the + // cpool + int idx = cp.lookupLong(3334455L); + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); + checkSerialize(evg, cp); + } + + public void testCreateCharElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_CHAR, cp, (char) 't'); + // Creation of an element like that should leave a new entry in the + // cpool + int idx = cp.lookupInteger((char) 't'); + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); + checkSerialize(evg, cp); + } + + public void testCreateByteElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_CHAR, cp, (byte) 'z'); + // Creation of an element like that should leave a new entry in the + // cpool + int idx = cp.lookupInteger((byte) 'z'); + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); + checkSerialize(evg, cp); + } + + public void testCreateBooleanElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_BOOLEAN, cp, true); + // Creation of an element like that should leave a new entry in the + // cpool + int idx = cp.lookupInteger(1); // 1 == true + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); + checkSerialize(evg, cp); + } + + public void testCreateShortElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_SHORT, cp, (short) 42); + // Creation of an element like that should leave a new entry in the + // cpool + int idx = cp.lookupInteger(42); + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); + checkSerialize(evg, cp); + } + + // // + // Create string element values + public void testCreateStringElementValue() + { + // Create HelloWorld + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.STRING, cp, "hello"); + // Creation of an element like that should leave a new entry in the + // cpool + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + cp.lookupUtf8("hello"), evg + .getIndex() == cp.lookupUtf8("hello")); + checkSerialize(evg, cp); + } + + // // + // Create enum element value + public void testCreateEnumElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + ObjectType enumType = new ObjectType("SimpleEnum"); // Supports rainbow + // :) + EnumElementValueGen evg = new EnumElementValueGen(enumType, "Red", cp); + // Creation of an element like that should leave a new entry in the + // cpool + assertTrue( + "The new ElementValue value index should match the contents of the constantpool but " + + evg.getValueIndex() + "!=" + cp.lookupUtf8("Red"), + evg.getValueIndex() == cp.lookupUtf8("Red")); + // BCELBUG: Should the class signature or class name be in the constant + // pool? (see note in ConstantPool) + // assertTrue("The new ElementValue type index should match the contents + // of the constantpool but "+ + // evg.getTypeIndex()+"!="+cp.lookupClass(enumType.getSignature()), + // evg.getTypeIndex()==cp.lookupClass(enumType.getSignature())); + checkSerialize(evg, cp); + } + + // // + // Create class element value + public void testCreateClassElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + ObjectType classType = new ObjectType("java.lang.Integer"); + ClassElementValueGen evg = new ClassElementValueGen(classType, cp); + assertTrue("Unexpected value for contained class: '" + + evg.getClassString() + "'", evg.getClassString().indexOf( + "Integer") != -1); + checkSerialize(evg, cp); + } + + private void checkSerialize(ElementValueGen evgBefore, ConstantPoolGen cpg) + { + try + { + String beforeValue = evgBefore.stringifyValue(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + evgBefore.dump(dos); + dos.flush(); + dos.close(); + byte[] bs = baos.toByteArray(); + ByteArrayInputStream bais = new ByteArrayInputStream(bs); + DataInputStream dis = new DataInputStream(bais); + ElementValueGen evgAfter = ElementValueGen.readElementValue(dis, + cpg); + dis.close(); + String afterValue = evgAfter.stringifyValue(); + if (!beforeValue.equals(afterValue)) + { + fail("Deserialization failed: before='" + beforeValue + + "' after='" + afterValue + "'"); + } + } + catch (IOException ioe) + { + fail("Unexpected exception whilst checking serialization: " + ioe); + } + } +} diff --git a/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java b/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java new file mode 100644 index 00000000..489f2188 --- /dev/null +++ b/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java @@ -0,0 +1,89 @@ +package org.apache.bcel; + +import java.io.File; +import java.io.IOException; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.EnclosingMethod; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.util.SyntheticRepository; + +public class EnclosingMethodAttributeTestCase extends AbstractTestCase +{ + /** + * Verify for an inner class declared inside the 'main' method that the + * enclosing method attribute is set correctly. + */ + public void testCheckMethodLevelNamedInnerClass() + throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AttributeTestClassEM01$1S"); + ConstantPool pool = clazz.getConstantPool(); + Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); + assertTrue("Expected 1 EnclosingMethod attribute but found " + + encMethodAttrs.length, encMethodAttrs.length == 1); + EnclosingMethod em = (EnclosingMethod) encMethodAttrs[0]; + String enclosingClassName = em.getEnclosingClass().getBytes(pool); + String enclosingMethodName = em.getEnclosingMethod().getName(pool); + assertTrue( + "Expected class name to be 'org/apache/bcel/data/AttributeTestClassEM01' but was " + + enclosingClassName, enclosingClassName + .equals("org/apache/bcel/data/AttributeTestClassEM01")); + assertTrue("Expected method name to be 'main' but was " + + enclosingMethodName, enclosingMethodName.equals("main")); + } + + /** + * Verify for an inner class declared at the type level that the + * EnclosingMethod attribute is set correctly (i.e. to a null value) + */ + public void testCheckClassLevelNamedInnerClass() + throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AttributeTestClassEM02$1"); + ConstantPool pool = clazz.getConstantPool(); + Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); + assertTrue("Expected 1 EnclosingMethod attribute but found " + + encMethodAttrs.length, encMethodAttrs.length == 1); + EnclosingMethod em = (EnclosingMethod) encMethodAttrs[0]; + String enclosingClassName = em.getEnclosingClass().getBytes(pool); + assertTrue( + "The class is not within a method, so method_index should be null, but it is " + + em.getEnclosingMethodIndex(), em + .getEnclosingMethodIndex() == 0); + assertTrue( + "Expected class name to be 'org/apache/bcel/data/AttributeTestClassEM02' but was " + + enclosingClassName, enclosingClassName + .equals("org/apache/bcel/data/AttributeTestClassEM02")); + } + + /** + * Check that we can save and load the attribute correctly. + */ + public void testAttributeSerializtion() throws ClassNotFoundException, + IOException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AttributeTestClassEM02$1"); + ConstantPool pool = clazz.getConstantPool(); + Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); + assertTrue("Expected 1 EnclosingMethod attribute but found " + + encMethodAttrs.length, encMethodAttrs.length == 1); + // Write it out + File tfile = createTestdataFile("AttributeTestClassEM02$1.class"); + clazz.dump(tfile); + // Read in the new version and check it is OK + SyntheticRepository repos2 = createRepos("."); + JavaClass clazz2 = repos2.loadClass("AttributeTestClassEM02$1"); + EnclosingMethod em = (EnclosingMethod) encMethodAttrs[0]; + String enclosingClassName = em.getEnclosingClass().getBytes(pool); + assertTrue( + "The class is not within a method, so method_index should be null, but it is " + + em.getEnclosingMethodIndex(), em + .getEnclosingMethodIndex() == 0); + assertTrue( + "Expected class name to be 'org/apache/bcel/data/AttributeTestClassEM02' but was " + + enclosingClassName, enclosingClassName + .equals("org/apache/bcel/data/AttributeTestClassEM02")); + tfile.deleteOnExit(); + } +} diff --git a/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java b/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java new file mode 100644 index 00000000..01c5b6d0 --- /dev/null +++ b/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java @@ -0,0 +1,23 @@ +package org.apache.bcel; + +import org.apache.bcel.classfile.JavaClass; + +public class EnumAccessFlagTestCase extends AbstractTestCase +{ + /** + * An enumerated type, once compiled, should result in a class file that is + * marked such that we can determine from the access flags (through BCEL) + * that it was originally an enum type declaration. + */ + public void testEnumClassSaysItIs() throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.SimpleEnum"); + assertTrue( + "Expected SimpleEnum class to say it was an enum - but it didn't !", + clazz.isEnum()); + clazz = getTestClass("org.apache.bcel.data.SimpleClass"); + assertTrue( + "Expected SimpleClass class to say it was not an enum - but it didn't !", + !clazz.isEnum()); + } +} diff --git a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java b/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java new file mode 100644 index 00000000..331cbb71 --- /dev/null +++ b/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java @@ -0,0 +1,145 @@ +package org.apache.bcel; + +import java.io.File; +import java.io.IOException; +import java.util.Iterator; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.ElementValuePair; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.FieldGen; +import org.apache.bcel.generic.AnnotationEntryGen; +import org.apache.bcel.util.SyntheticRepository; + +public class FieldAnnotationsTestCase extends AbstractTestCase +{ + /** + * Check field AnnotationEntrys are retrievable. + */ + public void testFieldAnnotationEntrys() throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); + // TODO L...;? + checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); + checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); + } + + /** + * Check field AnnotationEntrys (de)serialize ok. + */ + public void testFieldAnnotationEntrysReadWrite() throws ClassNotFoundException, + IOException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); + checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); + checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); + // Write it out + File tfile = createTestdataFile("AnnotatedFields.class"); + clazz.dump(tfile); + SyntheticRepository repos2 = createRepos("."); + JavaClass clazz2 = repos2.loadClass("AnnotatedFields"); + checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); + checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); + assertTrue(tfile.delete()); + } + + /** + * Check we can load in a class, modify its field AnnotationEntrys, save it, + * reload it and everything is correct. + */ + public void testFieldAnnotationModification() + throws ClassNotFoundException, IOException + { + boolean dbg = false; + JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); + ClassGen clg = new ClassGen(clazz); + Field f = clg.getFields()[0]; + if (dbg) + System.err.println("Field in freshly constructed class is: " + f); + if (dbg) + System.err.println("AnnotationEntrys on field are: " + + dumpAnnotationEntries(f.getAnnotationEntries())); + AnnotationEntryGen fruitBasedAnnotationEntry = createFruitAnnotationEntry(clg + .getConstantPool(), "Tomato", false); + FieldGen fg = new FieldGen(f, clg.getConstantPool()); + if (dbg) + System.err.println("Adding AnnotationEntry to the field"); + fg.addAnnotationEntry(fruitBasedAnnotationEntry); + if (dbg) + System.err.println("FieldGen (mutable field) is " + fg); + if (dbg) + System.err.println("with AnnotationEntrys: " + + dumpAnnotationEntries(fg.getAnnotationEntries())); + if (dbg) + System.err + .println("Replacing original field with new field that has extra AnnotationEntry"); + clg.removeField(f); + clg.addField(fg.getField()); + f = clg.getFields()[1]; // there are two fields in the class, removing + // and readding has changed the order + // so this time index [1] is the 'int i' field + if (dbg) + System.err.println("Field now looks like this: " + f); + if (dbg) + System.err.println("With AnnotationEntrys: " + + dumpAnnotationEntries(f.getAnnotationEntries())); + assertTrue("Should be 2 AnnotationEntrys on this field, but there are " + + f.getAnnotationEntries().length, f.getAnnotationEntries().length == 2); + } + + // helper methods + public void checkAnnotatedField(JavaClass clazz, String fieldname, + String AnnotationEntryName, String AnnotationEntryElementName, + String AnnotationEntryElementValue) + { + Field[] fields = clazz.getFields(); + for (int i = 0; i < fields.length; i++) + { + Field f = fields[i]; + AnnotationEntry[] fieldAnnotationEntrys = f.getAnnotationEntries(); + if (f.getName().equals(fieldname)) + { + checkAnnotationEntry(fieldAnnotationEntrys[0], AnnotationEntryName, + AnnotationEntryElementName, AnnotationEntryElementValue); + } + } + } + + private void checkAnnotationEntry(AnnotationEntry a, String name, String elementname, + String elementvalue) + { + assertTrue("Expected AnnotationEntry to have name " + name + + " but it had name " + a.getAnnotationType(), a.getAnnotationType() + .equals(name)); + assertTrue("Expected AnnotationEntry to have one element but it had " + + a.getElementValuePairs().length, a.getElementValuePairs().length == 1); + ElementValuePair envp = (ElementValuePair) a.getElementValuePairs()[0]; + assertTrue("Expected element name " + elementname + " but was " + + envp.getNameString(), elementname + .equals(envp.getNameString())); + assertTrue("Expected element value " + elementvalue + " but was " + + envp.getValue().stringifyValue(), elementvalue.equals(envp + .getValue().stringifyValue())); + } + + // helper methods + public void checkValue(AnnotationEntry a, String name, String tostring) + { + for (int i = 0; i < a.getElementValuePairs().length; i++) + { + ElementValuePair element = a.getElementValuePairs()[i]; + if (element.getNameString().equals(name)) + { + if (!element.getValue().stringifyValue().equals(tostring)) + { + fail("Expected element " + name + " to have value " + + tostring + " but it had value " + + element.getValue().stringifyValue()); + } + return; + } + } + fail("Didnt find named element " + name); + } +} diff --git a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java new file mode 100644 index 00000000..55372f11 --- /dev/null +++ b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java @@ -0,0 +1,609 @@ +package org.apache.bcel; + +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.ElementValue; +import org.apache.bcel.classfile.ElementValuePair; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ALOAD; +import org.apache.bcel.generic.ASTORE; +import org.apache.bcel.generic.AnnotationElementValueGen; +import org.apache.bcel.generic.AnnotationEntryGen; +import org.apache.bcel.generic.ArrayElementValueGen; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.ElementValueGen; +import org.apache.bcel.generic.ElementValuePairGen; +import org.apache.bcel.generic.GOTO; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.LocalVariableGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.SimpleElementValueGen; +import org.apache.bcel.generic.Type; +import org.apache.bcel.util.SyntheticRepository; + +/** + * The program that some of the tests generate looks like this: + * + *

          + * public class HelloWorld
          + * {
          + * 	public static void main(String[] argv)
          + * 	{
          + * 		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
          + * 		String name = null;
          + * 
          + * 		try
          + * 		{
          + * 			name = "Andy";
          + * 		}
          + * 		catch (IOException e)
          + * 		{
          + * 			return;
          + * 		}
          + * 		System.out.println("Hello, " + name);
          + * 	}
          + * }
          + * 
          + */ +public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase +{ + /** + * Steps in the test: + *
            + *
          1. Programmatically construct the HelloWorld program
          2. + *
          3. Add two simple annotations at the class level
          4. + *
          5. Save the class to disk
          6. + *
          7. Reload the class using the 'static' variant of the BCEL classes
          8. + *
          9. Check the attributes are OK
          10. + *
          + */ + public void testGenerateClassLevelAnnotations() + throws ClassNotFoundException + { + // Create HelloWorld + ClassGen cg = createClassGen("HelloWorld"); + cg.setMajor(49); + cg.setMinor(0); + ConstantPoolGen cp = cg.getConstantPool(); + InstructionList il = new InstructionList(); + cg.addAnnotationEntry(createSimpleVisibleAnnotation(cp)); + cg.addAnnotationEntry(createSimpleInvisibleAnnotation(cp)); + buildClassContents(cg, cp, il); + //System.out.println(cg.getJavaClass().toString()); + dumpClass(cg, "HelloWorld.class"); + JavaClass jc = getClassFrom(".", "HelloWorld"); + AnnotationEntry[] as = jc.getAnnotationEntries(); + assertTrue("Should be two AnnotationEntries but found " + as.length, + as.length == 2); + AnnotationEntry one = as[0]; + AnnotationEntry two = as[1]; + // TODO L??; + assertTrue( + "Name of annotation 1 should be LSimpleAnnotation; but it is " + + as[0].getAnnotationType(), as[0].getAnnotationType() + .equals("LSimpleAnnotation;")); + assertTrue( + "Name of annotation 2 should be LSimpleAnnotation; but it is " + + as[1].getAnnotationType(), as[1].getAnnotationType() + .equals("LSimpleAnnotation;")); + ElementValuePair[] vals = as[0].getElementValuePairs(); + ElementValuePair nvp = (ElementValuePair) vals[0]; + assertTrue( + "Name of element in SimpleAnnotation should be 'id' but it is " + + nvp.getNameString(), nvp.getNameString().equals("id")); + ElementValue ev = nvp.getValue(); + assertTrue("Type of element value should be int but it is " + + ev.getElementValueType(), + ev.getElementValueType() == ElementValue.PRIMITIVE_INT); + assertTrue("Value of element should be 4 but it is " + + ev.stringifyValue(), ev.stringifyValue().equals("4")); + assertTrue(createTestdataFile("HelloWorld.class").delete()); + } + + /** + * Just check that we can dump a class that has a method annotation on it + * and it is still there when we read it back in + */ + public void testGenerateMethodLevelAnnotations1() + throws ClassNotFoundException + { + // Create HelloWorld + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + InstructionList il = new InstructionList(); + buildClassContentsWithAnnotatedMethods(cg, cp, il); + // Check annotation is OK + int i = cg.getMethods()[0].getAnnotationEntries().length; + assertTrue( + "Prior to dumping, main method should have 1 annotation but has " + + i, i == 1); + dumpClass(cg, "temp1" + File.separator + "HelloWorld.class"); + JavaClass jc2 = getClassFrom("temp1", "HelloWorld"); + // Check annotation is OK + i = jc2.getMethods()[0].getAnnotationEntries().length; + assertTrue("JavaClass should say 1 annotation on main method but says " + + i, i == 1); + ClassGen cg2 = new ClassGen(jc2); + // Check it now it is a ClassGen + Method[] m = cg2.getMethods(); + i = m[0].getAnnotationEntries().length; + assertTrue("The main 'Method' should have one annotation but has " + i, + i == 1); + MethodGen mg = new MethodGen(m[0], cg2.getClassName(), cg2 + .getConstantPool()); + // Check it finally when the Method is changed to a MethodGen + i = mg.getAnnotationEntries().length; + assertTrue("The main 'MethodGen' should have one annotation but has " + + i, i == 1); + assertTrue(wipe("temp1" + File.separator + "HelloWorld.class")); + } + + /** + * Going further than the last test - when we reload the method back in, + * let's change it (adding a new annotation) and then store that, read it + * back in and verify both annotations are there ! + */ + public void testGenerateMethodLevelAnnotations2() + throws ClassNotFoundException + { + // Create HelloWorld + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + InstructionList il = new InstructionList(); + buildClassContentsWithAnnotatedMethods(cg, cp, il); + dumpClass(cg, "temp2", "HelloWorld.class"); + JavaClass jc2 = getClassFrom("temp2", "HelloWorld"); + ClassGen cg2 = new ClassGen(jc2); + // Main method after reading the class back in + Method mainMethod1 = jc2.getMethods()[0]; + assertTrue("The 'Method' should have one annotations but has " + + mainMethod1.getAnnotationEntries().length, mainMethod1 + .getAnnotationEntries().length == 1); + MethodGen mainMethod2 = new MethodGen(mainMethod1, cg2.getClassName(), + cg2.getConstantPool()); + assertTrue("The 'MethodGen' should have one annotations but has " + + mainMethod2.getAnnotationEntries().length, mainMethod2 + .getAnnotationEntries().length == 1); + mainMethod2.addAnnotationEntry(createFruitAnnotation(cg2 + .getConstantPool(), "Pear")); + cg2.removeMethod(mainMethod1); + cg2.addMethod(mainMethod2.getMethod()); + dumpClass(cg2, "temp3", "HelloWorld.class"); + JavaClass jc3 = getClassFrom("temp3", "HelloWorld"); + ClassGen cg3 = new ClassGen(jc3); + Method mainMethod3 = cg3.getMethods()[1]; + int i = mainMethod3.getAnnotationEntries().length; + assertTrue("The 'Method' should now have two annotations but has " + i, + i == 2); + assertTrue(wipe("temp2", "HelloWorld.class")); + assertTrue(wipe("temp3", "HelloWorld.class")); + } + + // J5TODO: Need to add deleteFile calls to many of these tests + /** + * Transform simple class from an immutable to a mutable object. + */ + public void testTransformClassToClassGen_SimpleTypes() + throws ClassNotFoundException + { + JavaClass jc = getTestClass("org.apache.bcel.data.SimpleAnnotatedClass"); + ClassGen cgen = new ClassGen(jc); + // Check annotations are correctly preserved + AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); + assertTrue("Expected one annotation but found " + annotations.length, + annotations.length == 1); + } + + /** + * Transform simple class from an immutable to a mutable object. The class + * is annotated with an annotation that uses an enum. + */ + public void testTransformClassToClassGen_EnumType() + throws ClassNotFoundException + { + JavaClass jc = getTestClass("org.apache.bcel.data.AnnotatedWithEnumClass"); + ClassGen cgen = new ClassGen(jc); + // Check annotations are correctly preserved + AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); + assertTrue("Expected one annotation but found " + annotations.length, + annotations.length == 1); + } + + /** + * Transform simple class from an immutable to a mutable object. The class + * is annotated with an annotation that uses an array of SimpleAnnotations. + */ + public void testTransformClassToClassGen_ArrayAndAnnotationTypes() + throws ClassNotFoundException + { + JavaClass jc = getTestClass("org.apache.bcel.data.AnnotatedWithCombinedAnnotation"); + ClassGen cgen = new ClassGen(jc); + // Check annotations are correctly preserved + AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); + assertTrue("Expected one annotation but found " + annotations.length, + annotations.length == 1); + AnnotationEntryGen a = annotations[0]; + assertTrue("That annotation should only have one value but has " + + a.getValues().size(), a.getValues().size() == 1); + ElementValuePairGen nvp = (ElementValuePairGen) a.getValues().get(0); + ElementValueGen value = (ElementValueGen) nvp.getValue(); + assertTrue("Value should be ArrayElementValueGen but is " + value, + value instanceof ArrayElementValueGen); + ArrayElementValueGen arrayValue = (ArrayElementValueGen) value; + assertTrue("Array value should be size one but is " + + arrayValue.getElementValuesSize(), arrayValue + .getElementValuesSize() == 1); + ElementValueGen innerValue = (ElementValueGen) arrayValue + .getElementValues().get(0); + assertTrue( + "Value in the array should be AnnotationElementValueGen but is " + + innerValue, + innerValue instanceof AnnotationElementValueGen); + AnnotationElementValueGen innerAnnotationValue = (AnnotationElementValueGen) innerValue; + assertTrue("Should be called LSimpleAnnotation; but is called: " + + innerAnnotationValue.getAnnotation().getTypeName(), + innerAnnotationValue.getAnnotation().getTypeSignature().equals( + "LSimpleAnnotation;")); + } + + /** + * Transform complex class from an immutable to a mutable object. + */ + public void testTransformComplexClassToClassGen() + throws ClassNotFoundException + { + JavaClass jc = getTestClass("org.apache.bcel.data.ComplexAnnotatedClass"); + ClassGen cgen = new ClassGen(jc); + // Check annotations are correctly preserved + AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); + assertTrue("Expected one annotation but found " + annotations.length, + annotations.length == 1); + List l = annotations[0].getValues(); + boolean found = false; + for (Iterator iter = l.iterator(); iter.hasNext();) + { + ElementValuePairGen element = (ElementValuePairGen) iter.next(); + if (element.getNameString().equals("dval")) + { + if (((SimpleElementValueGen) element.getValue()) + .stringifyValue().equals("33.4")) + found = true; + } + } + assertTrue("Did not find double annotation value with value 33.4", + found); + } + + /** + * Load a class in and modify it with a new attribute - A SimpleAnnotation + * annotation + */ + public void testModifyingClasses1() throws ClassNotFoundException + { + JavaClass jc = getTestClass("org.apache.bcel.data.SimpleAnnotatedClass"); + ClassGen cgen = new ClassGen(jc); + ConstantPoolGen cp = cgen.getConstantPool(); + cgen.addAnnotationEntry(createFruitAnnotation(cp, "Pineapple")); + assertTrue("Should now have two annotations but has " + + cgen.getAnnotationEntries().length, cgen + .getAnnotationEntries().length == 2); + dumpClass(cgen, "SimpleAnnotatedClass.class"); + assertTrue(wipe("SimpleAnnotatedClass.class")); + } + + /** + * Load a class in and modify it with a new attribute - A ComplexAnnotation + * annotation + */ + public void testModifyingClasses2() throws ClassNotFoundException + { + JavaClass jc = getTestClass("org.apache.bcel.data.SimpleAnnotatedClass"); + ClassGen cgen = new ClassGen(jc); + ConstantPoolGen cp = cgen.getConstantPool(); + cgen.addAnnotationEntry(createCombinedAnnotation(cp)); + assertTrue("Should now have two annotations but has " + + cgen.getAnnotationEntries().length, cgen + .getAnnotationEntries().length == 2); + dumpClass(cgen, "SimpleAnnotatedClass.class"); + JavaClass jc2 = getClassFrom(".", "SimpleAnnotatedClass"); + jc2.getAnnotationEntries(); + assertTrue(wipe("SimpleAnnotatedClass.class")); + // System.err.println(jc2.toString()); + } + + private void dumpClass(ClassGen cg, String fname) + { + try + { + File f = createTestdataFile(fname); + cg.getJavaClass().dump(f); + } + catch (java.io.IOException e) + { + System.err.println(e); + } + } + + private void dumpClass(ClassGen cg, String dir, String fname) + { + dumpClass(cg, dir + File.separator + fname); + } + + private void buildClassContentsWithAnnotatedMethods(ClassGen cg, + ConstantPoolGen cp, InstructionList il) + { + // Create method 'public static void main(String[]argv)' + MethodGen mg = createMethodGen("main", il, cp); + InstructionFactory factory = new InstructionFactory(cg); + mg.addAnnotationEntry(createSimpleVisibleAnnotation(mg + .getConstantPool())); + // We now define some often used types: + ObjectType i_stream = new ObjectType("java.io.InputStream"); + ObjectType p_stream = new ObjectType("java.io.PrintStream"); + // Create variables in and name : We call the constructors, i.e., + // execute BufferedReader(InputStreamReader(System.in)) . The reference + // to the BufferedReader object stays on top of the stack and is stored + // in the newly allocated in variable. + il.append(factory.createNew("java.io.BufferedReader")); + il.append(InstructionConstants.DUP); // Use predefined constant + il.append(factory.createNew("java.io.InputStreamReader")); + il.append(InstructionConstants.DUP); + il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, + Constants.GETSTATIC)); + il.append(factory.createInvoke("java.io.InputStreamReader", "", + Type.VOID, new Type[] { i_stream }, Constants.INVOKESPECIAL)); + il.append(factory.createInvoke("java.io.BufferedReader", "", + Type.VOID, new Type[] { new ObjectType("java.io.Reader") }, + Constants.INVOKESPECIAL)); + LocalVariableGen lg = mg.addLocalVariable("in", new ObjectType( + "java.io.BufferedReader"), null, null); + int in = lg.getIndex(); + lg.setStart(il.append(new ASTORE(in))); // "in" valid from here + // Create local variable name and initialize it to null + lg = mg.addLocalVariable("name", Type.STRING, null, null); + int name = lg.getIndex(); + il.append(InstructionConstants.ACONST_NULL); + lg.setStart(il.append(new ASTORE(name))); // "name" valid from here + // Create try-catch block: We remember the start of the block, read a + // line from the standard input and store it into the variable name . + // InstructionHandle try_start = il.append(factory.createFieldAccess( + // "java.lang.System", "out", p_stream, Constants.GETSTATIC)); + // il.append(new PUSH(cp, "Please enter your name> ")); + // il.append(factory.createInvoke("java.io.PrintStream", "print", + // Type.VOID, new Type[] { Type.STRING }, + // Constants.INVOKEVIRTUAL)); + // il.append(new ALOAD(in)); + // il.append(factory.createInvoke("java.io.BufferedReader", "readLine", + // Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); + InstructionHandle try_start = il.append(new PUSH(cp, "Andy")); + il.append(new ASTORE(name)); + // Upon normal execution we jump behind exception handler, the target + // address is not known yet. + GOTO g = new GOTO(null); + InstructionHandle try_end = il.append(g); + // We add the exception handler which simply returns from the method. + LocalVariableGen var_ex = mg.addLocalVariable("ex", Type + .getType("Ljava.io.IOException;"), null, null); + int var_ex_slot = var_ex.getIndex(); + InstructionHandle handler = il.append(new ASTORE(var_ex_slot)); + var_ex.setStart(handler); + var_ex.setEnd(il.append(InstructionConstants.RETURN)); + mg.addExceptionHandler(try_start, try_end, handler, new ObjectType( + "java.io.IOException")); + // "Normal" code continues, now we can set the branch target of the GOTO + // . + InstructionHandle ih = il.append(factory.createFieldAccess( + "java.lang.System", "out", p_stream, Constants.GETSTATIC)); + g.setTarget(ih); + // Printing "Hello": String concatenation compiles to StringBuffer + // operations. + il.append(factory.createNew(Type.STRINGBUFFER)); + il.append(InstructionConstants.DUP); + il.append(new PUSH(cp, "Hello, ")); + il + .append(factory.createInvoke("java.lang.StringBuffer", + "", Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKESPECIAL)); + il.append(new ALOAD(name)); + il.append(factory.createInvoke("java.lang.StringBuffer", "append", + Type.STRINGBUFFER, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(factory.createInvoke("java.lang.StringBuffer", "toString", + Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); + il + .append(factory.createInvoke("java.io.PrintStream", "println", + Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(InstructionConstants.RETURN); + // Finalization: Finally, we have to set the stack size, which normally + // would have to be computed on the fly and add a default constructor + // method to the class, which is empty in this case. + mg.setMaxStack(); + mg.setMaxLocals(); + cg.addMethod(mg.getMethod()); + il.dispose(); // Allow instruction handles to be reused + cg.addEmptyConstructor(Constants.ACC_PUBLIC); + } + + private void buildClassContents(ClassGen cg, ConstantPoolGen cp, + InstructionList il) + { + // Create method 'public static void main(String[]argv)' + MethodGen mg = createMethodGen("main", il, cp); + InstructionFactory factory = new InstructionFactory(cg); + // We now define some often used types: + ObjectType i_stream = new ObjectType("java.io.InputStream"); + ObjectType p_stream = new ObjectType("java.io.PrintStream"); + // Create variables in and name : We call the constructors, i.e., + // execute BufferedReader(InputStreamReader(System.in)) . The reference + // to the BufferedReader object stays on top of the stack and is stored + // in the newly allocated in variable. + il.append(factory.createNew("java.io.BufferedReader")); + il.append(InstructionConstants.DUP); // Use predefined constant + il.append(factory.createNew("java.io.InputStreamReader")); + il.append(InstructionConstants.DUP); + il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, + Constants.GETSTATIC)); + il.append(factory.createInvoke("java.io.InputStreamReader", "", + Type.VOID, new Type[] { i_stream }, Constants.INVOKESPECIAL)); + il.append(factory.createInvoke("java.io.BufferedReader", "", + Type.VOID, new Type[] { new ObjectType("java.io.Reader") }, + Constants.INVOKESPECIAL)); + LocalVariableGen lg = mg.addLocalVariable("in", new ObjectType( + "java.io.BufferedReader"), null, null); + int in = lg.getIndex(); + lg.setStart(il.append(new ASTORE(in))); // "in" valid from here + // Create local variable name and initialize it to null + lg = mg.addLocalVariable("name", Type.STRING, null, null); + int name = lg.getIndex(); + il.append(InstructionConstants.ACONST_NULL); + lg.setStart(il.append(new ASTORE(name))); // "name" valid from here + // Create try-catch block: We remember the start of the block, read a + // line from the standard input and store it into the variable name . + // InstructionHandle try_start = il.append(factory.createFieldAccess( + // "java.lang.System", "out", p_stream, Constants.GETSTATIC)); + // il.append(new PUSH(cp, "Please enter your name> ")); + // il.append(factory.createInvoke("java.io.PrintStream", "print", + // Type.VOID, new Type[] { Type.STRING }, + // Constants.INVOKEVIRTUAL)); + // il.append(new ALOAD(in)); + // il.append(factory.createInvoke("java.io.BufferedReader", "readLine", + // Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); + InstructionHandle try_start = il.append(new PUSH(cp, "Andy")); + il.append(new ASTORE(name)); + // Upon normal execution we jump behind exception handler, the target + // address is not known yet. + GOTO g = new GOTO(null); + InstructionHandle try_end = il.append(g); + // We add the exception handler which simply returns from the method. + LocalVariableGen var_ex = mg.addLocalVariable("ex", Type + .getType("Ljava.io.IOException;"), null, null); + int var_ex_slot = var_ex.getIndex(); + InstructionHandle handler = il.append(new ASTORE(var_ex_slot)); + var_ex.setStart(handler); + var_ex.setEnd(il.append(InstructionConstants.RETURN)); + mg.addExceptionHandler(try_start, try_end, handler, new ObjectType( + "java.io.IOException")); + // "Normal" code continues, now we can set the branch target of the GOTO + // . + InstructionHandle ih = il.append(factory.createFieldAccess( + "java.lang.System", "out", p_stream, Constants.GETSTATIC)); + g.setTarget(ih); + // Printing "Hello": String concatenation compiles to StringBuffer + // operations. + il.append(factory.createNew(Type.STRINGBUFFER)); + il.append(InstructionConstants.DUP); + il.append(new PUSH(cp, "Hello, ")); + il + .append(factory.createInvoke("java.lang.StringBuffer", + "", Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKESPECIAL)); + il.append(new ALOAD(name)); + il.append(factory.createInvoke("java.lang.StringBuffer", "append", + Type.STRINGBUFFER, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(factory.createInvoke("java.lang.StringBuffer", "toString", + Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); + il + .append(factory.createInvoke("java.io.PrintStream", "println", + Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(InstructionConstants.RETURN); + // Finalization: Finally, we have to set the stack size, which normally + // would have to be computed on the fly and add a default constructor + // method to the class, which is empty in this case. + mg.setMaxStack(); + mg.setMaxLocals(); + cg.addMethod(mg.getMethod()); + il.dispose(); // Allow instruction handles to be reused + cg.addEmptyConstructor(Constants.ACC_PUBLIC); + } + + private JavaClass getClassFrom(String where, String clazzname) + throws ClassNotFoundException + { + // System.out.println(where); + SyntheticRepository repos = createRepos(where); + return repos.loadClass(clazzname); + } + + // helper methods + private ClassGen createClassGen(String classname) + { + return new ClassGen(classname, "java.lang.Object", "", + Constants.ACC_PUBLIC | Constants.ACC_SUPER, null); + } + + private MethodGen createMethodGen(String methodname, InstructionList il, + ConstantPoolGen cp) + { + return new MethodGen(Constants.ACC_STATIC | Constants.ACC_PUBLIC, // access + // flags + Type.VOID, // return type + new Type[] { new ArrayType(Type.STRING, 1) }, // argument + // types + new String[] { "argv" }, // arg names + methodname, "HelloWorld", // method, class + il, cp); + } + + public AnnotationEntryGen createSimpleVisibleAnnotation(ConstantPoolGen cp) + { + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_INT, cp, 4); + ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, cp); + ObjectType t = new ObjectType("SimpleAnnotation"); + List elements = new ArrayList(); + elements.add(nvGen); + AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); + return a; + } + + public AnnotationEntryGen createFruitAnnotation(ConstantPoolGen cp, + String aFruit) + { + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.STRING, cp, aFruit); + ElementValuePairGen nvGen = new ElementValuePairGen("fruit", evg, cp); + ObjectType t = new ObjectType("SimpleStringAnnotation"); + List elements = new ArrayList(); + elements.add(nvGen); + return new AnnotationEntryGen(t, elements, true, cp); + } + + public AnnotationEntryGen createCombinedAnnotation(ConstantPoolGen cp) + { + // Create an annotation instance + AnnotationEntryGen a = createSimpleVisibleAnnotation(cp); + ArrayElementValueGen array = new ArrayElementValueGen(cp); + array.addElement(new AnnotationElementValueGen(a, cp)); + ElementValuePairGen nvp = new ElementValuePairGen("value", array, cp); + List elements = new ArrayList(); + elements.add(nvp); + return new AnnotationEntryGen(new ObjectType("CombinedAnnotation"), + elements, true, cp); + } + + public AnnotationEntryGen createSimpleInvisibleAnnotation(ConstantPoolGen cp) + { + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_INT, cp, 4); + ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, cp); + ObjectType t = new ObjectType("SimpleAnnotation"); + List elements = new ArrayList(); + elements.add(nvGen); + AnnotationEntryGen a = new AnnotationEntryGen(t, elements, false, cp); + return a; + } +} diff --git a/src/test/java/org/apache/bcel/data/AnnotatedFields.java b/src/test/java/org/apache/bcel/data/AnnotatedFields.java new file mode 100644 index 00000000..c06fefab --- /dev/null +++ b/src/test/java/org/apache/bcel/data/AnnotatedFields.java @@ -0,0 +1,7 @@ +package org.apache.bcel.data; + +public class AnnotatedFields { + @SimpleAnnotation(id=1) int i; + + @SimpleAnnotation(id=2) String s; +} diff --git a/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java b/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java new file mode 100644 index 00000000..d2e10f00 --- /dev/null +++ b/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java @@ -0,0 +1,6 @@ +package org.apache.bcel.data; + +@CombinedAnnotation( { @SimpleAnnotation(id = 4) }) +public class AnnotatedWithCombinedAnnotation +{ +} diff --git a/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java b/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java new file mode 100644 index 00000000..f3817a61 --- /dev/null +++ b/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java @@ -0,0 +1,6 @@ +package org.apache.bcel.data; + +@AnnotationEnumElement(enumval = SimpleEnum.Red) +public class AnnotatedWithEnumClass +{ +} diff --git a/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java b/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java new file mode 100644 index 00000000..8ef6fe4e --- /dev/null +++ b/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java @@ -0,0 +1,10 @@ +package org.apache.bcel.data; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface AnnotationEnumElement +{ + SimpleEnum enumval(); +} \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/data/AnonymousClassTest.java b/src/test/java/org/apache/bcel/data/AnonymousClassTest.java new file mode 100644 index 00000000..10b3993a --- /dev/null +++ b/src/test/java/org/apache/bcel/data/AnonymousClassTest.java @@ -0,0 +1,22 @@ +package org.apache.bcel.data; + +public class AnonymousClassTest +{ + public void foo() + { + new Runnable() + { + public void run() + { + }; + }.run(); + } + + class X + { + } + + static class Y + { + } +} \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java b/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java new file mode 100644 index 00000000..96b0e875 --- /dev/null +++ b/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java @@ -0,0 +1,15 @@ +package org.apache.bcel.data; + +public class AttributeTestClassEM01 +{ + public static void main(String[] argv) + { + class S + { + public void sayhello() + { + System.err.println("hello"); + } + } + } +} diff --git a/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java b/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java new file mode 100644 index 00000000..5a84b49b --- /dev/null +++ b/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java @@ -0,0 +1,16 @@ +package org.apache.bcel.data; + +public class AttributeTestClassEM02 +{ + Runnable r = new Runnable() + { + public void run() + { + System.err.println("hello"); + } + }; + + public static void main(String[] argv) + { + } +} diff --git a/src/test/java/org/apache/bcel/data/CombinedAnnotation.java b/src/test/java/org/apache/bcel/data/CombinedAnnotation.java new file mode 100644 index 00000000..6aea6bc4 --- /dev/null +++ b/src/test/java/org/apache/bcel/data/CombinedAnnotation.java @@ -0,0 +1,10 @@ +package org.apache.bcel.data; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface CombinedAnnotation +{ + public SimpleAnnotation[] value(); +} \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java b/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java new file mode 100644 index 00000000..3633782c --- /dev/null +++ b/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java @@ -0,0 +1,6 @@ +package org.apache.bcel.data; + +@ComplexAnnotation(ival = 4, bval = 2, cval = '5', fval = 3.0f, dval = 33.4, zval = false, jval = 56, sval = 99) +public class ComplexAnnotatedClass +{ +} diff --git a/src/test/java/org/apache/bcel/data/ComplexAnnotation.java b/src/test/java/org/apache/bcel/data/ComplexAnnotation.java new file mode 100644 index 00000000..f8629017 --- /dev/null +++ b/src/test/java/org/apache/bcel/data/ComplexAnnotation.java @@ -0,0 +1,24 @@ +package org.apache.bcel.data; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface ComplexAnnotation +{ + int ival(); + + byte bval(); + + char cval(); + + long jval(); + + double dval(); + + boolean zval(); + + short sval(); + + float fval(); +} \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java b/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java new file mode 100644 index 00000000..549d282d --- /dev/null +++ b/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java @@ -0,0 +1,6 @@ +package org.apache.bcel.data; + +@SimpleAnnotation(id = 4) +public class SimpleAnnotatedClass +{ +} -- GitLab From e41ef3a4cec4b981de90a3108c8c550d7f98284f Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Wed, 16 Aug 2006 01:14:25 +0000 Subject: [PATCH 0354/1313] GSoC: latest changes from Dmitriy Khayredinov git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@431754 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/generic/ElementValueGen.java | 28 +++++++++++-------- .../apache/bcel/AnonymousClassTestCase.java | 2 +- .../apache/bcel/ElementValueGenTestCase.java | 2 +- .../EnclosingMethodAttributeTestCase.java | 2 +- .../apache/bcel/EnumAccessFlagTestCase.java | 2 +- .../GeneratingAnnotatedClassesTestCase.java | 6 ++-- 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java index f7b241e6..b5f83fef 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -5,8 +5,10 @@ import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import org.apache.bcel.classfile.AnnotationElementValue; import org.apache.bcel.classfile.AnnotationEntry; import org.apache.bcel.classfile.ArrayElementValue; +import org.apache.bcel.classfile.ClassElementValue; import org.apache.bcel.classfile.ElementValue; import org.apache.bcel.classfile.EnumElementValue; import org.apache.bcel.classfile.SimpleElementValue; @@ -104,15 +106,17 @@ public abstract class ElementValueGen case '@': // Annotation // TODO: isRuntimeVisible ?????????? // FIXME - return new AnnotationElementValueGen(ANNOTATION, new AnnotationEntryGen(AnnotationEntry.read( - dis, cpGen.getConstantPool(), true), cpGen, false), cpGen); + return new AnnotationElementValueGen(ANNOTATION, + new AnnotationEntryGen(AnnotationEntry.read(dis, cpGen + .getConstantPool(), true), cpGen, false), cpGen); case '[': // Array int numArrayVals = dis.readUnsignedShort(); List arrayVals = new ArrayList(); ElementValue[] evalues = new ElementValue[numArrayVals]; for (int j = 0; j < numArrayVals; j++) { - evalues[j] = ElementValue.readElementValue(dis, cpGen.getConstantPool()); + evalues[j] = ElementValue.readElementValue(dis, cpGen + .getConstantPool()); } return new ArrayElementValueGen(ARRAY, evalues, cpGen); default: @@ -149,15 +153,15 @@ public abstract class ElementValueGen case 'e': // Enum constant return new EnumElementValueGen((EnumElementValue) value, cpool, copyPoolEntries); - // case '@': // Annotation - // return new AnnotationElementValueGen( - // (AnnotationElementValue) value, cpool, copyPoolEntries); - // case '[': // Array - // return new ArrayElementValueGen((ArrayElementValue) value, cpool, - // copyPoolEntries); - // case 'c': // Class - // return new ClassElementValueGen((ClassElementValue) value, cpool, - // copyPoolEntries); + case '@': // Annotation + return new AnnotationElementValueGen( + (AnnotationElementValue) value, cpool, copyPoolEntries); + case '[': // Array + return new ArrayElementValueGen((ArrayElementValue) value, cpool, + copyPoolEntries); + case 'c': // Class + return new ClassElementValueGen((ClassElementValue) value, cpool, + copyPoolEntries); default: throw new RuntimeException("Not implemented yet! (" + value.getElementValueType() + ")"); diff --git a/src/test/java/org/apache/bcel/AnonymousClassTestCase.java b/src/test/java/org/apache/bcel/AnonymousClassTestCase.java index 72d22ca7..b6e88457 100644 --- a/src/test/java/org/apache/bcel/AnonymousClassTestCase.java +++ b/src/test/java/org/apache/bcel/AnonymousClassTestCase.java @@ -37,4 +37,4 @@ public class AnonymousClassTestCase extends AbstractTestCase assertTrue("anonymous inner classes are anonymous", clazz.isAnonymous()); assertTrue("anonymous inner classes are anonymous", clazz.isNested()); } -} +} \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java index 2dab686b..285ce195 100644 --- a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java +++ b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java @@ -220,4 +220,4 @@ public class ElementValueGenTestCase extends AbstractTestCase fail("Unexpected exception whilst checking serialization: " + ioe); } } -} +} \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java b/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java index 489f2188..c46bdfb2 100644 --- a/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java +++ b/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java @@ -86,4 +86,4 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase .equals("org/apache/bcel/data/AttributeTestClassEM02")); tfile.deleteOnExit(); } -} +} \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java b/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java index 01c5b6d0..64a758d8 100644 --- a/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java +++ b/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java @@ -20,4 +20,4 @@ public class EnumAccessFlagTestCase extends AbstractTestCase "Expected SimpleClass class to say it was not an enum - but it didn't !", !clazz.isEnum()); } -} +} \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java index 55372f11..0466ddf9 100644 --- a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java @@ -251,10 +251,10 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase + innerValue, innerValue instanceof AnnotationElementValueGen); AnnotationElementValueGen innerAnnotationValue = (AnnotationElementValueGen) innerValue; - assertTrue("Should be called LSimpleAnnotation; but is called: " + assertTrue("Should be called Lorg/apache/bcel/data/SimpleAnnotation; but is called: " + innerAnnotationValue.getAnnotation().getTypeName(), innerAnnotationValue.getAnnotation().getTypeSignature().equals( - "LSimpleAnnotation;")); + "Lorg/apache/bcel/data/SimpleAnnotation;")); } /** @@ -606,4 +606,4 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase AnnotationEntryGen a = new AnnotationEntryGen(t, elements, false, cp); return a; } -} +} \ No newline at end of file -- GitLab From bfb25f6ee47c20b747ffd173649db085a535704c Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Aug 2006 21:21:01 +0000 Subject: [PATCH 0355/1313] remove unused variables and their allocations git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438629 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ElementValue.java | 1 - src/main/java/org/apache/bcel/generic/ElementValueGen.java | 1 - src/main/java/org/apache/bcel/generic/MethodGen.java | 1 - 3 files changed, 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index a4d94667..1c3f34ea 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -123,7 +123,6 @@ public abstract class ElementValue dis, cpool, false), cpool); case '[': // Array int numArrayVals = dis.readUnsignedShort(); - List arrayVals = new ArrayList(); ElementValue[] evalues = new ElementValue[numArrayVals]; for (int j = 0; j < numArrayVals; j++) { diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java index b5f83fef..bf36816d 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -111,7 +111,6 @@ public abstract class ElementValueGen .getConstantPool(), true), cpGen, false), cpGen); case '[': // Array int numArrayVals = dis.readUnsignedShort(); - List arrayVals = new ArrayList(); ElementValue[] evalues = new ElementValue[numArrayVals]; for (int j = 0; j < numArrayVals; j++) { diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index ccc7f4df..0b7b7107 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -1110,7 +1110,6 @@ public class MethodGen extends FieldGenOrMethodGen { Attribute[] attrs = getAttributes(); ParameterAnnotations paramAnnVisAttr = null; ParameterAnnotations paramAnnInvisAttr = null; - List accumulatedAnnotations = new ArrayList(); for (int i = 0; i < attrs.length; i++) { Attribute attribute = attrs[i]; -- GitLab From 49d370d1eef1964b067fabc4aef7c0f5f1759290 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Aug 2006 21:23:45 +0000 Subject: [PATCH 0356/1313] don't allocate a Character object just to convert a char to a String git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438630 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/SimpleElementValue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java index d22f3cbb..2a54e4f1 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -165,7 +165,7 @@ public class SimpleElementValue extends ElementValue case PRIMITIVE_CHAR: ConstantInteger ch = (ConstantInteger) cpool.getConstant( getIndex(), Constants.CONSTANT_Integer); - return new Character((char) ch.getBytes()).toString(); + return String.valueOf((char)ch.getBytes()); case PRIMITIVE_BOOLEAN: ConstantInteger bo = (ConstantInteger) cpool.getConstant( getIndex(), Constants.CONSTANT_Integer); -- GitLab From b157314d0804d472dc1c84c031ce822034af75c3 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Aug 2006 21:24:53 +0000 Subject: [PATCH 0357/1313] remove unused fields git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438631 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/JavaClass.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index e019e0dc..4bd89016 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -63,7 +63,6 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl private Attribute[] attributes; // attributes defined in the class private AnnotationEntry[] annotations; // annotations defined on the class private byte source = HEAP; // Generated in memory - private boolean isGeneric = false; private boolean isAnonymous = false; private boolean isNested = false; private boolean computedNestedTypeStatus = false; -- GitLab From a37db297a8591a1b5103b053de4c1ceede6a8617 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Aug 2006 21:25:28 +0000 Subject: [PATCH 0358/1313] remove unused fields git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438632 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/ClassGen.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 963fb10e..6c35d204 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -56,7 +56,6 @@ public class ClassGen extends AccessFlags implements Cloneable { private List attribute_vec = new ArrayList(); private List interface_vec = new ArrayList(); private List annotation_vec = new ArrayList(); - private boolean unpackedAnnotations = false; private static BCELComparator _cmp = new BCELComparator() { -- GitLab From 7369673991f8cbbe22d7e46dd2482e753954e046 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Aug 2006 21:27:05 +0000 Subject: [PATCH 0359/1313] remove unused fields git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438633 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/structurals/ControlFlowGraph.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index d3ea4209..c8b0174a 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -390,8 +390,8 @@ public class ControlFlowGraph{ } // End Inner InstructionContextImpl Class. - /** The MethodGen object we're working on. */ - private final MethodGen method_gen; + ///** The MethodGen object we're working on. */ + //private final MethodGen method_gen; /** The Subroutines object for the method whose control flow is represented by this ControlFlowGraph. */ private final Subroutines subroutines; @@ -414,7 +414,7 @@ public class ControlFlowGraph{ instructionContexts.put(instructionhandles[i], new InstructionContextImpl(instructionhandles[i])); } - this.method_gen = method_gen; + //this.method_gen = method_gen; } /** -- GitLab From 469beb55d55a3ad3292b7783b2f4cd386786eb24 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Aug 2006 21:29:01 +0000 Subject: [PATCH 0360/1313] don't use reflective toArray calls git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438634 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/JavaClass.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 4bd89016..deb37051 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -348,7 +348,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl accumulatedAnnotations.add(runtimeAnnotations.getAnnotationEntries()[j]); } } - annotations = (AnnotationEntry[])accumulatedAnnotations.toArray(new AnnotationEntry[]{}); + annotations = (AnnotationEntry[])accumulatedAnnotations.toArray(new AnnotationEntry[accumulatedAnnotations.size()]); annotationsOutOfDate = false; } return annotations; -- GitLab From 0d0b620cbf25cbba2d42fd0695707cebd342b082 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Aug 2006 21:30:16 +0000 Subject: [PATCH 0361/1313] don't use reflective toArray calls git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438635 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Utility.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 94ba1882..53a1072c 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -1406,7 +1406,7 @@ public abstract class Utility { new RuntimeInvisibleAnnotations(riaIndex,riaData.length,new DataInputStream(new ByteArrayInputStream(riaData)),cp.getConstantPool())); } - return (Attribute[])newAttributes.toArray(new Attribute[]{}); + return (Attribute[])newAttributes.toArray(new Attribute[newAttributes.size()]); } catch (IOException e) { System.err.println("IOException whilst processing annotations"); e.printStackTrace(); @@ -1510,7 +1510,7 @@ public abstract class Utility { .add(new RuntimeInvisibleParameterAnnotations(riaIndex, riaData.length, new DataInputStream(new ByteArrayInputStream(riaData)), cp.getConstantPool())); } - return (Attribute[]) newAttributes.toArray(new Attribute[] {}); + return (Attribute[]) newAttributes.toArray(new Attribute[newAttributes.size()]); } catch (IOException e) { -- GitLab From 86234a37f52631e4ec364e7e914042d0cbc52de9 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Aug 2006 21:31:16 +0000 Subject: [PATCH 0362/1313] don't use reflective toArray calls git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438636 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/ClassGen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 6c35d204..d0771fa9 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -190,7 +190,7 @@ public class ClassGen extends AccessFlags implements Cloneable { } } return (AnnotationEntryGen[]) annotationGenObjs - .toArray(new AnnotationEntryGen[] {}); + .toArray(new AnnotationEntryGen[annotationGenObjs.size()]); } -- GitLab From 4320cc5bd7107e61e9f8cfc6fbbd8ae7651f37c1 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Aug 2006 21:34:41 +0000 Subject: [PATCH 0363/1313] make sure instruction list iterator throws NoSuchElementException when the end of the list is done and a call to next() is made, and not NullPointerException git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438640 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/InstructionList.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 048b7f05..f9e5cc3f 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -25,6 +25,8 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.Constant; import org.apache.bcel.util.ByteSequence; @@ -991,7 +993,9 @@ public class InstructionList implements Serializable { private InstructionHandle ih = start; - public Object next() { + public Object next() throws NoSuchElementException { + if (ih == null) + throw new NoSuchElementException(); InstructionHandle i = ih; ih = ih.next; return i; -- GitLab From 4983f0b519aedc82e2d0b52a794ae9f90b6bf21c Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Aug 2006 21:47:14 +0000 Subject: [PATCH 0364/1313] remove needless synchronization git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438652 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/structurals/Subroutines.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index a7c622e9..f27ad1ad 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -17,10 +17,13 @@ package org.apache.bcel.verifier.structurals; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; +import java.util.Map; import java.util.Set; + import org.apache.bcel.generic.ASTORE; import org.apache.bcel.generic.ATHROW; import org.apache.bcel.generic.BranchInstruction; @@ -412,7 +415,7 @@ public class Subroutines{ // instructions that belong to a subroutine. Set instructions_assigned = new HashSet(); // we don't want to assign an instruction to two or more Subroutine objects. - Hashtable colors = new Hashtable(); //Graph colouring. Key: InstructionHandle, Value: Integer . + Map colors = new HashMap(); //Graph colouring. Key: InstructionHandle, Value: Integer . iter = sub_leaders.iterator(); while (iter.hasNext()){ -- GitLab From 6df62241a759bb5d3c7528a2effa34281a95639d Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Aug 2006 21:52:09 +0000 Subject: [PATCH 0365/1313] remove needless synchronization of collection fields as these private fields are only modified in the constructor which is guaranteed thread safe. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438658 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/structurals/ControlFlowGraph.java | 5 +++-- .../bcel/verifier/structurals/ExceptionHandlers.java | 8 +++++--- .../org/apache/bcel/verifier/structurals/Subroutines.java | 5 ++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index c8b0174a..5a9d451e 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -18,8 +18,9 @@ package org.apache.bcel.verifier.structurals; import java.util.ArrayList; -import java.util.Hashtable; +import java.util.HashMap; import java.util.Map; + import org.apache.bcel.generic.ATHROW; import org.apache.bcel.generic.BranchInstruction; import org.apache.bcel.generic.GotoInstruction; @@ -400,7 +401,7 @@ public class ControlFlowGraph{ private final ExceptionHandlers exceptionhandlers; /** All InstructionContext instances of this ControlFlowGraph. */ - private Hashtable instructionContexts = new Hashtable(); //keys: InstructionHandle, values: InstructionContextImpl + private Map instructionContexts = new HashMap(); //keys: InstructionHandle, values: InstructionContextImpl /** * A Control Flow Graph. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index 8c5d5899..524cefaf 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -17,9 +17,11 @@ package org.apache.bcel.verifier.structurals; +import java.util.HashMap; import java.util.HashSet; -import java.util.Hashtable; +import java.util.Map; import java.util.Set; + import org.apache.bcel.generic.CodeExceptionGen; import org.apache.bcel.generic.InstructionHandle; import org.apache.bcel.generic.MethodGen; @@ -35,13 +37,13 @@ public class ExceptionHandlers{ * The ExceptionHandler instances. * Key: InstructionHandle objects, Values: HashSet instances. */ - private Hashtable exceptionhandlers; + private Map exceptionhandlers; /** * Constructor. Creates a new ExceptionHandlers instance. */ public ExceptionHandlers(MethodGen mg){ - exceptionhandlers = new Hashtable(); + exceptionhandlers = new HashMap(); CodeExceptionGen[] cegs = mg.getExceptionHandlers(); for (int i=0; i Date: Wed, 30 Aug 2006 21:55:19 +0000 Subject: [PATCH 0366/1313] constant arrays should be static final git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438659 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/generic/InstructionFactory.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index 5d633922..c099e571 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -30,6 +30,10 @@ import org.apache.bcel.Constants; */ public class InstructionFactory implements InstructionConstants, java.io.Serializable { + private static final String[] short_names = { + "C", "F", "D", "B", "S", "I", "L" + }; + protected ClassGen cg; protected ConstantPoolGen cp; @@ -548,9 +552,6 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali && (src == Constants.T_CHAR || src == Constants.T_BYTE || src == Constants.T_SHORT)) { src = Constants.T_INT; } - String[] short_names = { - "C", "F", "D", "B", "S", "I", "L" - }; String name = "org.apache.bcel.generic." + short_names[src - Constants.T_CHAR] + "2" + short_names[dest - Constants.T_CHAR]; Instruction i = null; -- GitLab From b895f0b47405bbe1181c968dfb092129b97cb379 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Aug 2006 21:57:25 +0000 Subject: [PATCH 0367/1313] make it clear that switch case fall thru was intended with added comments. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@438661 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Utility.java | 1 + src/main/java/org/apache/bcel/util/BCELFactory.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 53a1072c..731307e0 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -328,6 +328,7 @@ public abstract class Utility { case Constants.NEW: case Constants.CHECKCAST: buf.append("\t"); + /* FALL THRU */ case Constants.INSTANCEOF: index = bytes.readUnsignedShort(); buf.append("\t<").append( diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index a38be74e..33765ba5 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -181,6 +181,7 @@ class BCELFactory extends EmptyVisitor { break; case Constants.MULTIANEWARRAY: dim = ((MULTIANEWARRAY) i).getDimensions(); + /* FALL THRU */ case Constants.ANEWARRAY: case Constants.NEWARRAY: if (type instanceof ArrayType) { -- GitLab From 74a823249c66276c50edfeaec4fcadbc35cca2fa Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 20 Feb 2007 08:29:08 +0000 Subject: [PATCH 0368/1313] Bug 41648 : InstructionFactory missing % operator for Float, Double Fix by Charlie Nolan git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@509457 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/InstructionFactory.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index c099e571..8cc9f805 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -352,6 +352,8 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali return FMUL; case '/': return FDIV; + case '%': + return FREM; default: throw new RuntimeException("Invalid operand " + op); } @@ -368,6 +370,8 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali return DMUL; case '/': return DDIV; + case '%': + return DREM; default: throw new RuntimeException("Invalid operand " + op); } -- GitLab From 03948200d82cc5638cf873bb05bab5162999c58b Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 20 Feb 2007 08:34:21 +0000 Subject: [PATCH 0369/1313] Bug 41553:@since tag incorrect for Annotation classes in BCEL trunk should be 5.3 - found by Trevor Harmon git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@509462 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/AnnotationDefault.java | 2 +- src/main/java/org/apache/bcel/classfile/AnnotationEntry.java | 2 +- src/main/java/org/apache/bcel/classfile/Annotations.java | 2 +- src/main/java/org/apache/bcel/classfile/ElementValue.java | 2 +- src/main/java/org/apache/bcel/classfile/ElementValuePair.java | 2 +- .../org/apache/bcel/classfile/ParameterAnnotationEntry.java | 2 +- .../java/org/apache/bcel/classfile/ParameterAnnotations.java | 2 +- .../org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java | 2 +- .../bcel/classfile/RuntimeInvisibleParameterAnnotations.java | 2 +- .../org/apache/bcel/classfile/RuntimeVisibleAnnotations.java | 2 +- .../bcel/classfile/RuntimeVisibleParameterAnnotations.java | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index 50a3fd42..ac5c84e1 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -25,7 +25,7 @@ import org.apache.bcel.Constants; * * @version $Id: AnnotationDefault 1 2005-02-13 03:15:08Z dbrosius $ * @author D. Brosius - * @since 5.2 + * @since 5.3 */ public class AnnotationDefault extends Attribute { diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 6c29a392..d391af1e 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -28,7 +28,7 @@ import org.apache.bcel.Constants; * * @version $Id: AnnotationEntry * @author D. Brosius - * @since 5.2 + * @since 5.3 */ public class AnnotationEntry implements Node, Constants { diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index be6b92ff..4aaf1e91 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -25,7 +25,7 @@ import java.io.IOException; * * @version $Id: Annotations * @author D. Brosius - * @since 5.2 + * @since 5.3 */ public abstract class Annotations extends Attribute { diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index 1c3f34ea..ea5f0073 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -25,7 +25,7 @@ import java.util.List; /** * @version $Id: ElementValue * @author D. Brosius - * @since 5.2 + * @since 5.3 */ public abstract class ElementValue { diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index 9595d92c..555ca315 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -25,7 +25,7 @@ import org.apache.bcel.Constants; * * @version $Id: ElementValuePair * @author D. Brosius - * @since 5.2 + * @since 5.3 */ public class ElementValuePair { diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index ae6b9069..8ff27059 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -25,7 +25,7 @@ import org.apache.bcel.Constants; * * @version $Id: ParameterAnnotationEntry * @author D. Brosius - * @since 5.2 + * @since 5.3 */ public class ParameterAnnotationEntry implements Node, Constants { diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index 365bd3c1..68660081 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -24,7 +24,7 @@ import java.io.IOException; * * @version $Id: ParameterAnnotations * @author D. Brosius - * @since 5.2 + * @since 5.3 */ public abstract class ParameterAnnotations extends Attribute { diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 39fe9d7e..804c5652 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -27,7 +27,7 @@ import org.apache.bcel.Constants; * * @version $Id: RuntimeInvisibleAnnotations * @author D. Brosius - * @since 5.2 + * @since 5.3 */ public class RuntimeInvisibleAnnotations extends Annotations { diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 86f0c37e..d42ed525 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -26,7 +26,7 @@ import org.apache.bcel.Constants; * * @version $Id: RuntimeInvisibleParameterAnnotations * @author D. Brosius - * @since 5.2 + * @since 5.3 */ public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 662d1af1..a9474ca8 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -27,7 +27,7 @@ import org.apache.bcel.Constants; * * @version $Id: RuntimeVisibleAnnotations * @author D. Brosius - * @since 5.2 + * @since 5.3 */ public class RuntimeVisibleAnnotations extends Annotations { diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index a24b6729..d17e7fce 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -26,7 +26,7 @@ import org.apache.bcel.Constants; * * @version $Id: RuntimeVisibleParameterAnnotations * @author D. Brosius - * @since 5.2 + * @since 5.3 */ public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { -- GitLab From b56656a9793eb01fd87b58ab73b82f9b4ba8cb32 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 10 Mar 2007 14:48:05 +0000 Subject: [PATCH 0370/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=41794 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@516720 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 10 +++------- .../java/org/apache/bcel/util/InstructionFinder.java | 4 ++-- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index fc9a7ba5..e0951e6b 100755 --- a/pom.xml +++ b/pom.xml @@ -62,7 +62,7 @@ tcurdt at apache.org ASF http://www.apache.org/ - +10 + +1 @@ -169,15 +169,11 @@ - - jakarta-regexp - jakarta-regexp - 1.4 - junit junit - 3.8.1 + 3.8.2 + test diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index 57cb55ba..0c6b76b6 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -38,8 +38,8 @@ import org.apache.bcel.generic.InstructionList; * equivalents. * *

          - * This class internally uses the - * Regexp package to search for regular expressions. + * This class internally uses the java.util.regex + * package to search for regular expressions. * * A typical application would look like this: * -- GitLab From dd07c4244e52b5f69632079385c6bf7b3751b717 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 10 Mar 2007 14:51:20 +0000 Subject: [PATCH 0371/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=41795 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@516721 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ClassParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index cbf90ec6..69514477 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -206,7 +206,7 @@ public final class ClassParser { } if (((access_flags & Constants.ACC_ABSTRACT) != 0) && ((access_flags & Constants.ACC_FINAL) != 0)) { - throw new ClassFormatException("Class can't be both final and abstract"); + throw new ClassFormatException("Class " + file_name + " can't be both final and abstract"); } class_name_index = file.readUnsignedShort(); superclass_name_index = file.readUnsignedShort(); -- GitLab From 9dcd9aceae72538910fbe8ef278dd4e1b8fd388d Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 10 Mar 2007 14:54:58 +0000 Subject: [PATCH 0372/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=39770 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@516722 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ClassParser.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 69514477..0cb7751e 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -162,7 +162,9 @@ public final class ClassParser { } finally { // Read everything of interest, so close the file if (fileOwned) { - file.close(); + if (file != null) { + file.close(); + } if (zip != null) { zip.close(); } -- GitLab From 9872c7a6434680c6adb3d029df2bd651f8d06d41 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 10 Mar 2007 15:08:05 +0000 Subject: [PATCH 0373/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=40044 and some source code cleanup git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@516724 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/util/InstructionFinder.java | 237 +++++++----------- 1 file changed, 97 insertions(+), 140 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index 0c6b76b6..039e3b4f 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -24,6 +24,7 @@ import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; + import org.apache.bcel.Constants; import org.apache.bcel.generic.ClassGenException; import org.apache.bcel.generic.Instruction; @@ -64,6 +65,7 @@ import org.apache.bcel.generic.InstructionList; * @see Instruction * @see InstructionList */ +@SuppressWarnings("unchecked") public class InstructionFinder { private static final int OFFSET = 32767; // char + OFFSET is @@ -227,7 +229,7 @@ public class InstructionFinder { while (start < il_string.length() && matcher.find(start)) { int startExpr = matcher.start(); int endExpr = matcher.end(); - int lenExpr = (endExpr - startExpr) + 1; + int lenExpr = (endExpr - startExpr); InstructionHandle[] match = getMatch(startExpr, lenExpr); if ((constraint == null) || constraint.checkCode(match)) { matches.add(match); @@ -314,122 +316,77 @@ public class InstructionFinder { // Initialize pattern map static { - map - .put( - "arithmeticinstruction", - "(irem|lrem|iand|ior|ineg|isub|lneg|fneg|fmul|ldiv|fadd|lxor|frem|idiv|land|ixor|ishr|fsub|lshl|fdiv|iadd|lor|dmul|lsub|ishl|imul|lmul|lushr|dneg|iushr|lshr|ddiv|drem|dadd|ladd|dsub)"); - map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial)"); - map - .put( - "arrayinstruction", - "(baload|aastore|saload|caload|fastore|lastore|iaload|castore|iastore|aaload|bastore|sastore|faload|laload|daload|dastore)"); - map.put("gotoinstruction", "(goto|goto_w)"); - map.put("conversioninstruction", - "(d2l|l2d|i2s|d2i|l2i|i2b|l2f|d2f|f2i|i2d|i2l|f2d|i2c|f2l|i2f)"); - map.put("localvariableinstruction", - "(fstore|iinc|lload|dstore|dload|iload|aload|astore|istore|fload|lstore)"); - map.put("loadinstruction", "(fload|dload|lload|iload|aload)"); - map.put("fieldinstruction", "(getfield|putstatic|getstatic|putfield)"); - map - .put( - "cpinstruction", - "(ldc2_w|invokeinterface|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)"); - map.put("stackinstruction", "(dup2|swap|dup2_x2|pop|pop2|dup|dup2_x1|dup_x2|dup_x1)"); - map - .put( - "branchinstruction", - "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); - map.put("returninstruction", "(lreturn|ireturn|freturn|dreturn|areturn|return)"); - map.put("storeinstruction", "(istore|fstore|dstore|astore|lstore)"); - map.put("select", "(tableswitch|lookupswitch)"); - map - .put( - "ifinstruction", - "(ifeq|ifgt|if_icmpne|if_icmpeq|ifge|ifnull|ifne|if_icmple|if_icmpge|if_acmpeq|if_icmplt|if_acmpne|ifnonnull|iflt|if_icmpgt|ifle)"); - map.put("jsrinstruction", "(jsr|jsr_w)"); - map.put("variablelengthinstruction", "(tableswitch|jsr|goto|lookupswitch)"); - map.put("unconditionalbranch", "(goto|jsr|jsr_w|athrow|goto_w)"); - map.put("constantpushinstruction", "(dconst|bipush|sipush|fconst|iconst|lconst)"); - map - .put( - "typedinstruction", - "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)"); - map.put("popinstruction", "(fstore|dstore|pop|pop2|astore|putstatic|istore|lstore)"); - map.put("allocationinstruction", "(multianewarray|new|anewarray|newarray)"); - map - .put( - "indexedinstruction", - "(lload|lstore|fload|ldc2_w|invokeinterface|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)"); - map - .put( - "pushinstruction", - "(dup|lload|dup2|bipush|fload|ldc2_w|sipush|lconst|fconst|dload|getstatic|ldc_w|aconst_null|dconst|iload|ldc|iconst|aload)"); - map - .put( - "stackproducer", - "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)"); - map - .put( - "stackconsumer", - "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)"); - map - .put( - "exceptionthrower", - "(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|ldc|invokestatic|daload)"); - map - .put( - "loadclass", - "(multianewarray|invokeinterface|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)"); - map - .put( - "instructiontargeter", - "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); - // Some aliases - map.put("if_icmp", "(if_icmpne|if_icmpeq|if_icmple|if_icmpge|if_icmplt|if_icmpgt)"); - map.put("if_acmp", "(if_acmpeq|if_acmpne)"); - map.put("if", "(ifeq|ifne|iflt|ifge|ifgt|ifle)"); - // Precompile some aliases first - map.put("iconst", precompile(Constants.ICONST_0, Constants.ICONST_5, Constants.ICONST_M1)); - map.put("lconst", new String(new char[] { - '(', makeChar(Constants.LCONST_0), '|', makeChar(Constants.LCONST_1), ')' - })); - map.put("dconst", new String(new char[] { - '(', makeChar(Constants.DCONST_0), '|', makeChar(Constants.DCONST_1), ')' - })); - map.put("fconst", new String(new char[] { - '(', makeChar(Constants.FCONST_0), '|', makeChar(Constants.FCONST_1), ')' - })); - map.put("iload", precompile(Constants.ILOAD_0, Constants.ILOAD_3, Constants.ILOAD)); - map.put("dload", precompile(Constants.DLOAD_0, Constants.DLOAD_3, Constants.DLOAD)); - map.put("fload", precompile(Constants.FLOAD_0, Constants.FLOAD_3, Constants.FLOAD)); - map.put("aload", precompile(Constants.ALOAD_0, Constants.ALOAD_3, Constants.ALOAD)); - map.put("istore", precompile(Constants.ISTORE_0, Constants.ISTORE_3, Constants.ISTORE)); - map.put("dstore", precompile(Constants.DSTORE_0, Constants.DSTORE_3, Constants.DSTORE)); - map.put("fstore", precompile(Constants.FSTORE_0, Constants.FSTORE_3, Constants.FSTORE)); - map.put("astore", precompile(Constants.ASTORE_0, Constants.ASTORE_3, Constants.ASTORE)); - // Compile strings - for (Iterator i = map.keySet().iterator(); i.hasNext();) { - String key = (String) i.next(); - String value = (String) map.get(key); - char ch = value.charAt(1); // Omit already precompiled patterns - if (ch < OFFSET) { - map.put(key, compilePattern(value)); // precompile all patterns - } - } - // Add instruction alias to match anything - StringBuffer buf = new StringBuffer("("); - for (short i = 0; i < NO_OPCODES; i++) { - if (Constants.NO_OF_OPERANDS[i] != Constants.UNDEFINED) { // Not an - // invalid - // opcode - buf.append(makeChar(i)); - if (i < NO_OPCODES - 1) { - buf.append('|'); - } - } - } - buf.append(')'); - map.put("instruction", buf.toString()); + map.put("arithmeticinstruction","(irem|lrem|iand|ior|ineg|isub|lneg|fneg|fmul|ldiv|fadd|lxor|frem|idiv|land|ixor|ishr|fsub|lshl|fdiv|iadd|lor|dmul|lsub|ishl|imul|lmul|lushr|dneg|iushr|lshr|ddiv|drem|dadd|ladd|dsub)"); + map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial)"); + map.put("arrayinstruction", "(baload|aastore|saload|caload|fastore|lastore|iaload|castore|iastore|aaload|bastore|sastore|faload|laload|daload|dastore)"); + map.put("gotoinstruction", "(goto|goto_w)"); + map.put("conversioninstruction", "(d2l|l2d|i2s|d2i|l2i|i2b|l2f|d2f|f2i|i2d|i2l|f2d|i2c|f2l|i2f)"); + map.put("localvariableinstruction","(fstore|iinc|lload|dstore|dload|iload|aload|astore|istore|fload|lstore)"); + map.put("loadinstruction", "(fload|dload|lload|iload|aload)"); + map.put("fieldinstruction", "(getfield|putstatic|getstatic|putfield)"); + map.put("cpinstruction", "(ldc2_w|invokeinterface|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)"); + map.put("stackinstruction", "(dup2|swap|dup2_x2|pop|pop2|dup|dup2_x1|dup_x2|dup_x1)"); + map.put("branchinstruction", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); + map.put("returninstruction", "(lreturn|ireturn|freturn|dreturn|areturn|return)"); + map.put("storeinstruction", "(istore|fstore|dstore|astore|lstore)"); + map.put("select", "(tableswitch|lookupswitch)"); + map.put("ifinstruction", "(ifeq|ifgt|if_icmpne|if_icmpeq|ifge|ifnull|ifne|if_icmple|if_icmpge|if_acmpeq|if_icmplt|if_acmpne|ifnonnull|iflt|if_icmpgt|ifle)"); + map.put("jsrinstruction", "(jsr|jsr_w)"); + map.put("variablelengthinstruction", "(tableswitch|jsr|goto|lookupswitch)"); + map.put("unconditionalbranch", "(goto|jsr|jsr_w|athrow|goto_w)"); + map.put("constantpushinstruction", "(dconst|bipush|sipush|fconst|iconst|lconst)"); + map.put("typedinstruction", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)"); + map.put("popinstruction", "(fstore|dstore|pop|pop2|astore|putstatic|istore|lstore)"); + map.put("allocationinstruction", "(multianewarray|new|anewarray|newarray)"); + map.put("indexedinstruction", "(lload|lstore|fload|ldc2_w|invokeinterface|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)"); + map.put("pushinstruction", "(dup|lload|dup2|bipush|fload|ldc2_w|sipush|lconst|fconst|dload|getstatic|ldc_w|aconst_null|dconst|iload|ldc|iconst|aload)"); + map.put("stackproducer", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)"); + map.put("stackconsumer", "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)"); + map.put("exceptionthrower","(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|ldc|invokestatic|daload)"); + map.put("loadclass", "(multianewarray|invokeinterface|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)"); + map.put("instructiontargeter", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); + // Some aliases + map.put("if_icmp", "(if_icmpne|if_icmpeq|if_icmple|if_icmpge|if_icmplt|if_icmpgt)"); + map.put("if_acmp", "(if_acmpeq|if_acmpne)"); + map.put("if", "(ifeq|ifne|iflt|ifge|ifgt|ifle)"); + // Precompile some aliases first + map.put("iconst", precompile(Constants.ICONST_0, Constants.ICONST_5, Constants.ICONST_M1)); + map.put("lconst", new String(new char[] { '(', makeChar(Constants.LCONST_0), '|', makeChar(Constants.LCONST_1), ')' })); + map.put("dconst", new String(new char[] { '(', makeChar(Constants.DCONST_0), '|', makeChar(Constants.DCONST_1), ')' })); + map.put("fconst", new String(new char[] { '(', makeChar(Constants.FCONST_0), '|', makeChar(Constants.FCONST_1), ')' })); + map.put("iload", precompile(Constants.ILOAD_0, Constants.ILOAD_3, Constants.ILOAD)); + map.put("dload", precompile(Constants.DLOAD_0, Constants.DLOAD_3, Constants.DLOAD)); + map.put("fload", precompile(Constants.FLOAD_0, Constants.FLOAD_3, Constants.FLOAD)); + map.put("aload", precompile(Constants.ALOAD_0, Constants.ALOAD_3, Constants.ALOAD)); + map.put("istore", precompile(Constants.ISTORE_0, Constants.ISTORE_3, Constants.ISTORE)); + map.put("dstore", precompile(Constants.DSTORE_0, Constants.DSTORE_3, Constants.DSTORE)); + map.put("fstore", precompile(Constants.FSTORE_0, Constants.FSTORE_3, Constants.FSTORE)); + map.put("astore", precompile(Constants.ASTORE_0, Constants.ASTORE_3, Constants.ASTORE)); + // Compile strings + for (Iterator i = map.keySet().iterator(); i.hasNext();) { + String key = (String) i.next(); + String value = (String) map.get(key); + char ch = value.charAt(1); // Omit already precompiled patterns + if (ch < OFFSET) { + map.put(key, compilePattern(value)); // precompile all + // patterns + } + } + // Add instruction alias to match anything + StringBuffer buf = new StringBuffer("("); + for (short i = 0; i < NO_OPCODES; i++) { + if (Constants.NO_OF_OPERANDS[i] != Constants.UNDEFINED) { // Not + // an + // invalid + // opcode + buf.append(makeChar(i)); + if (i < NO_OPCODES - 1) { + buf.append('|'); + } + } + } + buf.append(')'); + map.put("instruction", buf.toString()); } @@ -446,27 +403,27 @@ public class InstructionFinder { /* - * Internal debugging routines. - */ - private static final String pattern2string( String pattern ) { - return pattern2string(pattern, true); - } - - - private static final String pattern2string( String pattern, boolean make_string ) { - StringBuffer buf = new StringBuffer(); - for (int i = 0; i < pattern.length(); i++) { - char ch = pattern.charAt(i); - if (ch >= OFFSET) { - if (make_string) { - buf.append(Constants.OPCODE_NAMES[ch - OFFSET]); - } else { - buf.append((ch - OFFSET)); - } - } else { - buf.append(ch); - } - } - return buf.toString(); - } + * Internal debugging routines. + */ +// private static final String pattern2string( String pattern ) { +// return pattern2string(pattern, true); +// } + + +// private static final String pattern2string( String pattern, boolean make_string ) { +// StringBuffer buf = new StringBuffer(); +// for (int i = 0; i < pattern.length(); i++) { +// char ch = pattern.charAt(i); +// if (ch >= OFFSET) { +// if (make_string) { +// buf.append(Constants.OPCODE_NAMES[ch - OFFSET]); +// } else { +// buf.append((ch - OFFSET)); +// } +// } else { +// buf.append(ch); +// } +// } +// return buf.toString(); +// } } -- GitLab From 404f0486649454b5e7a83f7389250f912526a591 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 10 Mar 2007 15:19:29 +0000 Subject: [PATCH 0374/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=41753 were empty files git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@516729 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/AnnotationGen.java | 0 .../java/org/apache/bcel/generic/ElementNameValuePairGen.java | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/org/apache/bcel/generic/AnnotationGen.java delete mode 100644 src/main/java/org/apache/bcel/generic/ElementNameValuePairGen.java diff --git a/src/main/java/org/apache/bcel/generic/AnnotationGen.java b/src/main/java/org/apache/bcel/generic/AnnotationGen.java deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/org/apache/bcel/generic/ElementNameValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementNameValuePairGen.java deleted file mode 100644 index e69de29b..00000000 -- GitLab From e2f30f11397522db11616ed7fe966961b2e62dcd Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 10 Mar 2007 15:21:34 +0000 Subject: [PATCH 0375/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=41716 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@516730 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/util/ClassPath.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 59a4923a..55965e44 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -26,10 +26,12 @@ import java.io.Serializable; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.StringTokenizer; +import java.util.Vector; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -215,6 +217,22 @@ public class ClassPath implements Serializable { return null; } + /** + * @param name fully qualified resource name, e.g. java/lang/String.class + * @return An Enumeration of URLs supplying the resource, or an + * empty Enumeration if no resource with that name. + */ + public Enumeration getResources(String name) { + Vector results = new Vector(); + for (int i = 0; i < paths.length; i++) { + URL url; + if ((url = paths[i].getResource(name)) != null) { + results.add(url); + } + } + return results.elements(); + } + /** * @param name fully qualified file name, e.g. java/lang/String * @param suffix file name ends with suff, e.g. .java -- GitLab From 97c4a124a3d6be835221650a9aa218f4fe37aff2 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 1 Apr 2007 14:55:11 +0000 Subject: [PATCH 0376/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=41974 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@524609 13f79535-47bb-0310-9956-ffa450edef68 --- .../verifier/statics/StringRepresentation.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 379bd977..98f996da 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -17,6 +17,7 @@ package org.apache.bcel.verifier.statics; +import org.apache.bcel.classfile.Annotations; import org.apache.bcel.classfile.Code; import org.apache.bcel.classfile.CodeException; import org.apache.bcel.classfile.ConstantClass; @@ -42,6 +43,7 @@ import org.apache.bcel.classfile.LineNumber; import org.apache.bcel.classfile.LineNumberTable; import org.apache.bcel.classfile.LocalVariable; import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.LocalVariableTypeTable; import org.apache.bcel.classfile.Method; import org.apache.bcel.classfile.Node; import org.apache.bcel.classfile.Signature; @@ -127,6 +129,20 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor tostring = ""; // We don't need real code outputs. } + public void visitAnnotation(Annotations obj) + { + //this is invoked whenever an annotation is found + //when verifier is passed over a class + tostring = toString(obj); + } + + public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) + { + //this is invoked whenever a local variable type is found + //when verifier is passed over a class + tostring = toString(obj); + } + public void visitCodeException(CodeException obj) { tostring = toString(obj); } -- GitLab From f695cec8d6a98f810c14afb8bb554250f02c03ab Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 1 Apr 2007 14:58:34 +0000 Subject: [PATCH 0377/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=39695 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@524610 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/generic/MethodGen.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 0b7b7107..3ae319ae 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -32,6 +32,7 @@ import org.apache.bcel.classfile.LineNumber; import org.apache.bcel.classfile.LineNumberTable; import org.apache.bcel.classfile.LocalVariable; import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.LocalVariableTypeTable; import org.apache.bcel.classfile.Method; import org.apache.bcel.classfile.ParameterAnnotationEntry; import org.apache.bcel.classfile.ParameterAnnotations; @@ -237,6 +238,23 @@ public class MethodGen extends FieldGenOrMethodGen { addLocalVariable(l.getName(), Type.getType(l.getSignature()), l .getIndex(), start, end); } + } else if (a instanceof LocalVariableTypeTable) { + LocalVariable[] lv = ((LocalVariableTypeTable) a).getLocalVariableTypeTable(); + removeLocalVariables(); + for (int k = 0; k < lv.length; k++) { + LocalVariable l = lv[k]; + InstructionHandle start = il.findHandle(l.getStartPC()); + InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength()); + // Repair malformed handles + if (null == start) { + start = il.getStart(); + } + if (null == end) { + end = il.getEnd(); + } + addLocalVariable(l.getName(), Type.getType(l.getSignature()), l + .getIndex(), start, end); + } } else { addCodeAttribute(a); } @@ -1062,6 +1080,13 @@ public class MethodGen extends FieldGenOrMethodGen { signature = Utility.methodSignatureToString(signature, name, access, true, getLocalVariableTable(cp)); StringBuffer buf = new StringBuffer(signature); + for (int i = 0; i < getAttributes().length; i++) { + Attribute a = getAttributes()[i]; + if (!((a instanceof Code) || (a instanceof ExceptionTable))) { + buf.append(" [").append(a.toString()).append("]"); + } + } + if (throws_vec.size() > 0) { for (Iterator e = throws_vec.iterator(); e.hasNext();) { buf.append("\n\t\tthrows ").append(e.next()); -- GitLab From 1f89962fb15118104c114398c1d8e324cf11e3b2 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Fri, 6 Apr 2007 17:41:12 +0000 Subject: [PATCH 0378/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=40577 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@526235 13f79535-47bb-0310-9956-ffa450edef68 --- .../verifier/structurals/Pass3bVerifier.java | 47 ++++++++++++++++++- .../verifier/structurals/Subroutines.java | 2 +- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 9df51fbf..55b2dbd0 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -23,13 +23,17 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Vector; + import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Method; import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GETFIELD; import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InvokeInstruction; import org.apache.bcel.generic.JsrInstruction; +import org.apache.bcel.generic.LoadInstruction; import org.apache.bcel.generic.MethodGen; import org.apache.bcel.generic.ObjectType; import org.apache.bcel.generic.RET; @@ -40,6 +44,7 @@ import org.apache.bcel.verifier.PassVerifier; import org.apache.bcel.verifier.VerificationResult; import org.apache.bcel.verifier.Verifier; import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; import org.apache.bcel.verifier.exc.VerifierConstraintViolatedException; /** @@ -126,7 +131,7 @@ public final class Pass3bVerifier extends PassVerifier{ * The proof of termination is about the existence of a * fix point of frame merging. */ - private void circulationPump(ControlFlowGraph cfg, InstructionContext start, Frame vanillaFrame, InstConstraintVisitor icv, ExecutionVisitor ev){ + private void circulationPump(MethodGen m,ControlFlowGraph cfg, InstructionContext start, Frame vanillaFrame, InstConstraintVisitor icv, ExecutionVisitor ev){ final Random random = new Random(); InstructionContextQueue icq = new InstructionContextQueue(); @@ -246,6 +251,44 @@ public final class Pass3bVerifier extends PassVerifier{ this.addMessage("Warning: ReturnInstruction '"+ic+"' may leave method with an uninitialized object on the operand stack '"+os+"'."); } } + //see JVM $4.8.2 + //TODO implement all based on stack + Type returnedType = null; + if( ih.getPrev().getInstruction() instanceof InvokeInstruction ) + { + returnedType = ((InvokeInstruction)ih.getPrev().getInstruction()).getType(m.getConstantPool()); + } + if( ih.getPrev().getInstruction() instanceof LoadInstruction ) + { + int index = ((LoadInstruction)ih.getPrev().getInstruction()).getIndex(); + returnedType = lvs.get(index); + } + if( ih.getPrev().getInstruction() instanceof GETFIELD ) + { + returnedType = ((GETFIELD)ih.getPrev().getInstruction()).getType(m.getConstantPool()); + } + if( returnedType != null ) + { + if( returnedType instanceof ObjectType ) + { + try + { + if( !((ObjectType)returnedType).isAssignmentCompatibleWith(m.getReturnType()) ) + { + throw new StructuralCodeConstraintException("Returned type "+returnedType+" does not match Method's return type "+m.getReturnType()); + } + } + catch (ClassNotFoundException e) + { + //dont know what do do now, so raise RuntimeException + throw new RuntimeException(e); + } + } + else if( !returnedType.equals(m.getReturnType()) ) + { + throw new StructuralCodeConstraintException("Returned type "+returnedType+" does not match Method's return type "+m.getReturnType()); + } + } } }while ((ih = ih.getNext()) != null); @@ -321,7 +364,7 @@ public final class Pass3bVerifier extends PassVerifier{ f.getLocals().set(twoslotoffset + j + (mg.isStatic()?0:1), Type.UNKNOWN); } } - circulationPump(cfg, cfg.contextOf(mg.getInstructionList().getStart()), f, icv, ev); + circulationPump(mg,cfg, cfg.contextOf(mg.getInstructionList().getStart()), f, icv, ev); } } catch (VerifierConstraintViolatedException ce){ diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index f23330d5..b6daf7bb 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -565,7 +565,7 @@ public class Subroutines{ return s; } } -System.err.println("DEBUG: Please verify '"+any+"' lies in dead code."); +System.err.println("DEBUG: Please verify '"+any.toString(true)+"' lies in dead code."); return null; //throw new AssertionViolatedException("No subroutine for InstructionHandle found (DEAD CODE?)."); } -- GitLab From 12d3d4b0699c0e5ec7bc5a42e4225f2c818c80b6 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Fri, 6 Apr 2007 17:44:25 +0000 Subject: [PATCH 0379/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=42015 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@526238 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/verifier/statics/Pass2Verifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 09147ce5..99c941db 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -1014,7 +1014,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ }// for all local variables localvariables[i] in the LocalVariableTable attribute atts[a] END num_of_lvt_attribs++; - if (num_of_lvt_attribs > obj.getMaxLocals()){ + if (!m.isStatic() && num_of_lvt_attribs > obj.getMaxLocals()){ throw new ClassConstraintException("Number of LocalVariableTable attributes of Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"') exceeds number of local variable slots '"+obj.getMaxLocals()+"' ('There may be no more than one LocalVariableTable attribute per local variable in the Code attribute.')."); } }// if atts[a] instanceof LocalVariableTable END -- GitLab From 7df92b36952cb730e139b6b79e9829c2349a54cc Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sat, 23 Jun 2007 17:47:38 +0000 Subject: [PATCH 0380/1313] Add test case to show that InstructionFinder.search returns one more value than supposed to, issue found by Nicholson, Jonathan O H git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@550066 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/InstructionFinderTestCase.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/test/java/org/apache/bcel/InstructionFinderTestCase.java diff --git a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java new file mode 100644 index 00000000..840b8715 --- /dev/null +++ b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java @@ -0,0 +1,45 @@ +package org.apache.bcel; + +import java.util.Iterator; + +import org.apache.bcel.AbstractTestCase; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.util.InstructionFinder; +import org.apache.bcel.util.InstructionFinder.CodeConstraint; + +public class InstructionFinderTestCase extends AbstractTestCase +{ + public void testSearchAll() throws Exception + { + JavaClass clazz = getTestClass("org.apache.bcel.util.InstructionFinder"); + Method[] methods = clazz.getMethods(); + Method searchM = null; + for (Method m : methods) + { + if (m.getName().equals("search") && (m.getArgumentTypes().length == 3)) + { + searchM = m; + break; + } + } + + if (searchM == null) + throw new Exception("search method not found"); + + byte[] bytes = searchM.getCode().getCode(); + InstructionList il = new InstructionList(bytes); + InstructionFinder finder = new InstructionFinder(il); + Iterator it = finder.search(".*", il.getStart(), null); + + int cnt = 0; + while (it.hasNext()) + { + it.next(); + cnt++; + } + + assertEquals(1, cnt); + } +} -- GitLab From 0a8fa7c05c1f94f43bdb6fcd7988dbea82d1730d Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sat, 23 Jun 2007 17:52:29 +0000 Subject: [PATCH 0381/1313] improve the test git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@550070 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/InstructionFinderTestCase.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java index 840b8715..b87f87c6 100644 --- a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java +++ b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java @@ -5,6 +5,7 @@ import java.util.Iterator; import org.apache.bcel.AbstractTestCase; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.InstructionHandle; import org.apache.bcel.generic.InstructionList; import org.apache.bcel.util.InstructionFinder; import org.apache.bcel.util.InstructionFinder.CodeConstraint; @@ -33,13 +34,13 @@ public class InstructionFinderTestCase extends AbstractTestCase InstructionFinder finder = new InstructionFinder(il); Iterator it = finder.search(".*", il.getStart(), null); - int cnt = 0; - while (it.hasNext()) + InstructionHandle[] ihs = (InstructionHandle[])it.next(); + int size = 0; + for (InstructionHandle ih : ihs) { - it.next(); - cnt++; + size += ih.getInstruction().getLength(); } + assertEquals(bytes.length, size); - assertEquals(1, cnt); } } -- GitLab From 72ae064649b0a69899a2fd5efd80ab8e1ea27562 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 29 Sep 2007 09:29:53 +0000 Subject: [PATCH 0382/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=43511 by christine.feldmann@quest.com git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@580561 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/classfile/AnnotationDefault.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index ac5c84e1..cea14af9 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -17,6 +17,7 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -105,4 +106,10 @@ public class AnnotationDefault extends Attribute { throw new RuntimeException("Not implemented yet!"); } + + public final void dump(DataOutputStream dos) throws IOException + { + super.dump(dos); + default_value.dump(dos); + } } -- GitLab From be0a11c85b2065c2369b9dd0d2a6bd68dc79a33b Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Wed, 7 Nov 2007 18:56:26 +0000 Subject: [PATCH 0383/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=43795 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@592851 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/InstructionList.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index f9e5cc3f..76215a1a 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -677,8 +677,9 @@ public class InstructionList implements Serializable { private void remove( InstructionHandle prev, InstructionHandle next ) throws TargetLostException { InstructionHandle first, last; // First and last deleted instruction - if ((prev == null) && (next == null)) { // singleton list - first = last = start; + if ((prev == null) && (next == null)) { + first = start; + last = end; start = end = null; } else { if (prev == null) { // At start of list -- GitLab From f5a54e5edbba32dd8092d503169773938c33d2d8 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Thu, 24 Jan 2008 10:21:33 +0000 Subject: [PATCH 0384/1313] atjust paths in pom, build with 1.4 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@614833 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 6 +++--- src/main/java/org/apache/bcel/util/InstructionFinder.java | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index e0951e6b..313a15d8 100755 --- a/pom.xml +++ b/pom.xml @@ -137,7 +137,7 @@ website - scpexe://people.apache.org/www/jakarta.apache.org/commons/sandbox/jci + scpexe://people.apache.org/www/jakarta.apache.org/bcel @@ -149,8 +149,8 @@ maven-compiler-plugin true - 1.5 - 1.5 + 1.4 + 1.4 diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index 039e3b4f..c0cffd6d 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -65,7 +65,6 @@ import org.apache.bcel.generic.InstructionList; * @see Instruction * @see InstructionList */ -@SuppressWarnings("unchecked") public class InstructionFinder { private static final int OFFSET = 32767; // char + OFFSET is -- GitLab From 645828a22f42387309b55f4d08586e8a219f01b4 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Thu, 24 Jan 2008 11:32:28 +0000 Subject: [PATCH 0385/1313] compile tests with 1.5, first working maven site, integrated the xdoc git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@614846 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 123 ++++++++++++++---- src/site/site.xml | 41 ++++++ src/site/xdoc/contributors.xml | 61 --------- src/site/xdoc/license.xml | 219 --------------------------------- src/site/xdoc/navigation.xml | 24 ---- src/site/xdoc/news.xml | 1 - src/site/xdoc/projects.xml | 3 +- 7 files changed, 144 insertions(+), 328 deletions(-) create mode 100644 src/site/site.xml delete mode 100644 src/site/xdoc/contributors.xml delete mode 100644 src/site/xdoc/license.xml delete mode 100644 src/site/xdoc/navigation.xml diff --git a/pom.xml b/pom.xml index 313a15d8..25170541 100755 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,21 @@ + + Dave Brosius + dbrosius + dbrosius at mebigfatguy.com + + + + Torsten Curdt + tcurdt + tcurdt at apache.org + ASF + http://www.apache.org/ + +1 + + Markus Dahm mdahm @@ -38,33 +53,39 @@ Jason van Zyl - jvanzyl jason at zenplex.com - Zenplex - + + + + + Enver Haase - ehaase enver at convergence.de - convergence - + - - Dave Brosius - dbrosius - dbrosius at mebigfatguy.com - + + David Dixon-Peugh + dixonpeugh at yahoo.com + - - Torsten Curdt - tcurdt - tcurdt at apache.org - ASF - http://www.apache.org/ - +1 - - + + Patrick Beard + beard at netscape.com + + + + Conor MacNeill + conor at cortexbusiness.com.au + + + + Costin Manolache + cmanolache at yahoo.com + + + @@ -152,6 +173,19 @@ 1.4 1.4 + + + compile-tests + process-test-sources + + testCompile + + + 1.5 + 1.5 + + + maven-surefire-plugin @@ -162,12 +196,58 @@ **/Abstract* - true + false + false + + + + maven-javadoc-plugin + + + maven-pmd-plugin + + + maven-project-info-reports-plugin + + + + project-team + dependencies + license + scm + + + + + + maven-surefire-report-plugin + 2.0 + + + org.codehaus.mojo + jxr-maven-plugin + + + org.codehaus.mojo + taglist-maven-plugin + 2.0 + + + TODO + @todo + FIXME + @deprecated + + + + + + junit @@ -176,4 +256,5 @@ test + diff --git a/src/site/site.xml b/src/site/site.xml new file mode 100644 index 00000000..8618a301 --- /dev/null +++ b/src/site/site.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + +

          + + + + + + + +
          + + + diff --git a/src/site/xdoc/contributors.xml b/src/site/xdoc/contributors.xml deleted file mode 100644 index 5f26fdc2..00000000 --- a/src/site/xdoc/contributors.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - BCEL Contributors - - - - -
          -

          - - - - - - - - - - - - - -
          Dave Brosiusdbrosius at mebigfatguy.com
          Markus Dahmm.dahm at gmx.de
          Torsten Curdttcurdt at apache.org
          -

          -
          - -
          -

          - - - - - - - - - - - - - - - - - - - - - - - - - -
          David Dixon-Peughdixonpeugh at yahoo.com
          Patrick Beardbeard at netscape.com
          Conor MacNeillconor at cortexbusiness.com.au
          Costin Manolachecmanolache at yahoo.com
          Jason van Zyljvanzyl at zenplex.com
          Enver Haaseenver at convergence.de
          -

          -
          - - -
          diff --git a/src/site/xdoc/license.xml b/src/site/xdoc/license.xml deleted file mode 100644 index 8fc6b6ef..00000000 --- a/src/site/xdoc/license.xml +++ /dev/null @@ -1,219 +0,0 @@ - - - - - Apache Software License - - - -
          - - - -
          - -
          diff --git a/src/site/xdoc/navigation.xml b/src/site/xdoc/navigation.xml deleted file mode 100644 index eca41986..00000000 --- a/src/site/xdoc/navigation.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - BCEL - - - - - - - - - - - - - - - - - - - - diff --git a/src/site/xdoc/news.xml b/src/site/xdoc/news.xml index 03e6130d..efddc53f 100644 --- a/src/site/xdoc/news.xml +++ b/src/site/xdoc/news.xml @@ -2,7 +2,6 @@ - Jason van Zyl News and Status diff --git a/src/site/xdoc/projects.xml b/src/site/xdoc/projects.xml index 73c4a228..121b84f7 100644 --- a/src/site/xdoc/projects.xml +++ b/src/site/xdoc/projects.xml @@ -3,8 +3,7 @@ - BCEL Projects - Jason van Zyl + Projects using BCEL -- GitLab From 21c6a0d27d9239b1b80324e26ebd6e44c17ae917 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 27 Jan 2008 13:33:17 +0000 Subject: [PATCH 0386/1313] stage on people.apache.org git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@615597 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 40 ++++++++++------------------------------ 1 file changed, 10 insertions(+), 30 deletions(-) diff --git a/pom.xml b/pom.xml index 25170541..72bdf010 100755 --- a/pom.xml +++ b/pom.xml @@ -127,39 +127,19 @@ http://svn.apache.org/repos/asf/jakarta/bcel/trunk - - - apache-snapshots - Apache Maven2 Repository - http://cvs.apache.org/maven-snapshot-repository - - - codehaus-snapshot - Maven snapshot Repository - http://snapshots.maven.codehaus.org/maven2 - - - - - apache-maven-snapshot - repository - - scpexe://people.apache.org/www/cvs.apache.org/maven-snapshot-repository - - - - apache-maven-snapshot - repository - - scpexe://people.apache.org/www/cvs.apache.org/maven-snapshot-repository - - + + releases + scpexe://people.apache.org/~tcurdt/releases/bcel + + + snaphots + scpexe://people.apache.org/~tcurdt/shapshots/bcel + website - - scpexe://people.apache.org/www/jakarta.apache.org/bcel - + + scpexe://people.apache.org/~tcurdt/websites/bcel -- GitLab From e0d546938f1884233319a16002e95dbc54f8b9b7 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 27 Jan 2008 13:47:44 +0000 Subject: [PATCH 0387/1313] index page, fixed staged paths git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@615599 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 6 +++--- src/site/site.xml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 72bdf010..33ddea56 100755 --- a/pom.xml +++ b/pom.xml @@ -130,16 +130,16 @@ releases - scpexe://people.apache.org/~tcurdt/releases/bcel + scpexe://people.apache.org/home/tcurdt/public_html/releases/bcel snaphots - scpexe://people.apache.org/~tcurdt/shapshots/bcel + scpexe://people.apache.org/home/tcurdt/public_html/shapshots/bcel website - scpexe://people.apache.org/~tcurdt/websites/bcel + scpexe://people.apache.org/home/tcurdt/public_html/websites/bcel diff --git a/src/site/site.xml b/src/site/site.xml index 8618a301..59b936ad 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -28,6 +28,7 @@
          + -- GitLab From 29a1c8373cc2c89fe4d69fba888df662cc15d9a8 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 2 Feb 2008 19:04:13 +0000 Subject: [PATCH 0388/1313] cleanup git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@617860 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Mini/ASTFunAppl.java | 8 +++---- src/examples/Mini/ASTFunDecl.java | 2 +- src/examples/Mini/ASTProgram.java | 2 +- src/examples/Mini/Function.java | 2 +- src/examples/Mini/MiniParser.java | 2 +- src/examples/Mini/MiniParserTokenManager.java | 22 +++++++++---------- .../apache/bcel/classfile/ElementValue.java | 2 -- .../org/apache/bcel/generic/ClassGen.java | 2 +- .../apache/bcel/generic/ElementValueGen.java | 3 +-- .../java/org/apache/bcel/util/Class2HTML.java | 4 ++-- .../java/org/apache/bcel/util/CodeHTML.java | 13 ++++++----- .../apache/bcel/util/SyntheticRepository.java | 2 +- .../bcel/verifier/statics/Pass3aVerifier.java | 6 +++-- .../org/apache/bcel/AbstractTestCase.java | 5 +++-- .../org/apache/bcel/data/package-info.java | 0 15 files changed, 39 insertions(+), 36 deletions(-) delete mode 100755 src/test/java/org/apache/bcel/data/package-info.java diff --git a/src/examples/Mini/ASTFunAppl.java b/src/examples/Mini/ASTFunAppl.java index 58a023b8..d1f1b7d5 100644 --- a/src/examples/Mini/ASTFunAppl.java +++ b/src/examples/Mini/ASTFunAppl.java @@ -159,8 +159,8 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, */ public void code(StringBuffer buf) { String fname = name.getName(); - Function f = function; - ASTIdent[] args = f.getArgs(); +// Function f = function; +// ASTIdent[] args = f.getArgs(); if(fname.equals("READ")) { ASTFunDecl.push(buf, "_readInt()"); @@ -197,9 +197,9 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, */ public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { String fname = name.getName(); - Function f = function; +// Function f = function; //ASTIdent fun = f.getName(); - ASTIdent[] args = f.getArgs(); +// ASTIdent[] args = f.getArgs(); String class_name = method.getClassName(); if(fname.equals("READ")) { diff --git a/src/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java index 911f9a64..b90fddcc 100644 --- a/src/examples/Mini/ASTFunDecl.java +++ b/src/examples/Mini/ASTFunDecl.java @@ -55,7 +55,7 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { private int line, column; private boolean is_simple; // true, if simple expression like `12 + f(a)' private boolean is_recursive; // Not used yet, TODO - private int max_depth; // max. expression tree depth +// private int max_depth; // max. expression tree depth private Environment env; // Generated methods diff --git a/src/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java index ac6c3829..d8bfc166 100644 --- a/src/examples/Mini/ASTProgram.java +++ b/src/examples/Mini/ASTProgram.java @@ -19,8 +19,8 @@ package Mini; import java.io.PrintWriter; + import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.Method; import org.apache.bcel.generic.ALOAD; import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.ConstantPoolGen; diff --git a/src/examples/Mini/Function.java b/src/examples/Mini/Function.java index 5c21cd87..f61f9dd6 100644 --- a/src/examples/Mini/Function.java +++ b/src/examples/Mini/Function.java @@ -26,7 +26,7 @@ package Mini; public class Function implements org.apache.bcel.Constants, EnvEntry { private ASTIdent name; // Reference to the original declaration private ASTIdent[] args; // Reference to argument identifiers - private ASTExpr body; // Reference to function expression body +// private ASTExpr body; // Reference to function expression body private boolean reserved; // Is a key word? private int line, column; // Short for name.getToken() private String fun_name; // Short for name.getName() diff --git a/src/examples/Mini/MiniParser.java b/src/examples/Mini/MiniParser.java index ee1a4079..554c0283 100644 --- a/src/examples/Mini/MiniParser.java +++ b/src/examples/Mini/MiniParser.java @@ -837,7 +837,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini static private Token jj_scanpos, jj_lastpos; static private int jj_la; static public boolean lookingAhead = false; - static private boolean jj_semLA; +// static private boolean jj_semLA; static private int jj_gen; static final private int[] jj_la1 = new int[17]; static final private int[] jj_la1_0 = {0x200,0x0,0x1800000,0x1c000000,0x11c04400,0x1000,0x1800000,0x0,0x11c04400,0xe2000000,0x3f0000,0x1800000,0x1800000,0x1c000000,0xe2000000,0x3f0000,0x10400000,}; diff --git a/src/examples/Mini/MiniParserTokenManager.java b/src/examples/Mini/MiniParserTokenManager.java index 2254b142..2454034f 100644 --- a/src/examples/Mini/MiniParserTokenManager.java +++ b/src/examples/Mini/MiniParserTokenManager.java @@ -42,17 +42,17 @@ static private final void jjCheckNAddTwoStates(int state1, int state2) jjCheckNAdd(state1); jjCheckNAdd(state2); } -static private final void jjCheckNAddStates(int start, int end) -{ - do { - jjCheckNAdd(jjnextStates[start]); - } while (start++ != end); -} -static private final void jjCheckNAddStates(int start) -{ - jjCheckNAdd(jjnextStates[start]); - jjCheckNAdd(jjnextStates[start + 1]); -} +//static private final void jjCheckNAddStates(int start, int end) +//{ +// do { +// jjCheckNAdd(jjnextStates[start]); +// } while (start++ != end); +//} +//static private final void jjCheckNAddStates(int start) +//{ +// jjCheckNAdd(jjnextStates[start]); +// jjCheckNAdd(jjnextStates[start + 1]); +//} static private final int jjMoveNfa_1(int startState, int curPos) { int startsAt = 0; diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index ea5f0073..ad1d8a07 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -19,8 +19,6 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; /** * @version $Id: ElementValue diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index d0771fa9..6d50eaa7 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -19,10 +19,10 @@ package org.apache.bcel.generic; import java.util.ArrayList; import java.util.Iterator; import java.util.List; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.AccessFlags; import org.apache.bcel.classfile.AnnotationEntry; -import org.apache.bcel.classfile.Annotations; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.classfile.Field; diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java index bf36816d..c49fba8d 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -3,8 +3,7 @@ package org.apache.bcel.generic; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; + import org.apache.bcel.classfile.AnnotationElementValue; import org.apache.bcel.classfile.AnnotationEntry; import org.apache.bcel.classfile.ArrayElementValue; diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index 80df501e..9723c5ec 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -85,8 +85,8 @@ public class Class2HTML implements Constants { */ AttributeHTML attribute_html = new AttributeHTML(dir, class_name, constant_pool, constant_html); - MethodHTML method_html = new MethodHTML(dir, class_name, methods, java_class.getFields(), - constant_html, attribute_html); +// MethodHTML method_html = new MethodHTML(dir, class_name, methods, java_class.getFields(), +// constant_html, attribute_html); // Write main file (with frames, yuk) writeMainHTML(attribute_html); new CodeHTML(dir, class_name, methods, constant_pool, constant_html); diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 10b2c7c1..6dbc1163 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -43,7 +43,7 @@ import org.apache.bcel.classfile.Utility; final class CodeHTML implements org.apache.bcel.Constants { private String class_name; // name of current class - private Method[] methods; // Methods to print +// private Method[] methods; // Methods to print private PrintWriter file; // file to write to private BitSet goto_set; private ConstantPool constant_pool; @@ -54,7 +54,7 @@ final class CodeHTML implements org.apache.bcel.Constants { CodeHTML(String dir, String class_name, Method[] methods, ConstantPool constant_pool, ConstantHTML constant_html) throws IOException { this.class_name = class_name; - this.methods = methods; +// this.methods = methods; this.constant_pool = constant_pool; this.constant_html = constant_html; file = new PrintWriter(new FileOutputStream(dir + class_name + "_code.html")); @@ -252,8 +252,10 @@ final class CodeHTML implements org.apache.bcel.Constants { int m_index = bytes.readShort(); String str; if (opcode == INVOKEINTERFACE) { // Special treatment needed - int nargs = bytes.readUnsignedByte(); // Redundant - int reserved = bytes.readUnsignedByte(); // Reserved + bytes.readUnsignedByte(); // Redundant + bytes.readUnsignedByte(); // Reserved +// int nargs = bytes.readUnsignedByte(); // Redundant +// int reserved = bytes.readUnsignedByte(); // Reserved ConstantInterfaceMethodref c = (ConstantInterfaceMethodref) constant_pool .getConstant(m_index, CONSTANT_InterfaceMethodref); class_index = c.getClassIndex(); @@ -426,7 +428,8 @@ final class CodeHTML implements org.apache.bcel.Constants { default_offset += offset; goto_set.set(default_offset); for (int j = 0; j < npairs; j++) { - int match = bytes.readInt(); +// int match = bytes.readInt(); + bytes.readInt(); index = offset + bytes.readInt(); goto_set.set(index); } diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index b8620e4a..d9bf63e4 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -47,7 +47,7 @@ import org.apache.bcel.classfile.JavaClass; */ public class SyntheticRepository implements Repository { - private static final String DEFAULT_PATH = ClassPath.getClassPath(); + //private static final String DEFAULT_PATH = ClassPath.getClassPath(); private static Map _instances = new HashMap(); // CLASSPATH X REPOSITORY private ClassPath _path = null; private Map _loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 3b028a5d..871cb80f 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -590,8 +590,10 @@ public final class Pass3aVerifier extends PassVerifier{ else{ /* TODO: Check if assignment compatibility is sufficient. What does Sun do? */ - Type f_type = Type.getType(f.getSignature()); - Type o_type = o.getType(cpg); + Type.getType(f.getSignature()); + o.getType(cpg); +// Type f_type = Type.getType(f.getSignature()); +// Type o_type = o.getType(cpg); // Argh. Sun's implementation allows us to have multiple fields of // the same name but with a different signature. diff --git a/src/test/java/org/apache/bcel/AbstractTestCase.java b/src/test/java/org/apache/bcel/AbstractTestCase.java index 5d8434a4..fd7f875f 100644 --- a/src/test/java/org/apache/bcel/AbstractTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractTestCase.java @@ -1,10 +1,11 @@ package org.apache.bcel; import java.io.File; -import java.io.IOException; import java.util.ArrayList; import java.util.List; + import junit.framework.TestCase; + import org.apache.bcel.classfile.AnnotationEntry; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.JavaClass; @@ -18,7 +19,7 @@ import org.apache.bcel.generic.SimpleElementValueGen; import org.apache.bcel.util.ClassPath; import org.apache.bcel.util.SyntheticRepository; -public class AbstractTestCase extends TestCase +public abstract class AbstractTestCase extends TestCase { private boolean verbose = false; diff --git a/src/test/java/org/apache/bcel/data/package-info.java b/src/test/java/org/apache/bcel/data/package-info.java deleted file mode 100755 index e69de29b..00000000 -- GitLab From 129eca8eb2700f9279f56a4003383ffe46601902 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 2 Feb 2008 19:18:16 +0000 Subject: [PATCH 0389/1313] applied patch for java6 from mcmartin@gmail.com http://issues.apache.org/bugzilla/show_bug.cgi?id=41548 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@617862 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 26 +++++++++++++++++-- .../org/apache/bcel/classfile/Attribute.java | 2 ++ .../bcel/classfile/DescendingVisitor.java | 19 ++++++++++++++ .../apache/bcel/classfile/EmptyVisitor.java | 8 ++++++ .../org/apache/bcel/classfile/Visitor.java | 4 +++ .../apache/bcel/visitors/CounterVisitor.java | 15 +++++++++++ 6 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index f3beb581..6ff7b88a 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -739,8 +739,9 @@ public interface Constants { public static final byte ATTR_ANNOTATION_DEFAULT = 16; public static final byte ATTR_LOCAL_VARIABLE_TYPE_TABLE = 17; public static final byte ATTR_ENCLOSING_METHOD = 18; + public static final byte ATTR_STACK_MAP_TABLE = 19; - public static final short KNOWN_ATTRIBUTES = 19; + public static final short KNOWN_ATTRIBUTES = 20; // TOFO: FIXXXXX public static final String[] ATTRIBUTE_NAMES = { @@ -750,7 +751,7 @@ public interface Constants { "PMGClass", "Signature", "StackMap", "RuntimeVisibleAnnotations", "RuntimeInvisibleAnnotations", "RuntimeVisibleParameterAnnotations", "RuntimeInvisibleParameterAnnotations", - "AnnotationDefault", "LocalVariableTypeTable", "EnclosingMethod" + "AnnotationDefault", "LocalVariableTypeTable", "EnclosingMethod", "StackMapTable" }; /** Constants used in the StackMap attribute. @@ -769,4 +770,25 @@ public interface Constants { "Bogus", "Integer", "Float", "Double", "Long", "Null", "InitObject", "Object", "NewObject" }; + + /** Constants used to identify StackMapEntry types. + * + * For those types which can specify a range, the + * constant names the lowest value. + */ + public static final int SAME_FRAME = 0; + public static final int SAME_LOCALS_1_STACK_ITEM_FRAME = 64; + public static final int SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED = 247; + public static final int CHOP_FRAME = 248; + public static final int SAME_FRAME_EXTENDED = 251; + public static final int APPEND_FRAME = 252; + public static final int FULL_FRAME = 255; + + /** Constants that define the maximum value of + * those constants which store ranges. */ + + public static final int SAME_FRAME_MAX = 63; + public static final int SAME_LOCALS_1_STACK_ITEM_FRAME_MAX = 127; + public static final int CHOP_FRAME_MAX = 250; + public static final int APPEND_FRAME_MAX = 254; } diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index c4395281..f4636ea0 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -209,6 +209,8 @@ public abstract class Attribute implements Cloneable, Node, Serializable constant_pool); case Constants.ATTR_ENCLOSING_METHOD: return new EnclosingMethod(name_index, length, file, constant_pool); + case Constants.ATTR_STACK_MAP_TABLE: + return new StackMapTable(name_index, length, file, constant_pool); default: // Never reached throw new IllegalStateException("Ooops! default case reached."); } diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index bc73d05c..e26dd7cc 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -242,6 +242,25 @@ public class DescendingVisitor implements Visitor stack.pop(); } + public void visitStackMapTable(StackMapTable table) + { + stack.push(table); + table.accept(visitor); + StackMapTableEntry[] vars = table.getStackMapTable(); + for (int i = 0; i < vars.length; i++) + { + vars[i].accept(this); + } + stack.pop(); + } + + public void visitStackMapTableEntry(StackMapTableEntry var) + { + stack.push(var); + var.accept(visitor); + stack.pop(); + } + public void visitLocalVariable(LocalVariable var) { stack.push(var); diff --git a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java index edc8be27..da31cd5a 100644 --- a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -173,6 +173,14 @@ public class EmptyVisitor implements Visitor { } + public void visitStackMapTable(StackMapTable obj) + { + } + + public void visitStackMapTableEntry(StackMapTableEntry obj) + { + } + public void visitEnclosingMethod(EnclosingMethod obj) { } diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java index 0e8eeb91..175390be 100644 --- a/src/main/java/org/apache/bcel/classfile/Visitor.java +++ b/src/main/java/org/apache/bcel/classfile/Visitor.java @@ -90,6 +90,10 @@ public interface Visitor public void visitStackMapEntry(StackMapEntry obj); + public void visitStackMapTable(StackMapTable obj); + + public void visitStackMapTableEntry(StackMapTableEntry obj); + public void visitAnnotation(Annotations obj); public void visitParameterAnnotation(ParameterAnnotations obj); diff --git a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java index 1abe79d1..4becb496 100755 --- a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java +++ b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java @@ -36,6 +36,8 @@ import org.apache.bcel.classfile.Signature; import org.apache.bcel.classfile.SourceFile; import org.apache.bcel.classfile.StackMap; import org.apache.bcel.classfile.StackMapEntry; +import org.apache.bcel.classfile.StackMapTable; +import org.apache.bcel.classfile.StackMapTableEntry; import org.apache.bcel.classfile.Synthetic; import org.apache.bcel.classfile.Unknown; import org.apache.bcel.classfile.Visitor; @@ -118,6 +120,11 @@ public class CounterVisitor implements Visitor public int annotationCount = 0; + public int stackMapTableCount = 0; + + public int stackMapTableEntryCount = 0; + + public void visitAnnotation(Annotations obj) { annotationCount++; @@ -307,4 +314,12 @@ public class CounterVisitor implements Visitor { unknownCount++; } + + public void visitStackMapTable(StackMapTable obj) { + stackMapTableCount++; + } + + public void visitStackMapTableEntry(StackMapTableEntry obj) { + stackMapTableEntryCount++; + } } -- GitLab From dbfa4ddcd327609622cc6e5c670826e43cd459c3 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 2 Feb 2008 19:27:35 +0000 Subject: [PATCH 0390/1313] applied javadoc patch from funnyman3595@gmail.com http://issues.apache.org/bugzilla/show_bug.cgi?id=42402 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@617867 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 716 ++++++++++++++++++- 1 file changed, 693 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 6ff7b88a..606d7c64 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -23,21 +23,75 @@ package org.apache.bcel; * @author M. Dahm */ public interface Constants { - /** Major and minor version of the code. - */ + + /** Major version number of class files for Java 1.1. + * @see #MINOR_1_1 + * */ public final static short MAJOR_1_1 = 45; + + /** Minor version number of class files for Java 1.1. + * @see #MAJOR_1_1 + * */ public final static short MINOR_1_1 = 3; + + /** Major version number of class files for Java 1.2. + * @see #MINOR_1_2 + * */ public final static short MAJOR_1_2 = 46; + + /** Minor version number of class files for Java 1.2. + * @see #MAJOR_1_2 + * */ public final static short MINOR_1_2 = 0; + + /** Major version number of class files for Java 1.2. + * @see #MINOR_1_2 + * */ public final static short MAJOR_1_3 = 47; + + /** Minor version number of class files for Java 1.3. + * @see #MAJOR_1_3 + * */ public final static short MINOR_1_3 = 0; + + /** Major version number of class files for Java 1.3. + * @see #MINOR_1_3 + * */ public final static short MAJOR_1_4 = 48; + + /** Minor version number of class files for Java 1.4. + * @see #MAJOR_1_4 + * */ public final static short MINOR_1_4 = 0; + + /** Major version number of class files for Java 1.4. + * @see #MINOR_1_4 + * */ public final static short MAJOR_1_5 = 49; + + /** Minor version number of class files for Java 1.5. + * @see #MAJOR_1_5 + * */ public final static short MINOR_1_5 = 0; + + /** Major version number of class files for Java 1.5. + * @see #MINOR_1_5 + * */ public final static short MAJOR_1_6 = 50; + + /** Minor version number of class files for Java 1.6. + * @see #MAJOR_1_6 + * */ public final static short MINOR_1_6 = 0; - public final static short MAJOR = MAJOR_1_1; // Defaults + + /** Default major version number. Class file is for Java 1.1. + * @see #MAJOR_1_1 + * */ + public final static short MAJOR = MAJOR_1_1; + + /** Default major version number. Class file is for Java 1.1. + * @see #MAJOR_1_1 + * */ public final static short MINOR = MINOR_1_1; /** Maximum value for an unsigned short. @@ -48,55 +102,150 @@ public interface Constants { */ public final static int MAX_BYTE = 255; // 2^8 - 1 - /** Access flags for classes, fields and methods. + /** One of the access flags for fields, methods, or classes. + * @see Flag definitions for Fields in the Java Virtual Machine Specification (2nd edition). + * @see Flag definitions for Methods in the Java Virtual Machine Specification (2nd edition). + * @see Flag definitions for Classes in the Java Virtual Machine Specification (2nd edition). */ public final static short ACC_PUBLIC = 0x0001; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_PRIVATE = 0x0002; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_PROTECTED = 0x0004; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_STATIC = 0x0008; + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_FINAL = 0x0010; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_SYNCHRONIZED = 0x0020; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_SYPER = 0x0020; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_VOLATILE = 0x0040; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_BRIDGE = 0x0040; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_TRANSIENT = 0x0080; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_VARARGS = 0x0080; + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_NATIVE = 0x0100; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_INTERFACE = 0x0200; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_ABSTRACT = 0x0400; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_STRICT = 0x0800; + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_SYNTHETIC = 0x1000; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_ANNOTATION = 0x2000; + + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_ENUM = 0x4000; // Applies to classes compiled by new compilers only + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short ACC_SUPER = 0x0020; + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ public final static short MAX_ACC_FLAG = ACC_ENUM; + /** The names of the access flags. */ public final static String[] ACCESS_NAMES = { "public", "private", "protected", "static", "final", "synchronized", "volatile", "transient", "native", "interface", "abstract", "strictfp", "synthetic", "annotation", "enum" }; - /** Tags in constant pool to denote type of constant. - */ + /** Marks a constant pool entry as type UTF-8. */ public final static byte CONSTANT_Utf8 = 1; + + /** Marks a constant pool entry as type Integer. */ public final static byte CONSTANT_Integer = 3; + + /** Marks a constant pool entry as type Float. */ public final static byte CONSTANT_Float = 4; + + /** Marks a constant pool entry as type Long. */ public final static byte CONSTANT_Long = 5; + + /** Marks a constant pool entry as type Double. */ public final static byte CONSTANT_Double = 6; + + /** Marks a constant pool entry as a Class. */ public final static byte CONSTANT_Class = 7; + + /** Marks a constant pool entry as a Field Reference. */ public final static byte CONSTANT_Fieldref = 9; + + /** Marks a constant pool entry as type String. */ public final static byte CONSTANT_String = 8; + + /** Marks a constant pool entry as a Method Reference. */ public final static byte CONSTANT_Methodref = 10; + + /** Marks a constant pool entry as an Interface Method Reference. */ public final static byte CONSTANT_InterfaceMethodref = 11; + + /** Marks a constant pool entry as a name and type. */ public final static byte CONSTANT_NameAndType = 12; + /** The names of the types of entries in a constant pool. */ public final static String[] CONSTANT_NAMES = { "", "CONSTANT_Utf8", "", "CONSTANT_Integer", "CONSTANT_Float", "CONSTANT_Long", "CONSTANT_Double", @@ -119,281 +268,795 @@ public interface Constants { public final static String[] INTERFACES_IMPLEMENTED_BY_ARRAYS = {"java.lang.Cloneable", "java.io.Serializable"}; /** - * Limitations of the Java Virtual Machine. - * See The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. + * One of the limitations of the Java Virtual Machine. + * @see The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. */ public static final int MAX_CP_ENTRIES = 65535; - public static final int MAX_CODE_SIZE = 65536; //bytes - /** Java VM opcodes. + /** + * One of the limitations of the Java Virtual Machine. + * @see The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. */ + public static final int MAX_CODE_SIZE = 65536; //bytes + + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short NOP = 0; + + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ACONST_NULL = 1; + + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_M1 = 2; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_0 = 3; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_1 = 4; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_2 = 5; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_3 = 6; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_4 = 7; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_5 = 8; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LCONST_0 = 9; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LCONST_1 = 10; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_0 = 11; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_1 = 12; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_2 = 13; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCONST_0 = 14; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCONST_1 = 15; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short BIPUSH = 16; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short SIPUSH = 17; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC = 18; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC_W = 19; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC2_W = 20; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD = 21; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD = 22; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD = 23; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD = 24; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD = 25; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_0 = 26; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_1 = 27; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_2 = 28; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_3 = 29; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_0 = 30; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_1 = 31; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_2 = 32; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_3 = 33; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_0 = 34; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_1 = 35; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_2 = 36; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_3 = 37; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_0 = 38; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_1 = 39; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_2 = 40; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_3 = 41; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_0 = 42; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_1 = 43; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_2 = 44; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_3 = 45; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IALOAD = 46; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LALOAD = 47; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FALOAD = 48; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DALOAD = 49; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short AALOAD = 50; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short BALOAD = 51; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short CALOAD = 52; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short SALOAD = 53; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE = 54; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE = 55; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE = 56; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE = 57; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE = 58; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_0 = 59; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_1 = 60; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_2 = 61; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_3 = 62; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_0 = 63; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_1 = 64; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_2 = 65; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_3 = 66; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_0 = 67; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_1 = 68; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_2 = 69; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_3 = 70; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_0 = 71; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_1 = 72; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_2 = 73; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_3 = 74; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_0 = 75; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_1 = 76; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_2 = 77; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_3 = 78; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IASTORE = 79; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LASTORE = 80; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FASTORE = 81; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DASTORE = 82; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short AASTORE = 83; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short BASTORE = 84; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short CASTORE = 85; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short SASTORE = 86; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short POP = 87; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short POP2 = 88; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP = 89; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP_X1 = 90; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP_X2 = 91; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2 = 92; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2_X1 = 93; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2_X2 = 94; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short SWAP = 95; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IADD = 96; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LADD = 97; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FADD = 98; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DADD = 99; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISUB = 100; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSUB = 101; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSUB = 102; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSUB = 103; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IMUL = 104; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LMUL = 105; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FMUL = 106; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DMUL = 107; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IDIV = 108; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LDIV = 109; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FDIV = 110; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DDIV = 111; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IREM = 112; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LREM = 113; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FREM = 114; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DREM = 115; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INEG = 116; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LNEG = 117; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FNEG = 118; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DNEG = 119; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISHL = 120; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSHL = 121; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISHR = 122; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSHR = 123; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IUSHR = 124; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LUSHR = 125; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IAND = 126; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LAND = 127; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IOR = 128; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LOR = 129; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IXOR = 130; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LXOR = 131; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IINC = 132; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2L = 133; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2F = 134; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2D = 135; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short L2I = 136; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short L2F = 137; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short L2D = 138; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short F2I = 139; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short F2L = 140; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short F2D = 141; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short D2I = 142; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short D2L = 143; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short D2F = 144; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2B = 145; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INT2BYTE = 145; // Old notion + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2C = 146; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INT2CHAR = 146; // Old notion + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2S = 147; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INT2SHORT = 147; // Old notion + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LCMP = 148; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCMPL = 149; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCMPG = 150; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCMPL = 151; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCMPG = 152; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFEQ = 153; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNE = 154; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFLT = 155; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFGE = 156; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFGT = 157; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFLE = 158; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPEQ = 159; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPNE = 160; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPLT = 161; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPGE = 162; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPGT = 163; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPLE = 164; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ACMPEQ = 165; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ACMPNE = 166; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short GOTO = 167; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short JSR = 168; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short RET = 169; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short TABLESWITCH = 170; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LOOKUPSWITCH = 171; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IRETURN = 172; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LRETURN = 173; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FRETURN = 174; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DRETURN = 175; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ARETURN = 176; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short RETURN = 177; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short GETSTATIC = 178; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short PUTSTATIC = 179; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short GETFIELD = 180; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short PUTFIELD = 181; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEVIRTUAL = 182; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKESPECIAL = 183; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKENONVIRTUAL = 183; // Old name in JDK 1.0 + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKESTATIC = 184; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEINTERFACE = 185; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short NEW = 187; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short NEWARRAY = 188; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ANEWARRAY = 189; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ARRAYLENGTH = 190; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ATHROW = 191; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short CHECKCAST = 192; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INSTANCEOF = 193; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short MONITORENTER = 194; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short MONITOREXIT = 195; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short WIDE = 196; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short MULTIANEWARRAY = 197; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNULL = 198; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNONNULL = 199; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short GOTO_W = 200; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short JSR_W = 201; - /** - * Non-legal opcodes, may be used by JVM internally. - */ + /** JVM internal opcode. + * @see Reserved opcodes in the Java Virtual Machine Specification */ public static final short BREAKPOINT = 202; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short LDC_QUICK = 203; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short LDC_W_QUICK = 204; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short LDC2_W_QUICK = 205; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETFIELD_QUICK = 206; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTFIELD_QUICK = 207; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETFIELD2_QUICK = 208; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTFIELD2_QUICK = 209; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETSTATIC_QUICK = 210; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTSTATIC_QUICK = 211; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETSTATIC2_QUICK = 212; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTSTATIC2_QUICK = 213; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEVIRTUAL_QUICK = 214; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKENONVIRTUAL_QUICK = 215; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKESUPER_QUICK = 216; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKESTATIC_QUICK = 217; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEINTERFACE_QUICK = 218; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEVIRTUALOBJECT_QUICK = 219; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short NEW_QUICK = 221; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short ANEWARRAY_QUICK = 222; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short MULTIANEWARRAY_QUICK = 223; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short CHECKCAST_QUICK = 224; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INSTANCEOF_QUICK = 225; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEVIRTUAL_QUICK_W = 226; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETFIELD_QUICK_W = 227; + /** JVM internal opcode. + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTFIELD_QUICK_W = 228; + /** JVM internal opcode. + * @see Reserved opcodes in the Java Virtual Machine Specification */ public static final short IMPDEP1 = 254; + /** JVM internal opcode. + * @see Reserved opcodes in the Java Virtual Machine Specification */ public static final short IMPDEP2 = 255; /** - * For internal purposes only. + * BCEL virtual instruction for pushing an arbitrary data type onto the stack. Will be converted to the appropriate JVM + * opcode when the class is dumped. */ public static final short PUSH = 4711; - public static final short SWITCH = 4712; - /** - * Illegal codes + * BCEL virtual instruction for either LOOKUPSWITCH or TABLESWITCH. Will be converted to the appropriate JVM + * opcode when the class is dumped. */ + public static final short SWITCH = 4712; + + /** Illegal opcode. */ public static final short UNDEFINED = -1; + /** Illegal opcode. */ public static final short UNPREDICTABLE = -2; + /** Illegal opcode. */ public static final short RESERVED = -3; + /** Mnemonic for an illegal opcode. */ public static final String ILLEGAL_OPCODE = ""; + /** Mnemonic for an illegal type. */ public static final String ILLEGAL_TYPE = ""; + /** Boolean data type. */ public static final byte T_BOOLEAN = 4; + /** Char data type. */ public static final byte T_CHAR = 5; + /** Float data type. */ public static final byte T_FLOAT = 6; + /** Double data type. */ public static final byte T_DOUBLE = 7; + /** Byte data type. */ public static final byte T_BYTE = 8; + /** Short data type. */ public static final byte T_SHORT = 9; + /** Int data type. */ public static final byte T_INT = 10; + /** Long data type. */ public static final byte T_LONG = 11; + /** Void data type (non-standard). */ public static final byte T_VOID = 12; // Non-standard + /** Array data type. */ public static final byte T_ARRAY = 13; + /** Object data type. */ public static final byte T_OBJECT = 14; + /** Reference data type (deprecated). */ public static final byte T_REFERENCE = 14; // Deprecated + /** Unknown data type. */ public static final byte T_UNKNOWN = 15; + /** Address data type. */ public static final byte T_ADDRESS = 16; /** The primitive type names corresponding to the T_XX constants, @@ -402,7 +1065,7 @@ public interface Constants { public static final String[] TYPE_NAMES = { ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "boolean", "char", "float", "double", "byte", "short", "int", "long", - "void", "array", "object", "unknown" // Non-standard + "void", "array", "object", "unknown", "address" }; /** The primitive class names corresponding to the T_XX constants, @@ -413,7 +1076,7 @@ public interface Constants { "java.lang.Boolean", "java.lang.Character", "java.lang.Float", "java.lang.Double", "java.lang.Byte", "java.lang.Short", "java.lang.Integer", "java.lang.Long", "java.lang.Void", - ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE + ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE }; /** The signature characters corresponding to primitive types, @@ -426,8 +1089,9 @@ public interface Constants { }; /** - * Number of byte code operands, i.e., number of bytes after the tag byte - * itself. + * Number of byte code operands for each opcode, i.e., number of bytes after the tag byte + * itself. Indexed by opcode, so NO_OF_OPERANDS[BIPUSH] = the number of operands for a bipush + * instruction. */ public static final short[] NO_OF_OPERANDS = { 0/*nop*/, 0/*aconst_null*/, 0/*iconst_m1*/, 0/*iconst_0*/, @@ -491,7 +1155,9 @@ public interface Constants { }; /** - * How the byte code operands are to be interpreted. + * How the byte code operands are to be interpreted for each opcode. + * Indexed by opcode. TYPE_OF_OPERANDS[ILOAD] = an array of shorts + * describing the data types for the instruction. */ public static final short[][] TYPE_OF_OPERANDS = { {}/*nop*/, {}/*aconst_null*/, {}/*iconst_m1*/, {}/*iconst_0*/, @@ -558,7 +1224,7 @@ public interface Constants { }; /** - * Names of opcodes. + * Names of opcodes. Indexed by opcode. OPCODE_NAMES[ALOAD] = "aload". */ public static final String[] OPCODE_NAMES = { "nop", "aconst_null", "iconst_m1", "iconst_0", "iconst_1", @@ -611,6 +1277,8 @@ public interface Constants { /** * Number of words consumed on operand stack by instructions. + * Indexed by opcode. CONSUME_STACK[FALOAD] = number of words + * consumed from the stack by a faload instruction. */ public static final int[] CONSUME_STACK = { 0/*nop*/, 0/*aconst_null*/, 0/*iconst_m1*/, 0/*iconst_0*/, 0/*iconst_1*/, @@ -665,6 +1333,8 @@ public interface Constants { /** * Number of words produced onto operand stack by instructions. + * Indexed by opcode. CONSUME_STACK[DALOAD] = number of words + * consumed from the stack by a daload instruction. */ public static final int[] PRODUCE_STACK = { 0/*nop*/, 1/*aconst_null*/, 1/*iconst_m1*/, 1/*iconst_0*/, 1/*iconst_1*/, -- GitLab From c59f9991986bd66ba59c339fd0d6b7f2c2a88149 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 2 Feb 2008 19:50:53 +0000 Subject: [PATCH 0391/1313] forgot to add git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@617873 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/StackMapTable.java | 153 ++++++++++ .../bcel/classfile/StackMapTableEntry.java | 285 ++++++++++++++++++ 2 files changed, 438 insertions(+) create mode 100644 src/main/java/org/apache/bcel/classfile/StackMapTable.java create mode 100644 src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTable.java b/src/main/java/org/apache/bcel/classfile/StackMapTable.java new file mode 100644 index 00000000..3215796f --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/StackMapTable.java @@ -0,0 +1,153 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import org.apache.bcel.Constants; + +/** + * This class represents a stack map attribute used for + * preverification of Java classes for the Java 2 Micro Edition + * (J2ME). This attribute is used by the KVM and contained + * within the Code attribute of a method. See CLDC specification + * •À?5.3.1.2 + * + * @version $Id$ + * @author M. Dahm + * @see Code + * @see StackMapEntry + * @see StackMapType + */ +public final class StackMapTable extends Attribute implements Node { + + private int map_length; + private StackMapTableEntry[] map; // Table of stack map entries + + + /* + * @param name_index Index of name + * @param length Content length in bytes + * @param map Table of stack map entries + * @param constant_pool Array of constants + */ + public StackMapTable(int name_index, int length, StackMapTableEntry[] map, ConstantPool constant_pool) { + super(Constants.ATTR_STACK_MAP_TABLE, name_index, length, constant_pool); + setStackMapTable(map); + } + + + /** + * Construct object from file stream. + * @param name_index Index of name + * @param length Content length in bytes + * @param file Input stream + * @param constant_pool Array of constants + * @throws IOException + */ + StackMapTable(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + throws IOException { + this(name_index, length, (StackMapTableEntry[]) null, constant_pool); + map_length = file.readUnsignedShort(); + map = new StackMapTableEntry[map_length]; + for (int i = 0; i < map_length; i++) { + map[i] = new StackMapTableEntry(file, constant_pool); + } + } + + + /** + * Dump line number table attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + super.dump(file); + file.writeShort(map_length); + for (int i = 0; i < map_length; i++) { + map[i].dump(file); + } + } + + + /** + * @return Array of stack map entries + */ + public final StackMapTableEntry[] getStackMapTable() { + return map; + } + + + /** + * @param map Array of stack map entries + */ + public final void setStackMapTable( StackMapTableEntry[] map ) { + this.map = map; + map_length = (map == null) ? 0 : map.length; + } + + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer("StackMapTable("); + for (int i = 0; i < map_length; i++) { + buf.append(map[i].toString()); + if (i < map_length - 1) { + buf.append(", "); + } + } + buf.append(')'); + return buf.toString(); + } + + + /** + * @return deep copy of this attribute + */ + public Attribute copy( ConstantPool _constant_pool ) { + StackMapTable c = (StackMapTable) clone(); + c.map = new StackMapTableEntry[map_length]; + for (int i = 0; i < map_length; i++) { + c.map[i] = map[i].copy(); + } + c.constant_pool = _constant_pool; + return c; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackMapTable(this); + } + + + public final int getMapLength() { + return map_length; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java new file mode 100644 index 00000000..a56ff4cc --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -0,0 +1,285 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * This class represents a stack map entry recording the types of + * local variables and the the of stack items at a given byte code offset. + * See CLDC specification •À?5.3.1.2 + * + * @version $Id$ + * @author M. Dahm + * @see StackMap + * @see StackMapType + */ +public final class StackMapTableEntry implements Cloneable { + + private int frame_type; + private int byte_code_offset_delta; + private int number_of_locals; + private StackMapType[] types_of_locals; + private int number_of_stack_items; + private StackMapType[] types_of_stack_items; + private ConstantPool constant_pool; + + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + */ + StackMapTableEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { + this(file.read(), -1, -1, null, -1, null, constant_pool); + + if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { + byte_code_offset_delta = frame_type - Constants.SAME_FRAME; + } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { + byte_code_offset_delta = frame_type - Constants.SAME_LOCALS_1_STACK_ITEM_FRAME; + number_of_stack_items = 1; + types_of_stack_items = new StackMapType[1]; + types_of_stack_items[0] = new StackMapType(file, constant_pool); + } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { + byte_code_offset_delta = file.readShort(); + number_of_stack_items = 1; + types_of_stack_items = new StackMapType[1]; + types_of_stack_items[0] = new StackMapType(file, constant_pool); + } else if (frame_type >= Constants.CHOP_FRAME && frame_type <= Constants.CHOP_FRAME_MAX) { + byte_code_offset_delta = file.readShort(); + } else if (frame_type == Constants.SAME_FRAME_EXTENDED) { + byte_code_offset_delta = file.readShort(); + } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { + byte_code_offset_delta = file.readShort(); + number_of_locals = frame_type - 251; + types_of_locals = new StackMapType[number_of_locals]; + for (int i = 0; i < number_of_locals; i++) { + types_of_locals[i] = new StackMapType(file, constant_pool); + } + } else if (frame_type == Constants.FULL_FRAME) { + byte_code_offset_delta = file.readShort(); + number_of_locals = file.readShort(); + types_of_locals = new StackMapType[number_of_locals]; + for (int i = 0; i < number_of_locals; i++) { + types_of_locals[i] = new StackMapType(file, constant_pool); + } + number_of_stack_items = file.readShort(); + types_of_stack_items = new StackMapType[number_of_stack_items]; + for (int i = 0; i < number_of_stack_items; i++) { + types_of_stack_items[i] = new StackMapType(file, constant_pool); + } + } else { + /* Can't happen */ + throw new ClassFormatException ("Illegal Tag"); + } + } + + + public StackMapTableEntry(int tag, int byte_code_offset_delta, int number_of_locals, + StackMapType[] types_of_locals, int number_of_stack_items, + StackMapType[] types_of_stack_items, ConstantPool constant_pool) { + this.frame_type = tag; + this.byte_code_offset_delta = byte_code_offset_delta; + this.number_of_locals = number_of_locals; + this.types_of_locals = types_of_locals; + this.number_of_stack_items = number_of_stack_items; + this.types_of_stack_items = types_of_stack_items; + this.constant_pool = constant_pool; + } + + + /** + * Dump stack map entry + * + * @param file Output file stream + * @throws IOException + */ + public final void dump( DataOutputStream file ) throws IOException { + file.write(frame_type); + if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { + types_of_stack_items[0].dump(file); + } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { + file.write(byte_code_offset_delta); + types_of_stack_items[0].dump(file); + } else if (frame_type >= Constants.CHOP_FRAME && frame_type <= Constants.CHOP_FRAME_MAX) { + file.write(byte_code_offset_delta); + } else if (frame_type == Constants.SAME_FRAME_EXTENDED) { + file.write(byte_code_offset_delta); + } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { + file.write(byte_code_offset_delta); + for (int i = 0; i < number_of_locals; i++) { + types_of_locals[i].dump(file); + } + } else if (frame_type == Constants.FULL_FRAME) { + file.writeShort(byte_code_offset_delta); + file.writeShort(number_of_locals); + for (int i = 0; i < number_of_locals; i++) { + types_of_locals[i].dump(file); + } + file.writeShort(number_of_stack_items); + for (int i = 0; i < number_of_stack_items; i++) { + types_of_stack_items[i].dump(file); + } + } else { + /* Can't happen */ + throw new ClassFormatException ("Illegal Tag"); + } + } + + + /** + * @return String representation. + */ + public final String toString() { + StringBuffer buf = new StringBuffer(64); + buf.append("("); + if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { + buf.append("SAME"); + } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { + buf.append("SAME_LOCALS_1_STACK"); + } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { + buf.append("SAME_LOCALS_1_STACK_EXTENDED"); + } else if (frame_type >= Constants.CHOP_FRAME && frame_type <= Constants.CHOP_FRAME_MAX) { + buf.append("CHOP "+(251-frame_type)); + } else if (frame_type == Constants.SAME_FRAME_EXTENDED) { + buf.append("SAME_EXTENDED"); + } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { + buf.append("APPEND "+(frame_type-251)); + } else if (frame_type == Constants.FULL_FRAME) { + buf.append("FULL"); + } else { + buf.append("UNKNOWN"); + } + buf.append(", offset delta=").append(byte_code_offset_delta); + if (number_of_locals > 0) { + buf.append(", locals={"); + for (int i = 0; i < number_of_locals; i++) { + buf.append(types_of_locals[i]); + if (i < number_of_locals - 1) { + buf.append(", "); + } + } + buf.append("}"); + } + if (number_of_stack_items > 0) { + buf.append(", stack items={"); + for (int i = 0; i < number_of_stack_items; i++) { + buf.append(types_of_stack_items[i]); + if (i < number_of_stack_items - 1) { + buf.append(", "); + } + } + buf.append("}"); + } + buf.append(")"); + return buf.toString(); + } + + + public void setByteCodeOffsetDelta( int b ) { + byte_code_offset_delta = b; + } + + + public int getByteCodeOffsetDelta() { + return byte_code_offset_delta; + } + + + public void setNumberOfLocals( int n ) { + number_of_locals = n; + } + + + public int getNumberOfLocals() { + return number_of_locals; + } + + + public void setTypesOfLocals( StackMapType[] t ) { + types_of_locals = t; + } + + + public StackMapType[] getTypesOfLocals() { + return types_of_locals; + } + + + public void setNumberOfStackItems( int n ) { + number_of_stack_items = n; + } + + + public int getNumberOfStackItems() { + return number_of_stack_items; + } + + + public void setTypesOfStackItems( StackMapType[] t ) { + types_of_stack_items = t; + } + + + public StackMapType[] getTypesOfStackItems() { + return types_of_stack_items; + } + + + /** + * @return deep copy of this object + */ + public StackMapTableEntry copy() { + try { + return (StackMapTableEntry) clone(); + } catch (CloneNotSupportedException e) { + } + return null; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + public void accept( Visitor v ) { + v.visitStackMapTableEntry(this); + } + + + /** + * @return Constant pool used by this object. + */ + public final ConstantPool getConstantPool() { + return constant_pool; + } + + + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool( ConstantPool constant_pool ) { + this.constant_pool = constant_pool; + } +} -- GitLab From ef8d9e667dd4ad18b9360091aa1fb4e63a1fabaa Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 2 Feb 2008 20:15:09 +0000 Subject: [PATCH 0392/1313] http://issues.apache.org/bugzilla/show_bug.cgi?id=42791 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@617879 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/ClassGen.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 6d50eaa7..4e281bc0 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -23,6 +23,7 @@ import java.util.List; import org.apache.bcel.Constants; import org.apache.bcel.classfile.AccessFlags; import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Annotations; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.classfile.Field; @@ -143,7 +144,9 @@ public class ClassGen extends AccessFlags implements Cloneable { addInterface(interfaces[i]); } for (int i = 0; i < attributes.length; i++) { - addAttribute(attributes[i]); + if (!(attributes[i] instanceof Annotations)) { + addAttribute(attributes[i]); + } } for(int i=0; i < annotations.length; i++) { addAnnotationEntry(annotations[i]); -- GitLab From 9870dfb644d30f05f037132392dee6953f42bcf4 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 2 Feb 2008 21:06:04 +0000 Subject: [PATCH 0393/1313] performance improvements submitted by markus.gaisbauer@gmail.com http://issues.apache.org/bugzilla/show_bug.cgi?id=44340 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@617895 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/generic/ConstantPoolGen.java | 35 +- .../apache/bcel/generic/FieldInstruction.java | 2 +- .../org/apache/bcel/generic/Instruction.java | 350 +++++++++++++++--- .../apache/bcel/generic/InstructionList.java | 11 +- .../bcel/generic/InvokeInstruction.java | 12 +- .../java/org/apache/bcel/generic/Type.java | 59 +++ src/test/java/org/apache/bcel/NanoTimer.java | 49 +++ .../java/org/apache/bcel/PerformanceTest.java | 136 +++++++ 8 files changed, 589 insertions(+), 65 deletions(-) create mode 100644 src/test/java/org/apache/bcel/NanoTimer.java create mode 100644 src/test/java/org/apache/bcel/PerformanceTest.java diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index fd533be8..29574e79 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -50,8 +50,8 @@ import org.apache.bcel.classfile.ConstantUtf8; */ public class ConstantPoolGen implements java.io.Serializable { - protected int size = 1024; // Inital size, sufficient in most cases - protected Constant[] constants = new Constant[size]; + protected int size; + protected Constant[] constants; protected int index = 1; // First entry (0) used by JVM private static final String METHODREF_DELIM = ":"; private static final String IMETHODREF_DELIM = "#"; @@ -75,14 +75,17 @@ public class ConstantPoolGen implements java.io.Serializable { * @param cs array of given constants, new ones will be appended */ public ConstantPoolGen(Constant[] cs) { - if (cs.length > size) { - size = cs.length; - constants = new Constant[size]; - } + StringBuffer sb = new StringBuffer(256); + + size = Math.max(256, cs.length + 64); + constants = new Constant[size]; + System.arraycopy(cs, 0, constants, 0, cs.length); if (cs.length > 0) { index = cs.length; } + + for (int i = 1; i < index; i++) { Constant c = constants[i]; if (c instanceof ConstantString) { @@ -103,7 +106,13 @@ public class ConstantPoolGen implements java.io.Serializable { ConstantNameAndType n = (ConstantNameAndType) c; ConstantUtf8 u8 = (ConstantUtf8) constants[n.getNameIndex()]; ConstantUtf8 u8_2 = (ConstantUtf8) constants[n.getSignatureIndex()]; - String key = u8.getBytes() + NAT_DELIM + u8_2.getBytes(); + + sb.append(u8.getBytes()); + sb.append(NAT_DELIM); + sb.append(u8_2.getBytes()); + String key = sb.toString(); + sb.delete(0, sb.length()); + if (!n_a_t_table.containsKey(key)) { n_a_t_table.put(key, new Index(i)); } @@ -129,7 +138,15 @@ public class ConstantPoolGen implements java.io.Serializable { } else if (c instanceof ConstantFieldref) { delim = FIELDREF_DELIM; } - String key = class_name + delim + method_name + delim + signature; + + sb.append(class_name); + sb.append(delim); + sb.append(method_name); + sb.append(delim); + sb.append(signature); + String key = sb.toString(); + sb.delete(0, sb.length()); + if (!cp_table.containsKey(key)) { cp_table.put(key, new Index(i)); } @@ -150,6 +167,8 @@ public class ConstantPoolGen implements java.io.Serializable { * Create empty constant pool. */ public ConstantPoolGen() { + size = 256; + constants = new Constant[size]; } diff --git a/src/main/java/org/apache/bcel/generic/FieldInstruction.java b/src/main/java/org/apache/bcel/generic/FieldInstruction.java index 21c0759a..d32899c9 100644 --- a/src/main/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/main/java/org/apache/bcel/generic/FieldInstruction.java @@ -54,7 +54,7 @@ public abstract class FieldInstruction extends FieldOrMethod implements TypedIns /** @return size of field (1 or 2) */ protected int getFieldSize( ConstantPoolGen cpg ) { - return getType(cpg).getSize(); + return Type.getTypeSize(getSignature(cpg)); } diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index 31501fe9..1a6887ab 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -153,53 +153,309 @@ public abstract class Instruction implements Cloneable, Serializable { if (InstructionConstants.INSTRUCTIONS[opcode] != null) { return InstructionConstants.INSTRUCTIONS[opcode]; // Used predefined immutable object, if available } - /* Find appropiate class, instantiate an (empty) instruction object - * and initialize it by hand. - */ - Class clazz; - try { - clazz = Class.forName(className(opcode)); - } catch (ClassNotFoundException cnfe) { - // If a class by that name does not exist, the opcode is illegal. - // Note that IMPDEP1, IMPDEP2, BREAKPOINT are also illegal in a sense. - throw new ClassGenException("Illegal opcode detected."); - } - try { - obj = (Instruction) clazz.newInstance(); - if (wide - && !((obj instanceof LocalVariableInstruction) || (obj instanceof IINC) || (obj instanceof RET))) { - throw new Exception("Illegal opcode after wide: " + opcode); - } - obj.setOpcode(opcode); - obj.initFromFile(bytes, wide); // Do further initializations, if any - // Byte code offset set in InstructionList - } catch (Exception e) { - throw new ClassGenException(e.toString()); - } - return obj; - } - - - private static final String className( short opcode ) { - String name = Constants.OPCODE_NAMES[opcode].toUpperCase(Locale.ENGLISH); - /* ICONST_0, etc. will be shortened to ICONST, etc., since ICONST_0 and the like - * are not implemented (directly). - */ - try { - int len = name.length(); - char ch1 = name.charAt(len - 2), ch2 = name.charAt(len - 1); - if ((ch1 == '_') && (ch2 >= '0') && (ch2 <= '5')) { - name = name.substring(0, len - 2); - } - if (name.equals("ICONST_M1")) { - name = "ICONST"; - } - } catch (StringIndexOutOfBoundsException e) { - System.err.println(e); - } - return "org.apache.bcel.generic." + name; - } - + + switch (opcode) { + case Constants.BIPUSH: + obj = new BIPUSH(); + break; + case Constants.SIPUSH: + obj = new SIPUSH(); + break; + case Constants.LDC: + obj = new LDC(); + break; + case Constants.LDC_W: + obj = new LDC_W(); + break; + case Constants.LDC2_W: + obj = new LDC2_W(); + break; + case Constants.ILOAD: + obj = new ILOAD(); + break; + case Constants.LLOAD: + obj = new LLOAD(); + break; + case Constants.FLOAD: + obj = new FLOAD(); + break; + case Constants.DLOAD: + obj = new DLOAD(); + break; + case Constants.ALOAD: + obj = new ALOAD(); + break; + case Constants.ILOAD_0: + obj = new ILOAD(0); + break; + case Constants.ILOAD_1: + obj = new ILOAD(1); + break; + case Constants.ILOAD_2: + obj = new ILOAD(2); + break; + case Constants.ILOAD_3: + obj = new ILOAD(3); + break; + case Constants.LLOAD_0: + obj = new LLOAD(0); + break; + case Constants.LLOAD_1: + obj = new LLOAD(1); + break; + case Constants.LLOAD_2: + obj = new LLOAD(2); + break; + case Constants.LLOAD_3: + obj = new LLOAD(3); + break; + case Constants.FLOAD_0: + obj = new FLOAD(0); + break; + case Constants.FLOAD_1: + obj = new FLOAD(1); + break; + case Constants.FLOAD_2: + obj = new FLOAD(2); + break; + case Constants.FLOAD_3: + obj = new FLOAD(3); + break; + case Constants.DLOAD_0: + obj = new DLOAD(0); + break; + case Constants.DLOAD_1: + obj = new DLOAD(1); + break; + case Constants.DLOAD_2: + obj = new DLOAD(2); + break; + case Constants.DLOAD_3: + obj = new DLOAD(3); + break; + case Constants.ALOAD_0: + obj = new ALOAD(0); + break; + case Constants.ALOAD_1: + obj = new ALOAD(1); + break; + case Constants.ALOAD_2: + obj = new ALOAD(2); + break; + case Constants.ALOAD_3: + obj = new ALOAD(3); + break; + case Constants.ISTORE: + obj = new ISTORE(); + break; + case Constants.LSTORE: + obj = new LSTORE(); + break; + case Constants.FSTORE: + obj = new FSTORE(); + break; + case Constants.DSTORE: + obj = new DSTORE(); + break; + case Constants.ASTORE: + obj = new ASTORE(); + break; + case Constants.ISTORE_0: + obj = new ISTORE(0); + break; + case Constants.ISTORE_1: + obj = new ISTORE(1); + break; + case Constants.ISTORE_2: + obj = new ISTORE(2); + break; + case Constants.ISTORE_3: + obj = new ISTORE(3); + break; + case Constants.LSTORE_0: + obj = new LSTORE(0); + break; + case Constants.LSTORE_1: + obj = new LSTORE(1); + break; + case Constants.LSTORE_2: + obj = new LSTORE(2); + break; + case Constants.LSTORE_3: + obj = new LSTORE(3); + break; + case Constants.FSTORE_0: + obj = new FSTORE(0); + break; + case Constants.FSTORE_1: + obj = new FSTORE(1); + break; + case Constants.FSTORE_2: + obj = new FSTORE(2); + break; + case Constants.FSTORE_3: + obj = new FSTORE(3); + break; + case Constants.DSTORE_0: + obj = new DSTORE(0); + break; + case Constants.DSTORE_1: + obj = new DSTORE(1); + break; + case Constants.DSTORE_2: + obj = new DSTORE(2); + break; + case Constants.DSTORE_3: + obj = new DSTORE(3); + break; + case Constants.ASTORE_0: + obj = new ASTORE(0); + break; + case Constants.ASTORE_1: + obj = new ASTORE(1); + break; + case Constants.ASTORE_2: + obj = new ASTORE(2); + break; + case Constants.ASTORE_3: + obj = new ASTORE(3); + break; + case Constants.IINC: + obj = new IINC(); + break; + case Constants.IFEQ: + obj = new IFEQ(); + break; + case Constants.IFNE: + obj = new IFNE(); + break; + case Constants.IFLT: + obj = new IFLT(); + break; + case Constants.IFGE: + obj = new IFGE(); + break; + case Constants.IFGT: + obj = new IFGT(); + break; + case Constants.IFLE: + obj = new IFLE(); + break; + case Constants.IF_ICMPEQ: + obj = new IF_ICMPEQ(); + break; + case Constants.IF_ICMPNE: + obj = new IF_ICMPNE(); + break; + case Constants.IF_ICMPLT: + obj = new IF_ICMPLT(); + break; + case Constants.IF_ICMPGE: + obj = new IF_ICMPGE(); + break; + case Constants.IF_ICMPGT: + obj = new IF_ICMPGT(); + break; + case Constants.IF_ICMPLE: + obj = new IF_ICMPLE(); + break; + case Constants.IF_ACMPEQ: + obj = new IF_ACMPEQ(); + break; + case Constants.IF_ACMPNE: + obj = new IF_ACMPNE(); + break; + case Constants.GOTO: + obj = new GOTO(); + break; + case Constants.JSR: + obj = new JSR(); + break; + case Constants.RET: + obj = new RET(); + break; + case Constants.TABLESWITCH: + obj = new TABLESWITCH(); + break; + case Constants.LOOKUPSWITCH: + obj = new LOOKUPSWITCH(); + break; + case Constants.GETSTATIC: + obj = new GETSTATIC(); + break; + case Constants.PUTSTATIC: + obj = new PUTSTATIC(); + break; + case Constants.GETFIELD: + obj = new GETFIELD(); + break; + case Constants.PUTFIELD: + obj = new PUTFIELD(); + break; + case Constants.INVOKEVIRTUAL: + obj = new INVOKEVIRTUAL(); + break; + case Constants.INVOKESPECIAL: + obj = new INVOKESPECIAL(); + break; + case Constants.INVOKESTATIC: + obj = new INVOKESTATIC(); + break; + case Constants.INVOKEINTERFACE: + obj = new INVOKEINTERFACE(); + break; + case Constants.NEW: + obj = new NEW(); + break; + case Constants.NEWARRAY: + obj = new NEWARRAY(); + break; + case Constants.ANEWARRAY: + obj = new ANEWARRAY(); + break; + case Constants.CHECKCAST: + obj = new CHECKCAST(); + break; + case Constants.INSTANCEOF: + obj = new INSTANCEOF(); + break; + case Constants.MULTIANEWARRAY: + obj = new MULTIANEWARRAY(); + break; + case Constants.IFNULL: + obj = new IFNULL(); + break; + case Constants.IFNONNULL: + obj = new IFNONNULL(); + break; + case Constants.GOTO_W: + obj = new GOTO_W(); + break; + case Constants.JSR_W: + obj = new JSR_W(); + break; + case Constants.BREAKPOINT: + obj = new BREAKPOINT(); + break; + case Constants.IMPDEP1: + obj = new IMPDEP1(); + break; + case Constants.IMPDEP2: + obj = new IMPDEP2(); + break; + default: + throw new ClassGenException("Illegal opcode detected."); + + } + + if (wide + && !((obj instanceof LocalVariableInstruction) || (obj instanceof IINC) || (obj instanceof RET))) { + throw new ClassGenException("Illegal opcode after wide: " + opcode); + } + obj.setOpcode(opcode); + obj.initFromFile(bytes, wide); // Do further initializations, if any + return obj; + } /** * This method also gives right results for instructions whose diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 76215a1a..3d0ce595 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -140,8 +140,15 @@ public class InstructionList implements Serializable { * @return target position's instruction handle if available */ public InstructionHandle findHandle( int pos ) { - InstructionHandle[] ihs = getInstructionHandles(); - return findHandle(ihs, byte_positions, length, pos); + int[] positions = byte_positions; + InstructionHandle ih = start; + for (int i = 0; i < length; i++) { + if(positions[i] == pos) { + return ih; + } + ih = ih.next; + } + return null; } diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index ee28f8f3..a6aa67bb 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -63,18 +63,15 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti * @return Number of words consumed from stack by this instruction */ public int consumeStack( ConstantPoolGen cpg ) { - String signature = getSignature(cpg); - Type[] args = Type.getArgumentTypes(signature); int sum; if (opcode == Constants.INVOKESTATIC) { sum = 0; } else { sum = 1; // this reference } - int n = args.length; - for (int i = 0; i < n; i++) { - sum += args[i].getSize(); - } + + String signature = getSignature(cpg); + sum += Type.getArgumentTypesSize(signature); return sum; } @@ -85,7 +82,8 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti * @return Number of words produced onto stack by this instruction */ public int produceStack( ConstantPoolGen cpg ) { - return getReturnType(cpg).getSize(); + String signature = getSignature(cpg); + return Type.getReturnTypeSize(signature); } diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index beae234e..4a5b401b 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -307,4 +307,63 @@ public abstract class Type implements java.io.Serializable { sb.append(getType(meth.getReturnType()).getSignature()); return sb.toString(); } + + private static int size(int coded) { + return coded & 3; + } + + private static int consumed(int coded) { + return coded >> 2; + } + + private static int encode(int size, int consumed) { + return consumed << 2 | size; + } + + static int getArgumentTypesSize( String signature ) { + int res = 0; + int index; + Type[] types; + try { // Read all declarations between for `(' and `)' + if (signature.charAt(0) != '(') { + throw new ClassFormatException("Invalid method signature: " + signature); + } + index = 1; // current string position + while (signature.charAt(index) != ')') { + int coded = getTypeSize(signature.substring(index)); + res += size(coded); + index += consumed(coded); + } + } catch (StringIndexOutOfBoundsException e) { // Should never occur + throw new ClassFormatException("Invalid method signature: " + signature); + } + return res; + } + + static final int getTypeSize( String signature ) throws StringIndexOutOfBoundsException { + byte type = Utility.typeOfSignature(signature); + if (type <= Constants.T_VOID) { + return encode(BasicType.getType(type).getSize(), 1); + } else if (type == Constants.T_ARRAY) { + int dim = 0; + do { // Count dimensions + dim++; + } while (signature.charAt(dim) == '['); + // Recurse, but just once, if the signature is ok + int consumed = consumed(getTypeSize(signature.substring(dim))); + return encode(1, dim + consumed); + } else { // type == T_REFERENCE + int index = signature.indexOf(';'); // Look for closing `;' + if (index < 0) { + throw new ClassFormatException("Invalid signature: " + signature); + } + return encode(1, index + 1); + } + } + + + static int getReturnTypeSize(String signature) { + int index = signature.lastIndexOf(')') + 1; + return getTypeSize(signature.substring(index)); + } } diff --git a/src/test/java/org/apache/bcel/NanoTimer.java b/src/test/java/org/apache/bcel/NanoTimer.java new file mode 100644 index 00000000..a84d80a9 --- /dev/null +++ b/src/test/java/org/apache/bcel/NanoTimer.java @@ -0,0 +1,49 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel; + +public class NanoTimer { + + private long time = 0; + + public NanoTimer start() { + time -= System.nanoTime(); + return this; + } + + public void stop() { + time += System.nanoTime(); + } + + public void subtract(NanoTimer o) { + time -= o.time; + } + + public void reset() { + time = 0; + } + + /** + * May ony be called after stop has been called as many times as start. + */ + public String toString() { + return ((double) (time) / 1000000000) + " s"; + } + + + +} diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java new file mode 100644 index 00000000..28925e56 --- /dev/null +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -0,0 +1,136 @@ +/* + * Copyright 2000-2004 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.Locale; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +import junit.framework.TestCase; + +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; + +public final class PerformanceTest extends TestCase { + + private static byte[] read(final InputStream is) throws IOException { + if (is == null) { + throw new IOException("Class not found"); + } + byte[] b = new byte[is.available()]; + int len = 0; + while (true) { + int n = is.read(b, len, b.length - len); + if (n == -1) { + if (len < b.length) { + byte[] c = new byte[len]; + System.arraycopy(b, 0, c, 0, len); + b = c; + } + return b; + } + len += n; + if (len == b.length) { + byte[] c = new byte[b.length + 1000]; + System.arraycopy(b, 0, c, 0, len); + b = c; + } + } + } + + private static void test(int fraction) throws IOException { + NanoTimer total = new NanoTimer(); + NanoTimer parseTime = new NanoTimer(); + NanoTimer cgenTime = new NanoTimer(); + NanoTimer mgenTime = new NanoTimer(); + NanoTimer mserTime = new NanoTimer(); + NanoTimer serTime = new NanoTimer(); + + total.start(); + + String javaHome = System.getProperty("java.home"); + + JarFile jar = new JarFile(javaHome + "/lib/dt.jar"); + Enumeration en = jar.entries(); + int i = 0; + + while (en.hasMoreElements()) { + JarEntry e = (JarEntry) en.nextElement(); + if (e.getName().endsWith(".class") && i++ % fraction == 0) { + InputStream in = jar.getInputStream(e); + byte[] bytes = read(in); + + parseTime.start(); + JavaClass clazz = new ClassParser(new ByteArrayInputStream(bytes), e.getName()) + .parse(); + parseTime.stop(); + + cgenTime.start(); + ClassGen cg = new ClassGen(clazz); + cgenTime.stop(); + + Method[] methods = cg.getMethods(); + for (int j = 0; j < methods.length; j++) { + Method m = methods[j]; + + mgenTime.start(); + MethodGen mg = new MethodGen(m, cg.getClassName(), cg.getConstantPool()); + InstructionList il = mg.getInstructionList(); + mgenTime.stop(); + + mserTime.start(); + if (il != null) { + mg.getInstructionList().setPositions(); + mg.setMaxLocals(); + mg.setMaxStack(); + } + cg.replaceMethod(m, mg.getMethod()); + mserTime.stop(); + } + + serTime.start(); + cg.getJavaClass().getBytes(); + serTime.stop(); + } + } + + total.stop(); + System.out.println("ClassParser.parse: " + parseTime); + System.out.println("ClassGen.init: " + cgenTime); + System.out.println("MethodGen.init: " + mgenTime); + System.out.println("MethodGen.getMethod: " + mserTime); + System.out.println("ClassGen.getJavaClass.getBytes: " + serTime); + System.out.println("Total: " + total); + System.out.println(); + } + + public void testPerformance() throws IOException { + test(1); + test(1); + test(1); + } + +} -- GitLab From b4f1e7721fd3f2f47bd02eef209ddd1a66ac14cc Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sat, 2 Feb 2008 21:09:45 +0000 Subject: [PATCH 0394/1313] fix the stack height calculation submitted by zappacky@gmail.com http://issues.apache.org/bugzilla/show_bug.cgi?id=43391 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@617896 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java index d12dda42..eac7c373 100644 --- a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java @@ -23,7 +23,7 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackProducer { +public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackProducer, StackConsumer { /** Get length of array */ -- GitLab From ff6317ed4e2c76bffdfbaa9e836e7ae328bb3b74 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Tue, 5 Feb 2008 22:44:54 +0000 Subject: [PATCH 0395/1313] added OSGi meta data http://issues.apache.org/bugzilla/show_bug.cgi?id=44359 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@618810 13f79535-47bb-0310-9956-ffa450edef68 --- META-INF/MANIFEST.MF | 14 ++ pom.xml | 376 ++++++++++++++++++++++++------------------- 2 files changed, 224 insertions(+), 166 deletions(-) create mode 100644 META-INF/MANIFEST.MF diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 00000000..c397ba02 --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,14 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: org.apache.bcel +Bundle-SymbolicName: org.apache.bcel +Bundle-Vendor: Apache +Bundle-Version: 5.3 +Export-Package: org.apache.bcel, + org.apache.bcel.classfile, + org.apache.bcel.generic, + org.apache.bcel.util, + org.apache.bcel.verifier, + org.apache.bcel.verifier.exc, + org.apache.bcel.verifier.statics, + org.apache.bcel.verifier.structurals diff --git a/pom.xml b/pom.xml index 33ddea56..c776c590 100755 --- a/pom.xml +++ b/pom.xml @@ -1,158 +1,158 @@ - - 4.0.0 - - bcel - bcel - jar - 5.3-SNAPSHOT - Jakarta BCEL - Bytecode Engineering Library - - http://jakarta.apache.org/bcel - 2004 - - - - Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - The Apache Software Foundation - http://www.apache.org/ - - - - - Dave Brosius - dbrosius - dbrosius at mebigfatguy.com - - - - Torsten Curdt - tcurdt - tcurdt at apache.org - ASF - http://www.apache.org/ - +1 - - - - Markus Dahm - mdahm - m.dahm at gmx.de - it-frameworksolutions - - - - Jason van Zyl - jason at zenplex.com - - - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + 4.0.0 + + org.apache.bcel + bcel + jar + 5.3-SNAPSHOT + Jakarta BCEL + Bytecode Engineering Library + + http://jakarta.apache.org/bcel + 2004 + + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + The Apache Software Foundation + http://www.apache.org/ + + + + + Dave Brosius + dbrosius + dbrosius at mebigfatguy.com + + + + Torsten Curdt + tcurdt + tcurdt at apache.org + ASF + http://www.apache.org/ + +1 + + + + Markus Dahm + mdahm + m.dahm at gmx.de + it-frameworksolutions + + + + Jason van Zyl + jason at zenplex.com + + + - - Enver Haase - enver at convergence.de - + + Enver Haase + enver at convergence.de + - - David Dixon-Peugh - dixonpeugh at yahoo.com - + + David Dixon-Peugh + dixonpeugh at yahoo.com + - - Patrick Beard - beard at netscape.com - + + Patrick Beard + beard at netscape.com + - - Conor MacNeill - conor at cortexbusiness.com.au - + + Conor MacNeill + conor at cortexbusiness.com.au + - - Costin Manolache - cmanolache at yahoo.com - + + Costin Manolache + cmanolache at yahoo.com + - - - BCEL User List - - bcel-user-subscribe@jakarta.apache.org - - - bcel-user-unsubscribe@jakarta.apache.org - - - http://www.mail-archive.com/bcel-user@jakarta.apache.org/ - - - - BCEL Developer List - bcel-dev-subscribe@jakarta.apache.org - - bcel-dev-unsubscribe@jakarta.apache.org - - - http://www.mail-archive.com/bcel-dev@jakarta.apache.org/ - - - - - - bugzilla - https://issues.apache.org/bugzilla - - - - - scm:svn:http://svn.apache.org/repos/asf/jakarta/bcel/trunk - - - scm:svn:http://svn.apache.org/repos/asf/jakarta/bcel/trunk - - http://svn.apache.org/repos/asf/jakarta/bcel/trunk - - - + + + BCEL User List + + bcel-user-subscribe@jakarta.apache.org + + + bcel-user-unsubscribe@jakarta.apache.org + + + http://www.mail-archive.com/bcel-user@jakarta.apache.org/ + + + + BCEL Developer List + bcel-dev-subscribe@jakarta.apache.org + + bcel-dev-unsubscribe@jakarta.apache.org + + + http://www.mail-archive.com/bcel-dev@jakarta.apache.org/ + + + + + + bugzilla + https://issues.apache.org/bugzilla + + + + + scm:svn:http://svn.apache.org/repos/asf/jakarta/bcel/trunk + + + scm:svn:http://svn.apache.org/repos/asf/jakarta/bcel/trunk + + http://svn.apache.org/repos/asf/jakarta/bcel/trunk + + + releases - scpexe://people.apache.org/home/tcurdt/public_html/releases/bcel + scpexe://people.apache.org/home/${USER}/public_html/releases/bcel snaphots - scpexe://people.apache.org/home/tcurdt/public_html/shapshots/bcel + scpexe://people.apache.org/home/${USER}/public_html/shapshots/bcel - - website - - scpexe://people.apache.org/home/tcurdt/public_html/websites/bcel - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - true - 1.4 - 1.4 - + + website + + scpexe://people.apache.org/home/${USER}/public_html/websites/bcel + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + true + 1.4 + 1.4 + compile-tests @@ -166,31 +166,34 @@ - - - maven-surefire-plugin - - - **/*TestCase.java - - - **/Abstract* - - false - false - - - - - - - + - maven-javadoc-plugin + org.apache.maven.plugins + maven-jar-plugin + + + META-INF/MANIFEST.MF + + - maven-pmd-plugin + maven-surefire-plugin + + + **/*TestCase.java + + + **/Abstract* + + false + false + + + + + + maven-project-info-reports-plugin @@ -204,6 +207,13 @@ + + - - - junit - junit - 3.8.2 - test - - + + + junit + junit + 3.8.2 + test + + -- GitLab From f2387dbdd01ec97935728a77530211c73918cc49 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Fri, 28 Mar 2008 23:11:28 +0000 Subject: [PATCH 0396/1313] https://issues.apache.org/bugzilla/show_bug.cgi?id=44702 Thanks to William Pugh git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@642421 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/LocalVariableTable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index 700c6382..f5371953 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -145,7 +145,7 @@ public class LocalVariableTable extends Attribute { if (local_variable_table[i].getIndex() == index) { int start_pc = local_variable_table[i].getStartPC(); int end_pc = start_pc + local_variable_table[i].getLength(); - if ((pc >= start_pc) && (pc < end_pc)) { + if ((pc >= start_pc) && (pc <= end_pc)) { return local_variable_table[i]; } } -- GitLab From 75f82c731b94744aae118a72a95f036e0f640a7b Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 2 Apr 2008 03:38:41 +0000 Subject: [PATCH 0397/1313] don't throw exceptions on close from a finally block git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@643697 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/ClassParser.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 0cb7751e..080b60eb 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; + import org.apache.bcel.Constants; /** @@ -162,12 +163,16 @@ public final class ClassParser { } finally { // Read everything of interest, so close the file if (fileOwned) { - if (file != null) { - file.close(); - } - if (zip != null) { - zip.close(); - } + try { + if (file != null) { + file.close(); + } + if (zip != null) { + zip.close(); + } + } catch (IOException ioe) { + //ignore close exceptions + } } } // Return the information we have gathered in a new object -- GitLab From dd9ee56a3f625005bdbfce0747cec1c515da0924 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 2 Apr 2008 03:42:14 +0000 Subject: [PATCH 0398/1313] don't allocate a buffer if no work is to be done git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@643698 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Utility.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 731307e0..1cafc769 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -705,7 +705,7 @@ public abstract class Utility { /** - * Replace all occurences of old in str with new. + * Replace all occurrences of old in str with new. * * @param str String to permute * @param old String to be replaced @@ -714,9 +714,9 @@ public abstract class Utility { */ public static final String replace( String str, String old, String new_ ) { int index, old_index; - StringBuffer buf = new StringBuffer(); try { if ((index = str.indexOf(old)) != -1) { // `old' found in str + StringBuffer buf = new StringBuffer(); old_index = 0; // String start offset // While we have something to replace while ((index = str.indexOf(old, old_index)) != -1) { -- GitLab From a083af547173a593d2ee5f4831932b590f600f51 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 2 Apr 2008 03:47:13 +0000 Subject: [PATCH 0399/1313] don't allocate objects if not using them git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@643700 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/structurals/ControlFlowGraph.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index 5a9d451e..7ae3bb90 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -323,7 +323,6 @@ public class ControlFlowGraph{ private InstructionHandle[] _getSuccessors(){ final InstructionHandle[] empty = new InstructionHandle[0]; final InstructionHandle[] single = new InstructionHandle[1]; - final InstructionHandle[] pair = new InstructionHandle[2]; Instruction inst = getInstruction().getInstruction(); @@ -378,6 +377,7 @@ public class ControlFlowGraph{ return ret; } else{ + final InstructionHandle[] pair = new InstructionHandle[2]; pair[0] = getInstruction().getNext(); pair[1] = ((BranchInstruction) inst).getTarget(); return pair; -- GitLab From eefd15b2b589df47dffbb398b22c6b33be5c5a43 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 2 Apr 2008 03:48:15 +0000 Subject: [PATCH 0400/1313] don't allocate memory that is unused git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@643702 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/verifier/structurals/Subroutines.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index b6daf7bb..ad018b6b 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -592,7 +592,6 @@ System.err.println("DEBUG: Please verify '"+any.toString(true)+"' lies in dead c private static InstructionHandle[] getSuccessors(InstructionHandle instruction){ final InstructionHandle[] empty = new InstructionHandle[0]; final InstructionHandle[] single = new InstructionHandle[1]; - final InstructionHandle[] pair = new InstructionHandle[2]; Instruction inst = instruction.getInstruction(); @@ -633,6 +632,7 @@ System.err.println("DEBUG: Please verify '"+any.toString(true)+"' lies in dead c return ret; } else{ + final InstructionHandle[] pair = new InstructionHandle[2]; pair[0] = instruction.getNext(); pair[1] = ((BranchInstruction) inst).getTarget(); return pair; -- GitLab From bbaa40ab4c608c2450f3406128d247cc70658d0e Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 2 Apr 2008 03:51:02 +0000 Subject: [PATCH 0401/1313] remove stuttered code git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@643706 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/ConstantHTML.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/util/ConstantHTML.java b/src/main/java/org/apache/bcel/util/ConstantHTML.java index 8c37f310..76ec7500 100644 --- a/src/main/java/org/apache/bcel/util/ConstantHTML.java +++ b/src/main/java/org/apache/bcel/util/ConstantHTML.java @@ -112,7 +112,6 @@ final class ConstantHTML implements org.apache.bcel.Constants { // Partially compacted class name, i.e., / -> . String method_class = constant_pool.constantToString(class_index, CONSTANT_Class); String short_method_class = Utility.compactClassName(method_class); // I.e., remove java.lang. - short_method_class = Utility.compactClassName(method_class); // I.e., remove java.lang. short_method_class = Utility.compactClassName(short_method_class, class_package + ".", true); // Remove class package prefix // Get method signature -- GitLab From 3916d632d96f17d7e732983f4bd3a0a03485fbd4 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 2 Apr 2008 03:56:22 +0000 Subject: [PATCH 0402/1313] remove duplicate call git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@643711 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/BCELFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index 33765ba5..139821dc 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -199,7 +199,7 @@ class BCELFactory extends EmptyVisitor { private void createConstant( Object value ) { String embed = value.toString(); if (value instanceof String) { - embed = '"' + Utility.convertString(value.toString()) + '"'; + embed = '"' + Utility.convertString(embed) + '"'; } else if (value instanceof Character) { embed = "(char)0x" + Integer.toHexString(((Character) value).charValue()); } -- GitLab From 36206236786a00a7ec0c1009c976da18cf326dff Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 30 Jul 2008 03:02:59 +0000 Subject: [PATCH 0403/1313] add test for 45440 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@680907 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/util/InstructionFinderTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/test/java/org/apache/bcel/util/InstructionFinderTest.java diff --git a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java new file mode 100644 index 00000000..53b648a3 --- /dev/null +++ b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java @@ -0,0 +1,28 @@ +package org.apache.bcel.util; + +import java.util.Iterator; + +import org.apache.bcel.AbstractTestCase; +import org.apache.bcel.generic.IADD; +import org.apache.bcel.generic.ILOAD; +import org.apache.bcel.generic.ISTORE; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; + +public class InstructionFinderTest extends AbstractTestCase { + + public void testSearch() { + InstructionList il = new InstructionList(); + il.append(new ILOAD(1)); + il.append(new ILOAD(2)); + il.append(new IADD()); + il.append(new ISTORE(3)); + InstructionFinder finder = new InstructionFinder(il); + + Iterator it = finder.search("ILOAD IADD", il.getInstructionHandles()[0], null ); + InstructionHandle[] ihs = (InstructionHandle[])it.next(); + assertEquals(2, ihs.length); + assertEquals(ihs[0].getInstruction(), new ILOAD(2)); + assertEquals(ihs[1].getInstruction(), new IADD()); + } +} -- GitLab From 0d6018bf917eef01d3d665cbe83b3152c2097919 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sat, 13 Sep 2008 01:44:14 +0000 Subject: [PATCH 0404/1313] Better exceptioning, -- don't lose exception stack traces git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@694866 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/ClassFormatException.java | 4 ++++ .../java/org/apache/bcel/classfile/Utility.java | 14 +++++++------- .../org/apache/bcel/generic/ClassGenException.java | 4 ++++ .../apache/bcel/generic/InstructionFactory.java | 2 +- .../org/apache/bcel/generic/InstructionList.java | 4 ++-- src/main/java/org/apache/bcel/generic/Type.java | 6 +++--- .../apache/bcel/util/ClassLoaderRepository.java | 2 +- .../java/org/apache/bcel/util/JavaWrapper.java | 2 +- .../org/apache/bcel/util/SyntheticRepository.java | 4 ++-- 9 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java index 14940110..523982ec 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java +++ b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java @@ -34,4 +34,8 @@ public class ClassFormatException extends RuntimeException { public ClassFormatException(String s) { super(s); } + + public ClassFormatException(String s, Throwable initCause) { + super(s, initCause); + } } diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 1cafc769..0bba28d7 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -162,7 +162,7 @@ public abstract class Utility { } catch (IOException e) { System.out.println(buf.toString()); e.printStackTrace(); - throw new ClassFormatException("Byte code error: " + e); + throw new ClassFormatException("Byte code error: " + e, e); } return buf.toString(); } @@ -568,7 +568,7 @@ public abstract class Utility { index += unwrap(consumed_chars); // update position } } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature, e); } return (String[]) vec.toArray(new String[vec.size()]); } @@ -600,7 +600,7 @@ public abstract class Utility { index = signature.lastIndexOf(')') + 1; type = signatureToString(signature.substring(index), chopit); } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature, e); } return type; } @@ -687,7 +687,7 @@ public abstract class Utility { // Read return type after `)' type = signatureToString(signature.substring(index), chopit); } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature, e); } if (buf.length() > 1) { buf.setLength(buf.length() - 2); @@ -834,7 +834,7 @@ public abstract class Utility { throw new ClassFormatException("Invalid signature: `" + signature + "'"); } } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid signature: " + e + ":" + signature); + throw new ClassFormatException("Invalid signature: " + signature, e); } } @@ -943,7 +943,7 @@ public abstract class Utility { index = signature.lastIndexOf(')') + 1; return typeOfSignature(signature.substring(index)); } catch (StringIndexOutOfBoundsException e) { - throw new ClassFormatException("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature, e); } } @@ -984,7 +984,7 @@ public abstract class Utility { throw new ClassFormatException("Invalid method signature: " + signature); } } catch (StringIndexOutOfBoundsException e) { - throw new ClassFormatException("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature, e); } } diff --git a/src/main/java/org/apache/bcel/generic/ClassGenException.java b/src/main/java/org/apache/bcel/generic/ClassGenException.java index 9e3ce8e1..4b5ee80d 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGenException.java +++ b/src/main/java/org/apache/bcel/generic/ClassGenException.java @@ -33,4 +33,8 @@ public class ClassGenException extends RuntimeException { public ClassGenException(String s) { super(s); } + + public ClassGenException(String s, Throwable initCause) { + super(s, initCause); + } } diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index 8cc9f805..77f73210 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -562,7 +562,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali try { i = (Instruction) java.lang.Class.forName(name).newInstance(); } catch (Exception e) { - throw new RuntimeException("Could not find instruction: " + name); + throw new RuntimeException("Could not find instruction: " + name, e); } return i; } else if ((src_type instanceof ReferenceType) && (dest_type instanceof ReferenceType)) { diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 3d0ce595..a7c1ee20 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -185,7 +185,7 @@ public class InstructionList implements Serializable { count++; } } catch (IOException e) { - throw new ClassGenException(e.toString()); + throw new ClassGenException(e.toString(), e); } byte_positions = new int[count]; // Trim to proper size System.arraycopy(pos, 0, byte_positions, 0, count); @@ -968,7 +968,7 @@ public class InstructionList implements Serializable { instructions.add(Instruction.readInstruction(bytes)); } } catch (IOException e) { - throw new ClassGenException(e.toString()); + throw new ClassGenException(e.toString(), e); } return (Instruction[]) instructions.toArray(new Instruction[instructions.size()]); } diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 4a5b401b..c8086e28 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -207,7 +207,7 @@ public abstract class Type implements java.io.Serializable { int index = signature.lastIndexOf(')') + 1; return getType(signature.substring(index)); } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature, e); } } @@ -232,7 +232,7 @@ public abstract class Type implements java.io.Serializable { index += unwrap(consumed_chars); // update position } } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature, e); } types = new Type[vec.size()]; vec.toArray(types); @@ -335,7 +335,7 @@ public abstract class Type implements java.io.Serializable { index += consumed(coded); } } catch (StringIndexOutOfBoundsException e) { // Should never occur - throw new ClassFormatException("Invalid method signature: " + signature); + throw new ClassFormatException("Invalid method signature: " + signature, e); } return res; } diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java index 3a3c2906..e1ee4ea4 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -95,7 +95,7 @@ public class ClassLoaderRepository implements Repository { storeClass(RC); return RC; } catch (IOException e) { - throw new ClassNotFoundException(e.toString()); + throw new ClassNotFoundException(className + " not found: " + e.toString(), e); } } diff --git a/src/main/java/org/apache/bcel/util/JavaWrapper.java b/src/main/java/org/apache/bcel/util/JavaWrapper.java index e7e96bc0..a03383f0 100644 --- a/src/main/java/org/apache/bcel/util/JavaWrapper.java +++ b/src/main/java/org/apache/bcel/util/JavaWrapper.java @@ -48,7 +48,7 @@ public class JavaWrapper { try { return (java.lang.ClassLoader) Class.forName(s).newInstance(); } catch (Exception e) { - throw new RuntimeException(e.toString()); + throw new RuntimeException(e.toString(), e); } } diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index d9bf63e4..0b037575 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -126,7 +126,7 @@ public class SyntheticRepository implements Repository { return loadClass(_path.getInputStream(className), className); } catch (IOException e) { throw new ClassNotFoundException("Exception while looking for class " + className - + ": " + e.toString()); + + ": " + e.toString(), e); } } @@ -169,7 +169,7 @@ public class SyntheticRepository implements Repository { } } catch (IOException e) { throw new ClassNotFoundException("Exception while looking for class " + className - + ": " + e.toString()); + + ": " + e.toString(), e); } throw new ClassNotFoundException("SyntheticRepository could not load " + className); } -- GitLab From 04e4579e90e765811020d4f1d2860af6feaaa422 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 00:30:07 +0000 Subject: [PATCH 0405/1313] no exception thrown - so don't define it as such git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826320 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ClassParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 080b60eb..0d6f20c3 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -82,7 +82,7 @@ public final class ClassParser { * * @param file_name file name */ - public ClassParser(String file_name) throws IOException { + public ClassParser(String file_name) { is_zip = false; this.file_name = file_name; fileOwned = true; -- GitLab From d119a8c2cb79946ea259b2065ae6fb319caf6681 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 00:56:28 +0000 Subject: [PATCH 0406/1313] retain exception stack traces in the verifier git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826323 13f79535-47bb-0310-9956-ffa450edef68 --- .../exc/AssertionViolatedException.java | 7 +++++ .../exc/ClassConstraintException.java | 7 +++++ .../verifier/exc/VerificationException.java | 7 +++++ .../VerifierConstraintViolatedException.java | 7 +++++ .../bcel/verifier/statics/Pass2Verifier.java | 30 +++++++++---------- .../bcel/verifier/statics/Pass3aVerifier.java | 22 +++++++------- .../structurals/InstConstraintVisitor.java | 20 ++++++------- .../verifier/structurals/LocalVariables.java | 2 +- .../verifier/structurals/OperandStack.java | 2 +- .../verifier/structurals/Pass3bVerifier.java | 4 +-- .../verifier/structurals/Subroutines.java | 2 +- 11 files changed, 69 insertions(+), 41 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java index d346fe7c..9ef518bf 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java @@ -39,6 +39,13 @@ public final class AssertionViolatedException extends RuntimeException{ super(message = "INTERNAL ERROR: "+message); // Thanks to Java, the constructor call here must be first. detailMessage=message; } + /** + * Constructs a new AssertionViolationException with the specified error message and initial cause + */ + public AssertionViolatedException(String message, Throwable initCause) { + super(message = "INTERNAL ERROR: "+message, initCause); + detailMessage=message; + } /** Extends the error message with a string before ("pre") and after ("post") the 'old' error message. All of these three strings are allowed to be null, and null is always replaced by the empty string (""). In particular, after invoking this diff --git a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java index 18bf94bc..2a114748 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java @@ -39,4 +39,11 @@ public class ClassConstraintException extends VerificationException{ public ClassConstraintException(String message){ super (message); } + + /** + * Constructs a new ClassConstraintException with the specified error message and cause + */ + public ClassConstraintException(String message, Throwable initCause){ + super(message, initCause); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java index c6b43178..00016cd5 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java @@ -42,4 +42,11 @@ public abstract class VerificationException extends VerifierConstraintViolatedEx VerificationException(String message){ super(message); } + + /** + * Constructs a new VerificationException with the specified error message and exception + */ + VerificationException(String message, Throwable initCause){ + super(message, initCause); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java index 253e24f9..e07108f3 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java @@ -47,6 +47,13 @@ public abstract class VerifierConstraintViolatedException extends RuntimeExcepti super(message); // Not that important detailMessage = message; } + /** + * Constructs a new VerifierConstraintViolationException with the specified error message and cause + */ + VerifierConstraintViolatedException(String message, Throwable initCause){ + super(message, initCause); + detailMessage = message; + } /** Extends the error message with a string before ("pre") and after ("post") the diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 99c941db..80761861 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -171,7 +171,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -223,7 +223,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -278,7 +278,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -299,7 +299,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -548,7 +548,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ Type.getType(sig); /* Don't need the return value */ } catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'."); + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); } String nameanddesc = (name+sig); @@ -597,7 +597,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ ts = Type.getArgumentTypes(sig); } catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by Method '"+tostring(obj)+"'."); + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by Method '"+tostring(obj)+"'.", cfe); } // Check if referenced objects exist. @@ -998,7 +998,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ t = Type.getType(localsig); } catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+localsig+"' used by LocalVariable '"+tostring(localvariables[i])+"' referenced by '"+tostring(lvt)+"'."); + throw new ClassConstraintException("Illegal descriptor (==signature) '"+localsig+"' used by LocalVariable '"+tostring(localvariables[i])+"' referenced by '"+tostring(lvt)+"'.", cfe); } int localindex = localvariables[i].getIndex(); if ( ( (t==Type.LONG || t==Type.DOUBLE)? localindex+1:localindex) >= code.getMaxLocals()){ @@ -1009,7 +1009,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ localVariablesInfos[method_number].add(localindex, localname, localvariables[i].getStartPC(), localvariables[i].getLength(), t); } catch(LocalVariableInfoInconsistentException lviie){ - throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+"' found in Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"'). "+lviie.getMessage()); + throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+"' found in Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"'). "+lviie.getMessage(), lviie); } }// for all local variables localvariables[i] in the LocalVariableTable attribute atts[a] END @@ -1022,7 +1022,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } }// visitCode(Code) END @@ -1080,7 +1080,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } // SYNTHETIC: see above @@ -1170,7 +1170,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -1213,7 +1213,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ Type.getType(sig); /* Don't need the return value */ } catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'."); + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); } } @@ -1244,7 +1244,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } } catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'."); + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); } } @@ -1275,7 +1275,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } } catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'."); + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); } } @@ -1327,7 +1327,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * This method returns true if and only if the supplied String * represents a valid Java programming language method name stored as a simple * (non-qualified) name. - * Conforming to: The Java Virtual Machine Specification, Second Edition, §2.7, §2.7.1, §2.2. + * Conforming to: The Java Virtual Machine Specification, Second Edition, �2.7, �2.7.1, �2.2. */ private static boolean validJavaLangMethodName(String name){ if (!Character.isJavaIdentifierStart(name.charAt(0))) { diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 871cb80f..4ae2113b 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -210,7 +210,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -415,7 +415,7 @@ public final class Pass3aVerifier extends PassVerifier{ } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -456,7 +456,7 @@ public final class Pass3aVerifier extends PassVerifier{ return Repository.lookupClass(myOwner.getClassName()).getMethods()[method_no].getCode().getMaxLocals(); } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -532,7 +532,7 @@ public final class Pass3aVerifier extends PassVerifier{ indexValid(o, o.getIndex()+1); } catch(StaticCodeInstructionOperandConstraintException e){ - throw new AssertionViolatedException("OOPS: Does not BCEL handle that? LDC2_W operand has a problem."); + throw new AssertionViolatedException("OOPS: Does not BCEL handle that? LDC2_W operand has a problem.", e); } } @@ -605,7 +605,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -998,7 +998,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -1024,7 +1024,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -1065,7 +1065,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -1129,7 +1129,7 @@ public final class Pass3aVerifier extends PassVerifier{ } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -1161,7 +1161,7 @@ public final class Pass3aVerifier extends PassVerifier{ } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -1194,7 +1194,7 @@ public final class Pass3aVerifier extends PassVerifier{ } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 0a44ea58..ad9134f6 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -471,7 +471,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -563,7 +563,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -655,7 +655,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc // referenceTypeIsInitialized(o, (ReferenceType) objectref); //} // The unsigned indexbyte1 and indexbyte2 are used to construct an index into the runtime constant pool of the - // current class (§3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant + // current class (�3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant // pool item at the index must be a symbolic reference to a class, array, or interface type. Constant c = cpg.getConstant(o.getIndex()); if (! (c instanceof ConstantClass)){ @@ -1236,7 +1236,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -1638,7 +1638,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc // referenceTypeIsInitialized(o, (ReferenceType) objectref); //} // The unsigned indexbyte1 and indexbyte2 are used to construct an index into the runtime constant pool of the - // current class (§3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant + // current class (�3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant // pool item at the index must be a symbolic reference to a class, array, or interface type. Constant c = cpg.getConstant(o.getIndex()); if (! (c instanceof ConstantClass)){ @@ -1824,7 +1824,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -1875,7 +1875,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -1952,7 +1952,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -2557,7 +2557,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } @@ -2621,7 +2621,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 05a0ab97..8c7a7c72 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -177,7 +177,7 @@ public class LocalVariables{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java index c50c04fa..0f04a755 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -244,7 +244,7 @@ public class OperandStack{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 55b2dbd0..0069603c 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -316,7 +316,7 @@ public final class Pass3bVerifier extends PassVerifier{ jc = Repository.lookupClass(myOwner.getClassName()); } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString()); + throw new AssertionViolatedException("Missing class: " + e.toString(), e); } ConstantPoolGen constantPoolGen = new ConstantPoolGen(jc.getConstantPool()); @@ -378,7 +378,7 @@ public final class Pass3bVerifier extends PassVerifier{ PrintWriter pw = new PrintWriter(sw); re.printStackTrace(pw); - throw new AssertionViolatedException("Some RuntimeException occured while verify()ing class '"+jc.getClassName()+"', method '"+methods[method_no]+"'. Original RuntimeException's stack trace:\n---\n"+sw+"---\n"); + throw new AssertionViolatedException("Some RuntimeException occured while verify()ing class '"+jc.getClassName()+"', method '"+methods[method_no]+"'. Original RuntimeException's stack trace:\n---\n"+sw+"---\n", re); } return VerificationResult.VR_OK; } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index ad018b6b..d5b46aa8 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -286,7 +286,7 @@ public class Subroutines{ } } catch(RuntimeException re){ - throw new AssertionViolatedException("Oops. BCEL did not like NULL as a ConstantPoolGen object."); + throw new AssertionViolatedException("Oops. BCEL did not like NULL as a ConstantPoolGen object.", re); } } } -- GitLab From c8b1ea3e23c4b30a85dfff30aec1df6e90911316 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 01:03:30 +0000 Subject: [PATCH 0407/1313] make sure streams get closed git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826324 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/util/SyntheticRepository.java | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index 0b037575..d11c6a7c 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -145,17 +145,29 @@ public class SyntheticRepository implements Repository { * Repository, and its representation could not be found */ public JavaClass loadClass( Class clazz ) throws ClassNotFoundException { - String className = clazz.getName(); - JavaClass repositoryClass = findClass(className); - if (repositoryClass != null) { - return repositoryClass; - } - String name = className; - int i = name.lastIndexOf('.'); - if (i > 0) { - name = name.substring(i + 1); - } - return loadClass(clazz.getResourceAsStream(name + ".class"), className); + InputStream clsStream = null; + try{ + String className = clazz.getName(); + JavaClass repositoryClass = findClass(className); + if (repositoryClass != null) { + return repositoryClass; + } + String name = className; + int i = name.lastIndexOf('.'); + if (i > 0) { + name = name.substring(i + 1); + } + clsStream = clazz.getResourceAsStream(name + ".class"); + return loadClass(clsStream, className); + } finally { + try{ + if (clsStream != null){ + clsStream.close(); + } + } catch(IOException ioe){ + //don't care + } + } } -- GitLab From c1b82f0b449a686ecee68ca679bc0f941c421c24 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 01:15:08 +0000 Subject: [PATCH 0408/1313] base parse input on DataInput interface rather than DataInputStream class git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826328 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/CodeException.java | 5 +++-- src/main/java/org/apache/bcel/classfile/ConstantCP.java | 5 +++-- src/main/java/org/apache/bcel/classfile/ConstantClass.java | 5 +++-- src/main/java/org/apache/bcel/classfile/ConstantDouble.java | 5 +++-- src/main/java/org/apache/bcel/classfile/ConstantFloat.java | 5 +++-- src/main/java/org/apache/bcel/classfile/ConstantInteger.java | 5 +++-- src/main/java/org/apache/bcel/classfile/ConstantLong.java | 5 +++-- .../java/org/apache/bcel/classfile/ConstantNameAndType.java | 5 +++-- src/main/java/org/apache/bcel/classfile/ConstantString.java | 5 +++-- src/main/java/org/apache/bcel/classfile/ConstantUtf8.java | 5 +++-- src/main/java/org/apache/bcel/classfile/ConstantValue.java | 5 +++-- src/main/java/org/apache/bcel/classfile/EnclosingMethod.java | 4 ++-- src/main/java/org/apache/bcel/classfile/InnerClass.java | 5 +++-- src/main/java/org/apache/bcel/classfile/LineNumber.java | 4 ++-- src/main/java/org/apache/bcel/classfile/LocalVariable.java | 5 +++-- src/main/java/org/apache/bcel/classfile/PMGClass.java | 5 +++-- src/main/java/org/apache/bcel/classfile/Signature.java | 5 +++-- src/main/java/org/apache/bcel/classfile/SourceFile.java | 5 +++-- src/main/java/org/apache/bcel/classfile/StackMapType.java | 5 +++-- 19 files changed, 55 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/CodeException.java b/src/main/java/org/apache/bcel/classfile/CodeException.java index 36d64678..22baa792 100644 --- a/src/main/java/org/apache/bcel/classfile/CodeException.java +++ b/src/main/java/org/apache/bcel/classfile/CodeException.java @@ -16,10 +16,11 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; + import org.apache.bcel.Constants; /** @@ -57,7 +58,7 @@ public final class CodeException implements Cloneable, Constants, Node, Serializ * @param file Input stream * @throws IOException */ - CodeException(DataInputStream file) throws IOException { + CodeException(DataInput file) throws IOException { this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), file .readUnsignedShort()); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantCP.java b/src/main/java/org/apache/bcel/classfile/ConstantCP.java index b3ca86cb..beac074e 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantCP.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -52,7 +53,7 @@ public abstract class ConstantCP extends Constant { * @param file Input stream * @throws IOException */ - ConstantCP(byte tag, DataInputStream file) throws IOException { + ConstantCP(byte tag, DataInput file) throws IOException { this(tag, file.readUnsignedShort(), file.readUnsignedShort()); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantClass.java b/src/main/java/org/apache/bcel/classfile/ConstantClass.java index f0e45e0e..a77798c9 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantClass.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -49,7 +50,7 @@ public final class ConstantClass extends Constant implements ConstantObject { * @param file Input stream * @throws IOException */ - ConstantClass(DataInputStream file) throws IOException { + ConstantClass(DataInput file) throws IOException { this(file.readUnsignedShort()); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java index b344f267..3a56e52b 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -58,7 +59,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { * @param file Input stream * @throws IOException */ - ConstantDouble(DataInputStream file) throws IOException { + ConstantDouble(DataInput file) throws IOException { this(file.readDouble()); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java index c9426ef1..e170c89c 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -59,7 +60,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { * @param file Input stream * @throws IOException */ - ConstantFloat(DataInputStream file) throws IOException { + ConstantFloat(DataInput file) throws IOException { this(file.readFloat()); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java index 76a6e862..2757e0c3 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -58,7 +59,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { * @param file Input stream * @throws IOException */ - ConstantInteger(DataInputStream file) throws IOException { + ConstantInteger(DataInput file) throws IOException { this(file.readInt()); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantLong.java b/src/main/java/org/apache/bcel/classfile/ConstantLong.java index d6997935..98225262 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantLong.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -58,7 +59,7 @@ public final class ConstantLong extends Constant implements ConstantObject { * @param file Input stream * @throws IOException */ - ConstantLong(DataInputStream file) throws IOException { + ConstantLong(DataInput file) throws IOException { this(file.readLong()); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java index 18f42e79..1cef96f0 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -51,7 +52,7 @@ public final class ConstantNameAndType extends Constant { * @param file Input stream * @throws IOException */ - ConstantNameAndType(DataInputStream file) throws IOException { + ConstantNameAndType(DataInput file) throws IOException { this(file.readUnsignedShort(), file.readUnsignedShort()); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantString.java b/src/main/java/org/apache/bcel/classfile/ConstantString.java index 64e4fd77..dd931b7f 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantString.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -49,7 +50,7 @@ public final class ConstantString extends Constant implements ConstantObject { * @param file Input stream * @throws IOException */ - ConstantString(DataInputStream file) throws IOException { + ConstantString(DataInput file) throws IOException { this(file.readUnsignedShort()); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index 593e64da..f1c59ce2 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -49,7 +50,7 @@ public final class ConstantUtf8 extends Constant { * @param file Input stream * @throws IOException */ - ConstantUtf8(DataInputStream file) throws IOException { + ConstantUtf8(DataInput file) throws IOException { super(Constants.CONSTANT_Utf8); bytes = file.readUTF(); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantValue.java b/src/main/java/org/apache/bcel/classfile/ConstantValue.java index f18a6b55..c253f775 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantValue.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -52,7 +53,7 @@ public final class ConstantValue extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - ConstantValue(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + ConstantValue(int name_index, int length, DataInput file, ConstantPool constant_pool) throws IOException { this(name_index, length, file.readUnsignedShort(), constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java index bab8c96b..64283ea9 100755 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -12,7 +12,7 @@ * ******************************************************************/ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; @@ -39,7 +39,7 @@ public class EnclosingMethod extends Attribute { private int methodIndex; // Ctors - and code to read an attribute in. - public EnclosingMethod(int nameIndex, int len, DataInputStream dis, ConstantPool cpool) throws IOException { + public EnclosingMethod(int nameIndex, int len, DataInput dis, ConstantPool cpool) throws IOException { this(nameIndex, len, dis.readUnsignedShort(), dis.readUnsignedShort(), cpool); } diff --git a/src/main/java/org/apache/bcel/classfile/InnerClass.java b/src/main/java/org/apache/bcel/classfile/InnerClass.java index 7bee7a27..9c80eaa5 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClass.java @@ -16,10 +16,11 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; + import org.apache.bcel.Constants; /** @@ -53,7 +54,7 @@ public final class InnerClass implements Cloneable, Node, Serializable { * @param file Input stream * @throws IOException */ - InnerClass(DataInputStream file) throws IOException { + InnerClass(DataInput file) throws IOException { this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), file .readUnsignedShort()); } diff --git a/src/main/java/org/apache/bcel/classfile/LineNumber.java b/src/main/java/org/apache/bcel/classfile/LineNumber.java index 645c4c88..01bd1ed5 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumber.java @@ -16,7 +16,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; @@ -49,7 +49,7 @@ public final class LineNumber implements Cloneable, Node, Serializable { * @param file Input stream * @throws IOException */ - LineNumber(DataInputStream file) throws IOException { + LineNumber(DataInput file) throws IOException { this(file.readUnsignedShort(), file.readUnsignedShort()); } diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java index abb27652..ab69e6e7 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariable.java @@ -16,10 +16,11 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; + import org.apache.bcel.Constants; /** @@ -57,7 +58,7 @@ public final class LocalVariable implements Constants, Cloneable, Node, Serializ * @param file Input stream * @throws IOException */ - LocalVariable(DataInputStream file, ConstantPool constant_pool) throws IOException { + LocalVariable(DataInput file, ConstantPool constant_pool) throws IOException { this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), file .readUnsignedShort(), file.readUnsignedShort(), constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java index 709e3ddd..68fa289d 100644 --- a/src/main/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/main/java/org/apache/bcel/classfile/PMGClass.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -52,7 +53,7 @@ public final class PMGClass extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - PMGClass(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + PMGClass(int name_index, int length, DataInput file, ConstantPool constant_pool) throws IOException { this(name_index, length, file.readUnsignedShort(), file.readUnsignedShort(), constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index 340c76ee..fc6bc3d8 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -17,9 +17,10 @@ package org.apache.bcel.classfile; import java.io.ByteArrayInputStream; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -52,7 +53,7 @@ public final class Signature extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - Signature(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + Signature(int name_index, int length, DataInput file, ConstantPool constant_pool) throws IOException { this(name_index, length, file.readUnsignedShort(), constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java index e1443bf4..6645996a 100644 --- a/src/main/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/main/java/org/apache/bcel/classfile/SourceFile.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -53,7 +54,7 @@ public final class SourceFile extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - SourceFile(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + SourceFile(int name_index, int length, DataInput file, ConstantPool constant_pool) throws IOException { this(name_index, length, file.readUnsignedShort(), constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/StackMapType.java b/src/main/java/org/apache/bcel/classfile/StackMapType.java index 6166abfd..63d42296 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapType.java @@ -16,9 +16,10 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** @@ -43,7 +44,7 @@ public final class StackMapType implements Cloneable { * @param file Input stream * @throws IOException */ - StackMapType(DataInputStream file, ConstantPool constant_pool) throws IOException { + StackMapType(DataInput file, ConstantPool constant_pool) throws IOException { this(file.readByte(), -1, constant_pool); if (hasIndex()) { setIndex(file.readShort()); -- GitLab From bdaaea0938bf2a531472b5bf7c335a677d8117ce Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 01:20:41 +0000 Subject: [PATCH 0409/1313] simplify meaningless stuff git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826329 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ExceptionTable.java | 2 +- .../java/org/apache/bcel/classfile/LocalVariableTable.java | 2 +- .../org/apache/bcel/classfile/LocalVariableTypeTable.java | 2 +- src/main/java/org/apache/bcel/classfile/Utility.java | 4 ++-- src/main/java/org/apache/bcel/generic/ClassGen.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java index aeb036d0..9487b659 100644 --- a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java @@ -150,7 +150,7 @@ public final class ExceptionTable extends Attribute { * @return String representation, i.e., a list of thrown exceptions. */ public final String toString() { - StringBuffer buf = new StringBuffer(""); + StringBuffer buf = new StringBuffer(); String str; for (int i = 0; i < number_of_exceptions; i++) { str = constant_pool.getConstantString(exception_index_table[i], diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index f5371953..637dc5ee 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -166,7 +166,7 @@ public class LocalVariableTable extends Attribute { * @return String representation. */ public final String toString() { - StringBuffer buf = new StringBuffer(""); + StringBuffer buf = new StringBuffer(); for (int i = 0; i < local_variable_table_length; i++) { buf.append(local_variable_table[i].toString()); if (i < local_variable_table_length - 1) { diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index d68fc6af..e073654e 100755 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -106,7 +106,7 @@ public class LocalVariableTypeTable extends Attribute { * @return String representation. */ public final String toString() { - StringBuffer buf = new StringBuffer(""); + StringBuffer buf = new StringBuffer(); for(int i=0; i < local_variable_type_table_length; i++) { buf.append(local_variable_type_table[i].toString()); diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 0bba28d7..e6a9195a 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -626,7 +626,7 @@ public abstract class Utility { /** - * A return­type signature represents the return value from a method. + * A return�type signature represents the return value from a method. * It is a series of bytes in the following grammar: * * ::= | V @@ -1356,7 +1356,7 @@ public abstract class Utility { */ public static Attribute[] getAnnotationAttributes(ConstantPoolGen cp,List vec) { - if (vec.size()==0) return null; + if (vec.isEmpty()) return null; try { int countVisible = 0; diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 4e281bc0..700b1a24 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -205,7 +205,7 @@ public class ClassGen extends AccessFlags implements Cloneable { Field[] fields = getFields(); Method[] methods = getMethods(); Attribute[] attributes = null; - if (annotation_vec.size()==0) { + if (annotation_vec.isEmpty()) { attributes = getAttributes(); } else { // TODO: Sometime later, trash any attributes called 'RuntimeVisibleAnnotations' or 'RuntimeInvisibleAnnotations' -- GitLab From 1103df13edda48027f6b830209bfcb8e25ebca9a Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 01:23:30 +0000 Subject: [PATCH 0410/1313] AnnotationEntry needs to be serializable to support JavaClass being serializable git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826330 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/classfile/AnnotationEntry.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index d391af1e..60976b4d 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -19,18 +19,20 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; + import org.apache.bcel.Constants; /** * represents one annotation in the annotation table * * @version $Id: AnnotationEntry - * @author D. Brosius + * @author D. Brosius * @since 5.3 */ -public class AnnotationEntry implements Node, Constants { +public class AnnotationEntry implements Node, Constants, Serializable { private int type_index; private int num_element_value_pairs; -- GitLab From 269f12062ee35d9af8df1119aa32a21498fc8079 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 01:35:23 +0000 Subject: [PATCH 0411/1313] better exception messages git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826331 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/AnnotationElementValue.java | 2 +- .../java/org/apache/bcel/classfile/ArrayElementValue.java | 2 +- src/main/java/org/apache/bcel/classfile/Attribute.java | 2 +- .../java/org/apache/bcel/classfile/EnumElementValue.java | 2 +- .../java/org/apache/bcel/classfile/StackMapTableEntry.java | 6 +++--- .../org/apache/bcel/generic/AnnotationElementValueGen.java | 2 +- .../java/org/apache/bcel/generic/ArrayElementValueGen.java | 2 +- .../java/org/apache/bcel/generic/BranchInstruction.java | 2 +- .../java/org/apache/bcel/generic/EnumElementValueGen.java | 2 +- src/main/java/org/apache/bcel/generic/Instruction.java | 2 +- src/main/java/org/apache/bcel/generic/Select.java | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java index 361d5ea9..044540d4 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java @@ -14,7 +14,7 @@ public class AnnotationElementValue extends ElementValue super(type, cpool); if (type != ANNOTATION) throw new RuntimeException( - "Only element values of type annotation can be built with this ctor"); + "Only element values of type annotation can be built with this ctor - type specified: " + type); this.annotationEntry = annotationEntry; } diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java index f018d3d8..279a9ac3 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -27,7 +27,7 @@ public class ArrayElementValue extends ElementValue super(type, cpool); if (type != ARRAY) throw new RuntimeException( - "Only element values of type array can be built with this ctor"); + "Only element values of type array can be built with this ctor - type specified: " + type); this.evalues = datums; } diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index f4636ea0..5fdeaa43 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -212,7 +212,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable case Constants.ATTR_STACK_MAP_TABLE: return new StackMapTable(name_index, length, file, constant_pool); default: // Never reached - throw new IllegalStateException("Ooops! default case reached."); + throw new IllegalStateException("Unrecognized attribute type tag parsed: " + tag); } } diff --git a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java index 7a6bc244..bc80a9c3 100644 --- a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java @@ -17,7 +17,7 @@ public class EnumElementValue extends ElementValue super(type, cpool); if (type != ENUM_CONSTANT) throw new RuntimeException( - "Only element values of type enum can be built with this ctor"); + "Only element values of type enum can be built with this ctor - type specified: " + type); this.typeIdx = typeIdx; this.valueIdx = valueIdx; } diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index a56ff4cc..f569239a 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -25,7 +25,7 @@ import org.apache.bcel.Constants; /** * This class represents a stack map entry recording the types of * local variables and the the of stack items at a given byte code offset. - * See CLDC specification •À?5.3.1.2 + * See CLDC specification ��?5.3.1.2 * * @version $Id$ * @author M. Dahm @@ -88,7 +88,7 @@ public final class StackMapTableEntry implements Cloneable { } } else { /* Can't happen */ - throw new ClassFormatException ("Illegal Tag"); + throw new ClassFormatException ("Invalid frame type found while parsing stack map table: " + frame_type); } } @@ -140,7 +140,7 @@ public final class StackMapTableEntry implements Cloneable { } } else { /* Can't happen */ - throw new ClassFormatException ("Illegal Tag"); + throw new ClassFormatException ("Invalid Stack map table tag: " + frame_type); } } diff --git a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java index e4906d16..e14dc6d6 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java @@ -22,7 +22,7 @@ public class AnnotationElementValueGen extends ElementValueGen super(type, cpool); if (type != ANNOTATION) throw new RuntimeException( - "Only element values of type annotation can be built with this ctor"); + "Only element values of type annotation can be built with this ctor - type specified: " + type); this.a = annotation; } diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index 14b9432e..6aac1525 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -26,7 +26,7 @@ public class ArrayElementValueGen extends ElementValueGen super(type, cpool); if (type != ARRAY) throw new RuntimeException( - "Only element values of type array can be built with this ctor"); + "Only element values of type array can be built with this ctor - type specified: " + type); this.evalues = new ArrayList(); for (int i = 0; i < datums.length; i++) { diff --git a/src/main/java/org/apache/bcel/generic/BranchInstruction.java b/src/main/java/org/apache/bcel/generic/BranchInstruction.java index a0568d41..2141d9a9 100644 --- a/src/main/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/main/java/org/apache/bcel/generic/BranchInstruction.java @@ -62,7 +62,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi out.writeByte(opcode); index = getTargetOffset(); if (Math.abs(index) >= 32767) { - throw new ClassGenException("Branch target offset too large for short"); + throw new ClassGenException("Branch target offset too large for short: " + index); } out.writeShort(index); // May be negative, i.e., point backwards } diff --git a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java index a2f56870..9dde1163 100644 --- a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java @@ -24,7 +24,7 @@ public class EnumElementValueGen extends ElementValueGen super(ElementValueGen.ENUM_CONSTANT, cpool); if (type != ENUM_CONSTANT) throw new RuntimeException( - "Only element values of type enum can be built with this ctor"); + "Only element values of type enum can be built with this ctor - type specified: " + type); this.typeIdx = typeIdx; this.valueIdx = valueIdx; } diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index 1a6887ab..b64b980a 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -444,7 +444,7 @@ public abstract class Instruction implements Cloneable, Serializable { obj = new IMPDEP2(); break; default: - throw new ClassGenException("Illegal opcode detected."); + throw new ClassGenException("Illegal opcode detected: " + opcode); } diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index afe702eb..9b366dbb 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -66,7 +66,7 @@ public abstract class Select extends BranchInstruction implements VariableLength } this.match = match; if ((match_length = match.length) != targets.length) { - throw new ClassGenException("Match and target array have not the same length"); + throw new ClassGenException("Match and target array have not the same length: Match length: " + match.length + " Target length: " + targets.length); } indices = new int[match_length]; } -- GitLab From cfa9652aab757d82fdee3aef9c51f6be4139d68c Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 01:35:56 +0000 Subject: [PATCH 0412/1313] add INVOKEDYNAMIC git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826332 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 606d7c64..36d98cd4 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -851,6 +851,9 @@ public interface Constants { /** Java VM opcode. * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEINTERFACE = 185; + /** Java VM opcode. + * @see Opcode definitions in The Java Virtual Machine Specification */ + public static final short INVOKEDYNAMIC = 186; /** Java VM opcode. * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short NEW = 187; -- GitLab From 85e33264feba0ba9578b1ff2c011e2d3c421516f Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 01:42:19 +0000 Subject: [PATCH 0413/1313] update copyright dates git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826333 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/HelloWorldBuilder.java | 2 +- src/examples/JasminVisitor.java | 2 +- src/examples/Mini/ASCII_CharStream.java | 2 +- src/examples/Mini/ASTExpr.java | 2 +- src/examples/Mini/ASTFactor.java | 2 +- src/examples/Mini/ASTFunAppl.java | 2 +- src/examples/Mini/ASTFunDecl.java | 2 +- src/examples/Mini/ASTIdent.java | 2 +- src/examples/Mini/ASTIfExpr.java | 2 +- src/examples/Mini/ASTInteger.java | 2 +- src/examples/Mini/ASTLetExpr.java | 2 +- src/examples/Mini/ASTProgram.java | 2 +- src/examples/Mini/ASTTerm.java | 2 +- src/examples/Mini/EnvEntry.java | 2 +- src/examples/Mini/Environment.java | 2 +- src/examples/Mini/Function.java | 2 +- src/examples/Mini/JJTMiniParserState.java | 2 +- src/examples/Mini/MiniC.java | 2 +- src/examples/Mini/MiniParser.java | 2 +- src/examples/Mini/MiniParserConstants.java | 2 +- src/examples/Mini/MiniParserTokenManager.java | 2 +- src/examples/Mini/MiniParserTreeConstants.java | 2 +- src/examples/Mini/Node.java | 2 +- src/examples/Mini/ParseException.java | 2 +- src/examples/Mini/SimpleNode.java | 2 +- src/examples/Mini/Token.java | 2 +- src/examples/Mini/TokenMgrError.java | 2 +- src/examples/Mini/Variable.java | 2 +- src/examples/Package.java | 2 +- src/examples/Peephole.java | 2 +- src/examples/ProxyCreator.java | 2 +- src/examples/TransitiveHull.java | 2 +- src/examples/helloify.java | 2 +- src/examples/id.java | 2 +- src/examples/listclass.java | 2 +- src/examples/maxstack.java | 2 +- src/examples/patchclass.java | 2 +- src/main/java/org/apache/bcel/Constants.java | 2 +- .../org/apache/bcel/ExceptionConstants.java | 2 +- src/main/java/org/apache/bcel/Repository.java | 2 +- .../org/apache/bcel/classfile/AccessFlags.java | 2 +- .../bcel/classfile/AnnotationDefault.java | 2 +- .../apache/bcel/classfile/AnnotationEntry.java | 2 +- .../org/apache/bcel/classfile/Annotations.java | 2 +- .../org/apache/bcel/classfile/Attribute.java | 2 +- .../apache/bcel/classfile/AttributeReader.java | 2 +- .../bcel/classfile/ClassFormatException.java | 2 +- .../org/apache/bcel/classfile/ClassParser.java | 2 +- .../java/org/apache/bcel/classfile/Code.java | 2 +- .../apache/bcel/classfile/CodeException.java | 2 +- .../org/apache/bcel/classfile/Constant.java | 2 +- .../org/apache/bcel/classfile/ConstantCP.java | 2 +- .../apache/bcel/classfile/ConstantClass.java | 2 +- .../apache/bcel/classfile/ConstantDouble.java | 2 +- .../bcel/classfile/ConstantFieldref.java | 2 +- .../apache/bcel/classfile/ConstantFloat.java | 2 +- .../apache/bcel/classfile/ConstantInteger.java | 2 +- .../classfile/ConstantInterfaceMethodref.java | 2 +- .../apache/bcel/classfile/ConstantLong.java | 2 +- .../bcel/classfile/ConstantMethodref.java | 2 +- .../bcel/classfile/ConstantNameAndType.java | 2 +- .../apache/bcel/classfile/ConstantObject.java | 2 +- .../apache/bcel/classfile/ConstantPool.java | 2 +- .../apache/bcel/classfile/ConstantString.java | 2 +- .../apache/bcel/classfile/ConstantUtf8.java | 2 +- .../apache/bcel/classfile/ConstantValue.java | 2 +- .../org/apache/bcel/classfile/Deprecated.java | 2 +- .../bcel/classfile/DescendingVisitor.java | 2 +- .../apache/bcel/classfile/ElementValue.java | 2 +- .../bcel/classfile/ElementValuePair.java | 2 +- .../apache/bcel/classfile/EmptyVisitor.java | 2 +- .../apache/bcel/classfile/ExceptionTable.java | 2 +- .../java/org/apache/bcel/classfile/Field.java | 2 +- .../apache/bcel/classfile/FieldOrMethod.java | 2 +- .../org/apache/bcel/classfile/InnerClass.java | 2 +- .../apache/bcel/classfile/InnerClasses.java | 2 +- .../org/apache/bcel/classfile/JavaClass.java | 2 +- .../org/apache/bcel/classfile/LineNumber.java | 2 +- .../apache/bcel/classfile/LineNumberTable.java | 2 +- .../apache/bcel/classfile/LocalVariable.java | 2 +- .../bcel/classfile/LocalVariableTable.java | 2 +- .../java/org/apache/bcel/classfile/Method.java | 2 +- .../java/org/apache/bcel/classfile/Node.java | 2 +- .../org/apache/bcel/classfile/PMGClass.java | 2 +- .../classfile/ParameterAnnotationEntry.java | 2 +- .../bcel/classfile/ParameterAnnotations.java | 2 +- .../classfile/RuntimeInvisibleAnnotations.java | 2 +- .../RuntimeInvisibleParameterAnnotations.java | 2 +- .../classfile/RuntimeVisibleAnnotations.java | 2 +- .../RuntimeVisibleParameterAnnotations.java | 2 +- .../org/apache/bcel/classfile/Signature.java | 2 +- .../bcel/classfile/SimpleElementValue.java | 2 +- .../org/apache/bcel/classfile/SourceFile.java | 2 +- .../org/apache/bcel/classfile/StackMap.java | 4 ++-- .../apache/bcel/classfile/StackMapEntry.java | 4 ++-- .../apache/bcel/classfile/StackMapTable.java | 4 ++-- .../bcel/classfile/StackMapTableEntry.java | 2 +- .../apache/bcel/classfile/StackMapType.java | 2 +- .../org/apache/bcel/classfile/Synthetic.java | 2 +- .../org/apache/bcel/classfile/Unknown.java | 2 +- .../org/apache/bcel/classfile/Utility.java | 2 +- .../org/apache/bcel/classfile/Visitor.java | 2 +- .../java/org/apache/bcel/generic/AALOAD.java | 2 +- .../java/org/apache/bcel/generic/AASTORE.java | 2 +- .../org/apache/bcel/generic/ACONST_NULL.java | 2 +- .../java/org/apache/bcel/generic/ALOAD.java | 2 +- .../org/apache/bcel/generic/ANEWARRAY.java | 2 +- .../java/org/apache/bcel/generic/ARETURN.java | 2 +- .../org/apache/bcel/generic/ARRAYLENGTH.java | 2 +- .../java/org/apache/bcel/generic/ASTORE.java | 2 +- .../java/org/apache/bcel/generic/ATHROW.java | 2 +- .../bcel/generic/AllocationInstruction.java | 2 +- .../bcel/generic/ArithmeticInstruction.java | 2 +- .../apache/bcel/generic/ArrayInstruction.java | 2 +- .../org/apache/bcel/generic/ArrayType.java | 2 +- .../java/org/apache/bcel/generic/BALOAD.java | 2 +- .../java/org/apache/bcel/generic/BASTORE.java | 2 +- .../java/org/apache/bcel/generic/BIPUSH.java | 2 +- .../org/apache/bcel/generic/BREAKPOINT.java | 2 +- .../org/apache/bcel/generic/BasicType.java | 2 +- .../org/apache/bcel/generic/BranchHandle.java | 2 +- .../apache/bcel/generic/BranchInstruction.java | 2 +- .../java/org/apache/bcel/generic/CALOAD.java | 2 +- .../java/org/apache/bcel/generic/CASTORE.java | 2 +- .../org/apache/bcel/generic/CHECKCAST.java | 2 +- .../org/apache/bcel/generic/CPInstruction.java | 2 +- .../java/org/apache/bcel/generic/ClassGen.java | 2 +- .../apache/bcel/generic/ClassGenException.java | 2 +- .../org/apache/bcel/generic/ClassObserver.java | 2 +- .../apache/bcel/generic/CodeExceptionGen.java | 2 +- .../bcel/generic/CompoundInstruction.java | 2 +- .../apache/bcel/generic/ConstantPoolGen.java | 2 +- .../bcel/generic/ConstantPushInstruction.java | 2 +- .../bcel/generic/ConversionInstruction.java | 2 +- src/main/java/org/apache/bcel/generic/D2F.java | 2 +- src/main/java/org/apache/bcel/generic/D2I.java | 2 +- src/main/java/org/apache/bcel/generic/D2L.java | 2 +- .../java/org/apache/bcel/generic/DADD.java | 2 +- .../java/org/apache/bcel/generic/DALOAD.java | 2 +- .../java/org/apache/bcel/generic/DASTORE.java | 2 +- .../java/org/apache/bcel/generic/DCMPG.java | 2 +- .../java/org/apache/bcel/generic/DCMPL.java | 2 +- .../java/org/apache/bcel/generic/DCONST.java | 2 +- .../java/org/apache/bcel/generic/DDIV.java | 2 +- .../java/org/apache/bcel/generic/DLOAD.java | 2 +- .../java/org/apache/bcel/generic/DMUL.java | 2 +- .../java/org/apache/bcel/generic/DNEG.java | 2 +- .../java/org/apache/bcel/generic/DREM.java | 2 +- .../java/org/apache/bcel/generic/DRETURN.java | 2 +- .../java/org/apache/bcel/generic/DSTORE.java | 2 +- .../java/org/apache/bcel/generic/DSUB.java | 2 +- src/main/java/org/apache/bcel/generic/DUP.java | 2 +- .../java/org/apache/bcel/generic/DUP2.java | 2 +- .../java/org/apache/bcel/generic/DUP2_X1.java | 2 +- .../java/org/apache/bcel/generic/DUP2_X2.java | 2 +- .../java/org/apache/bcel/generic/DUP_X1.java | 2 +- .../java/org/apache/bcel/generic/DUP_X2.java | 2 +- .../org/apache/bcel/generic/EmptyVisitor.java | 2 +- .../apache/bcel/generic/ExceptionThrower.java | 2 +- src/main/java/org/apache/bcel/generic/F2D.java | 2 +- src/main/java/org/apache/bcel/generic/F2I.java | 2 +- src/main/java/org/apache/bcel/generic/F2L.java | 2 +- .../java/org/apache/bcel/generic/FADD.java | 2 +- .../java/org/apache/bcel/generic/FALOAD.java | 2 +- .../java/org/apache/bcel/generic/FASTORE.java | 2 +- .../java/org/apache/bcel/generic/FCMPG.java | 2 +- .../java/org/apache/bcel/generic/FCMPL.java | 2 +- .../java/org/apache/bcel/generic/FCONST.java | 2 +- .../java/org/apache/bcel/generic/FDIV.java | 2 +- .../java/org/apache/bcel/generic/FLOAD.java | 2 +- .../java/org/apache/bcel/generic/FMUL.java | 2 +- .../java/org/apache/bcel/generic/FNEG.java | 2 +- .../java/org/apache/bcel/generic/FREM.java | 2 +- .../java/org/apache/bcel/generic/FRETURN.java | 2 +- .../java/org/apache/bcel/generic/FSTORE.java | 2 +- .../java/org/apache/bcel/generic/FSUB.java | 2 +- .../java/org/apache/bcel/generic/FieldGen.java | 2 +- .../bcel/generic/FieldGenOrMethodGen.java | 2 +- .../apache/bcel/generic/FieldInstruction.java | 2 +- .../org/apache/bcel/generic/FieldObserver.java | 2 +- .../org/apache/bcel/generic/FieldOrMethod.java | 2 +- .../java/org/apache/bcel/generic/GETFIELD.java | 2 +- .../org/apache/bcel/generic/GETSTATIC.java | 2 +- .../java/org/apache/bcel/generic/GOTO.java | 2 +- .../java/org/apache/bcel/generic/GOTO_W.java | 2 +- .../apache/bcel/generic/GotoInstruction.java | 2 +- src/main/java/org/apache/bcel/generic/I2B.java | 2 +- src/main/java/org/apache/bcel/generic/I2C.java | 2 +- src/main/java/org/apache/bcel/generic/I2D.java | 2 +- src/main/java/org/apache/bcel/generic/I2F.java | 2 +- src/main/java/org/apache/bcel/generic/I2L.java | 2 +- src/main/java/org/apache/bcel/generic/I2S.java | 2 +- .../java/org/apache/bcel/generic/IADD.java | 2 +- .../java/org/apache/bcel/generic/IALOAD.java | 2 +- .../java/org/apache/bcel/generic/IAND.java | 2 +- .../java/org/apache/bcel/generic/IASTORE.java | 2 +- .../java/org/apache/bcel/generic/ICONST.java | 2 +- .../java/org/apache/bcel/generic/IDIV.java | 2 +- .../java/org/apache/bcel/generic/IFEQ.java | 2 +- .../java/org/apache/bcel/generic/IFGE.java | 2 +- .../java/org/apache/bcel/generic/IFGT.java | 2 +- .../java/org/apache/bcel/generic/IFLE.java | 2 +- .../java/org/apache/bcel/generic/IFLT.java | 2 +- .../java/org/apache/bcel/generic/IFNE.java | 2 +- .../org/apache/bcel/generic/IFNONNULL.java | 2 +- .../java/org/apache/bcel/generic/IFNULL.java | 2 +- .../org/apache/bcel/generic/IF_ACMPEQ.java | 2 +- .../org/apache/bcel/generic/IF_ACMPNE.java | 2 +- .../org/apache/bcel/generic/IF_ICMPEQ.java | 2 +- .../org/apache/bcel/generic/IF_ICMPGE.java | 2 +- .../org/apache/bcel/generic/IF_ICMPGT.java | 2 +- .../org/apache/bcel/generic/IF_ICMPLE.java | 2 +- .../org/apache/bcel/generic/IF_ICMPLT.java | 2 +- .../org/apache/bcel/generic/IF_ICMPNE.java | 2 +- .../java/org/apache/bcel/generic/IINC.java | 2 +- .../java/org/apache/bcel/generic/ILOAD.java | 2 +- .../java/org/apache/bcel/generic/IMPDEP1.java | 2 +- .../java/org/apache/bcel/generic/IMPDEP2.java | 2 +- .../java/org/apache/bcel/generic/IMUL.java | 2 +- .../java/org/apache/bcel/generic/INEG.java | 2 +- .../org/apache/bcel/generic/INSTANCEOF.java | 2 +- .../apache/bcel/generic/INVOKEINTERFACE.java | 2 +- .../org/apache/bcel/generic/INVOKESPECIAL.java | 2 +- .../org/apache/bcel/generic/INVOKESTATIC.java | 2 +- .../org/apache/bcel/generic/INVOKEVIRTUAL.java | 2 +- src/main/java/org/apache/bcel/generic/IOR.java | 2 +- .../java/org/apache/bcel/generic/IREM.java | 2 +- .../java/org/apache/bcel/generic/IRETURN.java | 2 +- .../java/org/apache/bcel/generic/ISHL.java | 2 +- .../java/org/apache/bcel/generic/ISHR.java | 2 +- .../java/org/apache/bcel/generic/ISTORE.java | 2 +- .../java/org/apache/bcel/generic/ISUB.java | 2 +- .../java/org/apache/bcel/generic/IUSHR.java | 2 +- .../java/org/apache/bcel/generic/IXOR.java | 2 +- .../org/apache/bcel/generic/IfInstruction.java | 2 +- .../bcel/generic/IndexedInstruction.java | 2 +- .../org/apache/bcel/generic/Instruction.java | 2 +- .../bcel/generic/InstructionComparator.java | 2 +- .../bcel/generic/InstructionConstants.java | 2 +- .../bcel/generic/InstructionFactory.java | 2 +- .../apache/bcel/generic/InstructionHandle.java | 2 +- .../apache/bcel/generic/InstructionList.java | 2 +- .../bcel/generic/InstructionListObserver.java | 2 +- .../bcel/generic/InstructionTargeter.java | 2 +- .../apache/bcel/generic/InvokeInstruction.java | 2 +- src/main/java/org/apache/bcel/generic/JSR.java | 2 +- .../java/org/apache/bcel/generic/JSR_W.java | 2 +- .../apache/bcel/generic/JsrInstruction.java | 2 +- src/main/java/org/apache/bcel/generic/L2D.java | 2 +- src/main/java/org/apache/bcel/generic/L2F.java | 2 +- src/main/java/org/apache/bcel/generic/L2I.java | 2 +- .../java/org/apache/bcel/generic/LADD.java | 2 +- .../java/org/apache/bcel/generic/LALOAD.java | 2 +- .../java/org/apache/bcel/generic/LAND.java | 2 +- .../java/org/apache/bcel/generic/LASTORE.java | 2 +- .../java/org/apache/bcel/generic/LCMP.java | 2 +- .../java/org/apache/bcel/generic/LCONST.java | 2 +- src/main/java/org/apache/bcel/generic/LDC.java | 2 +- .../java/org/apache/bcel/generic/LDC2_W.java | 2 +- .../java/org/apache/bcel/generic/LDC_W.java | 2 +- .../java/org/apache/bcel/generic/LDIV.java | 2 +- .../java/org/apache/bcel/generic/LLOAD.java | 2 +- .../java/org/apache/bcel/generic/LMUL.java | 2 +- .../java/org/apache/bcel/generic/LNEG.java | 2 +- .../org/apache/bcel/generic/LOOKUPSWITCH.java | 2 +- src/main/java/org/apache/bcel/generic/LOR.java | 2 +- .../java/org/apache/bcel/generic/LREM.java | 2 +- .../java/org/apache/bcel/generic/LRETURN.java | 2 +- .../java/org/apache/bcel/generic/LSHL.java | 2 +- .../java/org/apache/bcel/generic/LSHR.java | 2 +- .../java/org/apache/bcel/generic/LSTORE.java | 2 +- .../java/org/apache/bcel/generic/LSUB.java | 2 +- .../java/org/apache/bcel/generic/LUSHR.java | 2 +- .../java/org/apache/bcel/generic/LXOR.java | 2 +- .../org/apache/bcel/generic/LineNumberGen.java | 2 +- .../org/apache/bcel/generic/LoadClass.java | 2 +- .../apache/bcel/generic/LoadInstruction.java | 2 +- .../apache/bcel/generic/LocalVariableGen.java | 2 +- .../bcel/generic/LocalVariableInstruction.java | 2 +- .../org/apache/bcel/generic/MONITORENTER.java | 2 +- .../org/apache/bcel/generic/MONITOREXIT.java | 2 +- .../apache/bcel/generic/MULTIANEWARRAY.java | 2 +- .../org/apache/bcel/generic/MethodGen.java | 2 +- .../apache/bcel/generic/MethodObserver.java | 2 +- src/main/java/org/apache/bcel/generic/NEW.java | 2 +- .../java/org/apache/bcel/generic/NEWARRAY.java | 2 +- src/main/java/org/apache/bcel/generic/NOP.java | 2 +- .../org/apache/bcel/generic/NamedAndTyped.java | 2 +- .../org/apache/bcel/generic/ObjectType.java | 4 ++-- src/main/java/org/apache/bcel/generic/POP.java | 2 +- .../java/org/apache/bcel/generic/POP2.java | 2 +- .../java/org/apache/bcel/generic/PUSH.java | 2 +- .../java/org/apache/bcel/generic/PUTFIELD.java | 2 +- .../org/apache/bcel/generic/PUTSTATIC.java | 2 +- .../apache/bcel/generic/PopInstruction.java | 2 +- .../apache/bcel/generic/PushInstruction.java | 2 +- src/main/java/org/apache/bcel/generic/RET.java | 2 +- .../java/org/apache/bcel/generic/RETURN.java | 2 +- .../org/apache/bcel/generic/ReferenceType.java | 18 +++++++++--------- .../apache/bcel/generic/ReturnInstruction.java | 2 +- .../apache/bcel/generic/ReturnaddressType.java | 4 ++-- .../java/org/apache/bcel/generic/SALOAD.java | 2 +- .../java/org/apache/bcel/generic/SASTORE.java | 2 +- .../java/org/apache/bcel/generic/SIPUSH.java | 2 +- .../java/org/apache/bcel/generic/SWAP.java | 2 +- .../java/org/apache/bcel/generic/SWITCH.java | 2 +- .../java/org/apache/bcel/generic/Select.java | 2 +- .../org/apache/bcel/generic/StackConsumer.java | 2 +- .../apache/bcel/generic/StackInstruction.java | 2 +- .../org/apache/bcel/generic/StackProducer.java | 2 +- .../apache/bcel/generic/StoreInstruction.java | 2 +- .../org/apache/bcel/generic/TABLESWITCH.java | 2 +- .../bcel/generic/TargetLostException.java | 2 +- .../java/org/apache/bcel/generic/Type.java | 2 +- .../apache/bcel/generic/TypedInstruction.java | 2 +- .../bcel/generic/UnconditionalBranch.java | 2 +- .../generic/VariableLengthInstruction.java | 2 +- .../java/org/apache/bcel/generic/Visitor.java | 2 +- .../org/apache/bcel/util/AttributeHTML.java | 2 +- .../org/apache/bcel/util/BCELComparator.java | 2 +- .../java/org/apache/bcel/util/BCELFactory.java | 2 +- .../java/org/apache/bcel/util/BCELifier.java | 2 +- .../org/apache/bcel/util/ByteSequence.java | 2 +- .../java/org/apache/bcel/util/Class2HTML.java | 4 ++-- .../java/org/apache/bcel/util/ClassLoader.java | 2 +- .../bcel/util/ClassLoaderRepository.java | 2 +- .../java/org/apache/bcel/util/ClassPath.java | 2 +- .../java/org/apache/bcel/util/ClassQueue.java | 2 +- .../java/org/apache/bcel/util/ClassSet.java | 2 +- .../java/org/apache/bcel/util/ClassStack.java | 2 +- .../java/org/apache/bcel/util/ClassVector.java | 2 +- .../java/org/apache/bcel/util/CodeHTML.java | 2 +- .../org/apache/bcel/util/ConstantHTML.java | 2 +- .../apache/bcel/util/InstructionFinder.java | 2 +- .../java/org/apache/bcel/util/JavaWrapper.java | 2 +- .../java/org/apache/bcel/util/MethodHTML.java | 2 +- .../java/org/apache/bcel/util/Repository.java | 2 +- .../apache/bcel/util/SyntheticRepository.java | 2 +- .../bcel/verifier/GraphicalVerifier.java | 6 +++--- .../apache/bcel/verifier/NativeVerifier.java | 2 +- .../org/apache/bcel/verifier/PassVerifier.java | 2 +- .../apache/bcel/verifier/TransitiveHull.java | 2 +- .../bcel/verifier/VerificationResult.java | 2 +- .../org/apache/bcel/verifier/Verifier.java | 2 +- .../apache/bcel/verifier/VerifierAppFrame.java | 2 +- .../apache/bcel/verifier/VerifierFactory.java | 2 +- .../verifier/VerifierFactoryListModel.java | 2 +- .../bcel/verifier/VerifierFactoryObserver.java | 2 +- .../org/apache/bcel/verifier/VerifyDialog.java | 2 +- .../exc/AssertionViolatedException.java | 2 +- .../verifier/exc/ClassConstraintException.java | 2 +- .../verifier/exc/CodeConstraintException.java | 2 +- .../verifier/exc/InvalidMethodException.java | 2 +- .../exc/LinkingConstraintException.java | 2 +- .../bcel/verifier/exc/LoadingException.java | 2 +- ...LocalVariableInfoInconsistentException.java | 2 +- .../exc/StaticCodeConstraintException.java | 2 +- ...aticCodeInstructionConstraintException.java | 2 +- ...eInstructionOperandConstraintException.java | 2 +- .../exc/StructuralCodeConstraintException.java | 2 +- .../org/apache/bcel/verifier/exc/Utility.java | 2 +- .../verifier/exc/VerificationException.java | 2 +- .../VerifierConstraintViolatedException.java | 2 +- .../bcel/verifier/statics/DOUBLE_Upper.java | 2 +- .../apache/bcel/verifier/statics/IntList.java | 2 +- .../bcel/verifier/statics/LONG_Upper.java | 2 +- .../verifier/statics/LocalVariableInfo.java | 2 +- .../verifier/statics/LocalVariablesInfo.java | 2 +- .../bcel/verifier/statics/Pass1Verifier.java | 2 +- .../bcel/verifier/statics/Pass2Verifier.java | 2 +- .../bcel/verifier/statics/Pass3aVerifier.java | 2 +- .../verifier/statics/StringRepresentation.java | 2 +- .../verifier/structurals/ControlFlowGraph.java | 2 +- .../verifier/structurals/ExceptionHandler.java | 2 +- .../structurals/ExceptionHandlers.java | 2 +- .../verifier/structurals/ExecutionVisitor.java | 2 +- .../bcel/verifier/structurals/Frame.java | 2 +- .../verifier/structurals/GenericArray.java | 2 +- .../structurals/InstConstraintVisitor.java | 2 +- .../structurals/InstructionContext.java | 2 +- .../verifier/structurals/LocalVariables.java | 2 +- .../verifier/structurals/OperandStack.java | 2 +- .../verifier/structurals/Pass3bVerifier.java | 2 +- .../bcel/verifier/structurals/Subroutine.java | 2 +- .../bcel/verifier/structurals/Subroutines.java | 2 +- .../structurals/UninitializedObjectType.java | 2 +- src/test/java/org/apache/bcel/NanoTimer.java | 2 +- .../java/org/apache/bcel/PerformanceTest.java | 2 +- 388 files changed, 404 insertions(+), 404 deletions(-) diff --git a/src/examples/HelloWorldBuilder.java b/src/examples/HelloWorldBuilder.java index 44665775..12d74f41 100644 --- a/src/examples/HelloWorldBuilder.java +++ b/src/examples/HelloWorldBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/JasminVisitor.java b/src/examples/JasminVisitor.java index 222e8643..fd89008f 100644 --- a/src/examples/JasminVisitor.java +++ b/src/examples/JasminVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/ASCII_CharStream.java b/src/examples/Mini/ASCII_CharStream.java index 529ee479..5d01b5d3 100644 --- a/src/examples/Mini/ASCII_CharStream.java +++ b/src/examples/Mini/ASCII_CharStream.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/ASTExpr.java b/src/examples/Mini/ASTExpr.java index f256bf15..e3bd992e 100644 --- a/src/examples/Mini/ASTExpr.java +++ b/src/examples/Mini/ASTExpr.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/ASTFactor.java b/src/examples/Mini/ASTFactor.java index ea0a23ee..cdf1cb8d 100644 --- a/src/examples/Mini/ASTFactor.java +++ b/src/examples/Mini/ASTFactor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/ASTFunAppl.java b/src/examples/Mini/ASTFunAppl.java index d1f1b7d5..8c7b0438 100644 --- a/src/examples/Mini/ASTFunAppl.java +++ b/src/examples/Mini/ASTFunAppl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java index b90fddcc..ac04b47f 100644 --- a/src/examples/Mini/ASTFunDecl.java +++ b/src/examples/Mini/ASTFunDecl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/ASTIdent.java b/src/examples/Mini/ASTIdent.java index 33332256..6a504f43 100644 --- a/src/examples/Mini/ASTIdent.java +++ b/src/examples/Mini/ASTIdent.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/ASTIfExpr.java b/src/examples/Mini/ASTIfExpr.java index 931e7426..790d6b84 100644 --- a/src/examples/Mini/ASTIfExpr.java +++ b/src/examples/Mini/ASTIfExpr.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/ASTInteger.java b/src/examples/Mini/ASTInteger.java index 008f9f12..1402473e 100644 --- a/src/examples/Mini/ASTInteger.java +++ b/src/examples/Mini/ASTInteger.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/ASTLetExpr.java b/src/examples/Mini/ASTLetExpr.java index bd1716eb..2e6a2f6e 100644 --- a/src/examples/Mini/ASTLetExpr.java +++ b/src/examples/Mini/ASTLetExpr.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java index d8bfc166..ef089fda 100644 --- a/src/examples/Mini/ASTProgram.java +++ b/src/examples/Mini/ASTProgram.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/ASTTerm.java b/src/examples/Mini/ASTTerm.java index ea3d558e..c286fc6b 100644 --- a/src/examples/Mini/ASTTerm.java +++ b/src/examples/Mini/ASTTerm.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/EnvEntry.java b/src/examples/Mini/EnvEntry.java index dba1a59a..76f270a1 100644 --- a/src/examples/Mini/EnvEntry.java +++ b/src/examples/Mini/EnvEntry.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/Environment.java b/src/examples/Mini/Environment.java index 7d932bad..b4ae95f3 100644 --- a/src/examples/Mini/Environment.java +++ b/src/examples/Mini/Environment.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/Function.java b/src/examples/Mini/Function.java index f61f9dd6..c3b740ba 100644 --- a/src/examples/Mini/Function.java +++ b/src/examples/Mini/Function.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/JJTMiniParserState.java b/src/examples/Mini/JJTMiniParserState.java index b0218878..ec027960 100644 --- a/src/examples/Mini/JJTMiniParserState.java +++ b/src/examples/Mini/JJTMiniParserState.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/MiniC.java b/src/examples/Mini/MiniC.java index b6fc084f..8ab42d39 100644 --- a/src/examples/Mini/MiniC.java +++ b/src/examples/Mini/MiniC.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/MiniParser.java b/src/examples/Mini/MiniParser.java index 554c0283..52bfddec 100644 --- a/src/examples/Mini/MiniParser.java +++ b/src/examples/Mini/MiniParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/MiniParserConstants.java b/src/examples/Mini/MiniParserConstants.java index 632543de..0a4c6c38 100644 --- a/src/examples/Mini/MiniParserConstants.java +++ b/src/examples/Mini/MiniParserConstants.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/MiniParserTokenManager.java b/src/examples/Mini/MiniParserTokenManager.java index 2454034f..cd43f966 100644 --- a/src/examples/Mini/MiniParserTokenManager.java +++ b/src/examples/Mini/MiniParserTokenManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/MiniParserTreeConstants.java b/src/examples/Mini/MiniParserTreeConstants.java index ae3d66cd..76ae9624 100644 --- a/src/examples/Mini/MiniParserTreeConstants.java +++ b/src/examples/Mini/MiniParserTreeConstants.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/Node.java b/src/examples/Mini/Node.java index 27740c14..a73987ac 100644 --- a/src/examples/Mini/Node.java +++ b/src/examples/Mini/Node.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/ParseException.java b/src/examples/Mini/ParseException.java index 43fb346f..7ebe8ea6 100644 --- a/src/examples/Mini/ParseException.java +++ b/src/examples/Mini/ParseException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/SimpleNode.java b/src/examples/Mini/SimpleNode.java index bfd100ac..7356482c 100644 --- a/src/examples/Mini/SimpleNode.java +++ b/src/examples/Mini/SimpleNode.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/Token.java b/src/examples/Mini/Token.java index 22e19429..34770fde 100644 --- a/src/examples/Mini/Token.java +++ b/src/examples/Mini/Token.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/TokenMgrError.java b/src/examples/Mini/TokenMgrError.java index 883d9b9b..ce84c40f 100644 --- a/src/examples/Mini/TokenMgrError.java +++ b/src/examples/Mini/TokenMgrError.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Mini/Variable.java b/src/examples/Mini/Variable.java index 36a655cd..38158434 100644 --- a/src/examples/Mini/Variable.java +++ b/src/examples/Mini/Variable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Package.java b/src/examples/Package.java index 010bae39..c58f0163 100644 --- a/src/examples/Package.java +++ b/src/examples/Package.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/Peephole.java b/src/examples/Peephole.java index 66bb9933..4e10e720 100644 --- a/src/examples/Peephole.java +++ b/src/examples/Peephole.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/ProxyCreator.java b/src/examples/ProxyCreator.java index dc136aab..e6ffc9be 100644 --- a/src/examples/ProxyCreator.java +++ b/src/examples/ProxyCreator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/TransitiveHull.java b/src/examples/TransitiveHull.java index a6d7feb9..d3eb0bf7 100644 --- a/src/examples/TransitiveHull.java +++ b/src/examples/TransitiveHull.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/helloify.java b/src/examples/helloify.java index 7cb7d209..ed70c896 100644 --- a/src/examples/helloify.java +++ b/src/examples/helloify.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/id.java b/src/examples/id.java index 8280f15e..e251940c 100644 --- a/src/examples/id.java +++ b/src/examples/id.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/listclass.java b/src/examples/listclass.java index 829f26ea..a83304e1 100644 --- a/src/examples/listclass.java +++ b/src/examples/listclass.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/maxstack.java b/src/examples/maxstack.java index 72d16d33..065bcf24 100644 --- a/src/examples/maxstack.java +++ b/src/examples/maxstack.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/examples/patchclass.java b/src/examples/patchclass.java index 87ba3a22..5ca18e85 100644 --- a/src/examples/patchclass.java +++ b/src/examples/patchclass.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 36d98cd4..7ceb2475 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/ExceptionConstants.java b/src/main/java/org/apache/bcel/ExceptionConstants.java index 4f59ead2..8ae79aa6 100644 --- a/src/main/java/org/apache/bcel/ExceptionConstants.java +++ b/src/main/java/org/apache/bcel/ExceptionConstants.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/Repository.java b/src/main/java/org/apache/bcel/Repository.java index e3ae5ed9..85d05db3 100644 --- a/src/main/java/org/apache/bcel/Repository.java +++ b/src/main/java/org/apache/bcel/Repository.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/AccessFlags.java b/src/main/java/org/apache/bcel/classfile/AccessFlags.java index 19402109..3e4465f6 100644 --- a/src/main/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/main/java/org/apache/bcel/classfile/AccessFlags.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index cea14af9..7ef0136f 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 60976b4d..1c9feeb3 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index 4aaf1e91..10bb2794 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 5fdeaa43..d243ae69 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/AttributeReader.java b/src/main/java/org/apache/bcel/classfile/AttributeReader.java index 65267e70..47cf41f8 100644 --- a/src/main/java/org/apache/bcel/classfile/AttributeReader.java +++ b/src/main/java/org/apache/bcel/classfile/AttributeReader.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java index 523982ec..b0236ea9 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java +++ b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 0d6f20c3..7b9c00fa 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java index bad70a37..6268b992 100644 --- a/src/main/java/org/apache/bcel/classfile/Code.java +++ b/src/main/java/org/apache/bcel/classfile/Code.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/CodeException.java b/src/main/java/org/apache/bcel/classfile/CodeException.java index 22baa792..4a56ed34 100644 --- a/src/main/java/org/apache/bcel/classfile/CodeException.java +++ b/src/main/java/org/apache/bcel/classfile/CodeException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index 17b1db8d..f200d24b 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantCP.java b/src/main/java/org/apache/bcel/classfile/ConstantCP.java index beac074e..e7014c78 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantCP.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantClass.java b/src/main/java/org/apache/bcel/classfile/ConstantClass.java index a77798c9..67326d08 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantClass.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java index 3a56e52b..9b9b19de 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java index d9b68882..33a225c3 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java index e170c89c..b9db5810 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java index 2757e0c3..ae8edd2d 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java index 57d11c50..c1cf691f 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantLong.java b/src/main/java/org/apache/bcel/classfile/ConstantLong.java index 98225262..b361a4ae 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantLong.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java index e9ce4eb9..a493a7e4 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java index 1cef96f0..5e1f4d56 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantObject.java b/src/main/java/org/apache/bcel/classfile/ConstantObject.java index 1465bb67..67fe2662 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantObject.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantObject.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index 8c666cf9..7d6accbc 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantString.java b/src/main/java/org/apache/bcel/classfile/ConstantString.java index dd931b7f..97c27b02 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantString.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index f1c59ce2..3c650444 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantValue.java b/src/main/java/org/apache/bcel/classfile/ConstantValue.java index c253f775..baf2d868 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantValue.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Deprecated.java b/src/main/java/org/apache/bcel/classfile/Deprecated.java index e38a373f..b3ceeae1 100644 --- a/src/main/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/main/java/org/apache/bcel/classfile/Deprecated.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index e26dd7cc..5a715643 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index ad1d8a07..e9b1cde6 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index 555ca315..5caf729f 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java index da31cd5a..3be648aa 100644 --- a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java index 9487b659..421f69db 100644 --- a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java index 29db8a42..9d6bec0e 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/bcel/classfile/Field.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index 67098402..8542ee8b 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/InnerClass.java b/src/main/java/org/apache/bcel/classfile/InnerClass.java index 9c80eaa5..5417a7b8 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClass.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/InnerClasses.java b/src/main/java/org/apache/bcel/classfile/InnerClasses.java index 34a7a7e0..ea73d994 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClasses.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index deb37051..48361dec 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/LineNumber.java b/src/main/java/org/apache/bcel/classfile/LineNumber.java index 01bd1ed5..c9dd8043 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumber.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java index d4513add..395859df 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java index ab69e6e7..3d6073b0 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index 637dc5ee..a1ecab3c 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index e5368d6c..10a274c0 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Node.java b/src/main/java/org/apache/bcel/classfile/Node.java index c1fa8d9b..fb176de8 100644 --- a/src/main/java/org/apache/bcel/classfile/Node.java +++ b/src/main/java/org/apache/bcel/classfile/Node.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java index 68fa289d..802d7d14 100644 --- a/src/main/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/main/java/org/apache/bcel/classfile/PMGClass.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index 8ff27059..0371af06 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index 68660081..9f93f666 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 804c5652..d0ae379d 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index d42ed525..1ed4dd27 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index a9474ca8..0967b7cf 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index d17e7fce..9a0da981 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index fc6bc3d8..e774980a 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java index 2a54e4f1..db201be6 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java index 6645996a..90d43ae0 100644 --- a/src/main/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/main/java/org/apache/bcel/classfile/SourceFile.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java index c6f8ae56..d4e4d4be 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMap.java +++ b/src/main/java/org/apache/bcel/classfile/StackMap.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ import org.apache.bcel.Constants; * (J2ME). This attribute is used by the KVM and contained * within the Code attribute of a method. See CLDC specification - * §5.3.1.2 + * �5.3.1.2 * * @version $Id$ * @author M. Dahm diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index fbf22d32..1a14e938 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,7 @@ import java.io.IOException; /** * This class represents a stack map entry recording the types of * local variables and the the of stack items at a given byte code offset. - * See CLDC specification §5.3.1.2 + * See CLDC specification �5.3.1.2 * * @version $Id$ * @author M. Dahm diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTable.java b/src/main/java/org/apache/bcel/classfile/StackMapTable.java index 3215796f..4f3f2424 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTable.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ import org.apache.bcel.Constants; * (J2ME). This attribute is used by the KVM and contained * within the Code attribute of a method. See CLDC specification - * •À?5.3.1.2 + * ��?5.3.1.2 * * @version $Id$ * @author M. Dahm diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index f569239a..bfa79982 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/StackMapType.java b/src/main/java/org/apache/bcel/classfile/StackMapType.java index 63d42296..3408491e 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Synthetic.java b/src/main/java/org/apache/bcel/classfile/Synthetic.java index 3f24d392..65d8a5a4 100644 --- a/src/main/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/main/java/org/apache/bcel/classfile/Synthetic.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index 0d7825bc..a726d9ca 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index e6a9195a..d03cf63e 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java index 175390be..8a87a4c4 100644 --- a/src/main/java/org/apache/bcel/classfile/Visitor.java +++ b/src/main/java/org/apache/bcel/classfile/Visitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/AALOAD.java b/src/main/java/org/apache/bcel/generic/AALOAD.java index 31e0a48a..8bf158f9 100644 --- a/src/main/java/org/apache/bcel/generic/AALOAD.java +++ b/src/main/java/org/apache/bcel/generic/AALOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/AASTORE.java b/src/main/java/org/apache/bcel/generic/AASTORE.java index ac8a1ba3..cb0b7c2f 100644 --- a/src/main/java/org/apache/bcel/generic/AASTORE.java +++ b/src/main/java/org/apache/bcel/generic/AASTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java index 58e93906..5622ef12 100644 --- a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java +++ b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ALOAD.java b/src/main/java/org/apache/bcel/generic/ALOAD.java index 06d86284..7b20bd17 100644 --- a/src/main/java/org/apache/bcel/generic/ALOAD.java +++ b/src/main/java/org/apache/bcel/generic/ALOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java index b0ce51c4..388e46ed 100644 --- a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ARETURN.java b/src/main/java/org/apache/bcel/generic/ARETURN.java index deb57f45..a77069d3 100644 --- a/src/main/java/org/apache/bcel/generic/ARETURN.java +++ b/src/main/java/org/apache/bcel/generic/ARETURN.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java index eac7c373..c5b1629b 100644 --- a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ASTORE.java b/src/main/java/org/apache/bcel/generic/ASTORE.java index ae1a2fbe..f5c2d78d 100644 --- a/src/main/java/org/apache/bcel/generic/ASTORE.java +++ b/src/main/java/org/apache/bcel/generic/ASTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ATHROW.java b/src/main/java/org/apache/bcel/generic/ATHROW.java index f5411a9f..7a68a612 100644 --- a/src/main/java/org/apache/bcel/generic/ATHROW.java +++ b/src/main/java/org/apache/bcel/generic/ATHROW.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/AllocationInstruction.java b/src/main/java/org/apache/bcel/generic/AllocationInstruction.java index 31ce261a..b1c6b845 100644 --- a/src/main/java/org/apache/bcel/generic/AllocationInstruction.java +++ b/src/main/java/org/apache/bcel/generic/AllocationInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java b/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java index da060785..37692672 100644 --- a/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ArrayInstruction.java b/src/main/java/org/apache/bcel/generic/ArrayInstruction.java index 4b0377da..c32b5abb 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ArrayInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ArrayType.java b/src/main/java/org/apache/bcel/generic/ArrayType.java index fc6ea3e4..7ce93bae 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayType.java +++ b/src/main/java/org/apache/bcel/generic/ArrayType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/BALOAD.java b/src/main/java/org/apache/bcel/generic/BALOAD.java index 3519960a..6df86417 100644 --- a/src/main/java/org/apache/bcel/generic/BALOAD.java +++ b/src/main/java/org/apache/bcel/generic/BALOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/BASTORE.java b/src/main/java/org/apache/bcel/generic/BASTORE.java index 385c30c5..b8e8f6b9 100644 --- a/src/main/java/org/apache/bcel/generic/BASTORE.java +++ b/src/main/java/org/apache/bcel/generic/BASTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/BIPUSH.java b/src/main/java/org/apache/bcel/generic/BIPUSH.java index 3f0996cf..0bf7acda 100644 --- a/src/main/java/org/apache/bcel/generic/BIPUSH.java +++ b/src/main/java/org/apache/bcel/generic/BIPUSH.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java index 2d828c10..45333239 100644 --- a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java +++ b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/BasicType.java b/src/main/java/org/apache/bcel/generic/BasicType.java index 8890e7bc..c539598e 100644 --- a/src/main/java/org/apache/bcel/generic/BasicType.java +++ b/src/main/java/org/apache/bcel/generic/BasicType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/BranchHandle.java b/src/main/java/org/apache/bcel/generic/BranchHandle.java index 4772cf8b..9b62c8a4 100644 --- a/src/main/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/main/java/org/apache/bcel/generic/BranchHandle.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/BranchInstruction.java b/src/main/java/org/apache/bcel/generic/BranchInstruction.java index 2141d9a9..433dbd86 100644 --- a/src/main/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/main/java/org/apache/bcel/generic/BranchInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/CALOAD.java b/src/main/java/org/apache/bcel/generic/CALOAD.java index 32bb49f6..160eeb95 100644 --- a/src/main/java/org/apache/bcel/generic/CALOAD.java +++ b/src/main/java/org/apache/bcel/generic/CALOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/CASTORE.java b/src/main/java/org/apache/bcel/generic/CASTORE.java index 30ef90bd..03c337bb 100644 --- a/src/main/java/org/apache/bcel/generic/CASTORE.java +++ b/src/main/java/org/apache/bcel/generic/CASTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/CHECKCAST.java b/src/main/java/org/apache/bcel/generic/CHECKCAST.java index 1b3e1978..218a68e9 100644 --- a/src/main/java/org/apache/bcel/generic/CHECKCAST.java +++ b/src/main/java/org/apache/bcel/generic/CHECKCAST.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/CPInstruction.java b/src/main/java/org/apache/bcel/generic/CPInstruction.java index 135dd8f4..54b5bacb 100644 --- a/src/main/java/org/apache/bcel/generic/CPInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CPInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 700b1a24..10d41aba 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ClassGenException.java b/src/main/java/org/apache/bcel/generic/ClassGenException.java index 4b5ee80d..ed1b36a7 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGenException.java +++ b/src/main/java/org/apache/bcel/generic/ClassGenException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ClassObserver.java b/src/main/java/org/apache/bcel/generic/ClassObserver.java index 20b1e0c6..e4cd6cc9 100644 --- a/src/main/java/org/apache/bcel/generic/ClassObserver.java +++ b/src/main/java/org/apache/bcel/generic/ClassObserver.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java index 5fa43d95..ae1a11e2 100644 --- a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/CompoundInstruction.java b/src/main/java/org/apache/bcel/generic/CompoundInstruction.java index 5117334a..bf3d89c2 100644 --- a/src/main/java/org/apache/bcel/generic/CompoundInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CompoundInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index 29574e79..2b647f89 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java b/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java index c5c97c62..05162878 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ConversionInstruction.java b/src/main/java/org/apache/bcel/generic/ConversionInstruction.java index 86ada6d8..bfb57a4d 100644 --- a/src/main/java/org/apache/bcel/generic/ConversionInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ConversionInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/D2F.java b/src/main/java/org/apache/bcel/generic/D2F.java index 30d69df6..a74e2935 100644 --- a/src/main/java/org/apache/bcel/generic/D2F.java +++ b/src/main/java/org/apache/bcel/generic/D2F.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/D2I.java b/src/main/java/org/apache/bcel/generic/D2I.java index 041b4b3a..259da14e 100644 --- a/src/main/java/org/apache/bcel/generic/D2I.java +++ b/src/main/java/org/apache/bcel/generic/D2I.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/D2L.java b/src/main/java/org/apache/bcel/generic/D2L.java index 240f4689..21562824 100644 --- a/src/main/java/org/apache/bcel/generic/D2L.java +++ b/src/main/java/org/apache/bcel/generic/D2L.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DADD.java b/src/main/java/org/apache/bcel/generic/DADD.java index 0a333291..19725676 100644 --- a/src/main/java/org/apache/bcel/generic/DADD.java +++ b/src/main/java/org/apache/bcel/generic/DADD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DALOAD.java b/src/main/java/org/apache/bcel/generic/DALOAD.java index 27673453..089cfd13 100644 --- a/src/main/java/org/apache/bcel/generic/DALOAD.java +++ b/src/main/java/org/apache/bcel/generic/DALOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DASTORE.java b/src/main/java/org/apache/bcel/generic/DASTORE.java index 5780079a..9c0e74dd 100644 --- a/src/main/java/org/apache/bcel/generic/DASTORE.java +++ b/src/main/java/org/apache/bcel/generic/DASTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DCMPG.java b/src/main/java/org/apache/bcel/generic/DCMPG.java index 95af1841..f3b0afbf 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPG.java +++ b/src/main/java/org/apache/bcel/generic/DCMPG.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DCMPL.java b/src/main/java/org/apache/bcel/generic/DCMPL.java index df5030da..86d4fb8f 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPL.java +++ b/src/main/java/org/apache/bcel/generic/DCMPL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DCONST.java b/src/main/java/org/apache/bcel/generic/DCONST.java index e7a462b0..0db7e50c 100644 --- a/src/main/java/org/apache/bcel/generic/DCONST.java +++ b/src/main/java/org/apache/bcel/generic/DCONST.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DDIV.java b/src/main/java/org/apache/bcel/generic/DDIV.java index ea991c1b..25f0a7f1 100644 --- a/src/main/java/org/apache/bcel/generic/DDIV.java +++ b/src/main/java/org/apache/bcel/generic/DDIV.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DLOAD.java b/src/main/java/org/apache/bcel/generic/DLOAD.java index f444d77f..7896717f 100644 --- a/src/main/java/org/apache/bcel/generic/DLOAD.java +++ b/src/main/java/org/apache/bcel/generic/DLOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DMUL.java b/src/main/java/org/apache/bcel/generic/DMUL.java index bb1d0208..48bd7de7 100644 --- a/src/main/java/org/apache/bcel/generic/DMUL.java +++ b/src/main/java/org/apache/bcel/generic/DMUL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DNEG.java b/src/main/java/org/apache/bcel/generic/DNEG.java index 05c2b531..255e9eee 100644 --- a/src/main/java/org/apache/bcel/generic/DNEG.java +++ b/src/main/java/org/apache/bcel/generic/DNEG.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DREM.java b/src/main/java/org/apache/bcel/generic/DREM.java index 2b966a92..765ac192 100644 --- a/src/main/java/org/apache/bcel/generic/DREM.java +++ b/src/main/java/org/apache/bcel/generic/DREM.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DRETURN.java b/src/main/java/org/apache/bcel/generic/DRETURN.java index 2b2624c5..1d6a3f09 100644 --- a/src/main/java/org/apache/bcel/generic/DRETURN.java +++ b/src/main/java/org/apache/bcel/generic/DRETURN.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DSTORE.java b/src/main/java/org/apache/bcel/generic/DSTORE.java index 3f5750dc..ac342b69 100644 --- a/src/main/java/org/apache/bcel/generic/DSTORE.java +++ b/src/main/java/org/apache/bcel/generic/DSTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DSUB.java b/src/main/java/org/apache/bcel/generic/DSUB.java index 4acde4d1..e098ce98 100644 --- a/src/main/java/org/apache/bcel/generic/DSUB.java +++ b/src/main/java/org/apache/bcel/generic/DSUB.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DUP.java b/src/main/java/org/apache/bcel/generic/DUP.java index 4ab038c7..023bf12f 100644 --- a/src/main/java/org/apache/bcel/generic/DUP.java +++ b/src/main/java/org/apache/bcel/generic/DUP.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DUP2.java b/src/main/java/org/apache/bcel/generic/DUP2.java index a37c0b9e..5e4f9df9 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2.java +++ b/src/main/java/org/apache/bcel/generic/DUP2.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X1.java b/src/main/java/org/apache/bcel/generic/DUP2_X1.java index f6cdb335..7124e8b8 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X1.java +++ b/src/main/java/org/apache/bcel/generic/DUP2_X1.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X2.java b/src/main/java/org/apache/bcel/generic/DUP2_X2.java index dc6d9b54..eb1f7a1e 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X2.java +++ b/src/main/java/org/apache/bcel/generic/DUP2_X2.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DUP_X1.java b/src/main/java/org/apache/bcel/generic/DUP_X1.java index 60b6a773..4aa0f456 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X1.java +++ b/src/main/java/org/apache/bcel/generic/DUP_X1.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/DUP_X2.java b/src/main/java/org/apache/bcel/generic/DUP_X2.java index e2f46769..89c91b0a 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X2.java +++ b/src/main/java/org/apache/bcel/generic/DUP_X2.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java index 2bce6d7f..b51bc862 100644 --- a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ExceptionThrower.java b/src/main/java/org/apache/bcel/generic/ExceptionThrower.java index c0071f52..994b7d92 100644 --- a/src/main/java/org/apache/bcel/generic/ExceptionThrower.java +++ b/src/main/java/org/apache/bcel/generic/ExceptionThrower.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/F2D.java b/src/main/java/org/apache/bcel/generic/F2D.java index e3af2452..ba9b87b3 100644 --- a/src/main/java/org/apache/bcel/generic/F2D.java +++ b/src/main/java/org/apache/bcel/generic/F2D.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/F2I.java b/src/main/java/org/apache/bcel/generic/F2I.java index 42061dcf..9545ef30 100644 --- a/src/main/java/org/apache/bcel/generic/F2I.java +++ b/src/main/java/org/apache/bcel/generic/F2I.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/F2L.java b/src/main/java/org/apache/bcel/generic/F2L.java index fb66f9a6..4df6d047 100644 --- a/src/main/java/org/apache/bcel/generic/F2L.java +++ b/src/main/java/org/apache/bcel/generic/F2L.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FADD.java b/src/main/java/org/apache/bcel/generic/FADD.java index 0029d227..f3087651 100644 --- a/src/main/java/org/apache/bcel/generic/FADD.java +++ b/src/main/java/org/apache/bcel/generic/FADD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FALOAD.java b/src/main/java/org/apache/bcel/generic/FALOAD.java index 62fc7ea5..8c1d742b 100644 --- a/src/main/java/org/apache/bcel/generic/FALOAD.java +++ b/src/main/java/org/apache/bcel/generic/FALOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FASTORE.java b/src/main/java/org/apache/bcel/generic/FASTORE.java index 1d9af2f2..953d453b 100644 --- a/src/main/java/org/apache/bcel/generic/FASTORE.java +++ b/src/main/java/org/apache/bcel/generic/FASTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FCMPG.java b/src/main/java/org/apache/bcel/generic/FCMPG.java index ed2cff11..0bae1261 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPG.java +++ b/src/main/java/org/apache/bcel/generic/FCMPG.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FCMPL.java b/src/main/java/org/apache/bcel/generic/FCMPL.java index 09902d6d..db60ba30 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPL.java +++ b/src/main/java/org/apache/bcel/generic/FCMPL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FCONST.java b/src/main/java/org/apache/bcel/generic/FCONST.java index e81d23d5..612687e4 100644 --- a/src/main/java/org/apache/bcel/generic/FCONST.java +++ b/src/main/java/org/apache/bcel/generic/FCONST.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FDIV.java b/src/main/java/org/apache/bcel/generic/FDIV.java index 61f3151c..d1bf86c7 100644 --- a/src/main/java/org/apache/bcel/generic/FDIV.java +++ b/src/main/java/org/apache/bcel/generic/FDIV.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FLOAD.java b/src/main/java/org/apache/bcel/generic/FLOAD.java index aec021b1..cb42ef08 100644 --- a/src/main/java/org/apache/bcel/generic/FLOAD.java +++ b/src/main/java/org/apache/bcel/generic/FLOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FMUL.java b/src/main/java/org/apache/bcel/generic/FMUL.java index d1d02364..466e63aa 100644 --- a/src/main/java/org/apache/bcel/generic/FMUL.java +++ b/src/main/java/org/apache/bcel/generic/FMUL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FNEG.java b/src/main/java/org/apache/bcel/generic/FNEG.java index 98659921..9362168d 100644 --- a/src/main/java/org/apache/bcel/generic/FNEG.java +++ b/src/main/java/org/apache/bcel/generic/FNEG.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FREM.java b/src/main/java/org/apache/bcel/generic/FREM.java index 3b4a6a01..c2b2ea20 100644 --- a/src/main/java/org/apache/bcel/generic/FREM.java +++ b/src/main/java/org/apache/bcel/generic/FREM.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FRETURN.java b/src/main/java/org/apache/bcel/generic/FRETURN.java index 02258ff3..0ef60797 100644 --- a/src/main/java/org/apache/bcel/generic/FRETURN.java +++ b/src/main/java/org/apache/bcel/generic/FRETURN.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FSTORE.java b/src/main/java/org/apache/bcel/generic/FSTORE.java index 0d126518..6b85fa1e 100644 --- a/src/main/java/org/apache/bcel/generic/FSTORE.java +++ b/src/main/java/org/apache/bcel/generic/FSTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FSUB.java b/src/main/java/org/apache/bcel/generic/FSUB.java index 6df62702..886a5cc7 100644 --- a/src/main/java/org/apache/bcel/generic/FSUB.java +++ b/src/main/java/org/apache/bcel/generic/FSUB.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index 5f4115e4..de5f27d5 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 6b1c297a..c5af2463 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FieldInstruction.java b/src/main/java/org/apache/bcel/generic/FieldInstruction.java index d32899c9..ad7cf873 100644 --- a/src/main/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/main/java/org/apache/bcel/generic/FieldInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FieldObserver.java b/src/main/java/org/apache/bcel/generic/FieldObserver.java index 334d47c7..08efc25c 100644 --- a/src/main/java/org/apache/bcel/generic/FieldObserver.java +++ b/src/main/java/org/apache/bcel/generic/FieldObserver.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java index bb0526a6..dbdeaca8 100644 --- a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/GETFIELD.java b/src/main/java/org/apache/bcel/generic/GETFIELD.java index 98288cf3..02bce98a 100644 --- a/src/main/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/main/java/org/apache/bcel/generic/GETFIELD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/GETSTATIC.java b/src/main/java/org/apache/bcel/generic/GETSTATIC.java index 5be65f80..e4a19334 100644 --- a/src/main/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/GETSTATIC.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/GOTO.java b/src/main/java/org/apache/bcel/generic/GOTO.java index b23b224e..c4e54676 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO.java +++ b/src/main/java/org/apache/bcel/generic/GOTO.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/GOTO_W.java b/src/main/java/org/apache/bcel/generic/GOTO_W.java index a3f2df31..c17f4027 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO_W.java +++ b/src/main/java/org/apache/bcel/generic/GOTO_W.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/GotoInstruction.java b/src/main/java/org/apache/bcel/generic/GotoInstruction.java index a7b6546c..ed786606 100644 --- a/src/main/java/org/apache/bcel/generic/GotoInstruction.java +++ b/src/main/java/org/apache/bcel/generic/GotoInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/I2B.java b/src/main/java/org/apache/bcel/generic/I2B.java index 5b230d9c..282b7a44 100644 --- a/src/main/java/org/apache/bcel/generic/I2B.java +++ b/src/main/java/org/apache/bcel/generic/I2B.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/I2C.java b/src/main/java/org/apache/bcel/generic/I2C.java index 7d759296..9a253392 100644 --- a/src/main/java/org/apache/bcel/generic/I2C.java +++ b/src/main/java/org/apache/bcel/generic/I2C.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/I2D.java b/src/main/java/org/apache/bcel/generic/I2D.java index 239cac63..b09146ac 100644 --- a/src/main/java/org/apache/bcel/generic/I2D.java +++ b/src/main/java/org/apache/bcel/generic/I2D.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/I2F.java b/src/main/java/org/apache/bcel/generic/I2F.java index 439788e8..77606df1 100644 --- a/src/main/java/org/apache/bcel/generic/I2F.java +++ b/src/main/java/org/apache/bcel/generic/I2F.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/I2L.java b/src/main/java/org/apache/bcel/generic/I2L.java index a8cebe61..7d5549ca 100644 --- a/src/main/java/org/apache/bcel/generic/I2L.java +++ b/src/main/java/org/apache/bcel/generic/I2L.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/I2S.java b/src/main/java/org/apache/bcel/generic/I2S.java index 4a35bf20..6de155bf 100644 --- a/src/main/java/org/apache/bcel/generic/I2S.java +++ b/src/main/java/org/apache/bcel/generic/I2S.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IADD.java b/src/main/java/org/apache/bcel/generic/IADD.java index 9b647112..e2abc24b 100644 --- a/src/main/java/org/apache/bcel/generic/IADD.java +++ b/src/main/java/org/apache/bcel/generic/IADD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IALOAD.java b/src/main/java/org/apache/bcel/generic/IALOAD.java index 5b59cc77..c13a83b7 100644 --- a/src/main/java/org/apache/bcel/generic/IALOAD.java +++ b/src/main/java/org/apache/bcel/generic/IALOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IAND.java b/src/main/java/org/apache/bcel/generic/IAND.java index 80c91f76..b7768557 100644 --- a/src/main/java/org/apache/bcel/generic/IAND.java +++ b/src/main/java/org/apache/bcel/generic/IAND.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IASTORE.java b/src/main/java/org/apache/bcel/generic/IASTORE.java index 2a2cd301..f8ef94d2 100644 --- a/src/main/java/org/apache/bcel/generic/IASTORE.java +++ b/src/main/java/org/apache/bcel/generic/IASTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ICONST.java b/src/main/java/org/apache/bcel/generic/ICONST.java index 587f7b63..b0cf351d 100644 --- a/src/main/java/org/apache/bcel/generic/ICONST.java +++ b/src/main/java/org/apache/bcel/generic/ICONST.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IDIV.java b/src/main/java/org/apache/bcel/generic/IDIV.java index 7dbee662..89cb8a56 100644 --- a/src/main/java/org/apache/bcel/generic/IDIV.java +++ b/src/main/java/org/apache/bcel/generic/IDIV.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IFEQ.java b/src/main/java/org/apache/bcel/generic/IFEQ.java index ad25a3bd..ef303fb6 100644 --- a/src/main/java/org/apache/bcel/generic/IFEQ.java +++ b/src/main/java/org/apache/bcel/generic/IFEQ.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IFGE.java b/src/main/java/org/apache/bcel/generic/IFGE.java index af407e0c..b0623673 100644 --- a/src/main/java/org/apache/bcel/generic/IFGE.java +++ b/src/main/java/org/apache/bcel/generic/IFGE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IFGT.java b/src/main/java/org/apache/bcel/generic/IFGT.java index ab7f0b7c..b9e35a8c 100644 --- a/src/main/java/org/apache/bcel/generic/IFGT.java +++ b/src/main/java/org/apache/bcel/generic/IFGT.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IFLE.java b/src/main/java/org/apache/bcel/generic/IFLE.java index 7ee6189f..23f333d1 100644 --- a/src/main/java/org/apache/bcel/generic/IFLE.java +++ b/src/main/java/org/apache/bcel/generic/IFLE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IFLT.java b/src/main/java/org/apache/bcel/generic/IFLT.java index 990a0e65..774a91d7 100644 --- a/src/main/java/org/apache/bcel/generic/IFLT.java +++ b/src/main/java/org/apache/bcel/generic/IFLT.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IFNE.java b/src/main/java/org/apache/bcel/generic/IFNE.java index e38de95b..9175f9b2 100644 --- a/src/main/java/org/apache/bcel/generic/IFNE.java +++ b/src/main/java/org/apache/bcel/generic/IFNE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IFNONNULL.java b/src/main/java/org/apache/bcel/generic/IFNONNULL.java index 50b67cdd..bccdd699 100644 --- a/src/main/java/org/apache/bcel/generic/IFNONNULL.java +++ b/src/main/java/org/apache/bcel/generic/IFNONNULL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IFNULL.java b/src/main/java/org/apache/bcel/generic/IFNULL.java index 9213f6b4..430c9dae 100644 --- a/src/main/java/org/apache/bcel/generic/IFNULL.java +++ b/src/main/java/org/apache/bcel/generic/IFNULL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java index 342668d2..8bfc724f 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java +++ b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java index 44502fa4..88b86e8b 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java index e5426aa7..9be1881c 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java index 2878e72c..94a96b80 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java index ae3e9660..9e600f26 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java index 1762550e..03a22246 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java index 7aaba07c..fda1b7a5 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java index 62b8882b..103fb806 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IINC.java b/src/main/java/org/apache/bcel/generic/IINC.java index e529f658..0984686f 100644 --- a/src/main/java/org/apache/bcel/generic/IINC.java +++ b/src/main/java/org/apache/bcel/generic/IINC.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ILOAD.java b/src/main/java/org/apache/bcel/generic/ILOAD.java index be66b423..7cc455aa 100644 --- a/src/main/java/org/apache/bcel/generic/ILOAD.java +++ b/src/main/java/org/apache/bcel/generic/ILOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP1.java b/src/main/java/org/apache/bcel/generic/IMPDEP1.java index 16fd4d71..b6c0673e 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP1.java +++ b/src/main/java/org/apache/bcel/generic/IMPDEP1.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP2.java b/src/main/java/org/apache/bcel/generic/IMPDEP2.java index 18273497..cbc3d072 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP2.java +++ b/src/main/java/org/apache/bcel/generic/IMPDEP2.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IMUL.java b/src/main/java/org/apache/bcel/generic/IMUL.java index 5518a1b4..898e8169 100644 --- a/src/main/java/org/apache/bcel/generic/IMUL.java +++ b/src/main/java/org/apache/bcel/generic/IMUL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/INEG.java b/src/main/java/org/apache/bcel/generic/INEG.java index 290658e0..64e8092d 100644 --- a/src/main/java/org/apache/bcel/generic/INEG.java +++ b/src/main/java/org/apache/bcel/generic/INEG.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java index 1562e156..f761b70f 100644 --- a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java +++ b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java index db5118aa..15d052cb 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java index ed09e72f..762c7eac 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java index 1e1d14cc..13312e2c 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java index b967a67c..7e8beef3 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IOR.java b/src/main/java/org/apache/bcel/generic/IOR.java index 34c35917..e6fe4376 100644 --- a/src/main/java/org/apache/bcel/generic/IOR.java +++ b/src/main/java/org/apache/bcel/generic/IOR.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IREM.java b/src/main/java/org/apache/bcel/generic/IREM.java index 3ec21502..fd393622 100644 --- a/src/main/java/org/apache/bcel/generic/IREM.java +++ b/src/main/java/org/apache/bcel/generic/IREM.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IRETURN.java b/src/main/java/org/apache/bcel/generic/IRETURN.java index 7e9788dd..2ab6e054 100644 --- a/src/main/java/org/apache/bcel/generic/IRETURN.java +++ b/src/main/java/org/apache/bcel/generic/IRETURN.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ISHL.java b/src/main/java/org/apache/bcel/generic/ISHL.java index abb8db2b..d6d652bb 100644 --- a/src/main/java/org/apache/bcel/generic/ISHL.java +++ b/src/main/java/org/apache/bcel/generic/ISHL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ISHR.java b/src/main/java/org/apache/bcel/generic/ISHR.java index 1ce4f8bf..db615fc1 100644 --- a/src/main/java/org/apache/bcel/generic/ISHR.java +++ b/src/main/java/org/apache/bcel/generic/ISHR.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ISTORE.java b/src/main/java/org/apache/bcel/generic/ISTORE.java index af49f237..9b432487 100644 --- a/src/main/java/org/apache/bcel/generic/ISTORE.java +++ b/src/main/java/org/apache/bcel/generic/ISTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ISUB.java b/src/main/java/org/apache/bcel/generic/ISUB.java index 4e86e0b7..248a6b8e 100644 --- a/src/main/java/org/apache/bcel/generic/ISUB.java +++ b/src/main/java/org/apache/bcel/generic/ISUB.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IUSHR.java b/src/main/java/org/apache/bcel/generic/IUSHR.java index 10d68515..f7d3be03 100644 --- a/src/main/java/org/apache/bcel/generic/IUSHR.java +++ b/src/main/java/org/apache/bcel/generic/IUSHR.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IXOR.java b/src/main/java/org/apache/bcel/generic/IXOR.java index 6bcf7beb..8457c2a2 100644 --- a/src/main/java/org/apache/bcel/generic/IXOR.java +++ b/src/main/java/org/apache/bcel/generic/IXOR.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IfInstruction.java b/src/main/java/org/apache/bcel/generic/IfInstruction.java index 60460ea7..0e0f4e6b 100644 --- a/src/main/java/org/apache/bcel/generic/IfInstruction.java +++ b/src/main/java/org/apache/bcel/generic/IfInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/IndexedInstruction.java b/src/main/java/org/apache/bcel/generic/IndexedInstruction.java index 88b3e642..83739a92 100644 --- a/src/main/java/org/apache/bcel/generic/IndexedInstruction.java +++ b/src/main/java/org/apache/bcel/generic/IndexedInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index b64b980a..f469f245 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/InstructionComparator.java b/src/main/java/org/apache/bcel/generic/InstructionComparator.java index 87a6ddb6..89856b24 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionComparator.java +++ b/src/main/java/org/apache/bcel/generic/InstructionComparator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/InstructionConstants.java b/src/main/java/org/apache/bcel/generic/InstructionConstants.java index ff85c67b..6fcc332d 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionConstants.java +++ b/src/main/java/org/apache/bcel/generic/InstructionConstants.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index 77f73210..c3ec8450 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java index 6e739151..df95d5f5 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/main/java/org/apache/bcel/generic/InstructionHandle.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index a7c1ee20..7368511c 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/InstructionListObserver.java b/src/main/java/org/apache/bcel/generic/InstructionListObserver.java index ee4be7c0..4b08a586 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionListObserver.java +++ b/src/main/java/org/apache/bcel/generic/InstructionListObserver.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/InstructionTargeter.java b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java index 5e21d8d4..33950e8c 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionTargeter.java +++ b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index a6aa67bb..d5ecac2c 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/JSR.java b/src/main/java/org/apache/bcel/generic/JSR.java index 1255f2f2..6c30feae 100644 --- a/src/main/java/org/apache/bcel/generic/JSR.java +++ b/src/main/java/org/apache/bcel/generic/JSR.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/JSR_W.java b/src/main/java/org/apache/bcel/generic/JSR_W.java index dee8ba81..a2eef673 100644 --- a/src/main/java/org/apache/bcel/generic/JSR_W.java +++ b/src/main/java/org/apache/bcel/generic/JSR_W.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/JsrInstruction.java b/src/main/java/org/apache/bcel/generic/JsrInstruction.java index 16b12491..d433240a 100644 --- a/src/main/java/org/apache/bcel/generic/JsrInstruction.java +++ b/src/main/java/org/apache/bcel/generic/JsrInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/L2D.java b/src/main/java/org/apache/bcel/generic/L2D.java index 73f3b49a..dd921a04 100644 --- a/src/main/java/org/apache/bcel/generic/L2D.java +++ b/src/main/java/org/apache/bcel/generic/L2D.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/L2F.java b/src/main/java/org/apache/bcel/generic/L2F.java index 36218976..3f8973a6 100644 --- a/src/main/java/org/apache/bcel/generic/L2F.java +++ b/src/main/java/org/apache/bcel/generic/L2F.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/L2I.java b/src/main/java/org/apache/bcel/generic/L2I.java index 34727173..18d0d5cd 100644 --- a/src/main/java/org/apache/bcel/generic/L2I.java +++ b/src/main/java/org/apache/bcel/generic/L2I.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LADD.java b/src/main/java/org/apache/bcel/generic/LADD.java index fa62ed36..354b3a1f 100644 --- a/src/main/java/org/apache/bcel/generic/LADD.java +++ b/src/main/java/org/apache/bcel/generic/LADD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LALOAD.java b/src/main/java/org/apache/bcel/generic/LALOAD.java index 789f60a4..780fdc10 100644 --- a/src/main/java/org/apache/bcel/generic/LALOAD.java +++ b/src/main/java/org/apache/bcel/generic/LALOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LAND.java b/src/main/java/org/apache/bcel/generic/LAND.java index 855c19f8..cca08d55 100644 --- a/src/main/java/org/apache/bcel/generic/LAND.java +++ b/src/main/java/org/apache/bcel/generic/LAND.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LASTORE.java b/src/main/java/org/apache/bcel/generic/LASTORE.java index e7214254..cbb6f52c 100644 --- a/src/main/java/org/apache/bcel/generic/LASTORE.java +++ b/src/main/java/org/apache/bcel/generic/LASTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LCMP.java b/src/main/java/org/apache/bcel/generic/LCMP.java index c993abf5..8c8528d8 100644 --- a/src/main/java/org/apache/bcel/generic/LCMP.java +++ b/src/main/java/org/apache/bcel/generic/LCMP.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LCONST.java b/src/main/java/org/apache/bcel/generic/LCONST.java index 97c1f3bc..0d9d98cc 100644 --- a/src/main/java/org/apache/bcel/generic/LCONST.java +++ b/src/main/java/org/apache/bcel/generic/LCONST.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java index 421414f9..d56fd92f 100644 --- a/src/main/java/org/apache/bcel/generic/LDC.java +++ b/src/main/java/org/apache/bcel/generic/LDC.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LDC2_W.java b/src/main/java/org/apache/bcel/generic/LDC2_W.java index bec4d7a1..9f7d22bf 100644 --- a/src/main/java/org/apache/bcel/generic/LDC2_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC2_W.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LDC_W.java b/src/main/java/org/apache/bcel/generic/LDC_W.java index af45adeb..93d06a7c 100644 --- a/src/main/java/org/apache/bcel/generic/LDC_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC_W.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LDIV.java b/src/main/java/org/apache/bcel/generic/LDIV.java index 75ba4748..fe029e33 100644 --- a/src/main/java/org/apache/bcel/generic/LDIV.java +++ b/src/main/java/org/apache/bcel/generic/LDIV.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LLOAD.java b/src/main/java/org/apache/bcel/generic/LLOAD.java index 722c7c8e..06e269cf 100644 --- a/src/main/java/org/apache/bcel/generic/LLOAD.java +++ b/src/main/java/org/apache/bcel/generic/LLOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LMUL.java b/src/main/java/org/apache/bcel/generic/LMUL.java index 54f069c1..9b3bec1d 100644 --- a/src/main/java/org/apache/bcel/generic/LMUL.java +++ b/src/main/java/org/apache/bcel/generic/LMUL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LNEG.java b/src/main/java/org/apache/bcel/generic/LNEG.java index 721ef278..a31fec31 100644 --- a/src/main/java/org/apache/bcel/generic/LNEG.java +++ b/src/main/java/org/apache/bcel/generic/LNEG.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java index f2104981..752d203e 100644 --- a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java +++ b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LOR.java b/src/main/java/org/apache/bcel/generic/LOR.java index 4fcf881c..a6853caa 100644 --- a/src/main/java/org/apache/bcel/generic/LOR.java +++ b/src/main/java/org/apache/bcel/generic/LOR.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LREM.java b/src/main/java/org/apache/bcel/generic/LREM.java index 7f430252..15a296de 100644 --- a/src/main/java/org/apache/bcel/generic/LREM.java +++ b/src/main/java/org/apache/bcel/generic/LREM.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LRETURN.java b/src/main/java/org/apache/bcel/generic/LRETURN.java index ed5e36c3..23afd27f 100644 --- a/src/main/java/org/apache/bcel/generic/LRETURN.java +++ b/src/main/java/org/apache/bcel/generic/LRETURN.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LSHL.java b/src/main/java/org/apache/bcel/generic/LSHL.java index 3a3d25e3..19a121a4 100644 --- a/src/main/java/org/apache/bcel/generic/LSHL.java +++ b/src/main/java/org/apache/bcel/generic/LSHL.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LSHR.java b/src/main/java/org/apache/bcel/generic/LSHR.java index eda943bd..5a3c0924 100644 --- a/src/main/java/org/apache/bcel/generic/LSHR.java +++ b/src/main/java/org/apache/bcel/generic/LSHR.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LSTORE.java b/src/main/java/org/apache/bcel/generic/LSTORE.java index f9a5e795..ddb44ba3 100644 --- a/src/main/java/org/apache/bcel/generic/LSTORE.java +++ b/src/main/java/org/apache/bcel/generic/LSTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LSUB.java b/src/main/java/org/apache/bcel/generic/LSUB.java index 99345ab5..df3cb51e 100644 --- a/src/main/java/org/apache/bcel/generic/LSUB.java +++ b/src/main/java/org/apache/bcel/generic/LSUB.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LUSHR.java b/src/main/java/org/apache/bcel/generic/LUSHR.java index 10449fa6..684007f0 100644 --- a/src/main/java/org/apache/bcel/generic/LUSHR.java +++ b/src/main/java/org/apache/bcel/generic/LUSHR.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LXOR.java b/src/main/java/org/apache/bcel/generic/LXOR.java index 3961cea1..1beb0fa3 100644 --- a/src/main/java/org/apache/bcel/generic/LXOR.java +++ b/src/main/java/org/apache/bcel/generic/LXOR.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LineNumberGen.java b/src/main/java/org/apache/bcel/generic/LineNumberGen.java index 7d1fb32f..0fc4ffca 100644 --- a/src/main/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/main/java/org/apache/bcel/generic/LineNumberGen.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LoadClass.java b/src/main/java/org/apache/bcel/generic/LoadClass.java index e115c269..af2cb26a 100644 --- a/src/main/java/org/apache/bcel/generic/LoadClass.java +++ b/src/main/java/org/apache/bcel/generic/LoadClass.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LoadInstruction.java b/src/main/java/org/apache/bcel/generic/LoadInstruction.java index ab88a52c..86dcc778 100644 --- a/src/main/java/org/apache/bcel/generic/LoadInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LoadInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java index 67a84b56..6a65fd68 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java index 61a1f9b3..9e5173d8 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/MONITORENTER.java b/src/main/java/org/apache/bcel/generic/MONITORENTER.java index 0f42ca31..4582753d 100644 --- a/src/main/java/org/apache/bcel/generic/MONITORENTER.java +++ b/src/main/java/org/apache/bcel/generic/MONITORENTER.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java index 95396f6e..3e4cab6c 100644 --- a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java +++ b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java index 3eed2a19..e319fe7f 100644 --- a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 3ae319ae..49e07092 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/MethodObserver.java b/src/main/java/org/apache/bcel/generic/MethodObserver.java index 60f4947c..8badfb2c 100644 --- a/src/main/java/org/apache/bcel/generic/MethodObserver.java +++ b/src/main/java/org/apache/bcel/generic/MethodObserver.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/NEW.java b/src/main/java/org/apache/bcel/generic/NEW.java index 02dd27c7..33a39834 100644 --- a/src/main/java/org/apache/bcel/generic/NEW.java +++ b/src/main/java/org/apache/bcel/generic/NEW.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/NEWARRAY.java b/src/main/java/org/apache/bcel/generic/NEWARRAY.java index 3b0808ef..f1d21e28 100644 --- a/src/main/java/org/apache/bcel/generic/NEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/NEWARRAY.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/NOP.java b/src/main/java/org/apache/bcel/generic/NOP.java index 17bd47f8..696e8eaa 100644 --- a/src/main/java/org/apache/bcel/generic/NOP.java +++ b/src/main/java/org/apache/bcel/generic/NOP.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/NamedAndTyped.java b/src/main/java/org/apache/bcel/generic/NamedAndTyped.java index 8dc91b4f..1f6287a0 100644 --- a/src/main/java/org/apache/bcel/generic/NamedAndTyped.java +++ b/src/main/java/org/apache/bcel/generic/NamedAndTyped.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index 24ca3138..ea5f3df8 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -139,7 +139,7 @@ public class ObjectType extends ReferenceType { /** - * Java Virtual Machine Specification edition 2, § 5.4.4 Access Control + * Java Virtual Machine Specification edition 2, � 5.4.4 Access Control * @throws ClassNotFoundException if the class referenced by this type * can't be found */ diff --git a/src/main/java/org/apache/bcel/generic/POP.java b/src/main/java/org/apache/bcel/generic/POP.java index 3a2c6a38..adcb1ec2 100644 --- a/src/main/java/org/apache/bcel/generic/POP.java +++ b/src/main/java/org/apache/bcel/generic/POP.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/POP2.java b/src/main/java/org/apache/bcel/generic/POP2.java index 3ee18f7e..474a2800 100644 --- a/src/main/java/org/apache/bcel/generic/POP2.java +++ b/src/main/java/org/apache/bcel/generic/POP2.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/PUSH.java b/src/main/java/org/apache/bcel/generic/PUSH.java index e42dc9b0..97a19923 100644 --- a/src/main/java/org/apache/bcel/generic/PUSH.java +++ b/src/main/java/org/apache/bcel/generic/PUSH.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/PUTFIELD.java b/src/main/java/org/apache/bcel/generic/PUTFIELD.java index 2e8da0c1..d64f7b1d 100644 --- a/src/main/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/main/java/org/apache/bcel/generic/PUTFIELD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java index c152bf5f..137e41c6 100644 --- a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/PopInstruction.java b/src/main/java/org/apache/bcel/generic/PopInstruction.java index 4e88e3fd..7d8fa80e 100644 --- a/src/main/java/org/apache/bcel/generic/PopInstruction.java +++ b/src/main/java/org/apache/bcel/generic/PopInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/PushInstruction.java b/src/main/java/org/apache/bcel/generic/PushInstruction.java index d5d4eea8..b514daa1 100644 --- a/src/main/java/org/apache/bcel/generic/PushInstruction.java +++ b/src/main/java/org/apache/bcel/generic/PushInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/RET.java b/src/main/java/org/apache/bcel/generic/RET.java index 50e47090..4d0dfa98 100644 --- a/src/main/java/org/apache/bcel/generic/RET.java +++ b/src/main/java/org/apache/bcel/generic/RET.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/RETURN.java b/src/main/java/org/apache/bcel/generic/RETURN.java index f46e999d..c6c34320 100644 --- a/src/main/java/org/apache/bcel/generic/RETURN.java +++ b/src/main/java/org/apache/bcel/generic/RETURN.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ReferenceType.java b/src/main/java/org/apache/bcel/generic/ReferenceType.java index b024dda6..97e6c502 100644 --- a/src/main/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/main/java/org/apache/bcel/generic/ReferenceType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -104,7 +104,7 @@ public abstract class ReferenceType extends Type { /* If this is an interface type, then: */ if ((this instanceof ObjectType) && (((ObjectType) this).referencesInterfaceExact())) { - /* If T is a class type, then T must be Object (§2.4.7). + /* If T is a class type, then T must be Object (�2.4.7). */ if ((T instanceof ObjectType) && (((ObjectType) T).referencesClassExact())) { if (T.equals(Type.OBJECT)) { @@ -112,7 +112,7 @@ public abstract class ReferenceType extends Type { } } /* If T is an interface type, then T must be the same interface - * as this or a superinterface of this (§2.13.2). + * as this or a superinterface of this (�2.13.2). */ if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact())) { if (this.equals(T)) { @@ -128,7 +128,7 @@ public abstract class ReferenceType extends Type { * array of components of type SC, then: */ if (this instanceof ArrayType) { - /* If T is a class type, then T must be Object (§2.4.7). + /* If T is a class type, then T must be Object (�2.4.7). */ if ((T instanceof ObjectType) && (((ObjectType) T).referencesClassExact())) { if (T.equals(Type.OBJECT)) { @@ -139,14 +139,14 @@ public abstract class ReferenceType extends Type { * of type TC, then one of the following must be true: */ if (T instanceof ArrayType) { - /* TC and SC are the same primitive type (§2.4.1). + /* TC and SC are the same primitive type (�2.4.1). */ Type sc = ((ArrayType) this).getElementType(); Type tc = ((ArrayType) T).getElementType(); if (sc instanceof BasicType && tc instanceof BasicType && sc.equals(tc)) { return true; } - /* TC and SC are reference types (§2.4.6), and type SC is + /* TC and SC are reference types (�2.4.6), and type SC is * assignable to TC by these runtime rules. */ if (tc instanceof ReferenceType && sc instanceof ReferenceType @@ -154,7 +154,7 @@ public abstract class ReferenceType extends Type { return true; } } - /* If T is an interface type, T must be one of the interfaces implemented by arrays (§2.15). */ + /* If T is an interface type, T must be one of the interfaces implemented by arrays (�2.15). */ // TODO: Check if this is still valid or find a way to dynamically find out which // interfaces arrays implement. However, as of the JVM specification edition 2, there // are at least two different pages where assignment compatibility is defined and @@ -185,7 +185,7 @@ public abstract class ReferenceType extends Type { * first common super class of the basic types of "this" and t. * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. * If not all of the two classes' superclasses cannot be found, "null" is returned. - * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". + * See the JVM specification edition 2, "�4.9.2 The Bytecode Verifier". * * @throws ClassNotFoundException on failure to find superclasses of this * type, or the type passed as a parameter @@ -267,7 +267,7 @@ public abstract class ReferenceType extends Type { * If "this" or t is an ArrayType, then Type.OBJECT is returned. * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. * If not all of the two classes' superclasses cannot be found, "null" is returned. - * See the JVM specification edition 2, "§4.9.2 The Bytecode Verifier". + * See the JVM specification edition 2, "�4.9.2 The Bytecode Verifier". * * @deprecated use getFirstCommonSuperclass(ReferenceType t) which has * slightly changed semantics. diff --git a/src/main/java/org/apache/bcel/generic/ReturnInstruction.java b/src/main/java/org/apache/bcel/generic/ReturnInstruction.java index 052085e4..c7077d9e 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ReturnInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java index bfb182a5..0cd59c4e 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ import org.apache.bcel.Constants; /** * Returnaddress, the type JSR or JSR_W instructions push upon the stack. * - * see vmspec2 §3.3.3 + * see vmspec2 �3.3.3 * @version $Id$ * @author Enver Haase */ diff --git a/src/main/java/org/apache/bcel/generic/SALOAD.java b/src/main/java/org/apache/bcel/generic/SALOAD.java index 80744ad6..99f45e06 100644 --- a/src/main/java/org/apache/bcel/generic/SALOAD.java +++ b/src/main/java/org/apache/bcel/generic/SALOAD.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/SASTORE.java b/src/main/java/org/apache/bcel/generic/SASTORE.java index 2eb6bf42..b7002096 100644 --- a/src/main/java/org/apache/bcel/generic/SASTORE.java +++ b/src/main/java/org/apache/bcel/generic/SASTORE.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/SIPUSH.java b/src/main/java/org/apache/bcel/generic/SIPUSH.java index 1e5d26c8..7635fc55 100644 --- a/src/main/java/org/apache/bcel/generic/SIPUSH.java +++ b/src/main/java/org/apache/bcel/generic/SIPUSH.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/SWAP.java b/src/main/java/org/apache/bcel/generic/SWAP.java index fb7ffc82..95d20a6a 100644 --- a/src/main/java/org/apache/bcel/generic/SWAP.java +++ b/src/main/java/org/apache/bcel/generic/SWAP.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/SWITCH.java b/src/main/java/org/apache/bcel/generic/SWITCH.java index 1f942ca9..02b65549 100644 --- a/src/main/java/org/apache/bcel/generic/SWITCH.java +++ b/src/main/java/org/apache/bcel/generic/SWITCH.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index 9b366dbb..1f13c8ad 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/StackConsumer.java b/src/main/java/org/apache/bcel/generic/StackConsumer.java index 6f0b9fb3..2fad91a3 100644 --- a/src/main/java/org/apache/bcel/generic/StackConsumer.java +++ b/src/main/java/org/apache/bcel/generic/StackConsumer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/StackInstruction.java b/src/main/java/org/apache/bcel/generic/StackInstruction.java index d94aefd4..69d777ca 100644 --- a/src/main/java/org/apache/bcel/generic/StackInstruction.java +++ b/src/main/java/org/apache/bcel/generic/StackInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/StackProducer.java b/src/main/java/org/apache/bcel/generic/StackProducer.java index ddab7ede..ce375b1b 100644 --- a/src/main/java/org/apache/bcel/generic/StackProducer.java +++ b/src/main/java/org/apache/bcel/generic/StackProducer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/StoreInstruction.java b/src/main/java/org/apache/bcel/generic/StoreInstruction.java index a1980d32..fd5907cb 100644 --- a/src/main/java/org/apache/bcel/generic/StoreInstruction.java +++ b/src/main/java/org/apache/bcel/generic/StoreInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java index ee572383..40756b2e 100644 --- a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/TargetLostException.java b/src/main/java/org/apache/bcel/generic/TargetLostException.java index 663dc9a1..a4ca5155 100644 --- a/src/main/java/org/apache/bcel/generic/TargetLostException.java +++ b/src/main/java/org/apache/bcel/generic/TargetLostException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index c8086e28..aac50621 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/TypedInstruction.java b/src/main/java/org/apache/bcel/generic/TypedInstruction.java index a0ad7517..df31a610 100644 --- a/src/main/java/org/apache/bcel/generic/TypedInstruction.java +++ b/src/main/java/org/apache/bcel/generic/TypedInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java b/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java index aab5e2a6..c488a178 100644 --- a/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java +++ b/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java b/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java index 61d63688..e4425696 100644 --- a/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java +++ b/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/generic/Visitor.java b/src/main/java/org/apache/bcel/generic/Visitor.java index 94814389..39624232 100644 --- a/src/main/java/org/apache/bcel/generic/Visitor.java +++ b/src/main/java/org/apache/bcel/generic/Visitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java index c333173f..f3629bf5 100644 --- a/src/main/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/main/java/org/apache/bcel/util/AttributeHTML.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/BCELComparator.java b/src/main/java/org/apache/bcel/util/BCELComparator.java index 2caf1255..87eed0a0 100644 --- a/src/main/java/org/apache/bcel/util/BCELComparator.java +++ b/src/main/java/org/apache/bcel/util/BCELComparator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index 139821dc..5c7e01aa 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/BCELifier.java b/src/main/java/org/apache/bcel/util/BCELifier.java index 4c35d642..9ed6e462 100644 --- a/src/main/java/org/apache/bcel/util/BCELifier.java +++ b/src/main/java/org/apache/bcel/util/BCELifier.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/ByteSequence.java b/src/main/java/org/apache/bcel/util/ByteSequence.java index fe8e631f..a1d62cc2 100644 --- a/src/main/java/org/apache/bcel/util/ByteSequence.java +++ b/src/main/java/org/apache/bcel/util/ByteSequence.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index 9723c5ec..85ba6b55 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -107,7 +107,7 @@ public class Class2HTML implements Constants { */ for (int i = 0; i < argv.length; i++) { if (argv[i].charAt(0) == '-') { // command line switch - if (argv[i].equals("-d")) { // Specify target directory, default `.´ + if (argv[i].equals("-d")) { // Specify target directory, default `.� dir = argv[++i]; if (!dir.endsWith("" + sep)) { dir = dir + sep; diff --git a/src/main/java/org/apache/bcel/util/ClassLoader.java b/src/main/java/org/apache/bcel/util/ClassLoader.java index 15f5f9c9..9f0a9e3e 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoader.java +++ b/src/main/java/org/apache/bcel/util/ClassLoader.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java index e1ee4ea4..1361477e 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 55965e44..9e0d511c 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/ClassQueue.java b/src/main/java/org/apache/bcel/util/ClassQueue.java index 209c2c2f..152b744d 100644 --- a/src/main/java/org/apache/bcel/util/ClassQueue.java +++ b/src/main/java/org/apache/bcel/util/ClassQueue.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/ClassSet.java b/src/main/java/org/apache/bcel/util/ClassSet.java index ea21aad6..f42bf058 100644 --- a/src/main/java/org/apache/bcel/util/ClassSet.java +++ b/src/main/java/org/apache/bcel/util/ClassSet.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/ClassStack.java b/src/main/java/org/apache/bcel/util/ClassStack.java index 16fd7037..5fad9aea 100644 --- a/src/main/java/org/apache/bcel/util/ClassStack.java +++ b/src/main/java/org/apache/bcel/util/ClassStack.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/ClassVector.java b/src/main/java/org/apache/bcel/util/ClassVector.java index b421e3ea..32e88822 100644 --- a/src/main/java/org/apache/bcel/util/ClassVector.java +++ b/src/main/java/org/apache/bcel/util/ClassVector.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 6dbc1163..42a2d9f7 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/ConstantHTML.java b/src/main/java/org/apache/bcel/util/ConstantHTML.java index 76ec7500..48b733f7 100644 --- a/src/main/java/org/apache/bcel/util/ConstantHTML.java +++ b/src/main/java/org/apache/bcel/util/ConstantHTML.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index c0cffd6d..29902ff6 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/JavaWrapper.java b/src/main/java/org/apache/bcel/util/JavaWrapper.java index a03383f0..f3feb298 100644 --- a/src/main/java/org/apache/bcel/util/JavaWrapper.java +++ b/src/main/java/org/apache/bcel/util/JavaWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/MethodHTML.java b/src/main/java/org/apache/bcel/util/MethodHTML.java index 8d9ce075..b38d4055 100644 --- a/src/main/java/org/apache/bcel/util/MethodHTML.java +++ b/src/main/java/org/apache/bcel/util/MethodHTML.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/Repository.java b/src/main/java/org/apache/bcel/util/Repository.java index 4069ab4b..b94d874b 100644 --- a/src/main/java/org/apache/bcel/util/Repository.java +++ b/src/main/java/org/apache/bcel/util/Repository.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index d11c6a7c..7b12e820 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java index db2049c6..7dbee639 100644 --- a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,8 +35,8 @@ public class GraphicalVerifier { /** Constructor. */ public GraphicalVerifier() { VerifierAppFrame frame = new VerifierAppFrame(); - //Frames überprüfen, die voreingestellte Größe haben - //Frames packen, die nutzbare bevorzugte Größeninformationen enthalten, z.B. aus ihrem Layout + //Frames �berpr�fen, die voreingestellte Gr��e haben + //Frames packen, die nutzbare bevorzugte Gr��eninformationen enthalten, z.B. aus ihrem Layout if (packFrame) { frame.pack(); } else { diff --git a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java index b828eecb..f444dd7c 100644 --- a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/PassVerifier.java b/src/main/java/org/apache/bcel/verifier/PassVerifier.java index 49193e90..9a14c13b 100644 --- a/src/main/java/org/apache/bcel/verifier/PassVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/PassVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java index ebe9772d..bbc2b9f6 100644 --- a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java +++ b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/VerificationResult.java b/src/main/java/org/apache/bcel/verifier/VerificationResult.java index d2d804c8..1af57e02 100644 --- a/src/main/java/org/apache/bcel/verifier/VerificationResult.java +++ b/src/main/java/org/apache/bcel/verifier/VerificationResult.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/Verifier.java b/src/main/java/org/apache/bcel/verifier/Verifier.java index 8562a3d2..6e07577d 100644 --- a/src/main/java/org/apache/bcel/verifier/Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/Verifier.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index 3da656e3..1a40a7da 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java index c787ec24..2d8a973a 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index c08fefb0..abf1950f 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java index af0bd009..ea909328 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java index 217a688c..d37f11f3 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java +++ b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java index 9ef518bf..4bb12973 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java index 2a114748..11a88a40 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java index dae1bc89..1ff8fb0a 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java index 93fd7624..7b5d1230 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java index 2720f8e5..79ab38b3 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java index d8c7e53d..38949ab1 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java index 1121f2d8..03289611 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java index ef24d1fc..3e7809e2 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java index 9e522381..d8c1f293 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java index b1c125a1..088289d4 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java index 4ddeb1b5..0638101d 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/Utility.java b/src/main/java/org/apache/bcel/verifier/exc/Utility.java index 56a99c31..302e3525 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/Utility.java +++ b/src/main/java/org/apache/bcel/verifier/exc/Utility.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java index 00016cd5..e96369e1 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java index e07108f3..650da6dc 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java index 61ef4036..4302abdb 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/statics/IntList.java b/src/main/java/org/apache/bcel/verifier/statics/IntList.java index b5126d56..31e59207 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/IntList.java +++ b/src/main/java/org/apache/bcel/verifier/statics/IntList.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java index 3e5cff41..638e80a6 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java index 2f04457f..37ad9c67 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java index f9a29a59..f5dbbd94 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index d4b4fdfe..c2825fcf 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 80761861..eaf634f8 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 4ae2113b..c4e6a5e0 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 98f996da..6f3b2475 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index 7ae3bb90..53387e4e 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java index 1dcb7df3..0fd58cee 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index 524cefaf..0c113c92 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index 1be9db22..7ac280be 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Frame.java b/src/main/java/org/apache/bcel/verifier/structurals/Frame.java index 8cd62c92..2a5502c8 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Frame.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Frame.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java b/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java index a2948be9..d47ccd2d 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index ad9134f6..87e12f69 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java index 774072e6..fa42db5f 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 8c7a7c72..199edb25 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java index 0f04a755..28976649 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 0069603c..8c5741f8 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java index 20274d8e..3eed0e62 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index d5b46aa8..3fcf6249 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index 2087a548..096dc446 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/test/java/org/apache/bcel/NanoTimer.java b/src/test/java/org/apache/bcel/NanoTimer.java index a84d80a9..ef9f046c 100644 --- a/src/test/java/org/apache/bcel/NanoTimer.java +++ b/src/test/java/org/apache/bcel/NanoTimer.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java index 28925e56..bf48c91d 100644 --- a/src/test/java/org/apache/bcel/PerformanceTest.java +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2004 The Apache Software Foundation + * Copyright 2000-2009 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. -- GitLab From 7113a783ae7848f812f53d88a571ef5e461137e4 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 01:44:18 +0000 Subject: [PATCH 0414/1313] fix garbage char that somehow got stuck in javadoc git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826335 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Utility.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index d03cf63e..e5dee0e5 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -626,7 +626,7 @@ public abstract class Utility { /** - * A return�type signature represents the return value from a method. + * A returntype signature represents the return value from a method. * It is a series of bytes in the following grammar: * * ::= | V -- GitLab From 7e552376fe0886ed3879c94ffb5565184ff21d8d Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 01:46:02 +0000 Subject: [PATCH 0415/1313] fix javadoc git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826336 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/AnnotationEntry.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 1c9feeb3..b955fbc4 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -44,7 +44,6 @@ public class AnnotationEntry implements Node, Constants, Serializable { /** * Construct object from file stream. * @param file Input stream - * @throws IOException */ public AnnotationEntry(int type_index, ConstantPool constant_pool, boolean isRuntimeVisible) { this.type_index = type_index; -- GitLab From a8e2f86ac1176d2769a680b9153527f4f47f4751 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 01:55:42 +0000 Subject: [PATCH 0416/1313] less garbage generation git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826339 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ConstantPool.java | 8 ++++---- .../java/org/apache/bcel/classfile/ConstantValue.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index 7d6accbc..b07cc763 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -117,16 +117,16 @@ public class ConstantPool implements Cloneable, Node, Serializable { str = ((ConstantUtf8) c).getBytes(); break; case Constants.CONSTANT_Double: - str = "" + ((ConstantDouble) c).getBytes(); + str = String.valueOf(((ConstantDouble) c).getBytes()); break; case Constants.CONSTANT_Float: - str = "" + ((ConstantFloat) c).getBytes(); + str = String.valueOf(((ConstantFloat) c).getBytes()); break; case Constants.CONSTANT_Long: - str = "" + ((ConstantLong) c).getBytes(); + str = String.valueOf(((ConstantLong) c).getBytes()); break; case Constants.CONSTANT_Integer: - str = "" + ((ConstantInteger) c).getBytes(); + str = String.valueOf(((ConstantInteger) c).getBytes()); break; case Constants.CONSTANT_NameAndType: str = (constantToString(((ConstantNameAndType) c).getNameIndex(), diff --git a/src/main/java/org/apache/bcel/classfile/ConstantValue.java b/src/main/java/org/apache/bcel/classfile/ConstantValue.java index baf2d868..071fc0c6 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantValue.java @@ -122,16 +122,16 @@ public final class ConstantValue extends Attribute { // Print constant to string depending on its type switch (c.getTag()) { case Constants.CONSTANT_Long: - buf = "" + ((ConstantLong) c).getBytes(); + buf = String.valueOf(((ConstantLong) c).getBytes()); break; case Constants.CONSTANT_Float: - buf = "" + ((ConstantFloat) c).getBytes(); + buf = String.valueOf(((ConstantFloat) c).getBytes()); break; case Constants.CONSTANT_Double: - buf = "" + ((ConstantDouble) c).getBytes(); + buf = String.valueOf(((ConstantDouble) c).getBytes()); break; case Constants.CONSTANT_Integer: - buf = "" + ((ConstantInteger) c).getBytes(); + buf = String.valueOf(((ConstantInteger) c).getBytes()); break; case Constants.CONSTANT_String: i = ((ConstantString) c).getStringIndex(); -- GitLab From 29a1ba9e2fc8eafd1c81d7d2e6406c8b472191e3 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 02:00:16 +0000 Subject: [PATCH 0417/1313] code assumes Utility.getAnnotationAttributes won't return null, but does. convert it to just return an Attribute[0] instead of null git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826340 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Utility.java | 2 +- src/main/java/org/apache/bcel/generic/FieldGen.java | 8 +++----- src/main/java/org/apache/bcel/generic/MethodGen.java | 8 +++----- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index e5dee0e5..df679d0e 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -1356,7 +1356,7 @@ public abstract class Utility { */ public static Attribute[] getAnnotationAttributes(ConstantPoolGen cp,List vec) { - if (vec.isEmpty()) return null; + if (vec.isEmpty()) return new Attribute[0]; try { int countVisible = 0; diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index de5f27d5..2d0218ec 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -227,11 +227,9 @@ public class FieldGen extends FieldGenOrMethodGen { private void addAnnotationsAsAttribute(ConstantPoolGen cp) { Attribute[] attrs = Utility.getAnnotationAttributes(cp,annotation_vec); - if (attrs!=null) { - for (int i = 0; i < attrs.length; i++) { - addAttribute(attrs[i]); - } - } + for (int i = 0; i < attrs.length; i++) { + addAttribute(attrs[i]); + } } diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 49e07092..78a8aa44 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -634,11 +634,9 @@ public class MethodGen extends FieldGenOrMethodGen { public void addAnnotationsAsAttribute(ConstantPoolGen cp) { Attribute[] attrs = Utility.getAnnotationAttributes(cp,annotation_vec); - if (attrs!=null) { - for (int i = 0; i < attrs.length; i++) { - addAttribute(attrs[i]); - } - } + for (int i = 0; i < attrs.length; i++) { + addAttribute(attrs[i]); + } } public void addParameterAnnotationsAsAttribute(ConstantPoolGen cp) { -- GitLab From 662ae81171f5c0640d5c40cd42d9f5b80764cd9b Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 02:02:10 +0000 Subject: [PATCH 0418/1313] code assumes InstructionHandle.getTargeters() doesn't return null, but does. switch over to return InstructionTargeter[0] instead git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826341 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/InstructionHandle.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java index df95d5f5..1e856758 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/main/java/org/apache/bcel/generic/InstructionHandle.java @@ -212,7 +212,7 @@ public class InstructionHandle implements java.io.Serializable { */ public InstructionTargeter[] getTargeters() { if (!hasTargeters()) { - return null; + return new InstructionTargeter[0]; } InstructionTargeter[] t = new InstructionTargeter[targeters.size()]; targeters.toArray(t); -- GitLab From 6ee4b766d139e150bc7fefe77b8198417c988139 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 18 Oct 2009 02:03:34 +0000 Subject: [PATCH 0419/1313] code assumes InstructionList.getByteCode() doesn't return null - but can.. convert to byte[0] in this case. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@826342 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/InstructionList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 7368511c..1c42c4a0 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -951,7 +951,7 @@ public class InstructionList implements Serializable { } } catch (IOException e) { System.err.println(e); - return null; + return new byte[0]; } return b.toByteArray(); } -- GitLab From ed046759921e7536129f52c76c74de29d6ab15de Mon Sep 17 00:00:00 2001 From: Daniel Rall Date: Wed, 11 Nov 2009 18:57:32 +0000 Subject: [PATCH 0420/1313] Remove crufty old .cvsignore file. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@835013 13f79535-47bb-0310-9956-ffa450edef68 --- .cvsignore | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .cvsignore diff --git a/.cvsignore b/.cvsignore deleted file mode 100644 index 534d47ab..00000000 --- a/.cvsignore +++ /dev/null @@ -1,3 +0,0 @@ -bin -velocity.log -*~ -- GitLab From 37aaadf64f9d1e1d7ff19311f82f5d9435942cfa Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 16 Nov 2009 14:10:49 +0000 Subject: [PATCH 0421/1313] commit mj wilson's patch for bug 48203 for correctly generating float constants in BCELFactory.createConstant git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@880760 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/BCELFactory.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index 5c7e01aa..9f738234 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -23,6 +23,7 @@ import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.Utility; import org.apache.bcel.generic.AllocationInstruction; @@ -202,6 +203,10 @@ class BCELFactory extends EmptyVisitor { embed = '"' + Utility.convertString(embed) + '"'; } else if (value instanceof Character) { embed = "(char)0x" + Integer.toHexString(((Character) value).charValue()); + } else if (value instanceof Float) { + embed += "f"; + } else if (value instanceof Long) { + embed += "L"; } _out.println("il.append(new PUSH(_cp, " + embed + "));"); } -- GitLab From d553fac1571d96b0403d3cec623a978e768e289e Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Fri, 4 Dec 2009 18:08:42 +0000 Subject: [PATCH 0422/1313] Remove the verifier git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@887304 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/GraphicalVerifier.java | 72 - .../apache/bcel/verifier/NativeVerifier.java | 74 - .../apache/bcel/verifier/PassVerifier.java | 105 - .../apache/bcel/verifier/TransitiveHull.java | 104 - .../bcel/verifier/VerificationResult.java | 115 - .../org/apache/bcel/verifier/Verifier.java | 248 -- .../bcel/verifier/VerifierAppFrame.java | 396 --- .../apache/bcel/verifier/VerifierFactory.java | 110 - .../verifier/VerifierFactoryListModel.java | 75 - .../verifier/VerifierFactoryObserver.java | 39 - .../apache/bcel/verifier/VerifyDialog.java | 553 ---- .../exc/AssertionViolatedException.java | 83 - .../exc/ClassConstraintException.java | 49 - .../verifier/exc/CodeConstraintException.java | 40 - .../verifier/exc/InvalidMethodException.java | 32 - .../exc/LinkingConstraintException.java | 37 - .../bcel/verifier/exc/LoadingException.java | 42 - ...ocalVariableInfoInconsistentException.java | 44 - .../exc/StaticCodeConstraintException.java | 34 - ...ticCodeInstructionConstraintException.java | 37 - ...InstructionOperandConstraintException.java | 37 - .../StructuralCodeConstraintException.java | 45 - .../org/apache/bcel/verifier/exc/Utility.java | 40 - .../verifier/exc/VerificationException.java | 52 - .../VerifierConstraintViolatedException.java | 83 - .../org/apache/bcel/verifier/exc/package.html | 17 - .../org/apache/bcel/verifier/package.html | 18 - .../bcel/verifier/statics/DOUBLE_Upper.java | 42 - .../apache/bcel/verifier/statics/IntList.java | 51 - .../bcel/verifier/statics/LONG_Upper.java | 42 - .../verifier/statics/LocalVariableInfo.java | 107 - .../verifier/statics/LocalVariablesInfo.java | 74 - .../bcel/verifier/statics/Pass1Verifier.java | 185 -- .../bcel/verifier/statics/Pass2Verifier.java | 1444 --------- .../bcel/verifier/statics/Pass3aVerifier.java | 1224 -------- .../statics/StringRepresentation.java | 265 -- .../apache/bcel/verifier/statics/package.html | 19 - .../structurals/ControlFlowGraph.java | 461 --- .../structurals/ExceptionHandler.java | 57 - .../structurals/ExceptionHandlers.java | 76 - .../structurals/ExecutionVisitor.java | 1090 ------- .../bcel/verifier/structurals/Frame.java | 119 - .../verifier/structurals/GenericArray.java | 33 - .../structurals/InstConstraintVisitor.java | 2718 ----------------- .../structurals/InstructionContext.java | 105 - .../verifier/structurals/LocalVariables.java | 209 -- .../verifier/structurals/OperandStack.java | 263 -- .../verifier/structurals/Pass3bVerifier.java | 390 --- .../bcel/verifier/structurals/Subroutine.java | 89 - .../verifier/structurals/Subroutines.java | 653 ---- .../structurals/UninitializedObjectType.java | 67 - .../bcel/verifier/structurals/package.html | 20 - 52 files changed, 12384 deletions(-) delete mode 100644 src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java delete mode 100644 src/main/java/org/apache/bcel/verifier/NativeVerifier.java delete mode 100644 src/main/java/org/apache/bcel/verifier/PassVerifier.java delete mode 100644 src/main/java/org/apache/bcel/verifier/TransitiveHull.java delete mode 100644 src/main/java/org/apache/bcel/verifier/VerificationResult.java delete mode 100644 src/main/java/org/apache/bcel/verifier/Verifier.java delete mode 100644 src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java delete mode 100644 src/main/java/org/apache/bcel/verifier/VerifierFactory.java delete mode 100644 src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java delete mode 100644 src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java delete mode 100644 src/main/java/org/apache/bcel/verifier/VerifyDialog.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/LoadingException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/Utility.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/VerificationException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java delete mode 100644 src/main/java/org/apache/bcel/verifier/exc/package.html delete mode 100644 src/main/java/org/apache/bcel/verifier/package.html delete mode 100644 src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java delete mode 100644 src/main/java/org/apache/bcel/verifier/statics/IntList.java delete mode 100644 src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java delete mode 100644 src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java delete mode 100644 src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java delete mode 100644 src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java delete mode 100644 src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java delete mode 100644 src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java delete mode 100644 src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java delete mode 100644 src/main/java/org/apache/bcel/verifier/statics/package.html delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/Frame.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java delete mode 100644 src/main/java/org/apache/bcel/verifier/structurals/package.html diff --git a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java deleted file mode 100644 index 7dbee639..00000000 --- a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier; - -import java.awt.Dimension; -import java.awt.Toolkit; -import javax.swing.UIManager; -import org.apache.bcel.generic.Type; - -/** - * A graphical user interface application demonstrating JustIce. - * - * @version $Id$ - * @author Enver Haase - */ -public class GraphicalVerifier { - - boolean packFrame = false; - - - /** Constructor. */ - public GraphicalVerifier() { - VerifierAppFrame frame = new VerifierAppFrame(); - //Frames �berpr�fen, die voreingestellte Gr��e haben - //Frames packen, die nutzbare bevorzugte Gr��eninformationen enthalten, z.B. aus ihrem Layout - if (packFrame) { - frame.pack(); - } else { - frame.validate(); - } - //Das Fenster zentrieren - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - Dimension frameSize = frame.getSize(); - if (frameSize.height > screenSize.height) { - frameSize.height = screenSize.height; - } - if (frameSize.width > screenSize.width) { - frameSize.width = screenSize.width; - } - frame.setLocation((screenSize.width - frameSize.width) / 2, - (screenSize.height - frameSize.height) / 2); - frame.setVisible(true); - frame.classNamesJList.setModel(new VerifierFactoryListModel()); - VerifierFactory.getVerifier(Type.OBJECT.getClassName()); // Fill list with java.lang.Object - frame.classNamesJList.setSelectedIndex(0); // default, will verify java.lang.Object - } - - - /** Main method. */ - public static void main( String[] args ) { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Exception e) { - e.printStackTrace(); - } - new GraphicalVerifier(); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java deleted file mode 100644 index f444dd7c..00000000 --- a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier; - -/** - * The NativeVerifier class implements a main(String[] args) method that's - * roughly compatible to the one in the Verifier class, but that uses the - * JVM's internal verifier for its class file verification. - * This can be used for comparison runs between the JVM-internal verifier - * and JustIce. - * - * @version $Id$ - * @author Enver Haase - */ -public abstract class NativeVerifier { - - /** - * This class must not be instantiated. - */ - private NativeVerifier() { - } - - - /** - * Works only on the first argument. - */ - public static void main( String[] args ) { - if (args.length != 1) { - System.out.println("Verifier front-end: need exactly one argument."); - System.exit(1); - } - int dotclasspos = args[0].lastIndexOf(".class"); - if (dotclasspos != -1) { - args[0] = args[0].substring(0, dotclasspos); - } - args[0] = args[0].replace('/', '.'); - //System.out.println(args[0]); - try { - Class.forName(args[0]); - } catch (ExceptionInInitializerError eiie) { //subclass of LinkageError! - System.out.println("NativeVerifier: ExceptionInInitializerError encountered on '" - + args[0] + "'."); - System.out.println(eiie); - System.exit(1); - } catch (LinkageError le) { - System.out.println("NativeVerifier: LinkageError encountered on '" + args[0] + "'."); - System.out.println(le); - System.exit(1); - } catch (ClassNotFoundException cnfe) { - System.out.println("NativeVerifier: FILE NOT FOUND: '" + args[0] + "'."); - System.exit(1); - } catch (Throwable t) { - System.out.println("NativeVerifier: Unspecified verification error on'" + args[0] - + "'."); - System.exit(1); - } - System.out.println("NativeVerifier: Class file '" + args[0] + "' seems to be okay."); - System.exit(0); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/PassVerifier.java b/src/main/java/org/apache/bcel/verifier/PassVerifier.java deleted file mode 100644 index 9a14c13b..00000000 --- a/src/main/java/org/apache/bcel/verifier/PassVerifier.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier; - -import java.util.ArrayList; -import java.util.List; - -/** - * A PassVerifier actually verifies a class file; it is instantiated - * by a Verifier. - * The verification should conform with a certain pass as described - * in The Java Virtual Machine Specification, 2nd edition. - * This book describes four passes. Pass one means loading the - * class and verifying a few static constraints. Pass two actually - * verifies some other constraints that could enforce loading in - * referenced class files. Pass three is the first pass that actually - * checks constraints in the code array of a method in the class file; - * it has two parts with the first verifying static constraints and - * the second part verifying structural constraints (where a data flow - * analysis is used for). The fourth pass, finally, performs checks - * that can only be done at run-time. - * JustIce does not have a run-time pass, but certain constraints that - * are usually delayed until run-time for performance reasons are also - * checked during the second part of pass three. - * PassVerifier instances perform caching. - * That means, if you really want a new verification run of a certain - * pass you must use a new instance of a given PassVerifier. - * - * @version $Id$ - * @author Enver Haase - * @see org.apache.bcel.verifier.Verifier - * @see #verify() - */ -public abstract class PassVerifier { - - /** The (warning) messages. */ - private List messages = new ArrayList(); //Type of elements: String - /** The VerificationResult cache. */ - private VerificationResult verificationResult = null; - - - /** - * This method runs a verification pass conforming to the - * Java Virtual Machine Specification, 2nd edition, on a - * class file. - * PassVerifier instances perform caching; - * i.e. if the verify() method once determined a VerificationResult, - * then this result may be returned after every invocation of this - * method instead of running the verification pass anew; likewise with - * the result of getMessages(). - * - * @see #getMessages() - * @see #addMessage(String) - */ - public VerificationResult verify() { - if (verificationResult == null) { - verificationResult = do_verify(); - } - return verificationResult; - } - - - /** Does the real verification work, uncached. */ - public abstract VerificationResult do_verify(); - - - /** - * This method adds a (warning) message to the message pool of this - * PassVerifier. This method is normally only internally used by - * BCEL's class file verifier "JustIce" and should not be used from - * the outside. - * - * @see #getMessages() - */ - public void addMessage( String message ) { - messages.add(message); - } - - - /** - * Returns the (warning) messages that this PassVerifier accumulated - * during its do_verify()ing work. - * - * @see #addMessage(String) - * @see #do_verify() - */ - public String[] getMessages() { - verify(); // create messages if not already done (cached!) - return (String[]) messages.toArray(new String[messages.size()]); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java deleted file mode 100644 index bbc2b9f6..00000000 --- a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier; - -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; - -/** - * This class has a main method implementing a demonstration program - * of how to use the VerifierFactoryObserver. It transitively verifies - * all class files encountered; this may take up a lot of time and, - * more notably, memory. - * - * @version $Id$ - * @author Enver Haase - */ -public class TransitiveHull implements VerifierFactoryObserver { - - /** Used for indentation. */ - private int indent = 0; - - - /** Not publicly instantiable. */ - private TransitiveHull() { - } - - - /* Implementing VerifierFactoryObserver. */ - public void update( String classname ) { - System.gc(); // avoid swapping if possible. - for (int i = 0; i < indent; i++) { - System.out.print(" "); - } - System.out.println(classname); - indent += 1; - Verifier v = VerifierFactory.getVerifier(classname); - VerificationResult vr; - vr = v.doPass1(); - if (vr != VerificationResult.VR_OK) { - System.out.println("Pass 1:\n" + vr); - } - vr = v.doPass2(); - if (vr != VerificationResult.VR_OK) { - System.out.println("Pass 2:\n" + vr); - } - if (vr == VerificationResult.VR_OK) { - try { - JavaClass jc = Repository.lookupClass(v.getClassName()); - for (int i = 0; i < jc.getMethods().length; i++) { - vr = v.doPass3a(i); - if (vr != VerificationResult.VR_OK) { - System.out.println(v.getClassName() + ", Pass 3a, method " + i + " ['" - + jc.getMethods()[i] + "']:\n" + vr); - } - vr = v.doPass3b(i); - if (vr != VerificationResult.VR_OK) { - System.out.println(v.getClassName() + ", Pass 3b, method " + i + " ['" - + jc.getMethods()[i] + "']:\n" + vr); - } - } - } catch (ClassNotFoundException e) { - System.err.println("Could not find class " + v.getClassName() + " in Repository"); - } - } - indent -= 1; - } - - - /** - * This method implements a demonstration program - * of how to use the VerifierFactoryObserver. It transitively verifies - * all class files encountered; this may take up a lot of time and, - * more notably, memory. - */ - public static void main( String[] args ) { - if (args.length != 1) { - System.out.println("Need exactly one argument: The root class to verify."); - System.exit(1); - } - int dotclasspos = args[0].lastIndexOf(".class"); - if (dotclasspos != -1) { - args[0] = args[0].substring(0, dotclasspos); - } - args[0] = args[0].replace('/', '.'); - TransitiveHull th = new TransitiveHull(); - VerifierFactory.attach(th); - VerifierFactory.getVerifier(args[0]); // the observer is called back and does the actual trick. - VerifierFactory.detach(th); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/VerificationResult.java b/src/main/java/org/apache/bcel/verifier/VerificationResult.java deleted file mode 100644 index 1af57e02..00000000 --- a/src/main/java/org/apache/bcel/verifier/VerificationResult.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier; - -/** - * A VerificationResult is what a PassVerifier returns - * after verifying. - * - * @version $Id$ - * @author Enver Haase - * - */ -public class VerificationResult { - - /** - * Constant to indicate verification has not been tried yet. - * This happens if some earlier verification pass did not return VERIFIED_OK. - */ - public static final int VERIFIED_NOTYET = 0; - /** Constant to indicate verification was passed. */ - public static final int VERIFIED_OK = 1; - /** Constant to indicate verfication failed. */ - public static final int VERIFIED_REJECTED = 2; - /** - * This string is the canonical message for verifications that have not been tried yet. - * This happens if some earlier verification pass did not return VERIFIED_OK. - */ - private static final String VERIFIED_NOTYET_MSG = "Not yet verified."; - /** This string is the canonical message for passed verification passes. */ - private static final String VERIFIED_OK_MSG = "Passed verification."; - /** - * Canonical VerificationResult for not-yet-tried verifications. - * This happens if some earlier verification pass did not return VERIFIED_OK. - */ - public static final VerificationResult VR_NOTYET = new VerificationResult(VERIFIED_NOTYET, - VERIFIED_NOTYET_MSG); - /** Canonical VerificationResult for passed verifications. */ - public static final VerificationResult VR_OK = new VerificationResult(VERIFIED_OK, - VERIFIED_OK_MSG); - /** The numeric status. */ - private int numeric; - /** The detailed message. */ - private String detailMessage; - - - /** The usual constructor. */ - public VerificationResult(int status, String message) { - numeric = status; - detailMessage = message; - } - - - /** Returns one one the VERIFIED_OK, VERIFIED_NOTYET, VERIFIED_REJECTED constants. */ - public int getStatus() { - return numeric; - } - - - /** Returns a detailed message. */ - public String getMessage() { - return detailMessage; - } - - - /** @return a hash code value for the object. - */ - public int hashCode() { - return numeric ^ detailMessage.hashCode(); - } - - - /** - * Returns if two VerificationResult instances are equal. - */ - public boolean equals( Object o ) { - if (!(o instanceof VerificationResult)) { - return false; - } - VerificationResult other = (VerificationResult) o; - return ((other.numeric == this.numeric) && (other.detailMessage.equals(this.detailMessage))); - } - - - /** - * Returns a String representation of the VerificationResult. - */ - public String toString() { - String ret = ""; - if (numeric == VERIFIED_NOTYET) { - ret = "VERIFIED_NOTYET"; - } - if (numeric == VERIFIED_OK) { - ret = "VERIFIED_OK"; - } - if (numeric == VERIFIED_REJECTED) { - ret = "VERIFIED_REJECTED"; - } - ret += "\n" + detailMessage + "\n"; - return ret; - } -} diff --git a/src/main/java/org/apache/bcel/verifier/Verifier.java b/src/main/java/org/apache/bcel/verifier/Verifier.java deleted file mode 100644 index 6e07577d..00000000 --- a/src/main/java/org/apache/bcel/verifier/Verifier.java +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.verifier.statics.Pass1Verifier; -import org.apache.bcel.verifier.statics.Pass2Verifier; -import org.apache.bcel.verifier.statics.Pass3aVerifier; -import org.apache.bcel.verifier.structurals.Pass3bVerifier; - -/** - * A Verifier instance is there to verify a class file according to The Java Virtual - * Machine Specification, 2nd Edition. - * - * Pass-3b-verification includes pass-3a-verification; - * pass-3a-verification includes pass-2-verification; - * pass-2-verification includes pass-1-verification. - * - * A Verifier creates PassVerifier instances to perform the actual verification. - * Verifier instances are usually generated by the VerifierFactory. - * - * @version $Id$ - * @author Enver Haase - * @see org.apache.bcel.verifier.VerifierFactory - * @see org.apache.bcel.verifier.PassVerifier - */ -public class Verifier { - - /** - * The name of the class this verifier operates on. - */ - private final String classname; - /** A Pass1Verifier for this Verifier instance. */ - private Pass1Verifier p1v; - /** A Pass2Verifier for this Verifier instance. */ - private Pass2Verifier p2v; - /** The Pass3aVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ - private Map p3avs = new HashMap(); - /** The Pass3bVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ - private Map p3bvs = new HashMap(); - - - /** Returns the VerificationResult for the given pass. */ - public VerificationResult doPass1() { - if (p1v == null) { - p1v = new Pass1Verifier(this); - } - return p1v.verify(); - } - - - /** Returns the VerificationResult for the given pass. */ - public VerificationResult doPass2() { - if (p2v == null) { - p2v = new Pass2Verifier(this); - } - return p2v.verify(); - } - - - /** Returns the VerificationResult for the given pass. */ - public VerificationResult doPass3a( int method_no ) { - String key = Integer.toString(method_no); - Pass3aVerifier p3av; - p3av = (Pass3aVerifier) (p3avs.get(key)); - if (p3avs.get(key) == null) { - p3av = new Pass3aVerifier(this, method_no); - p3avs.put(key, p3av); - } - return p3av.verify(); - } - - - /** Returns the VerificationResult for the given pass. */ - public VerificationResult doPass3b( int method_no ) { - String key = Integer.toString(method_no); - Pass3bVerifier p3bv; - p3bv = (Pass3bVerifier) (p3bvs.get(key)); - if (p3bvs.get(key) == null) { - p3bv = new Pass3bVerifier(this, method_no); - p3bvs.put(key, p3bv); - } - return p3bv.verify(); - } - - - /** - * Instantiation is done by the VerifierFactory. - * - * @see VerifierFactory - */ - Verifier(String fully_qualified_classname) { - classname = fully_qualified_classname; - flush(); - } - - - /** - * Returns the name of the class this verifier operates on. - * This is particularly interesting when this verifier was created - * recursively by another Verifier and you got a reference to this - * Verifier by the getVerifiers() method of the VerifierFactory. - * @see VerifierFactory - */ - public final String getClassName() { - return classname; - } - - - /** - * Forget everything known about the class file; that means, really - * start a new verification of a possibly different class file from - * BCEL's repository. - * - */ - public void flush() { - p1v = null; - p2v = null; - p3avs.clear(); - p3bvs.clear(); - } - - - /** - * This returns all the (warning) messages collected during verification. - * A prefix shows from which verifying pass a message originates. - */ - public String[] getMessages() throws ClassNotFoundException { - ArrayList messages = new ArrayList(); - if (p1v != null) { - String[] p1m = p1v.getMessages(); - for (int i = 0; i < p1m.length; i++) { - messages.add("Pass 1: " + p1m[i]); - } - } - if (p2v != null) { - String[] p2m = p2v.getMessages(); - for (int i = 0; i < p2m.length; i++) { - messages.add("Pass 2: " + p2m[i]); - } - } - Iterator p3as = p3avs.values().iterator(); - while (p3as.hasNext()) { - Pass3aVerifier pv = (Pass3aVerifier) p3as.next(); - String[] p3am = pv.getMessages(); - int meth = pv.getMethodNo(); - for (int i = 0; i < p3am.length; i++) { - messages.add("Pass 3a, method " + meth + " ('" - + org.apache.bcel.Repository.lookupClass(classname).getMethods()[meth] - + "'): " + p3am[i]); - } - } - Iterator p3bs = p3bvs.values().iterator(); - while (p3bs.hasNext()) { - Pass3bVerifier pv = (Pass3bVerifier) p3bs.next(); - String[] p3bm = pv.getMessages(); - int meth = pv.getMethodNo(); - for (int i = 0; i < p3bm.length; i++) { - messages.add("Pass 3b, method " + meth + " ('" - + org.apache.bcel.Repository.lookupClass(classname).getMethods()[meth] - + "'): " + p3bm[i]); - } - } - String[] ret = new String[messages.size()]; - for (int i = 0; i < messages.size(); i++) { - ret[i] = (String) messages.get(i); - } - return ret; - } - - - /** - * Verifies class files. - * This is a simple demonstration of how the API of BCEL's - * class file verifier "JustIce" may be used. - * You should supply command-line arguments which are - * fully qualified namea of the classes to verify. These class files - * must be somewhere in your CLASSPATH (refer to Sun's - * documentation for questions about this) or you must have put the classes - * into the BCEL Repository yourself (via 'addClass(JavaClass)'). - */ - public static void main( String[] args ) { - System.out - .println("JustIce by Enver Haase, (C) 2001-2002.\n\n\n"); - for (int k = 0; k < args.length; k++) { - try { - if (args[k].endsWith(".class")) { - int dotclasspos = args[k].lastIndexOf(".class"); - if (dotclasspos != -1) { - args[k] = args[k].substring(0, dotclasspos); - } - } - args[k] = args[k].replace('/', '.'); - System.out.println("Now verifying: " + args[k] + "\n"); - Verifier v = VerifierFactory.getVerifier(args[k]); - VerificationResult vr; - vr = v.doPass1(); - System.out.println("Pass 1:\n" + vr); - vr = v.doPass2(); - System.out.println("Pass 2:\n" + vr); - if (vr == VerificationResult.VR_OK) { - JavaClass jc = org.apache.bcel.Repository.lookupClass(args[k]); - for (int i = 0; i < jc.getMethods().length; i++) { - vr = v.doPass3a(i); - System.out.println("Pass 3a, method number " + i + " ['" - + jc.getMethods()[i] + "']:\n" + vr); - vr = v.doPass3b(i); - System.out.println("Pass 3b, method number " + i + " ['" - + jc.getMethods()[i] + "']:\n" + vr); - } - } - System.out.println("Warnings:"); - String[] warnings = v.getMessages(); - if (warnings.length == 0) { - System.out.println(""); - } - for (int j = 0; j < warnings.length; j++) { - System.out.println(warnings[j]); - } - System.out.println("\n"); - // avoid swapping. - v.flush(); - org.apache.bcel.Repository.clearCache(); - System.gc(); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - } - } -} diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java deleted file mode 100644 index 1a40a7da..00000000 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ /dev/null @@ -1,396 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier; - -import java.awt.AWTEvent; -import java.awt.CardLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.WindowEvent; -import javax.swing.BorderFactory; -import javax.swing.JFrame; -import javax.swing.JList; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.JTextPane; -import javax.swing.ListSelectionModel; -import javax.swing.event.ListSelectionEvent; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; - -/** - * This class implements a machine-generated frame for use with - * the GraphicalVerfifier. - * - * @version $Id$ - * @author Enver Haase - * @see GraphicalVerifier - */ -public class VerifierAppFrame extends JFrame { - - JPanel contentPane; - JSplitPane jSplitPane1 = new JSplitPane(); - JPanel jPanel1 = new JPanel(); - JPanel jPanel2 = new JPanel(); - JSplitPane jSplitPane2 = new JSplitPane(); - JPanel jPanel3 = new JPanel(); - JList classNamesJList = new JList(); - GridLayout gridLayout1 = new GridLayout(); - JPanel messagesPanel = new JPanel(); - GridLayout gridLayout2 = new GridLayout(); - JMenuBar jMenuBar1 = new JMenuBar(); - JMenu jMenu1 = new JMenu(); - JScrollPane jScrollPane1 = new JScrollPane(); - JScrollPane messagesScrollPane = new JScrollPane(); - JScrollPane jScrollPane3 = new JScrollPane(); - GridLayout gridLayout4 = new GridLayout(); - JScrollPane jScrollPane4 = new JScrollPane(); - CardLayout cardLayout1 = new CardLayout(); - private String JUSTICE_VERSION = "JustIce by Enver Haase"; - private String current_class; - GridLayout gridLayout3 = new GridLayout(); - JTextPane pass1TextPane = new JTextPane(); - JTextPane pass2TextPane = new JTextPane(); - JTextPane messagesTextPane = new JTextPane(); - JMenuItem newFileMenuItem = new JMenuItem(); - JSplitPane jSplitPane3 = new JSplitPane(); - JSplitPane jSplitPane4 = new JSplitPane(); - JScrollPane jScrollPane2 = new JScrollPane(); - JScrollPane jScrollPane5 = new JScrollPane(); - JScrollPane jScrollPane6 = new JScrollPane(); - JScrollPane jScrollPane7 = new JScrollPane(); - JList pass3aJList = new JList(); - JList pass3bJList = new JList(); - JTextPane pass3aTextPane = new JTextPane(); - JTextPane pass3bTextPane = new JTextPane(); - JMenu jMenu2 = new JMenu(); - JMenuItem whatisMenuItem = new JMenuItem(); - JMenuItem aboutMenuItem = new JMenuItem(); - - - /** Constructor. */ - public VerifierAppFrame() { - enableEvents(AWTEvent.WINDOW_EVENT_MASK); - try { - jbInit(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - /** Initizalization of the components. */ - private void jbInit() throws Exception { - //setIconImage(Toolkit.getDefaultToolkit().createImage(Frame1.class.getResource("[Ihr Symbol]"))); - contentPane = (JPanel) this.getContentPane(); - contentPane.setLayout(cardLayout1); - this.setJMenuBar(jMenuBar1); - this.setSize(new Dimension(708, 451)); - this.setTitle("JustIce"); - jPanel1.setMinimumSize(new Dimension(100, 100)); - jPanel1.setPreferredSize(new Dimension(100, 100)); - jPanel1.setLayout(gridLayout1); - jSplitPane2.setOrientation(JSplitPane.VERTICAL_SPLIT); - jPanel2.setLayout(gridLayout2); - jPanel3.setMinimumSize(new Dimension(200, 100)); - jPanel3.setPreferredSize(new Dimension(400, 400)); - jPanel3.setLayout(gridLayout4); - messagesPanel.setMinimumSize(new Dimension(100, 100)); - messagesPanel.setLayout(gridLayout3); - jPanel2.setMinimumSize(new Dimension(200, 100)); - jMenu1.setText("File"); - jScrollPane1.getViewport().setBackground(Color.red); - messagesScrollPane.getViewport().setBackground(Color.red); - messagesScrollPane.setPreferredSize(new Dimension(10, 10)); - classNamesJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { - - public void valueChanged( ListSelectionEvent e ) { - classNamesJList_valueChanged(e); - } - }); - classNamesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - jScrollPane3.setBorder(BorderFactory.createLineBorder(Color.black)); - jScrollPane3.setPreferredSize(new Dimension(100, 100)); - gridLayout4.setRows(4); - gridLayout4.setColumns(1); - gridLayout4.setHgap(1); - jScrollPane4.setBorder(BorderFactory.createLineBorder(Color.black)); - jScrollPane4.setPreferredSize(new Dimension(100, 100)); - pass1TextPane.setBorder(BorderFactory.createRaisedBevelBorder()); - pass1TextPane.setToolTipText(""); - pass1TextPane.setEditable(false); - pass2TextPane.setBorder(BorderFactory.createRaisedBevelBorder()); - pass2TextPane.setEditable(false); - messagesTextPane.setBorder(BorderFactory.createRaisedBevelBorder()); - messagesTextPane.setEditable(false); - newFileMenuItem.setText("New..."); - newFileMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(78, - java.awt.event.KeyEvent.CTRL_MASK, true)); - newFileMenuItem.addActionListener(new java.awt.event.ActionListener() { - - public void actionPerformed( ActionEvent e ) { - newFileMenuItem_actionPerformed(e); - } - }); - pass3aTextPane.setEditable(false); - pass3bTextPane.setEditable(false); - pass3aJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { - - public void valueChanged( ListSelectionEvent e ) { - pass3aJList_valueChanged(e); - } - }); - pass3bJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { - - public void valueChanged( ListSelectionEvent e ) { - pass3bJList_valueChanged(e); - } - }); - jMenu2.setText("Help"); - whatisMenuItem.setText("What is..."); - whatisMenuItem.addActionListener(new java.awt.event.ActionListener() { - - public void actionPerformed( ActionEvent e ) { - whatisMenuItem_actionPerformed(e); - } - }); - aboutMenuItem.setText("About"); - aboutMenuItem.addActionListener(new java.awt.event.ActionListener() { - - public void actionPerformed( ActionEvent e ) { - aboutMenuItem_actionPerformed(e); - } - }); - jSplitPane2.add(messagesPanel, JSplitPane.BOTTOM); - messagesPanel.add(messagesScrollPane, null); - messagesScrollPane.getViewport().add(messagesTextPane, null); - jSplitPane2.add(jPanel3, JSplitPane.TOP); - jPanel3.add(jScrollPane3, null); - jScrollPane3.getViewport().add(pass1TextPane, null); - jPanel3.add(jScrollPane4, null); - jPanel3.add(jSplitPane3, null); - jSplitPane3.add(jScrollPane2, JSplitPane.LEFT); - jScrollPane2.getViewport().add(pass3aJList, null); - jSplitPane3.add(jScrollPane5, JSplitPane.RIGHT); - jScrollPane5.getViewport().add(pass3aTextPane, null); - jPanel3.add(jSplitPane4, null); - jSplitPane4.add(jScrollPane6, JSplitPane.LEFT); - jScrollPane6.getViewport().add(pass3bJList, null); - jSplitPane4.add(jScrollPane7, JSplitPane.RIGHT); - jScrollPane7.getViewport().add(pass3bTextPane, null); - jScrollPane4.getViewport().add(pass2TextPane, null); - jSplitPane1.add(jPanel2, JSplitPane.TOP); - jPanel2.add(jScrollPane1, null); - jSplitPane1.add(jPanel1, JSplitPane.BOTTOM); - jPanel1.add(jSplitPane2, null); - jScrollPane1.getViewport().add(classNamesJList, null); - jMenuBar1.add(jMenu1); - jMenuBar1.add(jMenu2); - contentPane.add(jSplitPane1, "jSplitPane1"); - jMenu1.add(newFileMenuItem); - jMenu2.add(whatisMenuItem); - jMenu2.add(aboutMenuItem); - jSplitPane2.setDividerLocation(300); - jSplitPane3.setDividerLocation(150); - jSplitPane4.setDividerLocation(150); - } - - - /** Overridden to stop the application on a closing window. */ - protected void processWindowEvent( WindowEvent e ) { - super.processWindowEvent(e); - if (e.getID() == WindowEvent.WINDOW_CLOSING) { - System.exit(0); - } - } - - - synchronized void classNamesJList_valueChanged( ListSelectionEvent e ) { - if (e.getValueIsAdjusting()) { - return; - } - current_class = classNamesJList.getSelectedValue().toString(); - try { - verify(); - } catch (ClassNotFoundException ex) { - // FIXME: report the error using the GUI - ex.printStackTrace(); - } - classNamesJList.setSelectedValue(current_class, true); - } - - - private void verify() throws ClassNotFoundException { - setTitle("PLEASE WAIT"); - Verifier v = VerifierFactory.getVerifier(current_class); - v.flush(); // Don't cache the verification result for this class. - VerificationResult vr; - vr = v.doPass1(); - if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { - pass1TextPane.setText(vr.getMessage()); - pass1TextPane.setBackground(Color.red); - pass2TextPane.setText(""); - pass2TextPane.setBackground(Color.yellow); - pass3aTextPane.setText(""); - pass3aJList.setListData(new Object[0]); - pass3aTextPane.setBackground(Color.yellow); - pass3bTextPane.setText(""); - pass3bJList.setListData(new Object[0]); - pass3bTextPane.setBackground(Color.yellow); - } else { // Must be VERIFIED_OK, Pass 1 does not know VERIFIED_NOTYET - pass1TextPane.setBackground(Color.green); - pass1TextPane.setText(vr.getMessage()); - vr = v.doPass2(); - if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { - pass2TextPane.setText(vr.getMessage()); - pass2TextPane.setBackground(Color.red); - pass3aTextPane.setText(""); - pass3aTextPane.setBackground(Color.yellow); - pass3aJList.setListData(new Object[0]); - pass3bTextPane.setText(""); - pass3bTextPane.setBackground(Color.yellow); - pass3bJList.setListData(new Object[0]); - } else { // must be Verified_OK, because Pass1 was OK (cannot be Verified_NOTYET). - pass2TextPane.setText(vr.getMessage()); - pass2TextPane.setBackground(Color.green); - JavaClass jc = Repository.lookupClass(current_class); - /* - boolean all3aok = true; - boolean all3bok = true; - String all3amsg = ""; - String all3bmsg = ""; - */ - String[] methodnames = new String[jc.getMethods().length]; - for (int i = 0; i < jc.getMethods().length; i++) { - methodnames[i] = jc.getMethods()[i].toString().replace('\n', ' ').replace('\t', - ' '); - } - pass3aJList.setListData(methodnames); - pass3aJList.setSelectionInterval(0, jc.getMethods().length - 1); - pass3bJList.setListData(methodnames); - pass3bJList.setSelectionInterval(0, jc.getMethods().length - 1); - } - } - String[] msgs = v.getMessages(); - messagesTextPane.setBackground(msgs.length == 0 ? Color.green : Color.yellow); - String allmsgs = ""; - for (int i = 0; i < msgs.length; i++) { - msgs[i] = msgs[i].replace('\n', ' '); - allmsgs += msgs[i] + "\n\n"; - } - messagesTextPane.setText(allmsgs); - setTitle(current_class + " - " + JUSTICE_VERSION); - } - - - void newFileMenuItem_actionPerformed( ActionEvent e ) { - String classname = JOptionPane - .showInputDialog("Please enter the fully qualified name of a class or interface to verify:"); - if ((classname == null) || (classname.equals(""))) { - return; - } - VerifierFactory.getVerifier(classname); // let observers do the rest. - classNamesJList.setSelectedValue(classname, true); - } - - - synchronized void pass3aJList_valueChanged( ListSelectionEvent e ) { - if (e.getValueIsAdjusting()) { - return; - } - Verifier v = VerifierFactory.getVerifier(current_class); - String all3amsg = ""; - boolean all3aok = true; - boolean rejected = false; - for (int i = 0; i < pass3aJList.getModel().getSize(); i++) { - if (pass3aJList.isSelectedIndex(i)) { - VerificationResult vr = v.doPass3a(i); - if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { - all3aok = false; - rejected = true; - } - JavaClass jc = null; - try { - jc = Repository.lookupClass(v.getClassName()); - all3amsg += "Method '" + jc.getMethods()[i] + "': " - + vr.getMessage().replace('\n', ' ') + "\n\n"; - } catch (ClassNotFoundException ex) { - // FIXME: handle the error - ex.printStackTrace(); - } - } - } - pass3aTextPane.setText(all3amsg); - pass3aTextPane.setBackground(all3aok ? Color.green : (rejected ? Color.red : Color.yellow)); - } - - - synchronized void pass3bJList_valueChanged( ListSelectionEvent e ) { - if (e.getValueIsAdjusting()) { - return; - } - Verifier v = VerifierFactory.getVerifier(current_class); - String all3bmsg = ""; - boolean all3bok = true; - boolean rejected = false; - for (int i = 0; i < pass3bJList.getModel().getSize(); i++) { - if (pass3bJList.isSelectedIndex(i)) { - VerificationResult vr = v.doPass3b(i); - if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { - all3bok = false; - rejected = true; - } - JavaClass jc = null; - try { - jc = Repository.lookupClass(v.getClassName()); - all3bmsg += "Method '" + jc.getMethods()[i] + "': " - + vr.getMessage().replace('\n', ' ') + "\n\n"; - } catch (ClassNotFoundException ex) { - // FIXME: handle the error - ex.printStackTrace(); - } - } - } - pass3bTextPane.setText(all3bmsg); - pass3bTextPane.setBackground(all3bok ? Color.green : (rejected ? Color.red : Color.yellow)); - } - - - void aboutMenuItem_actionPerformed( ActionEvent e ) { - JOptionPane - .showMessageDialog( - this, - "JustIce is a Java class file verifier.\nIt was implemented by Enver Haase in 2001, 2002.\n", - JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); - } - - - void whatisMenuItem_actionPerformed( ActionEvent e ) { - JOptionPane - .showMessageDialog( - this, - "The upper four boxes to the right reflect verification passes according to The Java Virtual Machine Specification.\nThese are (in that order): Pass one, Pass two, Pass three (before data flow analysis), Pass three (data flow analysis).\nThe bottom box to the right shows (warning) messages; warnings do not cause a class to be rejected.", - JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java deleted file mode 100644 index 2d8a973a..00000000 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Vector; - -/** - * This class produces instances of the Verifier class. Its purpose is to make - * sure that they are singleton instances with respect to the class name they - * operate on. That means, for every class (represented by a unique fully qualified - * class name) there is exactly one Verifier. - * - * @version $Id$ - * @author Enver Haase - * @see org.apache.bcel.verifier.Verifier - */ -public class VerifierFactory { - - /** - * The HashMap that holds the data about the already-constructed Verifier instances. - */ - private static Map hashMap = new HashMap(); - /** - * The VerifierFactoryObserver instances that observe the VerifierFactory. - */ - private static List observers = new Vector(); - - - /** - * The VerifierFactory is not instantiable. - */ - private VerifierFactory() { - } - - - /** - * Returns the (only) verifier responsible for the class with the given name. - * Possibly a new Verifier object is transparently created. - * @return the (only) verifier responsible for the class with the given name. - */ - public static Verifier getVerifier( String fully_qualified_classname ) { - Verifier v = (Verifier) (hashMap.get(fully_qualified_classname)); - if (v == null) { - v = new Verifier(fully_qualified_classname); - hashMap.put(fully_qualified_classname, v); - notify(fully_qualified_classname); - } - return v; - } - - - /** - * Notifies the observers of a newly generated Verifier. - */ - private static void notify( String fully_qualified_classname ) { - // notify the observers - Iterator i = observers.iterator(); - while (i.hasNext()) { - VerifierFactoryObserver vfo = (VerifierFactoryObserver) i.next(); - vfo.update(fully_qualified_classname); - } - } - - - /** - * Returns all Verifier instances created so far. - * This is useful when a Verifier recursively lets - * the VerifierFactory create other Verifier instances - * and if you want to verify the transitive hull of - * referenced class files. - */ - public static Verifier[] getVerifiers() { - Verifier[] vs = new Verifier[hashMap.values().size()]; - return (Verifier[]) (hashMap.values().toArray(vs)); // Because vs is big enough, vs is used to store the values into and returned! - } - - - /** - * Adds the VerifierFactoryObserver o to the list of observers. - */ - public static void attach( VerifierFactoryObserver o ) { - observers.add(o); - } - - - /** - * Removes the VerifierFactoryObserver o from the list of observers. - */ - public static void detach( VerifierFactoryObserver o ) { - observers.remove(o); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java deleted file mode 100644 index abf1950f..00000000 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier; - -import javax.swing.event.ListDataEvent; - -/** - * This class implements an adapter; it implements both a Swing ListModel and - * a VerifierFactoryObserver. - * - * @version $Id$ - * @author Enver Haase - */ -public class VerifierFactoryListModel implements org.apache.bcel.verifier.VerifierFactoryObserver, - javax.swing.ListModel { - - private java.util.ArrayList listeners = new java.util.ArrayList(); - private java.util.TreeSet cache = new java.util.TreeSet(); - - - public VerifierFactoryListModel() { - VerifierFactory.attach(this); - update(null); // fill cache. - } - - - public synchronized void update( String s ) { - int size = listeners.size(); - Verifier[] verifiers = VerifierFactory.getVerifiers(); - int num_of_verifiers = verifiers.length; - cache.clear(); - for (int i = 0; i < num_of_verifiers; i++) { - cache.add(verifiers[i].getClassName()); - } - for (int i = 0; i < size; i++) { - ListDataEvent e = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, - num_of_verifiers - 1); - ((javax.swing.event.ListDataListener) (listeners.get(i))).contentsChanged(e); - } - } - - - public synchronized void addListDataListener( javax.swing.event.ListDataListener l ) { - listeners.add(l); - } - - - public synchronized void removeListDataListener( javax.swing.event.ListDataListener l ) { - listeners.remove(l); - } - - - public synchronized int getSize() { - return cache.size(); - } - - - public synchronized Object getElementAt( int index ) { - return (cache.toArray())[index]; - } -} diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java deleted file mode 100644 index ea909328..00000000 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier; - -/** - * VerifierFactoryObserver instances are notified when new Verifier - * instances are created. - * - * @version $Id$ - * @author Enver Haase - * - * @see VerifierFactory#getVerifier(String) - * @see VerifierFactory#getVerifiers() - * @see VerifierFactory#attach(VerifierFactoryObserver) - * @see VerifierFactory#detach(VerifierFactoryObserver) - */ -public interface VerifierFactoryObserver { - - /** - * VerifierFactoryObserver instances are notified invoking this method. - * The String argument is the fully qualified class name of a class a - * new Verifier instance created by the VerifierFactory operates on. - */ - public void update( String s ); -} diff --git a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java deleted file mode 100644 index d37f11f3..00000000 --- a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java +++ /dev/null @@ -1,553 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier; - -import java.awt.Color; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; - -/** - * A class for simple graphical class file verification. - * Use the main(String []) method with fully qualified - * class names as arguments to use it as a stand-alone - * application. - * Use the VerifyDialog(String) constructor to use this - * class in your application. - * [This class was created using VisualAge for Java, - * but it does not work under VAJ itself (Version 3.02 JDK 1.2)] - * @version $Id$ - * @author Enver Haase - * @see #main(String[]) - * @see #VerifyDialog(String) - */ -public class VerifyDialog extends javax.swing.JDialog { - - /** Machine-generated. */ - private javax.swing.JPanel ivjJDialogContentPane = null; - /** Machine-generated. */ - private javax.swing.JPanel ivjPass1Panel = null; - /** Machine-generated. */ - private javax.swing.JPanel ivjPass2Panel = null; - /** Machine-generated. */ - private javax.swing.JPanel ivjPass3Panel = null; - /** Machine-generated. */ - private javax.swing.JButton ivjPass1Button = null; - /** Machine-generated. */ - private javax.swing.JButton ivjPass2Button = null; - /** Machine-generated. */ - private javax.swing.JButton ivjPass3Button = null; - /** Machine-generated. */ - IvjEventHandler ivjEventHandler = new IvjEventHandler(); - /** - * The class to verify. Default set to 'java.lang.Object' - * in case this class is instantiated via one of the many - * machine-generated constructors. - */ - private String class_name = "java.lang.Object"; - /** - * This field is here to count the number of open VerifyDialog - * instances so the JVM can be exited afer every Dialog had been - * closed. - */ - private static int classes_to_verify; - - /** Machine-generated. */ - class IvjEventHandler implements java.awt.event.ActionListener { - - public void actionPerformed( java.awt.event.ActionEvent e ) { - if (e.getSource() == VerifyDialog.this.getPass1Button()) { - connEtoC1(e); - } - if (e.getSource() == VerifyDialog.this.getPass2Button()) { - connEtoC2(e); - } - if (e.getSource() == VerifyDialog.this.getPass3Button()) { - connEtoC3(e); - } - if (e.getSource() == VerifyDialog.this.getFlushButton()) { - connEtoC4(e); - } - }; - }; - - /** Machine-generated. */ - private javax.swing.JButton ivjFlushButton = null; - - - /** Machine-generated. */ - public VerifyDialog() { - super(); - initialize(); - } - - - /** Machine-generated. */ - public VerifyDialog(java.awt.Dialog owner) { - super(owner); - } - - - /** Machine-generated. */ - public VerifyDialog(java.awt.Dialog owner, String title) { - super(owner, title); - } - - - /** Machine-generated. */ - public VerifyDialog(java.awt.Dialog owner, String title, boolean modal) { - super(owner, title, modal); - } - - - /** Machine-generated. */ - public VerifyDialog(java.awt.Dialog owner, boolean modal) { - super(owner, modal); - } - - - /** Machine-generated. */ - public VerifyDialog(java.awt.Frame owner) { - super(owner); - } - - - /** Machine-generated. */ - public VerifyDialog(java.awt.Frame owner, String title) { - super(owner, title); - } - - - /** Machine-generated. */ - public VerifyDialog(java.awt.Frame owner, String title, boolean modal) { - super(owner, title, modal); - } - - - /** Machine-generated. */ - public VerifyDialog(java.awt.Frame owner, boolean modal) { - super(owner, modal); - } - - - /** - * Use this constructor if you want a possibility to verify other - * class files than java.lang.Object. - * @param fully_qualified_class_name java.lang.String - */ - public VerifyDialog(String fully_qualified_class_name) { - super(); - int dotclasspos = fully_qualified_class_name.lastIndexOf(".class"); - if (dotclasspos != -1) { - fully_qualified_class_name = fully_qualified_class_name.substring(0, dotclasspos); - } - fully_qualified_class_name = fully_qualified_class_name.replace('/', '.'); - class_name = fully_qualified_class_name; - initialize(); - } - - - /** Machine-generated. */ - private void connEtoC1( java.awt.event.ActionEvent arg1 ) { - try { - // user code begin {1} - // user code end - this.pass1Button_ActionPerformed(arg1); - // user code begin {2} - // user code end - } catch (java.lang.Throwable ivjExc) { - // user code begin {3} - // user code end - handleException(ivjExc); - } - } - - - /** Machine-generated. */ - private void connEtoC2( java.awt.event.ActionEvent arg1 ) { - try { - // user code begin {1} - // user code end - this.pass2Button_ActionPerformed(arg1); - // user code begin {2} - // user code end - } catch (java.lang.Throwable ivjExc) { - // user code begin {3} - // user code end - handleException(ivjExc); - } - } - - - /** Machine-generated. */ - private void connEtoC3( java.awt.event.ActionEvent arg1 ) { - try { - // user code begin {1} - // user code end - this.pass4Button_ActionPerformed(arg1); - // user code begin {2} - // user code end - } catch (java.lang.Throwable ivjExc) { - // user code begin {3} - // user code end - handleException(ivjExc); - } - } - - - /** Machine-generated. */ - private void connEtoC4( java.awt.event.ActionEvent arg1 ) { - try { - // user code begin {1} - // user code end - this.flushButton_ActionPerformed(arg1); - // user code begin {2} - // user code end - } catch (java.lang.Throwable ivjExc) { - // user code begin {3} - // user code end - handleException(ivjExc); - } - } - - - /** Machine-generated. */ - public void flushButton_ActionPerformed( java.awt.event.ActionEvent actionEvent ) { - VerifierFactory.getVerifier(class_name).flush(); - Repository.removeClass(class_name); // Make sure it will be reloaded. - getPass1Panel().setBackground(Color.gray); - getPass1Panel().repaint(); - getPass2Panel().setBackground(Color.gray); - getPass2Panel().repaint(); - getPass3Panel().setBackground(Color.gray); - getPass3Panel().repaint(); - } - - - /** Machine-generated. */ - private javax.swing.JButton getFlushButton() { - if (ivjFlushButton == null) { - try { - ivjFlushButton = new javax.swing.JButton(); - ivjFlushButton.setName("FlushButton"); - ivjFlushButton.setText("Flush: Forget old verification results"); - ivjFlushButton.setBackground(java.awt.SystemColor.controlHighlight); - ivjFlushButton.setBounds(60, 215, 300, 30); - ivjFlushButton.setForeground(java.awt.Color.red); - ivjFlushButton.setActionCommand("FlushButton"); - // user code begin {1} - // user code end - } catch (java.lang.Throwable ivjExc) { - // user code begin {2} - // user code end - handleException(ivjExc); - } - } - return ivjFlushButton; - } - - - /** Machine-generated. */ - private javax.swing.JPanel getJDialogContentPane() { - if (ivjJDialogContentPane == null) { - try { - ivjJDialogContentPane = new javax.swing.JPanel(); - ivjJDialogContentPane.setName("JDialogContentPane"); - ivjJDialogContentPane.setLayout(null); - getJDialogContentPane().add(getPass1Panel(), getPass1Panel().getName()); - getJDialogContentPane().add(getPass3Panel(), getPass3Panel().getName()); - getJDialogContentPane().add(getPass2Panel(), getPass2Panel().getName()); - getJDialogContentPane().add(getPass1Button(), getPass1Button().getName()); - getJDialogContentPane().add(getPass2Button(), getPass2Button().getName()); - getJDialogContentPane().add(getPass3Button(), getPass3Button().getName()); - getJDialogContentPane().add(getFlushButton(), getFlushButton().getName()); - // user code begin {1} - // user code end - } catch (java.lang.Throwable ivjExc) { - // user code begin {2} - // user code end - handleException(ivjExc); - } - } - return ivjJDialogContentPane; - } - - - /** Machine-generated. */ - private javax.swing.JButton getPass1Button() { - if (ivjPass1Button == null) { - try { - ivjPass1Button = new javax.swing.JButton(); - ivjPass1Button.setName("Pass1Button"); - ivjPass1Button.setText("Pass1: Verify binary layout of .class file"); - ivjPass1Button.setBackground(java.awt.SystemColor.controlHighlight); - ivjPass1Button.setBounds(100, 40, 300, 30); - ivjPass1Button.setActionCommand("Button1"); - // user code begin {1} - // user code end - } catch (java.lang.Throwable ivjExc) { - // user code begin {2} - // user code end - handleException(ivjExc); - } - } - return ivjPass1Button; - } - - - /** Machine-generated. */ - private javax.swing.JPanel getPass1Panel() { - if (ivjPass1Panel == null) { - try { - ivjPass1Panel = new javax.swing.JPanel(); - ivjPass1Panel.setName("Pass1Panel"); - ivjPass1Panel.setLayout(null); - ivjPass1Panel.setBackground(java.awt.SystemColor.controlShadow); - ivjPass1Panel.setBounds(30, 30, 50, 50); - // user code begin {1} - // user code end - } catch (java.lang.Throwable ivjExc) { - // user code begin {2} - // user code end - handleException(ivjExc); - } - } - return ivjPass1Panel; - } - - - /** Machine-generated. */ - private javax.swing.JButton getPass2Button() { - if (ivjPass2Button == null) { - try { - ivjPass2Button = new javax.swing.JButton(); - ivjPass2Button.setName("Pass2Button"); - ivjPass2Button.setText("Pass 2: Verify static .class file constraints"); - ivjPass2Button.setBackground(java.awt.SystemColor.controlHighlight); - ivjPass2Button.setBounds(100, 100, 300, 30); - ivjPass2Button.setActionCommand("Button2"); - // user code begin {1} - // user code end - } catch (java.lang.Throwable ivjExc) { - // user code begin {2} - // user code end - handleException(ivjExc); - } - } - return ivjPass2Button; - } - - - /** Machine-generated. */ - private javax.swing.JPanel getPass2Panel() { - if (ivjPass2Panel == null) { - try { - ivjPass2Panel = new javax.swing.JPanel(); - ivjPass2Panel.setName("Pass2Panel"); - ivjPass2Panel.setLayout(null); - ivjPass2Panel.setBackground(java.awt.SystemColor.controlShadow); - ivjPass2Panel.setBounds(30, 90, 50, 50); - // user code begin {1} - // user code end - } catch (java.lang.Throwable ivjExc) { - // user code begin {2} - // user code end - handleException(ivjExc); - } - } - return ivjPass2Panel; - } - - - /** Machine-generated. */ - private javax.swing.JButton getPass3Button() { - if (ivjPass3Button == null) { - try { - ivjPass3Button = new javax.swing.JButton(); - ivjPass3Button.setName("Pass3Button"); - ivjPass3Button.setText("Passes 3a+3b: Verify code arrays"); - ivjPass3Button.setBackground(java.awt.SystemColor.controlHighlight); - ivjPass3Button.setBounds(100, 160, 300, 30); - ivjPass3Button.setActionCommand("Button2"); - // user code begin {1} - // user code end - } catch (java.lang.Throwable ivjExc) { - // user code begin {2} - // user code end - handleException(ivjExc); - } - } - return ivjPass3Button; - } - - - /** Machine-generated. */ - private javax.swing.JPanel getPass3Panel() { - if (ivjPass3Panel == null) { - try { - ivjPass3Panel = new javax.swing.JPanel(); - ivjPass3Panel.setName("Pass3Panel"); - ivjPass3Panel.setLayout(null); - ivjPass3Panel.setBackground(java.awt.SystemColor.controlShadow); - ivjPass3Panel.setBounds(30, 150, 50, 50); - // user code begin {1} - // user code end - } catch (java.lang.Throwable ivjExc) { - // user code begin {2} - // user code end - handleException(ivjExc); - } - } - return ivjPass3Panel; - } - - - /** Machine-generated. */ - private void handleException( java.lang.Throwable exception ) { - /* Uncomment the following lines to print uncaught exceptions to stdout */ - System.out.println("--------- UNCAUGHT EXCEPTION ---------"); - exception.printStackTrace(System.out); - } - - - /** Machine-generated. */ - private void initConnections() throws java.lang.Exception { - // user code begin {1} - // user code end - getPass1Button().addActionListener(ivjEventHandler); - getPass2Button().addActionListener(ivjEventHandler); - getPass3Button().addActionListener(ivjEventHandler); - getFlushButton().addActionListener(ivjEventHandler); - } - - - /** Machine-generated. */ - private void initialize() { - try { - // user code begin {1} - // user code end - setName("VerifyDialog"); - setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - setSize(430, 280); - setVisible(true); - setModal(true); - setResizable(false); - setContentPane(getJDialogContentPane()); - initConnections(); - } catch (java.lang.Throwable ivjExc) { - handleException(ivjExc); - } - // user code begin {2} - setTitle("'" + class_name + "' verification - JustIce / BCEL"); - // user code end - } - - - /** - * Verifies one or more class files. - * Verification results are presented graphically: Red means 'rejected', - * green means 'passed' while yellow means 'could not be verified yet'. - * @param args java.lang.String[] fully qualified names of classes to verify. - */ - public static void main( java.lang.String[] args ) { - classes_to_verify = args.length; - for (int i = 0; i < args.length; i++) { - try { - VerifyDialog aVerifyDialog; - aVerifyDialog = new VerifyDialog(args[i]); - aVerifyDialog.setModal(true); - aVerifyDialog.addWindowListener(new java.awt.event.WindowAdapter() { - - public void windowClosing( java.awt.event.WindowEvent e ) { - classes_to_verify--; - if (classes_to_verify == 0) { - System.exit(0); - } - }; - }); - aVerifyDialog.setVisible(true); - } catch (Throwable exception) { - System.err.println("Exception occurred in main() of javax.swing.JDialog"); - exception.printStackTrace(System.out); - } - } - } - - - /** Machine-generated. */ - public void pass1Button_ActionPerformed( java.awt.event.ActionEvent actionEvent ) { - Verifier v = VerifierFactory.getVerifier(class_name); - VerificationResult vr = v.doPass1(); - if (vr.getStatus() == VerificationResult.VERIFIED_OK) { - getPass1Panel().setBackground(Color.green); - getPass1Panel().repaint(); - } - if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { - getPass1Panel().setBackground(Color.red); - getPass1Panel().repaint(); - } - } - - - /** Machine-generated. */ - public void pass2Button_ActionPerformed( java.awt.event.ActionEvent actionEvent ) { - pass1Button_ActionPerformed(actionEvent); - Verifier v = VerifierFactory.getVerifier(class_name); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() == VerificationResult.VERIFIED_OK) { - getPass2Panel().setBackground(Color.green); - getPass2Panel().repaint(); - } - if (vr.getStatus() == VerificationResult.VERIFIED_NOTYET) { - getPass2Panel().setBackground(Color.yellow); - getPass2Panel().repaint(); - } - if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { - getPass2Panel().setBackground(Color.red); - getPass2Panel().repaint(); - } - } - - - /** Machine-generated. */ - public void pass4Button_ActionPerformed( java.awt.event.ActionEvent actionEvent ) { - pass2Button_ActionPerformed(actionEvent); - Color color = Color.green; - Verifier v = VerifierFactory.getVerifier(class_name); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() == VerificationResult.VERIFIED_OK) { - JavaClass jc = null; - try { - jc = Repository.lookupClass(class_name); - int nr = jc.getMethods().length; - for (int i = 0; i < nr; i++) { - vr = v.doPass3b(i); - if (vr.getStatus() != VerificationResult.VERIFIED_OK) { - color = Color.red; - break; - } - } - } catch (ClassNotFoundException ex) { - // FIXME: report the error - ex.printStackTrace(); - } - } else { - color = Color.yellow; - } - getPass3Panel().setBackground(color); - getPass3Panel().repaint(); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java deleted file mode 100644 index 4bb12973..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - - -/** - * Instances of this class should never be thrown. When such an instance is thrown, - * this is due to an INTERNAL ERROR of BCEL's class file verifier "JustIce". - * - * @version $Id$ - * @author Enver Haase - */ -public final class AssertionViolatedException extends RuntimeException{ - /** The error message. */ - private String detailMessage; - /** Constructs a new AssertionViolatedException with null as its error message string. */ - public AssertionViolatedException(){ - super(); - } - /** - * Constructs a new AssertionViolatedException with the specified error message preceded - * by "INTERNAL ERROR: ". - */ - public AssertionViolatedException(String message){ - super(message = "INTERNAL ERROR: "+message); // Thanks to Java, the constructor call here must be first. - detailMessage=message; - } - /** - * Constructs a new AssertionViolationException with the specified error message and initial cause - */ - public AssertionViolatedException(String message, Throwable initCause) { - super(message = "INTERNAL ERROR: "+message, initCause); - detailMessage=message; - } - /** Extends the error message with a string before ("pre") and after ("post") the - 'old' error message. All of these three strings are allowed to be null, and null - is always replaced by the empty string (""). In particular, after invoking this - method, the error message of this object can no longer be null. - */ - public void extendMessage(String pre, String post){ - if (pre == null) { - pre=""; - } - if (detailMessage == null) { - detailMessage=""; - } - if (post == null) { - post=""; - } - detailMessage = pre+detailMessage+post; - } - /** - * Returns the error message string of this AssertionViolatedException object. - * @return the error message string of this AssertionViolatedException. - */ - public String getMessage(){ - return detailMessage; - } - - /** - * DO NOT USE. It's for experimental testing during development only. - */ - public static void main(String[] args){ - AssertionViolatedException ave = new AssertionViolatedException("Oops!"); - ave.extendMessage("\nFOUND:\n\t","\nExiting!!\n"); - throw ave; - } - -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java deleted file mode 100644 index 11a88a40..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - - -/** - * Instances of this class are thrown by BCEL's class file verifier "JustIce" - * when a class file to verify does not pass the verification pass 2 as described - * in the Java Virtual Machine specification, 2nd edition. - * - * @version $Id$ - * @author Enver Haase - */ -public class ClassConstraintException extends VerificationException{ - /** - * Constructs a new ClassConstraintException with null as its error message string. - */ - public ClassConstraintException(){ - super(); - } - - /** - * Constructs a new ClassConstraintException with the specified error message. - */ - public ClassConstraintException(String message){ - super (message); - } - - /** - * Constructs a new ClassConstraintException with the specified error message and cause - */ - public ClassConstraintException(String message, Throwable initCause){ - super(message, initCause); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java deleted file mode 100644 index 1ff8fb0a..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - -/** - * Instances of this class are thrown by BCEL's class file verifier "JustIce" when - * a class file does not pass the verification pass 3. Note that the pass 3 used by - * "JustIce" involves verification that is usually delayed to pass 4. - * - * @version $Id$ - * @author Enver Haase - */ -public abstract class CodeConstraintException extends VerificationException{ - /** - * Constructs a new CodeConstraintException with null as its error message string. - */ - CodeConstraintException(){ - super(); - } - /** - * Constructs a new CodeConstraintException with the specified error message. - */ - CodeConstraintException(String message){ - super(message); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java deleted file mode 100644 index 7b5d1230..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - -/** - * Instances of this class are thrown by BCEL's class file verifier "JustIce" - * when the verification of a method is requested that does not exist. - * - * @version $Id$ - * @author Enver Haase - */ -public class InvalidMethodException extends RuntimeException{ - - /** Constructs an InvalidMethodException with the specified detail message. */ - public InvalidMethodException(String message){ - super(message); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java deleted file mode 100644 index 79ab38b3..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - -/** - * Instances of this class are thrown by BCEL's class file verifier "JustIce" when - * a class file to verify does not pass the verification pass 3 because of a violation - * of a constraint that is usually only verified at run-time (pass 4). - * The Java Virtual Machine Specification, 2nd edition, states that certain constraints - * are usually verified at run-time for performance reasons (the verification of those - * constraints requires loading in and recursively verifying referenced classes) that - * conceptually belong to pass 3; to be precise, that conceptually belong to the - * data flow analysis of pass 3 (called pass 3b in JustIce). - * These are the checks necessary for resolution: Compare pages 142-143 ("4.9.1 The - * Verification Process") and pages 50-51 ("2.17.3 Linking: Verification, Preparation, - * and Resolution") of the above mentioned book. - * TODO: At this time, this class is not used in JustIce. - * - * @version $Id$ - * @author Enver Haase - */ -public class LinkingConstraintException extends StructuralCodeConstraintException{ -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java deleted file mode 100644 index 38949ab1..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - - -/** - * When loading a class file, BCEL will throw an instance of LoadingException if - * the class file is malformed; so it is not conforming to the "Pass 1" verification - * process as described in the Java Virtual Machine specification, 2nd. edition. - * @version $Id$ - * @author Enver Haase - */ -public class LoadingException extends VerifierConstraintViolatedException{ - - /** - * Constructs a new LoadingException with null as its error message string. - */ - public LoadingException(){ - super(); - } - - /** - * Constructs a new LoadingException with the specified error message. - */ - public LoadingException(String message){ - super (message); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java deleted file mode 100644 index 03289611..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - - -/** - * A LocalVariableInfoInconsistentException instance is thrown by - * the LocalVariableInfo class when it detects that the information - * it holds is inconsistent; this is normally due to inconsistent - * LocalVariableTable entries in the Code attribute of a certain - * Method object. - * - * @version $Id$ - * @author Enver Haase - */ -public class LocalVariableInfoInconsistentException extends ClassConstraintException{ - /** - * Constructs a new LocalVariableInfoInconsistentException with null as its error message string. - */ - public LocalVariableInfoInconsistentException(){ - super(); - } - - /** - * Constructs a new LocalVariableInfoInconsistentException with the specified error message. - */ - public LocalVariableInfoInconsistentException(String message){ - super (message); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java deleted file mode 100644 index 3e7809e2..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - - -/** - * Instances of this class are thrown by BCEL's class file verifier "JustIce" when - * a class file to verify does not pass the verification pass 3 because of a violation - * of a static constraint as described in the Java Virtual Machine Specification, - * 2nd edition, 4.8.1, pages 133-137. The static constraints checking part of pass 3 - * is called pass 3a in JustIce. - * - * @version $Id$ - * @author Enver Haase - */ -public abstract class StaticCodeConstraintException extends CodeConstraintException{ - public StaticCodeConstraintException(String message){ - super(message); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java deleted file mode 100644 index d8c1f293..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - - -/** - * Instances of this class are thrown by BCEL's class file verifier "JustIce" when - * a class file to verify does not pass the verification pass 3 because of a violation - * of a static constraint as described in the Java Virtual Machine Specification, - * Second edition, 4.8.1, pages 133-137. The static constraints checking part of pass 3 - * is called pass 3a in JustIce. - * Static constraints on the instructions in the code array are checked early in - * pass 3a and are described on page 134 in the Java Virtual Machine Specification, - * Second Edition. - * - * @version $Id$ - * @author Enver Haase - */ -public class StaticCodeInstructionConstraintException extends StaticCodeConstraintException{ - public StaticCodeInstructionConstraintException(String message){ - super(message); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java deleted file mode 100644 index 088289d4..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - - -/** - * Instances of this class are thrown by BCEL's class file verifier "JustIce" when - * a class file to verify does not pass the verification pass 3 because of a violation - * of a static constraint as described in the Java Virtual Machine Specification, - * Second edition, 4.8.1, pages 133-137. The static constraints checking part of pass 3 - * is called pass 3a in JustIce. - * Static constraints on the operands of instructions in the code array are checked late in - * pass 3a and are described on page 134-137 in the Java Virtual Machine Specification, - * Second Edition. - * - * @version $Id$ - * @author Enver Haase - */ -public class StaticCodeInstructionOperandConstraintException extends StaticCodeConstraintException{ - public StaticCodeInstructionOperandConstraintException(String message){ - super(message); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java deleted file mode 100644 index 0638101d..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - -/** - * Instances of this class are thrown by BCEL's class file verifier "JustIce" when - * a class file to verify does not pass the verification pass 3 because of a violation - * of a structural constraint as described in the Java Virtual Machine Specification, - * 2nd edition, 4.8.2, pages 137-139. - * Note that the notion of a "structural" constraint is somewhat misleading. Structural - * constraints are constraints on relationships between Java virtual machine instructions. - * These are the constraints where data-flow analysis is needed to verify if they hold. - * The data flow analysis of pass 3 is called pass 3b in JustIce. - * - * @version $Id$ - * @author Enver Haase - */ -public class StructuralCodeConstraintException extends CodeConstraintException{ - /** - * Constructs a new StructuralCodeConstraintException with the specified error message. - */ - public StructuralCodeConstraintException(String message){ - super(message); - } - /** - * Constructs a new StructuralCodeConstraintException with null as its error message string. - */ - public StructuralCodeConstraintException(){ - super(); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/Utility.java b/src/main/java/org/apache/bcel/verifier/exc/Utility.java deleted file mode 100644 index 302e3525..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/Utility.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - - -import java.io.PrintWriter; -import java.io.StringWriter; - -/** - * A utility class providing convenience methods concerning Throwable instances. - * @version $Id$ - * @author Enver Haase - * @see java.lang.Throwable - */ -public final class Utility{ - /** This class is not instantiable. */ - private Utility(){} - - /** This method returns the stack trace of a Throwable instance as a String. */ - public static String getStackTrace(Throwable t){ - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - t.printStackTrace(pw); - return sw.toString(); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java deleted file mode 100644 index e96369e1..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - - -/** - * Instances of this class are thrown by BCEL's class file verifier "JustIce" when a - * class file to verify does not pass one of the verification passes 2 or 3. - * Note that the pass 3 used by "JustIce" involves verification that is usually - * delayed to pass 4. - * The name of this class is justified by the Java Virtual Machine Specification, 2nd - * edition, page 164, 5.4.1 where verification as a part of the linking process is - * defined to be the verification happening in passes 2 and 3. - * - * @version $Id$ - * @author Enver Haase - */ -public abstract class VerificationException extends VerifierConstraintViolatedException{ - /** - * Constructs a new VerificationException with null as its error message string. - */ - VerificationException(){ - super(); - } - /** - * Constructs a new VerificationException with the specified error message. - */ - VerificationException(String message){ - super(message); - } - - /** - * Constructs a new VerificationException with the specified error message and exception - */ - VerificationException(String message, Throwable initCause){ - super(message, initCause); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java deleted file mode 100644 index 650da6dc..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.exc; - - -/** - * Instances of this class are thrown by BCEL's class file verifier "JustIce" - * whenever - * verification proves that some constraint of a class file (as stated in the - * Java Virtual Machine Specification, Edition 2) is violated. - * This is roughly equivalent to the VerifyError the JVM-internal verifiers - * throw. - * - * @version $Id$ - * @author Enver Haase - */ -public abstract class VerifierConstraintViolatedException extends RuntimeException{ - // /** The name of the offending class that did not pass the verifier. */ - // String name_of_offending_class; - - /** The specified error message. */ - private String detailMessage; - /** - * Constructs a new VerifierConstraintViolatedException with null as its error message string. - */ - VerifierConstraintViolatedException(){ - super(); - } - /** - * Constructs a new VerifierConstraintViolatedException with the specified error message. - */ - VerifierConstraintViolatedException(String message){ - super(message); // Not that important - detailMessage = message; - } - /** - * Constructs a new VerifierConstraintViolationException with the specified error message and cause - */ - VerifierConstraintViolatedException(String message, Throwable initCause){ - super(message, initCause); - detailMessage = message; - } - - - /** Extends the error message with a string before ("pre") and after ("post") the - 'old' error message. All of these three strings are allowed to be null, and null - is always replaced by the empty string (""). In particular, after invoking this - method, the error message of this object can no longer be null. - */ - public void extendMessage(String pre, String post){ - if (pre == null) { - pre=""; - } - if (detailMessage == null) { - detailMessage=""; - } - if (post == null) { - post=""; - } - detailMessage = pre+detailMessage+post; - } - /** - * Returns the error message string of this VerifierConstraintViolatedException object. - * @return the error message string of this VerifierConstraintViolatedException. - */ - public String getMessage(){ - return detailMessage; - } -} diff --git a/src/main/java/org/apache/bcel/verifier/exc/package.html b/src/main/java/org/apache/bcel/verifier/exc/package.html deleted file mode 100644 index 1ec56e3f..00000000 --- a/src/main/java/org/apache/bcel/verifier/exc/package.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - -Exception classes used by JustIce, mostly used internally. You don't need to bother with them. - -

          Package Specification

          - -Contained in this package are Exception classes for use with the JustIce verifier. - - - diff --git a/src/main/java/org/apache/bcel/verifier/package.html b/src/main/java/org/apache/bcel/verifier/package.html deleted file mode 100644 index 79cc44e1..00000000 --- a/src/main/java/org/apache/bcel/verifier/package.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - -BCEL's verifier JustIce is there to help you dump correct Java class files created or modified with BCEL. - -

          Package Specification

          - -This is the top-level package of the JustIce verifier. To actually use it, have a look at the VerifierFactory and -Verifier classes. - - - diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java deleted file mode 100644 index 4302abdb..00000000 --- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.statics; - - -import org.apache.bcel.Constants; -import org.apache.bcel.generic.Type; - -/** - * This class represents the upper half of a DOUBLE variable. - * @version $Id$ - * @author Enver Haase - */ -public final class DOUBLE_Upper extends Type{ - - /** The one and only instance of this class. */ - private static DOUBLE_Upper singleInstance = new DOUBLE_Upper(); - - /** The constructor; this class must not be instantiated from the outside. */ - private DOUBLE_Upper(){ - super(Constants.T_UNKNOWN, "Long_Upper"); - } - - /** Use this method to get the single instance of this class. */ - public static DOUBLE_Upper theInstance(){ - return singleInstance; - } -} diff --git a/src/main/java/org/apache/bcel/verifier/statics/IntList.java b/src/main/java/org/apache/bcel/verifier/statics/IntList.java deleted file mode 100644 index 31e59207..00000000 --- a/src/main/java/org/apache/bcel/verifier/statics/IntList.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.statics; - - -import java.util.ArrayList; -import java.util.List; - -/** - * A small utility class representing a set of basic int values. - * - * @version $Id$ - * @author Enver Haase - */ -public class IntList{ - /** The int are stored as Integer objects here. */ - private List theList; - /** This constructor creates an empty list. */ - IntList(){ - theList = new ArrayList(); - } - /** Adds an element to the list. */ - void add(int i){ - theList.add(new Integer(i)); - } - /** Checks if the specified int is already in the list. */ - boolean contains(int i){ - Integer[] ints = new Integer[theList.size()]; - theList.toArray(ints); - for (int j=0; j= localVariableInfos.length){ - throw new AssertionViolatedException("Slot number for local variable information out of range."); - } - return localVariableInfos[slot]; - } - - /** - * Adds information about the local variable in slot 'slot'. Automatically - * adds information for slot+1 if 't' is Type.LONG or Type.DOUBLE. - * @throws LocalVariableInfoInconsistentException if the new information conflicts - * with already gathered information. - */ - public void add(int slot, String name, int startpc, int length, Type t) throws LocalVariableInfoInconsistentException{ - // The add operation on LocalVariableInfo may throw the '...Inconsistent...' exception, we don't throw it explicitely here. - - if (slot < 0 || slot >= localVariableInfos.length){ - throw new AssertionViolatedException("Slot number for local variable information out of range."); - } - - localVariableInfos[slot].add(name, startpc, length, t); - if (t == Type.LONG) { - localVariableInfos[slot+1].add(name, startpc, length, LONG_Upper.theInstance()); - } - if (t == Type.DOUBLE) { - localVariableInfos[slot+1].add(name, startpc, length, DOUBLE_Upper.theInstance()); - } - } -} diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java deleted file mode 100644 index c2825fcf..00000000 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.statics; - - -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.ClassFormatException; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.verifier.PassVerifier; -import org.apache.bcel.verifier.VerificationResult; -import org.apache.bcel.verifier.Verifier; -import org.apache.bcel.verifier.exc.LoadingException; -import org.apache.bcel.verifier.exc.Utility; - -/** - * This PassVerifier verifies a class file according to pass 1 as - * described in The Java Virtual Machine Specification, 2nd edition. - * More detailed information is to be found at the do_verify() method's - * documentation. - * - * @version $Id$ - * @author Enver Haase - * @see #do_verify() - */ -public final class Pass1Verifier extends PassVerifier{ - /** - * DON'T USE THIS EVEN PRIVATELY! USE getJavaClass() INSTEAD. - * @see #getJavaClass() - */ - private JavaClass jc; - - /** - * The Verifier that created this. - */ - private Verifier myOwner; - - /** Used to load in and return the myOwner-matching JavaClass object when needed. Avoids loading in a class file when it's not really needed! */ - private JavaClass getJavaClass(){ - if (jc == null){ - try { - jc = Repository.lookupClass(myOwner.getClassName()); - } catch (ClassNotFoundException e) { - // FIXME: currently, Pass1Verifier treats jc == null as a special - // case, so we don't need to do anything here. A better solution - // would be to simply throw the ClassNotFoundException - // out of this method. - } - } - return jc; - } - - /** - * Should only be instantiated by a Verifier. - * - * @see org.apache.bcel.verifier.Verifier - */ - public Pass1Verifier(Verifier owner){ - myOwner = owner; - } - - /** - * Pass-one verification basically means loading in a class file. - * The Java Virtual Machine Specification is not too precise about - * what makes the difference between passes one and two. - * The answer is that only pass one is performed on a class file as - * long as its resolution is not requested; whereas pass two and - * pass three are performed during the resolution process. - * Only four constraints to be checked are explicitely stated by - * The Java Virtual Machine Specification, 2nd edition: - *
            - *
          • The first four bytes must contain the right magic number (0xCAFEBABE). - *
          • All recognized attributes must be of the proper length. - *
          • The class file must not be truncated or have extra bytes at the end. - *
          • The constant pool must not contain any superficially unrecognizable information. - *
          - * A more in-depth documentation of what pass one should do was written by - * Philip W. L. Fong: - *
            - *
          • the file should not be truncated. - *
          • the file should not have extra bytes at the end. - *
          • all variable-length structures should be well-formatted: - *
              - *
            • there should only be constant_pool_count-1 many entries in the constant pool. - *
            • all constant pool entries should have size the same as indicated by their type tag. - *
            • there are exactly interfaces_count many entries in the interfaces array of the class file. - *
            • there are exactly fields_count many entries in the fields array of the class file. - *
            • there are exactly methods_count many entries in the methods array of the class file. - *
            • there are exactly attributes_count many entries in the attributes array of the class file, fields, methods, and code attribute. - *
            • there should be exactly attribute_length many bytes in each attribute. Inconsistency between attribute_length and the actually size of the attribute content should be uncovered. For example, in an Exceptions attribute, the actual number of exceptions as required by the number_of_exceptions field might yeild an attribute size that doesn't match the attribute_length. Such an anomaly should be detected. - *
            • all attributes should have proper length. In particular, under certain context (e.g. while parsing method_info), recognizable attributes (e.g. "Code" attribute) should have correct format (e.g. attribute_length is 2). - *
            - *
          • Also, certain constant values are checked for validity: - *
              - *
            • The magic number should be 0xCAFEBABE. - *
            • The major and minor version numbers are valid. - *
            • All the constant pool type tags are recognizable. - *
            • All undocumented access flags are masked off before use. Strictly speaking, this is not really a check. - *
            • The field this_class should point to a string that represents a legal non-array class name, and this name should be the same as the class file being loaded. - *
            • the field super_class should point to a string that represents a legal non-array class name. - *
            • Because some of the above checks require cross referencing the constant pool entries, guards are set up to make sure that the referenced entries are of the right type and the indices are within the legal range (0 < index < constant_pool_count). - *
            - *
          • Extra checks done in pass 1: - *
              - *
            • the constant values of static fields should have the same type as the fields. - *
            • the number of words in a parameter list does not exceed 255 and locals_max. - *
            • the name and signature of fields and methods are verified to be of legal format. - *
            - *
          - * (From the Paper The Mysterious Pass One, first draft, September 2, 1997.) - *
          - * However, most of this is done by parsing a class file or generating a class file into BCEL's internal data structure. - * Therefore, all that is really done here is look up the class file from BCEL's repository. - * This is also motivated by the fact that some omitted things - * (like the check for extra bytes at the end of the class file) are handy when actually using BCEL to repair a class file (otherwise you would not be - * able to load it into BCEL). - * - * @see org.apache.bcel.Repository - */ - public VerificationResult do_verify(){ - JavaClass jc; - try{ - jc = getJavaClass(); //loads in the class file if not already done. - - if (jc != null){ - /* If we find more constraints to check, we should do this in an own method. */ - if (! myOwner.getClassName().equals(jc.getClassName())){ - // This should maybe caught by BCEL: In case of renamed .class files we get wrong - // JavaClass objects here. - throw new LoadingException("Wrong name: the internal name of the .class file '"+jc.getClassName()+"' does not match the file's name '"+myOwner.getClassName()+"'."); - } - } - - } - catch(LoadingException e){ - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, e.getMessage()); - } - catch(ClassFormatException e){ - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, e.getMessage()); - } - catch(RuntimeException e){ - // BCEL does not catch every possible RuntimeException; e.g. if - // a constant pool index is referenced that does not exist. - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Parsing via BCEL did not succeed. "+e.getClass().getName()+" occured:\n"+Utility.getStackTrace(e)); - } - - if (jc != null){ - return VerificationResult.VR_OK; - } - else{ - //TODO: Maybe change Repository's behaviour to throw a LoadingException instead of just returning "null" - // if a class file cannot be found or in another way be looked up. - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Repository.lookup() failed. FILE NOT FOUND?"); - } - } - - /** - * Currently this returns an empty array of String. - * One could parse the error messages of BCEL - * (written to java.lang.System.err) when loading - * a class file such as detecting unknown attributes - * or trailing garbage at the end of a class file. - * However, Markus Dahm does not like the idea so this - * method is currently useless and therefore marked as - * TODO. - */ - public String[] getMessages(){ - // This method is only here to override the javadoc-comment. - return super.getMessages(); - } - -} diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java deleted file mode 100644 index eaf634f8..00000000 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ /dev/null @@ -1,1444 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.statics; - - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.ClassFormatException; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.CodeException; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantDouble; -import org.apache.bcel.classfile.ConstantFieldref; -import org.apache.bcel.classfile.ConstantFloat; -import org.apache.bcel.classfile.ConstantInteger; -import org.apache.bcel.classfile.ConstantInterfaceMethodref; -import org.apache.bcel.classfile.ConstantLong; -import org.apache.bcel.classfile.ConstantMethodref; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantString; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.ConstantValue; -import org.apache.bcel.classfile.Deprecated; -import org.apache.bcel.classfile.DescendingVisitor; -import org.apache.bcel.classfile.EmptyVisitor; -import org.apache.bcel.classfile.ExceptionTable; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.InnerClass; -import org.apache.bcel.classfile.InnerClasses; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.LineNumber; -import org.apache.bcel.classfile.LineNumberTable; -import org.apache.bcel.classfile.LocalVariable; -import org.apache.bcel.classfile.LocalVariableTable; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.Node; -import org.apache.bcel.classfile.SourceFile; -import org.apache.bcel.classfile.Synthetic; -import org.apache.bcel.classfile.Unknown; -import org.apache.bcel.classfile.Visitor; -import org.apache.bcel.generic.ArrayType; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.Type; -import org.apache.bcel.verifier.PassVerifier; -import org.apache.bcel.verifier.VerificationResult; -import org.apache.bcel.verifier.Verifier; -import org.apache.bcel.verifier.VerifierFactory; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.ClassConstraintException; -import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; - -/** - * This PassVerifier verifies a class file according to - * pass 2 as described in The Java Virtual Machine - * Specification, 2nd edition. - * More detailed information is to be found at the do_verify() - * method's documentation. - * - * @version $Id$ - * @author Enver Haase - * @see #do_verify() - */ -public final class Pass2Verifier extends PassVerifier implements Constants{ - - /** - * The LocalVariableInfo instances used by Pass3bVerifier. - * localVariablesInfos[i] denotes the information for the - * local variables of method number i in the - * JavaClass this verifier operates on. - */ - private LocalVariablesInfo[] localVariablesInfos; - - /** The Verifier that created this. */ - private Verifier myOwner; - - /** - * Should only be instantiated by a Verifier. - * - * @see Verifier - */ - public Pass2Verifier(Verifier owner){ - myOwner = owner; - } - - /** - * Returns a LocalVariablesInfo object containing information - * about the usage of the local variables in the Code attribute - * of the said method or null if the class file this - * Pass2Verifier operates on could not be pass-2-verified correctly. - * The method number method_nr is the method you get using - * Repository.lookupClass(myOwner.getClassname()).getMethods()[method_nr];. - * You should not add own information. Leave that to JustIce. - */ - public LocalVariablesInfo getLocalVariablesInfo(int method_nr){ - if (this.verify() != VerificationResult.VR_OK) { - return null; // It's cached, don't worry. - } - if (method_nr < 0 || method_nr >= localVariablesInfos.length){ - throw new AssertionViolatedException("Method number out of range."); - } - return localVariablesInfos[method_nr]; - } - - /** - * Pass 2 is the pass where static properties of the - * class file are checked without looking into "Code" - * arrays of methods. - * This verification pass is usually invoked when - * a class is resolved; and it may be possible that - * this verification pass has to load in other classes - * such as superclasses or implemented interfaces. - * Therefore, Pass 1 is run on them.
          - * Note that most referenced classes are not loaded - * in for verification or for an existance check by this - * pass; only the syntactical correctness of their names - * and descriptors (a.k.a. signatures) is checked.
          - * Very few checks that conceptually belong here - * are delayed until pass 3a in JustIce. JustIce does - * not only check for syntactical correctness but also - * for semantical sanity - therefore it needs access to - * the "Code" array of methods in a few cases. Please - * see the pass 3a documentation, too. - * - * @see org.apache.bcel.verifier.statics.Pass3aVerifier - */ - public VerificationResult do_verify(){ - try { - VerificationResult vr1 = myOwner.doPass1(); - if (vr1.equals(VerificationResult.VR_OK)){ - - // For every method, we could have information about the local variables out of LocalVariableTable attributes of - // the Code attributes. - localVariablesInfos = new LocalVariablesInfo[Repository.lookupClass(myOwner.getClassName()).getMethods().length]; - - VerificationResult vr = VerificationResult.VR_OK; // default. - try{ - constant_pool_entries_satisfy_static_constraints(); - field_and_method_refs_are_valid(); - every_class_has_an_accessible_superclass(); - final_methods_are_not_overridden(); - } - catch (ClassConstraintException cce){ - vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); - } - return vr; - } else { - return VerificationResult.VR_NOTYET; - } - - } catch (ClassNotFoundException e) { - // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - } - - /** - * Ensures that every class has a super class and that - * final classes are not subclassed. - * This means, the class this Pass2Verifier operates - * on has proper super classes (transitively) up to - * java.lang.Object. - * The reason for really loading (and Pass1-verifying) - * all of those classes here is that we need them in - * Pass2 anyway to verify no final methods are overridden - * (that could be declared anywhere in the ancestor hierarchy). - * - * @throws ClassConstraintException otherwise. - */ - private void every_class_has_an_accessible_superclass(){ - try { - Set hs = new HashSet(); // save class names to detect circular inheritance - JavaClass jc = Repository.lookupClass(myOwner.getClassName()); - int supidx = -1; - - while (supidx != 0){ - supidx = jc.getSuperclassNameIndex(); - - if (supidx == 0){ - if (jc != Repository.lookupClass(Type.OBJECT.getClassName())){ - throw new ClassConstraintException("Superclass of '"+jc.getClassName()+"' missing but not "+Type.OBJECT.getClassName()+" itself!"); - } - } - else{ - String supername = jc.getSuperclassName(); - if (! hs.add(supername)){ // If supername already is in the list - throw new ClassConstraintException("Circular superclass hierarchy detected."); - } - Verifier v = VerifierFactory.getVerifier(supername); - VerificationResult vr = v.doPass1(); - - if (vr != VerificationResult.VR_OK){ - throw new ClassConstraintException("Could not load in ancestor class '"+supername+"'."); - } - jc = Repository.lookupClass(supername); - - if (jc.isFinal()){ - throw new ClassConstraintException("Ancestor class '"+supername+"' has the FINAL access modifier and must therefore not be subclassed."); - } - } - } - - } catch (ClassNotFoundException e) { - // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - } - - /** - * Ensures that final methods are not overridden. - * Precondition to run this method: - * constant_pool_entries_satisfy_static_constraints() and - * every_class_has_an_accessible_superclass() have to be invoked before - * (in that order). - * - * @throws ClassConstraintException otherwise. - * @see #constant_pool_entries_satisfy_static_constraints() - * @see #every_class_has_an_accessible_superclass() - */ - private void final_methods_are_not_overridden(){ - try { - Map hashmap = new HashMap(); - JavaClass jc = Repository.lookupClass(myOwner.getClassName()); - - int supidx = -1; - while (supidx != 0){ - supidx = jc.getSuperclassNameIndex(); - - Method[] methods = jc.getMethods(); - for (int i=0; i= cplen)){ - throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(referrer)+"'."); - } - Constant c = cp.getConstant(index); - if (! shouldbe.isInstance(c)){ - /* String isnot = shouldbe.toString().substring(shouldbe.toString().lastIndexOf(".")+1); //Cut all before last "." */ - throw new ClassCastException("Illegal constant '"+tostring(c)+"' at index '"+index+"'. '"+tostring(referrer)+"' expects a '"+shouldbe+"'."); - } - } - /////////////////////////////////////// - // ClassFile structure (vmspec2 4.1) // - /////////////////////////////////////// - public void visitJavaClass(JavaClass obj){ - Attribute[] atts = obj.getAttributes(); - boolean foundSourceFile = false; - boolean foundInnerClasses = false; - - // Is there an InnerClass referenced? - // This is a costly check; existing verifiers don't do it! - boolean hasInnerClass = new InnerClassDetector(jc).innerClassReferenced(); - - for (int i=0; i 1){ - throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); - } - - if (obj.isFinal() && obj.isVolatile()){ - throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_FINAL, ACC_VOLATILE modifiers set."); - } - } - else{ // isInterface! - if (!obj.isPublic()){ - throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); - } - if (!obj.isStatic()){ - throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_STATIC modifier set but hasn't!"); - } - if (!obj.isFinal()){ - throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_FINAL modifier set but hasn't!"); - } - } - - if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_VOLATILE|ACC_TRANSIENT)) > 0){ - addMessage("Field '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, ACC_TRANSIENT set (ignored)."); - } - - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - - String name = obj.getName(); - if (! validFieldName(name)){ - throw new ClassConstraintException("Field '"+tostring(obj)+"' has illegal name '"+obj.getName()+"'."); - } - - // A descriptor is often named signature in BCEL - checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); - - String sig = ((ConstantUtf8) (cp.getConstant(obj.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) - - try{ - Type.getType(sig); /* Don't need the return value */ - } - catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); - } - - String nameanddesc = (name+sig); - if (field_names_and_desc.contains(nameanddesc)){ - throw new ClassConstraintException("No two fields (like '"+tostring(obj)+"') are allowed have same names and descriptors!"); - } - if (field_names.contains(name)){ - addMessage("More than one field of name '"+name+"' detected (but with different type descriptors). This is very unusual."); - } - field_names_and_desc.add(nameanddesc); - field_names.add(name); - - Attribute[] atts = obj.getAttributes(); - for (int i=0; i 1){ - throw new ClassConstraintException("Method '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); - } - - if (obj.isAbstract()){ - if (obj.isFinal()) { - throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_FINAL modifier set."); - } - if (obj.isNative()) { - throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_NATIVE modifier set."); - } - if (obj.isPrivate()) { - throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_PRIVATE modifier set."); - } - if (obj.isStatic()) { - throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STATIC modifier set."); - } - if (obj.isStrictfp()) { - throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STRICT modifier set."); - } - if (obj.isSynchronized()) { - throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_SYNCHRONIZED modifier set."); - } - } - } - else{ // isInterface! - if (!name.equals(STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph - if (!obj.isPublic()){ - throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); - } - if (!obj.isAbstract()){ - throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_STATIC modifier set but hasn't!"); - } - if ( obj.isPrivate() || - obj.isProtected() || - obj.isStatic() || - obj.isFinal() || - obj.isSynchronized() || - obj.isNative() || - obj.isStrictfp() ){ - throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must not have any of the ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT modifiers set."); - } - } - } - - // A specific instance initialization method... (vmspec2,Page 116). - if (name.equals(CONSTRUCTOR_NAME)){ - //..may have at most one of ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC set: is checked above. - //..may also have ACC_STRICT set, but none of the other flags in table 4.5 (vmspec2, page 115) - if ( obj.isStatic() || - obj.isFinal() || - obj.isSynchronized() || - obj.isNative() || - obj.isAbstract() ){ - throw new ClassConstraintException("Instance initialization method '"+tostring(obj)+"' must not have any of the ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT modifiers set."); - } - } - - // Class and interface initialization methods... - if (name.equals(STATIC_INITIALIZER_NAME)){ - if ((obj.getAccessFlags() & (~ACC_STRICT)) > 0){ - addMessage("Class or interface initialization method '"+tostring(obj)+"' has superfluous access modifier(s) set: everything but ACC_STRICT is ignored."); - } - if (obj.isAbstract()){ - throw new ClassConstraintException("Class or interface initialization method '"+tostring(obj)+"' must not be abstract. This contradicts the Java Language Specification, Second Edition (which omits this constraint) but is common practice of existing verifiers."); - } - } - - if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_SYNCHRONIZED|ACC_NATIVE|ACC_ABSTRACT|ACC_STRICT)) > 0){ - addMessage("Method '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT set (ignored)."); - } - - String nameanddesc = (name+sig); - if (method_names_and_desc.contains(nameanddesc)){ - throw new ClassConstraintException("No two methods (like '"+tostring(obj)+"') are allowed have same names and desciptors!"); - } - method_names_and_desc.add(nameanddesc); - - Attribute[] atts = obj.getAttributes(); - int num_code_atts = 0; - for (int i=0; i= cplen)){ - throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(obj)+"'."); - } - Constant c = cp.getConstant(index); - - if (CONST_Long.isInstance(c) && field_type.equals(Type.LONG)){ - return; - } - if (CONST_Float.isInstance(c) && field_type.equals(Type.FLOAT)){ - return; - } - if (CONST_Double.isInstance(c) && field_type.equals(Type.DOUBLE)){ - return; - } - if (CONST_Integer.isInstance(c) && (field_type.equals(Type.INT) || field_type.equals(Type.SHORT) || field_type.equals(Type.CHAR) || field_type.equals(Type.BYTE) || field_type.equals(Type.BOOLEAN))){ - return; - } - if (CONST_String.isInstance(c) && field_type.equals(Type.STRING)){ - return; - } - - throw new ClassConstraintException("Illegal type of ConstantValue '"+obj+"' embedding Constant '"+c+"'. It is referenced by field '"+tostring(f)+"' expecting a different type: '"+field_type+"'."); - } - } - // SYNTHETIC: see above - // DEPRECATED: see above - ///////////////////////////////////////////////////////// - // method_info-structure-ATTRIBUTES (vmspec2 4.6, 4.7) // - ///////////////////////////////////////////////////////// - public void visitCode(Code obj){//vmspec2 4.7.3 - try { - // No code attribute allowed for native or abstract methods: see visitMethod(Method). - // Code array constraints are checked in Pass3 (3a and 3b). - - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - - String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("Code")){ - throw new ClassConstraintException("The Code attribute '"+tostring(obj)+"' is not correctly named 'Code' but '"+name+"'."); - } - - Method m = null; // satisfy compiler - if (!(carrier.predecessor() instanceof Method)){ - addMessage("Code attribute '"+tostring(obj)+"' is not declared in a method_info structure but in '"+carrier.predecessor()+"'. Ignored."); - return; - } - else{ - m = (Method) carrier.predecessor(); // we can assume this method was visited before; - // i.e. the data consistency was verified. - } - - if (obj.getCode().length == 0){ - throw new ClassConstraintException("Code array of Code attribute '"+tostring(obj)+"' (method '"+m+"') must not be empty."); - } - - //In JustIce, the check for correct offsets into the code array is delayed to Pass 3a. - CodeException[] exc_table = obj.getExceptionTable(); - for (int i=0; i= code.getMaxLocals()){ - throw new ClassConstraintException("LocalVariableTable attribute '"+tostring(lvt)+"' references a LocalVariable '"+tostring(localvariables[i])+"' with an index that exceeds the surrounding Code attribute's max_locals value of '"+code.getMaxLocals()+"'."); - } - - try{ - localVariablesInfos[method_number].add(localindex, localname, localvariables[i].getStartPC(), localvariables[i].getLength(), t); - } - catch(LocalVariableInfoInconsistentException lviie){ - throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+"' found in Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"'). "+lviie.getMessage(), lviie); - } - }// for all local variables localvariables[i] in the LocalVariableTable attribute atts[a] END - - num_of_lvt_attribs++; - if (!m.isStatic() && num_of_lvt_attribs > obj.getMaxLocals()){ - throw new ClassConstraintException("Number of LocalVariableTable attributes of Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"') exceeds number of local variable slots '"+obj.getMaxLocals()+"' ('There may be no more than one LocalVariableTable attribute per local variable in the Code attribute.')."); - } - }// if atts[a] instanceof LocalVariableTable END - }// for all attributes atts[a] END - - } catch (ClassNotFoundException e) { - // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - - }// visitCode(Code) END - - public void visitExceptionTable(ExceptionTable obj){//vmspec2 4.7.4 - try { - // incorrectly named, it's the Exceptions attribute (vmspec2 4.7.4) - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - - String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("Exceptions")){ - throw new ClassConstraintException("The Exceptions attribute '"+tostring(obj)+"' is not correctly named 'Exceptions' but '"+name+"'."); - } - - int[] exc_indices = obj.getExceptionIndexTable(); - - for (int i=0; iPrecondition: index-style cross referencing in the constant - * pool must be valid. Simply invoke constant_pool_entries_satisfy_static_constraints() - * before.
          - * - * @throws ClassConstraintException otherwise. - * @see #constant_pool_entries_satisfy_static_constraints() - */ - private void field_and_method_refs_are_valid(){ - try { - JavaClass jc = Repository.lookupClass(myOwner.getClassName()); - DescendingVisitor v = new DescendingVisitor(jc, new FAMRAV_Visitor(jc)); - v.visit(); - - } catch (ClassNotFoundException e) { - // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - } - - /** - * A Visitor class that ensures the ConstantCP-subclassed entries - * of the constant pool are valid. - * Precondition: index-style cross referencing in the constant - * pool must be valid. - * - * @see #constant_pool_entries_satisfy_static_constraints() - * @see org.apache.bcel.classfile.ConstantCP - */ - private class FAMRAV_Visitor extends EmptyVisitor implements Visitor{ - private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work. - private FAMRAV_Visitor(JavaClass _jc){ - cp = _jc.getConstantPool(); - } - - public void visitConstantFieldref(ConstantFieldref obj){ - if (obj.getTag() != Constants.CONSTANT_Fieldref){ - throw new ClassConstraintException("ConstantFieldref '"+tostring(obj)+"' has wrong tag!"); - } - int name_and_type_index = obj.getNameAndTypeIndex(); - ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); - String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name - if (!validFieldName(name)){ - throw new ClassConstraintException("Invalid field name '"+name+"' referenced by '"+tostring(obj)+"'."); - } - - int class_index = obj.getClassIndex(); - ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); - String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form - if (! validClassName(className)){ - throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); - } - - String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) - - try{ - Type.getType(sig); /* Don't need the return value */ - } - catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); - } - } - - public void visitConstantMethodref(ConstantMethodref obj){ - if (obj.getTag() != Constants.CONSTANT_Methodref){ - throw new ClassConstraintException("ConstantMethodref '"+tostring(obj)+"' has wrong tag!"); - } - int name_and_type_index = obj.getNameAndTypeIndex(); - ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); - String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name - if (!validClassMethodName(name)){ - throw new ClassConstraintException("Invalid (non-interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); - } - - int class_index = obj.getClassIndex(); - ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); - String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form - if (! validClassName(className)){ - throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); - } - - String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) - - try{ - Type t = Type.getReturnType(sig); - if ( name.equals(CONSTRUCTOR_NAME) && (t != Type.VOID) ){ - throw new ClassConstraintException("Instance initialization method must have VOID return type."); - } - } - catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); - } - } - - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ - if (obj.getTag() != Constants.CONSTANT_InterfaceMethodref){ - throw new ClassConstraintException("ConstantInterfaceMethodref '"+tostring(obj)+"' has wrong tag!"); - } - int name_and_type_index = obj.getNameAndTypeIndex(); - ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); - String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name - if (!validInterfaceMethodName(name)){ - throw new ClassConstraintException("Invalid (interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); - } - - int class_index = obj.getClassIndex(); - ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); - String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form - if (! validClassName(className)){ - throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); - } - - String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) - - try{ - Type t = Type.getReturnType(sig); - if ( name.equals(STATIC_INITIALIZER_NAME) && (t != Type.VOID) ){ - addMessage("Class or interface initialization method '"+STATIC_INITIALIZER_NAME+"' usually has VOID return type instead of '"+t+"'. Note this is really not a requirement of The Java Virtual Machine Specification, Second Edition."); - } - } - catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); - } - - } - - } - - /** - * This method returns true if and only if the supplied String - * represents a valid Java class name. - */ - private static final boolean validClassName(String name){ - /* - * TODO: implement. - * Are there any restrictions? - */ - return true; - } - /** - * This method returns true if and only if the supplied String - * represents a valid method name. - * This is basically the same as a valid identifier name in the - * Java programming language, but the special name for - * the instance initialization method is allowed and the special name - * for the class/interface initialization method may be allowed. - */ - private static boolean validMethodName(String name, boolean allowStaticInit){ - if (validJavaLangMethodName(name)) { - return true; - } - - if (allowStaticInit){ - return (name.equals(CONSTRUCTOR_NAME) || name.equals(STATIC_INITIALIZER_NAME)); - } - else{ - return name.equals(CONSTRUCTOR_NAME); - } - } - - /** - * This method returns true if and only if the supplied String - * represents a valid method name that may be referenced by - * ConstantMethodref objects. - */ - private static boolean validClassMethodName(String name){ - return validMethodName(name, false); - } - - /** - * This method returns true if and only if the supplied String - * represents a valid Java programming language method name stored as a simple - * (non-qualified) name. - * Conforming to: The Java Virtual Machine Specification, Second Edition, �2.7, �2.7.1, �2.2. - */ - private static boolean validJavaLangMethodName(String name){ - if (!Character.isJavaIdentifierStart(name.charAt(0))) { - return false; - } - - for (int i=1; i, thanks! - } - - // vmspec2 2.7, vmspec2 2.2 - if (!Character.isJavaIdentifierStart(name.charAt(0))) { - return false; - } - - for (int i=1; i= methods.length){ - throw new InvalidMethodException("METHOD DOES NOT EXIST!"); - } - Method method = methods[method_no]; - code = method.getCode(); - - // No Code? Nothing to verify! - if ( method.isAbstract() || method.isNative() ){ // IF mg HAS NO CODE (static constraint of Pass 2) - return VerificationResult.VR_OK; - } - - // TODO: - // We want a very sophisticated code examination here with good explanations - // on where to look for an illegal instruction or such. - // Only after that we should try to build an InstructionList and throw an - // AssertionViolatedException if after our examination InstructionList building - // still fails. - // That examination should be implemented in a byte-oriented way, i.e. look for - // an instruction, make sure its validity, count its length, find the next - // instruction and so on. - try{ - instructionList = new InstructionList(method.getCode().getCode()); - } - catch(RuntimeException re){ - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Bad bytecode in the code array of the Code attribute of method '"+method+"'."); - } - - instructionList.setPositions(true); - - // Start verification. - VerificationResult vr = VerificationResult.VR_OK; //default - try{ - delayedPass2Checks(); - } - catch(ClassConstraintException cce){ - vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); - return vr; - } - try{ - pass3StaticInstructionChecks(); - pass3StaticInstructionOperandsChecks(); - } - catch(StaticCodeConstraintException scce){ - vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, scce.getMessage()); - } - catch(ClassCastException cce){ - vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Class Cast Exception: " + cce.getMessage()); - } - return vr; - } - else{ //did not pass Pass 2. - return VerificationResult.VR_NOTYET; - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - } - - /** - * These are the checks that could be done in pass 2 but are delayed to pass 3 - * for performance reasons. Also, these checks need access to the code array - * of the Code attribute of a Method so it's okay to perform them here. - * Also see the description of the do_verify() method. - * - * @throws ClassConstraintException if the verification fails. - * @see #do_verify() - */ - private void delayedPass2Checks(){ - - int[] instructionPositions = instructionList.getInstructionPositions(); - int codeLength = code.getCode().length; - - ///////////////////// - // LineNumberTable // - ///////////////////// - LineNumberTable lnt = code.getLineNumberTable(); - if (lnt != null){ - LineNumber[] lineNumbers = lnt.getLineNumberTable(); - IntList offsets = new IntList(); - lineNumber_loop: for (int i=0; i < lineNumbers.length; i++){ // may appear in any order. - for (int j=0; j < instructionPositions.length; j++){ - // TODO: Make this a binary search! The instructionPositions array is naturally ordered! - int offset = lineNumbers[i].getStartPC(); - if (instructionPositions[j] == offset){ - if (offsets.contains(offset)){ - addMessage("LineNumberTable attribute '"+code.getLineNumberTable()+"' refers to the same code offset ('"+offset+"') more than once which is violating the semantics [but is sometimes produced by IBM's 'jikes' compiler]."); - } - else{ - offsets.add(offset); - } - continue lineNumber_loop; - } - } - throw new ClassConstraintException("Code attribute '"+code+"' has a LineNumberTable attribute '"+code.getLineNumberTable()+"' referring to a code offset ('"+lineNumbers[i].getStartPC()+"') that does not exist."); - } - } - - /////////////////////////// - // LocalVariableTable(s) // - /////////////////////////// - /* We cannot use code.getLocalVariableTable() because there could be more - than only one. This is a bug in BCEL. */ - Attribute[] atts = code.getAttributes(); - for (int a=0; a= endpc){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has its start_pc ('"+startpc+"') not smaller than its end_pc ('"+endpc+"')."); - } - if (!contains(instructionPositions, startpc)){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has a non-existant bytecode offset as its start_pc ('"+startpc+"')."); - } - if ( (!contains(instructionPositions, endpc)) && (endpc != codeLength)){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has a non-existant bytecode offset as its end_pc ('"+startpc+"') [that is also not equal to code_length ('"+codeLength+"')]."); - } - if (!contains(instructionPositions, handlerpc)){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has a non-existant bytecode offset as its handler_pc ('"+handlerpc+"')."); - } - } - } - - /** - * These are the checks if constraints are satisfied which are described in the - * Java Virtual Machine Specification, Second Edition as Static Constraints on - * the instructions of Java Virtual Machine Code (chapter 4.8.1). - * - * @throws StaticCodeConstraintException if the verification fails. - */ - private void pass3StaticInstructionChecks(){ - - // Code array must not be empty: - // Enforced in pass 2 (also stated in the static constraints of the Code - // array in vmspec2), together with pass 1 (reading code_length bytes and - // interpreting them as code[]). So this must not be checked again here. - - if (! (code.getCode().length < 65536)){// contradicts vmspec2 page 152 ("Limitations"), but is on page 134. - throw new StaticCodeInstructionConstraintException("Code array in code attribute '"+code+"' too big: must be smaller than 65536 bytes."); - } - - // First opcode at offset 0: okay, that's clear. Nothing to do. - - // Only instances of the instructions documented in Section 6.4 may appear in - // the code array. - - // For BCEL's sake, we cannot handle WIDE stuff, but hopefully BCEL does its job right :) - - // The last byte of the last instruction in the code array must be the byte at index - // code_length-1 : See the do_verify() comments. We actually don't iterate through the - // byte array, but use an InstructionList so we cannot check for this. But BCEL does - // things right, so it's implicitly okay. - - // TODO: Check how BCEL handles (and will handle) instructions like IMPDEP1, IMPDEP2, - // BREAKPOINT... that BCEL knows about but which are illegal anyway. - // We currently go the safe way here. - InstructionHandle ih = instructionList.getStart(); - while (ih != null){ - Instruction i = ih.getInstruction(); - if (i instanceof IMPDEP1){ - throw new StaticCodeInstructionConstraintException("IMPDEP1 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); - } - if (i instanceof IMPDEP2){ - throw new StaticCodeInstructionConstraintException("IMPDEP2 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); - } - if (i instanceof BREAKPOINT){ - throw new StaticCodeInstructionConstraintException("BREAKPOINT must not be in the code, it is an illegal instruction for _internal_ JVM use!"); - } - ih = ih.getNext(); - } - - // The original verifier seems to do this check here, too. - // An unreachable last instruction may also not fall through the - // end of the code, which is stupid -- but with the original - // verifier's subroutine semantics one cannot predict reachability. - Instruction last = instructionList.getEnd().getInstruction(); - if (! ((last instanceof ReturnInstruction) || - (last instanceof RET) || - (last instanceof GotoInstruction) || - (last instanceof ATHROW) )) { - throw new StaticCodeInstructionConstraintException("Execution must not fall off the bottom of the code array. This constraint is enforced statically as some existing verifiers do - so it may be a false alarm if the last instruction is not reachable."); - } - } - - /** - * These are the checks for the satisfaction of constraints which are described in the - * Java Virtual Machine Specification, Second Edition as Static Constraints on - * the operands of instructions of Java Virtual Machine Code (chapter 4.8.1). - * BCEL parses the code array to create an InstructionList and therefore has to check - * some of these constraints. Additional checks are also implemented here. - * - * @throws StaticCodeConstraintException if the verification fails. - */ - private void pass3StaticInstructionOperandsChecks(){ - try { - // When building up the InstructionList, BCEL has already done all those checks - // mentioned in The Java Virtual Machine Specification, Second Edition, as - // "static constraints on the operands of instructions in the code array". - // TODO: see the do_verify() comments. Maybe we should really work on the - // byte array first to give more comprehensive messages. - // TODO: Review Exception API, possibly build in some "offending instruction" thing - // when we're ready to insulate the offending instruction by doing the - // above thing. - - // TODO: Implement as much as possible here. BCEL does _not_ check everything. - - ConstantPoolGen cpg = new ConstantPoolGen(Repository.lookupClass(myOwner.getClassName()).getConstantPool()); - InstOperandConstraintVisitor v = new InstOperandConstraintVisitor(cpg); - - // Checks for the things BCEL does _not_ handle itself. - InstructionHandle ih = instructionList.getStart(); - while (ih != null){ - Instruction i = ih.getInstruction(); - - // An "own" constraint, due to JustIce's new definition of what "subroutine" means. - if (i instanceof JsrInstruction){ - InstructionHandle target = ((JsrInstruction) i).getTarget(); - if (target == instructionList.getStart()){ - throw new StaticCodeInstructionOperandConstraintException("Due to JustIce's clear definition of subroutines, no JSR or JSR_W may have a top-level instruction (such as the very first instruction, which is targeted by instruction '"+ih+"' as its target."); - } - if (!(target.getInstruction() instanceof ASTORE)){ - throw new StaticCodeInstructionOperandConstraintException("Due to JustIce's clear definition of subroutines, no JSR or JSR_W may target anything else than an ASTORE instruction. Instruction '"+ih+"' targets '"+target+"'."); - } - } - - // vmspec2, page 134-137 - ih.accept(v); - - ih = ih.getNext(); - } - - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - } - - /** A small utility method returning if a given int i is in the given int[] ints. */ - private static boolean contains(int[] ints, int i){ - for (int j=0; j= cpg.getSize()){ - constraintViolated(i, "Illegal constant pool index '"+idx+"'."); - } - } - - /////////////////////////////////////////////////////////// - // The Java Virtual Machine Specification, pages 134-137 // - /////////////////////////////////////////////////////////// - /** - * Assures the generic preconditions of a LoadClass instance. - * The referenced class is loaded and pass2-verified. - */ - public void visitLoadClass(LoadClass o){ - ObjectType t = o.getLoadClassType(cpg); - if (t != null){// null means "no class is loaded" - Verifier v = VerifierFactory.getVerifier(t.getClassName()); - VerificationResult vr = v.doPass1(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded: '"+vr+"'."); - } - } - } - - // The target of each jump and branch instruction [...] must be the opcode [...] - // BCEL _DOES_ handle this. - - // tableswitch: BCEL will do it, supposedly. - - // lookupswitch: BCEL will do it, supposedly. - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - // LDC and LDC_W (LDC_W is a subclass of LDC in BCEL's model) - public void visitLDC(LDC o){ - indexValid(o, o.getIndex()); - Constant c = cpg.getConstant(o.getIndex()); - if (c instanceof ConstantClass){ - addMessage("Operand of LDC or LDC_W is CONSTANT_Class '"+c+"' - this is only supported in JDK 1.5 and higher."); - } - else{ - if (! ( (c instanceof ConstantInteger) || - (c instanceof ConstantFloat) || - (c instanceof ConstantString) ) ){ - constraintViolated(o, "Operand of LDC or LDC_W must be one of CONSTANT_Integer, CONSTANT_Float or CONSTANT_String, but is '"+c+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - // LDC2_W - public void visitLDC2_W(LDC2_W o){ - indexValid(o, o.getIndex()); - Constant c = cpg.getConstant(o.getIndex()); - if (! ( (c instanceof ConstantLong) || - (c instanceof ConstantDouble) ) ){ - constraintViolated(o, "Operand of LDC2_W must be CONSTANT_Long or CONSTANT_Double, but is '"+c+"'."); - } - try{ - indexValid(o, o.getIndex()+1); - } - catch(StaticCodeInstructionOperandConstraintException e){ - throw new AssertionViolatedException("OOPS: Does not BCEL handle that? LDC2_W operand has a problem.", e); - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - //getfield, putfield, getstatic, putstatic - public void visitFieldInstruction(FieldInstruction o){ - try { - indexValid(o, o.getIndex()); - Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantFieldref)){ - constraintViolated(o, "Indexing a constant that's not a CONSTANT_Fieldref but a '"+c+"'."); - } - - String field_name = o.getFieldName(cpg); - - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); - Field[] fields = jc.getFields(); - Field f = null; - for (int i=0; i or - ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantInterfaceMethodref)c).getNameAndTypeIndex())); - String name = ((ConstantUtf8) (cpg.getConstant(cnat.getNameIndex()))).getBytes(); - if (name.equals(Constants.CONSTRUCTOR_NAME)){ - constraintViolated(o, "Method to invoke must not be '"+Constants.CONSTRUCTOR_NAME+"'."); - } - if (name.equals(Constants.STATIC_INITIALIZER_NAME)){ - constraintViolated(o, "Method to invoke must not be '"+Constants.STATIC_INITIALIZER_NAME+"'."); - } - } - - // The LoadClassType is the method-declaring class, so we have to check the other types. - - Type t = o.getReturnType(cpg); - if (t instanceof ArrayType){ - t = ((ArrayType) t).getBasicType(); - } - if (t instanceof ObjectType){ - Verifier v = VerifierFactory.getVerifier(((ObjectType) t).getClassName()); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated(o, "Return type class/interface could not be verified successfully: '"+vr.getMessage()+"'."); - } - } - - Type[] ts = o.getArgumentTypes(cpg); - for (int i=0; i= 255){ - constraintViolated(o, "Not allowed to create an array with more than 255 dimensions."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitNEWARRAY(NEWARRAY o){ - byte t = o.getTypecode(); - if (! ( (t == Constants.T_BOOLEAN) || - (t == Constants.T_CHAR) || - (t == Constants.T_FLOAT) || - (t == Constants.T_DOUBLE) || - (t == Constants.T_BYTE) || - (t == Constants.T_SHORT) || - (t == Constants.T_INT) || - (t == Constants.T_LONG) ) ){ - constraintViolated(o, "Illegal type code '+t+' for 'atype' operand."); - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitILOAD(ILOAD o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitFLOAD(FLOAD o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitALOAD(ALOAD o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitISTORE(ISTORE o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitFSTORE(FSTORE o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitASTORE(ASTORE o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitIINC(IINC o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitRET(RET o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitLLOAD(LLOAD o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); - } - else{ - int maxminus2 = max_locals()-2; - if (idx > maxminus2){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitDLOAD(DLOAD o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); - } - else{ - int maxminus2 = max_locals()-2; - if (idx > maxminus2){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitLSTORE(LSTORE o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); - } - else{ - int maxminus2 = max_locals()-2; - if (idx > maxminus2){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitDSTORE(DSTORE o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); - } - else{ - int maxminus2 = max_locals()-2; - if (idx > maxminus2){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ - int[] matchs = o.getMatchs(); - int max = Integer.MIN_VALUE; - for (int i=0; i= "low". We cannot check this, as BCEL hides - // it from us. - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitPUTSTATIC(PUTSTATIC o){ - try { - String field_name = o.getFieldName(cpg); - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); - Field[] fields = jc.getFields(); - Field f = null; - for (int i=0; i. - if ((!(jc.isClass())) && (!(meth_name.equals(Constants.STATIC_INITIALIZER_NAME)))){ - constraintViolated(o, "Interface field '"+f+"' must be set in a '"+Constants.STATIC_INITIALIZER_NAME+"' method."); - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitGETSTATIC(GETSTATIC o){ - try { - String field_name = o.getFieldName(cpg); - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); - Field[] fields = jc.getFields(); - Field f = null; - for (int i=0; iaccept() Visitor - * instances) have toString() methods that were not designed to be robust, - * this gap is closed by this class. - * When performing class file verification, it may be useful to output which - * entity (e.g. a Code instance) is not satisfying the verifier's - * constraints, but in this case it could be possible for the toString() - * method to throw a RuntimeException. - * A (new StringRepresentation(Node n)).toString() never throws any exception. - * Note that this class also serves as a placeholder for more sophisticated message - * handling in future versions of JustIce. - * - * @version $Id$ - * @author Enver Haase - */ -public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor implements Visitor { - /** The string representation, created by a visitXXX() method, output by toString(). */ - private String tostring; - /** The node we ask for its string representation. Not really needed; only for debug output. */ - private Node n; - - /** - * Creates a new StringRepresentation object which is the representation of n. - * - * @see #toString() - */ - public StringRepresentation(Node n) { - this.n = n; - n.accept(this); // assign a string representation to field 'tostring' if we know n's class. - } - - /** - * Returns the String representation. - */ - public String toString() { -// The run-time check below is needed because we don't want to omit inheritance -// of "EmptyVisitor" and provide a thousand empty methods. -// However, in terms of performance this would be a better idea. -// If some new "Node" is defined in BCEL (such as some concrete "Attribute"), we -// want to know that this class has also to be adapted. - if (tostring == null) { - throw new AssertionViolatedException("Please adapt '" + getClass() + "' to deal with objects of class '" + n.getClass() + "'."); - } - return tostring; - } - - /** - * Returns the String representation of the Node object obj; - * this is obj.toString() if it does not throw any RuntimeException, - * or else it is a string derived only from obj's class name. - */ - private String toString(Node obj) { - String ret; - try { - ret = obj.toString(); - } - catch (RuntimeException e) { // including ClassFormatException, trying to convert the "signature" of a ReturnaddressType LocalVariable (shouldn't occur, but people do crazy things) - String s = obj.getClass().getName(); - s = s.substring(s.lastIndexOf(".") + 1); - ret = "<<" + s + ">>"; - } - return ret; - } - - //////////////////////////////// - // Visitor methods start here // - //////////////////////////////// - // We don't of course need to call some default implementation: - // e.g. we could also simply output "Code" instead of a possibly - // lengthy Code attribute's toString(). - public void visitCode(Code obj) { - //tostring = toString(obj); - tostring = ""; // We don't need real code outputs. - } - - public void visitAnnotation(Annotations obj) - { - //this is invoked whenever an annotation is found - //when verifier is passed over a class - tostring = toString(obj); - } - - public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) - { - //this is invoked whenever a local variable type is found - //when verifier is passed over a class - tostring = toString(obj); - } - - public void visitCodeException(CodeException obj) { - tostring = toString(obj); - } - - public void visitConstantClass(ConstantClass obj) { - tostring = toString(obj); - } - - public void visitConstantDouble(ConstantDouble obj) { - tostring = toString(obj); - } - - public void visitConstantFieldref(ConstantFieldref obj) { - tostring = toString(obj); - } - - public void visitConstantFloat(ConstantFloat obj) { - tostring = toString(obj); - } - - public void visitConstantInteger(ConstantInteger obj) { - tostring = toString(obj); - } - - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) { - tostring = toString(obj); - } - - public void visitConstantLong(ConstantLong obj) { - tostring = toString(obj); - } - - public void visitConstantMethodref(ConstantMethodref obj) { - tostring = toString(obj); - } - - public void visitConstantNameAndType(ConstantNameAndType obj) { - tostring = toString(obj); - } - - public void visitConstantPool(ConstantPool obj) { - tostring = toString(obj); - } - - public void visitConstantString(ConstantString obj) { - tostring = toString(obj); - } - - public void visitConstantUtf8(ConstantUtf8 obj) { - tostring = toString(obj); - } - - public void visitConstantValue(ConstantValue obj) { - tostring = toString(obj); - } - - public void visitDeprecated(Deprecated obj) { - tostring = toString(obj); - } - - public void visitExceptionTable(ExceptionTable obj) { - tostring = toString(obj); - } - - public void visitField(Field obj) { - tostring = toString(obj); - } - - public void visitInnerClass(InnerClass obj) { - tostring = toString(obj); - } - - public void visitInnerClasses(InnerClasses obj) { - tostring = toString(obj); - } - - public void visitJavaClass(JavaClass obj) { - tostring = toString(obj); - } - - public void visitLineNumber(LineNumber obj) { - tostring = toString(obj); - } - - public void visitLineNumberTable(LineNumberTable obj) { - tostring = ""; - } - - public void visitLocalVariable(LocalVariable obj) { - tostring = toString(obj); - } - - public void visitLocalVariableTable(LocalVariableTable obj) { - tostring = ""; - } - - public void visitMethod(Method obj) { - tostring = toString(obj); - } - - public void visitSignature(Signature obj) { - tostring = toString(obj); - } - - public void visitSourceFile(SourceFile obj) { - tostring = toString(obj); - } - - public void visitStackMap(StackMap obj) { - tostring = toString(obj); - } - - public void visitSynthetic(Synthetic obj) { - tostring = toString(obj); - } - - public void visitUnknown(Unknown obj) { - tostring = toString(obj); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/statics/package.html b/src/main/java/org/apache/bcel/verifier/statics/package.html deleted file mode 100644 index e0b624e3..00000000 --- a/src/main/java/org/apache/bcel/verifier/statics/package.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - -Provides PassVerifier classes used internally by JustIce. You don't need to bother with them. - -

          Package Specification

          - -Contained in this package are PassVerifier classes for use with the JustIce verifier. -Only the passes performing what Sun calls 'static constraints' have PassVerifier classes -here. - - - diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java deleted file mode 100644 index 53387e4e..00000000 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ /dev/null @@ -1,461 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.structurals; - - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import org.apache.bcel.generic.ATHROW; -import org.apache.bcel.generic.BranchInstruction; -import org.apache.bcel.generic.GotoInstruction; -import org.apache.bcel.generic.Instruction; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.JsrInstruction; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.RET; -import org.apache.bcel.generic.ReturnInstruction; -import org.apache.bcel.generic.Select; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; - -/** - * This class represents a control flow graph of a method. - * - * @version $Id$ - * @author Enver Haase - */ -public class ControlFlowGraph{ - - /** - * Objects of this class represent a node in a ControlFlowGraph. - * These nodes are instructions, not basic blocks. - */ - private class InstructionContextImpl implements InstructionContext{ - - /** - * The TAG field is here for external temporary flagging, such - * as graph colouring. - * - * @see #getTag() - * @see #setTag(int) - */ - private int TAG; - - /** - * The InstructionHandle this InstructionContext is wrapped around. - */ - private InstructionHandle instruction; - - /** - * The 'incoming' execution Frames. - */ - private Map inFrames; // key: the last-executed JSR - - /** - * The 'outgoing' execution Frames. - */ - private Map outFrames; // key: the last-executed JSR - - /** - * The 'execution predecessors' - a list of type InstructionContext - * of those instances that have been execute()d before in that order. - */ - private ArrayList executionPredecessors = null; // Type: InstructionContext - - /** - * Creates an InstructionHandleImpl object from an InstructionHandle. - * Creation of one per InstructionHandle suffices. Don't create more. - */ - public InstructionContextImpl(InstructionHandle inst){ - if (inst == null) { - throw new AssertionViolatedException("Cannot instantiate InstructionContextImpl from NULL."); - } - - instruction = inst; - inFrames = new java.util.HashMap(); - outFrames = new java.util.HashMap(); - } - - /* Satisfies InstructionContext.getTag(). */ - public int getTag(){ - return TAG; - } - - /* Satisfies InstructionContext.setTag(int). */ - public void setTag(int tag){ - TAG = tag; - } - - /** - * Returns the exception handlers of this instruction. - */ - public ExceptionHandler[] getExceptionHandlers(){ - return exceptionhandlers.getExceptionHandlers(getInstruction()); - } - - /** - * Returns a clone of the "outgoing" frame situation with respect to the given ExecutionChain. - */ - public Frame getOutFrame(ArrayList execChain){ - executionPredecessors = execChain; - - Frame org; - - InstructionContext jsr = lastExecutionJSR(); - - org = (Frame) outFrames.get(jsr); - - if (org == null){ - throw new AssertionViolatedException("outFrame not set! This:\n"+this+"\nExecutionChain: "+getExecutionChain()+"\nOutFrames: '"+outFrames+"'."); - } - return org.getClone(); - } - - public Frame getInFrame() { - Frame org; - - InstructionContext jsr = lastExecutionJSR(); - - org = (Frame) inFrames.get(jsr); - - if (org == null){ - throw new AssertionViolatedException("inFrame not set! This:\n"+this+"\nInFrames: '"+inFrames+"'."); - } - return org.getClone(); - } - - /** - * "Merges in" (vmspec2, page 146) the "incoming" frame situation; - * executes the instructions symbolically - * and therefore calculates the "outgoing" frame situation. - * Returns: True iff the "incoming" frame situation changed after - * merging with "inFrame". - * The execPreds ArrayList must contain the InstructionContext - * objects executed so far in the correct order. This is just - * one execution path [out of many]. This is needed to correctly - * "merge" in the special case of a RET's successor. - * The InstConstraintVisitor and ExecutionVisitor instances - * must be set up correctly. - * @return true - if and only if the "outgoing" frame situation - * changed from the one before execute()ing. - */ - public boolean execute(Frame inFrame, ArrayList execPreds, InstConstraintVisitor icv, ExecutionVisitor ev){ - - executionPredecessors = (ArrayList) execPreds.clone(); - - //sanity check - if ( (lastExecutionJSR() == null) && (subroutines.subroutineOf(getInstruction()) != subroutines.getTopLevel() ) ){ - throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?"); - } - if ( (lastExecutionJSR() != null) && (subroutines.subroutineOf(getInstruction()) == subroutines.getTopLevel() ) ){ - throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?"); - } - - Frame inF = (Frame) inFrames.get(lastExecutionJSR()); - if (inF == null){// no incoming frame was set, so set it. - inFrames.put(lastExecutionJSR(), inFrame); - inF = inFrame; - } - else{// if there was an "old" inFrame - if (inF.equals(inFrame)){ //shortcut: no need to merge equal frames. - return false; - } - if (! mergeInFrames(inFrame)){ - return false; - } - } - - // Now we're sure the inFrame has changed! - - // new inFrame is already merged in, see above. - Frame workingFrame = inF.getClone(); - - try{ - // This verifies the InstructionConstraint for the current - // instruction, but does not modify the workingFrame object. -//InstConstraintVisitor icv = InstConstraintVisitor.getInstance(VerifierFactory.getVerifier(method_gen.getClassName())); - icv.setFrame(workingFrame); - getInstruction().accept(icv); - } - catch(StructuralCodeConstraintException ce){ - ce.extendMessage("","\nInstructionHandle: "+getInstruction()+"\n"); - ce.extendMessage("","\nExecution Frame:\n"+workingFrame); - extendMessageWithFlow(ce); - throw ce; - } - - // This executes the Instruction. - // Therefore the workingFrame object is modified. -//ExecutionVisitor ev = ExecutionVisitor.getInstance(VerifierFactory.getVerifier(method_gen.getClassName())); - ev.setFrame(workingFrame); - getInstruction().accept(ev); - //getInstruction().accept(ExecutionVisitor.withFrame(workingFrame)); - outFrames.put(lastExecutionJSR(), workingFrame); - - return true; // new inFrame was different from old inFrame so merging them - // yielded a different this.inFrame. - } - - /** - * Returns a simple String representation of this InstructionContext. - */ - public String toString(){ - //TODO: Put information in the brackets, e.g. - // Is this an ExceptionHandler? Is this a RET? Is this the start of - // a subroutine? - String ret = getInstruction().toString(false)+"\t[InstructionContext]"; - return ret; - } - - /** - * Does the actual merging (vmspec2, page 146). - * Returns true IFF this.inFrame was changed in course of merging with inFrame. - */ - private boolean mergeInFrames(Frame inFrame){ - // TODO: Can be performance-improved. - Frame inF = (Frame) inFrames.get(lastExecutionJSR()); - OperandStack oldstack = inF.getStack().getClone(); - LocalVariables oldlocals = inF.getLocals().getClone(); - try{ - inF.getStack().merge(inFrame.getStack()); - inF.getLocals().merge(inFrame.getLocals()); - } - catch (StructuralCodeConstraintException sce){ - extendMessageWithFlow(sce); - throw sce; - } - if ( oldstack.equals(inF.getStack()) && - oldlocals.equals(inF.getLocals()) ){ - return false; - } - else{ - return true; - } - } - - /** - * Returns the control flow execution chain. This is built - * while execute(Frame, ArrayList)-ing the code represented - * by the surrounding ControlFlowGraph. - */ - private String getExecutionChain(){ - String s = this.toString(); - for (int i=executionPredecessors.size()-1; i>=0; i--){ - s = executionPredecessors.get(i)+"\n" + s; - } - return s; - } - - - /** - * Extends the StructuralCodeConstraintException ("e") object with an at-the-end-extended message. - * This extended message will then reflect the execution flow needed to get to the constraint - * violation that triggered the throwing of the "e" object. - */ - private void extendMessageWithFlow(StructuralCodeConstraintException e){ - String s = "Execution flow:\n"; - e.extendMessage("", s+getExecutionChain()); - } - - /* - * Fulfils the contract of InstructionContext.getInstruction(). - */ - public InstructionHandle getInstruction(){ - return instruction; - } - - /** - * Returns the InstructionContextImpl with an JSR/JSR_W - * that was last in the ExecutionChain, without - * a corresponding RET, i.e. - * we were called by this one. - * Returns null if we were called from the top level. - */ - private InstructionContextImpl lastExecutionJSR(){ - - int size = executionPredecessors.size(); - int retcount = 0; - - for (int i=size-1; i>=0; i--){ - InstructionContextImpl current = (InstructionContextImpl) (executionPredecessors.get(i)); - Instruction currentlast = current.getInstruction().getInstruction(); - if (currentlast instanceof RET) { - retcount++; - } - if (currentlast instanceof JsrInstruction){ - retcount--; - if (retcount == -1) { - return current; - } - } - } - return null; - } - - /* Satisfies InstructionContext.getSuccessors(). */ - public InstructionContext[] getSuccessors(){ - return contextsOf(_getSuccessors()); - } - - /** - * A utility method that calculates the successors of a given InstructionHandle - * That means, a RET does have successors as defined here. - * A JsrInstruction has its target as its successor - * (opposed to its physical successor) as defined here. - */ -// TODO: implement caching! - private InstructionHandle[] _getSuccessors(){ - final InstructionHandle[] empty = new InstructionHandle[0]; - final InstructionHandle[] single = new InstructionHandle[1]; - - Instruction inst = getInstruction().getInstruction(); - - if (inst instanceof RET){ - Subroutine s = subroutines.subroutineOf(getInstruction()); - if (s==null){ //return empty; // RET in dead code. "empty" would be the correct answer, but we know something about the surrounding project... - throw new AssertionViolatedException("Asking for successors of a RET in dead code?!"); - } - -//TODO: remove. Only JustIce must not use it, but foreign users of the ControlFlowGraph -// will want it. Thanks Johannes Wust. -//throw new AssertionViolatedException("DID YOU REALLY WANT TO ASK FOR RET'S SUCCS?"); - - InstructionHandle[] jsrs = s.getEnteringJsrInstructions(); - InstructionHandle[] ret = new InstructionHandle[jsrs.length]; - for (int i=0; i(NOT ORDERED!). - */ - public InstructionContext[] getInstructionContexts(){ - InstructionContext[] ret = new InstructionContext[instructionContexts.values().size()]; - return (InstructionContext[]) instructionContexts.values().toArray(ret); - } - - /** - * Returns true, if and only if the said instruction is not reachable; that means, - * if it is not part of this ControlFlowGraph. - */ - public boolean isDead(InstructionHandle i){ - return subroutines.subroutineOf(i) == null; - } -} diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java deleted file mode 100644 index 0fd58cee..00000000 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.structurals; - - -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.ObjectType; - -/** - * This class represents an exception handler; that is, an ObjectType - * representing a subclass of java.lang.Throwable and the instruction - * the handler starts off (represented by an InstructionContext). - * - * @version $Id$ - * @author Enver Haase - */ -public class ExceptionHandler{ - /** The type of the exception to catch. NULL means ANY. */ - private ObjectType catchtype; - - /** The InstructionHandle where the handling begins. */ - private InstructionHandle handlerpc; - - /** Leave instance creation to JustIce. */ - ExceptionHandler(ObjectType catch_type, InstructionHandle handler_pc){ - catchtype = catch_type; - handlerpc = handler_pc; - } - - /** - * Returns the type of the exception that's handled. 'null' means 'ANY'. - */ - public ObjectType getExceptionType(){ - return catchtype; - } - - /** - * Returns the InstructionHandle where the handler starts off. - */ - public InstructionHandle getHandlerStart(){ - return handlerpc; - } -} diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java deleted file mode 100644 index 0c113c92..00000000 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.structurals; - - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.apache.bcel.generic.CodeExceptionGen; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.MethodGen; - -/** - * This class allows easy access to ExceptionHandler objects. - * - * @version $Id$ - * @author Enver Haase - */ -public class ExceptionHandlers{ - /** - * The ExceptionHandler instances. - * Key: InstructionHandle objects, Values: HashSet instances. - */ - private Map exceptionhandlers; - - /** - * Constructor. Creates a new ExceptionHandlers instance. - */ - public ExceptionHandlers(MethodGen mg){ - exceptionhandlers = new HashMap(); - CodeExceptionGen[] cegs = mg.getExceptionHandlers(); - for (int i=0; iConventions: - * - * Type.VOID will never be pushed onto the stack. Type.DOUBLE and Type.LONG - * that would normally take up two stack slots (like Double_HIGH and - * Double_LOW) are represented by a simple single Type.DOUBLE or Type.LONG - * object on the stack here. - * If a two-slot type is stored into a local variable, the next variable - * is given the type Type.UNKNOWN. - * - * @version $Id$ - * @author Enver Haase - * @see #visitDSTORE(DSTORE o) - * @see InstConstraintVisitor - */ -public class ExecutionVisitor extends EmptyVisitor implements Visitor{ - - /** - * The executionframe we're operating on. - */ - private Frame frame = null; - - /** - * The ConstantPoolGen we're working with. - * @see #setConstantPoolGen(ConstantPoolGen) - */ - private ConstantPoolGen cpg = null; - - /** - * Constructor. Constructs a new instance of this class. - */ - public ExecutionVisitor(){} - - /** - * The OperandStack from the current Frame we're operating on. - * @see #setFrame(Frame) - */ - private OperandStack stack(){ - return frame.getStack(); - } - - /** - * The LocalVariables from the current Frame we're operating on. - * @see #setFrame(Frame) - */ - private LocalVariables locals(){ - return frame.getLocals(); - } - - /** - * Sets the ConstantPoolGen needed for symbolic execution. - */ - public void setConstantPoolGen(ConstantPoolGen cpg){ - this.cpg = cpg; - } - - /** - * The only method granting access to the single instance of - * the ExecutionVisitor class. Before actively using this - * instance, SET THE ConstantPoolGen FIRST. - * @see #setConstantPoolGen(ConstantPoolGen) - */ - public void setFrame(Frame f){ - this.frame = f; - } - - ///** Symbolically executes the corresponding Java Virtual Machine instruction. */ - //public void visitWIDE(WIDE o){ - // The WIDE instruction is modelled as a flag - // of the embedded instructions in BCEL. - // Therefore BCEL checks for possible errors - // when parsing in the .class file: We don't - // have even the possibilty to care for WIDE - // here. - //} - - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitAALOAD(AALOAD o){ - stack().pop(); // pop the index int -//System.out.print(stack().peek()); - Type t = stack().pop(); // Pop Array type - if (t == Type.NULL){ - stack().push(Type.NULL); - } // Do nothing stackwise --- a NullPointerException is thrown at Run-Time - else{ - ArrayType at = (ArrayType) t; - stack().push(at.getElementType()); - } - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitAASTORE(AASTORE o){ - stack().pop(); - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitACONST_NULL(ACONST_NULL o){ - stack().push(Type.NULL); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitALOAD(ALOAD o){ - stack().push(locals().get(o.getIndex())); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitANEWARRAY(ANEWARRAY o){ - stack().pop(); //count - stack().push( new ArrayType(o.getType(cpg), 1) ); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitARETURN(ARETURN o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitARRAYLENGTH(ARRAYLENGTH o){ - stack().pop(); - stack().push(Type.INT); - } - - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitASTORE(ASTORE o){ - locals().set(o.getIndex(), stack().pop()); - //System.err.println("TODO-DEBUG: set LV '"+o.getIndex()+"' to '"+locals().get(o.getIndex())+"'."); - } - - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitATHROW(ATHROW o){ - Type t = stack().pop(); - stack().clear(); - if (t.equals(Type.NULL)) { - stack().push(Type.getType("Ljava/lang/NullPointerException;")); - } else { - stack().push(t); - } - } - - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitBALOAD(BALOAD o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitBASTORE(BASTORE o){ - stack().pop(); - stack().pop(); - stack().pop(); - } - - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitBIPUSH(BIPUSH o){ - stack().push(Type.INT); - } - - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitCALOAD(CALOAD o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitCASTORE(CASTORE o){ - stack().pop(); - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitCHECKCAST(CHECKCAST o){ - // It's possibly wrong to do so, but SUN's - // ByteCode verifier seems to do (only) this, too. - // TODO: One could use a sophisticated analysis here to check - // if a type cannot possibly be cated to another and by - // so doing predict the ClassCastException at run-time. - stack().pop(); - stack().push(o.getType(cpg)); - } - - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitD2F(D2F o){ - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitD2I(D2I o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitD2L(D2L o){ - stack().pop(); - stack().push(Type.LONG); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDADD(DADD o){ - stack().pop(); - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDALOAD(DALOAD o){ - stack().pop(); - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDASTORE(DASTORE o){ - stack().pop(); - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDCMPG(DCMPG o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDCMPL(DCMPL o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDCONST(DCONST o){ - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDDIV(DDIV o){ - stack().pop(); - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDLOAD(DLOAD o){ - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDMUL(DMUL o){ - stack().pop(); - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDNEG(DNEG o){ - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDREM(DREM o){ - stack().pop(); - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDRETURN(DRETURN o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDSTORE(DSTORE o){ - locals().set(o.getIndex(), stack().pop()); - locals().set(o.getIndex()+1, Type.UNKNOWN); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDSUB(DSUB o){ - stack().pop(); - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDUP(DUP o){ - Type t = stack().pop(); - stack().push(t); - stack().push(t); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDUP_X1(DUP_X1 o){ - Type w1 = stack().pop(); - Type w2 = stack().pop(); - stack().push(w1); - stack().push(w2); - stack().push(w1); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDUP_X2(DUP_X2 o){ - Type w1 = stack().pop(); - Type w2 = stack().pop(); - if (w2.getSize() == 2){ - stack().push(w1); - stack().push(w2); - stack().push(w1); - } - else{ - Type w3 = stack().pop(); - stack().push(w1); - stack().push(w3); - stack().push(w2); - stack().push(w1); - } - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDUP2(DUP2 o){ - Type t = stack().pop(); - if (t.getSize() == 2){ - stack().push(t); - stack().push(t); - } - else{ // t.getSize() is 1 - Type u = stack().pop(); - stack().push(u); - stack().push(t); - stack().push(u); - stack().push(t); - } - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDUP2_X1(DUP2_X1 o){ - Type t = stack().pop(); - if (t.getSize() == 2){ - Type u = stack().pop(); - stack().push(t); - stack().push(u); - stack().push(t); - } - else{ //t.getSize() is1 - Type u = stack().pop(); - Type v = stack().pop(); - stack().push(u); - stack().push(t); - stack().push(v); - stack().push(u); - stack().push(t); - } - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDUP2_X2(DUP2_X2 o){ - Type t = stack().pop(); - if (t.getSize() == 2){ - Type u = stack().pop(); - if (u.getSize() == 2){ - stack().push(t); - stack().push(u); - stack().push(t); - }else{ - Type v = stack().pop(); - stack().push(t); - stack().push(v); - stack().push(u); - stack().push(t); - } - } - else{ //t.getSize() is 1 - Type u = stack().pop(); - Type v = stack().pop(); - if (v.getSize() == 2){ - stack().push(u); - stack().push(t); - stack().push(v); - stack().push(u); - stack().push(t); - }else{ - Type w = stack().pop(); - stack().push(u); - stack().push(t); - stack().push(w); - stack().push(v); - stack().push(u); - stack().push(t); - } - } - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitF2D(F2D o){ - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitF2I(F2I o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitF2L(F2L o){ - stack().pop(); - stack().push(Type.LONG); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFADD(FADD o){ - stack().pop(); - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFALOAD(FALOAD o){ - stack().pop(); - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFASTORE(FASTORE o){ - stack().pop(); - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFCMPG(FCMPG o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFCMPL(FCMPL o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFCONST(FCONST o){ - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFDIV(FDIV o){ - stack().pop(); - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFLOAD(FLOAD o){ - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFMUL(FMUL o){ - stack().pop(); - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFNEG(FNEG o){ - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFREM(FREM o){ - stack().pop(); - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFRETURN(FRETURN o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFSTORE(FSTORE o){ - locals().set(o.getIndex(), stack().pop()); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFSUB(FSUB o){ - stack().pop(); - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitGETFIELD(GETFIELD o){ - stack().pop(); - Type t = o.getFieldType(cpg); - if ( t.equals(Type.BOOLEAN) || - t.equals(Type.CHAR) || - t.equals(Type.BYTE) || - t.equals(Type.SHORT) ) { - t = Type.INT; - } - stack().push(t); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitGETSTATIC(GETSTATIC o){ - Type t = o.getFieldType(cpg); - if ( t.equals(Type.BOOLEAN) || - t.equals(Type.CHAR) || - t.equals(Type.BYTE) || - t.equals(Type.SHORT) ) { - t = Type.INT; - } - stack().push(t); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitGOTO(GOTO o){ - // no stack changes. - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitGOTO_W(GOTO_W o){ - // no stack changes. - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitI2B(I2B o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitI2C(I2C o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitI2D(I2D o){ - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitI2F(I2F o){ - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitI2L(I2L o){ - stack().pop(); - stack().push(Type.LONG); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitI2S(I2S o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIADD(IADD o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIALOAD(IALOAD o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIAND(IAND o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIASTORE(IASTORE o){ - stack().pop(); - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitICONST(ICONST o){ - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIDIV(IDIV o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ACMPEQ(IF_ACMPEQ o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ACMPNE(IF_ACMPNE o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ICMPEQ(IF_ICMPEQ o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ICMPGE(IF_ICMPGE o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ICMPGT(IF_ICMPGT o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ICMPLE(IF_ICMPLE o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ICMPLT(IF_ICMPLT o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ICMPNE(IF_ICMPNE o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFEQ(IFEQ o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFGE(IFGE o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFGT(IFGT o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFLE(IFLE o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFLT(IFLT o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFNE(IFNE o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFNONNULL(IFNONNULL o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFNULL(IFNULL o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIINC(IINC o){ - // stack is not changed. - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitILOAD(ILOAD o){ - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIMUL(IMUL o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitINEG(INEG o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitINSTANCEOF(INSTANCEOF o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ - stack().pop(); //objectref - for (int i=0; i stack().slotsUsed()){ - constraintViolated((Instruction) o, "Cannot consume "+consume+" stack slots: only "+stack().slotsUsed()+" slot(s) left on stack!\nStack:\n"+stack()); - } - - int produce = o.produceStack(cpg) - ((Instruction) o).consumeStack(cpg); // Stack values are always consumed first; then produced. - if ( produce + stack().slotsUsed() > stack().maxStack() ){ - constraintViolated((Instruction) o, "Cannot produce "+produce+" stack slots: only "+(stack().maxStack()-stack().slotsUsed())+" free stack slot(s) left.\nStack:\n"+stack()); - } - } - - /***************************************************************/ - /* "generic"visitXXXX methods where XXXX is an interface */ - /* therefore, we don't know the order of visiting; but we know */ - /* these methods are called before the visitYYYY methods below */ - /***************************************************************/ - - /** - * Assures the generic preconditions of a LoadClass instance. - * The referenced class is loaded and pass2-verified. - */ - public void visitLoadClass(LoadClass o){ - ObjectType t = o.getLoadClassType(cpg); - if (t != null){// null means "no class is loaded" - Verifier v = VerifierFactory.getVerifier(t.getClassName()); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); - } - } - } - - /** - * Ensures the general preconditions of a StackConsumer instance. - */ - public void visitStackConsumer(StackConsumer o){ - _visitStackAccessor((Instruction) o); - } - - /** - * Ensures the general preconditions of a StackProducer instance. - */ - public void visitStackProducer(StackProducer o){ - _visitStackAccessor((Instruction) o); - } - - - /***************************************************************/ - /* "generic" visitYYYY methods where YYYY is a superclass. */ - /* therefore, we know the order of visiting; we know */ - /* these methods are called after the visitXXXX methods above. */ - /***************************************************************/ - /** - * Ensures the general preconditions of a CPInstruction instance. - */ - public void visitCPInstruction(CPInstruction o){ - int idx = o.getIndex(); - if ((idx < 0) || (idx >= cpg.getSize())){ - throw new AssertionViolatedException("Huh?! Constant pool index of instruction '"+o+"' illegal? Pass 3a should have checked this!"); - } - } - - /** - * Ensures the general preconditions of a FieldInstruction instance. - */ - public void visitFieldInstruction(FieldInstruction o){ - // visitLoadClass(o) has been called before: Every FieldOrMethod - // implements LoadClass. - // visitCPInstruction(o) has been called before. - // A FieldInstruction may be: GETFIELD, GETSTATIC, PUTFIELD, PUTSTATIC - Constant c = cpg.getConstant(o.getIndex()); - if (!(c instanceof ConstantFieldref)){ - constraintViolated(o, "Index '"+o.getIndex()+"' should refer to a CONSTANT_Fieldref_info structure, but refers to '"+c+"'."); - } - // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). - Type t = o.getType(cpg); - if (t instanceof ObjectType){ - String name = ((ObjectType)t).getClassName(); - Verifier v = VerifierFactory.getVerifier( name ); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); - } - } - } - - /** - * Ensures the general preconditions of an InvokeInstruction instance. - */ - public void visitInvokeInstruction(InvokeInstruction o){ - // visitLoadClass(o) has been called before: Every FieldOrMethod - // implements LoadClass. - // visitCPInstruction(o) has been called before. - //TODO - } - - /** - * Ensures the general preconditions of a StackInstruction instance. - */ - public void visitStackInstruction(StackInstruction o){ - _visitStackAccessor(o); - } - - /** - * Assures the generic preconditions of a LocalVariableInstruction instance. - * That is, the index of the local variable must be valid. - */ - public void visitLocalVariableInstruction(LocalVariableInstruction o){ - if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ - constraintViolated(o, "The 'index' is not a valid index into the local variable array."); - } - } - - /** - * Assures the generic preconditions of a LoadInstruction instance. - */ - public void visitLoadInstruction(LoadInstruction o){ - //visitLocalVariableInstruction(o) is called before, because it is more generic. - - // LOAD instructions must not read Type.UNKNOWN - if (locals().get(o.getIndex()) == Type.UNKNOWN){ - constraintViolated(o, "Read-Access on local variable "+o.getIndex()+" with unknown content."); - } - - // LOAD instructions, two-slot-values at index N must have Type.UNKNOWN - // as a symbol for the higher halve at index N+1 - // [suppose some instruction put an int at N+1--- our double at N is defective] - if (o.getType(cpg).getSize() == 2){ - if (locals().get(o.getIndex()+1) != Type.UNKNOWN){ - constraintViolated(o, "Reading a two-locals value from local variables "+o.getIndex()+" and "+(o.getIndex()+1)+" where the latter one is destroyed."); - } - } - - // LOAD instructions must read the correct type. - if (!(o instanceof ALOAD)){ - if (locals().get(o.getIndex()) != o.getType(cpg) ){ - constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+locals().get(o.getIndex())+"'; Instruction type: '"+o.getType(cpg)+"'."); - } - } - else{ // we deal with an ALOAD - if (!(locals().get(o.getIndex()) instanceof ReferenceType)){ - constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+locals().get(o.getIndex())+"'; Instruction expects a ReferenceType."); - } - // ALOAD __IS ALLOWED__ to put uninitialized objects onto the stack! - //referenceTypeIsInitialized(o, (ReferenceType) (locals().get(o.getIndex()))); - } - - // LOAD instructions must have enough free stack slots. - if ((stack().maxStack() - stack().slotsUsed()) < o.getType(cpg).getSize()){ - constraintViolated(o, "Not enough free stack slots to load a '"+o.getType(cpg)+"' onto the OperandStack."); - } - } - - /** - * Assures the generic preconditions of a StoreInstruction instance. - */ - public void visitStoreInstruction(StoreInstruction o){ - //visitLocalVariableInstruction(o) is called before, because it is more generic. - - if (stack().isEmpty()){ // Don't bother about 1 or 2 stack slots used. This check is implicitely done below while type checking. - constraintViolated(o, "Cannot STORE: Stack to read from is empty."); - } - - if ( (!(o instanceof ASTORE)) ){ - if (! (stack().peek() == o.getType(cpg)) ){// the other xSTORE types are singletons in BCEL. - constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction type: '"+o.getType(cpg)+"'."); - } - } - else{ // we deal with ASTORE - Type stacktop = stack().peek(); - if ( (!(stacktop instanceof ReferenceType)) && (!(stacktop instanceof ReturnaddressType)) ){ - constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction expects a ReferenceType or a ReturnadressType."); - } - //if (stacktop instanceof ReferenceType){ - // referenceTypeIsInitialized(o, (ReferenceType) stacktop); - //} - } - } - - /** - * Assures the generic preconditions of a ReturnInstruction instance. - */ - public void visitReturnInstruction(ReturnInstruction o){ - Type method_type = mg.getType(); - if (method_type == Type.BOOLEAN || - method_type == Type.BYTE || - method_type == Type.SHORT || - method_type == Type.CHAR){ - method_type = Type.INT; - } - - if (o instanceof RETURN){ - if (method_type != Type.VOID){ - constraintViolated(o, "RETURN instruction in non-void method."); - } - else{ - return; - } - } - if (o instanceof ARETURN){ - if (stack().peek() == Type.NULL){ - return; - } - else{ - if (! (stack().peek() instanceof ReferenceType)){ - constraintViolated(o, "Reference type expected on top of stack, but is: '"+stack().peek()+"'."); - } - referenceTypeIsInitialized(o, (ReferenceType) (stack().peek())); - //ReferenceType objectref = (ReferenceType) (stack().peek()); - // TODO: This can only be checked if using Staerk-et-al's "set of object types" instead of a - // "wider cast object type" created during verification. - //if (! (objectref.isAssignmentCompatibleWith(mg.getType())) ){ - // constraintViolated(o, "Type on stack top which should be returned is a '"+stack().peek()+"' which is not assignment compatible with the return type of this method, '"+mg.getType()+"'."); - //} - } - } - else{ - if (! ( method_type.equals( stack().peek() ))){ - constraintViolated(o, "Current method has return type of '"+mg.getType()+"' expecting a '"+method_type+"' on top of the stack. But stack top is a '"+stack().peek()+"'."); - } - } - } - - /***************************************************************/ - /* "special"visitXXXX methods for one type of instruction each */ - /***************************************************************/ - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitAALOAD(AALOAD o){ - Type arrayref = stack().peek(1); - Type index = stack().peek(0); - - indexOfInt(o, index); - if (arrayrefOfArrayType(o, arrayref)){ - if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); - } - //referenceTypeIsInitialized(o, (ReferenceType) (((ArrayType) arrayref).getElementType())); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitAASTORE(AASTORE o){ - try { - Type arrayref = stack().peek(2); - Type index = stack().peek(1); - Type value = stack().peek(0); - - indexOfInt(o, index); - if (!(value instanceof ReferenceType)){ - constraintViolated(o, "The 'value' is not of a ReferenceType but of type "+value+"."); - }else{ - //referenceTypeIsInitialized(o, (ReferenceType) value); - } - // Don't bother further with "referenceTypeIsInitialized()", there are no arrays - // of an uninitialized object type. - if (arrayrefOfArrayType(o, arrayref)){ - if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); - } - if (! ((ReferenceType)value).isAssignmentCompatibleWith((ReferenceType) ((ArrayType) arrayref).getElementType())){ - constraintViolated(o, "The type of 'value' ('"+value+"') is not assignment compatible to the components of the array 'arrayref' refers to. ('"+((ArrayType) arrayref).getElementType()+"')"); - } - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitACONST_NULL(ACONST_NULL o){ - // Nothing needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitALOAD(ALOAD o){ - //visitLoadInstruction(LoadInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitANEWARRAY(ANEWARRAY o){ - if (!stack().peek().equals(Type.INT)) { - constraintViolated(o, "The 'count' at the stack top is not of type '"+Type.INT+"' but of type '"+stack().peek()+"'."); - // The runtime constant pool item at that index must be a symbolic reference to a class, - // array, or interface type. See Pass 3a. - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitARETURN(ARETURN o){ - if (! (stack().peek() instanceof ReferenceType) ){ - constraintViolated(o, "The 'objectref' at the stack top is not of a ReferenceType but of type '"+stack().peek()+"'."); - } - ReferenceType objectref = (ReferenceType) (stack().peek()); - referenceTypeIsInitialized(o, objectref); - - // The check below should already done via visitReturnInstruction(ReturnInstruction), see there. - // It cannot be done using Staerk-et-al's "set of object types" instead of a - // "wider cast object type", anyway. - //if (! objectref.isAssignmentCompatibleWith(mg.getReturnType() )){ - // constraintViolated(o, "The 'objectref' type "+objectref+" at the stack top is not assignment compatible with the return type '"+mg.getReturnType()+"' of the method."); - //} - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitARRAYLENGTH(ARRAYLENGTH o){ - Type arrayref = stack().peek(0); - arrayrefOfArrayType(o, arrayref); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitASTORE(ASTORE o){ - if (! ( (stack().peek() instanceof ReferenceType) || (stack().peek() instanceof ReturnaddressType) ) ){ - constraintViolated(o, "The 'objectref' is not of a ReferenceType or of ReturnaddressType but of "+stack().peek()+"."); - } - //if (stack().peek() instanceof ReferenceType){ - // referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); - //} - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitATHROW(ATHROW o){ - try { - // It's stated that 'objectref' must be of a ReferenceType --- but since Throwable is - // not derived from an ArrayType, it follows that 'objectref' must be of an ObjectType or Type.NULL. - if (! ((stack().peek() instanceof ObjectType) || (stack().peek().equals(Type.NULL))) ){ - constraintViolated(o, "The 'objectref' is not of an (initialized) ObjectType but of type "+stack().peek()+"."); - } - - // NULL is a subclass of every class, so to speak. - if (stack().peek().equals(Type.NULL)) { - return; - } - - ObjectType exc = (ObjectType) (stack().peek()); - ObjectType throwable = (ObjectType) (Type.getType("Ljava/lang/Throwable;")); - if ( (! (exc.subclassOf(throwable)) ) && (! (exc.equals(throwable))) ){ - constraintViolated(o, "The 'objectref' is not of class Throwable or of a subclass of Throwable, but of '"+stack().peek()+"'."); - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitBALOAD(BALOAD o){ - Type arrayref = stack().peek(1); - Type index = stack().peek(0); - indexOfInt(o, index); - if (arrayrefOfArrayType(o, arrayref)){ - if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || - (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ){ - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitBASTORE(BASTORE o){ - Type arrayref = stack().peek(2); - Type index = stack().peek(1); - Type value = stack().peek(0); - - indexOfInt(o, index); - valueOfInt(o, value); - if (arrayrefOfArrayType(o, arrayref)){ - if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || - (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ) { - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitBIPUSH(BIPUSH o){ - // Nothing to do... - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitBREAKPOINT(BREAKPOINT o){ - throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as BREAKPOINT."); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitCALOAD(CALOAD o){ - Type arrayref = stack().peek(1); - Type index = stack().peek(0); - - indexOfInt(o, index); - arrayrefOfArrayType(o, arrayref); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitCASTORE(CASTORE o){ - Type arrayref = stack().peek(2); - Type index = stack().peek(1); - Type value = stack().peek(0); - - indexOfInt(o, index); - valueOfInt(o, value); - if (arrayrefOfArrayType(o, arrayref)){ - if (! ((ArrayType) arrayref).getElementType().equals(Type.CHAR) ){ - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of type char but to an array of type "+((ArrayType) arrayref).getElementType()+"."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitCHECKCAST(CHECKCAST o){ - // The objectref must be of type reference. - Type objectref = stack().peek(0); - if (!(objectref instanceof ReferenceType)){ - constraintViolated(o, "The 'objectref' is not of a ReferenceType but of type "+objectref+"."); - } - //else{ - // referenceTypeIsInitialized(o, (ReferenceType) objectref); - //} - // The unsigned indexbyte1 and indexbyte2 are used to construct an index into the runtime constant pool of the - // current class (�3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant - // pool item at the index must be a symbolic reference to a class, array, or interface type. - Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ - constraintViolated(o, "The Constant at 'index' is not a ConstantClass, but '"+c+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitD2F(D2F o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitD2I(D2I o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitD2L(D2L o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDADD(DADD o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDALOAD(DALOAD o){ - indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ - return; - } - if (! (stack().peek(1) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-top must be of type double[] but is '"+stack().peek(1)+"'."); - } - Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.DOUBLE){ - constraintViolated(o, "Stack next-to-top must be of type double[] but is '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDASTORE(DASTORE o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ - return; - } - if (! (stack().peek(2) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-next-to-top must be of type double[] but is '"+stack().peek(2)+"'."); - } - Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.DOUBLE){ - constraintViolated(o, "Stack next-to-next-to-top must be of type double[] but is '"+stack().peek(2)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDCMPG(DCMPG o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDCMPL(DCMPL o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDCONST(DCONST o){ - // There's nothing to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDDIV(DDIV o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDLOAD(DLOAD o){ - //visitLoadInstruction(LoadInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDMUL(DMUL o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDNEG(DNEG o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDREM(DREM o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDRETURN(DRETURN o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDSTORE(DSTORE o){ - //visitStoreInstruction(StoreInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDSUB(DSUB o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDUP(DUP o){ - if (stack().peek().getSize() != 1){ - constraintViolated(o, "Won't DUP type on stack top '"+stack().peek()+"' because it must occupy exactly one slot, not '"+stack().peek().getSize()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDUP_X1(DUP_X1 o){ - if (stack().peek().getSize() != 1){ - constraintViolated(o, "Type on stack top '"+stack().peek()+"' should occupy exactly one slot, not '"+stack().peek().getSize()+"'."); - } - if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "Type on stack next-to-top '"+stack().peek(1)+"' should occupy exactly one slot, not '"+stack().peek(1).getSize()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDUP_X2(DUP_X2 o){ - if (stack().peek().getSize() != 1){ - constraintViolated(o, "Stack top type must be of size 1, but is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); - } - if (stack().peek(1).getSize() == 2){ - return; // Form 2, okay. - } - else{ //stack().peek(1).getSize == 1. - if (stack().peek(2).getSize() != 1){ - constraintViolated(o, "If stack top's size is 1 and stack next-to-top's size is 1, stack next-to-next-to-top's size must also be 1, but is: '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDUP2(DUP2 o){ - if (stack().peek().getSize() == 2){ - return; // Form 2, okay. - } - else{ //stack().peek().getSize() == 1. - if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDUP2_X1(DUP2_X1 o){ - if (stack().peek().getSize() == 2){ - if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "If stack top's size is 2, then stack next-to-top's size must be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); - } - else{ - return; // Form 2 - } - } - else{ // stack top is of size 1 - if ( stack().peek(1).getSize() != 1 ){ - constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); - } - if ( stack().peek(2).getSize() != 1 ){ - constraintViolated(o, "If stack top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitDUP2_X2(DUP2_X2 o){ - - if (stack().peek(0).getSize() == 2){ - if (stack().peek(1).getSize() == 2){ - return; // Form 4 - } - else{// stack top size is 2, next-to-top's size is 1 - if ( stack().peek(2).getSize() != 1 ){ - constraintViolated(o, "If stack top's size is 2 and stack-next-to-top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); - } - else{ - return; // Form 2 - } - } - } - else{// stack top is of size 1 - if (stack().peek(1).getSize() == 1){ - if ( stack().peek(2).getSize() == 2 ){ - return; // Form 3 - } - else{ - if ( stack().peek(3).getSize() == 1){ - return; // Form 1 - } - } - } - } - constraintViolated(o, "The operand sizes on the stack do not match any of the four forms of usage of this instruction."); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitF2D(F2D o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitF2I(F2I o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitF2L(F2L o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFADD(FADD o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFALOAD(FALOAD o){ - indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ - return; - } - if (! (stack().peek(1) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-top must be of type float[] but is '"+stack().peek(1)+"'."); - } - Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.FLOAT){ - constraintViolated(o, "Stack next-to-top must be of type float[] but is '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFASTORE(FASTORE o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ - return; - } - if (! (stack().peek(2) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-next-to-top must be of type float[] but is '"+stack().peek(2)+"'."); - } - Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.FLOAT){ - constraintViolated(o, "Stack next-to-next-to-top must be of type float[] but is '"+stack().peek(2)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFCMPG(FCMPG o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFCMPL(FCMPL o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFCONST(FCONST o){ - // nothing to do here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFDIV(FDIV o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFLOAD(FLOAD o){ - //visitLoadInstruction(LoadInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFMUL(FMUL o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFNEG(FNEG o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFREM(FREM o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFRETURN(FRETURN o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFSTORE(FSTORE o){ - //visitStoreInstruction(StoreInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitFSUB(FSUB o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitGETFIELD(GETFIELD o){ - try { - Type objectref = stack().peek(); - if (! ( (objectref instanceof ObjectType) || (objectref == Type.NULL) ) ){ - constraintViolated(o, "Stack top should be an object reference that's not an array reference, but is '"+objectref+"'."); - } - - String field_name = o.getFieldName(cpg); - - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); - Field[] fields = jc.getFields(); - Field f = null; - for (int i=0; i=0; i--){ - Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 - Type fromDesc = argtypes[i]; - if (fromDesc == Type.BOOLEAN || - fromDesc == Type.BYTE || - fromDesc == Type.CHAR || - fromDesc == Type.SHORT){ - fromDesc = Type.INT; - } - if (! fromStack.equals(fromDesc)){ - if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ - ReferenceType rFromStack = (ReferenceType) fromStack; - //ReferenceType rFromDesc = (ReferenceType) fromDesc; - // TODO: This can only be checked when using Staerk-et-al's "set of object types" - // instead of a "wider cast object type" created during verification. - //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); - //} - referenceTypeIsInitialized(o, rFromStack); - } - else{ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); - } - } - } - - Type objref = stack().peek(nargs); - if (objref == Type.NULL){ - return; - } - if (! (objref instanceof ReferenceType) ){ - constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); - } - referenceTypeIsInitialized(o, (ReferenceType) objref); - if (!(objref instanceof ObjectType)){ - if (!(objref instanceof ArrayType)){ - constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType - } - else{ - objref = GENERIC_ARRAY; - } - } - - // String objref_classname = ((ObjectType) objref).getClassName(); - // String theInterface = o.getClassName(cpg); - // TODO: This can only be checked if we're using Staerk-et-al's "set of object types" - // instead of "wider cast object types" generated during verification. - //if ( ! Repository.implementationOf(objref_classname, theInterface) ){ - // constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theInterface+"' as expected."); - //} - - int counted_count = 1; // 1 for the objectref - for (int i=0; i=0; i--){ - Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 - Type fromDesc = argtypes[i]; - if (fromDesc == Type.BOOLEAN || - fromDesc == Type.BYTE || - fromDesc == Type.CHAR || - fromDesc == Type.SHORT){ - fromDesc = Type.INT; - } - if (! fromStack.equals(fromDesc)){ - if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ - ReferenceType rFromStack = (ReferenceType) fromStack; - ReferenceType rFromDesc = (ReferenceType) fromDesc; - // TODO: This can only be checked using Staerk-et-al's "set of object types", not - // using a "wider cast object type". - if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); - } - referenceTypeIsInitialized(o, rFromStack); - } - else{ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); - } - } - } - - Type objref = stack().peek(nargs); - if (objref == Type.NULL){ - return; - } - if (! (objref instanceof ReferenceType) ){ - constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); - } - String objref_classname = null; - if ( !(o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME))){ - referenceTypeIsInitialized(o, (ReferenceType) objref); - if (!(objref instanceof ObjectType)){ - if (!(objref instanceof ArrayType)){ - constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType - } - else{ - objref = GENERIC_ARRAY; - } - } - - objref_classname = ((ObjectType) objref).getClassName(); - } - else{ - if (!(objref instanceof UninitializedObjectType)){ - constraintViolated(o, "Expecting an UninitializedObjectType as 'objectref' on the stack, not a '"+objref+"'. Otherwise, you couldn't invoke a method since an array has no methods (not to speak of a return address)."); - } - objref_classname = ((UninitializedObjectType) objref).getInitialized().getClassName(); - } - - - String theClass = o.getClassName(cpg); - if ( ! Repository.instanceOf(objref_classname, theClass) ){ - constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); - } - - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitINVOKESTATIC(INVOKESTATIC o){ - try { - // Method is not native, otherwise pass 3 would not happen. - - Type t = o.getType(cpg); - if (t instanceof ObjectType){ - String name = ((ObjectType)t).getClassName(); - Verifier v = VerifierFactory.getVerifier( name ); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); - } - } - - Type[] argtypes = o.getArgumentTypes(cpg); - int nargs = argtypes.length; - - for (int i=nargs-1; i>=0; i--){ - Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 - Type fromDesc = argtypes[i]; - if (fromDesc == Type.BOOLEAN || - fromDesc == Type.BYTE || - fromDesc == Type.CHAR || - fromDesc == Type.SHORT){ - fromDesc = Type.INT; - } - if (! fromStack.equals(fromDesc)){ - if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ - ReferenceType rFromStack = (ReferenceType) fromStack; - ReferenceType rFromDesc = (ReferenceType) fromDesc; - // TODO: This check can possibly only be done using Staerk-et-al's "set of object types" - // instead of a "wider cast object type" created during verification. - if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); - } - referenceTypeIsInitialized(o, rFromStack); - } - else{ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); - } - } - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ - try { - // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). - - Type t = o.getType(cpg); - if (t instanceof ObjectType){ - String name = ((ObjectType)t).getClassName(); - Verifier v = VerifierFactory.getVerifier( name ); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); - } - } - - - Type[] argtypes = o.getArgumentTypes(cpg); - int nargs = argtypes.length; - - for (int i=nargs-1; i>=0; i--){ - Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 - Type fromDesc = argtypes[i]; - if (fromDesc == Type.BOOLEAN || - fromDesc == Type.BYTE || - fromDesc == Type.CHAR || - fromDesc == Type.SHORT){ - fromDesc = Type.INT; - } - if (! fromStack.equals(fromDesc)){ - if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ - ReferenceType rFromStack = (ReferenceType) fromStack; - ReferenceType rFromDesc = (ReferenceType) fromDesc; - // TODO: This can possibly only be checked when using Staerk-et-al's "set of object types" instead - // of a single "wider cast object type" created during verification. - if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); - } - referenceTypeIsInitialized(o, rFromStack); - } - else{ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); - } - } - } - - Type objref = stack().peek(nargs); - if (objref == Type.NULL){ - return; - } - if (! (objref instanceof ReferenceType) ){ - constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); - } - referenceTypeIsInitialized(o, (ReferenceType) objref); - if (!(objref instanceof ObjectType)){ - if (!(objref instanceof ArrayType)){ - constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType - } - else{ - objref = GENERIC_ARRAY; - } - } - - String objref_classname = ((ObjectType) objref).getClassName(); - - String theClass = o.getClassName(cpg); - - if ( ! Repository.instanceOf(objref_classname, theClass) ){ - constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitIOR(IOR o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitIREM(IREM o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitIRETURN(IRETURN o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitISHL(ISHL o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitISHR(ISHR o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitISTORE(ISTORE o){ - //visitStoreInstruction(StoreInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitISUB(ISUB o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitIUSHR(IUSHR o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitIXOR(IXOR o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitJSR(JSR o){ - // nothing to do here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitJSR_W(JSR_W o){ - // nothing to do here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitL2D(L2D o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitL2F(L2F o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitL2I(L2I o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLADD(LADD o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLALOAD(LALOAD o){ - indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ - return; - } - if (! (stack().peek(1) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-top must be of type long[] but is '"+stack().peek(1)+"'."); - } - Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.LONG){ - constraintViolated(o, "Stack next-to-top must be of type long[] but is '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLAND(LAND o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLASTORE(LASTORE o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ - return; - } - if (! (stack().peek(2) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-next-to-top must be of type long[] but is '"+stack().peek(2)+"'."); - } - Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.LONG){ - constraintViolated(o, "Stack next-to-next-to-top must be of type long[] but is '"+stack().peek(2)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLCMP(LCMP o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLCONST(LCONST o){ - // Nothing to do here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLDC(LDC o){ - // visitCPInstruction is called first. - - Constant c = cpg.getConstant(o.getIndex()); - if (! ( ( c instanceof ConstantInteger) || - ( c instanceof ConstantFloat ) || - ( c instanceof ConstantString ) ) ){ - constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLDC_W(LDC_W o){ - // visitCPInstruction is called first. - - Constant c = cpg.getConstant(o.getIndex()); - if (! ( ( c instanceof ConstantInteger) || - ( c instanceof ConstantFloat ) || - ( c instanceof ConstantString ) ) ){ - constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLDC2_W(LDC2_W o){ - // visitCPInstruction is called first. - - Constant c = cpg.getConstant(o.getIndex()); - if (! ( ( c instanceof ConstantLong) || - ( c instanceof ConstantDouble ) ) ){ - constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLDIV(LDIV o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLLOAD(LLOAD o){ - //visitLoadInstruction(LoadInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLMUL(LMUL o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLNEG(LNEG o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - // See also pass 3a. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLOR(LOR o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLREM(LREM o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLRETURN(LRETURN o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLSHL(LSHL o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLSHR(LSHR o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLSTORE(LSTORE o){ - //visitStoreInstruction(StoreInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLSUB(LSUB o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLUSHR(LUSHR o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLXOR(LXOR o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitMONITORENTER(MONITORENTER o){ - if (! ((stack().peek()) instanceof ReferenceType)){ - constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); - } - //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitMONITOREXIT(MONITOREXIT o){ - if (! ((stack().peek()) instanceof ReferenceType)){ - constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); - } - //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitMULTIANEWARRAY(MULTIANEWARRAY o){ - int dimensions = o.getDimensions(); - // Dimensions argument is okay: see Pass 3a. - for (int i=0; i, see Pass 3a. - - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitRET(RET o){ - if (! (locals().get(o.getIndex()) instanceof ReturnaddressType)){ - constraintViolated(o, "Expecting a ReturnaddressType in local variable "+o.getIndex()+"."); - } - if (locals().get(o.getIndex()) == ReturnaddressType.NO_TARGET){ - throw new AssertionViolatedException("Oops: RET expecting a target!"); - } - // Other constraints such as non-allowed overlapping subroutines are enforced - // while building the Subroutines data structure. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitRETURN(RETURN o){ - if (mg.getName().equals(Constants.CONSTRUCTOR_NAME)){// If we leave an method - if ((Frame._this != null) && (!(mg.getClassName().equals(Type.OBJECT.getClassName()))) ) { - constraintViolated(o, "Leaving a constructor that itself did not call a constructor."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitSALOAD(SALOAD o){ - indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ - return; - } - if (! (stack().peek(1) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-top must be of type short[] but is '"+stack().peek(1)+"'."); - } - Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.SHORT){ - constraintViolated(o, "Stack next-to-top must be of type short[] but is '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitSASTORE(SASTORE o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ - return; - } - if (! (stack().peek(2) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-next-to-top must be of type short[] but is '"+stack().peek(2)+"'."); - } - Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.SHORT){ - constraintViolated(o, "Stack next-to-next-to-top must be of type short[] but is '"+stack().peek(2)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitSIPUSH(SIPUSH o){ - // nothing to do here. Generic visitXXX() methods did the trick before. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitSWAP(SWAP o){ - if (stack().peek().getSize() != 1){ - constraintViolated(o, "The value at the stack top is not of size '1', but of size '"+stack().peek().getSize()+"'."); - } - if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "The value at the stack next-to-top is not of size '1', but of size '"+stack().peek(1).getSize()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitTABLESWITCH(TABLESWITCH o){ - indexOfInt(o, stack().peek()); - // See Pass 3a. - } - -} - diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java deleted file mode 100644 index fa42db5f..00000000 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.structurals; - - -import java.util.ArrayList; -import org.apache.bcel.generic.InstructionHandle; - -/** - * An InstructionContext offers convenient access - * to information like control flow successors and - * such. - * - * @version $Id$ - * @author Enver Haase - */ -public interface InstructionContext{ - - /** - * The getTag and setTag methods may be used for - * temporary flagging, such as graph colouring. - * Nothing in the InstructionContext object depends - * on the value of the tag. JustIce does not use it. - * - * @see #setTag(int tag) - */ - public int getTag(); - - /** - * The getTag and setTag methods may be used for - * temporary flagging, such as graph colouring. - * Nothing in the InstructionContext object depends - * on the value of the tag. JustIce does not use it. - * - * @see #getTag() - */ - public void setTag(int tag); - - /** - * This method symbolically executes the Instruction - * held in the InstructionContext. - * It "merges in" the incoming execution frame situation - * (see The Java Virtual Machine Specification, 2nd - * edition, page 146). - * By so doing, the outgoing execution frame situation - * is calculated. - * - * This method is JustIce-specific and is usually of - * no sense for users of the ControlFlowGraph class. - * They should use getInstruction().accept(Visitor), - * possibly in conjunction with the ExecutionVisitor. - * - * - * @see ControlFlowGraph - * @see ExecutionVisitor - * @see #getOutFrame(ArrayList) - * @return true - if and only if the "outgoing" frame situation - * changed from the one before execute()ing. - */ - boolean execute(Frame inFrame, ArrayList executionPredecessors, InstConstraintVisitor icv, ExecutionVisitor ev); - - Frame getInFrame(); - - /** - * This method returns the outgoing execution frame situation; - * therefore it has to be calculated by execute(Frame, ArrayList) - * first. - * - * @see #execute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) - */ - Frame getOutFrame(ArrayList executionPredecessors); - - /** - * Returns the InstructionHandle this InstructionContext is wrapped around. - * - * @return The InstructionHandle this InstructionContext is wrapped around. - */ - InstructionHandle getInstruction(); - - /** - * Returns the usual control flow successors. - * @see #getExceptionHandlers() - */ - InstructionContext[] getSuccessors(); - - /** - * Returns the exception handlers that protect this instruction. - * They are special control flow successors. - */ - ExceptionHandler[] getExceptionHandlers(); -} diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java deleted file mode 100644 index 199edb25..00000000 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.structurals; - - -import org.apache.bcel.generic.ReferenceType; -import org.apache.bcel.generic.Type; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; - -/** - * This class implements an array of local variables used for symbolic JVM - * simulation. - * - * @version $Id$ - * @author Enver Haase - */ -public class LocalVariables{ - /** The Type[] containing the local variable slots. */ - private Type[] locals; - - /** - * Creates a new LocalVariables object. - */ - public LocalVariables(int maxLocals){ - locals = new Type[maxLocals]; - for (int i=0; i= maxStack){ - throw new AssertionViolatedException("OperandStack too small, should have thrown proper Exception elsewhere. Stack: "+this); - } - stack.add(type); - } - - /** - * Returns the size of this OperandStack; that means, how many Type objects there are. - */ - public int size(){ - return stack.size(); - } - - /** - * Returns the number of stack slots used. - * @see #maxStack() - */ - public int slotsUsed(){ - /* XXX change this to a better implementation using a variable - that keeps track of the actual slotsUsed()-value monitoring - all push()es and pop()s. - */ - int slots = 0; - for (int i=0; i no Instruction was executed before - // => Top-Level routine (no jsr call before) - icq.add(start, new ArrayList()); - - // LOOP! - while (!icq.isEmpty()){ - InstructionContext u; - ArrayList ec; - if (!DEBUG){ - int r = random.nextInt(icq.size()); - u = icq.getIC(r); - ec = icq.getEC(r); - icq.remove(r); - } - else{ - u = icq.getIC(0); - ec = icq.getEC(0); - icq.remove(0); - } - - ArrayList oldchain = (ArrayList) (ec.clone()); - ArrayList newchain = (ArrayList) (ec.clone()); - newchain.add(u); - - if ((u.getInstruction().getInstruction()) instanceof RET){ -//System.err.println(u); - // We can only follow _one_ successor, the one after the - // JSR that was recently executed. - RET ret = (RET) (u.getInstruction().getInstruction()); - ReturnaddressType t = (ReturnaddressType) u.getOutFrame(oldchain).getLocals().get(ret.getIndex()); - InstructionContext theSuccessor = cfg.contextOf(t.getTarget()); - - // Sanity check - InstructionContext lastJSR = null; - int skip_jsr = 0; - for (int ss=oldchain.size()-1; ss >= 0; ss--){ - if (skip_jsr < 0){ - throw new AssertionViolatedException("More RET than JSR in execution chain?!"); - } -//System.err.println("+"+oldchain.get(ss)); - if (((InstructionContext) oldchain.get(ss)).getInstruction().getInstruction() instanceof JsrInstruction){ - if (skip_jsr == 0){ - lastJSR = (InstructionContext) oldchain.get(ss); - break; - } - else{ - skip_jsr--; - } - } - if (((InstructionContext) oldchain.get(ss)).getInstruction().getInstruction() instanceof RET){ - skip_jsr++; - } - } - if (lastJSR == null){ - throw new AssertionViolatedException("RET without a JSR before in ExecutionChain?! EC: '"+oldchain+"'."); - } - JsrInstruction jsr = (JsrInstruction) (lastJSR.getInstruction().getInstruction()); - if ( theSuccessor != (cfg.contextOf(jsr.physicalSuccessor())) ){ - throw new AssertionViolatedException("RET '"+u.getInstruction()+"' info inconsistent: jump back to '"+theSuccessor+"' or '"+cfg.contextOf(jsr.physicalSuccessor())+"'?"); - } - - if (theSuccessor.execute(u.getOutFrame(oldchain), newchain, icv, ev)){ - icq.add(theSuccessor, (ArrayList) newchain.clone()); - } - } - else{// "not a ret" - - // Normal successors. Add them to the queue of successors. - InstructionContext[] succs = u.getSuccessors(); - for (int s=0; sMust not be invoked on the 'top-level subroutine'. - */ - public InstructionHandle[] getEnteringJsrInstructions(); - - /** - * Returns the one and only RET that leaves the subroutine. - * Note that JustIce has a pretty rigid notion of a subroutine. - * Must not be invoked on the 'top-level subroutine'. - * - * @see org.apache.bcel.verifier.structurals.Subroutines - */ - public InstructionHandle getLeavingRET(); - - /** - * Returns all instructions that together form this subroutine. - * Note that an instruction is part of exactly one subroutine - * (the top-level code is considered to be a special subroutine) - - * else it is not reachable at all (dead code). - */ - public InstructionHandle[] getInstructions(); - - /** - * Returns if the given InstructionHandle refers to an instruction - * that is part of this subroutine. This is a convenience method - * that saves iteration over the InstructionHandle objects returned - * by getInstructions(). - * - * @see #getInstructions() - */ - public boolean contains(InstructionHandle inst); - - /** - * Returns an int[] containing the indices of the local variable slots - * accessed by this Subroutine (read-accessed, write-accessed or both); - * local variables referenced by subroutines of this subroutine are - * not included. - * - * @see #getRecursivelyAccessedLocalsIndices() - */ - public int[] getAccessedLocalsIndices(); - - /** - * Returns an int[] containing the indices of the local variable slots - * accessed by this Subroutine (read-accessed, write-accessed or both); - * local variables referenced by subroutines of this subroutine are - * included. - * - * @see #getAccessedLocalsIndices() - */ - public int[] getRecursivelyAccessedLocalsIndices(); - - /** - * Returns the subroutines that are directly called from this subroutine. - */ - public Subroutine[] subSubs(); -} diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java deleted file mode 100644 index 3fcf6249..00000000 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ /dev/null @@ -1,653 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.structurals; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.apache.bcel.generic.ASTORE; -import org.apache.bcel.generic.ATHROW; -import org.apache.bcel.generic.BranchInstruction; -import org.apache.bcel.generic.CodeExceptionGen; -import org.apache.bcel.generic.GotoInstruction; -import org.apache.bcel.generic.IndexedInstruction; -import org.apache.bcel.generic.Instruction; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.JsrInstruction; -import org.apache.bcel.generic.LocalVariableInstruction; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.RET; -import org.apache.bcel.generic.ReturnInstruction; -import org.apache.bcel.generic.Select; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; - - /** - * Instances of this class contain information about the subroutines - * found in a code array of a method. - * This implementation considers the top-level (the instructions - * reachable without a JSR or JSR_W starting off from the first - * instruction in a code array of a method) being a special subroutine; - * see getTopLevel() for that. - * Please note that the definition of subroutines in the Java Virtual - * Machine Specification, Second Edition is somewhat incomplete. - * Therefore, JustIce uses an own, more rigid notion. - * Basically, a subroutine is a piece of code that starts at the target - * of a JSR of JSR_W instruction and ends at a corresponding RET - * instruction. Note also that the control flow of a subroutine - * may be complex and non-linear; and that subroutines may be nested. - * JustIce also mandates subroutines not to be protected by exception - * handling code (for the sake of control flow predictability). - * To understand JustIce's notion of subroutines, please read - * - * TODO: refer to the paper. - * - * @version $Id$ - * @author Enver Haase - * @see #getTopLevel() - */ -public class Subroutines{ - /** - * This inner class implements the Subroutine interface. - */ - private class SubroutineImpl implements Subroutine{ - /** - * UNSET, a symbol for an uninitialized localVariable - * field. This is used for the "top-level" Subroutine; - * i.e. no subroutine. - */ - private static final int UNSET = -1; - - /** - * The Local Variable slot where the first - * instruction of this subroutine (an ASTORE) stores - * the JsrInstruction's ReturnAddress in and - * the RET of this subroutine operates on. - */ - private int localVariable = UNSET; - - /** The instructions that belong to this subroutine. */ - private Set instructions = new HashSet(); // Elements: InstructionHandle - - /* - * Refer to the Subroutine interface for documentation. - */ - public boolean contains(InstructionHandle inst){ - return instructions.contains(inst); - } - - /** - * The JSR or JSR_W instructions that define this - * subroutine by targeting it. - */ - private Set theJSRs = new HashSet(); - - /** - * The RET instruction that leaves this subroutine. - */ - private InstructionHandle theRET; - - /** - * Returns a String representation of this object, merely - * for debugging purposes. - * (Internal) Warning: Verbosity on a problematic subroutine may cause - * stack overflow errors due to recursive subSubs() calls. - * Don't use this, then. - */ - public String toString(){ - String ret = "Subroutine: Local variable is '"+localVariable+"', JSRs are '"+theJSRs+"', RET is '"+theRET+"', Instructions: '"+instructions.toString()+"'."; - - ret += " Accessed local variable slots: '"; - int[] alv = getAccessedLocalsIndices(); - for (int i=0; inot a - * subroutine, the top-level, is also modeled as a Subroutine - * object. - * It is a special Subroutine object where you must not invoke - * getEnteringJsrInstructions() or getLeavingRET(). - * - * @see Subroutine#getEnteringJsrInstructions() - * @see Subroutine#getLeavingRET() - */ - public Subroutine getTopLevel(){ - return TOPLEVEL; - } - /** - * A utility method that calculates the successors of a given InstructionHandle - * in the same subroutine. That means, a RET does not have any successors - * as defined here. A JsrInstruction has its physical successor as its successor - * (opposed to its target) as defined here. - */ - private static InstructionHandle[] getSuccessors(InstructionHandle instruction){ - final InstructionHandle[] empty = new InstructionHandle[0]; - final InstructionHandle[] single = new InstructionHandle[1]; - - Instruction inst = instruction.getInstruction(); - - if (inst instanceof RET){ - return empty; - } - - // Terminates method normally. - if (inst instanceof ReturnInstruction){ - return empty; - } - - // Terminates method abnormally, because JustIce mandates - // subroutines not to be protected by exception handlers. - if (inst instanceof ATHROW){ - return empty; - } - - // See method comment. - if (inst instanceof JsrInstruction){ - single[0] = instruction.getNext(); - return single; - } - - if (inst instanceof GotoInstruction){ - single[0] = ((GotoInstruction) inst).getTarget(); - return single; - } - - if (inst instanceof BranchInstruction){ - if (inst instanceof Select){ - // BCEL's getTargets() returns only the non-default targets, - // thanks to Eli Tilevich for reporting. - InstructionHandle[] matchTargets = ((Select) inst).getTargets(); - InstructionHandle[] ret = new InstructionHandle[matchTargets.length+1]; - ret[0] = ((Select) inst).getTarget(); - System.arraycopy(matchTargets, 0, ret, 1, matchTargets.length); - return ret; - } - else{ - final InstructionHandle[] pair = new InstructionHandle[2]; - pair[0] = instruction.getNext(); - pair[1] = ((BranchInstruction) inst).getTarget(); - return pair; - } - } - - // default case: Fall through. - single[0] = instruction.getNext(); - return single; - } - - /** - * Returns a String representation of this object; merely for debugging puposes. - */ - public String toString(){ - return "---\n"+subroutines.toString()+"\n---\n"; - } -} diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java deleted file mode 100644 index 096dc446..00000000 --- a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.bcel.verifier.structurals; - - -import org.apache.bcel.Constants; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.ReferenceType; - -/** - * This class represents an uninitialized object type; see The Java - * Virtual Machine Specification, Second Edition, page 147: 4.9.4 for - * more details. - * - * @version $Id$ - * @author Enver Haase - */ -public class UninitializedObjectType extends ReferenceType implements Constants{ - - /** The "initialized" version. */ - private ObjectType initialized; - - /** Creates a new instance. */ - public UninitializedObjectType(ObjectType t){ - super(T_UNKNOWN, ""); - initialized = t; - } - - /** - * Returns the ObjectType of the same class as the one of the uninitialized object - * represented by this UninitializedObjectType instance. - */ - public ObjectType getInitialized(){ - return initialized; - } - - /** @return a hash code value for the object. - */ - public int hashCode() { return initialized.hashCode(); } - - /** - * Returns true on equality of this and o. - * Equality means the ObjectType instances of "initialized" - * equal one another in this and the o instance. - * - */ - public boolean equals(Object o){ - if (! (o instanceof UninitializedObjectType)) { - return false; - } - return initialized.equals(((UninitializedObjectType)o).initialized); - } -} diff --git a/src/main/java/org/apache/bcel/verifier/structurals/package.html b/src/main/java/org/apache/bcel/verifier/structurals/package.html deleted file mode 100644 index 94ba2fa8..00000000 --- a/src/main/java/org/apache/bcel/verifier/structurals/package.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - -Provides a PassVerifier class mostly used internally by JustIce, yielding a control flow graph for public use as -a nice side effect. - -

          Package Specification

          - -Contained in this package is a PassVerifier class for use with the JustIce verifier and its utility classes. -Only the pass performing what Sun calls "Structural Constraints on Java Virtual Machine Code" -has a PassVerifier class here. JustIce calls this pass "Pass 3b". - - - -- GitLab From 0498f3cedc124735e391d3ed746fd9a8100edb9f Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Fri, 4 Dec 2009 18:16:34 +0000 Subject: [PATCH 0423/1313] Revert r887304. Sorry for the noise. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@887309 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/GraphicalVerifier.java | 72 + .../apache/bcel/verifier/NativeVerifier.java | 74 + .../apache/bcel/verifier/PassVerifier.java | 105 + .../apache/bcel/verifier/TransitiveHull.java | 104 + .../bcel/verifier/VerificationResult.java | 115 + .../org/apache/bcel/verifier/Verifier.java | 248 ++ .../bcel/verifier/VerifierAppFrame.java | 396 +++ .../apache/bcel/verifier/VerifierFactory.java | 110 + .../verifier/VerifierFactoryListModel.java | 75 + .../verifier/VerifierFactoryObserver.java | 39 + .../apache/bcel/verifier/VerifyDialog.java | 553 ++++ .../exc/AssertionViolatedException.java | 83 + .../exc/ClassConstraintException.java | 49 + .../verifier/exc/CodeConstraintException.java | 40 + .../verifier/exc/InvalidMethodException.java | 32 + .../exc/LinkingConstraintException.java | 37 + .../bcel/verifier/exc/LoadingException.java | 42 + ...ocalVariableInfoInconsistentException.java | 44 + .../exc/StaticCodeConstraintException.java | 34 + ...ticCodeInstructionConstraintException.java | 37 + ...InstructionOperandConstraintException.java | 37 + .../StructuralCodeConstraintException.java | 45 + .../org/apache/bcel/verifier/exc/Utility.java | 40 + .../verifier/exc/VerificationException.java | 52 + .../VerifierConstraintViolatedException.java | 83 + .../org/apache/bcel/verifier/exc/package.html | 17 + .../org/apache/bcel/verifier/package.html | 18 + .../bcel/verifier/statics/DOUBLE_Upper.java | 42 + .../apache/bcel/verifier/statics/IntList.java | 51 + .../bcel/verifier/statics/LONG_Upper.java | 42 + .../verifier/statics/LocalVariableInfo.java | 107 + .../verifier/statics/LocalVariablesInfo.java | 74 + .../bcel/verifier/statics/Pass1Verifier.java | 185 ++ .../bcel/verifier/statics/Pass2Verifier.java | 1444 +++++++++ .../bcel/verifier/statics/Pass3aVerifier.java | 1224 ++++++++ .../statics/StringRepresentation.java | 265 ++ .../apache/bcel/verifier/statics/package.html | 19 + .../structurals/ControlFlowGraph.java | 461 +++ .../structurals/ExceptionHandler.java | 57 + .../structurals/ExceptionHandlers.java | 76 + .../structurals/ExecutionVisitor.java | 1090 +++++++ .../bcel/verifier/structurals/Frame.java | 119 + .../verifier/structurals/GenericArray.java | 33 + .../structurals/InstConstraintVisitor.java | 2718 +++++++++++++++++ .../structurals/InstructionContext.java | 105 + .../verifier/structurals/LocalVariables.java | 209 ++ .../verifier/structurals/OperandStack.java | 263 ++ .../verifier/structurals/Pass3bVerifier.java | 390 +++ .../bcel/verifier/structurals/Subroutine.java | 89 + .../verifier/structurals/Subroutines.java | 653 ++++ .../structurals/UninitializedObjectType.java | 67 + .../bcel/verifier/structurals/package.html | 20 + 52 files changed, 12384 insertions(+) create mode 100644 src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java create mode 100644 src/main/java/org/apache/bcel/verifier/NativeVerifier.java create mode 100644 src/main/java/org/apache/bcel/verifier/PassVerifier.java create mode 100644 src/main/java/org/apache/bcel/verifier/TransitiveHull.java create mode 100644 src/main/java/org/apache/bcel/verifier/VerificationResult.java create mode 100644 src/main/java/org/apache/bcel/verifier/Verifier.java create mode 100644 src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java create mode 100644 src/main/java/org/apache/bcel/verifier/VerifierFactory.java create mode 100644 src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java create mode 100644 src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java create mode 100644 src/main/java/org/apache/bcel/verifier/VerifyDialog.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/LoadingException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/Utility.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/VerificationException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java create mode 100644 src/main/java/org/apache/bcel/verifier/exc/package.html create mode 100644 src/main/java/org/apache/bcel/verifier/package.html create mode 100644 src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java create mode 100644 src/main/java/org/apache/bcel/verifier/statics/IntList.java create mode 100644 src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java create mode 100644 src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java create mode 100644 src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java create mode 100644 src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java create mode 100644 src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java create mode 100644 src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java create mode 100644 src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java create mode 100644 src/main/java/org/apache/bcel/verifier/statics/package.html create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/Frame.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java create mode 100644 src/main/java/org/apache/bcel/verifier/structurals/package.html diff --git a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java new file mode 100644 index 00000000..7dbee639 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java @@ -0,0 +1,72 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier; + +import java.awt.Dimension; +import java.awt.Toolkit; +import javax.swing.UIManager; +import org.apache.bcel.generic.Type; + +/** + * A graphical user interface application demonstrating JustIce. + * + * @version $Id$ + * @author Enver Haase + */ +public class GraphicalVerifier { + + boolean packFrame = false; + + + /** Constructor. */ + public GraphicalVerifier() { + VerifierAppFrame frame = new VerifierAppFrame(); + //Frames �berpr�fen, die voreingestellte Gr��e haben + //Frames packen, die nutzbare bevorzugte Gr��eninformationen enthalten, z.B. aus ihrem Layout + if (packFrame) { + frame.pack(); + } else { + frame.validate(); + } + //Das Fenster zentrieren + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + Dimension frameSize = frame.getSize(); + if (frameSize.height > screenSize.height) { + frameSize.height = screenSize.height; + } + if (frameSize.width > screenSize.width) { + frameSize.width = screenSize.width; + } + frame.setLocation((screenSize.width - frameSize.width) / 2, + (screenSize.height - frameSize.height) / 2); + frame.setVisible(true); + frame.classNamesJList.setModel(new VerifierFactoryListModel()); + VerifierFactory.getVerifier(Type.OBJECT.getClassName()); // Fill list with java.lang.Object + frame.classNamesJList.setSelectedIndex(0); // default, will verify java.lang.Object + } + + + /** Main method. */ + public static void main( String[] args ) { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception e) { + e.printStackTrace(); + } + new GraphicalVerifier(); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java new file mode 100644 index 00000000..f444dd7c --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java @@ -0,0 +1,74 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier; + +/** + * The NativeVerifier class implements a main(String[] args) method that's + * roughly compatible to the one in the Verifier class, but that uses the + * JVM's internal verifier for its class file verification. + * This can be used for comparison runs between the JVM-internal verifier + * and JustIce. + * + * @version $Id$ + * @author Enver Haase + */ +public abstract class NativeVerifier { + + /** + * This class must not be instantiated. + */ + private NativeVerifier() { + } + + + /** + * Works only on the first argument. + */ + public static void main( String[] args ) { + if (args.length != 1) { + System.out.println("Verifier front-end: need exactly one argument."); + System.exit(1); + } + int dotclasspos = args[0].lastIndexOf(".class"); + if (dotclasspos != -1) { + args[0] = args[0].substring(0, dotclasspos); + } + args[0] = args[0].replace('/', '.'); + //System.out.println(args[0]); + try { + Class.forName(args[0]); + } catch (ExceptionInInitializerError eiie) { //subclass of LinkageError! + System.out.println("NativeVerifier: ExceptionInInitializerError encountered on '" + + args[0] + "'."); + System.out.println(eiie); + System.exit(1); + } catch (LinkageError le) { + System.out.println("NativeVerifier: LinkageError encountered on '" + args[0] + "'."); + System.out.println(le); + System.exit(1); + } catch (ClassNotFoundException cnfe) { + System.out.println("NativeVerifier: FILE NOT FOUND: '" + args[0] + "'."); + System.exit(1); + } catch (Throwable t) { + System.out.println("NativeVerifier: Unspecified verification error on'" + args[0] + + "'."); + System.exit(1); + } + System.out.println("NativeVerifier: Class file '" + args[0] + "' seems to be okay."); + System.exit(0); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/PassVerifier.java b/src/main/java/org/apache/bcel/verifier/PassVerifier.java new file mode 100644 index 00000000..9a14c13b --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/PassVerifier.java @@ -0,0 +1,105 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier; + +import java.util.ArrayList; +import java.util.List; + +/** + * A PassVerifier actually verifies a class file; it is instantiated + * by a Verifier. + * The verification should conform with a certain pass as described + * in The Java Virtual Machine Specification, 2nd edition. + * This book describes four passes. Pass one means loading the + * class and verifying a few static constraints. Pass two actually + * verifies some other constraints that could enforce loading in + * referenced class files. Pass three is the first pass that actually + * checks constraints in the code array of a method in the class file; + * it has two parts with the first verifying static constraints and + * the second part verifying structural constraints (where a data flow + * analysis is used for). The fourth pass, finally, performs checks + * that can only be done at run-time. + * JustIce does not have a run-time pass, but certain constraints that + * are usually delayed until run-time for performance reasons are also + * checked during the second part of pass three. + * PassVerifier instances perform caching. + * That means, if you really want a new verification run of a certain + * pass you must use a new instance of a given PassVerifier. + * + * @version $Id$ + * @author Enver Haase + * @see org.apache.bcel.verifier.Verifier + * @see #verify() + */ +public abstract class PassVerifier { + + /** The (warning) messages. */ + private List messages = new ArrayList(); //Type of elements: String + /** The VerificationResult cache. */ + private VerificationResult verificationResult = null; + + + /** + * This method runs a verification pass conforming to the + * Java Virtual Machine Specification, 2nd edition, on a + * class file. + * PassVerifier instances perform caching; + * i.e. if the verify() method once determined a VerificationResult, + * then this result may be returned after every invocation of this + * method instead of running the verification pass anew; likewise with + * the result of getMessages(). + * + * @see #getMessages() + * @see #addMessage(String) + */ + public VerificationResult verify() { + if (verificationResult == null) { + verificationResult = do_verify(); + } + return verificationResult; + } + + + /** Does the real verification work, uncached. */ + public abstract VerificationResult do_verify(); + + + /** + * This method adds a (warning) message to the message pool of this + * PassVerifier. This method is normally only internally used by + * BCEL's class file verifier "JustIce" and should not be used from + * the outside. + * + * @see #getMessages() + */ + public void addMessage( String message ) { + messages.add(message); + } + + + /** + * Returns the (warning) messages that this PassVerifier accumulated + * during its do_verify()ing work. + * + * @see #addMessage(String) + * @see #do_verify() + */ + public String[] getMessages() { + verify(); // create messages if not already done (cached!) + return (String[]) messages.toArray(new String[messages.size()]); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java new file mode 100644 index 00000000..bbc2b9f6 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java @@ -0,0 +1,104 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier; + +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; + +/** + * This class has a main method implementing a demonstration program + * of how to use the VerifierFactoryObserver. It transitively verifies + * all class files encountered; this may take up a lot of time and, + * more notably, memory. + * + * @version $Id$ + * @author Enver Haase + */ +public class TransitiveHull implements VerifierFactoryObserver { + + /** Used for indentation. */ + private int indent = 0; + + + /** Not publicly instantiable. */ + private TransitiveHull() { + } + + + /* Implementing VerifierFactoryObserver. */ + public void update( String classname ) { + System.gc(); // avoid swapping if possible. + for (int i = 0; i < indent; i++) { + System.out.print(" "); + } + System.out.println(classname); + indent += 1; + Verifier v = VerifierFactory.getVerifier(classname); + VerificationResult vr; + vr = v.doPass1(); + if (vr != VerificationResult.VR_OK) { + System.out.println("Pass 1:\n" + vr); + } + vr = v.doPass2(); + if (vr != VerificationResult.VR_OK) { + System.out.println("Pass 2:\n" + vr); + } + if (vr == VerificationResult.VR_OK) { + try { + JavaClass jc = Repository.lookupClass(v.getClassName()); + for (int i = 0; i < jc.getMethods().length; i++) { + vr = v.doPass3a(i); + if (vr != VerificationResult.VR_OK) { + System.out.println(v.getClassName() + ", Pass 3a, method " + i + " ['" + + jc.getMethods()[i] + "']:\n" + vr); + } + vr = v.doPass3b(i); + if (vr != VerificationResult.VR_OK) { + System.out.println(v.getClassName() + ", Pass 3b, method " + i + " ['" + + jc.getMethods()[i] + "']:\n" + vr); + } + } + } catch (ClassNotFoundException e) { + System.err.println("Could not find class " + v.getClassName() + " in Repository"); + } + } + indent -= 1; + } + + + /** + * This method implements a demonstration program + * of how to use the VerifierFactoryObserver. It transitively verifies + * all class files encountered; this may take up a lot of time and, + * more notably, memory. + */ + public static void main( String[] args ) { + if (args.length != 1) { + System.out.println("Need exactly one argument: The root class to verify."); + System.exit(1); + } + int dotclasspos = args[0].lastIndexOf(".class"); + if (dotclasspos != -1) { + args[0] = args[0].substring(0, dotclasspos); + } + args[0] = args[0].replace('/', '.'); + TransitiveHull th = new TransitiveHull(); + VerifierFactory.attach(th); + VerifierFactory.getVerifier(args[0]); // the observer is called back and does the actual trick. + VerifierFactory.detach(th); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/VerificationResult.java b/src/main/java/org/apache/bcel/verifier/VerificationResult.java new file mode 100644 index 00000000..1af57e02 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/VerificationResult.java @@ -0,0 +1,115 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier; + +/** + * A VerificationResult is what a PassVerifier returns + * after verifying. + * + * @version $Id$ + * @author Enver Haase + * + */ +public class VerificationResult { + + /** + * Constant to indicate verification has not been tried yet. + * This happens if some earlier verification pass did not return VERIFIED_OK. + */ + public static final int VERIFIED_NOTYET = 0; + /** Constant to indicate verification was passed. */ + public static final int VERIFIED_OK = 1; + /** Constant to indicate verfication failed. */ + public static final int VERIFIED_REJECTED = 2; + /** + * This string is the canonical message for verifications that have not been tried yet. + * This happens if some earlier verification pass did not return VERIFIED_OK. + */ + private static final String VERIFIED_NOTYET_MSG = "Not yet verified."; + /** This string is the canonical message for passed verification passes. */ + private static final String VERIFIED_OK_MSG = "Passed verification."; + /** + * Canonical VerificationResult for not-yet-tried verifications. + * This happens if some earlier verification pass did not return VERIFIED_OK. + */ + public static final VerificationResult VR_NOTYET = new VerificationResult(VERIFIED_NOTYET, + VERIFIED_NOTYET_MSG); + /** Canonical VerificationResult for passed verifications. */ + public static final VerificationResult VR_OK = new VerificationResult(VERIFIED_OK, + VERIFIED_OK_MSG); + /** The numeric status. */ + private int numeric; + /** The detailed message. */ + private String detailMessage; + + + /** The usual constructor. */ + public VerificationResult(int status, String message) { + numeric = status; + detailMessage = message; + } + + + /** Returns one one the VERIFIED_OK, VERIFIED_NOTYET, VERIFIED_REJECTED constants. */ + public int getStatus() { + return numeric; + } + + + /** Returns a detailed message. */ + public String getMessage() { + return detailMessage; + } + + + /** @return a hash code value for the object. + */ + public int hashCode() { + return numeric ^ detailMessage.hashCode(); + } + + + /** + * Returns if two VerificationResult instances are equal. + */ + public boolean equals( Object o ) { + if (!(o instanceof VerificationResult)) { + return false; + } + VerificationResult other = (VerificationResult) o; + return ((other.numeric == this.numeric) && (other.detailMessage.equals(this.detailMessage))); + } + + + /** + * Returns a String representation of the VerificationResult. + */ + public String toString() { + String ret = ""; + if (numeric == VERIFIED_NOTYET) { + ret = "VERIFIED_NOTYET"; + } + if (numeric == VERIFIED_OK) { + ret = "VERIFIED_OK"; + } + if (numeric == VERIFIED_REJECTED) { + ret = "VERIFIED_REJECTED"; + } + ret += "\n" + detailMessage + "\n"; + return ret; + } +} diff --git a/src/main/java/org/apache/bcel/verifier/Verifier.java b/src/main/java/org/apache/bcel/verifier/Verifier.java new file mode 100644 index 00000000..6e07577d --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/Verifier.java @@ -0,0 +1,248 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.verifier.statics.Pass1Verifier; +import org.apache.bcel.verifier.statics.Pass2Verifier; +import org.apache.bcel.verifier.statics.Pass3aVerifier; +import org.apache.bcel.verifier.structurals.Pass3bVerifier; + +/** + * A Verifier instance is there to verify a class file according to The Java Virtual + * Machine Specification, 2nd Edition. + * + * Pass-3b-verification includes pass-3a-verification; + * pass-3a-verification includes pass-2-verification; + * pass-2-verification includes pass-1-verification. + * + * A Verifier creates PassVerifier instances to perform the actual verification. + * Verifier instances are usually generated by the VerifierFactory. + * + * @version $Id$ + * @author Enver Haase + * @see org.apache.bcel.verifier.VerifierFactory + * @see org.apache.bcel.verifier.PassVerifier + */ +public class Verifier { + + /** + * The name of the class this verifier operates on. + */ + private final String classname; + /** A Pass1Verifier for this Verifier instance. */ + private Pass1Verifier p1v; + /** A Pass2Verifier for this Verifier instance. */ + private Pass2Verifier p2v; + /** The Pass3aVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ + private Map p3avs = new HashMap(); + /** The Pass3bVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ + private Map p3bvs = new HashMap(); + + + /** Returns the VerificationResult for the given pass. */ + public VerificationResult doPass1() { + if (p1v == null) { + p1v = new Pass1Verifier(this); + } + return p1v.verify(); + } + + + /** Returns the VerificationResult for the given pass. */ + public VerificationResult doPass2() { + if (p2v == null) { + p2v = new Pass2Verifier(this); + } + return p2v.verify(); + } + + + /** Returns the VerificationResult for the given pass. */ + public VerificationResult doPass3a( int method_no ) { + String key = Integer.toString(method_no); + Pass3aVerifier p3av; + p3av = (Pass3aVerifier) (p3avs.get(key)); + if (p3avs.get(key) == null) { + p3av = new Pass3aVerifier(this, method_no); + p3avs.put(key, p3av); + } + return p3av.verify(); + } + + + /** Returns the VerificationResult for the given pass. */ + public VerificationResult doPass3b( int method_no ) { + String key = Integer.toString(method_no); + Pass3bVerifier p3bv; + p3bv = (Pass3bVerifier) (p3bvs.get(key)); + if (p3bvs.get(key) == null) { + p3bv = new Pass3bVerifier(this, method_no); + p3bvs.put(key, p3bv); + } + return p3bv.verify(); + } + + + /** + * Instantiation is done by the VerifierFactory. + * + * @see VerifierFactory + */ + Verifier(String fully_qualified_classname) { + classname = fully_qualified_classname; + flush(); + } + + + /** + * Returns the name of the class this verifier operates on. + * This is particularly interesting when this verifier was created + * recursively by another Verifier and you got a reference to this + * Verifier by the getVerifiers() method of the VerifierFactory. + * @see VerifierFactory + */ + public final String getClassName() { + return classname; + } + + + /** + * Forget everything known about the class file; that means, really + * start a new verification of a possibly different class file from + * BCEL's repository. + * + */ + public void flush() { + p1v = null; + p2v = null; + p3avs.clear(); + p3bvs.clear(); + } + + + /** + * This returns all the (warning) messages collected during verification. + * A prefix shows from which verifying pass a message originates. + */ + public String[] getMessages() throws ClassNotFoundException { + ArrayList messages = new ArrayList(); + if (p1v != null) { + String[] p1m = p1v.getMessages(); + for (int i = 0; i < p1m.length; i++) { + messages.add("Pass 1: " + p1m[i]); + } + } + if (p2v != null) { + String[] p2m = p2v.getMessages(); + for (int i = 0; i < p2m.length; i++) { + messages.add("Pass 2: " + p2m[i]); + } + } + Iterator p3as = p3avs.values().iterator(); + while (p3as.hasNext()) { + Pass3aVerifier pv = (Pass3aVerifier) p3as.next(); + String[] p3am = pv.getMessages(); + int meth = pv.getMethodNo(); + for (int i = 0; i < p3am.length; i++) { + messages.add("Pass 3a, method " + meth + " ('" + + org.apache.bcel.Repository.lookupClass(classname).getMethods()[meth] + + "'): " + p3am[i]); + } + } + Iterator p3bs = p3bvs.values().iterator(); + while (p3bs.hasNext()) { + Pass3bVerifier pv = (Pass3bVerifier) p3bs.next(); + String[] p3bm = pv.getMessages(); + int meth = pv.getMethodNo(); + for (int i = 0; i < p3bm.length; i++) { + messages.add("Pass 3b, method " + meth + " ('" + + org.apache.bcel.Repository.lookupClass(classname).getMethods()[meth] + + "'): " + p3bm[i]); + } + } + String[] ret = new String[messages.size()]; + for (int i = 0; i < messages.size(); i++) { + ret[i] = (String) messages.get(i); + } + return ret; + } + + + /** + * Verifies class files. + * This is a simple demonstration of how the API of BCEL's + * class file verifier "JustIce" may be used. + * You should supply command-line arguments which are + * fully qualified namea of the classes to verify. These class files + * must be somewhere in your CLASSPATH (refer to Sun's + * documentation for questions about this) or you must have put the classes + * into the BCEL Repository yourself (via 'addClass(JavaClass)'). + */ + public static void main( String[] args ) { + System.out + .println("JustIce by Enver Haase, (C) 2001-2002.\n\n\n"); + for (int k = 0; k < args.length; k++) { + try { + if (args[k].endsWith(".class")) { + int dotclasspos = args[k].lastIndexOf(".class"); + if (dotclasspos != -1) { + args[k] = args[k].substring(0, dotclasspos); + } + } + args[k] = args[k].replace('/', '.'); + System.out.println("Now verifying: " + args[k] + "\n"); + Verifier v = VerifierFactory.getVerifier(args[k]); + VerificationResult vr; + vr = v.doPass1(); + System.out.println("Pass 1:\n" + vr); + vr = v.doPass2(); + System.out.println("Pass 2:\n" + vr); + if (vr == VerificationResult.VR_OK) { + JavaClass jc = org.apache.bcel.Repository.lookupClass(args[k]); + for (int i = 0; i < jc.getMethods().length; i++) { + vr = v.doPass3a(i); + System.out.println("Pass 3a, method number " + i + " ['" + + jc.getMethods()[i] + "']:\n" + vr); + vr = v.doPass3b(i); + System.out.println("Pass 3b, method number " + i + " ['" + + jc.getMethods()[i] + "']:\n" + vr); + } + } + System.out.println("Warnings:"); + String[] warnings = v.getMessages(); + if (warnings.length == 0) { + System.out.println(""); + } + for (int j = 0; j < warnings.length; j++) { + System.out.println(warnings[j]); + } + System.out.println("\n"); + // avoid swapping. + v.flush(); + org.apache.bcel.Repository.clearCache(); + System.gc(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java new file mode 100644 index 00000000..1a40a7da --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -0,0 +1,396 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier; + +import java.awt.AWTEvent; +import java.awt.CardLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.WindowEvent; +import javax.swing.BorderFactory; +import javax.swing.JFrame; +import javax.swing.JList; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JTextPane; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionEvent; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; + +/** + * This class implements a machine-generated frame for use with + * the GraphicalVerfifier. + * + * @version $Id$ + * @author Enver Haase + * @see GraphicalVerifier + */ +public class VerifierAppFrame extends JFrame { + + JPanel contentPane; + JSplitPane jSplitPane1 = new JSplitPane(); + JPanel jPanel1 = new JPanel(); + JPanel jPanel2 = new JPanel(); + JSplitPane jSplitPane2 = new JSplitPane(); + JPanel jPanel3 = new JPanel(); + JList classNamesJList = new JList(); + GridLayout gridLayout1 = new GridLayout(); + JPanel messagesPanel = new JPanel(); + GridLayout gridLayout2 = new GridLayout(); + JMenuBar jMenuBar1 = new JMenuBar(); + JMenu jMenu1 = new JMenu(); + JScrollPane jScrollPane1 = new JScrollPane(); + JScrollPane messagesScrollPane = new JScrollPane(); + JScrollPane jScrollPane3 = new JScrollPane(); + GridLayout gridLayout4 = new GridLayout(); + JScrollPane jScrollPane4 = new JScrollPane(); + CardLayout cardLayout1 = new CardLayout(); + private String JUSTICE_VERSION = "JustIce by Enver Haase"; + private String current_class; + GridLayout gridLayout3 = new GridLayout(); + JTextPane pass1TextPane = new JTextPane(); + JTextPane pass2TextPane = new JTextPane(); + JTextPane messagesTextPane = new JTextPane(); + JMenuItem newFileMenuItem = new JMenuItem(); + JSplitPane jSplitPane3 = new JSplitPane(); + JSplitPane jSplitPane4 = new JSplitPane(); + JScrollPane jScrollPane2 = new JScrollPane(); + JScrollPane jScrollPane5 = new JScrollPane(); + JScrollPane jScrollPane6 = new JScrollPane(); + JScrollPane jScrollPane7 = new JScrollPane(); + JList pass3aJList = new JList(); + JList pass3bJList = new JList(); + JTextPane pass3aTextPane = new JTextPane(); + JTextPane pass3bTextPane = new JTextPane(); + JMenu jMenu2 = new JMenu(); + JMenuItem whatisMenuItem = new JMenuItem(); + JMenuItem aboutMenuItem = new JMenuItem(); + + + /** Constructor. */ + public VerifierAppFrame() { + enableEvents(AWTEvent.WINDOW_EVENT_MASK); + try { + jbInit(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** Initizalization of the components. */ + private void jbInit() throws Exception { + //setIconImage(Toolkit.getDefaultToolkit().createImage(Frame1.class.getResource("[Ihr Symbol]"))); + contentPane = (JPanel) this.getContentPane(); + contentPane.setLayout(cardLayout1); + this.setJMenuBar(jMenuBar1); + this.setSize(new Dimension(708, 451)); + this.setTitle("JustIce"); + jPanel1.setMinimumSize(new Dimension(100, 100)); + jPanel1.setPreferredSize(new Dimension(100, 100)); + jPanel1.setLayout(gridLayout1); + jSplitPane2.setOrientation(JSplitPane.VERTICAL_SPLIT); + jPanel2.setLayout(gridLayout2); + jPanel3.setMinimumSize(new Dimension(200, 100)); + jPanel3.setPreferredSize(new Dimension(400, 400)); + jPanel3.setLayout(gridLayout4); + messagesPanel.setMinimumSize(new Dimension(100, 100)); + messagesPanel.setLayout(gridLayout3); + jPanel2.setMinimumSize(new Dimension(200, 100)); + jMenu1.setText("File"); + jScrollPane1.getViewport().setBackground(Color.red); + messagesScrollPane.getViewport().setBackground(Color.red); + messagesScrollPane.setPreferredSize(new Dimension(10, 10)); + classNamesJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + + public void valueChanged( ListSelectionEvent e ) { + classNamesJList_valueChanged(e); + } + }); + classNamesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + jScrollPane3.setBorder(BorderFactory.createLineBorder(Color.black)); + jScrollPane3.setPreferredSize(new Dimension(100, 100)); + gridLayout4.setRows(4); + gridLayout4.setColumns(1); + gridLayout4.setHgap(1); + jScrollPane4.setBorder(BorderFactory.createLineBorder(Color.black)); + jScrollPane4.setPreferredSize(new Dimension(100, 100)); + pass1TextPane.setBorder(BorderFactory.createRaisedBevelBorder()); + pass1TextPane.setToolTipText(""); + pass1TextPane.setEditable(false); + pass2TextPane.setBorder(BorderFactory.createRaisedBevelBorder()); + pass2TextPane.setEditable(false); + messagesTextPane.setBorder(BorderFactory.createRaisedBevelBorder()); + messagesTextPane.setEditable(false); + newFileMenuItem.setText("New..."); + newFileMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(78, + java.awt.event.KeyEvent.CTRL_MASK, true)); + newFileMenuItem.addActionListener(new java.awt.event.ActionListener() { + + public void actionPerformed( ActionEvent e ) { + newFileMenuItem_actionPerformed(e); + } + }); + pass3aTextPane.setEditable(false); + pass3bTextPane.setEditable(false); + pass3aJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + + public void valueChanged( ListSelectionEvent e ) { + pass3aJList_valueChanged(e); + } + }); + pass3bJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + + public void valueChanged( ListSelectionEvent e ) { + pass3bJList_valueChanged(e); + } + }); + jMenu2.setText("Help"); + whatisMenuItem.setText("What is..."); + whatisMenuItem.addActionListener(new java.awt.event.ActionListener() { + + public void actionPerformed( ActionEvent e ) { + whatisMenuItem_actionPerformed(e); + } + }); + aboutMenuItem.setText("About"); + aboutMenuItem.addActionListener(new java.awt.event.ActionListener() { + + public void actionPerformed( ActionEvent e ) { + aboutMenuItem_actionPerformed(e); + } + }); + jSplitPane2.add(messagesPanel, JSplitPane.BOTTOM); + messagesPanel.add(messagesScrollPane, null); + messagesScrollPane.getViewport().add(messagesTextPane, null); + jSplitPane2.add(jPanel3, JSplitPane.TOP); + jPanel3.add(jScrollPane3, null); + jScrollPane3.getViewport().add(pass1TextPane, null); + jPanel3.add(jScrollPane4, null); + jPanel3.add(jSplitPane3, null); + jSplitPane3.add(jScrollPane2, JSplitPane.LEFT); + jScrollPane2.getViewport().add(pass3aJList, null); + jSplitPane3.add(jScrollPane5, JSplitPane.RIGHT); + jScrollPane5.getViewport().add(pass3aTextPane, null); + jPanel3.add(jSplitPane4, null); + jSplitPane4.add(jScrollPane6, JSplitPane.LEFT); + jScrollPane6.getViewport().add(pass3bJList, null); + jSplitPane4.add(jScrollPane7, JSplitPane.RIGHT); + jScrollPane7.getViewport().add(pass3bTextPane, null); + jScrollPane4.getViewport().add(pass2TextPane, null); + jSplitPane1.add(jPanel2, JSplitPane.TOP); + jPanel2.add(jScrollPane1, null); + jSplitPane1.add(jPanel1, JSplitPane.BOTTOM); + jPanel1.add(jSplitPane2, null); + jScrollPane1.getViewport().add(classNamesJList, null); + jMenuBar1.add(jMenu1); + jMenuBar1.add(jMenu2); + contentPane.add(jSplitPane1, "jSplitPane1"); + jMenu1.add(newFileMenuItem); + jMenu2.add(whatisMenuItem); + jMenu2.add(aboutMenuItem); + jSplitPane2.setDividerLocation(300); + jSplitPane3.setDividerLocation(150); + jSplitPane4.setDividerLocation(150); + } + + + /** Overridden to stop the application on a closing window. */ + protected void processWindowEvent( WindowEvent e ) { + super.processWindowEvent(e); + if (e.getID() == WindowEvent.WINDOW_CLOSING) { + System.exit(0); + } + } + + + synchronized void classNamesJList_valueChanged( ListSelectionEvent e ) { + if (e.getValueIsAdjusting()) { + return; + } + current_class = classNamesJList.getSelectedValue().toString(); + try { + verify(); + } catch (ClassNotFoundException ex) { + // FIXME: report the error using the GUI + ex.printStackTrace(); + } + classNamesJList.setSelectedValue(current_class, true); + } + + + private void verify() throws ClassNotFoundException { + setTitle("PLEASE WAIT"); + Verifier v = VerifierFactory.getVerifier(current_class); + v.flush(); // Don't cache the verification result for this class. + VerificationResult vr; + vr = v.doPass1(); + if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { + pass1TextPane.setText(vr.getMessage()); + pass1TextPane.setBackground(Color.red); + pass2TextPane.setText(""); + pass2TextPane.setBackground(Color.yellow); + pass3aTextPane.setText(""); + pass3aJList.setListData(new Object[0]); + pass3aTextPane.setBackground(Color.yellow); + pass3bTextPane.setText(""); + pass3bJList.setListData(new Object[0]); + pass3bTextPane.setBackground(Color.yellow); + } else { // Must be VERIFIED_OK, Pass 1 does not know VERIFIED_NOTYET + pass1TextPane.setBackground(Color.green); + pass1TextPane.setText(vr.getMessage()); + vr = v.doPass2(); + if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { + pass2TextPane.setText(vr.getMessage()); + pass2TextPane.setBackground(Color.red); + pass3aTextPane.setText(""); + pass3aTextPane.setBackground(Color.yellow); + pass3aJList.setListData(new Object[0]); + pass3bTextPane.setText(""); + pass3bTextPane.setBackground(Color.yellow); + pass3bJList.setListData(new Object[0]); + } else { // must be Verified_OK, because Pass1 was OK (cannot be Verified_NOTYET). + pass2TextPane.setText(vr.getMessage()); + pass2TextPane.setBackground(Color.green); + JavaClass jc = Repository.lookupClass(current_class); + /* + boolean all3aok = true; + boolean all3bok = true; + String all3amsg = ""; + String all3bmsg = ""; + */ + String[] methodnames = new String[jc.getMethods().length]; + for (int i = 0; i < jc.getMethods().length; i++) { + methodnames[i] = jc.getMethods()[i].toString().replace('\n', ' ').replace('\t', + ' '); + } + pass3aJList.setListData(methodnames); + pass3aJList.setSelectionInterval(0, jc.getMethods().length - 1); + pass3bJList.setListData(methodnames); + pass3bJList.setSelectionInterval(0, jc.getMethods().length - 1); + } + } + String[] msgs = v.getMessages(); + messagesTextPane.setBackground(msgs.length == 0 ? Color.green : Color.yellow); + String allmsgs = ""; + for (int i = 0; i < msgs.length; i++) { + msgs[i] = msgs[i].replace('\n', ' '); + allmsgs += msgs[i] + "\n\n"; + } + messagesTextPane.setText(allmsgs); + setTitle(current_class + " - " + JUSTICE_VERSION); + } + + + void newFileMenuItem_actionPerformed( ActionEvent e ) { + String classname = JOptionPane + .showInputDialog("Please enter the fully qualified name of a class or interface to verify:"); + if ((classname == null) || (classname.equals(""))) { + return; + } + VerifierFactory.getVerifier(classname); // let observers do the rest. + classNamesJList.setSelectedValue(classname, true); + } + + + synchronized void pass3aJList_valueChanged( ListSelectionEvent e ) { + if (e.getValueIsAdjusting()) { + return; + } + Verifier v = VerifierFactory.getVerifier(current_class); + String all3amsg = ""; + boolean all3aok = true; + boolean rejected = false; + for (int i = 0; i < pass3aJList.getModel().getSize(); i++) { + if (pass3aJList.isSelectedIndex(i)) { + VerificationResult vr = v.doPass3a(i); + if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { + all3aok = false; + rejected = true; + } + JavaClass jc = null; + try { + jc = Repository.lookupClass(v.getClassName()); + all3amsg += "Method '" + jc.getMethods()[i] + "': " + + vr.getMessage().replace('\n', ' ') + "\n\n"; + } catch (ClassNotFoundException ex) { + // FIXME: handle the error + ex.printStackTrace(); + } + } + } + pass3aTextPane.setText(all3amsg); + pass3aTextPane.setBackground(all3aok ? Color.green : (rejected ? Color.red : Color.yellow)); + } + + + synchronized void pass3bJList_valueChanged( ListSelectionEvent e ) { + if (e.getValueIsAdjusting()) { + return; + } + Verifier v = VerifierFactory.getVerifier(current_class); + String all3bmsg = ""; + boolean all3bok = true; + boolean rejected = false; + for (int i = 0; i < pass3bJList.getModel().getSize(); i++) { + if (pass3bJList.isSelectedIndex(i)) { + VerificationResult vr = v.doPass3b(i); + if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { + all3bok = false; + rejected = true; + } + JavaClass jc = null; + try { + jc = Repository.lookupClass(v.getClassName()); + all3bmsg += "Method '" + jc.getMethods()[i] + "': " + + vr.getMessage().replace('\n', ' ') + "\n\n"; + } catch (ClassNotFoundException ex) { + // FIXME: handle the error + ex.printStackTrace(); + } + } + } + pass3bTextPane.setText(all3bmsg); + pass3bTextPane.setBackground(all3bok ? Color.green : (rejected ? Color.red : Color.yellow)); + } + + + void aboutMenuItem_actionPerformed( ActionEvent e ) { + JOptionPane + .showMessageDialog( + this, + "JustIce is a Java class file verifier.\nIt was implemented by Enver Haase in 2001, 2002.\n", + JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); + } + + + void whatisMenuItem_actionPerformed( ActionEvent e ) { + JOptionPane + .showMessageDialog( + this, + "The upper four boxes to the right reflect verification passes according to The Java Virtual Machine Specification.\nThese are (in that order): Pass one, Pass two, Pass three (before data flow analysis), Pass three (data flow analysis).\nThe bottom box to the right shows (warning) messages; warnings do not cause a class to be rejected.", + JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java new file mode 100644 index 00000000..2d8a973a --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java @@ -0,0 +1,110 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +/** + * This class produces instances of the Verifier class. Its purpose is to make + * sure that they are singleton instances with respect to the class name they + * operate on. That means, for every class (represented by a unique fully qualified + * class name) there is exactly one Verifier. + * + * @version $Id$ + * @author Enver Haase + * @see org.apache.bcel.verifier.Verifier + */ +public class VerifierFactory { + + /** + * The HashMap that holds the data about the already-constructed Verifier instances. + */ + private static Map hashMap = new HashMap(); + /** + * The VerifierFactoryObserver instances that observe the VerifierFactory. + */ + private static List observers = new Vector(); + + + /** + * The VerifierFactory is not instantiable. + */ + private VerifierFactory() { + } + + + /** + * Returns the (only) verifier responsible for the class with the given name. + * Possibly a new Verifier object is transparently created. + * @return the (only) verifier responsible for the class with the given name. + */ + public static Verifier getVerifier( String fully_qualified_classname ) { + Verifier v = (Verifier) (hashMap.get(fully_qualified_classname)); + if (v == null) { + v = new Verifier(fully_qualified_classname); + hashMap.put(fully_qualified_classname, v); + notify(fully_qualified_classname); + } + return v; + } + + + /** + * Notifies the observers of a newly generated Verifier. + */ + private static void notify( String fully_qualified_classname ) { + // notify the observers + Iterator i = observers.iterator(); + while (i.hasNext()) { + VerifierFactoryObserver vfo = (VerifierFactoryObserver) i.next(); + vfo.update(fully_qualified_classname); + } + } + + + /** + * Returns all Verifier instances created so far. + * This is useful when a Verifier recursively lets + * the VerifierFactory create other Verifier instances + * and if you want to verify the transitive hull of + * referenced class files. + */ + public static Verifier[] getVerifiers() { + Verifier[] vs = new Verifier[hashMap.values().size()]; + return (Verifier[]) (hashMap.values().toArray(vs)); // Because vs is big enough, vs is used to store the values into and returned! + } + + + /** + * Adds the VerifierFactoryObserver o to the list of observers. + */ + public static void attach( VerifierFactoryObserver o ) { + observers.add(o); + } + + + /** + * Removes the VerifierFactoryObserver o from the list of observers. + */ + public static void detach( VerifierFactoryObserver o ) { + observers.remove(o); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java new file mode 100644 index 00000000..abf1950f --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -0,0 +1,75 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier; + +import javax.swing.event.ListDataEvent; + +/** + * This class implements an adapter; it implements both a Swing ListModel and + * a VerifierFactoryObserver. + * + * @version $Id$ + * @author Enver Haase + */ +public class VerifierFactoryListModel implements org.apache.bcel.verifier.VerifierFactoryObserver, + javax.swing.ListModel { + + private java.util.ArrayList listeners = new java.util.ArrayList(); + private java.util.TreeSet cache = new java.util.TreeSet(); + + + public VerifierFactoryListModel() { + VerifierFactory.attach(this); + update(null); // fill cache. + } + + + public synchronized void update( String s ) { + int size = listeners.size(); + Verifier[] verifiers = VerifierFactory.getVerifiers(); + int num_of_verifiers = verifiers.length; + cache.clear(); + for (int i = 0; i < num_of_verifiers; i++) { + cache.add(verifiers[i].getClassName()); + } + for (int i = 0; i < size; i++) { + ListDataEvent e = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, + num_of_verifiers - 1); + ((javax.swing.event.ListDataListener) (listeners.get(i))).contentsChanged(e); + } + } + + + public synchronized void addListDataListener( javax.swing.event.ListDataListener l ) { + listeners.add(l); + } + + + public synchronized void removeListDataListener( javax.swing.event.ListDataListener l ) { + listeners.remove(l); + } + + + public synchronized int getSize() { + return cache.size(); + } + + + public synchronized Object getElementAt( int index ) { + return (cache.toArray())[index]; + } +} diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java new file mode 100644 index 00000000..ea909328 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier; + +/** + * VerifierFactoryObserver instances are notified when new Verifier + * instances are created. + * + * @version $Id$ + * @author Enver Haase + * + * @see VerifierFactory#getVerifier(String) + * @see VerifierFactory#getVerifiers() + * @see VerifierFactory#attach(VerifierFactoryObserver) + * @see VerifierFactory#detach(VerifierFactoryObserver) + */ +public interface VerifierFactoryObserver { + + /** + * VerifierFactoryObserver instances are notified invoking this method. + * The String argument is the fully qualified class name of a class a + * new Verifier instance created by the VerifierFactory operates on. + */ + public void update( String s ); +} diff --git a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java new file mode 100644 index 00000000..d37f11f3 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java @@ -0,0 +1,553 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier; + +import java.awt.Color; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; + +/** + * A class for simple graphical class file verification. + * Use the main(String []) method with fully qualified + * class names as arguments to use it as a stand-alone + * application. + * Use the VerifyDialog(String) constructor to use this + * class in your application. + * [This class was created using VisualAge for Java, + * but it does not work under VAJ itself (Version 3.02 JDK 1.2)] + * @version $Id$ + * @author Enver Haase + * @see #main(String[]) + * @see #VerifyDialog(String) + */ +public class VerifyDialog extends javax.swing.JDialog { + + /** Machine-generated. */ + private javax.swing.JPanel ivjJDialogContentPane = null; + /** Machine-generated. */ + private javax.swing.JPanel ivjPass1Panel = null; + /** Machine-generated. */ + private javax.swing.JPanel ivjPass2Panel = null; + /** Machine-generated. */ + private javax.swing.JPanel ivjPass3Panel = null; + /** Machine-generated. */ + private javax.swing.JButton ivjPass1Button = null; + /** Machine-generated. */ + private javax.swing.JButton ivjPass2Button = null; + /** Machine-generated. */ + private javax.swing.JButton ivjPass3Button = null; + /** Machine-generated. */ + IvjEventHandler ivjEventHandler = new IvjEventHandler(); + /** + * The class to verify. Default set to 'java.lang.Object' + * in case this class is instantiated via one of the many + * machine-generated constructors. + */ + private String class_name = "java.lang.Object"; + /** + * This field is here to count the number of open VerifyDialog + * instances so the JVM can be exited afer every Dialog had been + * closed. + */ + private static int classes_to_verify; + + /** Machine-generated. */ + class IvjEventHandler implements java.awt.event.ActionListener { + + public void actionPerformed( java.awt.event.ActionEvent e ) { + if (e.getSource() == VerifyDialog.this.getPass1Button()) { + connEtoC1(e); + } + if (e.getSource() == VerifyDialog.this.getPass2Button()) { + connEtoC2(e); + } + if (e.getSource() == VerifyDialog.this.getPass3Button()) { + connEtoC3(e); + } + if (e.getSource() == VerifyDialog.this.getFlushButton()) { + connEtoC4(e); + } + }; + }; + + /** Machine-generated. */ + private javax.swing.JButton ivjFlushButton = null; + + + /** Machine-generated. */ + public VerifyDialog() { + super(); + initialize(); + } + + + /** Machine-generated. */ + public VerifyDialog(java.awt.Dialog owner) { + super(owner); + } + + + /** Machine-generated. */ + public VerifyDialog(java.awt.Dialog owner, String title) { + super(owner, title); + } + + + /** Machine-generated. */ + public VerifyDialog(java.awt.Dialog owner, String title, boolean modal) { + super(owner, title, modal); + } + + + /** Machine-generated. */ + public VerifyDialog(java.awt.Dialog owner, boolean modal) { + super(owner, modal); + } + + + /** Machine-generated. */ + public VerifyDialog(java.awt.Frame owner) { + super(owner); + } + + + /** Machine-generated. */ + public VerifyDialog(java.awt.Frame owner, String title) { + super(owner, title); + } + + + /** Machine-generated. */ + public VerifyDialog(java.awt.Frame owner, String title, boolean modal) { + super(owner, title, modal); + } + + + /** Machine-generated. */ + public VerifyDialog(java.awt.Frame owner, boolean modal) { + super(owner, modal); + } + + + /** + * Use this constructor if you want a possibility to verify other + * class files than java.lang.Object. + * @param fully_qualified_class_name java.lang.String + */ + public VerifyDialog(String fully_qualified_class_name) { + super(); + int dotclasspos = fully_qualified_class_name.lastIndexOf(".class"); + if (dotclasspos != -1) { + fully_qualified_class_name = fully_qualified_class_name.substring(0, dotclasspos); + } + fully_qualified_class_name = fully_qualified_class_name.replace('/', '.'); + class_name = fully_qualified_class_name; + initialize(); + } + + + /** Machine-generated. */ + private void connEtoC1( java.awt.event.ActionEvent arg1 ) { + try { + // user code begin {1} + // user code end + this.pass1Button_ActionPerformed(arg1); + // user code begin {2} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {3} + // user code end + handleException(ivjExc); + } + } + + + /** Machine-generated. */ + private void connEtoC2( java.awt.event.ActionEvent arg1 ) { + try { + // user code begin {1} + // user code end + this.pass2Button_ActionPerformed(arg1); + // user code begin {2} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {3} + // user code end + handleException(ivjExc); + } + } + + + /** Machine-generated. */ + private void connEtoC3( java.awt.event.ActionEvent arg1 ) { + try { + // user code begin {1} + // user code end + this.pass4Button_ActionPerformed(arg1); + // user code begin {2} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {3} + // user code end + handleException(ivjExc); + } + } + + + /** Machine-generated. */ + private void connEtoC4( java.awt.event.ActionEvent arg1 ) { + try { + // user code begin {1} + // user code end + this.flushButton_ActionPerformed(arg1); + // user code begin {2} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {3} + // user code end + handleException(ivjExc); + } + } + + + /** Machine-generated. */ + public void flushButton_ActionPerformed( java.awt.event.ActionEvent actionEvent ) { + VerifierFactory.getVerifier(class_name).flush(); + Repository.removeClass(class_name); // Make sure it will be reloaded. + getPass1Panel().setBackground(Color.gray); + getPass1Panel().repaint(); + getPass2Panel().setBackground(Color.gray); + getPass2Panel().repaint(); + getPass3Panel().setBackground(Color.gray); + getPass3Panel().repaint(); + } + + + /** Machine-generated. */ + private javax.swing.JButton getFlushButton() { + if (ivjFlushButton == null) { + try { + ivjFlushButton = new javax.swing.JButton(); + ivjFlushButton.setName("FlushButton"); + ivjFlushButton.setText("Flush: Forget old verification results"); + ivjFlushButton.setBackground(java.awt.SystemColor.controlHighlight); + ivjFlushButton.setBounds(60, 215, 300, 30); + ivjFlushButton.setForeground(java.awt.Color.red); + ivjFlushButton.setActionCommand("FlushButton"); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjFlushButton; + } + + + /** Machine-generated. */ + private javax.swing.JPanel getJDialogContentPane() { + if (ivjJDialogContentPane == null) { + try { + ivjJDialogContentPane = new javax.swing.JPanel(); + ivjJDialogContentPane.setName("JDialogContentPane"); + ivjJDialogContentPane.setLayout(null); + getJDialogContentPane().add(getPass1Panel(), getPass1Panel().getName()); + getJDialogContentPane().add(getPass3Panel(), getPass3Panel().getName()); + getJDialogContentPane().add(getPass2Panel(), getPass2Panel().getName()); + getJDialogContentPane().add(getPass1Button(), getPass1Button().getName()); + getJDialogContentPane().add(getPass2Button(), getPass2Button().getName()); + getJDialogContentPane().add(getPass3Button(), getPass3Button().getName()); + getJDialogContentPane().add(getFlushButton(), getFlushButton().getName()); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjJDialogContentPane; + } + + + /** Machine-generated. */ + private javax.swing.JButton getPass1Button() { + if (ivjPass1Button == null) { + try { + ivjPass1Button = new javax.swing.JButton(); + ivjPass1Button.setName("Pass1Button"); + ivjPass1Button.setText("Pass1: Verify binary layout of .class file"); + ivjPass1Button.setBackground(java.awt.SystemColor.controlHighlight); + ivjPass1Button.setBounds(100, 40, 300, 30); + ivjPass1Button.setActionCommand("Button1"); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass1Button; + } + + + /** Machine-generated. */ + private javax.swing.JPanel getPass1Panel() { + if (ivjPass1Panel == null) { + try { + ivjPass1Panel = new javax.swing.JPanel(); + ivjPass1Panel.setName("Pass1Panel"); + ivjPass1Panel.setLayout(null); + ivjPass1Panel.setBackground(java.awt.SystemColor.controlShadow); + ivjPass1Panel.setBounds(30, 30, 50, 50); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass1Panel; + } + + + /** Machine-generated. */ + private javax.swing.JButton getPass2Button() { + if (ivjPass2Button == null) { + try { + ivjPass2Button = new javax.swing.JButton(); + ivjPass2Button.setName("Pass2Button"); + ivjPass2Button.setText("Pass 2: Verify static .class file constraints"); + ivjPass2Button.setBackground(java.awt.SystemColor.controlHighlight); + ivjPass2Button.setBounds(100, 100, 300, 30); + ivjPass2Button.setActionCommand("Button2"); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass2Button; + } + + + /** Machine-generated. */ + private javax.swing.JPanel getPass2Panel() { + if (ivjPass2Panel == null) { + try { + ivjPass2Panel = new javax.swing.JPanel(); + ivjPass2Panel.setName("Pass2Panel"); + ivjPass2Panel.setLayout(null); + ivjPass2Panel.setBackground(java.awt.SystemColor.controlShadow); + ivjPass2Panel.setBounds(30, 90, 50, 50); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass2Panel; + } + + + /** Machine-generated. */ + private javax.swing.JButton getPass3Button() { + if (ivjPass3Button == null) { + try { + ivjPass3Button = new javax.swing.JButton(); + ivjPass3Button.setName("Pass3Button"); + ivjPass3Button.setText("Passes 3a+3b: Verify code arrays"); + ivjPass3Button.setBackground(java.awt.SystemColor.controlHighlight); + ivjPass3Button.setBounds(100, 160, 300, 30); + ivjPass3Button.setActionCommand("Button2"); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass3Button; + } + + + /** Machine-generated. */ + private javax.swing.JPanel getPass3Panel() { + if (ivjPass3Panel == null) { + try { + ivjPass3Panel = new javax.swing.JPanel(); + ivjPass3Panel.setName("Pass3Panel"); + ivjPass3Panel.setLayout(null); + ivjPass3Panel.setBackground(java.awt.SystemColor.controlShadow); + ivjPass3Panel.setBounds(30, 150, 50, 50); + // user code begin {1} + // user code end + } catch (java.lang.Throwable ivjExc) { + // user code begin {2} + // user code end + handleException(ivjExc); + } + } + return ivjPass3Panel; + } + + + /** Machine-generated. */ + private void handleException( java.lang.Throwable exception ) { + /* Uncomment the following lines to print uncaught exceptions to stdout */ + System.out.println("--------- UNCAUGHT EXCEPTION ---------"); + exception.printStackTrace(System.out); + } + + + /** Machine-generated. */ + private void initConnections() throws java.lang.Exception { + // user code begin {1} + // user code end + getPass1Button().addActionListener(ivjEventHandler); + getPass2Button().addActionListener(ivjEventHandler); + getPass3Button().addActionListener(ivjEventHandler); + getFlushButton().addActionListener(ivjEventHandler); + } + + + /** Machine-generated. */ + private void initialize() { + try { + // user code begin {1} + // user code end + setName("VerifyDialog"); + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setSize(430, 280); + setVisible(true); + setModal(true); + setResizable(false); + setContentPane(getJDialogContentPane()); + initConnections(); + } catch (java.lang.Throwable ivjExc) { + handleException(ivjExc); + } + // user code begin {2} + setTitle("'" + class_name + "' verification - JustIce / BCEL"); + // user code end + } + + + /** + * Verifies one or more class files. + * Verification results are presented graphically: Red means 'rejected', + * green means 'passed' while yellow means 'could not be verified yet'. + * @param args java.lang.String[] fully qualified names of classes to verify. + */ + public static void main( java.lang.String[] args ) { + classes_to_verify = args.length; + for (int i = 0; i < args.length; i++) { + try { + VerifyDialog aVerifyDialog; + aVerifyDialog = new VerifyDialog(args[i]); + aVerifyDialog.setModal(true); + aVerifyDialog.addWindowListener(new java.awt.event.WindowAdapter() { + + public void windowClosing( java.awt.event.WindowEvent e ) { + classes_to_verify--; + if (classes_to_verify == 0) { + System.exit(0); + } + }; + }); + aVerifyDialog.setVisible(true); + } catch (Throwable exception) { + System.err.println("Exception occurred in main() of javax.swing.JDialog"); + exception.printStackTrace(System.out); + } + } + } + + + /** Machine-generated. */ + public void pass1Button_ActionPerformed( java.awt.event.ActionEvent actionEvent ) { + Verifier v = VerifierFactory.getVerifier(class_name); + VerificationResult vr = v.doPass1(); + if (vr.getStatus() == VerificationResult.VERIFIED_OK) { + getPass1Panel().setBackground(Color.green); + getPass1Panel().repaint(); + } + if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { + getPass1Panel().setBackground(Color.red); + getPass1Panel().repaint(); + } + } + + + /** Machine-generated. */ + public void pass2Button_ActionPerformed( java.awt.event.ActionEvent actionEvent ) { + pass1Button_ActionPerformed(actionEvent); + Verifier v = VerifierFactory.getVerifier(class_name); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() == VerificationResult.VERIFIED_OK) { + getPass2Panel().setBackground(Color.green); + getPass2Panel().repaint(); + } + if (vr.getStatus() == VerificationResult.VERIFIED_NOTYET) { + getPass2Panel().setBackground(Color.yellow); + getPass2Panel().repaint(); + } + if (vr.getStatus() == VerificationResult.VERIFIED_REJECTED) { + getPass2Panel().setBackground(Color.red); + getPass2Panel().repaint(); + } + } + + + /** Machine-generated. */ + public void pass4Button_ActionPerformed( java.awt.event.ActionEvent actionEvent ) { + pass2Button_ActionPerformed(actionEvent); + Color color = Color.green; + Verifier v = VerifierFactory.getVerifier(class_name); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() == VerificationResult.VERIFIED_OK) { + JavaClass jc = null; + try { + jc = Repository.lookupClass(class_name); + int nr = jc.getMethods().length; + for (int i = 0; i < nr; i++) { + vr = v.doPass3b(i); + if (vr.getStatus() != VerificationResult.VERIFIED_OK) { + color = Color.red; + break; + } + } + } catch (ClassNotFoundException ex) { + // FIXME: report the error + ex.printStackTrace(); + } + } else { + color = Color.yellow; + } + getPass3Panel().setBackground(color); + getPass3Panel().repaint(); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java new file mode 100644 index 00000000..4bb12973 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java @@ -0,0 +1,83 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + + +/** + * Instances of this class should never be thrown. When such an instance is thrown, + * this is due to an INTERNAL ERROR of BCEL's class file verifier "JustIce". + * + * @version $Id$ + * @author Enver Haase + */ +public final class AssertionViolatedException extends RuntimeException{ + /** The error message. */ + private String detailMessage; + /** Constructs a new AssertionViolatedException with null as its error message string. */ + public AssertionViolatedException(){ + super(); + } + /** + * Constructs a new AssertionViolatedException with the specified error message preceded + * by "INTERNAL ERROR: ". + */ + public AssertionViolatedException(String message){ + super(message = "INTERNAL ERROR: "+message); // Thanks to Java, the constructor call here must be first. + detailMessage=message; + } + /** + * Constructs a new AssertionViolationException with the specified error message and initial cause + */ + public AssertionViolatedException(String message, Throwable initCause) { + super(message = "INTERNAL ERROR: "+message, initCause); + detailMessage=message; + } + /** Extends the error message with a string before ("pre") and after ("post") the + 'old' error message. All of these three strings are allowed to be null, and null + is always replaced by the empty string (""). In particular, after invoking this + method, the error message of this object can no longer be null. + */ + public void extendMessage(String pre, String post){ + if (pre == null) { + pre=""; + } + if (detailMessage == null) { + detailMessage=""; + } + if (post == null) { + post=""; + } + detailMessage = pre+detailMessage+post; + } + /** + * Returns the error message string of this AssertionViolatedException object. + * @return the error message string of this AssertionViolatedException. + */ + public String getMessage(){ + return detailMessage; + } + + /** + * DO NOT USE. It's for experimental testing during development only. + */ + public static void main(String[] args){ + AssertionViolatedException ave = new AssertionViolatedException("Oops!"); + ave.extendMessage("\nFOUND:\n\t","\nExiting!!\n"); + throw ave; + } + +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java new file mode 100644 index 00000000..11a88a40 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java @@ -0,0 +1,49 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" + * when a class file to verify does not pass the verification pass 2 as described + * in the Java Virtual Machine specification, 2nd edition. + * + * @version $Id$ + * @author Enver Haase + */ +public class ClassConstraintException extends VerificationException{ + /** + * Constructs a new ClassConstraintException with null as its error message string. + */ + public ClassConstraintException(){ + super(); + } + + /** + * Constructs a new ClassConstraintException with the specified error message. + */ + public ClassConstraintException(String message){ + super (message); + } + + /** + * Constructs a new ClassConstraintException with the specified error message and cause + */ + public ClassConstraintException(String message, Throwable initCause){ + super(message, initCause); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java new file mode 100644 index 00000000..1ff8fb0a --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java @@ -0,0 +1,40 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when + * a class file does not pass the verification pass 3. Note that the pass 3 used by + * "JustIce" involves verification that is usually delayed to pass 4. + * + * @version $Id$ + * @author Enver Haase + */ +public abstract class CodeConstraintException extends VerificationException{ + /** + * Constructs a new CodeConstraintException with null as its error message string. + */ + CodeConstraintException(){ + super(); + } + /** + * Constructs a new CodeConstraintException with the specified error message. + */ + CodeConstraintException(String message){ + super(message); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java new file mode 100644 index 00000000..7b5d1230 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java @@ -0,0 +1,32 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" + * when the verification of a method is requested that does not exist. + * + * @version $Id$ + * @author Enver Haase + */ +public class InvalidMethodException extends RuntimeException{ + + /** Constructs an InvalidMethodException with the specified detail message. */ + public InvalidMethodException(String message){ + super(message); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java new file mode 100644 index 00000000..79ab38b3 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when + * a class file to verify does not pass the verification pass 3 because of a violation + * of a constraint that is usually only verified at run-time (pass 4). + * The Java Virtual Machine Specification, 2nd edition, states that certain constraints + * are usually verified at run-time for performance reasons (the verification of those + * constraints requires loading in and recursively verifying referenced classes) that + * conceptually belong to pass 3; to be precise, that conceptually belong to the + * data flow analysis of pass 3 (called pass 3b in JustIce). + * These are the checks necessary for resolution: Compare pages 142-143 ("4.9.1 The + * Verification Process") and pages 50-51 ("2.17.3 Linking: Verification, Preparation, + * and Resolution") of the above mentioned book. + * TODO: At this time, this class is not used in JustIce. + * + * @version $Id$ + * @author Enver Haase + */ +public class LinkingConstraintException extends StructuralCodeConstraintException{ +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java new file mode 100644 index 00000000..38949ab1 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java @@ -0,0 +1,42 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + + +/** + * When loading a class file, BCEL will throw an instance of LoadingException if + * the class file is malformed; so it is not conforming to the "Pass 1" verification + * process as described in the Java Virtual Machine specification, 2nd. edition. + * @version $Id$ + * @author Enver Haase + */ +public class LoadingException extends VerifierConstraintViolatedException{ + + /** + * Constructs a new LoadingException with null as its error message string. + */ + public LoadingException(){ + super(); + } + + /** + * Constructs a new LoadingException with the specified error message. + */ + public LoadingException(String message){ + super (message); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java new file mode 100644 index 00000000..03289611 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java @@ -0,0 +1,44 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + + +/** + * A LocalVariableInfoInconsistentException instance is thrown by + * the LocalVariableInfo class when it detects that the information + * it holds is inconsistent; this is normally due to inconsistent + * LocalVariableTable entries in the Code attribute of a certain + * Method object. + * + * @version $Id$ + * @author Enver Haase + */ +public class LocalVariableInfoInconsistentException extends ClassConstraintException{ + /** + * Constructs a new LocalVariableInfoInconsistentException with null as its error message string. + */ + public LocalVariableInfoInconsistentException(){ + super(); + } + + /** + * Constructs a new LocalVariableInfoInconsistentException with the specified error message. + */ + public LocalVariableInfoInconsistentException(String message){ + super (message); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java new file mode 100644 index 00000000..3e7809e2 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java @@ -0,0 +1,34 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when + * a class file to verify does not pass the verification pass 3 because of a violation + * of a static constraint as described in the Java Virtual Machine Specification, + * 2nd edition, 4.8.1, pages 133-137. The static constraints checking part of pass 3 + * is called pass 3a in JustIce. + * + * @version $Id$ + * @author Enver Haase + */ +public abstract class StaticCodeConstraintException extends CodeConstraintException{ + public StaticCodeConstraintException(String message){ + super(message); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java new file mode 100644 index 00000000..d8c1f293 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when + * a class file to verify does not pass the verification pass 3 because of a violation + * of a static constraint as described in the Java Virtual Machine Specification, + * Second edition, 4.8.1, pages 133-137. The static constraints checking part of pass 3 + * is called pass 3a in JustIce. + * Static constraints on the instructions in the code array are checked early in + * pass 3a and are described on page 134 in the Java Virtual Machine Specification, + * Second Edition. + * + * @version $Id$ + * @author Enver Haase + */ +public class StaticCodeInstructionConstraintException extends StaticCodeConstraintException{ + public StaticCodeInstructionConstraintException(String message){ + super(message); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java new file mode 100644 index 00000000..088289d4 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when + * a class file to verify does not pass the verification pass 3 because of a violation + * of a static constraint as described in the Java Virtual Machine Specification, + * Second edition, 4.8.1, pages 133-137. The static constraints checking part of pass 3 + * is called pass 3a in JustIce. + * Static constraints on the operands of instructions in the code array are checked late in + * pass 3a and are described on page 134-137 in the Java Virtual Machine Specification, + * Second Edition. + * + * @version $Id$ + * @author Enver Haase + */ +public class StaticCodeInstructionOperandConstraintException extends StaticCodeConstraintException{ + public StaticCodeInstructionOperandConstraintException(String message){ + super(message); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java new file mode 100644 index 00000000..0638101d --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when + * a class file to verify does not pass the verification pass 3 because of a violation + * of a structural constraint as described in the Java Virtual Machine Specification, + * 2nd edition, 4.8.2, pages 137-139. + * Note that the notion of a "structural" constraint is somewhat misleading. Structural + * constraints are constraints on relationships between Java virtual machine instructions. + * These are the constraints where data-flow analysis is needed to verify if they hold. + * The data flow analysis of pass 3 is called pass 3b in JustIce. + * + * @version $Id$ + * @author Enver Haase + */ +public class StructuralCodeConstraintException extends CodeConstraintException{ + /** + * Constructs a new StructuralCodeConstraintException with the specified error message. + */ + public StructuralCodeConstraintException(String message){ + super(message); + } + /** + * Constructs a new StructuralCodeConstraintException with null as its error message string. + */ + public StructuralCodeConstraintException(){ + super(); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/Utility.java b/src/main/java/org/apache/bcel/verifier/exc/Utility.java new file mode 100644 index 00000000..302e3525 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/Utility.java @@ -0,0 +1,40 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + + +import java.io.PrintWriter; +import java.io.StringWriter; + +/** + * A utility class providing convenience methods concerning Throwable instances. + * @version $Id$ + * @author Enver Haase + * @see java.lang.Throwable + */ +public final class Utility{ + /** This class is not instantiable. */ + private Utility(){} + + /** This method returns the stack trace of a Throwable instance as a String. */ + public static String getStackTrace(Throwable t){ + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + t.printStackTrace(pw); + return sw.toString(); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java new file mode 100644 index 00000000..e96369e1 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java @@ -0,0 +1,52 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" when a + * class file to verify does not pass one of the verification passes 2 or 3. + * Note that the pass 3 used by "JustIce" involves verification that is usually + * delayed to pass 4. + * The name of this class is justified by the Java Virtual Machine Specification, 2nd + * edition, page 164, 5.4.1 where verification as a part of the linking process is + * defined to be the verification happening in passes 2 and 3. + * + * @version $Id$ + * @author Enver Haase + */ +public abstract class VerificationException extends VerifierConstraintViolatedException{ + /** + * Constructs a new VerificationException with null as its error message string. + */ + VerificationException(){ + super(); + } + /** + * Constructs a new VerificationException with the specified error message. + */ + VerificationException(String message){ + super(message); + } + + /** + * Constructs a new VerificationException with the specified error message and exception + */ + VerificationException(String message, Throwable initCause){ + super(message, initCause); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java new file mode 100644 index 00000000..650da6dc --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java @@ -0,0 +1,83 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.exc; + + +/** + * Instances of this class are thrown by BCEL's class file verifier "JustIce" + * whenever + * verification proves that some constraint of a class file (as stated in the + * Java Virtual Machine Specification, Edition 2) is violated. + * This is roughly equivalent to the VerifyError the JVM-internal verifiers + * throw. + * + * @version $Id$ + * @author Enver Haase + */ +public abstract class VerifierConstraintViolatedException extends RuntimeException{ + // /** The name of the offending class that did not pass the verifier. */ + // String name_of_offending_class; + + /** The specified error message. */ + private String detailMessage; + /** + * Constructs a new VerifierConstraintViolatedException with null as its error message string. + */ + VerifierConstraintViolatedException(){ + super(); + } + /** + * Constructs a new VerifierConstraintViolatedException with the specified error message. + */ + VerifierConstraintViolatedException(String message){ + super(message); // Not that important + detailMessage = message; + } + /** + * Constructs a new VerifierConstraintViolationException with the specified error message and cause + */ + VerifierConstraintViolatedException(String message, Throwable initCause){ + super(message, initCause); + detailMessage = message; + } + + + /** Extends the error message with a string before ("pre") and after ("post") the + 'old' error message. All of these three strings are allowed to be null, and null + is always replaced by the empty string (""). In particular, after invoking this + method, the error message of this object can no longer be null. + */ + public void extendMessage(String pre, String post){ + if (pre == null) { + pre=""; + } + if (detailMessage == null) { + detailMessage=""; + } + if (post == null) { + post=""; + } + detailMessage = pre+detailMessage+post; + } + /** + * Returns the error message string of this VerifierConstraintViolatedException object. + * @return the error message string of this VerifierConstraintViolatedException. + */ + public String getMessage(){ + return detailMessage; + } +} diff --git a/src/main/java/org/apache/bcel/verifier/exc/package.html b/src/main/java/org/apache/bcel/verifier/exc/package.html new file mode 100644 index 00000000..1ec56e3f --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/exc/package.html @@ -0,0 +1,17 @@ + + + + + + + +Exception classes used by JustIce, mostly used internally. You don't need to bother with them. + +

          Package Specification

          + +Contained in this package are Exception classes for use with the JustIce verifier. + + + diff --git a/src/main/java/org/apache/bcel/verifier/package.html b/src/main/java/org/apache/bcel/verifier/package.html new file mode 100644 index 00000000..79cc44e1 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/package.html @@ -0,0 +1,18 @@ + + + + + + + +BCEL's verifier JustIce is there to help you dump correct Java class files created or modified with BCEL. + +

          Package Specification

          + +This is the top-level package of the JustIce verifier. To actually use it, have a look at the VerifierFactory and +Verifier classes. + + + diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java new file mode 100644 index 00000000..4302abdb --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java @@ -0,0 +1,42 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.statics; + + +import org.apache.bcel.Constants; +import org.apache.bcel.generic.Type; + +/** + * This class represents the upper half of a DOUBLE variable. + * @version $Id$ + * @author Enver Haase + */ +public final class DOUBLE_Upper extends Type{ + + /** The one and only instance of this class. */ + private static DOUBLE_Upper singleInstance = new DOUBLE_Upper(); + + /** The constructor; this class must not be instantiated from the outside. */ + private DOUBLE_Upper(){ + super(Constants.T_UNKNOWN, "Long_Upper"); + } + + /** Use this method to get the single instance of this class. */ + public static DOUBLE_Upper theInstance(){ + return singleInstance; + } +} diff --git a/src/main/java/org/apache/bcel/verifier/statics/IntList.java b/src/main/java/org/apache/bcel/verifier/statics/IntList.java new file mode 100644 index 00000000..31e59207 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/statics/IntList.java @@ -0,0 +1,51 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.statics; + + +import java.util.ArrayList; +import java.util.List; + +/** + * A small utility class representing a set of basic int values. + * + * @version $Id$ + * @author Enver Haase + */ +public class IntList{ + /** The int are stored as Integer objects here. */ + private List theList; + /** This constructor creates an empty list. */ + IntList(){ + theList = new ArrayList(); + } + /** Adds an element to the list. */ + void add(int i){ + theList.add(new Integer(i)); + } + /** Checks if the specified int is already in the list. */ + boolean contains(int i){ + Integer[] ints = new Integer[theList.size()]; + theList.toArray(ints); + for (int j=0; j= localVariableInfos.length){ + throw new AssertionViolatedException("Slot number for local variable information out of range."); + } + return localVariableInfos[slot]; + } + + /** + * Adds information about the local variable in slot 'slot'. Automatically + * adds information for slot+1 if 't' is Type.LONG or Type.DOUBLE. + * @throws LocalVariableInfoInconsistentException if the new information conflicts + * with already gathered information. + */ + public void add(int slot, String name, int startpc, int length, Type t) throws LocalVariableInfoInconsistentException{ + // The add operation on LocalVariableInfo may throw the '...Inconsistent...' exception, we don't throw it explicitely here. + + if (slot < 0 || slot >= localVariableInfos.length){ + throw new AssertionViolatedException("Slot number for local variable information out of range."); + } + + localVariableInfos[slot].add(name, startpc, length, t); + if (t == Type.LONG) { + localVariableInfos[slot+1].add(name, startpc, length, LONG_Upper.theInstance()); + } + if (t == Type.DOUBLE) { + localVariableInfos[slot+1].add(name, startpc, length, DOUBLE_Upper.theInstance()); + } + } +} diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java new file mode 100644 index 00000000..c2825fcf --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -0,0 +1,185 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.statics; + + +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.ClassFormatException; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.verifier.PassVerifier; +import org.apache.bcel.verifier.VerificationResult; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.exc.LoadingException; +import org.apache.bcel.verifier.exc.Utility; + +/** + * This PassVerifier verifies a class file according to pass 1 as + * described in The Java Virtual Machine Specification, 2nd edition. + * More detailed information is to be found at the do_verify() method's + * documentation. + * + * @version $Id$ + * @author Enver Haase + * @see #do_verify() + */ +public final class Pass1Verifier extends PassVerifier{ + /** + * DON'T USE THIS EVEN PRIVATELY! USE getJavaClass() INSTEAD. + * @see #getJavaClass() + */ + private JavaClass jc; + + /** + * The Verifier that created this. + */ + private Verifier myOwner; + + /** Used to load in and return the myOwner-matching JavaClass object when needed. Avoids loading in a class file when it's not really needed! */ + private JavaClass getJavaClass(){ + if (jc == null){ + try { + jc = Repository.lookupClass(myOwner.getClassName()); + } catch (ClassNotFoundException e) { + // FIXME: currently, Pass1Verifier treats jc == null as a special + // case, so we don't need to do anything here. A better solution + // would be to simply throw the ClassNotFoundException + // out of this method. + } + } + return jc; + } + + /** + * Should only be instantiated by a Verifier. + * + * @see org.apache.bcel.verifier.Verifier + */ + public Pass1Verifier(Verifier owner){ + myOwner = owner; + } + + /** + * Pass-one verification basically means loading in a class file. + * The Java Virtual Machine Specification is not too precise about + * what makes the difference between passes one and two. + * The answer is that only pass one is performed on a class file as + * long as its resolution is not requested; whereas pass two and + * pass three are performed during the resolution process. + * Only four constraints to be checked are explicitely stated by + * The Java Virtual Machine Specification, 2nd edition: + *
            + *
          • The first four bytes must contain the right magic number (0xCAFEBABE). + *
          • All recognized attributes must be of the proper length. + *
          • The class file must not be truncated or have extra bytes at the end. + *
          • The constant pool must not contain any superficially unrecognizable information. + *
          + * A more in-depth documentation of what pass one should do was written by + * Philip W. L. Fong: + *
            + *
          • the file should not be truncated. + *
          • the file should not have extra bytes at the end. + *
          • all variable-length structures should be well-formatted: + *
              + *
            • there should only be constant_pool_count-1 many entries in the constant pool. + *
            • all constant pool entries should have size the same as indicated by their type tag. + *
            • there are exactly interfaces_count many entries in the interfaces array of the class file. + *
            • there are exactly fields_count many entries in the fields array of the class file. + *
            • there are exactly methods_count many entries in the methods array of the class file. + *
            • there are exactly attributes_count many entries in the attributes array of the class file, fields, methods, and code attribute. + *
            • there should be exactly attribute_length many bytes in each attribute. Inconsistency between attribute_length and the actually size of the attribute content should be uncovered. For example, in an Exceptions attribute, the actual number of exceptions as required by the number_of_exceptions field might yeild an attribute size that doesn't match the attribute_length. Such an anomaly should be detected. + *
            • all attributes should have proper length. In particular, under certain context (e.g. while parsing method_info), recognizable attributes (e.g. "Code" attribute) should have correct format (e.g. attribute_length is 2). + *
            + *
          • Also, certain constant values are checked for validity: + *
              + *
            • The magic number should be 0xCAFEBABE. + *
            • The major and minor version numbers are valid. + *
            • All the constant pool type tags are recognizable. + *
            • All undocumented access flags are masked off before use. Strictly speaking, this is not really a check. + *
            • The field this_class should point to a string that represents a legal non-array class name, and this name should be the same as the class file being loaded. + *
            • the field super_class should point to a string that represents a legal non-array class name. + *
            • Because some of the above checks require cross referencing the constant pool entries, guards are set up to make sure that the referenced entries are of the right type and the indices are within the legal range (0 < index < constant_pool_count). + *
            + *
          • Extra checks done in pass 1: + *
              + *
            • the constant values of static fields should have the same type as the fields. + *
            • the number of words in a parameter list does not exceed 255 and locals_max. + *
            • the name and signature of fields and methods are verified to be of legal format. + *
            + *
          + * (From the Paper The Mysterious Pass One, first draft, September 2, 1997.) + *
          + * However, most of this is done by parsing a class file or generating a class file into BCEL's internal data structure. + * Therefore, all that is really done here is look up the class file from BCEL's repository. + * This is also motivated by the fact that some omitted things + * (like the check for extra bytes at the end of the class file) are handy when actually using BCEL to repair a class file (otherwise you would not be + * able to load it into BCEL). + * + * @see org.apache.bcel.Repository + */ + public VerificationResult do_verify(){ + JavaClass jc; + try{ + jc = getJavaClass(); //loads in the class file if not already done. + + if (jc != null){ + /* If we find more constraints to check, we should do this in an own method. */ + if (! myOwner.getClassName().equals(jc.getClassName())){ + // This should maybe caught by BCEL: In case of renamed .class files we get wrong + // JavaClass objects here. + throw new LoadingException("Wrong name: the internal name of the .class file '"+jc.getClassName()+"' does not match the file's name '"+myOwner.getClassName()+"'."); + } + } + + } + catch(LoadingException e){ + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, e.getMessage()); + } + catch(ClassFormatException e){ + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, e.getMessage()); + } + catch(RuntimeException e){ + // BCEL does not catch every possible RuntimeException; e.g. if + // a constant pool index is referenced that does not exist. + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Parsing via BCEL did not succeed. "+e.getClass().getName()+" occured:\n"+Utility.getStackTrace(e)); + } + + if (jc != null){ + return VerificationResult.VR_OK; + } + else{ + //TODO: Maybe change Repository's behaviour to throw a LoadingException instead of just returning "null" + // if a class file cannot be found or in another way be looked up. + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Repository.lookup() failed. FILE NOT FOUND?"); + } + } + + /** + * Currently this returns an empty array of String. + * One could parse the error messages of BCEL + * (written to java.lang.System.err) when loading + * a class file such as detecting unknown attributes + * or trailing garbage at the end of a class file. + * However, Markus Dahm does not like the idea so this + * method is currently useless and therefore marked as + * TODO. + */ + public String[] getMessages(){ + // This method is only here to override the javadoc-comment. + return super.getMessages(); + } + +} diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java new file mode 100644 index 00000000..eaf634f8 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -0,0 +1,1444 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.statics; + + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ClassFormatException; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Deprecated; +import org.apache.bcel.classfile.DescendingVisitor; +import org.apache.bcel.classfile.EmptyVisitor; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.InnerClass; +import org.apache.bcel.classfile.InnerClasses; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Node; +import org.apache.bcel.classfile.SourceFile; +import org.apache.bcel.classfile.Synthetic; +import org.apache.bcel.classfile.Unknown; +import org.apache.bcel.classfile.Visitor; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.PassVerifier; +import org.apache.bcel.verifier.VerificationResult; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.VerifierFactory; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.ClassConstraintException; +import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; + +/** + * This PassVerifier verifies a class file according to + * pass 2 as described in The Java Virtual Machine + * Specification, 2nd edition. + * More detailed information is to be found at the do_verify() + * method's documentation. + * + * @version $Id$ + * @author Enver Haase + * @see #do_verify() + */ +public final class Pass2Verifier extends PassVerifier implements Constants{ + + /** + * The LocalVariableInfo instances used by Pass3bVerifier. + * localVariablesInfos[i] denotes the information for the + * local variables of method number i in the + * JavaClass this verifier operates on. + */ + private LocalVariablesInfo[] localVariablesInfos; + + /** The Verifier that created this. */ + private Verifier myOwner; + + /** + * Should only be instantiated by a Verifier. + * + * @see Verifier + */ + public Pass2Verifier(Verifier owner){ + myOwner = owner; + } + + /** + * Returns a LocalVariablesInfo object containing information + * about the usage of the local variables in the Code attribute + * of the said method or null if the class file this + * Pass2Verifier operates on could not be pass-2-verified correctly. + * The method number method_nr is the method you get using + * Repository.lookupClass(myOwner.getClassname()).getMethods()[method_nr];. + * You should not add own information. Leave that to JustIce. + */ + public LocalVariablesInfo getLocalVariablesInfo(int method_nr){ + if (this.verify() != VerificationResult.VR_OK) { + return null; // It's cached, don't worry. + } + if (method_nr < 0 || method_nr >= localVariablesInfos.length){ + throw new AssertionViolatedException("Method number out of range."); + } + return localVariablesInfos[method_nr]; + } + + /** + * Pass 2 is the pass where static properties of the + * class file are checked without looking into "Code" + * arrays of methods. + * This verification pass is usually invoked when + * a class is resolved; and it may be possible that + * this verification pass has to load in other classes + * such as superclasses or implemented interfaces. + * Therefore, Pass 1 is run on them.
          + * Note that most referenced classes are not loaded + * in for verification or for an existance check by this + * pass; only the syntactical correctness of their names + * and descriptors (a.k.a. signatures) is checked.
          + * Very few checks that conceptually belong here + * are delayed until pass 3a in JustIce. JustIce does + * not only check for syntactical correctness but also + * for semantical sanity - therefore it needs access to + * the "Code" array of methods in a few cases. Please + * see the pass 3a documentation, too. + * + * @see org.apache.bcel.verifier.statics.Pass3aVerifier + */ + public VerificationResult do_verify(){ + try { + VerificationResult vr1 = myOwner.doPass1(); + if (vr1.equals(VerificationResult.VR_OK)){ + + // For every method, we could have information about the local variables out of LocalVariableTable attributes of + // the Code attributes. + localVariablesInfos = new LocalVariablesInfo[Repository.lookupClass(myOwner.getClassName()).getMethods().length]; + + VerificationResult vr = VerificationResult.VR_OK; // default. + try{ + constant_pool_entries_satisfy_static_constraints(); + field_and_method_refs_are_valid(); + every_class_has_an_accessible_superclass(); + final_methods_are_not_overridden(); + } + catch (ClassConstraintException cce){ + vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); + } + return vr; + } else { + return VerificationResult.VR_NOTYET; + } + + } catch (ClassNotFoundException e) { + // FIXME: this might not be the best way to handle missing classes. + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + } + + /** + * Ensures that every class has a super class and that + * final classes are not subclassed. + * This means, the class this Pass2Verifier operates + * on has proper super classes (transitively) up to + * java.lang.Object. + * The reason for really loading (and Pass1-verifying) + * all of those classes here is that we need them in + * Pass2 anyway to verify no final methods are overridden + * (that could be declared anywhere in the ancestor hierarchy). + * + * @throws ClassConstraintException otherwise. + */ + private void every_class_has_an_accessible_superclass(){ + try { + Set hs = new HashSet(); // save class names to detect circular inheritance + JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + int supidx = -1; + + while (supidx != 0){ + supidx = jc.getSuperclassNameIndex(); + + if (supidx == 0){ + if (jc != Repository.lookupClass(Type.OBJECT.getClassName())){ + throw new ClassConstraintException("Superclass of '"+jc.getClassName()+"' missing but not "+Type.OBJECT.getClassName()+" itself!"); + } + } + else{ + String supername = jc.getSuperclassName(); + if (! hs.add(supername)){ // If supername already is in the list + throw new ClassConstraintException("Circular superclass hierarchy detected."); + } + Verifier v = VerifierFactory.getVerifier(supername); + VerificationResult vr = v.doPass1(); + + if (vr != VerificationResult.VR_OK){ + throw new ClassConstraintException("Could not load in ancestor class '"+supername+"'."); + } + jc = Repository.lookupClass(supername); + + if (jc.isFinal()){ + throw new ClassConstraintException("Ancestor class '"+supername+"' has the FINAL access modifier and must therefore not be subclassed."); + } + } + } + + } catch (ClassNotFoundException e) { + // FIXME: this might not be the best way to handle missing classes. + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + } + + /** + * Ensures that final methods are not overridden. + * Precondition to run this method: + * constant_pool_entries_satisfy_static_constraints() and + * every_class_has_an_accessible_superclass() have to be invoked before + * (in that order). + * + * @throws ClassConstraintException otherwise. + * @see #constant_pool_entries_satisfy_static_constraints() + * @see #every_class_has_an_accessible_superclass() + */ + private void final_methods_are_not_overridden(){ + try { + Map hashmap = new HashMap(); + JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + + int supidx = -1; + while (supidx != 0){ + supidx = jc.getSuperclassNameIndex(); + + Method[] methods = jc.getMethods(); + for (int i=0; i= cplen)){ + throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(referrer)+"'."); + } + Constant c = cp.getConstant(index); + if (! shouldbe.isInstance(c)){ + /* String isnot = shouldbe.toString().substring(shouldbe.toString().lastIndexOf(".")+1); //Cut all before last "." */ + throw new ClassCastException("Illegal constant '"+tostring(c)+"' at index '"+index+"'. '"+tostring(referrer)+"' expects a '"+shouldbe+"'."); + } + } + /////////////////////////////////////// + // ClassFile structure (vmspec2 4.1) // + /////////////////////////////////////// + public void visitJavaClass(JavaClass obj){ + Attribute[] atts = obj.getAttributes(); + boolean foundSourceFile = false; + boolean foundInnerClasses = false; + + // Is there an InnerClass referenced? + // This is a costly check; existing verifiers don't do it! + boolean hasInnerClass = new InnerClassDetector(jc).innerClassReferenced(); + + for (int i=0; i 1){ + throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); + } + + if (obj.isFinal() && obj.isVolatile()){ + throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_FINAL, ACC_VOLATILE modifiers set."); + } + } + else{ // isInterface! + if (!obj.isPublic()){ + throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); + } + if (!obj.isStatic()){ + throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_STATIC modifier set but hasn't!"); + } + if (!obj.isFinal()){ + throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_FINAL modifier set but hasn't!"); + } + } + + if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_VOLATILE|ACC_TRANSIENT)) > 0){ + addMessage("Field '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, ACC_TRANSIENT set (ignored)."); + } + + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + String name = obj.getName(); + if (! validFieldName(name)){ + throw new ClassConstraintException("Field '"+tostring(obj)+"' has illegal name '"+obj.getName()+"'."); + } + + // A descriptor is often named signature in BCEL + checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); + + String sig = ((ConstantUtf8) (cp.getConstant(obj.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + + try{ + Type.getType(sig); /* Don't need the return value */ + } + catch (ClassFormatException cfe){ + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); + } + + String nameanddesc = (name+sig); + if (field_names_and_desc.contains(nameanddesc)){ + throw new ClassConstraintException("No two fields (like '"+tostring(obj)+"') are allowed have same names and descriptors!"); + } + if (field_names.contains(name)){ + addMessage("More than one field of name '"+name+"' detected (but with different type descriptors). This is very unusual."); + } + field_names_and_desc.add(nameanddesc); + field_names.add(name); + + Attribute[] atts = obj.getAttributes(); + for (int i=0; i 1){ + throw new ClassConstraintException("Method '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); + } + + if (obj.isAbstract()){ + if (obj.isFinal()) { + throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_FINAL modifier set."); + } + if (obj.isNative()) { + throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_NATIVE modifier set."); + } + if (obj.isPrivate()) { + throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_PRIVATE modifier set."); + } + if (obj.isStatic()) { + throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STATIC modifier set."); + } + if (obj.isStrictfp()) { + throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STRICT modifier set."); + } + if (obj.isSynchronized()) { + throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_SYNCHRONIZED modifier set."); + } + } + } + else{ // isInterface! + if (!name.equals(STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph + if (!obj.isPublic()){ + throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); + } + if (!obj.isAbstract()){ + throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_STATIC modifier set but hasn't!"); + } + if ( obj.isPrivate() || + obj.isProtected() || + obj.isStatic() || + obj.isFinal() || + obj.isSynchronized() || + obj.isNative() || + obj.isStrictfp() ){ + throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must not have any of the ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT modifiers set."); + } + } + } + + // A specific instance initialization method... (vmspec2,Page 116). + if (name.equals(CONSTRUCTOR_NAME)){ + //..may have at most one of ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC set: is checked above. + //..may also have ACC_STRICT set, but none of the other flags in table 4.5 (vmspec2, page 115) + if ( obj.isStatic() || + obj.isFinal() || + obj.isSynchronized() || + obj.isNative() || + obj.isAbstract() ){ + throw new ClassConstraintException("Instance initialization method '"+tostring(obj)+"' must not have any of the ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT modifiers set."); + } + } + + // Class and interface initialization methods... + if (name.equals(STATIC_INITIALIZER_NAME)){ + if ((obj.getAccessFlags() & (~ACC_STRICT)) > 0){ + addMessage("Class or interface initialization method '"+tostring(obj)+"' has superfluous access modifier(s) set: everything but ACC_STRICT is ignored."); + } + if (obj.isAbstract()){ + throw new ClassConstraintException("Class or interface initialization method '"+tostring(obj)+"' must not be abstract. This contradicts the Java Language Specification, Second Edition (which omits this constraint) but is common practice of existing verifiers."); + } + } + + if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_SYNCHRONIZED|ACC_NATIVE|ACC_ABSTRACT|ACC_STRICT)) > 0){ + addMessage("Method '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT set (ignored)."); + } + + String nameanddesc = (name+sig); + if (method_names_and_desc.contains(nameanddesc)){ + throw new ClassConstraintException("No two methods (like '"+tostring(obj)+"') are allowed have same names and desciptors!"); + } + method_names_and_desc.add(nameanddesc); + + Attribute[] atts = obj.getAttributes(); + int num_code_atts = 0; + for (int i=0; i= cplen)){ + throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(obj)+"'."); + } + Constant c = cp.getConstant(index); + + if (CONST_Long.isInstance(c) && field_type.equals(Type.LONG)){ + return; + } + if (CONST_Float.isInstance(c) && field_type.equals(Type.FLOAT)){ + return; + } + if (CONST_Double.isInstance(c) && field_type.equals(Type.DOUBLE)){ + return; + } + if (CONST_Integer.isInstance(c) && (field_type.equals(Type.INT) || field_type.equals(Type.SHORT) || field_type.equals(Type.CHAR) || field_type.equals(Type.BYTE) || field_type.equals(Type.BOOLEAN))){ + return; + } + if (CONST_String.isInstance(c) && field_type.equals(Type.STRING)){ + return; + } + + throw new ClassConstraintException("Illegal type of ConstantValue '"+obj+"' embedding Constant '"+c+"'. It is referenced by field '"+tostring(f)+"' expecting a different type: '"+field_type+"'."); + } + } + // SYNTHETIC: see above + // DEPRECATED: see above + ///////////////////////////////////////////////////////// + // method_info-structure-ATTRIBUTES (vmspec2 4.6, 4.7) // + ///////////////////////////////////////////////////////// + public void visitCode(Code obj){//vmspec2 4.7.3 + try { + // No code attribute allowed for native or abstract methods: see visitMethod(Method). + // Code array constraints are checked in Pass3 (3a and 3b). + + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); + if (! name.equals("Code")){ + throw new ClassConstraintException("The Code attribute '"+tostring(obj)+"' is not correctly named 'Code' but '"+name+"'."); + } + + Method m = null; // satisfy compiler + if (!(carrier.predecessor() instanceof Method)){ + addMessage("Code attribute '"+tostring(obj)+"' is not declared in a method_info structure but in '"+carrier.predecessor()+"'. Ignored."); + return; + } + else{ + m = (Method) carrier.predecessor(); // we can assume this method was visited before; + // i.e. the data consistency was verified. + } + + if (obj.getCode().length == 0){ + throw new ClassConstraintException("Code array of Code attribute '"+tostring(obj)+"' (method '"+m+"') must not be empty."); + } + + //In JustIce, the check for correct offsets into the code array is delayed to Pass 3a. + CodeException[] exc_table = obj.getExceptionTable(); + for (int i=0; i= code.getMaxLocals()){ + throw new ClassConstraintException("LocalVariableTable attribute '"+tostring(lvt)+"' references a LocalVariable '"+tostring(localvariables[i])+"' with an index that exceeds the surrounding Code attribute's max_locals value of '"+code.getMaxLocals()+"'."); + } + + try{ + localVariablesInfos[method_number].add(localindex, localname, localvariables[i].getStartPC(), localvariables[i].getLength(), t); + } + catch(LocalVariableInfoInconsistentException lviie){ + throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+"' found in Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"'). "+lviie.getMessage(), lviie); + } + }// for all local variables localvariables[i] in the LocalVariableTable attribute atts[a] END + + num_of_lvt_attribs++; + if (!m.isStatic() && num_of_lvt_attribs > obj.getMaxLocals()){ + throw new ClassConstraintException("Number of LocalVariableTable attributes of Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"') exceeds number of local variable slots '"+obj.getMaxLocals()+"' ('There may be no more than one LocalVariableTable attribute per local variable in the Code attribute.')."); + } + }// if atts[a] instanceof LocalVariableTable END + }// for all attributes atts[a] END + + } catch (ClassNotFoundException e) { + // FIXME: this might not be the best way to handle missing classes. + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + + }// visitCode(Code) END + + public void visitExceptionTable(ExceptionTable obj){//vmspec2 4.7.4 + try { + // incorrectly named, it's the Exceptions attribute (vmspec2 4.7.4) + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); + if (! name.equals("Exceptions")){ + throw new ClassConstraintException("The Exceptions attribute '"+tostring(obj)+"' is not correctly named 'Exceptions' but '"+name+"'."); + } + + int[] exc_indices = obj.getExceptionIndexTable(); + + for (int i=0; iPrecondition: index-style cross referencing in the constant + * pool must be valid. Simply invoke constant_pool_entries_satisfy_static_constraints() + * before. + * + * @throws ClassConstraintException otherwise. + * @see #constant_pool_entries_satisfy_static_constraints() + */ + private void field_and_method_refs_are_valid(){ + try { + JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + DescendingVisitor v = new DescendingVisitor(jc, new FAMRAV_Visitor(jc)); + v.visit(); + + } catch (ClassNotFoundException e) { + // FIXME: this might not be the best way to handle missing classes. + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + } + + /** + * A Visitor class that ensures the ConstantCP-subclassed entries + * of the constant pool are valid. + * Precondition: index-style cross referencing in the constant + * pool must be valid. + * + * @see #constant_pool_entries_satisfy_static_constraints() + * @see org.apache.bcel.classfile.ConstantCP + */ + private class FAMRAV_Visitor extends EmptyVisitor implements Visitor{ + private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work. + private FAMRAV_Visitor(JavaClass _jc){ + cp = _jc.getConstantPool(); + } + + public void visitConstantFieldref(ConstantFieldref obj){ + if (obj.getTag() != Constants.CONSTANT_Fieldref){ + throw new ClassConstraintException("ConstantFieldref '"+tostring(obj)+"' has wrong tag!"); + } + int name_and_type_index = obj.getNameAndTypeIndex(); + ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); + String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name + if (!validFieldName(name)){ + throw new ClassConstraintException("Invalid field name '"+name+"' referenced by '"+tostring(obj)+"'."); + } + + int class_index = obj.getClassIndex(); + ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); + String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form + if (! validClassName(className)){ + throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); + } + + String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + + try{ + Type.getType(sig); /* Don't need the return value */ + } + catch (ClassFormatException cfe){ + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); + } + } + + public void visitConstantMethodref(ConstantMethodref obj){ + if (obj.getTag() != Constants.CONSTANT_Methodref){ + throw new ClassConstraintException("ConstantMethodref '"+tostring(obj)+"' has wrong tag!"); + } + int name_and_type_index = obj.getNameAndTypeIndex(); + ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); + String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name + if (!validClassMethodName(name)){ + throw new ClassConstraintException("Invalid (non-interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); + } + + int class_index = obj.getClassIndex(); + ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); + String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form + if (! validClassName(className)){ + throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); + } + + String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + + try{ + Type t = Type.getReturnType(sig); + if ( name.equals(CONSTRUCTOR_NAME) && (t != Type.VOID) ){ + throw new ClassConstraintException("Instance initialization method must have VOID return type."); + } + } + catch (ClassFormatException cfe){ + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); + } + } + + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ + if (obj.getTag() != Constants.CONSTANT_InterfaceMethodref){ + throw new ClassConstraintException("ConstantInterfaceMethodref '"+tostring(obj)+"' has wrong tag!"); + } + int name_and_type_index = obj.getNameAndTypeIndex(); + ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); + String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name + if (!validInterfaceMethodName(name)){ + throw new ClassConstraintException("Invalid (interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); + } + + int class_index = obj.getClassIndex(); + ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); + String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form + if (! validClassName(className)){ + throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); + } + + String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + + try{ + Type t = Type.getReturnType(sig); + if ( name.equals(STATIC_INITIALIZER_NAME) && (t != Type.VOID) ){ + addMessage("Class or interface initialization method '"+STATIC_INITIALIZER_NAME+"' usually has VOID return type instead of '"+t+"'. Note this is really not a requirement of The Java Virtual Machine Specification, Second Edition."); + } + } + catch (ClassFormatException cfe){ + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); + } + + } + + } + + /** + * This method returns true if and only if the supplied String + * represents a valid Java class name. + */ + private static final boolean validClassName(String name){ + /* + * TODO: implement. + * Are there any restrictions? + */ + return true; + } + /** + * This method returns true if and only if the supplied String + * represents a valid method name. + * This is basically the same as a valid identifier name in the + * Java programming language, but the special name for + * the instance initialization method is allowed and the special name + * for the class/interface initialization method may be allowed. + */ + private static boolean validMethodName(String name, boolean allowStaticInit){ + if (validJavaLangMethodName(name)) { + return true; + } + + if (allowStaticInit){ + return (name.equals(CONSTRUCTOR_NAME) || name.equals(STATIC_INITIALIZER_NAME)); + } + else{ + return name.equals(CONSTRUCTOR_NAME); + } + } + + /** + * This method returns true if and only if the supplied String + * represents a valid method name that may be referenced by + * ConstantMethodref objects. + */ + private static boolean validClassMethodName(String name){ + return validMethodName(name, false); + } + + /** + * This method returns true if and only if the supplied String + * represents a valid Java programming language method name stored as a simple + * (non-qualified) name. + * Conforming to: The Java Virtual Machine Specification, Second Edition, �2.7, �2.7.1, �2.2. + */ + private static boolean validJavaLangMethodName(String name){ + if (!Character.isJavaIdentifierStart(name.charAt(0))) { + return false; + } + + for (int i=1; i, thanks! + } + + // vmspec2 2.7, vmspec2 2.2 + if (!Character.isJavaIdentifierStart(name.charAt(0))) { + return false; + } + + for (int i=1; i= methods.length){ + throw new InvalidMethodException("METHOD DOES NOT EXIST!"); + } + Method method = methods[method_no]; + code = method.getCode(); + + // No Code? Nothing to verify! + if ( method.isAbstract() || method.isNative() ){ // IF mg HAS NO CODE (static constraint of Pass 2) + return VerificationResult.VR_OK; + } + + // TODO: + // We want a very sophisticated code examination here with good explanations + // on where to look for an illegal instruction or such. + // Only after that we should try to build an InstructionList and throw an + // AssertionViolatedException if after our examination InstructionList building + // still fails. + // That examination should be implemented in a byte-oriented way, i.e. look for + // an instruction, make sure its validity, count its length, find the next + // instruction and so on. + try{ + instructionList = new InstructionList(method.getCode().getCode()); + } + catch(RuntimeException re){ + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Bad bytecode in the code array of the Code attribute of method '"+method+"'."); + } + + instructionList.setPositions(true); + + // Start verification. + VerificationResult vr = VerificationResult.VR_OK; //default + try{ + delayedPass2Checks(); + } + catch(ClassConstraintException cce){ + vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); + return vr; + } + try{ + pass3StaticInstructionChecks(); + pass3StaticInstructionOperandsChecks(); + } + catch(StaticCodeConstraintException scce){ + vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, scce.getMessage()); + } + catch(ClassCastException cce){ + vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Class Cast Exception: " + cce.getMessage()); + } + return vr; + } + else{ //did not pass Pass 2. + return VerificationResult.VR_NOTYET; + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + } + + /** + * These are the checks that could be done in pass 2 but are delayed to pass 3 + * for performance reasons. Also, these checks need access to the code array + * of the Code attribute of a Method so it's okay to perform them here. + * Also see the description of the do_verify() method. + * + * @throws ClassConstraintException if the verification fails. + * @see #do_verify() + */ + private void delayedPass2Checks(){ + + int[] instructionPositions = instructionList.getInstructionPositions(); + int codeLength = code.getCode().length; + + ///////////////////// + // LineNumberTable // + ///////////////////// + LineNumberTable lnt = code.getLineNumberTable(); + if (lnt != null){ + LineNumber[] lineNumbers = lnt.getLineNumberTable(); + IntList offsets = new IntList(); + lineNumber_loop: for (int i=0; i < lineNumbers.length; i++){ // may appear in any order. + for (int j=0; j < instructionPositions.length; j++){ + // TODO: Make this a binary search! The instructionPositions array is naturally ordered! + int offset = lineNumbers[i].getStartPC(); + if (instructionPositions[j] == offset){ + if (offsets.contains(offset)){ + addMessage("LineNumberTable attribute '"+code.getLineNumberTable()+"' refers to the same code offset ('"+offset+"') more than once which is violating the semantics [but is sometimes produced by IBM's 'jikes' compiler]."); + } + else{ + offsets.add(offset); + } + continue lineNumber_loop; + } + } + throw new ClassConstraintException("Code attribute '"+code+"' has a LineNumberTable attribute '"+code.getLineNumberTable()+"' referring to a code offset ('"+lineNumbers[i].getStartPC()+"') that does not exist."); + } + } + + /////////////////////////// + // LocalVariableTable(s) // + /////////////////////////// + /* We cannot use code.getLocalVariableTable() because there could be more + than only one. This is a bug in BCEL. */ + Attribute[] atts = code.getAttributes(); + for (int a=0; a= endpc){ + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has its start_pc ('"+startpc+"') not smaller than its end_pc ('"+endpc+"')."); + } + if (!contains(instructionPositions, startpc)){ + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has a non-existant bytecode offset as its start_pc ('"+startpc+"')."); + } + if ( (!contains(instructionPositions, endpc)) && (endpc != codeLength)){ + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has a non-existant bytecode offset as its end_pc ('"+startpc+"') [that is also not equal to code_length ('"+codeLength+"')]."); + } + if (!contains(instructionPositions, handlerpc)){ + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has a non-existant bytecode offset as its handler_pc ('"+handlerpc+"')."); + } + } + } + + /** + * These are the checks if constraints are satisfied which are described in the + * Java Virtual Machine Specification, Second Edition as Static Constraints on + * the instructions of Java Virtual Machine Code (chapter 4.8.1). + * + * @throws StaticCodeConstraintException if the verification fails. + */ + private void pass3StaticInstructionChecks(){ + + // Code array must not be empty: + // Enforced in pass 2 (also stated in the static constraints of the Code + // array in vmspec2), together with pass 1 (reading code_length bytes and + // interpreting them as code[]). So this must not be checked again here. + + if (! (code.getCode().length < 65536)){// contradicts vmspec2 page 152 ("Limitations"), but is on page 134. + throw new StaticCodeInstructionConstraintException("Code array in code attribute '"+code+"' too big: must be smaller than 65536 bytes."); + } + + // First opcode at offset 0: okay, that's clear. Nothing to do. + + // Only instances of the instructions documented in Section 6.4 may appear in + // the code array. + + // For BCEL's sake, we cannot handle WIDE stuff, but hopefully BCEL does its job right :) + + // The last byte of the last instruction in the code array must be the byte at index + // code_length-1 : See the do_verify() comments. We actually don't iterate through the + // byte array, but use an InstructionList so we cannot check for this. But BCEL does + // things right, so it's implicitly okay. + + // TODO: Check how BCEL handles (and will handle) instructions like IMPDEP1, IMPDEP2, + // BREAKPOINT... that BCEL knows about but which are illegal anyway. + // We currently go the safe way here. + InstructionHandle ih = instructionList.getStart(); + while (ih != null){ + Instruction i = ih.getInstruction(); + if (i instanceof IMPDEP1){ + throw new StaticCodeInstructionConstraintException("IMPDEP1 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); + } + if (i instanceof IMPDEP2){ + throw new StaticCodeInstructionConstraintException("IMPDEP2 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); + } + if (i instanceof BREAKPOINT){ + throw new StaticCodeInstructionConstraintException("BREAKPOINT must not be in the code, it is an illegal instruction for _internal_ JVM use!"); + } + ih = ih.getNext(); + } + + // The original verifier seems to do this check here, too. + // An unreachable last instruction may also not fall through the + // end of the code, which is stupid -- but with the original + // verifier's subroutine semantics one cannot predict reachability. + Instruction last = instructionList.getEnd().getInstruction(); + if (! ((last instanceof ReturnInstruction) || + (last instanceof RET) || + (last instanceof GotoInstruction) || + (last instanceof ATHROW) )) { + throw new StaticCodeInstructionConstraintException("Execution must not fall off the bottom of the code array. This constraint is enforced statically as some existing verifiers do - so it may be a false alarm if the last instruction is not reachable."); + } + } + + /** + * These are the checks for the satisfaction of constraints which are described in the + * Java Virtual Machine Specification, Second Edition as Static Constraints on + * the operands of instructions of Java Virtual Machine Code (chapter 4.8.1). + * BCEL parses the code array to create an InstructionList and therefore has to check + * some of these constraints. Additional checks are also implemented here. + * + * @throws StaticCodeConstraintException if the verification fails. + */ + private void pass3StaticInstructionOperandsChecks(){ + try { + // When building up the InstructionList, BCEL has already done all those checks + // mentioned in The Java Virtual Machine Specification, Second Edition, as + // "static constraints on the operands of instructions in the code array". + // TODO: see the do_verify() comments. Maybe we should really work on the + // byte array first to give more comprehensive messages. + // TODO: Review Exception API, possibly build in some "offending instruction" thing + // when we're ready to insulate the offending instruction by doing the + // above thing. + + // TODO: Implement as much as possible here. BCEL does _not_ check everything. + + ConstantPoolGen cpg = new ConstantPoolGen(Repository.lookupClass(myOwner.getClassName()).getConstantPool()); + InstOperandConstraintVisitor v = new InstOperandConstraintVisitor(cpg); + + // Checks for the things BCEL does _not_ handle itself. + InstructionHandle ih = instructionList.getStart(); + while (ih != null){ + Instruction i = ih.getInstruction(); + + // An "own" constraint, due to JustIce's new definition of what "subroutine" means. + if (i instanceof JsrInstruction){ + InstructionHandle target = ((JsrInstruction) i).getTarget(); + if (target == instructionList.getStart()){ + throw new StaticCodeInstructionOperandConstraintException("Due to JustIce's clear definition of subroutines, no JSR or JSR_W may have a top-level instruction (such as the very first instruction, which is targeted by instruction '"+ih+"' as its target."); + } + if (!(target.getInstruction() instanceof ASTORE)){ + throw new StaticCodeInstructionOperandConstraintException("Due to JustIce's clear definition of subroutines, no JSR or JSR_W may target anything else than an ASTORE instruction. Instruction '"+ih+"' targets '"+target+"'."); + } + } + + // vmspec2, page 134-137 + ih.accept(v); + + ih = ih.getNext(); + } + + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + } + + /** A small utility method returning if a given int i is in the given int[] ints. */ + private static boolean contains(int[] ints, int i){ + for (int j=0; j= cpg.getSize()){ + constraintViolated(i, "Illegal constant pool index '"+idx+"'."); + } + } + + /////////////////////////////////////////////////////////// + // The Java Virtual Machine Specification, pages 134-137 // + /////////////////////////////////////////////////////////// + /** + * Assures the generic preconditions of a LoadClass instance. + * The referenced class is loaded and pass2-verified. + */ + public void visitLoadClass(LoadClass o){ + ObjectType t = o.getLoadClassType(cpg); + if (t != null){// null means "no class is loaded" + Verifier v = VerifierFactory.getVerifier(t.getClassName()); + VerificationResult vr = v.doPass1(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded: '"+vr+"'."); + } + } + } + + // The target of each jump and branch instruction [...] must be the opcode [...] + // BCEL _DOES_ handle this. + + // tableswitch: BCEL will do it, supposedly. + + // lookupswitch: BCEL will do it, supposedly. + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + // LDC and LDC_W (LDC_W is a subclass of LDC in BCEL's model) + public void visitLDC(LDC o){ + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (c instanceof ConstantClass){ + addMessage("Operand of LDC or LDC_W is CONSTANT_Class '"+c+"' - this is only supported in JDK 1.5 and higher."); + } + else{ + if (! ( (c instanceof ConstantInteger) || + (c instanceof ConstantFloat) || + (c instanceof ConstantString) ) ){ + constraintViolated(o, "Operand of LDC or LDC_W must be one of CONSTANT_Integer, CONSTANT_Float or CONSTANT_String, but is '"+c+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + // LDC2_W + public void visitLDC2_W(LDC2_W o){ + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (! ( (c instanceof ConstantLong) || + (c instanceof ConstantDouble) ) ){ + constraintViolated(o, "Operand of LDC2_W must be CONSTANT_Long or CONSTANT_Double, but is '"+c+"'."); + } + try{ + indexValid(o, o.getIndex()+1); + } + catch(StaticCodeInstructionOperandConstraintException e){ + throw new AssertionViolatedException("OOPS: Does not BCEL handle that? LDC2_W operand has a problem.", e); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + //getfield, putfield, getstatic, putstatic + public void visitFieldInstruction(FieldInstruction o){ + try { + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantFieldref)){ + constraintViolated(o, "Indexing a constant that's not a CONSTANT_Fieldref but a '"+c+"'."); + } + + String field_name = o.getFieldName(cpg); + + JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + Field[] fields = jc.getFields(); + Field f = null; + for (int i=0; i or + ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantInterfaceMethodref)c).getNameAndTypeIndex())); + String name = ((ConstantUtf8) (cpg.getConstant(cnat.getNameIndex()))).getBytes(); + if (name.equals(Constants.CONSTRUCTOR_NAME)){ + constraintViolated(o, "Method to invoke must not be '"+Constants.CONSTRUCTOR_NAME+"'."); + } + if (name.equals(Constants.STATIC_INITIALIZER_NAME)){ + constraintViolated(o, "Method to invoke must not be '"+Constants.STATIC_INITIALIZER_NAME+"'."); + } + } + + // The LoadClassType is the method-declaring class, so we have to check the other types. + + Type t = o.getReturnType(cpg); + if (t instanceof ArrayType){ + t = ((ArrayType) t).getBasicType(); + } + if (t instanceof ObjectType){ + Verifier v = VerifierFactory.getVerifier(((ObjectType) t).getClassName()); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated(o, "Return type class/interface could not be verified successfully: '"+vr.getMessage()+"'."); + } + } + + Type[] ts = o.getArgumentTypes(cpg); + for (int i=0; i= 255){ + constraintViolated(o, "Not allowed to create an array with more than 255 dimensions."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitNEWARRAY(NEWARRAY o){ + byte t = o.getTypecode(); + if (! ( (t == Constants.T_BOOLEAN) || + (t == Constants.T_CHAR) || + (t == Constants.T_FLOAT) || + (t == Constants.T_DOUBLE) || + (t == Constants.T_BYTE) || + (t == Constants.T_SHORT) || + (t == Constants.T_INT) || + (t == Constants.T_LONG) ) ){ + constraintViolated(o, "Illegal type code '+t+' for 'atype' operand."); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitILOAD(ILOAD o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitFLOAD(FLOAD o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitALOAD(ALOAD o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitISTORE(ISTORE o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitFSTORE(FSTORE o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitASTORE(ASTORE o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitIINC(IINC o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitRET(RET o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitLLOAD(LLOAD o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + } + else{ + int maxminus2 = max_locals()-2; + if (idx > maxminus2){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitDLOAD(DLOAD o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + } + else{ + int maxminus2 = max_locals()-2; + if (idx > maxminus2){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitLSTORE(LSTORE o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + } + else{ + int maxminus2 = max_locals()-2; + if (idx > maxminus2){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitDSTORE(DSTORE o){ + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + } + else{ + int maxminus2 = max_locals()-2; + if (idx > maxminus2){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ + int[] matchs = o.getMatchs(); + int max = Integer.MIN_VALUE; + for (int i=0; i= "low". We cannot check this, as BCEL hides + // it from us. + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitPUTSTATIC(PUTSTATIC o){ + try { + String field_name = o.getFieldName(cpg); + JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + Field[] fields = jc.getFields(); + Field f = null; + for (int i=0; i. + if ((!(jc.isClass())) && (!(meth_name.equals(Constants.STATIC_INITIALIZER_NAME)))){ + constraintViolated(o, "Interface field '"+f+"' must be set in a '"+Constants.STATIC_INITIALIZER_NAME+"' method."); + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + public void visitGETSTATIC(GETSTATIC o){ + try { + String field_name = o.getFieldName(cpg); + JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + Field[] fields = jc.getFields(); + Field f = null; + for (int i=0; iaccept() Visitor + * instances) have toString() methods that were not designed to be robust, + * this gap is closed by this class. + * When performing class file verification, it may be useful to output which + * entity (e.g. a Code instance) is not satisfying the verifier's + * constraints, but in this case it could be possible for the toString() + * method to throw a RuntimeException. + * A (new StringRepresentation(Node n)).toString() never throws any exception. + * Note that this class also serves as a placeholder for more sophisticated message + * handling in future versions of JustIce. + * + * @version $Id$ + * @author Enver Haase + */ +public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor implements Visitor { + /** The string representation, created by a visitXXX() method, output by toString(). */ + private String tostring; + /** The node we ask for its string representation. Not really needed; only for debug output. */ + private Node n; + + /** + * Creates a new StringRepresentation object which is the representation of n. + * + * @see #toString() + */ + public StringRepresentation(Node n) { + this.n = n; + n.accept(this); // assign a string representation to field 'tostring' if we know n's class. + } + + /** + * Returns the String representation. + */ + public String toString() { +// The run-time check below is needed because we don't want to omit inheritance +// of "EmptyVisitor" and provide a thousand empty methods. +// However, in terms of performance this would be a better idea. +// If some new "Node" is defined in BCEL (such as some concrete "Attribute"), we +// want to know that this class has also to be adapted. + if (tostring == null) { + throw new AssertionViolatedException("Please adapt '" + getClass() + "' to deal with objects of class '" + n.getClass() + "'."); + } + return tostring; + } + + /** + * Returns the String representation of the Node object obj; + * this is obj.toString() if it does not throw any RuntimeException, + * or else it is a string derived only from obj's class name. + */ + private String toString(Node obj) { + String ret; + try { + ret = obj.toString(); + } + catch (RuntimeException e) { // including ClassFormatException, trying to convert the "signature" of a ReturnaddressType LocalVariable (shouldn't occur, but people do crazy things) + String s = obj.getClass().getName(); + s = s.substring(s.lastIndexOf(".") + 1); + ret = "<<" + s + ">>"; + } + return ret; + } + + //////////////////////////////// + // Visitor methods start here // + //////////////////////////////// + // We don't of course need to call some default implementation: + // e.g. we could also simply output "Code" instead of a possibly + // lengthy Code attribute's toString(). + public void visitCode(Code obj) { + //tostring = toString(obj); + tostring = ""; // We don't need real code outputs. + } + + public void visitAnnotation(Annotations obj) + { + //this is invoked whenever an annotation is found + //when verifier is passed over a class + tostring = toString(obj); + } + + public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) + { + //this is invoked whenever a local variable type is found + //when verifier is passed over a class + tostring = toString(obj); + } + + public void visitCodeException(CodeException obj) { + tostring = toString(obj); + } + + public void visitConstantClass(ConstantClass obj) { + tostring = toString(obj); + } + + public void visitConstantDouble(ConstantDouble obj) { + tostring = toString(obj); + } + + public void visitConstantFieldref(ConstantFieldref obj) { + tostring = toString(obj); + } + + public void visitConstantFloat(ConstantFloat obj) { + tostring = toString(obj); + } + + public void visitConstantInteger(ConstantInteger obj) { + tostring = toString(obj); + } + + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) { + tostring = toString(obj); + } + + public void visitConstantLong(ConstantLong obj) { + tostring = toString(obj); + } + + public void visitConstantMethodref(ConstantMethodref obj) { + tostring = toString(obj); + } + + public void visitConstantNameAndType(ConstantNameAndType obj) { + tostring = toString(obj); + } + + public void visitConstantPool(ConstantPool obj) { + tostring = toString(obj); + } + + public void visitConstantString(ConstantString obj) { + tostring = toString(obj); + } + + public void visitConstantUtf8(ConstantUtf8 obj) { + tostring = toString(obj); + } + + public void visitConstantValue(ConstantValue obj) { + tostring = toString(obj); + } + + public void visitDeprecated(Deprecated obj) { + tostring = toString(obj); + } + + public void visitExceptionTable(ExceptionTable obj) { + tostring = toString(obj); + } + + public void visitField(Field obj) { + tostring = toString(obj); + } + + public void visitInnerClass(InnerClass obj) { + tostring = toString(obj); + } + + public void visitInnerClasses(InnerClasses obj) { + tostring = toString(obj); + } + + public void visitJavaClass(JavaClass obj) { + tostring = toString(obj); + } + + public void visitLineNumber(LineNumber obj) { + tostring = toString(obj); + } + + public void visitLineNumberTable(LineNumberTable obj) { + tostring = ""; + } + + public void visitLocalVariable(LocalVariable obj) { + tostring = toString(obj); + } + + public void visitLocalVariableTable(LocalVariableTable obj) { + tostring = ""; + } + + public void visitMethod(Method obj) { + tostring = toString(obj); + } + + public void visitSignature(Signature obj) { + tostring = toString(obj); + } + + public void visitSourceFile(SourceFile obj) { + tostring = toString(obj); + } + + public void visitStackMap(StackMap obj) { + tostring = toString(obj); + } + + public void visitSynthetic(Synthetic obj) { + tostring = toString(obj); + } + + public void visitUnknown(Unknown obj) { + tostring = toString(obj); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/statics/package.html b/src/main/java/org/apache/bcel/verifier/statics/package.html new file mode 100644 index 00000000..e0b624e3 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/statics/package.html @@ -0,0 +1,19 @@ + + + + + + + +Provides PassVerifier classes used internally by JustIce. You don't need to bother with them. + +

          Package Specification

          + +Contained in this package are PassVerifier classes for use with the JustIce verifier. +Only the passes performing what Sun calls 'static constraints' have PassVerifier classes +here. + + + diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java new file mode 100644 index 00000000..53387e4e --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -0,0 +1,461 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.structurals; + + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.apache.bcel.generic.ATHROW; +import org.apache.bcel.generic.BranchInstruction; +import org.apache.bcel.generic.GotoInstruction; +import org.apache.bcel.generic.Instruction; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.JsrInstruction; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.RET; +import org.apache.bcel.generic.ReturnInstruction; +import org.apache.bcel.generic.Select; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; + +/** + * This class represents a control flow graph of a method. + * + * @version $Id$ + * @author Enver Haase + */ +public class ControlFlowGraph{ + + /** + * Objects of this class represent a node in a ControlFlowGraph. + * These nodes are instructions, not basic blocks. + */ + private class InstructionContextImpl implements InstructionContext{ + + /** + * The TAG field is here for external temporary flagging, such + * as graph colouring. + * + * @see #getTag() + * @see #setTag(int) + */ + private int TAG; + + /** + * The InstructionHandle this InstructionContext is wrapped around. + */ + private InstructionHandle instruction; + + /** + * The 'incoming' execution Frames. + */ + private Map inFrames; // key: the last-executed JSR + + /** + * The 'outgoing' execution Frames. + */ + private Map outFrames; // key: the last-executed JSR + + /** + * The 'execution predecessors' - a list of type InstructionContext + * of those instances that have been execute()d before in that order. + */ + private ArrayList executionPredecessors = null; // Type: InstructionContext + + /** + * Creates an InstructionHandleImpl object from an InstructionHandle. + * Creation of one per InstructionHandle suffices. Don't create more. + */ + public InstructionContextImpl(InstructionHandle inst){ + if (inst == null) { + throw new AssertionViolatedException("Cannot instantiate InstructionContextImpl from NULL."); + } + + instruction = inst; + inFrames = new java.util.HashMap(); + outFrames = new java.util.HashMap(); + } + + /* Satisfies InstructionContext.getTag(). */ + public int getTag(){ + return TAG; + } + + /* Satisfies InstructionContext.setTag(int). */ + public void setTag(int tag){ + TAG = tag; + } + + /** + * Returns the exception handlers of this instruction. + */ + public ExceptionHandler[] getExceptionHandlers(){ + return exceptionhandlers.getExceptionHandlers(getInstruction()); + } + + /** + * Returns a clone of the "outgoing" frame situation with respect to the given ExecutionChain. + */ + public Frame getOutFrame(ArrayList execChain){ + executionPredecessors = execChain; + + Frame org; + + InstructionContext jsr = lastExecutionJSR(); + + org = (Frame) outFrames.get(jsr); + + if (org == null){ + throw new AssertionViolatedException("outFrame not set! This:\n"+this+"\nExecutionChain: "+getExecutionChain()+"\nOutFrames: '"+outFrames+"'."); + } + return org.getClone(); + } + + public Frame getInFrame() { + Frame org; + + InstructionContext jsr = lastExecutionJSR(); + + org = (Frame) inFrames.get(jsr); + + if (org == null){ + throw new AssertionViolatedException("inFrame not set! This:\n"+this+"\nInFrames: '"+inFrames+"'."); + } + return org.getClone(); + } + + /** + * "Merges in" (vmspec2, page 146) the "incoming" frame situation; + * executes the instructions symbolically + * and therefore calculates the "outgoing" frame situation. + * Returns: True iff the "incoming" frame situation changed after + * merging with "inFrame". + * The execPreds ArrayList must contain the InstructionContext + * objects executed so far in the correct order. This is just + * one execution path [out of many]. This is needed to correctly + * "merge" in the special case of a RET's successor. + * The InstConstraintVisitor and ExecutionVisitor instances + * must be set up correctly. + * @return true - if and only if the "outgoing" frame situation + * changed from the one before execute()ing. + */ + public boolean execute(Frame inFrame, ArrayList execPreds, InstConstraintVisitor icv, ExecutionVisitor ev){ + + executionPredecessors = (ArrayList) execPreds.clone(); + + //sanity check + if ( (lastExecutionJSR() == null) && (subroutines.subroutineOf(getInstruction()) != subroutines.getTopLevel() ) ){ + throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?"); + } + if ( (lastExecutionJSR() != null) && (subroutines.subroutineOf(getInstruction()) == subroutines.getTopLevel() ) ){ + throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?"); + } + + Frame inF = (Frame) inFrames.get(lastExecutionJSR()); + if (inF == null){// no incoming frame was set, so set it. + inFrames.put(lastExecutionJSR(), inFrame); + inF = inFrame; + } + else{// if there was an "old" inFrame + if (inF.equals(inFrame)){ //shortcut: no need to merge equal frames. + return false; + } + if (! mergeInFrames(inFrame)){ + return false; + } + } + + // Now we're sure the inFrame has changed! + + // new inFrame is already merged in, see above. + Frame workingFrame = inF.getClone(); + + try{ + // This verifies the InstructionConstraint for the current + // instruction, but does not modify the workingFrame object. +//InstConstraintVisitor icv = InstConstraintVisitor.getInstance(VerifierFactory.getVerifier(method_gen.getClassName())); + icv.setFrame(workingFrame); + getInstruction().accept(icv); + } + catch(StructuralCodeConstraintException ce){ + ce.extendMessage("","\nInstructionHandle: "+getInstruction()+"\n"); + ce.extendMessage("","\nExecution Frame:\n"+workingFrame); + extendMessageWithFlow(ce); + throw ce; + } + + // This executes the Instruction. + // Therefore the workingFrame object is modified. +//ExecutionVisitor ev = ExecutionVisitor.getInstance(VerifierFactory.getVerifier(method_gen.getClassName())); + ev.setFrame(workingFrame); + getInstruction().accept(ev); + //getInstruction().accept(ExecutionVisitor.withFrame(workingFrame)); + outFrames.put(lastExecutionJSR(), workingFrame); + + return true; // new inFrame was different from old inFrame so merging them + // yielded a different this.inFrame. + } + + /** + * Returns a simple String representation of this InstructionContext. + */ + public String toString(){ + //TODO: Put information in the brackets, e.g. + // Is this an ExceptionHandler? Is this a RET? Is this the start of + // a subroutine? + String ret = getInstruction().toString(false)+"\t[InstructionContext]"; + return ret; + } + + /** + * Does the actual merging (vmspec2, page 146). + * Returns true IFF this.inFrame was changed in course of merging with inFrame. + */ + private boolean mergeInFrames(Frame inFrame){ + // TODO: Can be performance-improved. + Frame inF = (Frame) inFrames.get(lastExecutionJSR()); + OperandStack oldstack = inF.getStack().getClone(); + LocalVariables oldlocals = inF.getLocals().getClone(); + try{ + inF.getStack().merge(inFrame.getStack()); + inF.getLocals().merge(inFrame.getLocals()); + } + catch (StructuralCodeConstraintException sce){ + extendMessageWithFlow(sce); + throw sce; + } + if ( oldstack.equals(inF.getStack()) && + oldlocals.equals(inF.getLocals()) ){ + return false; + } + else{ + return true; + } + } + + /** + * Returns the control flow execution chain. This is built + * while execute(Frame, ArrayList)-ing the code represented + * by the surrounding ControlFlowGraph. + */ + private String getExecutionChain(){ + String s = this.toString(); + for (int i=executionPredecessors.size()-1; i>=0; i--){ + s = executionPredecessors.get(i)+"\n" + s; + } + return s; + } + + + /** + * Extends the StructuralCodeConstraintException ("e") object with an at-the-end-extended message. + * This extended message will then reflect the execution flow needed to get to the constraint + * violation that triggered the throwing of the "e" object. + */ + private void extendMessageWithFlow(StructuralCodeConstraintException e){ + String s = "Execution flow:\n"; + e.extendMessage("", s+getExecutionChain()); + } + + /* + * Fulfils the contract of InstructionContext.getInstruction(). + */ + public InstructionHandle getInstruction(){ + return instruction; + } + + /** + * Returns the InstructionContextImpl with an JSR/JSR_W + * that was last in the ExecutionChain, without + * a corresponding RET, i.e. + * we were called by this one. + * Returns null if we were called from the top level. + */ + private InstructionContextImpl lastExecutionJSR(){ + + int size = executionPredecessors.size(); + int retcount = 0; + + for (int i=size-1; i>=0; i--){ + InstructionContextImpl current = (InstructionContextImpl) (executionPredecessors.get(i)); + Instruction currentlast = current.getInstruction().getInstruction(); + if (currentlast instanceof RET) { + retcount++; + } + if (currentlast instanceof JsrInstruction){ + retcount--; + if (retcount == -1) { + return current; + } + } + } + return null; + } + + /* Satisfies InstructionContext.getSuccessors(). */ + public InstructionContext[] getSuccessors(){ + return contextsOf(_getSuccessors()); + } + + /** + * A utility method that calculates the successors of a given InstructionHandle + * That means, a RET does have successors as defined here. + * A JsrInstruction has its target as its successor + * (opposed to its physical successor) as defined here. + */ +// TODO: implement caching! + private InstructionHandle[] _getSuccessors(){ + final InstructionHandle[] empty = new InstructionHandle[0]; + final InstructionHandle[] single = new InstructionHandle[1]; + + Instruction inst = getInstruction().getInstruction(); + + if (inst instanceof RET){ + Subroutine s = subroutines.subroutineOf(getInstruction()); + if (s==null){ //return empty; // RET in dead code. "empty" would be the correct answer, but we know something about the surrounding project... + throw new AssertionViolatedException("Asking for successors of a RET in dead code?!"); + } + +//TODO: remove. Only JustIce must not use it, but foreign users of the ControlFlowGraph +// will want it. Thanks Johannes Wust. +//throw new AssertionViolatedException("DID YOU REALLY WANT TO ASK FOR RET'S SUCCS?"); + + InstructionHandle[] jsrs = s.getEnteringJsrInstructions(); + InstructionHandle[] ret = new InstructionHandle[jsrs.length]; + for (int i=0; i(NOT ORDERED!). + */ + public InstructionContext[] getInstructionContexts(){ + InstructionContext[] ret = new InstructionContext[instructionContexts.values().size()]; + return (InstructionContext[]) instructionContexts.values().toArray(ret); + } + + /** + * Returns true, if and only if the said instruction is not reachable; that means, + * if it is not part of this ControlFlowGraph. + */ + public boolean isDead(InstructionHandle i){ + return subroutines.subroutineOf(i) == null; + } +} diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java new file mode 100644 index 00000000..0fd58cee --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java @@ -0,0 +1,57 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.structurals; + + +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.ObjectType; + +/** + * This class represents an exception handler; that is, an ObjectType + * representing a subclass of java.lang.Throwable and the instruction + * the handler starts off (represented by an InstructionContext). + * + * @version $Id$ + * @author Enver Haase + */ +public class ExceptionHandler{ + /** The type of the exception to catch. NULL means ANY. */ + private ObjectType catchtype; + + /** The InstructionHandle where the handling begins. */ + private InstructionHandle handlerpc; + + /** Leave instance creation to JustIce. */ + ExceptionHandler(ObjectType catch_type, InstructionHandle handler_pc){ + catchtype = catch_type; + handlerpc = handler_pc; + } + + /** + * Returns the type of the exception that's handled. 'null' means 'ANY'. + */ + public ObjectType getExceptionType(){ + return catchtype; + } + + /** + * Returns the InstructionHandle where the handler starts off. + */ + public InstructionHandle getHandlerStart(){ + return handlerpc; + } +} diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java new file mode 100644 index 00000000..0c113c92 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -0,0 +1,76 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.structurals; + + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.apache.bcel.generic.CodeExceptionGen; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.MethodGen; + +/** + * This class allows easy access to ExceptionHandler objects. + * + * @version $Id$ + * @author Enver Haase + */ +public class ExceptionHandlers{ + /** + * The ExceptionHandler instances. + * Key: InstructionHandle objects, Values: HashSet instances. + */ + private Map exceptionhandlers; + + /** + * Constructor. Creates a new ExceptionHandlers instance. + */ + public ExceptionHandlers(MethodGen mg){ + exceptionhandlers = new HashMap(); + CodeExceptionGen[] cegs = mg.getExceptionHandlers(); + for (int i=0; iConventions: + * + * Type.VOID will never be pushed onto the stack. Type.DOUBLE and Type.LONG + * that would normally take up two stack slots (like Double_HIGH and + * Double_LOW) are represented by a simple single Type.DOUBLE or Type.LONG + * object on the stack here. + * If a two-slot type is stored into a local variable, the next variable + * is given the type Type.UNKNOWN. + * + * @version $Id$ + * @author Enver Haase + * @see #visitDSTORE(DSTORE o) + * @see InstConstraintVisitor + */ +public class ExecutionVisitor extends EmptyVisitor implements Visitor{ + + /** + * The executionframe we're operating on. + */ + private Frame frame = null; + + /** + * The ConstantPoolGen we're working with. + * @see #setConstantPoolGen(ConstantPoolGen) + */ + private ConstantPoolGen cpg = null; + + /** + * Constructor. Constructs a new instance of this class. + */ + public ExecutionVisitor(){} + + /** + * The OperandStack from the current Frame we're operating on. + * @see #setFrame(Frame) + */ + private OperandStack stack(){ + return frame.getStack(); + } + + /** + * The LocalVariables from the current Frame we're operating on. + * @see #setFrame(Frame) + */ + private LocalVariables locals(){ + return frame.getLocals(); + } + + /** + * Sets the ConstantPoolGen needed for symbolic execution. + */ + public void setConstantPoolGen(ConstantPoolGen cpg){ + this.cpg = cpg; + } + + /** + * The only method granting access to the single instance of + * the ExecutionVisitor class. Before actively using this + * instance, SET THE ConstantPoolGen FIRST. + * @see #setConstantPoolGen(ConstantPoolGen) + */ + public void setFrame(Frame f){ + this.frame = f; + } + + ///** Symbolically executes the corresponding Java Virtual Machine instruction. */ + //public void visitWIDE(WIDE o){ + // The WIDE instruction is modelled as a flag + // of the embedded instructions in BCEL. + // Therefore BCEL checks for possible errors + // when parsing in the .class file: We don't + // have even the possibilty to care for WIDE + // here. + //} + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitAALOAD(AALOAD o){ + stack().pop(); // pop the index int +//System.out.print(stack().peek()); + Type t = stack().pop(); // Pop Array type + if (t == Type.NULL){ + stack().push(Type.NULL); + } // Do nothing stackwise --- a NullPointerException is thrown at Run-Time + else{ + ArrayType at = (ArrayType) t; + stack().push(at.getElementType()); + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitAASTORE(AASTORE o){ + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitACONST_NULL(ACONST_NULL o){ + stack().push(Type.NULL); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitALOAD(ALOAD o){ + stack().push(locals().get(o.getIndex())); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitANEWARRAY(ANEWARRAY o){ + stack().pop(); //count + stack().push( new ArrayType(o.getType(cpg), 1) ); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitARETURN(ARETURN o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitARRAYLENGTH(ARRAYLENGTH o){ + stack().pop(); + stack().push(Type.INT); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitASTORE(ASTORE o){ + locals().set(o.getIndex(), stack().pop()); + //System.err.println("TODO-DEBUG: set LV '"+o.getIndex()+"' to '"+locals().get(o.getIndex())+"'."); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitATHROW(ATHROW o){ + Type t = stack().pop(); + stack().clear(); + if (t.equals(Type.NULL)) { + stack().push(Type.getType("Ljava/lang/NullPointerException;")); + } else { + stack().push(t); + } + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitBALOAD(BALOAD o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitBASTORE(BASTORE o){ + stack().pop(); + stack().pop(); + stack().pop(); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitBIPUSH(BIPUSH o){ + stack().push(Type.INT); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitCALOAD(CALOAD o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitCASTORE(CASTORE o){ + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitCHECKCAST(CHECKCAST o){ + // It's possibly wrong to do so, but SUN's + // ByteCode verifier seems to do (only) this, too. + // TODO: One could use a sophisticated analysis here to check + // if a type cannot possibly be cated to another and by + // so doing predict the ClassCastException at run-time. + stack().pop(); + stack().push(o.getType(cpg)); + } + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitD2F(D2F o){ + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitD2I(D2I o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitD2L(D2L o){ + stack().pop(); + stack().push(Type.LONG); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDADD(DADD o){ + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDALOAD(DALOAD o){ + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDASTORE(DASTORE o){ + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDCMPG(DCMPG o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDCMPL(DCMPL o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDCONST(DCONST o){ + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDDIV(DDIV o){ + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDLOAD(DLOAD o){ + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDMUL(DMUL o){ + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDNEG(DNEG o){ + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDREM(DREM o){ + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDRETURN(DRETURN o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDSTORE(DSTORE o){ + locals().set(o.getIndex(), stack().pop()); + locals().set(o.getIndex()+1, Type.UNKNOWN); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDSUB(DSUB o){ + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDUP(DUP o){ + Type t = stack().pop(); + stack().push(t); + stack().push(t); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDUP_X1(DUP_X1 o){ + Type w1 = stack().pop(); + Type w2 = stack().pop(); + stack().push(w1); + stack().push(w2); + stack().push(w1); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDUP_X2(DUP_X2 o){ + Type w1 = stack().pop(); + Type w2 = stack().pop(); + if (w2.getSize() == 2){ + stack().push(w1); + stack().push(w2); + stack().push(w1); + } + else{ + Type w3 = stack().pop(); + stack().push(w1); + stack().push(w3); + stack().push(w2); + stack().push(w1); + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDUP2(DUP2 o){ + Type t = stack().pop(); + if (t.getSize() == 2){ + stack().push(t); + stack().push(t); + } + else{ // t.getSize() is 1 + Type u = stack().pop(); + stack().push(u); + stack().push(t); + stack().push(u); + stack().push(t); + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDUP2_X1(DUP2_X1 o){ + Type t = stack().pop(); + if (t.getSize() == 2){ + Type u = stack().pop(); + stack().push(t); + stack().push(u); + stack().push(t); + } + else{ //t.getSize() is1 + Type u = stack().pop(); + Type v = stack().pop(); + stack().push(u); + stack().push(t); + stack().push(v); + stack().push(u); + stack().push(t); + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitDUP2_X2(DUP2_X2 o){ + Type t = stack().pop(); + if (t.getSize() == 2){ + Type u = stack().pop(); + if (u.getSize() == 2){ + stack().push(t); + stack().push(u); + stack().push(t); + }else{ + Type v = stack().pop(); + stack().push(t); + stack().push(v); + stack().push(u); + stack().push(t); + } + } + else{ //t.getSize() is 1 + Type u = stack().pop(); + Type v = stack().pop(); + if (v.getSize() == 2){ + stack().push(u); + stack().push(t); + stack().push(v); + stack().push(u); + stack().push(t); + }else{ + Type w = stack().pop(); + stack().push(u); + stack().push(t); + stack().push(w); + stack().push(v); + stack().push(u); + stack().push(t); + } + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitF2D(F2D o){ + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitF2I(F2I o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitF2L(F2L o){ + stack().pop(); + stack().push(Type.LONG); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFADD(FADD o){ + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFALOAD(FALOAD o){ + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFASTORE(FASTORE o){ + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFCMPG(FCMPG o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFCMPL(FCMPL o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFCONST(FCONST o){ + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFDIV(FDIV o){ + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFLOAD(FLOAD o){ + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFMUL(FMUL o){ + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFNEG(FNEG o){ + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFREM(FREM o){ + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFRETURN(FRETURN o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFSTORE(FSTORE o){ + locals().set(o.getIndex(), stack().pop()); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitFSUB(FSUB o){ + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitGETFIELD(GETFIELD o){ + stack().pop(); + Type t = o.getFieldType(cpg); + if ( t.equals(Type.BOOLEAN) || + t.equals(Type.CHAR) || + t.equals(Type.BYTE) || + t.equals(Type.SHORT) ) { + t = Type.INT; + } + stack().push(t); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitGETSTATIC(GETSTATIC o){ + Type t = o.getFieldType(cpg); + if ( t.equals(Type.BOOLEAN) || + t.equals(Type.CHAR) || + t.equals(Type.BYTE) || + t.equals(Type.SHORT) ) { + t = Type.INT; + } + stack().push(t); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitGOTO(GOTO o){ + // no stack changes. + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitGOTO_W(GOTO_W o){ + // no stack changes. + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitI2B(I2B o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitI2C(I2C o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitI2D(I2D o){ + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitI2F(I2F o){ + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitI2L(I2L o){ + stack().pop(); + stack().push(Type.LONG); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitI2S(I2S o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIADD(IADD o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIALOAD(IALOAD o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIAND(IAND o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIASTORE(IASTORE o){ + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitICONST(ICONST o){ + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIDIV(IDIV o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ACMPEQ(IF_ACMPEQ o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ACMPNE(IF_ACMPNE o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ICMPEQ(IF_ICMPEQ o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ICMPGE(IF_ICMPGE o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ICMPGT(IF_ICMPGT o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ICMPLE(IF_ICMPLE o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ICMPLT(IF_ICMPLT o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIF_ICMPNE(IF_ICMPNE o){ + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFEQ(IFEQ o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFGE(IFGE o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFGT(IFGT o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFLE(IFLE o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFLT(IFLT o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFNE(IFNE o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFNONNULL(IFNONNULL o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIFNULL(IFNULL o){ + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIINC(IINC o){ + // stack is not changed. + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitILOAD(ILOAD o){ + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitIMUL(IMUL o){ + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitINEG(INEG o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitINSTANCEOF(INSTANCEOF o){ + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ + stack().pop(); //objectref + for (int i=0; i stack().slotsUsed()){ + constraintViolated((Instruction) o, "Cannot consume "+consume+" stack slots: only "+stack().slotsUsed()+" slot(s) left on stack!\nStack:\n"+stack()); + } + + int produce = o.produceStack(cpg) - ((Instruction) o).consumeStack(cpg); // Stack values are always consumed first; then produced. + if ( produce + stack().slotsUsed() > stack().maxStack() ){ + constraintViolated((Instruction) o, "Cannot produce "+produce+" stack slots: only "+(stack().maxStack()-stack().slotsUsed())+" free stack slot(s) left.\nStack:\n"+stack()); + } + } + + /***************************************************************/ + /* "generic"visitXXXX methods where XXXX is an interface */ + /* therefore, we don't know the order of visiting; but we know */ + /* these methods are called before the visitYYYY methods below */ + /***************************************************************/ + + /** + * Assures the generic preconditions of a LoadClass instance. + * The referenced class is loaded and pass2-verified. + */ + public void visitLoadClass(LoadClass o){ + ObjectType t = o.getLoadClassType(cpg); + if (t != null){// null means "no class is loaded" + Verifier v = VerifierFactory.getVerifier(t.getClassName()); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + } + + /** + * Ensures the general preconditions of a StackConsumer instance. + */ + public void visitStackConsumer(StackConsumer o){ + _visitStackAccessor((Instruction) o); + } + + /** + * Ensures the general preconditions of a StackProducer instance. + */ + public void visitStackProducer(StackProducer o){ + _visitStackAccessor((Instruction) o); + } + + + /***************************************************************/ + /* "generic" visitYYYY methods where YYYY is a superclass. */ + /* therefore, we know the order of visiting; we know */ + /* these methods are called after the visitXXXX methods above. */ + /***************************************************************/ + /** + * Ensures the general preconditions of a CPInstruction instance. + */ + public void visitCPInstruction(CPInstruction o){ + int idx = o.getIndex(); + if ((idx < 0) || (idx >= cpg.getSize())){ + throw new AssertionViolatedException("Huh?! Constant pool index of instruction '"+o+"' illegal? Pass 3a should have checked this!"); + } + } + + /** + * Ensures the general preconditions of a FieldInstruction instance. + */ + public void visitFieldInstruction(FieldInstruction o){ + // visitLoadClass(o) has been called before: Every FieldOrMethod + // implements LoadClass. + // visitCPInstruction(o) has been called before. + // A FieldInstruction may be: GETFIELD, GETSTATIC, PUTFIELD, PUTSTATIC + Constant c = cpg.getConstant(o.getIndex()); + if (!(c instanceof ConstantFieldref)){ + constraintViolated(o, "Index '"+o.getIndex()+"' should refer to a CONSTANT_Fieldref_info structure, but refers to '"+c+"'."); + } + // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). + Type t = o.getType(cpg); + if (t instanceof ObjectType){ + String name = ((ObjectType)t).getClassName(); + Verifier v = VerifierFactory.getVerifier( name ); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + } + + /** + * Ensures the general preconditions of an InvokeInstruction instance. + */ + public void visitInvokeInstruction(InvokeInstruction o){ + // visitLoadClass(o) has been called before: Every FieldOrMethod + // implements LoadClass. + // visitCPInstruction(o) has been called before. + //TODO + } + + /** + * Ensures the general preconditions of a StackInstruction instance. + */ + public void visitStackInstruction(StackInstruction o){ + _visitStackAccessor(o); + } + + /** + * Assures the generic preconditions of a LocalVariableInstruction instance. + * That is, the index of the local variable must be valid. + */ + public void visitLocalVariableInstruction(LocalVariableInstruction o){ + if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ + constraintViolated(o, "The 'index' is not a valid index into the local variable array."); + } + } + + /** + * Assures the generic preconditions of a LoadInstruction instance. + */ + public void visitLoadInstruction(LoadInstruction o){ + //visitLocalVariableInstruction(o) is called before, because it is more generic. + + // LOAD instructions must not read Type.UNKNOWN + if (locals().get(o.getIndex()) == Type.UNKNOWN){ + constraintViolated(o, "Read-Access on local variable "+o.getIndex()+" with unknown content."); + } + + // LOAD instructions, two-slot-values at index N must have Type.UNKNOWN + // as a symbol for the higher halve at index N+1 + // [suppose some instruction put an int at N+1--- our double at N is defective] + if (o.getType(cpg).getSize() == 2){ + if (locals().get(o.getIndex()+1) != Type.UNKNOWN){ + constraintViolated(o, "Reading a two-locals value from local variables "+o.getIndex()+" and "+(o.getIndex()+1)+" where the latter one is destroyed."); + } + } + + // LOAD instructions must read the correct type. + if (!(o instanceof ALOAD)){ + if (locals().get(o.getIndex()) != o.getType(cpg) ){ + constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+locals().get(o.getIndex())+"'; Instruction type: '"+o.getType(cpg)+"'."); + } + } + else{ // we deal with an ALOAD + if (!(locals().get(o.getIndex()) instanceof ReferenceType)){ + constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+locals().get(o.getIndex())+"'; Instruction expects a ReferenceType."); + } + // ALOAD __IS ALLOWED__ to put uninitialized objects onto the stack! + //referenceTypeIsInitialized(o, (ReferenceType) (locals().get(o.getIndex()))); + } + + // LOAD instructions must have enough free stack slots. + if ((stack().maxStack() - stack().slotsUsed()) < o.getType(cpg).getSize()){ + constraintViolated(o, "Not enough free stack slots to load a '"+o.getType(cpg)+"' onto the OperandStack."); + } + } + + /** + * Assures the generic preconditions of a StoreInstruction instance. + */ + public void visitStoreInstruction(StoreInstruction o){ + //visitLocalVariableInstruction(o) is called before, because it is more generic. + + if (stack().isEmpty()){ // Don't bother about 1 or 2 stack slots used. This check is implicitely done below while type checking. + constraintViolated(o, "Cannot STORE: Stack to read from is empty."); + } + + if ( (!(o instanceof ASTORE)) ){ + if (! (stack().peek() == o.getType(cpg)) ){// the other xSTORE types are singletons in BCEL. + constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction type: '"+o.getType(cpg)+"'."); + } + } + else{ // we deal with ASTORE + Type stacktop = stack().peek(); + if ( (!(stacktop instanceof ReferenceType)) && (!(stacktop instanceof ReturnaddressType)) ){ + constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction expects a ReferenceType or a ReturnadressType."); + } + //if (stacktop instanceof ReferenceType){ + // referenceTypeIsInitialized(o, (ReferenceType) stacktop); + //} + } + } + + /** + * Assures the generic preconditions of a ReturnInstruction instance. + */ + public void visitReturnInstruction(ReturnInstruction o){ + Type method_type = mg.getType(); + if (method_type == Type.BOOLEAN || + method_type == Type.BYTE || + method_type == Type.SHORT || + method_type == Type.CHAR){ + method_type = Type.INT; + } + + if (o instanceof RETURN){ + if (method_type != Type.VOID){ + constraintViolated(o, "RETURN instruction in non-void method."); + } + else{ + return; + } + } + if (o instanceof ARETURN){ + if (stack().peek() == Type.NULL){ + return; + } + else{ + if (! (stack().peek() instanceof ReferenceType)){ + constraintViolated(o, "Reference type expected on top of stack, but is: '"+stack().peek()+"'."); + } + referenceTypeIsInitialized(o, (ReferenceType) (stack().peek())); + //ReferenceType objectref = (ReferenceType) (stack().peek()); + // TODO: This can only be checked if using Staerk-et-al's "set of object types" instead of a + // "wider cast object type" created during verification. + //if (! (objectref.isAssignmentCompatibleWith(mg.getType())) ){ + // constraintViolated(o, "Type on stack top which should be returned is a '"+stack().peek()+"' which is not assignment compatible with the return type of this method, '"+mg.getType()+"'."); + //} + } + } + else{ + if (! ( method_type.equals( stack().peek() ))){ + constraintViolated(o, "Current method has return type of '"+mg.getType()+"' expecting a '"+method_type+"' on top of the stack. But stack top is a '"+stack().peek()+"'."); + } + } + } + + /***************************************************************/ + /* "special"visitXXXX methods for one type of instruction each */ + /***************************************************************/ + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitAALOAD(AALOAD o){ + Type arrayref = stack().peek(1); + Type index = stack().peek(0); + + indexOfInt(o, index); + if (arrayrefOfArrayType(o, arrayref)){ + if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); + } + //referenceTypeIsInitialized(o, (ReferenceType) (((ArrayType) arrayref).getElementType())); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitAASTORE(AASTORE o){ + try { + Type arrayref = stack().peek(2); + Type index = stack().peek(1); + Type value = stack().peek(0); + + indexOfInt(o, index); + if (!(value instanceof ReferenceType)){ + constraintViolated(o, "The 'value' is not of a ReferenceType but of type "+value+"."); + }else{ + //referenceTypeIsInitialized(o, (ReferenceType) value); + } + // Don't bother further with "referenceTypeIsInitialized()", there are no arrays + // of an uninitialized object type. + if (arrayrefOfArrayType(o, arrayref)){ + if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); + } + if (! ((ReferenceType)value).isAssignmentCompatibleWith((ReferenceType) ((ArrayType) arrayref).getElementType())){ + constraintViolated(o, "The type of 'value' ('"+value+"') is not assignment compatible to the components of the array 'arrayref' refers to. ('"+((ArrayType) arrayref).getElementType()+"')"); + } + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitACONST_NULL(ACONST_NULL o){ + // Nothing needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitALOAD(ALOAD o){ + //visitLoadInstruction(LoadInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitANEWARRAY(ANEWARRAY o){ + if (!stack().peek().equals(Type.INT)) { + constraintViolated(o, "The 'count' at the stack top is not of type '"+Type.INT+"' but of type '"+stack().peek()+"'."); + // The runtime constant pool item at that index must be a symbolic reference to a class, + // array, or interface type. See Pass 3a. + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitARETURN(ARETURN o){ + if (! (stack().peek() instanceof ReferenceType) ){ + constraintViolated(o, "The 'objectref' at the stack top is not of a ReferenceType but of type '"+stack().peek()+"'."); + } + ReferenceType objectref = (ReferenceType) (stack().peek()); + referenceTypeIsInitialized(o, objectref); + + // The check below should already done via visitReturnInstruction(ReturnInstruction), see there. + // It cannot be done using Staerk-et-al's "set of object types" instead of a + // "wider cast object type", anyway. + //if (! objectref.isAssignmentCompatibleWith(mg.getReturnType() )){ + // constraintViolated(o, "The 'objectref' type "+objectref+" at the stack top is not assignment compatible with the return type '"+mg.getReturnType()+"' of the method."); + //} + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitARRAYLENGTH(ARRAYLENGTH o){ + Type arrayref = stack().peek(0); + arrayrefOfArrayType(o, arrayref); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitASTORE(ASTORE o){ + if (! ( (stack().peek() instanceof ReferenceType) || (stack().peek() instanceof ReturnaddressType) ) ){ + constraintViolated(o, "The 'objectref' is not of a ReferenceType or of ReturnaddressType but of "+stack().peek()+"."); + } + //if (stack().peek() instanceof ReferenceType){ + // referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + //} + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitATHROW(ATHROW o){ + try { + // It's stated that 'objectref' must be of a ReferenceType --- but since Throwable is + // not derived from an ArrayType, it follows that 'objectref' must be of an ObjectType or Type.NULL. + if (! ((stack().peek() instanceof ObjectType) || (stack().peek().equals(Type.NULL))) ){ + constraintViolated(o, "The 'objectref' is not of an (initialized) ObjectType but of type "+stack().peek()+"."); + } + + // NULL is a subclass of every class, so to speak. + if (stack().peek().equals(Type.NULL)) { + return; + } + + ObjectType exc = (ObjectType) (stack().peek()); + ObjectType throwable = (ObjectType) (Type.getType("Ljava/lang/Throwable;")); + if ( (! (exc.subclassOf(throwable)) ) && (! (exc.equals(throwable))) ){ + constraintViolated(o, "The 'objectref' is not of class Throwable or of a subclass of Throwable, but of '"+stack().peek()+"'."); + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitBALOAD(BALOAD o){ + Type arrayref = stack().peek(1); + Type index = stack().peek(0); + indexOfInt(o, index); + if (arrayrefOfArrayType(o, arrayref)){ + if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || + (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ){ + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitBASTORE(BASTORE o){ + Type arrayref = stack().peek(2); + Type index = stack().peek(1); + Type value = stack().peek(0); + + indexOfInt(o, index); + valueOfInt(o, value); + if (arrayrefOfArrayType(o, arrayref)){ + if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || + (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ) { + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitBIPUSH(BIPUSH o){ + // Nothing to do... + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitBREAKPOINT(BREAKPOINT o){ + throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as BREAKPOINT."); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitCALOAD(CALOAD o){ + Type arrayref = stack().peek(1); + Type index = stack().peek(0); + + indexOfInt(o, index); + arrayrefOfArrayType(o, arrayref); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitCASTORE(CASTORE o){ + Type arrayref = stack().peek(2); + Type index = stack().peek(1); + Type value = stack().peek(0); + + indexOfInt(o, index); + valueOfInt(o, value); + if (arrayrefOfArrayType(o, arrayref)){ + if (! ((ArrayType) arrayref).getElementType().equals(Type.CHAR) ){ + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of type char but to an array of type "+((ArrayType) arrayref).getElementType()+"."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitCHECKCAST(CHECKCAST o){ + // The objectref must be of type reference. + Type objectref = stack().peek(0); + if (!(objectref instanceof ReferenceType)){ + constraintViolated(o, "The 'objectref' is not of a ReferenceType but of type "+objectref+"."); + } + //else{ + // referenceTypeIsInitialized(o, (ReferenceType) objectref); + //} + // The unsigned indexbyte1 and indexbyte2 are used to construct an index into the runtime constant pool of the + // current class (�3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant + // pool item at the index must be a symbolic reference to a class, array, or interface type. + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantClass)){ + constraintViolated(o, "The Constant at 'index' is not a ConstantClass, but '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitD2F(D2F o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitD2I(D2I o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitD2L(D2L o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDADD(DADD o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDALOAD(DALOAD o){ + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type double[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.DOUBLE){ + constraintViolated(o, "Stack next-to-top must be of type double[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDASTORE(DASTORE o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type double[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.DOUBLE){ + constraintViolated(o, "Stack next-to-next-to-top must be of type double[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDCMPG(DCMPG o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDCMPL(DCMPL o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDCONST(DCONST o){ + // There's nothing to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDDIV(DDIV o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDLOAD(DLOAD o){ + //visitLoadInstruction(LoadInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDMUL(DMUL o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDNEG(DNEG o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDREM(DREM o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDRETURN(DRETURN o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDSTORE(DSTORE o){ + //visitStoreInstruction(StoreInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDSUB(DSUB o){ + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDUP(DUP o){ + if (stack().peek().getSize() != 1){ + constraintViolated(o, "Won't DUP type on stack top '"+stack().peek()+"' because it must occupy exactly one slot, not '"+stack().peek().getSize()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDUP_X1(DUP_X1 o){ + if (stack().peek().getSize() != 1){ + constraintViolated(o, "Type on stack top '"+stack().peek()+"' should occupy exactly one slot, not '"+stack().peek().getSize()+"'."); + } + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "Type on stack next-to-top '"+stack().peek(1)+"' should occupy exactly one slot, not '"+stack().peek(1).getSize()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDUP_X2(DUP_X2 o){ + if (stack().peek().getSize() != 1){ + constraintViolated(o, "Stack top type must be of size 1, but is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); + } + if (stack().peek(1).getSize() == 2){ + return; // Form 2, okay. + } + else{ //stack().peek(1).getSize == 1. + if (stack().peek(2).getSize() != 1){ + constraintViolated(o, "If stack top's size is 1 and stack next-to-top's size is 1, stack next-to-next-to-top's size must also be 1, but is: '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDUP2(DUP2 o){ + if (stack().peek().getSize() == 2){ + return; // Form 2, okay. + } + else{ //stack().peek().getSize() == 1. + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDUP2_X1(DUP2_X1 o){ + if (stack().peek().getSize() == 2){ + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "If stack top's size is 2, then stack next-to-top's size must be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); + } + else{ + return; // Form 2 + } + } + else{ // stack top is of size 1 + if ( stack().peek(1).getSize() != 1 ){ + constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); + } + if ( stack().peek(2).getSize() != 1 ){ + constraintViolated(o, "If stack top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitDUP2_X2(DUP2_X2 o){ + + if (stack().peek(0).getSize() == 2){ + if (stack().peek(1).getSize() == 2){ + return; // Form 4 + } + else{// stack top size is 2, next-to-top's size is 1 + if ( stack().peek(2).getSize() != 1 ){ + constraintViolated(o, "If stack top's size is 2 and stack-next-to-top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + } + else{ + return; // Form 2 + } + } + } + else{// stack top is of size 1 + if (stack().peek(1).getSize() == 1){ + if ( stack().peek(2).getSize() == 2 ){ + return; // Form 3 + } + else{ + if ( stack().peek(3).getSize() == 1){ + return; // Form 1 + } + } + } + } + constraintViolated(o, "The operand sizes on the stack do not match any of the four forms of usage of this instruction."); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitF2D(F2D o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitF2I(F2I o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitF2L(F2L o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFADD(FADD o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFALOAD(FALOAD o){ + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type float[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.FLOAT){ + constraintViolated(o, "Stack next-to-top must be of type float[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFASTORE(FASTORE o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type float[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.FLOAT){ + constraintViolated(o, "Stack next-to-next-to-top must be of type float[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFCMPG(FCMPG o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFCMPL(FCMPL o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFCONST(FCONST o){ + // nothing to do here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFDIV(FDIV o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFLOAD(FLOAD o){ + //visitLoadInstruction(LoadInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFMUL(FMUL o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFNEG(FNEG o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFREM(FREM o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFRETURN(FRETURN o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFSTORE(FSTORE o){ + //visitStoreInstruction(StoreInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitFSUB(FSUB o){ + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitGETFIELD(GETFIELD o){ + try { + Type objectref = stack().peek(); + if (! ( (objectref instanceof ObjectType) || (objectref == Type.NULL) ) ){ + constraintViolated(o, "Stack top should be an object reference that's not an array reference, but is '"+objectref+"'."); + } + + String field_name = o.getFieldName(cpg); + + JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + Field[] fields = jc.getFields(); + Field f = null; + for (int i=0; i=0; i--){ + Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 + Type fromDesc = argtypes[i]; + if (fromDesc == Type.BOOLEAN || + fromDesc == Type.BYTE || + fromDesc == Type.CHAR || + fromDesc == Type.SHORT){ + fromDesc = Type.INT; + } + if (! fromStack.equals(fromDesc)){ + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + ReferenceType rFromStack = (ReferenceType) fromStack; + //ReferenceType rFromDesc = (ReferenceType) fromDesc; + // TODO: This can only be checked when using Staerk-et-al's "set of object types" + // instead of a "wider cast object type" created during verification. + //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + //} + referenceTypeIsInitialized(o, rFromStack); + } + else{ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); + } + } + } + + Type objref = stack().peek(nargs); + if (objref == Type.NULL){ + return; + } + if (! (objref instanceof ReferenceType) ){ + constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); + } + referenceTypeIsInitialized(o, (ReferenceType) objref); + if (!(objref instanceof ObjectType)){ + if (!(objref instanceof ArrayType)){ + constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType + } + else{ + objref = GENERIC_ARRAY; + } + } + + // String objref_classname = ((ObjectType) objref).getClassName(); + // String theInterface = o.getClassName(cpg); + // TODO: This can only be checked if we're using Staerk-et-al's "set of object types" + // instead of "wider cast object types" generated during verification. + //if ( ! Repository.implementationOf(objref_classname, theInterface) ){ + // constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theInterface+"' as expected."); + //} + + int counted_count = 1; // 1 for the objectref + for (int i=0; i=0; i--){ + Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 + Type fromDesc = argtypes[i]; + if (fromDesc == Type.BOOLEAN || + fromDesc == Type.BYTE || + fromDesc == Type.CHAR || + fromDesc == Type.SHORT){ + fromDesc = Type.INT; + } + if (! fromStack.equals(fromDesc)){ + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + ReferenceType rFromStack = (ReferenceType) fromStack; + ReferenceType rFromDesc = (ReferenceType) fromDesc; + // TODO: This can only be checked using Staerk-et-al's "set of object types", not + // using a "wider cast object type". + if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + } + referenceTypeIsInitialized(o, rFromStack); + } + else{ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); + } + } + } + + Type objref = stack().peek(nargs); + if (objref == Type.NULL){ + return; + } + if (! (objref instanceof ReferenceType) ){ + constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); + } + String objref_classname = null; + if ( !(o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME))){ + referenceTypeIsInitialized(o, (ReferenceType) objref); + if (!(objref instanceof ObjectType)){ + if (!(objref instanceof ArrayType)){ + constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType + } + else{ + objref = GENERIC_ARRAY; + } + } + + objref_classname = ((ObjectType) objref).getClassName(); + } + else{ + if (!(objref instanceof UninitializedObjectType)){ + constraintViolated(o, "Expecting an UninitializedObjectType as 'objectref' on the stack, not a '"+objref+"'. Otherwise, you couldn't invoke a method since an array has no methods (not to speak of a return address)."); + } + objref_classname = ((UninitializedObjectType) objref).getInitialized().getClassName(); + } + + + String theClass = o.getClassName(cpg); + if ( ! Repository.instanceOf(objref_classname, theClass) ){ + constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); + } + + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitINVOKESTATIC(INVOKESTATIC o){ + try { + // Method is not native, otherwise pass 3 would not happen. + + Type t = o.getType(cpg); + if (t instanceof ObjectType){ + String name = ((ObjectType)t).getClassName(); + Verifier v = VerifierFactory.getVerifier( name ); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + + Type[] argtypes = o.getArgumentTypes(cpg); + int nargs = argtypes.length; + + for (int i=nargs-1; i>=0; i--){ + Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 + Type fromDesc = argtypes[i]; + if (fromDesc == Type.BOOLEAN || + fromDesc == Type.BYTE || + fromDesc == Type.CHAR || + fromDesc == Type.SHORT){ + fromDesc = Type.INT; + } + if (! fromStack.equals(fromDesc)){ + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + ReferenceType rFromStack = (ReferenceType) fromStack; + ReferenceType rFromDesc = (ReferenceType) fromDesc; + // TODO: This check can possibly only be done using Staerk-et-al's "set of object types" + // instead of a "wider cast object type" created during verification. + if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + } + referenceTypeIsInitialized(o, rFromStack); + } + else{ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); + } + } + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ + try { + // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). + + Type t = o.getType(cpg); + if (t instanceof ObjectType){ + String name = ((ObjectType)t).getClassName(); + Verifier v = VerifierFactory.getVerifier( name ); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + + + Type[] argtypes = o.getArgumentTypes(cpg); + int nargs = argtypes.length; + + for (int i=nargs-1; i>=0; i--){ + Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 + Type fromDesc = argtypes[i]; + if (fromDesc == Type.BOOLEAN || + fromDesc == Type.BYTE || + fromDesc == Type.CHAR || + fromDesc == Type.SHORT){ + fromDesc = Type.INT; + } + if (! fromStack.equals(fromDesc)){ + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + ReferenceType rFromStack = (ReferenceType) fromStack; + ReferenceType rFromDesc = (ReferenceType) fromDesc; + // TODO: This can possibly only be checked when using Staerk-et-al's "set of object types" instead + // of a single "wider cast object type" created during verification. + if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + } + referenceTypeIsInitialized(o, rFromStack); + } + else{ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); + } + } + } + + Type objref = stack().peek(nargs); + if (objref == Type.NULL){ + return; + } + if (! (objref instanceof ReferenceType) ){ + constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); + } + referenceTypeIsInitialized(o, (ReferenceType) objref); + if (!(objref instanceof ObjectType)){ + if (!(objref instanceof ArrayType)){ + constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType + } + else{ + objref = GENERIC_ARRAY; + } + } + + String objref_classname = ((ObjectType) objref).getClassName(); + + String theClass = o.getClassName(cpg); + + if ( ! Repository.instanceOf(objref_classname, theClass) ){ + constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitIOR(IOR o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitIREM(IREM o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitIRETURN(IRETURN o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitISHL(ISHL o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitISHR(ISHR o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitISTORE(ISTORE o){ + //visitStoreInstruction(StoreInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitISUB(ISUB o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitIUSHR(IUSHR o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitIXOR(IXOR o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitJSR(JSR o){ + // nothing to do here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitJSR_W(JSR_W o){ + // nothing to do here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitL2D(L2D o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitL2F(L2F o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitL2I(L2I o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLADD(LADD o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLALOAD(LALOAD o){ + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type long[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.LONG){ + constraintViolated(o, "Stack next-to-top must be of type long[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLAND(LAND o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLASTORE(LASTORE o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type long[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.LONG){ + constraintViolated(o, "Stack next-to-next-to-top must be of type long[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLCMP(LCMP o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLCONST(LCONST o){ + // Nothing to do here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLDC(LDC o){ + // visitCPInstruction is called first. + + Constant c = cpg.getConstant(o.getIndex()); + if (! ( ( c instanceof ConstantInteger) || + ( c instanceof ConstantFloat ) || + ( c instanceof ConstantString ) ) ){ + constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLDC_W(LDC_W o){ + // visitCPInstruction is called first. + + Constant c = cpg.getConstant(o.getIndex()); + if (! ( ( c instanceof ConstantInteger) || + ( c instanceof ConstantFloat ) || + ( c instanceof ConstantString ) ) ){ + constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLDC2_W(LDC2_W o){ + // visitCPInstruction is called first. + + Constant c = cpg.getConstant(o.getIndex()); + if (! ( ( c instanceof ConstantLong) || + ( c instanceof ConstantDouble ) ) ){ + constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLDIV(LDIV o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLLOAD(LLOAD o){ + //visitLoadInstruction(LoadInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLMUL(LMUL o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLNEG(LNEG o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + // See also pass 3a. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLOR(LOR o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLREM(LREM o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLRETURN(LRETURN o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLSHL(LSHL o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLSHR(LSHR o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLSTORE(LSTORE o){ + //visitStoreInstruction(StoreInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLSUB(LSUB o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLUSHR(LUSHR o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLXOR(LXOR o){ + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitMONITORENTER(MONITORENTER o){ + if (! ((stack().peek()) instanceof ReferenceType)){ + constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); + } + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitMONITOREXIT(MONITOREXIT o){ + if (! ((stack().peek()) instanceof ReferenceType)){ + constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); + } + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitMULTIANEWARRAY(MULTIANEWARRAY o){ + int dimensions = o.getDimensions(); + // Dimensions argument is okay: see Pass 3a. + for (int i=0; i, see Pass 3a. + + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e.toString(), e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitRET(RET o){ + if (! (locals().get(o.getIndex()) instanceof ReturnaddressType)){ + constraintViolated(o, "Expecting a ReturnaddressType in local variable "+o.getIndex()+"."); + } + if (locals().get(o.getIndex()) == ReturnaddressType.NO_TARGET){ + throw new AssertionViolatedException("Oops: RET expecting a target!"); + } + // Other constraints such as non-allowed overlapping subroutines are enforced + // while building the Subroutines data structure. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitRETURN(RETURN o){ + if (mg.getName().equals(Constants.CONSTRUCTOR_NAME)){// If we leave an method + if ((Frame._this != null) && (!(mg.getClassName().equals(Type.OBJECT.getClassName()))) ) { + constraintViolated(o, "Leaving a constructor that itself did not call a constructor."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitSALOAD(SALOAD o){ + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type short[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.SHORT){ + constraintViolated(o, "Stack next-to-top must be of type short[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitSASTORE(SASTORE o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type short[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.SHORT){ + constraintViolated(o, "Stack next-to-next-to-top must be of type short[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitSIPUSH(SIPUSH o){ + // nothing to do here. Generic visitXXX() methods did the trick before. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitSWAP(SWAP o){ + if (stack().peek().getSize() != 1){ + constraintViolated(o, "The value at the stack top is not of size '1', but of size '"+stack().peek().getSize()+"'."); + } + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "The value at the stack next-to-top is not of size '1', but of size '"+stack().peek(1).getSize()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitTABLESWITCH(TABLESWITCH o){ + indexOfInt(o, stack().peek()); + // See Pass 3a. + } + +} + diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java new file mode 100644 index 00000000..fa42db5f --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -0,0 +1,105 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.structurals; + + +import java.util.ArrayList; +import org.apache.bcel.generic.InstructionHandle; + +/** + * An InstructionContext offers convenient access + * to information like control flow successors and + * such. + * + * @version $Id$ + * @author Enver Haase + */ +public interface InstructionContext{ + + /** + * The getTag and setTag methods may be used for + * temporary flagging, such as graph colouring. + * Nothing in the InstructionContext object depends + * on the value of the tag. JustIce does not use it. + * + * @see #setTag(int tag) + */ + public int getTag(); + + /** + * The getTag and setTag methods may be used for + * temporary flagging, such as graph colouring. + * Nothing in the InstructionContext object depends + * on the value of the tag. JustIce does not use it. + * + * @see #getTag() + */ + public void setTag(int tag); + + /** + * This method symbolically executes the Instruction + * held in the InstructionContext. + * It "merges in" the incoming execution frame situation + * (see The Java Virtual Machine Specification, 2nd + * edition, page 146). + * By so doing, the outgoing execution frame situation + * is calculated. + * + * This method is JustIce-specific and is usually of + * no sense for users of the ControlFlowGraph class. + * They should use getInstruction().accept(Visitor), + * possibly in conjunction with the ExecutionVisitor. + * + * + * @see ControlFlowGraph + * @see ExecutionVisitor + * @see #getOutFrame(ArrayList) + * @return true - if and only if the "outgoing" frame situation + * changed from the one before execute()ing. + */ + boolean execute(Frame inFrame, ArrayList executionPredecessors, InstConstraintVisitor icv, ExecutionVisitor ev); + + Frame getInFrame(); + + /** + * This method returns the outgoing execution frame situation; + * therefore it has to be calculated by execute(Frame, ArrayList) + * first. + * + * @see #execute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) + */ + Frame getOutFrame(ArrayList executionPredecessors); + + /** + * Returns the InstructionHandle this InstructionContext is wrapped around. + * + * @return The InstructionHandle this InstructionContext is wrapped around. + */ + InstructionHandle getInstruction(); + + /** + * Returns the usual control flow successors. + * @see #getExceptionHandlers() + */ + InstructionContext[] getSuccessors(); + + /** + * Returns the exception handlers that protect this instruction. + * They are special control flow successors. + */ + ExceptionHandler[] getExceptionHandlers(); +} diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java new file mode 100644 index 00000000..199edb25 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -0,0 +1,209 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.structurals; + + +import org.apache.bcel.generic.ReferenceType; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; + +/** + * This class implements an array of local variables used for symbolic JVM + * simulation. + * + * @version $Id$ + * @author Enver Haase + */ +public class LocalVariables{ + /** The Type[] containing the local variable slots. */ + private Type[] locals; + + /** + * Creates a new LocalVariables object. + */ + public LocalVariables(int maxLocals){ + locals = new Type[maxLocals]; + for (int i=0; i= maxStack){ + throw new AssertionViolatedException("OperandStack too small, should have thrown proper Exception elsewhere. Stack: "+this); + } + stack.add(type); + } + + /** + * Returns the size of this OperandStack; that means, how many Type objects there are. + */ + public int size(){ + return stack.size(); + } + + /** + * Returns the number of stack slots used. + * @see #maxStack() + */ + public int slotsUsed(){ + /* XXX change this to a better implementation using a variable + that keeps track of the actual slotsUsed()-value monitoring + all push()es and pop()s. + */ + int slots = 0; + for (int i=0; i no Instruction was executed before + // => Top-Level routine (no jsr call before) + icq.add(start, new ArrayList()); + + // LOOP! + while (!icq.isEmpty()){ + InstructionContext u; + ArrayList ec; + if (!DEBUG){ + int r = random.nextInt(icq.size()); + u = icq.getIC(r); + ec = icq.getEC(r); + icq.remove(r); + } + else{ + u = icq.getIC(0); + ec = icq.getEC(0); + icq.remove(0); + } + + ArrayList oldchain = (ArrayList) (ec.clone()); + ArrayList newchain = (ArrayList) (ec.clone()); + newchain.add(u); + + if ((u.getInstruction().getInstruction()) instanceof RET){ +//System.err.println(u); + // We can only follow _one_ successor, the one after the + // JSR that was recently executed. + RET ret = (RET) (u.getInstruction().getInstruction()); + ReturnaddressType t = (ReturnaddressType) u.getOutFrame(oldchain).getLocals().get(ret.getIndex()); + InstructionContext theSuccessor = cfg.contextOf(t.getTarget()); + + // Sanity check + InstructionContext lastJSR = null; + int skip_jsr = 0; + for (int ss=oldchain.size()-1; ss >= 0; ss--){ + if (skip_jsr < 0){ + throw new AssertionViolatedException("More RET than JSR in execution chain?!"); + } +//System.err.println("+"+oldchain.get(ss)); + if (((InstructionContext) oldchain.get(ss)).getInstruction().getInstruction() instanceof JsrInstruction){ + if (skip_jsr == 0){ + lastJSR = (InstructionContext) oldchain.get(ss); + break; + } + else{ + skip_jsr--; + } + } + if (((InstructionContext) oldchain.get(ss)).getInstruction().getInstruction() instanceof RET){ + skip_jsr++; + } + } + if (lastJSR == null){ + throw new AssertionViolatedException("RET without a JSR before in ExecutionChain?! EC: '"+oldchain+"'."); + } + JsrInstruction jsr = (JsrInstruction) (lastJSR.getInstruction().getInstruction()); + if ( theSuccessor != (cfg.contextOf(jsr.physicalSuccessor())) ){ + throw new AssertionViolatedException("RET '"+u.getInstruction()+"' info inconsistent: jump back to '"+theSuccessor+"' or '"+cfg.contextOf(jsr.physicalSuccessor())+"'?"); + } + + if (theSuccessor.execute(u.getOutFrame(oldchain), newchain, icv, ev)){ + icq.add(theSuccessor, (ArrayList) newchain.clone()); + } + } + else{// "not a ret" + + // Normal successors. Add them to the queue of successors. + InstructionContext[] succs = u.getSuccessors(); + for (int s=0; sMust not be invoked on the 'top-level subroutine'. + */ + public InstructionHandle[] getEnteringJsrInstructions(); + + /** + * Returns the one and only RET that leaves the subroutine. + * Note that JustIce has a pretty rigid notion of a subroutine. + * Must not be invoked on the 'top-level subroutine'. + * + * @see org.apache.bcel.verifier.structurals.Subroutines + */ + public InstructionHandle getLeavingRET(); + + /** + * Returns all instructions that together form this subroutine. + * Note that an instruction is part of exactly one subroutine + * (the top-level code is considered to be a special subroutine) - + * else it is not reachable at all (dead code). + */ + public InstructionHandle[] getInstructions(); + + /** + * Returns if the given InstructionHandle refers to an instruction + * that is part of this subroutine. This is a convenience method + * that saves iteration over the InstructionHandle objects returned + * by getInstructions(). + * + * @see #getInstructions() + */ + public boolean contains(InstructionHandle inst); + + /** + * Returns an int[] containing the indices of the local variable slots + * accessed by this Subroutine (read-accessed, write-accessed or both); + * local variables referenced by subroutines of this subroutine are + * not included. + * + * @see #getRecursivelyAccessedLocalsIndices() + */ + public int[] getAccessedLocalsIndices(); + + /** + * Returns an int[] containing the indices of the local variable slots + * accessed by this Subroutine (read-accessed, write-accessed or both); + * local variables referenced by subroutines of this subroutine are + * included. + * + * @see #getAccessedLocalsIndices() + */ + public int[] getRecursivelyAccessedLocalsIndices(); + + /** + * Returns the subroutines that are directly called from this subroutine. + */ + public Subroutine[] subSubs(); +} diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java new file mode 100644 index 00000000..3fcf6249 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -0,0 +1,653 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.structurals; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import org.apache.bcel.generic.ASTORE; +import org.apache.bcel.generic.ATHROW; +import org.apache.bcel.generic.BranchInstruction; +import org.apache.bcel.generic.CodeExceptionGen; +import org.apache.bcel.generic.GotoInstruction; +import org.apache.bcel.generic.IndexedInstruction; +import org.apache.bcel.generic.Instruction; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.JsrInstruction; +import org.apache.bcel.generic.LocalVariableInstruction; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.RET; +import org.apache.bcel.generic.ReturnInstruction; +import org.apache.bcel.generic.Select; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; + + /** + * Instances of this class contain information about the subroutines + * found in a code array of a method. + * This implementation considers the top-level (the instructions + * reachable without a JSR or JSR_W starting off from the first + * instruction in a code array of a method) being a special subroutine; + * see getTopLevel() for that. + * Please note that the definition of subroutines in the Java Virtual + * Machine Specification, Second Edition is somewhat incomplete. + * Therefore, JustIce uses an own, more rigid notion. + * Basically, a subroutine is a piece of code that starts at the target + * of a JSR of JSR_W instruction and ends at a corresponding RET + * instruction. Note also that the control flow of a subroutine + * may be complex and non-linear; and that subroutines may be nested. + * JustIce also mandates subroutines not to be protected by exception + * handling code (for the sake of control flow predictability). + * To understand JustIce's notion of subroutines, please read + * + * TODO: refer to the paper. + * + * @version $Id$ + * @author Enver Haase + * @see #getTopLevel() + */ +public class Subroutines{ + /** + * This inner class implements the Subroutine interface. + */ + private class SubroutineImpl implements Subroutine{ + /** + * UNSET, a symbol for an uninitialized localVariable + * field. This is used for the "top-level" Subroutine; + * i.e. no subroutine. + */ + private static final int UNSET = -1; + + /** + * The Local Variable slot where the first + * instruction of this subroutine (an ASTORE) stores + * the JsrInstruction's ReturnAddress in and + * the RET of this subroutine operates on. + */ + private int localVariable = UNSET; + + /** The instructions that belong to this subroutine. */ + private Set instructions = new HashSet(); // Elements: InstructionHandle + + /* + * Refer to the Subroutine interface for documentation. + */ + public boolean contains(InstructionHandle inst){ + return instructions.contains(inst); + } + + /** + * The JSR or JSR_W instructions that define this + * subroutine by targeting it. + */ + private Set theJSRs = new HashSet(); + + /** + * The RET instruction that leaves this subroutine. + */ + private InstructionHandle theRET; + + /** + * Returns a String representation of this object, merely + * for debugging purposes. + * (Internal) Warning: Verbosity on a problematic subroutine may cause + * stack overflow errors due to recursive subSubs() calls. + * Don't use this, then. + */ + public String toString(){ + String ret = "Subroutine: Local variable is '"+localVariable+"', JSRs are '"+theJSRs+"', RET is '"+theRET+"', Instructions: '"+instructions.toString()+"'."; + + ret += " Accessed local variable slots: '"; + int[] alv = getAccessedLocalsIndices(); + for (int i=0; inot a + * subroutine, the top-level, is also modeled as a Subroutine + * object. + * It is a special Subroutine object where you must not invoke + * getEnteringJsrInstructions() or getLeavingRET(). + * + * @see Subroutine#getEnteringJsrInstructions() + * @see Subroutine#getLeavingRET() + */ + public Subroutine getTopLevel(){ + return TOPLEVEL; + } + /** + * A utility method that calculates the successors of a given InstructionHandle + * in the same subroutine. That means, a RET does not have any successors + * as defined here. A JsrInstruction has its physical successor as its successor + * (opposed to its target) as defined here. + */ + private static InstructionHandle[] getSuccessors(InstructionHandle instruction){ + final InstructionHandle[] empty = new InstructionHandle[0]; + final InstructionHandle[] single = new InstructionHandle[1]; + + Instruction inst = instruction.getInstruction(); + + if (inst instanceof RET){ + return empty; + } + + // Terminates method normally. + if (inst instanceof ReturnInstruction){ + return empty; + } + + // Terminates method abnormally, because JustIce mandates + // subroutines not to be protected by exception handlers. + if (inst instanceof ATHROW){ + return empty; + } + + // See method comment. + if (inst instanceof JsrInstruction){ + single[0] = instruction.getNext(); + return single; + } + + if (inst instanceof GotoInstruction){ + single[0] = ((GotoInstruction) inst).getTarget(); + return single; + } + + if (inst instanceof BranchInstruction){ + if (inst instanceof Select){ + // BCEL's getTargets() returns only the non-default targets, + // thanks to Eli Tilevich for reporting. + InstructionHandle[] matchTargets = ((Select) inst).getTargets(); + InstructionHandle[] ret = new InstructionHandle[matchTargets.length+1]; + ret[0] = ((Select) inst).getTarget(); + System.arraycopy(matchTargets, 0, ret, 1, matchTargets.length); + return ret; + } + else{ + final InstructionHandle[] pair = new InstructionHandle[2]; + pair[0] = instruction.getNext(); + pair[1] = ((BranchInstruction) inst).getTarget(); + return pair; + } + } + + // default case: Fall through. + single[0] = instruction.getNext(); + return single; + } + + /** + * Returns a String representation of this object; merely for debugging puposes. + */ + public String toString(){ + return "---\n"+subroutines.toString()+"\n---\n"; + } +} diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java new file mode 100644 index 00000000..096dc446 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -0,0 +1,67 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.structurals; + + +import org.apache.bcel.Constants; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.ReferenceType; + +/** + * This class represents an uninitialized object type; see The Java + * Virtual Machine Specification, Second Edition, page 147: 4.9.4 for + * more details. + * + * @version $Id$ + * @author Enver Haase + */ +public class UninitializedObjectType extends ReferenceType implements Constants{ + + /** The "initialized" version. */ + private ObjectType initialized; + + /** Creates a new instance. */ + public UninitializedObjectType(ObjectType t){ + super(T_UNKNOWN, ""); + initialized = t; + } + + /** + * Returns the ObjectType of the same class as the one of the uninitialized object + * represented by this UninitializedObjectType instance. + */ + public ObjectType getInitialized(){ + return initialized; + } + + /** @return a hash code value for the object. + */ + public int hashCode() { return initialized.hashCode(); } + + /** + * Returns true on equality of this and o. + * Equality means the ObjectType instances of "initialized" + * equal one another in this and the o instance. + * + */ + public boolean equals(Object o){ + if (! (o instanceof UninitializedObjectType)) { + return false; + } + return initialized.equals(((UninitializedObjectType)o).initialized); + } +} diff --git a/src/main/java/org/apache/bcel/verifier/structurals/package.html b/src/main/java/org/apache/bcel/verifier/structurals/package.html new file mode 100644 index 00000000..94ba2fa8 --- /dev/null +++ b/src/main/java/org/apache/bcel/verifier/structurals/package.html @@ -0,0 +1,20 @@ + + + + + + + +Provides a PassVerifier class mostly used internally by JustIce, yielding a control flow graph for public use as +a nice side effect. + +

          Package Specification

          + +Contained in this package is a PassVerifier class for use with the JustIce verifier and its utility classes. +Only the pass performing what Sun calls "Structural Constraints on Java Virtual Machine Code" +has a PassVerifier class here. JustIce calls this pass "Pass 3b". + + + -- GitLab From d658cae88da725890cdab04c0c7ec2a357940da2 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 10 Jan 2010 18:01:06 +0000 Subject: [PATCH 0424/1313] fixed up the plugins git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897671 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 57 ++++++++++++++------------------------------------------- 1 file changed, 14 insertions(+), 43 deletions(-) diff --git a/pom.xml b/pom.xml index c776c590..6fa0276d 100755 --- a/pom.xml +++ b/pom.xml @@ -138,7 +138,6 @@ website - scpexe://people.apache.org/home/${USER}/public_html/websites/bcel @@ -207,64 +206,36 @@ - -- GitLab From 30110fffbe17299fc92b2a623cff7f2590b54954 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 10 Jan 2010 19:22:40 +0000 Subject: [PATCH 0425/1313] prepare for 5.3 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897686 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 69 +++++------------------------------------------ 1 file changed, 7 insertions(+), 62 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index ab7d1223..67083731 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,8 +1,8 @@ -BCEL 5.2 RELEASE NOTES +BCEL 5.3 RELEASE NOTES ===================== -Compatibility with 5.1 +Compatibility with 5.2 ---------------------- Binary compatible - Yes @@ -11,76 +11,21 @@ Source compatible - Yes Semantic compatible - Yes -Deprecations from 5.1 +Deprecations from 5.2 --------------------- -public final org.apache.bcel.classfile.LocalVariable getLocalVariable(int) -public java.lang.String getClassName(org.apache.bcel.generic.ConstantPoolGen) -public org.apache.bcel.generic.ObjectType getClassType(org.apache.bcel.generic.ConstantPoolGen) -public boolean referencesClass() -public boolean referencesInterface() public org.apache.bcel.util.ClassVector implements java.io.Serializable -Bug fixes from 5.1 +Bug fixes from 5.2 ------------------ 32664 Examples with enum breaks Gump (JDK1.5) -32901 Truncated "class" string in returned class name -32980 Simple Javadoc cleanup -33018 Fix hashCode methods -34318 JavaClass.dump(OutputStream/DataOutputStream) shouldnt ca... -34449 InnerClass doesn't implement Serializable -35991 Unable to generate method that returns an array of integers -36110 A bug in LocalVariableGen -37648 JasminVisitor is outdated -37666 BCEL depends on AWT -38377 BCEL cannot be used as java.system.class.loader -38834 nullpointer exception in InstructionHandle -12568 Typo in javadocs -18031 ConstantPoolGen.lookupClass(String) finds LAST entry rath... -18323 Size of LDC_W's operand can be incorrect -18731 InstructionList.copy() fails with Select instruction. -19014 annoying print statement in org.apache.bcel.classfile.Sig... -19068 JavaClass.getAllInterfaces() can throw NullPointerExcepti... -19122 Repository ignores classes that have been added to it -19352 ANEWARRAY does not implement StackConsumer -19476 Repository.instanceOf() can throw NullPointerException -19784 StackMapType.printIndex fails if index is -1 -24274 ReturnaddressType.equals() fails with NullPointerException -24315 Verification failure when nested finally blocks -24350 PUTFIELD error msg wrong -24766 Suggestion to solve the Problem with generic.Instruction ... -26049 Incorrect verification of class files -26087 OutOfRange exception in Pass2Verifier.validJavaIdentifier -26179 Code attribute set for native (and abstract?) methods. -26532 InstructionList.move is broken when target == il.getEnd() -26533 bad iinc behavior with large local variable index -27855 StructuralVerifier can't find protected fields of ... -28329 BCEL does not compile with JDK 1.5.0-beta-b32c -29275 Corrupted instruction list created on valid class file -29903 LDC_W emits output with only one parameter byte -31604 Build problems against jdk1.5 -31630 ClassPath.getClassPath() does not handle multiple java.ex... -27646 Public modifier for OperandStack.size() -17753 Version information missing from MANIFEST.MF file. -33822 Wrong word in manual: use 'factorial', not 'faculty' -32205 A security issue with public mutable static fields in BECL -33513 Unnecessary string object allocation in ConstantPoolGen -34418 ClassCastException on justice -38787 XSLT transforms broken in Turkish Locale. -35405 Branch target offset too large for short -33235 "Illegal Opcode Detected" exception thrown in "new Method... -35610 Source downloads are broken -38424 LineNumberTable toString method uses jdk 1.4 StringBuffer... - -Enhancements from 5.1 + + +Enhancements from 5.2 --------------------- -32077 LocalVariableTable.getLocalVariable isn't good en... -20465 Verifer does not report the signature of methods not found -27854 Allow to get the InFrame of the ControlFlowGraph -33302 Add support for new Jdk5.0 access flags 32945 Wrap JavaClass repository class (map values) with... -- GitLab From 86802a5f4bd57f692ce21b788308fabf1532d633 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 10 Jan 2010 19:26:09 +0000 Subject: [PATCH 0426/1313] https://issues.apache.org/bugzilla/show_bug.cgi?id=41660 Expose annotations to subclasses git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897687 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AnnotationEntry.java | 147 +++++++++--------- .../apache/bcel/classfile/Annotations.java | 72 ++++----- 2 files changed, 105 insertions(+), 114 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index b955fbc4..5956a90d 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -29,124 +29,129 @@ import org.apache.bcel.Constants; * represents one annotation in the annotation table * * @version $Id: AnnotationEntry - * @author D. Brosius + * @author D. Brosius * @since 5.3 */ public class AnnotationEntry implements Node, Constants, Serializable { - private int type_index; - private int num_element_value_pairs; + private static final long serialVersionUID = 1L; + + private final int type_index; + private final ConstantPool constant_pool; + private final boolean isRuntimeVisible; + private List element_value_pairs; - private ConstantPool constant_pool; - private boolean isRuntimeVisible; + /** + * Factory method to create an AnnotionEntry from a DataInputStream + * + * @param file + * @param constant_pool + * @param isRuntimeVisible + * @return + * @throws IOException + */ + public static AnnotationEntry read(DataInputStream file, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { + + final AnnotationEntry annotationEntry = new AnnotationEntry(file.readUnsignedShort(), constant_pool, isRuntimeVisible); + final int num_element_value_pairs = (file.readUnsignedShort()); + annotationEntry.element_value_pairs = new ArrayList(); + for (int i = 0; i < num_element_value_pairs; i++) { + annotationEntry.element_value_pairs.add(new ElementValuePair(file.readUnsignedShort(), ElementValue.readElementValue(file, constant_pool), + constant_pool)); + } + return annotationEntry; + } /** * Construct object from file stream. + * * @param file Input stream */ public AnnotationEntry(int type_index, ConstantPool constant_pool, boolean isRuntimeVisible) { this.type_index = type_index; - this.constant_pool = constant_pool; this.isRuntimeVisible = isRuntimeVisible; } - - public static AnnotationEntry read(DataInputStream file, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException - { - AnnotationEntry annotationEntry = new AnnotationEntry(file.readUnsignedShort(), constant_pool, isRuntimeVisible); - annotationEntry.num_element_value_pairs = (file.readUnsignedShort()); - annotationEntry.element_value_pairs = new ArrayList(); - for (int i = 0; i < annotationEntry.num_element_value_pairs; i++) { - annotationEntry.element_value_pairs.add(new ElementValuePair(file.readUnsignedShort(), ElementValue.readElementValue(file, constant_pool), constant_pool)); - } - return annotationEntry; + + public int getTypeIndex() { + return type_index; } + public ConstantPool getConstantPool() { + return constant_pool; + } + + public boolean isRuntimeVisible() { + return isRuntimeVisible; + } /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * + * Called by objects that are traversing the nodes of the tree implicitely defined by the contents of a Java class. + * I.e., the hierarchy of methods, fields, attributes, etc. spawns a tree of objects. + * * @param v Visitor object */ - public void accept( Visitor v ) { - // v.visitAnnotationEntry(this); + public void accept(Visitor v) { + // v.visitAnnotationEntry(this); } - /** * @return the annotation type name */ public String getAnnotationType() { - ConstantUtf8 c; - c = (ConstantUtf8) constant_pool.getConstant(type_index, CONSTANT_Utf8); + final ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(type_index, CONSTANT_Utf8); return c.getBytes(); } - + /** * @return the annotation type index */ - public int getAnnotationTypeIndex() - { - return type_index; + public int getAnnotationTypeIndex() { + return type_index; } - /** * @return the number of element value pairs in this annotation entry */ public final int getNumElementValuePairs() { - return num_element_value_pairs; + return element_value_pairs.size(); } - /** * @return the element value pairs in this annotation entry */ public ElementValuePair[] getElementValuePairs() { - // TOFO return List + // TODO return List return (ElementValuePair[]) element_value_pairs.toArray(new ElementValuePair[element_value_pairs.size()]); } + public void dump(DataOutputStream dos) throws IOException { + dos.writeShort(type_index); // u2 index of type name in cpool + dos.writeShort(element_value_pairs.size()); // u2 element_value pair + // count + for (int i = 0; i < element_value_pairs.size(); i++) { + final ElementValuePair envp = (ElementValuePair) element_value_pairs.get(i); + envp.dump(dos); + } + } + + public void addElementNameValuePair(ElementValuePair elementNameValuePair) { + element_value_pairs.add(elementNameValuePair); + } - public void dump(DataOutputStream dos) throws IOException - { - dos.writeShort(type_index); // u2 index of type name in cpool - dos.writeShort(element_value_pairs.size()); // u2 element_value pair count - for (int i = 0 ; i 0) - { - result.append("("); - for (int i = 0; i < getElementValuePairs().length; i++) - { - ElementValuePair element = getElementValuePairs()[i]; - result.append(element.toShortString()); - } - result.append(")"); - } - return result.toString(); - } + public String toShortString() { + final StringBuffer result = new StringBuffer(); + result.append("@"); + result.append(getAnnotationType()); + if (getElementValuePairs().length > 0) { + result.append("("); + for (int i = 0; i < getElementValuePairs().length; i++) { + final ElementValuePair element = getElementValuePairs()[i]; + result.append(element.toShortString()); + } + result.append(")"); + } + return result.toString(); + } } diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index 10bb2794..a2a62053 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -24,15 +24,15 @@ import java.io.IOException; * base class for annotations * * @version $Id: Annotations - * @author D. Brosius + * @author D. Brosius * @since 5.3 */ public abstract class Annotations extends Attribute { - private int annotation_table_length; - private AnnotationEntry[] annotation_table; // Table of annotations - private boolean isRuntimeVisible; + private static final long serialVersionUID = 1L; + private AnnotationEntry[] annotation_table; + private final boolean isRuntimeVisible; /** * @param annotation_type the subclass type of the annotation @@ -41,17 +41,15 @@ public abstract class Annotations extends Attribute { * @param file Input stream * @param constant_pool Array of constants */ - public Annotations(byte annotation_type, int name_index, int length, DataInputStream file, - ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { + public Annotations(byte annotation_type, int name_index, int length, DataInputStream file, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool, isRuntimeVisible); - annotation_table_length = (file.readUnsignedShort()); + final int annotation_table_length = (file.readUnsignedShort()); annotation_table = new AnnotationEntry[annotation_table_length]; for (int i = 0; i < annotation_table_length; i++) { annotation_table[i] = AnnotationEntry.read(file, constant_pool, isRuntimeVisible); } } - /** * @param annotation_type the subclass type of the annotation * @param name_index Index pointing to the name Code @@ -59,45 +57,29 @@ public abstract class Annotations extends Attribute { * @param annotation_table the actual annotations * @param constant_pool Array of constants */ - public Annotations(byte annotation_type, int name_index, int length, - AnnotationEntry[] annotation_table, ConstantPool constant_pool , boolean isRuntimeVisible) { + public Annotations(byte annotation_type, int name_index, int length, AnnotationEntry[] annotation_table, ConstantPool constant_pool, boolean isRuntimeVisible) { super(annotation_type, name_index, length, constant_pool); setAnnotationTable(annotation_table); this.isRuntimeVisible = isRuntimeVisible; } - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * + * Called by objects that are traversing the nodes of the tree implicitely defined by the contents of a Java class. + * I.e., the hierarchy of methods, fields, attributes, etc. spawns a tree of objects. + * * @param v Visitor object */ - public void accept( Visitor v ) { + public void accept(Visitor v) { v.visitAnnotation(this); } - /** * @param annotation_table the entries to set in this annotation */ - public final void setAnnotationTable( AnnotationEntry[] annotation_table ) { + public final void setAnnotationTable(AnnotationEntry[] annotation_table) { this.annotation_table = annotation_table; - annotation_table_length = (annotation_table == null) ? 0 : annotation_table.length; } - - // TODO: update method names - /** - * @return the annotation entry table - */ - /* - public final AnnotationEntry[] getAnnotationTable() { - return annotation_table; - }*/ - - /** * returns the array of annotation entries in this annotation */ @@ -105,23 +87,27 @@ public abstract class Annotations extends Attribute { return annotation_table; } - /** * @return the number of annotation entries in this annotation */ public final int getNumAnnotations() { - return annotation_table_length; + if (annotation_table == null) { + return 0; + } + return annotation_table.length; + } + + public boolean isRuntimeVisible() { + return isRuntimeVisible; } - - public boolean isRuntimeVisible() - { - return isRuntimeVisible; + + protected void writeAnnotations(DataOutputStream dos) throws IOException { + if (annotation_table == null) { + return; + } + dos.writeShort(annotation_table.length); + for (int i = 0; i < annotation_table.length; i++) { + annotation_table[i].dump(dos); + } } - - protected void writeAnnotations(DataOutputStream dos) throws IOException - { - dos.writeShort(annotation_table_length); - for (int i = 0; i < annotation_table_length; i++) - annotation_table[i].dump(dos); - } } -- GitLab From ca29e258b9d9f824ffc3fdda728303cb55b386a2 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 10 Jan 2010 20:06:47 +0000 Subject: [PATCH 0427/1313] hierarchical ClassPath support https://issues.apache.org/bugzilla/show_bug.cgi?id=38426 git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897695 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/util/ClassPath.java | 42 +++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 9e0d511c..7c026e63 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -47,7 +47,12 @@ public class ClassPath implements Serializable { public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(); private PathEntry[] paths; private String class_path; + private ClassPath parent; + public ClassPath(ClassPath parent, String class_path) { + this(class_path); + this.parent = parent; + } /** * Search for classes in given path. @@ -90,18 +95,24 @@ public class ClassPath implements Serializable { /** @return used class path string */ public String toString() { + if (parent != null) { + return parent.toString() + File.pathSeparator + class_path; + } return class_path; } - public int hashCode() { + if (parent != null) { + return class_path.hashCode() + parent.hashCode(); + } return class_path.hashCode(); } public boolean equals( Object o ) { if (o instanceof ClassPath) { - return class_path.equals(((ClassPath) o).class_path); + ClassPath cp = (ClassPath)o; + return class_path.toString().equals(cp.toString()); } return false; } @@ -240,14 +251,37 @@ public class ClassPath implements Serializable { */ public ClassFile getClassFile( String name, String suffix ) throws IOException { for (int i = 0; i < paths.length; i++) { - ClassFile cf; - if ((cf = paths[i].getClassFile(name, suffix)) != null) { + ClassFile cf = null; + + if(parent != null) { + cf = parent.getClassFileInternal(name, suffix); + } + + if(cf == null) { + cf = getClassFileInternal(name,suffix); + } + + if(cf != null) { return cf; } } + throw new IOException("Couldn't find: " + name + suffix); } + private ClassFile getClassFileInternal(String name, String suffix) throws IOException { + + for(int i=0; i < paths.length; i++) { + ClassFile cf = paths[i].getClassFile(name, suffix); + + if(cf != null) { + return cf; + } + } + + return null; + } + /** * @param name fully qualified class name, e.g. java.lang.String -- GitLab From eed510642f30f119a86d27dcbb829f02823ffa2e Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 10 Jan 2010 20:11:08 +0000 Subject: [PATCH 0428/1313] https://issues.apache.org/bugzilla/show_bug.cgi?id=47249 fixed a possible NPE git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897697 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ClassParser.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 7b9c00fa..3fe61ed8 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -120,6 +120,11 @@ public final class ClassParser { if (is_zip) { zip = new ZipFile(zip_file); ZipEntry entry = zip.getEntry(file_name); + + if (entry == null) { + throw new IOException("File " + file_name + " not found"); + } + file = new DataInputStream(new BufferedInputStream(zip.getInputStream(entry), BUFSIZE)); } else { -- GitLab From 06029cea8718a42b4968b33ddf092b4e7c6a1e21 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 10 Jan 2010 20:18:11 +0000 Subject: [PATCH 0429/1313] https://issues.apache.org/bugzilla/show_bug.cgi?id=47902 by Enrico Gueli fixed Class constant type for LDC and LDC_W git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897698 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/structurals/ExecutionVisitor.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index 7ac280be..2a605d44 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -19,6 +19,7 @@ package org.apache.bcel.verifier.structurals; import org.apache.bcel.Constants; import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; import org.apache.bcel.classfile.ConstantDouble; import org.apache.bcel.classfile.ConstantFloat; import org.apache.bcel.classfile.ConstantInteger; @@ -904,6 +905,9 @@ public class ExecutionVisitor extends EmptyVisitor implements Visitor{ if (c instanceof ConstantString){ stack().push(Type.STRING); } + if (c instanceof ConstantClass){ + stack().push(Type.CLASS); + } } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ public void visitLDC_W(LDC_W o){ @@ -917,6 +921,9 @@ public class ExecutionVisitor extends EmptyVisitor implements Visitor{ if (c instanceof ConstantString){ stack().push(Type.STRING); } + if (c instanceof ConstantClass){ + stack().push(Type.CLASS); + } } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ public void visitLDC2_W(LDC2_W o){ -- GitLab From 4b7477d1bca8ab131e74818b2f37a20204ecdbcc Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 10 Jan 2010 20:21:44 +0000 Subject: [PATCH 0430/1313] https://issues.apache.org/bugzilla/show_bug.cgi?id=48279 by Enrico Gueli fixed "Invalid method signature: TT;" git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897699 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Utility.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index df679d0e..139fd1cd 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -971,6 +971,7 @@ public abstract class Utility { case 'J': return Constants.T_LONG; case 'L': + case 'T': return Constants.T_REFERENCE; case '[': return Constants.T_ARRAY; -- GitLab From 16a672d6ad9af4de41231c8f3e99d4c6e8db1a58 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 10 Jan 2010 20:32:51 +0000 Subject: [PATCH 0431/1313] https://issues.apache.org/bugzilla/show_bug.cgi?id=48280 by Enrico Gueli fixed FieldInstruction.getFieldSize() git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897701 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/generic/FieldInstruction.java | 2 +- src/main/java/org/apache/bcel/generic/Type.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/FieldInstruction.java b/src/main/java/org/apache/bcel/generic/FieldInstruction.java index ad7cf873..f6e9344f 100644 --- a/src/main/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/main/java/org/apache/bcel/generic/FieldInstruction.java @@ -54,7 +54,7 @@ public abstract class FieldInstruction extends FieldOrMethod implements TypedIns /** @return size of field (1 or 2) */ protected int getFieldSize( ConstantPoolGen cpg ) { - return Type.getTypeSize(getSignature(cpg)); + return Type.size(Type.getTypeSize(getSignature(cpg))); } diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index aac50621..cb7e5603 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -18,6 +18,7 @@ package org.apache.bcel.generic; import java.util.ArrayList; import java.util.List; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.ClassFormatException; import org.apache.bcel.classfile.Utility; @@ -308,15 +309,15 @@ public abstract class Type implements java.io.Serializable { return sb.toString(); } - private static int size(int coded) { + static int size(int coded) { return coded & 3; } - private static int consumed(int coded) { + static int consumed(int coded) { return coded >> 2; } - private static int encode(int size, int consumed) { + static int encode(int size, int consumed) { return consumed << 2 | size; } -- GitLab From a9c1ac31b577159d5bc1f8a425365b51364145bd Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 10 Jan 2010 20:41:44 +0000 Subject: [PATCH 0432/1313] https://issues.apache.org/bugzilla/show_bug.cgi?id=47073 by Mattias Ulbrich fixed dump of StackMapTable git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897702 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/StackMapTableEntry.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index bfa79982..307c866c 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -114,17 +114,19 @@ public final class StackMapTableEntry implements Cloneable { */ public final void dump( DataOutputStream file ) throws IOException { file.write(frame_type); - if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { - types_of_stack_items[0].dump(file); + if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { + // nothing to be done + } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { + types_of_stack_items[0].dump(file); } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { - file.write(byte_code_offset_delta); + file.writeShort(byte_code_offset_delta); types_of_stack_items[0].dump(file); } else if (frame_type >= Constants.CHOP_FRAME && frame_type <= Constants.CHOP_FRAME_MAX) { - file.write(byte_code_offset_delta); + file.writeShort(byte_code_offset_delta); } else if (frame_type == Constants.SAME_FRAME_EXTENDED) { - file.write(byte_code_offset_delta); + file.writeShort(byte_code_offset_delta); } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { - file.write(byte_code_offset_delta); + file.writeShort(byte_code_offset_delta); for (int i = 0; i < number_of_locals; i++) { types_of_locals[i].dump(file); } -- GitLab From e312a01c5385527eb8fe94db28c469207483b5c6 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 10 Jan 2010 20:48:00 +0000 Subject: [PATCH 0433/1313] https://issues.apache.org/bugzilla/show_bug.cgi?id=47072 by Mattias Ulbrich fixed dump of ParameterAnnotations git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897703 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/ParameterAnnotationEntry.java | 9 +++++++++ .../apache/bcel/classfile/ParameterAnnotations.java | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index 0371af06..5599f2fc 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -17,6 +17,7 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -74,4 +75,12 @@ public class ParameterAnnotationEntry implements Node, Constants { public AnnotationEntry[] getAnnotationEntries() { return annotation_table; } + + public void dump(DataOutputStream dos) throws IOException { + dos.writeShort(annotation_table_length); + for(int i = 0; i < annotation_table_length; i++) { + annotation_table[i].dump(dos); + } + } } + diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index 9f93f666..88de184c 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -17,6 +17,7 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.IOException; /** @@ -111,4 +112,15 @@ public abstract class ParameterAnnotations extends Attribute { public final int getNumParameterAnnotation() { return num_parameters; } + + public void dump(DataOutputStream dos) throws IOException + { + super.dump(dos); + dos.writeByte(parameter_annotation_table.length); + + for (int i = 0; i < parameter_annotation_table.length; i++) { + parameter_annotation_table[i].dump(dos); + } + + } } -- GitLab From 463cda7c609806662008df09f6bbd2fbbf7d13f7 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 10 Jan 2010 21:22:16 +0000 Subject: [PATCH 0434/1313] https://issues.apache.org/bugzilla/show_bug.cgi?id=45230 by Timothy Alper fixed alignment of operands git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897708 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/GOTO.java | 3 ++- src/main/java/org/apache/bcel/generic/JSR.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/GOTO.java b/src/main/java/org/apache/bcel/generic/GOTO.java index c4e54676..200ecfef 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO.java +++ b/src/main/java/org/apache/bcel/generic/GOTO.java @@ -64,8 +64,9 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { position += offset; // Position may be shifted by preceding expansions if (Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) opcode = org.apache.bcel.Constants.GOTO_W; + short old_length = length; length = 5; - return 2; // 5 - 3 + return length - old_length; } return 0; } diff --git a/src/main/java/org/apache/bcel/generic/JSR.java b/src/main/java/org/apache/bcel/generic/JSR.java index 6c30feae..bdfa0ca7 100644 --- a/src/main/java/org/apache/bcel/generic/JSR.java +++ b/src/main/java/org/apache/bcel/generic/JSR.java @@ -61,8 +61,9 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { position += offset; // Position may be shifted by preceding expansions if (Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) opcode = org.apache.bcel.Constants.JSR_W; + short old_length = length; length = 5; - return 2; // 5 - 3 + return length - old_length; } return 0; } -- GitLab From f95b625f3df9c3eb8275348f8b4eb4ce335b15b5 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Sun, 10 Jan 2010 21:27:48 +0000 Subject: [PATCH 0435/1313] https://issues.apache.org/bugzilla/show_bug.cgi?id=44876 by Timothy Alper fixed out of bounds exception git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897709 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/TABLESWITCH.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java index 40756b2e..0ce9e4d1 100644 --- a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java @@ -80,10 +80,8 @@ public class TABLESWITCH extends Select { match = new int[match_length]; indices = new int[match_length]; targets = new InstructionHandle[match_length]; - for (int i = low; i <= high; i++) { - match[i - low] = i; - } for (int i = 0; i < match_length; i++) { + match[i] = low + i; indices[i] = bytes.readInt(); } } -- GitLab From 6f69e9b2ee4791530aa71257c3dba45d13b1321b Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 10 Jan 2010 21:38:02 +0000 Subject: [PATCH 0436/1313] add some javadoc git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897710 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Utility.java | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 139fd1cd..e0ad46af 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -35,6 +35,7 @@ import java.util.List; import java.util.Locale; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; + import org.apache.bcel.Constants; import org.apache.bcel.generic.AnnotationEntryGen; import org.apache.bcel.generic.ConstantPoolGen; @@ -123,6 +124,8 @@ public abstract class Utility { /** + * @param access_flags the class flags + * * @return "class" or "interface", depending on the ACC_INTERFACE flag */ public static final String classOrInterface( int access_flags ) { @@ -182,6 +185,8 @@ public abstract class Utility { * @param constant_pool Array of constants * @param verbose be verbose, e.g. print constant pool index * @return String representation of byte code + * + * @throws IOException if a failure from reading from the bytes argument occurs */ public static final String codeToString( ByteSequence bytes, ConstantPool constant_pool, boolean verbose ) throws IOException { @@ -516,6 +521,8 @@ public abstract class Utility { * @param ret Return type of method * @param argv Types of method arguments * @return Byte code representation of method signature + * + * @throws ClassFormatException if the signature is for Void */ public final static String methodTypeToSignature( String ret, String[] argv ) throws ClassFormatException { @@ -649,6 +656,8 @@ public abstract class Utility { * @param signature Method signature * @param name Method name * @param access Method access rights + * @param chopit + * @param vars * @return Java type declaration * @throws ClassFormatException */ @@ -715,7 +724,7 @@ public abstract class Utility { public static final String replace( String str, String old, String new_ ) { int index, old_index; try { - if ((index = str.indexOf(old)) != -1) { // `old' found in str + if (str.indexOf(old) != -1) { // `old' found in str StringBuffer buf = new StringBuffer(); old_index = 0; // String start offset // While we have something to replace @@ -933,6 +942,8 @@ public abstract class Utility { * @param signature in format described above * @return type of method signature * @see Constants + * + * @throws ClassFormatException if signature is not a method signature */ public static final byte typeOfMethodSignature( String signature ) throws ClassFormatException { int index; @@ -954,6 +965,8 @@ public abstract class Utility { * @param signature in format described above * @return type of signature * @see Constants + * + * @throws ClassFormatException if signature isn't a known type */ public static final byte typeOfSignature( String signature ) throws ClassFormatException { try { @@ -1012,9 +1025,11 @@ public abstract class Utility { } - /** Convert bytes into hexidecimal string + /** Convert bytes into hexadecimal string * - * @return bytes as hexidecimal string, e.g. 00 FA 12 ... + * @param bytes an array of bytes to convert to hexadecimal + * + * @return bytes as hexadecimal string, e.g. 00 FA 12 ... */ public static final String toHexString( byte[] bytes ) { StringBuffer buf = new StringBuffer(); @@ -1130,7 +1145,10 @@ public abstract class Utility { } - /** @return true, if character is one of (a, ... z, A, ... Z, 0, ... 9, _) + /** + * @param ch the character to test if it's part of an identifier + * + * @return true, if character is one of (a, ... z, A, ... Z, 0, ... 9, _) */ public static boolean isJavaIdentifierPart( char ch ) { return ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) @@ -1153,6 +1171,8 @@ public abstract class Utility { * * @param bytes the byte array to convert * @param compress use gzip to minimize string + * + * @throws IOException if there's a gzip exception */ public static String encode( byte[] bytes, boolean compress ) throws IOException { if (compress) { @@ -1177,6 +1197,8 @@ public abstract class Utility { * * @param s the string to convert * @param uncompress use gzip to uncompress the stream of bytes + * + * @throws IOException if there's a gzip exception */ public static byte[] decode( String s, boolean uncompress ) throws IOException { char[] chars = s.toCharArray(); -- GitLab From 24fcb8c3486f888ad90571b570676b4fbcd2364c Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 10 Jan 2010 21:39:38 +0000 Subject: [PATCH 0437/1313] no need to call toString on a string git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@897711 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/ClassPath.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 7c026e63..1e934e9f 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -56,6 +56,8 @@ public class ClassPath implements Serializable { /** * Search for classes in given path. + * + * @param class_path */ public ClassPath(String class_path) { this.class_path = class_path; @@ -112,7 +114,7 @@ public class ClassPath implements Serializable { public boolean equals( Object o ) { if (o instanceof ClassPath) { ClassPath cp = (ClassPath)o; - return class_path.toString().equals(cp.toString()); + return class_path.equals(cp.toString()); } return false; } -- GitLab From 1ac197fed846621f620d3bccfbdc599bdb62c83a Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Fri, 5 Mar 2010 09:12:23 +0000 Subject: [PATCH 0438/1313] Add some missing AL2 headers detected when RAT was run against Tomcat 7's repackaged copy of BCEL. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@919342 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AnnotationElementValue.java | 16 ++++++++++++++++ .../apache/bcel/classfile/ArrayElementValue.java | 16 ++++++++++++++++ .../apache/bcel/classfile/ClassElementValue.java | 16 ++++++++++++++++ .../apache/bcel/classfile/EnumElementValue.java | 16 ++++++++++++++++ .../java/org/apache/bcel/classfile/package.html | 16 ++++++++++++++++ .../java/org/apache/bcel/generic/package.html | 16 ++++++++++++++++ src/main/java/org/apache/bcel/package.html | 16 ++++++++++++++++ src/main/java/org/apache/bcel/util/package.html | 16 ++++++++++++++++ .../java/org/apache/bcel/verifier/package.html | 16 ++++++++++++++++ 9 files changed, 144 insertions(+) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java index 044540d4..16ea29fb 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.classfile; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java index 279a9ac3..e89241ed 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.classfile; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java index ffc999d0..e95e0606 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.classfile; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java index bc80a9c3..10fcae94 100644 --- a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java @@ -1,3 +1,19 @@ +/* + * Copyright 2000-2009 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.classfile; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/package.html b/src/main/java/org/apache/bcel/classfile/package.html index 2bf7c28c..e82c2d95 100644 --- a/src/main/java/org/apache/bcel/classfile/package.html +++ b/src/main/java/org/apache/bcel/classfile/package.html @@ -1,3 +1,19 @@ + diff --git a/src/main/java/org/apache/bcel/generic/package.html b/src/main/java/org/apache/bcel/generic/package.html index 2ae21266..71683c2b 100644 --- a/src/main/java/org/apache/bcel/generic/package.html +++ b/src/main/java/org/apache/bcel/generic/package.html @@ -1,3 +1,19 @@ + diff --git a/src/main/java/org/apache/bcel/package.html b/src/main/java/org/apache/bcel/package.html index 773bac10..41261d6c 100644 --- a/src/main/java/org/apache/bcel/package.html +++ b/src/main/java/org/apache/bcel/package.html @@ -1,3 +1,19 @@ + diff --git a/src/main/java/org/apache/bcel/util/package.html b/src/main/java/org/apache/bcel/util/package.html index abef411d..01618ecc 100644 --- a/src/main/java/org/apache/bcel/util/package.html +++ b/src/main/java/org/apache/bcel/util/package.html @@ -1,3 +1,19 @@ + diff --git a/src/main/java/org/apache/bcel/verifier/package.html b/src/main/java/org/apache/bcel/verifier/package.html index 79cc44e1..bc83e193 100644 --- a/src/main/java/org/apache/bcel/verifier/package.html +++ b/src/main/java/org/apache/bcel/verifier/package.html @@ -1,3 +1,19 @@ + -- GitLab From 115499dd09fb182589c16521761bdc84ded4fd5d Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 6 May 2010 16:43:17 +0000 Subject: [PATCH 0439/1313] Apply patch from Bug 49259 to relicense two files to Apache 2.0 from IBM as provided from GSOC student. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@941798 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/EnclosingMethod.java | 32 +++++++++++-------- .../classfile/LocalVariableTypeTable.java | 32 ++++++++++--------- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java index 64283ea9..2d7eddff 100755 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -1,18 +1,22 @@ -/* ******************************************************************* - * Copyright (c) 2004 IBM Corporation - * - * All rights reserved. - * This program and the accompanying materials are made available - * under the terms of the Common Public License v1.0 - * which accompanies this distribution and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * Andy Clement initial implementation - * ******************************************************************/ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.bcel.classfile; -import java.io.DataInput; +import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -39,7 +43,7 @@ public class EnclosingMethod extends Attribute { private int methodIndex; // Ctors - and code to read an attribute in. - public EnclosingMethod(int nameIndex, int len, DataInput dis, ConstantPool cpool) throws IOException { + public EnclosingMethod(int nameIndex, int len, DataInputStream dis, ConstantPool cpool) throws IOException { this(nameIndex, len, dis.readUnsignedShort(), dis.readUnsignedShort(), cpool); } diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index e073654e..73938827 100755 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -1,19 +1,21 @@ -/* ******************************************************************* - * Copyright (c) 2004 IBM Corporation - * - * All rights reserved. - * This program and the accompanying materials are made available - * under the terms of the Common Public License v1.0 - * which accompanies this distribution and is available at - * http://www.eclipse.org/legal/cpl-v10.html - * - * Contributors: - * Andy Clement initial implementation - * Heavily based on LocalVariableTable - * ******************************************************************/ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.bcel.classfile; - import org.apache.bcel.Constants; import java.io.*; @@ -106,7 +108,7 @@ public class LocalVariableTypeTable extends Attribute { * @return String representation. */ public final String toString() { - StringBuffer buf = new StringBuffer(); + StringBuffer buf = new StringBuffer(""); for(int i=0; i < local_variable_type_table_length; i++) { buf.append(local_variable_type_table[i].toString()); -- GitLab From 6f58a5933e665d77b87eb60b16e2acba1971a23d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 24 May 2010 15:22:39 +0000 Subject: [PATCH 0440/1313] Add SVN tag markers git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947667 13f79535-47bb-0310-9956-ffa450edef68 -- GitLab From dcc2927a2579f095657c16760c18c3219201e23b Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 24 May 2010 15:25:19 +0000 Subject: [PATCH 0441/1313] Fix up incorrect SVN properties git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947668 13f79535-47bb-0310-9956-ffa450edef68 --- NOTICE.txt | 0 docs/verifier/VerificationAPI.bmp | Bin docs/verifier/VerificationAPI.eps | 0 docs/verifier/chap1.bmp | Bin docs/verifier/chap1.eps | 0 docs/verifier/conventcfg.bmp | Bin docs/verifier/conventcfg.eps | 0 docs/verifier/exframe.bmp | Bin docs/verifier/exframe.eps | 0 docs/verifier/justicecfg.bmp | Bin docs/verifier/justicecfg.eps | 0 pom.xml | 0 .../bcel/classfile/EnclosingMethod.java | 0 .../classfile/LocalVariableTypeTable.java | 0 .../bcel/generic/AnnotationEntryGen.java | 0 .../bcel/generic/ElementValuePairGen.java | 0 .../bcel/AbstractCounterVisitorTestCase.java | 0 .../apache/bcel/CounterVisitorTestCase.java | 0 .../bcel/InstructionFinderTestCase.java | 92 +++++++++--------- .../java/org/apache/bcel/data/MarkedType.java | 0 .../apache/bcel/data/MarkerAnnotation.java | 0 .../bcel/data/MarkerAnnotationInvisible.java | 0 .../apache/bcel/data/SimpleAnnotation.java | 0 .../bcel/util/InstructionFinderTest.java | 56 +++++------ .../apache/bcel/visitors/CounterVisitor.java | 0 25 files changed, 74 insertions(+), 74 deletions(-) mode change 100755 => 100644 NOTICE.txt mode change 100755 => 100644 docs/verifier/VerificationAPI.bmp mode change 100755 => 100644 docs/verifier/VerificationAPI.eps mode change 100755 => 100644 docs/verifier/chap1.bmp mode change 100755 => 100644 docs/verifier/chap1.eps mode change 100755 => 100644 docs/verifier/conventcfg.bmp mode change 100755 => 100644 docs/verifier/conventcfg.eps mode change 100755 => 100644 docs/verifier/exframe.bmp mode change 100755 => 100644 docs/verifier/exframe.eps mode change 100755 => 100644 docs/verifier/justicecfg.bmp mode change 100755 => 100644 docs/verifier/justicecfg.eps mode change 100755 => 100644 pom.xml mode change 100755 => 100644 src/main/java/org/apache/bcel/classfile/EnclosingMethod.java mode change 100755 => 100644 src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java mode change 100755 => 100644 src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java mode change 100755 => 100644 src/main/java/org/apache/bcel/generic/ElementValuePairGen.java mode change 100755 => 100644 src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java mode change 100755 => 100644 src/test/java/org/apache/bcel/CounterVisitorTestCase.java mode change 100755 => 100644 src/test/java/org/apache/bcel/data/MarkedType.java mode change 100755 => 100644 src/test/java/org/apache/bcel/data/MarkerAnnotation.java mode change 100755 => 100644 src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java mode change 100755 => 100644 src/test/java/org/apache/bcel/data/SimpleAnnotation.java mode change 100755 => 100644 src/test/java/org/apache/bcel/visitors/CounterVisitor.java diff --git a/NOTICE.txt b/NOTICE.txt old mode 100755 new mode 100644 diff --git a/docs/verifier/VerificationAPI.bmp b/docs/verifier/VerificationAPI.bmp old mode 100755 new mode 100644 diff --git a/docs/verifier/VerificationAPI.eps b/docs/verifier/VerificationAPI.eps old mode 100755 new mode 100644 diff --git a/docs/verifier/chap1.bmp b/docs/verifier/chap1.bmp old mode 100755 new mode 100644 diff --git a/docs/verifier/chap1.eps b/docs/verifier/chap1.eps old mode 100755 new mode 100644 diff --git a/docs/verifier/conventcfg.bmp b/docs/verifier/conventcfg.bmp old mode 100755 new mode 100644 diff --git a/docs/verifier/conventcfg.eps b/docs/verifier/conventcfg.eps old mode 100755 new mode 100644 diff --git a/docs/verifier/exframe.bmp b/docs/verifier/exframe.bmp old mode 100755 new mode 100644 diff --git a/docs/verifier/exframe.eps b/docs/verifier/exframe.eps old mode 100755 new mode 100644 diff --git a/docs/verifier/justicecfg.bmp b/docs/verifier/justicecfg.bmp old mode 100755 new mode 100644 diff --git a/docs/verifier/justicecfg.eps b/docs/verifier/justicecfg.eps old mode 100755 new mode 100644 diff --git a/pom.xml b/pom.xml old mode 100755 new mode 100644 diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java old mode 100755 new mode 100644 diff --git a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java old mode 100755 new mode 100644 diff --git a/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java old mode 100755 new mode 100644 diff --git a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java old mode 100755 new mode 100644 diff --git a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java index b87f87c6..40e293ee 100644 --- a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java +++ b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java @@ -1,46 +1,46 @@ -package org.apache.bcel; - -import java.util.Iterator; - -import org.apache.bcel.AbstractTestCase; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.util.InstructionFinder; -import org.apache.bcel.util.InstructionFinder.CodeConstraint; - -public class InstructionFinderTestCase extends AbstractTestCase -{ - public void testSearchAll() throws Exception - { - JavaClass clazz = getTestClass("org.apache.bcel.util.InstructionFinder"); - Method[] methods = clazz.getMethods(); - Method searchM = null; - for (Method m : methods) - { - if (m.getName().equals("search") && (m.getArgumentTypes().length == 3)) - { - searchM = m; - break; - } - } - - if (searchM == null) - throw new Exception("search method not found"); - - byte[] bytes = searchM.getCode().getCode(); - InstructionList il = new InstructionList(bytes); - InstructionFinder finder = new InstructionFinder(il); - Iterator it = finder.search(".*", il.getStart(), null); - - InstructionHandle[] ihs = (InstructionHandle[])it.next(); - int size = 0; - for (InstructionHandle ih : ihs) - { - size += ih.getInstruction().getLength(); - } - assertEquals(bytes.length, size); - - } -} +package org.apache.bcel; + +import java.util.Iterator; + +import org.apache.bcel.AbstractTestCase; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.util.InstructionFinder; +import org.apache.bcel.util.InstructionFinder.CodeConstraint; + +public class InstructionFinderTestCase extends AbstractTestCase +{ + public void testSearchAll() throws Exception + { + JavaClass clazz = getTestClass("org.apache.bcel.util.InstructionFinder"); + Method[] methods = clazz.getMethods(); + Method searchM = null; + for (Method m : methods) + { + if (m.getName().equals("search") && (m.getArgumentTypes().length == 3)) + { + searchM = m; + break; + } + } + + if (searchM == null) + throw new Exception("search method not found"); + + byte[] bytes = searchM.getCode().getCode(); + InstructionList il = new InstructionList(bytes); + InstructionFinder finder = new InstructionFinder(il); + Iterator it = finder.search(".*", il.getStart(), null); + + InstructionHandle[] ihs = (InstructionHandle[])it.next(); + int size = 0; + for (InstructionHandle ih : ihs) + { + size += ih.getInstruction().getLength(); + } + assertEquals(bytes.length, size); + + } +} diff --git a/src/test/java/org/apache/bcel/data/MarkedType.java b/src/test/java/org/apache/bcel/data/MarkedType.java old mode 100755 new mode 100644 diff --git a/src/test/java/org/apache/bcel/data/MarkerAnnotation.java b/src/test/java/org/apache/bcel/data/MarkerAnnotation.java old mode 100755 new mode 100644 diff --git a/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java b/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java old mode 100755 new mode 100644 diff --git a/src/test/java/org/apache/bcel/data/SimpleAnnotation.java b/src/test/java/org/apache/bcel/data/SimpleAnnotation.java old mode 100755 new mode 100644 diff --git a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java index 53b648a3..0a70957d 100644 --- a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java +++ b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java @@ -1,28 +1,28 @@ -package org.apache.bcel.util; - -import java.util.Iterator; - -import org.apache.bcel.AbstractTestCase; -import org.apache.bcel.generic.IADD; -import org.apache.bcel.generic.ILOAD; -import org.apache.bcel.generic.ISTORE; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; - -public class InstructionFinderTest extends AbstractTestCase { - - public void testSearch() { - InstructionList il = new InstructionList(); - il.append(new ILOAD(1)); - il.append(new ILOAD(2)); - il.append(new IADD()); - il.append(new ISTORE(3)); - InstructionFinder finder = new InstructionFinder(il); - - Iterator it = finder.search("ILOAD IADD", il.getInstructionHandles()[0], null ); - InstructionHandle[] ihs = (InstructionHandle[])it.next(); - assertEquals(2, ihs.length); - assertEquals(ihs[0].getInstruction(), new ILOAD(2)); - assertEquals(ihs[1].getInstruction(), new IADD()); - } -} +package org.apache.bcel.util; + +import java.util.Iterator; + +import org.apache.bcel.AbstractTestCase; +import org.apache.bcel.generic.IADD; +import org.apache.bcel.generic.ILOAD; +import org.apache.bcel.generic.ISTORE; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; + +public class InstructionFinderTest extends AbstractTestCase { + + public void testSearch() { + InstructionList il = new InstructionList(); + il.append(new ILOAD(1)); + il.append(new ILOAD(2)); + il.append(new IADD()); + il.append(new ISTORE(3)); + InstructionFinder finder = new InstructionFinder(il); + + Iterator it = finder.search("ILOAD IADD", il.getInstructionHandles()[0], null ); + InstructionHandle[] ihs = (InstructionHandle[])it.next(); + assertEquals(2, ihs.length); + assertEquals(ihs[0].getInstruction(), new ILOAD(2)); + assertEquals(ihs[1].getInstruction(), new IADD()); + } +} diff --git a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java old mode 100755 new mode 100644 -- GitLab From b18771dfe8529ac9dea72f77470d056504735feb Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 24 May 2010 23:39:48 +0000 Subject: [PATCH 0442/1313] Bug 49333 - SyntheticRepository.loadClass() fails to close the inputStream git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947862 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/util/SyntheticRepository.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index 7b12e820..d84875f6 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -182,6 +182,13 @@ public class SyntheticRepository implements Repository { } catch (IOException e) { throw new ClassNotFoundException("Exception while looking for class " + className + ": " + e.toString(), e); + } finally { + if (is != null){ + try { + is.close(); + } catch (IOException e) { + } + } } throw new ClassNotFoundException("SyntheticRepository could not load " + className); } -- GitLab From 39694e84b80295cbb1afab6855ab9331f00ce622 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 24 May 2010 23:51:17 +0000 Subject: [PATCH 0443/1313] Fix Eclipse warnings git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947865 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/GeneratingAnnotatedClassesTestCase.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java index 0466ddf9..3ea7ed99 100644 --- a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java @@ -98,7 +98,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase + as[1].getAnnotationType(), as[1].getAnnotationType() .equals("LSimpleAnnotation;")); ElementValuePair[] vals = as[0].getElementValuePairs(); - ElementValuePair nvp = (ElementValuePair) vals[0]; + ElementValuePair nvp = vals[0]; assertTrue( "Name of element in SimpleAnnotation should be 'id' but it is " + nvp.getNameString(), nvp.getNameString().equals("id")); @@ -237,7 +237,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase assertTrue("That annotation should only have one value but has " + a.getValues().size(), a.getValues().size() == 1); ElementValuePairGen nvp = (ElementValuePairGen) a.getValues().get(0); - ElementValueGen value = (ElementValueGen) nvp.getValue(); + ElementValueGen value = nvp.getValue(); assertTrue("Value should be ArrayElementValueGen but is " + value, value instanceof ArrayElementValueGen); ArrayElementValueGen arrayValue = (ArrayElementValueGen) value; @@ -269,9 +269,9 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); assertTrue("Expected one annotation but found " + annotations.length, annotations.length == 1); - List l = annotations[0].getValues(); + List l = annotations[0].getValues(); boolean found = false; - for (Iterator iter = l.iterator(); iter.hasNext();) + for (Iterator iter = l.iterator(); iter.hasNext();) { ElementValuePairGen element = (ElementValuePairGen) iter.next(); if (element.getNameString().equals("dval")) @@ -564,7 +564,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase ElementValueGen.PRIMITIVE_INT, cp, 4); ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, cp); ObjectType t = new ObjectType("SimpleAnnotation"); - List elements = new ArrayList(); + List elements = new ArrayList(); elements.add(nvGen); AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); return a; @@ -577,7 +577,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase ElementValueGen.STRING, cp, aFruit); ElementValuePairGen nvGen = new ElementValuePairGen("fruit", evg, cp); ObjectType t = new ObjectType("SimpleStringAnnotation"); - List elements = new ArrayList(); + List elements = new ArrayList(); elements.add(nvGen); return new AnnotationEntryGen(t, elements, true, cp); } @@ -589,7 +589,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase ArrayElementValueGen array = new ArrayElementValueGen(cp); array.addElement(new AnnotationElementValueGen(a, cp)); ElementValuePairGen nvp = new ElementValuePairGen("value", array, cp); - List elements = new ArrayList(); + List elements = new ArrayList(); elements.add(nvp); return new AnnotationEntryGen(new ObjectType("CombinedAnnotation"), elements, true, cp); @@ -601,7 +601,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase ElementValueGen.PRIMITIVE_INT, cp, 4); ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, cp); ObjectType t = new ObjectType("SimpleAnnotation"); - List elements = new ArrayList(); + List elements = new ArrayList(); elements.add(nvGen); AnnotationEntryGen a = new AnnotationEntryGen(t, elements, false, cp); return a; -- GitLab From 46b46b4813c88756a515d0657d540549d823c35f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 24 May 2010 23:52:57 +0000 Subject: [PATCH 0444/1313] Add missing or outdated AL headers git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947866 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/AbstractCounterVisitorTestCase.java | 18 ++++++++++ .../org/apache/bcel/AbstractTestCase.java | 18 ++++++++++ .../bcel/AnnotationAccessFlagTestCase.java | 18 ++++++++++ .../AnnotationDefaultAttributeTestCase.java | 18 ++++++++++ .../apache/bcel/AnnotationGenTestCase.java | 18 ++++++++++ .../apache/bcel/AnonymousClassTestCase.java | 18 ++++++++++ .../apache/bcel/CounterVisitorTestCase.java | 18 ++++++++++ .../apache/bcel/ElementValueGenTestCase.java | 18 ++++++++++ .../EnclosingMethodAttributeTestCase.java | 18 ++++++++++ .../apache/bcel/EnumAccessFlagTestCase.java | 18 ++++++++++ .../apache/bcel/FieldAnnotationsTestCase.java | 18 ++++++++++ .../bcel/InstructionFinderTestCase.java | 36 +++++++++++++++++++ src/test/java/org/apache/bcel/NanoTimer.java | 26 +++++++------- .../java/org/apache/bcel/PerformanceTest.java | 26 +++++++------- .../org/apache/bcel/data/AnnotatedFields.java | 18 ++++++++++ .../data/AnnotatedWithCombinedAnnotation.java | 18 ++++++++++ .../bcel/data/AnnotatedWithEnumClass.java | 18 ++++++++++ .../bcel/data/AnnotationEnumElement.java | 18 ++++++++++ .../apache/bcel/data/AnonymousClassTest.java | 20 ++++++++++- .../bcel/data/AttributeTestClassEM01.java | 18 ++++++++++ .../bcel/data/AttributeTestClassEM02.java | 18 ++++++++++ .../apache/bcel/data/CombinedAnnotation.java | 18 ++++++++++ .../bcel/data/ComplexAnnotatedClass.java | 18 ++++++++++ .../apache/bcel/data/ComplexAnnotation.java | 18 ++++++++++ .../java/org/apache/bcel/data/MarkedType.java | 18 ++++++++++ .../apache/bcel/data/MarkerAnnotation.java | 18 ++++++++++ .../bcel/data/MarkerAnnotationInvisible.java | 18 ++++++++++ .../bcel/data/SimpleAnnotatedClass.java | 18 ++++++++++ .../apache/bcel/data/SimpleAnnotation.java | 18 ++++++++++ .../org/apache/bcel/data/SimpleClass.java | 18 ++++++++++ .../java/org/apache/bcel/data/SimpleEnum.java | 18 ++++++++++ .../bcel/util/InstructionFinderTest.java | 18 ++++++++++ .../apache/bcel/visitors/CounterVisitor.java | 18 ++++++++++ 33 files changed, 605 insertions(+), 25 deletions(-) diff --git a/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java index a2f91f20..9f615e18 100644 --- a/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel; import org.apache.bcel.classfile.DescendingVisitor; diff --git a/src/test/java/org/apache/bcel/AbstractTestCase.java b/src/test/java/org/apache/bcel/AbstractTestCase.java index fd7f875f..0e27b8f8 100644 --- a/src/test/java/org/apache/bcel/AbstractTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractTestCase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel; import java.io.File; diff --git a/src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java b/src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java index e5f9c9fd..ebf01772 100644 --- a/src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java +++ b/src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel; import org.apache.bcel.classfile.JavaClass; diff --git a/src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java b/src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java index 52d9261f..19464689 100644 --- a/src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java +++ b/src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel; import org.apache.bcel.classfile.AnnotationDefault; diff --git a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java b/src/test/java/org/apache/bcel/AnnotationGenTestCase.java index f2efe85a..8960afc4 100644 --- a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/bcel/AnnotationGenTestCase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel; import java.io.ByteArrayInputStream; diff --git a/src/test/java/org/apache/bcel/AnonymousClassTestCase.java b/src/test/java/org/apache/bcel/AnonymousClassTestCase.java index b6e88457..3b88d03f 100644 --- a/src/test/java/org/apache/bcel/AnonymousClassTestCase.java +++ b/src/test/java/org/apache/bcel/AnonymousClassTestCase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel; import org.apache.bcel.classfile.JavaClass; diff --git a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java index 72f9f374..ed4e94d5 100644 --- a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java +++ b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel; import org.apache.bcel.classfile.JavaClass; diff --git a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java index 285ce195..6e4aab94 100644 --- a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java +++ b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel; import java.io.ByteArrayInputStream; diff --git a/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java b/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java index c46bdfb2..2784c1f4 100644 --- a/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java +++ b/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel; import java.io.File; diff --git a/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java b/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java index 64a758d8..e246a9d6 100644 --- a/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java +++ b/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel; import org.apache.bcel.classfile.JavaClass; diff --git a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java b/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java index 331cbb71..b5364d0f 100644 --- a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java +++ b/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel; import java.io.File; diff --git a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java index 40e293ee..f1417346 100644 --- a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java +++ b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java @@ -1,3 +1,39 @@ +/* +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel; import java.util.Iterator; diff --git a/src/test/java/org/apache/bcel/NanoTimer.java b/src/test/java/org/apache/bcel/NanoTimer.java index ef9f046c..6bd57276 100644 --- a/src/test/java/org/apache/bcel/NanoTimer.java +++ b/src/test/java/org/apache/bcel/NanoTimer.java @@ -1,19 +1,21 @@ /* - * Copyright 2000-2009 The Apache Software Foundation + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * */ + package org.apache.bcel; public class NanoTimer { diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java index bf48c91d..a63ba22a 100644 --- a/src/test/java/org/apache/bcel/PerformanceTest.java +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -1,19 +1,21 @@ /* - * Copyright 2000-2009 The Apache Software Foundation + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * http://www.apache.org/licenses/LICENSE-2.0 * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * */ + package org.apache.bcel; import java.io.ByteArrayInputStream; diff --git a/src/test/java/org/apache/bcel/data/AnnotatedFields.java b/src/test/java/org/apache/bcel/data/AnnotatedFields.java index c06fefab..76ae6bdb 100644 --- a/src/test/java/org/apache/bcel/data/AnnotatedFields.java +++ b/src/test/java/org/apache/bcel/data/AnnotatedFields.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; public class AnnotatedFields { diff --git a/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java b/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java index d2e10f00..c14afd15 100644 --- a/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java +++ b/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; @CombinedAnnotation( { @SimpleAnnotation(id = 4) }) diff --git a/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java b/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java index f3817a61..f238eb4d 100644 --- a/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java +++ b/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; @AnnotationEnumElement(enumval = SimpleEnum.Red) diff --git a/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java b/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java index 8ef6fe4e..0ed98228 100644 --- a/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java +++ b/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; import java.lang.annotation.Retention; diff --git a/src/test/java/org/apache/bcel/data/AnonymousClassTest.java b/src/test/java/org/apache/bcel/data/AnonymousClassTest.java index 10b3993a..4b6c5732 100644 --- a/src/test/java/org/apache/bcel/data/AnonymousClassTest.java +++ b/src/test/java/org/apache/bcel/data/AnonymousClassTest.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; public class AnonymousClassTest @@ -8,7 +26,7 @@ public class AnonymousClassTest { public void run() { - }; + } }.run(); } diff --git a/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java b/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java index 96b0e875..55dfd797 100644 --- a/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java +++ b/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; public class AttributeTestClassEM01 diff --git a/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java b/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java index 5a84b49b..aaa53471 100644 --- a/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java +++ b/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; public class AttributeTestClassEM02 diff --git a/src/test/java/org/apache/bcel/data/CombinedAnnotation.java b/src/test/java/org/apache/bcel/data/CombinedAnnotation.java index 6aea6bc4..d28e60ea 100644 --- a/src/test/java/org/apache/bcel/data/CombinedAnnotation.java +++ b/src/test/java/org/apache/bcel/data/CombinedAnnotation.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; import java.lang.annotation.Retention; diff --git a/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java b/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java index 3633782c..62eef117 100644 --- a/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java +++ b/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; @ComplexAnnotation(ival = 4, bval = 2, cval = '5', fval = 3.0f, dval = 33.4, zval = false, jval = 56, sval = 99) diff --git a/src/test/java/org/apache/bcel/data/ComplexAnnotation.java b/src/test/java/org/apache/bcel/data/ComplexAnnotation.java index f8629017..fafd934e 100644 --- a/src/test/java/org/apache/bcel/data/ComplexAnnotation.java +++ b/src/test/java/org/apache/bcel/data/ComplexAnnotation.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; import java.lang.annotation.Retention; diff --git a/src/test/java/org/apache/bcel/data/MarkedType.java b/src/test/java/org/apache/bcel/data/MarkedType.java index 047135de..598338c9 100644 --- a/src/test/java/org/apache/bcel/data/MarkedType.java +++ b/src/test/java/org/apache/bcel/data/MarkedType.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; @MarkerAnnotationInvisible diff --git a/src/test/java/org/apache/bcel/data/MarkerAnnotation.java b/src/test/java/org/apache/bcel/data/MarkerAnnotation.java index 69482df6..bd61f7e8 100644 --- a/src/test/java/org/apache/bcel/data/MarkerAnnotation.java +++ b/src/test/java/org/apache/bcel/data/MarkerAnnotation.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; import java.lang.annotation.*; diff --git a/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java b/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java index 46c4ba49..89b8e4b6 100644 --- a/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java +++ b/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; import java.lang.annotation.*; diff --git a/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java b/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java index 549d282d..eff28aad 100644 --- a/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java +++ b/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; @SimpleAnnotation(id = 4) diff --git a/src/test/java/org/apache/bcel/data/SimpleAnnotation.java b/src/test/java/org/apache/bcel/data/SimpleAnnotation.java index 6520eb02..6e2aa347 100644 --- a/src/test/java/org/apache/bcel/data/SimpleAnnotation.java +++ b/src/test/java/org/apache/bcel/data/SimpleAnnotation.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; import java.lang.annotation.*; diff --git a/src/test/java/org/apache/bcel/data/SimpleClass.java b/src/test/java/org/apache/bcel/data/SimpleClass.java index 9231442d..56a4486a 100644 --- a/src/test/java/org/apache/bcel/data/SimpleClass.java +++ b/src/test/java/org/apache/bcel/data/SimpleClass.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; public class SimpleClass diff --git a/src/test/java/org/apache/bcel/data/SimpleEnum.java b/src/test/java/org/apache/bcel/data/SimpleEnum.java index bf1986d3..8a5b0402 100644 --- a/src/test/java/org/apache/bcel/data/SimpleEnum.java +++ b/src/test/java/org/apache/bcel/data/SimpleEnum.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.data; public enum SimpleEnum { Red,Orange,Yellow,Green,Blue,Indigo,Violet }; diff --git a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java index 0a70957d..4f494462 100644 --- a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java +++ b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.util; import java.util.Iterator; diff --git a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java index 4becb496..f2ec4b59 100644 --- a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java +++ b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.bcel.visitors; import org.apache.bcel.classfile.AnnotationDefault; -- GitLab From 5d310176bc8257d2fe4d39feaa1e9a12cfe30626 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 25 May 2010 00:04:30 +0000 Subject: [PATCH 0445/1313] Oops - pasted twice git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947868 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/InstructionFinderTestCase.java | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java index f1417346..35eb8427 100644 --- a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java +++ b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java @@ -1,4 +1,3 @@ -/* /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with @@ -16,24 +15,6 @@ * limitations under the License. * */ - - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - package org.apache.bcel; import java.util.Iterator; @@ -44,7 +25,6 @@ import org.apache.bcel.classfile.Method; import org.apache.bcel.generic.InstructionHandle; import org.apache.bcel.generic.InstructionList; import org.apache.bcel.util.InstructionFinder; -import org.apache.bcel.util.InstructionFinder.CodeConstraint; public class InstructionFinderTestCase extends AbstractTestCase { @@ -68,7 +48,7 @@ public class InstructionFinderTestCase extends AbstractTestCase byte[] bytes = searchM.getCode().getCode(); InstructionList il = new InstructionList(bytes); InstructionFinder finder = new InstructionFinder(il); - Iterator it = finder.search(".*", il.getStart(), null); + Iterator it = finder.search(".*", il.getStart(), null); InstructionHandle[] ihs = (InstructionHandle[])it.next(); int size = 0; -- GitLab From dfe6c87fec0ec41129207819bb4b23ac9938df2f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 25 May 2010 00:08:22 +0000 Subject: [PATCH 0446/1313] Fix Eclipse warnings git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947869 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/AbstractCounterVisitorTestCase.java | 3 ++- src/test/java/org/apache/bcel/AbstractTestCase.java | 10 +++++----- .../java/org/apache/bcel/AnnotationGenTestCase.java | 8 ++++---- .../java/org/apache/bcel/CounterVisitorTestCase.java | 3 ++- .../java/org/apache/bcel/ElementValueGenTestCase.java | 4 ++-- .../java/org/apache/bcel/FieldAnnotationsTestCase.java | 7 +++---- src/test/java/org/apache/bcel/NanoTimer.java | 3 ++- src/test/java/org/apache/bcel/PerformanceTest.java | 4 +--- src/test/java/org/apache/bcel/data/SimpleEnum.java | 2 +- .../org/apache/bcel/util/InstructionFinderTest.java | 2 +- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java index 9f615e18..1ceaa5ef 100644 --- a/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java @@ -28,7 +28,8 @@ public abstract class AbstractCounterVisitorTestCase extends AbstractTestCase private CounterVisitor visitor = null; - public void setUp() throws ClassNotFoundException + @Override + public void setUp() throws ClassNotFoundException { visitor = new CounterVisitor(); new DescendingVisitor(getTestClass(), getVisitor()).visit(); diff --git a/src/test/java/org/apache/bcel/AbstractTestCase.java b/src/test/java/org/apache/bcel/AbstractTestCase.java index 0e27b8f8..c61e1f71 100644 --- a/src/test/java/org/apache/bcel/AbstractTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractTestCase.java @@ -93,7 +93,7 @@ public abstract class AbstractTestCase extends TestCase protected Attribute[] findAttribute(String name, JavaClass clazz) { Attribute[] all = clazz.getAttributes(); - List chosenAttrsList = new ArrayList(); + List chosenAttrsList = new ArrayList(); for (int i = 0; i < all.length; i++) { if (verbose) @@ -101,12 +101,12 @@ public abstract class AbstractTestCase extends TestCase if (all[i].getName().equals(name)) chosenAttrsList.add(all[i]); } - return (Attribute[]) chosenAttrsList.toArray(new Attribute[] {}); + return chosenAttrsList.toArray(new Attribute[] {}); } protected Attribute findAttribute(String name, Attribute[] all) { - List chosenAttrsList = new ArrayList(); + List chosenAttrsList = new ArrayList(); for (int i = 0; i < all.length; i++) { if (verbose) @@ -116,7 +116,7 @@ public abstract class AbstractTestCase extends TestCase } assertTrue("Should be one match: " + chosenAttrsList.size(), chosenAttrsList.size() == 1); - return (Attribute) chosenAttrsList.get(0); + return chosenAttrsList.get(0); } protected String dumpAttributes(Attribute[] as) @@ -171,7 +171,7 @@ public abstract class AbstractTestCase extends TestCase ElementValueGen.STRING, cp, aFruit); ElementValuePairGen nvGen = new ElementValuePairGen("fruit", evg, cp); ObjectType t = new ObjectType("SimpleStringAnnotation"); - List elements = new ArrayList(); + List elements = new ArrayList(); elements.add(nvGen); return new AnnotationEntryGen(t, elements, visibility, cp); } diff --git a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java b/src/test/java/org/apache/bcel/AnnotationGenTestCase.java index 8960afc4..320fb054 100644 --- a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/bcel/AnnotationGenTestCase.java @@ -66,7 +66,7 @@ public class AnnotationGenTestCase extends AbstractTestCase "Should include string 'id=4' but says: " + nvGen.toString(), nvGen.toString().indexOf("id=4") != -1); ObjectType t = new ObjectType("SimpleAnnotation"); - List elements = new ArrayList(); + List elements = new ArrayList(); elements.add(nvGen); // Build an annotation of type 'SimpleAnnotation' with 'id=4' as the // only value :) @@ -91,12 +91,12 @@ public class AnnotationGenTestCase extends AbstractTestCase "Should include string 'id=4' but says: " + nvGen.toString(), nvGen.toString().indexOf("id=4") != -1); ObjectType t = new ObjectType("SimpleAnnotation"); - List elements = new ArrayList(); + List elements = new ArrayList(); elements.add(nvGen); // Build a RV annotation of type 'SimpleAnnotation' with 'id=4' as the // only value :) AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); - Vector v = new Vector(); + Vector v = new Vector(); v.add(a); Attribute[] attributes = Utility.getAnnotationAttributes(cp, v); boolean foundRV = false; @@ -113,7 +113,7 @@ public class AnnotationGenTestCase extends AbstractTestCase // Build a RIV annotation of type 'SimpleAnnotation' with 'id=4' as the // only value :) AnnotationEntryGen a2 = new AnnotationEntryGen(t, elements, false, cp); - Vector v2 = new Vector(); + Vector v2 = new Vector(); v2.add(a2); Attribute[] attributes2 = Utility.getAnnotationAttributes(cp, v2); boolean foundRIV = false; diff --git a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java index ed4e94d5..d947e1d1 100644 --- a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java +++ b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java @@ -22,7 +22,8 @@ import org.apache.bcel.classfile.JavaClass; public class CounterVisitorTestCase extends AbstractCounterVisitorTestCase { - protected JavaClass getTestClass() throws ClassNotFoundException + @Override + protected JavaClass getTestClass() throws ClassNotFoundException { return getTestClass("org.apache.bcel.data.MarkedType"); } diff --git a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java index 6e4aab94..6565062c 100644 --- a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java +++ b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java @@ -104,10 +104,10 @@ public class ElementValueGenTestCase extends AbstractTestCase ClassGen cg = createClassGen("HelloWorld"); ConstantPoolGen cp = cg.getConstantPool(); SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_CHAR, cp, (char) 't'); + ElementValueGen.PRIMITIVE_CHAR, cp, 't'); // Creation of an element like that should leave a new entry in the // cpool - int idx = cp.lookupInteger((char) 't'); + int idx = cp.lookupInteger('t'); assertTrue("Should have the same index in the constantpool but " + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); checkSerialize(evg, cp); diff --git a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java b/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java index b5364d0f..7cc8a0af 100644 --- a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java +++ b/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java @@ -20,7 +20,6 @@ package org.apache.bcel; import java.io.File; import java.io.IOException; -import java.util.Iterator; import org.apache.bcel.classfile.Field; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.AnnotationEntry; @@ -56,7 +55,7 @@ public class FieldAnnotationsTestCase extends AbstractTestCase File tfile = createTestdataFile("AnnotatedFields.class"); clazz.dump(tfile); SyntheticRepository repos2 = createRepos("."); - JavaClass clazz2 = repos2.loadClass("AnnotatedFields"); + repos2.loadClass("AnnotatedFields"); checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); assertTrue(tfile.delete()); @@ -67,7 +66,7 @@ public class FieldAnnotationsTestCase extends AbstractTestCase * reload it and everything is correct. */ public void testFieldAnnotationModification() - throws ClassNotFoundException, IOException + throws ClassNotFoundException { boolean dbg = false; JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); @@ -132,7 +131,7 @@ public class FieldAnnotationsTestCase extends AbstractTestCase .equals(name)); assertTrue("Expected AnnotationEntry to have one element but it had " + a.getElementValuePairs().length, a.getElementValuePairs().length == 1); - ElementValuePair envp = (ElementValuePair) a.getElementValuePairs()[0]; + ElementValuePair envp = a.getElementValuePairs()[0]; assertTrue("Expected element name " + elementname + " but was " + envp.getNameString(), elementname .equals(envp.getNameString())); diff --git a/src/test/java/org/apache/bcel/NanoTimer.java b/src/test/java/org/apache/bcel/NanoTimer.java index 6bd57276..27efb9b0 100644 --- a/src/test/java/org/apache/bcel/NanoTimer.java +++ b/src/test/java/org/apache/bcel/NanoTimer.java @@ -42,7 +42,8 @@ public class NanoTimer { /** * May ony be called after stop has been called as many times as start. */ - public String toString() { + @Override + public String toString() { return ((double) (time) / 1000000000) + " s"; } diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java index a63ba22a..48ce9fff 100644 --- a/src/test/java/org/apache/bcel/PerformanceTest.java +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -19,11 +19,9 @@ package org.apache.bcel; import java.io.ByteArrayInputStream; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; -import java.util.Locale; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -76,7 +74,7 @@ public final class PerformanceTest extends TestCase { String javaHome = System.getProperty("java.home"); JarFile jar = new JarFile(javaHome + "/lib/dt.jar"); - Enumeration en = jar.entries(); + Enumeration en = jar.entries(); int i = 0; while (en.hasMoreElements()) { diff --git a/src/test/java/org/apache/bcel/data/SimpleEnum.java b/src/test/java/org/apache/bcel/data/SimpleEnum.java index 8a5b0402..1db0bbf9 100644 --- a/src/test/java/org/apache/bcel/data/SimpleEnum.java +++ b/src/test/java/org/apache/bcel/data/SimpleEnum.java @@ -18,4 +18,4 @@ package org.apache.bcel.data; -public enum SimpleEnum { Red,Orange,Yellow,Green,Blue,Indigo,Violet }; +public enum SimpleEnum { Red,Orange,Yellow,Green,Blue,Indigo,Violet } diff --git a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java index 4f494462..12871052 100644 --- a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java +++ b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java @@ -37,7 +37,7 @@ public class InstructionFinderTest extends AbstractTestCase { il.append(new ISTORE(3)); InstructionFinder finder = new InstructionFinder(il); - Iterator it = finder.search("ILOAD IADD", il.getInstructionHandles()[0], null ); + Iterator it = finder.search("ILOAD IADD", il.getInstructionHandles()[0], null ); InstructionHandle[] ihs = (InstructionHandle[])it.next(); assertEquals(2, ihs.length); assertEquals(ihs[0].getInstruction(), new ILOAD(2)); -- GitLab From f4c5857d0137017ff1e007f2efce3dd19ba8e58e Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 25 May 2010 00:08:45 +0000 Subject: [PATCH 0447/1313] Unnecessary cast git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947870 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/structurals/InstConstraintVisitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 87e12f69..254ef0e8 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -465,7 +465,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); } - if (! ((ReferenceType)value).isAssignmentCompatibleWith((ReferenceType) ((ArrayType) arrayref).getElementType())){ + if (! ((ReferenceType)value).isAssignmentCompatibleWith(((ArrayType) arrayref).getElementType())){ constraintViolated(o, "The type of 'value' ('"+value+"') is not assignment compatible to the components of the array 'arrayref' refers to. ('"+((ArrayType) arrayref).getElementType()+"')"); } } -- GitLab From 385f1d810d0aaed988e7ac0a91fb21919d507f89 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 25 May 2010 00:11:01 +0000 Subject: [PATCH 0448/1313] Fixup ignores git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947871 13f79535-47bb-0310-9956-ffa450edef68 -- GitLab From f20b04f1266b1f4aeb8d82a4e9b20dd48e14cbe3 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 25 May 2010 00:20:30 +0000 Subject: [PATCH 0449/1313] Fix Eclipse warnings git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947872 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/classfile/AnnotationEntry.java | 5 ----- src/main/java/org/apache/bcel/classfile/Utility.java | 2 +- .../java/org/apache/bcel/generic/AnnotationEntryGen.java | 2 +- src/main/java/org/apache/bcel/generic/Instruction.java | 1 - src/main/java/org/apache/bcel/util/BCELFactory.java | 2 +- src/main/java/org/apache/bcel/util/CodeHTML.java | 4 ++-- src/main/java/org/apache/bcel/verifier/VerifyDialog.java | 6 +++--- .../bcel/verifier/structurals/InstConstraintVisitor.java | 8 ++++---- 8 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 5956a90d..a5b397f9 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -63,11 +63,6 @@ public class AnnotationEntry implements Node, Constants, Serializable { return annotationEntry; } - /** - * Construct object from file stream. - * - * @param file Input stream - */ public AnnotationEntry(int type_index, ConstantPool constant_pool, boolean isRuntimeVisible) { this.type_index = type_index; this.constant_pool = constant_pool; diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index e0ad46af..336e575b 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -333,7 +333,7 @@ public abstract class Utility { case Constants.NEW: case Constants.CHECKCAST: buf.append("\t"); - /* FALL THRU */ + //$FALL-THROUGH$ case Constants.INSTANCEOF: index = bytes.readUnsignedShort(); buf.append("\t<").append( diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index c54cd796..f9295290 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -52,7 +52,7 @@ public class AnnotationEntryGen int l = in.length; for (int i = 0; i < l; i++) { - ElementValuePair nvp = (ElementValuePair) in[i]; + ElementValuePair nvp = in[i]; out.add(new ElementValuePairGen(nvp, cpool, copyPoolEntries)); } return out; diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index f469f245..068658ab 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -19,7 +19,6 @@ package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; -import java.util.Locale; import org.apache.bcel.Constants; import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.util.ByteSequence; diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index 9f738234..a2b8d074 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -182,7 +182,7 @@ class BCELFactory extends EmptyVisitor { break; case Constants.MULTIANEWARRAY: dim = ((MULTIANEWARRAY) i).getDimensions(); - /* FALL THRU */ + //$FALL-THROUGH$ case Constants.ANEWARRAY: case Constants.NEWARRAY: if (type instanceof ArrayType) { diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 42a2d9f7..1cfed10a 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -164,7 +164,7 @@ final class CodeHTML implements org.apache.bcel.Constants { case IF_ICMPLT: case IF_ICMPNE: case JSR: - index = (int) (bytes.getIndex() + bytes.readShort() - 1); + index = (bytes.getIndex() + bytes.readShort() - 1); buf.append("").append(index).append(""); break; @@ -387,7 +387,7 @@ final class CodeHTML implements org.apache.bcel.Constants { .getLocalVariableTable(); for (int j = 0; j < vars.length; j++) { int start = vars[j].getStartPC(); - int end = (int) (start + vars[j].getLength()); + int end = (start + vars[j].getLength()); goto_set.set(start); goto_set.set(end); } diff --git a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java index d37f11f3..3c11cc45 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java +++ b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java @@ -81,8 +81,8 @@ public class VerifyDialog extends javax.swing.JDialog { if (e.getSource() == VerifyDialog.this.getFlushButton()) { connEtoC4(e); } - }; - }; + } + } /** Machine-generated. */ private javax.swing.JButton ivjFlushButton = null; @@ -476,7 +476,7 @@ public class VerifyDialog extends javax.swing.JDialog { if (classes_to_verify == 0) { System.exit(0); } - }; + } }); aVerifyDialog.setVisible(true); } catch (Throwable exception) { diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 254ef0e8..d56017e1 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -203,12 +203,12 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc private void _visitStackAccessor(Instruction o){ int consume = o.consumeStack(cpg); // Stack values are always consumed first; then produced. if (consume > stack().slotsUsed()){ - constraintViolated((Instruction) o, "Cannot consume "+consume+" stack slots: only "+stack().slotsUsed()+" slot(s) left on stack!\nStack:\n"+stack()); + constraintViolated(o, "Cannot consume "+consume+" stack slots: only "+stack().slotsUsed()+" slot(s) left on stack!\nStack:\n"+stack()); } - int produce = o.produceStack(cpg) - ((Instruction) o).consumeStack(cpg); // Stack values are always consumed first; then produced. + int produce = o.produceStack(cpg) - o.consumeStack(cpg); // Stack values are always consumed first; then produced. if ( produce + stack().slotsUsed() > stack().maxStack() ){ - constraintViolated((Instruction) o, "Cannot produce "+produce+" stack slots: only "+(stack().maxStack()-stack().slotsUsed())+" free stack slot(s) left.\nStack:\n"+stack()); + constraintViolated(o, "Cannot produce "+produce+" stack slots: only "+(stack().maxStack()-stack().slotsUsed())+" free stack slot(s) left.\nStack:\n"+stack()); } } @@ -282,7 +282,7 @@ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bc Verifier v = VerifierFactory.getVerifier( name ); VerificationResult vr = v.doPass2(); if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); } } } -- GitLab From fa4d01ee0def6d0d0237ce8128cf7fc3cc7d1090 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 25 May 2010 00:33:11 +0000 Subject: [PATCH 0450/1313] Tab police git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947875 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/manual.xml | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/site/xdoc/manual.xml b/src/site/xdoc/manual.xml index 2fd83a2e..27270b08 100644 --- a/src/site/xdoc/manual.xml +++ b/src/site/xdoc/manual.xml @@ -1346,8 +1346,8 @@ String name = null; try { - System.out.print("Please enter your name> "); - name = in.readLine(); + System.out.print("Please enter your name> "); + name = in.readLine(); } catch(IOException e) { return; } System.out.println("Hello, " + name); @@ -1572,14 +1572,14 @@ public class Peephole { ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); for(int i=0; i < methods.length; i++) { - if(!(methods[i].isAbstract() || methods[i].isNative())) { - MethodGen mg = new MethodGen(methods[i], - clazz.getClassName(), cp); - Method stripped = removeNOPs(mg); - - if(stripped != null) // Any NOPs stripped? - methods[i] = stripped; // Overwrite with stripped method - } + if(!(methods[i].isAbstract() || methods[i].isNative())) { + MethodGen mg = new MethodGen(methods[i], + clazz.getClassName(), cp); + Method stripped = removeNOPs(mg); + + if(stripped != null) // Any NOPs stripped? + methods[i] = stripped; // Overwrite with stripped method + } } /* Dump the class to "class name"_.class @@ -1604,7 +1604,7 @@ public class Peephole { /* Some nasty Java compilers may add NOP at end of method. */ if((next = last.getNext()) == null) - break; + break; count += match.length; @@ -1612,15 +1612,15 @@ public class Peephole { * (non-nop) instruction. */ try { - il.delete(first, last); + il.delete(first, last); } catch(TargetLostException e) { - InstructionHandle[] targets = e.getTargets(); - for(int i=0; i < targets.length; i++) { - InstructionTargeter[] targeters = targets[i].getTargeters(); - - for(int j=0; j < targeters.length; j++) - targeters[j].updateTarget(targets[i], next); - } + InstructionHandle[] targets = e.getTargets(); + for(int i=0; i < targets.length; i++) { + InstructionTargeter[] targeters = targets[i].getTargeters(); + + for(int j=0; j < targeters.length; j++) + targeters[j].updateTarget(targets[i], next); + } } } @@ -1628,7 +1628,7 @@ public class Peephole { if(count > 0) { System.out.println("Removed " + count + " NOP instructions from method " + - mg.getName()); + mg.getName()); m = mg.getMethod(); } -- GitLab From 4c91ab1d1db8c7adf1177ae77ba6ed0c850a52bc Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 25 May 2010 00:36:19 +0000 Subject: [PATCH 0451/1313] AL headers git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947877 13f79535-47bb-0310-9956-ffa450edef68 --- doap_bcel.rdf | 18 ++++++++++++++++++ pom.xml | 18 ++++++++++++++++++ src/site/resources/stylesheets/project.xml | 18 ++++++++++++++++++ src/site/site.xml | 18 ++++++++++++++++++ src/site/xdoc/faq.xml | 18 ++++++++++++++++++ src/site/xdoc/index.xml | 18 ++++++++++++++++++ src/site/xdoc/manual.xml | 18 ++++++++++++++++++ src/site/xdoc/news.xml | 18 ++++++++++++++++++ src/site/xdoc/projects.xml | 18 ++++++++++++++++++ 9 files changed, 162 insertions(+) diff --git a/doap_bcel.rdf b/doap_bcel.rdf index 58c81f64..f454d6dc 100644 --- a/doap_bcel.rdf +++ b/doap_bcel.rdf @@ -1,4 +1,22 @@ + Apache Jakarta BCEL diff --git a/pom.xml b/pom.xml index 6fa0276d..90b96ff3 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,22 @@ + diff --git a/src/site/resources/stylesheets/project.xml b/src/site/resources/stylesheets/project.xml index 4ce7fae4..949a69b7 100644 --- a/src/site/resources/stylesheets/project.xml +++ b/src/site/resources/stylesheets/project.xml @@ -1,4 +1,22 @@ + BCEL diff --git a/src/site/site.xml b/src/site/site.xml index 59b936ad..229d3397 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -1,4 +1,22 @@ + diff --git a/src/site/xdoc/index.xml b/src/site/xdoc/index.xml index 12dd7df5..65550e94 100644 --- a/src/site/xdoc/index.xml +++ b/src/site/xdoc/index.xml @@ -1,4 +1,22 @@ + diff --git a/src/site/xdoc/manual.xml b/src/site/xdoc/manual.xml index 27270b08..ed76ff20 100644 --- a/src/site/xdoc/manual.xml +++ b/src/site/xdoc/manual.xml @@ -1,4 +1,22 @@ + diff --git a/src/site/xdoc/news.xml b/src/site/xdoc/news.xml index efddc53f..880243e0 100644 --- a/src/site/xdoc/news.xml +++ b/src/site/xdoc/news.xml @@ -1,4 +1,22 @@ + diff --git a/src/site/xdoc/projects.xml b/src/site/xdoc/projects.xml index 121b84f7..8f903c9d 100644 --- a/src/site/xdoc/projects.xml +++ b/src/site/xdoc/projects.xml @@ -1,4 +1,22 @@ + -- GitLab From 8ad45b40d34952c124c03d975f8c9ecde9753345 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 25 May 2010 00:48:30 +0000 Subject: [PATCH 0452/1313] Update to AL 2.0 header git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947879 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 11 ++++++----- src/main/java/org/apache/bcel/ExceptionConstants.java | 11 ++++++----- src/main/java/org/apache/bcel/Repository.java | 11 ++++++----- .../java/org/apache/bcel/classfile/AccessFlags.java | 11 ++++++----- .../org/apache/bcel/classfile/AnnotationDefault.java | 11 ++++++----- .../apache/bcel/classfile/AnnotationElementValue.java | 11 ++++++----- .../org/apache/bcel/classfile/AnnotationEntry.java | 11 ++++++----- .../java/org/apache/bcel/classfile/Annotations.java | 11 ++++++----- .../org/apache/bcel/classfile/ArrayElementValue.java | 11 ++++++----- .../java/org/apache/bcel/classfile/Attribute.java | 11 ++++++----- .../org/apache/bcel/classfile/AttributeReader.java | 11 ++++++----- .../org/apache/bcel/classfile/ClassElementValue.java | 11 ++++++----- .../apache/bcel/classfile/ClassFormatException.java | 11 ++++++----- .../java/org/apache/bcel/classfile/ClassParser.java | 11 ++++++----- src/main/java/org/apache/bcel/classfile/Code.java | 11 ++++++----- .../java/org/apache/bcel/classfile/CodeException.java | 11 ++++++----- src/main/java/org/apache/bcel/classfile/Constant.java | 11 ++++++----- .../java/org/apache/bcel/classfile/ConstantCP.java | 11 ++++++----- .../java/org/apache/bcel/classfile/ConstantClass.java | 11 ++++++----- .../org/apache/bcel/classfile/ConstantDouble.java | 11 ++++++----- .../org/apache/bcel/classfile/ConstantFieldref.java | 11 ++++++----- .../java/org/apache/bcel/classfile/ConstantFloat.java | 11 ++++++----- .../org/apache/bcel/classfile/ConstantInteger.java | 11 ++++++----- .../bcel/classfile/ConstantInterfaceMethodref.java | 11 ++++++----- .../java/org/apache/bcel/classfile/ConstantLong.java | 11 ++++++----- .../org/apache/bcel/classfile/ConstantMethodref.java | 11 ++++++----- .../apache/bcel/classfile/ConstantNameAndType.java | 11 ++++++----- .../org/apache/bcel/classfile/ConstantObject.java | 11 ++++++----- .../java/org/apache/bcel/classfile/ConstantPool.java | 11 ++++++----- .../org/apache/bcel/classfile/ConstantString.java | 11 ++++++----- .../java/org/apache/bcel/classfile/ConstantUtf8.java | 11 ++++++----- .../java/org/apache/bcel/classfile/ConstantValue.java | 11 ++++++----- .../java/org/apache/bcel/classfile/Deprecated.java | 11 ++++++----- .../org/apache/bcel/classfile/DescendingVisitor.java | 11 ++++++----- .../java/org/apache/bcel/classfile/ElementValue.java | 11 ++++++----- .../org/apache/bcel/classfile/ElementValuePair.java | 11 ++++++----- .../java/org/apache/bcel/classfile/EmptyVisitor.java | 11 ++++++----- .../org/apache/bcel/classfile/EnumElementValue.java | 11 ++++++----- .../org/apache/bcel/classfile/ExceptionTable.java | 11 ++++++----- src/main/java/org/apache/bcel/classfile/Field.java | 11 ++++++----- .../java/org/apache/bcel/classfile/FieldOrMethod.java | 11 ++++++----- .../java/org/apache/bcel/classfile/InnerClass.java | 11 ++++++----- .../java/org/apache/bcel/classfile/InnerClasses.java | 11 ++++++----- .../java/org/apache/bcel/classfile/JavaClass.java | 11 ++++++----- .../java/org/apache/bcel/classfile/LineNumber.java | 11 ++++++----- .../org/apache/bcel/classfile/LineNumberTable.java | 11 ++++++----- .../java/org/apache/bcel/classfile/LocalVariable.java | 11 ++++++----- .../org/apache/bcel/classfile/LocalVariableTable.java | 11 ++++++----- src/main/java/org/apache/bcel/classfile/Method.java | 11 ++++++----- src/main/java/org/apache/bcel/classfile/Node.java | 11 ++++++----- src/main/java/org/apache/bcel/classfile/PMGClass.java | 11 ++++++----- .../bcel/classfile/ParameterAnnotationEntry.java | 11 ++++++----- .../apache/bcel/classfile/ParameterAnnotations.java | 11 ++++++----- .../bcel/classfile/RuntimeInvisibleAnnotations.java | 11 ++++++----- .../RuntimeInvisibleParameterAnnotations.java | 11 ++++++----- .../bcel/classfile/RuntimeVisibleAnnotations.java | 11 ++++++----- .../classfile/RuntimeVisibleParameterAnnotations.java | 11 ++++++----- .../java/org/apache/bcel/classfile/Signature.java | 11 ++++++----- .../org/apache/bcel/classfile/SimpleElementValue.java | 11 ++++++----- .../java/org/apache/bcel/classfile/SourceFile.java | 11 ++++++----- src/main/java/org/apache/bcel/classfile/StackMap.java | 11 ++++++----- .../java/org/apache/bcel/classfile/StackMapEntry.java | 11 ++++++----- .../java/org/apache/bcel/classfile/StackMapTable.java | 11 ++++++----- .../org/apache/bcel/classfile/StackMapTableEntry.java | 11 ++++++----- .../java/org/apache/bcel/classfile/StackMapType.java | 11 ++++++----- .../java/org/apache/bcel/classfile/Synthetic.java | 11 ++++++----- src/main/java/org/apache/bcel/classfile/Unknown.java | 11 ++++++----- src/main/java/org/apache/bcel/classfile/Utility.java | 11 ++++++----- src/main/java/org/apache/bcel/classfile/Visitor.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/AALOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/AASTORE.java | 11 ++++++----- .../java/org/apache/bcel/generic/ACONST_NULL.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ALOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ANEWARRAY.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ARETURN.java | 11 ++++++----- .../java/org/apache/bcel/generic/ARRAYLENGTH.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ASTORE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ATHROW.java | 11 ++++++----- .../apache/bcel/generic/AllocationInstruction.java | 11 ++++++----- .../apache/bcel/generic/ArithmeticInstruction.java | 11 ++++++----- .../org/apache/bcel/generic/ArrayInstruction.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ArrayType.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/BALOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/BASTORE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/BIPUSH.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/BREAKPOINT.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/BasicType.java | 11 ++++++----- .../java/org/apache/bcel/generic/BranchHandle.java | 11 ++++++----- .../org/apache/bcel/generic/BranchInstruction.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/CALOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/CASTORE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/CHECKCAST.java | 11 ++++++----- .../java/org/apache/bcel/generic/CPInstruction.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ClassGen.java | 11 ++++++----- .../org/apache/bcel/generic/ClassGenException.java | 11 ++++++----- .../java/org/apache/bcel/generic/ClassObserver.java | 11 ++++++----- .../org/apache/bcel/generic/CodeExceptionGen.java | 11 ++++++----- .../org/apache/bcel/generic/CompoundInstruction.java | 11 ++++++----- .../java/org/apache/bcel/generic/ConstantPoolGen.java | 11 ++++++----- .../apache/bcel/generic/ConstantPushInstruction.java | 11 ++++++----- .../apache/bcel/generic/ConversionInstruction.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/D2F.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/D2I.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/D2L.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DADD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DALOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DASTORE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DCMPG.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DCMPL.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DCONST.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DDIV.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DLOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DMUL.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DNEG.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DREM.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DRETURN.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DSTORE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DSUB.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DUP.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DUP2.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DUP2_X1.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DUP2_X2.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DUP_X1.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/DUP_X2.java | 11 ++++++----- .../java/org/apache/bcel/generic/EmptyVisitor.java | 11 ++++++----- .../org/apache/bcel/generic/ExceptionThrower.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/F2D.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/F2I.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/F2L.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FADD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FALOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FASTORE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FCMPG.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FCMPL.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FCONST.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FDIV.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FLOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FMUL.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FNEG.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FREM.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FRETURN.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FSTORE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FSUB.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/FieldGen.java | 11 ++++++----- .../org/apache/bcel/generic/FieldGenOrMethodGen.java | 11 ++++++----- .../org/apache/bcel/generic/FieldInstruction.java | 11 ++++++----- .../java/org/apache/bcel/generic/FieldObserver.java | 11 ++++++----- .../java/org/apache/bcel/generic/FieldOrMethod.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/GETFIELD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/GETSTATIC.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/GOTO.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/GOTO_W.java | 11 ++++++----- .../java/org/apache/bcel/generic/GotoInstruction.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/I2B.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/I2C.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/I2D.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/I2F.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/I2L.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/I2S.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IADD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IALOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IAND.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IASTORE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ICONST.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IDIV.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IFEQ.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IFGE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IFGT.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IFLE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IFLT.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IFNE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IFNONNULL.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IFNULL.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IF_ACMPNE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IF_ICMPGE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IF_ICMPGT.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IF_ICMPLE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IF_ICMPLT.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IF_ICMPNE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IINC.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ILOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IMPDEP1.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IMPDEP2.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IMUL.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/INEG.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/INSTANCEOF.java | 11 ++++++----- .../java/org/apache/bcel/generic/INVOKEINTERFACE.java | 11 ++++++----- .../java/org/apache/bcel/generic/INVOKESPECIAL.java | 11 ++++++----- .../java/org/apache/bcel/generic/INVOKESTATIC.java | 11 ++++++----- .../java/org/apache/bcel/generic/INVOKEVIRTUAL.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IOR.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IREM.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IRETURN.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ISHL.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ISHR.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ISTORE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ISUB.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IUSHR.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/IXOR.java | 11 ++++++----- .../java/org/apache/bcel/generic/IfInstruction.java | 11 ++++++----- .../org/apache/bcel/generic/IndexedInstruction.java | 11 ++++++----- .../java/org/apache/bcel/generic/Instruction.java | 11 ++++++----- .../apache/bcel/generic/InstructionComparator.java | 11 ++++++----- .../org/apache/bcel/generic/InstructionConstants.java | 11 ++++++----- .../org/apache/bcel/generic/InstructionFactory.java | 11 ++++++----- .../org/apache/bcel/generic/InstructionHandle.java | 11 ++++++----- .../java/org/apache/bcel/generic/InstructionList.java | 11 ++++++----- .../apache/bcel/generic/InstructionListObserver.java | 11 ++++++----- .../org/apache/bcel/generic/InstructionTargeter.java | 11 ++++++----- .../org/apache/bcel/generic/InvokeInstruction.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/JSR.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/JSR_W.java | 11 ++++++----- .../java/org/apache/bcel/generic/JsrInstruction.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/L2D.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/L2F.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/L2I.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LADD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LALOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LAND.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LASTORE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LCMP.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LCONST.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LDC.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LDC2_W.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LDC_W.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LDIV.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LLOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LMUL.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LNEG.java | 11 ++++++----- .../java/org/apache/bcel/generic/LOOKUPSWITCH.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LOR.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LREM.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LRETURN.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LSHL.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LSHR.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LSTORE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LSUB.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LUSHR.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LXOR.java | 11 ++++++----- .../java/org/apache/bcel/generic/LineNumberGen.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/LoadClass.java | 11 ++++++----- .../java/org/apache/bcel/generic/LoadInstruction.java | 11 ++++++----- .../org/apache/bcel/generic/LocalVariableGen.java | 11 ++++++----- .../apache/bcel/generic/LocalVariableInstruction.java | 11 ++++++----- .../java/org/apache/bcel/generic/MONITORENTER.java | 11 ++++++----- .../java/org/apache/bcel/generic/MONITOREXIT.java | 11 ++++++----- .../java/org/apache/bcel/generic/MULTIANEWARRAY.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/MethodGen.java | 11 ++++++----- .../java/org/apache/bcel/generic/MethodObserver.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/NEW.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/NEWARRAY.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/NOP.java | 11 ++++++----- .../java/org/apache/bcel/generic/NamedAndTyped.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/ObjectType.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/POP.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/POP2.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/PUSH.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/PUTFIELD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/PUTSTATIC.java | 11 ++++++----- .../java/org/apache/bcel/generic/PopInstruction.java | 11 ++++++----- .../java/org/apache/bcel/generic/PushInstruction.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/RET.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/RETURN.java | 11 ++++++----- .../java/org/apache/bcel/generic/ReferenceType.java | 11 ++++++----- .../org/apache/bcel/generic/ReturnInstruction.java | 11 ++++++----- .../org/apache/bcel/generic/ReturnaddressType.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/SALOAD.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/SASTORE.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/SIPUSH.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/SWAP.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/SWITCH.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/Select.java | 11 ++++++----- .../java/org/apache/bcel/generic/StackConsumer.java | 11 ++++++----- .../org/apache/bcel/generic/StackInstruction.java | 11 ++++++----- .../java/org/apache/bcel/generic/StackProducer.java | 11 ++++++----- .../org/apache/bcel/generic/StoreInstruction.java | 11 ++++++----- .../java/org/apache/bcel/generic/TABLESWITCH.java | 11 ++++++----- .../org/apache/bcel/generic/TargetLostException.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/Type.java | 11 ++++++----- .../org/apache/bcel/generic/TypedInstruction.java | 11 ++++++----- .../org/apache/bcel/generic/UnconditionalBranch.java | 11 ++++++----- .../bcel/generic/VariableLengthInstruction.java | 11 ++++++----- src/main/java/org/apache/bcel/generic/Visitor.java | 11 ++++++----- src/main/java/org/apache/bcel/util/AttributeHTML.java | 11 ++++++----- .../java/org/apache/bcel/util/BCELComparator.java | 11 ++++++----- src/main/java/org/apache/bcel/util/BCELFactory.java | 11 ++++++----- src/main/java/org/apache/bcel/util/BCELifier.java | 11 ++++++----- src/main/java/org/apache/bcel/util/ByteSequence.java | 11 ++++++----- src/main/java/org/apache/bcel/util/Class2HTML.java | 11 ++++++----- src/main/java/org/apache/bcel/util/ClassLoader.java | 11 ++++++----- .../org/apache/bcel/util/ClassLoaderRepository.java | 11 ++++++----- src/main/java/org/apache/bcel/util/ClassPath.java | 11 ++++++----- src/main/java/org/apache/bcel/util/ClassQueue.java | 11 ++++++----- src/main/java/org/apache/bcel/util/ClassSet.java | 11 ++++++----- src/main/java/org/apache/bcel/util/ClassStack.java | 11 ++++++----- src/main/java/org/apache/bcel/util/ClassVector.java | 11 ++++++----- src/main/java/org/apache/bcel/util/CodeHTML.java | 11 ++++++----- src/main/java/org/apache/bcel/util/ConstantHTML.java | 11 ++++++----- .../java/org/apache/bcel/util/InstructionFinder.java | 11 ++++++----- src/main/java/org/apache/bcel/util/JavaWrapper.java | 11 ++++++----- src/main/java/org/apache/bcel/util/MethodHTML.java | 11 ++++++----- src/main/java/org/apache/bcel/util/Repository.java | 11 ++++++----- .../org/apache/bcel/util/SyntheticRepository.java | 11 ++++++----- .../org/apache/bcel/verifier/GraphicalVerifier.java | 11 ++++++----- .../java/org/apache/bcel/verifier/NativeVerifier.java | 11 ++++++----- .../java/org/apache/bcel/verifier/PassVerifier.java | 11 ++++++----- .../java/org/apache/bcel/verifier/TransitiveHull.java | 11 ++++++----- .../org/apache/bcel/verifier/VerificationResult.java | 11 ++++++----- src/main/java/org/apache/bcel/verifier/Verifier.java | 11 ++++++----- .../org/apache/bcel/verifier/VerifierAppFrame.java | 11 ++++++----- .../org/apache/bcel/verifier/VerifierFactory.java | 11 ++++++----- .../bcel/verifier/VerifierFactoryListModel.java | 11 ++++++----- .../apache/bcel/verifier/VerifierFactoryObserver.java | 11 ++++++----- .../bcel/verifier/exc/AssertionViolatedException.java | 11 ++++++----- .../bcel/verifier/exc/ClassConstraintException.java | 11 ++++++----- .../bcel/verifier/exc/CodeConstraintException.java | 11 ++++++----- .../bcel/verifier/exc/InvalidMethodException.java | 11 ++++++----- .../bcel/verifier/exc/LinkingConstraintException.java | 11 ++++++----- .../apache/bcel/verifier/exc/LoadingException.java | 11 ++++++----- .../exc/LocalVariableInfoInconsistentException.java | 11 ++++++----- .../verifier/exc/StaticCodeConstraintException.java | 11 ++++++----- .../exc/StaticCodeInstructionConstraintException.java | 11 ++++++----- ...aticCodeInstructionOperandConstraintException.java | 11 ++++++----- .../exc/StructuralCodeConstraintException.java | 11 ++++++----- .../java/org/apache/bcel/verifier/exc/Utility.java | 11 ++++++----- .../bcel/verifier/exc/VerificationException.java | 11 ++++++----- .../exc/VerifierConstraintViolatedException.java | 11 ++++++----- .../apache/bcel/verifier/statics/DOUBLE_Upper.java | 11 ++++++----- .../org/apache/bcel/verifier/statics/IntList.java | 11 ++++++----- .../org/apache/bcel/verifier/statics/LONG_Upper.java | 11 ++++++----- .../bcel/verifier/statics/LocalVariableInfo.java | 11 ++++++----- .../bcel/verifier/statics/LocalVariablesInfo.java | 11 ++++++----- .../apache/bcel/verifier/statics/Pass1Verifier.java | 11 ++++++----- .../apache/bcel/verifier/statics/Pass2Verifier.java | 11 ++++++----- .../apache/bcel/verifier/statics/Pass3aVerifier.java | 11 ++++++----- .../bcel/verifier/statics/StringRepresentation.java | 11 ++++++----- .../bcel/verifier/structurals/ControlFlowGraph.java | 11 ++++++----- .../bcel/verifier/structurals/ExceptionHandler.java | 11 ++++++----- .../bcel/verifier/structurals/ExceptionHandlers.java | 11 ++++++----- .../bcel/verifier/structurals/ExecutionVisitor.java | 11 ++++++----- .../org/apache/bcel/verifier/structurals/Frame.java | 11 ++++++----- .../bcel/verifier/structurals/GenericArray.java | 11 ++++++----- .../verifier/structurals/InstConstraintVisitor.java | 11 ++++++----- .../bcel/verifier/structurals/InstructionContext.java | 11 ++++++----- .../bcel/verifier/structurals/LocalVariables.java | 11 ++++++----- .../bcel/verifier/structurals/OperandStack.java | 11 ++++++----- .../bcel/verifier/structurals/Pass3bVerifier.java | 11 ++++++----- .../apache/bcel/verifier/structurals/Subroutine.java | 11 ++++++----- .../apache/bcel/verifier/structurals/Subroutines.java | 11 ++++++----- .../verifier/structurals/UninitializedObjectType.java | 11 ++++++----- 352 files changed, 2112 insertions(+), 1760 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 7ceb2475..35d08daa 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/ExceptionConstants.java b/src/main/java/org/apache/bcel/ExceptionConstants.java index 8ae79aa6..e68a49fa 100644 --- a/src/main/java/org/apache/bcel/ExceptionConstants.java +++ b/src/main/java/org/apache/bcel/ExceptionConstants.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/Repository.java b/src/main/java/org/apache/bcel/Repository.java index 85d05db3..d64e3c02 100644 --- a/src/main/java/org/apache/bcel/Repository.java +++ b/src/main/java/org/apache/bcel/Repository.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/AccessFlags.java b/src/main/java/org/apache/bcel/classfile/AccessFlags.java index 3e4465f6..9d3b38d0 100644 --- a/src/main/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/main/java/org/apache/bcel/classfile/AccessFlags.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index 7ef0136f..cbb8173d 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java index 16ea29fb..65878d2a 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index a5b397f9..0ea6f997 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index a2a62053..3e918469 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java index e89241ed..43b731cf 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index d243ae69..5641ca6a 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/AttributeReader.java b/src/main/java/org/apache/bcel/classfile/AttributeReader.java index 47cf41f8..b8cdfc23 100644 --- a/src/main/java/org/apache/bcel/classfile/AttributeReader.java +++ b/src/main/java/org/apache/bcel/classfile/AttributeReader.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java index e95e0606..572a27a5 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java index b0236ea9..7deec0a6 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java +++ b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 3fe61ed8..8ddac5d2 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java index 6268b992..060fffd1 100644 --- a/src/main/java/org/apache/bcel/classfile/Code.java +++ b/src/main/java/org/apache/bcel/classfile/Code.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/CodeException.java b/src/main/java/org/apache/bcel/classfile/CodeException.java index 4a56ed34..a11ee8d8 100644 --- a/src/main/java/org/apache/bcel/classfile/CodeException.java +++ b/src/main/java/org/apache/bcel/classfile/CodeException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index f200d24b..1e07593f 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantCP.java b/src/main/java/org/apache/bcel/classfile/ConstantCP.java index e7014c78..5636293b 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantCP.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantClass.java b/src/main/java/org/apache/bcel/classfile/ConstantClass.java index 67326d08..934d4f47 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantClass.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java index 9b9b19de..6eee3b21 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java index 33a225c3..60a022a0 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java index b9db5810..208a3196 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java index ae8edd2d..638f2ff5 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java index c1cf691f..2a8c2cb5 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantLong.java b/src/main/java/org/apache/bcel/classfile/ConstantLong.java index b361a4ae..20428ab4 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantLong.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java index a493a7e4..f08df320 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java index 5e1f4d56..2a44009a 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantObject.java b/src/main/java/org/apache/bcel/classfile/ConstantObject.java index 67fe2662..28436215 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantObject.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantObject.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index b07cc763..fed8be13 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantString.java b/src/main/java/org/apache/bcel/classfile/ConstantString.java index 97c27b02..1fad9d7b 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantString.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index 3c650444..fb32fa9a 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantValue.java b/src/main/java/org/apache/bcel/classfile/ConstantValue.java index 071fc0c6..e6f1f4d6 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantValue.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Deprecated.java b/src/main/java/org/apache/bcel/classfile/Deprecated.java index b3ceeae1..c842e6df 100644 --- a/src/main/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/main/java/org/apache/bcel/classfile/Deprecated.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index 5a715643..40a045c2 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index e9b1cde6..4870e3ee 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index 5caf729f..1c19981a 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java index 3be648aa..bf77c694 100644 --- a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java index 10fcae94..77972400 100644 --- a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java index 421f69db..215de941 100644 --- a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java index 9d6bec0e..ddf07921 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/bcel/classfile/Field.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index 8542ee8b..70f6e487 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/InnerClass.java b/src/main/java/org/apache/bcel/classfile/InnerClass.java index 5417a7b8..85d05f1c 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClass.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/InnerClasses.java b/src/main/java/org/apache/bcel/classfile/InnerClasses.java index ea73d994..f81f6be4 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClasses.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 48361dec..6663c22a 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/LineNumber.java b/src/main/java/org/apache/bcel/classfile/LineNumber.java index c9dd8043..5b85866b 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumber.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java index 395859df..82040989 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java index 3d6073b0..879b060e 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariable.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index a1ecab3c..fc959b09 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index 10a274c0..65a1d300 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Node.java b/src/main/java/org/apache/bcel/classfile/Node.java index fb176de8..ecda28b1 100644 --- a/src/main/java/org/apache/bcel/classfile/Node.java +++ b/src/main/java/org/apache/bcel/classfile/Node.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java index 802d7d14..5c4740a7 100644 --- a/src/main/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/main/java/org/apache/bcel/classfile/PMGClass.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index 5599f2fc..dc1853e8 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index 88de184c..498c0789 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index d0ae379d..ac51be9f 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 1ed4dd27..131f7edc 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 0967b7cf..39446377 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index 9a0da981..e270110c 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index e774980a..46670c80 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java index db201be6..d0e0efaf 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java index 90d43ae0..09e1e32e 100644 --- a/src/main/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/main/java/org/apache/bcel/classfile/SourceFile.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java index d4e4d4be..8be4fbc4 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMap.java +++ b/src/main/java/org/apache/bcel/classfile/StackMap.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index 1a14e938..b123923b 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTable.java b/src/main/java/org/apache/bcel/classfile/StackMapTable.java index 4f3f2424..8a65abe7 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTable.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTable.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index 307c866c..80530d71 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/StackMapType.java b/src/main/java/org/apache/bcel/classfile/StackMapType.java index 3408491e..89556742 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapType.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Synthetic.java b/src/main/java/org/apache/bcel/classfile/Synthetic.java index 65d8a5a4..f759f000 100644 --- a/src/main/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/main/java/org/apache/bcel/classfile/Synthetic.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index a726d9ca..e67b6d71 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 336e575b..a396f260 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java index 8a87a4c4..3a24c90d 100644 --- a/src/main/java/org/apache/bcel/classfile/Visitor.java +++ b/src/main/java/org/apache/bcel/classfile/Visitor.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/AALOAD.java b/src/main/java/org/apache/bcel/generic/AALOAD.java index 8bf158f9..0b250db4 100644 --- a/src/main/java/org/apache/bcel/generic/AALOAD.java +++ b/src/main/java/org/apache/bcel/generic/AALOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/AASTORE.java b/src/main/java/org/apache/bcel/generic/AASTORE.java index cb0b7c2f..1b94def6 100644 --- a/src/main/java/org/apache/bcel/generic/AASTORE.java +++ b/src/main/java/org/apache/bcel/generic/AASTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java index 5622ef12..2ee3a8c2 100644 --- a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java +++ b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ALOAD.java b/src/main/java/org/apache/bcel/generic/ALOAD.java index 7b20bd17..cc942210 100644 --- a/src/main/java/org/apache/bcel/generic/ALOAD.java +++ b/src/main/java/org/apache/bcel/generic/ALOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java index 388e46ed..30e35ce6 100644 --- a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ARETURN.java b/src/main/java/org/apache/bcel/generic/ARETURN.java index a77069d3..66cbb173 100644 --- a/src/main/java/org/apache/bcel/generic/ARETURN.java +++ b/src/main/java/org/apache/bcel/generic/ARETURN.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java index c5b1629b..5e363c0c 100644 --- a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ASTORE.java b/src/main/java/org/apache/bcel/generic/ASTORE.java index f5c2d78d..533c529b 100644 --- a/src/main/java/org/apache/bcel/generic/ASTORE.java +++ b/src/main/java/org/apache/bcel/generic/ASTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ATHROW.java b/src/main/java/org/apache/bcel/generic/ATHROW.java index 7a68a612..f761f1f7 100644 --- a/src/main/java/org/apache/bcel/generic/ATHROW.java +++ b/src/main/java/org/apache/bcel/generic/ATHROW.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/AllocationInstruction.java b/src/main/java/org/apache/bcel/generic/AllocationInstruction.java index b1c6b845..a81c82c1 100644 --- a/src/main/java/org/apache/bcel/generic/AllocationInstruction.java +++ b/src/main/java/org/apache/bcel/generic/AllocationInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java b/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java index 37692672..b058a67a 100644 --- a/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ArrayInstruction.java b/src/main/java/org/apache/bcel/generic/ArrayInstruction.java index c32b5abb..450bafa3 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ArrayInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ArrayType.java b/src/main/java/org/apache/bcel/generic/ArrayType.java index 7ce93bae..cd8b1bc7 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayType.java +++ b/src/main/java/org/apache/bcel/generic/ArrayType.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/BALOAD.java b/src/main/java/org/apache/bcel/generic/BALOAD.java index 6df86417..aa6896f4 100644 --- a/src/main/java/org/apache/bcel/generic/BALOAD.java +++ b/src/main/java/org/apache/bcel/generic/BALOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/BASTORE.java b/src/main/java/org/apache/bcel/generic/BASTORE.java index b8e8f6b9..b30e165d 100644 --- a/src/main/java/org/apache/bcel/generic/BASTORE.java +++ b/src/main/java/org/apache/bcel/generic/BASTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/BIPUSH.java b/src/main/java/org/apache/bcel/generic/BIPUSH.java index 0bf7acda..6f6b2771 100644 --- a/src/main/java/org/apache/bcel/generic/BIPUSH.java +++ b/src/main/java/org/apache/bcel/generic/BIPUSH.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java index 45333239..144f4ecf 100644 --- a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java +++ b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/BasicType.java b/src/main/java/org/apache/bcel/generic/BasicType.java index c539598e..151de952 100644 --- a/src/main/java/org/apache/bcel/generic/BasicType.java +++ b/src/main/java/org/apache/bcel/generic/BasicType.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/BranchHandle.java b/src/main/java/org/apache/bcel/generic/BranchHandle.java index 9b62c8a4..136e81a1 100644 --- a/src/main/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/main/java/org/apache/bcel/generic/BranchHandle.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/BranchInstruction.java b/src/main/java/org/apache/bcel/generic/BranchInstruction.java index 433dbd86..8a0378d1 100644 --- a/src/main/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/main/java/org/apache/bcel/generic/BranchInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/CALOAD.java b/src/main/java/org/apache/bcel/generic/CALOAD.java index 160eeb95..9ea0a35b 100644 --- a/src/main/java/org/apache/bcel/generic/CALOAD.java +++ b/src/main/java/org/apache/bcel/generic/CALOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/CASTORE.java b/src/main/java/org/apache/bcel/generic/CASTORE.java index 03c337bb..7c7aaddf 100644 --- a/src/main/java/org/apache/bcel/generic/CASTORE.java +++ b/src/main/java/org/apache/bcel/generic/CASTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/CHECKCAST.java b/src/main/java/org/apache/bcel/generic/CHECKCAST.java index 218a68e9..4e1d0a38 100644 --- a/src/main/java/org/apache/bcel/generic/CHECKCAST.java +++ b/src/main/java/org/apache/bcel/generic/CHECKCAST.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/CPInstruction.java b/src/main/java/org/apache/bcel/generic/CPInstruction.java index 54b5bacb..ebd9c53e 100644 --- a/src/main/java/org/apache/bcel/generic/CPInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CPInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 10d41aba..d63ecf55 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ClassGenException.java b/src/main/java/org/apache/bcel/generic/ClassGenException.java index ed1b36a7..407aad3d 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGenException.java +++ b/src/main/java/org/apache/bcel/generic/ClassGenException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ClassObserver.java b/src/main/java/org/apache/bcel/generic/ClassObserver.java index e4cd6cc9..dfe4c997 100644 --- a/src/main/java/org/apache/bcel/generic/ClassObserver.java +++ b/src/main/java/org/apache/bcel/generic/ClassObserver.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java index ae1a11e2..58c6f643 100644 --- a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/CompoundInstruction.java b/src/main/java/org/apache/bcel/generic/CompoundInstruction.java index bf3d89c2..94e7b04b 100644 --- a/src/main/java/org/apache/bcel/generic/CompoundInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CompoundInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index 2b647f89..046ad58d 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java b/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java index 05162878..96b11ebf 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ConversionInstruction.java b/src/main/java/org/apache/bcel/generic/ConversionInstruction.java index bfb57a4d..a5c98406 100644 --- a/src/main/java/org/apache/bcel/generic/ConversionInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ConversionInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/D2F.java b/src/main/java/org/apache/bcel/generic/D2F.java index a74e2935..be1a9769 100644 --- a/src/main/java/org/apache/bcel/generic/D2F.java +++ b/src/main/java/org/apache/bcel/generic/D2F.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/D2I.java b/src/main/java/org/apache/bcel/generic/D2I.java index 259da14e..a1b5cf5b 100644 --- a/src/main/java/org/apache/bcel/generic/D2I.java +++ b/src/main/java/org/apache/bcel/generic/D2I.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/D2L.java b/src/main/java/org/apache/bcel/generic/D2L.java index 21562824..913e6133 100644 --- a/src/main/java/org/apache/bcel/generic/D2L.java +++ b/src/main/java/org/apache/bcel/generic/D2L.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DADD.java b/src/main/java/org/apache/bcel/generic/DADD.java index 19725676..b321fe30 100644 --- a/src/main/java/org/apache/bcel/generic/DADD.java +++ b/src/main/java/org/apache/bcel/generic/DADD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DALOAD.java b/src/main/java/org/apache/bcel/generic/DALOAD.java index 089cfd13..944d0d32 100644 --- a/src/main/java/org/apache/bcel/generic/DALOAD.java +++ b/src/main/java/org/apache/bcel/generic/DALOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DASTORE.java b/src/main/java/org/apache/bcel/generic/DASTORE.java index 9c0e74dd..5b2d8ce4 100644 --- a/src/main/java/org/apache/bcel/generic/DASTORE.java +++ b/src/main/java/org/apache/bcel/generic/DASTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DCMPG.java b/src/main/java/org/apache/bcel/generic/DCMPG.java index f3b0afbf..672311ea 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPG.java +++ b/src/main/java/org/apache/bcel/generic/DCMPG.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DCMPL.java b/src/main/java/org/apache/bcel/generic/DCMPL.java index 86d4fb8f..01f8172a 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPL.java +++ b/src/main/java/org/apache/bcel/generic/DCMPL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DCONST.java b/src/main/java/org/apache/bcel/generic/DCONST.java index 0db7e50c..f2d68b0b 100644 --- a/src/main/java/org/apache/bcel/generic/DCONST.java +++ b/src/main/java/org/apache/bcel/generic/DCONST.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DDIV.java b/src/main/java/org/apache/bcel/generic/DDIV.java index 25f0a7f1..22211789 100644 --- a/src/main/java/org/apache/bcel/generic/DDIV.java +++ b/src/main/java/org/apache/bcel/generic/DDIV.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DLOAD.java b/src/main/java/org/apache/bcel/generic/DLOAD.java index 7896717f..2f83fe94 100644 --- a/src/main/java/org/apache/bcel/generic/DLOAD.java +++ b/src/main/java/org/apache/bcel/generic/DLOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DMUL.java b/src/main/java/org/apache/bcel/generic/DMUL.java index 48bd7de7..b08e4657 100644 --- a/src/main/java/org/apache/bcel/generic/DMUL.java +++ b/src/main/java/org/apache/bcel/generic/DMUL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DNEG.java b/src/main/java/org/apache/bcel/generic/DNEG.java index 255e9eee..bc7c134a 100644 --- a/src/main/java/org/apache/bcel/generic/DNEG.java +++ b/src/main/java/org/apache/bcel/generic/DNEG.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DREM.java b/src/main/java/org/apache/bcel/generic/DREM.java index 765ac192..5b9f40b1 100644 --- a/src/main/java/org/apache/bcel/generic/DREM.java +++ b/src/main/java/org/apache/bcel/generic/DREM.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DRETURN.java b/src/main/java/org/apache/bcel/generic/DRETURN.java index 1d6a3f09..dd0b7613 100644 --- a/src/main/java/org/apache/bcel/generic/DRETURN.java +++ b/src/main/java/org/apache/bcel/generic/DRETURN.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DSTORE.java b/src/main/java/org/apache/bcel/generic/DSTORE.java index ac342b69..b5cf5b91 100644 --- a/src/main/java/org/apache/bcel/generic/DSTORE.java +++ b/src/main/java/org/apache/bcel/generic/DSTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DSUB.java b/src/main/java/org/apache/bcel/generic/DSUB.java index e098ce98..7fed97d6 100644 --- a/src/main/java/org/apache/bcel/generic/DSUB.java +++ b/src/main/java/org/apache/bcel/generic/DSUB.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DUP.java b/src/main/java/org/apache/bcel/generic/DUP.java index 023bf12f..c6739af9 100644 --- a/src/main/java/org/apache/bcel/generic/DUP.java +++ b/src/main/java/org/apache/bcel/generic/DUP.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DUP2.java b/src/main/java/org/apache/bcel/generic/DUP2.java index 5e4f9df9..83a636ea 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2.java +++ b/src/main/java/org/apache/bcel/generic/DUP2.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X1.java b/src/main/java/org/apache/bcel/generic/DUP2_X1.java index 7124e8b8..0443dbda 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X1.java +++ b/src/main/java/org/apache/bcel/generic/DUP2_X1.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X2.java b/src/main/java/org/apache/bcel/generic/DUP2_X2.java index eb1f7a1e..dcb2ff3e 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X2.java +++ b/src/main/java/org/apache/bcel/generic/DUP2_X2.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DUP_X1.java b/src/main/java/org/apache/bcel/generic/DUP_X1.java index 4aa0f456..06b499d0 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X1.java +++ b/src/main/java/org/apache/bcel/generic/DUP_X1.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/DUP_X2.java b/src/main/java/org/apache/bcel/generic/DUP_X2.java index 89c91b0a..15a45465 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X2.java +++ b/src/main/java/org/apache/bcel/generic/DUP_X2.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java index b51bc862..99e9ab57 100644 --- a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ExceptionThrower.java b/src/main/java/org/apache/bcel/generic/ExceptionThrower.java index 994b7d92..79b697b7 100644 --- a/src/main/java/org/apache/bcel/generic/ExceptionThrower.java +++ b/src/main/java/org/apache/bcel/generic/ExceptionThrower.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/F2D.java b/src/main/java/org/apache/bcel/generic/F2D.java index ba9b87b3..d693e82d 100644 --- a/src/main/java/org/apache/bcel/generic/F2D.java +++ b/src/main/java/org/apache/bcel/generic/F2D.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/F2I.java b/src/main/java/org/apache/bcel/generic/F2I.java index 9545ef30..5f4742df 100644 --- a/src/main/java/org/apache/bcel/generic/F2I.java +++ b/src/main/java/org/apache/bcel/generic/F2I.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/F2L.java b/src/main/java/org/apache/bcel/generic/F2L.java index 4df6d047..41791da2 100644 --- a/src/main/java/org/apache/bcel/generic/F2L.java +++ b/src/main/java/org/apache/bcel/generic/F2L.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FADD.java b/src/main/java/org/apache/bcel/generic/FADD.java index f3087651..244b4e0d 100644 --- a/src/main/java/org/apache/bcel/generic/FADD.java +++ b/src/main/java/org/apache/bcel/generic/FADD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FALOAD.java b/src/main/java/org/apache/bcel/generic/FALOAD.java index 8c1d742b..7c6202f0 100644 --- a/src/main/java/org/apache/bcel/generic/FALOAD.java +++ b/src/main/java/org/apache/bcel/generic/FALOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FASTORE.java b/src/main/java/org/apache/bcel/generic/FASTORE.java index 953d453b..a8721b3c 100644 --- a/src/main/java/org/apache/bcel/generic/FASTORE.java +++ b/src/main/java/org/apache/bcel/generic/FASTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FCMPG.java b/src/main/java/org/apache/bcel/generic/FCMPG.java index 0bae1261..4c4734cf 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPG.java +++ b/src/main/java/org/apache/bcel/generic/FCMPG.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FCMPL.java b/src/main/java/org/apache/bcel/generic/FCMPL.java index db60ba30..0d7116ed 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPL.java +++ b/src/main/java/org/apache/bcel/generic/FCMPL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FCONST.java b/src/main/java/org/apache/bcel/generic/FCONST.java index 612687e4..9c543adf 100644 --- a/src/main/java/org/apache/bcel/generic/FCONST.java +++ b/src/main/java/org/apache/bcel/generic/FCONST.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FDIV.java b/src/main/java/org/apache/bcel/generic/FDIV.java index d1bf86c7..9551e2da 100644 --- a/src/main/java/org/apache/bcel/generic/FDIV.java +++ b/src/main/java/org/apache/bcel/generic/FDIV.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FLOAD.java b/src/main/java/org/apache/bcel/generic/FLOAD.java index cb42ef08..cc1b62bb 100644 --- a/src/main/java/org/apache/bcel/generic/FLOAD.java +++ b/src/main/java/org/apache/bcel/generic/FLOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FMUL.java b/src/main/java/org/apache/bcel/generic/FMUL.java index 466e63aa..1a3766d3 100644 --- a/src/main/java/org/apache/bcel/generic/FMUL.java +++ b/src/main/java/org/apache/bcel/generic/FMUL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FNEG.java b/src/main/java/org/apache/bcel/generic/FNEG.java index 9362168d..954c5861 100644 --- a/src/main/java/org/apache/bcel/generic/FNEG.java +++ b/src/main/java/org/apache/bcel/generic/FNEG.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FREM.java b/src/main/java/org/apache/bcel/generic/FREM.java index c2b2ea20..d0ef7f58 100644 --- a/src/main/java/org/apache/bcel/generic/FREM.java +++ b/src/main/java/org/apache/bcel/generic/FREM.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FRETURN.java b/src/main/java/org/apache/bcel/generic/FRETURN.java index 0ef60797..eb96fd59 100644 --- a/src/main/java/org/apache/bcel/generic/FRETURN.java +++ b/src/main/java/org/apache/bcel/generic/FRETURN.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FSTORE.java b/src/main/java/org/apache/bcel/generic/FSTORE.java index 6b85fa1e..f7e58c8b 100644 --- a/src/main/java/org/apache/bcel/generic/FSTORE.java +++ b/src/main/java/org/apache/bcel/generic/FSTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FSUB.java b/src/main/java/org/apache/bcel/generic/FSUB.java index 886a5cc7..24811b87 100644 --- a/src/main/java/org/apache/bcel/generic/FSUB.java +++ b/src/main/java/org/apache/bcel/generic/FSUB.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index 2d0218ec..a9aca9f2 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index c5af2463..0cc3440a 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FieldInstruction.java b/src/main/java/org/apache/bcel/generic/FieldInstruction.java index f6e9344f..fff77edd 100644 --- a/src/main/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/main/java/org/apache/bcel/generic/FieldInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FieldObserver.java b/src/main/java/org/apache/bcel/generic/FieldObserver.java index 08efc25c..a492c5a6 100644 --- a/src/main/java/org/apache/bcel/generic/FieldObserver.java +++ b/src/main/java/org/apache/bcel/generic/FieldObserver.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java index dbdeaca8..13be9931 100644 --- a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/GETFIELD.java b/src/main/java/org/apache/bcel/generic/GETFIELD.java index 02bce98a..9ad617d2 100644 --- a/src/main/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/main/java/org/apache/bcel/generic/GETFIELD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/GETSTATIC.java b/src/main/java/org/apache/bcel/generic/GETSTATIC.java index e4a19334..0494c99b 100644 --- a/src/main/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/GETSTATIC.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/GOTO.java b/src/main/java/org/apache/bcel/generic/GOTO.java index 200ecfef..e5a90d8d 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO.java +++ b/src/main/java/org/apache/bcel/generic/GOTO.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/GOTO_W.java b/src/main/java/org/apache/bcel/generic/GOTO_W.java index c17f4027..8e0ba6e4 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO_W.java +++ b/src/main/java/org/apache/bcel/generic/GOTO_W.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/GotoInstruction.java b/src/main/java/org/apache/bcel/generic/GotoInstruction.java index ed786606..34089b0d 100644 --- a/src/main/java/org/apache/bcel/generic/GotoInstruction.java +++ b/src/main/java/org/apache/bcel/generic/GotoInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/I2B.java b/src/main/java/org/apache/bcel/generic/I2B.java index 282b7a44..cb8bec28 100644 --- a/src/main/java/org/apache/bcel/generic/I2B.java +++ b/src/main/java/org/apache/bcel/generic/I2B.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/I2C.java b/src/main/java/org/apache/bcel/generic/I2C.java index 9a253392..bb1129c2 100644 --- a/src/main/java/org/apache/bcel/generic/I2C.java +++ b/src/main/java/org/apache/bcel/generic/I2C.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/I2D.java b/src/main/java/org/apache/bcel/generic/I2D.java index b09146ac..4b73c45b 100644 --- a/src/main/java/org/apache/bcel/generic/I2D.java +++ b/src/main/java/org/apache/bcel/generic/I2D.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/I2F.java b/src/main/java/org/apache/bcel/generic/I2F.java index 77606df1..3f812c0a 100644 --- a/src/main/java/org/apache/bcel/generic/I2F.java +++ b/src/main/java/org/apache/bcel/generic/I2F.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/I2L.java b/src/main/java/org/apache/bcel/generic/I2L.java index 7d5549ca..855a48d7 100644 --- a/src/main/java/org/apache/bcel/generic/I2L.java +++ b/src/main/java/org/apache/bcel/generic/I2L.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/I2S.java b/src/main/java/org/apache/bcel/generic/I2S.java index 6de155bf..7e5b44e3 100644 --- a/src/main/java/org/apache/bcel/generic/I2S.java +++ b/src/main/java/org/apache/bcel/generic/I2S.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IADD.java b/src/main/java/org/apache/bcel/generic/IADD.java index e2abc24b..4b8511e5 100644 --- a/src/main/java/org/apache/bcel/generic/IADD.java +++ b/src/main/java/org/apache/bcel/generic/IADD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IALOAD.java b/src/main/java/org/apache/bcel/generic/IALOAD.java index c13a83b7..6766e62c 100644 --- a/src/main/java/org/apache/bcel/generic/IALOAD.java +++ b/src/main/java/org/apache/bcel/generic/IALOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IAND.java b/src/main/java/org/apache/bcel/generic/IAND.java index b7768557..c452b233 100644 --- a/src/main/java/org/apache/bcel/generic/IAND.java +++ b/src/main/java/org/apache/bcel/generic/IAND.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IASTORE.java b/src/main/java/org/apache/bcel/generic/IASTORE.java index f8ef94d2..f858e470 100644 --- a/src/main/java/org/apache/bcel/generic/IASTORE.java +++ b/src/main/java/org/apache/bcel/generic/IASTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ICONST.java b/src/main/java/org/apache/bcel/generic/ICONST.java index b0cf351d..fcae6f49 100644 --- a/src/main/java/org/apache/bcel/generic/ICONST.java +++ b/src/main/java/org/apache/bcel/generic/ICONST.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IDIV.java b/src/main/java/org/apache/bcel/generic/IDIV.java index 89cb8a56..ce2a6577 100644 --- a/src/main/java/org/apache/bcel/generic/IDIV.java +++ b/src/main/java/org/apache/bcel/generic/IDIV.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IFEQ.java b/src/main/java/org/apache/bcel/generic/IFEQ.java index ef303fb6..5f8cd07f 100644 --- a/src/main/java/org/apache/bcel/generic/IFEQ.java +++ b/src/main/java/org/apache/bcel/generic/IFEQ.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IFGE.java b/src/main/java/org/apache/bcel/generic/IFGE.java index b0623673..2b35a74b 100644 --- a/src/main/java/org/apache/bcel/generic/IFGE.java +++ b/src/main/java/org/apache/bcel/generic/IFGE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IFGT.java b/src/main/java/org/apache/bcel/generic/IFGT.java index b9e35a8c..3897fa1d 100644 --- a/src/main/java/org/apache/bcel/generic/IFGT.java +++ b/src/main/java/org/apache/bcel/generic/IFGT.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IFLE.java b/src/main/java/org/apache/bcel/generic/IFLE.java index 23f333d1..00b89f7b 100644 --- a/src/main/java/org/apache/bcel/generic/IFLE.java +++ b/src/main/java/org/apache/bcel/generic/IFLE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IFLT.java b/src/main/java/org/apache/bcel/generic/IFLT.java index 774a91d7..59eebe08 100644 --- a/src/main/java/org/apache/bcel/generic/IFLT.java +++ b/src/main/java/org/apache/bcel/generic/IFLT.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IFNE.java b/src/main/java/org/apache/bcel/generic/IFNE.java index 9175f9b2..318be5dc 100644 --- a/src/main/java/org/apache/bcel/generic/IFNE.java +++ b/src/main/java/org/apache/bcel/generic/IFNE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IFNONNULL.java b/src/main/java/org/apache/bcel/generic/IFNONNULL.java index bccdd699..27c6d397 100644 --- a/src/main/java/org/apache/bcel/generic/IFNONNULL.java +++ b/src/main/java/org/apache/bcel/generic/IFNONNULL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IFNULL.java b/src/main/java/org/apache/bcel/generic/IFNULL.java index 430c9dae..a5ee1fe0 100644 --- a/src/main/java/org/apache/bcel/generic/IFNULL.java +++ b/src/main/java/org/apache/bcel/generic/IFNULL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java index 8bfc724f..f78f9d76 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java +++ b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java index 88b86e8b..61ba4b5e 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java index 9be1881c..5f5970fd 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java index 94a96b80..8dd3274b 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java index 9e600f26..4448f0a8 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java index 03a22246..a83ffeca 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java index fda1b7a5..793b81a1 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java index 103fb806..53e56bf6 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IINC.java b/src/main/java/org/apache/bcel/generic/IINC.java index 0984686f..24ed319c 100644 --- a/src/main/java/org/apache/bcel/generic/IINC.java +++ b/src/main/java/org/apache/bcel/generic/IINC.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ILOAD.java b/src/main/java/org/apache/bcel/generic/ILOAD.java index 7cc455aa..33610902 100644 --- a/src/main/java/org/apache/bcel/generic/ILOAD.java +++ b/src/main/java/org/apache/bcel/generic/ILOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP1.java b/src/main/java/org/apache/bcel/generic/IMPDEP1.java index b6c0673e..5a0955aa 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP1.java +++ b/src/main/java/org/apache/bcel/generic/IMPDEP1.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP2.java b/src/main/java/org/apache/bcel/generic/IMPDEP2.java index cbc3d072..39fc5cb4 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP2.java +++ b/src/main/java/org/apache/bcel/generic/IMPDEP2.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IMUL.java b/src/main/java/org/apache/bcel/generic/IMUL.java index 898e8169..32decd9e 100644 --- a/src/main/java/org/apache/bcel/generic/IMUL.java +++ b/src/main/java/org/apache/bcel/generic/IMUL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/INEG.java b/src/main/java/org/apache/bcel/generic/INEG.java index 64e8092d..95615b17 100644 --- a/src/main/java/org/apache/bcel/generic/INEG.java +++ b/src/main/java/org/apache/bcel/generic/INEG.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java index f761b70f..1041ec6b 100644 --- a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java +++ b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java index 15d052cb..d30be00b 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java index 762c7eac..b3937340 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java index 13312e2c..d70f600f 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java index 7e8beef3..93476e00 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IOR.java b/src/main/java/org/apache/bcel/generic/IOR.java index e6fe4376..1c81d541 100644 --- a/src/main/java/org/apache/bcel/generic/IOR.java +++ b/src/main/java/org/apache/bcel/generic/IOR.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IREM.java b/src/main/java/org/apache/bcel/generic/IREM.java index fd393622..4f15bb16 100644 --- a/src/main/java/org/apache/bcel/generic/IREM.java +++ b/src/main/java/org/apache/bcel/generic/IREM.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IRETURN.java b/src/main/java/org/apache/bcel/generic/IRETURN.java index 2ab6e054..938696c0 100644 --- a/src/main/java/org/apache/bcel/generic/IRETURN.java +++ b/src/main/java/org/apache/bcel/generic/IRETURN.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ISHL.java b/src/main/java/org/apache/bcel/generic/ISHL.java index d6d652bb..4b569373 100644 --- a/src/main/java/org/apache/bcel/generic/ISHL.java +++ b/src/main/java/org/apache/bcel/generic/ISHL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ISHR.java b/src/main/java/org/apache/bcel/generic/ISHR.java index db615fc1..3e8874e3 100644 --- a/src/main/java/org/apache/bcel/generic/ISHR.java +++ b/src/main/java/org/apache/bcel/generic/ISHR.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ISTORE.java b/src/main/java/org/apache/bcel/generic/ISTORE.java index 9b432487..fda96e31 100644 --- a/src/main/java/org/apache/bcel/generic/ISTORE.java +++ b/src/main/java/org/apache/bcel/generic/ISTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ISUB.java b/src/main/java/org/apache/bcel/generic/ISUB.java index 248a6b8e..1595f315 100644 --- a/src/main/java/org/apache/bcel/generic/ISUB.java +++ b/src/main/java/org/apache/bcel/generic/ISUB.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IUSHR.java b/src/main/java/org/apache/bcel/generic/IUSHR.java index f7d3be03..1057dd84 100644 --- a/src/main/java/org/apache/bcel/generic/IUSHR.java +++ b/src/main/java/org/apache/bcel/generic/IUSHR.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IXOR.java b/src/main/java/org/apache/bcel/generic/IXOR.java index 8457c2a2..c9fb009d 100644 --- a/src/main/java/org/apache/bcel/generic/IXOR.java +++ b/src/main/java/org/apache/bcel/generic/IXOR.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IfInstruction.java b/src/main/java/org/apache/bcel/generic/IfInstruction.java index 0e0f4e6b..56da6a35 100644 --- a/src/main/java/org/apache/bcel/generic/IfInstruction.java +++ b/src/main/java/org/apache/bcel/generic/IfInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/IndexedInstruction.java b/src/main/java/org/apache/bcel/generic/IndexedInstruction.java index 83739a92..2dcf5952 100644 --- a/src/main/java/org/apache/bcel/generic/IndexedInstruction.java +++ b/src/main/java/org/apache/bcel/generic/IndexedInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index 068658ab..86773bdb 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/InstructionComparator.java b/src/main/java/org/apache/bcel/generic/InstructionComparator.java index 89856b24..6d7dd3e0 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionComparator.java +++ b/src/main/java/org/apache/bcel/generic/InstructionComparator.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/InstructionConstants.java b/src/main/java/org/apache/bcel/generic/InstructionConstants.java index 6fcc332d..c44e9f21 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionConstants.java +++ b/src/main/java/org/apache/bcel/generic/InstructionConstants.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index c3ec8450..9002ca05 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java index 1e856758..6688fe88 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/main/java/org/apache/bcel/generic/InstructionHandle.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 1c42c4a0..24ed1dbf 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/InstructionListObserver.java b/src/main/java/org/apache/bcel/generic/InstructionListObserver.java index 4b08a586..26ba5ba8 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionListObserver.java +++ b/src/main/java/org/apache/bcel/generic/InstructionListObserver.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/InstructionTargeter.java b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java index 33950e8c..689a5a60 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionTargeter.java +++ b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index d5ecac2c..4eb544ca 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/JSR.java b/src/main/java/org/apache/bcel/generic/JSR.java index bdfa0ca7..5913f1e6 100644 --- a/src/main/java/org/apache/bcel/generic/JSR.java +++ b/src/main/java/org/apache/bcel/generic/JSR.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/JSR_W.java b/src/main/java/org/apache/bcel/generic/JSR_W.java index a2eef673..af7c251f 100644 --- a/src/main/java/org/apache/bcel/generic/JSR_W.java +++ b/src/main/java/org/apache/bcel/generic/JSR_W.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/JsrInstruction.java b/src/main/java/org/apache/bcel/generic/JsrInstruction.java index d433240a..5d7db734 100644 --- a/src/main/java/org/apache/bcel/generic/JsrInstruction.java +++ b/src/main/java/org/apache/bcel/generic/JsrInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/L2D.java b/src/main/java/org/apache/bcel/generic/L2D.java index dd921a04..af3ac02c 100644 --- a/src/main/java/org/apache/bcel/generic/L2D.java +++ b/src/main/java/org/apache/bcel/generic/L2D.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/L2F.java b/src/main/java/org/apache/bcel/generic/L2F.java index 3f8973a6..924471ff 100644 --- a/src/main/java/org/apache/bcel/generic/L2F.java +++ b/src/main/java/org/apache/bcel/generic/L2F.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/L2I.java b/src/main/java/org/apache/bcel/generic/L2I.java index 18d0d5cd..c67e0093 100644 --- a/src/main/java/org/apache/bcel/generic/L2I.java +++ b/src/main/java/org/apache/bcel/generic/L2I.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LADD.java b/src/main/java/org/apache/bcel/generic/LADD.java index 354b3a1f..497abbb6 100644 --- a/src/main/java/org/apache/bcel/generic/LADD.java +++ b/src/main/java/org/apache/bcel/generic/LADD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LALOAD.java b/src/main/java/org/apache/bcel/generic/LALOAD.java index 780fdc10..e2d31047 100644 --- a/src/main/java/org/apache/bcel/generic/LALOAD.java +++ b/src/main/java/org/apache/bcel/generic/LALOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LAND.java b/src/main/java/org/apache/bcel/generic/LAND.java index cca08d55..fa17a9b9 100644 --- a/src/main/java/org/apache/bcel/generic/LAND.java +++ b/src/main/java/org/apache/bcel/generic/LAND.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LASTORE.java b/src/main/java/org/apache/bcel/generic/LASTORE.java index cbb6f52c..f75e0b1f 100644 --- a/src/main/java/org/apache/bcel/generic/LASTORE.java +++ b/src/main/java/org/apache/bcel/generic/LASTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LCMP.java b/src/main/java/org/apache/bcel/generic/LCMP.java index 8c8528d8..86e648ef 100644 --- a/src/main/java/org/apache/bcel/generic/LCMP.java +++ b/src/main/java/org/apache/bcel/generic/LCMP.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LCONST.java b/src/main/java/org/apache/bcel/generic/LCONST.java index 0d9d98cc..2ba57b11 100644 --- a/src/main/java/org/apache/bcel/generic/LCONST.java +++ b/src/main/java/org/apache/bcel/generic/LCONST.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java index d56fd92f..0a7f66b5 100644 --- a/src/main/java/org/apache/bcel/generic/LDC.java +++ b/src/main/java/org/apache/bcel/generic/LDC.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LDC2_W.java b/src/main/java/org/apache/bcel/generic/LDC2_W.java index 9f7d22bf..b0bd5a16 100644 --- a/src/main/java/org/apache/bcel/generic/LDC2_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC2_W.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LDC_W.java b/src/main/java/org/apache/bcel/generic/LDC_W.java index 93d06a7c..715d720d 100644 --- a/src/main/java/org/apache/bcel/generic/LDC_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC_W.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LDIV.java b/src/main/java/org/apache/bcel/generic/LDIV.java index fe029e33..072a71f9 100644 --- a/src/main/java/org/apache/bcel/generic/LDIV.java +++ b/src/main/java/org/apache/bcel/generic/LDIV.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LLOAD.java b/src/main/java/org/apache/bcel/generic/LLOAD.java index 06e269cf..c3a0a03f 100644 --- a/src/main/java/org/apache/bcel/generic/LLOAD.java +++ b/src/main/java/org/apache/bcel/generic/LLOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LMUL.java b/src/main/java/org/apache/bcel/generic/LMUL.java index 9b3bec1d..204ea831 100644 --- a/src/main/java/org/apache/bcel/generic/LMUL.java +++ b/src/main/java/org/apache/bcel/generic/LMUL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LNEG.java b/src/main/java/org/apache/bcel/generic/LNEG.java index a31fec31..880a365b 100644 --- a/src/main/java/org/apache/bcel/generic/LNEG.java +++ b/src/main/java/org/apache/bcel/generic/LNEG.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java index 752d203e..72b16303 100644 --- a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java +++ b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LOR.java b/src/main/java/org/apache/bcel/generic/LOR.java index a6853caa..3d7f3220 100644 --- a/src/main/java/org/apache/bcel/generic/LOR.java +++ b/src/main/java/org/apache/bcel/generic/LOR.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LREM.java b/src/main/java/org/apache/bcel/generic/LREM.java index 15a296de..74372dcc 100644 --- a/src/main/java/org/apache/bcel/generic/LREM.java +++ b/src/main/java/org/apache/bcel/generic/LREM.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LRETURN.java b/src/main/java/org/apache/bcel/generic/LRETURN.java index 23afd27f..8f562de1 100644 --- a/src/main/java/org/apache/bcel/generic/LRETURN.java +++ b/src/main/java/org/apache/bcel/generic/LRETURN.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LSHL.java b/src/main/java/org/apache/bcel/generic/LSHL.java index 19a121a4..73a274cc 100644 --- a/src/main/java/org/apache/bcel/generic/LSHL.java +++ b/src/main/java/org/apache/bcel/generic/LSHL.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LSHR.java b/src/main/java/org/apache/bcel/generic/LSHR.java index 5a3c0924..398215f4 100644 --- a/src/main/java/org/apache/bcel/generic/LSHR.java +++ b/src/main/java/org/apache/bcel/generic/LSHR.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LSTORE.java b/src/main/java/org/apache/bcel/generic/LSTORE.java index ddb44ba3..1eed26fd 100644 --- a/src/main/java/org/apache/bcel/generic/LSTORE.java +++ b/src/main/java/org/apache/bcel/generic/LSTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LSUB.java b/src/main/java/org/apache/bcel/generic/LSUB.java index df3cb51e..a36102da 100644 --- a/src/main/java/org/apache/bcel/generic/LSUB.java +++ b/src/main/java/org/apache/bcel/generic/LSUB.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LUSHR.java b/src/main/java/org/apache/bcel/generic/LUSHR.java index 684007f0..4d732f11 100644 --- a/src/main/java/org/apache/bcel/generic/LUSHR.java +++ b/src/main/java/org/apache/bcel/generic/LUSHR.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LXOR.java b/src/main/java/org/apache/bcel/generic/LXOR.java index 1beb0fa3..0c49c846 100644 --- a/src/main/java/org/apache/bcel/generic/LXOR.java +++ b/src/main/java/org/apache/bcel/generic/LXOR.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LineNumberGen.java b/src/main/java/org/apache/bcel/generic/LineNumberGen.java index 0fc4ffca..9c2d9891 100644 --- a/src/main/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/main/java/org/apache/bcel/generic/LineNumberGen.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LoadClass.java b/src/main/java/org/apache/bcel/generic/LoadClass.java index af2cb26a..6a503a80 100644 --- a/src/main/java/org/apache/bcel/generic/LoadClass.java +++ b/src/main/java/org/apache/bcel/generic/LoadClass.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LoadInstruction.java b/src/main/java/org/apache/bcel/generic/LoadInstruction.java index 86dcc778..f3a2bd1a 100644 --- a/src/main/java/org/apache/bcel/generic/LoadInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LoadInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java index 6a65fd68..0e1ae399 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java index 9e5173d8..3d623ab6 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/MONITORENTER.java b/src/main/java/org/apache/bcel/generic/MONITORENTER.java index 4582753d..501aecf0 100644 --- a/src/main/java/org/apache/bcel/generic/MONITORENTER.java +++ b/src/main/java/org/apache/bcel/generic/MONITORENTER.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java index 3e4cab6c..e215d8cd 100644 --- a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java +++ b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java index e319fe7f..4b2639ff 100644 --- a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 78a8aa44..ec1a98d6 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/MethodObserver.java b/src/main/java/org/apache/bcel/generic/MethodObserver.java index 8badfb2c..125ef957 100644 --- a/src/main/java/org/apache/bcel/generic/MethodObserver.java +++ b/src/main/java/org/apache/bcel/generic/MethodObserver.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/NEW.java b/src/main/java/org/apache/bcel/generic/NEW.java index 33a39834..9dea3a54 100644 --- a/src/main/java/org/apache/bcel/generic/NEW.java +++ b/src/main/java/org/apache/bcel/generic/NEW.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/NEWARRAY.java b/src/main/java/org/apache/bcel/generic/NEWARRAY.java index f1d21e28..31833e36 100644 --- a/src/main/java/org/apache/bcel/generic/NEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/NEWARRAY.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/NOP.java b/src/main/java/org/apache/bcel/generic/NOP.java index 696e8eaa..6294ee8b 100644 --- a/src/main/java/org/apache/bcel/generic/NOP.java +++ b/src/main/java/org/apache/bcel/generic/NOP.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/NamedAndTyped.java b/src/main/java/org/apache/bcel/generic/NamedAndTyped.java index 1f6287a0..596cc833 100644 --- a/src/main/java/org/apache/bcel/generic/NamedAndTyped.java +++ b/src/main/java/org/apache/bcel/generic/NamedAndTyped.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index ea5f3df8..94ca0c51 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/POP.java b/src/main/java/org/apache/bcel/generic/POP.java index adcb1ec2..e8a03891 100644 --- a/src/main/java/org/apache/bcel/generic/POP.java +++ b/src/main/java/org/apache/bcel/generic/POP.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/POP2.java b/src/main/java/org/apache/bcel/generic/POP2.java index 474a2800..8bab143b 100644 --- a/src/main/java/org/apache/bcel/generic/POP2.java +++ b/src/main/java/org/apache/bcel/generic/POP2.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/PUSH.java b/src/main/java/org/apache/bcel/generic/PUSH.java index 97a19923..1d0ecc74 100644 --- a/src/main/java/org/apache/bcel/generic/PUSH.java +++ b/src/main/java/org/apache/bcel/generic/PUSH.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/PUTFIELD.java b/src/main/java/org/apache/bcel/generic/PUTFIELD.java index d64f7b1d..97cfaca5 100644 --- a/src/main/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/main/java/org/apache/bcel/generic/PUTFIELD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java index 137e41c6..3c492ce8 100644 --- a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/PopInstruction.java b/src/main/java/org/apache/bcel/generic/PopInstruction.java index 7d8fa80e..e4542b73 100644 --- a/src/main/java/org/apache/bcel/generic/PopInstruction.java +++ b/src/main/java/org/apache/bcel/generic/PopInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/PushInstruction.java b/src/main/java/org/apache/bcel/generic/PushInstruction.java index b514daa1..378a3448 100644 --- a/src/main/java/org/apache/bcel/generic/PushInstruction.java +++ b/src/main/java/org/apache/bcel/generic/PushInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/RET.java b/src/main/java/org/apache/bcel/generic/RET.java index 4d0dfa98..a9e528cc 100644 --- a/src/main/java/org/apache/bcel/generic/RET.java +++ b/src/main/java/org/apache/bcel/generic/RET.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/RETURN.java b/src/main/java/org/apache/bcel/generic/RETURN.java index c6c34320..3014a875 100644 --- a/src/main/java/org/apache/bcel/generic/RETURN.java +++ b/src/main/java/org/apache/bcel/generic/RETURN.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ReferenceType.java b/src/main/java/org/apache/bcel/generic/ReferenceType.java index 97e6c502..34ad1f94 100644 --- a/src/main/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/main/java/org/apache/bcel/generic/ReferenceType.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ReturnInstruction.java b/src/main/java/org/apache/bcel/generic/ReturnInstruction.java index c7077d9e..09a64cd4 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ReturnInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java index 0cd59c4e..b43eab88 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/SALOAD.java b/src/main/java/org/apache/bcel/generic/SALOAD.java index 99f45e06..1455be67 100644 --- a/src/main/java/org/apache/bcel/generic/SALOAD.java +++ b/src/main/java/org/apache/bcel/generic/SALOAD.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/SASTORE.java b/src/main/java/org/apache/bcel/generic/SASTORE.java index b7002096..54180b7d 100644 --- a/src/main/java/org/apache/bcel/generic/SASTORE.java +++ b/src/main/java/org/apache/bcel/generic/SASTORE.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/SIPUSH.java b/src/main/java/org/apache/bcel/generic/SIPUSH.java index 7635fc55..be870b44 100644 --- a/src/main/java/org/apache/bcel/generic/SIPUSH.java +++ b/src/main/java/org/apache/bcel/generic/SIPUSH.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/SWAP.java b/src/main/java/org/apache/bcel/generic/SWAP.java index 95d20a6a..e28e42e5 100644 --- a/src/main/java/org/apache/bcel/generic/SWAP.java +++ b/src/main/java/org/apache/bcel/generic/SWAP.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/SWITCH.java b/src/main/java/org/apache/bcel/generic/SWITCH.java index 02b65549..1e1d5ded 100644 --- a/src/main/java/org/apache/bcel/generic/SWITCH.java +++ b/src/main/java/org/apache/bcel/generic/SWITCH.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index 1f13c8ad..a0d19b3e 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/StackConsumer.java b/src/main/java/org/apache/bcel/generic/StackConsumer.java index 2fad91a3..508221a3 100644 --- a/src/main/java/org/apache/bcel/generic/StackConsumer.java +++ b/src/main/java/org/apache/bcel/generic/StackConsumer.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/StackInstruction.java b/src/main/java/org/apache/bcel/generic/StackInstruction.java index 69d777ca..c670e2f3 100644 --- a/src/main/java/org/apache/bcel/generic/StackInstruction.java +++ b/src/main/java/org/apache/bcel/generic/StackInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/StackProducer.java b/src/main/java/org/apache/bcel/generic/StackProducer.java index ce375b1b..9ada6d16 100644 --- a/src/main/java/org/apache/bcel/generic/StackProducer.java +++ b/src/main/java/org/apache/bcel/generic/StackProducer.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/StoreInstruction.java b/src/main/java/org/apache/bcel/generic/StoreInstruction.java index fd5907cb..410037f0 100644 --- a/src/main/java/org/apache/bcel/generic/StoreInstruction.java +++ b/src/main/java/org/apache/bcel/generic/StoreInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java index 0ce9e4d1..3917b1d3 100644 --- a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/TargetLostException.java b/src/main/java/org/apache/bcel/generic/TargetLostException.java index a4ca5155..888664a1 100644 --- a/src/main/java/org/apache/bcel/generic/TargetLostException.java +++ b/src/main/java/org/apache/bcel/generic/TargetLostException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index cb7e5603..27a8015e 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/TypedInstruction.java b/src/main/java/org/apache/bcel/generic/TypedInstruction.java index df31a610..42ce16a2 100644 --- a/src/main/java/org/apache/bcel/generic/TypedInstruction.java +++ b/src/main/java/org/apache/bcel/generic/TypedInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java b/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java index c488a178..ba62a2f3 100644 --- a/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java +++ b/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java b/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java index e4425696..b70978bf 100644 --- a/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java +++ b/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/generic/Visitor.java b/src/main/java/org/apache/bcel/generic/Visitor.java index 39624232..71c7d8c1 100644 --- a/src/main/java/org/apache/bcel/generic/Visitor.java +++ b/src/main/java/org/apache/bcel/generic/Visitor.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java index f3629bf5..cbed280e 100644 --- a/src/main/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/main/java/org/apache/bcel/util/AttributeHTML.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/BCELComparator.java b/src/main/java/org/apache/bcel/util/BCELComparator.java index 87eed0a0..5894376e 100644 --- a/src/main/java/org/apache/bcel/util/BCELComparator.java +++ b/src/main/java/org/apache/bcel/util/BCELComparator.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index a2b8d074..021ba81b 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/BCELifier.java b/src/main/java/org/apache/bcel/util/BCELifier.java index 9ed6e462..44c1da8c 100644 --- a/src/main/java/org/apache/bcel/util/BCELifier.java +++ b/src/main/java/org/apache/bcel/util/BCELifier.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/ByteSequence.java b/src/main/java/org/apache/bcel/util/ByteSequence.java index a1d62cc2..565cdec5 100644 --- a/src/main/java/org/apache/bcel/util/ByteSequence.java +++ b/src/main/java/org/apache/bcel/util/ByteSequence.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index 85ba6b55..d4864801 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/ClassLoader.java b/src/main/java/org/apache/bcel/util/ClassLoader.java index 9f0a9e3e..7a383422 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoader.java +++ b/src/main/java/org/apache/bcel/util/ClassLoader.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java index 1361477e..445fe8ce 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 1e934e9f..7fd53b20 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/ClassQueue.java b/src/main/java/org/apache/bcel/util/ClassQueue.java index 152b744d..accf6703 100644 --- a/src/main/java/org/apache/bcel/util/ClassQueue.java +++ b/src/main/java/org/apache/bcel/util/ClassQueue.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/ClassSet.java b/src/main/java/org/apache/bcel/util/ClassSet.java index f42bf058..1b79cb89 100644 --- a/src/main/java/org/apache/bcel/util/ClassSet.java +++ b/src/main/java/org/apache/bcel/util/ClassSet.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/ClassStack.java b/src/main/java/org/apache/bcel/util/ClassStack.java index 5fad9aea..c7933628 100644 --- a/src/main/java/org/apache/bcel/util/ClassStack.java +++ b/src/main/java/org/apache/bcel/util/ClassStack.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/ClassVector.java b/src/main/java/org/apache/bcel/util/ClassVector.java index 32e88822..1ddbb4e6 100644 --- a/src/main/java/org/apache/bcel/util/ClassVector.java +++ b/src/main/java/org/apache/bcel/util/ClassVector.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 1cfed10a..e8efca4a 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/ConstantHTML.java b/src/main/java/org/apache/bcel/util/ConstantHTML.java index 48b733f7..d8db6ec4 100644 --- a/src/main/java/org/apache/bcel/util/ConstantHTML.java +++ b/src/main/java/org/apache/bcel/util/ConstantHTML.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index 29902ff6..3d0ea89b 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/JavaWrapper.java b/src/main/java/org/apache/bcel/util/JavaWrapper.java index f3feb298..6d63cad4 100644 --- a/src/main/java/org/apache/bcel/util/JavaWrapper.java +++ b/src/main/java/org/apache/bcel/util/JavaWrapper.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/MethodHTML.java b/src/main/java/org/apache/bcel/util/MethodHTML.java index b38d4055..0a11deee 100644 --- a/src/main/java/org/apache/bcel/util/MethodHTML.java +++ b/src/main/java/org/apache/bcel/util/MethodHTML.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/Repository.java b/src/main/java/org/apache/bcel/util/Repository.java index b94d874b..76e45d1f 100644 --- a/src/main/java/org/apache/bcel/util/Repository.java +++ b/src/main/java/org/apache/bcel/util/Repository.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index d84875f6..37f8b177 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java index 7dbee639..264068a6 100644 --- a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java index f444dd7c..26f70eed 100644 --- a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/PassVerifier.java b/src/main/java/org/apache/bcel/verifier/PassVerifier.java index 9a14c13b..31845a15 100644 --- a/src/main/java/org/apache/bcel/verifier/PassVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/PassVerifier.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java index bbc2b9f6..e5156514 100644 --- a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java +++ b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/VerificationResult.java b/src/main/java/org/apache/bcel/verifier/VerificationResult.java index 1af57e02..ca3b3b76 100644 --- a/src/main/java/org/apache/bcel/verifier/VerificationResult.java +++ b/src/main/java/org/apache/bcel/verifier/VerificationResult.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/Verifier.java b/src/main/java/org/apache/bcel/verifier/Verifier.java index 6e07577d..01ab385b 100644 --- a/src/main/java/org/apache/bcel/verifier/Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/Verifier.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index 1a40a7da..c6c4ca41 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java index 2d8a973a..1835e3f0 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index abf1950f..65f53cb7 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java index ea909328..b62ce47e 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java index 4bb12973..5658744b 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java index 11a88a40..73f30fe4 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java index 1ff8fb0a..c9243265 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java index 7b5d1230..84ef57e2 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java index 79ab38b3..afb49a17 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java index 38949ab1..a1b3e81e 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java index 03289611..f2324b7e 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java index 3e7809e2..46190c66 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java index d8c1f293..5d5acaca 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java index 088289d4..ff50a9c6 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java index 0638101d..701c21d5 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/Utility.java b/src/main/java/org/apache/bcel/verifier/exc/Utility.java index 302e3525..ffcba749 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/Utility.java +++ b/src/main/java/org/apache/bcel/verifier/exc/Utility.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java index e96369e1..0fc23c3a 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java index 650da6dc..839356ae 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java index 4302abdb..a12339e7 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/statics/IntList.java b/src/main/java/org/apache/bcel/verifier/statics/IntList.java index 31e59207..040b1073 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/IntList.java +++ b/src/main/java/org/apache/bcel/verifier/statics/IntList.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java index 638e80a6..b65734f8 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java index 37ad9c67..ad209d14 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java index f5dbbd94..6c99ebde 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index c2825fcf..0cc0c025 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index eaf634f8..0feebf27 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index c4e6a5e0..6a249dc0 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 6f3b2475..1f575887 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index 53387e4e..11da32d4 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java index 0fd58cee..8b6ed4c7 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index 0c113c92..16478a23 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index 2a605d44..c3e12d9a 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Frame.java b/src/main/java/org/apache/bcel/verifier/structurals/Frame.java index 2a5502c8..c8997747 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Frame.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Frame.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java b/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java index d47ccd2d..b10b9cf3 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index d56017e1..1faabac4 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java index fa42db5f..4cb33947 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 199edb25..64149f1b 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java index 28976649..2dad1af5 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 8c5741f8..d29e752b 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java index 3eed0e62..1eda374b 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index 3fcf6249..c167c7c8 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index 096dc446..0101af4e 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * -- GitLab From 6f142ddb3c026f00145232ebe4a501f1520963ed Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 25 May 2010 00:52:23 +0000 Subject: [PATCH 0453/1313] Update to AL 2.0 header git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947881 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/HelloWorldBuilder.java | 11 ++++++----- src/examples/JasminVisitor.java | 11 ++++++----- src/examples/Mini/ASCII_CharStream.java | 11 ++++++----- src/examples/Mini/ASTExpr.java | 11 ++++++----- src/examples/Mini/ASTFactor.java | 11 ++++++----- src/examples/Mini/ASTFunAppl.java | 11 ++++++----- src/examples/Mini/ASTFunDecl.java | 11 ++++++----- src/examples/Mini/ASTIdent.java | 11 ++++++----- src/examples/Mini/ASTIfExpr.java | 11 ++++++----- src/examples/Mini/ASTInteger.java | 11 ++++++----- src/examples/Mini/ASTLetExpr.java | 11 ++++++----- src/examples/Mini/ASTProgram.java | 11 ++++++----- src/examples/Mini/ASTTerm.java | 11 ++++++----- src/examples/Mini/EnvEntry.java | 11 ++++++----- src/examples/Mini/Environment.java | 11 ++++++----- src/examples/Mini/Function.java | 11 ++++++----- src/examples/Mini/JJTMiniParserState.java | 11 ++++++----- src/examples/Mini/MiniC.java | 11 ++++++----- src/examples/Mini/MiniParser.java | 11 ++++++----- src/examples/Mini/MiniParserConstants.java | 11 ++++++----- src/examples/Mini/MiniParserTokenManager.java | 11 ++++++----- src/examples/Mini/MiniParserTreeConstants.java | 11 ++++++----- src/examples/Mini/Node.java | 11 ++++++----- src/examples/Mini/ParseException.java | 11 ++++++----- src/examples/Mini/SimpleNode.java | 11 ++++++----- src/examples/Mini/Token.java | 11 ++++++----- src/examples/Mini/TokenMgrError.java | 11 ++++++----- src/examples/Mini/Variable.java | 11 ++++++----- src/examples/Package.java | 11 ++++++----- src/examples/Peephole.java | 11 ++++++----- src/examples/ProxyCreator.java | 11 ++++++----- src/examples/TransitiveHull.java | 11 ++++++----- src/examples/helloify.java | 11 ++++++----- src/examples/id.java | 11 ++++++----- src/examples/listclass.java | 11 ++++++----- src/examples/maxstack.java | 11 ++++++----- src/examples/patchclass.java | 11 ++++++----- 37 files changed, 222 insertions(+), 185 deletions(-) diff --git a/src/examples/HelloWorldBuilder.java b/src/examples/HelloWorldBuilder.java index 12d74f41..d9f927f2 100644 --- a/src/examples/HelloWorldBuilder.java +++ b/src/examples/HelloWorldBuilder.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/JasminVisitor.java b/src/examples/JasminVisitor.java index fd89008f..e36cea87 100644 --- a/src/examples/JasminVisitor.java +++ b/src/examples/JasminVisitor.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/ASCII_CharStream.java b/src/examples/Mini/ASCII_CharStream.java index 5d01b5d3..cfb1704a 100644 --- a/src/examples/Mini/ASCII_CharStream.java +++ b/src/examples/Mini/ASCII_CharStream.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/ASTExpr.java b/src/examples/Mini/ASTExpr.java index e3bd992e..93ae3530 100644 --- a/src/examples/Mini/ASTExpr.java +++ b/src/examples/Mini/ASTExpr.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/ASTFactor.java b/src/examples/Mini/ASTFactor.java index cdf1cb8d..93e0ded8 100644 --- a/src/examples/Mini/ASTFactor.java +++ b/src/examples/Mini/ASTFactor.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/ASTFunAppl.java b/src/examples/Mini/ASTFunAppl.java index 8c7b0438..71f7bdb5 100644 --- a/src/examples/Mini/ASTFunAppl.java +++ b/src/examples/Mini/ASTFunAppl.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java index ac04b47f..18821248 100644 --- a/src/examples/Mini/ASTFunDecl.java +++ b/src/examples/Mini/ASTFunDecl.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/ASTIdent.java b/src/examples/Mini/ASTIdent.java index 6a504f43..2eb882be 100644 --- a/src/examples/Mini/ASTIdent.java +++ b/src/examples/Mini/ASTIdent.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/ASTIfExpr.java b/src/examples/Mini/ASTIfExpr.java index 790d6b84..5e0163f3 100644 --- a/src/examples/Mini/ASTIfExpr.java +++ b/src/examples/Mini/ASTIfExpr.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/ASTInteger.java b/src/examples/Mini/ASTInteger.java index 1402473e..83bcdc2d 100644 --- a/src/examples/Mini/ASTInteger.java +++ b/src/examples/Mini/ASTInteger.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/ASTLetExpr.java b/src/examples/Mini/ASTLetExpr.java index 2e6a2f6e..203c6d7f 100644 --- a/src/examples/Mini/ASTLetExpr.java +++ b/src/examples/Mini/ASTLetExpr.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java index ef089fda..41dd499b 100644 --- a/src/examples/Mini/ASTProgram.java +++ b/src/examples/Mini/ASTProgram.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/ASTTerm.java b/src/examples/Mini/ASTTerm.java index c286fc6b..fbbffa17 100644 --- a/src/examples/Mini/ASTTerm.java +++ b/src/examples/Mini/ASTTerm.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/EnvEntry.java b/src/examples/Mini/EnvEntry.java index 76f270a1..05121d09 100644 --- a/src/examples/Mini/EnvEntry.java +++ b/src/examples/Mini/EnvEntry.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/Environment.java b/src/examples/Mini/Environment.java index b4ae95f3..e85feeb2 100644 --- a/src/examples/Mini/Environment.java +++ b/src/examples/Mini/Environment.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/Function.java b/src/examples/Mini/Function.java index c3b740ba..e7d54423 100644 --- a/src/examples/Mini/Function.java +++ b/src/examples/Mini/Function.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/JJTMiniParserState.java b/src/examples/Mini/JJTMiniParserState.java index ec027960..53033701 100644 --- a/src/examples/Mini/JJTMiniParserState.java +++ b/src/examples/Mini/JJTMiniParserState.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/MiniC.java b/src/examples/Mini/MiniC.java index 8ab42d39..46c7d2b4 100644 --- a/src/examples/Mini/MiniC.java +++ b/src/examples/Mini/MiniC.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/MiniParser.java b/src/examples/Mini/MiniParser.java index 52bfddec..a5ce6c38 100644 --- a/src/examples/Mini/MiniParser.java +++ b/src/examples/Mini/MiniParser.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/MiniParserConstants.java b/src/examples/Mini/MiniParserConstants.java index 0a4c6c38..3a32c051 100644 --- a/src/examples/Mini/MiniParserConstants.java +++ b/src/examples/Mini/MiniParserConstants.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/MiniParserTokenManager.java b/src/examples/Mini/MiniParserTokenManager.java index cd43f966..8d3af42b 100644 --- a/src/examples/Mini/MiniParserTokenManager.java +++ b/src/examples/Mini/MiniParserTokenManager.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/MiniParserTreeConstants.java b/src/examples/Mini/MiniParserTreeConstants.java index 76ae9624..7c4c09cc 100644 --- a/src/examples/Mini/MiniParserTreeConstants.java +++ b/src/examples/Mini/MiniParserTreeConstants.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/Node.java b/src/examples/Mini/Node.java index a73987ac..e893d47f 100644 --- a/src/examples/Mini/Node.java +++ b/src/examples/Mini/Node.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/ParseException.java b/src/examples/Mini/ParseException.java index 7ebe8ea6..6e2d4884 100644 --- a/src/examples/Mini/ParseException.java +++ b/src/examples/Mini/ParseException.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/SimpleNode.java b/src/examples/Mini/SimpleNode.java index 7356482c..6c061e08 100644 --- a/src/examples/Mini/SimpleNode.java +++ b/src/examples/Mini/SimpleNode.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/Token.java b/src/examples/Mini/Token.java index 34770fde..f309f1b0 100644 --- a/src/examples/Mini/Token.java +++ b/src/examples/Mini/Token.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/TokenMgrError.java b/src/examples/Mini/TokenMgrError.java index ce84c40f..19f46cc0 100644 --- a/src/examples/Mini/TokenMgrError.java +++ b/src/examples/Mini/TokenMgrError.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Mini/Variable.java b/src/examples/Mini/Variable.java index 38158434..b8954be6 100644 --- a/src/examples/Mini/Variable.java +++ b/src/examples/Mini/Variable.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Package.java b/src/examples/Package.java index c58f0163..874e88f8 100644 --- a/src/examples/Package.java +++ b/src/examples/Package.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/Peephole.java b/src/examples/Peephole.java index 4e10e720..d308a507 100644 --- a/src/examples/Peephole.java +++ b/src/examples/Peephole.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/ProxyCreator.java b/src/examples/ProxyCreator.java index e6ffc9be..34b1d7bd 100644 --- a/src/examples/ProxyCreator.java +++ b/src/examples/ProxyCreator.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/TransitiveHull.java b/src/examples/TransitiveHull.java index d3eb0bf7..aad5b8c5 100644 --- a/src/examples/TransitiveHull.java +++ b/src/examples/TransitiveHull.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/helloify.java b/src/examples/helloify.java index ed70c896..685253fd 100644 --- a/src/examples/helloify.java +++ b/src/examples/helloify.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/id.java b/src/examples/id.java index e251940c..4d876aef 100644 --- a/src/examples/id.java +++ b/src/examples/id.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/listclass.java b/src/examples/listclass.java index a83304e1..4fd70f54 100644 --- a/src/examples/listclass.java +++ b/src/examples/listclass.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/maxstack.java b/src/examples/maxstack.java index 065bcf24..79b5a38a 100644 --- a/src/examples/maxstack.java +++ b/src/examples/maxstack.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * diff --git a/src/examples/patchclass.java b/src/examples/patchclass.java index 5ca18e85..6403d9ea 100644 --- a/src/examples/patchclass.java +++ b/src/examples/patchclass.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * -- GitLab From aeb20939f149d3620b9b1dabce939f8a9acb2e04 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 25 May 2010 01:01:12 +0000 Subject: [PATCH 0454/1313] Add missing AL headers git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947883 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/generic/AnnotationElementValueGen.java | 17 +++++++++++++++++ .../apache/bcel/generic/AnnotationEntryGen.java | 17 +++++++++++++++++ .../bcel/generic/ArrayElementValueGen.java | 17 +++++++++++++++++ .../bcel/generic/ClassElementValueGen.java | 17 +++++++++++++++++ .../apache/bcel/generic/ElementValueGen.java | 17 +++++++++++++++++ .../bcel/generic/ElementValuePairGen.java | 17 +++++++++++++++++ .../bcel/generic/EnumElementValueGen.java | 17 +++++++++++++++++ .../bcel/generic/SimpleElementValueGen.java | 17 +++++++++++++++++ .../org/apache/bcel/verifier/exc/package.html | 16 ++++++++++++++++ .../apache/bcel/verifier/statics/package.html | 16 ++++++++++++++++ .../bcel/verifier/structurals/package.html | 16 ++++++++++++++++ .../GeneratingAnnotatedClassesTestCase.java | 17 +++++++++++++++++ 12 files changed, 201 insertions(+) diff --git a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java index e14dc6d6..b2b3f0b9 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.generic; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index f9295290..83dae8a1 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.generic; import java.io.DataInputStream; diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index 6aac1525..b11c71c2 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.generic; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java index 6767011a..bde38bc5 100644 --- a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.generic; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java index c49fba8d..1be6a4eb 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.generic; import java.io.DataInputStream; diff --git a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java index 81e69d41..78166ee2 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.generic; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java index 9dde1163..bd8342ac 100644 --- a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.generic; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java index e026d68e..0d558315 100644 --- a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.generic; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/verifier/exc/package.html b/src/main/java/org/apache/bcel/verifier/exc/package.html index 1ec56e3f..6d26aa6c 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/package.html +++ b/src/main/java/org/apache/bcel/verifier/exc/package.html @@ -1,4 +1,20 @@ + diff --git a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java index 3ea7ed99..cee40776 100644 --- a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel; import java.io.File; -- GitLab From 836982c4a5bab37dced5fc578c44020a84aee7c3 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 25 May 2010 01:05:01 +0000 Subject: [PATCH 0455/1313] Javadoc git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947885 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/classfile/AnnotationDefault.java | 4 ---- .../java/org/apache/bcel/classfile/LocalVariableTable.java | 2 -- 2 files changed, 6 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index cbb8173d..23d639b6 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -34,8 +34,6 @@ public class AnnotationDefault extends Attribute ElementValue default_value; /** - * @param annotation_type - * the subclass type of the annotation * @param name_index * Index pointing to the name Code * @param length @@ -55,8 +53,6 @@ public class AnnotationDefault extends Attribute } /** - * @param annotation_type - * the subclass type of the annotation * @param name_index * Index pointing to the name Code * @param length diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index fc959b09..e68c8570 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -114,7 +114,6 @@ public class LocalVariableTable extends Attribute { /** - * @return first matching variable using index * * @param index the variable slot * @@ -134,7 +133,6 @@ public class LocalVariableTable extends Attribute { /** - * @return matching variable using index when variable is used at supplied pc * * @param index the variable slot * @param pc the current pc that this variable is alive -- GitLab From 9cb003311e0869cd0a1cb9bb550d0f41c5ab78c4 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 25 May 2010 02:04:11 +0000 Subject: [PATCH 0456/1313] Fix for Bug 49332 - Type.getReturnTypeSize() doesn't decode Type.getTypeSize() output by Bill Pugh thanks git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@947894 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/Type.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 27a8015e..d93d1a85 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -366,6 +366,6 @@ public abstract class Type implements java.io.Serializable { static int getReturnTypeSize(String signature) { int index = signature.lastIndexOf(')') + 1; - return getTypeSize(signature.substring(index)); + return Type.size(getTypeSize(signature.substring(index))); } } -- GitLab From a6c987459b48b4e39b8e68ae5f85fc0f35d1bc31 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 25 May 2010 16:31:42 +0000 Subject: [PATCH 0457/1313] Make private immutable variables final git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@948092 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Attribute.java | 2 +- src/main/java/org/apache/bcel/classfile/Unknown.java | 2 +- src/main/java/org/apache/bcel/generic/InstructionFactory.java | 2 +- src/main/java/org/apache/bcel/generic/Type.java | 2 +- src/main/java/org/apache/bcel/util/SyntheticRepository.java | 2 +- src/main/java/org/apache/bcel/verifier/VerifierFactory.java | 4 ++-- .../java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java | 2 +- .../java/org/apache/bcel/verifier/statics/LONG_Upper.java | 2 +- .../bcel/verifier/structurals/InstConstraintVisitor.java | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 5641ca6a..96ed8db2 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -90,7 +90,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable file.writeInt(length); } - private static Map readers = new HashMap(); + private static final Map readers = new HashMap(); /** * Add an Attribute reader capable of parsing (user-defined) attributes diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index e67b6d71..d6c7194a 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -45,7 +45,7 @@ public final class Unknown extends Attribute { private byte[] bytes; private String name; - private static Map unknown_attributes = new HashMap(); + private static final Map unknown_attributes = new HashMap(); /** @return array of unknown attributes, but just one for each kind. diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index 9002ca05..bac4fb24 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -154,7 +154,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali return createInvoke(m.class_name, m.name, m.result_type, m.arg_types, kind); } - private static MethodObject[] append_mos = { + private static final MethodObject[] append_mos = { new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.STRING }, Constants.ACC_PUBLIC), diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index d93d1a85..2832dbde 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -144,7 +144,7 @@ public abstract class Type implements java.io.Serializable { return buf.toString(); } - private static ThreadLocal consumed_chars = new ThreadLocal() { + private static final ThreadLocal consumed_chars = new ThreadLocal() { protected Object initialValue() { return new Integer(0); diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index 37f8b177..2dc7e7b9 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -49,7 +49,7 @@ import org.apache.bcel.classfile.JavaClass; public class SyntheticRepository implements Repository { //private static final String DEFAULT_PATH = ClassPath.getClassPath(); - private static Map _instances = new HashMap(); // CLASSPATH X REPOSITORY + private static final Map _instances = new HashMap(); // CLASSPATH X REPOSITORY private ClassPath _path = null; private Map _loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java index 1835e3f0..960b67cf 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java @@ -38,11 +38,11 @@ public class VerifierFactory { /** * The HashMap that holds the data about the already-constructed Verifier instances. */ - private static Map hashMap = new HashMap(); + private static final Map hashMap = new HashMap(); /** * The VerifierFactoryObserver instances that observe the VerifierFactory. */ - private static List observers = new Vector(); + private static final List observers = new Vector(); /** diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java index a12339e7..2eb9beae 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java @@ -29,7 +29,7 @@ import org.apache.bcel.generic.Type; public final class DOUBLE_Upper extends Type{ /** The one and only instance of this class. */ - private static DOUBLE_Upper singleInstance = new DOUBLE_Upper(); + private static final DOUBLE_Upper singleInstance = new DOUBLE_Upper(); /** The constructor; this class must not be instantiated from the outside. */ private DOUBLE_Upper(){ diff --git a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java index b65734f8..1263ae4d 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java @@ -29,7 +29,7 @@ import org.apache.bcel.generic.Type; public final class LONG_Upper extends Type{ /** The one and only instance of this class. */ - private static LONG_Upper singleInstance = new LONG_Upper(); + private static final LONG_Upper singleInstance = new LONG_Upper(); /** The constructor; this class must not be instantiated from the outside. */ private LONG_Upper(){ diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 1faabac4..a89fbdeb 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -53,7 +53,7 @@ import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; */ public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bcel.generic.Visitor{ - private static ObjectType GENERIC_ARRAY = new ObjectType("org.apache.bcel.verifier.structurals.GenericArray"); + private static final ObjectType GENERIC_ARRAY = new ObjectType("org.apache.bcel.verifier.structurals.GenericArray"); /** * The constructor. Constructs a new instance of this class. -- GitLab From e5585e4468b2462c7387eff52dc06de96d50f893 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 20 Jul 2010 00:28:11 +0000 Subject: [PATCH 0458/1313] Bug 49615 - BCELifier produces incorrect code for methods containing loads of class literals from constant pool - supplied by Bug 49615 - supplied by Tassos Bassoukos git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@965692 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/generic/LDC.java | 20 ++++--- .../java/org/apache/bcel/generic/PUSH.java | 17 +++++- .../org/apache/bcel/util/BCELFactory.java | 53 ++++++++++++------- 3 files changed, 64 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java index 0a7f66b5..06c96879 100644 --- a/src/main/java/org/apache/bcel/generic/LDC.java +++ b/src/main/java/org/apache/bcel/generic/LDC.java @@ -19,6 +19,7 @@ package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.util.ByteSequence; /** @@ -62,7 +63,8 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro * Dump instruction as byte code to stream out. * @param out Output stream */ - public void dump( DataOutputStream out ) throws IOException { + @Override + public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); if (length == 2) { out.writeByte(index); @@ -75,7 +77,8 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro /** * Set the index to constant pool and adjust size. */ - public final void setIndex( int index ) { + @Override + public final void setIndex( int index ) { super.setIndex(index); setSize(); } @@ -84,7 +87,8 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro /** * Read needed data (e.g. index) from file. */ - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + @Override + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { length = 2; index = bytes.readUnsignedByte(); } @@ -102,14 +106,17 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro case org.apache.bcel.Constants.CONSTANT_Integer: return new Integer(((org.apache.bcel.classfile.ConstantInteger) c).getBytes()); case org.apache.bcel.Constants.CONSTANT_Class: - return c; + int nameIndex = ((org.apache.bcel.classfile.ConstantClass) c).getNameIndex(); + c = cpg.getConstantPool().getConstant(nameIndex); + return new ObjectType(((org.apache.bcel.classfile.ConstantUtf8) c).getBytes()); default: // Never reached throw new RuntimeException("Unknown or invalid constant type at " + index); } } - public Type getType( ConstantPoolGen cpg ) { + @Override + public Type getType( ConstantPoolGen cpg ) { switch (cpg.getConstantPool().getConstant(index).getTag()) { case org.apache.bcel.Constants.CONSTANT_String: return Type.STRING; @@ -138,7 +145,8 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro * * @param v Visitor object */ - public void accept( Visitor v ) { + @Override + public void accept( Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/PUSH.java b/src/main/java/org/apache/bcel/generic/PUSH.java index 1d0ecc74..64dcfc0d 100644 --- a/src/main/java/org/apache/bcel/generic/PUSH.java +++ b/src/main/java/org/apache/bcel/generic/PUSH.java @@ -119,7 +119,19 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio } } - + /** + * + * @param cp + * @param value + */ + public PUSH(ConstantPoolGen cp, ObjectType value) { + if (value == null) { + instruction = ACONST_NULL; + } else { + instruction = new LDC(cp.addClass(value)); + } + } + /** * @param cp Constant pool * @param value to be pushed @@ -173,7 +185,8 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio /** * @return mnemonic for instruction */ - public String toString() { + @Override + public String toString() { return instruction.toString() + " (PUSH)"; } } diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index 021ba81b..4bc25715 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -67,9 +67,9 @@ import org.apache.bcel.generic.Type; */ class BCELFactory extends EmptyVisitor { - private MethodGen _mg; - private PrintWriter _out; - private ConstantPoolGen _cp; + private final MethodGen _mg; + private final PrintWriter _out; + private final ConstantPoolGen _cp; BCELFactory(MethodGen mg, PrintWriter out) { @@ -78,7 +78,7 @@ class BCELFactory extends EmptyVisitor { _out = out; } - private Map branch_map = new HashMap(); // Map + private final Map branch_map = new HashMap(); // Map public void start() { @@ -120,7 +120,8 @@ class BCELFactory extends EmptyVisitor { } - public void visitLocalVariableInstruction( LocalVariableInstruction i ) { + @Override + public void visitLocalVariableInstruction( LocalVariableInstruction i ) { short opcode = i.getOpcode(); Type type = i.getType(_cp); if (opcode == Constants.IINC) { @@ -134,7 +135,8 @@ class BCELFactory extends EmptyVisitor { } - public void visitArrayInstruction( ArrayInstruction i ) { + @Override + public void visitArrayInstruction( ArrayInstruction i ) { short opcode = i.getOpcode(); Type type = i.getType(_cp); String kind = (opcode < Constants.IASTORE) ? "Load" : "Store"; @@ -143,7 +145,8 @@ class BCELFactory extends EmptyVisitor { } - public void visitFieldInstruction( FieldInstruction i ) { + @Override + public void visitFieldInstruction( FieldInstruction i ) { short opcode = i.getOpcode(); String class_name = i.getClassName(_cp); String field_name = i.getFieldName(_cp); @@ -154,7 +157,8 @@ class BCELFactory extends EmptyVisitor { } - public void visitInvokeInstruction( InvokeInstruction i ) { + @Override + public void visitInvokeInstruction( InvokeInstruction i ) { short opcode = i.getOpcode(); String class_name = i.getClassName(_cp); String method_name = i.getMethodName(_cp); @@ -167,7 +171,8 @@ class BCELFactory extends EmptyVisitor { } - public void visitAllocationInstruction( AllocationInstruction i ) { + @Override + public void visitAllocationInstruction( AllocationInstruction i ) { Type type; if (i instanceof CPInstruction) { type = ((CPInstruction) i).getType(_cp); @@ -208,48 +213,59 @@ class BCELFactory extends EmptyVisitor { embed += "f"; } else if (value instanceof Long) { embed += "L"; + } else if (value instanceof ObjectType){ + ObjectType ot = (ObjectType) value; + embed = "new ObjectType(\""+ot.getClassName()+"\")"; } + _out.println("il.append(new PUSH(_cp, " + embed + "));"); } - public void visitLDC( LDC i ) { + @Override + public void visitLDC( LDC i ) { createConstant(i.getValue(_cp)); } - public void visitLDC2_W( LDC2_W i ) { + @Override + public void visitLDC2_W( LDC2_W i ) { createConstant(i.getValue(_cp)); } - public void visitConstantPushInstruction( ConstantPushInstruction i ) { + @Override + public void visitConstantPushInstruction( ConstantPushInstruction i ) { createConstant(i.getValue()); } - public void visitINSTANCEOF( INSTANCEOF i ) { + @Override + public void visitINSTANCEOF( INSTANCEOF i ) { Type type = i.getType(_cp); _out.println("il.append(new INSTANCEOF(_cp.addClass(" + BCELifier.printType(type) + ")));"); } - public void visitCHECKCAST( CHECKCAST i ) { + @Override + public void visitCHECKCAST( CHECKCAST i ) { Type type = i.getType(_cp); _out.println("il.append(_factory.createCheckCast(" + BCELifier.printType(type) + "));"); } - public void visitReturnInstruction( ReturnInstruction i ) { + @Override + public void visitReturnInstruction( ReturnInstruction i ) { Type type = i.getType(_cp); _out.println("il.append(_factory.createReturn(" + BCELifier.printType(type) + "));"); } // Memorize BranchInstructions that need an update - private List branches = new ArrayList(); + private final List branches = new ArrayList(); - public void visitBranchInstruction( BranchInstruction bi ) { + @Override + public void visitBranchInstruction( BranchInstruction bi ) { BranchHandle bh = (BranchHandle) branch_map.get(bi); int pos = bh.getPosition(); String name = bi.getName() + "_" + pos; @@ -295,7 +311,8 @@ class BCELFactory extends EmptyVisitor { } - public void visitRET( RET i ) { + @Override + public void visitRET( RET i ) { _out.println("il.append(new RET(" + i.getIndex() + ")));"); } -- GitLab From 1c4714e9f7600a53dce7c9221c72d77035d56dc8 Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Sat, 24 Jul 2010 08:54:43 +0000 Subject: [PATCH 0459/1313] Fix Gump nags The pom declares the source as 1.4 so annotations can't be used Also change some insterted tabs back to 4 spaces No functional change git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@978831 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/generic/LDC.java | 15 +++---- .../java/org/apache/bcel/generic/PUSH.java | 3 +- .../org/apache/bcel/util/BCELFactory.java | 39 +++++++------------ 3 files changed, 19 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java index 06c96879..3113a900 100644 --- a/src/main/java/org/apache/bcel/generic/LDC.java +++ b/src/main/java/org/apache/bcel/generic/LDC.java @@ -63,8 +63,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro * Dump instruction as byte code to stream out. * @param out Output stream */ - @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); if (length == 2) { out.writeByte(index); @@ -77,8 +76,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro /** * Set the index to constant pool and adjust size. */ - @Override - public final void setIndex( int index ) { + public final void setIndex( int index ) { super.setIndex(index); setSize(); } @@ -87,8 +85,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro /** * Read needed data (e.g. index) from file. */ - @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { length = 2; index = bytes.readUnsignedByte(); } @@ -115,8 +112,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro } - @Override - public Type getType( ConstantPoolGen cpg ) { + public Type getType( ConstantPoolGen cpg ) { switch (cpg.getConstantPool().getConstant(index).getTag()) { case org.apache.bcel.Constants.CONSTANT_String: return Type.STRING; @@ -145,8 +141,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro * * @param v Visitor object */ - @Override - public void accept( Visitor v ) { + public void accept( Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/PUSH.java b/src/main/java/org/apache/bcel/generic/PUSH.java index 64dcfc0d..bceda8aa 100644 --- a/src/main/java/org/apache/bcel/generic/PUSH.java +++ b/src/main/java/org/apache/bcel/generic/PUSH.java @@ -185,8 +185,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio /** * @return mnemonic for instruction */ - @Override - public String toString() { + public String toString() { return instruction.toString() + " (PUSH)"; } } diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index 4bc25715..c1065b6e 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -120,8 +120,7 @@ class BCELFactory extends EmptyVisitor { } - @Override - public void visitLocalVariableInstruction( LocalVariableInstruction i ) { + public void visitLocalVariableInstruction( LocalVariableInstruction i ) { short opcode = i.getOpcode(); Type type = i.getType(_cp); if (opcode == Constants.IINC) { @@ -135,8 +134,7 @@ class BCELFactory extends EmptyVisitor { } - @Override - public void visitArrayInstruction( ArrayInstruction i ) { + public void visitArrayInstruction( ArrayInstruction i ) { short opcode = i.getOpcode(); Type type = i.getType(_cp); String kind = (opcode < Constants.IASTORE) ? "Load" : "Store"; @@ -145,8 +143,7 @@ class BCELFactory extends EmptyVisitor { } - @Override - public void visitFieldInstruction( FieldInstruction i ) { + public void visitFieldInstruction( FieldInstruction i ) { short opcode = i.getOpcode(); String class_name = i.getClassName(_cp); String field_name = i.getFieldName(_cp); @@ -157,8 +154,7 @@ class BCELFactory extends EmptyVisitor { } - @Override - public void visitInvokeInstruction( InvokeInstruction i ) { + public void visitInvokeInstruction( InvokeInstruction i ) { short opcode = i.getOpcode(); String class_name = i.getClassName(_cp); String method_name = i.getMethodName(_cp); @@ -171,8 +167,7 @@ class BCELFactory extends EmptyVisitor { } - @Override - public void visitAllocationInstruction( AllocationInstruction i ) { + public void visitAllocationInstruction( AllocationInstruction i ) { Type type; if (i instanceof CPInstruction) { type = ((CPInstruction) i).getType(_cp); @@ -222,40 +217,34 @@ class BCELFactory extends EmptyVisitor { } - @Override - public void visitLDC( LDC i ) { + public void visitLDC( LDC i ) { createConstant(i.getValue(_cp)); } - @Override - public void visitLDC2_W( LDC2_W i ) { + public void visitLDC2_W( LDC2_W i ) { createConstant(i.getValue(_cp)); } - @Override - public void visitConstantPushInstruction( ConstantPushInstruction i ) { + public void visitConstantPushInstruction( ConstantPushInstruction i ) { createConstant(i.getValue()); } - @Override - public void visitINSTANCEOF( INSTANCEOF i ) { + public void visitINSTANCEOF( INSTANCEOF i ) { Type type = i.getType(_cp); _out.println("il.append(new INSTANCEOF(_cp.addClass(" + BCELifier.printType(type) + ")));"); } - @Override - public void visitCHECKCAST( CHECKCAST i ) { + public void visitCHECKCAST( CHECKCAST i ) { Type type = i.getType(_cp); _out.println("il.append(_factory.createCheckCast(" + BCELifier.printType(type) + "));"); } - @Override - public void visitReturnInstruction( ReturnInstruction i ) { + public void visitReturnInstruction( ReturnInstruction i ) { Type type = i.getType(_cp); _out.println("il.append(_factory.createReturn(" + BCELifier.printType(type) + "));"); } @@ -264,8 +253,7 @@ class BCELFactory extends EmptyVisitor { private final List branches = new ArrayList(); - @Override - public void visitBranchInstruction( BranchInstruction bi ) { + public void visitBranchInstruction( BranchInstruction bi ) { BranchHandle bh = (BranchHandle) branch_map.get(bi); int pos = bh.getPosition(); String name = bi.getName() + "_" + pos; @@ -311,8 +299,7 @@ class BCELFactory extends EmptyVisitor { } - @Override - public void visitRET( RET i ) { + public void visitRET( RET i ) { _out.println("il.append(new RET(" + i.getIndex() + ")));"); } -- GitLab From f435145f87883ffae48e0a78fc5a2307ca037733 Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Fri, 3 Sep 2010 15:53:07 +0000 Subject: [PATCH 0460/1313] Code clean-up. No functional change. Remove redundant interface definitions identified by Eclipse. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@992338 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/StackMap.java | 2 +- src/main/java/org/apache/bcel/classfile/StackMapTable.java | 2 +- src/main/java/org/apache/bcel/generic/DCONST.java | 2 +- src/main/java/org/apache/bcel/generic/FCONST.java | 2 +- src/main/java/org/apache/bcel/generic/FieldInstruction.java | 2 +- src/main/java/org/apache/bcel/generic/ICONST.java | 2 +- src/main/java/org/apache/bcel/generic/InvokeInstruction.java | 2 +- src/main/java/org/apache/bcel/generic/LCONST.java | 2 +- src/main/java/org/apache/bcel/generic/LDC.java | 3 +-- src/main/java/org/apache/bcel/generic/LDC2_W.java | 2 +- .../java/org/apache/bcel/verifier/statics/Pass2Verifier.java | 4 ++-- .../apache/bcel/verifier/statics/StringRepresentation.java | 2 +- .../apache/bcel/verifier/structurals/ExecutionVisitor.java | 2 +- .../bcel/verifier/structurals/InstConstraintVisitor.java | 2 +- 14 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java index 8be4fbc4..ee0a5dd8 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMap.java +++ b/src/main/java/org/apache/bcel/classfile/StackMap.java @@ -37,7 +37,7 @@ import org.apache.bcel.Constants; * @see StackMapEntry * @see StackMapType */ -public final class StackMap extends Attribute implements Node { +public final class StackMap extends Attribute { private int map_length; private StackMapEntry[] map; // Table of stack map entries diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTable.java b/src/main/java/org/apache/bcel/classfile/StackMapTable.java index 8a65abe7..78685416 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTable.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTable.java @@ -37,7 +37,7 @@ import org.apache.bcel.Constants; * @see StackMapEntry * @see StackMapType */ -public final class StackMapTable extends Attribute implements Node { +public final class StackMapTable extends Attribute { private int map_length; private StackMapTableEntry[] map; // Table of stack map entries diff --git a/src/main/java/org/apache/bcel/generic/DCONST.java b/src/main/java/org/apache/bcel/generic/DCONST.java index f2d68b0b..eedc29dd 100644 --- a/src/main/java/org/apache/bcel/generic/DCONST.java +++ b/src/main/java/org/apache/bcel/generic/DCONST.java @@ -25,7 +25,7 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class DCONST extends Instruction implements ConstantPushInstruction, TypedInstruction { +public class DCONST extends Instruction implements ConstantPushInstruction { private double value; diff --git a/src/main/java/org/apache/bcel/generic/FCONST.java b/src/main/java/org/apache/bcel/generic/FCONST.java index 9c543adf..3280d933 100644 --- a/src/main/java/org/apache/bcel/generic/FCONST.java +++ b/src/main/java/org/apache/bcel/generic/FCONST.java @@ -25,7 +25,7 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class FCONST extends Instruction implements ConstantPushInstruction, TypedInstruction { +public class FCONST extends Instruction implements ConstantPushInstruction { private float value; diff --git a/src/main/java/org/apache/bcel/generic/FieldInstruction.java b/src/main/java/org/apache/bcel/generic/FieldInstruction.java index fff77edd..610efef1 100644 --- a/src/main/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/main/java/org/apache/bcel/generic/FieldInstruction.java @@ -25,7 +25,7 @@ import org.apache.bcel.classfile.ConstantPool; * @version $Id$ * @author M. Dahm */ -public abstract class FieldInstruction extends FieldOrMethod implements TypedInstruction { +public abstract class FieldInstruction extends FieldOrMethod { /** * Empty constructor needed for the Class.newInstance() statement in diff --git a/src/main/java/org/apache/bcel/generic/ICONST.java b/src/main/java/org/apache/bcel/generic/ICONST.java index fcae6f49..1c09fdfb 100644 --- a/src/main/java/org/apache/bcel/generic/ICONST.java +++ b/src/main/java/org/apache/bcel/generic/ICONST.java @@ -25,7 +25,7 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class ICONST extends Instruction implements ConstantPushInstruction, TypedInstruction { +public class ICONST extends Instruction implements ConstantPushInstruction { private int value; diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index 4eb544ca..896c1f03 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -29,7 +29,7 @@ import org.apache.bcel.classfile.ConstantPool; * @author M. Dahm */ public abstract class InvokeInstruction extends FieldOrMethod implements ExceptionThrower, - TypedInstruction, StackConsumer, StackProducer { + StackConsumer, StackProducer { /** * Empty constructor needed for the Class.newInstance() statement in diff --git a/src/main/java/org/apache/bcel/generic/LCONST.java b/src/main/java/org/apache/bcel/generic/LCONST.java index 2ba57b11..cac34e6b 100644 --- a/src/main/java/org/apache/bcel/generic/LCONST.java +++ b/src/main/java/org/apache/bcel/generic/LCONST.java @@ -25,7 +25,7 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class LCONST extends Instruction implements ConstantPushInstruction, TypedInstruction { +public class LCONST extends Instruction implements ConstantPushInstruction { private long value; diff --git a/src/main/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java index 3113a900..b40520ac 100644 --- a/src/main/java/org/apache/bcel/generic/LDC.java +++ b/src/main/java/org/apache/bcel/generic/LDC.java @@ -30,8 +30,7 @@ import org.apache.bcel.util.ByteSequence; * @version $Id$ * @author M. Dahm */ -public class LDC extends CPInstruction implements PushInstruction, ExceptionThrower, - TypedInstruction { +public class LDC extends CPInstruction implements PushInstruction, ExceptionThrower { /** * Empty constructor needed for the Class.newInstance() statement in diff --git a/src/main/java/org/apache/bcel/generic/LDC2_W.java b/src/main/java/org/apache/bcel/generic/LDC2_W.java index b0bd5a16..5a256bf9 100644 --- a/src/main/java/org/apache/bcel/generic/LDC2_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC2_W.java @@ -25,7 +25,7 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public class LDC2_W extends CPInstruction implements PushInstruction, TypedInstruction { +public class LDC2_W extends CPInstruction implements PushInstruction { /** * Empty constructor needed for the Class.newInstance() statement in diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 0feebf27..349261e5 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -311,7 +311,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * * @see #constant_pool_entries_satisfy_static_constraints() */ - private class CPESSC_Visitor extends org.apache.bcel.classfile.EmptyVisitor implements Visitor{ + private class CPESSC_Visitor extends org.apache.bcel.classfile.EmptyVisitor{ private Class CONST_Class; /* private Class CONST_Fieldref; @@ -1184,7 +1184,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * @see #constant_pool_entries_satisfy_static_constraints() * @see org.apache.bcel.classfile.ConstantCP */ - private class FAMRAV_Visitor extends EmptyVisitor implements Visitor{ + private class FAMRAV_Visitor extends EmptyVisitor{ private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work. private FAMRAV_Visitor(JavaClass _jc){ cp = _jc.getConstantPool(); diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 1f575887..817f9dab 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -70,7 +70,7 @@ import org.apache.bcel.verifier.exc.AssertionViolatedException; * @version $Id$ * @author Enver Haase */ -public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor implements Visitor { +public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor { /** The string representation, created by a visitXXX() method, output by toString(). */ private String tostring; /** The node we ask for its string representation. Not really needed; only for debug output. */ diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index c3e12d9a..838723d1 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -56,7 +56,7 @@ import org.apache.bcel.generic.*; * @see #visitDSTORE(DSTORE o) * @see InstConstraintVisitor */ -public class ExecutionVisitor extends EmptyVisitor implements Visitor{ +public class ExecutionVisitor extends EmptyVisitor{ /** * The executionframe we're operating on. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index a89fbdeb..0634aacd 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -51,7 +51,7 @@ import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; * @see org.apache.bcel.verifier.exc.StructuralCodeConstraintException * @see org.apache.bcel.verifier.exc.LinkingConstraintException */ -public class InstConstraintVisitor extends EmptyVisitor implements org.apache.bcel.generic.Visitor{ +public class InstConstraintVisitor extends EmptyVisitor{ private static final ObjectType GENERIC_ARRAY = new ObjectType("org.apache.bcel.verifier.structurals.GenericArray"); -- GitLab From 0769f2ab1fae20a34b961476a6d863207c679ffa Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Fri, 3 Sep 2010 15:54:37 +0000 Subject: [PATCH 0461/1313] Code clean-up. No functional change. Remove unused imports identified by Eclipse. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@992339 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/verifier/statics/Pass2Verifier.java | 1 - .../org/apache/bcel/verifier/statics/StringRepresentation.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 349261e5..f03eea6b 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -60,7 +60,6 @@ import org.apache.bcel.classfile.Node; import org.apache.bcel.classfile.SourceFile; import org.apache.bcel.classfile.Synthetic; import org.apache.bcel.classfile.Unknown; -import org.apache.bcel.classfile.Visitor; import org.apache.bcel.generic.ArrayType; import org.apache.bcel.generic.ObjectType; import org.apache.bcel.generic.Type; diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 817f9dab..04d2f361 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -52,7 +52,6 @@ import org.apache.bcel.classfile.SourceFile; import org.apache.bcel.classfile.StackMap; import org.apache.bcel.classfile.Synthetic; import org.apache.bcel.classfile.Unknown; -import org.apache.bcel.classfile.Visitor; import org.apache.bcel.verifier.exc.AssertionViolatedException; /** -- GitLab From 57d6bec6433036d53efc6fd19405b982d590c616 Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Fri, 3 Sep 2010 15:57:05 +0000 Subject: [PATCH 0462/1313] Code clean-up. No functional change. Remove unnecessary casts identified by Eclipse. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@992342 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/structurals/InstConstraintVisitor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 0634aacd..e24580ab 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -1669,7 +1669,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ Verifier v = VerifierFactory.getVerifier( name ); VerificationResult vr = v.doPass2(); if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); } } @@ -1755,7 +1755,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ Verifier v = VerifierFactory.getVerifier( name ); VerificationResult vr = v.doPass2(); if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); } } @@ -1842,7 +1842,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ Verifier v = VerifierFactory.getVerifier( name ); VerificationResult vr = v.doPass2(); if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); } } @@ -1893,7 +1893,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ Verifier v = VerifierFactory.getVerifier( name ); VerificationResult vr = v.doPass2(); if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); } } -- GitLab From 92687300b4d05fcaab82edde3f70f74af6a2e479 Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Fri, 3 Sep 2010 15:58:50 +0000 Subject: [PATCH 0463/1313] Code clean-up. No functional change. Remove unused private methods identified by Eclipse. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@992344 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Signature.java | 10 ---------- .../bcel/verifier/structurals/Pass3bVerifier.java | 3 --- 2 files changed, 13 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index 46670c80..1f5b6d45 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -132,21 +132,11 @@ public final class Signature extends Attribute { } - final int mark() { - return pos; - } - - final String getData() { return new String(buf); } - final void reset( int p ) { - pos = p; - } - - final void unread() { if (pos > 0) { pos--; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index d29e752b..881aca26 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -88,9 +88,6 @@ public final class Pass3bVerifier extends PassVerifier{ public boolean isEmpty(){ return ics.isEmpty(); } - public void remove(){ - this.remove(0); - } public void remove(int i){ ics.remove(i); ecs.remove(i); -- GitLab From 9fb1d7f8d2a0c135c43d4f8abb7211338a877870 Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Fri, 3 Sep 2010 16:18:20 +0000 Subject: [PATCH 0464/1313] Code clean-up. No functional change. Insert generated serialVersionUID's for all classes that implement Serializable. Fixes auto-generated by Eclipse. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@992350 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/AccessFlags.java | 1 + .../java/org/apache/bcel/classfile/AnnotationDefault.java | 3 ++- src/main/java/org/apache/bcel/classfile/Attribute.java | 4 +++- .../java/org/apache/bcel/classfile/ClassFormatException.java | 2 ++ src/main/java/org/apache/bcel/classfile/Code.java | 1 + src/main/java/org/apache/bcel/classfile/CodeException.java | 1 + src/main/java/org/apache/bcel/classfile/Constant.java | 1 + src/main/java/org/apache/bcel/classfile/ConstantCP.java | 1 + src/main/java/org/apache/bcel/classfile/ConstantClass.java | 1 + src/main/java/org/apache/bcel/classfile/ConstantDouble.java | 1 + .../java/org/apache/bcel/classfile/ConstantFieldref.java | 3 +++ src/main/java/org/apache/bcel/classfile/ConstantFloat.java | 1 + src/main/java/org/apache/bcel/classfile/ConstantInteger.java | 1 + .../apache/bcel/classfile/ConstantInterfaceMethodref.java | 3 +++ src/main/java/org/apache/bcel/classfile/ConstantLong.java | 1 + .../java/org/apache/bcel/classfile/ConstantMethodref.java | 3 +++ .../java/org/apache/bcel/classfile/ConstantNameAndType.java | 1 + src/main/java/org/apache/bcel/classfile/ConstantPool.java | 1 + src/main/java/org/apache/bcel/classfile/ConstantString.java | 1 + src/main/java/org/apache/bcel/classfile/ConstantUtf8.java | 1 + src/main/java/org/apache/bcel/classfile/ConstantValue.java | 1 + src/main/java/org/apache/bcel/classfile/Deprecated.java | 1 + src/main/java/org/apache/bcel/classfile/EnclosingMethod.java | 4 +++- src/main/java/org/apache/bcel/classfile/ExceptionTable.java | 1 + src/main/java/org/apache/bcel/classfile/Field.java | 1 + src/main/java/org/apache/bcel/classfile/FieldOrMethod.java | 1 + src/main/java/org/apache/bcel/classfile/InnerClass.java | 1 + src/main/java/org/apache/bcel/classfile/InnerClasses.java | 1 + src/main/java/org/apache/bcel/classfile/JavaClass.java | 1 + src/main/java/org/apache/bcel/classfile/LineNumber.java | 1 + src/main/java/org/apache/bcel/classfile/LineNumberTable.java | 1 + src/main/java/org/apache/bcel/classfile/LocalVariable.java | 1 + .../java/org/apache/bcel/classfile/LocalVariableTable.java | 1 + .../org/apache/bcel/classfile/LocalVariableTypeTable.java | 3 ++- src/main/java/org/apache/bcel/classfile/Method.java | 1 + src/main/java/org/apache/bcel/classfile/PMGClass.java | 1 + .../java/org/apache/bcel/classfile/ParameterAnnotations.java | 1 + .../apache/bcel/classfile/RuntimeInvisibleAnnotations.java | 4 +++- .../bcel/classfile/RuntimeInvisibleParameterAnnotations.java | 3 +++ .../org/apache/bcel/classfile/RuntimeVisibleAnnotations.java | 4 +++- .../bcel/classfile/RuntimeVisibleParameterAnnotations.java | 3 +++ src/main/java/org/apache/bcel/classfile/Signature.java | 1 + src/main/java/org/apache/bcel/classfile/SourceFile.java | 1 + src/main/java/org/apache/bcel/classfile/StackMap.java | 1 + src/main/java/org/apache/bcel/classfile/StackMapTable.java | 1 + src/main/java/org/apache/bcel/classfile/Synthetic.java | 1 + src/main/java/org/apache/bcel/classfile/Unknown.java | 1 + src/main/java/org/apache/bcel/generic/AALOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/AASTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/ACONST_NULL.java | 3 +++ src/main/java/org/apache/bcel/generic/ALOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/ANEWARRAY.java | 3 +++ src/main/java/org/apache/bcel/generic/ARETURN.java | 3 +++ src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java | 3 +++ src/main/java/org/apache/bcel/generic/ASTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/ATHROW.java | 3 +++ .../java/org/apache/bcel/generic/ArithmeticInstruction.java | 3 +++ src/main/java/org/apache/bcel/generic/ArrayInstruction.java | 3 +++ src/main/java/org/apache/bcel/generic/ArrayType.java | 1 + src/main/java/org/apache/bcel/generic/BALOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/BASTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/BIPUSH.java | 1 + src/main/java/org/apache/bcel/generic/BREAKPOINT.java | 3 +++ src/main/java/org/apache/bcel/generic/BasicType.java | 3 +++ src/main/java/org/apache/bcel/generic/BranchHandle.java | 1 + src/main/java/org/apache/bcel/generic/BranchInstruction.java | 1 + src/main/java/org/apache/bcel/generic/CALOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/CASTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/CHECKCAST.java | 3 +++ src/main/java/org/apache/bcel/generic/CPInstruction.java | 1 + src/main/java/org/apache/bcel/generic/ClassGen.java | 1 + src/main/java/org/apache/bcel/generic/ClassGenException.java | 2 ++ src/main/java/org/apache/bcel/generic/CodeExceptionGen.java | 1 + src/main/java/org/apache/bcel/generic/ConstantPoolGen.java | 2 ++ .../java/org/apache/bcel/generic/ConversionInstruction.java | 3 +++ src/main/java/org/apache/bcel/generic/D2F.java | 3 +++ src/main/java/org/apache/bcel/generic/D2I.java | 3 +++ src/main/java/org/apache/bcel/generic/D2L.java | 3 +++ src/main/java/org/apache/bcel/generic/DADD.java | 3 +++ src/main/java/org/apache/bcel/generic/DALOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/DASTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/DCMPG.java | 3 +++ src/main/java/org/apache/bcel/generic/DCMPL.java | 3 +++ src/main/java/org/apache/bcel/generic/DCONST.java | 1 + src/main/java/org/apache/bcel/generic/DDIV.java | 3 +++ src/main/java/org/apache/bcel/generic/DLOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/DMUL.java | 3 +++ src/main/java/org/apache/bcel/generic/DNEG.java | 3 +++ src/main/java/org/apache/bcel/generic/DREM.java | 3 +++ src/main/java/org/apache/bcel/generic/DRETURN.java | 3 +++ src/main/java/org/apache/bcel/generic/DSTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/DSUB.java | 3 +++ src/main/java/org/apache/bcel/generic/DUP.java | 3 +++ src/main/java/org/apache/bcel/generic/DUP2.java | 3 +++ src/main/java/org/apache/bcel/generic/DUP2_X1.java | 3 +++ src/main/java/org/apache/bcel/generic/DUP2_X2.java | 3 +++ src/main/java/org/apache/bcel/generic/DUP_X1.java | 3 +++ src/main/java/org/apache/bcel/generic/DUP_X2.java | 3 +++ src/main/java/org/apache/bcel/generic/F2D.java | 3 +++ src/main/java/org/apache/bcel/generic/F2I.java | 3 +++ src/main/java/org/apache/bcel/generic/F2L.java | 3 +++ src/main/java/org/apache/bcel/generic/FADD.java | 3 +++ src/main/java/org/apache/bcel/generic/FALOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/FASTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/FCMPG.java | 3 +++ src/main/java/org/apache/bcel/generic/FCMPL.java | 3 +++ src/main/java/org/apache/bcel/generic/FCONST.java | 1 + src/main/java/org/apache/bcel/generic/FDIV.java | 3 +++ src/main/java/org/apache/bcel/generic/FLOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/FMUL.java | 3 +++ src/main/java/org/apache/bcel/generic/FNEG.java | 3 +++ src/main/java/org/apache/bcel/generic/FREM.java | 3 +++ src/main/java/org/apache/bcel/generic/FRETURN.java | 3 +++ src/main/java/org/apache/bcel/generic/FSTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/FSUB.java | 3 +++ src/main/java/org/apache/bcel/generic/FieldGen.java | 1 + .../java/org/apache/bcel/generic/FieldGenOrMethodGen.java | 1 + src/main/java/org/apache/bcel/generic/FieldInstruction.java | 3 +++ src/main/java/org/apache/bcel/generic/FieldOrMethod.java | 3 +++ src/main/java/org/apache/bcel/generic/GETFIELD.java | 3 +++ src/main/java/org/apache/bcel/generic/GETSTATIC.java | 3 +++ src/main/java/org/apache/bcel/generic/GOTO.java | 3 +++ src/main/java/org/apache/bcel/generic/GOTO_W.java | 3 +++ src/main/java/org/apache/bcel/generic/GotoInstruction.java | 3 +++ src/main/java/org/apache/bcel/generic/I2B.java | 3 +++ src/main/java/org/apache/bcel/generic/I2C.java | 3 +++ src/main/java/org/apache/bcel/generic/I2D.java | 3 +++ src/main/java/org/apache/bcel/generic/I2F.java | 3 +++ src/main/java/org/apache/bcel/generic/I2L.java | 3 +++ src/main/java/org/apache/bcel/generic/I2S.java | 3 +++ src/main/java/org/apache/bcel/generic/IADD.java | 3 +++ src/main/java/org/apache/bcel/generic/IALOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/IAND.java | 3 +++ src/main/java/org/apache/bcel/generic/IASTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/ICONST.java | 1 + src/main/java/org/apache/bcel/generic/IDIV.java | 3 +++ src/main/java/org/apache/bcel/generic/IFEQ.java | 3 +++ src/main/java/org/apache/bcel/generic/IFGE.java | 3 +++ src/main/java/org/apache/bcel/generic/IFGT.java | 3 +++ src/main/java/org/apache/bcel/generic/IFLE.java | 3 +++ src/main/java/org/apache/bcel/generic/IFLT.java | 3 +++ src/main/java/org/apache/bcel/generic/IFNE.java | 3 +++ src/main/java/org/apache/bcel/generic/IFNONNULL.java | 3 +++ src/main/java/org/apache/bcel/generic/IFNULL.java | 3 +++ src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java | 3 +++ src/main/java/org/apache/bcel/generic/IF_ACMPNE.java | 3 +++ src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java | 3 +++ src/main/java/org/apache/bcel/generic/IF_ICMPGE.java | 3 +++ src/main/java/org/apache/bcel/generic/IF_ICMPGT.java | 3 +++ src/main/java/org/apache/bcel/generic/IF_ICMPLE.java | 3 +++ src/main/java/org/apache/bcel/generic/IF_ICMPLT.java | 3 +++ src/main/java/org/apache/bcel/generic/IF_ICMPNE.java | 3 +++ src/main/java/org/apache/bcel/generic/IINC.java | 1 + src/main/java/org/apache/bcel/generic/ILOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/IMPDEP1.java | 3 +++ src/main/java/org/apache/bcel/generic/IMPDEP2.java | 3 +++ src/main/java/org/apache/bcel/generic/IMUL.java | 3 +++ src/main/java/org/apache/bcel/generic/INEG.java | 3 +++ src/main/java/org/apache/bcel/generic/INSTANCEOF.java | 3 +++ src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java | 1 + src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java | 3 +++ src/main/java/org/apache/bcel/generic/INVOKESTATIC.java | 3 +++ src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java | 3 +++ src/main/java/org/apache/bcel/generic/IOR.java | 3 +++ src/main/java/org/apache/bcel/generic/IREM.java | 3 +++ src/main/java/org/apache/bcel/generic/IRETURN.java | 3 +++ src/main/java/org/apache/bcel/generic/ISHL.java | 3 +++ src/main/java/org/apache/bcel/generic/ISHR.java | 3 +++ src/main/java/org/apache/bcel/generic/ISTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/ISUB.java | 3 +++ src/main/java/org/apache/bcel/generic/IUSHR.java | 3 +++ src/main/java/org/apache/bcel/generic/IXOR.java | 3 +++ src/main/java/org/apache/bcel/generic/IfInstruction.java | 3 +++ src/main/java/org/apache/bcel/generic/Instruction.java | 1 + .../java/org/apache/bcel/generic/InstructionFactory.java | 4 +++- src/main/java/org/apache/bcel/generic/InstructionHandle.java | 1 + src/main/java/org/apache/bcel/generic/InstructionList.java | 1 + src/main/java/org/apache/bcel/generic/InvokeInstruction.java | 3 +++ src/main/java/org/apache/bcel/generic/JSR.java | 3 +++ src/main/java/org/apache/bcel/generic/JSR_W.java | 3 +++ src/main/java/org/apache/bcel/generic/JsrInstruction.java | 3 +++ src/main/java/org/apache/bcel/generic/L2D.java | 3 +++ src/main/java/org/apache/bcel/generic/L2F.java | 3 +++ src/main/java/org/apache/bcel/generic/L2I.java | 3 +++ src/main/java/org/apache/bcel/generic/LADD.java | 3 +++ src/main/java/org/apache/bcel/generic/LALOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/LAND.java | 3 +++ src/main/java/org/apache/bcel/generic/LASTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/LCMP.java | 3 +++ src/main/java/org/apache/bcel/generic/LCONST.java | 1 + src/main/java/org/apache/bcel/generic/LDC.java | 3 +++ src/main/java/org/apache/bcel/generic/LDC2_W.java | 3 +++ src/main/java/org/apache/bcel/generic/LDC_W.java | 3 +++ src/main/java/org/apache/bcel/generic/LDIV.java | 3 +++ src/main/java/org/apache/bcel/generic/LLOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/LMUL.java | 3 +++ src/main/java/org/apache/bcel/generic/LNEG.java | 3 +++ src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java | 3 +++ src/main/java/org/apache/bcel/generic/LOR.java | 3 +++ src/main/java/org/apache/bcel/generic/LREM.java | 3 +++ src/main/java/org/apache/bcel/generic/LRETURN.java | 3 +++ src/main/java/org/apache/bcel/generic/LSHL.java | 3 +++ src/main/java/org/apache/bcel/generic/LSHR.java | 3 +++ src/main/java/org/apache/bcel/generic/LSTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/LSUB.java | 3 +++ src/main/java/org/apache/bcel/generic/LUSHR.java | 3 +++ src/main/java/org/apache/bcel/generic/LXOR.java | 3 +++ src/main/java/org/apache/bcel/generic/LineNumberGen.java | 1 + src/main/java/org/apache/bcel/generic/LoadInstruction.java | 3 +++ src/main/java/org/apache/bcel/generic/LocalVariableGen.java | 1 + .../org/apache/bcel/generic/LocalVariableInstruction.java | 1 + src/main/java/org/apache/bcel/generic/MONITORENTER.java | 3 +++ src/main/java/org/apache/bcel/generic/MONITOREXIT.java | 3 +++ src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java | 1 + src/main/java/org/apache/bcel/generic/MethodGen.java | 1 + src/main/java/org/apache/bcel/generic/NEW.java | 3 +++ src/main/java/org/apache/bcel/generic/NEWARRAY.java | 1 + src/main/java/org/apache/bcel/generic/NOP.java | 3 +++ src/main/java/org/apache/bcel/generic/ObjectType.java | 1 + src/main/java/org/apache/bcel/generic/POP.java | 3 +++ src/main/java/org/apache/bcel/generic/POP2.java | 3 +++ src/main/java/org/apache/bcel/generic/PUTFIELD.java | 3 +++ src/main/java/org/apache/bcel/generic/PUTSTATIC.java | 3 +++ src/main/java/org/apache/bcel/generic/RET.java | 1 + src/main/java/org/apache/bcel/generic/RETURN.java | 3 +++ src/main/java/org/apache/bcel/generic/ReferenceType.java | 3 +++ src/main/java/org/apache/bcel/generic/ReturnInstruction.java | 3 +++ src/main/java/org/apache/bcel/generic/ReturnaddressType.java | 1 + src/main/java/org/apache/bcel/generic/SALOAD.java | 3 +++ src/main/java/org/apache/bcel/generic/SASTORE.java | 3 +++ src/main/java/org/apache/bcel/generic/SIPUSH.java | 1 + src/main/java/org/apache/bcel/generic/SWAP.java | 3 +++ src/main/java/org/apache/bcel/generic/Select.java | 1 + src/main/java/org/apache/bcel/generic/StackInstruction.java | 3 +++ src/main/java/org/apache/bcel/generic/StoreInstruction.java | 3 +++ src/main/java/org/apache/bcel/generic/TABLESWITCH.java | 3 +++ .../java/org/apache/bcel/generic/TargetLostException.java | 1 + src/main/java/org/apache/bcel/generic/Type.java | 5 +++++ .../java/org/apache/bcel/util/ClassLoaderRepository.java | 1 + src/main/java/org/apache/bcel/util/ClassPath.java | 4 ++++ src/main/java/org/apache/bcel/util/ClassQueue.java | 1 + src/main/java/org/apache/bcel/util/ClassSet.java | 1 + src/main/java/org/apache/bcel/util/ClassStack.java | 1 + src/main/java/org/apache/bcel/util/ClassVector.java | 1 + src/main/java/org/apache/bcel/util/SyntheticRepository.java | 1 + src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java | 1 + src/main/java/org/apache/bcel/verifier/VerifyDialog.java | 1 + .../apache/bcel/verifier/exc/AssertionViolatedException.java | 3 ++- .../apache/bcel/verifier/exc/ClassConstraintException.java | 4 +++- .../apache/bcel/verifier/exc/CodeConstraintException.java | 3 ++- .../org/apache/bcel/verifier/exc/InvalidMethodException.java | 4 +++- .../apache/bcel/verifier/exc/LinkingConstraintException.java | 2 ++ .../java/org/apache/bcel/verifier/exc/LoadingException.java | 4 +++- .../verifier/exc/LocalVariableInfoInconsistentException.java | 4 +++- .../bcel/verifier/exc/StaticCodeConstraintException.java | 4 +++- .../exc/StaticCodeInstructionConstraintException.java | 4 +++- .../exc/StaticCodeInstructionOperandConstraintException.java | 4 +++- .../bcel/verifier/exc/StructuralCodeConstraintException.java | 3 ++- .../org/apache/bcel/verifier/exc/VerificationException.java | 4 +++- .../verifier/exc/VerifierConstraintViolatedException.java | 3 ++- .../java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java | 3 ++- .../java/org/apache/bcel/verifier/statics/LONG_Upper.java | 3 ++- .../org/apache/bcel/verifier/structurals/GenericArray.java | 4 +++- .../bcel/verifier/structurals/UninitializedObjectType.java | 3 ++- 264 files changed, 636 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AccessFlags.java b/src/main/java/org/apache/bcel/classfile/AccessFlags.java index 9d3b38d0..d7f52dea 100644 --- a/src/main/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/main/java/org/apache/bcel/classfile/AccessFlags.java @@ -28,6 +28,7 @@ import org.apache.bcel.Constants; */ public abstract class AccessFlags implements java.io.Serializable { + private static final long serialVersionUID = 2845404654039163061L; protected int access_flags; diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index 23d639b6..f658de3e 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -31,7 +31,8 @@ import org.apache.bcel.Constants; */ public class AnnotationDefault extends Attribute { - ElementValue default_value; + private static final long serialVersionUID = -4017327188724019487L; + ElementValue default_value; /** * @param name_index diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 96ed8db2..96deafd3 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -50,7 +50,9 @@ import org.apache.bcel.classfile.ConstantUtf8; */ public abstract class Attribute implements Cloneable, Node, Serializable { - protected int name_index; // Points to attribute name in constant pool + private static final long serialVersionUID = -1707826820310002955L; + + protected int name_index; // Points to attribute name in constant pool protected int length; // Content length of attribute field diff --git a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java index 7deec0a6..7f917263 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java +++ b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java @@ -27,6 +27,8 @@ package org.apache.bcel.classfile; */ public class ClassFormatException extends RuntimeException { + private static final long serialVersionUID = -3569097343160139969L; + public ClassFormatException() { super(); } diff --git a/src/main/java/org/apache/bcel/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java index 060fffd1..b55d6153 100644 --- a/src/main/java/org/apache/bcel/classfile/Code.java +++ b/src/main/java/org/apache/bcel/classfile/Code.java @@ -43,6 +43,7 @@ import org.apache.bcel.Constants; */ public final class Code extends Attribute { + private static final long serialVersionUID = -432884354459701506L; private int max_stack; // Maximum size of stack used by this method private int max_locals; // Number of local variables private int code_length; // Length of code in bytes diff --git a/src/main/java/org/apache/bcel/classfile/CodeException.java b/src/main/java/org/apache/bcel/classfile/CodeException.java index a11ee8d8..be7cae08 100644 --- a/src/main/java/org/apache/bcel/classfile/CodeException.java +++ b/src/main/java/org/apache/bcel/classfile/CodeException.java @@ -35,6 +35,7 @@ import org.apache.bcel.Constants; */ public final class CodeException implements Cloneable, Constants, Node, Serializable { + private static final long serialVersionUID = 2972500041254967221L; private int start_pc; // Range in the code the exception handler is private int end_pc; // active. start_pc is inclusive, end_pc exclusive private int handler_pc; /* Starting address of exception handler, i.e., diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index 1e07593f..0c9b35db 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -34,6 +34,7 @@ import org.apache.bcel.util.BCELComparator; */ public abstract class Constant implements Cloneable, Node, Serializable { + private static final long serialVersionUID = 5739037344085356353L; private static BCELComparator _cmp = new BCELComparator() { public boolean equals( Object o1, Object o2 ) { diff --git a/src/main/java/org/apache/bcel/classfile/ConstantCP.java b/src/main/java/org/apache/bcel/classfile/ConstantCP.java index 5636293b..c3cfbc10 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantCP.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public abstract class ConstantCP extends Constant { + private static final long serialVersionUID = -6275762995206209402L; /** References to the constants containing the class and the field signature */ protected int class_index, name_and_type_index; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantClass.java b/src/main/java/org/apache/bcel/classfile/ConstantClass.java index 934d4f47..8ab6728a 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantClass.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public final class ConstantClass extends Constant implements ConstantObject { + private static final long serialVersionUID = -1083450233715258720L; private int name_index; // Identical to ConstantString except for the name diff --git a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java index 6eee3b21..aebaba26 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public final class ConstantDouble extends Constant implements ConstantObject { + private static final long serialVersionUID = -7394764537394782136L; private double bytes; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java index 60a022a0..b53e0c84 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java @@ -29,6 +29,9 @@ import org.apache.bcel.Constants; */ public final class ConstantFieldref extends ConstantCP { + private static final long serialVersionUID = -3993784840787819802L; + + /** * Initialize from another object. */ diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java index 208a3196..cdf19cb6 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public final class ConstantFloat extends Constant implements ConstantObject { + private static final long serialVersionUID = -2316732495687628398L; private float bytes; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java index 638f2ff5..09197781 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public final class ConstantInteger extends Constant implements ConstantObject { + private static final long serialVersionUID = -7040676276945754375L; private int bytes; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java index 2a8c2cb5..9e16db55 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java @@ -29,6 +29,9 @@ import org.apache.bcel.Constants; */ public final class ConstantInterfaceMethodref extends ConstantCP { + private static final long serialVersionUID = -5311546335360612639L; + + /** * Initialize from another object. */ diff --git a/src/main/java/org/apache/bcel/classfile/ConstantLong.java b/src/main/java/org/apache/bcel/classfile/ConstantLong.java index 20428ab4..5943bd59 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantLong.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public final class ConstantLong extends Constant implements ConstantObject { + private static final long serialVersionUID = 8495971186433816161L; private long bytes; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java index f08df320..c8efe5aa 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java @@ -29,6 +29,9 @@ import org.apache.bcel.Constants; */ public final class ConstantMethodref extends ConstantCP { + private static final long serialVersionUID = -864296320352750967L; + + /** * Initialize from another object. */ diff --git a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java index 2a44009a..7fbc18c9 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java @@ -35,6 +35,7 @@ import org.apache.bcel.Constants; */ public final class ConstantNameAndType extends Constant { + private static final long serialVersionUID = -7913354727264034451L; private int name_index; // Name of field/method private int signature_index; // and its signature. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index fed8be13..7a17e387 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -38,6 +38,7 @@ import org.apache.bcel.Constants; */ public class ConstantPool implements Cloneable, Node, Serializable { + private static final long serialVersionUID = -9093478476423540196L; private int constant_pool_count; private Constant[] constant_pool; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantString.java b/src/main/java/org/apache/bcel/classfile/ConstantString.java index 1fad9d7b..b3addd90 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantString.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public final class ConstantString extends Constant implements ConstantObject { + private static final long serialVersionUID = 6603144389219397225L; private int string_index; // Identical to ConstantClass except for this name diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index fb32fa9a..0c8fb95d 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public final class ConstantUtf8 extends Constant { + private static final long serialVersionUID = -8709101585611518985L; private String bytes; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantValue.java b/src/main/java/org/apache/bcel/classfile/ConstantValue.java index e6f1f4d6..c05794df 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantValue.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public final class ConstantValue extends Attribute { + private static final long serialVersionUID = -5668999920978520157L; private int constantvalue_index; diff --git a/src/main/java/org/apache/bcel/classfile/Deprecated.java b/src/main/java/org/apache/bcel/classfile/Deprecated.java index c842e6df..2aab553f 100644 --- a/src/main/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/main/java/org/apache/bcel/classfile/Deprecated.java @@ -33,6 +33,7 @@ import org.apache.bcel.Constants; */ public final class Deprecated extends Attribute { + private static final long serialVersionUID = -2242528405240201000L; private byte[] bytes; diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java index 2d7eddff..4d93387e 100644 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -28,7 +28,9 @@ import org.apache.bcel.Constants; */ public class EnclosingMethod extends Attribute { - // Pointer to the CONSTANT_Class_info structure representing the + private static final long serialVersionUID = 9136852385761725494L; + + // Pointer to the CONSTANT_Class_info structure representing the // innermost class that encloses the declaration of the current class. private int classIndex; diff --git a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java index 215de941..035b2d69 100644 --- a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java @@ -36,6 +36,7 @@ import org.apache.bcel.Constants; */ public final class ExceptionTable extends Attribute { + private static final long serialVersionUID = 2045358830660883220L; private int number_of_exceptions; // Table of indices into private int[] exception_index_table; // constant pool diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java index ddf07921..3b3c282f 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/bcel/classfile/Field.java @@ -32,6 +32,7 @@ import org.apache.bcel.util.BCELComparator; */ public final class Field extends FieldOrMethod { + private static final long serialVersionUID = -4604082205545049134L; private static BCELComparator _cmp = new BCELComparator() { public boolean equals( Object o1, Object o2 ) { diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index 70f6e487..15977e15 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -34,6 +34,7 @@ import org.apache.bcel.classfile.Signature; */ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, Node { + private static final long serialVersionUID = -1833306330869469714L; protected int name_index; // Points to field name in constant pool protected int signature_index; // Points to encoded signature protected int attributes_count; // No. of attributes diff --git a/src/main/java/org/apache/bcel/classfile/InnerClass.java b/src/main/java/org/apache/bcel/classfile/InnerClass.java index 85d05f1c..10f18776 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClass.java @@ -35,6 +35,7 @@ import org.apache.bcel.Constants; */ public final class InnerClass implements Cloneable, Node, Serializable { + private static final long serialVersionUID = -7200195918166127614L; private int inner_class_index; private int outer_class_index; private int inner_name_index; diff --git a/src/main/java/org/apache/bcel/classfile/InnerClasses.java b/src/main/java/org/apache/bcel/classfile/InnerClasses.java index f81f6be4..ce232be3 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClasses.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public final class InnerClasses extends Attribute { + private static final long serialVersionUID = 4570147726361753700L; private InnerClass[] inner_classes; private int number_of_classes; diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 6663c22a..bc8cce91 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -48,6 +48,7 @@ import org.apache.bcel.util.SyntheticRepository; */ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparable { + private static final long serialVersionUID = 2179314813560563755L; private String file_name; private String package_name; private String source_file_name = ""; diff --git a/src/main/java/org/apache/bcel/classfile/LineNumber.java b/src/main/java/org/apache/bcel/classfile/LineNumber.java index 5b85866b..8633e533 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumber.java @@ -33,6 +33,7 @@ import java.io.Serializable; */ public final class LineNumber implements Cloneable, Node, Serializable { + private static final long serialVersionUID = 169537400672820016L; private int start_pc; // Program Counter (PC) corresponds to line private int line_number; // number in source file diff --git a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java index 82040989..1477673e 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public final class LineNumberTable extends Attribute { + private static final long serialVersionUID = -6967221519632128904L; private int line_number_table_length; private LineNumber[] line_number_table; // Table of line/numbers pairs diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java index 879b060e..1b4049dc 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariable.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public final class LocalVariable implements Constants, Cloneable, Node, Serializable { + private static final long serialVersionUID = -51081099265972179L; private int start_pc; // Range in which the variable is valid private int length; private int name_index; // Index in constant pool of variable name diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index e68c8570..dee70c91 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -33,6 +33,7 @@ import org.apache.bcel.Constants; */ public class LocalVariableTable extends Attribute { + private static final long serialVersionUID = 6780929007774637689L; private int local_variable_table_length; // Table of local private LocalVariable[] local_variable_table; // variables diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index 73938827..e9547f77 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -47,7 +47,8 @@ import java.io.*; // } // J5TODO: Needs some testing ! public class LocalVariableTypeTable extends Attribute { - private int local_variable_type_table_length; // Table of local + private static final long serialVersionUID = -1082157891095177114L; +private int local_variable_type_table_length; // Table of local private LocalVariable[] local_variable_type_table; // variables public LocalVariableTypeTable(LocalVariableTypeTable c) { diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index 65a1d300..c5d15a59 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -33,6 +33,7 @@ import org.apache.bcel.util.BCELComparator; */ public final class Method extends FieldOrMethod { + private static final long serialVersionUID = -2013983967283787941L; private static BCELComparator _cmp = new BCELComparator() { public boolean equals( Object o1, Object o2 ) { diff --git a/src/main/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java index 5c4740a7..acf8d6b4 100644 --- a/src/main/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/main/java/org/apache/bcel/classfile/PMGClass.java @@ -33,6 +33,7 @@ import org.apache.bcel.Constants; */ public final class PMGClass extends Attribute { + private static final long serialVersionUID = -7075964153234211509L; private int pmg_class_index, pmg_index; diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index 498c0789..76a2966b 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -30,6 +30,7 @@ import java.io.IOException; */ public abstract class ParameterAnnotations extends Attribute { + private static final long serialVersionUID = 5234607357644462705L; private int num_parameters; private ParameterAnnotationEntry[] parameter_annotation_table; // Table of parameter annotations diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index ac51be9f..3f7b18a2 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -32,7 +32,9 @@ import org.apache.bcel.Constants; */ public class RuntimeInvisibleAnnotations extends Annotations { - /** + private static final long serialVersionUID = 5274986004117955967L; + + /** * @param name_index * Index pointing to the name Code * @param length diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 131f7edc..5e2b597c 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -31,6 +31,9 @@ import org.apache.bcel.Constants; */ public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { + private static final long serialVersionUID = 270153155050617200L; + + /** * @param name_index Index pointing to the name Code * @param length Content length in bytes diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 39446377..710d1490 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -32,7 +32,9 @@ import org.apache.bcel.Constants; */ public class RuntimeVisibleAnnotations extends Annotations { - /** + private static final long serialVersionUID = 8992333017010665281L; + + /** * @param name_index * Index pointing to the name Code * @param length diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index e270110c..c6023684 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -31,6 +31,9 @@ import org.apache.bcel.Constants; */ public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { + private static final long serialVersionUID = -4266572854750267070L; + + /** * @param name_index Index pointing to the name Code * @param length Content length in bytes diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index 1f5b6d45..c6d7861d 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -34,6 +34,7 @@ import org.apache.bcel.Constants; */ public final class Signature extends Attribute { + private static final long serialVersionUID = 5808807822688827177L; private int signature_index; diff --git a/src/main/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java index 09e1e32e..50b11c09 100644 --- a/src/main/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/main/java/org/apache/bcel/classfile/SourceFile.java @@ -35,6 +35,7 @@ import org.apache.bcel.Constants; */ public final class SourceFile extends Attribute { + private static final long serialVersionUID = -804226255663222912L; private int sourcefile_index; diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java index ee0a5dd8..230c786b 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMap.java +++ b/src/main/java/org/apache/bcel/classfile/StackMap.java @@ -39,6 +39,7 @@ import org.apache.bcel.Constants; */ public final class StackMap extends Attribute { + private static final long serialVersionUID = -6238662431726968495L; private int map_length; private StackMapEntry[] map; // Table of stack map entries diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTable.java b/src/main/java/org/apache/bcel/classfile/StackMapTable.java index 78685416..dd0caea4 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTable.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTable.java @@ -39,6 +39,7 @@ import org.apache.bcel.Constants; */ public final class StackMapTable extends Attribute { + private static final long serialVersionUID = -5802191977296683162L; private int map_length; private StackMapTableEntry[] map; // Table of stack map entries diff --git a/src/main/java/org/apache/bcel/classfile/Synthetic.java b/src/main/java/org/apache/bcel/classfile/Synthetic.java index f759f000..2a3ceecb 100644 --- a/src/main/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/main/java/org/apache/bcel/classfile/Synthetic.java @@ -37,6 +37,7 @@ import org.apache.bcel.Constants; */ public final class Synthetic extends Attribute { + private static final long serialVersionUID = -123334426995458366L; private byte[] bytes; diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index d6c7194a..1b588c5f 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -43,6 +43,7 @@ import org.apache.bcel.Constants; */ public final class Unknown extends Attribute { + private static final long serialVersionUID = -4099655108069755015L; private byte[] bytes; private String name; private static final Map unknown_attributes = new HashMap(); diff --git a/src/main/java/org/apache/bcel/generic/AALOAD.java b/src/main/java/org/apache/bcel/generic/AALOAD.java index 0b250db4..2560a728 100644 --- a/src/main/java/org/apache/bcel/generic/AALOAD.java +++ b/src/main/java/org/apache/bcel/generic/AALOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class AALOAD extends ArrayInstruction implements StackProducer { + private static final long serialVersionUID = -8606835203239531080L; + + /** Load reference from array */ public AALOAD() { diff --git a/src/main/java/org/apache/bcel/generic/AASTORE.java b/src/main/java/org/apache/bcel/generic/AASTORE.java index 1b94def6..34f44cd3 100644 --- a/src/main/java/org/apache/bcel/generic/AASTORE.java +++ b/src/main/java/org/apache/bcel/generic/AASTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class AASTORE extends ArrayInstruction implements StackConsumer { + private static final long serialVersionUID = -6440799431970565816L; + + /** Store into reference array */ public AASTORE() { diff --git a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java index 2ee3a8c2..b7608c54 100644 --- a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java +++ b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class ACONST_NULL extends Instruction implements PushInstruction, TypedInstruction { + private static final long serialVersionUID = -4127036801984829715L; + + /** * Push null reference */ diff --git a/src/main/java/org/apache/bcel/generic/ALOAD.java b/src/main/java/org/apache/bcel/generic/ALOAD.java index cc942210..c002cde6 100644 --- a/src/main/java/org/apache/bcel/generic/ALOAD.java +++ b/src/main/java/org/apache/bcel/generic/ALOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class ALOAD extends LoadInstruction { + private static final long serialVersionUID = 6993893925210913542L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java index 30e35ce6..e632db1b 100644 --- a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java @@ -29,6 +29,9 @@ import org.apache.bcel.ExceptionConstants; public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower, StackConsumer, StackProducer { + private static final long serialVersionUID = -3720173810934984310L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/ARETURN.java b/src/main/java/org/apache/bcel/generic/ARETURN.java index 66cbb173..2f3187e3 100644 --- a/src/main/java/org/apache/bcel/generic/ARETURN.java +++ b/src/main/java/org/apache/bcel/generic/ARETURN.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class ARETURN extends ReturnInstruction { + private static final long serialVersionUID = -3497286197421151311L; + + /** * Return reference from method */ diff --git a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java index 5e363c0c..1bf1ad92 100644 --- a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackProducer, StackConsumer { + private static final long serialVersionUID = 3038891629544391578L; + + /** Get length of array */ public ARRAYLENGTH() { diff --git a/src/main/java/org/apache/bcel/generic/ASTORE.java b/src/main/java/org/apache/bcel/generic/ASTORE.java index 533c529b..b1622351 100644 --- a/src/main/java/org/apache/bcel/generic/ASTORE.java +++ b/src/main/java/org/apache/bcel/generic/ASTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class ASTORE extends StoreInstruction { + private static final long serialVersionUID = 3598929416636143200L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/ATHROW.java b/src/main/java/org/apache/bcel/generic/ATHROW.java index f761f1f7..cf621a55 100644 --- a/src/main/java/org/apache/bcel/generic/ATHROW.java +++ b/src/main/java/org/apache/bcel/generic/ATHROW.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class ATHROW extends Instruction implements UnconditionalBranch, ExceptionThrower { + private static final long serialVersionUID = -5072509566909688739L; + + /** * Throw exception */ diff --git a/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java b/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java index b058a67a..1f00e7a5 100644 --- a/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java @@ -28,6 +28,9 @@ import org.apache.bcel.Constants; public abstract class ArithmeticInstruction extends Instruction implements TypedInstruction, StackProducer, StackConsumer { + private static final long serialVersionUID = 5027221136148765144L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/ArrayInstruction.java b/src/main/java/org/apache/bcel/generic/ArrayInstruction.java index 450bafa3..9d8538d2 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ArrayInstruction.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; public abstract class ArrayInstruction extends Instruction implements ExceptionThrower, TypedInstruction { + private static final long serialVersionUID = 1355074014869910296L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/ArrayType.java b/src/main/java/org/apache/bcel/generic/ArrayType.java index cd8b1bc7..1868d6e4 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayType.java +++ b/src/main/java/org/apache/bcel/generic/ArrayType.java @@ -27,6 +27,7 @@ import org.apache.bcel.Constants; */ public final class ArrayType extends ReferenceType { + private static final long serialVersionUID = 7587687059797903734L; private int dimensions; private Type basic_type; diff --git a/src/main/java/org/apache/bcel/generic/BALOAD.java b/src/main/java/org/apache/bcel/generic/BALOAD.java index aa6896f4..8c2aca79 100644 --- a/src/main/java/org/apache/bcel/generic/BALOAD.java +++ b/src/main/java/org/apache/bcel/generic/BALOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class BALOAD extends ArrayInstruction implements StackProducer { + private static final long serialVersionUID = -849061295095748102L; + + /** Load byte or boolean from array */ public BALOAD() { diff --git a/src/main/java/org/apache/bcel/generic/BASTORE.java b/src/main/java/org/apache/bcel/generic/BASTORE.java index b30e165d..b428f951 100644 --- a/src/main/java/org/apache/bcel/generic/BASTORE.java +++ b/src/main/java/org/apache/bcel/generic/BASTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class BASTORE extends ArrayInstruction implements StackConsumer { + private static final long serialVersionUID = 1127770065463906050L; + + /** Store byte or boolean into array */ public BASTORE() { diff --git a/src/main/java/org/apache/bcel/generic/BIPUSH.java b/src/main/java/org/apache/bcel/generic/BIPUSH.java index 6f6b2771..8a68910f 100644 --- a/src/main/java/org/apache/bcel/generic/BIPUSH.java +++ b/src/main/java/org/apache/bcel/generic/BIPUSH.java @@ -31,6 +31,7 @@ import org.apache.bcel.util.ByteSequence; */ public class BIPUSH extends Instruction implements ConstantPushInstruction { + private static final long serialVersionUID = -6859389515217572656L; private byte b; diff --git a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java index 144f4ecf..a0e863bf 100644 --- a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java +++ b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java @@ -25,6 +25,9 @@ package org.apache.bcel.generic; */ public class BREAKPOINT extends Instruction { + private static final long serialVersionUID = -4186956277760244254L; + + public BREAKPOINT() { super(org.apache.bcel.Constants.BREAKPOINT, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/BasicType.java b/src/main/java/org/apache/bcel/generic/BasicType.java index 151de952..2eb51a55 100644 --- a/src/main/java/org/apache/bcel/generic/BasicType.java +++ b/src/main/java/org/apache/bcel/generic/BasicType.java @@ -27,6 +27,9 @@ import org.apache.bcel.Constants; */ public final class BasicType extends Type { + private static final long serialVersionUID = -6546010740455512176L; + + /** * Constructor for basic types such as int, long, `void' * diff --git a/src/main/java/org/apache/bcel/generic/BranchHandle.java b/src/main/java/org/apache/bcel/generic/BranchHandle.java index 136e81a1..4ff423ec 100644 --- a/src/main/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/main/java/org/apache/bcel/generic/BranchHandle.java @@ -31,6 +31,7 @@ package org.apache.bcel.generic; */ public final class BranchHandle extends InstructionHandle { + private static final long serialVersionUID = -2520878285698255956L; private BranchInstruction bi; // An alias in fact, but saves lots of casts diff --git a/src/main/java/org/apache/bcel/generic/BranchInstruction.java b/src/main/java/org/apache/bcel/generic/BranchInstruction.java index 8a0378d1..ca8ee261 100644 --- a/src/main/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/main/java/org/apache/bcel/generic/BranchInstruction.java @@ -32,6 +32,7 @@ import org.apache.bcel.util.ByteSequence; */ public abstract class BranchInstruction extends Instruction implements InstructionTargeter { + private static final long serialVersionUID = 3225905281842405051L; protected int index; // Branch target relative to this instruction protected InstructionHandle target; // Target object in instruction list protected int position; // Byte code offset diff --git a/src/main/java/org/apache/bcel/generic/CALOAD.java b/src/main/java/org/apache/bcel/generic/CALOAD.java index 9ea0a35b..abd06252 100644 --- a/src/main/java/org/apache/bcel/generic/CALOAD.java +++ b/src/main/java/org/apache/bcel/generic/CALOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class CALOAD extends ArrayInstruction implements StackProducer { + private static final long serialVersionUID = -2085721349377637959L; + + /** Load char from array */ public CALOAD() { diff --git a/src/main/java/org/apache/bcel/generic/CASTORE.java b/src/main/java/org/apache/bcel/generic/CASTORE.java index 7c7aaddf..09b63351 100644 --- a/src/main/java/org/apache/bcel/generic/CASTORE.java +++ b/src/main/java/org/apache/bcel/generic/CASTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class CASTORE extends ArrayInstruction implements StackConsumer { + private static final long serialVersionUID = -4021755905444053495L; + + /** Store char into array */ public CASTORE() { diff --git a/src/main/java/org/apache/bcel/generic/CHECKCAST.java b/src/main/java/org/apache/bcel/generic/CHECKCAST.java index 4e1d0a38..5b6ef46d 100644 --- a/src/main/java/org/apache/bcel/generic/CHECKCAST.java +++ b/src/main/java/org/apache/bcel/generic/CHECKCAST.java @@ -29,6 +29,9 @@ import org.apache.bcel.ExceptionConstants; public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThrower, StackProducer, StackConsumer { + private static final long serialVersionUID = 1227128733786393518L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/CPInstruction.java b/src/main/java/org/apache/bcel/generic/CPInstruction.java index ebd9c53e..98c6806f 100644 --- a/src/main/java/org/apache/bcel/generic/CPInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CPInstruction.java @@ -38,6 +38,7 @@ import org.apache.bcel.util.ByteSequence; public abstract class CPInstruction extends Instruction implements TypedInstruction, IndexedInstruction { + private static final long serialVersionUID = 2968547649792233082L; protected int index; // index to constant pool diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index d63ecf55..64311b6f 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -46,6 +46,7 @@ import org.apache.bcel.util.BCELComparator; */ public class ClassGen extends AccessFlags implements Cloneable { + private static final long serialVersionUID = 6880879387392827211L; /* Corresponds to the fields found in a JavaClass object. */ private String class_name, super_class_name, file_name; diff --git a/src/main/java/org/apache/bcel/generic/ClassGenException.java b/src/main/java/org/apache/bcel/generic/ClassGenException.java index 407aad3d..963bddf2 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGenException.java +++ b/src/main/java/org/apache/bcel/generic/ClassGenException.java @@ -26,6 +26,8 @@ package org.apache.bcel.generic; */ public class ClassGenException extends RuntimeException { + private static final long serialVersionUID = 7247369755051242791L; + public ClassGenException() { super(); } diff --git a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java index 58c6f643..4d4a51f5 100644 --- a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -36,6 +36,7 @@ import org.apache.bcel.classfile.CodeException; */ public final class CodeExceptionGen implements InstructionTargeter, Cloneable, java.io.Serializable { + private static final long serialVersionUID = 6548901422158960190L; private InstructionHandle start_pc; private InstructionHandle end_pc; private InstructionHandle handler_pc; diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index 046ad58d..befa0ee1 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -51,6 +51,7 @@ import org.apache.bcel.classfile.ConstantUtf8; */ public class ConstantPoolGen implements java.io.Serializable { + private static final long serialVersionUID = 6664071417323174824L; protected int size; protected Constant[] constants; protected int index = 1; // First entry (0) used by JVM @@ -61,6 +62,7 @@ public class ConstantPoolGen implements java.io.Serializable { private static class Index implements java.io.Serializable { + private static final long serialVersionUID = -9187078620578535161L; int index; diff --git a/src/main/java/org/apache/bcel/generic/ConversionInstruction.java b/src/main/java/org/apache/bcel/generic/ConversionInstruction.java index a5c98406..2ca75307 100644 --- a/src/main/java/org/apache/bcel/generic/ConversionInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ConversionInstruction.java @@ -28,6 +28,9 @@ import org.apache.bcel.Constants; public abstract class ConversionInstruction extends Instruction implements TypedInstruction, StackProducer, StackConsumer { + private static final long serialVersionUID = -4283015897133699172L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/D2F.java b/src/main/java/org/apache/bcel/generic/D2F.java index be1a9769..ba124017 100644 --- a/src/main/java/org/apache/bcel/generic/D2F.java +++ b/src/main/java/org/apache/bcel/generic/D2F.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class D2F extends ConversionInstruction { + private static final long serialVersionUID = -448595874334076240L; + + /** Convert double to float */ public D2F() { diff --git a/src/main/java/org/apache/bcel/generic/D2I.java b/src/main/java/org/apache/bcel/generic/D2I.java index a1b5cf5b..0f599db1 100644 --- a/src/main/java/org/apache/bcel/generic/D2I.java +++ b/src/main/java/org/apache/bcel/generic/D2I.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class D2I extends ConversionInstruction { + private static final long serialVersionUID = -1226710355146064416L; + + /** Convert double to int */ public D2I() { diff --git a/src/main/java/org/apache/bcel/generic/D2L.java b/src/main/java/org/apache/bcel/generic/D2L.java index 913e6133..a4a15b12 100644 --- a/src/main/java/org/apache/bcel/generic/D2L.java +++ b/src/main/java/org/apache/bcel/generic/D2L.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class D2L extends ConversionInstruction { + private static final long serialVersionUID = -1985923584192796706L; + + /** Convert double to long */ public D2L() { diff --git a/src/main/java/org/apache/bcel/generic/DADD.java b/src/main/java/org/apache/bcel/generic/DADD.java index b321fe30..2f5cf1c9 100644 --- a/src/main/java/org/apache/bcel/generic/DADD.java +++ b/src/main/java/org/apache/bcel/generic/DADD.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class DADD extends ArithmeticInstruction { + private static final long serialVersionUID = 241485501977646418L; + + /** Add doubles */ public DADD() { diff --git a/src/main/java/org/apache/bcel/generic/DALOAD.java b/src/main/java/org/apache/bcel/generic/DALOAD.java index 944d0d32..6704cafb 100644 --- a/src/main/java/org/apache/bcel/generic/DALOAD.java +++ b/src/main/java/org/apache/bcel/generic/DALOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class DALOAD extends ArrayInstruction implements StackProducer { + private static final long serialVersionUID = -8493938101832015094L; + + /** Load double from array */ public DALOAD() { diff --git a/src/main/java/org/apache/bcel/generic/DASTORE.java b/src/main/java/org/apache/bcel/generic/DASTORE.java index 5b2d8ce4..b3765e07 100644 --- a/src/main/java/org/apache/bcel/generic/DASTORE.java +++ b/src/main/java/org/apache/bcel/generic/DASTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class DASTORE extends ArrayInstruction implements StackConsumer { + private static final long serialVersionUID = 5236493427411303394L; + + /** Store double into array */ public DASTORE() { diff --git a/src/main/java/org/apache/bcel/generic/DCMPG.java b/src/main/java/org/apache/bcel/generic/DCMPG.java index 672311ea..3910805d 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPG.java +++ b/src/main/java/org/apache/bcel/generic/DCMPG.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class DCMPG extends Instruction implements TypedInstruction, StackProducer, StackConsumer { + private static final long serialVersionUID = 1929664840821745262L; + + public DCMPG() { super(org.apache.bcel.Constants.DCMPG, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/DCMPL.java b/src/main/java/org/apache/bcel/generic/DCMPL.java index 01f8172a..cd680552 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPL.java +++ b/src/main/java/org/apache/bcel/generic/DCMPL.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class DCMPL extends Instruction implements TypedInstruction, StackProducer, StackConsumer { + private static final long serialVersionUID = 2514357528484232014L; + + public DCMPL() { super(org.apache.bcel.Constants.DCMPL, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/DCONST.java b/src/main/java/org/apache/bcel/generic/DCONST.java index eedc29dd..d43757e3 100644 --- a/src/main/java/org/apache/bcel/generic/DCONST.java +++ b/src/main/java/org/apache/bcel/generic/DCONST.java @@ -27,6 +27,7 @@ package org.apache.bcel.generic; */ public class DCONST extends Instruction implements ConstantPushInstruction { + private static final long serialVersionUID = 4421839896759165218L; private double value; diff --git a/src/main/java/org/apache/bcel/generic/DDIV.java b/src/main/java/org/apache/bcel/generic/DDIV.java index 22211789..d0ec2091 100644 --- a/src/main/java/org/apache/bcel/generic/DDIV.java +++ b/src/main/java/org/apache/bcel/generic/DDIV.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class DDIV extends ArithmeticInstruction { + private static final long serialVersionUID = -2241740228269641540L; + + /** Divide doubles */ public DDIV() { diff --git a/src/main/java/org/apache/bcel/generic/DLOAD.java b/src/main/java/org/apache/bcel/generic/DLOAD.java index 2f83fe94..4db5f152 100644 --- a/src/main/java/org/apache/bcel/generic/DLOAD.java +++ b/src/main/java/org/apache/bcel/generic/DLOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class DLOAD extends LoadInstruction { + private static final long serialVersionUID = -197027701448834250L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/DMUL.java b/src/main/java/org/apache/bcel/generic/DMUL.java index b08e4657..2edbbe6b 100644 --- a/src/main/java/org/apache/bcel/generic/DMUL.java +++ b/src/main/java/org/apache/bcel/generic/DMUL.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class DMUL extends ArithmeticInstruction { + private static final long serialVersionUID = 7491480641611951432L; + + /** Multiply doubles */ public DMUL() { diff --git a/src/main/java/org/apache/bcel/generic/DNEG.java b/src/main/java/org/apache/bcel/generic/DNEG.java index bc7c134a..cabed969 100644 --- a/src/main/java/org/apache/bcel/generic/DNEG.java +++ b/src/main/java/org/apache/bcel/generic/DNEG.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class DNEG extends ArithmeticInstruction { + private static final long serialVersionUID = -8860107731099493429L; + + public DNEG() { super(org.apache.bcel.Constants.DNEG); } diff --git a/src/main/java/org/apache/bcel/generic/DREM.java b/src/main/java/org/apache/bcel/generic/DREM.java index 5b9f40b1..9101cedc 100644 --- a/src/main/java/org/apache/bcel/generic/DREM.java +++ b/src/main/java/org/apache/bcel/generic/DREM.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class DREM extends ArithmeticInstruction { + private static final long serialVersionUID = -3984082114153729887L; + + /** Remainder of doubles */ public DREM() { diff --git a/src/main/java/org/apache/bcel/generic/DRETURN.java b/src/main/java/org/apache/bcel/generic/DRETURN.java index dd0b7613..4ad9c688 100644 --- a/src/main/java/org/apache/bcel/generic/DRETURN.java +++ b/src/main/java/org/apache/bcel/generic/DRETURN.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class DRETURN extends ReturnInstruction { + private static final long serialVersionUID = 7442064109402271402L; + + /** Return double from method */ public DRETURN() { diff --git a/src/main/java/org/apache/bcel/generic/DSTORE.java b/src/main/java/org/apache/bcel/generic/DSTORE.java index b5cf5b91..aa5c6ea8 100644 --- a/src/main/java/org/apache/bcel/generic/DSTORE.java +++ b/src/main/java/org/apache/bcel/generic/DSTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class DSTORE extends StoreInstruction { + private static final long serialVersionUID = 2593414593903082469L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/DSUB.java b/src/main/java/org/apache/bcel/generic/DSUB.java index 7fed97d6..59e3d2d2 100644 --- a/src/main/java/org/apache/bcel/generic/DSUB.java +++ b/src/main/java/org/apache/bcel/generic/DSUB.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class DSUB extends ArithmeticInstruction { + private static final long serialVersionUID = -5398969227995149466L; + + /** Substract doubles */ public DSUB() { diff --git a/src/main/java/org/apache/bcel/generic/DUP.java b/src/main/java/org/apache/bcel/generic/DUP.java index c6739af9..35cca40b 100644 --- a/src/main/java/org/apache/bcel/generic/DUP.java +++ b/src/main/java/org/apache/bcel/generic/DUP.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class DUP extends StackInstruction implements PushInstruction { + private static final long serialVersionUID = 2297553463589366154L; + + public DUP() { super(org.apache.bcel.Constants.DUP); } diff --git a/src/main/java/org/apache/bcel/generic/DUP2.java b/src/main/java/org/apache/bcel/generic/DUP2.java index 83a636ea..263f9918 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2.java +++ b/src/main/java/org/apache/bcel/generic/DUP2.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class DUP2 extends StackInstruction implements PushInstruction { + private static final long serialVersionUID = -7098411152822612791L; + + public DUP2() { super(org.apache.bcel.Constants.DUP2); } diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X1.java b/src/main/java/org/apache/bcel/generic/DUP2_X1.java index 0443dbda..cd22a97c 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X1.java +++ b/src/main/java/org/apache/bcel/generic/DUP2_X1.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class DUP2_X1 extends StackInstruction { + private static final long serialVersionUID = 4940667268525283202L; + + public DUP2_X1() { super(org.apache.bcel.Constants.DUP2_X1); } diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X2.java b/src/main/java/org/apache/bcel/generic/DUP2_X2.java index dcb2ff3e..c6caacf7 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X2.java +++ b/src/main/java/org/apache/bcel/generic/DUP2_X2.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class DUP2_X2 extends StackInstruction { + private static final long serialVersionUID = 1182584253776211326L; + + public DUP2_X2() { super(org.apache.bcel.Constants.DUP2_X2); } diff --git a/src/main/java/org/apache/bcel/generic/DUP_X1.java b/src/main/java/org/apache/bcel/generic/DUP_X1.java index 06b499d0..e307198b 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X1.java +++ b/src/main/java/org/apache/bcel/generic/DUP_X1.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class DUP_X1 extends StackInstruction { + private static final long serialVersionUID = 2059042937326757526L; + + public DUP_X1() { super(org.apache.bcel.Constants.DUP_X1); } diff --git a/src/main/java/org/apache/bcel/generic/DUP_X2.java b/src/main/java/org/apache/bcel/generic/DUP_X2.java index 15a45465..e7db2296 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X2.java +++ b/src/main/java/org/apache/bcel/generic/DUP_X2.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class DUP_X2 extends StackInstruction { + private static final long serialVersionUID = -8851562833314313571L; + + public DUP_X2() { super(org.apache.bcel.Constants.DUP_X2); } diff --git a/src/main/java/org/apache/bcel/generic/F2D.java b/src/main/java/org/apache/bcel/generic/F2D.java index d693e82d..e74d44aa 100644 --- a/src/main/java/org/apache/bcel/generic/F2D.java +++ b/src/main/java/org/apache/bcel/generic/F2D.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class F2D extends ConversionInstruction { + private static final long serialVersionUID = -4668119344425861047L; + + /** Convert float to double */ public F2D() { diff --git a/src/main/java/org/apache/bcel/generic/F2I.java b/src/main/java/org/apache/bcel/generic/F2I.java index 5f4742df..ff6cd237 100644 --- a/src/main/java/org/apache/bcel/generic/F2I.java +++ b/src/main/java/org/apache/bcel/generic/F2I.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class F2I extends ConversionInstruction { + private static final long serialVersionUID = 6142843856130131105L; + + /** Convert float to int */ public F2I() { diff --git a/src/main/java/org/apache/bcel/generic/F2L.java b/src/main/java/org/apache/bcel/generic/F2L.java index 41791da2..3cbb586c 100644 --- a/src/main/java/org/apache/bcel/generic/F2L.java +++ b/src/main/java/org/apache/bcel/generic/F2L.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class F2L extends ConversionInstruction { + private static final long serialVersionUID = -5583947322933513819L; + + /** Convert float to long */ public F2L() { diff --git a/src/main/java/org/apache/bcel/generic/FADD.java b/src/main/java/org/apache/bcel/generic/FADD.java index 244b4e0d..d79478aa 100644 --- a/src/main/java/org/apache/bcel/generic/FADD.java +++ b/src/main/java/org/apache/bcel/generic/FADD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FADD extends ArithmeticInstruction { + private static final long serialVersionUID = 5654582990564566355L; + + /** Add floats */ public FADD() { diff --git a/src/main/java/org/apache/bcel/generic/FALOAD.java b/src/main/java/org/apache/bcel/generic/FALOAD.java index 7c6202f0..18559980 100644 --- a/src/main/java/org/apache/bcel/generic/FALOAD.java +++ b/src/main/java/org/apache/bcel/generic/FALOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FALOAD extends ArrayInstruction implements StackProducer { + private static final long serialVersionUID = 3369925718821219472L; + + /** Load float from array */ public FALOAD() { diff --git a/src/main/java/org/apache/bcel/generic/FASTORE.java b/src/main/java/org/apache/bcel/generic/FASTORE.java index a8721b3c..b716e44d 100644 --- a/src/main/java/org/apache/bcel/generic/FASTORE.java +++ b/src/main/java/org/apache/bcel/generic/FASTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FASTORE extends ArrayInstruction implements StackConsumer { + private static final long serialVersionUID = -1583134120388207470L; + + /** Store float into array */ public FASTORE() { diff --git a/src/main/java/org/apache/bcel/generic/FCMPG.java b/src/main/java/org/apache/bcel/generic/FCMPG.java index 4c4734cf..78aed169 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPG.java +++ b/src/main/java/org/apache/bcel/generic/FCMPG.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FCMPG extends Instruction implements TypedInstruction, StackProducer, StackConsumer { + private static final long serialVersionUID = -715944337480121908L; + + public FCMPG() { super(org.apache.bcel.Constants.FCMPG, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/FCMPL.java b/src/main/java/org/apache/bcel/generic/FCMPL.java index 0d7116ed..a5df0ec9 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPL.java +++ b/src/main/java/org/apache/bcel/generic/FCMPL.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FCMPL extends Instruction implements TypedInstruction, StackProducer, StackConsumer { + private static final long serialVersionUID = -5283096582947056142L; + + public FCMPL() { super(org.apache.bcel.Constants.FCMPL, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/FCONST.java b/src/main/java/org/apache/bcel/generic/FCONST.java index 3280d933..d4da1bd3 100644 --- a/src/main/java/org/apache/bcel/generic/FCONST.java +++ b/src/main/java/org/apache/bcel/generic/FCONST.java @@ -27,6 +27,7 @@ package org.apache.bcel.generic; */ public class FCONST extends Instruction implements ConstantPushInstruction { + private static final long serialVersionUID = 3018815844848018054L; private float value; diff --git a/src/main/java/org/apache/bcel/generic/FDIV.java b/src/main/java/org/apache/bcel/generic/FDIV.java index 9551e2da..e0377cda 100644 --- a/src/main/java/org/apache/bcel/generic/FDIV.java +++ b/src/main/java/org/apache/bcel/generic/FDIV.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FDIV extends ArithmeticInstruction { + private static final long serialVersionUID = -8536341322669578097L; + + /** Divide floats */ public FDIV() { diff --git a/src/main/java/org/apache/bcel/generic/FLOAD.java b/src/main/java/org/apache/bcel/generic/FLOAD.java index cc1b62bb..d7547602 100644 --- a/src/main/java/org/apache/bcel/generic/FLOAD.java +++ b/src/main/java/org/apache/bcel/generic/FLOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FLOAD extends LoadInstruction { + private static final long serialVersionUID = 7970650436462434345L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/FMUL.java b/src/main/java/org/apache/bcel/generic/FMUL.java index 1a3766d3..f6b83641 100644 --- a/src/main/java/org/apache/bcel/generic/FMUL.java +++ b/src/main/java/org/apache/bcel/generic/FMUL.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FMUL extends ArithmeticInstruction { + private static final long serialVersionUID = -1981818566663824251L; + + /** Multiply floats */ public FMUL() { diff --git a/src/main/java/org/apache/bcel/generic/FNEG.java b/src/main/java/org/apache/bcel/generic/FNEG.java index 954c5861..aa2d94b5 100644 --- a/src/main/java/org/apache/bcel/generic/FNEG.java +++ b/src/main/java/org/apache/bcel/generic/FNEG.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FNEG extends ArithmeticInstruction { + private static final long serialVersionUID = 2963444954300367744L; + + public FNEG() { super(org.apache.bcel.Constants.FNEG); } diff --git a/src/main/java/org/apache/bcel/generic/FREM.java b/src/main/java/org/apache/bcel/generic/FREM.java index d0ef7f58..7135e72a 100644 --- a/src/main/java/org/apache/bcel/generic/FREM.java +++ b/src/main/java/org/apache/bcel/generic/FREM.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FREM extends ArithmeticInstruction { + private static final long serialVersionUID = -9122754212888086133L; + + /** Remainder of floats */ public FREM() { diff --git a/src/main/java/org/apache/bcel/generic/FRETURN.java b/src/main/java/org/apache/bcel/generic/FRETURN.java index eb96fd59..ee08293a 100644 --- a/src/main/java/org/apache/bcel/generic/FRETURN.java +++ b/src/main/java/org/apache/bcel/generic/FRETURN.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FRETURN extends ReturnInstruction { + private static final long serialVersionUID = -3630453809574277966L; + + /** Return float from method */ public FRETURN() { diff --git a/src/main/java/org/apache/bcel/generic/FSTORE.java b/src/main/java/org/apache/bcel/generic/FSTORE.java index f7e58c8b..22c6120d 100644 --- a/src/main/java/org/apache/bcel/generic/FSTORE.java +++ b/src/main/java/org/apache/bcel/generic/FSTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FSTORE extends StoreInstruction { + private static final long serialVersionUID = 2587266679484598179L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/FSUB.java b/src/main/java/org/apache/bcel/generic/FSUB.java index 24811b87..3c74d7fe 100644 --- a/src/main/java/org/apache/bcel/generic/FSUB.java +++ b/src/main/java/org/apache/bcel/generic/FSUB.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class FSUB extends ArithmeticInstruction { + private static final long serialVersionUID = 8403880233375858501L; + + /** Substract floats */ public FSUB() { diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index a9aca9f2..31b33d22 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -43,6 +43,7 @@ import org.apache.bcel.util.BCELComparator; */ public class FieldGen extends FieldGenOrMethodGen { + private static final long serialVersionUID = -6050448955000008261L; private Object value = null; private static BCELComparator _cmp = new BCELComparator() { diff --git a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 0cc3440a..4217f4cd 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -32,6 +32,7 @@ import org.apache.bcel.classfile.Attribute; */ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAndTyped, Cloneable { + private static final long serialVersionUID = -2549303846821589647L; protected String name; protected Type type; protected ConstantPoolGen cp; diff --git a/src/main/java/org/apache/bcel/generic/FieldInstruction.java b/src/main/java/org/apache/bcel/generic/FieldInstruction.java index 610efef1..73215ecb 100644 --- a/src/main/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/main/java/org/apache/bcel/generic/FieldInstruction.java @@ -27,6 +27,9 @@ import org.apache.bcel.classfile.ConstantPool; */ public abstract class FieldInstruction extends FieldOrMethod { + private static final long serialVersionUID = -7870956226459765817L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java index 13be9931..1d3adcbf 100644 --- a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java @@ -31,6 +31,9 @@ import org.apache.bcel.classfile.ConstantUtf8; */ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { + private static final long serialVersionUID = 2036985877748835708L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/GETFIELD.java b/src/main/java/org/apache/bcel/generic/GETFIELD.java index 9ad617d2..c8503aef 100644 --- a/src/main/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/main/java/org/apache/bcel/generic/GETFIELD.java @@ -32,6 +32,9 @@ import org.apache.bcel.ExceptionConstants; public class GETFIELD extends FieldInstruction implements ExceptionThrower, StackConsumer, StackProducer { + private static final long serialVersionUID = -6510928743515082496L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/GETSTATIC.java b/src/main/java/org/apache/bcel/generic/GETSTATIC.java index 0494c99b..9f8b5a10 100644 --- a/src/main/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/GETSTATIC.java @@ -31,6 +31,9 @@ import org.apache.bcel.ExceptionConstants; */ public class GETSTATIC extends FieldInstruction implements PushInstruction, ExceptionThrower { + private static final long serialVersionUID = -477185594622953478L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/GOTO.java b/src/main/java/org/apache/bcel/generic/GOTO.java index e5a90d8d..c56f1b38 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO.java +++ b/src/main/java/org/apache/bcel/generic/GOTO.java @@ -28,6 +28,9 @@ import java.io.IOException; */ public class GOTO extends GotoInstruction implements VariableLengthInstruction { + private static final long serialVersionUID = 6106731367505145625L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/GOTO_W.java b/src/main/java/org/apache/bcel/generic/GOTO_W.java index 8e0ba6e4..b4a5b0d8 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO_W.java +++ b/src/main/java/org/apache/bcel/generic/GOTO_W.java @@ -29,6 +29,9 @@ import org.apache.bcel.util.ByteSequence; */ public class GOTO_W extends GotoInstruction { + private static final long serialVersionUID = -344799540124265957L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/GotoInstruction.java b/src/main/java/org/apache/bcel/generic/GotoInstruction.java index 34089b0d..395780f4 100644 --- a/src/main/java/org/apache/bcel/generic/GotoInstruction.java +++ b/src/main/java/org/apache/bcel/generic/GotoInstruction.java @@ -25,6 +25,9 @@ package org.apache.bcel.generic; */ public abstract class GotoInstruction extends BranchInstruction implements UnconditionalBranch { + private static final long serialVersionUID = -2882435228056875173L; + + GotoInstruction(short opcode, InstructionHandle target) { super(opcode, target); } diff --git a/src/main/java/org/apache/bcel/generic/I2B.java b/src/main/java/org/apache/bcel/generic/I2B.java index cb8bec28..c1416437 100644 --- a/src/main/java/org/apache/bcel/generic/I2B.java +++ b/src/main/java/org/apache/bcel/generic/I2B.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class I2B extends ConversionInstruction { + private static final long serialVersionUID = -260969101469366410L; + + /** Convert int to byte */ public I2B() { diff --git a/src/main/java/org/apache/bcel/generic/I2C.java b/src/main/java/org/apache/bcel/generic/I2C.java index bb1129c2..e7b2ec46 100644 --- a/src/main/java/org/apache/bcel/generic/I2C.java +++ b/src/main/java/org/apache/bcel/generic/I2C.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class I2C extends ConversionInstruction { + private static final long serialVersionUID = 7396507741159927455L; + + /** Convert int to char */ public I2C() { diff --git a/src/main/java/org/apache/bcel/generic/I2D.java b/src/main/java/org/apache/bcel/generic/I2D.java index 4b73c45b..617d196d 100644 --- a/src/main/java/org/apache/bcel/generic/I2D.java +++ b/src/main/java/org/apache/bcel/generic/I2D.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class I2D extends ConversionInstruction { + private static final long serialVersionUID = 4267924152721121331L; + + /** Convert int to double */ public I2D() { diff --git a/src/main/java/org/apache/bcel/generic/I2F.java b/src/main/java/org/apache/bcel/generic/I2F.java index 3f812c0a..90676c48 100644 --- a/src/main/java/org/apache/bcel/generic/I2F.java +++ b/src/main/java/org/apache/bcel/generic/I2F.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class I2F extends ConversionInstruction { + private static final long serialVersionUID = -816875455957376859L; + + /** Convert int to float */ public I2F() { diff --git a/src/main/java/org/apache/bcel/generic/I2L.java b/src/main/java/org/apache/bcel/generic/I2L.java index 855a48d7..61fa17e0 100644 --- a/src/main/java/org/apache/bcel/generic/I2L.java +++ b/src/main/java/org/apache/bcel/generic/I2L.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class I2L extends ConversionInstruction { + private static final long serialVersionUID = 8923707875178789326L; + + /** Convert int to long */ public I2L() { diff --git a/src/main/java/org/apache/bcel/generic/I2S.java b/src/main/java/org/apache/bcel/generic/I2S.java index 7e5b44e3..8116e6a5 100644 --- a/src/main/java/org/apache/bcel/generic/I2S.java +++ b/src/main/java/org/apache/bcel/generic/I2S.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class I2S extends ConversionInstruction { + private static final long serialVersionUID = -2414292630144687091L; + + public I2S() { super(org.apache.bcel.Constants.I2S); } diff --git a/src/main/java/org/apache/bcel/generic/IADD.java b/src/main/java/org/apache/bcel/generic/IADD.java index 4b8511e5..13f48b84 100644 --- a/src/main/java/org/apache/bcel/generic/IADD.java +++ b/src/main/java/org/apache/bcel/generic/IADD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class IADD extends ArithmeticInstruction { + private static final long serialVersionUID = 8749750216946526117L; + + /** Add ints */ public IADD() { diff --git a/src/main/java/org/apache/bcel/generic/IALOAD.java b/src/main/java/org/apache/bcel/generic/IALOAD.java index 6766e62c..050030d3 100644 --- a/src/main/java/org/apache/bcel/generic/IALOAD.java +++ b/src/main/java/org/apache/bcel/generic/IALOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class IALOAD extends ArrayInstruction implements StackProducer { + private static final long serialVersionUID = -3275094472217586613L; + + /** * Load int from array */ diff --git a/src/main/java/org/apache/bcel/generic/IAND.java b/src/main/java/org/apache/bcel/generic/IAND.java index c452b233..61825e52 100644 --- a/src/main/java/org/apache/bcel/generic/IAND.java +++ b/src/main/java/org/apache/bcel/generic/IAND.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class IAND extends ArithmeticInstruction { + private static final long serialVersionUID = -3190292062305201816L; + + public IAND() { super(org.apache.bcel.Constants.IAND); } diff --git a/src/main/java/org/apache/bcel/generic/IASTORE.java b/src/main/java/org/apache/bcel/generic/IASTORE.java index f858e470..d274ee5d 100644 --- a/src/main/java/org/apache/bcel/generic/IASTORE.java +++ b/src/main/java/org/apache/bcel/generic/IASTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class IASTORE extends ArrayInstruction implements StackConsumer { + private static final long serialVersionUID = -3570157505504012648L; + + /** * Store into int array */ diff --git a/src/main/java/org/apache/bcel/generic/ICONST.java b/src/main/java/org/apache/bcel/generic/ICONST.java index 1c09fdfb..98055ad0 100644 --- a/src/main/java/org/apache/bcel/generic/ICONST.java +++ b/src/main/java/org/apache/bcel/generic/ICONST.java @@ -27,6 +27,7 @@ package org.apache.bcel.generic; */ public class ICONST extends Instruction implements ConstantPushInstruction { + private static final long serialVersionUID = -174595933747784635L; private int value; diff --git a/src/main/java/org/apache/bcel/generic/IDIV.java b/src/main/java/org/apache/bcel/generic/IDIV.java index ce2a6577..902b514e 100644 --- a/src/main/java/org/apache/bcel/generic/IDIV.java +++ b/src/main/java/org/apache/bcel/generic/IDIV.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class IDIV extends ArithmeticInstruction implements ExceptionThrower { + private static final long serialVersionUID = -7104037931993634172L; + + /** Divide ints */ public IDIV() { diff --git a/src/main/java/org/apache/bcel/generic/IFEQ.java b/src/main/java/org/apache/bcel/generic/IFEQ.java index 5f8cd07f..a53acc19 100644 --- a/src/main/java/org/apache/bcel/generic/IFEQ.java +++ b/src/main/java/org/apache/bcel/generic/IFEQ.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IFEQ extends IfInstruction { + private static final long serialVersionUID = -6140576561545855324L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IFGE.java b/src/main/java/org/apache/bcel/generic/IFGE.java index 2b35a74b..ab7ab353 100644 --- a/src/main/java/org/apache/bcel/generic/IFGE.java +++ b/src/main/java/org/apache/bcel/generic/IFGE.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IFGE extends IfInstruction { + private static final long serialVersionUID = 8975527282985945729L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IFGT.java b/src/main/java/org/apache/bcel/generic/IFGT.java index 3897fa1d..f7360ed0 100644 --- a/src/main/java/org/apache/bcel/generic/IFGT.java +++ b/src/main/java/org/apache/bcel/generic/IFGT.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IFGT extends IfInstruction { + private static final long serialVersionUID = -6271055211127179697L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IFLE.java b/src/main/java/org/apache/bcel/generic/IFLE.java index 00b89f7b..7f6f23c7 100644 --- a/src/main/java/org/apache/bcel/generic/IFLE.java +++ b/src/main/java/org/apache/bcel/generic/IFLE.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IFLE extends IfInstruction { + private static final long serialVersionUID = 7916641859064664263L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IFLT.java b/src/main/java/org/apache/bcel/generic/IFLT.java index 59eebe08..dcfbdc1b 100644 --- a/src/main/java/org/apache/bcel/generic/IFLT.java +++ b/src/main/java/org/apache/bcel/generic/IFLT.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IFLT extends IfInstruction { + private static final long serialVersionUID = 2489268758129304231L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IFNE.java b/src/main/java/org/apache/bcel/generic/IFNE.java index 318be5dc..947d40d7 100644 --- a/src/main/java/org/apache/bcel/generic/IFNE.java +++ b/src/main/java/org/apache/bcel/generic/IFNE.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IFNE extends IfInstruction { + private static final long serialVersionUID = -5417647524534847152L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IFNONNULL.java b/src/main/java/org/apache/bcel/generic/IFNONNULL.java index 27c6d397..17483975 100644 --- a/src/main/java/org/apache/bcel/generic/IFNONNULL.java +++ b/src/main/java/org/apache/bcel/generic/IFNONNULL.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IFNONNULL extends IfInstruction { + private static final long serialVersionUID = -6378085152112796792L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IFNULL.java b/src/main/java/org/apache/bcel/generic/IFNULL.java index a5ee1fe0..9bac51cb 100644 --- a/src/main/java/org/apache/bcel/generic/IFNULL.java +++ b/src/main/java/org/apache/bcel/generic/IFNULL.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IFNULL extends IfInstruction { + private static final long serialVersionUID = 608514554995424349L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java index f78f9d76..322a8dd8 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java +++ b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IF_ACMPEQ extends IfInstruction { + private static final long serialVersionUID = -4528733406576671849L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java index 61ba4b5e..b880a074 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IF_ACMPNE extends IfInstruction { + private static final long serialVersionUID = -5532275839192747402L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java index 5f5970fd..0c66aee8 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IF_ICMPEQ extends IfInstruction { + private static final long serialVersionUID = -3149605608148417123L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java index 8dd3274b..ad57fd56 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IF_ICMPGE extends IfInstruction { + private static final long serialVersionUID = -1887574519712008723L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java index 4448f0a8..92cd2d96 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IF_ICMPGT extends IfInstruction { + private static final long serialVersionUID = -2569877744173094534L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java index a83ffeca..fb1bd066 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IF_ICMPLE extends IfInstruction { + private static final long serialVersionUID = -6863915647505504868L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java index 793b81a1..5156adb5 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IF_ICMPLT extends IfInstruction { + private static final long serialVersionUID = -6835991395337462478L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java index 53e56bf6..cf978c2c 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class IF_ICMPNE extends IfInstruction { + private static final long serialVersionUID = -3908465635973274661L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IINC.java b/src/main/java/org/apache/bcel/generic/IINC.java index 24ed319c..599cfe57 100644 --- a/src/main/java/org/apache/bcel/generic/IINC.java +++ b/src/main/java/org/apache/bcel/generic/IINC.java @@ -29,6 +29,7 @@ import org.apache.bcel.util.ByteSequence; */ public class IINC extends LocalVariableInstruction { + private static final long serialVersionUID = -8938364416647466869L; private boolean wide; private int c; diff --git a/src/main/java/org/apache/bcel/generic/ILOAD.java b/src/main/java/org/apache/bcel/generic/ILOAD.java index 33610902..dfafcde5 100644 --- a/src/main/java/org/apache/bcel/generic/ILOAD.java +++ b/src/main/java/org/apache/bcel/generic/ILOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class ILOAD extends LoadInstruction { + private static final long serialVersionUID = 7568563453093184347L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP1.java b/src/main/java/org/apache/bcel/generic/IMPDEP1.java index 5a0955aa..bf1a7dfe 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP1.java +++ b/src/main/java/org/apache/bcel/generic/IMPDEP1.java @@ -25,6 +25,9 @@ package org.apache.bcel.generic; */ public class IMPDEP1 extends Instruction { + private static final long serialVersionUID = 134641616863598508L; + + public IMPDEP1() { super(org.apache.bcel.Constants.IMPDEP1, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP2.java b/src/main/java/org/apache/bcel/generic/IMPDEP2.java index 39fc5cb4..1451fbd0 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP2.java +++ b/src/main/java/org/apache/bcel/generic/IMPDEP2.java @@ -25,6 +25,9 @@ package org.apache.bcel.generic; */ public class IMPDEP2 extends Instruction { + private static final long serialVersionUID = 4097564761941607538L; + + public IMPDEP2() { super(org.apache.bcel.Constants.IMPDEP2, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/IMUL.java b/src/main/java/org/apache/bcel/generic/IMUL.java index 32decd9e..ebce18c2 100644 --- a/src/main/java/org/apache/bcel/generic/IMUL.java +++ b/src/main/java/org/apache/bcel/generic/IMUL.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class IMUL extends ArithmeticInstruction { + private static final long serialVersionUID = -7475024981820292461L; + + /** Multiply ints */ public IMUL() { diff --git a/src/main/java/org/apache/bcel/generic/INEG.java b/src/main/java/org/apache/bcel/generic/INEG.java index 95615b17..b177a749 100644 --- a/src/main/java/org/apache/bcel/generic/INEG.java +++ b/src/main/java/org/apache/bcel/generic/INEG.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class INEG extends ArithmeticInstruction { + private static final long serialVersionUID = 6175987548738672934L; + + public INEG() { super(org.apache.bcel.Constants.INEG); } diff --git a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java index 1041ec6b..172cb866 100644 --- a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java +++ b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThrower, StackProducer, StackConsumer { + private static final long serialVersionUID = -1068668479062613915L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java index d30be00b..fa3d434a 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -33,6 +33,7 @@ import org.apache.bcel.util.ByteSequence; */ public final class INVOKEINTERFACE extends InvokeInstruction { + private static final long serialVersionUID = 8198753714085379482L; private int nargs; // Number of arguments on stack (number of stack slots), called "count" in vmspec2 diff --git a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java index b3937340..ea3b7a00 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -31,6 +31,9 @@ import org.apache.bcel.ExceptionConstants; */ public class INVOKESPECIAL extends InvokeInstruction { + private static final long serialVersionUID = -6615779239416262849L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java index d70f600f..e8635a5f 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -30,6 +30,9 @@ import org.apache.bcel.ExceptionConstants; */ public class INVOKESTATIC extends InvokeInstruction { + private static final long serialVersionUID = -2160020248508943620L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java index 93476e00..51e00d5a 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -30,6 +30,9 @@ import org.apache.bcel.ExceptionConstants; */ public class INVOKEVIRTUAL extends InvokeInstruction { + private static final long serialVersionUID = -7355623307528443725L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/IOR.java b/src/main/java/org/apache/bcel/generic/IOR.java index 1c81d541..db21eb0f 100644 --- a/src/main/java/org/apache/bcel/generic/IOR.java +++ b/src/main/java/org/apache/bcel/generic/IOR.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class IOR extends ArithmeticInstruction { + private static final long serialVersionUID = -6128609553204409153L; + + public IOR() { super(org.apache.bcel.Constants.IOR); } diff --git a/src/main/java/org/apache/bcel/generic/IREM.java b/src/main/java/org/apache/bcel/generic/IREM.java index 4f15bb16..edd5b713 100644 --- a/src/main/java/org/apache/bcel/generic/IREM.java +++ b/src/main/java/org/apache/bcel/generic/IREM.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class IREM extends ArithmeticInstruction implements ExceptionThrower { + private static final long serialVersionUID = 834504719616513910L; + + /** Remainder of ints */ public IREM() { diff --git a/src/main/java/org/apache/bcel/generic/IRETURN.java b/src/main/java/org/apache/bcel/generic/IRETURN.java index 938696c0..6f373001 100644 --- a/src/main/java/org/apache/bcel/generic/IRETURN.java +++ b/src/main/java/org/apache/bcel/generic/IRETURN.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class IRETURN extends ReturnInstruction { + private static final long serialVersionUID = 4067606299818510584L; + + /** Return int from method */ public IRETURN() { diff --git a/src/main/java/org/apache/bcel/generic/ISHL.java b/src/main/java/org/apache/bcel/generic/ISHL.java index 4b569373..5a28bd98 100644 --- a/src/main/java/org/apache/bcel/generic/ISHL.java +++ b/src/main/java/org/apache/bcel/generic/ISHL.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class ISHL extends ArithmeticInstruction { + private static final long serialVersionUID = -7440998118555505042L; + + public ISHL() { super(org.apache.bcel.Constants.ISHL); } diff --git a/src/main/java/org/apache/bcel/generic/ISHR.java b/src/main/java/org/apache/bcel/generic/ISHR.java index 3e8874e3..43f535e0 100644 --- a/src/main/java/org/apache/bcel/generic/ISHR.java +++ b/src/main/java/org/apache/bcel/generic/ISHR.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class ISHR extends ArithmeticInstruction { + private static final long serialVersionUID = 7401114050910307281L; + + public ISHR() { super(org.apache.bcel.Constants.ISHR); } diff --git a/src/main/java/org/apache/bcel/generic/ISTORE.java b/src/main/java/org/apache/bcel/generic/ISTORE.java index fda96e31..1fd264da 100644 --- a/src/main/java/org/apache/bcel/generic/ISTORE.java +++ b/src/main/java/org/apache/bcel/generic/ISTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class ISTORE extends StoreInstruction { + private static final long serialVersionUID = 6155373362393796303L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/ISUB.java b/src/main/java/org/apache/bcel/generic/ISUB.java index 1595f315..dd0f021f 100644 --- a/src/main/java/org/apache/bcel/generic/ISUB.java +++ b/src/main/java/org/apache/bcel/generic/ISUB.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class ISUB extends ArithmeticInstruction { + private static final long serialVersionUID = 1878271684888856459L; + + /** Substract ints */ public ISUB() { diff --git a/src/main/java/org/apache/bcel/generic/IUSHR.java b/src/main/java/org/apache/bcel/generic/IUSHR.java index 1057dd84..0c7ff66f 100644 --- a/src/main/java/org/apache/bcel/generic/IUSHR.java +++ b/src/main/java/org/apache/bcel/generic/IUSHR.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class IUSHR extends ArithmeticInstruction { + private static final long serialVersionUID = -4507658555921269426L; + + public IUSHR() { super(org.apache.bcel.Constants.IUSHR); } diff --git a/src/main/java/org/apache/bcel/generic/IXOR.java b/src/main/java/org/apache/bcel/generic/IXOR.java index c9fb009d..76c9cd6c 100644 --- a/src/main/java/org/apache/bcel/generic/IXOR.java +++ b/src/main/java/org/apache/bcel/generic/IXOR.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class IXOR extends ArithmeticInstruction { + private static final long serialVersionUID = -6524415552072672532L; + + public IXOR() { super(org.apache.bcel.Constants.IXOR); } diff --git a/src/main/java/org/apache/bcel/generic/IfInstruction.java b/src/main/java/org/apache/bcel/generic/IfInstruction.java index 56da6a35..1b936caa 100644 --- a/src/main/java/org/apache/bcel/generic/IfInstruction.java +++ b/src/main/java/org/apache/bcel/generic/IfInstruction.java @@ -25,6 +25,9 @@ package org.apache.bcel.generic; */ public abstract class IfInstruction extends BranchInstruction implements StackConsumer { + private static final long serialVersionUID = -781053966413893941L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index 86773bdb..0d9668b2 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -32,6 +32,7 @@ import org.apache.bcel.util.ByteSequence; */ public abstract class Instruction implements Cloneable, Serializable { + private static final long serialVersionUID = -2518741982574515847L; protected short length = 1; // Length of instruction in bytes protected short opcode = -1; // Opcode number private static InstructionComparator cmp = InstructionComparator.DEFAULT; diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index bac4fb24..d8ec7382 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -31,7 +31,9 @@ import org.apache.bcel.Constants; */ public class InstructionFactory implements InstructionConstants, java.io.Serializable { - private static final String[] short_names = { + private static final long serialVersionUID = -1210011499635580258L; + + private static final String[] short_names = { "C", "F", "D", "B", "S", "I", "L" }; diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java index 6688fe88..3faa0f46 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/main/java/org/apache/bcel/generic/InstructionHandle.java @@ -44,6 +44,7 @@ import org.apache.bcel.classfile.Utility; */ public class InstructionHandle implements java.io.Serializable { + private static final long serialVersionUID = -3585254135692924106L; InstructionHandle next, prev; // Will be set from the outside Instruction instruction; protected int i_position = -1; // byte code offset of instruction diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 24ed1dbf..0a7a23f5 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -53,6 +53,7 @@ import org.apache.bcel.util.ByteSequence; */ public class InstructionList implements Serializable { + private static final long serialVersionUID = 2651389055345707857L; private InstructionHandle start = null, end = null; private int length = 0; // number of elements in list private int[] byte_positions; // byte code offsets corresponding to instructions diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index 896c1f03..61fb7f07 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -31,6 +31,9 @@ import org.apache.bcel.classfile.ConstantPool; public abstract class InvokeInstruction extends FieldOrMethod implements ExceptionThrower, StackConsumer, StackProducer { + private static final long serialVersionUID = 6089031137856650442L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/JSR.java b/src/main/java/org/apache/bcel/generic/JSR.java index 5913f1e6..2106df9d 100644 --- a/src/main/java/org/apache/bcel/generic/JSR.java +++ b/src/main/java/org/apache/bcel/generic/JSR.java @@ -28,6 +28,9 @@ import java.io.IOException; */ public class JSR extends JsrInstruction implements VariableLengthInstruction { + private static final long serialVersionUID = 7425681395340093184L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/JSR_W.java b/src/main/java/org/apache/bcel/generic/JSR_W.java index af7c251f..e8f70a17 100644 --- a/src/main/java/org/apache/bcel/generic/JSR_W.java +++ b/src/main/java/org/apache/bcel/generic/JSR_W.java @@ -29,6 +29,9 @@ import org.apache.bcel.util.ByteSequence; */ public class JSR_W extends JsrInstruction { + private static final long serialVersionUID = -7352049131416924650L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/JsrInstruction.java b/src/main/java/org/apache/bcel/generic/JsrInstruction.java index 5d7db734..fd4008ed 100644 --- a/src/main/java/org/apache/bcel/generic/JsrInstruction.java +++ b/src/main/java/org/apache/bcel/generic/JsrInstruction.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; public abstract class JsrInstruction extends BranchInstruction implements UnconditionalBranch, TypedInstruction, StackProducer { + private static final long serialVersionUID = -6438850002848773481L; + + JsrInstruction(short opcode, InstructionHandle target) { super(opcode, target); } diff --git a/src/main/java/org/apache/bcel/generic/L2D.java b/src/main/java/org/apache/bcel/generic/L2D.java index af3ac02c..f424c528 100644 --- a/src/main/java/org/apache/bcel/generic/L2D.java +++ b/src/main/java/org/apache/bcel/generic/L2D.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class L2D extends ConversionInstruction { + private static final long serialVersionUID = 1166552346340922659L; + + public L2D() { super(org.apache.bcel.Constants.L2D); } diff --git a/src/main/java/org/apache/bcel/generic/L2F.java b/src/main/java/org/apache/bcel/generic/L2F.java index 924471ff..e588bd23 100644 --- a/src/main/java/org/apache/bcel/generic/L2F.java +++ b/src/main/java/org/apache/bcel/generic/L2F.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class L2F extends ConversionInstruction { + private static final long serialVersionUID = -7181529985408901328L; + + public L2F() { super(org.apache.bcel.Constants.L2F); } diff --git a/src/main/java/org/apache/bcel/generic/L2I.java b/src/main/java/org/apache/bcel/generic/L2I.java index c67e0093..bdfaad19 100644 --- a/src/main/java/org/apache/bcel/generic/L2I.java +++ b/src/main/java/org/apache/bcel/generic/L2I.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class L2I extends ConversionInstruction { + private static final long serialVersionUID = -3263285222028195535L; + + public L2I() { super(org.apache.bcel.Constants.L2I); } diff --git a/src/main/java/org/apache/bcel/generic/LADD.java b/src/main/java/org/apache/bcel/generic/LADD.java index 497abbb6..09d750e0 100644 --- a/src/main/java/org/apache/bcel/generic/LADD.java +++ b/src/main/java/org/apache/bcel/generic/LADD.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class LADD extends ArithmeticInstruction { + private static final long serialVersionUID = 2093272772688460551L; + + public LADD() { super(org.apache.bcel.Constants.LADD); } diff --git a/src/main/java/org/apache/bcel/generic/LALOAD.java b/src/main/java/org/apache/bcel/generic/LALOAD.java index e2d31047..999975bb 100644 --- a/src/main/java/org/apache/bcel/generic/LALOAD.java +++ b/src/main/java/org/apache/bcel/generic/LALOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class LALOAD extends ArrayInstruction implements StackProducer { + private static final long serialVersionUID = -3687594761485525620L; + + /** Load long from array */ public LALOAD() { diff --git a/src/main/java/org/apache/bcel/generic/LAND.java b/src/main/java/org/apache/bcel/generic/LAND.java index fa17a9b9..96959e9a 100644 --- a/src/main/java/org/apache/bcel/generic/LAND.java +++ b/src/main/java/org/apache/bcel/generic/LAND.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class LAND extends ArithmeticInstruction { + private static final long serialVersionUID = 2429077463161192057L; + + public LAND() { super(org.apache.bcel.Constants.LAND); } diff --git a/src/main/java/org/apache/bcel/generic/LASTORE.java b/src/main/java/org/apache/bcel/generic/LASTORE.java index f75e0b1f..6d33678e 100644 --- a/src/main/java/org/apache/bcel/generic/LASTORE.java +++ b/src/main/java/org/apache/bcel/generic/LASTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class LASTORE extends ArrayInstruction implements StackConsumer { + private static final long serialVersionUID = -6758326777570451990L; + + /** Store long into array */ public LASTORE() { diff --git a/src/main/java/org/apache/bcel/generic/LCMP.java b/src/main/java/org/apache/bcel/generic/LCMP.java index 86e648ef..1b165a84 100644 --- a/src/main/java/org/apache/bcel/generic/LCMP.java +++ b/src/main/java/org/apache/bcel/generic/LCMP.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class LCMP extends Instruction implements TypedInstruction, StackProducer, StackConsumer { + private static final long serialVersionUID = 2981727810276161294L; + + public LCMP() { super(org.apache.bcel.Constants.LCMP, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/LCONST.java b/src/main/java/org/apache/bcel/generic/LCONST.java index cac34e6b..d97d4570 100644 --- a/src/main/java/org/apache/bcel/generic/LCONST.java +++ b/src/main/java/org/apache/bcel/generic/LCONST.java @@ -27,6 +27,7 @@ package org.apache.bcel.generic; */ public class LCONST extends Instruction implements ConstantPushInstruction { + private static final long serialVersionUID = 909025807621177822L; private long value; diff --git a/src/main/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java index b40520ac..8ca266b8 100644 --- a/src/main/java/org/apache/bcel/generic/LDC.java +++ b/src/main/java/org/apache/bcel/generic/LDC.java @@ -32,6 +32,9 @@ import org.apache.bcel.util.ByteSequence; */ public class LDC extends CPInstruction implements PushInstruction, ExceptionThrower { + private static final long serialVersionUID = -972820476154330719L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/LDC2_W.java b/src/main/java/org/apache/bcel/generic/LDC2_W.java index 5a256bf9..3ecd8b25 100644 --- a/src/main/java/org/apache/bcel/generic/LDC2_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC2_W.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class LDC2_W extends CPInstruction implements PushInstruction { + private static final long serialVersionUID = 7403326732924539892L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/LDC_W.java b/src/main/java/org/apache/bcel/generic/LDC_W.java index 715d720d..1290c38b 100644 --- a/src/main/java/org/apache/bcel/generic/LDC_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC_W.java @@ -30,6 +30,9 @@ import org.apache.bcel.util.ByteSequence; */ public class LDC_W extends LDC { + private static final long serialVersionUID = -8040188785844554411L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/LDIV.java b/src/main/java/org/apache/bcel/generic/LDIV.java index 072a71f9..312afc48 100644 --- a/src/main/java/org/apache/bcel/generic/LDIV.java +++ b/src/main/java/org/apache/bcel/generic/LDIV.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class LDIV extends ArithmeticInstruction implements ExceptionThrower { + private static final long serialVersionUID = 8188185695825749727L; + + public LDIV() { super(org.apache.bcel.Constants.LDIV); } diff --git a/src/main/java/org/apache/bcel/generic/LLOAD.java b/src/main/java/org/apache/bcel/generic/LLOAD.java index c3a0a03f..2c6f5f79 100644 --- a/src/main/java/org/apache/bcel/generic/LLOAD.java +++ b/src/main/java/org/apache/bcel/generic/LLOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class LLOAD extends LoadInstruction { + private static final long serialVersionUID = 379331602405124174L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/LMUL.java b/src/main/java/org/apache/bcel/generic/LMUL.java index 204ea831..dd3e65f8 100644 --- a/src/main/java/org/apache/bcel/generic/LMUL.java +++ b/src/main/java/org/apache/bcel/generic/LMUL.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class LMUL extends ArithmeticInstruction { + private static final long serialVersionUID = 3538398481425889023L; + + public LMUL() { super(org.apache.bcel.Constants.LMUL); } diff --git a/src/main/java/org/apache/bcel/generic/LNEG.java b/src/main/java/org/apache/bcel/generic/LNEG.java index 880a365b..1089d040 100644 --- a/src/main/java/org/apache/bcel/generic/LNEG.java +++ b/src/main/java/org/apache/bcel/generic/LNEG.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class LNEG extends ArithmeticInstruction { + private static final long serialVersionUID = 7749253327528155126L; + + public LNEG() { super(org.apache.bcel.Constants.LNEG); } diff --git a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java index 72b16303..9a90880c 100644 --- a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java +++ b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java @@ -30,6 +30,9 @@ import org.apache.bcel.util.ByteSequence; */ public class LOOKUPSWITCH extends Select { + private static final long serialVersionUID = -8263209830709467636L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/LOR.java b/src/main/java/org/apache/bcel/generic/LOR.java index 3d7f3220..93ee97aa 100644 --- a/src/main/java/org/apache/bcel/generic/LOR.java +++ b/src/main/java/org/apache/bcel/generic/LOR.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class LOR extends ArithmeticInstruction { + private static final long serialVersionUID = 7862213176431021916L; + + public LOR() { super(org.apache.bcel.Constants.LOR); } diff --git a/src/main/java/org/apache/bcel/generic/LREM.java b/src/main/java/org/apache/bcel/generic/LREM.java index 74372dcc..dde7f218 100644 --- a/src/main/java/org/apache/bcel/generic/LREM.java +++ b/src/main/java/org/apache/bcel/generic/LREM.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class LREM extends ArithmeticInstruction implements ExceptionThrower { + private static final long serialVersionUID = -3646771608200042527L; + + public LREM() { super(org.apache.bcel.Constants.LREM); } diff --git a/src/main/java/org/apache/bcel/generic/LRETURN.java b/src/main/java/org/apache/bcel/generic/LRETURN.java index 8f562de1..43fc646d 100644 --- a/src/main/java/org/apache/bcel/generic/LRETURN.java +++ b/src/main/java/org/apache/bcel/generic/LRETURN.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class LRETURN extends ReturnInstruction { + private static final long serialVersionUID = 6173148526583167918L; + + public LRETURN() { super(org.apache.bcel.Constants.LRETURN); } diff --git a/src/main/java/org/apache/bcel/generic/LSHL.java b/src/main/java/org/apache/bcel/generic/LSHL.java index 73a274cc..db46ea63 100644 --- a/src/main/java/org/apache/bcel/generic/LSHL.java +++ b/src/main/java/org/apache/bcel/generic/LSHL.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class LSHL extends ArithmeticInstruction { + private static final long serialVersionUID = 7855322471731877312L; + + public LSHL() { super(org.apache.bcel.Constants.LSHL); } diff --git a/src/main/java/org/apache/bcel/generic/LSHR.java b/src/main/java/org/apache/bcel/generic/LSHR.java index 398215f4..f18302b4 100644 --- a/src/main/java/org/apache/bcel/generic/LSHR.java +++ b/src/main/java/org/apache/bcel/generic/LSHR.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class LSHR extends ArithmeticInstruction { + private static final long serialVersionUID = -6376870568784516963L; + + public LSHR() { super(org.apache.bcel.Constants.LSHR); } diff --git a/src/main/java/org/apache/bcel/generic/LSTORE.java b/src/main/java/org/apache/bcel/generic/LSTORE.java index 1eed26fd..22752ab8 100644 --- a/src/main/java/org/apache/bcel/generic/LSTORE.java +++ b/src/main/java/org/apache/bcel/generic/LSTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class LSTORE extends StoreInstruction { + private static final long serialVersionUID = 1309214714647416201L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/LSUB.java b/src/main/java/org/apache/bcel/generic/LSUB.java index a36102da..15fa4a46 100644 --- a/src/main/java/org/apache/bcel/generic/LSUB.java +++ b/src/main/java/org/apache/bcel/generic/LSUB.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class LSUB extends ArithmeticInstruction { + private static final long serialVersionUID = -8379864362938353932L; + + public LSUB() { super(org.apache.bcel.Constants.LSUB); } diff --git a/src/main/java/org/apache/bcel/generic/LUSHR.java b/src/main/java/org/apache/bcel/generic/LUSHR.java index 4d732f11..f11f498e 100644 --- a/src/main/java/org/apache/bcel/generic/LUSHR.java +++ b/src/main/java/org/apache/bcel/generic/LUSHR.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class LUSHR extends ArithmeticInstruction { + private static final long serialVersionUID = 9184663422046843885L; + + public LUSHR() { super(org.apache.bcel.Constants.LUSHR); } diff --git a/src/main/java/org/apache/bcel/generic/LXOR.java b/src/main/java/org/apache/bcel/generic/LXOR.java index 0c49c846..43ddbb95 100644 --- a/src/main/java/org/apache/bcel/generic/LXOR.java +++ b/src/main/java/org/apache/bcel/generic/LXOR.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class LXOR extends ArithmeticInstruction { + private static final long serialVersionUID = -3031187042785170579L; + + public LXOR() { super(org.apache.bcel.Constants.LXOR); } diff --git a/src/main/java/org/apache/bcel/generic/LineNumberGen.java b/src/main/java/org/apache/bcel/generic/LineNumberGen.java index 9c2d9891..ba051b16 100644 --- a/src/main/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/main/java/org/apache/bcel/generic/LineNumberGen.java @@ -30,6 +30,7 @@ import org.apache.bcel.classfile.LineNumber; */ public class LineNumberGen implements InstructionTargeter, Cloneable, java.io.Serializable { + private static final long serialVersionUID = 4939965573936108738L; private InstructionHandle ih; private int src_line; diff --git a/src/main/java/org/apache/bcel/generic/LoadInstruction.java b/src/main/java/org/apache/bcel/generic/LoadInstruction.java index f3a2bd1a..8d5d9f54 100644 --- a/src/main/java/org/apache/bcel/generic/LoadInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LoadInstruction.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public abstract class LoadInstruction extends LocalVariableInstruction implements PushInstruction { + private static final long serialVersionUID = 3661924741022212247L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java index 0e1ae399..4e8f7539 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java @@ -34,6 +34,7 @@ import org.apache.bcel.classfile.LocalVariable; public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Cloneable, java.io.Serializable { + private static final long serialVersionUID = -3810966319065955534L; private int index; private String name; private Type type; diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java index 3d623ab6..b8567b57 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -31,6 +31,7 @@ import org.apache.bcel.util.ByteSequence; public abstract class LocalVariableInstruction extends Instruction implements TypedInstruction, IndexedInstruction { + private static final long serialVersionUID = 8322269736316122743L; protected int n = -1; // index of referenced variable private short c_tag = -1; // compact version, such as ILOAD_0 private short canon_tag = -1; // canonical tag such as ILOAD diff --git a/src/main/java/org/apache/bcel/generic/MONITORENTER.java b/src/main/java/org/apache/bcel/generic/MONITORENTER.java index 501aecf0..5303246c 100644 --- a/src/main/java/org/apache/bcel/generic/MONITORENTER.java +++ b/src/main/java/org/apache/bcel/generic/MONITORENTER.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class MONITORENTER extends Instruction implements ExceptionThrower, StackConsumer { + private static final long serialVersionUID = 4537302966975402521L; + + public MONITORENTER() { super(org.apache.bcel.Constants.MONITORENTER, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java index e215d8cd..27c6de2e 100644 --- a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java +++ b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class MONITOREXIT extends Instruction implements ExceptionThrower, StackConsumer { + private static final long serialVersionUID = -1499496577099659601L; + + public MONITOREXIT() { super(org.apache.bcel.Constants.MONITOREXIT, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java index 4b2639ff..82a86bad 100644 --- a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java @@ -33,6 +33,7 @@ import org.apache.bcel.util.ByteSequence; public class MULTIANEWARRAY extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower { + private static final long serialVersionUID = -7439639244808941662L; private short dimensions; diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index ec1a98d6..f153be48 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -59,6 +59,7 @@ import org.apache.bcel.util.BCELComparator; */ public class MethodGen extends FieldGenOrMethodGen { + private static final long serialVersionUID = -3924667713338957720L; private String class_name; private Type[] arg_types; private String[] arg_names; diff --git a/src/main/java/org/apache/bcel/generic/NEW.java b/src/main/java/org/apache/bcel/generic/NEW.java index 9dea3a54..d016c150 100644 --- a/src/main/java/org/apache/bcel/generic/NEW.java +++ b/src/main/java/org/apache/bcel/generic/NEW.java @@ -29,6 +29,9 @@ import org.apache.bcel.ExceptionConstants; public class NEW extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower, StackProducer { + private static final long serialVersionUID = 5773167897857305796L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/NEWARRAY.java b/src/main/java/org/apache/bcel/generic/NEWARRAY.java index 31833e36..c3086617 100644 --- a/src/main/java/org/apache/bcel/generic/NEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/NEWARRAY.java @@ -32,6 +32,7 @@ import org.apache.bcel.util.ByteSequence; public class NEWARRAY extends Instruction implements AllocationInstruction, ExceptionThrower, StackProducer { + private static final long serialVersionUID = 7048445841018649405L; private byte type; diff --git a/src/main/java/org/apache/bcel/generic/NOP.java b/src/main/java/org/apache/bcel/generic/NOP.java index 6294ee8b..473a709e 100644 --- a/src/main/java/org/apache/bcel/generic/NOP.java +++ b/src/main/java/org/apache/bcel/generic/NOP.java @@ -25,6 +25,9 @@ package org.apache.bcel.generic; */ public class NOP extends Instruction { + private static final long serialVersionUID = -244116825309415153L; + + public NOP() { super(org.apache.bcel.Constants.NOP, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index 94ca0c51..9bf64bc4 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -29,6 +29,7 @@ import org.apache.bcel.classfile.JavaClass; */ public class ObjectType extends ReferenceType { + private static final long serialVersionUID = -2819379966444533294L; private String class_name; // Class name of type diff --git a/src/main/java/org/apache/bcel/generic/POP.java b/src/main/java/org/apache/bcel/generic/POP.java index e8a03891..03dde652 100644 --- a/src/main/java/org/apache/bcel/generic/POP.java +++ b/src/main/java/org/apache/bcel/generic/POP.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class POP extends StackInstruction implements PopInstruction { + private static final long serialVersionUID = -7366757965427670388L; + + public POP() { super(org.apache.bcel.Constants.POP); } diff --git a/src/main/java/org/apache/bcel/generic/POP2.java b/src/main/java/org/apache/bcel/generic/POP2.java index 8bab143b..0dab36c0 100644 --- a/src/main/java/org/apache/bcel/generic/POP2.java +++ b/src/main/java/org/apache/bcel/generic/POP2.java @@ -27,6 +27,9 @@ package org.apache.bcel.generic; */ public class POP2 extends StackInstruction implements PopInstruction { + private static final long serialVersionUID = -3868598204285850458L; + + public POP2() { super(org.apache.bcel.Constants.POP2); } diff --git a/src/main/java/org/apache/bcel/generic/PUTFIELD.java b/src/main/java/org/apache/bcel/generic/PUTFIELD.java index 97cfaca5..e9e0456f 100644 --- a/src/main/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/main/java/org/apache/bcel/generic/PUTFIELD.java @@ -31,6 +31,9 @@ import org.apache.bcel.ExceptionConstants; */ public class PUTFIELD extends FieldInstruction implements PopInstruction, ExceptionThrower { + private static final long serialVersionUID = -3931392044558815011L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java index 3c492ce8..6c954226 100644 --- a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java @@ -31,6 +31,9 @@ import org.apache.bcel.ExceptionConstants; */ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, PopInstruction { + private static final long serialVersionUID = -1992788532422473584L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/RET.java b/src/main/java/org/apache/bcel/generic/RET.java index a9e528cc..aac97c49 100644 --- a/src/main/java/org/apache/bcel/generic/RET.java +++ b/src/main/java/org/apache/bcel/generic/RET.java @@ -31,6 +31,7 @@ import org.apache.bcel.util.ByteSequence; */ public class RET extends Instruction implements IndexedInstruction, TypedInstruction { + private static final long serialVersionUID = -3751746568458761719L; private boolean wide; private int index; // index to local variable containg the return address diff --git a/src/main/java/org/apache/bcel/generic/RETURN.java b/src/main/java/org/apache/bcel/generic/RETURN.java index 3014a875..97f0268f 100644 --- a/src/main/java/org/apache/bcel/generic/RETURN.java +++ b/src/main/java/org/apache/bcel/generic/RETURN.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class RETURN extends ReturnInstruction { + private static final long serialVersionUID = -7375896559820981467L; + + public RETURN() { super(org.apache.bcel.Constants.RETURN); } diff --git a/src/main/java/org/apache/bcel/generic/ReferenceType.java b/src/main/java/org/apache/bcel/generic/ReferenceType.java index 34ad1f94..be256caf 100644 --- a/src/main/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/main/java/org/apache/bcel/generic/ReferenceType.java @@ -29,6 +29,9 @@ import org.apache.bcel.classfile.JavaClass; */ public abstract class ReferenceType extends Type { + private static final long serialVersionUID = -1434716548829506031L; + + protected ReferenceType(byte t, String s) { super(t, s); } diff --git a/src/main/java/org/apache/bcel/generic/ReturnInstruction.java b/src/main/java/org/apache/bcel/generic/ReturnInstruction.java index 09a64cd4..d2d4af14 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ReturnInstruction.java @@ -29,6 +29,9 @@ import org.apache.bcel.ExceptionConstants; public abstract class ReturnInstruction extends Instruction implements ExceptionThrower, TypedInstruction, StackConsumer { + private static final long serialVersionUID = -1248578537710620153L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java index b43eab88..a44408b9 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java @@ -28,6 +28,7 @@ import org.apache.bcel.Constants; */ public class ReturnaddressType extends Type { + private static final long serialVersionUID = 3782621476731023927L; public static final ReturnaddressType NO_TARGET = new ReturnaddressType(); private InstructionHandle returnTarget; diff --git a/src/main/java/org/apache/bcel/generic/SALOAD.java b/src/main/java/org/apache/bcel/generic/SALOAD.java index 1455be67..451e6fba 100644 --- a/src/main/java/org/apache/bcel/generic/SALOAD.java +++ b/src/main/java/org/apache/bcel/generic/SALOAD.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class SALOAD extends ArrayInstruction implements StackProducer { + private static final long serialVersionUID = 7178769326864697416L; + + public SALOAD() { super(org.apache.bcel.Constants.SALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/SASTORE.java b/src/main/java/org/apache/bcel/generic/SASTORE.java index 54180b7d..aa4c21e1 100644 --- a/src/main/java/org/apache/bcel/generic/SASTORE.java +++ b/src/main/java/org/apache/bcel/generic/SASTORE.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class SASTORE extends ArrayInstruction implements StackConsumer { + private static final long serialVersionUID = -5187452948601765872L; + + public SASTORE() { super(org.apache.bcel.Constants.SASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/SIPUSH.java b/src/main/java/org/apache/bcel/generic/SIPUSH.java index be870b44..43e00f3b 100644 --- a/src/main/java/org/apache/bcel/generic/SIPUSH.java +++ b/src/main/java/org/apache/bcel/generic/SIPUSH.java @@ -31,6 +31,7 @@ import org.apache.bcel.util.ByteSequence; */ public class SIPUSH extends Instruction implements ConstantPushInstruction { + private static final long serialVersionUID = -5670145672311191256L; private short b; diff --git a/src/main/java/org/apache/bcel/generic/SWAP.java b/src/main/java/org/apache/bcel/generic/SWAP.java index e28e42e5..848c661e 100644 --- a/src/main/java/org/apache/bcel/generic/SWAP.java +++ b/src/main/java/org/apache/bcel/generic/SWAP.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public class SWAP extends StackInstruction implements StackConsumer, StackProducer { + private static final long serialVersionUID = 1965736870393433312L; + + public SWAP() { super(org.apache.bcel.Constants.SWAP); } diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index a0d19b3e..5bd9ec73 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -35,6 +35,7 @@ import org.apache.bcel.util.ByteSequence; public abstract class Select extends BranchInstruction implements VariableLengthInstruction, StackProducer { + private static final long serialVersionUID = 2806771744559217250L; protected int[] match; // matches, i.e., case 1: ... protected int[] indices; // target offsets protected InstructionHandle[] targets; // target objects in instruction list diff --git a/src/main/java/org/apache/bcel/generic/StackInstruction.java b/src/main/java/org/apache/bcel/generic/StackInstruction.java index c670e2f3..406ca22d 100644 --- a/src/main/java/org/apache/bcel/generic/StackInstruction.java +++ b/src/main/java/org/apache/bcel/generic/StackInstruction.java @@ -25,6 +25,9 @@ package org.apache.bcel.generic; */ public abstract class StackInstruction extends Instruction { + private static final long serialVersionUID = -8542057001831958935L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/StoreInstruction.java b/src/main/java/org/apache/bcel/generic/StoreInstruction.java index 410037f0..d8b9f175 100644 --- a/src/main/java/org/apache/bcel/generic/StoreInstruction.java +++ b/src/main/java/org/apache/bcel/generic/StoreInstruction.java @@ -26,6 +26,9 @@ package org.apache.bcel.generic; */ public abstract class StoreInstruction extends LocalVariableInstruction implements PopInstruction { + private static final long serialVersionUID = -774241740383612113L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java index 3917b1d3..af32cdf3 100644 --- a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java @@ -30,6 +30,9 @@ import org.apache.bcel.util.ByteSequence; */ public class TABLESWITCH extends Select { + private static final long serialVersionUID = -1178229029789923698L; + + /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/bcel/generic/TargetLostException.java b/src/main/java/org/apache/bcel/generic/TargetLostException.java index 888664a1..327fe778 100644 --- a/src/main/java/org/apache/bcel/generic/TargetLostException.java +++ b/src/main/java/org/apache/bcel/generic/TargetLostException.java @@ -50,6 +50,7 @@ package org.apache.bcel.generic; */ public final class TargetLostException extends Exception { + private static final long serialVersionUID = -6857272667645328384L; private InstructionHandle[] targets; diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 2832dbde..33cac482 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -33,6 +33,7 @@ import org.apache.bcel.classfile.Utility; */ public abstract class Type implements java.io.Serializable { + private static final long serialVersionUID = -1985077286871826895L; protected byte type; protected String signature; // signature for the type /** Predefined constants @@ -53,8 +54,12 @@ public abstract class Type implements java.io.Serializable { public static final ObjectType THROWABLE = new ObjectType("java.lang.Throwable"); public static final Type[] NO_ARGS = new Type[0]; public static final ReferenceType NULL = new ReferenceType() { + + private static final long serialVersionUID = 4526765862386946282L; }; public static final Type UNKNOWN = new Type(Constants.T_UNKNOWN, "") { + + private static final long serialVersionUID = 1321113605813486066L; }; diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java index 445fe8ce..5e1d4d12 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -39,6 +39,7 @@ import org.apache.bcel.classfile.JavaClass; */ public class ClassLoaderRepository implements Repository { + private static final long serialVersionUID = -1052781833503868187L; private java.lang.ClassLoader loader; private Map loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 7fd53b20..e4c49363 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -45,6 +45,7 @@ import java.util.zip.ZipFile; */ public class ClassPath implements Serializable { + private static final long serialVersionUID = 2099441438483340671L; public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(); private PathEntry[] paths; private String class_path; @@ -353,6 +354,7 @@ public class ClassPath implements Serializable { private static abstract class PathEntry implements Serializable { + private static final long serialVersionUID = 6828494485207666122L; abstract ClassFile getClassFile( String name, String suffix ) throws IOException; abstract URL getResource(String name); abstract InputStream getResourceAsStream(String name); @@ -390,6 +392,7 @@ public class ClassPath implements Serializable { private static class Dir extends PathEntry { + private static final long serialVersionUID = 4374062802142373088L; private String dir; @@ -460,6 +463,7 @@ public class ClassPath implements Serializable { private static class Zip extends PathEntry { + private static final long serialVersionUID = -2210747632897905532L; private ZipFile zip; diff --git a/src/main/java/org/apache/bcel/util/ClassQueue.java b/src/main/java/org/apache/bcel/util/ClassQueue.java index accf6703..fb409a5a 100644 --- a/src/main/java/org/apache/bcel/util/ClassQueue.java +++ b/src/main/java/org/apache/bcel/util/ClassQueue.java @@ -29,6 +29,7 @@ import org.apache.bcel.classfile.JavaClass; */ public class ClassQueue implements java.io.Serializable { + private static final long serialVersionUID = 685144104322420292L; protected LinkedList vec = new LinkedList(); diff --git a/src/main/java/org/apache/bcel/util/ClassSet.java b/src/main/java/org/apache/bcel/util/ClassSet.java index 1b79cb89..30c0869d 100644 --- a/src/main/java/org/apache/bcel/util/ClassSet.java +++ b/src/main/java/org/apache/bcel/util/ClassSet.java @@ -33,6 +33,7 @@ import org.apache.bcel.classfile.JavaClass; */ public class ClassSet implements java.io.Serializable { + private static final long serialVersionUID = -7476907380350035254L; private Map _map = new HashMap(); diff --git a/src/main/java/org/apache/bcel/util/ClassStack.java b/src/main/java/org/apache/bcel/util/ClassStack.java index c7933628..8b267db7 100644 --- a/src/main/java/org/apache/bcel/util/ClassStack.java +++ b/src/main/java/org/apache/bcel/util/ClassStack.java @@ -29,6 +29,7 @@ import org.apache.bcel.classfile.JavaClass; */ public class ClassStack implements java.io.Serializable { + private static final long serialVersionUID = 6126079269396985982L; private Stack stack = new Stack(); diff --git a/src/main/java/org/apache/bcel/util/ClassVector.java b/src/main/java/org/apache/bcel/util/ClassVector.java index 1ddbb4e6..2681b42c 100644 --- a/src/main/java/org/apache/bcel/util/ClassVector.java +++ b/src/main/java/org/apache/bcel/util/ClassVector.java @@ -32,6 +32,7 @@ import org.apache.bcel.classfile.JavaClass; */ public class ClassVector implements java.io.Serializable { + private static final long serialVersionUID = 5600397075672780806L; protected List vec = new ArrayList(); diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index 2dc7e7b9..ceaa3c8c 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -48,6 +48,7 @@ import org.apache.bcel.classfile.JavaClass; */ public class SyntheticRepository implements Repository { + private static final long serialVersionUID = 2923440730410019444L; //private static final String DEFAULT_PATH = ClassPath.getClassPath(); private static final Map _instances = new HashMap(); // CLASSPATH X REPOSITORY private ClassPath _path = null; diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index c6c4ca41..eb486b8d 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -50,6 +50,7 @@ import org.apache.bcel.classfile.JavaClass; */ public class VerifierAppFrame extends JFrame { + private static final long serialVersionUID = -542458133073307640L; JPanel contentPane; JSplitPane jSplitPane1 = new JSplitPane(); JPanel jPanel1 = new JPanel(); diff --git a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java index 3c11cc45..3ee69ef1 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java +++ b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java @@ -36,6 +36,7 @@ import org.apache.bcel.classfile.JavaClass; */ public class VerifyDialog extends javax.swing.JDialog { + private static final long serialVersionUID = -6374807677043142313L; /** Machine-generated. */ private javax.swing.JPanel ivjJDialogContentPane = null; /** Machine-generated. */ diff --git a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java index 5658744b..be033293 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java @@ -26,7 +26,8 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public final class AssertionViolatedException extends RuntimeException{ - /** The error message. */ + private static final long serialVersionUID = -129822266349567409L; + /** The error message. */ private String detailMessage; /** Constructs a new AssertionViolatedException with null as its error message string. */ public AssertionViolatedException(){ diff --git a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java index 73f30fe4..328e978d 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java @@ -27,7 +27,9 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class ClassConstraintException extends VerificationException{ - /** + private static final long serialVersionUID = -4745598983569128296L; + + /** * Constructs a new ClassConstraintException with null as its error message string. */ public ClassConstraintException(){ diff --git a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java index c9243265..c1de5f4d 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java @@ -26,7 +26,8 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public abstract class CodeConstraintException extends VerificationException{ - /** + private static final long serialVersionUID = -7265388214714996640L; + /** * Constructs a new CodeConstraintException with null as its error message string. */ CodeConstraintException(){ diff --git a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java index 84ef57e2..c03b4ddb 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java @@ -26,7 +26,9 @@ package org.apache.bcel.verifier.exc; */ public class InvalidMethodException extends RuntimeException{ - /** Constructs an InvalidMethodException with the specified detail message. */ + private static final long serialVersionUID = -7060302743724808051L; + + /** Constructs an InvalidMethodException with the specified detail message. */ public InvalidMethodException(String message){ super(message); } diff --git a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java index afb49a17..d5044ffc 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java @@ -35,4 +35,6 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class LinkingConstraintException extends StructuralCodeConstraintException{ + + private static final long serialVersionUID = -5239226345026321126L; } diff --git a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java index a1b3e81e..ccfb6c8c 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java @@ -27,7 +27,9 @@ package org.apache.bcel.verifier.exc; */ public class LoadingException extends VerifierConstraintViolatedException{ - /** + private static final long serialVersionUID = -7911901533049018823L; + + /** * Constructs a new LoadingException with null as its error message string. */ public LoadingException(){ diff --git a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java index f2324b7e..962bb627 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java @@ -29,7 +29,9 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class LocalVariableInfoInconsistentException extends ClassConstraintException{ - /** + private static final long serialVersionUID = -2833180480144304190L; + + /** * Constructs a new LocalVariableInfoInconsistentException with null as its error message string. */ public LocalVariableInfoInconsistentException(){ diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java index 46190c66..b4e2568a 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java @@ -29,7 +29,9 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public abstract class StaticCodeConstraintException extends CodeConstraintException{ - public StaticCodeConstraintException(String message){ + private static final long serialVersionUID = 3858523065007725128L; + + public StaticCodeConstraintException(String message){ super(message); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java index 5d5acaca..5e4dfb9f 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java @@ -32,7 +32,9 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class StaticCodeInstructionConstraintException extends StaticCodeConstraintException{ - public StaticCodeInstructionConstraintException(String message){ + private static final long serialVersionUID = 4987255974346614794L; + + public StaticCodeInstructionConstraintException(String message){ super(message); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java index ff50a9c6..988e689d 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -32,7 +32,9 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class StaticCodeInstructionOperandConstraintException extends StaticCodeConstraintException{ - public StaticCodeInstructionOperandConstraintException(String message){ + private static final long serialVersionUID = 4780787099381933487L; + + public StaticCodeInstructionOperandConstraintException(String message){ super(message); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java index 701c21d5..10e6c5e1 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java @@ -31,7 +31,8 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class StructuralCodeConstraintException extends CodeConstraintException{ - /** + private static final long serialVersionUID = 5406842000007181420L; + /** * Constructs a new StructuralCodeConstraintException with the specified error message. */ public StructuralCodeConstraintException(String message){ diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java index 0fc23c3a..11da8e95 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java @@ -31,7 +31,9 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public abstract class VerificationException extends VerifierConstraintViolatedException{ - /** + private static final long serialVersionUID = 8012776320318623652L; + + /** * Constructs a new VerificationException with null as its error message string. */ VerificationException(){ diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java index 839356ae..48cfb4e5 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java @@ -33,7 +33,8 @@ public abstract class VerifierConstraintViolatedException extends RuntimeExcepti // /** The name of the offending class that did not pass the verifier. */ // String name_of_offending_class; - /** The specified error message. */ + private static final long serialVersionUID = 2946136970490179465L; + /** The specified error message. */ private String detailMessage; /** * Constructs a new VerifierConstraintViolatedException with null as its error message string. diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java index 2eb9beae..ac48b151 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java @@ -28,7 +28,8 @@ import org.apache.bcel.generic.Type; */ public final class DOUBLE_Upper extends Type{ - /** The one and only instance of this class. */ + private static final long serialVersionUID = -3046888862357818539L; + /** The one and only instance of this class. */ private static final DOUBLE_Upper singleInstance = new DOUBLE_Upper(); /** The constructor; this class must not be instantiated from the outside. */ diff --git a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java index 1263ae4d..229e2415 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java @@ -28,7 +28,8 @@ import org.apache.bcel.generic.Type; */ public final class LONG_Upper extends Type{ - /** The one and only instance of this class. */ + private static final long serialVersionUID = 3650377550491597107L; + /** The one and only instance of this class. */ private static final LONG_Upper singleInstance = new LONG_Upper(); /** The constructor; this class must not be instantiated from the outside. */ diff --git a/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java b/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java index b10b9cf3..c645108b 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java @@ -28,7 +28,9 @@ package org.apache.bcel.verifier.structurals; */ public class GenericArray extends java.lang.Object implements java.lang.Cloneable, java.io.Serializable{ - protected Object clone() throws CloneNotSupportedException { + private static final long serialVersionUID = 1991183963515237894L; + + protected Object clone() throws CloneNotSupportedException { return super.clone(); } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index 0101af4e..d49d8195 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -32,7 +32,8 @@ import org.apache.bcel.generic.ReferenceType; */ public class UninitializedObjectType extends ReferenceType implements Constants{ - /** The "initialized" version. */ + private static final long serialVersionUID = -1228341777713117641L; + /** The "initialized" version. */ private ObjectType initialized; /** Creates a new instance. */ -- GitLab From 5cd079924e2f5278fd20d67296b5a10d9e79e3eb Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Fri, 3 Sep 2010 16:27:26 +0000 Subject: [PATCH 0465/1313] Code clean-up. No functional change. Remove unused code identified by Eclipse. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@992359 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/generic/InstructionFactory.java | 24 +++++++++---------- .../java/org/apache/bcel/generic/Type.java | 1 - 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index d8ec7382..59ddd5dd 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -139,15 +139,13 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali Type result_type; String class_name; String name; - int access; - MethodObject(String c, String n, Type r, Type[] a, int acc) { + MethodObject(String c, String n, Type r, Type[] a) { class_name = c; name = n; result_type = r; arg_types = a; - access = acc; } } @@ -159,38 +157,38 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali private static final MethodObject[] append_mos = { new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.STRING - }, Constants.ACC_PUBLIC), + }), new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.OBJECT - }, Constants.ACC_PUBLIC), + }), null, null, // indices 2, 3 new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.BOOLEAN - }, Constants.ACC_PUBLIC), + }), new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.CHAR - }, Constants.ACC_PUBLIC), + }), new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.FLOAT - }, Constants.ACC_PUBLIC), + }), new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.DOUBLE - }, Constants.ACC_PUBLIC), + }), new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.INT - }, Constants.ACC_PUBLIC), + }), new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, // No append(byte) new Type[] { Type.INT - }, Constants.ACC_PUBLIC), + }), new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, // No append(short) new Type[] { Type.INT - }, Constants.ACC_PUBLIC), + }), new MethodObject("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.LONG - }, Constants.ACC_PUBLIC) + }) }; diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 33cac482..00b2d1bd 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -330,7 +330,6 @@ public abstract class Type implements java.io.Serializable { static int getArgumentTypesSize( String signature ) { int res = 0; int index; - Type[] types; try { // Read all declarations between for `(' and `)' if (signature.charAt(0) != '(') { throw new ClassFormatException("Invalid method signature: " + signature); -- GitLab From a1aa64ce32bd920eae13094026a789d4dc8b20ef Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Fri, 3 Sep 2010 16:30:33 +0000 Subject: [PATCH 0466/1313] Code clean-up. No functional change. Use direct static access as identified by Eclipse. git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@992360 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index eb486b8d..4787973a 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -23,6 +23,7 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; +import java.awt.event.InputEvent; import java.awt.event.WindowEvent; import javax.swing.BorderFactory; import javax.swing.JFrame; @@ -148,7 +149,7 @@ public class VerifierAppFrame extends JFrame { messagesTextPane.setEditable(false); newFileMenuItem.setText("New..."); newFileMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(78, - java.awt.event.KeyEvent.CTRL_MASK, true)); + InputEvent.CTRL_MASK, true)); newFileMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed( ActionEvent e ) { -- GitLab From d014dd733ecc633d7239b6bb6930ddee99772920 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 5 Jan 2011 19:29:45 +0000 Subject: [PATCH 0467/1313] Jakarta PMC descriptor has moved git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@1055597 13f79535-47bb-0310-9956-ffa450edef68 --- doap_bcel.rdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doap_bcel.rdf b/doap_bcel.rdf index f454d6dc..0a2457c4 100644 --- a/doap_bcel.rdf +++ b/doap_bcel.rdf @@ -28,7 +28,7 @@ - + Bytecode Engineering Library The Byte Code Engineering Library is intended to give users a convenient possibility to analyze, create, and manipulate (binary) Java class files (those ending with .class). Classes are represented by objects which contain all the symbolic information of the given class: methods, fields and byte code instructions, in particular. -- GitLab From f2ac82fe94023ff30b294545311a94364d74de89 Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Sun, 16 Jan 2011 16:46:41 +0000 Subject: [PATCH 0468/1313] Mark Serializable classes as Serializable (found running FindBugs over Tomcat 7's package renamed copy of BCEL) git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@1059613 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/StackMapEntry.java | 5 ++++- .../java/org/apache/bcel/classfile/StackMapTableEntry.java | 7 +++++-- src/main/java/org/apache/bcel/classfile/StackMapType.java | 5 ++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index b123923b..eec1748e 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -20,6 +20,7 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.io.Serializable; /** * This class represents a stack map entry recording the types of @@ -31,7 +32,9 @@ import java.io.IOException; * @see StackMap * @see StackMapType */ -public final class StackMapEntry implements Cloneable { +public final class StackMapEntry implements Cloneable, Serializable { + + private static final long serialVersionUID = 1L; private int byte_code_offset; private int number_of_locals; diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index 80530d71..6cc490c1 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -20,6 +20,7 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.io.Serializable; import org.apache.bcel.Constants; @@ -33,9 +34,11 @@ import org.apache.bcel.Constants; * @see StackMap * @see StackMapType */ -public final class StackMapTableEntry implements Cloneable { +public final class StackMapTableEntry implements Cloneable, Serializable { - private int frame_type; + private static final long serialVersionUID = 1L; + + private int frame_type; private int byte_code_offset_delta; private int number_of_locals; private StackMapType[] types_of_locals; diff --git a/src/main/java/org/apache/bcel/classfile/StackMapType.java b/src/main/java/org/apache/bcel/classfile/StackMapType.java index 89556742..68715a2a 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapType.java @@ -20,6 +20,7 @@ package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; +import java.io.Serializable; import org.apache.bcel.Constants; @@ -33,7 +34,9 @@ import org.apache.bcel.Constants; * @see StackMap * @see Constants */ -public final class StackMapType implements Cloneable { +public final class StackMapType implements Cloneable, Serializable { + + private static final long serialVersionUID = 1L; private byte type; private int index = -1; // Index to CONSTANT_Class or offset -- GitLab From d53e45ebc063b19adf2d6fe0f1cc8d11d6cae20c Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 10 Mar 2011 13:26:33 +0000 Subject: [PATCH 0469/1313] Fix up svn:keywords git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@1080213 13f79535-47bb-0310-9956-ffa450edef68 -- GitLab From 963198ccb4c6db2bf521d84afbfbc8d4f6bc337c Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 10 Mar 2011 13:31:07 +0000 Subject: [PATCH 0470/1313] Oops: svn:keyword=>svn:keywords! git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@1080216 13f79535-47bb-0310-9956-ffa450edef68 -- GitLab From fc373557ac4763cd889b3af8662259eaf2303946 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 13 Mar 2011 18:05:33 +0000 Subject: [PATCH 0471/1313] Bug 50922 : Code attribute size not updated added calculating for setCode() and setExceptionTable() git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@1081178 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Code.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/apache/bcel/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java index b55d6153..fda841b4 100644 --- a/src/main/java/org/apache/bcel/classfile/Code.java +++ b/src/main/java/org/apache/bcel/classfile/Code.java @@ -268,6 +268,7 @@ public final class Code extends Attribute { public final void setCode( byte[] code ) { this.code = code; code_length = (code == null) ? 0 : code.length; + length = calculateLength(); // Adjust length } @@ -277,6 +278,7 @@ public final class Code extends Attribute { public final void setExceptionTable( CodeException[] exception_table ) { this.exception_table = exception_table; exception_table_length = (exception_table == null) ? 0 : exception_table.length; + length = calculateLength(); // Adjust length } -- GitLab From 2010565a4152aef7b2a8dd01064a680df8791468 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 13 Mar 2011 18:41:20 +0000 Subject: [PATCH 0472/1313] Bug 48908 - Select instructions should implement StackConsumer instead of StackProducer git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@1081190 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/Select.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index 5bd9ec73..f16ab656 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -33,7 +33,7 @@ import org.apache.bcel.util.ByteSequence; * @see InstructionList */ public abstract class Select extends BranchInstruction implements VariableLengthInstruction, - StackProducer { + StackConsumer { private static final long serialVersionUID = 2806771744559217250L; protected int[] match; // matches, i.e., case 1: ... -- GitLab From 5bbe80eb7404d0d03245cfedc218f870f0176c57 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 13 Mar 2011 18:45:25 +0000 Subject: [PATCH 0473/1313] Bug 48321 - org.apache.bcel.generic.Instruction.equals(Object) does not follow Object.equals(Object) rules git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@1081191 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/Instruction.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index 0d9668b2..65b2fb58 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -527,6 +527,7 @@ public abstract class Instruction implements Cloneable, Serializable { * equality of instructions. * * @return currently used comparator for equals() + * @deprecated use the built in comparator, or wrap this class in another object that implements these methods */ public static InstructionComparator getComparator() { return cmp; @@ -534,6 +535,7 @@ public abstract class Instruction implements Cloneable, Serializable { /** Set comparator to be used for equals(). + * @deprecated use the built in comparator, or wrap this class in another object that implements these methods */ public static void setComparator( InstructionComparator c ) { cmp = c; -- GitLab From 5e415a163fa34e02b421620f638b53ebcad1ceda Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 15 Mar 2011 00:57:33 +0000 Subject: [PATCH 0474/1313] fix TABLESWITCH and LOOKUPSWITCH to visit StackConsumer rather than StackProducer git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@1081622 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java | 2 +- src/main/java/org/apache/bcel/generic/TABLESWITCH.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java index 9a90880c..482bd18b 100644 --- a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java +++ b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java @@ -91,7 +91,7 @@ public class LOOKUPSWITCH extends Select { */ public void accept( Visitor v ) { v.visitVariableLengthInstruction(this); - v.visitStackProducer(this); + v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitSelect(this); v.visitLOOKUPSWITCH(this); diff --git a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java index af32cdf3..d81da8c1 100644 --- a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java @@ -101,7 +101,7 @@ public class TABLESWITCH extends Select { */ public void accept( Visitor v ) { v.visitVariableLengthInstruction(this); - v.visitStackProducer(this); + v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitSelect(this); v.visitTABLESWITCH(this); -- GitLab From e36a1e6045a82347f773525d76bed69bfc0abca6 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 2 Apr 2011 00:56:40 +0000 Subject: [PATCH 0475/1313] Fix POM so compiler:testCompile works git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@1087948 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 90b96ff3..bb6bfef4 100644 --- a/pom.xml +++ b/pom.xml @@ -172,7 +172,8 @@ - compile-tests + + default-cli process-test-sources testCompile -- GitLab From 603aee913e5782662868eb86596912a3020049ed Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 2 Apr 2011 01:00:05 +0000 Subject: [PATCH 0476/1313] Add Apache Parent pom git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@1087950 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index bb6bfef4..a6ea8b2d 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,12 @@ 4.0.0 + + org.apache + apache + 9 + + org.apache.bcel bcel jar -- GitLab From dc4712dc8bc481498d4e860647225ffc14b2dc96 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 2 Apr 2011 01:06:27 +0000 Subject: [PATCH 0477/1313] Fix up Notice to standard form git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@1087951 13f79535-47bb-0310-9956-ffa450edef68 --- NOTICE.txt | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/NOTICE.txt b/NOTICE.txt index b240a31e..3178ba71 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,10 +1,5 @@ - ========================================================================= - == NOTICE file corresponding to the section 4 d of == - == the Apache License, Version 2.0, == - == in this case for the Apache Jakarta-BCEL distribution. == - ========================================================================= - - This product includes software developed by - The Apache Software Foundation (http://www.apache.org/). - +Apache Jakarta BCEL +Copyright 2004-2011 The Apache Software Foundation +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). -- GitLab From b148369a7d2144e7513a7295349ea9381c02cf5e Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 2 Apr 2011 01:10:23 +0000 Subject: [PATCH 0478/1313] Typo git-svn-id: https://svn.apache.org/repos/asf/jakarta/bcel/trunk@1087952 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/site.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/site/site.xml b/src/site/site.xml index 229d3397..9014ab55 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -17,7 +17,7 @@ * specific language governing permissions and limitations * under the License. --> - + - Apache Jakarta BCEL + Apache Commons BCEL Java @@ -36,7 +36,7 @@ - + -- GitLab From 0de77bb7abe9027384ad2f7346cb615d075d5ea5 Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Fri, 22 Jul 2011 09:31:01 +0000 Subject: [PATCH 0494/1313] Fixing svn url git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1149515 13f79535-47bb-0310-9956-ffa450edef68 --- doap_bcel.rdf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doap_bcel.rdf b/doap_bcel.rdf index 5843e56e..3c1b4b48 100644 --- a/doap_bcel.rdf +++ b/doap_bcel.rdf @@ -35,8 +35,8 @@ - - + + -- GitLab From e0515efebf5525e894bdbb55c1a15a767a8d7f9f Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Fri, 22 Jul 2011 09:31:10 +0000 Subject: [PATCH 0495/1313] Fixing name and svn location post move from Jakarta git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1149516 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 7e8e26fd..c4548c2b 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ bcel jar 6.0-SNAPSHOT - Jakarta BCEL + Apache Commons BCEL Bytecode Engineering Library http://jakarta.apache.org/bcel @@ -143,12 +143,12 @@ - scm:svn:http://svn.apache.org/repos/asf/jakarta/bcel/trunk + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk - scm:svn:http://svn.apache.org/repos/asf/jakarta/bcel/trunk + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk - http://svn.apache.org/repos/asf/jakarta/bcel/trunk + http://svn.apache.org/repos/asf/commons/proper/bcel/trunk -- GitLab From b40a4faadc0f835ee0fd1be9fa085e38cecaf2d7 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 22 Jul 2011 09:54:58 +0000 Subject: [PATCH 0496/1313] Align with other Commons component names git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1149536 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c4548c2b..40511a6d 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ bcel jar 6.0-SNAPSHOT - Apache Commons BCEL + Commons BCEL Bytecode Engineering Library http://jakarta.apache.org/bcel -- GitLab From 5a53e0c606525b60431f846f0fb1be8995b1ca1a Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sat, 23 Jul 2011 01:48:37 +0000 Subject: [PATCH 0497/1313] simplify logic git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1149777 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/classfile/SimpleElementValue.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java index d0e0efaf..5ca7ae97 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -172,8 +172,8 @@ public class SimpleElementValue extends ElementValue getIndex(), Constants.CONSTANT_Integer); if (bo.getBytes() == 0) return "false"; - if (bo.getBytes() != 0) - return "true"; + else + return "true"; case STRING: ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(getIndex(), Constants.CONSTANT_Utf8); -- GitLab From 66ea7db92c27b494bb2980f25c81685d54f3ce72 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sat, 23 Jul 2011 01:49:24 +0000 Subject: [PATCH 0498/1313] simplify logic git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1149778 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/generic/SimpleElementValueGen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java index 0d558315..d4887602 100644 --- a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java @@ -225,7 +225,7 @@ public class SimpleElementValueGen extends ElementValueGen ConstantInteger bo = (ConstantInteger) cpGen.getConstant(idx); if (bo.getBytes() == 0) return "false"; - if (bo.getBytes() != 0) + else return "true"; case STRING: ConstantUtf8 cu8 = (ConstantUtf8) cpGen.getConstant(idx); -- GitLab From 6dc1433420a7eb214fcc8447b4dd624a235afb7b Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sat, 23 Jul 2011 01:52:52 +0000 Subject: [PATCH 0499/1313] remove needless casting git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1149779 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/Select.java | 6 +++--- .../org/apache/bcel/GeneratingAnnotatedClassesTestCase.java | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index f16ab656..08001deb 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -195,9 +195,9 @@ public abstract class Select extends BranchInstruction implements VariableLength protected Object clone() throws CloneNotSupportedException { Select copy = (Select) super.clone(); - copy.match = (int[]) match.clone(); - copy.indices = (int[]) indices.clone(); - copy.targets = (InstructionHandle[]) targets.clone(); + copy.match = match.clone(); + copy.indices = indices.clone(); + copy.targets = targets.clone(); return copy; } diff --git a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java index cee40776..0196c24d 100644 --- a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java @@ -253,7 +253,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase AnnotationEntryGen a = annotations[0]; assertTrue("That annotation should only have one value but has " + a.getValues().size(), a.getValues().size() == 1); - ElementValuePairGen nvp = (ElementValuePairGen) a.getValues().get(0); + ElementValuePairGen nvp = a.getValues().get(0); ElementValueGen value = nvp.getValue(); assertTrue("Value should be ArrayElementValueGen but is " + value, value instanceof ArrayElementValueGen); @@ -261,8 +261,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase assertTrue("Array value should be size one but is " + arrayValue.getElementValuesSize(), arrayValue .getElementValuesSize() == 1); - ElementValueGen innerValue = (ElementValueGen) arrayValue - .getElementValues().get(0); + ElementValueGen innerValue = arrayValue.getElementValues().get(0); assertTrue( "Value in the array should be AnnotationElementValueGen but is " + innerValue, -- GitLab From 4c56b0fe1614270219b79ebe81f6ca3e28206b9e Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 24 Jul 2011 13:04:09 +0000 Subject: [PATCH 0500/1313] Obsolete (M1) file git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1150348 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/resources/stylesheets/project.xml | 54 ---------------------- 1 file changed, 54 deletions(-) delete mode 100644 src/site/resources/stylesheets/project.xml diff --git a/src/site/resources/stylesheets/project.xml b/src/site/resources/stylesheets/project.xml deleted file mode 100644 index 949a69b7..00000000 --- a/src/site/resources/stylesheets/project.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - BCEL - BCEL - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- GitLab From 3b4c50a08eeb171cbd51a9d618513d8b948bb969 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 24 Jul 2011 13:05:26 +0000 Subject: [PATCH 0501/1313]

          =>

          git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1150349 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/projects.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/site/xdoc/projects.xml b/src/site/xdoc/projects.xml index 8f903c9d..5e9b1a81 100644 --- a/src/site/xdoc/projects.xml +++ b/src/site/xdoc/projects.xml @@ -172,7 +172,7 @@

        -

        Related Projects

        +

        Related Projects

        • ASM
        • JOIE: The Java Object Instrumentation Environment
        • -- GitLab From 0745c49bb806f8f986b52c28d74e5c85c3e8fb13 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 24 Jul 2011 13:05:47 +0000 Subject: [PATCH 0502/1313] Moved to Commons git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1150350 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/news.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/site/xdoc/news.xml b/src/site/xdoc/news.xml index 880243e0..6ed8afd1 100644 --- a/src/site/xdoc/news.xml +++ b/src/site/xdoc/news.xml @@ -27,6 +27,11 @@
          +

          July 2011 - BCEL Moves to Apache Commons

          +

          + The BCEL project has moved from Apache Jakarta to Apache Commons. +

          +

          1 February 2006 - BCEL 5.2 released!

          The Byte Code Engineering Library version 5.2 has been released -- GitLab From a9df93ae78f23eb8da7177674b58fc1e4bd3baf0 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 24 Jul 2011 13:08:49 +0000 Subject: [PATCH 0503/1313] Move to Commons Parent; remove common settings Update site to Commons style git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1150351 13f79535-47bb-0310-9956-ffa450edef68 --- doap_bcel.rdf | 4 +- pom.xml | 111 +++++++++++++--------------------------------- src/site/site.xml | 30 +++---------- 3 files changed, 38 insertions(+), 107 deletions(-) diff --git a/doap_bcel.rdf b/doap_bcel.rdf index 3c1b4b48..1a8a50ed 100644 --- a/doap_bcel.rdf +++ b/doap_bcel.rdf @@ -18,9 +18,9 @@ * under the License. --> - + Apache Commons BCEL - + Java diff --git a/pom.xml b/pom.xml index 40511a6d..d1bf6ab3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,9 +24,9 @@ 4.0.0 - org.apache - apache - 9 + org.apache.commons + commons-parent + 21 org.apache.bcel @@ -36,9 +36,25 @@ Commons BCEL Bytecode Engineering Library - http://jakarta.apache.org/bcel + http://commons.apache.org/bcel 2004 + + ISO-8859-1 + UTF-8 + 1.5 + 1.5 + bcel + 6.0 + (Java 5.0+) + + org.apache.${commons.componentid} + org.apache.bcel.*;version=${project.version};-noimport:=true + * + + + + Apache License, Version 2.0 @@ -151,54 +167,18 @@ http://svn.apache.org/repos/asf/commons/proper/bcel/trunk - - - releases - scpexe://people.apache.org/home/${USER}/public_html/releases/bcel - - - snaphots - scpexe://people.apache.org/home/${USER}/public_html/shapshots/bcel - - - website - scpexe://people.apache.org/home/${USER}/public_html/websites/bcel - - - - + - org.apache.maven.plugins - maven-compiler-plugin - - true - 1.5 - 1.5 - - - - - default-cli - process-test-sources - - testCompile - - - 1.5 - 1.5 - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - META-INF/MANIFEST.MF - - + org.apache.maven.plugins + maven-jar-plugin + + + + test-jar + + + maven-surefire-plugin @@ -209,8 +189,6 @@ **/Abstract* - false - false @@ -218,35 +196,6 @@ - - maven-project-info-reports-plugin - - - - project-team - dependencies - license - scm - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.6.1 - - - org.apache.maven.plugins - maven-surefire-report-plugin - 2.4.3 - - - org.apache.maven.plugins - maven-jxr-plugin - 2.1 - - - + - + + Commons BCEL + /images/logo.gif + /index.html + - - - -

          @@ -54,7 +38,5 @@ - - -- GitLab From 9a836c98328dce7fd2bf6abbbcc264d3ea50274e Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 24 Jul 2011 13:13:19 +0000 Subject: [PATCH 0504/1313] Jakarta => Commons git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1150352 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/faq.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/site/xdoc/faq.xml b/src/site/xdoc/faq.xml index 506d7b40..4c071d11 100644 --- a/src/site/xdoc/faq.xml +++ b/src/site/xdoc/faq.xml @@ -49,9 +49,9 @@ Q: Can I use BCEL in a commercial product?
          A: Yes, this is covered by the Apache License, if you add a note about the original + href="http://www.apache.org/licenses/">Apache License, if you add a note about the original author and where to find the sources, i.e., - http://jakarta.apace.org/bcel/ + http://commons.apache.org/bcel/

          -- GitLab From 0deb50d664e7ba5647cd780f89e41f18c871f67a Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 24 Jul 2011 13:15:46 +0000 Subject: [PATCH 0505/1313] Javadoc syntax git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1150353 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 35d08daa..41b947b6 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -104,9 +104,9 @@ public interface Constants { public final static int MAX_BYTE = 255; // 2^8 - 1 /** One of the access flags for fields, methods, or classes. - * @see Flag definitions for Fields in the Java Virtual Machine Specification (2nd edition). - * @see Flag definitions for Methods in the Java Virtual Machine Specification (2nd edition). - * @see Flag definitions for Classes in the Java Virtual Machine Specification (2nd edition). + * @see "Flag definitions for Fields in the Java Virtual Machine Specification (2nd edition)." + * @see "Flag definitions for Methods in the Java Virtual Machine Specification (2nd edition)." + * @see "Flag definitions for Classes in the Java Virtual Machine Specification (2nd edition)." */ public final static short ACC_PUBLIC = 0x0001; -- GitLab From 1f77b16379ad5fd6ae31294397900f5a316f6ab5 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 24 Jul 2011 13:19:01 +0000 Subject: [PATCH 0506/1313] Javadoc git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1150354 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Mini/ASTProgram.java | 1 - src/main/java/org/apache/bcel/classfile/AnnotationEntry.java | 2 +- .../apache/bcel/verifier/structurals/InstructionContext.java | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java index 6a7da52b..2d8bb78f 100644 --- a/src/examples/Mini/ASTProgram.java +++ b/src/examples/Mini/ASTProgram.java @@ -157,7 +157,6 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan /** * Second pass, determine type of each node, if possible. - * @return type of expression */ public void eval(int pass) { diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 5c1d1de6..fa4d9483 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -49,7 +49,7 @@ public class AnnotationEntry implements Node, Constants, Serializable { * @param file * @param constant_pool * @param isRuntimeVisible - * @return + * @return the entry * @throws IOException */ public static AnnotationEntry read(DataInputStream file, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java index 2a8a48d1..3c955ea3 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -70,7 +70,7 @@ public interface InstructionContext{ * * @see ControlFlowGraph * @see ExecutionVisitor - * @see #getOutFrame(ArrayList) + * @see #getOutFrame(List) * @return true - if and only if the "outgoing" frame situation * changed from the one before execute()ing. */ -- GitLab From d3a2f62b81ce1d9a3f1ff478608e0f5608b051e7 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 24 Jul 2011 13:35:37 +0000 Subject: [PATCH 0507/1313] Add website details for use by mvn site:deploy git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1150359 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pom.xml b/pom.xml index d1bf6ab3..a25df786 100644 --- a/pom.xml +++ b/pom.xml @@ -55,6 +55,15 @@ + + + + apache.website + Apache Website + scp://people.apache.org/www/commons.apache.org/${commons.componentid}/ + + + Apache License, Version 2.0 -- GitLab From 967d0e527d3ed832b680a9f08ebed97c58c7f221 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 24 Jul 2011 13:45:08 +0000 Subject: [PATCH 0508/1313] Jakarta => Commons git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1150363 13f79535-47bb-0310-9956-ffa450edef68 --- NOTICE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NOTICE.txt b/NOTICE.txt index 3178ba71..49da11dc 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,4 +1,4 @@ -Apache Jakarta BCEL +Apache Commons BCEL Copyright 2004-2011 The Apache Software Foundation This product includes software developed by -- GitLab From c660a46a1a2b8d32a9fff848cf44b38d2ff4f0bb Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 24 Jul 2011 13:45:50 +0000 Subject: [PATCH 0509/1313] Add initial download page (not yet linked from site) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1150366 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/download_bcel.xml | 138 ++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 src/site/xdoc/download_bcel.xml diff --git a/src/site/xdoc/download_bcel.xml b/src/site/xdoc/download_bcel.xml new file mode 100644 index 00000000..3bf1077c --- /dev/null +++ b/src/site/xdoc/download_bcel.xml @@ -0,0 +1,138 @@ + + + + + + Download Commons BCEL + Commons Documentation Team + + +

          + +

          + We recommend you use a mirror to download our release + builds, but you must verify the integrity of + the downloaded files using signatures downloaded from our main + distribution directories. Recent releases (48 hours) may not yet + be available from the mirrors. +

          + +

          + You are currently using [preferred]. If you + encounter a problem with this mirror, please select another + mirror. If all mirrors are failing, there are backup + mirrors (at the end of the mirrors list) that should be + available. +

          + [if-any logo][end] +

          + +
          +

          + Other mirrors: + + +

          +
          + +

          + The KEYS + link links to the code signing keys used to sign the product. + The PGP link downloads the OpenPGP compatible signature from our main site. + The MD5 link downloads the checksum from the main site. +

          +
          +
          +
          + + + + + + + + + + + + +
          bcel-6.0-bin.tar.gzmd5pgp
          bcel-6.0-bin.zipmd5pgp
          +
          + + + + + + + + + + + + +
          bcel-6.0-src.tar.gzmd5pgp
          bcel-6.0-src.zipmd5pgp
          +
          +
          +
          +

          + Older releases can be obtained from the archives. +

          + +
          + + -- GitLab From ef067d5e130734c8f24040f5313e756156f682d2 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 26 Jul 2011 23:16:09 +0000 Subject: [PATCH 0510/1313] Add TM marks; minor grammar tweaks git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1151288 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/site.xml | 2 +- src/site/xdoc/index.xml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/site/site.xml b/src/site/site.xml index 49df4f79..44960f71 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -17,7 +17,7 @@ * specific language governing permissions and limitations * under the License. --> - + Commons BCEL diff --git a/src/site/xdoc/index.xml b/src/site/xdoc/index.xml index 65550e94..46c49584 100644 --- a/src/site/xdoc/index.xml +++ b/src/site/xdoc/index.xml @@ -24,8 +24,8 @@

          - The Byte Code Engineering Library is intended to give users a - convenient possibility to analyze, create, and manipulate (binary) + The Byte Code Engineering Library (Apache Commons BCEL™) is intended to give users a + convenient way to analyze, create, and manipulate (binary) Java class files (those ending with .class). Classes are represented by objects which contain all the symbolic information of the given class: methods, fields and byte code instructions, in @@ -34,7 +34,7 @@

          Such objects can be read from an existing file, be transformed - by a program (e.g. a class loader at run-time) and dumped to a file again. + by a program (e.g. a class loader at run-time) and written to a file again. An even more interesting application is the creation of classes from scratch at run-time. The Byte Code Engineering Library (BCEL) may be also useful if you want to learn about the Java Virtual Machine (JVM) and the format of -- GitLab From 99afef4d9eca7974817e7ca3a43e9ba921f720a4 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 26 Jul 2011 23:23:35 +0000 Subject: [PATCH 0511/1313] Add TM to logo git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1151291 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/resources/images/logo.gif | Bin 5128 -> 4440 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/site/resources/images/logo.gif b/src/site/resources/images/logo.gif index ee6553b553563e032991b2d04a45c897fde94d37..f7c0438bf0a68f9c826d4abbda99b0d982e145f6 100644 GIT binary patch literal 4440 zcmZ?wbhEHbbY#e7_|Cw4-?l^mO&aIQgtuwZ_ECrlqVU#>?i=1@MKyC~ z%}MdH;o%ao(bJKUQZZ3eIdkfajgiiqS8qbxY<$d2rc9c$XV;z(JDZxi78@;0`9X%Z%I};f>nJIl! z_N-guVrBE^*PoQMoSL$lIkT3Oc-h$KnYftge0lf9$I4{Qv?+V`?TLv?iSY`FaWbi? zs}bSjVPRuAa_oqUk&2I>&yr{H=8Znw)j}t$cV}0 zxP|z5x#Z;K666g?#z;<;t}yF;Ou+ zeLZW|tw~8snKN(BnR92}yn8cc+7uf-l{@$DxR{yz`S-^}OU1^>L`O?UMoOlns3ynD z#zjxZMoq=VNGHb4CdSStB`zk!$>h(sKP^=?JX}0IZ7nrrB_UQONA~SuU}Tucz)-`$ z@Jf>5iw;9WGeb=c14GMfhF6SY!eE&%w;8k<8JZ_D)YM2YFlI0?h%tbHp$+4k*9^kK zAPx@$!$$@Ne-QIK1IrhNKMf4RH4F>|9XDRRo+T{Y%)n41F?U5q%73xu28Nm%y%qlp zc>kvd{Lf|h&+uYtfW&{lfChJl8U=<5UB(Ut2B!c9hWwU{qF2*PgvApX7?Kzmau^v> z85k5882ok^rl!0pX%;T8VaR7pDPmyA28+8htSn-vO*CLAU|?{uNU?g$z#z;}%)r2) z*Qu4>qnGJXkj9|+lLh2N1|1Ly$`kAy{~0VfWjr>tO?6qYM)AcoV5)LZ}vh(Ely|VeaqEU3(1_vVv zlPQcc@;o;ltSouT*X}7>?$tWun3rmkR*grE%P}umK@pv|8i!U0Tv-{Ue`O={#Df#N zCUcptdaQAvjUmnPx_{!yoPi^xDm zbwO{oBEM@K0ZJ1^Wv01puVgxD8hC1LgD@nuZc`gHn=ziDMoN- zeXkX9>fvw`XY)%Eh~;S)YLSn zcLs$+fvl1Sh5`*L@&-&tyXH42x%0AaG2m2dRq$YCen0by17j0)#PC+Vc zT(%BOo|7iE%irCH4!7A-$q7~~Iqe9@_vsKmr@ z*D<77>GsuwLQ&Io1l;SEOgeRnN&TfFCxejC6?Jtbi~or?RsC!fnH89M4xC^J2vBtA zDX^I6<~d`{tW3wa4#ktpt!)o6h!h4)>|~5OFriaSN~1uPAx`8{mdnviT7kR)9gWRu z!LEh!f=dIqk7_K*xX{Vtr8B8i?+BGq+vhEdZXPTeF)XX#Yzyeow zsT8GVrlKQ?&5Sk`8$FbDm$(P)xX)G6sq}17wGdY>!+~{-bGO{_RI@2@Y8DIFpv0~q zmBF}Psfgi0qsv1%>j2)k1qJK;G?^!PYI3Dt+H}}pi;go}cf+TmLvtA}8FR}OKgvHb zrzd8UXVMA=28F04bIa5hmn>rC<(1vS~f8Tg9a`6^<3L-xJQS$@pM-(mOl+le*Hz=<^luj zQOS&eQ-Nur4J{=0w&K2b_0EmoO*%E7SW~;Ol}SiyaEjlY8ejgK@Mw+GEcK;h<$7_O;c*i zu8zFL)?h7Iz|>u%bW@CT(!xVioA_fJ4yav7U^wFGlW4^4Ec0YRL*`Q5${z29mp>FA z-v82|z*eS1f{oFMbwMM4mV~No!htPM53Y?e@i=mJ!7+=FzDJ2{7aCai7BsFeESUWH zqC=fXAfp4D5bqL^luuF9IMrx86qR5Mj1Ocqnc~DPB&%{+;-b@P z%QeD11yPSzmFvnmC^B1|%~G@G5LApYU>4ZmD1YJr7^Kf-A=-F0-P-X$tdlUuw8~qr6u)o9eU#F44;jxwp$Mb>CfERJPPf zs_2xuH5XsZ&yxovKYi#j|B%R`@ZhkTLPML1gqg5?0uw`oqhryj)u~GhGPd$Cuv+GP zU&PE98~#~^J?z5))`$y@U7Hs)+y4<{Vq3s0Teg64dyszb#g-d~yV0*BaY9GJxv7|wiNlqfv&$07EA;>MhIml6$rx3H{!-WneoyjkM!I|l&{AiXkQsi*o;4irJOtGZ4`sQ|DUWTe2Dl?qtT{Ma&6+7dfiJs)wJNcLLo;>{t#7nEmf?kpHC65T0_7H@?A1pu=FZ6WfH`xj$HBgI2LRt1s|q zl9STYEYkdD%EZ0wz#+|h30=W|5;?4X98{=j&E&YC&~R;)&QB}BcJUCmE02Edm=Qa5 zy->IVlbOXq{*LZ{G)7E}sVGH8QS6`3=`9 zck-TYIKd$E=iBSO|EiTXa4<15ax(?8JmOV%s22X<+2Sh@zQ|ynEWgJ>*8iSA2kOQaiG|u`BoLLLvJPRURJ}@oZ5N+|rQspsA z$3kJ-f~=wsOiM1XClq9H9Z1n+V6>XRC2)Z=k&oB^iXW-=Cz)-P4wk?Qx!UYD~N6az-dRB~F#RlvQ6Kp3tu$E77 zoF2exJ6V2OI;(pChid>!UjTbS0c*Gbr+Wd5L_!b$0>(ThR_=-V3=FJN0t}KNLZJ(o z<`i(uIKVlXfg$XM(3%5`pMOknU(l&~h{3;s!SoYn%mR+^1x#fIoW%^B6$OlLpII#e zI4uk~J2HeS3PLw9FsL#xG#LnNP+(uUL%5}gQ}2HvM~DDZ7XxdU0H?JA)8tPqof9Uh zCd&3!urP06xjT`0{)Fyz6WK1DV0g5cQ8j=)?J#44v7n_x`>9NsCg zU;;-e1K0cnR&GXCW((29iL46>SSlvSd}b6(3XpyvS<(1kd|v)anNtfn{a;9l1aO3G z;Al0N=wdkWljVGUM-inU*3buva~fyld5HWw$ngH({=0-t3pl1Yu(djHYF90t7RW5~fzj2VGaz6|LX=>fP021mxM<$@a-v`H@N$iCMoJj?o;v1NYH!w^|V0DWW zdUR^dgbPe644gktaf;4lzCNRW@+&p1q77``8$u><%v9oJOkm{+VBVV{^z+y1QU}g6 zUILREBqkjI{n1FQw6MVrlk zs}(HT+_`{LoMFBD1aX-L=CVTzEg87D1Q=HD+_GlpES5!_2RY{iEa05Jfw?nai-@2A GgEauoeP}iS literal 5128 zcmZ?wbhEHbbY#e7_|Cxa_3PIUA3nsy#6&rJG&VLqd-~MJ$7j-{NzrT0WT&g)XYH)1B=)8OPPDEHZ#75`g!-u}s78Y7+d-v{@ zmzV$b>z9s-Qd?V_j+T;kYn7!X9Cb84efsqB#fz0IR`76hJ32b9m_B96k|lxG zMzyuIot>Tc?%g|a;^e`D2WQTldGyF>8(non9hG}`?o92SaqQSJH#fIkyLK6Bsw9W_ z#5owxojdp6-@if5hA}QSnQnp3CMMgqZF4Zv@O3ixGB*x&wGMUEV`gId{{4HPo%Ng7 zuamv4lbr2bO*GG)JNNtd@3^?+*4A!kW7TLs?@O01smdut*%~Fd7;|y5NQp{Hh=_;? z@-1Js%+J|bQc_Y@Ld3_^GBqVD%hTFSUv0sH1vhWr6yW8I@(wL6sycP@?8i@E4(#7& zVr2dO`_HDTItw*511)8DQ(Z?BO(zq*j~_qUXsJs{Dzme)q{YR2c=wTqTcoPA?9QD# zE=F3@rcI3Uuu@XinlpQmow1<+pCAh}r=7aS|NnmtbyfcU{r}_JkG#A*H!E#1AxRru zBTiP%Y$qdmIZ1O(bv6zjF-duLcDC2AU%!6!>fgVAlP6Dp_3G8jmoGnk{P_FN@8{2- z|NQw=T}!X2tijd7YU8|B`31G<>FLptVV)lDrG=?8W=xndZO;35@1pE&K7IQ5`_JE> zKfZnW@@3xaIbXkiDk(1R?(XUB>8!3On9x5VFDvQQ%U5sTzU^pj+`Vjbc6RogH?Lm5 zdR<>qQC?P%otZadLdBjnEAstA?DQ0yo13fZ>OHMAR;}AyniQIwk(-;7Q|xVZXltW>h5bS-T5vbO3L^wZ+>p?V)fw9;suMlTok@>3Gl7eYc&k9tog8l!RZ{kMe>fcech2Mt_6bsG-npP z57O>D?%e+0&o$w`sw(@DC70aT+?a1fX20h7nJ?PM&!9A+qwjFT5e7B~_pT;$nhQQl*_ zd;=Wd)g-zU6Asa3+ae5qCY_Iy{!TE_RZU`TYoOgiHMSJCvOFRs$77zL* z3^)WBC8s-l>&mf+V-w;~*|6Yn!T${#jtU8#WMXEu6Hr*ruMn^xgz1(+z#*m@J%N6i z6+4tz42=~S`lhN&e7@yp+WNDf&uIdKUxv*K1_xIL28N@{=9F2niC3B^tXjbzbIFO% z@Yp0-`&`yWXE%n z!>?Mfq~OrhrI(s?)*MmF_TA!X;={!K;$a)Rz@5MrCV?X#*j7dBIC+^)%1pU%;>)xe zBW;HbclhIa>s(wWnsg{MG3j41;865A;n1v^v**Jh>3;#2+IwpReRWTHma8svy#M0k zF)k&C14lSq?;Jd$#&zPuF{SAz{uj90MQ?ZXF?c^K*W}jctELkSQgR%dMFn~kb_$vw z-g}bUQsJXEHgm_DNbZ|-vg7&EEiNfPF1K+^^wDh+EU7m5&0(}5u}kKs zLx7iH%Yw}(#I~~*|{K@OKZuEoEFxZ zPbRZT&k!iKIpjLOuH=@(QT0I8e=ibQgvBZ*a0m-HBpl%?zc8QamI9aA62^38j}~?g zM~;95CgzwE9G|on?O9^#qdYaBMe~w?rIUt&p!Np`9+3(CqAE@-@zE^OJqP*(pDgB( zGdQGnZab@gPD+!|$_FhepZnP)IAs$B9C`lhI2;mnaA1_zS;(HUfIYauiLus*OQc_im{S5;q4v~XQj4=nfbQli2?0vwepTMkj%b+7DWsyjE z1B0SbV2g>wN&62;_is)MpE_&KV%F#x&5EBAIkfL6Hk$8tR`Pn-s1(sCvWP)mF(Zsc zu;&1WfCLN6tqmL@M^?$lURn6+A0xM8j-!Y^$6?tUJ2<%o4t4xE94*+>&?vKD5$k4c zSKbfP`=g^2`~G>jxdi>R`}udVwB-#ZjjV(Y9v@yNZ3!37(<>TwX*yK&bu_*)3+&kS zR5?$sf>|xDKr>D0T%@R@gtXX%MuQXu=DooU92|lFTSR-_Pg`2Rd_QFZhs8Bt7P$j) z44DePX%apY+N0+!{ujujns7)^|G@#acbZJv5eEg9S|oA4Z#c3x@k@u;f+d1B2Uu8r z_?dG)95Zstlaj$gj@?_FboDlNm_InfTpr||gFb1E=6`aNYq6JtyRvzA7SyXypgZHb8jVhfnqLM&XTt2J$3^yPqp zi$RCW9)~sa*Jgg2)hU^}M@Tg6g_Cs%Lu_8k1A%EBw*?(N`z&)D`ELpwlx?xxYIG?_ zxW9%`>&b+B-`0L#CSG~y!n;3^&*!~#>=ZU z;aq}i8hGHZ_$JKUsE1jG7>v@ z;92Tn=^pM|?8TzWsUMCjeVNdx^P+j542QGKEy1=Z5A&jF3hdHF6WAoD82)Dy*w9eA zn9GLa33IWbU0zN?zzvxl$wJ{9^7%JxXzX3(kd+qSTm8`NMJ!BgW7pLjUr2|$9L9U6K?cM9pXvb;cnwm<0P3NcGO3qb|t+L4nANn#J*^(---B;mincNRq&-G{9ggp+wHO`Z8{b2CM zqrs6oVa6eqD+Uce^R@_Vx#9d*LE(vuN>Yom!jYJ-$62%!6ml9HYFzp^Y^wj!B(iMk zL5-|^Y@&aXm^CIeaYdc(h)TK0)W&d6nVr#frITQ1@rQN>3&r0TF8xrRTi_6J_X4x^ zo~a% zqu799vH;Wm2P{D!xU~vcV++_GJYZYI;3Jv9+GYMLkT2;Ww$J!RkR=((~pa>)Pt_7*x z5BP38U||+uD*P|Ns^P$XZ3DmcQ9kL^u&@M{W&tOG3;DSR*ls)2vNjfVerBJMz~$@8 zo+ZE+yn$`90&8Rf_fl8p2!RZNh~_s5ES&}%#!vWb3?#3nr-~iXhzMj~z92a70ZY6B zt0DuN#s!x84@}VxTzuOZ+XdLdUU>deVGa;Whp_b*{@MbjMh`et1z3_itp0jPvI(*@TrkcR;LQHPv*Q6jk7bQ?1FMV!YwHHiq6Zu` z6O_6h`*A3UZ8nq_`5(x)Goh_-0_U#+UZxGfk_}8z*I5GtIFt*RrUbBE4K!=)s1I;p zuyBx0IAZiafc<|F)B6d`;;zgl4UBP~%*6}XJp@etTXb@UK^ z8tTB9m!QHhdHTNw?a)Ngm?P;@0#Y3h7Ji7+z%f56XH zpd;GIyv%@E)R0X?fM0NeNI?L@T_f>dO`1goOu7L~stF7WZtAcpwsAjT;!EI>e8@F# z1A~2lpxFjRUIt#K2b{eBA2IN4;CF6dI5vSn#DMSR1g5(}st+zPSTXRGe({BY9!HHZ70#^SF+NUqzwsT6vH zQ0HMZi+-TaBA^}PXeGqRB>aJ2uz_LmL;m1O5z7ty;!=x65_skns8=+xt2|&hbCXHl zfYHW)+3^AcYXgVu0j^UAxGD-5j1TCXO_JQGz;33%@=t*A-vVyYkL)WJaPO#`BP5_F zn!qDiz{I_g!ApUGb{e#AWw@e~;(N6}Rdw6ByVTmRT-f5j^6&+F4L`0kfcif?5G*N9U@lTlMD_@^CC* z4t>?TEVBB)0=M7-X1xQf(;XPoPOkoSsh)2EZ{-FS{|EdVvZijFxWcSq?b-z9Zv{*S zf_hJ));+6Q_b`d)#xKT~3M?-lFjy&=EG(S$KY($jF|(QiOQMv{pIhtyof0T2;AC5% z<#j>e*Nf>(j00CWFnB4jiwJOQ8nDeZ+9(peQCM5$zXIc?25|?6*)0~bDplg54orCo zTo)1+Ys}uHHCyDEgStY1I?DlB(~FtrN@|k-1E;5bWZ-|mX?1$D&F#&$uQyxm-t3$$ z_U-31rVot&8n|^7gno(7mginOg^QohfKgR|k?#SU!se|`#iB>OdTwP+oxaiJ{{lYs z0H)sym_HUUrExZyHHw=*(zAQGEx~B>=ZieL2@EeinXDdgmCoL9^pvpm67hQLZJ!PK zizYC52{3X$nB(gyFMQA>(P>-5?XAj=o4+h%l)AO}!UsmJ%|er2>lD3Q*7BY;GX+?r#$0!yNMPF*}Hs$r?O0( zX!4L%Re(RQfQfqn_x#(T<}1w-oVGo(kiKOty{emAfq`$we*wnxky9;{wsrp6Qo7no zp+a)i1BQdG`J%)xt+_+dN&pmpzd|SZ_b;wg4I}CeBn;%Rm{;J4j%SC z9H^t1u-nV*weT5-87c|<{tK87aPL?aeU#(&G0}y4%DR>JHE`K1;9GZq!Sd;aBg~3z z)qzLK9d}$Z)b{OEW=v4={J?))Vc&rlTg`8tWMSq%rn&X_u2r5BSgs4rNEYCZQP|yZ zX5zNr{AUvw@*9{R8R@-vrMt3$*|LEnCV{D=fdA11rX34drbZriSu;P8o4H~G%Xdqi z3o>U97cos&n0$Nz@2Zzvw>wuz{Mk|LEy%OL=$iuD;-GWSYR>Tru;^Z}ThqWM62NFy zz;N>RN%N0~nz(s|4=`0Lo&CdecKQS+bs+|k15$hiddH&n6uuPpR$$L}V32yiDkX4H hK=z`L?M2bGj1CT52R1P{Brx55xbf<3env(HYXBmx5+MKp -- GitLab From 345a8c784c694b3a9c2fff3c5d329454ae4f0c54 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 28 Jul 2011 03:15:18 +0000 Subject: [PATCH 0512/1313] apply patch: Bug 51565 - [patch] Pass3bVerifier crashes on empty methods git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1151706 13f79535-47bb-0310-9956-ffa450edef68 --- .../verifier/structurals/Pass3bVerifier.java | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 6a498cd9..ccb910d1 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -252,19 +252,26 @@ public final class Pass3bVerifier extends PassVerifier{ //see JVM $4.8.2 //TODO implement all based on stack Type returnedType = null; - if( ih.getPrev().getInstruction() instanceof InvokeInstruction ) - { - returnedType = ((InvokeInstruction)ih.getPrev().getInstruction()).getType(m.getConstantPool()); - } - if( ih.getPrev().getInstruction() instanceof LoadInstruction ) - { - int index = ((LoadInstruction)ih.getPrev().getInstruction()).getIndex(); - returnedType = lvs.get(index); - } - if( ih.getPrev().getInstruction() instanceof GETFIELD ) - { - returnedType = ((GETFIELD)ih.getPrev().getInstruction()).getType(m.getConstantPool()); - } + InstructionHandle ihPrev = null; + ihPrev = ih.getPrev(); + + if (ihPrev != null) + { + if( ihPrev.getInstruction() instanceof InvokeInstruction ) + { + returnedType = ((InvokeInstruction)ihPrev.getInstruction()).getType(m.getConstantPool()); + } + if( ihPrev.getInstruction() instanceof LoadInstruction ) + { + int index = ((LoadInstruction)ihPrev.getInstruction()).getIndex(); + returnedType = lvs.get(index); + } + if( ihPrev.getInstruction() instanceof GETFIELD ) + { + returnedType = ((GETFIELD)ihPrev.getInstruction()).getType(m.getConstantPool()); + } + } + if( returnedType != null ) { if( returnedType instanceof ObjectType ) -- GitLab From 87bda477b65f8c094784d7cab389c04aff48102f Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 28 Jul 2011 03:21:13 +0000 Subject: [PATCH 0513/1313] apply patch: Bug 51563 - [patch] InstConstraintVisitor does not handle class constants git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1151709 13f79535-47bb-0310-9956-ffa450edef68 --- .../structurals/InstConstraintVisitor.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index e24580ab..d541eab1 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -2186,12 +2186,13 @@ public class InstConstraintVisitor extends EmptyVisitor{ public void visitLDC(LDC o){ // visitCPInstruction is called first. - Constant c = cpg.getConstant(o.getIndex()); - if (! ( ( c instanceof ConstantInteger) || - ( c instanceof ConstantFloat ) || - ( c instanceof ConstantString ) ) ){ - constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); - } + Constant c = cpg.getConstant(o.getIndex()); + if (! ( ( c instanceof ConstantInteger) || + ( c instanceof ConstantFloat ) || + ( c instanceof ConstantString ) || + ( c instanceof ConstantClass ) ) ){ + constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float, a CONSTANT_String or a CONSTANT_Class, but is '"+c+"'."); + } } /** @@ -2201,11 +2202,12 @@ public class InstConstraintVisitor extends EmptyVisitor{ // visitCPInstruction is called first. Constant c = cpg.getConstant(o.getIndex()); - if (! ( ( c instanceof ConstantInteger) || - ( c instanceof ConstantFloat ) || - ( c instanceof ConstantString ) ) ){ - constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); - } + if (! ( ( c instanceof ConstantInteger) || + ( c instanceof ConstantFloat ) || + ( c instanceof ConstantString ) || + ( c instanceof ConstantClass ) ) ){ + constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float, a CONSTANT_String or a CONSTANT_Class, but is '"+c+"'."); + } } /** -- GitLab From 5907f72c0665773b908cf943b5afbe16b6ef3cbb Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 28 Jul 2011 03:27:59 +0000 Subject: [PATCH 0514/1313] add constants for java 1.7 internal version numbers git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1151711 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 41b947b6..d50cd581 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -75,8 +75,8 @@ public interface Constants { * */ public final static short MINOR_1_5 = 0; - /** Major version number of class files for Java 1.5. - * @see #MINOR_1_5 + /** Major version number of class files for Java 1.6. + * @see #MINOR_1_6 * */ public final static short MAJOR_1_6 = 50; @@ -84,6 +84,16 @@ public interface Constants { * @see #MAJOR_1_6 * */ public final static short MINOR_1_6 = 0; + + /** Major version number of class files for Java 1.7. + * @see #MINOR_1_7 + * */ + public final static short MAJOR_1_7 = 51; + + /** Minor version number of class files for Java 1.7. + * @see #MAJOR_1_7 + * */ + public final static short MINOR_1_7 = 0; /** Default major version number. Class file is for Java 1.1. * @see #MAJOR_1_1 -- GitLab From 610a4758f454cb10fc1fa0f64581b3d2ad098921 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Thu, 28 Jul 2011 03:58:16 +0000 Subject: [PATCH 0515/1313] switch to using enhanced for loops git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1151716 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Package.java | 7 +- .../org/apache/bcel/classfile/Unknown.java | 6 +- .../org/apache/bcel/classfile/Utility.java | 71 +++++++------------ .../bcel/generic/AnnotationEntryGen.java | 5 +- .../bcel/generic/ArrayElementValueGen.java | 18 ++--- .../org/apache/bcel/generic/ClassGen.java | 11 ++- .../org/apache/bcel/generic/FieldGen.java | 5 +- .../apache/bcel/generic/InstructionList.java | 6 +- .../org/apache/bcel/generic/MethodGen.java | 9 ++- .../org/apache/bcel/util/BCELFactory.java | 4 +- .../java/org/apache/bcel/util/ClassPath.java | 15 ++-- .../apache/bcel/util/InstructionFinder.java | 3 +- .../org/apache/bcel/verifier/Verifier.java | 9 +-- .../apache/bcel/verifier/VerifierFactory.java | 5 +- .../verifier/structurals/Subroutines.java | 40 ++++------- 15 files changed, 72 insertions(+), 142 deletions(-) diff --git a/src/examples/Package.java b/src/examples/Package.java index f814b672..2947196a 100644 --- a/src/examples/Package.java +++ b/src/examples/Package.java @@ -20,7 +20,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -175,10 +174,8 @@ public class Package { // create the jar JarOutputStream jarFile = new JarOutputStream(new FileOutputStream(defaultJar)); jarFile.setLevel(5); // use compression - Iterator keys = allClasses.keySet().iterator(); - int written = 0 ; - while(keys.hasNext()){ // add entries for every class - String name = keys.next(); + int written = 0; + for (String name : allClasses.keySet()) { // add entries for every class JavaClass claz = allClasses.get(name); ZipEntry zipEntry = new ZipEntry(name+".class"); byte[] bytes = claz.getBytes() ; diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index 74337c8a..8e5ee638 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -21,7 +21,6 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.HashMap; -import java.util.Iterator; import java.util.Map; import org.apache.bcel.Constants; @@ -53,10 +52,7 @@ public final class Unknown extends Attribute { */ static Unknown[] getUnknownAttributes() { Unknown[] unknowns = new Unknown[unknown_attributes.size()]; - Iterator entries = unknown_attributes.values().iterator(); - for (int i = 0; entries.hasNext(); i++) { - unknowns[i] = entries.next(); - } + unknown_attributes.values().toArray(unknowns); unknown_attributes.clear(); return unknowns; } diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 344c9f81..42e1eb51 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -31,7 +31,6 @@ import java.io.PrintWriter; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.zip.GZIPInputStream; @@ -1387,10 +1386,11 @@ public abstract class Utility { int countInvisible = 0; // put the annotations in the right output stream - for (int i=0; i l = vec[i]; - if (l != null) - { - for (Iterator iter = l.iterator(); iter.hasNext();) - { - AnnotationEntryGen element = iter.next(); - if (element.isRuntimeVisible()) - { + try { + for (int i = 0; i < vec.length; i++) { + if (vec[i] != null) { + for (AnnotationEntryGen element : vec[i]) { + if (element.isRuntimeVisible()) { visCount[i]++; totalVisCount++; } - else - { + else { invisCount[i]++; totalInvisCount++; } @@ -1480,15 +1473,10 @@ public abstract class Utility { ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); DataOutputStream rvaDos = new DataOutputStream(rvaBytes); rvaDos.writeByte(vec.length); // First goes number of parameters - for (int i = 0; i < vec.length; i++) - { + for (int i = 0; i < vec.length; i++) { rvaDos.writeShort(visCount[i]); - if (visCount[i] > 0) - { - List l = vec[i]; - for (Iterator iter = l.iterator(); iter.hasNext();) - { - AnnotationEntryGen element = iter.next(); + if (visCount[i] > 0) { + for (AnnotationEntryGen element : vec[i]) { if (element.isRuntimeVisible()) element.dump(rvaDos); } @@ -1499,15 +1487,10 @@ public abstract class Utility { ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); DataOutputStream riaDos = new DataOutputStream(riaBytes); riaDos.writeByte(vec.length); // First goes number of parameters - for (int i = 0; i < vec.length; i++) - { + for (int i = 0; i < vec.length; i++) { riaDos.writeShort(invisCount[i]); - if (invisCount[i] > 0) - { - List l = vec[i]; - for (Iterator iter = l.iterator(); iter.hasNext();) - { - AnnotationEntryGen element = iter.next(); + if (invisCount[i] > 0) { + for (AnnotationEntryGen element : vec[i]) { if (!element.isRuntimeVisible()) element.dump(riaDos); } @@ -1523,27 +1506,23 @@ public abstract class Utility { if (totalInvisCount > 0) riaIndex = cp.addUtf8("RuntimeInvisibleParameterAnnotations"); List newAttributes = new ArrayList(); - if (totalVisCount > 0) - { + if (totalVisCount > 0) { newAttributes .add(new RuntimeVisibleParameterAnnotations(rvaIndex, rvaData.length, new DataInputStream(new ByteArrayInputStream(rvaData)), cp.getConstantPool())); } - if (totalInvisCount > 0) - { + if (totalInvisCount > 0) { newAttributes .add(new RuntimeInvisibleParameterAnnotations(riaIndex, riaData.length, new DataInputStream(new ByteArrayInputStream(riaData)), cp.getConstantPool())); } return newAttributes.toArray(new Attribute[newAttributes.size()]); } - catch (IOException e) - { + catch (IOException e) { System.err .println("IOException whilst processing parameter annotations"); e.printStackTrace(); } return null; } - } diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index 76706ddf..1dedef9d 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -21,7 +21,6 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.apache.bcel.classfile.AnnotationEntry; @@ -88,9 +87,7 @@ public class AnnotationEntryGen { AnnotationEntry a = new AnnotationEntry(typeIndex, cpool.getConstantPool(), isRuntimeVisible); - for (Iterator iter = evs.iterator(); iter.hasNext();) - { - ElementValuePairGen element = iter.next(); + for (ElementValuePairGen element : evs) { a.addElementNameValuePair(element.getElementNameValuePair()); } return a; diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index 0fb2f9e5..73c481b8 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -20,7 +20,6 @@ package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.apache.bcel.classfile.ArrayElementValue; @@ -59,9 +58,7 @@ public class ArrayElementValueGen extends ElementValueGen { ElementValue[] immutableData = new ElementValue[evalues.size()]; int i = 0; - for (Iterator iter = evalues.iterator(); iter.hasNext();) - { - ElementValueGen element = iter.next(); + for (ElementValueGen element : evalues) { immutableData[i++] = element.getElementValue(); } return new ArrayElementValue(type, immutableData, cpGen @@ -88,9 +85,7 @@ public class ArrayElementValueGen extends ElementValueGen { dos.writeByte(type); // u1 type of value (ARRAY == '[') dos.writeShort(evalues.size()); - for (Iterator iter = evalues.iterator(); iter.hasNext();) - { - ElementValueGen element = iter.next(); + for (ElementValueGen element : evalues) { element.dump(dos); } } @@ -99,12 +94,11 @@ public class ArrayElementValueGen extends ElementValueGen { StringBuffer sb = new StringBuffer(); sb.append("["); - for (Iterator iter = evalues.iterator(); iter.hasNext();) - { - ElementValueGen element = iter.next(); + String comma = ""; + for (ElementValueGen element : evalues) { + sb.append(comma); + comma = ","; sb.append(element.stringifyValue()); - if (iter.hasNext()) - sb.append(","); } sb.append("]"); return sb.toString(); diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index c548a7d7..0db6fc55 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -18,7 +18,6 @@ package org.apache.bcel.generic; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.apache.bcel.Constants; @@ -329,8 +328,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** @return field object with given name, or null */ public Field containsField( String name ) { - for (Iterator e = field_vec.iterator(); e.hasNext();) { - Field f = e.next(); + for (Field f : field_vec) { if (f.getName().equals(name)) { return f; } @@ -342,8 +340,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** @return method object with given name and signature, or null */ public Method containsMethod( String name, String signature ) { - for (Iterator e = method_vec.iterator(); e.hasNext();) { - Method m = e.next(); + for (Method m : method_vec) { if (m.getName().equals(name) && m.getSignature().equals(signature)) { return m; } @@ -555,8 +552,8 @@ public class ClassGen extends AccessFlags implements Cloneable { */ public void update() { if (observers != null) { - for (Iterator e = observers.iterator(); e.hasNext();) { - e.next().notify(this); + for (ClassObserver observer : observers) { + observer.notify(this); } } } diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index d517e26f..f4de87ce 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -18,7 +18,6 @@ package org.apache.bcel.generic; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.apache.bcel.Constants; import org.apache.bcel.classfile.AnnotationEntry; @@ -289,8 +288,8 @@ public class FieldGen extends FieldGenOrMethodGen { */ public void update() { if (observers != null) { - for (Iterator e = observers.iterator(); e.hasNext();) { - e.next().notify(this); + for (FieldObserver observer : observers ) { + observer.notify(this); } } } diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 76ce99f6..32c940de 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -995,7 +995,7 @@ public class InstructionList implements Serializable { /** - * @return Enumeration that lists all instructions (handles) + * @return iterator that lists all instructions (handles) */ public Iterator iterator() { return new Iterator() { @@ -1271,8 +1271,8 @@ public class InstructionList implements Serializable { */ public void update() { if (observers != null) { - for (Iterator e = observers.iterator(); e.hasNext();) { - e.next().notify(this); + for (InstructionListObserver observer : observers) { + observer.notify(this); } } } diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index a1b6dd21..ec2635f2 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -19,7 +19,6 @@ package org.apache.bcel.generic; import java.util.ArrayList; import java.util.Hashtable; -import java.util.Iterator; import java.util.List; import java.util.Stack; import org.apache.bcel.Constants; @@ -1061,8 +1060,8 @@ public class MethodGen extends FieldGenOrMethodGen { */ public void update() { if (observers != null) { - for (Iterator e = observers.iterator(); e.hasNext();) { - e.next().notify(this); + for (MethodObserver observer : observers) { + observer.notify(this); } } } @@ -1088,8 +1087,8 @@ public class MethodGen extends FieldGenOrMethodGen { } if (throws_vec.size() > 0) { - for (Iterator e = throws_vec.iterator(); e.hasNext();) { - buf.append("\n\t\tthrows ").append(e.next()); + for (String throwsDescriptor : throws_vec) { + buf.append("\n\t\tthrows ").append(throwsDescriptor); } } return buf.toString(); diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index 47022cca..3f2988bb 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -20,7 +20,6 @@ package org.apache.bcel.util; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; @@ -305,8 +304,7 @@ class BCELFactory extends EmptyVisitor { private void updateBranchTargets() { - for (Iterator i = branches.iterator(); i.hasNext();) { - BranchInstruction bi = i.next(); + for (BranchInstruction bi : branches) { BranchHandle bh = (BranchHandle) branch_map.get(bi); int pos = bh.getPosition(); String name = bi.getName() + "_" + pos; diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 0f6e899f..e7c5f9e9 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -28,7 +28,6 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; -import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.StringTokenizer; @@ -150,8 +149,8 @@ public class ClassPath implements Serializable { getPathComponents(boot_path, list); List dirs = new ArrayList(); getPathComponents(ext_path, dirs); - for (Iterator e = dirs.iterator(); e.hasNext();) { - File ext_dir = new File(e.next()); + for (String d : dirs) { + File ext_dir = new File(d); String[] extensions = ext_dir.list(new FilenameFilter() { public boolean accept( File dir, String name ) { @@ -166,11 +165,11 @@ public class ClassPath implements Serializable { } } StringBuffer buf = new StringBuffer(); - for (Iterator e = list.iterator(); e.hasNext();) { - buf.append(e.next()); - if (e.hasNext()) { - buf.append(File.pathSeparatorChar); - } + String separator = ""; + for (String path : list) { + buf.append(separator); + separator = File.pathSeparator; + buf.append(path); } return buf.toString().intern(); } diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index 4ea90264..73bba789 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -363,8 +363,7 @@ public class InstructionFinder { map.put("fstore", precompile(Constants.FSTORE_0, Constants.FSTORE_3, Constants.FSTORE)); map.put("astore", precompile(Constants.ASTORE_0, Constants.ASTORE_3, Constants.ASTORE)); // Compile strings - for (Iterator i = map.keySet().iterator(); i.hasNext();) { - String key = i.next(); + for (String key : map.keySet()) { String value = map.get(key); char ch = value.charAt(1); // Omit already precompiled patterns if (ch < OFFSET) { diff --git a/src/main/java/org/apache/bcel/verifier/Verifier.java b/src/main/java/org/apache/bcel/verifier/Verifier.java index f27ce922..e35d06e0 100644 --- a/src/main/java/org/apache/bcel/verifier/Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/Verifier.java @@ -19,7 +19,6 @@ package org.apache.bcel.verifier; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; @@ -160,9 +159,7 @@ public class Verifier { messages.add("Pass 2: " + p2m[i]); } } - Iterator p3as = p3avs.values().iterator(); - while (p3as.hasNext()) { - Pass3aVerifier pv = p3as.next(); + for (Pass3aVerifier pv : p3avs.values()) { String[] p3am = pv.getMessages(); int meth = pv.getMethodNo(); for (int i = 0; i < p3am.length; i++) { @@ -171,9 +168,7 @@ public class Verifier { + "'): " + p3am[i]); } } - Iterator p3bs = p3bvs.values().iterator(); - while (p3bs.hasNext()) { - Pass3bVerifier pv = p3bs.next(); + for (Pass3bVerifier pv : p3bvs.values()) { String[] p3bm = pv.getMessages(); int meth = pv.getMethodNo(); for (int i = 0; i < p3bm.length; i++) { diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java index 158a9bf1..00638b12 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java @@ -18,7 +18,6 @@ package org.apache.bcel.verifier; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; @@ -73,9 +72,7 @@ public class VerifierFactory { */ private static void notify( String fully_qualified_classname ) { // notify the observers - Iterator i = observers.iterator(); - while (i.hasNext()) { - VerifierFactoryObserver vfo = i.next(); + for (VerifierFactoryObserver vfo : observers) { vfo.update(fully_qualified_classname); } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index 476b8bcb..cfca7f50 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -20,7 +20,6 @@ package org.apache.bcel.verifier.structurals; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -142,10 +141,8 @@ public class Subroutines{ if (localVariable == UNSET){ throw new AssertionViolatedException("setLeavingRET() called for top-level 'subroutine' or forgot to set local variable first."); } - Iterator iter = instructions.iterator(); InstructionHandle ret = null; - while(iter.hasNext()){ - InstructionHandle actual = iter.next(); + for (InstructionHandle actual : instructions) { if (actual.getInstruction() instanceof RET){ if (ret != null){ throw new StructuralCodeConstraintException("Subroutine with more then one RET detected: '"+ret+"' and '"+actual+"'."); @@ -235,11 +232,10 @@ public class Subroutines{ } _getRecursivelyAccessedLocalsIndicesHelper(s, this.subSubs()); int[] ret = new int[s.size()]; - Iterator i = s.iterator(); int j=-1; - while (i.hasNext()){ + for (Integer index : s) { j++; - ret[j] = i.next().intValue(); + ret[j] = index.intValue(); } return ret; } @@ -270,9 +266,7 @@ public class Subroutines{ throw new AssertionViolatedException("This subroutine object must be built up completely before calculating accessed locals."); } { - Iterator i = instructions.iterator(); - while (i.hasNext()){ - InstructionHandle ih = i.next(); + for (InstructionHandle ih : instructions) { // RET is not a LocalVariableInstruction in the current version of BCEL. if (ih.getInstruction() instanceof LocalVariableInstruction || ih.getInstruction() instanceof RET){ int idx = ((IndexedInstruction) (ih.getInstruction())).getIndex(); @@ -297,11 +291,10 @@ public class Subroutines{ { int[] ret = new int[acc.size()]; - Iterator i = acc.iterator(); int j=-1; - while (i.hasNext()){ + for (Integer accessedLocal : acc) { j++; - ret[j] = i.next().intValue(); + ret[j] = accessedLocal.intValue(); } return ret; } @@ -313,9 +306,8 @@ public class Subroutines{ public Subroutine[] subSubs(){ Set h = new HashSet(); - Iterator i = instructions.iterator(); - while (i.hasNext()){ - Instruction inst = i.next().getInstruction(); + for (InstructionHandle ih : instructions) { + Instruction inst = ih.getInstruction(); if (inst instanceof JsrInstruction){ InstructionHandle targ = ((JsrInstruction) inst).getTarget(); h.add(getSubroutine(targ)); @@ -391,10 +383,8 @@ public class Subroutines{ } // Build up the database. - Iterator iter = sub_leaders.iterator(); - while (iter.hasNext()){ + for (InstructionHandle astore : sub_leaders) { SubroutineImpl sr = new SubroutineImpl(); - InstructionHandle astore = iter.next(); sr.setLocalVariable( ((ASTORE) (astore.getInstruction())).getIndex() ); subroutines.put(astore, sr); } @@ -422,10 +412,8 @@ public class Subroutines{ Map colors = new HashMap(); //Graph colouring. Key: InstructionHandle, Value: Integer . - iter = sub_leaders.iterator(); - while (iter.hasNext()){ + for (InstructionHandle actual : sub_leaders) { // Do some BFS with "actual" as the root of the graph. - InstructionHandle actual = iter.next(); // Init colors for (int i=0; i subs = subroutines.values().iterator(); - while (subs.hasNext()){ - Subroutine sub = subs.next(); + for (Subroutine sub : subroutines.values()) { if (sub != subroutines.get(all[0])){ // We don't want to forbid top-level exception handlers. if (sub.contains(_protected)){ throw new StructuralCodeConstraintException("Subroutine instruction '"+_protected+"' is protected by an exception handler, '"+handlers[i]+"'. This is forbidden by the JustIce verifier due to its clear definition of subroutines."); @@ -564,9 +550,7 @@ public class Subroutines{ * @see #getTopLevel() */ public Subroutine subroutineOf(InstructionHandle any){ - Iterator i = subroutines.values().iterator(); - while (i.hasNext()){ - Subroutine s = i.next(); + for (Subroutine s : subroutines.values()) { if (s.contains(any)) { return s; } -- GitLab From 25d3c6f1c061bb81bc384ac8cc05e72b57849cf4 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Fri, 29 Jul 2011 01:54:05 +0000 Subject: [PATCH 0516/1313] add appropriate @Override and @Deprecated annotations git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1152072 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AnnotationDefault.java | 3 + .../classfile/AnnotationElementValue.java | 3 + .../apache/bcel/classfile/Annotations.java | 1 + .../bcel/classfile/ArrayElementValue.java | 9 +- .../org/apache/bcel/classfile/Attribute.java | 6 +- .../bcel/classfile/ClassElementValue.java | 6 +- .../java/org/apache/bcel/classfile/Code.java | 4 + .../apache/bcel/classfile/CodeException.java | 1 + .../org/apache/bcel/classfile/Constant.java | 4 + .../org/apache/bcel/classfile/ConstantCP.java | 2 + .../apache/bcel/classfile/ConstantClass.java | 3 + .../apache/bcel/classfile/ConstantDouble.java | 3 + .../bcel/classfile/ConstantFieldref.java | 1 + .../apache/bcel/classfile/ConstantFloat.java | 3 + .../bcel/classfile/ConstantInteger.java | 3 + .../classfile/ConstantInterfaceMethodref.java | 1 + .../apache/bcel/classfile/ConstantLong.java | 3 + .../bcel/classfile/ConstantMethodref.java | 1 + .../bcel/classfile/ConstantNameAndType.java | 3 + .../apache/bcel/classfile/ConstantPool.java | 1 + .../apache/bcel/classfile/ConstantString.java | 3 + .../apache/bcel/classfile/ConstantUtf8.java | 3 + .../apache/bcel/classfile/ConstantValue.java | 4 + .../org/apache/bcel/classfile/Deprecated.java | 4 + .../apache/bcel/classfile/ElementValue.java | 3 +- .../bcel/classfile/EnclosingMethod.java | 7 +- .../bcel/classfile/EnumElementValue.java | 6 +- .../apache/bcel/classfile/ExceptionTable.java | 4 + .../java/org/apache/bcel/classfile/Field.java | 3 + .../org/apache/bcel/classfile/InnerClass.java | 1 + .../apache/bcel/classfile/InnerClasses.java | 4 + .../org/apache/bcel/classfile/JavaClass.java | 3 + .../org/apache/bcel/classfile/LineNumber.java | 1 + .../bcel/classfile/LineNumberTable.java | 4 + .../apache/bcel/classfile/LocalVariable.java | 1 + .../bcel/classfile/LocalVariableTable.java | 5 + .../classfile/LocalVariableTypeTable.java | 12 +- .../org/apache/bcel/classfile/Method.java | 3 + .../org/apache/bcel/classfile/PMGClass.java | 4 + .../bcel/classfile/ParameterAnnotations.java | 2 + .../RuntimeInvisibleAnnotations.java | 6 +- .../RuntimeInvisibleParameterAnnotations.java | 1 + .../classfile/RuntimeVisibleAnnotations.java | 6 +- .../RuntimeVisibleParameterAnnotations.java | 1 + .../org/apache/bcel/classfile/Signature.java | 4 + .../bcel/classfile/SimpleElementValue.java | 9 +- .../org/apache/bcel/classfile/SourceFile.java | 4 + .../org/apache/bcel/classfile/StackMap.java | 4 + .../apache/bcel/classfile/StackMapEntry.java | 1 + .../apache/bcel/classfile/StackMapTable.java | 4 + .../bcel/classfile/StackMapTableEntry.java | 1 + .../apache/bcel/classfile/StackMapType.java | 1 + .../org/apache/bcel/classfile/Synthetic.java | 4 + .../org/apache/bcel/classfile/Unknown.java | 5 + .../org/apache/bcel/classfile/Utility.java | 6 + .../java/org/apache/bcel/generic/AALOAD.java | 1 + .../java/org/apache/bcel/generic/AASTORE.java | 1 + .../org/apache/bcel/generic/ACONST_NULL.java | 1 + .../java/org/apache/bcel/generic/ALOAD.java | 1 + .../org/apache/bcel/generic/ANEWARRAY.java | 1 + .../java/org/apache/bcel/generic/ARETURN.java | 1 + .../org/apache/bcel/generic/ARRAYLENGTH.java | 1 + .../java/org/apache/bcel/generic/ASTORE.java | 1 + .../java/org/apache/bcel/generic/ATHROW.java | 1 + .../generic/AnnotationElementValueGen.java | 9 +- .../bcel/generic/AnnotationEntryGen.java | 3 +- .../bcel/generic/ArrayElementValueGen.java | 9 +- .../org/apache/bcel/generic/ArrayType.java | 2 + .../java/org/apache/bcel/generic/BALOAD.java | 1 + .../java/org/apache/bcel/generic/BASTORE.java | 1 + .../java/org/apache/bcel/generic/BIPUSH.java | 4 + .../org/apache/bcel/generic/BREAKPOINT.java | 1 + .../org/apache/bcel/generic/BasicType.java | 2 + .../org/apache/bcel/generic/BranchHandle.java | 5 + .../bcel/generic/BranchInstruction.java | 4 + .../java/org/apache/bcel/generic/CALOAD.java | 1 + .../java/org/apache/bcel/generic/CASTORE.java | 1 + .../org/apache/bcel/generic/CHECKCAST.java | 1 + .../apache/bcel/generic/CPInstruction.java | 4 + .../bcel/generic/ClassElementValueGen.java | 9 +- .../org/apache/bcel/generic/ClassGen.java | 3 + .../apache/bcel/generic/CodeExceptionGen.java | 2 + .../apache/bcel/generic/ConstantPoolGen.java | 1 + .../java/org/apache/bcel/generic/D2F.java | 1 + .../java/org/apache/bcel/generic/D2I.java | 1 + .../java/org/apache/bcel/generic/D2L.java | 1 + .../java/org/apache/bcel/generic/DADD.java | 1 + .../java/org/apache/bcel/generic/DALOAD.java | 1 + .../java/org/apache/bcel/generic/DASTORE.java | 1 + .../java/org/apache/bcel/generic/DCMPG.java | 1 + .../java/org/apache/bcel/generic/DCMPL.java | 1 + .../java/org/apache/bcel/generic/DCONST.java | 1 + .../java/org/apache/bcel/generic/DDIV.java | 1 + .../java/org/apache/bcel/generic/DLOAD.java | 1 + .../java/org/apache/bcel/generic/DMUL.java | 1 + .../java/org/apache/bcel/generic/DNEG.java | 1 + .../java/org/apache/bcel/generic/DREM.java | 1 + .../java/org/apache/bcel/generic/DRETURN.java | 1 + .../java/org/apache/bcel/generic/DSTORE.java | 1 + .../java/org/apache/bcel/generic/DSUB.java | 1 + .../java/org/apache/bcel/generic/DUP.java | 1 + .../java/org/apache/bcel/generic/DUP2.java | 1 + .../java/org/apache/bcel/generic/DUP2_X1.java | 1 + .../java/org/apache/bcel/generic/DUP2_X2.java | 1 + .../java/org/apache/bcel/generic/DUP_X1.java | 1 + .../java/org/apache/bcel/generic/DUP_X2.java | 1 + .../bcel/generic/ElementValuePairGen.java | 3 +- .../bcel/generic/EnumElementValueGen.java | 9 +- .../java/org/apache/bcel/generic/F2D.java | 1 + .../java/org/apache/bcel/generic/F2I.java | 1 + .../java/org/apache/bcel/generic/F2L.java | 1 + .../java/org/apache/bcel/generic/FADD.java | 1 + .../java/org/apache/bcel/generic/FALOAD.java | 1 + .../java/org/apache/bcel/generic/FASTORE.java | 1 + .../java/org/apache/bcel/generic/FCMPG.java | 1 + .../java/org/apache/bcel/generic/FCMPL.java | 1 + .../java/org/apache/bcel/generic/FCONST.java | 1 + .../java/org/apache/bcel/generic/FDIV.java | 1 + .../java/org/apache/bcel/generic/FLOAD.java | 1 + .../java/org/apache/bcel/generic/FMUL.java | 1 + .../java/org/apache/bcel/generic/FNEG.java | 1 + .../java/org/apache/bcel/generic/FREM.java | 1 + .../java/org/apache/bcel/generic/FRETURN.java | 1 + .../java/org/apache/bcel/generic/FSTORE.java | 1 + .../java/org/apache/bcel/generic/FSUB.java | 1 + .../org/apache/bcel/generic/FieldGen.java | 4 + .../bcel/generic/FieldGenOrMethodGen.java | 1 + .../apache/bcel/generic/FieldInstruction.java | 2 + .../apache/bcel/generic/FieldOrMethod.java | 2 + .../org/apache/bcel/generic/GETFIELD.java | 2 + .../org/apache/bcel/generic/GETSTATIC.java | 2 + .../java/org/apache/bcel/generic/GOTO.java | 3 + .../java/org/apache/bcel/generic/GOTO_W.java | 3 + .../java/org/apache/bcel/generic/I2B.java | 1 + .../java/org/apache/bcel/generic/I2C.java | 1 + .../java/org/apache/bcel/generic/I2D.java | 1 + .../java/org/apache/bcel/generic/I2F.java | 1 + .../java/org/apache/bcel/generic/I2L.java | 1 + .../java/org/apache/bcel/generic/I2S.java | 1 + .../java/org/apache/bcel/generic/IADD.java | 1 + .../java/org/apache/bcel/generic/IALOAD.java | 1 + .../java/org/apache/bcel/generic/IAND.java | 1 + .../java/org/apache/bcel/generic/IASTORE.java | 1 + .../java/org/apache/bcel/generic/ICONST.java | 1 + .../java/org/apache/bcel/generic/IDIV.java | 1 + .../java/org/apache/bcel/generic/IFEQ.java | 2 + .../java/org/apache/bcel/generic/IFGE.java | 2 + .../java/org/apache/bcel/generic/IFGT.java | 2 + .../java/org/apache/bcel/generic/IFLE.java | 2 + .../java/org/apache/bcel/generic/IFLT.java | 2 + .../java/org/apache/bcel/generic/IFNE.java | 2 + .../org/apache/bcel/generic/IFNONNULL.java | 2 + .../java/org/apache/bcel/generic/IFNULL.java | 2 + .../org/apache/bcel/generic/IF_ACMPEQ.java | 2 + .../org/apache/bcel/generic/IF_ACMPNE.java | 2 + .../org/apache/bcel/generic/IF_ICMPEQ.java | 2 + .../org/apache/bcel/generic/IF_ICMPGE.java | 2 + .../org/apache/bcel/generic/IF_ICMPGT.java | 2 + .../org/apache/bcel/generic/IF_ICMPLE.java | 2 + .../org/apache/bcel/generic/IF_ICMPLT.java | 2 + .../org/apache/bcel/generic/IF_ICMPNE.java | 2 + .../java/org/apache/bcel/generic/IINC.java | 6 + .../java/org/apache/bcel/generic/ILOAD.java | 1 + .../java/org/apache/bcel/generic/IMPDEP1.java | 1 + .../java/org/apache/bcel/generic/IMPDEP2.java | 1 + .../java/org/apache/bcel/generic/IMUL.java | 1 + .../java/org/apache/bcel/generic/INEG.java | 1 + .../org/apache/bcel/generic/INSTANCEOF.java | 1 + .../apache/bcel/generic/INVOKEINTERFACE.java | 5 + .../apache/bcel/generic/INVOKESPECIAL.java | 1 + .../org/apache/bcel/generic/INVOKESTATIC.java | 1 + .../apache/bcel/generic/INVOKEVIRTUAL.java | 1 + .../java/org/apache/bcel/generic/IOR.java | 1 + .../java/org/apache/bcel/generic/IREM.java | 1 + .../java/org/apache/bcel/generic/IRETURN.java | 1 + .../java/org/apache/bcel/generic/ISHL.java | 1 + .../java/org/apache/bcel/generic/ISHR.java | 1 + .../java/org/apache/bcel/generic/ISTORE.java | 1 + .../java/org/apache/bcel/generic/ISUB.java | 1 + .../java/org/apache/bcel/generic/IUSHR.java | 1 + .../java/org/apache/bcel/generic/IXOR.java | 1 + .../org/apache/bcel/generic/Instruction.java | 4 + .../bcel/generic/InstructionHandle.java | 1 + .../apache/bcel/generic/InstructionList.java | 1 + .../bcel/generic/InvokeInstruction.java | 4 + .../java/org/apache/bcel/generic/JSR.java | 3 + .../java/org/apache/bcel/generic/JSR_W.java | 3 + .../java/org/apache/bcel/generic/L2D.java | 1 + .../java/org/apache/bcel/generic/L2F.java | 1 + .../java/org/apache/bcel/generic/L2I.java | 1 + .../java/org/apache/bcel/generic/LADD.java | 1 + .../java/org/apache/bcel/generic/LALOAD.java | 1 + .../java/org/apache/bcel/generic/LAND.java | 1 + .../java/org/apache/bcel/generic/LASTORE.java | 1 + .../java/org/apache/bcel/generic/LCMP.java | 1 + .../java/org/apache/bcel/generic/LCONST.java | 1 + .../java/org/apache/bcel/generic/LDC.java | 5 + .../java/org/apache/bcel/generic/LDC2_W.java | 2 + .../java/org/apache/bcel/generic/LDC_W.java | 1 + .../java/org/apache/bcel/generic/LDIV.java | 1 + .../java/org/apache/bcel/generic/LLOAD.java | 1 + .../java/org/apache/bcel/generic/LMUL.java | 1 + .../java/org/apache/bcel/generic/LNEG.java | 1 + .../org/apache/bcel/generic/LOOKUPSWITCH.java | 3 + .../java/org/apache/bcel/generic/LOR.java | 1 + .../java/org/apache/bcel/generic/LREM.java | 1 + .../java/org/apache/bcel/generic/LRETURN.java | 1 + .../java/org/apache/bcel/generic/LSHL.java | 1 + .../java/org/apache/bcel/generic/LSHR.java | 1 + .../java/org/apache/bcel/generic/LSTORE.java | 1 + .../java/org/apache/bcel/generic/LSUB.java | 1 + .../java/org/apache/bcel/generic/LUSHR.java | 1 + .../java/org/apache/bcel/generic/LXOR.java | 1 + .../apache/bcel/generic/LineNumberGen.java | 1 + .../apache/bcel/generic/LoadInstruction.java | 1 + .../apache/bcel/generic/LocalVariableGen.java | 4 + .../generic/LocalVariableInstruction.java | 3 + .../org/apache/bcel/generic/MONITORENTER.java | 1 + .../org/apache/bcel/generic/MONITOREXIT.java | 1 + .../apache/bcel/generic/MULTIANEWARRAY.java | 6 + .../org/apache/bcel/generic/MethodGen.java | 4 + .../java/org/apache/bcel/generic/NEW.java | 1 + .../org/apache/bcel/generic/NEWARRAY.java | 4 + .../java/org/apache/bcel/generic/NOP.java | 1 + .../org/apache/bcel/generic/ObjectType.java | 4 + .../java/org/apache/bcel/generic/POP.java | 1 + .../java/org/apache/bcel/generic/POP2.java | 1 + .../java/org/apache/bcel/generic/PUSH.java | 1 + .../org/apache/bcel/generic/PUTFIELD.java | 2 + .../org/apache/bcel/generic/PUTSTATIC.java | 2 + .../java/org/apache/bcel/generic/RET.java | 4 + .../java/org/apache/bcel/generic/RETURN.java | 1 + .../apache/bcel/generic/ReferenceType.java | 1 + .../bcel/generic/ReturnaddressType.java | 2 + .../java/org/apache/bcel/generic/SALOAD.java | 1 + .../java/org/apache/bcel/generic/SASTORE.java | 1 + .../java/org/apache/bcel/generic/SIPUSH.java | 4 + .../java/org/apache/bcel/generic/SWAP.java | 1 + .../java/org/apache/bcel/generic/Select.java | 8 + .../bcel/generic/SimpleElementValueGen.java | 9 +- .../apache/bcel/generic/StoreInstruction.java | 1 + .../org/apache/bcel/generic/TABLESWITCH.java | 3 + .../java/org/apache/bcel/generic/Type.java | 4 + .../org/apache/bcel/util/BCELFactory.java | 13 + .../java/org/apache/bcel/util/BCELifier.java | 3 + .../org/apache/bcel/util/ClassLoader.java | 2 +- .../java/org/apache/bcel/util/ClassPath.java | 11 + .../java/org/apache/bcel/util/ClassQueue.java | 1 + .../org/apache/bcel/util/ClassVector.java | 1 + .../bcel/verifier/VerificationResult.java | 3 + .../bcel/verifier/VerifierAppFrame.java | 1 + .../apache/bcel/verifier/VerifyDialog.java | 1 + .../exc/AssertionViolatedException.java | 3 +- .../VerifierConstraintViolatedException.java | 3 +- .../bcel/verifier/statics/Pass1Verifier.java | 6 +- .../bcel/verifier/statics/Pass2Verifier.java | 102 ++-- .../bcel/verifier/statics/Pass3aVerifier.java | 96 ++-- .../statics/StringRepresentation.java | 34 ++ .../structurals/ControlFlowGraph.java | 3 +- .../structurals/ExecutionVisitor.java | 447 ++++++++++------ .../bcel/verifier/structurals/Frame.java | 12 +- .../verifier/structurals/GenericArray.java | 1 + .../structurals/InstConstraintVisitor.java | 489 ++++++++++++------ .../verifier/structurals/LocalVariables.java | 12 +- .../verifier/structurals/OperandStack.java | 12 +- .../verifier/structurals/Pass3bVerifier.java | 3 +- .../verifier/structurals/Subroutines.java | 6 +- .../structurals/UninitializedObjectType.java | 6 +- 268 files changed, 1368 insertions(+), 441 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index 897765d8..86adf2fa 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -78,6 +78,7 @@ public class AnnotationDefault extends Attribute * @param v * Visitor object */ + @Override public void accept(Visitor v) { // v.visitAnnotationDefault(this); @@ -100,11 +101,13 @@ public class AnnotationDefault extends Attribute return default_value; } + @Override public Attribute copy(ConstantPool _constant_pool) { throw new RuntimeException("Not implemented yet!"); } + @Override public final void dump(DataOutputStream dos) throws IOException { super.dump(dos); diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java index a1a242a4..31fb84cc 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java @@ -35,12 +35,14 @@ public class AnnotationElementValue extends ElementValue this.annotationEntry = annotationEntry; } + @Override public void dump(DataOutputStream dos) throws IOException { dos.writeByte(type); // u1 type of value (ANNOTATION == '@') annotationEntry.dump(dos); } + @Override public String stringifyValue() { StringBuffer sb = new StringBuffer(); @@ -48,6 +50,7 @@ public class AnnotationElementValue extends ElementValue return sb.toString(); } + @Override public String toString() { return stringifyValue(); diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index 3e918469..0a70bf82 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -70,6 +70,7 @@ public abstract class Annotations extends Attribute { * * @param v Visitor object */ + @Override public void accept(Visitor v) { v.visitAnnotation(this); } diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java index 43b731cf..9b23fbe5 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -25,7 +25,8 @@ public class ArrayElementValue extends ElementValue // For array types, this is the array private ElementValue[] evalues; - public String toString() + @Override + public String toString() { StringBuffer sb = new StringBuffer(); sb.append("{"); @@ -48,7 +49,8 @@ public class ArrayElementValue extends ElementValue this.evalues = datums; } - public void dump(DataOutputStream dos) throws IOException + @Override + public void dump(DataOutputStream dos) throws IOException { dos.writeByte(type); // u1 type of value (ARRAY == '[') dos.writeShort(evalues.length); @@ -58,7 +60,8 @@ public class ArrayElementValue extends ElementValue } } - public String stringifyValue() + @Override + public String stringifyValue() { StringBuffer sb = new StringBuffer(); sb.append("["); diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 1f3a0c97..26eb9916 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -297,7 +297,8 @@ public abstract class Attribute implements Cloneable, Node, Serializable * * @return shallow copy of this attribute */ - public Object clone() + @Override + public Object clone() { Object o = null; try @@ -319,7 +320,8 @@ public abstract class Attribute implements Cloneable, Node, Serializable /** * @return attribute name. */ - public String toString() + @Override + public String toString() { return Constants.ATTRIBUTE_NAMES[tag]; } diff --git a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java index 572a27a5..2d6cb290 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java @@ -46,14 +46,16 @@ public class ClassElementValue extends ElementValue return c.getBytes(); } - public String stringifyValue() + @Override + public String stringifyValue() { ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(idx, Constants.CONSTANT_Utf8); return cu8.getBytes(); } - public void dump(DataOutputStream dos) throws IOException + @Override + public void dump(DataOutputStream dos) throws IOException { dos.writeByte(type); // u1 kind of value dos.writeShort(idx); diff --git a/src/main/java/org/apache/bcel/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java index fda841b4..a7215e67 100644 --- a/src/main/java/org/apache/bcel/classfile/Code.java +++ b/src/main/java/org/apache/bcel/classfile/Code.java @@ -130,6 +130,7 @@ public final class Code extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitCode(this); } @@ -141,6 +142,7 @@ public final class Code extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(max_stack); @@ -326,6 +328,7 @@ public final class Code extends Attribute { /** * @return String representation of code chunk. */ + @Override public final String toString() { return toString(true); } @@ -336,6 +339,7 @@ public final class Code extends Attribute { * * @param _constant_pool the constant pool to duplicate */ + @Override public Attribute copy( ConstantPool _constant_pool ) { Code c = (Code) clone(); if (code != null) { diff --git a/src/main/java/org/apache/bcel/classfile/CodeException.java b/src/main/java/org/apache/bcel/classfile/CodeException.java index be7cae08..16ddc235 100644 --- a/src/main/java/org/apache/bcel/classfile/CodeException.java +++ b/src/main/java/org/apache/bcel/classfile/CodeException.java @@ -178,6 +178,7 @@ public final class CodeException implements Cloneable, Constants, Node, Serializ /** * @return String representation. */ + @Override public final String toString() { return "CodeException(start_pc = " + start_pc + ", end_pc = " + end_pc + ", handler_pc = " + handler_pc + ", catch_type = " + catch_type + ")"; diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index 0c9b35db..f6a03ff1 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -90,6 +90,7 @@ public abstract class Constant implements Cloneable, Node, Serializable { /** * @return String representation. */ + @Override public String toString() { return Constants.CONSTANT_NAMES[tag] + "[" + tag + "]"; } @@ -107,6 +108,7 @@ public abstract class Constant implements Cloneable, Node, Serializable { } + @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } @@ -173,6 +175,7 @@ public abstract class Constant implements Cloneable, Node, Serializable { * * @see java.lang.Object#equals(java.lang.Object) */ + @Override public boolean equals( Object obj ) { return _cmp.equals(this, obj); } @@ -184,6 +187,7 @@ public abstract class Constant implements Cloneable, Node, Serializable { * * @see java.lang.Object#hashCode() */ + @Override public int hashCode() { return _cmp.hashCode(this); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantCP.java b/src/main/java/org/apache/bcel/classfile/ConstantCP.java index c3cfbc10..2eb0a072 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantCP.java @@ -77,6 +77,7 @@ public abstract class ConstantCP extends Constant { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { file.writeByte(tag); file.writeShort(class_index); @@ -127,6 +128,7 @@ public abstract class ConstantCP extends Constant { /** * @return String representation. */ + @Override public final String toString() { return super.toString() + "(class_index = " + class_index + ", name_and_type_index = " + name_and_type_index + ")"; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantClass.java b/src/main/java/org/apache/bcel/classfile/ConstantClass.java index 8ab6728a..3fa64f03 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantClass.java @@ -74,6 +74,7 @@ public final class ConstantClass extends Constant implements ConstantObject { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantClass(this); } @@ -85,6 +86,7 @@ public final class ConstantClass extends Constant implements ConstantObject { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { file.writeByte(tag); file.writeShort(name_index); @@ -125,6 +127,7 @@ public final class ConstantClass extends Constant implements ConstantObject { /** * @return String representation. */ + @Override public final String toString() { return super.toString() + "(name_index = " + name_index + ")"; } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java index aebaba26..0f2ffcf5 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java @@ -73,6 +73,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantDouble(this); } @@ -84,6 +85,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { file.writeByte(tag); file.writeDouble(bytes); @@ -109,6 +111,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { /** * @return String representation. */ + @Override public final String toString() { return super.toString() + "(bytes = " + bytes + ")"; } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java index b53e0c84..9a0725bc 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java @@ -67,6 +67,7 @@ public final class ConstantFieldref extends ConstantCP { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantFieldref(this); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java index cdf19cb6..6ce33c9b 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java @@ -74,6 +74,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantFloat(this); } @@ -85,6 +86,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { file.writeByte(tag); file.writeFloat(bytes); @@ -110,6 +112,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { /** * @return String representation. */ + @Override public final String toString() { return super.toString() + "(bytes = " + bytes + ")"; } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java index 283aa34d..56c2d062 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java @@ -73,6 +73,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantInteger(this); } @@ -84,6 +85,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { file.writeByte(tag); file.writeInt(bytes); @@ -109,6 +111,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { /** * @return String representation. */ + @Override public final String toString() { return super.toString() + "(bytes = " + bytes + ")"; } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java index 9e16db55..662e4e43 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java @@ -67,6 +67,7 @@ public final class ConstantInterfaceMethodref extends ConstantCP { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantInterfaceMethodref(this); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantLong.java b/src/main/java/org/apache/bcel/classfile/ConstantLong.java index 8468a108..eab76178 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantLong.java @@ -73,6 +73,7 @@ public final class ConstantLong extends Constant implements ConstantObject { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantLong(this); } @@ -84,6 +85,7 @@ public final class ConstantLong extends Constant implements ConstantObject { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { file.writeByte(tag); file.writeLong(bytes); @@ -109,6 +111,7 @@ public final class ConstantLong extends Constant implements ConstantObject { /** * @return String representation. */ + @Override public final String toString() { return super.toString() + "(bytes = " + bytes + ")"; } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java index c8efe5aa..a4669133 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java @@ -67,6 +67,7 @@ public final class ConstantMethodref extends ConstantCP { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantMethodref(this); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java index 7fbc18c9..2bc2db8c 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java @@ -77,6 +77,7 @@ public final class ConstantNameAndType extends Constant { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantNameAndType(this); } @@ -88,6 +89,7 @@ public final class ConstantNameAndType extends Constant { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { file.writeByte(tag); file.writeShort(name_index); @@ -144,6 +146,7 @@ public final class ConstantNameAndType extends Constant { /** * @return String representation */ + @Override public final String toString() { return super.toString() + "(name_index = " + name_index + ", signature_index = " + signature_index + ")"; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index 7a17e387..8621edef 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -326,6 +326,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { /** * @return String representation. */ + @Override public String toString() { StringBuffer buf = new StringBuffer(); for (int i = 1; i < constant_pool_count; i++) { diff --git a/src/main/java/org/apache/bcel/classfile/ConstantString.java b/src/main/java/org/apache/bcel/classfile/ConstantString.java index b3addd90..7d26f186 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantString.java @@ -73,6 +73,7 @@ public final class ConstantString extends Constant implements ConstantObject { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantString(this); } @@ -84,6 +85,7 @@ public final class ConstantString extends Constant implements ConstantObject { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { file.writeByte(tag); file.writeShort(string_index); @@ -109,6 +111,7 @@ public final class ConstantString extends Constant implements ConstantObject { /** * @return String representation. */ + @Override public final String toString() { return super.toString() + "(string_index = " + string_index + ")"; } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index 0c8fb95d..ab06d54a 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -77,6 +77,7 @@ public final class ConstantUtf8 extends Constant { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantUtf8(this); } @@ -88,6 +89,7 @@ public final class ConstantUtf8 extends Constant { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { file.writeByte(tag); file.writeUTF(bytes); @@ -113,6 +115,7 @@ public final class ConstantUtf8 extends Constant { /** * @return String representation */ + @Override public final String toString() { return super.toString() + "(\"" + Utility.replace(bytes, "\n", "\\n") + "\")"; } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantValue.java b/src/main/java/org/apache/bcel/classfile/ConstantValue.java index c05794df..61af5d70 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantValue.java @@ -81,6 +81,7 @@ public final class ConstantValue extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantValue(this); } @@ -92,6 +93,7 @@ public final class ConstantValue extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(constantvalue_index); @@ -117,6 +119,7 @@ public final class ConstantValue extends Attribute { /** * @return String representation of constant value. */ + @Override public final String toString() { Constant c = constant_pool.getConstant(constantvalue_index); String buf; @@ -150,6 +153,7 @@ public final class ConstantValue extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { ConstantValue c = (ConstantValue) clone(); c.constant_pool = _constant_pool; diff --git a/src/main/java/org/apache/bcel/classfile/Deprecated.java b/src/main/java/org/apache/bcel/classfile/Deprecated.java index 2aab553f..e8ec2cee 100644 --- a/src/main/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/main/java/org/apache/bcel/classfile/Deprecated.java @@ -84,6 +84,7 @@ public final class Deprecated extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitDeprecated(this); } @@ -95,6 +96,7 @@ public final class Deprecated extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); if (length > 0) { @@ -122,6 +124,7 @@ public final class Deprecated extends Attribute { /** * @return attribute name */ + @Override public final String toString() { return Constants.ATTRIBUTE_NAMES[Constants.ATTR_DEPRECATED]; } @@ -130,6 +133,7 @@ public final class Deprecated extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { Deprecated c = (Deprecated) clone(); if (bytes != null) { diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index 4870e3ee..b18ae9a3 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -32,7 +32,8 @@ public abstract class ElementValue protected ConstantPool cpool; - public String toString() + @Override + public String toString() { return stringifyValue(); } diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java index 4d93387e..93890fc8 100644 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -55,11 +55,13 @@ public class EnclosingMethod extends Attribute { methodIndex = methodIdx; } - public void accept(Visitor v) { + @Override + public void accept(Visitor v) { v.visitEnclosingMethod(this); } - public Attribute copy(ConstantPool constant_pool) { + @Override + public Attribute copy(ConstantPool constant_pool) { throw new RuntimeException("Not implemented yet!"); // is this next line sufficient? // return (EnclosingMethod)clone(); @@ -85,6 +87,7 @@ public class EnclosingMethod extends Attribute { return nat; } + @Override public final void dump(DataOutputStream file) throws IOException { super.dump(file); file.writeShort(classIndex); diff --git a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java index 77972400..8efb7c44 100644 --- a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java @@ -39,14 +39,16 @@ public class EnumElementValue extends ElementValue this.valueIdx = valueIdx; } - public void dump(DataOutputStream dos) throws IOException + @Override + public void dump(DataOutputStream dos) throws IOException { dos.writeByte(type); // u1 type of value (ENUM_CONSTANT == 'e') dos.writeShort(typeIdx); // u2 dos.writeShort(valueIdx); // u2 } - public String stringifyValue() + @Override + public String stringifyValue() { ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(valueIdx, Constants.CONSTANT_Utf8); diff --git a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java index 035b2d69..e99cc6cb 100644 --- a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java @@ -89,6 +89,7 @@ public final class ExceptionTable extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionTable(this); } @@ -100,6 +101,7 @@ public final class ExceptionTable extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(number_of_exceptions); @@ -151,6 +153,7 @@ public final class ExceptionTable extends Attribute { /** * @return String representation, i.e., a list of thrown exceptions. */ + @Override public final String toString() { StringBuffer buf = new StringBuffer(); String str; @@ -169,6 +172,7 @@ public final class ExceptionTable extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { ExceptionTable c = (ExceptionTable) clone(); if (exception_index_table != null) { diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java index 3b3c282f..9f1b170e 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/bcel/classfile/Field.java @@ -113,6 +113,7 @@ public final class Field extends FieldOrMethod { * * @return String representation of field, including the signature. */ + @Override public final String toString() { String name, signature, access; // Short cuts to constant pool // Get names from constant pool @@ -175,6 +176,7 @@ public final class Field extends FieldOrMethod { * * @see java.lang.Object#equals(java.lang.Object) */ + @Override public boolean equals( Object obj ) { return _cmp.equals(this, obj); } @@ -186,6 +188,7 @@ public final class Field extends FieldOrMethod { * * @see java.lang.Object#hashCode() */ + @Override public int hashCode() { return _cmp.hashCode(this); } diff --git a/src/main/java/org/apache/bcel/classfile/InnerClass.java b/src/main/java/org/apache/bcel/classfile/InnerClass.java index 10f18776..02a06790 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClass.java @@ -170,6 +170,7 @@ public final class InnerClass implements Cloneable, Node, Serializable { /** * @return String representation. */ + @Override public final String toString() { return "InnerClass(" + inner_class_index + ", " + outer_class_index + ", " + inner_name_index + ", " + inner_access_flags + ")"; diff --git a/src/main/java/org/apache/bcel/classfile/InnerClasses.java b/src/main/java/org/apache/bcel/classfile/InnerClasses.java index ce232be3..f63814ff 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClasses.java @@ -88,6 +88,7 @@ public final class InnerClasses extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitInnerClasses(this); } @@ -99,6 +100,7 @@ public final class InnerClasses extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(number_of_classes); @@ -128,6 +130,7 @@ public final class InnerClasses extends Attribute { /** * @return String representation. */ + @Override public final String toString() { StringBuffer buf = new StringBuffer(); for (int i = 0; i < number_of_classes; i++) { @@ -140,6 +143,7 @@ public final class InnerClasses extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { InnerClasses c = (InnerClasses) clone(); c.inner_classes = new InnerClass[number_of_classes]; diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 4c52d6f8..af55ed22 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -617,6 +617,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @return String representing class contents. */ + @Override public String toString() { String access = Utility.accessToString(access_flags, true); access = access.equals("") ? "" : (access + " "); @@ -913,6 +914,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * * @see java.lang.Object#equals(java.lang.Object) */ + @Override public boolean equals( Object obj ) { return _cmp.equals(this, obj); } @@ -933,6 +935,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * * @see java.lang.Object#hashCode() */ + @Override public int hashCode() { return _cmp.hashCode(this); } diff --git a/src/main/java/org/apache/bcel/classfile/LineNumber.java b/src/main/java/org/apache/bcel/classfile/LineNumber.java index 8633e533..0a544020 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumber.java @@ -125,6 +125,7 @@ public final class LineNumber implements Cloneable, Node, Serializable { /** * @return String representation */ + @Override public final String toString() { return "LineNumber(" + start_pc + ", " + line_number + ")"; } diff --git a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java index 1477673e..b8720012 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java @@ -87,6 +87,7 @@ public final class LineNumberTable extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitLineNumberTable(this); } @@ -98,6 +99,7 @@ public final class LineNumberTable extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(line_number_table_length); @@ -127,6 +129,7 @@ public final class LineNumberTable extends Attribute { /** * @return String representation. */ + @Override public final String toString() { StringBuffer buf = new StringBuffer(); StringBuffer line = new StringBuffer(); @@ -193,6 +196,7 @@ public final class LineNumberTable extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { LineNumberTable c = (LineNumberTable) clone(); c.line_number_table = new LineNumber[line_number_table_length]; diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java index 1b4049dc..138f6186 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariable.java @@ -231,6 +231,7 @@ public final class LocalVariable implements Constants, Cloneable, Node, Serializ /** * @return string representation. */ + @Override public final String toString() { String name = getName(), signature = Utility.signatureToString(getSignature()); return "LocalVariable(start_pc = " + start_pc + ", length = " + length + ", index = " diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index dee70c91..a1026b5d 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -86,6 +86,7 @@ public class LocalVariableTable extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitLocalVariableTable(this); } @@ -97,6 +98,7 @@ public class LocalVariableTable extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(local_variable_table_length); @@ -123,6 +125,7 @@ public class LocalVariableTable extends Attribute { * @deprecated since 5.2 because multiple variables can share the * same slot, use getLocalVariable(int index, int pc) instead. */ + @Deprecated public final LocalVariable getLocalVariable( int index ) { for (int i = 0; i < local_variable_table_length; i++) { if (local_variable_table[i].getIndex() == index) { @@ -165,6 +168,7 @@ public class LocalVariableTable extends Attribute { /** * @return String representation. */ + @Override public final String toString() { StringBuffer buf = new StringBuffer(); for (int i = 0; i < local_variable_table_length; i++) { @@ -180,6 +184,7 @@ public class LocalVariableTable extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { LocalVariableTable c = (LocalVariableTable) clone(); c.local_variable_table = new LocalVariable[local_variable_table_length]; diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index e9547f77..9ca2789a 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -74,11 +74,13 @@ private int local_variable_type_table_length; // Table of local local_variable_type_table[i] = new LocalVariable(dis, cpool); } - public void accept(Visitor v) { + @Override +public void accept(Visitor v) { v.visitLocalVariableTypeTable(this); } - public final void dump(DataOutputStream file) throws IOException + @Override +public final void dump(DataOutputStream file) throws IOException { super.dump(file); file.writeShort(local_variable_type_table_length); @@ -108,7 +110,8 @@ private int local_variable_type_table_length; // Table of local /** * @return String representation. */ - public final String toString() { + @Override +public final String toString() { StringBuffer buf = new StringBuffer(""); for(int i=0; i < local_variable_type_table_length; i++) { @@ -123,7 +126,8 @@ private int local_variable_type_table_length; // Table of local /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) { + @Override +public Attribute copy(ConstantPool constant_pool) { LocalVariableTypeTable c = (LocalVariableTypeTable)clone(); c.local_variable_type_table = new LocalVariable[local_variable_type_table_length]; diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index c5d15a59..3006f771 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -162,6 +162,7 @@ public final class Method extends FieldOrMethod { * * @return String representation of the method. */ + @Override public final String toString() { ConstantUtf8 c; String name, signature, access; // Short cuts to constant pool @@ -239,6 +240,7 @@ public final class Method extends FieldOrMethod { * * @see java.lang.Object#equals(java.lang.Object) */ + @Override public boolean equals( Object obj ) { return _cmp.equals(this, obj); } @@ -250,6 +252,7 @@ public final class Method extends FieldOrMethod { * * @see java.lang.Object#hashCode() */ + @Override public int hashCode() { return _cmp.hashCode(this); } diff --git a/src/main/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java index acf8d6b4..40c8fb18 100644 --- a/src/main/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/main/java/org/apache/bcel/classfile/PMGClass.java @@ -83,6 +83,7 @@ public final class PMGClass extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { System.err.println("Visiting non-standard PMGClass object"); } @@ -94,6 +95,7 @@ public final class PMGClass extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(pmg_index); @@ -156,6 +158,7 @@ public final class PMGClass extends Attribute { /** * @return String representation */ + @Override public final String toString() { return "PMGClass(" + getPMGName() + ", " + getPMGClassName() + ")"; } @@ -164,6 +167,7 @@ public final class PMGClass extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { return (PMGClass) clone(); } diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index 76a2966b..aee94774 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -75,6 +75,7 @@ public abstract class ParameterAnnotations extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { // v.visitParameterAnnotation(this); } @@ -115,6 +116,7 @@ public abstract class ParameterAnnotations extends Attribute { return num_parameters; } + @Override public void dump(DataOutputStream dos) throws IOException { super.dump(dos); diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 3f7b18a2..86b21816 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -55,13 +55,15 @@ public class RuntimeInvisibleAnnotations extends Annotations /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) + @Override + public Attribute copy(ConstantPool constant_pool) { Annotations c = (Annotations) clone(); return c; } - public final void dump(DataOutputStream dos) throws IOException + @Override + public final void dump(DataOutputStream dos) throws IOException { super.dump(dos); writeAnnotations(dos); diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 5e2b597c..a684c583 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -50,6 +50,7 @@ public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool constant_pool ) { Annotations c = (Annotations) clone(); return c; diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 710d1490..f59a5fa5 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -55,13 +55,15 @@ public class RuntimeVisibleAnnotations extends Annotations /** * @return deep copy of this attribute */ - public Attribute copy(ConstantPool constant_pool) + @Override + public Attribute copy(ConstantPool constant_pool) { Annotations c = (Annotations) clone(); return c; } - public final void dump(DataOutputStream dos) throws IOException + @Override + public final void dump(DataOutputStream dos) throws IOException { super.dump(dos); writeAnnotations(dos); diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index c6023684..1ef1709a 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -50,6 +50,7 @@ public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool constant_pool ) { Annotations c = (Annotations) clone(); return c; diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index c6d7861d..a3431717 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -80,6 +80,7 @@ public final class Signature extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { //System.err.println("Visiting non-standard Signature object"); v.visitSignature(this); @@ -92,6 +93,7 @@ public final class Signature extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(signature_index); @@ -251,6 +253,7 @@ public final class Signature extends Attribute { /** * @return String representation */ + @Override public final String toString() { String s = getSignature(); return "Signature(" + s + ")"; @@ -260,6 +263,7 @@ public final class Signature extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { return (Signature) clone(); } diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java index 5ca7ae97..bcd747bd 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -129,13 +129,15 @@ public class SimpleElementValue extends ElementValue return (short) s.getBytes(); } - public String toString() + @Override + public String toString() { return stringifyValue(); } // Whatever kind of value it is, return it as a string - public String stringifyValue() + @Override + public String stringifyValue() { switch (type) { @@ -185,7 +187,8 @@ public class SimpleElementValue extends ElementValue } } - public void dump(DataOutputStream dos) throws IOException + @Override + public void dump(DataOutputStream dos) throws IOException { dos.writeByte(type); // u1 kind of value switch (type) diff --git a/src/main/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java index 50b11c09..cfba213c 100644 --- a/src/main/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/main/java/org/apache/bcel/classfile/SourceFile.java @@ -88,6 +88,7 @@ public final class SourceFile extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitSourceFile(this); } @@ -99,6 +100,7 @@ public final class SourceFile extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(sourcefile_index); @@ -134,6 +136,7 @@ public final class SourceFile extends Attribute { /** * @return String representation */ + @Override public final String toString() { return "SourceFile(" + getSourceFileName() + ")"; } @@ -142,6 +145,7 @@ public final class SourceFile extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { return (SourceFile) clone(); } diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java index 230c786b..81615ff9 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMap.java +++ b/src/main/java/org/apache/bcel/classfile/StackMap.java @@ -81,6 +81,7 @@ public final class StackMap extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(map_length); @@ -110,6 +111,7 @@ public final class StackMap extends Attribute { /** * @return String representation. */ + @Override public final String toString() { StringBuffer buf = new StringBuffer("StackMap("); for (int i = 0; i < map_length; i++) { @@ -126,6 +128,7 @@ public final class StackMap extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { StackMap c = (StackMap) clone(); c.map = new StackMapEntry[map_length]; @@ -144,6 +147,7 @@ public final class StackMap extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackMap(this); } diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index eec1748e..ea2d8201 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -97,6 +97,7 @@ public final class StackMapEntry implements Cloneable, Serializable { /** * @return String representation. */ + @Override public final String toString() { StringBuffer buf = new StringBuffer(64); buf.append("(offset=").append(byte_code_offset); diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTable.java b/src/main/java/org/apache/bcel/classfile/StackMapTable.java index dd0caea4..305df256 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTable.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTable.java @@ -81,6 +81,7 @@ public final class StackMapTable extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(map_length); @@ -110,6 +111,7 @@ public final class StackMapTable extends Attribute { /** * @return String representation. */ + @Override public final String toString() { StringBuffer buf = new StringBuffer("StackMapTable("); for (int i = 0; i < map_length; i++) { @@ -126,6 +128,7 @@ public final class StackMapTable extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { StackMapTable c = (StackMapTable) clone(); c.map = new StackMapTableEntry[map_length]; @@ -144,6 +147,7 @@ public final class StackMapTable extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackMapTable(this); } diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index 6cc490c1..ed3a5866 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -154,6 +154,7 @@ public final class StackMapTableEntry implements Cloneable, Serializable { /** * @return String representation. */ + @Override public final String toString() { StringBuffer buf = new StringBuffer(64); buf.append("("); diff --git a/src/main/java/org/apache/bcel/classfile/StackMapType.java b/src/main/java/org/apache/bcel/classfile/StackMapType.java index 68715a2a..ed686458 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapType.java @@ -132,6 +132,7 @@ public final class StackMapType implements Cloneable, Serializable { /** * @return String representation */ + @Override public final String toString() { return "(type=" + Constants.ITEM_NAMES[type] + printIndex() + ")"; } diff --git a/src/main/java/org/apache/bcel/classfile/Synthetic.java b/src/main/java/org/apache/bcel/classfile/Synthetic.java index 2a3ceecb..2f6bacf4 100644 --- a/src/main/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/main/java/org/apache/bcel/classfile/Synthetic.java @@ -90,6 +90,7 @@ public final class Synthetic extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitSynthetic(this); } @@ -101,6 +102,7 @@ public final class Synthetic extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); if (length > 0) { @@ -128,6 +130,7 @@ public final class Synthetic extends Attribute { /** * @return String representation. */ + @Override public final String toString() { StringBuffer buf = new StringBuffer("Synthetic"); if (length > 0) { @@ -140,6 +143,7 @@ public final class Synthetic extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { Synthetic c = (Synthetic) clone(); if (bytes != null) { diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index 8e5ee638..3e3f1af0 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -109,6 +109,7 @@ public final class Unknown extends Attribute { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitUnknown(this); } @@ -120,6 +121,7 @@ public final class Unknown extends Attribute { * @param file Output file stream * @throws IOException */ + @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); if (length > 0) { @@ -139,6 +141,7 @@ public final class Unknown extends Attribute { /** * @return name of attribute. */ + @Override public final String getName() { return name; } @@ -155,6 +158,7 @@ public final class Unknown extends Attribute { /** * @return String representation. */ + @Override public final String toString() { if (length == 0 || bytes == null) { return "(Unknown attribute " + name + ")"; @@ -174,6 +178,7 @@ public final class Unknown extends Attribute { /** * @return deep copy of this attribute */ + @Override public Attribute copy( ConstantPool _constant_pool ) { Unknown c = (Unknown) clone(); if (bytes != null) { diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 42e1eb51..d4b45e0d 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -60,6 +60,7 @@ public abstract class Utility { private static ThreadLocal consumed_chars = new ThreadLocal() { + @Override protected Integer initialValue() { return Integer.valueOf(0); } @@ -1261,6 +1262,7 @@ public abstract class Utility { } + @Override public int read() throws IOException { int b = in.read(); if (b != ESCAPE_CHAR) { @@ -1285,6 +1287,7 @@ public abstract class Utility { } + @Override public int read( char[] cbuf, int off, int len ) throws IOException { for (int i = 0; i < len; i++) { cbuf[off + i] = (char) read(); @@ -1303,6 +1306,7 @@ public abstract class Utility { } + @Override public void write( int b ) throws IOException { if (isJavaIdentifierPart((char) b) && (b != ESCAPE_CHAR)) { out.write(b); @@ -1325,6 +1329,7 @@ public abstract class Utility { } + @Override public void write( char[] cbuf, int off, int len ) throws IOException { for (int i = 0; i < len; i++) { write(cbuf[off + i]); @@ -1332,6 +1337,7 @@ public abstract class Utility { } + @Override public void write( String str, int off, int len ) throws IOException { write(str.toCharArray(), off, len); } diff --git a/src/main/java/org/apache/bcel/generic/AALOAD.java b/src/main/java/org/apache/bcel/generic/AALOAD.java index 2560a728..5e9de579 100644 --- a/src/main/java/org/apache/bcel/generic/AALOAD.java +++ b/src/main/java/org/apache/bcel/generic/AALOAD.java @@ -44,6 +44,7 @@ public class AALOAD extends ArrayInstruction implements StackProducer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/AASTORE.java b/src/main/java/org/apache/bcel/generic/AASTORE.java index 34f44cd3..dbe7cdfb 100644 --- a/src/main/java/org/apache/bcel/generic/AASTORE.java +++ b/src/main/java/org/apache/bcel/generic/AASTORE.java @@ -44,6 +44,7 @@ public class AASTORE extends ArrayInstruction implements StackConsumer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java index b7608c54..f1e1bcaf 100644 --- a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java +++ b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java @@ -52,6 +52,7 @@ public class ACONST_NULL extends Instruction implements PushInstruction, TypedIn * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/ALOAD.java b/src/main/java/org/apache/bcel/generic/ALOAD.java index c002cde6..f54e9844 100644 --- a/src/main/java/org/apache/bcel/generic/ALOAD.java +++ b/src/main/java/org/apache/bcel/generic/ALOAD.java @@ -54,6 +54,7 @@ public class ALOAD extends LoadInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { super.accept(v); v.visitALOAD(this); diff --git a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java index f9149a11..077d3767 100644 --- a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java @@ -62,6 +62,7 @@ public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationIns * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitLoadClass(this); v.visitAllocationInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/ARETURN.java b/src/main/java/org/apache/bcel/generic/ARETURN.java index 2f3187e3..63b32cb1 100644 --- a/src/main/java/org/apache/bcel/generic/ARETURN.java +++ b/src/main/java/org/apache/bcel/generic/ARETURN.java @@ -45,6 +45,7 @@ public class ARETURN extends ReturnInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java index e38d2269..2476aa5e 100644 --- a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java @@ -53,6 +53,7 @@ public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackP * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/ASTORE.java b/src/main/java/org/apache/bcel/generic/ASTORE.java index b1622351..9fe5299f 100644 --- a/src/main/java/org/apache/bcel/generic/ASTORE.java +++ b/src/main/java/org/apache/bcel/generic/ASTORE.java @@ -54,6 +54,7 @@ public class ASTORE extends StoreInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { super.accept(v); v.visitASTORE(this); diff --git a/src/main/java/org/apache/bcel/generic/ATHROW.java b/src/main/java/org/apache/bcel/generic/ATHROW.java index 8dbf71f5..12000ac0 100644 --- a/src/main/java/org/apache/bcel/generic/ATHROW.java +++ b/src/main/java/org/apache/bcel/generic/ATHROW.java @@ -54,6 +54,7 @@ public class ATHROW extends Instruction implements UnconditionalBranch, Exceptio * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitUnconditionalBranch(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java index b2b3f0b9..c94b50f5 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java @@ -50,13 +50,15 @@ public class AnnotationElementValueGen extends ElementValueGen a = new AnnotationEntryGen(value.getAnnotationEntry(), cpool, copyPoolEntries); } - public void dump(DataOutputStream dos) throws IOException + @Override + public void dump(DataOutputStream dos) throws IOException { dos.writeByte(type); // u1 type of value (ANNOTATION == '@') a.dump(dos); } - public String stringifyValue() + @Override + public String stringifyValue() { throw new RuntimeException("Not implemented yet"); } @@ -64,7 +66,8 @@ public class AnnotationElementValueGen extends ElementValueGen /** * Return immutable variant of this AnnotationElementValueGen */ - public ElementValue getElementValue() + @Override + public ElementValue getElementValue() { return new AnnotationElementValue(this.type, a.getAnnotation(), cpGen .getConstantPool()); diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index 1dedef9d..cbb22eb4 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -164,7 +164,8 @@ public class AnnotationEntryGen return evs; } - public String toString() + @Override + public String toString() { StringBuffer s = new StringBuffer(); s.append("AnnotationGen:[" + getTypeName() + " #" + evs.size() + " {"); diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index 73c481b8..248ea1a0 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -54,7 +54,8 @@ public class ArrayElementValueGen extends ElementValueGen /** * Return immutable variant of this ArrayElementValueGen */ - public ElementValue getElementValue() + @Override + public ElementValue getElementValue() { ElementValue[] immutableData = new ElementValue[evalues.size()]; int i = 0; @@ -81,7 +82,8 @@ public class ArrayElementValueGen extends ElementValueGen } } - public void dump(DataOutputStream dos) throws IOException + @Override + public void dump(DataOutputStream dos) throws IOException { dos.writeByte(type); // u1 type of value (ARRAY == '[') dos.writeShort(evalues.size()); @@ -90,7 +92,8 @@ public class ArrayElementValueGen extends ElementValueGen } } - public String stringifyValue() + @Override + public String stringifyValue() { StringBuffer sb = new StringBuffer(); sb.append("["); diff --git a/src/main/java/org/apache/bcel/generic/ArrayType.java b/src/main/java/org/apache/bcel/generic/ArrayType.java index 1868d6e4..46ee9533 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayType.java +++ b/src/main/java/org/apache/bcel/generic/ArrayType.java @@ -112,6 +112,7 @@ public final class ArrayType extends ReferenceType { /** @return a hash code value for the object. */ + @Override public int hashCode() { return basic_type.hashCode() ^ dimensions; } @@ -119,6 +120,7 @@ public final class ArrayType extends ReferenceType { /** @return true if both type objects refer to the same array type. */ + @Override public boolean equals( Object _type ) { if (_type instanceof ArrayType) { ArrayType array = (ArrayType) _type; diff --git a/src/main/java/org/apache/bcel/generic/BALOAD.java b/src/main/java/org/apache/bcel/generic/BALOAD.java index 8c2aca79..bb07ca60 100644 --- a/src/main/java/org/apache/bcel/generic/BALOAD.java +++ b/src/main/java/org/apache/bcel/generic/BALOAD.java @@ -44,6 +44,7 @@ public class BALOAD extends ArrayInstruction implements StackProducer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/BASTORE.java b/src/main/java/org/apache/bcel/generic/BASTORE.java index b428f951..3e4c1c53 100644 --- a/src/main/java/org/apache/bcel/generic/BASTORE.java +++ b/src/main/java/org/apache/bcel/generic/BASTORE.java @@ -44,6 +44,7 @@ public class BASTORE extends ArrayInstruction implements StackConsumer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/BIPUSH.java b/src/main/java/org/apache/bcel/generic/BIPUSH.java index 9a7575ad..0aa97686 100644 --- a/src/main/java/org/apache/bcel/generic/BIPUSH.java +++ b/src/main/java/org/apache/bcel/generic/BIPUSH.java @@ -54,6 +54,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { /** * Dump instruction as byte code to stream out. */ + @Override public void dump( DataOutputStream out ) throws IOException { super.dump(out); out.writeByte(b); @@ -63,6 +64,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { /** * @return mnemonic for instruction */ + @Override public String toString( boolean verbose ) { return super.toString(verbose) + " " + b; } @@ -71,6 +73,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { /** * Read needed data (e.g. index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { length = 2; b = bytes.readByte(); @@ -97,6 +100,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitPushInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java index a0e863bf..0c3fae5b 100644 --- a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java +++ b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java @@ -41,6 +41,7 @@ public class BREAKPOINT extends Instruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitBREAKPOINT(this); } diff --git a/src/main/java/org/apache/bcel/generic/BasicType.java b/src/main/java/org/apache/bcel/generic/BasicType.java index 2eb51a55..647cfd87 100644 --- a/src/main/java/org/apache/bcel/generic/BasicType.java +++ b/src/main/java/org/apache/bcel/generic/BasicType.java @@ -72,6 +72,7 @@ public final class BasicType extends Type { /** @return a hash code value for the object. */ + @Override public int hashCode() { return type; } @@ -79,6 +80,7 @@ public final class BasicType extends Type { /** @return true if both type objects refer to the same type */ + @Override public boolean equals( Object _type ) { return (_type instanceof BasicType) ? ((BasicType) _type).type == this.type : false; } diff --git a/src/main/java/org/apache/bcel/generic/BranchHandle.java b/src/main/java/org/apache/bcel/generic/BranchHandle.java index 4ff423ec..bec1bda1 100644 --- a/src/main/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/main/java/org/apache/bcel/generic/BranchHandle.java @@ -58,6 +58,7 @@ public final class BranchHandle extends InstructionHandle { /** Handle adds itself to the list of resuable handles. */ + @Override protected void addHandle() { next = bh_list; bh_list = this; @@ -68,16 +69,19 @@ public final class BranchHandle extends InstructionHandle { * Through this overriding all access to the private i_position field should * be prevented. */ + @Override public int getPosition() { return bi.position; } + @Override void setPosition( int pos ) { i_position = bi.position = pos; } + @Override protected int updatePosition( int offset, int max_offset ) { int x = bi.updatePosition(offset, max_offset); i_position = bi.position; @@ -112,6 +116,7 @@ public final class BranchHandle extends InstructionHandle { /** * Set new contents. Old instruction is disposed and may not be used anymore. */ + @Override public void setInstruction( Instruction i ) { super.setInstruction(i); if (!(i instanceof BranchInstruction)) { diff --git a/src/main/java/org/apache/bcel/generic/BranchInstruction.java b/src/main/java/org/apache/bcel/generic/BranchInstruction.java index ca8ee261..f16d298d 100644 --- a/src/main/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/main/java/org/apache/bcel/generic/BranchInstruction.java @@ -60,6 +60,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); index = getTargetOffset(); @@ -123,6 +124,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @param verbose long/short format switch * @return mnemonic for instruction */ + @Override public String toString( boolean verbose ) { String s = super.toString(verbose); String t = "null"; @@ -154,6 +156,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @param wide wide prefix? * @see InstructionList */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { length = 3; index = bytes.readShort(); @@ -224,6 +227,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi /** * Inform target that it's not targeted anymore. */ + @Override void dispose() { setTarget(null); index = -1; diff --git a/src/main/java/org/apache/bcel/generic/CALOAD.java b/src/main/java/org/apache/bcel/generic/CALOAD.java index abd06252..6f5d8f23 100644 --- a/src/main/java/org/apache/bcel/generic/CALOAD.java +++ b/src/main/java/org/apache/bcel/generic/CALOAD.java @@ -44,6 +44,7 @@ public class CALOAD extends ArrayInstruction implements StackProducer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/CASTORE.java b/src/main/java/org/apache/bcel/generic/CASTORE.java index 09b63351..a1c8ff36 100644 --- a/src/main/java/org/apache/bcel/generic/CASTORE.java +++ b/src/main/java/org/apache/bcel/generic/CASTORE.java @@ -44,6 +44,7 @@ public class CASTORE extends ArrayInstruction implements StackConsumer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/CHECKCAST.java b/src/main/java/org/apache/bcel/generic/CHECKCAST.java index db157f14..33afdd70 100644 --- a/src/main/java/org/apache/bcel/generic/CHECKCAST.java +++ b/src/main/java/org/apache/bcel/generic/CHECKCAST.java @@ -76,6 +76,7 @@ public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThro * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitLoadClass(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/CPInstruction.java b/src/main/java/org/apache/bcel/generic/CPInstruction.java index 98c6806f..2f623b5e 100644 --- a/src/main/java/org/apache/bcel/generic/CPInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CPInstruction.java @@ -63,6 +63,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); out.writeShort(index); @@ -78,6 +79,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct * @param verbose long/short format switch * @return mnemonic for instruction */ + @Override public String toString( boolean verbose ) { return super.toString(verbose) + " " + index; } @@ -86,6 +88,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct /** * @return mnemonic for instruction with symbolic references resolved */ + @Override public String toString( ConstantPool cp ) { Constant c = cp.getConstant(index); String str = cp.constantToString(c); @@ -101,6 +104,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct * @param bytes input stream * @param wide wide prefix? */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { setIndex(bytes.readUnsignedShort()); length = 3; diff --git a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java index bde38bc5..25af238d 100644 --- a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java @@ -49,7 +49,8 @@ public class ClassElementValueGen extends ElementValueGen /** * Return immutable variant of this ClassElementValueGen */ - public ElementValue getElementValue() + @Override + public ElementValue getElementValue() { return new ClassElementValue(type, idx, cpGen.getConstantPool()); } @@ -84,12 +85,14 @@ public class ClassElementValueGen extends ElementValueGen // return utf8.getBytes(); } - public String stringifyValue() + @Override + public String stringifyValue() { return getClassString(); } - public void dump(DataOutputStream dos) throws IOException + @Override + public void dump(DataOutputStream dos) throws IOException { dos.writeByte(type); // u1 kind of value dos.writeShort(idx); diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 0db6fc55..471dca56 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -559,6 +559,7 @@ public class ClassGen extends AccessFlags implements Cloneable { } + @Override public Object clone() { try { return super.clone(); @@ -592,6 +593,7 @@ public class ClassGen extends AccessFlags implements Cloneable { * * @see java.lang.Object#equals(java.lang.Object) */ + @Override public boolean equals( Object obj ) { return _cmp.equals(this, obj); } @@ -603,6 +605,7 @@ public class ClassGen extends AccessFlags implements Cloneable { * * @see java.lang.Object#hashCode() */ + @Override public int hashCode() { return _cmp.hashCode(this); } diff --git a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java index 4d4a51f5..e3f91af4 100644 --- a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -170,11 +170,13 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable, j } + @Override public String toString() { return "CodeExceptionGen(" + start_pc + ", " + end_pc + ", " + handler_pc + ")"; } + @Override public Object clone() { try { return super.clone(); diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index a2998f5d..283155f5 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -716,6 +716,7 @@ public class ConstantPoolGen implements java.io.Serializable { /** * @return String representation. */ + @Override public String toString() { StringBuffer buf = new StringBuffer(); for (int i = 1; i < index; i++) { diff --git a/src/main/java/org/apache/bcel/generic/D2F.java b/src/main/java/org/apache/bcel/generic/D2F.java index ba124017..6a30de78 100644 --- a/src/main/java/org/apache/bcel/generic/D2F.java +++ b/src/main/java/org/apache/bcel/generic/D2F.java @@ -44,6 +44,7 @@ public class D2F extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/D2I.java b/src/main/java/org/apache/bcel/generic/D2I.java index 0f599db1..ae392e6d 100644 --- a/src/main/java/org/apache/bcel/generic/D2I.java +++ b/src/main/java/org/apache/bcel/generic/D2I.java @@ -44,6 +44,7 @@ public class D2I extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/D2L.java b/src/main/java/org/apache/bcel/generic/D2L.java index a4a15b12..f2795df7 100644 --- a/src/main/java/org/apache/bcel/generic/D2L.java +++ b/src/main/java/org/apache/bcel/generic/D2L.java @@ -44,6 +44,7 @@ public class D2L extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/DADD.java b/src/main/java/org/apache/bcel/generic/DADD.java index 2f5cf1c9..4909ea7c 100644 --- a/src/main/java/org/apache/bcel/generic/DADD.java +++ b/src/main/java/org/apache/bcel/generic/DADD.java @@ -45,6 +45,7 @@ public class DADD extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/DALOAD.java b/src/main/java/org/apache/bcel/generic/DALOAD.java index 6704cafb..ecc4c932 100644 --- a/src/main/java/org/apache/bcel/generic/DALOAD.java +++ b/src/main/java/org/apache/bcel/generic/DALOAD.java @@ -44,6 +44,7 @@ public class DALOAD extends ArrayInstruction implements StackProducer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/DASTORE.java b/src/main/java/org/apache/bcel/generic/DASTORE.java index b3765e07..9d9ab7aa 100644 --- a/src/main/java/org/apache/bcel/generic/DASTORE.java +++ b/src/main/java/org/apache/bcel/generic/DASTORE.java @@ -44,6 +44,7 @@ public class DASTORE extends ArrayInstruction implements StackConsumer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/DCMPG.java b/src/main/java/org/apache/bcel/generic/DCMPG.java index 3910805d..281a3e41 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPG.java +++ b/src/main/java/org/apache/bcel/generic/DCMPG.java @@ -50,6 +50,7 @@ public class DCMPG extends Instruction implements TypedInstruction, StackProduce * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/DCMPL.java b/src/main/java/org/apache/bcel/generic/DCMPL.java index cd680552..5d70e035 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPL.java +++ b/src/main/java/org/apache/bcel/generic/DCMPL.java @@ -50,6 +50,7 @@ public class DCMPL extends Instruction implements TypedInstruction, StackProduce * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/DCONST.java b/src/main/java/org/apache/bcel/generic/DCONST.java index d43757e3..97334988 100644 --- a/src/main/java/org/apache/bcel/generic/DCONST.java +++ b/src/main/java/org/apache/bcel/generic/DCONST.java @@ -72,6 +72,7 @@ public class DCONST extends Instruction implements ConstantPushInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitPushInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/DDIV.java b/src/main/java/org/apache/bcel/generic/DDIV.java index d0ec2091..052b5032 100644 --- a/src/main/java/org/apache/bcel/generic/DDIV.java +++ b/src/main/java/org/apache/bcel/generic/DDIV.java @@ -45,6 +45,7 @@ public class DDIV extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/DLOAD.java b/src/main/java/org/apache/bcel/generic/DLOAD.java index 4db5f152..93d85483 100644 --- a/src/main/java/org/apache/bcel/generic/DLOAD.java +++ b/src/main/java/org/apache/bcel/generic/DLOAD.java @@ -54,6 +54,7 @@ public class DLOAD extends LoadInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { super.accept(v); v.visitDLOAD(this); diff --git a/src/main/java/org/apache/bcel/generic/DMUL.java b/src/main/java/org/apache/bcel/generic/DMUL.java index 2edbbe6b..1d6ca34f 100644 --- a/src/main/java/org/apache/bcel/generic/DMUL.java +++ b/src/main/java/org/apache/bcel/generic/DMUL.java @@ -45,6 +45,7 @@ public class DMUL extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/DNEG.java b/src/main/java/org/apache/bcel/generic/DNEG.java index cabed969..cb8535f9 100644 --- a/src/main/java/org/apache/bcel/generic/DNEG.java +++ b/src/main/java/org/apache/bcel/generic/DNEG.java @@ -42,6 +42,7 @@ public class DNEG extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/DREM.java b/src/main/java/org/apache/bcel/generic/DREM.java index 9101cedc..e63dbc51 100644 --- a/src/main/java/org/apache/bcel/generic/DREM.java +++ b/src/main/java/org/apache/bcel/generic/DREM.java @@ -45,6 +45,7 @@ public class DREM extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/DRETURN.java b/src/main/java/org/apache/bcel/generic/DRETURN.java index 4ad9c688..1cdfa92d 100644 --- a/src/main/java/org/apache/bcel/generic/DRETURN.java +++ b/src/main/java/org/apache/bcel/generic/DRETURN.java @@ -44,6 +44,7 @@ public class DRETURN extends ReturnInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/DSTORE.java b/src/main/java/org/apache/bcel/generic/DSTORE.java index aa5c6ea8..c7a2dd7c 100644 --- a/src/main/java/org/apache/bcel/generic/DSTORE.java +++ b/src/main/java/org/apache/bcel/generic/DSTORE.java @@ -54,6 +54,7 @@ public class DSTORE extends StoreInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { super.accept(v); v.visitDSTORE(this); diff --git a/src/main/java/org/apache/bcel/generic/DSUB.java b/src/main/java/org/apache/bcel/generic/DSUB.java index 59e3d2d2..3e3e894f 100644 --- a/src/main/java/org/apache/bcel/generic/DSUB.java +++ b/src/main/java/org/apache/bcel/generic/DSUB.java @@ -45,6 +45,7 @@ public class DSUB extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/DUP.java b/src/main/java/org/apache/bcel/generic/DUP.java index 35cca40b..d2515137 100644 --- a/src/main/java/org/apache/bcel/generic/DUP.java +++ b/src/main/java/org/apache/bcel/generic/DUP.java @@ -42,6 +42,7 @@ public class DUP extends StackInstruction implements PushInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/DUP2.java b/src/main/java/org/apache/bcel/generic/DUP2.java index 263f9918..9da9b775 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2.java +++ b/src/main/java/org/apache/bcel/generic/DUP2.java @@ -42,6 +42,7 @@ public class DUP2 extends StackInstruction implements PushInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X1.java b/src/main/java/org/apache/bcel/generic/DUP2_X1.java index cd22a97c..3640dfaf 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X1.java +++ b/src/main/java/org/apache/bcel/generic/DUP2_X1.java @@ -42,6 +42,7 @@ public class DUP2_X1 extends StackInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackInstruction(this); v.visitDUP2_X1(this); diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X2.java b/src/main/java/org/apache/bcel/generic/DUP2_X2.java index c6caacf7..233d42cf 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X2.java +++ b/src/main/java/org/apache/bcel/generic/DUP2_X2.java @@ -42,6 +42,7 @@ public class DUP2_X2 extends StackInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackInstruction(this); v.visitDUP2_X2(this); diff --git a/src/main/java/org/apache/bcel/generic/DUP_X1.java b/src/main/java/org/apache/bcel/generic/DUP_X1.java index e307198b..5d76b95b 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X1.java +++ b/src/main/java/org/apache/bcel/generic/DUP_X1.java @@ -42,6 +42,7 @@ public class DUP_X1 extends StackInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackInstruction(this); v.visitDUP_X1(this); diff --git a/src/main/java/org/apache/bcel/generic/DUP_X2.java b/src/main/java/org/apache/bcel/generic/DUP_X2.java index e7db2296..aacd6ab0 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X2.java +++ b/src/main/java/org/apache/bcel/generic/DUP_X2.java @@ -42,6 +42,7 @@ public class DUP_X2 extends StackInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackInstruction(this); v.visitDUP_X2(this); diff --git a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java index 78166ee2..5c57549d 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java @@ -102,7 +102,8 @@ public class ElementValuePairGen return value; } - public String toString() + @Override + public String toString() { return "ElementValuePair:[" + getNameString() + "=" + value.stringifyValue() + "]"; diff --git a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java index bd8342ac..64024631 100644 --- a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java @@ -49,7 +49,8 @@ public class EnumElementValueGen extends ElementValueGen /** * Return immutable variant of this EnumElementValue */ - public ElementValue getElementValue() + @Override + public ElementValue getElementValue() { System.err.println("Duplicating value: " + getEnumTypeString() + ":" + getEnumValueString()); @@ -82,14 +83,16 @@ public class EnumElementValueGen extends ElementValueGen } } - public void dump(DataOutputStream dos) throws IOException + @Override + public void dump(DataOutputStream dos) throws IOException { dos.writeByte(type); // u1 type of value (ENUM_CONSTANT == 'e') dos.writeShort(typeIdx); // u2 dos.writeShort(valueIdx); // u2 } - public String stringifyValue() + @Override + public String stringifyValue() { ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant( valueIdx); diff --git a/src/main/java/org/apache/bcel/generic/F2D.java b/src/main/java/org/apache/bcel/generic/F2D.java index e74d44aa..1d13dc8d 100644 --- a/src/main/java/org/apache/bcel/generic/F2D.java +++ b/src/main/java/org/apache/bcel/generic/F2D.java @@ -44,6 +44,7 @@ public class F2D extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/F2I.java b/src/main/java/org/apache/bcel/generic/F2I.java index ff6cd237..75f83ab3 100644 --- a/src/main/java/org/apache/bcel/generic/F2I.java +++ b/src/main/java/org/apache/bcel/generic/F2I.java @@ -44,6 +44,7 @@ public class F2I extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/F2L.java b/src/main/java/org/apache/bcel/generic/F2L.java index 3cbb586c..661e3b99 100644 --- a/src/main/java/org/apache/bcel/generic/F2L.java +++ b/src/main/java/org/apache/bcel/generic/F2L.java @@ -44,6 +44,7 @@ public class F2L extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/FADD.java b/src/main/java/org/apache/bcel/generic/FADD.java index d79478aa..caf64541 100644 --- a/src/main/java/org/apache/bcel/generic/FADD.java +++ b/src/main/java/org/apache/bcel/generic/FADD.java @@ -44,6 +44,7 @@ public class FADD extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/FALOAD.java b/src/main/java/org/apache/bcel/generic/FALOAD.java index 18559980..303ec640 100644 --- a/src/main/java/org/apache/bcel/generic/FALOAD.java +++ b/src/main/java/org/apache/bcel/generic/FALOAD.java @@ -44,6 +44,7 @@ public class FALOAD extends ArrayInstruction implements StackProducer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/FASTORE.java b/src/main/java/org/apache/bcel/generic/FASTORE.java index b716e44d..b604ab8c 100644 --- a/src/main/java/org/apache/bcel/generic/FASTORE.java +++ b/src/main/java/org/apache/bcel/generic/FASTORE.java @@ -44,6 +44,7 @@ public class FASTORE extends ArrayInstruction implements StackConsumer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/FCMPG.java b/src/main/java/org/apache/bcel/generic/FCMPG.java index 78aed169..84a710c9 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPG.java +++ b/src/main/java/org/apache/bcel/generic/FCMPG.java @@ -49,6 +49,7 @@ public class FCMPG extends Instruction implements TypedInstruction, StackProduce * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/FCMPL.java b/src/main/java/org/apache/bcel/generic/FCMPL.java index a5df0ec9..ae04403f 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPL.java +++ b/src/main/java/org/apache/bcel/generic/FCMPL.java @@ -49,6 +49,7 @@ public class FCMPL extends Instruction implements TypedInstruction, StackProduce * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/FCONST.java b/src/main/java/org/apache/bcel/generic/FCONST.java index d4da1bd3..dc0bb128 100644 --- a/src/main/java/org/apache/bcel/generic/FCONST.java +++ b/src/main/java/org/apache/bcel/generic/FCONST.java @@ -74,6 +74,7 @@ public class FCONST extends Instruction implements ConstantPushInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitPushInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/FDIV.java b/src/main/java/org/apache/bcel/generic/FDIV.java index e0377cda..4f64ca04 100644 --- a/src/main/java/org/apache/bcel/generic/FDIV.java +++ b/src/main/java/org/apache/bcel/generic/FDIV.java @@ -44,6 +44,7 @@ public class FDIV extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/FLOAD.java b/src/main/java/org/apache/bcel/generic/FLOAD.java index d7547602..90a24fb0 100644 --- a/src/main/java/org/apache/bcel/generic/FLOAD.java +++ b/src/main/java/org/apache/bcel/generic/FLOAD.java @@ -54,6 +54,7 @@ public class FLOAD extends LoadInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { super.accept(v); v.visitFLOAD(this); diff --git a/src/main/java/org/apache/bcel/generic/FMUL.java b/src/main/java/org/apache/bcel/generic/FMUL.java index f6b83641..95c125b3 100644 --- a/src/main/java/org/apache/bcel/generic/FMUL.java +++ b/src/main/java/org/apache/bcel/generic/FMUL.java @@ -44,6 +44,7 @@ public class FMUL extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/FNEG.java b/src/main/java/org/apache/bcel/generic/FNEG.java index aa2d94b5..780ab690 100644 --- a/src/main/java/org/apache/bcel/generic/FNEG.java +++ b/src/main/java/org/apache/bcel/generic/FNEG.java @@ -42,6 +42,7 @@ public class FNEG extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/FREM.java b/src/main/java/org/apache/bcel/generic/FREM.java index 7135e72a..97e58e08 100644 --- a/src/main/java/org/apache/bcel/generic/FREM.java +++ b/src/main/java/org/apache/bcel/generic/FREM.java @@ -44,6 +44,7 @@ public class FREM extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/FRETURN.java b/src/main/java/org/apache/bcel/generic/FRETURN.java index ee08293a..1159f2eb 100644 --- a/src/main/java/org/apache/bcel/generic/FRETURN.java +++ b/src/main/java/org/apache/bcel/generic/FRETURN.java @@ -44,6 +44,7 @@ public class FRETURN extends ReturnInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/FSTORE.java b/src/main/java/org/apache/bcel/generic/FSTORE.java index 22c6120d..e22d35af 100644 --- a/src/main/java/org/apache/bcel/generic/FSTORE.java +++ b/src/main/java/org/apache/bcel/generic/FSTORE.java @@ -54,6 +54,7 @@ public class FSTORE extends StoreInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { super.accept(v); v.visitFSTORE(this); diff --git a/src/main/java/org/apache/bcel/generic/FSUB.java b/src/main/java/org/apache/bcel/generic/FSUB.java index 3c74d7fe..0d0536f7 100644 --- a/src/main/java/org/apache/bcel/generic/FSUB.java +++ b/src/main/java/org/apache/bcel/generic/FSUB.java @@ -44,6 +44,7 @@ public class FSUB extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index f4de87ce..d7c2e912 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -256,6 +256,7 @@ public class FieldGen extends FieldGenOrMethodGen { } + @Override public String getSignature() { return type.getSignature(); } @@ -310,6 +311,7 @@ public class FieldGen extends FieldGenOrMethodGen { * * @return String representation of field */ + @Override public final String toString() { String name, signature, access; // Short cuts to constant pool access = Utility.accessToString(access_flags); @@ -358,6 +360,7 @@ public class FieldGen extends FieldGenOrMethodGen { * * @see java.lang.Object#equals(java.lang.Object) */ + @Override public boolean equals( Object obj ) { return _cmp.equals(this, obj); } @@ -369,6 +372,7 @@ public class FieldGen extends FieldGenOrMethodGen { * * @see java.lang.Object#hashCode() */ + @Override public int hashCode() { return _cmp.hashCode(this); } diff --git a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 1208244c..c5ddb07e 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -144,6 +144,7 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn public abstract String getSignature(); + @Override public Object clone() { try { return super.clone(); diff --git a/src/main/java/org/apache/bcel/generic/FieldInstruction.java b/src/main/java/org/apache/bcel/generic/FieldInstruction.java index 73215ecb..3ffb87d8 100644 --- a/src/main/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/main/java/org/apache/bcel/generic/FieldInstruction.java @@ -49,6 +49,7 @@ public abstract class FieldInstruction extends FieldOrMethod { /** * @return mnemonic for instruction with symbolic references resolved */ + @Override public String toString( ConstantPool cp ) { return org.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " + cp.constantToString(index, org.apache.bcel.Constants.CONSTANT_Fieldref); @@ -64,6 +65,7 @@ public abstract class FieldInstruction extends FieldOrMethod { /** @return return type of referenced field */ + @Override public Type getType( ConstantPoolGen cpg ) { return getFieldType(cpg); } diff --git a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java index 1d3adcbf..790f639e 100644 --- a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java @@ -79,6 +79,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { * the getReferenceType() method, which correctly distinguishes * between class types and array types. */ + @Deprecated public String getClassName( ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); ConstantCP cmr = (ConstantCP) cp.getConstant(index); @@ -97,6 +98,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { * the ObjectType returned will be invalid. Use * getReferenceType() instead. */ + @Deprecated public ObjectType getClassType( ConstantPoolGen cpg ) { return new ObjectType(getClassName(cpg)); } diff --git a/src/main/java/org/apache/bcel/generic/GETFIELD.java b/src/main/java/org/apache/bcel/generic/GETFIELD.java index 6d5cc25f..ad062734 100644 --- a/src/main/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/main/java/org/apache/bcel/generic/GETFIELD.java @@ -48,6 +48,7 @@ public class GETFIELD extends FieldInstruction implements ExceptionThrower, Stac } + @Override public int produceStack( ConstantPoolGen cpg ) { return getFieldSize(cpg); } @@ -71,6 +72,7 @@ public class GETFIELD extends FieldInstruction implements ExceptionThrower, Stac * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/bcel/generic/GETSTATIC.java b/src/main/java/org/apache/bcel/generic/GETSTATIC.java index bf88f08c..189f2fa6 100644 --- a/src/main/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/GETSTATIC.java @@ -47,6 +47,7 @@ public class GETSTATIC extends FieldInstruction implements PushInstruction, Exce } + @Override public int produceStack( ConstantPoolGen cpg ) { return getFieldSize(cpg); } @@ -69,6 +70,7 @@ public class GETSTATIC extends FieldInstruction implements PushInstruction, Exce * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/GOTO.java b/src/main/java/org/apache/bcel/generic/GOTO.java index c56f1b38..3f203e91 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO.java +++ b/src/main/java/org/apache/bcel/generic/GOTO.java @@ -48,6 +48,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { index = getTargetOffset(); if (opcode == org.apache.bcel.Constants.GOTO) { @@ -63,6 +64,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { /** Called in pass 2 of InstructionList.setPositions() in order to update * the branch target, that may shift due to variable length instructions. */ + @Override protected int updatePosition( int offset, int max_offset ) { int i = getTargetOffset(); // Depending on old position value position += offset; // Position may be shifted by preceding expansions @@ -84,6 +86,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitVariableLengthInstruction(this); v.visitUnconditionalBranch(this); diff --git a/src/main/java/org/apache/bcel/generic/GOTO_W.java b/src/main/java/org/apache/bcel/generic/GOTO_W.java index b4a5b0d8..09c54b7e 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO_W.java +++ b/src/main/java/org/apache/bcel/generic/GOTO_W.java @@ -50,6 +50,7 @@ public class GOTO_W extends GotoInstruction { * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { index = getTargetOffset(); out.writeByte(opcode); @@ -60,6 +61,7 @@ public class GOTO_W extends GotoInstruction { /** * Read needed data (e.g. index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { index = bytes.readInt(); length = 5; @@ -74,6 +76,7 @@ public class GOTO_W extends GotoInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitUnconditionalBranch(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/I2B.java b/src/main/java/org/apache/bcel/generic/I2B.java index c1416437..fe6d71f6 100644 --- a/src/main/java/org/apache/bcel/generic/I2B.java +++ b/src/main/java/org/apache/bcel/generic/I2B.java @@ -44,6 +44,7 @@ public class I2B extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/I2C.java b/src/main/java/org/apache/bcel/generic/I2C.java index e7b2ec46..a4ea9ac9 100644 --- a/src/main/java/org/apache/bcel/generic/I2C.java +++ b/src/main/java/org/apache/bcel/generic/I2C.java @@ -44,6 +44,7 @@ public class I2C extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/I2D.java b/src/main/java/org/apache/bcel/generic/I2D.java index 617d196d..8741c304 100644 --- a/src/main/java/org/apache/bcel/generic/I2D.java +++ b/src/main/java/org/apache/bcel/generic/I2D.java @@ -44,6 +44,7 @@ public class I2D extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/I2F.java b/src/main/java/org/apache/bcel/generic/I2F.java index 90676c48..386da4b8 100644 --- a/src/main/java/org/apache/bcel/generic/I2F.java +++ b/src/main/java/org/apache/bcel/generic/I2F.java @@ -44,6 +44,7 @@ public class I2F extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/I2L.java b/src/main/java/org/apache/bcel/generic/I2L.java index 61fa17e0..e43cd2a3 100644 --- a/src/main/java/org/apache/bcel/generic/I2L.java +++ b/src/main/java/org/apache/bcel/generic/I2L.java @@ -44,6 +44,7 @@ public class I2L extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/I2S.java b/src/main/java/org/apache/bcel/generic/I2S.java index 8116e6a5..373372d5 100644 --- a/src/main/java/org/apache/bcel/generic/I2S.java +++ b/src/main/java/org/apache/bcel/generic/I2S.java @@ -42,6 +42,7 @@ public class I2S extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/IADD.java b/src/main/java/org/apache/bcel/generic/IADD.java index 13f48b84..97f1e423 100644 --- a/src/main/java/org/apache/bcel/generic/IADD.java +++ b/src/main/java/org/apache/bcel/generic/IADD.java @@ -44,6 +44,7 @@ public class IADD extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/IALOAD.java b/src/main/java/org/apache/bcel/generic/IALOAD.java index 050030d3..d32538b6 100644 --- a/src/main/java/org/apache/bcel/generic/IALOAD.java +++ b/src/main/java/org/apache/bcel/generic/IALOAD.java @@ -45,6 +45,7 @@ public class IALOAD extends ArrayInstruction implements StackProducer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/IAND.java b/src/main/java/org/apache/bcel/generic/IAND.java index 61825e52..fdf2e2eb 100644 --- a/src/main/java/org/apache/bcel/generic/IAND.java +++ b/src/main/java/org/apache/bcel/generic/IAND.java @@ -42,6 +42,7 @@ public class IAND extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/IASTORE.java b/src/main/java/org/apache/bcel/generic/IASTORE.java index d274ee5d..95c2dbb2 100644 --- a/src/main/java/org/apache/bcel/generic/IASTORE.java +++ b/src/main/java/org/apache/bcel/generic/IASTORE.java @@ -45,6 +45,7 @@ public class IASTORE extends ArrayInstruction implements StackConsumer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/ICONST.java b/src/main/java/org/apache/bcel/generic/ICONST.java index d3ee2948..375c2957 100644 --- a/src/main/java/org/apache/bcel/generic/ICONST.java +++ b/src/main/java/org/apache/bcel/generic/ICONST.java @@ -70,6 +70,7 @@ public class ICONST extends Instruction implements ConstantPushInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitPushInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/IDIV.java b/src/main/java/org/apache/bcel/generic/IDIV.java index 94f28a7d..44b5eac8 100644 --- a/src/main/java/org/apache/bcel/generic/IDIV.java +++ b/src/main/java/org/apache/bcel/generic/IDIV.java @@ -53,6 +53,7 @@ public class IDIV extends ArithmeticInstruction implements ExceptionThrower { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IFEQ.java b/src/main/java/org/apache/bcel/generic/IFEQ.java index a53acc19..2f5aa870 100644 --- a/src/main/java/org/apache/bcel/generic/IFEQ.java +++ b/src/main/java/org/apache/bcel/generic/IFEQ.java @@ -46,6 +46,7 @@ public class IFEQ extends IfInstruction { /** * @return negation of instruction, e.g. IFEQ.negate() == IFNE */ + @Override public IfInstruction negate() { return new IFNE(target); } @@ -59,6 +60,7 @@ public class IFEQ extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IFGE.java b/src/main/java/org/apache/bcel/generic/IFGE.java index ab7ab353..35ce5ade 100644 --- a/src/main/java/org/apache/bcel/generic/IFGE.java +++ b/src/main/java/org/apache/bcel/generic/IFGE.java @@ -46,6 +46,7 @@ public class IFGE extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IFLT(target); } @@ -59,6 +60,7 @@ public class IFGE extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IFGT.java b/src/main/java/org/apache/bcel/generic/IFGT.java index f7360ed0..d20b7117 100644 --- a/src/main/java/org/apache/bcel/generic/IFGT.java +++ b/src/main/java/org/apache/bcel/generic/IFGT.java @@ -46,6 +46,7 @@ public class IFGT extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IFLE(target); } @@ -59,6 +60,7 @@ public class IFGT extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IFLE.java b/src/main/java/org/apache/bcel/generic/IFLE.java index 7f6f23c7..6b1dfda8 100644 --- a/src/main/java/org/apache/bcel/generic/IFLE.java +++ b/src/main/java/org/apache/bcel/generic/IFLE.java @@ -46,6 +46,7 @@ public class IFLE extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IFGT(target); } @@ -59,6 +60,7 @@ public class IFLE extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IFLT.java b/src/main/java/org/apache/bcel/generic/IFLT.java index dcfbdc1b..159a0b65 100644 --- a/src/main/java/org/apache/bcel/generic/IFLT.java +++ b/src/main/java/org/apache/bcel/generic/IFLT.java @@ -46,6 +46,7 @@ public class IFLT extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IFGE(target); } @@ -59,6 +60,7 @@ public class IFLT extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IFNE.java b/src/main/java/org/apache/bcel/generic/IFNE.java index 947d40d7..dd687a8a 100644 --- a/src/main/java/org/apache/bcel/generic/IFNE.java +++ b/src/main/java/org/apache/bcel/generic/IFNE.java @@ -46,6 +46,7 @@ public class IFNE extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IFEQ(target); } @@ -59,6 +60,7 @@ public class IFNE extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IFNONNULL.java b/src/main/java/org/apache/bcel/generic/IFNONNULL.java index 17483975..84f2e5b3 100644 --- a/src/main/java/org/apache/bcel/generic/IFNONNULL.java +++ b/src/main/java/org/apache/bcel/generic/IFNONNULL.java @@ -46,6 +46,7 @@ public class IFNONNULL extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IFNULL(target); } @@ -59,6 +60,7 @@ public class IFNONNULL extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IFNULL.java b/src/main/java/org/apache/bcel/generic/IFNULL.java index 9bac51cb..b495a273 100644 --- a/src/main/java/org/apache/bcel/generic/IFNULL.java +++ b/src/main/java/org/apache/bcel/generic/IFNULL.java @@ -46,6 +46,7 @@ public class IFNULL extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IFNONNULL(target); } @@ -59,6 +60,7 @@ public class IFNULL extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java index 322a8dd8..a2432b49 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java +++ b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java @@ -46,6 +46,7 @@ public class IF_ACMPEQ extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IF_ACMPNE(target); } @@ -59,6 +60,7 @@ public class IF_ACMPEQ extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java index b880a074..6ed0786a 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java @@ -46,6 +46,7 @@ public class IF_ACMPNE extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IF_ACMPEQ(target); } @@ -59,6 +60,7 @@ public class IF_ACMPNE extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java index 0c66aee8..e4c2bdb7 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java @@ -46,6 +46,7 @@ public class IF_ICMPEQ extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IF_ICMPNE(target); } @@ -59,6 +60,7 @@ public class IF_ICMPEQ extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java index ad57fd56..f608af99 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java @@ -46,6 +46,7 @@ public class IF_ICMPGE extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IF_ICMPLT(target); } @@ -59,6 +60,7 @@ public class IF_ICMPGE extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java index 92cd2d96..637563cc 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java @@ -46,6 +46,7 @@ public class IF_ICMPGT extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IF_ICMPLE(target); } @@ -59,6 +60,7 @@ public class IF_ICMPGT extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java index fb1bd066..f2320a7c 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java @@ -46,6 +46,7 @@ public class IF_ICMPLE extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IF_ICMPGT(target); } @@ -59,6 +60,7 @@ public class IF_ICMPLE extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java index 5156adb5..9a86eb7e 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java @@ -46,6 +46,7 @@ public class IF_ICMPLT extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IF_ICMPGE(target); } @@ -59,6 +60,7 @@ public class IF_ICMPLT extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java index cf978c2c..3a224f08 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java @@ -46,6 +46,7 @@ public class IF_ICMPNE extends IfInstruction { /** * @return negation of instruction */ + @Override public IfInstruction negate() { return new IF_ICMPEQ(target); } @@ -59,6 +60,7 @@ public class IF_ICMPNE extends IfInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IINC.java b/src/main/java/org/apache/bcel/generic/IINC.java index 599cfe57..e0c5909f 100644 --- a/src/main/java/org/apache/bcel/generic/IINC.java +++ b/src/main/java/org/apache/bcel/generic/IINC.java @@ -59,6 +59,7 @@ public class IINC extends LocalVariableInstruction { * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { if (wide) { out.writeByte(org.apache.bcel.Constants.WIDE); @@ -87,6 +88,7 @@ public class IINC extends LocalVariableInstruction { /** * Read needed data (e.g. index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { this.wide = wide; if (wide) { @@ -104,6 +106,7 @@ public class IINC extends LocalVariableInstruction { /** * @return mnemonic for instruction */ + @Override public String toString( boolean verbose ) { return super.toString(verbose) + " " + c; } @@ -112,6 +115,7 @@ public class IINC extends LocalVariableInstruction { /** * Set index of local variable. */ + @Override public final void setIndex( int n ) { if (n < 0) { throw new ClassGenException("Negative index value: " + n); @@ -140,6 +144,7 @@ public class IINC extends LocalVariableInstruction { /** @return int type */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.INT; } @@ -153,6 +158,7 @@ public class IINC extends LocalVariableInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitLocalVariableInstruction(this); v.visitIINC(this); diff --git a/src/main/java/org/apache/bcel/generic/ILOAD.java b/src/main/java/org/apache/bcel/generic/ILOAD.java index dfafcde5..657c730d 100644 --- a/src/main/java/org/apache/bcel/generic/ILOAD.java +++ b/src/main/java/org/apache/bcel/generic/ILOAD.java @@ -54,6 +54,7 @@ public class ILOAD extends LoadInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { super.accept(v); v.visitILOAD(this); diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP1.java b/src/main/java/org/apache/bcel/generic/IMPDEP1.java index bf1a7dfe..e583259c 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP1.java +++ b/src/main/java/org/apache/bcel/generic/IMPDEP1.java @@ -41,6 +41,7 @@ public class IMPDEP1 extends Instruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitIMPDEP1(this); } diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP2.java b/src/main/java/org/apache/bcel/generic/IMPDEP2.java index 1451fbd0..4e6921ba 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP2.java +++ b/src/main/java/org/apache/bcel/generic/IMPDEP2.java @@ -41,6 +41,7 @@ public class IMPDEP2 extends Instruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitIMPDEP2(this); } diff --git a/src/main/java/org/apache/bcel/generic/IMUL.java b/src/main/java/org/apache/bcel/generic/IMUL.java index ebce18c2..85cb7b25 100644 --- a/src/main/java/org/apache/bcel/generic/IMUL.java +++ b/src/main/java/org/apache/bcel/generic/IMUL.java @@ -44,6 +44,7 @@ public class IMUL extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/INEG.java b/src/main/java/org/apache/bcel/generic/INEG.java index b177a749..4f724da3 100644 --- a/src/main/java/org/apache/bcel/generic/INEG.java +++ b/src/main/java/org/apache/bcel/generic/INEG.java @@ -42,6 +42,7 @@ public class INEG extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java index ef1c710e..1ab2f2c0 100644 --- a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java +++ b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java @@ -65,6 +65,7 @@ public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThr * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitLoadClass(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java index f8409385..8b0bef00 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -59,6 +59,7 @@ public final class INVOKEINTERFACE extends InvokeInstruction { * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); out.writeShort(index); @@ -79,6 +80,7 @@ public final class INVOKEINTERFACE extends InvokeInstruction { /** * Read needed data (i.e., index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { super.initFromFile(bytes, wide); length = 5; @@ -90,11 +92,13 @@ public final class INVOKEINTERFACE extends InvokeInstruction { /** * @return mnemonic for instruction with symbolic references resolved */ + @Override public String toString( ConstantPool cp ) { return super.toString(cp) + " " + nargs; } + @Override public int consumeStack( ConstantPoolGen cpg ) { // nargs is given in byte-code return nargs; // nargs includes this reference } @@ -120,6 +124,7 @@ public final class INVOKEINTERFACE extends InvokeInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java index 1ef97c1a..08e234d6 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -67,6 +67,7 @@ public class INVOKESPECIAL extends InvokeInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java index 9557d0c7..75c66101 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -64,6 +64,7 @@ public class INVOKESTATIC extends InvokeInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java index bf9acb15..90854966 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -66,6 +66,7 @@ public class INVOKEVIRTUAL extends InvokeInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IOR.java b/src/main/java/org/apache/bcel/generic/IOR.java index db21eb0f..48b60e45 100644 --- a/src/main/java/org/apache/bcel/generic/IOR.java +++ b/src/main/java/org/apache/bcel/generic/IOR.java @@ -42,6 +42,7 @@ public class IOR extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/IREM.java b/src/main/java/org/apache/bcel/generic/IREM.java index 8ddcc698..91c5e68f 100644 --- a/src/main/java/org/apache/bcel/generic/IREM.java +++ b/src/main/java/org/apache/bcel/generic/IREM.java @@ -53,6 +53,7 @@ public class IREM extends ArithmeticInstruction implements ExceptionThrower { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/IRETURN.java b/src/main/java/org/apache/bcel/generic/IRETURN.java index 6f373001..2e669a37 100644 --- a/src/main/java/org/apache/bcel/generic/IRETURN.java +++ b/src/main/java/org/apache/bcel/generic/IRETURN.java @@ -44,6 +44,7 @@ public class IRETURN extends ReturnInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/ISHL.java b/src/main/java/org/apache/bcel/generic/ISHL.java index 5a28bd98..d1894df5 100644 --- a/src/main/java/org/apache/bcel/generic/ISHL.java +++ b/src/main/java/org/apache/bcel/generic/ISHL.java @@ -42,6 +42,7 @@ public class ISHL extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/ISHR.java b/src/main/java/org/apache/bcel/generic/ISHR.java index 43f535e0..2056ab2d 100644 --- a/src/main/java/org/apache/bcel/generic/ISHR.java +++ b/src/main/java/org/apache/bcel/generic/ISHR.java @@ -42,6 +42,7 @@ public class ISHR extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/ISTORE.java b/src/main/java/org/apache/bcel/generic/ISTORE.java index 1fd264da..1d671112 100644 --- a/src/main/java/org/apache/bcel/generic/ISTORE.java +++ b/src/main/java/org/apache/bcel/generic/ISTORE.java @@ -54,6 +54,7 @@ public class ISTORE extends StoreInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { super.accept(v); v.visitISTORE(this); diff --git a/src/main/java/org/apache/bcel/generic/ISUB.java b/src/main/java/org/apache/bcel/generic/ISUB.java index dd0f021f..5e7714ce 100644 --- a/src/main/java/org/apache/bcel/generic/ISUB.java +++ b/src/main/java/org/apache/bcel/generic/ISUB.java @@ -44,6 +44,7 @@ public class ISUB extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/IUSHR.java b/src/main/java/org/apache/bcel/generic/IUSHR.java index 0c7ff66f..e94da14a 100644 --- a/src/main/java/org/apache/bcel/generic/IUSHR.java +++ b/src/main/java/org/apache/bcel/generic/IUSHR.java @@ -42,6 +42,7 @@ public class IUSHR extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/IXOR.java b/src/main/java/org/apache/bcel/generic/IXOR.java index 76c9cd6c..c6c13712 100644 --- a/src/main/java/org/apache/bcel/generic/IXOR.java +++ b/src/main/java/org/apache/bcel/generic/IXOR.java @@ -42,6 +42,7 @@ public class IXOR extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index 65b2fb58..54fe9992 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -89,6 +89,7 @@ public abstract class Instruction implements Cloneable, Serializable { /** * @return mnemonic for instruction in verbose format */ + @Override public String toString() { return toString(true); } @@ -529,6 +530,7 @@ public abstract class Instruction implements Cloneable, Serializable { * @return currently used comparator for equals() * @deprecated use the built in comparator, or wrap this class in another object that implements these methods */ + @Deprecated public static InstructionComparator getComparator() { return cmp; } @@ -537,6 +539,7 @@ public abstract class Instruction implements Cloneable, Serializable { /** Set comparator to be used for equals(). * @deprecated use the built in comparator, or wrap this class in another object that implements these methods */ + @Deprecated public static void setComparator( InstructionComparator c ) { cmp = c; } @@ -545,6 +548,7 @@ public abstract class Instruction implements Cloneable, Serializable { /** Check for equality, delegated to comparator * @return true if that is an Instruction and has the same opcode */ + @Override public boolean equals( Object that ) { return (that instanceof Instruction) ? cmp.equals(this, (Instruction) that) : false; } diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java index bdff0db5..bdc41e3f 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/main/java/org/apache/bcel/generic/InstructionHandle.java @@ -231,6 +231,7 @@ public class InstructionHandle implements java.io.Serializable { /** @return a string representation of the contained instruction. */ + @Override public String toString() { return toString(true); } diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 32c940de..864ac639 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -976,6 +976,7 @@ public class InstructionList implements Serializable { } + @Override public String toString() { return toString(true); } diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index 61fb7f07..89eeb301 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -53,6 +53,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti /** * @return mnemonic for instruction with symbolic references resolved */ + @Override public String toString( ConstantPool cp ) { Constant c = cp.getConstant(index); StringTokenizer tok = new StringTokenizer(cp.constantToString(c)); @@ -66,6 +67,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti * constant pool entry they reference. * @return Number of words consumed from stack by this instruction */ + @Override public int consumeStack( ConstantPoolGen cpg ) { int sum; if (opcode == Constants.INVOKESTATIC) { @@ -85,6 +87,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti * constant pool entry they reference. * @return Number of words produced onto stack by this instruction */ + @Override public int produceStack( ConstantPoolGen cpg ) { String signature = getSignature(cpg); return Type.getReturnTypeSize(signature); @@ -93,6 +96,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti /** @return return type of referenced method. */ + @Override public Type getType( ConstantPoolGen cpg ) { return getReturnType(cpg); } diff --git a/src/main/java/org/apache/bcel/generic/JSR.java b/src/main/java/org/apache/bcel/generic/JSR.java index 2106df9d..fc1bea6b 100644 --- a/src/main/java/org/apache/bcel/generic/JSR.java +++ b/src/main/java/org/apache/bcel/generic/JSR.java @@ -48,6 +48,7 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { index = getTargetOffset(); if (opcode == org.apache.bcel.Constants.JSR) { @@ -60,6 +61,7 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { } + @Override protected int updatePosition( int offset, int max_offset ) { int i = getTargetOffset(); // Depending on old position value position += offset; // Position may be shifted by preceding expansions @@ -81,6 +83,7 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitVariableLengthInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/JSR_W.java b/src/main/java/org/apache/bcel/generic/JSR_W.java index e8f70a17..fd769d20 100644 --- a/src/main/java/org/apache/bcel/generic/JSR_W.java +++ b/src/main/java/org/apache/bcel/generic/JSR_W.java @@ -50,6 +50,7 @@ public class JSR_W extends JsrInstruction { * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { index = getTargetOffset(); out.writeByte(opcode); @@ -60,6 +61,7 @@ public class JSR_W extends JsrInstruction { /** * Read needed data (e.g. index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { index = bytes.readInt(); length = 5; @@ -74,6 +76,7 @@ public class JSR_W extends JsrInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/L2D.java b/src/main/java/org/apache/bcel/generic/L2D.java index f424c528..126b2f1c 100644 --- a/src/main/java/org/apache/bcel/generic/L2D.java +++ b/src/main/java/org/apache/bcel/generic/L2D.java @@ -42,6 +42,7 @@ public class L2D extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/L2F.java b/src/main/java/org/apache/bcel/generic/L2F.java index e588bd23..0e1289c3 100644 --- a/src/main/java/org/apache/bcel/generic/L2F.java +++ b/src/main/java/org/apache/bcel/generic/L2F.java @@ -42,6 +42,7 @@ public class L2F extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/L2I.java b/src/main/java/org/apache/bcel/generic/L2I.java index bdfaad19..736f2f20 100644 --- a/src/main/java/org/apache/bcel/generic/L2I.java +++ b/src/main/java/org/apache/bcel/generic/L2I.java @@ -42,6 +42,7 @@ public class L2I extends ConversionInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LADD.java b/src/main/java/org/apache/bcel/generic/LADD.java index 09d750e0..94399f6d 100644 --- a/src/main/java/org/apache/bcel/generic/LADD.java +++ b/src/main/java/org/apache/bcel/generic/LADD.java @@ -43,6 +43,7 @@ public class LADD extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LALOAD.java b/src/main/java/org/apache/bcel/generic/LALOAD.java index 999975bb..3218e421 100644 --- a/src/main/java/org/apache/bcel/generic/LALOAD.java +++ b/src/main/java/org/apache/bcel/generic/LALOAD.java @@ -44,6 +44,7 @@ public class LALOAD extends ArrayInstruction implements StackProducer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/LAND.java b/src/main/java/org/apache/bcel/generic/LAND.java index 96959e9a..437c55c9 100644 --- a/src/main/java/org/apache/bcel/generic/LAND.java +++ b/src/main/java/org/apache/bcel/generic/LAND.java @@ -43,6 +43,7 @@ public class LAND extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LASTORE.java b/src/main/java/org/apache/bcel/generic/LASTORE.java index 6d33678e..804464f1 100644 --- a/src/main/java/org/apache/bcel/generic/LASTORE.java +++ b/src/main/java/org/apache/bcel/generic/LASTORE.java @@ -44,6 +44,7 @@ public class LASTORE extends ArrayInstruction implements StackConsumer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/LCMP.java b/src/main/java/org/apache/bcel/generic/LCMP.java index 1b165a84..634c590e 100644 --- a/src/main/java/org/apache/bcel/generic/LCMP.java +++ b/src/main/java/org/apache/bcel/generic/LCMP.java @@ -50,6 +50,7 @@ public class LCMP extends Instruction implements TypedInstruction, StackProducer * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LCONST.java b/src/main/java/org/apache/bcel/generic/LCONST.java index 0acb1389..38bc78b7 100644 --- a/src/main/java/org/apache/bcel/generic/LCONST.java +++ b/src/main/java/org/apache/bcel/generic/LCONST.java @@ -72,6 +72,7 @@ public class LCONST extends Instruction implements ConstantPushInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitPushInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java index bb07c027..bc65acfa 100644 --- a/src/main/java/org/apache/bcel/generic/LDC.java +++ b/src/main/java/org/apache/bcel/generic/LDC.java @@ -65,6 +65,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); if (length == 2) { @@ -78,6 +79,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro /** * Set the index to constant pool and adjust size. */ + @Override public final void setIndex( int index ) { super.setIndex(index); setSize(); @@ -87,6 +89,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro /** * Read needed data (e.g. index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { length = 2; index = bytes.readUnsignedByte(); @@ -114,6 +117,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro } + @Override public Type getType( ConstantPoolGen cpg ) { switch (cpg.getConstantPool().getConstant(index).getTag()) { case org.apache.bcel.Constants.CONSTANT_String: @@ -143,6 +147,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/LDC2_W.java b/src/main/java/org/apache/bcel/generic/LDC2_W.java index 5b8172d2..d63df71c 100644 --- a/src/main/java/org/apache/bcel/generic/LDC2_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC2_W.java @@ -43,6 +43,7 @@ public class LDC2_W extends CPInstruction implements PushInstruction { } + @Override public Type getType( ConstantPoolGen cpg ) { switch (cpg.getConstantPool().getConstant(index).getTag()) { case org.apache.bcel.Constants.CONSTANT_Long: @@ -76,6 +77,7 @@ public class LDC2_W extends CPInstruction implements PushInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/LDC_W.java b/src/main/java/org/apache/bcel/generic/LDC_W.java index 1290c38b..b5acd694 100644 --- a/src/main/java/org/apache/bcel/generic/LDC_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC_W.java @@ -49,6 +49,7 @@ public class LDC_W extends LDC { /** * Read needed data (i.e., index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { setIndex(bytes.readUnsignedShort()); // Override just in case it has been changed diff --git a/src/main/java/org/apache/bcel/generic/LDIV.java b/src/main/java/org/apache/bcel/generic/LDIV.java index 7e9a3c56..1218025c 100644 --- a/src/main/java/org/apache/bcel/generic/LDIV.java +++ b/src/main/java/org/apache/bcel/generic/LDIV.java @@ -50,6 +50,7 @@ public class LDIV extends ArithmeticInstruction implements ExceptionThrower { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/LLOAD.java b/src/main/java/org/apache/bcel/generic/LLOAD.java index 2c6f5f79..fb0e9edb 100644 --- a/src/main/java/org/apache/bcel/generic/LLOAD.java +++ b/src/main/java/org/apache/bcel/generic/LLOAD.java @@ -51,6 +51,7 @@ public class LLOAD extends LoadInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { super.accept(v); v.visitLLOAD(this); diff --git a/src/main/java/org/apache/bcel/generic/LMUL.java b/src/main/java/org/apache/bcel/generic/LMUL.java index dd3e65f8..78484037 100644 --- a/src/main/java/org/apache/bcel/generic/LMUL.java +++ b/src/main/java/org/apache/bcel/generic/LMUL.java @@ -43,6 +43,7 @@ public class LMUL extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LNEG.java b/src/main/java/org/apache/bcel/generic/LNEG.java index 1089d040..f3e7e3cd 100644 --- a/src/main/java/org/apache/bcel/generic/LNEG.java +++ b/src/main/java/org/apache/bcel/generic/LNEG.java @@ -42,6 +42,7 @@ public class LNEG extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java index 482bd18b..93a48788 100644 --- a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java +++ b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java @@ -53,6 +53,7 @@ public class LOOKUPSWITCH extends Select { * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { super.dump(out); out.writeInt(match_length); // npairs @@ -66,6 +67,7 @@ public class LOOKUPSWITCH extends Select { /** * Read needed data (e.g. index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { super.initFromFile(bytes, wide); // reads padding match_length = bytes.readInt(); @@ -89,6 +91,7 @@ public class LOOKUPSWITCH extends Select { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitVariableLengthInstruction(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/bcel/generic/LOR.java b/src/main/java/org/apache/bcel/generic/LOR.java index 93ee97aa..6ed3cb4e 100644 --- a/src/main/java/org/apache/bcel/generic/LOR.java +++ b/src/main/java/org/apache/bcel/generic/LOR.java @@ -42,6 +42,7 @@ public class LOR extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LREM.java b/src/main/java/org/apache/bcel/generic/LREM.java index 6b4da3f8..63c8d2af 100644 --- a/src/main/java/org/apache/bcel/generic/LREM.java +++ b/src/main/java/org/apache/bcel/generic/LREM.java @@ -49,6 +49,7 @@ public class LREM extends ArithmeticInstruction implements ExceptionThrower { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/LRETURN.java b/src/main/java/org/apache/bcel/generic/LRETURN.java index 43fc646d..0c259256 100644 --- a/src/main/java/org/apache/bcel/generic/LRETURN.java +++ b/src/main/java/org/apache/bcel/generic/LRETURN.java @@ -42,6 +42,7 @@ public class LRETURN extends ReturnInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/LSHL.java b/src/main/java/org/apache/bcel/generic/LSHL.java index db46ea63..f294d56d 100644 --- a/src/main/java/org/apache/bcel/generic/LSHL.java +++ b/src/main/java/org/apache/bcel/generic/LSHL.java @@ -42,6 +42,7 @@ public class LSHL extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LSHR.java b/src/main/java/org/apache/bcel/generic/LSHR.java index f18302b4..1d90d42b 100644 --- a/src/main/java/org/apache/bcel/generic/LSHR.java +++ b/src/main/java/org/apache/bcel/generic/LSHR.java @@ -42,6 +42,7 @@ public class LSHR extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LSTORE.java b/src/main/java/org/apache/bcel/generic/LSTORE.java index 22752ab8..b636e920 100644 --- a/src/main/java/org/apache/bcel/generic/LSTORE.java +++ b/src/main/java/org/apache/bcel/generic/LSTORE.java @@ -51,6 +51,7 @@ public class LSTORE extends StoreInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { super.accept(v); v.visitLSTORE(this); diff --git a/src/main/java/org/apache/bcel/generic/LSUB.java b/src/main/java/org/apache/bcel/generic/LSUB.java index 15fa4a46..fde82932 100644 --- a/src/main/java/org/apache/bcel/generic/LSUB.java +++ b/src/main/java/org/apache/bcel/generic/LSUB.java @@ -43,6 +43,7 @@ public class LSUB extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LUSHR.java b/src/main/java/org/apache/bcel/generic/LUSHR.java index f11f498e..1204454a 100644 --- a/src/main/java/org/apache/bcel/generic/LUSHR.java +++ b/src/main/java/org/apache/bcel/generic/LUSHR.java @@ -42,6 +42,7 @@ public class LUSHR extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LXOR.java b/src/main/java/org/apache/bcel/generic/LXOR.java index 43ddbb95..52e93a01 100644 --- a/src/main/java/org/apache/bcel/generic/LXOR.java +++ b/src/main/java/org/apache/bcel/generic/LXOR.java @@ -42,6 +42,7 @@ public class LXOR extends ArithmeticInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/LineNumberGen.java b/src/main/java/org/apache/bcel/generic/LineNumberGen.java index ba051b16..237ba7ac 100644 --- a/src/main/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/main/java/org/apache/bcel/generic/LineNumberGen.java @@ -84,6 +84,7 @@ public class LineNumberGen implements InstructionTargeter, Cloneable, java.io.Se } + @Override public Object clone() { try { return super.clone(); diff --git a/src/main/java/org/apache/bcel/generic/LoadInstruction.java b/src/main/java/org/apache/bcel/generic/LoadInstruction.java index 8d5d9f54..451e65d5 100644 --- a/src/main/java/org/apache/bcel/generic/LoadInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LoadInstruction.java @@ -57,6 +57,7 @@ public abstract class LoadInstruction extends LocalVariableInstruction implement * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java index 4e8f7539..26467219 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java @@ -174,6 +174,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo /** @return a hash code value for the object. */ + @Override public int hashCode() { //If the user changes the name or type, problems with the targeter hashmap will occur int hc = index ^ name.hashCode() ^ type.hashCode(); @@ -185,6 +186,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo * We consider to local variables to be equal, if the use the same index and * are valid in the same range. */ + @Override public boolean equals( Object o ) { if (!(o instanceof LocalVariableGen)) { return false; @@ -194,11 +196,13 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo } + @Override public String toString() { return "LocalVariableGen(" + name + ", " + type + ", " + start + ", " + end + ")"; } + @Override public Object clone() { try { return super.clone(); diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java index b8567b57..2c675cda 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -79,6 +79,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { if (wide()) { out.writeByte(Constants.WIDE); @@ -103,6 +104,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty * @param verbose long/short format switch * @return mnemonic for instruction */ + @Override public String toString( boolean verbose ) { if (((opcode >= Constants.ILOAD_0) && (opcode <= Constants.ALOAD_3)) || ((opcode >= Constants.ISTORE_0) && (opcode <= Constants.ASTORE_3))) { @@ -117,6 +119,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty * Read needed data (e.g. index) from file. * PRE: (ILOAD <= tag <= ALOAD_3) || (ISTORE <= tag <= ASTORE_3) */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { if (wide) { n = bytes.readUnsignedShort(); diff --git a/src/main/java/org/apache/bcel/generic/MONITORENTER.java b/src/main/java/org/apache/bcel/generic/MONITORENTER.java index 9a2f43d6..bf3db034 100644 --- a/src/main/java/org/apache/bcel/generic/MONITORENTER.java +++ b/src/main/java/org/apache/bcel/generic/MONITORENTER.java @@ -49,6 +49,7 @@ public class MONITORENTER extends Instruction implements ExceptionThrower, Stack * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java index 773b7509..f5d89f96 100644 --- a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java +++ b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java @@ -49,6 +49,7 @@ public class MONITOREXIT extends Instruction implements ExceptionThrower, StackC * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java index 831b3a13..a4f520af 100644 --- a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java @@ -59,6 +59,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); out.writeShort(index); @@ -69,6 +70,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati /** * Read needed data (i.e., no. dimension) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { super.initFromFile(bytes, wide); dimensions = bytes.readByte(); @@ -87,6 +89,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati /** * @return mnemonic for instruction */ + @Override public String toString( boolean verbose ) { return super.toString(verbose) + " " + index + " " + dimensions; } @@ -95,6 +98,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati /** * @return mnemonic for instruction with symbolic references resolved */ + @Override public String toString( ConstantPool cp ) { return super.toString(cp) + " " + dimensions; } @@ -105,6 +109,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati * constant pool entry they reference. * @return Number of words consumed from stack by this instruction */ + @Override public int consumeStack( ConstantPoolGen cpg ) { return dimensions; } @@ -137,6 +142,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitLoadClass(this); v.visitAllocationInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index ec2635f2..90b4c4a7 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -856,6 +856,7 @@ public class MethodGen extends FieldGenOrMethodGen { } + @Override public String getSignature() { return Type.getMethodSignature(type, arg_types); } @@ -1073,6 +1074,7 @@ public class MethodGen extends FieldGenOrMethodGen { * * @return String representation of the method. */ + @Override public final String toString() { String access = Utility.accessToString(access_flags); String signature = Type.getMethodSignature(type, arg_types); @@ -1230,6 +1232,7 @@ public class MethodGen extends FieldGenOrMethodGen { * * @see java.lang.Object#equals(java.lang.Object) */ + @Override public boolean equals( Object obj ) { return _cmp.equals(this, obj); } @@ -1241,6 +1244,7 @@ public class MethodGen extends FieldGenOrMethodGen { * * @see java.lang.Object#hashCode() */ + @Override public int hashCode() { return _cmp.hashCode(this); } diff --git a/src/main/java/org/apache/bcel/generic/NEW.java b/src/main/java/org/apache/bcel/generic/NEW.java index 377d771d..46abc86b 100644 --- a/src/main/java/org/apache/bcel/generic/NEW.java +++ b/src/main/java/org/apache/bcel/generic/NEW.java @@ -68,6 +68,7 @@ public class NEW extends CPInstruction implements LoadClass, AllocationInstructi * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitLoadClass(this); v.visitAllocationInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/NEWARRAY.java b/src/main/java/org/apache/bcel/generic/NEWARRAY.java index f3e336f8..992d6f94 100644 --- a/src/main/java/org/apache/bcel/generic/NEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/NEWARRAY.java @@ -59,6 +59,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); out.writeByte(type); @@ -84,6 +85,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce /** * @return mnemonic for instruction */ + @Override public String toString( boolean verbose ) { return super.toString(verbose) + " " + org.apache.bcel.Constants.TYPE_NAMES[type]; } @@ -92,6 +94,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce /** * Read needed data (e.g. index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { type = bytes.readByte(); length = 2; @@ -113,6 +116,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitAllocationInstruction(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/NOP.java b/src/main/java/org/apache/bcel/generic/NOP.java index 473a709e..b93d0adb 100644 --- a/src/main/java/org/apache/bcel/generic/NOP.java +++ b/src/main/java/org/apache/bcel/generic/NOP.java @@ -41,6 +41,7 @@ public class NOP extends Instruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitNOP(this); } diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index 9bf64bc4..32bd7b72 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -51,6 +51,7 @@ public class ObjectType extends ReferenceType { /** @return a hash code value for the object. */ + @Override public int hashCode() { return class_name.hashCode(); } @@ -58,6 +59,7 @@ public class ObjectType extends ReferenceType { /** @return true if both type objects refer to the same class. */ + @Override public boolean equals( Object type ) { return (type instanceof ObjectType) ? ((ObjectType) type).class_name.equals(class_name) @@ -72,6 +74,7 @@ public class ObjectType extends ReferenceType { * if the class or interface referenced cannot * be found: use referencesClassExact() instead */ + @Deprecated public boolean referencesClass() { try { JavaClass jc = Repository.lookupClass(class_name); @@ -89,6 +92,7 @@ public class ObjectType extends ReferenceType { * if the class or interface referenced cannot * be found: use referencesInterfaceExact() instead */ + @Deprecated public boolean referencesInterface() { try { JavaClass jc = Repository.lookupClass(class_name); diff --git a/src/main/java/org/apache/bcel/generic/POP.java b/src/main/java/org/apache/bcel/generic/POP.java index 03dde652..d23874e9 100644 --- a/src/main/java/org/apache/bcel/generic/POP.java +++ b/src/main/java/org/apache/bcel/generic/POP.java @@ -43,6 +43,7 @@ public class POP extends StackInstruction implements PopInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitPopInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/POP2.java b/src/main/java/org/apache/bcel/generic/POP2.java index 0dab36c0..31a5b917 100644 --- a/src/main/java/org/apache/bcel/generic/POP2.java +++ b/src/main/java/org/apache/bcel/generic/POP2.java @@ -43,6 +43,7 @@ public class POP2 extends StackInstruction implements PopInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitPopInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/PUSH.java b/src/main/java/org/apache/bcel/generic/PUSH.java index bceda8aa..16a89ff6 100644 --- a/src/main/java/org/apache/bcel/generic/PUSH.java +++ b/src/main/java/org/apache/bcel/generic/PUSH.java @@ -185,6 +185,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio /** * @return mnemonic for instruction */ + @Override public String toString() { return instruction.toString() + " (PUSH)"; } diff --git a/src/main/java/org/apache/bcel/generic/PUTFIELD.java b/src/main/java/org/apache/bcel/generic/PUTFIELD.java index e0bb6886..ca238e04 100644 --- a/src/main/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/main/java/org/apache/bcel/generic/PUTFIELD.java @@ -47,6 +47,7 @@ public class PUTFIELD extends FieldInstruction implements PopInstruction, Except } + @Override public int consumeStack( ConstantPoolGen cpg ) { return getFieldSize(cpg) + 1; } @@ -70,6 +71,7 @@ public class PUTFIELD extends FieldInstruction implements PopInstruction, Except * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java index 51ac8170..94d6a5f8 100644 --- a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java @@ -47,6 +47,7 @@ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, Pop } + @Override public int consumeStack( ConstantPoolGen cpg ) { return getFieldSize(cpg); } @@ -69,6 +70,7 @@ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, Pop * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/bcel/generic/RET.java b/src/main/java/org/apache/bcel/generic/RET.java index aac97c49..976e6cbd 100644 --- a/src/main/java/org/apache/bcel/generic/RET.java +++ b/src/main/java/org/apache/bcel/generic/RET.java @@ -54,6 +54,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { if (wide) { out.writeByte(org.apache.bcel.Constants.WIDE); @@ -80,6 +81,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc /** * Read needed data (e.g. index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { this.wide = wide; if (wide) { @@ -115,6 +117,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc /** * @return mnemonic for instruction */ + @Override public String toString( boolean verbose ) { return super.toString(verbose) + " " + index; } @@ -135,6 +138,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitRET(this); } diff --git a/src/main/java/org/apache/bcel/generic/RETURN.java b/src/main/java/org/apache/bcel/generic/RETURN.java index 97f0268f..ab73c1ad 100644 --- a/src/main/java/org/apache/bcel/generic/RETURN.java +++ b/src/main/java/org/apache/bcel/generic/RETURN.java @@ -42,6 +42,7 @@ public class RETURN extends ReturnInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/ReferenceType.java b/src/main/java/org/apache/bcel/generic/ReferenceType.java index be256caf..43e9ff4a 100644 --- a/src/main/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/main/java/org/apache/bcel/generic/ReferenceType.java @@ -278,6 +278,7 @@ public abstract class ReferenceType extends Type { * @throws ClassNotFoundException on failure to find superclasses of this * type, or the type passed as a parameter */ + @Deprecated public ReferenceType firstCommonSuperclass( ReferenceType t ) throws ClassNotFoundException { if (this.equals(Type.NULL)) { return t; diff --git a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java index a44408b9..83a9be0c 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java @@ -52,6 +52,7 @@ public class ReturnaddressType extends Type { /** @return a hash code value for the object. */ + @Override public int hashCode() { if (returnTarget == null) { return 0; @@ -63,6 +64,7 @@ public class ReturnaddressType extends Type { /** * Returns if the two Returnaddresses refer to the same target. */ + @Override public boolean equals( Object rat ) { if (!(rat instanceof ReturnaddressType)) { return false; diff --git a/src/main/java/org/apache/bcel/generic/SALOAD.java b/src/main/java/org/apache/bcel/generic/SALOAD.java index 451e6fba..3953a307 100644 --- a/src/main/java/org/apache/bcel/generic/SALOAD.java +++ b/src/main/java/org/apache/bcel/generic/SALOAD.java @@ -42,6 +42,7 @@ public class SALOAD extends ArrayInstruction implements StackProducer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/SASTORE.java b/src/main/java/org/apache/bcel/generic/SASTORE.java index aa4c21e1..50b7097e 100644 --- a/src/main/java/org/apache/bcel/generic/SASTORE.java +++ b/src/main/java/org/apache/bcel/generic/SASTORE.java @@ -42,6 +42,7 @@ public class SASTORE extends ArrayInstruction implements StackConsumer { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/bcel/generic/SIPUSH.java b/src/main/java/org/apache/bcel/generic/SIPUSH.java index 35ab8839..8bddec1f 100644 --- a/src/main/java/org/apache/bcel/generic/SIPUSH.java +++ b/src/main/java/org/apache/bcel/generic/SIPUSH.java @@ -52,6 +52,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { /** * Dump instruction as short code to stream out. */ + @Override public void dump( DataOutputStream out ) throws IOException { super.dump(out); out.writeShort(b); @@ -61,6 +62,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { /** * @return mnemonic for instruction */ + @Override public String toString( boolean verbose ) { return super.toString(verbose) + " " + b; } @@ -69,6 +71,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { /** * Read needed data (e.g. index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { length = 3; b = bytes.readShort(); @@ -95,6 +98,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitPushInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/SWAP.java b/src/main/java/org/apache/bcel/generic/SWAP.java index 848c661e..e99b7b60 100644 --- a/src/main/java/org/apache/bcel/generic/SWAP.java +++ b/src/main/java/org/apache/bcel/generic/SWAP.java @@ -42,6 +42,7 @@ public class SWAP extends StackInstruction implements StackConsumer, StackProduc * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index 08001deb..e419ee19 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -87,6 +87,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @param max_offset the maximum offset that may be caused by these instructions * @return additional offset caused by possible change of this instruction's length */ + @Override protected int updatePosition( int offset, int max_offset ) { position += offset; // Additional offset caused by preceding SWITCHs, GOTOs, etc. short old_length = length; @@ -102,6 +103,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); for (int i = 0; i < padding; i++) { @@ -115,6 +117,7 @@ public abstract class Select extends BranchInstruction implements VariableLength /** * Read needed data (e.g. index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { padding = (4 - (bytes.getIndex() % 4)) % 4; // Compute number of pad bytes for (int i = 0; i < padding; i++) { @@ -128,6 +131,7 @@ public abstract class Select extends BranchInstruction implements VariableLength /** * @return mnemonic for instruction */ + @Override public String toString( boolean verbose ) { StringBuffer buf = new StringBuffer(super.toString(verbose)); if (verbose) { @@ -159,6 +163,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @param old_ih old target * @param new_ih new target */ + @Override public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { boolean targeted = false; if (target == old_ih) { @@ -180,6 +185,7 @@ public abstract class Select extends BranchInstruction implements VariableLength /** * @return true, if ih is target of this instruction */ + @Override public boolean containsTarget( InstructionHandle ih ) { if (target == ih) { return true; @@ -193,6 +199,7 @@ public abstract class Select extends BranchInstruction implements VariableLength } + @Override protected Object clone() throws CloneNotSupportedException { Select copy = (Select) super.clone(); copy.match = match.clone(); @@ -205,6 +212,7 @@ public abstract class Select extends BranchInstruction implements VariableLength /** * Inform targets that they're not targeted anymore. */ + @Override void dispose() { super.dispose(); for (int i = 0; i < targets.length; i++) { diff --git a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java index d4887602..8fd1ecef 100644 --- a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java @@ -167,7 +167,8 @@ public class SimpleElementValueGen extends ElementValueGen /** * Return immutable variant */ - public ElementValue getElementValue() + @Override + public ElementValue getElementValue() { return new SimpleElementValue(type, idx, cpGen.getConstantPool()); } @@ -196,7 +197,8 @@ public class SimpleElementValueGen extends ElementValueGen } // Whatever kind of value it is, return it as a string - public String stringifyValue() + @Override + public String stringifyValue() { switch (type) { @@ -237,7 +239,8 @@ public class SimpleElementValueGen extends ElementValueGen } } - public void dump(DataOutputStream dos) throws IOException + @Override + public void dump(DataOutputStream dos) throws IOException { dos.writeByte(type); // u1 kind of value switch (type) diff --git a/src/main/java/org/apache/bcel/generic/StoreInstruction.java b/src/main/java/org/apache/bcel/generic/StoreInstruction.java index d8b9f175..a8fa43a1 100644 --- a/src/main/java/org/apache/bcel/generic/StoreInstruction.java +++ b/src/main/java/org/apache/bcel/generic/StoreInstruction.java @@ -57,6 +57,7 @@ public abstract class StoreInstruction extends LocalVariableInstruction implemen * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackConsumer(this); v.visitPopInstruction(this); diff --git a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java index d81da8c1..d11d6a8b 100644 --- a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java @@ -59,6 +59,7 @@ public class TABLESWITCH extends Select { * Dump instruction as byte code to stream out. * @param out Output stream */ + @Override public void dump( DataOutputStream out ) throws IOException { super.dump(out); int low = (match_length > 0) ? match[0] : 0; @@ -74,6 +75,7 @@ public class TABLESWITCH extends Select { /** * Read needed data (e.g. index) from file. */ + @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { super.initFromFile(bytes, wide); int low = bytes.readInt(); @@ -99,6 +101,7 @@ public class TABLESWITCH extends Select { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitVariableLengthInstruction(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 4b90b746..98b669b9 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -72,6 +72,7 @@ public abstract class Type implements java.io.Serializable { /** * @return hashcode of Type */ + @Override public int hashCode() { return type ^ signature.hashCode(); } @@ -80,6 +81,7 @@ public abstract class Type implements java.io.Serializable { /** * @return whether the Types are equal */ + @Override public boolean equals(Object o) { if (o instanceof Type) { Type t = (Type)o; @@ -124,6 +126,7 @@ public abstract class Type implements java.io.Serializable { /** * @return Type string, e.g. `int[]' */ + @Override public String toString() { return ((this.equals(Type.NULL) || (type >= Constants.T_UNKNOWN))) ? signature : Utility .signatureToString(signature, false); @@ -151,6 +154,7 @@ public abstract class Type implements java.io.Serializable { private static final ThreadLocal consumed_chars = new ThreadLocal() { + @Override protected Integer initialValue() { return Integer.valueOf(0); } diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index 3f2988bb..474bd18e 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -119,6 +119,7 @@ class BCELFactory extends EmptyVisitor { } + @Override public void visitLocalVariableInstruction( LocalVariableInstruction i ) { short opcode = i.getOpcode(); Type type = i.getType(_cp); @@ -133,6 +134,7 @@ class BCELFactory extends EmptyVisitor { } + @Override public void visitArrayInstruction( ArrayInstruction i ) { short opcode = i.getOpcode(); Type type = i.getType(_cp); @@ -142,6 +144,7 @@ class BCELFactory extends EmptyVisitor { } + @Override public void visitFieldInstruction( FieldInstruction i ) { short opcode = i.getOpcode(); String class_name = i.getClassName(_cp); @@ -153,6 +156,7 @@ class BCELFactory extends EmptyVisitor { } + @Override public void visitInvokeInstruction( InvokeInstruction i ) { short opcode = i.getOpcode(); String class_name = i.getClassName(_cp); @@ -166,6 +170,7 @@ class BCELFactory extends EmptyVisitor { } + @Override public void visitAllocationInstruction( AllocationInstruction i ) { Type type; if (i instanceof CPInstruction) { @@ -216,33 +221,39 @@ class BCELFactory extends EmptyVisitor { } + @Override public void visitLDC( LDC i ) { createConstant(i.getValue(_cp)); } + @Override public void visitLDC2_W( LDC2_W i ) { createConstant(i.getValue(_cp)); } + @Override public void visitConstantPushInstruction( ConstantPushInstruction i ) { createConstant(i.getValue()); } + @Override public void visitINSTANCEOF( INSTANCEOF i ) { Type type = i.getType(_cp); _out.println("il.append(new INSTANCEOF(_cp.addClass(" + BCELifier.printType(type) + ")));"); } + @Override public void visitCHECKCAST( CHECKCAST i ) { Type type = i.getType(_cp); _out.println("il.append(_factory.createCheckCast(" + BCELifier.printType(type) + "));"); } + @Override public void visitReturnInstruction( ReturnInstruction i ) { Type type = i.getType(_cp); _out.println("il.append(_factory.createReturn(" + BCELifier.printType(type) + "));"); @@ -252,6 +263,7 @@ class BCELFactory extends EmptyVisitor { private final List branches = new ArrayList(); + @Override public void visitBranchInstruction( BranchInstruction bi ) { BranchHandle bh = (BranchHandle) branch_map.get(bi); int pos = bh.getPosition(); @@ -298,6 +310,7 @@ class BCELFactory extends EmptyVisitor { } + @Override public void visitRET( RET i ) { _out.println("il.append(new RET(" + i.getIndex() + ")));"); } diff --git a/src/main/java/org/apache/bcel/util/BCELifier.java b/src/main/java/org/apache/bcel/util/BCELifier.java index 44c1da8c..1efca2ff 100644 --- a/src/main/java/org/apache/bcel/util/BCELifier.java +++ b/src/main/java/org/apache/bcel/util/BCELifier.java @@ -71,6 +71,7 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { } + @Override public void visitJavaClass( JavaClass clazz ) { String class_name = clazz.getClassName(); String super_name = clazz.getSuperclassName(); @@ -150,6 +151,7 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { } + @Override public void visitField( Field field ) { _out.println(); _out.println(" field = new FieldGen(" + printFlags(field.getAccessFlags()) + ", " @@ -163,6 +165,7 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { } + @Override public void visitMethod( Method method ) { MethodGen mg = new MethodGen(method, _clazz.getClassName(), _cp); Type result_type = mg.getReturnType(); diff --git a/src/main/java/org/apache/bcel/util/ClassLoader.java b/src/main/java/org/apache/bcel/util/ClassLoader.java index 8a4c7990..52f53d02 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoader.java +++ b/src/main/java/org/apache/bcel/util/ClassLoader.java @@ -95,7 +95,7 @@ public class ClassLoader extends java.lang.ClassLoader { this.repository = new ClassLoaderRepository(deferTo); } - + @Override protected Class loadClass( String class_name, boolean resolve ) throws ClassNotFoundException { Class cl = null; /* First try: lookup hash table. diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index e7c5f9e9..4b95565d 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -90,6 +90,7 @@ public class ClassPath implements Serializable { * Search for classes in CLASSPATH. * @deprecated Use SYSTEM_CLASS_PATH constant */ + @Deprecated public ClassPath() { this(getClassPath()); } @@ -97,6 +98,7 @@ public class ClassPath implements Serializable { /** @return used class path string */ + @Override public String toString() { if (parent != null) { return parent.toString() + File.pathSeparator + class_path; @@ -104,6 +106,7 @@ public class ClassPath implements Serializable { return class_path; } + @Override public int hashCode() { if (parent != null) { return class_path.hashCode() + parent.hashCode(); @@ -112,6 +115,7 @@ public class ClassPath implements Serializable { } + @Override public boolean equals( Object o ) { if (o instanceof ClassPath) { ClassPath cp = (ClassPath)o; @@ -399,6 +403,7 @@ public class ClassPath implements Serializable { dir = d; } + @Override URL getResource(String name) { // Resource specification uses '/' whatever the platform final File file = new File(dir + File.separatorChar + name.replace('/', File.separatorChar)); @@ -409,6 +414,7 @@ public class ClassPath implements Serializable { } } + @Override InputStream getResourceAsStream(String name) { // Resource specification uses '/' whatever the platform final File file = new File(dir + File.separatorChar + name.replace('/', File.separatorChar)); @@ -419,6 +425,7 @@ public class ClassPath implements Serializable { } } + @Override ClassFile getClassFile( String name, String suffix ) throws IOException { final File file = new File(dir + File.separatorChar + name.replace('.', File.separatorChar) + suffix); @@ -455,6 +462,7 @@ public class ClassPath implements Serializable { } + @Override public String toString() { return dir; } @@ -470,6 +478,7 @@ public class ClassPath implements Serializable { zip = z; } + @Override URL getResource(String name) { final ZipEntry entry = zip.getEntry(name); try { @@ -479,6 +488,7 @@ public class ClassPath implements Serializable { } } + @Override InputStream getResourceAsStream(String name) { final ZipEntry entry = zip.getEntry(name); try { @@ -488,6 +498,7 @@ public class ClassPath implements Serializable { } } + @Override ClassFile getClassFile( String name, String suffix ) throws IOException { final ZipEntry entry = zip.getEntry(name.replace('.', '/') + suffix); diff --git a/src/main/java/org/apache/bcel/util/ClassQueue.java b/src/main/java/org/apache/bcel/util/ClassQueue.java index 54b62536..81adbee2 100644 --- a/src/main/java/org/apache/bcel/util/ClassQueue.java +++ b/src/main/java/org/apache/bcel/util/ClassQueue.java @@ -48,6 +48,7 @@ public class ClassQueue implements java.io.Serializable { } + @Override public String toString() { return vec.toString(); } diff --git a/src/main/java/org/apache/bcel/util/ClassVector.java b/src/main/java/org/apache/bcel/util/ClassVector.java index 50af696b..97928fe4 100644 --- a/src/main/java/org/apache/bcel/util/ClassVector.java +++ b/src/main/java/org/apache/bcel/util/ClassVector.java @@ -30,6 +30,7 @@ import org.apache.bcel.classfile.JavaClass; * * @deprecated as of 5.1.1 - 7/17/2005 */ +@Deprecated public class ClassVector implements java.io.Serializable { private static final long serialVersionUID = 5600397075672780806L; diff --git a/src/main/java/org/apache/bcel/verifier/VerificationResult.java b/src/main/java/org/apache/bcel/verifier/VerificationResult.java index ca3b3b76..37c33dd1 100644 --- a/src/main/java/org/apache/bcel/verifier/VerificationResult.java +++ b/src/main/java/org/apache/bcel/verifier/VerificationResult.java @@ -79,6 +79,7 @@ public class VerificationResult { /** @return a hash code value for the object. */ + @Override public int hashCode() { return numeric ^ detailMessage.hashCode(); } @@ -87,6 +88,7 @@ public class VerificationResult { /** * Returns if two VerificationResult instances are equal. */ + @Override public boolean equals( Object o ) { if (!(o instanceof VerificationResult)) { return false; @@ -99,6 +101,7 @@ public class VerificationResult { /** * Returns a String representation of the VerificationResult. */ + @Override public String toString() { String ret = ""; if (numeric == VERIFIED_NOTYET) { diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index 4787973a..51c08cd7 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -221,6 +221,7 @@ public class VerifierAppFrame extends JFrame { /** Overridden to stop the application on a closing window. */ + @Override protected void processWindowEvent( WindowEvent e ) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { diff --git a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java index 3ee69ef1..0b43459d 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java +++ b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java @@ -472,6 +472,7 @@ public class VerifyDialog extends javax.swing.JDialog { aVerifyDialog.setModal(true); aVerifyDialog.addWindowListener(new java.awt.event.WindowAdapter() { + @Override public void windowClosing( java.awt.event.WindowEvent e ) { classes_to_verify--; if (classes_to_verify == 0) { diff --git a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java index be033293..f96a220c 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java @@ -69,7 +69,8 @@ public final class AssertionViolatedException extends RuntimeException{ * Returns the error message string of this AssertionViolatedException object. * @return the error message string of this AssertionViolatedException. */ - public String getMessage(){ + @Override + public String getMessage(){ return detailMessage; } diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java index 48cfb4e5..1ff1f657 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java @@ -79,7 +79,8 @@ public abstract class VerifierConstraintViolatedException extends RuntimeExcepti * Returns the error message string of this VerifierConstraintViolatedException object. * @return the error message string of this VerifierConstraintViolatedException. */ - public String getMessage(){ + @Override + public String getMessage(){ return detailMessage; } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index 0cc0c025..56d2c690 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -131,7 +131,8 @@ public final class Pass1Verifier extends PassVerifier{ * * @see org.apache.bcel.Repository */ - public VerificationResult do_verify(){ + @Override + public VerificationResult do_verify(){ JavaClass jc; try{ jc = getJavaClass(); //loads in the class file if not already done. @@ -178,7 +179,8 @@ public final class Pass1Verifier extends PassVerifier{ * method is currently useless and therefore marked as * TODO. */ - public String[] getMessages(){ + @Override + public String[] getMessages(){ // This method is only here to override the javadoc-comment. return super.getMessages(); } diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 4edad224..218c2c7e 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -145,7 +145,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * * @see org.apache.bcel.verifier.statics.Pass3aVerifier */ - public VerificationResult do_verify(){ + @Override + public VerificationResult do_verify(){ try { VerificationResult vr1 = myOwner.doPass1(); if (vr1.equals(VerificationResult.VR_OK)){ @@ -370,7 +371,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ /////////////////////////////////////// // ClassFile structure (vmspec2 4.1) // /////////////////////////////////////// - public void visitJavaClass(JavaClass obj){ + @Override + public void visitJavaClass(JavaClass obj){ Attribute[] atts = obj.getAttributes(); boolean foundSourceFile = false; boolean foundInnerClasses = false; @@ -420,65 +422,75 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ ///////////////////////////// // CONSTANTS (vmspec2 4.4) // ///////////////////////////// - public void visitConstantClass(ConstantClass obj){ + @Override + public void visitConstantClass(ConstantClass obj){ if (obj.getTag() != Constants.CONSTANT_Class){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getNameIndex(), CONST_Utf8); } - public void visitConstantFieldref(ConstantFieldref obj){ + @Override + public void visitConstantFieldref(ConstantFieldref obj){ if (obj.getTag() != Constants.CONSTANT_Fieldref){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getClassIndex(), CONST_Class); checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); } - public void visitConstantMethodref(ConstantMethodref obj){ + @Override + public void visitConstantMethodref(ConstantMethodref obj){ if (obj.getTag() != Constants.CONSTANT_Methodref){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getClassIndex(), CONST_Class); checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); } - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ + @Override + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ if (obj.getTag() != Constants.CONSTANT_InterfaceMethodref){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getClassIndex(), CONST_Class); checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); } - public void visitConstantString(ConstantString obj){ + @Override + public void visitConstantString(ConstantString obj){ if (obj.getTag() != Constants.CONSTANT_String){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getStringIndex(), CONST_Utf8); } - public void visitConstantInteger(ConstantInteger obj){ + @Override + public void visitConstantInteger(ConstantInteger obj){ if (obj.getTag() != Constants.CONSTANT_Integer){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } // no indices to check } - public void visitConstantFloat(ConstantFloat obj){ + @Override + public void visitConstantFloat(ConstantFloat obj){ if (obj.getTag() != Constants.CONSTANT_Float){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check } - public void visitConstantLong(ConstantLong obj){ + @Override + public void visitConstantLong(ConstantLong obj){ if (obj.getTag() != Constants.CONSTANT_Long){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check } - public void visitConstantDouble(ConstantDouble obj){ + @Override + public void visitConstantDouble(ConstantDouble obj){ if (obj.getTag() != Constants.CONSTANT_Double){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check } - public void visitConstantNameAndType(ConstantNameAndType obj){ + @Override + public void visitConstantNameAndType(ConstantNameAndType obj){ if (obj.getTag() != Constants.CONSTANT_NameAndType){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } @@ -486,7 +498,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ //checkIndex(obj, obj.getDescriptorIndex(), CONST_Utf8); //inconsistently named in BCEL, see below. checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); } - public void visitConstantUtf8(ConstantUtf8 obj){ + @Override + public void visitConstantUtf8(ConstantUtf8 obj){ if (obj.getTag() != Constants.CONSTANT_Utf8){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } @@ -495,7 +508,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ ////////////////////////// // FIELDS (vmspec2 4.5) // ////////////////////////// - public void visitField(Field obj){ + @Override + public void visitField(Field obj){ if (jc.isClass()){ int maxone=0; @@ -576,7 +590,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ /////////////////////////// // METHODS (vmspec2 4.6) // /////////////////////////// - public void visitMethod(Method obj){ + @Override + public void visitMethod(Method obj){ checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -748,7 +763,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ /////////////////////////////////////////////////////// // ClassFile-structure-ATTRIBUTES (vmspec2 4.1, 4.7) // /////////////////////////////////////////////////////// - public void visitSourceFile(SourceFile obj){//vmspec2 4.7.7 + @Override + public void visitSourceFile(SourceFile obj){//vmspec2 4.7.7 // zero or one SourceFile attr per ClassFile: see visitJavaClass() @@ -771,7 +787,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ addMessage("SourceFile attribute '"+tostring(obj)+"' has a funny name: remember not to confuse certain parsers working on javap's output. Also, this name ('"+sourcefilename+"') is considered an unqualified (simple) file name only."); } } - public void visitDeprecated(Deprecated obj){//vmspec2 4.7.10 + @Override + public void visitDeprecated(Deprecated obj){//vmspec2 4.7.10 checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); @@ -779,14 +796,16 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ throw new ClassConstraintException("The Deprecated attribute '"+tostring(obj)+"' is not correctly named 'Deprecated' but '"+name+"'."); } } - public void visitSynthetic(Synthetic obj){//vmspec2 4.7.6 + @Override + public void visitSynthetic(Synthetic obj){//vmspec2 4.7.6 checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); if (! name.equals("Synthetic")){ throw new ClassConstraintException("The Synthetic attribute '"+tostring(obj)+"' is not correctly named 'Synthetic' but '"+name+"'."); } } - public void visitInnerClasses(InnerClasses obj){//vmspec2 4.7.5 + @Override + public void visitInnerClasses(InnerClasses obj){//vmspec2 4.7.5 // exactly one InnerClasses attr per ClassFile if some inner class is refernced: see visitJavaClass() @@ -821,7 +840,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ //////////////////////////////////////////////////////// // field_info-structure-ATTRIBUTES (vmspec2 4.5, 4.7) // //////////////////////////////////////////////////////// - public void visitConstantValue(ConstantValue obj){//vmspec2 4.7.2 + @Override + public void visitConstantValue(ConstantValue obj){//vmspec2 4.7.2 // Despite its name, this really is an Attribute, // not a constant! checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -867,7 +887,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ ///////////////////////////////////////////////////////// // method_info-structure-ATTRIBUTES (vmspec2 4.6, 4.7) // ///////////////////////////////////////////////////////// - public void visitCode(Code obj){//vmspec2 4.7.3 + @Override + public void visitCode(Code obj){//vmspec2 4.7.3 try { // No code attribute allowed for native or abstract methods: see visitMethod(Method). // Code array constraints are checked in Pass3 (3a and 3b). @@ -1027,7 +1048,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ }// visitCode(Code) END - public void visitExceptionTable(ExceptionTable obj){//vmspec2 4.7.4 + @Override + public void visitExceptionTable(ExceptionTable obj){//vmspec2 4.7.4 try { // incorrectly named, it's the Exceptions attribute (vmspec2 4.7.4) checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -1088,7 +1110,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ ////////////////////////////////////////////////////////////// // code_attribute-structure-ATTRIBUTES (vmspec2 4.7.3, 4.7) // ////////////////////////////////////////////////////////////// - public void visitLineNumberTable(LineNumberTable obj){//vmspec2 4.7.8 + @Override + public void visitLineNumberTable(LineNumberTable obj){//vmspec2 4.7.8 checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); @@ -1101,14 +1124,16 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ // ...validity check... } - public void visitLocalVariableTable(LocalVariableTable obj){//vmspec2 4.7.9 + @Override + public void visitLocalVariableTable(LocalVariableTable obj){//vmspec2 4.7.9 //In JustIce,this check is partially delayed to Pass 3a. //The other part can be found in the visitCode(Code) method. } //////////////////////////////////////////////////// // MISC-structure-ATTRIBUTES (vmspec2 4.7.1, 4.7) // //////////////////////////////////////////////////// - public void visitUnknown(Unknown obj){//vmspec2 4.7.1 + @Override + public void visitUnknown(Unknown obj){//vmspec2 4.7.1 // Represents an unknown attribute. checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -1118,29 +1143,34 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ ////////// // BCEL // ////////// - public void visitLocalVariable(LocalVariable obj){ + @Override + public void visitLocalVariable(LocalVariable obj){ // This does not represent an Attribute but is only // related to internal BCEL data representation. // see visitLocalVariableTable(LocalVariableTable) } - public void visitCodeException(CodeException obj){ + @Override + public void visitCodeException(CodeException obj){ // Code constraints are checked in Pass3 (3a and 3b). // This does not represent an Attribute but is only // related to internal BCEL data representation. // see visitCode(Code) } - public void visitConstantPool(ConstantPool obj){ + @Override + public void visitConstantPool(ConstantPool obj){ // No need to. We're piggybacked by the DescendingVisitor. // This does not represent an Attribute but is only // related to internal BCEL data representation. } - public void visitInnerClass(InnerClass obj){ + @Override + public void visitInnerClass(InnerClass obj){ // This does not represent an Attribute but is only // related to internal BCEL data representation. } - public void visitLineNumber(LineNumber obj){ + @Override + public void visitLineNumber(LineNumber obj){ // This does not represent an Attribute but is only // related to internal BCEL data representation. @@ -1189,7 +1219,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ cp = _jc.getConstantPool(); } - public void visitConstantFieldref(ConstantFieldref obj){ + @Override + public void visitConstantFieldref(ConstantFieldref obj){ if (obj.getTag() != Constants.CONSTANT_Fieldref){ throw new ClassConstraintException("ConstantFieldref '"+tostring(obj)+"' has wrong tag!"); } @@ -1217,7 +1248,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } } - public void visitConstantMethodref(ConstantMethodref obj){ + @Override + public void visitConstantMethodref(ConstantMethodref obj){ if (obj.getTag() != Constants.CONSTANT_Methodref){ throw new ClassConstraintException("ConstantMethodref '"+tostring(obj)+"' has wrong tag!"); } @@ -1248,7 +1280,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } } - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ + @Override + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ if (obj.getTag() != Constants.CONSTANT_InterfaceMethodref){ throw new ClassConstraintException("ConstantInterfaceMethodref '"+tostring(obj)+"' has wrong tag!"); } @@ -1424,7 +1457,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ return hasInnerClass; } /** This method casually visits ConstantClass references. */ - public void visitConstantClass(ConstantClass obj){ + @Override + public void visitConstantClass(ConstantClass obj){ Constant c = cp.getConstant(obj.getNameIndex()); if (c instanceof ConstantUtf8){ //Ignore the case where it's not a ConstantUtf8 here, we'll find out later. String classname = ((ConstantUtf8) c).getBytes(); diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 6a249dc0..3e744c9d 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -149,7 +149,8 @@ public final class Pass3aVerifier extends PassVerifier{ * * @throws InvalidMethodException if the method to verify does not exist. */ - public VerificationResult do_verify(){ + @Override + public VerificationResult do_verify(){ try { if (myOwner.doPass2().equals(VerificationResult.VR_OK)){ // Okay, class file was loaded correctly by Pass 1 @@ -485,7 +486,8 @@ public final class Pass3aVerifier extends PassVerifier{ * Assures the generic preconditions of a LoadClass instance. * The referenced class is loaded and pass2-verified. */ - public void visitLoadClass(LoadClass o){ + @Override + public void visitLoadClass(LoadClass o){ ObjectType t = o.getLoadClassType(cpg); if (t != null){// null means "no class is loaded" Verifier v = VerifierFactory.getVerifier(t.getClassName()); @@ -505,7 +507,8 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ // LDC and LDC_W (LDC_W is a subclass of LDC in BCEL's model) - public void visitLDC(LDC o){ + @Override + public void visitLDC(LDC o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (c instanceof ConstantClass){ @@ -522,7 +525,8 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ // LDC2_W - public void visitLDC2_W(LDC2_W o){ + @Override + public void visitLDC2_W(LDC2_W o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! ( (c instanceof ConstantLong) || @@ -539,7 +543,8 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ //getfield, putfield, getstatic, putstatic - public void visitFieldInstruction(FieldInstruction o){ + @Override + public void visitFieldInstruction(FieldInstruction o){ try { indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); @@ -611,7 +616,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitInvokeInstruction(InvokeInstruction o){ + @Override + public void visitInvokeInstruction(InvokeInstruction o){ indexValid(o, o.getIndex()); if ( (o instanceof INVOKEVIRTUAL) || (o instanceof INVOKESPECIAL) || @@ -685,7 +691,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitINSTANCEOF(INSTANCEOF o){ + @Override + public void visitINSTANCEOF(INSTANCEOF o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! (c instanceof ConstantClass)){ @@ -694,7 +701,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitCHECKCAST(CHECKCAST o){ + @Override + public void visitCHECKCAST(CHECKCAST o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! (c instanceof ConstantClass)){ @@ -703,7 +711,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitNEW(NEW o){ + @Override + public void visitNEW(NEW o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! (c instanceof ConstantClass)){ @@ -720,7 +729,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitMULTIANEWARRAY(MULTIANEWARRAY o){ + @Override + public void visitMULTIANEWARRAY(MULTIANEWARRAY o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! (c instanceof ConstantClass)){ @@ -743,7 +753,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitANEWARRAY(ANEWARRAY o){ + @Override + public void visitANEWARRAY(ANEWARRAY o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! (c instanceof ConstantClass)){ @@ -759,7 +770,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitNEWARRAY(NEWARRAY o){ + @Override + public void visitNEWARRAY(NEWARRAY o){ byte t = o.getTypecode(); if (! ( (t == Constants.T_BOOLEAN) || (t == Constants.T_CHAR) || @@ -774,7 +786,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitILOAD(ILOAD o){ + @Override + public void visitILOAD(ILOAD o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -788,7 +801,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitFLOAD(FLOAD o){ + @Override + public void visitFLOAD(FLOAD o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -802,7 +816,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitALOAD(ALOAD o){ + @Override + public void visitALOAD(ALOAD o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -816,7 +831,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitISTORE(ISTORE o){ + @Override + public void visitISTORE(ISTORE o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -830,7 +846,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitFSTORE(FSTORE o){ + @Override + public void visitFSTORE(FSTORE o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -844,7 +861,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitASTORE(ASTORE o){ + @Override + public void visitASTORE(ASTORE o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -858,7 +876,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitIINC(IINC o){ + @Override + public void visitIINC(IINC o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -872,7 +891,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitRET(RET o){ + @Override + public void visitRET(RET o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -886,7 +906,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitLLOAD(LLOAD o){ + @Override + public void visitLLOAD(LLOAD o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); @@ -900,7 +921,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitDLOAD(DLOAD o){ + @Override + public void visitDLOAD(DLOAD o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); @@ -914,7 +936,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitLSTORE(LSTORE o){ + @Override + public void visitLSTORE(LSTORE o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); @@ -928,7 +951,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitDSTORE(DSTORE o){ + @Override + public void visitDSTORE(DSTORE o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); @@ -942,7 +966,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ + @Override + public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ int[] matchs = o.getMatchs(); int max = Integer.MIN_VALUE; for (int i=0; i= "low". We cannot check this, as BCEL hides // it from us. } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitPUTSTATIC(PUTSTATIC o){ + @Override + public void visitPUTSTATIC(PUTSTATIC o){ try { String field_name = o.getFieldName(cpg); JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); @@ -1004,7 +1031,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitGETSTATIC(GETSTATIC o){ + @Override + public void visitGETSTATIC(GETSTATIC o){ try { String field_name = o.getFieldName(cpg); JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); @@ -1040,7 +1068,8 @@ public final class Pass3aVerifier extends PassVerifier{ //} /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ + @Override + public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ try { // INVOKEINTERFACE is a LoadClass; the Class where the referenced method is declared in, // is therefore resolved/verified. @@ -1071,7 +1100,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitINVOKESPECIAL(INVOKESPECIAL o){ + @Override + public void visitINVOKESPECIAL(INVOKESPECIAL o){ try { // INVOKESPECIAL is a LoadClass; the Class where the referenced method is declared in, // is therefore resolved/verified. @@ -1136,7 +1166,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitINVOKESTATIC(INVOKESTATIC o){ + @Override + public void visitINVOKESTATIC(INVOKESTATIC o){ try { // INVOKESTATIC is a LoadClass; the Class where the referenced method is declared in, // is therefore resolved/verified. @@ -1168,7 +1199,8 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ + @Override + public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ try { // INVOKEVIRTUAL is a LoadClass; the Class where the referenced method is declared in, // is therefore resolved/verified. diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 04d2f361..2e31c3ee 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -88,6 +88,7 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor /** * Returns the String representation. */ + @Override public String toString() { // The run-time check below is needed because we don't want to omit inheritance // of "EmptyVisitor" and provide a thousand empty methods. @@ -124,11 +125,13 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor // We don't of course need to call some default implementation: // e.g. we could also simply output "Code" instead of a possibly // lengthy Code attribute's toString(). + @Override public void visitCode(Code obj) { //tostring = toString(obj); tostring = ""; // We don't need real code outputs. } + @Override public void visitAnnotation(Annotations obj) { //this is invoked whenever an annotation is found @@ -136,6 +139,7 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor tostring = toString(obj); } + @Override public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) { //this is invoked whenever a local variable type is found @@ -143,122 +147,152 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor tostring = toString(obj); } + @Override public void visitCodeException(CodeException obj) { tostring = toString(obj); } + @Override public void visitConstantClass(ConstantClass obj) { tostring = toString(obj); } + @Override public void visitConstantDouble(ConstantDouble obj) { tostring = toString(obj); } + @Override public void visitConstantFieldref(ConstantFieldref obj) { tostring = toString(obj); } + @Override public void visitConstantFloat(ConstantFloat obj) { tostring = toString(obj); } + @Override public void visitConstantInteger(ConstantInteger obj) { tostring = toString(obj); } + @Override public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) { tostring = toString(obj); } + @Override public void visitConstantLong(ConstantLong obj) { tostring = toString(obj); } + @Override public void visitConstantMethodref(ConstantMethodref obj) { tostring = toString(obj); } + @Override public void visitConstantNameAndType(ConstantNameAndType obj) { tostring = toString(obj); } + @Override public void visitConstantPool(ConstantPool obj) { tostring = toString(obj); } + @Override public void visitConstantString(ConstantString obj) { tostring = toString(obj); } + @Override public void visitConstantUtf8(ConstantUtf8 obj) { tostring = toString(obj); } + @Override public void visitConstantValue(ConstantValue obj) { tostring = toString(obj); } + @Override public void visitDeprecated(Deprecated obj) { tostring = toString(obj); } + @Override public void visitExceptionTable(ExceptionTable obj) { tostring = toString(obj); } + @Override public void visitField(Field obj) { tostring = toString(obj); } + @Override public void visitInnerClass(InnerClass obj) { tostring = toString(obj); } + @Override public void visitInnerClasses(InnerClasses obj) { tostring = toString(obj); } + @Override public void visitJavaClass(JavaClass obj) { tostring = toString(obj); } + @Override public void visitLineNumber(LineNumber obj) { tostring = toString(obj); } + @Override public void visitLineNumberTable(LineNumberTable obj) { tostring = ""; } + @Override public void visitLocalVariable(LocalVariable obj) { tostring = toString(obj); } + @Override public void visitLocalVariableTable(LocalVariableTable obj) { tostring = ""; } + @Override public void visitMethod(Method obj) { tostring = toString(obj); } + @Override public void visitSignature(Signature obj) { tostring = toString(obj); } + @Override public void visitSourceFile(SourceFile obj) { tostring = toString(obj); } + @Override public void visitStackMap(StackMap obj) { tostring = toString(obj); } + @Override public void visitSynthetic(Synthetic obj) { tostring = toString(obj); } + @Override public void visitUnknown(Unknown obj) { tostring = toString(obj); } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index 81c9d42c..31fc89de 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -217,7 +217,8 @@ public class ControlFlowGraph{ /** * Returns a simple String representation of this InstructionContext. */ - public String toString(){ + @Override + public String toString(){ //TODO: Put information in the brackets, e.g. // Is this an ExceptionHandler? Is this a RET? Is this the start of // a subroutine? diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index 838723d1..4c9379fa 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -118,7 +118,8 @@ public class ExecutionVisitor extends EmptyVisitor{ //} /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitAALOAD(AALOAD o){ + @Override + public void visitAALOAD(AALOAD o){ stack().pop(); // pop the index int //System.out.print(stack().peek()); Type t = stack().pop(); // Pop Array type @@ -131,42 +132,50 @@ public class ExecutionVisitor extends EmptyVisitor{ } } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitAASTORE(AASTORE o){ + @Override + public void visitAASTORE(AASTORE o){ stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitACONST_NULL(ACONST_NULL o){ + @Override + public void visitACONST_NULL(ACONST_NULL o){ stack().push(Type.NULL); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitALOAD(ALOAD o){ + @Override + public void visitALOAD(ALOAD o){ stack().push(locals().get(o.getIndex())); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitANEWARRAY(ANEWARRAY o){ + @Override + public void visitANEWARRAY(ANEWARRAY o){ stack().pop(); //count stack().push( new ArrayType(o.getType(cpg), 1) ); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitARETURN(ARETURN o){ + @Override + public void visitARETURN(ARETURN o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitARRAYLENGTH(ARRAYLENGTH o){ + @Override + public void visitARRAYLENGTH(ARRAYLENGTH o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitASTORE(ASTORE o){ + @Override + public void visitASTORE(ASTORE o){ locals().set(o.getIndex(), stack().pop()); //System.err.println("TODO-DEBUG: set LV '"+o.getIndex()+"' to '"+locals().get(o.getIndex())+"'."); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitATHROW(ATHROW o){ + @Override + public void visitATHROW(ATHROW o){ Type t = stack().pop(); stack().clear(); if (t.equals(Type.NULL)) { @@ -177,38 +186,44 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitBALOAD(BALOAD o){ + @Override + public void visitBALOAD(BALOAD o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitBASTORE(BASTORE o){ + @Override + public void visitBASTORE(BASTORE o){ stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitBIPUSH(BIPUSH o){ + @Override + public void visitBIPUSH(BIPUSH o){ stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitCALOAD(CALOAD o){ + @Override + public void visitCALOAD(CALOAD o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitCASTORE(CASTORE o){ + @Override + public void visitCASTORE(CASTORE o){ stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitCHECKCAST(CHECKCAST o){ + @Override + public void visitCHECKCAST(CHECKCAST o){ // It's possibly wrong to do so, but SUN's // ByteCode verifier seems to do (only) this, too. // TODO: One could use a sophisticated analysis here to check @@ -219,104 +234,123 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitD2F(D2F o){ + @Override + public void visitD2F(D2F o){ stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitD2I(D2I o){ + @Override + public void visitD2I(D2I o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitD2L(D2L o){ + @Override + public void visitD2L(D2L o){ stack().pop(); stack().push(Type.LONG); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDADD(DADD o){ + @Override + public void visitDADD(DADD o){ stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDALOAD(DALOAD o){ + @Override + public void visitDALOAD(DALOAD o){ stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDASTORE(DASTORE o){ + @Override + public void visitDASTORE(DASTORE o){ stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDCMPG(DCMPG o){ + @Override + public void visitDCMPG(DCMPG o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDCMPL(DCMPL o){ + @Override + public void visitDCMPL(DCMPL o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDCONST(DCONST o){ + @Override + public void visitDCONST(DCONST o){ stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDDIV(DDIV o){ + @Override + public void visitDDIV(DDIV o){ stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDLOAD(DLOAD o){ + @Override + public void visitDLOAD(DLOAD o){ stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDMUL(DMUL o){ + @Override + public void visitDMUL(DMUL o){ stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDNEG(DNEG o){ + @Override + public void visitDNEG(DNEG o){ stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDREM(DREM o){ + @Override + public void visitDREM(DREM o){ stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDRETURN(DRETURN o){ + @Override + public void visitDRETURN(DRETURN o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDSTORE(DSTORE o){ + @Override + public void visitDSTORE(DSTORE o){ locals().set(o.getIndex(), stack().pop()); locals().set(o.getIndex()+1, Type.UNKNOWN); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDSUB(DSUB o){ + @Override + public void visitDSUB(DSUB o){ stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDUP(DUP o){ + @Override + public void visitDUP(DUP o){ Type t = stack().pop(); stack().push(t); stack().push(t); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDUP_X1(DUP_X1 o){ + @Override + public void visitDUP_X1(DUP_X1 o){ Type w1 = stack().pop(); Type w2 = stack().pop(); stack().push(w1); @@ -324,7 +358,8 @@ public class ExecutionVisitor extends EmptyVisitor{ stack().push(w1); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDUP_X2(DUP_X2 o){ + @Override + public void visitDUP_X2(DUP_X2 o){ Type w1 = stack().pop(); Type w2 = stack().pop(); if (w2.getSize() == 2){ @@ -341,7 +376,8 @@ public class ExecutionVisitor extends EmptyVisitor{ } } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDUP2(DUP2 o){ + @Override + public void visitDUP2(DUP2 o){ Type t = stack().pop(); if (t.getSize() == 2){ stack().push(t); @@ -356,7 +392,8 @@ public class ExecutionVisitor extends EmptyVisitor{ } } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDUP2_X1(DUP2_X1 o){ + @Override + public void visitDUP2_X1(DUP2_X1 o){ Type t = stack().pop(); if (t.getSize() == 2){ Type u = stack().pop(); @@ -375,7 +412,8 @@ public class ExecutionVisitor extends EmptyVisitor{ } } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitDUP2_X2(DUP2_X2 o){ + @Override + public void visitDUP2_X2(DUP2_X2 o){ Type t = stack().pop(); if (t.getSize() == 2){ Type u = stack().pop(); @@ -412,97 +450,115 @@ public class ExecutionVisitor extends EmptyVisitor{ } } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitF2D(F2D o){ + @Override + public void visitF2D(F2D o){ stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitF2I(F2I o){ + @Override + public void visitF2I(F2I o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitF2L(F2L o){ + @Override + public void visitF2L(F2L o){ stack().pop(); stack().push(Type.LONG); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFADD(FADD o){ + @Override + public void visitFADD(FADD o){ stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFALOAD(FALOAD o){ + @Override + public void visitFALOAD(FALOAD o){ stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFASTORE(FASTORE o){ + @Override + public void visitFASTORE(FASTORE o){ stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFCMPG(FCMPG o){ + @Override + public void visitFCMPG(FCMPG o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFCMPL(FCMPL o){ + @Override + public void visitFCMPL(FCMPL o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFCONST(FCONST o){ + @Override + public void visitFCONST(FCONST o){ stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFDIV(FDIV o){ + @Override + public void visitFDIV(FDIV o){ stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFLOAD(FLOAD o){ + @Override + public void visitFLOAD(FLOAD o){ stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFMUL(FMUL o){ + @Override + public void visitFMUL(FMUL o){ stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFNEG(FNEG o){ + @Override + public void visitFNEG(FNEG o){ stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFREM(FREM o){ + @Override + public void visitFREM(FREM o){ stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFRETURN(FRETURN o){ + @Override + public void visitFRETURN(FRETURN o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFSTORE(FSTORE o){ + @Override + public void visitFSTORE(FSTORE o){ locals().set(o.getIndex(), stack().pop()); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitFSUB(FSUB o){ + @Override + public void visitFSUB(FSUB o){ stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitGETFIELD(GETFIELD o){ + @Override + public void visitGETFIELD(GETFIELD o){ stack().pop(); Type t = o.getFieldType(cpg); if ( t.equals(Type.BOOLEAN) || @@ -514,7 +570,8 @@ public class ExecutionVisitor extends EmptyVisitor{ stack().push(t); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitGETSTATIC(GETSTATIC o){ + @Override + public void visitGETSTATIC(GETSTATIC o){ Type t = o.getFieldType(cpg); if ( t.equals(Type.BOOLEAN) || t.equals(Type.CHAR) || @@ -525,175 +582,211 @@ public class ExecutionVisitor extends EmptyVisitor{ stack().push(t); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitGOTO(GOTO o){ + @Override + public void visitGOTO(GOTO o){ // no stack changes. } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitGOTO_W(GOTO_W o){ + @Override + public void visitGOTO_W(GOTO_W o){ // no stack changes. } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitI2B(I2B o){ + @Override + public void visitI2B(I2B o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitI2C(I2C o){ + @Override + public void visitI2C(I2C o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitI2D(I2D o){ + @Override + public void visitI2D(I2D o){ stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitI2F(I2F o){ + @Override + public void visitI2F(I2F o){ stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitI2L(I2L o){ + @Override + public void visitI2L(I2L o){ stack().pop(); stack().push(Type.LONG); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitI2S(I2S o){ + @Override + public void visitI2S(I2S o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIADD(IADD o){ + @Override + public void visitIADD(IADD o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIALOAD(IALOAD o){ + @Override + public void visitIALOAD(IALOAD o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIAND(IAND o){ + @Override + public void visitIAND(IAND o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIASTORE(IASTORE o){ + @Override + public void visitIASTORE(IASTORE o){ stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitICONST(ICONST o){ + @Override + public void visitICONST(ICONST o){ stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIDIV(IDIV o){ + @Override + public void visitIDIV(IDIV o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ACMPEQ(IF_ACMPEQ o){ + @Override + public void visitIF_ACMPEQ(IF_ACMPEQ o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ACMPNE(IF_ACMPNE o){ + @Override + public void visitIF_ACMPNE(IF_ACMPNE o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ICMPEQ(IF_ICMPEQ o){ + @Override + public void visitIF_ICMPEQ(IF_ICMPEQ o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ICMPGE(IF_ICMPGE o){ + @Override + public void visitIF_ICMPGE(IF_ICMPGE o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ICMPGT(IF_ICMPGT o){ + @Override + public void visitIF_ICMPGT(IF_ICMPGT o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ICMPLE(IF_ICMPLE o){ + @Override + public void visitIF_ICMPLE(IF_ICMPLE o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ICMPLT(IF_ICMPLT o){ + @Override + public void visitIF_ICMPLT(IF_ICMPLT o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIF_ICMPNE(IF_ICMPNE o){ + @Override + public void visitIF_ICMPNE(IF_ICMPNE o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFEQ(IFEQ o){ + @Override + public void visitIFEQ(IFEQ o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFGE(IFGE o){ + @Override + public void visitIFGE(IFGE o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFGT(IFGT o){ + @Override + public void visitIFGT(IFGT o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFLE(IFLE o){ + @Override + public void visitIFLE(IFLE o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFLT(IFLT o){ + @Override + public void visitIFLT(IFLT o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFNE(IFNE o){ + @Override + public void visitIFNE(IFNE o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFNONNULL(IFNONNULL o){ + @Override + public void visitIFNONNULL(IFNONNULL o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIFNULL(IFNULL o){ + @Override + public void visitIFNULL(IFNULL o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIINC(IINC o){ + @Override + public void visitIINC(IINC o){ // stack is not changed. } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitILOAD(ILOAD o){ + @Override + public void visitILOAD(ILOAD o){ stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitIMUL(IMUL o){ + @Override + public void visitIMUL(IMUL o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitINEG(INEG o){ + @Override + public void visitINEG(INEG o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitINSTANCEOF(INSTANCEOF o){ + @Override + public void visitINSTANCEOF(INSTANCEOF o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ + @Override + public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ stack().pop(); //objectref for (int i=0; i= cpg.getSize())){ throw new AssertionViolatedException("Huh?! Constant pool index of instruction '"+o+"' illegal? Pass 3a should have checked this!"); @@ -267,7 +271,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the general preconditions of a FieldInstruction instance. */ - public void visitFieldInstruction(FieldInstruction o){ + @Override + public void visitFieldInstruction(FieldInstruction o){ // visitLoadClass(o) has been called before: Every FieldOrMethod // implements LoadClass. // visitCPInstruction(o) has been called before. @@ -291,7 +296,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the general preconditions of an InvokeInstruction instance. */ - public void visitInvokeInstruction(InvokeInstruction o){ + @Override + public void visitInvokeInstruction(InvokeInstruction o){ // visitLoadClass(o) has been called before: Every FieldOrMethod // implements LoadClass. // visitCPInstruction(o) has been called before. @@ -301,7 +307,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the general preconditions of a StackInstruction instance. */ - public void visitStackInstruction(StackInstruction o){ + @Override + public void visitStackInstruction(StackInstruction o){ _visitStackAccessor(o); } @@ -309,7 +316,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Assures the generic preconditions of a LocalVariableInstruction instance. * That is, the index of the local variable must be valid. */ - public void visitLocalVariableInstruction(LocalVariableInstruction o){ + @Override + public void visitLocalVariableInstruction(LocalVariableInstruction o){ if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ constraintViolated(o, "The 'index' is not a valid index into the local variable array."); } @@ -318,7 +326,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Assures the generic preconditions of a LoadInstruction instance. */ - public void visitLoadInstruction(LoadInstruction o){ + @Override + public void visitLoadInstruction(LoadInstruction o){ //visitLocalVariableInstruction(o) is called before, because it is more generic. // LOAD instructions must not read Type.UNKNOWN @@ -358,7 +367,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Assures the generic preconditions of a StoreInstruction instance. */ - public void visitStoreInstruction(StoreInstruction o){ + @Override + public void visitStoreInstruction(StoreInstruction o){ //visitLocalVariableInstruction(o) is called before, because it is more generic. if (stack().isEmpty()){ // Don't bother about 1 or 2 stack slots used. This check is implicitely done below while type checking. @@ -384,7 +394,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Assures the generic preconditions of a ReturnInstruction instance. */ - public void visitReturnInstruction(ReturnInstruction o){ + @Override + public void visitReturnInstruction(ReturnInstruction o){ Type method_type = mg.getType(); if (method_type == Type.BOOLEAN || method_type == Type.BYTE || @@ -432,7 +443,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitAALOAD(AALOAD o){ + @Override + public void visitAALOAD(AALOAD o){ Type arrayref = stack().peek(1); Type index = stack().peek(0); @@ -448,7 +460,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitAASTORE(AASTORE o){ + @Override + public void visitAASTORE(AASTORE o){ try { Type arrayref = stack().peek(2); Type index = stack().peek(1); @@ -479,14 +492,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitACONST_NULL(ACONST_NULL o){ + @Override + public void visitACONST_NULL(ACONST_NULL o){ // Nothing needs to be done here. } /** * Ensures the specific preconditions of the said instruction. */ - public void visitALOAD(ALOAD o){ + @Override + public void visitALOAD(ALOAD o){ //visitLoadInstruction(LoadInstruction) is called before. // Nothing else needs to be done here. @@ -495,7 +510,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitANEWARRAY(ANEWARRAY o){ + @Override + public void visitANEWARRAY(ANEWARRAY o){ if (!stack().peek().equals(Type.INT)) { constraintViolated(o, "The 'count' at the stack top is not of type '"+Type.INT+"' but of type '"+stack().peek()+"'."); // The runtime constant pool item at that index must be a symbolic reference to a class, @@ -506,7 +522,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitARETURN(ARETURN o){ + @Override + public void visitARETURN(ARETURN o){ if (! (stack().peek() instanceof ReferenceType) ){ constraintViolated(o, "The 'objectref' at the stack top is not of a ReferenceType but of type '"+stack().peek()+"'."); } @@ -524,7 +541,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitARRAYLENGTH(ARRAYLENGTH o){ + @Override + public void visitARRAYLENGTH(ARRAYLENGTH o){ Type arrayref = stack().peek(0); arrayrefOfArrayType(o, arrayref); } @@ -532,7 +550,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitASTORE(ASTORE o){ + @Override + public void visitASTORE(ASTORE o){ if (! ( (stack().peek() instanceof ReferenceType) || (stack().peek() instanceof ReturnaddressType) ) ){ constraintViolated(o, "The 'objectref' is not of a ReferenceType or of ReturnaddressType but of "+stack().peek()+"."); } @@ -544,7 +563,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitATHROW(ATHROW o){ + @Override + public void visitATHROW(ATHROW o){ try { // It's stated that 'objectref' must be of a ReferenceType --- but since Throwable is // not derived from an ArrayType, it follows that 'objectref' must be of an ObjectType or Type.NULL. @@ -571,7 +591,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitBALOAD(BALOAD o){ + @Override + public void visitBALOAD(BALOAD o){ Type arrayref = stack().peek(1); Type index = stack().peek(0); indexOfInt(o, index); @@ -586,7 +607,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitBASTORE(BASTORE o){ + @Override + public void visitBASTORE(BASTORE o){ Type arrayref = stack().peek(2); Type index = stack().peek(1); Type value = stack().peek(0); @@ -604,21 +626,24 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitBIPUSH(BIPUSH o){ + @Override + public void visitBIPUSH(BIPUSH o){ // Nothing to do... } /** * Ensures the specific preconditions of the said instruction. */ - public void visitBREAKPOINT(BREAKPOINT o){ + @Override + public void visitBREAKPOINT(BREAKPOINT o){ throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as BREAKPOINT."); } /** * Ensures the specific preconditions of the said instruction. */ - public void visitCALOAD(CALOAD o){ + @Override + public void visitCALOAD(CALOAD o){ Type arrayref = stack().peek(1); Type index = stack().peek(0); @@ -629,7 +654,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitCASTORE(CASTORE o){ + @Override + public void visitCASTORE(CASTORE o){ Type arrayref = stack().peek(2); Type index = stack().peek(1); Type value = stack().peek(0); @@ -646,7 +672,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitCHECKCAST(CHECKCAST o){ + @Override + public void visitCHECKCAST(CHECKCAST o){ // The objectref must be of type reference. Type objectref = stack().peek(0); if (!(objectref instanceof ReferenceType)){ @@ -667,7 +694,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitD2F(D2F o){ + @Override + public void visitD2F(D2F o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -676,7 +704,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitD2I(D2I o){ + @Override + public void visitD2I(D2I o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -685,7 +714,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitD2L(D2L o){ + @Override + public void visitD2L(D2L o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -694,7 +724,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDADD(DADD o){ + @Override + public void visitDADD(DADD o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -706,7 +737,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDALOAD(DALOAD o){ + @Override + public void visitDALOAD(DALOAD o){ indexOfInt(o, stack().peek()); if (stack().peek(1) == Type.NULL){ return; @@ -723,7 +755,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDASTORE(DASTORE o){ + @Override + public void visitDASTORE(DASTORE o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -743,7 +776,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDCMPG(DCMPG o){ + @Override + public void visitDCMPG(DCMPG o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -755,7 +789,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDCMPL(DCMPL o){ + @Override + public void visitDCMPL(DCMPL o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -767,14 +802,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDCONST(DCONST o){ + @Override + public void visitDCONST(DCONST o){ // There's nothing to be done here. } /** * Ensures the specific preconditions of the said instruction. */ - public void visitDDIV(DDIV o){ + @Override + public void visitDDIV(DDIV o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -786,7 +823,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDLOAD(DLOAD o){ + @Override + public void visitDLOAD(DLOAD o){ //visitLoadInstruction(LoadInstruction) is called before. // Nothing else needs to be done here. @@ -795,7 +833,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDMUL(DMUL o){ + @Override + public void visitDMUL(DMUL o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -807,7 +846,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDNEG(DNEG o){ + @Override + public void visitDNEG(DNEG o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -816,7 +856,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDREM(DREM o){ + @Override + public void visitDREM(DREM o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -828,7 +869,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDRETURN(DRETURN o){ + @Override + public void visitDRETURN(DRETURN o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -837,7 +879,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDSTORE(DSTORE o){ + @Override + public void visitDSTORE(DSTORE o){ //visitStoreInstruction(StoreInstruction) is called before. // Nothing else needs to be done here. @@ -846,7 +889,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDSUB(DSUB o){ + @Override + public void visitDSUB(DSUB o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -858,7 +902,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDUP(DUP o){ + @Override + public void visitDUP(DUP o){ if (stack().peek().getSize() != 1){ constraintViolated(o, "Won't DUP type on stack top '"+stack().peek()+"' because it must occupy exactly one slot, not '"+stack().peek().getSize()+"'."); } @@ -867,7 +912,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDUP_X1(DUP_X1 o){ + @Override + public void visitDUP_X1(DUP_X1 o){ if (stack().peek().getSize() != 1){ constraintViolated(o, "Type on stack top '"+stack().peek()+"' should occupy exactly one slot, not '"+stack().peek().getSize()+"'."); } @@ -879,7 +925,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDUP_X2(DUP_X2 o){ + @Override + public void visitDUP_X2(DUP_X2 o){ if (stack().peek().getSize() != 1){ constraintViolated(o, "Stack top type must be of size 1, but is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); } @@ -896,7 +943,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDUP2(DUP2 o){ + @Override + public void visitDUP2(DUP2 o){ if (stack().peek().getSize() == 2){ return; // Form 2, okay. } @@ -910,7 +958,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDUP2_X1(DUP2_X1 o){ + @Override + public void visitDUP2_X1(DUP2_X1 o){ if (stack().peek().getSize() == 2){ if (stack().peek(1).getSize() != 1){ constraintViolated(o, "If stack top's size is 2, then stack next-to-top's size must be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); @@ -932,7 +981,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitDUP2_X2(DUP2_X2 o){ + @Override + public void visitDUP2_X2(DUP2_X2 o){ if (stack().peek(0).getSize() == 2){ if (stack().peek(1).getSize() == 2){ @@ -965,7 +1015,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitF2D(F2D o){ + @Override + public void visitF2D(F2D o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -974,7 +1025,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitF2I(F2I o){ + @Override + public void visitF2I(F2I o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -983,7 +1035,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitF2L(F2L o){ + @Override + public void visitF2L(F2L o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -992,7 +1045,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFADD(FADD o){ + @Override + public void visitFADD(FADD o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1004,7 +1058,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFALOAD(FALOAD o){ + @Override + public void visitFALOAD(FALOAD o){ indexOfInt(o, stack().peek()); if (stack().peek(1) == Type.NULL){ return; @@ -1021,7 +1076,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFASTORE(FASTORE o){ + @Override + public void visitFASTORE(FASTORE o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1041,7 +1097,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFCMPG(FCMPG o){ + @Override + public void visitFCMPG(FCMPG o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1053,7 +1110,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFCMPL(FCMPL o){ + @Override + public void visitFCMPL(FCMPL o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1065,14 +1123,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFCONST(FCONST o){ + @Override + public void visitFCONST(FCONST o){ // nothing to do here. } /** * Ensures the specific preconditions of the said instruction. */ - public void visitFDIV(FDIV o){ + @Override + public void visitFDIV(FDIV o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1084,7 +1144,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFLOAD(FLOAD o){ + @Override + public void visitFLOAD(FLOAD o){ //visitLoadInstruction(LoadInstruction) is called before. // Nothing else needs to be done here. @@ -1093,7 +1154,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFMUL(FMUL o){ + @Override + public void visitFMUL(FMUL o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1105,7 +1167,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFNEG(FNEG o){ + @Override + public void visitFNEG(FNEG o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1114,7 +1177,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFREM(FREM o){ + @Override + public void visitFREM(FREM o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1126,7 +1190,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFRETURN(FRETURN o){ + @Override + public void visitFRETURN(FRETURN o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1135,7 +1200,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFSTORE(FSTORE o){ + @Override + public void visitFSTORE(FSTORE o){ //visitStoreInstruction(StoreInstruction) is called before. // Nothing else needs to be done here. @@ -1144,7 +1210,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitFSUB(FSUB o){ + @Override + public void visitFSUB(FSUB o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1156,7 +1223,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitGETFIELD(GETFIELD o){ + @Override + public void visitGETFIELD(GETFIELD o){ try { Type objectref = stack().peek(); if (! ( (objectref instanceof ObjectType) || (objectref == Type.NULL) ) ){ @@ -1244,28 +1312,32 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitGETSTATIC(GETSTATIC o){ + @Override + public void visitGETSTATIC(GETSTATIC o){ // Field must be static: see Pass 3a. } /** * Ensures the specific preconditions of the said instruction. */ - public void visitGOTO(GOTO o){ + @Override + public void visitGOTO(GOTO o){ // nothing to do here. } /** * Ensures the specific preconditions of the said instruction. */ - public void visitGOTO_W(GOTO_W o){ + @Override + public void visitGOTO_W(GOTO_W o){ // nothing to do here. } /** * Ensures the specific preconditions of the said instruction. */ - public void visitI2B(I2B o){ + @Override + public void visitI2B(I2B o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1274,7 +1346,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitI2C(I2C o){ + @Override + public void visitI2C(I2C o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1283,7 +1356,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitI2D(I2D o){ + @Override + public void visitI2D(I2D o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1292,7 +1366,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitI2F(I2F o){ + @Override + public void visitI2F(I2F o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1301,7 +1376,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitI2L(I2L o){ + @Override + public void visitI2L(I2L o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1310,7 +1386,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitI2S(I2S o){ + @Override + public void visitI2S(I2S o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1319,7 +1396,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIADD(IADD o){ + @Override + public void visitIADD(IADD o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1331,7 +1409,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIALOAD(IALOAD o){ + @Override + public void visitIALOAD(IALOAD o){ indexOfInt(o, stack().peek()); if (stack().peek(1) == Type.NULL){ return; @@ -1348,7 +1427,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIAND(IAND o){ + @Override + public void visitIAND(IAND o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1360,7 +1440,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIASTORE(IASTORE o){ + @Override + public void visitIASTORE(IASTORE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1380,14 +1461,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitICONST(ICONST o){ + @Override + public void visitICONST(ICONST o){ //nothing to do here. } /** * Ensures the specific preconditions of the said instruction. */ - public void visitIDIV(IDIV o){ + @Override + public void visitIDIV(IDIV o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1399,7 +1482,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIF_ACMPEQ(IF_ACMPEQ o){ + @Override + public void visitIF_ACMPEQ(IF_ACMPEQ o){ if (!(stack().peek() instanceof ReferenceType)){ constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); } @@ -1415,7 +1499,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIF_ACMPNE(IF_ACMPNE o){ + @Override + public void visitIF_ACMPNE(IF_ACMPNE o){ if (!(stack().peek() instanceof ReferenceType)){ constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); @@ -1429,7 +1514,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIF_ICMPEQ(IF_ICMPEQ o){ + @Override + public void visitIF_ICMPEQ(IF_ICMPEQ o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1441,7 +1527,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIF_ICMPGE(IF_ICMPGE o){ + @Override + public void visitIF_ICMPGE(IF_ICMPGE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1453,7 +1540,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIF_ICMPGT(IF_ICMPGT o){ + @Override + public void visitIF_ICMPGT(IF_ICMPGT o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1465,7 +1553,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIF_ICMPLE(IF_ICMPLE o){ + @Override + public void visitIF_ICMPLE(IF_ICMPLE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1477,7 +1566,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIF_ICMPLT(IF_ICMPLT o){ + @Override + public void visitIF_ICMPLT(IF_ICMPLT o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1489,7 +1579,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIF_ICMPNE(IF_ICMPNE o){ + @Override + public void visitIF_ICMPNE(IF_ICMPNE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1501,7 +1592,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIFEQ(IFEQ o){ + @Override + public void visitIFEQ(IFEQ o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1510,7 +1602,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIFGE(IFGE o){ + @Override + public void visitIFGE(IFGE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1519,7 +1612,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIFGT(IFGT o){ + @Override + public void visitIFGT(IFGT o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1528,7 +1622,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIFLE(IFLE o){ + @Override + public void visitIFLE(IFLE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1537,7 +1632,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIFLT(IFLT o){ + @Override + public void visitIFLT(IFLT o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1546,7 +1642,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIFNE(IFNE o){ + @Override + public void visitIFNE(IFNE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1555,7 +1652,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIFNONNULL(IFNONNULL o){ + @Override + public void visitIFNONNULL(IFNONNULL o){ if (!(stack().peek() instanceof ReferenceType)){ constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); } @@ -1565,7 +1663,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIFNULL(IFNULL o){ + @Override + public void visitIFNULL(IFNULL o){ if (!(stack().peek() instanceof ReferenceType)){ constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); } @@ -1575,7 +1674,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIINC(IINC o){ + @Override + public void visitIINC(IINC o){ // Mhhh. In BCEL, at this time "IINC" is not a LocalVariableInstruction. if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ constraintViolated(o, "The 'index' is not a valid index into the local variable array."); @@ -1587,28 +1687,32 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitILOAD(ILOAD o){ + @Override + public void visitILOAD(ILOAD o){ // All done by visitLocalVariableInstruction(), visitLoadInstruction() } /** * Ensures the specific preconditions of the said instruction. */ - public void visitIMPDEP1(IMPDEP1 o){ + @Override + public void visitIMPDEP1(IMPDEP1 o){ throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP1."); } /** * Ensures the specific preconditions of the said instruction. */ - public void visitIMPDEP2(IMPDEP2 o){ + @Override + public void visitIMPDEP2(IMPDEP2 o){ throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP2."); } /** * Ensures the specific preconditions of the said instruction. */ - public void visitIMUL(IMUL o){ + @Override + public void visitIMUL(IMUL o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1620,7 +1724,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitINEG(INEG o){ + @Override + public void visitINEG(INEG o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1629,7 +1734,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitINSTANCEOF(INSTANCEOF o){ + @Override + public void visitINSTANCEOF(INSTANCEOF o){ // The objectref must be of type reference. Type objectref = stack().peek(0); if (!(objectref instanceof ReferenceType)){ @@ -1650,7 +1756,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ + @Override + public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ // Method is not native, otherwise pass 3 would not happen. int count = o.getCount(); @@ -1740,7 +1847,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitINVOKESPECIAL(INVOKESPECIAL o){ + @Override + public void visitINVOKESPECIAL(INVOKESPECIAL o){ try { // Don't init an object twice. if ( (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME)) && (!(stack().peek(o.getArgumentTypes(cpg).length) instanceof UninitializedObjectType)) ){ @@ -1832,7 +1940,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitINVOKESTATIC(INVOKESTATIC o){ + @Override + public void visitINVOKESTATIC(INVOKESTATIC o){ try { // Method is not native, otherwise pass 3 would not happen. @@ -1883,7 +1992,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ + @Override + public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ try { // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). @@ -1960,7 +2070,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIOR(IOR o){ + @Override + public void visitIOR(IOR o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1972,7 +2083,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIREM(IREM o){ + @Override + public void visitIREM(IREM o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1984,7 +2096,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIRETURN(IRETURN o){ + @Override + public void visitIRETURN(IRETURN o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1993,7 +2106,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitISHL(ISHL o){ + @Override + public void visitISHL(ISHL o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2005,7 +2119,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitISHR(ISHR o){ + @Override + public void visitISHR(ISHR o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2017,7 +2132,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitISTORE(ISTORE o){ + @Override + public void visitISTORE(ISTORE o){ //visitStoreInstruction(StoreInstruction) is called before. // Nothing else needs to be done here. @@ -2026,7 +2142,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitISUB(ISUB o){ + @Override + public void visitISUB(ISUB o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2038,7 +2155,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIUSHR(IUSHR o){ + @Override + public void visitIUSHR(IUSHR o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2050,7 +2168,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitIXOR(IXOR o){ + @Override + public void visitIXOR(IXOR o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2062,21 +2181,24 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitJSR(JSR o){ + @Override + public void visitJSR(JSR o){ // nothing to do here. } /** * Ensures the specific preconditions of the said instruction. */ - public void visitJSR_W(JSR_W o){ + @Override + public void visitJSR_W(JSR_W o){ // nothing to do here. } /** * Ensures the specific preconditions of the said instruction. */ - public void visitL2D(L2D o){ + @Override + public void visitL2D(L2D o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2085,7 +2207,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitL2F(L2F o){ + @Override + public void visitL2F(L2F o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2094,7 +2217,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitL2I(L2I o){ + @Override + public void visitL2I(L2I o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2103,7 +2227,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLADD(LADD o){ + @Override + public void visitLADD(LADD o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2115,7 +2240,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLALOAD(LALOAD o){ + @Override + public void visitLALOAD(LALOAD o){ indexOfInt(o, stack().peek()); if (stack().peek(1) == Type.NULL){ return; @@ -2132,7 +2258,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLAND(LAND o){ + @Override + public void visitLAND(LAND o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2144,7 +2271,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLASTORE(LASTORE o){ + @Override + public void visitLASTORE(LASTORE o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2164,7 +2292,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLCMP(LCMP o){ + @Override + public void visitLCMP(LCMP o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2176,14 +2305,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLCONST(LCONST o){ + @Override + public void visitLCONST(LCONST o){ // Nothing to do here. } /** * Ensures the specific preconditions of the said instruction. */ - public void visitLDC(LDC o){ + @Override + public void visitLDC(LDC o){ // visitCPInstruction is called first. Constant c = cpg.getConstant(o.getIndex()); @@ -2213,7 +2344,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLDC2_W(LDC2_W o){ + @Override + public void visitLDC2_W(LDC2_W o){ // visitCPInstruction is called first. Constant c = cpg.getConstant(o.getIndex()); @@ -2226,7 +2358,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLDIV(LDIV o){ + @Override + public void visitLDIV(LDIV o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2238,7 +2371,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLLOAD(LLOAD o){ + @Override + public void visitLLOAD(LLOAD o){ //visitLoadInstruction(LoadInstruction) is called before. // Nothing else needs to be done here. @@ -2247,7 +2381,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLMUL(LMUL o){ + @Override + public void visitLMUL(LMUL o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2259,7 +2394,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLNEG(LNEG o){ + @Override + public void visitLNEG(LNEG o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2268,7 +2404,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ + @Override + public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2278,7 +2415,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLOR(LOR o){ + @Override + public void visitLOR(LOR o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2290,7 +2428,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLREM(LREM o){ + @Override + public void visitLREM(LREM o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2302,7 +2441,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLRETURN(LRETURN o){ + @Override + public void visitLRETURN(LRETURN o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2311,7 +2451,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLSHL(LSHL o){ + @Override + public void visitLSHL(LSHL o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2323,7 +2464,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLSHR(LSHR o){ + @Override + public void visitLSHR(LSHR o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2335,7 +2477,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLSTORE(LSTORE o){ + @Override + public void visitLSTORE(LSTORE o){ //visitStoreInstruction(StoreInstruction) is called before. // Nothing else needs to be done here. @@ -2344,7 +2487,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLSUB(LSUB o){ + @Override + public void visitLSUB(LSUB o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2356,7 +2500,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLUSHR(LUSHR o){ + @Override + public void visitLUSHR(LUSHR o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2368,7 +2513,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLXOR(LXOR o){ + @Override + public void visitLXOR(LXOR o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2380,7 +2526,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitMONITORENTER(MONITORENTER o){ + @Override + public void visitMONITORENTER(MONITORENTER o){ if (! ((stack().peek()) instanceof ReferenceType)){ constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); } @@ -2390,7 +2537,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitMONITOREXIT(MONITOREXIT o){ + @Override + public void visitMONITOREXIT(MONITOREXIT o){ if (! ((stack().peek()) instanceof ReferenceType)){ constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); } @@ -2400,7 +2548,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitMULTIANEWARRAY(MULTIANEWARRAY o){ + @Override + public void visitMULTIANEWARRAY(MULTIANEWARRAY o){ int dimensions = o.getDimensions(); // Dimensions argument is okay: see Pass 3a. for (int i=0; i method if ((Frame._this != null) && (!(mg.getClassName().equals(Type.OBJECT.getClassName()))) ) { constraintViolated(o, "Leaving a constructor that itself did not call a constructor."); @@ -2656,7 +2814,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitSALOAD(SALOAD o){ + @Override + public void visitSALOAD(SALOAD o){ indexOfInt(o, stack().peek()); if (stack().peek(1) == Type.NULL){ return; @@ -2673,7 +2832,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitSASTORE(SASTORE o){ + @Override + public void visitSASTORE(SASTORE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2693,14 +2853,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitSIPUSH(SIPUSH o){ + @Override + public void visitSIPUSH(SIPUSH o){ // nothing to do here. Generic visitXXX() methods did the trick before. } /** * Ensures the specific preconditions of the said instruction. */ - public void visitSWAP(SWAP o){ + @Override + public void visitSWAP(SWAP o){ if (stack().peek().getSize() != 1){ constraintViolated(o, "The value at the stack top is not of size '1', but of size '"+stack().peek().getSize()+"'."); } @@ -2712,7 +2874,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitTABLESWITCH(TABLESWITCH o){ + @Override + public void visitTABLESWITCH(TABLESWITCH o){ indexOfInt(o, stack().peek()); // See Pass 3a. } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 64149f1b..661cb357 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -49,7 +49,8 @@ public class LocalVariables{ * operates on a new local variable array. * However, the Type objects in the array are shared. */ - protected Object clone(){ + @Override + protected Object clone(){ LocalVariables lvs = new LocalVariables(locals.length); for (int i=0; i) this.stack.clone(); return newstack; @@ -76,14 +77,16 @@ public class OperandStack{ /** @return a hash code value for the object. */ - public int hashCode() { return stack.hashCode(); } + @Override + public int hashCode() { return stack.hashCode(); } /** * Returns true if and only if this OperandStack * equals another, meaning equal lengths and equal * objects on the stacks. */ - public boolean equals(Object o){ + @Override + public boolean equals(Object o){ if (!(o instanceof OperandStack)) { return false; } @@ -189,7 +192,8 @@ public class OperandStack{ /** * Returns a String representation of this OperandStack instance. */ - public String toString(){ + @Override + public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("Slots used: "); sb.append(slotsUsed()); diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index ccb910d1..6f4f95eb 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -309,7 +309,8 @@ public final class Pass3bVerifier extends PassVerifier{ * @see org.apache.bcel.verifier.statics.LocalVariablesInfo * @see org.apache.bcel.verifier.statics.Pass2Verifier#getLocalVariablesInfo(int) */ - public VerificationResult do_verify(){ + @Override + public VerificationResult do_verify(){ if (! myOwner.doPass3a(method_no).equals(VerificationResult.VR_OK)){ return VerificationResult.VR_NOTYET; } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index cfca7f50..ece6c206 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -113,7 +113,8 @@ public class Subroutines{ * stack overflow errors due to recursive subSubs() calls. * Don't use this, then. */ - public String toString(){ + @Override + public String toString(){ String ret = "Subroutine: Local variable is '"+localVariable+"', JSRs are '"+theJSRs+"', RET is '"+theRET+"', Instructions: '"+instructions.toString()+"'."; ret += " Accessed local variable slots: '"; @@ -637,7 +638,8 @@ System.err.println("DEBUG: Please verify '"+any.toString(true)+"' lies in dead c /** * Returns a String representation of this object; merely for debugging puposes. */ - public String toString(){ + @Override + public String toString(){ return "---\n"+subroutines.toString()+"\n---\n"; } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index d49d8195..8638268d 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -52,7 +52,8 @@ public class UninitializedObjectType extends ReferenceType implements Constants{ /** @return a hash code value for the object. */ - public int hashCode() { return initialized.hashCode(); } + @Override + public int hashCode() { return initialized.hashCode(); } /** * Returns true on equality of this and o. @@ -60,7 +61,8 @@ public class UninitializedObjectType extends ReferenceType implements Constants{ * equal one another in this and the o instance. * */ - public boolean equals(Object o){ + @Override + public boolean equals(Object o){ if (! (o instanceof UninitializedObjectType)) { return false; } -- GitLab From 6322631182763bc438de98092988ff0dda6c96aa Mon Sep 17 00:00:00 2001 From: David Brosius Date: Fri, 29 Jul 2011 02:05:55 +0000 Subject: [PATCH 0517/1313] simplify git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1152074 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/AnnotationElementValue.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java index 31fb84cc..00e9dd10 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java @@ -45,9 +45,7 @@ public class AnnotationElementValue extends ElementValue @Override public String stringifyValue() { - StringBuffer sb = new StringBuffer(); - sb.append(annotationEntry.toString()); - return sb.toString(); + return annotationEntry.toString(); } @Override -- GitLab From a22e58002a52bb28fc8f81630623c84d4157b96f Mon Sep 17 00:00:00 2001 From: David Brosius Date: Fri, 29 Jul 2011 02:09:53 +0000 Subject: [PATCH 0518/1313] simplify git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1152075 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ElementValue.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index b18ae9a3..2e6a9d42 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -137,8 +137,6 @@ public abstract class ElementValue public String toShortString() { - StringBuffer result = new StringBuffer(); - result.append(stringifyValue()); - return result.toString(); + return stringifyValue(); } } -- GitLab From 18cd90b162ede071f20e855d592345851b1838f9 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Fri, 29 Jul 2011 02:29:42 +0000 Subject: [PATCH 0519/1313] use StringBuilder git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1152077 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AnnotationEntry.java | 2 +- .../bcel/classfile/ArrayElementValue.java | 4 ++-- .../java/org/apache/bcel/classfile/Code.java | 3 +-- .../apache/bcel/classfile/ConstantPool.java | 4 ++-- .../bcel/classfile/ElementValuePair.java | 2 +- .../apache/bcel/classfile/ExceptionTable.java | 2 +- .../java/org/apache/bcel/classfile/Field.java | 2 +- .../apache/bcel/classfile/InnerClasses.java | 2 +- .../org/apache/bcel/classfile/JavaClass.java | 4 ++-- .../bcel/classfile/LineNumberTable.java | 4 ++-- .../bcel/classfile/LocalVariableTable.java | 3 ++- .../classfile/LocalVariableTypeTable.java | 2 +- .../org/apache/bcel/classfile/Method.java | 4 ++-- .../org/apache/bcel/classfile/Signature.java | 2 +- .../org/apache/bcel/classfile/StackMap.java | 2 +- .../apache/bcel/classfile/StackMapEntry.java | 2 +- .../apache/bcel/classfile/StackMapTable.java | 2 +- .../bcel/classfile/StackMapTableEntry.java | 2 +- .../org/apache/bcel/classfile/Synthetic.java | 2 +- .../org/apache/bcel/classfile/Utility.java | 22 +++++++++---------- .../bcel/generic/AnnotationEntryGen.java | 4 ++-- .../bcel/generic/ArrayElementValueGen.java | 2 +- .../org/apache/bcel/generic/ArrayType.java | 2 +- .../apache/bcel/generic/ConstantPoolGen.java | 4 ++-- .../org/apache/bcel/generic/FieldGen.java | 2 +- .../apache/bcel/generic/InstructionList.java | 4 ++-- .../org/apache/bcel/generic/MethodGen.java | 2 +- .../java/org/apache/bcel/generic/Select.java | 2 +- .../java/org/apache/bcel/generic/Type.java | 4 ++-- .../java/org/apache/bcel/util/BCELifier.java | 4 ++-- .../java/org/apache/bcel/util/Class2HTML.java | 2 +- .../java/org/apache/bcel/util/ClassPath.java | 2 +- .../java/org/apache/bcel/util/CodeHTML.java | 4 ++-- .../org/apache/bcel/util/ConstantHTML.java | 2 +- .../apache/bcel/util/InstructionFinder.java | 8 +++---- .../verifier/structurals/LocalVariables.java | 2 +- .../verifier/structurals/OperandStack.java | 2 +- 37 files changed, 62 insertions(+), 62 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index fa4d9483..bc1cb243 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -137,7 +137,7 @@ public class AnnotationEntry implements Node, Constants, Serializable { } public String toShortString() { - final StringBuffer result = new StringBuffer(); + final StringBuilder result = new StringBuilder(); result.append("@"); result.append(getAnnotationType()); if (getElementValuePairs().length > 0) { diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java index 9b23fbe5..6fe0d3dc 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -28,7 +28,7 @@ public class ArrayElementValue extends ElementValue @Override public String toString() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("{"); for (int i = 0; i < evalues.length; i++) { @@ -63,7 +63,7 @@ public class ArrayElementValue extends ElementValue @Override public String stringifyValue() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < evalues.length; i++) { diff --git a/src/main/java/org/apache/bcel/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java index a7215e67..0fe5b351 100644 --- a/src/main/java/org/apache/bcel/classfile/Code.java +++ b/src/main/java/org/apache/bcel/classfile/Code.java @@ -304,8 +304,7 @@ public final class Code extends Attribute { * @return String representation of code chunk. */ public final String toString( boolean verbose ) { - StringBuffer buf; - buf = new StringBuffer(100); + StringBuilder buf = new StringBuilder(100); buf.append("Code(max_stack = ").append(max_stack).append(", max_locals = ").append( max_locals).append(", code_length = ").append(code_length).append(")\n").append( Utility.codeToString(code, constant_pool, 0, -1, verbose)); diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index 8621edef..b21ccc29 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -152,7 +152,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { private static final String escape( String str ) { int len = str.length(); - StringBuffer buf = new StringBuffer(len + 5); + StringBuilder buf = new StringBuilder(len + 5); char[] ch = str.toCharArray(); for (int i = 0; i < len; i++) { switch (ch[i]) { @@ -328,7 +328,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { */ @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 1; i < constant_pool_count; i++) { buf.append(i).append(")").append(constant_pool[i]).append("\n"); } diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index 1c19981a..5c20321f 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -63,7 +63,7 @@ public class ElementValuePair public String toShortString() { - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); result.append(getNameString()).append("=").append( getValue().toShortString()); return result.toString(); diff --git a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java index e99cc6cb..0ec0083c 100644 --- a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java @@ -155,7 +155,7 @@ public final class ExceptionTable extends Attribute { */ @Override public final String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); String str; for (int i = 0; i < number_of_exceptions; i++) { str = constant_pool.getConstantString(exception_index_table[i], diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java index 9f1b170e..ddafd859 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/bcel/classfile/Field.java @@ -121,7 +121,7 @@ public final class Field extends FieldOrMethod { access = access.equals("") ? "" : (access + " "); signature = Utility.signatureToString(getSignature()); name = getName(); - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append(access).append(signature).append(" ").append(name); ConstantValue cv = getConstantValue(); if (cv != null) { diff --git a/src/main/java/org/apache/bcel/classfile/InnerClasses.java b/src/main/java/org/apache/bcel/classfile/InnerClasses.java index f63814ff..2c0a3cc2 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClasses.java @@ -132,7 +132,7 @@ public final class InnerClasses extends Attribute { */ @Override public final String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 0; i < number_of_classes; i++) { buf.append(inner_classes[i].toString(constant_pool)).append("\n"); } diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index af55ed22..84770e8a 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -621,7 +621,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public String toString() { String access = Utility.accessToString(access_flags, true); access = access.equals("") ? "" : (access + " "); - StringBuffer buf = new StringBuffer(128); + StringBuilder buf = new StringBuilder(128); buf.append(access).append(Utility.classOrInterface(access_flags)).append(" ").append( class_name).append(" extends ").append( Utility.compactClassName(superclass_name, false)).append('\n'); @@ -672,7 +672,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl private static final String indent( Object obj ) { StringTokenizer tok = new StringTokenizer(obj.toString(), "\n"); - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); while (tok.hasMoreTokens()) { buf.append("\t").append(tok.nextToken()).append("\n"); } diff --git a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java index b8720012..fb70afc9 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java @@ -131,8 +131,8 @@ public final class LineNumberTable extends Attribute { */ @Override public final String toString() { - StringBuffer buf = new StringBuffer(); - StringBuffer line = new StringBuffer(); + StringBuilder buf = new StringBuilder(); + StringBuilder line = new StringBuilder(); String newLine = System.getProperty("line.separator", "\n"); for (int i = 0; i < line_number_table_length; i++) { line.append(line_number_table[i].toString()); diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index a1026b5d..79e7c062 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -126,6 +126,7 @@ public class LocalVariableTable extends Attribute { * same slot, use getLocalVariable(int index, int pc) instead. */ @Deprecated + @Deprecated public final LocalVariable getLocalVariable( int index ) { for (int i = 0; i < local_variable_table_length; i++) { if (local_variable_table[i].getIndex() == index) { @@ -170,7 +171,7 @@ public class LocalVariableTable extends Attribute { */ @Override public final String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 0; i < local_variable_table_length; i++) { buf.append(local_variable_table[i].toString()); if (i < local_variable_table_length - 1) { diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index 9ca2789a..699833b5 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -112,7 +112,7 @@ public final void dump(DataOutputStream file) throws IOException */ @Override public final String toString() { - StringBuffer buf = new StringBuffer(""); + StringBuilder buf = new StringBuilder(); for(int i=0; i < local_variable_type_table_length; i++) { buf.append(local_variable_type_table[i].toString()); diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index 3006f771..9b9aae9f 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -166,7 +166,7 @@ public final class Method extends FieldOrMethod { public final String toString() { ConstantUtf8 c; String name, signature, access; // Short cuts to constant pool - StringBuffer buf; + StringBuilder buf; access = Utility.accessToString(access_flags); // Get name and signature from constant pool c = (ConstantUtf8) constant_pool.getConstant(signature_index, Constants.CONSTANT_Utf8); @@ -175,7 +175,7 @@ public final class Method extends FieldOrMethod { name = c.getBytes(); signature = Utility.methodSignatureToString(signature, name, access, true, getLocalVariableTable()); - buf = new StringBuffer(signature); + buf = new StringBuilder(signature); for (int i = 0; i < attributes_count; i++) { Attribute a = attributes[i]; if (!((a instanceof Code) || (a instanceof ExceptionTable))) { diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index a3431717..fbd428b4 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -181,7 +181,7 @@ public final class Signature extends Attribute { } return; } - StringBuffer buf2 = new StringBuffer(); + StringBuilder buf2 = new StringBuilder(); ch = in.read(); do { buf2.append((char) ch); diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java index 81615ff9..0aa13d52 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMap.java +++ b/src/main/java/org/apache/bcel/classfile/StackMap.java @@ -113,7 +113,7 @@ public final class StackMap extends Attribute { */ @Override public final String toString() { - StringBuffer buf = new StringBuffer("StackMap("); + StringBuilder buf = new StringBuilder("StackMap("); for (int i = 0; i < map_length; i++) { buf.append(map[i].toString()); if (i < map_length - 1) { diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index ea2d8201..87258fa6 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -99,7 +99,7 @@ public final class StackMapEntry implements Cloneable, Serializable { */ @Override public final String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("(offset=").append(byte_code_offset); if (number_of_locals > 0) { buf.append(", locals={"); diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTable.java b/src/main/java/org/apache/bcel/classfile/StackMapTable.java index 305df256..3ed3a8bb 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTable.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTable.java @@ -113,7 +113,7 @@ public final class StackMapTable extends Attribute { */ @Override public final String toString() { - StringBuffer buf = new StringBuffer("StackMapTable("); + StringBuilder buf = new StringBuilder("StackMapTable("); for (int i = 0; i < map_length; i++) { buf.append(map[i].toString()); if (i < map_length - 1) { diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index ed3a5866..5cb134bc 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -156,7 +156,7 @@ public final class StackMapTableEntry implements Cloneable, Serializable { */ @Override public final String toString() { - StringBuffer buf = new StringBuffer(64); + StringBuilder buf = new StringBuilder(64); buf.append("("); if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { buf.append("SAME"); diff --git a/src/main/java/org/apache/bcel/classfile/Synthetic.java b/src/main/java/org/apache/bcel/classfile/Synthetic.java index 2f6bacf4..c143c175 100644 --- a/src/main/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/main/java/org/apache/bcel/classfile/Synthetic.java @@ -132,7 +132,7 @@ public final class Synthetic extends Attribute { */ @Override public final String toString() { - StringBuffer buf = new StringBuffer("Synthetic"); + StringBuilder buf = new StringBuilder("Synthetic"); if (length > 0) { buf.append(" ").append(Utility.toHexString(bytes)); } diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index d4b45e0d..ef5c0ba7 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -104,7 +104,7 @@ public abstract class Utility { * @return String representation of flags */ public static final String accessToString( int access_flags, boolean for_class ) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); int p = 0; for (int i = 0; p < Constants.MAX_ACC_FLAG; i++) { // Loop through known flags p = pow2(i); @@ -150,7 +150,7 @@ public abstract class Utility { */ public static final String codeToString( byte[] code, ConstantPool constant_pool, int index, int length, boolean verbose ) { - StringBuffer buf = new StringBuffer(code.length * 20); // Should be sufficient + StringBuilder buf = new StringBuilder(code.length * 20); // Should be sufficient ByteSequence stream = new ByteSequence(code); try { for (int i = 0; i < index; i++) { @@ -196,7 +196,7 @@ public abstract class Utility { int index, vindex, constant; int[] match, jump_table; int no_pad_bytes = 0, offset; - StringBuffer buf = new StringBuffer(Constants.OPCODE_NAMES[opcode]); + StringBuilder buf = new StringBuilder(Constants.OPCODE_NAMES[opcode]); /* Special case: Skip (0-3) padding bytes, i.e., the * following bytes are 4-byte-aligned */ @@ -527,7 +527,7 @@ public abstract class Utility { */ public final static String methodTypeToSignature( String ret, String[] argv ) throws ClassFormatException { - StringBuffer buf = new StringBuffer("("); + StringBuilder buf = new StringBuilder("("); String str; if (argv != null) { for (int i = 0; i < argv.length; i++) { @@ -664,7 +664,7 @@ public abstract class Utility { */ public static final String methodSignatureToString( String signature, String name, String access, boolean chopit, LocalVariableTable vars ) throws ClassFormatException { - StringBuffer buf = new StringBuffer("("); + StringBuilder buf = new StringBuilder("("); String type; int index; int var_index = (access.indexOf("static") >= 0) ? 0 : 1; @@ -821,10 +821,10 @@ public abstract class Utility { return "boolean"; case '[': { // Array declaration int n; - StringBuffer brackets; + StringBuilder brackets; String type; int consumed_chars; // Shadows global var - brackets = new StringBuffer(); // Accumulate []'s + brackets = new StringBuilder(); // Accumulate []'s // Count opening brackets and look for optional size argument for (n = 0; signature.charAt(n) == '['; n++) { brackets.append("[]"); @@ -856,7 +856,7 @@ public abstract class Utility { * @return byte code signature */ public static String getSignature( String type ) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); char[] chars = type.toCharArray(); boolean char_found = false, delim = false; int index = -1; @@ -1033,7 +1033,7 @@ public abstract class Utility { * @return bytes as hexadecimal string, e.g. 00 FA 12 ... */ public static final String toHexString( byte[] bytes ) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { short b = byteToShort(bytes[i]); String hex = Integer.toString(b, 0x10); @@ -1124,7 +1124,7 @@ public abstract class Utility { if (obj == null) { return null; } - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); if (braces) { buf.append('{'); } @@ -1349,7 +1349,7 @@ public abstract class Utility { */ public static final String convertString( String label ) { char[] ch = label.toCharArray(); - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 0; i < ch.length; i++) { switch (ch[i]) { case '\n': diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index cbb22eb4..bce75c84 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -167,7 +167,7 @@ public class AnnotationEntryGen @Override public String toString() { - StringBuffer s = new StringBuffer(); + StringBuilder s = new StringBuilder(32); s.append("AnnotationGen:[" + getTypeName() + " #" + evs.size() + " {"); for (int i = 0; i < evs.size(); i++) { @@ -181,7 +181,7 @@ public class AnnotationEntryGen public String toShortString() { - StringBuffer s = new StringBuffer(); + StringBuilder s = new StringBuilder(); s.append("@" + getTypeName() + "("); for (int i = 0; i < evs.size(); i++) { diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index 248ea1a0..1d292f7b 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -95,7 +95,7 @@ public class ArrayElementValueGen extends ElementValueGen @Override public String stringifyValue() { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append("["); String comma = ""; for (ElementValueGen element : evalues) { diff --git a/src/main/java/org/apache/bcel/generic/ArrayType.java b/src/main/java/org/apache/bcel/generic/ArrayType.java index 46ee9533..924c8f40 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayType.java +++ b/src/main/java/org/apache/bcel/generic/ArrayType.java @@ -75,7 +75,7 @@ public final class ArrayType extends ReferenceType { basic_type = type; break; } - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 0; i < this.dimensions; i++) { buf.append('['); } diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index 283155f5..50786550 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -78,7 +78,7 @@ public class ConstantPoolGen implements java.io.Serializable { * @param cs array of given constants, new ones will be appended */ public ConstantPoolGen(Constant[] cs) { - StringBuffer sb = new StringBuffer(256); + StringBuilder sb = new StringBuilder(256); size = Math.max(256, cs.length + 64); constants = new Constant[size]; @@ -718,7 +718,7 @@ public class ConstantPoolGen implements java.io.Serializable { */ @Override public String toString() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 1; i < index; i++) { buf.append(i).append(")").append(constants[i]).append("\n"); } diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index d7c2e912..eac8a558 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -318,7 +318,7 @@ public class FieldGen extends FieldGenOrMethodGen { access = access.equals("") ? "" : (access + " "); signature = type.toString(); name = getName(); - StringBuffer buf = new StringBuffer(32); + StringBuilder buf = new StringBuilder(32); buf.append(access).append(signature).append(" ").append(name); String value = getInitValue(); if (value != null) { diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 864ac639..e1fb11e5 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -712,7 +712,7 @@ public class InstructionList implements Serializable { for (InstructionHandle ih = first; ih != null; ih = ih.next) { ih.getInstruction().dispose(); // e.g. BranchInstructions release their targets } - StringBuffer buf = new StringBuffer("{ "); + StringBuilder buf = new StringBuilder("{ "); for (InstructionHandle ih = first; ih != null; ih = next) { next = ih.next; length--; @@ -987,7 +987,7 @@ public class InstructionList implements Serializable { * @return String containing all instructions in this list. */ public String toString( boolean verbose ) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (InstructionHandle ih = start; ih != null; ih = ih.next) { buf.append(ih.toString(verbose)).append("\n"); } diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 90b4c4a7..95d765b2 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -1080,7 +1080,7 @@ public class MethodGen extends FieldGenOrMethodGen { String signature = Type.getMethodSignature(type, arg_types); signature = Utility.methodSignatureToString(signature, name, access, true, getLocalVariableTable(cp)); - StringBuffer buf = new StringBuffer(signature); + StringBuilder buf = new StringBuilder(signature); for (int i = 0; i < getAttributes().length; i++) { Attribute a = getAttributes()[i]; if (!((a instanceof Code) || (a instanceof ExceptionTable))) { diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index e419ee19..11cbb624 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -133,7 +133,7 @@ public abstract class Select extends BranchInstruction implements VariableLength */ @Override public String toString( boolean verbose ) { - StringBuffer buf = new StringBuffer(super.toString(verbose)); + StringBuilder buf = new StringBuilder(super.toString(verbose)); if (verbose) { for (int i = 0; i < match_length; i++) { String s = "null"; diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 98b669b9..4972cd7d 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -142,7 +142,7 @@ public abstract class Type implements java.io.Serializable { * @return method signature for given type(s). */ public static String getMethodSignature( Type return_type, Type[] arg_types ) { - StringBuffer buf = new StringBuffer("("); + StringBuilder buf = new StringBuilder("("); int length = (arg_types == null) ? 0 : arg_types.length; for (int i = 0; i < length; i++) { buf.append(arg_types[i].getSignature()); @@ -309,7 +309,7 @@ public abstract class Type implements java.io.Serializable { public static String getSignature( java.lang.reflect.Method meth ) { - StringBuffer sb = new StringBuffer("("); + StringBuilder sb = new StringBuilder("("); Class[] params = meth.getParameterTypes(); // avoid clone for (int j = 0; j < params.length; j++) { sb.append(getType(params[j]).getSignature()); diff --git a/src/main/java/org/apache/bcel/util/BCELifier.java b/src/main/java/org/apache/bcel/util/BCELifier.java index 1efca2ff..d45379a4 100644 --- a/src/main/java/org/apache/bcel/util/BCELifier.java +++ b/src/main/java/org/apache/bcel/util/BCELifier.java @@ -195,7 +195,7 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { if (flags == 0) { return "0"; } - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 0, pow = 1; pow <= Constants.MAX_ACC_FLAG; i++) { if ((flags & pow) != 0) { if ((pow == Constants.ACC_SYNCHRONIZED) && (reason == FLAG_FOR_CLASS)) { @@ -221,7 +221,7 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { if (arg_types.length == 0) { return "Type.NO_ARGS"; } - StringBuffer args = new StringBuffer(); + StringBuilder args = new StringBuilder(); for (int i = 0; i < arg_types.length; i++) { args.append(printType(arg_types[i])); if (i < arg_types.length - 1) { diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index d4864801..8017ba2a 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -179,7 +179,7 @@ public class Class2HTML implements Constants { static String toHTML( String str ) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); try { // Filter any characters HTML doesn't like such as < and > in particular for (int i = 0; i < str.length(); i++) { char ch; diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 4b95565d..aef9ea74 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -168,7 +168,7 @@ public class ClassPath implements Serializable { } } } - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); String separator = ""; for (String path : list) { buf.append(separator); diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index e8efca4a..43c1f852 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -77,13 +77,13 @@ final class CodeHTML implements org.apache.bcel.Constants { */ private final String codeToHTML( ByteSequence bytes, int method_number ) throws IOException { short opcode = (short) bytes.readUnsignedByte(); - StringBuffer buf; + StringBuilder buf; String name, signature; int default_offset = 0, low, high; int index, class_index, vindex, constant; int[] jump_table; int no_pad_bytes = 0, offset; - buf = new StringBuffer(256); + buf = new StringBuilder(256); buf.append("").append(OPCODE_NAMES[opcode]).append(""); /* Special case: Skip (0-3) padding bytes, i.e., the * following bytes are 4-byte-aligned diff --git a/src/main/java/org/apache/bcel/util/ConstantHTML.java b/src/main/java/org/apache/bcel/util/ConstantHTML.java index d8db6ec4..c1136727 100644 --- a/src/main/java/org/apache/bcel/util/ConstantHTML.java +++ b/src/main/java/org/apache/bcel/util/ConstantHTML.java @@ -125,7 +125,7 @@ final class ConstantHTML implements org.apache.bcel.Constants { // Get return type string String type = Utility.methodSignatureReturnType(signature, false); String ret_type = Class2HTML.referenceType(type); - StringBuffer buf = new StringBuffer("("); + StringBuilder buf = new StringBuilder("("); for (int i = 0; i < args.length; i++) { buf.append(Class2HTML.referenceType(args[i])); if (i < args.length - 1) { diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index 73bba789..a34170dd 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -141,12 +141,12 @@ public class InstructionFinder { private static final String compilePattern( String pattern ) { //Bug: 38787 - Instructions are assumed to be english, to avoid odd Locale issues String lower = pattern.toLowerCase(Locale.ENGLISH); - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); int size = pattern.length(); for (int i = 0; i < size; i++) { char ch = lower.charAt(i); if (Character.isLetterOrDigit(ch)) { - StringBuffer name = new StringBuffer(); + StringBuilder name = new StringBuilder(); while ((Character.isLetterOrDigit(ch) || ch == '_') && i < size) { name.append(ch); if (++i < size) { @@ -372,7 +372,7 @@ public class InstructionFinder { } } // Add instruction alias to match anything - StringBuffer buf = new StringBuffer("("); + StringBuilder buf = new StringBuilder("("); for (short i = 0; i < NO_OPCODES; i++) { if (Constants.NO_OF_OPERANDS[i] != Constants.UNDEFINED) { // Not // an @@ -390,7 +390,7 @@ public class InstructionFinder { private static String precompile( short from, short to, short extra ) { - StringBuffer buf = new StringBuffer("("); + StringBuilder buf = new StringBuilder("("); for (short i = from; i <= to; i++) { buf.append(makeChar(i)); buf.append('|'); diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 661cb357..71443357 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -190,7 +190,7 @@ public class LocalVariables{ */ @Override public String toString(){ - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (int i=0; i Date: Fri, 29 Jul 2011 02:39:57 +0000 Subject: [PATCH 0520/1313] remove mistaken double annotation git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1152079 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/LocalVariableTable.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index 79e7c062..26f7a9f2 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -125,8 +125,6 @@ public class LocalVariableTable extends Attribute { * @deprecated since 5.2 because multiple variables can share the * same slot, use getLocalVariable(int index, int pc) instead. */ - @Deprecated - @Deprecated public final LocalVariable getLocalVariable( int index ) { for (int i = 0; i < local_variable_table_length; i++) { if (local_variable_table[i].getIndex() == index) { -- GitLab From 516c5030190fd6fe6894ce423622643286ec8211 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 29 Jul 2011 17:22:24 +0000 Subject: [PATCH 0521/1313] Add @Deprecated tags git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1152306 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Mini/ASCII_CharStream.java | 2 ++ src/main/java/org/apache/bcel/classfile/LocalVariableTable.java | 1 + 2 files changed, 3 insertions(+) diff --git a/src/examples/Mini/ASCII_CharStream.java b/src/examples/Mini/ASCII_CharStream.java index cfb1704a..11fc557b 100644 --- a/src/examples/Mini/ASCII_CharStream.java +++ b/src/examples/Mini/ASCII_CharStream.java @@ -215,6 +215,7 @@ public final class ASCII_CharStream * @see #getEndColumn */ + @Deprecated static public final int getColumn() { return bufcolumn[bufpos]; } @@ -224,6 +225,7 @@ public final class ASCII_CharStream * @see #getEndLine */ + @Deprecated static public final int getLine() { return bufline[bufpos]; } diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index 26f7a9f2..dda41f6b 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -125,6 +125,7 @@ public class LocalVariableTable extends Attribute { * @deprecated since 5.2 because multiple variables can share the * same slot, use getLocalVariable(int index, int pc) instead. */ + @java.lang.Deprecated public final LocalVariable getLocalVariable( int index ) { for (int i = 0; i < local_variable_table_length; i++) { if (local_variable_table[i].getIndex() == index) { -- GitLab From dacce848c849087d228757651d5b95ac310836c8 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 29 Jul 2011 17:31:23 +0000 Subject: [PATCH 0522/1313] Add missing @Override markers git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1152313 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/JasminVisitor.java | 8 ++++++++ src/examples/Mini/ASTExpr.java | 3 +++ src/examples/Mini/ASTFactor.java | 1 + src/examples/Mini/ASTFunAppl.java | 6 ++++++ src/examples/Mini/ASTFunDecl.java | 3 +++ src/examples/Mini/ASTIdent.java | 5 +++++ src/examples/Mini/ASTIfExpr.java | 6 ++++++ src/examples/Mini/ASTInteger.java | 5 +++++ src/examples/Mini/ASTLetExpr.java | 6 ++++++ src/examples/Mini/ASTProgram.java | 2 ++ src/examples/Mini/ASTTerm.java | 1 + src/examples/Mini/Environment.java | 2 ++ src/examples/Mini/Function.java | 1 + src/examples/Mini/ParseException.java | 1 + src/examples/Mini/SimpleNode.java | 1 + src/examples/Mini/Token.java | 1 + src/examples/Mini/TokenMgrError.java | 1 + src/examples/Mini/Variable.java | 1 + src/examples/TransitiveHull.java | 4 ++++ 19 files changed, 58 insertions(+) diff --git a/src/examples/JasminVisitor.java b/src/examples/JasminVisitor.java index cbc8f909..be4ef676 100644 --- a/src/examples/JasminVisitor.java +++ b/src/examples/JasminVisitor.java @@ -77,6 +77,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { out.close(); } + @Override public void visitJavaClass(JavaClass clazz) { out.println(";; Produced by JasminVisitor (BCEL)"); out.println(";; http://jakarta.apache.org/bcel/"); @@ -97,6 +98,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { out.print("\n"); } + @Override public void visitField(Field field) { out.print(".field " + Utility.accessToString(field.getAccessFlags()) + " \"" +field.getName() + "\"" + field.getSignature()); @@ -105,6 +107,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { } } + @Override public void visitConstantValue(ConstantValue cv) { out.println(" = " + cv); } @@ -124,14 +127,17 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { } } + @Override public void visitDeprecated(Deprecated attribute) { printEndMethod(attribute); } + @Override public void visitSynthetic(Synthetic attribute) { if(_method != null) { printEndMethod(attribute); } } + @Override public void visitMethod(Method method) { this._method = method; // Remember for use in subsequent visitXXX calls @@ -144,6 +150,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { } } + @Override public void visitExceptionTable(ExceptionTable e) { String[] names = e.getExceptionNames(); for(int i=0; i < names.length; i++) { @@ -155,6 +162,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { private Hashtable map; + @Override public void visitCode(Code code) { int label_counter = 0; diff --git a/src/examples/Mini/ASTExpr.java b/src/examples/Mini/ASTExpr.java index 3bce987d..3ce7b6c9 100644 --- a/src/examples/Mini/ASTExpr.java +++ b/src/examples/Mini/ASTExpr.java @@ -97,6 +97,7 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan /** * @return name of node, its kind and the number of children. */ + @Override public String toString() { String op=""; int len = (children != null)? children.length : 0; @@ -116,6 +117,7 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan * Called by the parser when the construction of this node is finished. * Casts children Node[] to precise ASTExpr[] type. */ + @Override public void closeNode() { if(children != null) { exprs = new ASTExpr[children.length]; @@ -315,6 +317,7 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan this.column = column; } + @Override public void dump(String prefix) { System.out.println(toString(prefix)); diff --git a/src/examples/Mini/ASTFactor.java b/src/examples/Mini/ASTFactor.java index 93e0ded8..da250d1c 100644 --- a/src/examples/Mini/ASTFactor.java +++ b/src/examples/Mini/ASTFactor.java @@ -45,6 +45,7 @@ public class ASTFactor extends ASTExpr { * Drop this node, if kind == -1, because then it has just one child node * and may be safely replaced with it. */ + @Override public ASTExpr traverse(Environment env) { if(kind == -1) { return exprs[0].traverse(env); diff --git a/src/examples/Mini/ASTFunAppl.java b/src/examples/Mini/ASTFunAppl.java index 62a3445e..9cf7b1de 100644 --- a/src/examples/Mini/ASTFunAppl.java +++ b/src/examples/Mini/ASTFunAppl.java @@ -56,6 +56,7 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, this.exprs = exprs; } + @Override public String toString() { return jjtNodeName[id] + " " + name.getName(); } @@ -63,6 +64,7 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, /** * Overrides ASTExpr.closeNode() */ + @Override public void closeNode() { name = (ASTIdent)children[0]; @@ -77,6 +79,7 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, /** * Overrides ASTExpr.traverse() */ + @Override public ASTExpr traverse(Environment env) { String fname = name.getName(); EnvEntry entry = env.get(fname); @@ -120,6 +123,7 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, * @return type of expression * @param expected type */ + @Override public int eval(int expected) { String fname = name.getName(); Function f = function; @@ -158,6 +162,7 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, /** * Fourth pass, produce Java code. */ + @Override public void code(StringBuffer buf) { String fname = name.getName(); // Function f = function; @@ -196,6 +201,7 @@ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, /** * Fifth pass, produce Java byte code. */ + @Override public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { String fname = name.getName(); // Function f = function; diff --git a/src/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java index 36f75c19..38efb057 100644 --- a/src/examples/Mini/ASTFunDecl.java +++ b/src/examples/Mini/ASTFunDecl.java @@ -85,6 +85,7 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { * Overrides SimpleNode.closeNode() * Cast children to appropiate type. */ + @Override public void closeNode() { name = (ASTIdent)children[0]; body = (ASTExpr)children[children.length - 1]; @@ -350,6 +351,7 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { /** * Overrides SimpleNode.toString() */ + @Override public String toString() { StringBuffer buf = new StringBuffer(); buf.append(jjtNodeName[id] + " " + name + "("); @@ -384,6 +386,7 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { /** * Overrides SimpleNode.dump() */ + @Override public void dump(String prefix) { System.out.println(toString(prefix)); diff --git a/src/examples/Mini/ASTIdent.java b/src/examples/Mini/ASTIdent.java index 191c8808..5fb76977 100644 --- a/src/examples/Mini/ASTIdent.java +++ b/src/examples/Mini/ASTIdent.java @@ -60,6 +60,7 @@ public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { /** * @return identifier and line/column number of appearance */ + @Override public String toString() { return super.toString() + " = " + name; } @@ -67,6 +68,7 @@ public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { /** * Overrides ASTExpr.traverse() */ + @Override public ASTExpr traverse(Environment env) { EnvEntry entry = env.get(name); @@ -85,6 +87,7 @@ public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { /** * Overrides AstExpr.eval() */ + @Override public int eval(int expected) { ASTIdent ident = reference.getName(); int t = ident.getType(); @@ -110,6 +113,7 @@ public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { /** * Fourth pass, produce Java code. */ + @Override public void code(StringBuffer buf) { if(name.equals("TRUE")) { ASTFunDecl.push(buf, "1"); @@ -123,6 +127,7 @@ public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { /** * Fifth pass, produce Java byte code. */ + @Override public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { if(name.equals("TRUE")) { il.append(new PUSH(cp, 1)); diff --git a/src/examples/Mini/ASTIfExpr.java b/src/examples/Mini/ASTIfExpr.java index 58904578..02c71b03 100644 --- a/src/examples/Mini/ASTIfExpr.java +++ b/src/examples/Mini/ASTIfExpr.java @@ -52,6 +52,7 @@ public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { * Overrides ASTExpr.closeNode() * Cast children nodes Node[] to appropiate type ASTExpr[] */ + @Override public void closeNode() { if_expr = (ASTExpr)children[0]; then_expr = (ASTExpr)children[1]; @@ -69,6 +70,7 @@ public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { /** * Overrides ASTExpr.traverse() */ + @Override public ASTExpr traverse(Environment env) { this.env = env; @@ -88,6 +90,7 @@ public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { * @return type of expression * @param expected type */ + @Override public int eval(int expected) { int then_type, else_type, if_type; @@ -138,6 +141,7 @@ public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { /** * Fourth pass, produce Java code. */ + @Override public void code(StringBuffer buf) { if_expr.code(buf); @@ -153,6 +157,7 @@ public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { /** * Fifth pass, produce Java byte code. */ + @Override public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { if_expr.byte_code(il, method, cp); @@ -172,6 +177,7 @@ public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { g.setTarget(il.append(InstructionConstants.NOP)); // May be optimized away later } + @Override public void dump(String prefix) { System.out.println(toString(prefix)); diff --git a/src/examples/Mini/ASTInteger.java b/src/examples/Mini/ASTInteger.java index 83bcdc2d..0e30d4a6 100644 --- a/src/examples/Mini/ASTInteger.java +++ b/src/examples/Mini/ASTInteger.java @@ -50,6 +50,7 @@ public class ASTInteger extends ASTExpr { /** * @return identifier and line/column number of appearance */ + @Override public String toString() { return super.toString() + " = " + value; } @@ -57,6 +58,7 @@ public class ASTInteger extends ASTExpr { /** * Overrides ASTExpr.traverse() */ + @Override public ASTExpr traverse(Environment env) { this.env = env; return this; // Nothing to reduce/traverse here @@ -67,6 +69,7 @@ public class ASTInteger extends ASTExpr { * Overrides AstExpr.eval() * @return type of expression */ + @Override public int eval(int expected) { is_simple = true; // (Very) simple expression, always true @@ -76,6 +79,7 @@ public class ASTInteger extends ASTExpr { /** * Fourth pass, produce Java code. */ + @Override public void code(StringBuffer buf) { ASTFunDecl.push(buf, "" + value); } @@ -83,6 +87,7 @@ public class ASTInteger extends ASTExpr { /** * Fifth pass, produce Java byte code. */ + @Override public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { il.append(new PUSH(cp, value)); ASTFunDecl.push(); } diff --git a/src/examples/Mini/ASTLetExpr.java b/src/examples/Mini/ASTLetExpr.java index 72ac3408..25f71226 100644 --- a/src/examples/Mini/ASTLetExpr.java +++ b/src/examples/Mini/ASTLetExpr.java @@ -56,6 +56,7 @@ public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { * Overrides ASTExpr.closeNode() * Cast children nodes to appropiate types. */ + @Override public void closeNode() { int i, len_2 = children.length / 2; /* length must be a multiple of * two (ident = expr) + 1 (body expr) */ @@ -75,6 +76,7 @@ public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { /** * Overrides ASTExpr.traverse() */ + @Override public ASTExpr traverse(Environment env) { this.env = env; @@ -108,6 +110,7 @@ public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { * @return type of expression * @param expected type */ + @Override public int eval(int expected) { //is_simple = true; @@ -124,6 +127,7 @@ public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { /** * Fifth pass, produce Java code. */ + @Override public void code(StringBuffer buf) { for(int i = 0; i < idents.length; i++) { String ident = idents[i].getName(); @@ -144,6 +148,7 @@ public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { /** * Fifth pass, produce Java byte code. */ + @Override public void byte_code(InstructionList il, MethodGen method, ConstantPoolGen cp) { int size = idents.length; LocalVariableGen[] l = new LocalVariableGen[size]; @@ -171,6 +176,7 @@ public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { } } + @Override public void dump(String prefix) { System.out.println(toString(prefix)); diff --git a/src/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java index 2d8bb78f..36efa98b 100644 --- a/src/examples/Mini/ASTProgram.java +++ b/src/examples/Mini/ASTProgram.java @@ -91,6 +91,7 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan * Overrides SimpleNode.closeNode(). * Cast children to appropiate type. */ + @Override public void closeNode() { if(children != null) { // Non-empty program ? fun_decls = new ASTFunDecl[children.length]; @@ -327,6 +328,7 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan } } + @Override public void dump(String prefix) { System.out.println(toString(prefix)); diff --git a/src/examples/Mini/ASTTerm.java b/src/examples/Mini/ASTTerm.java index fbbffa17..ac4e637d 100644 --- a/src/examples/Mini/ASTTerm.java +++ b/src/examples/Mini/ASTTerm.java @@ -45,6 +45,7 @@ public class ASTTerm extends ASTExpr { * Drop this node, if kind == -1, because then it has just one child node * and may be safely replaced with it. */ + @Override public ASTExpr traverse(Environment env) { if(kind == -1) { return exprs[0].traverse(env); diff --git a/src/examples/Mini/Environment.java b/src/examples/Mini/Environment.java index c9e3f111..84cb55c4 100644 --- a/src/examples/Mini/Environment.java +++ b/src/examples/Mini/Environment.java @@ -154,6 +154,7 @@ public class Environment implements Cloneable { return -1; } + @Override public Object clone() { Vector[] copy = new Vector[size]; @@ -175,6 +176,7 @@ public class Environment implements Cloneable { return new Environment(copy); } + @Override public String toString() { StringBuffer buf = new StringBuffer(); diff --git a/src/examples/Mini/Function.java b/src/examples/Mini/Function.java index e7d54423..e2c8e0ca 100644 --- a/src/examples/Mini/Function.java +++ b/src/examples/Mini/Function.java @@ -48,6 +48,7 @@ public class Function implements org.apache.bcel.Constants, EnvEntry { setArgs(args); } + @Override public String toString() { StringBuffer buf = new StringBuffer(); diff --git a/src/examples/Mini/ParseException.java b/src/examples/Mini/ParseException.java index 6e2d4884..57fc4646 100644 --- a/src/examples/Mini/ParseException.java +++ b/src/examples/Mini/ParseException.java @@ -111,6 +111,7 @@ public class ParseException extends Exception { * of the final stack trace, and hence the correct error message * gets displayed. */ + @Override public String getMessage() { if (!specialConstructor) { return super.getMessage(); diff --git a/src/examples/Mini/SimpleNode.java b/src/examples/Mini/SimpleNode.java index 6a4156ba..668d5612 100644 --- a/src/examples/Mini/SimpleNode.java +++ b/src/examples/Mini/SimpleNode.java @@ -77,6 +77,7 @@ public abstract class SimpleNode implements Node { toString(String), otherwise overriding toString() is probably all you need to do. */ + @Override public String toString() { return MiniParserTreeConstants.jjtNodeName[id]; } public String toString(String prefix) { return prefix + toString(); } diff --git a/src/examples/Mini/Token.java b/src/examples/Mini/Token.java index f309f1b0..079af4ad 100644 --- a/src/examples/Mini/Token.java +++ b/src/examples/Mini/Token.java @@ -70,6 +70,7 @@ public class Token { /** * Returns the image. */ + @Override public final String toString() { return image; diff --git a/src/examples/Mini/TokenMgrError.java b/src/examples/Mini/TokenMgrError.java index 19f46cc0..4fa9d93d 100644 --- a/src/examples/Mini/TokenMgrError.java +++ b/src/examples/Mini/TokenMgrError.java @@ -128,6 +128,7 @@ public class TokenMgrError extends Error * * from this method for such cases in the release version of your parser. */ + @Override public String getMessage() { return super.getMessage(); } diff --git a/src/examples/Mini/Variable.java b/src/examples/Mini/Variable.java index b8954be6..d072ac88 100644 --- a/src/examples/Mini/Variable.java +++ b/src/examples/Mini/Variable.java @@ -45,6 +45,7 @@ public class Variable implements EnvEntry { column = name.getColumn(); } + @Override public String toString() { if(!reserved) { return var_name + " declared at line " + line + ", column " + column; diff --git a/src/examples/TransitiveHull.java b/src/examples/TransitiveHull.java index 1fa84c75..064f7a86 100644 --- a/src/examples/TransitiveHull.java +++ b/src/examples/TransitiveHull.java @@ -106,6 +106,7 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { } } + @Override public void visitConstantClass(ConstantClass cc) { String class_name = (String) cc.getConstantValue(_cp); add(class_name); @@ -145,14 +146,17 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { } } + @Override public void visitConstantMethodref(ConstantMethodref cmr) { visitRef(cmr, true); } + @Override public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref cimr) { visitRef(cimr, true); } + @Override public void visitConstantFieldref(ConstantFieldref cfr) { visitRef(cfr, false); } -- GitLab From faaeefd2a43324c7ccf0e22b8be591e97e2c3a92 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 29 Jul 2011 17:34:26 +0000 Subject: [PATCH 0523/1313] Use static access to access static methods git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1152317 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Mini/MiniC.java | 6 +-- src/examples/Mini/MiniParser.java | 18 ++++---- src/examples/Mini/MiniParserTokenManager.java | 46 +++++++++---------- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/examples/Mini/MiniC.java b/src/examples/Mini/MiniC.java index db8a64c1..03c008fc 100644 --- a/src/examples/Mini/MiniC.java +++ b/src/examples/Mini/MiniC.java @@ -67,7 +67,7 @@ public class MiniC implements org.apache.bcel.Constants { if(j == 0) { parser = new MiniParser(new java.io.FileInputStream(file_name[0])); } else { - parser.ReInit(new java.io.FileInputStream(file_name[j])); + MiniParser.ReInit(new java.io.FileInputStream(file_name[j])); } int index = file_name[j].lastIndexOf('.'); @@ -84,8 +84,8 @@ public class MiniC implements org.apache.bcel.Constants { file = file_name[j]; System.out.println("Parsing ..."); - parser.Program(); - ASTProgram program = (ASTProgram)parser.jjtree.rootNode(); + MiniParser.Program(); + ASTProgram program = (ASTProgram)MiniParser.jjtree.rootNode(); System.out.println("Pass 1: Optimizing parse tree ..."); pass = 1; diff --git a/src/examples/Mini/MiniParser.java b/src/examples/Mini/MiniParser.java index a5ce6c38..22106af4 100644 --- a/src/examples/Mini/MiniParser.java +++ b/src/examples/Mini/MiniParser.java @@ -869,8 +869,8 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini } static public void ReInit(java.io.InputStream stream) { - jj_input_stream.ReInit(stream, 1, 1); - token_source.ReInit(jj_input_stream); + ASCII_CharStream.ReInit(stream, 1, 1); + MiniParserTokenManager.ReInit(jj_input_stream); token = new Token(); jj_ntk = -1; jjtree.reset(); @@ -905,8 +905,8 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini } static public void ReInit(java.io.Reader stream) { - jj_input_stream.ReInit(stream, 1, 1); - token_source.ReInit(jj_input_stream); + ASCII_CharStream.ReInit(stream, 1, 1); + MiniParserTokenManager.ReInit(jj_input_stream); token = new Token(); jj_ntk = -1; jjtree.reset(); @@ -958,7 +958,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini if ((oldToken = token).next != null) { token = token.next; } else { - token = token.next = token_source.getNextToken(); + token = token.next = MiniParserTokenManager.getNextToken(); } jj_ntk = -1; if (token.kind == kind) { @@ -986,7 +986,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini if (jj_scanpos == jj_lastpos) { jj_la--; if (jj_scanpos.next == null) { - jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken(); + jj_lastpos = jj_scanpos = jj_scanpos.next = MiniParserTokenManager.getNextToken(); } else { jj_lastpos = jj_scanpos = jj_scanpos.next; } @@ -1007,7 +1007,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini if (token.next != null) { token = token.next; } else { - token = token.next = token_source.getNextToken(); + token = token.next = MiniParserTokenManager.getNextToken(); } jj_ntk = -1; jj_gen++; @@ -1020,7 +1020,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini if (t.next != null) { t = t.next; } else { - t = t.next = token_source.getNextToken(); + t = t.next = MiniParserTokenManager.getNextToken(); } } return t; @@ -1028,7 +1028,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini static final private int jj_ntk() { if ((jj_nt=token.next) == null) { - return (jj_ntk = (token.next=token_source.getNextToken()).kind); + return (jj_ntk = (token.next=MiniParserTokenManager.getNextToken()).kind); } else { return (jj_ntk = jj_nt.kind); } diff --git a/src/examples/Mini/MiniParserTokenManager.java b/src/examples/Mini/MiniParserTokenManager.java index 8d3af42b..517e7db5 100644 --- a/src/examples/Mini/MiniParserTokenManager.java +++ b/src/examples/Mini/MiniParserTokenManager.java @@ -128,7 +128,7 @@ static private final int jjMoveNfa_1(int startState, int curPos) if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt))) { return curPos; } - try { curChar = input_stream.readChar(); } + try { curChar = ASCII_CharStream.readChar(); } catch(java.io.IOException e) { return curPos; } } } @@ -194,7 +194,7 @@ static private final int jjStartNfaWithStates_0(int pos, int kind, int state) { jjmatchedKind = kind; jjmatchedPos = pos; - try { curChar = input_stream.readChar(); } + try { curChar = ASCII_CharStream.readChar(); } catch(java.io.IOException e) { return pos + 1; } return jjMoveNfa_0(state, pos + 1); } @@ -255,7 +255,7 @@ static private final int jjMoveStringLiteralDfa0_0() } static private final int jjMoveStringLiteralDfa1_0(long active0) { - try { curChar = input_stream.readChar(); } + try { curChar = ASCII_CharStream.readChar(); } catch(java.io.IOException e) { jjStopStringLiteralDfa_0(0, active0); return 1; @@ -318,7 +318,7 @@ static private final int jjMoveStringLiteralDfa2_0(long old0, long active0) if (((active0 &= old0)) == 0L) { return jjStartNfa_0(0, old0); } - try { curChar = input_stream.readChar(); } + try { curChar = ASCII_CharStream.readChar(); } catch(java.io.IOException e) { jjStopStringLiteralDfa_0(1, active0); return 2; @@ -362,7 +362,7 @@ static private final int jjMoveStringLiteralDfa3_0(long old0, long active0) if (((active0 &= old0)) == 0L) { return jjStartNfa_0(1, old0); } - try { curChar = input_stream.readChar(); } + try { curChar = ASCII_CharStream.readChar(); } catch(java.io.IOException e) { jjStopStringLiteralDfa_0(2, active0); return 3; @@ -400,7 +400,7 @@ static private final int jjMoveStringLiteralDfa4_0(long old0, long active0) if (((active0 &= old0)) == 0L) { return jjStartNfa_0(2, old0); } - try { curChar = input_stream.readChar(); } + try { curChar = ASCII_CharStream.readChar(); } catch(java.io.IOException e) { jjStopStringLiteralDfa_0(3, active0); return 4; @@ -549,7 +549,7 @@ static private final int jjMoveNfa_0(int startState, int curPos) if ((i = jjnewStateCnt) == (startsAt = 6 - (jjnewStateCnt = startsAt))) { return curPos; } - try { curChar = input_stream.readChar(); } + try { curChar = ASCII_CharStream.readChar(); } catch(java.io.IOException e) { return curPos; } } } @@ -636,11 +636,11 @@ static private final Token jjFillToken() Token t = Token.newToken(jjmatchedKind); t.kind = jjmatchedKind; String im = jjstrLiteralImages[jjmatchedKind]; - t.image = (im == null) ? input_stream.GetImage() : im; - t.beginLine = input_stream.getBeginLine(); - t.beginColumn = input_stream.getBeginColumn(); - t.endLine = input_stream.getEndLine(); - t.endColumn = input_stream.getEndColumn(); + t.image = (im == null) ? ASCII_CharStream.GetImage() : im; + t.beginLine = ASCII_CharStream.getBeginLine(); + t.beginColumn = ASCII_CharStream.getBeginColumn(); + t.endLine = ASCII_CharStream.getEndLine(); + t.endColumn = ASCII_CharStream.getEndColumn(); return t; } @@ -662,7 +662,7 @@ public static final Token getNextToken() { try { - curChar = input_stream.BeginToken(); + curChar = ASCII_CharStream.BeginToken(); } catch(java.io.IOException e) { @@ -679,9 +679,9 @@ public static final Token getNextToken() switch(curLexState) { case 0: - try { input_stream.backup(0); + try { ASCII_CharStream.backup(0); while (curChar <= 32 && (0x100003600L & (1L << curChar)) != 0L) { - curChar = input_stream.BeginToken(); + curChar = ASCII_CharStream.BeginToken(); } } catch (java.io.IOException e1) { continue EOFLoop; } @@ -702,7 +702,7 @@ public static final Token getNextToken() if (jjmatchedKind != 0x7fffffff) { if (jjmatchedPos + 1 < curPos) { - input_stream.backup(curPos - jjmatchedPos - 1); + ASCII_CharStream.backup(curPos - jjmatchedPos - 1); } if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) { @@ -741,19 +741,19 @@ public static final Token getNextToken() curPos = 0; jjmatchedKind = 0x7fffffff; try { - curChar = input_stream.readChar(); + curChar = ASCII_CharStream.readChar(); continue; } catch (java.io.IOException e1) { } } - int error_line = input_stream.getEndLine(); - int error_column = input_stream.getEndColumn(); + int error_line = ASCII_CharStream.getEndLine(); + int error_column = ASCII_CharStream.getEndColumn(); String error_after = null; boolean EOFSeen = false; - try { input_stream.readChar(); input_stream.backup(1); } + try { ASCII_CharStream.readChar(); ASCII_CharStream.backup(1); } catch (java.io.IOException e1) { EOFSeen = true; - error_after = curPos <= 1 ? "" : input_stream.GetImage(); + error_after = curPos <= 1 ? "" : ASCII_CharStream.GetImage(); if (curChar == '\n' || curChar == '\r') { error_line++; error_column = 0; @@ -762,8 +762,8 @@ public static final Token getNextToken() } } if (!EOFSeen) { - input_stream.backup(1); - error_after = curPos <= 1 ? "" : input_stream.GetImage(); + ASCII_CharStream.backup(1); + error_after = curPos <= 1 ? "" : ASCII_CharStream.GetImage(); } throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR); } -- GitLab From 1055361611b21b19d92688c8fc813cb63b8245a8 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 29 Jul 2011 17:39:56 +0000 Subject: [PATCH 0524/1313] Unnecessary ; git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1152318 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Mini/MiniParser.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/examples/Mini/MiniParser.java b/src/examples/Mini/MiniParser.java index 22106af4..11c2cb0f 100644 --- a/src/examples/Mini/MiniParser.java +++ b/src/examples/Mini/MiniParser.java @@ -38,7 +38,6 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 9: - ; break; default: jj_la1[0] = jj_gen; @@ -99,7 +98,6 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: - ; break; default: jj_la1[1] = jj_gen; @@ -111,7 +109,6 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini break; default: jj_la1[2] = jj_gen; - ; } jj_consume_token(RPAREN); jj_consume_token(ASSIGN); @@ -177,7 +174,6 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini break; default: jj_la1[3] = jj_gen; - ; } break; case NOT: @@ -243,7 +239,6 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini break; default: jj_la1[5] = jj_gen; - ; } jj_consume_token(13); } catch (Throwable jjte000) { @@ -294,7 +289,6 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini case READ: case WRITE: case IDENT: - ; break; default: jj_la1[6] = jj_gen; @@ -358,7 +352,6 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: - ; break; default: jj_la1[7] = jj_gen; @@ -370,7 +363,6 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini break; default: jj_la1[8] = jj_gen; - ; } jj_consume_token(RPAREN); jjtree.closeNodeScope(jjtn000, true); @@ -427,7 +419,6 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini break; default: jj_la1[9] = jj_gen; - ; } jjtree.closeNodeScope(jjtn000, true); jjtc000 = false; @@ -482,7 +473,6 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini break; default: jj_la1[10] = jj_gen; - ; } jjtree.closeNodeScope(jjtn000, true); jjtc000 = false; -- GitLab From b7fcc3edecff897bfac4ee376b4338d2290d4810 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 29 Jul 2011 17:41:39 +0000 Subject: [PATCH 0525/1313] Generics git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1152320 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Mini/MiniParser.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/examples/Mini/MiniParser.java b/src/examples/Mini/MiniParser.java index 11c2cb0f..765f19f7 100644 --- a/src/examples/Mini/MiniParser.java +++ b/src/examples/Mini/MiniParser.java @@ -1024,7 +1024,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini } } - static private java.util.Vector jj_expentries = new java.util.Vector(); + static private java.util.Vector jj_expentries = new java.util.Vector(); static private int[] jj_expentry; static private int jj_kind = -1; static private int[] jj_lasttokens = new int[100]; @@ -1042,8 +1042,8 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jj_expentry[i] = jj_lasttokens[i]; } boolean exists = false; - for (java.util.Enumeration e = jj_expentries.elements(); e.hasMoreElements();) { - int[] oldentry = (int[])(e.nextElement()); + for (java.util.Enumeration e = jj_expentries.elements(); e.hasMoreElements();) { + int[] oldentry = (e.nextElement()); if (oldentry.length == jj_expentry.length) { exists = true; for (int i = 0; i < jj_expentry.length; i++) { @@ -1100,7 +1100,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jj_add_error_token(0, 0); int[][] exptokseq = new int[jj_expentries.size()][]; for (int i = 0; i < jj_expentries.size(); i++) { - exptokseq[i] = (int[])jj_expentries.elementAt(i); + exptokseq[i] = jj_expentries.elementAt(i); } return new ParseException(token, exptokseq, tokenImage); } -- GitLab From b0451cf3de38844db11faac0e6d91fe613436708 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 29 Jul 2011 17:47:45 +0000 Subject: [PATCH 0526/1313] Generics git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1152325 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Mini/MiniC.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/examples/Mini/MiniC.java b/src/examples/Mini/MiniC.java index 03c008fc..1d3e8abb 100644 --- a/src/examples/Mini/MiniC.java +++ b/src/examples/Mini/MiniC.java @@ -25,8 +25,8 @@ import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.ConstantPoolGen; public class MiniC implements org.apache.bcel.Constants { - private static Vector errors = null; - private static Vector warnings = null; + private static Vector errors = null; + private static Vector warnings = null; private static String file = null; private static int pass = 0; @@ -60,8 +60,8 @@ public class MiniC implements org.apache.bcel.Constants { } for(int j=0; j < files; j++) { - errors = new Vector(); - warnings = new Vector(); + errors = new Vector(); + warnings = new Vector(); pass = 0; if(j == 0) { -- GitLab From 73503e6ba17ed20b4348a023cbd400b42a1ea615 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 15 Aug 2011 23:17:19 +0000 Subject: [PATCH 0527/1313] methods in interfaces are both public and abstract by default git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1158060 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AttributeReader.java | 2 +- .../apache/bcel/classfile/ConstantObject.java | 2 +- .../java/org/apache/bcel/classfile/Node.java | 2 +- .../org/apache/bcel/classfile/Visitor.java | 80 ++-- .../apache/bcel/generic/ClassObserver.java | 2 +- .../bcel/generic/CompoundInstruction.java | 2 +- .../bcel/generic/ConstantPushInstruction.java | 2 +- .../apache/bcel/generic/ExceptionThrower.java | 2 +- .../apache/bcel/generic/FieldObserver.java | 2 +- .../bcel/generic/IndexedInstruction.java | 4 +- .../bcel/generic/InstructionComparator.java | 2 +- .../bcel/generic/InstructionListObserver.java | 2 +- .../bcel/generic/InstructionTargeter.java | 4 +- .../apache/bcel/generic/MethodObserver.java | 2 +- .../apache/bcel/generic/NamedAndTyped.java | 8 +- .../apache/bcel/generic/StackConsumer.java | 2 +- .../apache/bcel/generic/StackProducer.java | 2 +- .../apache/bcel/generic/TypedInstruction.java | 2 +- .../java/org/apache/bcel/generic/Visitor.java | 362 +++++++++--------- .../org/apache/bcel/util/BCELComparator.java | 4 +- .../java/org/apache/bcel/util/Repository.java | 14 +- .../verifier/VerifierFactoryObserver.java | 2 +- .../structurals/InstructionContext.java | 4 +- .../bcel/verifier/structurals/Subroutine.java | 14 +- 24 files changed, 262 insertions(+), 262 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AttributeReader.java b/src/main/java/org/apache/bcel/classfile/AttributeReader.java index b8cdfc23..c48d3abf 100644 --- a/src/main/java/org/apache/bcel/classfile/AttributeReader.java +++ b/src/main/java/org/apache/bcel/classfile/AttributeReader.java @@ -54,6 +54,6 @@ public interface AttributeReader { @see Attribute#addAttributeReader( String, AttributeReader ) */ - public Attribute createAttribute( int name_index, int length, java.io.DataInputStream file, + Attribute createAttribute( int name_index, int length, java.io.DataInputStream file, ConstantPool constant_pool ); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantObject.java b/src/main/java/org/apache/bcel/classfile/ConstantObject.java index 28436215..c9936ad6 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantObject.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantObject.java @@ -29,5 +29,5 @@ public interface ConstantObject { /** @return object representing the constant, e.g., Long for ConstantLong */ - public abstract Object getConstantValue( ConstantPool cp ); + Object getConstantValue( ConstantPool cp ); } diff --git a/src/main/java/org/apache/bcel/classfile/Node.java b/src/main/java/org/apache/bcel/classfile/Node.java index ecda28b1..9594f8b1 100644 --- a/src/main/java/org/apache/bcel/classfile/Node.java +++ b/src/main/java/org/apache/bcel/classfile/Node.java @@ -25,5 +25,5 @@ package org.apache.bcel.classfile; */ public interface Node { - public void accept( Visitor obj ); + void accept( Visitor obj ); } diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java index 3a24c90d..7374d40b 100644 --- a/src/main/java/org/apache/bcel/classfile/Visitor.java +++ b/src/main/java/org/apache/bcel/classfile/Visitor.java @@ -27,83 +27,83 @@ package org.apache.bcel.classfile; */ public interface Visitor { - public void visitCode(Code obj); + void visitCode(Code obj); - public void visitCodeException(CodeException obj); + void visitCodeException(CodeException obj); - public void visitConstantClass(ConstantClass obj); + void visitConstantClass(ConstantClass obj); - public void visitConstantDouble(ConstantDouble obj); + void visitConstantDouble(ConstantDouble obj); - public void visitConstantFieldref(ConstantFieldref obj); + void visitConstantFieldref(ConstantFieldref obj); - public void visitConstantFloat(ConstantFloat obj); + void visitConstantFloat(ConstantFloat obj); - public void visitConstantInteger(ConstantInteger obj); + void visitConstantInteger(ConstantInteger obj); - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj); + void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj); - public void visitConstantLong(ConstantLong obj); + void visitConstantLong(ConstantLong obj); - public void visitConstantMethodref(ConstantMethodref obj); + void visitConstantMethodref(ConstantMethodref obj); - public void visitConstantNameAndType(ConstantNameAndType obj); + void visitConstantNameAndType(ConstantNameAndType obj); - public void visitConstantPool(ConstantPool obj); + void visitConstantPool(ConstantPool obj); - public void visitConstantString(ConstantString obj); + void visitConstantString(ConstantString obj); - public void visitConstantUtf8(ConstantUtf8 obj); + void visitConstantUtf8(ConstantUtf8 obj); - public void visitConstantValue(ConstantValue obj); + void visitConstantValue(ConstantValue obj); - public void visitDeprecated(Deprecated obj); + void visitDeprecated(Deprecated obj); - public void visitExceptionTable(ExceptionTable obj); + void visitExceptionTable(ExceptionTable obj); - public void visitField(Field obj); + void visitField(Field obj); - public void visitInnerClass(InnerClass obj); + void visitInnerClass(InnerClass obj); - public void visitInnerClasses(InnerClasses obj); + void visitInnerClasses(InnerClasses obj); - public void visitJavaClass(JavaClass obj); + void visitJavaClass(JavaClass obj); - public void visitLineNumber(LineNumber obj); + void visitLineNumber(LineNumber obj); - public void visitLineNumberTable(LineNumberTable obj); + void visitLineNumberTable(LineNumberTable obj); - public void visitLocalVariable(LocalVariable obj); + void visitLocalVariable(LocalVariable obj); - public void visitLocalVariableTable(LocalVariableTable obj); + void visitLocalVariableTable(LocalVariableTable obj); - public void visitMethod(Method obj); + void visitMethod(Method obj); - public void visitSignature(Signature obj); + void visitSignature(Signature obj); - public void visitSourceFile(SourceFile obj); + void visitSourceFile(SourceFile obj); - public void visitSynthetic(Synthetic obj); + void visitSynthetic(Synthetic obj); - public void visitUnknown(Unknown obj); + void visitUnknown(Unknown obj); - public void visitStackMap(StackMap obj); + void visitStackMap(StackMap obj); - public void visitStackMapEntry(StackMapEntry obj); + void visitStackMapEntry(StackMapEntry obj); - public void visitStackMapTable(StackMapTable obj); + void visitStackMapTable(StackMapTable obj); - public void visitStackMapTableEntry(StackMapTableEntry obj); + void visitStackMapTableEntry(StackMapTableEntry obj); - public void visitAnnotation(Annotations obj); + void visitAnnotation(Annotations obj); - public void visitParameterAnnotation(ParameterAnnotations obj); + void visitParameterAnnotation(ParameterAnnotations obj); - public void visitAnnotationEntry(AnnotationEntry obj); + void visitAnnotationEntry(AnnotationEntry obj); - public void visitAnnotationDefault(AnnotationDefault obj); + void visitAnnotationDefault(AnnotationDefault obj); - public void visitLocalVariableTypeTable(LocalVariableTypeTable obj); + void visitLocalVariableTypeTable(LocalVariableTypeTable obj); - public void visitEnclosingMethod(EnclosingMethod obj); + void visitEnclosingMethod(EnclosingMethod obj); } diff --git a/src/main/java/org/apache/bcel/generic/ClassObserver.java b/src/main/java/org/apache/bcel/generic/ClassObserver.java index dfe4c997..0793aac2 100644 --- a/src/main/java/org/apache/bcel/generic/ClassObserver.java +++ b/src/main/java/org/apache/bcel/generic/ClassObserver.java @@ -26,5 +26,5 @@ package org.apache.bcel.generic; */ public interface ClassObserver { - public void notify( ClassGen clazz ); + void notify( ClassGen clazz ); } diff --git a/src/main/java/org/apache/bcel/generic/CompoundInstruction.java b/src/main/java/org/apache/bcel/generic/CompoundInstruction.java index 94e7b04b..7ed9573c 100644 --- a/src/main/java/org/apache/bcel/generic/CompoundInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CompoundInstruction.java @@ -35,5 +35,5 @@ package org.apache.bcel.generic; */ public interface CompoundInstruction { - public InstructionList getInstructionList(); + InstructionList getInstructionList(); } diff --git a/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java b/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java index 96b11ebf..1e511b6e 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java @@ -29,5 +29,5 @@ package org.apache.bcel.generic; */ public interface ConstantPushInstruction extends PushInstruction, TypedInstruction { - public Number getValue(); + Number getValue(); } diff --git a/src/main/java/org/apache/bcel/generic/ExceptionThrower.java b/src/main/java/org/apache/bcel/generic/ExceptionThrower.java index dd0996bf..2777fdb0 100644 --- a/src/main/java/org/apache/bcel/generic/ExceptionThrower.java +++ b/src/main/java/org/apache/bcel/generic/ExceptionThrower.java @@ -39,5 +39,5 @@ package org.apache.bcel.generic; */ public interface ExceptionThrower { - public java.lang.Class[] getExceptions(); + java.lang.Class[] getExceptions(); } diff --git a/src/main/java/org/apache/bcel/generic/FieldObserver.java b/src/main/java/org/apache/bcel/generic/FieldObserver.java index a492c5a6..eef97e8f 100644 --- a/src/main/java/org/apache/bcel/generic/FieldObserver.java +++ b/src/main/java/org/apache/bcel/generic/FieldObserver.java @@ -26,5 +26,5 @@ package org.apache.bcel.generic; */ public interface FieldObserver { - public void notify( FieldGen field ); + void notify( FieldGen field ); } diff --git a/src/main/java/org/apache/bcel/generic/IndexedInstruction.java b/src/main/java/org/apache/bcel/generic/IndexedInstruction.java index 2dcf5952..0557e12e 100644 --- a/src/main/java/org/apache/bcel/generic/IndexedInstruction.java +++ b/src/main/java/org/apache/bcel/generic/IndexedInstruction.java @@ -26,8 +26,8 @@ package org.apache.bcel.generic; */ public interface IndexedInstruction { - public int getIndex(); + int getIndex(); - public void setIndex( int index ); + void setIndex( int index ); } diff --git a/src/main/java/org/apache/bcel/generic/InstructionComparator.java b/src/main/java/org/apache/bcel/generic/InstructionComparator.java index 6d7dd3e0..d6430b76 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionComparator.java +++ b/src/main/java/org/apache/bcel/generic/InstructionComparator.java @@ -66,5 +66,5 @@ public interface InstructionComparator { }; - public boolean equals( Instruction i1, Instruction i2 ); + boolean equals( Instruction i1, Instruction i2 ); } diff --git a/src/main/java/org/apache/bcel/generic/InstructionListObserver.java b/src/main/java/org/apache/bcel/generic/InstructionListObserver.java index 26ba5ba8..3bb6bad2 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionListObserver.java +++ b/src/main/java/org/apache/bcel/generic/InstructionListObserver.java @@ -26,5 +26,5 @@ package org.apache.bcel.generic; */ public interface InstructionListObserver { - public void notify( InstructionList list ); + void notify( InstructionList list ); } diff --git a/src/main/java/org/apache/bcel/generic/InstructionTargeter.java b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java index 689a5a60..a41e0db0 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionTargeter.java +++ b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java @@ -29,8 +29,8 @@ package org.apache.bcel.generic; */ public interface InstructionTargeter { - public boolean containsTarget( InstructionHandle ih ); + boolean containsTarget( InstructionHandle ih ); - public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ); + void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ); } diff --git a/src/main/java/org/apache/bcel/generic/MethodObserver.java b/src/main/java/org/apache/bcel/generic/MethodObserver.java index 125ef957..9efc654d 100644 --- a/src/main/java/org/apache/bcel/generic/MethodObserver.java +++ b/src/main/java/org/apache/bcel/generic/MethodObserver.java @@ -26,5 +26,5 @@ package org.apache.bcel.generic; */ public interface MethodObserver { - public void notify( MethodGen method ); + void notify( MethodGen method ); } diff --git a/src/main/java/org/apache/bcel/generic/NamedAndTyped.java b/src/main/java/org/apache/bcel/generic/NamedAndTyped.java index 596cc833..96e8b952 100644 --- a/src/main/java/org/apache/bcel/generic/NamedAndTyped.java +++ b/src/main/java/org/apache/bcel/generic/NamedAndTyped.java @@ -26,14 +26,14 @@ package org.apache.bcel.generic; */ public interface NamedAndTyped { - public String getName(); + String getName(); - public Type getType(); + Type getType(); - public void setName( String name ); + void setName( String name ); - public void setType( Type type ); + void setType( Type type ); } diff --git a/src/main/java/org/apache/bcel/generic/StackConsumer.java b/src/main/java/org/apache/bcel/generic/StackConsumer.java index 508221a3..ab58c1ae 100644 --- a/src/main/java/org/apache/bcel/generic/StackConsumer.java +++ b/src/main/java/org/apache/bcel/generic/StackConsumer.java @@ -27,5 +27,5 @@ public interface StackConsumer { /** @return how many words are consumed from stack */ - public int consumeStack( ConstantPoolGen cpg ); + int consumeStack( ConstantPoolGen cpg ); } diff --git a/src/main/java/org/apache/bcel/generic/StackProducer.java b/src/main/java/org/apache/bcel/generic/StackProducer.java index 9ada6d16..75ef0eaa 100644 --- a/src/main/java/org/apache/bcel/generic/StackProducer.java +++ b/src/main/java/org/apache/bcel/generic/StackProducer.java @@ -28,5 +28,5 @@ public interface StackProducer { /** @return how many words are produced on stack */ - public int produceStack( ConstantPoolGen cpg ); + int produceStack( ConstantPoolGen cpg ); } diff --git a/src/main/java/org/apache/bcel/generic/TypedInstruction.java b/src/main/java/org/apache/bcel/generic/TypedInstruction.java index 42ce16a2..835786e8 100644 --- a/src/main/java/org/apache/bcel/generic/TypedInstruction.java +++ b/src/main/java/org/apache/bcel/generic/TypedInstruction.java @@ -26,5 +26,5 @@ package org.apache.bcel.generic; */ public interface TypedInstruction { - public Type getType( ConstantPoolGen cpg ); + Type getType( ConstantPoolGen cpg ); } diff --git a/src/main/java/org/apache/bcel/generic/Visitor.java b/src/main/java/org/apache/bcel/generic/Visitor.java index 71c7d8c1..0661e3ab 100644 --- a/src/main/java/org/apache/bcel/generic/Visitor.java +++ b/src/main/java/org/apache/bcel/generic/Visitor.java @@ -26,544 +26,544 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public interface Visitor { +interface Visitor { - public void visitStackInstruction( StackInstruction obj ); + void visitStackInstruction( StackInstruction obj ); - public void visitLocalVariableInstruction( LocalVariableInstruction obj ); + void visitLocalVariableInstruction( LocalVariableInstruction obj ); - public void visitBranchInstruction( BranchInstruction obj ); + void visitBranchInstruction( BranchInstruction obj ); - public void visitLoadClass( LoadClass obj ); + void visitLoadClass( LoadClass obj ); - public void visitFieldInstruction( FieldInstruction obj ); + void visitFieldInstruction( FieldInstruction obj ); - public void visitIfInstruction( IfInstruction obj ); + void visitIfInstruction( IfInstruction obj ); - public void visitConversionInstruction( ConversionInstruction obj ); + void visitConversionInstruction( ConversionInstruction obj ); - public void visitPopInstruction( PopInstruction obj ); + void visitPopInstruction( PopInstruction obj ); - public void visitStoreInstruction( StoreInstruction obj ); + void visitStoreInstruction( StoreInstruction obj ); - public void visitTypedInstruction( TypedInstruction obj ); + void visitTypedInstruction( TypedInstruction obj ); - public void visitSelect( Select obj ); + void visitSelect( Select obj ); - public void visitJsrInstruction( JsrInstruction obj ); + void visitJsrInstruction( JsrInstruction obj ); - public void visitGotoInstruction( GotoInstruction obj ); + void visitGotoInstruction( GotoInstruction obj ); - public void visitUnconditionalBranch( UnconditionalBranch obj ); + void visitUnconditionalBranch( UnconditionalBranch obj ); - public void visitPushInstruction( PushInstruction obj ); + void visitPushInstruction( PushInstruction obj ); - public void visitArithmeticInstruction( ArithmeticInstruction obj ); + void visitArithmeticInstruction( ArithmeticInstruction obj ); - public void visitCPInstruction( CPInstruction obj ); + void visitCPInstruction( CPInstruction obj ); - public void visitInvokeInstruction( InvokeInstruction obj ); + void visitInvokeInstruction( InvokeInstruction obj ); - public void visitArrayInstruction( ArrayInstruction obj ); + void visitArrayInstruction( ArrayInstruction obj ); - public void visitAllocationInstruction( AllocationInstruction obj ); + void visitAllocationInstruction( AllocationInstruction obj ); - public void visitReturnInstruction( ReturnInstruction obj ); + void visitReturnInstruction( ReturnInstruction obj ); - public void visitFieldOrMethod( FieldOrMethod obj ); + void visitFieldOrMethod( FieldOrMethod obj ); - public void visitConstantPushInstruction( ConstantPushInstruction obj ); + void visitConstantPushInstruction( ConstantPushInstruction obj ); - public void visitExceptionThrower( ExceptionThrower obj ); + void visitExceptionThrower( ExceptionThrower obj ); - public void visitLoadInstruction( LoadInstruction obj ); + void visitLoadInstruction( LoadInstruction obj ); - public void visitVariableLengthInstruction( VariableLengthInstruction obj ); + void visitVariableLengthInstruction( VariableLengthInstruction obj ); - public void visitStackProducer( StackProducer obj ); + void visitStackProducer( StackProducer obj ); - public void visitStackConsumer( StackConsumer obj ); + void visitStackConsumer( StackConsumer obj ); - public void visitACONST_NULL( ACONST_NULL obj ); + void visitACONST_NULL( ACONST_NULL obj ); - public void visitGETSTATIC( GETSTATIC obj ); + void visitGETSTATIC( GETSTATIC obj ); - public void visitIF_ICMPLT( IF_ICMPLT obj ); + void visitIF_ICMPLT( IF_ICMPLT obj ); - public void visitMONITOREXIT( MONITOREXIT obj ); + void visitMONITOREXIT( MONITOREXIT obj ); - public void visitIFLT( IFLT obj ); + void visitIFLT( IFLT obj ); - public void visitLSTORE( LSTORE obj ); + void visitLSTORE( LSTORE obj ); - public void visitPOP2( POP2 obj ); + void visitPOP2( POP2 obj ); - public void visitBASTORE( BASTORE obj ); + void visitBASTORE( BASTORE obj ); - public void visitISTORE( ISTORE obj ); + void visitISTORE( ISTORE obj ); - public void visitCHECKCAST( CHECKCAST obj ); + void visitCHECKCAST( CHECKCAST obj ); - public void visitFCMPG( FCMPG obj ); + void visitFCMPG( FCMPG obj ); - public void visitI2F( I2F obj ); + void visitI2F( I2F obj ); - public void visitATHROW( ATHROW obj ); + void visitATHROW( ATHROW obj ); - public void visitDCMPL( DCMPL obj ); + void visitDCMPL( DCMPL obj ); - public void visitARRAYLENGTH( ARRAYLENGTH obj ); + void visitARRAYLENGTH( ARRAYLENGTH obj ); - public void visitDUP( DUP obj ); + void visitDUP( DUP obj ); - public void visitINVOKESTATIC( INVOKESTATIC obj ); + void visitINVOKESTATIC( INVOKESTATIC obj ); - public void visitLCONST( LCONST obj ); + void visitLCONST( LCONST obj ); - public void visitDREM( DREM obj ); + void visitDREM( DREM obj ); - public void visitIFGE( IFGE obj ); + void visitIFGE( IFGE obj ); - public void visitCALOAD( CALOAD obj ); + void visitCALOAD( CALOAD obj ); - public void visitLASTORE( LASTORE obj ); + void visitLASTORE( LASTORE obj ); - public void visitI2D( I2D obj ); + void visitI2D( I2D obj ); - public void visitDADD( DADD obj ); + void visitDADD( DADD obj ); - public void visitINVOKESPECIAL( INVOKESPECIAL obj ); + void visitINVOKESPECIAL( INVOKESPECIAL obj ); - public void visitIAND( IAND obj ); + void visitIAND( IAND obj ); - public void visitPUTFIELD( PUTFIELD obj ); + void visitPUTFIELD( PUTFIELD obj ); - public void visitILOAD( ILOAD obj ); + void visitILOAD( ILOAD obj ); - public void visitDLOAD( DLOAD obj ); + void visitDLOAD( DLOAD obj ); - public void visitDCONST( DCONST obj ); + void visitDCONST( DCONST obj ); - public void visitNEW( NEW obj ); + void visitNEW( NEW obj ); - public void visitIFNULL( IFNULL obj ); + void visitIFNULL( IFNULL obj ); - public void visitLSUB( LSUB obj ); + void visitLSUB( LSUB obj ); - public void visitL2I( L2I obj ); + void visitL2I( L2I obj ); - public void visitISHR( ISHR obj ); + void visitISHR( ISHR obj ); - public void visitTABLESWITCH( TABLESWITCH obj ); + void visitTABLESWITCH( TABLESWITCH obj ); - public void visitIINC( IINC obj ); + void visitIINC( IINC obj ); - public void visitDRETURN( DRETURN obj ); + void visitDRETURN( DRETURN obj ); - public void visitFSTORE( FSTORE obj ); + void visitFSTORE( FSTORE obj ); - public void visitDASTORE( DASTORE obj ); + void visitDASTORE( DASTORE obj ); - public void visitIALOAD( IALOAD obj ); + void visitIALOAD( IALOAD obj ); - public void visitDDIV( DDIV obj ); + void visitDDIV( DDIV obj ); - public void visitIF_ICMPGE( IF_ICMPGE obj ); + void visitIF_ICMPGE( IF_ICMPGE obj ); - public void visitLAND( LAND obj ); + void visitLAND( LAND obj ); - public void visitIDIV( IDIV obj ); + void visitIDIV( IDIV obj ); - public void visitLOR( LOR obj ); + void visitLOR( LOR obj ); - public void visitCASTORE( CASTORE obj ); + void visitCASTORE( CASTORE obj ); - public void visitFREM( FREM obj ); + void visitFREM( FREM obj ); - public void visitLDC( LDC obj ); + void visitLDC( LDC obj ); - public void visitBIPUSH( BIPUSH obj ); + void visitBIPUSH( BIPUSH obj ); - public void visitDSTORE( DSTORE obj ); + void visitDSTORE( DSTORE obj ); - public void visitF2L( F2L obj ); + void visitF2L( F2L obj ); - public void visitFMUL( FMUL obj ); + void visitFMUL( FMUL obj ); - public void visitLLOAD( LLOAD obj ); + void visitLLOAD( LLOAD obj ); - public void visitJSR( JSR obj ); + void visitJSR( JSR obj ); - public void visitFSUB( FSUB obj ); + void visitFSUB( FSUB obj ); - public void visitSASTORE( SASTORE obj ); + void visitSASTORE( SASTORE obj ); - public void visitALOAD( ALOAD obj ); + void visitALOAD( ALOAD obj ); - public void visitDUP2_X2( DUP2_X2 obj ); + void visitDUP2_X2( DUP2_X2 obj ); - public void visitRETURN( RETURN obj ); + void visitRETURN( RETURN obj ); - public void visitDALOAD( DALOAD obj ); + void visitDALOAD( DALOAD obj ); - public void visitSIPUSH( SIPUSH obj ); + void visitSIPUSH( SIPUSH obj ); - public void visitDSUB( DSUB obj ); + void visitDSUB( DSUB obj ); - public void visitL2F( L2F obj ); + void visitL2F( L2F obj ); - public void visitIF_ICMPGT( IF_ICMPGT obj ); + void visitIF_ICMPGT( IF_ICMPGT obj ); - public void visitF2D( F2D obj ); + void visitF2D( F2D obj ); - public void visitI2L( I2L obj ); + void visitI2L( I2L obj ); - public void visitIF_ACMPNE( IF_ACMPNE obj ); + void visitIF_ACMPNE( IF_ACMPNE obj ); - public void visitPOP( POP obj ); + void visitPOP( POP obj ); - public void visitI2S( I2S obj ); + void visitI2S( I2S obj ); - public void visitIFEQ( IFEQ obj ); + void visitIFEQ( IFEQ obj ); - public void visitSWAP( SWAP obj ); + void visitSWAP( SWAP obj ); - public void visitIOR( IOR obj ); + void visitIOR( IOR obj ); - public void visitIREM( IREM obj ); + void visitIREM( IREM obj ); - public void visitIASTORE( IASTORE obj ); + void visitIASTORE( IASTORE obj ); - public void visitNEWARRAY( NEWARRAY obj ); + void visitNEWARRAY( NEWARRAY obj ); - public void visitINVOKEINTERFACE( INVOKEINTERFACE obj ); + void visitINVOKEINTERFACE( INVOKEINTERFACE obj ); - public void visitINEG( INEG obj ); + void visitINEG( INEG obj ); - public void visitLCMP( LCMP obj ); + void visitLCMP( LCMP obj ); - public void visitJSR_W( JSR_W obj ); + void visitJSR_W( JSR_W obj ); - public void visitMULTIANEWARRAY( MULTIANEWARRAY obj ); + void visitMULTIANEWARRAY( MULTIANEWARRAY obj ); - public void visitDUP_X2( DUP_X2 obj ); + void visitDUP_X2( DUP_X2 obj ); - public void visitSALOAD( SALOAD obj ); + void visitSALOAD( SALOAD obj ); - public void visitIFNONNULL( IFNONNULL obj ); + void visitIFNONNULL( IFNONNULL obj ); - public void visitDMUL( DMUL obj ); + void visitDMUL( DMUL obj ); - public void visitIFNE( IFNE obj ); + void visitIFNE( IFNE obj ); - public void visitIF_ICMPLE( IF_ICMPLE obj ); + void visitIF_ICMPLE( IF_ICMPLE obj ); - public void visitLDC2_W( LDC2_W obj ); + void visitLDC2_W( LDC2_W obj ); - public void visitGETFIELD( GETFIELD obj ); + void visitGETFIELD( GETFIELD obj ); - public void visitLADD( LADD obj ); + void visitLADD( LADD obj ); - public void visitNOP( NOP obj ); + void visitNOP( NOP obj ); - public void visitFALOAD( FALOAD obj ); + void visitFALOAD( FALOAD obj ); - public void visitINSTANCEOF( INSTANCEOF obj ); + void visitINSTANCEOF( INSTANCEOF obj ); - public void visitIFLE( IFLE obj ); + void visitIFLE( IFLE obj ); - public void visitLXOR( LXOR obj ); + void visitLXOR( LXOR obj ); - public void visitLRETURN( LRETURN obj ); + void visitLRETURN( LRETURN obj ); - public void visitFCONST( FCONST obj ); + void visitFCONST( FCONST obj ); - public void visitIUSHR( IUSHR obj ); + void visitIUSHR( IUSHR obj ); - public void visitBALOAD( BALOAD obj ); + void visitBALOAD( BALOAD obj ); - public void visitDUP2( DUP2 obj ); + void visitDUP2( DUP2 obj ); - public void visitIF_ACMPEQ( IF_ACMPEQ obj ); + void visitIF_ACMPEQ( IF_ACMPEQ obj ); - public void visitIMPDEP1( IMPDEP1 obj ); + void visitIMPDEP1( IMPDEP1 obj ); - public void visitMONITORENTER( MONITORENTER obj ); + void visitMONITORENTER( MONITORENTER obj ); - public void visitLSHL( LSHL obj ); + void visitLSHL( LSHL obj ); - public void visitDCMPG( DCMPG obj ); + void visitDCMPG( DCMPG obj ); - public void visitD2L( D2L obj ); + void visitD2L( D2L obj ); - public void visitIMPDEP2( IMPDEP2 obj ); + void visitIMPDEP2( IMPDEP2 obj ); - public void visitL2D( L2D obj ); + void visitL2D( L2D obj ); - public void visitRET( RET obj ); + void visitRET( RET obj ); - public void visitIFGT( IFGT obj ); + void visitIFGT( IFGT obj ); - public void visitIXOR( IXOR obj ); + void visitIXOR( IXOR obj ); - public void visitINVOKEVIRTUAL( INVOKEVIRTUAL obj ); + void visitINVOKEVIRTUAL( INVOKEVIRTUAL obj ); - public void visitFASTORE( FASTORE obj ); + void visitFASTORE( FASTORE obj ); - public void visitIRETURN( IRETURN obj ); + void visitIRETURN( IRETURN obj ); - public void visitIF_ICMPNE( IF_ICMPNE obj ); + void visitIF_ICMPNE( IF_ICMPNE obj ); - public void visitFLOAD( FLOAD obj ); + void visitFLOAD( FLOAD obj ); - public void visitLDIV( LDIV obj ); + void visitLDIV( LDIV obj ); - public void visitPUTSTATIC( PUTSTATIC obj ); + void visitPUTSTATIC( PUTSTATIC obj ); - public void visitAALOAD( AALOAD obj ); + void visitAALOAD( AALOAD obj ); - public void visitD2I( D2I obj ); + void visitD2I( D2I obj ); - public void visitIF_ICMPEQ( IF_ICMPEQ obj ); + void visitIF_ICMPEQ( IF_ICMPEQ obj ); - public void visitAASTORE( AASTORE obj ); + void visitAASTORE( AASTORE obj ); - public void visitARETURN( ARETURN obj ); + void visitARETURN( ARETURN obj ); - public void visitDUP2_X1( DUP2_X1 obj ); + void visitDUP2_X1( DUP2_X1 obj ); - public void visitFNEG( FNEG obj ); + void visitFNEG( FNEG obj ); - public void visitGOTO_W( GOTO_W obj ); + void visitGOTO_W( GOTO_W obj ); - public void visitD2F( D2F obj ); + void visitD2F( D2F obj ); - public void visitGOTO( GOTO obj ); + void visitGOTO( GOTO obj ); - public void visitISUB( ISUB obj ); + void visitISUB( ISUB obj ); - public void visitF2I( F2I obj ); + void visitF2I( F2I obj ); - public void visitDNEG( DNEG obj ); + void visitDNEG( DNEG obj ); - public void visitICONST( ICONST obj ); + void visitICONST( ICONST obj ); - public void visitFDIV( FDIV obj ); + void visitFDIV( FDIV obj ); - public void visitI2B( I2B obj ); + void visitI2B( I2B obj ); - public void visitLNEG( LNEG obj ); + void visitLNEG( LNEG obj ); - public void visitLREM( LREM obj ); + void visitLREM( LREM obj ); - public void visitIMUL( IMUL obj ); + void visitIMUL( IMUL obj ); - public void visitIADD( IADD obj ); + void visitIADD( IADD obj ); - public void visitLSHR( LSHR obj ); + void visitLSHR( LSHR obj ); - public void visitLOOKUPSWITCH( LOOKUPSWITCH obj ); + void visitLOOKUPSWITCH( LOOKUPSWITCH obj ); - public void visitDUP_X1( DUP_X1 obj ); + void visitDUP_X1( DUP_X1 obj ); - public void visitFCMPL( FCMPL obj ); + void visitFCMPL( FCMPL obj ); - public void visitI2C( I2C obj ); + void visitI2C( I2C obj ); - public void visitLMUL( LMUL obj ); + void visitLMUL( LMUL obj ); - public void visitLUSHR( LUSHR obj ); + void visitLUSHR( LUSHR obj ); - public void visitISHL( ISHL obj ); + void visitISHL( ISHL obj ); - public void visitLALOAD( LALOAD obj ); + void visitLALOAD( LALOAD obj ); - public void visitASTORE( ASTORE obj ); + void visitASTORE( ASTORE obj ); - public void visitANEWARRAY( ANEWARRAY obj ); + void visitANEWARRAY( ANEWARRAY obj ); - public void visitFRETURN( FRETURN obj ); + void visitFRETURN( FRETURN obj ); - public void visitFADD( FADD obj ); + void visitFADD( FADD obj ); - public void visitBREAKPOINT( BREAKPOINT obj ); + void visitBREAKPOINT( BREAKPOINT obj ); } diff --git a/src/main/java/org/apache/bcel/util/BCELComparator.java b/src/main/java/org/apache/bcel/util/BCELComparator.java index 5894376e..264fa001 100644 --- a/src/main/java/org/apache/bcel/util/BCELComparator.java +++ b/src/main/java/org/apache/bcel/util/BCELComparator.java @@ -33,7 +33,7 @@ public interface BCELComparator { * @param THAT * @return true if and only if THIS equals THAT */ - public boolean equals( Object THIS, Object THAT ); + boolean equals( Object THIS, Object THAT ); /** @@ -42,5 +42,5 @@ public interface BCELComparator { * @param THIS * @return hashcode for THIS.hashCode() */ - public int hashCode( Object THIS ); + int hashCode( Object THIS ); } diff --git a/src/main/java/org/apache/bcel/util/Repository.java b/src/main/java/org/apache/bcel/util/Repository.java index 21c042f0..2ff5e164 100644 --- a/src/main/java/org/apache/bcel/util/Repository.java +++ b/src/main/java/org/apache/bcel/util/Repository.java @@ -34,41 +34,41 @@ public interface Repository extends java.io.Serializable { /** * Store the provided class under "clazz.getClassName()" */ - public void storeClass( JavaClass clazz ); + void storeClass( JavaClass clazz ); /** * Remove class from repository */ - public void removeClass( JavaClass clazz ); + void removeClass( JavaClass clazz ); /** * Find the class with the name provided, if the class * isn't there, return NULL. */ - public JavaClass findClass( String className ); + JavaClass findClass( String className ); /** * Find the class with the name provided, if the class * isn't there, make an attempt to load it. */ - public JavaClass loadClass( String className ) throws java.lang.ClassNotFoundException; + JavaClass loadClass( String className ) throws java.lang.ClassNotFoundException; /** * Find the JavaClass instance for the given run-time class object */ - public JavaClass loadClass( Class clazz ) throws java.lang.ClassNotFoundException; + JavaClass loadClass( Class clazz ) throws java.lang.ClassNotFoundException; /** Clear all entries from cache. */ - public void clear(); + void clear(); /** Get the ClassPath associated with this Repository */ - public ClassPath getClassPath(); + ClassPath getClassPath(); } diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java index b62ce47e..192004de 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java @@ -36,5 +36,5 @@ public interface VerifierFactoryObserver { * The String argument is the fully qualified class name of a class a * new Verifier instance created by the VerifierFactory operates on. */ - public void update( String s ); + void update( String s ); } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java index 3c955ea3..e74f293d 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -41,7 +41,7 @@ public interface InstructionContext{ * * @see #setTag(int tag) */ - public int getTag(); + int getTag(); /** * The getTag and setTag methods may be used for @@ -51,7 +51,7 @@ public interface InstructionContext{ * * @see #getTag() */ - public void setTag(int tag); + void setTag(int tag); /** * This method symbolically executes the Instruction diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java index 1eda374b..171d4ed0 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java @@ -34,7 +34,7 @@ public interface Subroutine{ * first instruction of this subroutine as their target. * Must not be invoked on the 'top-level subroutine'. */ - public InstructionHandle[] getEnteringJsrInstructions(); + InstructionHandle[] getEnteringJsrInstructions(); /** * Returns the one and only RET that leaves the subroutine. @@ -43,7 +43,7 @@ public interface Subroutine{ * * @see org.apache.bcel.verifier.structurals.Subroutines */ - public InstructionHandle getLeavingRET(); + InstructionHandle getLeavingRET(); /** * Returns all instructions that together form this subroutine. @@ -51,7 +51,7 @@ public interface Subroutine{ * (the top-level code is considered to be a special subroutine) - * else it is not reachable at all (dead code). */ - public InstructionHandle[] getInstructions(); + InstructionHandle[] getInstructions(); /** * Returns if the given InstructionHandle refers to an instruction @@ -61,7 +61,7 @@ public interface Subroutine{ * * @see #getInstructions() */ - public boolean contains(InstructionHandle inst); + boolean contains(InstructionHandle inst); /** * Returns an int[] containing the indices of the local variable slots @@ -71,7 +71,7 @@ public interface Subroutine{ * * @see #getRecursivelyAccessedLocalsIndices() */ - public int[] getAccessedLocalsIndices(); + int[] getAccessedLocalsIndices(); /** * Returns an int[] containing the indices of the local variable slots @@ -81,10 +81,10 @@ public interface Subroutine{ * * @see #getAccessedLocalsIndices() */ - public int[] getRecursivelyAccessedLocalsIndices(); + int[] getRecursivelyAccessedLocalsIndices(); /** * Returns the subroutines that are directly called from this subroutine. */ - public Subroutine[] subSubs(); + Subroutine[] subSubs(); } -- GitLab From e0b787a99cc0c99af18e819b31a75e94491214e0 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 15 Aug 2011 23:26:12 +0000 Subject: [PATCH 0528/1313] use enhanced loop git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1158063 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/Type.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 4972cd7d..8f5c02e9 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -143,9 +143,10 @@ public abstract class Type implements java.io.Serializable { */ public static String getMethodSignature( Type return_type, Type[] arg_types ) { StringBuilder buf = new StringBuilder("("); - int length = (arg_types == null) ? 0 : arg_types.length; - for (int i = 0; i < length; i++) { - buf.append(arg_types[i].getSignature()); + if (arg_types != null) { + for (Type arg_type : arg_types) { + buf.append(arg_type.getSignature()); + } } buf.append(')'); buf.append(return_type.getSignature()); -- GitLab From 53fc0d32bcdd3479d61505de2ff1d925e2668944 Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Wed, 17 Aug 2011 04:32:04 +0000 Subject: [PATCH 0529/1313] Updating to the Commons PMC git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1158507 13f79535-47bb-0310-9956-ffa450edef68 --- doap_bcel.rdf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doap_bcel.rdf b/doap_bcel.rdf index 1a8a50ed..960d0157 100644 --- a/doap_bcel.rdf +++ b/doap_bcel.rdf @@ -28,7 +28,7 @@ - + Bytecode Engineering Library The Byte Code Engineering Library is intended to give users a convenient possibility to analyze, create, and manipulate (binary) Java class files (those ending with .class). Classes are represented by objects which contain all the symbolic information of the given class: methods, fields and byte code instructions, in particular. -- GitLab From f21a2a3e7e16b31faa07e4186840a27689b0b83f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 21 Aug 2011 01:11:40 +0000 Subject: [PATCH 0530/1313] Revert accidental change of interface visibility in r1158060 (intention was to remove public from interface methods only) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1159931 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/Visitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/Visitor.java b/src/main/java/org/apache/bcel/generic/Visitor.java index 0661e3ab..83703e3d 100644 --- a/src/main/java/org/apache/bcel/generic/Visitor.java +++ b/src/main/java/org/apache/bcel/generic/Visitor.java @@ -26,7 +26,7 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -interface Visitor { +public interface Visitor { void visitStackInstruction( StackInstruction obj ); -- GitLab From cfc1fc472192d1c341017570d8b4dd554ec14a81 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 17 Oct 2011 13:13:46 +0000 Subject: [PATCH 0531/1313] Temporary fix until next BCEL release. Needs to be regenerated once new releases are made git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1185152 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/download_bcel.xml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/site/xdoc/download_bcel.xml b/src/site/xdoc/download_bcel.xml index 3bf1077c..e05cc29f 100644 --- a/src/site/xdoc/download_bcel.xml +++ b/src/site/xdoc/download_bcel.xml @@ -88,39 +88,39 @@ limitations under the License.

          - The KEYS + The KEYS link links to the code signing keys used to sign the product. The PGP link downloads the OpenPGP compatible signature from our main site. The MD5 link downloads the checksum from the main site.

          -
          +
          - - - + + + - - - + + +
          bcel-6.0-bin.tar.gzmd5pgpbcel-5.2.tar.gzmd5pgp
          bcel-6.0-bin.zipmd5pgpbcel-5.2.zipmd5pgp
          - - - + + + - - - + + +
          bcel-6.0-src.tar.gzmd5pgpbcel-5.2-src.tar.gzmd5pgp
          bcel-6.0-src.zipmd5pgpbcel-5.2-src.zipmd5pgp
          @@ -130,8 +130,8 @@ limitations under the License. Older releases can be obtained from the archives.

          -- GitLab From af907b709b7417bd3ecb0b7e97be7ab6b404c586 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 17 Oct 2011 13:21:51 +0000 Subject: [PATCH 0532/1313] Point to commons download page git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1185157 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/site.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/site/site.xml b/src/site/site.xml index 44960f71..461c9054 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -32,7 +32,7 @@ - + -- GitLab From fce3553d5eb6264a3625c5cba7c05988b84990a2 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 14 Nov 2011 00:46:22 +0000 Subject: [PATCH 0533/1313] Jakarta => Commons for downloads git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1201563 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/download_bcel.xml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/site/xdoc/download_bcel.xml b/src/site/xdoc/download_bcel.xml index e05cc29f..13dc3923 100644 --- a/src/site/xdoc/download_bcel.xml +++ b/src/site/xdoc/download_bcel.xml @@ -88,39 +88,39 @@ limitations under the License.

          - The KEYS + The KEYS link links to the code signing keys used to sign the product. The PGP link downloads the OpenPGP compatible signature from our main site. The MD5 link downloads the checksum from the main site.

          -
          +
          - - - + + + - - - + + +
          bcel-5.2.tar.gzmd5pgpbcel-5.2.tar.gzmd5pgp
          bcel-5.2.zipmd5pgpbcel-5.2.zipmd5pgp
          - - - + + + - - - + + +
          bcel-5.2-src.tar.gzmd5pgpbcel-5.2-src.tar.gzmd5pgp
          bcel-5.2-src.zipmd5pgpbcel-5.2-src.zipmd5pgp
          @@ -130,8 +130,8 @@ limitations under the License. Older releases can be obtained from the archives.

          -- GitLab From ef9e0252cdd3c9b27b0f69bc93424f0ae72fedcf Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sun, 15 Jan 2012 02:43:45 +0000 Subject: [PATCH 0534/1313] Apply patch Bug 52422 - [BUG?/PATCH] LocalVariableGen.getLocalVariable() computes incorrect length - from Thiago Tonelli Bartolomei git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1231616 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/LocalVariableGen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java index 26467219..69d05640 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java @@ -81,7 +81,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo public LocalVariable getLocalVariable( ConstantPoolGen cp ) { int start_pc = start.getPosition(); int length = end.getPosition() - start_pc; - if (length > 0) { + if (end.getNext() == null) { length += end.getInstruction().getLength(); } int name_index = cp.addUtf8(name); -- GitLab From 470a4d52acecf294070ac7a847995c21b0d77764 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 7 Mar 2012 00:08:20 +0000 Subject: [PATCH 0535/1313] Another old URL git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1297804 13f79535-47bb-0310-9956-ffa450edef68 --- doap_bcel.rdf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doap_bcel.rdf b/doap_bcel.rdf index 960d0157..474ef1e3 100644 --- a/doap_bcel.rdf +++ b/doap_bcel.rdf @@ -27,7 +27,7 @@ - + Bytecode Engineering Library @@ -53,6 +53,6 @@ 5.1 - + -- GitLab From 8d35e672c8ebe701aef87db2bf21d1ec857bb0fd Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 11 Mar 2012 15:06:10 +0000 Subject: [PATCH 0536/1313] Bug 52433 - Why using unstable sort at MethodGen.getLocalVariables() ? git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1299373 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 73 +++++++++ src/changes/release-notes.vm | 140 ++++++++++++++++++ .../org/apache/bcel/generic/MethodGen.java | 39 +---- 3 files changed, 220 insertions(+), 32 deletions(-) create mode 100644 src/changes/changes.xml create mode 100644 src/changes/release-notes.vm diff --git a/src/changes/changes.xml b/src/changes/changes.xml new file mode 100644 index 00000000..4466347f --- /dev/null +++ b/src/changes/changes.xml @@ -0,0 +1,73 @@ + + + + + + + Changes + Apache Commons devlopers + + + + + + + + Why using unstable sort at MethodGen.getLocalVariables() ? + + + + diff --git a/src/changes/release-notes.vm b/src/changes/release-notes.vm new file mode 100644 index 00000000..ea718f23 --- /dev/null +++ b/src/changes/release-notes.vm @@ -0,0 +1,140 @@ +## Licensed to the Apache Software Foundation (ASF) under one +## or more contributor license agreements. See the NOTICE file +## distributed with this work for additional information +## regarding copyright ownership. The ASF licenses this file +## to you under the Apache License, Version 2.0 (the +## "License"); you may not use this file except in compliance +## with the License. You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, +## software distributed under the License is distributed on an +## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +## KIND, either express or implied. See the License for the +## specific language governing permissions and limitations +## under the License. + + Apache ${project.name} ${version} RELEASE NOTES + +The ${developmentTeam} is pleased to announce the release of ${finalName} + +$introduction.replaceAll("(? 1) { - sort(lg, 0, size - 1); + Arrays.sort(lg, new Comparator() { + public int compare(LocalVariableGen o1, LocalVariableGen o2) { + return o1.getIndex() - o2.getIndex(); + } + }); } return lg; } -- GitLab From 2ec4ac54041a2e4d6dee563a185f35d4bb436962 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 11 Mar 2012 15:22:36 +0000 Subject: [PATCH 0537/1313] Bug 51014 - Examples not present in source or binary downloads git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1299378 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 3 +++ src/main/assembly/bin.xml | 48 +++++++++++++++++++++++++++++++++++++++ src/main/assembly/src.xml | 38 +++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 src/main/assembly/bin.xml create mode 100644 src/main/assembly/src.xml diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 4466347f..7062e78a 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -65,6 +65,9 @@ The type attribute can be add,update,fix,remove. + + Examples not present in source or binary downloads + Why using unstable sort at MethodGen.getLocalVariables() ? diff --git a/src/main/assembly/bin.xml b/src/main/assembly/bin.xml new file mode 100644 index 00000000..c7ea5268 --- /dev/null +++ b/src/main/assembly/bin.xml @@ -0,0 +1,48 @@ + + + bin + + tar.gz + zip + + false + + + + LICENSE.txt + NOTICE.txt + README.txt + RELEASE-NOTES.txt + + + + target + + + *.jar + + + + src/examples + + + target/site/apidocs + apidocs + + + diff --git a/src/main/assembly/src.xml b/src/main/assembly/src.xml new file mode 100644 index 00000000..c568898a --- /dev/null +++ b/src/main/assembly/src.xml @@ -0,0 +1,38 @@ + + + src + + tar.gz + zip + + ${project.artifactId}-${project.version}-src + + + + LICENSE.txt + NOTICE.txt + pom.xml + README.txt + RELEASE-NOTES.txt + + + + src + + + -- GitLab From 92fbce984f34eebd91193d9427e99875f56739b3 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 11 Mar 2012 15:24:28 +0000 Subject: [PATCH 0538/1313] Bug 51014 - Examples not present in source or binary downloads git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1299379 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a25df786..60770cff 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ org.apache.commons commons-parent - 21 + 23 org.apache.bcel @@ -200,6 +200,16 @@ + + maven-assembly-plugin + + + src/main/assembly/bin.xml + src/main/assembly/src.xml + + gnu + + -- GitLab From 688f5cb3d0dfe949bb589c537d4fb31cab303b4d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 11 Mar 2012 15:28:06 +0000 Subject: [PATCH 0539/1313] Fix comment git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1299380 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 60770cff..b08186ce 100644 --- a/pom.xml +++ b/pom.xml @@ -55,7 +55,7 @@ - + apache.website -- GitLab From 6c2dad7c2bb10d230670c28e97bdf9cb8c466d6a Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Sat, 17 Mar 2012 05:09:23 +0000 Subject: [PATCH 0540/1313] Updating copyright dates in notice per expressive last entries in each components svn log git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1301865 13f79535-47bb-0310-9956-ffa450edef68 --- NOTICE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NOTICE.txt b/NOTICE.txt index 49da11dc..e17bd220 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,5 +1,5 @@ Apache Commons BCEL -Copyright 2004-2011 The Apache Software Foundation +Copyright 2004-2012 The Apache Software Foundation This product includes software developed by The Apache Software Foundation (http://www.apache.org/). -- GitLab From 77606beee721d54a371396e0424eed0c52881855 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 19 Mar 2012 15:44:22 +0000 Subject: [PATCH 0541/1313] PrintWriter does not throw IOException git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1302512 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/AttributeHTML.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java index cbed280e..7f0772e1 100644 --- a/src/main/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/main/java/org/apache/bcel/util/AttributeHTML.java @@ -74,13 +74,12 @@ final class AttributeHTML implements org.apache.bcel.Constants { } - final void writeAttribute( Attribute attribute, String anchor ) throws IOException { + final void writeAttribute( Attribute attribute, String anchor ) { writeAttribute(attribute, anchor, 0); } - final void writeAttribute( Attribute attribute, String anchor, int method_number ) - throws IOException { + final void writeAttribute( Attribute attribute, String anchor, int method_number ) { byte tag = attribute.getTag(); int index; if (tag == ATTR_UNKNOWN) { -- GitLab From f9aa61017870169bcd7ed94906d70267d3bda877 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 19 Mar 2012 15:44:53 +0000 Subject: [PATCH 0542/1313] PrintWriter does not throw IOException git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1302514 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/MethodHTML.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/util/MethodHTML.java b/src/main/java/org/apache/bcel/util/MethodHTML.java index 0a11deee..e7bb4c1e 100644 --- a/src/main/java/org/apache/bcel/util/MethodHTML.java +++ b/src/main/java/org/apache/bcel/util/MethodHTML.java @@ -100,7 +100,7 @@ final class MethodHTML implements org.apache.bcel.Constants { } - private final void writeMethod( Method method, int method_number ) throws IOException { + private final void writeMethod( Method method, int method_number ) { // Get raw signature String signature = method.getSignature(); // Get array of strings containing the argument types -- GitLab From e34547e8a94b6bb3295d4353e77ab82adc3a7c3c Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 19 Mar 2012 15:52:49 +0000 Subject: [PATCH 0543/1313] Fix up some generics warnings git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1302517 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Mini/Environment.java | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/examples/Mini/Environment.java b/src/examples/Mini/Environment.java index 84cb55c4..dbd174f3 100644 --- a/src/examples/Mini/Environment.java +++ b/src/examples/Mini/Environment.java @@ -37,7 +37,7 @@ public class Environment implements Cloneable { private static final int SLOTS = 3; // Number of slots of each field private int size; // The table is an array of - private Vector[] table; // Vectors + private Vector[] table; // Vectors private int elements=0; public Environment(int size) { @@ -45,7 +45,7 @@ public class Environment implements Cloneable { table = new Vector[size]; } - private Environment(Vector[] table) { + private Environment(Vector[] table) { size = table.length; this.table = table; } @@ -64,7 +64,7 @@ public class Environment implements Cloneable { */ public void put(EnvEntry obj) { int hash; - Vector v; + Vector v; String key = obj.getHashKey(); hash = hashCode(key); @@ -73,7 +73,7 @@ public class Environment implements Cloneable { elements++; // Count if(v == null) { - table[hash] = v = new Vector(SLOTS); + table[hash] = v = new Vector(SLOTS); } else { try { int index = lookup(v, key); @@ -93,7 +93,7 @@ public class Environment implements Cloneable { */ public EnvEntry get(String key) { int hash; - Vector v; + Vector v; EnvEntry entry = null; hash = hashCode(key); @@ -107,7 +107,7 @@ public class Environment implements Cloneable { int index = lookup(v, key); if(index >= 0) { - entry = (EnvEntry)v.elementAt(index); + entry = v.elementAt(index); } } catch(ArrayIndexOutOfBoundsException e) {} @@ -119,7 +119,7 @@ public class Environment implements Cloneable { */ public void delete(String key) { int hash; - Vector v; + Vector v; hash = hashCode(key); v = table[hash]; @@ -138,13 +138,13 @@ public class Environment implements Cloneable { } catch(ArrayIndexOutOfBoundsException e) {} } - private static final int lookup(Vector v, String key) + private static final int lookup(Vector v, String key) throws ArrayIndexOutOfBoundsException { int len = v.size(); for(int i=0; i < len; i++) { - EnvEntry entry = (EnvEntry)v.elementAt(i); + EnvEntry entry = v.elementAt(i); if(entry.getHashKey().equals(key)) { return i; @@ -156,7 +156,7 @@ public class Environment implements Cloneable { @Override public Object clone() { - Vector[] copy = new Vector[size]; + Vector[] copy = new Vector[size]; for(int i=0; i < size; i++) { if(table[i] != null) { @@ -192,14 +192,14 @@ public class Environment implements Cloneable { public EnvEntry[] getEntries() { EnvEntry[] entries = new EnvEntry[elements]; int k = 0; - Vector v; + Vector v; for(int i=0; i < size; i++) { if((v = table[i]) != null) { int len = v.size(); try { for(int j=0; j < len; j++) { - entries[k++] = (EnvEntry)v.elementAt(j); + entries[k++] = v.elementAt(j); } } catch(ArrayIndexOutOfBoundsException e) {} } -- GitLab From b99842f9b4e3f124d1e7afa8737302e979c5e5a9 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 19 Mar 2012 15:59:58 +0000 Subject: [PATCH 0544/1313] Fix generics warnings git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1302520 13f79535-47bb-0310-9956-ffa450edef68 --- .../verifier/structurals/Pass3bVerifier.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 6f4f95eb..a8f7224f 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -153,11 +153,13 @@ public final class Pass3bVerifier extends PassVerifier{ icq.remove(0); } - ArrayList oldchain = (ArrayList) (ec.clone()); - ArrayList newchain = (ArrayList) (ec.clone()); + @SuppressWarnings("unchecked") // ec is of type ArrayList + ArrayList oldchain = (ArrayList) (ec.clone()); + @SuppressWarnings("unchecked") // ec is of type ArrayList + ArrayList newchain = (ArrayList) (ec.clone()); newchain.add(u); - if ((u.getInstruction().getInstruction()) instanceof RET){ + if ((u.getInstruction().getInstruction()) instanceof RET){ //System.err.println(u); // We can only follow _one_ successor, the one after the // JSR that was recently executed. @@ -195,7 +197,9 @@ public final class Pass3bVerifier extends PassVerifier{ } if (theSuccessor.execute(u.getOutFrame(oldchain), newchain, icv, ev)){ - icq.add(theSuccessor, (ArrayList) newchain.clone()); + @SuppressWarnings("unchecked") // newchain is already of type ArrayList + ArrayList newchainClone = (ArrayList) newchain.clone(); + icq.add(theSuccessor, newchainClone); } } else{// "not a ret" @@ -205,7 +209,9 @@ public final class Pass3bVerifier extends PassVerifier{ for (int s=0; s) newchain.clone()); + @SuppressWarnings("unchecked") // newchain is already of type ArrayList + ArrayList newchainClone = (ArrayList) newchain.clone(); + icq.add(v, newchainClone); } } }// end "not a ret" -- GitLab From c9332511fd4824e11002b6a895c2a78a365f45b4 Mon Sep 17 00:00:00 2001 From: Torsten Curdt Date: Tue, 10 Apr 2012 21:37:21 +0000 Subject: [PATCH 0545/1313] applied patch from Charles Honton, https://issues.apache.org/bugzilla/show_bug.cgi?id=52979 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1312005 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Method.java | 12 + .../classfile/ParameterAnnotationEntry.java | 26 +- .../GeneratingAnnotatedClassesTestCase.java | 1166 +++++++++-------- .../data/AnnotatedWithCombinedAnnotation.java | 12 +- 4 files changed, 665 insertions(+), 551 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index 9b9aae9f..1976f605 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -50,6 +50,8 @@ public final class Method extends FieldOrMethod { } }; + // annotations defined on the parameters of a method + private ParameterAnnotationEntry[] parameterAnnotationEntries; /** * Empty constructor, all attributes have to be defined via `setXXX' @@ -256,4 +258,14 @@ public final class Method extends FieldOrMethod { public int hashCode() { return _cmp.hashCode(this); } + + /** + * @return Annotations on the parameters of a method + */ + public ParameterAnnotationEntry[] getParameterAnnotationEntries() { + if (parameterAnnotationEntries == null) { + parameterAnnotationEntries = ParameterAnnotationEntry.createParameterAnnotationEntries(getAttributes()); + } + return parameterAnnotationEntries; + } } diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index dc1853e8..b60ba214 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -20,11 +20,15 @@ package org.apache.bcel.classfile; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + import org.apache.bcel.Constants; /** * represents one parameter annotation in the parameter annotation table - * + * * @version $Id: ParameterAnnotationEntry * @author D. Brosius * @since 5.3 @@ -44,7 +48,7 @@ public class ParameterAnnotationEntry implements Node, Constants { annotation_table_length = (file.readUnsignedShort()); annotation_table = new AnnotationEntry[annotation_table_length]; for (int i = 0; i < annotation_table_length; i++) { -// TODO isRuntimeVisible + // TODO isRuntimeVisible annotation_table[i] = AnnotationEntry.read(file, constant_pool, false); } } @@ -58,7 +62,7 @@ public class ParameterAnnotationEntry implements Node, Constants { * @param v Visitor object */ public void accept( Visitor v ) { - // v.visitParameterAnnotationEntry(this); + // v.visitParameterAnnotationEntry(this); } @@ -76,12 +80,24 @@ public class ParameterAnnotationEntry implements Node, Constants { public AnnotationEntry[] getAnnotationEntries() { return annotation_table; } - + public void dump(DataOutputStream dos) throws IOException { dos.writeShort(annotation_table_length); for(int i = 0; i < annotation_table_length; i++) { annotation_table[i].dump(dos); } } + + public static ParameterAnnotationEntry[] createParameterAnnotationEntries(Attribute[] attrs) { + // Find attributes that contain parameter annotation data + List accumulatedAnnotations = new ArrayList(attrs.length); + for (Attribute attribute : attrs) { + if (attribute instanceof ParameterAnnotations) { + ParameterAnnotations runtimeAnnotations = (ParameterAnnotations)attribute; + Collections.addAll(accumulatedAnnotations, runtimeAnnotations.getParameterAnnotationEntries()); + } + } + return accumulatedAnnotations.toArray(new ParameterAnnotationEntry[accumulatedAnnotations.size()]); + } } - + diff --git a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java index 0196c24d..d0bb6410 100644 --- a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java @@ -13,7 +13,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * */ package org.apache.bcel; @@ -21,11 +21,15 @@ import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; + import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.ArrayElementValue; import org.apache.bcel.classfile.ElementValue; import org.apache.bcel.classfile.ElementValuePair; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.ParameterAnnotationEntry; +import org.apache.bcel.classfile.SimpleElementValue; import org.apache.bcel.generic.ALOAD; import org.apache.bcel.generic.ASTORE; import org.apache.bcel.generic.AnnotationElementValueGen; @@ -51,575 +55,647 @@ import org.apache.bcel.util.SyntheticRepository; /** * The program that some of the tests generate looks like this: - * + * *
            * public class HelloWorld
            * {
          - * 	public static void main(String[] argv)
          - * 	{
          - * 		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
          - * 		String name = null;
          - * 
          - * 		try
          - * 		{
          - * 			name = "Andy";
          - * 		}
          - * 		catch (IOException e)
          - * 		{
          - * 			return;
          - * 		}
          - * 		System.out.println("Hello, " + name);
          - * 	}
          + *  public static void main(String[] argv)
          + *  {
          + *      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
          + *      String name = null;
          + *
          + *      try
          + *      {
          + *          name = "Andy";
          + *      }
          + *      catch (IOException e)
          + *      {
          + *          return;
          + *      }
          + *      System.out.println("Hello, " + name);
          + *  }
            * }
            * 
          */ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase { - /** - * Steps in the test: - *
            - *
          1. Programmatically construct the HelloWorld program
          2. - *
          3. Add two simple annotations at the class level
          4. - *
          5. Save the class to disk
          6. - *
          7. Reload the class using the 'static' variant of the BCEL classes
          8. - *
          9. Check the attributes are OK
          10. - *
          - */ - public void testGenerateClassLevelAnnotations() - throws ClassNotFoundException - { - // Create HelloWorld - ClassGen cg = createClassGen("HelloWorld"); - cg.setMajor(49); - cg.setMinor(0); - ConstantPoolGen cp = cg.getConstantPool(); - InstructionList il = new InstructionList(); - cg.addAnnotationEntry(createSimpleVisibleAnnotation(cp)); - cg.addAnnotationEntry(createSimpleInvisibleAnnotation(cp)); - buildClassContents(cg, cp, il); - //System.out.println(cg.getJavaClass().toString()); - dumpClass(cg, "HelloWorld.class"); - JavaClass jc = getClassFrom(".", "HelloWorld"); - AnnotationEntry[] as = jc.getAnnotationEntries(); - assertTrue("Should be two AnnotationEntries but found " + as.length, - as.length == 2); - AnnotationEntry one = as[0]; - AnnotationEntry two = as[1]; - // TODO L??; - assertTrue( - "Name of annotation 1 should be LSimpleAnnotation; but it is " - + as[0].getAnnotationType(), as[0].getAnnotationType() - .equals("LSimpleAnnotation;")); - assertTrue( - "Name of annotation 2 should be LSimpleAnnotation; but it is " - + as[1].getAnnotationType(), as[1].getAnnotationType() - .equals("LSimpleAnnotation;")); - ElementValuePair[] vals = as[0].getElementValuePairs(); - ElementValuePair nvp = vals[0]; - assertTrue( - "Name of element in SimpleAnnotation should be 'id' but it is " - + nvp.getNameString(), nvp.getNameString().equals("id")); - ElementValue ev = nvp.getValue(); - assertTrue("Type of element value should be int but it is " - + ev.getElementValueType(), - ev.getElementValueType() == ElementValue.PRIMITIVE_INT); - assertTrue("Value of element should be 4 but it is " - + ev.stringifyValue(), ev.stringifyValue().equals("4")); - assertTrue(createTestdataFile("HelloWorld.class").delete()); - } + /** + * Steps in the test: + *
            + *
          1. Programmatically construct the HelloWorld program
          2. + *
          3. Add two simple annotations at the class level
          4. + *
          5. Save the class to disk
          6. + *
          7. Reload the class using the 'static' variant of the BCEL classes
          8. + *
          9. Check the attributes are OK
          10. + *
          + */ + public void testGenerateClassLevelAnnotations() + throws ClassNotFoundException + { + // Create HelloWorld + ClassGen cg = createClassGen("HelloWorld"); + cg.setMajor(49); + cg.setMinor(0); + ConstantPoolGen cp = cg.getConstantPool(); + InstructionList il = new InstructionList(); + cg.addAnnotationEntry(createSimpleVisibleAnnotation(cp)); + cg.addAnnotationEntry(createSimpleInvisibleAnnotation(cp)); + buildClassContents(cg, cp, il); + //System.out.println(cg.getJavaClass().toString()); + dumpClass(cg, "HelloWorld.class"); + JavaClass jc = getClassFrom(".", "HelloWorld"); + AnnotationEntry[] as = jc.getAnnotationEntries(); + assertTrue("Should be two AnnotationEntries but found " + as.length, + as.length == 2); + AnnotationEntry one = as[0]; + AnnotationEntry two = as[1]; + // TODO L??; + assertTrue( + "Name of annotation 1 should be LSimpleAnnotation; but it is " + + as[0].getAnnotationType(), as[0].getAnnotationType() + .equals("LSimpleAnnotation;")); + assertTrue( + "Name of annotation 2 should be LSimpleAnnotation; but it is " + + as[1].getAnnotationType(), as[1].getAnnotationType() + .equals("LSimpleAnnotation;")); + ElementValuePair[] vals = as[0].getElementValuePairs(); + ElementValuePair nvp = vals[0]; + assertTrue( + "Name of element in SimpleAnnotation should be 'id' but it is " + + nvp.getNameString(), nvp.getNameString().equals("id")); + ElementValue ev = nvp.getValue(); + assertTrue("Type of element value should be int but it is " + + ev.getElementValueType(), + ev.getElementValueType() == ElementValue.PRIMITIVE_INT); + assertTrue("Value of element should be 4 but it is " + + ev.stringifyValue(), ev.stringifyValue().equals("4")); + assertTrue(createTestdataFile("HelloWorld.class").delete()); + } + + /** + * Just check that we can dump a class that has a method annotation on it + * and it is still there when we read it back in + */ + public void testGenerateMethodLevelAnnotations1() + throws ClassNotFoundException + { + // Create HelloWorld + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + InstructionList il = new InstructionList(); + buildClassContentsWithAnnotatedMethods(cg, cp, il); + // Check annotation is OK + int i = cg.getMethods()[0].getAnnotationEntries().length; + assertTrue( + "Prior to dumping, main method should have 1 annotation but has " + + i, i == 1); + dumpClass(cg, "temp1" + File.separator + "HelloWorld.class"); + JavaClass jc2 = getClassFrom("temp1", "HelloWorld"); + // Check annotation is OK + i = jc2.getMethods()[0].getAnnotationEntries().length; + assertTrue("JavaClass should say 1 annotation on main method but says " + + i, i == 1); + ClassGen cg2 = new ClassGen(jc2); + // Check it now it is a ClassGen + Method[] m = cg2.getMethods(); + i = m[0].getAnnotationEntries().length; + assertTrue("The main 'Method' should have one annotation but has " + i, + i == 1); + MethodGen mg = new MethodGen(m[0], cg2.getClassName(), cg2 + .getConstantPool()); + // Check it finally when the Method is changed to a MethodGen + i = mg.getAnnotationEntries().length; + assertTrue("The main 'MethodGen' should have one annotation but has " + + i, i == 1); + assertTrue(wipe("temp1" + File.separator + "HelloWorld.class")); + } + + /** + * Going further than the last test - when we reload the method back in, + * let's change it (adding a new annotation) and then store that, read it + * back in and verify both annotations are there ! + */ + public void testGenerateMethodLevelAnnotations2() + throws ClassNotFoundException + { + // Create HelloWorld + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + InstructionList il = new InstructionList(); + buildClassContentsWithAnnotatedMethods(cg, cp, il); + dumpClass(cg, "temp2", "HelloWorld.class"); + JavaClass jc2 = getClassFrom("temp2", "HelloWorld"); + ClassGen cg2 = new ClassGen(jc2); + // Main method after reading the class back in + Method mainMethod1 = jc2.getMethods()[0]; + assertTrue("The 'Method' should have one annotations but has " + + mainMethod1.getAnnotationEntries().length, mainMethod1 + .getAnnotationEntries().length == 1); + MethodGen mainMethod2 = new MethodGen(mainMethod1, cg2.getClassName(), + cg2.getConstantPool()); + assertTrue("The 'MethodGen' should have one annotations but has " + + mainMethod2.getAnnotationEntries().length, mainMethod2 + .getAnnotationEntries().length == 1); + mainMethod2.addAnnotationEntry(createFruitAnnotation(cg2 + .getConstantPool(), "Pear")); + cg2.removeMethod(mainMethod1); + cg2.addMethod(mainMethod2.getMethod()); + dumpClass(cg2, "temp3", "HelloWorld.class"); + JavaClass jc3 = getClassFrom("temp3", "HelloWorld"); + ClassGen cg3 = new ClassGen(jc3); + Method mainMethod3 = cg3.getMethods()[1]; + int i = mainMethod3.getAnnotationEntries().length; + assertTrue("The 'Method' should now have two annotations but has " + i, + i == 2); + assertTrue(wipe("temp2", "HelloWorld.class")); + assertTrue(wipe("temp3", "HelloWorld.class")); + } + + // J5TODO: Need to add deleteFile calls to many of these tests + /** + * Transform simple class from an immutable to a mutable object. + */ + public void testTransformClassToClassGen_SimpleTypes() + throws ClassNotFoundException + { + JavaClass jc = getTestClass("org.apache.bcel.data.SimpleAnnotatedClass"); + ClassGen cgen = new ClassGen(jc); + // Check annotations are correctly preserved + AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); + assertTrue("Expected one annotation but found " + annotations.length, + annotations.length == 1); + } + + /** + * Transform simple class from an immutable to a mutable object. The class + * is annotated with an annotation that uses an enum. + */ + public void testTransformClassToClassGen_EnumType() + throws ClassNotFoundException + { + JavaClass jc = getTestClass("org.apache.bcel.data.AnnotatedWithEnumClass"); + ClassGen cgen = new ClassGen(jc); + // Check annotations are correctly preserved + AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); + assertTrue("Expected one annotation but found " + annotations.length, + annotations.length == 1); + } + + /** + * Transform simple class from an immutable to a mutable object. The class + * is annotated with an annotation that uses an array of SimpleAnnotations. + */ + public void testTransformClassToClassGen_ArrayAndAnnotationTypes() + throws ClassNotFoundException + { + JavaClass jc = getTestClass("org.apache.bcel.data.AnnotatedWithCombinedAnnotation"); + ClassGen cgen = new ClassGen(jc); + // Check annotations are correctly preserved + AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); + assertTrue("Expected one annotation but found " + annotations.length, + annotations.length == 1); + AnnotationEntryGen a = annotations[0]; + assertTrue("That annotation should only have one value but has " + + a.getValues().size(), a.getValues().size() == 1); + ElementValuePairGen nvp = a.getValues().get(0); + ElementValueGen value = nvp.getValue(); + assertTrue("Value should be ArrayElementValueGen but is " + value, + value instanceof ArrayElementValueGen); + ArrayElementValueGen arrayValue = (ArrayElementValueGen) value; + assertTrue("Array value should be size one but is " + + arrayValue.getElementValuesSize(), arrayValue + .getElementValuesSize() == 1); + ElementValueGen innerValue = arrayValue.getElementValues().get(0); + assertTrue( + "Value in the array should be AnnotationElementValueGen but is " + + innerValue, + innerValue instanceof AnnotationElementValueGen); + AnnotationElementValueGen innerAnnotationValue = (AnnotationElementValueGen) innerValue; + assertTrue("Should be called Lorg/apache/bcel/data/SimpleAnnotation; but is called: " + + innerAnnotationValue.getAnnotation().getTypeName(), + innerAnnotationValue.getAnnotation().getTypeSignature().equals( + "Lorg/apache/bcel/data/SimpleAnnotation;")); + + // check the three methods + Method[] methods = cgen.getMethods(); + assertEquals(3, methods.length); + for(Method method : methods) + { + String methodName= method.getName(); + if(methodName.equals("")) + { + assertMethodAnnotations(method, 0, 1); + assertParameterAnnotations(method, 0, 1); + } + else if(methodName.equals("methodWithArrayOfZeroAnnotations")) + { + assertMethodAnnotations(method, 1, 0); + } + else if(methodName.equals("methodWithArrayOfTwoAnnotations")) + { + assertMethodAnnotations(method, 1, 2); + } + else + { + fail("unexpected method "+method.getName()); + } + } + } - /** - * Just check that we can dump a class that has a method annotation on it - * and it is still there when we read it back in - */ - public void testGenerateMethodLevelAnnotations1() - throws ClassNotFoundException - { - // Create HelloWorld - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - InstructionList il = new InstructionList(); - buildClassContentsWithAnnotatedMethods(cg, cp, il); - // Check annotation is OK - int i = cg.getMethods()[0].getAnnotationEntries().length; - assertTrue( - "Prior to dumping, main method should have 1 annotation but has " - + i, i == 1); - dumpClass(cg, "temp1" + File.separator + "HelloWorld.class"); - JavaClass jc2 = getClassFrom("temp1", "HelloWorld"); - // Check annotation is OK - i = jc2.getMethods()[0].getAnnotationEntries().length; - assertTrue("JavaClass should say 1 annotation on main method but says " - + i, i == 1); - ClassGen cg2 = new ClassGen(jc2); - // Check it now it is a ClassGen - Method[] m = cg2.getMethods(); - i = m[0].getAnnotationEntries().length; - assertTrue("The main 'Method' should have one annotation but has " + i, - i == 1); - MethodGen mg = new MethodGen(m[0], cg2.getClassName(), cg2 - .getConstantPool()); - // Check it finally when the Method is changed to a MethodGen - i = mg.getAnnotationEntries().length; - assertTrue("The main 'MethodGen' should have one annotation but has " - + i, i == 1); - assertTrue(wipe("temp1" + File.separator + "HelloWorld.class")); - } + private void assertMethodAnnotations(Method method, int expectedNumberAnnotations, int nExpectedArrayValues) + { + String methodName= method.getName(); + AnnotationEntry[] annos= method.getAnnotationEntries(); + assertEquals("For "+methodName, expectedNumberAnnotations, annos.length); + if(expectedNumberAnnotations!=0) + { + assertArrayElementValue(nExpectedArrayValues, annos[0]); + } + } - /** - * Going further than the last test - when we reload the method back in, - * let's change it (adding a new annotation) and then store that, read it - * back in and verify both annotations are there ! - */ - public void testGenerateMethodLevelAnnotations2() - throws ClassNotFoundException - { - // Create HelloWorld - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - InstructionList il = new InstructionList(); - buildClassContentsWithAnnotatedMethods(cg, cp, il); - dumpClass(cg, "temp2", "HelloWorld.class"); - JavaClass jc2 = getClassFrom("temp2", "HelloWorld"); - ClassGen cg2 = new ClassGen(jc2); - // Main method after reading the class back in - Method mainMethod1 = jc2.getMethods()[0]; - assertTrue("The 'Method' should have one annotations but has " - + mainMethod1.getAnnotationEntries().length, mainMethod1 - .getAnnotationEntries().length == 1); - MethodGen mainMethod2 = new MethodGen(mainMethod1, cg2.getClassName(), - cg2.getConstantPool()); - assertTrue("The 'MethodGen' should have one annotations but has " - + mainMethod2.getAnnotationEntries().length, mainMethod2 - .getAnnotationEntries().length == 1); - mainMethod2.addAnnotationEntry(createFruitAnnotation(cg2 - .getConstantPool(), "Pear")); - cg2.removeMethod(mainMethod1); - cg2.addMethod(mainMethod2.getMethod()); - dumpClass(cg2, "temp3", "HelloWorld.class"); - JavaClass jc3 = getClassFrom("temp3", "HelloWorld"); - ClassGen cg3 = new ClassGen(jc3); - Method mainMethod3 = cg3.getMethods()[1]; - int i = mainMethod3.getAnnotationEntries().length; - assertTrue("The 'Method' should now have two annotations but has " + i, - i == 2); - assertTrue(wipe("temp2", "HelloWorld.class")); - assertTrue(wipe("temp3", "HelloWorld.class")); - } + private void assertArrayElementValue(int nExpectedArrayValues, AnnotationEntry anno) + { + ElementValuePair elementValuePair = anno.getElementValuePairs()[0]; + assertEquals("value", elementValuePair.getNameString()); + ArrayElementValue ev = (ArrayElementValue) elementValuePair.getValue(); + ElementValue[] eva = ev.getElementValuesArray(); + assertEquals(nExpectedArrayValues, eva.length); + } - // J5TODO: Need to add deleteFile calls to many of these tests - /** - * Transform simple class from an immutable to a mutable object. - */ - public void testTransformClassToClassGen_SimpleTypes() - throws ClassNotFoundException - { - JavaClass jc = getTestClass("org.apache.bcel.data.SimpleAnnotatedClass"); - ClassGen cgen = new ClassGen(jc); - // Check annotations are correctly preserved - AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); - assertTrue("Expected one annotation but found " + annotations.length, - annotations.length == 1); - } + private void assertParameterAnnotations(Method method, int... expectedNumberOfParmeterAnnotations) + { + String methodName= "For "+method.getName(); + ParameterAnnotationEntry[] parameterAnnotations= method.getParameterAnnotationEntries(); + assertEquals(methodName, expectedNumberOfParmeterAnnotations.length, parameterAnnotations.length); - /** - * Transform simple class from an immutable to a mutable object. The class - * is annotated with an annotation that uses an enum. - */ - public void testTransformClassToClassGen_EnumType() - throws ClassNotFoundException - { - JavaClass jc = getTestClass("org.apache.bcel.data.AnnotatedWithEnumClass"); - ClassGen cgen = new ClassGen(jc); - // Check annotations are correctly preserved - AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); - assertTrue("Expected one annotation but found " + annotations.length, - annotations.length == 1); - } + int i= 0; + for(ParameterAnnotationEntry parameterAnnotation : parameterAnnotations) + { + AnnotationEntry[] annos= parameterAnnotation.getAnnotationEntries(); + int expectedLength = expectedNumberOfParmeterAnnotations[i++]; + assertEquals(methodName+" parameter "+i, expectedLength, annos.length); + if(expectedLength!=0) + { + assertSimpleElementValue(annos[0]); + } + } + } - /** - * Transform simple class from an immutable to a mutable object. The class - * is annotated with an annotation that uses an array of SimpleAnnotations. - */ - public void testTransformClassToClassGen_ArrayAndAnnotationTypes() - throws ClassNotFoundException - { - JavaClass jc = getTestClass("org.apache.bcel.data.AnnotatedWithCombinedAnnotation"); - ClassGen cgen = new ClassGen(jc); - // Check annotations are correctly preserved - AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); - assertTrue("Expected one annotation but found " + annotations.length, - annotations.length == 1); - AnnotationEntryGen a = annotations[0]; - assertTrue("That annotation should only have one value but has " - + a.getValues().size(), a.getValues().size() == 1); - ElementValuePairGen nvp = a.getValues().get(0); - ElementValueGen value = nvp.getValue(); - assertTrue("Value should be ArrayElementValueGen but is " + value, - value instanceof ArrayElementValueGen); - ArrayElementValueGen arrayValue = (ArrayElementValueGen) value; - assertTrue("Array value should be size one but is " - + arrayValue.getElementValuesSize(), arrayValue - .getElementValuesSize() == 1); - ElementValueGen innerValue = arrayValue.getElementValues().get(0); - assertTrue( - "Value in the array should be AnnotationElementValueGen but is " - + innerValue, - innerValue instanceof AnnotationElementValueGen); - AnnotationElementValueGen innerAnnotationValue = (AnnotationElementValueGen) innerValue; - assertTrue("Should be called Lorg/apache/bcel/data/SimpleAnnotation; but is called: " - + innerAnnotationValue.getAnnotation().getTypeName(), - innerAnnotationValue.getAnnotation().getTypeSignature().equals( - "Lorg/apache/bcel/data/SimpleAnnotation;")); - } + private void assertSimpleElementValue(AnnotationEntry anno) + { + ElementValuePair elementValuePair = anno.getElementValuePairs()[0]; + assertEquals("id", elementValuePair.getNameString()); + SimpleElementValue ev = (SimpleElementValue)elementValuePair.getValue(); + assertEquals(42, ev.getValueInt()); + } - /** - * Transform complex class from an immutable to a mutable object. - */ - public void testTransformComplexClassToClassGen() - throws ClassNotFoundException - { - JavaClass jc = getTestClass("org.apache.bcel.data.ComplexAnnotatedClass"); - ClassGen cgen = new ClassGen(jc); - // Check annotations are correctly preserved - AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); - assertTrue("Expected one annotation but found " + annotations.length, - annotations.length == 1); - List l = annotations[0].getValues(); - boolean found = false; - for (Iterator iter = l.iterator(); iter.hasNext();) - { - ElementValuePairGen element = (ElementValuePairGen) iter.next(); - if (element.getNameString().equals("dval")) - { - if (((SimpleElementValueGen) element.getValue()) - .stringifyValue().equals("33.4")) - found = true; - } - } - assertTrue("Did not find double annotation value with value 33.4", - found); - } + /** + * Transform complex class from an immutable to a mutable object. + */ + public void testTransformComplexClassToClassGen() + throws ClassNotFoundException + { + JavaClass jc = getTestClass("org.apache.bcel.data.ComplexAnnotatedClass"); + ClassGen cgen = new ClassGen(jc); + // Check annotations are correctly preserved + AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); + assertTrue("Expected one annotation but found " + annotations.length, + annotations.length == 1); + List l = annotations[0].getValues(); + boolean found = false; + for (Iterator iter = l.iterator(); iter.hasNext();) + { + ElementValuePairGen element = (ElementValuePairGen) iter.next(); + if (element.getNameString().equals("dval")) + { + if (((SimpleElementValueGen) element.getValue()) + .stringifyValue().equals("33.4")) + found = true; + } + } + assertTrue("Did not find double annotation value with value 33.4", + found); + } - /** - * Load a class in and modify it with a new attribute - A SimpleAnnotation - * annotation - */ - public void testModifyingClasses1() throws ClassNotFoundException - { - JavaClass jc = getTestClass("org.apache.bcel.data.SimpleAnnotatedClass"); - ClassGen cgen = new ClassGen(jc); - ConstantPoolGen cp = cgen.getConstantPool(); - cgen.addAnnotationEntry(createFruitAnnotation(cp, "Pineapple")); - assertTrue("Should now have two annotations but has " - + cgen.getAnnotationEntries().length, cgen - .getAnnotationEntries().length == 2); - dumpClass(cgen, "SimpleAnnotatedClass.class"); - assertTrue(wipe("SimpleAnnotatedClass.class")); - } + /** + * Load a class in and modify it with a new attribute - A SimpleAnnotation + * annotation + */ + public void testModifyingClasses1() throws ClassNotFoundException + { + JavaClass jc = getTestClass("org.apache.bcel.data.SimpleAnnotatedClass"); + ClassGen cgen = new ClassGen(jc); + ConstantPoolGen cp = cgen.getConstantPool(); + cgen.addAnnotationEntry(createFruitAnnotation(cp, "Pineapple")); + assertTrue("Should now have two annotations but has " + + cgen.getAnnotationEntries().length, cgen + .getAnnotationEntries().length == 2); + dumpClass(cgen, "SimpleAnnotatedClass.class"); + assertTrue(wipe("SimpleAnnotatedClass.class")); + } - /** - * Load a class in and modify it with a new attribute - A ComplexAnnotation - * annotation - */ - public void testModifyingClasses2() throws ClassNotFoundException - { - JavaClass jc = getTestClass("org.apache.bcel.data.SimpleAnnotatedClass"); - ClassGen cgen = new ClassGen(jc); - ConstantPoolGen cp = cgen.getConstantPool(); - cgen.addAnnotationEntry(createCombinedAnnotation(cp)); - assertTrue("Should now have two annotations but has " - + cgen.getAnnotationEntries().length, cgen - .getAnnotationEntries().length == 2); - dumpClass(cgen, "SimpleAnnotatedClass.class"); - JavaClass jc2 = getClassFrom(".", "SimpleAnnotatedClass"); - jc2.getAnnotationEntries(); - assertTrue(wipe("SimpleAnnotatedClass.class")); - // System.err.println(jc2.toString()); - } + /** + * Load a class in and modify it with a new attribute - A ComplexAnnotation + * annotation + */ + public void testModifyingClasses2() throws ClassNotFoundException + { + JavaClass jc = getTestClass("org.apache.bcel.data.SimpleAnnotatedClass"); + ClassGen cgen = new ClassGen(jc); + ConstantPoolGen cp = cgen.getConstantPool(); + cgen.addAnnotationEntry(createCombinedAnnotation(cp)); + assertTrue("Should now have two annotations but has " + + cgen.getAnnotationEntries().length, cgen + .getAnnotationEntries().length == 2); + dumpClass(cgen, "SimpleAnnotatedClass.class"); + JavaClass jc2 = getClassFrom(".", "SimpleAnnotatedClass"); + jc2.getAnnotationEntries(); + assertTrue(wipe("SimpleAnnotatedClass.class")); + // System.err.println(jc2.toString()); + } - private void dumpClass(ClassGen cg, String fname) - { - try - { - File f = createTestdataFile(fname); - cg.getJavaClass().dump(f); - } - catch (java.io.IOException e) - { - System.err.println(e); - } - } + private void dumpClass(ClassGen cg, String fname) + { + try + { + File f = createTestdataFile(fname); + cg.getJavaClass().dump(f); + } + catch (java.io.IOException e) + { + System.err.println(e); + } + } - private void dumpClass(ClassGen cg, String dir, String fname) - { - dumpClass(cg, dir + File.separator + fname); - } + private void dumpClass(ClassGen cg, String dir, String fname) + { + dumpClass(cg, dir + File.separator + fname); + } - private void buildClassContentsWithAnnotatedMethods(ClassGen cg, - ConstantPoolGen cp, InstructionList il) - { - // Create method 'public static void main(String[]argv)' - MethodGen mg = createMethodGen("main", il, cp); - InstructionFactory factory = new InstructionFactory(cg); - mg.addAnnotationEntry(createSimpleVisibleAnnotation(mg - .getConstantPool())); - // We now define some often used types: - ObjectType i_stream = new ObjectType("java.io.InputStream"); - ObjectType p_stream = new ObjectType("java.io.PrintStream"); - // Create variables in and name : We call the constructors, i.e., - // execute BufferedReader(InputStreamReader(System.in)) . The reference - // to the BufferedReader object stays on top of the stack and is stored - // in the newly allocated in variable. - il.append(factory.createNew("java.io.BufferedReader")); - il.append(InstructionConstants.DUP); // Use predefined constant - il.append(factory.createNew("java.io.InputStreamReader")); - il.append(InstructionConstants.DUP); - il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, - Constants.GETSTATIC)); - il.append(factory.createInvoke("java.io.InputStreamReader", "", - Type.VOID, new Type[] { i_stream }, Constants.INVOKESPECIAL)); - il.append(factory.createInvoke("java.io.BufferedReader", "", - Type.VOID, new Type[] { new ObjectType("java.io.Reader") }, - Constants.INVOKESPECIAL)); - LocalVariableGen lg = mg.addLocalVariable("in", new ObjectType( - "java.io.BufferedReader"), null, null); - int in = lg.getIndex(); - lg.setStart(il.append(new ASTORE(in))); // "in" valid from here - // Create local variable name and initialize it to null - lg = mg.addLocalVariable("name", Type.STRING, null, null); - int name = lg.getIndex(); - il.append(InstructionConstants.ACONST_NULL); - lg.setStart(il.append(new ASTORE(name))); // "name" valid from here - // Create try-catch block: We remember the start of the block, read a - // line from the standard input and store it into the variable name . - // InstructionHandle try_start = il.append(factory.createFieldAccess( - // "java.lang.System", "out", p_stream, Constants.GETSTATIC)); - // il.append(new PUSH(cp, "Please enter your name> ")); - // il.append(factory.createInvoke("java.io.PrintStream", "print", - // Type.VOID, new Type[] { Type.STRING }, - // Constants.INVOKEVIRTUAL)); - // il.append(new ALOAD(in)); - // il.append(factory.createInvoke("java.io.BufferedReader", "readLine", - // Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); - InstructionHandle try_start = il.append(new PUSH(cp, "Andy")); - il.append(new ASTORE(name)); - // Upon normal execution we jump behind exception handler, the target - // address is not known yet. - GOTO g = new GOTO(null); - InstructionHandle try_end = il.append(g); - // We add the exception handler which simply returns from the method. - LocalVariableGen var_ex = mg.addLocalVariable("ex", Type - .getType("Ljava.io.IOException;"), null, null); - int var_ex_slot = var_ex.getIndex(); - InstructionHandle handler = il.append(new ASTORE(var_ex_slot)); - var_ex.setStart(handler); - var_ex.setEnd(il.append(InstructionConstants.RETURN)); - mg.addExceptionHandler(try_start, try_end, handler, new ObjectType( - "java.io.IOException")); - // "Normal" code continues, now we can set the branch target of the GOTO - // . - InstructionHandle ih = il.append(factory.createFieldAccess( - "java.lang.System", "out", p_stream, Constants.GETSTATIC)); - g.setTarget(ih); - // Printing "Hello": String concatenation compiles to StringBuffer - // operations. - il.append(factory.createNew(Type.STRINGBUFFER)); - il.append(InstructionConstants.DUP); - il.append(new PUSH(cp, "Hello, ")); - il - .append(factory.createInvoke("java.lang.StringBuffer", - "", Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKESPECIAL)); - il.append(new ALOAD(name)); - il.append(factory.createInvoke("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); - il.append(factory.createInvoke("java.lang.StringBuffer", "toString", - Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); - il - .append(factory.createInvoke("java.io.PrintStream", "println", - Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); - il.append(InstructionConstants.RETURN); - // Finalization: Finally, we have to set the stack size, which normally - // would have to be computed on the fly and add a default constructor - // method to the class, which is empty in this case. - mg.setMaxStack(); - mg.setMaxLocals(); - cg.addMethod(mg.getMethod()); - il.dispose(); // Allow instruction handles to be reused - cg.addEmptyConstructor(Constants.ACC_PUBLIC); - } + private void buildClassContentsWithAnnotatedMethods(ClassGen cg, + ConstantPoolGen cp, InstructionList il) + { + // Create method 'public static void main(String[]argv)' + MethodGen mg = createMethodGen("main", il, cp); + InstructionFactory factory = new InstructionFactory(cg); + mg.addAnnotationEntry(createSimpleVisibleAnnotation(mg + .getConstantPool())); + // We now define some often used types: + ObjectType i_stream = new ObjectType("java.io.InputStream"); + ObjectType p_stream = new ObjectType("java.io.PrintStream"); + // Create variables in and name : We call the constructors, i.e., + // execute BufferedReader(InputStreamReader(System.in)) . The reference + // to the BufferedReader object stays on top of the stack and is stored + // in the newly allocated in variable. + il.append(factory.createNew("java.io.BufferedReader")); + il.append(InstructionConstants.DUP); // Use predefined constant + il.append(factory.createNew("java.io.InputStreamReader")); + il.append(InstructionConstants.DUP); + il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, + Constants.GETSTATIC)); + il.append(factory.createInvoke("java.io.InputStreamReader", "", + Type.VOID, new Type[] { i_stream }, Constants.INVOKESPECIAL)); + il.append(factory.createInvoke("java.io.BufferedReader", "", + Type.VOID, new Type[] { new ObjectType("java.io.Reader") }, + Constants.INVOKESPECIAL)); + LocalVariableGen lg = mg.addLocalVariable("in", new ObjectType( + "java.io.BufferedReader"), null, null); + int in = lg.getIndex(); + lg.setStart(il.append(new ASTORE(in))); // "in" valid from here + // Create local variable name and initialize it to null + lg = mg.addLocalVariable("name", Type.STRING, null, null); + int name = lg.getIndex(); + il.append(InstructionConstants.ACONST_NULL); + lg.setStart(il.append(new ASTORE(name))); // "name" valid from here + // Create try-catch block: We remember the start of the block, read a + // line from the standard input and store it into the variable name . + // InstructionHandle try_start = il.append(factory.createFieldAccess( + // "java.lang.System", "out", p_stream, Constants.GETSTATIC)); + // il.append(new PUSH(cp, "Please enter your name> ")); + // il.append(factory.createInvoke("java.io.PrintStream", "print", + // Type.VOID, new Type[] { Type.STRING }, + // Constants.INVOKEVIRTUAL)); + // il.append(new ALOAD(in)); + // il.append(factory.createInvoke("java.io.BufferedReader", "readLine", + // Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); + InstructionHandle try_start = il.append(new PUSH(cp, "Andy")); + il.append(new ASTORE(name)); + // Upon normal execution we jump behind exception handler, the target + // address is not known yet. + GOTO g = new GOTO(null); + InstructionHandle try_end = il.append(g); + // We add the exception handler which simply returns from the method. + LocalVariableGen var_ex = mg.addLocalVariable("ex", Type + .getType("Ljava.io.IOException;"), null, null); + int var_ex_slot = var_ex.getIndex(); + InstructionHandle handler = il.append(new ASTORE(var_ex_slot)); + var_ex.setStart(handler); + var_ex.setEnd(il.append(InstructionConstants.RETURN)); + mg.addExceptionHandler(try_start, try_end, handler, new ObjectType( + "java.io.IOException")); + // "Normal" code continues, now we can set the branch target of the GOTO + // . + InstructionHandle ih = il.append(factory.createFieldAccess( + "java.lang.System", "out", p_stream, Constants.GETSTATIC)); + g.setTarget(ih); + // Printing "Hello": String concatenation compiles to StringBuffer + // operations. + il.append(factory.createNew(Type.STRINGBUFFER)); + il.append(InstructionConstants.DUP); + il.append(new PUSH(cp, "Hello, ")); + il + .append(factory.createInvoke("java.lang.StringBuffer", + "", Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKESPECIAL)); + il.append(new ALOAD(name)); + il.append(factory.createInvoke("java.lang.StringBuffer", "append", + Type.STRINGBUFFER, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(factory.createInvoke("java.lang.StringBuffer", "toString", + Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); + il + .append(factory.createInvoke("java.io.PrintStream", "println", + Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(InstructionConstants.RETURN); + // Finalization: Finally, we have to set the stack size, which normally + // would have to be computed on the fly and add a default constructor + // method to the class, which is empty in this case. + mg.setMaxStack(); + mg.setMaxLocals(); + cg.addMethod(mg.getMethod()); + il.dispose(); // Allow instruction handles to be reused + cg.addEmptyConstructor(Constants.ACC_PUBLIC); + } - private void buildClassContents(ClassGen cg, ConstantPoolGen cp, - InstructionList il) - { - // Create method 'public static void main(String[]argv)' - MethodGen mg = createMethodGen("main", il, cp); - InstructionFactory factory = new InstructionFactory(cg); - // We now define some often used types: - ObjectType i_stream = new ObjectType("java.io.InputStream"); - ObjectType p_stream = new ObjectType("java.io.PrintStream"); - // Create variables in and name : We call the constructors, i.e., - // execute BufferedReader(InputStreamReader(System.in)) . The reference - // to the BufferedReader object stays on top of the stack and is stored - // in the newly allocated in variable. - il.append(factory.createNew("java.io.BufferedReader")); - il.append(InstructionConstants.DUP); // Use predefined constant - il.append(factory.createNew("java.io.InputStreamReader")); - il.append(InstructionConstants.DUP); - il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, - Constants.GETSTATIC)); - il.append(factory.createInvoke("java.io.InputStreamReader", "", - Type.VOID, new Type[] { i_stream }, Constants.INVOKESPECIAL)); - il.append(factory.createInvoke("java.io.BufferedReader", "", - Type.VOID, new Type[] { new ObjectType("java.io.Reader") }, - Constants.INVOKESPECIAL)); - LocalVariableGen lg = mg.addLocalVariable("in", new ObjectType( - "java.io.BufferedReader"), null, null); - int in = lg.getIndex(); - lg.setStart(il.append(new ASTORE(in))); // "in" valid from here - // Create local variable name and initialize it to null - lg = mg.addLocalVariable("name", Type.STRING, null, null); - int name = lg.getIndex(); - il.append(InstructionConstants.ACONST_NULL); - lg.setStart(il.append(new ASTORE(name))); // "name" valid from here - // Create try-catch block: We remember the start of the block, read a - // line from the standard input and store it into the variable name . - // InstructionHandle try_start = il.append(factory.createFieldAccess( - // "java.lang.System", "out", p_stream, Constants.GETSTATIC)); - // il.append(new PUSH(cp, "Please enter your name> ")); - // il.append(factory.createInvoke("java.io.PrintStream", "print", - // Type.VOID, new Type[] { Type.STRING }, - // Constants.INVOKEVIRTUAL)); - // il.append(new ALOAD(in)); - // il.append(factory.createInvoke("java.io.BufferedReader", "readLine", - // Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); - InstructionHandle try_start = il.append(new PUSH(cp, "Andy")); - il.append(new ASTORE(name)); - // Upon normal execution we jump behind exception handler, the target - // address is not known yet. - GOTO g = new GOTO(null); - InstructionHandle try_end = il.append(g); - // We add the exception handler which simply returns from the method. - LocalVariableGen var_ex = mg.addLocalVariable("ex", Type - .getType("Ljava.io.IOException;"), null, null); - int var_ex_slot = var_ex.getIndex(); - InstructionHandle handler = il.append(new ASTORE(var_ex_slot)); - var_ex.setStart(handler); - var_ex.setEnd(il.append(InstructionConstants.RETURN)); - mg.addExceptionHandler(try_start, try_end, handler, new ObjectType( - "java.io.IOException")); - // "Normal" code continues, now we can set the branch target of the GOTO - // . - InstructionHandle ih = il.append(factory.createFieldAccess( - "java.lang.System", "out", p_stream, Constants.GETSTATIC)); - g.setTarget(ih); - // Printing "Hello": String concatenation compiles to StringBuffer - // operations. - il.append(factory.createNew(Type.STRINGBUFFER)); - il.append(InstructionConstants.DUP); - il.append(new PUSH(cp, "Hello, ")); - il - .append(factory.createInvoke("java.lang.StringBuffer", - "", Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKESPECIAL)); - il.append(new ALOAD(name)); - il.append(factory.createInvoke("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); - il.append(factory.createInvoke("java.lang.StringBuffer", "toString", - Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); - il - .append(factory.createInvoke("java.io.PrintStream", "println", - Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); - il.append(InstructionConstants.RETURN); - // Finalization: Finally, we have to set the stack size, which normally - // would have to be computed on the fly and add a default constructor - // method to the class, which is empty in this case. - mg.setMaxStack(); - mg.setMaxLocals(); - cg.addMethod(mg.getMethod()); - il.dispose(); // Allow instruction handles to be reused - cg.addEmptyConstructor(Constants.ACC_PUBLIC); - } + private void buildClassContents(ClassGen cg, ConstantPoolGen cp, + InstructionList il) + { + // Create method 'public static void main(String[]argv)' + MethodGen mg = createMethodGen("main", il, cp); + InstructionFactory factory = new InstructionFactory(cg); + // We now define some often used types: + ObjectType i_stream = new ObjectType("java.io.InputStream"); + ObjectType p_stream = new ObjectType("java.io.PrintStream"); + // Create variables in and name : We call the constructors, i.e., + // execute BufferedReader(InputStreamReader(System.in)) . The reference + // to the BufferedReader object stays on top of the stack and is stored + // in the newly allocated in variable. + il.append(factory.createNew("java.io.BufferedReader")); + il.append(InstructionConstants.DUP); // Use predefined constant + il.append(factory.createNew("java.io.InputStreamReader")); + il.append(InstructionConstants.DUP); + il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, + Constants.GETSTATIC)); + il.append(factory.createInvoke("java.io.InputStreamReader", "", + Type.VOID, new Type[] { i_stream }, Constants.INVOKESPECIAL)); + il.append(factory.createInvoke("java.io.BufferedReader", "", + Type.VOID, new Type[] { new ObjectType("java.io.Reader") }, + Constants.INVOKESPECIAL)); + LocalVariableGen lg = mg.addLocalVariable("in", new ObjectType( + "java.io.BufferedReader"), null, null); + int in = lg.getIndex(); + lg.setStart(il.append(new ASTORE(in))); // "in" valid from here + // Create local variable name and initialize it to null + lg = mg.addLocalVariable("name", Type.STRING, null, null); + int name = lg.getIndex(); + il.append(InstructionConstants.ACONST_NULL); + lg.setStart(il.append(new ASTORE(name))); // "name" valid from here + // Create try-catch block: We remember the start of the block, read a + // line from the standard input and store it into the variable name . + // InstructionHandle try_start = il.append(factory.createFieldAccess( + // "java.lang.System", "out", p_stream, Constants.GETSTATIC)); + // il.append(new PUSH(cp, "Please enter your name> ")); + // il.append(factory.createInvoke("java.io.PrintStream", "print", + // Type.VOID, new Type[] { Type.STRING }, + // Constants.INVOKEVIRTUAL)); + // il.append(new ALOAD(in)); + // il.append(factory.createInvoke("java.io.BufferedReader", "readLine", + // Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); + InstructionHandle try_start = il.append(new PUSH(cp, "Andy")); + il.append(new ASTORE(name)); + // Upon normal execution we jump behind exception handler, the target + // address is not known yet. + GOTO g = new GOTO(null); + InstructionHandle try_end = il.append(g); + // We add the exception handler which simply returns from the method. + LocalVariableGen var_ex = mg.addLocalVariable("ex", Type + .getType("Ljava.io.IOException;"), null, null); + int var_ex_slot = var_ex.getIndex(); + InstructionHandle handler = il.append(new ASTORE(var_ex_slot)); + var_ex.setStart(handler); + var_ex.setEnd(il.append(InstructionConstants.RETURN)); + mg.addExceptionHandler(try_start, try_end, handler, new ObjectType( + "java.io.IOException")); + // "Normal" code continues, now we can set the branch target of the GOTO + // . + InstructionHandle ih = il.append(factory.createFieldAccess( + "java.lang.System", "out", p_stream, Constants.GETSTATIC)); + g.setTarget(ih); + // Printing "Hello": String concatenation compiles to StringBuffer + // operations. + il.append(factory.createNew(Type.STRINGBUFFER)); + il.append(InstructionConstants.DUP); + il.append(new PUSH(cp, "Hello, ")); + il + .append(factory.createInvoke("java.lang.StringBuffer", + "", Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKESPECIAL)); + il.append(new ALOAD(name)); + il.append(factory.createInvoke("java.lang.StringBuffer", "append", + Type.STRINGBUFFER, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(factory.createInvoke("java.lang.StringBuffer", "toString", + Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); + il + .append(factory.createInvoke("java.io.PrintStream", "println", + Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); + il.append(InstructionConstants.RETURN); + // Finalization: Finally, we have to set the stack size, which normally + // would have to be computed on the fly and add a default constructor + // method to the class, which is empty in this case. + mg.setMaxStack(); + mg.setMaxLocals(); + cg.addMethod(mg.getMethod()); + il.dispose(); // Allow instruction handles to be reused + cg.addEmptyConstructor(Constants.ACC_PUBLIC); + } - private JavaClass getClassFrom(String where, String clazzname) - throws ClassNotFoundException - { - // System.out.println(where); - SyntheticRepository repos = createRepos(where); - return repos.loadClass(clazzname); - } + private JavaClass getClassFrom(String where, String clazzname) + throws ClassNotFoundException + { + // System.out.println(where); + SyntheticRepository repos = createRepos(where); + return repos.loadClass(clazzname); + } - // helper methods - private ClassGen createClassGen(String classname) - { - return new ClassGen(classname, "java.lang.Object", "", - Constants.ACC_PUBLIC | Constants.ACC_SUPER, null); - } + // helper methods + private ClassGen createClassGen(String classname) + { + return new ClassGen(classname, "java.lang.Object", "", + Constants.ACC_PUBLIC | Constants.ACC_SUPER, null); + } - private MethodGen createMethodGen(String methodname, InstructionList il, - ConstantPoolGen cp) - { - return new MethodGen(Constants.ACC_STATIC | Constants.ACC_PUBLIC, // access - // flags - Type.VOID, // return type - new Type[] { new ArrayType(Type.STRING, 1) }, // argument - // types - new String[] { "argv" }, // arg names - methodname, "HelloWorld", // method, class - il, cp); - } + private MethodGen createMethodGen(String methodname, InstructionList il, + ConstantPoolGen cp) + { + return new MethodGen(Constants.ACC_STATIC | Constants.ACC_PUBLIC, // access + // flags + Type.VOID, // return type + new Type[] { new ArrayType(Type.STRING, 1) }, // argument + // types + new String[] { "argv" }, // arg names + methodname, "HelloWorld", // method, class + il, cp); + } - public AnnotationEntryGen createSimpleVisibleAnnotation(ConstantPoolGen cp) - { - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_INT, cp, 4); - ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, cp); - ObjectType t = new ObjectType("SimpleAnnotation"); - List elements = new ArrayList(); - elements.add(nvGen); - AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); - return a; - } + public AnnotationEntryGen createSimpleVisibleAnnotation(ConstantPoolGen cp) + { + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_INT, cp, 4); + ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, cp); + ObjectType t = new ObjectType("SimpleAnnotation"); + List elements = new ArrayList(); + elements.add(nvGen); + AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); + return a; + } - public AnnotationEntryGen createFruitAnnotation(ConstantPoolGen cp, - String aFruit) - { - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.STRING, cp, aFruit); - ElementValuePairGen nvGen = new ElementValuePairGen("fruit", evg, cp); - ObjectType t = new ObjectType("SimpleStringAnnotation"); - List elements = new ArrayList(); - elements.add(nvGen); - return new AnnotationEntryGen(t, elements, true, cp); - } + public AnnotationEntryGen createFruitAnnotation(ConstantPoolGen cp, + String aFruit) + { + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.STRING, cp, aFruit); + ElementValuePairGen nvGen = new ElementValuePairGen("fruit", evg, cp); + ObjectType t = new ObjectType("SimpleStringAnnotation"); + List elements = new ArrayList(); + elements.add(nvGen); + return new AnnotationEntryGen(t, elements, true, cp); + } - public AnnotationEntryGen createCombinedAnnotation(ConstantPoolGen cp) - { - // Create an annotation instance - AnnotationEntryGen a = createSimpleVisibleAnnotation(cp); - ArrayElementValueGen array = new ArrayElementValueGen(cp); - array.addElement(new AnnotationElementValueGen(a, cp)); - ElementValuePairGen nvp = new ElementValuePairGen("value", array, cp); - List elements = new ArrayList(); - elements.add(nvp); - return new AnnotationEntryGen(new ObjectType("CombinedAnnotation"), - elements, true, cp); - } + public AnnotationEntryGen createCombinedAnnotation(ConstantPoolGen cp) + { + // Create an annotation instance + AnnotationEntryGen a = createSimpleVisibleAnnotation(cp); + ArrayElementValueGen array = new ArrayElementValueGen(cp); + array.addElement(new AnnotationElementValueGen(a, cp)); + ElementValuePairGen nvp = new ElementValuePairGen("value", array, cp); + List elements = new ArrayList(); + elements.add(nvp); + return new AnnotationEntryGen(new ObjectType("CombinedAnnotation"), + elements, true, cp); + } - public AnnotationEntryGen createSimpleInvisibleAnnotation(ConstantPoolGen cp) - { - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_INT, cp, 4); - ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, cp); - ObjectType t = new ObjectType("SimpleAnnotation"); - List elements = new ArrayList(); - elements.add(nvGen); - AnnotationEntryGen a = new AnnotationEntryGen(t, elements, false, cp); - return a; - } + public AnnotationEntryGen createSimpleInvisibleAnnotation(ConstantPoolGen cp) + { + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_INT, cp, 4); + ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, cp); + ObjectType t = new ObjectType("SimpleAnnotation"); + List elements = new ArrayList(); + elements.add(nvGen); + AnnotationEntryGen a = new AnnotationEntryGen(t, elements, false, cp); + return a; + } } \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java b/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java index c14afd15..a8de8f8f 100644 --- a/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java +++ b/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java @@ -13,7 +13,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * */ package org.apache.bcel.data; @@ -21,4 +21,14 @@ package org.apache.bcel.data; @CombinedAnnotation( { @SimpleAnnotation(id = 4) }) public class AnnotatedWithCombinedAnnotation { + public AnnotatedWithCombinedAnnotation(int param1, @SimpleAnnotation(id=42) int param2) { + } + + @CombinedAnnotation( {}) + public void methodWithArrayOfZeroAnnotations() { + } + + @CombinedAnnotation( { @SimpleAnnotation(id=1, fruit="apples"), @SimpleAnnotation(id= 2, fruit="oranges")}) + public void methodWithArrayOfTwoAnnotations() { + } } -- GitLab From f38936857b7d7d055c9acac74cf75537e70699b1 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 28 May 2012 12:24:46 +0000 Subject: [PATCH 0546/1313] Bug 53303 - [PATCH] ClassPath.getResource does not correctly perform URL escaping (edit) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1343224 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/ClassPath.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index aef9ea74..0a090ea5 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -408,7 +408,7 @@ public class ClassPath implements Serializable { // Resource specification uses '/' whatever the platform final File file = new File(dir + File.separatorChar + name.replace('/', File.separatorChar)); try { - return file.exists() ? file.toURL() : null; + return file.exists() ? file.toURI().toURL() : null; } catch (MalformedURLException e) { return null; } -- GitLab From 2afbf5abddbb6194ad84de2f913051a74ff7e8aa Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 28 May 2012 12:30:08 +0000 Subject: [PATCH 0547/1313] Update to commons-parent 25. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1343226 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b08186ce..f2d1c1c4 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ org.apache.commons commons-parent - 23 + 25 org.apache.bcel -- GitLab From 5ffa04d9ccfb14ea2255faf0d1719021a7c7154d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 26 Jun 2012 12:23:55 +0000 Subject: [PATCH 0548/1313] Update JUnit version git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1353988 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f2d1c1c4..e8ececc1 100644 --- a/pom.xml +++ b/pom.xml @@ -240,7 +240,7 @@ junit junit - 3.8.2 + 4.10 test -- GitLab From dcae96f24b09c6e56a0ea755e21fc1010e1aeda3 Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Sun, 26 Aug 2012 22:02:59 +0000 Subject: [PATCH 0549/1313] https://issues.apache.org/bugzilla/show_bug.cgi?id=51661 Add some initial plumbing for InvokeDynamic (Java 7) support. This is not complete. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1377530 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 14 +- .../org/apache/bcel/classfile/Constant.java | 6 + .../bcel/classfile/ConstantInvokeDynamic.java | 123 ++++++++++++++++++ .../bcel/classfile/ConstantMethodHandle.java | 121 +++++++++++++++++ .../bcel/classfile/ConstantMethodType.java | 107 +++++++++++++++ 5 files changed, 369 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java create mode 100644 src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java create mode 100644 src/main/java/org/apache/bcel/classfile/ConstantMethodType.java diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index d50cd581..51cb56d0 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -256,13 +256,23 @@ public interface Constants { /** Marks a constant pool entry as a name and type. */ public final static byte CONSTANT_NameAndType = 12; + /** Marks a constant pool entry as a Method Handle. */ + public static final byte CONSTANT_MethodHandle = 15; + + /** Marks a constant pool entry as a Method Type. */ + public static final byte CONSTANT_MethodType = 16; + + /** Marks a constant pool entry as an Invoke Dynamic */ + public static final byte CONSTANT_InvokeDynamic = 18; + /** The names of the types of entries in a constant pool. */ - public final static String[] CONSTANT_NAMES = { + public static final String[] CONSTANT_NAMES = { "", "CONSTANT_Utf8", "", "CONSTANT_Integer", "CONSTANT_Float", "CONSTANT_Long", "CONSTANT_Double", "CONSTANT_Class", "CONSTANT_String", "CONSTANT_Fieldref", "CONSTANT_Methodref", "CONSTANT_InterfaceMethodref", - "CONSTANT_NameAndType" }; + "CONSTANT_NameAndType", "CONSTANT_MethodHandle", + "CONSTANT_MethodType", "CONSTANT_InvokeDynamic" }; /** The name of the static initializer, also called "class * initialization method" or "interface initialization diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index f6a03ff1..386955a8 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -146,6 +146,12 @@ public abstract class Constant implements Cloneable, Node, Serializable { return new ConstantNameAndType(file); case Constants.CONSTANT_Utf8: return new ConstantUtf8(file); + case Constants.CONSTANT_MethodHandle: + return new ConstantMethodHandle(file); + case Constants.CONSTANT_MethodType: + return new ConstantMethodType(file); + case Constants.CONSTANT_InvokeDynamic: + return new ConstantInvokeDynamic(file); default: throw new ClassFormatException("Invalid byte tag in constant pool: " + b); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java b/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java new file mode 100644 index 00000000..4a2b1373 --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInput; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * This class is derived from the abstract + * Constant class + * and represents a reference to a invoke dynamic. + * + * @see Constant + */ +public final class ConstantInvokeDynamic extends Constant { + + private static final long serialVersionUID = 4310367359017396174L; + private int bootstrap_method_attr_index; + private int name_and_type_index; + + + /** + * Initialize from another object. + */ + public ConstantInvokeDynamic(ConstantInvokeDynamic c) { + this(c.getBootstrapMethodAttrIndex(), c.getNameAndTypeIndex()); + } + + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throws IOException + */ + ConstantInvokeDynamic(DataInput file) throws IOException { + this(file.readUnsignedShort(), file.readUnsignedShort()); + } + + + public ConstantInvokeDynamic(int bootstrap_method_attr_index, + int name_and_type_index) { + super(Constants.CONSTANT_InvokeDynamic); + this.bootstrap_method_attr_index = bootstrap_method_attr_index; + this.name_and_type_index = name_and_type_index; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitly + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + @Override + public void accept( Visitor v ) { + // TODO Add .visitMethodType to Visitor interface + } + + + /** + * Dump name and signature index to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + @Override + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(tag); + file.writeShort(bootstrap_method_attr_index); + file.writeShort(name_and_type_index); + } + + + public int getBootstrapMethodAttrIndex() { + return bootstrap_method_attr_index; + } + + + public void setBootstrapMethodAttrIndex(int bootstrap_method_attr_index) { + this.bootstrap_method_attr_index = bootstrap_method_attr_index; + } + + + public int getNameAndTypeIndex() { + return name_and_type_index; + } + + + public void setNameAndTypeIndex(int name_and_type_index) { + this.name_and_type_index = name_and_type_index; + } + + + /** + * @return String representation + */ + @Override + public final String toString() { + return super.toString() + "(bootstrap_method_attr_index = " + + bootstrap_method_attr_index + ", name_and_type_index = " + + name_and_type_index + ")"; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java new file mode 100644 index 00000000..24905708 --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInput; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * This class is derived from the abstract + * Constant class + * and represents a reference to a method handle. + * + * @see Constant + */ +public final class ConstantMethodHandle extends Constant { + + private static final long serialVersionUID = -7875124116920198044L; + private int reference_kind; + private int reference_index; + + + /** + * Initialize from another object. + */ + public ConstantMethodHandle(ConstantMethodHandle c) { + this(c.getReferenceKind(), c.getReferenceIndex()); + } + + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throws IOException + */ + ConstantMethodHandle(DataInput file) throws IOException { + this(file.readUnsignedByte(), file.readUnsignedShort()); + } + + + public ConstantMethodHandle(int reference_kind, int reference_index) { + super(Constants.CONSTANT_MethodHandle); + this.reference_kind = reference_kind; + this.reference_index = reference_index; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitly + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + @Override + public void accept( Visitor v ) { + // TODO Add .visitMethodHandle to Visitor interface + } + + + /** + * Dump method kind and index to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + @Override + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(tag); + file.writeByte(reference_kind); + file.writeShort(reference_index); + } + + + public int getReferenceKind() { + return reference_kind; + } + + + public void setReferenceKind(int reference_kind) { + this.reference_kind = reference_kind; + } + + + public int getReferenceIndex() { + return reference_index; + } + + + public void setReferenceIndex(int reference_index) { + this.reference_index = reference_index; + } + + + /** + * @return String representation + */ + @Override + public final String toString() { + return super.toString() + "(reference_kind = " + reference_kind + + ", reference_index = " + reference_index + ")"; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java new file mode 100644 index 00000000..33debb48 --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.classfile; + +import java.io.DataInput; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * This class is derived from the abstract + * Constant class + * and represents a reference to a method type. + * + * @see Constant + */ +public final class ConstantMethodType extends Constant { + + private static final long serialVersionUID = 6750768220616618881L; + private int descriptor_index; + + + /** + * Initialize from another object. + */ + public ConstantMethodType(ConstantMethodType c) { + this(c.getDescriptorIndex()); + } + + + /** + * Initialize instance from file data. + * + * @param file Input stream + * @throws IOException + */ + ConstantMethodType(DataInput file) throws IOException { + this(file.readUnsignedShort()); + } + + + public ConstantMethodType(int descriptor_index) { + super(Constants.CONSTANT_MethodType); + this.descriptor_index = descriptor_index; + } + + + /** + * Called by objects that are traversing the nodes of the tree implicitly + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + @Override + public void accept( Visitor v ) { + // TODO Add .visitMethodType to Visitor interface + } + + + /** + * Dump name and signature index to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + @Override + public final void dump( DataOutputStream file ) throws IOException { + file.writeByte(tag); + file.writeShort(descriptor_index); + } + + + public int getDescriptorIndex() { + return descriptor_index; + } + + + public void setDescriptorIndex(int descriptor_index) { + this.descriptor_index = descriptor_index; + } + + + /** + * @return String representation + */ + @Override + public final String toString() { + return super.toString() + "(descriptor_index = " + descriptor_index + ")"; + } +} -- GitLab From bbbf3d9e1cca4ea690665317368cb4b6d022598e Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 30 Aug 2012 15:03:13 +0000 Subject: [PATCH 0550/1313] Update to CP 26. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1378975 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e8ececc1..9425fc5b 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ org.apache.commons commons-parent - 25 + 26 org.apache.bcel -- GitLab From 5b359afdcd5e097343cadc1fe53027712ce82e06 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 7 Dec 2012 10:43:42 +0000 Subject: [PATCH 0551/1313] Now using JIRA git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1418268 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9425fc5b..ed0637cd 100644 --- a/pom.xml +++ b/pom.xml @@ -53,6 +53,8 @@ * + BCEL + 12314220 @@ -162,8 +164,8 @@ - bugzilla - https://issues.apache.org/bugzilla + jira + http://issues.apache.org/jira/browse/BCEL -- GitLab From 85caf57be0261503402fb20d17fab9be7a6199dc Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 7 Dec 2012 11:39:20 +0000 Subject: [PATCH 0552/1313] Avoid compiler warning git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1418284 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/Instruction.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index 54fe9992..d652f8d4 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -132,6 +132,7 @@ public abstract class Instruction implements Cloneable, Serializable { * * @param bytes byte sequence to read from * @param wide "wide" instruction flag + * @throws IOException may be thrown if the implementation needs to read data from the file */ protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { } -- GitLab From 0128d7e799e52419bdd8b0d9b1c031c745e2d122 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 30 Jan 2013 21:43:00 +0000 Subject: [PATCH 0553/1313] developed by => developed at git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1440692 13f79535-47bb-0310-9956-ffa450edef68 --- NOTICE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NOTICE.txt b/NOTICE.txt index e17bd220..51ad358f 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,5 +1,5 @@ Apache Commons BCEL Copyright 2004-2012 The Apache Software Foundation -This product includes software developed by +This product includes software developed at The Apache Software Foundation (http://www.apache.org/). -- GitLab From a47c46bc9ff807119c4810caae00705c02821574 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Mon, 18 Feb 2013 01:23:22 +0000 Subject: [PATCH 0554/1313] add constant for version 8 class file format[52] git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1447116 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 56 ++++++++++++-------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 51cb56d0..28eaf96c 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel; @@ -84,7 +84,7 @@ public interface Constants { * @see #MAJOR_1_6 * */ public final static short MINOR_1_6 = 0; - + /** Major version number of class files for Java 1.7. * @see #MINOR_1_7 * */ @@ -95,6 +95,16 @@ public interface Constants { * */ public final static short MINOR_1_7 = 0; + /** Major version number of class files for Java 1.8. + * @see #MINOR_1_8 + * */ + public final static short MAJOR_1_8 = 52; + + /** Minor version number of class files for Java 1.8. + * @see #MAJOR_1_8 + * */ + public final static short MINOR_1_8 = 0; + /** Default major version number. Class file is for Java 1.1. * @see #MAJOR_1_1 * */ @@ -174,7 +184,7 @@ public interface Constants { * @see #ACC_PUBLIC */ public final static short ACC_NATIVE = 0x0100; - + /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ @@ -189,7 +199,7 @@ public interface Constants { * @see #ACC_PUBLIC */ public final static short ACC_STRICT = 0x0800; - + /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ @@ -1249,7 +1259,7 @@ public interface Constants { /** * Names of opcodes. Indexed by opcode. OPCODE_NAMES[ALOAD] = "aload". - */ + */ public static final String[] OPCODE_NAMES = { "nop", "aconst_null", "iconst_m1", "iconst_0", "iconst_1", "iconst_2", "iconst_3", "iconst_4", "iconst_5", "lconst_0", @@ -1303,7 +1313,7 @@ public interface Constants { * Number of words consumed on operand stack by instructions. * Indexed by opcode. CONSUME_STACK[FALOAD] = number of words * consumed from the stack by a faload instruction. - */ + */ public static final int[] CONSUME_STACK = { 0/*nop*/, 0/*aconst_null*/, 0/*iconst_m1*/, 0/*iconst_0*/, 0/*iconst_1*/, 0/*iconst_2*/, 0/*iconst_3*/, 0/*iconst_4*/, 0/*iconst_5*/, 0/*lconst_0*/, @@ -1327,7 +1337,7 @@ public interface Constants { 1/*fneg*/, 2/*dneg*/, 2/*ishl*/, 3/*lshl*/, 2/*ishr*/, 3/*lshr*/, 2/*iushr*/, 3/*lushr*/, 2/*iand*/, 4/*land*/, 2/*ior*/, 4/*lor*/, 2/*ixor*/, 4/*lxor*/, 0/*iinc*/, 1/*i2l*/, 1/*i2f*/, 1/*i2d*/, 2/*l2i*/, 2/*l2f*/, 2/*l2d*/, 1/*f2i*/, 1/*f2l*/, - 1/*f2d*/, 2/*d2i*/, 2/*d2l*/, 2/*d2f*/, 1/*i2b*/, 1/*i2c*/, 1/*i2s*/, + 1/*f2d*/, 2/*d2i*/, 2/*d2l*/, 2/*d2f*/, 1/*i2b*/, 1/*i2c*/, 1/*i2s*/, 4/*lcmp*/, 2/*fcmpl*/, 2/*fcmpg*/, 4/*dcmpl*/, 4/*dcmpg*/, 1/*ifeq*/, 1/*ifne*/, 1/*iflt*/, 1/*ifge*/, 1/*ifgt*/, 1/*ifle*/, 2/*if_icmpeq*/, 2/*if_icmpne*/, 2/*if_icmplt*/, 2 /*if_icmpge*/, 2/*if_icmpgt*/, 2/*if_icmple*/, 2/*if_acmpeq*/, 2/*if_acmpne*/, @@ -1359,7 +1369,7 @@ public interface Constants { * Number of words produced onto operand stack by instructions. * Indexed by opcode. CONSUME_STACK[DALOAD] = number of words * consumed from the stack by a daload instruction. - */ + */ public static final int[] PRODUCE_STACK = { 0/*nop*/, 1/*aconst_null*/, 1/*iconst_m1*/, 1/*iconst_0*/, 1/*iconst_1*/, 1/*iconst_2*/, 1/*iconst_3*/, 1/*iconst_4*/, 1/*iconst_5*/, 2/*lconst_0*/, @@ -1442,7 +1452,7 @@ public interface Constants { "SourceFile", "ConstantValue", "Code", "Exceptions", "LineNumberTable", "LocalVariableTable", "InnerClasses", "Synthetic", "Deprecated", - "PMGClass", "Signature", "StackMap", + "PMGClass", "Signature", "StackMap", "RuntimeVisibleAnnotations", "RuntimeInvisibleAnnotations", "RuntimeVisibleParameterAnnotations", "RuntimeInvisibleParameterAnnotations", "AnnotationDefault", "LocalVariableTypeTable", "EnclosingMethod", "StackMapTable" @@ -1462,25 +1472,25 @@ public interface Constants { public static final String[] ITEM_NAMES = { "Bogus", "Integer", "Float", "Double", "Long", - "Null", "InitObject", "Object", "NewObject" + "Null", "InitObject", "Object", "NewObject" }; - + /** Constants used to identify StackMapEntry types. - * - * For those types which can specify a range, the + * + * For those types which can specify a range, the * constant names the lowest value. */ - public static final int SAME_FRAME = 0; - public static final int SAME_LOCALS_1_STACK_ITEM_FRAME = 64; - public static final int SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED = 247; - public static final int CHOP_FRAME = 248; - public static final int SAME_FRAME_EXTENDED = 251; - public static final int APPEND_FRAME = 252; - public static final int FULL_FRAME = 255; - - /** Constants that define the maximum value of + public static final int SAME_FRAME = 0; + public static final int SAME_LOCALS_1_STACK_ITEM_FRAME = 64; + public static final int SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED = 247; + public static final int CHOP_FRAME = 248; + public static final int SAME_FRAME_EXTENDED = 251; + public static final int APPEND_FRAME = 252; + public static final int FULL_FRAME = 255; + + /** Constants that define the maximum value of * those constants which store ranges. */ - + public static final int SAME_FRAME_MAX = 63; public static final int SAME_LOCALS_1_STACK_ITEM_FRAME_MAX = 127; public static final int CHOP_FRAME_MAX = 250; -- GitLab From 53e38c321462943bff06778ce5210fdea0d41ced Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Tue, 26 Feb 2013 23:53:27 +0000 Subject: [PATCH 0555/1313] restore download cgi git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1450539 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/resources/download_bcel.cgi | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/site/resources/download_bcel.cgi diff --git a/src/site/resources/download_bcel.cgi b/src/site/resources/download_bcel.cgi new file mode 100644 index 00000000..495cde12 --- /dev/null +++ b/src/site/resources/download_bcel.cgi @@ -0,0 +1,4 @@ +#!/bin/sh +# Just call the standard mirrors.cgi script. It will use download.html +# as the input template. +exec /www/www.apache.org/dyn/mirrors/mirrors.cgi $* \ No newline at end of file -- GitLab From dcd5c988d6cbf53c1e5b58812a412aca4ea9194d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 22 Mar 2013 17:49:27 +0000 Subject: [PATCH 0556/1313] Fix up URLs so they point to actual sites; this allows relative URLs to work properly git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1459912 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ed0637cd..f95a1ca5 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ Commons BCEL Bytecode Engineering Library - http://commons.apache.org/bcel + http://commons.apache.org/proper/commons-bcel 2004 -- GitLab From 6430bee3005d1615f9d038a271460e64ff08a237 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 2 Apr 2013 03:59:29 +0000 Subject: [PATCH 0557/1313] add javadoc plugin to pom git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1463375 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pom.xml b/pom.xml index f95a1ca5..5cfa9cc9 100644 --- a/pom.xml +++ b/pom.xml @@ -212,6 +212,13 @@ gnu + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9 + + + -- GitLab From fccd1a0ce4cd7a3b400fa04a6f0f380af57a2bcb Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sat, 11 May 2013 17:34:32 +0000 Subject: [PATCH 0558/1313] incorporate changes used by Findbugs from BCEL-163 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1481383 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Constant.java | 2 +- .../apache/bcel/classfile/ConstantUtf8.java | 62 ++++++++++++++++++- .../org/apache/bcel/classfile/LineNumber.java | 16 ++--- .../org/apache/bcel/generic/ArrayType.java | 2 +- .../org/apache/bcel/generic/FieldGen.java | 2 +- .../apache/bcel/generic/FieldOrMethod.java | 4 +- .../bcel/generic/InstructionFactory.java | 2 +- .../org/apache/bcel/generic/MethodGen.java | 4 +- .../org/apache/bcel/generic/ObjectType.java | 27 +++++++- .../apache/bcel/generic/ReferenceType.java | 6 +- .../java/org/apache/bcel/generic/Type.java | 16 ++--- .../structurals/InstConstraintVisitor.java | 6 +- .../verifier/structurals/Pass3bVerifier.java | 4 +- 13 files changed, 117 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index 386955a8..71653ab4 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -145,7 +145,7 @@ public abstract class Constant implements Cloneable, Node, Serializable { case Constants.CONSTANT_NameAndType: return new ConstantNameAndType(file); case Constants.CONSTANT_Utf8: - return new ConstantUtf8(file); + return ConstantUtf8.getInstance(file); case Constants.CONSTANT_MethodHandle: return new ConstantMethodHandle(file); case Constants.CONSTANT_MethodType: diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index ab06d54a..a095cdae 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -18,8 +18,12 @@ package org.apache.bcel.classfile; import java.io.DataInput; +import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; import org.apache.bcel.Constants; @@ -35,8 +39,59 @@ import org.apache.bcel.Constants; public final class ConstantUtf8 extends Constant { private static final long serialVersionUID = -8709101585611518985L; - private String bytes; + private final String bytes; + + private static final int MAX_CACHE_ENTRIES = 20000; + private static final int INITIAL_CACHE_CAPACITY = (int)(MAX_CACHE_ENTRIES/0.75); + private static HashMap cache; + private static int considered = 0; + private static int hits = 0; + private static int skipped = 0; + private static int created = 0; + final static boolean BCEL_STATISTICS = Boolean.getBoolean("bcel.statistics"); + final static boolean BCEL_DONT_CACHE = Boolean.getBoolean("bcel.dontCache"); + + static { + if (BCEL_STATISTICS) + Runtime.getRuntime().addShutdownHook(new Thread() { + public void run() { + System.err.println("Cache hit " + hits + "/" + considered +", " + + skipped + " skipped"); + System.err.println("Total of " + created + " ConstantUtf8 objects created"); + } + }); + } + public static synchronized ConstantUtf8 getCachedInstance(String s) { + if (BCEL_DONT_CACHE || s.length() > 200) { + skipped++; + return new ConstantUtf8(s); + } + considered++; + if (cache == null) { + cache = new LinkedHashMap(INITIAL_CACHE_CAPACITY, 0.75f, true) { + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > MAX_CACHE_ENTRIES; + } + }; + } + ConstantUtf8 result = cache.get(s); + if (result != null) { + hits++; + return result; + } + result = new ConstantUtf8(s); + cache.put(s, result); + return result; + } + + public static ConstantUtf8 getInstance(String s) { + return getCachedInstance(s); + } + + public static ConstantUtf8 getInstance (DataInputStream file) throws IOException { + return getInstance(file.readUTF()); + } /** * Initialize from another object. @@ -55,6 +110,7 @@ public final class ConstantUtf8 extends Constant { ConstantUtf8(DataInput file) throws IOException { super(Constants.CONSTANT_Utf8); bytes = file.readUTF(); + created++; } @@ -67,6 +123,7 @@ public final class ConstantUtf8 extends Constant { throw new IllegalArgumentException("bytes must not be null!"); } this.bytes = bytes; + created++; } @@ -106,9 +163,10 @@ public final class ConstantUtf8 extends Constant { /** * @param bytes the raw bytes of this Utf-8 + * @deprecated */ public final void setBytes( String bytes ) { - this.bytes = bytes; + throw new UnsupportedOperationException(); } diff --git a/src/main/java/org/apache/bcel/classfile/LineNumber.java b/src/main/java/org/apache/bcel/classfile/LineNumber.java index 0a544020..985ade04 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumber.java @@ -34,8 +34,8 @@ import java.io.Serializable; public final class LineNumber implements Cloneable, Node, Serializable { private static final long serialVersionUID = 169537400672820016L; - private int start_pc; // Program Counter (PC) corresponds to line - private int line_number; // number in source file + private short start_pc; // Program Counter (PC) corresponds to line + private short line_number; // number in source file /** @@ -61,8 +61,8 @@ public final class LineNumber implements Cloneable, Node, Serializable { * @param line_number line number in source file */ public LineNumber(int start_pc, int line_number) { - this.start_pc = start_pc; - this.line_number = line_number; + this.start_pc = (short) start_pc; + this.line_number = (short)line_number; } @@ -94,7 +94,7 @@ public final class LineNumber implements Cloneable, Node, Serializable { * @return Corresponding source line */ public final int getLineNumber() { - return line_number; + return 0xffff & line_number; } @@ -102,7 +102,7 @@ public final class LineNumber implements Cloneable, Node, Serializable { * @return PC in code */ public final int getStartPC() { - return start_pc; + return 0xffff & start_pc; } @@ -110,7 +110,7 @@ public final class LineNumber implements Cloneable, Node, Serializable { * @param line_number the source line number */ public final void setLineNumber( int line_number ) { - this.line_number = line_number; + this.line_number = (short) line_number; } @@ -118,7 +118,7 @@ public final class LineNumber implements Cloneable, Node, Serializable { * @param start_pc the pc for this line number */ public final void setStartPC( int start_pc ) { - this.start_pc = start_pc; + this.start_pc = (short) start_pc; } diff --git a/src/main/java/org/apache/bcel/generic/ArrayType.java b/src/main/java/org/apache/bcel/generic/ArrayType.java index 924c8f40..e0eeabf0 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayType.java +++ b/src/main/java/org/apache/bcel/generic/ArrayType.java @@ -48,7 +48,7 @@ public final class ArrayType extends ReferenceType { * @param class_name complete name of class (java.lang.String, e.g.) */ public ArrayType(String class_name, int dimensions) { - this(new ObjectType(class_name), dimensions); + this(ObjectType.getInstance(class_name), dimensions); } diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index eac8a558..16f90d54 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -117,7 +117,7 @@ public class FieldGen extends FieldGenOrMethodGen { * by the JVM automatically. */ public void setInitValue( String str ) { - checkType(new ObjectType("java.lang.String")); + checkType( ObjectType.getInstance("java.lang.String")); if (str != null) { value = str; } diff --git a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java index 790f639e..b358f6eb 100644 --- a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java @@ -100,7 +100,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { */ @Deprecated public ObjectType getClassType( ConstantPoolGen cpg ) { - return new ObjectType(getClassName(cpg)); + return ObjectType.getInstance(getClassName(cpg)); } @@ -121,7 +121,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { return (ArrayType) Type.getType(className); } else { className = className.replace('/', '.'); - return new ObjectType(className); + return ObjectType.getInstance(className); } } diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index 59ddd5dd..9a24b4c5 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -622,7 +622,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali public NEW createNew( String s ) { - return createNew(new ObjectType(s)); + return createNew(ObjectType.getInstance(s)); } diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 11582446..c0687074 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -136,7 +136,7 @@ public class MethodGen extends FieldGenOrMethodGen { /* Add local variables, namely the implicit `this' and the arguments */ if (!isStatic() && (class_name != null)) { // Instance method -> `this' is local var 0 - addLocalVariable("this", new ObjectType(class_name), start, end); + addLocalVariable("this", ObjectType.getInstance(class_name), start, end); } } if (arg_types != null) { @@ -197,7 +197,7 @@ public class MethodGen extends FieldGenOrMethodGen { if (type > 0) { String cen = m.getConstantPool().getConstantString(type, Constants.CONSTANT_Class); - c_type = new ObjectType(cen); + c_type = ObjectType.getInstance(cen); } int end_pc = ce.getEndPC(); int length = m.getCode().getCode().length; diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index 32bd7b72..e47314ef 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -17,6 +17,10 @@ */ package org.apache.bcel.generic; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; @@ -30,8 +34,27 @@ import org.apache.bcel.classfile.JavaClass; public class ObjectType extends ReferenceType { private static final long serialVersionUID = -2819379966444533294L; - private String class_name; // Class name of type - + private final String class_name; // Class name of type + private static final int MAX_CACHE_ENTRIES = 200; + private static final int INITIAL_CACHE_CAPACITY = (int)(MAX_CACHE_ENTRIES/0.75); + private static HashMap cache; + + public synchronized static ObjectType getInstance(String class_name) { + if (cache == null) + cache = new LinkedHashMap(INITIAL_CACHE_CAPACITY, 0.75f, true) { + + + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > MAX_CACHE_ENTRIES; + } + + }; + ObjectType result = cache.get(class_name); + if (result != null) return result; + result = new ObjectType(class_name); + cache.put(class_name, result); + return result; + } /** * @param class_name fully qualified class name, e.g. java.lang.String diff --git a/src/main/java/org/apache/bcel/generic/ReferenceType.java b/src/main/java/org/apache/bcel/generic/ReferenceType.java index 43e9ff4a..5a03d3ec 100644 --- a/src/main/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/main/java/org/apache/bcel/generic/ReferenceType.java @@ -166,7 +166,7 @@ public abstract class ReferenceType extends Type { // 'java.io.Serializable'" if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact())) { for (int ii = 0; ii < Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS.length; ii++) { - if (T.equals(new ObjectType(Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS[ii]))) { + if (T.equals(ObjectType.getInstance(Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS[ii]))) { return true; } } @@ -252,7 +252,7 @@ public abstract class ReferenceType extends Type { for (int i = 0; i < t_sups.length; i++) { for (int j = 0; j < this_sups.length; j++) { if (this_sups[j].equals(t_sups[i])) { - return new ObjectType(this_sups[j].getClassName()); + return ObjectType.getInstance(this_sups[j].getClassName()); } } } @@ -325,7 +325,7 @@ public abstract class ReferenceType extends Type { for (int i = 0; i < t_sups.length; i++) { for (int j = 0; j < this_sups.length; j++) { if (this_sups[j].equals(t_sups[i])) { - return new ObjectType(this_sups[j].getClassName()); + return ObjectType.getInstance(this_sups[j].getClassName()); } } } diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 8f5c02e9..0c6c21a4 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -34,7 +34,7 @@ import org.apache.bcel.classfile.Utility; public abstract class Type implements java.io.Serializable { private static final long serialVersionUID = -1985077286871826895L; - protected byte type; + protected final byte type; protected String signature; // signature for the type /** Predefined constants */ @@ -47,11 +47,11 @@ public abstract class Type implements java.io.Serializable { public static final BasicType DOUBLE = new BasicType(Constants.T_DOUBLE); public static final BasicType FLOAT = new BasicType(Constants.T_FLOAT); public static final BasicType CHAR = new BasicType(Constants.T_CHAR); - public static final ObjectType OBJECT = new ObjectType("java.lang.Object"); - public static final ObjectType CLASS = new ObjectType("java.lang.Class"); - public static final ObjectType STRING = new ObjectType("java.lang.String"); - public static final ObjectType STRINGBUFFER = new ObjectType("java.lang.StringBuffer"); - public static final ObjectType THROWABLE = new ObjectType("java.lang.Throwable"); + public static final ObjectType OBJECT = ObjectType.getInstance("java.lang.Object"); + public static final ObjectType CLASS = ObjectType.getInstance("java.lang.Class"); + public static final ObjectType STRING = ObjectType.getInstance("java.lang.String"); + public static final ObjectType STRINGBUFFER = ObjectType.getInstance("java.lang.StringBuffer"); + public static final ObjectType THROWABLE = ObjectType.getInstance("java.lang.Throwable"); public static final Type[] NO_ARGS = new Type[0]; public static final ReferenceType NULL = new ReferenceType() { @@ -202,7 +202,7 @@ public abstract class Type implements java.io.Serializable { } //corrected concurrent private static field acess wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed - return new ObjectType(signature.substring(1, index).replace('/', '.')); + return ObjectType.getInstance(signature.substring(1, index).replace('/', '.')); } } @@ -290,7 +290,7 @@ public abstract class Type implements java.io.Serializable { throw new IllegalStateException("Ooops, what primitive type is " + cl); } } else { // "Real" class - return new ObjectType(cl.getName()); + return ObjectType.getInstance(cl.getName()); } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index cc190d64..04999f86 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -53,7 +53,7 @@ import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; */ public class InstConstraintVisitor extends EmptyVisitor{ - private static final ObjectType GENERIC_ARRAY = new ObjectType("org.apache.bcel.verifier.structurals.GenericArray"); + private static final ObjectType GENERIC_ARRAY = ObjectType.getInstance("org.apache.bcel.verifier.structurals.GenericArray"); /** * The constructor. Constructs a new instance of this class. @@ -1276,7 +1276,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ if (f.isProtected()){ ObjectType classtype = o.getClassType(cpg); - ObjectType curr = new ObjectType(mg.getClassName()); + ObjectType curr = ObjectType.getInstance(mg.getClassName()); if ( classtype.equals(curr) || curr.subclassOf(classtype) ){ @@ -2689,7 +2689,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ if (f.isProtected()){ ObjectType classtype = o.getClassType(cpg); - ObjectType curr = new ObjectType(mg.getClassName()); + ObjectType curr = ObjectType.getInstance(mg.getClassName()); if ( classtype.equals(curr) || curr.subclassOf(classtype) ){ diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index a8f7224f..2a0a4cf9 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -356,12 +356,12 @@ public final class Pass3bVerifier extends PassVerifier{ Frame f = new Frame(mg.getMaxLocals(),mg.getMaxStack()); if ( !mg.isStatic() ){ if (mg.getName().equals(Constants.CONSTRUCTOR_NAME)){ - Frame._this = new UninitializedObjectType(new ObjectType(jc.getClassName())); + Frame._this = new UninitializedObjectType(ObjectType.getInstance(jc.getClassName())); f.getLocals().set(0, Frame._this); } else{ Frame._this = null; - f.getLocals().set(0, new ObjectType(jc.getClassName())); + f.getLocals().set(0, ObjectType.getInstance(jc.getClassName())); } } Type[] argtypes = mg.getArgumentTypes(); -- GitLab From 0ff40ec0d074ad9c790e01c2e150aee99eda5382 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 14 May 2013 14:32:33 +0000 Subject: [PATCH 0559/1313] update release notes for bcel-163 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1482346 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 67083731..4c260f50 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -27,6 +27,7 @@ Enhancements from 5.2 --------------------- 32945 Wrap JavaClass repository class (map values) with... +BCEL-163 - Incorporate patch file from Findbugs Feedback @@ -39,4 +40,4 @@ http://issues.apache.org/bugzilla/buglist.cgi?product=BCEL Or subscribe to the bcel-user mailing list -The BCEL Team \ No newline at end of file +The BCEL Team -- GitLab From 7f4faa85489bc02250686f67a1086db0cdb81424 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 15 Oct 2013 05:52:15 +0000 Subject: [PATCH 0560/1313] make clone() more user friendly git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1532197 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Attribute.java | 10 +++++----- src/main/java/org/apache/bcel/classfile/Constant.java | 9 +++++++-- src/main/java/org/apache/bcel/generic/ClassGen.java | 7 +++---- .../java/org/apache/bcel/generic/CodeExceptionGen.java | 7 +++---- .../org/apache/bcel/generic/FieldGenOrMethodGen.java | 8 ++++---- .../java/org/apache/bcel/generic/LineNumberGen.java | 7 +++---- .../java/org/apache/bcel/generic/LocalVariableGen.java | 7 +++---- 7 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 26eb9916..9a03ea09 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -298,18 +298,18 @@ public abstract class Attribute implements Cloneable, Node, Serializable * @return shallow copy of this attribute */ @Override - public Object clone() + public Attribute clone() { - Object o = null; + Attribute attr = null; try { - o = super.clone(); + attr = (Attribute) super.clone(); } catch (CloneNotSupportedException e) { - e.printStackTrace(); // Never occurs + throw new Error("Clone Not Supported"); // never happens } - return o; + return attr; } /** diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index 71653ab4..5c3539f2 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -21,6 +21,7 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; + import org.apache.bcel.Constants; import org.apache.bcel.util.BCELComparator; @@ -109,8 +110,12 @@ public abstract class Constant implements Cloneable, Node, Serializable { @Override - public Object clone() throws CloneNotSupportedException { - return super.clone(); + public Constant clone() { + try { + return (Constant) super.clone(); + } catch (CloneNotSupportedException e) { + throw new Error("Clone Not Supported"); // never happens + } } diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 471dca56..22994647 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -560,12 +560,11 @@ public class ClassGen extends AccessFlags implements Cloneable { @Override - public Object clone() { + public ClassGen clone() { try { - return super.clone(); + return (ClassGen) super.clone(); } catch (CloneNotSupportedException e) { - System.err.println(e); - return null; + throw new Error("Clone Not Supported"); // never happens } } diff --git a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java index e3f91af4..bade1141 100644 --- a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -177,12 +177,11 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable, j @Override - public Object clone() { + public CodeExceptionGen clone() { try { - return super.clone(); + return (CodeExceptionGen) super.clone(); } catch (CloneNotSupportedException e) { - System.err.println(e); - return null; + throw new Error("Clone Not Supported"); // never happens } } } diff --git a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index c5ddb07e..e35932cc 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -19,6 +19,7 @@ package org.apache.bcel.generic; import java.util.ArrayList; import java.util.List; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.AccessFlags; import org.apache.bcel.classfile.Attribute; @@ -145,12 +146,11 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn @Override - public Object clone() { + public FieldGenOrMethodGen clone() { try { - return super.clone(); + return (FieldGenOrMethodGen) super.clone(); } catch (CloneNotSupportedException e) { - System.err.println(e); - return null; + throw new Error("Clone Not Supported"); // never happens } } } diff --git a/src/main/java/org/apache/bcel/generic/LineNumberGen.java b/src/main/java/org/apache/bcel/generic/LineNumberGen.java index 237ba7ac..a266b0d0 100644 --- a/src/main/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/main/java/org/apache/bcel/generic/LineNumberGen.java @@ -85,12 +85,11 @@ public class LineNumberGen implements InstructionTargeter, Cloneable, java.io.Se @Override - public Object clone() { + public LineNumberGen clone() { try { - return super.clone(); + return (LineNumberGen) super.clone(); } catch (CloneNotSupportedException e) { - System.err.println(e); - return null; + throw new Error("Clone Not Supported"); // never happens } } diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java index 69d05640..f3068d8f 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java @@ -203,12 +203,11 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo @Override - public Object clone() { + public LocalVariableGen clone() { try { - return super.clone(); + return (LocalVariableGen) super.clone(); } catch (CloneNotSupportedException e) { - System.err.println(e); - return null; + throw new Error("Clone Not Supported"); // never happens } } } -- GitLab From c343ccf297a93d47fc936a639de4e0e56e47fcf4 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 15 Oct 2013 06:00:57 +0000 Subject: [PATCH 0561/1313] add hashCode() git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1532198 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/Instruction.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index d652f8d4..d5e3f043 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -553,4 +553,12 @@ public abstract class Instruction implements Cloneable, Serializable { public boolean equals( Object that ) { return (that instanceof Instruction) ? cmp.equals(this, (Instruction) that) : false; } + + /** calculate the hashCode of this object + * @return the hashCode + */ + @Override + public int hashCode() { + return opcode; + } } -- GitLab From dd045109ff40c502a157c03dbc6acef3b5400de2 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 15 Oct 2013 06:13:17 +0000 Subject: [PATCH 0562/1313] simplify and avoid NPEs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1532202 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/util/AttributeHTML.java | 2 +- .../bcel/util/ClassLoaderRepository.java | 2 +- .../apache/bcel/util/SyntheticRepository.java | 4 ++-- .../bcel/verifier/statics/Pass2Verifier.java | 16 +++++++-------- .../bcel/verifier/statics/Pass3aVerifier.java | 20 +++++++++---------- .../structurals/InstConstraintVisitor.java | 16 +++++++-------- .../verifier/structurals/LocalVariables.java | 2 +- .../verifier/structurals/OperandStack.java | 2 +- .../verifier/structurals/Pass3bVerifier.java | 2 +- .../verifier/structurals/Subroutines.java | 4 ++-- 10 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java index 7f0772e1..06781601 100644 --- a/src/main/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/main/java/org/apache/bcel/util/AttributeHTML.java @@ -203,7 +203,7 @@ final class AttributeHTML implements org.apache.bcel.Constants { file.print("
        \n"); break; default: // Such as Unknown attribute or Deprecated - file.print("

        " + attribute.toString()); + file.print("

        " + attribute); } file.println(""); file.flush(); diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java index 6a67c3e9..ecc98b15 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -97,7 +97,7 @@ public class ClassLoaderRepository implements Repository { storeClass(RC); return RC; } catch (IOException e) { - throw new ClassNotFoundException(className + " not found: " + e.toString(), e); + throw new ClassNotFoundException(className + " not found: " + e, e); } } diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index fed249cf..a59b6bce 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -123,7 +123,7 @@ public class SyntheticRepository implements Repository { return loadClass(_path.getInputStream(className), className); } catch (IOException e) { throw new ClassNotFoundException("Exception while looking for class " + className - + ": " + e.toString(), e); + + ": " + e, e); } } @@ -178,7 +178,7 @@ public class SyntheticRepository implements Repository { } } catch (IOException e) { throw new ClassNotFoundException("Exception while looking for class " + className - + ": " + e.toString(), e); + + ": " + e, e); } finally { if (is != null){ try { diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 218c2c7e..ec6e5a31 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -172,7 +172,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -224,7 +224,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -279,7 +279,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -296,11 +296,11 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ // we only have to verify if the indices of the constants point // to constants of the appropriate type and such. JavaClass jc = Repository.lookupClass(myOwner.getClassName()); - new CPESSC_Visitor(jc); // constructor implicitely traverses jc + new CPESSC_Visitor(jc); // constructor implicitly traverses jc } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -1043,7 +1043,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } }// visitCode(Code) END @@ -1102,7 +1102,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } // SYNTHETIC: see above @@ -1200,7 +1200,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 3e744c9d..c7d78003 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -212,7 +212,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -417,7 +417,7 @@ public final class Pass3aVerifier extends PassVerifier{ } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -458,7 +458,7 @@ public final class Pass3aVerifier extends PassVerifier{ return Repository.lookupClass(myOwner.getClassName()).getMethods()[method_no].getCode().getMaxLocals(); } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -611,7 +611,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -1026,7 +1026,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -1053,7 +1053,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -1095,7 +1095,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -1160,7 +1160,7 @@ public final class Pass3aVerifier extends PassVerifier{ } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -1193,7 +1193,7 @@ public final class Pass3aVerifier extends PassVerifier{ } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -1227,7 +1227,7 @@ public final class Pass3aVerifier extends PassVerifier{ } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 04999f86..cba0f9ed 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -485,7 +485,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -584,7 +584,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -1305,7 +1305,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -1933,7 +1933,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -1985,7 +1985,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -2063,7 +2063,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -2715,7 +2715,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } @@ -2780,7 +2780,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 71443357..f6674576 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -181,7 +181,7 @@ public class LocalVariables{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java index 4d3c38c5..58a23ce8 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -249,7 +249,7 @@ public class OperandStack{ } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 2a0a4cf9..1d9e2c7d 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -328,7 +328,7 @@ public final class Pass3bVerifier extends PassVerifier{ jc = Repository.lookupClass(myOwner.getClassName()); } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e.toString(), e); + throw new AssertionViolatedException("Missing class: " + e, e); } ConstantPoolGen constantPoolGen = new ConstantPoolGen(jc.getConstantPool()); diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index ece6c206..40938003 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -115,7 +115,7 @@ public class Subroutines{ */ @Override public String toString(){ - String ret = "Subroutine: Local variable is '"+localVariable+"', JSRs are '"+theJSRs+"', RET is '"+theRET+"', Instructions: '"+instructions.toString()+"'."; + String ret = "Subroutine: Local variable is '"+localVariable+"', JSRs are '"+theJSRs+"', RET is '"+theRET+"', Instructions: '"+instructions+"'."; ret += " Accessed local variable slots: '"; int[] alv = getAccessedLocalsIndices(); @@ -640,6 +640,6 @@ System.err.println("DEBUG: Please verify '"+any.toString(true)+"' lies in dead c */ @Override public String toString(){ - return "---\n"+subroutines.toString()+"\n---\n"; + return "---\n"+subroutines+"\n---\n"; } } -- GitLab From e05c00e5b7e4826cf3220123e4c6d4b9b464e350 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 15 Oct 2013 06:17:32 +0000 Subject: [PATCH 0563/1313] only allocate the archive filter once git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1532204 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/util/ClassPath.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 0a090ea5..e1c7ae2b 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -46,6 +46,15 @@ public class ClassPath implements Serializable { private static final long serialVersionUID = 2099441438483340671L; public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(); + + private static final FilenameFilter ARCHIVE_FILTER = new FilenameFilter() { + + public boolean accept( File dir, String name ) { + name = name.toLowerCase(Locale.ENGLISH); + return name.endsWith(".zip") || name.endsWith(".jar"); + } + }; + private PathEntry[] paths; private String class_path; private ClassPath parent; @@ -155,13 +164,7 @@ public class ClassPath implements Serializable { getPathComponents(ext_path, dirs); for (String d : dirs) { File ext_dir = new File(d); - String[] extensions = ext_dir.list(new FilenameFilter() { - - public boolean accept( File dir, String name ) { - name = name.toLowerCase(Locale.ENGLISH); - return name.endsWith(".zip") || name.endsWith(".jar"); - } - }); + String[] extensions = ext_dir.list(ARCHIVE_FILTER); if (extensions != null) { for (int i = 0; i < extensions.length; i++) { list.add(ext_dir.getPath() + File.separatorChar + extensions[i]); -- GitLab From 0e464ba885f002664f70a1f6b1dcc945dbfeb5a9 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 15 Oct 2013 06:21:06 +0000 Subject: [PATCH 0564/1313] only allocate the instructionhandle q once per MethodGen git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1532205 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/structurals/Subroutines.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index 40938003..dc517ced 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -413,6 +413,7 @@ public class Subroutines{ Map colors = new HashMap(); //Graph colouring. Key: InstructionHandle, Value: Integer . + List Q = new ArrayList(); for (InstructionHandle actual : sub_leaders) { // Do some BFS with "actual" as the root of the graph. // Init colors @@ -421,7 +422,8 @@ public class Subroutines{ } colors.put(actual, GRAY); // Init Queue - List Q = new ArrayList(); + + Q.clear(); Q.add(actual); // add(Obj) adds to the end, remove(0) removes from the start. /* BFS ALGORITHM MODIFICATION: Start out with multiple "root" nodes, as exception handlers are starting points of top-level code, too. [why top-level? TODO: Refer to the special JustIce notion of subroutines.]*/ -- GitLab From fda0378a8b21009210b160b04a95a5b4c649a7fa Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 15 Oct 2013 06:46:05 +0000 Subject: [PATCH 0565/1313] fix generics problems git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1532219 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/ConstantUtf8.java | 2 +- .../java/org/apache/bcel/generic/ObjectType.java | 2 +- .../org/apache/bcel/verifier/VerifierAppFrame.java | 14 +++++++------- .../bcel/verifier/VerifierFactoryListModel.java | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index a095cdae..317afca6 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -70,7 +70,7 @@ public final class ConstantUtf8 extends Constant { considered++; if (cache == null) { cache = new LinkedHashMap(INITIAL_CACHE_CAPACITY, 0.75f, true) { - protected boolean removeEldestEntry(Map.Entry eldest) { + protected boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_CACHE_ENTRIES; } }; diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index e47314ef..7a4e2d76 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -44,7 +44,7 @@ public class ObjectType extends ReferenceType { cache = new LinkedHashMap(INITIAL_CACHE_CAPACITY, 0.75f, true) { - protected boolean removeEldestEntry(Map.Entry eldest) { + protected boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_CACHE_ENTRIES; } diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index 51c08cd7..9ce4d0cc 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -58,7 +58,7 @@ public class VerifierAppFrame extends JFrame { JPanel jPanel2 = new JPanel(); JSplitPane jSplitPane2 = new JSplitPane(); JPanel jPanel3 = new JPanel(); - JList classNamesJList = new JList(); + JList classNamesJList = new JList(); GridLayout gridLayout1 = new GridLayout(); JPanel messagesPanel = new JPanel(); GridLayout gridLayout2 = new GridLayout(); @@ -83,8 +83,8 @@ public class VerifierAppFrame extends JFrame { JScrollPane jScrollPane5 = new JScrollPane(); JScrollPane jScrollPane6 = new JScrollPane(); JScrollPane jScrollPane7 = new JScrollPane(); - JList pass3aJList = new JList(); - JList pass3bJList = new JList(); + JList pass3aJList = new JList(); + JList pass3bJList = new JList(); JTextPane pass3aTextPane = new JTextPane(); JTextPane pass3bTextPane = new JTextPane(); JMenu jMenu2 = new JMenu(); @@ -257,10 +257,10 @@ public class VerifierAppFrame extends JFrame { pass2TextPane.setText(""); pass2TextPane.setBackground(Color.yellow); pass3aTextPane.setText(""); - pass3aJList.setListData(new Object[0]); + pass3aJList.setListData(new String[0]); pass3aTextPane.setBackground(Color.yellow); pass3bTextPane.setText(""); - pass3bJList.setListData(new Object[0]); + pass3bJList.setListData(new String[0]); pass3bTextPane.setBackground(Color.yellow); } else { // Must be VERIFIED_OK, Pass 1 does not know VERIFIED_NOTYET pass1TextPane.setBackground(Color.green); @@ -271,10 +271,10 @@ public class VerifierAppFrame extends JFrame { pass2TextPane.setBackground(Color.red); pass3aTextPane.setText(""); pass3aTextPane.setBackground(Color.yellow); - pass3aJList.setListData(new Object[0]); + pass3aJList.setListData(new String[0]); pass3bTextPane.setText(""); pass3bTextPane.setBackground(Color.yellow); - pass3bJList.setListData(new Object[0]); + pass3bJList.setListData(new String[0]); } else { // must be Verified_OK, because Pass1 was OK (cannot be Verified_NOTYET). pass2TextPane.setText(vr.getMessage()); pass2TextPane.setBackground(Color.green); diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index 8cd4bc6a..0aa22716 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -33,7 +33,7 @@ import javax.swing.event.ListDataListener; * @author Enver Haase */ public class VerifierFactoryListModel implements org.apache.bcel.verifier.VerifierFactoryObserver, - javax.swing.ListModel { + javax.swing.ListModel { private List listeners = new ArrayList(); private Set cache = new TreeSet(); @@ -76,7 +76,7 @@ public class VerifierFactoryListModel implements org.apache.bcel.verifier.Verifi } - public synchronized Object getElementAt( int index ) { - return (cache.toArray())[index]; + public synchronized String getElementAt( int index ) { + return (cache.toArray(new String[cache.size()]))[index]; } } -- GitLab From a1fecb7c424e2c2fd5066a3294133fff6141cfd9 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 15 Oct 2013 06:49:16 +0000 Subject: [PATCH 0566/1313] remove unnecessary casts git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1532221 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/PMGClass.java | 2 +- src/main/java/org/apache/bcel/classfile/Signature.java | 2 +- src/main/java/org/apache/bcel/classfile/SourceFile.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java index 40c8fb18..bcbea452 100644 --- a/src/main/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/main/java/org/apache/bcel/classfile/PMGClass.java @@ -169,6 +169,6 @@ public final class PMGClass extends Attribute { */ @Override public Attribute copy( ConstantPool _constant_pool ) { - return (PMGClass) clone(); + return clone(); } } diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index fbd428b4..19c2c178 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -265,6 +265,6 @@ public final class Signature extends Attribute { */ @Override public Attribute copy( ConstantPool _constant_pool ) { - return (Signature) clone(); + return clone(); } } diff --git a/src/main/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java index cfba213c..8d2a94f1 100644 --- a/src/main/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/main/java/org/apache/bcel/classfile/SourceFile.java @@ -147,6 +147,6 @@ public final class SourceFile extends Attribute { */ @Override public Attribute copy( ConstantPool _constant_pool ) { - return (SourceFile) clone(); + return clone(); } } -- GitLab From b6346a134c8dc5965a6ea0ea69768e8245a2e816 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 15 Oct 2013 06:55:44 +0000 Subject: [PATCH 0567/1313] remove dead parameter git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1532227 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/CodeHTML.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 43c1f852..16b5bb85 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -365,7 +365,7 @@ final class CodeHTML implements org.apache.bcel.Constants { * Find all target addresses in code, so that they can be marked * with <A NAME = ...>. Target addresses are kept in an BitSet object. */ - private final void findGotos( ByteSequence bytes, Method method, Code code ) throws IOException { + private final void findGotos( ByteSequence bytes, Code code ) throws IOException { int index; goto_set = new BitSet(bytes.available()); int opcode; @@ -535,7 +535,7 @@ final class CodeHTML implements org.apache.bcel.Constants { // Print the byte code ByteSequence stream = new ByteSequence(code); stream.mark(stream.available()); - findGotos(stream, method, c); + findGotos(stream, c); stream.reset(); file.println("" + ""); -- GitLab From d6f2e3f928809768df877e416bd71e7849daf3d1 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 15 Oct 2013 07:07:43 +0000 Subject: [PATCH 0568/1313] List only is generified in jdk7 so strip for now git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1532229 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/verifier/VerifierAppFrame.java | 6 +++--- .../org/apache/bcel/verifier/VerifierFactoryListModel.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index 9ce4d0cc..c9ca6178 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -58,7 +58,7 @@ public class VerifierAppFrame extends JFrame { JPanel jPanel2 = new JPanel(); JSplitPane jSplitPane2 = new JSplitPane(); JPanel jPanel3 = new JPanel(); - JList classNamesJList = new JList(); + JList classNamesJList = new JList(); GridLayout gridLayout1 = new GridLayout(); JPanel messagesPanel = new JPanel(); GridLayout gridLayout2 = new GridLayout(); @@ -83,8 +83,8 @@ public class VerifierAppFrame extends JFrame { JScrollPane jScrollPane5 = new JScrollPane(); JScrollPane jScrollPane6 = new JScrollPane(); JScrollPane jScrollPane7 = new JScrollPane(); - JList pass3aJList = new JList(); - JList pass3bJList = new JList(); + JList pass3aJList = new JList(); + JList pass3bJList = new JList(); JTextPane pass3aTextPane = new JTextPane(); JTextPane pass3bTextPane = new JTextPane(); JMenu jMenu2 = new JMenu(); diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index 0aa22716..8e6b63a9 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -33,7 +33,7 @@ import javax.swing.event.ListDataListener; * @author Enver Haase */ public class VerifierFactoryListModel implements org.apache.bcel.verifier.VerifierFactoryObserver, - javax.swing.ListModel { + javax.swing.ListModel { private List listeners = new ArrayList(); private Set cache = new TreeSet(); -- GitLab From 8ac3e4d8cb64e354cb06b720614d498bfe021669 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 21 Oct 2013 14:40:39 +0000 Subject: [PATCH 0569/1313] ASF Branding git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1534182 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5cfa9cc9..08f7fac1 100644 --- a/pom.xml +++ b/pom.xml @@ -33,8 +33,8 @@ bcel jar 6.0-SNAPSHOT - Commons BCEL - Bytecode Engineering Library + Apache Commons BCEL + Apache Commons Bytecode Engineering Library http://commons.apache.org/proper/commons-bcel 2004 -- GitLab From 0a8effc1014f5e3c152fde4c506fb93ca30dec99 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 21 Oct 2013 14:42:02 +0000 Subject: [PATCH 0570/1313] Ignore IDE file git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1534183 13f79535-47bb-0310-9956-ffa450edef68 -- GitLab From 7a908fd556f041f8788452e943b0e9c8cedd7660 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Fri, 25 Oct 2013 20:45:53 +0000 Subject: [PATCH 0571/1313] Update to latest parent pom git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1535859 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 08f7fac1..4a71ef86 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ org.apache.commons commons-parent - 26 + 32 org.apache.bcel @@ -42,8 +42,8 @@ ISO-8859-1 UTF-8 - 1.5 - 1.5 + 1.5 + 1.5 bcel 6.0 (Java 5.0+) -- GitLab From 83eb67740ef89faca4a14de1c0c058cf0945e28c Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 26 Oct 2013 09:16:26 +0000 Subject: [PATCH 0572/1313] Adding a link to the API documentation of BCEL 5.2 to the left navi bar git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1535951 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/site.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/site/site.xml b/src/site/site.xml index 461c9054..e1007c0d 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -36,6 +36,7 @@ + -- GitLab From a22944b29002370a9c41ea5fdc442ebb0b199b0c Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 26 Oct 2013 09:17:08 +0000 Subject: [PATCH 0573/1313] Make sure the site publish does not remove API docs of old releases git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1535952 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pom.xml b/pom.xml index 4a71ef86..2a1a5989 100644 --- a/pom.xml +++ b/pom.xml @@ -219,6 +219,15 @@ + + org.apache.maven.plugins + maven-scm-publish-plugin + + + javadocs + + + -- GitLab From 76ea824c31f96f28f7b4b00e7e39375178f9809e Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 4 Dec 2013 00:43:17 +0000 Subject: [PATCH 0574/1313] initial support for INVOKE_DYNAMIC. Patch by Bill Pugh, reviewed by dbrosius git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1547656 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 14 +- .../org/apache/bcel/classfile/Utility.java | 15 +- .../org/apache/bcel/generic/EmptyVisitor.java | 6 +- .../apache/bcel/generic/INVOKEDYNAMIC.java | 191 ++++++++++++++++++ .../org/apache/bcel/generic/Instruction.java | 4 + .../generic/VisitorSupportsInvokeDynamic.java | 7 + .../java/org/apache/bcel/util/ClassPath.java | 3 +- 7 files changed, 230 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java create mode 100644 src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 28eaf96c..ecd59919 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -281,8 +281,8 @@ public interface Constants { "CONSTANT_Float", "CONSTANT_Long", "CONSTANT_Double", "CONSTANT_Class", "CONSTANT_String", "CONSTANT_Fieldref", "CONSTANT_Methodref", "CONSTANT_InterfaceMethodref", - "CONSTANT_NameAndType", "CONSTANT_MethodHandle", - "CONSTANT_MethodType", "CONSTANT_InvokeDynamic" }; + "CONSTANT_NameAndType", "", "", "CONSTANT_MethodHandle", + "CONSTANT_MethodType", "", "CONSTANT_InvokeDynamic" }; /** The name of the static initializer, also called "class * initialization method" or "interface initialization @@ -1170,7 +1170,7 @@ public interface Constants { 0/*dreturn*/, 0/*areturn*/, 0/*return*/, 2/*getstatic*/, 2/*putstatic*/, 2/*getfield*/, 2/*putfield*/, 2/*invokevirtual*/, 2/*invokespecial*/, 2/*invokestatic*/, - 4/*invokeinterface*/, UNDEFINED, 2/*new*/, + 4/*invokeinterface*/, 5/*invokedynamic*/, 2/*new*/, 1/*newarray*/, 2/*anewarray*/, 0/*arraylength*/, 0/*athrow*/, 2/*checkcast*/, 2/*instanceof*/, 0/*monitorenter*/, @@ -1243,7 +1243,7 @@ public interface Constants { {T_SHORT}/*putstatic*/, {T_SHORT}/*getfield*/, {T_SHORT}/*putfield*/, {T_SHORT}/*invokevirtual*/, {T_SHORT}/*invokespecial*/, {T_SHORT}/*invokestatic*/, - {T_SHORT, T_BYTE, T_BYTE}/*invokeinterface*/, {}, + {T_SHORT, T_BYTE, T_BYTE}/*invokeinterface*/, {T_SHORT, T_BYTE, T_BYTE}/*invokedynamic*/, {T_SHORT}/*new*/, {T_BYTE}/*newarray*/, {T_SHORT}/*anewarray*/, {}/*arraylength*/, {}/*athrow*/, {T_SHORT}/*checkcast*/, {T_SHORT}/*instanceof*/, @@ -1290,7 +1290,7 @@ public interface Constants { "tableswitch", "lookupswitch", "ireturn", "lreturn", "freturn", "dreturn", "areturn", "return", "getstatic", "putstatic", "getfield", "putfield", "invokevirtual", "invokespecial", "invokestatic", - "invokeinterface", ILLEGAL_OPCODE, "new", "newarray", "anewarray", + "invokeinterface", "invokedynamic", "new", "newarray", "anewarray", "arraylength", "athrow", "checkcast", "instanceof", "monitorenter", "monitorexit", "wide", "multianewarray", "ifnull", "ifnonnull", "goto_w", "jsr_w", "breakpoint", ILLEGAL_OPCODE, ILLEGAL_OPCODE, @@ -1346,7 +1346,7 @@ public interface Constants { UNPREDICTABLE/*putstatic*/, 1/*getfield*/, UNPREDICTABLE/*putfield*/, UNPREDICTABLE/*invokevirtual*/, UNPREDICTABLE/*invokespecial*/, UNPREDICTABLE/*invokestatic*/, - UNPREDICTABLE/*invokeinterface*/, UNDEFINED, 0/*new*/, 1/*newarray*/, 1/*anewarray*/, + UNPREDICTABLE/*invokeinterface*/, UNPREDICTABLE/*invokedynamic*/, 0/*new*/, 1/*newarray*/, 1/*anewarray*/, 1/*arraylength*/, 1/*athrow*/, 1/*checkcast*/, 1/*instanceof*/, 1/*monitorenter*/, 1/*monitorexit*/, 0/*wide*/, UNPREDICTABLE/*multianewarray*/, 1/*ifnull*/, 1/*ifnonnull*/, 0/*goto_w*/, 0/*jsr_w*/, 0/*breakpoint*/, UNDEFINED, UNDEFINED, @@ -1402,7 +1402,7 @@ public interface Constants { 0/*dreturn*/, 0/*areturn*/, 0/*return*/, UNPREDICTABLE/*getstatic*/, 0/*putstatic*/, UNPREDICTABLE/*getfield*/, 0/*putfield*/, UNPREDICTABLE/*invokevirtual*/, UNPREDICTABLE/*invokespecial*/, UNPREDICTABLE/*invokestatic*/, - UNPREDICTABLE/*invokeinterface*/, UNDEFINED, 1/*new*/, 1/*newarray*/, 1/*anewarray*/, + UNPREDICTABLE/*invokeinterface*/, UNPREDICTABLE/*invokedynamic*/, 1/*new*/, 1/*newarray*/, 1/*anewarray*/, 1/*arraylength*/, 1/*athrow*/, 1/*checkcast*/, 1/*instanceof*/, 0/*monitorenter*/, 0/*monitorexit*/, 0/*wide*/, 1/*multianewarray*/, 0/*ifnull*/, 0/*ifnonnull*/, 0/*goto_w*/, 1/*jsr_w*/, 0/*breakpoint*/, UNDEFINED, UNDEFINED, diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index ef5c0ba7..74d82696 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -347,8 +347,11 @@ public abstract class Utility { case Constants.INVOKESTATIC: case Constants.INVOKEVIRTUAL: index = bytes.readUnsignedShort(); + Constant c = constant_pool.getConstant(index); + if (c.getTag() != Constants.CONSTANT_Methodref && c.getTag() != Constants.CONSTANT_InterfaceMethodref) + throw new ClassFormatException("Expected class `CONSTANT_Methodref' or 'CONSTANT_InterfaceMethodref' at index " + index + " and got " +c); buf.append("\t").append( - constant_pool.constantToString(index, Constants.CONSTANT_Methodref)) + constant_pool.constantToString(c)) .append((verbose ? " (" + index + ")" : "")); break; case Constants.INVOKEINTERFACE: @@ -360,6 +363,16 @@ public abstract class Utility { .append(verbose ? " (" + index + ")\t" : "").append(nargs).append("\t") .append(bytes.readUnsignedByte()); // Last byte is a reserved space break; + case Constants.INVOKEDYNAMIC: + index = bytes.readUnsignedShort(); + int ignored = bytes.readUnsignedShort(); + ConstantInvokeDynamic id = (ConstantInvokeDynamic) constant_pool.getConstant(index, Constants.CONSTANT_InvokeDynamic); + buf.append("\t").append(".").append( + constant_pool + .constantToString(id.getNameAndTypeIndex(), Constants.CONSTANT_NameAndType)); + if (verbose) + buf.append(" (" + index + "/" + id.getNameAndTypeIndex() +")"); + break; /* Operands are references to items in constant pool */ case Constants.LDC_W: diff --git a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java index 99e9ab57..eeb43fee 100644 --- a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java @@ -23,7 +23,7 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public abstract class EmptyVisitor implements Visitor { +public abstract class EmptyVisitor implements VisitorSupportsInvokeDynamic { public void visitStackInstruction( StackInstruction obj ) { } @@ -743,4 +743,8 @@ public abstract class EmptyVisitor implements Visitor { public void visitBREAKPOINT( BREAKPOINT obj ) { } + + + public void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj) { + } } diff --git a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java new file mode 100644 index 00000000..4961995d --- /dev/null +++ b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java @@ -0,0 +1,191 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.generic; + +import java.io.IOException; +import java.util.StringTokenizer; + +import org.apache.bcel.Constants; +import org.apache.bcel.ExceptionConstants; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantCP; +import org.apache.bcel.classfile.ConstantInvokeDynamic; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.util.ByteSequence; + +/** + * Class for INVOKEDYNAMIC. Not an instance of InvokeInstruction, since that class + * expects to be able to get the class of the method. Ignores the bootstrap + * mechanism entirely. + * + * @version $Id: InvokeInstruction.java 1152072 2011-07-29 01:54:05Z dbrosius $ + * @author Bill Pugh + */ +public class INVOKEDYNAMIC extends FieldOrMethod implements ExceptionThrower, + StackConsumer, StackProducer { + + private static final long serialVersionUID = 1L; + + + /** + * Empty constructor needed for the Class.newInstance() statement in + * Instruction.readInstruction(). Not to be used otherwise. + */ + INVOKEDYNAMIC() { + } + + + /** + * @param index to constant pool + */ + public INVOKEDYNAMIC(short opcode, int index) { + super(opcode, index); + } + + + /** + * @return mnemonic for instruction with symbolic references resolved + */ + @Override + public String toString( ConstantPool cp ) { + Constant c = cp.getConstant(index); + StringTokenizer tok = new StringTokenizer(cp.constantToString(c)); + return Constants.OPCODE_NAMES[opcode] + " " + tok.nextToken().replace('.', '/') + + tok.nextToken(); + } + + public ConstantNameAndType getNameAndType( ConstantPoolGen cpg ) { + ConstantPool cp = cpg.getConstantPool(); + ConstantInvokeDynamic id = (ConstantInvokeDynamic) cp.getConstant(index); + return (ConstantNameAndType) cp.getConstant(id.getNameAndTypeIndex()); + } + + /** @return signature of referenced method/field. + */ + public String getSignature( ConstantPoolGen cpg ) { + ConstantPool cp = cpg.getConstantPool(); + ConstantNameAndType cnat = getNameAndType(cpg); + return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes(); + } + + /** @return name of referenced method/field. + */ + public String getName( ConstantPoolGen cpg ) { + ConstantPool cp = cpg.getConstantPool(); + ConstantNameAndType cnat = getNameAndType(cpg); + return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); + } + + /** + * Also works for instructions whose stack effect depends on the + * constant pool entry they reference. + * @return Number of words consumed from stack by this instruction + */ + @Override + public int consumeStack( ConstantPoolGen cpg ) { + + String signature = getSignature(cpg); + return Type.getArgumentTypesSize(signature); + } + + + /** + * Also works for instructions whose stack effect depends on the + * constant pool entry they reference. + * @return Number of words produced onto stack by this instruction + */ + @Override + public int produceStack( ConstantPoolGen cpg ) { + String signature = getSignature(cpg); + return Type.getReturnTypeSize(signature); + } + + + /** @return return type of referenced method. + */ + @Override + public Type getType( ConstantPoolGen cpg ) { + return getReturnType(cpg); + } + + + /** @return name of referenced method. + */ + public String getMethodName( ConstantPoolGen cpg ) { + return getName(cpg); + } + + + /** @return return type of referenced method. + */ + public Type getReturnType( ConstantPoolGen cpg ) { + return Type.getReturnType(getSignature(cpg)); + } + + + /** @return argument types of referenced method. + */ + public Type[] getArgumentTypes( ConstantPoolGen cpg ) { + return Type.getArgumentTypes(getSignature(cpg)); + } + + /** + * Read needed data (i.e., index) from file. + */ + @Override + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + super.initFromFile(bytes, wide); + length = 5; + bytes.readUnsignedShort(); + } + + public Class[] getExceptions() { + Class[] cs = new Class[4 + ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length]; + System.arraycopy(ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION, 0, cs, 0, + ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length); + cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 3] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; + cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 2] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; + cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 1] = ExceptionConstants.ABSTRACT_METHOD_ERROR; + cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length] = ExceptionConstants.UNSATISFIED_LINK_ERROR; + return cs; + } + + + /** + * Call corresponding visitor method(s). The order is: + * Call visitor methods of implemented interfaces first, then + * call methods according to the class hierarchy in descending order, + * i.e., the most specific visitXXX() call comes last. + * + * @param v Visitor object + */ + @Override + public void accept( Visitor v ) { + v.visitExceptionThrower(this); + v.visitTypedInstruction(this); + v.visitStackConsumer(this); + v.visitStackProducer(this); + v.visitLoadClass(this); + v.visitCPInstruction(this); + v.visitFieldOrMethod(this); + if (v instanceof VisitorSupportsInvokeDynamic) + ((VisitorSupportsInvokeDynamic)v).visitINVOKEDYNAMIC(this); + } +} diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index d5e3f043..fbf21d6d 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -20,6 +20,7 @@ package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.util.ByteSequence; @@ -407,6 +408,9 @@ public abstract class Instruction implements Cloneable, Serializable { case Constants.INVOKEINTERFACE: obj = new INVOKEINTERFACE(); break; + case Constants.INVOKEDYNAMIC: + obj = new INVOKEDYNAMIC(); + break; case Constants.NEW: obj = new NEW(); break; diff --git a/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java b/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java new file mode 100644 index 00000000..ae55f6a5 --- /dev/null +++ b/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java @@ -0,0 +1,7 @@ +package org.apache.bcel.generic; + +public interface VisitorSupportsInvokeDynamic extends Visitor{ + + + void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj); +} diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index e1c7ae2b..7a03fbe4 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -86,7 +86,8 @@ public class ClassPath implements Serializable { } } } catch (IOException e) { - System.err.println("CLASSPATH component " + file + ": " + e); + if (path.endsWith(".zip") || path.endsWith(".jar")) + System.err.println("CLASSPATH component " + file + ": " + e); } } } -- GitLab From e40aa84e96395c700178cc1e9b70a7398eff9a58 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 17 Dec 2013 02:51:54 +0000 Subject: [PATCH 0575/1313] more invoke dynamic implementation, split out from FieldOrMethod as not truly a subclass - patch by Bill Pugh reviewed by dbrosius git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1551450 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/generic/EmptyVisitor.java | 4 +- .../apache/bcel/generic/FieldOrMethod.java | 24 +--------- .../org/apache/bcel/generic/GETFIELD.java | 2 + .../org/apache/bcel/generic/GETSTATIC.java | 2 + .../apache/bcel/generic/INVOKEDYNAMIC.java | 43 +++++++---------- .../apache/bcel/generic/INVOKEINTERFACE.java | 3 ++ .../apache/bcel/generic/INVOKESPECIAL.java | 2 + .../org/apache/bcel/generic/INVOKESTATIC.java | 2 + .../apache/bcel/generic/INVOKEVIRTUAL.java | 2 + .../generic/NameSignatureInstruction.java | 48 +++++++++++++++++++ .../org/apache/bcel/generic/PUTFIELD.java | 2 + .../org/apache/bcel/generic/PUTSTATIC.java | 2 + .../generic/VisitorSupportsInvokeDynamic.java | 2 +- 13 files changed, 88 insertions(+), 50 deletions(-) create mode 100644 src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java diff --git a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java index eeb43fee..60c620e9 100644 --- a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java @@ -744,7 +744,9 @@ public abstract class EmptyVisitor implements VisitorSupportsInvokeDynamic { public void visitBREAKPOINT( BREAKPOINT obj ) { } - + public void visitNameSignatureInstruction(NameSignatureInstruction obj) { + } + public void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj) { } } diff --git a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java index b358f6eb..dd1a2622 100644 --- a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java @@ -18,9 +18,7 @@ package org.apache.bcel.generic; import org.apache.bcel.classfile.ConstantCP; -import org.apache.bcel.classfile.ConstantNameAndType; import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantUtf8; /** * Super class for InvokeInstruction and FieldInstruction, since they have @@ -29,7 +27,7 @@ import org.apache.bcel.classfile.ConstantUtf8; * @version $Id$ * @author M. Dahm */ -public abstract class FieldOrMethod extends CPInstruction implements LoadClass { +public abstract class FieldOrMethod extends NameSignatureInstruction implements LoadClass { private static final long serialVersionUID = 2036985877748835708L; @@ -50,26 +48,6 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { } - /** @return signature of referenced method/field. - */ - public String getSignature( ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(index); - ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); - return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes(); - } - - - /** @return name of referenced method/field. - */ - public String getName( ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(index); - ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); - return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); - } - - /** @return name of the referenced class/interface * @deprecated If the instruction references an array class, * this method will return "java.lang.Object". diff --git a/src/main/java/org/apache/bcel/generic/GETFIELD.java b/src/main/java/org/apache/bcel/generic/GETFIELD.java index ad062734..0e37d658 100644 --- a/src/main/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/main/java/org/apache/bcel/generic/GETFIELD.java @@ -80,6 +80,8 @@ public class GETFIELD extends FieldInstruction implements ExceptionThrower, Stac v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); + if (v instanceof VisitorSupportsInvokeDynamic) + ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitGETFIELD(this); diff --git a/src/main/java/org/apache/bcel/generic/GETSTATIC.java b/src/main/java/org/apache/bcel/generic/GETSTATIC.java index 189f2fa6..7ef252a3 100644 --- a/src/main/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/GETSTATIC.java @@ -78,6 +78,8 @@ public class GETSTATIC extends FieldInstruction implements PushInstruction, Exce v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); + if (v instanceof VisitorSupportsInvokeDynamic) + ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitGETSTATIC(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java index 4961995d..80fdbc12 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java @@ -38,7 +38,7 @@ import org.apache.bcel.util.ByteSequence; * @version $Id: InvokeInstruction.java 1152072 2011-07-29 01:54:05Z dbrosius $ * @author Bill Pugh */ -public class INVOKEDYNAMIC extends FieldOrMethod implements ExceptionThrower, +public class INVOKEDYNAMIC extends NameSignatureInstruction implements ExceptionThrower, StackConsumer, StackProducer { private static final long serialVersionUID = 1L; @@ -71,28 +71,22 @@ public class INVOKEDYNAMIC extends FieldOrMethod implements ExceptionThrower, + tok.nextToken(); } - public ConstantNameAndType getNameAndType( ConstantPoolGen cpg ) { + /** + * Get the ConstantInvokeDynamic associated with this instruction + */ + + public ConstantInvokeDynamic getInvokeDynamic( ConstantPoolGen cpg ) { + ConstantPool cp = cpg.getConstantPool(); + return (ConstantInvokeDynamic) cp.getConstant(index); + } + + @Override + public ConstantNameAndType getNameAndType( ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); - ConstantInvokeDynamic id = (ConstantInvokeDynamic) cp.getConstant(index); + ConstantInvokeDynamic id = getInvokeDynamic(cpg); return (ConstantNameAndType) cp.getConstant(id.getNameAndTypeIndex()); } - /** @return signature of referenced method/field. - */ - public String getSignature( ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); - ConstantNameAndType cnat = getNameAndType(cpg); - return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes(); - } - - /** @return name of referenced method/field. - */ - public String getName( ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); - ConstantNameAndType cnat = getNameAndType(cpg); - return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); - } - /** * Also works for instructions whose stack effect depends on the * constant pool entry they reference. @@ -105,7 +99,6 @@ public class INVOKEDYNAMIC extends FieldOrMethod implements ExceptionThrower, return Type.getArgumentTypesSize(signature); } - /** * Also works for instructions whose stack effect depends on the * constant pool entry they reference. @@ -113,8 +106,8 @@ public class INVOKEDYNAMIC extends FieldOrMethod implements ExceptionThrower, */ @Override public int produceStack( ConstantPoolGen cpg ) { - String signature = getSignature(cpg); - return Type.getReturnTypeSize(signature); + String signature = getSignature(cpg); + return Type.getReturnTypeSize(signature); } @@ -182,10 +175,10 @@ public class INVOKEDYNAMIC extends FieldOrMethod implements ExceptionThrower, v.visitTypedInstruction(this); v.visitStackConsumer(this); v.visitStackProducer(this); - v.visitLoadClass(this); v.visitCPInstruction(this); - v.visitFieldOrMethod(this); - if (v instanceof VisitorSupportsInvokeDynamic) + if (v instanceof VisitorSupportsInvokeDynamic) { + ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); ((VisitorSupportsInvokeDynamic)v).visitINVOKEDYNAMIC(this); + } } } diff --git a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java index 8b0bef00..8212fe55 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -19,6 +19,7 @@ package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; import org.apache.bcel.ExceptionConstants; import org.apache.bcel.classfile.ConstantPool; @@ -132,6 +133,8 @@ public final class INVOKEINTERFACE extends InvokeInstruction { v.visitStackProducer(this); v.visitLoadClass(this); v.visitCPInstruction(this); + if (v instanceof VisitorSupportsInvokeDynamic) + ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitInvokeInstruction(this); v.visitINVOKEINTERFACE(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java index 08e234d6..2253bf36 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -75,6 +75,8 @@ public class INVOKESPECIAL extends InvokeInstruction { v.visitStackProducer(this); v.visitLoadClass(this); v.visitCPInstruction(this); + if (v instanceof VisitorSupportsInvokeDynamic) + ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitInvokeInstruction(this); v.visitINVOKESPECIAL(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java index 75c66101..84e40bbe 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -72,6 +72,8 @@ public class INVOKESTATIC extends InvokeInstruction { v.visitStackProducer(this); v.visitLoadClass(this); v.visitCPInstruction(this); + if (v instanceof VisitorSupportsInvokeDynamic) + ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitInvokeInstruction(this); v.visitINVOKESTATIC(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java index 90854966..5cb86179 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -75,6 +75,8 @@ public class INVOKEVIRTUAL extends InvokeInstruction { v.visitLoadClass(this); v.visitCPInstruction(this); v.visitFieldOrMethod(this); + if (v instanceof VisitorSupportsInvokeDynamic) + ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); v.visitInvokeInstruction(this); v.visitINVOKEVIRTUAL(this); } diff --git a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java new file mode 100644 index 00000000..566961cf --- /dev/null +++ b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java @@ -0,0 +1,48 @@ +package org.apache.bcel.generic; + +import org.apache.bcel.classfile.ConstantCP; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; + +/** + * Super class for FieldOrMethod and INVOKEDYNAMIC, since they both have + * names and signatures + * + * @version $Id: FieldOrMethod.java 1481383 2013-05-11 17:34:32Z dbrosius $ + * @author Bill Pugh + */ +public abstract class NameSignatureInstruction extends CPInstruction { + + private static final long serialVersionUID = 1L; + + public NameSignatureInstruction() { + super(); + } + + public NameSignatureInstruction(short opcode, int index) { + super(opcode, index); + } + + public ConstantNameAndType getNameAndType(ConstantPoolGen cpg) { + ConstantPool cp = cpg.getConstantPool(); + ConstantCP cmr = (ConstantCP) cp.getConstant(index); + return (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); + } + /** @return signature of referenced method/field. + */ + public String getSignature(ConstantPoolGen cpg) { + ConstantPool cp = cpg.getConstantPool(); + ConstantNameAndType cnat = getNameAndType(cpg); + return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes(); + } + + /** @return name of referenced method/field. + */ + public String getName(ConstantPoolGen cpg) { + ConstantPool cp = cpg.getConstantPool(); + ConstantNameAndType cnat = getNameAndType(cpg); + return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/apache/bcel/generic/PUTFIELD.java b/src/main/java/org/apache/bcel/generic/PUTFIELD.java index ca238e04..eb421925 100644 --- a/src/main/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/main/java/org/apache/bcel/generic/PUTFIELD.java @@ -79,6 +79,8 @@ public class PUTFIELD extends FieldInstruction implements PopInstruction, Except v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); + if (v instanceof VisitorSupportsInvokeDynamic) + ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitPUTFIELD(this); diff --git a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java index 94d6a5f8..a7a08290 100644 --- a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java @@ -78,6 +78,8 @@ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, Pop v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); + if (v instanceof VisitorSupportsInvokeDynamic) + ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitPUTSTATIC(this); diff --git a/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java b/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java index ae55f6a5..3afd5bed 100644 --- a/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java +++ b/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java @@ -2,6 +2,6 @@ package org.apache.bcel.generic; public interface VisitorSupportsInvokeDynamic extends Visitor{ - + void visitNameSignatureInstruction(NameSignatureInstruction obj); void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj); } -- GitLab From e4d51a55eac15354bfb8f7dfdec3ebb06deefd1c Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sat, 28 Dec 2013 22:20:50 +0000 Subject: [PATCH 0576/1313] Add Maven artifacts to svn:ignore. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1553944 13f79535-47bb-0310-9956-ffa450edef68 --- maven-eclipse.xml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 maven-eclipse.xml diff --git a/maven-eclipse.xml b/maven-eclipse.xml new file mode 100644 index 00000000..668e3c50 --- /dev/null +++ b/maven-eclipse.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file -- GitLab From 9082f2bd701d6b0a90b0b319948057d2ec2922e0 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 31 Dec 2013 22:05:01 +0000 Subject: [PATCH 0577/1313] Java 5: Convert 'for' loops to enhanced 'for' loops. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1554576 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/Annotations.java | 4 +- .../bcel/classfile/ArrayElementValue.java | 5 +- .../bcel/classfile/DescendingVisitor.java | 65 +++++------ .../apache/bcel/classfile/FieldOrMethod.java | 4 +- .../org/apache/bcel/classfile/JavaClass.java | 68 ++++++----- .../bcel/classfile/ParameterAnnotations.java | 4 +- .../org/apache/bcel/classfile/Utility.java | 20 ++-- .../bcel/generic/ArrayElementValueGen.java | 10 +- .../org/apache/bcel/generic/ClassGen.java | 36 +++--- .../org/apache/bcel/generic/FieldGen.java | 19 ++-- .../bcel/generic/InstructionFactory.java | 4 +- .../apache/bcel/generic/InstructionList.java | 28 ++--- .../org/apache/bcel/generic/MethodGen.java | 72 ++++++------ .../apache/bcel/generic/ReferenceType.java | 20 ++-- .../java/org/apache/bcel/generic/Select.java | 12 +- .../java/org/apache/bcel/generic/Type.java | 4 +- .../org/apache/bcel/util/AttributeHTML.java | 68 +++++------ .../org/apache/bcel/util/BCELFactory.java | 3 +- .../java/org/apache/bcel/util/BCELifier.java | 4 +- .../org/apache/bcel/util/ClassLoader.java | 5 +- .../java/org/apache/bcel/util/ClassPath.java | 22 ++-- .../java/org/apache/bcel/util/CodeHTML.java | 20 ++-- .../java/org/apache/bcel/util/MethodHTML.java | 4 +- .../org/apache/bcel/verifier/Verifier.java | 20 ++-- .../apache/bcel/verifier/VerifyDialog.java | 5 +- .../apache/bcel/verifier/statics/IntList.java | 4 +- .../bcel/verifier/statics/Pass2Verifier.java | 50 ++++----- .../bcel/verifier/statics/Pass3aVerifier.java | 106 +++++++++--------- .../structurals/ControlFlowGraph.java | 4 +- .../structurals/ExceptionHandlers.java | 6 +- .../structurals/InstConstraintVisitor.java | 24 ++-- .../verifier/structurals/Pass3bVerifier.java | 9 +- .../verifier/structurals/Subroutines.java | 80 ++++++------- .../org/apache/bcel/AbstractTestCase.java | 22 ++-- .../apache/bcel/AnnotationGenTestCase.java | 8 +- .../apache/bcel/FieldAnnotationsTestCase.java | 4 +- .../GeneratingAnnotatedClassesTestCase.java | 6 +- .../java/org/apache/bcel/PerformanceTest.java | 4 +- 38 files changed, 402 insertions(+), 451 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index 0a70bf82..ad7d80ba 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -108,8 +108,8 @@ public abstract class Annotations extends Attribute { return; } dos.writeShort(annotation_table.length); - for (int i = 0; i < annotation_table.length; i++) { - annotation_table[i].dump(dos); + for (AnnotationEntry element : annotation_table) { + element.dump(dos); } } } diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java index 6fe0d3dc..250d8bf1 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -54,9 +54,8 @@ public class ArrayElementValue extends ElementValue { dos.writeByte(type); // u1 type of value (ARRAY == '[') dos.writeShort(evalues.length); - for (int i = 0; i < evalues.length; i++) - { - evalues[i].dump(dos); + for (ElementValue evalue : evalues) { + evalue.dump(dos); } } diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index 115473b3..43632d14 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -94,19 +94,16 @@ public class DescendingVisitor implements Visitor stack.push(_clazz); _clazz.accept(visitor); Field[] fields = _clazz.getFields(); - for (int i = 0; i < fields.length; i++) - { - fields[i].accept(this); + for (Field field : fields) { + field.accept(this); } Method[] methods = _clazz.getMethods(); - for (int i = 0; i < methods.length; i++) - { - methods[i].accept(this); + for (Method method : methods) { + method.accept(this); } Attribute[] attributes = _clazz.getAttributes(); - for (int i = 0; i < attributes.length; i++) - { - attributes[i].accept(this); + for (Attribute attribute : attributes) { + attribute.accept(this); } _clazz.getConstantPool().accept(this); stack.pop(); @@ -117,9 +114,8 @@ public class DescendingVisitor implements Visitor stack.push(annotation); annotation.accept(visitor); AnnotationEntry[] entries = annotation.getAnnotationEntries(); - for (int i = 0; i < entries.length; i++) - { - entries[i].accept(this); + for (AnnotationEntry entrie : entries) { + entrie.accept(this); } stack.pop(); } @@ -136,9 +132,8 @@ public class DescendingVisitor implements Visitor stack.push(field); field.accept(visitor); Attribute[] attributes = field.getAttributes(); - for (int i = 0; i < attributes.length; i++) - { - attributes[i].accept(this); + for (Attribute attribute : attributes) { + attribute.accept(this); } stack.pop(); } @@ -155,9 +150,8 @@ public class DescendingVisitor implements Visitor stack.push(method); method.accept(visitor); Attribute[] attributes = method.getAttributes(); - for (int i = 0; i < attributes.length; i++) - { - attributes[i].accept(this); + for (Attribute attribute : attributes) { + attribute.accept(this); } stack.pop(); } @@ -174,14 +168,12 @@ public class DescendingVisitor implements Visitor stack.push(code); code.accept(visitor); CodeException[] table = code.getExceptionTable(); - for (int i = 0; i < table.length; i++) - { - table[i].accept(this); + for (CodeException element : table) { + element.accept(this); } Attribute[] attributes = code.getAttributes(); - for (int i = 0; i < attributes.length; i++) - { - attributes[i].accept(this); + for (Attribute attribute : attributes) { + attribute.accept(this); } stack.pop(); } @@ -198,9 +190,8 @@ public class DescendingVisitor implements Visitor stack.push(table); table.accept(visitor); LineNumber[] numbers = table.getLineNumberTable(); - for (int i = 0; i < numbers.length; i++) - { - numbers[i].accept(this); + for (LineNumber number : numbers) { + number.accept(this); } stack.pop(); } @@ -217,9 +208,8 @@ public class DescendingVisitor implements Visitor stack.push(table); table.accept(visitor); LocalVariable[] vars = table.getLocalVariableTable(); - for (int i = 0; i < vars.length; i++) - { - vars[i].accept(this); + for (LocalVariable var : vars) { + var.accept(this); } stack.pop(); } @@ -229,9 +219,8 @@ public class DescendingVisitor implements Visitor stack.push(table); table.accept(visitor); StackMapEntry[] vars = table.getStackMap(); - for (int i = 0; i < vars.length; i++) - { - vars[i].accept(this); + for (StackMapEntry var : vars) { + var.accept(this); } stack.pop(); } @@ -248,9 +237,8 @@ public class DescendingVisitor implements Visitor stack.push(table); table.accept(visitor); StackMapTableEntry[] vars = table.getStackMapTable(); - for (int i = 0; i < vars.length; i++) - { - vars[i].accept(this); + for (StackMapTableEntry var : vars) { + var.accept(this); } stack.pop(); } @@ -367,9 +355,8 @@ public class DescendingVisitor implements Visitor stack.push(ic); ic.accept(visitor); InnerClass[] ics = ic.getInnerClasses(); - for (int i = 0; i < ics.length; i++) - { - ics[i].accept(this); + for (InnerClass ic2 : ics) { + ic2.accept(this); } stack.pop(); } diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index 7283487f..9332b000 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -231,9 +231,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No // Find attributes that contain annotation data Attribute[] attrs = getAttributes(); List accumulatedAnnotations = new ArrayList(); - for (int i = 0; i < attrs.length; i++) - { - Attribute attribute = attrs[i]; + for (Attribute attribute : attrs) { if (attribute instanceof Annotations) { Annotations annotations = (Annotations) attribute; diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 84770e8a..b4b6016b 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -147,9 +147,9 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl annotationsOutOfDate = true; this.source = source; // Get source file name if available - for (int i = 0; i < attributes.length; i++) { - if (attributes[i] instanceof SourceFile) { - source_file_name = ((SourceFile) attributes[i]).getSourceFileName(); + for (Attribute attribute : attributes) { + if (attribute instanceof SourceFile) { + source_file_name = ((SourceFile) attribute).getSourceFileName(); break; } } @@ -307,21 +307,21 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl file.writeShort(class_name_index); file.writeShort(superclass_name_index); file.writeShort(interfaces.length); - for (int i = 0; i < interfaces.length; i++) { - file.writeShort(interfaces[i]); + for (int interface1 : interfaces) { + file.writeShort(interface1); } file.writeShort(fields.length); - for (int i = 0; i < fields.length; i++) { - fields[i].dump(file); + for (Field field : fields) { + field.dump(file); } file.writeShort(methods.length); - for (int i = 0; i < methods.length; i++) { - methods[i].dump(file); + for (Method method : methods) { + method.dump(file); } if (attributes != null) { file.writeShort(attributes.length); - for (int i = 0; i < attributes.length; i++) { - attributes[i].dump(file); + for (Attribute attribute : attributes) { + attribute.dump(file); } } else { file.writeShort(0); @@ -342,8 +342,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl // Find attributes that contain annotation data Attribute[] attrs = getAttributes(); List accumulatedAnnotations = new ArrayList(); - for (int i = 0; i < attrs.length; i++) { - Attribute attribute = attrs[i]; + for (Attribute attribute : attrs) { if (attribute instanceof Annotations) { Annotations runtimeAnnotations = (Annotations)attribute; for(int j = 0; j < runtimeAnnotations.getAnnotationEntries().length; j++) @@ -442,8 +441,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * java.lang.reflect.Method if any */ public Method getMethod( java.lang.reflect.Method m ) { - for (int i = 0; i < methods.length; i++) { - Method method = methods[i]; + for (Method method : methods) { if (m.getName().equals(method.getName()) && (m.getModifiers() == method.getModifiers()) && Type.getSignature(m).equals(method.getSignature())) { return method; @@ -644,26 +642,26 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl buf.append("ACC_SUPER flag\t\t").append(isSuper()).append("\n"); if (attributes.length > 0) { buf.append("\nAttribute(s):\n"); - for (int i = 0; i < attributes.length; i++) { - buf.append(indent(attributes[i])); + for (Attribute attribute : attributes) { + buf.append(indent(attribute)); } } AnnotationEntry[] annotations = getAnnotationEntries(); if (annotations!=null && annotations.length>0) { buf.append("\nAnnotation(s):\n"); - for (int i=0; i 0) { buf.append("\n").append(fields.length).append(" fields:\n"); - for (int i = 0; i < fields.length; i++) { - buf.append("\t").append(fields[i]).append('\n'); + for (Field field : fields) { + buf.append("\t").append(field).append('\n'); } } if (methods.length > 0) { buf.append("\n").append(methods.length).append(" methods:\n"); - for (int i = 0; i < methods.length; i++) { - buf.append("\t").append(methods[i]).append('\n'); + for (Method method : methods) { + buf.append("\t").append(method).append('\n'); } } return buf.toString(); @@ -729,12 +727,12 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl private final void computeNestedTypeStatus() { if (computedNestedTypeStatus) return; - for (int i = 0; i < this.attributes.length; i++) { - if (this.attributes[i] instanceof InnerClasses) { - InnerClass[] innerClasses = ((InnerClasses) this.attributes[i]).getInnerClasses(); - for (int j = 0; j < innerClasses.length; j++) { + for (Attribute attribute : this.attributes) { + if (attribute instanceof InnerClasses) { + InnerClass[] innerClasses = ((InnerClasses) attribute).getInnerClasses(); + for (InnerClass innerClasse : innerClasses) { boolean innerClassAttributeRefersToMe = false; - String inner_class_name = constant_pool.getConstantString(innerClasses[j].getInnerClassIndex(), + String inner_class_name = constant_pool.getConstantString(innerClasse.getInnerClassIndex(), Constants.CONSTANT_Class); inner_class_name = Utility.compactClassName(inner_class_name); if (inner_class_name.equals(getClassName())) { @@ -742,7 +740,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl } if (innerClassAttributeRefersToMe) { this.isNested = true; - if (innerClasses[j].getInnerNameIndex() == 0) { + if (innerClasse.getInnerNameIndex() == 0) { this.isAnonymous = true; } } @@ -790,8 +788,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl return true; } JavaClass[] super_classes = getSuperClasses(); - for (int i = 0; i < super_classes.length; i++) { - if (super_classes[i].equals(super_class)) { + for (JavaClass super_classe : super_classes) { + if (super_classe.equals(super_class)) { return true; } } @@ -815,8 +813,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl return true; } JavaClass[] super_interfaces = getAllInterfaces(); - for (int i = 0; i < super_interfaces.length; i++) { - if (super_interfaces[i].equals(inter)) { + for (JavaClass super_interface : super_interfaces) { + if (super_interface.equals(inter)) { return true; } } @@ -883,8 +881,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl queue.enqueue(souper); } } - for (int i = 0; i < _interfaces.length; i++) { - queue.enqueue(_interfaces[i]); + for (JavaClass _interface : _interfaces) { + queue.enqueue(_interface); } } return allInterfaces.toArray(new JavaClass[allInterfaces.size()]); diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index aee94774..abfb6d8f 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -122,8 +122,8 @@ public abstract class ParameterAnnotations extends Attribute { super.dump(dos); dos.writeByte(parameter_annotation_table.length); - for (int i = 0; i < parameter_annotation_table.length; i++) { - parameter_annotation_table[i].dump(dos); + for (ParameterAnnotationEntry element : parameter_annotation_table) { + element.dump(dos); } } diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 74d82696..0fe5121a 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -543,10 +543,10 @@ public abstract class Utility { StringBuilder buf = new StringBuilder("("); String str; if (argv != null) { - for (int i = 0; i < argv.length; i++) { - str = getSignature(argv[i]); + for (String element : argv) { + str = getSignature(element); if (str.endsWith("V")) { - throw new ClassFormatException("Invalid type: " + argv[i]); + throw new ClassFormatException("Invalid type: " + element); } buf.append(str); } @@ -924,8 +924,8 @@ public abstract class Utility { char[] chars = brackets.toCharArray(); int count = 0; boolean open = false; - for (int i = 0; i < chars.length; i++) { - switch (chars[i]) { + for (char c : chars) { + switch (c) { case '[': if (open) { throw new RuntimeException("Illegally nested brackets:" + brackets); @@ -1199,8 +1199,8 @@ public abstract class Utility { } CharArrayWriter caw = new CharArrayWriter(); JavaWriter jw = new JavaWriter(caw); - for (int i = 0; i < bytes.length; i++) { - int in = bytes[i] & 0x000000ff; // Normalize to unsigned + for (byte b : bytes) { + int in = b & 0x000000ff; // Normalize to unsigned jw.write(in); } return caw.toString(); @@ -1363,8 +1363,8 @@ public abstract class Utility { public static final String convertString( String label ) { char[] ch = label.toCharArray(); StringBuilder buf = new StringBuilder(); - for (int i = 0; i < ch.length; i++) { - switch (ch[i]) { + for (char element : ch) { + switch (element) { case '\n': buf.append("\\n"); break; @@ -1381,7 +1381,7 @@ public abstract class Utility { buf.append("\\\\"); break; default: - buf.append(ch[i]); + buf.append(element); break; } } diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index 1d292f7b..59bd753d 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -45,9 +45,8 @@ public class ArrayElementValueGen extends ElementValueGen throw new RuntimeException( "Only element values of type array can be built with this ctor - type specified: " + type); this.evalues = new ArrayList(); - for (int i = 0; i < datums.length; i++) - { - evalues.add(ElementValueGen.copy(datums[i], cpool, true)); + for (ElementValue datum : datums) { + evalues.add(ElementValueGen.copy(datum, cpool, true)); } } @@ -76,9 +75,8 @@ public class ArrayElementValueGen extends ElementValueGen super(ARRAY, cpool); evalues = new ArrayList(); ElementValue[] in = value.getElementValuesArray(); - for (int i = 0; i < in.length; i++) - { - evalues.add(ElementValueGen.copy(in[i], cpool, copyPoolEntries)); + for (ElementValue element : in) { + evalues.add(ElementValueGen.copy(element, cpool, copyPoolEntries)); } } diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 22994647..9909a365 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -99,8 +99,8 @@ public class ClassGen extends AccessFlags implements Cloneable { class_name_index = cp.addClass(class_name); superclass_name_index = cp.addClass(super_class_name); if (interfaces != null) { - for (int i = 0; i < interfaces.length; i++) { - addInterface(interfaces[i]); + for (String interface1 : interfaces) { + addInterface(interface1); } } } @@ -141,22 +141,22 @@ public class ClassGen extends AccessFlags implements Cloneable { Method[] methods = clazz.getMethods(); Field[] fields = clazz.getFields(); String[] interfaces = clazz.getInterfaceNames(); - for (int i = 0; i < interfaces.length; i++) { - addInterface(interfaces[i]); + for (String interface1 : interfaces) { + addInterface(interface1); } for (int i = 0; i < attributes.length; i++) { if (!(attributes[i] instanceof Annotations)) { addAttribute(attributes[i]); } } - for(int i=0; i < annotations.length; i++) { - addAnnotationEntry(annotations[i]); + for (AnnotationEntryGen annotation : annotations) { + addAnnotationEntry(annotation); } - for (int i = 0; i < methods.length; i++) { - addMethod(methods[i]); + for (Method method : methods) { + addMethod(method); } - for (int i = 0; i < fields.length; i++) { - addField(fields[i]); + for (Field field : fields) { + addField(field); } } @@ -166,16 +166,12 @@ public class ClassGen extends AccessFlags implements Cloneable { private AnnotationEntryGen[] unpackAnnotations(Attribute[] attrs) { List annotationGenObjs = new ArrayList(); - for (int i = 0; i < attrs.length; i++) - { - Attribute attr = attrs[i]; + for (Attribute attr : attrs) { if (attr instanceof RuntimeVisibleAnnotations) { RuntimeVisibleAnnotations rva = (RuntimeVisibleAnnotations) attr; AnnotationEntry[] annos = rva.getAnnotationEntries(); - for (int j = 0; j < annos.length; j++) - { - AnnotationEntry a = annos[j]; + for (AnnotationEntry a : annos) { annotationGenObjs.add(new AnnotationEntryGen(a, getConstantPool(), false)); } @@ -185,9 +181,7 @@ public class ClassGen extends AccessFlags implements Cloneable { { RuntimeInvisibleAnnotations ria = (RuntimeInvisibleAnnotations) attr; AnnotationEntry[] annos = ria.getAnnotationEntries(); - for (int j = 0; j < annos.length; j++) - { - AnnotationEntry a = annos[j]; + for (AnnotationEntry a : annos) { annotationGenObjs.add(new AnnotationEntryGen(a, getConstantPool(), false)); } @@ -442,8 +436,8 @@ public class ClassGen extends AccessFlags implements Cloneable { public void setMethods( Method[] methods ) { method_vec.clear(); - for (int m = 0; m < methods.length; m++) { - addMethod(methods[m]); + for (Method method : methods) { + addMethod(method); } } diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index 16f90d54..d235a256 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -88,18 +88,17 @@ public class FieldGen extends FieldGenOrMethodGen { public FieldGen(Field field, ConstantPoolGen cp) { this(field.getAccessFlags(), Type.getType(field.getSignature()), field.getName(), cp); Attribute[] attrs = field.getAttributes(); - for (int i = 0; i < attrs.length; i++) { - if (attrs[i] instanceof ConstantValue) { - setValue(((ConstantValue) attrs[i]).getConstantValueIndex()); - } else if (attrs[i] instanceof Annotations) { - Annotations runtimeAnnotations = (Annotations)attrs[i]; + for (Attribute attr : attrs) { + if (attr instanceof ConstantValue) { + setValue(((ConstantValue) attr).getConstantValueIndex()); + } else if (attr instanceof Annotations) { + Annotations runtimeAnnotations = (Annotations)attr; AnnotationEntry[] annotationEntries = runtimeAnnotations.getAnnotationEntries(); - for (int j = 0; j < annotationEntries.length; j++) { - AnnotationEntry element = annotationEntries[j]; + for (AnnotationEntry element : annotationEntries) { addAnnotationEntry(new AnnotationEntryGen(element,cp,false)); } } else { - addAttribute(attrs[i]); + addAttribute(attr); } } } @@ -228,8 +227,8 @@ public class FieldGen extends FieldGenOrMethodGen { private void addAnnotationsAsAttribute(ConstantPoolGen cp) { Attribute[] attrs = Utility.getAnnotationAttributes(cp,annotation_vec); - for (int i = 0; i < attrs.length; i++) { - addAttribute(attrs[i]); + for (Attribute attr : attrs) { + addAttribute(attr); } } diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index 9a24b4c5..dc335ba5 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -76,8 +76,8 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali int index; int nargs = 0; String signature = Type.getMethodSignature(ret_type, arg_types); - for (int i = 0; i < arg_types.length; i++) { - nargs += arg_types[i].getSize(); + for (Type arg_type : arg_types) { + nargs += arg_type.getSize(); } if (kind == Constants.INVOKEINTERFACE) { index = cp.addInterfaceMethodref(class_name, name, signature); diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index e1fb11e5..cd31e0b2 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -872,8 +872,8 @@ public class InstructionList implements Serializable { } if (i instanceof Select) { InstructionHandle[] targets = ((Select) i).getTargets(); - for (int j = 0; j < targets.length; j++) { - inst = targets[j].instruction; + for (InstructionHandle target : targets) { + inst = target.instruction; if (!contains(inst)) { throw new ClassGenException("Branch target of " + Constants.OPCODE_NAMES[i.opcode] + ":" + inst @@ -1208,14 +1208,14 @@ public class InstructionList implements Serializable { */ public void redirectLocalVariables( LocalVariableGen[] lg, InstructionHandle old_target, InstructionHandle new_target ) { - for (int i = 0; i < lg.length; i++) { - InstructionHandle start = lg[i].getStart(); - InstructionHandle end = lg[i].getEnd(); + for (LocalVariableGen element : lg) { + InstructionHandle start = element.getStart(); + InstructionHandle end = element.getEnd(); if (start == old_target) { - lg[i].setStart(new_target); + element.setStart(new_target); } if (end == old_target) { - lg[i].setEnd(new_target); + element.setEnd(new_target); } } } @@ -1231,15 +1231,15 @@ public class InstructionList implements Serializable { */ public void redirectExceptionHandlers( CodeExceptionGen[] exceptions, InstructionHandle old_target, InstructionHandle new_target ) { - for (int i = 0; i < exceptions.length; i++) { - if (exceptions[i].getStartPC() == old_target) { - exceptions[i].setStartPC(new_target); + for (CodeExceptionGen exception : exceptions) { + if (exception.getStartPC() == old_target) { + exception.setStartPC(new_target); } - if (exceptions[i].getEndPC() == old_target) { - exceptions[i].setEndPC(new_target); + if (exception.getEndPC() == old_target) { + exception.setEndPC(new_target); } - if (exceptions[i].getHandlerPC() == old_target) { - exceptions[i].setHandlerPC(new_target); + if (exception.getHandlerPC() == old_target) { + exception.setHandlerPC(new_target); } } } diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index c0687074..4f2863db 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -23,6 +23,7 @@ import java.util.Comparator; import java.util.Hashtable; import java.util.List; import java.util.Stack; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.AnnotationEntry; import org.apache.bcel.classfile.Annotations; @@ -182,16 +183,15 @@ public class MethodGen extends FieldGenOrMethodGen { ? new InstructionList(m.getCode().getCode()) : null, cp); Attribute[] attributes = m.getAttributes(); - for (int i = 0; i < attributes.length; i++) { - Attribute a = attributes[i]; + for (Attribute attribute : attributes) { + Attribute a = attribute; if (a instanceof Code) { Code c = (Code) a; setMaxStack(c.getMaxStack()); setMaxLocals(c.getMaxLocals()); CodeException[] ces = c.getExceptionTable(); if (ces != null) { - for (int j = 0; j < ces.length; j++) { - CodeException ce = ces[j]; + for (CodeException ce : ces) { int type = ce.getCatchType(); ObjectType c_type = null; if (type > 0) { @@ -213,12 +213,11 @@ public class MethodGen extends FieldGenOrMethodGen { } } Attribute[] c_attributes = c.getAttributes(); - for (int j = 0; j < c_attributes.length; j++) { - a = c_attributes[j]; + for (Attribute c_attribute : c_attributes) { + a = c_attribute; if (a instanceof LineNumberTable) { LineNumber[] ln = ((LineNumberTable) a).getLineNumberTable(); - for (int k = 0; k < ln.length; k++) { - LineNumber l = ln[k]; + for (LineNumber l : ln) { InstructionHandle ih = il.findHandle(l.getStartPC()); if (ih != null) { addLineNumber(ih, l.getLineNumber()); @@ -227,8 +226,7 @@ public class MethodGen extends FieldGenOrMethodGen { } else if (a instanceof LocalVariableTable) { LocalVariable[] lv = ((LocalVariableTable) a).getLocalVariableTable(); removeLocalVariables(); - for (int k = 0; k < lv.length; k++) { - LocalVariable l = lv[k]; + for (LocalVariable l : lv) { InstructionHandle start = il.findHandle(l.getStartPC()); InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength()); // Repair malformed handles @@ -244,8 +242,7 @@ public class MethodGen extends FieldGenOrMethodGen { } else if (a instanceof LocalVariableTypeTable) { LocalVariable[] lv = ((LocalVariableTypeTable) a).getLocalVariableTypeTable(); removeLocalVariables(); - for (int k = 0; k < lv.length; k++) { - LocalVariable l = lv[k]; + for (LocalVariable l : lv) { InstructionHandle start = il.findHandle(l.getStartPC()); InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength()); // Repair malformed handles @@ -264,14 +261,13 @@ public class MethodGen extends FieldGenOrMethodGen { } } else if (a instanceof ExceptionTable) { String[] names = ((ExceptionTable) a).getExceptionNames(); - for (int j = 0; j < names.length; j++) { - addException(names[j]); + for (String name2 : names) { + addException(name2); } } else if (a instanceof Annotations) { Annotations runtimeAnnotations = (Annotations) a; AnnotationEntry[] aes = runtimeAnnotations.getAnnotationEntries(); - for (int k = 0; k < aes.length; k++) { - AnnotationEntry element = aes[k]; + for (AnnotationEntry element : aes) { addAnnotationEntry(new AnnotationEntryGen(element, cp, false)); } } else { @@ -610,8 +606,8 @@ public class MethodGen extends FieldGenOrMethodGen { public void addAnnotationsAsAttribute(ConstantPoolGen cp) { Attribute[] attrs = Utility.getAnnotationAttributes(cp,annotation_vec); - for (int i = 0; i < attrs.length; i++) { - addAttribute(attrs[i]); + for (Attribute attr : attrs) { + addAttribute(attr); } } @@ -619,8 +615,8 @@ public class MethodGen extends FieldGenOrMethodGen { if (!hasParameterAnnotations) return; Attribute[] attrs = Utility.getParameterAnnotationAttributes(cp,param_annotations); if (attrs!=null) { - for (int i = 0; i < attrs.length; i++) { - addAttribute(attrs[i]); + for (Attribute attr : attrs) { + addAttribute(attr); } } } @@ -656,8 +652,8 @@ public class MethodGen extends FieldGenOrMethodGen { /* Each attribute causes 6 additional header bytes */ int attrs_len = 0; - for (int i = 0; i < code_attrs.length; i++) { - attrs_len += (code_attrs[i].getLength() + 6); + for (Attribute code_attr : code_attrs) { + attrs_len += (code_attr.getLength() + 6); } CodeException[] c_exc = getCodeExceptions(); int exc_len = c_exc.length * 8; // Every entry takes 8 bytes @@ -665,8 +661,7 @@ public class MethodGen extends FieldGenOrMethodGen { if ((il != null) && !isAbstract() && !isNative()) { // Remove any stale code attribute Attribute[] attributes = getAttributes(); - for (int i = 0; i < attributes.length; i++) { - Attribute a = attributes[i]; + for (Attribute a : attributes) { if (a instanceof Code) { removeAttribute(a); } @@ -720,10 +715,10 @@ public class MethodGen extends FieldGenOrMethodGen { il.delete(ih); } catch (TargetLostException e) { InstructionHandle[] targets = e.getTargets(); - for (int i = 0; i < targets.length; i++) { - InstructionTargeter[] targeters = targets[i].getTargeters(); - for (int j = 0; j < targeters.length; j++) { - targeters[j].updateTarget(targets[i], next); + for (InstructionHandle target : targets) { + InstructionTargeter[] targeters = target.getTargeters(); + for (InstructionTargeter targeter : targeters) { + targeter.updateTarget(target, next); } } } @@ -856,8 +851,8 @@ public class MethodGen extends FieldGenOrMethodGen { if (il != null) { int max = isStatic() ? 0 : 1; if (arg_types != null) { - for (int i = 0; i < arg_types.length; i++) { - max += arg_types[i].getSize(); + for (Type arg_type : arg_types) { + max += arg_type.getSize(); } } for (InstructionHandle ih = il.getStart(); ih != null; ih = ih.getNext()) { @@ -945,8 +940,8 @@ public class MethodGen extends FieldGenOrMethodGen { * explicitly. in each case, the stack will have depth 1, * containing the exception object. */ - for (int i = 0; i < et.length; i++) { - InstructionHandle handler_pc = et[i].getHandlerPC(); + for (CodeExceptionGen element : et) { + InstructionHandle handler_pc = element.getHandlerPC(); if (handler_pc != null) { branchTargets.push(handler_pc, 1); } @@ -968,8 +963,8 @@ public class MethodGen extends FieldGenOrMethodGen { // explore all of the select's targets. the default target is handled below. Select select = (Select) branch; InstructionHandle[] targets = select.getTargets(); - for (int i = 0; i < targets.length; i++) { - branchTargets.push(targets[i], stackDepth); + for (InstructionHandle target : targets) { + branchTargets.push(target, stackDepth); } // nothing to fall through to. ih = null; @@ -1111,9 +1106,7 @@ public class MethodGen extends FieldGenOrMethodGen { Attribute[] attrs = getAttributes(); ParameterAnnotations paramAnnVisAttr = null; ParameterAnnotations paramAnnInvisAttr = null; - for (int i = 0; i < attrs.length; i++) - { - Attribute attribute = attrs[i]; + for (Attribute attribute : attrs) { if (attribute instanceof ParameterAnnotations) { // Initialize param_annotations @@ -1151,9 +1144,8 @@ public class MethodGen extends FieldGenOrMethodGen { private List makeMutableVersion(AnnotationEntry[] mutableArray) { List result = new ArrayList(); - for (int i = 0; i < mutableArray.length; i++) - { - result.add(new AnnotationEntryGen(mutableArray[i], getConstantPool(), + for (AnnotationEntry element : mutableArray) { + result.add(new AnnotationEntryGen(element, getConstantPool(), false)); } return result; diff --git a/src/main/java/org/apache/bcel/generic/ReferenceType.java b/src/main/java/org/apache/bcel/generic/ReferenceType.java index 5a03d3ec..574b4b38 100644 --- a/src/main/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/main/java/org/apache/bcel/generic/ReferenceType.java @@ -165,8 +165,8 @@ public abstract class ReferenceType extends Type { // on one of them "interfaces implemented by arrays" is exchanged with "'Cloneable' or // 'java.io.Serializable'" if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact())) { - for (int ii = 0; ii < Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS.length; ii++) { - if (T.equals(ObjectType.getInstance(Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS[ii]))) { + for (String element : Constants.INTERFACES_IMPLEMENTED_BY_ARRAYS) { + if (T.equals(ObjectType.getInstance(element))) { return true; } } @@ -249,10 +249,10 @@ public abstract class ReferenceType extends Type { System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); this_sups[0] = Repository.lookupClass(thiz.getClassName()); t_sups[0] = Repository.lookupClass(other.getClassName()); - for (int i = 0; i < t_sups.length; i++) { - for (int j = 0; j < this_sups.length; j++) { - if (this_sups[j].equals(t_sups[i])) { - return ObjectType.getInstance(this_sups[j].getClassName()); + for (JavaClass t_sup : t_sups) { + for (JavaClass this_sup : this_sups) { + if (this_sup.equals(t_sup)) { + return ObjectType.getInstance(this_sup.getClassName()); } } } @@ -322,10 +322,10 @@ public abstract class ReferenceType extends Type { System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); this_sups[0] = Repository.lookupClass(thiz.getClassName()); t_sups[0] = Repository.lookupClass(other.getClassName()); - for (int i = 0; i < t_sups.length; i++) { - for (int j = 0; j < this_sups.length; j++) { - if (this_sups[j].equals(t_sups[i])) { - return ObjectType.getInstance(this_sups[j].getClassName()); + for (JavaClass t_sup : t_sups) { + for (JavaClass this_sup : this_sups) { + if (this_sup.equals(t_sup)) { + return ObjectType.getInstance(this_sup.getClassName()); } } } diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index 11cbb624..43a024d8 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -63,8 +63,8 @@ public abstract class Select extends BranchInstruction implements VariableLength Select(short opcode, int[] match, InstructionHandle[] targets, InstructionHandle defaultTarget) { super(opcode, defaultTarget); this.targets = targets; - for (int i = 0; i < targets.length; i++) { - notifyTarget(null, targets[i], this); + for (InstructionHandle target2 : targets) { + notifyTarget(null, target2, this); } this.match = match; if ((match_length = match.length) != targets.length) { @@ -190,8 +190,8 @@ public abstract class Select extends BranchInstruction implements VariableLength if (target == ih) { return true; } - for (int i = 0; i < targets.length; i++) { - if (targets[i] == ih) { + for (InstructionHandle target2 : targets) { + if (target2 == ih) { return true; } } @@ -215,8 +215,8 @@ public abstract class Select extends BranchInstruction implements VariableLength @Override void dispose() { super.dispose(); - for (int i = 0; i < targets.length; i++) { - targets[i].removeTargeter(this); + for (InstructionHandle target2 : targets) { + target2.removeTargeter(this); } } diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 0c6c21a4..b5eec440 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -312,8 +312,8 @@ public abstract class Type implements java.io.Serializable { public static String getSignature( java.lang.reflect.Method meth ) { StringBuilder sb = new StringBuilder("("); Class[] params = meth.getParameterTypes(); // avoid clone - for (int j = 0; j < params.length; j++) { - sb.append(getType(params[j]).getSignature()); + for (Class param : params) { + sb.append(getType(param).getSignature()); } sb.append(")"); sb.append(getType(meth.getReturnType()).getSignature()); diff --git a/src/main/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java index 06781601..4282811d 100644 --- a/src/main/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/main/java/org/apache/bcel/util/AttributeHTML.java @@ -141,11 +141,11 @@ final class AttributeHTML implements org.apache.bcel.Constants { // List thrown exceptions int[] indices = ((ExceptionTable) attribute).getExceptionIndexTable(); file.print("\n"); break; case ATTR_LINE_NUMBER_TABLE: @@ -164,42 +164,42 @@ final class AttributeHTML implements org.apache.bcel.Constants { LocalVariable[] vars = ((LocalVariableTable) attribute).getLocalVariableTable(); // List name, range and type file.print("
          "); - for (int i = 0; i < vars.length; i++) { - index = vars[i].getSignatureIndex(); - String signature = ((ConstantUtf8) constant_pool.getConstant(index, - CONSTANT_Utf8)).getBytes(); - signature = Utility.signatureToString(signature, false); - int start = vars[i].getStartPC(); - int end = (start + vars[i].getLength()); - file.println("
        • " + Class2HTML.referenceType(signature) + " " - + vars[i].getName() + " in slot %" + vars[i].getIndex() - + "
          Valid from lines " + "" - + start + " to " + "" + end + "
        • "); - } + for (LocalVariable var : vars) { + index = var.getSignatureIndex(); + String signature = ((ConstantUtf8) constant_pool.getConstant(index, + CONSTANT_Utf8)).getBytes(); + signature = Utility.signatureToString(signature, false); + int start = var.getStartPC(); + int end = (start + var.getLength()); + file.println("
        • " + Class2HTML.referenceType(signature) + " " + + var.getName() + " in slot %" + var.getIndex() + + "
          Valid from lines " + "" + + start + " to " + "" + end + "
        • "); + } file.print("
        \n"); break; case ATTR_INNER_CLASSES: InnerClass[] classes = ((InnerClasses) attribute).getInnerClasses(); // List inner classes file.print("
          "); - for (int i = 0; i < classes.length; i++) { - String name, access; - index = classes[i].getInnerNameIndex(); - if (index > 0) { - name = ((ConstantUtf8) constant_pool.getConstant(index, CONSTANT_Utf8)) - .getBytes(); - } else { - name = "<anonymous>"; - } - access = Utility.accessToString(classes[i].getInnerAccessFlags()); - file.print("
        • " + access + " " - + constant_html.referenceConstant(classes[i].getInnerClassIndex()) - + " in class " - + constant_html.referenceConstant(classes[i].getOuterClassIndex()) - + " named " + name + "
        • \n"); + for (InnerClass classe : classes) { + String name, access; + index = classe.getInnerNameIndex(); + if (index > 0) { + name = ((ConstantUtf8) constant_pool.getConstant(index, CONSTANT_Utf8)) + .getBytes(); + } else { + name = "<anonymous>"; } + access = Utility.accessToString(classe.getInnerAccessFlags()); + file.print("
        • " + access + " " + + constant_html.referenceConstant(classe.getInnerClassIndex()) + + " in class " + + constant_html.referenceConstant(classe.getOuterClassIndex()) + + " named " + name + "
        • \n"); + } file.print("
        \n"); break; default: // Such as Unknown attribute or Deprecated diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index 474bd18e..d4d3df1f 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -336,8 +336,7 @@ class BCELFactory extends EmptyVisitor { private void updateExceptionHandlers() { CodeExceptionGen[] handlers = _mg.getExceptionHandlers(); - for (int i = 0; i < handlers.length; i++) { - CodeExceptionGen h = handlers[i]; + for (CodeExceptionGen h : handlers) { String type = (h.getCatchType() == null) ? "null" : BCELifier.printType(h .getCatchType()); _out.println(" method.addExceptionHandler(" + "ih_" + h.getStartPC().getPosition() diff --git a/src/main/java/org/apache/bcel/util/BCELifier.java b/src/main/java/org/apache/bcel/util/BCELifier.java index d45379a4..a17fad37 100644 --- a/src/main/java/org/apache/bcel/util/BCELifier.java +++ b/src/main/java/org/apache/bcel/util/BCELifier.java @@ -108,8 +108,8 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { if (fields.length > 0) { _out.println(" private void createFields() {"); _out.println(" FieldGen field;"); - for (int i = 0; i < fields.length; i++) { - fields[i].accept(this); + for (Field field : fields) { + field.accept(this); } _out.println(" }"); _out.println(); diff --git a/src/main/java/org/apache/bcel/util/ClassLoader.java b/src/main/java/org/apache/bcel/util/ClassLoader.java index 52f53d02..82a4a871 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoader.java +++ b/src/main/java/org/apache/bcel/util/ClassLoader.java @@ -19,6 +19,7 @@ package org.apache.bcel.util; import java.io.ByteArrayInputStream; import java.util.Hashtable; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.ConstantClass; @@ -104,8 +105,8 @@ public class ClassLoader extends java.lang.ClassLoader { /* Second try: Load system class using system class loader. You better * don't mess around with them. */ - for (int i = 0; i < ignored_packages.length; i++) { - if (class_name.startsWith(ignored_packages[i])) { + for (String ignored_package : ignored_packages) { + if (class_name.startsWith(ignored_package)) { cl = getParent().loadClass(class_name); break; } diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 7a03fbe4..6a85d140 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -167,8 +167,8 @@ public class ClassPath implements Serializable { File ext_dir = new File(d); String[] extensions = ext_dir.list(ARCHIVE_FILTER); if (extensions != null) { - for (int i = 0; i < extensions.length; i++) { - list.add(ext_dir.getPath() + File.separatorChar + extensions[i]); + for (String extension : extensions) { + list.add(ext_dir.getPath() + File.separatorChar + extension); } } } @@ -216,9 +216,9 @@ public class ClassPath implements Serializable { * @return InputStream supplying the resource, or null if no resource with that name. */ public InputStream getResourceAsStream(String name) { - for (int i = 0; i < paths.length; i++) { + for (PathEntry path : paths) { InputStream is; - if ((is = paths[i].getResourceAsStream(name)) != null) { + if ((is = path.getResourceAsStream(name)) != null) { return is; } } @@ -230,9 +230,9 @@ public class ClassPath implements Serializable { * @return URL supplying the resource, or null if no resource with that name. */ public URL getResource(String name) { - for (int i = 0; i < paths.length; i++) { + for (PathEntry path : paths) { URL url; - if ((url = paths[i].getResource(name)) != null) { + if ((url = path.getResource(name)) != null) { return url; } } @@ -246,9 +246,9 @@ public class ClassPath implements Serializable { */ public Enumeration getResources(String name) { Vector results = new Vector(); - for (int i = 0; i < paths.length; i++) { + for (PathEntry path : paths) { URL url; - if ((url = paths[i].getResource(name)) != null) { + if ((url = path.getResource(name)) != null) { results.add(url); } } @@ -261,7 +261,7 @@ public class ClassPath implements Serializable { * @return class file for the java class */ public ClassFile getClassFile( String name, String suffix ) throws IOException { - for (int i = 0; i < paths.length; i++) { + for (PathEntry path : paths) { ClassFile cf = null; if(parent != null) { @@ -282,8 +282,8 @@ public class ClassPath implements Serializable { private ClassFile getClassFileInternal(String name, String suffix) throws IOException { - for(int i=0; i < paths.length; i++) { - ClassFile cf = paths[i].getClassFile(name, suffix); + for (PathEntry path : paths) { + ClassFile cf = path.getClassFile(name, suffix); if(cf != null) { return cf; diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 16b5bb85..3a56b541 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -112,10 +112,10 @@ final class CodeHTML implements org.apache.bcel.Constants { } buf.append("
        \n"); // Print target and default indices in second row - for (int i = 0; i < jump_table.length; i++) { - buf.append(""); - } + for (int element : jump_table) { + buf.append(""); + } buf.append("\n
        Byte
        offset
        InstructionArgumentdefault
        ").append(jump_table[i]).append("").append(element).append("").append(default_offset).append( "
        \n"); @@ -382,13 +382,13 @@ final class CodeHTML implements org.apache.bcel.Constants { } // Look for local variables and their range Attribute[] attributes = code.getAttributes(); - for (int i = 0; i < attributes.length; i++) { - if (attributes[i].getTag() == ATTR_LOCAL_VARIABLE_TABLE) { - LocalVariable[] vars = ((LocalVariableTable) attributes[i]) + for (Attribute attribute : attributes) { + if (attribute.getTag() == ATTR_LOCAL_VARIABLE_TABLE) { + LocalVariable[] vars = ((LocalVariableTable) attribute) .getLocalVariableTable(); - for (int j = 0; j < vars.length; j++) { - int start = vars[j].getStartPC(); - int end = (start + vars[j].getLength()); + for (LocalVariable var : vars) { + int start = var.getStartPC(); + int end = (start + var.getLength()); goto_set.set(start); goto_set.set(end); } diff --git a/src/main/java/org/apache/bcel/util/MethodHTML.java b/src/main/java/org/apache/bcel/util/MethodHTML.java index e7bb4c1e..64e6a927 100644 --- a/src/main/java/org/apache/bcel/util/MethodHTML.java +++ b/src/main/java/org/apache/bcel/util/MethodHTML.java @@ -52,8 +52,8 @@ final class MethodHTML implements org.apache.bcel.Constants { file.println(""); file.println("" + ""); - for (int i = 0; i < fields.length; i++) { - writeField(fields[i]); + for (Field field : fields) { + writeField(field); } file.println("
        Access flagsTypeField name
        "); file.println("" diff --git a/src/main/java/org/apache/bcel/verifier/Verifier.java b/src/main/java/org/apache/bcel/verifier/Verifier.java index e35d06e0..5e389341 100644 --- a/src/main/java/org/apache/bcel/verifier/Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/Verifier.java @@ -149,32 +149,32 @@ public class Verifier { List messages = new ArrayList(); if (p1v != null) { String[] p1m = p1v.getMessages(); - for (int i = 0; i < p1m.length; i++) { - messages.add("Pass 1: " + p1m[i]); + for (String element : p1m) { + messages.add("Pass 1: " + element); } } if (p2v != null) { String[] p2m = p2v.getMessages(); - for (int i = 0; i < p2m.length; i++) { - messages.add("Pass 2: " + p2m[i]); + for (String element : p2m) { + messages.add("Pass 2: " + element); } } for (Pass3aVerifier pv : p3avs.values()) { String[] p3am = pv.getMessages(); int meth = pv.getMethodNo(); - for (int i = 0; i < p3am.length; i++) { + for (String element : p3am) { messages.add("Pass 3a, method " + meth + " ('" + org.apache.bcel.Repository.lookupClass(classname).getMethods()[meth] - + "'): " + p3am[i]); + + "'): " + element); } } for (Pass3bVerifier pv : p3bvs.values()) { String[] p3bm = pv.getMessages(); int meth = pv.getMethodNo(); - for (int i = 0; i < p3bm.length; i++) { + for (String element : p3bm) { messages.add("Pass 3b, method " + meth + " ('" + org.apache.bcel.Repository.lookupClass(classname).getMethods()[meth] - + "'): " + p3bm[i]); + + "'): " + element); } } String[] ret = new String[messages.size()]; @@ -230,8 +230,8 @@ public class Verifier { if (warnings.length == 0) { System.out.println(""); } - for (int j = 0; j < warnings.length; j++) { - System.out.println(warnings[j]); + for (String warning : warnings) { + System.out.println(warning); } System.out.println("\n"); // avoid swapping. diff --git a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java index 0b43459d..5befe2f8 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java +++ b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java @@ -17,6 +17,7 @@ package org.apache.bcel.verifier; import java.awt.Color; + import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; @@ -465,10 +466,10 @@ public class VerifyDialog extends javax.swing.JDialog { */ public static void main( java.lang.String[] args ) { classes_to_verify = args.length; - for (int i = 0; i < args.length; i++) { + for (String arg : args) { try { VerifyDialog aVerifyDialog; - aVerifyDialog = new VerifyDialog(args[i]); + aVerifyDialog = new VerifyDialog(arg); aVerifyDialog.setModal(true); aVerifyDialog.addWindowListener(new java.awt.event.WindowAdapter() { diff --git a/src/main/java/org/apache/bcel/verifier/statics/IntList.java b/src/main/java/org/apache/bcel/verifier/statics/IntList.java index 3f00265a..361081ac 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/IntList.java +++ b/src/main/java/org/apache/bcel/verifier/statics/IntList.java @@ -42,8 +42,8 @@ public class IntList{ boolean contains(int i){ Integer[] ints = new Integer[theList.size()]; theList.toArray(ints); - for (int j=0; j= code.getMaxLocals()){ - throw new ClassConstraintException("LocalVariableTable attribute '"+tostring(lvt)+"' references a LocalVariable '"+tostring(localvariables[i])+"' with an index that exceeds the surrounding Code attribute's max_locals value of '"+code.getMaxLocals()+"'."); + throw new ClassConstraintException("LocalVariableTable attribute '"+tostring(lvt)+"' references a LocalVariable '"+tostring(localvariable)+"' with an index that exceeds the surrounding Code attribute's max_locals value of '"+code.getMaxLocals()+"'."); } try{ - localVariablesInfos[method_number].add(localindex, localname, localvariables[i].getStartPC(), localvariables[i].getLength(), t); + localVariablesInfos[method_number].add(localindex, localname, localvariable.getStartPC(), localvariable.getLength(), t); } catch(LocalVariableInfoInconsistentException lviie){ throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+"' found in Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"'). "+lviie.getMessage(), lviie); @@ -1061,10 +1061,10 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ int[] exc_indices = obj.getExceptionIndexTable(); - for (int i=0; i= endpc){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has its start_pc ('"+startpc+"') not smaller than its end_pc ('"+endpc+"')."); + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has its start_pc ('"+startpc+"') not smaller than its end_pc ('"+endpc+"')."); } if (!contains(instructionPositions, startpc)){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has a non-existant bytecode offset as its start_pc ('"+startpc+"')."); + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has a non-existant bytecode offset as its start_pc ('"+startpc+"')."); } if ( (!contains(instructionPositions, endpc)) && (endpc != codeLength)){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has a non-existant bytecode offset as its end_pc ('"+startpc+"') [that is also not equal to code_length ('"+codeLength+"')]."); + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has a non-existant bytecode offset as its end_pc ('"+startpc+"') [that is also not equal to code_length ('"+codeLength+"')]."); } if (!contains(instructionPositions, handlerpc)){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+exceptionTable[i]+"' that has a non-existant bytecode offset as its handler_pc ('"+handlerpc+"')."); + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has a non-existant bytecode offset as its handler_pc ('"+handlerpc+"')."); } } } @@ -423,8 +423,8 @@ public final class Pass3aVerifier extends PassVerifier{ /** A small utility method returning if a given int i is in the given int[] ints. */ private static boolean contains(int[] ints, int i){ - for (int j=0; j>(); CodeExceptionGen[] cegs = mg.getExceptionHandlers(); - for (int i=0; i hs; hs = exceptionhandlers.get(ih); if (hs == null){ diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index cba0f9ed..84390794 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -1236,15 +1236,15 @@ public class InstConstraintVisitor extends EmptyVisitor{ JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); Field[] fields = jc.getFields(); Field f = null; - for (int i=0; i ArrayList newchainClone = (ArrayList) newchain.clone(); @@ -219,8 +218,8 @@ public final class Pass3bVerifier extends PassVerifier{ // Exception Handlers. Add them to the queue of successors. // [subroutines are never protected; mandated by JustIce] ExceptionHandler[] exc_hds = u.getExceptionHandlers(); - for (int s=0; s(), icv, ev)){ + if (v.execute(new Frame(u.getOutFrame(oldchain).getLocals(), new OperandStack (u.getOutFrame(oldchain).getStack().maxStack(), (exc_hd.getExceptionType()==null? Type.THROWABLE : exc_hd.getExceptionType())) ), new ArrayList(), icv, ev)){ icq.add(v, new ArrayList()); } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index dc517ced..a86beca3 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -119,15 +119,15 @@ public class Subroutines{ ret += " Accessed local variable slots: '"; int[] alv = getAccessedLocalsIndices(); - for (int i=0; i s = new HashSet(); int[] lvs = getAccessedLocalsIndices(); - for (int j=0; j s, Subroutine[] subs){ - for (int i=0; i sub_leaders = new HashSet(); // Elements: InstructionHandle - for (int i=0; i set){ Subroutine[] subs = sub.subSubs(); - for (int i=0; i chosenAttrsList = new ArrayList(); - for (int i = 0; i < all.length; i++) - { + for (Attribute element : all) { if (verbose) - System.err.println("Attribute: " + all[i].getName()); - if (all[i].getName().equals(name)) - chosenAttrsList.add(all[i]); + System.err.println("Attribute: " + element.getName()); + if (element.getName().equals(name)) + chosenAttrsList.add(element); } return chosenAttrsList.toArray(new Attribute[] {}); } @@ -107,12 +104,11 @@ public abstract class AbstractTestCase extends TestCase protected Attribute findAttribute(String name, Attribute[] all) { List chosenAttrsList = new ArrayList(); - for (int i = 0; i < all.length; i++) - { + for (Attribute element : all) { if (verbose) - System.err.println("Attribute: " + all[i].getName()); - if (all[i].getName().equals(name)) - chosenAttrsList.add(all[i]); + System.err.println("Attribute: " + element.getName()); + if (element.getName().equals(name)) + chosenAttrsList.add(element); } assertTrue("Should be one match: " + chosenAttrsList.size(), chosenAttrsList.size() == 1); diff --git a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java b/src/test/java/org/apache/bcel/AnnotationGenTestCase.java index f2d1718b..f5b013c2 100644 --- a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/bcel/AnnotationGenTestCase.java @@ -100,9 +100,7 @@ public class AnnotationGenTestCase extends AbstractTestCase v.add(a); Attribute[] attributes = Utility.getAnnotationAttributes(cp, v); boolean foundRV = false; - for (int i = 0; i < attributes.length; i++) - { - Attribute attribute = attributes[i]; + for (Attribute attribute : attributes) { if (attribute instanceof RuntimeVisibleAnnotations) { assertTrue(((Annotations) attribute).isRuntimeVisible()); @@ -117,9 +115,7 @@ public class AnnotationGenTestCase extends AbstractTestCase v2.add(a2); Attribute[] attributes2 = Utility.getAnnotationAttributes(cp, v2); boolean foundRIV = false; - for (int i = 0; i < attributes2.length; i++) - { - Attribute attribute = attributes2[i]; + for (Attribute attribute : attributes2) { if (attribute instanceof RuntimeInvisibleAnnotations) { assertFalse(((Annotations) attribute).isRuntimeVisible()); diff --git a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java b/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java index 7cc8a0af..ef56b22f 100644 --- a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java +++ b/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java @@ -111,9 +111,7 @@ public class FieldAnnotationsTestCase extends AbstractTestCase String AnnotationEntryElementValue) { Field[] fields = clazz.getFields(); - for (int i = 0; i < fields.length; i++) - { - Field f = fields[i]; + for (Field f : fields) { AnnotationEntry[] fieldAnnotationEntrys = f.getAnnotationEntries(); if (f.getName().equals(fieldname)) { diff --git a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java index d0bb6410..0ac43c57 100644 --- a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java @@ -19,7 +19,6 @@ package org.apache.bcel; import java.io.File; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import org.apache.bcel.classfile.AnnotationEntry; @@ -363,9 +362,8 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase annotations.length == 1); List l = annotations[0].getValues(); boolean found = false; - for (Iterator iter = l.iterator(); iter.hasNext();) - { - ElementValuePairGen element = (ElementValuePairGen) iter.next(); + for (Object name : l) { + ElementValuePairGen element = (ElementValuePairGen) name; if (element.getNameString().equals("dval")) { if (((SimpleElementValueGen) element.getValue()) diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java index 48ce9fff..2676b85f 100644 --- a/src/test/java/org/apache/bcel/PerformanceTest.java +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -93,9 +93,7 @@ public final class PerformanceTest extends TestCase { cgenTime.stop(); Method[] methods = cg.getMethods(); - for (int j = 0; j < methods.length; j++) { - Method m = methods[j]; - + for (Method m : methods) { mgenTime.start(); MethodGen mg = new MethodGen(m, cg.getClassName(), cg.getConstantPool()); InstructionList il = mg.getInstructionList(); -- GitLab From 09499726b740d11acfdd16d1658ba98beb808d71 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 31 Dec 2013 22:06:09 +0000 Subject: [PATCH 0578/1313] Convert control statement bodies to block. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1554577 13f79535-47bb-0310-9956-ffa450edef68 --- .../classfile/AnnotationElementValue.java | 7 ++- .../bcel/classfile/ArrayElementValue.java | 15 +++-- .../apache/bcel/classfile/ConstantUtf8.java | 3 +- .../bcel/classfile/EnclosingMethod.java | 4 +- .../bcel/classfile/EnumElementValue.java | 5 +- .../apache/bcel/classfile/FieldOrMethod.java | 5 +- .../org/apache/bcel/classfile/JavaClass.java | 12 ++-- .../classfile/LocalVariableTypeTable.java | 27 +++++---- .../bcel/classfile/SimpleElementValue.java | 54 ++++++++++------- .../org/apache/bcel/classfile/Utility.java | 60 ++++++++++++------- .../generic/AnnotationElementValueGen.java | 5 +- .../bcel/generic/AnnotationEntryGen.java | 15 +++-- .../bcel/generic/ArrayElementValueGen.java | 5 +- .../bcel/generic/EnumElementValueGen.java | 5 +- .../org/apache/bcel/generic/GETFIELD.java | 3 +- .../org/apache/bcel/generic/GETSTATIC.java | 3 +- .../apache/bcel/generic/INVOKEINTERFACE.java | 3 +- .../apache/bcel/generic/INVOKESPECIAL.java | 3 +- .../org/apache/bcel/generic/INVOKESTATIC.java | 3 +- .../apache/bcel/generic/INVOKEVIRTUAL.java | 3 +- .../apache/bcel/generic/InstructionList.java | 5 +- .../org/apache/bcel/generic/MethodGen.java | 37 +++++++----- .../org/apache/bcel/generic/ObjectType.java | 7 ++- .../org/apache/bcel/generic/PUTFIELD.java | 3 +- .../org/apache/bcel/generic/PUTSTATIC.java | 3 +- .../bcel/generic/SimpleElementValueGen.java | 28 +++++---- .../java/org/apache/bcel/util/ClassPath.java | 8 ++- .../bcel/AbstractCounterVisitorTestCase.java | 5 +- .../org/apache/bcel/AbstractTestCase.java | 35 ++++++----- .../apache/bcel/FieldAnnotationsTestCase.java | 40 ++++++++----- .../GeneratingAnnotatedClassesTestCase.java | 3 +- .../bcel/InstructionFinderTestCase.java | 5 +- 32 files changed, 257 insertions(+), 162 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java index 00e9dd10..e4cfd97b 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java @@ -29,9 +29,10 @@ public class AnnotationElementValue extends ElementValue ConstantPool cpool) { super(type, cpool); - if (type != ANNOTATION) - throw new RuntimeException( - "Only element values of type annotation can be built with this ctor - type specified: " + type); + if (type != ANNOTATION) { + throw new RuntimeException( + "Only element values of type annotation can be built with this ctor - type specified: " + type); + } this.annotationEntry = annotationEntry; } diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java index 250d8bf1..7b2d2e2b 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -33,8 +33,9 @@ public class ArrayElementValue extends ElementValue for (int i = 0; i < evalues.length; i++) { sb.append(evalues[i].toString()); - if ((i + 1) < evalues.length) - sb.append(","); + if ((i + 1) < evalues.length) { + sb.append(","); + } } sb.append("}"); return sb.toString(); @@ -43,9 +44,10 @@ public class ArrayElementValue extends ElementValue public ArrayElementValue(int type, ElementValue[] datums, ConstantPool cpool) { super(type, cpool); - if (type != ARRAY) - throw new RuntimeException( + if (type != ARRAY) { + throw new RuntimeException( "Only element values of type array can be built with this ctor - type specified: " + type); + } this.evalues = datums; } @@ -67,8 +69,9 @@ public class ArrayElementValue extends ElementValue for (int i = 0; i < evalues.length; i++) { sb.append(evalues[i].stringifyValue()); - if ((i + 1) < evalues.length) - sb.append(","); + if ((i + 1) < evalues.length) { + sb.append(","); + } } sb.append("]"); return sb.toString(); diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index 317afca6..728bac61 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -52,7 +52,7 @@ public final class ConstantUtf8 extends Constant { final static boolean BCEL_DONT_CACHE = Boolean.getBoolean("bcel.dontCache"); static { - if (BCEL_STATISTICS) + if (BCEL_STATISTICS) { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { System.err.println("Cache hit " + hits + "/" + considered +", " @@ -60,6 +60,7 @@ public final class ConstantUtf8 extends Constant { System.err.println("Total of " + created + " ConstantUtf8 objects created"); } }); + } } public static synchronized ConstantUtf8 getCachedInstance(String s) { diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java index 93890fc8..983dfcb4 100644 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -81,7 +81,9 @@ public class EnclosingMethod extends Attribute { } public final ConstantNameAndType getEnclosingMethod() { - if (methodIndex == 0) return null; + if (methodIndex == 0) { + return null; + } ConstantNameAndType nat = (ConstantNameAndType)constant_pool.getConstant(methodIndex,Constants.CONSTANT_NameAndType); return nat; diff --git a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java index 8efb7c44..8bfdf3c1 100644 --- a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java @@ -32,9 +32,10 @@ public class EnumElementValue extends ElementValue ConstantPool cpool) { super(type, cpool); - if (type != ENUM_CONSTANT) - throw new RuntimeException( + if (type != ENUM_CONSTANT) { + throw new RuntimeException( "Only element values of type enum can be built with this ctor - type specified: " + type); + } this.typeIdx = typeIdx; this.valueIdx = valueIdx; } diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index 9332b000..676a57ed 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -213,8 +213,9 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No c.constant_pool = constant_pool; c.attributes = new Attribute[attributes_count]; - for(int i=0; i < attributes_count; i++) - c.attributes[i] = attributes[i].copy(constant_pool); + for(int i=0; i < attributes_count; i++) { + c.attributes[i] = attributes[i].copy(constant_pool); + } return c; } diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index b4b6016b..b377a795 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -345,8 +345,9 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl for (Attribute attribute : attrs) { if (attribute instanceof Annotations) { Annotations runtimeAnnotations = (Annotations)attribute; - for(int j = 0; j < runtimeAnnotations.getAnnotationEntries().length; j++) - accumulatedAnnotations.add(runtimeAnnotations.getAnnotationEntries()[j]); + for(int j = 0; j < runtimeAnnotations.getAnnotationEntries().length; j++) { + accumulatedAnnotations.add(runtimeAnnotations.getAnnotationEntries()[j]); + } } } annotations = accumulatedAnnotations.toArray(new AnnotationEntry[accumulatedAnnotations.size()]); @@ -649,8 +650,9 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl AnnotationEntry[] annotations = getAnnotationEntries(); if (annotations!=null && annotations.length>0) { buf.append("\nAnnotation(s):\n"); - for (AnnotationEntry annotation : annotations) + for (AnnotationEntry annotation : annotations) { buf.append(indent(annotation)); + } } if (fields.length > 0) { buf.append("\n").append(fields.length).append(" fields:\n"); @@ -726,7 +728,9 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl } private final void computeNestedTypeStatus() { - if (computedNestedTypeStatus) return; + if (computedNestedTypeStatus) { + return; + } for (Attribute attribute : this.attributes) { if (attribute instanceof InnerClasses) { InnerClass[] innerClasses = ((InnerClasses) attribute).getInnerClasses(); diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index 699833b5..73808828 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -70,8 +70,9 @@ private int local_variable_type_table_length; // Table of local local_variable_type_table_length = (dis.readUnsignedShort()); local_variable_type_table = new LocalVariable[local_variable_type_table_length]; - for(int i=0; i < local_variable_type_table_length; i++) - local_variable_type_table[i] = new LocalVariable(dis, cpool); + for(int i=0; i < local_variable_type_table_length; i++) { + local_variable_type_table[i] = new LocalVariable(dis, cpool); + } } @Override @@ -84,8 +85,9 @@ public final void dump(DataOutputStream file) throws IOException { super.dump(file); file.writeShort(local_variable_type_table_length); - for(int i=0; i < local_variable_type_table_length; i++) - local_variable_type_table[i].dump(file); + for(int i=0; i < local_variable_type_table_length; i++) { + local_variable_type_table[i].dump(file); + } } public final LocalVariable[] getLocalVariableTypeTable() { @@ -93,9 +95,11 @@ public final void dump(DataOutputStream file) throws IOException } public final LocalVariable getLocalVariable(int index) { - for(int i=0; i < local_variable_type_table_length; i++) - if(local_variable_type_table[i].getIndex() == index) - return local_variable_type_table[i]; + for(int i=0; i < local_variable_type_table_length; i++) { + if(local_variable_type_table[i].getIndex() == index) { + return local_variable_type_table[i]; + } + } return null; } @@ -117,7 +121,9 @@ public final String toString() { for(int i=0; i < local_variable_type_table_length; i++) { buf.append(local_variable_type_table[i].toString()); - if(i < local_variable_type_table_length - 1) buf.append('\n'); + if(i < local_variable_type_table_length - 1) { + buf.append('\n'); + } } return buf.toString(); @@ -131,8 +137,9 @@ public Attribute copy(ConstantPool constant_pool) { LocalVariableTypeTable c = (LocalVariableTypeTable)clone(); c.local_variable_type_table = new LocalVariable[local_variable_type_table_length]; - for(int i=0; i < local_variable_type_table_length; i++) - c.local_variable_type_table[i] = local_variable_type_table[i].copy(); + for(int i=0; i < local_variable_type_table_length; i++) { + c.local_variable_type_table[i] = local_variable_type_table[i].copy(); + } c.constant_pool = constant_pool; return c; diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java index bcd747bd..d525bb95 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -46,9 +46,10 @@ public class SimpleElementValue extends ElementValue public String getValueString() { - if (type != STRING) - throw new RuntimeException( + if (type != STRING) { + throw new RuntimeException( "Dont call getValueString() on a non STRING ElementValue"); + } ConstantUtf8 c = (ConstantUtf8) cpool.getConstant(getIndex(), Constants.CONSTANT_Utf8); return c.getBytes(); @@ -56,9 +57,10 @@ public class SimpleElementValue extends ElementValue public int getValueInt() { - if (type != PRIMITIVE_INT) - throw new RuntimeException( + if (type != PRIMITIVE_INT) { + throw new RuntimeException( "Dont call getValueString() on a non STRING ElementValue"); + } ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), Constants.CONSTANT_Integer); return c.getBytes(); @@ -66,9 +68,10 @@ public class SimpleElementValue extends ElementValue public byte getValueByte() { - if (type != PRIMITIVE_BYTE) - throw new RuntimeException( + if (type != PRIMITIVE_BYTE) { + throw new RuntimeException( "Dont call getValueByte() on a non BYTE ElementValue"); + } ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), Constants.CONSTANT_Integer); return (byte) c.getBytes(); @@ -76,9 +79,10 @@ public class SimpleElementValue extends ElementValue public char getValueChar() { - if (type != PRIMITIVE_CHAR) - throw new RuntimeException( + if (type != PRIMITIVE_CHAR) { + throw new RuntimeException( "Dont call getValueChar() on a non CHAR ElementValue"); + } ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), Constants.CONSTANT_Integer); return (char) c.getBytes(); @@ -86,45 +90,50 @@ public class SimpleElementValue extends ElementValue public long getValueLong() { - if (type != PRIMITIVE_LONG) - throw new RuntimeException( + if (type != PRIMITIVE_LONG) { + throw new RuntimeException( "Dont call getValueLong() on a non LONG ElementValue"); + } ConstantLong j = (ConstantLong) cpool.getConstant(getIndex()); return j.getBytes(); } public float getValueFloat() { - if (type != PRIMITIVE_FLOAT) - throw new RuntimeException( + if (type != PRIMITIVE_FLOAT) { + throw new RuntimeException( "Dont call getValueFloat() on a non FLOAT ElementValue"); + } ConstantFloat f = (ConstantFloat) cpool.getConstant(getIndex()); return f.getBytes(); } public double getValueDouble() { - if (type != PRIMITIVE_DOUBLE) - throw new RuntimeException( + if (type != PRIMITIVE_DOUBLE) { + throw new RuntimeException( "Dont call getValueDouble() on a non DOUBLE ElementValue"); + } ConstantDouble d = (ConstantDouble) cpool.getConstant(getIndex()); return d.getBytes(); } public boolean getValueBoolean() { - if (type != PRIMITIVE_BOOLEAN) - throw new RuntimeException( + if (type != PRIMITIVE_BOOLEAN) { + throw new RuntimeException( "Dont call getValueBoolean() on a non BOOLEAN ElementValue"); + } ConstantInteger bo = (ConstantInteger) cpool.getConstant(getIndex()); return (bo.getBytes() != 0); } public short getValueShort() { - if (type != PRIMITIVE_SHORT) - throw new RuntimeException( + if (type != PRIMITIVE_SHORT) { + throw new RuntimeException( "Dont call getValueShort() on a non SHORT ElementValue"); + } ConstantInteger s = (ConstantInteger) cpool.getConstant(getIndex()); return (short) s.getBytes(); } @@ -172,10 +181,11 @@ public class SimpleElementValue extends ElementValue case PRIMITIVE_BOOLEAN: ConstantInteger bo = (ConstantInteger) cpool.getConstant( getIndex(), Constants.CONSTANT_Integer); - if (bo.getBytes() == 0) - return "false"; - else - return "true"; + if (bo.getBytes() == 0) { + return "false"; + } else { + return "true"; + } case STRING: ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(getIndex(), Constants.CONSTANT_Utf8); diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 0fe5121a..79606fe2 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -348,8 +348,9 @@ public abstract class Utility { case Constants.INVOKEVIRTUAL: index = bytes.readUnsignedShort(); Constant c = constant_pool.getConstant(index); - if (c.getTag() != Constants.CONSTANT_Methodref && c.getTag() != Constants.CONSTANT_InterfaceMethodref) - throw new ClassFormatException("Expected class `CONSTANT_Methodref' or 'CONSTANT_InterfaceMethodref' at index " + index + " and got " +c); + if (c.getTag() != Constants.CONSTANT_Methodref && c.getTag() != Constants.CONSTANT_InterfaceMethodref) { + throw new ClassFormatException("Expected class `CONSTANT_Methodref' or 'CONSTANT_InterfaceMethodref' at index " + index + " and got " +c); + } buf.append("\t").append( constant_pool.constantToString(c)) .append((verbose ? " (" + index + ")" : "")); @@ -370,8 +371,9 @@ public abstract class Utility { buf.append("\t").append(".").append( constant_pool .constantToString(id.getNameAndTypeIndex(), Constants.CONSTANT_NameAndType)); - if (verbose) - buf.append(" (" + index + "/" + id.getNameAndTypeIndex() +")"); + if (verbose) { + buf.append(" (" + index + "/" + id.getNameAndTypeIndex() +")"); + } break; /* Operands are references to items in constant pool */ @@ -1398,7 +1400,9 @@ public abstract class Utility { */ public static Attribute[] getAnnotationAttributes(ConstantPoolGen cp,List vec) { - if (vec.isEmpty()) return new Attribute[0]; + if (vec.isEmpty()) { + return new Attribute[0]; + } try { int countVisible = 0; @@ -1406,10 +1410,11 @@ public abstract class Utility { // put the annotations in the right output stream for (AnnotationEntryGen a : vec) { - if (a.isRuntimeVisible()) - countVisible++; - else - countInvisible++; + if (a.isRuntimeVisible()) { + countVisible++; + } else { + countInvisible++; + } } ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); @@ -1422,10 +1427,11 @@ public abstract class Utility { // put the annotations in the right output stream for (AnnotationEntryGen a : vec) { - if (a.isRuntimeVisible()) - a.dump(rvaDos); - else - a.dump(riaDos); + if (a.isRuntimeVisible()) { + a.dump(rvaDos); + } else { + a.dump(riaDos); + } } rvaDos.close(); @@ -1437,8 +1443,12 @@ public abstract class Utility { int rvaIndex = -1; int riaIndex = -1; - if (rvaData.length>2) rvaIndex = cp.addUtf8("RuntimeVisibleAnnotations"); - if (riaData.length>2) riaIndex = cp.addUtf8("RuntimeInvisibleAnnotations"); + if (rvaData.length>2) { + rvaIndex = cp.addUtf8("RuntimeVisibleAnnotations"); + } + if (riaData.length>2) { + riaIndex = cp.addUtf8("RuntimeInvisibleAnnotations"); + } List newAttributes = new ArrayList(); if (rvaData.length>2) { @@ -1496,8 +1506,9 @@ public abstract class Utility { rvaDos.writeShort(visCount[i]); if (visCount[i] > 0) { for (AnnotationEntryGen element : vec[i]) { - if (element.isRuntimeVisible()) - element.dump(rvaDos); + if (element.isRuntimeVisible()) { + element.dump(rvaDos); + } } } } @@ -1510,8 +1521,9 @@ public abstract class Utility { riaDos.writeShort(invisCount[i]); if (invisCount[i] > 0) { for (AnnotationEntryGen element : vec[i]) { - if (!element.isRuntimeVisible()) - element.dump(riaDos); + if (!element.isRuntimeVisible()) { + element.dump(riaDos); + } } } } @@ -1520,10 +1532,12 @@ public abstract class Utility { byte[] riaData = riaBytes.toByteArray(); int rvaIndex = -1; int riaIndex = -1; - if (totalVisCount > 0) - rvaIndex = cp.addUtf8("RuntimeVisibleParameterAnnotations"); - if (totalInvisCount > 0) - riaIndex = cp.addUtf8("RuntimeInvisibleParameterAnnotations"); + if (totalVisCount > 0) { + rvaIndex = cp.addUtf8("RuntimeVisibleParameterAnnotations"); + } + if (totalInvisCount > 0) { + riaIndex = cp.addUtf8("RuntimeInvisibleParameterAnnotations"); + } List newAttributes = new ArrayList(); if (totalVisCount > 0) { newAttributes diff --git a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java index c94b50f5..aeee7351 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java @@ -37,9 +37,10 @@ public class AnnotationElementValueGen extends ElementValueGen ConstantPoolGen cpool) { super(type, cpool); - if (type != ANNOTATION) - throw new RuntimeException( + if (type != ANNOTATION) { + throw new RuntimeException( "Only element values of type annotation can be built with this ctor - type specified: " + type); + } this.a = annotation; } diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index bce75c84..b2df12a1 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -132,8 +132,9 @@ public class AnnotationEntryGen public void addElementNameValuePair(ElementValuePairGen evp) { - if (evs == null) - evs = new ArrayList(); + if (evs == null) { + evs = new ArrayList(); + } evs.add(evp); } @@ -172,8 +173,9 @@ public class AnnotationEntryGen for (int i = 0; i < evs.size(); i++) { s.append(evs.get(i)); - if (i + 1 < evs.size()) - s.append(","); + if (i + 1 < evs.size()) { + s.append(","); + } } s.append("}]"); return s.toString(); @@ -186,8 +188,9 @@ public class AnnotationEntryGen for (int i = 0; i < evs.size(); i++) { s.append(evs.get(i)); - if (i + 1 < evs.size()) - s.append(","); + if (i + 1 < evs.size()) { + s.append(","); + } } s.append(")"); return s.toString(); diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index 59bd753d..88467b6d 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -41,9 +41,10 @@ public class ArrayElementValueGen extends ElementValueGen ConstantPoolGen cpool) { super(type, cpool); - if (type != ARRAY) - throw new RuntimeException( + if (type != ARRAY) { + throw new RuntimeException( "Only element values of type array can be built with this ctor - type specified: " + type); + } this.evalues = new ArrayList(); for (ElementValue datum : datums) { evalues.add(ElementValueGen.copy(datum, cpool, true)); diff --git a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java index 64024631..737c3e43 100644 --- a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java @@ -39,9 +39,10 @@ public class EnumElementValueGen extends ElementValueGen ConstantPoolGen cpool) { super(ElementValueGen.ENUM_CONSTANT, cpool); - if (type != ENUM_CONSTANT) - throw new RuntimeException( + if (type != ENUM_CONSTANT) { + throw new RuntimeException( "Only element values of type enum can be built with this ctor - type specified: " + type); + } this.typeIdx = typeIdx; this.valueIdx = valueIdx; } diff --git a/src/main/java/org/apache/bcel/generic/GETFIELD.java b/src/main/java/org/apache/bcel/generic/GETFIELD.java index 0e37d658..0227e852 100644 --- a/src/main/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/main/java/org/apache/bcel/generic/GETFIELD.java @@ -80,8 +80,9 @@ public class GETFIELD extends FieldInstruction implements ExceptionThrower, Stac v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) + if (v instanceof VisitorSupportsInvokeDynamic) { ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); + } v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitGETFIELD(this); diff --git a/src/main/java/org/apache/bcel/generic/GETSTATIC.java b/src/main/java/org/apache/bcel/generic/GETSTATIC.java index 7ef252a3..bef1d972 100644 --- a/src/main/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/GETSTATIC.java @@ -78,8 +78,9 @@ public class GETSTATIC extends FieldInstruction implements PushInstruction, Exce v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) + if (v instanceof VisitorSupportsInvokeDynamic) { ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); + } v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitGETSTATIC(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java index 8212fe55..a398daae 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -133,8 +133,9 @@ public final class INVOKEINTERFACE extends InvokeInstruction { v.visitStackProducer(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) + if (v instanceof VisitorSupportsInvokeDynamic) { ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); + } v.visitFieldOrMethod(this); v.visitInvokeInstruction(this); v.visitINVOKEINTERFACE(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java index 2253bf36..56ebbcd7 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -75,8 +75,9 @@ public class INVOKESPECIAL extends InvokeInstruction { v.visitStackProducer(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) + if (v instanceof VisitorSupportsInvokeDynamic) { ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); + } v.visitFieldOrMethod(this); v.visitInvokeInstruction(this); v.visitINVOKESPECIAL(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java index 84e40bbe..d5183db5 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -72,8 +72,9 @@ public class INVOKESTATIC extends InvokeInstruction { v.visitStackProducer(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) + if (v instanceof VisitorSupportsInvokeDynamic) { ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); + } v.visitFieldOrMethod(this); v.visitInvokeInstruction(this); v.visitINVOKESTATIC(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java index 5cb86179..4d5b593e 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -75,8 +75,9 @@ public class INVOKEVIRTUAL extends InvokeInstruction { v.visitLoadClass(this); v.visitCPInstruction(this); v.visitFieldOrMethod(this); - if (v instanceof VisitorSupportsInvokeDynamic) + if (v instanceof VisitorSupportsInvokeDynamic) { ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); + } v.visitInvokeInstruction(this); v.visitINVOKEVIRTUAL(this); } diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index cd31e0b2..feead68a 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -1005,8 +1005,9 @@ public class InstructionList implements Serializable { public InstructionHandle next() throws NoSuchElementException { - if (ih == null) - throw new NoSuchElementException(); + if (ih == null) { + throw new NoSuchElementException(); + } InstructionHandle i = ih; ih = ih.next; return i; diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 4f2863db..690de4e8 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -612,7 +612,9 @@ public class MethodGen extends FieldGenOrMethodGen { } public void addParameterAnnotationsAsAttribute(ConstantPoolGen cp) { - if (!hasParameterAnnotations) return; + if (!hasParameterAnnotations) { + return; + } Attribute[] attrs = Utility.getParameterAnnotationAttributes(cp,param_annotations); if (attrs!=null) { for (Attribute attr : attrs) { @@ -1086,7 +1088,9 @@ public class MethodGen extends FieldGenOrMethodGen { */ public List getAnnotationsOnParameter(int i) { ensureExistingParameterAnnotationsUnpacked(); - if (!hasParameterAnnotations || i>arg_types.length) return null; + if (!hasParameterAnnotations || i>arg_types.length) { + return null; + } return param_annotations[i]; } @@ -1100,8 +1104,9 @@ public class MethodGen extends FieldGenOrMethodGen { */ private void ensureExistingParameterAnnotationsUnpacked() { - if (haveUnpackedParameterAnnotations) - return; + if (haveUnpackedParameterAnnotations) { + return; + } // Find attributes that contain parameter annotation data Attribute[] attrs = getAttributes(); ParameterAnnotations paramAnnVisAttr = null; @@ -1113,15 +1118,17 @@ public class MethodGen extends FieldGenOrMethodGen { if (!hasParameterAnnotations) { param_annotations = new List[arg_types.length]; - for (int j = 0; j < arg_types.length; j++) - param_annotations[j] = new ArrayList(); + for (int j = 0; j < arg_types.length; j++) { + param_annotations[j] = new ArrayList(); + } } hasParameterAnnotations = true; ParameterAnnotations rpa = (ParameterAnnotations) attribute; - if (rpa instanceof RuntimeVisibleParameterAnnotations) - paramAnnVisAttr = rpa; - else - paramAnnInvisAttr = rpa; + if (rpa instanceof RuntimeVisibleParameterAnnotations) { + paramAnnVisAttr = rpa; + } else { + paramAnnInvisAttr = rpa; + } for (int j = 0; j < arg_types.length; j++) { // This returns Annotation[] ... @@ -1134,10 +1141,12 @@ public class MethodGen extends FieldGenOrMethodGen { } } } - if (paramAnnVisAttr != null) - removeAttribute(paramAnnVisAttr); - if (paramAnnInvisAttr != null) - removeAttribute(paramAnnInvisAttr); + if (paramAnnVisAttr != null) { + removeAttribute(paramAnnVisAttr); + } + if (paramAnnInvisAttr != null) { + removeAttribute(paramAnnInvisAttr); + } haveUnpackedParameterAnnotations = true; } diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index 7a4e2d76..bd0534b9 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -40,7 +40,7 @@ public class ObjectType extends ReferenceType { private static HashMap cache; public synchronized static ObjectType getInstance(String class_name) { - if (cache == null) + if (cache == null) { cache = new LinkedHashMap(INITIAL_CACHE_CAPACITY, 0.75f, true) { @@ -49,8 +49,11 @@ public class ObjectType extends ReferenceType { } }; + } ObjectType result = cache.get(class_name); - if (result != null) return result; + if (result != null) { + return result; + } result = new ObjectType(class_name); cache.put(class_name, result); return result; diff --git a/src/main/java/org/apache/bcel/generic/PUTFIELD.java b/src/main/java/org/apache/bcel/generic/PUTFIELD.java index eb421925..018bc707 100644 --- a/src/main/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/main/java/org/apache/bcel/generic/PUTFIELD.java @@ -79,8 +79,9 @@ public class PUTFIELD extends FieldInstruction implements PopInstruction, Except v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) + if (v instanceof VisitorSupportsInvokeDynamic) { ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); + } v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitPUTFIELD(this); diff --git a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java index a7a08290..3e9461b3 100644 --- a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java @@ -78,8 +78,9 @@ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, Pop v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) + if (v instanceof VisitorSupportsInvokeDynamic) { ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); + } v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitPUTSTATIC(this); diff --git a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java index 8fd1ecef..3abb3d0a 100644 --- a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java @@ -91,10 +91,11 @@ public class SimpleElementValueGen extends ElementValueGen public SimpleElementValueGen(int type, ConstantPoolGen cpGen, boolean value) { super(type, cpGen); - if (value) - idx = cpGen.addInteger(1); - else - idx = cpGen.addInteger(0); + if (value) { + idx = cpGen.addInteger(1); + } else { + idx = cpGen.addInteger(0); + } } public SimpleElementValueGen(int type, ConstantPoolGen cpGen, String value) @@ -180,18 +181,20 @@ public class SimpleElementValueGen extends ElementValueGen public String getValueString() { - if (type != STRING) - throw new RuntimeException( + if (type != STRING) { + throw new RuntimeException( "Dont call getValueString() on a non STRING ElementValue"); + } ConstantUtf8 c = (ConstantUtf8) cpGen.getConstant(idx); return c.getBytes(); } public int getValueInt() { - if (type != PRIMITIVE_INT) - throw new RuntimeException( + if (type != PRIMITIVE_INT) { + throw new RuntimeException( "Dont call getValueString() on a non STRING ElementValue"); + } ConstantInteger c = (ConstantInteger) cpGen.getConstant(idx); return c.getBytes(); } @@ -225,10 +228,11 @@ public class SimpleElementValueGen extends ElementValueGen return Integer.toString(ch.getBytes()); case PRIMITIVE_BOOLEAN: ConstantInteger bo = (ConstantInteger) cpGen.getConstant(idx); - if (bo.getBytes() == 0) - return "false"; - else - return "true"; + if (bo.getBytes() == 0) { + return "false"; + } else { + return "true"; + } case STRING: ConstantUtf8 cu8 = (ConstantUtf8) cpGen.getConstant(idx); return cu8.getBytes(); diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 6a85d140..8097eea2 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -86,8 +86,9 @@ public class ClassPath implements Serializable { } } } catch (IOException e) { - if (path.endsWith(".zip") || path.endsWith(".jar")) + if (path.endsWith(".zip") || path.endsWith(".jar")) { System.err.println("CLASSPATH component " + file + ": " + e); + } } } } @@ -506,8 +507,9 @@ public class ClassPath implements Serializable { ClassFile getClassFile( String name, String suffix ) throws IOException { final ZipEntry entry = zip.getEntry(name.replace('.', '/') + suffix); - if (entry == null) - return null; + if (entry == null) { + return null; + } return new ClassFile() { diff --git a/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java index 1ceaa5ef..ca40e45a 100644 --- a/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java @@ -37,8 +37,9 @@ public abstract class AbstractCounterVisitorTestCase extends AbstractTestCase public CounterVisitor getVisitor() { - if (visitor == null) - visitor = new CounterVisitor(); + if (visitor == null) { + visitor = new CounterVisitor(); + } return visitor; } diff --git a/src/test/java/org/apache/bcel/AbstractTestCase.java b/src/test/java/org/apache/bcel/AbstractTestCase.java index 51696ed0..34d98eed 100644 --- a/src/test/java/org/apache/bcel/AbstractTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractTestCase.java @@ -93,10 +93,12 @@ public abstract class AbstractTestCase extends TestCase Attribute[] all = clazz.getAttributes(); List chosenAttrsList = new ArrayList(); for (Attribute element : all) { - if (verbose) - System.err.println("Attribute: " + element.getName()); - if (element.getName().equals(name)) - chosenAttrsList.add(element); + if (verbose) { + System.err.println("Attribute: " + element.getName()); + } + if (element.getName().equals(name)) { + chosenAttrsList.add(element); + } } return chosenAttrsList.toArray(new Attribute[] {}); } @@ -105,10 +107,12 @@ public abstract class AbstractTestCase extends TestCase { List chosenAttrsList = new ArrayList(); for (Attribute element : all) { - if (verbose) - System.err.println("Attribute: " + element.getName()); - if (element.getName().equals(name)) - chosenAttrsList.add(element); + if (verbose) { + System.err.println("Attribute: " + element.getName()); + } + if (element.getName().equals(name)) { + chosenAttrsList.add(element); + } } assertTrue("Should be one match: " + chosenAttrsList.size(), chosenAttrsList.size() == 1); @@ -123,8 +127,9 @@ public abstract class AbstractTestCase extends TestCase { Attribute attr = as[i]; result.append(attr.toString()); - if (i + 1 < as.length) - result.append(","); + if (i + 1 < as.length) { + result.append(","); + } } result.append("]"); return result.toString(); @@ -138,8 +143,9 @@ public abstract class AbstractTestCase extends TestCase { AnnotationEntry annotation = as[i]; result.append(annotation.toShortString()); - if (i + 1 < as.length) - result.append(","); + if (i + 1 < as.length) { + result.append(","); + } } result.append("]"); return result.toString(); @@ -153,8 +159,9 @@ public abstract class AbstractTestCase extends TestCase { AnnotationEntryGen annotation = as[i]; result.append(annotation.toShortString()); - if (i + 1 < as.length) - result.append(","); + if (i + 1 < as.length) { + result.append(","); + } } result.append("]"); return result.toString(); diff --git a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java b/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java index ef56b22f..9df8bd52 100644 --- a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java +++ b/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java @@ -72,35 +72,43 @@ public class FieldAnnotationsTestCase extends AbstractTestCase JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); ClassGen clg = new ClassGen(clazz); Field f = clg.getFields()[0]; - if (dbg) - System.err.println("Field in freshly constructed class is: " + f); - if (dbg) - System.err.println("AnnotationEntrys on field are: " + if (dbg) { + System.err.println("Field in freshly constructed class is: " + f); + } + if (dbg) { + System.err.println("AnnotationEntrys on field are: " + dumpAnnotationEntries(f.getAnnotationEntries())); + } AnnotationEntryGen fruitBasedAnnotationEntry = createFruitAnnotationEntry(clg .getConstantPool(), "Tomato", false); FieldGen fg = new FieldGen(f, clg.getConstantPool()); - if (dbg) - System.err.println("Adding AnnotationEntry to the field"); + if (dbg) { + System.err.println("Adding AnnotationEntry to the field"); + } fg.addAnnotationEntry(fruitBasedAnnotationEntry); - if (dbg) - System.err.println("FieldGen (mutable field) is " + fg); - if (dbg) - System.err.println("with AnnotationEntrys: " + if (dbg) { + System.err.println("FieldGen (mutable field) is " + fg); + } + if (dbg) { + System.err.println("with AnnotationEntrys: " + dumpAnnotationEntries(fg.getAnnotationEntries())); - if (dbg) - System.err + } + if (dbg) { + System.err .println("Replacing original field with new field that has extra AnnotationEntry"); + } clg.removeField(f); clg.addField(fg.getField()); f = clg.getFields()[1]; // there are two fields in the class, removing // and readding has changed the order // so this time index [1] is the 'int i' field - if (dbg) - System.err.println("Field now looks like this: " + f); - if (dbg) - System.err.println("With AnnotationEntrys: " + if (dbg) { + System.err.println("Field now looks like this: " + f); + } + if (dbg) { + System.err.println("With AnnotationEntrys: " + dumpAnnotationEntries(f.getAnnotationEntries())); + } assertTrue("Should be 2 AnnotationEntrys on this field, but there are " + f.getAnnotationEntries().length, f.getAnnotationEntries().length == 2); } diff --git a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java index 0ac43c57..0d3012f4 100644 --- a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java @@ -367,8 +367,9 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase if (element.getNameString().equals("dval")) { if (((SimpleElementValueGen) element.getValue()) - .stringifyValue().equals("33.4")) + .stringifyValue().equals("33.4")) { found = true; + } } } assertTrue("Did not find double annotation value with value 33.4", diff --git a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java index 35eb8427..ad24a78c 100644 --- a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java +++ b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java @@ -42,8 +42,9 @@ public class InstructionFinderTestCase extends AbstractTestCase } } - if (searchM == null) - throw new Exception("search method not found"); + if (searchM == null) { + throw new Exception("search method not found"); + } byte[] bytes = searchM.getCode().getCode(); InstructionList il = new InstructionList(bytes); -- GitLab From 56292561f3a891ae8af40702358bf6ad31fe1b52 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 31 Dec 2013 22:06:59 +0000 Subject: [PATCH 0579/1313] Add missing '@Override' annotations. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1554578 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ConstantUtf8.java | 2 ++ src/main/java/org/apache/bcel/generic/ObjectType.java | 1 + 2 files changed, 3 insertions(+) diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index 728bac61..912ff7fb 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -54,6 +54,7 @@ public final class ConstantUtf8 extends Constant { static { if (BCEL_STATISTICS) { Runtime.getRuntime().addShutdownHook(new Thread() { + @Override public void run() { System.err.println("Cache hit " + hits + "/" + considered +", " + skipped + " skipped"); @@ -71,6 +72,7 @@ public final class ConstantUtf8 extends Constant { considered++; if (cache == null) { cache = new LinkedHashMap(INITIAL_CACHE_CAPACITY, 0.75f, true) { + @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_CACHE_ENTRIES; } diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index bd0534b9..f887dcb6 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -44,6 +44,7 @@ public class ObjectType extends ReferenceType { cache = new LinkedHashMap(INITIAL_CACHE_CAPACITY, 0.75f, true) { + @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_CACHE_ENTRIES; } -- GitLab From 7bd6832819bb145e74edf82b3020de5f6b940a26 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 31 Dec 2013 22:07:43 +0000 Subject: [PATCH 0580/1313] Remove unused imports. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1554579 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java index 80fdbc12..891a7f2d 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java @@ -23,11 +23,9 @@ import java.util.StringTokenizer; import org.apache.bcel.Constants; import org.apache.bcel.ExceptionConstants; import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantCP; import org.apache.bcel.classfile.ConstantInvokeDynamic; import org.apache.bcel.classfile.ConstantNameAndType; import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantUtf8; import org.apache.bcel.util.ByteSequence; /** -- GitLab From c879b381454f0e7c2709fde15a94dced872e880f Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 31 Dec 2013 22:13:14 +0000 Subject: [PATCH 0581/1313] JUnit 4.10 -> 4.11. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1554581 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2a1a5989..59434f7f 100644 --- a/pom.xml +++ b/pom.xml @@ -258,7 +258,7 @@ junit junit - 4.10 + 4.11 test -- GitLab From 82d7e096b6cda64d31571ed40db295d8a48c3d9d Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 18 Feb 2014 16:53:35 +0000 Subject: [PATCH 0582/1313] Update to commons-parent 33. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1569425 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 59434f7f..eb270ce8 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ org.apache.commons commons-parent - 32 + 33 org.apache.bcel @@ -215,7 +215,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.9 + 2.9.1 -- GitLab From b5363c326831e775791a2011c7da2d86188497d8 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 1 Mar 2014 11:21:13 +0000 Subject: [PATCH 0583/1313] Configure site build to deploy to the correct location git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1573154 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index eb270ce8..267dc840 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,7 @@ bcel 6.0 (Java 5.0+) + https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-bcel org.apache.${commons.componentid} org.apache.bcel.*;version=${project.version};-noimport:=true -- GitLab From 9c5088cb66e46d66f017b0e9c4629107541cd201 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 18 Apr 2014 22:09:58 +0000 Subject: [PATCH 0584/1313] Added the BootstrapMethods attribute defined in the class format 51 (Java 7) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1588579 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 6 +- .../org/apache/bcel/classfile/Attribute.java | 2 + .../bcel/classfile/BootstrapMethod.java | 102 ++++++++++++++++++ .../bcel/classfile/BootstrapMethods.java | 93 ++++++++++++++++ .../bcel/classfile/DescendingVisitor.java | 7 ++ .../apache/bcel/classfile/EmptyVisitor.java | 4 + .../org/apache/bcel/classfile/Visitor.java | 2 + .../statics/StringRepresentation.java | 6 ++ .../apache/bcel/visitors/CounterVisitor.java | 14 ++- 9 files changed, 232 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/apache/bcel/classfile/BootstrapMethod.java create mode 100644 src/main/java/org/apache/bcel/classfile/BootstrapMethods.java diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index ecd59919..934f1ec9 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -1444,8 +1444,9 @@ public interface Constants { public static final byte ATTR_LOCAL_VARIABLE_TYPE_TABLE = 17; public static final byte ATTR_ENCLOSING_METHOD = 18; public static final byte ATTR_STACK_MAP_TABLE = 19; + public static final byte ATTR_BOOTSTRAP_METHODS = 20; - public static final short KNOWN_ATTRIBUTES = 20; + public static final short KNOWN_ATTRIBUTES = 21; // TOFO: FIXXXXX public static final String[] ATTRIBUTE_NAMES = { @@ -1455,7 +1456,8 @@ public interface Constants { "PMGClass", "Signature", "StackMap", "RuntimeVisibleAnnotations", "RuntimeInvisibleAnnotations", "RuntimeVisibleParameterAnnotations", "RuntimeInvisibleParameterAnnotations", - "AnnotationDefault", "LocalVariableTypeTable", "EnclosingMethod", "StackMapTable" + "AnnotationDefault", "LocalVariableTypeTable", "EnclosingMethod", "StackMapTable", + "BootstrapMethods" }; /** Constants used in the StackMap attribute. diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 9a03ea09..0e52c007 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -214,6 +214,8 @@ public abstract class Attribute implements Cloneable, Node, Serializable return new EnclosingMethod(name_index, length, file, constant_pool); case Constants.ATTR_STACK_MAP_TABLE: return new StackMapTable(name_index, length, file, constant_pool); + case Constants.ATTR_BOOTSTRAP_METHODS: + return new BootstrapMethods(name_index, length, file, constant_pool); default: // Never reached throw new IllegalStateException("Unrecognized attribute type tag parsed: " + tag); } diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java new file mode 100644 index 00000000..9c49cd28 --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java @@ -0,0 +1,102 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.Serializable; + +/** + * Entry of the bootstrap_methods table. + * + * @see The class File Format : The BootstrapMethods Attribute + * @since 6.0 + */ +public class BootstrapMethod implements Serializable, Cloneable { + + private static final long serialVersionUID = -4517534834047695344L; + + /** Index of the CONSTANT_MethodHandle_info structure in the constant_pool table */ + private int bootstrap_method_ref; + + /** Array of references to the constant_pool table */ + private int[] bootstrap_arguments; + + public BootstrapMethod() { + } + + /** + * Construct object from file stream. + * + * @param file Input stream + * @throws IOException + * @throws ClassFormatException + */ + BootstrapMethod(DataInputStream file) throws IOException, ClassFormatException { + bootstrap_method_ref = file.readUnsignedShort(); + + int num_bootstrap_methods = file.readUnsignedShort(); + + bootstrap_arguments = new int[num_bootstrap_methods]; + for (int i = 0; i < num_bootstrap_methods; i++) { + bootstrap_arguments[i] = file.readUnsignedShort(); + } + } + + public int getBootstrapMethodRef() { + return bootstrap_method_ref; + } + + public void setBootstrapMethodRef(int bootstrap_method_ref) { + this.bootstrap_method_ref = bootstrap_method_ref; + } + + public int[] getBootstrapArguments() { + return bootstrap_arguments; + } + + public void setBootstrapArguments(int[] bootstrap_arguments) { + this.bootstrap_arguments = bootstrap_arguments; + } + + /** + * Dump object to file stream on binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump(DataOutputStream file) throws IOException { + file.writeShort(bootstrap_method_ref); + file.writeShort(bootstrap_arguments.length); + for (int bootstrap_argument : bootstrap_arguments) { + file.writeShort(bootstrap_argument); + } + } + + /** + * @return deep copy of this object + */ + public BootstrapMethod copy() { + try { + return (BootstrapMethod) clone(); + } catch (CloneNotSupportedException e) { + } + return null; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java new file mode 100644 index 00000000..1a391137 --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * This class represents a BootstrapMethods attribute. + * + * @see The class File Format : The BootstrapMethods Attribute + * @since 6.0 + */ +public class BootstrapMethods extends Attribute { + + private static final long serialVersionUID = -2169230245012340809L; + + private BootstrapMethod[] bootstrap_methods; + + public BootstrapMethods(int name_index, int length, BootstrapMethod[] bootstrap_methods, ConstantPool constant_pool) { + super(Constants.ATTR_BOOTSTRAP_METHODS, name_index, length, constant_pool); + this.bootstrap_methods = bootstrap_methods; + } + + BootstrapMethods(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException { + this(name_index, length, (BootstrapMethod[]) null, constant_pool); + + int num_bootstrap_methods = file.readUnsignedShort(); + bootstrap_methods = new BootstrapMethod[num_bootstrap_methods]; + for (int i = 0; i < num_bootstrap_methods; i++) { + bootstrap_methods[i] = new BootstrapMethod(file); + } + } + + public final BootstrapMethod[] getBootstrapMethods() { + return bootstrap_methods; + } + + public final void setBootstrapMethods(BootstrapMethod[] bootstrap_methods) { + this.bootstrap_methods = bootstrap_methods; + } + + @Override + public void accept(Visitor v) { + v.visitBootstrapMethods(this); + } + + @Override + public BootstrapMethods copy(ConstantPool _constant_pool) { + BootstrapMethods c = (BootstrapMethods) clone(); + c.bootstrap_methods = new BootstrapMethod[bootstrap_methods.length]; + + for (int i = 0; i < bootstrap_methods.length; i++) { + c.bootstrap_methods[i] = bootstrap_methods[i].copy(); + } + c.constant_pool = _constant_pool; + return c; + } + + /** + * Dump bootstrap methods attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + @Override + public final void dump(DataOutputStream file) throws IOException { + super.dump(file); + + file.writeShort(bootstrap_methods.length); + for (BootstrapMethod bootstrap_method : bootstrap_methods) { + bootstrap_method.dump(file); + } + } +} diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index 43632d14..73716654 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -430,4 +430,11 @@ public class DescendingVisitor implements Visitor obj.accept(visitor); stack.pop(); } + + public void visitBootstrapMethods(BootstrapMethods obj) + { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } } diff --git a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java index bf77c694..f50f3587 100644 --- a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -189,4 +189,8 @@ public class EmptyVisitor implements Visitor public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) { } + + public void visitBootstrapMethods(BootstrapMethods obj) + { + } } diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java index 7374d40b..eba73dbd 100644 --- a/src/main/java/org/apache/bcel/classfile/Visitor.java +++ b/src/main/java/org/apache/bcel/classfile/Visitor.java @@ -106,4 +106,6 @@ public interface Visitor void visitLocalVariableTypeTable(LocalVariableTypeTable obj); void visitEnclosingMethod(EnclosingMethod obj); + + void visitBootstrapMethods(BootstrapMethods obj); } diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 2e31c3ee..c1be6a2e 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -19,6 +19,7 @@ package org.apache.bcel.verifier.statics; import org.apache.bcel.classfile.Annotations; +import org.apache.bcel.classfile.BootstrapMethods; import org.apache.bcel.classfile.Code; import org.apache.bcel.classfile.CodeException; import org.apache.bcel.classfile.ConstantClass; @@ -296,4 +297,9 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor public void visitUnknown(Unknown obj) { tostring = toString(obj); } + + @Override + public void visitBootstrapMethods(BootstrapMethods obj) { + tostring = toString(obj); + } } diff --git a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java index f2ec4b59..49b66c37 100644 --- a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java +++ b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java @@ -21,6 +21,7 @@ package org.apache.bcel.visitors; import org.apache.bcel.classfile.AnnotationDefault; import org.apache.bcel.classfile.AnnotationEntry; import org.apache.bcel.classfile.Annotations; +import org.apache.bcel.classfile.BootstrapMethods; import org.apache.bcel.classfile.Code; import org.apache.bcel.classfile.CodeException; import org.apache.bcel.classfile.ConstantClass; @@ -141,6 +142,8 @@ public class CounterVisitor implements Visitor public int stackMapTableCount = 0; public int stackMapTableEntryCount = 0; + + public int bootstrapMethodsCount = 0; public void visitAnnotation(Annotations obj) @@ -333,11 +336,18 @@ public class CounterVisitor implements Visitor unknownCount++; } - public void visitStackMapTable(StackMapTable obj) { + public void visitStackMapTable(StackMapTable obj) + { stackMapTableCount++; } - public void visitStackMapTableEntry(StackMapTableEntry obj) { + public void visitStackMapTableEntry(StackMapTableEntry obj) + { stackMapTableEntryCount++; } + + public void visitBootstrapMethods(BootstrapMethods obj) + { + bootstrapMethodsCount++; + } } -- GitLab From 614df47828daee5fce9465087e63db3639daa851 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 18 Apr 2014 22:15:34 +0000 Subject: [PATCH 0585/1313] Ignore the IntelliJ project files git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1588581 13f79535-47bb-0310-9956-ffa450edef68 -- GitLab From 72a0592b11226c0c0b3927505a03687b85329078 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Sat, 19 Apr 2014 12:42:57 +0000 Subject: [PATCH 0586/1313] Renamed ATTR_RUNTIMEIN_VISIBLE_* to ATTR_RUNTIME_INVISIBLE_* git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1588650 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 4 ++-- src/main/java/org/apache/bcel/classfile/Attribute.java | 4 ++-- .../apache/bcel/classfile/RuntimeInvisibleAnnotations.java | 2 +- .../bcel/classfile/RuntimeInvisibleParameterAnnotations.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 934f1ec9..e14a6cb9 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -1437,9 +1437,9 @@ public interface Constants { public static final byte ATTR_SIGNATURE = 10; public static final byte ATTR_STACK_MAP = 11; public static final byte ATTR_RUNTIME_VISIBLE_ANNOTATIONS = 12; - public static final byte ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS = 13; + public static final byte ATTR_RUNTIME_INVISIBLE_ANNOTATIONS = 13; public static final byte ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS = 14; - public static final byte ATTR_RUNTIMEIN_VISIBLE_PARAMETER_ANNOTATIONS = 15; + public static final byte ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS = 15; public static final byte ATTR_ANNOTATION_DEFAULT = 16; public static final byte ATTR_LOCAL_VARIABLE_TYPE_TABLE = 17; public static final byte ATTR_ENCLOSING_METHOD = 18; diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 0e52c007..6e33c1bd 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -195,13 +195,13 @@ public abstract class Attribute implements Cloneable, Node, Serializable case Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS: return new RuntimeVisibleAnnotations(name_index, length, file, constant_pool); - case Constants.ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS: + case Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS: return new RuntimeInvisibleAnnotations(name_index, length, file, constant_pool); case Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS: return new RuntimeVisibleParameterAnnotations(name_index, length, file, constant_pool); - case Constants.ATTR_RUNTIMEIN_VISIBLE_PARAMETER_ANNOTATIONS: + case Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS: return new RuntimeInvisibleParameterAnnotations(name_index, length, file, constant_pool); case Constants.ATTR_ANNOTATION_DEFAULT: diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 86b21816..283d88a9 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -48,7 +48,7 @@ public class RuntimeInvisibleAnnotations extends Annotations DataInputStream file, ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIMEIN_VISIBLE_ANNOTATIONS, name_index, length, + super(Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS, name_index, length, file, constant_pool, false); } diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index a684c583..74dee7db 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -42,7 +42,7 @@ public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { */ RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIMEIN_VISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, + super(Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, constant_pool); } -- GitLab From fa9a90ca68c706a27da33eaf4eb06a562b354d21 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 23 Apr 2014 11:10:29 +0000 Subject: [PATCH 0587/1313] Fixed the validation error message when a non abstract method is found in an interface (BCEL-174) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589371 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/verifier/statics/Pass2Verifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index b262c7b4..0abfba73 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -689,7 +689,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); } if (!obj.isAbstract()){ - throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_STATIC modifier set but hasn't!"); + throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_ABSTRACT modifier set but hasn't!"); } if ( obj.isPrivate() || obj.isProtected() || -- GitLab From 1ded664fcd59030169adad27b6027c11ba4791dc Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 23 Apr 2014 11:30:18 +0000 Subject: [PATCH 0588/1313] Added javadoc links to the constants defined in VerificationResult git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589374 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/VerificationResult.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/VerificationResult.java b/src/main/java/org/apache/bcel/verifier/VerificationResult.java index 37c33dd1..112f78e6 100644 --- a/src/main/java/org/apache/bcel/verifier/VerificationResult.java +++ b/src/main/java/org/apache/bcel/verifier/VerificationResult.java @@ -23,7 +23,6 @@ package org.apache.bcel.verifier; * * @version $Id$ * @author Enver Haase - * */ public class VerificationResult { @@ -32,28 +31,34 @@ public class VerificationResult { * This happens if some earlier verification pass did not return VERIFIED_OK. */ public static final int VERIFIED_NOTYET = 0; + /** Constant to indicate verification was passed. */ public static final int VERIFIED_OK = 1; + /** Constant to indicate verfication failed. */ public static final int VERIFIED_REJECTED = 2; + /** * This string is the canonical message for verifications that have not been tried yet. - * This happens if some earlier verification pass did not return VERIFIED_OK. + * This happens if some earlier verification pass did not return {@link #VERIFIED_OK}. */ private static final String VERIFIED_NOTYET_MSG = "Not yet verified."; + /** This string is the canonical message for passed verification passes. */ private static final String VERIFIED_OK_MSG = "Passed verification."; + /** * Canonical VerificationResult for not-yet-tried verifications. - * This happens if some earlier verification pass did not return VERIFIED_OK. + * This happens if some earlier verification pass did not return {@link #VERIFIED_OK}. */ - public static final VerificationResult VR_NOTYET = new VerificationResult(VERIFIED_NOTYET, - VERIFIED_NOTYET_MSG); + public static final VerificationResult VR_NOTYET = new VerificationResult(VERIFIED_NOTYET, VERIFIED_NOTYET_MSG); + /** Canonical VerificationResult for passed verifications. */ - public static final VerificationResult VR_OK = new VerificationResult(VERIFIED_OK, - VERIFIED_OK_MSG); + public static final VerificationResult VR_OK = new VerificationResult(VERIFIED_OK, VERIFIED_OK_MSG); + /** The numeric status. */ private int numeric; + /** The detailed message. */ private String detailMessage; @@ -65,7 +70,10 @@ public class VerificationResult { } - /** Returns one one the VERIFIED_OK, VERIFIED_NOTYET, VERIFIED_REJECTED constants. */ + /** + * Returns one one the {@link #VERIFIED_OK}, {@link #VERIFIED_NOTYET}, + * {@link #VERIFIED_REJECTED} constants. + */ public int getStatus() { return numeric; } @@ -77,7 +85,8 @@ public class VerificationResult { } - /** @return a hash code value for the object. + /** + * @return a hash code value for the object. */ @Override public int hashCode() { -- GitLab From c39472e60da1918148db84711b7fb32b62841c7d Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 23 Apr 2014 11:53:32 +0000 Subject: [PATCH 0589/1313] Removed the final modifier from the private methods git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589377 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/JasminVisitor.java | 6 ++-- src/examples/Mini/ASCII_CharStream.java | 6 ++-- src/examples/Mini/Environment.java | 2 +- src/examples/Mini/MiniParserTokenManager.java | 34 +++++++++---------- .../apache/bcel/classfile/AccessFlags.java | 2 +- .../apache/bcel/classfile/ClassParser.java | 16 ++++----- .../java/org/apache/bcel/classfile/Code.java | 4 +-- .../org/apache/bcel/classfile/JavaClass.java | 2 +- .../java/org/apache/bcel/generic/IINC.java | 2 +- .../generic/LocalVariableInstruction.java | 2 +- .../org/apache/bcel/generic/MethodGen.java | 4 +-- .../java/org/apache/bcel/generic/RET.java | 2 +- .../java/org/apache/bcel/generic/SWITCH.java | 6 ++-- .../org/apache/bcel/util/AttributeHTML.java | 2 +- .../java/org/apache/bcel/util/CodeHTML.java | 4 +-- .../org/apache/bcel/util/ConstantHTML.java | 2 +- .../java/org/apache/bcel/util/MethodHTML.java | 2 +- 17 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/examples/JasminVisitor.java b/src/examples/JasminVisitor.java index be4ef676..244d71fc 100644 --- a/src/examples/JasminVisitor.java +++ b/src/examples/JasminVisitor.java @@ -119,7 +119,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { * for every of the method's attributes if it's the last one and print ".end method" * then. */ - private final void printEndMethod(Attribute attr) { + private void printEndMethod(Attribute attr) { Attribute[] attributes = _method.getAttributes(); if(attr == attributes[attributes.length - 1]) { @@ -292,12 +292,12 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { printEndMethod(code); } - private final String get(InstructionHandle ih) { + private String get(InstructionHandle ih) { String str = new StringTokenizer(map.get(ih), "\n").nextToken(); return str.substring(0, str.length() - 1); } - private final void put(InstructionHandle ih, String line) { + private void put(InstructionHandle ih, String line) { String str = map.get(ih); if(str == null) { diff --git a/src/examples/Mini/ASCII_CharStream.java b/src/examples/Mini/ASCII_CharStream.java index 11fc557b..c7e3d455 100644 --- a/src/examples/Mini/ASCII_CharStream.java +++ b/src/examples/Mini/ASCII_CharStream.java @@ -45,7 +45,7 @@ public final class ASCII_CharStream static private int maxNextCharInd = 0; static private int inBuf = 0; - static private final void ExpandBuff(boolean wrapAround) + static private void ExpandBuff(boolean wrapAround) { char[] newbuffer = new char[bufsize + 2048]; int newbufline[] = new int[bufsize + 2048]; @@ -95,7 +95,7 @@ public final class ASCII_CharStream tokenBegin = 0; } - static private final void FillBuff() throws java.io.IOException + static private void FillBuff() throws java.io.IOException { if (maxNextCharInd == available) { @@ -152,7 +152,7 @@ public final class ASCII_CharStream return c; } - static private final void UpdateLineColumn(char c) + static private void UpdateLineColumn(char c) { column++; diff --git a/src/examples/Mini/Environment.java b/src/examples/Mini/Environment.java index dbd174f3..6eee111b 100644 --- a/src/examples/Mini/Environment.java +++ b/src/examples/Mini/Environment.java @@ -54,7 +54,7 @@ public class Environment implements Cloneable { this(SIZE); } - private final int hashCode(String key) { + private int hashCode(String key) { return Math.abs(key.hashCode()) % size; } diff --git a/src/examples/Mini/MiniParserTokenManager.java b/src/examples/Mini/MiniParserTokenManager.java index 517e7db5..d5fbe75d 100644 --- a/src/examples/Mini/MiniParserTokenManager.java +++ b/src/examples/Mini/MiniParserTokenManager.java @@ -20,11 +20,11 @@ package Mini; public class MiniParserTokenManager implements MiniParserConstants { -static private final int jjMoveStringLiteralDfa0_1() +static private int jjMoveStringLiteralDfa0_1() { return jjMoveNfa_1(0, 0); } -static private final void jjCheckNAdd(int state) +static private void jjCheckNAdd(int state) { if (jjrounds[state] != jjround) { @@ -32,29 +32,29 @@ static private final void jjCheckNAdd(int state) jjrounds[state] = jjround; } } -static private final void jjAddStates(int start, int end) +static private void jjAddStates(int start, int end) { do { jjstateSet[jjnewStateCnt++] = jjnextStates[start]; } while (start++ != end); } -static private final void jjCheckNAddTwoStates(int state1, int state2) +static private void jjCheckNAddTwoStates(int state1, int state2) { jjCheckNAdd(state1); jjCheckNAdd(state2); } -//static private final void jjCheckNAddStates(int start, int end) +//static private void jjCheckNAddStates(int start, int end) //{ // do { // jjCheckNAdd(jjnextStates[start]); // } while (start++ != end); //} -//static private final void jjCheckNAddStates(int start) +//static private void jjCheckNAddStates(int start) //{ // jjCheckNAdd(jjnextStates[start]); // jjCheckNAdd(jjnextStates[start + 1]); //} -static private final int jjMoveNfa_1(int startState, int curPos) +static private int jjMoveNfa_1(int startState, int curPos) { int startsAt = 0; jjnewStateCnt = 3; @@ -184,13 +184,13 @@ private static final int jjStartNfa_0(int pos, long active0) { return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1); } -static private final int jjStopAtPos(int pos, int kind) +static private int jjStopAtPos(int pos, int kind) { jjmatchedKind = kind; jjmatchedPos = pos; return pos + 1; } -static private final int jjStartNfaWithStates_0(int pos, int kind, int state) +static private int jjStartNfaWithStates_0(int pos, int kind, int state) { jjmatchedKind = kind; jjmatchedPos = pos; @@ -198,7 +198,7 @@ static private final int jjStartNfaWithStates_0(int pos, int kind, int state) catch(java.io.IOException e) { return pos + 1; } return jjMoveNfa_0(state, pos + 1); } -static private final int jjMoveStringLiteralDfa0_0() +static private int jjMoveStringLiteralDfa0_0() { switch(curChar) { @@ -253,7 +253,7 @@ static private final int jjMoveStringLiteralDfa0_0() return jjMoveNfa_0(0, 0); } } -static private final int jjMoveStringLiteralDfa1_0(long active0) +static private int jjMoveStringLiteralDfa1_0(long active0) { try { curChar = ASCII_CharStream.readChar(); } catch(java.io.IOException e) { @@ -313,7 +313,7 @@ static private final int jjMoveStringLiteralDfa1_0(long active0) } return jjStartNfa_0(0, active0); } -static private final int jjMoveStringLiteralDfa2_0(long old0, long active0) +static private int jjMoveStringLiteralDfa2_0(long old0, long active0) { if (((active0 &= old0)) == 0L) { return jjStartNfa_0(0, old0); @@ -357,7 +357,7 @@ static private final int jjMoveStringLiteralDfa2_0(long old0, long active0) } return jjStartNfa_0(1, active0); } -static private final int jjMoveStringLiteralDfa3_0(long old0, long active0) +static private int jjMoveStringLiteralDfa3_0(long old0, long active0) { if (((active0 &= old0)) == 0L) { return jjStartNfa_0(1, old0); @@ -395,7 +395,7 @@ static private final int jjMoveStringLiteralDfa3_0(long old0, long active0) } return jjStartNfa_0(2, active0); } -static private final int jjMoveStringLiteralDfa4_0(long old0, long active0) +static private int jjMoveStringLiteralDfa4_0(long old0, long active0) { if (((active0 &= old0)) == 0L) { return jjStartNfa_0(2, old0); @@ -422,7 +422,7 @@ static private final int jjMoveStringLiteralDfa4_0(long old0, long active0) static final long[] jjbitVec0 = { 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL }; -static private final int jjMoveNfa_0(int startState, int curPos) +static private int jjMoveNfa_0(int startState, int curPos) { int startsAt = 0; jjnewStateCnt = 6; @@ -609,7 +609,7 @@ static public void ReInit(ASCII_CharStream stream) input_stream = stream; ReInitRounds(); } -static private final void ReInitRounds() +static private void ReInitRounds() { int i; jjround = 0x80000001; @@ -631,7 +631,7 @@ static public void SwitchTo(int lexState) } } -static private final Token jjFillToken() +static private Token jjFillToken() { Token t = Token.newToken(jjmatchedKind); t.kind = jjmatchedKind; diff --git a/src/main/java/org/apache/bcel/classfile/AccessFlags.java b/src/main/java/org/apache/bcel/classfile/AccessFlags.java index d7f52dea..51664ab2 100644 --- a/src/main/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/main/java/org/apache/bcel/classfile/AccessFlags.java @@ -76,7 +76,7 @@ public abstract class AccessFlags implements java.io.Serializable { } - private final void setFlag( int flag, boolean set ) { + private void setFlag( int flag, boolean set ) { if ((access_flags & flag) != 0) { // Flag is set already if (!set) { access_flags ^= flag; diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index d79f213c..339bce0f 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -194,7 +194,7 @@ public final class ClassParser { * @throws IOException * @throws ClassFormatException */ - private final void readAttributes() throws IOException, ClassFormatException { + private void readAttributes() throws IOException, ClassFormatException { int attributes_count; attributes_count = file.readUnsignedShort(); attributes = new Attribute[attributes_count]; @@ -209,7 +209,7 @@ public final class ClassParser { * @throws IOException * @throws ClassFormatException */ - private final void readClassInfo() throws IOException, ClassFormatException { + private void readClassInfo() throws IOException, ClassFormatException { access_flags = file.readUnsignedShort(); /* Interfaces are implicitely abstract, the flag should be set * according to the JVM specification. @@ -231,7 +231,7 @@ public final class ClassParser { * @throws IOException * @throws ClassFormatException */ - private final void readConstantPool() throws IOException, ClassFormatException { + private void readConstantPool() throws IOException, ClassFormatException { constant_pool = new ConstantPool(file); } @@ -241,7 +241,7 @@ public final class ClassParser { * @throws IOException * @throws ClassFormatException */ - private final void readFields() throws IOException, ClassFormatException { + private void readFields() throws IOException, ClassFormatException { int fields_count; fields_count = file.readUnsignedShort(); fields = new Field[fields_count]; @@ -258,7 +258,7 @@ public final class ClassParser { * @throws IOException * @throws ClassFormatException */ - private final void readID() throws IOException, ClassFormatException { + private void readID() throws IOException, ClassFormatException { int magic = 0xCAFEBABE; if (file.readInt() != magic) { throw new ClassFormatException(file_name + " is not a Java .class file"); @@ -271,7 +271,7 @@ public final class ClassParser { * @throws IOException * @throws ClassFormatException */ - private final void readInterfaces() throws IOException, ClassFormatException { + private void readInterfaces() throws IOException, ClassFormatException { int interfaces_count; interfaces_count = file.readUnsignedShort(); interfaces = new int[interfaces_count]; @@ -286,7 +286,7 @@ public final class ClassParser { * @throws IOException * @throws ClassFormatException */ - private final void readMethods() throws IOException, ClassFormatException { + private void readMethods() throws IOException, ClassFormatException { int methods_count; methods_count = file.readUnsignedShort(); methods = new Method[methods_count]; @@ -301,7 +301,7 @@ public final class ClassParser { * @throws IOException * @throws ClassFormatException */ - private final void readVersion() throws IOException, ClassFormatException { + private void readVersion() throws IOException, ClassFormatException { minor = file.readUnsignedShort(); major = file.readUnsignedShort(); } diff --git a/src/main/java/org/apache/bcel/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java index 0fe5b351..075ab9ec 100644 --- a/src/main/java/org/apache/bcel/classfile/Code.java +++ b/src/main/java/org/apache/bcel/classfile/Code.java @@ -232,7 +232,7 @@ public final class Code extends Attribute { * @return the internal length of this code attribute (minus the first 6 bytes) * and excluding all its attributes */ - private final int getInternalLength() { + private int getInternalLength() { return 2 /*max_stack*/+ 2 /*max_locals*/+ 4 /*code length*/ + code_length /*byte-code*/ + 2 /*exception-table length*/ @@ -245,7 +245,7 @@ public final class Code extends Attribute { * @return the full size of this code attribute, minus its first 6 bytes, * including the size of all its contained attributes */ - private final int calculateLength() { + private int calculateLength() { int len = 0; for (int i = 0; i < attributes_count; i++) { len += attributes[i].length + 6 /*attribute header size*/; diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index b377a795..efa9a4bc 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -727,7 +727,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl return this.isNested; } - private final void computeNestedTypeStatus() { + private void computeNestedTypeStatus() { if (computedNestedTypeStatus) { return; } diff --git a/src/main/java/org/apache/bcel/generic/IINC.java b/src/main/java/org/apache/bcel/generic/IINC.java index e0c5909f..9cf084f1 100644 --- a/src/main/java/org/apache/bcel/generic/IINC.java +++ b/src/main/java/org/apache/bcel/generic/IINC.java @@ -75,7 +75,7 @@ public class IINC extends LocalVariableInstruction { } - private final void setWide() { + private void setWide() { wide = (n > org.apache.bcel.Constants.MAX_BYTE) || (Math.abs(c) > Byte.MAX_VALUE); if (wide) { length = 6; // wide byte included diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java index 2c675cda..f1b1edba 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -37,7 +37,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty private short canon_tag = -1; // canonical tag such as ILOAD - private final boolean wide() { + private boolean wide() { return n > Constants.MAX_BYTE; } diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 690de4e8..3382204f 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -917,14 +917,14 @@ public class MethodGen extends FieldGenOrMethodGen { } - private final BranchTarget visit( InstructionHandle target, int stackDepth ) { + private BranchTarget visit( InstructionHandle target, int stackDepth ) { BranchTarget bt = new BranchTarget(target, stackDepth); visitedTargets.put(target, bt); return bt; } - private final boolean visited( InstructionHandle target ) { + private boolean visited( InstructionHandle target ) { return (visitedTargets.get(target) != null); } } diff --git a/src/main/java/org/apache/bcel/generic/RET.java b/src/main/java/org/apache/bcel/generic/RET.java index 976e6cbd..5430078d 100644 --- a/src/main/java/org/apache/bcel/generic/RET.java +++ b/src/main/java/org/apache/bcel/generic/RET.java @@ -68,7 +68,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc } - private final void setWide() { + private void setWide() { wide = index > org.apache.bcel.Constants.MAX_BYTE; if (wide) { length = 4; // Including the wide byte diff --git a/src/main/java/org/apache/bcel/generic/SWITCH.java b/src/main/java/org/apache/bcel/generic/SWITCH.java index e2e56abe..d978ef0c 100644 --- a/src/main/java/org/apache/bcel/generic/SWITCH.java +++ b/src/main/java/org/apache/bcel/generic/SWITCH.java @@ -70,7 +70,7 @@ public final class SWITCH implements CompoundInstruction { } - private final void fillup( int max_gap, InstructionHandle target ) { + private void fillup( int max_gap, InstructionHandle target ) { int max_size = match_length + match_length * max_gap; int[] m_vec = new int[max_size]; InstructionHandle[] t_vec = new InstructionHandle[max_size]; @@ -99,7 +99,7 @@ public final class SWITCH implements CompoundInstruction { /** * Sort match and targets array with QuickSort. */ - private final void sort( int l, int r ) { + private void sort( int l, int r ) { int i = l, j = r; int h, m = match[(l + r) / 2]; InstructionHandle h2; @@ -133,7 +133,7 @@ public final class SWITCH implements CompoundInstruction { /** * @return match is sorted in ascending order with no gap bigger than max_gap? */ - private final boolean matchIsOrdered( int max_gap ) { + private boolean matchIsOrdered( int max_gap ) { for (int i = 1; i < match_length; i++) { if (match[i] - match[i - 1] > max_gap) { return false; diff --git a/src/main/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java index 4282811d..aa37ba83 100644 --- a/src/main/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/main/java/org/apache/bcel/util/AttributeHTML.java @@ -62,7 +62,7 @@ final class AttributeHTML implements org.apache.bcel.Constants { } - private final String codeLink( int link, int method_number ) { + private String codeLink( int link, int method_number ) { return "" + link + ""; } diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 3a56b541..22acd516 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -75,7 +75,7 @@ final class CodeHTML implements org.apache.bcel.Constants { * @param stream data input stream * @return String representation of byte code */ - private final String codeToHTML( ByteSequence bytes, int method_number ) throws IOException { + private String codeToHTML( ByteSequence bytes, int method_number ) throws IOException { short opcode = (short) bytes.readUnsignedByte(); StringBuilder buf; String name, signature; @@ -365,7 +365,7 @@ final class CodeHTML implements org.apache.bcel.Constants { * Find all target addresses in code, so that they can be marked * with <A NAME = ...>. Target addresses are kept in an BitSet object. */ - private final void findGotos( ByteSequence bytes, Code code ) throws IOException { + private void findGotos( ByteSequence bytes, Code code ) throws IOException { int index; goto_set = new BitSet(bytes.available()); int opcode; diff --git a/src/main/java/org/apache/bcel/util/ConstantHTML.java b/src/main/java/org/apache/bcel/util/ConstantHTML.java index c1136727..58b97d36 100644 --- a/src/main/java/org/apache/bcel/util/ConstantHTML.java +++ b/src/main/java/org/apache/bcel/util/ConstantHTML.java @@ -222,7 +222,7 @@ final class ConstantHTML implements org.apache.bcel.Constants { } - private final int getMethodNumber( String str ) { + private int getMethodNumber( String str ) { for (int i = 0; i < methods.length; i++) { String cmp = methods[i].getName() + methods[i].getSignature(); if (cmp.equals(str)) { diff --git a/src/main/java/org/apache/bcel/util/MethodHTML.java b/src/main/java/org/apache/bcel/util/MethodHTML.java index 64e6a927..6eed13a6 100644 --- a/src/main/java/org/apache/bcel/util/MethodHTML.java +++ b/src/main/java/org/apache/bcel/util/MethodHTML.java @@ -100,7 +100,7 @@ final class MethodHTML implements org.apache.bcel.Constants { } - private final void writeMethod( Method method, int method_number ) { + private void writeMethod( Method method, int method_number ) { // Get raw signature String signature = method.getSignature(); // Get array of strings containing the argument types -- GitLab From cd745f71268f8e332d0a11dcaa3b43b7258e4a23 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 23 Apr 2014 12:14:23 +0000 Subject: [PATCH 0590/1313] Foreach loops git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589380 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AnnotationEntry.java | 3 +- .../bcel/generic/AnnotationEntryGen.java | 18 +-- .../org/apache/bcel/generic/ClassGen.java | 8 +- .../org/apache/bcel/generic/MethodGen.java | 4 +- .../org/apache/bcel/util/AttributeHTML.java | 10 +- .../java/org/apache/bcel/util/CodeHTML.java | 8 +- .../verifier/VerifierFactoryListModel.java | 11 +- .../bcel/verifier/statics/Pass2Verifier.java | 143 +++++++++--------- .../bcel/verifier/statics/Pass3aVerifier.java | 62 ++++---- .../structurals/InstConstraintVisitor.java | 30 ++-- 10 files changed, 145 insertions(+), 152 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index bc1cb243..79beb918 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -126,8 +126,7 @@ public class AnnotationEntry implements Node, Constants, Serializable { dos.writeShort(type_index); // u2 index of type name in cpool dos.writeShort(element_value_pairs.size()); // u2 element_value pair // count - for (int i = 0; i < element_value_pairs.size(); i++) { - final ElementValuePair envp = element_value_pairs.get(i); + for (final ElementValuePair envp : element_value_pairs) { envp.dump(dos); } } diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index b2df12a1..b7a24abd 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -67,11 +67,10 @@ public class AnnotationEntryGen { List out = new ArrayList(); int l = in.length; - for (int i = 0; i < l; i++) - { - ElementValuePair nvp = in[i]; - out.add(new ElementValuePairGen(nvp, cpool, copyPoolEntries)); - } + for (ElementValuePair nvp : in) + { + out.add(new ElementValuePairGen(nvp, cpool, copyPoolEntries)); + } return out; } @@ -123,11 +122,10 @@ public class AnnotationEntryGen { dos.writeShort(typeIndex); // u2 index of type name in cpool dos.writeShort(evs.size()); // u2 element_value pair count - for (int i = 0; i < evs.size(); i++) - { - ElementValuePairGen envp = evs.get(i); - envp.dump(dos); - } + for (ElementValuePairGen envp : evs) + { + envp.dump(dos); + } } public void addElementNameValuePair(ElementValuePairGen evp) diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 9909a365..c92bb1e1 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -144,10 +144,10 @@ public class ClassGen extends AccessFlags implements Cloneable { for (String interface1 : interfaces) { addInterface(interface1); } - for (int i = 0; i < attributes.length; i++) { - if (!(attributes[i] instanceof Annotations)) { - addAttribute(attributes[i]); - } + for (Attribute attribute : attributes) { + if (!(attribute instanceof Annotations)) { + addAttribute(attribute); + } } for (AnnotationEntryGen annotation : annotations) { addAnnotationEntry(annotation); diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 3382204f..9977eaba 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -142,8 +142,8 @@ public class MethodGen extends FieldGenOrMethodGen { } if (arg_types != null) { int size = arg_types.length; - for (int i = 0; i < size; i++) { - if (Type.VOID == arg_types[i]) { + for (Type arg_type : arg_types) { + if (Type.VOID == arg_type) { throw new ClassGenException("'void' is an illegal argument type for a method"); } } diff --git a/src/main/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java index aa37ba83..78898ae2 100644 --- a/src/main/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/main/java/org/apache/bcel/util/AttributeHTML.java @@ -108,8 +108,8 @@ final class AttributeHTML implements org.apache.bcel.Constants { int len = ce.length; if (len > 0) { file.print("

        Exceptions handled

          "); - for (int i = 0; i < len; i++) { - int catch_type = ce[i].getCatchType(); // Index in constant pool + for (CodeException cex : ce) { + int catch_type = cex.getCatchType(); // Index in constant pool file.print("
        • "); if (catch_type != 0) { file.print(constant_html.referenceConstant(catch_type)); // Create Link to _cp.html @@ -117,9 +117,9 @@ final class AttributeHTML implements org.apache.bcel.Constants { file.print("Any Exception"); } file.print("
          (Ranging from lines " - + codeLink(ce[i].getStartPC(), method_number) + " to " - + codeLink(ce[i].getEndPC(), method_number) + ", handled at line " - + codeLink(ce[i].getHandlerPC(), method_number) + ")
        • "); + + codeLink(cex.getStartPC(), method_number) + " to " + + codeLink(cex.getEndPC(), method_number) + ", handled at line " + + codeLink(cex.getHandlerPC(), method_number) + ")"); } file.print("
        "); } diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 22acd516..180e1a00 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -375,10 +375,10 @@ final class CodeHTML implements org.apache.bcel.Constants { if (code != null) { CodeException[] ce = code.getExceptionTable(); int len = ce.length; - for (int i = 0; i < len; i++) { - goto_set.set(ce[i].getStartPC()); - goto_set.set(ce[i].getEndPC()); - goto_set.set(ce[i].getHandlerPC()); + for (CodeException cex : ce) { + goto_set.set(cex.getStartPC()); + goto_set.set(cex.getEndPC()); + goto_set.set(cex.getHandlerPC()); } // Look for local variables and their range Attribute[] attributes = code.getAttributes(); diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index 8e6b63a9..307df02b 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -50,13 +50,12 @@ public class VerifierFactoryListModel implements org.apache.bcel.verifier.Verifi Verifier[] verifiers = VerifierFactory.getVerifiers(); int num_of_verifiers = verifiers.length; cache.clear(); - for (int i = 0; i < num_of_verifiers; i++) { - cache.add(verifiers[i].getClassName()); + for (Verifier verifier : verifiers) { + cache.add(verifier.getClassName()); } - for (int i = 0; i < size; i++) { - ListDataEvent e = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, - num_of_verifiers - 1); - listeners.get(i).contentsChanged(e); + for (ListDataListener listener : listeners) { + ListDataEvent e = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, num_of_verifiers - 1); + listener.contentsChanged(e); } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 0abfba73..b8edab40 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -249,30 +249,27 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ supidx = jc.getSuperclassNameIndex(); Method[] methods = jc.getMethods(); - for (int i=0; i Date: Wed, 23 Apr 2014 12:22:36 +0000 Subject: [PATCH 0591/1313] Removed more final modifiers from private methods git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589381 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Mini/ASTExpr.java | 4 ++-- src/examples/Mini/ASTFunDecl.java | 4 ++-- src/examples/Mini/ASTProgram.java | 8 ++++---- src/examples/Mini/Environment.java | 2 +- src/examples/Mini/MiniParserTokenManager.java | 4 ++-- src/examples/Mini/TokenMgrError.java | 2 +- src/examples/Peephole.java | 2 +- .../java/org/apache/bcel/classfile/ConstantPool.java | 2 +- src/main/java/org/apache/bcel/classfile/JavaClass.java | 2 +- src/main/java/org/apache/bcel/classfile/Signature.java | 4 ++-- src/main/java/org/apache/bcel/classfile/Utility.java | 4 ++-- .../org/apache/bcel/generic/InstructionFactory.java | 10 +++++----- src/main/java/org/apache/bcel/util/ClassPath.java | 2 +- .../java/org/apache/bcel/util/InstructionFinder.java | 6 +++--- .../apache/bcel/verifier/statics/Pass2Verifier.java | 2 +- src/site/xdoc/manual.xml | 2 +- 16 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/examples/Mini/ASTExpr.java b/src/examples/Mini/ASTExpr.java index 3ce7b6c9..e1d401be 100644 --- a/src/examples/Mini/ASTExpr.java +++ b/src/examples/Mini/ASTExpr.java @@ -192,11 +192,11 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan return type; } - private static final String toBool(String i) { + private static String toBool(String i) { return "(" + i + " != 0)"; } - private static final String toInt(String i) { + private static String toInt(String i) { return "((" + i + ")? 1 : 0)"; } diff --git a/src/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java index 38efb057..b506f90c 100644 --- a/src/examples/Mini/ASTFunDecl.java +++ b/src/examples/Mini/ASTFunDecl.java @@ -316,7 +316,7 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { * * where the IF_ICMP__ now branches to the target of the previous IFEQ instruction. */ - private static final void optimizeIFs(InstructionList il) { + private static void optimizeIFs(InstructionList il) { InstructionFinder f = new InstructionFinder(il); String pat = "IF_ICMP ICONST_1 GOTO ICONST_0 IFEQ Instruction"; @@ -403,7 +403,7 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { static final void reset() { size = max_size = 0; } - private static final String getVarDecls() { + private static String getVarDecls() { StringBuffer buf = new StringBuffer(" int "); for(int i=0; i < max_size; i++) { diff --git a/src/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java index 36efa98b..b6d240fb 100644 --- a/src/examples/Mini/ASTProgram.java +++ b/src/examples/Mini/ASTProgram.java @@ -188,11 +188,11 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan out.println(" private static BufferedReader _in = new BufferedReader" + "(new InputStreamReader(System.in));\n"); - out.println(" private static final int _readInt() throws IOException {\n" + + out.println(" private static int _readInt() throws IOException {\n" + " System.out.print(\"Please enter a number> \");\n" + " return Integer.parseInt(_in.readLine());\n }\n"); - out.println(" private static final int _writeInt(int n) {\n" + + out.println(" private static int _writeInt(int n) {\n" + " System.out.println(\"Result: \" + n);\n return 0;\n }\n"); for(int i=0; i < fun_decls.length; i++) { @@ -238,7 +238,7 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan "(Ljava/lang/String;)I"))); il.append(InstructionConstants.IRETURN); - /* private static final int _readInt() throws IOException + /* private static int _readInt() throws IOException */ method = new MethodGen(ACC_STATIC | ACC_PRIVATE | ACC_FINAL, Type.INT, Type.NO_ARGS, null, @@ -249,7 +249,7 @@ implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constan method.setMaxStack(2); class_gen.addMethod(method.getMethod()); - /* private static final int _writeInt(int i) throws IOException + /* private static int _writeInt(int i) throws IOException */ Type[] args = { Type.INT }; String[] argv = { "i" } ; diff --git a/src/examples/Mini/Environment.java b/src/examples/Mini/Environment.java index 6eee111b..23766f38 100644 --- a/src/examples/Mini/Environment.java +++ b/src/examples/Mini/Environment.java @@ -138,7 +138,7 @@ public class Environment implements Cloneable { } catch(ArrayIndexOutOfBoundsException e) {} } - private static final int lookup(Vector v, String key) + private static int lookup(Vector v, String key) throws ArrayIndexOutOfBoundsException { int len = v.size(); diff --git a/src/examples/Mini/MiniParserTokenManager.java b/src/examples/Mini/MiniParserTokenManager.java index d5fbe75d..bb23ca2e 100644 --- a/src/examples/Mini/MiniParserTokenManager.java +++ b/src/examples/Mini/MiniParserTokenManager.java @@ -132,7 +132,7 @@ static private int jjMoveNfa_1(int startState, int curPos) catch(java.io.IOException e) { return curPos; } } } -private static final int jjStopStringLiteralDfa_0(int pos, long active0) +private static int jjStopStringLiteralDfa_0(int pos, long active0) { switch (pos) { @@ -180,7 +180,7 @@ private static final int jjStopStringLiteralDfa_0(int pos, long active0) return -1; } } -private static final int jjStartNfa_0(int pos, long active0) +private static int jjStartNfa_0(int pos, long active0) { return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1); } diff --git a/src/examples/Mini/TokenMgrError.java b/src/examples/Mini/TokenMgrError.java index 4fa9d93d..7039d090 100644 --- a/src/examples/Mini/TokenMgrError.java +++ b/src/examples/Mini/TokenMgrError.java @@ -111,7 +111,7 @@ public class TokenMgrError extends Error * curchar : the offending character * Note: You can customize the lexical error message by modifying this method. */ - private static final String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { + private static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { return("Lexical error at line " + errorLine + ", column " + errorColumn + ". Encountered: " + diff --git a/src/examples/Peephole.java b/src/examples/Peephole.java index e6de8201..c01571fa 100644 --- a/src/examples/Peephole.java +++ b/src/examples/Peephole.java @@ -61,7 +61,7 @@ public class Peephole { } catch(Exception e) { e.printStackTrace(); } } - private static final Method removeNOPs(MethodGen mg) { + private static Method removeNOPs(MethodGen mg) { InstructionList il = mg.getInstructionList(); InstructionFinder f = new InstructionFinder(il); String pat = "NOP+"; // Find at least one NOP diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index b21ccc29..73ba98b0 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -150,7 +150,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { } - private static final String escape( String str ) { + private static String escape( String str ) { int len = str.length(); StringBuilder buf = new StringBuilder(len + 5); char[] ch = str.toCharArray(); diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index efa9a4bc..8d29fded 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -670,7 +670,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl } - private static final String indent( Object obj ) { + private static String indent( Object obj ) { StringTokenizer tok = new StringTokenizer(obj.toString(), "\n"); StringBuilder buf = new StringBuilder(); while (tok.hasMoreTokens()) { diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index 19c2c178..adc6c10c 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -153,7 +153,7 @@ public final class Signature extends Attribute { } - private static final void matchIdent( MyByteArrayInputStream in, StringBuffer buf ) { + private static void matchIdent( MyByteArrayInputStream in, StringBuffer buf ) { int ch; if ((ch = in.read()) == -1) { throw new RuntimeException("Illegal signature: " + in.getData() @@ -196,7 +196,7 @@ public final class Signature extends Attribute { } - private static final void matchGJIdent( MyByteArrayInputStream in, StringBuffer buf ) { + private static void matchGJIdent( MyByteArrayInputStream in, StringBuffer buf ) { int ch; matchIdent(in, buf); ch = in.read(); diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 79606fe2..44669dd0 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -724,7 +724,7 @@ public abstract class Utility { // Guess what this does - private static final int pow2( int n ) { + private static int pow2( int n ) { return 1 << n; } @@ -1036,7 +1036,7 @@ public abstract class Utility { * Convert (signed) byte to (unsigned) short value, i.e., all negative * values become positive. */ - private static final short byteToShort( byte b ) { + private static short byteToShort( byte b ) { return (b < 0) ? (short) (256 + b) : (short) b; } diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index dc335ba5..0033c269 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -192,7 +192,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali }; - private static final boolean isString( Type type ) { + private static boolean isString( Type type ) { return ((type instanceof ObjectType) && ((ObjectType) type).getClassName().equals( "java.lang.String")); } @@ -283,7 +283,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali } - private static final ArithmeticInstruction createBinaryIntOp( char first, String op ) { + private static ArithmeticInstruction createBinaryIntOp( char first, String op ) { switch (first) { case '-': return ISUB; @@ -313,7 +313,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali } - private static final ArithmeticInstruction createBinaryLongOp( char first, String op ) { + private static ArithmeticInstruction createBinaryLongOp( char first, String op ) { switch (first) { case '-': return LSUB; @@ -343,7 +343,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali } - private static final ArithmeticInstruction createBinaryFloatOp( char op ) { + private static ArithmeticInstruction createBinaryFloatOp( char op ) { switch (op) { case '-': return FSUB; @@ -361,7 +361,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali } - private static final ArithmeticInstruction createBinaryDoubleOp( char op ) { + private static ArithmeticInstruction createBinaryDoubleOp( char op ) { switch (op) { case '-': return DSUB; diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 8097eea2..a69fb7eb 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -136,7 +136,7 @@ public class ClassPath implements Serializable { } - private static final void getPathComponents( String path, List list ) { + private static void getPathComponents( String path, List list ) { if (path != null) { StringTokenizer tok = new StringTokenizer(path, File.pathSeparator); while (tok.hasMoreTokens()) { diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index a34170dd..58edd02f 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -115,7 +115,7 @@ public class InstructionFinder { * instruction pattern in lower case * @return encoded string for a pattern such as "BranchInstruction". */ - private static final String mapName( String pattern ) { + private static String mapName( String pattern ) { String result = map.get(pattern); if (result != null) { return result; @@ -138,7 +138,7 @@ public class InstructionFinder { * The pattern to compile * @return translated regular expression string */ - private static final String compilePattern( String pattern ) { + private static String compilePattern( String pattern ) { //Bug: 38787 - Instructions are assumed to be english, to avoid odd Locale issues String lower = pattern.toLowerCase(Locale.ENGLISH); StringBuilder buf = new StringBuilder(); @@ -286,7 +286,7 @@ public class InstructionFinder { /** * Convert opcode number to char. */ - private static final char makeChar( short opcode ) { + private static char makeChar( short opcode ) { return (char) (opcode + OFFSET); } diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index b8edab40..986e450b 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -1316,7 +1316,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * This method returns true if and only if the supplied String * represents a valid Java class name. */ - private static final boolean validClassName(String name){ + private static boolean validClassName(String name){ /* * TODO: implement. * Are there any restrictions? diff --git a/src/site/xdoc/manual.xml b/src/site/xdoc/manual.xml index ed76ff20..288b275f 100644 --- a/src/site/xdoc/manual.xml +++ b/src/site/xdoc/manual.xml @@ -1607,7 +1607,7 @@ public class Peephole { } catch(Exception e) { e.printStackTrace(); } } - private static final Method removeNOPs(MethodGen mg) { + private static Method removeNOPs(MethodGen mg) { InstructionList il = mg.getInstructionList(); InstructionFinder f = new InstructionFinder(il); String pat = "NOP+"; // Find at least one NOP -- GitLab From e1b9c7fc151e9bfe395fad14f7647fea0aa8c185 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 23 Apr 2014 12:26:50 +0000 Subject: [PATCH 0592/1313] Replaced StringBuffers with StringBuilders git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589383 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Signature.java | 8 ++++---- src/main/java/org/apache/bcel/classfile/Utility.java | 2 +- src/main/java/org/apache/bcel/util/BCELFactory.java | 2 +- src/test/java/org/apache/bcel/AbstractTestCase.java | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index adc6c10c..831a01f7 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -153,7 +153,7 @@ public final class Signature extends Attribute { } - private static void matchIdent( MyByteArrayInputStream in, StringBuffer buf ) { + private static void matchIdent( MyByteArrayInputStream in, StringBuilder buf ) { int ch; if ((ch = in.read()) == -1) { throw new RuntimeException("Illegal signature: " + in.getData() @@ -161,7 +161,7 @@ public final class Signature extends Attribute { } //System.out.println("return from ident:" + (char)ch); if (!identStart(ch)) { - StringBuffer buf2 = new StringBuffer(); + StringBuilder buf2 = new StringBuilder(); int count = 1; while (Character.isJavaIdentifierPart((char) ch)) { buf2.append((char) ch); @@ -196,7 +196,7 @@ public final class Signature extends Attribute { } - private static void matchGJIdent( MyByteArrayInputStream in, StringBuffer buf ) { + private static void matchGJIdent( MyByteArrayInputStream in, StringBuilder buf ) { int ch; matchIdent(in, buf); ch = in.read(); @@ -234,7 +234,7 @@ public final class Signature extends Attribute { public static String translate( String s ) { //System.out.println("Sig:" + s); - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); matchGJIdent(new MyByteArrayInputStream(s), buf); return buf.toString(); } diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 44669dd0..30d0396a 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -741,7 +741,7 @@ public abstract class Utility { int index, old_index; try { if (str.indexOf(old) != -1) { // `old' found in str - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); old_index = 0; // String start offset // While we have something to replace while ((index = str.indexOf(old, old_index)) != -1) { diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index d4d3df1f..39761e9f 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -271,7 +271,7 @@ class BCELFactory extends EmptyVisitor { if (bi instanceof Select) { Select s = (Select) bi; branches.add(bi); - StringBuffer args = new StringBuffer("new int[] { "); + StringBuilder args = new StringBuilder("new int[] { "); int[] matchs = s.getMatchs(); for (int i = 0; i < matchs.length; i++) { args.append(matchs[i]); diff --git a/src/test/java/org/apache/bcel/AbstractTestCase.java b/src/test/java/org/apache/bcel/AbstractTestCase.java index 34d98eed..43247ef1 100644 --- a/src/test/java/org/apache/bcel/AbstractTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractTestCase.java @@ -121,7 +121,7 @@ public abstract class AbstractTestCase extends TestCase protected String dumpAttributes(Attribute[] as) { - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); result.append("AttributeArray:["); for (int i = 0; i < as.length; i++) { @@ -137,7 +137,7 @@ public abstract class AbstractTestCase extends TestCase protected String dumpAnnotationEntries(AnnotationEntry[] as) { - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); result.append("["); for (int i = 0; i < as.length; i++) { @@ -153,7 +153,7 @@ public abstract class AbstractTestCase extends TestCase protected String dumpAnnotationEntries(AnnotationEntryGen[] as) { - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); result.append("["); for (int i = 0; i < as.length; i++) { -- GitLab From ff6300120bb949338644817c7bb2a1d38396560f Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 23 Apr 2014 12:36:30 +0000 Subject: [PATCH 0593/1313] Removed the final modifier from the static methods git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589388 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Attribute.java | 2 +- .../org/apache/bcel/classfile/Signature.java | 4 +- .../org/apache/bcel/classfile/Utility.java | 76 +++++++++---------- .../org/apache/bcel/generic/BasicType.java | 2 +- .../org/apache/bcel/generic/Instruction.java | 2 +- .../java/org/apache/bcel/generic/Type.java | 4 +- 6 files changed, 43 insertions(+), 47 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 6e33c1bd..fc85739e 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -130,7 +130,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable * constants @return Attribute @throws IOException @throws * ClassFormatException */ - public static final Attribute readAttribute(DataInputStream file, + public static Attribute readAttribute(DataInputStream file, ConstantPool constant_pool) throws IOException, ClassFormatException { diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index 831a01f7..590848dd 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -240,12 +240,12 @@ public final class Signature extends Attribute { } - public static final boolean isFormalParameterList( String s ) { + public static boolean isFormalParameterList( String s ) { return s.startsWith("<") && (s.indexOf(':') > 0); } - public static final boolean isActualParameterList( String s ) { + public static boolean isActualParameterList( String s ) { return s.startsWith("L") && s.endsWith(">;"); } diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 30d0396a..5336a3da 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -86,7 +86,7 @@ public abstract class Utility { * @param access_flags Access flags * @return String representation of flags */ - public static final String accessToString( int access_flags ) { + public static String accessToString( int access_flags ) { return accessToString(access_flags, false); } @@ -103,7 +103,7 @@ public abstract class Utility { * @param for_class access flags are for class qualifiers ? * @return String representation of flags */ - public static final String accessToString( int access_flags, boolean for_class ) { + public static String accessToString( int access_flags, boolean for_class ) { StringBuilder buf = new StringBuilder(); int p = 0; for (int i = 0; p < Constants.MAX_ACC_FLAG; i++) { // Loop through known flags @@ -129,7 +129,7 @@ public abstract class Utility { * * @return "class" or "interface", depending on the ACC_INTERFACE flag */ - public static final String classOrInterface( int access_flags ) { + public static String classOrInterface( int access_flags ) { return ((access_flags & Constants.ACC_INTERFACE) != 0) ? "interface" : "class"; } @@ -148,7 +148,7 @@ public abstract class Utility { * @param verbose be verbose, e.g. print constant pool index * @return String representation of byte codes */ - public static final String codeToString( byte[] code, ConstantPool constant_pool, int index, + public static String codeToString( byte[] code, ConstantPool constant_pool, int index, int length, boolean verbose ) { StringBuilder buf = new StringBuilder(code.length * 20); // Should be sufficient ByteSequence stream = new ByteSequence(code); @@ -172,8 +172,7 @@ public abstract class Utility { } - public static final String codeToString( byte[] code, ConstantPool constant_pool, int index, - int length ) { + public static String codeToString( byte[] code, ConstantPool constant_pool, int index, int length ) { return codeToString(code, constant_pool, index, length, true); } @@ -189,7 +188,7 @@ public abstract class Utility { * * @throws IOException if a failure from reading from the bytes argument occurs */ - public static final String codeToString( ByteSequence bytes, ConstantPool constant_pool, + public static String codeToString( ByteSequence bytes, ConstantPool constant_pool, boolean verbose ) throws IOException { short opcode = (short) bytes.readUnsignedByte(); int default_offset = 0, low, high, npairs; @@ -448,7 +447,7 @@ public abstract class Utility { } - public static final String codeToString( ByteSequence bytes, ConstantPool constant_pool ) + public static String codeToString( ByteSequence bytes, ConstantPool constant_pool ) throws IOException { return codeToString(bytes, constant_pool, true); } @@ -461,7 +460,7 @@ public abstract class Utility { * @param str The long class name * @return Compacted class name */ - public static final String compactClassName( String str ) { + public static String compactClassName( String str ) { return compactClassName(str, true); } @@ -477,7 +476,7 @@ public abstract class Utility { * @param chopit Flag that determines whether chopping is executed or not * @return Compacted class name */ - public static final String compactClassName( String str, String prefix, boolean chopit ) { + public static String compactClassName( String str, String prefix, boolean chopit ) { int len = prefix.length(); str = str.replace('/', '.'); // Is `/' on all systems, even DOS if (chopit) { @@ -500,7 +499,7 @@ public abstract class Utility { * @param chopit Flag that determines whether chopping is executed or not * @return Compacted class name */ - public static final String compactClassName( String str, boolean chopit ) { + public static String compactClassName( String str, boolean chopit ) { return compactClassName(str, "java.lang.", chopit); } @@ -508,7 +507,7 @@ public abstract class Utility { /** * @return `flag' with bit `i' set to 1 */ - public static final int setBit( int flag, int i ) { + public static int setBit( int flag, int i ) { return flag | pow2(i); } @@ -516,7 +515,7 @@ public abstract class Utility { /** * @return `flag' with bit `i' set to 0 */ - public static final int clearBit( int flag, int i ) { + public static int clearBit( int flag, int i ) { int bit = pow2(i); return (flag & bit) == 0 ? flag : flag ^ bit; } @@ -525,7 +524,7 @@ public abstract class Utility { /** * @return true, if bit `i' in `flag' is set */ - public static final boolean isSet( int flag, int i ) { + public static boolean isSet( int flag, int i ) { return (flag & pow2(i)) != 0; } @@ -540,7 +539,7 @@ public abstract class Utility { * * @throws ClassFormatException if the signature is for Void */ - public final static String methodTypeToSignature( String ret, String[] argv ) + public static String methodTypeToSignature( String ret, String[] argv ) throws ClassFormatException { StringBuilder buf = new StringBuilder("("); String str; @@ -564,7 +563,7 @@ public abstract class Utility { * @return Array of argument types * @throws ClassFormatException */ - public static final String[] methodSignatureArgumentTypes( String signature ) + public static String[] methodSignatureArgumentTypes( String signature ) throws ClassFormatException { return methodSignatureArgumentTypes(signature, true); } @@ -576,7 +575,7 @@ public abstract class Utility { * @return Array of argument types * @throws ClassFormatException */ - public static final String[] methodSignatureArgumentTypes( String signature, boolean chopit ) + public static String[] methodSignatureArgumentTypes( String signature, boolean chopit ) throws ClassFormatException { List vec = new ArrayList(); int index; @@ -602,8 +601,7 @@ public abstract class Utility { * @return return type of method * @throws ClassFormatException */ - public static final String methodSignatureReturnType( String signature ) - throws ClassFormatException { + public static String methodSignatureReturnType( String signature ) throws ClassFormatException { return methodSignatureReturnType(signature, true); } @@ -614,8 +612,7 @@ public abstract class Utility { * @return return type of method * @throws ClassFormatException */ - public static final String methodSignatureReturnType( String signature, boolean chopit ) - throws ClassFormatException { + public static String methodSignatureReturnType( String signature, boolean chopit ) throws ClassFormatException { int index; String type; try { @@ -637,13 +634,12 @@ public abstract class Utility { * @param access flags of method * @return Human readable signature */ - public static final String methodSignatureToString( String signature, String name, String access ) { + public static String methodSignatureToString( String signature, String name, String access ) { return methodSignatureToString(signature, name, access, true); } - public static final String methodSignatureToString( String signature, String name, - String access, boolean chopit ) { + public static String methodSignatureToString( String signature, String name, String access, boolean chopit ) { return methodSignatureToString(signature, name, access, chopit, null); } @@ -677,7 +673,7 @@ public abstract class Utility { * @return Java type declaration * @throws ClassFormatException */ - public static final String methodSignatureToString( String signature, String name, + public static String methodSignatureToString( String signature, String name, String access, boolean chopit, LocalVariableTable vars ) throws ClassFormatException { StringBuilder buf = new StringBuilder("("); String type; @@ -737,7 +733,7 @@ public abstract class Utility { * @param new_ Replacement string * @return new String object */ - public static final String replace( String str, String old, String new_ ) { + public static String replace( String str, String old, String new_ ) { int index, old_index; try { if (str.indexOf(old) != -1) { // `old' found in str @@ -765,7 +761,7 @@ public abstract class Utility { * @param signature to convert * @return Human readable signature */ - public static final String signatureToString( String signature ) { + public static String signatureToString( String signature ) { return signatureToString(signature, true); } @@ -804,7 +800,7 @@ public abstract class Utility { * @return Java type declaration * @throws ClassFormatException */ - public static final String signatureToString( String signature, boolean chopit ) { + public static String signatureToString( String signature, boolean chopit ) { //corrected concurrent private static field acess wrap(consumed_chars, 1); // This is the default, read just one char like `B' try { @@ -961,7 +957,7 @@ public abstract class Utility { * * @throws ClassFormatException if signature is not a method signature */ - public static final byte typeOfMethodSignature( String signature ) throws ClassFormatException { + public static byte typeOfMethodSignature( String signature ) throws ClassFormatException { int index; try { if (signature.charAt(0) != '(') { @@ -984,7 +980,7 @@ public abstract class Utility { * * @throws ClassFormatException if signature isn't a known type */ - public static final byte typeOfSignature( String signature ) throws ClassFormatException { + public static byte typeOfSignature( String signature ) throws ClassFormatException { try { switch (signature.charAt(0)) { case 'B': @@ -1047,7 +1043,7 @@ public abstract class Utility { * * @return bytes as hexadecimal string, e.g. 00 FA 12 ... */ - public static final String toHexString( byte[] bytes ) { + public static String toHexString( byte[] bytes ) { StringBuilder buf = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { short b = byteToShort(bytes[i]); @@ -1074,7 +1070,7 @@ public abstract class Utility { * @param fill fill character * @return formatted int */ - public static final String format( int i, int length, boolean left_justify, char fill ) { + public static String format( int i, int length, boolean left_justify, char fill ) { return fillup(Integer.toString(i), length, left_justify, fill); } @@ -1088,7 +1084,7 @@ public abstract class Utility { * @param fill fill character * @return formatted string */ - public static final String fillup( String str, int length, boolean left_justify, char fill ) { + public static String fillup( String str, int length, boolean left_justify, char fill ) { int len = length - str.length(); char[] buf = new char[(len < 0) ? 0 : len]; for (int j = 0; j < buf.length; j++) { @@ -1101,7 +1097,7 @@ public abstract class Utility { } - static final boolean equals( byte[] a, byte[] b ) { + static boolean equals( byte[] a, byte[] b ) { int size; if ((size = a.length) != b.length) { return false; @@ -1115,27 +1111,27 @@ public abstract class Utility { } - public static final void printArray( PrintStream out, Object[] obj ) { + public static void printArray( PrintStream out, Object[] obj ) { out.println(printArray(obj, true)); } - public static final void printArray( PrintWriter out, Object[] obj ) { + public static void printArray( PrintWriter out, Object[] obj ) { out.println(printArray(obj, true)); } - public static final String printArray( Object[] obj ) { + public static String printArray( Object[] obj ) { return printArray(obj, true); } - public static final String printArray( Object[] obj, boolean braces ) { + public static String printArray( Object[] obj, boolean braces ) { return printArray(obj, braces, false); } - public static final String printArray( Object[] obj, boolean braces, boolean quote ) { + public static String printArray( Object[] obj, boolean braces, boolean quote ) { if (obj == null) { return null; } @@ -1362,7 +1358,7 @@ public abstract class Utility { /** * Escape all occurences of newline chars '\n', quotes \", etc. */ - public static final String convertString( String label ) { + public static String convertString( String label ) { char[] ch = label.toCharArray(); StringBuilder buf = new StringBuilder(); for (char element : ch) { diff --git a/src/main/java/org/apache/bcel/generic/BasicType.java b/src/main/java/org/apache/bcel/generic/BasicType.java index 647cfd87..2bd205ed 100644 --- a/src/main/java/org/apache/bcel/generic/BasicType.java +++ b/src/main/java/org/apache/bcel/generic/BasicType.java @@ -44,7 +44,7 @@ public final class BasicType extends Type { } - public static final BasicType getType( byte type ) { + public static BasicType getType( byte type ) { switch (type) { case Constants.T_VOID: return VOID; diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index fbf21d6d..b2faaa81 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -146,7 +146,7 @@ public abstract class Instruction implements Cloneable, Serializable { * @param bytes input stream bytes * @return instruction object being read */ - public static final Instruction readInstruction( ByteSequence bytes ) throws IOException { + public static Instruction readInstruction( ByteSequence bytes ) throws IOException { boolean wide = false; short opcode = (short) bytes.readUnsignedByte(); Instruction obj = null; diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index b5eec440..17d1e4e4 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -177,7 +177,7 @@ public abstract class Type implements java.io.Serializable { * @param signature signature string such as Ljava/lang/String; * @return type object */ - public static final Type getType( String signature ) throws StringIndexOutOfBoundsException { + public static Type getType( String signature ) throws StringIndexOutOfBoundsException { byte type = Utility.typeOfSignature(signature); if (type <= Constants.T_VOID) { //corrected concurrent private static field acess @@ -351,7 +351,7 @@ public abstract class Type implements java.io.Serializable { return res; } - static final int getTypeSize( String signature ) throws StringIndexOutOfBoundsException { + static int getTypeSize( String signature ) throws StringIndexOutOfBoundsException { byte type = Utility.typeOfSignature(signature); if (type <= Constants.T_VOID) { return encode(BasicType.getType(type).getSize(), 1); -- GitLab From 101b4bdb5e9e5d7437da342b76c4589e52e02139 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 23 Apr 2014 12:42:41 +0000 Subject: [PATCH 0594/1313] Replaced indexOf() with contains() git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589392 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Utility.java | 4 ++-- src/main/java/org/apache/bcel/util/ClassLoader.java | 2 +- src/test/java/org/apache/bcel/AnnotationGenTestCase.java | 4 ++-- src/test/java/org/apache/bcel/ElementValueGenTestCase.java | 3 +-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 5336a3da..46a068ed 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -678,7 +678,7 @@ public abstract class Utility { StringBuilder buf = new StringBuilder("("); String type; int index; - int var_index = (access.indexOf("static") >= 0) ? 0 : 1; + int var_index = access.contains("static") ? 0 : 1; try { // Read all declarations between for `(' and `)' if (signature.charAt(0) != '(') { throw new ClassFormatException("Invalid method signature: " + signature); @@ -736,7 +736,7 @@ public abstract class Utility { public static String replace( String str, String old, String new_ ) { int index, old_index; try { - if (str.indexOf(old) != -1) { // `old' found in str + if (str.contains(old)) { // `old' found in str StringBuilder buf = new StringBuilder(); old_index = 0; // String start offset // While we have something to replace diff --git a/src/main/java/org/apache/bcel/util/ClassLoader.java b/src/main/java/org/apache/bcel/util/ClassLoader.java index 82a4a871..5c3823ad 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoader.java +++ b/src/main/java/org/apache/bcel/util/ClassLoader.java @@ -115,7 +115,7 @@ public class ClassLoader extends java.lang.ClassLoader { JavaClass clazz = null; /* Third try: Special request? */ - if (class_name.indexOf("$$BCEL$$") >= 0) { + if (class_name.contains("$$BCEL$$")) { clazz = createClass(class_name); } else { // Fourth try: Load classes via repository if ((clazz = repository.loadClass(class_name)) != null) { diff --git a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java b/src/test/java/org/apache/bcel/AnnotationGenTestCase.java index f5b013c2..d2c30698 100644 --- a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/bcel/AnnotationGenTestCase.java @@ -64,7 +64,7 @@ public class AnnotationGenTestCase extends AbstractTestCase // Check it looks right assertTrue( "Should include string 'id=4' but says: " + nvGen.toString(), - nvGen.toString().indexOf("id=4") != -1); + nvGen.toString().contains("id=4")); ObjectType t = new ObjectType("SimpleAnnotation"); List elements = new ArrayList(); elements.add(nvGen); @@ -89,7 +89,7 @@ public class AnnotationGenTestCase extends AbstractTestCase // Check it looks right assertTrue( "Should include string 'id=4' but says: " + nvGen.toString(), - nvGen.toString().indexOf("id=4") != -1); + nvGen.toString().contains("id=4")); ObjectType t = new ObjectType("SimpleAnnotation"); List elements = new ArrayList(); elements.add(nvGen); diff --git a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java index 6565062c..212a7056 100644 --- a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java +++ b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java @@ -205,8 +205,7 @@ public class ElementValueGenTestCase extends AbstractTestCase ObjectType classType = new ObjectType("java.lang.Integer"); ClassElementValueGen evg = new ClassElementValueGen(classType, cp); assertTrue("Unexpected value for contained class: '" - + evg.getClassString() + "'", evg.getClassString().indexOf( - "Integer") != -1); + + evg.getClassString() + "'", evg.getClassString().contains("Integer")); checkSerialize(evg, cp); } -- GitLab From 2d1844307639c26caaeb50b1de93ac623ae96d8e Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 23 Apr 2014 12:56:36 +0000 Subject: [PATCH 0595/1313] Removed more final modifiers from static methods git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589401 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Mini/ASTFunDecl.java | 12 ++-- src/examples/Mini/MiniParser.java | 66 +++++++++---------- src/examples/Mini/MiniParserTokenManager.java | 4 +- src/examples/Mini/Token.java | 2 +- src/examples/Mini/TokenMgrError.java | 2 +- .../org/apache/bcel/classfile/Constant.java | 2 +- .../org/apache/bcel/classfile/JavaClass.java | 2 +- .../org/apache/bcel/generic/BranchHandle.java | 2 +- .../bcel/generic/BranchInstruction.java | 2 +- .../bcel/generic/InstructionHandle.java | 2 +- .../java/org/apache/bcel/util/Class2HTML.java | 2 +- .../java/org/apache/bcel/util/ClassPath.java | 2 +- src/site/xdoc/manual.xml | 4 +- 13 files changed, 52 insertions(+), 52 deletions(-) diff --git a/src/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java index b506f90c..679825d3 100644 --- a/src/examples/Mini/ASTFunDecl.java +++ b/src/examples/Mini/ASTFunDecl.java @@ -401,7 +401,7 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { */ static int size, max_size; - static final void reset() { size = max_size = 0; } + static void reset() { size = max_size = 0; } private static String getVarDecls() { StringBuffer buf = new StringBuffer(" int "); @@ -420,24 +420,24 @@ implements MiniParserTreeConstants, org.apache.bcel.Constants { /** Used by byte_code() */ - static final void pop(int s) { size -= s; } - static final void push(int s) { + static void pop(int s) { size -= s; } + static void push(int s) { size += s; if(size > max_size) { max_size = size; } } - static final void push() { push(1); } + static void push() { push(1); } /** Used byte code() */ - static final void push(StringBuffer buf, String str) { + static void push(StringBuffer buf, String str) { buf.append(" _s" + size + " = " + str + ";\n"); push(1); } - static final String pop() { + static String pop() { return "_s" + (--size); } } diff --git a/src/examples/Mini/MiniParser.java b/src/examples/Mini/MiniParser.java index 765f19f7..106be3f5 100644 --- a/src/examples/Mini/MiniParser.java +++ b/src/examples/Mini/MiniParser.java @@ -27,7 +27,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini /* A program consists of a number of function declarations with a * distinguished function `main' that starts the program. */ - static final public void Program() throws ParseException { + static public void Program() throws ParseException { /*@bgen(jjtree) Program */ ASTProgram jjtn000 = new ASTProgram(JJTPROGRAM); boolean jjtc000 = true; @@ -76,7 +76,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini /* "FUN" Ident() "(" NameList() ")" = Expr() */ - static final public void FunDecl() throws ParseException { + static public void FunDecl() throws ParseException { /*@bgen(jjtree) FunDecl */ ASTFunDecl jjtn000 = new ASTFunDecl(JJTFUNDECL); boolean jjtc000 = true; @@ -141,7 +141,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini } } - static final public void Expr() throws ParseException { + static public void Expr() throws ParseException { /*@bgen(jjtree) Expr */ ASTExpr jjtn000 = new ASTExpr(JJTEXPR); boolean jjtc000 = true; @@ -220,7 +220,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini * else's to the innermost if statement. The LOOKAHEAD specification * is to tell JavaCC that we know what we are doing. */ - static final public void IfExpr() throws ParseException { + static public void IfExpr() throws ParseException { /*@bgen(jjtree) IfExpr */ ASTIfExpr jjtn000 = new ASTIfExpr(JJTIFEXPR); boolean jjtc000 = true; @@ -269,7 +269,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini } } - static final public void LetExpr() throws ParseException { + static public void LetExpr() throws ParseException { /*@bgen(jjtree) LetExpr */ ASTLetExpr jjtn000 = new ASTLetExpr(JJTLETEXPR); boolean jjtc000 = true; @@ -325,7 +325,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini } } - static final public Token FunAppl() throws ParseException { + static public Token FunAppl() throws ParseException { /*@bgen(jjtree) FunAppl */ ASTFunAppl jjtn000 = new ASTFunAppl(JJTFUNAPPL); boolean jjtc000 = true; @@ -400,7 +400,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini throw new Error("Missing return statement in function"); } - static final public void Term() throws ParseException { + static public void Term() throws ParseException { /*@bgen(jjtree) Term */ ASTTerm jjtn000 = new ASTTerm(JJTTERM); boolean jjtc000 = true; @@ -452,7 +452,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini } } - static final public void Factor() throws ParseException { + static public void Factor() throws ParseException { /*@bgen(jjtree) Factor */ ASTFactor jjtn000 = new ASTFactor(JJTFACTOR); boolean jjtc000 = true; @@ -506,7 +506,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini } } - static final public void Element() throws ParseException { + static public void Element() throws ParseException { if (jj_2_1(2)) { expr_token = FunAppl(); } else { @@ -534,7 +534,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini } } - static final public Token Integer() throws ParseException { + static public Token Integer() throws ParseException { /*@bgen(jjtree) Integer */ ASTInteger jjtn000 = new ASTInteger(JJTINTEGER); boolean jjtc000 = true; @@ -559,7 +559,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini throw new Error("Missing return statement in function"); } - static final public Token Ident() throws ParseException { + static public Token Ident() throws ParseException { /*@bgen(jjtree) Ident */ ASTIdent jjtn000 = new ASTIdent(JJTIDENT); boolean jjtc000 = true; @@ -604,7 +604,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini throw new Error("Missing return statement in function"); } - static final public int AddOp() throws ParseException { + static public int AddOp() throws ParseException { Token t=null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS: @@ -627,7 +627,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini throw new Error("Missing return statement in function"); } - static final public int MultOp() throws ParseException { + static public int MultOp() throws ParseException { Token t=null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case MULT: @@ -653,7 +653,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini throw new Error("Missing return statement in function"); } - static final public int CmpOp() throws ParseException { + static public int CmpOp() throws ParseException { Token t=null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EQ: @@ -705,14 +705,14 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini throw new Error("Missing return statement in function"); } - static final private boolean jj_2_1(int xla) { + static private boolean jj_2_1(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; boolean retval = !jj_3_1(); jj_save(0, xla); return retval; } - static final private boolean jj_3R_8() { + static private boolean jj_3R_8() { if (jj_scan_token(FALSE)) { return true; } @@ -722,7 +722,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini return false; } - static final private boolean jj_3R_11() { + static private boolean jj_3R_11() { if (jj_scan_token(IDENT)) { return true; } @@ -732,7 +732,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini return false; } - static final private boolean jj_3R_7() { + static private boolean jj_3R_7() { if (jj_scan_token(TRUE)) { return true; } @@ -742,7 +742,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini return false; } - static final private boolean jj_3R_6() { + static private boolean jj_3R_6() { Token xsp; xsp = jj_scanpos; if (jj_3R_7()) { @@ -774,7 +774,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini return false; } - static final private boolean jj_3_1() { + static private boolean jj_3_1() { if (jj_3R_5()) { return true; } @@ -784,7 +784,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini return false; } - static final private boolean jj_3R_5() { + static private boolean jj_3R_5() { if (jj_3R_6()) { return true; } @@ -800,7 +800,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini return false; } - static final private boolean jj_3R_10() { + static private boolean jj_3R_10() { if (jj_scan_token(WRITE)) { return true; } @@ -810,7 +810,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini return false; } - static final private boolean jj_3R_9() { + static private boolean jj_3R_9() { if (jj_scan_token(READ)) { return true; } @@ -943,7 +943,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini } } - static final private Token jj_consume_token(int kind) throws ParseException { + static private Token jj_consume_token(int kind) throws ParseException { Token oldToken; if ((oldToken = token).next != null) { token = token.next; @@ -972,7 +972,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini throw generateParseException(); } - static final private boolean jj_scan_token(int kind) { + static private boolean jj_scan_token(int kind) { if (jj_scanpos == jj_lastpos) { jj_la--; if (jj_scanpos.next == null) { @@ -993,7 +993,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini return (jj_scanpos.kind != kind); } - static final public Token getNextToken() { + static public Token getNextToken() { if (token.next != null) { token = token.next; } else { @@ -1004,7 +1004,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini return token; } - static final public Token getToken(int index) { + static public Token getToken(int index) { Token t = lookingAhead ? jj_scanpos : token; for (int i = 0; i < index; i++) { if (t.next != null) { @@ -1016,7 +1016,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini return t; } - static final private int jj_ntk() { + static private int jj_ntk() { if ((jj_nt=token.next) == null) { return (jj_ntk = (token.next=MiniParserTokenManager.getNextToken()).kind); } else { @@ -1066,7 +1066,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini } } - static final public ParseException generateParseException() { + static public ParseException generateParseException() { jj_expentries.removeAllElements(); boolean[] la1tokens = new boolean[43]; for (int i = 0; i < 43; i++) { @@ -1105,13 +1105,13 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini return new ParseException(token, exptokseq, tokenImage); } - static final public void enable_tracing() { + static public void enable_tracing() { } - static final public void disable_tracing() { + static public void disable_tracing() { } - static final private void jj_rescan_token() { + static private void jj_rescan_token() { jj_rescan = true; for (int i = 0; i < 1; i++) { JJCalls p = jj_2_rtns[i]; @@ -1128,7 +1128,7 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini jj_rescan = false; } - static final private void jj_save(int index, int xla) { + static private void jj_save(int index, int xla) { JJCalls p = jj_2_rtns[index]; while (p.gen > jj_gen) { if (p.next == null) { p = p.next = new JJCalls(); break; } diff --git a/src/examples/Mini/MiniParserTokenManager.java b/src/examples/Mini/MiniParserTokenManager.java index bb23ca2e..dbdba0e4 100644 --- a/src/examples/Mini/MiniParserTokenManager.java +++ b/src/examples/Mini/MiniParserTokenManager.java @@ -651,7 +651,7 @@ static int jjround; static int jjmatchedPos; static int jjmatchedKind; -public static final Token getNextToken() +public static Token getNextToken() { Token specialToken = null; Token matchedToken; @@ -770,7 +770,7 @@ public static final Token getNextToken() } } -static final void SkipLexicalActions(Token matchedToken) +static void SkipLexicalActions(Token matchedToken) { switch(jjmatchedKind) { diff --git a/src/examples/Mini/Token.java b/src/examples/Mini/Token.java index 079af4ad..b527bd68 100644 --- a/src/examples/Mini/Token.java +++ b/src/examples/Mini/Token.java @@ -88,7 +88,7 @@ public class Token { * to the following switch statement. Then you can cast matchedToken * variable to the appropriate type and use it in your lexical actions. */ - public static final Token newToken(int ofKind) + public static Token newToken(int ofKind) { switch(ofKind) { diff --git a/src/examples/Mini/TokenMgrError.java b/src/examples/Mini/TokenMgrError.java index 7039d090..6b68ce84 100644 --- a/src/examples/Mini/TokenMgrError.java +++ b/src/examples/Mini/TokenMgrError.java @@ -54,7 +54,7 @@ public class TokenMgrError extends Error * Replaces unprintable characters by their espaced (or unicode escaped) * equivalents in the given string */ - protected static final String addEscapes(String str) { + protected static String addEscapes(String str) { StringBuffer retval = new StringBuffer(); char ch; for (int i = 0; i < str.length(); i++) { diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index 5c3539f2..c5223c89 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -125,7 +125,7 @@ public abstract class Constant implements Cloneable, Node, Serializable { * @param file Input stream * @return Constant object */ - static final Constant readConstant( DataInputStream file ) throws IOException, + static Constant readConstant( DataInputStream file ) throws IOException, ClassFormatException { byte b = file.readByte(); // Read tag byte switch (b) { diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 8d29fded..d8a8b8c9 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -218,7 +218,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /* Print debug information depending on `JavaClass.debug' */ - static final void Debug( String str ) { + static void Debug( String str ) { if (debug) { System.out.println(str); } diff --git a/src/main/java/org/apache/bcel/generic/BranchHandle.java b/src/main/java/org/apache/bcel/generic/BranchHandle.java index bec1bda1..907d1c1e 100644 --- a/src/main/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/main/java/org/apache/bcel/generic/BranchHandle.java @@ -45,7 +45,7 @@ public final class BranchHandle extends InstructionHandle { private static BranchHandle bh_list = null; // List of reusable handles - static final BranchHandle getBranchHandle( BranchInstruction i ) { + static BranchHandle getBranchHandle( BranchInstruction i ) { if (bh_list == null) { return new BranchHandle(i); } diff --git a/src/main/java/org/apache/bcel/generic/BranchInstruction.java b/src/main/java/org/apache/bcel/generic/BranchInstruction.java index f16d298d..c94f2baa 100644 --- a/src/main/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/main/java/org/apache/bcel/generic/BranchInstruction.java @@ -192,7 +192,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi /** * Used by BranchInstruction, LocalVariableGen, CodeExceptionGen */ - static final void notifyTarget( InstructionHandle old_ih, InstructionHandle new_ih, + static void notifyTarget( InstructionHandle old_ih, InstructionHandle new_ih, InstructionTargeter t ) { if (old_ih != null) { old_ih.removeTargeter(t); diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java index bdc41e3f..812864ae 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/main/java/org/apache/bcel/generic/InstructionHandle.java @@ -106,7 +106,7 @@ public class InstructionHandle implements java.io.Serializable { /** Factory method. */ - static final InstructionHandle getInstructionHandle( Instruction i ) { + static InstructionHandle getInstructionHandle( Instruction i ) { if (ih_list == null) { return new InstructionHandle(i); } else { diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index 8017ba2a..f6eb66b3 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -158,7 +158,7 @@ public class Class2HTML implements Constants { } - static final String referenceType( String type ) { + static String referenceType( String type ) { String short_type = Utility.compactClassName(type); short_type = Utility.compactClassName(short_type, class_package + ".", true); int index = type.indexOf('['); // Type is an array? diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index a69fb7eb..40e47b5a 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -155,7 +155,7 @@ public class ClassPath implements Serializable { * * @return class path as used by default by BCEL */ - public static final String getClassPath() { + public static String getClassPath() { String class_path = System.getProperty("java.class.path"); String boot_path = System.getProperty("sun.boot.class.path"); String ext_path = System.getProperty("java.ext.dirs"); diff --git a/src/site/xdoc/manual.xml b/src/site/xdoc/manual.xml index 288b275f..ef52b904 100644 --- a/src/site/xdoc/manual.xml +++ b/src/site/xdoc/manual.xml @@ -461,11 +461,11 @@ private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - public static final int fac(int n) { + public static int fac(int n) { return (n == 0)? 1 : n * fac(n - 1); } - public static final int readInt() { + public static int readInt() { int n = 4711; try { System.out.print("Please enter a number> "); -- GitLab From 42d848271343c69524fb6337b142c0cd67d989b1 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 23 Apr 2014 14:04:00 +0000 Subject: [PATCH 0596/1313] Modified StringRepresentation to support StackMapTable git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589414 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/statics/StringRepresentation.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index c1be6a2e..ba120026 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -51,6 +51,7 @@ import org.apache.bcel.classfile.Node; import org.apache.bcel.classfile.Signature; import org.apache.bcel.classfile.SourceFile; import org.apache.bcel.classfile.StackMap; +import org.apache.bcel.classfile.StackMapTable; import org.apache.bcel.classfile.Synthetic; import org.apache.bcel.classfile.Unknown; import org.apache.bcel.verifier.exc.AssertionViolatedException; @@ -288,6 +289,11 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor tostring = toString(obj); } + @Override + public void visitStackMapTable(StackMapTable obj) { + tostring = toString(obj); + } + @Override public void visitSynthetic(Synthetic obj) { tostring = toString(obj); -- GitLab From 8dd181cb2646b5688676997c8f2725b443d39744 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 23 Apr 2014 14:05:41 +0000 Subject: [PATCH 0597/1313] Fixed the verification of Java 8 interfaces (BCEL-174) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589418 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/statics/Pass2Verifier.java | 45 ++++++++++++------- .../bcel/verifier/VerifierTestCase.java | 39 ++++++++++++++++ 2 files changed, 68 insertions(+), 16 deletions(-) create mode 100644 src/test/java/org/apache/bcel/verifier/VerifierTestCase.java diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 986e450b..60516485 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -682,22 +682,35 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } else{ // isInterface! if (!name.equals(STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph - if (!obj.isPublic()){ - throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); - } - if (!obj.isAbstract()){ - throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_ABSTRACT modifier set but hasn't!"); - } - if ( obj.isPrivate() || - obj.isProtected() || - obj.isStatic() || - obj.isFinal() || - obj.isSynchronized() || - obj.isNative() || - obj.isStrictfp() ){ - throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must not have any of the ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT modifiers set."); - } - } + if (jc.getMajor() >= MAJOR_1_8) { + if (!(obj.isPublic() ^ obj.isPrivate())) { + throw new ClassConstraintException("Interface method '" + tostring(obj) + "' must have exactly one of its ACC_PUBLIC and ACC_PRIVATE modifiers set."); + } + if (obj.isProtected() + || obj.isFinal() + || obj.isSynchronized() + || obj.isNative()) { + throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must not have any of the ACC_PROTECTED, ACC_FINAL, ACC_SYNCHRONIZED, or ACC_NATIVE modifiers set."); + } + + } else { + if (!obj.isPublic()){ + throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); + } + if (!obj.isAbstract()){ + throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_ABSTRACT modifier set but hasn't!"); + } + if (obj.isPrivate() + || obj.isProtected() + || obj.isStatic() + || obj.isFinal() + || obj.isSynchronized() + || obj.isNative() + || obj.isStrictfp() ) { + throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must not have any of the ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT modifiers set."); + } + } + } } // A specific instance initialization method... (vmspec2,Page 116). diff --git a/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java new file mode 100644 index 00000000..791c24ff --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.bcel.verifier; + +import java.util.Collection; + +import junit.framework.TestCase; + +public class VerifierTestCase extends TestCase { + + public void testDefaultMethodValidation() { + String classname = Collection.class.getName(); + + Verifier verifier = VerifierFactory.getVerifier(classname); + VerificationResult result = verifier.doPass1(); + + assertEquals("Pass 1 verification of " + classname + " failed: " + result.getMessage(), VerificationResult.VERIFIED_OK, result.getStatus()); + + result = verifier.doPass2(); + + assertEquals("Pass 2 verification of " + classname + " failed: " + result.getMessage(), VerificationResult.VERIFIED_OK, result.getStatus()); + } +} -- GitLab From 86081411f480dd6cf8c7cbca74b9b8fa87f87992 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 23 Apr 2014 14:26:40 +0000 Subject: [PATCH 0598/1313] Updated the links to the Jasmin homepage (BCEL-152) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589428 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/JasminVisitor.java | 4 ++-- src/site/xdoc/manual.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/examples/JasminVisitor.java b/src/examples/JasminVisitor.java index 244d71fc..e975cbf0 100644 --- a/src/examples/JasminVisitor.java +++ b/src/examples/JasminVisitor.java @@ -50,8 +50,8 @@ import org.apache.bcel.generic.Select; import org.apache.bcel.generic.TABLESWITCH; /** - * Disassemble Java class object into the - * JASMIN format. + * Disassemble Java class object into the + * Jasmin format. * * @version $Id$ * @author M. Dahm diff --git a/src/site/xdoc/manual.xml b/src/site/xdoc/manual.xml index ef52b904..a1f1045b 100644 --- a/src/site/xdoc/manual.xml +++ b/src/site/xdoc/manual.xml @@ -611,7 +611,7 @@
      • Various code examples and utilities like a class file viewer, a tool to convert class files into HTML, and a converter from class files to the Jasmin assembly + href="http://jasmin.sourceforge.net">Jasmin assembly language.
      • @@ -741,7 +741,7 @@ visitor objects to traverse and analyze the contents of a class file. Included in the distribution is a class JasminVisitor that converts class files into the Jasmin + href="http://jasmin.sourceforge.net">Jasmin assembler language.

        -- GitLab From 142edb8043bc41401872204edb24ac6af36e7b35 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 23 Apr 2014 21:26:13 +0000 Subject: [PATCH 0599/1313] Added the MethodParameters attribute defined in the class format 52 (Java 8) (BCEL-175) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589522 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 10 +- .../org/apache/bcel/classfile/Attribute.java | 2 + .../bcel/classfile/DescendingVisitor.java | 7 ++ .../apache/bcel/classfile/EmptyVisitor.java | 4 + .../bcel/classfile/MethodParameter.java | 118 ++++++++++++++++++ .../bcel/classfile/MethodParameters.java | 88 +++++++++++++ .../org/apache/bcel/classfile/Visitor.java | 2 + .../statics/StringRepresentation.java | 6 + .../apache/bcel/visitors/CounterVisitor.java | 8 ++ 9 files changed, 243 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/apache/bcel/classfile/MethodParameter.java create mode 100644 src/main/java/org/apache/bcel/classfile/MethodParameters.java diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index e14a6cb9..4c408bbb 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -215,6 +215,11 @@ public interface Constants { */ public final static short ACC_ENUM = 0x4000; + /** One of the access flags for fields, methods, or classes. + * @see #ACC_PUBLIC + */ + public final static short ACC_MANDATED = (short) 0x8000; + // Applies to classes compiled by new compilers only /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC @@ -1445,8 +1450,9 @@ public interface Constants { public static final byte ATTR_ENCLOSING_METHOD = 18; public static final byte ATTR_STACK_MAP_TABLE = 19; public static final byte ATTR_BOOTSTRAP_METHODS = 20; + public static final byte ATTR_METHOD_PARAMETERS = 21; - public static final short KNOWN_ATTRIBUTES = 21; + public static final short KNOWN_ATTRIBUTES = 22; // TOFO: FIXXXXX public static final String[] ATTRIBUTE_NAMES = { @@ -1457,7 +1463,7 @@ public interface Constants { "RuntimeVisibleAnnotations", "RuntimeInvisibleAnnotations", "RuntimeVisibleParameterAnnotations", "RuntimeInvisibleParameterAnnotations", "AnnotationDefault", "LocalVariableTypeTable", "EnclosingMethod", "StackMapTable", - "BootstrapMethods" + "BootstrapMethods", "MethodParameters" }; /** Constants used in the StackMap attribute. diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index fc85739e..716d5593 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -216,6 +216,8 @@ public abstract class Attribute implements Cloneable, Node, Serializable return new StackMapTable(name_index, length, file, constant_pool); case Constants.ATTR_BOOTSTRAP_METHODS: return new BootstrapMethods(name_index, length, file, constant_pool); + case Constants.ATTR_METHOD_PARAMETERS: + return new MethodParameters(name_index, length, file, constant_pool); default: // Never reached throw new IllegalStateException("Unrecognized attribute type tag parsed: " + tag); } diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index 73716654..0dbd0ae4 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -437,4 +437,11 @@ public class DescendingVisitor implements Visitor obj.accept(visitor); stack.pop(); } + + public void visitMethodParameters(MethodParameters obj) + { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } } diff --git a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java index f50f3587..af22d890 100644 --- a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -193,4 +193,8 @@ public class EmptyVisitor implements Visitor public void visitBootstrapMethods(BootstrapMethods obj) { } + + public void visitMethodParameters(MethodParameters obj) + { + } } diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameter.java b/src/main/java/org/apache/bcel/classfile/MethodParameter.java new file mode 100644 index 00000000..4f0efe06 --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/MethodParameter.java @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.Serializable; + +import org.apache.bcel.Constants; + +/** + * Entry of the parameters table. + * + * @see The class File Format : The MethodParameters Attribute + * @since 6.0 + */ +public class MethodParameter implements Serializable, Cloneable { + + private static final long serialVersionUID = 6014494029439440326L; + + /** Index of the CONSTANT_Utf8_info structure in the constant_pool table representing the name of the parameter */ + private int name_index; + + /** The access flags */ + private int access_flags; + + public MethodParameter() { + } + + /** + * Construct object from file stream. + * + * @param file Input stream + * @throws java.io.IOException + * @throws ClassFormatException + */ + MethodParameter(DataInputStream file) throws IOException { + name_index = file.readUnsignedShort(); + access_flags = file.readUnsignedShort(); + } + + public int getNameIndex() { + return name_index; + } + + public void setNameIndex(int name_index) { + this.name_index = name_index; + } + + /** + * Returns the name of the parameter. + */ + public String getParameterName(ConstantPool constant_pool) { + if (name_index == 0) { + return null; + } else { + return ((ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8)).getBytes(); + } + } + + public int getAccessFlags() { + return access_flags; + } + + public void setAccessFlags(int access_flags) { + this.access_flags = access_flags; + } + + public boolean isFinal() { + return (access_flags & Constants.ACC_FINAL) != 0; + } + + public boolean isSynthetic() { + return (access_flags & Constants.ACC_SYNTHETIC) != 0; + } + + public boolean isMandated() { + return (access_flags & Constants.ACC_MANDATED) != 0; + } + + /** + * Dump object to file stream on binary format. + * + * @param file Output file stream + * @throws IOException + */ + public final void dump(DataOutputStream file) throws IOException { + file.writeShort(name_index); + file.writeShort(access_flags); + } + + /** + * @return deep copy of this object + */ + public MethodParameter copy() { + try { + return (MethodParameter) clone(); + } catch (CloneNotSupportedException e) { + } + return null; + } +} diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameters.java b/src/main/java/org/apache/bcel/classfile/MethodParameters.java new file mode 100644 index 00000000..62fbc23c --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/MethodParameters.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.bcel.classfile; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; + +/** + * This class represents a MethodParameters attribute. + * + * @see The class File Format : The MethodParameters Attribute + * @since 6.0 + */ +public class MethodParameters extends Attribute { + + private static final long serialVersionUID = 2500272580422360140L; + + private MethodParameter[] parameters = new MethodParameter[0]; + + MethodParameters(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException { + super(Constants.ATTR_METHOD_PARAMETERS, name_index, length, constant_pool); + System.out.println("new MethodParameters"); + + int parameters_count = file.readUnsignedShort(); + parameters = new MethodParameter[parameters_count]; + for (int i = 0; i < parameters_count; i++) { + parameters[i] = new MethodParameter(file); + } + } + + public MethodParameter[] getParameters() { + return parameters; + } + + public void setParameters(MethodParameter[] parameters) { + this.parameters = parameters; + } + + @Override + public void accept(Visitor v) { + v.visitMethodParameters(this); + } + + @Override + public Attribute copy(ConstantPool _constant_pool) { + MethodParameters c = (MethodParameters) clone(); + c.parameters = new MethodParameter[parameters.length]; + + for (int i = 0; i < parameters.length; i++) { + c.parameters[i] = parameters[i].copy(); + } + c.constant_pool = _constant_pool; + return c; + } + + /** + * Dump method parameters attribute to file stream in binary format. + * + * @param file Output file stream + * @throws IOException + */ + @Override + public void dump(DataOutputStream file) throws IOException { + super.dump(file); + file.writeByte(parameters.length); + for (MethodParameter parameter : parameters) { + parameter.dump(file); + } + } +} diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java index eba73dbd..63abb41e 100644 --- a/src/main/java/org/apache/bcel/classfile/Visitor.java +++ b/src/main/java/org/apache/bcel/classfile/Visitor.java @@ -108,4 +108,6 @@ public interface Visitor void visitEnclosingMethod(EnclosingMethod obj); void visitBootstrapMethods(BootstrapMethods obj); + + void visitMethodParameters(MethodParameters obj); } diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index ba120026..4b9e7850 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -47,6 +47,7 @@ import org.apache.bcel.classfile.LocalVariable; import org.apache.bcel.classfile.LocalVariableTable; import org.apache.bcel.classfile.LocalVariableTypeTable; import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.MethodParameters; import org.apache.bcel.classfile.Node; import org.apache.bcel.classfile.Signature; import org.apache.bcel.classfile.SourceFile; @@ -308,4 +309,9 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor public void visitBootstrapMethods(BootstrapMethods obj) { tostring = toString(obj); } + + @Override + public void visitMethodParameters(MethodParameters obj) { + tostring = toString(obj); + } } diff --git a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java index 49b66c37..7c517e8d 100644 --- a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java +++ b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java @@ -50,6 +50,7 @@ import org.apache.bcel.classfile.LocalVariable; import org.apache.bcel.classfile.LocalVariableTable; import org.apache.bcel.classfile.LocalVariableTypeTable; import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.MethodParameters; import org.apache.bcel.classfile.ParameterAnnotations; import org.apache.bcel.classfile.Signature; import org.apache.bcel.classfile.SourceFile; @@ -144,6 +145,8 @@ public class CounterVisitor implements Visitor public int stackMapTableEntryCount = 0; public int bootstrapMethodsCount = 0; + + public int methodParametersCount = 0; public void visitAnnotation(Annotations obj) @@ -350,4 +353,9 @@ public class CounterVisitor implements Visitor { bootstrapMethodsCount++; } + + public void visitMethodParameters(MethodParameters obj) + { + methodParametersCount++; + } } -- GitLab From d8ac9383f22595280e104287ddc9d1fe6ca68dd3 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 24 Apr 2014 07:49:36 +0000 Subject: [PATCH 0600/1313] Updated the URLs still pointing to http://jakarta.apache.org git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589627 13f79535-47bb-0310-9956-ffa450edef68 --- README.txt | 2 +- RELEASE-NOTES.txt | 2 +- src/examples/JasminVisitor.java | 2 +- src/examples/Mini/README | 2 +- src/main/java/org/apache/bcel/generic/package.html | 2 +- src/main/java/org/apache/bcel/package.html | 2 +- src/main/java/org/apache/bcel/util/package.html | 2 +- src/main/java/org/apache/bcel/verifier/Verifier.java | 2 +- src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.txt b/README.txt index 4f30d9cf..8d6a86aa 100644 --- a/README.txt +++ b/README.txt @@ -29,7 +29,7 @@ Contact If you spot a bug in the BCEL or its accompanying verifier "JustIce" please check with the BCEL mailing list - http://jakarta.apache.org/bcel + http://commons.apache.org/bcel or enter the issue into the BCEL bug database diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 4c260f50..01cebd5e 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -33,7 +33,7 @@ BCEL-163 - Incorporate patch file from Findbugs Feedback -------- Open source works best when you give feedback: -http://jakarta.apache.org/bcel +http://commons.apache.org/bcel Please direct all bug reports to Bugzilla http://issues.apache.org/bugzilla/buglist.cgi?product=BCEL diff --git a/src/examples/JasminVisitor.java b/src/examples/JasminVisitor.java index e975cbf0..63c6a980 100644 --- a/src/examples/JasminVisitor.java +++ b/src/examples/JasminVisitor.java @@ -80,7 +80,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { @Override public void visitJavaClass(JavaClass clazz) { out.println(";; Produced by JasminVisitor (BCEL)"); - out.println(";; http://jakarta.apache.org/bcel/"); + out.println(";; http://commons.apache.org/bcel/"); out.println(";; " + new Date() + "\n"); out.println(".source " + clazz.getSourceFileName()); diff --git a/src/examples/Mini/README b/src/examples/Mini/README index 52f92456..4afb0f03 100644 --- a/src/examples/Mini/README +++ b/src/examples/Mini/README @@ -4,7 +4,7 @@ Mini is a very simple (semi-functional) language that I wrote to test the generic package of BCEL. - http://jakarta.apache.org/bcel/ + http://commons.apache.org/bcel/ Mini uses the JavaCC parser generator which comes precompiled from diff --git a/src/main/java/org/apache/bcel/generic/package.html b/src/main/java/org/apache/bcel/generic/package.html index 71683c2b..7ea9217a 100644 --- a/src/main/java/org/apache/bcel/generic/package.html +++ b/src/main/java/org/apache/bcel/generic/package.html @@ -24,7 +24,7 @@ $Id$

        This package contains the "generic" part of the -Byte Code Engineering +Byte Code Engineering Library, i.e., classes to dynamically modify class objects and byte code instructions.

        diff --git a/src/main/java/org/apache/bcel/package.html b/src/main/java/org/apache/bcel/package.html index 41261d6c..f658adc1 100644 --- a/src/main/java/org/apache/bcel/package.html +++ b/src/main/java/org/apache/bcel/package.html @@ -24,7 +24,7 @@ $Id$

        This package contains basic classes for the -Byte Code Engineering Library +Byte Code Engineering Library and constants defined by the JVM specification. diff --git a/src/main/java/org/apache/bcel/util/package.html b/src/main/java/org/apache/bcel/util/package.html index 01618ecc..bb86de8e 100644 --- a/src/main/java/org/apache/bcel/util/package.html +++ b/src/main/java/org/apache/bcel/util/package.html @@ -24,7 +24,7 @@ $Id$

        This package contains utility classes for the -Byte Code Engineering +Byte Code Engineering Library, namely:

        diff --git a/src/main/java/org/apache/bcel/verifier/Verifier.java b/src/main/java/org/apache/bcel/verifier/Verifier.java index 5e389341..2d358a05 100644 --- a/src/main/java/org/apache/bcel/verifier/Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/Verifier.java @@ -197,7 +197,7 @@ public class Verifier { */ public static void main( String[] args ) { System.out - .println("JustIce by Enver Haase, (C) 2001-2002.\n\n\n"); + .println("JustIce by Enver Haase, (C) 2001-2002.\n\n\n"); for (int k = 0; k < args.length; k++) { try { if (args[k].endsWith(".class")) { diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index c9ca6178..752f2c3d 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -385,7 +385,7 @@ public class VerifierAppFrame extends JFrame { JOptionPane .showMessageDialog( this, - "JustIce is a Java class file verifier.\nIt was implemented by Enver Haase in 2001, 2002.\n", + "JustIce is a Java class file verifier.\nIt was implemented by Enver Haase in 2001, 2002.\n", JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); } -- GitLab From 9b4dd37cbd8abc498a76308d770e399722d35c26 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 24 Apr 2014 09:42:30 +0000 Subject: [PATCH 0601/1313] Replaced Bugzilla with JIRA git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589648 13f79535-47bb-0310-9956-ffa450edef68 --- README.txt | 2 +- RELEASE-NOTES.txt | 10 +++++----- doap_bcel.rdf | 2 +- src/changes/changes.xml | 4 ++-- .../java/org/apache/bcel/util/InstructionFinder.java | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.txt b/README.txt index 8d6a86aa..367bcad2 100644 --- a/README.txt +++ b/README.txt @@ -33,4 +33,4 @@ Contact or enter the issue into the BCEL bug database - http://issues.apache.org/bugzilla/enter_bug.cgi?product=BCEL + https://issues.apache.org/jira/browse/BCEL diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 01cebd5e..c33dc416 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -20,13 +20,13 @@ public org.apache.bcel.util.ClassVector implements java.io.Serializable Bug fixes from 5.2 ------------------ -32664 Examples with enum breaks Gump (JDK1.5) +BCEL-53 - Examples with enum breaks Gump (JDK1.5) Enhancements from 5.2 --------------------- -32945 Wrap JavaClass repository class (map values) with... +BCEL-55 - Wrap JavaClass repository class (map values) with SoftReferences BCEL-163 - Incorporate patch file from Findbugs @@ -35,9 +35,9 @@ Feedback Open source works best when you give feedback: http://commons.apache.org/bcel -Please direct all bug reports to Bugzilla -http://issues.apache.org/bugzilla/buglist.cgi?product=BCEL +Please direct all bug reports to JIRA: +https://issues.apache.org/jira/browse/BCEL -Or subscribe to the bcel-user mailing list +Or subscribe to the commons-user mailing list The BCEL Team diff --git a/doap_bcel.rdf b/doap_bcel.rdf index 474ef1e3..515fbfb7 100644 --- a/doap_bcel.rdf +++ b/doap_bcel.rdf @@ -26,7 +26,7 @@ - + Bytecode Engineering Library diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 7062e78a..9576aa5c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -65,10 +65,10 @@ The type attribute can be add,update,fix,remove. - + Examples not present in source or binary downloads - + Why using unstable sort at MethodGen.getLocalVariables() ? diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index 58edd02f..333e2a0b 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -139,7 +139,7 @@ public class InstructionFinder { * @return translated regular expression string */ private static String compilePattern( String pattern ) { - //Bug: 38787 - Instructions are assumed to be english, to avoid odd Locale issues + //Bug: BCEL-77 - Instructions are assumed to be english, to avoid odd Locale issues String lower = pattern.toLowerCase(Locale.ENGLISH); StringBuilder buf = new StringBuilder(); int size = pattern.length(); -- GitLab From 5a2483e13468902a51dff7f531ae12ecbb5d37d8 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 24 Apr 2014 09:44:25 +0000 Subject: [PATCH 0602/1313] Fixed the release date for BCEL 5.2 on the news page git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589649 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/news.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/site/xdoc/news.xml b/src/site/xdoc/news.xml index 6ed8afd1..9d9d4aab 100644 --- a/src/site/xdoc/news.xml +++ b/src/site/xdoc/news.xml @@ -32,7 +32,7 @@ The BCEL project has moved from Apache Jakarta to Apache Commons.

        -

        1 February 2006 - BCEL 5.2 released!

        +

        7 June 2006 - BCEL 5.2 released!

        The Byte Code Engineering Library version 5.2 has been released after a long period of testing. It mainly contains bug fixes -- GitLab From e330f679d269032ccef40f0aa39a3c44238fd4a3 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 24 Apr 2014 09:46:15 +0000 Subject: [PATCH 0603/1313] Mention the 5.0 release on the news page git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589650 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/news.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/site/xdoc/news.xml b/src/site/xdoc/news.xml index 9d9d4aab..c99e2992 100644 --- a/src/site/xdoc/news.xml +++ b/src/site/xdoc/news.xml @@ -46,6 +46,8 @@ and introduces the possibility to use custom repositories.

        +

        15 December 2001 - BCEL 5.0 released!

        +

        27 October 2001 - BCEL moves to Jakarta!

        The Byte Code Engineering Library is now an official -- GitLab From f6b598a6ac5217aa184bbc348f5539cdd065f1bf Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 24 Apr 2014 09:49:01 +0000 Subject: [PATCH 0604/1313] Updated the releases in the DOAP file git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589652 13f79535-47bb-0310-9956-ffa450edef68 --- doap_bcel.rdf | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/doap_bcel.rdf b/doap_bcel.rdf index 515fbfb7..3f3f9e0e 100644 --- a/doap_bcel.rdf +++ b/doap_bcel.rdf @@ -42,17 +42,24 @@ bcel - 2007-06-14 + 2006-06-07 5.2 bcel - 2003-09-06 + 2003-04-25 5.1 + + + bcel + 2001-12-15 + 5.0 + + -- GitLab From 72d9b5efbd03798f17ed1ca6edbf43f77cd6910a Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 24 Apr 2014 11:42:40 +0000 Subject: [PATCH 0605/1313] Modified StringRepresentation to support EnclosingMethod git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589677 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/statics/StringRepresentation.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 4b9e7850..499d0578 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -36,6 +36,7 @@ import org.apache.bcel.classfile.ConstantString; import org.apache.bcel.classfile.ConstantUtf8; import org.apache.bcel.classfile.ConstantValue; import org.apache.bcel.classfile.Deprecated; +import org.apache.bcel.classfile.EnclosingMethod; import org.apache.bcel.classfile.ExceptionTable; import org.apache.bcel.classfile.Field; import org.apache.bcel.classfile.InnerClass; @@ -305,6 +306,11 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor tostring = toString(obj); } + @Override + public void visitEnclosingMethod(EnclosingMethod obj) { + tostring = toString(obj); + } + @Override public void visitBootstrapMethods(BootstrapMethods obj) { tostring = toString(obj); -- GitLab From 389c0b69c4e479d8b2fb7412d892e9613173094f Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 24 Apr 2014 11:43:55 +0000 Subject: [PATCH 0606/1313] Generics for the graphical verifier git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589678 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/verifier/VerifierAppFrame.java | 8 ++++---- .../apache/bcel/verifier/VerifierFactoryListModel.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index 752f2c3d..654e91a1 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -58,7 +58,7 @@ public class VerifierAppFrame extends JFrame { JPanel jPanel2 = new JPanel(); JSplitPane jSplitPane2 = new JSplitPane(); JPanel jPanel3 = new JPanel(); - JList classNamesJList = new JList(); + JList classNamesJList = new JList(); GridLayout gridLayout1 = new GridLayout(); JPanel messagesPanel = new JPanel(); GridLayout gridLayout2 = new GridLayout(); @@ -83,8 +83,8 @@ public class VerifierAppFrame extends JFrame { JScrollPane jScrollPane5 = new JScrollPane(); JScrollPane jScrollPane6 = new JScrollPane(); JScrollPane jScrollPane7 = new JScrollPane(); - JList pass3aJList = new JList(); - JList pass3bJList = new JList(); + JList pass3aJList = new JList(); + JList pass3bJList = new JList(); JTextPane pass3aTextPane = new JTextPane(); JTextPane pass3bTextPane = new JTextPane(); JMenu jMenu2 = new JMenu(); @@ -234,7 +234,7 @@ public class VerifierAppFrame extends JFrame { if (e.getValueIsAdjusting()) { return; } - current_class = classNamesJList.getSelectedValue().toString(); + current_class = classNamesJList.getSelectedValue(); try { verify(); } catch (ClassNotFoundException ex) { diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index 307df02b..13c096fa 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; +import javax.swing.ListModel; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; @@ -32,8 +33,7 @@ import javax.swing.event.ListDataListener; * @version $Id$ * @author Enver Haase */ -public class VerifierFactoryListModel implements org.apache.bcel.verifier.VerifierFactoryObserver, - javax.swing.ListModel { +public class VerifierFactoryListModel implements VerifierFactoryObserver, ListModel { private List listeners = new ArrayList(); private Set cache = new TreeSet(); @@ -65,7 +65,7 @@ public class VerifierFactoryListModel implements org.apache.bcel.verifier.Verifi } - public synchronized void removeListDataListener( javax.swing.event.ListDataListener l ) { + public synchronized void removeListDataListener( ListDataListener l ) { listeners.remove(l); } -- GitLab From 5ba5f3d8ffdfa10a6f64893cc7f6ca63c9d759e2 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 24 Apr 2014 11:45:10 +0000 Subject: [PATCH 0607/1313] Improved the message of the AssertionViolatedExceptions thrown by InstConstraintVisitor when a field is not found git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589679 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/structurals/InstConstraintVisitor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 16c4795b..28c0ee26 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -1270,7 +1270,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } if (f == null) { - throw new AssertionViolatedException("Field '"+field_name+"' not found?!?"); + throw new AssertionViolatedException("Field '" + field_name + "' not found in " + jc.getClassName()); } } @@ -2653,8 +2653,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } if (f == null){ - throw new AssertionViolatedException("Field not found?!?"); - } + throw new AssertionViolatedException("Field '" + field_name + "' not found in " + jc.getClassName()); + } Type value = stack().peek(); Type t = Type.getType(f.getSignature()); @@ -2743,7 +2743,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } if (f == null){ - throw new AssertionViolatedException("Field not found?!?"); + throw new AssertionViolatedException("Field '" + field_name + "' not found in " + jc.getClassName()); } Type value = stack().peek(); Type t = Type.getType(f.getSignature()); -- GitLab From c27087747491947892fea304c8771f76e99f9121 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 24 Apr 2014 12:31:18 +0000 Subject: [PATCH 0608/1313] More friendly verification messages git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589693 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/verifier/statics/Pass3aVerifier.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 465c795d..bb7c4df9 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -1005,7 +1005,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } if (f == null){ - throw new AssertionViolatedException("Field not found?!?"); + throw new AssertionViolatedException("Field '" + field_name + "' not found in " + jc.getClassName()); } if (f.isFinal()){ @@ -1045,7 +1045,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } if (f == null){ - throw new AssertionViolatedException("Field not found?!?"); + throw new AssertionViolatedException("Field '" + field_name + "' not found in " + jc.getClassName()); } if (! (f.isStatic())){ -- GitLab From f883b9b07d949d976a97fca10a12ab194cc93378 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 24 Apr 2014 14:23:44 +0000 Subject: [PATCH 0609/1313] Reverted r1589678 (requires Java 7) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589745 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/verifier/VerifierAppFrame.java | 8 ++++---- .../apache/bcel/verifier/VerifierFactoryListModel.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index 654e91a1..752f2c3d 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -58,7 +58,7 @@ public class VerifierAppFrame extends JFrame { JPanel jPanel2 = new JPanel(); JSplitPane jSplitPane2 = new JSplitPane(); JPanel jPanel3 = new JPanel(); - JList classNamesJList = new JList(); + JList classNamesJList = new JList(); GridLayout gridLayout1 = new GridLayout(); JPanel messagesPanel = new JPanel(); GridLayout gridLayout2 = new GridLayout(); @@ -83,8 +83,8 @@ public class VerifierAppFrame extends JFrame { JScrollPane jScrollPane5 = new JScrollPane(); JScrollPane jScrollPane6 = new JScrollPane(); JScrollPane jScrollPane7 = new JScrollPane(); - JList pass3aJList = new JList(); - JList pass3bJList = new JList(); + JList pass3aJList = new JList(); + JList pass3bJList = new JList(); JTextPane pass3aTextPane = new JTextPane(); JTextPane pass3bTextPane = new JTextPane(); JMenu jMenu2 = new JMenu(); @@ -234,7 +234,7 @@ public class VerifierAppFrame extends JFrame { if (e.getValueIsAdjusting()) { return; } - current_class = classNamesJList.getSelectedValue(); + current_class = classNamesJList.getSelectedValue().toString(); try { verify(); } catch (ClassNotFoundException ex) { diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index 13c096fa..307df02b 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; -import javax.swing.ListModel; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; @@ -33,7 +32,8 @@ import javax.swing.event.ListDataListener; * @version $Id$ * @author Enver Haase */ -public class VerifierFactoryListModel implements VerifierFactoryObserver, ListModel { +public class VerifierFactoryListModel implements org.apache.bcel.verifier.VerifierFactoryObserver, + javax.swing.ListModel { private List listeners = new ArrayList(); private Set cache = new TreeSet(); @@ -65,7 +65,7 @@ public class VerifierFactoryListModel implements VerifierFactoryObserver, ListMo } - public synchronized void removeListDataListener( ListDataListener l ) { + public synchronized void removeListDataListener( javax.swing.event.ListDataListener l ) { listeners.remove(l); } -- GitLab From 48c72df64bf39e14e2c139de0af02f44bbbd910a Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 25 Apr 2014 10:08:01 +0000 Subject: [PATCH 0610/1313] Put back deprecated ATTR_RUNTIME(IN)VISIBLE_* constants to preserve the backward compatibility git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589968 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 4c408bbb..17a20887 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -1452,6 +1452,15 @@ public interface Constants { public static final byte ATTR_BOOTSTRAP_METHODS = 20; public static final byte ATTR_METHOD_PARAMETERS = 21; + /** @deprecated Use {@link #ATTR_RUNTIME_VISIBLE_ANNOTATIONS} instead */ + public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = ATTR_RUNTIME_VISIBLE_ANNOTATIONS; + /** @deprecated Use {@link #ATTR_RUNTIME_INVISIBLE_ANNOTATIONS} instead */ + public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = ATTR_RUNTIME_INVISIBLE_ANNOTATIONS; + /** @deprecated Use {@link #ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS} instead */ + public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS; + /** @deprecated Use {@link #ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS} instead */ + public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS; + public static final short KNOWN_ATTRIBUTES = 22; // TOFO: FIXXXXX -- GitLab From 81cb0485f6edc95fc7649bdbd1297fd79bd5bd98 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 25 Apr 2014 10:20:35 +0000 Subject: [PATCH 0611/1313] Removed the mistyped ACC_SYPER constant (ACC_SUPER is already present) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1589974 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 17a20887..1cdc9b0f 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -155,11 +155,6 @@ public interface Constants { */ public final static short ACC_SYNCHRONIZED = 0x0020; - /** One of the access flags for fields, methods, or classes. - * @see #ACC_PUBLIC - */ - public final static short ACC_SYPER = 0x0020; - /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ -- GitLab From fb3787fb2b704a37e2a1105d4469bfa640e605e7 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 25 Apr 2014 15:44:42 +0000 Subject: [PATCH 0612/1313] Reverted the return type of the clone methods to Object to preserve the backward compatibility git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1590062 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Attribute.java | 2 +- src/main/java/org/apache/bcel/classfile/Constant.java | 4 ++-- src/main/java/org/apache/bcel/classfile/PMGClass.java | 2 +- src/main/java/org/apache/bcel/classfile/Signature.java | 2 +- src/main/java/org/apache/bcel/classfile/SourceFile.java | 2 +- src/main/java/org/apache/bcel/generic/ClassGen.java | 4 ++-- src/main/java/org/apache/bcel/generic/CodeExceptionGen.java | 4 ++-- .../java/org/apache/bcel/generic/FieldGenOrMethodGen.java | 4 ++-- src/main/java/org/apache/bcel/generic/LineNumberGen.java | 4 ++-- src/main/java/org/apache/bcel/generic/LocalVariableGen.java | 4 ++-- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 716d5593..dba12e20 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -302,7 +302,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable * @return shallow copy of this attribute */ @Override - public Attribute clone() + public Object clone() { Attribute attr = null; try diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index c5223c89..562756c0 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -110,9 +110,9 @@ public abstract class Constant implements Cloneable, Node, Serializable { @Override - public Constant clone() { + public Object clone() { try { - return (Constant) super.clone(); + return super.clone(); } catch (CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } diff --git a/src/main/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java index bcbea452..b2b1c446 100644 --- a/src/main/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/main/java/org/apache/bcel/classfile/PMGClass.java @@ -169,6 +169,6 @@ public final class PMGClass extends Attribute { */ @Override public Attribute copy( ConstantPool _constant_pool ) { - return clone(); + return (Attribute) clone(); } } diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index 590848dd..fbdca58e 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -265,6 +265,6 @@ public final class Signature extends Attribute { */ @Override public Attribute copy( ConstantPool _constant_pool ) { - return clone(); + return (Attribute) clone(); } } diff --git a/src/main/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java index 8d2a94f1..bbc551ee 100644 --- a/src/main/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/main/java/org/apache/bcel/classfile/SourceFile.java @@ -147,6 +147,6 @@ public final class SourceFile extends Attribute { */ @Override public Attribute copy( ConstantPool _constant_pool ) { - return clone(); + return (Attribute) clone(); } } diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index c92bb1e1..4a9bcbbf 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -554,9 +554,9 @@ public class ClassGen extends AccessFlags implements Cloneable { @Override - public ClassGen clone() { + public Object clone() { try { - return (ClassGen) super.clone(); + return super.clone(); } catch (CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } diff --git a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java index bade1141..9949b32d 100644 --- a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -177,9 +177,9 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable, j @Override - public CodeExceptionGen clone() { + public Object clone() { try { - return (CodeExceptionGen) super.clone(); + return super.clone(); } catch (CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } diff --git a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index e35932cc..e38d5f77 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -146,9 +146,9 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn @Override - public FieldGenOrMethodGen clone() { + public Object clone() { try { - return (FieldGenOrMethodGen) super.clone(); + return super.clone(); } catch (CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } diff --git a/src/main/java/org/apache/bcel/generic/LineNumberGen.java b/src/main/java/org/apache/bcel/generic/LineNumberGen.java index a266b0d0..f96b700f 100644 --- a/src/main/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/main/java/org/apache/bcel/generic/LineNumberGen.java @@ -85,9 +85,9 @@ public class LineNumberGen implements InstructionTargeter, Cloneable, java.io.Se @Override - public LineNumberGen clone() { + public Object clone() { try { - return (LineNumberGen) super.clone(); + return super.clone(); } catch (CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java index f3068d8f..779fb2d6 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java @@ -203,9 +203,9 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo @Override - public LocalVariableGen clone() { + public Object clone() { try { - return (LocalVariableGen) super.clone(); + return super.clone(); } catch (CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } -- GitLab From 9f1704e9fd0b3323825dbbc65d82d7bbc8f02384 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 25 Apr 2014 15:53:56 +0000 Subject: [PATCH 0613/1313] More changes improving the backward compatibility git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1590064 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/Type.java | 2 +- .../java/org/apache/bcel/verifier/VerifierFactoryListModel.java | 2 +- .../org/apache/bcel/verifier/structurals/ControlFlowGraph.java | 2 +- .../apache/bcel/verifier/structurals/InstructionContext.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 17d1e4e4..7f8b6d88 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -34,7 +34,7 @@ import org.apache.bcel.classfile.Utility; public abstract class Type implements java.io.Serializable { private static final long serialVersionUID = -1985077286871826895L; - protected final byte type; + protected byte type; protected String signature; // signature for the type /** Predefined constants */ diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index 307df02b..6a54d8ad 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -75,7 +75,7 @@ public class VerifierFactoryListModel implements org.apache.bcel.verifier.Verifi } - public synchronized String getElementAt( int index ) { + public synchronized Object getElementAt( int index ) { return (cache.toArray(new String[cache.size()]))[index]; } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index a18f49c7..cbe5a1d8 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -114,7 +114,7 @@ public class ControlFlowGraph{ /** * Returns a clone of the "outgoing" frame situation with respect to the given ExecutionChain. */ - public Frame getOutFrame(List execChain){ + public Frame getOutFrame(ArrayList execChain){ executionPredecessors = execChain; Frame org; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java index e74f293d..cc8be38c 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -85,7 +85,7 @@ public interface InstructionContext{ * * @see #execute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) */ - Frame getOutFrame(List executionPredecessors); + Frame getOutFrame(ArrayList executionPredecessors); /** * Returns the InstructionHandle this InstructionContext is wrapped around. -- GitLab From 78fd1e46317a4cd43ed3c8fab618327863ab1bad Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 25 Apr 2014 16:07:54 +0000 Subject: [PATCH 0614/1313] Made Select implement StackProducer to improve the backward compatibility git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1590070 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/Select.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index 43a024d8..db7d1a7a 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -33,7 +33,7 @@ import org.apache.bcel.util.ByteSequence; * @see InstructionList */ public abstract class Select extends BranchInstruction implements VariableLengthInstruction, - StackConsumer { + StackConsumer, StackProducer { private static final long serialVersionUID = 2806771744559217250L; protected int[] match; // matches, i.e., case 1: ... -- GitLab From 4db095fedc3918df4b0b3352171bb06ba4323f01 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 25 Apr 2014 22:30:01 +0000 Subject: [PATCH 0615/1313] Improved the assertions in CounterVisitorTestCase git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1590170 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/CounterVisitorTestCase.java | 147 +++++------------- 1 file changed, 39 insertions(+), 108 deletions(-) diff --git a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java index d947e1d1..864e486b 100644 --- a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java +++ b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java @@ -30,255 +30,186 @@ public class CounterVisitorTestCase extends AbstractCounterVisitorTestCase public void testAnnotationsCount() { - // System.out - // .println("AnnotationsCount = " + getVisitor().annotationCount); - assertTrue(getVisitor().annotationCount == 2); + assertEquals("annotationCount", 2, getVisitor().annotationCount); } public void testAnnotationDefaultCount() { - // System.out.println("AnnotationDefaultCount = " - // + getVisitor().annotationDefaultCount); - assertTrue(getVisitor().annotationDefaultCount == 0); + assertEquals("annotationDefaultCount", 0, getVisitor().annotationDefaultCount); } public void testAnnotationEntryCount() { - // System.out.println("AnnotationEntryCount = " - // + getVisitor().annotationEntryCount); - assertTrue(getVisitor().annotationEntryCount == 0); + assertEquals("annotationEntryCount", 0, getVisitor().annotationEntryCount); } public void testCodeCount() { - // System.out.println("CodeCount = " + getVisitor().codeCount); - assertTrue(getVisitor().codeCount == 1); + assertEquals("codeCount", 1, getVisitor().codeCount); } public void testCodeExceptionCount() { - // System.out.println("CodeExceptionCount = " - // + getVisitor().codeExceptionCount); - assertTrue(getVisitor().codeExceptionCount == 0); + assertEquals("codeExceptionCount", 0, getVisitor().codeExceptionCount); } public void testConstantClassCount() { - // System.out.println("ConstantClassCount = " - // + getVisitor().constantClassCount); - assertTrue(getVisitor().constantClassCount == 2); + assertEquals("constantClassCount", 2, getVisitor().constantClassCount); } public void testConstantDoubleCount() { - // System.out.println("ConstantDoubleCount = " - // + getVisitor().constantDoubleCount); - assertTrue(getVisitor().constantDoubleCount == 0); + assertEquals("constantDoubleCount", 0, getVisitor().constantDoubleCount); } public void testConstantFieldrefCount() { - // System.out.println("ConstantFieldrefCount = " - // + getVisitor().constantFieldrefCount); - assertTrue(getVisitor().constantFieldrefCount == 0); + assertEquals("constantFieldrefCount", 0, getVisitor().constantFieldrefCount); } public void testConstantFloatCount() { - // System.out.println("ConstantFloatCount = " - // + getVisitor().constantFloatCount); - assertTrue(getVisitor().constantFloatCount == 0); + assertEquals("constantFloatCount", 0, getVisitor().constantFloatCount); } public void testConstantIntegerCount() { - // System.out.println("ConstantIntegerCount = " - // + getVisitor().constantIntegerCount); - assertTrue(getVisitor().constantIntegerCount == 0); + assertEquals("constantIntegerCount", 0, getVisitor().constantIntegerCount); } public void testConstantInterfaceMethodrefCount() { - // System.out.println("ConstantInterfaceMethodrefCount = " - // + getVisitor().constantInterfaceMethodrefCount); - assertTrue(getVisitor().constantInterfaceMethodrefCount == 0); + assertEquals("constantInterfaceMethodrefCount", 0, getVisitor().constantInterfaceMethodrefCount); } public void testConstantLongCount() { - // System.out.println("ConstantLongCount = " - // + getVisitor().constantLongCount); - assertTrue(getVisitor().constantLongCount == 0); + assertEquals("constantLongCount", 0, getVisitor().constantLongCount); } public void testConstantMethodrefCount() { - // System.out.println("ConstantMethodrefCount = " - // + getVisitor().constantMethodrefCount); - assertTrue(getVisitor().constantMethodrefCount == 1); + assertEquals("constantMethodrefCount", 1, getVisitor().constantMethodrefCount); } public void testConstantNameAndTypeCount() { - // System.out.println("ConstantNameAndTypeCount = " - // + getVisitor().constantNameAndTypeCount); - assertTrue(getVisitor().constantNameAndTypeCount == 1); + assertEquals("constantNameAndTypeCount", 1, getVisitor().constantNameAndTypeCount); } public void testConstantPoolCount() { - // System.out.println("ConstantPoolCount = " - // + getVisitor().constantPoolCount); - assertTrue(getVisitor().constantPoolCount == 1); + assertEquals("constantPoolCount", 1, getVisitor().constantPoolCount); } public void testConstantStringCount() { - // System.out.println("ConstantStringCount = " - // + getVisitor().constantStringCount); - assertTrue(getVisitor().constantStringCount == 0); + assertEquals("constantStringCount", 0, getVisitor().constantStringCount); } public void testConstantValueCount() { - // System.out.println("ConstantValueCount = " - // + getVisitor().constantValueCount); - assertTrue(getVisitor().constantValueCount == 0); + assertEquals("constantValueCount", 0, getVisitor().constantValueCount); } - + public void testDeprecatedCount() { - // System.out.println("DeprecatedCount = " + - // getVisitor().deprecatedCount); - assertTrue(getVisitor().deprecatedCount == 0); + assertEquals("deprecatedCount", 0, getVisitor().deprecatedCount); } public void testEnclosingMethodCount() { - // System.out.println("EnclosingMethodCount = " - // + getVisitor().enclosingMethodCount); - assertTrue(getVisitor().enclosingMethodCount == 0); + assertEquals("enclosingMethodCount", 0, getVisitor().enclosingMethodCount); } public void testExceptionTableCount() { - // System.out.println("ExceptionTableCount = " - // + getVisitor().exceptionTableCount); - assertTrue(getVisitor().exceptionTableCount == 0); + assertEquals("exceptionTableCount", 0, getVisitor().exceptionTableCount); } public void testFieldCount() { - // System.out.println("FieldCount = " + getVisitor().fieldCount); - assertTrue(getVisitor().fieldCount == 0); + assertEquals("fieldCount", 0, getVisitor().fieldCount); } public void testInnerClassCount() { - // System.out.println("InnerClassCount = " + - // getVisitor().innerClassCount); - assertTrue(getVisitor().innerClassCount == 0); + assertEquals("innerClassCount", 0, getVisitor().innerClassCount); } public void testInnerClassesCount() { - // System.out.println("InnerClassesCount = " - // + getVisitor().innerClassesCount); - assertTrue(getVisitor().innerClassesCount == 0); + assertEquals("innerClassesCount", 0, getVisitor().innerClassesCount); } public void testJavaClassCount() { - // System.out.println("JavaClassCount = " + - // getVisitor().javaClassCount); - assertTrue(getVisitor().javaClassCount == 1); + assertEquals("javaClassCount", 1, getVisitor().javaClassCount); } public void testLineNumberCount() { - // System.out.println("LineNumberCount = " + - // getVisitor().lineNumberCount); - assertTrue(getVisitor().lineNumberCount == 1); + assertEquals("lineNumberCount", 1, getVisitor().lineNumberCount); } public void testLineNumberTableCount() { - // System.out.println("LineNumberTableCount = " - // + getVisitor().lineNumberTableCount); - assertTrue(getVisitor().lineNumberTableCount == 1); + assertEquals("lineNumberTableCount", 1, getVisitor().lineNumberTableCount); } public void testLocalVariableCount() { - // System.out.println("LocalVariableCount = " - // + getVisitor().localVariableCount); - assertTrue(getVisitor().localVariableCount == 1); + assertEquals("localVariableCount", 1, getVisitor().localVariableCount); } public void testLocalVariableTableCount() { - // System.out.println("LocalVariableTableCount = " - // + getVisitor().localVariableTableCount); - assertTrue(getVisitor().localVariableTableCount == 1); + assertEquals("localVariableTableCount", 1, getVisitor().localVariableTableCount); } public void testLocalVariableTypeTableCount() { - // System.out.println("LocalVariableTypeTableCount = " - // + getVisitor().localVariableTypeTableCount); - assertTrue(getVisitor().localVariableTypeTableCount == 0); + assertEquals("localVariableTypeTableCount", 0, getVisitor().localVariableTypeTableCount); } public void testMethodCount() { - // System.out.println("MethodCount = " + getVisitor().methodCount); - assertTrue(getVisitor().methodCount == 1); + assertEquals("methodCount", 1, getVisitor().methodCount); } public void testParameterAnnotationCount() { - // System.out.println("ParameterAnnotationCount = " - // + getVisitor().methodCount); - assertTrue(getVisitor().methodCount == 1); + assertEquals("parameterAnnotationCount", 0, getVisitor().parameterAnnotationCount); } public void testSignatureCount() { - // System.out.println("SignatureCount = " - // + getVisitor().signatureAnnotationCount); - assertTrue(getVisitor().signatureAnnotationCount == 0); + assertEquals("signatureAnnotationCount", 0, getVisitor().signatureAnnotationCount); } public void testSourceFileCount() { - // System.out.println("SourceFileCount = " + - // getVisitor().sourceFileCount); - assertTrue(getVisitor().sourceFileCount == 1); + assertEquals("sourceFileCount", 1, getVisitor().sourceFileCount); } public void testStackMapCount() { - // System.out.println("StackMapCount = " + getVisitor().stackMapCount); - assertTrue(getVisitor().stackMapCount == 0); + assertEquals("stackMapCount", 0, getVisitor().stackMapCount); } public void testStackMapEntryCount() { - // System.out.println("StackMapEntryCount = " - // + getVisitor().stackMapEntryCount); - assertTrue(getVisitor().stackMapEntryCount == 0); + assertEquals("stackMapEntryCount", 0, getVisitor().stackMapEntryCount); } public void testSyntheticCount() { - // System.out.println("SyntheticCount = " + - // getVisitor().syntheticCount); - assertTrue(getVisitor().syntheticCount == 0); + assertEquals("syntheticCount", 0, getVisitor().syntheticCount); } public void testUnknownCount() { - // System.out.println("UnknownCount = " + getVisitor().unknownCount); - assertTrue(getVisitor().unknownCount == 0); + assertEquals("unknownCount", 0, getVisitor().unknownCount); } -} \ No newline at end of file +} -- GitLab From 31a5522b20d22ddb80f93d7b9b0ccbb6effa8356 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 25 Apr 2014 22:32:22 +0000 Subject: [PATCH 0616/1313] Replaced @since 5.3 with 6.0 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1590171 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/AnnotationDefault.java | 2 +- src/main/java/org/apache/bcel/classfile/AnnotationEntry.java | 2 +- src/main/java/org/apache/bcel/classfile/Annotations.java | 2 +- src/main/java/org/apache/bcel/classfile/ElementValue.java | 2 +- src/main/java/org/apache/bcel/classfile/ElementValuePair.java | 2 +- .../org/apache/bcel/classfile/ParameterAnnotationEntry.java | 2 +- .../java/org/apache/bcel/classfile/ParameterAnnotations.java | 2 +- .../org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java | 2 +- .../bcel/classfile/RuntimeInvisibleParameterAnnotations.java | 2 +- .../org/apache/bcel/classfile/RuntimeVisibleAnnotations.java | 2 +- .../bcel/classfile/RuntimeVisibleParameterAnnotations.java | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index 86adf2fa..9363d326 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -27,7 +27,7 @@ import org.apache.bcel.Constants; * * @version $Id: AnnotationDefault 1 2005-02-13 03:15:08Z dbrosius $ * @author D. Brosius - * @since 5.3 + * @since 6.0 */ public class AnnotationDefault extends Attribute { diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 79beb918..80bff5ad 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -31,7 +31,7 @@ import org.apache.bcel.Constants; * * @version $Id: AnnotationEntry * @author D. Brosius - * @since 5.3 + * @since 6.0 */ public class AnnotationEntry implements Node, Constants, Serializable { diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index ad7d80ba..ac3115c4 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -26,7 +26,7 @@ import java.io.IOException; * * @version $Id: Annotations * @author D. Brosius - * @since 5.3 + * @since 6.0 */ public abstract class Annotations extends Attribute { diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index 2e6a9d42..25907da5 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -24,7 +24,7 @@ import java.io.IOException; /** * @version $Id: ElementValue * @author D. Brosius - * @since 5.3 + * @since 6.0 */ public abstract class ElementValue { diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index 5c20321f..0bfb1160 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -26,7 +26,7 @@ import org.apache.bcel.Constants; * * @version $Id: ElementValuePair * @author D. Brosius - * @since 5.3 + * @since 6.0 */ public class ElementValuePair { diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index b60ba214..f2cd21b8 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -31,7 +31,7 @@ import org.apache.bcel.Constants; * * @version $Id: ParameterAnnotationEntry * @author D. Brosius - * @since 5.3 + * @since 6.0 */ public class ParameterAnnotationEntry implements Node, Constants { diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index abfb6d8f..c4364cd5 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -26,7 +26,7 @@ import java.io.IOException; * * @version $Id: ParameterAnnotations * @author D. Brosius - * @since 5.3 + * @since 6.0 */ public abstract class ParameterAnnotations extends Attribute { diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 283d88a9..e0f3da19 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -28,7 +28,7 @@ import org.apache.bcel.Constants; * * @version $Id: RuntimeInvisibleAnnotations * @author D. Brosius - * @since 5.3 + * @since 6.0 */ public class RuntimeInvisibleAnnotations extends Annotations { diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 74dee7db..299fb395 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -27,7 +27,7 @@ import org.apache.bcel.Constants; * * @version $Id: RuntimeInvisibleParameterAnnotations * @author D. Brosius - * @since 5.3 + * @since 6.0 */ public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index f59a5fa5..8e3a4877 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -28,7 +28,7 @@ import org.apache.bcel.Constants; * * @version $Id: RuntimeVisibleAnnotations * @author D. Brosius - * @since 5.3 + * @since 6.0 */ public class RuntimeVisibleAnnotations extends Annotations { diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index 1ef1709a..d80d077a 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -27,7 +27,7 @@ import org.apache.bcel.Constants; * * @version $Id: RuntimeVisibleParameterAnnotations * @author D. Brosius - * @since 5.3 + * @since 6.0 */ public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { -- GitLab From 083ba6106f9f27ea0c0137e0d35b016559865159 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 25 Apr 2014 22:41:32 +0000 Subject: [PATCH 0617/1313] Release notes for BCEL 6.0 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1590178 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 101 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 85 insertions(+), 16 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index c33dc416..58e7fa9b 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,43 +1,112 @@ -BCEL 5.3 RELEASE NOTES -===================== + Apache Commons BCEL 6.0 RELEASE NOTES + +The Apache Commons team is pleased to announce the release of BCEL 6.0! + +The Byte Code Engineering Library (BCEL) is intended to give users a convenient +way to analyze, create, and manipulate compiled .class files. Classes are +represented by objects containing all the symbolic information of the given +class: methods, fields and byte code instructions. + +BCEL 6.0 is a major release supporting the new features introduced in Java 6, 7 +and 8. It requires Java 5 or higher to run. Compatibility with 5.2 ---------------------- + Binary compatible - Yes -Source compatible - Yes +Source compatible - Yes, except for org.apache.bcel.classfile.Visitor (see below) Semantic compatible - Yes +The org.apache.bcel.classfile.Visitor interface has been enhanced with +additional methods. If you implemented it directly instead of extending +the EmptyVisitor class you'll have to implement the new methods. -Deprecations from 5.2 + +Enhancements from 5.2 --------------------- -public org.apache.bcel.util.ClassVector implements java.io.Serializable +[BCEL-76] Add parent type processing for ClassPath class. +[BCEL-83] Add support for getResource and getResourceAsStream to ClassPath +[BCEL-92] Properly parse StackMapTable attributes in Java 6 classfiles +[BCEL-104] Javadoc overhaul +[BCEL-119] BCEL is unnecessarily slow +[BCEL-157] Add support for INVOKEDYNAMIC and MethodHandles +[BCEL-160] Why using unstable sort at MethodGen.getLocalVariables() ? +[BCEL-163] Incorporate patch file from Findbugs +[BCEL-175] Implement the MethodParameters attribute Bug fixes from 5.2 ------------------ -BCEL-53 - Examples with enum breaks Gump (JDK1.5) - - -Enhancements from 5.2 ---------------------- - -BCEL-55 - Wrap JavaClass repository class (map values) with SoftReferences -BCEL-163 - Incorporate patch file from Findbugs +[BCEL-28] Mistake in "Peephole optimizer" example at http://commons.apache.org/bcel/manual.html +[BCEL-74] BCEL cannot be used as java.system.class.loader +[BCEL-77] XSLT transforms broken in Turkish Locale. +[BCEL-79] java.lang.ClassFormatError: LVTT entry for 'local' in class file org/shiftone/jrat/test/dummy/CrashTestDummy does not match any LVT entry +[BCEL-81] ClassParser.parse() throws NullPointerException if class does not exist and ClassParser(String) constructor is used +[BCEL-85] ArrayOutOfBoundsException in InstructionFinder +[BCEL-87] Website: Incorrect URL for source; version 5.2 is not in the bug page +[BCEL-88] bcelified method doesn't pass verification +[BCEL-89] return type not verified by JustIce +[BCEL-94] @since tag incorrect for Annotation classes in BCEL trunk +[BCEL-95] InstructionFactory missing % operator for Float, Double +[BCEL-96] Fields in Annotations and AnnotationEntry are inaccessible to subclasses +[BCEL-97] Add support for getResources to ClassPath +[BCEL-98] Two source files in repository are empty +[BCEL-99] Maven POM file calls in apache regex but code does not use it +[BCEL-100] ClassParser throws unintelligible Exception +[BCEL-101] verifier raises ....AssertionViolatedException when done against Java5 files with generics/annotations +[BCEL-102] Verifier fails in pass 2 with "Number of LocalVariableTable attributes of Code attribute" on static methods. +[BCEL-107] ParameterAnnotationEntries are read not dumped +[BCEL-108] RuntimeVisible Annotations duplicated +[BCEL-112] ARRAYLENGTH incorrectly not StackConsumer +[BCEL-114] Error in method search() defined in org.apache.bcel.util.InstructionFinder +[BCEL-115] Deleting all instructions of a list shows wrong behaviour +[BCEL-120] Make BCEL JAR OSGi compatible +[BCEL-122] ArrayIndexOutOfBoundsException thrown from TABLESWITCH.initFromFile +[BCEL-124] tableswitch/lookupswitch invalid alignment of 4-byte operands +[BCEL-125] Incorrect size calculation in InstructionFinder +[BCEL-130] Class files containing "ParameterAnnotations" are dumped incorrectly +[BCEL-131] Class files containing "StackMapTable" attributes (on method code) are dumped incorrectly +[BCEL-132] org.apache.bcel.classfile.ClassParser: NullPointerException caused by fileopen failed +[BCEL-133] org.apache.bcel.classfile.ClassParser: NullPointerException caused by invalid filename +[BCEL-134] ExecutionVisitor doesn't support Class constant type for LDC and LDC_W +[BCEL-135] BCELifier issue: BCELFactory fails to handle float and long constants +[BCEL-137] "Invalid method signature: TT;" when using MethodGen for a method having a generic parameter +[BCEL-138] FieldInstruction.getFieldSize() doesn't decode Type.getTypeSize() output +[BCEL-140] org.apache.bcel.generic.Instruction.equals(Object) does not follow Object.equals(Object) rules +[BCEL-141] Select instructions should implement StackConsumer instead of StackProducer +[BCEL-143] Fix CPL License issues with EnclosingMethod.java and LocalVariableTypeTable.java +[BCEL-145] Type.getReturnTypeSize() doesn't decode Type.getTypeSize() output +[BCEL-146] SyntheticRepository.loadClass() fails to close the inputStream +[BCEL-148] BCELifier produces incorrect code for methods containing loads of class literals from constant pool +[BCEL-151] Code attribute size not updated +[BCEL-152] Incorrect link for Jasmin assembler language +[BCEL-153] Examples not present in source or binary downloads +[BCEL-154] ClassParser.parse() generates NPE if it cannot open the file +[BCEL-155] InstConstraintVisitor does not handle class constants +[BCEL-156] Pass3bVerifier crashes on empty methods +[BCEL-159] LocalVariableGen.getLocalVariable() computes incorrect length +[BCEL-164] Method does not have a method to access parameter annotations +[BCEL-167] ClassPath.getResource does not correctly perform URL escaping +[BCEL-173] ClassParser fails to parse JDK classes in Java 8: ClassFormatException: Invalid byte tag in constant pool +[BCEL-174] Verification of interfaces with default methods fails with Java 8 Feedback -------- + Open source works best when you give feedback: -http://commons.apache.org/bcel + + http://commons.apache.org/bcel Please direct all bug reports to JIRA: -https://issues.apache.org/jira/browse/BCEL + + https://issues.apache.org/jira/browse/BCEL Or subscribe to the commons-user mailing list -The BCEL Team +The Apache Commons Team -- GitLab From 91d2e419ce8c1e4ab731a9372c6a3946325c351d Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 25 Apr 2014 22:45:58 +0000 Subject: [PATCH 0618/1313] Enabled calls to visitAnnotationDefault, visitAnnotationEntry and visitParameterAnnotation git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1590182 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/AnnotationDefault.java | 2 +- src/main/java/org/apache/bcel/classfile/AnnotationEntry.java | 2 +- .../java/org/apache/bcel/classfile/ParameterAnnotations.java | 2 +- src/test/java/org/apache/bcel/CounterVisitorTestCase.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index 9363d326..5dc8e842 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -81,7 +81,7 @@ public class AnnotationDefault extends Attribute @Override public void accept(Visitor v) { - // v.visitAnnotationDefault(this); + v.visitAnnotationDefault(this); } /** diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 80bff5ad..04f69312 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -89,7 +89,7 @@ public class AnnotationEntry implements Node, Constants, Serializable { * @param v Visitor object */ public void accept(Visitor v) { - // v.visitAnnotationEntry(this); + v.visitAnnotationEntry(this); } /** diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index c4364cd5..a8473728 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -77,7 +77,7 @@ public abstract class ParameterAnnotations extends Attribute { */ @Override public void accept( Visitor v ) { - // v.visitParameterAnnotation(this); + v.visitParameterAnnotation(this); } diff --git a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java index 864e486b..ddf5eae3 100644 --- a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java +++ b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java @@ -40,7 +40,7 @@ public class CounterVisitorTestCase extends AbstractCounterVisitorTestCase public void testAnnotationEntryCount() { - assertEquals("annotationEntryCount", 0, getVisitor().annotationEntryCount); + assertEquals("annotationEntryCount", 2, getVisitor().annotationEntryCount); } public void testCodeCount() -- GitLab From 3e9d38dc0000bce51c90e380029b19d8ce333ac3 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 30 May 2014 22:03:26 +0000 Subject: [PATCH 0619/1313] resource leak git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1598759 13f79535-47bb-0310-9956-ffa450edef68 --- src/test/java/org/apache/bcel/PerformanceTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java index 2676b85f..be128865 100644 --- a/src/test/java/org/apache/bcel/PerformanceTest.java +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -115,6 +115,7 @@ public final class PerformanceTest extends TestCase { } } + jar.close(); total.stop(); System.out.println("ClassParser.parse: " + parseTime); System.out.println("ClassGen.init: " + cgenTime); -- GitLab From fd663802595f71b2ae9d64695ce9029cbfccd56c Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 30 May 2014 22:07:27 +0000 Subject: [PATCH 0620/1313] Unused git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1598760 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/GeneratingAnnotatedClassesTestCase.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java index 0d3012f4..64442c94 100644 --- a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java @@ -106,8 +106,6 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase AnnotationEntry[] as = jc.getAnnotationEntries(); assertTrue("Should be two AnnotationEntries but found " + as.length, as.length == 2); - AnnotationEntry one = as[0]; - AnnotationEntry two = as[1]; // TODO L??; assertTrue( "Name of annotation 1 should be LSimpleAnnotation; but it is " -- GitLab From 0bccef9117c0f0ccee3d5c7292d8100bc82009bb Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 30 May 2014 22:51:27 +0000 Subject: [PATCH 0621/1313] Tab police git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1598766 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 32 +- .../bcel/classfile/ArrayElementValue.java | 98 +- .../org/apache/bcel/classfile/Attribute.java | 504 +- .../bcel/classfile/ClassElementValue.java | 60 +- .../bcel/classfile/ClassFormatException.java | 4 +- .../apache/bcel/classfile/ClassParser.java | 4 +- .../bcel/classfile/DescendingVisitor.java | 802 +-- .../apache/bcel/classfile/ElementValue.java | 216 +- .../bcel/classfile/ElementValuePair.java | 72 +- .../apache/bcel/classfile/EmptyVisitor.java | 246 +- .../bcel/classfile/EnclosingMethod.java | 106 +- .../bcel/classfile/EnumElementValue.java | 88 +- .../apache/bcel/classfile/FieldOrMethod.java | 140 +- .../org/apache/bcel/classfile/JavaClass.java | 96 +- .../classfile/LocalVariableTypeTable.java | 26 +- .../bcel/classfile/MethodParameter.java | 2 +- .../bcel/classfile/MethodParameters.java | 6 +- .../bcel/classfile/ParameterAnnotations.java | 2 +- .../RuntimeInvisibleAnnotations.java | 60 +- .../classfile/RuntimeVisibleAnnotations.java | 60 +- .../bcel/classfile/SimpleElementValue.java | 332 +- .../bcel/classfile/StackMapTableEntry.java | 104 +- .../org/apache/bcel/classfile/Utility.java | 246 +- .../org/apache/bcel/classfile/Visitor.java | 82 +- .../generic/AnnotationElementValueGen.java | 84 +- .../bcel/generic/AnnotationEntryGen.java | 314 +- .../bcel/generic/ArrayElementValueGen.java | 158 +- .../bcel/generic/ClassElementValueGen.java | 116 +- .../org/apache/bcel/generic/ClassGen.java | 72 +- .../bcel/generic/ClassGenException.java | 4 +- .../apache/bcel/generic/ConstantPoolGen.java | 18 +- .../apache/bcel/generic/ElementValueGen.java | 302 +- .../bcel/generic/ElementValuePairGen.java | 142 +- .../org/apache/bcel/generic/EmptyVisitor.java | 8 +- .../bcel/generic/EnumElementValueGen.java | 192 +- .../org/apache/bcel/generic/FieldGen.java | 18 +- .../bcel/generic/FieldGenOrMethodGen.java | 32 +- .../apache/bcel/generic/FieldInstruction.java | 2 +- .../apache/bcel/generic/INVOKEDYNAMIC.java | 12 +- .../org/apache/bcel/generic/Instruction.java | 610 +- .../bcel/generic/InstructionFactory.java | 6 +- .../apache/bcel/generic/InstructionList.java | 4 +- .../bcel/generic/InvokeInstruction.java | 6 +- .../apache/bcel/generic/JsrInstruction.java | 2 +- .../java/org/apache/bcel/generic/LDC.java | 6 +- .../org/apache/bcel/generic/MethodGen.java | 200 +- .../generic/NameSignatureInstruction.java | 60 +- .../bcel/generic/SimpleElementValueGen.java | 410 +- .../bcel/generic/TargetLostException.java | 10 +- .../java/org/apache/bcel/generic/Type.java | 44 +- .../generic/VisitorSupportsInvokeDynamic.java | 4 +- .../java/org/apache/bcel/util/Class2HTML.java | 2 +- .../java/org/apache/bcel/util/ClassPath.java | 22 +- .../apache/bcel/util/InstructionFinder.java | 142 +- .../apache/bcel/util/SyntheticRepository.java | 46 +- .../exc/AssertionViolatedException.java | 94 +- .../exc/ClassConstraintException.java | 40 +- .../verifier/exc/CodeConstraintException.java | 24 +- .../verifier/exc/InvalidMethodException.java | 10 +- .../bcel/verifier/exc/LoadingException.java | 26 +- ...ocalVariableInfoInconsistentException.java | 26 +- .../exc/StaticCodeConstraintException.java | 6 +- ...ticCodeInstructionConstraintException.java | 6 +- ...InstructionOperandConstraintException.java | 6 +- .../StructuralCodeConstraintException.java | 24 +- .../org/apache/bcel/verifier/exc/Utility.java | 18 +- .../verifier/exc/VerificationException.java | 38 +- .../VerifierConstraintViolatedException.java | 84 +- .../bcel/verifier/statics/DOUBLE_Upper.java | 20 +- .../apache/bcel/verifier/statics/IntList.java | 38 +- .../bcel/verifier/statics/LONG_Upper.java | 20 +- .../verifier/statics/LocalVariableInfo.java | 138 +- .../verifier/statics/LocalVariablesInfo.java | 66 +- .../bcel/verifier/statics/Pass1Verifier.java | 276 +- .../bcel/verifier/statics/Pass2Verifier.java | 2322 ++++---- .../bcel/verifier/statics/Pass3aVerifier.java | 2132 +++---- .../structurals/ControlFlowGraph.java | 790 +-- .../structurals/ExceptionHandler.java | 44 +- .../structurals/ExceptionHandlers.java | 74 +- .../structurals/ExecutionVisitor.java | 2004 +++---- .../bcel/verifier/structurals/Frame.java | 170 +- .../verifier/structurals/GenericArray.java | 8 +- .../structurals/InstConstraintVisitor.java | 5192 ++++++++--------- .../structurals/InstructionContext.java | 132 +- .../verifier/structurals/LocalVariables.java | 336 +- .../verifier/structurals/OperandStack.java | 392 +- .../verifier/structurals/Pass3bVerifier.java | 604 +- .../bcel/verifier/structurals/Subroutine.java | 108 +- .../verifier/structurals/Subroutines.java | 1188 ++-- .../structurals/UninitializedObjectType.java | 54 +- .../bcel/AbstractCounterVisitorTestCase.java | 32 +- .../org/apache/bcel/AbstractTestCase.java | 250 +- .../bcel/AnnotationAccessFlagTestCase.java | 32 +- .../AnnotationDefaultAttributeTestCase.java | 34 +- .../apache/bcel/AnnotationGenTestCase.java | 248 +- .../apache/bcel/AnonymousClassTestCase.java | 60 +- .../apache/bcel/CounterVisitorTestCase.java | 378 +- .../apache/bcel/ElementValueGenTestCase.java | 382 +- .../EnclosingMethodAttributeTestCase.java | 148 +- .../apache/bcel/EnumAccessFlagTestCase.java | 32 +- .../apache/bcel/FieldAnnotationsTestCase.java | 226 +- .../bcel/InstructionFinderTestCase.java | 60 +- src/test/java/org/apache/bcel/NanoTimer.java | 40 +- .../java/org/apache/bcel/PerformanceTest.java | 188 +- .../org/apache/bcel/data/SimpleClass.java | 8 +- .../bcel/util/InstructionFinderTest.java | 28 +- .../bcel/verifier/VerifierTestCase.java | 6 +- .../apache/bcel/visitors/CounterVisitor.java | 484 +- 108 files changed, 12791 insertions(+), 12791 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 1cdc9b0f..d62c5b1c 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -1423,26 +1423,26 @@ public interface Constants { /** Attributes and their corresponding names. */ - public static final byte ATTR_UNKNOWN = -1; - public static final byte ATTR_SOURCE_FILE = 0; - public static final byte ATTR_CONSTANT_VALUE = 1; - public static final byte ATTR_CODE = 2; - public static final byte ATTR_EXCEPTIONS = 3; - public static final byte ATTR_LINE_NUMBER_TABLE = 4; - public static final byte ATTR_LOCAL_VARIABLE_TABLE = 5; - public static final byte ATTR_INNER_CLASSES = 6; - public static final byte ATTR_SYNTHETIC = 7; - public static final byte ATTR_DEPRECATED = 8; - public static final byte ATTR_PMG = 9; - public static final byte ATTR_SIGNATURE = 10; - public static final byte ATTR_STACK_MAP = 11; - public static final byte ATTR_RUNTIME_VISIBLE_ANNOTATIONS = 12; + public static final byte ATTR_UNKNOWN = -1; + public static final byte ATTR_SOURCE_FILE = 0; + public static final byte ATTR_CONSTANT_VALUE = 1; + public static final byte ATTR_CODE = 2; + public static final byte ATTR_EXCEPTIONS = 3; + public static final byte ATTR_LINE_NUMBER_TABLE = 4; + public static final byte ATTR_LOCAL_VARIABLE_TABLE = 5; + public static final byte ATTR_INNER_CLASSES = 6; + public static final byte ATTR_SYNTHETIC = 7; + public static final byte ATTR_DEPRECATED = 8; + public static final byte ATTR_PMG = 9; + public static final byte ATTR_SIGNATURE = 10; + public static final byte ATTR_STACK_MAP = 11; + public static final byte ATTR_RUNTIME_VISIBLE_ANNOTATIONS = 12; public static final byte ATTR_RUNTIME_INVISIBLE_ANNOTATIONS = 13; - public static final byte ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS = 14; + public static final byte ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS = 14; public static final byte ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS = 15; public static final byte ATTR_ANNOTATION_DEFAULT = 16; public static final byte ATTR_LOCAL_VARIABLE_TYPE_TABLE = 17; - public static final byte ATTR_ENCLOSING_METHOD = 18; + public static final byte ATTR_ENCLOSING_METHOD = 18; public static final byte ATTR_STACK_MAP_TABLE = 19; public static final byte ATTR_BOOTSTRAP_METHODS = 20; public static final byte ATTR_METHOD_PARAMETERS = 21; diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java index 7b2d2e2b..eb9d657a 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -22,68 +22,68 @@ import java.io.IOException; public class ArrayElementValue extends ElementValue { - // For array types, this is the array - private ElementValue[] evalues; + // For array types, this is the array + private ElementValue[] evalues; - @Override + @Override public String toString() - { - StringBuilder sb = new StringBuilder(); - sb.append("{"); - for (int i = 0; i < evalues.length; i++) - { - sb.append(evalues[i].toString()); - if ((i + 1) < evalues.length) { + { + StringBuilder sb = new StringBuilder(); + sb.append("{"); + for (int i = 0; i < evalues.length; i++) + { + sb.append(evalues[i].toString()); + if ((i + 1) < evalues.length) { sb.append(","); } - } - sb.append("}"); - return sb.toString(); - } + } + sb.append("}"); + return sb.toString(); + } - public ArrayElementValue(int type, ElementValue[] datums, ConstantPool cpool) - { - super(type, cpool); - if (type != ARRAY) { + public ArrayElementValue(int type, ElementValue[] datums, ConstantPool cpool) + { + super(type, cpool); + if (type != ARRAY) { throw new RuntimeException( - "Only element values of type array can be built with this ctor - type specified: " + type); + "Only element values of type array can be built with this ctor - type specified: " + type); } - this.evalues = datums; - } + this.evalues = datums; + } - @Override + @Override public void dump(DataOutputStream dos) throws IOException - { - dos.writeByte(type); // u1 type of value (ARRAY == '[') - dos.writeShort(evalues.length); - for (ElementValue evalue : evalues) { - evalue.dump(dos); - } - } + { + dos.writeByte(type); // u1 type of value (ARRAY == '[') + dos.writeShort(evalues.length); + for (ElementValue evalue : evalues) { + evalue.dump(dos); + } + } - @Override + @Override public String stringifyValue() - { - StringBuilder sb = new StringBuilder(); - sb.append("["); - for (int i = 0; i < evalues.length; i++) - { - sb.append(evalues[i].stringifyValue()); - if ((i + 1) < evalues.length) { + { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < evalues.length; i++) + { + sb.append(evalues[i].stringifyValue()); + if ((i + 1) < evalues.length) { sb.append(","); } - } - sb.append("]"); - return sb.toString(); - } + } + sb.append("]"); + return sb.toString(); + } - public ElementValue[] getElementValuesArray() - { - return evalues; - } + public ElementValue[] getElementValuesArray() + { + return evalues; + } - public int getElementValuesArraySize() - { - return evalues.length; - } + public int getElementValuesArraySize() + { + return evalues.length; + } } diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index dba12e20..e9b879a3 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -50,283 +50,283 @@ import org.apache.bcel.classfile.ConstantUtf8; */ public abstract class Attribute implements Cloneable, Node, Serializable { - private static final long serialVersionUID = -1707826820310002955L; + private static final long serialVersionUID = -1707826820310002955L; protected int name_index; // Points to attribute name in constant pool - protected int length; // Content length of attribute field + protected int length; // Content length of attribute field - protected byte tag; // Tag to distiguish subclasses + protected byte tag; // Tag to distiguish subclasses - protected ConstantPool constant_pool; + protected ConstantPool constant_pool; - protected Attribute(byte tag, int name_index, int length, - ConstantPool constant_pool) - { - this.tag = tag; - this.name_index = name_index; - this.length = length; - this.constant_pool = constant_pool; - } + protected Attribute(byte tag, int name_index, int length, + ConstantPool constant_pool) + { + this.tag = tag; + this.name_index = name_index; + this.length = length; + this.constant_pool = constant_pool; + } - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - public abstract void accept(Visitor v); + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v + * Visitor object + */ + public abstract void accept(Visitor v); - /** - * Dump attribute to file stream in binary format. - * - * @param file - * Output file stream - * @throws IOException - */ - public void dump(DataOutputStream file) throws IOException - { - file.writeShort(name_index); - file.writeInt(length); - } + /** + * Dump attribute to file stream in binary format. + * + * @param file + * Output file stream + * @throws IOException + */ + public void dump(DataOutputStream file) throws IOException + { + file.writeShort(name_index); + file.writeInt(length); + } - private static final Map readers = new HashMap(); + private static final Map readers = new HashMap(); - /** - * Add an Attribute reader capable of parsing (user-defined) attributes - * named "name". You should not add readers for the standard attributes such - * as "LineNumberTable", because those are handled internally. - * - * @param name - * the name of the attribute as stored in the class file - * @param r - * the reader object - */ - public static void addAttributeReader(String name, AttributeReader r) - { - readers.put(name, r); - } + /** + * Add an Attribute reader capable of parsing (user-defined) attributes + * named "name". You should not add readers for the standard attributes such + * as "LineNumberTable", because those are handled internally. + * + * @param name + * the name of the attribute as stored in the class file + * @param r + * the reader object + */ + public static void addAttributeReader(String name, AttributeReader r) + { + readers.put(name, r); + } - /** - * Remove attribute reader - * - * @param name - * the name of the attribute as stored in the class file - */ - public static void removeAttributeReader(String name) - { - readers.remove(name); - } + /** + * Remove attribute reader + * + * @param name + * the name of the attribute as stored in the class file + */ + public static void removeAttributeReader(String name) + { + readers.remove(name); + } - /* - * Class method reads one attribute from the input data stream. This method - * must not be accessible from the outside. It is called by the Field and - * Method constructor methods. - * - * @see Field - * @see Method @param file Input stream @param constant_pool Array of - * constants @return Attribute @throws IOException @throws - * ClassFormatException - */ - public static Attribute readAttribute(DataInputStream file, - ConstantPool constant_pool) throws IOException, - ClassFormatException - { - ConstantUtf8 c; - String name; - int name_index; - int length; - byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute - // Get class name from constant pool via `name_index' indirection - name_index = file.readUnsignedShort(); - c = (ConstantUtf8) constant_pool.getConstant(name_index, - Constants.CONSTANT_Utf8); - name = c.getBytes(); - // Length of data in bytes - length = file.readInt(); - // Compare strings to find known attribute - // System.out.println(name); - for (byte i = 0; i < Constants.KNOWN_ATTRIBUTES; i++) - { - if (name.equals(Constants.ATTRIBUTE_NAMES[i])) - { - tag = i; // found! - break; - } - } - // Call proper constructor, depending on `tag' - switch (tag) - { - case Constants.ATTR_UNKNOWN: - AttributeReader r = readers.get(name); - if (r != null) - { - return r.createAttribute(name_index, length, file, - constant_pool); - } - return new Unknown(name_index, length, file, constant_pool); - case Constants.ATTR_CONSTANT_VALUE: - return new ConstantValue(name_index, length, file, constant_pool); - case Constants.ATTR_SOURCE_FILE: - return new SourceFile(name_index, length, file, constant_pool); - case Constants.ATTR_CODE: - return new Code(name_index, length, file, constant_pool); - case Constants.ATTR_EXCEPTIONS: - return new ExceptionTable(name_index, length, file, constant_pool); - case Constants.ATTR_LINE_NUMBER_TABLE: - return new LineNumberTable(name_index, length, file, constant_pool); - case Constants.ATTR_LOCAL_VARIABLE_TABLE: - return new LocalVariableTable(name_index, length, file, - constant_pool); - case Constants.ATTR_INNER_CLASSES: - return new InnerClasses(name_index, length, file, constant_pool); - case Constants.ATTR_SYNTHETIC: - return new Synthetic(name_index, length, file, constant_pool); - case Constants.ATTR_DEPRECATED: - return new Deprecated(name_index, length, file, constant_pool); - case Constants.ATTR_PMG: - return new PMGClass(name_index, length, file, constant_pool); - case Constants.ATTR_SIGNATURE: - return new Signature(name_index, length, file, constant_pool); - case Constants.ATTR_STACK_MAP: - return new StackMap(name_index, length, file, constant_pool); - case Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS: - return new RuntimeVisibleAnnotations(name_index, length, file, - constant_pool); - case Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS: - return new RuntimeInvisibleAnnotations(name_index, length, file, - constant_pool); - case Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS: - return new RuntimeVisibleParameterAnnotations(name_index, length, - file, constant_pool); - case Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS: - return new RuntimeInvisibleParameterAnnotations(name_index, length, - file, constant_pool); - case Constants.ATTR_ANNOTATION_DEFAULT: - return new AnnotationDefault(name_index, length, file, - constant_pool); - case Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE: - return new LocalVariableTypeTable(name_index, length, file, - constant_pool); - case Constants.ATTR_ENCLOSING_METHOD: - return new EnclosingMethod(name_index, length, file, constant_pool); - case Constants.ATTR_STACK_MAP_TABLE: - return new StackMapTable(name_index, length, file, constant_pool); - case Constants.ATTR_BOOTSTRAP_METHODS: - return new BootstrapMethods(name_index, length, file, constant_pool); + /* + * Class method reads one attribute from the input data stream. This method + * must not be accessible from the outside. It is called by the Field and + * Method constructor methods. + * + * @see Field + * @see Method @param file Input stream @param constant_pool Array of + * constants @return Attribute @throws IOException @throws + * ClassFormatException + */ + public static Attribute readAttribute(DataInputStream file, + ConstantPool constant_pool) throws IOException, + ClassFormatException + { + ConstantUtf8 c; + String name; + int name_index; + int length; + byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute + // Get class name from constant pool via `name_index' indirection + name_index = file.readUnsignedShort(); + c = (ConstantUtf8) constant_pool.getConstant(name_index, + Constants.CONSTANT_Utf8); + name = c.getBytes(); + // Length of data in bytes + length = file.readInt(); + // Compare strings to find known attribute + // System.out.println(name); + for (byte i = 0; i < Constants.KNOWN_ATTRIBUTES; i++) + { + if (name.equals(Constants.ATTRIBUTE_NAMES[i])) + { + tag = i; // found! + break; + } + } + // Call proper constructor, depending on `tag' + switch (tag) + { + case Constants.ATTR_UNKNOWN: + AttributeReader r = readers.get(name); + if (r != null) + { + return r.createAttribute(name_index, length, file, + constant_pool); + } + return new Unknown(name_index, length, file, constant_pool); + case Constants.ATTR_CONSTANT_VALUE: + return new ConstantValue(name_index, length, file, constant_pool); + case Constants.ATTR_SOURCE_FILE: + return new SourceFile(name_index, length, file, constant_pool); + case Constants.ATTR_CODE: + return new Code(name_index, length, file, constant_pool); + case Constants.ATTR_EXCEPTIONS: + return new ExceptionTable(name_index, length, file, constant_pool); + case Constants.ATTR_LINE_NUMBER_TABLE: + return new LineNumberTable(name_index, length, file, constant_pool); + case Constants.ATTR_LOCAL_VARIABLE_TABLE: + return new LocalVariableTable(name_index, length, file, + constant_pool); + case Constants.ATTR_INNER_CLASSES: + return new InnerClasses(name_index, length, file, constant_pool); + case Constants.ATTR_SYNTHETIC: + return new Synthetic(name_index, length, file, constant_pool); + case Constants.ATTR_DEPRECATED: + return new Deprecated(name_index, length, file, constant_pool); + case Constants.ATTR_PMG: + return new PMGClass(name_index, length, file, constant_pool); + case Constants.ATTR_SIGNATURE: + return new Signature(name_index, length, file, constant_pool); + case Constants.ATTR_STACK_MAP: + return new StackMap(name_index, length, file, constant_pool); + case Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS: + return new RuntimeVisibleAnnotations(name_index, length, file, + constant_pool); + case Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS: + return new RuntimeInvisibleAnnotations(name_index, length, file, + constant_pool); + case Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS: + return new RuntimeVisibleParameterAnnotations(name_index, length, + file, constant_pool); + case Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS: + return new RuntimeInvisibleParameterAnnotations(name_index, length, + file, constant_pool); + case Constants.ATTR_ANNOTATION_DEFAULT: + return new AnnotationDefault(name_index, length, file, + constant_pool); + case Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE: + return new LocalVariableTypeTable(name_index, length, file, + constant_pool); + case Constants.ATTR_ENCLOSING_METHOD: + return new EnclosingMethod(name_index, length, file, constant_pool); + case Constants.ATTR_STACK_MAP_TABLE: + return new StackMapTable(name_index, length, file, constant_pool); + case Constants.ATTR_BOOTSTRAP_METHODS: + return new BootstrapMethods(name_index, length, file, constant_pool); case Constants.ATTR_METHOD_PARAMETERS: return new MethodParameters(name_index, length, file, constant_pool); - default: // Never reached - throw new IllegalStateException("Unrecognized attribute type tag parsed: " + tag); - } - } + default: // Never reached + throw new IllegalStateException("Unrecognized attribute type tag parsed: " + tag); + } + } - /** - * @return Name of attribute - */ - public String getName() - { - ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, - Constants.CONSTANT_Utf8); - return c.getBytes(); - } + /** + * @return Name of attribute + */ + public String getName() + { + ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } - /** - * @return Length of attribute field in bytes. - */ - public final int getLength() - { - return length; - } + /** + * @return Length of attribute field in bytes. + */ + public final int getLength() + { + return length; + } - /** - * @param length - * length in bytes. - */ - public final void setLength(int length) - { - this.length = length; - } + /** + * @param length + * length in bytes. + */ + public final void setLength(int length) + { + this.length = length; + } - /** - * @param name_index - * of attribute. - */ - public final void setNameIndex(int name_index) - { - this.name_index = name_index; - } + /** + * @param name_index + * of attribute. + */ + public final void setNameIndex(int name_index) + { + this.name_index = name_index; + } - /** - * @return Name index in constant pool of attribute name. - */ - public final int getNameIndex() - { - return name_index; - } + /** + * @return Name index in constant pool of attribute name. + */ + public final int getNameIndex() + { + return name_index; + } - /** - * @return Tag of attribute, i.e., its type. Value may not be altered, thus - * there is no setTag() method. - */ - public final byte getTag() - { - return tag; - } + /** + * @return Tag of attribute, i.e., its type. Value may not be altered, thus + * there is no setTag() method. + */ + public final byte getTag() + { + return tag; + } - /** - * @return Constant pool used by this object. - * @see ConstantPool - */ - public final ConstantPool getConstantPool() - { - return constant_pool; - } + /** + * @return Constant pool used by this object. + * @see ConstantPool + */ + public final ConstantPool getConstantPool() + { + return constant_pool; + } - /** - * @param constant_pool - * Constant pool to be used for this object. - * @see ConstantPool - */ - public final void setConstantPool(ConstantPool constant_pool) - { - this.constant_pool = constant_pool; - } + /** + * @param constant_pool + * Constant pool to be used for this object. + * @see ConstantPool + */ + public final void setConstantPool(ConstantPool constant_pool) + { + this.constant_pool = constant_pool; + } - /** - * Use copy() if you want to have a deep copy(), i.e., with all references - * copied correctly. - * - * @return shallow copy of this attribute - */ - @Override + /** + * Use copy() if you want to have a deep copy(), i.e., with all references + * copied correctly. + * + * @return shallow copy of this attribute + */ + @Override public Object clone() - { - Attribute attr = null; - try - { - attr = (Attribute) super.clone(); - } - catch (CloneNotSupportedException e) - { - throw new Error("Clone Not Supported"); // never happens - } - return attr; - } + { + Attribute attr = null; + try + { + attr = (Attribute) super.clone(); + } + catch (CloneNotSupportedException e) + { + throw new Error("Clone Not Supported"); // never happens + } + return attr; + } - /** - * @return deep copy of this attribute - */ - public abstract Attribute copy(ConstantPool _constant_pool); + /** + * @return deep copy of this attribute + */ + public abstract Attribute copy(ConstantPool _constant_pool); - /** - * @return attribute name. - */ - @Override + /** + * @return attribute name. + */ + @Override public String toString() - { - return Constants.ATTRIBUTE_NAMES[tag]; - } + { + return Constants.ATTRIBUTE_NAMES[tag]; + } } diff --git a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java index 2d6cb290..006d86cb 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java @@ -23,41 +23,41 @@ import org.apache.bcel.Constants; public class ClassElementValue extends ElementValue { - // For primitive types and string type, this points to the value entry in - // the cpool - // For 'class' this points to the class entry in the cpool - private int idx; + // For primitive types and string type, this points to the value entry in + // the cpool + // For 'class' this points to the class entry in the cpool + private int idx; - public ClassElementValue(int type, int idx, ConstantPool cpool) - { - super(type, cpool); - this.idx = idx; - } + public ClassElementValue(int type, int idx, ConstantPool cpool) + { + super(type, cpool); + this.idx = idx; + } - public int getIndex() - { - return idx; - } + public int getIndex() + { + return idx; + } - public String getClassString() - { - ConstantUtf8 c = (ConstantUtf8) cpool.getConstant(idx, - Constants.CONSTANT_Utf8); - return c.getBytes(); - } + public String getClassString() + { + ConstantUtf8 c = (ConstantUtf8) cpool.getConstant(idx, + Constants.CONSTANT_Utf8); + return c.getBytes(); + } - @Override + @Override public String stringifyValue() - { - ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(idx, - Constants.CONSTANT_Utf8); - return cu8.getBytes(); - } + { + ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(idx, + Constants.CONSTANT_Utf8); + return cu8.getBytes(); + } - @Override + @Override public void dump(DataOutputStream dos) throws IOException - { - dos.writeByte(type); // u1 kind of value - dos.writeShort(idx); - } + { + dos.writeByte(type); // u1 kind of value + dos.writeShort(idx); + } } diff --git a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java index 7f917263..07f8c20c 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java +++ b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java @@ -37,8 +37,8 @@ public class ClassFormatException extends RuntimeException { public ClassFormatException(String s) { super(s); } - + public ClassFormatException(String s, Throwable initCause) { - super(s, initCause); + super(s, initCause); } } diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 339bce0f..5e79efe2 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -121,11 +121,11 @@ public final class ClassParser { if (is_zip) { zip = new ZipFile(zip_file); ZipEntry entry = zip.getEntry(file_name); - + if (entry == null) { throw new IOException("File " + file_name + " not found"); } - + file = new DataInputStream(new BufferedInputStream(zip.getInputStream(entry), BUFSIZE)); } else { diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index 0dbd0ae4..a8c9dd55 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -29,407 +29,407 @@ import java.util.Stack; */ public class DescendingVisitor implements Visitor { - private JavaClass clazz; - - private Visitor visitor; - - private Stack stack = new Stack(); - - /** - * @return container of current entitity, i.e., predecessor during traversal - */ - public Object predecessor() - { - return predecessor(0); - } - - /** - * @param level - * nesting level, i.e., 0 returns the direct predecessor - * @return container of current entitity, i.e., predecessor during traversal - */ - public Object predecessor(int level) - { - int size = stack.size(); - if ((size < 2) || (level < 0)) - { - return null; - } - else - { - return stack.elementAt(size - (level + 2)); // size - 1 == current - } - } - - /** - * @return current object - */ - public Object current() - { - return stack.peek(); - } - - /** - * @param clazz - * Class to traverse - * @param visitor - * visitor object to apply to all components - */ - public DescendingVisitor(JavaClass clazz, Visitor visitor) - { - this.clazz = clazz; - this.visitor = visitor; - } - - /** - * Start traversal. - */ - public void visit() - { - clazz.accept(this); - } - - public void visitJavaClass(JavaClass _clazz) - { - stack.push(_clazz); - _clazz.accept(visitor); - Field[] fields = _clazz.getFields(); - for (Field field : fields) { - field.accept(this); - } - Method[] methods = _clazz.getMethods(); - for (Method method : methods) { - method.accept(this); - } - Attribute[] attributes = _clazz.getAttributes(); - for (Attribute attribute : attributes) { - attribute.accept(this); - } - _clazz.getConstantPool().accept(this); - stack.pop(); - } - - public void visitAnnotation(Annotations annotation) - { - stack.push(annotation); - annotation.accept(visitor); - AnnotationEntry[] entries = annotation.getAnnotationEntries(); - for (AnnotationEntry entrie : entries) { - entrie.accept(this); - } - stack.pop(); - } - - public void visitAnnotationEntry(AnnotationEntry annotationEntry) - { - stack.push(annotationEntry); - annotationEntry.accept(visitor); - stack.pop(); - } - - public void visitField(Field field) - { - stack.push(field); - field.accept(visitor); - Attribute[] attributes = field.getAttributes(); - for (Attribute attribute : attributes) { - attribute.accept(this); - } - stack.pop(); - } - - public void visitConstantValue(ConstantValue cv) - { - stack.push(cv); - cv.accept(visitor); - stack.pop(); - } - - public void visitMethod(Method method) - { - stack.push(method); - method.accept(visitor); - Attribute[] attributes = method.getAttributes(); - for (Attribute attribute : attributes) { - attribute.accept(this); - } - stack.pop(); - } - - public void visitExceptionTable(ExceptionTable table) - { - stack.push(table); - table.accept(visitor); - stack.pop(); - } - - public void visitCode(Code code) - { - stack.push(code); - code.accept(visitor); - CodeException[] table = code.getExceptionTable(); - for (CodeException element : table) { - element.accept(this); - } - Attribute[] attributes = code.getAttributes(); - for (Attribute attribute : attributes) { - attribute.accept(this); - } - stack.pop(); - } - - public void visitCodeException(CodeException ce) - { - stack.push(ce); - ce.accept(visitor); - stack.pop(); - } - - public void visitLineNumberTable(LineNumberTable table) - { - stack.push(table); - table.accept(visitor); - LineNumber[] numbers = table.getLineNumberTable(); - for (LineNumber number : numbers) { - number.accept(this); - } - stack.pop(); - } - - public void visitLineNumber(LineNumber number) - { - stack.push(number); - number.accept(visitor); - stack.pop(); - } - - public void visitLocalVariableTable(LocalVariableTable table) - { - stack.push(table); - table.accept(visitor); - LocalVariable[] vars = table.getLocalVariableTable(); - for (LocalVariable var : vars) { - var.accept(this); - } - stack.pop(); - } - - public void visitStackMap(StackMap table) - { - stack.push(table); - table.accept(visitor); - StackMapEntry[] vars = table.getStackMap(); - for (StackMapEntry var : vars) { - var.accept(this); - } - stack.pop(); - } - - public void visitStackMapEntry(StackMapEntry var) - { - stack.push(var); - var.accept(visitor); - stack.pop(); - } - - public void visitStackMapTable(StackMapTable table) - { - stack.push(table); - table.accept(visitor); - StackMapTableEntry[] vars = table.getStackMapTable(); - for (StackMapTableEntry var : vars) { - var.accept(this); - } - stack.pop(); - } - - public void visitStackMapTableEntry(StackMapTableEntry var) - { - stack.push(var); - var.accept(visitor); - stack.pop(); - } - - public void visitLocalVariable(LocalVariable var) - { - stack.push(var); - var.accept(visitor); - stack.pop(); - } - - public void visitConstantPool(ConstantPool cp) - { - stack.push(cp); - cp.accept(visitor); - Constant[] constants = cp.getConstantPool(); - for (int i = 1; i < constants.length; i++) - { - if (constants[i] != null) - { - constants[i].accept(this); - } - } - stack.pop(); - } - - public void visitConstantClass(ConstantClass constant) - { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantDouble(ConstantDouble constant) - { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantFieldref(ConstantFieldref constant) - { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantFloat(ConstantFloat constant) - { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantInteger(ConstantInteger constant) - { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantInterfaceMethodref( - ConstantInterfaceMethodref constant) - { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantLong(ConstantLong constant) - { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantMethodref(ConstantMethodref constant) - { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantNameAndType(ConstantNameAndType constant) - { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantString(ConstantString constant) - { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitConstantUtf8(ConstantUtf8 constant) - { - stack.push(constant); - constant.accept(visitor); - stack.pop(); - } - - public void visitInnerClasses(InnerClasses ic) - { - stack.push(ic); - ic.accept(visitor); - InnerClass[] ics = ic.getInnerClasses(); - for (InnerClass ic2 : ics) { - ic2.accept(this); - } - stack.pop(); - } - - public void visitInnerClass(InnerClass inner) - { - stack.push(inner); - inner.accept(visitor); - stack.pop(); - } - - public void visitDeprecated(Deprecated attribute) - { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - public void visitSignature(Signature attribute) - { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - public void visitSourceFile(SourceFile attribute) - { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - public void visitSynthetic(Synthetic attribute) - { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - public void visitUnknown(Unknown attribute) - { - stack.push(attribute); - attribute.accept(visitor); - stack.pop(); - } - - public void visitAnnotationDefault(AnnotationDefault obj) - { - stack.push(obj); - obj.accept(visitor); - stack.pop(); - } - - public void visitEnclosingMethod(EnclosingMethod obj) - { - stack.push(obj); - obj.accept(visitor); - stack.pop(); - } - - public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) - { - stack.push(obj); - obj.accept(visitor); - stack.pop(); - } - - public void visitParameterAnnotation(ParameterAnnotations obj) - { - stack.push(obj); - obj.accept(visitor); - stack.pop(); - } + private JavaClass clazz; + + private Visitor visitor; + + private Stack stack = new Stack(); + + /** + * @return container of current entitity, i.e., predecessor during traversal + */ + public Object predecessor() + { + return predecessor(0); + } + + /** + * @param level + * nesting level, i.e., 0 returns the direct predecessor + * @return container of current entitity, i.e., predecessor during traversal + */ + public Object predecessor(int level) + { + int size = stack.size(); + if ((size < 2) || (level < 0)) + { + return null; + } + else + { + return stack.elementAt(size - (level + 2)); // size - 1 == current + } + } + + /** + * @return current object + */ + public Object current() + { + return stack.peek(); + } + + /** + * @param clazz + * Class to traverse + * @param visitor + * visitor object to apply to all components + */ + public DescendingVisitor(JavaClass clazz, Visitor visitor) + { + this.clazz = clazz; + this.visitor = visitor; + } + + /** + * Start traversal. + */ + public void visit() + { + clazz.accept(this); + } + + public void visitJavaClass(JavaClass _clazz) + { + stack.push(_clazz); + _clazz.accept(visitor); + Field[] fields = _clazz.getFields(); + for (Field field : fields) { + field.accept(this); + } + Method[] methods = _clazz.getMethods(); + for (Method method : methods) { + method.accept(this); + } + Attribute[] attributes = _clazz.getAttributes(); + for (Attribute attribute : attributes) { + attribute.accept(this); + } + _clazz.getConstantPool().accept(this); + stack.pop(); + } + + public void visitAnnotation(Annotations annotation) + { + stack.push(annotation); + annotation.accept(visitor); + AnnotationEntry[] entries = annotation.getAnnotationEntries(); + for (AnnotationEntry entrie : entries) { + entrie.accept(this); + } + stack.pop(); + } + + public void visitAnnotationEntry(AnnotationEntry annotationEntry) + { + stack.push(annotationEntry); + annotationEntry.accept(visitor); + stack.pop(); + } + + public void visitField(Field field) + { + stack.push(field); + field.accept(visitor); + Attribute[] attributes = field.getAttributes(); + for (Attribute attribute : attributes) { + attribute.accept(this); + } + stack.pop(); + } + + public void visitConstantValue(ConstantValue cv) + { + stack.push(cv); + cv.accept(visitor); + stack.pop(); + } + + public void visitMethod(Method method) + { + stack.push(method); + method.accept(visitor); + Attribute[] attributes = method.getAttributes(); + for (Attribute attribute : attributes) { + attribute.accept(this); + } + stack.pop(); + } + + public void visitExceptionTable(ExceptionTable table) + { + stack.push(table); + table.accept(visitor); + stack.pop(); + } + + public void visitCode(Code code) + { + stack.push(code); + code.accept(visitor); + CodeException[] table = code.getExceptionTable(); + for (CodeException element : table) { + element.accept(this); + } + Attribute[] attributes = code.getAttributes(); + for (Attribute attribute : attributes) { + attribute.accept(this); + } + stack.pop(); + } + + public void visitCodeException(CodeException ce) + { + stack.push(ce); + ce.accept(visitor); + stack.pop(); + } + + public void visitLineNumberTable(LineNumberTable table) + { + stack.push(table); + table.accept(visitor); + LineNumber[] numbers = table.getLineNumberTable(); + for (LineNumber number : numbers) { + number.accept(this); + } + stack.pop(); + } + + public void visitLineNumber(LineNumber number) + { + stack.push(number); + number.accept(visitor); + stack.pop(); + } + + public void visitLocalVariableTable(LocalVariableTable table) + { + stack.push(table); + table.accept(visitor); + LocalVariable[] vars = table.getLocalVariableTable(); + for (LocalVariable var : vars) { + var.accept(this); + } + stack.pop(); + } + + public void visitStackMap(StackMap table) + { + stack.push(table); + table.accept(visitor); + StackMapEntry[] vars = table.getStackMap(); + for (StackMapEntry var : vars) { + var.accept(this); + } + stack.pop(); + } + + public void visitStackMapEntry(StackMapEntry var) + { + stack.push(var); + var.accept(visitor); + stack.pop(); + } + + public void visitStackMapTable(StackMapTable table) + { + stack.push(table); + table.accept(visitor); + StackMapTableEntry[] vars = table.getStackMapTable(); + for (StackMapTableEntry var : vars) { + var.accept(this); + } + stack.pop(); + } + + public void visitStackMapTableEntry(StackMapTableEntry var) + { + stack.push(var); + var.accept(visitor); + stack.pop(); + } + + public void visitLocalVariable(LocalVariable var) + { + stack.push(var); + var.accept(visitor); + stack.pop(); + } + + public void visitConstantPool(ConstantPool cp) + { + stack.push(cp); + cp.accept(visitor); + Constant[] constants = cp.getConstantPool(); + for (int i = 1; i < constants.length; i++) + { + if (constants[i] != null) + { + constants[i].accept(this); + } + } + stack.pop(); + } + + public void visitConstantClass(ConstantClass constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantDouble(ConstantDouble constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantFieldref(ConstantFieldref constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantFloat(ConstantFloat constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantInteger(ConstantInteger constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantInterfaceMethodref( + ConstantInterfaceMethodref constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantLong(ConstantLong constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantMethodref(ConstantMethodref constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantNameAndType(ConstantNameAndType constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantString(ConstantString constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitConstantUtf8(ConstantUtf8 constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + + public void visitInnerClasses(InnerClasses ic) + { + stack.push(ic); + ic.accept(visitor); + InnerClass[] ics = ic.getInnerClasses(); + for (InnerClass ic2 : ics) { + ic2.accept(this); + } + stack.pop(); + } + + public void visitInnerClass(InnerClass inner) + { + stack.push(inner); + inner.accept(visitor); + stack.pop(); + } + + public void visitDeprecated(Deprecated attribute) + { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitSignature(Signature attribute) + { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitSourceFile(SourceFile attribute) + { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitSynthetic(Synthetic attribute) + { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitUnknown(Unknown attribute) + { + stack.push(attribute); + attribute.accept(visitor); + stack.pop(); + } + + public void visitAnnotationDefault(AnnotationDefault obj) + { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } + + public void visitEnclosingMethod(EnclosingMethod obj) + { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } + + public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) + { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } + + public void visitParameterAnnotation(ParameterAnnotations obj) + { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } public void visitBootstrapMethods(BootstrapMethods obj) { diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index 25907da5..df2a398b 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -28,115 +28,115 @@ import java.io.IOException; */ public abstract class ElementValue { - protected int type; + protected int type; - protected ConstantPool cpool; + protected ConstantPool cpool; - @Override + @Override public String toString() - { - return stringifyValue(); - } - - protected ElementValue(int type, ConstantPool cpool) - { - this.type = type; - this.cpool = cpool; - } - - public int getElementValueType() - { - return type; - } - - public abstract String stringifyValue(); - - public abstract void dump(DataOutputStream dos) throws IOException; - - public static final int STRING = 's'; - - public static final int ENUM_CONSTANT = 'e'; - - public static final int CLASS = 'c'; - - public static final int ANNOTATION = '@'; - - public static final int ARRAY = '['; - - public static final int PRIMITIVE_INT = 'I'; - - public static final int PRIMITIVE_BYTE = 'B'; - - public static final int PRIMITIVE_CHAR = 'C'; - - public static final int PRIMITIVE_DOUBLE = 'D'; - - public static final int PRIMITIVE_FLOAT = 'F'; - - public static final int PRIMITIVE_LONG = 'J'; - - public static final int PRIMITIVE_SHORT = 'S'; - - public static final int PRIMITIVE_BOOLEAN = 'Z'; - - public static ElementValue readElementValue(DataInputStream dis, - ConstantPool cpool) throws IOException - { - byte type = dis.readByte(); - switch (type) - { - case 'B': // byte - return new SimpleElementValue(PRIMITIVE_BYTE, dis - .readUnsignedShort(), cpool); - case 'C': // char - return new SimpleElementValue(PRIMITIVE_CHAR, dis - .readUnsignedShort(), cpool); - case 'D': // double - return new SimpleElementValue(PRIMITIVE_DOUBLE, dis - .readUnsignedShort(), cpool); - case 'F': // float - return new SimpleElementValue(PRIMITIVE_FLOAT, dis - .readUnsignedShort(), cpool); - case 'I': // int - return new SimpleElementValue(PRIMITIVE_INT, dis - .readUnsignedShort(), cpool); - case 'J': // long - return new SimpleElementValue(PRIMITIVE_LONG, dis - .readUnsignedShort(), cpool); - case 'S': // short - return new SimpleElementValue(PRIMITIVE_SHORT, dis - .readUnsignedShort(), cpool); - case 'Z': // boolean - return new SimpleElementValue(PRIMITIVE_BOOLEAN, dis - .readUnsignedShort(), cpool); - case 's': // String - return new SimpleElementValue(STRING, dis.readUnsignedShort(), - cpool); - case 'e': // Enum constant - return new EnumElementValue(ENUM_CONSTANT, dis.readUnsignedShort(), - dis.readUnsignedShort(), cpool); - case 'c': // Class - return new ClassElementValue(CLASS, dis.readUnsignedShort(), cpool); - case '@': // Annotation - // TODO isRuntimeVisible - return new AnnotationElementValue(ANNOTATION, AnnotationEntry.read( - dis, cpool, false), cpool); - case '[': // Array - int numArrayVals = dis.readUnsignedShort(); - ElementValue[] evalues = new ElementValue[numArrayVals]; - for (int j = 0; j < numArrayVals; j++) - { - evalues[j] = ElementValue.readElementValue(dis, cpool); - } - return new ArrayElementValue(ARRAY, evalues, cpool); - default: - throw new RuntimeException( - "Unexpected element value kind in annotation: " + type); - } - } - - public String toShortString() - { - return stringifyValue(); - } + { + return stringifyValue(); + } + + protected ElementValue(int type, ConstantPool cpool) + { + this.type = type; + this.cpool = cpool; + } + + public int getElementValueType() + { + return type; + } + + public abstract String stringifyValue(); + + public abstract void dump(DataOutputStream dos) throws IOException; + + public static final int STRING = 's'; + + public static final int ENUM_CONSTANT = 'e'; + + public static final int CLASS = 'c'; + + public static final int ANNOTATION = '@'; + + public static final int ARRAY = '['; + + public static final int PRIMITIVE_INT = 'I'; + + public static final int PRIMITIVE_BYTE = 'B'; + + public static final int PRIMITIVE_CHAR = 'C'; + + public static final int PRIMITIVE_DOUBLE = 'D'; + + public static final int PRIMITIVE_FLOAT = 'F'; + + public static final int PRIMITIVE_LONG = 'J'; + + public static final int PRIMITIVE_SHORT = 'S'; + + public static final int PRIMITIVE_BOOLEAN = 'Z'; + + public static ElementValue readElementValue(DataInputStream dis, + ConstantPool cpool) throws IOException + { + byte type = dis.readByte(); + switch (type) + { + case 'B': // byte + return new SimpleElementValue(PRIMITIVE_BYTE, dis + .readUnsignedShort(), cpool); + case 'C': // char + return new SimpleElementValue(PRIMITIVE_CHAR, dis + .readUnsignedShort(), cpool); + case 'D': // double + return new SimpleElementValue(PRIMITIVE_DOUBLE, dis + .readUnsignedShort(), cpool); + case 'F': // float + return new SimpleElementValue(PRIMITIVE_FLOAT, dis + .readUnsignedShort(), cpool); + case 'I': // int + return new SimpleElementValue(PRIMITIVE_INT, dis + .readUnsignedShort(), cpool); + case 'J': // long + return new SimpleElementValue(PRIMITIVE_LONG, dis + .readUnsignedShort(), cpool); + case 'S': // short + return new SimpleElementValue(PRIMITIVE_SHORT, dis + .readUnsignedShort(), cpool); + case 'Z': // boolean + return new SimpleElementValue(PRIMITIVE_BOOLEAN, dis + .readUnsignedShort(), cpool); + case 's': // String + return new SimpleElementValue(STRING, dis.readUnsignedShort(), + cpool); + case 'e': // Enum constant + return new EnumElementValue(ENUM_CONSTANT, dis.readUnsignedShort(), + dis.readUnsignedShort(), cpool); + case 'c': // Class + return new ClassElementValue(CLASS, dis.readUnsignedShort(), cpool); + case '@': // Annotation + // TODO isRuntimeVisible + return new AnnotationElementValue(ANNOTATION, AnnotationEntry.read( + dis, cpool, false), cpool); + case '[': // Array + int numArrayVals = dis.readUnsignedShort(); + ElementValue[] evalues = new ElementValue[numArrayVals]; + for (int j = 0; j < numArrayVals; j++) + { + evalues[j] = ElementValue.readElementValue(dis, cpool); + } + return new ArrayElementValue(ARRAY, evalues, cpool); + default: + throw new RuntimeException( + "Unexpected element value kind in annotation: " + type); + } + } + + public String toShortString() + { + return stringifyValue(); + } } diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index 0bfb1160..159177e4 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -30,47 +30,47 @@ import org.apache.bcel.Constants; */ public class ElementValuePair { - private ElementValue elementValue; + private ElementValue elementValue; - private ConstantPool constantPool; + private ConstantPool constantPool; - private int elementNameIndex; + private int elementNameIndex; - public ElementValuePair(int elementNameIndex, ElementValue elementValue, - ConstantPool constantPool) - { - this.elementValue = elementValue; - this.elementNameIndex = elementNameIndex; - this.constantPool = constantPool; - } + public ElementValuePair(int elementNameIndex, ElementValue elementValue, + ConstantPool constantPool) + { + this.elementValue = elementValue; + this.elementNameIndex = elementNameIndex; + this.constantPool = constantPool; + } - public String getNameString() - { - ConstantUtf8 c = (ConstantUtf8) constantPool.getConstant( - elementNameIndex, Constants.CONSTANT_Utf8); - return c.getBytes(); - } + public String getNameString() + { + ConstantUtf8 c = (ConstantUtf8) constantPool.getConstant( + elementNameIndex, Constants.CONSTANT_Utf8); + return c.getBytes(); + } - public final ElementValue getValue() - { - return elementValue; - } + public final ElementValue getValue() + { + return elementValue; + } - public int getNameIndex() - { - return elementNameIndex; - } + public int getNameIndex() + { + return elementNameIndex; + } - public String toShortString() - { - StringBuilder result = new StringBuilder(); - result.append(getNameString()).append("=").append( - getValue().toShortString()); - return result.toString(); - } - - protected void dump(DataOutputStream dos) throws IOException { - dos.writeShort(elementNameIndex); // u2 name of the element - elementValue.dump(dos); - } + public String toShortString() + { + StringBuilder result = new StringBuilder(); + result.append(getNameString()).append("=").append( + getValue().toShortString()); + return result.toString(); + } + + protected void dump(DataOutputStream dos) throws IOException { + dos.writeShort(elementNameIndex); // u2 name of the element + elementValue.dump(dos); + } } diff --git a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java index af22d890..435e60b1 100644 --- a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -26,169 +26,169 @@ package org.apache.bcel.classfile; */ public class EmptyVisitor implements Visitor { - protected EmptyVisitor() - { - } + protected EmptyVisitor() + { + } - public void visitAnnotation(Annotations obj) - { - } + public void visitAnnotation(Annotations obj) + { + } - public void visitParameterAnnotation(ParameterAnnotations obj) - { - } + public void visitParameterAnnotation(ParameterAnnotations obj) + { + } - public void visitAnnotationEntry(AnnotationEntry obj) - { - } + public void visitAnnotationEntry(AnnotationEntry obj) + { + } - public void visitAnnotationDefault(AnnotationDefault obj) - { - } + public void visitAnnotationDefault(AnnotationDefault obj) + { + } - public void visitCode(Code obj) - { - } + public void visitCode(Code obj) + { + } - public void visitCodeException(CodeException obj) - { - } + public void visitCodeException(CodeException obj) + { + } - public void visitConstantClass(ConstantClass obj) - { - } + public void visitConstantClass(ConstantClass obj) + { + } - public void visitConstantDouble(ConstantDouble obj) - { - } + public void visitConstantDouble(ConstantDouble obj) + { + } - public void visitConstantFieldref(ConstantFieldref obj) - { - } + public void visitConstantFieldref(ConstantFieldref obj) + { + } - public void visitConstantFloat(ConstantFloat obj) - { - } + public void visitConstantFloat(ConstantFloat obj) + { + } - public void visitConstantInteger(ConstantInteger obj) - { - } + public void visitConstantInteger(ConstantInteger obj) + { + } - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) - { - } + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) + { + } - public void visitConstantLong(ConstantLong obj) - { - } + public void visitConstantLong(ConstantLong obj) + { + } - public void visitConstantMethodref(ConstantMethodref obj) - { - } + public void visitConstantMethodref(ConstantMethodref obj) + { + } - public void visitConstantNameAndType(ConstantNameAndType obj) - { - } + public void visitConstantNameAndType(ConstantNameAndType obj) + { + } - public void visitConstantPool(ConstantPool obj) - { - } + public void visitConstantPool(ConstantPool obj) + { + } - public void visitConstantString(ConstantString obj) - { - } + public void visitConstantString(ConstantString obj) + { + } - public void visitConstantUtf8(ConstantUtf8 obj) - { - } + public void visitConstantUtf8(ConstantUtf8 obj) + { + } - public void visitConstantValue(ConstantValue obj) - { - } + public void visitConstantValue(ConstantValue obj) + { + } - public void visitDeprecated(Deprecated obj) - { - } + public void visitDeprecated(Deprecated obj) + { + } - public void visitExceptionTable(ExceptionTable obj) - { - } + public void visitExceptionTable(ExceptionTable obj) + { + } - public void visitField(Field obj) - { - } + public void visitField(Field obj) + { + } - public void visitInnerClass(InnerClass obj) - { - } + public void visitInnerClass(InnerClass obj) + { + } - public void visitInnerClasses(InnerClasses obj) - { - } + public void visitInnerClasses(InnerClasses obj) + { + } - public void visitJavaClass(JavaClass obj) - { - } + public void visitJavaClass(JavaClass obj) + { + } - public void visitLineNumber(LineNumber obj) - { - } + public void visitLineNumber(LineNumber obj) + { + } - public void visitLineNumberTable(LineNumberTable obj) - { - } + public void visitLineNumberTable(LineNumberTable obj) + { + } - public void visitLocalVariable(LocalVariable obj) - { - } + public void visitLocalVariable(LocalVariable obj) + { + } - public void visitLocalVariableTable(LocalVariableTable obj) - { - } + public void visitLocalVariableTable(LocalVariableTable obj) + { + } - public void visitMethod(Method obj) - { - } + public void visitMethod(Method obj) + { + } - public void visitSignature(Signature obj) - { - } + public void visitSignature(Signature obj) + { + } - public void visitSourceFile(SourceFile obj) - { - } + public void visitSourceFile(SourceFile obj) + { + } - public void visitSynthetic(Synthetic obj) - { - } + public void visitSynthetic(Synthetic obj) + { + } - public void visitUnknown(Unknown obj) - { - } + public void visitUnknown(Unknown obj) + { + } - public void visitStackMap(StackMap obj) - { - } + public void visitStackMap(StackMap obj) + { + } - public void visitStackMapEntry(StackMapEntry obj) - { - } + public void visitStackMapEntry(StackMapEntry obj) + { + } - public void visitStackMapTable(StackMapTable obj) - { - } + public void visitStackMapTable(StackMapTable obj) + { + } - public void visitStackMapTableEntry(StackMapTableEntry obj) - { - } + public void visitStackMapTableEntry(StackMapTableEntry obj) + { + } - public void visitEnclosingMethod(EnclosingMethod obj) - { - } + public void visitEnclosingMethod(EnclosingMethod obj) + { + } - public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) - { - } + public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) + { + } public void visitBootstrapMethods(BootstrapMethods obj) { diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java index 983dfcb4..1ac04d1e 100644 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -27,72 +27,72 @@ import org.apache.bcel.Constants; * anonymous classes and ... there can be only one. */ public class EnclosingMethod extends Attribute { - - private static final long serialVersionUID = 9136852385761725494L; + + private static final long serialVersionUID = 9136852385761725494L; // Pointer to the CONSTANT_Class_info structure representing the - // innermost class that encloses the declaration of the current class. - private int classIndex; - - // If the current class is not immediately enclosed by a method or - // constructor, then the value of the method_index item must be zero. - // Otherwise, the value of the method_index item must point to a - // CONSTANT_NameAndType_info structure representing the name and the - // type of a method in the class referenced by the class we point - // to in the class_index. *It is the compiler responsibility* to - // ensure that the method identified by this index is the closest - // lexically enclosing method that includes the local/anonymous class. - private int methodIndex; + // innermost class that encloses the declaration of the current class. + private int classIndex; + + // If the current class is not immediately enclosed by a method or + // constructor, then the value of the method_index item must be zero. + // Otherwise, the value of the method_index item must point to a + // CONSTANT_NameAndType_info structure representing the name and the + // type of a method in the class referenced by the class we point + // to in the class_index. *It is the compiler responsibility* to + // ensure that the method identified by this index is the closest + // lexically enclosing method that includes the local/anonymous class. + private int methodIndex; - // Ctors - and code to read an attribute in. - public EnclosingMethod(int nameIndex, int len, DataInputStream dis, ConstantPool cpool) throws IOException { - this(nameIndex, len, dis.readUnsignedShort(), dis.readUnsignedShort(), cpool); - } + // Ctors - and code to read an attribute in. + public EnclosingMethod(int nameIndex, int len, DataInputStream dis, ConstantPool cpool) throws IOException { + this(nameIndex, len, dis.readUnsignedShort(), dis.readUnsignedShort(), cpool); + } - private EnclosingMethod(int nameIndex, int len, int classIdx,int methodIdx, ConstantPool cpool) { - super(Constants.ATTR_ENCLOSING_METHOD, nameIndex, len, cpool); - classIndex = classIdx; - methodIndex = methodIdx; - } + private EnclosingMethod(int nameIndex, int len, int classIdx,int methodIdx, ConstantPool cpool) { + super(Constants.ATTR_ENCLOSING_METHOD, nameIndex, len, cpool); + classIndex = classIdx; + methodIndex = methodIdx; + } - @Override + @Override public void accept(Visitor v) { - v.visitEnclosingMethod(this); - } + v.visitEnclosingMethod(this); + } - @Override + @Override public Attribute copy(ConstantPool constant_pool) { - throw new RuntimeException("Not implemented yet!"); - // is this next line sufficient? - // return (EnclosingMethod)clone(); - } - - // Accessors - public final int getEnclosingClassIndex() { return classIndex; } - public final int getEnclosingMethodIndex(){ return methodIndex;} - - public final void setEnclosingClassIndex(int idx) {classIndex = idx;} - public final void setEnclosingMethodIndex(int idx){methodIndex= idx;} + throw new RuntimeException("Not implemented yet!"); + // is this next line sufficient? + // return (EnclosingMethod)clone(); + } + + // Accessors + public final int getEnclosingClassIndex() { return classIndex; } + public final int getEnclosingMethodIndex(){ return methodIndex;} + + public final void setEnclosingClassIndex(int idx) {classIndex = idx;} + public final void setEnclosingMethodIndex(int idx){methodIndex= idx;} + + public final ConstantClass getEnclosingClass() { + ConstantClass c = + (ConstantClass)constant_pool.getConstant(classIndex,Constants.CONSTANT_Class); + return c; + } - public final ConstantClass getEnclosingClass() { - ConstantClass c = - (ConstantClass)constant_pool.getConstant(classIndex,Constants.CONSTANT_Class); - return c; - } - - public final ConstantNameAndType getEnclosingMethod() { - if (methodIndex == 0) { + public final ConstantNameAndType getEnclosingMethod() { + if (methodIndex == 0) { return null; } - ConstantNameAndType nat = - (ConstantNameAndType)constant_pool.getConstant(methodIndex,Constants.CONSTANT_NameAndType); - return nat; - } + ConstantNameAndType nat = + (ConstantNameAndType)constant_pool.getConstant(methodIndex,Constants.CONSTANT_NameAndType); + return nat; + } @Override public final void dump(DataOutputStream file) throws IOException { - super.dump(file); - file.writeShort(classIndex); - file.writeShort(methodIndex); + super.dump(file); + file.writeShort(classIndex); + file.writeShort(methodIndex); } } diff --git a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java index 8bfdf3c1..e7b112dc 100644 --- a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java @@ -23,60 +23,60 @@ import org.apache.bcel.Constants; public class EnumElementValue extends ElementValue { - // For enum types, these two indices point to the type and value - private int typeIdx; + // For enum types, these two indices point to the type and value + private int typeIdx; - private int valueIdx; + private int valueIdx; - public EnumElementValue(int type, int typeIdx, int valueIdx, - ConstantPool cpool) - { - super(type, cpool); - if (type != ENUM_CONSTANT) { + public EnumElementValue(int type, int typeIdx, int valueIdx, + ConstantPool cpool) + { + super(type, cpool); + if (type != ENUM_CONSTANT) { throw new RuntimeException( - "Only element values of type enum can be built with this ctor - type specified: " + type); + "Only element values of type enum can be built with this ctor - type specified: " + type); } - this.typeIdx = typeIdx; - this.valueIdx = valueIdx; - } + this.typeIdx = typeIdx; + this.valueIdx = valueIdx; + } - @Override + @Override public void dump(DataOutputStream dos) throws IOException - { - dos.writeByte(type); // u1 type of value (ENUM_CONSTANT == 'e') - dos.writeShort(typeIdx); // u2 - dos.writeShort(valueIdx); // u2 - } + { + dos.writeByte(type); // u1 type of value (ENUM_CONSTANT == 'e') + dos.writeShort(typeIdx); // u2 + dos.writeShort(valueIdx); // u2 + } - @Override + @Override public String stringifyValue() - { - ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(valueIdx, - Constants.CONSTANT_Utf8); - return cu8.getBytes(); - } + { + ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(valueIdx, + Constants.CONSTANT_Utf8); + return cu8.getBytes(); + } - public String getEnumTypeString() - { - ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(typeIdx, - Constants.CONSTANT_Utf8); - return cu8.getBytes();// Utility.signatureToString(cu8.getBytes()); - } + public String getEnumTypeString() + { + ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(typeIdx, + Constants.CONSTANT_Utf8); + return cu8.getBytes();// Utility.signatureToString(cu8.getBytes()); + } - public String getEnumValueString() - { - ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(valueIdx, - Constants.CONSTANT_Utf8); - return cu8.getBytes(); - } + public String getEnumValueString() + { + ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(valueIdx, + Constants.CONSTANT_Utf8); + return cu8.getBytes(); + } - public int getValueIndex() - { - return valueIdx; - } + public int getValueIndex() + { + return valueIdx; + } - public int getTypeIndex() - { - return typeIdx; - } + public int getTypeIndex() + { + return typeIdx; + } } diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index 676a57ed..974421da 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -44,7 +44,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No private String signatureAttributeString = null; private boolean searchedForSignatureAttribute = false; - + // Annotations are collected from certain attributes, don't do it more than necessary! private boolean annotationsOutOfDate = true; @@ -204,7 +204,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * @return deep copy of this field */ protected FieldOrMethod copy_( ConstantPool _constant_pool ) { - FieldOrMethod c = null; + FieldOrMethod c = null; try { c = (FieldOrMethod)clone(); @@ -219,73 +219,73 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No return c; } - + + /** + * Ensure we have unpacked any attributes that contain annotations. + * We don't remove these annotation attributes from the attributes list, they + * remain there. + */ + private void ensureAnnotationsUpToDate() + { + if (annotationsOutOfDate) + { + // Find attributes that contain annotation data + Attribute[] attrs = getAttributes(); + List accumulatedAnnotations = new ArrayList(); + for (Attribute attribute : attrs) { + if (attribute instanceof Annotations) + { + Annotations annotations = (Annotations) attribute; + for (int j = 0; j < annotations.getAnnotationEntries().length; j++) + { + accumulatedAnnotations.add(annotations + .getAnnotationEntries()[j]); + } + } + } + annotationEntries = accumulatedAnnotations + .toArray(new AnnotationEntry[accumulatedAnnotations.size()]); + annotationsOutOfDate = false; + } + } + + public AnnotationEntry[] getAnnotationEntries() + { + ensureAnnotationsUpToDate(); + return annotationEntries; + } + + public void addAnnotationEntry(AnnotationEntry a) + { + ensureAnnotationsUpToDate(); + int len = annotationEntries.length; + AnnotationEntry[] newAnnotations = new AnnotationEntry[len + 1]; + System.arraycopy(annotationEntries, 0, newAnnotations, 0, len); + newAnnotations[len] = a; + annotationEntries = newAnnotations; + } + /** - * Ensure we have unpacked any attributes that contain annotations. - * We don't remove these annotation attributes from the attributes list, they - * remain there. - */ - private void ensureAnnotationsUpToDate() - { - if (annotationsOutOfDate) - { - // Find attributes that contain annotation data - Attribute[] attrs = getAttributes(); - List accumulatedAnnotations = new ArrayList(); - for (Attribute attribute : attrs) { - if (attribute instanceof Annotations) - { - Annotations annotations = (Annotations) attribute; - for (int j = 0; j < annotations.getAnnotationEntries().length; j++) - { - accumulatedAnnotations.add(annotations - .getAnnotationEntries()[j]); - } - } - } - annotationEntries = accumulatedAnnotations - .toArray(new AnnotationEntry[accumulatedAnnotations.size()]); - annotationsOutOfDate = false; - } - } - - public AnnotationEntry[] getAnnotationEntries() - { - ensureAnnotationsUpToDate(); - return annotationEntries; - } - - public void addAnnotationEntry(AnnotationEntry a) - { - ensureAnnotationsUpToDate(); - int len = annotationEntries.length; - AnnotationEntry[] newAnnotations = new AnnotationEntry[len + 1]; - System.arraycopy(annotationEntries, 0, newAnnotations, 0, len); - newAnnotations[len] = a; - annotationEntries = newAnnotations; - } - - /** - * Hunts for a signature attribute on the member and returns its contents. So where the 'regular' signature - * may be (Ljava/util/Vector;)V the signature attribute may in fact say 'Ljava/lang/Vector;' - * Coded for performance - searches for the attribute only when requested - only searches for it once. - */ - public final String getGenericSignature() - { - if (!searchedForSignatureAttribute) - { - boolean found = false; - for (int i = 0; !found && i < attributes_count; i++) - { - if (attributes[i] instanceof Signature) - { - signatureAttributeString = ((Signature) attributes[i]) - .getSignature(); - found = true; - } - } - searchedForSignatureAttribute = true; - } - return signatureAttributeString; - } + * Hunts for a signature attribute on the member and returns its contents. So where the 'regular' signature + * may be (Ljava/util/Vector;)V the signature attribute may in fact say 'Ljava/lang/Vector;' + * Coded for performance - searches for the attribute only when requested - only searches for it once. + */ + public final String getGenericSignature() + { + if (!searchedForSignatureAttribute) + { + boolean found = false; + for (int i = 0; !found && i < attributes_count; i++) + { + if (attributes[i] instanceof Signature) + { + signatureAttributeString = ((Signature) attributes[i]) + .getSignature(); + found = true; + } + } + searchedForSignatureAttribute = true; + } + return signatureAttributeString; + } } diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index d8a8b8c9..bd88bc1b 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -73,10 +73,10 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public static final byte ZIP = 3; static boolean debug = false; // Debugging on/off static char sep = '/'; // directory separator - + // Annotations are collected from certain attributes, don't do it more than necessary! private boolean annotationsOutOfDate = true; - + private static BCELComparator _cmp = new BCELComparator() { public boolean equals( Object o1, Object o2 ) { @@ -336,24 +336,24 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public Attribute[] getAttributes() { return attributes; } - + public AnnotationEntry[] getAnnotationEntries() { - if (annotationsOutOfDate) { - // Find attributes that contain annotation data - Attribute[] attrs = getAttributes(); - List accumulatedAnnotations = new ArrayList(); - for (Attribute attribute : attrs) { - if (attribute instanceof Annotations) { - Annotations runtimeAnnotations = (Annotations)attribute; - for(int j = 0; j < runtimeAnnotations.getAnnotationEntries().length; j++) { + if (annotationsOutOfDate) { + // Find attributes that contain annotation data + Attribute[] attrs = getAttributes(); + List accumulatedAnnotations = new ArrayList(); + for (Attribute attribute : attrs) { + if (attribute instanceof Annotations) { + Annotations runtimeAnnotations = (Annotations)attribute; + for(int j = 0; j < runtimeAnnotations.getAnnotationEntries().length; j++) { accumulatedAnnotations.add(runtimeAnnotations.getAnnotationEntries()[j]); } - } - } - annotations = accumulatedAnnotations.toArray(new AnnotationEntry[accumulatedAnnotations.size()]); - annotationsOutOfDate = false; - } - return annotations; + } + } + annotations = accumulatedAnnotations.toArray(new AnnotationEntry[accumulatedAnnotations.size()]); + annotationsOutOfDate = false; + } + return annotations; } /** * @return Class name. @@ -649,8 +649,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl } AnnotationEntry[] annotations = getAnnotationEntries(); if (annotations!=null && annotations.length>0) { - buf.append("\nAnnotation(s):\n"); - for (AnnotationEntry annotation : annotations) { + buf.append("\nAnnotation(s):\n"); + for (AnnotationEntry annotation : annotations) { buf.append(indent(annotation)); } } @@ -716,42 +716,42 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public final boolean isClass() { return (access_flags & Constants.ACC_INTERFACE) == 0; } - + public final boolean isAnonymous() { - computeNestedTypeStatus(); - return this.isAnonymous; + computeNestedTypeStatus(); + return this.isAnonymous; } - + public final boolean isNested() { - computeNestedTypeStatus(); - return this.isNested; + computeNestedTypeStatus(); + return this.isNested; } - + private void computeNestedTypeStatus() { - if (computedNestedTypeStatus) { + if (computedNestedTypeStatus) { return; } - for (Attribute attribute : this.attributes) { - if (attribute instanceof InnerClasses) { - InnerClass[] innerClasses = ((InnerClasses) attribute).getInnerClasses(); - for (InnerClass innerClasse : innerClasses) { - boolean innerClassAttributeRefersToMe = false; - String inner_class_name = constant_pool.getConstantString(innerClasse.getInnerClassIndex(), - Constants.CONSTANT_Class); - inner_class_name = Utility.compactClassName(inner_class_name); - if (inner_class_name.equals(getClassName())) { - innerClassAttributeRefersToMe = true; - } - if (innerClassAttributeRefersToMe) { - this.isNested = true; - if (innerClasse.getInnerNameIndex() == 0) { - this.isAnonymous = true; - } - } - } - } - } - this.computedNestedTypeStatus = true; + for (Attribute attribute : this.attributes) { + if (attribute instanceof InnerClasses) { + InnerClass[] innerClasses = ((InnerClasses) attribute).getInnerClasses(); + for (InnerClass innerClasse : innerClasses) { + boolean innerClassAttributeRefersToMe = false; + String inner_class_name = constant_pool.getConstantString(innerClasse.getInnerClassIndex(), + Constants.CONSTANT_Class); + inner_class_name = Utility.compactClassName(inner_class_name); + if (inner_class_name.equals(getClassName())) { + innerClassAttributeRefersToMe = true; + } + if (innerClassAttributeRefersToMe) { + this.isNested = true; + if (innerClasse.getInnerNameIndex() == 0) { + this.isAnonymous = true; + } + } + } + } + } + this.computedNestedTypeStatus = true; } diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index 73808828..7e8da2c9 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -22,16 +22,16 @@ import java.io.*; // The new table is used when generic types are about... //LocalVariableTable_attribute { -// u2 attribute_name_index; -// u4 attribute_length; -// u2 local_variable_table_length; -// { u2 start_pc; -// u2 length; -// u2 name_index; -// u2 descriptor_index; -// u2 index; -// } local_variable_table[local_variable_table_length]; -// } +// u2 attribute_name_index; +// u4 attribute_length; +// u2 local_variable_table_length; +// { u2 start_pc; +// u2 length; +// u2 name_index; +// u2 descriptor_index; +// u2 index; +// } local_variable_table[local_variable_table_length]; +// } //LocalVariableTypeTable_attribute { // u2 attribute_name_index; @@ -53,12 +53,12 @@ private int local_variable_type_table_length; // Table of local public LocalVariableTypeTable(LocalVariableTypeTable c) { this(c.getNameIndex(), c.getLength(), c.getLocalVariableTypeTable(), - c.getConstantPool()); + c.getConstantPool()); } public LocalVariableTypeTable(int name_index, int length, - LocalVariable[] local_variable_table, - ConstantPool constant_pool) + LocalVariable[] local_variable_table, + ConstantPool constant_pool) { super(Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE, name_index, length, constant_pool); setLocalVariableTable(local_variable_table); diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameter.java b/src/main/java/org/apache/bcel/classfile/MethodParameter.java index 4f0efe06..3a1464bb 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameter.java +++ b/src/main/java/org/apache/bcel/classfile/MethodParameter.java @@ -72,7 +72,7 @@ public class MethodParameter implements Serializable, Cloneable { } else { return ((ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8)).getBytes(); } - } + } public int getAccessFlags() { return access_flags; diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameters.java b/src/main/java/org/apache/bcel/classfile/MethodParameters.java index 62fbc23c..6b64d223 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameters.java +++ b/src/main/java/org/apache/bcel/classfile/MethodParameters.java @@ -78,9 +78,9 @@ public class MethodParameters extends Attribute { * @throws IOException */ @Override - public void dump(DataOutputStream file) throws IOException { - super.dump(file); - file.writeByte(parameters.length); + public void dump(DataOutputStream file) throws IOException { + super.dump(file); + file.writeByte(parameters.length); for (MethodParameter parameter : parameters) { parameter.dump(file); } diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index a8473728..48cb1351 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -115,7 +115,7 @@ public abstract class ParameterAnnotations extends Attribute { public final int getNumParameterAnnotation() { return num_parameters; } - + @Override public void dump(DataOutputStream dos) throws IOException { diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index e0f3da19..13b471eb 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -32,40 +32,40 @@ import org.apache.bcel.Constants; */ public class RuntimeInvisibleAnnotations extends Annotations { - private static final long serialVersionUID = 5274986004117955967L; + private static final long serialVersionUID = 5274986004117955967L; /** - * @param name_index - * Index pointing to the name Code - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - */ - RuntimeInvisibleAnnotations(int name_index, int length, - DataInputStream file, ConstantPool constant_pool) - throws IOException - { - super(Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS, name_index, length, - file, constant_pool, false); - } + * @param name_index + * Index pointing to the name Code + * @param length + * Content length in bytes + * @param file + * Input stream + * @param constant_pool + * Array of constants + */ + RuntimeInvisibleAnnotations(int name_index, int length, + DataInputStream file, ConstantPool constant_pool) + throws IOException + { + super(Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS, name_index, length, + file, constant_pool, false); + } - /** - * @return deep copy of this attribute - */ - @Override + /** + * @return deep copy of this attribute + */ + @Override public Attribute copy(ConstantPool constant_pool) - { - Annotations c = (Annotations) clone(); - return c; - } + { + Annotations c = (Annotations) clone(); + return c; + } - @Override + @Override public final void dump(DataOutputStream dos) throws IOException - { - super.dump(dos); - writeAnnotations(dos); - } + { + super.dump(dos); + writeAnnotations(dos); + } } diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 8e3a4877..0e478937 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -32,40 +32,40 @@ import org.apache.bcel.Constants; */ public class RuntimeVisibleAnnotations extends Annotations { - private static final long serialVersionUID = 8992333017010665281L; + private static final long serialVersionUID = 8992333017010665281L; /** - * @param name_index - * Index pointing to the name Code - * @param length - * Content length in bytes - * @param file - * Input stream - * @param constant_pool - * Array of constants - */ - public RuntimeVisibleAnnotations(int name_index, int length, - DataInputStream file, ConstantPool constant_pool) - throws IOException - { - super(Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS, name_index, length, - file, constant_pool, true); - } + * @param name_index + * Index pointing to the name Code + * @param length + * Content length in bytes + * @param file + * Input stream + * @param constant_pool + * Array of constants + */ + public RuntimeVisibleAnnotations(int name_index, int length, + DataInputStream file, ConstantPool constant_pool) + throws IOException + { + super(Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS, name_index, length, + file, constant_pool, true); + } - /** - * @return deep copy of this attribute - */ - @Override + /** + * @return deep copy of this attribute + */ + @Override public Attribute copy(ConstantPool constant_pool) - { - Annotations c = (Annotations) clone(); - return c; - } + { + Annotations c = (Annotations) clone(); + return c; + } - @Override + @Override public final void dump(DataOutputStream dos) throws IOException - { - super.dump(dos); - writeAnnotations(dos); - } + { + super.dump(dos); + writeAnnotations(dos); + } } diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java index d525bb95..e3ccff43 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -23,201 +23,201 @@ import org.apache.bcel.Constants; public class SimpleElementValue extends ElementValue { - private int index; - - public SimpleElementValue(int type, int index, ConstantPool cpool) - { - super(type, cpool); - this.index = index; - } - - /** - * @return Value entry index in the cpool - */ - public int getIndex() - { - return index; - } - - public void setIndex(int index) - { - this.index = index; - } - - public String getValueString() - { - if (type != STRING) { + private int index; + + public SimpleElementValue(int type, int index, ConstantPool cpool) + { + super(type, cpool); + this.index = index; + } + + /** + * @return Value entry index in the cpool + */ + public int getIndex() + { + return index; + } + + public void setIndex(int index) + { + this.index = index; + } + + public String getValueString() + { + if (type != STRING) { throw new RuntimeException( - "Dont call getValueString() on a non STRING ElementValue"); + "Dont call getValueString() on a non STRING ElementValue"); } - ConstantUtf8 c = (ConstantUtf8) cpool.getConstant(getIndex(), - Constants.CONSTANT_Utf8); - return c.getBytes(); - } - - public int getValueInt() - { - if (type != PRIMITIVE_INT) { + ConstantUtf8 c = (ConstantUtf8) cpool.getConstant(getIndex(), + Constants.CONSTANT_Utf8); + return c.getBytes(); + } + + public int getValueInt() + { + if (type != PRIMITIVE_INT) { throw new RuntimeException( - "Dont call getValueString() on a non STRING ElementValue"); + "Dont call getValueString() on a non STRING ElementValue"); } - ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), - Constants.CONSTANT_Integer); - return c.getBytes(); - } - - public byte getValueByte() - { - if (type != PRIMITIVE_BYTE) { + ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), + Constants.CONSTANT_Integer); + return c.getBytes(); + } + + public byte getValueByte() + { + if (type != PRIMITIVE_BYTE) { throw new RuntimeException( - "Dont call getValueByte() on a non BYTE ElementValue"); + "Dont call getValueByte() on a non BYTE ElementValue"); } - ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), - Constants.CONSTANT_Integer); - return (byte) c.getBytes(); - } - - public char getValueChar() - { - if (type != PRIMITIVE_CHAR) { + ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), + Constants.CONSTANT_Integer); + return (byte) c.getBytes(); + } + + public char getValueChar() + { + if (type != PRIMITIVE_CHAR) { throw new RuntimeException( - "Dont call getValueChar() on a non CHAR ElementValue"); + "Dont call getValueChar() on a non CHAR ElementValue"); } - ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), - Constants.CONSTANT_Integer); - return (char) c.getBytes(); - } - - public long getValueLong() - { - if (type != PRIMITIVE_LONG) { + ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), + Constants.CONSTANT_Integer); + return (char) c.getBytes(); + } + + public long getValueLong() + { + if (type != PRIMITIVE_LONG) { throw new RuntimeException( - "Dont call getValueLong() on a non LONG ElementValue"); + "Dont call getValueLong() on a non LONG ElementValue"); } - ConstantLong j = (ConstantLong) cpool.getConstant(getIndex()); - return j.getBytes(); - } + ConstantLong j = (ConstantLong) cpool.getConstant(getIndex()); + return j.getBytes(); + } - public float getValueFloat() - { - if (type != PRIMITIVE_FLOAT) { + public float getValueFloat() + { + if (type != PRIMITIVE_FLOAT) { throw new RuntimeException( - "Dont call getValueFloat() on a non FLOAT ElementValue"); + "Dont call getValueFloat() on a non FLOAT ElementValue"); } - ConstantFloat f = (ConstantFloat) cpool.getConstant(getIndex()); - return f.getBytes(); - } + ConstantFloat f = (ConstantFloat) cpool.getConstant(getIndex()); + return f.getBytes(); + } - public double getValueDouble() - { - if (type != PRIMITIVE_DOUBLE) { + public double getValueDouble() + { + if (type != PRIMITIVE_DOUBLE) { throw new RuntimeException( - "Dont call getValueDouble() on a non DOUBLE ElementValue"); + "Dont call getValueDouble() on a non DOUBLE ElementValue"); } - ConstantDouble d = (ConstantDouble) cpool.getConstant(getIndex()); - return d.getBytes(); - } + ConstantDouble d = (ConstantDouble) cpool.getConstant(getIndex()); + return d.getBytes(); + } - public boolean getValueBoolean() - { - if (type != PRIMITIVE_BOOLEAN) { + public boolean getValueBoolean() + { + if (type != PRIMITIVE_BOOLEAN) { throw new RuntimeException( - "Dont call getValueBoolean() on a non BOOLEAN ElementValue"); + "Dont call getValueBoolean() on a non BOOLEAN ElementValue"); } - ConstantInteger bo = (ConstantInteger) cpool.getConstant(getIndex()); - return (bo.getBytes() != 0); - } + ConstantInteger bo = (ConstantInteger) cpool.getConstant(getIndex()); + return (bo.getBytes() != 0); + } - public short getValueShort() - { - if (type != PRIMITIVE_SHORT) { + public short getValueShort() + { + if (type != PRIMITIVE_SHORT) { throw new RuntimeException( - "Dont call getValueShort() on a non SHORT ElementValue"); + "Dont call getValueShort() on a non SHORT ElementValue"); } - ConstantInteger s = (ConstantInteger) cpool.getConstant(getIndex()); - return (short) s.getBytes(); - } + ConstantInteger s = (ConstantInteger) cpool.getConstant(getIndex()); + return (short) s.getBytes(); + } - @Override + @Override public String toString() - { - return stringifyValue(); - } + { + return stringifyValue(); + } - // Whatever kind of value it is, return it as a string - @Override + // Whatever kind of value it is, return it as a string + @Override public String stringifyValue() - { - switch (type) - { - case PRIMITIVE_INT: - ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), - Constants.CONSTANT_Integer); - return Integer.toString(c.getBytes()); - case PRIMITIVE_LONG: - ConstantLong j = (ConstantLong) cpool.getConstant(getIndex(), - Constants.CONSTANT_Long); - return Long.toString(j.getBytes()); - case PRIMITIVE_DOUBLE: - ConstantDouble d = (ConstantDouble) cpool.getConstant(getIndex(), - Constants.CONSTANT_Double); - return Double.toString(d.getBytes()); - case PRIMITIVE_FLOAT: - ConstantFloat f = (ConstantFloat) cpool.getConstant(getIndex(), - Constants.CONSTANT_Float); - return Float.toString(f.getBytes()); - case PRIMITIVE_SHORT: - ConstantInteger s = (ConstantInteger) cpool.getConstant(getIndex(), - Constants.CONSTANT_Integer); - return Integer.toString(s.getBytes()); - case PRIMITIVE_BYTE: - ConstantInteger b = (ConstantInteger) cpool.getConstant(getIndex(), - Constants.CONSTANT_Integer); - return Integer.toString(b.getBytes()); - case PRIMITIVE_CHAR: - ConstantInteger ch = (ConstantInteger) cpool.getConstant( - getIndex(), Constants.CONSTANT_Integer); - return String.valueOf((char)ch.getBytes()); - case PRIMITIVE_BOOLEAN: - ConstantInteger bo = (ConstantInteger) cpool.getConstant( - getIndex(), Constants.CONSTANT_Integer); - if (bo.getBytes() == 0) { + { + switch (type) + { + case PRIMITIVE_INT: + ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), + Constants.CONSTANT_Integer); + return Integer.toString(c.getBytes()); + case PRIMITIVE_LONG: + ConstantLong j = (ConstantLong) cpool.getConstant(getIndex(), + Constants.CONSTANT_Long); + return Long.toString(j.getBytes()); + case PRIMITIVE_DOUBLE: + ConstantDouble d = (ConstantDouble) cpool.getConstant(getIndex(), + Constants.CONSTANT_Double); + return Double.toString(d.getBytes()); + case PRIMITIVE_FLOAT: + ConstantFloat f = (ConstantFloat) cpool.getConstant(getIndex(), + Constants.CONSTANT_Float); + return Float.toString(f.getBytes()); + case PRIMITIVE_SHORT: + ConstantInteger s = (ConstantInteger) cpool.getConstant(getIndex(), + Constants.CONSTANT_Integer); + return Integer.toString(s.getBytes()); + case PRIMITIVE_BYTE: + ConstantInteger b = (ConstantInteger) cpool.getConstant(getIndex(), + Constants.CONSTANT_Integer); + return Integer.toString(b.getBytes()); + case PRIMITIVE_CHAR: + ConstantInteger ch = (ConstantInteger) cpool.getConstant( + getIndex(), Constants.CONSTANT_Integer); + return String.valueOf((char)ch.getBytes()); + case PRIMITIVE_BOOLEAN: + ConstantInteger bo = (ConstantInteger) cpool.getConstant( + getIndex(), Constants.CONSTANT_Integer); + if (bo.getBytes() == 0) { return "false"; } else { return "true"; } - case STRING: - ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(getIndex(), - Constants.CONSTANT_Utf8); - return cu8.getBytes(); - default: - throw new RuntimeException( - "SimpleElementValue class does not know how to stringify type " - + type); - } - } - - @Override + case STRING: + ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(getIndex(), + Constants.CONSTANT_Utf8); + return cu8.getBytes(); + default: + throw new RuntimeException( + "SimpleElementValue class does not know how to stringify type " + + type); + } + } + + @Override public void dump(DataOutputStream dos) throws IOException - { - dos.writeByte(type); // u1 kind of value - switch (type) - { - case PRIMITIVE_INT: - case PRIMITIVE_BYTE: - case PRIMITIVE_CHAR: - case PRIMITIVE_FLOAT: - case PRIMITIVE_LONG: - case PRIMITIVE_BOOLEAN: - case PRIMITIVE_SHORT: - case PRIMITIVE_DOUBLE: - case STRING: - dos.writeShort(getIndex()); - break; - default: - throw new RuntimeException( - "SimpleElementValue doesnt know how to write out type " - + type); - } - } + { + dos.writeByte(type); // u1 kind of value + switch (type) + { + case PRIMITIVE_INT: + case PRIMITIVE_BYTE: + case PRIMITIVE_CHAR: + case PRIMITIVE_FLOAT: + case PRIMITIVE_LONG: + case PRIMITIVE_BOOLEAN: + case PRIMITIVE_SHORT: + case PRIMITIVE_DOUBLE: + case STRING: + dos.writeShort(getIndex()); + break; + default: + throw new RuntimeException( + "SimpleElementValue doesnt know how to write out type " + + type); + } + } } diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index 5cb134bc..ef920bdf 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -36,7 +36,7 @@ import org.apache.bcel.Constants; */ public final class StackMapTableEntry implements Cloneable, Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; private int frame_type; private int byte_code_offset_delta; @@ -54,45 +54,45 @@ public final class StackMapTableEntry implements Cloneable, Serializable { */ StackMapTableEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { this(file.read(), -1, -1, null, -1, null, constant_pool); - + if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { - byte_code_offset_delta = frame_type - Constants.SAME_FRAME; + byte_code_offset_delta = frame_type - Constants.SAME_FRAME; } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { - byte_code_offset_delta = frame_type - Constants.SAME_LOCALS_1_STACK_ITEM_FRAME; - number_of_stack_items = 1; - types_of_stack_items = new StackMapType[1]; - types_of_stack_items[0] = new StackMapType(file, constant_pool); + byte_code_offset_delta = frame_type - Constants.SAME_LOCALS_1_STACK_ITEM_FRAME; + number_of_stack_items = 1; + types_of_stack_items = new StackMapType[1]; + types_of_stack_items[0] = new StackMapType(file, constant_pool); } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { - byte_code_offset_delta = file.readShort(); - number_of_stack_items = 1; - types_of_stack_items = new StackMapType[1]; - types_of_stack_items[0] = new StackMapType(file, constant_pool); + byte_code_offset_delta = file.readShort(); + number_of_stack_items = 1; + types_of_stack_items = new StackMapType[1]; + types_of_stack_items[0] = new StackMapType(file, constant_pool); } else if (frame_type >= Constants.CHOP_FRAME && frame_type <= Constants.CHOP_FRAME_MAX) { - byte_code_offset_delta = file.readShort(); + byte_code_offset_delta = file.readShort(); } else if (frame_type == Constants.SAME_FRAME_EXTENDED) { - byte_code_offset_delta = file.readShort(); + byte_code_offset_delta = file.readShort(); } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { - byte_code_offset_delta = file.readShort(); - number_of_locals = frame_type - 251; - types_of_locals = new StackMapType[number_of_locals]; - for (int i = 0; i < number_of_locals; i++) { - types_of_locals[i] = new StackMapType(file, constant_pool); - } + byte_code_offset_delta = file.readShort(); + number_of_locals = frame_type - 251; + types_of_locals = new StackMapType[number_of_locals]; + for (int i = 0; i < number_of_locals; i++) { + types_of_locals[i] = new StackMapType(file, constant_pool); + } } else if (frame_type == Constants.FULL_FRAME) { - byte_code_offset_delta = file.readShort(); - number_of_locals = file.readShort(); - types_of_locals = new StackMapType[number_of_locals]; - for (int i = 0; i < number_of_locals; i++) { - types_of_locals[i] = new StackMapType(file, constant_pool); - } - number_of_stack_items = file.readShort(); - types_of_stack_items = new StackMapType[number_of_stack_items]; - for (int i = 0; i < number_of_stack_items; i++) { - types_of_stack_items[i] = new StackMapType(file, constant_pool); - } + byte_code_offset_delta = file.readShort(); + number_of_locals = file.readShort(); + types_of_locals = new StackMapType[number_of_locals]; + for (int i = 0; i < number_of_locals; i++) { + types_of_locals[i] = new StackMapType(file, constant_pool); + } + number_of_stack_items = file.readShort(); + types_of_stack_items = new StackMapType[number_of_stack_items]; + for (int i = 0; i < number_of_stack_items; i++) { + types_of_stack_items[i] = new StackMapType(file, constant_pool); + } } else { - /* Can't happen */ - throw new ClassFormatException ("Invalid frame type found while parsing stack map table: " + frame_type); + /* Can't happen */ + throw new ClassFormatException ("Invalid frame type found while parsing stack map table: " + frame_type); } } @@ -100,7 +100,7 @@ public final class StackMapTableEntry implements Cloneable, Serializable { public StackMapTableEntry(int tag, int byte_code_offset_delta, int number_of_locals, StackMapType[] types_of_locals, int number_of_stack_items, StackMapType[] types_of_stack_items, ConstantPool constant_pool) { - this.frame_type = tag; + this.frame_type = tag; this.byte_code_offset_delta = byte_code_offset_delta; this.number_of_locals = number_of_locals; this.types_of_locals = types_of_locals; @@ -117,23 +117,23 @@ public final class StackMapTableEntry implements Cloneable, Serializable { * @throws IOException */ public final void dump( DataOutputStream file ) throws IOException { - file.write(frame_type); - if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { - // nothing to be done - } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { - types_of_stack_items[0].dump(file); + file.write(frame_type); + if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { + // nothing to be done + } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { + types_of_stack_items[0].dump(file); } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { file.writeShort(byte_code_offset_delta); - types_of_stack_items[0].dump(file); + types_of_stack_items[0].dump(file); } else if (frame_type >= Constants.CHOP_FRAME && frame_type <= Constants.CHOP_FRAME_MAX) { file.writeShort(byte_code_offset_delta); } else if (frame_type == Constants.SAME_FRAME_EXTENDED) { file.writeShort(byte_code_offset_delta); } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { file.writeShort(byte_code_offset_delta); - for (int i = 0; i < number_of_locals; i++) { - types_of_locals[i].dump(file); - } + for (int i = 0; i < number_of_locals; i++) { + types_of_locals[i].dump(file); + } } else if (frame_type == Constants.FULL_FRAME) { file.writeShort(byte_code_offset_delta); file.writeShort(number_of_locals); @@ -145,8 +145,8 @@ public final class StackMapTableEntry implements Cloneable, Serializable { types_of_stack_items[i].dump(file); } } else { - /* Can't happen */ - throw new ClassFormatException ("Invalid Stack map table tag: " + frame_type); + /* Can't happen */ + throw new ClassFormatException ("Invalid Stack map table tag: " + frame_type); } } @@ -159,21 +159,21 @@ public final class StackMapTableEntry implements Cloneable, Serializable { StringBuilder buf = new StringBuilder(64); buf.append("("); if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { - buf.append("SAME"); + buf.append("SAME"); } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { - buf.append("SAME_LOCALS_1_STACK"); + buf.append("SAME_LOCALS_1_STACK"); } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { - buf.append("SAME_LOCALS_1_STACK_EXTENDED"); + buf.append("SAME_LOCALS_1_STACK_EXTENDED"); } else if (frame_type >= Constants.CHOP_FRAME && frame_type <= Constants.CHOP_FRAME_MAX) { - buf.append("CHOP "+(251-frame_type)); + buf.append("CHOP "+(251-frame_type)); } else if (frame_type == Constants.SAME_FRAME_EXTENDED) { - buf.append("SAME_EXTENDED"); + buf.append("SAME_EXTENDED"); } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { - buf.append("APPEND "+(frame_type-251)); + buf.append("APPEND "+(frame_type-251)); } else if (frame_type == Constants.FULL_FRAME) { - buf.append("FULL"); + buf.append("FULL"); } else { - buf.append("UNKNOWN"); + buf.append("UNKNOWN"); } buf.append(", offset delta=").append(byte_code_offset_delta); if (number_of_locals > 0) { diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 46a068ed..62acc511 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -1395,50 +1395,50 @@ public abstract class Utility { * @param vec A list of AnnotationGen objects */ public static Attribute[] getAnnotationAttributes(ConstantPoolGen cp,List vec) { - - if (vec.isEmpty()) { + + if (vec.isEmpty()) { return new Attribute[0]; } - - try { - int countVisible = 0; - int countInvisible = 0; - - // put the annotations in the right output stream - for (AnnotationEntryGen a : vec) { - if (a.isRuntimeVisible()) { + + try { + int countVisible = 0; + int countInvisible = 0; + + // put the annotations in the right output stream + for (AnnotationEntryGen a : vec) { + if (a.isRuntimeVisible()) { countVisible++; } else { countInvisible++; } - } - - ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); - ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); - DataOutputStream rvaDos = new DataOutputStream(rvaBytes); - DataOutputStream riaDos = new DataOutputStream(riaBytes); - - rvaDos.writeShort(countVisible); - riaDos.writeShort(countInvisible); - - // put the annotations in the right output stream - for (AnnotationEntryGen a : vec) { - if (a.isRuntimeVisible()) { + } + + ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); + ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); + DataOutputStream rvaDos = new DataOutputStream(rvaBytes); + DataOutputStream riaDos = new DataOutputStream(riaBytes); + + rvaDos.writeShort(countVisible); + riaDos.writeShort(countInvisible); + + // put the annotations in the right output stream + for (AnnotationEntryGen a : vec) { + if (a.isRuntimeVisible()) { a.dump(rvaDos); } else { a.dump(riaDos); } - } + } rvaDos.close(); riaDos.close(); - + byte[] rvaData = rvaBytes.toByteArray(); byte[] riaData = riaBytes.toByteArray(); - + int rvaIndex = -1; int riaIndex = -1; - + if (rvaData.length>2) { rvaIndex = cp.addUtf8("RuntimeVisibleAnnotations"); } @@ -1446,112 +1446,112 @@ public abstract class Utility { riaIndex = cp.addUtf8("RuntimeInvisibleAnnotations"); } - List newAttributes = new ArrayList(); - if (rvaData.length>2) { - - newAttributes.add( - new RuntimeVisibleAnnotations(rvaIndex,rvaData.length,new DataInputStream(new ByteArrayInputStream(rvaData)),cp.getConstantPool())); - } - if (riaData.length>2) { - newAttributes.add( - new RuntimeInvisibleAnnotations(riaIndex,riaData.length,new DataInputStream(new ByteArrayInputStream(riaData)),cp.getConstantPool())); - } - - return newAttributes.toArray(new Attribute[newAttributes.size()]); - } catch (IOException e) { - System.err.println("IOException whilst processing annotations"); - e.printStackTrace(); - } - return null; + List newAttributes = new ArrayList(); + if (rvaData.length>2) { + + newAttributes.add( + new RuntimeVisibleAnnotations(rvaIndex,rvaData.length,new DataInputStream(new ByteArrayInputStream(rvaData)),cp.getConstantPool())); + } + if (riaData.length>2) { + newAttributes.add( + new RuntimeInvisibleAnnotations(riaIndex,riaData.length,new DataInputStream(new ByteArrayInputStream(riaData)),cp.getConstantPool())); + } + + return newAttributes.toArray(new Attribute[newAttributes.size()]); + } catch (IOException e) { + System.err.println("IOException whilst processing annotations"); + e.printStackTrace(); + } + return null; } /** - * Annotations against a class are stored in one of four attribute kinds: - * - RuntimeVisibleParameterAnnotations - * - RuntimeInvisibleParameterAnnotations - */ - public static Attribute[] getParameterAnnotationAttributes( - ConstantPoolGen cp, - List[] /*Array of lists, array size depends on #params */vec) - { - int visCount[] = new int[vec.length]; - int totalVisCount = 0; - int invisCount[] = new int[vec.length]; - int totalInvisCount = 0; - try { - for (int i = 0; i < vec.length; i++) { - if (vec[i] != null) { - for (AnnotationEntryGen element : vec[i]) { - if (element.isRuntimeVisible()) { - visCount[i]++; - totalVisCount++; - } - else { - invisCount[i]++; - totalInvisCount++; - } - } - } - } - // Lets do the visible ones - ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); - DataOutputStream rvaDos = new DataOutputStream(rvaBytes); - rvaDos.writeByte(vec.length); // First goes number of parameters - for (int i = 0; i < vec.length; i++) { - rvaDos.writeShort(visCount[i]); - if (visCount[i] > 0) { - for (AnnotationEntryGen element : vec[i]) { - if (element.isRuntimeVisible()) { + * Annotations against a class are stored in one of four attribute kinds: + * - RuntimeVisibleParameterAnnotations + * - RuntimeInvisibleParameterAnnotations + */ + public static Attribute[] getParameterAnnotationAttributes( + ConstantPoolGen cp, + List[] /*Array of lists, array size depends on #params */vec) + { + int visCount[] = new int[vec.length]; + int totalVisCount = 0; + int invisCount[] = new int[vec.length]; + int totalInvisCount = 0; + try { + for (int i = 0; i < vec.length; i++) { + if (vec[i] != null) { + for (AnnotationEntryGen element : vec[i]) { + if (element.isRuntimeVisible()) { + visCount[i]++; + totalVisCount++; + } + else { + invisCount[i]++; + totalInvisCount++; + } + } + } + } + // Lets do the visible ones + ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); + DataOutputStream rvaDos = new DataOutputStream(rvaBytes); + rvaDos.writeByte(vec.length); // First goes number of parameters + for (int i = 0; i < vec.length; i++) { + rvaDos.writeShort(visCount[i]); + if (visCount[i] > 0) { + for (AnnotationEntryGen element : vec[i]) { + if (element.isRuntimeVisible()) { element.dump(rvaDos); } - } - } - } - rvaDos.close(); - // Lets do the invisible ones - ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); - DataOutputStream riaDos = new DataOutputStream(riaBytes); - riaDos.writeByte(vec.length); // First goes number of parameters - for (int i = 0; i < vec.length; i++) { - riaDos.writeShort(invisCount[i]); - if (invisCount[i] > 0) { - for (AnnotationEntryGen element : vec[i]) { - if (!element.isRuntimeVisible()) { + } + } + } + rvaDos.close(); + // Lets do the invisible ones + ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); + DataOutputStream riaDos = new DataOutputStream(riaBytes); + riaDos.writeByte(vec.length); // First goes number of parameters + for (int i = 0; i < vec.length; i++) { + riaDos.writeShort(invisCount[i]); + if (invisCount[i] > 0) { + for (AnnotationEntryGen element : vec[i]) { + if (!element.isRuntimeVisible()) { element.dump(riaDos); } - } - } - } - riaDos.close(); - byte[] rvaData = rvaBytes.toByteArray(); - byte[] riaData = riaBytes.toByteArray(); - int rvaIndex = -1; - int riaIndex = -1; - if (totalVisCount > 0) { + } + } + } + riaDos.close(); + byte[] rvaData = rvaBytes.toByteArray(); + byte[] riaData = riaBytes.toByteArray(); + int rvaIndex = -1; + int riaIndex = -1; + if (totalVisCount > 0) { rvaIndex = cp.addUtf8("RuntimeVisibleParameterAnnotations"); } - if (totalInvisCount > 0) { + if (totalInvisCount > 0) { riaIndex = cp.addUtf8("RuntimeInvisibleParameterAnnotations"); } - List newAttributes = new ArrayList(); - if (totalVisCount > 0) { - newAttributes - .add(new RuntimeVisibleParameterAnnotations(rvaIndex, - rvaData.length, new DataInputStream(new ByteArrayInputStream(rvaData)), cp.getConstantPool())); - } - if (totalInvisCount > 0) { - newAttributes - .add(new RuntimeInvisibleParameterAnnotations(riaIndex, - riaData.length, new DataInputStream(new ByteArrayInputStream(riaData)), cp.getConstantPool())); - } - return newAttributes.toArray(new Attribute[newAttributes.size()]); - } - catch (IOException e) { - System.err - .println("IOException whilst processing parameter annotations"); - e.printStackTrace(); - } - return null; - } + List newAttributes = new ArrayList(); + if (totalVisCount > 0) { + newAttributes + .add(new RuntimeVisibleParameterAnnotations(rvaIndex, + rvaData.length, new DataInputStream(new ByteArrayInputStream(rvaData)), cp.getConstantPool())); + } + if (totalInvisCount > 0) { + newAttributes + .add(new RuntimeInvisibleParameterAnnotations(riaIndex, + riaData.length, new DataInputStream(new ByteArrayInputStream(riaData)), cp.getConstantPool())); + } + return newAttributes.toArray(new Attribute[newAttributes.size()]); + } + catch (IOException e) { + System.err + .println("IOException whilst processing parameter annotations"); + e.printStackTrace(); + } + return null; + } } diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java index 63abb41e..4dc66317 100644 --- a/src/main/java/org/apache/bcel/classfile/Visitor.java +++ b/src/main/java/org/apache/bcel/classfile/Visitor.java @@ -27,87 +27,87 @@ package org.apache.bcel.classfile; */ public interface Visitor { - void visitCode(Code obj); + void visitCode(Code obj); - void visitCodeException(CodeException obj); + void visitCodeException(CodeException obj); - void visitConstantClass(ConstantClass obj); + void visitConstantClass(ConstantClass obj); - void visitConstantDouble(ConstantDouble obj); + void visitConstantDouble(ConstantDouble obj); - void visitConstantFieldref(ConstantFieldref obj); + void visitConstantFieldref(ConstantFieldref obj); - void visitConstantFloat(ConstantFloat obj); + void visitConstantFloat(ConstantFloat obj); - void visitConstantInteger(ConstantInteger obj); + void visitConstantInteger(ConstantInteger obj); - void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj); + void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj); - void visitConstantLong(ConstantLong obj); + void visitConstantLong(ConstantLong obj); - void visitConstantMethodref(ConstantMethodref obj); + void visitConstantMethodref(ConstantMethodref obj); - void visitConstantNameAndType(ConstantNameAndType obj); + void visitConstantNameAndType(ConstantNameAndType obj); - void visitConstantPool(ConstantPool obj); + void visitConstantPool(ConstantPool obj); - void visitConstantString(ConstantString obj); + void visitConstantString(ConstantString obj); - void visitConstantUtf8(ConstantUtf8 obj); + void visitConstantUtf8(ConstantUtf8 obj); - void visitConstantValue(ConstantValue obj); + void visitConstantValue(ConstantValue obj); - void visitDeprecated(Deprecated obj); + void visitDeprecated(Deprecated obj); - void visitExceptionTable(ExceptionTable obj); + void visitExceptionTable(ExceptionTable obj); - void visitField(Field obj); + void visitField(Field obj); - void visitInnerClass(InnerClass obj); + void visitInnerClass(InnerClass obj); - void visitInnerClasses(InnerClasses obj); + void visitInnerClasses(InnerClasses obj); - void visitJavaClass(JavaClass obj); + void visitJavaClass(JavaClass obj); - void visitLineNumber(LineNumber obj); + void visitLineNumber(LineNumber obj); - void visitLineNumberTable(LineNumberTable obj); + void visitLineNumberTable(LineNumberTable obj); - void visitLocalVariable(LocalVariable obj); + void visitLocalVariable(LocalVariable obj); - void visitLocalVariableTable(LocalVariableTable obj); + void visitLocalVariableTable(LocalVariableTable obj); - void visitMethod(Method obj); + void visitMethod(Method obj); - void visitSignature(Signature obj); + void visitSignature(Signature obj); - void visitSourceFile(SourceFile obj); + void visitSourceFile(SourceFile obj); - void visitSynthetic(Synthetic obj); + void visitSynthetic(Synthetic obj); - void visitUnknown(Unknown obj); + void visitUnknown(Unknown obj); - void visitStackMap(StackMap obj); + void visitStackMap(StackMap obj); - void visitStackMapEntry(StackMapEntry obj); + void visitStackMapEntry(StackMapEntry obj); - void visitStackMapTable(StackMapTable obj); + void visitStackMapTable(StackMapTable obj); - void visitStackMapTableEntry(StackMapTableEntry obj); + void visitStackMapTableEntry(StackMapTableEntry obj); - void visitAnnotation(Annotations obj); + void visitAnnotation(Annotations obj); - void visitParameterAnnotation(ParameterAnnotations obj); + void visitParameterAnnotation(ParameterAnnotations obj); - void visitAnnotationEntry(AnnotationEntry obj); + void visitAnnotationEntry(AnnotationEntry obj); - void visitAnnotationDefault(AnnotationDefault obj); + void visitAnnotationDefault(AnnotationDefault obj); - void visitLocalVariableTypeTable(LocalVariableTypeTable obj); + void visitLocalVariableTypeTable(LocalVariableTypeTable obj); - void visitEnclosingMethod(EnclosingMethod obj); + void visitEnclosingMethod(EnclosingMethod obj); void visitBootstrapMethods(BootstrapMethods obj); - + void visitMethodParameters(MethodParameters obj); } diff --git a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java index aeee7351..347d2888 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java @@ -24,58 +24,58 @@ import org.apache.bcel.classfile.ElementValue; public class AnnotationElementValueGen extends ElementValueGen { - // For annotation element values, this is the annotation - private AnnotationEntryGen a; + // For annotation element values, this is the annotation + private AnnotationEntryGen a; - public AnnotationElementValueGen(AnnotationEntryGen a, ConstantPoolGen cpool) - { - super(ANNOTATION, cpool); - this.a = a; - } + public AnnotationElementValueGen(AnnotationEntryGen a, ConstantPoolGen cpool) + { + super(ANNOTATION, cpool); + this.a = a; + } - public AnnotationElementValueGen(int type, AnnotationEntryGen annotation, - ConstantPoolGen cpool) - { - super(type, cpool); - if (type != ANNOTATION) { + public AnnotationElementValueGen(int type, AnnotationEntryGen annotation, + ConstantPoolGen cpool) + { + super(type, cpool); + if (type != ANNOTATION) { throw new RuntimeException( - "Only element values of type annotation can be built with this ctor - type specified: " + type); + "Only element values of type annotation can be built with this ctor - type specified: " + type); } - this.a = annotation; - } + this.a = annotation; + } - public AnnotationElementValueGen(AnnotationElementValue value, - ConstantPoolGen cpool, boolean copyPoolEntries) - { - super(ANNOTATION, cpool); - a = new AnnotationEntryGen(value.getAnnotationEntry(), cpool, copyPoolEntries); - } + public AnnotationElementValueGen(AnnotationElementValue value, + ConstantPoolGen cpool, boolean copyPoolEntries) + { + super(ANNOTATION, cpool); + a = new AnnotationEntryGen(value.getAnnotationEntry(), cpool, copyPoolEntries); + } - @Override + @Override public void dump(DataOutputStream dos) throws IOException - { - dos.writeByte(type); // u1 type of value (ANNOTATION == '@') - a.dump(dos); - } + { + dos.writeByte(type); // u1 type of value (ANNOTATION == '@') + a.dump(dos); + } - @Override + @Override public String stringifyValue() - { - throw new RuntimeException("Not implemented yet"); - } + { + throw new RuntimeException("Not implemented yet"); + } - /** - * Return immutable variant of this AnnotationElementValueGen - */ - @Override + /** + * Return immutable variant of this AnnotationElementValueGen + */ + @Override public ElementValue getElementValue() - { - return new AnnotationElementValue(this.type, a.getAnnotation(), cpGen - .getConstantPool()); - } + { + return new AnnotationElementValue(this.type, a.getAnnotation(), cpGen + .getConstantPool()); + } - public AnnotationEntryGen getAnnotation() - { - return a; - } + public AnnotationEntryGen getAnnotation() + { + return a; + } } diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index b7a24abd..e4dd15e7 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -30,177 +30,177 @@ import org.apache.bcel.classfile.ElementValuePair; public class AnnotationEntryGen { - private int typeIndex; - - private List evs; - - private ConstantPoolGen cpool; - - private boolean isRuntimeVisible = false; - - /** - * Here we are taking a fixed annotation of type Annotation and building a - * modifiable AnnotationGen object. If the pool passed in is for a different - * class file, then copyPoolEntries should have been passed as true as that - * will force us to do a deep copy of the annotation and move the cpool - * entries across. We need to copy the type and the element name value pairs - * and the visibility. - */ - public AnnotationEntryGen(AnnotationEntry a, ConstantPoolGen cpool, - boolean copyPoolEntries) - { - this.cpool = cpool; - if (copyPoolEntries) - { - typeIndex = cpool.addUtf8(a.getAnnotationType()); - } - else - { - typeIndex = a.getAnnotationTypeIndex(); - } - isRuntimeVisible = a.isRuntimeVisible(); - evs = copyValues(a.getElementValuePairs(), cpool, copyPoolEntries); - } - - private List copyValues(ElementValuePair[] in, ConstantPoolGen cpool, - boolean copyPoolEntries) - { - List out = new ArrayList(); - int l = in.length; + private int typeIndex; + + private List evs; + + private ConstantPoolGen cpool; + + private boolean isRuntimeVisible = false; + + /** + * Here we are taking a fixed annotation of type Annotation and building a + * modifiable AnnotationGen object. If the pool passed in is for a different + * class file, then copyPoolEntries should have been passed as true as that + * will force us to do a deep copy of the annotation and move the cpool + * entries across. We need to copy the type and the element name value pairs + * and the visibility. + */ + public AnnotationEntryGen(AnnotationEntry a, ConstantPoolGen cpool, + boolean copyPoolEntries) + { + this.cpool = cpool; + if (copyPoolEntries) + { + typeIndex = cpool.addUtf8(a.getAnnotationType()); + } + else + { + typeIndex = a.getAnnotationTypeIndex(); + } + isRuntimeVisible = a.isRuntimeVisible(); + evs = copyValues(a.getElementValuePairs(), cpool, copyPoolEntries); + } + + private List copyValues(ElementValuePair[] in, ConstantPoolGen cpool, + boolean copyPoolEntries) + { + List out = new ArrayList(); + int l = in.length; for (ElementValuePair nvp : in) { out.add(new ElementValuePairGen(nvp, cpool, copyPoolEntries)); } - return out; - } - - private AnnotationEntryGen(ConstantPoolGen cpool) - { - this.cpool = cpool; - } - - /** - * Retrieve an immutable version of this AnnotationGen - */ - public AnnotationEntry getAnnotation() - { - AnnotationEntry a = new AnnotationEntry(typeIndex, cpool.getConstantPool(), - isRuntimeVisible); - for (ElementValuePairGen element : evs) { - a.addElementNameValuePair(element.getElementNameValuePair()); - } - return a; - } - - public AnnotationEntryGen(ObjectType type, - List elements, boolean vis, - ConstantPoolGen cpool) - { - this.cpool = cpool; - this.typeIndex = cpool.addUtf8(type.getSignature()); - evs = elements; - isRuntimeVisible = vis; - } - - public static AnnotationEntryGen read(DataInputStream dis, - ConstantPoolGen cpool, boolean b) throws IOException - { - AnnotationEntryGen a = new AnnotationEntryGen(cpool); - a.typeIndex = dis.readUnsignedShort(); - int elemValuePairCount = dis.readUnsignedShort(); - for (int i = 0; i < elemValuePairCount; i++) - { - int nidx = dis.readUnsignedShort(); - a.addElementNameValuePair(new ElementValuePairGen(nidx, - ElementValueGen.readElementValue(dis, cpool), cpool)); - } - a.isRuntimeVisible(b); - return a; - } - - public void dump(DataOutputStream dos) throws IOException - { - dos.writeShort(typeIndex); // u2 index of type name in cpool - dos.writeShort(evs.size()); // u2 element_value pair count + return out; + } + + private AnnotationEntryGen(ConstantPoolGen cpool) + { + this.cpool = cpool; + } + + /** + * Retrieve an immutable version of this AnnotationGen + */ + public AnnotationEntry getAnnotation() + { + AnnotationEntry a = new AnnotationEntry(typeIndex, cpool.getConstantPool(), + isRuntimeVisible); + for (ElementValuePairGen element : evs) { + a.addElementNameValuePair(element.getElementNameValuePair()); + } + return a; + } + + public AnnotationEntryGen(ObjectType type, + List elements, boolean vis, + ConstantPoolGen cpool) + { + this.cpool = cpool; + this.typeIndex = cpool.addUtf8(type.getSignature()); + evs = elements; + isRuntimeVisible = vis; + } + + public static AnnotationEntryGen read(DataInputStream dis, + ConstantPoolGen cpool, boolean b) throws IOException + { + AnnotationEntryGen a = new AnnotationEntryGen(cpool); + a.typeIndex = dis.readUnsignedShort(); + int elemValuePairCount = dis.readUnsignedShort(); + for (int i = 0; i < elemValuePairCount; i++) + { + int nidx = dis.readUnsignedShort(); + a.addElementNameValuePair(new ElementValuePairGen(nidx, + ElementValueGen.readElementValue(dis, cpool), cpool)); + } + a.isRuntimeVisible(b); + return a; + } + + public void dump(DataOutputStream dos) throws IOException + { + dos.writeShort(typeIndex); // u2 index of type name in cpool + dos.writeShort(evs.size()); // u2 element_value pair count for (ElementValuePairGen envp : evs) { envp.dump(dos); } - } + } - public void addElementNameValuePair(ElementValuePairGen evp) - { - if (evs == null) { + public void addElementNameValuePair(ElementValuePairGen evp) + { + if (evs == null) { evs = new ArrayList(); } - evs.add(evp); - } - - public int getTypeIndex() - { - return typeIndex; - } - - public final String getTypeSignature() - { - // ConstantClass c = (ConstantClass)cpool.getConstant(typeIndex); - ConstantUtf8 utf8 = (ConstantUtf8) cpool - .getConstant(typeIndex/* c.getNameIndex() */); - return utf8.getBytes(); - } - - public final String getTypeName() - { - return getTypeSignature();// BCELBUG: Should I use this instead? - // Utility.signatureToString(getTypeSignature()); - } - - /** - * Returns list of ElementNameValuePair objects - */ - public List getValues() - { - return evs; - } - - @Override + evs.add(evp); + } + + public int getTypeIndex() + { + return typeIndex; + } + + public final String getTypeSignature() + { + // ConstantClass c = (ConstantClass)cpool.getConstant(typeIndex); + ConstantUtf8 utf8 = (ConstantUtf8) cpool + .getConstant(typeIndex/* c.getNameIndex() */); + return utf8.getBytes(); + } + + public final String getTypeName() + { + return getTypeSignature();// BCELBUG: Should I use this instead? + // Utility.signatureToString(getTypeSignature()); + } + + /** + * Returns list of ElementNameValuePair objects + */ + public List getValues() + { + return evs; + } + + @Override public String toString() - { - StringBuilder s = new StringBuilder(32); - s.append("AnnotationGen:[" + getTypeName() + " #" + evs.size() + " {"); - for (int i = 0; i < evs.size(); i++) - { - s.append(evs.get(i)); - if (i + 1 < evs.size()) { + { + StringBuilder s = new StringBuilder(32); + s.append("AnnotationGen:[" + getTypeName() + " #" + evs.size() + " {"); + for (int i = 0; i < evs.size(); i++) + { + s.append(evs.get(i)); + if (i + 1 < evs.size()) { s.append(","); } - } - s.append("}]"); - return s.toString(); - } - - public String toShortString() - { - StringBuilder s = new StringBuilder(); - s.append("@" + getTypeName() + "("); - for (int i = 0; i < evs.size(); i++) - { - s.append(evs.get(i)); - if (i + 1 < evs.size()) { + } + s.append("}]"); + return s.toString(); + } + + public String toShortString() + { + StringBuilder s = new StringBuilder(); + s.append("@" + getTypeName() + "("); + for (int i = 0; i < evs.size(); i++) + { + s.append(evs.get(i)); + if (i + 1 < evs.size()) { s.append(","); } - } - s.append(")"); - return s.toString(); - } - - private void isRuntimeVisible(boolean b) - { - isRuntimeVisible = b; - } - - public boolean isRuntimeVisible() - { - return isRuntimeVisible; - } + } + s.append(")"); + return s.toString(); + } + + private void isRuntimeVisible(boolean b) + { + isRuntimeVisible = b; + } + + public boolean isRuntimeVisible() + { + return isRuntimeVisible; + } } diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index 88467b6d..f13b9f5f 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -27,97 +27,97 @@ import org.apache.bcel.classfile.ElementValue; public class ArrayElementValueGen extends ElementValueGen { - // J5TODO: Should we make this an array or a list? A list would be easier to - // modify ... - private List evalues; + // J5TODO: Should we make this an array or a list? A list would be easier to + // modify ... + private List evalues; - public ArrayElementValueGen(ConstantPoolGen cp) - { - super(ARRAY, cp); - evalues = new ArrayList(); - } + public ArrayElementValueGen(ConstantPoolGen cp) + { + super(ARRAY, cp); + evalues = new ArrayList(); + } - public ArrayElementValueGen(int type, ElementValue[] datums, - ConstantPoolGen cpool) - { - super(type, cpool); - if (type != ARRAY) { + public ArrayElementValueGen(int type, ElementValue[] datums, + ConstantPoolGen cpool) + { + super(type, cpool); + if (type != ARRAY) { throw new RuntimeException( - "Only element values of type array can be built with this ctor - type specified: " + type); + "Only element values of type array can be built with this ctor - type specified: " + type); } - this.evalues = new ArrayList(); - for (ElementValue datum : datums) { - evalues.add(ElementValueGen.copy(datum, cpool, true)); - } - } + this.evalues = new ArrayList(); + for (ElementValue datum : datums) { + evalues.add(ElementValueGen.copy(datum, cpool, true)); + } + } - /** - * Return immutable variant of this ArrayElementValueGen - */ - @Override + /** + * Return immutable variant of this ArrayElementValueGen + */ + @Override public ElementValue getElementValue() - { - ElementValue[] immutableData = new ElementValue[evalues.size()]; - int i = 0; - for (ElementValueGen element : evalues) { - immutableData[i++] = element.getElementValue(); - } - return new ArrayElementValue(type, immutableData, cpGen - .getConstantPool()); - } + { + ElementValue[] immutableData = new ElementValue[evalues.size()]; + int i = 0; + for (ElementValueGen element : evalues) { + immutableData[i++] = element.getElementValue(); + } + return new ArrayElementValue(type, immutableData, cpGen + .getConstantPool()); + } - /** - * @param value - * @param cpool - */ - public ArrayElementValueGen(ArrayElementValue value, ConstantPoolGen cpool, - boolean copyPoolEntries) - { - super(ARRAY, cpool); - evalues = new ArrayList(); - ElementValue[] in = value.getElementValuesArray(); - for (ElementValue element : in) { - evalues.add(ElementValueGen.copy(element, cpool, copyPoolEntries)); - } - } + /** + * @param value + * @param cpool + */ + public ArrayElementValueGen(ArrayElementValue value, ConstantPoolGen cpool, + boolean copyPoolEntries) + { + super(ARRAY, cpool); + evalues = new ArrayList(); + ElementValue[] in = value.getElementValuesArray(); + for (ElementValue element : in) { + evalues.add(ElementValueGen.copy(element, cpool, copyPoolEntries)); + } + } - @Override + @Override public void dump(DataOutputStream dos) throws IOException - { - dos.writeByte(type); // u1 type of value (ARRAY == '[') - dos.writeShort(evalues.size()); - for (ElementValueGen element : evalues) { - element.dump(dos); - } - } + { + dos.writeByte(type); // u1 type of value (ARRAY == '[') + dos.writeShort(evalues.size()); + for (ElementValueGen element : evalues) { + element.dump(dos); + } + } - @Override + @Override public String stringifyValue() - { - StringBuilder sb = new StringBuilder(); - sb.append("["); - String comma = ""; - for (ElementValueGen element : evalues) { - sb.append(comma); - comma = ","; - sb.append(element.stringifyValue()); - } - sb.append("]"); - return sb.toString(); - } + { + StringBuilder sb = new StringBuilder(); + sb.append("["); + String comma = ""; + for (ElementValueGen element : evalues) { + sb.append(comma); + comma = ","; + sb.append(element.stringifyValue()); + } + sb.append("]"); + return sb.toString(); + } - public List getElementValues() - { - return evalues; - } + public List getElementValues() + { + return evalues; + } - public int getElementValuesSize() - { - return evalues.size(); - } + public int getElementValuesSize() + { + return evalues.size(); + } - public void addElement(ElementValueGen gen) - { - evalues.add(gen); - } + public void addElement(ElementValueGen gen) + { + evalues.add(gen); + } } diff --git a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java index 25af238d..3558d37d 100644 --- a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java @@ -28,73 +28,73 @@ import org.apache.bcel.generic.ElementValueGen; public class ClassElementValueGen extends ElementValueGen { - // For primitive types and string type, this points to the value entry in - // the cpool - // For 'class' this points to the class entry in the cpool - private int idx; + // For primitive types and string type, this points to the value entry in + // the cpool + // For 'class' this points to the class entry in the cpool + private int idx; - protected ClassElementValueGen(int typeIdx, ConstantPoolGen cpool) - { - super(ElementValueGen.CLASS, cpool); - this.idx = typeIdx; - } + protected ClassElementValueGen(int typeIdx, ConstantPoolGen cpool) + { + super(ElementValueGen.CLASS, cpool); + this.idx = typeIdx; + } - public ClassElementValueGen(ObjectType t, ConstantPoolGen cpool) - { - super(ElementValueGen.CLASS, cpool); - // this.idx = cpool.addClass(t); - idx = cpool.addUtf8(t.getSignature()); - } + public ClassElementValueGen(ObjectType t, ConstantPoolGen cpool) + { + super(ElementValueGen.CLASS, cpool); + // this.idx = cpool.addClass(t); + idx = cpool.addUtf8(t.getSignature()); + } - /** - * Return immutable variant of this ClassElementValueGen - */ - @Override + /** + * Return immutable variant of this ClassElementValueGen + */ + @Override public ElementValue getElementValue() - { - return new ClassElementValue(type, idx, cpGen.getConstantPool()); - } + { + return new ClassElementValue(type, idx, cpGen.getConstantPool()); + } - public ClassElementValueGen(ClassElementValue value, ConstantPoolGen cpool, - boolean copyPoolEntries) - { - super(CLASS, cpool); - if (copyPoolEntries) - { - // idx = cpool.addClass(value.getClassString()); - idx = cpool.addUtf8(value.getClassString()); - } - else - { - idx = value.getIndex(); - } - } + public ClassElementValueGen(ClassElementValue value, ConstantPoolGen cpool, + boolean copyPoolEntries) + { + super(CLASS, cpool); + if (copyPoolEntries) + { + // idx = cpool.addClass(value.getClassString()); + idx = cpool.addUtf8(value.getClassString()); + } + else + { + idx = value.getIndex(); + } + } - public int getIndex() - { - return idx; - } + public int getIndex() + { + return idx; + } - public String getClassString() - { - ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(idx); - return cu8.getBytes(); - // ConstantClass c = (ConstantClass)getConstantPool().getConstant(idx); - // ConstantUtf8 utf8 = - // (ConstantUtf8)getConstantPool().getConstant(c.getNameIndex()); - // return utf8.getBytes(); - } + public String getClassString() + { + ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(idx); + return cu8.getBytes(); + // ConstantClass c = (ConstantClass)getConstantPool().getConstant(idx); + // ConstantUtf8 utf8 = + // (ConstantUtf8)getConstantPool().getConstant(c.getNameIndex()); + // return utf8.getBytes(); + } - @Override + @Override public String stringifyValue() - { - return getClassString(); - } + { + return getClassString(); + } - @Override + @Override public void dump(DataOutputStream dos) throws IOException - { - dos.writeByte(type); // u1 kind of value - dos.writeShort(idx); - } + { + dos.writeByte(type); // u1 kind of value + dos.writeShort(idx); + } } diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 4a9bcbbf..342f2d8c 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -58,7 +58,7 @@ public class ClassGen extends AccessFlags implements Cloneable { private List attribute_vec = new ArrayList(); private List interface_vec = new ArrayList(); private List annotation_vec = new ArrayList(); - + private static BCELComparator _cmp = new BCELComparator() { public boolean equals( Object o1, Object o2 ) { @@ -159,36 +159,36 @@ public class ClassGen extends AccessFlags implements Cloneable { addField(field); } } - + /** - * Look for attributes representing annotations and unpack them. - */ - private AnnotationEntryGen[] unpackAnnotations(Attribute[] attrs) - { - List annotationGenObjs = new ArrayList(); - for (Attribute attr : attrs) { - if (attr instanceof RuntimeVisibleAnnotations) - { - RuntimeVisibleAnnotations rva = (RuntimeVisibleAnnotations) attr; - AnnotationEntry[] annos = rva.getAnnotationEntries(); - for (AnnotationEntry a : annos) { - annotationGenObjs.add(new AnnotationEntryGen(a, - getConstantPool(), false)); - } - } - else - if (attr instanceof RuntimeInvisibleAnnotations) - { - RuntimeInvisibleAnnotations ria = (RuntimeInvisibleAnnotations) attr; - AnnotationEntry[] annos = ria.getAnnotationEntries(); - for (AnnotationEntry a : annos) { - annotationGenObjs.add(new AnnotationEntryGen(a, - getConstantPool(), false)); - } - } - } - return annotationGenObjs.toArray(new AnnotationEntryGen[annotationGenObjs.size()]); - } + * Look for attributes representing annotations and unpack them. + */ + private AnnotationEntryGen[] unpackAnnotations(Attribute[] attrs) + { + List annotationGenObjs = new ArrayList(); + for (Attribute attr : attrs) { + if (attr instanceof RuntimeVisibleAnnotations) + { + RuntimeVisibleAnnotations rva = (RuntimeVisibleAnnotations) attr; + AnnotationEntry[] annos = rva.getAnnotationEntries(); + for (AnnotationEntry a : annos) { + annotationGenObjs.add(new AnnotationEntryGen(a, + getConstantPool(), false)); + } + } + else + if (attr instanceof RuntimeInvisibleAnnotations) + { + RuntimeInvisibleAnnotations ria = (RuntimeInvisibleAnnotations) attr; + AnnotationEntry[] annos = ria.getAnnotationEntries(); + for (AnnotationEntry a : annos) { + annotationGenObjs.add(new AnnotationEntryGen(a, + getConstantPool(), false)); + } + } + } + return annotationGenObjs.toArray(new AnnotationEntryGen[annotationGenObjs.size()]); + } /** @@ -200,9 +200,9 @@ public class ClassGen extends AccessFlags implements Cloneable { Method[] methods = getMethods(); Attribute[] attributes = null; if (annotation_vec.isEmpty()) { - attributes = getAttributes(); + attributes = getAttributes(); } else { - // TODO: Sometime later, trash any attributes called 'RuntimeVisibleAnnotations' or 'RuntimeInvisibleAnnotations' + // TODO: Sometime later, trash any attributes called 'RuntimeVisibleAnnotations' or 'RuntimeInvisibleAnnotations' Attribute[] annAttributes = Utility.getAnnotationAttributes(cp,annotation_vec); attributes = new Attribute[attribute_vec.size()+annAttributes.length]; attribute_vec.toArray(attributes); @@ -272,9 +272,9 @@ public class ClassGen extends AccessFlags implements Cloneable { public void addAttribute( Attribute a ) { attribute_vec.add(a); } - + public void addAnnotationEntry(AnnotationEntryGen a) { - annotation_vec.add(a); + annotation_vec.add(a); } @@ -478,10 +478,10 @@ public class ClassGen extends AccessFlags implements Cloneable { public Attribute[] getAttributes() { return attribute_vec.toArray(new Attribute[attribute_vec.size()]); } - + // J5TODO: Should we make calling unpackAnnotations() lazy and put it in here? public AnnotationEntryGen[] getAnnotationEntries() { - return annotation_vec.toArray(new AnnotationEntryGen[annotation_vec.size()]); + return annotation_vec.toArray(new AnnotationEntryGen[annotation_vec.size()]); } diff --git a/src/main/java/org/apache/bcel/generic/ClassGenException.java b/src/main/java/org/apache/bcel/generic/ClassGenException.java index 963bddf2..521f1b02 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGenException.java +++ b/src/main/java/org/apache/bcel/generic/ClassGenException.java @@ -36,8 +36,8 @@ public class ClassGenException extends RuntimeException { public ClassGenException(String s) { super(s); } - + public ClassGenException(String s, Throwable initCause) { - super(s, initCause); + super(s, initCause); } } diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index 50786550..714cdafa 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -79,16 +79,16 @@ public class ConstantPoolGen implements java.io.Serializable { */ public ConstantPoolGen(Constant[] cs) { StringBuilder sb = new StringBuilder(256); - + size = Math.max(256, cs.length + 64); constants = new Constant[size]; - + System.arraycopy(cs, 0, constants, 0, cs.length); if (cs.length > 0) { index = cs.length; } - - + + for (int i = 1; i < index; i++) { Constant c = constants[i]; if (c instanceof ConstantString) { @@ -109,13 +109,13 @@ public class ConstantPoolGen implements java.io.Serializable { ConstantNameAndType n = (ConstantNameAndType) c; ConstantUtf8 u8 = (ConstantUtf8) constants[n.getNameIndex()]; ConstantUtf8 u8_2 = (ConstantUtf8) constants[n.getSignatureIndex()]; - + sb.append(u8.getBytes()); sb.append(NAT_DELIM); sb.append(u8_2.getBytes()); String key = sb.toString(); sb.delete(0, sb.length()); - + if (!n_a_t_table.containsKey(key)) { n_a_t_table.put(key, new Index(i)); } @@ -141,7 +141,7 @@ public class ConstantPoolGen implements java.io.Serializable { } else if (c instanceof ConstantFieldref) { delim = FIELDREF_DELIM; } - + sb.append(class_name); sb.append(delim); sb.append(method_name); @@ -149,7 +149,7 @@ public class ConstantPoolGen implements java.io.Serializable { sb.append(signature); String key = sb.toString(); sb.delete(0, sb.length()); - + if (!cp_table.containsKey(key)) { cp_table.put(key, new Index(i)); } @@ -170,7 +170,7 @@ public class ConstantPoolGen implements java.io.Serializable { * Create empty constant pool. */ public ConstantPoolGen() { - size = 256; + size = 256; constants = new Constant[size]; } diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java index 1be6a4eb..ac7cfa85 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -31,155 +31,155 @@ import org.apache.bcel.classfile.SimpleElementValue; public abstract class ElementValueGen { - protected int type; - - protected ConstantPoolGen cpGen; - - protected ElementValueGen(int type, ConstantPoolGen cpGen) - { - this.type = type; - this.cpGen = cpGen; - } - - /** - * Subtypes return an immutable variant of the ElementValueGen - */ - public abstract ElementValue getElementValue(); - - public int getElementValueType() - { - return type; - } - - public abstract String stringifyValue(); - - public abstract void dump(DataOutputStream dos) throws IOException; - - public static final int STRING = 's'; - - public static final int ENUM_CONSTANT = 'e'; - - public static final int CLASS = 'c'; - - public static final int ANNOTATION = '@'; - - public static final int ARRAY = '['; - - public static final int PRIMITIVE_INT = 'I'; - - public static final int PRIMITIVE_BYTE = 'B'; - - public static final int PRIMITIVE_CHAR = 'C'; - - public static final int PRIMITIVE_DOUBLE = 'D'; - - public static final int PRIMITIVE_FLOAT = 'F'; - - public static final int PRIMITIVE_LONG = 'J'; - - public static final int PRIMITIVE_SHORT = 'S'; - - public static final int PRIMITIVE_BOOLEAN = 'Z'; - - public static ElementValueGen readElementValue(DataInputStream dis, - ConstantPoolGen cpGen) throws IOException - { - int type = dis.readUnsignedByte(); - switch (type) - { - case 'B': // byte - return new SimpleElementValueGen(PRIMITIVE_BYTE, dis - .readUnsignedShort(), cpGen); - case 'C': // char - return new SimpleElementValueGen(PRIMITIVE_CHAR, dis - .readUnsignedShort(), cpGen); - case 'D': // double - return new SimpleElementValueGen(PRIMITIVE_DOUBLE, dis - .readUnsignedShort(), cpGen); - case 'F': // float - return new SimpleElementValueGen(PRIMITIVE_FLOAT, dis - .readUnsignedShort(), cpGen); - case 'I': // int - return new SimpleElementValueGen(PRIMITIVE_INT, dis - .readUnsignedShort(), cpGen); - case 'J': // long - return new SimpleElementValueGen(PRIMITIVE_LONG, dis - .readUnsignedShort(), cpGen); - case 'S': // short - return new SimpleElementValueGen(PRIMITIVE_SHORT, dis - .readUnsignedShort(), cpGen); - case 'Z': // boolean - return new SimpleElementValueGen(PRIMITIVE_BOOLEAN, dis - .readUnsignedShort(), cpGen); - case 's': // String - return new SimpleElementValueGen(STRING, dis.readUnsignedShort(), - cpGen); - case 'e': // Enum constant - return new EnumElementValueGen(dis.readUnsignedShort(), dis - .readUnsignedShort(), cpGen); - case 'c': // Class - return new ClassElementValueGen(dis.readUnsignedShort(), cpGen); - case '@': // Annotation - // TODO: isRuntimeVisible ?????????? - // FIXME - return new AnnotationElementValueGen(ANNOTATION, - new AnnotationEntryGen(AnnotationEntry.read(dis, cpGen - .getConstantPool(), true), cpGen, false), cpGen); - case '[': // Array - int numArrayVals = dis.readUnsignedShort(); - ElementValue[] evalues = new ElementValue[numArrayVals]; - for (int j = 0; j < numArrayVals; j++) - { - evalues[j] = ElementValue.readElementValue(dis, cpGen - .getConstantPool()); - } - return new ArrayElementValueGen(ARRAY, evalues, cpGen); - default: - throw new RuntimeException( - "Unexpected element value kind in annotation: " + type); - } - } - - protected ConstantPoolGen getConstantPool() - { - return cpGen; - } - - /** - * Creates an (modifiable) ElementValueGen copy of an (immutable) - * ElementValue - constant pool is assumed correct. - */ - public static ElementValueGen copy(ElementValue value, - ConstantPoolGen cpool, boolean copyPoolEntries) - { - switch (value.getElementValueType()) - { - case 'B': // byte - case 'C': // char - case 'D': // double - case 'F': // float - case 'I': // int - case 'J': // long - case 'S': // short - case 'Z': // boolean - case 's': // String - return new SimpleElementValueGen((SimpleElementValue) value, cpool, - copyPoolEntries); - case 'e': // Enum constant - return new EnumElementValueGen((EnumElementValue) value, cpool, - copyPoolEntries); - case '@': // Annotation - return new AnnotationElementValueGen( - (AnnotationElementValue) value, cpool, copyPoolEntries); - case '[': // Array - return new ArrayElementValueGen((ArrayElementValue) value, cpool, - copyPoolEntries); - case 'c': // Class - return new ClassElementValueGen((ClassElementValue) value, cpool, - copyPoolEntries); - default: - throw new RuntimeException("Not implemented yet! (" - + value.getElementValueType() + ")"); - } - } + protected int type; + + protected ConstantPoolGen cpGen; + + protected ElementValueGen(int type, ConstantPoolGen cpGen) + { + this.type = type; + this.cpGen = cpGen; + } + + /** + * Subtypes return an immutable variant of the ElementValueGen + */ + public abstract ElementValue getElementValue(); + + public int getElementValueType() + { + return type; + } + + public abstract String stringifyValue(); + + public abstract void dump(DataOutputStream dos) throws IOException; + + public static final int STRING = 's'; + + public static final int ENUM_CONSTANT = 'e'; + + public static final int CLASS = 'c'; + + public static final int ANNOTATION = '@'; + + public static final int ARRAY = '['; + + public static final int PRIMITIVE_INT = 'I'; + + public static final int PRIMITIVE_BYTE = 'B'; + + public static final int PRIMITIVE_CHAR = 'C'; + + public static final int PRIMITIVE_DOUBLE = 'D'; + + public static final int PRIMITIVE_FLOAT = 'F'; + + public static final int PRIMITIVE_LONG = 'J'; + + public static final int PRIMITIVE_SHORT = 'S'; + + public static final int PRIMITIVE_BOOLEAN = 'Z'; + + public static ElementValueGen readElementValue(DataInputStream dis, + ConstantPoolGen cpGen) throws IOException + { + int type = dis.readUnsignedByte(); + switch (type) + { + case 'B': // byte + return new SimpleElementValueGen(PRIMITIVE_BYTE, dis + .readUnsignedShort(), cpGen); + case 'C': // char + return new SimpleElementValueGen(PRIMITIVE_CHAR, dis + .readUnsignedShort(), cpGen); + case 'D': // double + return new SimpleElementValueGen(PRIMITIVE_DOUBLE, dis + .readUnsignedShort(), cpGen); + case 'F': // float + return new SimpleElementValueGen(PRIMITIVE_FLOAT, dis + .readUnsignedShort(), cpGen); + case 'I': // int + return new SimpleElementValueGen(PRIMITIVE_INT, dis + .readUnsignedShort(), cpGen); + case 'J': // long + return new SimpleElementValueGen(PRIMITIVE_LONG, dis + .readUnsignedShort(), cpGen); + case 'S': // short + return new SimpleElementValueGen(PRIMITIVE_SHORT, dis + .readUnsignedShort(), cpGen); + case 'Z': // boolean + return new SimpleElementValueGen(PRIMITIVE_BOOLEAN, dis + .readUnsignedShort(), cpGen); + case 's': // String + return new SimpleElementValueGen(STRING, dis.readUnsignedShort(), + cpGen); + case 'e': // Enum constant + return new EnumElementValueGen(dis.readUnsignedShort(), dis + .readUnsignedShort(), cpGen); + case 'c': // Class + return new ClassElementValueGen(dis.readUnsignedShort(), cpGen); + case '@': // Annotation + // TODO: isRuntimeVisible ?????????? + // FIXME + return new AnnotationElementValueGen(ANNOTATION, + new AnnotationEntryGen(AnnotationEntry.read(dis, cpGen + .getConstantPool(), true), cpGen, false), cpGen); + case '[': // Array + int numArrayVals = dis.readUnsignedShort(); + ElementValue[] evalues = new ElementValue[numArrayVals]; + for (int j = 0; j < numArrayVals; j++) + { + evalues[j] = ElementValue.readElementValue(dis, cpGen + .getConstantPool()); + } + return new ArrayElementValueGen(ARRAY, evalues, cpGen); + default: + throw new RuntimeException( + "Unexpected element value kind in annotation: " + type); + } + } + + protected ConstantPoolGen getConstantPool() + { + return cpGen; + } + + /** + * Creates an (modifiable) ElementValueGen copy of an (immutable) + * ElementValue - constant pool is assumed correct. + */ + public static ElementValueGen copy(ElementValue value, + ConstantPoolGen cpool, boolean copyPoolEntries) + { + switch (value.getElementValueType()) + { + case 'B': // byte + case 'C': // char + case 'D': // double + case 'F': // float + case 'I': // int + case 'J': // long + case 'S': // short + case 'Z': // boolean + case 's': // String + return new SimpleElementValueGen((SimpleElementValue) value, cpool, + copyPoolEntries); + case 'e': // Enum constant + return new EnumElementValueGen((EnumElementValue) value, cpool, + copyPoolEntries); + case '@': // Annotation + return new AnnotationElementValueGen( + (AnnotationElementValue) value, cpool, copyPoolEntries); + case '[': // Array + return new ArrayElementValueGen((ArrayElementValue) value, cpool, + copyPoolEntries); + case 'c': // Class + return new ClassElementValueGen((ClassElementValue) value, cpool, + copyPoolEntries); + default: + throw new RuntimeException("Not implemented yet! (" + + value.getElementValueType() + ")"); + } + } } diff --git a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java index 5c57549d..22ef83e9 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java @@ -25,87 +25,87 @@ import org.apache.bcel.classfile.ElementValuePair; public class ElementValuePairGen { - private int nameIdx; + private int nameIdx; - private ElementValueGen value; + private ElementValueGen value; - private ConstantPoolGen cpool; + private ConstantPoolGen cpool; - public ElementValuePairGen(ElementValuePair nvp, ConstantPoolGen cpool, - boolean copyPoolEntries) - { - this.cpool = cpool; - // J5ASSERT: - // Could assert nvp.getNameString() points to the same thing as - // cpool.getConstant(nvp.getNameIndex()) - // if - // (!nvp.getNameString().equals(((ConstantUtf8)cpool.getConstant(nvp.getNameIndex())).getBytes())) - // { - // throw new RuntimeException("envp buggered"); - // } - if (copyPoolEntries) - { - nameIdx = cpool.addUtf8(nvp.getNameString()); - } - else - { - nameIdx = nvp.getNameIndex(); - } - value = ElementValueGen.copy(nvp.getValue(), cpool, copyPoolEntries); - } + public ElementValuePairGen(ElementValuePair nvp, ConstantPoolGen cpool, + boolean copyPoolEntries) + { + this.cpool = cpool; + // J5ASSERT: + // Could assert nvp.getNameString() points to the same thing as + // cpool.getConstant(nvp.getNameIndex()) + // if + // (!nvp.getNameString().equals(((ConstantUtf8)cpool.getConstant(nvp.getNameIndex())).getBytes())) + // { + // throw new RuntimeException("envp buggered"); + // } + if (copyPoolEntries) + { + nameIdx = cpool.addUtf8(nvp.getNameString()); + } + else + { + nameIdx = nvp.getNameIndex(); + } + value = ElementValueGen.copy(nvp.getValue(), cpool, copyPoolEntries); + } - /** - * Retrieve an immutable version of this ElementNameValuePairGen - */ - public ElementValuePair getElementNameValuePair() - { - ElementValue immutableValue = value.getElementValue(); - return new ElementValuePair(nameIdx, immutableValue, cpool - .getConstantPool()); - } + /** + * Retrieve an immutable version of this ElementNameValuePairGen + */ + public ElementValuePair getElementNameValuePair() + { + ElementValue immutableValue = value.getElementValue(); + return new ElementValuePair(nameIdx, immutableValue, cpool + .getConstantPool()); + } - protected ElementValuePairGen(int idx, ElementValueGen value, - ConstantPoolGen cpool) - { - this.nameIdx = idx; - this.value = value; - this.cpool = cpool; - } + protected ElementValuePairGen(int idx, ElementValueGen value, + ConstantPoolGen cpool) + { + this.nameIdx = idx; + this.value = value; + this.cpool = cpool; + } - public ElementValuePairGen(String name, ElementValueGen value, - ConstantPoolGen cpool) - { - this.nameIdx = cpool.addUtf8(name); - this.value = value; - this.cpool = cpool; - } + public ElementValuePairGen(String name, ElementValueGen value, + ConstantPoolGen cpool) + { + this.nameIdx = cpool.addUtf8(name); + this.value = value; + this.cpool = cpool; + } - protected void dump(DataOutputStream dos) throws IOException - { - dos.writeShort(nameIdx); // u2 name of the element - value.dump(dos); - } + protected void dump(DataOutputStream dos) throws IOException + { + dos.writeShort(nameIdx); // u2 name of the element + value.dump(dos); + } - public int getNameIndex() - { - return nameIdx; - } + public int getNameIndex() + { + return nameIdx; + } - public final String getNameString() - { - // ConstantString cu8 = (ConstantString)cpool.getConstant(nameIdx); - return ((ConstantUtf8) cpool.getConstant(nameIdx)).getBytes(); - } + public final String getNameString() + { + // ConstantString cu8 = (ConstantString)cpool.getConstant(nameIdx); + return ((ConstantUtf8) cpool.getConstant(nameIdx)).getBytes(); + } - public final ElementValueGen getValue() - { - return value; - } + public final ElementValueGen getValue() + { + return value; + } - @Override + @Override public String toString() - { - return "ElementValuePair:[" + getNameString() + "=" - + value.stringifyValue() + "]"; - } + { + return "ElementValuePair:[" + getNameString() + "=" + + value.stringifyValue() + "]"; + } } diff --git a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java index 60c620e9..fa5bc206 100644 --- a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java @@ -745,8 +745,8 @@ public abstract class EmptyVisitor implements VisitorSupportsInvokeDynamic { } public void visitNameSignatureInstruction(NameSignatureInstruction obj) { - } - - public void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj) { - } + } + + public void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj) { + } } diff --git a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java index 737c3e43..ecbd436a 100644 --- a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java @@ -25,116 +25,116 @@ import org.apache.bcel.classfile.EnumElementValue; public class EnumElementValueGen extends ElementValueGen { - // For enum types, these two indices point to the type and value - private int typeIdx; + // For enum types, these two indices point to the type and value + private int typeIdx; - private int valueIdx; + private int valueIdx; - /** - * This ctor assumes the constant pool already contains the right type and - * value - as indicated by typeIdx and valueIdx. This ctor is used for - * deserialization - */ - protected EnumElementValueGen(int typeIdx, int valueIdx, - ConstantPoolGen cpool) - { - super(ElementValueGen.ENUM_CONSTANT, cpool); - if (type != ENUM_CONSTANT) { + /** + * This ctor assumes the constant pool already contains the right type and + * value - as indicated by typeIdx and valueIdx. This ctor is used for + * deserialization + */ + protected EnumElementValueGen(int typeIdx, int valueIdx, + ConstantPoolGen cpool) + { + super(ElementValueGen.ENUM_CONSTANT, cpool); + if (type != ENUM_CONSTANT) { throw new RuntimeException( - "Only element values of type enum can be built with this ctor - type specified: " + type); + "Only element values of type enum can be built with this ctor - type specified: " + type); } - this.typeIdx = typeIdx; - this.valueIdx = valueIdx; - } + this.typeIdx = typeIdx; + this.valueIdx = valueIdx; + } - /** - * Return immutable variant of this EnumElementValue - */ - @Override + /** + * Return immutable variant of this EnumElementValue + */ + @Override public ElementValue getElementValue() - { - System.err.println("Duplicating value: " + getEnumTypeString() + ":" - + getEnumValueString()); - return new EnumElementValue(type, typeIdx, valueIdx, cpGen - .getConstantPool()); - } + { + System.err.println("Duplicating value: " + getEnumTypeString() + ":" + + getEnumValueString()); + return new EnumElementValue(type, typeIdx, valueIdx, cpGen + .getConstantPool()); + } - public EnumElementValueGen(ObjectType t, String value, ConstantPoolGen cpool) - { - super(ElementValueGen.ENUM_CONSTANT, cpool); - typeIdx = cpool.addUtf8(t.getSignature());// was addClass(t); - valueIdx = cpool.addUtf8(value);// was addString(value); - } + public EnumElementValueGen(ObjectType t, String value, ConstantPoolGen cpool) + { + super(ElementValueGen.ENUM_CONSTANT, cpool); + typeIdx = cpool.addUtf8(t.getSignature());// was addClass(t); + valueIdx = cpool.addUtf8(value);// was addString(value); + } - public EnumElementValueGen(EnumElementValue value, ConstantPoolGen cpool, - boolean copyPoolEntries) - { - super(ENUM_CONSTANT, cpool); - if (copyPoolEntries) - { - typeIdx = cpool.addUtf8(value.getEnumTypeString());// was - // addClass(value.getEnumTypeString()); - valueIdx = cpool.addUtf8(value.getEnumValueString()); // was - // addString(value.getEnumValueString()); - } - else - { - typeIdx = value.getTypeIndex(); - valueIdx = value.getValueIndex(); - } - } + public EnumElementValueGen(EnumElementValue value, ConstantPoolGen cpool, + boolean copyPoolEntries) + { + super(ENUM_CONSTANT, cpool); + if (copyPoolEntries) + { + typeIdx = cpool.addUtf8(value.getEnumTypeString());// was + // addClass(value.getEnumTypeString()); + valueIdx = cpool.addUtf8(value.getEnumValueString()); // was + // addString(value.getEnumValueString()); + } + else + { + typeIdx = value.getTypeIndex(); + valueIdx = value.getValueIndex(); + } + } - @Override + @Override public void dump(DataOutputStream dos) throws IOException - { - dos.writeByte(type); // u1 type of value (ENUM_CONSTANT == 'e') - dos.writeShort(typeIdx); // u2 - dos.writeShort(valueIdx); // u2 - } + { + dos.writeByte(type); // u1 type of value (ENUM_CONSTANT == 'e') + dos.writeShort(typeIdx); // u2 + dos.writeShort(valueIdx); // u2 + } - @Override + @Override public String stringifyValue() - { - ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant( - valueIdx); - return cu8.getBytes(); - // ConstantString cu8 = - // (ConstantString)getConstantPool().getConstant(valueIdx); - // return - // ((ConstantUtf8)getConstantPool().getConstant(cu8.getStringIndex())).getBytes(); - } + { + ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant( + valueIdx); + return cu8.getBytes(); + // ConstantString cu8 = + // (ConstantString)getConstantPool().getConstant(valueIdx); + // return + // ((ConstantUtf8)getConstantPool().getConstant(cu8.getStringIndex())).getBytes(); + } - // BCELBUG: Should we need to call utility.signatureToString() on the output - // here? - public String getEnumTypeString() - { - // Constant cc = getConstantPool().getConstant(typeIdx); - // ConstantClass cu8 = - // (ConstantClass)getConstantPool().getConstant(typeIdx); - // return - // ((ConstantUtf8)getConstantPool().getConstant(cu8.getNameIndex())).getBytes(); - return ((ConstantUtf8) getConstantPool().getConstant(typeIdx)) - .getBytes(); - // return Utility.signatureToString(cu8.getBytes()); - } + // BCELBUG: Should we need to call utility.signatureToString() on the output + // here? + public String getEnumTypeString() + { + // Constant cc = getConstantPool().getConstant(typeIdx); + // ConstantClass cu8 = + // (ConstantClass)getConstantPool().getConstant(typeIdx); + // return + // ((ConstantUtf8)getConstantPool().getConstant(cu8.getNameIndex())).getBytes(); + return ((ConstantUtf8) getConstantPool().getConstant(typeIdx)) + .getBytes(); + // return Utility.signatureToString(cu8.getBytes()); + } - public String getEnumValueString() - { - return ((ConstantUtf8) getConstantPool().getConstant(valueIdx)) - .getBytes(); - // ConstantString cu8 = - // (ConstantString)getConstantPool().getConstant(valueIdx); - // return - // ((ConstantUtf8)getConstantPool().getConstant(cu8.getStringIndex())).getBytes(); - } + public String getEnumValueString() + { + return ((ConstantUtf8) getConstantPool().getConstant(valueIdx)) + .getBytes(); + // ConstantString cu8 = + // (ConstantString)getConstantPool().getConstant(valueIdx); + // return + // ((ConstantUtf8)getConstantPool().getConstant(cu8.getStringIndex())).getBytes(); + } - public int getValueIndex() - { - return valueIdx; - } + public int getValueIndex() + { + return valueIdx; + } - public int getTypeIndex() - { - return typeIdx; - } + public int getTypeIndex() + { + return typeIdx; + } } diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index d235a256..5f4ecd44 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -92,11 +92,11 @@ public class FieldGen extends FieldGenOrMethodGen { if (attr instanceof ConstantValue) { setValue(((ConstantValue) attr).getConstantValueIndex()); } else if (attr instanceof Annotations) { - Annotations runtimeAnnotations = (Annotations)attr; - AnnotationEntry[] annotationEntries = runtimeAnnotations.getAnnotationEntries(); - for (AnnotationEntry element : annotationEntries) { - addAnnotationEntry(new AnnotationEntryGen(element,cp,false)); - } + Annotations runtimeAnnotations = (Annotations)attr; + AnnotationEntry[] annotationEntries = runtimeAnnotations.getAnnotationEntries(); + for (AnnotationEntry element : annotationEntries) { + addAnnotationEntry(new AnnotationEntryGen(element,cp,false)); + } } else { addAttribute(attr); } @@ -224,12 +224,12 @@ public class FieldGen extends FieldGenOrMethodGen { return new Field(access_flags, name_index, signature_index, getAttributes(), cp .getConstantPool()); } - + private void addAnnotationsAsAttribute(ConstantPoolGen cp) { - Attribute[] attrs = Utility.getAnnotationAttributes(cp,annotation_vec); + Attribute[] attrs = Utility.getAnnotationAttributes(cp,annotation_vec); for (Attribute attr : attrs) { - addAttribute(attr); - } + addAttribute(attr); + } } diff --git a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index e38d5f77..9d890f50 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -91,11 +91,11 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn public void addAttribute( Attribute a ) { attribute_vec.add(a); } - + public void addAnnotationEntry(AnnotationEntryGen ag) - { - annotation_vec.add(ag); - } + { + annotation_vec.add(ag); + } /** @@ -104,11 +104,11 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn public void removeAttribute( Attribute a ) { attribute_vec.remove(a); } - + public void removeAnnotationEntry(AnnotationEntryGen ag) - { - annotation_vec.remove(ag); - } + { + annotation_vec.remove(ag); + } /** @@ -117,11 +117,11 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn public void removeAttributes() { attribute_vec.clear(); } - + public void removeAnnotationEntries() - { - annotation_vec.clear(); - } + { + annotation_vec.clear(); + } /** @@ -132,11 +132,11 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn attribute_vec.toArray(attributes); return attributes; } - + public AnnotationEntryGen[] getAnnotationEntries() { - AnnotationEntryGen[] annotations = new AnnotationEntryGen[annotation_vec.size()]; - annotation_vec.toArray(annotations); - return annotations; + AnnotationEntryGen[] annotations = new AnnotationEntryGen[annotation_vec.size()]; + annotation_vec.toArray(annotations); + return annotations; } diff --git a/src/main/java/org/apache/bcel/generic/FieldInstruction.java b/src/main/java/org/apache/bcel/generic/FieldInstruction.java index 3ffb87d8..759e210f 100644 --- a/src/main/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/main/java/org/apache/bcel/generic/FieldInstruction.java @@ -59,7 +59,7 @@ public abstract class FieldInstruction extends FieldOrMethod { /** @return size of field (1 or 2) */ protected int getFieldSize( ConstantPoolGen cpg ) { - return Type.size(Type.getTypeSize(getSignature(cpg))); + return Type.size(Type.getTypeSize(getSignature(cpg))); } diff --git a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java index 891a7f2d..a582f730 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java @@ -72,19 +72,19 @@ public class INVOKEDYNAMIC extends NameSignatureInstruction implements Exception /** * Get the ConstantInvokeDynamic associated with this instruction */ - - public ConstantInvokeDynamic getInvokeDynamic( ConstantPoolGen cpg ) { + + public ConstantInvokeDynamic getInvokeDynamic( ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); return (ConstantInvokeDynamic) cp.getConstant(index); } - + @Override - public ConstantNameAndType getNameAndType( ConstantPoolGen cpg ) { + public ConstantNameAndType getNameAndType( ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); ConstantInvokeDynamic id = getInvokeDynamic(cpg); return (ConstantNameAndType) cp.getConstant(id.getNameAndTypeIndex()); } - + /** * Also works for instructions whose stack effect depends on the * constant pool entry they reference. @@ -136,7 +136,7 @@ public class INVOKEDYNAMIC extends NameSignatureInstruction implements Exception public Type[] getArgumentTypes( ConstantPoolGen cpg ) { return Type.getArgumentTypes(getSignature(cpg)); } - + /** * Read needed data (i.e., index) from file. */ diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index b2faaa81..7c3d84ea 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -157,312 +157,312 @@ public abstract class Instruction implements Cloneable, Serializable { if (InstructionConstants.INSTRUCTIONS[opcode] != null) { return InstructionConstants.INSTRUCTIONS[opcode]; // Used predefined immutable object, if available } - + switch (opcode) { - case Constants.BIPUSH: - obj = new BIPUSH(); - break; - case Constants.SIPUSH: - obj = new SIPUSH(); - break; - case Constants.LDC: - obj = new LDC(); - break; - case Constants.LDC_W: - obj = new LDC_W(); - break; - case Constants.LDC2_W: - obj = new LDC2_W(); - break; - case Constants.ILOAD: - obj = new ILOAD(); - break; - case Constants.LLOAD: - obj = new LLOAD(); - break; - case Constants.FLOAD: - obj = new FLOAD(); - break; - case Constants.DLOAD: - obj = new DLOAD(); - break; - case Constants.ALOAD: - obj = new ALOAD(); - break; - case Constants.ILOAD_0: - obj = new ILOAD(0); - break; - case Constants.ILOAD_1: - obj = new ILOAD(1); - break; - case Constants.ILOAD_2: - obj = new ILOAD(2); - break; - case Constants.ILOAD_3: - obj = new ILOAD(3); - break; - case Constants.LLOAD_0: - obj = new LLOAD(0); - break; - case Constants.LLOAD_1: - obj = new LLOAD(1); - break; - case Constants.LLOAD_2: - obj = new LLOAD(2); - break; - case Constants.LLOAD_3: - obj = new LLOAD(3); - break; - case Constants.FLOAD_0: - obj = new FLOAD(0); - break; - case Constants.FLOAD_1: - obj = new FLOAD(1); - break; - case Constants.FLOAD_2: - obj = new FLOAD(2); - break; - case Constants.FLOAD_3: - obj = new FLOAD(3); - break; - case Constants.DLOAD_0: - obj = new DLOAD(0); - break; - case Constants.DLOAD_1: - obj = new DLOAD(1); - break; - case Constants.DLOAD_2: - obj = new DLOAD(2); - break; - case Constants.DLOAD_3: - obj = new DLOAD(3); - break; - case Constants.ALOAD_0: - obj = new ALOAD(0); - break; - case Constants.ALOAD_1: - obj = new ALOAD(1); - break; - case Constants.ALOAD_2: - obj = new ALOAD(2); - break; - case Constants.ALOAD_3: - obj = new ALOAD(3); - break; - case Constants.ISTORE: - obj = new ISTORE(); - break; - case Constants.LSTORE: - obj = new LSTORE(); - break; - case Constants.FSTORE: - obj = new FSTORE(); - break; - case Constants.DSTORE: - obj = new DSTORE(); - break; - case Constants.ASTORE: - obj = new ASTORE(); - break; - case Constants.ISTORE_0: - obj = new ISTORE(0); - break; - case Constants.ISTORE_1: - obj = new ISTORE(1); - break; - case Constants.ISTORE_2: - obj = new ISTORE(2); - break; - case Constants.ISTORE_3: - obj = new ISTORE(3); - break; - case Constants.LSTORE_0: - obj = new LSTORE(0); - break; - case Constants.LSTORE_1: - obj = new LSTORE(1); - break; - case Constants.LSTORE_2: - obj = new LSTORE(2); - break; - case Constants.LSTORE_3: - obj = new LSTORE(3); - break; - case Constants.FSTORE_0: - obj = new FSTORE(0); - break; - case Constants.FSTORE_1: - obj = new FSTORE(1); - break; - case Constants.FSTORE_2: - obj = new FSTORE(2); - break; - case Constants.FSTORE_3: - obj = new FSTORE(3); - break; - case Constants.DSTORE_0: - obj = new DSTORE(0); - break; - case Constants.DSTORE_1: - obj = new DSTORE(1); - break; - case Constants.DSTORE_2: - obj = new DSTORE(2); - break; - case Constants.DSTORE_3: - obj = new DSTORE(3); - break; - case Constants.ASTORE_0: - obj = new ASTORE(0); - break; - case Constants.ASTORE_1: - obj = new ASTORE(1); - break; - case Constants.ASTORE_2: - obj = new ASTORE(2); - break; - case Constants.ASTORE_3: - obj = new ASTORE(3); - break; - case Constants.IINC: - obj = new IINC(); - break; - case Constants.IFEQ: - obj = new IFEQ(); - break; - case Constants.IFNE: - obj = new IFNE(); - break; - case Constants.IFLT: - obj = new IFLT(); - break; - case Constants.IFGE: - obj = new IFGE(); - break; - case Constants.IFGT: - obj = new IFGT(); - break; - case Constants.IFLE: - obj = new IFLE(); - break; - case Constants.IF_ICMPEQ: - obj = new IF_ICMPEQ(); - break; - case Constants.IF_ICMPNE: - obj = new IF_ICMPNE(); - break; - case Constants.IF_ICMPLT: - obj = new IF_ICMPLT(); - break; - case Constants.IF_ICMPGE: - obj = new IF_ICMPGE(); - break; - case Constants.IF_ICMPGT: - obj = new IF_ICMPGT(); - break; - case Constants.IF_ICMPLE: - obj = new IF_ICMPLE(); - break; - case Constants.IF_ACMPEQ: - obj = new IF_ACMPEQ(); - break; - case Constants.IF_ACMPNE: - obj = new IF_ACMPNE(); - break; - case Constants.GOTO: - obj = new GOTO(); - break; - case Constants.JSR: - obj = new JSR(); - break; - case Constants.RET: - obj = new RET(); - break; - case Constants.TABLESWITCH: - obj = new TABLESWITCH(); - break; - case Constants.LOOKUPSWITCH: - obj = new LOOKUPSWITCH(); - break; - case Constants.GETSTATIC: - obj = new GETSTATIC(); - break; - case Constants.PUTSTATIC: - obj = new PUTSTATIC(); - break; - case Constants.GETFIELD: - obj = new GETFIELD(); - break; - case Constants.PUTFIELD: - obj = new PUTFIELD(); - break; - case Constants.INVOKEVIRTUAL: - obj = new INVOKEVIRTUAL(); - break; - case Constants.INVOKESPECIAL: - obj = new INVOKESPECIAL(); - break; - case Constants.INVOKESTATIC: - obj = new INVOKESTATIC(); - break; - case Constants.INVOKEINTERFACE: - obj = new INVOKEINTERFACE(); - break; - case Constants.INVOKEDYNAMIC: - obj = new INVOKEDYNAMIC(); - break; - case Constants.NEW: - obj = new NEW(); - break; - case Constants.NEWARRAY: - obj = new NEWARRAY(); - break; - case Constants.ANEWARRAY: - obj = new ANEWARRAY(); - break; - case Constants.CHECKCAST: - obj = new CHECKCAST(); - break; - case Constants.INSTANCEOF: - obj = new INSTANCEOF(); - break; - case Constants.MULTIANEWARRAY: - obj = new MULTIANEWARRAY(); - break; - case Constants.IFNULL: - obj = new IFNULL(); - break; - case Constants.IFNONNULL: - obj = new IFNONNULL(); - break; - case Constants.GOTO_W: - obj = new GOTO_W(); - break; - case Constants.JSR_W: - obj = new JSR_W(); - break; - case Constants.BREAKPOINT: - obj = new BREAKPOINT(); - break; - case Constants.IMPDEP1: - obj = new IMPDEP1(); - break; - case Constants.IMPDEP2: - obj = new IMPDEP2(); - break; - default: - throw new ClassGenException("Illegal opcode detected: " + opcode); - - } - + case Constants.BIPUSH: + obj = new BIPUSH(); + break; + case Constants.SIPUSH: + obj = new SIPUSH(); + break; + case Constants.LDC: + obj = new LDC(); + break; + case Constants.LDC_W: + obj = new LDC_W(); + break; + case Constants.LDC2_W: + obj = new LDC2_W(); + break; + case Constants.ILOAD: + obj = new ILOAD(); + break; + case Constants.LLOAD: + obj = new LLOAD(); + break; + case Constants.FLOAD: + obj = new FLOAD(); + break; + case Constants.DLOAD: + obj = new DLOAD(); + break; + case Constants.ALOAD: + obj = new ALOAD(); + break; + case Constants.ILOAD_0: + obj = new ILOAD(0); + break; + case Constants.ILOAD_1: + obj = new ILOAD(1); + break; + case Constants.ILOAD_2: + obj = new ILOAD(2); + break; + case Constants.ILOAD_3: + obj = new ILOAD(3); + break; + case Constants.LLOAD_0: + obj = new LLOAD(0); + break; + case Constants.LLOAD_1: + obj = new LLOAD(1); + break; + case Constants.LLOAD_2: + obj = new LLOAD(2); + break; + case Constants.LLOAD_3: + obj = new LLOAD(3); + break; + case Constants.FLOAD_0: + obj = new FLOAD(0); + break; + case Constants.FLOAD_1: + obj = new FLOAD(1); + break; + case Constants.FLOAD_2: + obj = new FLOAD(2); + break; + case Constants.FLOAD_3: + obj = new FLOAD(3); + break; + case Constants.DLOAD_0: + obj = new DLOAD(0); + break; + case Constants.DLOAD_1: + obj = new DLOAD(1); + break; + case Constants.DLOAD_2: + obj = new DLOAD(2); + break; + case Constants.DLOAD_3: + obj = new DLOAD(3); + break; + case Constants.ALOAD_0: + obj = new ALOAD(0); + break; + case Constants.ALOAD_1: + obj = new ALOAD(1); + break; + case Constants.ALOAD_2: + obj = new ALOAD(2); + break; + case Constants.ALOAD_3: + obj = new ALOAD(3); + break; + case Constants.ISTORE: + obj = new ISTORE(); + break; + case Constants.LSTORE: + obj = new LSTORE(); + break; + case Constants.FSTORE: + obj = new FSTORE(); + break; + case Constants.DSTORE: + obj = new DSTORE(); + break; + case Constants.ASTORE: + obj = new ASTORE(); + break; + case Constants.ISTORE_0: + obj = new ISTORE(0); + break; + case Constants.ISTORE_1: + obj = new ISTORE(1); + break; + case Constants.ISTORE_2: + obj = new ISTORE(2); + break; + case Constants.ISTORE_3: + obj = new ISTORE(3); + break; + case Constants.LSTORE_0: + obj = new LSTORE(0); + break; + case Constants.LSTORE_1: + obj = new LSTORE(1); + break; + case Constants.LSTORE_2: + obj = new LSTORE(2); + break; + case Constants.LSTORE_3: + obj = new LSTORE(3); + break; + case Constants.FSTORE_0: + obj = new FSTORE(0); + break; + case Constants.FSTORE_1: + obj = new FSTORE(1); + break; + case Constants.FSTORE_2: + obj = new FSTORE(2); + break; + case Constants.FSTORE_3: + obj = new FSTORE(3); + break; + case Constants.DSTORE_0: + obj = new DSTORE(0); + break; + case Constants.DSTORE_1: + obj = new DSTORE(1); + break; + case Constants.DSTORE_2: + obj = new DSTORE(2); + break; + case Constants.DSTORE_3: + obj = new DSTORE(3); + break; + case Constants.ASTORE_0: + obj = new ASTORE(0); + break; + case Constants.ASTORE_1: + obj = new ASTORE(1); + break; + case Constants.ASTORE_2: + obj = new ASTORE(2); + break; + case Constants.ASTORE_3: + obj = new ASTORE(3); + break; + case Constants.IINC: + obj = new IINC(); + break; + case Constants.IFEQ: + obj = new IFEQ(); + break; + case Constants.IFNE: + obj = new IFNE(); + break; + case Constants.IFLT: + obj = new IFLT(); + break; + case Constants.IFGE: + obj = new IFGE(); + break; + case Constants.IFGT: + obj = new IFGT(); + break; + case Constants.IFLE: + obj = new IFLE(); + break; + case Constants.IF_ICMPEQ: + obj = new IF_ICMPEQ(); + break; + case Constants.IF_ICMPNE: + obj = new IF_ICMPNE(); + break; + case Constants.IF_ICMPLT: + obj = new IF_ICMPLT(); + break; + case Constants.IF_ICMPGE: + obj = new IF_ICMPGE(); + break; + case Constants.IF_ICMPGT: + obj = new IF_ICMPGT(); + break; + case Constants.IF_ICMPLE: + obj = new IF_ICMPLE(); + break; + case Constants.IF_ACMPEQ: + obj = new IF_ACMPEQ(); + break; + case Constants.IF_ACMPNE: + obj = new IF_ACMPNE(); + break; + case Constants.GOTO: + obj = new GOTO(); + break; + case Constants.JSR: + obj = new JSR(); + break; + case Constants.RET: + obj = new RET(); + break; + case Constants.TABLESWITCH: + obj = new TABLESWITCH(); + break; + case Constants.LOOKUPSWITCH: + obj = new LOOKUPSWITCH(); + break; + case Constants.GETSTATIC: + obj = new GETSTATIC(); + break; + case Constants.PUTSTATIC: + obj = new PUTSTATIC(); + break; + case Constants.GETFIELD: + obj = new GETFIELD(); + break; + case Constants.PUTFIELD: + obj = new PUTFIELD(); + break; + case Constants.INVOKEVIRTUAL: + obj = new INVOKEVIRTUAL(); + break; + case Constants.INVOKESPECIAL: + obj = new INVOKESPECIAL(); + break; + case Constants.INVOKESTATIC: + obj = new INVOKESTATIC(); + break; + case Constants.INVOKEINTERFACE: + obj = new INVOKEINTERFACE(); + break; + case Constants.INVOKEDYNAMIC: + obj = new INVOKEDYNAMIC(); + break; + case Constants.NEW: + obj = new NEW(); + break; + case Constants.NEWARRAY: + obj = new NEWARRAY(); + break; + case Constants.ANEWARRAY: + obj = new ANEWARRAY(); + break; + case Constants.CHECKCAST: + obj = new CHECKCAST(); + break; + case Constants.INSTANCEOF: + obj = new INSTANCEOF(); + break; + case Constants.MULTIANEWARRAY: + obj = new MULTIANEWARRAY(); + break; + case Constants.IFNULL: + obj = new IFNULL(); + break; + case Constants.IFNONNULL: + obj = new IFNONNULL(); + break; + case Constants.GOTO_W: + obj = new GOTO_W(); + break; + case Constants.JSR_W: + obj = new JSR_W(); + break; + case Constants.BREAKPOINT: + obj = new BREAKPOINT(); + break; + case Constants.IMPDEP1: + obj = new IMPDEP1(); + break; + case Constants.IMPDEP2: + obj = new IMPDEP2(); + break; + default: + throw new ClassGenException("Illegal opcode detected: " + opcode); + + } + if (wide - && !((obj instanceof LocalVariableInstruction) || (obj instanceof IINC) || (obj instanceof RET))) { - throw new ClassGenException("Illegal opcode after wide: " + opcode); - } - obj.setOpcode(opcode); - obj.initFromFile(bytes, wide); // Do further initializations, if any - return obj; - } + && !((obj instanceof LocalVariableInstruction) || (obj instanceof IINC) || (obj instanceof RET))) { + throw new ClassGenException("Illegal opcode after wide: " + opcode); + } + obj.setOpcode(opcode); + obj.initFromFile(bytes, wide); // Do further initializations, if any + return obj; + } /** * This method also gives right results for instructions whose @@ -557,7 +557,7 @@ public abstract class Instruction implements Cloneable, Serializable { public boolean equals( Object that ) { return (that instanceof Instruction) ? cmp.equals(this, (Instruction) that) : false; } - + /** calculate the hashCode of this object * @return the hashCode */ diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index 0033c269..71e799bd 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -31,7 +31,7 @@ import org.apache.bcel.Constants; */ public class InstructionFactory implements InstructionConstants, java.io.Serializable { - private static final long serialVersionUID = -1210011499635580258L; + private static final long serialVersionUID = -1210011499635580258L; private static final String[] short_names = { "C", "F", "D", "B", "S", "I", "L" @@ -354,7 +354,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali case '/': return FDIV; case '%': - return FREM; + return FREM; default: throw new RuntimeException("Invalid operand " + op); } @@ -372,7 +372,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali case '/': return DDIV; case '%': - return DREM; + return DREM; default: throw new RuntimeException("Invalid operand " + op); } diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index feead68a..048b78bb 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -142,7 +142,7 @@ public class InstructionList implements Serializable { * @return target position's instruction handle if available */ public InstructionHandle findHandle( int pos ) { - int[] positions = byte_positions; + int[] positions = byte_positions; InstructionHandle ih = start; for (int i = 0; i < length; i++) { if(positions[i] == pos) { @@ -1005,7 +1005,7 @@ public class InstructionList implements Serializable { public InstructionHandle next() throws NoSuchElementException { - if (ih == null) { + if (ih == null) { throw new NoSuchElementException(); } InstructionHandle i = ih; diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index 89eeb301..695f45e4 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -75,7 +75,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti } else { sum = 1; // this reference } - + String signature = getSignature(cpg); sum += Type.getArgumentTypesSize(signature); return sum; @@ -89,8 +89,8 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti */ @Override public int produceStack( ConstantPoolGen cpg ) { - String signature = getSignature(cpg); - return Type.getReturnTypeSize(signature); + String signature = getSignature(cpg); + return Type.getReturnTypeSize(signature); } diff --git a/src/main/java/org/apache/bcel/generic/JsrInstruction.java b/src/main/java/org/apache/bcel/generic/JsrInstruction.java index fd4008ed..d4b63512 100644 --- a/src/main/java/org/apache/bcel/generic/JsrInstruction.java +++ b/src/main/java/org/apache/bcel/generic/JsrInstruction.java @@ -77,7 +77,7 @@ public abstract class JsrInstruction extends BranchInstruction implements Uncond throw new RuntimeException("physicalSuccessor() called on a shared JsrInstruction."); } } - // Return the physical successor + // Return the physical successor return toThis.getNext(); } } diff --git a/src/main/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java index bc65acfa..02948867 100644 --- a/src/main/java/org/apache/bcel/generic/LDC.java +++ b/src/main/java/org/apache/bcel/generic/LDC.java @@ -108,9 +108,9 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro case org.apache.bcel.Constants.CONSTANT_Integer: return Integer.valueOf(((org.apache.bcel.classfile.ConstantInteger) c).getBytes()); case org.apache.bcel.Constants.CONSTANT_Class: - int nameIndex = ((org.apache.bcel.classfile.ConstantClass) c).getNameIndex(); - c = cpg.getConstantPool().getConstant(nameIndex); - return new ObjectType(((org.apache.bcel.classfile.ConstantUtf8) c).getBytes()); + int nameIndex = ((org.apache.bcel.classfile.ConstantClass) c).getNameIndex(); + c = cpg.getConstantPool().getConstant(nameIndex); + return new ObjectType(((org.apache.bcel.classfile.ConstantUtf8) c).getBytes()); default: // Never reached throw new RuntimeException("Unknown or invalid constant type at " + index); } diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 9977eaba..09f4dc5e 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -74,11 +74,11 @@ public class MethodGen extends FieldGenOrMethodGen { private List exception_vec = new ArrayList(); private List throws_vec = new ArrayList(); private List code_attrs_vec = new ArrayList(); - + private List[] param_annotations; // Array of lists containing AnnotationGen objects private boolean hasParameterAnnotations = false; private boolean haveUnpackedParameterAnnotations = false; - + private static BCELComparator _cmp = new BCELComparator() { public boolean equals( Object o1, Object o2 ) { @@ -265,11 +265,11 @@ public class MethodGen extends FieldGenOrMethodGen { addException(name2); } } else if (a instanceof Annotations) { - Annotations runtimeAnnotations = (Annotations) a; - AnnotationEntry[] aes = runtimeAnnotations.getAnnotationEntries(); - for (AnnotationEntry element : aes) { - addAnnotationEntry(new AnnotationEntryGen(element, cp, false)); - } + Annotations runtimeAnnotations = (Annotations) a; + AnnotationEntry[] aes = runtimeAnnotations.getAnnotationEntries(); + for (AnnotationEntry element : aes) { + addAnnotationEntry(new AnnotationEntryGen(element, cp, false)); + } } else { addAttribute(a); } @@ -603,24 +603,24 @@ public class MethodGen extends FieldGenOrMethodGen { code_attrs_vec.toArray(attributes); return attributes; } - + public void addAnnotationsAsAttribute(ConstantPoolGen cp) { - Attribute[] attrs = Utility.getAnnotationAttributes(cp,annotation_vec); + Attribute[] attrs = Utility.getAnnotationAttributes(cp,annotation_vec); for (Attribute attr : attrs) { - addAttribute(attr); - } + addAttribute(attr); + } } - + public void addParameterAnnotationsAsAttribute(ConstantPoolGen cp) { - if (!hasParameterAnnotations) { + if (!hasParameterAnnotations) { return; } - Attribute[] attrs = Utility.getParameterAnnotationAttributes(cp,param_annotations); - if (attrs!=null) { + Attribute[] attrs = Utility.getParameterAnnotationAttributes(cp,param_annotations); + if (attrs!=null) { for (Attribute attr : attrs) { - addAttribute(attr); - } - } + addAttribute(attr); + } + } } @@ -1059,7 +1059,7 @@ public class MethodGen extends FieldGenOrMethodGen { buf.append(" [").append(a.toString()).append("]"); } } - + if (throws_vec.size() > 0) { for (String throwsDescriptor : throws_vec) { buf.append("\n\t\tthrows ").append(throwsDescriptor); @@ -1080,114 +1080,114 @@ public class MethodGen extends FieldGenOrMethodGen { } return mg; } - + //J5TODO: Should param_annotations be an array of arrays? Rather than an array of lists, this // is more likely to suggest to the caller it is readonly (which a List does not). /** * Return a list of AnnotationGen objects representing parameter annotations */ public List getAnnotationsOnParameter(int i) { - ensureExistingParameterAnnotationsUnpacked(); - if (!hasParameterAnnotations || i>arg_types.length) { + ensureExistingParameterAnnotationsUnpacked(); + if (!hasParameterAnnotations || i>arg_types.length) { return null; } - return param_annotations[i]; + return param_annotations[i]; } - + /** - * Goes through the attributes on the method and identifies any that are - * RuntimeParameterAnnotations, extracting their contents and storing them - * as parameter annotations. There are two kinds of parameter annotation - - * visible and invisible. Once they have been unpacked, these attributes are - * deleted. (The annotations will be rebuilt as attributes when someone - * builds a Method object out of this MethodGen object). - */ - private void ensureExistingParameterAnnotationsUnpacked() - { - if (haveUnpackedParameterAnnotations) { + * Goes through the attributes on the method and identifies any that are + * RuntimeParameterAnnotations, extracting their contents and storing them + * as parameter annotations. There are two kinds of parameter annotation - + * visible and invisible. Once they have been unpacked, these attributes are + * deleted. (The annotations will be rebuilt as attributes when someone + * builds a Method object out of this MethodGen object). + */ + private void ensureExistingParameterAnnotationsUnpacked() + { + if (haveUnpackedParameterAnnotations) { return; } - // Find attributes that contain parameter annotation data - Attribute[] attrs = getAttributes(); - ParameterAnnotations paramAnnVisAttr = null; - ParameterAnnotations paramAnnInvisAttr = null; - for (Attribute attribute : attrs) { - if (attribute instanceof ParameterAnnotations) - { - // Initialize param_annotations - if (!hasParameterAnnotations) - { - param_annotations = new List[arg_types.length]; - for (int j = 0; j < arg_types.length; j++) { + // Find attributes that contain parameter annotation data + Attribute[] attrs = getAttributes(); + ParameterAnnotations paramAnnVisAttr = null; + ParameterAnnotations paramAnnInvisAttr = null; + for (Attribute attribute : attrs) { + if (attribute instanceof ParameterAnnotations) + { + // Initialize param_annotations + if (!hasParameterAnnotations) + { + param_annotations = new List[arg_types.length]; + for (int j = 0; j < arg_types.length; j++) { param_annotations[j] = new ArrayList(); } - } - hasParameterAnnotations = true; - ParameterAnnotations rpa = (ParameterAnnotations) attribute; - if (rpa instanceof RuntimeVisibleParameterAnnotations) { + } + hasParameterAnnotations = true; + ParameterAnnotations rpa = (ParameterAnnotations) attribute; + if (rpa instanceof RuntimeVisibleParameterAnnotations) { paramAnnVisAttr = rpa; } else { paramAnnInvisAttr = rpa; } - for (int j = 0; j < arg_types.length; j++) - { - // This returns Annotation[] ... - ParameterAnnotationEntry immutableArray = rpa - .getParameterAnnotationEntries()[j]; - // ... which needs transforming into an AnnotationGen[] ... - List mutable = makeMutableVersion(immutableArray.getAnnotationEntries()); - // ... then add these to any we already know about - param_annotations[j].addAll(mutable); - } - } - } - if (paramAnnVisAttr != null) { + for (int j = 0; j < arg_types.length; j++) + { + // This returns Annotation[] ... + ParameterAnnotationEntry immutableArray = rpa + .getParameterAnnotationEntries()[j]; + // ... which needs transforming into an AnnotationGen[] ... + List mutable = makeMutableVersion(immutableArray.getAnnotationEntries()); + // ... then add these to any we already know about + param_annotations[j].addAll(mutable); + } + } + } + if (paramAnnVisAttr != null) { removeAttribute(paramAnnVisAttr); } - if (paramAnnInvisAttr != null) { + if (paramAnnInvisAttr != null) { removeAttribute(paramAnnInvisAttr); } - haveUnpackedParameterAnnotations = true; - } - - private List makeMutableVersion(AnnotationEntry[] mutableArray) - { - List result = new ArrayList(); - for (AnnotationEntry element : mutableArray) { - result.add(new AnnotationEntryGen(element, getConstantPool(), - false)); - } - return result; - } - - public void addParameterAnnotation(int parameterIndex, - AnnotationEntryGen annotation) - { - ensureExistingParameterAnnotationsUnpacked(); - if (!hasParameterAnnotations) - { - param_annotations = new List[arg_types.length]; - hasParameterAnnotations = true; - } - List existingAnnotations = param_annotations[parameterIndex]; - if (existingAnnotations != null) - { - existingAnnotations.add(annotation); - } - else - { - List l = new ArrayList(); - l.add(annotation); - param_annotations[parameterIndex] = l; - } - } + haveUnpackedParameterAnnotations = true; + } + + private List makeMutableVersion(AnnotationEntry[] mutableArray) + { + List result = new ArrayList(); + for (AnnotationEntry element : mutableArray) { + result.add(new AnnotationEntryGen(element, getConstantPool(), + false)); + } + return result; + } + + public void addParameterAnnotation(int parameterIndex, + AnnotationEntryGen annotation) + { + ensureExistingParameterAnnotationsUnpacked(); + if (!hasParameterAnnotations) + { + param_annotations = new List[arg_types.length]; + hasParameterAnnotations = true; + } + List existingAnnotations = param_annotations[parameterIndex]; + if (existingAnnotations != null) + { + existingAnnotations.add(annotation); + } + else + { + List l = new ArrayList(); + l.add(annotation); + param_annotations[parameterIndex] = l; + } + } /** - * @return Comparison strategy object - */ + * @return Comparison strategy object + */ public static BCELComparator getComparator() { return _cmp; } diff --git a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java index 566961cf..4947dcdc 100644 --- a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java +++ b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java @@ -14,35 +14,35 @@ import org.apache.bcel.classfile.ConstantUtf8; */ public abstract class NameSignatureInstruction extends CPInstruction { - private static final long serialVersionUID = 1L; - - public NameSignatureInstruction() { - super(); - } - - public NameSignatureInstruction(short opcode, int index) { - super(opcode, index); - } - - public ConstantNameAndType getNameAndType(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(index); - return (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); - } - /** @return signature of referenced method/field. - */ - public String getSignature(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantNameAndType cnat = getNameAndType(cpg); - return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes(); - } - - /** @return name of referenced method/field. - */ - public String getName(ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantNameAndType cnat = getNameAndType(cpg); - return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); - } + private static final long serialVersionUID = 1L; + + public NameSignatureInstruction() { + super(); + } + + public NameSignatureInstruction(short opcode, int index) { + super(opcode, index); + } + + public ConstantNameAndType getNameAndType(ConstantPoolGen cpg) { + ConstantPool cp = cpg.getConstantPool(); + ConstantCP cmr = (ConstantCP) cp.getConstant(index); + return (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); + } + /** @return signature of referenced method/field. + */ + public String getSignature(ConstantPoolGen cpg) { + ConstantPool cp = cpg.getConstantPool(); + ConstantNameAndType cnat = getNameAndType(cpg); + return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes(); + } + + /** @return name of referenced method/field. + */ + public String getName(ConstantPoolGen cpg) { + ConstantPool cp = cpg.getConstantPool(); + ConstantNameAndType cnat = getNameAndType(cpg); + return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); + } } \ No newline at end of file diff --git a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java index 3abb3d0a..93c6992d 100644 --- a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java @@ -29,241 +29,241 @@ import org.apache.bcel.classfile.SimpleElementValue; public class SimpleElementValueGen extends ElementValueGen { - // For primitive types and string type, this points to the value entry in - // the cpGen - // For 'class' this points to the class entry in the cpGen - private int idx; + // For primitive types and string type, this points to the value entry in + // the cpGen + // For 'class' this points to the class entry in the cpGen + private int idx; - // ctors for each supported type... type could be inferred but for now lets - // force it to be passed - /** - * Protected ctor used for deserialization, doesn't *put* an entry in the - * constant pool, assumes the one at the supplied index is correct. - */ - protected SimpleElementValueGen(int type, int idx, ConstantPoolGen cpGen) - { - super(type, cpGen); - this.idx = idx; - } + // ctors for each supported type... type could be inferred but for now lets + // force it to be passed + /** + * Protected ctor used for deserialization, doesn't *put* an entry in the + * constant pool, assumes the one at the supplied index is correct. + */ + protected SimpleElementValueGen(int type, int idx, ConstantPoolGen cpGen) + { + super(type, cpGen); + this.idx = idx; + } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, int value) - { - super(type, cpGen); - idx = cpGen.addInteger(value); - } + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, int value) + { + super(type, cpGen); + idx = cpGen.addInteger(value); + } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, long value) - { - super(type, cpGen); - idx = cpGen.addLong(value); - } + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, long value) + { + super(type, cpGen); + idx = cpGen.addLong(value); + } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, double value) - { - super(type, cpGen); - idx = cpGen.addDouble(value); - } + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, double value) + { + super(type, cpGen); + idx = cpGen.addDouble(value); + } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, float value) - { - super(type, cpGen); - idx = cpGen.addFloat(value); - } + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, float value) + { + super(type, cpGen); + idx = cpGen.addFloat(value); + } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, short value) - { - super(type, cpGen); - idx = cpGen.addInteger(value); - } + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, short value) + { + super(type, cpGen); + idx = cpGen.addInteger(value); + } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, byte value) - { - super(type, cpGen); - idx = cpGen.addInteger(value); - } + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, byte value) + { + super(type, cpGen); + idx = cpGen.addInteger(value); + } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, char value) - { - super(type, cpGen); - idx = cpGen.addInteger(value); - } + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, char value) + { + super(type, cpGen); + idx = cpGen.addInteger(value); + } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, boolean value) - { - super(type, cpGen); - if (value) { + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, boolean value) + { + super(type, cpGen); + if (value) { idx = cpGen.addInteger(1); } else { idx = cpGen.addInteger(0); } - } + } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, String value) - { - super(type, cpGen); - idx = cpGen.addUtf8(value); - } + public SimpleElementValueGen(int type, ConstantPoolGen cpGen, String value) + { + super(type, cpGen); + idx = cpGen.addUtf8(value); + } - /** - * The boolean controls whether we copy info from the 'old' constant pool to - * the 'new'. You need to use this ctor if the annotation is being copied - * from one file to another. - */ - public SimpleElementValueGen(SimpleElementValue value, - ConstantPoolGen cpool, boolean copyPoolEntries) - { - super(value.getElementValueType(), cpool); - if (!copyPoolEntries) - { - // J5ASSERT: Could assert value.stringifyValue() is the same as - // cpool.getConstant(SimpleElementValuevalue.getIndex()) - idx = value.getIndex(); - } - else - { - switch (value.getElementValueType()) - { - case STRING: - idx = cpool.addUtf8(value.getValueString()); - break; - case PRIMITIVE_INT: - idx = cpool.addInteger(value.getValueInt()); - break; - case PRIMITIVE_BYTE: - idx = cpool.addInteger(value.getValueByte()); - break; - case PRIMITIVE_CHAR: - idx = cpool.addInteger(value.getValueChar()); - break; - case PRIMITIVE_LONG: - idx = cpool.addLong(value.getValueLong()); - break; - case PRIMITIVE_FLOAT: - idx = cpool.addFloat(value.getValueFloat()); - break; - case PRIMITIVE_DOUBLE: - idx = cpool.addDouble(value.getValueDouble()); - break; - case PRIMITIVE_BOOLEAN: - if (value.getValueBoolean()) - { - idx = cpool.addInteger(1); - } - else - { - idx = cpool.addInteger(0); - } - break; - case PRIMITIVE_SHORT: - idx = cpool.addInteger(value.getValueShort()); - break; - default: - throw new RuntimeException( - "SimpleElementValueGen class does not know how " - + "to copy this type " + type); - } - } - } + /** + * The boolean controls whether we copy info from the 'old' constant pool to + * the 'new'. You need to use this ctor if the annotation is being copied + * from one file to another. + */ + public SimpleElementValueGen(SimpleElementValue value, + ConstantPoolGen cpool, boolean copyPoolEntries) + { + super(value.getElementValueType(), cpool); + if (!copyPoolEntries) + { + // J5ASSERT: Could assert value.stringifyValue() is the same as + // cpool.getConstant(SimpleElementValuevalue.getIndex()) + idx = value.getIndex(); + } + else + { + switch (value.getElementValueType()) + { + case STRING: + idx = cpool.addUtf8(value.getValueString()); + break; + case PRIMITIVE_INT: + idx = cpool.addInteger(value.getValueInt()); + break; + case PRIMITIVE_BYTE: + idx = cpool.addInteger(value.getValueByte()); + break; + case PRIMITIVE_CHAR: + idx = cpool.addInteger(value.getValueChar()); + break; + case PRIMITIVE_LONG: + idx = cpool.addLong(value.getValueLong()); + break; + case PRIMITIVE_FLOAT: + idx = cpool.addFloat(value.getValueFloat()); + break; + case PRIMITIVE_DOUBLE: + idx = cpool.addDouble(value.getValueDouble()); + break; + case PRIMITIVE_BOOLEAN: + if (value.getValueBoolean()) + { + idx = cpool.addInteger(1); + } + else + { + idx = cpool.addInteger(0); + } + break; + case PRIMITIVE_SHORT: + idx = cpool.addInteger(value.getValueShort()); + break; + default: + throw new RuntimeException( + "SimpleElementValueGen class does not know how " + + "to copy this type " + type); + } + } + } - /** - * Return immutable variant - */ - @Override + /** + * Return immutable variant + */ + @Override public ElementValue getElementValue() - { - return new SimpleElementValue(type, idx, cpGen.getConstantPool()); - } + { + return new SimpleElementValue(type, idx, cpGen.getConstantPool()); + } - public int getIndex() - { - return idx; - } + public int getIndex() + { + return idx; + } - public String getValueString() - { - if (type != STRING) { + public String getValueString() + { + if (type != STRING) { throw new RuntimeException( - "Dont call getValueString() on a non STRING ElementValue"); + "Dont call getValueString() on a non STRING ElementValue"); } - ConstantUtf8 c = (ConstantUtf8) cpGen.getConstant(idx); - return c.getBytes(); - } + ConstantUtf8 c = (ConstantUtf8) cpGen.getConstant(idx); + return c.getBytes(); + } - public int getValueInt() - { - if (type != PRIMITIVE_INT) { + public int getValueInt() + { + if (type != PRIMITIVE_INT) { throw new RuntimeException( - "Dont call getValueString() on a non STRING ElementValue"); + "Dont call getValueString() on a non STRING ElementValue"); } - ConstantInteger c = (ConstantInteger) cpGen.getConstant(idx); - return c.getBytes(); - } + ConstantInteger c = (ConstantInteger) cpGen.getConstant(idx); + return c.getBytes(); + } - // Whatever kind of value it is, return it as a string - @Override + // Whatever kind of value it is, return it as a string + @Override public String stringifyValue() - { - switch (type) - { - case PRIMITIVE_INT: - ConstantInteger c = (ConstantInteger) cpGen.getConstant(idx); - return Integer.toString(c.getBytes()); - case PRIMITIVE_LONG: - ConstantLong j = (ConstantLong) cpGen.getConstant(idx); - return Long.toString(j.getBytes()); - case PRIMITIVE_DOUBLE: - ConstantDouble d = (ConstantDouble) cpGen.getConstant(idx); - return Double.toString(d.getBytes()); - case PRIMITIVE_FLOAT: - ConstantFloat f = (ConstantFloat) cpGen.getConstant(idx); - return Float.toString(f.getBytes()); - case PRIMITIVE_SHORT: - ConstantInteger s = (ConstantInteger) cpGen.getConstant(idx); - return Integer.toString(s.getBytes()); - case PRIMITIVE_BYTE: - ConstantInteger b = (ConstantInteger) cpGen.getConstant(idx); - return Integer.toString(b.getBytes()); - case PRIMITIVE_CHAR: - ConstantInteger ch = (ConstantInteger) cpGen.getConstant(idx); - return Integer.toString(ch.getBytes()); - case PRIMITIVE_BOOLEAN: - ConstantInteger bo = (ConstantInteger) cpGen.getConstant(idx); - if (bo.getBytes() == 0) { + { + switch (type) + { + case PRIMITIVE_INT: + ConstantInteger c = (ConstantInteger) cpGen.getConstant(idx); + return Integer.toString(c.getBytes()); + case PRIMITIVE_LONG: + ConstantLong j = (ConstantLong) cpGen.getConstant(idx); + return Long.toString(j.getBytes()); + case PRIMITIVE_DOUBLE: + ConstantDouble d = (ConstantDouble) cpGen.getConstant(idx); + return Double.toString(d.getBytes()); + case PRIMITIVE_FLOAT: + ConstantFloat f = (ConstantFloat) cpGen.getConstant(idx); + return Float.toString(f.getBytes()); + case PRIMITIVE_SHORT: + ConstantInteger s = (ConstantInteger) cpGen.getConstant(idx); + return Integer.toString(s.getBytes()); + case PRIMITIVE_BYTE: + ConstantInteger b = (ConstantInteger) cpGen.getConstant(idx); + return Integer.toString(b.getBytes()); + case PRIMITIVE_CHAR: + ConstantInteger ch = (ConstantInteger) cpGen.getConstant(idx); + return Integer.toString(ch.getBytes()); + case PRIMITIVE_BOOLEAN: + ConstantInteger bo = (ConstantInteger) cpGen.getConstant(idx); + if (bo.getBytes() == 0) { return "false"; } else { return "true"; } - case STRING: - ConstantUtf8 cu8 = (ConstantUtf8) cpGen.getConstant(idx); - return cu8.getBytes(); - default: - throw new RuntimeException( - "SimpleElementValueGen class does not know how to stringify type " - + type); - } - } + case STRING: + ConstantUtf8 cu8 = (ConstantUtf8) cpGen.getConstant(idx); + return cu8.getBytes(); + default: + throw new RuntimeException( + "SimpleElementValueGen class does not know how to stringify type " + + type); + } + } - @Override + @Override public void dump(DataOutputStream dos) throws IOException - { - dos.writeByte(type); // u1 kind of value - switch (type) - { - case PRIMITIVE_INT: - case PRIMITIVE_BYTE: - case PRIMITIVE_CHAR: - case PRIMITIVE_FLOAT: - case PRIMITIVE_LONG: - case PRIMITIVE_BOOLEAN: - case PRIMITIVE_SHORT: - case PRIMITIVE_DOUBLE: - case STRING: - dos.writeShort(idx); - break; - default: - throw new RuntimeException( - "SimpleElementValueGen doesnt know how to write out type " - + type); - } - } + { + dos.writeByte(type); // u1 kind of value + switch (type) + { + case PRIMITIVE_INT: + case PRIMITIVE_BYTE: + case PRIMITIVE_CHAR: + case PRIMITIVE_FLOAT: + case PRIMITIVE_LONG: + case PRIMITIVE_BOOLEAN: + case PRIMITIVE_SHORT: + case PRIMITIVE_DOUBLE: + case STRING: + dos.writeShort(idx); + break; + default: + throw new RuntimeException( + "SimpleElementValueGen doesnt know how to write out type " + + type); + } + } } diff --git a/src/main/java/org/apache/bcel/generic/TargetLostException.java b/src/main/java/org/apache/bcel/generic/TargetLostException.java index 327fe778..131594cb 100644 --- a/src/main/java/org/apache/bcel/generic/TargetLostException.java +++ b/src/main/java/org/apache/bcel/generic/TargetLostException.java @@ -30,14 +30,14 @@ package org.apache.bcel.generic; *
          *     ...
          *     try {
        - *	il.delete(start_ih, end_ih);
        + *    il.delete(start_ih, end_ih);
          *     } catch(TargetLostException e) {
          *       InstructionHandle[] targets = e.getTargets();
        - *	 for(int i=0; i < targets.length; i++) {
        - *	   InstructionTargeter[] targeters = targets[i].getTargeters();
        + *     for(int i=0; i < targets.length; i++) {
        + *       InstructionTargeter[] targeters = targets[i].getTargeters();
          *     
        - *	   for(int j=0; j < targeters.length; j++)
        - *	     targeters[j].updateTarget(targets[i], new_target);
        + *       for(int j=0; j < targeters.length; j++)
        + *         targeters[j].updateTarget(targets[i], new_target);
          *       }
          *     }
          * 
        diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 7f8b6d88..418ac60a 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -74,23 +74,23 @@ public abstract class Type implements java.io.Serializable { */ @Override public int hashCode() { - return type ^ signature.hashCode(); + return type ^ signature.hashCode(); } - - + + /** * @return whether the Types are equal */ @Override public boolean equals(Object o) { - if (o instanceof Type) { - Type t = (Type)o; - return (type == t.type) && signature.equals(t.signature); - } - return false; + if (o instanceof Type) { + Type t = (Type)o; + return (type == t.type) && signature.equals(t.signature); + } + return false; } - - + + /** * @return signature for given type. */ @@ -319,19 +319,19 @@ public abstract class Type implements java.io.Serializable { sb.append(getType(meth.getReturnType()).getSignature()); return sb.toString(); } - + static int size(int coded) { - return coded & 3; + return coded & 3; } - + static int consumed(int coded) { - return coded >> 2; + return coded >> 2; } - + static int encode(int size, int consumed) { - return consumed << 2 | size; + return consumed << 2 | size; } - + static int getArgumentTypesSize( String signature ) { int res = 0; int index; @@ -350,7 +350,7 @@ public abstract class Type implements java.io.Serializable { } return res; } - + static int getTypeSize( String signature ) throws StringIndexOutOfBoundsException { byte type = Utility.typeOfSignature(signature); if (type <= Constants.T_VOID) { @@ -373,8 +373,8 @@ public abstract class Type implements java.io.Serializable { } - static int getReturnTypeSize(String signature) { - int index = signature.lastIndexOf(')') + 1; - return Type.size(getTypeSize(signature.substring(index))); - } + static int getReturnTypeSize(String signature) { + int index = signature.lastIndexOf(')') + 1; + return Type.size(getTypeSize(signature.substring(index))); + } } diff --git a/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java b/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java index 3afd5bed..0d041f5f 100644 --- a/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java +++ b/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java @@ -2,6 +2,6 @@ package org.apache.bcel.generic; public interface VisitorSupportsInvokeDynamic extends Visitor{ - void visitNameSignatureInstruction(NameSignatureInstruction obj); - void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj); + void visitNameSignatureInstruction(NameSignatureInstruction obj); + void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj); } diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index f6eb66b3..d194a47e 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -164,7 +164,7 @@ public class Class2HTML implements Constants { int index = type.indexOf('['); // Type is an array? String base_type = type; if (index > -1) { - base_type = type.substring(0, index); // Tack of the `[' + base_type = type.substring(0, index); // Tack of the `[' } // test for basic type if (base_type.equals("int") || base_type.equals("short") || base_type.equals("boolean") diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 40e47b5a..10b3541e 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -46,7 +46,7 @@ public class ClassPath implements Serializable { private static final long serialVersionUID = 2099441438483340671L; public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(); - + private static final FilenameFilter ARCHIVE_FILTER = new FilenameFilter() { public boolean accept( File dir, String name ) { @@ -54,7 +54,7 @@ public class ClassPath implements Serializable { return name.endsWith(".zip") || name.endsWith(".jar"); } }; - + private PathEntry[] paths; private String class_path; private ClassPath parent; @@ -225,7 +225,7 @@ public class ClassPath implements Serializable { } return null; } - + /** * @param name fully qualified resource name, e.g. java/lang/String.class * @return URL supplying the resource, or null if no resource with that name. @@ -268,11 +268,11 @@ public class ClassPath implements Serializable { if(parent != null) { cf = parent.getClassFileInternal(name, suffix); } - + if(cf == null) { cf = getClassFileInternal(name,suffix); } - + if(cf != null) { return cf; } @@ -285,7 +285,7 @@ public class ClassPath implements Serializable { for (PathEntry path : paths) { ClassFile cf = path.getClassFile(name, suffix); - + if(cf != null) { return cf; } @@ -418,7 +418,7 @@ public class ClassPath implements Serializable { return null; } } - + @Override InputStream getResourceAsStream(String name) { // Resource specification uses '/' whatever the platform @@ -492,7 +492,7 @@ public class ClassPath implements Serializable { return null; } } - + @Override InputStream getResourceAsStream(String name) { final ZipEntry entry = zip.getEntry(name); @@ -502,15 +502,15 @@ public class ClassPath implements Serializable { return null; } } - + @Override ClassFile getClassFile( String name, String suffix ) throws IOException { final ZipEntry entry = zip.getEntry(name.replace('.', '/') + suffix); - + if (entry == null) { return null; } - + return new ClassFile() { public InputStream getInputStream() throws IOException { diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index 333e2a0b..c70143b5 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -317,75 +317,75 @@ public class InstructionFinder { // Initialize pattern map static { map.put("arithmeticinstruction","(irem|lrem|iand|ior|ineg|isub|lneg|fneg|fmul|ldiv|fadd|lxor|frem|idiv|land|ixor|ishr|fsub|lshl|fdiv|iadd|lor|dmul|lsub|ishl|imul|lmul|lushr|dneg|iushr|lshr|ddiv|drem|dadd|ladd|dsub)"); - map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial)"); - map.put("arrayinstruction", "(baload|aastore|saload|caload|fastore|lastore|iaload|castore|iastore|aaload|bastore|sastore|faload|laload|daload|dastore)"); - map.put("gotoinstruction", "(goto|goto_w)"); - map.put("conversioninstruction", "(d2l|l2d|i2s|d2i|l2i|i2b|l2f|d2f|f2i|i2d|i2l|f2d|i2c|f2l|i2f)"); - map.put("localvariableinstruction","(fstore|iinc|lload|dstore|dload|iload|aload|astore|istore|fload|lstore)"); - map.put("loadinstruction", "(fload|dload|lload|iload|aload)"); - map.put("fieldinstruction", "(getfield|putstatic|getstatic|putfield)"); - map.put("cpinstruction", "(ldc2_w|invokeinterface|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)"); - map.put("stackinstruction", "(dup2|swap|dup2_x2|pop|pop2|dup|dup2_x1|dup_x2|dup_x1)"); - map.put("branchinstruction", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); - map.put("returninstruction", "(lreturn|ireturn|freturn|dreturn|areturn|return)"); - map.put("storeinstruction", "(istore|fstore|dstore|astore|lstore)"); - map.put("select", "(tableswitch|lookupswitch)"); - map.put("ifinstruction", "(ifeq|ifgt|if_icmpne|if_icmpeq|ifge|ifnull|ifne|if_icmple|if_icmpge|if_acmpeq|if_icmplt|if_acmpne|ifnonnull|iflt|if_icmpgt|ifle)"); - map.put("jsrinstruction", "(jsr|jsr_w)"); - map.put("variablelengthinstruction", "(tableswitch|jsr|goto|lookupswitch)"); - map.put("unconditionalbranch", "(goto|jsr|jsr_w|athrow|goto_w)"); - map.put("constantpushinstruction", "(dconst|bipush|sipush|fconst|iconst|lconst)"); - map.put("typedinstruction", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)"); - map.put("popinstruction", "(fstore|dstore|pop|pop2|astore|putstatic|istore|lstore)"); - map.put("allocationinstruction", "(multianewarray|new|anewarray|newarray)"); - map.put("indexedinstruction", "(lload|lstore|fload|ldc2_w|invokeinterface|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)"); - map.put("pushinstruction", "(dup|lload|dup2|bipush|fload|ldc2_w|sipush|lconst|fconst|dload|getstatic|ldc_w|aconst_null|dconst|iload|ldc|iconst|aload)"); - map.put("stackproducer", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)"); - map.put("stackconsumer", "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)"); - map.put("exceptionthrower","(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|ldc|invokestatic|daload)"); - map.put("loadclass", "(multianewarray|invokeinterface|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)"); - map.put("instructiontargeter", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); - // Some aliases - map.put("if_icmp", "(if_icmpne|if_icmpeq|if_icmple|if_icmpge|if_icmplt|if_icmpgt)"); - map.put("if_acmp", "(if_acmpeq|if_acmpne)"); - map.put("if", "(ifeq|ifne|iflt|ifge|ifgt|ifle)"); - // Precompile some aliases first - map.put("iconst", precompile(Constants.ICONST_0, Constants.ICONST_5, Constants.ICONST_M1)); - map.put("lconst", new String(new char[] { '(', makeChar(Constants.LCONST_0), '|', makeChar(Constants.LCONST_1), ')' })); - map.put("dconst", new String(new char[] { '(', makeChar(Constants.DCONST_0), '|', makeChar(Constants.DCONST_1), ')' })); - map.put("fconst", new String(new char[] { '(', makeChar(Constants.FCONST_0), '|', makeChar(Constants.FCONST_1), ')' })); - map.put("iload", precompile(Constants.ILOAD_0, Constants.ILOAD_3, Constants.ILOAD)); - map.put("dload", precompile(Constants.DLOAD_0, Constants.DLOAD_3, Constants.DLOAD)); - map.put("fload", precompile(Constants.FLOAD_0, Constants.FLOAD_3, Constants.FLOAD)); - map.put("aload", precompile(Constants.ALOAD_0, Constants.ALOAD_3, Constants.ALOAD)); - map.put("istore", precompile(Constants.ISTORE_0, Constants.ISTORE_3, Constants.ISTORE)); - map.put("dstore", precompile(Constants.DSTORE_0, Constants.DSTORE_3, Constants.DSTORE)); - map.put("fstore", precompile(Constants.FSTORE_0, Constants.FSTORE_3, Constants.FSTORE)); - map.put("astore", precompile(Constants.ASTORE_0, Constants.ASTORE_3, Constants.ASTORE)); - // Compile strings - for (String key : map.keySet()) { - String value = map.get(key); - char ch = value.charAt(1); // Omit already precompiled patterns - if (ch < OFFSET) { - map.put(key, compilePattern(value)); // precompile all - // patterns - } - } - // Add instruction alias to match anything - StringBuilder buf = new StringBuilder("("); - for (short i = 0; i < NO_OPCODES; i++) { - if (Constants.NO_OF_OPERANDS[i] != Constants.UNDEFINED) { // Not - // an - // invalid - // opcode - buf.append(makeChar(i)); - if (i < NO_OPCODES - 1) { - buf.append('|'); - } - } - } - buf.append(')'); - map.put("instruction", buf.toString()); + map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial)"); + map.put("arrayinstruction", "(baload|aastore|saload|caload|fastore|lastore|iaload|castore|iastore|aaload|bastore|sastore|faload|laload|daload|dastore)"); + map.put("gotoinstruction", "(goto|goto_w)"); + map.put("conversioninstruction", "(d2l|l2d|i2s|d2i|l2i|i2b|l2f|d2f|f2i|i2d|i2l|f2d|i2c|f2l|i2f)"); + map.put("localvariableinstruction","(fstore|iinc|lload|dstore|dload|iload|aload|astore|istore|fload|lstore)"); + map.put("loadinstruction", "(fload|dload|lload|iload|aload)"); + map.put("fieldinstruction", "(getfield|putstatic|getstatic|putfield)"); + map.put("cpinstruction", "(ldc2_w|invokeinterface|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)"); + map.put("stackinstruction", "(dup2|swap|dup2_x2|pop|pop2|dup|dup2_x1|dup_x2|dup_x1)"); + map.put("branchinstruction", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); + map.put("returninstruction", "(lreturn|ireturn|freturn|dreturn|areturn|return)"); + map.put("storeinstruction", "(istore|fstore|dstore|astore|lstore)"); + map.put("select", "(tableswitch|lookupswitch)"); + map.put("ifinstruction", "(ifeq|ifgt|if_icmpne|if_icmpeq|ifge|ifnull|ifne|if_icmple|if_icmpge|if_acmpeq|if_icmplt|if_acmpne|ifnonnull|iflt|if_icmpgt|ifle)"); + map.put("jsrinstruction", "(jsr|jsr_w)"); + map.put("variablelengthinstruction", "(tableswitch|jsr|goto|lookupswitch)"); + map.put("unconditionalbranch", "(goto|jsr|jsr_w|athrow|goto_w)"); + map.put("constantpushinstruction", "(dconst|bipush|sipush|fconst|iconst|lconst)"); + map.put("typedinstruction", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)"); + map.put("popinstruction", "(fstore|dstore|pop|pop2|astore|putstatic|istore|lstore)"); + map.put("allocationinstruction", "(multianewarray|new|anewarray|newarray)"); + map.put("indexedinstruction", "(lload|lstore|fload|ldc2_w|invokeinterface|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)"); + map.put("pushinstruction", "(dup|lload|dup2|bipush|fload|ldc2_w|sipush|lconst|fconst|dload|getstatic|ldc_w|aconst_null|dconst|iload|ldc|iconst|aload)"); + map.put("stackproducer", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)"); + map.put("stackconsumer", "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)"); + map.put("exceptionthrower","(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|ldc|invokestatic|daload)"); + map.put("loadclass", "(multianewarray|invokeinterface|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)"); + map.put("instructiontargeter", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); + // Some aliases + map.put("if_icmp", "(if_icmpne|if_icmpeq|if_icmple|if_icmpge|if_icmplt|if_icmpgt)"); + map.put("if_acmp", "(if_acmpeq|if_acmpne)"); + map.put("if", "(ifeq|ifne|iflt|ifge|ifgt|ifle)"); + // Precompile some aliases first + map.put("iconst", precompile(Constants.ICONST_0, Constants.ICONST_5, Constants.ICONST_M1)); + map.put("lconst", new String(new char[] { '(', makeChar(Constants.LCONST_0), '|', makeChar(Constants.LCONST_1), ')' })); + map.put("dconst", new String(new char[] { '(', makeChar(Constants.DCONST_0), '|', makeChar(Constants.DCONST_1), ')' })); + map.put("fconst", new String(new char[] { '(', makeChar(Constants.FCONST_0), '|', makeChar(Constants.FCONST_1), ')' })); + map.put("iload", precompile(Constants.ILOAD_0, Constants.ILOAD_3, Constants.ILOAD)); + map.put("dload", precompile(Constants.DLOAD_0, Constants.DLOAD_3, Constants.DLOAD)); + map.put("fload", precompile(Constants.FLOAD_0, Constants.FLOAD_3, Constants.FLOAD)); + map.put("aload", precompile(Constants.ALOAD_0, Constants.ALOAD_3, Constants.ALOAD)); + map.put("istore", precompile(Constants.ISTORE_0, Constants.ISTORE_3, Constants.ISTORE)); + map.put("dstore", precompile(Constants.DSTORE_0, Constants.DSTORE_3, Constants.DSTORE)); + map.put("fstore", precompile(Constants.FSTORE_0, Constants.FSTORE_3, Constants.FSTORE)); + map.put("astore", precompile(Constants.ASTORE_0, Constants.ASTORE_3, Constants.ASTORE)); + // Compile strings + for (String key : map.keySet()) { + String value = map.get(key); + char ch = value.charAt(1); // Omit already precompiled patterns + if (ch < OFFSET) { + map.put(key, compilePattern(value)); // precompile all + // patterns + } + } + // Add instruction alias to match anything + StringBuilder buf = new StringBuilder("("); + for (short i = 0; i < NO_OPCODES; i++) { + if (Constants.NO_OF_OPERANDS[i] != Constants.UNDEFINED) { // Not + // an + // invalid + // opcode + buf.append(makeChar(i)); + if (i < NO_OPCODES - 1) { + buf.append('|'); + } + } + } + buf.append(')'); + map.put("instruction", buf.toString()); } @@ -402,8 +402,8 @@ public class InstructionFinder { /* - * Internal debugging routines. - */ + * Internal debugging routines. + */ // private static final String pattern2string( String pattern ) { // return pattern2string(pattern, true); // } diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index a59b6bce..fd23a036 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -142,29 +142,29 @@ public class SyntheticRepository implements Repository { * Repository, and its representation could not be found */ public JavaClass loadClass( Class clazz ) throws ClassNotFoundException { - InputStream clsStream = null; - try{ - String className = clazz.getName(); - JavaClass repositoryClass = findClass(className); - if (repositoryClass != null) { - return repositoryClass; - } - String name = className; - int i = name.lastIndexOf('.'); - if (i > 0) { - name = name.substring(i + 1); - } - clsStream = clazz.getResourceAsStream(name + ".class"); - return loadClass(clsStream, className); - } finally { - try{ - if (clsStream != null){ - clsStream.close(); - } - } catch(IOException ioe){ - //don't care - } - } + InputStream clsStream = null; + try{ + String className = clazz.getName(); + JavaClass repositoryClass = findClass(className); + if (repositoryClass != null) { + return repositoryClass; + } + String name = className; + int i = name.lastIndexOf('.'); + if (i > 0) { + name = name.substring(i + 1); + } + clsStream = clazz.getResourceAsStream(name + ".class"); + return loadClass(clsStream, className); + } finally { + try{ + if (clsStream != null){ + clsStream.close(); + } + } catch(IOException ioe){ + //don't care + } + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java index f96a220c..841d0ad4 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java @@ -26,61 +26,61 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public final class AssertionViolatedException extends RuntimeException{ - private static final long serialVersionUID = -129822266349567409L; + private static final long serialVersionUID = -129822266349567409L; /** The error message. */ - private String detailMessage; - /** Constructs a new AssertionViolatedException with null as its error message string. */ - public AssertionViolatedException(){ - super(); - } - /** - * Constructs a new AssertionViolatedException with the specified error message preceded - * by "INTERNAL ERROR: ". - */ - public AssertionViolatedException(String message){ - super(message = "INTERNAL ERROR: "+message); // Thanks to Java, the constructor call here must be first. - detailMessage=message; - } - /** - * Constructs a new AssertionViolationException with the specified error message and initial cause - */ - public AssertionViolatedException(String message, Throwable initCause) { - super(message = "INTERNAL ERROR: "+message, initCause); - detailMessage=message; - } - /** Extends the error message with a string before ("pre") and after ("post") the - 'old' error message. All of these three strings are allowed to be null, and null - is always replaced by the empty string (""). In particular, after invoking this - method, the error message of this object can no longer be null. - */ - public void extendMessage(String pre, String post){ - if (pre == null) { + private String detailMessage; + /** Constructs a new AssertionViolatedException with null as its error message string. */ + public AssertionViolatedException(){ + super(); + } + /** + * Constructs a new AssertionViolatedException with the specified error message preceded + * by "INTERNAL ERROR: ". + */ + public AssertionViolatedException(String message){ + super(message = "INTERNAL ERROR: "+message); // Thanks to Java, the constructor call here must be first. + detailMessage=message; + } + /** + * Constructs a new AssertionViolationException with the specified error message and initial cause + */ + public AssertionViolatedException(String message, Throwable initCause) { + super(message = "INTERNAL ERROR: "+message, initCause); + detailMessage=message; + } + /** Extends the error message with a string before ("pre") and after ("post") the + 'old' error message. All of these three strings are allowed to be null, and null + is always replaced by the empty string (""). In particular, after invoking this + method, the error message of this object can no longer be null. + */ + public void extendMessage(String pre, String post){ + if (pre == null) { pre=""; } - if (detailMessage == null) { + if (detailMessage == null) { detailMessage=""; } - if (post == null) { + if (post == null) { post=""; } - detailMessage = pre+detailMessage+post; - } - /** - * Returns the error message string of this AssertionViolatedException object. - * @return the error message string of this AssertionViolatedException. - */ - @Override + detailMessage = pre+detailMessage+post; + } + /** + * Returns the error message string of this AssertionViolatedException object. + * @return the error message string of this AssertionViolatedException. + */ + @Override public String getMessage(){ - return detailMessage; - } + return detailMessage; + } - /** - * DO NOT USE. It's for experimental testing during development only. - */ - public static void main(String[] args){ - AssertionViolatedException ave = new AssertionViolatedException("Oops!"); - ave.extendMessage("\nFOUND:\n\t","\nExiting!!\n"); - throw ave; - } + /** + * DO NOT USE. It's for experimental testing during development only. + */ + public static void main(String[] args){ + AssertionViolatedException ave = new AssertionViolatedException("Oops!"); + ave.extendMessage("\nFOUND:\n\t","\nExiting!!\n"); + throw ave; + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java index 328e978d..b397850f 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java @@ -27,26 +27,26 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class ClassConstraintException extends VerificationException{ - private static final long serialVersionUID = -4745598983569128296L; + private static final long serialVersionUID = -4745598983569128296L; /** - * Constructs a new ClassConstraintException with null as its error message string. - */ - public ClassConstraintException(){ - super(); - } - - /** - * Constructs a new ClassConstraintException with the specified error message. - */ - public ClassConstraintException(String message){ - super (message); - } - - /** - * Constructs a new ClassConstraintException with the specified error message and cause - */ - public ClassConstraintException(String message, Throwable initCause){ - super(message, initCause); - } + * Constructs a new ClassConstraintException with null as its error message string. + */ + public ClassConstraintException(){ + super(); + } + + /** + * Constructs a new ClassConstraintException with the specified error message. + */ + public ClassConstraintException(String message){ + super (message); + } + + /** + * Constructs a new ClassConstraintException with the specified error message and cause + */ + public ClassConstraintException(String message, Throwable initCause){ + super(message, initCause); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java index c1de5f4d..b62f583f 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java @@ -26,17 +26,17 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public abstract class CodeConstraintException extends VerificationException{ - private static final long serialVersionUID = -7265388214714996640L; + private static final long serialVersionUID = -7265388214714996640L; /** - * Constructs a new CodeConstraintException with null as its error message string. - */ - CodeConstraintException(){ - super(); - } - /** - * Constructs a new CodeConstraintException with the specified error message. - */ - CodeConstraintException(String message){ - super(message); - } + * Constructs a new CodeConstraintException with null as its error message string. + */ + CodeConstraintException(){ + super(); + } + /** + * Constructs a new CodeConstraintException with the specified error message. + */ + CodeConstraintException(String message){ + super(message); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java index c03b4ddb..ae4f1b8c 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java @@ -25,11 +25,11 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class InvalidMethodException extends RuntimeException{ - - private static final long serialVersionUID = -7060302743724808051L; + + private static final long serialVersionUID = -7060302743724808051L; /** Constructs an InvalidMethodException with the specified detail message. */ - public InvalidMethodException(String message){ - super(message); - } + public InvalidMethodException(String message){ + super(message); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java index ccfb6c8c..0ab03d2c 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java @@ -27,19 +27,19 @@ package org.apache.bcel.verifier.exc; */ public class LoadingException extends VerifierConstraintViolatedException{ - private static final long serialVersionUID = -7911901533049018823L; + private static final long serialVersionUID = -7911901533049018823L; /** - * Constructs a new LoadingException with null as its error message string. - */ - public LoadingException(){ - super(); - } - - /** - * Constructs a new LoadingException with the specified error message. - */ - public LoadingException(String message){ - super (message); - } + * Constructs a new LoadingException with null as its error message string. + */ + public LoadingException(){ + super(); + } + + /** + * Constructs a new LoadingException with the specified error message. + */ + public LoadingException(String message){ + super (message); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java index 962bb627..d78b2ab9 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java @@ -29,19 +29,19 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class LocalVariableInfoInconsistentException extends ClassConstraintException{ - private static final long serialVersionUID = -2833180480144304190L; + private static final long serialVersionUID = -2833180480144304190L; /** - * Constructs a new LocalVariableInfoInconsistentException with null as its error message string. - */ - public LocalVariableInfoInconsistentException(){ - super(); - } - - /** - * Constructs a new LocalVariableInfoInconsistentException with the specified error message. - */ - public LocalVariableInfoInconsistentException(String message){ - super (message); - } + * Constructs a new LocalVariableInfoInconsistentException with null as its error message string. + */ + public LocalVariableInfoInconsistentException(){ + super(); + } + + /** + * Constructs a new LocalVariableInfoInconsistentException with the specified error message. + */ + public LocalVariableInfoInconsistentException(String message){ + super (message); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java index b4e2568a..f74374f5 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java @@ -29,9 +29,9 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public abstract class StaticCodeConstraintException extends CodeConstraintException{ - private static final long serialVersionUID = 3858523065007725128L; + private static final long serialVersionUID = 3858523065007725128L; public StaticCodeConstraintException(String message){ - super(message); - } + super(message); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java index 5e4dfb9f..abcac027 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java @@ -32,9 +32,9 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class StaticCodeInstructionConstraintException extends StaticCodeConstraintException{ - private static final long serialVersionUID = 4987255974346614794L; + private static final long serialVersionUID = 4987255974346614794L; public StaticCodeInstructionConstraintException(String message){ - super(message); - } + super(message); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java index 988e689d..623c20c1 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -32,9 +32,9 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class StaticCodeInstructionOperandConstraintException extends StaticCodeConstraintException{ - private static final long serialVersionUID = 4780787099381933487L; + private static final long serialVersionUID = 4780787099381933487L; public StaticCodeInstructionOperandConstraintException(String message){ - super(message); - } + super(message); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java index 10e6c5e1..fafcad5b 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java @@ -31,17 +31,17 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public class StructuralCodeConstraintException extends CodeConstraintException{ - private static final long serialVersionUID = 5406842000007181420L; + private static final long serialVersionUID = 5406842000007181420L; /** - * Constructs a new StructuralCodeConstraintException with the specified error message. - */ - public StructuralCodeConstraintException(String message){ - super(message); - } - /** - * Constructs a new StructuralCodeConstraintException with null as its error message string. - */ - public StructuralCodeConstraintException(){ - super(); - } + * Constructs a new StructuralCodeConstraintException with the specified error message. + */ + public StructuralCodeConstraintException(String message){ + super(message); + } + /** + * Constructs a new StructuralCodeConstraintException with null as its error message string. + */ + public StructuralCodeConstraintException(){ + super(); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/Utility.java b/src/main/java/org/apache/bcel/verifier/exc/Utility.java index ffcba749..0ad9b2b7 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/Utility.java +++ b/src/main/java/org/apache/bcel/verifier/exc/Utility.java @@ -28,14 +28,14 @@ import java.io.StringWriter; * @see java.lang.Throwable */ public final class Utility{ - /** This class is not instantiable. */ - private Utility(){} + /** This class is not instantiable. */ + private Utility(){} - /** This method returns the stack trace of a Throwable instance as a String. */ - public static String getStackTrace(Throwable t){ - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - t.printStackTrace(pw); - return sw.toString(); - } + /** This method returns the stack trace of a Throwable instance as a String. */ + public static String getStackTrace(Throwable t){ + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + t.printStackTrace(pw); + return sw.toString(); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java index 11da8e95..7b03559c 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java @@ -31,25 +31,25 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public abstract class VerificationException extends VerifierConstraintViolatedException{ - private static final long serialVersionUID = 8012776320318623652L; + private static final long serialVersionUID = 8012776320318623652L; /** - * Constructs a new VerificationException with null as its error message string. - */ - VerificationException(){ - super(); - } - /** - * Constructs a new VerificationException with the specified error message. - */ - VerificationException(String message){ - super(message); - } - - /** - * Constructs a new VerificationException with the specified error message and exception - */ - VerificationException(String message, Throwable initCause){ - super(message, initCause); - } + * Constructs a new VerificationException with null as its error message string. + */ + VerificationException(){ + super(); + } + /** + * Constructs a new VerificationException with the specified error message. + */ + VerificationException(String message){ + super(message); + } + + /** + * Constructs a new VerificationException with the specified error message and exception + */ + VerificationException(String message, Throwable initCause){ + super(message, initCause); + } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java index 1ff1f657..9756fd50 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java @@ -30,57 +30,57 @@ package org.apache.bcel.verifier.exc; * @author Enver Haase */ public abstract class VerifierConstraintViolatedException extends RuntimeException{ - // /** The name of the offending class that did not pass the verifier. */ - // String name_of_offending_class; + // /** The name of the offending class that did not pass the verifier. */ + // String name_of_offending_class; - private static final long serialVersionUID = 2946136970490179465L; + private static final long serialVersionUID = 2946136970490179465L; /** The specified error message. */ - private String detailMessage; - /** - * Constructs a new VerifierConstraintViolatedException with null as its error message string. - */ - VerifierConstraintViolatedException(){ - super(); - } - /** - * Constructs a new VerifierConstraintViolatedException with the specified error message. - */ - VerifierConstraintViolatedException(String message){ - super(message); // Not that important - detailMessage = message; - } - /** - * Constructs a new VerifierConstraintViolationException with the specified error message and cause - */ - VerifierConstraintViolatedException(String message, Throwable initCause){ - super(message, initCause); - detailMessage = message; - } + private String detailMessage; + /** + * Constructs a new VerifierConstraintViolatedException with null as its error message string. + */ + VerifierConstraintViolatedException(){ + super(); + } + /** + * Constructs a new VerifierConstraintViolatedException with the specified error message. + */ + VerifierConstraintViolatedException(String message){ + super(message); // Not that important + detailMessage = message; + } + /** + * Constructs a new VerifierConstraintViolationException with the specified error message and cause + */ + VerifierConstraintViolatedException(String message, Throwable initCause){ + super(message, initCause); + detailMessage = message; + } - /** Extends the error message with a string before ("pre") and after ("post") the - 'old' error message. All of these three strings are allowed to be null, and null - is always replaced by the empty string (""). In particular, after invoking this - method, the error message of this object can no longer be null. - */ - public void extendMessage(String pre, String post){ - if (pre == null) { + /** Extends the error message with a string before ("pre") and after ("post") the + 'old' error message. All of these three strings are allowed to be null, and null + is always replaced by the empty string (""). In particular, after invoking this + method, the error message of this object can no longer be null. + */ + public void extendMessage(String pre, String post){ + if (pre == null) { pre=""; } - if (detailMessage == null) { + if (detailMessage == null) { detailMessage=""; } - if (post == null) { + if (post == null) { post=""; } - detailMessage = pre+detailMessage+post; - } - /** - * Returns the error message string of this VerifierConstraintViolatedException object. - * @return the error message string of this VerifierConstraintViolatedException. - */ - @Override + detailMessage = pre+detailMessage+post; + } + /** + * Returns the error message string of this VerifierConstraintViolatedException object. + * @return the error message string of this VerifierConstraintViolatedException. + */ + @Override public String getMessage(){ - return detailMessage; - } + return detailMessage; + } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java index ac48b151..05a99ca3 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java @@ -28,17 +28,17 @@ import org.apache.bcel.generic.Type; */ public final class DOUBLE_Upper extends Type{ - private static final long serialVersionUID = -3046888862357818539L; + private static final long serialVersionUID = -3046888862357818539L; /** The one and only instance of this class. */ - private static final DOUBLE_Upper singleInstance = new DOUBLE_Upper(); + private static final DOUBLE_Upper singleInstance = new DOUBLE_Upper(); - /** The constructor; this class must not be instantiated from the outside. */ - private DOUBLE_Upper(){ - super(Constants.T_UNKNOWN, "Long_Upper"); - } + /** The constructor; this class must not be instantiated from the outside. */ + private DOUBLE_Upper(){ + super(Constants.T_UNKNOWN, "Long_Upper"); + } - /** Use this method to get the single instance of this class. */ - public static DOUBLE_Upper theInstance(){ - return singleInstance; - } + /** Use this method to get the single instance of this class. */ + public static DOUBLE_Upper theInstance(){ + return singleInstance; + } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/IntList.java b/src/main/java/org/apache/bcel/verifier/statics/IntList.java index 361081ac..3d238858 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/IntList.java +++ b/src/main/java/org/apache/bcel/verifier/statics/IntList.java @@ -28,25 +28,25 @@ import java.util.List; * @author Enver Haase */ public class IntList{ - /** The int are stored as Integer objects here. */ - private List theList; - /** This constructor creates an empty list. */ - IntList(){ - theList = new ArrayList(); - } - /** Adds an element to the list. */ - void add(int i){ - theList.add(Integer.valueOf(i)); - } - /** Checks if the specified int is already in the list. */ - boolean contains(int i){ - Integer[] ints = new Integer[theList.size()]; - theList.toArray(ints); - for (Integer k : ints) { - if (i == k.intValue()) { + /** The int are stored as Integer objects here. */ + private List theList; + /** This constructor creates an empty list. */ + IntList(){ + theList = new ArrayList(); + } + /** Adds an element to the list. */ + void add(int i){ + theList.add(Integer.valueOf(i)); + } + /** Checks if the specified int is already in the list. */ + boolean contains(int i){ + Integer[] ints = new Integer[theList.size()]; + theList.toArray(ints); + for (Integer k : ints) { + if (i == k.intValue()) { return true; } - } - return false; - } + } + return false; + } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java index 229e2415..1e67051a 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java @@ -28,17 +28,17 @@ import org.apache.bcel.generic.Type; */ public final class LONG_Upper extends Type{ - private static final long serialVersionUID = 3650377550491597107L; + private static final long serialVersionUID = 3650377550491597107L; /** The one and only instance of this class. */ - private static final LONG_Upper singleInstance = new LONG_Upper(); + private static final LONG_Upper singleInstance = new LONG_Upper(); - /** The constructor; this class must not be instantiated from the outside. */ - private LONG_Upper(){ - super(Constants.T_UNKNOWN, "Long_Upper"); - } + /** The constructor; this class must not be instantiated from the outside. */ + private LONG_Upper(){ + super(Constants.T_UNKNOWN, "Long_Upper"); + } - /** Use this method to get the single instance of this class. */ - public static LONG_Upper theInstance(){ - return singleInstance; - } + /** Use this method to get the single instance of this class. */ + public static LONG_Upper theInstance(){ + return singleInstance; + } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java index 3f5d5d8d..0f24f2ee 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java @@ -33,76 +33,76 @@ import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; */ public class LocalVariableInfo{ - /** The types database. KEY: String representing the offset integer. */ - private Hashtable types = new Hashtable(); - /** The names database. KEY: String representing the offset integer. */ - private Hashtable names = new Hashtable(); + /** The types database. KEY: String representing the offset integer. */ + private Hashtable types = new Hashtable(); + /** The names database. KEY: String representing the offset integer. */ + private Hashtable names = new Hashtable(); - /** - * Adds a name of a local variable and a certain slot to our 'names' - * (Hashtable) database. - */ - private void setName(int offset, String name){ - names.put( ((Integer.toString(offset))), name); - } - /** - * Adds a type of a local variable and a certain slot to our 'types' - * (Hashtable) database. - */ - private void setType(int offset, Type t){ - types.put( ((Integer.toString(offset))), t); - } + /** + * Adds a name of a local variable and a certain slot to our 'names' + * (Hashtable) database. + */ + private void setName(int offset, String name){ + names.put( ((Integer.toString(offset))), name); + } + /** + * Adds a type of a local variable and a certain slot to our 'types' + * (Hashtable) database. + */ + private void setType(int offset, Type t){ + types.put( ((Integer.toString(offset))), t); + } - /** - * Returns the type of the local variable that uses this local - * variable slot at the given bytecode offset. - * Care for legal bytecode offsets yourself, otherwise the return value - * might be wrong. - * May return 'null' if nothing is known about the type of this local - * variable slot at the given bytecode offset. - */ - public Type getType(int offset){ - return types.get(Integer.toString(offset)); - } - /** - * Returns the name of the local variable that uses this local - * variable slot at the given bytecode offset. - * Care for legal bytecode offsets yourself, otherwise the return value - * might be wrong. - * May return 'null' if nothing is known about the type of this local - * variable slot at the given bytecode offset. - */ - public String getName(int offset){ - return (names.get(Integer.toString(offset))); - } - /** - * Adds some information about this local variable (slot). - * @throws LocalVariableInfoInconsistentException if the new information conflicts - * with already gathered information. - */ - public void add(String name, int startpc, int length, Type t) throws LocalVariableInfoInconsistentException{ - for (int i=startpc; i<=startpc+length; i++){ // incl/incl-notation! - add(i,name,t); - } - } + /** + * Returns the type of the local variable that uses this local + * variable slot at the given bytecode offset. + * Care for legal bytecode offsets yourself, otherwise the return value + * might be wrong. + * May return 'null' if nothing is known about the type of this local + * variable slot at the given bytecode offset. + */ + public Type getType(int offset){ + return types.get(Integer.toString(offset)); + } + /** + * Returns the name of the local variable that uses this local + * variable slot at the given bytecode offset. + * Care for legal bytecode offsets yourself, otherwise the return value + * might be wrong. + * May return 'null' if nothing is known about the type of this local + * variable slot at the given bytecode offset. + */ + public String getName(int offset){ + return (names.get(Integer.toString(offset))); + } + /** + * Adds some information about this local variable (slot). + * @throws LocalVariableInfoInconsistentException if the new information conflicts + * with already gathered information. + */ + public void add(String name, int startpc, int length, Type t) throws LocalVariableInfoInconsistentException{ + for (int i=startpc; i<=startpc+length; i++){ // incl/incl-notation! + add(i,name,t); + } + } - /** - * Adds information about name and type for a given offset. - * @throws LocalVariableInfoInconsistentException if the new information conflicts - * with already gathered information. - */ - private void add(int offset, String name, Type t) throws LocalVariableInfoInconsistentException{ - if (getName(offset) != null){ - if (! getName(offset).equals(name)){ - throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+"' a local variable has two different names: '"+getName(offset)+"' and '"+name+"'."); - } - } - if (getType(offset) != null){ - if (! getType(offset).equals(t)){ - throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+"' a local variable has two different types: '"+getType(offset)+"' and '"+t+"'."); - } - } - setName(offset, name); - setType(offset, t); - } + /** + * Adds information about name and type for a given offset. + * @throws LocalVariableInfoInconsistentException if the new information conflicts + * with already gathered information. + */ + private void add(int offset, String name, Type t) throws LocalVariableInfoInconsistentException{ + if (getName(offset) != null){ + if (! getName(offset).equals(name)){ + throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+"' a local variable has two different names: '"+getName(offset)+"' and '"+name+"'."); + } + } + if (getType(offset) != null){ + if (! getType(offset).equals(t)){ + throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+"' a local variable has two different types: '"+getType(offset)+"' and '"+t+"'."); + } + } + setName(offset, name); + setType(offset, t); + } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java index 6c99ebde..cad7a841 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java @@ -31,45 +31,45 @@ import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; * @author Enver Haase */ public class LocalVariablesInfo{ - - /** The information about the local variables is stored here. */ - private LocalVariableInfo[] localVariableInfos; - /** The constructor. */ - LocalVariablesInfo(int max_locals){ - localVariableInfos = new LocalVariableInfo[max_locals]; - for (int i=0; i= localVariableInfos.length){ - throw new AssertionViolatedException("Slot number for local variable information out of range."); - } - return localVariableInfos[slot]; - } + /** The constructor. */ + LocalVariablesInfo(int max_locals){ + localVariableInfos = new LocalVariableInfo[max_locals]; + for (int i=0; i= localVariableInfos.length){ + throw new AssertionViolatedException("Slot number for local variable information out of range."); + } + return localVariableInfos[slot]; + } - /** - * Adds information about the local variable in slot 'slot'. Automatically - * adds information for slot+1 if 't' is Type.LONG or Type.DOUBLE. - * @throws LocalVariableInfoInconsistentException if the new information conflicts - * with already gathered information. - */ - public void add(int slot, String name, int startpc, int length, Type t) throws LocalVariableInfoInconsistentException{ - // The add operation on LocalVariableInfo may throw the '...Inconsistent...' exception, we don't throw it explicitely here. - - if (slot < 0 || slot >= localVariableInfos.length){ - throw new AssertionViolatedException("Slot number for local variable information out of range."); - } + /** + * Adds information about the local variable in slot 'slot'. Automatically + * adds information for slot+1 if 't' is Type.LONG or Type.DOUBLE. + * @throws LocalVariableInfoInconsistentException if the new information conflicts + * with already gathered information. + */ + public void add(int slot, String name, int startpc, int length, Type t) throws LocalVariableInfoInconsistentException{ + // The add operation on LocalVariableInfo may throw the '...Inconsistent...' exception, we don't throw it explicitely here. + + if (slot < 0 || slot >= localVariableInfos.length){ + throw new AssertionViolatedException("Slot number for local variable information out of range."); + } - localVariableInfos[slot].add(name, startpc, length, t); - if (t == Type.LONG) { + localVariableInfos[slot].add(name, startpc, length, t); + if (t == Type.LONG) { localVariableInfos[slot+1].add(name, startpc, length, LONG_Upper.theInstance()); } - if (t == Type.DOUBLE) { + if (t == Type.DOUBLE) { localVariableInfos[slot+1].add(name, startpc, length, DOUBLE_Upper.theInstance()); } - } + } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index 56d2c690..8d768b3b 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -38,151 +38,151 @@ import org.apache.bcel.verifier.exc.Utility; * @see #do_verify() */ public final class Pass1Verifier extends PassVerifier{ - /** - * DON'T USE THIS EVEN PRIVATELY! USE getJavaClass() INSTEAD. - * @see #getJavaClass() - */ - private JavaClass jc; + /** + * DON'T USE THIS EVEN PRIVATELY! USE getJavaClass() INSTEAD. + * @see #getJavaClass() + */ + private JavaClass jc; - /** - * The Verifier that created this. - */ - private Verifier myOwner; + /** + * The Verifier that created this. + */ + private Verifier myOwner; - /** Used to load in and return the myOwner-matching JavaClass object when needed. Avoids loading in a class file when it's not really needed! */ - private JavaClass getJavaClass(){ - if (jc == null){ - try { - jc = Repository.lookupClass(myOwner.getClassName()); - } catch (ClassNotFoundException e) { - // FIXME: currently, Pass1Verifier treats jc == null as a special - // case, so we don't need to do anything here. A better solution - // would be to simply throw the ClassNotFoundException - // out of this method. - } - } - return jc; - } - - /** - * Should only be instantiated by a Verifier. - * - * @see org.apache.bcel.verifier.Verifier - */ - public Pass1Verifier(Verifier owner){ - myOwner = owner; - } + /** Used to load in and return the myOwner-matching JavaClass object when needed. Avoids loading in a class file when it's not really needed! */ + private JavaClass getJavaClass(){ + if (jc == null){ + try { + jc = Repository.lookupClass(myOwner.getClassName()); + } catch (ClassNotFoundException e) { + // FIXME: currently, Pass1Verifier treats jc == null as a special + // case, so we don't need to do anything here. A better solution + // would be to simply throw the ClassNotFoundException + // out of this method. + } + } + return jc; + } - /** - * Pass-one verification basically means loading in a class file. - * The Java Virtual Machine Specification is not too precise about - * what makes the difference between passes one and two. - * The answer is that only pass one is performed on a class file as - * long as its resolution is not requested; whereas pass two and - * pass three are performed during the resolution process. - * Only four constraints to be checked are explicitely stated by - * The Java Virtual Machine Specification, 2nd edition: - *
          - *
        • The first four bytes must contain the right magic number (0xCAFEBABE). - *
        • All recognized attributes must be of the proper length. - *
        • The class file must not be truncated or have extra bytes at the end. - *
        • The constant pool must not contain any superficially unrecognizable information. - *
        - * A more in-depth documentation of what pass one should do was written by - * Philip W. L. Fong: - *
          - *
        • the file should not be truncated. - *
        • the file should not have extra bytes at the end. - *
        • all variable-length structures should be well-formatted: - *
            - *
          • there should only be constant_pool_count-1 many entries in the constant pool. - *
          • all constant pool entries should have size the same as indicated by their type tag. - *
          • there are exactly interfaces_count many entries in the interfaces array of the class file. - *
          • there are exactly fields_count many entries in the fields array of the class file. - *
          • there are exactly methods_count many entries in the methods array of the class file. - *
          • there are exactly attributes_count many entries in the attributes array of the class file, fields, methods, and code attribute. - *
          • there should be exactly attribute_length many bytes in each attribute. Inconsistency between attribute_length and the actually size of the attribute content should be uncovered. For example, in an Exceptions attribute, the actual number of exceptions as required by the number_of_exceptions field might yeild an attribute size that doesn't match the attribute_length. Such an anomaly should be detected. - *
          • all attributes should have proper length. In particular, under certain context (e.g. while parsing method_info), recognizable attributes (e.g. "Code" attribute) should have correct format (e.g. attribute_length is 2). - *
          - *
        • Also, certain constant values are checked for validity: - *
            - *
          • The magic number should be 0xCAFEBABE. - *
          • The major and minor version numbers are valid. - *
          • All the constant pool type tags are recognizable. - *
          • All undocumented access flags are masked off before use. Strictly speaking, this is not really a check. - *
          • The field this_class should point to a string that represents a legal non-array class name, and this name should be the same as the class file being loaded. - *
          • the field super_class should point to a string that represents a legal non-array class name. - *
          • Because some of the above checks require cross referencing the constant pool entries, guards are set up to make sure that the referenced entries are of the right type and the indices are within the legal range (0 < index < constant_pool_count). - *
          - *
        • Extra checks done in pass 1: - *
            - *
          • the constant values of static fields should have the same type as the fields. - *
          • the number of words in a parameter list does not exceed 255 and locals_max. - *
          • the name and signature of fields and methods are verified to be of legal format. - *
          - *
        - * (From the Paper The Mysterious Pass One, first draft, September 2, 1997.) - *
        - * However, most of this is done by parsing a class file or generating a class file into BCEL's internal data structure. - * Therefore, all that is really done here is look up the class file from BCEL's repository. - * This is also motivated by the fact that some omitted things - * (like the check for extra bytes at the end of the class file) are handy when actually using BCEL to repair a class file (otherwise you would not be - * able to load it into BCEL). - * - * @see org.apache.bcel.Repository - */ - @Override + /** + * Should only be instantiated by a Verifier. + * + * @see org.apache.bcel.verifier.Verifier + */ + public Pass1Verifier(Verifier owner){ + myOwner = owner; + } + + /** + * Pass-one verification basically means loading in a class file. + * The Java Virtual Machine Specification is not too precise about + * what makes the difference between passes one and two. + * The answer is that only pass one is performed on a class file as + * long as its resolution is not requested; whereas pass two and + * pass three are performed during the resolution process. + * Only four constraints to be checked are explicitely stated by + * The Java Virtual Machine Specification, 2nd edition: + *
          + *
        • The first four bytes must contain the right magic number (0xCAFEBABE). + *
        • All recognized attributes must be of the proper length. + *
        • The class file must not be truncated or have extra bytes at the end. + *
        • The constant pool must not contain any superficially unrecognizable information. + *
        + * A more in-depth documentation of what pass one should do was written by + * Philip W. L. Fong: + *
          + *
        • the file should not be truncated. + *
        • the file should not have extra bytes at the end. + *
        • all variable-length structures should be well-formatted: + *
            + *
          • there should only be constant_pool_count-1 many entries in the constant pool. + *
          • all constant pool entries should have size the same as indicated by their type tag. + *
          • there are exactly interfaces_count many entries in the interfaces array of the class file. + *
          • there are exactly fields_count many entries in the fields array of the class file. + *
          • there are exactly methods_count many entries in the methods array of the class file. + *
          • there are exactly attributes_count many entries in the attributes array of the class file, fields, methods, and code attribute. + *
          • there should be exactly attribute_length many bytes in each attribute. Inconsistency between attribute_length and the actually size of the attribute content should be uncovered. For example, in an Exceptions attribute, the actual number of exceptions as required by the number_of_exceptions field might yeild an attribute size that doesn't match the attribute_length. Such an anomaly should be detected. + *
          • all attributes should have proper length. In particular, under certain context (e.g. while parsing method_info), recognizable attributes (e.g. "Code" attribute) should have correct format (e.g. attribute_length is 2). + *
          + *
        • Also, certain constant values are checked for validity: + *
            + *
          • The magic number should be 0xCAFEBABE. + *
          • The major and minor version numbers are valid. + *
          • All the constant pool type tags are recognizable. + *
          • All undocumented access flags are masked off before use. Strictly speaking, this is not really a check. + *
          • The field this_class should point to a string that represents a legal non-array class name, and this name should be the same as the class file being loaded. + *
          • the field super_class should point to a string that represents a legal non-array class name. + *
          • Because some of the above checks require cross referencing the constant pool entries, guards are set up to make sure that the referenced entries are of the right type and the indices are within the legal range (0 < index < constant_pool_count). + *
          + *
        • Extra checks done in pass 1: + *
            + *
          • the constant values of static fields should have the same type as the fields. + *
          • the number of words in a parameter list does not exceed 255 and locals_max. + *
          • the name and signature of fields and methods are verified to be of legal format. + *
          + *
        + * (From the Paper The Mysterious Pass One, first draft, September 2, 1997.) + *
        + * However, most of this is done by parsing a class file or generating a class file into BCEL's internal data structure. + * Therefore, all that is really done here is look up the class file from BCEL's repository. + * This is also motivated by the fact that some omitted things + * (like the check for extra bytes at the end of the class file) are handy when actually using BCEL to repair a class file (otherwise you would not be + * able to load it into BCEL). + * + * @see org.apache.bcel.Repository + */ + @Override public VerificationResult do_verify(){ - JavaClass jc; - try{ - jc = getJavaClass(); //loads in the class file if not already done. + JavaClass jc; + try{ + jc = getJavaClass(); //loads in the class file if not already done. + + if (jc != null){ + /* If we find more constraints to check, we should do this in an own method. */ + if (! myOwner.getClassName().equals(jc.getClassName())){ + // This should maybe caught by BCEL: In case of renamed .class files we get wrong + // JavaClass objects here. + throw new LoadingException("Wrong name: the internal name of the .class file '"+jc.getClassName()+"' does not match the file's name '"+myOwner.getClassName()+"'."); + } + } - if (jc != null){ - /* If we find more constraints to check, we should do this in an own method. */ - if (! myOwner.getClassName().equals(jc.getClassName())){ - // This should maybe caught by BCEL: In case of renamed .class files we get wrong - // JavaClass objects here. - throw new LoadingException("Wrong name: the internal name of the .class file '"+jc.getClassName()+"' does not match the file's name '"+myOwner.getClassName()+"'."); - } - } - - } - catch(LoadingException e){ - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, e.getMessage()); - } - catch(ClassFormatException e){ - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, e.getMessage()); - } - catch(RuntimeException e){ - // BCEL does not catch every possible RuntimeException; e.g. if - // a constant pool index is referenced that does not exist. - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Parsing via BCEL did not succeed. "+e.getClass().getName()+" occured:\n"+Utility.getStackTrace(e)); - } + } + catch(LoadingException e){ + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, e.getMessage()); + } + catch(ClassFormatException e){ + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, e.getMessage()); + } + catch(RuntimeException e){ + // BCEL does not catch every possible RuntimeException; e.g. if + // a constant pool index is referenced that does not exist. + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Parsing via BCEL did not succeed. "+e.getClass().getName()+" occured:\n"+Utility.getStackTrace(e)); + } - if (jc != null){ - return VerificationResult.VR_OK; - } - else{ - //TODO: Maybe change Repository's behaviour to throw a LoadingException instead of just returning "null" - // if a class file cannot be found or in another way be looked up. - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Repository.lookup() failed. FILE NOT FOUND?"); - } - } + if (jc != null){ + return VerificationResult.VR_OK; + } + else{ + //TODO: Maybe change Repository's behaviour to throw a LoadingException instead of just returning "null" + // if a class file cannot be found or in another way be looked up. + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Repository.lookup() failed. FILE NOT FOUND?"); + } + } - /** - * Currently this returns an empty array of String. - * One could parse the error messages of BCEL - * (written to java.lang.System.err) when loading - * a class file such as detecting unknown attributes - * or trailing garbage at the end of a class file. - * However, Markus Dahm does not like the idea so this - * method is currently useless and therefore marked as - * TODO. - */ - @Override + /** + * Currently this returns an empty array of String. + * One could parse the error messages of BCEL + * (written to java.lang.System.err) when loading + * a class file such as detecting unknown attributes + * or trailing garbage at the end of a class file. + * However, Markus Dahm does not like the idea so this + * method is currently useless and therefore marked as + * TODO. + */ + @Override public String[] getMessages(){ - // This method is only here to override the javadoc-comment. - return super.getMessages(); - } + // This method is only here to override the javadoc-comment. + return super.getMessages(); + } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 60516485..724a81e8 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -84,171 +84,171 @@ import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; */ public final class Pass2Verifier extends PassVerifier implements Constants{ - /** - * The LocalVariableInfo instances used by Pass3bVerifier. - * localVariablesInfos[i] denotes the information for the - * local variables of method number i in the - * JavaClass this verifier operates on. - */ - private LocalVariablesInfo[] localVariablesInfos; - - /** The Verifier that created this. */ - private Verifier myOwner; - - /** - * Should only be instantiated by a Verifier. - * - * @see Verifier - */ - public Pass2Verifier(Verifier owner){ - myOwner = owner; - } - - /** - * Returns a LocalVariablesInfo object containing information - * about the usage of the local variables in the Code attribute - * of the said method or null if the class file this - * Pass2Verifier operates on could not be pass-2-verified correctly. - * The method number method_nr is the method you get using - * Repository.lookupClass(myOwner.getClassname()).getMethods()[method_nr];. - * You should not add own information. Leave that to JustIce. - */ - public LocalVariablesInfo getLocalVariablesInfo(int method_nr){ - if (this.verify() != VerificationResult.VR_OK) { + /** + * The LocalVariableInfo instances used by Pass3bVerifier. + * localVariablesInfos[i] denotes the information for the + * local variables of method number i in the + * JavaClass this verifier operates on. + */ + private LocalVariablesInfo[] localVariablesInfos; + + /** The Verifier that created this. */ + private Verifier myOwner; + + /** + * Should only be instantiated by a Verifier. + * + * @see Verifier + */ + public Pass2Verifier(Verifier owner){ + myOwner = owner; + } + + /** + * Returns a LocalVariablesInfo object containing information + * about the usage of the local variables in the Code attribute + * of the said method or null if the class file this + * Pass2Verifier operates on could not be pass-2-verified correctly. + * The method number method_nr is the method you get using + * Repository.lookupClass(myOwner.getClassname()).getMethods()[method_nr];. + * You should not add own information. Leave that to JustIce. + */ + public LocalVariablesInfo getLocalVariablesInfo(int method_nr){ + if (this.verify() != VerificationResult.VR_OK) { return null; // It's cached, don't worry. } - if (method_nr < 0 || method_nr >= localVariablesInfos.length){ - throw new AssertionViolatedException("Method number out of range."); - } - return localVariablesInfos[method_nr]; - } - - /** - * Pass 2 is the pass where static properties of the - * class file are checked without looking into "Code" - * arrays of methods. - * This verification pass is usually invoked when - * a class is resolved; and it may be possible that - * this verification pass has to load in other classes - * such as superclasses or implemented interfaces. - * Therefore, Pass 1 is run on them.
        - * Note that most referenced classes are not loaded - * in for verification or for an existance check by this - * pass; only the syntactical correctness of their names - * and descriptors (a.k.a. signatures) is checked.
        - * Very few checks that conceptually belong here - * are delayed until pass 3a in JustIce. JustIce does - * not only check for syntactical correctness but also - * for semantical sanity - therefore it needs access to - * the "Code" array of methods in a few cases. Please - * see the pass 3a documentation, too. - * - * @see org.apache.bcel.verifier.statics.Pass3aVerifier - */ - @Override + if (method_nr < 0 || method_nr >= localVariablesInfos.length){ + throw new AssertionViolatedException("Method number out of range."); + } + return localVariablesInfos[method_nr]; + } + + /** + * Pass 2 is the pass where static properties of the + * class file are checked without looking into "Code" + * arrays of methods. + * This verification pass is usually invoked when + * a class is resolved; and it may be possible that + * this verification pass has to load in other classes + * such as superclasses or implemented interfaces. + * Therefore, Pass 1 is run on them.
        + * Note that most referenced classes are not loaded + * in for verification or for an existance check by this + * pass; only the syntactical correctness of their names + * and descriptors (a.k.a. signatures) is checked.
        + * Very few checks that conceptually belong here + * are delayed until pass 3a in JustIce. JustIce does + * not only check for syntactical correctness but also + * for semantical sanity - therefore it needs access to + * the "Code" array of methods in a few cases. Please + * see the pass 3a documentation, too. + * + * @see org.apache.bcel.verifier.statics.Pass3aVerifier + */ + @Override public VerificationResult do_verify(){ - try { - VerificationResult vr1 = myOwner.doPass1(); - if (vr1.equals(VerificationResult.VR_OK)){ - - // For every method, we could have information about the local variables out of LocalVariableTable attributes of - // the Code attributes. - localVariablesInfos = new LocalVariablesInfo[Repository.lookupClass(myOwner.getClassName()).getMethods().length]; - - VerificationResult vr = VerificationResult.VR_OK; // default. - try{ - constant_pool_entries_satisfy_static_constraints(); - field_and_method_refs_are_valid(); - every_class_has_an_accessible_superclass(); - final_methods_are_not_overridden(); - } - catch (ClassConstraintException cce){ - vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); - } - return vr; - } else { + try { + VerificationResult vr1 = myOwner.doPass1(); + if (vr1.equals(VerificationResult.VR_OK)){ + + // For every method, we could have information about the local variables out of LocalVariableTable attributes of + // the Code attributes. + localVariablesInfos = new LocalVariablesInfo[Repository.lookupClass(myOwner.getClassName()).getMethods().length]; + + VerificationResult vr = VerificationResult.VR_OK; // default. + try{ + constant_pool_entries_satisfy_static_constraints(); + field_and_method_refs_are_valid(); + every_class_has_an_accessible_superclass(); + final_methods_are_not_overridden(); + } + catch (ClassConstraintException cce){ + vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); + } + return vr; + } else { return VerificationResult.VR_NOTYET; } - } catch (ClassNotFoundException e) { - // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * Ensures that every class has a super class and that - * final classes are not subclassed. - * This means, the class this Pass2Verifier operates - * on has proper super classes (transitively) up to - * java.lang.Object. - * The reason for really loading (and Pass1-verifying) - * all of those classes here is that we need them in - * Pass2 anyway to verify no final methods are overridden - * (that could be declared anywhere in the ancestor hierarchy). - * - * @throws ClassConstraintException otherwise. - */ - private void every_class_has_an_accessible_superclass(){ - try { - Set hs = new HashSet(); // save class names to detect circular inheritance - JavaClass jc = Repository.lookupClass(myOwner.getClassName()); - int supidx = -1; - - while (supidx != 0){ - supidx = jc.getSuperclassNameIndex(); - - if (supidx == 0){ - if (jc != Repository.lookupClass(Type.OBJECT.getClassName())){ - throw new ClassConstraintException("Superclass of '"+jc.getClassName()+"' missing but not "+Type.OBJECT.getClassName()+" itself!"); - } - } - else{ - String supername = jc.getSuperclassName(); - if (! hs.add(supername)){ // If supername already is in the list - throw new ClassConstraintException("Circular superclass hierarchy detected."); - } - Verifier v = VerifierFactory.getVerifier(supername); - VerificationResult vr = v.doPass1(); - - if (vr != VerificationResult.VR_OK){ - throw new ClassConstraintException("Could not load in ancestor class '"+supername+"'."); - } - jc = Repository.lookupClass(supername); - - if (jc.isFinal()){ - throw new ClassConstraintException("Ancestor class '"+supername+"' has the FINAL access modifier and must therefore not be subclassed."); - } - } - } - - } catch (ClassNotFoundException e) { - // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * Ensures that final methods are not overridden. - * Precondition to run this method: - * constant_pool_entries_satisfy_static_constraints() and - * every_class_has_an_accessible_superclass() have to be invoked before - * (in that order). - * - * @throws ClassConstraintException otherwise. - * @see #constant_pool_entries_satisfy_static_constraints() - * @see #every_class_has_an_accessible_superclass() - */ - private void final_methods_are_not_overridden(){ - try { - Map hashmap = new HashMap(); - JavaClass jc = Repository.lookupClass(myOwner.getClassName()); - - int supidx = -1; - while (supidx != 0){ - supidx = jc.getSuperclassNameIndex(); - - Method[] methods = jc.getMethods(); + } catch (ClassNotFoundException e) { + // FIXME: this might not be the best way to handle missing classes. + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * Ensures that every class has a super class and that + * final classes are not subclassed. + * This means, the class this Pass2Verifier operates + * on has proper super classes (transitively) up to + * java.lang.Object. + * The reason for really loading (and Pass1-verifying) + * all of those classes here is that we need them in + * Pass2 anyway to verify no final methods are overridden + * (that could be declared anywhere in the ancestor hierarchy). + * + * @throws ClassConstraintException otherwise. + */ + private void every_class_has_an_accessible_superclass(){ + try { + Set hs = new HashSet(); // save class names to detect circular inheritance + JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + int supidx = -1; + + while (supidx != 0){ + supidx = jc.getSuperclassNameIndex(); + + if (supidx == 0){ + if (jc != Repository.lookupClass(Type.OBJECT.getClassName())){ + throw new ClassConstraintException("Superclass of '"+jc.getClassName()+"' missing but not "+Type.OBJECT.getClassName()+" itself!"); + } + } + else{ + String supername = jc.getSuperclassName(); + if (! hs.add(supername)){ // If supername already is in the list + throw new ClassConstraintException("Circular superclass hierarchy detected."); + } + Verifier v = VerifierFactory.getVerifier(supername); + VerificationResult vr = v.doPass1(); + + if (vr != VerificationResult.VR_OK){ + throw new ClassConstraintException("Could not load in ancestor class '"+supername+"'."); + } + jc = Repository.lookupClass(supername); + + if (jc.isFinal()){ + throw new ClassConstraintException("Ancestor class '"+supername+"' has the FINAL access modifier and must therefore not be subclassed."); + } + } + } + + } catch (ClassNotFoundException e) { + // FIXME: this might not be the best way to handle missing classes. + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * Ensures that final methods are not overridden. + * Precondition to run this method: + * constant_pool_entries_satisfy_static_constraints() and + * every_class_has_an_accessible_superclass() have to be invoked before + * (in that order). + * + * @throws ClassConstraintException otherwise. + * @see #constant_pool_entries_satisfy_static_constraints() + * @see #every_class_has_an_accessible_superclass() + */ + private void final_methods_are_not_overridden(){ + try { + Map hashmap = new HashMap(); + JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + + int supidx = -1; + while (supidx != 0){ + supidx = jc.getSuperclassNameIndex(); + + Method[] methods = jc.getMethods(); for (Method method : methods) { String name_and_sig = (method.getName() + method.getSignature()); @@ -270,113 +270,113 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } } } - - jc = Repository.lookupClass(jc.getSuperclassName()); // Well, for OBJECT this returns OBJECT so it works (could return anything but must not throw an Exception). - } - - } catch (ClassNotFoundException e) { - // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e, e); - } - - } - - /** - * Ensures that the constant pool entries satisfy the static constraints - * as described in The Java Virtual Machine Specification, 2nd Edition. - * - * @throws ClassConstraintException otherwise. - */ - private void constant_pool_entries_satisfy_static_constraints(){ - try { - // Most of the consistency is handled internally by BCEL; here - // we only have to verify if the indices of the constants point - // to constants of the appropriate type and such. - JavaClass jc = Repository.lookupClass(myOwner.getClassName()); - new CPESSC_Visitor(jc); // constructor implicitly traverses jc - - } catch (ClassNotFoundException e) { - // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * A Visitor class that ensures the constant pool satisfies the static - * constraints. + + jc = Repository.lookupClass(jc.getSuperclassName()); // Well, for OBJECT this returns OBJECT so it works (could return anything but must not throw an Exception). + } + + } catch (ClassNotFoundException e) { + // FIXME: this might not be the best way to handle missing classes. + throw new AssertionViolatedException("Missing class: " + e, e); + } + + } + + /** + * Ensures that the constant pool entries satisfy the static constraints + * as described in The Java Virtual Machine Specification, 2nd Edition. + * + * @throws ClassConstraintException otherwise. + */ + private void constant_pool_entries_satisfy_static_constraints(){ + try { + // Most of the consistency is handled internally by BCEL; here + // we only have to verify if the indices of the constants point + // to constants of the appropriate type and such. + JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + new CPESSC_Visitor(jc); // constructor implicitly traverses jc + + } catch (ClassNotFoundException e) { + // FIXME: this might not be the best way to handle missing classes. + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * A Visitor class that ensures the constant pool satisfies the static + * constraints. * The visitXXX() methods throw ClassConstraintException instances otherwise. * * @see #constant_pool_entries_satisfy_static_constraints() - */ - private class CPESSC_Visitor extends org.apache.bcel.classfile.EmptyVisitor{ - private Class CONST_Class; - /* + */ + private class CPESSC_Visitor extends org.apache.bcel.classfile.EmptyVisitor{ + private Class CONST_Class; + /* private Class CONST_Fieldref; - private Class CONST_Methodref; - private Class CONST_InterfaceMethodref; + private Class CONST_Methodref; + private Class CONST_InterfaceMethodref; */ - private Class CONST_String; - private Class CONST_Integer; - private Class CONST_Float; - private Class CONST_Long; - private Class CONST_Double; - private Class CONST_NameAndType; - private Class CONST_Utf8; - - private final JavaClass jc; - private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work and computing power. - private final int cplen; // == cp.getLength() -- to save computing power. - private DescendingVisitor carrier; - - private Set field_names = new HashSet(); - private Set field_names_and_desc = new HashSet(); - private Set method_names_and_desc = new HashSet(); - - private CPESSC_Visitor(JavaClass _jc){ - jc = _jc; - cp = _jc.getConstantPool(); - cplen = cp.getLength(); - - CONST_Class = org.apache.bcel.classfile.ConstantClass.class; - /* + private Class CONST_String; + private Class CONST_Integer; + private Class CONST_Float; + private Class CONST_Long; + private Class CONST_Double; + private Class CONST_NameAndType; + private Class CONST_Utf8; + + private final JavaClass jc; + private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work and computing power. + private final int cplen; // == cp.getLength() -- to save computing power. + private DescendingVisitor carrier; + + private Set field_names = new HashSet(); + private Set field_names_and_desc = new HashSet(); + private Set method_names_and_desc = new HashSet(); + + private CPESSC_Visitor(JavaClass _jc){ + jc = _jc; + cp = _jc.getConstantPool(); + cplen = cp.getLength(); + + CONST_Class = org.apache.bcel.classfile.ConstantClass.class; + /* CONST_Fieldref = org.apache.bcel.classfile.ConstantFieldref.class; - CONST_Methodref = org.apache.bcel.classfile.ConstantMethodref.class; - CONST_InterfaceMethodref = org.apache.bcel.classfile.ConstantInterfaceMethodref.class; + CONST_Methodref = org.apache.bcel.classfile.ConstantMethodref.class; + CONST_InterfaceMethodref = org.apache.bcel.classfile.ConstantInterfaceMethodref.class; */ - CONST_String = org.apache.bcel.classfile.ConstantString.class; - CONST_Integer = org.apache.bcel.classfile.ConstantInteger.class; - CONST_Float = org.apache.bcel.classfile.ConstantFloat.class; - CONST_Long = org.apache.bcel.classfile.ConstantLong.class; - CONST_Double = org.apache.bcel.classfile.ConstantDouble.class; - CONST_NameAndType = org.apache.bcel.classfile.ConstantNameAndType.class; - CONST_Utf8 = org.apache.bcel.classfile.ConstantUtf8.class; - - carrier = new DescendingVisitor(_jc, this); - carrier.visit(); - } - - private void checkIndex(Node referrer, int index, Class shouldbe){ - if ((index < 0) || (index >= cplen)){ - throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(referrer)+"'."); - } - Constant c = cp.getConstant(index); - if (! shouldbe.isInstance(c)){ - /* String isnot = shouldbe.toString().substring(shouldbe.toString().lastIndexOf(".")+1); //Cut all before last "." */ - throw new ClassCastException("Illegal constant '"+tostring(c)+"' at index '"+index+"'. '"+tostring(referrer)+"' expects a '"+shouldbe+"'."); - } - } - /////////////////////////////////////// - // ClassFile structure (vmspec2 4.1) // - /////////////////////////////////////// - @Override + CONST_String = org.apache.bcel.classfile.ConstantString.class; + CONST_Integer = org.apache.bcel.classfile.ConstantInteger.class; + CONST_Float = org.apache.bcel.classfile.ConstantFloat.class; + CONST_Long = org.apache.bcel.classfile.ConstantLong.class; + CONST_Double = org.apache.bcel.classfile.ConstantDouble.class; + CONST_NameAndType = org.apache.bcel.classfile.ConstantNameAndType.class; + CONST_Utf8 = org.apache.bcel.classfile.ConstantUtf8.class; + + carrier = new DescendingVisitor(_jc, this); + carrier.visit(); + } + + private void checkIndex(Node referrer, int index, Class shouldbe){ + if ((index < 0) || (index >= cplen)){ + throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(referrer)+"'."); + } + Constant c = cp.getConstant(index); + if (! shouldbe.isInstance(c)){ + /* String isnot = shouldbe.toString().substring(shouldbe.toString().lastIndexOf(".")+1); //Cut all before last "." */ + throw new ClassCastException("Illegal constant '"+tostring(c)+"' at index '"+index+"'. '"+tostring(referrer)+"' expects a '"+shouldbe+"'."); + } + } + /////////////////////////////////////// + // ClassFile structure (vmspec2 4.1) // + /////////////////////////////////////// + @Override public void visitJavaClass(JavaClass obj){ - Attribute[] atts = obj.getAttributes(); - boolean foundSourceFile = false; - boolean foundInnerClasses = false; + Attribute[] atts = obj.getAttributes(); + boolean foundSourceFile = false; + boolean foundInnerClasses = false; - // Is there an InnerClass referenced? - // This is a costly check; existing verifiers don't do it! - boolean hasInnerClass = new InnerClassDetector(jc).innerClassReferenced(); + // Is there an InnerClass referenced? + // This is a costly check; existing verifiers don't do it! + boolean hasInnerClass = new InnerClassDetector(jc).innerClassReferenced(); for (Attribute att : atts) { if ((!(att instanceof SourceFile)) && @@ -408,171 +408,171 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } } - if (hasInnerClass && !foundInnerClasses){ - //throw new ClassConstraintException("A Classfile structure (like '"+tostring(obj)+"') must have exactly one InnerClasses attribute if at least one Inner Class is referenced (which is the case). No InnerClasses attribute was found."); - //vmspec2, page 125 says it would be a constraint: but existing verifiers - //don't check it and javac doesn't satisfy it when it comes to anonymous - //inner classes - addMessage("A Classfile structure (like '"+tostring(obj)+"') must have exactly one InnerClasses attribute if at least one Inner Class is referenced (which is the case). No InnerClasses attribute was found."); - } - } - ///////////////////////////// - // CONSTANTS (vmspec2 4.4) // - ///////////////////////////// - @Override + if (hasInnerClass && !foundInnerClasses){ + //throw new ClassConstraintException("A Classfile structure (like '"+tostring(obj)+"') must have exactly one InnerClasses attribute if at least one Inner Class is referenced (which is the case). No InnerClasses attribute was found."); + //vmspec2, page 125 says it would be a constraint: but existing verifiers + //don't check it and javac doesn't satisfy it when it comes to anonymous + //inner classes + addMessage("A Classfile structure (like '"+tostring(obj)+"') must have exactly one InnerClasses attribute if at least one Inner Class is referenced (which is the case). No InnerClasses attribute was found."); + } + } + ///////////////////////////// + // CONSTANTS (vmspec2 4.4) // + ///////////////////////////// + @Override public void visitConstantClass(ConstantClass obj){ - if (obj.getTag() != Constants.CONSTANT_Class){ - throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); - } - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + if (obj.getTag() != Constants.CONSTANT_Class){ + throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); + } + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - } - @Override + } + @Override public void visitConstantFieldref(ConstantFieldref obj){ - if (obj.getTag() != Constants.CONSTANT_Fieldref){ - throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); - } - checkIndex(obj, obj.getClassIndex(), CONST_Class); - checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); - } - @Override + if (obj.getTag() != Constants.CONSTANT_Fieldref){ + throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); + } + checkIndex(obj, obj.getClassIndex(), CONST_Class); + checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); + } + @Override public void visitConstantMethodref(ConstantMethodref obj){ - if (obj.getTag() != Constants.CONSTANT_Methodref){ - throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); - } - checkIndex(obj, obj.getClassIndex(), CONST_Class); - checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); - } - @Override + if (obj.getTag() != Constants.CONSTANT_Methodref){ + throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); + } + checkIndex(obj, obj.getClassIndex(), CONST_Class); + checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); + } + @Override public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ - if (obj.getTag() != Constants.CONSTANT_InterfaceMethodref){ - throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); - } - checkIndex(obj, obj.getClassIndex(), CONST_Class); - checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); - } - @Override + if (obj.getTag() != Constants.CONSTANT_InterfaceMethodref){ + throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); + } + checkIndex(obj, obj.getClassIndex(), CONST_Class); + checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); + } + @Override public void visitConstantString(ConstantString obj){ - if (obj.getTag() != Constants.CONSTANT_String){ - throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); - } - checkIndex(obj, obj.getStringIndex(), CONST_Utf8); - } - @Override + if (obj.getTag() != Constants.CONSTANT_String){ + throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); + } + checkIndex(obj, obj.getStringIndex(), CONST_Utf8); + } + @Override public void visitConstantInteger(ConstantInteger obj){ - if (obj.getTag() != Constants.CONSTANT_Integer){ - throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); - } - // no indices to check - } - @Override + if (obj.getTag() != Constants.CONSTANT_Integer){ + throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); + } + // no indices to check + } + @Override public void visitConstantFloat(ConstantFloat obj){ - if (obj.getTag() != Constants.CONSTANT_Float){ - throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); - } - //no indices to check - } - @Override + if (obj.getTag() != Constants.CONSTANT_Float){ + throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); + } + //no indices to check + } + @Override public void visitConstantLong(ConstantLong obj){ - if (obj.getTag() != Constants.CONSTANT_Long){ - throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); - } - //no indices to check - } - @Override + if (obj.getTag() != Constants.CONSTANT_Long){ + throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); + } + //no indices to check + } + @Override public void visitConstantDouble(ConstantDouble obj){ - if (obj.getTag() != Constants.CONSTANT_Double){ - throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); - } - //no indices to check - } - @Override + if (obj.getTag() != Constants.CONSTANT_Double){ + throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); + } + //no indices to check + } + @Override public void visitConstantNameAndType(ConstantNameAndType obj){ - if (obj.getTag() != Constants.CONSTANT_NameAndType){ - throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); - } - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - //checkIndex(obj, obj.getDescriptorIndex(), CONST_Utf8); //inconsistently named in BCEL, see below. - checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); - } - @Override + if (obj.getTag() != Constants.CONSTANT_NameAndType){ + throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); + } + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + //checkIndex(obj, obj.getDescriptorIndex(), CONST_Utf8); //inconsistently named in BCEL, see below. + checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); + } + @Override public void visitConstantUtf8(ConstantUtf8 obj){ - if (obj.getTag() != Constants.CONSTANT_Utf8){ - throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); - } - //no indices to check - } - ////////////////////////// - // FIELDS (vmspec2 4.5) // - ////////////////////////// - @Override + if (obj.getTag() != Constants.CONSTANT_Utf8){ + throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); + } + //no indices to check + } + ////////////////////////// + // FIELDS (vmspec2 4.5) // + ////////////////////////// + @Override public void visitField(Field obj){ - if (jc.isClass()){ - int maxone=0; - if (obj.isPrivate()) { + if (jc.isClass()){ + int maxone=0; + if (obj.isPrivate()) { maxone++; } - if (obj.isProtected()) { + if (obj.isProtected()) { maxone++; } - if (obj.isPublic()) { + if (obj.isPublic()) { maxone++; } - if (maxone > 1){ - throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); - } - - if (obj.isFinal() && obj.isVolatile()){ - throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_FINAL, ACC_VOLATILE modifiers set."); - } - } - else{ // isInterface! - if (!obj.isPublic()){ - throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); - } - if (!obj.isStatic()){ - throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_STATIC modifier set but hasn't!"); - } - if (!obj.isFinal()){ - throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_FINAL modifier set but hasn't!"); - } - } - - if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_VOLATILE|ACC_TRANSIENT)) > 0){ - addMessage("Field '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, ACC_TRANSIENT set (ignored)."); - } - - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - - String name = obj.getName(); - if (! validFieldName(name)){ - throw new ClassConstraintException("Field '"+tostring(obj)+"' has illegal name '"+obj.getName()+"'."); - } - - // A descriptor is often named signature in BCEL - checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); - - String sig = ((ConstantUtf8) (cp.getConstant(obj.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) - - try{ - Type.getType(sig); /* Don't need the return value */ - } - catch (ClassFormatException cfe){ + if (maxone > 1){ + throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); + } + + if (obj.isFinal() && obj.isVolatile()){ + throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_FINAL, ACC_VOLATILE modifiers set."); + } + } + else{ // isInterface! + if (!obj.isPublic()){ + throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); + } + if (!obj.isStatic()){ + throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_STATIC modifier set but hasn't!"); + } + if (!obj.isFinal()){ + throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_FINAL modifier set but hasn't!"); + } + } + + if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_VOLATILE|ACC_TRANSIENT)) > 0){ + addMessage("Field '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, ACC_TRANSIENT set (ignored)."); + } + + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + String name = obj.getName(); + if (! validFieldName(name)){ + throw new ClassConstraintException("Field '"+tostring(obj)+"' has illegal name '"+obj.getName()+"'."); + } + + // A descriptor is often named signature in BCEL + checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); + + String sig = ((ConstantUtf8) (cp.getConstant(obj.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + + try{ + Type.getType(sig); /* Don't need the return value */ + } + catch (ClassFormatException cfe){ throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); - } - - String nameanddesc = (name+sig); - if (field_names_and_desc.contains(nameanddesc)){ - throw new ClassConstraintException("No two fields (like '"+tostring(obj)+"') are allowed have same names and descriptors!"); - } - if (field_names.contains(name)){ - addMessage("More than one field of name '"+name+"' detected (but with different type descriptors). This is very unusual."); - } - field_names_and_desc.add(nameanddesc); - field_names.add(name); - - Attribute[] atts = obj.getAttributes(); + } + + String nameanddesc = (name+sig); + if (field_names_and_desc.contains(nameanddesc)){ + throw new ClassConstraintException("No two fields (like '"+tostring(obj)+"') are allowed have same names and descriptors!"); + } + if (field_names.contains(name)){ + addMessage("More than one field of name '"+name+"' detected (but with different type descriptors). This is very unusual."); + } + field_names_and_desc.add(nameanddesc); + field_names.add(name); + + Attribute[] atts = obj.getAttributes(); for (Attribute att : atts) { if ((!(att instanceof ConstantValue)) && (!(att instanceof Synthetic)) && @@ -583,105 +583,105 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ addMessage("Attribute '" + tostring(att) + "' as an attribute of Field '" + tostring(obj) + "' is not a ConstantValue and is therefore only of use for debuggers and such."); } } - } - /////////////////////////// - // METHODS (vmspec2 4.6) // - /////////////////////////// - @Override + } + /////////////////////////// + // METHODS (vmspec2 4.6) // + /////////////////////////// + @Override public void visitMethod(Method obj){ - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - String name = obj.getName(); - if (! validMethodName(name, true)){ - throw new ClassConstraintException("Method '"+tostring(obj)+"' has illegal name '"+name+"'."); - } + String name = obj.getName(); + if (! validMethodName(name, true)){ + throw new ClassConstraintException("Method '"+tostring(obj)+"' has illegal name '"+name+"'."); + } - // A descriptor is often named signature in BCEL - checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); + // A descriptor is often named signature in BCEL + checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); - String sig = ((ConstantUtf8) (cp.getConstant(obj.getSignatureIndex()))).getBytes(); // Method's signature(=descriptor) + String sig = ((ConstantUtf8) (cp.getConstant(obj.getSignatureIndex()))).getBytes(); // Method's signature(=descriptor) - Type t; - Type[] ts; // needed below the try block. - try{ - t = Type.getReturnType(sig); - ts = Type.getArgumentTypes(sig); - } - catch (ClassFormatException cfe){ + Type t; + Type[] ts; // needed below the try block. + try{ + t = Type.getReturnType(sig); + ts = Type.getArgumentTypes(sig); + } + catch (ClassFormatException cfe){ throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by Method '"+tostring(obj)+"'.", cfe); - } + } - // Check if referenced objects exist. - Type act = t; - if (act instanceof ArrayType) { + // Check if referenced objects exist. + Type act = t; + if (act instanceof ArrayType) { act = ((ArrayType) act).getBasicType(); } - if (act instanceof ObjectType){ - Verifier v = VerifierFactory.getVerifier( ((ObjectType) act).getClassName() ); - VerificationResult vr = v.doPass1(); - if (vr != VerificationResult.VR_OK) { - throw new ClassConstraintException("Method '"+tostring(obj)+"' has a return type that does not pass verification pass 1: '"+vr+"'."); - } - } - - for (Type element : ts) { - act = element; - if (act instanceof ArrayType) { + if (act instanceof ObjectType){ + Verifier v = VerifierFactory.getVerifier( ((ObjectType) act).getClassName() ); + VerificationResult vr = v.doPass1(); + if (vr != VerificationResult.VR_OK) { + throw new ClassConstraintException("Method '"+tostring(obj)+"' has a return type that does not pass verification pass 1: '"+vr+"'."); + } + } + + for (Type element : ts) { + act = element; + if (act instanceof ArrayType) { act = ((ArrayType) act).getBasicType(); } - if (act instanceof ObjectType){ - Verifier v = VerifierFactory.getVerifier( ((ObjectType) act).getClassName() ); - VerificationResult vr = v.doPass1(); - if (vr != VerificationResult.VR_OK) { - throw new ClassConstraintException("Method '"+tostring(obj)+"' has an argument type that does not pass verification pass 1: '"+vr+"'."); - } - } - } - - // Nearly forgot this! Funny return values are allowed, but a non-empty arguments list makes a different method out of it! - if (name.equals(STATIC_INITIALIZER_NAME) && (ts.length != 0)){ - throw new ClassConstraintException("Method '"+tostring(obj)+"' has illegal name '"+name+"'. It's name resembles the class or interface initialization method which it isn't because of its arguments (==descriptor)."); - } - - if (jc.isClass()){ - int maxone=0; - if (obj.isPrivate()) { + if (act instanceof ObjectType){ + Verifier v = VerifierFactory.getVerifier( ((ObjectType) act).getClassName() ); + VerificationResult vr = v.doPass1(); + if (vr != VerificationResult.VR_OK) { + throw new ClassConstraintException("Method '"+tostring(obj)+"' has an argument type that does not pass verification pass 1: '"+vr+"'."); + } + } + } + + // Nearly forgot this! Funny return values are allowed, but a non-empty arguments list makes a different method out of it! + if (name.equals(STATIC_INITIALIZER_NAME) && (ts.length != 0)){ + throw new ClassConstraintException("Method '"+tostring(obj)+"' has illegal name '"+name+"'. It's name resembles the class or interface initialization method which it isn't because of its arguments (==descriptor)."); + } + + if (jc.isClass()){ + int maxone=0; + if (obj.isPrivate()) { maxone++; } - if (obj.isProtected()) { + if (obj.isProtected()) { maxone++; } - if (obj.isPublic()) { + if (obj.isPublic()) { maxone++; } - if (maxone > 1){ - throw new ClassConstraintException("Method '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); - } + if (maxone > 1){ + throw new ClassConstraintException("Method '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); + } - if (obj.isAbstract()){ - if (obj.isFinal()) { + if (obj.isAbstract()){ + if (obj.isFinal()) { throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_FINAL modifier set."); } - if (obj.isNative()) { + if (obj.isNative()) { throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_NATIVE modifier set."); } - if (obj.isPrivate()) { + if (obj.isPrivate()) { throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_PRIVATE modifier set."); } - if (obj.isStatic()) { + if (obj.isStatic()) { throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STATIC modifier set."); } - if (obj.isStrictfp()) { + if (obj.isStrictfp()) { throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STRICT modifier set."); } - if (obj.isSynchronized()) { + if (obj.isSynchronized()) { throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_SYNCHRONIZED modifier set."); } - } - } - else{ // isInterface! - if (!name.equals(STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph + } + } + else{ // isInterface! + if (!name.equals(STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph if (jc.getMajor() >= MAJOR_1_8) { if (!(obj.isPublic() ^ obj.isPrivate())) { throw new ClassConstraintException("Interface method '" + tostring(obj) + "' must have exactly one of its ACC_PUBLIC and ACC_PRIVATE modifiers set."); @@ -711,43 +711,43 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } } } - } - - // A specific instance initialization method... (vmspec2,Page 116). - if (name.equals(CONSTRUCTOR_NAME)){ - //..may have at most one of ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC set: is checked above. - //..may also have ACC_STRICT set, but none of the other flags in table 4.5 (vmspec2, page 115) - if ( obj.isStatic() || - obj.isFinal() || - obj.isSynchronized() || - obj.isNative() || - obj.isAbstract() ){ - throw new ClassConstraintException("Instance initialization method '"+tostring(obj)+"' must not have any of the ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT modifiers set."); - } - } - - // Class and interface initialization methods... - if (name.equals(STATIC_INITIALIZER_NAME)){ - if ((obj.getAccessFlags() & (~ACC_STRICT)) > 0){ - addMessage("Class or interface initialization method '"+tostring(obj)+"' has superfluous access modifier(s) set: everything but ACC_STRICT is ignored."); - } - if (obj.isAbstract()){ - throw new ClassConstraintException("Class or interface initialization method '"+tostring(obj)+"' must not be abstract. This contradicts the Java Language Specification, Second Edition (which omits this constraint) but is common practice of existing verifiers."); - } - } - - if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_SYNCHRONIZED|ACC_NATIVE|ACC_ABSTRACT|ACC_STRICT)) > 0){ - addMessage("Method '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT set (ignored)."); - } - - String nameanddesc = (name+sig); - if (method_names_and_desc.contains(nameanddesc)){ - throw new ClassConstraintException("No two methods (like '"+tostring(obj)+"') are allowed have same names and desciptors!"); - } - method_names_and_desc.add(nameanddesc); - - Attribute[] atts = obj.getAttributes(); - int num_code_atts = 0; + } + + // A specific instance initialization method... (vmspec2,Page 116). + if (name.equals(CONSTRUCTOR_NAME)){ + //..may have at most one of ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC set: is checked above. + //..may also have ACC_STRICT set, but none of the other flags in table 4.5 (vmspec2, page 115) + if ( obj.isStatic() || + obj.isFinal() || + obj.isSynchronized() || + obj.isNative() || + obj.isAbstract() ){ + throw new ClassConstraintException("Instance initialization method '"+tostring(obj)+"' must not have any of the ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT modifiers set."); + } + } + + // Class and interface initialization methods... + if (name.equals(STATIC_INITIALIZER_NAME)){ + if ((obj.getAccessFlags() & (~ACC_STRICT)) > 0){ + addMessage("Class or interface initialization method '"+tostring(obj)+"' has superfluous access modifier(s) set: everything but ACC_STRICT is ignored."); + } + if (obj.isAbstract()){ + throw new ClassConstraintException("Class or interface initialization method '"+tostring(obj)+"' must not be abstract. This contradicts the Java Language Specification, Second Edition (which omits this constraint) but is common practice of existing verifiers."); + } + } + + if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_SYNCHRONIZED|ACC_NATIVE|ACC_ABSTRACT|ACC_STRICT)) > 0){ + addMessage("Method '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT set (ignored)."); + } + + String nameanddesc = (name+sig); + if (method_names_and_desc.contains(nameanddesc)){ + throw new ClassConstraintException("No two methods (like '"+tostring(obj)+"') are allowed have same names and desciptors!"); + } + method_names_and_desc.add(nameanddesc); + + Attribute[] atts = obj.getAttributes(); + int num_code_atts = 0; for (Attribute att : atts) { if ((!(att instanceof Code)) && (!(att instanceof ExceptionTable)) && @@ -766,723 +766,723 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ num_code_atts++; } } - if ( !obj.isNative() && !obj.isAbstract() && num_code_atts != 1){ - throw new ClassConstraintException("Non-native, non-abstract methods like '"+tostring(obj)+"' must have exactly one Code attribute (found: "+num_code_atts+")."); - } - } - /////////////////////////////////////////////////////// - // ClassFile-structure-ATTRIBUTES (vmspec2 4.1, 4.7) // - /////////////////////////////////////////////////////// - @Override + if ( !obj.isNative() && !obj.isAbstract() && num_code_atts != 1){ + throw new ClassConstraintException("Non-native, non-abstract methods like '"+tostring(obj)+"' must have exactly one Code attribute (found: "+num_code_atts+")."); + } + } + /////////////////////////////////////////////////////// + // ClassFile-structure-ATTRIBUTES (vmspec2 4.1, 4.7) // + /////////////////////////////////////////////////////// + @Override public void visitSourceFile(SourceFile obj){//vmspec2 4.7.7 - // zero or one SourceFile attr per ClassFile: see visitJavaClass() + // zero or one SourceFile attr per ClassFile: see visitJavaClass() - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("SourceFile")){ - throw new ClassConstraintException("The SourceFile attribute '"+tostring(obj)+"' is not correctly named 'SourceFile' but '"+name+"'."); - } + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); + if (! name.equals("SourceFile")){ + throw new ClassConstraintException("The SourceFile attribute '"+tostring(obj)+"' is not correctly named 'SourceFile' but '"+name+"'."); + } - checkIndex(obj, obj.getSourceFileIndex(), CONST_Utf8); + checkIndex(obj, obj.getSourceFileIndex(), CONST_Utf8); - String sourcefilename = ((ConstantUtf8) cp.getConstant(obj.getSourceFileIndex())).getBytes(); //==obj.getSourceFileName() ? - String sourcefilenamelc = sourcefilename.toLowerCase(Locale.ENGLISH); + String sourcefilename = ((ConstantUtf8) cp.getConstant(obj.getSourceFileIndex())).getBytes(); //==obj.getSourceFileName() ? + String sourcefilenamelc = sourcefilename.toLowerCase(Locale.ENGLISH); - if ( (sourcefilename.indexOf('/') != -1) || - (sourcefilename.indexOf('\\') != -1) || - (sourcefilename.indexOf(':') != -1) || - (sourcefilenamelc.lastIndexOf(".java") == -1) ){ - addMessage("SourceFile attribute '"+tostring(obj)+"' has a funny name: remember not to confuse certain parsers working on javap's output. Also, this name ('"+sourcefilename+"') is considered an unqualified (simple) file name only."); - } - } - @Override + if ( (sourcefilename.indexOf('/') != -1) || + (sourcefilename.indexOf('\\') != -1) || + (sourcefilename.indexOf(':') != -1) || + (sourcefilenamelc.lastIndexOf(".java") == -1) ){ + addMessage("SourceFile attribute '"+tostring(obj)+"' has a funny name: remember not to confuse certain parsers working on javap's output. Also, this name ('"+sourcefilename+"') is considered an unqualified (simple) file name only."); + } + } + @Override public void visitDeprecated(Deprecated obj){//vmspec2 4.7.10 - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - - String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("Deprecated")){ - throw new ClassConstraintException("The Deprecated attribute '"+tostring(obj)+"' is not correctly named 'Deprecated' but '"+name+"'."); - } - } - @Override + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); + if (! name.equals("Deprecated")){ + throw new ClassConstraintException("The Deprecated attribute '"+tostring(obj)+"' is not correctly named 'Deprecated' but '"+name+"'."); + } + } + @Override public void visitSynthetic(Synthetic obj){//vmspec2 4.7.6 - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("Synthetic")){ - throw new ClassConstraintException("The Synthetic attribute '"+tostring(obj)+"' is not correctly named 'Synthetic' but '"+name+"'."); - } - } - @Override + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); + if (! name.equals("Synthetic")){ + throw new ClassConstraintException("The Synthetic attribute '"+tostring(obj)+"' is not correctly named 'Synthetic' but '"+name+"'."); + } + } + @Override public void visitInnerClasses(InnerClasses obj){//vmspec2 4.7.5 - // exactly one InnerClasses attr per ClassFile if some inner class is refernced: see visitJavaClass() - - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - - String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("InnerClasses")){ - throw new ClassConstraintException("The InnerClasses attribute '"+tostring(obj)+"' is not correctly named 'InnerClasses' but '"+name+"'."); - } - - InnerClass[] ics = obj.getInnerClasses(); - - for (InnerClass ic : ics) { - checkIndex(obj, ic.getInnerClassIndex(), CONST_Class); - int outer_idx = ic.getOuterClassIndex(); - if (outer_idx != 0){ - checkIndex(obj, outer_idx, CONST_Class); - } - int innername_idx = ic.getInnerNameIndex(); - if (innername_idx != 0){ - checkIndex(obj, innername_idx, CONST_Utf8); - } - int acc = ic.getInnerAccessFlags(); - acc = acc & (~ (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL | ACC_INTERFACE | ACC_ABSTRACT)); - if (acc != 0){ - addMessage("Unknown access flag for inner class '"+tostring(ic)+"' set (InnerClasses attribute '"+tostring(obj)+"')."); - } - } - // Semantical consistency is not yet checked by Sun, see vmspec2 4.7.5. - // [marked TODO in JustIce] - } - //////////////////////////////////////////////////////// - // field_info-structure-ATTRIBUTES (vmspec2 4.5, 4.7) // - //////////////////////////////////////////////////////// - @Override + // exactly one InnerClasses attr per ClassFile if some inner class is refernced: see visitJavaClass() + + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); + if (! name.equals("InnerClasses")){ + throw new ClassConstraintException("The InnerClasses attribute '"+tostring(obj)+"' is not correctly named 'InnerClasses' but '"+name+"'."); + } + + InnerClass[] ics = obj.getInnerClasses(); + + for (InnerClass ic : ics) { + checkIndex(obj, ic.getInnerClassIndex(), CONST_Class); + int outer_idx = ic.getOuterClassIndex(); + if (outer_idx != 0){ + checkIndex(obj, outer_idx, CONST_Class); + } + int innername_idx = ic.getInnerNameIndex(); + if (innername_idx != 0){ + checkIndex(obj, innername_idx, CONST_Utf8); + } + int acc = ic.getInnerAccessFlags(); + acc = acc & (~ (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL | ACC_INTERFACE | ACC_ABSTRACT)); + if (acc != 0){ + addMessage("Unknown access flag for inner class '"+tostring(ic)+"' set (InnerClasses attribute '"+tostring(obj)+"')."); + } + } + // Semantical consistency is not yet checked by Sun, see vmspec2 4.7.5. + // [marked TODO in JustIce] + } + //////////////////////////////////////////////////////// + // field_info-structure-ATTRIBUTES (vmspec2 4.5, 4.7) // + //////////////////////////////////////////////////////// + @Override public void visitConstantValue(ConstantValue obj){//vmspec2 4.7.2 - // Despite its name, this really is an Attribute, - // not a constant! - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - - String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("ConstantValue")){ - throw new ClassConstraintException("The ConstantValue attribute '"+tostring(obj)+"' is not correctly named 'ConstantValue' but '"+name+"'."); - } - - Object pred = carrier.predecessor(); - if (pred instanceof Field){ //ConstantValue attributes are quite senseless if the predecessor is not a field. - Field f = (Field) pred; - // Field constraints have been checked before -- so we are safe using their type information. - Type field_type = Type.getType(((ConstantUtf8) (cp.getConstant(f.getSignatureIndex()))).getBytes()); - - int index = obj.getConstantValueIndex(); - if ((index < 0) || (index >= cplen)){ - throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(obj)+"'."); - } - Constant c = cp.getConstant(index); - - if (CONST_Long.isInstance(c) && field_type.equals(Type.LONG)){ - return; - } - if (CONST_Float.isInstance(c) && field_type.equals(Type.FLOAT)){ - return; - } - if (CONST_Double.isInstance(c) && field_type.equals(Type.DOUBLE)){ - return; - } - if (CONST_Integer.isInstance(c) && (field_type.equals(Type.INT) || field_type.equals(Type.SHORT) || field_type.equals(Type.CHAR) || field_type.equals(Type.BYTE) || field_type.equals(Type.BOOLEAN))){ - return; - } - if (CONST_String.isInstance(c) && field_type.equals(Type.STRING)){ - return; - } - - throw new ClassConstraintException("Illegal type of ConstantValue '"+obj+"' embedding Constant '"+c+"'. It is referenced by field '"+tostring(f)+"' expecting a different type: '"+field_type+"'."); - } - } - // SYNTHETIC: see above - // DEPRECATED: see above - ///////////////////////////////////////////////////////// - // method_info-structure-ATTRIBUTES (vmspec2 4.6, 4.7) // - ///////////////////////////////////////////////////////// - @Override + // Despite its name, this really is an Attribute, + // not a constant! + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); + if (! name.equals("ConstantValue")){ + throw new ClassConstraintException("The ConstantValue attribute '"+tostring(obj)+"' is not correctly named 'ConstantValue' but '"+name+"'."); + } + + Object pred = carrier.predecessor(); + if (pred instanceof Field){ //ConstantValue attributes are quite senseless if the predecessor is not a field. + Field f = (Field) pred; + // Field constraints have been checked before -- so we are safe using their type information. + Type field_type = Type.getType(((ConstantUtf8) (cp.getConstant(f.getSignatureIndex()))).getBytes()); + + int index = obj.getConstantValueIndex(); + if ((index < 0) || (index >= cplen)){ + throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(obj)+"'."); + } + Constant c = cp.getConstant(index); + + if (CONST_Long.isInstance(c) && field_type.equals(Type.LONG)){ + return; + } + if (CONST_Float.isInstance(c) && field_type.equals(Type.FLOAT)){ + return; + } + if (CONST_Double.isInstance(c) && field_type.equals(Type.DOUBLE)){ + return; + } + if (CONST_Integer.isInstance(c) && (field_type.equals(Type.INT) || field_type.equals(Type.SHORT) || field_type.equals(Type.CHAR) || field_type.equals(Type.BYTE) || field_type.equals(Type.BOOLEAN))){ + return; + } + if (CONST_String.isInstance(c) && field_type.equals(Type.STRING)){ + return; + } + + throw new ClassConstraintException("Illegal type of ConstantValue '"+obj+"' embedding Constant '"+c+"'. It is referenced by field '"+tostring(f)+"' expecting a different type: '"+field_type+"'."); + } + } + // SYNTHETIC: see above + // DEPRECATED: see above + ///////////////////////////////////////////////////////// + // method_info-structure-ATTRIBUTES (vmspec2 4.6, 4.7) // + ///////////////////////////////////////////////////////// + @Override public void visitCode(Code obj){//vmspec2 4.7.3 - try { - // No code attribute allowed for native or abstract methods: see visitMethod(Method). - // Code array constraints are checked in Pass3 (3a and 3b). - - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - - String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("Code")){ - throw new ClassConstraintException("The Code attribute '"+tostring(obj)+"' is not correctly named 'Code' but '"+name+"'."); - } - - Method m = null; // satisfy compiler - if (!(carrier.predecessor() instanceof Method)){ - addMessage("Code attribute '"+tostring(obj)+"' is not declared in a method_info structure but in '"+carrier.predecessor()+"'. Ignored."); - return; - } - else{ - m = (Method) carrier.predecessor(); // we can assume this method was visited before; - // i.e. the data consistency was verified. - } - - if (obj.getCode().length == 0){ - throw new ClassConstraintException("Code array of Code attribute '"+tostring(obj)+"' (method '"+m+"') must not be empty."); - } - - //In JustIce, the check for correct offsets into the code array is delayed to Pass 3a. - CodeException[] exc_table = obj.getExceptionTable(); - for (CodeException element : exc_table) { - int exc_index = element.getCatchType(); - if (exc_index != 0){ // if 0, it catches all Throwables - checkIndex(obj, exc_index, CONST_Class); - ConstantClass cc = (ConstantClass) (cp.getConstant(exc_index)); - checkIndex(cc, cc.getNameIndex(), CONST_Utf8); // cannot be sure this ConstantClass has already been visited (checked)! - String cname = ((ConstantUtf8) cp.getConstant(cc.getNameIndex())).getBytes().replace('/','.'); - - Verifier v = VerifierFactory.getVerifier(cname); - VerificationResult vr = v.doPass1(); - - if (vr != VerificationResult.VR_OK){ - throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but it does not pass verification pass 1: "+vr); - } - else{ - // We cannot safely trust any other "instanceof" mechanism. We need to transitively verify - // the ancestor hierarchy. - JavaClass e = Repository.lookupClass(cname); - JavaClass t = Repository.lookupClass(Type.THROWABLE.getClassName()); - JavaClass o = Repository.lookupClass(Type.OBJECT.getClassName()); - while (e != o){ - if (e == t) { + try { + // No code attribute allowed for native or abstract methods: see visitMethod(Method). + // Code array constraints are checked in Pass3 (3a and 3b). + + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); + if (! name.equals("Code")){ + throw new ClassConstraintException("The Code attribute '"+tostring(obj)+"' is not correctly named 'Code' but '"+name+"'."); + } + + Method m = null; // satisfy compiler + if (!(carrier.predecessor() instanceof Method)){ + addMessage("Code attribute '"+tostring(obj)+"' is not declared in a method_info structure but in '"+carrier.predecessor()+"'. Ignored."); + return; + } + else{ + m = (Method) carrier.predecessor(); // we can assume this method was visited before; + // i.e. the data consistency was verified. + } + + if (obj.getCode().length == 0){ + throw new ClassConstraintException("Code array of Code attribute '"+tostring(obj)+"' (method '"+m+"') must not be empty."); + } + + //In JustIce, the check for correct offsets into the code array is delayed to Pass 3a. + CodeException[] exc_table = obj.getExceptionTable(); + for (CodeException element : exc_table) { + int exc_index = element.getCatchType(); + if (exc_index != 0){ // if 0, it catches all Throwables + checkIndex(obj, exc_index, CONST_Class); + ConstantClass cc = (ConstantClass) (cp.getConstant(exc_index)); + checkIndex(cc, cc.getNameIndex(), CONST_Utf8); // cannot be sure this ConstantClass has already been visited (checked)! + String cname = ((ConstantUtf8) cp.getConstant(cc.getNameIndex())).getBytes().replace('/','.'); + + Verifier v = VerifierFactory.getVerifier(cname); + VerificationResult vr = v.doPass1(); + + if (vr != VerificationResult.VR_OK){ + throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but it does not pass verification pass 1: "+vr); + } + else{ + // We cannot safely trust any other "instanceof" mechanism. We need to transitively verify + // the ancestor hierarchy. + JavaClass e = Repository.lookupClass(cname); + JavaClass t = Repository.lookupClass(Type.THROWABLE.getClassName()); + JavaClass o = Repository.lookupClass(Type.OBJECT.getClassName()); + while (e != o){ + if (e == t) { break; // It's a subclass of Throwable, OKAY, leave. } - v = VerifierFactory.getVerifier(e.getSuperclassName()); - vr = v.doPass1(); - if (vr != VerificationResult.VR_OK){ - throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but '"+e.getSuperclassName()+"' in the ancestor hierachy does not pass verification pass 1: "+vr); - } - else{ - e = Repository.lookupClass(e.getSuperclassName()); - } - } - if (e != t) { + v = VerifierFactory.getVerifier(e.getSuperclassName()); + vr = v.doPass1(); + if (vr != VerificationResult.VR_OK){ + throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but '"+e.getSuperclassName()+"' in the ancestor hierachy does not pass verification pass 1: "+vr); + } + else{ + e = Repository.lookupClass(e.getSuperclassName()); + } + } + if (e != t) { throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); } - } - } - } - - // Create object for local variables information - // This is highly unelegant due to usage of the Visitor pattern. - // TODO: rework it. - int method_number = -1; - Method[] ms = Repository.lookupClass(myOwner.getClassName()).getMethods(); - for (int mn=0; mn= code.getMaxLocals()){ - throw new ClassConstraintException("LocalVariableTable attribute '"+tostring(lvt)+"' references a LocalVariable '"+tostring(localvariable)+"' with an index that exceeds the surrounding Code attribute's max_locals value of '"+code.getMaxLocals()+"'."); - } - - try{ - localVariablesInfos[method_number].add(localindex, localname, localvariable.getStartPC(), localvariable.getLength(), t); - } - catch(LocalVariableInfoInconsistentException lviie){ - throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+"' found in Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"'). "+lviie.getMessage(), lviie); - } - }// for all local variables localvariables[i] in the LocalVariableTable attribute atts[a] END - - num_of_lvt_attribs++; - if (!m.isStatic() && num_of_lvt_attribs > obj.getMaxLocals()){ - throw new ClassConstraintException("Number of LocalVariableTable attributes of Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"') exceeds number of local variable slots '"+obj.getMaxLocals()+"' ('There may be no more than one LocalVariableTable attribute per local variable in the Code attribute.')."); - } - }// if atts[a] instanceof LocalVariableTable END - }// for all attributes atts[a] END - - } catch (ClassNotFoundException e) { - // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e, e); - } - - }// visitCode(Code) END - - @Override + } + } + } + + // Create object for local variables information + // This is highly unelegant due to usage of the Visitor pattern. + // TODO: rework it. + int method_number = -1; + Method[] ms = Repository.lookupClass(myOwner.getClassName()).getMethods(); + for (int mn=0; mn= code.getMaxLocals()){ + throw new ClassConstraintException("LocalVariableTable attribute '"+tostring(lvt)+"' references a LocalVariable '"+tostring(localvariable)+"' with an index that exceeds the surrounding Code attribute's max_locals value of '"+code.getMaxLocals()+"'."); + } + + try{ + localVariablesInfos[method_number].add(localindex, localname, localvariable.getStartPC(), localvariable.getLength(), t); + } + catch(LocalVariableInfoInconsistentException lviie){ + throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+"' found in Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"'). "+lviie.getMessage(), lviie); + } + }// for all local variables localvariables[i] in the LocalVariableTable attribute atts[a] END + + num_of_lvt_attribs++; + if (!m.isStatic() && num_of_lvt_attribs > obj.getMaxLocals()){ + throw new ClassConstraintException("Number of LocalVariableTable attributes of Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"') exceeds number of local variable slots '"+obj.getMaxLocals()+"' ('There may be no more than one LocalVariableTable attribute per local variable in the Code attribute.')."); + } + }// if atts[a] instanceof LocalVariableTable END + }// for all attributes atts[a] END + + } catch (ClassNotFoundException e) { + // FIXME: this might not be the best way to handle missing classes. + throw new AssertionViolatedException("Missing class: " + e, e); + } + + }// visitCode(Code) END + + @Override public void visitExceptionTable(ExceptionTable obj){//vmspec2 4.7.4 - try { - // incorrectly named, it's the Exceptions attribute (vmspec2 4.7.4) - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - - String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("Exceptions")){ - throw new ClassConstraintException("The Exceptions attribute '"+tostring(obj)+"' is not correctly named 'Exceptions' but '"+name+"'."); - } - - int[] exc_indices = obj.getExceptionIndexTable(); - - for (int exc_indice : exc_indices) { - checkIndex(obj, exc_indice, CONST_Class); - - ConstantClass cc = (ConstantClass) (cp.getConstant(exc_indice)); - checkIndex(cc, cc.getNameIndex(), CONST_Utf8); // cannot be sure this ConstantClass has already been visited (checked)! - String cname = ((ConstantUtf8) cp.getConstant(cc.getNameIndex())).getBytes().replace('/','.'); //convert internal notation on-the-fly to external notation - - Verifier v = VerifierFactory.getVerifier(cname); - VerificationResult vr = v.doPass1(); - - if (vr != VerificationResult.VR_OK){ - throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but it does not pass verification pass 1: "+vr); - } - else{ - // We cannot safely trust any other "instanceof" mechanism. We need to transitively verify - // the ancestor hierarchy. - JavaClass e = Repository.lookupClass(cname); - JavaClass t = Repository.lookupClass(Type.THROWABLE.getClassName()); - JavaClass o = Repository.lookupClass(Type.OBJECT.getClassName()); - while (e != o){ - if (e == t) { + try { + // incorrectly named, it's the Exceptions attribute (vmspec2 4.7.4) + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); + if (! name.equals("Exceptions")){ + throw new ClassConstraintException("The Exceptions attribute '"+tostring(obj)+"' is not correctly named 'Exceptions' but '"+name+"'."); + } + + int[] exc_indices = obj.getExceptionIndexTable(); + + for (int exc_indice : exc_indices) { + checkIndex(obj, exc_indice, CONST_Class); + + ConstantClass cc = (ConstantClass) (cp.getConstant(exc_indice)); + checkIndex(cc, cc.getNameIndex(), CONST_Utf8); // cannot be sure this ConstantClass has already been visited (checked)! + String cname = ((ConstantUtf8) cp.getConstant(cc.getNameIndex())).getBytes().replace('/','.'); //convert internal notation on-the-fly to external notation + + Verifier v = VerifierFactory.getVerifier(cname); + VerificationResult vr = v.doPass1(); + + if (vr != VerificationResult.VR_OK){ + throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but it does not pass verification pass 1: "+vr); + } + else{ + // We cannot safely trust any other "instanceof" mechanism. We need to transitively verify + // the ancestor hierarchy. + JavaClass e = Repository.lookupClass(cname); + JavaClass t = Repository.lookupClass(Type.THROWABLE.getClassName()); + JavaClass o = Repository.lookupClass(Type.OBJECT.getClassName()); + while (e != o){ + if (e == t) { break; // It's a subclass of Throwable, OKAY, leave. } - v = VerifierFactory.getVerifier(e.getSuperclassName()); - vr = v.doPass1(); - if (vr != VerificationResult.VR_OK){ - throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but '"+e.getSuperclassName()+"' in the ancestor hierachy does not pass verification pass 1: "+vr); - } - else{ - e = Repository.lookupClass(e.getSuperclassName()); - } - } - if (e != t) { + v = VerifierFactory.getVerifier(e.getSuperclassName()); + vr = v.doPass1(); + if (vr != VerificationResult.VR_OK){ + throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but '"+e.getSuperclassName()+"' in the ancestor hierachy does not pass verification pass 1: "+vr); + } + else{ + e = Repository.lookupClass(e.getSuperclassName()); + } + } + if (e != t) { throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); } - } - } - - } catch (ClassNotFoundException e) { - // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - // SYNTHETIC: see above - // DEPRECATED: see above - ////////////////////////////////////////////////////////////// - // code_attribute-structure-ATTRIBUTES (vmspec2 4.7.3, 4.7) // - ////////////////////////////////////////////////////////////// - @Override + } + } + + } catch (ClassNotFoundException e) { + // FIXME: this might not be the best way to handle missing classes. + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + // SYNTHETIC: see above + // DEPRECATED: see above + ////////////////////////////////////////////////////////////// + // code_attribute-structure-ATTRIBUTES (vmspec2 4.7.3, 4.7) // + ////////////////////////////////////////////////////////////// + @Override public void visitLineNumberTable(LineNumberTable obj){//vmspec2 4.7.8 - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("LineNumberTable")){ - throw new ClassConstraintException("The LineNumberTable attribute '"+tostring(obj)+"' is not correctly named 'LineNumberTable' but '"+name+"'."); - } + String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); + if (! name.equals("LineNumberTable")){ + throw new ClassConstraintException("The LineNumberTable attribute '"+tostring(obj)+"' is not correctly named 'LineNumberTable' but '"+name+"'."); + } - //In JustIce,this check is delayed to Pass 3a. - //LineNumber[] linenumbers = obj.getLineNumberTable(); - // ...validity check... + //In JustIce,this check is delayed to Pass 3a. + //LineNumber[] linenumbers = obj.getLineNumberTable(); + // ...validity check... - } - @Override + } + @Override public void visitLocalVariableTable(LocalVariableTable obj){//vmspec2 4.7.9 - //In JustIce,this check is partially delayed to Pass 3a. - //The other part can be found in the visitCode(Code) method. - } - //////////////////////////////////////////////////// - // MISC-structure-ATTRIBUTES (vmspec2 4.7.1, 4.7) // - //////////////////////////////////////////////////// - @Override + //In JustIce,this check is partially delayed to Pass 3a. + //The other part can be found in the visitCode(Code) method. + } + //////////////////////////////////////////////////// + // MISC-structure-ATTRIBUTES (vmspec2 4.7.1, 4.7) // + //////////////////////////////////////////////////// + @Override public void visitUnknown(Unknown obj){//vmspec2 4.7.1 - // Represents an unknown attribute. - checkIndex(obj, obj.getNameIndex(), CONST_Utf8); - - // Maybe only misnamed? Give a (warning) message. - addMessage("Unknown attribute '"+tostring(obj)+"'. This attribute is not known in any context!"); - } - ////////// - // BCEL // - ////////// - @Override + // Represents an unknown attribute. + checkIndex(obj, obj.getNameIndex(), CONST_Utf8); + + // Maybe only misnamed? Give a (warning) message. + addMessage("Unknown attribute '"+tostring(obj)+"'. This attribute is not known in any context!"); + } + ////////// + // BCEL // + ////////// + @Override public void visitLocalVariable(LocalVariable obj){ - // This does not represent an Attribute but is only - // related to internal BCEL data representation. + // This does not represent an Attribute but is only + // related to internal BCEL data representation. - // see visitLocalVariableTable(LocalVariableTable) - } - @Override + // see visitLocalVariableTable(LocalVariableTable) + } + @Override public void visitCodeException(CodeException obj){ - // Code constraints are checked in Pass3 (3a and 3b). - // This does not represent an Attribute but is only - // related to internal BCEL data representation. + // Code constraints are checked in Pass3 (3a and 3b). + // This does not represent an Attribute but is only + // related to internal BCEL data representation. - // see visitCode(Code) - } - @Override + // see visitCode(Code) + } + @Override public void visitConstantPool(ConstantPool obj){ - // No need to. We're piggybacked by the DescendingVisitor. - // This does not represent an Attribute but is only - // related to internal BCEL data representation. - } - @Override + // No need to. We're piggybacked by the DescendingVisitor. + // This does not represent an Attribute but is only + // related to internal BCEL data representation. + } + @Override public void visitInnerClass(InnerClass obj){ - // This does not represent an Attribute but is only - // related to internal BCEL data representation. - } - @Override + // This does not represent an Attribute but is only + // related to internal BCEL data representation. + } + @Override public void visitLineNumber(LineNumber obj){ - // This does not represent an Attribute but is only - // related to internal BCEL data representation. - - // see visitLineNumberTable(LineNumberTable) - } - } - - /** - * Ensures that the ConstantCP-subclassed entries of the constant - * pool are valid. According to "Yellin: Low Level Security in Java", - * this method does not verify the existence of referenced entities - * (such as classes) but only the formal correctness (such as well-formed - * signatures). + // This does not represent an Attribute but is only + // related to internal BCEL data representation. + + // see visitLineNumberTable(LineNumberTable) + } + } + + /** + * Ensures that the ConstantCP-subclassed entries of the constant + * pool are valid. According to "Yellin: Low Level Security in Java", + * this method does not verify the existence of referenced entities + * (such as classes) but only the formal correctness (such as well-formed + * signatures). * The visitXXX() methods throw ClassConstraintException instances otherwise. - * Precondition: index-style cross referencing in the constant - * pool must be valid. Simply invoke constant_pool_entries_satisfy_static_constraints() - * before. - * - * @throws ClassConstraintException otherwise. - * @see #constant_pool_entries_satisfy_static_constraints() - */ - private void field_and_method_refs_are_valid(){ - try { - JavaClass jc = Repository.lookupClass(myOwner.getClassName()); - DescendingVisitor v = new DescendingVisitor(jc, new FAMRAV_Visitor(jc)); - v.visit(); - - } catch (ClassNotFoundException e) { - // FIXME: this might not be the best way to handle missing classes. - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * A Visitor class that ensures the ConstantCP-subclassed entries - * of the constant pool are valid. + * Precondition: index-style cross referencing in the constant + * pool must be valid. Simply invoke constant_pool_entries_satisfy_static_constraints() + * before. + * + * @throws ClassConstraintException otherwise. + * @see #constant_pool_entries_satisfy_static_constraints() + */ + private void field_and_method_refs_are_valid(){ + try { + JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + DescendingVisitor v = new DescendingVisitor(jc, new FAMRAV_Visitor(jc)); + v.visit(); + + } catch (ClassNotFoundException e) { + // FIXME: this might not be the best way to handle missing classes. + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * A Visitor class that ensures the ConstantCP-subclassed entries + * of the constant pool are valid. * Precondition: index-style cross referencing in the constant * pool must be valid. - * + * * @see #constant_pool_entries_satisfy_static_constraints() - * @see org.apache.bcel.classfile.ConstantCP - */ - private class FAMRAV_Visitor extends EmptyVisitor{ - private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work. - private FAMRAV_Visitor(JavaClass _jc){ - cp = _jc.getConstantPool(); - } - - @Override + * @see org.apache.bcel.classfile.ConstantCP + */ + private class FAMRAV_Visitor extends EmptyVisitor{ + private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work. + private FAMRAV_Visitor(JavaClass _jc){ + cp = _jc.getConstantPool(); + } + + @Override public void visitConstantFieldref(ConstantFieldref obj){ - if (obj.getTag() != Constants.CONSTANT_Fieldref){ - throw new ClassConstraintException("ConstantFieldref '"+tostring(obj)+"' has wrong tag!"); - } - int name_and_type_index = obj.getNameAndTypeIndex(); - ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); - String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name - if (!validFieldName(name)){ - throw new ClassConstraintException("Invalid field name '"+name+"' referenced by '"+tostring(obj)+"'."); - } - - int class_index = obj.getClassIndex(); - ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); - String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form - if (! validClassName(className)){ - throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); - } - - String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) - - try{ - Type.getType(sig); /* Don't need the return value */ - } - catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); - } - } - - @Override + if (obj.getTag() != Constants.CONSTANT_Fieldref){ + throw new ClassConstraintException("ConstantFieldref '"+tostring(obj)+"' has wrong tag!"); + } + int name_and_type_index = obj.getNameAndTypeIndex(); + ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); + String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name + if (!validFieldName(name)){ + throw new ClassConstraintException("Invalid field name '"+name+"' referenced by '"+tostring(obj)+"'."); + } + + int class_index = obj.getClassIndex(); + ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); + String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form + if (! validClassName(className)){ + throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); + } + + String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + + try{ + Type.getType(sig); /* Don't need the return value */ + } + catch (ClassFormatException cfe){ + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); + } + } + + @Override public void visitConstantMethodref(ConstantMethodref obj){ - if (obj.getTag() != Constants.CONSTANT_Methodref){ - throw new ClassConstraintException("ConstantMethodref '"+tostring(obj)+"' has wrong tag!"); - } - int name_and_type_index = obj.getNameAndTypeIndex(); - ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); - String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name - if (!validClassMethodName(name)){ - throw new ClassConstraintException("Invalid (non-interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); - } - - int class_index = obj.getClassIndex(); - ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); - String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form - if (! validClassName(className)){ - throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); - } - - String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) - - try{ - Type t = Type.getReturnType(sig); - if ( name.equals(CONSTRUCTOR_NAME) && (t != Type.VOID) ){ - throw new ClassConstraintException("Instance initialization method must have VOID return type."); - } - } - catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); - } - } - - @Override + if (obj.getTag() != Constants.CONSTANT_Methodref){ + throw new ClassConstraintException("ConstantMethodref '"+tostring(obj)+"' has wrong tag!"); + } + int name_and_type_index = obj.getNameAndTypeIndex(); + ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); + String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name + if (!validClassMethodName(name)){ + throw new ClassConstraintException("Invalid (non-interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); + } + + int class_index = obj.getClassIndex(); + ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); + String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form + if (! validClassName(className)){ + throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); + } + + String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + + try{ + Type t = Type.getReturnType(sig); + if ( name.equals(CONSTRUCTOR_NAME) && (t != Type.VOID) ){ + throw new ClassConstraintException("Instance initialization method must have VOID return type."); + } + } + catch (ClassFormatException cfe){ + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); + } + } + + @Override public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ - if (obj.getTag() != Constants.CONSTANT_InterfaceMethodref){ - throw new ClassConstraintException("ConstantInterfaceMethodref '"+tostring(obj)+"' has wrong tag!"); - } - int name_and_type_index = obj.getNameAndTypeIndex(); - ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); - String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name - if (!validInterfaceMethodName(name)){ - throw new ClassConstraintException("Invalid (interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); - } - - int class_index = obj.getClassIndex(); - ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); - String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form - if (! validClassName(className)){ - throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); - } - - String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) - - try{ - Type t = Type.getReturnType(sig); - if ( name.equals(STATIC_INITIALIZER_NAME) && (t != Type.VOID) ){ - addMessage("Class or interface initialization method '"+STATIC_INITIALIZER_NAME+"' usually has VOID return type instead of '"+t+"'. Note this is really not a requirement of The Java Virtual Machine Specification, Second Edition."); - } - } - catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); - } - - } - - } - - /** - * This method returns true if and only if the supplied String - * represents a valid Java class name. - */ - private static boolean validClassName(String name){ + if (obj.getTag() != Constants.CONSTANT_InterfaceMethodref){ + throw new ClassConstraintException("ConstantInterfaceMethodref '"+tostring(obj)+"' has wrong tag!"); + } + int name_and_type_index = obj.getNameAndTypeIndex(); + ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); + String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name + if (!validInterfaceMethodName(name)){ + throw new ClassConstraintException("Invalid (interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); + } + + int class_index = obj.getClassIndex(); + ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); + String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form + if (! validClassName(className)){ + throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); + } + + String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + + try{ + Type t = Type.getReturnType(sig); + if ( name.equals(STATIC_INITIALIZER_NAME) && (t != Type.VOID) ){ + addMessage("Class or interface initialization method '"+STATIC_INITIALIZER_NAME+"' usually has VOID return type instead of '"+t+"'. Note this is really not a requirement of The Java Virtual Machine Specification, Second Edition."); + } + } + catch (ClassFormatException cfe){ + throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); + } + + } + + } + + /** + * This method returns true if and only if the supplied String + * represents a valid Java class name. + */ + private static boolean validClassName(String name){ /* * TODO: implement. - * Are there any restrictions? + * Are there any restrictions? */ - return true; - } - /** - * This method returns true if and only if the supplied String - * represents a valid method name. - * This is basically the same as a valid identifier name in the - * Java programming language, but the special name for - * the instance initialization method is allowed and the special name - * for the class/interface initialization method may be allowed. - */ - private static boolean validMethodName(String name, boolean allowStaticInit){ - if (validJavaLangMethodName(name)) { + return true; + } + /** + * This method returns true if and only if the supplied String + * represents a valid method name. + * This is basically the same as a valid identifier name in the + * Java programming language, but the special name for + * the instance initialization method is allowed and the special name + * for the class/interface initialization method may be allowed. + */ + private static boolean validMethodName(String name, boolean allowStaticInit){ + if (validJavaLangMethodName(name)) { return true; } - - if (allowStaticInit){ - return (name.equals(CONSTRUCTOR_NAME) || name.equals(STATIC_INITIALIZER_NAME)); - } - else{ - return name.equals(CONSTRUCTOR_NAME); - } - } - - /** - * This method returns true if and only if the supplied String - * represents a valid method name that may be referenced by - * ConstantMethodref objects. - */ - private static boolean validClassMethodName(String name){ - return validMethodName(name, false); - } - - /** - * This method returns true if and only if the supplied String - * represents a valid Java programming language method name stored as a simple - * (non-qualified) name. - * Conforming to: The Java Virtual Machine Specification, Second Edition, �2.7, �2.7.1, �2.2. - */ - private static boolean validJavaLangMethodName(String name){ - if (!Character.isJavaIdentifierStart(name.charAt(0))) { + + if (allowStaticInit){ + return (name.equals(CONSTRUCTOR_NAME) || name.equals(STATIC_INITIALIZER_NAME)); + } + else{ + return name.equals(CONSTRUCTOR_NAME); + } + } + + /** + * This method returns true if and only if the supplied String + * represents a valid method name that may be referenced by + * ConstantMethodref objects. + */ + private static boolean validClassMethodName(String name){ + return validMethodName(name, false); + } + + /** + * This method returns true if and only if the supplied String + * represents a valid Java programming language method name stored as a simple + * (non-qualified) name. + * Conforming to: The Java Virtual Machine Specification, Second Edition, �2.7, �2.7.1, �2.2. + */ + private static boolean validJavaLangMethodName(String name){ + if (!Character.isJavaIdentifierStart(name.charAt(0))) { return false; } - - for (int i=1; i, thanks! } - // vmspec2 2.7, vmspec2 2.2 - if (!Character.isJavaIdentifierStart(name.charAt(0))) { + // vmspec2 2.7, vmspec2 2.2 + if (!Character.isJavaIdentifierStart(name.charAt(0))) { return false; } - - for (int i=1; i= methods.length){ - throw new InvalidMethodException("METHOD DOES NOT EXIST!"); - } - Method method = methods[method_no]; - code = method.getCode(); - - // No Code? Nothing to verify! - if ( method.isAbstract() || method.isNative() ){ // IF mg HAS NO CODE (static constraint of Pass 2) - return VerificationResult.VR_OK; - } - - // TODO: - // We want a very sophisticated code examination here with good explanations - // on where to look for an illegal instruction or such. - // Only after that we should try to build an InstructionList and throw an - // AssertionViolatedException if after our examination InstructionList building - // still fails. - // That examination should be implemented in a byte-oriented way, i.e. look for - // an instruction, make sure its validity, count its length, find the next - // instruction and so on. - try{ - instructionList = new InstructionList(method.getCode().getCode()); - } - catch(RuntimeException re){ - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Bad bytecode in the code array of the Code attribute of method '"+method+"'."); - } - - instructionList.setPositions(true); - - // Start verification. - VerificationResult vr = VerificationResult.VR_OK; //default - try{ - delayedPass2Checks(); - } - catch(ClassConstraintException cce){ - vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); - return vr; - } - try{ - pass3StaticInstructionChecks(); - pass3StaticInstructionOperandsChecks(); - } - catch(StaticCodeConstraintException scce){ - vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, scce.getMessage()); - } - catch(ClassCastException cce){ - vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Class Cast Exception: " + cce.getMessage()); - } - return vr; - } - else{ //did not pass Pass 2. - return VerificationResult.VR_NOTYET; - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * These are the checks that could be done in pass 2 but are delayed to pass 3 - * for performance reasons. Also, these checks need access to the code array - * of the Code attribute of a Method so it's okay to perform them here. - * Also see the description of the do_verify() method. - * - * @throws ClassConstraintException if the verification fails. - * @see #do_verify() - */ - private void delayedPass2Checks(){ - - int[] instructionPositions = instructionList.getInstructionPositions(); - int codeLength = code.getCode().length; - - ///////////////////// - // LineNumberTable // - ///////////////////// - LineNumberTable lnt = code.getLineNumberTable(); - if (lnt != null){ - LineNumber[] lineNumbers = lnt.getLineNumberTable(); - IntList offsets = new IntList(); - lineNumber_loop: + try { + if (myOwner.doPass2().equals(VerificationResult.VR_OK)){ + // Okay, class file was loaded correctly by Pass 1 + // and satisfies static constraints of Pass 2. + JavaClass jc = Repository.lookupClass(myOwner.getClassName()); + Method[] methods = jc.getMethods(); + if (method_no >= methods.length){ + throw new InvalidMethodException("METHOD DOES NOT EXIST!"); + } + Method method = methods[method_no]; + code = method.getCode(); + + // No Code? Nothing to verify! + if ( method.isAbstract() || method.isNative() ){ // IF mg HAS NO CODE (static constraint of Pass 2) + return VerificationResult.VR_OK; + } + + // TODO: + // We want a very sophisticated code examination here with good explanations + // on where to look for an illegal instruction or such. + // Only after that we should try to build an InstructionList and throw an + // AssertionViolatedException if after our examination InstructionList building + // still fails. + // That examination should be implemented in a byte-oriented way, i.e. look for + // an instruction, make sure its validity, count its length, find the next + // instruction and so on. + try{ + instructionList = new InstructionList(method.getCode().getCode()); + } + catch(RuntimeException re){ + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Bad bytecode in the code array of the Code attribute of method '"+method+"'."); + } + + instructionList.setPositions(true); + + // Start verification. + VerificationResult vr = VerificationResult.VR_OK; //default + try{ + delayedPass2Checks(); + } + catch(ClassConstraintException cce){ + vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); + return vr; + } + try{ + pass3StaticInstructionChecks(); + pass3StaticInstructionOperandsChecks(); + } + catch(StaticCodeConstraintException scce){ + vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, scce.getMessage()); + } + catch(ClassCastException cce){ + vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Class Cast Exception: " + cce.getMessage()); + } + return vr; + } + else{ //did not pass Pass 2. + return VerificationResult.VR_NOTYET; + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * These are the checks that could be done in pass 2 but are delayed to pass 3 + * for performance reasons. Also, these checks need access to the code array + * of the Code attribute of a Method so it's okay to perform them here. + * Also see the description of the do_verify() method. + * + * @throws ClassConstraintException if the verification fails. + * @see #do_verify() + */ + private void delayedPass2Checks(){ + + int[] instructionPositions = instructionList.getInstructionPositions(); + int codeLength = code.getCode().length; + + ///////////////////// + // LineNumberTable // + ///////////////////// + LineNumberTable lnt = code.getLineNumberTable(); + if (lnt != null){ + LineNumber[] lineNumbers = lnt.getLineNumberTable(); + IntList offsets = new IntList(); + lineNumber_loop: for (LineNumber lineNumber : lineNumbers) { // may appear in any order. for (int instructionPosition : instructionPositions) { // TODO: Make this a binary search! The instructionPositions array is naturally ordered! @@ -253,326 +253,326 @@ public final class Pass3aVerifier extends PassVerifier{ } throw new ClassConstraintException("Code attribute '" + code + "' has a LineNumberTable attribute '" + code.getLineNumberTable() + "' referring to a code offset ('" + lineNumber.getStartPC() + "') that does not exist."); } - } - - /////////////////////////// - // LocalVariableTable(s) // - /////////////////////////// - /* We cannot use code.getLocalVariableTable() because there could be more - than only one. This is a bug in BCEL. */ - Attribute[] atts = code.getAttributes(); - for (Attribute att : atts) { - if (att instanceof LocalVariableTable){ - LocalVariableTable lvt = (LocalVariableTable) att; - if (lvt != null){ - LocalVariable[] localVariables = lvt.getLocalVariableTable(); - for (LocalVariable localVariable : localVariables) { - int startpc = localVariable.getStartPC(); - int length = localVariable.getLength(); - - if (!contains(instructionPositions, startpc)){ - throw new ClassConstraintException("Code attribute '"+code+"' has a LocalVariableTable attribute '"+code.getLocalVariableTable()+"' referring to a code offset ('"+startpc+"') that does not exist."); - } - if ( (!contains(instructionPositions, startpc+length)) && (startpc+length != codeLength) ){ - throw new ClassConstraintException("Code attribute '"+code+"' has a LocalVariableTable attribute '"+code.getLocalVariableTable()+"' referring to a code offset start_pc+length ('"+(startpc+length)+"') that does not exist."); - } - } - } - } - } - - //////////////////// - // ExceptionTable // - //////////////////// - // In BCEL's "classfile" API, the startPC/endPC-notation is - // inclusive/exclusive as in the Java Virtual Machine Specification. - // WARNING: This is not true for BCEL's "generic" API. - CodeException[] exceptionTable = code.getExceptionTable(); - for (CodeException element : exceptionTable) { - int startpc = element.getStartPC(); - int endpc = element.getEndPC(); - int handlerpc = element.getHandlerPC(); - if (startpc >= endpc){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has its start_pc ('"+startpc+"') not smaller than its end_pc ('"+endpc+"')."); - } - if (!contains(instructionPositions, startpc)){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has a non-existant bytecode offset as its start_pc ('"+startpc+"')."); - } - if ( (!contains(instructionPositions, endpc)) && (endpc != codeLength)){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has a non-existant bytecode offset as its end_pc ('"+startpc+"') [that is also not equal to code_length ('"+codeLength+"')]."); - } - if (!contains(instructionPositions, handlerpc)){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has a non-existant bytecode offset as its handler_pc ('"+handlerpc+"')."); - } - } - } - - /** - * These are the checks if constraints are satisfied which are described in the - * Java Virtual Machine Specification, Second Edition as Static Constraints on - * the instructions of Java Virtual Machine Code (chapter 4.8.1). - * - * @throws StaticCodeConstraintException if the verification fails. - */ - private void pass3StaticInstructionChecks(){ - - // Code array must not be empty: - // Enforced in pass 2 (also stated in the static constraints of the Code - // array in vmspec2), together with pass 1 (reading code_length bytes and - // interpreting them as code[]). So this must not be checked again here. - - if (! (code.getCode().length < 65536)){// contradicts vmspec2 page 152 ("Limitations"), but is on page 134. - throw new StaticCodeInstructionConstraintException("Code array in code attribute '"+code+"' too big: must be smaller than 65536 bytes."); - } - - // First opcode at offset 0: okay, that's clear. Nothing to do. - - // Only instances of the instructions documented in Section 6.4 may appear in - // the code array. - - // For BCEL's sake, we cannot handle WIDE stuff, but hopefully BCEL does its job right :) - - // The last byte of the last instruction in the code array must be the byte at index - // code_length-1 : See the do_verify() comments. We actually don't iterate through the - // byte array, but use an InstructionList so we cannot check for this. But BCEL does - // things right, so it's implicitly okay. - - // TODO: Check how BCEL handles (and will handle) instructions like IMPDEP1, IMPDEP2, - // BREAKPOINT... that BCEL knows about but which are illegal anyway. - // We currently go the safe way here. - InstructionHandle ih = instructionList.getStart(); - while (ih != null){ - Instruction i = ih.getInstruction(); - if (i instanceof IMPDEP1){ - throw new StaticCodeInstructionConstraintException("IMPDEP1 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); - } - if (i instanceof IMPDEP2){ - throw new StaticCodeInstructionConstraintException("IMPDEP2 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); - } - if (i instanceof BREAKPOINT){ - throw new StaticCodeInstructionConstraintException("BREAKPOINT must not be in the code, it is an illegal instruction for _internal_ JVM use!"); - } - ih = ih.getNext(); - } - - // The original verifier seems to do this check here, too. - // An unreachable last instruction may also not fall through the - // end of the code, which is stupid -- but with the original - // verifier's subroutine semantics one cannot predict reachability. - Instruction last = instructionList.getEnd().getInstruction(); - if (! ((last instanceof ReturnInstruction) || - (last instanceof RET) || - (last instanceof GotoInstruction) || - (last instanceof ATHROW) )) { + } + + /////////////////////////// + // LocalVariableTable(s) // + /////////////////////////// + /* We cannot use code.getLocalVariableTable() because there could be more + than only one. This is a bug in BCEL. */ + Attribute[] atts = code.getAttributes(); + for (Attribute att : atts) { + if (att instanceof LocalVariableTable){ + LocalVariableTable lvt = (LocalVariableTable) att; + if (lvt != null){ + LocalVariable[] localVariables = lvt.getLocalVariableTable(); + for (LocalVariable localVariable : localVariables) { + int startpc = localVariable.getStartPC(); + int length = localVariable.getLength(); + + if (!contains(instructionPositions, startpc)){ + throw new ClassConstraintException("Code attribute '"+code+"' has a LocalVariableTable attribute '"+code.getLocalVariableTable()+"' referring to a code offset ('"+startpc+"') that does not exist."); + } + if ( (!contains(instructionPositions, startpc+length)) && (startpc+length != codeLength) ){ + throw new ClassConstraintException("Code attribute '"+code+"' has a LocalVariableTable attribute '"+code.getLocalVariableTable()+"' referring to a code offset start_pc+length ('"+(startpc+length)+"') that does not exist."); + } + } + } + } + } + + //////////////////// + // ExceptionTable // + //////////////////// + // In BCEL's "classfile" API, the startPC/endPC-notation is + // inclusive/exclusive as in the Java Virtual Machine Specification. + // WARNING: This is not true for BCEL's "generic" API. + CodeException[] exceptionTable = code.getExceptionTable(); + for (CodeException element : exceptionTable) { + int startpc = element.getStartPC(); + int endpc = element.getEndPC(); + int handlerpc = element.getHandlerPC(); + if (startpc >= endpc){ + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has its start_pc ('"+startpc+"') not smaller than its end_pc ('"+endpc+"')."); + } + if (!contains(instructionPositions, startpc)){ + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has a non-existant bytecode offset as its start_pc ('"+startpc+"')."); + } + if ( (!contains(instructionPositions, endpc)) && (endpc != codeLength)){ + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has a non-existant bytecode offset as its end_pc ('"+startpc+"') [that is also not equal to code_length ('"+codeLength+"')]."); + } + if (!contains(instructionPositions, handlerpc)){ + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has a non-existant bytecode offset as its handler_pc ('"+handlerpc+"')."); + } + } + } + + /** + * These are the checks if constraints are satisfied which are described in the + * Java Virtual Machine Specification, Second Edition as Static Constraints on + * the instructions of Java Virtual Machine Code (chapter 4.8.1). + * + * @throws StaticCodeConstraintException if the verification fails. + */ + private void pass3StaticInstructionChecks(){ + + // Code array must not be empty: + // Enforced in pass 2 (also stated in the static constraints of the Code + // array in vmspec2), together with pass 1 (reading code_length bytes and + // interpreting them as code[]). So this must not be checked again here. + + if (! (code.getCode().length < 65536)){// contradicts vmspec2 page 152 ("Limitations"), but is on page 134. + throw new StaticCodeInstructionConstraintException("Code array in code attribute '"+code+"' too big: must be smaller than 65536 bytes."); + } + + // First opcode at offset 0: okay, that's clear. Nothing to do. + + // Only instances of the instructions documented in Section 6.4 may appear in + // the code array. + + // For BCEL's sake, we cannot handle WIDE stuff, but hopefully BCEL does its job right :) + + // The last byte of the last instruction in the code array must be the byte at index + // code_length-1 : See the do_verify() comments. We actually don't iterate through the + // byte array, but use an InstructionList so we cannot check for this. But BCEL does + // things right, so it's implicitly okay. + + // TODO: Check how BCEL handles (and will handle) instructions like IMPDEP1, IMPDEP2, + // BREAKPOINT... that BCEL knows about but which are illegal anyway. + // We currently go the safe way here. + InstructionHandle ih = instructionList.getStart(); + while (ih != null){ + Instruction i = ih.getInstruction(); + if (i instanceof IMPDEP1){ + throw new StaticCodeInstructionConstraintException("IMPDEP1 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); + } + if (i instanceof IMPDEP2){ + throw new StaticCodeInstructionConstraintException("IMPDEP2 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); + } + if (i instanceof BREAKPOINT){ + throw new StaticCodeInstructionConstraintException("BREAKPOINT must not be in the code, it is an illegal instruction for _internal_ JVM use!"); + } + ih = ih.getNext(); + } + + // The original verifier seems to do this check here, too. + // An unreachable last instruction may also not fall through the + // end of the code, which is stupid -- but with the original + // verifier's subroutine semantics one cannot predict reachability. + Instruction last = instructionList.getEnd().getInstruction(); + if (! ((last instanceof ReturnInstruction) || + (last instanceof RET) || + (last instanceof GotoInstruction) || + (last instanceof ATHROW) )) { throw new StaticCodeInstructionConstraintException("Execution must not fall off the bottom of the code array. This constraint is enforced statically as some existing verifiers do - so it may be a false alarm if the last instruction is not reachable."); } - } - - /** - * These are the checks for the satisfaction of constraints which are described in the - * Java Virtual Machine Specification, Second Edition as Static Constraints on - * the operands of instructions of Java Virtual Machine Code (chapter 4.8.1). - * BCEL parses the code array to create an InstructionList and therefore has to check - * some of these constraints. Additional checks are also implemented here. - * - * @throws StaticCodeConstraintException if the verification fails. - */ - private void pass3StaticInstructionOperandsChecks(){ - try { - // When building up the InstructionList, BCEL has already done all those checks - // mentioned in The Java Virtual Machine Specification, Second Edition, as - // "static constraints on the operands of instructions in the code array". - // TODO: see the do_verify() comments. Maybe we should really work on the - // byte array first to give more comprehensive messages. - // TODO: Review Exception API, possibly build in some "offending instruction" thing - // when we're ready to insulate the offending instruction by doing the - // above thing. - - // TODO: Implement as much as possible here. BCEL does _not_ check everything. - - ConstantPoolGen cpg = new ConstantPoolGen(Repository.lookupClass(myOwner.getClassName()).getConstantPool()); - InstOperandConstraintVisitor v = new InstOperandConstraintVisitor(cpg); - - // Checks for the things BCEL does _not_ handle itself. - InstructionHandle ih = instructionList.getStart(); - while (ih != null){ - Instruction i = ih.getInstruction(); - - // An "own" constraint, due to JustIce's new definition of what "subroutine" means. - if (i instanceof JsrInstruction){ - InstructionHandle target = ((JsrInstruction) i).getTarget(); - if (target == instructionList.getStart()){ - throw new StaticCodeInstructionOperandConstraintException("Due to JustIce's clear definition of subroutines, no JSR or JSR_W may have a top-level instruction (such as the very first instruction, which is targeted by instruction '"+ih+"' as its target."); - } - if (!(target.getInstruction() instanceof ASTORE)){ - throw new StaticCodeInstructionOperandConstraintException("Due to JustIce's clear definition of subroutines, no JSR or JSR_W may target anything else than an ASTORE instruction. Instruction '"+ih+"' targets '"+target+"'."); - } - } - - // vmspec2, page 134-137 - ih.accept(v); - - ih = ih.getNext(); - } - - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** A small utility method returning if a given int i is in the given int[] ints. */ - private static boolean contains(int[] ints, int i){ - for (int k : ints) { - if (k==i) { + } + + /** + * These are the checks for the satisfaction of constraints which are described in the + * Java Virtual Machine Specification, Second Edition as Static Constraints on + * the operands of instructions of Java Virtual Machine Code (chapter 4.8.1). + * BCEL parses the code array to create an InstructionList and therefore has to check + * some of these constraints. Additional checks are also implemented here. + * + * @throws StaticCodeConstraintException if the verification fails. + */ + private void pass3StaticInstructionOperandsChecks(){ + try { + // When building up the InstructionList, BCEL has already done all those checks + // mentioned in The Java Virtual Machine Specification, Second Edition, as + // "static constraints on the operands of instructions in the code array". + // TODO: see the do_verify() comments. Maybe we should really work on the + // byte array first to give more comprehensive messages. + // TODO: Review Exception API, possibly build in some "offending instruction" thing + // when we're ready to insulate the offending instruction by doing the + // above thing. + + // TODO: Implement as much as possible here. BCEL does _not_ check everything. + + ConstantPoolGen cpg = new ConstantPoolGen(Repository.lookupClass(myOwner.getClassName()).getConstantPool()); + InstOperandConstraintVisitor v = new InstOperandConstraintVisitor(cpg); + + // Checks for the things BCEL does _not_ handle itself. + InstructionHandle ih = instructionList.getStart(); + while (ih != null){ + Instruction i = ih.getInstruction(); + + // An "own" constraint, due to JustIce's new definition of what "subroutine" means. + if (i instanceof JsrInstruction){ + InstructionHandle target = ((JsrInstruction) i).getTarget(); + if (target == instructionList.getStart()){ + throw new StaticCodeInstructionOperandConstraintException("Due to JustIce's clear definition of subroutines, no JSR or JSR_W may have a top-level instruction (such as the very first instruction, which is targeted by instruction '"+ih+"' as its target."); + } + if (!(target.getInstruction() instanceof ASTORE)){ + throw new StaticCodeInstructionOperandConstraintException("Due to JustIce's clear definition of subroutines, no JSR or JSR_W may target anything else than an ASTORE instruction. Instruction '"+ih+"' targets '"+target+"'."); + } + } + + // vmspec2, page 134-137 + ih.accept(v); + + ih = ih.getNext(); + } + + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** A small utility method returning if a given int i is in the given int[] ints. */ + private static boolean contains(int[] ints, int i){ + for (int k : ints) { + if (k==i) { return true; } - } - return false; - } - - /** Returns the method number as supplied when instantiating. */ - public int getMethodNo(){ - return method_no; - } - - /** - * This visitor class does the actual checking for the instruction - * operand's constraints. - */ - private class InstOperandConstraintVisitor extends org.apache.bcel.generic.EmptyVisitor{ - /** The ConstantPoolGen instance this Visitor operates on. */ - private ConstantPoolGen cpg; - - /** The only Constructor. */ - InstOperandConstraintVisitor(ConstantPoolGen cpg){ - this.cpg = cpg; - } - - /** - * Utility method to return the max_locals value of the method verified - * by the surrounding Pass3aVerifier instance. - */ - private int max_locals(){ - try { - return Repository.lookupClass(myOwner.getClassName()).getMethods()[method_no].getCode().getMaxLocals(); - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * A utility method to always raise an exeption. - */ - private void constraintViolated(Instruction i, String message) { - throw new StaticCodeInstructionOperandConstraintException("Instruction "+i+" constraint violated: "+message); - } - - /** - * A utility method to raise an exception if the index is not - * a valid constant pool index. - */ - private void indexValid(Instruction i, int idx){ - if (idx < 0 || idx >= cpg.getSize()){ - constraintViolated(i, "Illegal constant pool index '"+idx+"'."); - } - } - - /////////////////////////////////////////////////////////// - // The Java Virtual Machine Specification, pages 134-137 // - /////////////////////////////////////////////////////////// - /** - * Assures the generic preconditions of a LoadClass instance. - * The referenced class is loaded and pass2-verified. - */ - @Override + } + return false; + } + + /** Returns the method number as supplied when instantiating. */ + public int getMethodNo(){ + return method_no; + } + + /** + * This visitor class does the actual checking for the instruction + * operand's constraints. + */ + private class InstOperandConstraintVisitor extends org.apache.bcel.generic.EmptyVisitor{ + /** The ConstantPoolGen instance this Visitor operates on. */ + private ConstantPoolGen cpg; + + /** The only Constructor. */ + InstOperandConstraintVisitor(ConstantPoolGen cpg){ + this.cpg = cpg; + } + + /** + * Utility method to return the max_locals value of the method verified + * by the surrounding Pass3aVerifier instance. + */ + private int max_locals(){ + try { + return Repository.lookupClass(myOwner.getClassName()).getMethods()[method_no].getCode().getMaxLocals(); + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * A utility method to always raise an exeption. + */ + private void constraintViolated(Instruction i, String message) { + throw new StaticCodeInstructionOperandConstraintException("Instruction "+i+" constraint violated: "+message); + } + + /** + * A utility method to raise an exception if the index is not + * a valid constant pool index. + */ + private void indexValid(Instruction i, int idx){ + if (idx < 0 || idx >= cpg.getSize()){ + constraintViolated(i, "Illegal constant pool index '"+idx+"'."); + } + } + + /////////////////////////////////////////////////////////// + // The Java Virtual Machine Specification, pages 134-137 // + /////////////////////////////////////////////////////////// + /** + * Assures the generic preconditions of a LoadClass instance. + * The referenced class is loaded and pass2-verified. + */ + @Override public void visitLoadClass(LoadClass o){ - ObjectType t = o.getLoadClassType(cpg); - if (t != null){// null means "no class is loaded" - Verifier v = VerifierFactory.getVerifier(t.getClassName()); - VerificationResult vr = v.doPass1(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded: '"+vr+"'."); - } - } - } - - // The target of each jump and branch instruction [...] must be the opcode [...] - // BCEL _DOES_ handle this. - - // tableswitch: BCEL will do it, supposedly. - - // lookupswitch: BCEL will do it, supposedly. - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - // LDC and LDC_W (LDC_W is a subclass of LDC in BCEL's model) - @Override + ObjectType t = o.getLoadClassType(cpg); + if (t != null){// null means "no class is loaded" + Verifier v = VerifierFactory.getVerifier(t.getClassName()); + VerificationResult vr = v.doPass1(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded: '"+vr+"'."); + } + } + } + + // The target of each jump and branch instruction [...] must be the opcode [...] + // BCEL _DOES_ handle this. + + // tableswitch: BCEL will do it, supposedly. + + // lookupswitch: BCEL will do it, supposedly. + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + // LDC and LDC_W (LDC_W is a subclass of LDC in BCEL's model) + @Override public void visitLDC(LDC o){ - indexValid(o, o.getIndex()); - Constant c = cpg.getConstant(o.getIndex()); - if (c instanceof ConstantClass){ - addMessage("Operand of LDC or LDC_W is CONSTANT_Class '"+c+"' - this is only supported in JDK 1.5 and higher."); - } - else{ - if (! ( (c instanceof ConstantInteger) || - (c instanceof ConstantFloat) || + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (c instanceof ConstantClass){ + addMessage("Operand of LDC or LDC_W is CONSTANT_Class '"+c+"' - this is only supported in JDK 1.5 and higher."); + } + else{ + if (! ( (c instanceof ConstantInteger) || + (c instanceof ConstantFloat) || (c instanceof ConstantString) ) ){ constraintViolated(o, "Operand of LDC or LDC_W must be one of CONSTANT_Integer, CONSTANT_Float or CONSTANT_String, but is '"+c+"'."); - } - } - } + } + } + } - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - // LDC2_W - @Override + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + // LDC2_W + @Override public void visitLDC2_W(LDC2_W o){ - indexValid(o, o.getIndex()); - Constant c = cpg.getConstant(o.getIndex()); - if (! ( (c instanceof ConstantLong) || - (c instanceof ConstantDouble) ) ){ - constraintViolated(o, "Operand of LDC2_W must be CONSTANT_Long or CONSTANT_Double, but is '"+c+"'."); - } - try{ - indexValid(o, o.getIndex()+1); - } - catch(StaticCodeInstructionOperandConstraintException e){ - throw new AssertionViolatedException("OOPS: Does not BCEL handle that? LDC2_W operand has a problem.", e); - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - //getfield, putfield, getstatic, putstatic - @Override + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (! ( (c instanceof ConstantLong) || + (c instanceof ConstantDouble) ) ){ + constraintViolated(o, "Operand of LDC2_W must be CONSTANT_Long or CONSTANT_Double, but is '"+c+"'."); + } + try{ + indexValid(o, o.getIndex()+1); + } + catch(StaticCodeInstructionOperandConstraintException e){ + throw new AssertionViolatedException("OOPS: Does not BCEL handle that? LDC2_W operand has a problem.", e); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + //getfield, putfield, getstatic, putstatic + @Override public void visitFieldInstruction(FieldInstruction o){ - try { - indexValid(o, o.getIndex()); - Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantFieldref)){ - constraintViolated(o, "Indexing a constant that's not a CONSTANT_Fieldref but a '"+c+"'."); - } - - String field_name = o.getFieldName(cpg); - - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); - Field[] fields = jc.getFields(); - Field f = null; - for (Field field : fields) { - if (field.getName().equals(field_name)){ - Type f_type = Type.getType(field.getSignature()); - Type o_type = o.getType(cpg); - /* TODO: Check if assignment compatibility is sufficient. - * What does Sun do? - */ - if (f_type.equals(o_type)){ - f = field; - break; - } - } - } - if (f == null){ - JavaClass[] superclasses = jc.getSuperClasses(); - outer: + try { + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantFieldref)){ + constraintViolated(o, "Indexing a constant that's not a CONSTANT_Fieldref but a '"+c+"'."); + } + + String field_name = o.getFieldName(cpg); + + JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + Field[] fields = jc.getFields(); + Field f = null; + for (Field field : fields) { + if (field.getName().equals(field_name)){ + Type f_type = Type.getType(field.getSignature()); + Type o_type = o.getType(cpg); + /* TODO: Check if assignment compatibility is sufficient. + * What does Sun do? + */ + if (f_type.equals(o_type)){ + f = field; + break; + } + } + } + if (f == null){ + JavaClass[] superclasses = jc.getSuperClasses(); + outer: for (JavaClass superclass : superclasses) { fields = superclass.getFields(); for (Field field : fields) { @@ -589,669 +589,669 @@ public final class Pass3aVerifier extends PassVerifier{ } } } - if (f == null) { + if (f == null) { constraintViolated(o, "Referenced field '"+field_name+"' does not exist in class '"+jc.getClassName()+"'."); } - } - else{ - /* TODO: Check if assignment compatibility is sufficient. - What does Sun do? */ + } + else{ + /* TODO: Check if assignment compatibility is sufficient. + What does Sun do? */ Type.getType(f.getSignature()); o.getType(cpg); -// Type f_type = Type.getType(f.getSignature()); -// Type o_type = o.getType(cpg); - - // Argh. Sun's implementation allows us to have multiple fields of - // the same name but with a different signature. - //if (! f_type.equals(o_type)){ - // constraintViolated(o, "Referenced field '"+field_name+"' has type '"+f_type+"' instead of '"+o_type+"' as expected."); - //} - - /* TODO: Check for access modifiers here. */ - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override +// Type f_type = Type.getType(f.getSignature()); +// Type o_type = o.getType(cpg); + + // Argh. Sun's implementation allows us to have multiple fields of + // the same name but with a different signature. + //if (! f_type.equals(o_type)){ + // constraintViolated(o, "Referenced field '"+field_name+"' has type '"+f_type+"' instead of '"+o_type+"' as expected."); + //} + + /* TODO: Check for access modifiers here. */ + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitInvokeInstruction(InvokeInstruction o){ - indexValid(o, o.getIndex()); - if ( (o instanceof INVOKEVIRTUAL) || - (o instanceof INVOKESPECIAL) || - (o instanceof INVOKESTATIC) ){ - Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantMethodref)){ - constraintViolated(o, "Indexing a constant that's not a CONSTANT_Methodref but a '"+c+"'."); - } - else{ - // Constants are okay due to pass2. - ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantMethodref) c).getNameAndTypeIndex())); - ConstantUtf8 cutf8 = (ConstantUtf8) (cpg.getConstant(cnat.getNameIndex())); - if (cutf8.getBytes().equals(Constants.CONSTRUCTOR_NAME) && (!(o instanceof INVOKESPECIAL)) ){ - constraintViolated(o, "Only INVOKESPECIAL is allowed to invoke instance initialization methods."); - } - if ( (! (cutf8.getBytes().equals(Constants.CONSTRUCTOR_NAME)) ) && (cutf8.getBytes().startsWith("<")) ){ - constraintViolated(o, "No method with a name beginning with '<' other than the instance initialization methods may be called by the method invocation instructions."); - } - } - } - else{ //if (o instanceof INVOKEINTERFACE){ - Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantInterfaceMethodref)){ - constraintViolated(o, "Indexing a constant that's not a CONSTANT_InterfaceMethodref but a '"+c+"'."); - } - // TODO: From time to time check if BCEL allows to detect if the - // 'count' operand is consistent with the information in the - // CONSTANT_InterfaceMethodref and if the last operand is zero. - // By now, BCEL hides those two operands because they're superfluous. - - // Invoked method must not be or - ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantInterfaceMethodref)c).getNameAndTypeIndex())); - String name = ((ConstantUtf8) (cpg.getConstant(cnat.getNameIndex()))).getBytes(); - if (name.equals(Constants.CONSTRUCTOR_NAME)){ - constraintViolated(o, "Method to invoke must not be '"+Constants.CONSTRUCTOR_NAME+"'."); - } - if (name.equals(Constants.STATIC_INITIALIZER_NAME)){ - constraintViolated(o, "Method to invoke must not be '"+Constants.STATIC_INITIALIZER_NAME+"'."); - } - } - - // The LoadClassType is the method-declaring class, so we have to check the other types. - - Type t = o.getReturnType(cpg); - if (t instanceof ArrayType){ - t = ((ArrayType) t).getBasicType(); - } - if (t instanceof ObjectType){ - Verifier v = VerifierFactory.getVerifier(((ObjectType) t).getClassName()); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated(o, "Return type class/interface could not be verified successfully: '"+vr.getMessage()+"'."); - } - } - - Type[] ts = o.getArgumentTypes(cpg); - for (Type element : ts) { - t = element; - if (t instanceof ArrayType){ - t = ((ArrayType) t).getBasicType(); - } - if (t instanceof ObjectType){ - Verifier v = VerifierFactory.getVerifier(((ObjectType) t).getClassName()); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated(o, "Argument type class/interface could not be verified successfully: '"+vr.getMessage()+"'."); - } - } - } - - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + indexValid(o, o.getIndex()); + if ( (o instanceof INVOKEVIRTUAL) || + (o instanceof INVOKESPECIAL) || + (o instanceof INVOKESTATIC) ){ + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantMethodref)){ + constraintViolated(o, "Indexing a constant that's not a CONSTANT_Methodref but a '"+c+"'."); + } + else{ + // Constants are okay due to pass2. + ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantMethodref) c).getNameAndTypeIndex())); + ConstantUtf8 cutf8 = (ConstantUtf8) (cpg.getConstant(cnat.getNameIndex())); + if (cutf8.getBytes().equals(Constants.CONSTRUCTOR_NAME) && (!(o instanceof INVOKESPECIAL)) ){ + constraintViolated(o, "Only INVOKESPECIAL is allowed to invoke instance initialization methods."); + } + if ( (! (cutf8.getBytes().equals(Constants.CONSTRUCTOR_NAME)) ) && (cutf8.getBytes().startsWith("<")) ){ + constraintViolated(o, "No method with a name beginning with '<' other than the instance initialization methods may be called by the method invocation instructions."); + } + } + } + else{ //if (o instanceof INVOKEINTERFACE){ + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantInterfaceMethodref)){ + constraintViolated(o, "Indexing a constant that's not a CONSTANT_InterfaceMethodref but a '"+c+"'."); + } + // TODO: From time to time check if BCEL allows to detect if the + // 'count' operand is consistent with the information in the + // CONSTANT_InterfaceMethodref and if the last operand is zero. + // By now, BCEL hides those two operands because they're superfluous. + + // Invoked method must not be or + ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantInterfaceMethodref)c).getNameAndTypeIndex())); + String name = ((ConstantUtf8) (cpg.getConstant(cnat.getNameIndex()))).getBytes(); + if (name.equals(Constants.CONSTRUCTOR_NAME)){ + constraintViolated(o, "Method to invoke must not be '"+Constants.CONSTRUCTOR_NAME+"'."); + } + if (name.equals(Constants.STATIC_INITIALIZER_NAME)){ + constraintViolated(o, "Method to invoke must not be '"+Constants.STATIC_INITIALIZER_NAME+"'."); + } + } + + // The LoadClassType is the method-declaring class, so we have to check the other types. + + Type t = o.getReturnType(cpg); + if (t instanceof ArrayType){ + t = ((ArrayType) t).getBasicType(); + } + if (t instanceof ObjectType){ + Verifier v = VerifierFactory.getVerifier(((ObjectType) t).getClassName()); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated(o, "Return type class/interface could not be verified successfully: '"+vr.getMessage()+"'."); + } + } + + Type[] ts = o.getArgumentTypes(cpg); + for (Type element : ts) { + t = element; + if (t instanceof ArrayType){ + t = ((ArrayType) t).getBasicType(); + } + if (t instanceof ObjectType){ + Verifier v = VerifierFactory.getVerifier(((ObjectType) t).getClassName()); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated(o, "Argument type class/interface could not be verified successfully: '"+vr.getMessage()+"'."); + } + } + } + + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitINSTANCEOF(INSTANCEOF o){ - indexValid(o, o.getIndex()); - Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ - constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantClass)){ + constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitCHECKCAST(CHECKCAST o){ - indexValid(o, o.getIndex()); - Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ - constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantClass)){ + constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitNEW(NEW o){ - indexValid(o, o.getIndex()); - Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ - constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); - } - else{ - ConstantUtf8 cutf8 = (ConstantUtf8) (cpg.getConstant( ((ConstantClass) c).getNameIndex() )); - Type t = Type.getType("L"+cutf8.getBytes()+";"); - if (t instanceof ArrayType){ - constraintViolated(o, "NEW must not be used to create an array."); - } - } - - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantClass)){ + constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); + } + else{ + ConstantUtf8 cutf8 = (ConstantUtf8) (cpg.getConstant( ((ConstantClass) c).getNameIndex() )); + Type t = Type.getType("L"+cutf8.getBytes()+";"); + if (t instanceof ArrayType){ + constraintViolated(o, "NEW must not be used to create an array."); + } + } + + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitMULTIANEWARRAY(MULTIANEWARRAY o){ - indexValid(o, o.getIndex()); - Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ - constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); - } - int dimensions2create = o.getDimensions(); - if (dimensions2create < 1){ - constraintViolated(o, "Number of dimensions to create must be greater than zero."); - } - Type t = o.getType(cpg); - if (t instanceof ArrayType){ - int dimensions = ((ArrayType) t).getDimensions(); - if (dimensions < dimensions2create){ - constraintViolated(o, "Not allowed to create array with more dimensions ('+dimensions2create+') than the one referenced by the CONSTANT_Class '"+t+"'."); - } - } - else{ - constraintViolated(o, "Expecting a CONSTANT_Class referencing an array type. [Constraint not found in The Java Virtual Machine Specification, Second Edition, 4.8.1]"); - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantClass)){ + constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); + } + int dimensions2create = o.getDimensions(); + if (dimensions2create < 1){ + constraintViolated(o, "Number of dimensions to create must be greater than zero."); + } + Type t = o.getType(cpg); + if (t instanceof ArrayType){ + int dimensions = ((ArrayType) t).getDimensions(); + if (dimensions < dimensions2create){ + constraintViolated(o, "Not allowed to create array with more dimensions ('+dimensions2create+') than the one referenced by the CONSTANT_Class '"+t+"'."); + } + } + else{ + constraintViolated(o, "Expecting a CONSTANT_Class referencing an array type. [Constraint not found in The Java Virtual Machine Specification, Second Edition, 4.8.1]"); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitANEWARRAY(ANEWARRAY o){ - indexValid(o, o.getIndex()); - Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ - constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); - } - Type t = o.getType(cpg); - if (t instanceof ArrayType){ - int dimensions = ((ArrayType) t).getDimensions(); - if (dimensions >= 255){ - constraintViolated(o, "Not allowed to create an array with more than 255 dimensions."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + indexValid(o, o.getIndex()); + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantClass)){ + constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); + } + Type t = o.getType(cpg); + if (t instanceof ArrayType){ + int dimensions = ((ArrayType) t).getDimensions(); + if (dimensions >= 255){ + constraintViolated(o, "Not allowed to create an array with more than 255 dimensions."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitNEWARRAY(NEWARRAY o){ - byte t = o.getTypecode(); - if (! ( (t == Constants.T_BOOLEAN) || - (t == Constants.T_CHAR) || - (t == Constants.T_FLOAT) || - (t == Constants.T_DOUBLE) || - (t == Constants.T_BYTE) || - (t == Constants.T_SHORT) || - (t == Constants.T_INT) || - (t == Constants.T_LONG) ) ){ - constraintViolated(o, "Illegal type code '+t+' for 'atype' operand."); - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + byte t = o.getTypecode(); + if (! ( (t == Constants.T_BOOLEAN) || + (t == Constants.T_CHAR) || + (t == Constants.T_FLOAT) || + (t == Constants.T_DOUBLE) || + (t == Constants.T_BYTE) || + (t == Constants.T_SHORT) || + (t == Constants.T_INT) || + (t == Constants.T_LONG) ) ){ + constraintViolated(o, "Illegal type code '+t+' for 'atype' operand."); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitILOAD(ILOAD o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitFLOAD(FLOAD o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitALOAD(ALOAD o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitISTORE(ISTORE o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitFSTORE(FSTORE o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitASTORE(ASTORE o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitIINC(IINC o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitRET(RET o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative."); - } - else{ - int maxminus1 = max_locals()-1; - if (idx > maxminus1){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative."); + } + else{ + int maxminus1 = max_locals()-1; + if (idx > maxminus1){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitLLOAD(LLOAD o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); - } - else{ - int maxminus2 = max_locals()-2; - if (idx > maxminus2){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + } + else{ + int maxminus2 = max_locals()-2; + if (idx > maxminus2){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitDLOAD(DLOAD o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); - } - else{ - int maxminus2 = max_locals()-2; - if (idx > maxminus2){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + } + else{ + int maxminus2 = max_locals()-2; + if (idx > maxminus2){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitLSTORE(LSTORE o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); - } - else{ - int maxminus2 = max_locals()-2; - if (idx > maxminus2){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + } + else{ + int maxminus2 = max_locals()-2; + if (idx > maxminus2){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitDSTORE(DSTORE o){ - int idx = o.getIndex(); - if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); - } - else{ - int maxminus2 = max_locals()-2; - if (idx > maxminus2){ - constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); - } - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int idx = o.getIndex(); + if (idx < 0){ + constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + } + else{ + int maxminus2 = max_locals()-2; + if (idx > maxminus2){ + constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); + } + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ - int[] matchs = o.getMatchs(); - int max = Integer.MIN_VALUE; - for (int i=0; i= "low". We cannot check this, as BCEL hides - // it from us. - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + int[] matchs = o.getMatchs(); + int max = Integer.MIN_VALUE; + for (int i=0; i= "low". We cannot check this, as BCEL hides + // it from us. + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitPUTSTATIC(PUTSTATIC o){ - try { - String field_name = o.getFieldName(cpg); - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); - Field[] fields = jc.getFields(); - Field f = null; - for (Field field : fields) { - if (field.getName().equals(field_name)){ - f = field; - break; - } - } - if (f == null){ + try { + String field_name = o.getFieldName(cpg); + JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + Field[] fields = jc.getFields(); + Field f = null; + for (Field field : fields) { + if (field.getName().equals(field_name)){ + f = field; + break; + } + } + if (f == null){ throw new AssertionViolatedException("Field '" + field_name + "' not found in " + jc.getClassName()); - } - - if (f.isFinal()){ - if (!(myOwner.getClassName().equals(o.getClassType(cpg).getClassName()))){ - constraintViolated(o, "Referenced field '"+f+"' is final and must therefore be declared in the current class '"+myOwner.getClassName()+"' which is not the case: it is declared in '"+o.getClassType(cpg).getClassName()+"'."); - } - } - - if (! (f.isStatic())){ - constraintViolated(o, "Referenced field '"+f+"' is not static which it should be."); - } - - String meth_name = Repository.lookupClass(myOwner.getClassName()).getMethods()[method_no].getName(); - - // If it's an interface, it can be set only in . - if ((!(jc.isClass())) && (!(meth_name.equals(Constants.STATIC_INITIALIZER_NAME)))){ - constraintViolated(o, "Interface field '"+f+"' must be set in a '"+Constants.STATIC_INITIALIZER_NAME+"' method."); - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + } + + if (f.isFinal()){ + if (!(myOwner.getClassName().equals(o.getClassType(cpg).getClassName()))){ + constraintViolated(o, "Referenced field '"+f+"' is final and must therefore be declared in the current class '"+myOwner.getClassName()+"' which is not the case: it is declared in '"+o.getClassType(cpg).getClassName()+"'."); + } + } + + if (! (f.isStatic())){ + constraintViolated(o, "Referenced field '"+f+"' is not static which it should be."); + } + + String meth_name = Repository.lookupClass(myOwner.getClassName()).getMethods()[method_no].getName(); + + // If it's an interface, it can be set only in . + if ((!(jc.isClass())) && (!(meth_name.equals(Constants.STATIC_INITIALIZER_NAME)))){ + constraintViolated(o, "Interface field '"+f+"' must be set in a '"+Constants.STATIC_INITIALIZER_NAME+"' method."); + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitGETSTATIC(GETSTATIC o){ - try { - String field_name = o.getFieldName(cpg); - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); - Field[] fields = jc.getFields(); - Field f = null; - for (Field field : fields) { - if (field.getName().equals(field_name)){ - f = field; - break; - } - } - if (f == null){ + try { + String field_name = o.getFieldName(cpg); + JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + Field[] fields = jc.getFields(); + Field f = null; + for (Field field : fields) { + if (field.getName().equals(field_name)){ + f = field; + break; + } + } + if (f == null){ throw new AssertionViolatedException("Field '" + field_name + "' not found in " + jc.getClassName()); - } - - if (! (f.isStatic())){ - constraintViolated(o, "Referenced field '"+f+"' is not static which it should be."); - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /* Checks if the constraints of operands of the said instruction(s) are satisfied. */ - //public void visitPUTFIELD(PUTFIELD o){ - // for performance reasons done in Pass 3b - //} - - /* Checks if the constraints of operands of the said instruction(s) are satisfied. */ - //public void visitGETFIELD(GETFIELD o){ - // for performance reasons done in Pass 3b - //} - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + } + + if (! (f.isStatic())){ + constraintViolated(o, "Referenced field '"+f+"' is not static which it should be."); + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /* Checks if the constraints of operands of the said instruction(s) are satisfied. */ + //public void visitPUTFIELD(PUTFIELD o){ + // for performance reasons done in Pass 3b + //} + + /* Checks if the constraints of operands of the said instruction(s) are satisfied. */ + //public void visitGETFIELD(GETFIELD o){ + // for performance reasons done in Pass 3b + //} + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ - try { - // INVOKEINTERFACE is a LoadClass; the Class where the referenced method is declared in, - // is therefore resolved/verified. - // INVOKEINTERFACE is an InvokeInstruction, the argument and return types are resolved/verified, - // too. So are the allowed method names. - String classname = o.getClassName(cpg); - JavaClass jc = Repository.lookupClass(classname); - Method[] ms = jc.getMethods(); - Method m = null; - for (Method element : ms) { - if ( (element.getName().equals(o.getMethodName(cpg))) && - (Type.getReturnType(element.getSignature()).equals(o.getReturnType(cpg))) && - (objarrayequals(Type.getArgumentTypes(element.getSignature()), o.getArgumentTypes(cpg))) ){ - m = element; - break; - } - } - if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'. The native verifier does allow the method to be declared in some superinterface, which the Java Virtual Machine Specification, Second Edition does not."); - } - if (jc.isClass()){ - constraintViolated(o, "Referenced class '"+jc.getClassName()+"' is a class, but not an interface as expected."); - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + try { + // INVOKEINTERFACE is a LoadClass; the Class where the referenced method is declared in, + // is therefore resolved/verified. + // INVOKEINTERFACE is an InvokeInstruction, the argument and return types are resolved/verified, + // too. So are the allowed method names. + String classname = o.getClassName(cpg); + JavaClass jc = Repository.lookupClass(classname); + Method[] ms = jc.getMethods(); + Method m = null; + for (Method element : ms) { + if ( (element.getName().equals(o.getMethodName(cpg))) && + (Type.getReturnType(element.getSignature()).equals(o.getReturnType(cpg))) && + (objarrayequals(Type.getArgumentTypes(element.getSignature()), o.getArgumentTypes(cpg))) ){ + m = element; + break; + } + } + if (m == null){ + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'. The native verifier does allow the method to be declared in some superinterface, which the Java Virtual Machine Specification, Second Edition does not."); + } + if (jc.isClass()){ + constraintViolated(o, "Referenced class '"+jc.getClassName()+"' is a class, but not an interface as expected."); + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitINVOKESPECIAL(INVOKESPECIAL o){ - try { - // INVOKESPECIAL is a LoadClass; the Class where the referenced method is declared in, - // is therefore resolved/verified. - // INVOKESPECIAL is an InvokeInstruction, the argument and return types are resolved/verified, - // too. So are the allowed method names. - String classname = o.getClassName(cpg); - JavaClass jc = Repository.lookupClass(classname); - Method[] ms = jc.getMethods(); - Method m = null; - for (Method element : ms) { - if ( (element.getName().equals(o.getMethodName(cpg))) && - (Type.getReturnType(element.getSignature()).equals(o.getReturnType(cpg))) && - (objarrayequals(Type.getArgumentTypes(element.getSignature()), o.getArgumentTypes(cpg))) ){ - m = element; - break; - } - } - if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'. The native verifier does allow the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); - } - - JavaClass current = Repository.lookupClass(myOwner.getClassName()); - if (current.isSuper()){ - - if ((Repository.instanceOf( current, jc )) && (!current.equals(jc))){ - - if (! (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME) )){ - // Special lookup procedure for ACC_SUPER classes. - - int supidx = -1; - - Method meth = null; - while (supidx != 0){ - supidx = current.getSuperclassNameIndex(); - current = Repository.lookupClass(current.getSuperclassName()); - - Method[] meths = current.getMethods(); - for (Method meth2 : meths) { - if ( (meth2.getName().equals(o.getMethodName(cpg))) && - (Type.getReturnType(meth2.getSignature()).equals(o.getReturnType(cpg))) && - (objarrayequals(Type.getArgumentTypes(meth2.getSignature()), o.getArgumentTypes(cpg))) ){ - meth = meth2; - break; - } - } - if (meth != null) { + try { + // INVOKESPECIAL is a LoadClass; the Class where the referenced method is declared in, + // is therefore resolved/verified. + // INVOKESPECIAL is an InvokeInstruction, the argument and return types are resolved/verified, + // too. So are the allowed method names. + String classname = o.getClassName(cpg); + JavaClass jc = Repository.lookupClass(classname); + Method[] ms = jc.getMethods(); + Method m = null; + for (Method element : ms) { + if ( (element.getName().equals(o.getMethodName(cpg))) && + (Type.getReturnType(element.getSignature()).equals(o.getReturnType(cpg))) && + (objarrayequals(Type.getArgumentTypes(element.getSignature()), o.getArgumentTypes(cpg))) ){ + m = element; + break; + } + } + if (m == null){ + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'. The native verifier does allow the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); + } + + JavaClass current = Repository.lookupClass(myOwner.getClassName()); + if (current.isSuper()){ + + if ((Repository.instanceOf( current, jc )) && (!current.equals(jc))){ + + if (! (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME) )){ + // Special lookup procedure for ACC_SUPER classes. + + int supidx = -1; + + Method meth = null; + while (supidx != 0){ + supidx = current.getSuperclassNameIndex(); + current = Repository.lookupClass(current.getSuperclassName()); + + Method[] meths = current.getMethods(); + for (Method meth2 : meths) { + if ( (meth2.getName().equals(o.getMethodName(cpg))) && + (Type.getReturnType(meth2.getSignature()).equals(o.getReturnType(cpg))) && + (objarrayequals(Type.getArgumentTypes(meth2.getSignature()), o.getArgumentTypes(cpg))) ){ + meth = meth2; + break; + } + } + if (meth != null) { break; } - } - if (meth == null){ - constraintViolated(o, "ACC_SUPER special lookup procedure not successful: method '"+o.getMethodName(cpg)+"' with proper signature not declared in superclass hierarchy."); - } - } - } - } - - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - - } - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + } + if (meth == null){ + constraintViolated(o, "ACC_SUPER special lookup procedure not successful: method '"+o.getMethodName(cpg)+"' with proper signature not declared in superclass hierarchy."); + } + } + } + } + + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + + } + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitINVOKESTATIC(INVOKESTATIC o){ - try { - // INVOKESTATIC is a LoadClass; the Class where the referenced method is declared in, - // is therefore resolved/verified. - // INVOKESTATIC is an InvokeInstruction, the argument and return types are resolved/verified, - // too. So are the allowed method names. - String classname = o.getClassName(cpg); - JavaClass jc = Repository.lookupClass(classname); - Method[] ms = jc.getMethods(); - Method m = null; - for (Method element : ms) { - if ( (element.getName().equals(o.getMethodName(cpg))) && - (Type.getReturnType(element.getSignature()).equals(o.getReturnType(cpg))) && - (objarrayequals(Type.getArgumentTypes(element.getSignature()), o.getArgumentTypes(cpg))) ){ - m = element; - break; - } - } - if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg) +"' not found in class '"+jc.getClassName()+"'. The native verifier possibly allows the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); - } else if (! (m.isStatic())){ // implies it's not abstract, verified in pass 2. - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' has ACC_STATIC unset."); - } - - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - - /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ - @Override + try { + // INVOKESTATIC is a LoadClass; the Class where the referenced method is declared in, + // is therefore resolved/verified. + // INVOKESTATIC is an InvokeInstruction, the argument and return types are resolved/verified, + // too. So are the allowed method names. + String classname = o.getClassName(cpg); + JavaClass jc = Repository.lookupClass(classname); + Method[] ms = jc.getMethods(); + Method m = null; + for (Method element : ms) { + if ( (element.getName().equals(o.getMethodName(cpg))) && + (Type.getReturnType(element.getSignature()).equals(o.getReturnType(cpg))) && + (objarrayequals(Type.getArgumentTypes(element.getSignature()), o.getArgumentTypes(cpg))) ){ + m = element; + break; + } + } + if (m == null){ + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg) +"' not found in class '"+jc.getClassName()+"'. The native verifier possibly allows the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); + } else if (! (m.isStatic())){ // implies it's not abstract, verified in pass 2. + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' has ACC_STATIC unset."); + } + + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ - try { - // INVOKEVIRTUAL is a LoadClass; the Class where the referenced method is declared in, - // is therefore resolved/verified. - // INVOKEVIRTUAL is an InvokeInstruction, the argument and return types are resolved/verified, - // too. So are the allowed method names. - String classname = o.getClassName(cpg); - JavaClass jc = Repository.lookupClass(classname); - Method[] ms = jc.getMethods(); - Method m = null; - for (Method element : ms) { - if ( (element.getName().equals(o.getMethodName(cpg))) && - (Type.getReturnType(element.getSignature()).equals(o.getReturnType(cpg))) && - (objarrayequals(Type.getArgumentTypes(element.getSignature()), o.getArgumentTypes(cpg))) ){ - m = element; - break; - } - } - if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'. The native verifier does allow the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); - } - if (! (jc.isClass())){ - constraintViolated(o, "Referenced class '"+jc.getClassName()+"' is an interface, but not a class as expected."); - } - - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - - // WIDE stuff is BCEL-internal and cannot be checked here. - - /** - * A utility method like equals(Object) for arrays. - * The equality of the elements is based on their equals(Object) - * method instead of their object identity. - */ - private boolean objarrayequals(Object[] o, Object[] p){ - if (o.length != p.length){ - return false; - } - - for (int i=0; i inFrames; // key: the last-executed JSR - - /** - * The 'outgoing' execution Frames. - */ - private Map outFrames; // key: the last-executed JSR - - /** - * The 'execution predecessors' - a list of type InstructionContext - * of those instances that have been execute()d before in that order. - */ - private List executionPredecessors = null; // Type: InstructionContext - - /** - * Creates an InstructionHandleImpl object from an InstructionHandle. - * Creation of one per InstructionHandle suffices. Don't create more. - */ - public InstructionContextImpl(InstructionHandle inst){ - if (inst == null) { + /** + * Objects of this class represent a node in a ControlFlowGraph. + * These nodes are instructions, not basic blocks. + */ + private class InstructionContextImpl implements InstructionContext{ + + /** + * The TAG field is here for external temporary flagging, such + * as graph colouring. + * + * @see #getTag() + * @see #setTag(int) + */ + private int TAG; + + /** + * The InstructionHandle this InstructionContext is wrapped around. + */ + private InstructionHandle instruction; + + /** + * The 'incoming' execution Frames. + */ + private Map inFrames; // key: the last-executed JSR + + /** + * The 'outgoing' execution Frames. + */ + private Map outFrames; // key: the last-executed JSR + + /** + * The 'execution predecessors' - a list of type InstructionContext + * of those instances that have been execute()d before in that order. + */ + private List executionPredecessors = null; // Type: InstructionContext + + /** + * Creates an InstructionHandleImpl object from an InstructionHandle. + * Creation of one per InstructionHandle suffices. Don't create more. + */ + public InstructionContextImpl(InstructionHandle inst){ + if (inst == null) { throw new AssertionViolatedException("Cannot instantiate InstructionContextImpl from NULL."); } - - instruction = inst; - inFrames = new HashMap(); - outFrames = new HashMap(); - } - - /* Satisfies InstructionContext.getTag(). */ - public int getTag(){ - return TAG; - } - - /* Satisfies InstructionContext.setTag(int). */ - public void setTag(int tag){ - TAG = tag; - } - - /** - * Returns the exception handlers of this instruction. - */ - public ExceptionHandler[] getExceptionHandlers(){ - return exceptionhandlers.getExceptionHandlers(getInstruction()); - } - - /** - * Returns a clone of the "outgoing" frame situation with respect to the given ExecutionChain. - */ - public Frame getOutFrame(ArrayList execChain){ - executionPredecessors = execChain; - - Frame org; - - InstructionContext jsr = lastExecutionJSR(); - - org = outFrames.get(jsr); - - if (org == null){ - throw new AssertionViolatedException("outFrame not set! This:\n"+this+"\nExecutionChain: "+getExecutionChain()+"\nOutFrames: '"+outFrames+"'."); - } - return org.getClone(); - } + + instruction = inst; + inFrames = new HashMap(); + outFrames = new HashMap(); + } + + /* Satisfies InstructionContext.getTag(). */ + public int getTag(){ + return TAG; + } + + /* Satisfies InstructionContext.setTag(int). */ + public void setTag(int tag){ + TAG = tag; + } + + /** + * Returns the exception handlers of this instruction. + */ + public ExceptionHandler[] getExceptionHandlers(){ + return exceptionhandlers.getExceptionHandlers(getInstruction()); + } + + /** + * Returns a clone of the "outgoing" frame situation with respect to the given ExecutionChain. + */ + public Frame getOutFrame(ArrayList execChain){ + executionPredecessors = execChain; + + Frame org; + + InstructionContext jsr = lastExecutionJSR(); + + org = outFrames.get(jsr); + + if (org == null){ + throw new AssertionViolatedException("outFrame not set! This:\n"+this+"\nExecutionChain: "+getExecutionChain()+"\nOutFrames: '"+outFrames+"'."); + } + return org.getClone(); + } public Frame getInFrame() { - Frame org; - - InstructionContext jsr = lastExecutionJSR(); - - org = inFrames.get(jsr); - - if (org == null){ - throw new AssertionViolatedException("inFrame not set! This:\n"+this+"\nInFrames: '"+inFrames+"'."); + Frame org; + + InstructionContext jsr = lastExecutionJSR(); + + org = inFrames.get(jsr); + + if (org == null){ + throw new AssertionViolatedException("inFrame not set! This:\n"+this+"\nInFrames: '"+inFrames+"'."); } return org.getClone(); } - /** - * "Merges in" (vmspec2, page 146) the "incoming" frame situation; - * executes the instructions symbolically - * and therefore calculates the "outgoing" frame situation. - * Returns: True iff the "incoming" frame situation changed after - * merging with "inFrame". - * The execPreds ArrayList must contain the InstructionContext - * objects executed so far in the correct order. This is just - * one execution path [out of many]. This is needed to correctly - * "merge" in the special case of a RET's successor. - * The InstConstraintVisitor and ExecutionVisitor instances - * must be set up correctly. - * @return true - if and only if the "outgoing" frame situation - * changed from the one before execute()ing. - */ - public boolean execute(Frame inFrame, ArrayList execPreds, InstConstraintVisitor icv, ExecutionVisitor ev){ - - executionPredecessors = (List) execPreds.clone(); - - //sanity check - if ( (lastExecutionJSR() == null) && (subroutines.subroutineOf(getInstruction()) != subroutines.getTopLevel() ) ){ - throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?"); - } - if ( (lastExecutionJSR() != null) && (subroutines.subroutineOf(getInstruction()) == subroutines.getTopLevel() ) ){ - throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?"); - } - - Frame inF = inFrames.get(lastExecutionJSR()); - if (inF == null){// no incoming frame was set, so set it. - inFrames.put(lastExecutionJSR(), inFrame); - inF = inFrame; - } - else{// if there was an "old" inFrame - if (inF.equals(inFrame)){ //shortcut: no need to merge equal frames. - return false; - } - if (! mergeInFrames(inFrame)){ - return false; - } - } - - // Now we're sure the inFrame has changed! - - // new inFrame is already merged in, see above. - Frame workingFrame = inF.getClone(); - - try{ - // This verifies the InstructionConstraint for the current - // instruction, but does not modify the workingFrame object. + /** + * "Merges in" (vmspec2, page 146) the "incoming" frame situation; + * executes the instructions symbolically + * and therefore calculates the "outgoing" frame situation. + * Returns: True iff the "incoming" frame situation changed after + * merging with "inFrame". + * The execPreds ArrayList must contain the InstructionContext + * objects executed so far in the correct order. This is just + * one execution path [out of many]. This is needed to correctly + * "merge" in the special case of a RET's successor. + * The InstConstraintVisitor and ExecutionVisitor instances + * must be set up correctly. + * @return true - if and only if the "outgoing" frame situation + * changed from the one before execute()ing. + */ + public boolean execute(Frame inFrame, ArrayList execPreds, InstConstraintVisitor icv, ExecutionVisitor ev){ + + executionPredecessors = (List) execPreds.clone(); + + //sanity check + if ( (lastExecutionJSR() == null) && (subroutines.subroutineOf(getInstruction()) != subroutines.getTopLevel() ) ){ + throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?"); + } + if ( (lastExecutionJSR() != null) && (subroutines.subroutineOf(getInstruction()) == subroutines.getTopLevel() ) ){ + throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?"); + } + + Frame inF = inFrames.get(lastExecutionJSR()); + if (inF == null){// no incoming frame was set, so set it. + inFrames.put(lastExecutionJSR(), inFrame); + inF = inFrame; + } + else{// if there was an "old" inFrame + if (inF.equals(inFrame)){ //shortcut: no need to merge equal frames. + return false; + } + if (! mergeInFrames(inFrame)){ + return false; + } + } + + // Now we're sure the inFrame has changed! + + // new inFrame is already merged in, see above. + Frame workingFrame = inF.getClone(); + + try{ + // This verifies the InstructionConstraint for the current + // instruction, but does not modify the workingFrame object. //InstConstraintVisitor icv = InstConstraintVisitor.getInstance(VerifierFactory.getVerifier(method_gen.getClassName())); - icv.setFrame(workingFrame); - getInstruction().accept(icv); - } - catch(StructuralCodeConstraintException ce){ - ce.extendMessage("","\nInstructionHandle: "+getInstruction()+"\n"); - ce.extendMessage("","\nExecution Frame:\n"+workingFrame); - extendMessageWithFlow(ce); - throw ce; - } - - // This executes the Instruction. - // Therefore the workingFrame object is modified. + icv.setFrame(workingFrame); + getInstruction().accept(icv); + } + catch(StructuralCodeConstraintException ce){ + ce.extendMessage("","\nInstructionHandle: "+getInstruction()+"\n"); + ce.extendMessage("","\nExecution Frame:\n"+workingFrame); + extendMessageWithFlow(ce); + throw ce; + } + + // This executes the Instruction. + // Therefore the workingFrame object is modified. //ExecutionVisitor ev = ExecutionVisitor.getInstance(VerifierFactory.getVerifier(method_gen.getClassName())); - ev.setFrame(workingFrame); - getInstruction().accept(ev); - //getInstruction().accept(ExecutionVisitor.withFrame(workingFrame)); - outFrames.put(lastExecutionJSR(), workingFrame); - - return true; // new inFrame was different from old inFrame so merging them - // yielded a different this.inFrame. - } - - /** - * Returns a simple String representation of this InstructionContext. - */ - @Override + ev.setFrame(workingFrame); + getInstruction().accept(ev); + //getInstruction().accept(ExecutionVisitor.withFrame(workingFrame)); + outFrames.put(lastExecutionJSR(), workingFrame); + + return true; // new inFrame was different from old inFrame so merging them + // yielded a different this.inFrame. + } + + /** + * Returns a simple String representation of this InstructionContext. + */ + @Override public String toString(){ - //TODO: Put information in the brackets, e.g. - // Is this an ExceptionHandler? Is this a RET? Is this the start of - // a subroutine? - String ret = getInstruction().toString(false)+"\t[InstructionContext]"; - return ret; - } - - /** - * Does the actual merging (vmspec2, page 146). - * Returns true IFF this.inFrame was changed in course of merging with inFrame. - */ - private boolean mergeInFrames(Frame inFrame){ - // TODO: Can be performance-improved. - Frame inF = inFrames.get(lastExecutionJSR()); - OperandStack oldstack = inF.getStack().getClone(); - LocalVariables oldlocals = inF.getLocals().getClone(); - try{ - inF.getStack().merge(inFrame.getStack()); - inF.getLocals().merge(inFrame.getLocals()); - } - catch (StructuralCodeConstraintException sce){ - extendMessageWithFlow(sce); - throw sce; - } - if ( oldstack.equals(inF.getStack()) && - oldlocals.equals(inF.getLocals()) ){ - return false; - } - else{ - return true; - } - } - - /** - * Returns the control flow execution chain. This is built - * while execute(Frame, ArrayList)-ing the code represented - * by the surrounding ControlFlowGraph. - */ - private String getExecutionChain(){ - String s = this.toString(); - for (int i=executionPredecessors.size()-1; i>=0; i--){ - s = executionPredecessors.get(i)+"\n" + s; - } - return s; - } - - - /** - * Extends the StructuralCodeConstraintException ("e") object with an at-the-end-extended message. - * This extended message will then reflect the execution flow needed to get to the constraint - * violation that triggered the throwing of the "e" object. - */ - private void extendMessageWithFlow(StructuralCodeConstraintException e){ - String s = "Execution flow:\n"; - e.extendMessage("", s+getExecutionChain()); - } - - /* - * Fulfils the contract of InstructionContext.getInstruction(). - */ - public InstructionHandle getInstruction(){ - return instruction; - } - - /** - * Returns the InstructionContextImpl with an JSR/JSR_W - * that was last in the ExecutionChain, without - * a corresponding RET, i.e. - * we were called by this one. - * Returns null if we were called from the top level. - */ - private InstructionContextImpl lastExecutionJSR(){ - - int size = executionPredecessors.size(); - int retcount = 0; - - for (int i=size-1; i>=0; i--){ - InstructionContextImpl current = (InstructionContextImpl) (executionPredecessors.get(i)); - Instruction currentlast = current.getInstruction().getInstruction(); - if (currentlast instanceof RET) { + //TODO: Put information in the brackets, e.g. + // Is this an ExceptionHandler? Is this a RET? Is this the start of + // a subroutine? + String ret = getInstruction().toString(false)+"\t[InstructionContext]"; + return ret; + } + + /** + * Does the actual merging (vmspec2, page 146). + * Returns true IFF this.inFrame was changed in course of merging with inFrame. + */ + private boolean mergeInFrames(Frame inFrame){ + // TODO: Can be performance-improved. + Frame inF = inFrames.get(lastExecutionJSR()); + OperandStack oldstack = inF.getStack().getClone(); + LocalVariables oldlocals = inF.getLocals().getClone(); + try{ + inF.getStack().merge(inFrame.getStack()); + inF.getLocals().merge(inFrame.getLocals()); + } + catch (StructuralCodeConstraintException sce){ + extendMessageWithFlow(sce); + throw sce; + } + if ( oldstack.equals(inF.getStack()) && + oldlocals.equals(inF.getLocals()) ){ + return false; + } + else{ + return true; + } + } + + /** + * Returns the control flow execution chain. This is built + * while execute(Frame, ArrayList)-ing the code represented + * by the surrounding ControlFlowGraph. + */ + private String getExecutionChain(){ + String s = this.toString(); + for (int i=executionPredecessors.size()-1; i>=0; i--){ + s = executionPredecessors.get(i)+"\n" + s; + } + return s; + } + + + /** + * Extends the StructuralCodeConstraintException ("e") object with an at-the-end-extended message. + * This extended message will then reflect the execution flow needed to get to the constraint + * violation that triggered the throwing of the "e" object. + */ + private void extendMessageWithFlow(StructuralCodeConstraintException e){ + String s = "Execution flow:\n"; + e.extendMessage("", s+getExecutionChain()); + } + + /* + * Fulfils the contract of InstructionContext.getInstruction(). + */ + public InstructionHandle getInstruction(){ + return instruction; + } + + /** + * Returns the InstructionContextImpl with an JSR/JSR_W + * that was last in the ExecutionChain, without + * a corresponding RET, i.e. + * we were called by this one. + * Returns null if we were called from the top level. + */ + private InstructionContextImpl lastExecutionJSR(){ + + int size = executionPredecessors.size(); + int retcount = 0; + + for (int i=size-1; i>=0; i--){ + InstructionContextImpl current = (InstructionContextImpl) (executionPredecessors.get(i)); + Instruction currentlast = current.getInstruction().getInstruction(); + if (currentlast instanceof RET) { retcount++; } - if (currentlast instanceof JsrInstruction){ - retcount--; - if (retcount == -1) { + if (currentlast instanceof JsrInstruction){ + retcount--; + if (retcount == -1) { return current; } - } - } - return null; - } - - /* Satisfies InstructionContext.getSuccessors(). */ - public InstructionContext[] getSuccessors(){ - return contextsOf(_getSuccessors()); - } - - /** - * A utility method that calculates the successors of a given InstructionHandle - * That means, a RET does have successors as defined here. - * A JsrInstruction has its target as its successor - * (opposed to its physical successor) as defined here. - */ + } + } + return null; + } + + /* Satisfies InstructionContext.getSuccessors(). */ + public InstructionContext[] getSuccessors(){ + return contextsOf(_getSuccessors()); + } + + /** + * A utility method that calculates the successors of a given InstructionHandle + * That means, a RET does have successors as defined here. + * A JsrInstruction has its target as its successor + * (opposed to its physical successor) as defined here. + */ // TODO: implement caching! - private InstructionHandle[] _getSuccessors(){ - final InstructionHandle[] empty = new InstructionHandle[0]; - final InstructionHandle[] single = new InstructionHandle[1]; - - Instruction inst = getInstruction().getInstruction(); - - if (inst instanceof RET){ - Subroutine s = subroutines.subroutineOf(getInstruction()); - if (s==null){ //return empty; // RET in dead code. "empty" would be the correct answer, but we know something about the surrounding project... - throw new AssertionViolatedException("Asking for successors of a RET in dead code?!"); - } + private InstructionHandle[] _getSuccessors(){ + final InstructionHandle[] empty = new InstructionHandle[0]; + final InstructionHandle[] single = new InstructionHandle[1]; + + Instruction inst = getInstruction().getInstruction(); + + if (inst instanceof RET){ + Subroutine s = subroutines.subroutineOf(getInstruction()); + if (s==null){ //return empty; // RET in dead code. "empty" would be the correct answer, but we know something about the surrounding project... + throw new AssertionViolatedException("Asking for successors of a RET in dead code?!"); + } //TODO: remove. Only JustIce must not use it, but foreign users of the ControlFlowGraph // will want it. Thanks Johannes Wust. //throw new AssertionViolatedException("DID YOU REALLY WANT TO ASK FOR RET'S SUCCS?"); - InstructionHandle[] jsrs = s.getEnteringJsrInstructions(); - InstructionHandle[] ret = new InstructionHandle[jsrs.length]; - for (int i=0; i instructionContexts = new HashMap(); //keys: InstructionHandle, values: InstructionContextImpl - - /** - * A Control Flow Graph. - */ - public ControlFlowGraph(MethodGen method_gen){ - subroutines = new Subroutines(method_gen); - exceptionhandlers = new ExceptionHandlers(method_gen); - - InstructionHandle[] instructionhandles = method_gen.getInstructionList().getInstructionHandles(); - for (InstructionHandle instructionhandle : instructionhandles) { - instructionContexts.put(instructionhandle, new InstructionContextImpl(instructionhandle)); - } - - //this.method_gen = method_gen; - } - - /** - * Returns the InstructionContext of a given instruction. - */ - public InstructionContext contextOf(InstructionHandle inst){ - InstructionContext ic = instructionContexts.get(inst); - if (ic == null){ - throw new AssertionViolatedException("InstructionContext requested for an InstructionHandle that's not known!"); - } - return ic; - } - - /** - * Returns the InstructionContext[] of a given InstructionHandle[], - * in a naturally ordered manner. - */ - public InstructionContext[] contextsOf(InstructionHandle[] insts){ - InstructionContext[] ret = new InstructionContext[insts.length]; - for (int i=0; i(NOT ORDERED!). - */ - public InstructionContext[] getInstructionContexts(){ - InstructionContext[] ret = new InstructionContext[instructionContexts.values().size()]; - return instructionContexts.values().toArray(ret); - } - - /** - * Returns true, if and only if the said instruction is not reachable; that means, - * if it is not part of this ControlFlowGraph. - */ - public boolean isDead(InstructionHandle i){ + InstructionHandle[] jsrs = s.getEnteringJsrInstructions(); + InstructionHandle[] ret = new InstructionHandle[jsrs.length]; + for (int i=0; i instructionContexts = new HashMap(); //keys: InstructionHandle, values: InstructionContextImpl + + /** + * A Control Flow Graph. + */ + public ControlFlowGraph(MethodGen method_gen){ + subroutines = new Subroutines(method_gen); + exceptionhandlers = new ExceptionHandlers(method_gen); + + InstructionHandle[] instructionhandles = method_gen.getInstructionList().getInstructionHandles(); + for (InstructionHandle instructionhandle : instructionhandles) { + instructionContexts.put(instructionhandle, new InstructionContextImpl(instructionhandle)); + } + + //this.method_gen = method_gen; + } + + /** + * Returns the InstructionContext of a given instruction. + */ + public InstructionContext contextOf(InstructionHandle inst){ + InstructionContext ic = instructionContexts.get(inst); + if (ic == null){ + throw new AssertionViolatedException("InstructionContext requested for an InstructionHandle that's not known!"); + } + return ic; + } + + /** + * Returns the InstructionContext[] of a given InstructionHandle[], + * in a naturally ordered manner. + */ + public InstructionContext[] contextsOf(InstructionHandle[] insts){ + InstructionContext[] ret = new InstructionContext[insts.length]; + for (int i=0; i(NOT ORDERED!). + */ + public InstructionContext[] getInstructionContexts(){ + InstructionContext[] ret = new InstructionContext[instructionContexts.values().size()]; + return instructionContexts.values().toArray(ret); + } + + /** + * Returns true, if and only if the said instruction is not reachable; that means, + * if it is not part of this ControlFlowGraph. + */ + public boolean isDead(InstructionHandle i){ return subroutines.subroutineOf(i) == null; - } + } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java index 8b6ed4c7..592b6bf1 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java @@ -30,29 +30,29 @@ import org.apache.bcel.generic.ObjectType; * @author Enver Haase */ public class ExceptionHandler{ - /** The type of the exception to catch. NULL means ANY. */ - private ObjectType catchtype; - - /** The InstructionHandle where the handling begins. */ - private InstructionHandle handlerpc; + /** The type of the exception to catch. NULL means ANY. */ + private ObjectType catchtype; - /** Leave instance creation to JustIce. */ - ExceptionHandler(ObjectType catch_type, InstructionHandle handler_pc){ - catchtype = catch_type; - handlerpc = handler_pc; - } + /** The InstructionHandle where the handling begins. */ + private InstructionHandle handlerpc; - /** - * Returns the type of the exception that's handled. 'null' means 'ANY'. - */ - public ObjectType getExceptionType(){ - return catchtype; - } + /** Leave instance creation to JustIce. */ + ExceptionHandler(ObjectType catch_type, InstructionHandle handler_pc){ + catchtype = catch_type; + handlerpc = handler_pc; + } - /** - * Returns the InstructionHandle where the handler starts off. - */ - public InstructionHandle getHandlerStart(){ - return handlerpc; - } + /** + * Returns the type of the exception that's handled. 'null' means 'ANY'. + */ + public ObjectType getExceptionType(){ + return catchtype; + } + + /** + * Returns the InstructionHandle where the handler starts off. + */ + public InstructionHandle getHandlerStart(){ + return handlerpc; + } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index 142aff00..05b4020f 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -34,44 +34,44 @@ import org.apache.bcel.generic.MethodGen; * @author Enver Haase */ public class ExceptionHandlers{ - /** - * The ExceptionHandler instances. - * Key: InstructionHandle objects, Values: HashSet instances. - */ - private Map> exceptionhandlers; - - /** - * Constructor. Creates a new ExceptionHandlers instance. - */ - public ExceptionHandlers(MethodGen mg){ - exceptionhandlers = new HashMap>(); - CodeExceptionGen[] cegs = mg.getExceptionHandlers(); - for (CodeExceptionGen ceg : cegs) { - ExceptionHandler eh = new ExceptionHandler(ceg.getCatchType(), ceg.getHandlerPC()); - for (InstructionHandle ih=ceg.getStartPC(); ih != ceg.getEndPC().getNext(); ih=ih.getNext()){ - Set hs; - hs = exceptionhandlers.get(ih); - if (hs == null){ - hs = new HashSet(); - exceptionhandlers.put(ih, hs); - } - hs.add(eh); - } - } - } - - /** - * Returns all the ExceptionHandler instances representing exception - * handlers that protect the instruction ih. - */ - public ExceptionHandler[] getExceptionHandlers(InstructionHandle ih){ - Set hs = exceptionhandlers.get(ih); - if (hs == null) { + /** + * The ExceptionHandler instances. + * Key: InstructionHandle objects, Values: HashSet instances. + */ + private Map> exceptionhandlers; + + /** + * Constructor. Creates a new ExceptionHandlers instance. + */ + public ExceptionHandlers(MethodGen mg){ + exceptionhandlers = new HashMap>(); + CodeExceptionGen[] cegs = mg.getExceptionHandlers(); + for (CodeExceptionGen ceg : cegs) { + ExceptionHandler eh = new ExceptionHandler(ceg.getCatchType(), ceg.getHandlerPC()); + for (InstructionHandle ih=ceg.getStartPC(); ih != ceg.getEndPC().getNext(); ih=ih.getNext()){ + Set hs; + hs = exceptionhandlers.get(ih); + if (hs == null){ + hs = new HashSet(); + exceptionhandlers.put(ih, hs); + } + hs.add(eh); + } + } + } + + /** + * Returns all the ExceptionHandler instances representing exception + * handlers that protect the instruction ih. + */ + public ExceptionHandler[] getExceptionHandlers(InstructionHandle ih){ + Set hs = exceptionhandlers.get(ih); + if (hs == null) { return new ExceptionHandler[0]; } else{ - ExceptionHandler[] ret = new ExceptionHandler[hs.size()]; - return hs.toArray(ret); - } - } + ExceptionHandler[] ret = new ExceptionHandler[hs.size()]; + return hs.toArray(ret); + } + } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index 4c9379fa..409242a6 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -58,1190 +58,1190 @@ import org.apache.bcel.generic.*; */ public class ExecutionVisitor extends EmptyVisitor{ - /** - * The executionframe we're operating on. - */ - private Frame frame = null; + /** + * The executionframe we're operating on. + */ + private Frame frame = null; - /** - * The ConstantPoolGen we're working with. - * @see #setConstantPoolGen(ConstantPoolGen) - */ - private ConstantPoolGen cpg = null; + /** + * The ConstantPoolGen we're working with. + * @see #setConstantPoolGen(ConstantPoolGen) + */ + private ConstantPoolGen cpg = null; - /** - * Constructor. Constructs a new instance of this class. - */ - public ExecutionVisitor(){} + /** + * Constructor. Constructs a new instance of this class. + */ + public ExecutionVisitor(){} - /** - * The OperandStack from the current Frame we're operating on. - * @see #setFrame(Frame) - */ - private OperandStack stack(){ - return frame.getStack(); - } + /** + * The OperandStack from the current Frame we're operating on. + * @see #setFrame(Frame) + */ + private OperandStack stack(){ + return frame.getStack(); + } - /** - * The LocalVariables from the current Frame we're operating on. - * @see #setFrame(Frame) - */ - private LocalVariables locals(){ - return frame.getLocals(); - } + /** + * The LocalVariables from the current Frame we're operating on. + * @see #setFrame(Frame) + */ + private LocalVariables locals(){ + return frame.getLocals(); + } - /** - * Sets the ConstantPoolGen needed for symbolic execution. - */ - public void setConstantPoolGen(ConstantPoolGen cpg){ - this.cpg = cpg; - } - - /** - * The only method granting access to the single instance of - * the ExecutionVisitor class. Before actively using this - * instance, SET THE ConstantPoolGen FIRST. - * @see #setConstantPoolGen(ConstantPoolGen) - */ - public void setFrame(Frame f){ - this.frame = f; - } + /** + * Sets the ConstantPoolGen needed for symbolic execution. + */ + public void setConstantPoolGen(ConstantPoolGen cpg){ + this.cpg = cpg; + } - ///** Symbolically executes the corresponding Java Virtual Machine instruction. */ - //public void visitWIDE(WIDE o){ - // The WIDE instruction is modelled as a flag - // of the embedded instructions in BCEL. - // Therefore BCEL checks for possible errors - // when parsing in the .class file: We don't - // have even the possibilty to care for WIDE - // here. - //} + /** + * The only method granting access to the single instance of + * the ExecutionVisitor class. Before actively using this + * instance, SET THE ConstantPoolGen FIRST. + * @see #setConstantPoolGen(ConstantPoolGen) + */ + public void setFrame(Frame f){ + this.frame = f; + } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + ///** Symbolically executes the corresponding Java Virtual Machine instruction. */ + //public void visitWIDE(WIDE o){ + // The WIDE instruction is modelled as a flag + // of the embedded instructions in BCEL. + // Therefore BCEL checks for possible errors + // when parsing in the .class file: We don't + // have even the possibilty to care for WIDE + // here. + //} + + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitAALOAD(AALOAD o){ - stack().pop(); // pop the index int + stack().pop(); // pop the index int //System.out.print(stack().peek()); - Type t = stack().pop(); // Pop Array type - if (t == Type.NULL){ - stack().push(Type.NULL); - } // Do nothing stackwise --- a NullPointerException is thrown at Run-Time - else{ - ArrayType at = (ArrayType) t; - stack().push(at.getElementType()); - } - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + Type t = stack().pop(); // Pop Array type + if (t == Type.NULL){ + stack().push(Type.NULL); + } // Do nothing stackwise --- a NullPointerException is thrown at Run-Time + else{ + ArrayType at = (ArrayType) t; + stack().push(at.getElementType()); + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitAASTORE(AASTORE o){ - stack().pop(); - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitACONST_NULL(ACONST_NULL o){ - stack().push(Type.NULL); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().push(Type.NULL); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitALOAD(ALOAD o){ - stack().push(locals().get(o.getIndex())); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().push(locals().get(o.getIndex())); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitANEWARRAY(ANEWARRAY o){ - stack().pop(); //count - stack().push( new ArrayType(o.getType(cpg), 1) ); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); //count + stack().push( new ArrayType(o.getType(cpg), 1) ); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitARETURN(ARETURN o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitARRAYLENGTH(ARRAYLENGTH o){ - stack().pop(); - stack().push(Type.INT); - } + stack().pop(); + stack().push(Type.INT); + } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitASTORE(ASTORE o){ - locals().set(o.getIndex(), stack().pop()); - //System.err.println("TODO-DEBUG: set LV '"+o.getIndex()+"' to '"+locals().get(o.getIndex())+"'."); - } + locals().set(o.getIndex(), stack().pop()); + //System.err.println("TODO-DEBUG: set LV '"+o.getIndex()+"' to '"+locals().get(o.getIndex())+"'."); + } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitATHROW(ATHROW o){ - Type t = stack().pop(); - stack().clear(); - if (t.equals(Type.NULL)) { + Type t = stack().pop(); + stack().clear(); + if (t.equals(Type.NULL)) { stack().push(Type.getType("Ljava/lang/NullPointerException;")); } else { stack().push(t); } - } + } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitBALOAD(BALOAD o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitBASTORE(BASTORE o){ - stack().pop(); - stack().pop(); - stack().pop(); - } + stack().pop(); + stack().pop(); + stack().pop(); + } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitBIPUSH(BIPUSH o){ - stack().push(Type.INT); - } + stack().push(Type.INT); + } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitCALOAD(CALOAD o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitCASTORE(CASTORE o){ - stack().pop(); - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitCHECKCAST(CHECKCAST o){ - // It's possibly wrong to do so, but SUN's - // ByteCode verifier seems to do (only) this, too. - // TODO: One could use a sophisticated analysis here to check - // if a type cannot possibly be cated to another and by - // so doing predict the ClassCastException at run-time. - stack().pop(); - stack().push(o.getType(cpg)); - } + // It's possibly wrong to do so, but SUN's + // ByteCode verifier seems to do (only) this, too. + // TODO: One could use a sophisticated analysis here to check + // if a type cannot possibly be cated to another and by + // so doing predict the ClassCastException at run-time. + stack().pop(); + stack().push(o.getType(cpg)); + } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitD2F(D2F o){ - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitD2I(D2I o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitD2L(D2L o){ - stack().pop(); - stack().push(Type.LONG); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.LONG); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDADD(DADD o){ - stack().pop(); - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDALOAD(DALOAD o){ - stack().pop(); - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDASTORE(DASTORE o){ - stack().pop(); - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDCMPG(DCMPG o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDCMPL(DCMPL o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDCONST(DCONST o){ - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDDIV(DDIV o){ - stack().pop(); - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDLOAD(DLOAD o){ - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDMUL(DMUL o){ - stack().pop(); - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDNEG(DNEG o){ - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDREM(DREM o){ - stack().pop(); - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDRETURN(DRETURN o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDSTORE(DSTORE o){ - locals().set(o.getIndex(), stack().pop()); - locals().set(o.getIndex()+1, Type.UNKNOWN); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + locals().set(o.getIndex(), stack().pop()); + locals().set(o.getIndex()+1, Type.UNKNOWN); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDSUB(DSUB o){ - stack().pop(); - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDUP(DUP o){ - Type t = stack().pop(); - stack().push(t); - stack().push(t); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + Type t = stack().pop(); + stack().push(t); + stack().push(t); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDUP_X1(DUP_X1 o){ - Type w1 = stack().pop(); - Type w2 = stack().pop(); - stack().push(w1); - stack().push(w2); - stack().push(w1); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + Type w1 = stack().pop(); + Type w2 = stack().pop(); + stack().push(w1); + stack().push(w2); + stack().push(w1); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDUP_X2(DUP_X2 o){ - Type w1 = stack().pop(); - Type w2 = stack().pop(); - if (w2.getSize() == 2){ - stack().push(w1); - stack().push(w2); - stack().push(w1); - } - else{ - Type w3 = stack().pop(); - stack().push(w1); - stack().push(w3); - stack().push(w2); - stack().push(w1); - } - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + Type w1 = stack().pop(); + Type w2 = stack().pop(); + if (w2.getSize() == 2){ + stack().push(w1); + stack().push(w2); + stack().push(w1); + } + else{ + Type w3 = stack().pop(); + stack().push(w1); + stack().push(w3); + stack().push(w2); + stack().push(w1); + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDUP2(DUP2 o){ - Type t = stack().pop(); - if (t.getSize() == 2){ - stack().push(t); - stack().push(t); - } - else{ // t.getSize() is 1 - Type u = stack().pop(); - stack().push(u); - stack().push(t); - stack().push(u); - stack().push(t); - } - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + Type t = stack().pop(); + if (t.getSize() == 2){ + stack().push(t); + stack().push(t); + } + else{ // t.getSize() is 1 + Type u = stack().pop(); + stack().push(u); + stack().push(t); + stack().push(u); + stack().push(t); + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDUP2_X1(DUP2_X1 o){ - Type t = stack().pop(); - if (t.getSize() == 2){ - Type u = stack().pop(); - stack().push(t); - stack().push(u); - stack().push(t); - } - else{ //t.getSize() is1 - Type u = stack().pop(); - Type v = stack().pop(); - stack().push(u); - stack().push(t); - stack().push(v); - stack().push(u); - stack().push(t); - } - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + Type t = stack().pop(); + if (t.getSize() == 2){ + Type u = stack().pop(); + stack().push(t); + stack().push(u); + stack().push(t); + } + else{ //t.getSize() is1 + Type u = stack().pop(); + Type v = stack().pop(); + stack().push(u); + stack().push(t); + stack().push(v); + stack().push(u); + stack().push(t); + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitDUP2_X2(DUP2_X2 o){ - Type t = stack().pop(); - if (t.getSize() == 2){ - Type u = stack().pop(); - if (u.getSize() == 2){ - stack().push(t); - stack().push(u); - stack().push(t); - }else{ - Type v = stack().pop(); - stack().push(t); - stack().push(v); - stack().push(u); - stack().push(t); - } - } - else{ //t.getSize() is 1 - Type u = stack().pop(); - Type v = stack().pop(); - if (v.getSize() == 2){ - stack().push(u); - stack().push(t); - stack().push(v); - stack().push(u); - stack().push(t); - }else{ - Type w = stack().pop(); - stack().push(u); - stack().push(t); - stack().push(w); - stack().push(v); - stack().push(u); - stack().push(t); - } - } - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + Type t = stack().pop(); + if (t.getSize() == 2){ + Type u = stack().pop(); + if (u.getSize() == 2){ + stack().push(t); + stack().push(u); + stack().push(t); + }else{ + Type v = stack().pop(); + stack().push(t); + stack().push(v); + stack().push(u); + stack().push(t); + } + } + else{ //t.getSize() is 1 + Type u = stack().pop(); + Type v = stack().pop(); + if (v.getSize() == 2){ + stack().push(u); + stack().push(t); + stack().push(v); + stack().push(u); + stack().push(t); + }else{ + Type w = stack().pop(); + stack().push(u); + stack().push(t); + stack().push(w); + stack().push(v); + stack().push(u); + stack().push(t); + } + } + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitF2D(F2D o){ - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitF2I(F2I o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitF2L(F2L o){ - stack().pop(); - stack().push(Type.LONG); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.LONG); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFADD(FADD o){ - stack().pop(); - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFALOAD(FALOAD o){ - stack().pop(); - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFASTORE(FASTORE o){ - stack().pop(); - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFCMPG(FCMPG o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFCMPL(FCMPL o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFCONST(FCONST o){ - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFDIV(FDIV o){ - stack().pop(); - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFLOAD(FLOAD o){ - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFMUL(FMUL o){ - stack().pop(); - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFNEG(FNEG o){ - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFREM(FREM o){ - stack().pop(); - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFRETURN(FRETURN o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFSTORE(FSTORE o){ - locals().set(o.getIndex(), stack().pop()); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + locals().set(o.getIndex(), stack().pop()); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitFSUB(FSUB o){ - stack().pop(); - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitGETFIELD(GETFIELD o){ - stack().pop(); - Type t = o.getFieldType(cpg); - if ( t.equals(Type.BOOLEAN) || - t.equals(Type.CHAR) || - t.equals(Type.BYTE) || - t.equals(Type.SHORT) ) { + stack().pop(); + Type t = o.getFieldType(cpg); + if ( t.equals(Type.BOOLEAN) || + t.equals(Type.CHAR) || + t.equals(Type.BYTE) || + t.equals(Type.SHORT) ) { t = Type.INT; } - stack().push(t); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().push(t); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitGETSTATIC(GETSTATIC o){ - Type t = o.getFieldType(cpg); - if ( t.equals(Type.BOOLEAN) || - t.equals(Type.CHAR) || - t.equals(Type.BYTE) || - t.equals(Type.SHORT) ) { + Type t = o.getFieldType(cpg); + if ( t.equals(Type.BOOLEAN) || + t.equals(Type.CHAR) || + t.equals(Type.BYTE) || + t.equals(Type.SHORT) ) { t = Type.INT; } - stack().push(t); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().push(t); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitGOTO(GOTO o){ - // no stack changes. - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + // no stack changes. + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitGOTO_W(GOTO_W o){ - // no stack changes. - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + // no stack changes. + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitI2B(I2B o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitI2C(I2C o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitI2D(I2D o){ - stack().pop(); - stack().push(Type.DOUBLE); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.DOUBLE); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitI2F(I2F o){ - stack().pop(); - stack().push(Type.FLOAT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.FLOAT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitI2L(I2L o){ - stack().pop(); - stack().push(Type.LONG); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.LONG); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitI2S(I2S o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIADD(IADD o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIALOAD(IALOAD o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIAND(IAND o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIASTORE(IASTORE o){ - stack().pop(); - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitICONST(ICONST o){ - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIDIV(IDIV o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIF_ACMPEQ(IF_ACMPEQ o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIF_ACMPNE(IF_ACMPNE o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIF_ICMPEQ(IF_ICMPEQ o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIF_ICMPGE(IF_ICMPGE o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIF_ICMPGT(IF_ICMPGT o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIF_ICMPLE(IF_ICMPLE o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIF_ICMPLT(IF_ICMPLT o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIF_ICMPNE(IF_ICMPNE o){ - stack().pop(); - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIFEQ(IFEQ o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIFGE(IFGE o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIFGT(IFGT o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIFLE(IFLE o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIFLT(IFLT o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIFNE(IFNE o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIFNONNULL(IFNONNULL o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIFNULL(IFNULL o){ - stack().pop(); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIINC(IINC o){ - // stack is not changed. - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + // stack is not changed. + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitILOAD(ILOAD o){ - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitIMUL(IMUL o){ - stack().pop(); - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitINEG(INEG o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitINSTANCEOF(INSTANCEOF o){ - stack().pop(); - stack().push(Type.INT); - } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ - @Override + stack().pop(); + stack().push(Type.INT); + } + /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + @Override public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ - stack().pop(); //objectref - for (int i=0; i stack().slotsUsed()){ - constraintViolated(o, "Cannot consume "+consume+" stack slots: only "+stack().slotsUsed()+" slot(s) left on stack!\nStack:\n"+stack()); - } - - int produce = o.produceStack(cpg) - o.consumeStack(cpg); // Stack values are always consumed first; then produced. - if ( produce + stack().slotsUsed() > stack().maxStack() ){ - constraintViolated(o, "Cannot produce "+produce+" stack slots: only "+(stack().maxStack()-stack().slotsUsed())+" free stack slot(s) left.\nStack:\n"+stack()); - } - } - - /***************************************************************/ - /* "generic"visitXXXX methods where XXXX is an interface */ - /* therefore, we don't know the order of visiting; but we know */ - /* these methods are called before the visitYYYY methods below */ - /***************************************************************/ - - /** - * Assures the generic preconditions of a LoadClass instance. - * The referenced class is loaded and pass2-verified. - */ - @Override + return (arrayref instanceof ArrayType); + } + + /***************************************************************/ + /* MISC */ + /***************************************************************/ + /** + * Ensures the general preconditions of an instruction that accesses the stack. + * This method is here because BCEL has no such superinterface for the stack + * accessing instructions; and there are funny unexpected exceptions in the + * semantices of the superinterfaces and superclasses provided. + * E.g. SWAP is a StackConsumer, but DUP_X1 is not a StackProducer. + * Therefore, this method is called by all StackProducer, StackConsumer, + * and StackInstruction instances via their visitXXX() method. + * Unfortunately, as the superclasses and superinterfaces overlap, some instructions + * cause this method to be called two or three times. [TODO: Fix this.] + * + * @see #visitStackConsumer(StackConsumer o) + * @see #visitStackProducer(StackProducer o) + * @see #visitStackInstruction(StackInstruction o) + */ + private void _visitStackAccessor(Instruction o){ + int consume = o.consumeStack(cpg); // Stack values are always consumed first; then produced. + if (consume > stack().slotsUsed()){ + constraintViolated(o, "Cannot consume "+consume+" stack slots: only "+stack().slotsUsed()+" slot(s) left on stack!\nStack:\n"+stack()); + } + + int produce = o.produceStack(cpg) - o.consumeStack(cpg); // Stack values are always consumed first; then produced. + if ( produce + stack().slotsUsed() > stack().maxStack() ){ + constraintViolated(o, "Cannot produce "+produce+" stack slots: only "+(stack().maxStack()-stack().slotsUsed())+" free stack slot(s) left.\nStack:\n"+stack()); + } + } + + /***************************************************************/ + /* "generic"visitXXXX methods where XXXX is an interface */ + /* therefore, we don't know the order of visiting; but we know */ + /* these methods are called before the visitYYYY methods below */ + /***************************************************************/ + + /** + * Assures the generic preconditions of a LoadClass instance. + * The referenced class is loaded and pass2-verified. + */ + @Override public void visitLoadClass(LoadClass o){ - ObjectType t = o.getLoadClassType(cpg); - if (t != null){// null means "no class is loaded" - Verifier v = VerifierFactory.getVerifier(t.getClassName()); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); - } - } - } - - /** - * Ensures the general preconditions of a StackConsumer instance. - */ - @Override + ObjectType t = o.getLoadClassType(cpg); + if (t != null){// null means "no class is loaded" + Verifier v = VerifierFactory.getVerifier(t.getClassName()); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + } + + /** + * Ensures the general preconditions of a StackConsumer instance. + */ + @Override public void visitStackConsumer(StackConsumer o){ - _visitStackAccessor((Instruction) o); - } - - /** - * Ensures the general preconditions of a StackProducer instance. - */ - @Override + _visitStackAccessor((Instruction) o); + } + + /** + * Ensures the general preconditions of a StackProducer instance. + */ + @Override public void visitStackProducer(StackProducer o){ - _visitStackAccessor((Instruction) o); - } - - - /***************************************************************/ - /* "generic" visitYYYY methods where YYYY is a superclass. */ - /* therefore, we know the order of visiting; we know */ - /* these methods are called after the visitXXXX methods above. */ - /***************************************************************/ - /** - * Ensures the general preconditions of a CPInstruction instance. - */ - @Override + _visitStackAccessor((Instruction) o); + } + + + /***************************************************************/ + /* "generic" visitYYYY methods where YYYY is a superclass. */ + /* therefore, we know the order of visiting; we know */ + /* these methods are called after the visitXXXX methods above. */ + /***************************************************************/ + /** + * Ensures the general preconditions of a CPInstruction instance. + */ + @Override public void visitCPInstruction(CPInstruction o){ - int idx = o.getIndex(); - if ((idx < 0) || (idx >= cpg.getSize())){ - throw new AssertionViolatedException("Huh?! Constant pool index of instruction '"+o+"' illegal? Pass 3a should have checked this!"); - } - } - - /** - * Ensures the general preconditions of a FieldInstruction instance. - */ - @Override + int idx = o.getIndex(); + if ((idx < 0) || (idx >= cpg.getSize())){ + throw new AssertionViolatedException("Huh?! Constant pool index of instruction '"+o+"' illegal? Pass 3a should have checked this!"); + } + } + + /** + * Ensures the general preconditions of a FieldInstruction instance. + */ + @Override public void visitFieldInstruction(FieldInstruction o){ - // visitLoadClass(o) has been called before: Every FieldOrMethod - // implements LoadClass. - // visitCPInstruction(o) has been called before. - // A FieldInstruction may be: GETFIELD, GETSTATIC, PUTFIELD, PUTSTATIC - Constant c = cpg.getConstant(o.getIndex()); - if (!(c instanceof ConstantFieldref)){ - constraintViolated(o, "Index '"+o.getIndex()+"' should refer to a CONSTANT_Fieldref_info structure, but refers to '"+c+"'."); - } - // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). - Type t = o.getType(cpg); - if (t instanceof ObjectType){ - String name = ((ObjectType)t).getClassName(); - Verifier v = VerifierFactory.getVerifier( name ); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); - } - } - } - - /** - * Ensures the general preconditions of an InvokeInstruction instance. - */ - @Override + // visitLoadClass(o) has been called before: Every FieldOrMethod + // implements LoadClass. + // visitCPInstruction(o) has been called before. + // A FieldInstruction may be: GETFIELD, GETSTATIC, PUTFIELD, PUTSTATIC + Constant c = cpg.getConstant(o.getIndex()); + if (!(c instanceof ConstantFieldref)){ + constraintViolated(o, "Index '"+o.getIndex()+"' should refer to a CONSTANT_Fieldref_info structure, but refers to '"+c+"'."); + } + // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). + Type t = o.getType(cpg); + if (t instanceof ObjectType){ + String name = ((ObjectType)t).getClassName(); + Verifier v = VerifierFactory.getVerifier( name ); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + } + + /** + * Ensures the general preconditions of an InvokeInstruction instance. + */ + @Override public void visitInvokeInstruction(InvokeInstruction o){ - // visitLoadClass(o) has been called before: Every FieldOrMethod - // implements LoadClass. - // visitCPInstruction(o) has been called before. + // visitLoadClass(o) has been called before: Every FieldOrMethod + // implements LoadClass. + // visitCPInstruction(o) has been called before. //TODO - } - - /** - * Ensures the general preconditions of a StackInstruction instance. - */ - @Override + } + + /** + * Ensures the general preconditions of a StackInstruction instance. + */ + @Override public void visitStackInstruction(StackInstruction o){ - _visitStackAccessor(o); - } - - /** - * Assures the generic preconditions of a LocalVariableInstruction instance. - * That is, the index of the local variable must be valid. - */ - @Override + _visitStackAccessor(o); + } + + /** + * Assures the generic preconditions of a LocalVariableInstruction instance. + * That is, the index of the local variable must be valid. + */ + @Override public void visitLocalVariableInstruction(LocalVariableInstruction o){ - if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ - constraintViolated(o, "The 'index' is not a valid index into the local variable array."); - } - } - - /** - * Assures the generic preconditions of a LoadInstruction instance. - */ - @Override + if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ + constraintViolated(o, "The 'index' is not a valid index into the local variable array."); + } + } + + /** + * Assures the generic preconditions of a LoadInstruction instance. + */ + @Override public void visitLoadInstruction(LoadInstruction o){ - //visitLocalVariableInstruction(o) is called before, because it is more generic. - - // LOAD instructions must not read Type.UNKNOWN - if (locals().get(o.getIndex()) == Type.UNKNOWN){ - constraintViolated(o, "Read-Access on local variable "+o.getIndex()+" with unknown content."); - } - - // LOAD instructions, two-slot-values at index N must have Type.UNKNOWN - // as a symbol for the higher halve at index N+1 - // [suppose some instruction put an int at N+1--- our double at N is defective] - if (o.getType(cpg).getSize() == 2){ - if (locals().get(o.getIndex()+1) != Type.UNKNOWN){ - constraintViolated(o, "Reading a two-locals value from local variables "+o.getIndex()+" and "+(o.getIndex()+1)+" where the latter one is destroyed."); - } - } - - // LOAD instructions must read the correct type. - if (!(o instanceof ALOAD)){ - if (locals().get(o.getIndex()) != o.getType(cpg) ){ - constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+locals().get(o.getIndex())+"'; Instruction type: '"+o.getType(cpg)+"'."); - } - } - else{ // we deal with an ALOAD - if (!(locals().get(o.getIndex()) instanceof ReferenceType)){ - constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+locals().get(o.getIndex())+"'; Instruction expects a ReferenceType."); - } - // ALOAD __IS ALLOWED__ to put uninitialized objects onto the stack! - //referenceTypeIsInitialized(o, (ReferenceType) (locals().get(o.getIndex()))); - } - - // LOAD instructions must have enough free stack slots. - if ((stack().maxStack() - stack().slotsUsed()) < o.getType(cpg).getSize()){ - constraintViolated(o, "Not enough free stack slots to load a '"+o.getType(cpg)+"' onto the OperandStack."); - } - } - - /** - * Assures the generic preconditions of a StoreInstruction instance. - */ - @Override + //visitLocalVariableInstruction(o) is called before, because it is more generic. + + // LOAD instructions must not read Type.UNKNOWN + if (locals().get(o.getIndex()) == Type.UNKNOWN){ + constraintViolated(o, "Read-Access on local variable "+o.getIndex()+" with unknown content."); + } + + // LOAD instructions, two-slot-values at index N must have Type.UNKNOWN + // as a symbol for the higher halve at index N+1 + // [suppose some instruction put an int at N+1--- our double at N is defective] + if (o.getType(cpg).getSize() == 2){ + if (locals().get(o.getIndex()+1) != Type.UNKNOWN){ + constraintViolated(o, "Reading a two-locals value from local variables "+o.getIndex()+" and "+(o.getIndex()+1)+" where the latter one is destroyed."); + } + } + + // LOAD instructions must read the correct type. + if (!(o instanceof ALOAD)){ + if (locals().get(o.getIndex()) != o.getType(cpg) ){ + constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+locals().get(o.getIndex())+"'; Instruction type: '"+o.getType(cpg)+"'."); + } + } + else{ // we deal with an ALOAD + if (!(locals().get(o.getIndex()) instanceof ReferenceType)){ + constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+locals().get(o.getIndex())+"'; Instruction expects a ReferenceType."); + } + // ALOAD __IS ALLOWED__ to put uninitialized objects onto the stack! + //referenceTypeIsInitialized(o, (ReferenceType) (locals().get(o.getIndex()))); + } + + // LOAD instructions must have enough free stack slots. + if ((stack().maxStack() - stack().slotsUsed()) < o.getType(cpg).getSize()){ + constraintViolated(o, "Not enough free stack slots to load a '"+o.getType(cpg)+"' onto the OperandStack."); + } + } + + /** + * Assures the generic preconditions of a StoreInstruction instance. + */ + @Override public void visitStoreInstruction(StoreInstruction o){ - //visitLocalVariableInstruction(o) is called before, because it is more generic. - - if (stack().isEmpty()){ // Don't bother about 1 or 2 stack slots used. This check is implicitely done below while type checking. - constraintViolated(o, "Cannot STORE: Stack to read from is empty."); - } - - if ( (!(o instanceof ASTORE)) ){ - if (! (stack().peek() == o.getType(cpg)) ){// the other xSTORE types are singletons in BCEL. - constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction type: '"+o.getType(cpg)+"'."); - } - } - else{ // we deal with ASTORE - Type stacktop = stack().peek(); - if ( (!(stacktop instanceof ReferenceType)) && (!(stacktop instanceof ReturnaddressType)) ){ - constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction expects a ReferenceType or a ReturnadressType."); - } - //if (stacktop instanceof ReferenceType){ - // referenceTypeIsInitialized(o, (ReferenceType) stacktop); - //} - } - } - - /** - * Assures the generic preconditions of a ReturnInstruction instance. - */ - @Override + //visitLocalVariableInstruction(o) is called before, because it is more generic. + + if (stack().isEmpty()){ // Don't bother about 1 or 2 stack slots used. This check is implicitely done below while type checking. + constraintViolated(o, "Cannot STORE: Stack to read from is empty."); + } + + if ( (!(o instanceof ASTORE)) ){ + if (! (stack().peek() == o.getType(cpg)) ){// the other xSTORE types are singletons in BCEL. + constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction type: '"+o.getType(cpg)+"'."); + } + } + else{ // we deal with ASTORE + Type stacktop = stack().peek(); + if ( (!(stacktop instanceof ReferenceType)) && (!(stacktop instanceof ReturnaddressType)) ){ + constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction expects a ReferenceType or a ReturnadressType."); + } + //if (stacktop instanceof ReferenceType){ + // referenceTypeIsInitialized(o, (ReferenceType) stacktop); + //} + } + } + + /** + * Assures the generic preconditions of a ReturnInstruction instance. + */ + @Override public void visitReturnInstruction(ReturnInstruction o){ - Type method_type = mg.getType(); - if (method_type == Type.BOOLEAN || - method_type == Type.BYTE || - method_type == Type.SHORT || - method_type == Type.CHAR){ - method_type = Type.INT; - } + Type method_type = mg.getType(); + if (method_type == Type.BOOLEAN || + method_type == Type.BYTE || + method_type == Type.SHORT || + method_type == Type.CHAR){ + method_type = Type.INT; + } if (o instanceof RETURN){ if (method_type != Type.VOID){ constraintViolated(o, "RETURN instruction in non-void method."); } else{ - return; + return; + } + } + if (o instanceof ARETURN){ + if (stack().peek() == Type.NULL){ + return; + } + else{ + if (! (stack().peek() instanceof ReferenceType)){ + constraintViolated(o, "Reference type expected on top of stack, but is: '"+stack().peek()+"'."); + } + referenceTypeIsInitialized(o, (ReferenceType) (stack().peek())); + //ReferenceType objectref = (ReferenceType) (stack().peek()); + // TODO: This can only be checked if using Staerk-et-al's "set of object types" instead of a + // "wider cast object type" created during verification. + //if (! (objectref.isAssignmentCompatibleWith(mg.getType())) ){ + // constraintViolated(o, "Type on stack top which should be returned is a '"+stack().peek()+"' which is not assignment compatible with the return type of this method, '"+mg.getType()+"'."); + //} + } + } + else{ + if (! ( method_type.equals( stack().peek() ))){ + constraintViolated(o, "Current method has return type of '"+mg.getType()+"' expecting a '"+method_type+"' on top of the stack. But stack top is a '"+stack().peek()+"'."); } - } - if (o instanceof ARETURN){ - if (stack().peek() == Type.NULL){ - return; - } - else{ - if (! (stack().peek() instanceof ReferenceType)){ - constraintViolated(o, "Reference type expected on top of stack, but is: '"+stack().peek()+"'."); - } - referenceTypeIsInitialized(o, (ReferenceType) (stack().peek())); - //ReferenceType objectref = (ReferenceType) (stack().peek()); - // TODO: This can only be checked if using Staerk-et-al's "set of object types" instead of a - // "wider cast object type" created during verification. - //if (! (objectref.isAssignmentCompatibleWith(mg.getType())) ){ - // constraintViolated(o, "Type on stack top which should be returned is a '"+stack().peek()+"' which is not assignment compatible with the return type of this method, '"+mg.getType()+"'."); - //} - } - } - else{ - if (! ( method_type.equals( stack().peek() ))){ - constraintViolated(o, "Current method has return type of '"+mg.getType()+"' expecting a '"+method_type+"' on top of the stack. But stack top is a '"+stack().peek()+"'."); - } - } - } - - /***************************************************************/ - /* "special"visitXXXX methods for one type of instruction each */ - /***************************************************************/ - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + } + } + + /***************************************************************/ + /* "special"visitXXXX methods for one type of instruction each */ + /***************************************************************/ + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitAALOAD(AALOAD o){ - Type arrayref = stack().peek(1); - Type index = stack().peek(0); - - indexOfInt(o, index); - if (arrayrefOfArrayType(o, arrayref)){ - if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); - } - //referenceTypeIsInitialized(o, (ReferenceType) (((ArrayType) arrayref).getElementType())); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + Type arrayref = stack().peek(1); + Type index = stack().peek(0); + + indexOfInt(o, index); + if (arrayrefOfArrayType(o, arrayref)){ + if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); + } + //referenceTypeIsInitialized(o, (ReferenceType) (((ArrayType) arrayref).getElementType())); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitAASTORE(AASTORE o){ - try { - Type arrayref = stack().peek(2); - Type index = stack().peek(1); - Type value = stack().peek(0); - - indexOfInt(o, index); - if (!(value instanceof ReferenceType)){ - constraintViolated(o, "The 'value' is not of a ReferenceType but of type "+value+"."); - }else{ - //referenceTypeIsInitialized(o, (ReferenceType) value); - } - // Don't bother further with "referenceTypeIsInitialized()", there are no arrays - // of an uninitialized object type. - if (arrayrefOfArrayType(o, arrayref)){ - if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); - } - if (! ((ReferenceType)value).isAssignmentCompatibleWith(((ArrayType) arrayref).getElementType())){ - constraintViolated(o, "The type of 'value' ('"+value+"') is not assignment compatible to the components of the array 'arrayref' refers to. ('"+((ArrayType) arrayref).getElementType()+"')"); - } - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + try { + Type arrayref = stack().peek(2); + Type index = stack().peek(1); + Type value = stack().peek(0); + + indexOfInt(o, index); + if (!(value instanceof ReferenceType)){ + constraintViolated(o, "The 'value' is not of a ReferenceType but of type "+value+"."); + }else{ + //referenceTypeIsInitialized(o, (ReferenceType) value); + } + // Don't bother further with "referenceTypeIsInitialized()", there are no arrays + // of an uninitialized object type. + if (arrayrefOfArrayType(o, arrayref)){ + if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); + } + if (! ((ReferenceType)value).isAssignmentCompatibleWith(((ArrayType) arrayref).getElementType())){ + constraintViolated(o, "The type of 'value' ('"+value+"') is not assignment compatible to the components of the array 'arrayref' refers to. ('"+((ArrayType) arrayref).getElementType()+"')"); + } + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitACONST_NULL(ACONST_NULL o){ - // Nothing needs to be done here. - } + // Nothing needs to be done here. + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitALOAD(ALOAD o){ - //visitLoadInstruction(LoadInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + //visitLoadInstruction(LoadInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitANEWARRAY(ANEWARRAY o){ - if (!stack().peek().equals(Type.INT)) { + if (!stack().peek().equals(Type.INT)) { constraintViolated(o, "The 'count' at the stack top is not of type '"+Type.INT+"' but of type '"+stack().peek()+"'."); - // The runtime constant pool item at that index must be a symbolic reference to a class, - // array, or interface type. See Pass 3a. - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + // The runtime constant pool item at that index must be a symbolic reference to a class, + // array, or interface type. See Pass 3a. + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitARETURN(ARETURN o){ - if (! (stack().peek() instanceof ReferenceType) ){ - constraintViolated(o, "The 'objectref' at the stack top is not of a ReferenceType but of type '"+stack().peek()+"'."); - } - ReferenceType objectref = (ReferenceType) (stack().peek()); - referenceTypeIsInitialized(o, objectref); - - // The check below should already done via visitReturnInstruction(ReturnInstruction), see there. - // It cannot be done using Staerk-et-al's "set of object types" instead of a - // "wider cast object type", anyway. - //if (! objectref.isAssignmentCompatibleWith(mg.getReturnType() )){ - // constraintViolated(o, "The 'objectref' type "+objectref+" at the stack top is not assignment compatible with the return type '"+mg.getReturnType()+"' of the method."); - //} - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (! (stack().peek() instanceof ReferenceType) ){ + constraintViolated(o, "The 'objectref' at the stack top is not of a ReferenceType but of type '"+stack().peek()+"'."); + } + ReferenceType objectref = (ReferenceType) (stack().peek()); + referenceTypeIsInitialized(o, objectref); + + // The check below should already done via visitReturnInstruction(ReturnInstruction), see there. + // It cannot be done using Staerk-et-al's "set of object types" instead of a + // "wider cast object type", anyway. + //if (! objectref.isAssignmentCompatibleWith(mg.getReturnType() )){ + // constraintViolated(o, "The 'objectref' type "+objectref+" at the stack top is not assignment compatible with the return type '"+mg.getReturnType()+"' of the method."); + //} + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitARRAYLENGTH(ARRAYLENGTH o){ - Type arrayref = stack().peek(0); - arrayrefOfArrayType(o, arrayref); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + Type arrayref = stack().peek(0); + arrayrefOfArrayType(o, arrayref); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitASTORE(ASTORE o){ - if (! ( (stack().peek() instanceof ReferenceType) || (stack().peek() instanceof ReturnaddressType) ) ){ - constraintViolated(o, "The 'objectref' is not of a ReferenceType or of ReturnaddressType but of "+stack().peek()+"."); - } - //if (stack().peek() instanceof ReferenceType){ - // referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); - //} - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (! ( (stack().peek() instanceof ReferenceType) || (stack().peek() instanceof ReturnaddressType) ) ){ + constraintViolated(o, "The 'objectref' is not of a ReferenceType or of ReturnaddressType but of "+stack().peek()+"."); + } + //if (stack().peek() instanceof ReferenceType){ + // referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + //} + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitATHROW(ATHROW o){ - try { - // It's stated that 'objectref' must be of a ReferenceType --- but since Throwable is - // not derived from an ArrayType, it follows that 'objectref' must be of an ObjectType or Type.NULL. - if (! ((stack().peek() instanceof ObjectType) || (stack().peek().equals(Type.NULL))) ){ - constraintViolated(o, "The 'objectref' is not of an (initialized) ObjectType but of type "+stack().peek()+"."); - } - - // NULL is a subclass of every class, so to speak. - if (stack().peek().equals(Type.NULL)) { + try { + // It's stated that 'objectref' must be of a ReferenceType --- but since Throwable is + // not derived from an ArrayType, it follows that 'objectref' must be of an ObjectType or Type.NULL. + if (! ((stack().peek() instanceof ObjectType) || (stack().peek().equals(Type.NULL))) ){ + constraintViolated(o, "The 'objectref' is not of an (initialized) ObjectType but of type "+stack().peek()+"."); + } + + // NULL is a subclass of every class, so to speak. + if (stack().peek().equals(Type.NULL)) { return; } - - ObjectType exc = (ObjectType) (stack().peek()); - ObjectType throwable = (ObjectType) (Type.getType("Ljava/lang/Throwable;")); - if ( (! (exc.subclassOf(throwable)) ) && (! (exc.equals(throwable))) ){ - constraintViolated(o, "The 'objectref' is not of class Throwable or of a subclass of Throwable, but of '"+stack().peek()+"'."); - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + + ObjectType exc = (ObjectType) (stack().peek()); + ObjectType throwable = (ObjectType) (Type.getType("Ljava/lang/Throwable;")); + if ( (! (exc.subclassOf(throwable)) ) && (! (exc.equals(throwable))) ){ + constraintViolated(o, "The 'objectref' is not of class Throwable or of a subclass of Throwable, but of '"+stack().peek()+"'."); + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitBALOAD(BALOAD o){ - Type arrayref = stack().peek(1); - Type index = stack().peek(0); - indexOfInt(o, index); - if (arrayrefOfArrayType(o, arrayref)){ - if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || - (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ){ - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + Type arrayref = stack().peek(1); + Type index = stack().peek(0); + indexOfInt(o, index); + if (arrayrefOfArrayType(o, arrayref)){ + if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || + (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ){ + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitBASTORE(BASTORE o){ - Type arrayref = stack().peek(2); - Type index = stack().peek(1); - Type value = stack().peek(0); - - indexOfInt(o, index); - valueOfInt(o, value); - if (arrayrefOfArrayType(o, arrayref)){ - if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || - (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ) { + Type arrayref = stack().peek(2); + Type index = stack().peek(1); + Type value = stack().peek(0); + + indexOfInt(o, index); + valueOfInt(o, value); + if (arrayrefOfArrayType(o, arrayref)){ + if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || + (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ) { constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); } - } - } + } + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitBIPUSH(BIPUSH o){ - // Nothing to do... - } + // Nothing to do... + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitBREAKPOINT(BREAKPOINT o){ - throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as BREAKPOINT."); - } + throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as BREAKPOINT."); + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitCALOAD(CALOAD o){ - Type arrayref = stack().peek(1); - Type index = stack().peek(0); - - indexOfInt(o, index); - arrayrefOfArrayType(o, arrayref); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + Type arrayref = stack().peek(1); + Type index = stack().peek(0); + + indexOfInt(o, index); + arrayrefOfArrayType(o, arrayref); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitCASTORE(CASTORE o){ - Type arrayref = stack().peek(2); - Type index = stack().peek(1); - Type value = stack().peek(0); - - indexOfInt(o, index); - valueOfInt(o, value); - if (arrayrefOfArrayType(o, arrayref)){ - if (! ((ArrayType) arrayref).getElementType().equals(Type.CHAR) ){ - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of type char but to an array of type "+((ArrayType) arrayref).getElementType()+"."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + Type arrayref = stack().peek(2); + Type index = stack().peek(1); + Type value = stack().peek(0); + + indexOfInt(o, index); + valueOfInt(o, value); + if (arrayrefOfArrayType(o, arrayref)){ + if (! ((ArrayType) arrayref).getElementType().equals(Type.CHAR) ){ + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of type char but to an array of type "+((ArrayType) arrayref).getElementType()+"."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitCHECKCAST(CHECKCAST o){ - // The objectref must be of type reference. - Type objectref = stack().peek(0); - if (!(objectref instanceof ReferenceType)){ - constraintViolated(o, "The 'objectref' is not of a ReferenceType but of type "+objectref+"."); - } - //else{ - // referenceTypeIsInitialized(o, (ReferenceType) objectref); - //} - // The unsigned indexbyte1 and indexbyte2 are used to construct an index into the runtime constant pool of the - // current class (�3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant - // pool item at the index must be a symbolic reference to a class, array, or interface type. - Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ - constraintViolated(o, "The Constant at 'index' is not a ConstantClass, but '"+c+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + // The objectref must be of type reference. + Type objectref = stack().peek(0); + if (!(objectref instanceof ReferenceType)){ + constraintViolated(o, "The 'objectref' is not of a ReferenceType but of type "+objectref+"."); + } + //else{ + // referenceTypeIsInitialized(o, (ReferenceType) objectref); + //} + // The unsigned indexbyte1 and indexbyte2 are used to construct an index into the runtime constant pool of the + // current class (�3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant + // pool item at the index must be a symbolic reference to a class, array, or interface type. + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantClass)){ + constraintViolated(o, "The Constant at 'index' is not a ConstantClass, but '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitD2F(D2F o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitD2I(D2I o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitD2L(D2L o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDADD(DADD o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDALOAD(DALOAD o){ - indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ - return; - } - if (! (stack().peek(1) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-top must be of type double[] but is '"+stack().peek(1)+"'."); - } - Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.DOUBLE){ - constraintViolated(o, "Stack next-to-top must be of type double[] but is '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type double[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.DOUBLE){ + constraintViolated(o, "Stack next-to-top must be of type double[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDASTORE(DASTORE o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ - return; - } - if (! (stack().peek(2) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-next-to-top must be of type double[] but is '"+stack().peek(2)+"'."); - } - Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.DOUBLE){ - constraintViolated(o, "Stack next-to-next-to-top must be of type double[] but is '"+stack().peek(2)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type double[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.DOUBLE){ + constraintViolated(o, "Stack next-to-next-to-top must be of type double[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDCMPG(DCMPG o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDCMPL(DCMPL o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDCONST(DCONST o){ - // There's nothing to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + // There's nothing to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDDIV(DDIV o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDLOAD(DLOAD o){ - //visitLoadInstruction(LoadInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + //visitLoadInstruction(LoadInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDMUL(DMUL o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDNEG(DNEG o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDREM(DREM o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDRETURN(DRETURN o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDSTORE(DSTORE o){ - //visitStoreInstruction(StoreInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + //visitStoreInstruction(StoreInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDSUB(DSUB o){ - if (stack().peek() != Type.DOUBLE){ - constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.DOUBLE){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.DOUBLE){ + constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.DOUBLE){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDUP(DUP o){ - if (stack().peek().getSize() != 1){ - constraintViolated(o, "Won't DUP type on stack top '"+stack().peek()+"' because it must occupy exactly one slot, not '"+stack().peek().getSize()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek().getSize() != 1){ + constraintViolated(o, "Won't DUP type on stack top '"+stack().peek()+"' because it must occupy exactly one slot, not '"+stack().peek().getSize()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDUP_X1(DUP_X1 o){ - if (stack().peek().getSize() != 1){ - constraintViolated(o, "Type on stack top '"+stack().peek()+"' should occupy exactly one slot, not '"+stack().peek().getSize()+"'."); - } - if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "Type on stack next-to-top '"+stack().peek(1)+"' should occupy exactly one slot, not '"+stack().peek(1).getSize()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek().getSize() != 1){ + constraintViolated(o, "Type on stack top '"+stack().peek()+"' should occupy exactly one slot, not '"+stack().peek().getSize()+"'."); + } + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "Type on stack next-to-top '"+stack().peek(1)+"' should occupy exactly one slot, not '"+stack().peek(1).getSize()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDUP_X2(DUP_X2 o){ - if (stack().peek().getSize() != 1){ - constraintViolated(o, "Stack top type must be of size 1, but is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); - } - if (stack().peek(1).getSize() == 2){ - return; // Form 2, okay. - } - else{ //stack().peek(1).getSize == 1. - if (stack().peek(2).getSize() != 1){ - constraintViolated(o, "If stack top's size is 1 and stack next-to-top's size is 1, stack next-to-next-to-top's size must also be 1, but is: '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek().getSize() != 1){ + constraintViolated(o, "Stack top type must be of size 1, but is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); + } + if (stack().peek(1).getSize() == 2){ + return; // Form 2, okay. + } + else{ //stack().peek(1).getSize == 1. + if (stack().peek(2).getSize() != 1){ + constraintViolated(o, "If stack top's size is 1 and stack next-to-top's size is 1, stack next-to-next-to-top's size must also be 1, but is: '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDUP2(DUP2 o){ - if (stack().peek().getSize() == 2){ - return; // Form 2, okay. - } - else{ //stack().peek().getSize() == 1. - if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek().getSize() == 2){ + return; // Form 2, okay. + } + else{ //stack().peek().getSize() == 1. + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDUP2_X1(DUP2_X1 o){ - if (stack().peek().getSize() == 2){ - if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "If stack top's size is 2, then stack next-to-top's size must be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); - } - else{ - return; // Form 2 - } - } - else{ // stack top is of size 1 - if ( stack().peek(1).getSize() != 1 ){ - constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); - } - if ( stack().peek(2).getSize() != 1 ){ - constraintViolated(o, "If stack top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek().getSize() == 2){ + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "If stack top's size is 2, then stack next-to-top's size must be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); + } + else{ + return; // Form 2 + } + } + else{ // stack top is of size 1 + if ( stack().peek(1).getSize() != 1 ){ + constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); + } + if ( stack().peek(2).getSize() != 1 ){ + constraintViolated(o, "If stack top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitDUP2_X2(DUP2_X2 o){ - if (stack().peek(0).getSize() == 2){ - if (stack().peek(1).getSize() == 2){ - return; // Form 4 - } - else{// stack top size is 2, next-to-top's size is 1 - if ( stack().peek(2).getSize() != 1 ){ - constraintViolated(o, "If stack top's size is 2 and stack-next-to-top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); - } - else{ - return; // Form 2 - } - } - } - else{// stack top is of size 1 - if (stack().peek(1).getSize() == 1){ - if ( stack().peek(2).getSize() == 2 ){ - return; // Form 3 - } - else{ - if ( stack().peek(3).getSize() == 1){ - return; // Form 1 - } - } - } - } - constraintViolated(o, "The operand sizes on the stack do not match any of the four forms of usage of this instruction."); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek(0).getSize() == 2){ + if (stack().peek(1).getSize() == 2){ + return; // Form 4 + } + else{// stack top size is 2, next-to-top's size is 1 + if ( stack().peek(2).getSize() != 1 ){ + constraintViolated(o, "If stack top's size is 2 and stack-next-to-top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + } + else{ + return; // Form 2 + } + } + } + else{// stack top is of size 1 + if (stack().peek(1).getSize() == 1){ + if ( stack().peek(2).getSize() == 2 ){ + return; // Form 3 + } + else{ + if ( stack().peek(3).getSize() == 1){ + return; // Form 1 + } + } + } + } + constraintViolated(o, "The operand sizes on the stack do not match any of the four forms of usage of this instruction."); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitF2D(F2D o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitF2I(F2I o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitF2L(F2L o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFADD(FADD o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFALOAD(FALOAD o){ - indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ - return; - } - if (! (stack().peek(1) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-top must be of type float[] but is '"+stack().peek(1)+"'."); - } - Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.FLOAT){ - constraintViolated(o, "Stack next-to-top must be of type float[] but is '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type float[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.FLOAT){ + constraintViolated(o, "Stack next-to-top must be of type float[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFASTORE(FASTORE o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ - return; - } - if (! (stack().peek(2) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-next-to-top must be of type float[] but is '"+stack().peek(2)+"'."); - } - Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.FLOAT){ - constraintViolated(o, "Stack next-to-next-to-top must be of type float[] but is '"+stack().peek(2)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type float[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.FLOAT){ + constraintViolated(o, "Stack next-to-next-to-top must be of type float[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFCMPG(FCMPG o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFCMPL(FCMPL o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFCONST(FCONST o){ - // nothing to do here. - } + // nothing to do here. + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFDIV(FDIV o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFLOAD(FLOAD o){ - //visitLoadInstruction(LoadInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + //visitLoadInstruction(LoadInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFMUL(FMUL o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFNEG(FNEG o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFREM(FREM o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFRETURN(FRETURN o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFSTORE(FSTORE o){ - //visitStoreInstruction(StoreInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + //visitStoreInstruction(StoreInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitFSUB(FSUB o){ - if (stack().peek() != Type.FLOAT){ - constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.FLOAT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.FLOAT){ + constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.FLOAT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitGETFIELD(GETFIELD o){ - try { - Type objectref = stack().peek(); - if (! ( (objectref instanceof ObjectType) || (objectref == Type.NULL) ) ){ - constraintViolated(o, "Stack top should be an object reference that's not an array reference, but is '"+objectref+"'."); - } - - String field_name = o.getFieldName(cpg); - - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); - Field[] fields = jc.getFields(); - Field f = null; - for (Field field : fields) { - if (field.getName().equals(field_name)){ - Type f_type = Type.getType(field.getSignature()); - Type o_type = o.getType(cpg); - /* TODO: Check if assignment compatibility is sufficient. - * What does Sun do? - */ - if (f_type.equals(o_type)){ - f = field; - break; - } - } - } - - if (f == null){ - JavaClass[] superclasses = jc.getSuperClasses(); - outer: + try { + Type objectref = stack().peek(); + if (! ( (objectref instanceof ObjectType) || (objectref == Type.NULL) ) ){ + constraintViolated(o, "Stack top should be an object reference that's not an array reference, but is '"+objectref+"'."); + } + + String field_name = o.getFieldName(cpg); + + JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + Field[] fields = jc.getFields(); + Field f = null; + for (Field field : fields) { + if (field.getName().equals(field_name)){ + Type f_type = Type.getType(field.getSignature()); + Type o_type = o.getType(cpg); + /* TODO: Check if assignment compatibility is sufficient. + * What does Sun do? + */ + if (f_type.equals(o_type)){ + f = field; + break; + } + } + } + + if (f == null){ + JavaClass[] superclasses = jc.getSuperClasses(); + outer: for (JavaClass superclass : superclasses) { fields = superclass.getFields(); for (Field field : fields) { @@ -1269,1616 +1269,1616 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } } - if (f == null) { + if (f == null) { throw new AssertionViolatedException("Field '" + field_name + "' not found in " + jc.getClassName()); } - } - - if (f.isProtected()){ - ObjectType classtype = o.getClassType(cpg); - ObjectType curr = ObjectType.getInstance(mg.getClassName()); - - if ( classtype.equals(curr) || - curr.subclassOf(classtype) ){ - Type t = stack().peek(); - if (t == Type.NULL){ - return; - } - if (! (t instanceof ObjectType) ){ - constraintViolated(o, "The 'objectref' must refer to an object that's not an array. Found instead: '"+t+"'."); - } - ObjectType objreftype = (ObjectType) t; - if (! ( objreftype.equals(curr) || - objreftype.subclassOf(curr) ) ){ - //TODO: One day move to Staerk-et-al's "Set of object types" instead of "wider" object types - // created during the verification. - // "Wider" object types don't allow us to check for things like that below. - //constraintViolated(o, "The referenced field has the ACC_PROTECTED modifier, and it's a member of the current class or a superclass of the current class. However, the referenced object type '"+stack().peek()+"' is not the current class or a subclass of the current class."); - } - } - } - - // TODO: Could go into Pass 3a. - if (f.isStatic()){ - constraintViolated(o, "Referenced field '"+f+"' is static which it shouldn't be."); - } - - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + } + + if (f.isProtected()){ + ObjectType classtype = o.getClassType(cpg); + ObjectType curr = ObjectType.getInstance(mg.getClassName()); + + if ( classtype.equals(curr) || + curr.subclassOf(classtype) ){ + Type t = stack().peek(); + if (t == Type.NULL){ + return; + } + if (! (t instanceof ObjectType) ){ + constraintViolated(o, "The 'objectref' must refer to an object that's not an array. Found instead: '"+t+"'."); + } + ObjectType objreftype = (ObjectType) t; + if (! ( objreftype.equals(curr) || + objreftype.subclassOf(curr) ) ){ + //TODO: One day move to Staerk-et-al's "Set of object types" instead of "wider" object types + // created during the verification. + // "Wider" object types don't allow us to check for things like that below. + //constraintViolated(o, "The referenced field has the ACC_PROTECTED modifier, and it's a member of the current class or a superclass of the current class. However, the referenced object type '"+stack().peek()+"' is not the current class or a subclass of the current class."); + } + } + } + + // TODO: Could go into Pass 3a. + if (f.isStatic()){ + constraintViolated(o, "Referenced field '"+f+"' is static which it shouldn't be."); + } + + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitGETSTATIC(GETSTATIC o){ - // Field must be static: see Pass 3a. - } + // Field must be static: see Pass 3a. + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitGOTO(GOTO o){ - // nothing to do here. - } + // nothing to do here. + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitGOTO_W(GOTO_W o){ - // nothing to do here. - } + // nothing to do here. + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitI2B(I2B o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitI2C(I2C o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitI2D(I2D o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitI2F(I2F o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitI2L(I2L o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitI2S(I2S o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIADD(IADD o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIALOAD(IALOAD o){ - indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ - return; - } - if (! (stack().peek(1) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-top must be of type int[] but is '"+stack().peek(1)+"'."); - } - Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.INT){ - constraintViolated(o, "Stack next-to-top must be of type int[] but is '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type int[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.INT){ + constraintViolated(o, "Stack next-to-top must be of type int[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIAND(IAND o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIASTORE(IASTORE o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ - return; - } - if (! (stack().peek(2) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-next-to-top must be of type int[] but is '"+stack().peek(2)+"'."); - } - Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.INT){ - constraintViolated(o, "Stack next-to-next-to-top must be of type int[] but is '"+stack().peek(2)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type int[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.INT){ + constraintViolated(o, "Stack next-to-next-to-top must be of type int[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitICONST(ICONST o){ - //nothing to do here. - } + //nothing to do here. + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIDIV(IDIV o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIF_ACMPEQ(IF_ACMPEQ o){ - if (!(stack().peek() instanceof ReferenceType)){ - constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); - } - //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); - - if (!(stack().peek(1) instanceof ReferenceType)){ - constraintViolated(o, "The value at the stack next-to-top is not of a ReferenceType, but of type '"+stack().peek(1)+"'."); - } - //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek(1)) ); - - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override - public void visitIF_ACMPNE(IF_ACMPNE o){ - if (!(stack().peek() instanceof ReferenceType)){ - constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); - //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); - } - if (!(stack().peek(1) instanceof ReferenceType)){ - constraintViolated(o, "The value at the stack next-to-top is not of a ReferenceType, but of type '"+stack().peek(1)+"'."); - //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek(1)) ); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override - public void visitIF_ICMPEQ(IF_ICMPEQ o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (!(stack().peek() instanceof ReferenceType)){ + constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); + } + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + + if (!(stack().peek(1) instanceof ReferenceType)){ + constraintViolated(o, "The value at the stack next-to-top is not of a ReferenceType, but of type '"+stack().peek(1)+"'."); + } + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek(1)) ); + + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override + public void visitIF_ACMPNE(IF_ACMPNE o){ + if (!(stack().peek() instanceof ReferenceType)){ + constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + } + if (!(stack().peek(1) instanceof ReferenceType)){ + constraintViolated(o, "The value at the stack next-to-top is not of a ReferenceType, but of type '"+stack().peek(1)+"'."); + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek(1)) ); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override + public void visitIF_ICMPEQ(IF_ICMPEQ o){ + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIF_ICMPGE(IF_ICMPGE o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIF_ICMPGT(IF_ICMPGT o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIF_ICMPLE(IF_ICMPLE o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIF_ICMPLT(IF_ICMPLT o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIF_ICMPNE(IF_ICMPNE o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIFEQ(IFEQ o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIFGE(IFGE o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIFGT(IFGT o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIFLE(IFLE o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIFLT(IFLT o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIFNE(IFNE o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIFNONNULL(IFNONNULL o){ - if (!(stack().peek() instanceof ReferenceType)){ - constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); - } - referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (!(stack().peek() instanceof ReferenceType)){ + constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); + } + referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIFNULL(IFNULL o){ - if (!(stack().peek() instanceof ReferenceType)){ - constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); - } - referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (!(stack().peek() instanceof ReferenceType)){ + constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); + } + referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIINC(IINC o){ - // Mhhh. In BCEL, at this time "IINC" is not a LocalVariableInstruction. - if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ - constraintViolated(o, "The 'index' is not a valid index into the local variable array."); - } - - indexOfInt(o, locals().get(o.getIndex())); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + // Mhhh. In BCEL, at this time "IINC" is not a LocalVariableInstruction. + if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ + constraintViolated(o, "The 'index' is not a valid index into the local variable array."); + } + + indexOfInt(o, locals().get(o.getIndex())); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitILOAD(ILOAD o){ - // All done by visitLocalVariableInstruction(), visitLoadInstruction() - } + // All done by visitLocalVariableInstruction(), visitLoadInstruction() + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIMPDEP1(IMPDEP1 o){ - throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP1."); - } + throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP1."); + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIMPDEP2(IMPDEP2 o){ - throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP2."); - } + throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP2."); + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIMUL(IMUL o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitINEG(INEG o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitINSTANCEOF(INSTANCEOF o){ - // The objectref must be of type reference. - Type objectref = stack().peek(0); - if (!(objectref instanceof ReferenceType)){ - constraintViolated(o, "The 'objectref' is not of a ReferenceType but of type "+objectref+"."); - } - //else{ - // referenceTypeIsInitialized(o, (ReferenceType) objectref); - //} - // The unsigned indexbyte1 and indexbyte2 are used to construct an index into the runtime constant pool of the - // current class (�3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant - // pool item at the index must be a symbolic reference to a class, array, or interface type. - Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ - constraintViolated(o, "The Constant at 'index' is not a ConstantClass, but '"+c+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + // The objectref must be of type reference. + Type objectref = stack().peek(0); + if (!(objectref instanceof ReferenceType)){ + constraintViolated(o, "The 'objectref' is not of a ReferenceType but of type "+objectref+"."); + } + //else{ + // referenceTypeIsInitialized(o, (ReferenceType) objectref); + //} + // The unsigned indexbyte1 and indexbyte2 are used to construct an index into the runtime constant pool of the + // current class (�3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant + // pool item at the index must be a symbolic reference to a class, array, or interface type. + Constant c = cpg.getConstant(o.getIndex()); + if (! (c instanceof ConstantClass)){ + constraintViolated(o, "The Constant at 'index' is not a ConstantClass, but '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ - // Method is not native, otherwise pass 3 would not happen. - - int count = o.getCount(); - if (count == 0){ - constraintViolated(o, "The 'count' argument must not be 0."); - } - // It is a ConstantInterfaceMethodref, Pass 3a made it sure. - // TODO: Do we want to do anything with it? + // Method is not native, otherwise pass 3 would not happen. + + int count = o.getCount(); + if (count == 0){ + constraintViolated(o, "The 'count' argument must not be 0."); + } + // It is a ConstantInterfaceMethodref, Pass 3a made it sure. + // TODO: Do we want to do anything with it? //ConstantInterfaceMethodref cimr = (ConstantInterfaceMethodref) (cpg.getConstant(o.getIndex())); - - // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). - - Type t = o.getType(cpg); - if (t instanceof ObjectType){ - String name = ((ObjectType)t).getClassName(); - Verifier v = VerifierFactory.getVerifier( name ); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); - } - } - - - Type[] argtypes = o.getArgumentTypes(cpg); - int nargs = argtypes.length; - - for (int i=nargs-1; i>=0; i--){ - Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 - Type fromDesc = argtypes[i]; - if (fromDesc == Type.BOOLEAN || - fromDesc == Type.BYTE || - fromDesc == Type.CHAR || - fromDesc == Type.SHORT){ - fromDesc = Type.INT; - } - if (! fromStack.equals(fromDesc)){ - if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ - ReferenceType rFromStack = (ReferenceType) fromStack; - //ReferenceType rFromDesc = (ReferenceType) fromDesc; - // TODO: This can only be checked when using Staerk-et-al's "set of object types" - // instead of a "wider cast object type" created during verification. - //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); - //} + + // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). + + Type t = o.getType(cpg); + if (t instanceof ObjectType){ + String name = ((ObjectType)t).getClassName(); + Verifier v = VerifierFactory.getVerifier( name ); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + + + Type[] argtypes = o.getArgumentTypes(cpg); + int nargs = argtypes.length; + + for (int i=nargs-1; i>=0; i--){ + Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 + Type fromDesc = argtypes[i]; + if (fromDesc == Type.BOOLEAN || + fromDesc == Type.BYTE || + fromDesc == Type.CHAR || + fromDesc == Type.SHORT){ + fromDesc = Type.INT; + } + if (! fromStack.equals(fromDesc)){ + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + ReferenceType rFromStack = (ReferenceType) fromStack; + //ReferenceType rFromDesc = (ReferenceType) fromDesc; + // TODO: This can only be checked when using Staerk-et-al's "set of object types" + // instead of a "wider cast object type" created during verification. + //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + //} referenceTypeIsInitialized(o, rFromStack); - } - else{ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); - } - } - } - - Type objref = stack().peek(nargs); - if (objref == Type.NULL){ - return; - } - if (! (objref instanceof ReferenceType) ){ - constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); - } - referenceTypeIsInitialized(o, (ReferenceType) objref); - if (!(objref instanceof ObjectType)){ - if (!(objref instanceof ArrayType)){ - constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType - } - else{ - objref = GENERIC_ARRAY; - } - } - - // String objref_classname = ((ObjectType) objref).getClassName(); - // String theInterface = o.getClassName(cpg); - // TODO: This can only be checked if we're using Staerk-et-al's "set of object types" - // instead of "wider cast object types" generated during verification. - //if ( ! Repository.implementationOf(objref_classname, theInterface) ){ - // constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theInterface+"' as expected."); - //} - - int counted_count = 1; // 1 for the objectref - for (int i=0; i=0; i--){ - Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 - Type fromDesc = argtypes[i]; - if (fromDesc == Type.BOOLEAN || - fromDesc == Type.BYTE || - fromDesc == Type.CHAR || - fromDesc == Type.SHORT){ - fromDesc = Type.INT; - } - if (! fromStack.equals(fromDesc)){ - if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ - ReferenceType rFromStack = (ReferenceType) fromStack; - ReferenceType rFromDesc = (ReferenceType) fromDesc; - // TODO: This can only be checked using Staerk-et-al's "set of object types", not - // using a "wider cast object type". - if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); - } + try { + // Don't init an object twice. + if ( (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME)) && (!(stack().peek(o.getArgumentTypes(cpg).length) instanceof UninitializedObjectType)) ){ + constraintViolated(o, "Possibly initializing object twice. A valid instruction sequence must not have an uninitialized object on the operand stack or in a local variable during a backwards branch, or in a local variable in code protected by an exception handler. Please see The Java Virtual Machine Specification, Second Edition, 4.9.4 (pages 147 and 148) for details."); + } + + // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). + + Type t = o.getType(cpg); + if (t instanceof ObjectType){ + String name = ((ObjectType)t).getClassName(); + Verifier v = VerifierFactory.getVerifier( name ); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + + + Type[] argtypes = o.getArgumentTypes(cpg); + int nargs = argtypes.length; + + for (int i=nargs-1; i>=0; i--){ + Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 + Type fromDesc = argtypes[i]; + if (fromDesc == Type.BOOLEAN || + fromDesc == Type.BYTE || + fromDesc == Type.CHAR || + fromDesc == Type.SHORT){ + fromDesc = Type.INT; + } + if (! fromStack.equals(fromDesc)){ + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + ReferenceType rFromStack = (ReferenceType) fromStack; + ReferenceType rFromDesc = (ReferenceType) fromDesc; + // TODO: This can only be checked using Staerk-et-al's "set of object types", not + // using a "wider cast object type". + if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + } referenceTypeIsInitialized(o, rFromStack); - } - else{ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); - } - } - } - - Type objref = stack().peek(nargs); - if (objref == Type.NULL){ - return; - } - if (! (objref instanceof ReferenceType) ){ - constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); - } - String objref_classname = null; - if ( !(o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME))){ - referenceTypeIsInitialized(o, (ReferenceType) objref); - if (!(objref instanceof ObjectType)){ - if (!(objref instanceof ArrayType)){ - constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType - } - else{ - objref = GENERIC_ARRAY; - } - } - - objref_classname = ((ObjectType) objref).getClassName(); - } - else{ - if (!(objref instanceof UninitializedObjectType)){ - constraintViolated(o, "Expecting an UninitializedObjectType as 'objectref' on the stack, not a '"+objref+"'. Otherwise, you couldn't invoke a method since an array has no methods (not to speak of a return address)."); - } - objref_classname = ((UninitializedObjectType) objref).getInitialized().getClassName(); - } - - - String theClass = o.getClassName(cpg); - if ( ! Repository.instanceOf(objref_classname, theClass) ){ - constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); - } - - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + } + else{ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); + } + } + } + + Type objref = stack().peek(nargs); + if (objref == Type.NULL){ + return; + } + if (! (objref instanceof ReferenceType) ){ + constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); + } + String objref_classname = null; + if ( !(o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME))){ + referenceTypeIsInitialized(o, (ReferenceType) objref); + if (!(objref instanceof ObjectType)){ + if (!(objref instanceof ArrayType)){ + constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType + } + else{ + objref = GENERIC_ARRAY; + } + } + + objref_classname = ((ObjectType) objref).getClassName(); + } + else{ + if (!(objref instanceof UninitializedObjectType)){ + constraintViolated(o, "Expecting an UninitializedObjectType as 'objectref' on the stack, not a '"+objref+"'. Otherwise, you couldn't invoke a method since an array has no methods (not to speak of a return address)."); + } + objref_classname = ((UninitializedObjectType) objref).getInitialized().getClassName(); + } + + + String theClass = o.getClassName(cpg); + if ( ! Repository.instanceOf(objref_classname, theClass) ){ + constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); + } + + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitINVOKESTATIC(INVOKESTATIC o){ - try { - // Method is not native, otherwise pass 3 would not happen. - - Type t = o.getType(cpg); - if (t instanceof ObjectType){ - String name = ((ObjectType)t).getClassName(); - Verifier v = VerifierFactory.getVerifier( name ); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); - } - } - - Type[] argtypes = o.getArgumentTypes(cpg); - int nargs = argtypes.length; - - for (int i=nargs-1; i>=0; i--){ - Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 - Type fromDesc = argtypes[i]; - if (fromDesc == Type.BOOLEAN || - fromDesc == Type.BYTE || - fromDesc == Type.CHAR || - fromDesc == Type.SHORT){ - fromDesc = Type.INT; - } - if (! fromStack.equals(fromDesc)){ - if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ - ReferenceType rFromStack = (ReferenceType) fromStack; - ReferenceType rFromDesc = (ReferenceType) fromDesc; - // TODO: This check can possibly only be done using Staerk-et-al's "set of object types" - // instead of a "wider cast object type" created during verification. - if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); - } + try { + // Method is not native, otherwise pass 3 would not happen. + + Type t = o.getType(cpg); + if (t instanceof ObjectType){ + String name = ((ObjectType)t).getClassName(); + Verifier v = VerifierFactory.getVerifier( name ); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + + Type[] argtypes = o.getArgumentTypes(cpg); + int nargs = argtypes.length; + + for (int i=nargs-1; i>=0; i--){ + Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 + Type fromDesc = argtypes[i]; + if (fromDesc == Type.BOOLEAN || + fromDesc == Type.BYTE || + fromDesc == Type.CHAR || + fromDesc == Type.SHORT){ + fromDesc = Type.INT; + } + if (! fromStack.equals(fromDesc)){ + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + ReferenceType rFromStack = (ReferenceType) fromStack; + ReferenceType rFromDesc = (ReferenceType) fromDesc; + // TODO: This check can possibly only be done using Staerk-et-al's "set of object types" + // instead of a "wider cast object type" created during verification. + if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + } referenceTypeIsInitialized(o, rFromStack); - } - else{ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); - } - } - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + } + else{ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); + } + } + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ - try { - // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). - - Type t = o.getType(cpg); - if (t instanceof ObjectType){ - String name = ((ObjectType)t).getClassName(); - Verifier v = VerifierFactory.getVerifier( name ); - VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); - } - } - - - Type[] argtypes = o.getArgumentTypes(cpg); - int nargs = argtypes.length; - - for (int i=nargs-1; i>=0; i--){ - Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 - Type fromDesc = argtypes[i]; - if (fromDesc == Type.BOOLEAN || - fromDesc == Type.BYTE || - fromDesc == Type.CHAR || - fromDesc == Type.SHORT){ - fromDesc = Type.INT; - } - if (! fromStack.equals(fromDesc)){ - if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ - ReferenceType rFromStack = (ReferenceType) fromStack; - ReferenceType rFromDesc = (ReferenceType) fromDesc; - // TODO: This can possibly only be checked when using Staerk-et-al's "set of object types" instead - // of a single "wider cast object type" created during verification. - if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); - } + try { + // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). + + Type t = o.getType(cpg); + if (t instanceof ObjectType){ + String name = ((ObjectType)t).getClassName(); + Verifier v = VerifierFactory.getVerifier( name ); + VerificationResult vr = v.doPass2(); + if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + } + } + + + Type[] argtypes = o.getArgumentTypes(cpg); + int nargs = argtypes.length; + + for (int i=nargs-1; i>=0; i--){ + Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 + Type fromDesc = argtypes[i]; + if (fromDesc == Type.BOOLEAN || + fromDesc == Type.BYTE || + fromDesc == Type.CHAR || + fromDesc == Type.SHORT){ + fromDesc = Type.INT; + } + if (! fromStack.equals(fromDesc)){ + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + ReferenceType rFromStack = (ReferenceType) fromStack; + ReferenceType rFromDesc = (ReferenceType) fromDesc; + // TODO: This can possibly only be checked when using Staerk-et-al's "set of object types" instead + // of a single "wider cast object type" created during verification. + if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + } referenceTypeIsInitialized(o, rFromStack); - } - else{ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); - } - } - } - - Type objref = stack().peek(nargs); - if (objref == Type.NULL){ - return; - } - if (! (objref instanceof ReferenceType) ){ - constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); - } - referenceTypeIsInitialized(o, (ReferenceType) objref); - if (!(objref instanceof ObjectType)){ - if (!(objref instanceof ArrayType)){ - constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType - } - else{ - objref = GENERIC_ARRAY; - } - } - - String objref_classname = ((ObjectType) objref).getClassName(); - - String theClass = o.getClassName(cpg); - - if ( ! Repository.instanceOf(objref_classname, theClass) ){ - constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); - } - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + } + else{ + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack."); + } + } + } + + Type objref = stack().peek(nargs); + if (objref == Type.NULL){ + return; + } + if (! (objref instanceof ReferenceType) ){ + constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); + } + referenceTypeIsInitialized(o, (ReferenceType) objref); + if (!(objref instanceof ObjectType)){ + if (!(objref instanceof ArrayType)){ + constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType + } + else{ + objref = GENERIC_ARRAY; + } + } + + String objref_classname = ((ObjectType) objref).getClassName(); + + String theClass = o.getClassName(cpg); + + if ( ! Repository.instanceOf(objref_classname, theClass) ){ + constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); + } + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIOR(IOR o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIREM(IREM o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIRETURN(IRETURN o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitISHL(ISHL o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitISHR(ISHR o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitISTORE(ISTORE o){ - //visitStoreInstruction(StoreInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + //visitStoreInstruction(StoreInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitISUB(ISUB o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIUSHR(IUSHR o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitIXOR(IXOR o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.INT){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.INT){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitJSR(JSR o){ - // nothing to do here. - } + // nothing to do here. + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitJSR_W(JSR_W o){ - // nothing to do here. - } + // nothing to do here. + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitL2D(L2D o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitL2F(L2F o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitL2I(L2I o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLADD(LADD o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLALOAD(LALOAD o){ - indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ - return; - } - if (! (stack().peek(1) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-top must be of type long[] but is '"+stack().peek(1)+"'."); - } - Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.LONG){ - constraintViolated(o, "Stack next-to-top must be of type long[] but is '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type long[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.LONG){ + constraintViolated(o, "Stack next-to-top must be of type long[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLAND(LAND o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLASTORE(LASTORE o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ - return; - } - if (! (stack().peek(2) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-next-to-top must be of type long[] but is '"+stack().peek(2)+"'."); - } - Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.LONG){ - constraintViolated(o, "Stack next-to-next-to-top must be of type long[] but is '"+stack().peek(2)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type long[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.LONG){ + constraintViolated(o, "Stack next-to-next-to-top must be of type long[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLCMP(LCMP o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLCONST(LCONST o){ - // Nothing to do here. - } + // Nothing to do here. + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLDC(LDC o){ - // visitCPInstruction is called first. - - Constant c = cpg.getConstant(o.getIndex()); - if (! ( ( c instanceof ConstantInteger) || - ( c instanceof ConstantFloat ) || - ( c instanceof ConstantString ) || - ( c instanceof ConstantClass ) ) ){ - constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float, a CONSTANT_String or a CONSTANT_Class, but is '"+c+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - public void visitLDC_W(LDC_W o){ - // visitCPInstruction is called first. - - Constant c = cpg.getConstant(o.getIndex()); - if (! ( ( c instanceof ConstantInteger) || - ( c instanceof ConstantFloat ) || - ( c instanceof ConstantString ) || - ( c instanceof ConstantClass ) ) ){ - constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float, a CONSTANT_String or a CONSTANT_Class, but is '"+c+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + // visitCPInstruction is called first. + + Constant c = cpg.getConstant(o.getIndex()); + if (! ( ( c instanceof ConstantInteger) || + ( c instanceof ConstantFloat ) || + ( c instanceof ConstantString ) || + ( c instanceof ConstantClass ) ) ){ + constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float, a CONSTANT_String or a CONSTANT_Class, but is '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + public void visitLDC_W(LDC_W o){ + // visitCPInstruction is called first. + + Constant c = cpg.getConstant(o.getIndex()); + if (! ( ( c instanceof ConstantInteger) || + ( c instanceof ConstantFloat ) || + ( c instanceof ConstantString ) || + ( c instanceof ConstantClass ) ) ){ + constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float, a CONSTANT_String or a CONSTANT_Class, but is '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLDC2_W(LDC2_W o){ - // visitCPInstruction is called first. - - Constant c = cpg.getConstant(o.getIndex()); - if (! ( ( c instanceof ConstantLong) || - ( c instanceof ConstantDouble ) ) ){ - constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + // visitCPInstruction is called first. + + Constant c = cpg.getConstant(o.getIndex()); + if (! ( ( c instanceof ConstantLong) || + ( c instanceof ConstantDouble ) ) ){ + constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLDIV(LDIV o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLLOAD(LLOAD o){ - //visitLoadInstruction(LoadInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + //visitLoadInstruction(LoadInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLMUL(LMUL o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLNEG(LNEG o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - // See also pass 3a. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + // See also pass 3a. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLOR(LOR o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLREM(LREM o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLRETURN(LRETURN o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLSHL(LSHL o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLSHR(LSHR o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLSTORE(LSTORE o){ - //visitStoreInstruction(StoreInstruction) is called before. - - // Nothing else needs to be done here. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + //visitStoreInstruction(StoreInstruction) is called before. + + // Nothing else needs to be done here. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLSUB(LSUB o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLUSHR(LUSHR o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitLXOR(LXOR o){ - if (stack().peek() != Type.LONG){ - constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); - } - if (stack().peek(1) != Type.LONG){ - constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.LONG){ + constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); + } + if (stack().peek(1) != Type.LONG){ + constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitMONITORENTER(MONITORENTER o){ - if (! ((stack().peek()) instanceof ReferenceType)){ - constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); - } - //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (! ((stack().peek()) instanceof ReferenceType)){ + constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); + } + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitMONITOREXIT(MONITOREXIT o){ - if (! ((stack().peek()) instanceof ReferenceType)){ - constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); - } - //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (! ((stack().peek()) instanceof ReferenceType)){ + constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); + } + //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitMULTIANEWARRAY(MULTIANEWARRAY o){ - int dimensions = o.getDimensions(); - // Dimensions argument is okay: see Pass 3a. - for (int i=0; i, see Pass 3a. - - } catch (ClassNotFoundException e) { - // FIXME: maybe not the best way to handle this - throw new AssertionViolatedException("Missing class: " + e, e); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + } + Type value = stack().peek(); + Type t = Type.getType(f.getSignature()); + Type shouldbe = t; + if (shouldbe == Type.BOOLEAN || + shouldbe == Type.BYTE || + shouldbe == Type.CHAR || + shouldbe == Type.SHORT){ + shouldbe = Type.INT; + } + if (t instanceof ReferenceType){ + ReferenceType rvalue = null; + if (value instanceof ReferenceType){ + rvalue = (ReferenceType) value; + referenceTypeIsInitialized(o, rvalue); + } + else{ + constraintViolated(o, "The stack top type '"+value+"' is not of a reference type as expected."); + } + // TODO: This can possibly only be checked using Staerk-et-al's "set-of-object types", not + // using "wider cast object types" created during verification. + // Comment it out if you encounter problems. See also the analogon at visitPUTFIELD. + if (!(rvalue.isAssignmentCompatibleWith(shouldbe))){ + constraintViolated(o, "The stack top type '"+value+"' is not assignment compatible with '"+shouldbe+"'."); + } + } + else{ + if (shouldbe != value){ + constraintViolated(o, "The stack top type '"+value+"' is not of type '"+shouldbe+"' as expected."); + } + } + // TODO: Interface fields may be assigned to only once. (Hard to implement in + // JustIce's execution model). This may only happen in , see Pass 3a. + + } catch (ClassNotFoundException e) { + // FIXME: maybe not the best way to handle this + throw new AssertionViolatedException("Missing class: " + e, e); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitRET(RET o){ - if (! (locals().get(o.getIndex()) instanceof ReturnaddressType)){ - constraintViolated(o, "Expecting a ReturnaddressType in local variable "+o.getIndex()+"."); - } - if (locals().get(o.getIndex()) == ReturnaddressType.NO_TARGET){ - throw new AssertionViolatedException("Oops: RET expecting a target!"); - } - // Other constraints such as non-allowed overlapping subroutines are enforced - // while building the Subroutines data structure. - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (! (locals().get(o.getIndex()) instanceof ReturnaddressType)){ + constraintViolated(o, "Expecting a ReturnaddressType in local variable "+o.getIndex()+"."); + } + if (locals().get(o.getIndex()) == ReturnaddressType.NO_TARGET){ + throw new AssertionViolatedException("Oops: RET expecting a target!"); + } + // Other constraints such as non-allowed overlapping subroutines are enforced + // while building the Subroutines data structure. + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitRETURN(RETURN o){ - if (mg.getName().equals(Constants.CONSTRUCTOR_NAME)){// If we leave an method - if ((Frame._this != null) && (!(mg.getClassName().equals(Type.OBJECT.getClassName()))) ) { - constraintViolated(o, "Leaving a constructor that itself did not call a constructor."); - } - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (mg.getName().equals(Constants.CONSTRUCTOR_NAME)){// If we leave an method + if ((Frame._this != null) && (!(mg.getClassName().equals(Type.OBJECT.getClassName()))) ) { + constraintViolated(o, "Leaving a constructor that itself did not call a constructor."); + } + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitSALOAD(SALOAD o){ - indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ - return; - } - if (! (stack().peek(1) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-top must be of type short[] but is '"+stack().peek(1)+"'."); - } - Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.SHORT){ - constraintViolated(o, "Stack next-to-top must be of type short[] but is '"+stack().peek(1)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + indexOfInt(o, stack().peek()); + if (stack().peek(1) == Type.NULL){ + return; + } + if (! (stack().peek(1) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-top must be of type short[] but is '"+stack().peek(1)+"'."); + } + Type t = ((ArrayType) (stack().peek(1))).getBasicType(); + if (t != Type.SHORT){ + constraintViolated(o, "Stack next-to-top must be of type short[] but is '"+stack().peek(1)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitSASTORE(SASTORE o){ - if (stack().peek() != Type.INT){ - constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); - } - indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ - return; - } - if (! (stack().peek(2) instanceof ArrayType)){ - constraintViolated(o, "Stack next-to-next-to-top must be of type short[] but is '"+stack().peek(2)+"'."); - } - Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.SHORT){ - constraintViolated(o, "Stack next-to-next-to-top must be of type short[] but is '"+stack().peek(2)+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek() != Type.INT){ + constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); + } + indexOfInt(o, stack().peek(1)); + if (stack().peek(2) == Type.NULL){ + return; + } + if (! (stack().peek(2) instanceof ArrayType)){ + constraintViolated(o, "Stack next-to-next-to-top must be of type short[] but is '"+stack().peek(2)+"'."); + } + Type t = ((ArrayType) (stack().peek(2))).getBasicType(); + if (t != Type.SHORT){ + constraintViolated(o, "Stack next-to-next-to-top must be of type short[] but is '"+stack().peek(2)+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitSIPUSH(SIPUSH o){ - // nothing to do here. Generic visitXXX() methods did the trick before. - } + // nothing to do here. Generic visitXXX() methods did the trick before. + } - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitSWAP(SWAP o){ - if (stack().peek().getSize() != 1){ - constraintViolated(o, "The value at the stack top is not of size '1', but of size '"+stack().peek().getSize()+"'."); - } - if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "The value at the stack next-to-top is not of size '1', but of size '"+stack().peek(1).getSize()+"'."); - } - } - - /** - * Ensures the specific preconditions of the said instruction. - */ - @Override + if (stack().peek().getSize() != 1){ + constraintViolated(o, "The value at the stack top is not of size '1', but of size '"+stack().peek().getSize()+"'."); + } + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "The value at the stack next-to-top is not of size '1', but of size '"+stack().peek(1).getSize()+"'."); + } + } + + /** + * Ensures the specific preconditions of the said instruction. + */ + @Override public void visitTABLESWITCH(TABLESWITCH o){ - indexOfInt(o, stack().peek()); - // See Pass 3a. - } + indexOfInt(o, stack().peek()); + // See Pass 3a. + } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java index cc8be38c..abb43ad4 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -33,76 +33,76 @@ import org.apache.bcel.generic.InstructionHandle; */ public interface InstructionContext{ - /** - * The getTag and setTag methods may be used for - * temporary flagging, such as graph colouring. - * Nothing in the InstructionContext object depends - * on the value of the tag. JustIce does not use it. - * - * @see #setTag(int tag) - */ - int getTag(); + /** + * The getTag and setTag methods may be used for + * temporary flagging, such as graph colouring. + * Nothing in the InstructionContext object depends + * on the value of the tag. JustIce does not use it. + * + * @see #setTag(int tag) + */ + int getTag(); - /** - * The getTag and setTag methods may be used for - * temporary flagging, such as graph colouring. - * Nothing in the InstructionContext object depends - * on the value of the tag. JustIce does not use it. - * - * @see #getTag() - */ - void setTag(int tag); + /** + * The getTag and setTag methods may be used for + * temporary flagging, such as graph colouring. + * Nothing in the InstructionContext object depends + * on the value of the tag. JustIce does not use it. + * + * @see #getTag() + */ + void setTag(int tag); - /** - * This method symbolically executes the Instruction - * held in the InstructionContext. - * It "merges in" the incoming execution frame situation - * (see The Java Virtual Machine Specification, 2nd - * edition, page 146). - * By so doing, the outgoing execution frame situation - * is calculated. - * - * This method is JustIce-specific and is usually of - * no sense for users of the ControlFlowGraph class. - * They should use getInstruction().accept(Visitor), - * possibly in conjunction with the ExecutionVisitor. - * - * - * @see ControlFlowGraph - * @see ExecutionVisitor - * @see #getOutFrame(List) - * @return true - if and only if the "outgoing" frame situation - * changed from the one before execute()ing. - */ - boolean execute(Frame inFrame, ArrayList executionPredecessors, InstConstraintVisitor icv, ExecutionVisitor ev); + /** + * This method symbolically executes the Instruction + * held in the InstructionContext. + * It "merges in" the incoming execution frame situation + * (see The Java Virtual Machine Specification, 2nd + * edition, page 146). + * By so doing, the outgoing execution frame situation + * is calculated. + * + * This method is JustIce-specific and is usually of + * no sense for users of the ControlFlowGraph class. + * They should use getInstruction().accept(Visitor), + * possibly in conjunction with the ExecutionVisitor. + * + * + * @see ControlFlowGraph + * @see ExecutionVisitor + * @see #getOutFrame(List) + * @return true - if and only if the "outgoing" frame situation + * changed from the one before execute()ing. + */ + boolean execute(Frame inFrame, ArrayList executionPredecessors, InstConstraintVisitor icv, ExecutionVisitor ev); - Frame getInFrame(); + Frame getInFrame(); - /** - * This method returns the outgoing execution frame situation; - * therefore it has to be calculated by execute(Frame, ArrayList) - * first. - * - * @see #execute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) - */ - Frame getOutFrame(ArrayList executionPredecessors); - - /** - * Returns the InstructionHandle this InstructionContext is wrapped around. - * - * @return The InstructionHandle this InstructionContext is wrapped around. - */ - InstructionHandle getInstruction(); + /** + * This method returns the outgoing execution frame situation; + * therefore it has to be calculated by execute(Frame, ArrayList) + * first. + * + * @see #execute(Frame, ArrayList, InstConstraintVisitor, ExecutionVisitor) + */ + Frame getOutFrame(ArrayList executionPredecessors); - /** - * Returns the usual control flow successors. - * @see #getExceptionHandlers() - */ - InstructionContext[] getSuccessors(); + /** + * Returns the InstructionHandle this InstructionContext is wrapped around. + * + * @return The InstructionHandle this InstructionContext is wrapped around. + */ + InstructionHandle getInstruction(); - /** - * Returns the exception handlers that protect this instruction. - * They are special control flow successors. - */ - ExceptionHandler[] getExceptionHandlers(); + /** + * Returns the usual control flow successors. + * @see #getExceptionHandlers() + */ + InstructionContext[] getSuccessors(); + + /** + * Returns the exception handlers that protect this instruction. + * They are special control flow successors. + */ + ExceptionHandler[] getExceptionHandlers(); } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java index f6674576..af7ed1f8 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -31,184 +31,184 @@ import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; * @author Enver Haase */ public class LocalVariables{ - /** The Type[] containing the local variable slots. */ - private Type[] locals; - - /** - * Creates a new LocalVariables object. - */ - public LocalVariables(int maxLocals){ - locals = new Type[maxLocals]; - for (int i=0; i stack = new ArrayList(); + /** We hold the stack information here. */ + private ArrayList stack = new ArrayList(); - /** The maximum number of stack slots this OperandStack instance may hold. */ - private int maxStack; + /** The maximum number of stack slots this OperandStack instance may hold. */ + private int maxStack; - /** - * Creates an empty stack with a maximum of maxStack slots. - */ - public OperandStack(int maxStack){ - this.maxStack = maxStack; - } + /** + * Creates an empty stack with a maximum of maxStack slots. + */ + public OperandStack(int maxStack){ + this.maxStack = maxStack; + } - /** - * Creates an otherwise empty stack with a maximum of maxStack slots and - * the ObjectType 'obj' at the top. - */ - public OperandStack(int maxStack, ObjectType obj){ - this.maxStack = maxStack; - this.push(obj); - } - /** - * Returns a deep copy of this object; that means, the clone operates - * on a new stack. However, the Type objects on the stack are - * shared. - */ - @Override + /** + * Creates an otherwise empty stack with a maximum of maxStack slots and + * the ObjectType 'obj' at the top. + */ + public OperandStack(int maxStack, ObjectType obj){ + this.maxStack = maxStack; + this.push(obj); + } + /** + * Returns a deep copy of this object; that means, the clone operates + * on a new stack. However, the Type objects on the stack are + * shared. + */ + @Override protected Object clone(){ - OperandStack newstack = new OperandStack(this.maxStack); - newstack.stack = (ArrayList) this.stack.clone(); - return newstack; - } + OperandStack newstack = new OperandStack(this.maxStack); + newstack.stack = (ArrayList) this.stack.clone(); + return newstack; + } - /** - * Clears the stack. - */ - public void clear(){ - stack = new ArrayList(); - } + /** + * Clears the stack. + */ + public void clear(){ + stack = new ArrayList(); + } - /** @return a hash code value for the object. + /** @return a hash code value for the object. */ - @Override + @Override public int hashCode() { return stack.hashCode(); } - /** - * Returns true if and only if this OperandStack - * equals another, meaning equal lengths and equal - * objects on the stacks. - */ - @Override + /** + * Returns true if and only if this OperandStack + * equals another, meaning equal lengths and equal + * objects on the stacks. + */ + @Override public boolean equals(Object o){ - if (!(o instanceof OperandStack)) { + if (!(o instanceof OperandStack)) { return false; } - OperandStack s = (OperandStack) o; - return this.stack.equals(s.stack); - } + OperandStack s = (OperandStack) o; + return this.stack.equals(s.stack); + } - /** - * Returns a (typed!) clone of this. - * - * @see #clone() - */ - public OperandStack getClone(){ - return (OperandStack) this.clone(); - } + /** + * Returns a (typed!) clone of this. + * + * @see #clone() + */ + public OperandStack getClone(){ + return (OperandStack) this.clone(); + } - /** - * Returns true IFF this OperandStack is empty. + /** + * Returns true IFF this OperandStack is empty. */ - public boolean isEmpty(){ - return stack.isEmpty(); - } + public boolean isEmpty(){ + return stack.isEmpty(); + } - /** - * Returns the number of stack slots this stack can hold. - */ - public int maxStack(){ - return this.maxStack; - } + /** + * Returns the number of stack slots this stack can hold. + */ + public int maxStack(){ + return this.maxStack; + } - /** - * Returns the element on top of the stack. The element is not popped off the stack! - */ - public Type peek(){ - return peek(0); - } + /** + * Returns the element on top of the stack. The element is not popped off the stack! + */ + public Type peek(){ + return peek(0); + } - /** + /** * Returns the element that's i elements below the top element; that means, * iff i==0 the top element is returned. The element is not popped off the stack! */ - public Type peek(int i){ - return stack.get(size()-i-1); - } + public Type peek(int i){ + return stack.get(size()-i-1); + } - /** - * Returns the element on top of the stack. The element is popped off the stack. - */ - public Type pop(){ - Type e = stack.remove(size()-1); - return e; - } + /** + * Returns the element on top of the stack. The element is popped off the stack. + */ + public Type pop(){ + Type e = stack.remove(size()-1); + return e; + } - /** - * Pops i elements off the stack. ALWAYS RETURNS "null"!!! - */ - public Type pop(int i){ - for (int j=0; j= maxStack){ - throw new AssertionViolatedException("OperandStack too small, should have thrown proper Exception elsewhere. Stack: "+this); - } - stack.add(type); - } + if (type == Type.BOOLEAN || type == Type.CHAR || type == Type.BYTE || type == Type.SHORT){ + throw new AssertionViolatedException("The OperandStack does not know about '"+type+"'; use Type.INT instead."); + } + if (slotsUsed() >= maxStack){ + throw new AssertionViolatedException("OperandStack too small, should have thrown proper Exception elsewhere. Stack: "+this); + } + stack.add(type); + } + + /** + * Returns the size of this OperandStack; that means, how many Type objects there are. + */ + public int size(){ + return stack.size(); + } - /** - * Returns the size of this OperandStack; that means, how many Type objects there are. - */ - public int size(){ - return stack.size(); - } + /** + * Returns the number of stack slots used. + * @see #maxStack() + */ + public int slotsUsed(){ + /* XXX change this to a better implementation using a variable + that keeps track of the actual slotsUsed()-value monitoring + all push()es and pop()s. + */ + int slots = 0; + for (int i=0; i ics = new Vector(); - private List> ecs = new Vector>(); - public void add(InstructionContext ic, ArrayList executionChain){ - ics.add(ic); - ecs.add(executionChain); - } - public boolean isEmpty(){ - return ics.isEmpty(); - } - public void remove(int i){ - ics.remove(i); - ecs.remove(i); - } - public InstructionContext getIC(int i){ - return ics.get(i); - } - public ArrayList getEC(int i){ - return ecs.get(i); - } - public int size(){ - return ics.size(); - } - } // end Inner Class InstructionContextQueue - - /** In DEBUG mode, the verification algorithm is not randomized. */ - private static final boolean DEBUG = true; - - /** The Verifier that created this. */ - private Verifier myOwner; - - /** The method number to verify. */ - private int method_no; - - /** - * This class should only be instantiated by a Verifier. - * - * @see org.apache.bcel.verifier.Verifier - */ - public Pass3bVerifier(Verifier owner, int method_no){ - myOwner = owner; - this.method_no = method_no; - } - - /** - * Whenever the outgoing frame - * situation of an InstructionContext changes, all its successors are - * put [back] into the queue [as if they were unvisited]. + /* TODO: Throughout pass 3b, upper halves of LONG and DOUBLE + are represented by Type.UNKNOWN. This should be changed + in favour of LONG_Upper and DOUBLE_Upper as in pass 2. */ + + /** + * An InstructionContextQueue is a utility class that holds + * (InstructionContext, ArrayList) pairs in a Queue data structure. + * This is used to hold information about InstructionContext objects + * externally --- i.e. that information is not saved inside the + * InstructionContext object itself. This is useful to save the + * execution path of the symbolic execution of the + * Pass3bVerifier - this is not information + * that belongs into the InstructionContext object itself. + * Only at "execute()"ing + * time, an InstructionContext object will get the current information + * we have about its symbolic execution predecessors. + */ + private static final class InstructionContextQueue{ + private List ics = new Vector(); + private List> ecs = new Vector>(); + public void add(InstructionContext ic, ArrayList executionChain){ + ics.add(ic); + ecs.add(executionChain); + } + public boolean isEmpty(){ + return ics.isEmpty(); + } + public void remove(int i){ + ics.remove(i); + ecs.remove(i); + } + public InstructionContext getIC(int i){ + return ics.get(i); + } + public ArrayList getEC(int i){ + return ecs.get(i); + } + public int size(){ + return ics.size(); + } + } // end Inner Class InstructionContextQueue + + /** In DEBUG mode, the verification algorithm is not randomized. */ + private static final boolean DEBUG = true; + + /** The Verifier that created this. */ + private Verifier myOwner; + + /** The method number to verify. */ + private int method_no; + + /** + * This class should only be instantiated by a Verifier. + * + * @see org.apache.bcel.verifier.Verifier + */ + public Pass3bVerifier(Verifier owner, int method_no){ + myOwner = owner; + this.method_no = method_no; + } + + /** + * Whenever the outgoing frame + * situation of an InstructionContext changes, all its successors are + * put [back] into the queue [as if they were unvisited]. * The proof of termination is about the existence of a * fix point of frame merging. - */ - private void circulationPump(MethodGen m,ControlFlowGraph cfg, InstructionContext start, Frame vanillaFrame, InstConstraintVisitor icv, ExecutionVisitor ev){ - final Random random = new Random(); - InstructionContextQueue icq = new InstructionContextQueue(); - - start.execute(vanillaFrame, new ArrayList(), icv, ev); // new ArrayList() <=> no Instruction was executed before - // => Top-Level routine (no jsr call before) - icq.add(start, new ArrayList()); - - // LOOP! - while (!icq.isEmpty()){ - InstructionContext u; - ArrayList ec; - if (!DEBUG){ - int r = random.nextInt(icq.size()); - u = icq.getIC(r); - ec = icq.getEC(r); - icq.remove(r); - } - else{ - u = icq.getIC(0); - ec = icq.getEC(0); - icq.remove(0); - } - - @SuppressWarnings("unchecked") // ec is of type ArrayList + */ + private void circulationPump(MethodGen m,ControlFlowGraph cfg, InstructionContext start, Frame vanillaFrame, InstConstraintVisitor icv, ExecutionVisitor ev){ + final Random random = new Random(); + InstructionContextQueue icq = new InstructionContextQueue(); + + start.execute(vanillaFrame, new ArrayList(), icv, ev); // new ArrayList() <=> no Instruction was executed before + // => Top-Level routine (no jsr call before) + icq.add(start, new ArrayList()); + + // LOOP! + while (!icq.isEmpty()){ + InstructionContext u; + ArrayList ec; + if (!DEBUG){ + int r = random.nextInt(icq.size()); + u = icq.getIC(r); + ec = icq.getEC(r); + icq.remove(r); + } + else{ + u = icq.getIC(0); + ec = icq.getEC(0); + icq.remove(0); + } + + @SuppressWarnings("unchecked") // ec is of type ArrayList ArrayList oldchain = (ArrayList) (ec.clone()); - @SuppressWarnings("unchecked") // ec is of type ArrayList + @SuppressWarnings("unchecked") // ec is of type ArrayList ArrayList newchain = (ArrayList) (ec.clone()); - newchain.add(u); + newchain.add(u); if ((u.getInstruction().getInstruction()) instanceof RET){ //System.err.println(u); - // We can only follow _one_ successor, the one after the - // JSR that was recently executed. - RET ret = (RET) (u.getInstruction().getInstruction()); - ReturnaddressType t = (ReturnaddressType) u.getOutFrame(oldchain).getLocals().get(ret.getIndex()); - InstructionContext theSuccessor = cfg.contextOf(t.getTarget()); - - // Sanity check - InstructionContext lastJSR = null; - int skip_jsr = 0; - for (int ss=oldchain.size()-1; ss >= 0; ss--){ - if (skip_jsr < 0){ - throw new AssertionViolatedException("More RET than JSR in execution chain?!"); - } + // We can only follow _one_ successor, the one after the + // JSR that was recently executed. + RET ret = (RET) (u.getInstruction().getInstruction()); + ReturnaddressType t = (ReturnaddressType) u.getOutFrame(oldchain).getLocals().get(ret.getIndex()); + InstructionContext theSuccessor = cfg.contextOf(t.getTarget()); + + // Sanity check + InstructionContext lastJSR = null; + int skip_jsr = 0; + for (int ss=oldchain.size()-1; ss >= 0; ss--){ + if (skip_jsr < 0){ + throw new AssertionViolatedException("More RET than JSR in execution chain?!"); + } //System.err.println("+"+oldchain.get(ss)); - if ((oldchain.get(ss)).getInstruction().getInstruction() instanceof JsrInstruction){ - if (skip_jsr == 0){ - lastJSR = oldchain.get(ss); - break; - } - else{ - skip_jsr--; - } - } - if ((oldchain.get(ss)).getInstruction().getInstruction() instanceof RET){ - skip_jsr++; - } - } - if (lastJSR == null){ - throw new AssertionViolatedException("RET without a JSR before in ExecutionChain?! EC: '"+oldchain+"'."); - } - JsrInstruction jsr = (JsrInstruction) (lastJSR.getInstruction().getInstruction()); - if ( theSuccessor != (cfg.contextOf(jsr.physicalSuccessor())) ){ - throw new AssertionViolatedException("RET '"+u.getInstruction()+"' info inconsistent: jump back to '"+theSuccessor+"' or '"+cfg.contextOf(jsr.physicalSuccessor())+"'?"); - } - - if (theSuccessor.execute(u.getOutFrame(oldchain), newchain, icv, ev)){ - @SuppressWarnings("unchecked") // newchain is already of type ArrayList + if ((oldchain.get(ss)).getInstruction().getInstruction() instanceof JsrInstruction){ + if (skip_jsr == 0){ + lastJSR = oldchain.get(ss); + break; + } + else{ + skip_jsr--; + } + } + if ((oldchain.get(ss)).getInstruction().getInstruction() instanceof RET){ + skip_jsr++; + } + } + if (lastJSR == null){ + throw new AssertionViolatedException("RET without a JSR before in ExecutionChain?! EC: '"+oldchain+"'."); + } + JsrInstruction jsr = (JsrInstruction) (lastJSR.getInstruction().getInstruction()); + if ( theSuccessor != (cfg.contextOf(jsr.physicalSuccessor())) ){ + throw new AssertionViolatedException("RET '"+u.getInstruction()+"' info inconsistent: jump back to '"+theSuccessor+"' or '"+cfg.contextOf(jsr.physicalSuccessor())+"'?"); + } + + if (theSuccessor.execute(u.getOutFrame(oldchain), newchain, icv, ev)){ + @SuppressWarnings("unchecked") // newchain is already of type ArrayList ArrayList newchainClone = (ArrayList) newchain.clone(); - icq.add(theSuccessor, newchainClone); - } - } - else{// "not a ret" - - // Normal successors. Add them to the queue of successors. - InstructionContext[] succs = u.getSuccessors(); - for (InstructionContext v : succs) { - if (v.execute(u.getOutFrame(oldchain), newchain, icv, ev)){ - @SuppressWarnings("unchecked") // newchain is already of type ArrayList - ArrayList newchainClone = (ArrayList) newchain.clone(); - icq.add(v, newchainClone); - } - } - }// end "not a ret" - - // Exception Handlers. Add them to the queue of successors. - // [subroutines are never protected; mandated by JustIce] - ExceptionHandler[] exc_hds = u.getExceptionHandlers(); - for (ExceptionHandler exc_hd : exc_hds) { - InstructionContext v = cfg.contextOf(exc_hd.getHandlerStart()); - // TODO: the "oldchain" and "newchain" is used to determine the subroutine - // we're in (by searching for the last JSR) by the InstructionContext - // implementation. Therefore, we should not use this chain mechanism - // when dealing with exception handlers. - // Example: a JSR with an exception handler as its successor does not - // mean we're in a subroutine if we go to the exception handler. - // We should address this problem later; by now we simply "cut" the chain - // by using an empty chain for the exception handlers. - //if (v.execute(new Frame(u.getOutFrame(oldchain).getLocals(), new OperandStack (u.getOutFrame().getStack().maxStack(), (exc_hds[s].getExceptionType()==null? Type.THROWABLE : exc_hds[s].getExceptionType())) ), newchain), icv, ev){ - //icq.add(v, (ArrayList) newchain.clone()); - if (v.execute(new Frame(u.getOutFrame(oldchain).getLocals(), new OperandStack (u.getOutFrame(oldchain).getStack().maxStack(), (exc_hd.getExceptionType()==null? Type.THROWABLE : exc_hd.getExceptionType())) ), new ArrayList(), icv, ev)){ - icq.add(v, new ArrayList()); - } - } - - }// while (!icq.isEmpty()) END - - InstructionHandle ih = start.getInstruction(); - do{ - if ((ih.getInstruction() instanceof ReturnInstruction) && (!(cfg.isDead(ih)))) { - InstructionContext ic = cfg.contextOf(ih); - Frame f = ic.getOutFrame(new ArrayList()); // TODO: This is buggy, we check only the top-level return instructions this way. Maybe some maniac returns from a method when in a subroutine? - LocalVariables lvs = f.getLocals(); - for (int i=0; i + ArrayList newchainClone = (ArrayList) newchain.clone(); + icq.add(v, newchainClone); + } + } + }// end "not a ret" + + // Exception Handlers. Add them to the queue of successors. + // [subroutines are never protected; mandated by JustIce] + ExceptionHandler[] exc_hds = u.getExceptionHandlers(); + for (ExceptionHandler exc_hd : exc_hds) { + InstructionContext v = cfg.contextOf(exc_hd.getHandlerStart()); + // TODO: the "oldchain" and "newchain" is used to determine the subroutine + // we're in (by searching for the last JSR) by the InstructionContext + // implementation. Therefore, we should not use this chain mechanism + // when dealing with exception handlers. + // Example: a JSR with an exception handler as its successor does not + // mean we're in a subroutine if we go to the exception handler. + // We should address this problem later; by now we simply "cut" the chain + // by using an empty chain for the exception handlers. + //if (v.execute(new Frame(u.getOutFrame(oldchain).getLocals(), new OperandStack (u.getOutFrame().getStack().maxStack(), (exc_hds[s].getExceptionType()==null? Type.THROWABLE : exc_hds[s].getExceptionType())) ), newchain), icv, ev){ + //icq.add(v, (ArrayList) newchain.clone()); + if (v.execute(new Frame(u.getOutFrame(oldchain).getLocals(), new OperandStack (u.getOutFrame(oldchain).getStack().maxStack(), (exc_hd.getExceptionType()==null? Type.THROWABLE : exc_hd.getExceptionType())) ), new ArrayList(), icv, ev)){ + icq.add(v, new ArrayList()); + } + } + + }// while (!icq.isEmpty()) END + + InstructionHandle ih = start.getInstruction(); + do{ + if ((ih.getInstruction() instanceof ReturnInstruction) && (!(cfg.isDead(ih)))) { + InstructionContext ic = cfg.contextOf(ih); + Frame f = ic.getOutFrame(new ArrayList()); // TODO: This is buggy, we check only the top-level return instructions this way. Maybe some maniac returns from a method when in a subroutine? + LocalVariables lvs = f.getLocals(); + for (int i=0; iMust not be invoked on the 'top-level subroutine'. - */ - InstructionHandle[] getEnteringJsrInstructions(); - - /** - * Returns the one and only RET that leaves the subroutine. - * Note that JustIce has a pretty rigid notion of a subroutine. - * Must not be invoked on the 'top-level subroutine'. - * - * @see org.apache.bcel.verifier.structurals.Subroutines - */ - InstructionHandle getLeavingRET(); + /** + * Returns all the JsrInstructions that have the + * first instruction of this subroutine as their target. + * Must not be invoked on the 'top-level subroutine'. + */ + InstructionHandle[] getEnteringJsrInstructions(); - /** - * Returns all instructions that together form this subroutine. - * Note that an instruction is part of exactly one subroutine - * (the top-level code is considered to be a special subroutine) - - * else it is not reachable at all (dead code). - */ - InstructionHandle[] getInstructions(); + /** + * Returns the one and only RET that leaves the subroutine. + * Note that JustIce has a pretty rigid notion of a subroutine. + * Must not be invoked on the 'top-level subroutine'. + * + * @see org.apache.bcel.verifier.structurals.Subroutines + */ + InstructionHandle getLeavingRET(); - /** - * Returns if the given InstructionHandle refers to an instruction - * that is part of this subroutine. This is a convenience method - * that saves iteration over the InstructionHandle objects returned - * by getInstructions(). - * - * @see #getInstructions() - */ - boolean contains(InstructionHandle inst); + /** + * Returns all instructions that together form this subroutine. + * Note that an instruction is part of exactly one subroutine + * (the top-level code is considered to be a special subroutine) - + * else it is not reachable at all (dead code). + */ + InstructionHandle[] getInstructions(); - /** - * Returns an int[] containing the indices of the local variable slots - * accessed by this Subroutine (read-accessed, write-accessed or both); - * local variables referenced by subroutines of this subroutine are - * not included. - * - * @see #getRecursivelyAccessedLocalsIndices() - */ - int[] getAccessedLocalsIndices(); + /** + * Returns if the given InstructionHandle refers to an instruction + * that is part of this subroutine. This is a convenience method + * that saves iteration over the InstructionHandle objects returned + * by getInstructions(). + * + * @see #getInstructions() + */ + boolean contains(InstructionHandle inst); - /** - * Returns an int[] containing the indices of the local variable slots - * accessed by this Subroutine (read-accessed, write-accessed or both); - * local variables referenced by subroutines of this subroutine are - * included. - * - * @see #getAccessedLocalsIndices() - */ - int[] getRecursivelyAccessedLocalsIndices(); - - /** - * Returns the subroutines that are directly called from this subroutine. - */ - Subroutine[] subSubs(); + /** + * Returns an int[] containing the indices of the local variable slots + * accessed by this Subroutine (read-accessed, write-accessed or both); + * local variables referenced by subroutines of this subroutine are + * not included. + * + * @see #getRecursivelyAccessedLocalsIndices() + */ + int[] getAccessedLocalsIndices(); + + /** + * Returns an int[] containing the indices of the local variable slots + * accessed by this Subroutine (read-accessed, write-accessed or both); + * local variables referenced by subroutines of this subroutine are + * included. + * + * @see #getAccessedLocalsIndices() + */ + int[] getRecursivelyAccessedLocalsIndices(); + + /** + * Returns the subroutines that are directly called from this subroutine. + */ + Subroutine[] subSubs(); } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index a86beca3..d0ffa510 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -41,607 +41,607 @@ import org.apache.bcel.generic.Select; import org.apache.bcel.verifier.exc.AssertionViolatedException; import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; - /** - * Instances of this class contain information about the subroutines - * found in a code array of a method. - * This implementation considers the top-level (the instructions - * reachable without a JSR or JSR_W starting off from the first - * instruction in a code array of a method) being a special subroutine; - * see getTopLevel() for that. - * Please note that the definition of subroutines in the Java Virtual - * Machine Specification, Second Edition is somewhat incomplete. - * Therefore, JustIce uses an own, more rigid notion. - * Basically, a subroutine is a piece of code that starts at the target - * of a JSR of JSR_W instruction and ends at a corresponding RET - * instruction. Note also that the control flow of a subroutine - * may be complex and non-linear; and that subroutines may be nested. - * JustIce also mandates subroutines not to be protected by exception - * handling code (for the sake of control flow predictability). - * To understand JustIce's notion of subroutines, please read + /** + * Instances of this class contain information about the subroutines + * found in a code array of a method. + * This implementation considers the top-level (the instructions + * reachable without a JSR or JSR_W starting off from the first + * instruction in a code array of a method) being a special subroutine; + * see getTopLevel() for that. + * Please note that the definition of subroutines in the Java Virtual + * Machine Specification, Second Edition is somewhat incomplete. + * Therefore, JustIce uses an own, more rigid notion. + * Basically, a subroutine is a piece of code that starts at the target + * of a JSR of JSR_W instruction and ends at a corresponding RET + * instruction. Note also that the control flow of a subroutine + * may be complex and non-linear; and that subroutines may be nested. + * JustIce also mandates subroutines not to be protected by exception + * handling code (for the sake of control flow predictability). + * To understand JustIce's notion of subroutines, please read * - * TODO: refer to the paper. - * - * @version $Id$ - * @author Enver Haase - * @see #getTopLevel() - */ + * TODO: refer to the paper. + * + * @version $Id$ + * @author Enver Haase + * @see #getTopLevel() + */ public class Subroutines{ - /** - * This inner class implements the Subroutine interface. - */ - private class SubroutineImpl implements Subroutine{ - /** - * UNSET, a symbol for an uninitialized localVariable - * field. This is used for the "top-level" Subroutine; - * i.e. no subroutine. - */ - private static final int UNSET = -1; - - /** - * The Local Variable slot where the first - * instruction of this subroutine (an ASTORE) stores - * the JsrInstruction's ReturnAddress in and - * the RET of this subroutine operates on. - */ - private int localVariable = UNSET; - - /** The instructions that belong to this subroutine. */ - private Set instructions = new HashSet(); // Elements: InstructionHandle - - /* - * Refer to the Subroutine interface for documentation. - */ - public boolean contains(InstructionHandle inst){ - return instructions.contains(inst); - } - - /** - * The JSR or JSR_W instructions that define this - * subroutine by targeting it. - */ - private Set theJSRs = new HashSet(); - - /** - * The RET instruction that leaves this subroutine. - */ - private InstructionHandle theRET; - - /** - * Returns a String representation of this object, merely - * for debugging purposes. - * (Internal) Warning: Verbosity on a problematic subroutine may cause - * stack overflow errors due to recursive subSubs() calls. - * Don't use this, then. - */ - @Override + /** + * This inner class implements the Subroutine interface. + */ + private class SubroutineImpl implements Subroutine{ + /** + * UNSET, a symbol for an uninitialized localVariable + * field. This is used for the "top-level" Subroutine; + * i.e. no subroutine. + */ + private static final int UNSET = -1; + + /** + * The Local Variable slot where the first + * instruction of this subroutine (an ASTORE) stores + * the JsrInstruction's ReturnAddress in and + * the RET of this subroutine operates on. + */ + private int localVariable = UNSET; + + /** The instructions that belong to this subroutine. */ + private Set instructions = new HashSet(); // Elements: InstructionHandle + + /* + * Refer to the Subroutine interface for documentation. + */ + public boolean contains(InstructionHandle inst){ + return instructions.contains(inst); + } + + /** + * The JSR or JSR_W instructions that define this + * subroutine by targeting it. + */ + private Set theJSRs = new HashSet(); + + /** + * The RET instruction that leaves this subroutine. + */ + private InstructionHandle theRET; + + /** + * Returns a String representation of this object, merely + * for debugging purposes. + * (Internal) Warning: Verbosity on a problematic subroutine may cause + * stack overflow errors due to recursive subSubs() calls. + * Don't use this, then. + */ + @Override public String toString(){ - String ret = "Subroutine: Local variable is '"+localVariable+"', JSRs are '"+theJSRs+"', RET is '"+theRET+"', Instructions: '"+instructions+"'."; - - ret += " Accessed local variable slots: '"; - int[] alv = getAccessedLocalsIndices(); - for (int element : alv) { - ret += element+" "; - } - ret+="'."; - - ret += " Recursively (via subsub...routines) accessed local variable slots: '"; - alv = getRecursivelyAccessedLocalsIndices(); - for (int element : alv) { - ret += element+" "; - } - ret+="'."; - - return ret; - } - - /** - * Sets the leaving RET instruction. Must be invoked after all instructions are added. - * Must not be invoked for top-level 'subroutine'. - */ - void setLeavingRET(){ - if (localVariable == UNSET){ - throw new AssertionViolatedException("setLeavingRET() called for top-level 'subroutine' or forgot to set local variable first."); - } - InstructionHandle ret = null; - for (InstructionHandle actual : instructions) { - if (actual.getInstruction() instanceof RET){ - if (ret != null){ - throw new StructuralCodeConstraintException("Subroutine with more then one RET detected: '"+ret+"' and '"+actual+"'."); - } - else{ - ret = actual; - } - } - } - if (ret == null){ - throw new StructuralCodeConstraintException("Subroutine without a RET detected."); - } - if (((RET) ret.getInstruction()).getIndex() != localVariable){ - throw new StructuralCodeConstraintException("Subroutine uses '"+ret+"' which does not match the correct local variable '"+localVariable+"'."); - } - theRET = ret; - } - - /* - * Refer to the Subroutine interface for documentation. - */ - public InstructionHandle[] getEnteringJsrInstructions(){ - if (this == TOPLEVEL) { - throw new AssertionViolatedException("getLeavingRET() called on top level pseudo-subroutine."); - } - InstructionHandle[] jsrs = new InstructionHandle[theJSRs.size()]; - return theJSRs.toArray(jsrs); - } - - /** - * Adds a new JSR or JSR_W that has this subroutine as its target. - */ - public void addEnteringJsrInstruction(InstructionHandle jsrInst){ - if ( (jsrInst == null) || (! (jsrInst.getInstruction() instanceof JsrInstruction))){ - throw new AssertionViolatedException("Expecting JsrInstruction InstructionHandle."); - } - if (localVariable == UNSET){ - throw new AssertionViolatedException("Set the localVariable first!"); - } - else{ - // Something is wrong when an ASTORE is targeted that does not operate on the same local variable than the rest of the - // JsrInstruction-targets and the RET. - // (We don't know out leader here so we cannot check if we're really targeted!) - if (localVariable != ((ASTORE) (((JsrInstruction) jsrInst.getInstruction()).getTarget().getInstruction())).getIndex()){ - throw new AssertionViolatedException("Setting a wrong JsrInstruction."); - } - } - theJSRs.add(jsrInst); - } - - /* - * Refer to the Subroutine interface for documentation. - */ - public InstructionHandle getLeavingRET(){ - if (this == TOPLEVEL) { - throw new AssertionViolatedException("getLeavingRET() called on top level pseudo-subroutine."); - } - return theRET; - } - - /* - * Refer to the Subroutine interface for documentation. - */ - public InstructionHandle[] getInstructions(){ - InstructionHandle[] ret = new InstructionHandle[instructions.size()]; - return instructions.toArray(ret); - } - - /* - * Adds an instruction to this subroutine. - * All instructions must have been added before invoking setLeavingRET(). - * @see #setLeavingRET - */ - void addInstruction(InstructionHandle ih){ - if (theRET != null){ - throw new AssertionViolatedException("All instructions must have been added before invoking setLeavingRET()."); - } - instructions.add(ih); - } - - /* Satisfies Subroutine.getRecursivelyAccessedLocalsIndices(). */ - public int[] getRecursivelyAccessedLocalsIndices(){ - Set s = new HashSet(); - int[] lvs = getAccessedLocalsIndices(); - for (int lv : lvs) { - s.add(Integer.valueOf(lv)); - } - _getRecursivelyAccessedLocalsIndicesHelper(s, this.subSubs()); - int[] ret = new int[s.size()]; - int j=-1; - for (Integer index : s) { - j++; - ret[j] = index.intValue(); - } - return ret; - } - - /** - * A recursive helper method for getRecursivelyAccessedLocalsIndices(). - * @see #getRecursivelyAccessedLocalsIndices() - */ - private void _getRecursivelyAccessedLocalsIndicesHelper(Set s, Subroutine[] subs){ - for (Subroutine sub : subs) { - int[] lvs = sub.getAccessedLocalsIndices(); - for (int lv : lvs) { - s.add(Integer.valueOf(lv)); - } - if(sub.subSubs().length != 0){ - _getRecursivelyAccessedLocalsIndicesHelper(s, sub.subSubs()); - } - } - } - - /* - * Satisfies Subroutine.getAccessedLocalIndices(). - */ - public int[] getAccessedLocalsIndices(){ - //TODO: Implement caching. - Set acc = new HashSet(); - if (theRET == null && this != TOPLEVEL){ - throw new AssertionViolatedException("This subroutine object must be built up completely before calculating accessed locals."); - } - { - for (InstructionHandle ih : instructions) { - // RET is not a LocalVariableInstruction in the current version of BCEL. - if (ih.getInstruction() instanceof LocalVariableInstruction || ih.getInstruction() instanceof RET){ - int idx = ((IndexedInstruction) (ih.getInstruction())).getIndex(); - acc.add(Integer.valueOf(idx)); - // LONG? DOUBLE?. - try{ - // LocalVariableInstruction instances are typed without the need to look into - // the constant pool. - if (ih.getInstruction() instanceof LocalVariableInstruction){ - int s = ((LocalVariableInstruction) ih.getInstruction()).getType(null).getSize(); - if (s==2) { + String ret = "Subroutine: Local variable is '"+localVariable+"', JSRs are '"+theJSRs+"', RET is '"+theRET+"', Instructions: '"+instructions+"'."; + + ret += " Accessed local variable slots: '"; + int[] alv = getAccessedLocalsIndices(); + for (int element : alv) { + ret += element+" "; + } + ret+="'."; + + ret += " Recursively (via subsub...routines) accessed local variable slots: '"; + alv = getRecursivelyAccessedLocalsIndices(); + for (int element : alv) { + ret += element+" "; + } + ret+="'."; + + return ret; + } + + /** + * Sets the leaving RET instruction. Must be invoked after all instructions are added. + * Must not be invoked for top-level 'subroutine'. + */ + void setLeavingRET(){ + if (localVariable == UNSET){ + throw new AssertionViolatedException("setLeavingRET() called for top-level 'subroutine' or forgot to set local variable first."); + } + InstructionHandle ret = null; + for (InstructionHandle actual : instructions) { + if (actual.getInstruction() instanceof RET){ + if (ret != null){ + throw new StructuralCodeConstraintException("Subroutine with more then one RET detected: '"+ret+"' and '"+actual+"'."); + } + else{ + ret = actual; + } + } + } + if (ret == null){ + throw new StructuralCodeConstraintException("Subroutine without a RET detected."); + } + if (((RET) ret.getInstruction()).getIndex() != localVariable){ + throw new StructuralCodeConstraintException("Subroutine uses '"+ret+"' which does not match the correct local variable '"+localVariable+"'."); + } + theRET = ret; + } + + /* + * Refer to the Subroutine interface for documentation. + */ + public InstructionHandle[] getEnteringJsrInstructions(){ + if (this == TOPLEVEL) { + throw new AssertionViolatedException("getLeavingRET() called on top level pseudo-subroutine."); + } + InstructionHandle[] jsrs = new InstructionHandle[theJSRs.size()]; + return theJSRs.toArray(jsrs); + } + + /** + * Adds a new JSR or JSR_W that has this subroutine as its target. + */ + public void addEnteringJsrInstruction(InstructionHandle jsrInst){ + if ( (jsrInst == null) || (! (jsrInst.getInstruction() instanceof JsrInstruction))){ + throw new AssertionViolatedException("Expecting JsrInstruction InstructionHandle."); + } + if (localVariable == UNSET){ + throw new AssertionViolatedException("Set the localVariable first!"); + } + else{ + // Something is wrong when an ASTORE is targeted that does not operate on the same local variable than the rest of the + // JsrInstruction-targets and the RET. + // (We don't know out leader here so we cannot check if we're really targeted!) + if (localVariable != ((ASTORE) (((JsrInstruction) jsrInst.getInstruction()).getTarget().getInstruction())).getIndex()){ + throw new AssertionViolatedException("Setting a wrong JsrInstruction."); + } + } + theJSRs.add(jsrInst); + } + + /* + * Refer to the Subroutine interface for documentation. + */ + public InstructionHandle getLeavingRET(){ + if (this == TOPLEVEL) { + throw new AssertionViolatedException("getLeavingRET() called on top level pseudo-subroutine."); + } + return theRET; + } + + /* + * Refer to the Subroutine interface for documentation. + */ + public InstructionHandle[] getInstructions(){ + InstructionHandle[] ret = new InstructionHandle[instructions.size()]; + return instructions.toArray(ret); + } + + /* + * Adds an instruction to this subroutine. + * All instructions must have been added before invoking setLeavingRET(). + * @see #setLeavingRET + */ + void addInstruction(InstructionHandle ih){ + if (theRET != null){ + throw new AssertionViolatedException("All instructions must have been added before invoking setLeavingRET()."); + } + instructions.add(ih); + } + + /* Satisfies Subroutine.getRecursivelyAccessedLocalsIndices(). */ + public int[] getRecursivelyAccessedLocalsIndices(){ + Set s = new HashSet(); + int[] lvs = getAccessedLocalsIndices(); + for (int lv : lvs) { + s.add(Integer.valueOf(lv)); + } + _getRecursivelyAccessedLocalsIndicesHelper(s, this.subSubs()); + int[] ret = new int[s.size()]; + int j=-1; + for (Integer index : s) { + j++; + ret[j] = index.intValue(); + } + return ret; + } + + /** + * A recursive helper method for getRecursivelyAccessedLocalsIndices(). + * @see #getRecursivelyAccessedLocalsIndices() + */ + private void _getRecursivelyAccessedLocalsIndicesHelper(Set s, Subroutine[] subs){ + for (Subroutine sub : subs) { + int[] lvs = sub.getAccessedLocalsIndices(); + for (int lv : lvs) { + s.add(Integer.valueOf(lv)); + } + if(sub.subSubs().length != 0){ + _getRecursivelyAccessedLocalsIndicesHelper(s, sub.subSubs()); + } + } + } + + /* + * Satisfies Subroutine.getAccessedLocalIndices(). + */ + public int[] getAccessedLocalsIndices(){ + //TODO: Implement caching. + Set acc = new HashSet(); + if (theRET == null && this != TOPLEVEL){ + throw new AssertionViolatedException("This subroutine object must be built up completely before calculating accessed locals."); + } + { + for (InstructionHandle ih : instructions) { + // RET is not a LocalVariableInstruction in the current version of BCEL. + if (ih.getInstruction() instanceof LocalVariableInstruction || ih.getInstruction() instanceof RET){ + int idx = ((IndexedInstruction) (ih.getInstruction())).getIndex(); + acc.add(Integer.valueOf(idx)); + // LONG? DOUBLE?. + try{ + // LocalVariableInstruction instances are typed without the need to look into + // the constant pool. + if (ih.getInstruction() instanceof LocalVariableInstruction){ + int s = ((LocalVariableInstruction) ih.getInstruction()).getType(null).getSize(); + if (s==2) { acc.add(Integer.valueOf(idx+1)); } - } - } - catch(RuntimeException re){ - throw new AssertionViolatedException("Oops. BCEL did not like NULL as a ConstantPoolGen object.", re); - } - } - } - } - - { - int[] ret = new int[acc.size()]; - int j=-1; - for (Integer accessedLocal : acc) { - j++; - ret[j] = accessedLocal.intValue(); - } - return ret; - } - } - - /* - * Satisfies Subroutine.subSubs(). - */ - public Subroutine[] subSubs(){ - Set h = new HashSet(); - - for (InstructionHandle ih : instructions) { - Instruction inst = ih.getInstruction(); - if (inst instanceof JsrInstruction){ - InstructionHandle targ = ((JsrInstruction) inst).getTarget(); - h.add(getSubroutine(targ)); - } - } - Subroutine[] ret = new Subroutine[h.size()]; - return h.toArray(ret); - } - - /* - * Sets the local variable slot the ASTORE that is targeted - * by the JsrInstructions of this subroutine operates on. - * This subroutine's RET operates on that same local variable - * slot, of course. - */ - void setLocalVariable(int i){ - if (localVariable != UNSET){ - throw new AssertionViolatedException("localVariable set twice."); - } - else{ - localVariable = i; - } - } - - /** - * The default constructor. - */ - public SubroutineImpl(){ - } - - }// end Inner Class SubrouteImpl - - //Node coloring constants - private static final Integer WHITE = Integer.valueOf(0); - private static final Integer GRAY = Integer.valueOf(1); - private static final Integer BLACK = Integer.valueOf(2); - - /** - * The map containing the subroutines found. - * Key: InstructionHandle of the leader of the subroutine. - * Elements: SubroutineImpl objects. - */ - private Map subroutines = new HashMap(); - - /** - * This is referring to a special subroutine, namely the - * top level. This is not really a subroutine but we use - * it to distinguish between top level instructions and - * unreachable instructions. - */ - public final Subroutine TOPLEVEL; - - /** - * Constructor. - * @param mg A MethodGen object representing method to - * create the Subroutine objects of. - */ - public Subroutines(MethodGen mg){ - - InstructionHandle[] all = mg.getInstructionList().getInstructionHandles(); - CodeExceptionGen[] handlers = mg.getExceptionHandlers(); - - // Define our "Toplevel" fake subroutine. - TOPLEVEL = new SubroutineImpl(); - - // Calculate "real" subroutines. - Set sub_leaders = new HashSet(); // Elements: InstructionHandle - for (InstructionHandle element : all) { - Instruction inst = element.getInstruction(); - if (inst instanceof JsrInstruction){ - sub_leaders.add(((JsrInstruction) inst).getTarget()); - } - } - - // Build up the database. - for (InstructionHandle astore : sub_leaders) { - SubroutineImpl sr = new SubroutineImpl(); - sr.setLocalVariable( ((ASTORE) (astore.getInstruction())).getIndex() ); - subroutines.put(astore, sr); - } - - // Fake it a bit. We want a virtual "TopLevel" subroutine. - subroutines.put(all[0], TOPLEVEL); - sub_leaders.add(all[0]); - - // Tell the subroutines about their JsrInstructions. - // Note that there cannot be a JSR targeting the top-level - // since "Jsr 0" is disallowed in Pass 3a. - // Instructions shared by a subroutine and the toplevel are - // disallowed and checked below, after the BFS. - for (InstructionHandle element : all) { - Instruction inst = element.getInstruction(); - if (inst instanceof JsrInstruction){ - InstructionHandle leader = ((JsrInstruction) inst).getTarget(); - ((SubroutineImpl) getSubroutine(leader)).addEnteringJsrInstruction(element); - } - } - - // Now do a BFS from every subroutine leader to find all the - // instructions that belong to a subroutine. - Set instructions_assigned = new HashSet(); // we don't want to assign an instruction to two or more Subroutine objects. - - Map colors = new HashMap(); //Graph colouring. Key: InstructionHandle, Value: Integer . - - List Q = new ArrayList(); - for (InstructionHandle actual : sub_leaders) { - // Do some BFS with "actual" as the root of the graph. - // Init colors - for (InstructionHandle element : all) { - colors.put(element, WHITE); - } - colors.put(actual, GRAY); - // Init Queue - - Q.clear(); - Q.add(actual); // add(Obj) adds to the end, remove(0) removes from the start. - - /* BFS ALGORITHM MODIFICATION: Start out with multiple "root" nodes, as exception handlers are starting points of top-level code, too. [why top-level? TODO: Refer to the special JustIce notion of subroutines.]*/ - if (actual == all[0]){ - for (CodeExceptionGen handler : handlers) { - colors.put(handler.getHandlerPC(), GRAY); - Q.add(handler.getHandlerPC()); - } - } - /* CONTINUE NORMAL BFS ALGORITHM */ - - // Loop until Queue is empty - while (Q.size() != 0){ - InstructionHandle u = Q.remove(0); - InstructionHandle[] successors = getSuccessors(u); - for (InstructionHandle successor : successors) { - if (colors.get(successor) == WHITE){ - colors.put(successor, GRAY); - Q.add(successor); - } - } - colors.put(u, BLACK); - } - // BFS ended above. - for (InstructionHandle element : all) { - if (colors.get(element) == BLACK){ - ((SubroutineImpl) (actual==all[0]?getTopLevel():getSubroutine(actual))).addInstruction(element); - if (instructions_assigned.contains(element)){ - throw new StructuralCodeConstraintException("Instruction '"+element+"' is part of more than one subroutine (or of the top level and a subroutine)."); - } - else{ - instructions_assigned.add(element); - } - } - } - if (actual != all[0]){// If we don't deal with the top-level 'subroutine' - ((SubroutineImpl) getSubroutine(actual)).setLeavingRET(); - } - } - - // Now make sure no instruction of a Subroutine is protected by exception handling code - // as is mandated by JustIces notion of subroutines. - for (CodeExceptionGen handler : handlers) { - InstructionHandle _protected = handler.getStartPC(); - while (_protected != handler.getEndPC().getNext()){// Note the inclusive/inclusive notation of "generic API" exception handlers! - for (Subroutine sub : subroutines.values()) { - if (sub != subroutines.get(all[0])){ // We don't want to forbid top-level exception handlers. - if (sub.contains(_protected)){ - throw new StructuralCodeConstraintException("Subroutine instruction '"+_protected+"' is protected by an exception handler, '"+handler+"'. This is forbidden by the JustIce verifier due to its clear definition of subroutines."); - } - } - } - _protected = _protected.getNext(); - } - } - - // Now make sure no subroutine is calling a subroutine - // that uses the same local variable for the RET as themselves - // (recursively). - // This includes that subroutines may not call themselves - // recursively, even not through intermediate calls to other - // subroutines. - noRecursiveCalls(getTopLevel(), new HashSet()); - - } - - /** - * This (recursive) utility method makes sure that - * no subroutine is calling a subroutine - * that uses the same local variable for the RET as themselves - * (recursively). - * This includes that subroutines may not call themselves - * recursively, even not through intermediate calls to other - * subroutines. - * - * @throws StructuralCodeConstraintException if the above constraint is not satisfied. - */ - private void noRecursiveCalls(Subroutine sub, Set set){ - Subroutine[] subs = sub.subSubs(); - - for (Subroutine sub2 : subs) { - int index = ((RET) (sub2.getLeavingRET().getInstruction())).getIndex(); - - if (!set.add(Integer.valueOf(index))){ - // Don't use toString() here because of possibly infinite recursive subSubs() calls then. - SubroutineImpl si = (SubroutineImpl) sub2; - throw new StructuralCodeConstraintException("Subroutine with local variable '"+si.localVariable+"', JSRs '"+si.theJSRs+"', RET '"+si.theRET+"' is called by a subroutine which uses the same local variable index as itself; maybe even a recursive call? JustIce's clean definition of a subroutine forbids both."); - } - - noRecursiveCalls(sub2, set); - - set.remove(Integer.valueOf(index)); - } - } - - /** - * Returns the Subroutine object associated with the given - * leader (that is, the first instruction of the subroutine). - * You must not use this to get the top-level instructions - * modeled as a Subroutine object. - * - * @see #getTopLevel() - */ - public Subroutine getSubroutine(InstructionHandle leader){ - Subroutine ret = subroutines.get(leader); - - if (ret == null){ - throw new AssertionViolatedException("Subroutine requested for an InstructionHandle that is not a leader of a subroutine."); - } - - if (ret == TOPLEVEL){ - throw new AssertionViolatedException("TOPLEVEL special subroutine requested; use getTopLevel()."); - } - - return ret; - } - - /** - * Returns the subroutine object associated with the - * given instruction. This is a costly operation, you - * should consider using getSubroutine(InstructionHandle). - * Returns 'null' if the given InstructionHandle lies - * in so-called 'dead code', i.e. code that can never - * be executed. - * - * @see #getSubroutine(InstructionHandle) - * @see #getTopLevel() - */ - public Subroutine subroutineOf(InstructionHandle any){ - for (Subroutine s : subroutines.values()) { - if (s.contains(any)) { + } + } + catch(RuntimeException re){ + throw new AssertionViolatedException("Oops. BCEL did not like NULL as a ConstantPoolGen object.", re); + } + } + } + } + + { + int[] ret = new int[acc.size()]; + int j=-1; + for (Integer accessedLocal : acc) { + j++; + ret[j] = accessedLocal.intValue(); + } + return ret; + } + } + + /* + * Satisfies Subroutine.subSubs(). + */ + public Subroutine[] subSubs(){ + Set h = new HashSet(); + + for (InstructionHandle ih : instructions) { + Instruction inst = ih.getInstruction(); + if (inst instanceof JsrInstruction){ + InstructionHandle targ = ((JsrInstruction) inst).getTarget(); + h.add(getSubroutine(targ)); + } + } + Subroutine[] ret = new Subroutine[h.size()]; + return h.toArray(ret); + } + + /* + * Sets the local variable slot the ASTORE that is targeted + * by the JsrInstructions of this subroutine operates on. + * This subroutine's RET operates on that same local variable + * slot, of course. + */ + void setLocalVariable(int i){ + if (localVariable != UNSET){ + throw new AssertionViolatedException("localVariable set twice."); + } + else{ + localVariable = i; + } + } + + /** + * The default constructor. + */ + public SubroutineImpl(){ + } + + }// end Inner Class SubrouteImpl + + //Node coloring constants + private static final Integer WHITE = Integer.valueOf(0); + private static final Integer GRAY = Integer.valueOf(1); + private static final Integer BLACK = Integer.valueOf(2); + + /** + * The map containing the subroutines found. + * Key: InstructionHandle of the leader of the subroutine. + * Elements: SubroutineImpl objects. + */ + private Map subroutines = new HashMap(); + + /** + * This is referring to a special subroutine, namely the + * top level. This is not really a subroutine but we use + * it to distinguish between top level instructions and + * unreachable instructions. + */ + public final Subroutine TOPLEVEL; + + /** + * Constructor. + * @param mg A MethodGen object representing method to + * create the Subroutine objects of. + */ + public Subroutines(MethodGen mg){ + + InstructionHandle[] all = mg.getInstructionList().getInstructionHandles(); + CodeExceptionGen[] handlers = mg.getExceptionHandlers(); + + // Define our "Toplevel" fake subroutine. + TOPLEVEL = new SubroutineImpl(); + + // Calculate "real" subroutines. + Set sub_leaders = new HashSet(); // Elements: InstructionHandle + for (InstructionHandle element : all) { + Instruction inst = element.getInstruction(); + if (inst instanceof JsrInstruction){ + sub_leaders.add(((JsrInstruction) inst).getTarget()); + } + } + + // Build up the database. + for (InstructionHandle astore : sub_leaders) { + SubroutineImpl sr = new SubroutineImpl(); + sr.setLocalVariable( ((ASTORE) (astore.getInstruction())).getIndex() ); + subroutines.put(astore, sr); + } + + // Fake it a bit. We want a virtual "TopLevel" subroutine. + subroutines.put(all[0], TOPLEVEL); + sub_leaders.add(all[0]); + + // Tell the subroutines about their JsrInstructions. + // Note that there cannot be a JSR targeting the top-level + // since "Jsr 0" is disallowed in Pass 3a. + // Instructions shared by a subroutine and the toplevel are + // disallowed and checked below, after the BFS. + for (InstructionHandle element : all) { + Instruction inst = element.getInstruction(); + if (inst instanceof JsrInstruction){ + InstructionHandle leader = ((JsrInstruction) inst).getTarget(); + ((SubroutineImpl) getSubroutine(leader)).addEnteringJsrInstruction(element); + } + } + + // Now do a BFS from every subroutine leader to find all the + // instructions that belong to a subroutine. + Set instructions_assigned = new HashSet(); // we don't want to assign an instruction to two or more Subroutine objects. + + Map colors = new HashMap(); //Graph colouring. Key: InstructionHandle, Value: Integer . + + List Q = new ArrayList(); + for (InstructionHandle actual : sub_leaders) { + // Do some BFS with "actual" as the root of the graph. + // Init colors + for (InstructionHandle element : all) { + colors.put(element, WHITE); + } + colors.put(actual, GRAY); + // Init Queue + + Q.clear(); + Q.add(actual); // add(Obj) adds to the end, remove(0) removes from the start. + + /* BFS ALGORITHM MODIFICATION: Start out with multiple "root" nodes, as exception handlers are starting points of top-level code, too. [why top-level? TODO: Refer to the special JustIce notion of subroutines.]*/ + if (actual == all[0]){ + for (CodeExceptionGen handler : handlers) { + colors.put(handler.getHandlerPC(), GRAY); + Q.add(handler.getHandlerPC()); + } + } + /* CONTINUE NORMAL BFS ALGORITHM */ + + // Loop until Queue is empty + while (Q.size() != 0){ + InstructionHandle u = Q.remove(0); + InstructionHandle[] successors = getSuccessors(u); + for (InstructionHandle successor : successors) { + if (colors.get(successor) == WHITE){ + colors.put(successor, GRAY); + Q.add(successor); + } + } + colors.put(u, BLACK); + } + // BFS ended above. + for (InstructionHandle element : all) { + if (colors.get(element) == BLACK){ + ((SubroutineImpl) (actual==all[0]?getTopLevel():getSubroutine(actual))).addInstruction(element); + if (instructions_assigned.contains(element)){ + throw new StructuralCodeConstraintException("Instruction '"+element+"' is part of more than one subroutine (or of the top level and a subroutine)."); + } + else{ + instructions_assigned.add(element); + } + } + } + if (actual != all[0]){// If we don't deal with the top-level 'subroutine' + ((SubroutineImpl) getSubroutine(actual)).setLeavingRET(); + } + } + + // Now make sure no instruction of a Subroutine is protected by exception handling code + // as is mandated by JustIces notion of subroutines. + for (CodeExceptionGen handler : handlers) { + InstructionHandle _protected = handler.getStartPC(); + while (_protected != handler.getEndPC().getNext()){// Note the inclusive/inclusive notation of "generic API" exception handlers! + for (Subroutine sub : subroutines.values()) { + if (sub != subroutines.get(all[0])){ // We don't want to forbid top-level exception handlers. + if (sub.contains(_protected)){ + throw new StructuralCodeConstraintException("Subroutine instruction '"+_protected+"' is protected by an exception handler, '"+handler+"'. This is forbidden by the JustIce verifier due to its clear definition of subroutines."); + } + } + } + _protected = _protected.getNext(); + } + } + + // Now make sure no subroutine is calling a subroutine + // that uses the same local variable for the RET as themselves + // (recursively). + // This includes that subroutines may not call themselves + // recursively, even not through intermediate calls to other + // subroutines. + noRecursiveCalls(getTopLevel(), new HashSet()); + + } + + /** + * This (recursive) utility method makes sure that + * no subroutine is calling a subroutine + * that uses the same local variable for the RET as themselves + * (recursively). + * This includes that subroutines may not call themselves + * recursively, even not through intermediate calls to other + * subroutines. + * + * @throws StructuralCodeConstraintException if the above constraint is not satisfied. + */ + private void noRecursiveCalls(Subroutine sub, Set set){ + Subroutine[] subs = sub.subSubs(); + + for (Subroutine sub2 : subs) { + int index = ((RET) (sub2.getLeavingRET().getInstruction())).getIndex(); + + if (!set.add(Integer.valueOf(index))){ + // Don't use toString() here because of possibly infinite recursive subSubs() calls then. + SubroutineImpl si = (SubroutineImpl) sub2; + throw new StructuralCodeConstraintException("Subroutine with local variable '"+si.localVariable+"', JSRs '"+si.theJSRs+"', RET '"+si.theRET+"' is called by a subroutine which uses the same local variable index as itself; maybe even a recursive call? JustIce's clean definition of a subroutine forbids both."); + } + + noRecursiveCalls(sub2, set); + + set.remove(Integer.valueOf(index)); + } + } + + /** + * Returns the Subroutine object associated with the given + * leader (that is, the first instruction of the subroutine). + * You must not use this to get the top-level instructions + * modeled as a Subroutine object. + * + * @see #getTopLevel() + */ + public Subroutine getSubroutine(InstructionHandle leader){ + Subroutine ret = subroutines.get(leader); + + if (ret == null){ + throw new AssertionViolatedException("Subroutine requested for an InstructionHandle that is not a leader of a subroutine."); + } + + if (ret == TOPLEVEL){ + throw new AssertionViolatedException("TOPLEVEL special subroutine requested; use getTopLevel()."); + } + + return ret; + } + + /** + * Returns the subroutine object associated with the + * given instruction. This is a costly operation, you + * should consider using getSubroutine(InstructionHandle). + * Returns 'null' if the given InstructionHandle lies + * in so-called 'dead code', i.e. code that can never + * be executed. + * + * @see #getSubroutine(InstructionHandle) + * @see #getTopLevel() + */ + public Subroutine subroutineOf(InstructionHandle any){ + for (Subroutine s : subroutines.values()) { + if (s.contains(any)) { return s; } - } + } System.err.println("DEBUG: Please verify '"+any.toString(true)+"' lies in dead code."); - return null; - //throw new AssertionViolatedException("No subroutine for InstructionHandle found (DEAD CODE?)."); - } - - /** - * For easy handling, the piece of code that is not a - * subroutine, the top-level, is also modeled as a Subroutine - * object. - * It is a special Subroutine object where you must not invoke - * getEnteringJsrInstructions() or getLeavingRET(). - * - * @see Subroutine#getEnteringJsrInstructions() - * @see Subroutine#getLeavingRET() - */ - public Subroutine getTopLevel(){ - return TOPLEVEL; - } - /** - * A utility method that calculates the successors of a given InstructionHandle - * in the same subroutine. That means, a RET does not have any successors - * as defined here. A JsrInstruction has its physical successor as its successor - * (opposed to its target) as defined here. - */ - private static InstructionHandle[] getSuccessors(InstructionHandle instruction){ - final InstructionHandle[] empty = new InstructionHandle[0]; - final InstructionHandle[] single = new InstructionHandle[1]; - - Instruction inst = instruction.getInstruction(); - - if (inst instanceof RET){ - return empty; - } - - // Terminates method normally. - if (inst instanceof ReturnInstruction){ - return empty; - } - - // Terminates method abnormally, because JustIce mandates - // subroutines not to be protected by exception handlers. - if (inst instanceof ATHROW){ - return empty; - } - - // See method comment. - if (inst instanceof JsrInstruction){ - single[0] = instruction.getNext(); - return single; - } - - if (inst instanceof GotoInstruction){ - single[0] = ((GotoInstruction) inst).getTarget(); - return single; - } - - if (inst instanceof BranchInstruction){ - if (inst instanceof Select){ - // BCEL's getTargets() returns only the non-default targets, - // thanks to Eli Tilevich for reporting. - InstructionHandle[] matchTargets = ((Select) inst).getTargets(); - InstructionHandle[] ret = new InstructionHandle[matchTargets.length+1]; - ret[0] = ((Select) inst).getTarget(); - System.arraycopy(matchTargets, 0, ret, 1, matchTargets.length); - return ret; - } - else{ - final InstructionHandle[] pair = new InstructionHandle[2]; - pair[0] = instruction.getNext(); - pair[1] = ((BranchInstruction) inst).getTarget(); - return pair; - } - } - - // default case: Fall through. - single[0] = instruction.getNext(); - return single; - } - - /** - * Returns a String representation of this object; merely for debugging puposes. - */ - @Override + return null; + //throw new AssertionViolatedException("No subroutine for InstructionHandle found (DEAD CODE?)."); + } + + /** + * For easy handling, the piece of code that is not a + * subroutine, the top-level, is also modeled as a Subroutine + * object. + * It is a special Subroutine object where you must not invoke + * getEnteringJsrInstructions() or getLeavingRET(). + * + * @see Subroutine#getEnteringJsrInstructions() + * @see Subroutine#getLeavingRET() + */ + public Subroutine getTopLevel(){ + return TOPLEVEL; + } + /** + * A utility method that calculates the successors of a given InstructionHandle + * in the same subroutine. That means, a RET does not have any successors + * as defined here. A JsrInstruction has its physical successor as its successor + * (opposed to its target) as defined here. + */ + private static InstructionHandle[] getSuccessors(InstructionHandle instruction){ + final InstructionHandle[] empty = new InstructionHandle[0]; + final InstructionHandle[] single = new InstructionHandle[1]; + + Instruction inst = instruction.getInstruction(); + + if (inst instanceof RET){ + return empty; + } + + // Terminates method normally. + if (inst instanceof ReturnInstruction){ + return empty; + } + + // Terminates method abnormally, because JustIce mandates + // subroutines not to be protected by exception handlers. + if (inst instanceof ATHROW){ + return empty; + } + + // See method comment. + if (inst instanceof JsrInstruction){ + single[0] = instruction.getNext(); + return single; + } + + if (inst instanceof GotoInstruction){ + single[0] = ((GotoInstruction) inst).getTarget(); + return single; + } + + if (inst instanceof BranchInstruction){ + if (inst instanceof Select){ + // BCEL's getTargets() returns only the non-default targets, + // thanks to Eli Tilevich for reporting. + InstructionHandle[] matchTargets = ((Select) inst).getTargets(); + InstructionHandle[] ret = new InstructionHandle[matchTargets.length+1]; + ret[0] = ((Select) inst).getTarget(); + System.arraycopy(matchTargets, 0, ret, 1, matchTargets.length); + return ret; + } + else{ + final InstructionHandle[] pair = new InstructionHandle[2]; + pair[0] = instruction.getNext(); + pair[1] = ((BranchInstruction) inst).getTarget(); + return pair; + } + } + + // default case: Fall through. + single[0] = instruction.getNext(); + return single; + } + + /** + * Returns a String representation of this object; merely for debugging puposes. + */ + @Override public String toString(){ - return "---\n"+subroutines+"\n---\n"; - } + return "---\n"+subroutines+"\n---\n"; + } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index 8638268d..042c537f 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -32,40 +32,40 @@ import org.apache.bcel.generic.ReferenceType; */ public class UninitializedObjectType extends ReferenceType implements Constants{ - private static final long serialVersionUID = -1228341777713117641L; + private static final long serialVersionUID = -1228341777713117641L; /** The "initialized" version. */ - private ObjectType initialized; - - /** Creates a new instance. */ - public UninitializedObjectType(ObjectType t){ - super(T_UNKNOWN, ""); - initialized = t; - } + private ObjectType initialized; - /** - * Returns the ObjectType of the same class as the one of the uninitialized object - * represented by this UninitializedObjectType instance. - */ - public ObjectType getInitialized(){ - return initialized; - } + /** Creates a new instance. */ + public UninitializedObjectType(ObjectType t){ + super(T_UNKNOWN, ""); + initialized = t; + } - /** @return a hash code value for the object. + /** + * Returns the ObjectType of the same class as the one of the uninitialized object + * represented by this UninitializedObjectType instance. */ - @Override + public ObjectType getInitialized(){ + return initialized; + } + + /** @return a hash code value for the object. + */ + @Override public int hashCode() { return initialized.hashCode(); } - /** - * Returns true on equality of this and o. - * Equality means the ObjectType instances of "initialized" - * equal one another in this and the o instance. - * - */ - @Override + /** + * Returns true on equality of this and o. + * Equality means the ObjectType instances of "initialized" + * equal one another in this and the o instance. + * + */ + @Override public boolean equals(Object o){ - if (! (o instanceof UninitializedObjectType)) { + if (! (o instanceof UninitializedObjectType)) { return false; } - return initialized.equals(((UninitializedObjectType)o).initialized); - } + return initialized.equals(((UninitializedObjectType)o).initialized); + } } diff --git a/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java index ca40e45a..e6ed03aa 100644 --- a/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java @@ -24,27 +24,27 @@ import org.apache.bcel.visitors.CounterVisitor; public abstract class AbstractCounterVisitorTestCase extends AbstractTestCase { - protected abstract JavaClass getTestClass() throws ClassNotFoundException; + protected abstract JavaClass getTestClass() throws ClassNotFoundException; - private CounterVisitor visitor = null; + private CounterVisitor visitor = null; - @Override + @Override public void setUp() throws ClassNotFoundException - { - visitor = new CounterVisitor(); - new DescendingVisitor(getTestClass(), getVisitor()).visit(); - } + { + visitor = new CounterVisitor(); + new DescendingVisitor(getTestClass(), getVisitor()).visit(); + } - public CounterVisitor getVisitor() - { - if (visitor == null) { + public CounterVisitor getVisitor() + { + if (visitor == null) { visitor = new CounterVisitor(); } - return visitor; - } + return visitor; + } - public void setVisitor(CounterVisitor visitor) - { - this.visitor = visitor; - } + public void setVisitor(CounterVisitor visitor) + { + this.visitor = visitor; + } } diff --git a/src/test/java/org/apache/bcel/AbstractTestCase.java b/src/test/java/org/apache/bcel/AbstractTestCase.java index 43247ef1..0455ea4f 100644 --- a/src/test/java/org/apache/bcel/AbstractTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractTestCase.java @@ -39,143 +39,143 @@ import org.apache.bcel.util.SyntheticRepository; public abstract class AbstractTestCase extends TestCase { - private boolean verbose = false; - - protected File createTestdataFile(String name) - { - return new File("target" + File.separator + "testdata" + File.separator - + name); - } - - protected JavaClass getTestClass(String name) throws ClassNotFoundException - { - return SyntheticRepository.getInstance().loadClass(name); - } - - protected Method getMethod(JavaClass cl, String methodname) - { - Method[] methods = cl.getMethods(); - for (Method m : methods) { - if (m.getName().equals(methodname)) - { - return m; - } - } - return null; - } - - protected boolean wipe(String name) - { - return new File("target" + File.separator + "testdata" + File.separator - + name).delete(); - } - - protected boolean wipe(String dir, String name) - { - boolean b = wipe(dir + File.separator + name); - String[] files = new File(dir).list(); - if (files == null || files.length == 0) - { - new File(dir).delete(); // Why does this not succeed? stupid thing - } - return b; - } - - public SyntheticRepository createRepos(String cpentry) - { - ClassPath cp = new ClassPath("target" + File.separator + "testdata" - + File.separator + cpentry + File.separator); - return SyntheticRepository.getInstance(cp); - } - - protected Attribute[] findAttribute(String name, JavaClass clazz) - { - Attribute[] all = clazz.getAttributes(); - List chosenAttrsList = new ArrayList(); - for (Attribute element : all) { - if (verbose) { + private boolean verbose = false; + + protected File createTestdataFile(String name) + { + return new File("target" + File.separator + "testdata" + File.separator + + name); + } + + protected JavaClass getTestClass(String name) throws ClassNotFoundException + { + return SyntheticRepository.getInstance().loadClass(name); + } + + protected Method getMethod(JavaClass cl, String methodname) + { + Method[] methods = cl.getMethods(); + for (Method m : methods) { + if (m.getName().equals(methodname)) + { + return m; + } + } + return null; + } + + protected boolean wipe(String name) + { + return new File("target" + File.separator + "testdata" + File.separator + + name).delete(); + } + + protected boolean wipe(String dir, String name) + { + boolean b = wipe(dir + File.separator + name); + String[] files = new File(dir).list(); + if (files == null || files.length == 0) + { + new File(dir).delete(); // Why does this not succeed? stupid thing + } + return b; + } + + public SyntheticRepository createRepos(String cpentry) + { + ClassPath cp = new ClassPath("target" + File.separator + "testdata" + + File.separator + cpentry + File.separator); + return SyntheticRepository.getInstance(cp); + } + + protected Attribute[] findAttribute(String name, JavaClass clazz) + { + Attribute[] all = clazz.getAttributes(); + List chosenAttrsList = new ArrayList(); + for (Attribute element : all) { + if (verbose) { System.err.println("Attribute: " + element.getName()); } - if (element.getName().equals(name)) { + if (element.getName().equals(name)) { chosenAttrsList.add(element); } - } - return chosenAttrsList.toArray(new Attribute[] {}); - } - - protected Attribute findAttribute(String name, Attribute[] all) - { - List chosenAttrsList = new ArrayList(); - for (Attribute element : all) { - if (verbose) { + } + return chosenAttrsList.toArray(new Attribute[] {}); + } + + protected Attribute findAttribute(String name, Attribute[] all) + { + List chosenAttrsList = new ArrayList(); + for (Attribute element : all) { + if (verbose) { System.err.println("Attribute: " + element.getName()); } - if (element.getName().equals(name)) { + if (element.getName().equals(name)) { chosenAttrsList.add(element); } - } - assertTrue("Should be one match: " + chosenAttrsList.size(), - chosenAttrsList.size() == 1); - return chosenAttrsList.get(0); - } - - protected String dumpAttributes(Attribute[] as) - { - StringBuilder result = new StringBuilder(); - result.append("AttributeArray:["); - for (int i = 0; i < as.length; i++) - { - Attribute attr = as[i]; - result.append(attr.toString()); - if (i + 1 < as.length) { + } + assertTrue("Should be one match: " + chosenAttrsList.size(), + chosenAttrsList.size() == 1); + return chosenAttrsList.get(0); + } + + protected String dumpAttributes(Attribute[] as) + { + StringBuilder result = new StringBuilder(); + result.append("AttributeArray:["); + for (int i = 0; i < as.length; i++) + { + Attribute attr = as[i]; + result.append(attr.toString()); + if (i + 1 < as.length) { result.append(","); } - } - result.append("]"); - return result.toString(); - } - - protected String dumpAnnotationEntries(AnnotationEntry[] as) - { - StringBuilder result = new StringBuilder(); - result.append("["); - for (int i = 0; i < as.length; i++) - { - AnnotationEntry annotation = as[i]; - result.append(annotation.toShortString()); - if (i + 1 < as.length) { + } + result.append("]"); + return result.toString(); + } + + protected String dumpAnnotationEntries(AnnotationEntry[] as) + { + StringBuilder result = new StringBuilder(); + result.append("["); + for (int i = 0; i < as.length; i++) + { + AnnotationEntry annotation = as[i]; + result.append(annotation.toShortString()); + if (i + 1 < as.length) { result.append(","); } - } - result.append("]"); - return result.toString(); - } - - protected String dumpAnnotationEntries(AnnotationEntryGen[] as) - { - StringBuilder result = new StringBuilder(); - result.append("["); - for (int i = 0; i < as.length; i++) - { - AnnotationEntryGen annotation = as[i]; - result.append(annotation.toShortString()); - if (i + 1 < as.length) { + } + result.append("]"); + return result.toString(); + } + + protected String dumpAnnotationEntries(AnnotationEntryGen[] as) + { + StringBuilder result = new StringBuilder(); + result.append("["); + for (int i = 0; i < as.length; i++) + { + AnnotationEntryGen annotation = as[i]; + result.append(annotation.toShortString()); + if (i + 1 < as.length) { result.append(","); } - } - result.append("]"); - return result.toString(); - } - - public AnnotationEntryGen createFruitAnnotationEntry(ConstantPoolGen cp, - String aFruit, boolean visibility) - { - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.STRING, cp, aFruit); - ElementValuePairGen nvGen = new ElementValuePairGen("fruit", evg, cp); - ObjectType t = new ObjectType("SimpleStringAnnotation"); - List elements = new ArrayList(); - elements.add(nvGen); - return new AnnotationEntryGen(t, elements, visibility, cp); - } + } + result.append("]"); + return result.toString(); + } + + public AnnotationEntryGen createFruitAnnotationEntry(ConstantPoolGen cp, + String aFruit, boolean visibility) + { + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.STRING, cp, aFruit); + ElementValuePairGen nvGen = new ElementValuePairGen("fruit", evg, cp); + ObjectType t = new ObjectType("SimpleStringAnnotation"); + List elements = new ArrayList(); + elements.add(nvGen); + return new AnnotationEntryGen(t, elements, visibility, cp); + } } diff --git a/src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java b/src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java index ebf01772..fa381e1d 100644 --- a/src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java +++ b/src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java @@ -22,20 +22,20 @@ import org.apache.bcel.classfile.JavaClass; public class AnnotationAccessFlagTestCase extends AbstractTestCase { - /** - * If you write an annotation and compile it, the class file generated - * should be marked as an annotation type - which is detectable through - * BCEL. - */ - public void testAnnotationClassSaysItIs() throws ClassNotFoundException - { - JavaClass clazz = getTestClass("org.apache.bcel.data.SimpleAnnotation"); - assertTrue( - "Expected SimpleAnnotation class to say it was an annotation - but it didn't !", - clazz.isAnnotation()); - clazz = getTestClass("org.apache.bcel.data.SimpleClass"); - assertTrue( - "Expected SimpleClass class to say it was not an annotation - but it didn't !", - !clazz.isAnnotation()); - } + /** + * If you write an annotation and compile it, the class file generated + * should be marked as an annotation type - which is detectable through + * BCEL. + */ + public void testAnnotationClassSaysItIs() throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.SimpleAnnotation"); + assertTrue( + "Expected SimpleAnnotation class to say it was an annotation - but it didn't !", + clazz.isAnnotation()); + clazz = getTestClass("org.apache.bcel.data.SimpleClass"); + assertTrue( + "Expected SimpleClass class to say it was not an annotation - but it didn't !", + !clazz.isAnnotation()); + } } diff --git a/src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java b/src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java index 19464689..24c3a5ea 100644 --- a/src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java +++ b/src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java @@ -26,21 +26,21 @@ import org.apache.bcel.classfile.SimpleElementValue; public class AnnotationDefaultAttributeTestCase extends AbstractTestCase { - /** - * For values in an annotation that have default values, we should be able - * to query the AnnotationDefault attribute against the method to discover - * the default value that was originally declared. - */ - public void testMethodAnnotations() throws ClassNotFoundException - { - JavaClass clazz = getTestClass("org.apache.bcel.data.SimpleAnnotation"); - Method m = getMethod(clazz, "fruit"); - AnnotationDefault a = (AnnotationDefault) findAttribute( - "AnnotationDefault", m.getAttributes()); - SimpleElementValue val = (SimpleElementValue) a.getDefaultValue(); - assertTrue("Should be STRING but is " + val.getElementValueType(), val - .getElementValueType() == ElementValue.STRING); - assertTrue("Should have default of bananas but default is " - + val.getValueString(), val.getValueString().equals("bananas")); - } + /** + * For values in an annotation that have default values, we should be able + * to query the AnnotationDefault attribute against the method to discover + * the default value that was originally declared. + */ + public void testMethodAnnotations() throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.SimpleAnnotation"); + Method m = getMethod(clazz, "fruit"); + AnnotationDefault a = (AnnotationDefault) findAttribute( + "AnnotationDefault", m.getAttributes()); + SimpleElementValue val = (SimpleElementValue) a.getDefaultValue(); + assertTrue("Should be STRING but is " + val.getElementValueType(), val + .getElementValueType() == ElementValue.STRING); + assertTrue("Should have default of bananas but default is " + + val.getValueString(), val.getValueString().equals("bananas")); + } } diff --git a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java b/src/test/java/org/apache/bcel/AnnotationGenTestCase.java index d2c30698..d17161d5 100644 --- a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/bcel/AnnotationGenTestCase.java @@ -41,133 +41,133 @@ import org.apache.bcel.generic.SimpleElementValueGen; public class AnnotationGenTestCase extends AbstractTestCase { - private ClassGen createClassGen(String classname) - { - return new ClassGen(classname, "java.lang.Object", "", - Constants.ACC_PUBLIC | Constants.ACC_SUPER, null); - } + private ClassGen createClassGen(String classname) + { + return new ClassGen(classname, "java.lang.Object", "", + Constants.ACC_PUBLIC | Constants.ACC_SUPER, null); + } - /** - * Programmatically construct an mutable annotation (AnnotationGen) object. - */ - public void testConstructMutableAnnotation() - { - // Create the containing class - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - // Create the simple primitive value '4' of type 'int' - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_INT, cp, 4); - // Give it a name, call it 'id' - ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, - cp); - // Check it looks right - assertTrue( - "Should include string 'id=4' but says: " + nvGen.toString(), + /** + * Programmatically construct an mutable annotation (AnnotationGen) object. + */ + public void testConstructMutableAnnotation() + { + // Create the containing class + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + // Create the simple primitive value '4' of type 'int' + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_INT, cp, 4); + // Give it a name, call it 'id' + ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, + cp); + // Check it looks right + assertTrue( + "Should include string 'id=4' but says: " + nvGen.toString(), nvGen.toString().contains("id=4")); - ObjectType t = new ObjectType("SimpleAnnotation"); - List elements = new ArrayList(); - elements.add(nvGen); - // Build an annotation of type 'SimpleAnnotation' with 'id=4' as the - // only value :) - AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); - // Check we can save and load it ok - checkSerialize(a, cp); - } + ObjectType t = new ObjectType("SimpleAnnotation"); + List elements = new ArrayList(); + elements.add(nvGen); + // Build an annotation of type 'SimpleAnnotation' with 'id=4' as the + // only value :) + AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); + // Check we can save and load it ok + checkSerialize(a, cp); + } - public void testVisibleInvisibleAnnotationGen() - { - // Create the containing class - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - // Create the simple primitive value '4' of type 'int' - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_INT, cp, 4); - // Give it a name, call it 'id' - ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, - cp); - // Check it looks right - assertTrue( - "Should include string 'id=4' but says: " + nvGen.toString(), + public void testVisibleInvisibleAnnotationGen() + { + // Create the containing class + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + // Create the simple primitive value '4' of type 'int' + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_INT, cp, 4); + // Give it a name, call it 'id' + ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, + cp); + // Check it looks right + assertTrue( + "Should include string 'id=4' but says: " + nvGen.toString(), nvGen.toString().contains("id=4")); - ObjectType t = new ObjectType("SimpleAnnotation"); - List elements = new ArrayList(); - elements.add(nvGen); - // Build a RV annotation of type 'SimpleAnnotation' with 'id=4' as the - // only value :) - AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); - Vector v = new Vector(); - v.add(a); - Attribute[] attributes = Utility.getAnnotationAttributes(cp, v); - boolean foundRV = false; - for (Attribute attribute : attributes) { - if (attribute instanceof RuntimeVisibleAnnotations) - { - assertTrue(((Annotations) attribute).isRuntimeVisible()); - foundRV = true; - } - } - assertTrue("Should have seen a RuntimeVisibleAnnotation", foundRV); - // Build a RIV annotation of type 'SimpleAnnotation' with 'id=4' as the - // only value :) - AnnotationEntryGen a2 = new AnnotationEntryGen(t, elements, false, cp); - Vector v2 = new Vector(); - v2.add(a2); - Attribute[] attributes2 = Utility.getAnnotationAttributes(cp, v2); - boolean foundRIV = false; - for (Attribute attribute : attributes2) { - if (attribute instanceof RuntimeInvisibleAnnotations) - { - assertFalse(((Annotations) attribute).isRuntimeVisible()); - foundRIV = true; - } - } - assertTrue("Should have seen a RuntimeInvisibleAnnotation", foundRIV); - } + ObjectType t = new ObjectType("SimpleAnnotation"); + List elements = new ArrayList(); + elements.add(nvGen); + // Build a RV annotation of type 'SimpleAnnotation' with 'id=4' as the + // only value :) + AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); + Vector v = new Vector(); + v.add(a); + Attribute[] attributes = Utility.getAnnotationAttributes(cp, v); + boolean foundRV = false; + for (Attribute attribute : attributes) { + if (attribute instanceof RuntimeVisibleAnnotations) + { + assertTrue(((Annotations) attribute).isRuntimeVisible()); + foundRV = true; + } + } + assertTrue("Should have seen a RuntimeVisibleAnnotation", foundRV); + // Build a RIV annotation of type 'SimpleAnnotation' with 'id=4' as the + // only value :) + AnnotationEntryGen a2 = new AnnotationEntryGen(t, elements, false, cp); + Vector v2 = new Vector(); + v2.add(a2); + Attribute[] attributes2 = Utility.getAnnotationAttributes(cp, v2); + boolean foundRIV = false; + for (Attribute attribute : attributes2) { + if (attribute instanceof RuntimeInvisibleAnnotations) + { + assertFalse(((Annotations) attribute).isRuntimeVisible()); + foundRIV = true; + } + } + assertTrue("Should have seen a RuntimeInvisibleAnnotation", foundRIV); + } - private void checkSerialize(AnnotationEntryGen a, ConstantPoolGen cpg) - { - try - { - String beforeName = a.getTypeName(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(baos); - a.dump(dos); - dos.flush(); - dos.close(); - byte[] bs = baos.toByteArray(); - ByteArrayInputStream bais = new ByteArrayInputStream(bs); - DataInputStream dis = new DataInputStream(bais); - AnnotationEntryGen annAfter = AnnotationEntryGen.read(dis, cpg, a - .isRuntimeVisible()); - dis.close(); - String afterName = annAfter.getTypeName(); - if (!beforeName.equals(afterName)) - { - fail("Deserialization failed: before type='" + beforeName - + "' after type='" + afterName + "'"); - } - if (a.getValues().size() != annAfter.getValues().size()) - { - fail("Different numbers of element name value pairs?? " - + a.getValues().size() + "!=" - + annAfter.getValues().size()); - } - for (int i = 0; i < a.getValues().size(); i++) - { - ElementValuePairGen beforeElement = a.getValues().get(i); - ElementValuePairGen afterElement = annAfter.getValues().get(i); - if (!beforeElement.getNameString().equals( - afterElement.getNameString())) - { - fail("Different names?? " + beforeElement.getNameString() - + "!=" + afterElement.getNameString()); - } - } - } - catch (IOException ioe) - { - fail("Unexpected exception whilst checking serialization: " + ioe); - } - } + private void checkSerialize(AnnotationEntryGen a, ConstantPoolGen cpg) + { + try + { + String beforeName = a.getTypeName(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + a.dump(dos); + dos.flush(); + dos.close(); + byte[] bs = baos.toByteArray(); + ByteArrayInputStream bais = new ByteArrayInputStream(bs); + DataInputStream dis = new DataInputStream(bais); + AnnotationEntryGen annAfter = AnnotationEntryGen.read(dis, cpg, a + .isRuntimeVisible()); + dis.close(); + String afterName = annAfter.getTypeName(); + if (!beforeName.equals(afterName)) + { + fail("Deserialization failed: before type='" + beforeName + + "' after type='" + afterName + "'"); + } + if (a.getValues().size() != annAfter.getValues().size()) + { + fail("Different numbers of element name value pairs?? " + + a.getValues().size() + "!=" + + annAfter.getValues().size()); + } + for (int i = 0; i < a.getValues().size(); i++) + { + ElementValuePairGen beforeElement = a.getValues().get(i); + ElementValuePairGen afterElement = annAfter.getValues().get(i); + if (!beforeElement.getNameString().equals( + afterElement.getNameString())) + { + fail("Different names?? " + beforeElement.getNameString() + + "!=" + afterElement.getNameString()); + } + } + } + catch (IOException ioe) + { + fail("Unexpected exception whilst checking serialization: " + ioe); + } + } } diff --git a/src/test/java/org/apache/bcel/AnonymousClassTestCase.java b/src/test/java/org/apache/bcel/AnonymousClassTestCase.java index 3b88d03f..f43f9c79 100644 --- a/src/test/java/org/apache/bcel/AnonymousClassTestCase.java +++ b/src/test/java/org/apache/bcel/AnonymousClassTestCase.java @@ -22,37 +22,37 @@ import org.apache.bcel.classfile.JavaClass; public class AnonymousClassTestCase extends AbstractTestCase { - public void testRegularClassIsNotAnonymous() throws ClassNotFoundException - { - JavaClass clazz = getTestClass("org.apache.bcel.data.AnonymousClassTest"); - assertFalse("regular outer classes are not anonymous", clazz - .isAnonymous()); - assertFalse("regular outer classes are not nested", clazz.isNested()); - } + public void testRegularClassIsNotAnonymous() throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AnonymousClassTest"); + assertFalse("regular outer classes are not anonymous", clazz + .isAnonymous()); + assertFalse("regular outer classes are not nested", clazz.isNested()); + } - public void testNamedInnerClassIsNotAnonymous() - throws ClassNotFoundException - { - JavaClass clazz = getTestClass("org.apache.bcel.data.AnonymousClassTest$X"); - assertFalse("regular inner classes are not anonymous", clazz - .isAnonymous()); - assertTrue("regular inner classes are nested", clazz.isNested()); - } + public void testNamedInnerClassIsNotAnonymous() + throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AnonymousClassTest$X"); + assertFalse("regular inner classes are not anonymous", clazz + .isAnonymous()); + assertTrue("regular inner classes are nested", clazz.isNested()); + } - public void testStaticInnerClassIsNotAnonymous() - throws ClassNotFoundException - { - JavaClass clazz = getTestClass("org.apache.bcel.data.AnonymousClassTest$Y"); - assertFalse("regular static inner classes are not anonymous", clazz - .isAnonymous()); - assertTrue("regular static inner classes are nested", clazz.isNested()); - } + public void testStaticInnerClassIsNotAnonymous() + throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AnonymousClassTest$Y"); + assertFalse("regular static inner classes are not anonymous", clazz + .isAnonymous()); + assertTrue("regular static inner classes are nested", clazz.isNested()); + } - public void testAnonymousInnerClassIsAnonymous() - throws ClassNotFoundException - { - JavaClass clazz = getTestClass("org.apache.bcel.data.AnonymousClassTest$1"); - assertTrue("anonymous inner classes are anonymous", clazz.isAnonymous()); - assertTrue("anonymous inner classes are anonymous", clazz.isNested()); - } + public void testAnonymousInnerClassIsAnonymous() + throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AnonymousClassTest$1"); + assertTrue("anonymous inner classes are anonymous", clazz.isAnonymous()); + assertTrue("anonymous inner classes are anonymous", clazz.isNested()); + } } \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java index ddf5eae3..0a4ffb03 100644 --- a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java +++ b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java @@ -22,194 +22,194 @@ import org.apache.bcel.classfile.JavaClass; public class CounterVisitorTestCase extends AbstractCounterVisitorTestCase { - @Override + @Override protected JavaClass getTestClass() throws ClassNotFoundException - { - return getTestClass("org.apache.bcel.data.MarkedType"); - } - - public void testAnnotationsCount() - { - assertEquals("annotationCount", 2, getVisitor().annotationCount); - } - - public void testAnnotationDefaultCount() - { - assertEquals("annotationDefaultCount", 0, getVisitor().annotationDefaultCount); - } - - public void testAnnotationEntryCount() - { - assertEquals("annotationEntryCount", 2, getVisitor().annotationEntryCount); - } - - public void testCodeCount() - { - assertEquals("codeCount", 1, getVisitor().codeCount); - } - - public void testCodeExceptionCount() - { - assertEquals("codeExceptionCount", 0, getVisitor().codeExceptionCount); - } - - public void testConstantClassCount() - { - assertEquals("constantClassCount", 2, getVisitor().constantClassCount); - } - - public void testConstantDoubleCount() - { - assertEquals("constantDoubleCount", 0, getVisitor().constantDoubleCount); - } - - public void testConstantFieldrefCount() - { - assertEquals("constantFieldrefCount", 0, getVisitor().constantFieldrefCount); - } - - public void testConstantFloatCount() - { - assertEquals("constantFloatCount", 0, getVisitor().constantFloatCount); - } - - public void testConstantIntegerCount() - { - assertEquals("constantIntegerCount", 0, getVisitor().constantIntegerCount); - } - - public void testConstantInterfaceMethodrefCount() - { - assertEquals("constantInterfaceMethodrefCount", 0, getVisitor().constantInterfaceMethodrefCount); - } - - public void testConstantLongCount() - { - assertEquals("constantLongCount", 0, getVisitor().constantLongCount); - } - - public void testConstantMethodrefCount() - { - assertEquals("constantMethodrefCount", 1, getVisitor().constantMethodrefCount); - } - - public void testConstantNameAndTypeCount() - { - assertEquals("constantNameAndTypeCount", 1, getVisitor().constantNameAndTypeCount); - } - - public void testConstantPoolCount() - { - assertEquals("constantPoolCount", 1, getVisitor().constantPoolCount); - } - - public void testConstantStringCount() - { - assertEquals("constantStringCount", 0, getVisitor().constantStringCount); - } - - public void testConstantValueCount() - { - assertEquals("constantValueCount", 0, getVisitor().constantValueCount); - } - - public void testDeprecatedCount() - { - assertEquals("deprecatedCount", 0, getVisitor().deprecatedCount); - } - - public void testEnclosingMethodCount() - { - assertEquals("enclosingMethodCount", 0, getVisitor().enclosingMethodCount); - } - - public void testExceptionTableCount() - { - assertEquals("exceptionTableCount", 0, getVisitor().exceptionTableCount); - } - - public void testFieldCount() - { - assertEquals("fieldCount", 0, getVisitor().fieldCount); - } - - public void testInnerClassCount() - { - assertEquals("innerClassCount", 0, getVisitor().innerClassCount); - } - - public void testInnerClassesCount() - { - assertEquals("innerClassesCount", 0, getVisitor().innerClassesCount); - } - - public void testJavaClassCount() - { - assertEquals("javaClassCount", 1, getVisitor().javaClassCount); - } - - public void testLineNumberCount() - { - assertEquals("lineNumberCount", 1, getVisitor().lineNumberCount); - } - - public void testLineNumberTableCount() - { - assertEquals("lineNumberTableCount", 1, getVisitor().lineNumberTableCount); - } - - public void testLocalVariableCount() - { - assertEquals("localVariableCount", 1, getVisitor().localVariableCount); - } - - public void testLocalVariableTableCount() - { - assertEquals("localVariableTableCount", 1, getVisitor().localVariableTableCount); - } - - public void testLocalVariableTypeTableCount() - { - assertEquals("localVariableTypeTableCount", 0, getVisitor().localVariableTypeTableCount); - } - - public void testMethodCount() - { - assertEquals("methodCount", 1, getVisitor().methodCount); - } - - public void testParameterAnnotationCount() - { - assertEquals("parameterAnnotationCount", 0, getVisitor().parameterAnnotationCount); - } - - public void testSignatureCount() - { - assertEquals("signatureAnnotationCount", 0, getVisitor().signatureAnnotationCount); - } - - public void testSourceFileCount() - { - assertEquals("sourceFileCount", 1, getVisitor().sourceFileCount); - } - - public void testStackMapCount() - { - assertEquals("stackMapCount", 0, getVisitor().stackMapCount); - } - - public void testStackMapEntryCount() - { - assertEquals("stackMapEntryCount", 0, getVisitor().stackMapEntryCount); - } - - public void testSyntheticCount() - { - assertEquals("syntheticCount", 0, getVisitor().syntheticCount); - } - - public void testUnknownCount() - { - assertEquals("unknownCount", 0, getVisitor().unknownCount); - } + { + return getTestClass("org.apache.bcel.data.MarkedType"); + } + + public void testAnnotationsCount() + { + assertEquals("annotationCount", 2, getVisitor().annotationCount); + } + + public void testAnnotationDefaultCount() + { + assertEquals("annotationDefaultCount", 0, getVisitor().annotationDefaultCount); + } + + public void testAnnotationEntryCount() + { + assertEquals("annotationEntryCount", 2, getVisitor().annotationEntryCount); + } + + public void testCodeCount() + { + assertEquals("codeCount", 1, getVisitor().codeCount); + } + + public void testCodeExceptionCount() + { + assertEquals("codeExceptionCount", 0, getVisitor().codeExceptionCount); + } + + public void testConstantClassCount() + { + assertEquals("constantClassCount", 2, getVisitor().constantClassCount); + } + + public void testConstantDoubleCount() + { + assertEquals("constantDoubleCount", 0, getVisitor().constantDoubleCount); + } + + public void testConstantFieldrefCount() + { + assertEquals("constantFieldrefCount", 0, getVisitor().constantFieldrefCount); + } + + public void testConstantFloatCount() + { + assertEquals("constantFloatCount", 0, getVisitor().constantFloatCount); + } + + public void testConstantIntegerCount() + { + assertEquals("constantIntegerCount", 0, getVisitor().constantIntegerCount); + } + + public void testConstantInterfaceMethodrefCount() + { + assertEquals("constantInterfaceMethodrefCount", 0, getVisitor().constantInterfaceMethodrefCount); + } + + public void testConstantLongCount() + { + assertEquals("constantLongCount", 0, getVisitor().constantLongCount); + } + + public void testConstantMethodrefCount() + { + assertEquals("constantMethodrefCount", 1, getVisitor().constantMethodrefCount); + } + + public void testConstantNameAndTypeCount() + { + assertEquals("constantNameAndTypeCount", 1, getVisitor().constantNameAndTypeCount); + } + + public void testConstantPoolCount() + { + assertEquals("constantPoolCount", 1, getVisitor().constantPoolCount); + } + + public void testConstantStringCount() + { + assertEquals("constantStringCount", 0, getVisitor().constantStringCount); + } + + public void testConstantValueCount() + { + assertEquals("constantValueCount", 0, getVisitor().constantValueCount); + } + + public void testDeprecatedCount() + { + assertEquals("deprecatedCount", 0, getVisitor().deprecatedCount); + } + + public void testEnclosingMethodCount() + { + assertEquals("enclosingMethodCount", 0, getVisitor().enclosingMethodCount); + } + + public void testExceptionTableCount() + { + assertEquals("exceptionTableCount", 0, getVisitor().exceptionTableCount); + } + + public void testFieldCount() + { + assertEquals("fieldCount", 0, getVisitor().fieldCount); + } + + public void testInnerClassCount() + { + assertEquals("innerClassCount", 0, getVisitor().innerClassCount); + } + + public void testInnerClassesCount() + { + assertEquals("innerClassesCount", 0, getVisitor().innerClassesCount); + } + + public void testJavaClassCount() + { + assertEquals("javaClassCount", 1, getVisitor().javaClassCount); + } + + public void testLineNumberCount() + { + assertEquals("lineNumberCount", 1, getVisitor().lineNumberCount); + } + + public void testLineNumberTableCount() + { + assertEquals("lineNumberTableCount", 1, getVisitor().lineNumberTableCount); + } + + public void testLocalVariableCount() + { + assertEquals("localVariableCount", 1, getVisitor().localVariableCount); + } + + public void testLocalVariableTableCount() + { + assertEquals("localVariableTableCount", 1, getVisitor().localVariableTableCount); + } + + public void testLocalVariableTypeTableCount() + { + assertEquals("localVariableTypeTableCount", 0, getVisitor().localVariableTypeTableCount); + } + + public void testMethodCount() + { + assertEquals("methodCount", 1, getVisitor().methodCount); + } + + public void testParameterAnnotationCount() + { + assertEquals("parameterAnnotationCount", 0, getVisitor().parameterAnnotationCount); + } + + public void testSignatureCount() + { + assertEquals("signatureAnnotationCount", 0, getVisitor().signatureAnnotationCount); + } + + public void testSourceFileCount() + { + assertEquals("sourceFileCount", 1, getVisitor().sourceFileCount); + } + + public void testStackMapCount() + { + assertEquals("stackMapCount", 0, getVisitor().stackMapCount); + } + + public void testStackMapEntryCount() + { + assertEquals("stackMapEntryCount", 0, getVisitor().stackMapEntryCount); + } + + public void testSyntheticCount() + { + assertEquals("syntheticCount", 0, getVisitor().syntheticCount); + } + + public void testUnknownCount() + { + assertEquals("unknownCount", 0, getVisitor().unknownCount); + } } diff --git a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java index 212a7056..81658241 100644 --- a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java +++ b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java @@ -34,207 +34,207 @@ import org.apache.bcel.generic.EnumElementValueGen; public class ElementValueGenTestCase extends AbstractTestCase { - private ClassGen createClassGen(String classname) - { - return new ClassGen(classname, "java.lang.Object", "", - Constants.ACC_PUBLIC | Constants.ACC_SUPER, null); - } + private ClassGen createClassGen(String classname) + { + return new ClassGen(classname, "java.lang.Object", "", + Constants.ACC_PUBLIC | Constants.ACC_SUPER, null); + } - /** - * Create primitive element values - */ - public void testCreateIntegerElementValue() - { - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_INT, cp, 555); - // Creation of an element like that should leave a new entry in the - // cpool - assertTrue("Should have the same index in the constantpool but " - + evg.getIndex() + "!=" + cp.lookupInteger(555), - evg.getIndex() == cp.lookupInteger(555)); - checkSerialize(evg, cp); - } + /** + * Create primitive element values + */ + public void testCreateIntegerElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_INT, cp, 555); + // Creation of an element like that should leave a new entry in the + // cpool + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + cp.lookupInteger(555), + evg.getIndex() == cp.lookupInteger(555)); + checkSerialize(evg, cp); + } - public void testCreateFloatElementValue() - { - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_FLOAT, cp, 111.222f); - // Creation of an element like that should leave a new entry in the - // cpool - assertTrue("Should have the same index in the constantpool but " - + evg.getIndex() + "!=" + cp.lookupFloat(111.222f), evg - .getIndex() == cp.lookupFloat(111.222f)); - checkSerialize(evg, cp); - } + public void testCreateFloatElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_FLOAT, cp, 111.222f); + // Creation of an element like that should leave a new entry in the + // cpool + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + cp.lookupFloat(111.222f), evg + .getIndex() == cp.lookupFloat(111.222f)); + checkSerialize(evg, cp); + } - public void testCreateDoubleElementValue() - { - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_DOUBLE, cp, 333.44); - // Creation of an element like that should leave a new entry in the - // cpool - int idx = cp.lookupDouble(333.44); - assertTrue("Should have the same index in the constantpool but " - + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); - checkSerialize(evg, cp); - } + public void testCreateDoubleElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_DOUBLE, cp, 333.44); + // Creation of an element like that should leave a new entry in the + // cpool + int idx = cp.lookupDouble(333.44); + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); + checkSerialize(evg, cp); + } - public void testCreateLongElementValue() - { - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_LONG, cp, 3334455L); - // Creation of an element like that should leave a new entry in the - // cpool - int idx = cp.lookupLong(3334455L); - assertTrue("Should have the same index in the constantpool but " - + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); - checkSerialize(evg, cp); - } + public void testCreateLongElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_LONG, cp, 3334455L); + // Creation of an element like that should leave a new entry in the + // cpool + int idx = cp.lookupLong(3334455L); + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); + checkSerialize(evg, cp); + } - public void testCreateCharElementValue() - { - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_CHAR, cp, 't'); - // Creation of an element like that should leave a new entry in the - // cpool - int idx = cp.lookupInteger('t'); - assertTrue("Should have the same index in the constantpool but " - + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); - checkSerialize(evg, cp); - } + public void testCreateCharElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_CHAR, cp, 't'); + // Creation of an element like that should leave a new entry in the + // cpool + int idx = cp.lookupInteger('t'); + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); + checkSerialize(evg, cp); + } - public void testCreateByteElementValue() - { - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_CHAR, cp, (byte) 'z'); - // Creation of an element like that should leave a new entry in the - // cpool - int idx = cp.lookupInteger((byte) 'z'); - assertTrue("Should have the same index in the constantpool but " - + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); - checkSerialize(evg, cp); - } + public void testCreateByteElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_CHAR, cp, (byte) 'z'); + // Creation of an element like that should leave a new entry in the + // cpool + int idx = cp.lookupInteger((byte) 'z'); + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); + checkSerialize(evg, cp); + } - public void testCreateBooleanElementValue() - { - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_BOOLEAN, cp, true); - // Creation of an element like that should leave a new entry in the - // cpool - int idx = cp.lookupInteger(1); // 1 == true - assertTrue("Should have the same index in the constantpool but " - + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); - checkSerialize(evg, cp); - } + public void testCreateBooleanElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_BOOLEAN, cp, true); + // Creation of an element like that should leave a new entry in the + // cpool + int idx = cp.lookupInteger(1); // 1 == true + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); + checkSerialize(evg, cp); + } - public void testCreateShortElementValue() - { - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.PRIMITIVE_SHORT, cp, (short) 42); - // Creation of an element like that should leave a new entry in the - // cpool - int idx = cp.lookupInteger(42); - assertTrue("Should have the same index in the constantpool but " - + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); - checkSerialize(evg, cp); - } + public void testCreateShortElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.PRIMITIVE_SHORT, cp, (short) 42); + // Creation of an element like that should leave a new entry in the + // cpool + int idx = cp.lookupInteger(42); + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + idx, evg.getIndex() == idx); + checkSerialize(evg, cp); + } - // // - // Create string element values - public void testCreateStringElementValue() - { - // Create HelloWorld - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - SimpleElementValueGen evg = new SimpleElementValueGen( - ElementValueGen.STRING, cp, "hello"); - // Creation of an element like that should leave a new entry in the - // cpool - assertTrue("Should have the same index in the constantpool but " - + evg.getIndex() + "!=" + cp.lookupUtf8("hello"), evg - .getIndex() == cp.lookupUtf8("hello")); - checkSerialize(evg, cp); - } + // // + // Create string element values + public void testCreateStringElementValue() + { + // Create HelloWorld + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + SimpleElementValueGen evg = new SimpleElementValueGen( + ElementValueGen.STRING, cp, "hello"); + // Creation of an element like that should leave a new entry in the + // cpool + assertTrue("Should have the same index in the constantpool but " + + evg.getIndex() + "!=" + cp.lookupUtf8("hello"), evg + .getIndex() == cp.lookupUtf8("hello")); + checkSerialize(evg, cp); + } - // // - // Create enum element value - public void testCreateEnumElementValue() - { - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - ObjectType enumType = new ObjectType("SimpleEnum"); // Supports rainbow - // :) - EnumElementValueGen evg = new EnumElementValueGen(enumType, "Red", cp); - // Creation of an element like that should leave a new entry in the - // cpool - assertTrue( - "The new ElementValue value index should match the contents of the constantpool but " - + evg.getValueIndex() + "!=" + cp.lookupUtf8("Red"), - evg.getValueIndex() == cp.lookupUtf8("Red")); - // BCELBUG: Should the class signature or class name be in the constant - // pool? (see note in ConstantPool) - // assertTrue("The new ElementValue type index should match the contents - // of the constantpool but "+ - // evg.getTypeIndex()+"!="+cp.lookupClass(enumType.getSignature()), - // evg.getTypeIndex()==cp.lookupClass(enumType.getSignature())); - checkSerialize(evg, cp); - } + // // + // Create enum element value + public void testCreateEnumElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + ObjectType enumType = new ObjectType("SimpleEnum"); // Supports rainbow + // :) + EnumElementValueGen evg = new EnumElementValueGen(enumType, "Red", cp); + // Creation of an element like that should leave a new entry in the + // cpool + assertTrue( + "The new ElementValue value index should match the contents of the constantpool but " + + evg.getValueIndex() + "!=" + cp.lookupUtf8("Red"), + evg.getValueIndex() == cp.lookupUtf8("Red")); + // BCELBUG: Should the class signature or class name be in the constant + // pool? (see note in ConstantPool) + // assertTrue("The new ElementValue type index should match the contents + // of the constantpool but "+ + // evg.getTypeIndex()+"!="+cp.lookupClass(enumType.getSignature()), + // evg.getTypeIndex()==cp.lookupClass(enumType.getSignature())); + checkSerialize(evg, cp); + } - // // - // Create class element value - public void testCreateClassElementValue() - { - ClassGen cg = createClassGen("HelloWorld"); - ConstantPoolGen cp = cg.getConstantPool(); - ObjectType classType = new ObjectType("java.lang.Integer"); - ClassElementValueGen evg = new ClassElementValueGen(classType, cp); - assertTrue("Unexpected value for contained class: '" - + evg.getClassString() + "'", evg.getClassString().contains("Integer")); - checkSerialize(evg, cp); - } + // // + // Create class element value + public void testCreateClassElementValue() + { + ClassGen cg = createClassGen("HelloWorld"); + ConstantPoolGen cp = cg.getConstantPool(); + ObjectType classType = new ObjectType("java.lang.Integer"); + ClassElementValueGen evg = new ClassElementValueGen(classType, cp); + assertTrue("Unexpected value for contained class: '" + + evg.getClassString() + "'", evg.getClassString().contains("Integer")); + checkSerialize(evg, cp); + } - private void checkSerialize(ElementValueGen evgBefore, ConstantPoolGen cpg) - { - try - { - String beforeValue = evgBefore.stringifyValue(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(baos); - evgBefore.dump(dos); - dos.flush(); - dos.close(); - byte[] bs = baos.toByteArray(); - ByteArrayInputStream bais = new ByteArrayInputStream(bs); - DataInputStream dis = new DataInputStream(bais); - ElementValueGen evgAfter = ElementValueGen.readElementValue(dis, - cpg); - dis.close(); - String afterValue = evgAfter.stringifyValue(); - if (!beforeValue.equals(afterValue)) - { - fail("Deserialization failed: before='" + beforeValue - + "' after='" + afterValue + "'"); - } - } - catch (IOException ioe) - { - fail("Unexpected exception whilst checking serialization: " + ioe); - } - } + private void checkSerialize(ElementValueGen evgBefore, ConstantPoolGen cpg) + { + try + { + String beforeValue = evgBefore.stringifyValue(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + evgBefore.dump(dos); + dos.flush(); + dos.close(); + byte[] bs = baos.toByteArray(); + ByteArrayInputStream bais = new ByteArrayInputStream(bs); + DataInputStream dis = new DataInputStream(bais); + ElementValueGen evgAfter = ElementValueGen.readElementValue(dis, + cpg); + dis.close(); + String afterValue = evgAfter.stringifyValue(); + if (!beforeValue.equals(afterValue)) + { + fail("Deserialization failed: before='" + beforeValue + + "' after='" + afterValue + "'"); + } + } + catch (IOException ioe) + { + fail("Unexpected exception whilst checking serialization: " + ioe); + } + } } \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java b/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java index 2784c1f4..1b2ebe1d 100644 --- a/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java +++ b/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java @@ -28,80 +28,80 @@ import org.apache.bcel.util.SyntheticRepository; public class EnclosingMethodAttributeTestCase extends AbstractTestCase { - /** - * Verify for an inner class declared inside the 'main' method that the - * enclosing method attribute is set correctly. - */ - public void testCheckMethodLevelNamedInnerClass() - throws ClassNotFoundException - { - JavaClass clazz = getTestClass("org.apache.bcel.data.AttributeTestClassEM01$1S"); - ConstantPool pool = clazz.getConstantPool(); - Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); - assertTrue("Expected 1 EnclosingMethod attribute but found " - + encMethodAttrs.length, encMethodAttrs.length == 1); - EnclosingMethod em = (EnclosingMethod) encMethodAttrs[0]; - String enclosingClassName = em.getEnclosingClass().getBytes(pool); - String enclosingMethodName = em.getEnclosingMethod().getName(pool); - assertTrue( - "Expected class name to be 'org/apache/bcel/data/AttributeTestClassEM01' but was " - + enclosingClassName, enclosingClassName - .equals("org/apache/bcel/data/AttributeTestClassEM01")); - assertTrue("Expected method name to be 'main' but was " - + enclosingMethodName, enclosingMethodName.equals("main")); - } + /** + * Verify for an inner class declared inside the 'main' method that the + * enclosing method attribute is set correctly. + */ + public void testCheckMethodLevelNamedInnerClass() + throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AttributeTestClassEM01$1S"); + ConstantPool pool = clazz.getConstantPool(); + Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); + assertTrue("Expected 1 EnclosingMethod attribute but found " + + encMethodAttrs.length, encMethodAttrs.length == 1); + EnclosingMethod em = (EnclosingMethod) encMethodAttrs[0]; + String enclosingClassName = em.getEnclosingClass().getBytes(pool); + String enclosingMethodName = em.getEnclosingMethod().getName(pool); + assertTrue( + "Expected class name to be 'org/apache/bcel/data/AttributeTestClassEM01' but was " + + enclosingClassName, enclosingClassName + .equals("org/apache/bcel/data/AttributeTestClassEM01")); + assertTrue("Expected method name to be 'main' but was " + + enclosingMethodName, enclosingMethodName.equals("main")); + } - /** - * Verify for an inner class declared at the type level that the - * EnclosingMethod attribute is set correctly (i.e. to a null value) - */ - public void testCheckClassLevelNamedInnerClass() - throws ClassNotFoundException - { - JavaClass clazz = getTestClass("org.apache.bcel.data.AttributeTestClassEM02$1"); - ConstantPool pool = clazz.getConstantPool(); - Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); - assertTrue("Expected 1 EnclosingMethod attribute but found " - + encMethodAttrs.length, encMethodAttrs.length == 1); - EnclosingMethod em = (EnclosingMethod) encMethodAttrs[0]; - String enclosingClassName = em.getEnclosingClass().getBytes(pool); - assertTrue( - "The class is not within a method, so method_index should be null, but it is " - + em.getEnclosingMethodIndex(), em - .getEnclosingMethodIndex() == 0); - assertTrue( - "Expected class name to be 'org/apache/bcel/data/AttributeTestClassEM02' but was " - + enclosingClassName, enclosingClassName - .equals("org/apache/bcel/data/AttributeTestClassEM02")); - } + /** + * Verify for an inner class declared at the type level that the + * EnclosingMethod attribute is set correctly (i.e. to a null value) + */ + public void testCheckClassLevelNamedInnerClass() + throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AttributeTestClassEM02$1"); + ConstantPool pool = clazz.getConstantPool(); + Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); + assertTrue("Expected 1 EnclosingMethod attribute but found " + + encMethodAttrs.length, encMethodAttrs.length == 1); + EnclosingMethod em = (EnclosingMethod) encMethodAttrs[0]; + String enclosingClassName = em.getEnclosingClass().getBytes(pool); + assertTrue( + "The class is not within a method, so method_index should be null, but it is " + + em.getEnclosingMethodIndex(), em + .getEnclosingMethodIndex() == 0); + assertTrue( + "Expected class name to be 'org/apache/bcel/data/AttributeTestClassEM02' but was " + + enclosingClassName, enclosingClassName + .equals("org/apache/bcel/data/AttributeTestClassEM02")); + } - /** - * Check that we can save and load the attribute correctly. - */ - public void testAttributeSerializtion() throws ClassNotFoundException, - IOException - { - JavaClass clazz = getTestClass("org.apache.bcel.data.AttributeTestClassEM02$1"); - ConstantPool pool = clazz.getConstantPool(); - Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); - assertTrue("Expected 1 EnclosingMethod attribute but found " - + encMethodAttrs.length, encMethodAttrs.length == 1); - // Write it out - File tfile = createTestdataFile("AttributeTestClassEM02$1.class"); - clazz.dump(tfile); - // Read in the new version and check it is OK - SyntheticRepository repos2 = createRepos("."); - JavaClass clazz2 = repos2.loadClass("AttributeTestClassEM02$1"); - EnclosingMethod em = (EnclosingMethod) encMethodAttrs[0]; - String enclosingClassName = em.getEnclosingClass().getBytes(pool); - assertTrue( - "The class is not within a method, so method_index should be null, but it is " - + em.getEnclosingMethodIndex(), em - .getEnclosingMethodIndex() == 0); - assertTrue( - "Expected class name to be 'org/apache/bcel/data/AttributeTestClassEM02' but was " - + enclosingClassName, enclosingClassName - .equals("org/apache/bcel/data/AttributeTestClassEM02")); - tfile.deleteOnExit(); - } + /** + * Check that we can save and load the attribute correctly. + */ + public void testAttributeSerializtion() throws ClassNotFoundException, + IOException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AttributeTestClassEM02$1"); + ConstantPool pool = clazz.getConstantPool(); + Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); + assertTrue("Expected 1 EnclosingMethod attribute but found " + + encMethodAttrs.length, encMethodAttrs.length == 1); + // Write it out + File tfile = createTestdataFile("AttributeTestClassEM02$1.class"); + clazz.dump(tfile); + // Read in the new version and check it is OK + SyntheticRepository repos2 = createRepos("."); + JavaClass clazz2 = repos2.loadClass("AttributeTestClassEM02$1"); + EnclosingMethod em = (EnclosingMethod) encMethodAttrs[0]; + String enclosingClassName = em.getEnclosingClass().getBytes(pool); + assertTrue( + "The class is not within a method, so method_index should be null, but it is " + + em.getEnclosingMethodIndex(), em + .getEnclosingMethodIndex() == 0); + assertTrue( + "Expected class name to be 'org/apache/bcel/data/AttributeTestClassEM02' but was " + + enclosingClassName, enclosingClassName + .equals("org/apache/bcel/data/AttributeTestClassEM02")); + tfile.deleteOnExit(); + } } \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java b/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java index e246a9d6..86a26f3f 100644 --- a/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java +++ b/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java @@ -22,20 +22,20 @@ import org.apache.bcel.classfile.JavaClass; public class EnumAccessFlagTestCase extends AbstractTestCase { - /** - * An enumerated type, once compiled, should result in a class file that is - * marked such that we can determine from the access flags (through BCEL) - * that it was originally an enum type declaration. - */ - public void testEnumClassSaysItIs() throws ClassNotFoundException - { - JavaClass clazz = getTestClass("org.apache.bcel.data.SimpleEnum"); - assertTrue( - "Expected SimpleEnum class to say it was an enum - but it didn't !", - clazz.isEnum()); - clazz = getTestClass("org.apache.bcel.data.SimpleClass"); - assertTrue( - "Expected SimpleClass class to say it was not an enum - but it didn't !", - !clazz.isEnum()); - } + /** + * An enumerated type, once compiled, should result in a class file that is + * marked such that we can determine from the access flags (through BCEL) + * that it was originally an enum type declaration. + */ + public void testEnumClassSaysItIs() throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.SimpleEnum"); + assertTrue( + "Expected SimpleEnum class to say it was an enum - but it didn't !", + clazz.isEnum()); + clazz = getTestClass("org.apache.bcel.data.SimpleClass"); + assertTrue( + "Expected SimpleClass class to say it was not an enum - but it didn't !", + !clazz.isEnum()); + } } \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java b/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java index 9df8bd52..ec65fce1 100644 --- a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java +++ b/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java @@ -31,138 +31,138 @@ import org.apache.bcel.util.SyntheticRepository; public class FieldAnnotationsTestCase extends AbstractTestCase { - /** - * Check field AnnotationEntrys are retrievable. - */ - public void testFieldAnnotationEntrys() throws ClassNotFoundException - { - JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); - // TODO L...;? - checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); - checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); - } + /** + * Check field AnnotationEntrys are retrievable. + */ + public void testFieldAnnotationEntrys() throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); + // TODO L...;? + checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); + checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); + } - /** - * Check field AnnotationEntrys (de)serialize ok. - */ - public void testFieldAnnotationEntrysReadWrite() throws ClassNotFoundException, - IOException - { - JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); - checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); - checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); - // Write it out - File tfile = createTestdataFile("AnnotatedFields.class"); - clazz.dump(tfile); - SyntheticRepository repos2 = createRepos("."); - repos2.loadClass("AnnotatedFields"); - checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); - checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); - assertTrue(tfile.delete()); - } + /** + * Check field AnnotationEntrys (de)serialize ok. + */ + public void testFieldAnnotationEntrysReadWrite() throws ClassNotFoundException, + IOException + { + JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); + checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); + checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); + // Write it out + File tfile = createTestdataFile("AnnotatedFields.class"); + clazz.dump(tfile); + SyntheticRepository repos2 = createRepos("."); + repos2.loadClass("AnnotatedFields"); + checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); + checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); + assertTrue(tfile.delete()); + } - /** - * Check we can load in a class, modify its field AnnotationEntrys, save it, - * reload it and everything is correct. - */ - public void testFieldAnnotationModification() - throws ClassNotFoundException - { - boolean dbg = false; - JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); - ClassGen clg = new ClassGen(clazz); - Field f = clg.getFields()[0]; - if (dbg) { + /** + * Check we can load in a class, modify its field AnnotationEntrys, save it, + * reload it and everything is correct. + */ + public void testFieldAnnotationModification() + throws ClassNotFoundException + { + boolean dbg = false; + JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); + ClassGen clg = new ClassGen(clazz); + Field f = clg.getFields()[0]; + if (dbg) { System.err.println("Field in freshly constructed class is: " + f); } - if (dbg) { + if (dbg) { System.err.println("AnnotationEntrys on field are: " - + dumpAnnotationEntries(f.getAnnotationEntries())); + + dumpAnnotationEntries(f.getAnnotationEntries())); } - AnnotationEntryGen fruitBasedAnnotationEntry = createFruitAnnotationEntry(clg - .getConstantPool(), "Tomato", false); - FieldGen fg = new FieldGen(f, clg.getConstantPool()); - if (dbg) { + AnnotationEntryGen fruitBasedAnnotationEntry = createFruitAnnotationEntry(clg + .getConstantPool(), "Tomato", false); + FieldGen fg = new FieldGen(f, clg.getConstantPool()); + if (dbg) { System.err.println("Adding AnnotationEntry to the field"); } - fg.addAnnotationEntry(fruitBasedAnnotationEntry); - if (dbg) { + fg.addAnnotationEntry(fruitBasedAnnotationEntry); + if (dbg) { System.err.println("FieldGen (mutable field) is " + fg); } - if (dbg) { + if (dbg) { System.err.println("with AnnotationEntrys: " - + dumpAnnotationEntries(fg.getAnnotationEntries())); + + dumpAnnotationEntries(fg.getAnnotationEntries())); } - if (dbg) { + if (dbg) { System.err - .println("Replacing original field with new field that has extra AnnotationEntry"); + .println("Replacing original field with new field that has extra AnnotationEntry"); } - clg.removeField(f); - clg.addField(fg.getField()); - f = clg.getFields()[1]; // there are two fields in the class, removing - // and readding has changed the order - // so this time index [1] is the 'int i' field - if (dbg) { + clg.removeField(f); + clg.addField(fg.getField()); + f = clg.getFields()[1]; // there are two fields in the class, removing + // and readding has changed the order + // so this time index [1] is the 'int i' field + if (dbg) { System.err.println("Field now looks like this: " + f); } - if (dbg) { + if (dbg) { System.err.println("With AnnotationEntrys: " - + dumpAnnotationEntries(f.getAnnotationEntries())); + + dumpAnnotationEntries(f.getAnnotationEntries())); } - assertTrue("Should be 2 AnnotationEntrys on this field, but there are " - + f.getAnnotationEntries().length, f.getAnnotationEntries().length == 2); - } + assertTrue("Should be 2 AnnotationEntrys on this field, but there are " + + f.getAnnotationEntries().length, f.getAnnotationEntries().length == 2); + } - // helper methods - public void checkAnnotatedField(JavaClass clazz, String fieldname, - String AnnotationEntryName, String AnnotationEntryElementName, - String AnnotationEntryElementValue) - { - Field[] fields = clazz.getFields(); - for (Field f : fields) { - AnnotationEntry[] fieldAnnotationEntrys = f.getAnnotationEntries(); - if (f.getName().equals(fieldname)) - { - checkAnnotationEntry(fieldAnnotationEntrys[0], AnnotationEntryName, - AnnotationEntryElementName, AnnotationEntryElementValue); - } - } - } + // helper methods + public void checkAnnotatedField(JavaClass clazz, String fieldname, + String AnnotationEntryName, String AnnotationEntryElementName, + String AnnotationEntryElementValue) + { + Field[] fields = clazz.getFields(); + for (Field f : fields) { + AnnotationEntry[] fieldAnnotationEntrys = f.getAnnotationEntries(); + if (f.getName().equals(fieldname)) + { + checkAnnotationEntry(fieldAnnotationEntrys[0], AnnotationEntryName, + AnnotationEntryElementName, AnnotationEntryElementValue); + } + } + } - private void checkAnnotationEntry(AnnotationEntry a, String name, String elementname, - String elementvalue) - { - assertTrue("Expected AnnotationEntry to have name " + name - + " but it had name " + a.getAnnotationType(), a.getAnnotationType() - .equals(name)); - assertTrue("Expected AnnotationEntry to have one element but it had " - + a.getElementValuePairs().length, a.getElementValuePairs().length == 1); - ElementValuePair envp = a.getElementValuePairs()[0]; - assertTrue("Expected element name " + elementname + " but was " - + envp.getNameString(), elementname - .equals(envp.getNameString())); - assertTrue("Expected element value " + elementvalue + " but was " - + envp.getValue().stringifyValue(), elementvalue.equals(envp - .getValue().stringifyValue())); - } + private void checkAnnotationEntry(AnnotationEntry a, String name, String elementname, + String elementvalue) + { + assertTrue("Expected AnnotationEntry to have name " + name + + " but it had name " + a.getAnnotationType(), a.getAnnotationType() + .equals(name)); + assertTrue("Expected AnnotationEntry to have one element but it had " + + a.getElementValuePairs().length, a.getElementValuePairs().length == 1); + ElementValuePair envp = a.getElementValuePairs()[0]; + assertTrue("Expected element name " + elementname + " but was " + + envp.getNameString(), elementname + .equals(envp.getNameString())); + assertTrue("Expected element value " + elementvalue + " but was " + + envp.getValue().stringifyValue(), elementvalue.equals(envp + .getValue().stringifyValue())); + } - // helper methods - public void checkValue(AnnotationEntry a, String name, String tostring) - { - for (int i = 0; i < a.getElementValuePairs().length; i++) - { - ElementValuePair element = a.getElementValuePairs()[i]; - if (element.getNameString().equals(name)) - { - if (!element.getValue().stringifyValue().equals(tostring)) - { - fail("Expected element " + name + " to have value " - + tostring + " but it had value " - + element.getValue().stringifyValue()); - } - return; - } - } - fail("Didnt find named element " + name); - } + // helper methods + public void checkValue(AnnotationEntry a, String name, String tostring) + { + for (int i = 0; i < a.getElementValuePairs().length; i++) + { + ElementValuePair element = a.getElementValuePairs()[i]; + if (element.getNameString().equals(name)) + { + if (!element.getValue().stringifyValue().equals(tostring)) + { + fail("Expected element " + name + " to have value " + + tostring + " but it had value " + + element.getValue().stringifyValue()); + } + return; + } + } + fail("Didnt find named element " + name); + } } diff --git a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java index ad24a78c..fe73e59c 100644 --- a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java +++ b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java @@ -28,36 +28,36 @@ import org.apache.bcel.util.InstructionFinder; public class InstructionFinderTestCase extends AbstractTestCase { - public void testSearchAll() throws Exception - { - JavaClass clazz = getTestClass("org.apache.bcel.util.InstructionFinder"); - Method[] methods = clazz.getMethods(); - Method searchM = null; - for (Method m : methods) - { - if (m.getName().equals("search") && (m.getArgumentTypes().length == 3)) - { - searchM = m; - break; - } - } - - if (searchM == null) { + public void testSearchAll() throws Exception + { + JavaClass clazz = getTestClass("org.apache.bcel.util.InstructionFinder"); + Method[] methods = clazz.getMethods(); + Method searchM = null; + for (Method m : methods) + { + if (m.getName().equals("search") && (m.getArgumentTypes().length == 3)) + { + searchM = m; + break; + } + } + + if (searchM == null) { throw new Exception("search method not found"); } - - byte[] bytes = searchM.getCode().getCode(); - InstructionList il = new InstructionList(bytes); - InstructionFinder finder = new InstructionFinder(il); - Iterator it = finder.search(".*", il.getStart(), null); - - InstructionHandle[] ihs = (InstructionHandle[])it.next(); - int size = 0; - for (InstructionHandle ih : ihs) - { - size += ih.getInstruction().getLength(); - } - assertEquals(bytes.length, size); - - } + + byte[] bytes = searchM.getCode().getCode(); + InstructionList il = new InstructionList(bytes); + InstructionFinder finder = new InstructionFinder(il); + Iterator it = finder.search(".*", il.getStart(), null); + + InstructionHandle[] ihs = (InstructionHandle[])it.next(); + int size = 0; + for (InstructionHandle ih : ihs) + { + size += ih.getInstruction().getLength(); + } + assertEquals(bytes.length, size); + + } } diff --git a/src/test/java/org/apache/bcel/NanoTimer.java b/src/test/java/org/apache/bcel/NanoTimer.java index 27efb9b0..3c9978b2 100644 --- a/src/test/java/org/apache/bcel/NanoTimer.java +++ b/src/test/java/org/apache/bcel/NanoTimer.java @@ -20,32 +20,32 @@ package org.apache.bcel; public class NanoTimer { - private long time = 0; + private long time = 0; - public NanoTimer start() { - time -= System.nanoTime(); - return this; - } + public NanoTimer start() { + time -= System.nanoTime(); + return this; + } - public void stop() { - time += System.nanoTime(); - } + public void stop() { + time += System.nanoTime(); + } - public void subtract(NanoTimer o) { - time -= o.time; - } + public void subtract(NanoTimer o) { + time -= o.time; + } - public void reset() { - time = 0; - } + public void reset() { + time = 0; + } - /** - * May ony be called after stop has been called as many times as start. - */ - @Override + /** + * May ony be called after stop has been called as many times as start. + */ + @Override public String toString() { - return ((double) (time) / 1000000000) + " s"; - } + return ((double) (time) / 1000000000) + " s"; + } diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java index be128865..2cca58f4 100644 --- a/src/test/java/org/apache/bcel/PerformanceTest.java +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -36,100 +36,100 @@ import org.apache.bcel.generic.MethodGen; public final class PerformanceTest extends TestCase { - private static byte[] read(final InputStream is) throws IOException { - if (is == null) { - throw new IOException("Class not found"); - } - byte[] b = new byte[is.available()]; - int len = 0; - while (true) { - int n = is.read(b, len, b.length - len); - if (n == -1) { - if (len < b.length) { - byte[] c = new byte[len]; - System.arraycopy(b, 0, c, 0, len); - b = c; - } - return b; - } - len += n; - if (len == b.length) { - byte[] c = new byte[b.length + 1000]; - System.arraycopy(b, 0, c, 0, len); - b = c; - } - } - } - - private static void test(int fraction) throws IOException { - NanoTimer total = new NanoTimer(); - NanoTimer parseTime = new NanoTimer(); - NanoTimer cgenTime = new NanoTimer(); - NanoTimer mgenTime = new NanoTimer(); - NanoTimer mserTime = new NanoTimer(); - NanoTimer serTime = new NanoTimer(); - - total.start(); - - String javaHome = System.getProperty("java.home"); + private static byte[] read(final InputStream is) throws IOException { + if (is == null) { + throw new IOException("Class not found"); + } + byte[] b = new byte[is.available()]; + int len = 0; + while (true) { + int n = is.read(b, len, b.length - len); + if (n == -1) { + if (len < b.length) { + byte[] c = new byte[len]; + System.arraycopy(b, 0, c, 0, len); + b = c; + } + return b; + } + len += n; + if (len == b.length) { + byte[] c = new byte[b.length + 1000]; + System.arraycopy(b, 0, c, 0, len); + b = c; + } + } + } + + private static void test(int fraction) throws IOException { + NanoTimer total = new NanoTimer(); + NanoTimer parseTime = new NanoTimer(); + NanoTimer cgenTime = new NanoTimer(); + NanoTimer mgenTime = new NanoTimer(); + NanoTimer mserTime = new NanoTimer(); + NanoTimer serTime = new NanoTimer(); + + total.start(); + + String javaHome = System.getProperty("java.home"); JarFile jar = new JarFile(javaHome + "/lib/dt.jar"); - Enumeration en = jar.entries(); - int i = 0; - - while (en.hasMoreElements()) { - JarEntry e = (JarEntry) en.nextElement(); - if (e.getName().endsWith(".class") && i++ % fraction == 0) { - InputStream in = jar.getInputStream(e); - byte[] bytes = read(in); - - parseTime.start(); - JavaClass clazz = new ClassParser(new ByteArrayInputStream(bytes), e.getName()) - .parse(); - parseTime.stop(); - - cgenTime.start(); - ClassGen cg = new ClassGen(clazz); - cgenTime.stop(); - - Method[] methods = cg.getMethods(); - for (Method m : methods) { - mgenTime.start(); - MethodGen mg = new MethodGen(m, cg.getClassName(), cg.getConstantPool()); - InstructionList il = mg.getInstructionList(); - mgenTime.stop(); - - mserTime.start(); - if (il != null) { - mg.getInstructionList().setPositions(); - mg.setMaxLocals(); - mg.setMaxStack(); - } - cg.replaceMethod(m, mg.getMethod()); - mserTime.stop(); - } - - serTime.start(); - cg.getJavaClass().getBytes(); - serTime.stop(); - } - } - - jar.close(); - total.stop(); - System.out.println("ClassParser.parse: " + parseTime); - System.out.println("ClassGen.init: " + cgenTime); - System.out.println("MethodGen.init: " + mgenTime); - System.out.println("MethodGen.getMethod: " + mserTime); - System.out.println("ClassGen.getJavaClass.getBytes: " + serTime); - System.out.println("Total: " + total); - System.out.println(); - } - - public void testPerformance() throws IOException { - test(1); - test(1); - test(1); - } - + Enumeration en = jar.entries(); + int i = 0; + + while (en.hasMoreElements()) { + JarEntry e = (JarEntry) en.nextElement(); + if (e.getName().endsWith(".class") && i++ % fraction == 0) { + InputStream in = jar.getInputStream(e); + byte[] bytes = read(in); + + parseTime.start(); + JavaClass clazz = new ClassParser(new ByteArrayInputStream(bytes), e.getName()) + .parse(); + parseTime.stop(); + + cgenTime.start(); + ClassGen cg = new ClassGen(clazz); + cgenTime.stop(); + + Method[] methods = cg.getMethods(); + for (Method m : methods) { + mgenTime.start(); + MethodGen mg = new MethodGen(m, cg.getClassName(), cg.getConstantPool()); + InstructionList il = mg.getInstructionList(); + mgenTime.stop(); + + mserTime.start(); + if (il != null) { + mg.getInstructionList().setPositions(); + mg.setMaxLocals(); + mg.setMaxStack(); + } + cg.replaceMethod(m, mg.getMethod()); + mserTime.stop(); + } + + serTime.start(); + cg.getJavaClass().getBytes(); + serTime.stop(); + } + } + + jar.close(); + total.stop(); + System.out.println("ClassParser.parse: " + parseTime); + System.out.println("ClassGen.init: " + cgenTime); + System.out.println("MethodGen.init: " + mgenTime); + System.out.println("MethodGen.getMethod: " + mserTime); + System.out.println("ClassGen.getJavaClass.getBytes: " + serTime); + System.out.println("Total: " + total); + System.out.println(); + } + + public void testPerformance() throws IOException { + test(1); + test(1); + test(1); + } + } diff --git a/src/test/java/org/apache/bcel/data/SimpleClass.java b/src/test/java/org/apache/bcel/data/SimpleClass.java index 56a4486a..34994d39 100644 --- a/src/test/java/org/apache/bcel/data/SimpleClass.java +++ b/src/test/java/org/apache/bcel/data/SimpleClass.java @@ -20,8 +20,8 @@ package org.apache.bcel.data; public class SimpleClass { - public static void main(String[] argv) - { - // Nothing unusual in this class - } + public static void main(String[] argv) + { + // Nothing unusual in this class + } } diff --git a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java index 12871052..76e771b9 100644 --- a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java +++ b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java @@ -29,18 +29,18 @@ import org.apache.bcel.generic.InstructionList; public class InstructionFinderTest extends AbstractTestCase { - public void testSearch() { - InstructionList il = new InstructionList(); - il.append(new ILOAD(1)); - il.append(new ILOAD(2)); - il.append(new IADD()); - il.append(new ISTORE(3)); - InstructionFinder finder = new InstructionFinder(il); - - Iterator it = finder.search("ILOAD IADD", il.getInstructionHandles()[0], null ); - InstructionHandle[] ihs = (InstructionHandle[])it.next(); - assertEquals(2, ihs.length); - assertEquals(ihs[0].getInstruction(), new ILOAD(2)); - assertEquals(ihs[1].getInstruction(), new IADD()); - } + public void testSearch() { + InstructionList il = new InstructionList(); + il.append(new ILOAD(1)); + il.append(new ILOAD(2)); + il.append(new IADD()); + il.append(new ISTORE(3)); + InstructionFinder finder = new InstructionFinder(il); + + Iterator it = finder.search("ILOAD IADD", il.getInstructionHandles()[0], null ); + InstructionHandle[] ihs = (InstructionHandle[])it.next(); + assertEquals(2, ihs.length); + assertEquals(ihs[0].getInstruction(), new ILOAD(2)); + assertEquals(ihs[1].getInstruction(), new IADD()); + } } diff --git a/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java index 791c24ff..cf1451ec 100644 --- a/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java +++ b/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java @@ -26,14 +26,14 @@ public class VerifierTestCase extends TestCase { public void testDefaultMethodValidation() { String classname = Collection.class.getName(); - + Verifier verifier = VerifierFactory.getVerifier(classname); VerificationResult result = verifier.doPass1(); assertEquals("Pass 1 verification of " + classname + " failed: " + result.getMessage(), VerificationResult.VERIFIED_OK, result.getStatus()); - + result = verifier.doPass2(); - + assertEquals("Pass 2 verification of " + classname + " failed: " + result.getMessage(), VerificationResult.VERIFIED_OK, result.getStatus()); } } diff --git a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java index 7c517e8d..6b15f424 100644 --- a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java +++ b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java @@ -64,290 +64,290 @@ import org.apache.bcel.classfile.Visitor; public class CounterVisitor implements Visitor { - public int unknownCount = 0; + public int unknownCount = 0; - public int syntheticCount = 0; + public int syntheticCount = 0; - public int stackMapEntryCount = 0; + public int stackMapEntryCount = 0; - public int stackMapCount = 0; + public int stackMapCount = 0; - public int sourceFileCount = 0; + public int sourceFileCount = 0; - public int signatureAnnotationCount = 0; + public int signatureAnnotationCount = 0; - public int parameterAnnotationCount = 0; + public int parameterAnnotationCount = 0; - public int methodCount = 0; + public int methodCount = 0; - public int localVariableTypeTableCount = 0; + public int localVariableTypeTableCount = 0; - public int localVariableTableCount = 0; + public int localVariableTableCount = 0; - public int localVariableCount = 0; + public int localVariableCount = 0; - public int lineNumberTableCount = 0; + public int lineNumberTableCount = 0; - public int lineNumberCount = 0; + public int lineNumberCount = 0; - public int javaClassCount = 0; + public int javaClassCount = 0; - public int innerClassesCount = 0; + public int innerClassesCount = 0; - public int innerClassCount = 0; + public int innerClassCount = 0; - public int fieldCount = 0; + public int fieldCount = 0; - public int exceptionTableCount = 0; + public int exceptionTableCount = 0; - public int enclosingMethodCount = 0; + public int enclosingMethodCount = 0; - public int deprecatedCount = 0; + public int deprecatedCount = 0; - public int constantValueCount = 0; + public int constantValueCount = 0; - public int constantUtf8Count = 0; + public int constantUtf8Count = 0; - public int constantStringCount = 0; + public int constantStringCount = 0; - public int constantNameAndTypeCount = 0; + public int constantNameAndTypeCount = 0; - public int constantPoolCount = 0; + public int constantPoolCount = 0; - public int constantMethodrefCount = 0; + public int constantMethodrefCount = 0; - public int constantLongCount = 0; + public int constantLongCount = 0; - public int constantIntegerCount = 0; + public int constantIntegerCount = 0; - public int constantInterfaceMethodrefCount = 0; + public int constantInterfaceMethodrefCount = 0; - public int constantFloatCount = 0; + public int constantFloatCount = 0; - public int constantFieldrefCount = 0; + public int constantFieldrefCount = 0; - public int constantClassCount = 0; + public int constantClassCount = 0; - public int constantDoubleCount = 0; + public int constantDoubleCount = 0; - public int codeExceptionCount = 0; + public int codeExceptionCount = 0; - public int codeCount = 0; + public int codeCount = 0; - public int annotationEntryCount = 0; + public int annotationEntryCount = 0; - public int annotationDefaultCount = 0; + public int annotationDefaultCount = 0; - public int annotationCount = 0; + public int annotationCount = 0; - public int stackMapTableCount = 0; + public int stackMapTableCount = 0; - public int stackMapTableEntryCount = 0; + public int stackMapTableEntryCount = 0; - public int bootstrapMethodsCount = 0; + public int bootstrapMethodsCount = 0; public int methodParametersCount = 0; - - - public void visitAnnotation(Annotations obj) - { - annotationCount++; - } - - public void visitAnnotationDefault(AnnotationDefault obj) - { - annotationDefaultCount++; - } - - public void visitAnnotationEntry(AnnotationEntry obj) - { - annotationEntryCount++; - } - - public void visitCode(Code obj) - { - codeCount++; - } - - public void visitCodeException(CodeException obj) - { - codeExceptionCount++; - } - - public void visitConstantClass(ConstantClass obj) - { - constantClassCount++; - } - - public void visitConstantDouble(ConstantDouble obj) - { - constantDoubleCount++; - } - - public void visitConstantFieldref(ConstantFieldref obj) - { - constantFieldrefCount++; - } - - public void visitConstantFloat(ConstantFloat obj) - { - constantFloatCount++; - } - - public void visitConstantInteger(ConstantInteger obj) - { - constantIntegerCount++; - } - - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) - { - constantInterfaceMethodrefCount++; - } - - public void visitConstantLong(ConstantLong obj) - { - constantLongCount++; - } - - public void visitConstantMethodref(ConstantMethodref obj) - { - constantMethodrefCount++; - } - - public void visitConstantNameAndType(ConstantNameAndType obj) - { - constantNameAndTypeCount++; - } - - public void visitConstantPool(ConstantPool obj) - { - constantPoolCount++; - } - - public void visitConstantString(ConstantString obj) - { - constantStringCount++; - } - - public void visitConstantUtf8(ConstantUtf8 obj) - { - constantUtf8Count++; - } - - public void visitConstantValue(ConstantValue obj) - { - constantValueCount++; - } - - public void visitDeprecated(Deprecated obj) - { - deprecatedCount++; - } - - public void visitEnclosingMethod(EnclosingMethod obj) - { - enclosingMethodCount++; - } - - public void visitExceptionTable(ExceptionTable obj) - { - exceptionTableCount++; - } - - public void visitField(Field obj) - { - fieldCount++; - } - - public void visitInnerClass(InnerClass obj) - { - innerClassCount++; - } - - public void visitInnerClasses(InnerClasses obj) - { - innerClassesCount++; - } - - public void visitJavaClass(JavaClass obj) - { - javaClassCount++; - } - - public void visitLineNumber(LineNumber obj) - { - lineNumberCount++; - } - - public void visitLineNumberTable(LineNumberTable obj) - { - lineNumberTableCount++; - } - - public void visitLocalVariable(LocalVariable obj) - { - localVariableCount++; - } - - public void visitLocalVariableTable(LocalVariableTable obj) - { - localVariableTableCount++; - } - - public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) - { - localVariableTypeTableCount++; - } - - public void visitMethod(Method obj) - { - methodCount++; - } - - public void visitParameterAnnotation(ParameterAnnotations obj) - { - parameterAnnotationCount++; - } - - public void visitSignature(Signature obj) - { - signatureAnnotationCount++; - } - - public void visitSourceFile(SourceFile obj) - { - sourceFileCount++; - } - - public void visitStackMap(StackMap obj) - { - stackMapCount++; - } - - public void visitStackMapEntry(StackMapEntry obj) - { - stackMapEntryCount++; - } - - public void visitSynthetic(Synthetic obj) - { - syntheticCount++; - } - - public void visitUnknown(Unknown obj) - { - unknownCount++; - } - - public void visitStackMapTable(StackMapTable obj) - { - stackMapTableCount++; - } - - public void visitStackMapTableEntry(StackMapTableEntry obj) - { - stackMapTableEntryCount++; - } + + + public void visitAnnotation(Annotations obj) + { + annotationCount++; + } + + public void visitAnnotationDefault(AnnotationDefault obj) + { + annotationDefaultCount++; + } + + public void visitAnnotationEntry(AnnotationEntry obj) + { + annotationEntryCount++; + } + + public void visitCode(Code obj) + { + codeCount++; + } + + public void visitCodeException(CodeException obj) + { + codeExceptionCount++; + } + + public void visitConstantClass(ConstantClass obj) + { + constantClassCount++; + } + + public void visitConstantDouble(ConstantDouble obj) + { + constantDoubleCount++; + } + + public void visitConstantFieldref(ConstantFieldref obj) + { + constantFieldrefCount++; + } + + public void visitConstantFloat(ConstantFloat obj) + { + constantFloatCount++; + } + + public void visitConstantInteger(ConstantInteger obj) + { + constantIntegerCount++; + } + + public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) + { + constantInterfaceMethodrefCount++; + } + + public void visitConstantLong(ConstantLong obj) + { + constantLongCount++; + } + + public void visitConstantMethodref(ConstantMethodref obj) + { + constantMethodrefCount++; + } + + public void visitConstantNameAndType(ConstantNameAndType obj) + { + constantNameAndTypeCount++; + } + + public void visitConstantPool(ConstantPool obj) + { + constantPoolCount++; + } + + public void visitConstantString(ConstantString obj) + { + constantStringCount++; + } + + public void visitConstantUtf8(ConstantUtf8 obj) + { + constantUtf8Count++; + } + + public void visitConstantValue(ConstantValue obj) + { + constantValueCount++; + } + + public void visitDeprecated(Deprecated obj) + { + deprecatedCount++; + } + + public void visitEnclosingMethod(EnclosingMethod obj) + { + enclosingMethodCount++; + } + + public void visitExceptionTable(ExceptionTable obj) + { + exceptionTableCount++; + } + + public void visitField(Field obj) + { + fieldCount++; + } + + public void visitInnerClass(InnerClass obj) + { + innerClassCount++; + } + + public void visitInnerClasses(InnerClasses obj) + { + innerClassesCount++; + } + + public void visitJavaClass(JavaClass obj) + { + javaClassCount++; + } + + public void visitLineNumber(LineNumber obj) + { + lineNumberCount++; + } + + public void visitLineNumberTable(LineNumberTable obj) + { + lineNumberTableCount++; + } + + public void visitLocalVariable(LocalVariable obj) + { + localVariableCount++; + } + + public void visitLocalVariableTable(LocalVariableTable obj) + { + localVariableTableCount++; + } + + public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) + { + localVariableTypeTableCount++; + } + + public void visitMethod(Method obj) + { + methodCount++; + } + + public void visitParameterAnnotation(ParameterAnnotations obj) + { + parameterAnnotationCount++; + } + + public void visitSignature(Signature obj) + { + signatureAnnotationCount++; + } + + public void visitSourceFile(SourceFile obj) + { + sourceFileCount++; + } + + public void visitStackMap(StackMap obj) + { + stackMapCount++; + } + + public void visitStackMapEntry(StackMapEntry obj) + { + stackMapEntryCount++; + } + + public void visitSynthetic(Synthetic obj) + { + syntheticCount++; + } + + public void visitUnknown(Unknown obj) + { + unknownCount++; + } + + public void visitStackMapTable(StackMapTable obj) + { + stackMapTableCount++; + } + + public void visitStackMapTableEntry(StackMapTableEntry obj) + { + stackMapTableEntryCount++; + } public void visitBootstrapMethods(BootstrapMethods obj) { -- GitLab From b472d2976cecd098d0431f451a086df52acdec40 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 30 May 2014 23:00:20 +0000 Subject: [PATCH 0622/1313] resource leak git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1598767 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Utility.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 62acc511..11fe4e50 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -1201,6 +1201,7 @@ public abstract class Utility { int in = b & 0x000000ff; // Normalize to unsigned jw.write(in); } + jw.close(); return caw.toString(); } -- GitLab From 077a141132ff793c6f0744635e85fa0a49a92863 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 30 May 2014 23:00:50 +0000 Subject: [PATCH 0623/1313] Unused variables git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1598768 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/generic/AnnotationEntryGen.java | 1 - src/main/java/org/apache/bcel/util/CodeHTML.java | 5 ++--- .../org/apache/bcel/verifier/VerifierFactoryListModel.java | 1 - 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index e4dd15e7..8ed5f89e 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -66,7 +66,6 @@ public class AnnotationEntryGen boolean copyPoolEntries) { List out = new ArrayList(); - int l = in.length; for (ElementValuePair nvp : in) { out.add(new ElementValuePairGen(nvp, cpool, copyPoolEntries)); diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 180e1a00..5dbacb9a 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -374,7 +374,6 @@ final class CodeHTML implements org.apache.bcel.Constants { */ if (code != null) { CodeException[] ce = code.getExceptionTable(); - int len = ce.length; for (CodeException cex : ce) { goto_set.set(cex.getStartPC()); goto_set.set(cex.getEndPC()); @@ -397,7 +396,7 @@ final class CodeHTML implements org.apache.bcel.Constants { } } // Get target addresses from GOTO, JSR, TABLESWITCH, etc. - for (int i = 0; bytes.available() > 0; i++) { + for (; bytes.available() > 0;) { opcode = bytes.readUnsignedByte(); //System.out.println(OPCODE_NAMES[opcode]); switch (opcode) { @@ -539,7 +538,7 @@ final class CodeHTML implements org.apache.bcel.Constants { stream.reset(); file.println("

        Access flags
        " + ""); - for (int i = 0; stream.available() > 0; i++) { + for (; stream.available() > 0;) { int offset = stream.getIndex(); String str = codeToHTML(stream, method_number); String anchor = ""; diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index 6a54d8ad..ad128fab 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -46,7 +46,6 @@ public class VerifierFactoryListModel implements org.apache.bcel.verifier.Verifi public synchronized void update( String s ) { - int size = listeners.size(); Verifier[] verifiers = VerifierFactory.getVerifiers(); int num_of_verifiers = verifiers.length; cache.clear(); -- GitLab From b5903a529cbe064c5d4f75fa466c767b0e89d58f Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Jun 2014 09:21:04 +0000 Subject: [PATCH 0624/1313] Updated the download page for BCEL 6.0 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600572 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/download_bcel.xml | 36 ++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/site/xdoc/download_bcel.xml b/src/site/xdoc/download_bcel.xml index 13dc3923..3594155b 100644 --- a/src/site/xdoc/download_bcel.xml +++ b/src/site/xdoc/download_bcel.xml @@ -45,16 +45,16 @@ limitations under the License. --> - Download Commons BCEL + Download Apache Commons BCEL Commons Documentation Team -
        +

        We recommend you use a mirror to download our release builds, but you must verify the integrity of - the downloaded files using signatures downloaded from our main + the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours) may not yet be available from the mirrors.

        @@ -71,7 +71,7 @@ limitations under the License.

        - Other mirrors: + Other mirrors:

        Byte
        offset
        InstructionArgument
        - - - + + + - - - + + +
        bcel-5.2.tar.gzmd5pgpbcel-6.0-bin.tar.gzmd5pgp
        bcel-5.2.zipmd5pgpbcel-6.0-bin.zipmd5pgp
        - - - + + + - - - + + +
        bcel-5.2-src.tar.gzmd5pgpbcel-6.0-src.tar.gzmd5pgp
        bcel-5.2-src.zipmd5pgpbcel-6.0-src.zipmd5pgp
        -- GitLab From 96d53bde903c05a23be9526d96701f42563144a7 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Jun 2014 09:32:17 +0000 Subject: [PATCH 0625/1313] Updated the menu link to the Javadoc git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600574 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/site.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/site/site.xml b/src/site/site.xml index e1007c0d..032e2dc7 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -36,7 +36,7 @@ - +

    -- GitLab From 070e3809a2e0f2575c3c6d12cadd9709557b2bb0 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Jun 2014 10:54:41 +0000 Subject: [PATCH 0626/1313] Added the code coverage report git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600593 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 267dc840..7a4ad756 100644 --- a/pom.xml +++ b/pom.xml @@ -251,7 +251,12 @@ --> - + + + org.codehaus.mojo + cobertura-maven-plugin + 2.6 + -- GitLab From 64dd3f0a22a5625f095666e27b7bddde84843883 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Jun 2014 11:18:46 +0000 Subject: [PATCH 0627/1313] Updated the changes report for BCEL 6.0 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600604 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 235 +++++++++++++++++++++++++++++++++++----- 1 file changed, 205 insertions(+), 30 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 9576aa5c..cfb2e637 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -40,37 +40,212 @@ The type attribute can be add,update,fix,remove. --> - - Changes - Apache Commons devlopers - + + Changes + Apache Commons devlopers + - + Defining changes.version allows one to create the RN without first removing the SNAPSHOT suffix. + --> - - - - Examples not present in source or binary downloads - - - Why using unstable sort at MethodGen.getLocalVariables() ? - - - + + + + Add parent type processing for ClassPath class. + + + Add support for getResource and getResourceAsStream to ClassPath + + + Properly parse StackMapTable attributes in Java 6 classfiles + + + Javadoc overhaul + + + BCEL is unnecessarily slow + + + Add support for INVOKEDYNAMIC and MethodHandles + + + Why using unstable sort at MethodGen.getLocalVariables() ? + + + Incorporate patch file from Findbugs + + + Implement the MethodParameters attribute + + + Mistake in "Peephole optimizer" example at http://commons.apache.org/bcel/manual.html + + + BCEL cannot be used as java.system.class.loader + + + XSLT transforms broken in Turkish Locale. + + + java.lang.ClassFormatError: LVTT entry for 'local' in class file org/shiftone/jrat/test/dummy/CrashTestDummy does not match any LVT entry + + + ClassParser.parse() throws NullPointerException if class does not exist and ClassParser(String) constructor is used + + + ArrayOutOfBoundsException in InstructionFinder + + + Website: Incorrect URL for source; version 5.2 is not in the bug page + + + bcelified method doesn't pass verification + + + return type not verified by JustIce + + + @since tag incorrect for Annotation classes in BCEL trunk + + + InstructionFactory missing % operator for Float, Double + + + Fields in Annotations and AnnotationEntry are inaccessible to subclasses + + + Add support for getResources to ClassPath + + + Two source files in repository are empty + + + Maven POM file calls in apache regex but code does not use it + + + ClassParser throws unintelligible Exception + + + verifier raises an AssertionViolatedException when done against Java 5 files with generics/annotations + + + Verifier fails in pass 2 with "Number of LocalVariableTable attributes of Code attribute" on static methods. + + + ParameterAnnotationEntries are read not dumped + + + RuntimeVisible Annotations duplicated + + + ARRAYLENGTH incorrectly not StackConsumer + + + Error in method search() defined in org.apache.bcel.util.InstructionFinder + + + Deleting all instructions of a list shows wrong behaviour + + + Make BCEL JAR OSGi compatible + + + ArrayIndexOutOfBoundsException thrown from TABLESWITCH.initFromFile + + + tableswitch/lookupswitch invalid alignment of 4-byte operands + + + Incorrect size calculation in InstructionFinder + + + Class files containing "ParameterAnnotations" are dumped incorrectly + + + Class files containing "StackMapTable" attributes (on method code) are dumped incorrectly + + + org.apache.bcel.classfile.ClassParser: NullPointerException caused by fileopen failed + + + org.apache.bcel.classfile.ClassParser: NullPointerException caused by invalid filename + + + ExecutionVisitor doesn't support Class constant type for LDC and LDC_W + + + BCELifier issue: BCELFactory fails to handle float and long constants + + + "Invalid method signature: TT;" when using MethodGen for a method having a generic parameter + + + FieldInstruction.getFieldSize() doesn't decode Type.getTypeSize() output + + + org.apache.bcel.generic.Instruction.equals(Object) does not follow Object.equals(Object) rules + + + Select instructions should implement StackConsumer instead of StackProducer + + + Fix CPL License issues with EnclosingMethod.java and LocalVariableTypeTable.java + + + Type.getReturnTypeSize() doesn't decode Type.getTypeSize() output + + + SyntheticRepository.loadClass() fails to close the inputStream + + + BCELifier produces incorrect code for methods containing loads of class literals from constant pool + + + Code attribute size not updated + + + Incorrect link for Jasmin assembler language + + + Examples not present in source or binary downloads + + + ClassParser.parse() generates NPE if it cannot open the file + + + InstConstraintVisitor does not handle class constants + + + Pass3bVerifier crashes on empty methods + + + LocalVariableGen.getLocalVariable() computes incorrect length + + + Method does not have a method to access parameter annotations + + + ClassPath.getResource does not correctly perform URL escaping + + + ClassParser fails to parse JDK classes in Java 8: ClassFormatException: Invalid byte tag in constant pool + + + Verification of interfaces with default methods fails with Java 8 + + + -- GitLab From 089ccc1a11dd733efb6eea5c271d1b4dcc1b280b Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Jun 2014 11:30:46 +0000 Subject: [PATCH 0628/1313] Added missing license headers git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600609 13f79535-47bb-0310-9956-ffa450edef68 --- .../generic/NameSignatureInstruction.java | 17 ++++++++++++++++ .../generic/VisitorSupportsInvokeDynamic.java | 20 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java index 4947dcdc..c301efa4 100644 --- a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java +++ b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.apache.bcel.generic; import org.apache.bcel.classfile.ConstantCP; diff --git a/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java b/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java index 0d041f5f..c252f0ee 100644 --- a/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java +++ b/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java @@ -1,7 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.apache.bcel.generic; -public interface VisitorSupportsInvokeDynamic extends Visitor{ +public interface VisitorSupportsInvokeDynamic extends Visitor { void visitNameSignatureInstruction(NameSignatureInstruction obj); + void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj); } -- GitLab From 6a78640da87c1545c0c84f95400450e4a9be1866 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Jun 2014 12:13:16 +0000 Subject: [PATCH 0629/1313] Removed the unused META-INF directory git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600623 13f79535-47bb-0310-9956-ffa450edef68 --- META-INF/MANIFEST.MF | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 META-INF/MANIFEST.MF diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF deleted file mode 100644 index c397ba02..00000000 --- a/META-INF/MANIFEST.MF +++ /dev/null @@ -1,14 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: org.apache.bcel -Bundle-SymbolicName: org.apache.bcel -Bundle-Vendor: Apache -Bundle-Version: 5.3 -Export-Package: org.apache.bcel, - org.apache.bcel.classfile, - org.apache.bcel.generic, - org.apache.bcel.util, - org.apache.bcel.verifier, - org.apache.bcel.verifier.exc, - org.apache.bcel.verifier.statics, - org.apache.bcel.verifier.structurals -- GitLab From 4c16fda65e01b16e685233c84fe3e7653bff745b Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Jun 2014 12:21:10 +0000 Subject: [PATCH 0630/1313] Missing license headers in the documentation git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600627 13f79535-47bb-0310-9956-ffa450edef68 --- docs/verifier/GNUmakefile | 27 ++++++++++++++------------- docs/verifier/JustIce.lyx | 18 +++++++++++++++++- src/examples/Mini/Mini.jjt | 17 +++++++++++++++++ 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/docs/verifier/GNUmakefile b/docs/verifier/GNUmakefile index 90d72098..0348d6ca 100644 --- a/docs/verifier/GNUmakefile +++ b/docs/verifier/GNUmakefile @@ -1,19 +1,20 @@ -# JustIce, the class file verifier for use with BCEL was written -# in 2001 by Enver Haase; (c) 2001 Enver Haase. +# JustIce, the class file verifier for use with BCEL was written +# in 2001 by Enver Haase; (c) 2001 Enver Haase. # -# 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 2 of the License, or -# (at your option) any later version. +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at # -# 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. +# http://www.apache.org/licenses/LICENSE-2.0 # -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. # # $Id$ diff --git a/docs/verifier/JustIce.lyx b/docs/verifier/JustIce.lyx index 67b7ffe0..45d87c3b 100644 --- a/docs/verifier/JustIce.lyx +++ b/docs/verifier/JustIce.lyx @@ -1,4 +1,20 @@ -#LyX 1.1 created this file. For more info see http://www.lyx.org/ +# LyX 1.1 created this file. For more info see http://www.lyx.org/ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + \lyxformat 218 \textclass scrbook \begin_preamble diff --git a/src/examples/Mini/Mini.jjt b/src/examples/Mini/Mini.jjt index 568c0a49..04bdbe34 100644 --- a/src/examples/Mini/Mini.jjt +++ b/src/examples/Mini/Mini.jjt @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + options { MULTI=true; NODE_SCOPE_HOOK=true; /* Call methods on entry/exit of node */ -- GitLab From 655a6b7b53fccf9d52f022587c27005296d3fcce Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Jun 2014 12:21:49 +0000 Subject: [PATCH 0631/1313] Excluded files from the RAT report git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600628 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pom.xml b/pom.xml index 7a4ad756..a4e7f20c 100644 --- a/pom.xml +++ b/pom.xml @@ -257,6 +257,24 @@ cobertura-maven-plugin 2.6 + + org.apache.rat + apache-rat-plugin + ${commons.rat.version} + + + src/test/resources/** + docs/*.bib + docs/*.mdl + docs/eps/* + **/*.eps + **/*.bnf + **/*.mini + TODO.JustIce + src/examples/Mini/MiniParser$JJCalls + + + -- GitLab From 17e8850f782351583dadeb4aaf290f49a4f22978 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Jun 2014 12:32:51 +0000 Subject: [PATCH 0632/1313] Merged VisitorSupportsInvokeDynamic into Visitor git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600634 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/generic/EmptyVisitor.java | 2 +- .../org/apache/bcel/generic/GETFIELD.java | 4 +-- .../org/apache/bcel/generic/GETSTATIC.java | 4 +-- .../apache/bcel/generic/INVOKEDYNAMIC.java | 6 ++--- .../apache/bcel/generic/INVOKEINTERFACE.java | 4 +-- .../apache/bcel/generic/INVOKESPECIAL.java | 4 +-- .../org/apache/bcel/generic/INVOKESTATIC.java | 4 +-- .../apache/bcel/generic/INVOKEVIRTUAL.java | 4 +-- .../org/apache/bcel/generic/PUTFIELD.java | 4 +-- .../org/apache/bcel/generic/PUTSTATIC.java | 4 +-- .../java/org/apache/bcel/generic/Visitor.java | 6 +++++ .../generic/VisitorSupportsInvokeDynamic.java | 25 ------------------- 12 files changed, 17 insertions(+), 54 deletions(-) delete mode 100644 src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java diff --git a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java index fa5bc206..e4c8651a 100644 --- a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java @@ -23,7 +23,7 @@ package org.apache.bcel.generic; * @version $Id$ * @author M. Dahm */ -public abstract class EmptyVisitor implements VisitorSupportsInvokeDynamic { +public abstract class EmptyVisitor implements Visitor { public void visitStackInstruction( StackInstruction obj ) { } diff --git a/src/main/java/org/apache/bcel/generic/GETFIELD.java b/src/main/java/org/apache/bcel/generic/GETFIELD.java index 0227e852..ccfc0160 100644 --- a/src/main/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/main/java/org/apache/bcel/generic/GETFIELD.java @@ -80,9 +80,7 @@ public class GETFIELD extends FieldInstruction implements ExceptionThrower, Stac v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) { - ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); - } + v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitGETFIELD(this); diff --git a/src/main/java/org/apache/bcel/generic/GETSTATIC.java b/src/main/java/org/apache/bcel/generic/GETSTATIC.java index bef1d972..610c11ae 100644 --- a/src/main/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/GETSTATIC.java @@ -78,9 +78,7 @@ public class GETSTATIC extends FieldInstruction implements PushInstruction, Exce v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) { - ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); - } + v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitGETSTATIC(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java index a582f730..ca6bfbb8 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java @@ -174,9 +174,7 @@ public class INVOKEDYNAMIC extends NameSignatureInstruction implements Exception v.visitStackConsumer(this); v.visitStackProducer(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) { - ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); - ((VisitorSupportsInvokeDynamic)v).visitINVOKEDYNAMIC(this); - } + v.visitNameSignatureInstruction(this); + v.visitINVOKEDYNAMIC(this); } } diff --git a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java index a398daae..45afe594 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -133,9 +133,7 @@ public final class INVOKEINTERFACE extends InvokeInstruction { v.visitStackProducer(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) { - ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); - } + v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitInvokeInstruction(this); v.visitINVOKEINTERFACE(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java index 56ebbcd7..2a645ee7 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -75,9 +75,7 @@ public class INVOKESPECIAL extends InvokeInstruction { v.visitStackProducer(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) { - ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); - } + v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitInvokeInstruction(this); v.visitINVOKESPECIAL(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java index d5183db5..a791ee74 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -72,9 +72,7 @@ public class INVOKESTATIC extends InvokeInstruction { v.visitStackProducer(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) { - ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); - } + v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitInvokeInstruction(this); v.visitINVOKESTATIC(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java index 4d5b593e..dd7a353f 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -75,9 +75,7 @@ public class INVOKEVIRTUAL extends InvokeInstruction { v.visitLoadClass(this); v.visitCPInstruction(this); v.visitFieldOrMethod(this); - if (v instanceof VisitorSupportsInvokeDynamic) { - ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); - } + v.visitNameSignatureInstruction(this); v.visitInvokeInstruction(this); v.visitINVOKEVIRTUAL(this); } diff --git a/src/main/java/org/apache/bcel/generic/PUTFIELD.java b/src/main/java/org/apache/bcel/generic/PUTFIELD.java index 018bc707..889af619 100644 --- a/src/main/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/main/java/org/apache/bcel/generic/PUTFIELD.java @@ -79,9 +79,7 @@ public class PUTFIELD extends FieldInstruction implements PopInstruction, Except v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) { - ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); - } + v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitPUTFIELD(this); diff --git a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java index 3e9461b3..4834506f 100644 --- a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java @@ -78,9 +78,7 @@ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, Pop v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); - if (v instanceof VisitorSupportsInvokeDynamic) { - ((VisitorSupportsInvokeDynamic)v).visitNameSignatureInstruction(this); - } + v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitPUTSTATIC(this); diff --git a/src/main/java/org/apache/bcel/generic/Visitor.java b/src/main/java/org/apache/bcel/generic/Visitor.java index 83703e3d..8c001ac3 100644 --- a/src/main/java/org/apache/bcel/generic/Visitor.java +++ b/src/main/java/org/apache/bcel/generic/Visitor.java @@ -566,4 +566,10 @@ public interface Visitor { void visitBREAKPOINT( BREAKPOINT obj ); + + + void visitNameSignatureInstruction( NameSignatureInstruction obj ); + + + void visitINVOKEDYNAMIC( INVOKEDYNAMIC obj ); } diff --git a/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java b/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java deleted file mode 100644 index c252f0ee..00000000 --- a/src/main/java/org/apache/bcel/generic/VisitorSupportsInvokeDynamic.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.bcel.generic; - -public interface VisitorSupportsInvokeDynamic extends Visitor { - - void visitNameSignatureInstruction(NameSignatureInstruction obj); - - void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj); -} -- GitLab From 8a40937c06d893e87a61d9bfea2843a75ffd12b1 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Jun 2014 12:37:47 +0000 Subject: [PATCH 0633/1313] Removed and ignore maven-eclipse.xml git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600636 13f79535-47bb-0310-9956-ffa450edef68 --- maven-eclipse.xml | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 maven-eclipse.xml diff --git a/maven-eclipse.xml b/maven-eclipse.xml deleted file mode 100644 index 668e3c50..00000000 --- a/maven-eclipse.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file -- GitLab From 58d136416eed2729268a8824848e57e0a4913436 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 5 Jun 2014 14:17:51 +0000 Subject: [PATCH 0634/1313] Add missing @Deprecated annotations. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600672 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 12 ++++++++---- .../java/org/apache/bcel/classfile/ConstantUtf8.java | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index d62c5b1c..c9dd4744 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -1448,13 +1448,17 @@ public interface Constants { public static final byte ATTR_METHOD_PARAMETERS = 21; /** @deprecated Use {@link #ATTR_RUNTIME_VISIBLE_ANNOTATIONS} instead */ - public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = ATTR_RUNTIME_VISIBLE_ANNOTATIONS; + @Deprecated +public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = ATTR_RUNTIME_VISIBLE_ANNOTATIONS; /** @deprecated Use {@link #ATTR_RUNTIME_INVISIBLE_ANNOTATIONS} instead */ - public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = ATTR_RUNTIME_INVISIBLE_ANNOTATIONS; + @Deprecated +public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = ATTR_RUNTIME_INVISIBLE_ANNOTATIONS; /** @deprecated Use {@link #ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS} instead */ - public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS; + @Deprecated +public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS; /** @deprecated Use {@link #ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS} instead */ - public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS; + @Deprecated +public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS; public static final short KNOWN_ATTRIBUTES = 22; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index 912ff7fb..a4961343 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -168,6 +168,7 @@ public final class ConstantUtf8 extends Constant { * @param bytes the raw bytes of this Utf-8 * @deprecated */ + @java.lang.Deprecated public final void setBytes( String bytes ) { throw new UnsupportedOperationException(); } -- GitLab From 596fb1c9f5c9ccb5115855cfd7ca43925289741e Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 5 Jun 2014 14:19:44 +0000 Subject: [PATCH 0635/1313] Add missing serial version ID (generated). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600673 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ConstantUtf8.java | 2 ++ src/main/java/org/apache/bcel/generic/ObjectType.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index a4961343..27552c66 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -72,6 +72,8 @@ public final class ConstantUtf8 extends Constant { considered++; if (cache == null) { cache = new LinkedHashMap(INITIAL_CACHE_CAPACITY, 0.75f, true) { + private static final long serialVersionUID = -8506975356158971766L; + @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_CACHE_ENTRIES; diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index f887dcb6..fb07493e 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -44,6 +44,8 @@ public class ObjectType extends ReferenceType { cache = new LinkedHashMap(INITIAL_CACHE_CAPACITY, 0.75f, true) { + private static final long serialVersionUID = 2101159231109718724L; + @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size() > MAX_CACHE_ENTRIES; -- GitLab From 6715e7e6caf3ed4078ffc11e91933e74b43c582c Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 6 Jun 2014 02:45:03 +0000 Subject: [PATCH 0636/1313] Consistently indent by 2. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600807 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 489 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 244 insertions(+), 245 deletions(-) diff --git a/pom.xml b/pom.xml index a4e7f20c..2d421e55 100644 --- a/pom.xml +++ b/pom.xml @@ -1,290 +1,289 @@ - + - 4.0.0 + 4.0.0 - - org.apache.commons - commons-parent - 33 - + + org.apache.commons + commons-parent + 33 + - org.apache.bcel - bcel - jar - 6.0-SNAPSHOT - Apache Commons BCEL - Apache Commons Bytecode Engineering Library + org.apache.bcel + bcel + jar + 6.0-SNAPSHOT + Apache Commons BCEL + Apache Commons Bytecode Engineering Library - http://commons.apache.org/proper/commons-bcel - 2004 + http://commons.apache.org/proper/commons-bcel + 2004 - - ISO-8859-1 - UTF-8 - 1.5 - 1.5 - bcel - 6.0 - (Java 5.0+) - https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-bcel - - org.apache.${commons.componentid} - org.apache.bcel.*;version=${project.version};-noimport:=true - * - - - BCEL - 12314220 - + + ISO-8859-1 + UTF-8 + 1.5 + 1.5 + bcel + 6.0 + (Java 5.0+) + https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-bcel + + org.apache.${commons.componentid} + org.apache.bcel.*;version=${project.version};-noimport:=true + * + + + BCEL + 12314220 + - - - - apache.website - Apache Website - scp://people.apache.org/www/commons.apache.org/${commons.componentid}/ - - + + + + apache.website + Apache Website + scp://people.apache.org/www/commons.apache.org/${commons.componentid}/ + + - - - Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - + + + Apache License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + - - The Apache Software Foundation - http://www.apache.org/ - + + The Apache Software Foundation + http://www.apache.org/ + - - - Dave Brosius - dbrosius - dbrosius at mebigfatguy.com - + + + Dave Brosius + dbrosius + dbrosius at mebigfatguy.com + - - Torsten Curdt - tcurdt - tcurdt at apache.org - ASF - http://www.apache.org/ - +1 - + + Torsten Curdt + tcurdt + tcurdt at apache.org + ASF + http://www.apache.org/ + +1 + - - Markus Dahm - mdahm - m.dahm at gmx.de - it-frameworksolutions - + + Markus Dahm + mdahm + m.dahm at gmx.de + it-frameworksolutions + - - Jason van Zyl - jason at zenplex.com - + + Jason van Zyl + jason at zenplex.com + - + - + - - Enver Haase - enver at convergence.de - + + Enver Haase + enver at convergence.de + - - David Dixon-Peugh - dixonpeugh at yahoo.com - + + David Dixon-Peugh + dixonpeugh at yahoo.com + - - Patrick Beard - beard at netscape.com - + + Patrick Beard + beard at netscape.com + - - Conor MacNeill - conor at cortexbusiness.com.au - + + Conor MacNeill + conor at cortexbusiness.com.au + - - Costin Manolache - cmanolache at yahoo.com - + + Costin Manolache + cmanolache at yahoo.com + - + - - - BCEL User List - + + + BCEL User List + user-subscribe@commons.apache.org - + user-unsubscribe@commons.apache.org - + http://mail-archives.apache.org/mod_mbox/commons-user/ - - - BCEL Developer List - dev-subscribe@commons.apache.org - + + + BCEL Developer List + dev-subscribe@commons.apache.org + dev-unsubscribe@commons.apache.org - + http://mail-archives.apache.org/mod_mbox/commons-dev/ - - + + - - jira - http://issues.apache.org/jira/browse/BCEL - + + jira + http://issues.apache.org/jira/browse/BCEL + - - + + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk - + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk - http://svn.apache.org/repos/asf/commons/proper/bcel/trunk - + http://svn.apache.org/repos/asf/commons/proper/bcel/trunk + - - - - org.apache.maven.plugins - maven-jar-plugin - - - - test-jar - - - - - - maven-surefire-plugin - - - **/*TestCase.java - - - **/Abstract* - - - - - maven-assembly-plugin - - - src/main/assembly/bin.xml - src/main/assembly/src.xml - - gnu - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9.1 - - - - - org.apache.maven.plugins - maven-scm-publish-plugin - - - javadocs - - - - - + + + + org.apache.maven.plugins + maven-jar-plugin + + + + test-jar + + + + + + maven-surefire-plugin + + + **/*TestCase.java + + + **/Abstract* + + + + + maven-assembly-plugin + + + src/main/assembly/bin.xml + src/main/assembly/src.xml + + gnu + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9.1 + + + + + org.apache.maven.plugins + maven-scm-publish-plugin + + + javadocs + + + + + - - - - - - org.codehaus.mojo - cobertura-maven-plugin - 2.6 - - - org.apache.rat - apache-rat-plugin - ${commons.rat.version} - - - src/test/resources/** - docs/*.bib - docs/*.mdl - docs/eps/* - **/*.eps - **/*.bnf - **/*.mini - TODO.JustIce - src/examples/Mini/MiniParser$JJCalls - - - - - + + + + + + org.codehaus.mojo + cobertura-maven-plugin + 2.6 + + + org.apache.rat + apache-rat-plugin + ${commons.rat.version} + + + src/test/resources/** + docs/*.bib + docs/*.mdl + docs/eps/* + **/*.eps + **/*.bnf + **/*.mini + TODO.JustIce + src/examples/Mini/MiniParser$JJCalls + + + + + - - - junit - junit - 4.11 - test - - + + + junit + junit + 4.11 + test + + -- GitLab From d1fdb9a02cd23b8ff7df8e4436915fc4bf057092 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 6 Jun 2014 03:03:30 +0000 Subject: [PATCH 0637/1313] Add more reports: FindBugs, PMD, Checkstyle. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1600809 13f79535-47bb-0310-9956-ffa450edef68 --- LICENSE-header.txt | 16 +++++++++++ checkstyle.xml | 69 ++++++++++++++++++++++++++++++++++++++++++++++ pmd.xml | 26 +++++++++++++++++ pom.xml | 52 +++++++++++++++++++++++++++++++++- 4 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 LICENSE-header.txt create mode 100644 checkstyle.xml create mode 100644 pmd.xml diff --git a/LICENSE-header.txt b/LICENSE-header.txt new file mode 100644 index 00000000..ae6f28c4 --- /dev/null +++ b/LICENSE-header.txt @@ -0,0 +1,16 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/checkstyle.xml b/checkstyle.xml new file mode 100644 index 00000000..89cd3898 --- /dev/null +++ b/checkstyle.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pmd.xml b/pmd.xml new file mode 100644 index 00000000..ceefc84d --- /dev/null +++ b/pmd.xml @@ -0,0 +1,26 @@ + + + + Excludes from default PMD rules. + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2d421e55..bac45a6e 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ org.apache.commons commons-parent - 33 + 34 org.apache.bcel @@ -250,6 +250,56 @@ --> + + org.apache.maven.plugins + maven-checkstyle-plugin + + 2.9.1 + + ${basedir}/checkstyle.xml + false + ${basedir}/LICENSE-header.txt + + + + + + checkstyle + + + + + + org.apache.maven.plugins + maven-pmd-plugin + 3.1 + + ${maven.compiler.target} + true + + ${basedir}/pmd.xml + + + + + org.codehaus.mojo + findbugs-maven-plugin + 2.5.4 + + + org.codehaus.mojo + taglist-maven-plugin + 2.4 + + + TODO + NOPMD + NOTE + + + org.codehaus.mojo -- GitLab From 486d8f6ec2a924c30fbc9da13faab5742dd5700d Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 11:58:17 +0000 Subject: [PATCH 0638/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606467 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/Class2HTML.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index d194a47e..d2a384a7 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -172,9 +172,8 @@ public class Class2HTML implements Constants { || base_type.equals("long") || base_type.equals("double") || base_type.equals("float")) { return "" + type + ""; - } else { - return "" + short_type + ""; } + return "" + short_type + ""; } -- GitLab From dadd7b459837c6b0fd92a7287410709528309cbb Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 11:59:35 +0000 Subject: [PATCH 0639/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606468 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/util/ClassLoaderRepository.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java index ecc98b15..394e2c50 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -70,11 +70,7 @@ public class ClassLoaderRepository implements Repository { * Find an already defined JavaClass. */ public JavaClass findClass( String className ) { - if (loadedClasses.containsKey(className)) { - return loadedClasses.get(className); - } else { - return null; - } + return loadedClasses.containsKey(className) ? loadedClasses.get(className) : null; } -- GitLab From bb619d05d00d780639d73538d9422889bb3788a3 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:01:15 +0000 Subject: [PATCH 0640/1313] Formating. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606470 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/structurals/ControlFlowGraph.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index ed440aa5..f9d99455 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -243,11 +243,9 @@ public class ControlFlowGraph{ extendMessageWithFlow(sce); throw sce; } - if ( oldstack.equals(inF.getStack()) && - oldlocals.equals(inF.getLocals()) ){ + if (oldstack.equals(inF.getStack()) && oldlocals.equals(inF.getLocals())) { return false; - } - else{ + } else { return true; } } -- GitLab From 619b0456ab3b38e4fe3409f29613a8bb78902d57 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:01:48 +0000 Subject: [PATCH 0641/1313] Formating. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606471 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/structurals/ControlFlowGraph.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index f9d99455..84f6ebec 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -230,16 +230,15 @@ public class ControlFlowGraph{ * Does the actual merging (vmspec2, page 146). * Returns true IFF this.inFrame was changed in course of merging with inFrame. */ - private boolean mergeInFrames(Frame inFrame){ + private boolean mergeInFrames(Frame inFrame) { // TODO: Can be performance-improved. Frame inF = inFrames.get(lastExecutionJSR()); OperandStack oldstack = inF.getStack().getClone(); LocalVariables oldlocals = inF.getLocals().getClone(); - try{ + try { inF.getStack().merge(inFrame.getStack()); inF.getLocals().merge(inFrame.getLocals()); - } - catch (StructuralCodeConstraintException sce){ + } catch (StructuralCodeConstraintException sce) { extendMessageWithFlow(sce); throw sce; } -- GitLab From d16e38a5b74a8f57e0e961f05f7f606f9c69f56f Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:03:08 +0000 Subject: [PATCH 0642/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606472 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/structurals/ControlFlowGraph.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index 84f6ebec..45502f64 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -376,12 +376,10 @@ public class ControlFlowGraph{ System.arraycopy(matchTargets, 0, ret, 1, matchTargets.length); return ret; } - else{ - final InstructionHandle[] pair = new InstructionHandle[2]; - pair[0] = getInstruction().getNext(); - pair[1] = ((BranchInstruction) inst).getTarget(); - return pair; - } + final InstructionHandle[] pair = new InstructionHandle[2]; + pair[0] = getInstruction().getNext(); + pair[1] = ((BranchInstruction) inst).getTarget(); + return pair; } // default case: Fall through. -- GitLab From 1e278c2972d932c104cf50c8d64d665398da389e Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:05:13 +0000 Subject: [PATCH 0643/1313] In-line lvar. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606474 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/structurals/ExceptionHandlers.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index 05b4020f..8708051f 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -69,8 +69,7 @@ public class ExceptionHandlers{ if (hs == null) { return new ExceptionHandler[0]; } else{ - ExceptionHandler[] ret = new ExceptionHandler[hs.size()]; - return hs.toArray(ret); + return hs.toArray(new ExceptionHandler[hs.size()]); } } -- GitLab From f5d7796ca4a4776c9398d1b8691435643895349c Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:05:42 +0000 Subject: [PATCH 0644/1313] Better lvar name. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606476 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/structurals/ExceptionHandlers.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index 8708051f..1d5ef1f4 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -65,11 +65,11 @@ public class ExceptionHandlers{ * handlers that protect the instruction ih. */ public ExceptionHandler[] getExceptionHandlers(InstructionHandle ih){ - Set hs = exceptionhandlers.get(ih); - if (hs == null) { + Set hsSet = exceptionhandlers.get(ih); + if (hsSet == null) { return new ExceptionHandler[0]; } else{ - return hs.toArray(new ExceptionHandler[hs.size()]); + return hsSet.toArray(new ExceptionHandler[hsSet.size()]); } } -- GitLab From b965df420b77e0ab229d2c8bae3931f747f34807 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:06:02 +0000 Subject: [PATCH 0645/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606477 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/structurals/ExceptionHandlers.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index 1d5ef1f4..d54f5344 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -68,9 +68,8 @@ public class ExceptionHandlers{ Set hsSet = exceptionhandlers.get(ih); if (hsSet == null) { return new ExceptionHandler[0]; - } else{ - return hsSet.toArray(new ExceptionHandler[hsSet.size()]); } + return hsSet.toArray(new ExceptionHandler[hsSet.size()]); } } -- GitLab From 3c0d56896169b62b2e523447b688a3f1a82b35c3 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:07:40 +0000 Subject: [PATCH 0646/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606478 13f79535-47bb-0310-9956-ffa450edef68 --- .../structurals/InstConstraintVisitor.java | 53 ++++++++----------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index ea3ccd3f..c675c003 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -416,18 +416,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ if (stack().peek() == Type.NULL){ return; } - else{ - if (! (stack().peek() instanceof ReferenceType)){ - constraintViolated(o, "Reference type expected on top of stack, but is: '"+stack().peek()+"'."); - } - referenceTypeIsInitialized(o, (ReferenceType) (stack().peek())); - //ReferenceType objectref = (ReferenceType) (stack().peek()); - // TODO: This can only be checked if using Staerk-et-al's "set of object types" instead of a - // "wider cast object type" created during verification. - //if (! (objectref.isAssignmentCompatibleWith(mg.getType())) ){ - // constraintViolated(o, "Type on stack top which should be returned is a '"+stack().peek()+"' which is not assignment compatible with the return type of this method, '"+mg.getType()+"'."); - //} + if (! (stack().peek() instanceof ReferenceType)){ + constraintViolated(o, "Reference type expected on top of stack, but is: '"+stack().peek()+"'."); } + referenceTypeIsInitialized(o, (ReferenceType) (stack().peek())); + //ReferenceType objectref = (ReferenceType) (stack().peek()); + // TODO: This can only be checked if using Staerk-et-al's "set of object types" instead of a + // "wider cast object type" created during verification. + //if (! (objectref.isAssignmentCompatibleWith(mg.getType())) ){ + // constraintViolated(o, "Type on stack top which should be returned is a '"+stack().peek()+"' which is not assignment compatible with the return type of this method, '"+mg.getType()+"'."); + //} } else{ if (! ( method_type.equals( stack().peek() ))){ @@ -933,10 +931,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ if (stack().peek(1).getSize() == 2){ return; // Form 2, okay. } - else{ //stack().peek(1).getSize == 1. - if (stack().peek(2).getSize() != 1){ - constraintViolated(o, "If stack top's size is 1 and stack next-to-top's size is 1, stack next-to-next-to-top's size must also be 1, but is: '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); - } + //stack().peek(1).getSize == 1. + if (stack().peek(2).getSize() != 1){ + constraintViolated(o, "If stack top's size is 1 and stack next-to-top's size is 1, stack next-to-next-to-top's size must also be 1, but is: '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); } } @@ -948,10 +945,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ if (stack().peek().getSize() == 2){ return; // Form 2, okay. } - else{ //stack().peek().getSize() == 1. - if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); - } + //stack().peek().getSize() == 1. + if (stack().peek(1).getSize() != 1){ + constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); } } @@ -988,13 +984,12 @@ public class InstConstraintVisitor extends EmptyVisitor{ if (stack().peek(1).getSize() == 2){ return; // Form 4 } - else{// stack top size is 2, next-to-top's size is 1 - if ( stack().peek(2).getSize() != 1 ){ - constraintViolated(o, "If stack top's size is 2 and stack-next-to-top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); - } - else{ - return; // Form 2 - } + // stack top size is 2, next-to-top's size is 1 + if ( stack().peek(2).getSize() != 1 ){ + constraintViolated(o, "If stack top's size is 2 and stack-next-to-top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + } + else{ + return; // Form 2 } } else{// stack top is of size 1 @@ -1002,10 +997,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ if ( stack().peek(2).getSize() == 2 ){ return; // Form 3 } - else{ - if ( stack().peek(3).getSize() == 1){ - return; // Form 1 - } + if ( stack().peek(3).getSize() == 1){ + return; // Form 1 } } } -- GitLab From c036e95f6956920e6f4fa3b5e4963c82701c63ef Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:08:43 +0000 Subject: [PATCH 0647/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606479 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/structurals/Subroutines.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index d0ffa510..eb491987 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -328,9 +328,7 @@ public class Subroutines{ if (localVariable != UNSET){ throw new AssertionViolatedException("localVariable set twice."); } - else{ - localVariable = i; - } + localVariable = i; } /** -- GitLab From 7a4e7574fd232f41b96616f968d410ebee49aea2 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:08:58 +0000 Subject: [PATCH 0648/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606480 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/structurals/Subroutines.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index eb491987..e1ae5906 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -148,9 +148,7 @@ public class Subroutines{ if (ret != null){ throw new StructuralCodeConstraintException("Subroutine with more then one RET detected: '"+ret+"' and '"+actual+"'."); } - else{ - ret = actual; - } + ret = actual; } } if (ret == null){ -- GitLab From 7771ea6152b4bf03f108d9c66d5712abd3837bb2 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:09:15 +0000 Subject: [PATCH 0649/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606481 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/structurals/Subroutines.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index e1ae5906..8e09288a 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -181,13 +181,11 @@ public class Subroutines{ if (localVariable == UNSET){ throw new AssertionViolatedException("Set the localVariable first!"); } - else{ - // Something is wrong when an ASTORE is targeted that does not operate on the same local variable than the rest of the - // JsrInstruction-targets and the RET. - // (We don't know out leader here so we cannot check if we're really targeted!) - if (localVariable != ((ASTORE) (((JsrInstruction) jsrInst.getInstruction()).getTarget().getInstruction())).getIndex()){ - throw new AssertionViolatedException("Setting a wrong JsrInstruction."); - } + // Something is wrong when an ASTORE is targeted that does not operate on the same local variable than the rest of the + // JsrInstruction-targets and the RET. + // (We don't know out leader here so we cannot check if we're really targeted!) + if (localVariable != ((ASTORE) (((JsrInstruction) jsrInst.getInstruction()).getTarget().getInstruction())).getIndex()){ + throw new AssertionViolatedException("Setting a wrong JsrInstruction."); } theJSRs.add(jsrInst); } -- GitLab From da6c1a5a3803aeaaafcd005d2fccaabc537d9741 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:09:37 +0000 Subject: [PATCH 0650/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606482 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/structurals/Subroutines.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index 8e09288a..d80e337d 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -448,9 +448,7 @@ public class Subroutines{ if (instructions_assigned.contains(element)){ throw new StructuralCodeConstraintException("Instruction '"+element+"' is part of more than one subroutine (or of the top level and a subroutine)."); } - else{ - instructions_assigned.add(element); - } + instructions_assigned.add(element); } } if (actual != all[0]){// If we don't deal with the top-level 'subroutine' -- GitLab From 44cc973599eb43bda65705b482626bf68a0359bb Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:09:48 +0000 Subject: [PATCH 0651/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606483 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/structurals/Subroutines.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index d80e337d..ccd29747 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -616,12 +616,10 @@ System.err.println("DEBUG: Please verify '"+any.toString(true)+"' lies in dead c System.arraycopy(matchTargets, 0, ret, 1, matchTargets.length); return ret; } - else{ - final InstructionHandle[] pair = new InstructionHandle[2]; - pair[0] = instruction.getNext(); - pair[1] = ((BranchInstruction) inst).getTarget(); - return pair; - } + final InstructionHandle[] pair = new InstructionHandle[2]; + pair[0] = instruction.getNext(); + pair[1] = ((BranchInstruction) inst).getTarget(); + return pair; } // default case: Fall through. -- GitLab From e69263b93d25821840737b0ee6be17235f067a05 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:10:24 +0000 Subject: [PATCH 0652/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606484 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/statics/Pass1Verifier.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index 8d768b3b..5f93f6f3 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -162,11 +162,9 @@ public final class Pass1Verifier extends PassVerifier{ if (jc != null){ return VerificationResult.VR_OK; } - else{ - //TODO: Maybe change Repository's behaviour to throw a LoadingException instead of just returning "null" - // if a class file cannot be found or in another way be looked up. - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Repository.lookup() failed. FILE NOT FOUND?"); - } + //TODO: Maybe change Repository's behaviour to throw a LoadingException instead of just returning "null" + // if a class file cannot be found or in another way be looked up. + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Repository.lookup() failed. FILE NOT FOUND?"); } /** -- GitLab From d841292bc8e29af114acace510512146c7488ed9 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:11:33 +0000 Subject: [PATCH 0653/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606485 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/statics/Pass2Verifier.java | 50 ++++++++----------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 724a81e8..b18ab9eb 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -166,9 +166,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); } return vr; - } else { - return VerificationResult.VR_NOTYET; } + return VerificationResult.VR_NOTYET; } catch (ClassNotFoundException e) { // FIXME: this might not be the best way to handle missing classes. @@ -256,9 +255,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ if (method.isFinal()) { if (!(method.isPrivate())) { throw new ClassConstraintException("Method '" + name_and_sig + "' in class '" + hashmap.get(name_and_sig) + "' overrides the final (not-overridable) definition in class '" + jc.getClassName() + "'."); - } else { - addMessage("Method '" + name_and_sig + "' in class '" + hashmap.get(name_and_sig) + "' overrides the final (not-overridable) definition in class '" + jc.getClassName() + "'. This is okay, as the original definition was private; however this constraint leverage was introduced by JLS 8.4.6 (not vmspec2) and the behaviour of the Sun verifiers."); } + addMessage("Method '" + name_and_sig + "' in class '" + hashmap.get(name_and_sig) + "' overrides the final (not-overridable) definition in class '" + jc.getClassName() + "'. This is okay, as the original definition was private; however this constraint leverage was introduced by JLS 8.4.6 (not vmspec2) and the behaviour of the Sun verifiers."); } else { if (!method.isStatic()) { // static methods don't inherit hashmap.put(name_and_sig, jc.getClassName()); @@ -915,10 +913,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ addMessage("Code attribute '"+tostring(obj)+"' is not declared in a method_info structure but in '"+carrier.predecessor()+"'. Ignored."); return; } - else{ - m = (Method) carrier.predecessor(); // we can assume this method was visited before; - // i.e. the data consistency was verified. - } + m = (Method) carrier.predecessor(); // we can assume this method was visited before; + // i.e. the data consistency was verified. if (obj.getCode().length == 0){ throw new ClassConstraintException("Code array of Code attribute '"+tostring(obj)+"' (method '"+m+"') must not be empty."); @@ -940,29 +936,25 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ if (vr != VerificationResult.VR_OK){ throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but it does not pass verification pass 1: "+vr); } - else{ - // We cannot safely trust any other "instanceof" mechanism. We need to transitively verify - // the ancestor hierarchy. - JavaClass e = Repository.lookupClass(cname); - JavaClass t = Repository.lookupClass(Type.THROWABLE.getClassName()); - JavaClass o = Repository.lookupClass(Type.OBJECT.getClassName()); - while (e != o){ - if (e == t) { - break; // It's a subclass of Throwable, OKAY, leave. - } - - v = VerifierFactory.getVerifier(e.getSuperclassName()); - vr = v.doPass1(); - if (vr != VerificationResult.VR_OK){ - throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but '"+e.getSuperclassName()+"' in the ancestor hierachy does not pass verification pass 1: "+vr); - } - else{ - e = Repository.lookupClass(e.getSuperclassName()); - } + // We cannot safely trust any other "instanceof" mechanism. We need to transitively verify + // the ancestor hierarchy. + JavaClass e = Repository.lookupClass(cname); + JavaClass t = Repository.lookupClass(Type.THROWABLE.getClassName()); + JavaClass o = Repository.lookupClass(Type.OBJECT.getClassName()); + while (e != o){ + if (e == t) { + break; // It's a subclass of Throwable, OKAY, leave. } - if (e != t) { - throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); + + v = VerifierFactory.getVerifier(e.getSuperclassName()); + vr = v.doPass1(); + if (vr != VerificationResult.VR_OK){ + throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but '"+e.getSuperclassName()+"' in the ancestor hierachy does not pass verification pass 1: "+vr); } + e = Repository.lookupClass(e.getSuperclassName()); + } + if (e != t) { + throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); } } } -- GitLab From a2e8c450b4c051cf6d37d702d14ddc9a6002f2dc Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:12:03 +0000 Subject: [PATCH 0654/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606486 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/statics/Pass3aVerifier.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 2d29062a..aac9eb31 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -207,9 +207,8 @@ public final class Pass3aVerifier extends PassVerifier{ } return vr; } - else{ //did not pass Pass 2. - return VerificationResult.VR_NOTYET; - } + //did not pass Pass 2. + return VerificationResult.VR_NOTYET; } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this throw new AssertionViolatedException("Missing class: " + e, e); -- GitLab From d9167dbb1a274b2e3d846af73b6f205f78035d81 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:13:29 +0000 Subject: [PATCH 0655/1313] Redundant null check: The variable lvt cannot be null at this location. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606487 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/statics/Pass3aVerifier.java | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index aac9eb31..c06a1757 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -261,20 +261,23 @@ public final class Pass3aVerifier extends PassVerifier{ than only one. This is a bug in BCEL. */ Attribute[] atts = code.getAttributes(); for (Attribute att : atts) { - if (att instanceof LocalVariableTable){ + if (att instanceof LocalVariableTable) { LocalVariableTable lvt = (LocalVariableTable) att; - if (lvt != null){ - LocalVariable[] localVariables = lvt.getLocalVariableTable(); - for (LocalVariable localVariable : localVariables) { - int startpc = localVariable.getStartPC(); - int length = localVariable.getLength(); - - if (!contains(instructionPositions, startpc)){ - throw new ClassConstraintException("Code attribute '"+code+"' has a LocalVariableTable attribute '"+code.getLocalVariableTable()+"' referring to a code offset ('"+startpc+"') that does not exist."); - } - if ( (!contains(instructionPositions, startpc+length)) && (startpc+length != codeLength) ){ - throw new ClassConstraintException("Code attribute '"+code+"' has a LocalVariableTable attribute '"+code.getLocalVariableTable()+"' referring to a code offset start_pc+length ('"+(startpc+length)+"') that does not exist."); - } + LocalVariable[] localVariables = lvt.getLocalVariableTable(); + for (LocalVariable localVariable : localVariables) { + int startpc = localVariable.getStartPC(); + int length = localVariable.getLength(); + + if (!contains(instructionPositions, startpc)) { + throw new ClassConstraintException("Code attribute '" + code + + "' has a LocalVariableTable attribute '" + code.getLocalVariableTable() + + "' referring to a code offset ('" + startpc + "') that does not exist."); + } + if ((!contains(instructionPositions, startpc + length)) && (startpc + length != codeLength)) { + throw new ClassConstraintException("Code attribute '" + code + + "' has a LocalVariableTable attribute '" + code.getLocalVariableTable() + + "' referring to a code offset start_pc+length ('" + (startpc + length) + + "') that does not exist."); } } } -- GitLab From 3f054fe90def942bbc334ed85a516686489cd176 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:15:09 +0000 Subject: [PATCH 0656/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606488 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/structurals/ControlFlowGraph.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index 45502f64..d8c3a948 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -242,11 +242,7 @@ public class ControlFlowGraph{ extendMessageWithFlow(sce); throw sce; } - if (oldstack.equals(inF.getStack()) && oldlocals.equals(inF.getLocals())) { - return false; - } else { - return true; - } + return !(oldstack.equals(inF.getStack()) && oldlocals.equals(inF.getLocals())); } /** -- GitLab From bfde21cf9a193f14a2f46156515a41ca9b6c30b4 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:15:29 +0000 Subject: [PATCH 0657/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606489 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/verifier/structurals/Pass3bVerifier.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index c8b480dc..24035a46 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -180,9 +180,7 @@ public final class Pass3bVerifier extends PassVerifier{ lastJSR = oldchain.get(ss); break; } - else{ - skip_jsr--; - } + skip_jsr--; } if ((oldchain.get(ss)).getInstruction().getInstruction() instanceof RET){ skip_jsr++; -- GitLab From 8ef45d64a3af2a29d34368ab011cf2c7061b9bc1 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:17:14 +0000 Subject: [PATCH 0658/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606490 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/classfile/DescendingVisitor.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index a8c9dd55..691bd60e 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -55,10 +55,7 @@ public class DescendingVisitor implements Visitor { return null; } - else - { - return stack.elementAt(size - (level + 2)); // size - 1 == current - } + return stack.elementAt(size - (level + 2)); // size - 1 == current } /** -- GitLab From e92750e5d3b9a77123f5f0ee31d52a8009b11891 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:18:43 +0000 Subject: [PATCH 0659/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606491 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/MethodParameter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameter.java b/src/main/java/org/apache/bcel/classfile/MethodParameter.java index 3a1464bb..72cbdce7 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameter.java +++ b/src/main/java/org/apache/bcel/classfile/MethodParameter.java @@ -69,9 +69,8 @@ public class MethodParameter implements Serializable, Cloneable { public String getParameterName(ConstantPool constant_pool) { if (name_index == 0) { return null; - } else { - return ((ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8)).getBytes(); } + return ((ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8)).getBytes(); } public int getAccessFlags() { -- GitLab From e02f195560e45cf4a03f8f3801c855bee8226f28 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:19:32 +0000 Subject: [PATCH 0660/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606492 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/classfile/SimpleElementValue.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java index e3ccff43..cad501d9 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -183,9 +183,8 @@ public class SimpleElementValue extends ElementValue getIndex(), Constants.CONSTANT_Integer); if (bo.getBytes() == 0) { return "false"; - } else { - return "true"; } + return "true"; case STRING: ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(getIndex(), Constants.CONSTANT_Utf8); -- GitLab From 1ea29a6f4a04868e12f417792e81abd183ce3462 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:20:59 +0000 Subject: [PATCH 0661/1313] Better ivar name. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606493 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/ByteSequence.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/ByteSequence.java b/src/main/java/org/apache/bcel/util/ByteSequence.java index 565cdec5..2bb42ded 100644 --- a/src/main/java/org/apache/bcel/util/ByteSequence.java +++ b/src/main/java/org/apache/bcel/util/ByteSequence.java @@ -30,22 +30,22 @@ import java.io.DataInputStream; */ public final class ByteSequence extends DataInputStream { - private ByteArrayStream byte_stream; + private ByteArrayStream byteStream; public ByteSequence(byte[] bytes) { super(new ByteArrayStream(bytes)); - byte_stream = (ByteArrayStream) in; + byteStream = (ByteArrayStream) in; } public final int getIndex() { - return byte_stream.getPosition(); + return byteStream.getPosition(); } final void unreadByte() { - byte_stream.unreadByte(); + byteStream.unreadByte(); } private static final class ByteArrayStream extends ByteArrayInputStream { -- GitLab From 99010fb34cd4e52a37bcc0739891f5619e4506ba Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 29 Jun 2014 12:25:37 +0000 Subject: [PATCH 0662/1313] Better comment. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1606495 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/ByteSequence.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/ByteSequence.java b/src/main/java/org/apache/bcel/util/ByteSequence.java index 2bb42ded..908f61f6 100644 --- a/src/main/java/org/apache/bcel/util/ByteSequence.java +++ b/src/main/java/org/apache/bcel/util/ByteSequence.java @@ -54,11 +54,10 @@ public final class ByteSequence extends DataInputStream { super(bytes); } - final int getPosition() { + // pos is protected in ByteArrayInputStream return pos; - } // is protected in ByteArrayInputStream - + } final void unreadByte() { if (pos > 0) { -- GitLab From 205f53aa7ba350b5d1a82192330a36d6feaa4666 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 20 Jul 2014 07:06:54 +0000 Subject: [PATCH 0663/1313] Use the more modern, compact, and flexible Javadoc "{@code ...}" instead of the HTML "...". git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1612046 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/ProxyCreator.java | 4 ++-- src/examples/listclass.java | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/examples/ProxyCreator.java b/src/examples/ProxyCreator.java index 1337531f..94b4e530 100644 --- a/src/examples/ProxyCreator.java +++ b/src/examples/ProxyCreator.java @@ -33,7 +33,7 @@ import org.apache.bcel.generic.PUSH; import org.apache.bcel.generic.Type; /** - * Dynamically creates and uses a proxy for java.awt.event.ActionListener + * Dynamically creates and uses a proxy for {@code java.awt.event.ActionListener} * via the classloader mechanism if called with *
    java org.apache.bcel.util.JavaWrapper ProxyCreator
    * @@ -42,7 +42,7 @@ import org.apache.bcel.generic.Type; * ugly class name, so for many cases it will be more sufficient to * put some clever creation code into the class loader.
    This is * comparable to the mechanism provided via - * java.lang.reflect.Proxy, but much more flexible. + * {@code java.lang.reflect.Proxy}, but much more flexible. * * @version $Id$ * @author M. Dahm diff --git a/src/examples/listclass.java b/src/examples/listclass.java index 6a7c707a..fcab232a 100644 --- a/src/examples/listclass.java +++ b/src/examples/listclass.java @@ -36,27 +36,27 @@ import org.apache.bcel.classfile.Method; *
    java listclass [-constants] [-code] [-brief] [-dependencies] [-nocontents] [-recurse] class... [-exclude ]
    * where *
      - *
    • -code List byte code of methods
    • - *
    • -brief List byte codes briefly
    • - *
    • -constants Print constants table (constant pool)
    • - *
    • -recurse Usually intended to be used along with - * -dependencies When this flag is set, listclass will also print information + *
    • {@code -code} List byte code of methods
    • + *
    • {@code -brief} List byte codes briefly
    • + *
    • {@code -constants} Print constants table (constant pool)
    • + *
    • {@code -recurse} Usually intended to be used along with + * {@code -dependencies} When this flag is set, listclass will also print information * about all classes which the target class depends on.
    • * - *
    • -dependencies Setting this flag makes listclass print a list of all + *
    • {@code -dependencies} Setting this flag makes listclass print a list of all * classes which the target class depends on. Generated from getting all * CONSTANT_Class constants from the constant pool.
    • * - *
    • -exclude All non-flag arguments after this flag are added to an + *
    • {@code -exclude} All non-flag arguments after this flag are added to an * 'exclusion list'. Target classes are compared with the members of the * exclusion list. Any target class whose fully qualified name begins with a * name in the exclusion list will not be analyzed/listed. This is meant - * primarily when using both -recurse to exclude java, javax, and sun classes, - * and is recommended as otherwise the output from -recurse gets quite long and - * most of it is not interesting. Note that -exclude prevents listing of + * primarily when using both {@code -recurse} to exclude java, javax, and sun classes, + * and is recommended as otherwise the output from {@code -recurse} gets quite long and + * most of it is not interesting. Note that {@code -exclude} prevents listing of * classes, it does not prevent class names from being printed in the - * -dependencies list.
    • - *
    • -nocontents Do not print JavaClass.toString() for the class. I added + * {@code -dependencies} list.
    • + *
    • {@code -nocontents} Do not print JavaClass.toString() for the class. I added * this because sometimes I'm only interested in dependency information.
    • *
    *

    Here's a couple examples of how I typically use listclass:
    -- GitLab From b7f5bd690db09f222e36a9a994355f72641056e7 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 25 Jul 2014 19:28:35 +0000 Subject: [PATCH 0664/1313] Update findbugs-maven-plugin to 2.5.5. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1613504 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bac45a6e..b3f03daa 100644 --- a/pom.xml +++ b/pom.xml @@ -286,7 +286,7 @@ org.codehaus.mojo findbugs-maven-plugin - 2.5.4 + 2.5.5 org.codehaus.mojo -- GitLab From 88d0fbb7e6f4d3d2731a0ebab95458ef02fcb538 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 25 Jul 2014 19:29:20 +0000 Subject: [PATCH 0665/1313] Update findbugs-maven-plugin to 2.5.4. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1613505 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b3f03daa..bac45a6e 100644 --- a/pom.xml +++ b/pom.xml @@ -286,7 +286,7 @@ org.codehaus.mojo findbugs-maven-plugin - 2.5.5 + 2.5.4 org.codehaus.mojo -- GitLab From f896e6c9eb751b24de5637ab86731068fa0e2096 Mon Sep 17 00:00:00 2001 From: Mark Emlyn David Thomas Date: Mon, 28 Jul 2014 20:33:34 +0000 Subject: [PATCH 0666/1313] Fix BCEL-177 MethodParameter parameter count is one byte, not two. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1614159 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 4 ++++ .../java/org/apache/bcel/classfile/MethodParameters.java | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index cfb2e637..1b74ae94 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -246,6 +246,10 @@ The type attribute can be add,update,fix,remove. Verification of interfaces with default methods fails with Java 8 + + When reading the number of parameters in a MethodParameters structure + only read a single byte as per the JVM specification. + diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameters.java b/src/main/java/org/apache/bcel/classfile/MethodParameters.java index 6b64d223..2c4303f7 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameters.java +++ b/src/main/java/org/apache/bcel/classfile/MethodParameters.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. */ package org.apache.bcel.classfile; @@ -25,7 +25,7 @@ import org.apache.bcel.Constants; /** * This class represents a MethodParameters attribute. - * + * * @see The class File Format : The MethodParameters Attribute * @since 6.0 */ @@ -39,7 +39,7 @@ public class MethodParameters extends Attribute { super(Constants.ATTR_METHOD_PARAMETERS, name_index, length, constant_pool); System.out.println("new MethodParameters"); - int parameters_count = file.readUnsignedShort(); + int parameters_count = file.readUnsignedByte(); parameters = new MethodParameter[parameters_count]; for (int i = 0; i < parameters_count; i++) { parameters[i] = new MethodParameter(file); -- GitLab From 1c9190cba4ca087a6bb6b0844ce028d4520a9fec Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Mon, 28 Jul 2014 22:57:13 +0000 Subject: [PATCH 0667/1313] Added BCEL-177 to the release notes git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1614210 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 58e7fa9b..f38a5465 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -94,7 +94,7 @@ Bug fixes from 5.2 [BCEL-167] ClassPath.getResource does not correctly perform URL escaping [BCEL-173] ClassParser fails to parse JDK classes in Java 8: ClassFormatException: Invalid byte tag in constant pool [BCEL-174] Verification of interfaces with default methods fails with Java 8 - +[BCEL-177] MethodParameters should read 1 byte not two for parameter count Feedback -------- -- GitLab From 19f2272795cb64aea14bc7e6264baee7b1595d9f Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Fri, 22 Aug 2014 06:09:42 +0000 Subject: [PATCH 0668/1313] Add intellij config folder to svn:ignore git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1619675 13f79535-47bb-0310-9956-ffa450edef68 -- GitLab From c5914f6e47477373bfebb0386757bc0478fcbf16 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Fri, 22 Aug 2014 13:30:36 +0000 Subject: [PATCH 0669/1313] Fix JavaDoc link git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1619801 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/structurals/InstructionContext.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java index abb43ad4..dea83661 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -70,7 +70,7 @@ public interface InstructionContext{ * * @see ControlFlowGraph * @see ExecutionVisitor - * @see #getOutFrame(List) + * @see #getOutFrame(ArrayList) * @return true - if and only if the "outgoing" frame situation * changed from the one before execute()ing. */ -- GitLab From 7968bd632857979c341b804f2e43e28c33a36036 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Sun, 24 Aug 2014 23:40:27 +0000 Subject: [PATCH 0670/1313] Fixed Javadoc errors reported by Java 8 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1620239 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Utility.java | 51 +++++++++++-------- .../java/org/apache/bcel/generic/DCMPG.java | 8 +-- .../java/org/apache/bcel/generic/DCMPL.java | 8 +-- .../java/org/apache/bcel/generic/FCMPG.java | 2 +- .../java/org/apache/bcel/generic/FCMPL.java | 2 +- .../apache/bcel/generic/InstructionList.java | 3 +- .../java/org/apache/bcel/generic/LCMP.java | 4 +- .../java/org/apache/bcel/generic/LLOAD.java | 2 +- .../bcel/generic/TargetLostException.java | 8 +-- .../org/apache/bcel/util/JavaWrapper.java | 10 ++-- .../bcel/verifier/statics/Pass1Verifier.java | 8 +-- .../structurals/ExecutionVisitor.java | 16 +++--- 12 files changed, 63 insertions(+), 59 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 11fe4e50..a5d90594 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -648,18 +648,24 @@ public abstract class Utility { * A returntype signature represents the return value from a method. * It is a series of bytes in the following grammar: * - * ::= | V + *

    +     * <return_signature> ::= <field_type> | V
    +     * 
    * * The character V indicates that the method returns no value. Otherwise, the * signature indicates the type of the return value. * An argument signature represents an argument passed to a method: * - * ::= + *
    +     * <argument_signature> ::= <field_type>
    +     * 
    * * A method signature represents the arguments that the method expects, and * the value that it returns. - * ::= () - * ::= * + *
    +     * <method_signature> ::= (<arguments_signature>) <return_signature>
    +     * <arguments_signature>::= <argument_signature>*
    +     * 
    * * This method converts such a string into a Java type declaration like * `void main(String[])' and throws a `ClassFormatException' when the parsed @@ -772,11 +778,11 @@ public abstract class Utility { * following grammar: * *
    -     *  ::= 
    -     *       ::= ||
    -     *        ::= B|C|D|F|I|J|S|Z
    -     *      ::= L;
    -     *       ::= [
    +     * <field_signature> ::= <field_type>
    +     * <field_type>      ::= <base_type>|<object_type>|<array_type>
    +     * <base_type>       ::= B|C|D|F|I|J|S|Z
    +     * <object_type>     ::= L<fullclassname>;
    +     * <array_type>      ::= [<field_type>
          *
          * The meaning of the base types is as follows:
          * B byte signed byte
    @@ -785,10 +791,10 @@ public abstract class Utility {
          * F float single precision IEEE float
          * I int integer
          * J long long integer
    -     * L; ... an object of the given class
    +     * L<fullclassname>; ... an object of the given class
          * S short signed short
          * Z boolean true or false
    -     * [ ... array
    +     * [<field sig> ... array
          * 
    * * This method converts this string into a Java type declaration such as @@ -1168,16 +1174,18 @@ public abstract class Utility { } - /** Encode byte array it into Java identifier string, i.e., a string + /** + * Encode byte array it into Java identifier string, i.e., a string * that only contains the following characters: (a, ... z, A, ... Z, * 0, ... 9, _, $). The encoding algorithm itself is not too * clever: if the current byte's ASCII value already is a valid Java * identifier part, leave it as it is. Otherwise it writes the - * escape character($) followed by

    • the ASCII value as a - * hexadecimal string, if the value is not in the range - * 200..247
    • a Java identifier char not used in a lowercase - * hexadecimal string, if the value is in the range - * 200..247
      • + * escape character($) followed by: + * + *
          + *
        • the ASCII value as a hexadecimal string, if the value is not in the range 200..247
        • + *
        • a Java identifier char not used in a lowercase hexadecimal string, if the value is in the range 200..247
        • + *
        * *

        This operation inflates the original byte array by roughly 40-50%

        * @@ -1206,7 +1214,8 @@ public abstract class Utility { } - /** Decode a string back to a byte array. + /** + * Decode a string back to a byte array. * * @param s the string to convert * @param uncompress use gzip to uncompress the stream of bytes @@ -1264,7 +1273,8 @@ public abstract class Utility { MAP_CHAR['_'] = j; } - /** Decode characters into bytes. + /** + * Decode characters into bytes. * Used by decode() */ private static class JavaReader extends FilterReader { @@ -1308,7 +1318,8 @@ public abstract class Utility { } } - /** Encode bytes into valid java identifier characters. + /** + * Encode bytes into valid java identifier characters. * Used by encode() */ private static class JavaWriter extends FilterWriter { diff --git a/src/main/java/org/apache/bcel/generic/DCMPG.java b/src/main/java/org/apache/bcel/generic/DCMPG.java index 281a3e41..68dfebc0 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPG.java +++ b/src/main/java/org/apache/bcel/generic/DCMPG.java @@ -18,9 +18,8 @@ package org.apache.bcel.generic; /** - * DCMPG - Compare doubles: value1 > value2 - *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        - * ..., result + * DCMPG - Compare doubles: value1 > value2 + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 -> ..., result
        * * @version $Id$ * @author M. Dahm @@ -29,19 +28,16 @@ public class DCMPG extends Instruction implements TypedInstruction, StackProduce private static final long serialVersionUID = 1929664840821745262L; - public DCMPG() { super(org.apache.bcel.Constants.DCMPG, (short) 1); } - /** @return Type.DOUBLE */ public Type getType( ConstantPoolGen cp ) { return Type.DOUBLE; } - /** * Call corresponding visitor method(s). The order is: * Call visitor methods of implemented interfaces first, then diff --git a/src/main/java/org/apache/bcel/generic/DCMPL.java b/src/main/java/org/apache/bcel/generic/DCMPL.java index 5d70e035..b82a29ab 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPL.java +++ b/src/main/java/org/apache/bcel/generic/DCMPL.java @@ -18,9 +18,8 @@ package org.apache.bcel.generic; /** - * DCMPL - Compare doubles: value1 < value2 - *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        - * ..., result + * DCMPL - Compare doubles: value1 < value2 + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 -> ..., result
        * * @version $Id$ * @author M. Dahm @@ -29,19 +28,16 @@ public class DCMPL extends Instruction implements TypedInstruction, StackProduce private static final long serialVersionUID = 2514357528484232014L; - public DCMPL() { super(org.apache.bcel.Constants.DCMPL, (short) 1); } - /** @return Type.DOUBLE */ public Type getType( ConstantPoolGen cp ) { return Type.DOUBLE; } - /** * Call corresponding visitor method(s). The order is: * Call visitor methods of implemented interfaces first, then diff --git a/src/main/java/org/apache/bcel/generic/FCMPG.java b/src/main/java/org/apache/bcel/generic/FCMPG.java index 84a710c9..75124a4b 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPG.java +++ b/src/main/java/org/apache/bcel/generic/FCMPG.java @@ -18,7 +18,7 @@ package org.apache.bcel.generic; /** - * FCMPG - Compare floats: value1 > value2 + * FCMPG - Compare floats: value1 > value2 *
        Stack: ..., value1, value2 -> ..., result
        * * @version $Id$ diff --git a/src/main/java/org/apache/bcel/generic/FCMPL.java b/src/main/java/org/apache/bcel/generic/FCMPL.java index ae04403f..efdab42d 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPL.java +++ b/src/main/java/org/apache/bcel/generic/FCMPL.java @@ -18,7 +18,7 @@ package org.apache.bcel.generic; /** - * FCMPL - Compare floats: value1 < value2 + * FCMPL - Compare floats: value1 < value2 *
        Stack: ..., value1, value2 -> ..., result
        * * @version $Id$ diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 048b78bb..8129915b 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -1123,8 +1123,7 @@ public class InstructionList implements Serializable { /** * Delete contents of list. Provides besser memory utilization, * because the system then may reuse the instruction handles. This - * method is typically called right after - * MethodGen.getMethod(). + * method is typically called right after {@link MethodGen#getMethod()}. */ public void dispose() { // Traverse in reverse order, because ih.next is overwritten diff --git a/src/main/java/org/apache/bcel/generic/LCMP.java b/src/main/java/org/apache/bcel/generic/LCMP.java index 634c590e..538b53c8 100644 --- a/src/main/java/org/apache/bcel/generic/LCMP.java +++ b/src/main/java/org/apache/bcel/generic/LCMP.java @@ -19,8 +19,8 @@ package org.apache.bcel.generic; /** * LCMP - Compare longs: - *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 ->
        - * ..., result <= -1, 0, 1> + *
        Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 -> ..., result <= -1, 0, 1>
        + * * * @version $Id$ * @author M. Dahm diff --git a/src/main/java/org/apache/bcel/generic/LLOAD.java b/src/main/java/org/apache/bcel/generic/LLOAD.java index fb0e9edb..6f9185c3 100644 --- a/src/main/java/org/apache/bcel/generic/LLOAD.java +++ b/src/main/java/org/apache/bcel/generic/LLOAD.java @@ -19,7 +19,7 @@ package org.apache.bcel.generic; /** * LLOAD - Load long from local variable - *
        Stack ... -> ..., result.word1, result.word2
        + *
        Stack ... -> ..., result.word1, result.word2
        * * @version $Id$ * @author M. Dahm diff --git a/src/main/java/org/apache/bcel/generic/TargetLostException.java b/src/main/java/org/apache/bcel/generic/TargetLostException.java index 131594cb..c19c1125 100644 --- a/src/main/java/org/apache/bcel/generic/TargetLostException.java +++ b/src/main/java/org/apache/bcel/generic/TargetLostException.java @@ -23,9 +23,9 @@ package org.apache.bcel.generic; * InstructionTargeter has to be notified that (one of) the InstructionHandle it * is referencing is being removed from the InstructionList and thus not valid anymore. * - * Making this an exception instead of a return value forces the user to handle + *

        Making this an exception instead of a return value forces the user to handle * these case explicitely in a try { ... } catch. The following code illustrates - * how this may be done: + * how this may be done:

        * *
          *     ...
        @@ -33,10 +33,10 @@ package org.apache.bcel.generic;
          *    il.delete(start_ih, end_ih);
          *     } catch(TargetLostException e) {
          *       InstructionHandle[] targets = e.getTargets();
        - *     for(int i=0; i < targets.length; i++) {
        + *     for(int i=0; i < targets.length; i++) {
          *       InstructionTargeter[] targeters = targets[i].getTargeters();
          *     
        - *       for(int j=0; j < targeters.length; j++)
        + *       for(int j=0; j < targeters.length; j++)
          *         targeters[j].updateTarget(targets[i], new_target);
          *       }
          *     }
        diff --git a/src/main/java/org/apache/bcel/util/JavaWrapper.java b/src/main/java/org/apache/bcel/util/JavaWrapper.java
        index 7e3d8453..833e611c 100644
        --- a/src/main/java/org/apache/bcel/util/JavaWrapper.java
        +++ b/src/main/java/org/apache/bcel/util/JavaWrapper.java
        @@ -24,13 +24,13 @@ import java.lang.reflect.Modifier;
          * Java interpreter replacement, i.e., wrapper that uses its own ClassLoader
          * to modify/generate classes as they're requested. You can take this as a template
          * for your own applications.
        - * Call this wrapper with + * Call this wrapper with: + * *
        java org.apache.bcel.util.JavaWrapper <real.class.name> [arguments]
        - *

        - * To use your own class loader you can set the "bcel.classloader" system property - * which defaults to "org.apache.bcel.util.ClassLoader", e.g., with + * + *

        To use your own class loader you can set the "bcel.classloader" system property + * which defaults to "org.apache.bcel.util.ClassLoader", e.g., with:

        *
        java org.apache.bcel.util.JavaWrapper -Dbcel.classloader=foo.MyLoader <real.class.name> [arguments]
        - *

        * * @version $Id$ * @author M. Dahm diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index 5f93f6f3..0edeb642 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -112,7 +112,7 @@ public final class Pass1Verifier extends PassVerifier{ *
      • All undocumented access flags are masked off before use. Strictly speaking, this is not really a check. *
      • The field this_class should point to a string that represents a legal non-array class name, and this name should be the same as the class file being loaded. *
      • the field super_class should point to a string that represents a legal non-array class name. - *
      • Because some of the above checks require cross referencing the constant pool entries, guards are set up to make sure that the referenced entries are of the right type and the indices are within the legal range (0 < index < constant_pool_count). + *
      • Because some of the above checks require cross referencing the constant pool entries, guards are set up to make sure that the referenced entries are of the right type and the indices are within the legal range (0 < index < constant_pool_count). *
      *
    • Extra checks done in pass 1: *
        @@ -122,12 +122,12 @@ public final class Pass1Verifier extends PassVerifier{ *
      *
    * (From the Paper The Mysterious Pass One, first draft, September 2, 1997.) - *
    - * However, most of this is done by parsing a class file or generating a class file into BCEL's internal data structure. + * + *

    However, most of this is done by parsing a class file or generating a class file into BCEL's internal data structure. * Therefore, all that is really done here is look up the class file from BCEL's repository. * This is also motivated by the fact that some omitted things * (like the check for extra bytes at the end of the class file) are handy when actually using BCEL to repair a class file (otherwise you would not be - * able to load it into BCEL). + * able to load it into BCEL).

    * * @see org.apache.bcel.Repository */ diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index 409242a6..85532668 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -31,7 +31,8 @@ import org.apache.bcel.generic.*; /** * This Visitor class may be used for a type-based Java Virtual Machine * simulation. - * It does not check for correct types on the OperandStack or in the + * + *

    It does not check for correct types on the OperandStack or in the * LocalVariables; nor does it check their sizes are sufficiently big. * Thus, to use this Visitor for bytecode verifying, you have to make sure * externally that the type constraints of the Java Virtual Machine instructions @@ -40,16 +41,17 @@ import org.apache.bcel.generic.*; * visitIADD(IADD o), then there are two stack slots popped and one * stack slot containing a Type.INT is pushed (where you could also * pop only one slot if you know there are two Type.INT on top of the - * stack). Monitor-specific behaviour is not simulated. + * stack). Monitor-specific behaviour is not simulated.

    * - *

    Conventions: + * Conventions: * - * Type.VOID will never be pushed onto the stack. Type.DOUBLE and Type.LONG + *

    Type.VOID will never be pushed onto the stack. Type.DOUBLE and Type.LONG * that would normally take up two stack slots (like Double_HIGH and * Double_LOW) are represented by a simple single Type.DOUBLE or Type.LONG - * object on the stack here. - * If a two-slot type is stored into a local variable, the next variable - * is given the type Type.UNKNOWN. + * object on the stack here.

    + * + *

    If a two-slot type is stored into a local variable, the next variable + * is given the type Type.UNKNOWN.

    * * @version $Id$ * @author Enver Haase -- GitLab From ab6149a3c75a02511879e27f22aef38c8252dc4d Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Mon, 25 Aug 2014 14:54:32 +0000 Subject: [PATCH 0671/1313] Fixed Javadoc errors reported by Java 8 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1620331 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/FieldOrMethod.java | 2 +- .../java/org/apache/bcel/classfile/LineNumber.java | 14 +++++++++----- .../org/apache/bcel/classfile/LineNumberTable.java | 1 - .../java/org/apache/bcel/classfile/Unknown.java | 10 ++++------ .../apache/bcel/generic/InstructionFactory.java | 2 +- .../bcel/generic/LocalVariableInstruction.java | 4 +++- 6 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index 974421da..d8ffd0c5 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -267,7 +267,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No /** * Hunts for a signature attribute on the member and returns its contents. So where the 'regular' signature - * may be (Ljava/util/Vector;)V the signature attribute may in fact say 'Ljava/lang/Vector;' + * may be (Ljava/util/Vector;)V the signature attribute may in fact say 'Ljava/lang/Vector<Ljava/lang/String>;' * Coded for performance - searches for the attribute only when requested - only searches for it once. */ public final String getGenericSignature() diff --git a/src/main/java/org/apache/bcel/classfile/LineNumber.java b/src/main/java/org/apache/bcel/classfile/LineNumber.java index 985ade04..517d6bb8 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumber.java @@ -34,12 +34,17 @@ import java.io.Serializable; public final class LineNumber implements Cloneable, Node, Serializable { private static final long serialVersionUID = 169537400672820016L; - private short start_pc; // Program Counter (PC) corresponds to line - private short line_number; // number in source file - + + /** Program Counter (PC) corresponds to line */ + private short start_pc; + + /** number in source file */ + private short line_number; /** * Initialize from another object. + * + * @param c the object to copy */ public LineNumber(LineNumber c) { this(c.getStartPC(), c.getLineNumber()); @@ -48,8 +53,8 @@ public final class LineNumber implements Cloneable, Node, Serializable { /** * Construct object from file stream. + * * @param file Input stream - * @throws IOException */ LineNumber(DataInput file) throws IOException { this(file.readUnsignedShort(), file.readUnsignedShort()); @@ -82,7 +87,6 @@ public final class LineNumber implements Cloneable, Node, Serializable { * Dump line number/pc pair to file stream in binary format. * * @param file Output file stream - * @throws IOException */ public final void dump( DataOutputStream file ) throws IOException { file.writeShort(start_pc); diff --git a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java index fb70afc9..f3ba8a25 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java @@ -97,7 +97,6 @@ public final class LineNumberTable extends Attribute { * Dump line number table attribute to file stream in binary format. * * @param file Output file stream - * @throws IOException */ @Override public final void dump( DataOutputStream file ) throws IOException { diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index 3e3f1af0..024aa36b 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -27,12 +27,10 @@ import org.apache.bcel.Constants; /** * This class represents a reference to an unknown (i.e., * application-specific) attribute of a class. It is instantiated from the - * Attribute.readAttribute() method. Applications that need to - * read in application-specific attributes should create an AttributeReader implementation and - * attach it via Attribute.addAttributeReader. + * {@link Attribute#readAttribute(java.io.DataInputStream, ConstantPool)} method. + * Applications that need to read in application-specific attributes should create an + * {@link AttributeReader} implementation and attach it via + * {@link Attribute#addAttributeReader(String, AttributeReader)}. * * @version $Id$ diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index 71e799bd..ecde6c22 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -382,7 +382,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali /** * Create binary operation for simple basic types, such as int and float. * - * @param op operation, such as "+", "*", "<<", etc. + * @param op operation, such as "+", "*", "<<", etc. */ public static ArithmeticInstruction createBinaryOperation( String op, Type type ) { char first = op.toCharArray()[0]; diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java index f1b1edba..0b8f75e4 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -117,7 +117,9 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty /** * Read needed data (e.g. index) from file. - * PRE: (ILOAD <= tag <= ALOAD_3) || (ISTORE <= tag <= ASTORE_3) + *
    +     * (ILOAD <= tag <= ALOAD_3) || (ISTORE <= tag <= ASTORE_3)
    +     * 
    */ @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { -- GitLab From 1cfd6599f1fcfd5f00f1d2dbdff41f5b8144f796 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Mon, 25 Aug 2014 21:43:31 +0000 Subject: [PATCH 0672/1313] Harmonized the indentation of the XML files git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1620465 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 28 +++++------------- src/main/assembly/bin.xml | 60 +++++++++++++++++++-------------------- src/main/assembly/src.xml | 40 +++++++++++++------------- src/site/site.xml | 12 ++++---- 4 files changed, 63 insertions(+), 77 deletions(-) diff --git a/pom.xml b/pom.xml index bac45a6e..2a11853e 100644 --- a/pom.xml +++ b/pom.xml @@ -141,25 +141,15 @@ BCEL User List - - user-subscribe@commons.apache.org - - - user-unsubscribe@commons.apache.org - - - http://mail-archives.apache.org/mod_mbox/commons-user/ - + user-subscribe@commons.apache.org + user-unsubscribe@commons.apache.org + http://mail-archives.apache.org/mod_mbox/commons-user/ BCEL Developer List dev-subscribe@commons.apache.org - - dev-unsubscribe@commons.apache.org - - - http://mail-archives.apache.org/mod_mbox/commons-dev/ - + dev-unsubscribe@commons.apache.org + http://mail-archives.apache.org/mod_mbox/commons-dev/ @@ -169,12 +159,8 @@ - - scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk - - - scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk - + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk http://svn.apache.org/repos/asf/commons/proper/bcel/trunk diff --git a/src/main/assembly/bin.xml b/src/main/assembly/bin.xml index c7ea5268..906ed90b 100644 --- a/src/main/assembly/bin.xml +++ b/src/main/assembly/bin.xml @@ -15,34 +15,34 @@ limitations under the License. --> - bin - - tar.gz - zip - - false - - - - LICENSE.txt - NOTICE.txt - README.txt - RELEASE-NOTES.txt - - - - target - - - *.jar - - - - src/examples - - - target/site/apidocs - apidocs - - + bin + + tar.gz + zip + + false + + + + LICENSE.txt + NOTICE.txt + README.txt + RELEASE-NOTES.txt + + + + target + + + *.jar + + + + src/examples + + + target/site/apidocs + apidocs + + diff --git a/src/main/assembly/src.xml b/src/main/assembly/src.xml index c568898a..dc866b5d 100644 --- a/src/main/assembly/src.xml +++ b/src/main/assembly/src.xml @@ -15,24 +15,24 @@ limitations under the License. --> - src - - tar.gz - zip - - ${project.artifactId}-${project.version}-src - - - - LICENSE.txt - NOTICE.txt - pom.xml - README.txt - RELEASE-NOTES.txt - - - - src - - + src + + tar.gz + zip + + ${project.artifactId}-${project.version}-src + + + + LICENSE.txt + NOTICE.txt + pom.xml + README.txt + RELEASE-NOTES.txt + + + + src + + diff --git a/src/site/site.xml b/src/site/site.xml index 032e2dc7..8f77bfbe 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -19,13 +19,13 @@ --> - - Commons BCEL - /images/logo.gif - /index.html - + + Commons BCEL + /images/logo.gif + /index.html + - + -- GitLab From 7cd0d4aab61b014903d78464e21b5477bdb0d83f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 19 Sep 2014 16:04:58 +0000 Subject: [PATCH 0673/1313] Tab police git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1626255 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Mini/README | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/examples/Mini/README b/src/examples/Mini/README index 4afb0f03..beced738 100644 --- a/src/examples/Mini/README +++ b/src/examples/Mini/README @@ -1,28 +1,28 @@ - Mini-Mini tutorial - ------------------ + Mini-Mini tutorial + ------------------ Mini is a very simple (semi-functional) language that I wrote to test the generic package of BCEL. - http://commons.apache.org/bcel/ + http://commons.apache.org/bcel/ Mini uses the JavaCC parser generator which comes precompiled from - http://www.webgain.com/products/java_cc/ + http://www.webgain.com/products/java_cc/ After setting the CLASSPATH to the directory just above the Mini directory, e.g. - % cd Mini - % setenv CLASSPATH $CLASSPATH:.:.. + % cd Mini + % setenv CLASSPATH $CLASSPATH:.:.. try the following: - % java Mini.MiniC max.mini + % java Mini.MiniC max.mini This produces a Java class file (max.class) which you can execute with - % java max + % java max Enter a number (4, eg.) and you will be asked to enter 4 numbers. The program will then tell you the biggest of them. @@ -30,7 +30,7 @@ program will then tell you the biggest of them. Alternatively you can produce a Java file (max.java) which will be translated automatically to a .class file. - % java Mini.MiniC -java max.mini + % java Mini.MiniC -java max.mini There are three examples programs (max.mini, fac.mini, fib.mini) provided which demonstrate the language syntax and should be quite @@ -46,9 +46,9 @@ MiniC.java at line 85 and follow the recursive byte_code() calls. It's also useful to use the listclass program provided with BCEL to examine the generated class. For example - % java listclass max.class + % java listclass max.class Send bug reports and suggestions to - m.dahm@gmx.de (Markus Dahm) + m.dahm@gmx.de (Markus Dahm) -- GitLab From 17ed825dbb7a06129c8e12c2e8c329abf9fa81f0 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 19 Sep 2014 16:13:34 +0000 Subject: [PATCH 0674/1313] Does not need to be package protected as has public getter/setter git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1626257 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/AnnotationDefault.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index 5dc8e842..cf559dc8 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -32,7 +32,8 @@ import org.apache.bcel.Constants; public class AnnotationDefault extends Attribute { private static final long serialVersionUID = -4017327188724019487L; - ElementValue default_value; + + private ElementValue default_value; /** * @param name_index -- GitLab From 3af3bfb0da5cd3b3ee7b8aa8e3bd45a7341831ef Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 19 Sep 2014 16:18:02 +0000 Subject: [PATCH 0675/1313] Immutable private field might as well be final git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1626260 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ClassElementValue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java index 006d86cb..600d6ea2 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java @@ -26,7 +26,7 @@ public class ClassElementValue extends ElementValue // For primitive types and string type, this points to the value entry in // the cpool // For 'class' this points to the class entry in the cpool - private int idx; + private final int idx; public ClassElementValue(int type, int idx, ConstantPool cpool) { -- GitLab From d9ef5c5547039fa416f002ab658228041a6b6e9f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 19 Sep 2014 16:19:42 +0000 Subject: [PATCH 0676/1313] Immutable private field might as well be final git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1626261 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ClassParser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 5e79efe2..1bdc6414 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -45,8 +45,8 @@ import org.apache.bcel.Constants; public final class ClassParser { private DataInputStream file; - private boolean fileOwned; - private String file_name; + private final boolean fileOwned; + private final String file_name; private String zip_file; private int class_name_index, superclass_name_index; private int major, minor; // Compiler version -- GitLab From b9a56a864d5da79d7c20906eb79ab0788a1690f8 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 19 Sep 2014 16:23:04 +0000 Subject: [PATCH 0677/1313] List fields separately git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1626263 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ConstantCP.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/ConstantCP.java b/src/main/java/org/apache/bcel/classfile/ConstantCP.java index 2eb0a072..f82936f3 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantCP.java @@ -37,7 +37,8 @@ public abstract class ConstantCP extends Constant { private static final long serialVersionUID = -6275762995206209402L; /** References to the constants containing the class and the field signature */ - protected int class_index, name_and_type_index; + protected int class_index; + protected int name_and_type_index; /** -- GitLab From c88ee9079baf9f65a43e67b254a073bfed9ce43d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 19 Sep 2014 16:26:51 +0000 Subject: [PATCH 0678/1313] Add some TODOs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1626266 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/AccessFlags.java | 2 +- src/main/java/org/apache/bcel/classfile/Attribute.java | 8 ++++---- src/main/java/org/apache/bcel/classfile/Constant.java | 2 +- src/main/java/org/apache/bcel/classfile/ConstantCP.java | 4 ++-- src/main/java/org/apache/bcel/classfile/ElementValue.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AccessFlags.java b/src/main/java/org/apache/bcel/classfile/AccessFlags.java index 51664ab2..d3da47c4 100644 --- a/src/main/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/main/java/org/apache/bcel/classfile/AccessFlags.java @@ -29,7 +29,7 @@ import org.apache.bcel.Constants; public abstract class AccessFlags implements java.io.Serializable { private static final long serialVersionUID = 2845404654039163061L; - protected int access_flags; + protected int access_flags; // TODO make private (has getter & setter) public AccessFlags() { diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index e9b879a3..9170991b 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -52,13 +52,13 @@ public abstract class Attribute implements Cloneable, Node, Serializable { private static final long serialVersionUID = -1707826820310002955L; - protected int name_index; // Points to attribute name in constant pool + protected int name_index; // Points to attribute name in constant pool TODO make private (has getter & setter) - protected int length; // Content length of attribute field + protected int length; // Content length of attribute field TODO make private (has getter & setter) - protected byte tag; // Tag to distiguish subclasses + protected byte tag; // Tag to distinguish subclasses TODO make private & final; supposed to be immutable - protected ConstantPool constant_pool; + protected ConstantPool constant_pool; // TODO make private (has getter & setter) protected Attribute(byte tag, int name_index, int length, ConstantPool constant_pool) diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index 562756c0..1dbdba0a 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -58,7 +58,7 @@ public abstract class Constant implements Cloneable, Node, Serializable { * need the tag as an index to select the corresponding class name from the * `CONSTANT_NAMES' array. */ - protected byte tag; + protected byte tag; // TODO should be private & final Constant(byte tag) { diff --git a/src/main/java/org/apache/bcel/classfile/ConstantCP.java b/src/main/java/org/apache/bcel/classfile/ConstantCP.java index f82936f3..01cc7f53 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantCP.java @@ -37,8 +37,8 @@ public abstract class ConstantCP extends Constant { private static final long serialVersionUID = -6275762995206209402L; /** References to the constants containing the class and the field signature */ - protected int class_index; - protected int name_and_type_index; + protected int class_index; // TODO make private (has getter & setter) + protected int name_and_type_index; // TODO make private (has getter & setter) /** diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index df2a398b..8876a303 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -28,9 +28,9 @@ import java.io.IOException; */ public abstract class ElementValue { - protected int type; + protected int type; // TODO should be final - protected ConstantPool cpool; + protected ConstantPool cpool; // TODO should be final @Override public String toString() -- GitLab From 3b451047534be7ab6e101272c4b649dd73a94088 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 19 Sep 2014 16:30:20 +0000 Subject: [PATCH 0679/1313] Add missing files git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1626268 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/assembly/src.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/assembly/src.xml b/src/main/assembly/src.xml index dc866b5d..bd874a8f 100644 --- a/src/main/assembly/src.xml +++ b/src/main/assembly/src.xml @@ -24,8 +24,10 @@ + checkstyle.xml LICENSE.txt NOTICE.txt + pmd.xml pom.xml README.txt RELEASE-NOTES.txt @@ -34,5 +36,8 @@ src + + docs + -- GitLab From 2d421fb00dd746af71d319cb6f4c1cb4696111bd Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 26 Sep 2014 20:08:23 +0000 Subject: [PATCH 0680/1313] Configure the findbugs plugin to generate a report in English git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1627871 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index 2a11853e..33f67085 100644 --- a/pom.xml +++ b/pom.xml @@ -273,6 +273,10 @@ org.codehaus.mojo findbugs-maven-plugin 2.5.4 + + true + -Duser.language=en +
    org.codehaus.mojo -- GitLab From 4b3e9fc78c26b89b0bfb020b5c788efbc2fd6e45 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 26 Sep 2014 22:09:06 +0000 Subject: [PATCH 0681/1313] Added LICENSE-header.txt in the source archive git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1627901 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/assembly/src.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/assembly/src.xml b/src/main/assembly/src.xml index bd874a8f..cb0d7c32 100644 --- a/src/main/assembly/src.xml +++ b/src/main/assembly/src.xml @@ -26,6 +26,7 @@ checkstyle.xml LICENSE.txt + LICENSE-header.txt NOTICE.txt pmd.xml pom.xml -- GitLab From 72db2aafc72c0383228d7e055ea7a33c5b01c724 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 26 Sep 2014 22:41:39 +0000 Subject: [PATCH 0682/1313] Fixed the checkstyle errors related to the license headers git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1627906 13f79535-47bb-0310-9956-ffa450edef68 --- LICENSE-header.txt | 31 +++++++++---------- checkstyle.xml | 2 +- docs/verifier/GNUmakefile | 2 +- docs/verifier/JustIce.lyx | 2 +- src/examples/HelloWorldBuilder.java | 2 +- src/examples/JasminVisitor.java | 2 +- src/examples/Mini/ASCII_CharStream.java | 2 +- src/examples/Mini/ASTExpr.java | 2 +- src/examples/Mini/ASTFactor.java | 2 +- src/examples/Mini/ASTFunAppl.java | 2 +- src/examples/Mini/ASTFunDecl.java | 2 +- src/examples/Mini/ASTIdent.java | 2 +- src/examples/Mini/ASTIfExpr.java | 2 +- src/examples/Mini/ASTInteger.java | 2 +- src/examples/Mini/ASTLetExpr.java | 2 +- src/examples/Mini/ASTProgram.java | 2 +- src/examples/Mini/ASTTerm.java | 2 +- src/examples/Mini/EnvEntry.java | 2 +- src/examples/Mini/Environment.java | 2 +- src/examples/Mini/Function.java | 2 +- src/examples/Mini/JJTMiniParserState.java | 2 +- src/examples/Mini/Mini.jjt | 2 +- src/examples/Mini/MiniC.java | 2 +- src/examples/Mini/MiniParser.java | 2 +- src/examples/Mini/MiniParserConstants.java | 2 +- src/examples/Mini/MiniParserTokenManager.java | 2 +- .../Mini/MiniParserTreeConstants.java | 2 +- src/examples/Mini/Node.java | 2 +- src/examples/Mini/ParseException.java | 2 +- src/examples/Mini/SimpleNode.java | 2 +- src/examples/Mini/Token.java | 2 +- src/examples/Mini/TokenMgrError.java | 2 +- src/examples/Mini/Variable.java | 2 +- src/examples/Package.java | 2 +- src/examples/Peephole.java | 2 +- src/examples/ProxyCreator.java | 2 +- src/examples/TransitiveHull.java | 2 +- src/examples/helloify.java | 2 +- src/examples/id.java | 2 +- src/examples/listclass.java | 2 +- src/examples/maxstack.java | 2 +- src/examples/patchclass.java | 2 +- .../org/apache/bcel/ExceptionConstants.java | 2 +- src/main/java/org/apache/bcel/Repository.java | 2 +- .../bcel/classfile/BootstrapMethod.java | 2 +- .../bcel/classfile/BootstrapMethods.java | 2 +- .../apache/bcel/classfile/ConstantUtf8.java | 2 +- .../apache/bcel/classfile/ConstantValue.java | 2 +- .../org/apache/bcel/classfile/Deprecated.java | 2 +- .../bcel/classfile/DescendingVisitor.java | 2 +- .../apache/bcel/classfile/EmptyVisitor.java | 2 +- .../apache/bcel/classfile/ExceptionTable.java | 2 +- .../java/org/apache/bcel/classfile/Field.java | 2 +- .../apache/bcel/classfile/FieldOrMethod.java | 2 +- .../org/apache/bcel/classfile/InnerClass.java | 2 +- .../apache/bcel/classfile/InnerClasses.java | 2 +- .../org/apache/bcel/classfile/JavaClass.java | 2 +- .../org/apache/bcel/classfile/LineNumber.java | 2 +- .../bcel/classfile/LineNumberTable.java | 2 +- .../apache/bcel/classfile/LocalVariable.java | 2 +- .../bcel/classfile/LocalVariableTable.java | 2 +- .../org/apache/bcel/classfile/Method.java | 2 +- .../bcel/classfile/MethodParameter.java | 2 +- .../java/org/apache/bcel/classfile/Node.java | 2 +- .../org/apache/bcel/classfile/PMGClass.java | 2 +- .../RuntimeInvisibleAnnotations.java | 2 +- .../RuntimeInvisibleParameterAnnotations.java | 2 +- .../classfile/RuntimeVisibleAnnotations.java | 2 +- .../RuntimeVisibleParameterAnnotations.java | 2 +- .../org/apache/bcel/classfile/Signature.java | 2 +- .../org/apache/bcel/classfile/SourceFile.java | 2 +- .../org/apache/bcel/classfile/StackMap.java | 2 +- .../apache/bcel/classfile/StackMapEntry.java | 2 +- .../apache/bcel/classfile/StackMapTable.java | 2 +- .../bcel/classfile/StackMapTableEntry.java | 2 +- .../apache/bcel/classfile/StackMapType.java | 2 +- .../org/apache/bcel/classfile/Synthetic.java | 2 +- .../org/apache/bcel/classfile/Unknown.java | 2 +- .../org/apache/bcel/classfile/Utility.java | 2 +- .../org/apache/bcel/classfile/Visitor.java | 2 +- .../java/org/apache/bcel/generic/AALOAD.java | 2 +- .../java/org/apache/bcel/generic/AASTORE.java | 2 +- .../org/apache/bcel/generic/ACONST_NULL.java | 2 +- .../java/org/apache/bcel/generic/ALOAD.java | 2 +- .../org/apache/bcel/generic/ANEWARRAY.java | 2 +- .../java/org/apache/bcel/generic/ARETURN.java | 2 +- .../org/apache/bcel/generic/ARRAYLENGTH.java | 2 +- .../java/org/apache/bcel/generic/ASTORE.java | 2 +- .../java/org/apache/bcel/generic/ATHROW.java | 2 +- .../bcel/generic/AllocationInstruction.java | 2 +- .../generic/AnnotationElementValueGen.java | 2 +- .../bcel/generic/AnnotationEntryGen.java | 2 +- .../bcel/generic/ArithmeticInstruction.java | 2 +- .../bcel/generic/ArrayElementValueGen.java | 2 +- .../apache/bcel/generic/ArrayInstruction.java | 2 +- .../org/apache/bcel/generic/ArrayType.java | 2 +- .../java/org/apache/bcel/generic/BALOAD.java | 2 +- .../java/org/apache/bcel/generic/BASTORE.java | 2 +- .../java/org/apache/bcel/generic/BIPUSH.java | 2 +- .../org/apache/bcel/generic/BREAKPOINT.java | 2 +- .../org/apache/bcel/generic/BasicType.java | 2 +- .../org/apache/bcel/generic/BranchHandle.java | 2 +- .../bcel/generic/BranchInstruction.java | 2 +- .../java/org/apache/bcel/generic/CALOAD.java | 2 +- .../java/org/apache/bcel/generic/CASTORE.java | 2 +- .../org/apache/bcel/generic/CHECKCAST.java | 2 +- .../apache/bcel/generic/CPInstruction.java | 2 +- .../bcel/generic/ClassElementValueGen.java | 2 +- .../org/apache/bcel/generic/ClassGen.java | 2 +- .../bcel/generic/ClassGenException.java | 2 +- .../apache/bcel/generic/ClassObserver.java | 2 +- .../apache/bcel/generic/CodeExceptionGen.java | 2 +- .../bcel/generic/CompoundInstruction.java | 2 +- .../apache/bcel/generic/ConstantPoolGen.java | 2 +- .../bcel/generic/ConstantPushInstruction.java | 2 +- .../bcel/generic/ConversionInstruction.java | 2 +- .../java/org/apache/bcel/generic/D2F.java | 2 +- .../java/org/apache/bcel/generic/D2I.java | 2 +- .../java/org/apache/bcel/generic/D2L.java | 2 +- .../java/org/apache/bcel/generic/DADD.java | 2 +- .../java/org/apache/bcel/generic/DALOAD.java | 2 +- .../java/org/apache/bcel/generic/DASTORE.java | 2 +- .../java/org/apache/bcel/generic/DCMPG.java | 2 +- .../java/org/apache/bcel/generic/DCMPL.java | 2 +- .../java/org/apache/bcel/generic/DCONST.java | 2 +- .../java/org/apache/bcel/generic/DDIV.java | 2 +- .../java/org/apache/bcel/generic/DLOAD.java | 2 +- .../java/org/apache/bcel/generic/DMUL.java | 2 +- .../java/org/apache/bcel/generic/DNEG.java | 2 +- .../java/org/apache/bcel/generic/DREM.java | 2 +- .../java/org/apache/bcel/generic/DRETURN.java | 2 +- .../java/org/apache/bcel/generic/DSTORE.java | 2 +- .../java/org/apache/bcel/generic/DSUB.java | 2 +- .../java/org/apache/bcel/generic/DUP.java | 2 +- .../java/org/apache/bcel/generic/DUP2.java | 2 +- .../java/org/apache/bcel/generic/DUP2_X1.java | 2 +- .../java/org/apache/bcel/generic/DUP2_X2.java | 2 +- .../java/org/apache/bcel/generic/DUP_X1.java | 2 +- .../java/org/apache/bcel/generic/DUP_X2.java | 2 +- .../apache/bcel/generic/ElementValueGen.java | 2 +- .../bcel/generic/ElementValuePairGen.java | 2 +- .../org/apache/bcel/generic/EmptyVisitor.java | 2 +- .../bcel/generic/EnumElementValueGen.java | 2 +- .../apache/bcel/generic/ExceptionThrower.java | 2 +- .../java/org/apache/bcel/generic/F2D.java | 2 +- .../java/org/apache/bcel/generic/F2I.java | 2 +- .../java/org/apache/bcel/generic/F2L.java | 2 +- .../java/org/apache/bcel/generic/FADD.java | 2 +- .../java/org/apache/bcel/generic/FALOAD.java | 2 +- .../java/org/apache/bcel/generic/FASTORE.java | 2 +- .../java/org/apache/bcel/generic/FCMPG.java | 2 +- .../java/org/apache/bcel/generic/FCMPL.java | 2 +- .../java/org/apache/bcel/generic/FCONST.java | 2 +- .../java/org/apache/bcel/generic/FDIV.java | 2 +- .../java/org/apache/bcel/generic/FLOAD.java | 2 +- .../java/org/apache/bcel/generic/FMUL.java | 2 +- .../java/org/apache/bcel/generic/FNEG.java | 2 +- .../java/org/apache/bcel/generic/FREM.java | 2 +- .../java/org/apache/bcel/generic/FRETURN.java | 2 +- .../java/org/apache/bcel/generic/FSTORE.java | 2 +- .../java/org/apache/bcel/generic/FSUB.java | 2 +- .../org/apache/bcel/generic/FieldGen.java | 2 +- .../bcel/generic/FieldGenOrMethodGen.java | 2 +- .../apache/bcel/generic/FieldInstruction.java | 2 +- .../apache/bcel/generic/FieldObserver.java | 2 +- .../apache/bcel/generic/FieldOrMethod.java | 2 +- .../org/apache/bcel/generic/GETFIELD.java | 2 +- .../org/apache/bcel/generic/GETSTATIC.java | 2 +- .../java/org/apache/bcel/generic/GOTO.java | 2 +- .../java/org/apache/bcel/generic/GOTO_W.java | 2 +- .../apache/bcel/generic/GotoInstruction.java | 2 +- .../java/org/apache/bcel/generic/I2B.java | 2 +- .../java/org/apache/bcel/generic/I2C.java | 2 +- .../java/org/apache/bcel/generic/I2D.java | 2 +- .../java/org/apache/bcel/generic/I2F.java | 2 +- .../java/org/apache/bcel/generic/I2L.java | 2 +- .../java/org/apache/bcel/generic/I2S.java | 2 +- .../java/org/apache/bcel/generic/IADD.java | 2 +- .../java/org/apache/bcel/generic/IALOAD.java | 2 +- .../java/org/apache/bcel/generic/IAND.java | 2 +- .../java/org/apache/bcel/generic/IASTORE.java | 2 +- .../java/org/apache/bcel/generic/ICONST.java | 2 +- .../java/org/apache/bcel/generic/IDIV.java | 2 +- .../java/org/apache/bcel/generic/IFEQ.java | 2 +- .../java/org/apache/bcel/generic/IFGE.java | 2 +- .../java/org/apache/bcel/generic/IFGT.java | 2 +- .../java/org/apache/bcel/generic/IFLE.java | 2 +- .../java/org/apache/bcel/generic/IFLT.java | 2 +- .../java/org/apache/bcel/generic/IFNE.java | 2 +- .../org/apache/bcel/generic/IFNONNULL.java | 2 +- .../java/org/apache/bcel/generic/IFNULL.java | 2 +- .../org/apache/bcel/generic/IF_ACMPEQ.java | 2 +- .../org/apache/bcel/generic/IF_ACMPNE.java | 2 +- .../org/apache/bcel/generic/IF_ICMPEQ.java | 2 +- .../org/apache/bcel/generic/IF_ICMPGE.java | 2 +- .../org/apache/bcel/generic/IF_ICMPGT.java | 2 +- .../org/apache/bcel/generic/IF_ICMPLE.java | 2 +- .../org/apache/bcel/generic/IF_ICMPLT.java | 2 +- .../org/apache/bcel/generic/IF_ICMPNE.java | 2 +- .../java/org/apache/bcel/generic/IINC.java | 2 +- .../java/org/apache/bcel/generic/ILOAD.java | 2 +- .../java/org/apache/bcel/generic/IMPDEP1.java | 2 +- .../java/org/apache/bcel/generic/IMPDEP2.java | 2 +- .../java/org/apache/bcel/generic/IMUL.java | 2 +- .../java/org/apache/bcel/generic/INEG.java | 2 +- .../org/apache/bcel/generic/INSTANCEOF.java | 2 +- .../apache/bcel/generic/INVOKEDYNAMIC.java | 2 +- .../apache/bcel/generic/INVOKEINTERFACE.java | 2 +- .../apache/bcel/generic/INVOKESPECIAL.java | 2 +- .../org/apache/bcel/generic/INVOKESTATIC.java | 2 +- .../apache/bcel/generic/INVOKEVIRTUAL.java | 2 +- .../java/org/apache/bcel/generic/IOR.java | 2 +- .../java/org/apache/bcel/generic/IREM.java | 2 +- .../java/org/apache/bcel/generic/IRETURN.java | 2 +- .../java/org/apache/bcel/generic/ISHL.java | 2 +- .../java/org/apache/bcel/generic/ISHR.java | 2 +- .../java/org/apache/bcel/generic/ISTORE.java | 2 +- .../java/org/apache/bcel/generic/ISUB.java | 2 +- .../java/org/apache/bcel/generic/IUSHR.java | 2 +- .../java/org/apache/bcel/generic/IXOR.java | 2 +- .../apache/bcel/generic/IfInstruction.java | 2 +- .../bcel/generic/IndexedInstruction.java | 2 +- .../org/apache/bcel/generic/Instruction.java | 2 +- .../bcel/generic/InstructionComparator.java | 2 +- .../bcel/generic/InstructionConstants.java | 2 +- .../bcel/generic/InstructionFactory.java | 2 +- .../bcel/generic/InstructionHandle.java | 2 +- .../apache/bcel/generic/InstructionList.java | 2 +- .../bcel/generic/InstructionListObserver.java | 2 +- .../bcel/generic/InstructionTargeter.java | 2 +- .../bcel/generic/InvokeInstruction.java | 2 +- .../java/org/apache/bcel/generic/JSR.java | 2 +- .../java/org/apache/bcel/generic/JSR_W.java | 2 +- .../apache/bcel/generic/JsrInstruction.java | 2 +- .../java/org/apache/bcel/generic/L2D.java | 2 +- .../java/org/apache/bcel/generic/L2F.java | 2 +- .../java/org/apache/bcel/generic/L2I.java | 2 +- .../java/org/apache/bcel/generic/LADD.java | 2 +- .../java/org/apache/bcel/generic/LALOAD.java | 2 +- .../java/org/apache/bcel/generic/LAND.java | 2 +- .../java/org/apache/bcel/generic/LASTORE.java | 2 +- .../java/org/apache/bcel/generic/LCMP.java | 2 +- .../java/org/apache/bcel/generic/LCONST.java | 2 +- .../java/org/apache/bcel/generic/LDC.java | 2 +- .../java/org/apache/bcel/generic/LDC2_W.java | 2 +- .../java/org/apache/bcel/generic/LDC_W.java | 2 +- .../java/org/apache/bcel/generic/LDIV.java | 2 +- .../java/org/apache/bcel/generic/LLOAD.java | 2 +- .../java/org/apache/bcel/generic/LMUL.java | 2 +- .../java/org/apache/bcel/generic/LNEG.java | 2 +- .../org/apache/bcel/generic/LOOKUPSWITCH.java | 2 +- .../java/org/apache/bcel/generic/LOR.java | 2 +- .../java/org/apache/bcel/generic/LREM.java | 2 +- .../java/org/apache/bcel/generic/LRETURN.java | 2 +- .../java/org/apache/bcel/generic/LSHL.java | 2 +- .../java/org/apache/bcel/generic/LSHR.java | 2 +- .../java/org/apache/bcel/generic/LSTORE.java | 2 +- .../java/org/apache/bcel/generic/LSUB.java | 2 +- .../java/org/apache/bcel/generic/LUSHR.java | 2 +- .../java/org/apache/bcel/generic/LXOR.java | 2 +- .../apache/bcel/generic/LineNumberGen.java | 2 +- .../org/apache/bcel/generic/LoadClass.java | 2 +- .../apache/bcel/generic/LoadInstruction.java | 2 +- .../apache/bcel/generic/LocalVariableGen.java | 2 +- .../generic/LocalVariableInstruction.java | 2 +- .../org/apache/bcel/generic/MONITORENTER.java | 2 +- .../org/apache/bcel/generic/MONITOREXIT.java | 2 +- .../apache/bcel/generic/MULTIANEWARRAY.java | 2 +- .../org/apache/bcel/generic/MethodGen.java | 2 +- .../apache/bcel/generic/MethodObserver.java | 2 +- .../java/org/apache/bcel/generic/NEW.java | 2 +- .../org/apache/bcel/generic/NEWARRAY.java | 2 +- .../java/org/apache/bcel/generic/NOP.java | 2 +- .../generic/NameSignatureInstruction.java | 2 +- .../apache/bcel/generic/NamedAndTyped.java | 2 +- .../org/apache/bcel/generic/ObjectType.java | 2 +- .../java/org/apache/bcel/generic/POP.java | 2 +- .../java/org/apache/bcel/generic/POP2.java | 2 +- .../java/org/apache/bcel/generic/PUSH.java | 2 +- .../org/apache/bcel/generic/PUTFIELD.java | 2 +- .../org/apache/bcel/generic/PUTSTATIC.java | 2 +- .../apache/bcel/generic/PopInstruction.java | 2 +- .../apache/bcel/generic/PushInstruction.java | 2 +- .../java/org/apache/bcel/generic/RET.java | 2 +- .../java/org/apache/bcel/generic/RETURN.java | 2 +- .../apache/bcel/generic/ReferenceType.java | 2 +- .../bcel/generic/ReturnInstruction.java | 2 +- .../bcel/generic/ReturnaddressType.java | 2 +- .../java/org/apache/bcel/generic/SALOAD.java | 2 +- .../java/org/apache/bcel/generic/SASTORE.java | 2 +- .../java/org/apache/bcel/generic/SIPUSH.java | 2 +- .../java/org/apache/bcel/generic/SWAP.java | 2 +- .../java/org/apache/bcel/generic/SWITCH.java | 2 +- .../java/org/apache/bcel/generic/Select.java | 2 +- .../bcel/generic/SimpleElementValueGen.java | 2 +- .../apache/bcel/generic/StackConsumer.java | 2 +- .../apache/bcel/generic/StackInstruction.java | 2 +- .../apache/bcel/generic/StackProducer.java | 2 +- .../apache/bcel/generic/StoreInstruction.java | 2 +- .../org/apache/bcel/generic/TABLESWITCH.java | 2 +- .../bcel/generic/TargetLostException.java | 2 +- .../java/org/apache/bcel/generic/Type.java | 2 +- .../apache/bcel/generic/TypedInstruction.java | 2 +- .../bcel/generic/UnconditionalBranch.java | 2 +- .../generic/VariableLengthInstruction.java | 2 +- .../java/org/apache/bcel/generic/Visitor.java | 2 +- .../org/apache/bcel/util/AttributeHTML.java | 2 +- .../org/apache/bcel/util/BCELComparator.java | 2 +- .../org/apache/bcel/util/BCELFactory.java | 2 +- .../java/org/apache/bcel/util/BCELifier.java | 2 +- .../org/apache/bcel/util/ByteSequence.java | 2 +- .../java/org/apache/bcel/util/Class2HTML.java | 2 +- .../org/apache/bcel/util/ClassLoader.java | 2 +- .../bcel/util/ClassLoaderRepository.java | 2 +- .../java/org/apache/bcel/util/ClassPath.java | 2 +- .../java/org/apache/bcel/util/ClassQueue.java | 2 +- .../java/org/apache/bcel/util/ClassSet.java | 2 +- .../java/org/apache/bcel/util/ClassStack.java | 2 +- .../org/apache/bcel/util/ClassVector.java | 2 +- .../java/org/apache/bcel/util/CodeHTML.java | 2 +- .../org/apache/bcel/util/ConstantHTML.java | 2 +- .../apache/bcel/util/InstructionFinder.java | 2 +- .../org/apache/bcel/util/JavaWrapper.java | 2 +- .../java/org/apache/bcel/util/MethodHTML.java | 2 +- .../java/org/apache/bcel/util/Repository.java | 2 +- .../apache/bcel/util/SyntheticRepository.java | 2 +- .../bcel/verifier/GraphicalVerifier.java | 2 +- .../apache/bcel/verifier/NativeVerifier.java | 2 +- .../apache/bcel/verifier/PassVerifier.java | 2 +- .../apache/bcel/verifier/TransitiveHull.java | 2 +- .../bcel/verifier/VerificationResult.java | 2 +- .../org/apache/bcel/verifier/Verifier.java | 2 +- .../bcel/verifier/VerifierAppFrame.java | 2 +- .../apache/bcel/verifier/VerifierFactory.java | 2 +- .../verifier/VerifierFactoryListModel.java | 2 +- .../verifier/VerifierFactoryObserver.java | 2 +- .../apache/bcel/verifier/VerifyDialog.java | 15 ++++----- .../exc/AssertionViolatedException.java | 2 +- .../exc/ClassConstraintException.java | 2 +- .../verifier/exc/CodeConstraintException.java | 2 +- .../verifier/exc/InvalidMethodException.java | 2 +- .../exc/LinkingConstraintException.java | 2 +- .../bcel/verifier/exc/LoadingException.java | 2 +- ...ocalVariableInfoInconsistentException.java | 2 +- .../exc/StaticCodeConstraintException.java | 2 +- ...ticCodeInstructionConstraintException.java | 2 +- ...InstructionOperandConstraintException.java | 2 +- .../StructuralCodeConstraintException.java | 2 +- .../org/apache/bcel/verifier/exc/Utility.java | 2 +- .../verifier/exc/VerificationException.java | 2 +- .../VerifierConstraintViolatedException.java | 2 +- .../bcel/verifier/statics/DOUBLE_Upper.java | 2 +- .../apache/bcel/verifier/statics/IntList.java | 2 +- .../bcel/verifier/statics/LONG_Upper.java | 2 +- .../verifier/statics/LocalVariableInfo.java | 2 +- .../verifier/statics/LocalVariablesInfo.java | 2 +- .../bcel/verifier/statics/Pass1Verifier.java | 2 +- .../bcel/verifier/statics/Pass2Verifier.java | 2 +- .../bcel/verifier/statics/Pass3aVerifier.java | 2 +- .../statics/StringRepresentation.java | 2 +- .../structurals/ControlFlowGraph.java | 2 +- .../structurals/ExceptionHandler.java | 2 +- .../structurals/ExceptionHandlers.java | 2 +- .../structurals/ExecutionVisitor.java | 2 +- .../bcel/verifier/structurals/Frame.java | 2 +- .../verifier/structurals/GenericArray.java | 2 +- .../structurals/InstConstraintVisitor.java | 2 +- .../structurals/InstructionContext.java | 2 +- .../verifier/structurals/LocalVariables.java | 2 +- .../verifier/structurals/OperandStack.java | 2 +- .../verifier/structurals/Pass3bVerifier.java | 2 +- .../bcel/verifier/structurals/Subroutine.java | 2 +- .../verifier/structurals/Subroutines.java | 2 +- .../structurals/UninitializedObjectType.java | 2 +- 374 files changed, 395 insertions(+), 395 deletions(-) diff --git a/LICENSE-header.txt b/LICENSE-header.txt index ae6f28c4..649b1ab6 100644 --- a/LICENSE-header.txt +++ b/LICENSE-header.txt @@ -1,16 +1,15 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +^/\*\*?\s*$ +^ \*\s*Licensed to the Apache Software Foundation \(ASF\) under one or more\s*$ +^ \*\s*contributor license agreements. See the NOTICE file distributed with\s*$ +^ \*\s*this work for additional information regarding copyright ownership.\s*$ +^ \*\s*The ASF licenses this file to You under the Apache License, Version 2.0\s*$ +^ \*\s*\(the \"License\"\); you may not use this file except in compliance with\s*$ +^ \*\s*the License. You may obtain a copy of the License at\s*$ +^ \*\s*$ +^ \*\s+http://www\.apache\.org/licenses/LICENSE-2\.0\s*$ +^ \*\s*$ +^ \*\s*Unless required by applicable law or agreed to in writing, software\s*$ +^ \*\s*distributed under the License is distributed on an "AS IS" BASIS,\s*$ +^ \*\s*WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\s*$ +^ \*\s*See the License for the specific language governing permissions and\s*$ +^ \*\s*limitations under the License.\s*$ \ No newline at end of file diff --git a/checkstyle.xml b/checkstyle.xml index 89cd3898..5a3135f0 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -29,7 +29,7 @@ limitations under the License. - + diff --git a/docs/verifier/GNUmakefile b/docs/verifier/GNUmakefile index 0348d6ca..a2af064b 100644 --- a/docs/verifier/GNUmakefile +++ b/docs/verifier/GNUmakefile @@ -14,7 +14,7 @@ # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and -# limitations under the License. +# limitations under the License. # # $Id$ diff --git a/docs/verifier/JustIce.lyx b/docs/verifier/JustIce.lyx index 45d87c3b..aaf1e0c2 100644 --- a/docs/verifier/JustIce.lyx +++ b/docs/verifier/JustIce.lyx @@ -13,7 +13,7 @@ # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and -# limitations under the License. +# limitations under the License. \lyxformat 218 \textclass scrbook diff --git a/src/examples/HelloWorldBuilder.java b/src/examples/HelloWorldBuilder.java index 93753832..9c25d0c2 100644 --- a/src/examples/HelloWorldBuilder.java +++ b/src/examples/HelloWorldBuilder.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ import org.apache.bcel.Constants; diff --git a/src/examples/JasminVisitor.java b/src/examples/JasminVisitor.java index 63c6a980..189cb0a6 100644 --- a/src/examples/JasminVisitor.java +++ b/src/examples/JasminVisitor.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ import java.io.File; diff --git a/src/examples/Mini/ASCII_CharStream.java b/src/examples/Mini/ASCII_CharStream.java index c7e3d455..33ae2d3b 100644 --- a/src/examples/Mini/ASCII_CharStream.java +++ b/src/examples/Mini/ASCII_CharStream.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JavaCC: Do not edit this line. ASCII_CharStream.java Version 0.7pre6 */ diff --git a/src/examples/Mini/ASTExpr.java b/src/examples/Mini/ASTExpr.java index e1d401be..7388d869 100644 --- a/src/examples/Mini/ASTExpr.java +++ b/src/examples/Mini/ASTExpr.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. ASTExpr.java */ diff --git a/src/examples/Mini/ASTFactor.java b/src/examples/Mini/ASTFactor.java index da250d1c..b6325d56 100644 --- a/src/examples/Mini/ASTFactor.java +++ b/src/examples/Mini/ASTFactor.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. ASTFactor.java */ diff --git a/src/examples/Mini/ASTFunAppl.java b/src/examples/Mini/ASTFunAppl.java index 9cf7b1de..1249c799 100644 --- a/src/examples/Mini/ASTFunAppl.java +++ b/src/examples/Mini/ASTFunAppl.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. ASTFunAppl.java */ diff --git a/src/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java index 679825d3..e5e9a7df 100644 --- a/src/examples/Mini/ASTFunDecl.java +++ b/src/examples/Mini/ASTFunDecl.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. ASTFunDecl.java */ diff --git a/src/examples/Mini/ASTIdent.java b/src/examples/Mini/ASTIdent.java index 5fb76977..95b3fbd3 100644 --- a/src/examples/Mini/ASTIdent.java +++ b/src/examples/Mini/ASTIdent.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. ASTIdent.java */ diff --git a/src/examples/Mini/ASTIfExpr.java b/src/examples/Mini/ASTIfExpr.java index 02c71b03..8c7308f1 100644 --- a/src/examples/Mini/ASTIfExpr.java +++ b/src/examples/Mini/ASTIfExpr.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. ASTIfExpr.java */ diff --git a/src/examples/Mini/ASTInteger.java b/src/examples/Mini/ASTInteger.java index 0e30d4a6..c086b92a 100644 --- a/src/examples/Mini/ASTInteger.java +++ b/src/examples/Mini/ASTInteger.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. ASTInteger.java */ diff --git a/src/examples/Mini/ASTLetExpr.java b/src/examples/Mini/ASTLetExpr.java index 25f71226..72ef3366 100644 --- a/src/examples/Mini/ASTLetExpr.java +++ b/src/examples/Mini/ASTLetExpr.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. ASTLetExpr.java */ diff --git a/src/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java index b6d240fb..65aa17a6 100644 --- a/src/examples/Mini/ASTProgram.java +++ b/src/examples/Mini/ASTProgram.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. ASTProgram.java */ diff --git a/src/examples/Mini/ASTTerm.java b/src/examples/Mini/ASTTerm.java index ac4e637d..134d1207 100644 --- a/src/examples/Mini/ASTTerm.java +++ b/src/examples/Mini/ASTTerm.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. ASTTerm.java */ diff --git a/src/examples/Mini/EnvEntry.java b/src/examples/Mini/EnvEntry.java index 05121d09..4e0e51bb 100644 --- a/src/examples/Mini/EnvEntry.java +++ b/src/examples/Mini/EnvEntry.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package Mini; diff --git a/src/examples/Mini/Environment.java b/src/examples/Mini/Environment.java index 23766f38..ffa310bc 100644 --- a/src/examples/Mini/Environment.java +++ b/src/examples/Mini/Environment.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package Mini; diff --git a/src/examples/Mini/Function.java b/src/examples/Mini/Function.java index e2c8e0ca..0ceafbcf 100644 --- a/src/examples/Mini/Function.java +++ b/src/examples/Mini/Function.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package Mini; diff --git a/src/examples/Mini/JJTMiniParserState.java b/src/examples/Mini/JJTMiniParserState.java index 409f7dda..aaf39f64 100644 --- a/src/examples/Mini/JJTMiniParserState.java +++ b/src/examples/Mini/JJTMiniParserState.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. JJTMiniParserState.java */ diff --git a/src/examples/Mini/Mini.jjt b/src/examples/Mini/Mini.jjt index 04bdbe34..79665b94 100644 --- a/src/examples/Mini/Mini.jjt +++ b/src/examples/Mini/Mini.jjt @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. */ options { diff --git a/src/examples/Mini/MiniC.java b/src/examples/Mini/MiniC.java index 1d3e8abb..0bcd0f01 100644 --- a/src/examples/Mini/MiniC.java +++ b/src/examples/Mini/MiniC.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package Mini; diff --git a/src/examples/Mini/MiniParser.java b/src/examples/Mini/MiniParser.java index 106be3f5..abeac452 100644 --- a/src/examples/Mini/MiniParser.java +++ b/src/examples/Mini/MiniParser.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree&JavaCC: Do not edit this line. MiniParser.java */ diff --git a/src/examples/Mini/MiniParserConstants.java b/src/examples/Mini/MiniParserConstants.java index 3a32c051..08078882 100644 --- a/src/examples/Mini/MiniParserConstants.java +++ b/src/examples/Mini/MiniParserConstants.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree&JavaCC: Do not edit this line. MiniParserConstants.java */ diff --git a/src/examples/Mini/MiniParserTokenManager.java b/src/examples/Mini/MiniParserTokenManager.java index dbdba0e4..d09067b7 100644 --- a/src/examples/Mini/MiniParserTokenManager.java +++ b/src/examples/Mini/MiniParserTokenManager.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree&JavaCC: Do not edit this line. MiniParserTokenManager.java */ diff --git a/src/examples/Mini/MiniParserTreeConstants.java b/src/examples/Mini/MiniParserTreeConstants.java index 7c4c09cc..fe740140 100644 --- a/src/examples/Mini/MiniParserTreeConstants.java +++ b/src/examples/Mini/MiniParserTreeConstants.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. MiniParserTreeConstants.java */ diff --git a/src/examples/Mini/Node.java b/src/examples/Mini/Node.java index e893d47f..efbfe880 100644 --- a/src/examples/Mini/Node.java +++ b/src/examples/Mini/Node.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. Node.java */ diff --git a/src/examples/Mini/ParseException.java b/src/examples/Mini/ParseException.java index 57fc4646..3626f6ca 100644 --- a/src/examples/Mini/ParseException.java +++ b/src/examples/Mini/ParseException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JavaCC: Do not edit this line. ParseException.java Version 0.7pre6 */ diff --git a/src/examples/Mini/SimpleNode.java b/src/examples/Mini/SimpleNode.java index 668d5612..2601aaac 100644 --- a/src/examples/Mini/SimpleNode.java +++ b/src/examples/Mini/SimpleNode.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JJTree: Do not edit this line. SimpleNode.java */ diff --git a/src/examples/Mini/Token.java b/src/examples/Mini/Token.java index b527bd68..7f1dcb61 100644 --- a/src/examples/Mini/Token.java +++ b/src/examples/Mini/Token.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JavaCC: Do not edit this line. Token.java Version 0.7pre3 */ diff --git a/src/examples/Mini/TokenMgrError.java b/src/examples/Mini/TokenMgrError.java index 6b68ce84..3f4ccd4a 100644 --- a/src/examples/Mini/TokenMgrError.java +++ b/src/examples/Mini/TokenMgrError.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ /* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 0.7pre2 */ diff --git a/src/examples/Mini/Variable.java b/src/examples/Mini/Variable.java index d072ac88..c3658dce 100644 --- a/src/examples/Mini/Variable.java +++ b/src/examples/Mini/Variable.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package Mini; diff --git a/src/examples/Package.java b/src/examples/Package.java index 2947196a..3a9f9e61 100644 --- a/src/examples/Package.java +++ b/src/examples/Package.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ import java.io.FileOutputStream; diff --git a/src/examples/Peephole.java b/src/examples/Peephole.java index c01571fa..6c180b4a 100644 --- a/src/examples/Peephole.java +++ b/src/examples/Peephole.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ import java.util.Iterator; diff --git a/src/examples/ProxyCreator.java b/src/examples/ProxyCreator.java index 94b4e530..42d1db12 100644 --- a/src/examples/ProxyCreator.java +++ b/src/examples/ProxyCreator.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ import java.awt.event.ActionEvent; diff --git a/src/examples/TransitiveHull.java b/src/examples/TransitiveHull.java index 064f7a86..2ffd0846 100644 --- a/src/examples/TransitiveHull.java +++ b/src/examples/TransitiveHull.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ import java.util.Arrays; diff --git a/src/examples/helloify.java b/src/examples/helloify.java index ebad93e3..469db649 100644 --- a/src/examples/helloify.java +++ b/src/examples/helloify.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ import org.apache.bcel.Constants; diff --git a/src/examples/id.java b/src/examples/id.java index 4d876aef..22c49953 100644 --- a/src/examples/id.java +++ b/src/examples/id.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ import org.apache.bcel.Repository; diff --git a/src/examples/listclass.java b/src/examples/listclass.java index fcab232a..be28e058 100644 --- a/src/examples/listclass.java +++ b/src/examples/listclass.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ import java.io.IOException; diff --git a/src/examples/maxstack.java b/src/examples/maxstack.java index 83bf6d62..97416fa8 100644 --- a/src/examples/maxstack.java +++ b/src/examples/maxstack.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ import org.apache.bcel.Repository; diff --git a/src/examples/patchclass.java b/src/examples/patchclass.java index 359f9e5b..72ffaac5 100644 --- a/src/examples/patchclass.java +++ b/src/examples/patchclass.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ import org.apache.bcel.classfile.ClassParser; diff --git a/src/main/java/org/apache/bcel/ExceptionConstants.java b/src/main/java/org/apache/bcel/ExceptionConstants.java index 9d4f6d57..589e8c34 100644 --- a/src/main/java/org/apache/bcel/ExceptionConstants.java +++ b/src/main/java/org/apache/bcel/ExceptionConstants.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel; diff --git a/src/main/java/org/apache/bcel/Repository.java b/src/main/java/org/apache/bcel/Repository.java index 1b3c6c45..0d64a63c 100644 --- a/src/main/java/org/apache/bcel/Repository.java +++ b/src/main/java/org/apache/bcel/Repository.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel; diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java index 9c49cd28..4a70ec84 100644 --- a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java index 1a391137..03b0d3d7 100644 --- a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java +++ b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index 27552c66..ebaf556c 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantValue.java b/src/main/java/org/apache/bcel/classfile/ConstantValue.java index 61af5d70..8bd193ca 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantValue.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/Deprecated.java b/src/main/java/org/apache/bcel/classfile/Deprecated.java index e8ec2cee..3ced7d74 100644 --- a/src/main/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/main/java/org/apache/bcel/classfile/Deprecated.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index 691bd60e..dac61473 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java index 435e60b1..bc5346ef 100644 --- a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java index 0ec0083c..702a309c 100644 --- a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java index ddafd859..2cc399f5 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/bcel/classfile/Field.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index d8ffd0c5..a94bb449 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/InnerClass.java b/src/main/java/org/apache/bcel/classfile/InnerClass.java index 02a06790..47687f30 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClass.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/InnerClasses.java b/src/main/java/org/apache/bcel/classfile/InnerClasses.java index 2c0a3cc2..2f67097f 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClasses.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index bd88bc1b..eea4744b 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/LineNumber.java b/src/main/java/org/apache/bcel/classfile/LineNumber.java index 517d6bb8..85dd27cd 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumber.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java index f3ba8a25..3d740148 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java index 138f6186..629295e0 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariable.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index dda41f6b..6059b002 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index 1976f605..6bd70f1d 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameter.java b/src/main/java/org/apache/bcel/classfile/MethodParameter.java index 72cbdce7..e555c280 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameter.java +++ b/src/main/java/org/apache/bcel/classfile/MethodParameter.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/Node.java b/src/main/java/org/apache/bcel/classfile/Node.java index 9594f8b1..6cae380e 100644 --- a/src/main/java/org/apache/bcel/classfile/Node.java +++ b/src/main/java/org/apache/bcel/classfile/Node.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java index b2b1c446..8fed00be 100644 --- a/src/main/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/main/java/org/apache/bcel/classfile/PMGClass.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 13b471eb..99e2d30b 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 299fb395..3e56c9ea 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 0e478937..4929eb23 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index d80d077a..9aefd4b5 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index fbdca58e..ba3667db 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java index bbc551ee..53a4e632 100644 --- a/src/main/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/main/java/org/apache/bcel/classfile/SourceFile.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java index 0aa13d52..f3ae3e7c 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMap.java +++ b/src/main/java/org/apache/bcel/classfile/StackMap.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index 87258fa6..fc15febf 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTable.java b/src/main/java/org/apache/bcel/classfile/StackMapTable.java index 3ed3a8bb..35d2b866 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTable.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTable.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index ef920bdf..eeca12f3 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/StackMapType.java b/src/main/java/org/apache/bcel/classfile/StackMapType.java index ed686458..640a0474 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapType.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/Synthetic.java b/src/main/java/org/apache/bcel/classfile/Synthetic.java index c143c175..324a3937 100644 --- a/src/main/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/main/java/org/apache/bcel/classfile/Synthetic.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index 024aa36b..f66c7afc 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index a5d90594..178d0505 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java index 4dc66317..48f3aea8 100644 --- a/src/main/java/org/apache/bcel/classfile/Visitor.java +++ b/src/main/java/org/apache/bcel/classfile/Visitor.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.classfile; diff --git a/src/main/java/org/apache/bcel/generic/AALOAD.java b/src/main/java/org/apache/bcel/generic/AALOAD.java index 5e9de579..3e3c6c9f 100644 --- a/src/main/java/org/apache/bcel/generic/AALOAD.java +++ b/src/main/java/org/apache/bcel/generic/AALOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/AASTORE.java b/src/main/java/org/apache/bcel/generic/AASTORE.java index dbe7cdfb..8027f41c 100644 --- a/src/main/java/org/apache/bcel/generic/AASTORE.java +++ b/src/main/java/org/apache/bcel/generic/AASTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java index f1e1bcaf..f3abfb7e 100644 --- a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java +++ b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ALOAD.java b/src/main/java/org/apache/bcel/generic/ALOAD.java index f54e9844..9b9f05a9 100644 --- a/src/main/java/org/apache/bcel/generic/ALOAD.java +++ b/src/main/java/org/apache/bcel/generic/ALOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java index 077d3767..64888b35 100644 --- a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ARETURN.java b/src/main/java/org/apache/bcel/generic/ARETURN.java index 63b32cb1..9db295e5 100644 --- a/src/main/java/org/apache/bcel/generic/ARETURN.java +++ b/src/main/java/org/apache/bcel/generic/ARETURN.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java index 2476aa5e..86f401ef 100644 --- a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ASTORE.java b/src/main/java/org/apache/bcel/generic/ASTORE.java index 9fe5299f..14a0714f 100644 --- a/src/main/java/org/apache/bcel/generic/ASTORE.java +++ b/src/main/java/org/apache/bcel/generic/ASTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ATHROW.java b/src/main/java/org/apache/bcel/generic/ATHROW.java index 12000ac0..d3795e19 100644 --- a/src/main/java/org/apache/bcel/generic/ATHROW.java +++ b/src/main/java/org/apache/bcel/generic/ATHROW.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/AllocationInstruction.java b/src/main/java/org/apache/bcel/generic/AllocationInstruction.java index a81c82c1..cb755fde 100644 --- a/src/main/java/org/apache/bcel/generic/AllocationInstruction.java +++ b/src/main/java/org/apache/bcel/generic/AllocationInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java index 347d2888..03bae8b0 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index 8ed5f89e..a7266605 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java b/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java index 1f00e7a5..caa71247 100644 --- a/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index f13b9f5f..749b3675 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ArrayInstruction.java b/src/main/java/org/apache/bcel/generic/ArrayInstruction.java index 85224d8d..053fd334 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ArrayInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ArrayType.java b/src/main/java/org/apache/bcel/generic/ArrayType.java index e0eeabf0..79fef4dc 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayType.java +++ b/src/main/java/org/apache/bcel/generic/ArrayType.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/BALOAD.java b/src/main/java/org/apache/bcel/generic/BALOAD.java index bb07ca60..1586d517 100644 --- a/src/main/java/org/apache/bcel/generic/BALOAD.java +++ b/src/main/java/org/apache/bcel/generic/BALOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/BASTORE.java b/src/main/java/org/apache/bcel/generic/BASTORE.java index 3e4c1c53..b1c7570a 100644 --- a/src/main/java/org/apache/bcel/generic/BASTORE.java +++ b/src/main/java/org/apache/bcel/generic/BASTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/BIPUSH.java b/src/main/java/org/apache/bcel/generic/BIPUSH.java index 0aa97686..b9bf205b 100644 --- a/src/main/java/org/apache/bcel/generic/BIPUSH.java +++ b/src/main/java/org/apache/bcel/generic/BIPUSH.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java index 0c3fae5b..fc1c49d6 100644 --- a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java +++ b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/BasicType.java b/src/main/java/org/apache/bcel/generic/BasicType.java index 2bd205ed..93b7a3ba 100644 --- a/src/main/java/org/apache/bcel/generic/BasicType.java +++ b/src/main/java/org/apache/bcel/generic/BasicType.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/BranchHandle.java b/src/main/java/org/apache/bcel/generic/BranchHandle.java index 907d1c1e..1b70164b 100644 --- a/src/main/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/main/java/org/apache/bcel/generic/BranchHandle.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/BranchInstruction.java b/src/main/java/org/apache/bcel/generic/BranchInstruction.java index c94f2baa..d8f0eaf6 100644 --- a/src/main/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/main/java/org/apache/bcel/generic/BranchInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/CALOAD.java b/src/main/java/org/apache/bcel/generic/CALOAD.java index 6f5d8f23..d64de8f1 100644 --- a/src/main/java/org/apache/bcel/generic/CALOAD.java +++ b/src/main/java/org/apache/bcel/generic/CALOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/CASTORE.java b/src/main/java/org/apache/bcel/generic/CASTORE.java index a1c8ff36..76043b5c 100644 --- a/src/main/java/org/apache/bcel/generic/CASTORE.java +++ b/src/main/java/org/apache/bcel/generic/CASTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/CHECKCAST.java b/src/main/java/org/apache/bcel/generic/CHECKCAST.java index 33afdd70..b280f2e4 100644 --- a/src/main/java/org/apache/bcel/generic/CHECKCAST.java +++ b/src/main/java/org/apache/bcel/generic/CHECKCAST.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/CPInstruction.java b/src/main/java/org/apache/bcel/generic/CPInstruction.java index 2f623b5e..74e51df8 100644 --- a/src/main/java/org/apache/bcel/generic/CPInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CPInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java index 3558d37d..db1fe48b 100644 --- a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 342f2d8c..6027f41f 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ClassGenException.java b/src/main/java/org/apache/bcel/generic/ClassGenException.java index 521f1b02..e76cf0d5 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGenException.java +++ b/src/main/java/org/apache/bcel/generic/ClassGenException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ClassObserver.java b/src/main/java/org/apache/bcel/generic/ClassObserver.java index 0793aac2..789210e8 100644 --- a/src/main/java/org/apache/bcel/generic/ClassObserver.java +++ b/src/main/java/org/apache/bcel/generic/ClassObserver.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java index 9949b32d..0ee9b0db 100644 --- a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/CompoundInstruction.java b/src/main/java/org/apache/bcel/generic/CompoundInstruction.java index 7ed9573c..388c77e4 100644 --- a/src/main/java/org/apache/bcel/generic/CompoundInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CompoundInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index 714cdafa..726d3112 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java b/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java index 1e511b6e..1539949b 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ConversionInstruction.java b/src/main/java/org/apache/bcel/generic/ConversionInstruction.java index 2ca75307..746bbe8e 100644 --- a/src/main/java/org/apache/bcel/generic/ConversionInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ConversionInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/D2F.java b/src/main/java/org/apache/bcel/generic/D2F.java index 6a30de78..15558738 100644 --- a/src/main/java/org/apache/bcel/generic/D2F.java +++ b/src/main/java/org/apache/bcel/generic/D2F.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/D2I.java b/src/main/java/org/apache/bcel/generic/D2I.java index ae392e6d..4a06f11a 100644 --- a/src/main/java/org/apache/bcel/generic/D2I.java +++ b/src/main/java/org/apache/bcel/generic/D2I.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/D2L.java b/src/main/java/org/apache/bcel/generic/D2L.java index f2795df7..1bbc3c14 100644 --- a/src/main/java/org/apache/bcel/generic/D2L.java +++ b/src/main/java/org/apache/bcel/generic/D2L.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DADD.java b/src/main/java/org/apache/bcel/generic/DADD.java index 4909ea7c..c9a2eb49 100644 --- a/src/main/java/org/apache/bcel/generic/DADD.java +++ b/src/main/java/org/apache/bcel/generic/DADD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DALOAD.java b/src/main/java/org/apache/bcel/generic/DALOAD.java index ecc4c932..3ad7b694 100644 --- a/src/main/java/org/apache/bcel/generic/DALOAD.java +++ b/src/main/java/org/apache/bcel/generic/DALOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DASTORE.java b/src/main/java/org/apache/bcel/generic/DASTORE.java index 9d9ab7aa..31f2f1ad 100644 --- a/src/main/java/org/apache/bcel/generic/DASTORE.java +++ b/src/main/java/org/apache/bcel/generic/DASTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DCMPG.java b/src/main/java/org/apache/bcel/generic/DCMPG.java index 68dfebc0..2ed3a357 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPG.java +++ b/src/main/java/org/apache/bcel/generic/DCMPG.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DCMPL.java b/src/main/java/org/apache/bcel/generic/DCMPL.java index b82a29ab..e3345720 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPL.java +++ b/src/main/java/org/apache/bcel/generic/DCMPL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DCONST.java b/src/main/java/org/apache/bcel/generic/DCONST.java index 97334988..8f79dbe8 100644 --- a/src/main/java/org/apache/bcel/generic/DCONST.java +++ b/src/main/java/org/apache/bcel/generic/DCONST.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DDIV.java b/src/main/java/org/apache/bcel/generic/DDIV.java index 052b5032..807acee5 100644 --- a/src/main/java/org/apache/bcel/generic/DDIV.java +++ b/src/main/java/org/apache/bcel/generic/DDIV.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DLOAD.java b/src/main/java/org/apache/bcel/generic/DLOAD.java index 93d85483..70148dbe 100644 --- a/src/main/java/org/apache/bcel/generic/DLOAD.java +++ b/src/main/java/org/apache/bcel/generic/DLOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DMUL.java b/src/main/java/org/apache/bcel/generic/DMUL.java index 1d6ca34f..d8221b39 100644 --- a/src/main/java/org/apache/bcel/generic/DMUL.java +++ b/src/main/java/org/apache/bcel/generic/DMUL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DNEG.java b/src/main/java/org/apache/bcel/generic/DNEG.java index cb8535f9..98f511fd 100644 --- a/src/main/java/org/apache/bcel/generic/DNEG.java +++ b/src/main/java/org/apache/bcel/generic/DNEG.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DREM.java b/src/main/java/org/apache/bcel/generic/DREM.java index e63dbc51..8fad7338 100644 --- a/src/main/java/org/apache/bcel/generic/DREM.java +++ b/src/main/java/org/apache/bcel/generic/DREM.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DRETURN.java b/src/main/java/org/apache/bcel/generic/DRETURN.java index 1cdfa92d..de0b872c 100644 --- a/src/main/java/org/apache/bcel/generic/DRETURN.java +++ b/src/main/java/org/apache/bcel/generic/DRETURN.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DSTORE.java b/src/main/java/org/apache/bcel/generic/DSTORE.java index c7a2dd7c..6404f785 100644 --- a/src/main/java/org/apache/bcel/generic/DSTORE.java +++ b/src/main/java/org/apache/bcel/generic/DSTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DSUB.java b/src/main/java/org/apache/bcel/generic/DSUB.java index 3e3e894f..ffea5326 100644 --- a/src/main/java/org/apache/bcel/generic/DSUB.java +++ b/src/main/java/org/apache/bcel/generic/DSUB.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DUP.java b/src/main/java/org/apache/bcel/generic/DUP.java index d2515137..4ce01637 100644 --- a/src/main/java/org/apache/bcel/generic/DUP.java +++ b/src/main/java/org/apache/bcel/generic/DUP.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DUP2.java b/src/main/java/org/apache/bcel/generic/DUP2.java index 9da9b775..13238b45 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2.java +++ b/src/main/java/org/apache/bcel/generic/DUP2.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X1.java b/src/main/java/org/apache/bcel/generic/DUP2_X1.java index 3640dfaf..31312645 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X1.java +++ b/src/main/java/org/apache/bcel/generic/DUP2_X1.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X2.java b/src/main/java/org/apache/bcel/generic/DUP2_X2.java index 233d42cf..8e508ebd 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X2.java +++ b/src/main/java/org/apache/bcel/generic/DUP2_X2.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DUP_X1.java b/src/main/java/org/apache/bcel/generic/DUP_X1.java index 5d76b95b..0f445986 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X1.java +++ b/src/main/java/org/apache/bcel/generic/DUP_X1.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/DUP_X2.java b/src/main/java/org/apache/bcel/generic/DUP_X2.java index aacd6ab0..cf1cba50 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X2.java +++ b/src/main/java/org/apache/bcel/generic/DUP_X2.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java index ac7cfa85..6da3f3af 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java index 22ef83e9..707f7665 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java index e4c8651a..ca6a23a0 100644 --- a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java index ecbd436a..3b8d5ace 100644 --- a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ExceptionThrower.java b/src/main/java/org/apache/bcel/generic/ExceptionThrower.java index 2777fdb0..29cba190 100644 --- a/src/main/java/org/apache/bcel/generic/ExceptionThrower.java +++ b/src/main/java/org/apache/bcel/generic/ExceptionThrower.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/F2D.java b/src/main/java/org/apache/bcel/generic/F2D.java index 1d13dc8d..80f6e39e 100644 --- a/src/main/java/org/apache/bcel/generic/F2D.java +++ b/src/main/java/org/apache/bcel/generic/F2D.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/F2I.java b/src/main/java/org/apache/bcel/generic/F2I.java index 75f83ab3..3d17a1dd 100644 --- a/src/main/java/org/apache/bcel/generic/F2I.java +++ b/src/main/java/org/apache/bcel/generic/F2I.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/F2L.java b/src/main/java/org/apache/bcel/generic/F2L.java index 661e3b99..06883d7c 100644 --- a/src/main/java/org/apache/bcel/generic/F2L.java +++ b/src/main/java/org/apache/bcel/generic/F2L.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FADD.java b/src/main/java/org/apache/bcel/generic/FADD.java index caf64541..d24c5bf1 100644 --- a/src/main/java/org/apache/bcel/generic/FADD.java +++ b/src/main/java/org/apache/bcel/generic/FADD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FALOAD.java b/src/main/java/org/apache/bcel/generic/FALOAD.java index 303ec640..ffc8f6fb 100644 --- a/src/main/java/org/apache/bcel/generic/FALOAD.java +++ b/src/main/java/org/apache/bcel/generic/FALOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FASTORE.java b/src/main/java/org/apache/bcel/generic/FASTORE.java index b604ab8c..fec19b2c 100644 --- a/src/main/java/org/apache/bcel/generic/FASTORE.java +++ b/src/main/java/org/apache/bcel/generic/FASTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FCMPG.java b/src/main/java/org/apache/bcel/generic/FCMPG.java index 75124a4b..7d70167e 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPG.java +++ b/src/main/java/org/apache/bcel/generic/FCMPG.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FCMPL.java b/src/main/java/org/apache/bcel/generic/FCMPL.java index efdab42d..705c1912 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPL.java +++ b/src/main/java/org/apache/bcel/generic/FCMPL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FCONST.java b/src/main/java/org/apache/bcel/generic/FCONST.java index dc0bb128..e1900e30 100644 --- a/src/main/java/org/apache/bcel/generic/FCONST.java +++ b/src/main/java/org/apache/bcel/generic/FCONST.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FDIV.java b/src/main/java/org/apache/bcel/generic/FDIV.java index 4f64ca04..fe886a20 100644 --- a/src/main/java/org/apache/bcel/generic/FDIV.java +++ b/src/main/java/org/apache/bcel/generic/FDIV.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FLOAD.java b/src/main/java/org/apache/bcel/generic/FLOAD.java index 90a24fb0..34267cfd 100644 --- a/src/main/java/org/apache/bcel/generic/FLOAD.java +++ b/src/main/java/org/apache/bcel/generic/FLOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FMUL.java b/src/main/java/org/apache/bcel/generic/FMUL.java index 95c125b3..3d5ca623 100644 --- a/src/main/java/org/apache/bcel/generic/FMUL.java +++ b/src/main/java/org/apache/bcel/generic/FMUL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FNEG.java b/src/main/java/org/apache/bcel/generic/FNEG.java index 780ab690..dcc6a355 100644 --- a/src/main/java/org/apache/bcel/generic/FNEG.java +++ b/src/main/java/org/apache/bcel/generic/FNEG.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FREM.java b/src/main/java/org/apache/bcel/generic/FREM.java index 97e58e08..68b32f8b 100644 --- a/src/main/java/org/apache/bcel/generic/FREM.java +++ b/src/main/java/org/apache/bcel/generic/FREM.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FRETURN.java b/src/main/java/org/apache/bcel/generic/FRETURN.java index 1159f2eb..8c70b2da 100644 --- a/src/main/java/org/apache/bcel/generic/FRETURN.java +++ b/src/main/java/org/apache/bcel/generic/FRETURN.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FSTORE.java b/src/main/java/org/apache/bcel/generic/FSTORE.java index e22d35af..e3786b55 100644 --- a/src/main/java/org/apache/bcel/generic/FSTORE.java +++ b/src/main/java/org/apache/bcel/generic/FSTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FSUB.java b/src/main/java/org/apache/bcel/generic/FSUB.java index 0d0536f7..ece434e1 100644 --- a/src/main/java/org/apache/bcel/generic/FSUB.java +++ b/src/main/java/org/apache/bcel/generic/FSUB.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index 5f4ecd44..17e9e00e 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 9d890f50..404eb0e8 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FieldInstruction.java b/src/main/java/org/apache/bcel/generic/FieldInstruction.java index 759e210f..f0df0919 100644 --- a/src/main/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/main/java/org/apache/bcel/generic/FieldInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FieldObserver.java b/src/main/java/org/apache/bcel/generic/FieldObserver.java index eef97e8f..0e686334 100644 --- a/src/main/java/org/apache/bcel/generic/FieldObserver.java +++ b/src/main/java/org/apache/bcel/generic/FieldObserver.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java index dd1a2622..9cbfd8f6 100644 --- a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/GETFIELD.java b/src/main/java/org/apache/bcel/generic/GETFIELD.java index ccfc0160..95e0d727 100644 --- a/src/main/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/main/java/org/apache/bcel/generic/GETFIELD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/GETSTATIC.java b/src/main/java/org/apache/bcel/generic/GETSTATIC.java index 610c11ae..df2cf128 100644 --- a/src/main/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/GETSTATIC.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/GOTO.java b/src/main/java/org/apache/bcel/generic/GOTO.java index 3f203e91..2babadb6 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO.java +++ b/src/main/java/org/apache/bcel/generic/GOTO.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/GOTO_W.java b/src/main/java/org/apache/bcel/generic/GOTO_W.java index 09c54b7e..6760b43c 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO_W.java +++ b/src/main/java/org/apache/bcel/generic/GOTO_W.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/GotoInstruction.java b/src/main/java/org/apache/bcel/generic/GotoInstruction.java index 395780f4..3d9de03f 100644 --- a/src/main/java/org/apache/bcel/generic/GotoInstruction.java +++ b/src/main/java/org/apache/bcel/generic/GotoInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/I2B.java b/src/main/java/org/apache/bcel/generic/I2B.java index fe6d71f6..3c849720 100644 --- a/src/main/java/org/apache/bcel/generic/I2B.java +++ b/src/main/java/org/apache/bcel/generic/I2B.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/I2C.java b/src/main/java/org/apache/bcel/generic/I2C.java index a4ea9ac9..3bd218fe 100644 --- a/src/main/java/org/apache/bcel/generic/I2C.java +++ b/src/main/java/org/apache/bcel/generic/I2C.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/I2D.java b/src/main/java/org/apache/bcel/generic/I2D.java index 8741c304..a13587cb 100644 --- a/src/main/java/org/apache/bcel/generic/I2D.java +++ b/src/main/java/org/apache/bcel/generic/I2D.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/I2F.java b/src/main/java/org/apache/bcel/generic/I2F.java index 386da4b8..a8cb4a18 100644 --- a/src/main/java/org/apache/bcel/generic/I2F.java +++ b/src/main/java/org/apache/bcel/generic/I2F.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/I2L.java b/src/main/java/org/apache/bcel/generic/I2L.java index e43cd2a3..0527568c 100644 --- a/src/main/java/org/apache/bcel/generic/I2L.java +++ b/src/main/java/org/apache/bcel/generic/I2L.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/I2S.java b/src/main/java/org/apache/bcel/generic/I2S.java index 373372d5..7a308de4 100644 --- a/src/main/java/org/apache/bcel/generic/I2S.java +++ b/src/main/java/org/apache/bcel/generic/I2S.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IADD.java b/src/main/java/org/apache/bcel/generic/IADD.java index 97f1e423..22329408 100644 --- a/src/main/java/org/apache/bcel/generic/IADD.java +++ b/src/main/java/org/apache/bcel/generic/IADD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IALOAD.java b/src/main/java/org/apache/bcel/generic/IALOAD.java index d32538b6..aa531993 100644 --- a/src/main/java/org/apache/bcel/generic/IALOAD.java +++ b/src/main/java/org/apache/bcel/generic/IALOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IAND.java b/src/main/java/org/apache/bcel/generic/IAND.java index fdf2e2eb..17c4f73c 100644 --- a/src/main/java/org/apache/bcel/generic/IAND.java +++ b/src/main/java/org/apache/bcel/generic/IAND.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IASTORE.java b/src/main/java/org/apache/bcel/generic/IASTORE.java index 95c2dbb2..e2b4e875 100644 --- a/src/main/java/org/apache/bcel/generic/IASTORE.java +++ b/src/main/java/org/apache/bcel/generic/IASTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ICONST.java b/src/main/java/org/apache/bcel/generic/ICONST.java index 375c2957..eb2a0fd2 100644 --- a/src/main/java/org/apache/bcel/generic/ICONST.java +++ b/src/main/java/org/apache/bcel/generic/ICONST.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IDIV.java b/src/main/java/org/apache/bcel/generic/IDIV.java index 44b5eac8..210e7af3 100644 --- a/src/main/java/org/apache/bcel/generic/IDIV.java +++ b/src/main/java/org/apache/bcel/generic/IDIV.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IFEQ.java b/src/main/java/org/apache/bcel/generic/IFEQ.java index 2f5aa870..9072eb54 100644 --- a/src/main/java/org/apache/bcel/generic/IFEQ.java +++ b/src/main/java/org/apache/bcel/generic/IFEQ.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IFGE.java b/src/main/java/org/apache/bcel/generic/IFGE.java index 35ce5ade..9d1e973b 100644 --- a/src/main/java/org/apache/bcel/generic/IFGE.java +++ b/src/main/java/org/apache/bcel/generic/IFGE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IFGT.java b/src/main/java/org/apache/bcel/generic/IFGT.java index d20b7117..82dc2dd8 100644 --- a/src/main/java/org/apache/bcel/generic/IFGT.java +++ b/src/main/java/org/apache/bcel/generic/IFGT.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IFLE.java b/src/main/java/org/apache/bcel/generic/IFLE.java index 6b1dfda8..0f847cbf 100644 --- a/src/main/java/org/apache/bcel/generic/IFLE.java +++ b/src/main/java/org/apache/bcel/generic/IFLE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IFLT.java b/src/main/java/org/apache/bcel/generic/IFLT.java index 159a0b65..c7929cba 100644 --- a/src/main/java/org/apache/bcel/generic/IFLT.java +++ b/src/main/java/org/apache/bcel/generic/IFLT.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IFNE.java b/src/main/java/org/apache/bcel/generic/IFNE.java index dd687a8a..05e21c17 100644 --- a/src/main/java/org/apache/bcel/generic/IFNE.java +++ b/src/main/java/org/apache/bcel/generic/IFNE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IFNONNULL.java b/src/main/java/org/apache/bcel/generic/IFNONNULL.java index 84f2e5b3..ce2a8ae2 100644 --- a/src/main/java/org/apache/bcel/generic/IFNONNULL.java +++ b/src/main/java/org/apache/bcel/generic/IFNONNULL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IFNULL.java b/src/main/java/org/apache/bcel/generic/IFNULL.java index b495a273..6e352f0c 100644 --- a/src/main/java/org/apache/bcel/generic/IFNULL.java +++ b/src/main/java/org/apache/bcel/generic/IFNULL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java index a2432b49..cba17b51 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java +++ b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java index 6ed0786a..54563b0a 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java index e4c2bdb7..2a3e5a46 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java index f608af99..df12da43 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java index 637563cc..72f9fce5 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java index f2320a7c..ef931c66 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java index 9a86eb7e..3aba740b 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java index 3a224f08..0d1cd28a 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IINC.java b/src/main/java/org/apache/bcel/generic/IINC.java index 9cf084f1..4dcbd545 100644 --- a/src/main/java/org/apache/bcel/generic/IINC.java +++ b/src/main/java/org/apache/bcel/generic/IINC.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ILOAD.java b/src/main/java/org/apache/bcel/generic/ILOAD.java index 657c730d..523883a9 100644 --- a/src/main/java/org/apache/bcel/generic/ILOAD.java +++ b/src/main/java/org/apache/bcel/generic/ILOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP1.java b/src/main/java/org/apache/bcel/generic/IMPDEP1.java index e583259c..484d9190 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP1.java +++ b/src/main/java/org/apache/bcel/generic/IMPDEP1.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP2.java b/src/main/java/org/apache/bcel/generic/IMPDEP2.java index 4e6921ba..a69edbcd 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP2.java +++ b/src/main/java/org/apache/bcel/generic/IMPDEP2.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IMUL.java b/src/main/java/org/apache/bcel/generic/IMUL.java index 85cb7b25..b673eadb 100644 --- a/src/main/java/org/apache/bcel/generic/IMUL.java +++ b/src/main/java/org/apache/bcel/generic/IMUL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/INEG.java b/src/main/java/org/apache/bcel/generic/INEG.java index 4f724da3..103f63e9 100644 --- a/src/main/java/org/apache/bcel/generic/INEG.java +++ b/src/main/java/org/apache/bcel/generic/INEG.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java index 1ab2f2c0..de62b7da 100644 --- a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java +++ b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java index ca6bfbb8..841cf849 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java index 45afe594..52feed66 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java index 2a645ee7..1c6a801b 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java index a791ee74..6d00b660 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java index dd7a353f..4b57a419 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IOR.java b/src/main/java/org/apache/bcel/generic/IOR.java index 48b60e45..5ae4214d 100644 --- a/src/main/java/org/apache/bcel/generic/IOR.java +++ b/src/main/java/org/apache/bcel/generic/IOR.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IREM.java b/src/main/java/org/apache/bcel/generic/IREM.java index 91c5e68f..3d2ab7fa 100644 --- a/src/main/java/org/apache/bcel/generic/IREM.java +++ b/src/main/java/org/apache/bcel/generic/IREM.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IRETURN.java b/src/main/java/org/apache/bcel/generic/IRETURN.java index 2e669a37..c195b514 100644 --- a/src/main/java/org/apache/bcel/generic/IRETURN.java +++ b/src/main/java/org/apache/bcel/generic/IRETURN.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ISHL.java b/src/main/java/org/apache/bcel/generic/ISHL.java index d1894df5..634653d7 100644 --- a/src/main/java/org/apache/bcel/generic/ISHL.java +++ b/src/main/java/org/apache/bcel/generic/ISHL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ISHR.java b/src/main/java/org/apache/bcel/generic/ISHR.java index 2056ab2d..bdf2fac8 100644 --- a/src/main/java/org/apache/bcel/generic/ISHR.java +++ b/src/main/java/org/apache/bcel/generic/ISHR.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ISTORE.java b/src/main/java/org/apache/bcel/generic/ISTORE.java index 1d671112..5e1ce524 100644 --- a/src/main/java/org/apache/bcel/generic/ISTORE.java +++ b/src/main/java/org/apache/bcel/generic/ISTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ISUB.java b/src/main/java/org/apache/bcel/generic/ISUB.java index 5e7714ce..63378199 100644 --- a/src/main/java/org/apache/bcel/generic/ISUB.java +++ b/src/main/java/org/apache/bcel/generic/ISUB.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IUSHR.java b/src/main/java/org/apache/bcel/generic/IUSHR.java index e94da14a..13c0af77 100644 --- a/src/main/java/org/apache/bcel/generic/IUSHR.java +++ b/src/main/java/org/apache/bcel/generic/IUSHR.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IXOR.java b/src/main/java/org/apache/bcel/generic/IXOR.java index c6c13712..b0171458 100644 --- a/src/main/java/org/apache/bcel/generic/IXOR.java +++ b/src/main/java/org/apache/bcel/generic/IXOR.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IfInstruction.java b/src/main/java/org/apache/bcel/generic/IfInstruction.java index 1b936caa..ed98a060 100644 --- a/src/main/java/org/apache/bcel/generic/IfInstruction.java +++ b/src/main/java/org/apache/bcel/generic/IfInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/IndexedInstruction.java b/src/main/java/org/apache/bcel/generic/IndexedInstruction.java index 0557e12e..11ee967b 100644 --- a/src/main/java/org/apache/bcel/generic/IndexedInstruction.java +++ b/src/main/java/org/apache/bcel/generic/IndexedInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index 7c3d84ea..8ae30924 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/InstructionComparator.java b/src/main/java/org/apache/bcel/generic/InstructionComparator.java index d6430b76..41a7de23 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionComparator.java +++ b/src/main/java/org/apache/bcel/generic/InstructionComparator.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/InstructionConstants.java b/src/main/java/org/apache/bcel/generic/InstructionConstants.java index c44e9f21..f0911e0c 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionConstants.java +++ b/src/main/java/org/apache/bcel/generic/InstructionConstants.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index ecde6c22..5327a9b0 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java index 812864ae..f22bf838 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/main/java/org/apache/bcel/generic/InstructionHandle.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 8129915b..043b7b12 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/InstructionListObserver.java b/src/main/java/org/apache/bcel/generic/InstructionListObserver.java index 3bb6bad2..2e67b8e6 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionListObserver.java +++ b/src/main/java/org/apache/bcel/generic/InstructionListObserver.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/InstructionTargeter.java b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java index a41e0db0..9e3625df 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionTargeter.java +++ b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index 695f45e4..9942c723 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/JSR.java b/src/main/java/org/apache/bcel/generic/JSR.java index fc1bea6b..57b60651 100644 --- a/src/main/java/org/apache/bcel/generic/JSR.java +++ b/src/main/java/org/apache/bcel/generic/JSR.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/JSR_W.java b/src/main/java/org/apache/bcel/generic/JSR_W.java index fd769d20..ed106245 100644 --- a/src/main/java/org/apache/bcel/generic/JSR_W.java +++ b/src/main/java/org/apache/bcel/generic/JSR_W.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/JsrInstruction.java b/src/main/java/org/apache/bcel/generic/JsrInstruction.java index d4b63512..2eff7d4f 100644 --- a/src/main/java/org/apache/bcel/generic/JsrInstruction.java +++ b/src/main/java/org/apache/bcel/generic/JsrInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/L2D.java b/src/main/java/org/apache/bcel/generic/L2D.java index 126b2f1c..9c561ed4 100644 --- a/src/main/java/org/apache/bcel/generic/L2D.java +++ b/src/main/java/org/apache/bcel/generic/L2D.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/L2F.java b/src/main/java/org/apache/bcel/generic/L2F.java index 0e1289c3..ecd50277 100644 --- a/src/main/java/org/apache/bcel/generic/L2F.java +++ b/src/main/java/org/apache/bcel/generic/L2F.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/L2I.java b/src/main/java/org/apache/bcel/generic/L2I.java index 736f2f20..babcfeba 100644 --- a/src/main/java/org/apache/bcel/generic/L2I.java +++ b/src/main/java/org/apache/bcel/generic/L2I.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LADD.java b/src/main/java/org/apache/bcel/generic/LADD.java index 94399f6d..8a05a8a0 100644 --- a/src/main/java/org/apache/bcel/generic/LADD.java +++ b/src/main/java/org/apache/bcel/generic/LADD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LALOAD.java b/src/main/java/org/apache/bcel/generic/LALOAD.java index 3218e421..6249a189 100644 --- a/src/main/java/org/apache/bcel/generic/LALOAD.java +++ b/src/main/java/org/apache/bcel/generic/LALOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LAND.java b/src/main/java/org/apache/bcel/generic/LAND.java index 437c55c9..b56ae1c4 100644 --- a/src/main/java/org/apache/bcel/generic/LAND.java +++ b/src/main/java/org/apache/bcel/generic/LAND.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LASTORE.java b/src/main/java/org/apache/bcel/generic/LASTORE.java index 804464f1..9f383fd9 100644 --- a/src/main/java/org/apache/bcel/generic/LASTORE.java +++ b/src/main/java/org/apache/bcel/generic/LASTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LCMP.java b/src/main/java/org/apache/bcel/generic/LCMP.java index 538b53c8..7982944e 100644 --- a/src/main/java/org/apache/bcel/generic/LCMP.java +++ b/src/main/java/org/apache/bcel/generic/LCMP.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LCONST.java b/src/main/java/org/apache/bcel/generic/LCONST.java index 38bc78b7..439378fd 100644 --- a/src/main/java/org/apache/bcel/generic/LCONST.java +++ b/src/main/java/org/apache/bcel/generic/LCONST.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java index 02948867..2e3ebec5 100644 --- a/src/main/java/org/apache/bcel/generic/LDC.java +++ b/src/main/java/org/apache/bcel/generic/LDC.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LDC2_W.java b/src/main/java/org/apache/bcel/generic/LDC2_W.java index d63df71c..247c822c 100644 --- a/src/main/java/org/apache/bcel/generic/LDC2_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC2_W.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LDC_W.java b/src/main/java/org/apache/bcel/generic/LDC_W.java index b5acd694..2f6431b5 100644 --- a/src/main/java/org/apache/bcel/generic/LDC_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC_W.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LDIV.java b/src/main/java/org/apache/bcel/generic/LDIV.java index 1218025c..8e4f53b8 100644 --- a/src/main/java/org/apache/bcel/generic/LDIV.java +++ b/src/main/java/org/apache/bcel/generic/LDIV.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LLOAD.java b/src/main/java/org/apache/bcel/generic/LLOAD.java index 6f9185c3..18944bc6 100644 --- a/src/main/java/org/apache/bcel/generic/LLOAD.java +++ b/src/main/java/org/apache/bcel/generic/LLOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LMUL.java b/src/main/java/org/apache/bcel/generic/LMUL.java index 78484037..2b22b2a2 100644 --- a/src/main/java/org/apache/bcel/generic/LMUL.java +++ b/src/main/java/org/apache/bcel/generic/LMUL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LNEG.java b/src/main/java/org/apache/bcel/generic/LNEG.java index f3e7e3cd..14f92345 100644 --- a/src/main/java/org/apache/bcel/generic/LNEG.java +++ b/src/main/java/org/apache/bcel/generic/LNEG.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java index 93a48788..165b939d 100644 --- a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java +++ b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LOR.java b/src/main/java/org/apache/bcel/generic/LOR.java index 6ed3cb4e..17425eac 100644 --- a/src/main/java/org/apache/bcel/generic/LOR.java +++ b/src/main/java/org/apache/bcel/generic/LOR.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LREM.java b/src/main/java/org/apache/bcel/generic/LREM.java index 63c8d2af..6178ac78 100644 --- a/src/main/java/org/apache/bcel/generic/LREM.java +++ b/src/main/java/org/apache/bcel/generic/LREM.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LRETURN.java b/src/main/java/org/apache/bcel/generic/LRETURN.java index 0c259256..c9e2ecf5 100644 --- a/src/main/java/org/apache/bcel/generic/LRETURN.java +++ b/src/main/java/org/apache/bcel/generic/LRETURN.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LSHL.java b/src/main/java/org/apache/bcel/generic/LSHL.java index f294d56d..e3ac8196 100644 --- a/src/main/java/org/apache/bcel/generic/LSHL.java +++ b/src/main/java/org/apache/bcel/generic/LSHL.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LSHR.java b/src/main/java/org/apache/bcel/generic/LSHR.java index 1d90d42b..c4484aa8 100644 --- a/src/main/java/org/apache/bcel/generic/LSHR.java +++ b/src/main/java/org/apache/bcel/generic/LSHR.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LSTORE.java b/src/main/java/org/apache/bcel/generic/LSTORE.java index b636e920..2c70a014 100644 --- a/src/main/java/org/apache/bcel/generic/LSTORE.java +++ b/src/main/java/org/apache/bcel/generic/LSTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LSUB.java b/src/main/java/org/apache/bcel/generic/LSUB.java index fde82932..486890a1 100644 --- a/src/main/java/org/apache/bcel/generic/LSUB.java +++ b/src/main/java/org/apache/bcel/generic/LSUB.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LUSHR.java b/src/main/java/org/apache/bcel/generic/LUSHR.java index 1204454a..f8c89d82 100644 --- a/src/main/java/org/apache/bcel/generic/LUSHR.java +++ b/src/main/java/org/apache/bcel/generic/LUSHR.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LXOR.java b/src/main/java/org/apache/bcel/generic/LXOR.java index 52e93a01..b7cc7335 100644 --- a/src/main/java/org/apache/bcel/generic/LXOR.java +++ b/src/main/java/org/apache/bcel/generic/LXOR.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LineNumberGen.java b/src/main/java/org/apache/bcel/generic/LineNumberGen.java index f96b700f..70dfb3ce 100644 --- a/src/main/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/main/java/org/apache/bcel/generic/LineNumberGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LoadClass.java b/src/main/java/org/apache/bcel/generic/LoadClass.java index 6a503a80..19f32691 100644 --- a/src/main/java/org/apache/bcel/generic/LoadClass.java +++ b/src/main/java/org/apache/bcel/generic/LoadClass.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LoadInstruction.java b/src/main/java/org/apache/bcel/generic/LoadInstruction.java index 451e65d5..555a5247 100644 --- a/src/main/java/org/apache/bcel/generic/LoadInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LoadInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java index 779fb2d6..ec3085c9 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java index 0b8f75e4..335387c4 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/MONITORENTER.java b/src/main/java/org/apache/bcel/generic/MONITORENTER.java index bf3db034..a560fdb7 100644 --- a/src/main/java/org/apache/bcel/generic/MONITORENTER.java +++ b/src/main/java/org/apache/bcel/generic/MONITORENTER.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java index f5d89f96..ad57fc64 100644 --- a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java +++ b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java index a4f520af..99dd13a9 100644 --- a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 09f4dc5e..51792abe 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/MethodObserver.java b/src/main/java/org/apache/bcel/generic/MethodObserver.java index 9efc654d..d81d24b3 100644 --- a/src/main/java/org/apache/bcel/generic/MethodObserver.java +++ b/src/main/java/org/apache/bcel/generic/MethodObserver.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/NEW.java b/src/main/java/org/apache/bcel/generic/NEW.java index 46abc86b..da2900d2 100644 --- a/src/main/java/org/apache/bcel/generic/NEW.java +++ b/src/main/java/org/apache/bcel/generic/NEW.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/NEWARRAY.java b/src/main/java/org/apache/bcel/generic/NEWARRAY.java index 992d6f94..1cf1227e 100644 --- a/src/main/java/org/apache/bcel/generic/NEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/NEWARRAY.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/NOP.java b/src/main/java/org/apache/bcel/generic/NOP.java index b93d0adb..dea41f09 100644 --- a/src/main/java/org/apache/bcel/generic/NOP.java +++ b/src/main/java/org/apache/bcel/generic/NOP.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java index c301efa4..e49f695c 100644 --- a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java +++ b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/NamedAndTyped.java b/src/main/java/org/apache/bcel/generic/NamedAndTyped.java index 96e8b952..3a93a573 100644 --- a/src/main/java/org/apache/bcel/generic/NamedAndTyped.java +++ b/src/main/java/org/apache/bcel/generic/NamedAndTyped.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index fb07493e..17e5b661 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/POP.java b/src/main/java/org/apache/bcel/generic/POP.java index d23874e9..df47a57d 100644 --- a/src/main/java/org/apache/bcel/generic/POP.java +++ b/src/main/java/org/apache/bcel/generic/POP.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/POP2.java b/src/main/java/org/apache/bcel/generic/POP2.java index 31a5b917..4bfff24e 100644 --- a/src/main/java/org/apache/bcel/generic/POP2.java +++ b/src/main/java/org/apache/bcel/generic/POP2.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/PUSH.java b/src/main/java/org/apache/bcel/generic/PUSH.java index 16a89ff6..add84d23 100644 --- a/src/main/java/org/apache/bcel/generic/PUSH.java +++ b/src/main/java/org/apache/bcel/generic/PUSH.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/PUTFIELD.java b/src/main/java/org/apache/bcel/generic/PUTFIELD.java index 889af619..ef84983f 100644 --- a/src/main/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/main/java/org/apache/bcel/generic/PUTFIELD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java index 4834506f..915bb8b3 100644 --- a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/PopInstruction.java b/src/main/java/org/apache/bcel/generic/PopInstruction.java index e4542b73..5b29045a 100644 --- a/src/main/java/org/apache/bcel/generic/PopInstruction.java +++ b/src/main/java/org/apache/bcel/generic/PopInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/PushInstruction.java b/src/main/java/org/apache/bcel/generic/PushInstruction.java index 378a3448..d568e01c 100644 --- a/src/main/java/org/apache/bcel/generic/PushInstruction.java +++ b/src/main/java/org/apache/bcel/generic/PushInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/RET.java b/src/main/java/org/apache/bcel/generic/RET.java index 5430078d..d8758ea6 100644 --- a/src/main/java/org/apache/bcel/generic/RET.java +++ b/src/main/java/org/apache/bcel/generic/RET.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/RETURN.java b/src/main/java/org/apache/bcel/generic/RETURN.java index ab73c1ad..48f9003a 100644 --- a/src/main/java/org/apache/bcel/generic/RETURN.java +++ b/src/main/java/org/apache/bcel/generic/RETURN.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ReferenceType.java b/src/main/java/org/apache/bcel/generic/ReferenceType.java index 574b4b38..f145bea0 100644 --- a/src/main/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/main/java/org/apache/bcel/generic/ReferenceType.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ReturnInstruction.java b/src/main/java/org/apache/bcel/generic/ReturnInstruction.java index 57b2087b..e30b44d4 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ReturnInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java index 83a9be0c..4a32ca43 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/SALOAD.java b/src/main/java/org/apache/bcel/generic/SALOAD.java index 3953a307..69795702 100644 --- a/src/main/java/org/apache/bcel/generic/SALOAD.java +++ b/src/main/java/org/apache/bcel/generic/SALOAD.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/SASTORE.java b/src/main/java/org/apache/bcel/generic/SASTORE.java index 50b7097e..3c8e0f4f 100644 --- a/src/main/java/org/apache/bcel/generic/SASTORE.java +++ b/src/main/java/org/apache/bcel/generic/SASTORE.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/SIPUSH.java b/src/main/java/org/apache/bcel/generic/SIPUSH.java index 8bddec1f..120f25bc 100644 --- a/src/main/java/org/apache/bcel/generic/SIPUSH.java +++ b/src/main/java/org/apache/bcel/generic/SIPUSH.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/SWAP.java b/src/main/java/org/apache/bcel/generic/SWAP.java index e99b7b60..76e73fa7 100644 --- a/src/main/java/org/apache/bcel/generic/SWAP.java +++ b/src/main/java/org/apache/bcel/generic/SWAP.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/SWITCH.java b/src/main/java/org/apache/bcel/generic/SWITCH.java index d978ef0c..458cf747 100644 --- a/src/main/java/org/apache/bcel/generic/SWITCH.java +++ b/src/main/java/org/apache/bcel/generic/SWITCH.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index db7d1a7a..48a76428 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java index 93c6992d..a2a3a0a1 100644 --- a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/StackConsumer.java b/src/main/java/org/apache/bcel/generic/StackConsumer.java index ab58c1ae..790c3104 100644 --- a/src/main/java/org/apache/bcel/generic/StackConsumer.java +++ b/src/main/java/org/apache/bcel/generic/StackConsumer.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/StackInstruction.java b/src/main/java/org/apache/bcel/generic/StackInstruction.java index 406ca22d..e895cacc 100644 --- a/src/main/java/org/apache/bcel/generic/StackInstruction.java +++ b/src/main/java/org/apache/bcel/generic/StackInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/StackProducer.java b/src/main/java/org/apache/bcel/generic/StackProducer.java index 75ef0eaa..82e481e7 100644 --- a/src/main/java/org/apache/bcel/generic/StackProducer.java +++ b/src/main/java/org/apache/bcel/generic/StackProducer.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/StoreInstruction.java b/src/main/java/org/apache/bcel/generic/StoreInstruction.java index a8fa43a1..d2cfac9b 100644 --- a/src/main/java/org/apache/bcel/generic/StoreInstruction.java +++ b/src/main/java/org/apache/bcel/generic/StoreInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java index d11d6a8b..e1d59b17 100644 --- a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/TargetLostException.java b/src/main/java/org/apache/bcel/generic/TargetLostException.java index c19c1125..91f53270 100644 --- a/src/main/java/org/apache/bcel/generic/TargetLostException.java +++ b/src/main/java/org/apache/bcel/generic/TargetLostException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 418ac60a..98565d29 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/TypedInstruction.java b/src/main/java/org/apache/bcel/generic/TypedInstruction.java index 835786e8..a91a25ee 100644 --- a/src/main/java/org/apache/bcel/generic/TypedInstruction.java +++ b/src/main/java/org/apache/bcel/generic/TypedInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java b/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java index ba62a2f3..1996af12 100644 --- a/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java +++ b/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java b/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java index b70978bf..fe7630a6 100644 --- a/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java +++ b/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/generic/Visitor.java b/src/main/java/org/apache/bcel/generic/Visitor.java index 8c001ac3..26802ea8 100644 --- a/src/main/java/org/apache/bcel/generic/Visitor.java +++ b/src/main/java/org/apache/bcel/generic/Visitor.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.generic; diff --git a/src/main/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java index 78898ae2..c1ff0b0e 100644 --- a/src/main/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/main/java/org/apache/bcel/util/AttributeHTML.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/BCELComparator.java b/src/main/java/org/apache/bcel/util/BCELComparator.java index 264fa001..5b56f652 100644 --- a/src/main/java/org/apache/bcel/util/BCELComparator.java +++ b/src/main/java/org/apache/bcel/util/BCELComparator.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index 39761e9f..04278047 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/BCELifier.java b/src/main/java/org/apache/bcel/util/BCELifier.java index a17fad37..6bf2f539 100644 --- a/src/main/java/org/apache/bcel/util/BCELifier.java +++ b/src/main/java/org/apache/bcel/util/BCELifier.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/ByteSequence.java b/src/main/java/org/apache/bcel/util/ByteSequence.java index 908f61f6..74b5be75 100644 --- a/src/main/java/org/apache/bcel/util/ByteSequence.java +++ b/src/main/java/org/apache/bcel/util/ByteSequence.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index d2a384a7..8dc324a4 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/ClassLoader.java b/src/main/java/org/apache/bcel/util/ClassLoader.java index 5c3823ad..ee897d8e 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoader.java +++ b/src/main/java/org/apache/bcel/util/ClassLoader.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java index 394e2c50..3c558b6b 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 10b3541e..bf3b1336 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/ClassQueue.java b/src/main/java/org/apache/bcel/util/ClassQueue.java index 81adbee2..e33b593e 100644 --- a/src/main/java/org/apache/bcel/util/ClassQueue.java +++ b/src/main/java/org/apache/bcel/util/ClassQueue.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/ClassSet.java b/src/main/java/org/apache/bcel/util/ClassSet.java index f1ac15ae..c0444aa3 100644 --- a/src/main/java/org/apache/bcel/util/ClassSet.java +++ b/src/main/java/org/apache/bcel/util/ClassSet.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/ClassStack.java b/src/main/java/org/apache/bcel/util/ClassStack.java index d88fee4c..125b6828 100644 --- a/src/main/java/org/apache/bcel/util/ClassStack.java +++ b/src/main/java/org/apache/bcel/util/ClassStack.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/ClassVector.java b/src/main/java/org/apache/bcel/util/ClassVector.java index 97928fe4..6051d746 100644 --- a/src/main/java/org/apache/bcel/util/ClassVector.java +++ b/src/main/java/org/apache/bcel/util/ClassVector.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 5dbacb9a..1d1f755c 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/ConstantHTML.java b/src/main/java/org/apache/bcel/util/ConstantHTML.java index 58b97d36..3fa1c1a2 100644 --- a/src/main/java/org/apache/bcel/util/ConstantHTML.java +++ b/src/main/java/org/apache/bcel/util/ConstantHTML.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index c70143b5..85ea0ee4 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/JavaWrapper.java b/src/main/java/org/apache/bcel/util/JavaWrapper.java index 833e611c..19a5205b 100644 --- a/src/main/java/org/apache/bcel/util/JavaWrapper.java +++ b/src/main/java/org/apache/bcel/util/JavaWrapper.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/MethodHTML.java b/src/main/java/org/apache/bcel/util/MethodHTML.java index 6eed13a6..0d976068 100644 --- a/src/main/java/org/apache/bcel/util/MethodHTML.java +++ b/src/main/java/org/apache/bcel/util/MethodHTML.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/Repository.java b/src/main/java/org/apache/bcel/util/Repository.java index 2ff5e164..9442697c 100644 --- a/src/main/java/org/apache/bcel/util/Repository.java +++ b/src/main/java/org/apache/bcel/util/Repository.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index fd23a036..df21707f 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.util; diff --git a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java index 264068a6..19ddf7dc 100644 --- a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier; diff --git a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java index 26f70eed..6ce355c6 100644 --- a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier; diff --git a/src/main/java/org/apache/bcel/verifier/PassVerifier.java b/src/main/java/org/apache/bcel/verifier/PassVerifier.java index c8e33f85..4d1a3c9e 100644 --- a/src/main/java/org/apache/bcel/verifier/PassVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/PassVerifier.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier; diff --git a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java index e5156514..c49579a4 100644 --- a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java +++ b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier; diff --git a/src/main/java/org/apache/bcel/verifier/VerificationResult.java b/src/main/java/org/apache/bcel/verifier/VerificationResult.java index 112f78e6..1dca32ba 100644 --- a/src/main/java/org/apache/bcel/verifier/VerificationResult.java +++ b/src/main/java/org/apache/bcel/verifier/VerificationResult.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier; diff --git a/src/main/java/org/apache/bcel/verifier/Verifier.java b/src/main/java/org/apache/bcel/verifier/Verifier.java index 2d358a05..5d862729 100644 --- a/src/main/java/org/apache/bcel/verifier/Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/Verifier.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier; diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index 752f2c3d..c649db3a 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier; diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java index 00638b12..91218254 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier; diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index ad128fab..fa2a102f 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier; diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java index 192004de..7a0fd298 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier; diff --git a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java index 5befe2f8..93e48049 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java +++ b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java @@ -1,9 +1,10 @@ /* - * Copyright 2000-2009 The Apache Software Foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * @@ -11,9 +12,9 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. - * + * limitations under the License. */ + package org.apache.bcel.verifier; import java.awt.Color; diff --git a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java index 841d0ad4..0cb8da14 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java index b397850f..d85e4a56 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java index b62f583f..29b1483f 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java index ae4f1b8c..0dad66e5 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java index d5044ffc..01670400 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java index 0ab03d2c..18256f85 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java index d78b2ab9..5d394787 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java index f74374f5..a087e17f 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java index abcac027..894b51be 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java index 623c20c1..61d0d54d 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java index fafcad5b..9b155556 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/Utility.java b/src/main/java/org/apache/bcel/verifier/exc/Utility.java index 0ad9b2b7..99a60e2e 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/Utility.java +++ b/src/main/java/org/apache/bcel/verifier/exc/Utility.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java index 7b03559c..2df00f36 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java index 9756fd50..7a8e2c79 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.exc; diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java index 05a99ca3..ba241e1f 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.statics; diff --git a/src/main/java/org/apache/bcel/verifier/statics/IntList.java b/src/main/java/org/apache/bcel/verifier/statics/IntList.java index 3d238858..737d2858 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/IntList.java +++ b/src/main/java/org/apache/bcel/verifier/statics/IntList.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.statics; diff --git a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java index 1e67051a..7a6190f9 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.statics; diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java index 0f24f2ee..e34161db 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.statics; diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java index cad7a841..2680e5d0 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.statics; diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index 0edeb642..0831ab9f 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.statics; diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index b18ab9eb..8041b489 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.statics; diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index c06a1757..8e579b54 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.statics; diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 499d0578..3f294ab0 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.statics; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index d8c3a948..87c06f86 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java index 592b6bf1..0a33f0f6 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index d54f5344..42d58df3 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index 85532668..68bffd32 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Frame.java b/src/main/java/org/apache/bcel/verifier/structurals/Frame.java index 8dd44e7a..0e3a4c7b 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Frame.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Frame.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java b/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java index 8c5e7794..24b3a87e 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index c675c003..84ecf30f 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java index dea83661..37a93837 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java index af7ed1f8..94f650f3 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java index 69664614..293f9f92 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 24035a46..98abb175 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java index 6d0f12e7..c6dac021 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index ccd29747..8e99dcf7 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index 042c537f..dca5f186 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -12,7 +12,7 @@ * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and - * limitations under the License. + * limitations under the License. * */ package org.apache.bcel.verifier.structurals; -- GitLab From e72325cc05582241f875d7cf0d9b93bf6d597d19 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 26 Sep 2014 23:11:11 +0000 Subject: [PATCH 0683/1313] Updated the checkstyle rules git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1627908 13f79535-47bb-0310-9956-ffa450edef68 --- checkstyle.xml | 98 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 3 deletions(-) diff --git a/checkstyle.xml b/checkstyle.xml index 5a3135f0..5c56678c 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -41,11 +41,13 @@ limitations under the License. + @@ -57,12 +59,102 @@ limitations under the License. - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- GitLab From 16da93e87c3aadc8898f707055f4a6be727d83db Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sat, 27 Sep 2014 15:10:28 +0000 Subject: [PATCH 0684/1313] Update copyright. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1627975 13f79535-47bb-0310-9956-ffa450edef68 --- NOTICE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NOTICE.txt b/NOTICE.txt index 51ad358f..4ec1f05a 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,5 +1,5 @@ Apache Commons BCEL -Copyright 2004-2012 The Apache Software Foundation +Copyright 2004-2014 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). -- GitLab From d03f484bf4362d9cd81e35c02176ccadf4bddd4b Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sat, 27 Sep 2014 15:11:54 +0000 Subject: [PATCH 0685/1313] Remove unused imports. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1627976 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/structurals/InstructionContext.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java index 37a93837..6842fc01 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -19,8 +19,6 @@ package org.apache.bcel.verifier.structurals; import java.util.ArrayList; -import java.util.List; - import org.apache.bcel.generic.InstructionHandle; /** -- GitLab From ec55fc5aa1c06f1f6e6f5ba1f86fb4e56999655f Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sat, 27 Sep 2014 15:16:23 +0000 Subject: [PATCH 0686/1313] Add final modifier to private fields. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1627977 13f79535-47bb-0310-9956-ffa450edef68 --- .../classfile/AnnotationElementValue.java | 2 +- .../bcel/classfile/ArrayElementValue.java | 2 +- .../apache/bcel/classfile/ClassParser.java | 2 +- .../bcel/classfile/DescendingVisitor.java | 6 ++-- .../bcel/classfile/ElementValuePair.java | 6 ++-- .../bcel/classfile/EnumElementValue.java | 4 +-- .../classfile/ParameterAnnotationEntry.java | 4 +-- .../bcel/classfile/StackMapTableEntry.java | 2 +- .../org/apache/bcel/classfile/Unknown.java | 2 +- .../generic/AnnotationElementValueGen.java | 2 +- .../bcel/generic/AnnotationEntryGen.java | 2 +- .../bcel/generic/ArrayElementValueGen.java | 2 +- .../org/apache/bcel/generic/ClassGen.java | 13 ++++---- .../apache/bcel/generic/ConstantPoolGen.java | 10 +++---- .../bcel/generic/ElementValuePairGen.java | 4 +-- .../bcel/generic/FieldGenOrMethodGen.java | 2 +- .../org/apache/bcel/generic/MethodGen.java | 10 +++---- .../bcel/generic/TargetLostException.java | 2 +- .../org/apache/bcel/util/AttributeHTML.java | 8 ++--- .../java/org/apache/bcel/util/BCELifier.java | 6 ++-- .../org/apache/bcel/util/ByteSequence.java | 2 +- .../java/org/apache/bcel/util/Class2HTML.java | 4 +-- .../org/apache/bcel/util/ClassLoader.java | 4 +-- .../bcel/util/ClassLoaderRepository.java | 4 +-- .../java/org/apache/bcel/util/ClassPath.java | 8 ++--- .../java/org/apache/bcel/util/ClassSet.java | 2 +- .../java/org/apache/bcel/util/ClassStack.java | 2 +- .../java/org/apache/bcel/util/CodeHTML.java | 8 ++--- .../org/apache/bcel/util/ConstantHTML.java | 14 ++++----- .../apache/bcel/util/InstructionFinder.java | 2 +- .../org/apache/bcel/util/JavaWrapper.java | 2 +- .../java/org/apache/bcel/util/MethodHTML.java | 8 ++--- .../apache/bcel/util/SyntheticRepository.java | 2 +- .../apache/bcel/verifier/PassVerifier.java | 2 +- .../bcel/verifier/VerificationResult.java | 4 +-- .../org/apache/bcel/verifier/Verifier.java | 4 +-- .../bcel/verifier/VerifierAppFrame.java | 2 +- .../verifier/VerifierFactoryListModel.java | 4 +-- .../apache/bcel/verifier/statics/IntList.java | 2 +- .../verifier/statics/LocalVariableInfo.java | 4 +-- .../verifier/statics/LocalVariablesInfo.java | 2 +- .../bcel/verifier/statics/Pass1Verifier.java | 2 +- .../bcel/verifier/statics/Pass2Verifier.java | 30 +++++++++---------- .../bcel/verifier/statics/Pass3aVerifier.java | 6 ++-- .../statics/StringRepresentation.java | 2 +- .../structurals/ControlFlowGraph.java | 8 ++--- .../structurals/ExceptionHandler.java | 4 +-- .../structurals/ExceptionHandlers.java | 2 +- .../bcel/verifier/structurals/Frame.java | 4 +-- .../verifier/structurals/LocalVariables.java | 2 +- .../verifier/structurals/OperandStack.java | 2 +- .../verifier/structurals/Pass3bVerifier.java | 8 ++--- .../verifier/structurals/Subroutines.java | 6 ++-- .../structurals/UninitializedObjectType.java | 2 +- 54 files changed, 128 insertions(+), 127 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java index e4cfd97b..95c9c894 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java @@ -23,7 +23,7 @@ import java.io.IOException; public class AnnotationElementValue extends ElementValue { // For annotation element values, this is the annotation - private AnnotationEntry annotationEntry; + private final AnnotationEntry annotationEntry; public AnnotationElementValue(int type, AnnotationEntry annotationEntry, ConstantPool cpool) diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java index eb9d657a..98de2a72 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -23,7 +23,7 @@ import java.io.IOException; public class ArrayElementValue extends ElementValue { // For array types, this is the array - private ElementValue[] evalues; + private final ElementValue[] evalues; @Override public String toString() diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 1bdc6414..3fd0e356 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -56,7 +56,7 @@ public final class ClassParser { private Field[] fields; // class fields, i.e., its variables private Method[] methods; // methods defined in the class private Attribute[] attributes; // attributes defined in the class - private boolean is_zip; // Loaded from zip file + private final boolean is_zip; // Loaded from zip file private static final int BUFSIZE = 8192; diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index dac61473..a7527626 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -29,11 +29,11 @@ import java.util.Stack; */ public class DescendingVisitor implements Visitor { - private JavaClass clazz; + private final JavaClass clazz; - private Visitor visitor; + private final Visitor visitor; - private Stack stack = new Stack(); + private final Stack stack = new Stack(); /** * @return container of current entitity, i.e., predecessor during traversal diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index 159177e4..5866f2d2 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -30,11 +30,11 @@ import org.apache.bcel.Constants; */ public class ElementValuePair { - private ElementValue elementValue; + private final ElementValue elementValue; - private ConstantPool constantPool; + private final ConstantPool constantPool; - private int elementNameIndex; + private final int elementNameIndex; public ElementValuePair(int elementNameIndex, ElementValue elementValue, ConstantPool constantPool) diff --git a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java index e7b112dc..7e10be75 100644 --- a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java @@ -24,9 +24,9 @@ import org.apache.bcel.Constants; public class EnumElementValue extends ElementValue { // For enum types, these two indices point to the type and value - private int typeIdx; + private final int typeIdx; - private int valueIdx; + private final int valueIdx; public EnumElementValue(int type, int typeIdx, int valueIdx, ConstantPool cpool) diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index f2cd21b8..b4c09896 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -35,8 +35,8 @@ import org.apache.bcel.Constants; */ public class ParameterAnnotationEntry implements Node, Constants { - private int annotation_table_length; - private AnnotationEntry[] annotation_table; + private final int annotation_table_length; + private final AnnotationEntry[] annotation_table; /** diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index eeca12f3..24d3f4b5 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -38,7 +38,7 @@ public final class StackMapTableEntry implements Cloneable, Serializable { private static final long serialVersionUID = 1L; - private int frame_type; + private final int frame_type; private int byte_code_offset_delta; private int number_of_locals; private StackMapType[] types_of_locals; diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index f66c7afc..5441c773 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -42,7 +42,7 @@ public final class Unknown extends Attribute { private static final long serialVersionUID = -4099655108069755015L; private byte[] bytes; - private String name; + private final String name; private static final Map unknown_attributes = new HashMap(); diff --git a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java index 03bae8b0..d3c72d4e 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java @@ -25,7 +25,7 @@ import org.apache.bcel.classfile.ElementValue; public class AnnotationElementValueGen extends ElementValueGen { // For annotation element values, this is the annotation - private AnnotationEntryGen a; + private final AnnotationEntryGen a; public AnnotationElementValueGen(AnnotationEntryGen a, ConstantPoolGen cpool) { diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index a7266605..b8a08cae 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -34,7 +34,7 @@ public class AnnotationEntryGen private List evs; - private ConstantPoolGen cpool; + private final ConstantPoolGen cpool; private boolean isRuntimeVisible = false; diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index 749b3675..d2dc968f 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -29,7 +29,7 @@ public class ArrayElementValueGen extends ElementValueGen { // J5TODO: Should we make this an array or a list? A list would be easier to // modify ... - private List evalues; + private final List evalues; public ArrayElementValueGen(ConstantPoolGen cp) { diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 6027f41f..bffc726e 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -48,16 +48,17 @@ public class ClassGen extends AccessFlags implements Cloneable { private static final long serialVersionUID = 6880879387392827211L; /* Corresponds to the fields found in a JavaClass object. */ - private String class_name, super_class_name, file_name; + private String class_name, super_class_name; + private final String file_name; private int class_name_index = -1, superclass_name_index = -1; private int major = Constants.MAJOR_1_1, minor = Constants.MINOR_1_1; private ConstantPoolGen cp; // Template for building up constant pool // ArrayLists instead of arrays to gather fields, methods, etc. - private List field_vec = new ArrayList(); - private List method_vec = new ArrayList(); - private List attribute_vec = new ArrayList(); - private List interface_vec = new ArrayList(); - private List annotation_vec = new ArrayList(); + private final List field_vec = new ArrayList(); + private final List method_vec = new ArrayList(); + private final List attribute_vec = new ArrayList(); + private final List interface_vec = new ArrayList(); + private final List annotation_vec = new ArrayList(); private static BCELComparator _cmp = new BCELComparator() { diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index 726d3112..924cbdf2 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -186,7 +186,7 @@ public class ConstantPoolGen implements java.io.Serializable { } } - private Map string_table = new HashMap(); + private final Map string_table = new HashMap(); /** @@ -223,7 +223,7 @@ public class ConstantPoolGen implements java.io.Serializable { return ret; } - private Map class_table = new HashMap(); + private final Map class_table = new HashMap(); /** @@ -362,7 +362,7 @@ public class ConstantPoolGen implements java.io.Serializable { return ret; } - private Map utf8_table = new HashMap(); + private final Map utf8_table = new HashMap(); /** @@ -474,7 +474,7 @@ public class ConstantPoolGen implements java.io.Serializable { return ret; } - private Map n_a_t_table = new HashMap(); + private final Map n_a_t_table = new HashMap(); /** @@ -516,7 +516,7 @@ public class ConstantPoolGen implements java.io.Serializable { return ret; } - private Map cp_table = new HashMap(); + private final Map cp_table = new HashMap(); /** diff --git a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java index 707f7665..5bce1b26 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java @@ -27,9 +27,9 @@ public class ElementValuePairGen { private int nameIdx; - private ElementValueGen value; + private final ElementValueGen value; - private ConstantPoolGen cpool; + private final ConstantPoolGen cpool; public ElementValuePairGen(ElementValuePair nvp, ConstantPoolGen cpool, boolean copyPoolEntries) diff --git a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 404eb0e8..ca8dac34 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -37,7 +37,7 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn protected String name; protected Type type; protected ConstantPoolGen cp; - private List attribute_vec = new ArrayList(); + private final List attribute_vec = new ArrayList(); protected List annotation_vec= new ArrayList(); diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 51792abe..8cce2218 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -69,11 +69,11 @@ public class MethodGen extends FieldGenOrMethodGen { private int max_stack; private InstructionList il; private boolean strip_attributes; - private List variable_vec = new ArrayList(); - private List line_number_vec = new ArrayList(); - private List exception_vec = new ArrayList(); - private List throws_vec = new ArrayList(); - private List code_attrs_vec = new ArrayList(); + private final List variable_vec = new ArrayList(); + private final List line_number_vec = new ArrayList(); + private final List exception_vec = new ArrayList(); + private final List throws_vec = new ArrayList(); + private final List code_attrs_vec = new ArrayList(); private List[] param_annotations; // Array of lists containing AnnotationGen objects private boolean hasParameterAnnotations = false; diff --git a/src/main/java/org/apache/bcel/generic/TargetLostException.java b/src/main/java/org/apache/bcel/generic/TargetLostException.java index 91f53270..e6188889 100644 --- a/src/main/java/org/apache/bcel/generic/TargetLostException.java +++ b/src/main/java/org/apache/bcel/generic/TargetLostException.java @@ -51,7 +51,7 @@ package org.apache.bcel.generic; public final class TargetLostException extends Exception { private static final long serialVersionUID = -6857272667645328384L; - private InstructionHandle[] targets; + private final InstructionHandle[] targets; TargetLostException(InstructionHandle[] t, String mesg) { diff --git a/src/main/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java index c1ff0b0e..e586742d 100644 --- a/src/main/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/main/java/org/apache/bcel/util/AttributeHTML.java @@ -45,11 +45,11 @@ import org.apache.bcel.classfile.Utility; */ final class AttributeHTML implements org.apache.bcel.Constants { - private String class_name; // name of current class - private PrintWriter file; // file to write to + private final String class_name; // name of current class + private final PrintWriter file; // file to write to private int attr_count = 0; - private ConstantHTML constant_html; - private ConstantPool constant_pool; + private final ConstantHTML constant_html; + private final ConstantPool constant_pool; AttributeHTML(String dir, String class_name, ConstantPool constant_pool, diff --git a/src/main/java/org/apache/bcel/util/BCELifier.java b/src/main/java/org/apache/bcel/util/BCELifier.java index 6bf2f539..b50f9a5e 100644 --- a/src/main/java/org/apache/bcel/util/BCELifier.java +++ b/src/main/java/org/apache/bcel/util/BCELifier.java @@ -48,9 +48,9 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { private static final int FLAG_FOR_UNKNOWN = -1; private static final int FLAG_FOR_CLASS = 0; private static final int FLAG_FOR_METHOD = 1; - private JavaClass _clazz; - private PrintWriter _out; - private ConstantPoolGen _cp; + private final JavaClass _clazz; + private final PrintWriter _out; + private final ConstantPoolGen _cp; /** @param clazz Java class to "decompile" diff --git a/src/main/java/org/apache/bcel/util/ByteSequence.java b/src/main/java/org/apache/bcel/util/ByteSequence.java index 74b5be75..72541ee8 100644 --- a/src/main/java/org/apache/bcel/util/ByteSequence.java +++ b/src/main/java/org/apache/bcel/util/ByteSequence.java @@ -30,7 +30,7 @@ import java.io.DataInputStream; */ public final class ByteSequence extends DataInputStream { - private ByteArrayStream byteStream; + private final ByteArrayStream byteStream; public ByteSequence(byte[] bytes) { diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index 8dc324a4..4c7a1829 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -53,8 +53,8 @@ import org.apache.bcel.classfile.Utility; */ public class Class2HTML implements Constants { - private JavaClass java_class; // current class object - private String dir; + private final JavaClass java_class; // current class object + private final String dir; private static String class_package; // name of package, unclean to make it static, but ... private static String class_name; // name of current class, dito private static ConstantPool constant_pool; diff --git a/src/main/java/org/apache/bcel/util/ClassLoader.java b/src/main/java/org/apache/bcel/util/ClassLoader.java index ee897d8e..dee61fcc 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoader.java +++ b/src/main/java/org/apache/bcel/util/ClassLoader.java @@ -57,8 +57,8 @@ public class ClassLoader extends java.lang.ClassLoader { public static final String[] DEFAULT_IGNORED_PACKAGES = { "java.", "javax.", "sun." }; - private Hashtable> classes = new Hashtable>(); // Hashtable is synchronized thus thread-safe - private String[] ignored_packages; + private final Hashtable> classes = new Hashtable>(); // Hashtable is synchronized thus thread-safe + private final String[] ignored_packages; private Repository repository = SyntheticRepository.getInstance(); diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java index 3c558b6b..ab305e65 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -40,8 +40,8 @@ import org.apache.bcel.classfile.JavaClass; public class ClassLoaderRepository implements Repository { private static final long serialVersionUID = -1052781833503868187L; - private java.lang.ClassLoader loader; - private Map loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS + private final java.lang.ClassLoader loader; + private final Map loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS public ClassLoaderRepository(java.lang.ClassLoader loader) { diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index bf3b1336..0a6f5185 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -55,8 +55,8 @@ public class ClassPath implements Serializable { } }; - private PathEntry[] paths; - private String class_path; + private final PathEntry[] paths; + private final String class_path; private ClassPath parent; public ClassPath(ClassPath parent, String class_path) { @@ -401,7 +401,7 @@ public class ClassPath implements Serializable { private static class Dir extends PathEntry { private static final long serialVersionUID = 4374062802142373088L; - private String dir; + private final String dir; Dir(String d) { @@ -476,7 +476,7 @@ public class ClassPath implements Serializable { private static class Zip extends PathEntry { private static final long serialVersionUID = -2210747632897905532L; - private ZipFile zip; + private final ZipFile zip; Zip(ZipFile z) { diff --git a/src/main/java/org/apache/bcel/util/ClassSet.java b/src/main/java/org/apache/bcel/util/ClassSet.java index c0444aa3..5c705062 100644 --- a/src/main/java/org/apache/bcel/util/ClassSet.java +++ b/src/main/java/org/apache/bcel/util/ClassSet.java @@ -34,7 +34,7 @@ import org.apache.bcel.classfile.JavaClass; public class ClassSet implements java.io.Serializable { private static final long serialVersionUID = -7476907380350035254L; - private Map _map = new HashMap(); + private final Map _map = new HashMap(); public boolean add( JavaClass clazz ) { diff --git a/src/main/java/org/apache/bcel/util/ClassStack.java b/src/main/java/org/apache/bcel/util/ClassStack.java index 125b6828..a59cb98f 100644 --- a/src/main/java/org/apache/bcel/util/ClassStack.java +++ b/src/main/java/org/apache/bcel/util/ClassStack.java @@ -30,7 +30,7 @@ import org.apache.bcel.classfile.JavaClass; public class ClassStack implements java.io.Serializable { private static final long serialVersionUID = 6126079269396985982L; - private Stack stack = new Stack(); + private final Stack stack = new Stack(); public void push( JavaClass clazz ) { diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 1d1f755c..6fa29453 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -43,12 +43,12 @@ import org.apache.bcel.classfile.Utility; */ final class CodeHTML implements org.apache.bcel.Constants { - private String class_name; // name of current class + private final String class_name; // name of current class // private Method[] methods; // Methods to print - private PrintWriter file; // file to write to + private final PrintWriter file; // file to write to private BitSet goto_set; - private ConstantPool constant_pool; - private ConstantHTML constant_html; + private final ConstantPool constant_pool; + private final ConstantHTML constant_html; private static boolean wide = false; diff --git a/src/main/java/org/apache/bcel/util/ConstantHTML.java b/src/main/java/org/apache/bcel/util/ConstantHTML.java index 3fa1c1a2..cf654749 100644 --- a/src/main/java/org/apache/bcel/util/ConstantHTML.java +++ b/src/main/java/org/apache/bcel/util/ConstantHTML.java @@ -40,13 +40,13 @@ import org.apache.bcel.classfile.Utility; */ final class ConstantHTML implements org.apache.bcel.Constants { - private String class_name; // name of current class - private String class_package; // name of package - private ConstantPool constant_pool; // reference to constant pool - private PrintWriter file; // file to write to - private String[] constant_ref; // String to return for cp[i] - private Constant[] constants; // The constants in the cp - private Method[] methods; + private final String class_name; // name of current class + private final String class_package; // name of package + private final ConstantPool constant_pool; // reference to constant pool + private final PrintWriter file; // file to write to + private final String[] constant_ref; // String to return for cp[i] + private final Constant[] constants; // The constants in the cp + private final Method[] methods; ConstantHTML(String dir, String class_name, String class_package, Method[] methods, diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index 85ea0ee4..ecf9e189 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -74,7 +74,7 @@ public class InstructionFinder { private static final int NO_OPCODES = 256; // Potential number, // some are not used private static final Map map = new HashMap(); - private InstructionList il; + private final InstructionList il; private String il_string; // instruction list // as string private InstructionHandle[] handles; // map instruction diff --git a/src/main/java/org/apache/bcel/util/JavaWrapper.java b/src/main/java/org/apache/bcel/util/JavaWrapper.java index 19a5205b..10d3104b 100644 --- a/src/main/java/org/apache/bcel/util/JavaWrapper.java +++ b/src/main/java/org/apache/bcel/util/JavaWrapper.java @@ -38,7 +38,7 @@ import java.lang.reflect.Modifier; */ public class JavaWrapper { - private java.lang.ClassLoader loader; + private final java.lang.ClassLoader loader; private static java.lang.ClassLoader getClassLoader() { diff --git a/src/main/java/org/apache/bcel/util/MethodHTML.java b/src/main/java/org/apache/bcel/util/MethodHTML.java index 0d976068..a09cd817 100644 --- a/src/main/java/org/apache/bcel/util/MethodHTML.java +++ b/src/main/java/org/apache/bcel/util/MethodHTML.java @@ -37,10 +37,10 @@ import org.apache.bcel.classfile.Utility; */ final class MethodHTML implements org.apache.bcel.Constants { - private String class_name; // name of current class - private PrintWriter file; // file to write to - private ConstantHTML constant_html; - private AttributeHTML attribute_html; + private final String class_name; // name of current class + private final PrintWriter file; // file to write to + private final ConstantHTML constant_html; + private final AttributeHTML attribute_html; MethodHTML(String dir, String class_name, Method[] methods, Field[] fields, diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index df21707f..1d096c19 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -47,7 +47,7 @@ public class SyntheticRepository implements Repository { //private static final String DEFAULT_PATH = ClassPath.getClassPath(); private static final Map _instances = new HashMap(); // CLASSPATH X REPOSITORY private ClassPath _path = null; - private Map> _loadedClasses = new HashMap>(); // CLASSNAME X JAVACLASS + private final Map> _loadedClasses = new HashMap>(); // CLASSNAME X JAVACLASS private SyntheticRepository(ClassPath path) { diff --git a/src/main/java/org/apache/bcel/verifier/PassVerifier.java b/src/main/java/org/apache/bcel/verifier/PassVerifier.java index 4d1a3c9e..d4308d0a 100644 --- a/src/main/java/org/apache/bcel/verifier/PassVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/PassVerifier.java @@ -49,7 +49,7 @@ import java.util.List; public abstract class PassVerifier { /** The (warning) messages. */ - private List messages = new ArrayList(); + private final List messages = new ArrayList(); /** The VerificationResult cache. */ private VerificationResult verificationResult = null; diff --git a/src/main/java/org/apache/bcel/verifier/VerificationResult.java b/src/main/java/org/apache/bcel/verifier/VerificationResult.java index 1dca32ba..88651897 100644 --- a/src/main/java/org/apache/bcel/verifier/VerificationResult.java +++ b/src/main/java/org/apache/bcel/verifier/VerificationResult.java @@ -57,10 +57,10 @@ public class VerificationResult { public static final VerificationResult VR_OK = new VerificationResult(VERIFIED_OK, VERIFIED_OK_MSG); /** The numeric status. */ - private int numeric; + private final int numeric; /** The detailed message. */ - private String detailMessage; + private final String detailMessage; /** The usual constructor. */ diff --git a/src/main/java/org/apache/bcel/verifier/Verifier.java b/src/main/java/org/apache/bcel/verifier/Verifier.java index 5d862729..fd2a0af9 100644 --- a/src/main/java/org/apache/bcel/verifier/Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/Verifier.java @@ -55,9 +55,9 @@ public class Verifier { /** A Pass2Verifier for this Verifier instance. */ private Pass2Verifier p2v; /** The Pass3aVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ - private Map p3avs = new HashMap(); + private final Map p3avs = new HashMap(); /** The Pass3bVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ - private Map p3bvs = new HashMap(); + private final Map p3bvs = new HashMap(); /** Returns the VerificationResult for the given pass. */ diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index c649db3a..c540587c 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -70,7 +70,7 @@ public class VerifierAppFrame extends JFrame { GridLayout gridLayout4 = new GridLayout(); JScrollPane jScrollPane4 = new JScrollPane(); CardLayout cardLayout1 = new CardLayout(); - private String JUSTICE_VERSION = "JustIce by Enver Haase"; + private final String JUSTICE_VERSION = "JustIce by Enver Haase"; private String current_class; GridLayout gridLayout3 = new GridLayout(); JTextPane pass1TextPane = new JTextPane(); diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index fa2a102f..fe9a986d 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -35,8 +35,8 @@ import javax.swing.event.ListDataListener; public class VerifierFactoryListModel implements org.apache.bcel.verifier.VerifierFactoryObserver, javax.swing.ListModel { - private List listeners = new ArrayList(); - private Set cache = new TreeSet(); + private final List listeners = new ArrayList(); + private final Set cache = new TreeSet(); public VerifierFactoryListModel() { diff --git a/src/main/java/org/apache/bcel/verifier/statics/IntList.java b/src/main/java/org/apache/bcel/verifier/statics/IntList.java index 737d2858..64c4e463 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/IntList.java +++ b/src/main/java/org/apache/bcel/verifier/statics/IntList.java @@ -29,7 +29,7 @@ import java.util.List; */ public class IntList{ /** The int are stored as Integer objects here. */ - private List theList; + private final List theList; /** This constructor creates an empty list. */ IntList(){ theList = new ArrayList(); diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java index e34161db..719b4fc9 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java @@ -34,9 +34,9 @@ import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; public class LocalVariableInfo{ /** The types database. KEY: String representing the offset integer. */ - private Hashtable types = new Hashtable(); + private final Hashtable types = new Hashtable(); /** The names database. KEY: String representing the offset integer. */ - private Hashtable names = new Hashtable(); + private final Hashtable names = new Hashtable(); /** * Adds a name of a local variable and a certain slot to our 'names' diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java index 2680e5d0..9730007d 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java @@ -33,7 +33,7 @@ import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; public class LocalVariablesInfo{ /** The information about the local variables is stored here. */ - private LocalVariableInfo[] localVariableInfos; + private final LocalVariableInfo[] localVariableInfos; /** The constructor. */ LocalVariablesInfo(int max_locals){ diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index 0831ab9f..1d9ba412 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -47,7 +47,7 @@ public final class Pass1Verifier extends PassVerifier{ /** * The Verifier that created this. */ - private Verifier myOwner; + private final Verifier myOwner; /** Used to load in and return the myOwner-matching JavaClass object when needed. Avoids loading in a class file when it's not really needed! */ private JavaClass getJavaClass(){ diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 8041b489..b06a1f15 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -93,7 +93,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ private LocalVariablesInfo[] localVariablesInfos; /** The Verifier that created this. */ - private Verifier myOwner; + private final Verifier myOwner; /** * Should only be instantiated by a Verifier. @@ -307,28 +307,28 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * @see #constant_pool_entries_satisfy_static_constraints() */ private class CPESSC_Visitor extends org.apache.bcel.classfile.EmptyVisitor{ - private Class CONST_Class; + private final Class CONST_Class; /* private Class CONST_Fieldref; private Class CONST_Methodref; private Class CONST_InterfaceMethodref; */ - private Class CONST_String; - private Class CONST_Integer; - private Class CONST_Float; - private Class CONST_Long; - private Class CONST_Double; - private Class CONST_NameAndType; - private Class CONST_Utf8; + private final Class CONST_String; + private final Class CONST_Integer; + private final Class CONST_Float; + private final Class CONST_Long; + private final Class CONST_Double; + private final Class CONST_NameAndType; + private final Class CONST_Utf8; private final JavaClass jc; private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work and computing power. private final int cplen; // == cp.getLength() -- to save computing power. - private DescendingVisitor carrier; + private final DescendingVisitor carrier; - private Set field_names = new HashSet(); - private Set field_names_and_desc = new HashSet(); - private Set method_names_and_desc = new HashSet(); + private final Set field_names = new HashSet(); + private final Set field_names_and_desc = new HashSet(); + private final Set method_names_and_desc = new HashSet(); private CPESSC_Visitor(JavaClass _jc){ jc = _jc; @@ -1442,8 +1442,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ */ private static class InnerClassDetector extends EmptyVisitor{ private boolean hasInnerClass = false; - private JavaClass jc; - private ConstantPool cp; + private final JavaClass jc; + private final ConstantPool cp; /** Constructs an InnerClassDetector working on the JavaClass _jc. */ public InnerClassDetector(JavaClass _jc){ diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 8e579b54..bdef8de3 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -112,14 +112,14 @@ import org.apache.bcel.verifier.exc.StaticCodeInstructionOperandConstraintExcept public final class Pass3aVerifier extends PassVerifier{ /** The Verifier that created this. */ - private Verifier myOwner; + private final Verifier myOwner; /** * The method number to verify. * This is the index in the array returned * by JavaClass.getMethods(). */ - private int method_no; + private final int method_no; /** The one and only InstructionList object used by an instance of this class. It's here for performance reasons by do_verify() and its callees. */ InstructionList instructionList; @@ -444,7 +444,7 @@ public final class Pass3aVerifier extends PassVerifier{ */ private class InstOperandConstraintVisitor extends org.apache.bcel.generic.EmptyVisitor{ /** The ConstantPoolGen instance this Visitor operates on. */ - private ConstantPoolGen cpg; + private final ConstantPoolGen cpg; /** The only Constructor. */ InstOperandConstraintVisitor(ConstantPoolGen cpg){ diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 3f294ab0..04761807 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -77,7 +77,7 @@ public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor /** The string representation, created by a visitXXX() method, output by toString(). */ private String tostring; /** The node we ask for its string representation. Not really needed; only for debug output. */ - private Node n; + private final Node n; /** * Creates a new StringRepresentation object which is the representation of n. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index 87c06f86..3d28b05b 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -62,17 +62,17 @@ public class ControlFlowGraph{ /** * The InstructionHandle this InstructionContext is wrapped around. */ - private InstructionHandle instruction; + private final InstructionHandle instruction; /** * The 'incoming' execution Frames. */ - private Map inFrames; // key: the last-executed JSR + private final Map inFrames; // key: the last-executed JSR /** * The 'outgoing' execution Frames. */ - private Map outFrames; // key: the last-executed JSR + private final Map outFrames; // key: the last-executed JSR /** * The 'execution predecessors' - a list of type InstructionContext @@ -395,7 +395,7 @@ public class ControlFlowGraph{ private final ExceptionHandlers exceptionhandlers; /** All InstructionContext instances of this ControlFlowGraph. */ - private Map instructionContexts = new HashMap(); //keys: InstructionHandle, values: InstructionContextImpl + private final Map instructionContexts = new HashMap(); //keys: InstructionHandle, values: InstructionContextImpl /** * A Control Flow Graph. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java index 0a33f0f6..75dbb127 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java @@ -31,10 +31,10 @@ import org.apache.bcel.generic.ObjectType; */ public class ExceptionHandler{ /** The type of the exception to catch. NULL means ANY. */ - private ObjectType catchtype; + private final ObjectType catchtype; /** The InstructionHandle where the handling begins. */ - private InstructionHandle handlerpc; + private final InstructionHandle handlerpc; /** Leave instance creation to JustIce. */ ExceptionHandler(ObjectType catch_type, InstructionHandle handler_pc){ diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index 42d58df3..22bab054 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -38,7 +38,7 @@ public class ExceptionHandlers{ * The ExceptionHandler instances. * Key: InstructionHandle objects, Values: HashSet instances. */ - private Map> exceptionhandlers; + private final Map> exceptionhandlers; /** * Constructor. Creates a new ExceptionHandlers instance. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Frame.java b/src/main/java/org/apache/bcel/verifier/structurals/Frame.java index 0e3a4c7b..953f099c 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Frame.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Frame.java @@ -40,12 +40,12 @@ public class Frame{ /** * */ - private LocalVariables locals; + private final LocalVariables locals; /** * */ - private OperandStack stack; + private final OperandStack stack; /** * diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 94f650f3..c1e4a085 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -32,7 +32,7 @@ import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; */ public class LocalVariables{ /** The Type[] containing the local variable slots. */ - private Type[] locals; + private final Type[] locals; /** * Creates a new LocalVariables object. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java index 293f9f92..155d303b 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -39,7 +39,7 @@ public class OperandStack{ private ArrayList stack = new ArrayList(); /** The maximum number of stack slots this OperandStack instance may hold. */ - private int maxStack; + private final int maxStack; /** * Creates an empty stack with a maximum of maxStack slots. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 98abb175..4d5e30f2 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -79,8 +79,8 @@ public final class Pass3bVerifier extends PassVerifier{ * we have about its symbolic execution predecessors. */ private static final class InstructionContextQueue{ - private List ics = new Vector(); - private List> ecs = new Vector>(); + private final List ics = new Vector(); + private final List> ecs = new Vector>(); public void add(InstructionContext ic, ArrayList executionChain){ ics.add(ic); ecs.add(executionChain); @@ -107,10 +107,10 @@ public final class Pass3bVerifier extends PassVerifier{ private static final boolean DEBUG = true; /** The Verifier that created this. */ - private Verifier myOwner; + private final Verifier myOwner; /** The method number to verify. */ - private int method_no; + private final int method_no; /** * This class should only be instantiated by a Verifier. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index 8e99dcf7..29277498 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -86,7 +86,7 @@ public class Subroutines{ private int localVariable = UNSET; /** The instructions that belong to this subroutine. */ - private Set instructions = new HashSet(); // Elements: InstructionHandle + private final Set instructions = new HashSet(); // Elements: InstructionHandle /* * Refer to the Subroutine interface for documentation. @@ -99,7 +99,7 @@ public class Subroutines{ * The JSR or JSR_W instructions that define this * subroutine by targeting it. */ - private Set theJSRs = new HashSet(); + private final Set theJSRs = new HashSet(); /** * The RET instruction that leaves this subroutine. @@ -345,7 +345,7 @@ public class Subroutines{ * Key: InstructionHandle of the leader of the subroutine. * Elements: SubroutineImpl objects. */ - private Map subroutines = new HashMap(); + private final Map subroutines = new HashMap(); /** * This is referring to a special subroutine, namely the diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index dca5f186..da203cda 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -34,7 +34,7 @@ public class UninitializedObjectType extends ReferenceType implements Constants{ private static final long serialVersionUID = -1228341777713117641L; /** The "initialized" version. */ - private ObjectType initialized; + private final ObjectType initialized; /** Creates a new instance. */ public UninitializedObjectType(ObjectType t){ -- GitLab From c33b2b3cfad2da35842e4f3217e32f6829f11063 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sat, 27 Sep 2014 15:16:26 +0000 Subject: [PATCH 0687/1313] Add final modifier to private fields. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1627978 13f79535-47bb-0310-9956-ffa450edef68 --- src/test/java/org/apache/bcel/AbstractTestCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/apache/bcel/AbstractTestCase.java b/src/test/java/org/apache/bcel/AbstractTestCase.java index 0455ea4f..4b047f61 100644 --- a/src/test/java/org/apache/bcel/AbstractTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractTestCase.java @@ -39,7 +39,7 @@ import org.apache.bcel.util.SyntheticRepository; public abstract class AbstractTestCase extends TestCase { - private boolean verbose = false; + private final boolean verbose = false; protected File createTestdataFile(String name) { -- GitLab From b90b2b266275611fae7f197c1dcbb83e19ea351b Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 30 Sep 2014 11:47:49 +0000 Subject: [PATCH 0688/1313] Better param name (it's not a java.io.File). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1628400 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/classfile/ClassParser.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 3fd0e356..b8059439 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -63,18 +63,18 @@ public final class ClassParser { /** * Parse class from the given stream. * - * @param file Input stream + * @param inputStream Input stream * @param file_name File name */ - public ClassParser(InputStream file, String file_name) { + public ClassParser(InputStream inputStream, String file_name) { this.file_name = file_name; fileOwned = false; - String clazz = file.getClass().getName(); // Not a very clean solution ... + String clazz = inputStream.getClass().getName(); // Not a very clean solution ... is_zip = clazz.startsWith("java.util.zip.") || clazz.startsWith("java.util.jar."); - if (file instanceof DataInputStream) { - this.file = (DataInputStream) file; + if (inputStream instanceof DataInputStream) { + this.file = (DataInputStream) inputStream; } else { - this.file = new DataInputStream(new BufferedInputStream(file, BUFSIZE)); + this.file = new DataInputStream(new BufferedInputStream(inputStream, BUFSIZE)); } } -- GitLab From db449fcaf4d45e600adbe96713d388818707b55e Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 30 Sep 2014 11:48:56 +0000 Subject: [PATCH 0689/1313] Better ivar name (it's not a java.io.File). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1628401 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/ClassParser.java | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index b8059439..aad92417 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -44,7 +44,7 @@ import org.apache.bcel.Constants; */ public final class ClassParser { - private DataInputStream file; + private DataInputStream dataInputStream; private final boolean fileOwned; private final String file_name; private String zip_file; @@ -72,9 +72,9 @@ public final class ClassParser { String clazz = inputStream.getClass().getName(); // Not a very clean solution ... is_zip = clazz.startsWith("java.util.zip.") || clazz.startsWith("java.util.jar."); if (inputStream instanceof DataInputStream) { - this.file = (DataInputStream) inputStream; + this.dataInputStream = (DataInputStream) inputStream; } else { - this.file = new DataInputStream(new BufferedInputStream(inputStream, BUFSIZE)); + this.dataInputStream = new DataInputStream(new BufferedInputStream(inputStream, BUFSIZE)); } } @@ -126,10 +126,10 @@ public final class ClassParser { throw new IOException("File " + file_name + " not found"); } - file = new DataInputStream(new BufferedInputStream(zip.getInputStream(entry), + dataInputStream = new DataInputStream(new BufferedInputStream(zip.getInputStream(entry), BUFSIZE)); } else { - file = new DataInputStream(new BufferedInputStream(new FileInputStream( + dataInputStream = new DataInputStream(new BufferedInputStream(new FileInputStream( file_name), BUFSIZE)); } } @@ -170,8 +170,8 @@ public final class ClassParser { // Read everything of interest, so close the file if (fileOwned) { try { - if (file != null) { - file.close(); + if (dataInputStream != null) { + dataInputStream.close(); } if (zip != null) { zip.close(); @@ -196,10 +196,10 @@ public final class ClassParser { */ private void readAttributes() throws IOException, ClassFormatException { int attributes_count; - attributes_count = file.readUnsignedShort(); + attributes_count = dataInputStream.readUnsignedShort(); attributes = new Attribute[attributes_count]; for (int i = 0; i < attributes_count; i++) { - attributes[i] = Attribute.readAttribute(file, constant_pool); + attributes[i] = Attribute.readAttribute(dataInputStream, constant_pool); } } @@ -210,7 +210,7 @@ public final class ClassParser { * @throws ClassFormatException */ private void readClassInfo() throws IOException, ClassFormatException { - access_flags = file.readUnsignedShort(); + access_flags = dataInputStream.readUnsignedShort(); /* Interfaces are implicitely abstract, the flag should be set * according to the JVM specification. */ @@ -221,8 +221,8 @@ public final class ClassParser { && ((access_flags & Constants.ACC_FINAL) != 0)) { throw new ClassFormatException("Class " + file_name + " can't be both final and abstract"); } - class_name_index = file.readUnsignedShort(); - superclass_name_index = file.readUnsignedShort(); + class_name_index = dataInputStream.readUnsignedShort(); + superclass_name_index = dataInputStream.readUnsignedShort(); } @@ -232,7 +232,7 @@ public final class ClassParser { * @throws ClassFormatException */ private void readConstantPool() throws IOException, ClassFormatException { - constant_pool = new ConstantPool(file); + constant_pool = new ConstantPool(dataInputStream); } @@ -243,10 +243,10 @@ public final class ClassParser { */ private void readFields() throws IOException, ClassFormatException { int fields_count; - fields_count = file.readUnsignedShort(); + fields_count = dataInputStream.readUnsignedShort(); fields = new Field[fields_count]; for (int i = 0; i < fields_count; i++) { - fields[i] = new Field(file, constant_pool); + fields[i] = new Field(dataInputStream, constant_pool); } } @@ -260,7 +260,7 @@ public final class ClassParser { */ private void readID() throws IOException, ClassFormatException { int magic = 0xCAFEBABE; - if (file.readInt() != magic) { + if (dataInputStream.readInt() != magic) { throw new ClassFormatException(file_name + " is not a Java .class file"); } } @@ -273,10 +273,10 @@ public final class ClassParser { */ private void readInterfaces() throws IOException, ClassFormatException { int interfaces_count; - interfaces_count = file.readUnsignedShort(); + interfaces_count = dataInputStream.readUnsignedShort(); interfaces = new int[interfaces_count]; for (int i = 0; i < interfaces_count; i++) { - interfaces[i] = file.readUnsignedShort(); + interfaces[i] = dataInputStream.readUnsignedShort(); } } @@ -288,10 +288,10 @@ public final class ClassParser { */ private void readMethods() throws IOException, ClassFormatException { int methods_count; - methods_count = file.readUnsignedShort(); + methods_count = dataInputStream.readUnsignedShort(); methods = new Method[methods_count]; for (int i = 0; i < methods_count; i++) { - methods[i] = new Method(file, constant_pool); + methods[i] = new Method(dataInputStream, constant_pool); } } @@ -302,7 +302,7 @@ public final class ClassParser { * @throws ClassFormatException */ private void readVersion() throws IOException, ClassFormatException { - minor = file.readUnsignedShort(); - major = file.readUnsignedShort(); + minor = dataInputStream.readUnsignedShort(); + major = dataInputStream.readUnsignedShort(); } } -- GitLab From 75a8d8c69a3da99e6ab553b4f9947aac44af6928 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 30 Sep 2014 12:08:10 +0000 Subject: [PATCH 0690/1313] [BCEL-181] org.apache.bcel.util.ClassLoaderRepository.loadClass(String) leaks input streams. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1628409 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 3 +++ .../org/apache/bcel/util/ClassLoaderRepository.java | 12 ++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 1b74ae94..ef07141a 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,9 @@ The type attribute can be add,update,fix,remove. + + org.apache.bcel.util.ClassLoaderRepository.loadClass(String) leaks input streams. + Add parent type processing for ClassPath class. diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java index ab305e65..39987176 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -88,10 +88,14 @@ public class ClassLoaderRepository implements Repository { if (is == null) { throw new ClassNotFoundException(className + " not found."); } - ClassParser parser = new ClassParser(is, className); - RC = parser.parse(); - storeClass(RC); - return RC; + try { + ClassParser parser = new ClassParser(is, className); + RC = parser.parse(); + storeClass(RC); + return RC; + } finally { + is.close(); + } } catch (IOException e) { throw new ClassNotFoundException(className + " not found: " + e, e); } -- GitLab From f71e6e02a6ebe8eb3e8a6a0265fb3ae436af0416 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 30 Sep 2014 12:08:27 +0000 Subject: [PATCH 0691/1313] Add self as dev in POM. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1628411 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pom.xml b/pom.xml index 33f67085..ffce8965 100644 --- a/pom.xml +++ b/pom.xml @@ -107,6 +107,17 @@ jason at zenplex.com + + ggregory + Gary Gregory + ggregory@apache.org + Rocket Software + + PMC Member + + America/New_York + + -- GitLab From f141d828286d6bfa15e36af5507e3e00b9667487 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 30 Sep 2014 14:35:41 +0000 Subject: [PATCH 0692/1313] Run FindBugs 3.0.0 if running on Java 7, use 2.5.5 otherwise. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1628458 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ffce8965..35c4798e 100644 --- a/pom.xml +++ b/pom.xml @@ -55,6 +55,7 @@ BCEL 12314220 + 2.5.5 @@ -283,7 +284,7 @@ org.codehaus.mojo findbugs-maven-plugin - 2.5.4 + ${findbugs.plugin.version} true -Duser.language=en @@ -337,4 +338,16 @@ + + + jdk7 + + [1.7,) + + + 3.0.0 + + + + -- GitLab From 4b1a48e71dc58db9fa4e59d31422219f6fec8ba4 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 23 Oct 2014 15:57:04 +0000 Subject: [PATCH 0693/1313] maven-pmd-plugin 3.1 -> 3.2. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1633851 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 35c4798e..5bf04e0b 100644 --- a/pom.xml +++ b/pom.xml @@ -272,7 +272,7 @@ org.apache.maven.plugins maven-pmd-plugin - 3.1 + 3.2 ${maven.compiler.target} true -- GitLab From 4444bec3f7d1f2de4ca994dd829abb2281ea354c Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 3 Nov 2014 05:37:57 +0000 Subject: [PATCH 0694/1313] commons-parent 34 -> 35. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1636254 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5bf04e0b..71fa396c 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ org.apache.commons commons-parent - 34 + 35 org.apache.bcel -- GitLab From 032bcf74352988228352f7f1528d0500d2455262 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 3 Nov 2014 05:38:46 +0000 Subject: [PATCH 0695/1313] Pick up Javadoc plugin from commons-parent. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1636255 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pom.xml b/pom.xml index 71fa396c..ecbe468f 100644 --- a/pom.xml +++ b/pom.xml @@ -210,13 +210,6 @@ gnu - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9.1 - - - org.apache.maven.plugins maven-scm-publish-plugin -- GitLab From 3237845d91d73410611cf623cbe4c21868e14b06 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sun, 23 Nov 2014 00:53:19 +0000 Subject: [PATCH 0696/1313] maven-pmd-plugin 3.2 -> 3.3. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1641150 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ecbe468f..fa903341 100644 --- a/pom.xml +++ b/pom.xml @@ -265,7 +265,7 @@ org.apache.maven.plugins maven-pmd-plugin - 3.2 + 3.3 ${maven.compiler.target} true -- GitLab From eaf7e8a963f494bcc555bfaf6baa21d5324e416b Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 17 Dec 2014 14:10:42 +0000 Subject: [PATCH 0697/1313] Mention BCEL-181 in the release notes git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646248 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index f38a5465..3fc026a0 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -95,6 +95,8 @@ Bug fixes from 5.2 [BCEL-173] ClassParser fails to parse JDK classes in Java 8: ClassFormatException: Invalid byte tag in constant pool [BCEL-174] Verification of interfaces with default methods fails with Java 8 [BCEL-177] MethodParameters should read 1 byte not two for parameter count +[BCEL-181] ClassLoaderRepository.loadClass(String) leaks input streams + Feedback -------- -- GitLab From 9b43d102b5f203616a31fd240cae7ba10d3b148e Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 17 Dec 2014 14:19:01 +0000 Subject: [PATCH 0698/1313] Replaced System.getProperty("file|path.separator") with File.separator|pathSeparator (BCEL-182) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646251 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/JavaClass.java | 8 +------- src/main/java/org/apache/bcel/util/Class2HTML.java | 2 +- src/main/java/org/apache/bcel/util/ClassPath.java | 3 +-- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index eea4744b..c7bcb68e 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -491,13 +491,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl // Debugging ... on/off debug = Boolean.getBoolean("JavaClass.debug"); // Get path separator either / or \ usually - String _sep = System.getProperty("file.separator"); - if (_sep != null) { - try { - JavaClass.sep = _sep.charAt(0); - } catch (StringIndexOutOfBoundsException e) { - } // Never reached - } + sep = File.separatorChar; } diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index 4c7a1829..bce475e4 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -101,7 +101,7 @@ public class Class2HTML implements Constants { ClassParser parser = null; JavaClass java_class = null; String zip_file = null; - char sep = System.getProperty("file.separator").toCharArray()[0]; + char sep = File.separatorChar; String dir = "." + sep; // Where to store HTML files try { /* Parse command line arguments. diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 0a6f5185..2922e2af 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -72,8 +72,7 @@ public class ClassPath implements Serializable { public ClassPath(String class_path) { this.class_path = class_path; List vec = new ArrayList(); - for (StringTokenizer tok = new StringTokenizer(class_path, System - .getProperty("path.separator")); tok.hasMoreTokens();) { + for (StringTokenizer tok = new StringTokenizer(class_path, File.pathSeparator); tok.hasMoreTokens();) { String path = tok.nextToken(); if (!path.equals("")) { File file = new File(path); -- GitLab From 910f940351695ce7e9b6da297dc2aff01e5521a3 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 17 Dec 2014 14:28:08 +0000 Subject: [PATCH 0699/1313] Check the flags on the instance initialization methods only when inspecting a class git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646254 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/statics/Pass2Verifier.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index b06a1f15..d9fabf7b 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -677,6 +677,19 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_SYNCHRONIZED modifier set."); } } + + // A specific instance initialization method... (vmspec2,Page 116). + if (name.equals(CONSTRUCTOR_NAME)) { + //..may have at most one of ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC set: is checked above. + //..may also have ACC_STRICT set, but none of the other flags in table 4.5 (vmspec2, page 115) + if (obj.isStatic() || + obj.isFinal() || + obj.isSynchronized() || + obj.isNative() || + obj.isAbstract()) { + throw new ClassConstraintException("Instance initialization method '" + tostring(obj) + "' must not have any of the ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT modifiers set."); + } + } } else{ // isInterface! if (!name.equals(STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph @@ -711,19 +724,6 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } } - // A specific instance initialization method... (vmspec2,Page 116). - if (name.equals(CONSTRUCTOR_NAME)){ - //..may have at most one of ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC set: is checked above. - //..may also have ACC_STRICT set, but none of the other flags in table 4.5 (vmspec2, page 115) - if ( obj.isStatic() || - obj.isFinal() || - obj.isSynchronized() || - obj.isNative() || - obj.isAbstract() ){ - throw new ClassConstraintException("Instance initialization method '"+tostring(obj)+"' must not have any of the ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT modifiers set."); - } - } - // Class and interface initialization methods... if (name.equals(STATIC_INITIALIZER_NAME)){ if ((obj.getAccessFlags() & (~ACC_STRICT)) > 0){ -- GitLab From 1d511d5f9db4a40c79a41ab928fd9ba4049e8a19 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 18 Dec 2014 23:48:27 +0000 Subject: [PATCH 0700/1313] Added a JMH benchmark for the class parser and the class generator (run with: mvn test -Pbenchmark) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646584 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 93 ++++++++++++- .../java/org/apache/bcel/BCELBenchmark.java | 125 ++++++++++++++++++ .../java/org/apache/bcel/PerformanceTest.java | 2 +- 3 files changed, 218 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/apache/bcel/BCELBenchmark.java diff --git a/pom.xml b/pom.xml index fa903341..c4d03b9e 100644 --- a/pom.xml +++ b/pom.xml @@ -189,6 +189,14 @@ + + maven-compiler-plugin + + + **/*Benchmark* + + + maven-surefire-plugin @@ -341,6 +349,89 @@ 3.0.0 + + + + benchmark + + + + org.openjdk.jmh + jmh-core + 1.3.4 + test + + + + org.openjdk.jmh + jmh-generator-annprocess + 1.3.4 + test + + + + commons-io + commons-io + 2.4 + test + + + + org.apache.commons + commons-collections4 + 4.0 + test + + + + + true + org.apache + + + + + + + maven-compiler-plugin + + + **/* + + + + + + + org.codehaus.mojo + exec-maven-plugin + + + benchmark + test + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + -rf + json + -rff + target/jmh-result.json + ${benchmark} + + + + + + + + - + diff --git a/src/test/java/org/apache/bcel/BCELBenchmark.java b/src/test/java/org/apache/bcel/BCELBenchmark.java new file mode 100644 index 00000000..257ffc90 --- /dev/null +++ b/src/test/java/org/apache/bcel/BCELBenchmark.java @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.bcel; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.iterators.EnumerationIterator; +import org.apache.commons.collections4.iterators.FilterIterator; +import org.apache.commons.collections4.iterators.IteratorIterable; +import org.apache.commons.io.IOUtils; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Measurement; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Threads; +import org.openjdk.jmh.annotations.Warmup; +import org.openjdk.jmh.infra.Blackhole; + +@BenchmarkMode(Mode.AverageTime) +@Fork(value = 1, jvmArgs = "-server") +@Threads(1) +@Warmup(iterations = 10) +@Measurement(iterations = 20) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +public class BCELBenchmark { + + private JarFile getJarFile() throws IOException { + String javaHome = System.getProperty("java.home"); + return new JarFile(javaHome + "/lib/rt.jar"); + } + + private Iterable getClasses(JarFile jar) { + return new IteratorIterable(new FilterIterator(new EnumerationIterator(jar.entries()), new Predicate() { + public boolean evaluate(JarEntry entry) { + return entry.getName().endsWith(".class"); + } + })); + } + + /** + * Baseline benchmark. Read the classes but don't parse them. + */ + @Benchmark + public void baseline(Blackhole bh) throws IOException { + JarFile jar = getJarFile(); + + for (JarEntry entry : getClasses(jar)) { + byte[] bytes = IOUtils.toByteArray(jar.getInputStream(entry)); + bh.consume(bytes); + } + + jar.close(); + } + + @Benchmark + public void parser(Blackhole bh) throws IOException { + JarFile jar = getJarFile(); + + for (JarEntry entry : getClasses(jar)) { + byte[] bytes = IOUtils.toByteArray(jar.getInputStream(entry)); + + JavaClass clazz = new ClassParser(new ByteArrayInputStream(bytes), entry.getName()).parse(); + bh.consume(clazz); + } + + jar.close(); + } + + @Benchmark + public void generator(Blackhole bh) throws IOException { + JarFile jar = getJarFile(); + + for (JarEntry entry : getClasses(jar)) { + byte[] bytes = IOUtils.toByteArray(jar.getInputStream(entry)); + + JavaClass clazz = new ClassParser(new ByteArrayInputStream(bytes), entry.getName()).parse(); + + ClassGen cg = new ClassGen(clazz); + + for (Method m : cg.getMethods()) { + MethodGen mg = new MethodGen(m, cg.getClassName(), cg.getConstantPool()); + InstructionList il = mg.getInstructionList(); + + if (il != null) { + mg.getInstructionList().setPositions(); + mg.setMaxLocals(); + mg.setMaxStack(); + } + cg.replaceMethod(m, mg.getMethod()); + } + + bh.consume(cg.getJavaClass().getBytes()); + } + + jar.close(); + } +} diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java index 2cca58f4..45cad749 100644 --- a/src/test/java/org/apache/bcel/PerformanceTest.java +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -73,7 +73,7 @@ public final class PerformanceTest extends TestCase { String javaHome = System.getProperty("java.home"); - JarFile jar = new JarFile(javaHome + "/lib/dt.jar"); + JarFile jar = new JarFile(javaHome + "/lib/rt.jar"); Enumeration en = jar.entries(); int i = 0; -- GitLab From 497078b507a2a71164c30aaefe6af50ae8305b38 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 18 Dec 2014 23:59:05 +0000 Subject: [PATCH 0701/1313] Removed the flag verification on the methods (not required by the JVM spec, see BCEL-183) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646588 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/verifier/statics/Pass2Verifier.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index d9fabf7b..154f4417 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -724,16 +724,6 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } } - // Class and interface initialization methods... - if (name.equals(STATIC_INITIALIZER_NAME)){ - if ((obj.getAccessFlags() & (~ACC_STRICT)) > 0){ - addMessage("Class or interface initialization method '"+tostring(obj)+"' has superfluous access modifier(s) set: everything but ACC_STRICT is ignored."); - } - if (obj.isAbstract()){ - throw new ClassConstraintException("Class or interface initialization method '"+tostring(obj)+"' must not be abstract. This contradicts the Java Language Specification, Second Edition (which omits this constraint) but is common practice of existing verifiers."); - } - } - if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_SYNCHRONIZED|ACC_NATIVE|ACC_ABSTRACT|ACC_STRICT)) > 0){ addMessage("Method '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT set (ignored)."); } -- GitLab From 3dcb04087e8f17678659e715cb9a0a885a55a2b7 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 19 Dec 2014 00:05:30 +0000 Subject: [PATCH 0702/1313] Fixed misplaced comments in Pass2Verifier git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646590 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/verifier/statics/Pass2Verifier.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 154f4417..3f269979 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -302,9 +302,9 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ /** * A Visitor class that ensures the constant pool satisfies the static * constraints. - * The visitXXX() methods throw ClassConstraintException instances otherwise. - * - * @see #constant_pool_entries_satisfy_static_constraints() + * The visitXXX() methods throw ClassConstraintException instances otherwise. + * + * @see #constant_pool_entries_satisfy_static_constraints() */ private class CPESSC_Visitor extends org.apache.bcel.classfile.EmptyVisitor{ private final Class CONST_Class; @@ -1176,7 +1176,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * this method does not verify the existence of referenced entities * (such as classes) but only the formal correctness (such as well-formed * signatures). - * The visitXXX() methods throw ClassConstraintException instances otherwise. + * The visitXXX() methods throw ClassConstraintException instances otherwise. * Precondition: index-style cross referencing in the constant * pool must be valid. Simply invoke constant_pool_entries_satisfy_static_constraints() * before. @@ -1199,10 +1199,10 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ /** * A Visitor class that ensures the ConstantCP-subclassed entries * of the constant pool are valid. - * Precondition: index-style cross referencing in the constant - * pool must be valid. + * Precondition: index-style cross referencing in the constant + * pool must be valid. * - * @see #constant_pool_entries_satisfy_static_constraints() + * @see #constant_pool_entries_satisfy_static_constraints() * @see org.apache.bcel.classfile.ConstantCP */ private class FAMRAV_Visitor extends EmptyVisitor{ -- GitLab From a6d28b013f3c9b4d4c17c6020c9d72c919e4349d Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 19 Dec 2014 12:57:12 +0000 Subject: [PATCH 0703/1313] Replaced DataInputStream with DataInput where possible git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646694 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AnnotationDefault.java | 8 ++-- .../bcel/classfile/AnnotationEntry.java | 12 +++--- .../apache/bcel/classfile/Annotations.java | 10 ++--- .../org/apache/bcel/classfile/Attribute.java | 12 ++++-- .../bcel/classfile/BootstrapMethod.java | 14 +++---- .../bcel/classfile/BootstrapMethods.java | 8 ++-- .../org/apache/bcel/classfile/Constant.java | 37 ++++++++++--------- .../bcel/classfile/ConstantFieldref.java | 10 ++--- .../classfile/ConstantInterfaceMethodref.java | 10 ++--- .../bcel/classfile/ConstantMethodref.java | 10 ++--- .../apache/bcel/classfile/ConstantPool.java | 12 +++--- .../apache/bcel/classfile/ConstantUtf8.java | 5 +-- .../apache/bcel/classfile/ConstantValue.java | 8 ++-- .../org/apache/bcel/classfile/Deprecated.java | 11 +++--- .../apache/bcel/classfile/ElementValue.java | 36 +++++++++--------- .../bcel/classfile/EnclosingMethod.java | 6 +-- .../apache/bcel/classfile/ExceptionTable.java | 12 +++--- .../apache/bcel/classfile/InnerClasses.java | 12 +++--- .../bcel/classfile/LineNumberTable.java | 12 +++--- .../bcel/classfile/LocalVariableTable.java | 12 +++--- .../classfile/LocalVariableTypeTable.java | 6 +-- .../bcel/classfile/MethodParameter.java | 12 +++--- .../bcel/classfile/MethodParameters.java | 8 ++-- .../org/apache/bcel/classfile/PMGClass.java | 8 ++-- .../classfile/ParameterAnnotationEntry.java | 13 ++++--- .../bcel/classfile/ParameterAnnotations.java | 10 ++--- .../RuntimeInvisibleAnnotations.java | 10 ++--- .../RuntimeInvisibleParameterAnnotations.java | 8 ++-- .../classfile/RuntimeVisibleAnnotations.java | 10 ++--- .../RuntimeVisibleParameterAnnotations.java | 11 +++--- .../org/apache/bcel/classfile/Signature.java | 6 +-- .../org/apache/bcel/classfile/SourceFile.java | 8 ++-- .../org/apache/bcel/classfile/StackMap.java | 14 +++---- .../apache/bcel/classfile/StackMapEntry.java | 17 +++++---- .../org/apache/bcel/classfile/Synthetic.java | 11 +++--- .../org/apache/bcel/classfile/Unknown.java | 11 +++--- 36 files changed, 212 insertions(+), 208 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index cf559dc8..cf535fa3 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -40,18 +40,18 @@ public class AnnotationDefault extends Attribute * Index pointing to the name Code * @param length * Content length in bytes - * @param file + * @param input * Input stream * @param constant_pool * Array of constants */ public AnnotationDefault(int name_index, int length, - DataInputStream file, ConstantPool constant_pool) + DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (ElementValue) null, constant_pool); - default_value = ElementValue.readElementValue(file, constant_pool); + default_value = ElementValue.readElementValue(input, constant_pool); } /** diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 04f69312..c5385d44 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; @@ -46,19 +46,19 @@ public class AnnotationEntry implements Node, Constants, Serializable { /** * Factory method to create an AnnotionEntry from a DataInputStream * - * @param file + * @param input * @param constant_pool * @param isRuntimeVisible * @return the entry * @throws IOException */ - public static AnnotationEntry read(DataInputStream file, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { + public static AnnotationEntry read(DataInput input, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { - final AnnotationEntry annotationEntry = new AnnotationEntry(file.readUnsignedShort(), constant_pool, isRuntimeVisible); - final int num_element_value_pairs = (file.readUnsignedShort()); + final AnnotationEntry annotationEntry = new AnnotationEntry(input.readUnsignedShort(), constant_pool, isRuntimeVisible); + final int num_element_value_pairs = (input.readUnsignedShort()); annotationEntry.element_value_pairs = new ArrayList(); for (int i = 0; i < num_element_value_pairs; i++) { - annotationEntry.element_value_pairs.add(new ElementValuePair(file.readUnsignedShort(), ElementValue.readElementValue(file, constant_pool), + annotationEntry.element_value_pairs.add(new ElementValuePair(input.readUnsignedShort(), ElementValue.readElementValue(input, constant_pool), constant_pool)); } return annotationEntry; diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index ac3115c4..432aacb2 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; @@ -39,15 +39,15 @@ public abstract class Annotations extends Attribute { * @param annotation_type the subclass type of the annotation * @param name_index Index pointing to the name Code * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants */ - public Annotations(byte annotation_type, int name_index, int length, DataInputStream file, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { + public Annotations(byte annotation_type, int name_index, int length, DataInput input, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool, isRuntimeVisible); - final int annotation_table_length = (file.readUnsignedShort()); + final int annotation_table_length = (input.readUnsignedShort()); annotation_table = new AnnotationEntry[annotation_table_length]; for (int i = 0; i < annotation_table_length; i++) { - annotation_table[i] = AnnotationEntry.read(file, constant_pool, isRuntimeVisible); + annotation_table[i] = AnnotationEntry.read(input, constant_pool, isRuntimeVisible); } } diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 9170991b..3cf2702c 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -120,15 +120,19 @@ public abstract class Attribute implements Cloneable, Node, Serializable readers.remove(name); } - /* + /** * Class method reads one attribute from the input data stream. This method * must not be accessible from the outside. It is called by the Field and * Method constructor methods. * * @see Field - * @see Method @param file Input stream @param constant_pool Array of - * constants @return Attribute @throws IOException @throws - * ClassFormatException + * @see Method + * + * @param file Input stream + * @param constant_pool Array of constants + * @return Attribute + * @throws IOException + * @throws ClassFormatException */ public static Attribute readAttribute(DataInputStream file, ConstantPool constant_pool) throws IOException, diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java index 4a70ec84..26470891 100644 --- a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java @@ -17,7 +17,7 @@ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; @@ -42,20 +42,20 @@ public class BootstrapMethod implements Serializable, Cloneable { } /** - * Construct object from file stream. + * Construct object from input stream. * - * @param file Input stream + * @param input Input stream * @throws IOException * @throws ClassFormatException */ - BootstrapMethod(DataInputStream file) throws IOException, ClassFormatException { - bootstrap_method_ref = file.readUnsignedShort(); + BootstrapMethod(DataInput input) throws IOException, ClassFormatException { + bootstrap_method_ref = input.readUnsignedShort(); - int num_bootstrap_methods = file.readUnsignedShort(); + int num_bootstrap_methods = input.readUnsignedShort(); bootstrap_arguments = new int[num_bootstrap_methods]; for (int i = 0; i < num_bootstrap_methods; i++) { - bootstrap_arguments[i] = file.readUnsignedShort(); + bootstrap_arguments[i] = input.readUnsignedShort(); } } diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java index 03b0d3d7..8978af1d 100644 --- a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java +++ b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java @@ -17,7 +17,7 @@ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; @@ -40,13 +40,13 @@ public class BootstrapMethods extends Attribute { this.bootstrap_methods = bootstrap_methods; } - BootstrapMethods(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException { + BootstrapMethods(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (BootstrapMethod[]) null, constant_pool); - int num_bootstrap_methods = file.readUnsignedShort(); + int num_bootstrap_methods = input.readUnsignedShort(); bootstrap_methods = new BootstrapMethod[num_bootstrap_methods]; for (int i = 0; i < num_bootstrap_methods; i++) { - bootstrap_methods[i] = new BootstrapMethod(file); + bootstrap_methods[i] = new BootstrapMethod(input); } } diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index 1dbdba0a..a4c08255 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -17,6 +17,7 @@ */ package org.apache.bcel.classfile; +import java.io.DataInput; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -120,43 +121,43 @@ public abstract class Constant implements Cloneable, Node, Serializable { /** - * Read one constant from the given file, the type depends on a tag byte. + * Read one constant from the given input, the type depends on a tag byte. * - * @param file Input stream + * @param input Input stream * @return Constant object */ - static Constant readConstant( DataInputStream file ) throws IOException, + static Constant readConstant( DataInput input ) throws IOException, ClassFormatException { - byte b = file.readByte(); // Read tag byte + byte b = input.readByte(); // Read tag byte switch (b) { case Constants.CONSTANT_Class: - return new ConstantClass(file); + return new ConstantClass(input); case Constants.CONSTANT_Fieldref: - return new ConstantFieldref(file); + return new ConstantFieldref(input); case Constants.CONSTANT_Methodref: - return new ConstantMethodref(file); + return new ConstantMethodref(input); case Constants.CONSTANT_InterfaceMethodref: - return new ConstantInterfaceMethodref(file); + return new ConstantInterfaceMethodref(input); case Constants.CONSTANT_String: - return new ConstantString(file); + return new ConstantString(input); case Constants.CONSTANT_Integer: - return new ConstantInteger(file); + return new ConstantInteger(input); case Constants.CONSTANT_Float: - return new ConstantFloat(file); + return new ConstantFloat(input); case Constants.CONSTANT_Long: - return new ConstantLong(file); + return new ConstantLong(input); case Constants.CONSTANT_Double: - return new ConstantDouble(file); + return new ConstantDouble(input); case Constants.CONSTANT_NameAndType: - return new ConstantNameAndType(file); + return new ConstantNameAndType(input); case Constants.CONSTANT_Utf8: - return ConstantUtf8.getInstance(file); + return ConstantUtf8.getInstance(input); case Constants.CONSTANT_MethodHandle: - return new ConstantMethodHandle(file); + return new ConstantMethodHandle(input); case Constants.CONSTANT_MethodType: - return new ConstantMethodType(file); + return new ConstantMethodType(input); case Constants.CONSTANT_InvokeDynamic: - return new ConstantInvokeDynamic(file); + return new ConstantInvokeDynamic(input); default: throw new ClassFormatException("Invalid byte tag in constant pool: " + b); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java index 9a0725bc..9eb2c595 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.IOException; import org.apache.bcel.Constants; @@ -41,13 +41,13 @@ public final class ConstantFieldref extends ConstantCP { /** - * Initialize instance from file data. + * Initialize instance from input data. * - * @param file input stream + * @param input input stream * @throws IOException */ - ConstantFieldref(DataInputStream file) throws IOException { - super(Constants.CONSTANT_Fieldref, file); + ConstantFieldref(DataInput input) throws IOException { + super(Constants.CONSTANT_Fieldref, input); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java index 662e4e43..72d1567d 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.IOException; import org.apache.bcel.Constants; @@ -41,13 +41,13 @@ public final class ConstantInterfaceMethodref extends ConstantCP { /** - * Initialize instance from file data. + * Initialize instance from input data. * - * @param file input stream + * @param input input stream * @throws IOException */ - ConstantInterfaceMethodref(DataInputStream file) throws IOException { - super(Constants.CONSTANT_InterfaceMethodref, file); + ConstantInterfaceMethodref(DataInput input) throws IOException { + super(Constants.CONSTANT_InterfaceMethodref, input); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java index a4669133..345e726f 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.IOException; import org.apache.bcel.Constants; @@ -41,13 +41,13 @@ public final class ConstantMethodref extends ConstantCP { /** - * Initialize instance from file data. + * Initialize instance from input data. * - * @param file input stream + * @param input input stream * @throws IOException */ - ConstantMethodref(DataInputStream file) throws IOException { - super(Constants.CONSTANT_Methodref, file); + ConstantMethodref(DataInput input) throws IOException { + super(Constants.CONSTANT_Methodref, input); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index 73ba98b0..c65c5ba8 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; @@ -52,21 +52,21 @@ public class ConstantPool implements Cloneable, Node, Serializable { /** - * Read constants from given file stream. + * Read constants from given input stream. * - * @param file Input stream + * @param input Input stream * @throws IOException * @throws ClassFormatException */ - ConstantPool(DataInputStream file) throws IOException, ClassFormatException { + ConstantPool(DataInput input) throws IOException, ClassFormatException { byte tag; - constant_pool_count = file.readUnsignedShort(); + constant_pool_count = input.readUnsignedShort(); constant_pool = new Constant[constant_pool_count]; /* constant_pool[0] is unused by the compiler and may be used freely * by the implementation. */ for (int i = 1; i < constant_pool_count; i++) { - constant_pool[i] = Constant.readConstant(file); + constant_pool[i] = Constant.readConstant(input); /* Quote from the JVM specification: * "All eight byte constants take up two spots in the constant pool. * If this is the n'th byte in the constant pool, then the next item diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index ebaf556c..ffaefa7f 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -18,7 +18,6 @@ package org.apache.bcel.classfile; import java.io.DataInput; -import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.HashMap; @@ -94,8 +93,8 @@ public final class ConstantUtf8 extends Constant { return getCachedInstance(s); } - public static ConstantUtf8 getInstance (DataInputStream file) throws IOException { - return getInstance(file.readUTF()); + public static ConstantUtf8 getInstance (DataInput input) throws IOException { + return getInstance(input.readUTF()); } /** diff --git a/src/main/java/org/apache/bcel/classfile/ConstantValue.java b/src/main/java/org/apache/bcel/classfile/ConstantValue.java index 8bd193ca..677f5d7f 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantValue.java @@ -48,16 +48,16 @@ public final class ConstantValue extends Attribute { /** - * Construct object from file stream. + * Construct object from input stream. * @param name_index Name index in constant pool * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants * @throws IOException */ - ConstantValue(int name_index, int length, DataInput file, ConstantPool constant_pool) + ConstantValue(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { - this(name_index, length, file.readUnsignedShort(), constant_pool); + this(name_index, length, input.readUnsignedShort(), constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/Deprecated.java b/src/main/java/org/apache/bcel/classfile/Deprecated.java index 3ced7d74..041264f1 100644 --- a/src/main/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/main/java/org/apache/bcel/classfile/Deprecated.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -59,19 +59,20 @@ public final class Deprecated extends Attribute { /** - * Construct object from file stream. + * Construct object from input stream. + * * @param name_index Index in constant pool to CONSTANT_Utf8 * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants * @throws IOException */ - Deprecated(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + Deprecated(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (byte[]) null, constant_pool); if (length > 0) { bytes = new byte[length]; - file.readFully(bytes); + input.readFully(bytes); System.err.println("Deprecated attribute with length > 0"); } } diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index 8876a303..19e3abff 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; @@ -79,54 +79,54 @@ public abstract class ElementValue public static final int PRIMITIVE_BOOLEAN = 'Z'; - public static ElementValue readElementValue(DataInputStream dis, + public static ElementValue readElementValue(DataInput input, ConstantPool cpool) throws IOException { - byte type = dis.readByte(); + byte type = input.readByte(); switch (type) { case 'B': // byte - return new SimpleElementValue(PRIMITIVE_BYTE, dis + return new SimpleElementValue(PRIMITIVE_BYTE, input .readUnsignedShort(), cpool); case 'C': // char - return new SimpleElementValue(PRIMITIVE_CHAR, dis + return new SimpleElementValue(PRIMITIVE_CHAR, input .readUnsignedShort(), cpool); case 'D': // double - return new SimpleElementValue(PRIMITIVE_DOUBLE, dis + return new SimpleElementValue(PRIMITIVE_DOUBLE, input .readUnsignedShort(), cpool); case 'F': // float - return new SimpleElementValue(PRIMITIVE_FLOAT, dis + return new SimpleElementValue(PRIMITIVE_FLOAT, input .readUnsignedShort(), cpool); case 'I': // int - return new SimpleElementValue(PRIMITIVE_INT, dis + return new SimpleElementValue(PRIMITIVE_INT, input .readUnsignedShort(), cpool); case 'J': // long - return new SimpleElementValue(PRIMITIVE_LONG, dis + return new SimpleElementValue(PRIMITIVE_LONG, input .readUnsignedShort(), cpool); case 'S': // short - return new SimpleElementValue(PRIMITIVE_SHORT, dis + return new SimpleElementValue(PRIMITIVE_SHORT, input .readUnsignedShort(), cpool); case 'Z': // boolean - return new SimpleElementValue(PRIMITIVE_BOOLEAN, dis + return new SimpleElementValue(PRIMITIVE_BOOLEAN, input .readUnsignedShort(), cpool); case 's': // String - return new SimpleElementValue(STRING, dis.readUnsignedShort(), + return new SimpleElementValue(STRING, input.readUnsignedShort(), cpool); case 'e': // Enum constant - return new EnumElementValue(ENUM_CONSTANT, dis.readUnsignedShort(), - dis.readUnsignedShort(), cpool); + return new EnumElementValue(ENUM_CONSTANT, input.readUnsignedShort(), + input.readUnsignedShort(), cpool); case 'c': // Class - return new ClassElementValue(CLASS, dis.readUnsignedShort(), cpool); + return new ClassElementValue(CLASS, input.readUnsignedShort(), cpool); case '@': // Annotation // TODO isRuntimeVisible return new AnnotationElementValue(ANNOTATION, AnnotationEntry.read( - dis, cpool, false), cpool); + input, cpool, false), cpool); case '[': // Array - int numArrayVals = dis.readUnsignedShort(); + int numArrayVals = input.readUnsignedShort(); ElementValue[] evalues = new ElementValue[numArrayVals]; for (int j = 0; j < numArrayVals; j++) { - evalues[j] = ElementValue.readElementValue(dis, cpool); + evalues[j] = ElementValue.readElementValue(input, cpool); } return new ArrayElementValue(ARRAY, evalues, cpool); default: diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java index 1ac04d1e..36a90115 100644 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -16,7 +16,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; @@ -45,8 +45,8 @@ public class EnclosingMethod extends Attribute { private int methodIndex; // Ctors - and code to read an attribute in. - public EnclosingMethod(int nameIndex, int len, DataInputStream dis, ConstantPool cpool) throws IOException { - this(nameIndex, len, dis.readUnsignedShort(), dis.readUnsignedShort(), cpool); + public EnclosingMethod(int nameIndex, int len, DataInput input, ConstantPool cpool) throws IOException { + this(nameIndex, len, input.readUnsignedShort(), input.readUnsignedShort(), cpool); } private EnclosingMethod(int nameIndex, int len, int classIdx,int methodIdx, ConstantPool cpool) { diff --git a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java index 702a309c..49397dc2 100644 --- a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -64,20 +64,20 @@ public final class ExceptionTable extends Attribute { /** - * Construct object from file stream. + * Construct object from input stream. * @param name_index Index in constant pool * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants * @throws IOException */ - ExceptionTable(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + ExceptionTable(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (int[]) null, constant_pool); - number_of_exceptions = file.readUnsignedShort(); + number_of_exceptions = input.readUnsignedShort(); exception_index_table = new int[number_of_exceptions]; for (int i = 0; i < number_of_exceptions; i++) { - exception_index_table[i] = file.readUnsignedShort(); + exception_index_table[i] = input.readUnsignedShort(); } } diff --git a/src/main/java/org/apache/bcel/classfile/InnerClasses.java b/src/main/java/org/apache/bcel/classfile/InnerClasses.java index 2f67097f..2db728aa 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClasses.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -62,21 +62,21 @@ public final class InnerClasses extends Attribute { /** - * Construct object from file stream. + * Construct object from input stream. * * @param name_index Index in constant pool to CONSTANT_Utf8 * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants * @throws IOException */ - InnerClasses(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + InnerClasses(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (InnerClass[]) null, constant_pool); - number_of_classes = file.readUnsignedShort(); + number_of_classes = input.readUnsignedShort(); inner_classes = new InnerClass[number_of_classes]; for (int i = 0; i < number_of_classes; i++) { - inner_classes[i] = new InnerClass(file); + inner_classes[i] = new InnerClass(input); } } diff --git a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java index 3d740148..919f46e8 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -62,20 +62,20 @@ public final class LineNumberTable extends Attribute { /** - * Construct object from file stream. + * Construct object from input stream. * @param name_index Index of name * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants * @throws IOException */ - LineNumberTable(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + LineNumberTable(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (LineNumber[]) null, constant_pool); - line_number_table_length = (file.readUnsignedShort()); + line_number_table_length = (input.readUnsignedShort()); line_number_table = new LineNumber[line_number_table_length]; for (int i = 0; i < line_number_table_length; i++) { - line_number_table[i] = new LineNumber(file); + line_number_table[i] = new LineNumber(input); } } diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index 6059b002..4c31f898 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -61,20 +61,20 @@ public class LocalVariableTable extends Attribute { /** - * Construct object from file stream. + * Construct object from input stream. * @param name_index Index in constant pool * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants * @throws IOException */ - LocalVariableTable(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + LocalVariableTable(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (LocalVariable[]) null, constant_pool); - local_variable_table_length = (file.readUnsignedShort()); + local_variable_table_length = (input.readUnsignedShort()); local_variable_table = new LocalVariable[local_variable_table_length]; for (int i = 0; i < local_variable_table_length; i++) { - local_variable_table[i] = new LocalVariable(file, constant_pool); + local_variable_table[i] = new LocalVariable(input, constant_pool); } } diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index 7e8da2c9..fa49bc90 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -64,14 +64,14 @@ private int local_variable_type_table_length; // Table of local setLocalVariableTable(local_variable_table); } - LocalVariableTypeTable(int nameIdx, int len, DataInputStream dis,ConstantPool cpool) throws IOException { + LocalVariableTypeTable(int nameIdx, int len, DataInput input,ConstantPool cpool) throws IOException { this(nameIdx, len, (LocalVariable[])null, cpool); - local_variable_type_table_length = (dis.readUnsignedShort()); + local_variable_type_table_length = (input.readUnsignedShort()); local_variable_type_table = new LocalVariable[local_variable_type_table_length]; for(int i=0; i < local_variable_type_table_length; i++) { - local_variable_type_table[i] = new LocalVariable(dis, cpool); + local_variable_type_table[i] = new LocalVariable(input, cpool); } } diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameter.java b/src/main/java/org/apache/bcel/classfile/MethodParameter.java index e555c280..b47e8b7d 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameter.java +++ b/src/main/java/org/apache/bcel/classfile/MethodParameter.java @@ -17,7 +17,7 @@ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; @@ -44,15 +44,15 @@ public class MethodParameter implements Serializable, Cloneable { } /** - * Construct object from file stream. + * Construct object from input stream. * - * @param file Input stream + * @param input Input stream * @throws java.io.IOException * @throws ClassFormatException */ - MethodParameter(DataInputStream file) throws IOException { - name_index = file.readUnsignedShort(); - access_flags = file.readUnsignedShort(); + MethodParameter(DataInput input) throws IOException { + name_index = input.readUnsignedShort(); + access_flags = input.readUnsignedShort(); } public int getNameIndex() { diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameters.java b/src/main/java/org/apache/bcel/classfile/MethodParameters.java index 2c4303f7..f9ce7eb1 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameters.java +++ b/src/main/java/org/apache/bcel/classfile/MethodParameters.java @@ -17,7 +17,7 @@ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; @@ -35,14 +35,14 @@ public class MethodParameters extends Attribute { private MethodParameter[] parameters = new MethodParameter[0]; - MethodParameters(int name_index, int length, DataInputStream file, ConstantPool constant_pool) throws IOException { + MethodParameters(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { super(Constants.ATTR_METHOD_PARAMETERS, name_index, length, constant_pool); System.out.println("new MethodParameters"); - int parameters_count = file.readUnsignedByte(); + int parameters_count = input.readUnsignedByte(); parameters = new MethodParameter[parameters_count]; for (int i = 0; i < parameters_count; i++) { - parameters[i] = new MethodParameter(file); + parameters[i] = new MethodParameter(input); } } diff --git a/src/main/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java index 8fed00be..e7be6aef 100644 --- a/src/main/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/main/java/org/apache/bcel/classfile/PMGClass.java @@ -48,16 +48,16 @@ public final class PMGClass extends Attribute { /** - * Construct object from file stream. + * Construct object from input stream. * @param name_index Index in constant pool to CONSTANT_Utf8 * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants * @throws IOException */ - PMGClass(int name_index, int length, DataInput file, ConstantPool constant_pool) + PMGClass(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { - this(name_index, length, file.readUnsignedShort(), file.readUnsignedShort(), constant_pool); + this(name_index, length, input.readUnsignedShort(), input.readUnsignedShort(), constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index b4c09896..fc9b80d0 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -40,16 +40,17 @@ public class ParameterAnnotationEntry implements Node, Constants { /** - * Construct object from file stream. - * @param file Input stream + * Construct object from input stream. + * + * @param input Input stream * @throws IOException */ - ParameterAnnotationEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { - annotation_table_length = (file.readUnsignedShort()); + ParameterAnnotationEntry(DataInput input, ConstantPool constant_pool) throws IOException { + annotation_table_length = (input.readUnsignedShort()); annotation_table = new AnnotationEntry[annotation_table_length]; for (int i = 0; i < annotation_table_length; i++) { // TODO isRuntimeVisible - annotation_table[i] = AnnotationEntry.read(file, constant_pool, false); + annotation_table[i] = AnnotationEntry.read(input, constant_pool, false); } } diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index 48cb1351..2e6e2b79 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; @@ -39,17 +39,17 @@ public abstract class ParameterAnnotations extends Attribute { * @param parameter_annotation_type the subclass type of the parameter annotation * @param name_index Index pointing to the name Code * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants */ ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, - DataInputStream file, ConstantPool constant_pool) throws IOException { + DataInput input, ConstantPool constant_pool) throws IOException { this(parameter_annotation_type, name_index, length, (ParameterAnnotationEntry[]) null, constant_pool); - num_parameters = (file.readUnsignedByte()); + num_parameters = (input.readUnsignedByte()); parameter_annotation_table = new ParameterAnnotationEntry[num_parameters]; for (int i = 0; i < num_parameters; i++) { - parameter_annotation_table[i] = new ParameterAnnotationEntry(file, constant_pool); + parameter_annotation_table[i] = new ParameterAnnotationEntry(input, constant_pool); } } diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 99e2d30b..5c2362b2 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -39,17 +39,15 @@ public class RuntimeInvisibleAnnotations extends Annotations * Index pointing to the name Code * @param length * Content length in bytes - * @param file + * @param input * Input stream * @param constant_pool * Array of constants */ - RuntimeInvisibleAnnotations(int name_index, int length, - DataInputStream file, ConstantPool constant_pool) + RuntimeInvisibleAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS, name_index, length, - file, constant_pool, false); + super(Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS, name_index, length, input, constant_pool, false); } /** diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 3e56c9ea..f7bfef18 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.IOException; import org.apache.bcel.Constants; @@ -37,12 +37,12 @@ public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { /** * @param name_index Index pointing to the name Code * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants */ - RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInputStream file, + RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, + super(Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, input, constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 4929eb23..210bd64a 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -39,17 +39,15 @@ public class RuntimeVisibleAnnotations extends Annotations * Index pointing to the name Code * @param length * Content length in bytes - * @param file + * @param input * Input stream * @param constant_pool * Array of constants */ - public RuntimeVisibleAnnotations(int name_index, int length, - DataInputStream file, ConstantPool constant_pool) + public RuntimeVisibleAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS, name_index, length, - file, constant_pool, true); + super(Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS, name_index, length, input, constant_pool, true); } /** diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index 9aefd4b5..8d38ed64 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.IOException; import org.apache.bcel.Constants; @@ -37,13 +37,12 @@ public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { /** * @param name_index Index pointing to the name Code * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants */ - RuntimeVisibleParameterAnnotations(int name_index, int length, DataInputStream file, - ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, name_index, length, file, - constant_pool); + RuntimeVisibleParameterAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) + throws IOException { + super(Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, name_index, length, input, constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index ba3667db..4d95918f 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -51,13 +51,13 @@ public final class Signature extends Attribute { * Construct object from file stream. * @param name_index Index in constant pool to CONSTANT_Utf8 * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants * @throws IOException */ - Signature(int name_index, int length, DataInput file, ConstantPool constant_pool) + Signature(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { - this(name_index, length, file.readUnsignedShort(), constant_pool); + this(name_index, length, input.readUnsignedShort(), constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java index 53a4e632..ba550c4d 100644 --- a/src/main/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/main/java/org/apache/bcel/classfile/SourceFile.java @@ -49,16 +49,16 @@ public final class SourceFile extends Attribute { /** - * Construct object from file stream. + * Construct object from input stream. * @param name_index Index in constant pool to CONSTANT_Utf8 * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants * @throws IOException */ - SourceFile(int name_index, int length, DataInput file, ConstantPool constant_pool) + SourceFile(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { - this(name_index, length, file.readUnsignedShort(), constant_pool); + this(name_index, length, input.readUnsignedShort(), constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java index f3ae3e7c..179a624b 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMap.java +++ b/src/main/java/org/apache/bcel/classfile/StackMap.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -57,20 +57,20 @@ public final class StackMap extends Attribute { /** - * Construct object from file stream. + * Construct object from input stream. + * * @param name_index Index of name * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants * @throws IOException */ - StackMap(int name_index, int length, DataInputStream file, ConstantPool constant_pool) - throws IOException { + StackMap(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (StackMapEntry[]) null, constant_pool); - map_length = file.readUnsignedShort(); + map_length = input.readUnsignedShort(); map = new StackMapEntry[map_length]; for (int i = 0; i < map_length; i++) { - map[i] = new StackMapEntry(file, constant_pool); + map[i] = new StackMapEntry(input, constant_pool); } } diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index fc15febf..3c360d0b 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; @@ -45,20 +45,21 @@ public final class StackMapEntry implements Cloneable, Serializable { /** - * Construct object from file stream. - * @param file Input stream + * Construct object from input stream. + * + * @param input Input stream * @throws IOException */ - StackMapEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { - this(file.readShort(), file.readShort(), null, -1, null, constant_pool); + StackMapEntry(DataInput input, ConstantPool constant_pool) throws IOException { + this(input.readShort(), input.readShort(), null, -1, null, constant_pool); types_of_locals = new StackMapType[number_of_locals]; for (int i = 0; i < number_of_locals; i++) { - types_of_locals[i] = new StackMapType(file, constant_pool); + types_of_locals[i] = new StackMapType(input, constant_pool); } - number_of_stack_items = file.readShort(); + number_of_stack_items = input.readShort(); types_of_stack_items = new StackMapType[number_of_stack_items]; for (int i = 0; i < number_of_stack_items; i++) { - types_of_stack_items[i] = new StackMapType(file, constant_pool); + types_of_stack_items[i] = new StackMapType(input, constant_pool); } } diff --git a/src/main/java/org/apache/bcel/classfile/Synthetic.java b/src/main/java/org/apache/bcel/classfile/Synthetic.java index 324a3937..346473ab 100644 --- a/src/main/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/main/java/org/apache/bcel/classfile/Synthetic.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -65,19 +65,20 @@ public final class Synthetic extends Attribute { /** - * Construct object from file stream. + * Construct object from input stream. + * * @param name_index Index in constant pool to CONSTANT_Utf8 * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants * @throws IOException */ - Synthetic(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + Synthetic(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (byte[]) null, constant_pool); if (length > 0) { bytes = new byte[length]; - file.readFully(bytes); + input.readFully(bytes); System.err.println("Synthetic attribute with length > 0"); } } diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index 5441c773..085cf86c 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.util.HashMap; @@ -83,19 +83,20 @@ public final class Unknown extends Attribute { /** - * Construct object from file stream. + * Construct object from input stream. + * * @param name_index Index in constant pool * @param length Content length in bytes - * @param file Input stream + * @param input Input stream * @param constant_pool Array of constants * @throws IOException */ - Unknown(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + Unknown(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (byte[]) null, constant_pool); if (length > 0) { bytes = new byte[length]; - file.readFully(bytes); + input.readFully(bytes); } } -- GitLab From 5c2a99ac1da30cafb7de9475ef343dbd25ca17d0 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 19 Dec 2014 13:03:00 +0000 Subject: [PATCH 0704/1313] Reformatted LocalVariableTypeTable git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646698 13f79535-47bb-0310-9956-ffa450edef68 --- .../classfile/LocalVariableTypeTable.java | 166 +++++++++--------- 1 file changed, 84 insertions(+), 82 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index fa49bc90..7db1c2a0 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -14,10 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.apache.bcel.classfile; -import org.apache.bcel.Constants; -import java.io.*; +import java.io.DataInput; +import java.io.DataOutputStream; +import java.io.IOException; + +import org.apache.bcel.Constants; // The new table is used when generic types are about... @@ -47,103 +51,101 @@ import java.io.*; // } // J5TODO: Needs some testing ! public class LocalVariableTypeTable extends Attribute { - private static final long serialVersionUID = -1082157891095177114L; -private int local_variable_type_table_length; // Table of local - private LocalVariable[] local_variable_type_table; // variables - - public LocalVariableTypeTable(LocalVariableTypeTable c) { - this(c.getNameIndex(), c.getLength(), c.getLocalVariableTypeTable(), - c.getConstantPool()); - } - - public LocalVariableTypeTable(int name_index, int length, - LocalVariable[] local_variable_table, - ConstantPool constant_pool) - { - super(Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE, name_index, length, constant_pool); - setLocalVariableTable(local_variable_table); - } - - LocalVariableTypeTable(int nameIdx, int len, DataInput input,ConstantPool cpool) throws IOException { - this(nameIdx, len, (LocalVariable[])null, cpool); - - local_variable_type_table_length = (input.readUnsignedShort()); - local_variable_type_table = new LocalVariable[local_variable_type_table_length]; - - for(int i=0; i < local_variable_type_table_length; i++) { - local_variable_type_table[i] = new LocalVariable(input, cpool); + + private static final long serialVersionUID = -1082157891095177114L; + + private int local_variable_type_table_length; // Table of local + private LocalVariable[] local_variable_type_table; // variables + + public LocalVariableTypeTable(LocalVariableTypeTable c) { + this(c.getNameIndex(), c.getLength(), c.getLocalVariableTypeTable(), c.getConstantPool()); } - } - - @Override -public void accept(Visitor v) { - v.visitLocalVariableTypeTable(this); - } - - @Override -public final void dump(DataOutputStream file) throws IOException - { - super.dump(file); - file.writeShort(local_variable_type_table_length); - for(int i=0; i < local_variable_type_table_length; i++) { - local_variable_type_table[i].dump(file); + + public LocalVariableTypeTable(int name_index, int length, LocalVariable[] local_variable_table, ConstantPool constant_pool) { + super(Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE, name_index, length, constant_pool); + setLocalVariableTable(local_variable_table); } - } - public final LocalVariable[] getLocalVariableTypeTable() { - return local_variable_type_table; - } + LocalVariableTypeTable(int nameIdx, int len, DataInput input, ConstantPool cpool) throws IOException { + this(nameIdx, len, (LocalVariable[]) null, cpool); + + local_variable_type_table_length = (input.readUnsignedShort()); + local_variable_type_table = new LocalVariable[local_variable_type_table_length]; - public final LocalVariable getLocalVariable(int index) { - for(int i=0; i < local_variable_type_table_length; i++) { - if(local_variable_type_table[i].getIndex() == index) { - return local_variable_type_table[i]; + for (int i = 0; i < local_variable_type_table_length; i++) { + local_variable_type_table[i] = new LocalVariable(input, cpool); } } - return null; - } + @Override + public void accept(Visitor v) { + v.visitLocalVariableTypeTable(this); + } - public final void setLocalVariableTable(LocalVariable[] local_variable_table) - { - this.local_variable_type_table = local_variable_table; - local_variable_type_table_length = (local_variable_table == null)? 0 : - local_variable_table.length; - } + @Override + public final void dump(DataOutputStream file) throws IOException { + super.dump(file); + file.writeShort(local_variable_type_table_length); + for (int i = 0; i < local_variable_type_table_length; i++) { + local_variable_type_table[i].dump(file); + } + } - /** - * @return String representation. - */ - @Override -public final String toString() { - StringBuilder buf = new StringBuilder(); + public final LocalVariable[] getLocalVariableTypeTable() { + return local_variable_type_table; + } - for(int i=0; i < local_variable_type_table_length; i++) { - buf.append(local_variable_type_table[i].toString()); + public final LocalVariable getLocalVariable(int index) { + for (int i = 0; i < local_variable_type_table_length; i++) { + if (local_variable_type_table[i].getIndex() == index) { + return local_variable_type_table[i]; + } + } - if(i < local_variable_type_table_length - 1) { - buf.append('\n'); + return null; } + + public final void setLocalVariableTable(LocalVariable[] local_variable_table) { + this.local_variable_type_table = local_variable_table; + local_variable_type_table_length = (local_variable_table == null) ? 0 : + local_variable_table.length; } - return buf.toString(); - } + /** + * @return String representation. + */ + @Override + public final String toString() { + StringBuilder buf = new StringBuilder(); - /** - * @return deep copy of this attribute - */ - @Override -public Attribute copy(ConstantPool constant_pool) { - LocalVariableTypeTable c = (LocalVariableTypeTable)clone(); + for (int i = 0; i < local_variable_type_table_length; i++) { + buf.append(local_variable_type_table[i].toString()); + + if (i < local_variable_type_table_length - 1) { + buf.append('\n'); + } + } - c.local_variable_type_table = new LocalVariable[local_variable_type_table_length]; - for(int i=0; i < local_variable_type_table_length; i++) { - c.local_variable_type_table[i] = local_variable_type_table[i].copy(); + return buf.toString(); } - c.constant_pool = constant_pool; - return c; - } + /** + * @return deep copy of this attribute + */ + @Override + public Attribute copy(ConstantPool constant_pool) { + LocalVariableTypeTable c = (LocalVariableTypeTable) clone(); - public final int getTableLength() { return local_variable_type_table_length; } + c.local_variable_type_table = new LocalVariable[local_variable_type_table_length]; + for (int i = 0; i < local_variable_type_table_length; i++) { + c.local_variable_type_table[i] = local_variable_type_table[i].copy(); + } + + c.constant_pool = constant_pool; + return c; + } + + public final int getTableLength() { + return local_variable_type_table_length; + } } -- GitLab From 7e071ab886d7d181b79cb23a9aa6925c8a714389 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 19 Dec 2014 13:16:22 +0000 Subject: [PATCH 0705/1313] Package private constructors for the classes extending Attribute git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646701 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/classfile/AnnotationDefault.java | 4 +--- src/main/java/org/apache/bcel/classfile/Annotations.java | 2 +- .../java/org/apache/bcel/classfile/EnclosingMethod.java | 2 +- .../apache/bcel/classfile/RuntimeVisibleAnnotations.java | 6 ++---- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index cf535fa3..db7693b5 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -45,9 +45,7 @@ public class AnnotationDefault extends Attribute * @param constant_pool * Array of constants */ - public AnnotationDefault(int name_index, int length, - DataInput input, ConstantPool constant_pool) - throws IOException + AnnotationDefault(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (ElementValue) null, constant_pool); diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index 432aacb2..113c3144 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -42,7 +42,7 @@ public abstract class Annotations extends Attribute { * @param input Input stream * @param constant_pool Array of constants */ - public Annotations(byte annotation_type, int name_index, int length, DataInput input, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { + Annotations(byte annotation_type, int name_index, int length, DataInput input, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool, isRuntimeVisible); final int annotation_table_length = (input.readUnsignedShort()); annotation_table = new AnnotationEntry[annotation_table_length]; diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java index 36a90115..a4aa9d6d 100644 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -45,7 +45,7 @@ public class EnclosingMethod extends Attribute { private int methodIndex; // Ctors - and code to read an attribute in. - public EnclosingMethod(int nameIndex, int len, DataInput input, ConstantPool cpool) throws IOException { + EnclosingMethod(int nameIndex, int len, DataInput input, ConstantPool cpool) throws IOException { this(nameIndex, len, input.readUnsignedShort(), input.readUnsignedShort(), cpool); } diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 210bd64a..0f3be902 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -44,8 +44,7 @@ public class RuntimeVisibleAnnotations extends Annotations * @param constant_pool * Array of constants */ - public RuntimeVisibleAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) - throws IOException + RuntimeVisibleAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { super(Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS, name_index, length, input, constant_pool, true); } @@ -56,8 +55,7 @@ public class RuntimeVisibleAnnotations extends Annotations @Override public Attribute copy(ConstantPool constant_pool) { - Annotations c = (Annotations) clone(); - return c; + return (Annotations) clone(); } @Override -- GitLab From 1aea35e0701173e7c979576ece3ff76700d9543e Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 19 Dec 2014 13:18:23 +0000 Subject: [PATCH 0706/1313] Added @since 6.0 to EnclosingMethod git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646702 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/EnclosingMethod.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java index a4aa9d6d..6d6d6c0f 100644 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -25,6 +25,8 @@ import org.apache.bcel.Constants; /** * This attribute exists for local or * anonymous classes and ... there can be only one. + * + * @since 6.0 */ public class EnclosingMethod extends Attribute { -- GitLab From f9b81a07317f588f93a101ad3398d476a7b353b9 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 19 Dec 2014 13:19:42 +0000 Subject: [PATCH 0707/1313] Reformatted AnnotationDefault git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646703 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AnnotationDefault.java | 136 ++++++++---------- 1 file changed, 59 insertions(+), 77 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index db7693b5..a1c72408 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -13,103 +13,85 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * */ + package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; + import org.apache.bcel.Constants; /** - * represents the default value of a annotation for a method info - * - * @version $Id: AnnotationDefault 1 2005-02-13 03:15:08Z dbrosius $ + * Represents the default value of a annotation for a method info + * * @author D. Brosius + * @version $Id: AnnotationDefault 1 2005-02-13 03:15:08Z dbrosius $ * @since 6.0 */ -public class AnnotationDefault extends Attribute -{ - private static final long serialVersionUID = -4017327188724019487L; +public class AnnotationDefault extends Attribute { + + private static final long serialVersionUID = -4017327188724019487L; - private ElementValue default_value; + private ElementValue default_value; - /** - * @param name_index - * Index pointing to the name Code - * @param length - * Content length in bytes - * @param input - * Input stream - * @param constant_pool - * Array of constants - */ - AnnotationDefault(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException - { - this(name_index, length, (ElementValue) null, - constant_pool); - default_value = ElementValue.readElementValue(input, constant_pool); - } + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param input Input stream + * @param constant_pool Array of constants + */ + AnnotationDefault(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { + this(name_index, length, (ElementValue) null, constant_pool); + default_value = ElementValue.readElementValue(input, constant_pool); + } - /** - * @param name_index - * Index pointing to the name Code - * @param length - * Content length in bytes - * @param defaultValue - * the annotation's default value - * @param constant_pool - * Array of constants - */ - public AnnotationDefault(int name_index, int length, - ElementValue defaultValue, ConstantPool constant_pool) - { - super(Constants.ATTR_ANNOTATION_DEFAULT, name_index, length, constant_pool); - setDefaultValue(defaultValue); - } + /** + * @param name_index Index pointing to the name Code + * @param length Content length in bytes + * @param defaultValue the annotation's default value + * @param constant_pool Array of constants + */ + public AnnotationDefault(int name_index, int length, ElementValue defaultValue, ConstantPool constant_pool) { + super(Constants.ATTR_ANNOTATION_DEFAULT, name_index, length, constant_pool); + setDefaultValue(defaultValue); + } - /** - * Called by objects that are traversing the nodes of the tree implicitely - * defined by the contents of a Java class. I.e., the hierarchy of methods, - * fields, attributes, etc. spawns a tree of objects. - * - * @param v - * Visitor object - */ - @Override - public void accept(Visitor v) - { - v.visitAnnotationDefault(this); - } + /** + * Called by objects that are traversing the nodes of the tree implicitely + * defined by the contents of a Java class. I.e., the hierarchy of methods, + * fields, attributes, etc. spawns a tree of objects. + * + * @param v Visitor object + */ + @Override + public void accept(Visitor v) { + v.visitAnnotationDefault(this); + } - /** - * @param defaultValue - * the default value of this methodinfo's annotation - */ - public final void setDefaultValue(ElementValue defaultValue) - { - default_value = defaultValue; - } + /** + * @param defaultValue the default value of this methodinfo's annotation + */ + public final void setDefaultValue(ElementValue defaultValue) { + default_value = defaultValue; + } - /** - * @return the default value - */ - public final ElementValue getDefaultValue() - { - return default_value; - } + /** + * @return the default value + */ + public final ElementValue getDefaultValue() { + return default_value; + } - @Override - public Attribute copy(ConstantPool _constant_pool) - { - throw new RuntimeException("Not implemented yet!"); - } + @Override + public Attribute copy(ConstantPool _constant_pool) { + throw new RuntimeException("Not implemented yet!"); + } @Override - public final void dump(DataOutputStream dos) throws IOException - { - super.dump(dos); - default_value.dump(dos); + public final void dump(DataOutputStream dos) throws IOException { + super.dump(dos); + default_value.dump(dos); } } -- GitLab From 33b3e03a1898409cf12ab5092e87ef56224152bd Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 19 Dec 2014 13:32:32 +0000 Subject: [PATCH 0708/1313] Simplified the switch block in ElementValue git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646706 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/ElementValue.java | 124 +++++++----------- 1 file changed, 48 insertions(+), 76 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index 19e3abff..52ceb228 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -13,8 +13,8 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * */ + package org.apache.bcel.classfile; import java.io.DataInput; @@ -53,85 +53,57 @@ public abstract class ElementValue public abstract void dump(DataOutputStream dos) throws IOException; - public static final int STRING = 's'; - - public static final int ENUM_CONSTANT = 'e'; - - public static final int CLASS = 'c'; - - public static final int ANNOTATION = '@'; - - public static final int ARRAY = '['; - - public static final int PRIMITIVE_INT = 'I'; - - public static final int PRIMITIVE_BYTE = 'B'; - - public static final int PRIMITIVE_CHAR = 'C'; - - public static final int PRIMITIVE_DOUBLE = 'D'; - - public static final int PRIMITIVE_FLOAT = 'F'; - - public static final int PRIMITIVE_LONG = 'J'; - - public static final int PRIMITIVE_SHORT = 'S'; - - public static final int PRIMITIVE_BOOLEAN = 'Z'; - - public static ElementValue readElementValue(DataInput input, - ConstantPool cpool) throws IOException + public static final byte STRING = 's'; + public static final byte ENUM_CONSTANT = 'e'; + public static final byte CLASS = 'c'; + public static final byte ANNOTATION = '@'; + public static final byte ARRAY = '['; + public static final byte PRIMITIVE_INT = 'I'; + public static final byte PRIMITIVE_BYTE = 'B'; + public static final byte PRIMITIVE_CHAR = 'C'; + public static final byte PRIMITIVE_DOUBLE = 'D'; + public static final byte PRIMITIVE_FLOAT = 'F'; + public static final byte PRIMITIVE_LONG = 'J'; + public static final byte PRIMITIVE_SHORT = 'S'; + public static final byte PRIMITIVE_BOOLEAN = 'Z'; + + public static ElementValue readElementValue(DataInput input, ConstantPool cpool) throws IOException { byte type = input.readByte(); switch (type) { - case 'B': // byte - return new SimpleElementValue(PRIMITIVE_BYTE, input - .readUnsignedShort(), cpool); - case 'C': // char - return new SimpleElementValue(PRIMITIVE_CHAR, input - .readUnsignedShort(), cpool); - case 'D': // double - return new SimpleElementValue(PRIMITIVE_DOUBLE, input - .readUnsignedShort(), cpool); - case 'F': // float - return new SimpleElementValue(PRIMITIVE_FLOAT, input - .readUnsignedShort(), cpool); - case 'I': // int - return new SimpleElementValue(PRIMITIVE_INT, input - .readUnsignedShort(), cpool); - case 'J': // long - return new SimpleElementValue(PRIMITIVE_LONG, input - .readUnsignedShort(), cpool); - case 'S': // short - return new SimpleElementValue(PRIMITIVE_SHORT, input - .readUnsignedShort(), cpool); - case 'Z': // boolean - return new SimpleElementValue(PRIMITIVE_BOOLEAN, input - .readUnsignedShort(), cpool); - case 's': // String - return new SimpleElementValue(STRING, input.readUnsignedShort(), - cpool); - case 'e': // Enum constant - return new EnumElementValue(ENUM_CONSTANT, input.readUnsignedShort(), - input.readUnsignedShort(), cpool); - case 'c': // Class - return new ClassElementValue(CLASS, input.readUnsignedShort(), cpool); - case '@': // Annotation - // TODO isRuntimeVisible - return new AnnotationElementValue(ANNOTATION, AnnotationEntry.read( - input, cpool, false), cpool); - case '[': // Array - int numArrayVals = input.readUnsignedShort(); - ElementValue[] evalues = new ElementValue[numArrayVals]; - for (int j = 0; j < numArrayVals; j++) - { - evalues[j] = ElementValue.readElementValue(input, cpool); - } - return new ArrayElementValue(ARRAY, evalues, cpool); - default: - throw new RuntimeException( - "Unexpected element value kind in annotation: " + type); + case PRIMITIVE_BYTE: + case PRIMITIVE_CHAR: + case PRIMITIVE_DOUBLE: + case PRIMITIVE_FLOAT: + case PRIMITIVE_INT: + case PRIMITIVE_LONG: + case PRIMITIVE_SHORT: + case PRIMITIVE_BOOLEAN: + case STRING: + return new SimpleElementValue(type, input.readUnsignedShort(), cpool); + + case ENUM_CONSTANT: + return new EnumElementValue(ENUM_CONSTANT, input.readUnsignedShort(), input.readUnsignedShort(), cpool); + + case CLASS: + return new ClassElementValue(CLASS, input.readUnsignedShort(), cpool); + + case ANNOTATION: + // TODO isRuntimeVisible + return new AnnotationElementValue(ANNOTATION, AnnotationEntry.read(input, cpool, false), cpool); + + case ARRAY: + int numArrayVals = input.readUnsignedShort(); + ElementValue[] evalues = new ElementValue[numArrayVals]; + for (int j = 0; j < numArrayVals; j++) + { + evalues[j] = ElementValue.readElementValue(input, cpool); + } + return new ArrayElementValue(ARRAY, evalues, cpool); + + default: + throw new RuntimeException("Unexpected element value kind in annotation: " + type); } } -- GitLab From 961062659bdc9aa7ada2a0fac5c03671493d1a68 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 19 Dec 2014 16:16:00 +0000 Subject: [PATCH 0709/1313] Added a test for Class2HTML git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646788 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/util/Class2HTMLTestCase.java | 38 ++++++++++++++++++ src/test/resources/Java8Example.class | Bin 0 -> 1533 bytes src/test/resources/Java8Example.java | 13 ++++++ 3 files changed, 51 insertions(+) create mode 100644 src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java create mode 100644 src/test/resources/Java8Example.class create mode 100644 src/test/resources/Java8Example.java diff --git a/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java b/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java new file mode 100644 index 00000000..008a6b97 --- /dev/null +++ b/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.bcel.util; + +import java.io.File; +import java.io.FileInputStream; + +import junit.framework.TestCase; +import org.apache.bcel.classfile.ClassParser; + +public class Class2HTMLTestCase extends TestCase { + + public void testConvertJavaUtil() throws Exception { + File outputDir = new File("target/test-output/html"); + outputDir.mkdirs(); + + FileInputStream file = new FileInputStream("target/test-classes/Java8Example.class"); + + ClassParser parser = new ClassParser(file, "Java8Example.class"); + + new Class2HTML(parser.parse(), outputDir.getAbsolutePath() + "/"); + } +} diff --git a/src/test/resources/Java8Example.class b/src/test/resources/Java8Example.class new file mode 100644 index 0000000000000000000000000000000000000000..04030d5b84ef22187e6752a5cc60230cfb253614 GIT binary patch literal 1533 zcmX^0Z`VEs1_l#`D0T)Z4hCrs1{n?pSuO@S26;{f1qMYf1|OYYH|ro2&~Vss3@_rn2~`ku^40oBZI0&G*ak5 zbXaRbgupsL%B*2#K!UKcxFj`~k%2kCw1kmC6rwgWUq7HIGp{7Lq$o8p*P4+*80=V7 zVMYe_0+6DdJhWJW*&D{lz*Y=4fssL41KAl6QBd@OjOSwTWAMjeMie&#KSKZ`14~J2 zaS0=X0*WzdrFqFEnfZD80Y#}PnaPPIsn(1P;$WwOeT!lZBLiDnW==_J5hH^oG!20j zVKD@^QyCegF^qT4&&f$mF3B$f#Y9OyD2N#u3ut1Q~=F7#V~a7#Ok`SQwZY7#N(`_A)R= zG7B*UN3sYp2S>6Bu>|j6VD;I=z^1*8fn9qi0|z6+E(T5phMf#tObk01xOXz}Ffklp z;Pu_az^1c}fqf$b0|O(22m=Fy7y~N<0|PsQI0FZR90M1F6$3YeBLj~B7bwc1_8KyP z+`+)Wr?riNk97$HJIitg7Une!3=B+QGuRjy85kJ27{nPE7+4vYcpMlRm>DF%(vl3J hU@1n1V1{sp5C%yGRR#tI9tK7RH3nt|bp{OvO#ot`nH>NC literal 0 HcmV?d00001 diff --git a/src/test/resources/Java8Example.java b/src/test/resources/Java8Example.java new file mode 100644 index 00000000..20ddc298 --- /dev/null +++ b/src/test/resources/Java8Example.java @@ -0,0 +1,13 @@ +import java.util.*; +import java.util.stream.*; + +public interface Java8Example { + + default void hello() { + List words = Arrays.asList("Hello", "World", "hi"); + System.out.println(words); + + List words2 = words.stream().filter((String s) -> s.length() > 2).collect(Collectors. toList()); + System.out.println(words2); + } +} -- GitLab From 61e6be8ca7046bbb725276c9a3c155094065f720 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 19 Dec 2014 16:20:06 +0000 Subject: [PATCH 0710/1313] Implement constantToString for MethodHandle, MethodType and InvokeDynamic git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1646789 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 19 +++++++++++++++++++ .../apache/bcel/classfile/ConstantPool.java | 12 ++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index c9dd4744..ddbcd81a 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -1511,4 +1511,23 @@ public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUN public static final int SAME_LOCALS_1_STACK_ITEM_FRAME_MAX = 127; public static final int CHOP_FRAME_MAX = 250; public static final int APPEND_FRAME_MAX = 254; + + + // Constants defining the behavior of the Method Handles (JVMS §5.4.3.5) + + public static final byte REF_getField = 1; + public static final byte REF_getStatic = 2; + public static final byte REF_putField = 3; + public static final byte REF_putStatic = 4; + public static final byte REF_invokeVirtual = 5; + public static final byte REF_invokeStatic = 6; + public static final byte REF_invokeSpecial = 7; + public static final byte REF_newInvokeSpecial = 8; + public static final byte REF_invokeInterface = 9; + + public static final String[] REF_NAMES = { + "getfield", "getstatic", "putfield", + "putstatic", "invokevirtual", "invokestatic", + "invokespecial", "new dup invokespecial", "invokeinterface" + }; } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index c65c5ba8..2cf0c586 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -143,6 +143,18 @@ public class ConstantPool implements Cloneable, Node, Serializable { + "." + constantToString(((ConstantCP) c).getNameAndTypeIndex(), Constants.CONSTANT_NameAndType)); break; + case Constants.CONSTANT_MethodHandle: + ConstantMethodHandle cmh = (ConstantMethodHandle) c; + str = Constants.REF_NAMES[cmh.getReferenceKind()] + " " + constantToString(constant_pool[cmh.getReferenceIndex()]); + break; + case Constants.CONSTANT_MethodType: + ConstantMethodType cmt = (ConstantMethodType) c; + str = constantToString(cmt.getDescriptorIndex(), Constants.CONSTANT_Utf8); + break; + case Constants.CONSTANT_InvokeDynamic: + ConstantInvokeDynamic cid = ((ConstantInvokeDynamic) c); + str = cid.getBootstrapMethodAttrIndex() + ": " + constantToString(cid.getNameAndTypeIndex(), Constants.CONSTANT_NameAndType); + break; default: // Never reached throw new RuntimeException("Unknown constant type " + tag); } -- GitLab From a2639fec4beb3db8e68c9a89a5f289c62da67648 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 16 Jan 2015 22:56:06 +0000 Subject: [PATCH 0711/1313] Use the local file separator character git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1652540 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/JavaClass.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index c7bcb68e..4c0844ef 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -72,7 +72,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public static final byte FILE = 2; public static final byte ZIP = 3; static boolean debug = false; // Debugging on/off - static char sep = '/'; // directory separator + final static char sep = File.separatorChar; // directory separator // Annotations are collected from certain attributes, don't do it more than necessary! private boolean annotationsOutOfDate = true; @@ -490,8 +490,6 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl static { // Debugging ... on/off debug = Boolean.getBoolean("JavaClass.debug"); - // Get path separator either / or \ usually - sep = File.separatorChar; } -- GitLab From fbcd823d35677e12d3bc37db531f3f18cdb17535 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 16 Jan 2015 22:58:51 +0000 Subject: [PATCH 0712/1313] BCEL-186 Performance degradation with the UTF8 cache getInstance no longer uses the cache git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1652541 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 4 ++++ src/main/java/org/apache/bcel/classfile/ConstantUtf8.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index ef07141a..c125c4be 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,10 @@ The type attribute can be add,update,fix,remove. + + Performance degradation with the UTF8 cache + getInstance no longer uses cache + org.apache.bcel.util.ClassLoaderRepository.loadClass(String) leaks input streams. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index ffaefa7f..9e93613f 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -90,7 +90,7 @@ public final class ConstantUtf8 extends Constant { } public static ConstantUtf8 getInstance(String s) { - return getCachedInstance(s); + return new ConstantUtf8(s); } public static ConstantUtf8 getInstance (DataInput input) throws IOException { -- GitLab From 880eac2afd7acf2b835d6fe43c35c6a0066babea Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 16 Jan 2015 23:32:43 +0000 Subject: [PATCH 0713/1313] Unused import git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1652548 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Constant.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index a4c08255..f7a3dbc5 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -18,7 +18,6 @@ package org.apache.bcel.classfile; import java.io.DataInput; -import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; -- GitLab From e73d4e5e2e958c424006e1ad6ea99374df617e1d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 16 Jan 2015 23:33:55 +0000 Subject: [PATCH 0714/1313] Standard order git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1652549 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ConstantUtf8.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index 9e93613f..530a7c67 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -47,8 +47,8 @@ public final class ConstantUtf8 extends Constant { private static int hits = 0; private static int skipped = 0; private static int created = 0; - final static boolean BCEL_STATISTICS = Boolean.getBoolean("bcel.statistics"); - final static boolean BCEL_DONT_CACHE = Boolean.getBoolean("bcel.dontCache"); + static final boolean BCEL_STATISTICS = Boolean.getBoolean("bcel.statistics"); + static final boolean BCEL_DONT_CACHE = Boolean.getBoolean("bcel.dontCache"); static { if (BCEL_STATISTICS) { -- GitLab From a6571621303994c35774674dcb65ce42c98672af Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 16 Jan 2015 23:34:24 +0000 Subject: [PATCH 0715/1313] CP 36 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1652550 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c4d03b9e..53e034bc 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ org.apache.commons commons-parent - 35 + 36 org.apache.bcel @@ -334,7 +334,7 @@ junit junit - 4.11 + 4.12 test -- GitLab From 68edb354fa8c29c628263631b446721add4eff6e Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 16 Jan 2015 23:38:29 +0000 Subject: [PATCH 0716/1313] Odd code git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1652551 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/ClassPath.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 2922e2af..c2528694 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -261,7 +261,7 @@ public class ClassPath implements Serializable { * @return class file for the java class */ public ClassFile getClassFile( String name, String suffix ) throws IOException { - for (PathEntry path : paths) { + for (PathEntry path : paths) { // TODO why is path not used?? ClassFile cf = null; if(parent != null) { -- GitLab From ae887bde4df5b1f61ff418635a51925d2d94aacc Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 17 Jan 2015 11:30:31 +0000 Subject: [PATCH 0717/1313] BCEL-186 Performance degradation with the UTF8 cache Tidy up and simplify caching code in case it can be made performant Might still be useful as a way of saving memory in some cases git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1652582 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/ConstantUtf8.java | 78 ++++++++++++------- 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index 530a7c67..22a6e545 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -40,53 +40,71 @@ public final class ConstantUtf8 extends Constant { private static final long serialVersionUID = -8709101585611518985L; private final String bytes; - private static final int MAX_CACHE_ENTRIES = 20000; - private static final int INITIAL_CACHE_CAPACITY = (int)(MAX_CACHE_ENTRIES/0.75); - private static HashMap cache; - private static int considered = 0; - private static int hits = 0; - private static int skipped = 0; - private static int created = 0; - static final boolean BCEL_STATISTICS = Boolean.getBoolean("bcel.statistics"); - static final boolean BCEL_DONT_CACHE = Boolean.getBoolean("bcel.dontCache"); + private static volatile int considered = 0; + private static volatile int hits = 0; + private static volatile int skipped = 0; + private static volatile int created = 0; + + // Set the size to 0 or below to skip caching entirely + private static final int MAX_CACHED_SIZE = Integer.getInteger("bcel.maxcached.size"); + private static final boolean BCEL_STATISTICS = Boolean.getBoolean("bcel.statistics"); + + + private static class CACHE_HOLDER { + + private static final int MAX_CACHE_ENTRIES = 20000; + private static final int INITIAL_CACHE_CAPACITY = (int)(MAX_CACHE_ENTRIES/0.75); + + private static final HashMap CACHE = + new LinkedHashMap(INITIAL_CACHE_CAPACITY, 0.75f, true) { + private static final long serialVersionUID = -8506975356158971766L; + + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > MAX_CACHE_ENTRIES; + } + }; + + } + + // for accesss by test code + static void printStats() { + System.err.println("Cache hit " + hits + "/" + considered +", " + skipped + " skipped"); + System.err.println("Total of " + created + " ConstantUtf8 objects created"); + } + + // for accesss by test code + static void clearStats() { + hits = considered = skipped = created = 0; + } static { if (BCEL_STATISTICS) { Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { - System.err.println("Cache hit " + hits + "/" + considered +", " - + skipped + " skipped"); - System.err.println("Total of " + created + " ConstantUtf8 objects created"); + printStats(); } }); } } - public static synchronized ConstantUtf8 getCachedInstance(String s) { - if (BCEL_DONT_CACHE || s.length() > 200) { + public static ConstantUtf8 getCachedInstance(String s) { + if (s.length() > MAX_CACHED_SIZE) { skipped++; return new ConstantUtf8(s); } considered++; - if (cache == null) { - cache = new LinkedHashMap(INITIAL_CACHE_CAPACITY, 0.75f, true) { - private static final long serialVersionUID = -8506975356158971766L; - - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > MAX_CACHE_ENTRIES; + synchronized (ConstantUtf8.class) { // might be better with a specific lock object + ConstantUtf8 result = CACHE_HOLDER.CACHE.get(s); + if (result != null) { + hits++; + return result; } - }; + result = new ConstantUtf8(s); + CACHE_HOLDER.CACHE.put(s, result); + return result; } - ConstantUtf8 result = cache.get(s); - if (result != null) { - hits++; - return result; - } - result = new ConstantUtf8(s); - cache.put(s, result); - return result; } public static ConstantUtf8 getInstance(String s) { -- GitLab From e103eea0addbbe3781775ac714c89473086d1ad7 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 17 Jan 2015 11:40:49 +0000 Subject: [PATCH 0718/1313] Docs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1652584 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index ddbcd81a..e609f55c 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -1447,6 +1447,8 @@ public interface Constants { public static final byte ATTR_BOOTSTRAP_METHODS = 20; public static final byte ATTR_METHOD_PARAMETERS = 21; + public static final short KNOWN_ATTRIBUTES = 22; // count of attributes + /** @deprecated Use {@link #ATTR_RUNTIME_VISIBLE_ANNOTATIONS} instead */ @Deprecated public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = ATTR_RUNTIME_VISIBLE_ANNOTATIONS; @@ -1460,9 +1462,7 @@ public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUN @Deprecated public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS; - public static final short KNOWN_ATTRIBUTES = 22; - - // TOFO: FIXXXXX + // TODO: mutable public array!! public static final String[] ATTRIBUTE_NAMES = { "SourceFile", "ConstantValue", "Code", "Exceptions", "LineNumberTable", "LocalVariableTable", @@ -1513,7 +1513,7 @@ public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUN public static final int APPEND_FRAME_MAX = 254; - // Constants defining the behavior of the Method Handles (JVMS §5.4.3.5) + // Constants defining the behavior of the Method Handles (JVMS �5.4.3.5) public static final byte REF_getField = 1; public static final byte REF_getStatic = 2; -- GitLab From 8dab4e845ccbdb0a0f287c38ceafd7d15e417c06 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 17 Jan 2015 12:47:01 +0000 Subject: [PATCH 0719/1313] BCEL-186 Performance degradation with the UTF8 cache Oops - forget the default value git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1652598 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ConstantUtf8.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index 22a6e545..f754f835 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -46,7 +46,7 @@ public final class ConstantUtf8 extends Constant { private static volatile int created = 0; // Set the size to 0 or below to skip caching entirely - private static final int MAX_CACHED_SIZE = Integer.getInteger("bcel.maxcached.size"); + private static final int MAX_CACHED_SIZE = Integer.getInteger("bcel.maxcached.size", 200).intValue(); private static final boolean BCEL_STATISTICS = Boolean.getBoolean("bcel.statistics"); -- GitLab From 94e90614bed502d9e77b8f916c00eb442cdf9d63 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Mon, 26 Jan 2015 22:02:53 +0000 Subject: [PATCH 0720/1313] Added the missing @since tags on the classes git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1654902 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/AnnotationElementValue.java | 3 +++ .../java/org/apache/bcel/classfile/ArrayElementValue.java | 3 +++ .../java/org/apache/bcel/classfile/ClassElementValue.java | 3 +++ .../java/org/apache/bcel/classfile/ConstantInvokeDynamic.java | 1 + .../java/org/apache/bcel/classfile/ConstantMethodHandle.java | 1 + .../java/org/apache/bcel/classfile/ConstantMethodType.java | 1 + src/main/java/org/apache/bcel/classfile/EnumElementValue.java | 3 +++ .../org/apache/bcel/classfile/LocalVariableTypeTable.java | 4 ++++ .../java/org/apache/bcel/classfile/SimpleElementValue.java | 3 +++ src/main/java/org/apache/bcel/classfile/StackMapTable.java | 1 + .../java/org/apache/bcel/classfile/StackMapTableEntry.java | 1 + .../org/apache/bcel/generic/AnnotationElementValueGen.java | 3 +++ src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java | 4 +++- .../java/org/apache/bcel/generic/ArrayElementValueGen.java | 3 +++ .../java/org/apache/bcel/generic/ClassElementValueGen.java | 3 +++ src/main/java/org/apache/bcel/generic/ElementValueGen.java | 3 +++ .../java/org/apache/bcel/generic/ElementValuePairGen.java | 3 +++ .../java/org/apache/bcel/generic/EnumElementValueGen.java | 3 +++ src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java | 1 + .../org/apache/bcel/generic/NameSignatureInstruction.java | 1 + .../java/org/apache/bcel/generic/SimpleElementValueGen.java | 3 +++ 21 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java index 95c9c894..4c699c59 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java @@ -20,6 +20,9 @@ package org.apache.bcel.classfile; import java.io.DataOutputStream; import java.io.IOException; +/** + * @since 6.0 + */ public class AnnotationElementValue extends ElementValue { // For annotation element values, this is the annotation diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java index 98de2a72..58297262 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -20,6 +20,9 @@ package org.apache.bcel.classfile; import java.io.DataOutputStream; import java.io.IOException; +/** + * @since 6.0 + */ public class ArrayElementValue extends ElementValue { // For array types, this is the array diff --git a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java index 600d6ea2..46a81a53 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java @@ -21,6 +21,9 @@ import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; +/** + * @since 6.0 + */ public class ClassElementValue extends ElementValue { // For primitive types and string type, this points to the value entry in diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java b/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java index 4a2b1373..539213a7 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java @@ -29,6 +29,7 @@ import org.apache.bcel.Constants; * and represents a reference to a invoke dynamic. * * @see Constant + * @since 6.0 */ public final class ConstantInvokeDynamic extends Constant { diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java index 24905708..80fd97f1 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java @@ -29,6 +29,7 @@ import org.apache.bcel.Constants; * and represents a reference to a method handle. * * @see Constant + * @since 6.0 */ public final class ConstantMethodHandle extends Constant { diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java index 33debb48..653f1151 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java @@ -29,6 +29,7 @@ import org.apache.bcel.Constants; * and represents a reference to a method type. * * @see Constant + * @since 6.0 */ public final class ConstantMethodType extends Constant { diff --git a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java index 7e10be75..8cd3af75 100644 --- a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java @@ -21,6 +21,9 @@ import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; +/** + * @since 6.0 + */ public class EnumElementValue extends ElementValue { // For enum types, these two indices point to the type and value diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index 7db1c2a0..27044f43 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -50,6 +50,10 @@ import org.apache.bcel.Constants; // } local_variable_type_table[local_variable_type_table_length]; // } // J5TODO: Needs some testing ! + +/** + * since 6.0 + */ public class LocalVariableTypeTable extends Attribute { private static final long serialVersionUID = -1082157891095177114L; diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java index cad501d9..9a9712ee 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -21,6 +21,9 @@ import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; +/** + * @since 6.0 + */ public class SimpleElementValue extends ElementValue { private int index; diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTable.java b/src/main/java/org/apache/bcel/classfile/StackMapTable.java index 35d2b866..d52bf4cc 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTable.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTable.java @@ -36,6 +36,7 @@ import org.apache.bcel.Constants; * @see Code * @see StackMapEntry * @see StackMapType + * @since 6.0 */ public final class StackMapTable extends Attribute { diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index 24d3f4b5..acf04ed2 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -33,6 +33,7 @@ import org.apache.bcel.Constants; * @author M. Dahm * @see StackMap * @see StackMapType + * @since 6.0 */ public final class StackMapTableEntry implements Cloneable, Serializable { diff --git a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java index d3c72d4e..7f0113c9 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java @@ -22,6 +22,9 @@ import java.io.IOException; import org.apache.bcel.classfile.AnnotationElementValue; import org.apache.bcel.classfile.ElementValue; +/** + * @since 6.0 + */ public class AnnotationElementValueGen extends ElementValueGen { // For annotation element values, this is the annotation diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index b8a08cae..8f1dfdac 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -27,7 +27,9 @@ import org.apache.bcel.classfile.AnnotationEntry; import org.apache.bcel.classfile.ConstantUtf8; import org.apache.bcel.classfile.ElementValuePair; - +/** + * @since 6.0 + */ public class AnnotationEntryGen { private int typeIndex; diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index d2dc968f..cc361be2 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -25,6 +25,9 @@ import java.util.List; import org.apache.bcel.classfile.ArrayElementValue; import org.apache.bcel.classfile.ElementValue; +/** + * @since 6.0 + */ public class ArrayElementValueGen extends ElementValueGen { // J5TODO: Should we make this an array or a list? A list would be easier to diff --git a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java index db1fe48b..9349383c 100644 --- a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java @@ -26,6 +26,9 @@ import org.apache.bcel.generic.ConstantPoolGen; import org.apache.bcel.generic.ObjectType; import org.apache.bcel.generic.ElementValueGen; +/** + * @since 6.0 + */ public class ClassElementValueGen extends ElementValueGen { // For primitive types and string type, this points to the value entry in diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java index 6da3f3af..1ceb30f3 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -29,6 +29,9 @@ import org.apache.bcel.classfile.ElementValue; import org.apache.bcel.classfile.EnumElementValue; import org.apache.bcel.classfile.SimpleElementValue; +/** + * @since 6.0 + */ public abstract class ElementValueGen { protected int type; diff --git a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java index 5bce1b26..4c74a8cb 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java @@ -23,6 +23,9 @@ import org.apache.bcel.classfile.ConstantUtf8; import org.apache.bcel.classfile.ElementValue; import org.apache.bcel.classfile.ElementValuePair; +/** + * @since 6.0 + */ public class ElementValuePairGen { private int nameIdx; diff --git a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java index 3b8d5ace..50b81e1c 100644 --- a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java @@ -23,6 +23,9 @@ import org.apache.bcel.classfile.ConstantUtf8; import org.apache.bcel.classfile.ElementValue; import org.apache.bcel.classfile.EnumElementValue; +/** + * @since 6.0 + */ public class EnumElementValueGen extends ElementValueGen { // For enum types, these two indices point to the type and value diff --git a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java index 841cf849..d77ef5d8 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java @@ -35,6 +35,7 @@ import org.apache.bcel.util.ByteSequence; * * @version $Id: InvokeInstruction.java 1152072 2011-07-29 01:54:05Z dbrosius $ * @author Bill Pugh + * @since 6.0 */ public class INVOKEDYNAMIC extends NameSignatureInstruction implements ExceptionThrower, StackConsumer, StackProducer { diff --git a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java index e49f695c..66997a41 100644 --- a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java +++ b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java @@ -28,6 +28,7 @@ import org.apache.bcel.classfile.ConstantUtf8; * * @version $Id: FieldOrMethod.java 1481383 2013-05-11 17:34:32Z dbrosius $ * @author Bill Pugh + * @since 6.0 */ public abstract class NameSignatureInstruction extends CPInstruction { diff --git a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java index a2a3a0a1..40651c53 100644 --- a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java @@ -27,6 +27,9 @@ import org.apache.bcel.classfile.ConstantUtf8; import org.apache.bcel.classfile.ElementValue; import org.apache.bcel.classfile.SimpleElementValue; +/** + * @since 6.0 + */ public class SimpleElementValueGen extends ElementValueGen { // For primitive types and string type, this points to the value entry in -- GitLab From b49c7c0f23436b936c98f5a27ac188a64fd7ab12 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Mon, 26 Jan 2015 23:47:56 +0000 Subject: [PATCH 0721/1313] Replaced more DataInputStream with DataInput git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1654916 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/classfile/AnnotationEntry.java | 2 +- src/main/java/org/apache/bcel/classfile/StackMapTable.java | 4 ++-- .../java/org/apache/bcel/classfile/StackMapTableEntry.java | 6 +++--- src/main/java/org/apache/bcel/classfile/Unknown.java | 2 +- .../java/org/apache/bcel/generic/AnnotationEntryGen.java | 4 ++-- src/main/java/org/apache/bcel/generic/ElementValueGen.java | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index c5385d44..817d6a46 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -44,7 +44,7 @@ public class AnnotationEntry implements Node, Constants, Serializable { private List element_value_pairs; /** - * Factory method to create an AnnotionEntry from a DataInputStream + * Factory method to create an AnnotionEntry from a DataInput * * @param input * @param constant_pool diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTable.java b/src/main/java/org/apache/bcel/classfile/StackMapTable.java index d52bf4cc..4a4fc5fc 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTable.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTable.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -65,7 +65,7 @@ public final class StackMapTable extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - StackMapTable(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + StackMapTable(int name_index, int length, DataInput file, ConstantPool constant_pool) throws IOException { this(name_index, length, (StackMapTableEntry[]) null, constant_pool); map_length = file.readUnsignedShort(); diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index acf04ed2..cadfc11d 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; @@ -53,8 +53,8 @@ public final class StackMapTableEntry implements Cloneable, Serializable { * @param file Input stream * @throws IOException */ - StackMapTableEntry(DataInputStream file, ConstantPool constant_pool) throws IOException { - this(file.read(), -1, -1, null, -1, null, constant_pool); + StackMapTableEntry(DataInput file, ConstantPool constant_pool) throws IOException { + this(file.readByte() & 0xFF, -1, -1, null, -1, null, constant_pool); if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { byte_code_offset_delta = frame_type - Constants.SAME_FRAME; diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index 085cf86c..fdaf7672 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -27,7 +27,7 @@ import org.apache.bcel.Constants; /** * This class represents a reference to an unknown (i.e., * application-specific) attribute of a class. It is instantiated from the - * {@link Attribute#readAttribute(java.io.DataInputStream, ConstantPool)} method. + * {@link Attribute#readAttribute(java.io.DataInput, ConstantPool)} method. * Applications that need to read in application-specific attributes should create an * {@link AttributeReader} implementation and attach it via * {@link Attribute#addAttributeReader(String, AttributeReader)}. diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index 8f1dfdac..e927bb55 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.generic; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -103,7 +103,7 @@ public class AnnotationEntryGen isRuntimeVisible = vis; } - public static AnnotationEntryGen read(DataInputStream dis, + public static AnnotationEntryGen read(DataInput dis, ConstantPoolGen cpool, boolean b) throws IOException { AnnotationEntryGen a = new AnnotationEntryGen(cpool); diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java index 1ceb30f3..5e8cf006 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.generic; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; @@ -84,7 +84,7 @@ public abstract class ElementValueGen public static final int PRIMITIVE_BOOLEAN = 'Z'; - public static ElementValueGen readElementValue(DataInputStream dis, + public static ElementValueGen readElementValue(DataInput dis, ConstantPoolGen cpGen) throws IOException { int type = dis.readUnsignedByte(); -- GitLab From d2883e2ade18d07cb76b0bf99d1b9a0aa66afdb2 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 4 Feb 2015 21:53:42 +0000 Subject: [PATCH 0722/1313] Removed the 'index' variable from the LocalVariableGen's hash code, thanks to Mark Roberts (BCEL-194) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1657412 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 1 + src/changes/changes.xml | 3 +++ .../java/org/apache/bcel/generic/LocalVariableGen.java | 8 +++----- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 3fc026a0..254430e4 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -96,6 +96,7 @@ Bug fixes from 5.2 [BCEL-174] Verification of interfaces with default methods fails with Java 8 [BCEL-177] MethodParameters should read 1 byte not two for parameter count [BCEL-181] ClassLoaderRepository.loadClass(String) leaks input streams +[BCEL-194] LocalVariableGen hashCode() function is incorrrect Feedback diff --git a/src/changes/changes.xml b/src/changes/changes.xml index c125c4be..93f682f8 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,9 @@ The type attribute can be add,update,fix,remove. + + Removed the 'index' variable from the LocalVariableGen's hash code. + Performance degradation with the UTF8 cache getInstance no longer uses cache diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java index ec3085c9..67194b21 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java @@ -172,13 +172,11 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo } - /** @return a hash code value for the object. - */ @Override public int hashCode() { - //If the user changes the name or type, problems with the targeter hashmap will occur - int hc = index ^ name.hashCode() ^ type.hashCode(); - return hc; + // If the user changes the name or type, problems with the targeter hashmap will occur. + // Note: index cannot be part of hash as it may be changed by the user. + return name.hashCode() ^ type.hashCode(); } -- GitLab From 964c0c8fd6abdb4c32c050db3f129edef7232cbe Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Feb 2015 14:46:49 +0000 Subject: [PATCH 0723/1313] Moved the copy() method of Runtime*ParameterAnnotations in the parent class (BCEL-203) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1657593 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/ParameterAnnotations.java | 9 ++++++++ .../RuntimeInvisibleParameterAnnotations.java | 22 +++++-------------- .../RuntimeVisibleParameterAnnotations.java | 15 ++----------- 3 files changed, 16 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index 2e6e2b79..63332574 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -127,4 +127,13 @@ public abstract class ParameterAnnotations extends Attribute { } } + + /** + * @return deep copy of this attribute + */ + @Override + public Attribute copy( ConstantPool constant_pool ) { + ParameterAnnotations c = (ParameterAnnotations) clone(); + return c; + } } diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index f7bfef18..2f77efa8 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -22,7 +22,7 @@ import java.io.IOException; import org.apache.bcel.Constants; /** - * represents a parameter annotation that is represented in the class file + * Represents a parameter annotation that is represented in the class file * but is not provided to the JVM. * * @version $Id: RuntimeInvisibleParameterAnnotations @@ -32,27 +32,15 @@ import org.apache.bcel.Constants; public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { private static final long serialVersionUID = 270153155050617200L; - - + /** * @param name_index Index pointing to the name Code * @param length Content length in bytes * @param input Input stream * @param constant_pool Array of constants */ - RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInput input, - ConstantPool constant_pool) throws IOException { - super(Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, input, - constant_pool); - } - - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy( ConstantPool constant_pool ) { - Annotations c = (Annotations) clone(); - return c; + RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) + throws IOException { + super(Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, input, constant_pool); } } diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index 8d38ed64..eaf5e6cb 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -22,7 +22,7 @@ import java.io.IOException; import org.apache.bcel.Constants; /** - * represents a parameter annotation that is represented in the class file + * Represents a parameter annotation that is represented in the class file * and is provided to the JVM. * * @version $Id: RuntimeVisibleParameterAnnotations @@ -32,8 +32,7 @@ import org.apache.bcel.Constants; public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { private static final long serialVersionUID = -4266572854750267070L; - - + /** * @param name_index Index pointing to the name Code * @param length Content length in bytes @@ -44,14 +43,4 @@ public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { throws IOException { super(Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, name_index, length, input, constant_pool); } - - - /** - * @return deep copy of this attribute - */ - @Override - public Attribute copy( ConstantPool constant_pool ) { - Annotations c = (Annotations) clone(); - return c; - } } -- GitLab From ec825656b3b3a6c42e49c201bb785bd1af69507b Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Feb 2015 14:51:32 +0000 Subject: [PATCH 0724/1313] Fixed a typo in ConstantLong (BCEL-204) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1657594 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ConstantLong.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/ConstantLong.java b/src/main/java/org/apache/bcel/classfile/ConstantLong.java index eab76178..1fd33634 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantLong.java @@ -101,7 +101,7 @@ public final class ConstantLong extends Constant implements ConstantObject { /** - * @param bytes thr raw bytes that represent this long + * @param bytes the raw bytes that represent this long */ public final void setBytes( long bytes ) { this.bytes = bytes; -- GitLab From bb05408fc8ae05b5219170c86d70fee10dc410c9 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 5 Feb 2015 15:32:40 +0000 Subject: [PATCH 0725/1313] Indentation and line wrapping git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1657606 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Attribute.java | 163 ++++++++---------- 1 file changed, 71 insertions(+), 92 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 3cf2702c..fa7f765c 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -24,7 +24,6 @@ import java.io.Serializable; import java.util.HashMap; import java.util.Map; import org.apache.bcel.Constants; -import org.apache.bcel.classfile.ConstantUtf8; /** * Abstract super class for Attribute objects. Currently the @@ -60,8 +59,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable protected ConstantPool constant_pool; // TODO make private (has getter & setter) - protected Attribute(byte tag, int name_index, int length, - ConstantPool constant_pool) + protected Attribute(byte tag, int name_index, int length, ConstantPool constant_pool) { this.tag = tag; this.name_index = name_index; @@ -99,10 +97,8 @@ public abstract class Attribute implements Cloneable, Node, Serializable * named "name". You should not add readers for the standard attributes such * as "LineNumberTable", because those are handled internally. * - * @param name - * the name of the attribute as stored in the class file - * @param r - * the reader object + * @param name the name of the attribute as stored in the class file + * @param r the reader object */ public static void addAttributeReader(String name, AttributeReader r) { @@ -112,8 +108,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable /** * Remove attribute reader * - * @param name - * the name of the attribute as stored in the class file + * @param name the name of the attribute as stored in the class file */ public static void removeAttributeReader(String name) { @@ -134,24 +129,19 @@ public abstract class Attribute implements Cloneable, Node, Serializable * @throws IOException * @throws ClassFormatException */ - public static Attribute readAttribute(DataInputStream file, - ConstantPool constant_pool) throws IOException, - ClassFormatException + public static Attribute readAttribute(DataInputStream file, ConstantPool constant_pool) + throws IOException, ClassFormatException { - ConstantUtf8 c; - String name; - int name_index; - int length; byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute // Get class name from constant pool via `name_index' indirection - name_index = file.readUnsignedShort(); - c = (ConstantUtf8) constant_pool.getConstant(name_index, - Constants.CONSTANT_Utf8); - name = c.getBytes(); + int name_index = file.readUnsignedShort(); + ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8); + String name = c.getBytes(); + // Length of data in bytes - length = file.readInt(); + int length = file.readInt(); + // Compare strings to find known attribute - // System.out.println(name); for (byte i = 0; i < Constants.KNOWN_ATTRIBUTES; i++) { if (name.equals(Constants.ATTRIBUTE_NAMES[i])) @@ -160,70 +150,64 @@ public abstract class Attribute implements Cloneable, Node, Serializable break; } } + // Call proper constructor, depending on `tag' switch (tag) { - case Constants.ATTR_UNKNOWN: - AttributeReader r = readers.get(name); - if (r != null) - { - return r.createAttribute(name_index, length, file, - constant_pool); - } - return new Unknown(name_index, length, file, constant_pool); - case Constants.ATTR_CONSTANT_VALUE: - return new ConstantValue(name_index, length, file, constant_pool); - case Constants.ATTR_SOURCE_FILE: - return new SourceFile(name_index, length, file, constant_pool); - case Constants.ATTR_CODE: - return new Code(name_index, length, file, constant_pool); - case Constants.ATTR_EXCEPTIONS: - return new ExceptionTable(name_index, length, file, constant_pool); - case Constants.ATTR_LINE_NUMBER_TABLE: - return new LineNumberTable(name_index, length, file, constant_pool); - case Constants.ATTR_LOCAL_VARIABLE_TABLE: - return new LocalVariableTable(name_index, length, file, - constant_pool); - case Constants.ATTR_INNER_CLASSES: - return new InnerClasses(name_index, length, file, constant_pool); - case Constants.ATTR_SYNTHETIC: - return new Synthetic(name_index, length, file, constant_pool); - case Constants.ATTR_DEPRECATED: - return new Deprecated(name_index, length, file, constant_pool); - case Constants.ATTR_PMG: - return new PMGClass(name_index, length, file, constant_pool); - case Constants.ATTR_SIGNATURE: - return new Signature(name_index, length, file, constant_pool); - case Constants.ATTR_STACK_MAP: - return new StackMap(name_index, length, file, constant_pool); - case Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS: - return new RuntimeVisibleAnnotations(name_index, length, file, - constant_pool); - case Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS: - return new RuntimeInvisibleAnnotations(name_index, length, file, - constant_pool); - case Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS: - return new RuntimeVisibleParameterAnnotations(name_index, length, - file, constant_pool); - case Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS: - return new RuntimeInvisibleParameterAnnotations(name_index, length, - file, constant_pool); - case Constants.ATTR_ANNOTATION_DEFAULT: - return new AnnotationDefault(name_index, length, file, - constant_pool); - case Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE: - return new LocalVariableTypeTable(name_index, length, file, - constant_pool); - case Constants.ATTR_ENCLOSING_METHOD: - return new EnclosingMethod(name_index, length, file, constant_pool); - case Constants.ATTR_STACK_MAP_TABLE: - return new StackMapTable(name_index, length, file, constant_pool); - case Constants.ATTR_BOOTSTRAP_METHODS: - return new BootstrapMethods(name_index, length, file, constant_pool); - case Constants.ATTR_METHOD_PARAMETERS: + case Constants.ATTR_UNKNOWN: + AttributeReader r = readers.get(name); + if (r != null) + { + return r.createAttribute(name_index, length, file, constant_pool); + } + return new Unknown(name_index, length, file, constant_pool); + case Constants.ATTR_CONSTANT_VALUE: + return new ConstantValue(name_index, length, file, constant_pool); + case Constants.ATTR_SOURCE_FILE: + return new SourceFile(name_index, length, file, constant_pool); + case Constants.ATTR_CODE: + return new Code(name_index, length, file, constant_pool); + case Constants.ATTR_EXCEPTIONS: + return new ExceptionTable(name_index, length, file, constant_pool); + case Constants.ATTR_LINE_NUMBER_TABLE: + return new LineNumberTable(name_index, length, file, constant_pool); + case Constants.ATTR_LOCAL_VARIABLE_TABLE: + return new LocalVariableTable(name_index, length, file, constant_pool); + case Constants.ATTR_INNER_CLASSES: + return new InnerClasses(name_index, length, file, constant_pool); + case Constants.ATTR_SYNTHETIC: + return new Synthetic(name_index, length, file, constant_pool); + case Constants.ATTR_DEPRECATED: + return new Deprecated(name_index, length, file, constant_pool); + case Constants.ATTR_PMG: + return new PMGClass(name_index, length, file, constant_pool); + case Constants.ATTR_SIGNATURE: + return new Signature(name_index, length, file, constant_pool); + case Constants.ATTR_STACK_MAP: + return new StackMap(name_index, length, file, constant_pool); + case Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS: + return new RuntimeVisibleAnnotations(name_index, length, file, constant_pool); + case Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS: + return new RuntimeInvisibleAnnotations(name_index, length, file, constant_pool); + case Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS: + return new RuntimeVisibleParameterAnnotations(name_index, length, file, constant_pool); + case Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS: + return new RuntimeInvisibleParameterAnnotations(name_index, length, file, constant_pool); + case Constants.ATTR_ANNOTATION_DEFAULT: + return new AnnotationDefault(name_index, length, file, constant_pool); + case Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE: + return new LocalVariableTypeTable(name_index, length, file, constant_pool); + case Constants.ATTR_ENCLOSING_METHOD: + return new EnclosingMethod(name_index, length, file, constant_pool); + case Constants.ATTR_STACK_MAP_TABLE: + return new StackMapTable(name_index, length, file, constant_pool); + case Constants.ATTR_BOOTSTRAP_METHODS: + return new BootstrapMethods(name_index, length, file, constant_pool); + case Constants.ATTR_METHOD_PARAMETERS: return new MethodParameters(name_index, length, file, constant_pool); - default: // Never reached - throw new IllegalStateException("Unrecognized attribute type tag parsed: " + tag); + default: + // Never reached + throw new IllegalStateException("Unrecognized attribute type tag parsed: " + tag); } } @@ -232,8 +216,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable */ public String getName() { - ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, - Constants.CONSTANT_Utf8); + ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8); return c.getBytes(); } @@ -246,8 +229,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable } /** - * @param length - * length in bytes. + * @param length length in bytes. */ public final void setLength(int length) { @@ -255,8 +237,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable } /** - * @param name_index - * of attribute. + * @param name_index of attribute. */ public final void setNameIndex(int name_index) { @@ -272,8 +253,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable } /** - * @return Tag of attribute, i.e., its type. Value may not be altered, thus - * there is no setTag() method. + * @return Tag of attribute, i.e., its type. Value may not be altered, thus there is no setTag() method. */ public final byte getTag() { @@ -290,8 +270,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable } /** - * @param constant_pool - * Constant pool to be used for this object. + * @param constant_pool Constant pool to be used for this object. * @see ConstantPool */ public final void setConstantPool(ConstantPool constant_pool) -- GitLab From fc5fd06047bf751ec1a2ccd37c3efbd7f353cd1c Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 19 Feb 2015 09:55:24 +0000 Subject: [PATCH 0726/1313] Add support for TypeVariables to Utility.signatureToString(). Thanks to Mark Roberts (BCEL-197) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1660822 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 1 + src/changes/changes.xml | 4 ++ .../org/apache/bcel/classfile/Utility.java | 61 ++++++++++++++++++- .../bcel/classfile/UtilityTestCase.java | 29 +++++++++ 4 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/apache/bcel/classfile/UtilityTestCase.java diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 254430e4..4180c370 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -97,6 +97,7 @@ Bug fixes from 5.2 [BCEL-177] MethodParameters should read 1 byte not two for parameter count [BCEL-181] ClassLoaderRepository.loadClass(String) leaks input streams [BCEL-194] LocalVariableGen hashCode() function is incorrrect +[BCEL-197] Add support for TypeVariables to Utility.signatureToString() Feedback diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 93f682f8..efc96ce4 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,10 @@ The type attribute can be add,update,fix,remove. + + Utility.signatureToString() no longer throws a ClassFormatException on TypeVariables + found in generic signatures. + Removed the 'index' variable from the LocalVariableGen's hash code. diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 178d0505..e7499107 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -823,15 +823,72 @@ public abstract class Utility { return "int"; case 'J': return "long"; - case 'L': { // Full class name + case 'T': { // TypeVariableSignature int index = signature.indexOf(';'); // Look for closing `;' if (index < 0) { throw new ClassFormatException("Invalid signature: " + signature); } //corrected concurrent private static field acess - wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed + wrap(consumed_chars, index + 1); // "Tblabla;" `T' and `;' are removed return compactClassName(signature.substring(1, index), chopit); } + case 'L': { // Full class name + int index = signature.indexOf(';'); // Look for closing `;' + if (index < 0) { + throw new ClassFormatException("Invalid signature: " + signature); + } + // check to see if there are any TypeArguments + int bracketIndex = signature.substring(0, index).indexOf('<'); + if (bracketIndex < 0) { + // just a class identifier + wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed + return compactClassName(signature.substring(1, index), chopit); + } + + // we have TypeArguments; build up partial result + // as we recurse for each TypeArgument + String type = compactClassName(signature.substring(1, bracketIndex), chopit) + "<"; + int consumed_chars = bracketIndex + 1; // Shadows global var + + // check for wildcards + if (signature.charAt(consumed_chars) == '+') { + type = type + "? extends "; + consumed_chars = ++consumed_chars; + } else if (signature.charAt(consumed_chars) == '-') { + type = type + "? super "; + consumed_chars = ++consumed_chars; + } else if (signature.charAt(consumed_chars) == '*') { + // must be at end of signature + if (signature.charAt(consumed_chars + 1) != '>') { + throw new ClassFormatException("Invalid signature: " + signature); + } + if (signature.charAt(consumed_chars + 2) != ';') { + throw new ClassFormatException("Invalid signature: " + signature); + } + wrap(Utility.consumed_chars, consumed_chars + 3); // remove final "*>;" + return type + "?>..."; + } + + // get the first TypeArgument + type = type + signatureToString(signature.substring(consumed_chars), chopit); + // update our consumed count by the number of characters the for type argument + consumed_chars = unwrap(Utility.consumed_chars) + consumed_chars; + wrap(Utility.consumed_chars, consumed_chars); + + // are there more TypeArguments? + while (signature.charAt(consumed_chars) != '>') { + type = type + ", " + signatureToString(signature.substring(consumed_chars), chopit); + // update our consumed count by the number of characters the for type argument + consumed_chars = unwrap(Utility.consumed_chars) + consumed_chars; + wrap(Utility.consumed_chars, consumed_chars); + } + + if (signature.charAt(consumed_chars + 1) != ';') { + throw new ClassFormatException("Invalid signature: " + signature); + } + wrap(Utility.consumed_chars, consumed_chars + 2); // remove final ">;" + return type + ">"; + } case 'S': return "short"; case 'Z': diff --git a/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java b/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java new file mode 100644 index 00000000..15cbbe26 --- /dev/null +++ b/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.bcel.classfile; + +import junit.framework.TestCase; + +public class UtilityTestCase extends TestCase { + + public void testSignatureToStringWithGenerics() throws Exception { + assertEquals("generic signature", "java.util.Map>", Utility.signatureToString("Ljava/util/Map;>;")); + assertEquals("generic signature", "java.util.Set", Utility.signatureToString("Ljava/util/Set<+Ljava/nio/file/OpenOption;>;")); + assertEquals("generic signature", "java.nio.file.attribute.FileAttribute...[]", Utility.signatureToString("[Ljava/nio/file/attribute/FileAttribute<*>;")); + } +} -- GitLab From 2446fb88daee5e8e9973b22fd5a6981b2d041541 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 19 Feb 2015 17:25:03 +0000 Subject: [PATCH 0727/1313] Updated the links to the JVM specification git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1660948 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 528 +++++++++--------- .../apache/bcel/classfile/ClassParser.java | 2 +- .../org/apache/bcel/classfile/JavaClass.java | 2 +- src/main/java/org/apache/bcel/package.html | 2 +- src/site/xdoc/manual.xml | 8 +- 5 files changed, 271 insertions(+), 271 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index e609f55c..dd8ca74d 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -124,9 +124,9 @@ public interface Constants { public final static int MAX_BYTE = 255; // 2^8 - 1 /** One of the access flags for fields, methods, or classes. - * @see "Flag definitions for Fields in the Java Virtual Machine Specification (2nd edition)." - * @see "Flag definitions for Methods in the Java Virtual Machine Specification (2nd edition)." - * @see "Flag definitions for Classes in the Java Virtual Machine Specification (2nd edition)." + * @see "Flag definitions for Fields in the Java Virtual Machine Specification (Java SE 8 Edition)." + * @see "Flag definitions for Methods in the Java Virtual Machine Specification (Java SE 8 Edition)." + * @see "Flag definitions for Classes in the Java Virtual Machine Specification (Java SE 8 Edition)." */ public final static short ACC_PUBLIC = 0x0001; @@ -300,745 +300,745 @@ public interface Constants { /** * One of the limitations of the Java Virtual Machine. - * @see The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. + * @see The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. */ public static final int MAX_CP_ENTRIES = 65535; /** * One of the limitations of the Java Virtual Machine. - * @see The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. + * @see The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. */ public static final int MAX_CODE_SIZE = 65536; //bytes /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short NOP = 0; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ACONST_NULL = 1; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_M1 = 2; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_0 = 3; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_1 = 4; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_2 = 5; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_3 = 6; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_4 = 7; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_5 = 8; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LCONST_0 = 9; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LCONST_1 = 10; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_0 = 11; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_1 = 12; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_2 = 13; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCONST_0 = 14; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCONST_1 = 15; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short BIPUSH = 16; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short SIPUSH = 17; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC = 18; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC_W = 19; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC2_W = 20; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD = 21; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD = 22; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD = 23; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD = 24; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD = 25; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_0 = 26; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_1 = 27; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_2 = 28; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_3 = 29; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_0 = 30; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_1 = 31; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_2 = 32; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_3 = 33; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_0 = 34; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_1 = 35; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_2 = 36; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_3 = 37; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_0 = 38; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_1 = 39; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_2 = 40; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_3 = 41; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_0 = 42; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_1 = 43; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_2 = 44; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_3 = 45; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IALOAD = 46; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LALOAD = 47; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FALOAD = 48; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DALOAD = 49; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short AALOAD = 50; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short BALOAD = 51; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short CALOAD = 52; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short SALOAD = 53; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE = 54; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE = 55; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE = 56; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE = 57; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE = 58; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_0 = 59; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_1 = 60; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_2 = 61; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_3 = 62; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_0 = 63; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_1 = 64; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_2 = 65; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_3 = 66; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_0 = 67; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_1 = 68; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_2 = 69; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_3 = 70; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_0 = 71; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_1 = 72; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_2 = 73; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_3 = 74; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_0 = 75; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_1 = 76; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_2 = 77; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_3 = 78; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IASTORE = 79; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LASTORE = 80; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FASTORE = 81; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DASTORE = 82; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short AASTORE = 83; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short BASTORE = 84; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short CASTORE = 85; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short SASTORE = 86; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short POP = 87; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short POP2 = 88; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP = 89; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP_X1 = 90; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP_X2 = 91; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2 = 92; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2_X1 = 93; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2_X2 = 94; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short SWAP = 95; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IADD = 96; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LADD = 97; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FADD = 98; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DADD = 99; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISUB = 100; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSUB = 101; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSUB = 102; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSUB = 103; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IMUL = 104; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LMUL = 105; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FMUL = 106; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DMUL = 107; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IDIV = 108; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LDIV = 109; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FDIV = 110; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DDIV = 111; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IREM = 112; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LREM = 113; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FREM = 114; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DREM = 115; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INEG = 116; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LNEG = 117; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FNEG = 118; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DNEG = 119; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISHL = 120; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSHL = 121; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISHR = 122; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSHR = 123; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IUSHR = 124; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LUSHR = 125; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IAND = 126; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LAND = 127; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IOR = 128; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LOR = 129; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IXOR = 130; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LXOR = 131; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IINC = 132; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2L = 133; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2F = 134; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2D = 135; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short L2I = 136; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short L2F = 137; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short L2D = 138; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short F2I = 139; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short F2L = 140; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short F2D = 141; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short D2I = 142; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short D2L = 143; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short D2F = 144; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2B = 145; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INT2BYTE = 145; // Old notion /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2C = 146; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INT2CHAR = 146; // Old notion /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2S = 147; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INT2SHORT = 147; // Old notion /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LCMP = 148; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCMPL = 149; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCMPG = 150; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCMPL = 151; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCMPG = 152; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFEQ = 153; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNE = 154; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFLT = 155; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFGE = 156; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFGT = 157; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFLE = 158; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPEQ = 159; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPNE = 160; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPLT = 161; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPGE = 162; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPGT = 163; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPLE = 164; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ACMPEQ = 165; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ACMPNE = 166; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short GOTO = 167; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short JSR = 168; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short RET = 169; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short TABLESWITCH = 170; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LOOKUPSWITCH = 171; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IRETURN = 172; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LRETURN = 173; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FRETURN = 174; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DRETURN = 175; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ARETURN = 176; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short RETURN = 177; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short GETSTATIC = 178; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short PUTSTATIC = 179; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short GETFIELD = 180; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short PUTFIELD = 181; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEVIRTUAL = 182; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKESPECIAL = 183; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKENONVIRTUAL = 183; // Old name in JDK 1.0 /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKESTATIC = 184; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEINTERFACE = 185; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEDYNAMIC = 186; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short NEW = 187; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short NEWARRAY = 188; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ANEWARRAY = 189; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ARRAYLENGTH = 190; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ATHROW = 191; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short CHECKCAST = 192; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INSTANCEOF = 193; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short MONITORENTER = 194; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short MONITOREXIT = 195; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short WIDE = 196; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short MULTIANEWARRAY = 197; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNULL = 198; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNONNULL = 199; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short GOTO_W = 200; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short JSR_W = 201; /** JVM internal opcode. - * @see Reserved opcodes in the Java Virtual Machine Specification */ + * @see Reserved opcodes in the Java Virtual Machine Specification */ public static final short BREAKPOINT = 202; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short LDC_QUICK = 203; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short LDC_W_QUICK = 204; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short LDC2_W_QUICK = 205; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETFIELD_QUICK = 206; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTFIELD_QUICK = 207; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETFIELD2_QUICK = 208; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTFIELD2_QUICK = 209; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETSTATIC_QUICK = 210; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTSTATIC_QUICK = 211; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETSTATIC2_QUICK = 212; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTSTATIC2_QUICK = 213; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEVIRTUAL_QUICK = 214; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKENONVIRTUAL_QUICK = 215; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKESUPER_QUICK = 216; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKESTATIC_QUICK = 217; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEINTERFACE_QUICK = 218; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEVIRTUALOBJECT_QUICK = 219; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short NEW_QUICK = 221; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short ANEWARRAY_QUICK = 222; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short MULTIANEWARRAY_QUICK = 223; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short CHECKCAST_QUICK = 224; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INSTANCEOF_QUICK = 225; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEVIRTUAL_QUICK_W = 226; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETFIELD_QUICK_W = 227; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTFIELD_QUICK_W = 228; /** JVM internal opcode. - * @see Reserved opcodes in the Java Virtual Machine Specification */ + * @see Reserved opcodes in the Java Virtual Machine Specification */ public static final short IMPDEP1 = 254; /** JVM internal opcode. - * @see Reserved opcodes in the Java Virtual Machine Specification */ + * @see Reserved opcodes in the Java Virtual Machine Specification */ public static final short IMPDEP2 = 255; /** diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index aad92417..a7385c7f 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -35,7 +35,7 @@ import org.apache.bcel.Constants; * the caller. * * The structure and the names comply, except for a few conveniences, - * exactly with the + * exactly with the * JVM specification 1.0. See this paper for * further details about the structure of a bytecode file. * diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 4c0844ef..30e3b082 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -37,7 +37,7 @@ import org.apache.bcel.util.SyntheticRepository; /** * Represents a Java class, i.e., the data structures, constant pool, * fields, methods and commands contained in a Java .class file. - * See JVM specification for details. + * See JVM specification for details. * The intent of this class is to represent a parsed or otherwise existing * class file. Those interested in programatically generating classes * should see the ClassGen class. diff --git a/src/main/java/org/apache/bcel/package.html b/src/main/java/org/apache/bcel/package.html index f658adc1..f095c862 100644 --- a/src/main/java/org/apache/bcel/package.html +++ b/src/main/java/org/apache/bcel/package.html @@ -26,7 +26,7 @@ $Id$ This package contains basic classes for the Byte Code Engineering Library and constants defined by the - + JVM specification.

    diff --git a/src/site/xdoc/manual.xml b/src/site/xdoc/manual.xml index a1f1045b..21373574 100644 --- a/src/site/xdoc/manual.xml +++ b/src/site/xdoc/manual.xml @@ -122,7 +122,7 @@ represented by a single class file containing class related data and byte code instructions. These files are loaded dynamically into an interpreter (Java + href="http://docs.oracle.com/javase/specs/">Java Virtual Machine, aka. JVM) and executed.

    @@ -165,7 +165,7 @@ covering the details that are necessary for understanding the rest of this paper. The format of class files and the byte code instruction set are described in more detail in the Java + href="http://docs.oracle.com/javase/specs/">Java Virtual Machine Specification. Especially, we will not deal with the security constraints that the Java Virtual Machine has to check at run-time, i.e. the byte code verifier. @@ -365,7 +365,7 @@

    We will not list all byte code instructions here, since these are explained in detail in the JVM + href="http://docs.oracle.com/javase/specs/">JVM specification. The opcode names are mostly self-explaining, so understanding the following code examples should be fairly intuitive. @@ -624,7 +624,7 @@ org.apache.bcel.classfile and closely represents class files. All of the binary components and data structures declared in the JVM + href="http://docs.oracle.com/javase/specs/">JVM specification and described in section 2 are mapped to classes. -- GitLab From fcab7bbda44776603c4b244da724d4346dbf03cf Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Thu, 19 Feb 2015 22:49:34 +0000 Subject: [PATCH 0728/1313] Reformatted the code samples in the manual git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1661026 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/manual.xml | 294 ++++++++++++++++++++------------------- 1 file changed, 149 insertions(+), 145 deletions(-) diff --git a/src/site/xdoc/manual.xml b/src/site/xdoc/manual.xml index 21373574..716d69f8 100644 --- a/src/site/xdoc/manual.xml +++ b/src/site/xdoc/manual.xml @@ -458,27 +458,29 @@ import java.io.*; public class Factorial { - private static BufferedReader in = new BufferedReader(new - InputStreamReader(System.in)); + private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - public static int fac(int n) { - return (n == 0)? 1 : n * fac(n - 1); - } + public static int fac(int n) { + return (n == 0) ? 1 : n * fac(n - 1); + } - public static int readInt() { - int n = 4711; - try { - System.out.print("Please enter a number> "); - n = Integer.parseInt(in.readLine()); - } catch(IOException e1) { System.err.println(e1); } - catch(NumberFormatException e2) { System.err.println(e2); } - return n; - } + public static int readInt() { + int n = 4711; + try { + System.out.print("Please enter a number> "); + n = Integer.parseInt(in.readLine()); + } catch (IOException e1) { + System.err.println(e1); + } catch (NumberFormatException e2) { + System.err.println(e2); + } + return n; + } - public static void main(String[] argv) { - int n = readInt(); - System.out.println("Factorial of " + n + " is " + fac(n)); - } + public static void main(String[] argv) { + int n = readInt(); + System.out.println("Factorial of " + n + " is " + fac(n)); + } } @@ -701,8 +703,8 @@

    - if(Repository.instanceOf(clazz, super_class) { - ... + if (Repository.instanceOf(clazz, super_class)) { + ... } @@ -722,13 +724,13 @@ printCode(clazz.getMethods()); ... public static void printCode(Method[] methods) { - for(int i=0; i < methods.length; i++) { - System.out.println(methods[i]); + for (int i = 0; i < methods.length; i++) { + System.out.println(methods[i]); - Code code = methods[i].getCode(); - if(code != null) // Non-abstract method - System.out.println(code); - } + Code code = methods[i].getCode(); + if (code != null) // Non-abstract method + System.out.println(code); + } } @@ -784,8 +786,8 @@

    - Type return_type = Type.VOID; - Type[] arg_types = new Type[] { new ArrayType(Type.STRING, 1) }; + Type return_type = Type.VOID; + Type[] arg_types = new Type[] { new ArrayType(Type.STRING, 1) };

    @@ -934,8 +936,7 @@

    - InstructionHandle start = il.insert(insertion_point, - InstructionConstants.NOP); + InstructionHandle start = il.insert(insertion_point, InstructionConstants.NOP); ... mg.addExceptionHandler(start, end, handler, "java.io.IOException"); @@ -955,14 +956,15 @@ try { - il.delete(first, last); - } catch(TargetLostException e) { - InstructionHandle[] targets = e.getTargets(); - for(int i=0; i < targets.length; i++) { - InstructionTargeter[] targeters = targets[i].getTargeters(); - for(int j=0; j < targeters.length; j++) - targeters[j].updateTarget(targets[i], new_target); - } + il.delete(first, last); + } catch (TargetLostException e) { + InstructionHandle[] targets = e.getTargets(); + for (int i = 0; i < targets.length; i++) { + InstructionTargeter[] targeters = targets[i].getTargeters(); + for (int j = 0; j < targeters.length; j++) { + targeters[j].updateTarget(targets[i], new_target); + } + } } @@ -1128,25 +1130,27 @@ CodeConstraint constraint = new CodeConstraint() { - public boolean checkCode(InstructionHandle[] match) { - IfInstruction if1 = (IfInstruction)match[0].getInstruction(); - GOTO g = (GOTO)match[2].getInstruction(); - return (if1.getTarget() == match[3]) && - (g.getTarget() == match[4]); - } + public boolean checkCode(InstructionHandle[] match) { + IfInstruction if1 = (IfInstruction) match[0].getInstruction(); + GOTO g = (GOTO) match[2].getInstruction(); + return (if1.getTarget() == match[3]) && + (g.getTarget() == match[4]); + } }; - InstructionFinder f = new InstructionFinder(il); - String pat = "IfInstruction ICONST_0 GOTO ICONST_1 NOP(IFEQ|IFNE)"; - - for(Iterator e = f.search(pat, constraint); e.hasNext(); ) { - InstructionHandle[] match = (InstructionHandle[])e.next();; - ... - match[0].setTarget(match[5].getTarget()); // Update target - ... - try { - il.delete(match[1], match[5]); - } catch(TargetLostException ex) { ... } + InstructionFinder f = new InstructionFinder(il); + String pat = "IfInstruction ICONST_0 GOTO ICONST_1 NOP(IFEQ|IFNE)"; + + for (Iterator e = f.search(pat, constraint); e.hasNext(); ) { + InstructionHandle[] match = (InstructionHandle[]) e.next();; + ... + match[0].setTarget(match[5].getTarget()); // Update target + ... + try { + il.delete(match[1], match[5]); + } catch (TargetLostException ex) { + ... + } } @@ -1166,8 +1170,8 @@

    - if((a == null) || (i < 2)) - System.out.println("Ooops"); + if ((a == null) || (i < 2)) + System.out.println("Ooops");

    @@ -1359,17 +1363,19 @@ import java.io.*; public class HelloWorld { - public static void main(String[] argv) { - BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - String name = null; - - try { - System.out.print("Please enter your name> "); - name = in.readLine(); - } catch(IOException e) { return; } - - System.out.println("Hello, " + name); - } + public static void main(String[] argv) { + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + String name = null; + + try { + System.out.print("Please enter your name> "); + name = in.readLine(); + } catch (IOException e) { + return; + } + + System.out.println("Hello, " + name); + } } @@ -1394,8 +1400,7 @@ ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", - "<generated>", ACC_PUBLIC | ACC_SUPER, - null); + "<generated>", ACC_PUBLIC | ACC_SUPER, null); ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool InstructionList il = new InstructionList(); @@ -1437,8 +1442,7 @@ symbolic type signature encoded with Type objects. il.append(InstructionConstants.DUP); // Use predefined constant il.append(factory.createNew("java.io.InputStreamReader")); il.append(InstructionConstants.DUP); - il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, - Constants.GETSTATIC)); + il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, Constants.GETSTATIC)); il.append(factory.createInvoke("java.io.InputStreamReader", "<init>", Type.VOID, new Type[] { i_stream }, Constants.INVOKESPECIAL)); @@ -1470,8 +1474,7 @@ symbolic type signature encoded with Type objects. InstructionHandle try_start = - il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, - Constants.GETSTATIC)); + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, Constants.GETSTATIC)); il.append(new PUSH(cp, "Please enter your name> ")); il.append(factory.createInvoke("java.io.PrintStream", "print", Type.VOID, @@ -1509,8 +1512,7 @@ symbolic type signature encoded with Type objects. InstructionHandle ih = - il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, - Constants.GETSTATIC)); + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, Constants.GETSTATIC)); g.setTarget(ih); @@ -1559,8 +1561,10 @@ symbolic type signature encoded with Type objects. try { - cg.getJavaClass().dump("HelloWorld.class"); - } catch(java.io.IOException e) { System.err.println(e); } + cg.getJavaClass().dump("HelloWorld.class"); + } catch (IOException e) { + System.err.println(e); + } @@ -1581,78 +1585,78 @@ import org.apache.bcel.Repository; import org.apache.bcel.util.InstructionFinder; public class Peephole { - public static void main(String[] argv) { - try { - /* Load the class from CLASSPATH. - */ - JavaClass clazz = Repository.lookupClass(argv[0]); - Method[] methods = clazz.getMethods(); - ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); - - for(int i=0; i < methods.length; i++) { - if(!(methods[i].isAbstract() || methods[i].isNative())) { - MethodGen mg = new MethodGen(methods[i], - clazz.getClassName(), cp); - Method stripped = removeNOPs(mg); - - if(stripped != null) // Any NOPs stripped? - methods[i] = stripped; // Overwrite with stripped method - } - } - /* Dump the class to "class name"_.class - */ - clazz.setConstantPool(cp.getFinalConstantPool()); - clazz.dump(clazz.getClassName() + "_.class"); - } catch(Exception e) { e.printStackTrace(); } - } - - private static Method removeNOPs(MethodGen mg) { - InstructionList il = mg.getInstructionList(); - InstructionFinder f = new InstructionFinder(il); - String pat = "NOP+"; // Find at least one NOP - InstructionHandle next = null; - int count = 0; - - for(Iterator iter = f.search(pat); iter.hasNext(); ) { - InstructionHandle[] match = (InstructionHandle[])iter.next(); - InstructionHandle first = match[0]; - InstructionHandle last = match[match.length - 1]; - - /* Some nasty Java compilers may add NOP at end of method. - */ - if((next = last.getNext()) == null) - break; + public static void main(String[] argv) { + try { + // Load the class from CLASSPATH. + JavaClass clazz = Repository.lookupClass(argv[0]); + Method[] methods = clazz.getMethods(); + ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); + + for (int i = 0; i < methods.length; i++) { + if (!(methods[i].isAbstract() || methods[i].isNative())) { + MethodGen mg = new MethodGen(methods[i], clazz.getClassName(), cp); + Method stripped = removeNOPs(mg); + + if (stripped != null) // Any NOPs stripped? + methods[i] = stripped; // Overwrite with stripped method + } + } + + // Dump the class to "class name"_.class + clazz.setConstantPool(cp.getFinalConstantPool()); + clazz.dump(clazz.getClassName() + "_.class"); + } catch (Exception e) { + e.printStackTrace(); + } + } - count += match.length; + private static Method removeNOPs(MethodGen mg) { + InstructionList il = mg.getInstructionList(); + InstructionFinder f = new InstructionFinder(il); + String pat = "NOP+"; // Find at least one NOP + InstructionHandle next = null; + int count = 0; + + for (Iterator iter = f.search(pat); iter.hasNext();) { + InstructionHandle[] match = (InstructionHandle[]) iter.next(); + InstructionHandle first = match[0]; + InstructionHandle last = match[match.length - 1]; + + // Some nasty Java compilers may add NOP at end of method. + if ((next = last.getNext()) == null) { + break; + } + + count += match.length; + + /** + * Delete NOPs and redirect any references to them to the following (non-nop) instruction. + */ + try { + il.delete(first, last); + } catch (TargetLostException e) { + InstructionHandle[] targets = e.getTargets(); + for (int i = 0; i < targets.length; i++) { + InstructionTargeter[] targeters = targets[i].getTargeters(); + + for (int j = 0; j < targeters.length; j++) { + targeters[j].updateTarget(targets[i], next); + } + } + } + } - /* Delete NOPs and redirect any references to them to the following - * (non-nop) instruction. - */ - try { - il.delete(first, last); - } catch(TargetLostException e) { - InstructionHandle[] targets = e.getTargets(); - for(int i=0; i < targets.length; i++) { - InstructionTargeter[] targeters = targets[i].getTargeters(); - - for(int j=0; j < targeters.length; j++) - targeters[j].updateTarget(targets[i], next); - } - } - } + Method m = null; + + if (count > 0) { + System.out.println("Removed " + count + " NOP instructions from method " + mg.getName()); + m = mg.getMethod(); + } - Method m = null; - - if(count > 0) { - System.out.println("Removed " + count + " NOP instructions from method " + - mg.getName()); - m = mg.getMethod(); + il.dispose(); // Reuse instruction handles + return m; } - - il.dispose(); // Reuse instruction handles - return m; - } } -- GitLab From 60b089eb7ab1fd226faf48074e52f33f322b7df6 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 20 Feb 2015 00:19:48 +0000 Subject: [PATCH 0729/1313] Better error handling in LineNumberGen (BCEL-210) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1661039 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/LineNumberGen.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/apache/bcel/generic/LineNumberGen.java b/src/main/java/org/apache/bcel/generic/LineNumberGen.java index 70dfb3ce..08804425 100644 --- a/src/main/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/main/java/org/apache/bcel/generic/LineNumberGen.java @@ -79,6 +79,9 @@ public class LineNumberGen implements InstructionTargeter, Cloneable, java.io.Se public void setInstruction( InstructionHandle ih ) { + if (ih == null) { + throw new NullPointerException("InstructionHandle may not be null"); + } BranchInstruction.notifyTarget(this.ih, ih, this); this.ih = ih; } -- GitLab From 9be7b6effb23517ec2e23838ba16f469727d9dda Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 20 Feb 2015 01:05:15 +0000 Subject: [PATCH 0730/1313] Allow Attributes to be read from a DataInput git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1661050 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Attribute.java | 47 ++++++++++++++++-- .../bcel/classfile/AttributeReader.java | 5 +- .../java/org/apache/bcel/classfile/Code.java | 4 +- .../java/org/apache/bcel/classfile/Field.java | 4 +- .../apache/bcel/classfile/FieldOrMethod.java | 12 +++++ .../org/apache/bcel/classfile/Method.java | 4 +- .../org/apache/bcel/classfile/Unknown.java | 6 +-- .../classfile/UnknownAttributeReader.java | 49 +++++++++++++++++++ 8 files changed, 116 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index fa7f765c..8cf157a5 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -17,6 +17,7 @@ */ package org.apache.bcel.classfile; +import java.io.DataInput; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -90,7 +91,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable file.writeInt(length); } - private static final Map readers = new HashMap(); + private static final Map readers = new HashMap(); /** * Add an Attribute reader capable of parsing (user-defined) attributes @@ -99,12 +100,26 @@ public abstract class Attribute implements Cloneable, Node, Serializable * * @param name the name of the attribute as stored in the class file * @param r the reader object + * @deprecated Use {@link #addAttributeReader(String, UnknownAttributeReader)} instead */ public static void addAttributeReader(String name, AttributeReader r) { readers.put(name, r); } + /** + * Add an Attribute reader capable of parsing (user-defined) attributes + * named "name". You should not add readers for the standard attributes such + * as "LineNumberTable", because those are handled internally. + * + * @param name the name of the attribute as stored in the class file + * @param r the reader object + */ + public static void addAttributeReader(String name, UnknownAttributeReader r) + { + readers.put(name, r); + } + /** * Remove attribute reader * @@ -131,6 +146,26 @@ public abstract class Attribute implements Cloneable, Node, Serializable */ public static Attribute readAttribute(DataInputStream file, ConstantPool constant_pool) throws IOException, ClassFormatException + { + return readAttribute((DataInput) file, constant_pool); + } + + /** + * Class method reads one attribute from the input data stream. This method + * must not be accessible from the outside. It is called by the Field and + * Method constructor methods. + * + * @see Field + * @see Method + * + * @param file Input stream + * @param constant_pool Array of constants + * @return Attribute + * @throws IOException + * @throws ClassFormatException + */ + public static Attribute readAttribute(DataInput file, ConstantPool constant_pool) + throws IOException, ClassFormatException { byte tag = Constants.ATTR_UNKNOWN; // Unknown attribute // Get class name from constant pool via `name_index' indirection @@ -155,10 +190,14 @@ public abstract class Attribute implements Cloneable, Node, Serializable switch (tag) { case Constants.ATTR_UNKNOWN: - AttributeReader r = readers.get(name); - if (r != null) + Object r = readers.get(name); + if (r instanceof UnknownAttributeReader) + { + return ((UnknownAttributeReader) r).createAttribute(name_index, length, file, constant_pool); + } + else if (r instanceof AttributeReader && file instanceof DataInputStream) { - return r.createAttribute(name_index, length, file, constant_pool); + return ((AttributeReader) r).createAttribute(name_index, length, (DataInputStream) file, constant_pool); } return new Unknown(name_index, length, file, constant_pool); case Constants.ATTR_CONSTANT_VALUE: diff --git a/src/main/java/org/apache/bcel/classfile/AttributeReader.java b/src/main/java/org/apache/bcel/classfile/AttributeReader.java index c48d3abf..0306a081 100644 --- a/src/main/java/org/apache/bcel/classfile/AttributeReader.java +++ b/src/main/java/org/apache/bcel/classfile/AttributeReader.java @@ -25,6 +25,8 @@ package org.apache.bcel.classfile; * @see Attribute * @version $Id$ * @author M. Dahm + * + * @deprecated Use UnknownAttributeReader instead */ public interface AttributeReader { @@ -54,6 +56,5 @@ public interface AttributeReader { @see Attribute#addAttributeReader( String, AttributeReader ) */ - Attribute createAttribute( int name_index, int length, java.io.DataInputStream file, - ConstantPool constant_pool ); + Attribute createAttribute( int name_index, int length, java.io.DataInputStream file, ConstantPool constant_pool ); } diff --git a/src/main/java/org/apache/bcel/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java index 075ab9ec..dac86377 100644 --- a/src/main/java/org/apache/bcel/classfile/Code.java +++ b/src/main/java/org/apache/bcel/classfile/Code.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -70,7 +70,7 @@ public final class Code extends Attribute { * @param file Input stream * @param constant_pool Array of constants */ - Code(int name_index, int length, DataInputStream file, ConstantPool constant_pool) + Code(int name_index, int length, DataInput file, ConstantPool constant_pool) throws IOException { // Initialize with some default values which will be overwritten later this(name_index, length, file.readUnsignedShort(), file.readUnsignedShort(), (byte[]) null, diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java index 2cc399f5..d3b33002 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/bcel/classfile/Field.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.IOException; import org.apache.bcel.Constants; import org.apache.bcel.generic.Type; @@ -63,7 +63,7 @@ public final class Field extends FieldOrMethod { * Construct object from file stream. * @param file Input stream */ - Field(DataInputStream file, ConstantPool constant_pool) throws IOException, + Field(DataInput file, ConstantPool constant_pool) throws IOException, ClassFormatException { super(file, constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index a94bb449..3c506b11 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -17,6 +17,7 @@ */ package org.apache.bcel.classfile; +import java.io.DataInput; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -68,9 +69,20 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * @param file Input stream * @throws IOException * @throws ClassFormatException + * @deprecated Use {@link #FieldOrMethod(java.io.DataInput, ConstantPool)} instead. */ protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) throws IOException, ClassFormatException { + this((DataInput) file, constant_pool); + } + + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + * @throws ClassFormatException + */ + protected FieldOrMethod(DataInput file, ConstantPool constant_pool) throws IOException, ClassFormatException { this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), null, constant_pool); attributes_count = file.readUnsignedShort(); diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index 6bd70f1d..95d20b19 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -17,7 +17,7 @@ */ package org.apache.bcel.classfile; -import java.io.DataInputStream; +import java.io.DataInput; import java.io.IOException; import org.apache.bcel.Constants; import org.apache.bcel.generic.Type; @@ -76,7 +76,7 @@ public final class Method extends FieldOrMethod { * @throws IOException * @throws ClassFormatException */ - Method(DataInputStream file, ConstantPool constant_pool) throws IOException, + Method(DataInput file, ConstantPool constant_pool) throws IOException, ClassFormatException { super(file, constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index fdaf7672..ebc7ffd1 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -29,13 +29,13 @@ import org.apache.bcel.Constants; * application-specific) attribute of a class. It is instantiated from the * {@link Attribute#readAttribute(java.io.DataInput, ConstantPool)} method. * Applications that need to read in application-specific attributes should create an - * {@link AttributeReader} implementation and attach it via - * {@link Attribute#addAttributeReader(String, AttributeReader)}. + * {@link UnknownAttributeReader} implementation and attach it via + * {@link Attribute#addAttributeReader(String, UnknownAttributeReader)}. * * @version $Id$ * @see org.apache.bcel.classfile.Attribute - * @see org.apache.bcel.classfile.AttributeReader + * @see org.apache.bcel.classfile.UnknownAttributeReader * @author M. Dahm */ public final class Unknown extends Attribute { diff --git a/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java b/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java new file mode 100644 index 00000000..0975e648 --- /dev/null +++ b/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.bcel.classfile; + +/** + * Unknown (non-standard) attributes may be read via user-defined factory + * objects that can be registered with the Attribute.addAttributeReader + * method. These factory objects should implement this interface. + * + * @see Attribute + * @version $Id$ + */ +public interface UnknownAttributeReader { + + /** + * When this attribute reader is added via the static method Attribute.addAttributeReader, + * an attribute name is associated with it. As the class file parser parses attributes, + * it will call various AttributeReaders based on the name of the attributes it is constructing. + * + * @param name_index An index into the constant pool, indexing a ConstantUtf8 + * that represents the name of the attribute. + * @param length The length of the data contained in the attribute. This is written + * into the constant pool and should agree with what the factory expects the length to be. + * @param input This is the data input that the factory needs to read its data from. + * @param constant_pool This is the constant pool associated with the Attribute that we are constructing. + * + * @return The user-defined AttributeReader should take this data and use + * it to construct an attribute. In the case of errors, a null can be + * returned which will cause the parsing of the class file to fail. + * + * @see Attribute#addAttributeReader(String, UnknownAttributeReader) + */ + Attribute createAttribute( int name_index, int length, java.io.DataInput file, ConstantPool constant_pool ); +} -- GitLab From 67dfdf60f5f8ccb8ed910bfe9d1cdc6e84f0db36 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 20 Feb 2015 01:23:20 +0000 Subject: [PATCH 0731/1313] Refactored JavaClass and FieldOrMethod to avoid a code duplication in the getAnnotationEntries methods. Thanks to Charles Honton (BCEL-165) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1661052 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/AnnotationEntry.java | 13 +++++ .../apache/bcel/classfile/FieldOrMethod.java | 50 ++----------------- .../org/apache/bcel/classfile/JavaClass.java | 33 ++++-------- 3 files changed, 29 insertions(+), 67 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 817d6a46..ff768fb2 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -22,6 +22,7 @@ import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.apache.bcel.Constants; @@ -149,4 +150,16 @@ public class AnnotationEntry implements Node, Constants, Serializable { } return result.toString(); } + + public static AnnotationEntry[] createAnnotationEntries(Attribute[] attrs) { + // Find attributes that contain annotation data + List accumulatedAnnotations = new ArrayList(attrs.length); + for (Attribute attribute : attrs) { + if (attribute instanceof Annotations) { + Annotations runtimeAnnotations = (Annotations) attribute; + Collections.addAll(accumulatedAnnotations, runtimeAnnotations.getAnnotationEntries()); + } + } + return accumulatedAnnotations.toArray(new AnnotationEntry[accumulatedAnnotations.size()]); + } } diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index 3c506b11..d1caff28 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -21,8 +21,6 @@ import java.io.DataInput; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; import org.apache.bcel.Constants; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.Signature; @@ -46,10 +44,6 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No private String signatureAttributeString = null; private boolean searchedForSignatureAttribute = false; - - // Annotations are collected from certain attributes, don't do it more than necessary! - private boolean annotationsOutOfDate = true; - FieldOrMethod() { } @@ -233,50 +227,16 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No } /** - * Ensure we have unpacked any attributes that contain annotations. - * We don't remove these annotation attributes from the attributes list, they - * remain there. + * @return Annotations on the field or method */ - private void ensureAnnotationsUpToDate() - { - if (annotationsOutOfDate) - { - // Find attributes that contain annotation data - Attribute[] attrs = getAttributes(); - List accumulatedAnnotations = new ArrayList(); - for (Attribute attribute : attrs) { - if (attribute instanceof Annotations) - { - Annotations annotations = (Annotations) attribute; - for (int j = 0; j < annotations.getAnnotationEntries().length; j++) - { - accumulatedAnnotations.add(annotations - .getAnnotationEntries()[j]); - } - } - } - annotationEntries = accumulatedAnnotations - .toArray(new AnnotationEntry[accumulatedAnnotations.size()]); - annotationsOutOfDate = false; + public AnnotationEntry[] getAnnotationEntries() { + if (annotationEntries == null) { + annotationEntries = AnnotationEntry.createAnnotationEntries(getAttributes()); } - } - - public AnnotationEntry[] getAnnotationEntries() - { - ensureAnnotationsUpToDate(); + return annotationEntries; } - public void addAnnotationEntry(AnnotationEntry a) - { - ensureAnnotationsUpToDate(); - int len = annotationEntries.length; - AnnotationEntry[] newAnnotations = new AnnotationEntry[len + 1]; - System.arraycopy(annotationEntries, 0, newAnnotations, 0, len); - newAnnotations[len] = a; - annotationEntries = newAnnotations; - } - /** * Hunts for a signature attribute on the member and returns its contents. So where the 'regular' signature * may be (Ljava/util/Vector;)V the signature attribute may in fact say 'Ljava/lang/Vector<Ljava/lang/String>;' diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 30e3b082..df8b1706 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -73,10 +73,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public static final byte ZIP = 3; static boolean debug = false; // Debugging on/off final static char sep = File.separatorChar; // directory separator - - // Annotations are collected from certain attributes, don't do it more than necessary! - private boolean annotationsOutOfDate = true; - + private static BCELComparator _cmp = new BCELComparator() { public boolean equals( Object o1, Object o2 ) { @@ -144,7 +141,6 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl this.fields = fields; this.methods = methods; this.attributes = attributes; - annotationsOutOfDate = true; this.source = source; // Get source file name if available for (Attribute attribute : attributes) { @@ -337,24 +333,17 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl return attributes; } + /** + * @return Annotations on the class + */ public AnnotationEntry[] getAnnotationEntries() { - if (annotationsOutOfDate) { - // Find attributes that contain annotation data - Attribute[] attrs = getAttributes(); - List accumulatedAnnotations = new ArrayList(); - for (Attribute attribute : attrs) { - if (attribute instanceof Annotations) { - Annotations runtimeAnnotations = (Annotations)attribute; - for(int j = 0; j < runtimeAnnotations.getAnnotationEntries().length; j++) { - accumulatedAnnotations.add(runtimeAnnotations.getAnnotationEntries()[j]); - } - } - } - annotations = accumulatedAnnotations.toArray(new AnnotationEntry[accumulatedAnnotations.size()]); - annotationsOutOfDate = false; - } - return annotations; - } + if (annotations == null) { + annotations = AnnotationEntry.createAnnotationEntries(getAttributes()); + } + + return annotations; + } + /** * @return Class name. */ -- GitLab From 1fdd06ce9f554eb3c0a5e9d3c1288cf039c88a90 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 20 Feb 2015 07:58:15 +0000 Subject: [PATCH 0732/1313] Removed an unused loop in ClassPath (BCEL-176) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1661071 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/util/ClassPath.java | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index c2528694..109dd327 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -261,20 +261,18 @@ public class ClassPath implements Serializable { * @return class file for the java class */ public ClassFile getClassFile( String name, String suffix ) throws IOException { - for (PathEntry path : paths) { // TODO why is path not used?? - ClassFile cf = null; + ClassFile cf = null; - if(parent != null) { - cf = parent.getClassFileInternal(name, suffix); - } + if (parent != null) { + cf = parent.getClassFileInternal(name, suffix); + } - if(cf == null) { - cf = getClassFileInternal(name,suffix); - } + if (cf == null) { + cf = getClassFileInternal(name, suffix); + } - if(cf != null) { - return cf; - } + if (cf != null) { + return cf; } throw new IOException("Couldn't find: " + name + suffix); -- GitLab From cc8df59cf3c4287325e0e9bfffe591609bf01ed4 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 20 Feb 2015 10:00:07 +0000 Subject: [PATCH 0733/1313] Ich glaube dass better besser ist git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1661080 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/InstructionList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 043b7b12..3a2d2b73 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -1121,7 +1121,7 @@ public class InstructionList implements Serializable { /** - * Delete contents of list. Provides besser memory utilization, + * Delete contents of list. Provides better memory utilization, * because the system then may reuse the instruction handles. This * method is typically called right after {@link MethodGen#getMethod()}. */ -- GitLab From ff5344694261cef3d3d68b71d663073d6ac7d0d0 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 20 Feb 2015 10:21:53 +0000 Subject: [PATCH 0734/1313] foreach loops in the blocks handling TargetLostException git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1661082 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/generic/MethodGen.java | 6 ++---- .../bcel/generic/TargetLostException.java | 18 ++++++++---------- src/site/xdoc/manual.xml | 17 ++++++----------- 3 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 8cce2218..9c16da67 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -716,10 +716,8 @@ public class MethodGen extends FieldGenOrMethodGen { try { il.delete(ih); } catch (TargetLostException e) { - InstructionHandle[] targets = e.getTargets(); - for (InstructionHandle target : targets) { - InstructionTargeter[] targeters = target.getTargeters(); - for (InstructionTargeter targeter : targeters) { + for (InstructionHandle target : e.getTargets()) { + for (InstructionTargeter targeter : target.getTargeters()) { targeter.updateTarget(target, next); } } diff --git a/src/main/java/org/apache/bcel/generic/TargetLostException.java b/src/main/java/org/apache/bcel/generic/TargetLostException.java index e6188889..8e2b371c 100644 --- a/src/main/java/org/apache/bcel/generic/TargetLostException.java +++ b/src/main/java/org/apache/bcel/generic/TargetLostException.java @@ -18,8 +18,8 @@ package org.apache.bcel.generic; /** - * Thrown by InstructionList.remove() when one or multiple disposed instruction - * are still being referenced by a InstructionTargeter object. I.e. the + * Thrown by InstructionList.remove() when one or multiple disposed instructions + * are still being referenced by an InstructionTargeter object. I.e. the * InstructionTargeter has to be notified that (one of) the InstructionHandle it * is referencing is being removed from the InstructionList and thus not valid anymore. * @@ -30,15 +30,13 @@ package org.apache.bcel.generic; *

      *     ...
      *     try {
    - *    il.delete(start_ih, end_ih);
    + *         il.delete(start_ih, end_ih);
      *     } catch(TargetLostException e) {
    - *       InstructionHandle[] targets = e.getTargets();
    - *     for(int i=0; i < targets.length; i++) {
    - *       InstructionTargeter[] targeters = targets[i].getTargeters();
    - *     
    - *       for(int j=0; j < targeters.length; j++)
    - *         targeters[j].updateTarget(targets[i], new_target);
    - *       }
    + *         for (InstructionHandle target : e.getTargets()) {
    + *             for (InstructionTargeter targeter : target.getTargeters()) {
    + *                 targeter.updateTarget(target, new_target);
    + *             }
    + *         }
      *     }
      * 
    * diff --git a/src/site/xdoc/manual.xml b/src/site/xdoc/manual.xml index 716d69f8..d9ab982d 100644 --- a/src/site/xdoc/manual.xml +++ b/src/site/xdoc/manual.xml @@ -958,11 +958,9 @@ try { il.delete(first, last); } catch (TargetLostException e) { - InstructionHandle[] targets = e.getTargets(); - for (int i = 0; i < targets.length; i++) { - InstructionTargeter[] targeters = targets[i].getTargeters(); - for (int j = 0; j < targeters.length; j++) { - targeters[j].updateTarget(targets[i], new_target); + for (InstructionHandle target : e.getTargets()) { + for (InstructionTargeter targeter : target.getTargeters()) { + targeter.updateTarget(target, new_target); } } } @@ -1636,12 +1634,9 @@ public class Peephole { try { il.delete(first, last); } catch (TargetLostException e) { - InstructionHandle[] targets = e.getTargets(); - for (int i = 0; i < targets.length; i++) { - InstructionTargeter[] targeters = targets[i].getTargeters(); - - for (int j = 0; j < targeters.length; j++) { - targeters[j].updateTarget(targets[i], next); + for (InstructionHandle target : e.getTargets()) { + for (InstructionTargeter targeter = target.getTargeters()) { + targeter.updateTarget(target, next); } } } -- GitLab From 101996e7ade8d700263b6fc7504ccfcae4884ef6 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 20 Feb 2015 11:11:54 +0000 Subject: [PATCH 0735/1313] Reformatted the examples git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1661091 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/HelloWorldBuilder.java | 282 ++++++++--------- src/examples/JasminVisitor.java | 474 ++++++++++++++-------------- src/examples/Package.java | 441 +++++++++++++------------- src/examples/Peephole.java | 129 ++++---- src/examples/ProxyCreator.java | 153 ++++----- src/examples/TransitiveHull.java | 70 ++-- src/examples/helloify.java | 178 +++++------ src/examples/id.java | 44 ++- src/examples/listclass.java | 337 ++++++++++---------- src/examples/maxstack.java | 80 +++-- src/examples/patchclass.java | 129 ++++---- 11 files changed, 1145 insertions(+), 1172 deletions(-) diff --git a/src/examples/HelloWorldBuilder.java b/src/examples/HelloWorldBuilder.java index 9c25d0c2..9a54c576 100644 --- a/src/examples/HelloWorldBuilder.java +++ b/src/examples/HelloWorldBuilder.java @@ -15,6 +15,9 @@ * limitations under the License. * */ + +import java.io.IOException; + import org.apache.bcel.Constants; import org.apache.bcel.generic.ALOAD; import org.apache.bcel.generic.ASTORE; @@ -38,162 +41,143 @@ import org.apache.bcel.generic.Type; * import java.io.*; * * public class HelloWorld { - * public static void main(String[] argv) { - * BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - * String name = null; + * public static void main(String[] argv) { + * BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + * String name = null; * - * try { - * System.out.print("Please enter your name> "); - * name = in.readLine(); - * } catch(IOException e) { - * System.out.println(e); - * return; - * } + * try { + * System.out.print("Please enter your name> "); + * name = in.readLine(); + * } catch(IOException e) { + * System.out.println(e); + * return; + * } * - * System.out.println("Hello, " + name); - * } + * System.out.println("Hello, " + name); + * } * } * * - * @version $Id$ * @author M. Dahm + * @version $Id$ */ public class HelloWorldBuilder { - public static void main(String[] argv) { - ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", - "", Constants.ACC_PUBLIC | - Constants.ACC_SUPER, - null); - ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool - InstructionList il = new InstructionList(); - MethodGen mg = new MethodGen(Constants.ACC_STATIC | - Constants.ACC_PUBLIC,// access flags - Type.VOID, // return type - new Type[] { // argument types - new ArrayType(Type.STRING, 1) - }, - new String[] { "argv" }, // arg names - "main", "HelloWorld", // method, class - il, cp); - InstructionFactory factory = new InstructionFactory(cg); - - ObjectType i_stream = new ObjectType("java.io.InputStream"); - ObjectType p_stream = new ObjectType("java.io.PrintStream"); - - /* Create BufferedReader object and store it in local variable `in'. - */ - il.append(factory.createNew("java.io.BufferedReader")); - il.append(InstructionConstants.DUP); // Use predefined constant, i.e. flyweight - il.append(factory.createNew("java.io.InputStreamReader")); - il.append(InstructionConstants.DUP); - il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, - Constants.GETSTATIC)); - - /* Call constructors, i.e. BufferedReader(InputStreamReader()) - */ - il.append(factory.createInvoke("java.io.InputStreamReader", "", - Type.VOID, new Type[] { i_stream }, - Constants.INVOKESPECIAL)); - il.append(factory.createInvoke("java.io.BufferedReader", "", Type.VOID, - new Type[] { new ObjectType("java.io.Reader") }, - Constants.INVOKESPECIAL)); - - /* Create local variable `in' - */ - LocalVariableGen lg = mg.addLocalVariable("in", - new ObjectType("java.io.BufferedReader"), - null, null); - int in = lg.getIndex(); - lg.setStart(il.append(new ASTORE(in))); // `i' valid from here - - /* Create local variable `name' - */ - lg = mg.addLocalVariable("name", Type.STRING, null, null); - int name = lg.getIndex(); - il.append(InstructionConstants.ACONST_NULL); - lg.setStart(il.append(new ASTORE(name))); // `name' valid from here - - /* try { ... - */ - InstructionHandle try_start = - il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, - Constants.GETSTATIC)); - - il.append(new PUSH(cp, "Please enter your name> ")); - il.append(factory.createInvoke("java.io.PrintStream", "print", Type.VOID, - new Type[] { Type.STRING }, Constants.INVOKEVIRTUAL)); - il.append(new ALOAD(in)); - il.append(factory.createInvoke("java.io.BufferedReader", "readLine", - Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); - il.append(new ASTORE(name)); - - /* Upon normal execution we jump behind exception handler, - * the target address is not known yet. - */ - GOTO g = new GOTO(null); - InstructionHandle try_end = il.append(g); - - /* } catch() { ... } - * Add exception handler: print exception and return from method - */ - InstructionHandle handler = - il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, - Constants.GETSTATIC)); - // Little trick in order not to save exception object temporarily - il.append(InstructionConstants.SWAP); - - il.append(factory.createInvoke("java.io.PrintStream", "println", Type.VOID, - new Type[] { Type.OBJECT }, Constants.INVOKEVIRTUAL)); - il.append(InstructionConstants.RETURN); - mg.addExceptionHandler(try_start, try_end, handler, - new ObjectType("java.io.IOException")); - - /* Normal code continues, now we can set the branch target of the GOTO - * that jumps over the handler code. - */ - InstructionHandle ih = - il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, - Constants.GETSTATIC)); - g.setTarget(ih); - - /* String concatenation compiles to StringBuffer operations. - */ - il.append(factory.createNew(Type.STRINGBUFFER)); - il.append(InstructionConstants.DUP); - il.append(new PUSH(cp, "Hello, ")); - il.append(factory.createInvoke("java.lang.StringBuffer", "", - Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKESPECIAL)); - il.append(new ALOAD(name)); + public static void main(String[] argv) { + ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", + "", Constants.ACC_PUBLIC | + Constants.ACC_SUPER, + null); + ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool + InstructionList il = new InstructionList(); + MethodGen mg = new MethodGen(Constants.ACC_STATIC | + Constants.ACC_PUBLIC,// access flags + Type.VOID, // return type + new Type[]{ // argument types + new ArrayType(Type.STRING, 1) + }, + new String[]{"argv"}, // arg names + "main", "HelloWorld", // method, class + il, cp); + InstructionFactory factory = new InstructionFactory(cg); + + ObjectType i_stream = new ObjectType("java.io.InputStream"); + ObjectType p_stream = new ObjectType("java.io.PrintStream"); + + // Create BufferedReader object and store it in local variable `in'. + il.append(factory.createNew("java.io.BufferedReader")); + il.append(InstructionConstants.DUP); // Use predefined constant, i.e. flyweight + il.append(factory.createNew("java.io.InputStreamReader")); + il.append(InstructionConstants.DUP); + il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, Constants.GETSTATIC)); + + // Call constructors, i.e. BufferedReader(InputStreamReader()) + il.append(factory.createInvoke("java.io.InputStreamReader", "", + Type.VOID, new Type[]{i_stream}, + Constants.INVOKESPECIAL)); + il.append(factory.createInvoke("java.io.BufferedReader", "", Type.VOID, + new Type[]{new ObjectType("java.io.Reader")}, + Constants.INVOKESPECIAL)); + + // Create local variable `in' + LocalVariableGen lg = mg.addLocalVariable("in", new ObjectType("java.io.BufferedReader"), null, null); + int in = lg.getIndex(); + lg.setStart(il.append(new ASTORE(in))); // `i' valid from here + + // Create local variable `name' + lg = mg.addLocalVariable("name", Type.STRING, null, null); + int name = lg.getIndex(); + il.append(InstructionConstants.ACONST_NULL); + lg.setStart(il.append(new ASTORE(name))); // `name' valid from here + + // try { ... + InstructionHandle try_start = + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, Constants.GETSTATIC)); + + il.append(new PUSH(cp, "Please enter your name> ")); + il.append(factory.createInvoke("java.io.PrintStream", "print", Type.VOID, + new Type[]{Type.STRING}, Constants.INVOKEVIRTUAL)); + il.append(new ALOAD(in)); + il.append(factory.createInvoke("java.io.BufferedReader", "readLine", + Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); + il.append(new ASTORE(name)); + + // Upon normal execution we jump behind exception handler, the target address is not known yet. + GOTO g = new GOTO(null); + InstructionHandle try_end = il.append(g); + + /* } catch() { ... } + * Add exception handler: print exception and return from method + */ + InstructionHandle handler = + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, Constants.GETSTATIC)); + // Little trick in order not to save exception object temporarily + il.append(InstructionConstants.SWAP); + + il.append(factory.createInvoke("java.io.PrintStream", "println", Type.VOID, new Type[]{Type.OBJECT}, Constants.INVOKEVIRTUAL)); + il.append(InstructionConstants.RETURN); + mg.addExceptionHandler(try_start, try_end, handler, new ObjectType("java.io.IOException")); + + // Normal code continues, now we can set the branch target of the GOTO that jumps over the handler code. + InstructionHandle ih = + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, Constants.GETSTATIC)); + g.setTarget(ih); + + // String concatenation compiles to StringBuffer operations. + il.append(factory.createNew(Type.STRINGBUFFER)); + il.append(InstructionConstants.DUP); + il.append(new PUSH(cp, "Hello, ")); + il.append(factory.createInvoke("java.lang.StringBuffer", "", + Type.VOID, new Type[]{Type.STRING}, + Constants.INVOKESPECIAL)); + il.append(new ALOAD(name)); - /* Concatenate strings using a StringBuffer and print them. - */ - il.append(factory.createInvoke("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); - il.append(factory.createInvoke("java.lang.StringBuffer", "toString", - Type.STRING, Type.NO_ARGS, - Constants.INVOKEVIRTUAL)); - - il.append(factory.createInvoke("java.io.PrintStream", "println", - Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); - - il.append(InstructionConstants.RETURN); - - mg.setMaxStack(5); // Needed stack size - cg.addMethod(mg.getMethod()); - - il.dispose(); // Reuse instruction handles - - /* Add public method, i.e. empty constructor - */ - cg.addEmptyConstructor(Constants.ACC_PUBLIC); - - /* Get JavaClass object and dump it to file. - */ - try { - cg.getJavaClass().dump("HelloWorld.class"); - } catch(java.io.IOException e) { System.err.println(e); } - } + // Concatenate strings using a StringBuffer and print them. + il.append(factory.createInvoke("java.lang.StringBuffer", "append", + Type.STRINGBUFFER, new Type[]{Type.STRING}, + Constants.INVOKEVIRTUAL)); + il.append(factory.createInvoke("java.lang.StringBuffer", "toString", + Type.STRING, Type.NO_ARGS, + Constants.INVOKEVIRTUAL)); + + il.append(factory.createInvoke("java.io.PrintStream", "println", + Type.VOID, new Type[]{Type.STRING}, + Constants.INVOKEVIRTUAL)); + + il.append(InstructionConstants.RETURN); + + mg.setMaxStack(5); // Needed stack size + cg.addMethod(mg.getMethod()); + + il.dispose(); // Reuse instruction handles + + // Add public method, i.e. empty constructor + cg.addEmptyConstructor(Constants.ACC_PUBLIC); + + // Get JavaClass object and dump it to file. + try { + cg.getJavaClass().dump("HelloWorld.class"); + } catch (IOException e) { + System.err.println(e); + } + } } diff --git a/src/examples/JasminVisitor.java b/src/examples/JasminVisitor.java index 189cb0a6..1eaa6fba 100644 --- a/src/examples/JasminVisitor.java +++ b/src/examples/JasminVisitor.java @@ -15,6 +15,7 @@ * limitations under the License. * */ + import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; @@ -22,6 +23,7 @@ import java.io.PrintWriter; import java.util.Date; import java.util.Hashtable; import java.util.StringTokenizer; + import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.Attribute; @@ -53,294 +55,282 @@ import org.apache.bcel.generic.TABLESWITCH; * Disassemble Java class object into the * Jasmin format. * - * @version $Id$ * @author M. Dahm + * @version $Id$ */ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { - private JavaClass clazz; - private PrintWriter out; - private String class_name; - private ConstantPoolGen cp; - - public JasminVisitor(JavaClass clazz, OutputStream out) { - this.clazz = clazz; - this.out = new PrintWriter(out); - class_name = clazz.getClassName(); - cp = new ConstantPoolGen(clazz.getConstantPool()); - } - - /** - * Start traversal using DefaultVisitor pattern. - */ - public void disassemble() { - new org.apache.bcel.classfile.DescendingVisitor(clazz, this).visit(); - out.close(); - } - - @Override - public void visitJavaClass(JavaClass clazz) { - out.println(";; Produced by JasminVisitor (BCEL)"); - out.println(";; http://commons.apache.org/bcel/"); - out.println(";; " + new Date() + "\n"); - - out.println(".source " + clazz.getSourceFileName()); - out.println("." + Utility.classOrInterface(clazz.getAccessFlags()) + " " + - Utility.accessToString(clazz.getAccessFlags(), true) + - " " + clazz.getClassName().replace('.', '/')); - out.println(".super " + clazz.getSuperclassName().replace('.', '/')); - - String[] interfaces = clazz.getInterfaceNames(); - - for(int i=0; i < interfaces.length; i++) { - out.println(".implements " + interfaces[i].replace('.', '/')); + private JavaClass clazz; + private PrintWriter out; + private String class_name; + private ConstantPoolGen cp; + + public JasminVisitor(JavaClass clazz, OutputStream out) { + this.clazz = clazz; + this.out = new PrintWriter(out); + this.class_name = clazz.getClassName(); + this.cp = new ConstantPoolGen(clazz.getConstantPool()); } - out.print("\n"); - } + /** + * Start traversal using DefaultVisitor pattern. + */ + public void disassemble() { + new org.apache.bcel.classfile.DescendingVisitor(clazz, this).visit(); + out.close(); + } + + @Override + public void visitJavaClass(JavaClass clazz) { + out.println(";; Produced by JasminVisitor (BCEL)"); + out.println(";; http://commons.apache.org/bcel/"); + out.println(";; " + new Date() + "\n"); + + out.println(".source " + clazz.getSourceFileName()); + out.println("." + Utility.classOrInterface(clazz.getAccessFlags()) + " " + + Utility.accessToString(clazz.getAccessFlags(), true) + + " " + clazz.getClassName().replace('.', '/')); + out.println(".super " + clazz.getSuperclassName().replace('.', '/')); + + for (String iface : clazz.getInterfaceNames()) { + out.println(".implements " + iface.replace('.', '/')); + } - @Override - public void visitField(Field field) { - out.print(".field " + Utility.accessToString(field.getAccessFlags()) + - " \"" +field.getName() + "\"" + field.getSignature()); - if(field.getAttributes().length == 0) { out.print("\n"); } - } - @Override - public void visitConstantValue(ConstantValue cv) { - out.println(" = " + cv); - } + @Override + public void visitField(Field field) { + out.print(".field " + Utility.accessToString(field.getAccessFlags()) + + " \"" + field.getName() + "\"" + field.getSignature()); + if (field.getAttributes().length == 0) { + out.print("\n"); + } + } - private Method _method; + @Override + public void visitConstantValue(ConstantValue cv) { + out.println(" = " + cv); + } - /** - * Unfortunately Jasmin expects ".end method" after each method. Thus we've to check - * for every of the method's attributes if it's the last one and print ".end method" - * then. - */ - private void printEndMethod(Attribute attr) { - Attribute[] attributes = _method.getAttributes(); + private Method _method; - if(attr == attributes[attributes.length - 1]) { - out.println(".end method"); - } - } + /** + * Unfortunately Jasmin expects ".end method" after each method. Thus we've to check + * for every of the method's attributes if it's the last one and print ".end method" + * then. + */ + private void printEndMethod(Attribute attr) { + Attribute[] attributes = _method.getAttributes(); - @Override - public void visitDeprecated(Deprecated attribute) { printEndMethod(attribute); } + if (attr == attributes[attributes.length - 1]) { + out.println(".end method"); + } + } - @Override - public void visitSynthetic(Synthetic attribute) { - if(_method != null) { + @Override + public void visitDeprecated(Deprecated attribute) { printEndMethod(attribute); } - } - @Override - public void visitMethod(Method method) { - this._method = method; // Remember for use in subsequent visitXXX calls + @Override + public void visitSynthetic(Synthetic attribute) { + if (_method != null) { + printEndMethod(attribute); + } + } - out.println("\n.method " + Utility.accessToString(_method.getAccessFlags()) + - " " + _method.getName() + _method.getSignature()); + @Override + public void visitMethod(Method method) { + this._method = method; // Remember for use in subsequent visitXXX calls - Attribute[] attributes = _method.getAttributes(); - if((attributes == null) || (attributes.length == 0)) { - out.println(".end method"); - } - } + out.println("\n.method " + Utility.accessToString(_method.getAccessFlags()) + + " " + _method.getName() + _method.getSignature()); - @Override - public void visitExceptionTable(ExceptionTable e) { - String[] names = e.getExceptionNames(); - for(int i=0; i < names.length; i++) { - out.println(".throws " + names[i].replace('.', '/')); + Attribute[] attributes = _method.getAttributes(); + if ((attributes == null) || (attributes.length == 0)) { + out.println(".end method"); + } } - printEndMethod(e); - } + @Override + public void visitExceptionTable(ExceptionTable e) { + for (String name : e.getExceptionNames()) { + out.println(".throws " + name.replace('.', '/')); + } + + printEndMethod(e); + } - private Hashtable map; + private Hashtable map; - @Override - public void visitCode(Code code) { - int label_counter = 0; + @Override + public void visitCode(Code code) { + int label_counter = 0; - out.println(".limit stack " + code.getMaxStack()); - out.println(".limit locals " + code.getMaxLocals()); + out.println(".limit stack " + code.getMaxStack()); + out.println(".limit locals " + code.getMaxLocals()); - MethodGen mg = new MethodGen(_method, class_name, cp); - InstructionList il = mg.getInstructionList(); - InstructionHandle[] ihs = il.getInstructionHandles(); + MethodGen mg = new MethodGen(_method, class_name, cp); + InstructionList il = mg.getInstructionList(); + InstructionHandle[] ihs = il.getInstructionHandles(); /* Pass 1: Give all referenced instruction handles a symbolic name, i.e. a * label. */ - map = new Hashtable(); - - for(int i=0; i < ihs.length; i++) { - if(ihs[i] instanceof BranchHandle) { - BranchInstruction bi = (BranchInstruction)ihs[i].getInstruction(); - - if(bi instanceof Select) { // Special cases LOOKUPSWITCH and TABLESWITCH - InstructionHandle[] targets = ((Select)bi).getTargets(); - - for(int j=0; j < targets.length; j++) { - put(targets[j], "Label" + label_counter++ + ":"); - } - } + map = new Hashtable(); - InstructionHandle ih = bi.getTarget(); - put(ih, "Label" + label_counter++ + ":"); - } - } + for (InstructionHandle ih1 : ihs) { + if (ih1 instanceof BranchHandle) { + BranchInstruction bi = (BranchInstruction) ih1.getInstruction(); - LocalVariableGen[] lvs = mg.getLocalVariables(); - for(int i=0; i < lvs.length; i++) { - InstructionHandle ih = lvs[i].getStart(); - put(ih, "Label" + label_counter++ + ":"); - ih = lvs[i].getEnd(); - put(ih, "Label" + label_counter++ + ":"); - } - - CodeExceptionGen[] ehs = mg.getExceptionHandlers(); - for(int i=0; i < ehs.length; i++) { - CodeExceptionGen c = ehs[i]; - InstructionHandle ih = c.getStartPC(); - - put(ih, "Label" + label_counter++ + ":"); - ih = c.getEndPC(); - put(ih, "Label" + label_counter++ + ":"); - ih = c.getHandlerPC(); - put(ih, "Label" + label_counter++ + ":"); - } + if (bi instanceof Select) { // Special cases LOOKUPSWITCH and TABLESWITCH + for (InstructionHandle target : ((Select) bi).getTargets()) { + put(target, "Label" + label_counter++ + ":"); + } + } - LineNumberGen[] lns = mg.getLineNumbers(); - for(int i=0; i < lns.length; i++) { - InstructionHandle ih = lns[i].getInstruction(); - put(ih, ".line " + lns[i].getSourceLine()); - } - - /* Pass 2: Output code. - */ - for(int i=0; i < lvs.length; i++) { - LocalVariableGen l = lvs[i]; - out.println(".var " + l.getIndex() + " is " + l.getName() + " " + - l.getType().getSignature() + - " from " + get(l.getStart()) + - " to " + get(l.getEnd())); - } + InstructionHandle ih = bi.getTarget(); + put(ih, "Label" + label_counter++ + ":"); + } + } - out.print("\n"); - - for(int i=0; i < ihs.length; i++) { - InstructionHandle ih = ihs[i]; - Instruction inst = ih.getInstruction(); - String str = map.get(ih); - - if(str != null) { - out.println(str); - } + LocalVariableGen[] lvs = mg.getLocalVariables(); + for (LocalVariableGen lv : lvs) { + InstructionHandle ih = lv.getStart(); + put(ih, "Label" + label_counter++ + ":"); + ih = lv.getEnd(); + put(ih, "Label" + label_counter++ + ":"); + } + + CodeExceptionGen[] ehs = mg.getExceptionHandlers(); + for (CodeExceptionGen c : ehs) { + InstructionHandle ih = c.getStartPC(); - if(inst instanceof BranchInstruction) { - if(inst instanceof Select) { // Special cases LOOKUPSWITCH and TABLESWITCH - Select s = (Select)inst; - int[] matchs = s.getMatchs(); - InstructionHandle[] targets = s.getTargets(); - - if(s instanceof TABLESWITCH) { - out.println("\ttableswitch " + matchs[0] + " " + - matchs[matchs.length - 1]); - - for(int j=0; j < targets.length; j++) { - out.println("\t\t" + get(targets[j])); + put(ih, "Label" + label_counter++ + ":"); + ih = c.getEndPC(); + put(ih, "Label" + label_counter++ + ":"); + ih = c.getHandlerPC(); + put(ih, "Label" + label_counter++ + ":"); } - } else { // LOOKUPSWITCH - out.println("\tlookupswitch "); + LineNumberGen[] lns = mg.getLineNumbers(); + for (LineNumberGen ln : lns) { + InstructionHandle ih = ln.getInstruction(); + put(ih, ".line " + ln.getSourceLine()); + } - for(int j=0; j < targets.length; j++) { - out.println("\t\t" + matchs[j] + " : " + get(targets[j])); + // Pass 2: Output code. + for (LocalVariableGen l : lvs) { + out.println(".var " + l.getIndex() + " is " + l.getName() + " " + + l.getType().getSignature() + + " from " + get(l.getStart()) + + " to " + get(l.getEnd())); } - } - - out.println("\t\tdefault: " + get(s.getTarget())); // Applies for both - } else { - BranchInstruction bi = (BranchInstruction)inst; - ih = bi.getTarget(); - str = get(ih); - out.println("\t" + Constants.OPCODE_NAMES[bi.getOpcode()] + " " + str); - } - } else { - out.println("\t" + inst.toString(cp.getConstantPool())); - } - } - - out.print("\n"); - - for(int i=0; i < ehs.length; i++) { - CodeExceptionGen c = ehs[i]; - ObjectType caught = c.getCatchType(); - String class_name = (caught == null)? // catch any exception, used when compiling finally - "all" : caught.getClassName().replace('.', '/'); - - out.println(".catch " + class_name + " from " + - get(c.getStartPC()) + " to " + get(c.getEndPC()) + - " using " + get(c.getHandlerPC())); - } - printEndMethod(code); - } - - private String get(InstructionHandle ih) { - String str = new StringTokenizer(map.get(ih), "\n").nextToken(); - return str.substring(0, str.length() - 1); - } - - private void put(InstructionHandle ih, String line) { - String str = map.get(ih); - - if(str == null) { - map.put(ih, line); - } else { - if(line.startsWith("Label") || str.endsWith(line)) { - return; - } + out.print("\n"); - map.put(ih, str + "\n" + line); // append + for (InstructionHandle ih : ihs) { + Instruction inst = ih.getInstruction(); + String str = map.get(ih); + + if (str != null) { + out.println(str); + } + + if (inst instanceof BranchInstruction) { + if (inst instanceof Select) { // Special cases LOOKUPSWITCH and TABLESWITCH + Select s = (Select) inst; + int[] matchs = s.getMatchs(); + InstructionHandle[] targets = s.getTargets(); + + if (s instanceof TABLESWITCH) { + out.println("\ttableswitch " + matchs[0] + " " + matchs[matchs.length - 1]); + + for (InstructionHandle target : targets) { + out.println("\t\t" + get(target)); + } + + } else { // LOOKUPSWITCH + out.println("\tlookupswitch "); + + for (int j = 0; j < targets.length; j++) { + out.println("\t\t" + matchs[j] + " : " + get(targets[j])); + } + } + + out.println("\t\tdefault: " + get(s.getTarget())); // Applies for both + } else { + BranchInstruction bi = (BranchInstruction) inst; + ih = bi.getTarget(); + str = get(ih); + out.println("\t" + Constants.OPCODE_NAMES[bi.getOpcode()] + " " + str); + } + } else { + out.println("\t" + inst.toString(cp.getConstantPool())); + } + } + + out.print("\n"); + + for (CodeExceptionGen c : ehs) { + ObjectType caught = c.getCatchType(); + String class_name = (caught == null) ? // catch any exception, used when compiling finally + "all" : caught.getClassName().replace('.', '/'); + + out.println(".catch " + class_name + " from " + + get(c.getStartPC()) + " to " + get(c.getEndPC()) + + " using " + get(c.getHandlerPC())); + } + + printEndMethod(code); } - } - - public static void main(String[] argv) { - JavaClass java_class; - - try { - if(argv.length == 0) { - System.err.println("disassemble: No input files specified"); - } else { - for(int i=0; i < argv.length; i++) { - if((java_class = Repository.lookupClass(argv[i])) == null) { - java_class = new ClassParser(argv[i]).parse(); + + private String get(InstructionHandle ih) { + String str = new StringTokenizer(map.get(ih), "\n").nextToken(); + return str.substring(0, str.length() - 1); } - String class_name = java_class.getClassName(); - int index = class_name.lastIndexOf('.'); - String path = class_name.substring(0, index + 1).replace('.', File.separatorChar); - class_name = class_name.substring(index + 1); + private void put(InstructionHandle ih, String line) { + String str = map.get(ih); - if(!path.equals("")) { - File f = new File(path); - f.mkdirs(); - } + if (str == null) { + map.put(ih, line); + } else { + if (line.startsWith("Label") || str.endsWith(line)) { + return; + } - String name = path + class_name + ".j"; - FileOutputStream out = new FileOutputStream(name); - new JasminVisitor(java_class, out).disassemble(); - System.out.println("File dumped to: " + name); + map.put(ih, str + "\n" + line); // append + } } - } - } catch(Exception e) { - e.printStackTrace(); + + public static void main(String[] argv) throws Exception { + JavaClass java_class; + + if (argv.length == 0) { + System.err.println("disassemble: No input files specified"); + return; + } + + for (String arg : argv) { + if ((java_class = Repository.lookupClass(arg)) == null) { + java_class = new ClassParser(arg).parse(); + } + + String class_name = java_class.getClassName(); + int index = class_name.lastIndexOf('.'); + String path = class_name.substring(0, index + 1).replace('.', File.separatorChar); + class_name = class_name.substring(index + 1); + + if (!path.equals("")) { + File f = new File(path); + f.mkdirs(); + } + + String name = path + class_name + ".j"; + FileOutputStream out = new FileOutputStream(name); + new JasminVisitor(java_class, out).disassemble(); + System.out.println("File dumped to: " + name); + } } - } } diff --git a/src/examples/Package.java b/src/examples/Package.java index 3a9f9e61..2c7c2c5a 100644 --- a/src/examples/Package.java +++ b/src/examples/Package.java @@ -15,6 +15,7 @@ * limitations under the License. * */ + import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -36,235 +37,247 @@ import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.util.ClassPath; /** - * Package the client. Creates a jar file in the current directory + * Package the client. Creates a jar file in the current directory * that contains a minimal set of classes needed to run the client. * * Use BCEL to extract class names and read/write classes + * * @author First Hop Ltd / Torsten Rueger */ public class Package { - - /** - * The name of the resulting jar is Client.jar - */ - static String defaultJar = "Client.jar"; - - /* - * See usage() for arguments. Create an instance and run that - *(just so not all members have to be static) - */ - static void main(String args[]) { - Package instance = new Package(); - try{ - instance.go(args); - }catch(Exception e){ - e.printStackTrace(); - instance.usage(); - } - } - - /** - * We use a "default ClassPath object which uses the environments - * CLASSPATH - */ - ClassPath classPath = ClassPath.SYSTEM_CLASS_PATH; - /** - * A map for all Classes, the ones we're going to package. - * Store class name against the JavaClass. From the JavaClass - * we get the bytes to create the jar. - */ - Map allClasses = new TreeMap(); - /** - * We start at the root classes, put them in here, then go through - * this list, putting dependent classes in here and from there - * into allClasses. Store class names against class names of their dependents - */ - TreeMap dependents = new TreeMap(); - /** - * Collect all classes that could not be found in the classpath. - * Store class names against class names of their dependents - */ - TreeMap notFound = new TreeMap(); - /** - * See wheather we print the classes that were not found (default = false) - */ - boolean showNotFound = false ; - /** - * Remember wheather to print allClasses at the end (default = false) - */ - boolean printClasses = false ; - /** - * Wheather we log classes during processing (default = false) - */ - boolean log = false ; + /** + * The name of the resulting jar is Client.jar + */ + static String defaultJar = "Client.jar"; - public void usage(){ - System.out.println(" This program packages classes and all their dependents"); - System.out.println(" into one jar. Give all starting classes (your main)"); - System.out.println(" on the command line. Use / as separator, the .class is"); - System.out.println(" optional. We use the environments CLASSPATH to resolve"); - System.out.println(" classes. Anything but java.* packages are packaged."); - System.out.println(" If you use Class.forName (or similar), be sure to"); - System.out.println(" include the classes that you load dynamically on the"); - System.out.println(" command line.\n"); - System.out.println(" These options are recognized:"); - System.out.println(" -e -error Show errors, meaning classes that could not "); - System.out.println(" resolved + the classes that referenced them."); - System.out.println(" -l -log Show classes as they are processed. This will"); - System.out.println(" include doubles, java classes and is difficult to"); - System.out.println(" read. I use it as a sort of progress monitor"); - System.out.println(" -s -show Prints all the classes that were packaged"); - System.out.println(" in alphabetical order, which is ordered by package"); - System.out.println(" for the most part."); - } - /** - * the main of this class - */ - void go(String[] args) throws IOException { - JavaClass clazz ; - // sort the options - for(int i = 0 ; i < args.length ; i++ ){ - if( args[i].startsWith("-e") ) { - showNotFound = true; - continue; - } - if( args[i].startsWith("-s") ) { - printClasses = true ; - continue; - } - if( args[i].startsWith("-l") ) { - log = true ; - continue; - } - String clName = args[i]; - if(clName.endsWith(".class")) { - clName = clName.substring(0,clName.length()-6); - } - clName = clName.replace('.','/'); - clazz = new ClassParser(classPath.getInputStream(clName),clName).parse(); - // here we create the root set of classes to process - addDependents(clazz); - System.out.println("Packaging for class: " + clName ); - } - if( dependents.isEmpty() ){ - usage(); - return ; - } - System.out.println("Creating jar file: " + defaultJar ); - // starting processing: Grab from the dependents list an add back to it - // and the allClasses list. see addDependents - while(!dependents.isEmpty() ){ - String name = dependents.firstKey(); - String from = dependents.remove(name); - if(allClasses.get(name) == null){ - try{ - InputStream is = classPath.getInputStream(name); - clazz = new ClassParser(is, name).parse(); - addDependents(clazz); - }catch( IOException e){ - //System.err.println("Error, class not found " + name ); - notFound.put(name,from); - } - } - } - if(printClasses) { // if wanted show all classes - printAllClasses(); + /* + * See usage() for arguments. Create an instance and run that + *(just so not all members have to be static) + */ + static void main(String args[]) { + Package instance = new Package(); + try { + instance.go(args); + } catch (Exception e) { + e.printStackTrace(); + instance.usage(); + } } - // create the jar - JarOutputStream jarFile = new JarOutputStream(new FileOutputStream(defaultJar)); - jarFile.setLevel(5); // use compression - int written = 0; - for (String name : allClasses.keySet()) { // add entries for every class - JavaClass claz = allClasses.get(name); - ZipEntry zipEntry = new ZipEntry(name+".class"); - byte[] bytes = claz.getBytes() ; - int length = bytes.length ; - jarFile.putNextEntry(zipEntry); - jarFile.write( bytes , 0 , length ); - written += length; // for logging - } - jarFile.close(); - System.err.println("The jar file contains " + allClasses.size() - +" classes and contains " +written+ " bytes"); - if( !notFound.isEmpty() ){ - System.err.println( notFound.size() +" classes could not be found"); - if(showNotFound){ // if wanted show the actual classes that we not found - while(!notFound.isEmpty()){ - String name = notFound.firstKey(); - System.err.println( name+ " (" + notFound.remove(name)+")"); - } - }else{ - System.err.println("Use '-e' option to view classes that were not found"); - } - } - } - /** - * Print all classes that were packaged. Sort alphabetically for better - * overview. Enabled by -s option - */ - void printAllClasses(){ - List names = new ArrayList(allClasses.keySet()); - Collections.sort(names); - for( int i = 0 ; i < names.size() ; i ++ ){ - String cl = names.get(i); - System.err.println(cl); + /** + * We use a "default ClassPath object which uses the environments + * CLASSPATH + */ + ClassPath classPath = ClassPath.SYSTEM_CLASS_PATH; + + /** + * A map for all Classes, the ones we're going to package. + * Store class name against the JavaClass. From the JavaClass + * we get the bytes to create the jar. + */ + Map allClasses = new TreeMap(); + + /** + * We start at the root classes, put them in here, then go through + * this list, putting dependent classes in here and from there + * into allClasses. Store class names against class names of their dependents + */ + TreeMap dependents = new TreeMap(); + + /** + * Collect all classes that could not be found in the classpath. + * Store class names against class names of their dependents + */ + TreeMap notFound = new TreeMap(); + + /** + * See wheather we print the classes that were not found (default = false) + */ + boolean showNotFound = false; + /** + * Remember wheather to print allClasses at the end (default = false) + */ + boolean printClasses = false; + /** + * Wheather we log classes during processing (default = false) + */ + boolean log = false; + + public void usage() { + System.out.println(" This program packages classes and all their dependents"); + System.out.println(" into one jar. Give all starting classes (your main)"); + System.out.println(" on the command line. Use / as separator, the .class is"); + System.out.println(" optional. We use the environments CLASSPATH to resolve"); + System.out.println(" classes. Anything but java.* packages are packaged."); + System.out.println(" If you use Class.forName (or similar), be sure to"); + System.out.println(" include the classes that you load dynamically on the"); + System.out.println(" command line.\n"); + System.out.println(" These options are recognized:"); + System.out.println(" -e -error Show errors, meaning classes that could not "); + System.out.println(" resolved + the classes that referenced them."); + System.out.println(" -l -log Show classes as they are processed. This will"); + System.out.println(" include doubles, java classes and is difficult to"); + System.out.println(" read. I use it as a sort of progress monitor"); + System.out.println(" -s -show Prints all the classes that were packaged"); + System.out.println(" in alphabetical order, which is ordered by package"); + System.out.println(" for the most part."); } - } - - /** - *Add this class to allClasses. Then go through all its dependents - * and add them to the dependents list if they are not in allClasses - */ - void addDependents( JavaClass clazz ) throws IOException { - String name = clazz.getClassName().replace('.', '/'); - allClasses.put( name , clazz ); - ConstantPool pool = clazz.getConstantPool(); - for( int i = 1 ; i < pool.getLength() ; i++){ - Constant cons = pool.getConstant(i); - //System.out.println("("+i+") " + cons ); - if( cons!=null && cons.getTag() == Constants.CONSTANT_Class ){ - int idx = ((ConstantClass)pool.getConstant(i)).getNameIndex(); - String clas = ((ConstantUtf8)pool.getConstant(idx)).getBytes(); - addClassString(clas,name); - } + + /** + * the main of this class + */ + void go(String[] args) throws IOException { + JavaClass clazz; + // sort the options + for (String arg : args) { + if (arg.startsWith("-e")) { + showNotFound = true; + continue; + } + if (arg.startsWith("-s")) { + printClasses = true; + continue; + } + if (arg.startsWith("-l")) { + log = true; + continue; + } + String clName = arg; + if (clName.endsWith(".class")) { + clName = clName.substring(0, clName.length() - 6); + } + clName = clName.replace('.', '/'); + clazz = new ClassParser(classPath.getInputStream(clName), clName).parse(); + // here we create the root set of classes to process + addDependents(clazz); + System.out.println("Packaging for class: " + clName); + } + + if (dependents.isEmpty()) { + usage(); + return; + } + + System.out.println("Creating jar file: " + defaultJar); + + // starting processing: Grab from the dependents list an add back to it + // and the allClasses list. see addDependents + while (!dependents.isEmpty()) { + String name = dependents.firstKey(); + String from = dependents.remove(name); + if (allClasses.get(name) == null) { + try { + InputStream is = classPath.getInputStream(name); + clazz = new ClassParser(is, name).parse(); + addDependents(clazz); + } catch (IOException e) { + //System.err.println("Error, class not found " + name ); + notFound.put(name, from); + } + } + } + + if (printClasses) { // if wanted show all classes + printAllClasses(); + } + + // create the jar + JarOutputStream jarFile = new JarOutputStream(new FileOutputStream(defaultJar)); + jarFile.setLevel(5); // use compression + int written = 0; + for (String name : allClasses.keySet()) { // add entries for every class + JavaClass claz = allClasses.get(name); + ZipEntry zipEntry = new ZipEntry(name + ".class"); + byte[] bytes = claz.getBytes(); + int length = bytes.length; + jarFile.putNextEntry(zipEntry); + jarFile.write(bytes, 0, length); + written += length; // for logging + } + jarFile.close(); + System.err.println("The jar file contains " + allClasses.size() + + " classes and contains " + written + " bytes"); + + if (!notFound.isEmpty()) { + System.err.println(notFound.size() + " classes could not be found"); + if (showNotFound) { // if wanted show the actual classes that we not found + while (!notFound.isEmpty()) { + String name = notFound.firstKey(); + System.err.println(name + " (" + notFound.remove(name) + ")"); + } + } else { + System.err.println("Use '-e' option to view classes that were not found"); + } + } } - } - /** - * add given class to dependents (from is where its dependent from) - * some fiddeling to be done because of array class notation - */ - void addClassString(String clas,String from) throws IOException{ - if(log){ - System.out.println("processing: " + clas +" referenced by " + from); + /** + * Print all classes that were packaged. Sort alphabetically for better + * overview. Enabled by -s option + */ + void printAllClasses() { + List names = new ArrayList(allClasses.keySet()); + Collections.sort(names); + for (int i = 0; i < names.size(); i++) { + String cl = names.get(i); + System.err.println(cl); + } } - // must check if it's an arrary (start with "[") - if(clas.startsWith("[")) { - if(clas.length() == 2 ) { - // it's an array of built in type, ignore - return; - } - if( 'L' == clas.charAt(1) ){ - // it's an array of objects, the class name is between [L and ; - // like [Ljava/lang/Object; - addClassString(clas.substring(2,clas.length()-1),from); - return; - } - if( '[' == clas.charAt(1) ){ - // it's an array of arrays, call recursive - addClassString(clas.substring(1),from); - return ; - } - throw new IOException("Can't recognize class name =" + clas); + + /** + * Add this class to allClasses. Then go through all its dependents + * and add them to the dependents list if they are not in allClasses + */ + void addDependents(JavaClass clazz) throws IOException { + String name = clazz.getClassName().replace('.', '/'); + allClasses.put(name, clazz); + ConstantPool pool = clazz.getConstantPool(); + for (int i = 1; i < pool.getLength(); i++) { + Constant cons = pool.getConstant(i); + //System.out.println("("+i+") " + cons ); + if (cons != null && cons.getTag() == Constants.CONSTANT_Class) { + int idx = ((ConstantClass) pool.getConstant(i)).getNameIndex(); + String clas = ((ConstantUtf8) pool.getConstant(idx)).getBytes(); + addClassString(clas, name); + } + } } - if( !clas.startsWith("java/") && allClasses.get(clas) == null) { - dependents.put(clas,from); - // System.out.println(" yes" ); - } else { - // System.out.println(" no" ); + /** + * add given class to dependents (from is where its dependent from) + * some fiddeling to be done because of array class notation + */ + void addClassString(String clas, String from) throws IOException { + if (log) { + System.out.println("processing: " + clas + " referenced by " + from); + } + + // must check if it's an arrary (start with "[") + if (clas.startsWith("[")) { + if (clas.length() == 2) { + // it's an array of built in type, ignore + return; + } + if ('L' == clas.charAt(1)) { + // it's an array of objects, the class name is between [L and ; + // like [Ljava/lang/Object; + addClassString(clas.substring(2, clas.length() - 1), from); + return; + } + if ('[' == clas.charAt(1)) { + // it's an array of arrays, call recursive + addClassString(clas.substring(1), from); + return; + } + throw new IOException("Can't recognize class name =" + clas); + } + + if (!clas.startsWith("java/") && allClasses.get(clas) == null) { + dependents.put(clas, from); + // System.out.println(" yes" ); + } else { + // System.out.println(" no" ); + } } - } } diff --git a/src/examples/Peephole.java b/src/examples/Peephole.java index 6c180b4a..334da0cd 100644 --- a/src/examples/Peephole.java +++ b/src/examples/Peephole.java @@ -15,7 +15,9 @@ * limitations under the License. * */ + import java.util.Iterator; + import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Method; @@ -30,83 +32,76 @@ import org.apache.bcel.util.InstructionFinder; /** * Remove NOPs from given class * - * @version $Id$ * @author M. Dahm + * @version $Id$ */ public class Peephole { - public static void main(String[] argv) { - try { - /* Load the class from CLASSPATH. - */ - JavaClass clazz = Repository.lookupClass(argv[0]); - Method[] methods = clazz.getMethods(); - ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); - for(int i=0; i < methods.length; i++) { - if(!(methods[i].isAbstract() || methods[i].isNative())) { - MethodGen mg = new MethodGen(methods[i], - clazz.getClassName(), cp); - Method stripped = removeNOPs(mg); - - if(stripped != null) { - methods[i] = stripped; // Overwrite with stripped method - } - } - } + public static void main(String[] argv) { + try { + // Load the class from CLASSPATH. + JavaClass clazz = Repository.lookupClass(argv[0]); + Method[] methods = clazz.getMethods(); + ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); - /* Dump the class to _.class - */ - clazz.setConstantPool(cp.getFinalConstantPool()); - clazz.dump(clazz.getClassName() + "_.class"); - } catch(Exception e) { e.printStackTrace(); } - } + for (int i = 0; i < methods.length; i++) { + if (!(methods[i].isAbstract() || methods[i].isNative())) { + MethodGen mg = new MethodGen(methods[i], clazz.getClassName(), cp); + Method stripped = removeNOPs(mg); - private static Method removeNOPs(MethodGen mg) { - InstructionList il = mg.getInstructionList(); - InstructionFinder f = new InstructionFinder(il); - String pat = "NOP+"; // Find at least one NOP - InstructionHandle next = null; - int count = 0; + if (stripped != null) { + methods[i] = stripped; // Overwrite with stripped method + } + } + } - for(Iterator e = f.search(pat); e.hasNext(); ) { - InstructionHandle[] match = e.next(); - InstructionHandle first = match[0]; - InstructionHandle last = match[match.length - 1]; - - /* Some nasty Java compilers may add NOP at end of method. - */ - if((next = last.getNext()) == null) { - break; + // Dump the class to _.class + clazz.setConstantPool(cp.getFinalConstantPool()); + clazz.dump(clazz.getClassName() + "_.class"); + } catch (Exception e) { + e.printStackTrace(); + } } - count += match.length; + private static Method removeNOPs(MethodGen mg) { + InstructionList il = mg.getInstructionList(); + InstructionFinder f = new InstructionFinder(il); + String pat = "NOP+"; // Find at least one NOP + InstructionHandle next = null; + int count = 0; - /* Delete NOPs and redirect any references to them to the following - * (non-nop) instruction. - */ - try { - il.delete(first, last); - } catch(TargetLostException e2) { - InstructionHandle[] targets = e2.getTargets(); - for(int i=0; i < targets.length; i++) { - InstructionTargeter[] targeters = targets[i].getTargeters(); - - for(int j=0; j < targeters.length; j++) { - targeters[j].updateTarget(targets[i], next); - } - } - } - } + for (Iterator e = f.search(pat); e.hasNext(); ) { + InstructionHandle[] match = e.next(); + InstructionHandle first = match[0]; + InstructionHandle last = match[match.length - 1]; - Method m = null; - - if(count > 0) { - System.out.println("Removed " + count + " NOP instructions from method " + - mg.getName()); - m = mg.getMethod(); - } + // Some nasty Java compilers may add NOP at end of method. + if ((next = last.getNext()) == null) { + break; + } + + count += match.length; + + // Delete NOPs and redirect any references to them to the following (non-nop) instruction. + try { + il.delete(first, last); + } catch (TargetLostException e2) { + for (InstructionHandle target : e2.getTargets()) { + for (InstructionTargeter targeter : target.getTargeters()) { + targeter.updateTarget(target, next); + } + } + } + } - il.dispose(); // Reuse instruction handles - return m; - } + Method m = null; + + if (count > 0) { + System.out.println("Removed " + count + " NOP instructions from method " + mg.getName()); + m = mg.getMethod(); + } + + il.dispose(); // Reuse instruction handles + return m; + } } diff --git a/src/examples/ProxyCreator.java b/src/examples/ProxyCreator.java index 42d1db12..c89d9398 100644 --- a/src/examples/ProxyCreator.java +++ b/src/examples/ProxyCreator.java @@ -15,8 +15,10 @@ * limitations under the License. * */ + import java.awt.event.ActionEvent; import java.awt.event.ActionListener; + import org.apache.bcel.Constants; import org.apache.bcel.classfile.Utility; import org.apache.bcel.generic.ALOAD; @@ -44,88 +46,91 @@ import org.apache.bcel.generic.Type; * comparable to the mechanism provided via * {@code java.lang.reflect.Proxy}, but much more flexible. * - * @version $Id$ * @author M. Dahm + * @version $Id$ * @see org.apache.bcel.util.JavaWrapper * @see org.apache.bcel.util.ClassLoader * @see Utility */ public class ProxyCreator { - /** Load class and create instance - */ - public static Object createProxy(String pack, String class_name) { - try { - Class cl = Class.forName(pack + "$$BCEL$$" + class_name); - return cl.newInstance(); - } catch(Exception e) { - e.printStackTrace(); + + /** + * Load class and create instance + */ + public static Object createProxy(String pack, String class_name) { + try { + Class cl = Class.forName(pack + "$$BCEL$$" + class_name); + return cl.newInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + + return null; } - return null; - } - - /** Create JavaClass object for a simple proxy for an java.awt.event.ActionListener - * that just prints the passed arguments, load and use it via the class loader - * mechanism. - */ - public static void main(String[] argv) throws Exception { - ClassLoader loader = ProxyCreator.class.getClassLoader(); - - // instanceof won't work here ... - if(loader.getClass().toString().equals("class org.apache.bcel.util.ClassLoader")) { - // Real class name will be set by the class loader - ClassGen cg = new ClassGen("foo", "java.lang.Object", "", Constants.ACC_PUBLIC, - new String[] {"java.awt.event.ActionListener"}); - - // That's important, otherwise newInstance() won't work - cg.addEmptyConstructor(Constants.ACC_PUBLIC); - - InstructionList il = new InstructionList(); - ConstantPoolGen cp = cg.getConstantPool(); - InstructionFactory factory = new InstructionFactory(cg); - - int out = cp.addFieldref("java.lang.System", "out", - "Ljava/io/PrintStream;"); - int println = cp.addMethodref("java.io.PrintStream", "println", - "(Ljava/lang/Object;)V"); - MethodGen mg = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, - new Type[] { - new ObjectType("java.awt.event.ActionEvent") - }, null, "actionPerformed", "foo", il, cp); - - // System.out.println("actionPerformed:" + event); - il.append(new GETSTATIC(out)); - il.append(factory.createNew("java.lang.StringBuffer")); - il.append(InstructionConstants.DUP); - il.append(new PUSH(cp, "actionPerformed:")); - il.append(factory.createInvoke("java.lang.StringBuffer", "", Type.VOID, - new Type[] {Type.STRING}, Constants.INVOKESPECIAL)); - - il.append(new ALOAD(1)); - il.append(factory.createAppend(Type.OBJECT)); - il.append(new INVOKEVIRTUAL(println)); - il.append(InstructionConstants.RETURN); - - mg.stripAttributes(true); - mg.setMaxStack(); - mg.setMaxLocals(); - cg.addMethod(mg.getMethod()); - - byte[] bytes = cg.getJavaClass().getBytes(); - - System.out.println("Uncompressed class: " + bytes.length); - - String s = Utility.encode(bytes, true); - System.out.println("Encoded class: " + s.length()); - - System.out.print("Creating proxy ... "); - ActionListener a = (ActionListener)createProxy("foo.bar.", s); - System.out.println("Done. Now calling actionPerformed()"); - - a.actionPerformed(new ActionEvent(a, ActionEvent.ACTION_PERFORMED, "hello")); - } else { - System.err.println("Call me with java org.apache.bcel.util.JavaWrapper ProxyCreator"); + /** + * Create JavaClass object for a simple proxy for an java.awt.event.ActionListener + * that just prints the passed arguments, load and use it via the class loader + * mechanism. + */ + public static void main(String[] argv) throws Exception { + ClassLoader loader = ProxyCreator.class.getClassLoader(); + + // instanceof won't work here ... + if (loader.getClass().toString().equals("class org.apache.bcel.util.ClassLoader")) { + // Real class name will be set by the class loader + ClassGen cg = new ClassGen("foo", "java.lang.Object", "", Constants.ACC_PUBLIC, + new String[]{"java.awt.event.ActionListener"}); + + // That's important, otherwise newInstance() won't work + cg.addEmptyConstructor(Constants.ACC_PUBLIC); + + InstructionList il = new InstructionList(); + ConstantPoolGen cp = cg.getConstantPool(); + InstructionFactory factory = new InstructionFactory(cg); + + int out = cp.addFieldref("java.lang.System", "out", + "Ljava/io/PrintStream;"); + int println = cp.addMethodref("java.io.PrintStream", "println", + "(Ljava/lang/Object;)V"); + MethodGen mg = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, + new Type[]{ + new ObjectType("java.awt.event.ActionEvent") + }, null, "actionPerformed", "foo", il, cp); + + // System.out.println("actionPerformed:" + event); + il.append(new GETSTATIC(out)); + il.append(factory.createNew("java.lang.StringBuffer")); + il.append(InstructionConstants.DUP); + il.append(new PUSH(cp, "actionPerformed:")); + il.append(factory.createInvoke("java.lang.StringBuffer", "", Type.VOID, + new Type[]{Type.STRING}, Constants.INVOKESPECIAL)); + + il.append(new ALOAD(1)); + il.append(factory.createAppend(Type.OBJECT)); + il.append(new INVOKEVIRTUAL(println)); + il.append(InstructionConstants.RETURN); + + mg.stripAttributes(true); + mg.setMaxStack(); + mg.setMaxLocals(); + cg.addMethod(mg.getMethod()); + + byte[] bytes = cg.getJavaClass().getBytes(); + + System.out.println("Uncompressed class: " + bytes.length); + + String s = Utility.encode(bytes, true); + System.out.println("Encoded class: " + s.length()); + + System.out.print("Creating proxy ... "); + ActionListener a = (ActionListener) createProxy("foo.bar.", s); + System.out.println("Done. Now calling actionPerformed()"); + + a.actionPerformed(new ActionEvent(a, ActionEvent.ACTION_PERFORMED, "hello")); + } else { + System.err.println("Call me with java org.apache.bcel.util.JavaWrapper ProxyCreator"); + } } - } } diff --git a/src/examples/TransitiveHull.java b/src/examples/TransitiveHull.java index 2ffd0846..2c41e491 100644 --- a/src/examples/TransitiveHull.java +++ b/src/examples/TransitiveHull.java @@ -15,8 +15,10 @@ * limitations under the License. * */ + import java.util.Arrays; import java.util.regex.Pattern; + import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.ClassParser; @@ -46,41 +48,42 @@ import org.apache.bcel.util.ClassSet; *

    * You'll need Apache's regular expression library supplied together with BCEL * to use this class. - * - * @version $Id$ + * * @author M. Dahm + * @version $Id$ */ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { - private ClassQueue _queue; - private ClassSet _set; - private ConstantPool _cp; - private String[] _ignored = IGNORED; - public static final String[] IGNORED = { "java[.].*", "javax[.].*", "sun[.].*", "sunw[.].*", - "com[.]sun[.].*", "org[.]omg[.].*", "org[.]w3c[.].*", "org[.]xml[.].*", "net[.]jini[.].*" }; + private ClassQueue queue; + private ClassSet set; + private ConstantPool cp; + private String[] ignored = IGNORED; + + public static final String[] IGNORED = {"java[.].*", "javax[.].*", "sun[.].*", "sunw[.].*", + "com[.]sun[.].*", "org[.]omg[.].*", "org[.]w3c[.].*", "org[.]xml[.].*", "net[.]jini[.].*"}; public TransitiveHull(JavaClass clazz) { - _queue = new ClassQueue(); - _queue.enqueue(clazz); - _set = new ClassSet(); - _set.add(clazz); + queue = new ClassQueue(); + queue.enqueue(clazz); + set = new ClassSet(); + set.add(clazz); } public JavaClass[] getClasses() { - return _set.toArray(); + return set.toArray(); } public String[] getClassNames() { - return _set.getClassNames(); + return set.getClassNames(); } /** * Start traversal using DescendingVisitor pattern. */ public void start() { - while (!_queue.empty()) { - JavaClass clazz = _queue.dequeue(); - _cp = clazz.getConstantPool(); + while (!queue.empty()) { + JavaClass clazz = queue.dequeue(); + cp = clazz.getConstantPool(); new org.apache.bcel.classfile.DescendingVisitor(clazz, this).visit(); } @@ -89,8 +92,8 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { private void add(String class_name) { class_name = class_name.replace('/', '.'); - for (int i = 0; i < _ignored.length; i++) { - if (Pattern.matches(_ignored[i], class_name)) { + for (String anIgnored : ignored) { + if (Pattern.matches(anIgnored, class_name)) { return; } } @@ -98,8 +101,8 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { try { JavaClass clazz = Repository.lookupClass(class_name); - if (_set.add(clazz)) { - _queue.enqueue(clazz); + if (set.add(clazz)) { + queue.enqueue(clazz); } } catch (ClassNotFoundException e) { throw new IllegalStateException("Missing class: " + e.toString()); @@ -108,7 +111,7 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { @Override public void visitConstantClass(ConstantClass cc) { - String class_name = (String) cc.getConstantValue(_cp); + String class_name = (String) cc.getConstantValue(cp); add(class_name); } @@ -123,23 +126,21 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { } private void visitRef(ConstantCP ccp, boolean method) { - String class_name = ccp.getClass(_cp); + String class_name = ccp.getClass(cp); add(class_name); - ConstantNameAndType cnat = (ConstantNameAndType) _cp.getConstant(ccp.getNameAndTypeIndex(), + ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(ccp.getNameAndTypeIndex(), Constants.CONSTANT_NameAndType); - String signature = cnat.getSignature(_cp); + String signature = cnat.getSignature(cp); if (method) { Type type = Type.getReturnType(signature); checkType(type); - Type[] types = Type.getArgumentTypes(signature); - - for (int i = 0; i < types.length; i++) { - checkType(types[i]); + for (Type type1 : Type.getArgumentTypes(signature)) { + checkType(type1); } } else { checkType(Type.getType(signature)); @@ -162,17 +163,16 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { } public String[] getIgnored() { - return _ignored; + return ignored; } /** - * Set the value of _ignored. - * - * @param v - * Value to assign to _ignored. + * Set the value of ignored. + * + * @param v Value to assign to ignored. */ public void setIgnored(String[] v) { - _ignored = v; + ignored = v; } public static void main(String[] argv) { diff --git a/src/examples/helloify.java b/src/examples/helloify.java index 469db649..08a55f68 100644 --- a/src/examples/helloify.java +++ b/src/examples/helloify.java @@ -15,6 +15,7 @@ * limitations under the License. * */ + import org.apache.bcel.Constants; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.Code; @@ -37,108 +38,99 @@ import org.apache.bcel.generic.PUSH; * Read class file(s) and patch all of its methods, so that they print * "hello" and their name and signature before doing anything else. * - * @version $Id$ * @author M. Dahm + * @version $Id$ */ public final class helloify implements Constants { - private static String class_name; - private static ConstantPoolGen cp; - private static int out; // reference to System.out - private static int println; // reference to PrintStream.println - - public static void main(String[] argv) { - try { - for(int i=0; i < argv.length; i++) { - if(argv[i].endsWith(".class")) { - JavaClass java_class = new ClassParser(argv[i]).parse(); - ConstantPool constants = java_class.getConstantPool(); - String file_name = argv[i].substring(0, argv[i].length() - 6) + - "_hello.class"; - cp = new ConstantPoolGen(constants); - - helloifyClassName(java_class); - - out = cp.addFieldref("java.lang.System", "out", - "Ljava/io/PrintStream;"); - println = cp.addMethodref("java.io.PrintStream", "println", - "(Ljava/lang/String;)V"); - /* Patch all methods. - */ - Method[] methods = java_class.getMethods(); - - for(int j=0; j < methods.length; j++) { - methods[j] = helloifyMethod(methods[j]); - } - /* Finally dump it back to a file. - */ - java_class.setConstantPool(cp.getFinalConstantPool()); - java_class.dump(file_name); - } - } - } catch(Exception e) { - e.printStackTrace(); - } - } - - /** Change class name to _hello - */ - private static void helloifyClassName(JavaClass java_class ) { - class_name = java_class.getClassName() + "_hello"; - int index = java_class.getClassNameIndex(); - - index = ((ConstantClass)cp.getConstant(index)).getNameIndex(); - cp.setConstant(index, new ConstantUtf8(class_name.replace('.', '/'))); - } - - /** - * Patch a method. - */ - private static Method helloifyMethod(Method m) { - Code code = m.getCode(); - int flags = m.getAccessFlags(); - String name = m.getName(); - - // Sanity check - if(m.isNative() || m.isAbstract() || (code == null)) { - return m; - } - - /* Create instruction list to be inserted at method start. - */ - String mesg = "Hello from " + Utility.methodSignatureToString(m.getSignature(), - name, - Utility.accessToString(flags)); - InstructionList patch = new InstructionList(); - patch.append(new GETSTATIC(out)); - patch.append(new PUSH(cp, mesg)); - patch.append(new INVOKEVIRTUAL(println)); - - MethodGen mg = new MethodGen(m, class_name, cp); - InstructionList il = mg.getInstructionList(); - InstructionHandle[] ihs = il.getInstructionHandles(); - - if(name.equals("")) { // First let the super or other constructor be called - for(int j=1; j < ihs.length; j++) { - if(ihs[j].getInstruction() instanceof INVOKESPECIAL) { - il.append(ihs[j], patch); // Should check: method name == "" - break; - } - } - } else { - il.insert(ihs[0], patch); + private static String class_name; + private static ConstantPoolGen cp; + private static int out; // reference to System.out + private static int println; // reference to PrintStream.println + + public static void main(String[] argv) throws Exception { + for (String arg : argv) { + if (arg.endsWith(".class")) { + JavaClass java_class = new ClassParser(arg).parse(); + ConstantPool constants = java_class.getConstantPool(); + String file_name = arg.substring(0, arg.length() - 6) + "_hello.class"; + cp = new ConstantPoolGen(constants); + + helloifyClassName(java_class); + + out = cp.addFieldref("java.lang.System", "out", "Ljava/io/PrintStream;"); + println = cp.addMethodref("java.io.PrintStream", "println", "(Ljava/lang/String;)V"); + // Patch all methods. + Method[] methods = java_class.getMethods(); + + for (int j = 0; j < methods.length; j++) { + methods[j] = helloifyMethod(methods[j]); + } + + // Finally dump it back to a file. + java_class.setConstantPool(cp.getFinalConstantPool()); + java_class.dump(file_name); + } + } } - /* Stack size must be at least 2, since the println method takes 2 argument. + /** + * Change class name to _hello */ - if(code.getMaxStack() < 2) { - mg.setMaxStack(2); + private static void helloifyClassName(JavaClass java_class) { + class_name = java_class.getClassName() + "_hello"; + int index = java_class.getClassNameIndex(); + + index = ((ConstantClass) cp.getConstant(index)).getNameIndex(); + cp.setConstant(index, new ConstantUtf8(class_name.replace('.', '/'))); } - m = mg.getMethod(); + /** + * Patch a method. + */ + private static Method helloifyMethod(Method m) { + Code code = m.getCode(); + int flags = m.getAccessFlags(); + String name = m.getName(); - il.dispose(); // Reuse instruction handles + // Sanity check + if (m.isNative() || m.isAbstract() || (code == null)) { + return m; + } - return m; - } + // Create instruction list to be inserted at method start. + String mesg = "Hello from " + Utility.methodSignatureToString(m.getSignature(), + name, + Utility.accessToString(flags)); + InstructionList patch = new InstructionList(); + patch.append(new GETSTATIC(out)); + patch.append(new PUSH(cp, mesg)); + patch.append(new INVOKEVIRTUAL(println)); + + MethodGen mg = new MethodGen(m, class_name, cp); + InstructionList il = mg.getInstructionList(); + InstructionHandle[] ihs = il.getInstructionHandles(); + + if (name.equals("")) { // First let the super or other constructor be called + for (int j = 1; j < ihs.length; j++) { + if (ihs[j].getInstruction() instanceof INVOKESPECIAL) { + il.append(ihs[j], patch); // Should check: method name == "" + break; + } + } + } else { + il.insert(ihs[0], patch); + } + + // Stack size must be at least 2, since the println method takes 2 argument. + if (code.getMaxStack() < 2) { + mg.setMaxStack(2); + } + + m = mg.getMethod(); + + il.dispose(); // Reuse instruction handles + + return m; + } } diff --git a/src/examples/id.java b/src/examples/id.java index 22c49953..cdb94101 100644 --- a/src/examples/id.java +++ b/src/examples/id.java @@ -15,6 +15,7 @@ * limitations under the License. * */ + import org.apache.bcel.Repository; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.Field; @@ -31,39 +32,36 @@ import org.apache.bcel.generic.MethodGen; * * Try to: *

    -% java id 
    -% java listclass -code  > foo
    -% java listclass -code .clazz > bar
    -% diff foo bar | more
    + * % java id 
    + * % java listclass -code  > foo
    + * % java listclass -code .clazz > bar
    + * % diff foo bar | more
      * 
      *
    - * @version $Id$
      * @author M. Dahm
    + * @version $Id$
      */
     public class id {
    -  public static void main(String[] argv) throws Exception { 
    -    JavaClass clazz = null;
     
    -    if((clazz = Repository.lookupClass(argv[0])) == null) {
    -        clazz = new ClassParser(argv[0]).parse(); // May throw IOException
    -    }
    +    public static void main(String[] argv) throws Exception {
    +        JavaClass clazz;
     
    -    ClassGen cg = new ClassGen(clazz);
    +        if ((clazz = Repository.lookupClass(argv[0])) == null) {
    +            clazz = new ClassParser(argv[0]).parse(); // May throw IOException
    +        }
     
    -    Method[] methods = clazz.getMethods();
    +        ClassGen cg = new ClassGen(clazz);
     
    -    for(int i=0; i < methods.length; i++) {
    -      MethodGen mg = new MethodGen(methods[i], cg.getClassName(), cg.getConstantPool());
    -      cg.replaceMethod(methods[i], mg.getMethod());
    -    }
    +        for (Method method : clazz.getMethods()) {
    +            MethodGen mg = new MethodGen(method, cg.getClassName(), cg.getConstantPool());
    +            cg.replaceMethod(method, mg.getMethod());
    +        }
     
    -    Field[] fields = clazz.getFields();
    +        for (Field field : clazz.getFields()) {
    +            FieldGen fg = new FieldGen(field, cg.getConstantPool());
    +            cg.replaceField(field, fg.getField());
    +        }
     
    -    for(int i=0; i < fields.length; i++) {
    -      FieldGen fg =  new FieldGen(fields[i], cg.getConstantPool());
    -      cg.replaceField(fields[i], fg.getField());
    +        cg.getJavaClass().dump(clazz.getClassName() + ".clazz");
         }
    -
    -    cg.getJavaClass().dump(clazz.getClassName() + ".clazz");
    -  }
     }
    diff --git a/src/examples/listclass.java b/src/examples/listclass.java
    index be28e058..80d23ef4 100644
    --- a/src/examples/listclass.java
    +++ b/src/examples/listclass.java
    @@ -15,9 +15,12 @@
      *  limitations under the License.
      *
      */
    +
     import java.io.IOException;
    -import java.util.Hashtable;
    -import java.util.Vector;
    +import java.util.ArrayList;
    +import java.util.HashMap;
    +import java.util.List;
    +import java.util.Map;
     
     import org.apache.bcel.Constants;
     import org.apache.bcel.Repository;
    @@ -42,11 +45,11 @@ import org.apache.bcel.classfile.Method;
      * 
  • {@code -recurse} Usually intended to be used along with * {@code -dependencies} When this flag is set, listclass will also print information * about all classes which the target class depends on.
  • - * + * *
  • {@code -dependencies} Setting this flag makes listclass print a list of all * classes which the target class depends on. Generated from getting all * CONSTANT_Class constants from the constant pool.
  • - * + * *
  • {@code -exclude} All non-flag arguments after this flag are added to an * 'exclusion list'. Target classes are compared with the members of the * exclusion list. Any target class whose fully qualified name begins with a @@ -72,197 +75,205 @@ import org.apache.bcel.classfile.Method; * dependents. Do not analyze classes beginning with "java.", "javax.", or "sun." *

    * + * @author M. Dahm, + * Thomas Wheeler * @version $Id$ - * @author M. Dahm, - * Thomas Wheeler */ public class listclass { - boolean code, constants, verbose, classdep, nocontents, recurse; - Hashtable listedClasses; - Vector exclude_name; - public static void main(String[] argv) { - Vector file_name = new Vector(); - Vector exclude_name = new Vector(); - boolean code = false, constants=false, verbose=true, classdep=false, - nocontents=false, recurse=false, exclude=false; - String name = null; + boolean code; + boolean constants; + boolean verbose; + boolean classdep; + boolean nocontents; + boolean recurse; + Map listedClasses; + List exclude_name; - /* Parse command line arguments. - */ - for(int i=0; i < argv.length; i++) { - if(argv[i].charAt(0) == '-') { // command line switch - if(argv[i].equals("-constants")) { - constants=true; - } else if(argv[i].equals("-code")) { - code=true; - } else if(argv[i].equals("-brief")) { - verbose=false; - } else if(argv[i].equals("-dependencies")) { - classdep=true; - } else if(argv[i].equals("-nocontents")) { - nocontents=true; - } else if(argv[i].equals("-recurse")) { - recurse=true; - } else if(argv[i].equals("-exclude")) { - exclude=true; - } else if(argv[i].equals("-help")) { - System.out.println( "Usage: java listclass [-constants] [-code] [-brief] " + - "[-dependencies] [-nocontents] [-recurse] class... " + - "[-exclude ]\n" + - "-constants Print constants table (constant pool)\n" + - "-code Dump byte code of methods\n" + - "-brief Brief listing\n" + - "-dependencies Show class dependencies\n" + - "-nocontents Do not print field/method information\n" + - "-recurse Recurse into dependent classes\n" + - "-exclude Do not list classes beginning with " + - "strings in " ); - System.exit( 0 ); - } else { - System.err.println("Unknown switch " + argv[i] + " ignored."); + public static void main(String[] argv) { + List file_name = new ArrayList(); + List exclude_name = new ArrayList(); + boolean code = false; + boolean constants = false; + boolean verbose = true; + boolean classdep = false; + boolean nocontents = false; + boolean recurse = false; + boolean exclude = false; + String name; + + // Parse command line arguments. + for (String arg : argv) { + if (arg.charAt(0) == '-') { // command line switch + if (arg.equals("-constants")) { + constants = true; + } else if (arg.equals("-code")) { + code = true; + } else if (arg.equals("-brief")) { + verbose = false; + } else if (arg.equals("-dependencies")) { + classdep = true; + } else if (arg.equals("-nocontents")) { + nocontents = true; + } else if (arg.equals("-recurse")) { + recurse = true; + } else if (arg.equals("-exclude")) { + exclude = true; + } else if (arg.equals("-help")) { + System.out.println("Usage: java listclass [-constants] [-code] [-brief] " + + "[-dependencies] [-nocontents] [-recurse] class... " + + "[-exclude ]\n" + + "-constants Print constants table (constant pool)\n" + + "-code Dump byte code of methods\n" + + "-brief Brief listing\n" + + "-dependencies Show class dependencies\n" + + "-nocontents Do not print field/method information\n" + + "-recurse Recurse into dependent classes\n" + + "-exclude Do not list classes beginning with " + + "strings in "); + System.exit(0); + } else { + System.err.println("Unknown switch " + arg + " ignored."); + } + } else { // add file name to list + if (exclude) { + exclude_name.add(arg); + } else { + file_name.add(arg); + } + } } - } else { // add file name to list - if(exclude) { - exclude_name.addElement(argv[i]); + + if (file_name.size() == 0) { + System.err.println("list: No input files specified"); } else { - file_name.addElement(argv[i]); - } - } - } + listclass listClass = new listclass(code, constants, verbose, classdep, + nocontents, recurse, exclude_name); - if(file_name.size() == 0) { - System.err.println("list: No input files specified"); - } else { - listclass listClass = new listclass(code, constants, verbose, classdep, - nocontents, recurse, exclude_name); + for (int i = 0; i < file_name.size(); i++) { + name = file_name.get(i); - for(int i=0; i < file_name.size(); i++) { - name = file_name.elementAt(i); + listClass.list(name); + } + } + } - listClass.list(name); - } + public listclass(boolean code, boolean constants, boolean verbose, boolean classdep, + boolean nocontents, boolean recurse, List exclude_name) { + this.code = code; + this.constants = constants; + this.verbose = verbose; + this.classdep = classdep; + this.nocontents = nocontents; + this.recurse = recurse; + this.listedClasses = new HashMap(); + this.exclude_name = exclude_name; } - } - public listclass(boolean code, boolean constants, boolean verbose, boolean classdep, - boolean nocontents, boolean recurse, Vector exclude_name) - { - this.code = code; - this.constants = constants; - this.verbose = verbose; - this.classdep = classdep; - this.nocontents = nocontents; - this.recurse = recurse; - this.listedClasses = new Hashtable(); - this.exclude_name = exclude_name; - } + /** + * Print the given class on screen + */ + public void list(String name) { + try { + JavaClass java_class; - /** Print the given class on screen - */ - public void list(String name) { - try { - JavaClass java_class; + if ((listedClasses.get(name) != null) || name.startsWith("[")) { + return; + } - if((listedClasses.get(name) != null) || name.startsWith("[")) { - return; - } + for (int idx = 0; idx < exclude_name.size(); idx++) { + if (name.startsWith(exclude_name.get(idx))) { + return; + } + } - for(int idx = 0; idx < exclude_name.size(); idx++) { - if(name.startsWith(exclude_name.elementAt(idx))) { - return; - } - } + if (name.endsWith(".class")) { + java_class = new ClassParser(name).parse(); // May throw IOException + } else { + java_class = Repository.lookupClass(name); + } - if(name.endsWith(".class")) { - java_class = new ClassParser(name).parse(); // May throw IOException - } else { - java_class = Repository.lookupClass(name); - } + if (nocontents) { + System.out.println(java_class.getClassName()); + } else { + System.out.println(java_class); // Dump the contents + } - if(nocontents) { - System.out.println(java_class.getClassName()); - } else { - System.out.println(java_class); // Dump the contents - } + if (constants) { + System.out.println(java_class.getConstantPool()); + } - if(constants) { - System.out.println(java_class.getConstantPool()); - } + if (code) { + printCode(java_class.getMethods(), verbose); + } - if(code) { - printCode(java_class.getMethods(), verbose); - } + if (classdep) { + printClassDependencies(java_class.getConstantPool()); + } - if(classdep) { - printClassDependencies(java_class.getConstantPool()); - } + listedClasses.put(name, name); - listedClasses.put(name, name); + if (recurse) { + String[] dependencies = getClassDependencies(java_class.getConstantPool()); - if(recurse) { - String[] dependencies = getClassDependencies(java_class.getConstantPool()); - - for(int idx = 0; idx < dependencies.length; idx++) { - list(dependencies[idx]); + for (String dependency : dependencies) { + list(dependency); + } + } + } catch (IOException e) { + System.out.println("Error loading class " + name + " (" + e.getMessage() + ")"); + } catch (Exception e) { + System.out.println("Error processing class " + name + " (" + e.getMessage() + ")"); } - } - } catch(IOException e) { - System.out.println("Error loading class " + name + " (" + e.getMessage() + ")"); - } - catch(Exception e) { - System.out.println("Error processing class " + name + " (" + e.getMessage() + ")"); } - } - /** - * Dump the list of classes this class is dependent on - */ - public static void printClassDependencies(ConstantPool pool) { - String[] names = getClassDependencies(pool); - System.out.println("Dependencies:"); - for(int idx = 0; idx < names.length; idx++) { - System.out.println("\t" + names[idx]); + /** + * Dump the list of classes this class is dependent on + */ + public static void printClassDependencies(ConstantPool pool) { + System.out.println("Dependencies:"); + for (String name : getClassDependencies(pool)) { + System.out.println("\t" + name); + } } - } - public static String[] getClassDependencies(ConstantPool pool) { - String[] tempArray = new String[pool.getLength()]; - int size = 0; - StringBuffer buf = new StringBuffer(); + public static String[] getClassDependencies(ConstantPool pool) { + String[] tempArray = new String[pool.getLength()]; + int size = 0; + StringBuilder buf = new StringBuilder(); + + for (int idx = 0; idx < pool.getLength(); idx++) { + Constant c = pool.getConstant(idx); + if (c != null && c.getTag() == Constants.CONSTANT_Class) { + ConstantUtf8 c1 = (ConstantUtf8) pool.getConstant(((ConstantClass) c).getNameIndex()); + buf.setLength(0); + buf.append(c1.getBytes()); + for (int n = 0; n < buf.length(); n++) { + if (buf.charAt(n) == '/') { + buf.setCharAt(n, '.'); + } + } - for(int idx = 0; idx < pool.getLength(); idx++) { - Constant c = pool.getConstant(idx); - if(c != null && c.getTag() == Constants.CONSTANT_Class) { - ConstantUtf8 c1 = (ConstantUtf8) pool.getConstant(((ConstantClass)c).getNameIndex()); - buf.setLength(0); - buf.append(c1.getBytes()); - for(int n = 0; n < buf.length(); n++) { - if(buf.charAt(n) == '/') { - buf.setCharAt(n, '.'); + tempArray[size++] = buf.toString(); + } } - } - tempArray[size++] = buf.toString(); - } + String[] dependencies = new String[size]; + System.arraycopy(tempArray, 0, dependencies, 0, size); + return dependencies; } - String[] dependencies = new String[size]; - System.arraycopy(tempArray, 0, dependencies, 0, size); - return dependencies; - } + /** + * Dump the disassembled code of all methods in the class. + */ + public static void printCode(Method[] methods, boolean verbose) { + for (Method method : methods) { + System.out.println(method); - /** - * Dump the disassembled code of all methods in the class. - */ - public static void printCode(Method[] methods, boolean verbose) { - for(int i=0; i < methods.length; i++) { - System.out.println(methods[i]); - - Code code = methods[i].getCode(); - if(code != null) { - System.out.println(code.toString(verbose)); - } + Code code = method.getCode(); + if (code != null) { + System.out.println(code.toString(verbose)); + } + } } - } } diff --git a/src/examples/maxstack.java b/src/examples/maxstack.java index 97416fa8..ad11bdb3 100644 --- a/src/examples/maxstack.java +++ b/src/examples/maxstack.java @@ -15,6 +15,7 @@ * limitations under the License. * */ + import org.apache.bcel.Repository; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; @@ -26,58 +27,49 @@ import org.apache.bcel.generic.MethodGen; * Read class file(s) and examine all of its methods, determining the * maximum stack depth used by analyzing control flow. * - * @version $Id$ * @author M. Dahm + * @version $Id$ */ public final class maxstack { - public static void main(String[] argv) { - try { - for(int i = 0; i < argv.length; i++) { - String class_name = argv[i]; - JavaClass java_class = Repository.lookupClass(class_name); - if(java_class == null) { - java_class = new ClassParser(class_name).parse(); - } + public static void main(String[] argv) throws Exception { + for (String class_name : argv) { + JavaClass java_class = Repository.lookupClass(class_name); - ConstantPoolGen cp = new ConstantPoolGen(java_class.getConstantPool()); - Method[] methods = java_class.getMethods(); - - for(int j = 0; j < methods.length; j++) { - Method m = methods[j]; + if (java_class == null) { + java_class = new ClassParser(class_name).parse(); + } - if(!(m.isAbstract() || m.isNative())) { - MethodGen mg = new MethodGen(m, argv[i], cp); + ConstantPoolGen cp = new ConstantPoolGen(java_class.getConstantPool()); - int compiled_stack = mg.getMaxStack(); - int compiled_locals = mg.getMaxLocals(); - mg.setMaxStack(); // Recompute value - mg.setMaxLocals(); - int computed_stack = mg.getMaxStack(); - int computed_locals = mg.getMaxLocals(); + for (Method m : java_class.getMethods()) { + if (!(m.isAbstract() || m.isNative())) { + MethodGen mg = new MethodGen(m, class_name, cp); - mg.getInstructionList().dispose(); // Reuse instruction handles - - System.out.println(m); - - if(computed_stack == compiled_stack) { - System.out.println("Stack ok(" + computed_stack + ")"); - } else { - System.out.println("\nCompiled stack size " + compiled_stack + - " computed size " + computed_stack); - } - - if(computed_locals == compiled_locals) { - System.out.println("Locals ok(" + computed_locals + ")"); - } else { - System.out.println("\nCompiled locals " + compiled_locals + - " computed size " + computed_locals); + int compiled_stack = mg.getMaxStack(); + int compiled_locals = mg.getMaxLocals(); + mg.setMaxStack(); // Recompute value + mg.setMaxLocals(); + int computed_stack = mg.getMaxStack(); + int computed_locals = mg.getMaxLocals(); + + mg.getInstructionList().dispose(); // Reuse instruction handles + + System.out.println(m); + + if (computed_stack == compiled_stack) { + System.out.println("Stack ok(" + computed_stack + ")"); + } else { + System.out.println("\nCompiled stack size " + compiled_stack + " computed size " + computed_stack); + } + + if (computed_locals == compiled_locals) { + System.out.println("Locals ok(" + computed_locals + ")"); + } else { + System.out.println("\nCompiled locals " + compiled_locals + " computed size " + computed_locals); + } + } + } } - } - } - } - } catch(Exception e) { - e.printStackTrace(); } - } } diff --git a/src/examples/patchclass.java b/src/examples/patchclass.java index 72ffaac5..65aed550 100644 --- a/src/examples/patchclass.java +++ b/src/examples/patchclass.java @@ -15,6 +15,7 @@ * limitations under the License. * */ + import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.Constant; import org.apache.bcel.classfile.ConstantUtf8; @@ -26,84 +27,76 @@ import org.apache.bcel.classfile.JavaClass; * * Usage: patch files * - * @version $Id$ * @author M. Dahm + * @version $Id$ */ public class patchclass { - public static void main(String[] argv) { - String[] file_name = new String[argv.length]; - int files = 0; - ClassParser parser = null; - JavaClass java_class; - if(argv.length < 3) { - System.err.println("Usage: patch file1.class ..."); - System.exit(-1); - } + public static void main(String[] argv) throws Exception { + String[] file_name = new String[argv.length]; + int files = 0; - try { - for(int i=2; i < argv.length; i++) { - file_name[files++] = argv[i]; - } - - for(int i=0; i < files; i++) { - parser = new ClassParser(file_name[i]); - java_class = parser.parse(); - - patchIt(argv[0], argv[1], - java_class.getConstantPool().getConstantPool()); + if (argv.length < 3) { + System.err.println("Usage: patch file1.class ..."); + System.exit(-1); + } + + for (int i = 2; i < argv.length; i++) { + file_name[files++] = argv[i]; + } + + for (int i = 0; i < files; i++) { + ClassParser parser = new ClassParser(file_name[i]); + JavaClass java_class = parser.parse(); - // Dump the changed class to a new file - java_class.dump("_" + file_name[i]); - System.out.println("Results saved in: _" + file_name[i]); - } - } catch(Exception e) { - System.err.println(e); + patchIt(argv[0], argv[1], java_class.getConstantPool().getConstantPool()); + + // Dump the changed class to a new file + java_class.dump("_" + file_name[i]); + System.out.println("Results saved in: _" + file_name[i]); + } } - } - /* - * Replace all occurences of string "old" with - * "replacement" in all Utf8 constants - */ - private static void patchIt(String old, String replacement, - Constant[] constant_pool) - { - ConstantUtf8 c; - String str; - int index, old_index; - StringBuffer buf; - /* Loop through constant pool + /* + * Replace all occurences of string "old" with + * "replacement" in all Utf8 constants */ - for(short i=0; i < constant_pool.length; i++) { - if(constant_pool[i] instanceof ConstantUtf8) { // Utf8 string found - try { - c = (ConstantUtf8)constant_pool[i]; // Get the string - str = c.getBytes(); - - if((index = str.indexOf(old)) != -1) { // `old' found in str - buf = new StringBuffer(); // target buffer - old_index = 0; // String start offset - - // While we have something to replace - while((index = str.indexOf(old, old_index)) != -1) { - buf.append(str.substring(old_index, index)); // append prefix - buf.append(replacement); // append `replacement' - - old_index = index + old.length(); // Skip `old'.length chars - } + private static void patchIt(String old, String replacement, Constant[] constant_pool) { + ConstantUtf8 c; + String str; + int index, old_index; + StringBuffer buf; + + // Loop through constant pool + for (short i = 0; i < constant_pool.length; i++) { + if (constant_pool[i] instanceof ConstantUtf8) { // Utf8 string found + try { + c = (ConstantUtf8) constant_pool[i]; // Get the string + str = c.getBytes(); - buf.append(str.substring(old_index)); // append rest of string - str = buf.toString(); + if ((index = str.indexOf(old)) != -1) { // `old' found in str + buf = new StringBuffer(); // target buffer + old_index = 0; // String start offset - // Finally push the new string back to the constant pool - c = new ConstantUtf8(str); - constant_pool[i] = c; - } - } catch(StringIndexOutOfBoundsException e) { // Should not occur - System.err.println(e); + // While we have something to replace + while ((index = str.indexOf(old, old_index)) != -1) { + buf.append(str.substring(old_index, index)); // append prefix + buf.append(replacement); // append `replacement' + + old_index = index + old.length(); // Skip `old'.length chars + } + + buf.append(str.substring(old_index)); // append rest of string + str = buf.toString(); + + // Finally push the new string back to the constant pool + c = new ConstantUtf8(str); + constant_pool[i] = c; + } + } catch (StringIndexOutOfBoundsException e) { // Should not occur + System.err.println(e); + } + } + } } - } - } - } } -- GitLab From c070c23750e4720fe44b92237b2b55559619e8ac Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 20 Feb 2015 14:52:39 +0000 Subject: [PATCH 0736/1313] MethodGen.removeLocalVariable/s now remove the associated targetters. Thanks to Mark Roberts (BCEL-207) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1661134 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 1 + src/changes/changes.xml | 4 + .../apache/bcel/generic/LocalVariableGen.java | 7 ++ .../org/apache/bcel/generic/MethodGen.java | 4 + .../bcel/generic/MethodGenTestCase.java | 89 +++++++++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 src/test/java/org/apache/bcel/generic/MethodGenTestCase.java diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 4180c370..948ab8d0 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -98,6 +98,7 @@ Bug fixes from 5.2 [BCEL-181] ClassLoaderRepository.loadClass(String) leaks input streams [BCEL-194] LocalVariableGen hashCode() function is incorrrect [BCEL-197] Add support for TypeVariables to Utility.signatureToString() +[BCEL-207] MethodGen.removeLocalVariable(s) doesn't remove the associated Targetters Feedback diff --git a/src/changes/changes.xml b/src/changes/changes.xml index efc96ce4..59efe640 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,10 @@ The type attribute can be add,update,fix,remove. + + MethodGen.removeLocalVariable now properly unreference the removed variable + from the targetters of the instruction handlers delimiting the scope of the variable. + Utility.signatureToString() no longer throws a ClassFormatException on TypeVariables found in generic signatures. diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java index 67194b21..fc81d462 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java @@ -163,6 +163,13 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo } } + /** + * Clear the references from and to this variable when it's removed. + */ + void dispose() { + setStart(null); + setEnd(null); + } /** * @return true, if ih is target of this variable diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 9c16da67..eb87546e 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -335,6 +335,7 @@ public class MethodGen extends FieldGenOrMethodGen { * with an explicit index argument. */ public void removeLocalVariable( LocalVariableGen l ) { + l.dispose(); variable_vec.remove(l); } @@ -343,6 +344,9 @@ public class MethodGen extends FieldGenOrMethodGen { * Remove all local variables. */ public void removeLocalVariables() { + for (LocalVariableGen lv : variable_vec) { + lv.dispose(); + } variable_vec.clear(); } diff --git a/src/test/java/org/apache/bcel/generic/MethodGenTestCase.java b/src/test/java/org/apache/bcel/generic/MethodGenTestCase.java new file mode 100644 index 00000000..3e641315 --- /dev/null +++ b/src/test/java/org/apache/bcel/generic/MethodGenTestCase.java @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.bcel.generic; + +import java.util.Arrays; + +import junit.framework.TestCase; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; + +public class MethodGenTestCase extends TestCase { + + public static class Foo { + public void bar() { + int a = 1; + } + } + + private MethodGen getMethod(Class cls, String name) throws ClassNotFoundException { + JavaClass jc = Repository.lookupClass(cls); + ConstantPoolGen cp = new ConstantPoolGen(jc.getConstantPool()); + for (Method method : jc.getMethods()) { + if (method.getName().equals(name)) { + return new MethodGen(method, jc.getClassName(), cp); + } + } + + fail("Method " + name + " not found in class " + cls); + return null; + } + + public void testRemoveLocalVariable() throws Exception { + MethodGen mg = getMethod(Foo.class, "bar"); + + LocalVariableGen lv = mg.getLocalVariables()[1]; + assertEquals("variable name", "a", lv.getName()); + InstructionHandle start = lv.getStart(); + InstructionHandle end = lv.getEnd(); + assertNotNull("scope start", start); + assertNotNull("scope end", end); + assertTrue("scope start not targeted by the local variable", Arrays.asList(start.getTargeters()).contains(lv)); + assertTrue("scope end not targeted by the local variable", Arrays.asList(end.getTargeters()).contains(lv)); + + // now let's remove the local variable + mg.removeLocalVariable(lv); + + assertFalse("scope start still targeted by the removed variable", Arrays.asList(start.getTargeters()).contains(lv)); + assertFalse("scope end still targeted by the removed variable", Arrays.asList(end.getTargeters()).contains(lv)); + assertNull("scope start", lv.getStart()); + assertNull("scope end", lv.getEnd()); + } + + public void testRemoveLocalVariables() throws Exception { + MethodGen mg = getMethod(Foo.class, "bar"); + + LocalVariableGen lv = mg.getLocalVariables()[1]; + assertEquals("variable name", "a", lv.getName()); + InstructionHandle start = lv.getStart(); + InstructionHandle end = lv.getEnd(); + assertNotNull("scope start", start); + assertNotNull("scope end", end); + assertTrue("scope start not targeted by the local variable", Arrays.asList(start.getTargeters()).contains(lv)); + assertTrue("scope end not targeted by the local variable", Arrays.asList(end.getTargeters()).contains(lv)); + + // now let's remove the local variables + mg.removeLocalVariables(); + + assertFalse("scope start still targeted by the removed variable", Arrays.asList(start.getTargeters()).contains(lv)); + assertFalse("scope end still targeted by the removed variable", Arrays.asList(end.getTargeters()).contains(lv)); + assertNull("scope start", lv.getStart()); + assertNull("scope end", lv.getEnd()); + } +} -- GitLab From 91af4178c1ff8b70b7de794ae28d539821f01d03 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 20 Feb 2015 23:17:15 +0000 Subject: [PATCH 0737/1313] Javadoc improvement for InstructionTargeter, thanks to Thiago Bartolomei (BCEL-161) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1661240 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/generic/InstructionTargeter.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/InstructionTargeter.java b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java index 9e3625df..5cc56bdf 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionTargeter.java +++ b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java @@ -15,6 +15,7 @@ * limitations under the License. * */ + package org.apache.bcel.generic; /** @@ -29,8 +30,17 @@ package org.apache.bcel.generic; */ public interface InstructionTargeter { - boolean containsTarget( InstructionHandle ih ); - + /** + * Checks whether this targeter targets the specified instruction handle. + */ + boolean containsTarget(InstructionHandle ih); - void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ); + /** + * Replaces the target of this targeter from this old handle to the new handle. + * + * @param old_ih the old handle + * @param new_ih the new handle + * @throws ClassGenException if old_ih is not targeted by this object + */ + void updateTarget(InstructionHandle old_ih, InstructionHandle new_ih) throws ClassGenException; } -- GitLab From 9d963354f628534ff3c0173c4404234297a9c30c Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Sat, 21 Feb 2015 22:45:02 +0000 Subject: [PATCH 0738/1313] Removed unnecessary casts in InstructionFactory git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1661447 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/generic/InstructionFactory.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index 5327a9b0..19a3f01e 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -304,9 +304,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali case '<': return ISHL; case '>': - return op.equals(">>>") - ? (ArithmeticInstruction) IUSHR - : (ArithmeticInstruction) ISHR; + return op.equals(">>>") ? IUSHR : ISHR; default: throw new RuntimeException("Invalid operand " + op); } @@ -334,9 +332,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali case '<': return LSHL; case '>': - return op.equals(">>>") - ? (ArithmeticInstruction) LUSHR - : (ArithmeticInstruction) LSHR; + return op.equals(">>>") ? LUSHR : LSHR; default: throw new RuntimeException("Invalid operand " + op); } @@ -408,7 +404,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali * @param size size of operand, either 1 (int, e.g.) or 2 (double) */ public static StackInstruction createPop( int size ) { - return (size == 2) ? (StackInstruction) POP2 : (StackInstruction) POP; + return (size == 2) ? POP2 : POP; } @@ -416,7 +412,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali * @param size size of operand, either 1 (int, e.g.) or 2 (double) */ public static StackInstruction createDup( int size ) { - return (size == 2) ? (StackInstruction) DUP2 : (StackInstruction) DUP; + return (size == 2) ? DUP2 : DUP; } @@ -424,7 +420,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali * @param size size of operand, either 1 (int, e.g.) or 2 (double) */ public static StackInstruction createDup_2( int size ) { - return (size == 2) ? (StackInstruction) DUP2_X2 : (StackInstruction) DUP_X2; + return (size == 2) ? DUP2_X2 : DUP_X2; } @@ -432,7 +428,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali * @param size size of operand, either 1 (int, e.g.) or 2 (double) */ public static StackInstruction createDup_1( int size ) { - return (size == 2) ? (StackInstruction) DUP2_X1 : (StackInstruction) DUP_X1; + return (size == 2) ? DUP2_X1 : DUP_X1; } @@ -636,7 +632,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali } else if (t instanceof ArrayType) { return new ANEWARRAY(cp.addArrayClass((ArrayType) t)); } else { - return new NEWARRAY(((BasicType) t).getType()); + return new NEWARRAY(t.getType()); } } else { ArrayType at; -- GitLab From 45cc006b3dfbf49b1974dfea29947431d724e16a Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Mon, 23 Feb 2015 17:24:07 +0000 Subject: [PATCH 0739/1313] Documented the compatibility issue when using an AttributeReader git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1661719 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 948ab8d0..8c2f51c5 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -16,13 +16,16 @@ Compatibility with 5.2 Binary compatible - Yes -Source compatible - Yes, except for org.apache.bcel.classfile.Visitor (see below) - -Semantic compatible - Yes - -The org.apache.bcel.classfile.Visitor interface has been enhanced with -additional methods. If you implemented it directly instead of extending -the EmptyVisitor class you'll have to implement the new methods. +Source compatible - Yes, except: + - The org.apache.bcel.classfile.Visitor interface has been enhanced with + additional methods. If you implemented it directly instead of extending + the EmptyVisitor class you'll have to implement the new methods. + +Semantic compatible - Yes, except: + - BCEL handles new attributes such as code annotations that could only + be processed by implementing a custom AttributeReader in the previous + versions. Code relying on this behavior will have to be adjusted since + the AttributeReader will no longer be called in these cases. Enhancements from 5.2 -- GitLab From 329f21680cc1c4e5c662813be3956bd6e8c0d38d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 24 Feb 2015 17:25:43 +0000 Subject: [PATCH 0740/1313] CGI must be svn:executable * git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1662035 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/resources/download_bcel.cgi | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 src/site/resources/download_bcel.cgi diff --git a/src/site/resources/download_bcel.cgi b/src/site/resources/download_bcel.cgi old mode 100644 new mode 100755 -- GitLab From 3513fe3566dd9ae7792f21581f6f94eb5c02adcb Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Wed, 25 Feb 2015 09:24:47 +0000 Subject: [PATCH 0741/1313] Move the getAnnotationAttributes and getParameterAnnotationAttributes method from Utility to AnnotationEntryGen and hide them from the public API git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1662190 13f79535-47bb-0310-9956-ffa450edef68 --- .../RuntimeInvisibleAnnotations.java | 2 +- .../RuntimeInvisibleParameterAnnotations.java | 2 +- .../classfile/RuntimeVisibleAnnotations.java | 2 +- .../RuntimeVisibleParameterAnnotations.java | 2 +- .../org/apache/bcel/classfile/Utility.java | 174 +----------- .../bcel/generic/AnnotationEntryGen.java | 250 ++++++++++++++---- .../org/apache/bcel/generic/ClassGen.java | 2 +- .../org/apache/bcel/generic/FieldGen.java | 2 +- .../org/apache/bcel/generic/MethodGen.java | 4 +- .../{ => generic}/AnnotationGenTestCase.java | 18 +- 10 files changed, 214 insertions(+), 244 deletions(-) rename src/test/java/org/apache/bcel/{ => generic}/AnnotationGenTestCase.java (92%) diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 5c2362b2..89dc8382 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -44,7 +44,7 @@ public class RuntimeInvisibleAnnotations extends Annotations * @param constant_pool * Array of constants */ - RuntimeInvisibleAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) + public RuntimeInvisibleAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { super(Constants.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS, name_index, length, input, constant_pool, false); diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 2f77efa8..9e7fbe47 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -39,7 +39,7 @@ public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { * @param input Input stream * @param constant_pool Array of constants */ - RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) + public RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { super(Constants.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, input, constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 0f3be902..2951df87 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -44,7 +44,7 @@ public class RuntimeVisibleAnnotations extends Annotations * @param constant_pool * Array of constants */ - RuntimeVisibleAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException + public RuntimeVisibleAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { super(Constants.ATTR_RUNTIME_VISIBLE_ANNOTATIONS, name_index, length, input, constant_pool, true); } diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index eaf5e6cb..ae54cd19 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -39,7 +39,7 @@ public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { * @param input Input stream * @param constant_pool Array of constants */ - RuntimeVisibleParameterAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) + public RuntimeVisibleParameterAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { super(Constants.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, name_index, length, input, constant_pool); } diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index e7499107..72f88338 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -13,16 +13,14 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * */ + package org.apache.bcel.classfile; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.CharArrayReader; import java.io.CharArrayWriter; -import java.io.DataInputStream; -import java.io.DataOutputStream; import java.io.FilterReader; import java.io.FilterWriter; import java.io.IOException; @@ -37,8 +35,6 @@ import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; import org.apache.bcel.Constants; -import org.apache.bcel.generic.AnnotationEntryGen; -import org.apache.bcel.generic.ConstantPoolGen; import org.apache.bcel.util.ByteSequence; /** @@ -1455,172 +1451,4 @@ public abstract class Utility { return buf.toString(); } - - /** - * Converts a list of AnnotationGen objects into a set of attributes - * that can be attached to the class file. - * - * @param cp The constant pool gen where we can create the necessary name refs - * @param vec A list of AnnotationGen objects - */ - public static Attribute[] getAnnotationAttributes(ConstantPoolGen cp,List vec) { - - if (vec.isEmpty()) { - return new Attribute[0]; - } - - try { - int countVisible = 0; - int countInvisible = 0; - - // put the annotations in the right output stream - for (AnnotationEntryGen a : vec) { - if (a.isRuntimeVisible()) { - countVisible++; - } else { - countInvisible++; - } - } - - ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); - ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); - DataOutputStream rvaDos = new DataOutputStream(rvaBytes); - DataOutputStream riaDos = new DataOutputStream(riaBytes); - - rvaDos.writeShort(countVisible); - riaDos.writeShort(countInvisible); - - // put the annotations in the right output stream - for (AnnotationEntryGen a : vec) { - if (a.isRuntimeVisible()) { - a.dump(rvaDos); - } else { - a.dump(riaDos); - } - } - - rvaDos.close(); - riaDos.close(); - - byte[] rvaData = rvaBytes.toByteArray(); - byte[] riaData = riaBytes.toByteArray(); - - int rvaIndex = -1; - int riaIndex = -1; - - if (rvaData.length>2) { - rvaIndex = cp.addUtf8("RuntimeVisibleAnnotations"); - } - if (riaData.length>2) { - riaIndex = cp.addUtf8("RuntimeInvisibleAnnotations"); - } - - List newAttributes = new ArrayList(); - if (rvaData.length>2) { - - newAttributes.add( - new RuntimeVisibleAnnotations(rvaIndex,rvaData.length,new DataInputStream(new ByteArrayInputStream(rvaData)),cp.getConstantPool())); - } - if (riaData.length>2) { - newAttributes.add( - new RuntimeInvisibleAnnotations(riaIndex,riaData.length,new DataInputStream(new ByteArrayInputStream(riaData)),cp.getConstantPool())); - } - - return newAttributes.toArray(new Attribute[newAttributes.size()]); - } catch (IOException e) { - System.err.println("IOException whilst processing annotations"); - e.printStackTrace(); - } - return null; - } - - - /** - * Annotations against a class are stored in one of four attribute kinds: - * - RuntimeVisibleParameterAnnotations - * - RuntimeInvisibleParameterAnnotations - */ - public static Attribute[] getParameterAnnotationAttributes( - ConstantPoolGen cp, - List[] /*Array of lists, array size depends on #params */vec) - { - int visCount[] = new int[vec.length]; - int totalVisCount = 0; - int invisCount[] = new int[vec.length]; - int totalInvisCount = 0; - try { - for (int i = 0; i < vec.length; i++) { - if (vec[i] != null) { - for (AnnotationEntryGen element : vec[i]) { - if (element.isRuntimeVisible()) { - visCount[i]++; - totalVisCount++; - } - else { - invisCount[i]++; - totalInvisCount++; - } - } - } - } - // Lets do the visible ones - ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); - DataOutputStream rvaDos = new DataOutputStream(rvaBytes); - rvaDos.writeByte(vec.length); // First goes number of parameters - for (int i = 0; i < vec.length; i++) { - rvaDos.writeShort(visCount[i]); - if (visCount[i] > 0) { - for (AnnotationEntryGen element : vec[i]) { - if (element.isRuntimeVisible()) { - element.dump(rvaDos); - } - } - } - } - rvaDos.close(); - // Lets do the invisible ones - ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); - DataOutputStream riaDos = new DataOutputStream(riaBytes); - riaDos.writeByte(vec.length); // First goes number of parameters - for (int i = 0; i < vec.length; i++) { - riaDos.writeShort(invisCount[i]); - if (invisCount[i] > 0) { - for (AnnotationEntryGen element : vec[i]) { - if (!element.isRuntimeVisible()) { - element.dump(riaDos); - } - } - } - } - riaDos.close(); - byte[] rvaData = rvaBytes.toByteArray(); - byte[] riaData = riaBytes.toByteArray(); - int rvaIndex = -1; - int riaIndex = -1; - if (totalVisCount > 0) { - rvaIndex = cp.addUtf8("RuntimeVisibleParameterAnnotations"); - } - if (totalInvisCount > 0) { - riaIndex = cp.addUtf8("RuntimeInvisibleParameterAnnotations"); - } - List newAttributes = new ArrayList(); - if (totalVisCount > 0) { - newAttributes - .add(new RuntimeVisibleParameterAnnotations(rvaIndex, - rvaData.length, new DataInputStream(new ByteArrayInputStream(rvaData)), cp.getConstantPool())); - } - if (totalInvisCount > 0) { - newAttributes - .add(new RuntimeInvisibleParameterAnnotations(riaIndex, - riaData.length, new DataInputStream(new ByteArrayInputStream(riaData)), cp.getConstantPool())); - } - return newAttributes.toArray(new Attribute[newAttributes.size()]); - } - catch (IOException e) { - System.err - .println("IOException whilst processing parameter annotations"); - e.printStackTrace(); - } - return null; - } } diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index e927bb55..96fb40fb 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -17,21 +17,28 @@ */ package org.apache.bcel.generic; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.DataInput; +import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.ConstantUtf8; import org.apache.bcel.classfile.ElementValuePair; +import org.apache.bcel.classfile.RuntimeInvisibleAnnotations; +import org.apache.bcel.classfile.RuntimeInvisibleParameterAnnotations; +import org.apache.bcel.classfile.RuntimeVisibleAnnotations; +import org.apache.bcel.classfile.RuntimeVisibleParameterAnnotations; /** * @since 6.0 */ -public class AnnotationEntryGen -{ +public class AnnotationEntryGen { private int typeIndex; private List evs; @@ -49,15 +56,11 @@ public class AnnotationEntryGen * and the visibility. */ public AnnotationEntryGen(AnnotationEntry a, ConstantPoolGen cpool, - boolean copyPoolEntries) - { + boolean copyPoolEntries) { this.cpool = cpool; - if (copyPoolEntries) - { + if (copyPoolEntries) { typeIndex = cpool.addUtf8(a.getAnnotationType()); - } - else - { + } else { typeIndex = a.getAnnotationTypeIndex(); } isRuntimeVisible = a.isRuntimeVisible(); @@ -65,26 +68,22 @@ public class AnnotationEntryGen } private List copyValues(ElementValuePair[] in, ConstantPoolGen cpool, - boolean copyPoolEntries) - { + boolean copyPoolEntries) { List out = new ArrayList(); - for (ElementValuePair nvp : in) - { + for (ElementValuePair nvp : in) { out.add(new ElementValuePairGen(nvp, cpool, copyPoolEntries)); } return out; } - private AnnotationEntryGen(ConstantPoolGen cpool) - { + private AnnotationEntryGen(ConstantPoolGen cpool) { this.cpool = cpool; } /** * Retrieve an immutable version of this AnnotationGen */ - public AnnotationEntry getAnnotation() - { + public AnnotationEntry getAnnotation() { AnnotationEntry a = new AnnotationEntry(typeIndex, cpool.getConstantPool(), isRuntimeVisible); for (ElementValuePairGen element : evs) { @@ -94,9 +93,8 @@ public class AnnotationEntryGen } public AnnotationEntryGen(ObjectType type, - List elements, boolean vis, - ConstantPoolGen cpool) - { + List elements, boolean vis, + ConstantPoolGen cpool) { this.cpool = cpool; this.typeIndex = cpool.addUtf8(type.getSignature()); evs = elements; @@ -104,13 +102,11 @@ public class AnnotationEntryGen } public static AnnotationEntryGen read(DataInput dis, - ConstantPoolGen cpool, boolean b) throws IOException - { + ConstantPoolGen cpool, boolean b) throws IOException { AnnotationEntryGen a = new AnnotationEntryGen(cpool); a.typeIndex = dis.readUnsignedShort(); int elemValuePairCount = dis.readUnsignedShort(); - for (int i = 0; i < elemValuePairCount; i++) - { + for (int i = 0; i < elemValuePairCount; i++) { int nidx = dis.readUnsignedShort(); a.addElementNameValuePair(new ElementValuePairGen(nidx, ElementValueGen.readElementValue(dis, cpool), cpool)); @@ -119,58 +115,49 @@ public class AnnotationEntryGen return a; } - public void dump(DataOutputStream dos) throws IOException - { + public void dump(DataOutputStream dos) throws IOException { dos.writeShort(typeIndex); // u2 index of type name in cpool dos.writeShort(evs.size()); // u2 element_value pair count - for (ElementValuePairGen envp : evs) - { + for (ElementValuePairGen envp : evs) { envp.dump(dos); } } - public void addElementNameValuePair(ElementValuePairGen evp) - { + public void addElementNameValuePair(ElementValuePairGen evp) { if (evs == null) { evs = new ArrayList(); } evs.add(evp); } - public int getTypeIndex() - { + public int getTypeIndex() { return typeIndex; } - public final String getTypeSignature() - { + public final String getTypeSignature() { // ConstantClass c = (ConstantClass)cpool.getConstant(typeIndex); ConstantUtf8 utf8 = (ConstantUtf8) cpool .getConstant(typeIndex/* c.getNameIndex() */); return utf8.getBytes(); } - public final String getTypeName() - { + public final String getTypeName() { return getTypeSignature();// BCELBUG: Should I use this instead? - // Utility.signatureToString(getTypeSignature()); + // Utility.signatureToString(getTypeSignature()); } /** * Returns list of ElementNameValuePair objects */ - public List getValues() - { + public List getValues() { return evs; } @Override - public String toString() - { + public String toString() { StringBuilder s = new StringBuilder(32); s.append("AnnotationGen:[" + getTypeName() + " #" + evs.size() + " {"); - for (int i = 0; i < evs.size(); i++) - { + for (int i = 0; i < evs.size(); i++) { s.append(evs.get(i)); if (i + 1 < evs.size()) { s.append(","); @@ -180,12 +167,10 @@ public class AnnotationEntryGen return s.toString(); } - public String toShortString() - { + public String toShortString() { StringBuilder s = new StringBuilder(); s.append("@" + getTypeName() + "("); - for (int i = 0; i < evs.size(); i++) - { + for (int i = 0; i < evs.size(); i++) { s.append(evs.get(i)); if (i + 1 < evs.size()) { s.append(","); @@ -195,13 +180,176 @@ public class AnnotationEntryGen return s.toString(); } - private void isRuntimeVisible(boolean b) - { + private void isRuntimeVisible(boolean b) { isRuntimeVisible = b; } - public boolean isRuntimeVisible() - { + public boolean isRuntimeVisible() { return isRuntimeVisible; } + + + /** + * Converts a list of AnnotationGen objects into a set of attributes + * that can be attached to the class file. + * + * @param cp The constant pool gen where we can create the necessary name refs + * @param vec A list of AnnotationGen objects + */ + static Attribute[] getAnnotationAttributes(ConstantPoolGen cp, List vec) { + if (vec.isEmpty()) { + return new Attribute[0]; + } + + try { + int countVisible = 0; + int countInvisible = 0; + + // put the annotations in the right output stream + for (AnnotationEntryGen a : vec) { + if (a.isRuntimeVisible()) { + countVisible++; + } else { + countInvisible++; + } + } + + ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); + ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); + DataOutputStream rvaDos = new DataOutputStream(rvaBytes); + DataOutputStream riaDos = new DataOutputStream(riaBytes); + + rvaDos.writeShort(countVisible); + riaDos.writeShort(countInvisible); + + // put the annotations in the right output stream + for (AnnotationEntryGen a : vec) { + if (a.isRuntimeVisible()) { + a.dump(rvaDos); + } else { + a.dump(riaDos); + } + } + + rvaDos.close(); + riaDos.close(); + + byte[] rvaData = rvaBytes.toByteArray(); + byte[] riaData = riaBytes.toByteArray(); + + int rvaIndex = -1; + int riaIndex = -1; + + if (rvaData.length > 2) { + rvaIndex = cp.addUtf8("RuntimeVisibleAnnotations"); + } + if (riaData.length > 2) { + riaIndex = cp.addUtf8("RuntimeInvisibleAnnotations"); + } + + List newAttributes = new ArrayList(); + if (rvaData.length > 2) { + newAttributes.add( + new RuntimeVisibleAnnotations(rvaIndex, rvaData.length, new DataInputStream(new ByteArrayInputStream(rvaData)), cp.getConstantPool())); + } + if (riaData.length > 2) { + newAttributes.add( + new RuntimeInvisibleAnnotations(riaIndex, riaData.length, new DataInputStream(new ByteArrayInputStream(riaData)), cp.getConstantPool())); + } + + return newAttributes.toArray(new Attribute[newAttributes.size()]); + } catch (IOException e) { + System.err.println("IOException whilst processing annotations"); + e.printStackTrace(); + } + return null; + } + + + /** + * Annotations against a class are stored in one of four attribute kinds: + * - RuntimeVisibleParameterAnnotations + * - RuntimeInvisibleParameterAnnotations + */ + static Attribute[] getParameterAnnotationAttributes( + ConstantPoolGen cp, + List[] /*Array of lists, array size depends on #params */vec) { + int visCount[] = new int[vec.length]; + int totalVisCount = 0; + int invisCount[] = new int[vec.length]; + int totalInvisCount = 0; + try { + for (int i = 0; i < vec.length; i++) { + if (vec[i] != null) { + for (AnnotationEntryGen element : vec[i]) { + if (element.isRuntimeVisible()) { + visCount[i]++; + totalVisCount++; + } else { + invisCount[i]++; + totalInvisCount++; + } + } + } + } + // Lets do the visible ones + ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); + DataOutputStream rvaDos = new DataOutputStream(rvaBytes); + rvaDos.writeByte(vec.length); // First goes number of parameters + for (int i = 0; i < vec.length; i++) { + rvaDos.writeShort(visCount[i]); + if (visCount[i] > 0) { + for (AnnotationEntryGen element : vec[i]) { + if (element.isRuntimeVisible()) { + element.dump(rvaDos); + } + } + } + } + rvaDos.close(); + // Lets do the invisible ones + ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); + DataOutputStream riaDos = new DataOutputStream(riaBytes); + riaDos.writeByte(vec.length); // First goes number of parameters + for (int i = 0; i < vec.length; i++) { + riaDos.writeShort(invisCount[i]); + if (invisCount[i] > 0) { + for (AnnotationEntryGen element : vec[i]) { + if (!element.isRuntimeVisible()) { + element.dump(riaDos); + } + } + } + } + riaDos.close(); + byte[] rvaData = rvaBytes.toByteArray(); + byte[] riaData = riaBytes.toByteArray(); + int rvaIndex = -1; + int riaIndex = -1; + if (totalVisCount > 0) { + rvaIndex = cp.addUtf8("RuntimeVisibleParameterAnnotations"); + } + if (totalInvisCount > 0) { + riaIndex = cp.addUtf8("RuntimeInvisibleParameterAnnotations"); + } + List newAttributes = new ArrayList(); + if (totalVisCount > 0) { + newAttributes + .add(new RuntimeVisibleParameterAnnotations(rvaIndex, + rvaData.length, new DataInputStream(new ByteArrayInputStream(rvaData)), cp.getConstantPool())); + } + if (totalInvisCount > 0) { + newAttributes + .add(new RuntimeInvisibleParameterAnnotations(riaIndex, + riaData.length, new DataInputStream(new ByteArrayInputStream(riaData)), cp.getConstantPool())); + } + return newAttributes.toArray(new Attribute[newAttributes.size()]); + } catch (IOException e) { + System.err + .println("IOException whilst processing parameter annotations"); + e.printStackTrace(); + } + return null; + } + } diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index bffc726e..8b939eb2 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -204,7 +204,7 @@ public class ClassGen extends AccessFlags implements Cloneable { attributes = getAttributes(); } else { // TODO: Sometime later, trash any attributes called 'RuntimeVisibleAnnotations' or 'RuntimeInvisibleAnnotations' - Attribute[] annAttributes = Utility.getAnnotationAttributes(cp,annotation_vec); + Attribute[] annAttributes = AnnotationEntryGen.getAnnotationAttributes(cp,annotation_vec); attributes = new Attribute[attribute_vec.size()+annAttributes.length]; attribute_vec.toArray(attributes); System.arraycopy(annAttributes,0,attributes,attribute_vec.size(),annAttributes.length); diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index 17e9e00e..d4fcc86a 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -226,7 +226,7 @@ public class FieldGen extends FieldGenOrMethodGen { } private void addAnnotationsAsAttribute(ConstantPoolGen cp) { - Attribute[] attrs = Utility.getAnnotationAttributes(cp,annotation_vec); + Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp,annotation_vec); for (Attribute attr : attrs) { addAttribute(attr); } diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index eb87546e..edffcc54 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -609,7 +609,7 @@ public class MethodGen extends FieldGenOrMethodGen { } public void addAnnotationsAsAttribute(ConstantPoolGen cp) { - Attribute[] attrs = Utility.getAnnotationAttributes(cp,annotation_vec); + Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp,annotation_vec); for (Attribute attr : attrs) { addAttribute(attr); } @@ -619,7 +619,7 @@ public class MethodGen extends FieldGenOrMethodGen { if (!hasParameterAnnotations) { return; } - Attribute[] attrs = Utility.getParameterAnnotationAttributes(cp,param_annotations); + Attribute[] attrs = AnnotationEntryGen.getParameterAnnotationAttributes(cp,param_annotations); if (attrs!=null) { for (Attribute attr : attrs) { addAttribute(attr); diff --git a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java b/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java similarity index 92% rename from src/test/java/org/apache/bcel/AnnotationGenTestCase.java rename to src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java index d17161d5..6142173e 100644 --- a/src/test/java/org/apache/bcel/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java @@ -13,10 +13,9 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * */ -package org.apache.bcel; +package org.apache.bcel.generic; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -26,18 +25,13 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Vector; + +import org.apache.bcel.AbstractTestCase; +import org.apache.bcel.Constants; import org.apache.bcel.classfile.Annotations; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.RuntimeInvisibleAnnotations; import org.apache.bcel.classfile.RuntimeVisibleAnnotations; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.generic.AnnotationEntryGen; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.ElementValueGen; -import org.apache.bcel.generic.ElementValuePairGen; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.SimpleElementValueGen; public class AnnotationGenTestCase extends AbstractTestCase { @@ -98,7 +92,7 @@ public class AnnotationGenTestCase extends AbstractTestCase AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); Vector v = new Vector(); v.add(a); - Attribute[] attributes = Utility.getAnnotationAttributes(cp, v); + Attribute[] attributes = AnnotationEntryGen.getAnnotationAttributes(cp, v); boolean foundRV = false; for (Attribute attribute : attributes) { if (attribute instanceof RuntimeVisibleAnnotations) @@ -113,7 +107,7 @@ public class AnnotationGenTestCase extends AbstractTestCase AnnotationEntryGen a2 = new AnnotationEntryGen(t, elements, false, cp); Vector v2 = new Vector(); v2.add(a2); - Attribute[] attributes2 = Utility.getAnnotationAttributes(cp, v2); + Attribute[] attributes2 = AnnotationEntryGen.getAnnotationAttributes(cp, v2); boolean foundRIV = false; for (Attribute attribute : attributes2) { if (attribute instanceof RuntimeInvisibleAnnotations) -- GitLab From 2b145ec96042357afb3be123a4880680e7f816cf Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Tue, 3 Mar 2015 10:56:38 +0000 Subject: [PATCH 0742/1313] Removed the redundant num/length/count fields git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1663628 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/ClassParser.java | 12 ++-- .../java/org/apache/bcel/classfile/Code.java | 70 +++++++++---------- .../apache/bcel/classfile/ConstantPool.java | 16 ++--- .../java/org/apache/bcel/classfile/Field.java | 13 ++-- .../apache/bcel/classfile/FieldOrMethod.java | 18 ++--- .../bcel/classfile/LineNumberTable.java | 23 +++--- .../bcel/classfile/LocalVariableTable.java | 38 +++++----- .../classfile/LocalVariableTypeTable.java | 27 ++++--- .../org/apache/bcel/classfile/Method.java | 19 +++-- .../classfile/ParameterAnnotationEntry.java | 18 ++--- .../bcel/classfile/ParameterAnnotations.java | 22 ++---- .../org/apache/bcel/classfile/StackMap.java | 20 +++--- .../apache/bcel/classfile/StackMapTable.java | 23 +++--- 13 files changed, 133 insertions(+), 186 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index a7385c7f..d58fdff0 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -195,8 +195,7 @@ public final class ClassParser { * @throws ClassFormatException */ private void readAttributes() throws IOException, ClassFormatException { - int attributes_count; - attributes_count = dataInputStream.readUnsignedShort(); + int attributes_count = dataInputStream.readUnsignedShort(); attributes = new Attribute[attributes_count]; for (int i = 0; i < attributes_count; i++) { attributes[i] = Attribute.readAttribute(dataInputStream, constant_pool); @@ -242,8 +241,7 @@ public final class ClassParser { * @throws ClassFormatException */ private void readFields() throws IOException, ClassFormatException { - int fields_count; - fields_count = dataInputStream.readUnsignedShort(); + int fields_count = dataInputStream.readUnsignedShort(); fields = new Field[fields_count]; for (int i = 0; i < fields_count; i++) { fields[i] = new Field(dataInputStream, constant_pool); @@ -272,8 +270,7 @@ public final class ClassParser { * @throws ClassFormatException */ private void readInterfaces() throws IOException, ClassFormatException { - int interfaces_count; - interfaces_count = dataInputStream.readUnsignedShort(); + int interfaces_count = dataInputStream.readUnsignedShort(); interfaces = new int[interfaces_count]; for (int i = 0; i < interfaces_count; i++) { interfaces[i] = dataInputStream.readUnsignedShort(); @@ -287,8 +284,7 @@ public final class ClassParser { * @throws ClassFormatException */ private void readMethods() throws IOException, ClassFormatException { - int methods_count; - methods_count = dataInputStream.readUnsignedShort(); + int methods_count = dataInputStream.readUnsignedShort(); methods = new Method[methods_count]; for (int i = 0; i < methods_count; i++) { methods[i] = new Method(dataInputStream, constant_pool); diff --git a/src/main/java/org/apache/bcel/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java index dac86377..89693ca9 100644 --- a/src/main/java/org/apache/bcel/classfile/Code.java +++ b/src/main/java/org/apache/bcel/classfile/Code.java @@ -46,11 +46,8 @@ public final class Code extends Attribute { private static final long serialVersionUID = -432884354459701506L; private int max_stack; // Maximum size of stack used by this method private int max_locals; // Number of local variables - private int code_length; // Length of code in bytes private byte[] code; // Actual byte code - private int exception_table_length; private CodeException[] exception_table; // Table of handled exceptions - private int attributes_count; // Attributes of code: LineNumber private Attribute[] attributes; // or LocalVariable @@ -75,13 +72,13 @@ public final class Code extends Attribute { // Initialize with some default values which will be overwritten later this(name_index, length, file.readUnsignedShort(), file.readUnsignedShort(), (byte[]) null, (CodeException[]) null, (Attribute[]) null, constant_pool); - code_length = file.readInt(); + int code_length = file.readInt(); code = new byte[code_length]; // Read byte code file.readFully(code); /* Read exception table that contains all regions where an exception * handler is active, i.e., a try { ... } catch() block. */ - exception_table_length = file.readUnsignedShort(); + int exception_table_length = file.readUnsignedShort(); exception_table = new CodeException[exception_table_length]; for (int i = 0; i < exception_table_length; i++) { exception_table[i] = new CodeException(file); @@ -89,7 +86,7 @@ public final class Code extends Attribute { /* Read all attributes, currently `LineNumberTable' and * `LocalVariableTable' */ - attributes_count = file.readUnsignedShort(); + int attributes_count = file.readUnsignedShort(); attributes = new Attribute[attributes_count]; for (int i = 0; i < attributes_count; i++) { attributes[i] = Attribute.readAttribute(file, constant_pool); @@ -147,15 +144,15 @@ public final class Code extends Attribute { super.dump(file); file.writeShort(max_stack); file.writeShort(max_locals); - file.writeInt(code_length); - file.write(code, 0, code_length); - file.writeShort(exception_table_length); - for (int i = 0; i < exception_table_length; i++) { - exception_table[i].dump(file); + file.writeInt(code.length); + file.write(code, 0, code.length); + file.writeShort(exception_table.length); + for (CodeException exception : exception_table) { + exception.dump(file); } - file.writeShort(attributes_count); - for (int i = 0; i < attributes_count; i++) { - attributes[i].dump(file); + file.writeShort(attributes.length); + for (Attribute attribute : attributes) { + attribute.dump(file); } } @@ -173,9 +170,9 @@ public final class Code extends Attribute { * @return LineNumberTable of Code, if it has one */ public LineNumberTable getLineNumberTable() { - for (int i = 0; i < attributes_count; i++) { - if (attributes[i] instanceof LineNumberTable) { - return (LineNumberTable) attributes[i]; + for (Attribute attribute : attributes) { + if (attribute instanceof LineNumberTable) { + return (LineNumberTable) attribute; } } return null; @@ -186,9 +183,9 @@ public final class Code extends Attribute { * @return LocalVariableTable of Code, if it has one */ public LocalVariableTable getLocalVariableTable() { - for (int i = 0; i < attributes_count; i++) { - if (attributes[i] instanceof LocalVariableTable) { - return (LocalVariableTable) attributes[i]; + for (Attribute attribute : attributes) { + if (attribute instanceof LocalVariableTable) { + return (LocalVariableTable) attribute; } } return null; @@ -234,9 +231,9 @@ public final class Code extends Attribute { */ private int getInternalLength() { return 2 /*max_stack*/+ 2 /*max_locals*/+ 4 /*code length*/ - + code_length /*byte-code*/ + + code.length /*byte-code*/ + 2 /*exception-table length*/ - + 8 * exception_table_length /* exception table */ + + 8 * exception_table.length /* exception table */ + 2 /* attributes count */; } @@ -247,8 +244,8 @@ public final class Code extends Attribute { */ private int calculateLength() { int len = 0; - for (int i = 0; i < attributes_count; i++) { - len += attributes[i].length + 6 /*attribute header size*/; + for (Attribute attribute : attributes) { + len += attribute.length + 6 /*attribute header size*/; } return len + getInternalLength(); } @@ -259,7 +256,6 @@ public final class Code extends Attribute { */ public final void setAttributes( Attribute[] attributes ) { this.attributes = attributes; - attributes_count = (attributes == null) ? 0 : attributes.length; length = calculateLength(); // Adjust length } @@ -269,7 +265,6 @@ public final class Code extends Attribute { */ public final void setCode( byte[] code ) { this.code = code; - code_length = (code == null) ? 0 : code.length; length = calculateLength(); // Adjust length } @@ -279,7 +274,6 @@ public final class Code extends Attribute { */ public final void setExceptionTable( CodeException[] exception_table ) { this.exception_table = exception_table; - exception_table_length = (exception_table == null) ? 0 : exception_table.length; length = calculateLength(); // Adjust length } @@ -306,18 +300,18 @@ public final class Code extends Attribute { public final String toString( boolean verbose ) { StringBuilder buf = new StringBuilder(100); buf.append("Code(max_stack = ").append(max_stack).append(", max_locals = ").append( - max_locals).append(", code_length = ").append(code_length).append(")\n").append( + max_locals).append(", code_length = ").append(code.length).append(")\n").append( Utility.codeToString(code, constant_pool, 0, -1, verbose)); - if (exception_table_length > 0) { + if (exception_table.length > 0) { buf.append("\nException handler(s) = \n").append("From\tTo\tHandler\tType\n"); - for (int i = 0; i < exception_table_length; i++) { - buf.append(exception_table[i].toString(constant_pool, verbose)).append("\n"); + for (CodeException exception : exception_table) { + buf.append(exception.toString(constant_pool, verbose)).append("\n"); } } - if (attributes_count > 0) { + if (attributes.length > 0) { buf.append("\nAttribute(s) = \n"); - for (int i = 0; i < attributes_count; i++) { - buf.append(attributes[i].toString()).append("\n"); + for (Attribute attribute : attributes) { + buf.append(attribute.toString()).append("\n"); } } return buf.toString(); @@ -346,12 +340,12 @@ public final class Code extends Attribute { System.arraycopy(code, 0, c.code, 0, code.length); } c.constant_pool = _constant_pool; - c.exception_table = new CodeException[exception_table_length]; - for (int i = 0; i < exception_table_length; i++) { + c.exception_table = new CodeException[exception_table.length]; + for (int i = 0; i < exception_table.length; i++) { c.exception_table[i] = exception_table[i].copy(); } - c.attributes = new Attribute[attributes_count]; - for (int i = 0; i < attributes_count; i++) { + c.attributes = new Attribute[attributes.length]; + for (int i = 0; i < attributes.length; i++) { c.attributes[i] = attributes[i].copy(_constant_pool); } return c; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index 2cf0c586..5daf5833 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -39,7 +39,6 @@ import org.apache.bcel.Constants; public class ConstantPool implements Cloneable, Node, Serializable { private static final long serialVersionUID = -9093478476423540196L; - private int constant_pool_count; private Constant[] constant_pool; @@ -60,7 +59,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { */ ConstantPool(DataInput input) throws IOException, ClassFormatException { byte tag; - constant_pool_count = input.readUnsignedShort(); + int constant_pool_count = input.readUnsignedShort(); constant_pool = new Constant[constant_pool_count]; /* constant_pool[0] is unused by the compiler and may be used freely * by the implementation. @@ -212,8 +211,8 @@ public class ConstantPool implements Cloneable, Node, Serializable { * @throws IOException */ public void dump( DataOutputStream file ) throws IOException { - file.writeShort(constant_pool_count); - for (int i = 1; i < constant_pool_count; i++) { + file.writeShort(constant_pool.length); + for (int i = 1; i < constant_pool.length; i++) { if (constant_pool[i] != null) { constant_pool[i].dump(file); } @@ -314,7 +313,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { * @return Length of constant pool. */ public int getLength() { - return constant_pool_count; + return constant_pool == null ? 0 : constant_pool.length; } @@ -331,7 +330,6 @@ public class ConstantPool implements Cloneable, Node, Serializable { */ public void setConstantPool( Constant[] constant_pool ) { this.constant_pool = constant_pool; - constant_pool_count = (constant_pool == null) ? 0 : constant_pool.length; } @@ -341,7 +339,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { @Override public String toString() { StringBuilder buf = new StringBuilder(); - for (int i = 1; i < constant_pool_count; i++) { + for (int i = 1; i < constant_pool.length; i++) { buf.append(i).append(")").append(constant_pool[i]).append("\n"); } return buf.toString(); @@ -355,8 +353,8 @@ public class ConstantPool implements Cloneable, Node, Serializable { ConstantPool c = null; try { c = (ConstantPool) clone(); - c.constant_pool = new Constant[constant_pool_count]; - for (int i = 1; i < constant_pool_count; i++) { + c.constant_pool = new Constant[constant_pool.length]; + for (int i = 1; i < constant_pool.length; i++) { if (constant_pool[i] != null) { c.constant_pool[i] = constant_pool[i].copy(); } diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java index d3b33002..92193495 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/bcel/classfile/Field.java @@ -98,9 +98,9 @@ public final class Field extends FieldOrMethod { * @return constant value associated with this field (may be null) */ public final ConstantValue getConstantValue() { - for (int i = 0; i < attributes_count; i++) { - if (attributes[i].getTag() == Constants.ATTR_CONSTANT_VALUE) { - return (ConstantValue) attributes[i]; + for (Attribute attribute : attributes) { + if (attribute.getTag() == Constants.ATTR_CONSTANT_VALUE) { + return (ConstantValue) attribute; } } return null; @@ -127,10 +127,9 @@ public final class Field extends FieldOrMethod { if (cv != null) { buf.append(" = ").append(cv); } - for (int i = 0; i < attributes_count; i++) { - Attribute a = attributes[i]; - if (!(a instanceof ConstantValue)) { - buf.append(" [").append(a.toString()).append("]"); + for (Attribute attribute : attributes) { + if (!(attribute instanceof ConstantValue)) { + buf.append(" [").append(attribute.toString()).append("]"); } } return buf.toString(); diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index d1caff28..efbacd10 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -22,8 +22,6 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.Signature; /** * Abstract super class for fields and methods. @@ -36,7 +34,6 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No private static final long serialVersionUID = -1833306330869469714L; protected int name_index; // Points to field name in constant pool protected int signature_index; // Points to encoded signature - protected int attributes_count; // No. of attributes protected Attribute[] attributes; // Collection of attributes protected AnnotationEntry[] annotationEntries; // annotations defined on the field or method protected ConstantPool constant_pool; @@ -79,7 +76,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No protected FieldOrMethod(DataInput file, ConstantPool constant_pool) throws IOException, ClassFormatException { this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), null, constant_pool); - attributes_count = file.readUnsignedShort(); + int attributes_count = file.readUnsignedShort(); attributes = new Attribute[attributes_count]; for (int i = 0; i < attributes_count; i++) { attributes[i] = Attribute.readAttribute(file, constant_pool); @@ -114,9 +111,9 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No file.writeShort(access_flags); file.writeShort(name_index); file.writeShort(signature_index); - file.writeShort(attributes_count); - for (int i = 0; i < attributes_count; i++) { - attributes[i].dump(file); + file.writeShort(attributes.length); + for (Attribute attribute : attributes) { + attribute.dump(file); } } @@ -134,7 +131,6 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No */ public final void setAttributes( Attribute[] attributes ) { this.attributes = attributes; - attributes_count = (attributes == null) ? 0 : attributes.length; } @@ -217,9 +213,9 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No } catch(CloneNotSupportedException e) {} c.constant_pool = constant_pool; - c.attributes = new Attribute[attributes_count]; + c.attributes = new Attribute[attributes.length]; - for(int i=0; i < attributes_count; i++) { + for (int i = 0; i < attributes.length; i++) { c.attributes[i] = attributes[i].copy(constant_pool); } @@ -247,7 +243,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No if (!searchedForSignatureAttribute) { boolean found = false; - for (int i = 0; !found && i < attributes_count; i++) + for (int i = 0; !found && i < attributes.length; i++) { if (attributes[i] instanceof Signature) { diff --git a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java index 919f46e8..cc6b7f5c 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java @@ -35,7 +35,7 @@ import org.apache.bcel.Constants; public final class LineNumberTable extends Attribute { private static final long serialVersionUID = -6967221519632128904L; - private int line_number_table_length; + private LineNumber[] line_number_table; // Table of line/numbers pairs @@ -72,7 +72,7 @@ public final class LineNumberTable extends Attribute { LineNumberTable(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (LineNumber[]) null, constant_pool); - line_number_table_length = (input.readUnsignedShort()); + int line_number_table_length = (input.readUnsignedShort()); line_number_table = new LineNumber[line_number_table_length]; for (int i = 0; i < line_number_table_length; i++) { line_number_table[i] = new LineNumber(input); @@ -101,9 +101,9 @@ public final class LineNumberTable extends Attribute { @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); - file.writeShort(line_number_table_length); - for (int i = 0; i < line_number_table_length; i++) { - line_number_table[i].dump(file); + file.writeShort(line_number_table.length); + for (LineNumber lineNumber : line_number_table) { + lineNumber.dump(file); } } @@ -121,7 +121,6 @@ public final class LineNumberTable extends Attribute { */ public final void setLineNumberTable( LineNumber[] line_number_table ) { this.line_number_table = line_number_table; - line_number_table_length = (line_number_table == null) ? 0 : line_number_table.length; } @@ -133,9 +132,9 @@ public final class LineNumberTable extends Attribute { StringBuilder buf = new StringBuilder(); StringBuilder line = new StringBuilder(); String newLine = System.getProperty("line.separator", "\n"); - for (int i = 0; i < line_number_table_length; i++) { + for (int i = 0; i < line_number_table.length; i++) { line.append(line_number_table[i].toString()); - if (i < line_number_table_length - 1) { + if (i < line_number_table.length - 1) { line.append(", "); } if (line.length() > 72) { @@ -156,7 +155,7 @@ public final class LineNumberTable extends Attribute { * @return corresponding line in source code */ public int getSourceLine( int pos ) { - int l = 0, r = line_number_table_length - 1; + int l = 0, r = line_number_table.length - 1; if (r < 0) { return -1; } @@ -198,8 +197,8 @@ public final class LineNumberTable extends Attribute { @Override public Attribute copy( ConstantPool _constant_pool ) { LineNumberTable c = (LineNumberTable) clone(); - c.line_number_table = new LineNumber[line_number_table_length]; - for (int i = 0; i < line_number_table_length; i++) { + c.line_number_table = new LineNumber[line_number_table.length]; + for (int i = 0; i < line_number_table.length; i++) { c.line_number_table[i] = line_number_table[i].copy(); } c.constant_pool = _constant_pool; @@ -208,6 +207,6 @@ public final class LineNumberTable extends Attribute { public final int getTableLength() { - return line_number_table_length; + return line_number_table == null ? 0 : line_number_table.length; } } diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index 4c31f898..249b617c 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -34,7 +34,6 @@ import org.apache.bcel.Constants; public class LocalVariableTable extends Attribute { private static final long serialVersionUID = 6780929007774637689L; - private int local_variable_table_length; // Table of local private LocalVariable[] local_variable_table; // variables @@ -71,7 +70,7 @@ public class LocalVariableTable extends Attribute { LocalVariableTable(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (LocalVariable[]) null, constant_pool); - local_variable_table_length = (input.readUnsignedShort()); + int local_variable_table_length = (input.readUnsignedShort()); local_variable_table = new LocalVariable[local_variable_table_length]; for (int i = 0; i < local_variable_table_length; i++) { local_variable_table[i] = new LocalVariable(input, constant_pool); @@ -101,9 +100,9 @@ public class LocalVariableTable extends Attribute { @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); - file.writeShort(local_variable_table_length); - for (int i = 0; i < local_variable_table_length; i++) { - local_variable_table[i].dump(file); + file.writeShort(local_variable_table.length); + for (LocalVariable variable : local_variable_table) { + variable.dump(file); } } @@ -127,9 +126,9 @@ public class LocalVariableTable extends Attribute { */ @java.lang.Deprecated public final LocalVariable getLocalVariable( int index ) { - for (int i = 0; i < local_variable_table_length; i++) { - if (local_variable_table[i].getIndex() == index) { - return local_variable_table[i]; + for (LocalVariable variable : local_variable_table) { + if (variable.getIndex() == index) { + return variable; } } return null; @@ -144,12 +143,12 @@ public class LocalVariableTable extends Attribute { * @return the LocalVariable that matches or null if not found */ public final LocalVariable getLocalVariable( int index, int pc ) { - for (int i = 0; i < local_variable_table_length; i++) { - if (local_variable_table[i].getIndex() == index) { - int start_pc = local_variable_table[i].getStartPC(); - int end_pc = start_pc + local_variable_table[i].getLength(); + for (LocalVariable variable : local_variable_table) { + if (variable.getIndex() == index) { + int start_pc = variable.getStartPC(); + int end_pc = start_pc + variable.getLength(); if ((pc >= start_pc) && (pc <= end_pc)) { - return local_variable_table[i]; + return variable; } } } @@ -159,9 +158,6 @@ public class LocalVariableTable extends Attribute { public final void setLocalVariableTable( LocalVariable[] local_variable_table ) { this.local_variable_table = local_variable_table; - local_variable_table_length = (local_variable_table == null) - ? 0 - : local_variable_table.length; } @@ -171,9 +167,9 @@ public class LocalVariableTable extends Attribute { @Override public final String toString() { StringBuilder buf = new StringBuilder(); - for (int i = 0; i < local_variable_table_length; i++) { + for (int i = 0; i < local_variable_table.length; i++) { buf.append(local_variable_table[i].toString()); - if (i < local_variable_table_length - 1) { + if (i < local_variable_table.length - 1) { buf.append('\n'); } } @@ -187,8 +183,8 @@ public class LocalVariableTable extends Attribute { @Override public Attribute copy( ConstantPool _constant_pool ) { LocalVariableTable c = (LocalVariableTable) clone(); - c.local_variable_table = new LocalVariable[local_variable_table_length]; - for (int i = 0; i < local_variable_table_length; i++) { + c.local_variable_table = new LocalVariable[local_variable_table.length]; + for (int i = 0; i < local_variable_table.length; i++) { c.local_variable_table[i] = local_variable_table[i].copy(); } c.constant_pool = _constant_pool; @@ -197,6 +193,6 @@ public class LocalVariableTable extends Attribute { public final int getTableLength() { - return local_variable_table_length; + return local_variable_table == null ? 0 : local_variable_table.length; } } diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index 27044f43..9a4ee1a0 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -58,7 +58,6 @@ public class LocalVariableTypeTable extends Attribute { private static final long serialVersionUID = -1082157891095177114L; - private int local_variable_type_table_length; // Table of local private LocalVariable[] local_variable_type_table; // variables public LocalVariableTypeTable(LocalVariableTypeTable c) { @@ -73,7 +72,7 @@ public class LocalVariableTypeTable extends Attribute { LocalVariableTypeTable(int nameIdx, int len, DataInput input, ConstantPool cpool) throws IOException { this(nameIdx, len, (LocalVariable[]) null, cpool); - local_variable_type_table_length = (input.readUnsignedShort()); + int local_variable_type_table_length = (input.readUnsignedShort()); local_variable_type_table = new LocalVariable[local_variable_type_table_length]; for (int i = 0; i < local_variable_type_table_length; i++) { @@ -89,9 +88,9 @@ public class LocalVariableTypeTable extends Attribute { @Override public final void dump(DataOutputStream file) throws IOException { super.dump(file); - file.writeShort(local_variable_type_table_length); - for (int i = 0; i < local_variable_type_table_length; i++) { - local_variable_type_table[i].dump(file); + file.writeShort(local_variable_type_table.length); + for (LocalVariable variable : local_variable_type_table) { + variable.dump(file); } } @@ -100,9 +99,9 @@ public class LocalVariableTypeTable extends Attribute { } public final LocalVariable getLocalVariable(int index) { - for (int i = 0; i < local_variable_type_table_length; i++) { - if (local_variable_type_table[i].getIndex() == index) { - return local_variable_type_table[i]; + for (LocalVariable variable : local_variable_type_table) { + if (variable.getIndex() == index) { + return variable; } } @@ -111,8 +110,6 @@ public class LocalVariableTypeTable extends Attribute { public final void setLocalVariableTable(LocalVariable[] local_variable_table) { this.local_variable_type_table = local_variable_table; - local_variable_type_table_length = (local_variable_table == null) ? 0 : - local_variable_table.length; } /** @@ -122,10 +119,10 @@ public class LocalVariableTypeTable extends Attribute { public final String toString() { StringBuilder buf = new StringBuilder(); - for (int i = 0; i < local_variable_type_table_length; i++) { + for (int i = 0; i < local_variable_type_table.length; i++) { buf.append(local_variable_type_table[i].toString()); - if (i < local_variable_type_table_length - 1) { + if (i < local_variable_type_table.length - 1) { buf.append('\n'); } } @@ -140,8 +137,8 @@ public class LocalVariableTypeTable extends Attribute { public Attribute copy(ConstantPool constant_pool) { LocalVariableTypeTable c = (LocalVariableTypeTable) clone(); - c.local_variable_type_table = new LocalVariable[local_variable_type_table_length]; - for (int i = 0; i < local_variable_type_table_length; i++) { + c.local_variable_type_table = new LocalVariable[local_variable_type_table.length]; + for (int i = 0; i < local_variable_type_table.length; i++) { c.local_variable_type_table[i] = local_variable_type_table[i].copy(); } @@ -150,6 +147,6 @@ public class LocalVariableTypeTable extends Attribute { } public final int getTableLength() { - return local_variable_type_table_length; + return local_variable_type_table == null ? 0 : local_variable_type_table.length; } } diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index 95d20b19..bcb2eced 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -111,9 +111,9 @@ public final class Method extends FieldOrMethod { * @return Code attribute of method, if any */ public final Code getCode() { - for (int i = 0; i < attributes_count; i++) { - if (attributes[i] instanceof Code) { - return (Code) attributes[i]; + for (Attribute attribute : attributes) { + if (attribute instanceof Code) { + return (Code) attribute; } } return null; @@ -125,9 +125,9 @@ public final class Method extends FieldOrMethod { * exceptions the method may throw not exception handlers! */ public final ExceptionTable getExceptionTable() { - for (int i = 0; i < attributes_count; i++) { - if (attributes[i] instanceof ExceptionTable) { - return (ExceptionTable) attributes[i]; + for (Attribute attribute : attributes) { + if (attribute instanceof ExceptionTable) { + return (ExceptionTable) attribute; } } return null; @@ -178,10 +178,9 @@ public final class Method extends FieldOrMethod { signature = Utility.methodSignatureToString(signature, name, access, true, getLocalVariableTable()); buf = new StringBuilder(signature); - for (int i = 0; i < attributes_count; i++) { - Attribute a = attributes[i]; - if (!((a instanceof Code) || (a instanceof ExceptionTable))) { - buf.append(" [").append(a.toString()).append("]"); + for (Attribute attribute : attributes) { + if (!((attribute instanceof Code) || (attribute instanceof ExceptionTable))) { + buf.append(" [").append(attribute.toString()).append("]"); } } ExceptionTable e = getExceptionTable(); diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index fc9b80d0..ac427e98 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -35,7 +35,6 @@ import org.apache.bcel.Constants; */ public class ParameterAnnotationEntry implements Node, Constants { - private final int annotation_table_length; private final AnnotationEntry[] annotation_table; @@ -46,7 +45,7 @@ public class ParameterAnnotationEntry implements Node, Constants { * @throws IOException */ ParameterAnnotationEntry(DataInput input, ConstantPool constant_pool) throws IOException { - annotation_table_length = (input.readUnsignedShort()); + int annotation_table_length = (input.readUnsignedShort()); annotation_table = new AnnotationEntry[annotation_table_length]; for (int i = 0; i < annotation_table_length; i++) { // TODO isRuntimeVisible @@ -66,15 +65,6 @@ public class ParameterAnnotationEntry implements Node, Constants { // v.visitParameterAnnotationEntry(this); } - - /** - * @return the number of annotation entries in this parameter annotation - */ - public final int getNumAnnotations() { - return annotation_table_length; - } - - /** * returns the array of annotation entries in this annotation */ @@ -83,9 +73,9 @@ public class ParameterAnnotationEntry implements Node, Constants { } public void dump(DataOutputStream dos) throws IOException { - dos.writeShort(annotation_table_length); - for(int i = 0; i < annotation_table_length; i++) { - annotation_table[i].dump(dos); + dos.writeShort(annotation_table.length); + for (AnnotationEntry entry : annotation_table) { + entry.dump(dos); } } diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index 63332574..bca5ea74 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -31,9 +31,9 @@ import java.io.IOException; public abstract class ParameterAnnotations extends Attribute { private static final long serialVersionUID = 5234607357644462705L; - private int num_parameters; - private ParameterAnnotationEntry[] parameter_annotation_table; // Table of parameter annotations - + + /** Table of parameter annotations */ + private ParameterAnnotationEntry[] parameter_annotation_table; /** * @param parameter_annotation_type the subclass type of the parameter annotation @@ -46,7 +46,7 @@ public abstract class ParameterAnnotations extends Attribute { DataInput input, ConstantPool constant_pool) throws IOException { this(parameter_annotation_type, name_index, length, (ParameterAnnotationEntry[]) null, constant_pool); - num_parameters = (input.readUnsignedByte()); + int num_parameters = (input.readUnsignedByte()); parameter_annotation_table = new ParameterAnnotationEntry[num_parameters]; for (int i = 0; i < num_parameters; i++) { parameter_annotation_table[i] = new ParameterAnnotationEntry(input, constant_pool); @@ -84,12 +84,8 @@ public abstract class ParameterAnnotations extends Attribute { /** * @param parameter_annotation_table the entries to set in this parameter annotation */ - public final void setParameterAnnotationTable( - ParameterAnnotationEntry[] parameter_annotation_table ) { + public final void setParameterAnnotationTable(ParameterAnnotationEntry[] parameter_annotation_table ) { this.parameter_annotation_table = parameter_annotation_table; - num_parameters = (parameter_annotation_table == null) - ? 0 - : parameter_annotation_table.length; } @@ -108,14 +104,6 @@ public abstract class ParameterAnnotations extends Attribute { return parameter_annotation_table; } - - /** - * @return the number of parameter annotation entries in this parameter annotation - */ - public final int getNumParameterAnnotation() { - return num_parameters; - } - @Override public void dump(DataOutputStream dos) throws IOException { diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java index 179a624b..57917530 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMap.java +++ b/src/main/java/org/apache/bcel/classfile/StackMap.java @@ -40,7 +40,6 @@ import org.apache.bcel.Constants; public final class StackMap extends Attribute { private static final long serialVersionUID = -6238662431726968495L; - private int map_length; private StackMapEntry[] map; // Table of stack map entries @@ -67,7 +66,7 @@ public final class StackMap extends Attribute { */ StackMap(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (StackMapEntry[]) null, constant_pool); - map_length = input.readUnsignedShort(); + int map_length = input.readUnsignedShort(); map = new StackMapEntry[map_length]; for (int i = 0; i < map_length; i++) { map[i] = new StackMapEntry(input, constant_pool); @@ -84,9 +83,9 @@ public final class StackMap extends Attribute { @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); - file.writeShort(map_length); - for (int i = 0; i < map_length; i++) { - map[i].dump(file); + file.writeShort(map.length); + for (StackMapEntry entry : map) { + entry.dump(file); } } @@ -104,7 +103,6 @@ public final class StackMap extends Attribute { */ public final void setStackMap( StackMapEntry[] map ) { this.map = map; - map_length = (map == null) ? 0 : map.length; } @@ -114,9 +112,9 @@ public final class StackMap extends Attribute { @Override public final String toString() { StringBuilder buf = new StringBuilder("StackMap("); - for (int i = 0; i < map_length; i++) { + for (int i = 0; i < map.length; i++) { buf.append(map[i].toString()); - if (i < map_length - 1) { + if (i < map.length - 1) { buf.append(", "); } } @@ -131,8 +129,8 @@ public final class StackMap extends Attribute { @Override public Attribute copy( ConstantPool _constant_pool ) { StackMap c = (StackMap) clone(); - c.map = new StackMapEntry[map_length]; - for (int i = 0; i < map_length; i++) { + c.map = new StackMapEntry[map.length]; + for (int i = 0; i < map.length; i++) { c.map[i] = map[i].copy(); } c.constant_pool = _constant_pool; @@ -154,6 +152,6 @@ public final class StackMap extends Attribute { public final int getMapLength() { - return map_length; + return map == null ? 0 : map.length; } } diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTable.java b/src/main/java/org/apache/bcel/classfile/StackMapTable.java index 4a4fc5fc..7263e47c 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTable.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTable.java @@ -41,7 +41,6 @@ import org.apache.bcel.Constants; public final class StackMapTable extends Attribute { private static final long serialVersionUID = -5802191977296683162L; - private int map_length; private StackMapTableEntry[] map; // Table of stack map entries @@ -65,10 +64,9 @@ public final class StackMapTable extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - StackMapTable(int name_index, int length, DataInput file, ConstantPool constant_pool) - throws IOException { + StackMapTable(int name_index, int length, DataInput file, ConstantPool constant_pool) throws IOException { this(name_index, length, (StackMapTableEntry[]) null, constant_pool); - map_length = file.readUnsignedShort(); + int map_length = file.readUnsignedShort(); map = new StackMapTableEntry[map_length]; for (int i = 0; i < map_length; i++) { map[i] = new StackMapTableEntry(file, constant_pool); @@ -85,9 +83,9 @@ public final class StackMapTable extends Attribute { @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); - file.writeShort(map_length); - for (int i = 0; i < map_length; i++) { - map[i].dump(file); + file.writeShort(map.length); + for (StackMapTableEntry entry : map) { + entry.dump(file); } } @@ -105,7 +103,6 @@ public final class StackMapTable extends Attribute { */ public final void setStackMapTable( StackMapTableEntry[] map ) { this.map = map; - map_length = (map == null) ? 0 : map.length; } @@ -115,9 +112,9 @@ public final class StackMapTable extends Attribute { @Override public final String toString() { StringBuilder buf = new StringBuilder("StackMapTable("); - for (int i = 0; i < map_length; i++) { + for (int i = 0; i < map.length; i++) { buf.append(map[i].toString()); - if (i < map_length - 1) { + if (i < map.length - 1) { buf.append(", "); } } @@ -132,8 +129,8 @@ public final class StackMapTable extends Attribute { @Override public Attribute copy( ConstantPool _constant_pool ) { StackMapTable c = (StackMapTable) clone(); - c.map = new StackMapTableEntry[map_length]; - for (int i = 0; i < map_length; i++) { + c.map = new StackMapTableEntry[map.length]; + for (int i = 0; i < map.length; i++) { c.map[i] = map[i].copy(); } c.constant_pool = _constant_pool; @@ -155,6 +152,6 @@ public final class StackMapTable extends Attribute { public final int getMapLength() { - return map_length; + return map == null ? 0 : map.length; } } -- GitLab From 670048bfa4d805a681f49a7f9b8c32b46ef8d031 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Tue, 3 Mar 2015 16:54:07 +0000 Subject: [PATCH 0743/1313] Fixed the NPE induced by r1663628 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1663742 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Code.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java index 89693ca9..d257acb5 100644 --- a/src/main/java/org/apache/bcel/classfile/Code.java +++ b/src/main/java/org/apache/bcel/classfile/Code.java @@ -233,7 +233,7 @@ public final class Code extends Attribute { return 2 /*max_stack*/+ 2 /*max_locals*/+ 4 /*code length*/ + code.length /*byte-code*/ + 2 /*exception-table length*/ - + 8 * exception_table.length /* exception table */ + + 8 * (exception_table == null ? 0 : exception_table.length) /* exception table */ + 2 /* attributes count */; } @@ -244,8 +244,10 @@ public final class Code extends Attribute { */ private int calculateLength() { int len = 0; - for (Attribute attribute : attributes) { - len += attribute.length + 6 /*attribute header size*/; + if (attributes != null) { + for (Attribute attribute : attributes) { + len += attribute.length + 6 /*attribute header size*/; + } } return len + getInternalLength(); } @@ -255,7 +257,7 @@ public final class Code extends Attribute { * @param attributes the attributes to set for this Code */ public final void setAttributes( Attribute[] attributes ) { - this.attributes = attributes; + this.attributes = attributes != null ? attributes : new Attribute[0]; length = calculateLength(); // Adjust length } @@ -264,7 +266,7 @@ public final class Code extends Attribute { * @param code byte code */ public final void setCode( byte[] code ) { - this.code = code; + this.code = code != null ? code : new byte[0]; length = calculateLength(); // Adjust length } @@ -273,7 +275,7 @@ public final class Code extends Attribute { * @param exception_table exception table */ public final void setExceptionTable( CodeException[] exception_table ) { - this.exception_table = exception_table; + this.exception_table = exception_table != null ? exception_table : new CodeException[0]; length = calculateLength(); // Adjust length } -- GitLab From d24936191391128db30ff49e298e2b31aa643d3a Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Fri, 6 Mar 2015 09:51:40 +0000 Subject: [PATCH 0744/1313] Removed the redundant number_of_* fields git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1664574 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/ExceptionTable.java | 33 ++++---- .../apache/bcel/classfile/InnerClasses.java | 20 +++-- .../apache/bcel/classfile/StackMapEntry.java | 58 +++++++------- .../bcel/classfile/StackMapTableEntry.java | 77 ++++++++----------- 4 files changed, 84 insertions(+), 104 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java index 49397dc2..10fe6889 100644 --- a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java @@ -13,8 +13,8 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * */ + package org.apache.bcel.classfile; import java.io.DataInput; @@ -37,7 +37,7 @@ import org.apache.bcel.Constants; public final class ExceptionTable extends Attribute { private static final long serialVersionUID = 2045358830660883220L; - private int number_of_exceptions; // Table of indices into + private int[] exception_index_table; // constant pool @@ -71,10 +71,9 @@ public final class ExceptionTable extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - ExceptionTable(int name_index, int length, DataInput input, ConstantPool constant_pool) - throws IOException { + ExceptionTable(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (int[]) null, constant_pool); - number_of_exceptions = input.readUnsignedShort(); + int number_of_exceptions = input.readUnsignedShort(); exception_index_table = new int[number_of_exceptions]; for (int i = 0; i < number_of_exceptions; i++) { exception_index_table[i] = input.readUnsignedShort(); @@ -104,9 +103,9 @@ public final class ExceptionTable extends Attribute { @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); - file.writeShort(number_of_exceptions); - for (int i = 0; i < number_of_exceptions; i++) { - file.writeShort(exception_index_table[i]); + file.writeShort(exception_index_table.length); + for (int index : exception_index_table) { + file.writeShort(index); } } @@ -123,7 +122,7 @@ public final class ExceptionTable extends Attribute { * @return Length of exception table. */ public final int getNumberOfExceptions() { - return number_of_exceptions; + return exception_index_table == null ? 0 : exception_index_table.length; } @@ -131,9 +130,9 @@ public final class ExceptionTable extends Attribute { * @return class names of thrown exceptions */ public final String[] getExceptionNames() { - String[] names = new String[number_of_exceptions]; - for (int i = 0; i < number_of_exceptions; i++) { - names[i] = constant_pool.getConstantString(exception_index_table[i], + String[] names = new String[exception_index_table.length]; + for (int i = 0; i < exception_index_table.length; i++) { + names[i] = constant_pool.getConstantString(exception_index_table[i], Constants.CONSTANT_Class).replace('/', '.'); } return names; @@ -145,8 +144,7 @@ public final class ExceptionTable extends Attribute { * Also redefines number_of_exceptions according to table length. */ public final void setExceptionIndexTable( int[] exception_index_table ) { - this.exception_index_table = exception_index_table; - number_of_exceptions = (exception_index_table == null) ? 0 : exception_index_table.length; + this.exception_index_table = exception_index_table != null ? exception_index_table : new int[0]; } @@ -157,11 +155,10 @@ public final class ExceptionTable extends Attribute { public final String toString() { StringBuilder buf = new StringBuilder(); String str; - for (int i = 0; i < number_of_exceptions; i++) { - str = constant_pool.getConstantString(exception_index_table[i], - Constants.CONSTANT_Class); + for (int i = 0; i < exception_index_table.length; i++) { + str = constant_pool.getConstantString(exception_index_table[i], Constants.CONSTANT_Class); buf.append(Utility.compactClassName(str, false)); - if (i < number_of_exceptions - 1) { + if (i < exception_index_table.length - 1) { buf.append(", "); } } diff --git a/src/main/java/org/apache/bcel/classfile/InnerClasses.java b/src/main/java/org/apache/bcel/classfile/InnerClasses.java index 2db728aa..076d9396 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClasses.java @@ -36,7 +36,6 @@ public final class InnerClasses extends Attribute { private static final long serialVersionUID = 4570147726361753700L; private InnerClass[] inner_classes; - private int number_of_classes; /** @@ -73,7 +72,7 @@ public final class InnerClasses extends Attribute { InnerClasses(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (InnerClass[]) null, constant_pool); - number_of_classes = input.readUnsignedShort(); + int number_of_classes = input.readUnsignedShort(); inner_classes = new InnerClass[number_of_classes]; for (int i = 0; i < number_of_classes; i++) { inner_classes[i] = new InnerClass(input); @@ -103,9 +102,9 @@ public final class InnerClasses extends Attribute { @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); - file.writeShort(number_of_classes); - for (int i = 0; i < number_of_classes; i++) { - inner_classes[i].dump(file); + file.writeShort(inner_classes.length); + for (InnerClass inner_class : inner_classes) { + inner_class.dump(file); } } @@ -122,8 +121,7 @@ public final class InnerClasses extends Attribute { * @param inner_classes the array of inner classes */ public final void setInnerClasses( InnerClass[] inner_classes ) { - this.inner_classes = inner_classes; - number_of_classes = (inner_classes == null) ? 0 : inner_classes.length; + this.inner_classes = inner_classes != null ? inner_classes : new InnerClass[0]; } @@ -133,8 +131,8 @@ public final class InnerClasses extends Attribute { @Override public final String toString() { StringBuilder buf = new StringBuilder(); - for (int i = 0; i < number_of_classes; i++) { - buf.append(inner_classes[i].toString(constant_pool)).append("\n"); + for (InnerClass inner_class : inner_classes) { + buf.append(inner_class.toString(constant_pool)).append("\n"); } return buf.toString(); } @@ -146,8 +144,8 @@ public final class InnerClasses extends Attribute { @Override public Attribute copy( ConstantPool _constant_pool ) { InnerClasses c = (InnerClasses) clone(); - c.inner_classes = new InnerClass[number_of_classes]; - for (int i = 0; i < number_of_classes; i++) { + c.inner_classes = new InnerClass[inner_classes.length]; + for (int i = 0; i < inner_classes.length; i++) { c.inner_classes[i] = inner_classes[i].copy(); } c.constant_pool = _constant_pool; diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index 3c360d0b..26ffba26 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -13,8 +13,8 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * */ + package org.apache.bcel.classfile; import java.io.DataInput; @@ -37,9 +37,7 @@ public final class StackMapEntry implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private int byte_code_offset; - private int number_of_locals; private StackMapType[] types_of_locals; - private int number_of_stack_items; private StackMapType[] types_of_stack_items; private ConstantPool constant_pool; @@ -51,12 +49,16 @@ public final class StackMapEntry implements Cloneable, Serializable { * @throws IOException */ StackMapEntry(DataInput input, ConstantPool constant_pool) throws IOException { - this(input.readShort(), input.readShort(), null, -1, null, constant_pool); + this.constant_pool = constant_pool; + this.byte_code_offset = input.readShort(); + + int number_of_locals = input.readShort(); types_of_locals = new StackMapType[number_of_locals]; for (int i = 0; i < number_of_locals; i++) { types_of_locals[i] = new StackMapType(input, constant_pool); } - number_of_stack_items = input.readShort(); + + int number_of_stack_items = input.readShort(); types_of_stack_items = new StackMapType[number_of_stack_items]; for (int i = 0; i < number_of_stack_items; i++) { types_of_stack_items[i] = new StackMapType(input, constant_pool); @@ -68,10 +70,8 @@ public final class StackMapEntry implements Cloneable, Serializable { StackMapType[] types_of_locals, int number_of_stack_items, StackMapType[] types_of_stack_items, ConstantPool constant_pool) { this.byte_code_offset = byte_code_offset; - this.number_of_locals = number_of_locals; - this.types_of_locals = types_of_locals; - this.number_of_stack_items = number_of_stack_items; - this.types_of_stack_items = types_of_stack_items; + setTypesOfLocals(types_of_locals); + setTypesOfStackItems(types_of_stack_items); this.constant_pool = constant_pool; } @@ -84,13 +84,13 @@ public final class StackMapEntry implements Cloneable, Serializable { */ public final void dump( DataOutputStream file ) throws IOException { file.writeShort(byte_code_offset); - file.writeShort(number_of_locals); - for (int i = 0; i < number_of_locals; i++) { - types_of_locals[i].dump(file); + file.writeShort(types_of_locals.length); + for (StackMapType type : types_of_locals) { + type.dump(file); } - file.writeShort(number_of_stack_items); - for (int i = 0; i < number_of_stack_items; i++) { - types_of_stack_items[i].dump(file); + file.writeShort(types_of_stack_items.length); + for (StackMapType type : types_of_stack_items) { + type.dump(file); } } @@ -102,21 +102,21 @@ public final class StackMapEntry implements Cloneable, Serializable { public final String toString() { StringBuilder buf = new StringBuilder(64); buf.append("(offset=").append(byte_code_offset); - if (number_of_locals > 0) { + if (types_of_locals.length > 0) { buf.append(", locals={"); - for (int i = 0; i < number_of_locals; i++) { + for (int i = 0; i < types_of_locals.length; i++) { buf.append(types_of_locals[i]); - if (i < number_of_locals - 1) { + if (i < types_of_locals.length - 1) { buf.append(", "); } } buf.append("}"); } - if (number_of_stack_items > 0) { + if (types_of_stack_items.length > 0) { buf.append(", stack items={"); - for (int i = 0; i < number_of_stack_items; i++) { + for (int i = 0; i < types_of_stack_items.length; i++) { buf.append(types_of_stack_items[i]); - if (i < number_of_stack_items - 1) { + if (i < types_of_stack_items.length - 1) { buf.append(", "); } } @@ -137,18 +137,18 @@ public final class StackMapEntry implements Cloneable, Serializable { } + @java.lang.Deprecated public void setNumberOfLocals( int n ) { - number_of_locals = n; } public int getNumberOfLocals() { - return number_of_locals; + return types_of_locals == null ? 0 : types_of_locals.length; } - public void setTypesOfLocals( StackMapType[] t ) { - types_of_locals = t; + public void setTypesOfLocals( StackMapType[] types ) { + types_of_locals = types != null ? types : new StackMapType[0]; } @@ -157,18 +157,18 @@ public final class StackMapEntry implements Cloneable, Serializable { } + @java.lang.Deprecated public void setNumberOfStackItems( int n ) { - number_of_stack_items = n; } public int getNumberOfStackItems() { - return number_of_stack_items; + return types_of_stack_items == null ? 0 : types_of_stack_items.length; } - public void setTypesOfStackItems( StackMapType[] t ) { - types_of_stack_items = t; + public void setTypesOfStackItems( StackMapType[] types ) { + types_of_stack_items = types != null ? types : new StackMapType[0]; } diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java index cadfc11d..06ae2045 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java @@ -13,8 +13,8 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * */ + package org.apache.bcel.classfile; import java.io.DataInput; @@ -41,31 +41,28 @@ public final class StackMapTableEntry implements Cloneable, Serializable { private final int frame_type; private int byte_code_offset_delta; - private int number_of_locals; private StackMapType[] types_of_locals; - private int number_of_stack_items; private StackMapType[] types_of_stack_items; private ConstantPool constant_pool; /** * Construct object from file stream. + * * * @param file Input stream * @throws IOException */ StackMapTableEntry(DataInput file, ConstantPool constant_pool) throws IOException { - this(file.readByte() & 0xFF, -1, -1, null, -1, null, constant_pool); + this(file.readByte() & 0xFF, -1, null, null, constant_pool); if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { byte_code_offset_delta = frame_type - Constants.SAME_FRAME; } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { byte_code_offset_delta = frame_type - Constants.SAME_LOCALS_1_STACK_ITEM_FRAME; - number_of_stack_items = 1; types_of_stack_items = new StackMapType[1]; types_of_stack_items[0] = new StackMapType(file, constant_pool); } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { byte_code_offset_delta = file.readShort(); - number_of_stack_items = 1; types_of_stack_items = new StackMapType[1]; types_of_stack_items[0] = new StackMapType(file, constant_pool); } else if (frame_type >= Constants.CHOP_FRAME && frame_type <= Constants.CHOP_FRAME_MAX) { @@ -74,19 +71,19 @@ public final class StackMapTableEntry implements Cloneable, Serializable { byte_code_offset_delta = file.readShort(); } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { byte_code_offset_delta = file.readShort(); - number_of_locals = frame_type - 251; + int number_of_locals = frame_type - 251; types_of_locals = new StackMapType[number_of_locals]; for (int i = 0; i < number_of_locals; i++) { types_of_locals[i] = new StackMapType(file, constant_pool); } } else if (frame_type == Constants.FULL_FRAME) { byte_code_offset_delta = file.readShort(); - number_of_locals = file.readShort(); + int number_of_locals = file.readShort(); types_of_locals = new StackMapType[number_of_locals]; for (int i = 0; i < number_of_locals; i++) { types_of_locals[i] = new StackMapType(file, constant_pool); } - number_of_stack_items = file.readShort(); + int number_of_stack_items = file.readShort(); types_of_stack_items = new StackMapType[number_of_stack_items]; for (int i = 0; i < number_of_stack_items; i++) { types_of_stack_items[i] = new StackMapType(file, constant_pool); @@ -98,15 +95,13 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } - public StackMapTableEntry(int tag, int byte_code_offset_delta, int number_of_locals, - StackMapType[] types_of_locals, int number_of_stack_items, + public StackMapTableEntry(int tag, int byte_code_offset_delta, + StackMapType[] types_of_locals, StackMapType[] types_of_stack_items, ConstantPool constant_pool) { this.frame_type = tag; this.byte_code_offset_delta = byte_code_offset_delta; - this.number_of_locals = number_of_locals; - this.types_of_locals = types_of_locals; - this.number_of_stack_items = number_of_stack_items; - this.types_of_stack_items = types_of_stack_items; + setTypesOfLocals(types_of_locals); + setTypesOfStackItems(types_of_stack_items); this.constant_pool = constant_pool; } @@ -132,18 +127,18 @@ public final class StackMapTableEntry implements Cloneable, Serializable { file.writeShort(byte_code_offset_delta); } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { file.writeShort(byte_code_offset_delta); - for (int i = 0; i < number_of_locals; i++) { - types_of_locals[i].dump(file); + for (StackMapType type : types_of_locals) { + type.dump(file); } } else if (frame_type == Constants.FULL_FRAME) { file.writeShort(byte_code_offset_delta); - file.writeShort(number_of_locals); - for (int i = 0; i < number_of_locals; i++) { - types_of_locals[i].dump(file); + file.writeShort(types_of_locals.length); + for (StackMapType type : types_of_locals) { + type.dump(file); } - file.writeShort(number_of_stack_items); - for (int i = 0; i < number_of_stack_items; i++) { - types_of_stack_items[i].dump(file); + file.writeShort(types_of_stack_items.length); + for (StackMapType type : types_of_stack_items) { + type.dump(file); } } else { /* Can't happen */ @@ -177,21 +172,21 @@ public final class StackMapTableEntry implements Cloneable, Serializable { buf.append("UNKNOWN"); } buf.append(", offset delta=").append(byte_code_offset_delta); - if (number_of_locals > 0) { + if (types_of_locals.length > 0) { buf.append(", locals={"); - for (int i = 0; i < number_of_locals; i++) { + for (int i = 0; i < types_of_locals.length; i++) { buf.append(types_of_locals[i]); - if (i < number_of_locals - 1) { + if (i < types_of_locals.length - 1) { buf.append(", "); } } buf.append("}"); } - if (number_of_stack_items > 0) { + if (types_of_stack_items.length > 0) { buf.append(", stack items={"); - for (int i = 0; i < number_of_stack_items; i++) { + for (int i = 0; i < types_of_stack_items.length; i++) { buf.append(types_of_stack_items[i]); - if (i < number_of_stack_items - 1) { + if (i < types_of_stack_items.length - 1) { buf.append(", "); } } @@ -211,19 +206,14 @@ public final class StackMapTableEntry implements Cloneable, Serializable { return byte_code_offset_delta; } - - public void setNumberOfLocals( int n ) { - number_of_locals = n; - } - - + public int getNumberOfLocals() { - return number_of_locals; + return types_of_locals.length; } - public void setTypesOfLocals( StackMapType[] t ) { - types_of_locals = t; + public void setTypesOfLocals( StackMapType[] types ) { + types_of_locals = types != null ? types : new StackMapType[0]; } @@ -232,18 +222,13 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } - public void setNumberOfStackItems( int n ) { - number_of_stack_items = n; - } - - public int getNumberOfStackItems() { - return number_of_stack_items; + return types_of_stack_items.length; } - public void setTypesOfStackItems( StackMapType[] t ) { - types_of_stack_items = t; + public void setTypesOfStackItems( StackMapType[] types ) { + types_of_stack_items = types != null ? types : new StackMapType[0]; } -- GitLab From 5f029f691332139ea0bb0e938b90799d74806a93 Mon Sep 17 00:00:00 2001 From: Emmanuel Bourg Date: Sat, 7 Mar 2015 00:23:06 +0000 Subject: [PATCH 0745/1313] =?UTF-8?q?The=20verifier=20now=20checks=20if=20?= =?UTF-8?q?methods=20with=20a=20void=20return=20type=20attempt=20to=20retu?= =?UTF-8?q?rn=20an=20object.=20Thanks=20to=20J=C3=A9r=C3=B4me=20Leroux=20(?= =?UTF-8?q?BCEL-184)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1664767 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 2 +- src/changes/changes.xml | 3 + .../structurals/InstConstraintVisitor.java | 3 + .../verifier/AbstractVerifierTestCase.java | 94 ++++++++++++++++++ .../bcel/verifier/VerifierReturnTestCase.java | 26 +++++ .../bcel/verifier/tests/TestReturn01.class | Bin 0 -> 423 bytes 6 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java create mode 100644 src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java create mode 100644 src/test/resources/org/apache/bcel/verifier/tests/TestReturn01.class diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 8c2f51c5..32fbbe7e 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -99,11 +99,11 @@ Bug fixes from 5.2 [BCEL-174] Verification of interfaces with default methods fails with Java 8 [BCEL-177] MethodParameters should read 1 byte not two for parameter count [BCEL-181] ClassLoaderRepository.loadClass(String) leaks input streams +[BCEL-184] JustIce verifier does not check correctly the returned value of a method [BCEL-194] LocalVariableGen hashCode() function is incorrrect [BCEL-197] Add support for TypeVariables to Utility.signatureToString() [BCEL-207] MethodGen.removeLocalVariable(s) doesn't remove the associated Targetters - Feedback -------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 59efe640..2b782129 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,9 @@ The type attribute can be add,update,fix,remove. + + The verifier now checks if methods with a void return type attempt to return an object. + MethodGen.removeLocalVariable now properly unreference the removed variable from the targetters of the instruction handlers delimiting the scope of the variable. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 84ecf30f..dd924902 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -413,6 +413,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } if (o instanceof ARETURN){ + if (method_type == Type.VOID){ + constraintViolated(o, "ARETURN instruction in void method."); + } if (stack().peek() == Type.NULL){ return; } diff --git a/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java b/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java new file mode 100644 index 00000000..9eab88d9 --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.bcel.verifier; + +import junit.framework.TestCase; + +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; + +public abstract class AbstractVerifierTestCase extends TestCase { + + public static final String TEST_PACKAGE = "org.apache.bcel.verifier.tests."; + + /** + * Asserts that the verification of the given class is OK. If it isn't it throws an AssertionFailedError with the given message. + * + * @param classname simple classname of the class to verify + * @param message message displayed if assertion fails + */ + public void assertVerifyOK(String classname, String message) { + final String testClassname = TEST_PACKAGE + classname; + assertTrue(message, doAllPasses(testClassname)); + } + + /** + * Asserts that the verification of the given class is rejected. If it isn't it throws an AssertionFailedError with the given message. + * + * @param classname simple classname of the class to verify + * @param message message displayed if assertion fails + */ + public void assertVerifyRejected(String classname, String message) { + final String testClassname = TEST_PACKAGE + classname; + assertFalse(message, doAllPasses(testClassname)); + } + + /** + * Executes all the verification on the given class. + * + * @param classname name of the class to verify + * @return false if the verification fails, true otherwise + */ + public boolean doAllPasses(String classname) { + int nbMethods = 0; + + try { + JavaClass jc = Repository.lookupClass(classname); + nbMethods = jc.getMethods().length; + } catch (ClassNotFoundException e) { + fail(e.getMessage()); + return false; + } + + Verifier verifier = VerifierFactory.getVerifier(classname); + VerificationResult result = verifier.doPass1(); + if (result.getStatus() != VerificationResult.VERIFIED_OK) { + return false; + } + + result = verifier.doPass2(); + if (result.getStatus() != VerificationResult.VERIFIED_OK) { + return false; + } + + for (int i = nbMethods; --i >= 0; ) { + result = verifier.doPass3a(i); + if (result.getStatus() != VerificationResult.VERIFIED_OK) { + return false; + } + result = verifier.doPass3b(i); + if (result.getStatus() != VerificationResult.VERIFIED_OK) { + return false; + } + } + + return true; + } + +} diff --git a/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java new file mode 100644 index 00000000..190c03ed --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.bcel.verifier; + +public class VerifierReturnTestCase extends AbstractVerifierTestCase { + + public void testInvalidReturn() { + assertVerifyRejected("TestReturn01", "Verification of a void method that returns an object must fail."); + } + +} diff --git a/src/test/resources/org/apache/bcel/verifier/tests/TestReturn01.class b/src/test/resources/org/apache/bcel/verifier/tests/TestReturn01.class new file mode 100644 index 0000000000000000000000000000000000000000..33020b263b11dd2fd8e5c76cbe300e1baae65f95 GIT binary patch literal 423 zcmX^0Z`VEs1_omWVRi;4Mh5NtqICVlg2d#ERQ;sn)Exb?)S}F^%+w%QjC^^+F6J)O-vUl`Asu>g+7#WxuK!AyX z5#(M5Mh12U1_pfwMg~R(1_oBG?F<|n85kIt7`PZ17}&sq%naNN3=BMAHY)=U11|#u z11AF?SQez&oB?DQ0|V!72Ik1^3>*v_;0ACpFflMNurqKlaKa7YU|?k6XAoduU|?hr I1gjJR02BRI!2kdN literal 0 HcmV?d00001 -- GitLab From 1120dfb0df6256985e85ca0f46ecf52902e0aa76 Mon Sep 17 00:00:00 2001 From: Mark Thomas Date: Sat, 7 Mar 2015 19:17:27 +0000 Subject: [PATCH 0746/1313] =?UTF-8?q?Fix=20BCEL-193=20Patch=20by=20J=C3=A9?= =?UTF-8?q?r=C3=B4me=20Leroux=20The=20verifier=20should=20not=20check=20fo?= =?UTF-8?q?r=20run=20time=20compatibility=20of=20objects=20assigned=20to?= =?UTF-8?q?=20arrays.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1664897 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 6 +- .../structurals/InstConstraintVisitor.java | 61 ++++++++---------- .../verifier/VerifierArrayAccessTestCase.java | 34 ++++++++++ .../verifier/tests/TestArrayAccess01.java | 32 +++++++++ .../verifier/tests/TestArrayAccess02.class | Bin 0 -> 565 bytes .../verifier/tests/TestArrayAccess03.class | Bin 0 -> 551 bytes .../verifier/tests/TestArrayAccess04.class | Bin 0 -> 532 bytes 7 files changed, 98 insertions(+), 35 deletions(-) create mode 100644 src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java create mode 100644 src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java create mode 100644 src/test/resources/org/apache/bcel/verifier/tests/TestArrayAccess02.class create mode 100644 src/test/resources/org/apache/bcel/verifier/tests/TestArrayAccess03.class create mode 100644 src/test/resources/org/apache/bcel/verifier/tests/TestArrayAccess04.class diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 2b782129..6c6fcf95 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -1,4 +1,4 @@ - + + + jdk-rt + + + + maven-surefire-plugin + + + **/PerformanceTest.java + + + + + + + + + benchmark diff --git a/src/changes/changes.xml b/src/changes/changes.xml index c31ef870..ac5df1d6 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,12 @@ The type attribute can be add,update,fix,remove. + + Remove ObjectType cache. + + + The verifier now checks if methods with a void return type attempt to return an object. + The verifier now checks if methods with a void return type attempt to return an object. diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index b29686a7..0678d284 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -17,9 +17,6 @@ */ package org.apache.bcel.generic; -import java.util.LinkedHashMap; -import java.util.Map; - import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; @@ -34,31 +31,9 @@ public class ObjectType extends ReferenceType { private static final long serialVersionUID = -2819379966444533294L; private final String class_name; // Class name of type - private static final int MAX_CACHE_ENTRIES = 200; - private static final int INITIAL_CACHE_CAPACITY = (int)(MAX_CACHE_ENTRIES/0.75); - private static Map cache; - - public synchronized static ObjectType getInstance(String class_name) { - if (cache == null) { - cache = new LinkedHashMap(INITIAL_CACHE_CAPACITY, 0.75f, true) { - - - private static final long serialVersionUID = 2101159231109718724L; - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > MAX_CACHE_ENTRIES; - } - - }; - } - ObjectType result = cache.get(class_name); - if (result != null) { - return result; - } - result = new ObjectType(class_name); - cache.put(class_name, result); - return result; + public static ObjectType getInstance(String class_name) { + return new ObjectType(class_name); } /** diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java index 45cad749..d7e3eda8 100644 --- a/src/test/java/org/apache/bcel/PerformanceTest.java +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -19,20 +19,23 @@ package org.apache.bcel; import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileFilter; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import junit.framework.TestCase; - import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Method; import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.InstructionList; import org.apache.bcel.generic.MethodGen; +import org.junit.Assert; + +import junit.framework.TestCase; public final class PerformanceTest extends TestCase { @@ -61,7 +64,7 @@ public final class PerformanceTest extends TestCase { } } - private static void test(int fraction) throws IOException { + private static void test(File lib) throws IOException { NanoTimer total = new NanoTimer(); NanoTimer parseTime = new NanoTimer(); NanoTimer cgenTime = new NanoTimer(); @@ -69,17 +72,15 @@ public final class PerformanceTest extends TestCase { NanoTimer mserTime = new NanoTimer(); NanoTimer serTime = new NanoTimer(); - total.start(); - - String javaHome = System.getProperty("java.home"); + System.out.println("parsing " + lib); - JarFile jar = new JarFile(javaHome + "/lib/rt.jar"); + total.start(); + JarFile jar = new JarFile(lib); Enumeration en = jar.entries(); - int i = 0; while (en.hasMoreElements()) { JarEntry e = (JarEntry) en.nextElement(); - if (e.getName().endsWith(".class") && i++ % fraction == 0) { + if (e.getName().endsWith(".class")) { InputStream in = jar.getInputStream(e); byte[] bytes = read(in); @@ -127,9 +128,20 @@ public final class PerformanceTest extends TestCase { } public void testPerformance() throws IOException { - test(1); - test(1); - test(1); + File javaLib = new File(System.getProperty("java.home") + "/lib"); + javaLib.listFiles(new FileFilter() { + + public boolean accept(File file) { + if(file.getName().endsWith(".jar")) { + try { + test(file); + } catch (IOException e) { + Assert.fail(e.getMessage()); + } + } + return false; + } + }); } } -- GitLab From 48426e0049b01d86b2af3b0cd4c7452a98bbcaaf Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Sat, 18 Jul 2015 04:56:40 +0000 Subject: [PATCH 0752/1313] BCEL-187 Verification error when an invoke references a method defined in superclass git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1691680 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 4 +- src/changes/changes.xml | 3 + .../bcel/verifier/statics/Pass3aVerifier.java | 105 ++++++++++-------- .../verifier/AbstractVerifierTestCase.java | 4 +- .../bcel/verifier/VerifierInvokeTestCase.java | 41 +++++++ .../tests/TestLegalInvokeInterface01.java | 12 ++ .../tests/TestLegalInvokeSpecial01.java | 9 ++ .../tests/TestLegalInvokeSpecial02.java | 11 ++ .../tests/TestLegalInvokeStatic01.java | 9 ++ .../tests/TestLegalInvokeVirtual01.java | 9 ++ .../tests/TestLegalInvokeVirtual02.java | 11 ++ 11 files changed, 170 insertions(+), 48 deletions(-) create mode 100644 src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java create mode 100755 src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java create mode 100755 src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java create mode 100755 src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java create mode 100755 src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java create mode 100755 src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java create mode 100755 src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java diff --git a/pom.xml b/pom.xml index b4ca4e24..ea292e56 100644 --- a/pom.xml +++ b/pom.xml @@ -41,8 +41,8 @@ ISO-8859-1 UTF-8 - 1.7 - 1.7 + 1.5 + 1.5 bcel 6.0 (Java 5.0+) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index ac5df1d6..df3e9534 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,9 @@ The type attribute can be add,update,fix,remove. + + Verification error when an invoke references a method defined in superclass + Remove ObjectType cache. diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index bdef8de3..4d13b0a3 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -1079,18 +1079,9 @@ public final class Pass3aVerifier extends PassVerifier{ // too. So are the allowed method names. String classname = o.getClassName(cpg); JavaClass jc = Repository.lookupClass(classname); - Method[] ms = jc.getMethods(); - Method m = null; - for (Method element : ms) { - if ( (element.getName().equals(o.getMethodName(cpg))) && - (Type.getReturnType(element.getSignature()).equals(o.getReturnType(cpg))) && - (objarrayequals(Type.getArgumentTypes(element.getSignature()), o.getArgumentTypes(cpg))) ){ - m = element; - break; - } - } + Method m = getMethodRecursive(jc, o); if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'. The native verifier does allow the method to be declared in some superinterface, which the Java Virtual Machine Specification, Second Edition does not."); + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'."); } if (jc.isClass()){ constraintViolated(o, "Referenced class '"+jc.getClassName()+"' is a class, but not an interface as expected."); @@ -1101,6 +1092,59 @@ public final class Pass3aVerifier extends PassVerifier{ } } + /** + * Looks for the method referenced by the given invoke instruction in the given class or its super classes and super interfaces. + * @param jc the class that defines the referenced method + * @param invoke the instruction that references the method + * @return the referenced method or null if not found. + */ + private Method getMethodRecursive(JavaClass jc, InvokeInstruction invoke) throws ClassNotFoundException{ + Method m; + //look in the given class + m = getMethod(jc, invoke); + if(m != null){ + //method found in given class + return m; + } + //method not found, look in super classes + for(JavaClass superclass : jc.getSuperClasses()){ + m = getMethod(superclass, invoke); + if(m != null){ + //method found in super class + return m; + } + } + //method not found, look in super interfaces + for(JavaClass superclass : jc.getInterfaces()){ + m = getMethod(superclass, invoke); + if(m != null){ + //method found in super interface + return m; + } + } + //method not found in the hierarchy + return null; + } + /** + * Looks for the method referenced by the given invoke instruction in the given class. + * @param jc the class that defines the referenced method + * @param invoke the instruction that references the method + * @return the referenced method or null if not found. + */ + private Method getMethod(JavaClass jc, InvokeInstruction invoke){ + Method[] ms = jc.getMethods(); + Method m = null; + for (Method element : ms) { + if ( (element.getName().equals(invoke.getMethodName(cpg))) && + (Type.getReturnType(element.getSignature()).equals(invoke.getReturnType(cpg))) && + (objarrayequals(Type.getArgumentTypes(element.getSignature()), invoke.getArgumentTypes(cpg))) ){ + return element; + } + } + + return null; + } + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override public void visitINVOKESPECIAL(INVOKESPECIAL o){ @@ -1111,18 +1155,9 @@ public final class Pass3aVerifier extends PassVerifier{ // too. So are the allowed method names. String classname = o.getClassName(cpg); JavaClass jc = Repository.lookupClass(classname); - Method[] ms = jc.getMethods(); - Method m = null; - for (Method element : ms) { - if ( (element.getName().equals(o.getMethodName(cpg))) && - (Type.getReturnType(element.getSignature()).equals(o.getReturnType(cpg))) && - (objarrayequals(Type.getArgumentTypes(element.getSignature()), o.getArgumentTypes(cpg))) ){ - m = element; - break; - } - } + Method m = getMethodRecursive(jc, o); if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'. The native verifier does allow the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'."); } JavaClass current = Repository.lookupClass(myOwner.getClassName()); @@ -1177,18 +1212,9 @@ public final class Pass3aVerifier extends PassVerifier{ // too. So are the allowed method names. String classname = o.getClassName(cpg); JavaClass jc = Repository.lookupClass(classname); - Method[] ms = jc.getMethods(); - Method m = null; - for (Method element : ms) { - if ( (element.getName().equals(o.getMethodName(cpg))) && - (Type.getReturnType(element.getSignature()).equals(o.getReturnType(cpg))) && - (objarrayequals(Type.getArgumentTypes(element.getSignature()), o.getArgumentTypes(cpg))) ){ - m = element; - break; - } - } + Method m = getMethodRecursive(jc, o); if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg) +"' not found in class '"+jc.getClassName()+"'. The native verifier possibly allows the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg) +"' not found in class '"+jc.getClassName()+"'."); } else if (! (m.isStatic())){ // implies it's not abstract, verified in pass 2. constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' has ACC_STATIC unset."); } @@ -1210,18 +1236,9 @@ public final class Pass3aVerifier extends PassVerifier{ // too. So are the allowed method names. String classname = o.getClassName(cpg); JavaClass jc = Repository.lookupClass(classname); - Method[] ms = jc.getMethods(); - Method m = null; - for (Method element : ms) { - if ( (element.getName().equals(o.getMethodName(cpg))) && - (Type.getReturnType(element.getSignature()).equals(o.getReturnType(cpg))) && - (objarrayequals(Type.getArgumentTypes(element.getSignature()), o.getArgumentTypes(cpg))) ){ - m = element; - break; - } - } + Method m = getMethodRecursive(jc, o); if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'. The native verifier does allow the method to be declared in some superclass or implemented interface, which the Java Virtual Machine Specification, Second Edition does not."); + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'."); } if (! (jc.isClass())){ constraintViolated(o, "Referenced class '"+jc.getClassName()+"' is an interface, but not a class as expected."); diff --git a/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java b/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java index 9eab88d9..da5257bf 100644 --- a/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java +++ b/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java @@ -18,11 +18,11 @@ package org.apache.bcel.verifier; -import junit.framework.TestCase; - import org.apache.bcel.Repository; import org.apache.bcel.classfile.JavaClass; +import junit.framework.TestCase; + public abstract class AbstractVerifierTestCase extends TestCase { public static final String TEST_PACKAGE = "org.apache.bcel.verifier.tests."; diff --git a/src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java new file mode 100644 index 00000000..c93a0d47 --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.bcel.verifier; + + +public class VerifierInvokeTestCase extends AbstractVerifierTestCase { + + public void testLegalInvokeVirtual() { + assertVerifyOK("TestLegalInvokeVirtual01", "Verification of invokevirtual on method defined in superclass must pass."); + assertVerifyOK("TestLegalInvokeVirtual02", "Verification of invokevirtual on method defined in superinterface must pass."); + } + + public void testLegalInvokeStatic() { + assertVerifyOK("TestLegalInvokeStatic01", "Verification of invokestatic on method defined in superclass must pass."); + } + + public void testLegalInvokeInterface() { + assertVerifyOK("TestLegalInvokeInterface01", "Verification of invokeinterface on method defined in superinterface must pass."); + } + + public void testLegalInvokeSpecial() { + assertVerifyOK("TestLegalInvokeSpecial01", "Verification of invokespecial on method defined in superclass must pass."); + assertVerifyOK("TestLegalInvokeSpecial02", "Verification of invokespecial on method defined in superclass must pass."); + } +} diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java new file mode 100755 index 00000000..72ca5606 --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java @@ -0,0 +1,12 @@ +package org.apache.bcel.verifier.tests; + +public class TestLegalInvokeInterface01{ + + public static void test1(Interface01 t){ + t.run(); + } +} + +interface Interface01 extends Runnable { + +} \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java new file mode 100755 index 00000000..25f2d955 --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java @@ -0,0 +1,9 @@ +package org.apache.bcel.verifier.tests; + +public class TestLegalInvokeSpecial01{ + + public static void test1(){ + new TestLegalInvokeSpecial01().getClass(); + } + +} diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java new file mode 100755 index 00000000..e5f73722 --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java @@ -0,0 +1,11 @@ +package org.apache.bcel.verifier.tests; + +abstract public class TestLegalInvokeSpecial02 implements Runnable{ + + public static void test1(TestLegalInvokeSpecial02 t, int i){ + if(i > 0){ + t.run(); + } + } + +} diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java new file mode 100755 index 00000000..592f7692 --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java @@ -0,0 +1,9 @@ +package org.apache.bcel.verifier.tests; + +public class TestLegalInvokeStatic01 extends Thread{ + + public static void test1() throws InterruptedException{ + Thread.sleep(0); + } + +} diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java new file mode 100755 index 00000000..81e23cef --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java @@ -0,0 +1,9 @@ +package org.apache.bcel.verifier.tests; + +public class TestLegalInvokeVirtual01 { + + public static void test1(){ + new TestLegalInvokeVirtual01().toString(); + } + +} diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java new file mode 100755 index 00000000..a45cba17 --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java @@ -0,0 +1,11 @@ +package org.apache.bcel.verifier.tests; + +abstract public class TestLegalInvokeVirtual02 implements Runnable{ + + public static void test1(TestLegalInvokeVirtual02 t, int i){ + if(i > 0){ + t.run(); + } + } + +} -- GitLab From 763333c2572c5ebcb8f1d09c32876da987741c54 Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Sun, 19 Jul 2015 21:10:46 +0000 Subject: [PATCH 0753/1313] BCEL-209 Bug fixes and improvements to InvokeDynamic and BootStrapMethods implementation git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1691855 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 3 + src/main/java/org/apache/bcel/Constants.java | 12 +- .../bcel/classfile/BootstrapMethod.java | 89 ++++++++++++-- .../bcel/classfile/BootstrapMethods.java | 52 +++++++++ .../org/apache/bcel/classfile/ConstantCP.java | 47 ++++++-- .../bcel/classfile/ConstantInvokeDynamic.java | 58 ++-------- .../apache/bcel/classfile/ConstantPool.java | 12 +- .../bcel/classfile/DescendingVisitor.java | 27 +++-- .../apache/bcel/classfile/EmptyVisitor.java | 12 +- .../org/apache/bcel/classfile/Utility.java | 39 ++++--- .../org/apache/bcel/classfile/Visitor.java | 2 + .../apache/bcel/generic/ConstantPoolGen.java | 16 ++- .../org/apache/bcel/generic/EmptyVisitor.java | 3 - .../apache/bcel/generic/FieldOrMethod.java | 31 ++++- .../org/apache/bcel/generic/GETFIELD.java | 1 - .../org/apache/bcel/generic/GETSTATIC.java | 1 - .../apache/bcel/generic/INVOKEDYNAMIC.java | 109 ++++-------------- .../apache/bcel/generic/INVOKEINTERFACE.java | 1 - .../apache/bcel/generic/INVOKESPECIAL.java | 1 - .../org/apache/bcel/generic/INVOKESTATIC.java | 1 - .../apache/bcel/generic/INVOKEVIRTUAL.java | 1 - .../bcel/generic/InstructionFactory.java | 28 ++++- .../bcel/generic/InvokeInstruction.java | 2 +- .../org/apache/bcel/generic/PUTFIELD.java | 1 - .../org/apache/bcel/generic/PUTSTATIC.java | 1 - .../java/org/apache/bcel/generic/Visitor.java | 9 +- .../java/org/apache/bcel/util/CodeHTML.java | 17 ++- .../apache/bcel/util/InstructionFinder.java | 16 +-- .../bcel/verifier/statics/Pass3aVerifier.java | 7 ++ .../structurals/ExecutionVisitor.java | 21 ++++ .../structurals/InstConstraintVisitor.java | 8 ++ .../apache/bcel/visitors/CounterVisitor.java | 5 + 32 files changed, 411 insertions(+), 222 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index df3e9534..f974057c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,9 @@ The type attribute can be add,update,fix,remove. + + Bug fixes and improvements to InvokeDynamic and BootStrapMethods implementation + Verification error when an invoke references a method defined in superclass diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index dd8ca74d..e2c59702 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -1170,7 +1170,7 @@ public interface Constants { 0/*dreturn*/, 0/*areturn*/, 0/*return*/, 2/*getstatic*/, 2/*putstatic*/, 2/*getfield*/, 2/*putfield*/, 2/*invokevirtual*/, 2/*invokespecial*/, 2/*invokestatic*/, - 4/*invokeinterface*/, 5/*invokedynamic*/, 2/*new*/, + 4/*invokeinterface*/, 4/*invokedynamic*/, 2/*new*/, 1/*newarray*/, 2/*anewarray*/, 0/*arraylength*/, 0/*athrow*/, 2/*checkcast*/, 2/*instanceof*/, 0/*monitorenter*/, @@ -1525,9 +1525,9 @@ public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUN public static final byte REF_newInvokeSpecial = 8; public static final byte REF_invokeInterface = 9; - public static final String[] REF_NAMES = { - "getfield", "getstatic", "putfield", - "putstatic", "invokevirtual", "invokestatic", - "invokespecial", "new dup invokespecial", "invokeinterface" - }; + /** The names of the referencd_kinds of a CONSTANT_MethodHandle_info. */ + public static final String[] METHODHANDLE_NAMES = { + "", "getField", "getStatic", "putField", "putStatic", "invokeVirtual", + "invokeStatic", "invokeSpecial", "newInvokeSpecial", "invokeInterface" }; + } diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java index 26470891..47361618 100644 --- a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java @@ -22,8 +22,12 @@ import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; +import org.apache.bcel.Constants; + /** - * Entry of the bootstrap_methods table. + * This class represents a bootstrap method attribute, i.e., the bootstrap + * method ref, the number of bootstrap arguments and an array of the + * bootstrap arguments. * * @see The class File Format : The BootstrapMethods Attribute * @since 6.0 @@ -35,10 +39,17 @@ public class BootstrapMethod implements Serializable, Cloneable { /** Index of the CONSTANT_MethodHandle_info structure in the constant_pool table */ private int bootstrap_method_ref; + private int num_bootstrap_arguments; + /** Array of references to the constant_pool table */ private int[] bootstrap_arguments; - public BootstrapMethod() { + + /** + * Initialize from another object. + */ + public BootstrapMethod(BootstrapMethod c) { + this(c.getBootstrapMethodRef(), c.getNumBootstrapArguments(), c.getBootstrapArguments()); } /** @@ -46,37 +57,95 @@ public class BootstrapMethod implements Serializable, Cloneable { * * @param input Input stream * @throws IOException - * @throws ClassFormatException */ - BootstrapMethod(DataInput input) throws IOException, ClassFormatException { - bootstrap_method_ref = input.readUnsignedShort(); + BootstrapMethod(DataInput input) throws IOException { + this(input.readUnsignedShort(), input.readUnsignedShort(), (int[]) null); - int num_bootstrap_methods = input.readUnsignedShort(); - - bootstrap_arguments = new int[num_bootstrap_methods]; - for (int i = 0; i < num_bootstrap_methods; i++) { + bootstrap_arguments = new int[num_bootstrap_arguments]; + for (int i = 0; i < num_bootstrap_arguments; i++) { bootstrap_arguments[i] = input.readUnsignedShort(); } } + + /** + * @param bootstrap_method_ref int index into constant_pool of CONSTANT_MethodHandle + * @param num_bootstrap_arguments int count of number of boostrap arguments + * @param bootstrap_arguments int[] indices into constant_pool of CONSTANT__info + */ + public BootstrapMethod(int bootstrap_method_ref, int num_bootstrap_arguments, int[] bootstrap_arguments) { + this.bootstrap_method_ref = bootstrap_method_ref; + this.num_bootstrap_arguments = num_bootstrap_arguments; + this.bootstrap_arguments = bootstrap_arguments; + } + + /** + * @return index into constant_pool of bootstrap_method + */ public int getBootstrapMethodRef() { return bootstrap_method_ref; } + /** + * @param bootstrap_method_ref int index into constant_pool of CONSTANT_MethodHandle + */ public void setBootstrapMethodRef(int bootstrap_method_ref) { this.bootstrap_method_ref = bootstrap_method_ref; } + /** + * @return int[] of bootstrap_method indices into constant_pool of CONSTANT__info + */ public int[] getBootstrapArguments() { return bootstrap_arguments; } + /** + * @return count of number of boostrap arguments + */ + public int getNumBootstrapArguments() { + return num_bootstrap_arguments; + } + + /** + * @param bootstrap_arguments int[] indices into constant_pool of CONSTANT__info + */ public void setBootstrapArguments(int[] bootstrap_arguments) { this.bootstrap_arguments = bootstrap_arguments; } /** - * Dump object to file stream on binary format. + * @return String representation. + */ + @Override + public final String toString() { + return "BootstrapMethod(" + bootstrap_method_ref + ", " + num_bootstrap_arguments + ", " + //UNDONE + //+ bootstrap_arguments + ")"; + + "UNDONE)"; + } + + /** + * @return Resolved string representation + */ + public final String toString( ConstantPool constant_pool ) { + StringBuilder buf = new StringBuilder(); + String bootstrap_method_name; + bootstrap_method_name = constant_pool.constantToString(bootstrap_method_ref, + Constants.CONSTANT_MethodHandle); + buf.append(Utility.compactClassName(bootstrap_method_name)); + if (num_bootstrap_arguments > 0) { + buf.append("\n Method Arguments:"); + for (int i = 0; i < num_bootstrap_arguments; i++) { + buf.append("\n ").append(i).append(": "); + buf.append(constant_pool.constantToString(constant_pool.getConstant(bootstrap_arguments[i]))); + } + } + return buf.toString(); + } + + /** + * Dump object to file stream in binary format. * * @param file Output file stream * @throws IOException diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java index 8978af1d..911ea1e8 100644 --- a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java +++ b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java @@ -35,11 +35,35 @@ public class BootstrapMethods extends Attribute { private BootstrapMethod[] bootstrap_methods; + /** + * Initialize from another object. Note that both objects use the same + * references (shallow copy). Use clone() for a physical copy. + */ + public BootstrapMethods(BootstrapMethods c) { + this(c.getNameIndex(), c.getLength(), c.getBootstrapMethods(), c.getConstantPool()); + } + + + /** + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param bootstrap_methods array of bootstrap methods + * @param constant_pool Array of constants + */ public BootstrapMethods(int name_index, int length, BootstrapMethod[] bootstrap_methods, ConstantPool constant_pool) { super(Constants.ATTR_BOOTSTRAP_METHODS, name_index, length, constant_pool); this.bootstrap_methods = bootstrap_methods; } + /** + * Construct object from Input stream. + * + * @param name_index Index in constant pool to CONSTANT_Utf8 + * @param length Content length in bytes + * @param input Input stream + * @param constant_pool Array of constants + * @throws IOException + */ BootstrapMethods(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { this(name_index, length, (BootstrapMethod[]) null, constant_pool); @@ -50,19 +74,31 @@ public class BootstrapMethods extends Attribute { } } + /** + * @return array of bootstrap method "records" + */ public final BootstrapMethod[] getBootstrapMethods() { return bootstrap_methods; } + /** + * @param bootstrap_methods the array of bootstrap methods + */ public final void setBootstrapMethods(BootstrapMethod[] bootstrap_methods) { this.bootstrap_methods = bootstrap_methods; } + /** + * @param v Visitor object + */ @Override public void accept(Visitor v) { v.visitBootstrapMethods(this); } + /** + * @return deep copy of this attribute + */ @Override public BootstrapMethods copy(ConstantPool _constant_pool) { BootstrapMethods c = (BootstrapMethods) clone(); @@ -90,4 +126,20 @@ public class BootstrapMethods extends Attribute { bootstrap_method.dump(file); } } + + /** + * @return String representation. + */ + @Override + public final String toString() { + StringBuilder buf = new StringBuilder(); + buf.append("BootstrapMethods("); + buf.append(bootstrap_methods.length); + buf.append("):\n"); + for (int i = 0; i < bootstrap_methods.length; i++) { + buf.append(" ").append(i).append(": "); + buf.append(bootstrap_methods[i].toString(constant_pool)).append("\n"); + } + return buf.toString(); + } } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantCP.java b/src/main/java/org/apache/bcel/classfile/ConstantCP.java index 01cc7f53..21255ebe 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantCP.java @@ -24,20 +24,25 @@ import java.io.IOException; import org.apache.bcel.Constants; /** - * Abstract super class for Fieldref and Methodref constants. + * Abstract super class for Fieldref, Methodref, InterfaceMethodref and + * InvokeDynamic constants. * * @version $Id$ * @author M. Dahm * @see ConstantFieldref * @see ConstantMethodref * @see ConstantInterfaceMethodref + * @see ConstantInvokeDynamic */ public abstract class ConstantCP extends Constant { private static final long serialVersionUID = -6275762995206209402L; /** References to the constants containing the class and the field signature */ + // Note that this field is used to store the + // bootstrap_method_attr_index of a ConstantInvokeDynamic. protected int class_index; // TODO make private (has getter & setter) + // This field has the same meaning for all subclasses. protected int name_and_type_index; // TODO make private (has getter & setter) @@ -87,7 +92,7 @@ public abstract class ConstantCP extends Constant { /** - * @return Reference (index) to class this field or method belongs to. + * @return Reference (index) to class this constant refers to. */ public final int getClassIndex() { return class_index; @@ -95,10 +100,13 @@ public abstract class ConstantCP extends Constant { /** - * @return Reference (index) to signature of the field. + * @return Reference (index) to bootstrap method this constant refers to. + * + * Note that this method is a functional duplicate of getClassIndex + * for use by ConstantInvokeDynamic. */ - public final int getNameAndTypeIndex() { - return name_and_type_index; + public final int getBootstrapMethodAttrIndex() { + return class_index; // AKA bootstrap_method_attr_index } @@ -111,10 +119,21 @@ public abstract class ConstantCP extends Constant { /** - * @return Class this field belongs to. + * @param bootstrap_method_attr_index points to a BootstrapMethod. + * + * Note that this method is a functional duplicate of setClassIndex + * for use by ConstantInvokeDynamic. */ - public String getClass( ConstantPool cp ) { - return cp.constantToString(class_index, Constants.CONSTANT_Class); + public final void setBootstrapMethodAttrIndex(int bootstrap_method_attr_index) { + this.class_index = bootstrap_method_attr_index; + } + + + /** + * @return Reference (index) to signature of the field. + */ + public final int getNameAndTypeIndex() { + return name_and_type_index; } @@ -126,11 +145,21 @@ public abstract class ConstantCP extends Constant { } + /** + * @return Class this field belongs to. + */ + public String getClass( ConstantPool cp ) { + return cp.constantToString(class_index, Constants.CONSTANT_Class); + } + + /** * @return String representation. + * + * not final as ConstantInvokeDynamic needs to modify */ @Override - public final String toString() { + public String toString() { return super.toString() + "(class_index = " + class_index + ", name_and_type_index = " + name_and_type_index + ")"; } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java b/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java index 539213a7..3378af9b 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java @@ -18,7 +18,6 @@ package org.apache.bcel.classfile; import java.io.DataInput; -import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Constants; @@ -31,18 +30,15 @@ import org.apache.bcel.Constants; * @see Constant * @since 6.0 */ -public final class ConstantInvokeDynamic extends Constant { +public final class ConstantInvokeDynamic extends ConstantCP { private static final long serialVersionUID = 4310367359017396174L; - private int bootstrap_method_attr_index; - private int name_and_type_index; - /** * Initialize from another object. */ public ConstantInvokeDynamic(ConstantInvokeDynamic c) { - this(c.getBootstrapMethodAttrIndex(), c.getNameAndTypeIndex()); + super(Constants.CONSTANT_InvokeDynamic, c.getBootstrapMethodAttrIndex(), c.getNameAndTypeIndex()); } @@ -53,15 +49,12 @@ public final class ConstantInvokeDynamic extends Constant { * @throws IOException */ ConstantInvokeDynamic(DataInput file) throws IOException { - this(file.readUnsignedShort(), file.readUnsignedShort()); + super(Constants.CONSTANT_InvokeDynamic, file); } - public ConstantInvokeDynamic(int bootstrap_method_attr_index, - int name_and_type_index) { - super(Constants.CONSTANT_InvokeDynamic); - this.bootstrap_method_attr_index = bootstrap_method_attr_index; - this.name_and_type_index = name_and_type_index; + public ConstantInvokeDynamic(int bootstrap_method_attr_index, int name_and_type_index) { + super(Constants.CONSTANT_InvokeDynamic, bootstrap_method_attr_index, name_and_type_index); } @@ -74,41 +67,7 @@ public final class ConstantInvokeDynamic extends Constant { */ @Override public void accept( Visitor v ) { - // TODO Add .visitMethodType to Visitor interface - } - - - /** - * Dump name and signature index to file stream in binary format. - * - * @param file Output file stream - * @throws IOException - */ - @Override - public final void dump( DataOutputStream file ) throws IOException { - file.writeByte(tag); - file.writeShort(bootstrap_method_attr_index); - file.writeShort(name_and_type_index); - } - - - public int getBootstrapMethodAttrIndex() { - return bootstrap_method_attr_index; - } - - - public void setBootstrapMethodAttrIndex(int bootstrap_method_attr_index) { - this.bootstrap_method_attr_index = bootstrap_method_attr_index; - } - - - public int getNameAndTypeIndex() { - return name_and_type_index; - } - - - public void setNameAndTypeIndex(int name_and_type_index) { - this.name_and_type_index = name_and_type_index; + v.visitConstantInvokeDynamic(this); } @@ -117,8 +76,7 @@ public final class ConstantInvokeDynamic extends Constant { */ @Override public final String toString() { - return super.toString() + "(bootstrap_method_attr_index = " + - bootstrap_method_attr_index + ", name_and_type_index = " + - name_and_type_index + ")"; + // UNDONE: need to string replace "class_index" with "bootstrap_method_attr_index" + return super.toString(); } } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index 5daf5833..e9a8a33f 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -132,7 +132,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { case Constants.CONSTANT_NameAndType: str = (constantToString(((ConstantNameAndType) c).getNameIndex(), Constants.CONSTANT_Utf8) - + " " + constantToString(((ConstantNameAndType) c).getSignatureIndex(), + + ":" + constantToString(((ConstantNameAndType) c).getSignatureIndex(), Constants.CONSTANT_Utf8)); break; case Constants.CONSTANT_InterfaceMethodref: @@ -143,8 +143,12 @@ public class ConstantPool implements Cloneable, Node, Serializable { Constants.CONSTANT_NameAndType)); break; case Constants.CONSTANT_MethodHandle: + // Note that the ReferenceIndex may point to a Fieldref, Methodref or + // InterfaceMethodref - so we need to peek ahead to get the actual type. ConstantMethodHandle cmh = (ConstantMethodHandle) c; - str = Constants.REF_NAMES[cmh.getReferenceKind()] + " " + constantToString(constant_pool[cmh.getReferenceIndex()]); + str = Constants.METHODHANDLE_NAMES[cmh.getReferenceKind()] + + " " + constantToString(cmh.getReferenceIndex(), + getConstant(cmh.getReferenceIndex()).getTag()); break; case Constants.CONSTANT_MethodType: ConstantMethodType cmt = (ConstantMethodType) c; @@ -152,7 +156,9 @@ public class ConstantPool implements Cloneable, Node, Serializable { break; case Constants.CONSTANT_InvokeDynamic: ConstantInvokeDynamic cid = ((ConstantInvokeDynamic) c); - str = cid.getBootstrapMethodAttrIndex() + ": " + constantToString(cid.getNameAndTypeIndex(), Constants.CONSTANT_NameAndType); + str = cid.getBootstrapMethodAttrIndex() + + ":" + constantToString(cid.getNameAndTypeIndex(), + Constants.CONSTANT_NameAndType); break; default: // Never reached throw new RuntimeException("Unknown constant type " + tag); diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index a7527626..bb6c550e 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -312,6 +312,14 @@ public class DescendingVisitor implements Visitor stack.pop(); } + public void visitConstantInvokeDynamic( + ConstantInvokeDynamic constant) + { + stack.push(constant); + constant.accept(visitor); + stack.pop(); + } + public void visitConstantLong(ConstantLong constant) { stack.push(constant); @@ -365,6 +373,18 @@ public class DescendingVisitor implements Visitor stack.pop(); } + public void visitBootstrapMethods(BootstrapMethods bm) + { + stack.push(bm); + bm.accept(visitor); + // BootstrapMethod[] bms = bm.getBootstrapMethods(); + // for (int i = 0; i < bms.length; i++) + // { + // bms[i].accept(this); + // } + stack.pop(); + } + public void visitDeprecated(Deprecated attribute) { stack.push(attribute); @@ -428,13 +448,6 @@ public class DescendingVisitor implements Visitor stack.pop(); } - public void visitBootstrapMethods(BootstrapMethods obj) - { - stack.push(obj); - obj.accept(visitor); - stack.pop(); - } - public void visitMethodParameters(MethodParameters obj) { stack.push(obj); diff --git a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java index bc5346ef..42bc30fe 100644 --- a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -78,6 +78,10 @@ public class EmptyVisitor implements Visitor { } + public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj) + { + } + public void visitConstantLong(ConstantLong obj) { } @@ -126,6 +130,10 @@ public class EmptyVisitor implements Visitor { } + public void visitBootstrapMethods(BootstrapMethods obj) + { + } + public void visitJavaClass(JavaClass obj) { } @@ -190,10 +198,6 @@ public class EmptyVisitor implements Visitor { } - public void visitBootstrapMethods(BootstrapMethods obj) - { - } - public void visitMethodParameters(MethodParameters obj) { } diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 72f88338..816c5330 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -340,14 +340,18 @@ public abstract class Utility { */ case Constants.INVOKESPECIAL: case Constants.INVOKESTATIC: - case Constants.INVOKEVIRTUAL: index = bytes.readUnsignedShort(); Constant c = constant_pool.getConstant(index); - if (c.getTag() != Constants.CONSTANT_Methodref && c.getTag() != Constants.CONSTANT_InterfaceMethodref) { - throw new ClassFormatException("Expected class `CONSTANT_Methodref' or 'CONSTANT_InterfaceMethodref' at index " + index + " and got " +c); - } + // With Java8 operand may be either a CONSTANT_Methodref + // or a CONSTANT_InterfaceMethodref. (markro) + buf.append("\t").append( + constant_pool.constantToString(index, c.getTag())) + .append((verbose ? " (" + index + ")" : "")); + break; + case Constants.INVOKEVIRTUAL: + index = bytes.readUnsignedShort(); buf.append("\t").append( - constant_pool.constantToString(c)) + constant_pool.constantToString(index, Constants.CONSTANT_Methodref)) .append((verbose ? " (" + index + ")" : "")); break; case Constants.INVOKEINTERFACE: @@ -361,14 +365,12 @@ public abstract class Utility { break; case Constants.INVOKEDYNAMIC: index = bytes.readUnsignedShort(); - int ignored = bytes.readUnsignedShort(); - ConstantInvokeDynamic id = (ConstantInvokeDynamic) constant_pool.getConstant(index, Constants.CONSTANT_InvokeDynamic); - buf.append("\t").append(".").append( + buf.append("\t").append( constant_pool - .constantToString(id.getNameAndTypeIndex(), Constants.CONSTANT_NameAndType)); - if (verbose) { - buf.append(" (" + index + "/" + id.getNameAndTypeIndex() +")"); - } + .constantToString(index, Constants.CONSTANT_InvokeDynamic)) + .append(verbose ? " (" + index + ")\t" : "") + .append(bytes.readUnsignedByte()) // Thrid byte is a reserved space + .append(bytes.readUnsignedByte()); // Last byte is a reserved space break; /* Operands are references to items in constant pool */ @@ -829,7 +831,18 @@ public abstract class Utility { return compactClassName(signature.substring(1, index), chopit); } case 'L': { // Full class name - int index = signature.indexOf(';'); // Look for closing `;' + // should this be a while loop? can there be more than + // one generic clause? (markro) + int fromIndex = signature.indexOf('<'); // generic type? + if (fromIndex < 0) { + fromIndex = 0; + } else { + fromIndex = signature.indexOf('>', fromIndex); + if (fromIndex < 0) { + throw new ClassFormatException("Invalid signature: " + signature); + } + } + int index = signature.indexOf(';', fromIndex); // Look for closing `;' if (index < 0) { throw new ClassFormatException("Invalid signature: " + signature); } diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java index 48f3aea8..58c1f1b8 100644 --- a/src/main/java/org/apache/bcel/classfile/Visitor.java +++ b/src/main/java/org/apache/bcel/classfile/Visitor.java @@ -43,6 +43,8 @@ public interface Visitor void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj); + void visitConstantInvokeDynamic(ConstantInvokeDynamic obj); + void visitConstantLong(ConstantLong obj); void visitConstantMethodref(ConstantMethodref obj); diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index 924cbdf2..94480d9a 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -28,6 +28,7 @@ import org.apache.bcel.classfile.ConstantFieldref; import org.apache.bcel.classfile.ConstantFloat; import org.apache.bcel.classfile.ConstantInteger; import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantInvokeDynamic; import org.apache.bcel.classfile.ConstantLong; import org.apache.bcel.classfile.ConstantMethodref; import org.apache.bcel.classfile.ConstantNameAndType; @@ -127,14 +128,25 @@ public class ConstantPoolGen implements java.io.Serializable { } } else if (c instanceof ConstantCP) { ConstantCP m = (ConstantCP) c; + String class_name; + ConstantUtf8 u8; + + if (c instanceof ConstantInvokeDynamic) { + class_name = Integer.toString(m.getBootstrapMethodAttrIndex()); + // since name can't begin with digit, can use + // METHODREF_DELIM with out fear of duplicates. + } else { ConstantClass clazz = (ConstantClass) constants[m.getClassIndex()]; + u8 = (ConstantUtf8) constants[clazz.getNameIndex()]; + class_name = u8.getBytes().replace('/', '.'); + } + ConstantNameAndType n = (ConstantNameAndType) constants[m.getNameAndTypeIndex()]; - ConstantUtf8 u8 = (ConstantUtf8) constants[clazz.getNameIndex()]; - String class_name = u8.getBytes().replace('/', '.'); u8 = (ConstantUtf8) constants[n.getNameIndex()]; String method_name = u8.getBytes(); u8 = (ConstantUtf8) constants[n.getSignatureIndex()]; String signature = u8.getBytes(); + String delim = METHODREF_DELIM; if (c instanceof ConstantInterfaceMethodref) { delim = IMETHODREF_DELIM; diff --git a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java index ca6a23a0..6af8f933 100644 --- a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java @@ -744,9 +744,6 @@ public abstract class EmptyVisitor implements Visitor { public void visitBREAKPOINT( BREAKPOINT obj ) { } - public void visitNameSignatureInstruction(NameSignatureInstruction obj) { - } - public void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj) { } } diff --git a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java index 9cbfd8f6..f9a926af 100644 --- a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java @@ -18,7 +18,12 @@ package org.apache.bcel.generic; import org.apache.bcel.classfile.ConstantCP; +import org.apache.bcel.classfile.ConstantNameAndType; import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; + +// We have removed Deprecated from getClassName() as we continue to use +// it with our tools and want to remove warnings. (markro) /** * Super class for InvokeInstruction and FieldInstruction, since they have @@ -27,7 +32,7 @@ import org.apache.bcel.classfile.ConstantPool; * @version $Id$ * @author M. Dahm */ -public abstract class FieldOrMethod extends NameSignatureInstruction implements LoadClass { +public abstract class FieldOrMethod extends CPInstruction implements LoadClass { private static final long serialVersionUID = 2036985877748835708L; @@ -48,8 +53,28 @@ public abstract class FieldOrMethod extends NameSignatureInstruction implements } + /** @return signature of referenced method/field. + */ + public String getSignature( ConstantPoolGen cpg ) { + ConstantPool cp = cpg.getConstantPool(); + ConstantCP cmr = (ConstantCP) cp.getConstant(index); + ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); + return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes(); + } + + + /** @return name of referenced method/field. + */ + public String getName( ConstantPoolGen cpg ) { + ConstantPool cp = cpg.getConstantPool(); + ConstantCP cmr = (ConstantCP) cp.getConstant(index); + ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); + return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); + } + + /** @return name of the referenced class/interface - * @deprecated If the instruction references an array class, + * deprecated If the instruction references an array class, * this method will return "java.lang.Object". * For code generated by Java 1.5, this answer is * sometimes wrong (e.g., if the "clone()" method is @@ -57,7 +82,7 @@ public abstract class FieldOrMethod extends NameSignatureInstruction implements * the getReferenceType() method, which correctly distinguishes * between class types and array types. */ - @Deprecated +// @Deprecated public String getClassName( ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); ConstantCP cmr = (ConstantCP) cp.getConstant(index); diff --git a/src/main/java/org/apache/bcel/generic/GETFIELD.java b/src/main/java/org/apache/bcel/generic/GETFIELD.java index 95e0d727..3d79728f 100644 --- a/src/main/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/main/java/org/apache/bcel/generic/GETFIELD.java @@ -80,7 +80,6 @@ public class GETFIELD extends FieldInstruction implements ExceptionThrower, Stac v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); - v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitGETFIELD(this); diff --git a/src/main/java/org/apache/bcel/generic/GETSTATIC.java b/src/main/java/org/apache/bcel/generic/GETSTATIC.java index df2cf128..d145bc2f 100644 --- a/src/main/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/GETSTATIC.java @@ -78,7 +78,6 @@ public class GETSTATIC extends FieldInstruction implements PushInstruction, Exce v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); - v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitGETSTATIC(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java index d77ef5d8..e994c4af 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java @@ -17,14 +17,11 @@ */ package org.apache.bcel.generic; +import java.io.DataOutputStream; import java.io.IOException; -import java.util.StringTokenizer; import org.apache.bcel.Constants; import org.apache.bcel.ExceptionConstants; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantInvokeDynamic; -import org.apache.bcel.classfile.ConstantNameAndType; import org.apache.bcel.classfile.ConstantPool; import org.apache.bcel.util.ByteSequence; @@ -34,11 +31,9 @@ import org.apache.bcel.util.ByteSequence; * mechanism entirely. * * @version $Id: InvokeInstruction.java 1152072 2011-07-29 01:54:05Z dbrosius $ - * @author Bill Pugh * @since 6.0 */ -public class INVOKEDYNAMIC extends NameSignatureInstruction implements ExceptionThrower, - StackConsumer, StackProducer { +public class INVOKEDYNAMIC extends InvokeInstruction { private static final long serialVersionUID = 1L; @@ -51,103 +46,45 @@ public class INVOKEDYNAMIC extends NameSignatureInstruction implements Exception } - /** - * @param index to constant pool - */ - public INVOKEDYNAMIC(short opcode, int index) { - super(opcode, index); + public INVOKEDYNAMIC(int index) { + super(Constants.INVOKEDYNAMIC, index); } /** - * @return mnemonic for instruction with symbolic references resolved + * Dump instruction as byte code to stream out. + * @param out Output stream */ @Override - public String toString( ConstantPool cp ) { - Constant c = cp.getConstant(index); - StringTokenizer tok = new StringTokenizer(cp.constantToString(c)); - return Constants.OPCODE_NAMES[opcode] + " " + tok.nextToken().replace('.', '/') - + tok.nextToken(); - } - - /** - * Get the ConstantInvokeDynamic associated with this instruction - */ - - public ConstantInvokeDynamic getInvokeDynamic( ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); - return (ConstantInvokeDynamic) cp.getConstant(index); + public void dump( DataOutputStream out ) throws IOException { + out.writeByte(opcode); + out.writeShort(index); + out.writeByte(0); + out.writeByte(0); } - @Override - public ConstantNameAndType getNameAndType( ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); - ConstantInvokeDynamic id = getInvokeDynamic(cpg); - return (ConstantNameAndType) cp.getConstant(id.getNameAndTypeIndex()); - } /** - * Also works for instructions whose stack effect depends on the - * constant pool entry they reference. - * @return Number of words consumed from stack by this instruction - */ - @Override - public int consumeStack( ConstantPoolGen cpg ) { - - String signature = getSignature(cpg); - return Type.getArgumentTypesSize(signature); - } - - /** - * Also works for instructions whose stack effect depends on the - * constant pool entry they reference. - * @return Number of words produced onto stack by this instruction - */ - @Override - public int produceStack( ConstantPoolGen cpg ) { - String signature = getSignature(cpg); - return Type.getReturnTypeSize(signature); - } - - - /** @return return type of referenced method. + * Read needed data (i.e., index) from file. */ @Override - public Type getType( ConstantPoolGen cpg ) { - return getReturnType(cpg); - } - - - /** @return name of referenced method. - */ - public String getMethodName( ConstantPoolGen cpg ) { - return getName(cpg); - } - - - /** @return return type of referenced method. - */ - public Type getReturnType( ConstantPoolGen cpg ) { - return Type.getReturnType(getSignature(cpg)); + protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + super.initFromFile(bytes, wide); + length = 5; + bytes.readByte(); // Skip 0 byte + bytes.readByte(); // Skip 0 byte } - /** @return argument types of referenced method. - */ - public Type[] getArgumentTypes( ConstantPoolGen cpg ) { - return Type.getArgumentTypes(getSignature(cpg)); - } - /** - * Read needed data (i.e., index) from file. + * @return mnemonic for instruction with symbolic references resolved */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { - super.initFromFile(bytes, wide); - length = 5; - bytes.readUnsignedShort(); + public String toString( ConstantPool cp ) { + return super.toString(cp); } + public Class[] getExceptions() { Class[] cs = new Class[4 + ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length]; System.arraycopy(ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION, 0, cs, 0, @@ -174,8 +111,10 @@ public class INVOKEDYNAMIC extends NameSignatureInstruction implements Exception v.visitTypedInstruction(this); v.visitStackConsumer(this); v.visitStackProducer(this); + v.visitLoadClass(this); v.visitCPInstruction(this); - v.visitNameSignatureInstruction(this); + v.visitFieldOrMethod(this); + v.visitInvokeInstruction(this); v.visitINVOKEDYNAMIC(this); } } diff --git a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java index 52feed66..218a160b 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -133,7 +133,6 @@ public final class INVOKEINTERFACE extends InvokeInstruction { v.visitStackProducer(this); v.visitLoadClass(this); v.visitCPInstruction(this); - v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitInvokeInstruction(this); v.visitINVOKEINTERFACE(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java index 1c6a801b..05d8d4c9 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -75,7 +75,6 @@ public class INVOKESPECIAL extends InvokeInstruction { v.visitStackProducer(this); v.visitLoadClass(this); v.visitCPInstruction(this); - v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitInvokeInstruction(this); v.visitINVOKESPECIAL(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java index 6d00b660..5ac750d1 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -72,7 +72,6 @@ public class INVOKESTATIC extends InvokeInstruction { v.visitStackProducer(this); v.visitLoadClass(this); v.visitCPInstruction(this); - v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitInvokeInstruction(this); v.visitINVOKESTATIC(this); diff --git a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java index 4b57a419..bf0fe5d3 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -75,7 +75,6 @@ public class INVOKEVIRTUAL extends InvokeInstruction { v.visitLoadClass(this); v.visitCPInstruction(this); v.visitFieldOrMethod(this); - v.visitNameSignatureInstruction(this); v.visitInvokeInstruction(this); v.visitINVOKEVIRTUAL(this); } diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index 19a3f01e..64c77ee6 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -61,7 +61,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali } - /** Create an invoke instruction. + /** Create an invoke instruction. (Except for invokedynamic.) * * @param class_name name of the called class * @param name name of the called method @@ -98,6 +98,32 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali } } + /** Create an invokedynamic instruction. + * + * @param bootstrap_index index into the bootstrap_methods array + * @param name name of the called method + * @param ret_type return type of method + * @param arg_types argument types of method + * @see Constants + */ +/* + * createInvokeDynamic only needed if instrumention code wants to generate + * a new invokedynamic instruction. I don't think we need. (markro) + * + public InvokeInstruction createInvokeDynamic( int bootstrap_index, String name, Type ret_type, + Type[] arg_types) { + int index; + int nargs = 0; + String signature = Type.getMethodSignature(ret_type, arg_types); + for (int i = 0; i < arg_types.length; i++) { + nargs += arg_types[i].getSize(); + } + // UNDONE - needs to be added to ConstantPoolGen + //index = cp.addInvokeDynamic(bootstrap_index, name, signature); + index = 0; + return new INVOKEDYNAMIC(index); + } + */ /** Create a call to the most popular System.out.println() method. * diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index 9942c723..16037942 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -70,7 +70,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti @Override public int consumeStack( ConstantPoolGen cpg ) { int sum; - if (opcode == Constants.INVOKESTATIC) { + if ((opcode == Constants.INVOKESTATIC) || (opcode == Constants.INVOKEDYNAMIC)) { sum = 0; } else { sum = 1; // this reference diff --git a/src/main/java/org/apache/bcel/generic/PUTFIELD.java b/src/main/java/org/apache/bcel/generic/PUTFIELD.java index ef84983f..78f44df9 100644 --- a/src/main/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/main/java/org/apache/bcel/generic/PUTFIELD.java @@ -79,7 +79,6 @@ public class PUTFIELD extends FieldInstruction implements PopInstruction, Except v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); - v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitPUTFIELD(this); diff --git a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java index 915bb8b3..9431ade7 100644 --- a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java @@ -78,7 +78,6 @@ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, Pop v.visitTypedInstruction(this); v.visitLoadClass(this); v.visitCPInstruction(this); - v.visitNameSignatureInstruction(this); v.visitFieldOrMethod(this); v.visitFieldInstruction(this); v.visitPUTSTATIC(this); diff --git a/src/main/java/org/apache/bcel/generic/Visitor.java b/src/main/java/org/apache/bcel/generic/Visitor.java index 26802ea8..34fd3cd8 100644 --- a/src/main/java/org/apache/bcel/generic/Visitor.java +++ b/src/main/java/org/apache/bcel/generic/Visitor.java @@ -448,6 +448,9 @@ public interface Visitor { void visitINVOKEVIRTUAL( INVOKEVIRTUAL obj ); + void visitINVOKEDYNAMIC( INVOKEDYNAMIC obj ); + + void visitFASTORE( FASTORE obj ); @@ -566,10 +569,4 @@ public interface Visitor { void visitBREAKPOINT( BREAKPOINT obj ); - - - void visitNameSignatureInstruction( NameSignatureInstruction obj ); - - - void visitINVOKEDYNAMIC( INVOKEDYNAMIC obj ); } diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 6fa29453..cd10de46 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -26,6 +26,7 @@ import org.apache.bcel.classfile.Code; import org.apache.bcel.classfile.CodeException; import org.apache.bcel.classfile.ConstantFieldref; import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantInvokeDynamic; import org.apache.bcel.classfile.ConstantMethodref; import org.apache.bcel.classfile.ConstantNameAndType; import org.apache.bcel.classfile.ConstantPool; @@ -250,6 +251,7 @@ final class CodeHTML implements org.apache.bcel.Constants { case INVOKESTATIC: case INVOKEVIRTUAL: case INVOKEINTERFACE: + case INVOKEDYNAMIC: int m_index = bytes.readShort(); String str; if (opcode == INVOKEINTERFACE) { // Special treatment needed @@ -260,16 +262,25 @@ final class CodeHTML implements org.apache.bcel.Constants { ConstantInterfaceMethodref c = (ConstantInterfaceMethodref) constant_pool .getConstant(m_index, CONSTANT_InterfaceMethodref); class_index = c.getClassIndex(); - str = constant_pool.constantToString(c); index = c.getNameAndTypeIndex(); + name = Class2HTML.referenceClass(class_index); + } else if (opcode == INVOKEDYNAMIC) { // Special treatment needed + bytes.readUnsignedByte(); // Reserved + bytes.readUnsignedByte(); // Reserved + ConstantInvokeDynamic c = (ConstantInvokeDynamic) constant_pool + .getConstant(m_index, CONSTANT_InvokeDynamic); + index = c.getNameAndTypeIndex(); + name = "#" + c.getBootstrapMethodAttrIndex(); } else { + // UNDONE: Java8 now allows INVOKESPECIAL and INVOKESTATIC to + // reference EITHER a Methodref OR an InterfaceMethodref. + // Not sure if that affects this code or not. (markro) ConstantMethodref c = (ConstantMethodref) constant_pool.getConstant(m_index, CONSTANT_Methodref); class_index = c.getClassIndex(); - str = constant_pool.constantToString(c); index = c.getNameAndTypeIndex(); - } name = Class2HTML.referenceClass(class_index); + } str = Class2HTML.toHTML(constant_pool.constantToString(constant_pool.getConstant( index, CONSTANT_NameAndType))); // Get signature, i.e., types diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index ecf9e189..608d4449 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -317,14 +317,14 @@ public class InstructionFinder { // Initialize pattern map static { map.put("arithmeticinstruction","(irem|lrem|iand|ior|ineg|isub|lneg|fneg|fmul|ldiv|fadd|lxor|frem|idiv|land|ixor|ishr|fsub|lshl|fdiv|iadd|lor|dmul|lsub|ishl|imul|lmul|lushr|dneg|iushr|lshr|ddiv|drem|dadd|ladd|dsub)"); - map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial)"); + map.put("invokeinstruction", "(invokevirtual|invokeinterface|invokestatic|invokespecial|invokedynamic)"); map.put("arrayinstruction", "(baload|aastore|saload|caload|fastore|lastore|iaload|castore|iastore|aaload|bastore|sastore|faload|laload|daload|dastore)"); map.put("gotoinstruction", "(goto|goto_w)"); map.put("conversioninstruction", "(d2l|l2d|i2s|d2i|l2i|i2b|l2f|d2f|f2i|i2d|i2l|f2d|i2c|f2l|i2f)"); map.put("localvariableinstruction","(fstore|iinc|lload|dstore|dload|iload|aload|astore|istore|fload|lstore)"); map.put("loadinstruction", "(fload|dload|lload|iload|aload)"); map.put("fieldinstruction", "(getfield|putstatic|getstatic|putfield)"); - map.put("cpinstruction", "(ldc2_w|invokeinterface|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)"); + map.put("cpinstruction", "(ldc2_w|invokeinterface|invokedynamic|multianewarray|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|ldc_w|invokestatic|invokevirtual|putfield|ldc|new|anewarray)"); map.put("stackinstruction", "(dup2|swap|dup2_x2|pop|pop2|dup|dup2_x1|dup_x2|dup_x1)"); map.put("branchinstruction", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); map.put("returninstruction", "(lreturn|ireturn|freturn|dreturn|areturn|return)"); @@ -335,15 +335,15 @@ public class InstructionFinder { map.put("variablelengthinstruction", "(tableswitch|jsr|goto|lookupswitch)"); map.put("unconditionalbranch", "(goto|jsr|jsr_w|athrow|goto_w)"); map.put("constantpushinstruction", "(dconst|bipush|sipush|fconst|iconst|lconst)"); - map.put("typedinstruction", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)"); + map.put("typedinstruction", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dastore|ret|f2d|f2i|drem|iinc|i2c|checkcast|frem|lreturn|astore|lushr|daload|dneg|fastore|istore|lshl|ldiv|lstore|areturn|ishr|ldc_w|invokeinterface|invokedynamic|aastore|lxor|ishl|l2d|i2f|return|faload|sipush|iushr|caload|instanceof|invokespecial|putfield|fmul|ireturn|laload|d2f|lneg|ixor|i2l|fdiv|lastore|multianewarray|i2b|getstatic|i2d|putstatic|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|freturn|ldc|aconst_null|castore|lmul|ldc2_w|dadd|iconst|f2l|ddiv|dstore|land|jsr|anewarray|dmul|bipush|dsub|sastore|d2i|i2s|lshr|iadd|l2i|lload|bastore|fstore|fneg|iload|fadd|baload|fconst|ior|ineg|dreturn|l2f|lconst|getfield|invokevirtual|invokestatic|iastore)"); map.put("popinstruction", "(fstore|dstore|pop|pop2|astore|putstatic|istore|lstore)"); map.put("allocationinstruction", "(multianewarray|new|anewarray|newarray)"); - map.put("indexedinstruction", "(lload|lstore|fload|ldc2_w|invokeinterface|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)"); + map.put("indexedinstruction", "(lload|lstore|fload|ldc2_w|invokeinterface|invokedynamic|multianewarray|astore|dload|putstatic|instanceof|getstatic|checkcast|getfield|invokespecial|dstore|istore|iinc|ldc_w|ret|fstore|invokestatic|iload|putfield|invokevirtual|ldc|new|aload|anewarray)"); map.put("pushinstruction", "(dup|lload|dup2|bipush|fload|ldc2_w|sipush|lconst|fconst|dload|getstatic|ldc_w|aconst_null|dconst|iload|ldc|iconst|aload)"); - map.put("stackproducer", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)"); - map.put("stackconsumer", "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)"); - map.put("exceptionthrower","(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|ldc|invokestatic|daload)"); - map.put("loadclass", "(multianewarray|invokeinterface|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)"); + map.put("stackproducer", "(imul|lsub|aload|fload|lor|new|aaload|fcmpg|iand|iaload|lrem|idiv|d2l|isub|dcmpg|dup|f2d|f2i|drem|i2c|checkcast|frem|lushr|daload|dneg|lshl|ldiv|ishr|ldc_w|invokeinterface|invokedynamic|lxor|ishl|l2d|i2f|faload|sipush|iushr|caload|instanceof|invokespecial|fmul|laload|d2f|lneg|ixor|i2l|fdiv|getstatic|i2b|swap|i2d|dup2|fcmpl|saload|ladd|irem|dload|jsr_w|dconst|dcmpl|fsub|ldc|arraylength|aconst_null|tableswitch|lmul|ldc2_w|iconst|dadd|f2l|ddiv|land|jsr|anewarray|dmul|bipush|dsub|d2i|newarray|i2s|lshr|iadd|lload|l2i|fneg|iload|fadd|baload|fconst|lookupswitch|ior|ineg|lconst|l2f|getfield|invokevirtual|invokestatic)"); + map.put("stackconsumer", "(imul|lsub|lor|iflt|fcmpg|if_icmpgt|iand|ifeq|if_icmplt|lrem|ifnonnull|idiv|d2l|isub|dcmpg|dastore|if_icmpeq|f2d|f2i|drem|i2c|checkcast|frem|lreturn|astore|lushr|pop2|monitorexit|dneg|fastore|istore|lshl|ldiv|lstore|areturn|if_icmpge|ishr|monitorenter|invokeinterface|invokedynamic|aastore|lxor|ishl|l2d|i2f|return|iushr|instanceof|invokespecial|fmul|ireturn|d2f|lneg|ixor|pop|i2l|ifnull|fdiv|lastore|i2b|if_acmpeq|ifge|swap|i2d|putstatic|fcmpl|ladd|irem|dcmpl|fsub|freturn|ifgt|castore|lmul|dadd|f2l|ddiv|dstore|land|if_icmpne|if_acmpne|dmul|dsub|sastore|ifle|d2i|i2s|lshr|iadd|l2i|bastore|fstore|fneg|fadd|ior|ineg|ifne|dreturn|l2f|if_icmple|getfield|invokevirtual|invokestatic|iastore)"); + map.put("exceptionthrower","(irem|lrem|laload|putstatic|baload|dastore|areturn|getstatic|ldiv|anewarray|iastore|castore|idiv|saload|lastore|fastore|putfield|lreturn|caload|getfield|return|aastore|freturn|newarray|instanceof|multianewarray|athrow|faload|iaload|aaload|dreturn|monitorenter|checkcast|bastore|arraylength|new|invokevirtual|sastore|ldc_w|ireturn|invokespecial|monitorexit|invokeinterface|invokedynamic|ldc|invokestatic|daload)"); + map.put("loadclass", "(multianewarray|invokeinterface|invokedynamic|instanceof|invokespecial|putfield|checkcast|putstatic|invokevirtual|new|getstatic|invokestatic|getfield|anewarray)"); map.put("instructiontargeter", "(ifle|if_acmpne|if_icmpeq|if_acmpeq|ifnonnull|goto_w|iflt|ifnull|if_icmpne|tableswitch|if_icmple|ifeq|if_icmplt|jsr_w|if_icmpgt|ifgt|jsr|goto|ifne|ifge|lookupswitch|if_icmpge)"); // Some aliases map.put("if_icmp", "(if_icmpne|if_icmpeq|if_icmple|if_icmpge|if_icmplt|if_icmpgt)"); diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 4d13b0a3..dab8e7b1 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -62,6 +62,7 @@ import org.apache.bcel.generic.ILOAD; import org.apache.bcel.generic.IMPDEP1; import org.apache.bcel.generic.IMPDEP2; import org.apache.bcel.generic.INSTANCEOF; +import org.apache.bcel.generic.INVOKEDYNAMIC; import org.apache.bcel.generic.INVOKEINTERFACE; import org.apache.bcel.generic.INVOKESPECIAL; import org.apache.bcel.generic.INVOKESTATIC; @@ -1069,6 +1070,12 @@ public final class Pass3aVerifier extends PassVerifier{ // for performance reasons done in Pass 3b //} + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ + @Override + public void visitINVOKEDYNAMIC(INVOKEDYNAMIC o){ + throw new RuntimeException("INVOKEDYNAMIC instruction is not supported at this time"); + } + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index 68bffd32..ff2b0011 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -788,6 +788,27 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override + public void visitINVOKEDYNAMIC(INVOKEDYNAMIC o){ + for (int i=0; i Date: Fri, 24 Jul 2015 15:28:32 +0000 Subject: [PATCH 0754/1313] [BCEL-219] Make org.apache.bcel.classfile.ConstantPool.ConstantPool(DataInput) public. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1692539 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 3 +++ src/main/java/org/apache/bcel/classfile/ConstantPool.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index f974057c..e1d7c6ec 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,9 @@ The type attribute can be add,update,fix,remove. + + Make org.apache.bcel.classfile.ConstantPool.ConstantPool(DataInput) public. + Bug fixes and improvements to InvokeDynamic and BootStrapMethods implementation diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index e9a8a33f..b2f5b20c 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -57,7 +57,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { * @throws IOException * @throws ClassFormatException */ - ConstantPool(DataInput input) throws IOException, ClassFormatException { + public ConstantPool(DataInput input) throws IOException, ClassFormatException { byte tag; int constant_pool_count = input.readUnsignedShort(); constant_pool = new Constant[constant_pool_count]; -- GitLab From 99243fce4d9c9e6bd2ddc4b38f32bd74680010a1 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 24 Jul 2015 15:30:11 +0000 Subject: [PATCH 0755/1313] commons-parent 36 -> 38. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1692540 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ea292e56..421eb0a8 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ org.apache.commons commons-parent - 36 + 38 org.apache.bcel -- GitLab From 24014e5eabb321adf276f90599bddedb018e88aa Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Sun, 26 Jul 2015 22:10:02 +0000 Subject: [PATCH 0756/1313] BCEL-220 No magic resource classes git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1692775 13f79535-47bb-0310-9956-ffa450edef68 --- .../verifier/VerifierArrayAccessTestCase.java | 14 ++- .../bcel/verifier/VerifierReturnTestCase.java | 9 +- .../tests/TestArrayAccess02Creator.java | 88 ++++++++++++++++++ .../tests/TestArrayAccess03Creator.java | 85 +++++++++++++++++ .../tests/TestArrayAccess04Creator.java | 83 +++++++++++++++++ .../bcel/verifier/tests/TestCreator.java | 61 ++++++++++++ .../verifier/tests/TestReturn01Creator.java | 78 ++++++++++++++++ .../verifier/tests/TestReturn03Creator.java | 75 +++++++++++++++ .../verifier/tests/TestArrayAccess02.class | Bin 565 -> 0 bytes .../verifier/tests/TestArrayAccess03.class | Bin 551 -> 0 bytes .../verifier/tests/TestArrayAccess04.class | Bin 532 -> 0 bytes .../bcel/verifier/tests/TestReturn01.class | Bin 423 -> 0 bytes .../bcel/verifier/tests/TestReturn03.class | Bin 385 -> 0 bytes 13 files changed, 489 insertions(+), 4 deletions(-) create mode 100644 src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java create mode 100644 src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java create mode 100644 src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java create mode 100644 src/test/java/org/apache/bcel/verifier/tests/TestCreator.java create mode 100644 src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java create mode 100644 src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java delete mode 100644 src/test/resources/org/apache/bcel/verifier/tests/TestArrayAccess02.class delete mode 100644 src/test/resources/org/apache/bcel/verifier/tests/TestArrayAccess03.class delete mode 100644 src/test/resources/org/apache/bcel/verifier/tests/TestArrayAccess04.class delete mode 100644 src/test/resources/org/apache/bcel/verifier/tests/TestReturn01.class delete mode 100644 src/test/resources/org/apache/bcel/verifier/tests/TestReturn03.class diff --git a/src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java index b69de129..0c4dd5e3 100644 --- a/src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java +++ b/src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java @@ -18,16 +18,24 @@ package org.apache.bcel.verifier; +import java.io.IOException; + +import org.apache.bcel.verifier.tests.TestArrayAccess02Creator; +import org.apache.bcel.verifier.tests.TestArrayAccess03Creator; +import org.apache.bcel.verifier.tests.TestArrayAccess04Creator; public class VerifierArrayAccessTestCase extends AbstractVerifierTestCase { - public void testInvalidArrayAccess() { + public void testInvalidArrayAccess() throws IOException { + new TestArrayAccess03Creator().create(); assertVerifyRejected("TestArrayAccess03", "Verification of an arraystore instruction on an object must fail."); + new TestArrayAccess04Creator().create(); assertVerifyRejected("TestArrayAccess04", "Verification of an arraystore instruction of an int on an array of references must fail."); } - - public void testValidArrayAccess() { + + public void testValidArrayAccess() throws IOException { assertVerifyOK("TestArrayAccess01", "Verification of an arraystore instruction on an array that is not compatible with the stored element must pass."); + new TestArrayAccess02Creator().create(); assertVerifyOK("TestArrayAccess02", "Verification of an arraystore instruction on an array that is not compatible with the stored element must pass."); } diff --git a/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java index 6ffe402b..78c62a00 100644 --- a/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java +++ b/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java @@ -17,10 +17,17 @@ package org.apache.bcel.verifier; +import java.io.IOException; + +import org.apache.bcel.verifier.tests.TestReturn01Creator; +import org.apache.bcel.verifier.tests.TestReturn03Creator; + public class VerifierReturnTestCase extends AbstractVerifierTestCase { - public void testInvalidReturn() { + public void testInvalidReturn() throws IOException { + new TestReturn01Creator().create(); assertVerifyRejected("TestReturn01", "Verification of a void method that returns an object must fail."); + new TestReturn03Creator().create(); assertVerifyRejected("TestReturn03", "Verification of an int method that returns null must fail."); } diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java new file mode 100644 index 00000000..dc75cbcd --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java @@ -0,0 +1,88 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.tests; + +import java.io.IOException; +import java.io.OutputStream; + +import org.apache.bcel.Constants; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.Type; + +public class TestArrayAccess02Creator extends TestCreator implements Constants { + private InstructionFactory _factory; + private ConstantPoolGen _cp; + private ClassGen _cg; + + public TestArrayAccess02Creator() { + _cg = new ClassGen("org.apache.bcel.verifier.tests.TestArrayAccess02", "java.lang.Object", "TestArrayAccess02.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + + _cp = _cg.getConstantPool(); + _factory = new InstructionFactory(_cg, _cp); + } + + public void create(OutputStream out) throws IOException { + createMethod_0(); + createMethod_1(); + _cg.getJavaClass().dump(out); + } + + private void createMethod_0() { + InstructionList il = new InstructionList(); + MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.bcel.verifier.tests.TestArrayAccess02", il, _cp); + + InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); + il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + InstructionHandle ih_4 = il.append(_factory.createReturn(Type.VOID)); + method.setMaxStack(); + method.setMaxLocals(); + _cg.addMethod(method.getMethod()); + il.dispose(); + } + + private void createMethod_1() { + InstructionList il = new InstructionList(); + MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "test", "org.apache.bcel.verifier.tests.TestArrayAccess02", il, _cp); + + InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); + il.append(_factory.createNewArray(new ObjectType("org.apache.bcel.verifier.tests.TestArrayAccess02"), (short) 1)); + il.append(_factory.createStore(Type.OBJECT, 0)); + InstructionHandle ih_5 = il.append(new PUSH(_cp, 1)); + il.append(_factory.createNewArray(Type.STRING, (short) 1)); + il.append(_factory.createStore(Type.OBJECT, 1)); + InstructionHandle ih_10 = il.append(_factory.createLoad(Type.OBJECT, 1)); + il.append(new PUSH(_cp, 0)); + il.append(_factory.createNew("org.apache.bcel.verifier.tests.TestArrayAccess02")); + il.append(InstructionConstants.DUP); + il.append(_factory.createInvoke("org.apache.bcel.verifier.tests.TestArrayAccess02", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(InstructionConstants.AASTORE); + InstructionHandle ih_20 = il.append(_factory.createReturn(Type.VOID)); + method.setMaxStack(); + method.setMaxLocals(); + _cg.addMethod(method.getMethod()); + il.dispose(); + } +} diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java new file mode 100644 index 00000000..bb076f9f --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.tests; + +import java.io.IOException; +import java.io.OutputStream; + +import org.apache.bcel.Constants; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.Type; + +public class TestArrayAccess03Creator extends TestCreator implements Constants { + private InstructionFactory _factory; + private ConstantPoolGen _cp; + private ClassGen _cg; + + public TestArrayAccess03Creator() { + _cg = new ClassGen("org.apache.bcel.verifier.tests.TestArrayAccess03", "java.lang.Object", "TestArrayAccess03.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + + _cp = _cg.getConstantPool(); + _factory = new InstructionFactory(_cg, _cp); + } + + public void create(OutputStream out) throws IOException { + createMethod_0(); + createMethod_1(); + _cg.getJavaClass().dump(out); + } + + private void createMethod_0() { + InstructionList il = new InstructionList(); + MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.bcel.verifier.tests.TestArrayAccess03", il, _cp); + + InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); + il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + InstructionHandle ih_4 = il.append(_factory.createReturn(Type.VOID)); + method.setMaxStack(); + method.setMaxLocals(); + _cg.addMethod(method.getMethod()); + il.dispose(); + } + + private void createMethod_1() { + InstructionList il = new InstructionList(); + MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.bcel.verifier.tests.TestArrayAccess03", il, _cp); + + InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); + il.append(_factory.createNewArray(new ObjectType("org.apache.bcel.verifier.tests.TestArrayAccess03"), (short) 1)); + il.append(_factory.createStore(Type.OBJECT, 1)); + InstructionHandle ih_5 = il.append(_factory.createLoad(Type.OBJECT, 0)); + il.append(new PUSH(_cp, 0)); + il.append(_factory.createNew("org.apache.bcel.verifier.tests.TestArrayAccess03")); + il.append(InstructionConstants.DUP); + il.append(_factory.createInvoke("org.apache.bcel.verifier.tests.TestArrayAccess03", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(InstructionConstants.AASTORE); + InstructionHandle ih_15 = il.append(_factory.createReturn(Type.VOID)); + method.setMaxStack(); + method.setMaxLocals(); + _cg.addMethod(method.getMethod()); + il.dispose(); + } +} \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java new file mode 100644 index 00000000..90480858 --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */package org.apache.bcel.verifier.tests; + +import java.io.IOException; +import java.io.OutputStream; + +import org.apache.bcel.Constants; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.Type; + +public class TestArrayAccess04Creator extends TestCreator implements Constants { + private InstructionFactory _factory; + private ConstantPoolGen _cp; + private ClassGen _cg; + + public TestArrayAccess04Creator() { + _cg = new ClassGen("org.apache.bcel.verifier.tests.TestArrayAccess04", "java.lang.Object", "TestArrayAccess04.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + + _cp = _cg.getConstantPool(); + _factory = new InstructionFactory(_cg, _cp); + } + + public void create(OutputStream out) throws IOException { + createMethod_0(); + createMethod_1(); + _cg.getJavaClass().dump(out); + } + + private void createMethod_0() { + InstructionList il = new InstructionList(); + MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.bcel.verifier.tests.TestArrayAccess04", il, _cp); + + InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); + il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + InstructionHandle ih_4 = il.append(_factory.createReturn(Type.VOID)); + method.setMaxStack(); + method.setMaxLocals(); + _cg.addMethod(method.getMethod()); + il.dispose(); + } + + private void createMethod_1() { + InstructionList il = new InstructionList(); + MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.bcel.verifier.tests.TestArrayAccess04", il, _cp); + + InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); + il.append(_factory.createNewArray(Type.OBJECT, (short) 1)); + il.append(_factory.createStore(Type.OBJECT, 1)); + InstructionHandle ih_5 = il.append(new PUSH(_cp, 1)); + il.append(_factory.createStore(Type.INT, 2)); + InstructionHandle ih_7 = il.append(_factory.createLoad(Type.OBJECT, 1)); + il.append(new PUSH(_cp, 0)); + il.append(_factory.createLoad(Type.INT, 2)); + il.append(InstructionConstants.AASTORE); + InstructionHandle ih_11 = il.append(_factory.createReturn(Type.VOID)); + method.setMaxStack(); + method.setMaxLocals(); + _cg.addMethod(method.getMethod()); + il.dispose(); + } +} \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java b/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java new file mode 100644 index 00000000..7e661830 --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java @@ -0,0 +1,61 @@ +package org.apache.bcel.verifier.tests; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.URISyntaxException; + +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +public abstract class TestCreator { + + public void create() throws IOException { + File classFile = new File(getPackageFolder(), getClassName()); + FileOutputStream out = new FileOutputStream(classFile); + try { + create(out); + } + finally { + out.close(); + } + } + + private String getClassName() { + String name = getClass().getName(); + return name.substring(name.lastIndexOf('.')+1).replace("Creator", ".class"); + } + + private File getPackageFolder() throws IOException { + return new File(getClassesFolder(), getPackageName()); + } + + protected String getPackageName() { + return getClass().getPackage().getName().replace('.', '/'); + } + + private File getClassesFolder() throws IOException { + try { + return new File(getClass().getProtectionDomain().getCodeSource().getLocation().toURI()); + } catch (URISyntaxException e) { + throw new IOException(e); + } + } + + public abstract void create(OutputStream out) throws IOException; +} diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java new file mode 100644 index 00000000..a0833bf7 --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.tests; + +import java.io.IOException; +import java.io.OutputStream; + +import org.apache.bcel.Constants; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.Type; + +public class TestReturn01Creator extends TestCreator implements Constants { + private InstructionFactory _factory; + private ConstantPoolGen _cp; + private ClassGen _cg; + + public TestReturn01Creator() { + _cg = new ClassGen("org.apache.bcel.verifier.tests.TestReturn01", "java.lang.Object", "TestReturn01.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + + _cp = _cg.getConstantPool(); + _factory = new InstructionFactory(_cg, _cp); + } + + public void create(OutputStream out) throws IOException { + createMethod_0(); + createMethod_1(); + _cg.getJavaClass().dump(out); + } + + private void createMethod_0() { + InstructionList il = new InstructionList(); + MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.bcel.verifier.tests.TestReturn01", il, _cp); + + InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); + il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + InstructionHandle ih_4 = il.append(_factory.createReturn(Type.VOID)); + method.setMaxStack(); + method.setMaxLocals(); + _cg.addMethod(method.getMethod()); + il.dispose(); + } + + private void createMethod_1() { + InstructionList il = new InstructionList(); + MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "foo", "org.apache.bcel.verifier.tests.TestReturn01", il, _cp); + + InstructionHandle ih_0 = il.append(_factory.createNew("java.lang.Object")); + il.append(InstructionConstants.DUP); + il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(InstructionConstants.NOP); + InstructionHandle ih_8 = il.append(_factory.createReturn(Type.OBJECT)); + method.setMaxStack(); + method.setMaxLocals(); + _cg.addMethod(method.getMethod()); + il.dispose(); + } +} diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java new file mode 100644 index 00000000..7e0c01ff --- /dev/null +++ b/src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.bcel.verifier.tests; + +import java.io.IOException; +import java.io.OutputStream; + +import org.apache.bcel.Constants; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.Type; + +public class TestReturn03Creator extends TestCreator implements Constants { + private InstructionFactory _factory; + private ConstantPoolGen _cp; + private ClassGen _cg; + + public TestReturn03Creator() { + _cg = new ClassGen("org.apache.bcel.verifier.tests.TestReturn03", "java.lang.Object", "TestReturn03.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + + _cp = _cg.getConstantPool(); + _factory = new InstructionFactory(_cg, _cp); + } + + public void create(OutputStream out) throws IOException { + createMethod_0(); + createMethod_1(); + _cg.getJavaClass().dump(out); + } + + private void createMethod_0() { + InstructionList il = new InstructionList(); + MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.bcel.verifier.tests.TestReturn03", il, _cp); + + InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); + il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + InstructionHandle ih_4 = il.append(_factory.createReturn(Type.VOID)); + method.setMaxStack(); + method.setMaxLocals(); + _cg.addMethod(method.getMethod()); + il.dispose(); + } + + private void createMethod_1() { + InstructionList il = new InstructionList(); + MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.INT, Type.NO_ARGS, new String[] { }, "test3", "org.apache.bcel.verifier.tests.TestReturn03", il, _cp); + + InstructionHandle ih_0 = il.append(InstructionConstants.ACONST_NULL); + il.append(_factory.createReturn(Type.OBJECT)); + method.setMaxStack(); + method.setMaxLocals(); + _cg.addMethod(method.getMethod()); + il.dispose(); + } +} diff --git a/src/test/resources/org/apache/bcel/verifier/tests/TestArrayAccess02.class b/src/test/resources/org/apache/bcel/verifier/tests/TestArrayAccess02.class deleted file mode 100644 index a6bc164e95e21e30a0bded20fc4d3d696124a6d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmX^0Z`VEs1_omW33di1Mh1iYqICVlg2d#ERQ;sn)Exb?)S}F^%+w$CnEz}BFHO-j10!nDX b83Y)F7=#%Z7`Pa?8AKRF!R`?QJ474+iYI=| diff --git a/src/test/resources/org/apache/bcel/verifier/tests/TestArrayAccess03.class b/src/test/resources/org/apache/bcel/verifier/tests/TestArrayAccess03.class deleted file mode 100644 index ddc2d1f44a9b666e0e214c578da07ff92588f62f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmX^0Z`VEs1_omWadrkKMh1iYqICVlg2d#ERQ;sn)Exb?)S}F^%+w10w?`BLibT$YKn6Mh4bIkS`e-jHAi1 znkzWJv?w{%EfeH1F^oXd16jzR$iT?J%m4yR42+;qVPIrnXJBB^XJBMtWME)m)!NR$ zv5|p+fr){Ofq{VyEGWvr&A`CG17@=_@G$T)Ffed3@G!7#SED7#LW! zwli>SWME)mV&Gz6U|<6aiZXCBFfj0d*{lpa47>~s44e#n4E#{dVGPV*LwQ*CGBEqF z*lIJ&1S8B4VqjrlV31&7WsqcGXOLpxW{?J(rvTBzAiy99vY3ILL5M*ZY$7Xz2!kjC L$bn*Dmxu!Z?xJri diff --git a/src/test/resources/org/apache/bcel/verifier/tests/TestReturn01.class b/src/test/resources/org/apache/bcel/verifier/tests/TestReturn01.class deleted file mode 100644 index 33020b263b11dd2fd8e5c76cbe300e1baae65f95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423 zcmX^0Z`VEs1_omWVRi;4Mh5NtqICVlg2d#ERQ;sn)Exb?)S}F^%+w%QjC^^+F6J)O-vUl`Asu>g+7#WxuK!AyX z5#(M5Mh12U1_pfwMg~R(1_oBG?F<|n85kIt7`PZ17}&sq%naNN3=BMAHY)=U11|#u z11AF?SQez&oB?DQ0|V!72Ik1^3>*v_;0ACpFflMNurqKlaKa7YU|?k6XAoduU|?hr I1gjJR02BRI!2kdN diff --git a/src/test/resources/org/apache/bcel/verifier/tests/TestReturn03.class b/src/test/resources/org/apache/bcel/verifier/tests/TestReturn03.class deleted file mode 100644 index 1d1cb9177ec374ebe534f12a4897b43bba9927f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385 zcmX^0Z`VEs1_omWA$A5PMh5NtqICVlg2d#ERQ;sn)Exb?)S}F^%+wXr$zMiANcdLV~0C^9fIFf)Jv69Xg2c?^sU z>(!YPW=D? -- GitLab From f3f9e9b02c101973da0ed1a51e5dd60b83e5bc65 Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Sun, 9 Aug 2015 21:21:10 +0000 Subject: [PATCH 0757/1313] BCEL-222 Major release of BCEL requires updating package name and maven coordinate git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1694911 13f79535-47bb-0310-9956-ffa450edef68 --- README.txt | 6 +- RELEASE-NOTES.txt | 12 +- pom.xml | 6 +- src/examples/HelloWorldBuilder.java | 32 ++-- src/examples/JasminVisitor.java | 56 +++--- src/examples/Mini/ASTExpr.java | 28 +-- src/examples/Mini/ASTFunAppl.java | 12 +- src/examples/Mini/ASTFunDecl.java | 43 ++--- src/examples/Mini/ASTIdent.java | 14 +- src/examples/Mini/ASTIfExpr.java | 16 +- src/examples/Mini/ASTInteger.java | 8 +- src/examples/Mini/ASTLetExpr.java | 18 +- src/examples/Mini/ASTProgram.java | 36 ++-- src/examples/Mini/Function.java | 2 +- src/examples/Mini/MiniC.java | 9 +- src/examples/Mini/Variable.java | 2 +- src/examples/Package.java | 16 +- src/examples/Peephole.java | 20 +-- src/examples/ProxyCreator.java | 38 ++-- src/examples/TransitiveHull.java | 36 ++-- src/examples/helloify.java | 34 ++-- src/examples/id.java | 16 +- src/examples/listclass.java | 20 +-- src/examples/maxstack.java | 12 +- src/examples/patchclass.java | 8 +- .../{bcel => commons/bcel6}/Constants.java | 2 +- .../bcel6}/ExceptionConstants.java | 2 +- .../{bcel => commons/bcel6}/Repository.java | 19 +- .../bcel6}/classfile/AccessFlags.java | 4 +- .../bcel6}/classfile/AnnotationDefault.java | 4 +- .../classfile/AnnotationElementValue.java | 2 +- .../bcel6}/classfile/AnnotationEntry.java | 4 +- .../bcel6}/classfile/Annotations.java | 2 +- .../bcel6}/classfile/ArrayElementValue.java | 2 +- .../bcel6}/classfile/Attribute.java | 5 +- .../bcel6}/classfile/AttributeReader.java | 2 +- .../bcel6}/classfile/BootstrapMethod.java | 4 +- .../bcel6}/classfile/BootstrapMethods.java | 4 +- .../bcel6}/classfile/ClassElementValue.java | 5 +- .../classfile/ClassFormatException.java | 2 +- .../bcel6}/classfile/ClassParser.java | 4 +- .../bcel6}/classfile/Code.java | 5 +- .../bcel6}/classfile/CodeException.java | 4 +- .../bcel6}/classfile/Constant.java | 6 +- .../bcel6}/classfile/ConstantCP.java | 4 +- .../bcel6}/classfile/ConstantClass.java | 6 +- .../bcel6}/classfile/ConstantDouble.java | 6 +- .../bcel6}/classfile/ConstantFieldref.java | 5 +- .../bcel6}/classfile/ConstantFloat.java | 6 +- .../bcel6}/classfile/ConstantInteger.java | 6 +- .../classfile/ConstantInterfaceMethodref.java | 5 +- .../classfile/ConstantInvokeDynamic.java | 6 +- .../bcel6}/classfile/ConstantLong.java | 6 +- .../classfile/ConstantMethodHandle.java | 6 +- .../bcel6}/classfile/ConstantMethodType.java | 6 +- .../bcel6}/classfile/ConstantMethodref.java | 5 +- .../bcel6}/classfile/ConstantNameAndType.java | 6 +- .../bcel6}/classfile/ConstantObject.java | 2 +- .../bcel6}/classfile/ConstantPool.java | 7 +- .../bcel6}/classfile/ConstantString.java | 6 +- .../bcel6}/classfile/ConstantUtf8.java | 6 +- .../bcel6}/classfile/ConstantValue.java | 4 +- .../bcel6}/classfile/Deprecated.java | 5 +- .../bcel6}/classfile/DescendingVisitor.java | 2 +- .../bcel6}/classfile/ElementValue.java | 2 +- .../bcel6}/classfile/ElementValuePair.java | 5 +- .../bcel6}/classfile/EmptyVisitor.java | 2 +- .../bcel6}/classfile/EnclosingMethod.java | 4 +- .../bcel6}/classfile/EnumElementValue.java | 5 +- .../bcel6}/classfile/ExceptionTable.java | 5 +- .../bcel6}/classfile/Field.java | 9 +- .../bcel6}/classfile/FieldOrMethod.java | 5 +- .../bcel6}/classfile/InnerClass.java | 4 +- .../bcel6}/classfile/InnerClasses.java | 5 +- .../bcel6}/classfile/JavaClass.java | 23 +-- .../bcel6}/classfile/LineNumber.java | 2 +- .../bcel6}/classfile/LineNumberTable.java | 5 +- .../bcel6}/classfile/LocalVariable.java | 4 +- .../bcel6}/classfile/LocalVariableTable.java | 5 +- .../classfile/LocalVariableTypeTable.java | 4 +- .../bcel6}/classfile/Method.java | 9 +- .../bcel6}/classfile/MethodParameter.java | 4 +- .../bcel6}/classfile/MethodParameters.java | 4 +- .../bcel6}/classfile/Node.java | 2 +- .../bcel6}/classfile/PMGClass.java | 4 +- .../classfile/ParameterAnnotationEntry.java | 4 +- .../classfile/ParameterAnnotations.java | 2 +- .../RuntimeInvisibleAnnotations.java | 5 +- .../RuntimeInvisibleParameterAnnotations.java | 5 +- .../classfile/RuntimeVisibleAnnotations.java | 5 +- .../RuntimeVisibleParameterAnnotations.java | 5 +- .../bcel6}/classfile/Signature.java | 4 +- .../bcel6}/classfile/SimpleElementValue.java | 5 +- .../bcel6}/classfile/SourceFile.java | 4 +- .../bcel6}/classfile/StackMap.java | 5 +- .../bcel6}/classfile/StackMapEntry.java | 2 +- .../bcel6}/classfile/StackMapTable.java | 5 +- .../bcel6}/classfile/StackMapTableEntry.java | 4 +- .../bcel6}/classfile/StackMapType.java | 4 +- .../bcel6}/classfile/Synthetic.java | 5 +- .../bcel6}/classfile/Unknown.java | 9 +- .../classfile/UnknownAttributeReader.java | 2 +- .../bcel6}/classfile/Utility.java | 6 +- .../bcel6}/classfile/Visitor.java | 2 +- .../bcel6}/classfile/package.html | 0 .../bcel6}/generic/AALOAD.java | 4 +- .../bcel6}/generic/AASTORE.java | 4 +- .../bcel6}/generic/ACONST_NULL.java | 4 +- .../bcel6}/generic/ALOAD.java | 6 +- .../bcel6}/generic/ANEWARRAY.java | 6 +- .../bcel6}/generic/ARETURN.java | 4 +- .../bcel6}/generic/ARRAYLENGTH.java | 6 +- .../bcel6}/generic/ASTORE.java | 6 +- .../bcel6}/generic/ATHROW.java | 6 +- .../bcel6}/generic/AllocationInstruction.java | 2 +- .../generic/AnnotationElementValueGen.java | 7 +- .../bcel6}/generic/AnnotationEntryGen.java | 18 +- .../bcel6}/generic/ArithmeticInstruction.java | 4 +- .../bcel6}/generic/ArrayElementValueGen.java | 6 +- .../bcel6}/generic/ArrayInstruction.java | 36 ++-- .../bcel6}/generic/ArrayType.java | 4 +- .../bcel6}/generic/BALOAD.java | 4 +- .../bcel6}/generic/BASTORE.java | 4 +- .../bcel6}/generic/BIPUSH.java | 7 +- .../bcel6}/generic/BREAKPOINT.java | 4 +- .../bcel6}/generic/BasicType.java | 6 +- .../bcel6}/generic/BranchHandle.java | 2 +- .../bcel6}/generic/BranchInstruction.java | 5 +- .../bcel6}/generic/CALOAD.java | 4 +- .../bcel6}/generic/CASTORE.java | 4 +- .../bcel6}/generic/CHECKCAST.java | 6 +- .../bcel6}/generic/CPInstruction.java | 15 +- .../bcel6}/generic/ClassElementValueGen.java | 15 +- .../bcel6}/generic/ClassGen.java | 30 ++-- .../bcel6}/generic/ClassGenException.java | 2 +- .../bcel6}/generic/ClassObserver.java | 2 +- .../bcel6}/generic/CodeExceptionGen.java | 4 +- .../bcel6}/generic/CompoundInstruction.java | 2 +- .../bcel6}/generic/ConstantPoolGen.java | 35 ++-- .../generic/ConstantPushInstruction.java | 2 +- .../bcel6}/generic/ConversionInstruction.java | 4 +- .../{bcel => commons/bcel6}/generic/D2F.java | 4 +- .../{bcel => commons/bcel6}/generic/D2I.java | 4 +- .../{bcel => commons/bcel6}/generic/D2L.java | 4 +- .../{bcel => commons/bcel6}/generic/DADD.java | 4 +- .../bcel6}/generic/DALOAD.java | 4 +- .../bcel6}/generic/DASTORE.java | 4 +- .../bcel6}/generic/DCMPG.java | 4 +- .../bcel6}/generic/DCMPL.java | 4 +- .../bcel6}/generic/DCONST.java | 8 +- .../{bcel => commons/bcel6}/generic/DDIV.java | 4 +- .../bcel6}/generic/DLOAD.java | 6 +- .../{bcel => commons/bcel6}/generic/DMUL.java | 4 +- .../{bcel => commons/bcel6}/generic/DNEG.java | 4 +- .../{bcel => commons/bcel6}/generic/DREM.java | 4 +- .../bcel6}/generic/DRETURN.java | 4 +- .../bcel6}/generic/DSTORE.java | 6 +- .../{bcel => commons/bcel6}/generic/DSUB.java | 4 +- .../{bcel => commons/bcel6}/generic/DUP.java | 4 +- .../{bcel => commons/bcel6}/generic/DUP2.java | 4 +- .../bcel6}/generic/DUP2_X1.java | 4 +- .../bcel6}/generic/DUP2_X2.java | 4 +- .../bcel6}/generic/DUP_X1.java | 4 +- .../bcel6}/generic/DUP_X2.java | 4 +- .../bcel6}/generic/ElementValueGen.java | 16 +- .../bcel6}/generic/ElementValuePairGen.java | 9 +- .../bcel6}/generic/EmptyVisitor.java | 2 +- .../bcel6}/generic/EnumElementValueGen.java | 9 +- .../bcel6}/generic/ExceptionThrower.java | 2 +- .../{bcel => commons/bcel6}/generic/F2D.java | 4 +- .../{bcel => commons/bcel6}/generic/F2I.java | 4 +- .../{bcel => commons/bcel6}/generic/F2L.java | 4 +- .../{bcel => commons/bcel6}/generic/FADD.java | 4 +- .../bcel6}/generic/FALOAD.java | 4 +- .../bcel6}/generic/FASTORE.java | 4 +- .../bcel6}/generic/FCMPG.java | 4 +- .../bcel6}/generic/FCMPL.java | 4 +- .../bcel6}/generic/FCONST.java | 10 +- .../{bcel => commons/bcel6}/generic/FDIV.java | 4 +- .../bcel6}/generic/FLOAD.java | 6 +- .../{bcel => commons/bcel6}/generic/FMUL.java | 4 +- .../{bcel => commons/bcel6}/generic/FNEG.java | 4 +- .../{bcel => commons/bcel6}/generic/FREM.java | 4 +- .../bcel6}/generic/FRETURN.java | 4 +- .../bcel6}/generic/FSTORE.java | 6 +- .../{bcel => commons/bcel6}/generic/FSUB.java | 4 +- .../bcel6}/generic/FieldGen.java | 25 +-- .../bcel6}/generic/FieldGenOrMethodGen.java | 8 +- .../bcel6}/generic/FieldInstruction.java | 8 +- .../bcel6}/generic/FieldObserver.java | 2 +- .../bcel6}/generic/FieldOrMethod.java | 14 +- .../bcel6}/generic/GETFIELD.java | 6 +- .../bcel6}/generic/GETSTATIC.java | 6 +- .../{bcel => commons/bcel6}/generic/GOTO.java | 8 +- .../bcel6}/generic/GOTO_W.java | 7 +- .../bcel6}/generic/GotoInstruction.java | 2 +- .../{bcel => commons/bcel6}/generic/I2B.java | 4 +- .../{bcel => commons/bcel6}/generic/I2C.java | 4 +- .../{bcel => commons/bcel6}/generic/I2D.java | 4 +- .../{bcel => commons/bcel6}/generic/I2F.java | 4 +- .../{bcel => commons/bcel6}/generic/I2L.java | 4 +- .../{bcel => commons/bcel6}/generic/I2S.java | 4 +- .../{bcel => commons/bcel6}/generic/IADD.java | 4 +- .../bcel6}/generic/IALOAD.java | 4 +- .../{bcel => commons/bcel6}/generic/IAND.java | 4 +- .../bcel6}/generic/IASTORE.java | 4 +- .../bcel6}/generic/ICONST.java | 6 +- .../{bcel => commons/bcel6}/generic/IDIV.java | 6 +- .../{bcel => commons/bcel6}/generic/IFEQ.java | 4 +- .../{bcel => commons/bcel6}/generic/IFGE.java | 4 +- .../{bcel => commons/bcel6}/generic/IFGT.java | 4 +- .../{bcel => commons/bcel6}/generic/IFLE.java | 4 +- .../{bcel => commons/bcel6}/generic/IFLT.java | 4 +- .../{bcel => commons/bcel6}/generic/IFNE.java | 4 +- .../bcel6}/generic/IFNONNULL.java | 4 +- .../bcel6}/generic/IFNULL.java | 4 +- .../bcel6}/generic/IF_ACMPEQ.java | 4 +- .../bcel6}/generic/IF_ACMPNE.java | 4 +- .../bcel6}/generic/IF_ICMPEQ.java | 4 +- .../bcel6}/generic/IF_ICMPGE.java | 4 +- .../bcel6}/generic/IF_ICMPGT.java | 4 +- .../bcel6}/generic/IF_ICMPLE.java | 4 +- .../bcel6}/generic/IF_ICMPLT.java | 4 +- .../bcel6}/generic/IF_ICMPNE.java | 4 +- .../{bcel => commons/bcel6}/generic/IINC.java | 11 +- .../bcel6}/generic/ILOAD.java | 6 +- .../bcel6}/generic/IMPDEP1.java | 4 +- .../bcel6}/generic/IMPDEP2.java | 4 +- .../{bcel => commons/bcel6}/generic/IMUL.java | 4 +- .../{bcel => commons/bcel6}/generic/INEG.java | 4 +- .../bcel6}/generic/INSTANCEOF.java | 6 +- .../bcel6}/generic/INVOKEDYNAMIC.java | 10 +- .../bcel6}/generic/INVOKEINTERFACE.java | 10 +- .../bcel6}/generic/INVOKESPECIAL.java | 6 +- .../bcel6}/generic/INVOKESTATIC.java | 6 +- .../bcel6}/generic/INVOKEVIRTUAL.java | 6 +- .../{bcel => commons/bcel6}/generic/IOR.java | 4 +- .../{bcel => commons/bcel6}/generic/IREM.java | 6 +- .../bcel6}/generic/IRETURN.java | 4 +- .../{bcel => commons/bcel6}/generic/ISHL.java | 4 +- .../{bcel => commons/bcel6}/generic/ISHR.java | 4 +- .../bcel6}/generic/ISTORE.java | 6 +- .../{bcel => commons/bcel6}/generic/ISUB.java | 4 +- .../bcel6}/generic/IUSHR.java | 4 +- .../{bcel => commons/bcel6}/generic/IXOR.java | 4 +- .../bcel6}/generic/IfInstruction.java | 2 +- .../bcel6}/generic/IndexedInstruction.java | 2 +- .../bcel6}/generic/Instruction.java | 8 +- .../bcel6}/generic/InstructionComparator.java | 2 +- .../bcel6}/generic/InstructionConstants.java | 4 +- .../bcel6}/generic/InstructionFactory.java | 6 +- .../bcel6}/generic/InstructionHandle.java | 5 +- .../bcel6}/generic/InstructionList.java | 8 +- .../generic/InstructionListObserver.java | 2 +- .../bcel6}/generic/InstructionTargeter.java | 2 +- .../bcel6}/generic/InvokeInstruction.java | 9 +- .../{bcel => commons/bcel6}/generic/JSR.java | 8 +- .../bcel6}/generic/JSR_W.java | 7 +- .../bcel6}/generic/JsrInstruction.java | 2 +- .../{bcel => commons/bcel6}/generic/L2D.java | 4 +- .../{bcel => commons/bcel6}/generic/L2F.java | 4 +- .../{bcel => commons/bcel6}/generic/L2I.java | 4 +- .../{bcel => commons/bcel6}/generic/LADD.java | 4 +- .../bcel6}/generic/LALOAD.java | 4 +- .../{bcel => commons/bcel6}/generic/LAND.java | 4 +- .../bcel6}/generic/LASTORE.java | 4 +- .../{bcel => commons/bcel6}/generic/LCMP.java | 4 +- .../bcel6}/generic/LCONST.java | 8 +- .../{bcel => commons/bcel6}/generic/LDC.java | 44 ++--- .../bcel6}/generic/LDC2_W.java | 18 +- .../bcel6}/generic/LDC_W.java | 7 +- .../{bcel => commons/bcel6}/generic/LDIV.java | 6 +- .../bcel6}/generic/LLOAD.java | 6 +- .../{bcel => commons/bcel6}/generic/LMUL.java | 4 +- .../{bcel => commons/bcel6}/generic/LNEG.java | 4 +- .../bcel6}/generic/LOOKUPSWITCH.java | 7 +- .../{bcel => commons/bcel6}/generic/LOR.java | 4 +- .../{bcel => commons/bcel6}/generic/LREM.java | 6 +- .../bcel6}/generic/LRETURN.java | 4 +- .../{bcel => commons/bcel6}/generic/LSHL.java | 4 +- .../{bcel => commons/bcel6}/generic/LSHR.java | 4 +- .../bcel6}/generic/LSTORE.java | 6 +- .../{bcel => commons/bcel6}/generic/LSUB.java | 4 +- .../bcel6}/generic/LUSHR.java | 4 +- .../{bcel => commons/bcel6}/generic/LXOR.java | 4 +- .../bcel6}/generic/LineNumberGen.java | 4 +- .../bcel6}/generic/LoadClass.java | 2 +- .../bcel6}/generic/LoadInstruction.java | 2 +- .../bcel6}/generic/LocalVariableGen.java | 6 +- .../generic/LocalVariableInstruction.java | 7 +- .../bcel6}/generic/MONITORENTER.java | 6 +- .../bcel6}/generic/MONITOREXIT.java | 6 +- .../bcel6}/generic/MULTIANEWARRAY.java | 11 +- .../bcel6}/generic/MethodGen.java | 38 ++-- .../bcel6}/generic/MethodObserver.java | 2 +- .../{bcel => commons/bcel6}/generic/NEW.java | 6 +- .../bcel6}/generic/NEWARRAY.java | 11 +- .../{bcel => commons/bcel6}/generic/NOP.java | 4 +- .../generic/NameSignatureInstruction.java | 10 +- .../bcel6}/generic/NamedAndTyped.java | 2 +- .../bcel6}/generic/ObjectType.java | 8 +- .../{bcel => commons/bcel6}/generic/POP.java | 4 +- .../{bcel => commons/bcel6}/generic/POP2.java | 4 +- .../{bcel => commons/bcel6}/generic/PUSH.java | 4 +- .../bcel6}/generic/PUTFIELD.java | 6 +- .../bcel6}/generic/PUTSTATIC.java | 6 +- .../bcel6}/generic/PopInstruction.java | 2 +- .../bcel6}/generic/PushInstruction.java | 2 +- .../{bcel => commons/bcel6}/generic/RET.java | 11 +- .../bcel6}/generic/RETURN.java | 4 +- .../bcel6}/generic/ReferenceType.java | 8 +- .../bcel6}/generic/ReturnInstruction.java | 6 +- .../bcel6}/generic/ReturnaddressType.java | 4 +- .../bcel6}/generic/SALOAD.java | 4 +- .../bcel6}/generic/SASTORE.java | 4 +- .../bcel6}/generic/SIPUSH.java | 7 +- .../{bcel => commons/bcel6}/generic/SWAP.java | 4 +- .../bcel6}/generic/SWITCH.java | 2 +- .../bcel6}/generic/Select.java | 5 +- .../bcel6}/generic/SimpleElementValueGen.java | 17 +- .../bcel6}/generic/StackConsumer.java | 2 +- .../bcel6}/generic/StackInstruction.java | 2 +- .../bcel6}/generic/StackProducer.java | 2 +- .../bcel6}/generic/StoreInstruction.java | 2 +- .../bcel6}/generic/TABLESWITCH.java | 7 +- .../bcel6}/generic/TargetLostException.java | 2 +- .../{bcel => commons/bcel6}/generic/Type.java | 12 +- .../bcel6}/generic/TypedInstruction.java | 2 +- .../bcel6}/generic/UnconditionalBranch.java | 2 +- .../generic/VariableLengthInstruction.java | 2 +- .../bcel6}/generic/Visitor.java | 2 +- .../bcel6}/generic/package.html | 0 .../{bcel => commons/bcel6}/package.html | 0 .../bcel6}/util/AttributeHTML.java | 35 ++-- .../bcel6}/util/BCELComparator.java | 2 +- .../bcel6}/util/BCELFactory.java | 64 +++---- .../bcel6}/util/BCELifier.java | 35 ++-- .../bcel6}/util/ByteSequence.java | 2 +- .../bcel6}/util/Class2HTML.java | 17 +- .../bcel6}/util/ClassLoader.java | 16 +- .../bcel6}/util/ClassLoaderRepository.java | 9 +- .../bcel6}/util/ClassPath.java | 2 +- .../bcel6}/util/ClassQueue.java | 5 +- .../bcel6}/util/ClassSet.java | 5 +- .../bcel6}/util/ClassStack.java | 5 +- .../bcel6}/util/ClassVector.java | 5 +- .../bcel6}/util/CodeHTML.java | 31 ++-- .../bcel6}/util/ConstantHTML.java | 25 +-- .../bcel6}/util/InstructionFinder.java | 12 +- .../bcel6}/util/JavaWrapper.java | 10 +- .../bcel6}/util/MethodHTML.java | 19 +- .../bcel6}/util/Repository.java | 6 +- .../bcel6}/util/SyntheticRepository.java | 9 +- .../{bcel => commons/bcel6}/util/package.html | 0 .../bcel6}/verifier/GraphicalVerifier.java | 5 +- .../bcel6}/verifier/NativeVerifier.java | 2 +- .../bcel6}/verifier/PassVerifier.java | 4 +- .../bcel6}/verifier/TransitiveHull.java | 6 +- .../bcel6}/verifier/VerificationResult.java | 2 +- .../bcel6}/verifier/Verifier.java | 24 +-- .../bcel6}/verifier/VerifierAppFrame.java | 7 +- .../bcel6}/verifier/VerifierFactory.java | 4 +- .../verifier/VerifierFactoryListModel.java | 4 +- .../verifier/VerifierFactoryObserver.java | 2 +- .../bcel6}/verifier/VerifyDialog.java | 6 +- .../exc/AssertionViolatedException.java | 2 +- .../exc/ClassConstraintException.java | 2 +- .../verifier/exc/CodeConstraintException.java | 2 +- .../verifier/exc/InvalidMethodException.java | 2 +- .../exc/LinkingConstraintException.java | 2 +- .../bcel6}/verifier/exc/LoadingException.java | 2 +- ...ocalVariableInfoInconsistentException.java | 2 +- .../exc/StaticCodeConstraintException.java | 2 +- ...ticCodeInstructionConstraintException.java | 2 +- ...InstructionOperandConstraintException.java | 2 +- .../StructuralCodeConstraintException.java | 2 +- .../bcel6}/verifier/exc/Utility.java | 2 +- .../verifier/exc/VerificationException.java | 2 +- .../VerifierConstraintViolatedException.java | 2 +- .../bcel6}/verifier/exc/package.html | 0 .../bcel6}/verifier/package.html | 0 .../bcel6}/verifier/statics/DOUBLE_Upper.java | 6 +- .../bcel6}/verifier/statics/IntList.java | 2 +- .../bcel6}/verifier/statics/LONG_Upper.java | 6 +- .../verifier/statics/LocalVariableInfo.java | 7 +- .../verifier/statics/LocalVariablesInfo.java | 8 +- .../verifier/statics/Pass1Verifier.java | 22 +-- .../verifier/statics/Pass2Verifier.java | 125 ++++++------- .../verifier/statics/Pass3aVerifier.java | 168 +++++++++--------- .../statics/StringRepresentation.java | 86 ++++----- .../bcel6}/verifier/statics/package.html | 0 .../structurals/ControlFlowGraph.java | 26 +-- .../structurals/ExceptionHandler.java | 6 +- .../structurals/ExceptionHandlers.java | 8 +- .../structurals/ExecutionVisitor.java | 20 +-- .../bcel6}/verifier/structurals/Frame.java | 2 +- .../verifier/structurals/GenericArray.java | 2 +- .../structurals/InstConstraintVisitor.java | 56 +++--- .../structurals/InstructionContext.java | 5 +- .../verifier/structurals/LocalVariables.java | 12 +- .../verifier/structurals/OperandStack.java | 15 +- .../verifier/structurals/Pass3bVerifier.java | 48 ++--- .../verifier/structurals/Subroutine.java | 6 +- .../verifier/structurals/Subroutines.java | 34 ++-- .../structurals/UninitializedObjectType.java | 8 +- .../bcel6}/verifier/structurals/package.html | 0 src/site/xdoc/faq.xml | 4 +- src/site/xdoc/manual.xml | 14 +- .../AbstractCounterVisitorTestCase.java | 8 +- .../bcel6}/AbstractTestCase.java | 28 +-- .../bcel6}/AnnotationAccessFlagTestCase.java | 8 +- .../AnnotationDefaultAttributeTestCase.java | 14 +- .../bcel6}/AnonymousClassTestCase.java | 12 +- .../bcel6}/BCELBenchmark.java | 14 +- .../bcel6}/CounterVisitorTestCase.java | 6 +- .../bcel6}/ElementValueGenTestCase.java | 19 +- .../EnclosingMethodAttributeTestCase.java | 30 ++-- .../bcel6}/EnumAccessFlagTestCase.java | 8 +- .../bcel6}/FieldAnnotationsTestCase.java | 37 ++-- .../GeneratingAnnotatedClassesTestCase.java | 79 ++++---- .../bcel6}/InstructionFinderTestCase.java | 16 +- .../{bcel => commons/bcel6}/NanoTimer.java | 2 +- .../bcel6}/PerformanceTest.java | 14 +- .../bcel6}/classfile/UtilityTestCase.java | 4 +- .../bcel6}/data/AnnotatedFields.java | 2 +- .../data/AnnotatedWithCombinedAnnotation.java | 2 +- .../bcel6}/data/AnnotatedWithEnumClass.java | 2 +- .../bcel6}/data/AnnotationEnumElement.java | 2 +- .../bcel6}/data/AnonymousClassTest.java | 2 +- .../bcel6}/data/AttributeTestClassEM01.java | 2 +- .../bcel6}/data/AttributeTestClassEM02.java | 2 +- .../bcel6}/data/CombinedAnnotation.java | 2 +- .../bcel6}/data/ComplexAnnotatedClass.java | 2 +- .../bcel6}/data/ComplexAnnotation.java | 2 +- .../bcel6}/data/MarkedType.java | 2 +- .../bcel6}/data/MarkerAnnotation.java | 2 +- .../data/MarkerAnnotationInvisible.java | 2 +- .../bcel6}/data/SimpleAnnotatedClass.java | 2 +- .../bcel6}/data/SimpleAnnotation.java | 2 +- .../bcel6}/data/SimpleClass.java | 2 +- .../bcel6}/data/SimpleEnum.java | 2 +- .../bcel6}/generic/AnnotationGenTestCase.java | 21 ++- .../bcel6}/generic/MethodGenTestCase.java | 13 +- .../bcel6}/util/Class2HTMLTestCase.java | 6 +- .../bcel6}/util/InstructionFinderTest.java | 15 +- .../verifier/AbstractVerifierTestCase.java | 11 +- .../verifier/VerifierArrayAccessTestCase.java | 8 +- .../verifier/VerifierInvokeTestCase.java | 2 +- .../verifier/VerifierReturnTestCase.java | 6 +- .../bcel6}/verifier/VerifierTestCase.java | 6 +- .../bcel6}/verifier/tests/TestArray01.java | 2 +- .../verifier/tests/TestArrayAccess01.java | 2 +- .../tests/TestArrayAccess02Creator.java | 36 ++-- .../tests/TestArrayAccess03Creator.java | 36 ++-- .../tests/TestArrayAccess04Creator.java | 28 +-- .../bcel6}/verifier/tests/TestCreator.java | 2 +- .../tests/TestLegalInvokeInterface01.java | 2 +- .../tests/TestLegalInvokeSpecial01.java | 2 +- .../tests/TestLegalInvokeSpecial02.java | 2 +- .../tests/TestLegalInvokeStatic01.java | 2 +- .../tests/TestLegalInvokeVirtual01.java | 2 +- .../tests/TestLegalInvokeVirtual02.java | 2 +- .../verifier/tests/TestReturn01Creator.java | 26 +-- .../bcel6}/verifier/tests/TestReturn02.java | 2 +- .../verifier/tests/TestReturn03Creator.java | 26 +-- .../bcel6}/visitors/CounterVisitor.java | 92 +++++----- 466 files changed, 2050 insertions(+), 1945 deletions(-) rename src/main/java/org/apache/{bcel => commons/bcel6}/Constants.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/ExceptionConstants.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/Repository.java (93%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/AccessFlags.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/AnnotationDefault.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/AnnotationElementValue.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/AnnotationEntry.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Annotations.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ArrayElementValue.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Attribute.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/AttributeReader.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/BootstrapMethod.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/BootstrapMethods.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ClassElementValue.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ClassFormatException.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ClassParser.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Code.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/CodeException.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Constant.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantCP.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantClass.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantDouble.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantFieldref.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantFloat.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantInteger.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantInterfaceMethodref.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantInvokeDynamic.java (93%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantLong.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantMethodHandle.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantMethodType.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantMethodref.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantNameAndType.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantObject.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantPool.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantString.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantUtf8.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ConstantValue.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Deprecated.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/DescendingVisitor.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ElementValue.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ElementValuePair.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/EmptyVisitor.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/EnclosingMethod.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/EnumElementValue.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ExceptionTable.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Field.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/FieldOrMethod.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/InnerClass.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/InnerClasses.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/JavaClass.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/LineNumber.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/LineNumberTable.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/LocalVariable.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/LocalVariableTable.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/LocalVariableTypeTable.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Method.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/MethodParameter.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/MethodParameters.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Node.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/PMGClass.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ParameterAnnotationEntry.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/ParameterAnnotations.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/RuntimeInvisibleAnnotations.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/RuntimeInvisibleParameterAnnotations.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/RuntimeVisibleAnnotations.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/RuntimeVisibleParameterAnnotations.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Signature.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/SimpleElementValue.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/SourceFile.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/StackMap.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/StackMapEntry.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/StackMapTable.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/StackMapTableEntry.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/StackMapType.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Synthetic.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Unknown.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/UnknownAttributeReader.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Utility.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/Visitor.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/classfile/package.html (100%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/AALOAD.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/AASTORE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ACONST_NULL.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ALOAD.java (88%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ANEWARRAY.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ARETURN.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ARRAYLENGTH.java (90%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ASTORE.java (87%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ATHROW.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/AllocationInstruction.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/AnnotationElementValueGen.java (93%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/AnnotationEntryGen.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ArithmeticInstruction.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ArrayElementValueGen.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ArrayInstruction.java (65%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ArrayType.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/BALOAD.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/BASTORE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/BIPUSH.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/BREAKPOINT.java (92%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/BasicType.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/BranchHandle.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/BranchInstruction.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/CALOAD.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/CASTORE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/CHECKCAST.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/CPInstruction.java (89%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ClassElementValueGen.java (88%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ClassGen.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ClassGenException.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ClassObserver.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/CodeExceptionGen.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/CompoundInstruction.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ConstantPoolGen.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ConstantPushInstruction.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ConversionInstruction.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/D2F.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/D2I.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/D2L.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DADD.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DALOAD.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DASTORE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DCMPG.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DCMPL.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DCONST.java (90%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DDIV.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DLOAD.java (88%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DMUL.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DNEG.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DREM.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DRETURN.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DSTORE.java (88%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DSUB.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DUP.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DUP2.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DUP2_X1.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DUP2_X2.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DUP_X1.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/DUP_X2.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ElementValueGen.java (93%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ElementValuePairGen.java (93%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/EmptyVisitor.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/EnumElementValueGen.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ExceptionThrower.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/F2D.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/F2I.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/F2L.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FADD.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FALOAD.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FASTORE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FCMPG.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FCMPL.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FCONST.java (88%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FDIV.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FLOAD.java (88%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FMUL.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FNEG.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FREM.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FRETURN.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FSTORE.java (87%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FSUB.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FieldGen.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FieldGenOrMethodGen.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FieldInstruction.java (88%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FieldObserver.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/FieldOrMethod.java (92%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/GETFIELD.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/GETSTATIC.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/GOTO.java (92%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/GOTO_W.java (93%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/GotoInstruction.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/I2B.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/I2C.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/I2D.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/I2F.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/I2L.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/I2S.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IADD.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IALOAD.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IAND.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IASTORE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ICONST.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IDIV.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IFEQ.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IFGE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IFGT.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IFLE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IFLT.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IFNE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IFNONNULL.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IFNULL.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IF_ACMPEQ.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IF_ACMPNE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IF_ICMPEQ.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IF_ICMPGE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IF_ICMPGT.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IF_ICMPLE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IF_ICMPLT.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IF_ICMPNE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IINC.java (92%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ILOAD.java (88%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IMPDEP1.java (92%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IMPDEP2.java (92%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IMUL.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/INEG.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/INSTANCEOF.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/INVOKEDYNAMIC.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/INVOKEINTERFACE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/INVOKESPECIAL.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/INVOKESTATIC.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/INVOKEVIRTUAL.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IOR.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IREM.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IRETURN.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ISHL.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ISHR.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ISTORE.java (87%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ISUB.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IUSHR.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IXOR.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IfInstruction.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/IndexedInstruction.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/Instruction.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/InstructionComparator.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/InstructionConstants.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/InstructionFactory.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/InstructionHandle.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/InstructionList.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/InstructionListObserver.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/InstructionTargeter.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/InvokeInstruction.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/JSR.java (92%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/JSR_W.java (93%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/JsrInstruction.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/L2D.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/L2F.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/L2I.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LADD.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LALOAD.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LAND.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LASTORE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LCMP.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LCONST.java (90%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LDC.java (68%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LDC2_W.java (78%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LDC_W.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LDIV.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LLOAD.java (87%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LMUL.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LNEG.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LOOKUPSWITCH.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LOR.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LREM.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LRETURN.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LSHL.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LSHR.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LSTORE.java (87%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LSUB.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LUSHR.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LXOR.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LineNumberGen.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LoadClass.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LoadInstruction.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LocalVariableGen.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/LocalVariableInstruction.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/MONITORENTER.java (89%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/MONITOREXIT.java (89%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/MULTIANEWARRAY.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/MethodGen.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/MethodObserver.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/NEW.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/NEWARRAY.java (89%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/NOP.java (93%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/NameSignatureInstruction.java (89%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/NamedAndTyped.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ObjectType.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/POP.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/POP2.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/PUSH.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/PUTFIELD.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/PUTSTATIC.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/PopInstruction.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/PushInstruction.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/RET.java (92%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/RETURN.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ReferenceType.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ReturnInstruction.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/ReturnaddressType.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/SALOAD.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/SASTORE.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/SIPUSH.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/SWAP.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/SWITCH.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/Select.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/SimpleElementValueGen.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/StackConsumer.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/StackInstruction.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/StackProducer.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/StoreInstruction.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/TABLESWITCH.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/TargetLostException.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/Type.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/TypedInstruction.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/UnconditionalBranch.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/VariableLengthInstruction.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/Visitor.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/generic/package.html (100%) rename src/main/java/org/apache/{bcel => commons/bcel6}/package.html (100%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/AttributeHTML.java (90%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/BCELComparator.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/BCELFactory.java (86%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/BCELifier.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/ByteSequence.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/Class2HTML.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/ClassLoader.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/ClassLoaderRepository.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/ClassPath.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/ClassQueue.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/ClassSet.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/ClassStack.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/ClassVector.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/CodeHTML.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/ConstantHTML.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/InstructionFinder.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/JavaWrapper.java (90%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/MethodHTML.java (93%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/Repository.java (93%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/SyntheticRepository.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/util/package.html (100%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/GraphicalVerifier.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/NativeVerifier.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/PassVerifier.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/TransitiveHull.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/VerificationResult.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/Verifier.java (90%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/VerifierAppFrame.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/VerifierFactory.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/VerifierFactoryListModel.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/VerifierFactoryObserver.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/VerifyDialog.java (99%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/AssertionViolatedException.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/ClassConstraintException.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/CodeConstraintException.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/InvalidMethodException.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/LinkingConstraintException.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/LoadingException.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/LocalVariableInfoInconsistentException.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/StaticCodeConstraintException.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/StaticCodeInstructionConstraintException.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/StaticCodeInstructionOperandConstraintException.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/StructuralCodeConstraintException.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/Utility.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/VerificationException.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/VerifierConstraintViolatedException.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/exc/package.html (100%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/package.html (100%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/statics/DOUBLE_Upper.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/statics/IntList.java (97%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/statics/LONG_Upper.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/statics/LocalVariableInfo.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/statics/LocalVariablesInfo.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/statics/Pass1Verifier.java (93%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/statics/Pass2Verifier.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/statics/Pass3aVerifier.java (92%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/statics/StringRepresentation.java (77%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/statics/package.html (100%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/ControlFlowGraph.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/ExceptionHandler.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/ExceptionHandlers.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/ExecutionVisitor.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/Frame.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/GenericArray.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/InstConstraintVisitor.java (98%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/InstructionContext.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/LocalVariables.java (93%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/OperandStack.java (95%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/Pass3bVerifier.java (92%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/Subroutine.java (94%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/Subroutines.java (96%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/UninitializedObjectType.java (91%) rename src/main/java/org/apache/{bcel => commons/bcel6}/verifier/structurals/package.html (100%) rename src/test/java/org/apache/{bcel => commons/bcel6}/AbstractCounterVisitorTestCase.java (87%) rename src/test/java/org/apache/{bcel => commons/bcel6}/AbstractTestCase.java (88%) rename src/test/java/org/apache/{bcel => commons/bcel6}/AnnotationAccessFlagTestCase.java (85%) rename src/test/java/org/apache/{bcel => commons/bcel6}/AnnotationDefaultAttributeTestCase.java (80%) rename src/test/java/org/apache/{bcel => commons/bcel6}/AnonymousClassTestCase.java (81%) rename src/test/java/org/apache/{bcel => commons/bcel6}/BCELBenchmark.java (92%) rename src/test/java/org/apache/{bcel => commons/bcel6}/CounterVisitorTestCase.java (97%) rename src/test/java/org/apache/{bcel => commons/bcel6}/ElementValueGenTestCase.java (95%) rename src/test/java/org/apache/{bcel => commons/bcel6}/EnclosingMethodAttributeTestCase.java (77%) rename src/test/java/org/apache/{bcel => commons/bcel6}/EnumAccessFlagTestCase.java (85%) rename src/test/java/org/apache/{bcel => commons/bcel6}/FieldAnnotationsTestCase.java (81%) rename src/test/java/org/apache/{bcel => commons/bcel6}/GeneratingAnnotatedClassesTestCase.java (92%) rename src/test/java/org/apache/{bcel => commons/bcel6}/InstructionFinderTestCase.java (80%) rename src/test/java/org/apache/{bcel => commons/bcel6}/NanoTimer.java (97%) rename src/test/java/org/apache/{bcel => commons/bcel6}/PerformanceTest.java (93%) rename src/test/java/org/apache/{bcel => commons/bcel6}/classfile/UtilityTestCase.java (93%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/AnnotatedFields.java (95%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/AnnotatedWithCombinedAnnotation.java (97%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/AnnotatedWithEnumClass.java (95%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/AnnotationEnumElement.java (96%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/AnonymousClassTest.java (96%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/AttributeTestClassEM01.java (96%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/AttributeTestClassEM02.java (96%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/CombinedAnnotation.java (96%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/ComplexAnnotatedClass.java (96%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/ComplexAnnotation.java (96%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/MarkedType.java (95%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/MarkerAnnotation.java (95%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/MarkerAnnotationInvisible.java (95%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/SimpleAnnotatedClass.java (95%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/SimpleAnnotation.java (96%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/SimpleClass.java (95%) rename src/test/java/org/apache/{bcel => commons/bcel6}/data/SimpleEnum.java (95%) rename src/test/java/org/apache/{bcel => commons/bcel6}/generic/AnnotationGenTestCase.java (89%) rename src/test/java/org/apache/{bcel => commons/bcel6}/generic/MethodGenTestCase.java (89%) rename src/test/java/org/apache/{bcel => commons/bcel6}/util/Class2HTMLTestCase.java (90%) rename src/test/java/org/apache/{bcel => commons/bcel6}/util/InstructionFinderTest.java (78%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/AbstractVerifierTestCase.java (88%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/VerifierArrayAccessTestCase.java (87%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/VerifierInvokeTestCase.java (97%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/VerifierReturnTestCase.java (89%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/VerifierTestCase.java (87%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestArray01.java (96%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestArrayAccess01.java (95%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestArrayAccess02Creator.java (66%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestArrayAccess03Creator.java (66%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestArrayAccess04Creator.java (74%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestCreator.java (97%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestLegalInvokeInterface01.java (76%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestLegalInvokeSpecial01.java (73%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestLegalInvokeSpecial02.java (80%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestLegalInvokeStatic01.java (75%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestLegalInvokeVirtual01.java (73%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestLegalInvokeVirtual02.java (80%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestReturn01Creator.java (72%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestReturn02.java (97%) rename src/test/java/org/apache/{bcel => commons/bcel6}/verifier/tests/TestReturn03Creator.java (70%) rename src/test/java/org/apache/{bcel => commons/bcel6}/visitors/CounterVisitor.java (72%) diff --git a/README.txt b/README.txt index 367bcad2..8e75e545 100644 --- a/README.txt +++ b/README.txt @@ -1,12 +1,12 @@ Running a console based verifier - java org.apache.bcel.verifier.Verifier fully.qualified.class.Name + java org.apache.commons.bcel6.verifier.Verifier fully.qualified.class.Name lets JustIce work standalone. If you get a "java.lang.OutOfMemoryError", you should increase the maximum Java heap space. A command like - java -Xmx1887436800 org.apache.bcel.verifier.Verifier f.q.c.Name + java -Xmx1887436800 org.apache.commons.bcel6.verifier.Verifier f.q.c.Name will usually resolve the problem. The value above is suitable for big server machines; if your machine starts swapping to disk, try @@ -18,7 +18,7 @@ Running a graphics based verifier If you prefer a graphical application, you should use a command like - java org.apache.bcel.verifier.GraphicalVerifier + java org.apache.commons.bcel6.verifier.GraphicalVerifier to launch one. Again, you may have to resolve a memory issue depending on the classes to verify. diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 32fbbe7e..d620ecfa 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -14,10 +14,16 @@ and 8. It requires Java 5 or higher to run. Compatibility with 5.2 ---------------------- -Binary compatible - Yes +Binary compatible - No -Source compatible - Yes, except: - - The org.apache.bcel.classfile.Visitor interface has been enhanced with +Source compatible - Yes, sort of; + - Maven coordinates update: + org.apache.bcel:bcel:5.2 -> org.apache.commons:commons-bcel6:6.0 + + - Rename package imports: + org.apache.bcel -> org.apache.commons.bcel6 + + - The org.apache.commons.bcel6.classfile.Visitor interface has been enhanced with additional methods. If you implemented it directly instead of extending the EmptyVisitor class you'll have to implement the new methods. diff --git a/pom.xml b/pom.xml index 421eb0a8..aa47d325 100644 --- a/pom.xml +++ b/pom.xml @@ -28,8 +28,8 @@ 38 - org.apache.bcel - bcel + org.apache.commons + commons-bcel6 jar 6.0-SNAPSHOT Apache Commons BCEL @@ -49,7 +49,7 @@ https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-bcel org.apache.${commons.componentid} - org.apache.bcel.*;version=${project.version};-noimport:=true + org.apache.commons.bcel6.*;version=${project.version};-noimport:=true * diff --git a/src/examples/HelloWorldBuilder.java b/src/examples/HelloWorldBuilder.java index 9a54c576..5c00cfe5 100644 --- a/src/examples/HelloWorldBuilder.java +++ b/src/examples/HelloWorldBuilder.java @@ -18,22 +18,22 @@ import java.io.IOException; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.ALOAD; -import org.apache.bcel.generic.ASTORE; -import org.apache.bcel.generic.ArrayType; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.GOTO; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionFactory; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.LocalVariableGen; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.PUSH; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.ALOAD; +import org.apache.commons.bcel6.generic.ASTORE; +import org.apache.commons.bcel6.generic.ArrayType; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.GOTO; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionFactory; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.LocalVariableGen; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.PUSH; +import org.apache.commons.bcel6.generic.Type; /** * Create HelloWorld class: diff --git a/src/examples/JasminVisitor.java b/src/examples/JasminVisitor.java index 1eaa6fba..06702a69 100644 --- a/src/examples/JasminVisitor.java +++ b/src/examples/JasminVisitor.java @@ -24,32 +24,32 @@ import java.util.Date; import java.util.Hashtable; import java.util.StringTokenizer; -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.ConstantValue; -import org.apache.bcel.classfile.Deprecated; -import org.apache.bcel.classfile.ExceptionTable; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.Synthetic; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.generic.BranchHandle; -import org.apache.bcel.generic.BranchInstruction; -import org.apache.bcel.generic.CodeExceptionGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.Instruction; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.LineNumberGen; -import org.apache.bcel.generic.LocalVariableGen; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.Select; -import org.apache.bcel.generic.TABLESWITCH; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.Code; +import org.apache.commons.bcel6.classfile.ConstantValue; +import org.apache.commons.bcel6.classfile.Deprecated; +import org.apache.commons.bcel6.classfile.ExceptionTable; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.Synthetic; +import org.apache.commons.bcel6.classfile.Utility; +import org.apache.commons.bcel6.generic.BranchHandle; +import org.apache.commons.bcel6.generic.BranchInstruction; +import org.apache.commons.bcel6.generic.CodeExceptionGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.Instruction; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.LineNumberGen; +import org.apache.commons.bcel6.generic.LocalVariableGen; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.Select; +import org.apache.commons.bcel6.generic.TABLESWITCH; /** * Disassemble Java class object into the @@ -58,7 +58,7 @@ import org.apache.bcel.generic.TABLESWITCH; * @author M. Dahm * @version $Id$ */ -public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { +public class JasminVisitor extends org.apache.commons.bcel6.classfile.EmptyVisitor { private JavaClass clazz; private PrintWriter out; private String class_name; @@ -75,7 +75,7 @@ public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { * Start traversal using DefaultVisitor pattern. */ public void disassemble() { - new org.apache.bcel.classfile.DescendingVisitor(clazz, this).visit(); + new org.apache.commons.bcel6.classfile.DescendingVisitor(clazz, this).visit(); out.close(); } diff --git a/src/examples/Mini/ASTExpr.java b/src/examples/Mini/ASTExpr.java index 7388d869..0d96ed64 100644 --- a/src/examples/Mini/ASTExpr.java +++ b/src/examples/Mini/ASTExpr.java @@ -19,19 +19,19 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.bcel.generic.BranchHandle; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.GOTO; -import org.apache.bcel.generic.IF_ICMPEQ; -import org.apache.bcel.generic.IF_ICMPGE; -import org.apache.bcel.generic.IF_ICMPGT; -import org.apache.bcel.generic.IF_ICMPLE; -import org.apache.bcel.generic.IF_ICMPLT; -import org.apache.bcel.generic.IF_ICMPNE; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.PUSH; +import org.apache.commons.bcel6.generic.BranchHandle; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.GOTO; +import org.apache.commons.bcel6.generic.IF_ICMPEQ; +import org.apache.commons.bcel6.generic.IF_ICMPGE; +import org.apache.commons.bcel6.generic.IF_ICMPGT; +import org.apache.commons.bcel6.generic.IF_ICMPLE; +import org.apache.commons.bcel6.generic.IF_ICMPLT; +import org.apache.commons.bcel6.generic.IF_ICMPNE; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.PUSH; /** * Represents arithmetic expressions such as `(a + 12 == b) OR c'. @@ -48,7 +48,7 @@ import org.apache.bcel.generic.PUSH; * are discarded in the first pass. */ public class ASTExpr extends SimpleNode -implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constants { +implements MiniParserConstants, MiniParserTreeConstants, org.apache.commons.bcel6.Constants { protected int kind=-1; // Single twig to leaf? private int unop=-1; // Special case: Unary operand applied protected ASTExpr[] exprs; // Sub expressions diff --git a/src/examples/Mini/ASTFunAppl.java b/src/examples/Mini/ASTFunAppl.java index 1249c799..b33e5f0b 100644 --- a/src/examples/Mini/ASTFunAppl.java +++ b/src/examples/Mini/ASTFunAppl.java @@ -19,11 +19,11 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.INVOKESTATIC; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.INVOKESTATIC; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.Type; /** * @@ -31,7 +31,7 @@ import org.apache.bcel.generic.Type; * @author M. Dahm */ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, - org.apache.bcel.Constants { + org.apache.commons.bcel6.Constants { private ASTIdent name; private Function function; // Points to Function in environment diff --git a/src/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java index e5e9a7df..a312aa3d 100644 --- a/src/examples/Mini/ASTFunDecl.java +++ b/src/examples/Mini/ASTFunDecl.java @@ -21,26 +21,27 @@ package Mini; import java.io.PrintWriter; import java.util.Iterator; -import org.apache.bcel.generic.ALOAD; -import org.apache.bcel.generic.ASTORE; -import org.apache.bcel.generic.ArrayType; -import org.apache.bcel.generic.BranchHandle; -import org.apache.bcel.generic.BranchInstruction; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.GETSTATIC; -import org.apache.bcel.generic.GOTO; -import org.apache.bcel.generic.INVOKEVIRTUAL; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.InstructionTargeter; -import org.apache.bcel.generic.LocalVariableGen; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.TargetLostException; -import org.apache.bcel.generic.Type; -import org.apache.bcel.util.InstructionFinder; + +import org.apache.commons.bcel6.generic.ALOAD; +import org.apache.commons.bcel6.generic.ASTORE; +import org.apache.commons.bcel6.generic.ArrayType; +import org.apache.commons.bcel6.generic.BranchHandle; +import org.apache.commons.bcel6.generic.BranchInstruction; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.GETSTATIC; +import org.apache.commons.bcel6.generic.GOTO; +import org.apache.commons.bcel6.generic.INVOKEVIRTUAL; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.InstructionTargeter; +import org.apache.commons.bcel6.generic.LocalVariableGen; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.TargetLostException; +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.util.InstructionFinder; /** * @@ -48,7 +49,7 @@ import org.apache.bcel.util.InstructionFinder; * @author M. Dahm */ public class ASTFunDecl extends SimpleNode -implements MiniParserTreeConstants, org.apache.bcel.Constants { +implements MiniParserTreeConstants, org.apache.commons.bcel6.Constants { private ASTIdent name; private ASTIdent[] argv; private ASTExpr body; diff --git a/src/examples/Mini/ASTIdent.java b/src/examples/Mini/ASTIdent.java index 95b3fbd3..f64e9266 100644 --- a/src/examples/Mini/ASTIdent.java +++ b/src/examples/Mini/ASTIdent.java @@ -19,19 +19,19 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.ILOAD; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.LocalVariableGen; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.PUSH; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.ILOAD; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.LocalVariableGen; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.PUSH; /** * * @version $Id$ * @author M. Dahm */ -public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { +public class ASTIdent extends ASTExpr implements org.apache.commons.bcel6.Constants { private String name; private Variable reference; // Reference in environment to decl of this ident diff --git a/src/examples/Mini/ASTIfExpr.java b/src/examples/Mini/ASTIfExpr.java index 8c7308f1..1361e60b 100644 --- a/src/examples/Mini/ASTIfExpr.java +++ b/src/examples/Mini/ASTIfExpr.java @@ -19,20 +19,20 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.bcel.generic.BranchHandle; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.GOTO; -import org.apache.bcel.generic.IFEQ; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; +import org.apache.commons.bcel6.generic.BranchHandle; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.GOTO; +import org.apache.commons.bcel6.generic.IFEQ; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; /** * * @version $Id$ * @author M. Dahm */ -public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { +public class ASTIfExpr extends ASTExpr implements org.apache.commons.bcel6.Constants { private ASTExpr if_expr, then_expr, else_expr; // Generated methods diff --git a/src/examples/Mini/ASTInteger.java b/src/examples/Mini/ASTInteger.java index c086b92a..771f5e7f 100644 --- a/src/examples/Mini/ASTInteger.java +++ b/src/examples/Mini/ASTInteger.java @@ -19,10 +19,10 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.PUSH; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.PUSH; /** * diff --git a/src/examples/Mini/ASTLetExpr.java b/src/examples/Mini/ASTLetExpr.java index 72ef3366..0c43514f 100644 --- a/src/examples/Mini/ASTLetExpr.java +++ b/src/examples/Mini/ASTLetExpr.java @@ -19,21 +19,21 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.bcel.generic.BasicType; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.ISTORE; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.LocalVariableGen; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.generic.BasicType; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.ISTORE; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.LocalVariableGen; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.Type; /** * * @version $Id$ * @author M. Dahm */ -public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { +public class ASTLetExpr extends ASTExpr implements org.apache.commons.bcel6.Constants { private ASTIdent[] idents; private ASTExpr[] exprs; private ASTExpr body; diff --git a/src/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java index 65aa17a6..8cb74232 100644 --- a/src/examples/Mini/ASTProgram.java +++ b/src/examples/Mini/ASTProgram.java @@ -21,23 +21,23 @@ package Mini; import java.io.PrintWriter; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.generic.ALOAD; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.GETSTATIC; -import org.apache.bcel.generic.ILOAD; -import org.apache.bcel.generic.INVOKESPECIAL; -import org.apache.bcel.generic.INVOKESTATIC; -import org.apache.bcel.generic.INVOKEVIRTUAL; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.NEW; -import org.apache.bcel.generic.PUSH; -import org.apache.bcel.generic.PUTSTATIC; -import org.apache.bcel.generic.RETURN; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.generic.ALOAD; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.GETSTATIC; +import org.apache.commons.bcel6.generic.ILOAD; +import org.apache.commons.bcel6.generic.INVOKESPECIAL; +import org.apache.commons.bcel6.generic.INVOKESTATIC; +import org.apache.commons.bcel6.generic.INVOKEVIRTUAL; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.NEW; +import org.apache.commons.bcel6.generic.PUSH; +import org.apache.commons.bcel6.generic.PUTSTATIC; +import org.apache.commons.bcel6.generic.RETURN; +import org.apache.commons.bcel6.generic.Type; /** * Root node of everything, direct children are nodes of type FunDecl @@ -46,7 +46,7 @@ import org.apache.bcel.generic.Type; * @author M. Dahm */ public class ASTProgram extends SimpleNode -implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constants { +implements MiniParserConstants, MiniParserTreeConstants, org.apache.commons.bcel6.Constants { private ASTFunDecl[] fun_decls; // Children: Function declarations private Environment env; // Environment contains variables and functions diff --git a/src/examples/Mini/Function.java b/src/examples/Mini/Function.java index 0ceafbcf..380a83ec 100644 --- a/src/examples/Mini/Function.java +++ b/src/examples/Mini/Function.java @@ -24,7 +24,7 @@ package Mini; * @version $Id$ * @author M. Dahm */ -public class Function implements org.apache.bcel.Constants, EnvEntry { +public class Function implements org.apache.commons.bcel6.Constants, EnvEntry { private ASTIdent name; // Reference to the original declaration private ASTIdent[] args; // Reference to argument identifiers // private ASTExpr body; // Reference to function expression body diff --git a/src/examples/Mini/MiniC.java b/src/examples/Mini/MiniC.java index 0bcd0f01..08eab14f 100644 --- a/src/examples/Mini/MiniC.java +++ b/src/examples/Mini/MiniC.java @@ -20,11 +20,12 @@ import java.io.File; import java.io.FileOutputStream; import java.io.PrintWriter; import java.util.Vector; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -public class MiniC implements org.apache.bcel.Constants { +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; + +public class MiniC implements org.apache.commons.bcel6.Constants { private static Vector errors = null; private static Vector warnings = null; private static String file = null; diff --git a/src/examples/Mini/Variable.java b/src/examples/Mini/Variable.java index c3658dce..1dbc3342 100644 --- a/src/examples/Mini/Variable.java +++ b/src/examples/Mini/Variable.java @@ -16,7 +16,7 @@ * */ package Mini; -import org.apache.bcel.generic.LocalVariableGen; +import org.apache.commons.bcel6.generic.LocalVariableGen; /** * Represents a variable declared in a LET expression or a FUN declaration. diff --git a/src/examples/Package.java b/src/examples/Package.java index 2c7c2c5a..b3d9a1af 100644 --- a/src/examples/Package.java +++ b/src/examples/Package.java @@ -27,14 +27,14 @@ import java.util.TreeMap; import java.util.jar.JarOutputStream; import java.util.zip.ZipEntry; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.util.ClassPath; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.Constant; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.util.ClassPath; /** * Package the client. Creates a jar file in the current directory diff --git a/src/examples/Peephole.java b/src/examples/Peephole.java index 334da0cd..c4bd3b4d 100644 --- a/src/examples/Peephole.java +++ b/src/examples/Peephole.java @@ -18,16 +18,16 @@ import java.util.Iterator; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.InstructionTargeter; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.TargetLostException; -import org.apache.bcel.util.InstructionFinder; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.InstructionTargeter; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.TargetLostException; +import org.apache.commons.bcel6.util.InstructionFinder; /** * Remove NOPs from given class diff --git a/src/examples/ProxyCreator.java b/src/examples/ProxyCreator.java index c89d9398..8374342b 100644 --- a/src/examples/ProxyCreator.java +++ b/src/examples/ProxyCreator.java @@ -19,25 +19,25 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.generic.ALOAD; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.GETSTATIC; -import org.apache.bcel.generic.INVOKEVIRTUAL; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionFactory; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.PUSH; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.Utility; +import org.apache.commons.bcel6.generic.ALOAD; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.GETSTATIC; +import org.apache.commons.bcel6.generic.INVOKEVIRTUAL; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionFactory; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.PUSH; +import org.apache.commons.bcel6.generic.Type; /** * Dynamically creates and uses a proxy for {@code java.awt.event.ActionListener} * via the classloader mechanism if called with - *
    java org.apache.bcel.util.JavaWrapper ProxyCreator
    + *
    java org.apache.commons.bcel6.util.JavaWrapper ProxyCreator
    * * The trick is to encode the byte code we need into the class name * using the Utility.encode() method. This will result however in big @@ -48,8 +48,8 @@ import org.apache.bcel.generic.Type; * * @author M. Dahm * @version $Id$ - * @see org.apache.bcel.util.JavaWrapper - * @see org.apache.bcel.util.ClassLoader + * @see org.apache.commons.bcel6.util.JavaWrapper + * @see org.apache.commons.bcel6.util.ClassLoader * @see Utility */ public class ProxyCreator { @@ -77,7 +77,7 @@ public class ProxyCreator { ClassLoader loader = ProxyCreator.class.getClassLoader(); // instanceof won't work here ... - if (loader.getClass().toString().equals("class org.apache.bcel.util.ClassLoader")) { + if (loader.getClass().toString().equals("class org.apache.commons.bcel6.util.ClassLoader")) { // Real class name will be set by the class loader ClassGen cg = new ClassGen("foo", "java.lang.Object", "", Constants.ACC_PUBLIC, new String[]{"java.awt.event.ActionListener"}); @@ -129,7 +129,7 @@ public class ProxyCreator { a.actionPerformed(new ActionEvent(a, ActionEvent.ACTION_PERFORMED, "hello")); } else { - System.err.println("Call me with java org.apache.bcel.util.JavaWrapper ProxyCreator"); + System.err.println("Call me with java org.apache.commons.bcel6.util.JavaWrapper ProxyCreator"); } } diff --git a/src/examples/TransitiveHull.java b/src/examples/TransitiveHull.java index 2c41e491..e774754b 100644 --- a/src/examples/TransitiveHull.java +++ b/src/examples/TransitiveHull.java @@ -19,22 +19,22 @@ import java.util.Arrays; import java.util.regex.Pattern; -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.ConstantCP; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantFieldref; -import org.apache.bcel.classfile.ConstantInterfaceMethodref; -import org.apache.bcel.classfile.ConstantMethodref; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.generic.ArrayType; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.Type; -import org.apache.bcel.util.ClassQueue; -import org.apache.bcel.util.ClassSet; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.ConstantCP; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantFieldref; +import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; +import org.apache.commons.bcel6.classfile.ConstantMethodref; +import org.apache.commons.bcel6.classfile.ConstantNameAndType; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.generic.ArrayType; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.util.ClassQueue; +import org.apache.commons.bcel6.util.ClassSet; /** * Find all classes referenced by given start class and all classes referenced @@ -52,7 +52,7 @@ import org.apache.bcel.util.ClassSet; * @author M. Dahm * @version $Id$ */ -public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { +public class TransitiveHull extends org.apache.commons.bcel6.classfile.EmptyVisitor { private ClassQueue queue; private ClassSet set; @@ -85,7 +85,7 @@ public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { JavaClass clazz = queue.dequeue(); cp = clazz.getConstantPool(); - new org.apache.bcel.classfile.DescendingVisitor(clazz, this).visit(); + new org.apache.commons.bcel6.classfile.DescendingVisitor(clazz, this).visit(); } } diff --git a/src/examples/helloify.java b/src/examples/helloify.java index 08a55f68..f1524e88 100644 --- a/src/examples/helloify.java +++ b/src/examples/helloify.java @@ -16,23 +16,23 @@ * */ -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.GETSTATIC; -import org.apache.bcel.generic.INVOKESPECIAL; -import org.apache.bcel.generic.INVOKEVIRTUAL; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.PUSH; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.Code; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.Utility; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.GETSTATIC; +import org.apache.commons.bcel6.generic.INVOKESPECIAL; +import org.apache.commons.bcel6.generic.INVOKEVIRTUAL; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.PUSH; /** * Read class file(s) and patch all of its methods, so that they print diff --git a/src/examples/id.java b/src/examples/id.java index cdb94101..918bb0b2 100644 --- a/src/examples/id.java +++ b/src/examples/id.java @@ -16,14 +16,14 @@ * */ -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.FieldGen; -import org.apache.bcel.generic.MethodGen; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.FieldGen; +import org.apache.commons.bcel6.generic.MethodGen; /** * Test BCEL if an input file is identical to the outfile generated diff --git a/src/examples/listclass.java b/src/examples/listclass.java index 80d23ef4..a60bf1dd 100644 --- a/src/examples/listclass.java +++ b/src/examples/listclass.java @@ -22,16 +22,16 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.Code; +import org.apache.commons.bcel6.classfile.Constant; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; /** * Read class file(s) and display its contents. The command line usage is: diff --git a/src/examples/maxstack.java b/src/examples/maxstack.java index ad11bdb3..0eb51465 100644 --- a/src/examples/maxstack.java +++ b/src/examples/maxstack.java @@ -16,12 +16,12 @@ * */ -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.MethodGen; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.MethodGen; /** * Read class file(s) and examine all of its methods, determining the diff --git a/src/examples/patchclass.java b/src/examples/patchclass.java index 65aed550..03c16a8e 100644 --- a/src/examples/patchclass.java +++ b/src/examples/patchclass.java @@ -16,10 +16,10 @@ * */ -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.Constant; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.JavaClass; /** * Patch all Utf8 constants in the given class file file.class diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/commons/bcel6/Constants.java similarity index 99% rename from src/main/java/org/apache/bcel/Constants.java rename to src/main/java/org/apache/commons/bcel6/Constants.java index e2c59702..4ddd46c7 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/commons/bcel6/Constants.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel; +package org.apache.commons.bcel6; /** * Constants for the project, mostly defined in the JVM specification. diff --git a/src/main/java/org/apache/bcel/ExceptionConstants.java b/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java similarity index 99% rename from src/main/java/org/apache/bcel/ExceptionConstants.java rename to src/main/java/org/apache/commons/bcel6/ExceptionConstants.java index 589e8c34..10347934 100644 --- a/src/main/java/org/apache/bcel/ExceptionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel; +package org.apache.commons.bcel6; /** * Exception constants. diff --git a/src/main/java/org/apache/bcel/Repository.java b/src/main/java/org/apache/commons/bcel6/Repository.java similarity index 93% rename from src/main/java/org/apache/bcel/Repository.java rename to src/main/java/org/apache/commons/bcel6/Repository.java index 0d64a63c..572b9099 100644 --- a/src/main/java/org/apache/bcel/Repository.java +++ b/src/main/java/org/apache/commons/bcel6/Repository.java @@ -15,39 +15,40 @@ * limitations under the License. * */ -package org.apache.bcel; +package org.apache.commons.bcel6; import java.io.IOException; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.util.ClassPath; -import org.apache.bcel.util.SyntheticRepository; + +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.util.ClassPath; +import org.apache.commons.bcel6.util.SyntheticRepository; /** * The repository maintains informations about class interdependencies, e.g., * whether a class is a sub-class of another. Delegates actual class loading * to SyntheticRepository with current class path by default. * - * @see org.apache.bcel.util.Repository - * @see org.apache.bcel.util.SyntheticRepository + * @see org.apache.commons.bcel6.util.Repository + * @see org.apache.commons.bcel6.util.SyntheticRepository * * @version $Id$ * @author M. Dahm */ public abstract class Repository { - private static org.apache.bcel.util.Repository _repository = SyntheticRepository.getInstance(); + private static org.apache.commons.bcel6.util.Repository _repository = SyntheticRepository.getInstance(); /** @return currently used repository instance */ - public static org.apache.bcel.util.Repository getRepository() { + public static org.apache.commons.bcel6.util.Repository getRepository() { return _repository; } /** Set repository instance to be used for class loading */ - public static void setRepository( org.apache.bcel.util.Repository rep ) { + public static void setRepository( org.apache.commons.bcel6.util.Repository rep ) { _repository = rep; } diff --git a/src/main/java/org/apache/bcel/classfile/AccessFlags.java b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/AccessFlags.java rename to src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java index d3da47c4..80451aa5 100644 --- a/src/main/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * Super class for all objects that have modifiers like private, final, ... diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java similarity index 97% rename from src/main/java/org/apache/bcel/classfile/AnnotationDefault.java rename to src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java index a1c72408..052a3f8d 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * Represents the default value of a annotation for a method info diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationElementValue.java similarity index 97% rename from src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java rename to src/main/java/org/apache/commons/bcel6/classfile/AnnotationElementValue.java index 4c699c59..8a3ce54c 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationElementValue.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataOutputStream; import java.io.IOException; diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/AnnotationEntry.java rename to src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java index ff768fb2..223bf51b 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; @@ -25,7 +25,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * represents one annotation in the annotation table diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/Annotations.java rename to src/main/java/org/apache/commons/bcel6/classfile/Annotations.java index 113c3144..1b19026b 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ArrayElementValue.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/ArrayElementValue.java rename to src/main/java/org/apache/commons/bcel6/classfile/ArrayElementValue.java index 58297262..7c6cee4f 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ArrayElementValue.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataOutputStream; import java.io.IOException; diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java similarity index 99% rename from src/main/java/org/apache/bcel/classfile/Attribute.java rename to src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index 8cf157a5..4a96a587 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataInputStream; @@ -24,7 +24,8 @@ import java.io.IOException; import java.io.Serializable; import java.util.HashMap; import java.util.Map; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * Abstract super class for Attribute objects. Currently the diff --git a/src/main/java/org/apache/bcel/classfile/AttributeReader.java b/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/AttributeReader.java rename to src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java index 0306a081..ce4ece46 100644 --- a/src/main/java/org/apache/bcel/classfile/AttributeReader.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; /** * Unknown (non-standard) attributes may be read via user-defined factory diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/BootstrapMethod.java rename to src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java index 47361618..f7028ee7 100644 --- a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class represents a bootstrap method attribute, i.e., the bootstrap diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/BootstrapMethods.java rename to src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java index 911ea1e8..95b48a03 100644 --- a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class represents a BootstrapMethods attribute. diff --git a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ClassElementValue.java similarity index 95% rename from src/main/java/org/apache/bcel/classfile/ClassElementValue.java rename to src/main/java/org/apache/commons/bcel6/classfile/ClassElementValue.java index 46a81a53..6dcfdda5 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ClassElementValue.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java b/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java similarity index 96% rename from src/main/java/org/apache/bcel/classfile/ClassFormatException.java rename to src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java index 07f8c20c..5a18d096 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; /** * Thrown when the BCEL attempts to read a class file and determines diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java similarity index 99% rename from src/main/java/org/apache/bcel/classfile/ClassParser.java rename to src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java index d58fdff0..567c6c50 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.BufferedInputStream; import java.io.DataInputStream; @@ -25,7 +25,7 @@ import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * Wrapper class that parses a given Java .class file. The method Code diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java similarity index 97% rename from src/main/java/org/apache/bcel/classfile/Constant.java rename to src/main/java/org/apache/commons/bcel6/classfile/Constant.java index f7a3dbc5..cfb382d7 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java @@ -15,15 +15,15 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; -import org.apache.bcel.Constants; -import org.apache.bcel.util.BCELComparator; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.util.BCELComparator; /** * Abstract superclass for classes to represent the different constant types diff --git a/src/main/java/org/apache/bcel/classfile/ConstantCP.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/ConstantCP.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java index 21255ebe..eae8b579 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * Abstract super class for Fieldref, Methodref, InterfaceMethodref and diff --git a/src/main/java/org/apache/bcel/classfile/ConstantClass.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java similarity index 95% rename from src/main/java/org/apache/bcel/classfile/ConstantClass.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java index 3fa64f03..84ecdc9e 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java @@ -15,17 +15,17 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from the abstract - * Constant class + * Constant class * and represents a reference to a (external) class. * * @version $Id$ diff --git a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java similarity index 94% rename from src/main/java/org/apache/bcel/classfile/ConstantDouble.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java index 0f2ffcf5..5f0ccbba 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java @@ -15,17 +15,17 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from the abstract - * Constant class + * Constant class * and represents a reference to a Double object. * * @version $Id$ diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java similarity index 96% rename from src/main/java/org/apache/bcel/classfile/ConstantFieldref.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java index 9eb2c595..169e4bd4 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class represents a constant pool reference to a field. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java similarity index 94% rename from src/main/java/org/apache/bcel/classfile/ConstantFloat.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java index 6ce33c9b..ee6f61f3 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java @@ -15,17 +15,17 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from the abstract - * Constant class + * Constant class * and represents a reference to a float object. * * @version $Id$ diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java similarity index 94% rename from src/main/java/org/apache/bcel/classfile/ConstantInteger.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java index 56c2d062..0b38a513 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java @@ -15,17 +15,17 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from the abstract - * Constant class + * Constant class * and represents a reference to an int object. * * @version $Id$ diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java similarity index 96% rename from src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java index 72d1567d..b5b5c14e 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class represents a constant pool reference to an interface method. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java similarity index 93% rename from src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java index 3378af9b..2e3e0af2 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java @@ -15,16 +15,16 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from the abstract - * Constant class + * Constant class * and represents a reference to a invoke dynamic. * * @see Constant diff --git a/src/main/java/org/apache/bcel/classfile/ConstantLong.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java similarity index 94% rename from src/main/java/org/apache/bcel/classfile/ConstantLong.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java index 1fd33634..c5682ea2 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java @@ -15,17 +15,17 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from the abstract - * Constant class + * Constant class * and represents a reference to a long object. * * @version $Id$ diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java similarity index 95% rename from src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java index 80fd97f1..a841e87e 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java @@ -15,17 +15,17 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from the abstract - * Constant class + * Constant class * and represents a reference to a method handle. * * @see Constant diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java similarity index 94% rename from src/main/java/org/apache/bcel/classfile/ConstantMethodType.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java index 653f1151..98c190a0 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java @@ -15,17 +15,17 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from the abstract - * Constant class + * Constant class * and represents a reference to a method type. * * @see Constant diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java similarity index 96% rename from src/main/java/org/apache/bcel/classfile/ConstantMethodref.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java index 345e726f..d04be767 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class represents a constant pool reference to a method. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java similarity index 96% rename from src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java index 2bc2db8c..a00d07b3 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java @@ -15,17 +15,17 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from the abstract - * Constant class + * Constant class * and represents a reference to the name and signature * of a field or method. * diff --git a/src/main/java/org/apache/bcel/classfile/ConstantObject.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantObject.java similarity index 96% rename from src/main/java/org/apache/bcel/classfile/ConstantObject.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantObject.java index c9936ad6..7d825550 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantObject.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantObject.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; /** * This interface denotes those constants that have a "natural" value, diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/ConstantPool.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java index b2f5b20c..82789ab3 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java @@ -15,13 +15,14 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class represents the constant pool, i.e., a table of constants, of @@ -33,7 +34,7 @@ import org.apache.bcel.Constants; * @version $Id$ * @see Constant - * @see org.apache.bcel.generic.ConstantPoolGen + * @see org.apache.commons.bcel6.generic.ConstantPoolGen * @author M. Dahm */ public class ConstantPool implements Cloneable, Node, Serializable { diff --git a/src/main/java/org/apache/bcel/classfile/ConstantString.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java similarity index 95% rename from src/main/java/org/apache/bcel/classfile/ConstantString.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java index 7d26f186..fce3e888 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java @@ -15,17 +15,17 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from the abstract - * Constant class + * Constant class * and represents a reference to a String object. * * @version $Id$ diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java similarity index 97% rename from src/main/java/org/apache/bcel/classfile/ConstantUtf8.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java index f754f835..7685fa84 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; @@ -24,11 +24,11 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from the abstract - * Constant class + * Constant class * and represents a reference to a Utf8 encoded string. * * @version $Id$ diff --git a/src/main/java/org/apache/bcel/classfile/ConstantValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/ConstantValue.java rename to src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java index 677f5d7f..4af8b381 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from Attribute and represents a constant diff --git a/src/main/java/org/apache/bcel/classfile/Deprecated.java b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java similarity index 97% rename from src/main/java/org/apache/bcel/classfile/Deprecated.java rename to src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java index 041264f1..051c9200 100644 --- a/src/main/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class is derived from Attribute and denotes that this is a diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java similarity index 99% rename from src/main/java/org/apache/bcel/classfile/DescendingVisitor.java rename to src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java index bb6c550e..80c0c627 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.util.Stack; diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/ElementValue.java rename to src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java index 52ceb228..87413c64 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java similarity index 96% rename from src/main/java/org/apache/bcel/classfile/ElementValuePair.java rename to src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java index 5866f2d2..c7477fcd 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * an annotation's element value pair diff --git a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/EmptyVisitor.java rename to src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java index 42bc30fe..e1994c21 100644 --- a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; /** * Visitor with empty method bodies, can be extended and used in conjunction diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java similarity index 97% rename from src/main/java/org/apache/bcel/classfile/EnclosingMethod.java rename to src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java index 6d6d6c0f..d5ae169f 100644 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This attribute exists for local or diff --git a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/EnumElementValue.java similarity index 96% rename from src/main/java/org/apache/bcel/classfile/EnumElementValue.java rename to src/main/java/org/apache/commons/bcel6/classfile/EnumElementValue.java index 8cd3af75..53b284be 100644 --- a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EnumElementValue.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/ExceptionTable.java rename to src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java index 10fe6889..8785194a 100644 --- a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java @@ -15,12 +15,13 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class represents the table of exceptions that are thrown by a diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/commons/bcel6/classfile/Field.java similarity index 96% rename from src/main/java/org/apache/bcel/classfile/Field.java rename to src/main/java/org/apache/commons/bcel6/classfile/Field.java index 92193495..f2eb0ca7 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Field.java @@ -15,13 +15,14 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.Type; -import org.apache.bcel.util.BCELComparator; + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.util.BCELComparator; /** * This class represents the field info structure, i.e., the representation diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/FieldOrMethod.java rename to src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index efbacd10..c5603aed 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -15,13 +15,14 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * Abstract super class for fields and methods. diff --git a/src/main/java/org/apache/bcel/classfile/InnerClass.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/InnerClass.java rename to src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java index 47687f30..acfb9327 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class represents a inner class attribute, i.e., the class diff --git a/src/main/java/org/apache/bcel/classfile/InnerClasses.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/InnerClasses.java rename to src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java index 076d9396..56af457e 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class is derived from Attribute and denotes that this class diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java similarity index 97% rename from src/main/java/org/apache/bcel/classfile/JavaClass.java rename to src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index df8b1706..2553f369 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; @@ -28,11 +28,12 @@ import java.util.List; import java.util.Set; import java.util.StringTokenizer; import java.util.TreeSet; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.Type; -import org.apache.bcel.util.BCELComparator; -import org.apache.bcel.util.ClassQueue; -import org.apache.bcel.util.SyntheticRepository; + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.util.BCELComparator; +import org.apache.commons.bcel6.util.ClassQueue; +import org.apache.commons.bcel6.util.SyntheticRepository; /** * Represents a Java class, i.e., the data structures, constant pool, @@ -43,7 +44,7 @@ import org.apache.bcel.util.SyntheticRepository; * should see the ClassGen class. * @version $Id$ - * @see org.apache.bcel.generic.ClassGen + * @see org.apache.commons.bcel6.generic.ClassGen * @author M. Dahm */ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparable { @@ -93,7 +94,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * use the default SyntheticRepository, because we * don't know any better. */ - private transient org.apache.bcel.util.Repository repository = SyntheticRepository + private transient org.apache.commons.bcel6.util.Repository repository = SyntheticRepository .getInstance(); @@ -427,7 +428,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** - * @return A org.apache.bcel.classfile.Method corresponding to + * @return A org.apache.commons.bcel6.classfile.Method corresponding to * java.lang.reflect.Method if any */ public Method getMethod( java.lang.reflect.Method m ) { @@ -748,7 +749,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * Gets the ClassRepository which holds its definition. By default * this is the same as SyntheticRepository.getInstance(); */ - public org.apache.bcel.util.Repository getRepository() { + public org.apache.commons.bcel6.util.Repository getRepository() { return repository; } @@ -757,7 +758,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * Sets the ClassRepository which loaded the JavaClass. * Should be called immediately after parsing is done. */ - public void setRepository( org.apache.bcel.util.Repository repository ) { + public void setRepository( org.apache.commons.bcel6.util.Repository repository ) { this.repository = repository; } diff --git a/src/main/java/org/apache/bcel/classfile/LineNumber.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/LineNumber.java rename to src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java index 85dd27cd..c9fd10cd 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/LineNumberTable.java rename to src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java index cc6b7f5c..fe506b01 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class represents a table of line numbers for debugging diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/LocalVariable.java rename to src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java index 629295e0..8b6252e1 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class represents a local variable within a method. It contains its diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/LocalVariableTable.java rename to src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java index 249b617c..ca5daf7e 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class represents colection of local variables in a diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java rename to src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java index 9a4ee1a0..d69de084 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; // The new table is used when generic types are about... diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/commons/bcel6/classfile/Method.java similarity index 97% rename from src/main/java/org/apache/bcel/classfile/Method.java rename to src/main/java/org/apache/commons/bcel6/classfile/Method.java index bcb2eced..f3126b58 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Method.java @@ -15,13 +15,14 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.Type; -import org.apache.bcel.util.BCELComparator; + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.util.BCELComparator; /** * This class represents the method info structure, i.e., the representation diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameter.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java similarity index 97% rename from src/main/java/org/apache/bcel/classfile/MethodParameter.java rename to src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java index b47e8b7d..17071908 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameter.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * Entry of the parameters table. diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameters.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java similarity index 97% rename from src/main/java/org/apache/bcel/classfile/MethodParameters.java rename to src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java index f9ce7eb1..6ca2407a 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameters.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class represents a MethodParameters attribute. diff --git a/src/main/java/org/apache/bcel/classfile/Node.java b/src/main/java/org/apache/commons/bcel6/classfile/Node.java similarity index 95% rename from src/main/java/org/apache/bcel/classfile/Node.java rename to src/main/java/org/apache/commons/bcel6/classfile/Node.java index 6cae380e..adb35c73 100644 --- a/src/main/java/org/apache/bcel/classfile/Node.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Node.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; /** * Denote class to have an accept method(); diff --git a/src/main/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/PMGClass.java rename to src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java index e7be6aef..66fe9fe2 100644 --- a/src/main/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from Attribute and represents a reference diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java similarity index 97% rename from src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java rename to src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java index ac427e98..23354b74 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; @@ -24,7 +24,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * represents one parameter annotation in the parameter annotation table diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java similarity index 99% rename from src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java rename to src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java index bca5ea74..588f2757 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java similarity index 96% rename from src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java rename to src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java index 89dc8382..2b149c52 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * represents an annotation that is represented in the class file but is not diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java similarity index 95% rename from src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java rename to src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java index 9e7fbe47..7d110aa1 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * Represents a parameter annotation that is represented in the class file diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java similarity index 96% rename from src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java rename to src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java index 2951df87..930bb6d9 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * represents an annotation that is represented in the class file and is diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java similarity index 95% rename from src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java rename to src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java index ae54cd19..6feb5987 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * Represents a parameter annotation that is represented in the class file diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/Signature.java rename to src/main/java/org/apache/commons/bcel6/classfile/Signature.java index 4d95918f..ad438681 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.ByteArrayInputStream; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from Attribute and represents a reference diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/SimpleElementValue.java rename to src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java index 9a9712ee..4c9082ae 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/SourceFile.java rename to src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java index ba550c4d..e40d106f 100644 --- a/src/main/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class is derived from Attribute and represents a reference diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/StackMap.java rename to src/main/java/org/apache/commons/bcel6/classfile/StackMap.java index 57917530..fcf5a9f6 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMap.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class represents a stack map attribute used for diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java similarity index 99% rename from src/main/java/org/apache/bcel/classfile/StackMapEntry.java rename to src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index 26ffba26..3b1f038e 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTable.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/StackMapTable.java rename to src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java index 7263e47c..bb3a1010 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class represents a stack map attribute used for diff --git a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java similarity index 99% rename from src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java rename to src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java index 06ae2045..47bc4f81 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class represents a stack map entry recording the types of diff --git a/src/main/java/org/apache/bcel/classfile/StackMapType.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/StackMapType.java rename to src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java index 640a0474..97b0a988 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This class represents the type of a local variable or item on stack diff --git a/src/main/java/org/apache/bcel/classfile/Synthetic.java b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/Synthetic.java rename to src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java index 346473ab..2d2eaf7a 100644 --- a/src/main/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class is derived from Attribute and declares this class as diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java similarity index 96% rename from src/main/java/org/apache/bcel/classfile/Unknown.java rename to src/main/java/org/apache/commons/bcel6/classfile/Unknown.java index ebc7ffd1..a80e5c24 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java @@ -15,14 +15,15 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; -import org.apache.bcel.Constants; + +import org.apache.commons.bcel6.Constants; /** * This class represents a reference to an unknown (i.e., @@ -34,8 +35,8 @@ import org.apache.bcel.Constants; * * @version $Id$ - * @see org.apache.bcel.classfile.Attribute - * @see org.apache.bcel.classfile.UnknownAttributeReader + * @see org.apache.commons.bcel6.classfile.Attribute + * @see org.apache.commons.bcel6.classfile.UnknownAttributeReader * @author M. Dahm */ public final class Unknown extends Attribute { diff --git a/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java b/src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java rename to src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java index 0975e648..c8ecabda 100644 --- a/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; /** * Unknown (non-standard) attributes may be read via user-defined factory diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java similarity index 99% rename from src/main/java/org/apache/bcel/classfile/Utility.java rename to src/main/java/org/apache/commons/bcel6/classfile/Utility.java index 816c5330..2c7fabbc 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -34,8 +34,8 @@ import java.util.Locale; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; -import org.apache.bcel.Constants; -import org.apache.bcel.util.ByteSequence; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.util.ByteSequence; /** * Utility functions that do not really belong to any class in particular. diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java similarity index 98% rename from src/main/java/org/apache/bcel/classfile/Visitor.java rename to src/main/java/org/apache/commons/bcel6/classfile/Visitor.java index 58c1f1b8..332f9139 100644 --- a/src/main/java/org/apache/bcel/classfile/Visitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; /** * Interface to make use of the Visitor pattern programming style. I.e. a class diff --git a/src/main/java/org/apache/bcel/classfile/package.html b/src/main/java/org/apache/commons/bcel6/classfile/package.html similarity index 100% rename from src/main/java/org/apache/bcel/classfile/package.html rename to src/main/java/org/apache/commons/bcel6/classfile/package.html diff --git a/src/main/java/org/apache/bcel/generic/AALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/AALOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/AALOAD.java index 3e3c6c9f..8a6f1065 100644 --- a/src/main/java/org/apache/bcel/generic/AALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * AALOAD - Load reference from array @@ -32,7 +32,7 @@ public class AALOAD extends ArrayInstruction implements StackProducer { /** Load reference from array */ public AALOAD() { - super(org.apache.bcel.Constants.AALOAD); + super(org.apache.commons.bcel6.Constants.AALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/AASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/AASTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/AASTORE.java index 8027f41c..c5f4e302 100644 --- a/src/main/java/org/apache/bcel/generic/AASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * AASTORE - Store into reference array @@ -32,7 +32,7 @@ public class AASTORE extends ArrayInstruction implements StackConsumer { /** Store into reference array */ public AASTORE() { - super(org.apache.bcel.Constants.AASTORE); + super(org.apache.commons.bcel6.Constants.AASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java b/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/ACONST_NULL.java rename to src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java index f3abfb7e..c4d63be0 100644 --- a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * ACONST_NULL - Push null reference @@ -33,7 +33,7 @@ public class ACONST_NULL extends Instruction implements PushInstruction, TypedIn * Push null reference */ public ACONST_NULL() { - super(org.apache.bcel.Constants.ACONST_NULL, (short) 1); + super(org.apache.commons.bcel6.Constants.ACONST_NULL, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/ALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java similarity index 88% rename from src/main/java/org/apache/bcel/generic/ALOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/ALOAD.java index 9b9f05a9..59a294be 100644 --- a/src/main/java/org/apache/bcel/generic/ALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * ALOAD - Load reference from local variable @@ -34,7 +34,7 @@ public class ALOAD extends LoadInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ ALOAD() { - super(org.apache.bcel.Constants.ALOAD, org.apache.bcel.Constants.ALOAD_0); + super(org.apache.commons.bcel6.Constants.ALOAD, org.apache.commons.bcel6.Constants.ALOAD_0); } @@ -42,7 +42,7 @@ public class ALOAD extends LoadInstruction { * @param n index of local variable */ public ALOAD(int n) { - super(org.apache.bcel.Constants.ALOAD, org.apache.bcel.Constants.ALOAD_0, n); + super(org.apache.commons.bcel6.Constants.ALOAD, org.apache.commons.bcel6.Constants.ALOAD_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/ANEWARRAY.java rename to src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java index 64888b35..e294eff2 100644 --- a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.ExceptionConstants; +import org.apache.commons.bcel6.ExceptionConstants; /** * ANEWARRAY - Create new array of references @@ -41,7 +41,7 @@ public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationIns public ANEWARRAY(int index) { - super(org.apache.bcel.Constants.ANEWARRAY, index); + super(org.apache.commons.bcel6.Constants.ANEWARRAY, index); } diff --git a/src/main/java/org/apache/bcel/generic/ARETURN.java b/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/ARETURN.java rename to src/main/java/org/apache/commons/bcel6/generic/ARETURN.java index 9db295e5..e0409c5b 100644 --- a/src/main/java/org/apache/bcel/generic/ARETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * ARETURN - Return reference from method @@ -33,7 +33,7 @@ public class ARETURN extends ReturnInstruction { * Return reference from method */ public ARETURN() { - super(org.apache.bcel.Constants.ARETURN); + super(org.apache.commons.bcel6.Constants.ARETURN); } diff --git a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java b/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java similarity index 90% rename from src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java rename to src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java index 86f401ef..5c38576b 100644 --- a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * ARRAYLENGTH - Get length of array @@ -32,7 +32,7 @@ public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackP /** Get length of array */ public ARRAYLENGTH() { - super(org.apache.bcel.Constants.ARRAYLENGTH, (short) 1); + super(org.apache.commons.bcel6.Constants.ARRAYLENGTH, (short) 1); } @@ -40,7 +40,7 @@ public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackP */ public Class[] getExceptions() { return new Class[] { - org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION + org.apache.commons.bcel6.ExceptionConstants.NULL_POINTER_EXCEPTION }; } diff --git a/src/main/java/org/apache/bcel/generic/ASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java similarity index 87% rename from src/main/java/org/apache/bcel/generic/ASTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/ASTORE.java index 14a0714f..05e31ac1 100644 --- a/src/main/java/org/apache/bcel/generic/ASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * ASTORE - Store reference into local variable @@ -34,7 +34,7 @@ public class ASTORE extends StoreInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ ASTORE() { - super(org.apache.bcel.Constants.ASTORE, org.apache.bcel.Constants.ASTORE_0); + super(org.apache.commons.bcel6.Constants.ASTORE, org.apache.commons.bcel6.Constants.ASTORE_0); } @@ -42,7 +42,7 @@ public class ASTORE extends StoreInstruction { * @param n index of local variable */ public ASTORE(int n) { - super(org.apache.bcel.Constants.ASTORE, org.apache.bcel.Constants.ASTORE_0, n); + super(org.apache.commons.bcel6.Constants.ASTORE, org.apache.commons.bcel6.Constants.ASTORE_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/ATHROW.java b/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java similarity index 91% rename from src/main/java/org/apache/bcel/generic/ATHROW.java rename to src/main/java/org/apache/commons/bcel6/generic/ATHROW.java index d3795e19..f21ff6f4 100644 --- a/src/main/java/org/apache/bcel/generic/ATHROW.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * ATHROW - Throw exception @@ -33,7 +33,7 @@ public class ATHROW extends Instruction implements UnconditionalBranch, Exceptio * Throw exception */ public ATHROW() { - super(org.apache.bcel.Constants.ATHROW, (short) 1); + super(org.apache.commons.bcel6.Constants.ATHROW, (short) 1); } @@ -41,7 +41,7 @@ public class ATHROW extends Instruction implements UnconditionalBranch, Exceptio */ public Class[] getExceptions() { return new Class[] { - org.apache.bcel.ExceptionConstants.THROWABLE + org.apache.commons.bcel6.ExceptionConstants.THROWABLE }; } diff --git a/src/main/java/org/apache/bcel/generic/AllocationInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/AllocationInstruction.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/AllocationInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/AllocationInstruction.java index cb755fde..dd4737b0 100644 --- a/src/main/java/org/apache/bcel/generic/AllocationInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AllocationInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denote family of instructions that allocates space in the heap. diff --git a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java similarity index 93% rename from src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java rename to src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java index 7f0113c9..f0099fce 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.classfile.AnnotationElementValue; -import org.apache.bcel.classfile.ElementValue; + +import org.apache.commons.bcel6.classfile.AnnotationElementValue; +import org.apache.commons.bcel6.classfile.ElementValue; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java rename to src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java index 96fb40fb..2233f5b2 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -26,14 +26,14 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.apache.bcel.classfile.AnnotationEntry; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.ElementValuePair; -import org.apache.bcel.classfile.RuntimeInvisibleAnnotations; -import org.apache.bcel.classfile.RuntimeInvisibleParameterAnnotations; -import org.apache.bcel.classfile.RuntimeVisibleAnnotations; -import org.apache.bcel.classfile.RuntimeVisibleParameterAnnotations; +import org.apache.commons.bcel6.classfile.AnnotationEntry; +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.ElementValuePair; +import org.apache.commons.bcel6.classfile.RuntimeInvisibleAnnotations; +import org.apache.commons.bcel6.classfile.RuntimeInvisibleParameterAnnotations; +import org.apache.commons.bcel6.classfile.RuntimeVisibleAnnotations; +import org.apache.commons.bcel6.classfile.RuntimeVisibleParameterAnnotations; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java index caa71247..98435e91 100644 --- a/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * Super class for the family of arithmetic instructions. diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java rename to src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java index cc361be2..3576e807 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java @@ -15,15 +15,15 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.apache.bcel.classfile.ArrayElementValue; -import org.apache.bcel.classfile.ElementValue; +import org.apache.commons.bcel6.classfile.ArrayElementValue; +import org.apache.commons.bcel6.classfile.ElementValue; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/ArrayInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java similarity index 65% rename from src/main/java/org/apache/bcel/generic/ArrayInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java index 053fd334..37279b6e 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Super class for instructions dealing with array access such as IALOAD. @@ -46,7 +46,7 @@ public abstract class ArrayInstruction extends Instruction implements ExceptionT public Class[] getExceptions() { - return org.apache.bcel.ExceptionConstants.EXCS_ARRAY_EXCEPTION; + return org.apache.commons.bcel6.ExceptionConstants.EXCS_ARRAY_EXCEPTION; } @@ -54,29 +54,29 @@ public abstract class ArrayInstruction extends Instruction implements ExceptionT */ public Type getType( ConstantPoolGen cp ) { switch (opcode) { - case org.apache.bcel.Constants.IALOAD: - case org.apache.bcel.Constants.IASTORE: + case org.apache.commons.bcel6.Constants.IALOAD: + case org.apache.commons.bcel6.Constants.IASTORE: return Type.INT; - case org.apache.bcel.Constants.CALOAD: - case org.apache.bcel.Constants.CASTORE: + case org.apache.commons.bcel6.Constants.CALOAD: + case org.apache.commons.bcel6.Constants.CASTORE: return Type.CHAR; - case org.apache.bcel.Constants.BALOAD: - case org.apache.bcel.Constants.BASTORE: + case org.apache.commons.bcel6.Constants.BALOAD: + case org.apache.commons.bcel6.Constants.BASTORE: return Type.BYTE; - case org.apache.bcel.Constants.SALOAD: - case org.apache.bcel.Constants.SASTORE: + case org.apache.commons.bcel6.Constants.SALOAD: + case org.apache.commons.bcel6.Constants.SASTORE: return Type.SHORT; - case org.apache.bcel.Constants.LALOAD: - case org.apache.bcel.Constants.LASTORE: + case org.apache.commons.bcel6.Constants.LALOAD: + case org.apache.commons.bcel6.Constants.LASTORE: return Type.LONG; - case org.apache.bcel.Constants.DALOAD: - case org.apache.bcel.Constants.DASTORE: + case org.apache.commons.bcel6.Constants.DALOAD: + case org.apache.commons.bcel6.Constants.DASTORE: return Type.DOUBLE; - case org.apache.bcel.Constants.FALOAD: - case org.apache.bcel.Constants.FASTORE: + case org.apache.commons.bcel6.Constants.FALOAD: + case org.apache.commons.bcel6.Constants.FASTORE: return Type.FLOAT; - case org.apache.bcel.Constants.AALOAD: - case org.apache.bcel.Constants.AASTORE: + case org.apache.commons.bcel6.Constants.AALOAD: + case org.apache.commons.bcel6.Constants.AASTORE: return Type.OBJECT; default: throw new ClassGenException("Oops: unknown case in switch" + opcode); diff --git a/src/main/java/org/apache/bcel/generic/ArrayType.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/ArrayType.java rename to src/main/java/org/apache/commons/bcel6/generic/ArrayType.java index 79fef4dc..27a7f12f 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * Denotes array type, such as int[][] diff --git a/src/main/java/org/apache/bcel/generic/BALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/BALOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/BALOAD.java index 1586d517..53be1bea 100644 --- a/src/main/java/org/apache/bcel/generic/BALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * BALOAD - Load byte or boolean from array @@ -32,7 +32,7 @@ public class BALOAD extends ArrayInstruction implements StackProducer { /** Load byte or boolean from array */ public BALOAD() { - super(org.apache.bcel.Constants.BALOAD); + super(org.apache.commons.bcel6.Constants.BALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/BASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/BASTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/BASTORE.java index b1c7570a..42fea6f1 100644 --- a/src/main/java/org/apache/bcel/generic/BASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * BASTORE - Store into byte or boolean array @@ -32,7 +32,7 @@ public class BASTORE extends ArrayInstruction implements StackConsumer { /** Store byte or boolean into array */ public BASTORE() { - super(org.apache.bcel.Constants.BASTORE); + super(org.apache.commons.bcel6.Constants.BASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/BIPUSH.java b/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/BIPUSH.java rename to src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java index b9bf205b..5ea7e96e 100644 --- a/src/main/java/org/apache/bcel/generic/BIPUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.util.ByteSequence; /** * BIPUSH - Push byte on stack @@ -46,7 +47,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { /** Push byte on stack */ public BIPUSH(byte b) { - super(org.apache.bcel.Constants.BIPUSH, (short) 2); + super(org.apache.commons.bcel6.Constants.BIPUSH, (short) 2); this.b = b; } diff --git a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java b/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java similarity index 92% rename from src/main/java/org/apache/bcel/generic/BREAKPOINT.java rename to src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java index fc1c49d6..ffe767e0 100644 --- a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * BREAKPOINT, JVM dependent, ignored by default @@ -29,7 +29,7 @@ public class BREAKPOINT extends Instruction { public BREAKPOINT() { - super(org.apache.bcel.Constants.BREAKPOINT, (short) 1); + super(org.apache.commons.bcel6.Constants.BREAKPOINT, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/BasicType.java b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/BasicType.java rename to src/main/java/org/apache/commons/bcel6/generic/BasicType.java index 93b7a3ba..6782e663 100644 --- a/src/main/java/org/apache/bcel/generic/BasicType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * Denotes basic type such as int. @@ -34,7 +34,7 @@ public final class BasicType extends Type { * Constructor for basic types such as int, long, `void' * * @param type one of T_INT, T_BOOLEAN, ..., T_VOID - * @see org.apache.bcel.Constants + * @see org.apache.commons.bcel6.Constants */ BasicType(byte type) { super(type, Constants.SHORT_TYPE_NAMES[type]); diff --git a/src/main/java/org/apache/bcel/generic/BranchHandle.java b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/BranchHandle.java rename to src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java index 1b70164b..69326e32 100644 --- a/src/main/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * BranchHandle is returned by specialized InstructionList.append() whenever a diff --git a/src/main/java/org/apache/bcel/generic/BranchInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/BranchInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java index d8f0eaf6..faa67670 100644 --- a/src/main/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.util.ByteSequence; /** * Abstract super class for branching instructions like GOTO, IFEQ, etc.. diff --git a/src/main/java/org/apache/bcel/generic/CALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/CALOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/CALOAD.java index d64de8f1..f581c753 100644 --- a/src/main/java/org/apache/bcel/generic/CALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * CALOAD - Load char from array @@ -32,7 +32,7 @@ public class CALOAD extends ArrayInstruction implements StackProducer { /** Load char from array */ public CALOAD() { - super(org.apache.bcel.Constants.CALOAD); + super(org.apache.commons.bcel6.Constants.CALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/CASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/CASTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/CASTORE.java index 76043b5c..1bc094f4 100644 --- a/src/main/java/org/apache/bcel/generic/CASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * CASTORE - Store into char array @@ -32,7 +32,7 @@ public class CASTORE extends ArrayInstruction implements StackConsumer { /** Store char into array */ public CASTORE() { - super(org.apache.bcel.Constants.CASTORE); + super(org.apache.commons.bcel6.Constants.CASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/CHECKCAST.java b/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/CHECKCAST.java rename to src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java index b280f2e4..6d693966 100644 --- a/src/main/java/org/apache/bcel/generic/CHECKCAST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.ExceptionConstants; +import org.apache.commons.bcel6.ExceptionConstants; /** * CHECKCAST - Check whether object is of given type @@ -44,7 +44,7 @@ public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThro * @param index index to class in constant pool */ public CHECKCAST(int index) { - super(org.apache.bcel.Constants.CHECKCAST, index); + super(org.apache.commons.bcel6.Constants.CHECKCAST, index); } diff --git a/src/main/java/org/apache/bcel/generic/CPInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java similarity index 89% rename from src/main/java/org/apache/bcel/generic/CPInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java index 74e51df8..ab9cab1b 100644 --- a/src/main/java/org/apache/bcel/generic/CPInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java @@ -15,14 +15,15 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.classfile.Constant; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.util.ByteSequence; /** * Abstract super class for instructions that use an index into the @@ -95,7 +96,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct if (c instanceof ConstantClass) { str = str.replace('.', '/'); } - return org.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " + str; + return org.apache.commons.bcel6.Constants.OPCODE_NAMES[opcode] + " " + str; } @@ -135,7 +136,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct */ public Type getType( ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); - String name = cp.getConstantString(index, org.apache.bcel.Constants.CONSTANT_Class); + String name = cp.getConstantString(index, org.apache.commons.bcel6.Constants.CONSTANT_Class); if (!name.startsWith("[")) { name = "L" + name + ";"; } diff --git a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java similarity index 88% rename from src/main/java/org/apache/bcel/generic/ClassElementValueGen.java rename to src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java index 9349383c..5870f5f8 100644 --- a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java @@ -15,16 +15,17 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.classfile.ElementValue; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.ClassElementValue; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.ElementValueGen; + +import org.apache.commons.bcel6.classfile.ClassElementValue; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.ElementValue; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.ElementValueGen; +import org.apache.commons.bcel6.generic.ObjectType; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/ClassGen.java rename to src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index 8b939eb2..917bc4c3 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -15,25 +15,25 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.util.ArrayList; import java.util.List; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.AccessFlags; -import org.apache.bcel.classfile.AnnotationEntry; -import org.apache.bcel.classfile.Annotations; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.RuntimeInvisibleAnnotations; -import org.apache.bcel.classfile.RuntimeVisibleAnnotations; -import org.apache.bcel.classfile.SourceFile; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.util.BCELComparator; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.AccessFlags; +import org.apache.commons.bcel6.classfile.AnnotationEntry; +import org.apache.commons.bcel6.classfile.Annotations; +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.RuntimeInvisibleAnnotations; +import org.apache.commons.bcel6.classfile.RuntimeVisibleAnnotations; +import org.apache.commons.bcel6.classfile.SourceFile; +import org.apache.commons.bcel6.classfile.Utility; +import org.apache.commons.bcel6.util.BCELComparator; /** * Template class for building up a java class. May be initialized with an diff --git a/src/main/java/org/apache/bcel/generic/ClassGenException.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/ClassGenException.java rename to src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java index e76cf0d5..7376f86c 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGenException.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Thrown on internal errors. Extends RuntimeException so it hasn't to be declared diff --git a/src/main/java/org/apache/bcel/generic/ClassObserver.java b/src/main/java/org/apache/commons/bcel6/generic/ClassObserver.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/ClassObserver.java rename to src/main/java/org/apache/commons/bcel6/generic/ClassObserver.java index 789210e8..4410f1ae 100644 --- a/src/main/java/org/apache/bcel/generic/ClassObserver.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassObserver.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Implement this interface if you're interested in changes to a ClassGen object diff --git a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/CodeExceptionGen.java rename to src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java index 0ee9b0db..391be308 100644 --- a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.classfile.CodeException; +import org.apache.commons.bcel6.classfile.CodeException; /** * This class represents an exception handler, i.e., specifies the region where diff --git a/src/main/java/org/apache/bcel/generic/CompoundInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/CompoundInstruction.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/CompoundInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/CompoundInstruction.java index 388c77e4..4ee94fb4 100644 --- a/src/main/java/org/apache/bcel/generic/CompoundInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CompoundInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Wrapper class for `compound' operations, virtual instructions that diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/ConstantPoolGen.java rename to src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index 94480d9a..802e911c 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -15,26 +15,27 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.util.HashMap; import java.util.Map; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantCP; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantDouble; -import org.apache.bcel.classfile.ConstantFieldref; -import org.apache.bcel.classfile.ConstantFloat; -import org.apache.bcel.classfile.ConstantInteger; -import org.apache.bcel.classfile.ConstantInterfaceMethodref; -import org.apache.bcel.classfile.ConstantInvokeDynamic; -import org.apache.bcel.classfile.ConstantLong; -import org.apache.bcel.classfile.ConstantMethodref; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantString; -import org.apache.bcel.classfile.ConstantUtf8; + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.Constant; +import org.apache.commons.bcel6.classfile.ConstantCP; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantDouble; +import org.apache.commons.bcel6.classfile.ConstantFieldref; +import org.apache.commons.bcel6.classfile.ConstantFloat; +import org.apache.commons.bcel6.classfile.ConstantInteger; +import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; +import org.apache.commons.bcel6.classfile.ConstantInvokeDynamic; +import org.apache.commons.bcel6.classfile.ConstantLong; +import org.apache.commons.bcel6.classfile.ConstantMethodref; +import org.apache.commons.bcel6.classfile.ConstantNameAndType; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantString; +import org.apache.commons.bcel6.classfile.ConstantUtf8; /** * This class is used to build up a constant pool. The user adds diff --git a/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPushInstruction.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/ConstantPushInstruction.java index 1539949b..d9a73221 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPushInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denotes a push instruction that produces a literal on the stack diff --git a/src/main/java/org/apache/bcel/generic/ConversionInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/ConversionInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java index 746bbe8e..d89fbed3 100644 --- a/src/main/java/org/apache/bcel/generic/ConversionInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * Super class for the x2y family of instructions. diff --git a/src/main/java/org/apache/bcel/generic/D2F.java b/src/main/java/org/apache/commons/bcel6/generic/D2F.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/D2F.java rename to src/main/java/org/apache/commons/bcel6/generic/D2F.java index 15558738..e855adbc 100644 --- a/src/main/java/org/apache/bcel/generic/D2F.java +++ b/src/main/java/org/apache/commons/bcel6/generic/D2F.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * D2F - Convert double to float @@ -32,7 +32,7 @@ public class D2F extends ConversionInstruction { /** Convert double to float */ public D2F() { - super(org.apache.bcel.Constants.D2F); + super(org.apache.commons.bcel6.Constants.D2F); } diff --git a/src/main/java/org/apache/bcel/generic/D2I.java b/src/main/java/org/apache/commons/bcel6/generic/D2I.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/D2I.java rename to src/main/java/org/apache/commons/bcel6/generic/D2I.java index 4a06f11a..5db6d80e 100644 --- a/src/main/java/org/apache/bcel/generic/D2I.java +++ b/src/main/java/org/apache/commons/bcel6/generic/D2I.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * D2I - Convert double to int @@ -32,7 +32,7 @@ public class D2I extends ConversionInstruction { /** Convert double to int */ public D2I() { - super(org.apache.bcel.Constants.D2I); + super(org.apache.commons.bcel6.Constants.D2I); } diff --git a/src/main/java/org/apache/bcel/generic/D2L.java b/src/main/java/org/apache/commons/bcel6/generic/D2L.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/D2L.java rename to src/main/java/org/apache/commons/bcel6/generic/D2L.java index 1bbc3c14..99cdefab 100644 --- a/src/main/java/org/apache/bcel/generic/D2L.java +++ b/src/main/java/org/apache/commons/bcel6/generic/D2L.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * D2L - Convert double to long @@ -32,7 +32,7 @@ public class D2L extends ConversionInstruction { /** Convert double to long */ public D2L() { - super(org.apache.bcel.Constants.D2L); + super(org.apache.commons.bcel6.Constants.D2L); } diff --git a/src/main/java/org/apache/bcel/generic/DADD.java b/src/main/java/org/apache/commons/bcel6/generic/DADD.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DADD.java rename to src/main/java/org/apache/commons/bcel6/generic/DADD.java index c9a2eb49..17cf2d21 100644 --- a/src/main/java/org/apache/bcel/generic/DADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DADD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DADD - Add doubles @@ -33,7 +33,7 @@ public class DADD extends ArithmeticInstruction { /** Add doubles */ public DADD() { - super(org.apache.bcel.Constants.DADD); + super(org.apache.commons.bcel6.Constants.DADD); } diff --git a/src/main/java/org/apache/bcel/generic/DALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DALOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/DALOAD.java index 3ad7b694..37f738b1 100644 --- a/src/main/java/org/apache/bcel/generic/DALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DALOAD - Load double from array @@ -32,7 +32,7 @@ public class DALOAD extends ArrayInstruction implements StackProducer { /** Load double from array */ public DALOAD() { - super(org.apache.bcel.Constants.DALOAD); + super(org.apache.commons.bcel6.Constants.DALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/DASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DASTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/DASTORE.java index 31f2f1ad..86cbb3f5 100644 --- a/src/main/java/org/apache/bcel/generic/DASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DASTORE - Store into double array @@ -32,7 +32,7 @@ public class DASTORE extends ArrayInstruction implements StackConsumer { /** Store double into array */ public DASTORE() { - super(org.apache.bcel.Constants.DASTORE); + super(org.apache.commons.bcel6.Constants.DASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/DCMPG.java b/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DCMPG.java rename to src/main/java/org/apache/commons/bcel6/generic/DCMPG.java index 2ed3a357..fd0ece0d 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DCMPG - Compare doubles: value1 > value2 @@ -29,7 +29,7 @@ public class DCMPG extends Instruction implements TypedInstruction, StackProduce private static final long serialVersionUID = 1929664840821745262L; public DCMPG() { - super(org.apache.bcel.Constants.DCMPG, (short) 1); + super(org.apache.commons.bcel6.Constants.DCMPG, (short) 1); } /** @return Type.DOUBLE diff --git a/src/main/java/org/apache/bcel/generic/DCMPL.java b/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DCMPL.java rename to src/main/java/org/apache/commons/bcel6/generic/DCMPL.java index e3345720..e45178e3 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DCMPL - Compare doubles: value1 < value2 @@ -29,7 +29,7 @@ public class DCMPL extends Instruction implements TypedInstruction, StackProduce private static final long serialVersionUID = 2514357528484232014L; public DCMPL() { - super(org.apache.bcel.Constants.DCMPL, (short) 1); + super(org.apache.commons.bcel6.Constants.DCMPL, (short) 1); } /** @return Type.DOUBLE diff --git a/src/main/java/org/apache/bcel/generic/DCONST.java b/src/main/java/org/apache/commons/bcel6/generic/DCONST.java similarity index 90% rename from src/main/java/org/apache/bcel/generic/DCONST.java rename to src/main/java/org/apache/commons/bcel6/generic/DCONST.java index 8f79dbe8..2b01358f 100644 --- a/src/main/java/org/apache/bcel/generic/DCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCONST.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DCONST - Push 0.0 or 1.0, other values cause an exception @@ -40,11 +40,11 @@ public class DCONST extends Instruction implements ConstantPushInstruction { public DCONST(double f) { - super(org.apache.bcel.Constants.DCONST_0, (short) 1); + super(org.apache.commons.bcel6.Constants.DCONST_0, (short) 1); if (f == 0.0) { - opcode = org.apache.bcel.Constants.DCONST_0; + opcode = org.apache.commons.bcel6.Constants.DCONST_0; } else if (f == 1.0) { - opcode = org.apache.bcel.Constants.DCONST_1; + opcode = org.apache.commons.bcel6.Constants.DCONST_1; } else { throw new ClassGenException("DCONST can be used only for 0.0 and 1.0: " + f); } diff --git a/src/main/java/org/apache/bcel/generic/DDIV.java b/src/main/java/org/apache/commons/bcel6/generic/DDIV.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DDIV.java rename to src/main/java/org/apache/commons/bcel6/generic/DDIV.java index 807acee5..8ef835e3 100644 --- a/src/main/java/org/apache/bcel/generic/DDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DDIV.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DDIV - Divide doubles @@ -33,7 +33,7 @@ public class DDIV extends ArithmeticInstruction { /** Divide doubles */ public DDIV() { - super(org.apache.bcel.Constants.DDIV); + super(org.apache.commons.bcel6.Constants.DDIV); } diff --git a/src/main/java/org/apache/bcel/generic/DLOAD.java b/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java similarity index 88% rename from src/main/java/org/apache/bcel/generic/DLOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/DLOAD.java index 70148dbe..b9b45cd0 100644 --- a/src/main/java/org/apache/bcel/generic/DLOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DLOAD - Load double from local variable @@ -34,7 +34,7 @@ public class DLOAD extends LoadInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ DLOAD() { - super(org.apache.bcel.Constants.DLOAD, org.apache.bcel.Constants.DLOAD_0); + super(org.apache.commons.bcel6.Constants.DLOAD, org.apache.commons.bcel6.Constants.DLOAD_0); } @@ -42,7 +42,7 @@ public class DLOAD extends LoadInstruction { * @param n index of local variable */ public DLOAD(int n) { - super(org.apache.bcel.Constants.DLOAD, org.apache.bcel.Constants.DLOAD_0, n); + super(org.apache.commons.bcel6.Constants.DLOAD, org.apache.commons.bcel6.Constants.DLOAD_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/DMUL.java b/src/main/java/org/apache/commons/bcel6/generic/DMUL.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DMUL.java rename to src/main/java/org/apache/commons/bcel6/generic/DMUL.java index d8221b39..a397e6dd 100644 --- a/src/main/java/org/apache/bcel/generic/DMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DMUL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DMUL - Multiply doubles @@ -33,7 +33,7 @@ public class DMUL extends ArithmeticInstruction { /** Multiply doubles */ public DMUL() { - super(org.apache.bcel.Constants.DMUL); + super(org.apache.commons.bcel6.Constants.DMUL); } diff --git a/src/main/java/org/apache/bcel/generic/DNEG.java b/src/main/java/org/apache/commons/bcel6/generic/DNEG.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DNEG.java rename to src/main/java/org/apache/commons/bcel6/generic/DNEG.java index 98f511fd..f78c6fd3 100644 --- a/src/main/java/org/apache/bcel/generic/DNEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DNEG.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DNEG - Negate double @@ -30,7 +30,7 @@ public class DNEG extends ArithmeticInstruction { public DNEG() { - super(org.apache.bcel.Constants.DNEG); + super(org.apache.commons.bcel6.Constants.DNEG); } diff --git a/src/main/java/org/apache/bcel/generic/DREM.java b/src/main/java/org/apache/commons/bcel6/generic/DREM.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DREM.java rename to src/main/java/org/apache/commons/bcel6/generic/DREM.java index 8fad7338..09ec66fb 100644 --- a/src/main/java/org/apache/bcel/generic/DREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DREM.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DREM - Remainder of doubles @@ -33,7 +33,7 @@ public class DREM extends ArithmeticInstruction { /** Remainder of doubles */ public DREM() { - super(org.apache.bcel.Constants.DREM); + super(org.apache.commons.bcel6.Constants.DREM); } diff --git a/src/main/java/org/apache/bcel/generic/DRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DRETURN.java rename to src/main/java/org/apache/commons/bcel6/generic/DRETURN.java index de0b872c..22182f52 100644 --- a/src/main/java/org/apache/bcel/generic/DRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DRETURN - Return double from method @@ -32,7 +32,7 @@ public class DRETURN extends ReturnInstruction { /** Return double from method */ public DRETURN() { - super(org.apache.bcel.Constants.DRETURN); + super(org.apache.commons.bcel6.Constants.DRETURN); } diff --git a/src/main/java/org/apache/bcel/generic/DSTORE.java b/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java similarity index 88% rename from src/main/java/org/apache/bcel/generic/DSTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/DSTORE.java index 6404f785..de32d255 100644 --- a/src/main/java/org/apache/bcel/generic/DSTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DSTORE - Store double into local variable @@ -34,7 +34,7 @@ public class DSTORE extends StoreInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ DSTORE() { - super(org.apache.bcel.Constants.DSTORE, org.apache.bcel.Constants.DSTORE_0); + super(org.apache.commons.bcel6.Constants.DSTORE, org.apache.commons.bcel6.Constants.DSTORE_0); } @@ -42,7 +42,7 @@ public class DSTORE extends StoreInstruction { * @param n index of local variable */ public DSTORE(int n) { - super(org.apache.bcel.Constants.DSTORE, org.apache.bcel.Constants.DSTORE_0, n); + super(org.apache.commons.bcel6.Constants.DSTORE, org.apache.commons.bcel6.Constants.DSTORE_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/DSUB.java b/src/main/java/org/apache/commons/bcel6/generic/DSUB.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DSUB.java rename to src/main/java/org/apache/commons/bcel6/generic/DSUB.java index ffea5326..c2d000b5 100644 --- a/src/main/java/org/apache/bcel/generic/DSUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DSUB.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DSUB - Substract doubles @@ -33,7 +33,7 @@ public class DSUB extends ArithmeticInstruction { /** Substract doubles */ public DSUB() { - super(org.apache.bcel.Constants.DSUB); + super(org.apache.commons.bcel6.Constants.DSUB); } diff --git a/src/main/java/org/apache/bcel/generic/DUP.java b/src/main/java/org/apache/commons/bcel6/generic/DUP.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DUP.java rename to src/main/java/org/apache/commons/bcel6/generic/DUP.java index 4ce01637..5309f58f 100644 --- a/src/main/java/org/apache/bcel/generic/DUP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DUP - Duplicate top operand stack word @@ -30,7 +30,7 @@ public class DUP extends StackInstruction implements PushInstruction { public DUP() { - super(org.apache.bcel.Constants.DUP); + super(org.apache.commons.bcel6.Constants.DUP); } diff --git a/src/main/java/org/apache/bcel/generic/DUP2.java b/src/main/java/org/apache/commons/bcel6/generic/DUP2.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DUP2.java rename to src/main/java/org/apache/commons/bcel6/generic/DUP2.java index 13238b45..7bb85afa 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP2.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DUP2 - Duplicate two top operand stack words @@ -30,7 +30,7 @@ public class DUP2 extends StackInstruction implements PushInstruction { public DUP2() { - super(org.apache.bcel.Constants.DUP2); + super(org.apache.commons.bcel6.Constants.DUP2); } diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X1.java b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DUP2_X1.java rename to src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java index 31312645..46a83784 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X1.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DUP2_X1 - Duplicate two top operand stack words and put three down @@ -30,7 +30,7 @@ public class DUP2_X1 extends StackInstruction { public DUP2_X1() { - super(org.apache.bcel.Constants.DUP2_X1); + super(org.apache.commons.bcel6.Constants.DUP2_X1); } diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X2.java b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DUP2_X2.java rename to src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java index 8e508ebd..78c7b7ed 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DUP2_X2 - Duplicate two top operand stack words and put four down @@ -30,7 +30,7 @@ public class DUP2_X2 extends StackInstruction { public DUP2_X2() { - super(org.apache.bcel.Constants.DUP2_X2); + super(org.apache.commons.bcel6.Constants.DUP2_X2); } diff --git a/src/main/java/org/apache/bcel/generic/DUP_X1.java b/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DUP_X1.java rename to src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java index 0f445986..5364318c 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X1.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DUP_X1 - Duplicate top operand stack word and put two down @@ -30,7 +30,7 @@ public class DUP_X1 extends StackInstruction { public DUP_X1() { - super(org.apache.bcel.Constants.DUP_X1); + super(org.apache.commons.bcel6.Constants.DUP_X1); } diff --git a/src/main/java/org/apache/bcel/generic/DUP_X2.java b/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/DUP_X2.java rename to src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java index cf1cba50..9659a646 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * DUP_X2 - Duplicate top operand stack word and put three down @@ -30,7 +30,7 @@ public class DUP_X2 extends StackInstruction { public DUP_X2() { - super(org.apache.bcel.Constants.DUP_X2); + super(org.apache.commons.bcel6.Constants.DUP_X2); } diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java similarity index 93% rename from src/main/java/org/apache/bcel/generic/ElementValueGen.java rename to src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java index 5e8cf006..4c23fb09 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java @@ -15,19 +15,19 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.classfile.AnnotationElementValue; -import org.apache.bcel.classfile.AnnotationEntry; -import org.apache.bcel.classfile.ArrayElementValue; -import org.apache.bcel.classfile.ClassElementValue; -import org.apache.bcel.classfile.ElementValue; -import org.apache.bcel.classfile.EnumElementValue; -import org.apache.bcel.classfile.SimpleElementValue; +import org.apache.commons.bcel6.classfile.AnnotationElementValue; +import org.apache.commons.bcel6.classfile.AnnotationEntry; +import org.apache.commons.bcel6.classfile.ArrayElementValue; +import org.apache.commons.bcel6.classfile.ClassElementValue; +import org.apache.commons.bcel6.classfile.ElementValue; +import org.apache.commons.bcel6.classfile.EnumElementValue; +import org.apache.commons.bcel6.classfile.SimpleElementValue; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java b/src/main/java/org/apache/commons/bcel6/generic/ElementValuePairGen.java similarity index 93% rename from src/main/java/org/apache/bcel/generic/ElementValuePairGen.java rename to src/main/java/org/apache/commons/bcel6/generic/ElementValuePairGen.java index 4c74a8cb..187f6c0b 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ElementValuePairGen.java @@ -15,13 +15,14 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.ElementValue; -import org.apache.bcel.classfile.ElementValuePair; + +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.ElementValue; +import org.apache.commons.bcel6.classfile.ElementValuePair; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java b/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java similarity index 99% rename from src/main/java/org/apache/bcel/generic/EmptyVisitor.java rename to src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java index 6af8f933..f843b181 100644 --- a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Supplies empty method bodies to be overridden by subclasses. diff --git a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/EnumElementValueGen.java rename to src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java index 50b81e1c..f124ca33 100644 --- a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java @@ -15,13 +15,14 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.ElementValue; -import org.apache.bcel.classfile.EnumElementValue; + +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.ElementValue; +import org.apache.commons.bcel6.classfile.EnumElementValue; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/ExceptionThrower.java b/src/main/java/org/apache/commons/bcel6/generic/ExceptionThrower.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/ExceptionThrower.java rename to src/main/java/org/apache/commons/bcel6/generic/ExceptionThrower.java index 29cba190..fa995407 100644 --- a/src/main/java/org/apache/bcel/generic/ExceptionThrower.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ExceptionThrower.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denote an instruction that may throw a run-time or a linking diff --git a/src/main/java/org/apache/bcel/generic/F2D.java b/src/main/java/org/apache/commons/bcel6/generic/F2D.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/F2D.java rename to src/main/java/org/apache/commons/bcel6/generic/F2D.java index 80f6e39e..fcb9449c 100644 --- a/src/main/java/org/apache/bcel/generic/F2D.java +++ b/src/main/java/org/apache/commons/bcel6/generic/F2D.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * F2D - Convert float to double @@ -32,7 +32,7 @@ public class F2D extends ConversionInstruction { /** Convert float to double */ public F2D() { - super(org.apache.bcel.Constants.F2D); + super(org.apache.commons.bcel6.Constants.F2D); } diff --git a/src/main/java/org/apache/bcel/generic/F2I.java b/src/main/java/org/apache/commons/bcel6/generic/F2I.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/F2I.java rename to src/main/java/org/apache/commons/bcel6/generic/F2I.java index 3d17a1dd..58c36aba 100644 --- a/src/main/java/org/apache/bcel/generic/F2I.java +++ b/src/main/java/org/apache/commons/bcel6/generic/F2I.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * F2I - Convert float to int @@ -32,7 +32,7 @@ public class F2I extends ConversionInstruction { /** Convert float to int */ public F2I() { - super(org.apache.bcel.Constants.F2I); + super(org.apache.commons.bcel6.Constants.F2I); } diff --git a/src/main/java/org/apache/bcel/generic/F2L.java b/src/main/java/org/apache/commons/bcel6/generic/F2L.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/F2L.java rename to src/main/java/org/apache/commons/bcel6/generic/F2L.java index 06883d7c..8883afdd 100644 --- a/src/main/java/org/apache/bcel/generic/F2L.java +++ b/src/main/java/org/apache/commons/bcel6/generic/F2L.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * F2L - Convert float to long @@ -32,7 +32,7 @@ public class F2L extends ConversionInstruction { /** Convert float to long */ public F2L() { - super(org.apache.bcel.Constants.F2L); + super(org.apache.commons.bcel6.Constants.F2L); } diff --git a/src/main/java/org/apache/bcel/generic/FADD.java b/src/main/java/org/apache/commons/bcel6/generic/FADD.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/FADD.java rename to src/main/java/org/apache/commons/bcel6/generic/FADD.java index d24c5bf1..8baba4fe 100644 --- a/src/main/java/org/apache/bcel/generic/FADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FADD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FADD - Add floats @@ -32,7 +32,7 @@ public class FADD extends ArithmeticInstruction { /** Add floats */ public FADD() { - super(org.apache.bcel.Constants.FADD); + super(org.apache.commons.bcel6.Constants.FADD); } diff --git a/src/main/java/org/apache/bcel/generic/FALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/FALOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/FALOAD.java index ffc8f6fb..a16dae43 100644 --- a/src/main/java/org/apache/bcel/generic/FALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FALOAD - Load float from array @@ -32,7 +32,7 @@ public class FALOAD extends ArrayInstruction implements StackProducer { /** Load float from array */ public FALOAD() { - super(org.apache.bcel.Constants.FALOAD); + super(org.apache.commons.bcel6.Constants.FALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/FASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/FASTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/FASTORE.java index fec19b2c..a42300d7 100644 --- a/src/main/java/org/apache/bcel/generic/FASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FASTORE - Store into float array @@ -32,7 +32,7 @@ public class FASTORE extends ArrayInstruction implements StackConsumer { /** Store float into array */ public FASTORE() { - super(org.apache.bcel.Constants.FASTORE); + super(org.apache.commons.bcel6.Constants.FASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/FCMPG.java b/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/FCMPG.java rename to src/main/java/org/apache/commons/bcel6/generic/FCMPG.java index 7d70167e..37ccb791 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FCMPG - Compare floats: value1 > value2 @@ -30,7 +30,7 @@ public class FCMPG extends Instruction implements TypedInstruction, StackProduce public FCMPG() { - super(org.apache.bcel.Constants.FCMPG, (short) 1); + super(org.apache.commons.bcel6.Constants.FCMPG, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/FCMPL.java b/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/FCMPL.java rename to src/main/java/org/apache/commons/bcel6/generic/FCMPL.java index 705c1912..6c01d8b4 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FCMPL - Compare floats: value1 < value2 @@ -30,7 +30,7 @@ public class FCMPL extends Instruction implements TypedInstruction, StackProduce public FCMPL() { - super(org.apache.bcel.Constants.FCMPL, (short) 1); + super(org.apache.commons.bcel6.Constants.FCMPL, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/FCONST.java b/src/main/java/org/apache/commons/bcel6/generic/FCONST.java similarity index 88% rename from src/main/java/org/apache/bcel/generic/FCONST.java rename to src/main/java/org/apache/commons/bcel6/generic/FCONST.java index e1900e30..17dc5190 100644 --- a/src/main/java/org/apache/bcel/generic/FCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCONST.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FCONST - Push 0.0, 1.0 or 2.0, other values cause an exception @@ -40,13 +40,13 @@ public class FCONST extends Instruction implements ConstantPushInstruction { public FCONST(float f) { - super(org.apache.bcel.Constants.FCONST_0, (short) 1); + super(org.apache.commons.bcel6.Constants.FCONST_0, (short) 1); if (f == 0.0) { - opcode = org.apache.bcel.Constants.FCONST_0; + opcode = org.apache.commons.bcel6.Constants.FCONST_0; } else if (f == 1.0) { - opcode = org.apache.bcel.Constants.FCONST_1; + opcode = org.apache.commons.bcel6.Constants.FCONST_1; } else if (f == 2.0) { - opcode = org.apache.bcel.Constants.FCONST_2; + opcode = org.apache.commons.bcel6.Constants.FCONST_2; } else { throw new ClassGenException("FCONST can be used only for 0.0, 1.0 and 2.0: " + f); } diff --git a/src/main/java/org/apache/bcel/generic/FDIV.java b/src/main/java/org/apache/commons/bcel6/generic/FDIV.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/FDIV.java rename to src/main/java/org/apache/commons/bcel6/generic/FDIV.java index fe886a20..ffd0398b 100644 --- a/src/main/java/org/apache/bcel/generic/FDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FDIV.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FDIV - Divide floats @@ -32,7 +32,7 @@ public class FDIV extends ArithmeticInstruction { /** Divide floats */ public FDIV() { - super(org.apache.bcel.Constants.FDIV); + super(org.apache.commons.bcel6.Constants.FDIV); } diff --git a/src/main/java/org/apache/bcel/generic/FLOAD.java b/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java similarity index 88% rename from src/main/java/org/apache/bcel/generic/FLOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/FLOAD.java index 34267cfd..cf11b11e 100644 --- a/src/main/java/org/apache/bcel/generic/FLOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FLOAD - Load float from local variable @@ -34,7 +34,7 @@ public class FLOAD extends LoadInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ FLOAD() { - super(org.apache.bcel.Constants.FLOAD, org.apache.bcel.Constants.FLOAD_0); + super(org.apache.commons.bcel6.Constants.FLOAD, org.apache.commons.bcel6.Constants.FLOAD_0); } @@ -42,7 +42,7 @@ public class FLOAD extends LoadInstruction { * @param n index of local variable */ public FLOAD(int n) { - super(org.apache.bcel.Constants.FLOAD, org.apache.bcel.Constants.FLOAD_0, n); + super(org.apache.commons.bcel6.Constants.FLOAD, org.apache.commons.bcel6.Constants.FLOAD_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/FMUL.java b/src/main/java/org/apache/commons/bcel6/generic/FMUL.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/FMUL.java rename to src/main/java/org/apache/commons/bcel6/generic/FMUL.java index 3d5ca623..17b3ed30 100644 --- a/src/main/java/org/apache/bcel/generic/FMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FMUL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FMUL - Multiply floats @@ -32,7 +32,7 @@ public class FMUL extends ArithmeticInstruction { /** Multiply floats */ public FMUL() { - super(org.apache.bcel.Constants.FMUL); + super(org.apache.commons.bcel6.Constants.FMUL); } diff --git a/src/main/java/org/apache/bcel/generic/FNEG.java b/src/main/java/org/apache/commons/bcel6/generic/FNEG.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/FNEG.java rename to src/main/java/org/apache/commons/bcel6/generic/FNEG.java index dcc6a355..8081b311 100644 --- a/src/main/java/org/apache/bcel/generic/FNEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FNEG.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FNEG - Negate float @@ -30,7 +30,7 @@ public class FNEG extends ArithmeticInstruction { public FNEG() { - super(org.apache.bcel.Constants.FNEG); + super(org.apache.commons.bcel6.Constants.FNEG); } diff --git a/src/main/java/org/apache/bcel/generic/FREM.java b/src/main/java/org/apache/commons/bcel6/generic/FREM.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/FREM.java rename to src/main/java/org/apache/commons/bcel6/generic/FREM.java index 68b32f8b..0705df67 100644 --- a/src/main/java/org/apache/bcel/generic/FREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FREM.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FREM - Remainder of floats @@ -32,7 +32,7 @@ public class FREM extends ArithmeticInstruction { /** Remainder of floats */ public FREM() { - super(org.apache.bcel.Constants.FREM); + super(org.apache.commons.bcel6.Constants.FREM); } diff --git a/src/main/java/org/apache/bcel/generic/FRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/FRETURN.java rename to src/main/java/org/apache/commons/bcel6/generic/FRETURN.java index 8c70b2da..18684c41 100644 --- a/src/main/java/org/apache/bcel/generic/FRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FRETURN - Return float from method @@ -32,7 +32,7 @@ public class FRETURN extends ReturnInstruction { /** Return float from method */ public FRETURN() { - super(org.apache.bcel.Constants.FRETURN); + super(org.apache.commons.bcel6.Constants.FRETURN); } diff --git a/src/main/java/org/apache/bcel/generic/FSTORE.java b/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java similarity index 87% rename from src/main/java/org/apache/bcel/generic/FSTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/FSTORE.java index e3786b55..937dcf6d 100644 --- a/src/main/java/org/apache/bcel/generic/FSTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FSTORE - Store float into local variable @@ -34,7 +34,7 @@ public class FSTORE extends StoreInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ FSTORE() { - super(org.apache.bcel.Constants.FSTORE, org.apache.bcel.Constants.FSTORE_0); + super(org.apache.commons.bcel6.Constants.FSTORE, org.apache.commons.bcel6.Constants.FSTORE_0); } @@ -42,7 +42,7 @@ public class FSTORE extends StoreInstruction { * @param n index of local variable */ public FSTORE(int n) { - super(org.apache.bcel.Constants.FSTORE, org.apache.bcel.Constants.FSTORE_0, n); + super(org.apache.commons.bcel6.Constants.FSTORE, org.apache.commons.bcel6.Constants.FSTORE_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/FSUB.java b/src/main/java/org/apache/commons/bcel6/generic/FSUB.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/FSUB.java rename to src/main/java/org/apache/commons/bcel6/generic/FSUB.java index ece434e1..0f333584 100644 --- a/src/main/java/org/apache/bcel/generic/FSUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FSUB.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * FSUB - Substract floats @@ -32,7 +32,7 @@ public class FSUB extends ArithmeticInstruction { /** Substract floats */ public FSUB() { - super(org.apache.bcel.Constants.FSUB); + super(org.apache.commons.bcel6.Constants.FSUB); } diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/FieldGen.java rename to src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index d4fcc86a..029d8a40 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -15,21 +15,22 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.util.ArrayList; import java.util.List; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.AnnotationEntry; -import org.apache.bcel.classfile.Annotations; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantObject; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantValue; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.util.BCELComparator; + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.AnnotationEntry; +import org.apache.commons.bcel6.classfile.Annotations; +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.Constant; +import org.apache.commons.bcel6.classfile.ConstantObject; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantValue; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.Utility; +import org.apache.commons.bcel6.util.BCELComparator; /** * Template class for building up a field. The only extraordinary thing diff --git a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java rename to src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java index ca8dac34..160805aa 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.util.ArrayList; import java.util.List; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.AccessFlags; -import org.apache.bcel.classfile.Attribute; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.AccessFlags; +import org.apache.commons.bcel6.classfile.Attribute; /** * Super class for FieldGen and MethodGen objects, since they have diff --git a/src/main/java/org/apache/bcel/generic/FieldInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java similarity index 88% rename from src/main/java/org/apache/bcel/generic/FieldInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java index f0df0919..ef12badd 100644 --- a/src/main/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantPool; /** * Super class for the GET/PUTxxx family of instructions. @@ -51,8 +51,8 @@ public abstract class FieldInstruction extends FieldOrMethod { */ @Override public String toString( ConstantPool cp ) { - return org.apache.bcel.Constants.OPCODE_NAMES[opcode] + " " - + cp.constantToString(index, org.apache.bcel.Constants.CONSTANT_Fieldref); + return org.apache.commons.bcel6.Constants.OPCODE_NAMES[opcode] + " " + + cp.constantToString(index, org.apache.commons.bcel6.Constants.CONSTANT_Fieldref); } diff --git a/src/main/java/org/apache/bcel/generic/FieldObserver.java b/src/main/java/org/apache/commons/bcel6/generic/FieldObserver.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/FieldObserver.java rename to src/main/java/org/apache/commons/bcel6/generic/FieldObserver.java index 0e686334..7ba1f6f2 100644 --- a/src/main/java/org/apache/bcel/generic/FieldObserver.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldObserver.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Imnplement this interface if you're interested in changes to a FieldGen object diff --git a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java similarity index 92% rename from src/main/java/org/apache/bcel/generic/FieldOrMethod.java rename to src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java index f9a926af..1b52b6cc 100644 --- a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.classfile.ConstantCP; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.ConstantCP; +import org.apache.commons.bcel6.classfile.ConstantNameAndType; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantUtf8; // We have removed Deprecated from getClassName() as we continue to use // it with our tools and want to remove warnings. (markro) @@ -87,7 +87,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { ConstantPool cp = cpg.getConstantPool(); ConstantCP cmr = (ConstantCP) cp.getConstant(index); String className = cp.getConstantString(cmr.getClassIndex(), - org.apache.bcel.Constants.CONSTANT_Class); + org.apache.commons.bcel6.Constants.CONSTANT_Class); if (className.startsWith("[")) { // Turn array classes into java.lang.Object. return "java.lang.Object"; @@ -119,7 +119,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { ConstantPool cp = cpg.getConstantPool(); ConstantCP cmr = (ConstantCP) cp.getConstant(index); String className = cp.getConstantString(cmr.getClassIndex(), - org.apache.bcel.Constants.CONSTANT_Class); + org.apache.commons.bcel6.Constants.CONSTANT_Class); if (className.startsWith("[")) { return (ArrayType) Type.getType(className); } else { diff --git a/src/main/java/org/apache/bcel/generic/GETFIELD.java b/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/GETFIELD.java rename to src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java index 3d79728f..5ea1586a 100644 --- a/src/main/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.ExceptionConstants; /** * GETFIELD - Fetch field from object diff --git a/src/main/java/org/apache/bcel/generic/GETSTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/GETSTATIC.java rename to src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java index d145bc2f..730cb070 100644 --- a/src/main/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.ExceptionConstants; /** * GETSTATIC - Fetch static field from class diff --git a/src/main/java/org/apache/bcel/generic/GOTO.java b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java similarity index 92% rename from src/main/java/org/apache/bcel/generic/GOTO.java rename to src/main/java/org/apache/commons/bcel6/generic/GOTO.java index 2babadb6..328bac70 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; @@ -40,7 +40,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { public GOTO(InstructionHandle target) { - super(org.apache.bcel.Constants.GOTO, target); + super(org.apache.commons.bcel6.Constants.GOTO, target); } @@ -51,7 +51,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { @Override public void dump( DataOutputStream out ) throws IOException { index = getTargetOffset(); - if (opcode == org.apache.bcel.Constants.GOTO) { + if (opcode == org.apache.commons.bcel6.Constants.GOTO) { super.dump(out); } else { // GOTO_W index = getTargetOffset(); @@ -69,7 +69,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { int i = getTargetOffset(); // Depending on old position value position += offset; // Position may be shifted by preceding expansions if (Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) - opcode = org.apache.bcel.Constants.GOTO_W; + opcode = org.apache.commons.bcel6.Constants.GOTO_W; short old_length = length; length = 5; return length - old_length; diff --git a/src/main/java/org/apache/bcel/generic/GOTO_W.java b/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java similarity index 93% rename from src/main/java/org/apache/bcel/generic/GOTO_W.java rename to src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java index 6760b43c..14209337 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.util.ByteSequence; /** * GOTO_W - Branch always (to relative offset, not absolute address) @@ -41,7 +42,7 @@ public class GOTO_W extends GotoInstruction { public GOTO_W(InstructionHandle target) { - super(org.apache.bcel.Constants.GOTO_W, target); + super(org.apache.commons.bcel6.Constants.GOTO_W, target); length = 5; } diff --git a/src/main/java/org/apache/bcel/generic/GotoInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/GotoInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java index 3d9de03f..eb2f60cc 100644 --- a/src/main/java/org/apache/bcel/generic/GotoInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Super class for GOTO diff --git a/src/main/java/org/apache/bcel/generic/I2B.java b/src/main/java/org/apache/commons/bcel6/generic/I2B.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/I2B.java rename to src/main/java/org/apache/commons/bcel6/generic/I2B.java index 3c849720..80ba9b0a 100644 --- a/src/main/java/org/apache/bcel/generic/I2B.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2B.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * I2B - Convert int to byte @@ -32,7 +32,7 @@ public class I2B extends ConversionInstruction { /** Convert int to byte */ public I2B() { - super(org.apache.bcel.Constants.I2B); + super(org.apache.commons.bcel6.Constants.I2B); } diff --git a/src/main/java/org/apache/bcel/generic/I2C.java b/src/main/java/org/apache/commons/bcel6/generic/I2C.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/I2C.java rename to src/main/java/org/apache/commons/bcel6/generic/I2C.java index 3bd218fe..04a24e40 100644 --- a/src/main/java/org/apache/bcel/generic/I2C.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2C.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * I2C - Convert int to char @@ -32,7 +32,7 @@ public class I2C extends ConversionInstruction { /** Convert int to char */ public I2C() { - super(org.apache.bcel.Constants.I2C); + super(org.apache.commons.bcel6.Constants.I2C); } diff --git a/src/main/java/org/apache/bcel/generic/I2D.java b/src/main/java/org/apache/commons/bcel6/generic/I2D.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/I2D.java rename to src/main/java/org/apache/commons/bcel6/generic/I2D.java index a13587cb..95e1def6 100644 --- a/src/main/java/org/apache/bcel/generic/I2D.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2D.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * I2D - Convert int to double @@ -32,7 +32,7 @@ public class I2D extends ConversionInstruction { /** Convert int to double */ public I2D() { - super(org.apache.bcel.Constants.I2D); + super(org.apache.commons.bcel6.Constants.I2D); } diff --git a/src/main/java/org/apache/bcel/generic/I2F.java b/src/main/java/org/apache/commons/bcel6/generic/I2F.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/I2F.java rename to src/main/java/org/apache/commons/bcel6/generic/I2F.java index a8cb4a18..f2138ecc 100644 --- a/src/main/java/org/apache/bcel/generic/I2F.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2F.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * I2F - Convert int to float @@ -32,7 +32,7 @@ public class I2F extends ConversionInstruction { /** Convert int to float */ public I2F() { - super(org.apache.bcel.Constants.I2F); + super(org.apache.commons.bcel6.Constants.I2F); } diff --git a/src/main/java/org/apache/bcel/generic/I2L.java b/src/main/java/org/apache/commons/bcel6/generic/I2L.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/I2L.java rename to src/main/java/org/apache/commons/bcel6/generic/I2L.java index 0527568c..cb053d4f 100644 --- a/src/main/java/org/apache/bcel/generic/I2L.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2L.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * I2L - Convert int to long @@ -32,7 +32,7 @@ public class I2L extends ConversionInstruction { /** Convert int to long */ public I2L() { - super(org.apache.bcel.Constants.I2L); + super(org.apache.commons.bcel6.Constants.I2L); } diff --git a/src/main/java/org/apache/bcel/generic/I2S.java b/src/main/java/org/apache/commons/bcel6/generic/I2S.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/I2S.java rename to src/main/java/org/apache/commons/bcel6/generic/I2S.java index 7a308de4..a556bc03 100644 --- a/src/main/java/org/apache/bcel/generic/I2S.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2S.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * I2S - Convert int to short @@ -30,7 +30,7 @@ public class I2S extends ConversionInstruction { public I2S() { - super(org.apache.bcel.Constants.I2S); + super(org.apache.commons.bcel6.Constants.I2S); } diff --git a/src/main/java/org/apache/bcel/generic/IADD.java b/src/main/java/org/apache/commons/bcel6/generic/IADD.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IADD.java rename to src/main/java/org/apache/commons/bcel6/generic/IADD.java index 22329408..6101fdaa 100644 --- a/src/main/java/org/apache/bcel/generic/IADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IADD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IADD - Add ints @@ -32,7 +32,7 @@ public class IADD extends ArithmeticInstruction { /** Add ints */ public IADD() { - super(org.apache.bcel.Constants.IADD); + super(org.apache.commons.bcel6.Constants.IADD); } diff --git a/src/main/java/org/apache/bcel/generic/IALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IALOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/IALOAD.java index aa531993..611e3a28 100644 --- a/src/main/java/org/apache/bcel/generic/IALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IALOAD - Load int from array @@ -33,7 +33,7 @@ public class IALOAD extends ArrayInstruction implements StackProducer { * Load int from array */ public IALOAD() { - super(org.apache.bcel.Constants.IALOAD); + super(org.apache.commons.bcel6.Constants.IALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/IAND.java b/src/main/java/org/apache/commons/bcel6/generic/IAND.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IAND.java rename to src/main/java/org/apache/commons/bcel6/generic/IAND.java index 17c4f73c..5a3beb63 100644 --- a/src/main/java/org/apache/bcel/generic/IAND.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IAND.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IAND - Bitwise AND int @@ -30,7 +30,7 @@ public class IAND extends ArithmeticInstruction { public IAND() { - super(org.apache.bcel.Constants.IAND); + super(org.apache.commons.bcel6.Constants.IAND); } diff --git a/src/main/java/org/apache/bcel/generic/IASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IASTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/IASTORE.java index e2b4e875..80e68419 100644 --- a/src/main/java/org/apache/bcel/generic/IASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IASTORE - Store into int array @@ -33,7 +33,7 @@ public class IASTORE extends ArrayInstruction implements StackConsumer { * Store into int array */ public IASTORE() { - super(org.apache.bcel.Constants.IASTORE); + super(org.apache.commons.bcel6.Constants.IASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/ICONST.java b/src/main/java/org/apache/commons/bcel6/generic/ICONST.java similarity index 91% rename from src/main/java/org/apache/bcel/generic/ICONST.java rename to src/main/java/org/apache/commons/bcel6/generic/ICONST.java index eb2a0fd2..679557dc 100644 --- a/src/main/java/org/apache/bcel/generic/ICONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ICONST.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * ICONST - Push value between -1, ..., 5, other values cause an exception @@ -40,9 +40,9 @@ public class ICONST extends Instruction implements ConstantPushInstruction { public ICONST(int i) { - super(org.apache.bcel.Constants.ICONST_0, (short) 1); + super(org.apache.commons.bcel6.Constants.ICONST_0, (short) 1); if ((i >= -1) && (i <= 5)) { - opcode = (short) (org.apache.bcel.Constants.ICONST_0 + i); // Even works for i == -1 + opcode = (short) (org.apache.commons.bcel6.Constants.ICONST_0 + i); // Even works for i == -1 } else { throw new ClassGenException("ICONST can be used only for value between -1 and 5: " + i); } diff --git a/src/main/java/org/apache/bcel/generic/IDIV.java b/src/main/java/org/apache/commons/bcel6/generic/IDIV.java similarity index 91% rename from src/main/java/org/apache/bcel/generic/IDIV.java rename to src/main/java/org/apache/commons/bcel6/generic/IDIV.java index 210e7af3..0f90c463 100644 --- a/src/main/java/org/apache/bcel/generic/IDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IDIV.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IDIV - Divide ints @@ -32,7 +32,7 @@ public class IDIV extends ArithmeticInstruction implements ExceptionThrower { /** Divide ints */ public IDIV() { - super(org.apache.bcel.Constants.IDIV); + super(org.apache.commons.bcel6.Constants.IDIV); } @@ -40,7 +40,7 @@ public class IDIV extends ArithmeticInstruction implements ExceptionThrower { */ public Class[] getExceptions() { return new Class[] { - org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION + org.apache.commons.bcel6.ExceptionConstants.ARITHMETIC_EXCEPTION }; } diff --git a/src/main/java/org/apache/bcel/generic/IFEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/IFEQ.java rename to src/main/java/org/apache/commons/bcel6/generic/IFEQ.java index 9072eb54..60a50379 100644 --- a/src/main/java/org/apache/bcel/generic/IFEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IFEQ - Branch if int comparison with zero succeeds @@ -39,7 +39,7 @@ public class IFEQ extends IfInstruction { public IFEQ(InstructionHandle target) { - super(org.apache.bcel.Constants.IFEQ, target); + super(org.apache.commons.bcel6.Constants.IFEQ, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFGE.java b/src/main/java/org/apache/commons/bcel6/generic/IFGE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IFGE.java rename to src/main/java/org/apache/commons/bcel6/generic/IFGE.java index 9d1e973b..1ed87ada 100644 --- a/src/main/java/org/apache/bcel/generic/IFGE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFGE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IFGE - Branch if int comparison with zero succeeds @@ -39,7 +39,7 @@ public class IFGE extends IfInstruction { public IFGE(InstructionHandle target) { - super(org.apache.bcel.Constants.IFGE, target); + super(org.apache.commons.bcel6.Constants.IFGE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFGT.java b/src/main/java/org/apache/commons/bcel6/generic/IFGT.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IFGT.java rename to src/main/java/org/apache/commons/bcel6/generic/IFGT.java index 82dc2dd8..8ace6475 100644 --- a/src/main/java/org/apache/bcel/generic/IFGT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFGT.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IFGT - Branch if int comparison with zero succeeds @@ -39,7 +39,7 @@ public class IFGT extends IfInstruction { public IFGT(InstructionHandle target) { - super(org.apache.bcel.Constants.IFGT, target); + super(org.apache.commons.bcel6.Constants.IFGT, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFLE.java b/src/main/java/org/apache/commons/bcel6/generic/IFLE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IFLE.java rename to src/main/java/org/apache/commons/bcel6/generic/IFLE.java index 0f847cbf..8fc1e487 100644 --- a/src/main/java/org/apache/bcel/generic/IFLE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFLE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IFLE - Branch if int comparison with zero succeeds @@ -39,7 +39,7 @@ public class IFLE extends IfInstruction { public IFLE(InstructionHandle target) { - super(org.apache.bcel.Constants.IFLE, target); + super(org.apache.commons.bcel6.Constants.IFLE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFLT.java b/src/main/java/org/apache/commons/bcel6/generic/IFLT.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IFLT.java rename to src/main/java/org/apache/commons/bcel6/generic/IFLT.java index c7929cba..e58e4e05 100644 --- a/src/main/java/org/apache/bcel/generic/IFLT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFLT.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IFLT - Branch if int comparison with zero succeeds @@ -39,7 +39,7 @@ public class IFLT extends IfInstruction { public IFLT(InstructionHandle target) { - super(org.apache.bcel.Constants.IFLT, target); + super(org.apache.commons.bcel6.Constants.IFLT, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFNE.java b/src/main/java/org/apache/commons/bcel6/generic/IFNE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IFNE.java rename to src/main/java/org/apache/commons/bcel6/generic/IFNE.java index 05e21c17..a5f06888 100644 --- a/src/main/java/org/apache/bcel/generic/IFNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IFNE - Branch if int comparison with zero succeeds @@ -39,7 +39,7 @@ public class IFNE extends IfInstruction { public IFNE(InstructionHandle target) { - super(org.apache.bcel.Constants.IFNE, target); + super(org.apache.commons.bcel6.Constants.IFNE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFNONNULL.java b/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IFNONNULL.java rename to src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java index ce2a8ae2..be016ce7 100644 --- a/src/main/java/org/apache/bcel/generic/IFNONNULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IFNONNULL - Branch if reference is not null @@ -39,7 +39,7 @@ public class IFNONNULL extends IfInstruction { public IFNONNULL(InstructionHandle target) { - super(org.apache.bcel.Constants.IFNONNULL, target); + super(org.apache.commons.bcel6.Constants.IFNONNULL, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFNULL.java b/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IFNULL.java rename to src/main/java/org/apache/commons/bcel6/generic/IFNULL.java index 6e352f0c..36f7e475 100644 --- a/src/main/java/org/apache/bcel/generic/IFNULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IFNULL - Branch if reference is not null @@ -39,7 +39,7 @@ public class IFNULL extends IfInstruction { public IFNULL(InstructionHandle target) { - super(org.apache.bcel.Constants.IFNULL, target); + super(org.apache.commons.bcel6.Constants.IFNULL, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java rename to src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java index cba17b51..1451b90f 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IF_ACMPEQ - Branch if reference comparison succeeds @@ -39,7 +39,7 @@ public class IF_ACMPEQ extends IfInstruction { public IF_ACMPEQ(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ACMPEQ, target); + super(org.apache.commons.bcel6.Constants.IF_ACMPEQ, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IF_ACMPNE.java rename to src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java index 54563b0a..4fee177f 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IF_ACMPNE - Branch if reference comparison doesn't succeed @@ -39,7 +39,7 @@ public class IF_ACMPNE extends IfInstruction { public IF_ACMPNE(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ACMPNE, target); + super(org.apache.commons.bcel6.Constants.IF_ACMPNE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java rename to src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java index 2a3e5a46..776c1e04 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IF_ICMPEQ - Branch if int comparison succeeds @@ -39,7 +39,7 @@ public class IF_ICMPEQ extends IfInstruction { public IF_ICMPEQ(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPEQ, target); + super(org.apache.commons.bcel6.Constants.IF_ICMPEQ, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IF_ICMPGE.java rename to src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java index df12da43..73b4bb73 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IF_ICMPGE - Branch if int comparison succeeds @@ -39,7 +39,7 @@ public class IF_ICMPGE extends IfInstruction { public IF_ICMPGE(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPGE, target); + super(org.apache.commons.bcel6.Constants.IF_ICMPGE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IF_ICMPGT.java rename to src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java index 72f9fce5..04d31717 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IF_ICMPGT - Branch if int comparison succeeds @@ -39,7 +39,7 @@ public class IF_ICMPGT extends IfInstruction { public IF_ICMPGT(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPGT, target); + super(org.apache.commons.bcel6.Constants.IF_ICMPGT, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IF_ICMPLE.java rename to src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java index ef931c66..c8f4b97f 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IF_ICMPLE - Branch if int comparison succeeds @@ -39,7 +39,7 @@ public class IF_ICMPLE extends IfInstruction { public IF_ICMPLE(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPLE, target); + super(org.apache.commons.bcel6.Constants.IF_ICMPLE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IF_ICMPLT.java rename to src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java index 3aba740b..af8b1dcb 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IF_ICMPLT - Branch if int comparison succeeds @@ -39,7 +39,7 @@ public class IF_ICMPLT extends IfInstruction { public IF_ICMPLT(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPLT, target); + super(org.apache.commons.bcel6.Constants.IF_ICMPLT, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IF_ICMPNE.java rename to src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java index 0d1cd28a..b211f42c 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IF_ICMPNE - Branch if int comparison doesn't succeed @@ -39,7 +39,7 @@ public class IF_ICMPNE extends IfInstruction { public IF_ICMPNE(InstructionHandle target) { - super(org.apache.bcel.Constants.IF_ICMPNE, target); + super(org.apache.commons.bcel6.Constants.IF_ICMPNE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IINC.java b/src/main/java/org/apache/commons/bcel6/generic/IINC.java similarity index 92% rename from src/main/java/org/apache/bcel/generic/IINC.java rename to src/main/java/org/apache/commons/bcel6/generic/IINC.java index 4dcbd545..0f29088e 100644 --- a/src/main/java/org/apache/bcel/generic/IINC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IINC.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.util.ByteSequence; /** * IINC - Increment local variable by constant @@ -48,7 +49,7 @@ public class IINC extends LocalVariableInstruction { */ public IINC(int n, int c) { super(); // Default behaviour of LocalVariableInstruction causes error - this.opcode = org.apache.bcel.Constants.IINC; + this.opcode = org.apache.commons.bcel6.Constants.IINC; this.length = (short) 3; setIndex(n); // May set wide as side effect setIncrement(c); @@ -62,7 +63,7 @@ public class IINC extends LocalVariableInstruction { @Override public void dump( DataOutputStream out ) throws IOException { if (wide) { - out.writeByte(org.apache.bcel.Constants.WIDE); + out.writeByte(org.apache.commons.bcel6.Constants.WIDE); } out.writeByte(opcode); if (wide) { @@ -76,7 +77,7 @@ public class IINC extends LocalVariableInstruction { private void setWide() { - wide = (n > org.apache.bcel.Constants.MAX_BYTE) || (Math.abs(c) > Byte.MAX_VALUE); + wide = (n > org.apache.commons.bcel6.Constants.MAX_BYTE) || (Math.abs(c) > Byte.MAX_VALUE); if (wide) { length = 6; // wide byte included } else { diff --git a/src/main/java/org/apache/bcel/generic/ILOAD.java b/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java similarity index 88% rename from src/main/java/org/apache/bcel/generic/ILOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/ILOAD.java index 523883a9..b517e55b 100644 --- a/src/main/java/org/apache/bcel/generic/ILOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * ILOAD - Load int from local variable onto stack @@ -34,7 +34,7 @@ public class ILOAD extends LoadInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ ILOAD() { - super(org.apache.bcel.Constants.ILOAD, org.apache.bcel.Constants.ILOAD_0); + super(org.apache.commons.bcel6.Constants.ILOAD, org.apache.commons.bcel6.Constants.ILOAD_0); } @@ -42,7 +42,7 @@ public class ILOAD extends LoadInstruction { * @param n index of local variable */ public ILOAD(int n) { - super(org.apache.bcel.Constants.ILOAD, org.apache.bcel.Constants.ILOAD_0, n); + super(org.apache.commons.bcel6.Constants.ILOAD, org.apache.commons.bcel6.Constants.ILOAD_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP1.java b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java similarity index 92% rename from src/main/java/org/apache/bcel/generic/IMPDEP1.java rename to src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java index 484d9190..134689a0 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP1.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IMPDEP1 - Implementation dependent @@ -29,7 +29,7 @@ public class IMPDEP1 extends Instruction { public IMPDEP1() { - super(org.apache.bcel.Constants.IMPDEP1, (short) 1); + super(org.apache.commons.bcel6.Constants.IMPDEP1, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP2.java b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java similarity index 92% rename from src/main/java/org/apache/bcel/generic/IMPDEP2.java rename to src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java index a69edbcd..86fd5786 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IMPDEP2 - Implementation dependent @@ -29,7 +29,7 @@ public class IMPDEP2 extends Instruction { public IMPDEP2() { - super(org.apache.bcel.Constants.IMPDEP2, (short) 1); + super(org.apache.commons.bcel6.Constants.IMPDEP2, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/IMUL.java b/src/main/java/org/apache/commons/bcel6/generic/IMUL.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IMUL.java rename to src/main/java/org/apache/commons/bcel6/generic/IMUL.java index b673eadb..ef28ee0e 100644 --- a/src/main/java/org/apache/bcel/generic/IMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IMUL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IMUL - Multiply ints @@ -32,7 +32,7 @@ public class IMUL extends ArithmeticInstruction { /** Multiply ints */ public IMUL() { - super(org.apache.bcel.Constants.IMUL); + super(org.apache.commons.bcel6.Constants.IMUL); } diff --git a/src/main/java/org/apache/bcel/generic/INEG.java b/src/main/java/org/apache/commons/bcel6/generic/INEG.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/INEG.java rename to src/main/java/org/apache/commons/bcel6/generic/INEG.java index 103f63e9..e0d1dc2b 100644 --- a/src/main/java/org/apache/bcel/generic/INEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INEG.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * INEG - Negate int @@ -30,7 +30,7 @@ public class INEG extends ArithmeticInstruction { public INEG() { - super(org.apache.bcel.Constants.INEG); + super(org.apache.commons.bcel6.Constants.INEG); } diff --git a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java b/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java similarity index 91% rename from src/main/java/org/apache/bcel/generic/INSTANCEOF.java rename to src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java index de62b7da..72cd6248 100644 --- a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * INSTANCEOF - Determine if object is of given type @@ -39,12 +39,12 @@ public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThr public INSTANCEOF(int index) { - super(org.apache.bcel.Constants.INSTANCEOF, index); + super(org.apache.commons.bcel6.Constants.INSTANCEOF, index); } public Class[] getExceptions() { - return org.apache.bcel.ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION; + return org.apache.commons.bcel6.ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION; } diff --git a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java rename to src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java index e994c4af..2092b429 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java @@ -15,15 +15,15 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.util.ByteSequence; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.ExceptionConstants; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.util.ByteSequence; /** * Class for INVOKEDYNAMIC. Not an instance of InvokeInstruction, since that class diff --git a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java rename to src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java index 218a160b..77dae17d 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java @@ -15,15 +15,15 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.util.ByteSequence; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.ExceptionConstants; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.util.ByteSequence; /** * INVOKEINTERFACE - Invoke interface method diff --git a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java rename to src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java index 05d8d4c9..7df166ef 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.ExceptionConstants; /** * INVOKESPECIAL - Invoke instance method; special handling for superclass, private diff --git a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/INVOKESTATIC.java rename to src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java index 5ac750d1..cbbd0d34 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.ExceptionConstants; /** * INVOKESTATIC - Invoke a class (static) method diff --git a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java rename to src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java index bf0fe5d3..8c7ab863 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.ExceptionConstants; /** * INVOKEVIRTUAL - Invoke instance method; dispatch based on class diff --git a/src/main/java/org/apache/bcel/generic/IOR.java b/src/main/java/org/apache/commons/bcel6/generic/IOR.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IOR.java rename to src/main/java/org/apache/commons/bcel6/generic/IOR.java index 5ae4214d..a4f2cfaf 100644 --- a/src/main/java/org/apache/bcel/generic/IOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IOR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IOR - Bitwise OR int @@ -30,7 +30,7 @@ public class IOR extends ArithmeticInstruction { public IOR() { - super(org.apache.bcel.Constants.IOR); + super(org.apache.commons.bcel6.Constants.IOR); } diff --git a/src/main/java/org/apache/bcel/generic/IREM.java b/src/main/java/org/apache/commons/bcel6/generic/IREM.java similarity index 91% rename from src/main/java/org/apache/bcel/generic/IREM.java rename to src/main/java/org/apache/commons/bcel6/generic/IREM.java index 3d2ab7fa..aa25559d 100644 --- a/src/main/java/org/apache/bcel/generic/IREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IREM.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IREM - Remainder of int @@ -32,7 +32,7 @@ public class IREM extends ArithmeticInstruction implements ExceptionThrower { /** Remainder of ints */ public IREM() { - super(org.apache.bcel.Constants.IREM); + super(org.apache.commons.bcel6.Constants.IREM); } @@ -40,7 +40,7 @@ public class IREM extends ArithmeticInstruction implements ExceptionThrower { */ public Class[] getExceptions() { return new Class[] { - org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION + org.apache.commons.bcel6.ExceptionConstants.ARITHMETIC_EXCEPTION }; } diff --git a/src/main/java/org/apache/bcel/generic/IRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IRETURN.java rename to src/main/java/org/apache/commons/bcel6/generic/IRETURN.java index c195b514..b01d11e8 100644 --- a/src/main/java/org/apache/bcel/generic/IRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IRETURN - Return int from method @@ -32,7 +32,7 @@ public class IRETURN extends ReturnInstruction { /** Return int from method */ public IRETURN() { - super(org.apache.bcel.Constants.IRETURN); + super(org.apache.commons.bcel6.Constants.IRETURN); } diff --git a/src/main/java/org/apache/bcel/generic/ISHL.java b/src/main/java/org/apache/commons/bcel6/generic/ISHL.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/ISHL.java rename to src/main/java/org/apache/commons/bcel6/generic/ISHL.java index 634653d7..d2288a7d 100644 --- a/src/main/java/org/apache/bcel/generic/ISHL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISHL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * ISHL - Arithmetic shift left int @@ -30,7 +30,7 @@ public class ISHL extends ArithmeticInstruction { public ISHL() { - super(org.apache.bcel.Constants.ISHL); + super(org.apache.commons.bcel6.Constants.ISHL); } diff --git a/src/main/java/org/apache/bcel/generic/ISHR.java b/src/main/java/org/apache/commons/bcel6/generic/ISHR.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/ISHR.java rename to src/main/java/org/apache/commons/bcel6/generic/ISHR.java index bdf2fac8..98cb58cb 100644 --- a/src/main/java/org/apache/bcel/generic/ISHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISHR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * ISHR - Arithmetic shift right int @@ -30,7 +30,7 @@ public class ISHR extends ArithmeticInstruction { public ISHR() { - super(org.apache.bcel.Constants.ISHR); + super(org.apache.commons.bcel6.Constants.ISHR); } diff --git a/src/main/java/org/apache/bcel/generic/ISTORE.java b/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java similarity index 87% rename from src/main/java/org/apache/bcel/generic/ISTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/ISTORE.java index 5e1ce524..2f0884c2 100644 --- a/src/main/java/org/apache/bcel/generic/ISTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * ISTORE - Store int from stack into local variable @@ -34,7 +34,7 @@ public class ISTORE extends StoreInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ ISTORE() { - super(org.apache.bcel.Constants.ISTORE, org.apache.bcel.Constants.ISTORE_0); + super(org.apache.commons.bcel6.Constants.ISTORE, org.apache.commons.bcel6.Constants.ISTORE_0); } @@ -42,7 +42,7 @@ public class ISTORE extends StoreInstruction { * @param n index of local variable */ public ISTORE(int n) { - super(org.apache.bcel.Constants.ISTORE, org.apache.bcel.Constants.ISTORE_0, n); + super(org.apache.commons.bcel6.Constants.ISTORE, org.apache.commons.bcel6.Constants.ISTORE_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/ISUB.java b/src/main/java/org/apache/commons/bcel6/generic/ISUB.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/ISUB.java rename to src/main/java/org/apache/commons/bcel6/generic/ISUB.java index 63378199..5268e87e 100644 --- a/src/main/java/org/apache/bcel/generic/ISUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISUB.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * ISUB - Substract ints @@ -32,7 +32,7 @@ public class ISUB extends ArithmeticInstruction { /** Substract ints */ public ISUB() { - super(org.apache.bcel.Constants.ISUB); + super(org.apache.commons.bcel6.Constants.ISUB); } diff --git a/src/main/java/org/apache/bcel/generic/IUSHR.java b/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IUSHR.java rename to src/main/java/org/apache/commons/bcel6/generic/IUSHR.java index 13c0af77..ede2e9a1 100644 --- a/src/main/java/org/apache/bcel/generic/IUSHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IUSHR - Logical shift right int @@ -30,7 +30,7 @@ public class IUSHR extends ArithmeticInstruction { public IUSHR() { - super(org.apache.bcel.Constants.IUSHR); + super(org.apache.commons.bcel6.Constants.IUSHR); } diff --git a/src/main/java/org/apache/bcel/generic/IXOR.java b/src/main/java/org/apache/commons/bcel6/generic/IXOR.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/IXOR.java rename to src/main/java/org/apache/commons/bcel6/generic/IXOR.java index b0171458..579c4539 100644 --- a/src/main/java/org/apache/bcel/generic/IXOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IXOR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * IXOR - Bitwise XOR int @@ -30,7 +30,7 @@ public class IXOR extends ArithmeticInstruction { public IXOR() { - super(org.apache.bcel.Constants.IXOR); + super(org.apache.commons.bcel6.Constants.IXOR); } diff --git a/src/main/java/org/apache/bcel/generic/IfInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/IfInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java index ed98a060..641ccb27 100644 --- a/src/main/java/org/apache/bcel/generic/IfInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Super class for the IFxxx family of instructions. diff --git a/src/main/java/org/apache/bcel/generic/IndexedInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/IndexedInstruction.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/IndexedInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/IndexedInstruction.java index 11ee967b..50fd6044 100644 --- a/src/main/java/org/apache/bcel/generic/IndexedInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IndexedInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denote entity that refers to an index, e.g. local variable instructions, diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/Instruction.java rename to src/main/java/org/apache/commons/bcel6/generic/Instruction.java index 8ae30924..fb7709fe 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java @@ -15,15 +15,15 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.util.ByteSequence; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.util.ByteSequence; /** * Abstract super class for all Java byte codes. diff --git a/src/main/java/org/apache/bcel/generic/InstructionComparator.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/InstructionComparator.java rename to src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java index 41a7de23..f42a6eac 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionComparator.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Equality of instructions isn't clearly to be defined. You might diff --git a/src/main/java/org/apache/bcel/generic/InstructionConstants.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java similarity index 99% rename from src/main/java/org/apache/bcel/generic/InstructionConstants.java rename to src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java index f0911e0c..196ac9df 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * This interface contains shareable instruction objects. diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java similarity index 99% rename from src/main/java/org/apache/bcel/generic/InstructionFactory.java rename to src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java index 64c77ee6..2cb0d5ba 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * Instances of this class may be used, e.g., to generate typed @@ -579,7 +579,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali && (src == Constants.T_CHAR || src == Constants.T_BYTE || src == Constants.T_SHORT)) { src = Constants.T_INT; } - String name = "org.apache.bcel.generic." + short_names[src - Constants.T_CHAR] + "2" + String name = "org.apache.commons.bcel6.generic." + short_names[src - Constants.T_CHAR] + "2" + short_names[dest - Constants.T_CHAR]; Instruction i = null; try { diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/InstructionHandle.java rename to src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java index f22bf838..fc4acec9 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java @@ -15,14 +15,15 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import org.apache.bcel.classfile.Utility; + +import org.apache.commons.bcel6.classfile.Utility; /** * Instances of this class give users a handle to the instructions contained in diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java similarity index 99% rename from src/main/java/org/apache/bcel/generic/InstructionList.java rename to src/main/java/org/apache/commons/bcel6/generic/InstructionList.java index 3a2d2b73..cc0b9a4b 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; @@ -28,9 +28,9 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.util.ByteSequence; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.Constant; +import org.apache.commons.bcel6.util.ByteSequence; /** * This class is a container for a list of = (32767 - max_offset)) { // to large for short (estimate) - opcode = org.apache.bcel.Constants.JSR_W; + opcode = org.apache.commons.bcel6.Constants.JSR_W; short old_length = length; length = 5; return length - old_length; diff --git a/src/main/java/org/apache/bcel/generic/JSR_W.java b/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java similarity index 93% rename from src/main/java/org/apache/bcel/generic/JSR_W.java rename to src/main/java/org/apache/commons/bcel6/generic/JSR_W.java index ed106245..664c8039 100644 --- a/src/main/java/org/apache/bcel/generic/JSR_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.util.ByteSequence; /** * JSR_W - Jump to subroutine @@ -41,7 +42,7 @@ public class JSR_W extends JsrInstruction { public JSR_W(InstructionHandle target) { - super(org.apache.bcel.Constants.JSR_W, target); + super(org.apache.commons.bcel6.Constants.JSR_W, target); length = 5; } diff --git a/src/main/java/org/apache/bcel/generic/JsrInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/JsrInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java index 2eff7d4f..2d700d1e 100644 --- a/src/main/java/org/apache/bcel/generic/JsrInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Super class for JSR - Jump to subroutine diff --git a/src/main/java/org/apache/bcel/generic/L2D.java b/src/main/java/org/apache/commons/bcel6/generic/L2D.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/L2D.java rename to src/main/java/org/apache/commons/bcel6/generic/L2D.java index 9c561ed4..ac7af43c 100644 --- a/src/main/java/org/apache/bcel/generic/L2D.java +++ b/src/main/java/org/apache/commons/bcel6/generic/L2D.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * L2D - Convert long to double @@ -30,7 +30,7 @@ public class L2D extends ConversionInstruction { public L2D() { - super(org.apache.bcel.Constants.L2D); + super(org.apache.commons.bcel6.Constants.L2D); } diff --git a/src/main/java/org/apache/bcel/generic/L2F.java b/src/main/java/org/apache/commons/bcel6/generic/L2F.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/L2F.java rename to src/main/java/org/apache/commons/bcel6/generic/L2F.java index ecd50277..ebff0742 100644 --- a/src/main/java/org/apache/bcel/generic/L2F.java +++ b/src/main/java/org/apache/commons/bcel6/generic/L2F.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * L2F - Convert long to float @@ -30,7 +30,7 @@ public class L2F extends ConversionInstruction { public L2F() { - super(org.apache.bcel.Constants.L2F); + super(org.apache.commons.bcel6.Constants.L2F); } diff --git a/src/main/java/org/apache/bcel/generic/L2I.java b/src/main/java/org/apache/commons/bcel6/generic/L2I.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/L2I.java rename to src/main/java/org/apache/commons/bcel6/generic/L2I.java index babcfeba..f83a4162 100644 --- a/src/main/java/org/apache/bcel/generic/L2I.java +++ b/src/main/java/org/apache/commons/bcel6/generic/L2I.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * L2I - Convert long to int @@ -30,7 +30,7 @@ public class L2I extends ConversionInstruction { public L2I() { - super(org.apache.bcel.Constants.L2I); + super(org.apache.commons.bcel6.Constants.L2I); } diff --git a/src/main/java/org/apache/bcel/generic/LADD.java b/src/main/java/org/apache/commons/bcel6/generic/LADD.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LADD.java rename to src/main/java/org/apache/commons/bcel6/generic/LADD.java index 8a05a8a0..8b328008 100644 --- a/src/main/java/org/apache/bcel/generic/LADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LADD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LADD - Add longs @@ -31,7 +31,7 @@ public class LADD extends ArithmeticInstruction { public LADD() { - super(org.apache.bcel.Constants.LADD); + super(org.apache.commons.bcel6.Constants.LADD); } diff --git a/src/main/java/org/apache/bcel/generic/LALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LALOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/LALOAD.java index 6249a189..1d0833a7 100644 --- a/src/main/java/org/apache/bcel/generic/LALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LALOAD - Load long from array @@ -32,7 +32,7 @@ public class LALOAD extends ArrayInstruction implements StackProducer { /** Load long from array */ public LALOAD() { - super(org.apache.bcel.Constants.LALOAD); + super(org.apache.commons.bcel6.Constants.LALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/LAND.java b/src/main/java/org/apache/commons/bcel6/generic/LAND.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LAND.java rename to src/main/java/org/apache/commons/bcel6/generic/LAND.java index b56ae1c4..bc9cdd6a 100644 --- a/src/main/java/org/apache/bcel/generic/LAND.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LAND.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LAND - Bitwise AND longs @@ -31,7 +31,7 @@ public class LAND extends ArithmeticInstruction { public LAND() { - super(org.apache.bcel.Constants.LAND); + super(org.apache.commons.bcel6.Constants.LAND); } diff --git a/src/main/java/org/apache/bcel/generic/LASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LASTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/LASTORE.java index 9f383fd9..22a8713f 100644 --- a/src/main/java/org/apache/bcel/generic/LASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LASTORE - Store into long array @@ -32,7 +32,7 @@ public class LASTORE extends ArrayInstruction implements StackConsumer { /** Store long into array */ public LASTORE() { - super(org.apache.bcel.Constants.LASTORE); + super(org.apache.commons.bcel6.Constants.LASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/LCMP.java b/src/main/java/org/apache/commons/bcel6/generic/LCMP.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LCMP.java rename to src/main/java/org/apache/commons/bcel6/generic/LCMP.java index 7982944e..8686c7d7 100644 --- a/src/main/java/org/apache/bcel/generic/LCMP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LCMP.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LCMP - Compare longs: @@ -31,7 +31,7 @@ public class LCMP extends Instruction implements TypedInstruction, StackProducer public LCMP() { - super(org.apache.bcel.Constants.LCMP, (short) 1); + super(org.apache.commons.bcel6.Constants.LCMP, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/LCONST.java b/src/main/java/org/apache/commons/bcel6/generic/LCONST.java similarity index 90% rename from src/main/java/org/apache/bcel/generic/LCONST.java rename to src/main/java/org/apache/commons/bcel6/generic/LCONST.java index 439378fd..95e9cb30 100644 --- a/src/main/java/org/apache/bcel/generic/LCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LCONST.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LCONST - Push 0 or 1, other values cause an exception @@ -40,11 +40,11 @@ public class LCONST extends Instruction implements ConstantPushInstruction { public LCONST(long l) { - super(org.apache.bcel.Constants.LCONST_0, (short) 1); + super(org.apache.commons.bcel6.Constants.LCONST_0, (short) 1); if (l == 0) { - opcode = org.apache.bcel.Constants.LCONST_0; + opcode = org.apache.commons.bcel6.Constants.LCONST_0; } else if (l == 1) { - opcode = org.apache.bcel.Constants.LCONST_1; + opcode = org.apache.commons.bcel6.Constants.LCONST_1; } else { throw new ClassGenException("LCONST can be used only for 0 and 1: " + l); } diff --git a/src/main/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/commons/bcel6/generic/LDC.java similarity index 68% rename from src/main/java/org/apache/bcel/generic/LDC.java rename to src/main/java/org/apache/commons/bcel6/generic/LDC.java index 2e3ebec5..adcba413 100644 --- a/src/main/java/org/apache/bcel/generic/LDC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; +import org.apache.commons.bcel6.util.ByteSequence; /** * LDC - Push item from constant pool. @@ -44,18 +44,18 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro public LDC(int index) { - super(org.apache.bcel.Constants.LDC_W, index); + super(org.apache.commons.bcel6.Constants.LDC_W, index); setSize(); } // Adjust to proper size protected final void setSize() { - if (index <= org.apache.bcel.Constants.MAX_BYTE) { // Fits in one byte? - opcode = org.apache.bcel.Constants.LDC; + if (index <= org.apache.commons.bcel6.Constants.MAX_BYTE) { // Fits in one byte? + opcode = org.apache.commons.bcel6.Constants.LDC; length = 2; } else { - opcode = org.apache.bcel.Constants.LDC_W; + opcode = org.apache.commons.bcel6.Constants.LDC_W; length = 3; } } @@ -97,20 +97,20 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro public Object getValue( ConstantPoolGen cpg ) { - org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(index); + org.apache.commons.bcel6.classfile.Constant c = cpg.getConstantPool().getConstant(index); switch (c.getTag()) { - case org.apache.bcel.Constants.CONSTANT_String: - int i = ((org.apache.bcel.classfile.ConstantString) c).getStringIndex(); + case org.apache.commons.bcel6.Constants.CONSTANT_String: + int i = ((org.apache.commons.bcel6.classfile.ConstantString) c).getStringIndex(); c = cpg.getConstantPool().getConstant(i); - return ((org.apache.bcel.classfile.ConstantUtf8) c).getBytes(); - case org.apache.bcel.Constants.CONSTANT_Float: - return new Float(((org.apache.bcel.classfile.ConstantFloat) c).getBytes()); - case org.apache.bcel.Constants.CONSTANT_Integer: - return Integer.valueOf(((org.apache.bcel.classfile.ConstantInteger) c).getBytes()); - case org.apache.bcel.Constants.CONSTANT_Class: - int nameIndex = ((org.apache.bcel.classfile.ConstantClass) c).getNameIndex(); + return ((org.apache.commons.bcel6.classfile.ConstantUtf8) c).getBytes(); + case org.apache.commons.bcel6.Constants.CONSTANT_Float: + return new Float(((org.apache.commons.bcel6.classfile.ConstantFloat) c).getBytes()); + case org.apache.commons.bcel6.Constants.CONSTANT_Integer: + return Integer.valueOf(((org.apache.commons.bcel6.classfile.ConstantInteger) c).getBytes()); + case org.apache.commons.bcel6.Constants.CONSTANT_Class: + int nameIndex = ((org.apache.commons.bcel6.classfile.ConstantClass) c).getNameIndex(); c = cpg.getConstantPool().getConstant(nameIndex); - return new ObjectType(((org.apache.bcel.classfile.ConstantUtf8) c).getBytes()); + return new ObjectType(((org.apache.commons.bcel6.classfile.ConstantUtf8) c).getBytes()); default: // Never reached throw new RuntimeException("Unknown or invalid constant type at " + index); } @@ -120,13 +120,13 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro @Override public Type getType( ConstantPoolGen cpg ) { switch (cpg.getConstantPool().getConstant(index).getTag()) { - case org.apache.bcel.Constants.CONSTANT_String: + case org.apache.commons.bcel6.Constants.CONSTANT_String: return Type.STRING; - case org.apache.bcel.Constants.CONSTANT_Float: + case org.apache.commons.bcel6.Constants.CONSTANT_Float: return Type.FLOAT; - case org.apache.bcel.Constants.CONSTANT_Integer: + case org.apache.commons.bcel6.Constants.CONSTANT_Integer: return Type.INT; - case org.apache.bcel.Constants.CONSTANT_Class: + case org.apache.commons.bcel6.Constants.CONSTANT_Class: return Type.CLASS; default: // Never reached throw new RuntimeException("Unknown or invalid constant type at " + index); @@ -135,7 +135,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro public Class[] getExceptions() { - return org.apache.bcel.ExceptionConstants.EXCS_STRING_RESOLUTION; + return org.apache.commons.bcel6.ExceptionConstants.EXCS_STRING_RESOLUTION; } diff --git a/src/main/java/org/apache/bcel/generic/LDC2_W.java b/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java similarity index 78% rename from src/main/java/org/apache/bcel/generic/LDC2_W.java rename to src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java index 247c822c..21a943bb 100644 --- a/src/main/java/org/apache/bcel/generic/LDC2_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LDC2_W - Push long or double from constant pool @@ -39,16 +39,16 @@ public class LDC2_W extends CPInstruction implements PushInstruction { public LDC2_W(int index) { - super(org.apache.bcel.Constants.LDC2_W, index); + super(org.apache.commons.bcel6.Constants.LDC2_W, index); } @Override public Type getType( ConstantPoolGen cpg ) { switch (cpg.getConstantPool().getConstant(index).getTag()) { - case org.apache.bcel.Constants.CONSTANT_Long: + case org.apache.commons.bcel6.Constants.CONSTANT_Long: return Type.LONG; - case org.apache.bcel.Constants.CONSTANT_Double: + case org.apache.commons.bcel6.Constants.CONSTANT_Double: return Type.DOUBLE; default: // Never reached throw new RuntimeException("Unknown constant type " + opcode); @@ -57,12 +57,12 @@ public class LDC2_W extends CPInstruction implements PushInstruction { public Number getValue( ConstantPoolGen cpg ) { - org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(index); + org.apache.commons.bcel6.classfile.Constant c = cpg.getConstantPool().getConstant(index); switch (c.getTag()) { - case org.apache.bcel.Constants.CONSTANT_Long: - return Long.valueOf(((org.apache.bcel.classfile.ConstantLong) c).getBytes()); - case org.apache.bcel.Constants.CONSTANT_Double: - return new Double(((org.apache.bcel.classfile.ConstantDouble) c).getBytes()); + case org.apache.commons.bcel6.Constants.CONSTANT_Long: + return Long.valueOf(((org.apache.commons.bcel6.classfile.ConstantLong) c).getBytes()); + case org.apache.commons.bcel6.Constants.CONSTANT_Double: + return new Double(((org.apache.commons.bcel6.classfile.ConstantDouble) c).getBytes()); default: // Never reached throw new RuntimeException("Unknown or invalid constant type at " + index); } diff --git a/src/main/java/org/apache/bcel/generic/LDC_W.java b/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java similarity index 91% rename from src/main/java/org/apache/bcel/generic/LDC_W.java rename to src/main/java/org/apache/commons/bcel6/generic/LDC_W.java index 2f6431b5..3daa0582 100644 --- a/src/main/java/org/apache/bcel/generic/LDC_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java @@ -15,10 +15,11 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.util.ByteSequence; /** * LDC_W - Push item from constant pool (wide index) @@ -53,7 +54,7 @@ public class LDC_W extends LDC { protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { setIndex(bytes.readUnsignedShort()); // Override just in case it has been changed - opcode = org.apache.bcel.Constants.LDC_W; + opcode = org.apache.commons.bcel6.Constants.LDC_W; length = 3; } } diff --git a/src/main/java/org/apache/bcel/generic/LDIV.java b/src/main/java/org/apache/commons/bcel6/generic/LDIV.java similarity index 91% rename from src/main/java/org/apache/bcel/generic/LDIV.java rename to src/main/java/org/apache/commons/bcel6/generic/LDIV.java index 8e4f53b8..307a58e6 100644 --- a/src/main/java/org/apache/bcel/generic/LDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDIV.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LDIV - Divide longs @@ -31,13 +31,13 @@ public class LDIV extends ArithmeticInstruction implements ExceptionThrower { public LDIV() { - super(org.apache.bcel.Constants.LDIV); + super(org.apache.commons.bcel6.Constants.LDIV); } public Class[] getExceptions() { return new Class[] { - org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION + org.apache.commons.bcel6.ExceptionConstants.ARITHMETIC_EXCEPTION }; } diff --git a/src/main/java/org/apache/bcel/generic/LLOAD.java b/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java similarity index 87% rename from src/main/java/org/apache/bcel/generic/LLOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/LLOAD.java index 18944bc6..6832d1b4 100644 --- a/src/main/java/org/apache/bcel/generic/LLOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LLOAD - Load long from local variable @@ -34,12 +34,12 @@ public class LLOAD extends LoadInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ LLOAD() { - super(org.apache.bcel.Constants.LLOAD, org.apache.bcel.Constants.LLOAD_0); + super(org.apache.commons.bcel6.Constants.LLOAD, org.apache.commons.bcel6.Constants.LLOAD_0); } public LLOAD(int n) { - super(org.apache.bcel.Constants.LLOAD, org.apache.bcel.Constants.LLOAD_0, n); + super(org.apache.commons.bcel6.Constants.LLOAD, org.apache.commons.bcel6.Constants.LLOAD_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/LMUL.java b/src/main/java/org/apache/commons/bcel6/generic/LMUL.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LMUL.java rename to src/main/java/org/apache/commons/bcel6/generic/LMUL.java index 2b22b2a2..30f51b9f 100644 --- a/src/main/java/org/apache/bcel/generic/LMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LMUL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LMUL - Multiply longs @@ -31,7 +31,7 @@ public class LMUL extends ArithmeticInstruction { public LMUL() { - super(org.apache.bcel.Constants.LMUL); + super(org.apache.commons.bcel6.Constants.LMUL); } diff --git a/src/main/java/org/apache/bcel/generic/LNEG.java b/src/main/java/org/apache/commons/bcel6/generic/LNEG.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LNEG.java rename to src/main/java/org/apache/commons/bcel6/generic/LNEG.java index 14f92345..a295b647 100644 --- a/src/main/java/org/apache/bcel/generic/LNEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LNEG.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LNEG - Negate long @@ -30,7 +30,7 @@ public class LNEG extends ArithmeticInstruction { public LNEG() { - super(org.apache.bcel.Constants.LNEG); + super(org.apache.commons.bcel6.Constants.LNEG); } diff --git a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java rename to src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java index 165b939d..d54d9e1f 100644 --- a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.util.ByteSequence; /** * LOOKUPSWITCH - Switch with unordered set of values @@ -42,7 +43,7 @@ public class LOOKUPSWITCH extends Select { public LOOKUPSWITCH(int[] match, InstructionHandle[] targets, InstructionHandle defaultTarget) { - super(org.apache.bcel.Constants.LOOKUPSWITCH, match, targets, defaultTarget); + super(org.apache.commons.bcel6.Constants.LOOKUPSWITCH, match, targets, defaultTarget); length = (short) (9 + match_length * 8); /* alignment remainder assumed * 0 here, until dump time. */ fixed_length = length; diff --git a/src/main/java/org/apache/bcel/generic/LOR.java b/src/main/java/org/apache/commons/bcel6/generic/LOR.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LOR.java rename to src/main/java/org/apache/commons/bcel6/generic/LOR.java index 17425eac..06b27033 100644 --- a/src/main/java/org/apache/bcel/generic/LOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LOR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LOR - Bitwise OR long @@ -30,7 +30,7 @@ public class LOR extends ArithmeticInstruction { public LOR() { - super(org.apache.bcel.Constants.LOR); + super(org.apache.commons.bcel6.Constants.LOR); } diff --git a/src/main/java/org/apache/bcel/generic/LREM.java b/src/main/java/org/apache/commons/bcel6/generic/LREM.java similarity index 91% rename from src/main/java/org/apache/bcel/generic/LREM.java rename to src/main/java/org/apache/commons/bcel6/generic/LREM.java index 6178ac78..252d41d3 100644 --- a/src/main/java/org/apache/bcel/generic/LREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LREM.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LREM - Remainder of long @@ -30,13 +30,13 @@ public class LREM extends ArithmeticInstruction implements ExceptionThrower { public LREM() { - super(org.apache.bcel.Constants.LREM); + super(org.apache.commons.bcel6.Constants.LREM); } public Class[] getExceptions() { return new Class[] { - org.apache.bcel.ExceptionConstants.ARITHMETIC_EXCEPTION + org.apache.commons.bcel6.ExceptionConstants.ARITHMETIC_EXCEPTION }; } diff --git a/src/main/java/org/apache/bcel/generic/LRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LRETURN.java rename to src/main/java/org/apache/commons/bcel6/generic/LRETURN.java index c9e2ecf5..85e41eb4 100644 --- a/src/main/java/org/apache/bcel/generic/LRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LRETURN - Return long from method @@ -30,7 +30,7 @@ public class LRETURN extends ReturnInstruction { public LRETURN() { - super(org.apache.bcel.Constants.LRETURN); + super(org.apache.commons.bcel6.Constants.LRETURN); } diff --git a/src/main/java/org/apache/bcel/generic/LSHL.java b/src/main/java/org/apache/commons/bcel6/generic/LSHL.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LSHL.java rename to src/main/java/org/apache/commons/bcel6/generic/LSHL.java index e3ac8196..7d82c0bc 100644 --- a/src/main/java/org/apache/bcel/generic/LSHL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSHL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LSHL - Arithmetic shift left long @@ -30,7 +30,7 @@ public class LSHL extends ArithmeticInstruction { public LSHL() { - super(org.apache.bcel.Constants.LSHL); + super(org.apache.commons.bcel6.Constants.LSHL); } diff --git a/src/main/java/org/apache/bcel/generic/LSHR.java b/src/main/java/org/apache/commons/bcel6/generic/LSHR.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LSHR.java rename to src/main/java/org/apache/commons/bcel6/generic/LSHR.java index c4484aa8..038afcb4 100644 --- a/src/main/java/org/apache/bcel/generic/LSHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSHR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LSHR - Arithmetic shift right long @@ -30,7 +30,7 @@ public class LSHR extends ArithmeticInstruction { public LSHR() { - super(org.apache.bcel.Constants.LSHR); + super(org.apache.commons.bcel6.Constants.LSHR); } diff --git a/src/main/java/org/apache/bcel/generic/LSTORE.java b/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java similarity index 87% rename from src/main/java/org/apache/bcel/generic/LSTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/LSTORE.java index 2c70a014..358dd110 100644 --- a/src/main/java/org/apache/bcel/generic/LSTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LSTORE - Store long into local variable @@ -34,12 +34,12 @@ public class LSTORE extends StoreInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ LSTORE() { - super(org.apache.bcel.Constants.LSTORE, org.apache.bcel.Constants.LSTORE_0); + super(org.apache.commons.bcel6.Constants.LSTORE, org.apache.commons.bcel6.Constants.LSTORE_0); } public LSTORE(int n) { - super(org.apache.bcel.Constants.LSTORE, org.apache.bcel.Constants.LSTORE_0, n); + super(org.apache.commons.bcel6.Constants.LSTORE, org.apache.commons.bcel6.Constants.LSTORE_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/LSUB.java b/src/main/java/org/apache/commons/bcel6/generic/LSUB.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LSUB.java rename to src/main/java/org/apache/commons/bcel6/generic/LSUB.java index 486890a1..98e779fc 100644 --- a/src/main/java/org/apache/bcel/generic/LSUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSUB.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LSUB - Substract longs @@ -31,7 +31,7 @@ public class LSUB extends ArithmeticInstruction { public LSUB() { - super(org.apache.bcel.Constants.LSUB); + super(org.apache.commons.bcel6.Constants.LSUB); } diff --git a/src/main/java/org/apache/bcel/generic/LUSHR.java b/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LUSHR.java rename to src/main/java/org/apache/commons/bcel6/generic/LUSHR.java index f8c89d82..0c682d7e 100644 --- a/src/main/java/org/apache/bcel/generic/LUSHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LUSHR - Logical shift right long @@ -30,7 +30,7 @@ public class LUSHR extends ArithmeticInstruction { public LUSHR() { - super(org.apache.bcel.Constants.LUSHR); + super(org.apache.commons.bcel6.Constants.LUSHR); } diff --git a/src/main/java/org/apache/bcel/generic/LXOR.java b/src/main/java/org/apache/commons/bcel6/generic/LXOR.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/LXOR.java rename to src/main/java/org/apache/commons/bcel6/generic/LXOR.java index b7cc7335..25cdaf25 100644 --- a/src/main/java/org/apache/bcel/generic/LXOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LXOR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * LXOR - Bitwise XOR long @@ -30,7 +30,7 @@ public class LXOR extends ArithmeticInstruction { public LXOR() { - super(org.apache.bcel.Constants.LXOR); + super(org.apache.commons.bcel6.Constants.LXOR); } diff --git a/src/main/java/org/apache/bcel/generic/LineNumberGen.java b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/LineNumberGen.java rename to src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java index 08804425..c4d26b52 100644 --- a/src/main/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.classfile.LineNumber; +import org.apache.commons.bcel6.classfile.LineNumber; /** * This class represents a line number within a method, i.e., give an instruction diff --git a/src/main/java/org/apache/bcel/generic/LoadClass.java b/src/main/java/org/apache/commons/bcel6/generic/LoadClass.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/LoadClass.java rename to src/main/java/org/apache/commons/bcel6/generic/LoadClass.java index 19f32691..4805e513 100644 --- a/src/main/java/org/apache/bcel/generic/LoadClass.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LoadClass.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denotes that an instruction may start the process of loading and resolving diff --git a/src/main/java/org/apache/bcel/generic/LoadInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/LoadInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java index 555a5247..31635df8 100644 --- a/src/main/java/org/apache/bcel/generic/LoadInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denotes an unparameterized instruction to load a value from a local diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/LocalVariableGen.java rename to src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java index fc81d462..13914ac9 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.LocalVariable; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.LocalVariable; /** * This class represents a local variable within a method. It contains its diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java index 335387c4..33d8be0f 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.util.ByteSequence; /** * Abstract super class for instructions dealing with local variables. diff --git a/src/main/java/org/apache/bcel/generic/MONITORENTER.java b/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java similarity index 89% rename from src/main/java/org/apache/bcel/generic/MONITORENTER.java rename to src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java index a560fdb7..297a7ad3 100644 --- a/src/main/java/org/apache/bcel/generic/MONITORENTER.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * MONITORENTER - Enter monitor for object @@ -30,13 +30,13 @@ public class MONITORENTER extends Instruction implements ExceptionThrower, Stack public MONITORENTER() { - super(org.apache.bcel.Constants.MONITORENTER, (short) 1); + super(org.apache.commons.bcel6.Constants.MONITORENTER, (short) 1); } public Class[] getExceptions() { return new Class[] { - org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION + org.apache.commons.bcel6.ExceptionConstants.NULL_POINTER_EXCEPTION }; } diff --git a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java b/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java similarity index 89% rename from src/main/java/org/apache/bcel/generic/MONITOREXIT.java rename to src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java index ad57fc64..a2f0e310 100644 --- a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * MONITOREXIT - Exit monitor for object @@ -30,13 +30,13 @@ public class MONITOREXIT extends Instruction implements ExceptionThrower, StackC public MONITOREXIT() { - super(org.apache.bcel.Constants.MONITOREXIT, (short) 1); + super(org.apache.commons.bcel6.Constants.MONITOREXIT, (short) 1); } public Class[] getExceptions() { return new Class[] { - org.apache.bcel.ExceptionConstants.NULL_POINTER_EXCEPTION + org.apache.commons.bcel6.ExceptionConstants.NULL_POINTER_EXCEPTION }; } diff --git a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java rename to src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java index 99dd13a9..760b6d61 100644 --- a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java @@ -15,13 +15,14 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.ExceptionConstants; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.ExceptionConstants; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.util.ByteSequence; /** * MULTIANEWARRAY - Create new mutidimensional array of references @@ -46,7 +47,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati public MULTIANEWARRAY(int index, short dimensions) { - super(org.apache.bcel.Constants.MULTIANEWARRAY, index); + super(org.apache.commons.bcel6.Constants.MULTIANEWARRAY, index); if (dimensions < 1) { throw new ClassGenException("Invalid dimensions value: " + dimensions); } diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/MethodGen.java rename to src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index edffcc54..1f59f8f7 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.util.ArrayList; import java.util.Arrays; @@ -24,24 +24,24 @@ import java.util.Hashtable; import java.util.List; import java.util.Stack; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.AnnotationEntry; -import org.apache.bcel.classfile.Annotations; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.CodeException; -import org.apache.bcel.classfile.ExceptionTable; -import org.apache.bcel.classfile.LineNumber; -import org.apache.bcel.classfile.LineNumberTable; -import org.apache.bcel.classfile.LocalVariable; -import org.apache.bcel.classfile.LocalVariableTable; -import org.apache.bcel.classfile.LocalVariableTypeTable; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.ParameterAnnotationEntry; -import org.apache.bcel.classfile.ParameterAnnotations; -import org.apache.bcel.classfile.RuntimeVisibleParameterAnnotations; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.util.BCELComparator; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.AnnotationEntry; +import org.apache.commons.bcel6.classfile.Annotations; +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.Code; +import org.apache.commons.bcel6.classfile.CodeException; +import org.apache.commons.bcel6.classfile.ExceptionTable; +import org.apache.commons.bcel6.classfile.LineNumber; +import org.apache.commons.bcel6.classfile.LineNumberTable; +import org.apache.commons.bcel6.classfile.LocalVariable; +import org.apache.commons.bcel6.classfile.LocalVariableTable; +import org.apache.commons.bcel6.classfile.LocalVariableTypeTable; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.ParameterAnnotationEntry; +import org.apache.commons.bcel6.classfile.ParameterAnnotations; +import org.apache.commons.bcel6.classfile.RuntimeVisibleParameterAnnotations; +import org.apache.commons.bcel6.classfile.Utility; +import org.apache.commons.bcel6.util.BCELComparator; /** * Template class for building up a method. This is done by defining exception diff --git a/src/main/java/org/apache/bcel/generic/MethodObserver.java b/src/main/java/org/apache/commons/bcel6/generic/MethodObserver.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/MethodObserver.java rename to src/main/java/org/apache/commons/bcel6/generic/MethodObserver.java index d81d24b3..0991f601 100644 --- a/src/main/java/org/apache/bcel/generic/MethodObserver.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodObserver.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Implement this interface if you're interested in changes to a MethodGen object diff --git a/src/main/java/org/apache/bcel/generic/NEW.java b/src/main/java/org/apache/commons/bcel6/generic/NEW.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/NEW.java rename to src/main/java/org/apache/commons/bcel6/generic/NEW.java index da2900d2..e9b3fdc4 100644 --- a/src/main/java/org/apache/bcel/generic/NEW.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NEW.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.ExceptionConstants; +import org.apache.commons.bcel6.ExceptionConstants; /** * NEW - Create new object @@ -41,7 +41,7 @@ public class NEW extends CPInstruction implements LoadClass, AllocationInstructi public NEW(int index) { - super(org.apache.bcel.Constants.NEW, index); + super(org.apache.commons.bcel6.Constants.NEW, index); } diff --git a/src/main/java/org/apache/bcel/generic/NEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java similarity index 89% rename from src/main/java/org/apache/bcel/generic/NEWARRAY.java rename to src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java index 1cf1227e..2516d148 100644 --- a/src/main/java/org/apache/bcel/generic/NEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.util.ByteSequence; /** * NEWARRAY - Create new array of basic type (int, short, ...) @@ -45,7 +46,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce public NEWARRAY(byte type) { - super(org.apache.bcel.Constants.NEWARRAY, (short) 2); + super(org.apache.commons.bcel6.Constants.NEWARRAY, (short) 2); this.type = type; } @@ -87,7 +88,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce */ @Override public String toString( boolean verbose ) { - return super.toString(verbose) + " " + org.apache.bcel.Constants.TYPE_NAMES[type]; + return super.toString(verbose) + " " + org.apache.commons.bcel6.Constants.TYPE_NAMES[type]; } @@ -103,7 +104,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce public Class[] getExceptions() { return new Class[] { - org.apache.bcel.ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION + org.apache.commons.bcel6.ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION }; } diff --git a/src/main/java/org/apache/bcel/generic/NOP.java b/src/main/java/org/apache/commons/bcel6/generic/NOP.java similarity index 93% rename from src/main/java/org/apache/bcel/generic/NOP.java rename to src/main/java/org/apache/commons/bcel6/generic/NOP.java index dea41f09..fb39590b 100644 --- a/src/main/java/org/apache/bcel/generic/NOP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NOP.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * NOP - Do nothing @@ -29,7 +29,7 @@ public class NOP extends Instruction { public NOP() { - super(org.apache.bcel.Constants.NOP, (short) 1); + super(org.apache.commons.bcel6.Constants.NOP, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java similarity index 89% rename from src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java index 66997a41..8b80177f 100644 --- a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.classfile.ConstantCP; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.ConstantCP; +import org.apache.commons.bcel6.classfile.ConstantNameAndType; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantUtf8; /** * Super class for FieldOrMethod and INVOKEDYNAMIC, since they both have diff --git a/src/main/java/org/apache/bcel/generic/NamedAndTyped.java b/src/main/java/org/apache/commons/bcel6/generic/NamedAndTyped.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/NamedAndTyped.java rename to src/main/java/org/apache/commons/bcel6/generic/NamedAndTyped.java index 3a93a573..13db08ff 100644 --- a/src/main/java/org/apache/bcel/generic/NamedAndTyped.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NamedAndTyped.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denote entity that has both name and type. This is true for local variables, diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/ObjectType.java rename to src/main/java/org/apache/commons/bcel6/generic/ObjectType.java index 0678d284..03e96fd7 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.JavaClass; /** * Denotes reference such as java.lang.String. diff --git a/src/main/java/org/apache/bcel/generic/POP.java b/src/main/java/org/apache/commons/bcel6/generic/POP.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/POP.java rename to src/main/java/org/apache/commons/bcel6/generic/POP.java index df47a57d..cc004ac0 100644 --- a/src/main/java/org/apache/bcel/generic/POP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/POP.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * POP - Pop top operand stack word @@ -31,7 +31,7 @@ public class POP extends StackInstruction implements PopInstruction { public POP() { - super(org.apache.bcel.Constants.POP); + super(org.apache.commons.bcel6.Constants.POP); } diff --git a/src/main/java/org/apache/bcel/generic/POP2.java b/src/main/java/org/apache/commons/bcel6/generic/POP2.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/POP2.java rename to src/main/java/org/apache/commons/bcel6/generic/POP2.java index 4bfff24e..7e17281d 100644 --- a/src/main/java/org/apache/bcel/generic/POP2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/POP2.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * POP2 - Pop two top operand stack words @@ -31,7 +31,7 @@ public class POP2 extends StackInstruction implements PopInstruction { public POP2() { - super(org.apache.bcel.Constants.POP2); + super(org.apache.commons.bcel6.Constants.POP2); } diff --git a/src/main/java/org/apache/bcel/generic/PUSH.java b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/PUSH.java rename to src/main/java/org/apache/commons/bcel6/generic/PUSH.java index add84d23..987e260c 100644 --- a/src/main/java/org/apache/bcel/generic/PUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * Wrapper class for push operations, which are implemented either as BIPUSH, diff --git a/src/main/java/org/apache/bcel/generic/PUTFIELD.java b/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/PUTFIELD.java rename to src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java index 78f44df9..db337b57 100644 --- a/src/main/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.ExceptionConstants; /** * PUTFIELD - Put field in object diff --git a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/PUTSTATIC.java rename to src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java index 9431ade7..845fcfc5 100644 --- a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.ExceptionConstants; /** * PUTSTATIC - Put static field in class diff --git a/src/main/java/org/apache/bcel/generic/PopInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/PopInstruction.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/PopInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/PopInstruction.java index 5b29045a..6c0d49a8 100644 --- a/src/main/java/org/apache/bcel/generic/PopInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PopInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denotes an unparameterized instruction to pop a value on top from the stack, diff --git a/src/main/java/org/apache/bcel/generic/PushInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/PushInstruction.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/PushInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/PushInstruction.java index d568e01c..b75ef3e6 100644 --- a/src/main/java/org/apache/bcel/generic/PushInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PushInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denotes an unparameterized instruction to produce a value on top of the stack, diff --git a/src/main/java/org/apache/bcel/generic/RET.java b/src/main/java/org/apache/commons/bcel6/generic/RET.java similarity index 92% rename from src/main/java/org/apache/bcel/generic/RET.java rename to src/main/java/org/apache/commons/bcel6/generic/RET.java index d8758ea6..be67a6ad 100644 --- a/src/main/java/org/apache/bcel/generic/RET.java +++ b/src/main/java/org/apache/commons/bcel6/generic/RET.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.util.ByteSequence; /** * RET - Return from subroutine @@ -45,7 +46,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc public RET(int index) { - super(org.apache.bcel.Constants.RET, (short) 2); + super(org.apache.commons.bcel6.Constants.RET, (short) 2); setIndex(index); // May set wide as side effect } @@ -57,7 +58,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc @Override public void dump( DataOutputStream out ) throws IOException { if (wide) { - out.writeByte(org.apache.bcel.Constants.WIDE); + out.writeByte(org.apache.commons.bcel6.Constants.WIDE); } out.writeByte(opcode); if (wide) { @@ -69,7 +70,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc private void setWide() { - wide = index > org.apache.bcel.Constants.MAX_BYTE; + wide = index > org.apache.commons.bcel6.Constants.MAX_BYTE; if (wide) { length = 4; // Including the wide byte } else { diff --git a/src/main/java/org/apache/bcel/generic/RETURN.java b/src/main/java/org/apache/commons/bcel6/generic/RETURN.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/RETURN.java rename to src/main/java/org/apache/commons/bcel6/generic/RETURN.java index 48f9003a..4e253286 100644 --- a/src/main/java/org/apache/bcel/generic/RETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/RETURN.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * RETURN - Return from void method @@ -30,7 +30,7 @@ public class RETURN extends ReturnInstruction { public RETURN() { - super(org.apache.bcel.Constants.RETURN); + super(org.apache.commons.bcel6.Constants.RETURN); } diff --git a/src/main/java/org/apache/bcel/generic/ReferenceType.java b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/ReferenceType.java rename to src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java index dfc612b8..028ce668 100644 --- a/src/main/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.JavaClass; /** * Super class for object and array types. diff --git a/src/main/java/org/apache/bcel/generic/ReturnInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/ReturnInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java index e30b44d4..4bc3ce56 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; -import org.apache.bcel.ExceptionConstants; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.ExceptionConstants; /** * Super class for the xRETURN family of instructions. diff --git a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java b/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/ReturnaddressType.java rename to src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java index 4a32ca43..111b9347 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; -import org.apache.bcel.Constants; +import org.apache.commons.bcel6.Constants; /** * Returnaddress, the type JSR or JSR_W instructions push upon the stack. diff --git a/src/main/java/org/apache/bcel/generic/SALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/SALOAD.java rename to src/main/java/org/apache/commons/bcel6/generic/SALOAD.java index 69795702..ccd352ad 100644 --- a/src/main/java/org/apache/bcel/generic/SALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * SALOAD - Load short from array @@ -30,7 +30,7 @@ public class SALOAD extends ArrayInstruction implements StackProducer { public SALOAD() { - super(org.apache.bcel.Constants.SALOAD); + super(org.apache.commons.bcel6.Constants.SALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/SASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/SASTORE.java rename to src/main/java/org/apache/commons/bcel6/generic/SASTORE.java index 3c8e0f4f..274383a3 100644 --- a/src/main/java/org/apache/bcel/generic/SASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * SASTORE - Store into short array @@ -30,7 +30,7 @@ public class SASTORE extends ArrayInstruction implements StackConsumer { public SASTORE() { - super(org.apache.bcel.Constants.SASTORE); + super(org.apache.commons.bcel6.Constants.SASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/SIPUSH.java b/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/SIPUSH.java rename to src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java index 120f25bc..25e301ab 100644 --- a/src/main/java/org/apache/bcel/generic/SIPUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.util.ByteSequence; /** * SIPUSH - Push short @@ -44,7 +45,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { public SIPUSH(short b) { - super(org.apache.bcel.Constants.SIPUSH, (short) 3); + super(org.apache.commons.bcel6.Constants.SIPUSH, (short) 3); this.b = b; } diff --git a/src/main/java/org/apache/bcel/generic/SWAP.java b/src/main/java/org/apache/commons/bcel6/generic/SWAP.java similarity index 94% rename from src/main/java/org/apache/bcel/generic/SWAP.java rename to src/main/java/org/apache/commons/bcel6/generic/SWAP.java index 76e73fa7..54643e20 100644 --- a/src/main/java/org/apache/bcel/generic/SWAP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SWAP.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * SWAP - Swa top operand stack word @@ -30,7 +30,7 @@ public class SWAP extends StackInstruction implements StackConsumer, StackProduc public SWAP() { - super(org.apache.bcel.Constants.SWAP); + super(org.apache.commons.bcel6.Constants.SWAP); } diff --git a/src/main/java/org/apache/bcel/generic/SWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java similarity index 99% rename from src/main/java/org/apache/bcel/generic/SWITCH.java rename to src/main/java/org/apache/commons/bcel6/generic/SWITCH.java index 458cf747..c9d76e94 100644 --- a/src/main/java/org/apache/bcel/generic/SWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * SWITCH - Branch depending on int value, generates either LOOKUPSWITCH or diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/commons/bcel6/generic/Select.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/Select.java rename to src/main/java/org/apache/commons/bcel6/generic/Select.java index 48a76428..f80055b1 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Select.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.util.ByteSequence; /** * Select - Abstract super class for LOOKUPSWITCH and TABLESWITCH instructions. diff --git a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java rename to src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java index 40651c53..ad1b269a 100644 --- a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java @@ -15,17 +15,18 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.classfile.ConstantDouble; -import org.apache.bcel.classfile.ConstantFloat; -import org.apache.bcel.classfile.ConstantInteger; -import org.apache.bcel.classfile.ConstantLong; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.ElementValue; -import org.apache.bcel.classfile.SimpleElementValue; + +import org.apache.commons.bcel6.classfile.ConstantDouble; +import org.apache.commons.bcel6.classfile.ConstantFloat; +import org.apache.commons.bcel6.classfile.ConstantInteger; +import org.apache.commons.bcel6.classfile.ConstantLong; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.ElementValue; +import org.apache.commons.bcel6.classfile.SimpleElementValue; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/StackConsumer.java b/src/main/java/org/apache/commons/bcel6/generic/StackConsumer.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/StackConsumer.java rename to src/main/java/org/apache/commons/bcel6/generic/StackConsumer.java index 790c3104..4e0a3e70 100644 --- a/src/main/java/org/apache/bcel/generic/StackConsumer.java +++ b/src/main/java/org/apache/commons/bcel6/generic/StackConsumer.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denote an instruction that may consume a value from the stack. diff --git a/src/main/java/org/apache/bcel/generic/StackInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/StackInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java index e895cacc..1e111290 100644 --- a/src/main/java/org/apache/bcel/generic/StackInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Super class for stack operations like DUP and POP. diff --git a/src/main/java/org/apache/bcel/generic/StackProducer.java b/src/main/java/org/apache/commons/bcel6/generic/StackProducer.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/StackProducer.java rename to src/main/java/org/apache/commons/bcel6/generic/StackProducer.java index 82e481e7..4f217c05 100644 --- a/src/main/java/org/apache/bcel/generic/StackProducer.java +++ b/src/main/java/org/apache/commons/bcel6/generic/StackProducer.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denote an instruction that may produce a value on top of the stack diff --git a/src/main/java/org/apache/bcel/generic/StoreInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/StoreInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java index d2cfac9b..2a38a248 100644 --- a/src/main/java/org/apache/bcel/generic/StoreInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denotes an unparameterized instruction to store a value into a local variable, diff --git a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java similarity index 95% rename from src/main/java/org/apache/bcel/generic/TABLESWITCH.java rename to src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java index e1d59b17..fd59f23d 100644 --- a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.util.ByteSequence; + +import org.apache.commons.bcel6.util.ByteSequence; /** * TABLESWITCH - Switch within given range of values, i.e., low..high @@ -48,7 +49,7 @@ public class TABLESWITCH extends Select { * @param defaultTarget default branch */ public TABLESWITCH(int[] match, InstructionHandle[] targets, InstructionHandle defaultTarget) { - super(org.apache.bcel.Constants.TABLESWITCH, match, targets, defaultTarget); + super(org.apache.commons.bcel6.Constants.TABLESWITCH, match, targets, defaultTarget); length = (short) (13 + match_length * 4); /* Alignment remainder assumed * 0 here, until dump time */ fixed_length = length; diff --git a/src/main/java/org/apache/bcel/generic/TargetLostException.java b/src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java similarity index 98% rename from src/main/java/org/apache/bcel/generic/TargetLostException.java rename to src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java index 8e2b371c..0cb402ee 100644 --- a/src/main/java/org/apache/bcel/generic/TargetLostException.java +++ b/src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Thrown by InstructionList.remove() when one or multiple disposed instructions diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/commons/bcel6/generic/Type.java similarity index 97% rename from src/main/java/org/apache/bcel/generic/Type.java rename to src/main/java/org/apache/commons/bcel6/generic/Type.java index b74a5b26..9899f0c8 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Type.java @@ -15,16 +15,16 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.util.ArrayList; import java.util.List; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.ClassFormatException; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.verifier.structurals.LocalVariables; -import org.apache.bcel.verifier.structurals.OperandStack; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.ClassFormatException; +import org.apache.commons.bcel6.classfile.Utility; +import org.apache.commons.bcel6.verifier.structurals.LocalVariables; +import org.apache.commons.bcel6.verifier.structurals.OperandStack; /** * Abstract super class for all possible java types, namely basic types diff --git a/src/main/java/org/apache/bcel/generic/TypedInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/TypedInstruction.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/TypedInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/TypedInstruction.java index a91a25ee..92204a30 100644 --- a/src/main/java/org/apache/bcel/generic/TypedInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/TypedInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Get the type associated with an instruction, int for ILOAD, or the type diff --git a/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java b/src/main/java/org/apache/commons/bcel6/generic/UnconditionalBranch.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/UnconditionalBranch.java rename to src/main/java/org/apache/commons/bcel6/generic/UnconditionalBranch.java index 1996af12..b1b79f1b 100644 --- a/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java +++ b/src/main/java/org/apache/commons/bcel6/generic/UnconditionalBranch.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denotes an instruction to perform an unconditional branch, i.e., GOTO, JSR. diff --git a/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/VariableLengthInstruction.java similarity index 96% rename from src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java rename to src/main/java/org/apache/commons/bcel6/generic/VariableLengthInstruction.java index fe7630a6..2cfff020 100644 --- a/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/VariableLengthInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Denotes an instruction to be a variable length instruction, such as diff --git a/src/main/java/org/apache/bcel/generic/Visitor.java b/src/main/java/org/apache/commons/bcel6/generic/Visitor.java similarity index 99% rename from src/main/java/org/apache/bcel/generic/Visitor.java rename to src/main/java/org/apache/commons/bcel6/generic/Visitor.java index 34fd3cd8..0a2f4c85 100644 --- a/src/main/java/org/apache/bcel/generic/Visitor.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Visitor.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; /** * Interface implementing the Visitor pattern programming style. diff --git a/src/main/java/org/apache/bcel/generic/package.html b/src/main/java/org/apache/commons/bcel6/generic/package.html similarity index 100% rename from src/main/java/org/apache/bcel/generic/package.html rename to src/main/java/org/apache/commons/bcel6/generic/package.html diff --git a/src/main/java/org/apache/bcel/package.html b/src/main/java/org/apache/commons/bcel6/package.html similarity index 100% rename from src/main/java/org/apache/bcel/package.html rename to src/main/java/org/apache/commons/bcel6/package.html diff --git a/src/main/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java similarity index 90% rename from src/main/java/org/apache/bcel/util/AttributeHTML.java rename to src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java index e586742d..b174a746 100644 --- a/src/main/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java @@ -15,26 +15,27 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.CodeException; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.ConstantValue; -import org.apache.bcel.classfile.ExceptionTable; -import org.apache.bcel.classfile.InnerClass; -import org.apache.bcel.classfile.InnerClasses; -import org.apache.bcel.classfile.LineNumber; -import org.apache.bcel.classfile.LineNumberTable; -import org.apache.bcel.classfile.LocalVariable; -import org.apache.bcel.classfile.LocalVariableTable; -import org.apache.bcel.classfile.SourceFile; -import org.apache.bcel.classfile.Utility; + +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.Code; +import org.apache.commons.bcel6.classfile.CodeException; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.ConstantValue; +import org.apache.commons.bcel6.classfile.ExceptionTable; +import org.apache.commons.bcel6.classfile.InnerClass; +import org.apache.commons.bcel6.classfile.InnerClasses; +import org.apache.commons.bcel6.classfile.LineNumber; +import org.apache.commons.bcel6.classfile.LineNumberTable; +import org.apache.commons.bcel6.classfile.LocalVariable; +import org.apache.commons.bcel6.classfile.LocalVariableTable; +import org.apache.commons.bcel6.classfile.SourceFile; +import org.apache.commons.bcel6.classfile.Utility; /** * Convert found attributes into HTML file. @@ -43,7 +44,7 @@ import org.apache.bcel.classfile.Utility; * @author M. Dahm * */ -final class AttributeHTML implements org.apache.bcel.Constants { +final class AttributeHTML implements org.apache.commons.bcel6.Constants { private final String class_name; // name of current class private final PrintWriter file; // file to write to diff --git a/src/main/java/org/apache/bcel/util/BCELComparator.java b/src/main/java/org/apache/commons/bcel6/util/BCELComparator.java similarity index 97% rename from src/main/java/org/apache/bcel/util/BCELComparator.java rename to src/main/java/org/apache/commons/bcel6/util/BCELComparator.java index 5b56f652..28017ce4 100644 --- a/src/main/java/org/apache/bcel/util/BCELComparator.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELComparator.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; /** * Used for BCEL comparison strategy diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java similarity index 86% rename from src/main/java/org/apache/bcel/util/BCELFactory.java rename to src/main/java/org/apache/commons/bcel6/util/BCELFactory.java index 04278047..53b7e1f7 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.PrintWriter; import java.util.ArrayList; @@ -24,37 +24,37 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.generic.AllocationInstruction; -import org.apache.bcel.generic.ArrayInstruction; -import org.apache.bcel.generic.ArrayType; -import org.apache.bcel.generic.BranchHandle; -import org.apache.bcel.generic.BranchInstruction; -import org.apache.bcel.generic.CHECKCAST; -import org.apache.bcel.generic.CPInstruction; -import org.apache.bcel.generic.CodeExceptionGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.ConstantPushInstruction; -import org.apache.bcel.generic.EmptyVisitor; -import org.apache.bcel.generic.FieldInstruction; -import org.apache.bcel.generic.IINC; -import org.apache.bcel.generic.INSTANCEOF; -import org.apache.bcel.generic.Instruction; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InvokeInstruction; -import org.apache.bcel.generic.LDC; -import org.apache.bcel.generic.LDC2_W; -import org.apache.bcel.generic.LocalVariableInstruction; -import org.apache.bcel.generic.MULTIANEWARRAY; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.NEWARRAY; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.RET; -import org.apache.bcel.generic.ReturnInstruction; -import org.apache.bcel.generic.Select; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.Utility; +import org.apache.commons.bcel6.generic.AllocationInstruction; +import org.apache.commons.bcel6.generic.ArrayInstruction; +import org.apache.commons.bcel6.generic.ArrayType; +import org.apache.commons.bcel6.generic.BranchHandle; +import org.apache.commons.bcel6.generic.BranchInstruction; +import org.apache.commons.bcel6.generic.CHECKCAST; +import org.apache.commons.bcel6.generic.CPInstruction; +import org.apache.commons.bcel6.generic.CodeExceptionGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.ConstantPushInstruction; +import org.apache.commons.bcel6.generic.EmptyVisitor; +import org.apache.commons.bcel6.generic.FieldInstruction; +import org.apache.commons.bcel6.generic.IINC; +import org.apache.commons.bcel6.generic.INSTANCEOF; +import org.apache.commons.bcel6.generic.Instruction; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InvokeInstruction; +import org.apache.commons.bcel6.generic.LDC; +import org.apache.commons.bcel6.generic.LDC2_W; +import org.apache.commons.bcel6.generic.LocalVariableInstruction; +import org.apache.commons.bcel6.generic.MULTIANEWARRAY; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.NEWARRAY; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.RET; +import org.apache.commons.bcel6.generic.ReturnInstruction; +import org.apache.commons.bcel6.generic.Select; +import org.apache.commons.bcel6.generic.Type; /** * Factory creates il.append() statements, and sets instruction targets. diff --git a/src/main/java/org/apache/bcel/util/BCELifier.java b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java similarity index 91% rename from src/main/java/org/apache/bcel/util/BCELifier.java rename to src/main/java/org/apache/commons/bcel6/util/BCELifier.java index b50f9a5e..97eb444d 100644 --- a/src/main/java/org/apache/bcel/util/BCELifier.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java @@ -15,23 +15,24 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Locale; -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.ConstantValue; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.Utility; -import org.apache.bcel.generic.ArrayType; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.Type; + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.ConstantValue; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.Utility; +import org.apache.commons.bcel6.generic.ArrayType; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.Type; /** * This class takes a given JavaClass object and converts it to a @@ -43,7 +44,7 @@ import org.apache.bcel.generic.Type; * @version $Id$ * @author M. Dahm */ -public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { +public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { private static final int FLAG_FOR_UNKNOWN = -1; private static final int FLAG_FOR_CLASS = 0; @@ -82,9 +83,9 @@ public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { _out.println("package " + package_name + ";"); _out.println(); } - _out.println("import org.apache.bcel.generic.*;"); - _out.println("import org.apache.bcel.classfile.*;"); - _out.println("import org.apache.bcel.*;"); + _out.println("import org.apache.commons.bcel6.generic.*;"); + _out.println("import org.apache.commons.bcel6.classfile.*;"); + _out.println("import org.apache.commons.bcel6.*;"); _out.println("import java.io.*;"); _out.println(); _out.println("public class " + class_name + "Creator implements Constants {"); diff --git a/src/main/java/org/apache/bcel/util/ByteSequence.java b/src/main/java/org/apache/commons/bcel6/util/ByteSequence.java similarity index 98% rename from src/main/java/org/apache/bcel/util/ByteSequence.java rename to src/main/java/org/apache/commons/bcel6/util/ByteSequence.java index 72541ee8..c000289e 100644 --- a/src/main/java/org/apache/bcel/util/ByteSequence.java +++ b/src/main/java/org/apache/commons/bcel6/util/ByteSequence.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.ByteArrayInputStream; import java.io.DataInputStream; diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java similarity index 96% rename from src/main/java/org/apache/bcel/util/Class2HTML.java rename to src/main/java/org/apache/commons/bcel6/util/Class2HTML.java index bce475e4..e1d389d5 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java @@ -15,19 +15,20 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.Utility; + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.Utility; /** * Read class file(s) and convert them into HTML files. diff --git a/src/main/java/org/apache/bcel/util/ClassLoader.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java similarity index 94% rename from src/main/java/org/apache/bcel/util/ClassLoader.java rename to src/main/java/org/apache/commons/bcel6/util/ClassLoader.java index dee61fcc..ebcf25c5 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoader.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java @@ -15,18 +15,18 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.ByteArrayInputStream; import java.util.Hashtable; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Utility; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Utility; /** *

    Drop in replacement for the standard class loader of the JVM. You can use it diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java similarity index 94% rename from src/main/java/org/apache/bcel/util/ClassLoaderRepository.java rename to src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java index 39987176..1e6a1ba2 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java @@ -15,14 +15,15 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.JavaClass; + +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.JavaClass; /** * The repository maintains information about which classes have @@ -31,7 +32,7 @@ import org.apache.bcel.classfile.JavaClass; * It loads its data from the ClassLoader implementation * passed into its constructor. * - * @see org.apache.bcel.Repository + * @see org.apache.commons.bcel6.Repository * * @version $Id$ * @author M. Dahm diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java similarity index 99% rename from src/main/java/org/apache/bcel/util/ClassPath.java rename to src/main/java/org/apache/commons/bcel6/util/ClassPath.java index 109dd327..cae46093 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.DataInputStream; import java.io.File; diff --git a/src/main/java/org/apache/bcel/util/ClassQueue.java b/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java similarity index 94% rename from src/main/java/org/apache/bcel/util/ClassQueue.java rename to src/main/java/org/apache/commons/bcel6/util/ClassQueue.java index e33b593e..fa1d7782 100644 --- a/src/main/java/org/apache/bcel/util/ClassQueue.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java @@ -15,10 +15,11 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.util.LinkedList; -import org.apache.bcel.classfile.JavaClass; + +import org.apache.commons.bcel6.classfile.JavaClass; /** * Utility class implementing a (typesafe) queue of JavaClass diff --git a/src/main/java/org/apache/bcel/util/ClassSet.java b/src/main/java/org/apache/commons/bcel6/util/ClassSet.java similarity index 95% rename from src/main/java/org/apache/bcel/util/ClassSet.java rename to src/main/java/org/apache/commons/bcel6/util/ClassSet.java index 5c705062..8f9b6c04 100644 --- a/src/main/java/org/apache/bcel/util/ClassSet.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassSet.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.util.Collection; import java.util.HashMap; import java.util.Map; -import org.apache.bcel.classfile.JavaClass; + +import org.apache.commons.bcel6.classfile.JavaClass; /** * Utility class implementing a (typesafe) set of JavaClass objects. diff --git a/src/main/java/org/apache/bcel/util/ClassStack.java b/src/main/java/org/apache/commons/bcel6/util/ClassStack.java similarity index 94% rename from src/main/java/org/apache/bcel/util/ClassStack.java rename to src/main/java/org/apache/commons/bcel6/util/ClassStack.java index a59cb98f..d6adb328 100644 --- a/src/main/java/org/apache/bcel/util/ClassStack.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassStack.java @@ -15,10 +15,11 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.util.Stack; -import org.apache.bcel.classfile.JavaClass; + +import org.apache.commons.bcel6.classfile.JavaClass; /** * Utility class implementing a (typesafe) stack of JavaClass objects. diff --git a/src/main/java/org/apache/bcel/util/ClassVector.java b/src/main/java/org/apache/commons/bcel6/util/ClassVector.java similarity index 94% rename from src/main/java/org/apache/bcel/util/ClassVector.java rename to src/main/java/org/apache/commons/bcel6/util/ClassVector.java index 6051d746..30ca2449 100644 --- a/src/main/java/org/apache/bcel/util/ClassVector.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassVector.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.util.ArrayList; import java.util.List; -import org.apache.bcel.classfile.JavaClass; + +import org.apache.commons.bcel6.classfile.JavaClass; /** * Utility class implementing a (typesafe) collection of JavaClass diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java similarity index 96% rename from src/main/java/org/apache/bcel/util/CodeHTML.java rename to src/main/java/org/apache/commons/bcel6/util/CodeHTML.java index cd10de46..603179bd 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java @@ -15,25 +15,26 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.BitSet; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.CodeException; -import org.apache.bcel.classfile.ConstantFieldref; -import org.apache.bcel.classfile.ConstantInterfaceMethodref; -import org.apache.bcel.classfile.ConstantInvokeDynamic; -import org.apache.bcel.classfile.ConstantMethodref; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.LocalVariable; -import org.apache.bcel.classfile.LocalVariableTable; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.Utility; + +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.Code; +import org.apache.commons.bcel6.classfile.CodeException; +import org.apache.commons.bcel6.classfile.ConstantFieldref; +import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; +import org.apache.commons.bcel6.classfile.ConstantInvokeDynamic; +import org.apache.commons.bcel6.classfile.ConstantMethodref; +import org.apache.commons.bcel6.classfile.ConstantNameAndType; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.LocalVariable; +import org.apache.commons.bcel6.classfile.LocalVariableTable; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.Utility; /** * Convert code into HTML file. @@ -42,7 +43,7 @@ import org.apache.bcel.classfile.Utility; * @author M. Dahm * */ -final class CodeHTML implements org.apache.bcel.Constants { +final class CodeHTML implements org.apache.commons.bcel6.Constants { private final String class_name; // name of current class // private Method[] methods; // Methods to print diff --git a/src/main/java/org/apache/bcel/util/ConstantHTML.java b/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java similarity index 94% rename from src/main/java/org/apache/bcel/util/ConstantHTML.java rename to src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java index cf654749..e52ac86a 100644 --- a/src/main/java/org/apache/bcel/util/ConstantHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java @@ -15,21 +15,22 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantFieldref; -import org.apache.bcel.classfile.ConstantInterfaceMethodref; -import org.apache.bcel.classfile.ConstantMethodref; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantString; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.Utility; + +import org.apache.commons.bcel6.classfile.Constant; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantFieldref; +import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; +import org.apache.commons.bcel6.classfile.ConstantMethodref; +import org.apache.commons.bcel6.classfile.ConstantNameAndType; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantString; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.Utility; /** * Convert constant pool into HTML file. @@ -38,7 +39,7 @@ import org.apache.bcel.classfile.Utility; * @author M. Dahm * */ -final class ConstantHTML implements org.apache.bcel.Constants { +final class ConstantHTML implements org.apache.commons.bcel6.Constants { private final String class_name; // name of current class private final String class_package; // name of package diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java similarity index 98% rename from src/main/java/org/apache/bcel/util/InstructionFinder.java rename to src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java index 608d4449..7a03aae8 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.util.ArrayList; import java.util.HashMap; @@ -26,11 +26,11 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.ClassGenException; -import org.apache.bcel.generic.Instruction; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.ClassGenException; +import org.apache.commons.bcel6.generic.Instruction; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; /** * InstructionFinder is a tool to search for given instructions patterns, i.e., diff --git a/src/main/java/org/apache/bcel/util/JavaWrapper.java b/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java similarity index 90% rename from src/main/java/org/apache/bcel/util/JavaWrapper.java rename to src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java index 10d3104b..d2173859 100644 --- a/src/main/java/org/apache/bcel/util/JavaWrapper.java +++ b/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -26,11 +26,11 @@ import java.lang.reflect.Modifier; * for your own applications.
    * Call this wrapper with: * - *

    java org.apache.bcel.util.JavaWrapper <real.class.name> [arguments]
    + *
    java org.apache.commons.bcel6.util.JavaWrapper <real.class.name> [arguments]
    * *

    To use your own class loader you can set the "bcel.classloader" system property - * which defaults to "org.apache.bcel.util.ClassLoader", e.g., with:

    - *
    java org.apache.bcel.util.JavaWrapper -Dbcel.classloader=foo.MyLoader <real.class.name> [arguments]
    + * which defaults to "org.apache.commons.bcel6.util.ClassLoader", e.g., with:

    + *
    java org.apache.commons.bcel6.util.JavaWrapper -Dbcel.classloader=foo.MyLoader <real.class.name> [arguments]
    * * @version $Id$ * @author M. Dahm @@ -44,7 +44,7 @@ public class JavaWrapper { private static java.lang.ClassLoader getClassLoader() { String s = System.getProperty("bcel.classloader"); if ((s == null) || "".equals(s)) { - s = "org.apache.bcel.util.ClassLoader"; + s = "org.apache.commons.bcel6.util.ClassLoader"; } try { return (java.lang.ClassLoader) Class.forName(s).newInstance(); diff --git a/src/main/java/org/apache/bcel/util/MethodHTML.java b/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java similarity index 93% rename from src/main/java/org/apache/bcel/util/MethodHTML.java rename to src/main/java/org/apache/commons/bcel6/util/MethodHTML.java index a09cd817..b86250c1 100644 --- a/src/main/java/org/apache/bcel/util/MethodHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java @@ -15,18 +15,19 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.ConstantValue; -import org.apache.bcel.classfile.ExceptionTable; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.Utility; + +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.Code; +import org.apache.commons.bcel6.classfile.ConstantValue; +import org.apache.commons.bcel6.classfile.ExceptionTable; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.Utility; /** * Convert methods and fields into HTML file. @@ -35,7 +36,7 @@ import org.apache.bcel.classfile.Utility; * @author M. Dahm * */ -final class MethodHTML implements org.apache.bcel.Constants { +final class MethodHTML implements org.apache.commons.bcel6.Constants { private final String class_name; // name of current class private final PrintWriter file; // file to write to diff --git a/src/main/java/org/apache/bcel/util/Repository.java b/src/main/java/org/apache/commons/bcel6/util/Repository.java similarity index 93% rename from src/main/java/org/apache/bcel/util/Repository.java rename to src/main/java/org/apache/commons/bcel6/util/Repository.java index 9442697c..21881960 100644 --- a/src/main/java/org/apache/bcel/util/Repository.java +++ b/src/main/java/org/apache/commons/bcel6/util/Repository.java @@ -15,16 +15,16 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; -import org.apache.bcel.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.JavaClass; /** * Abstract definition of a class repository. Instances may be used * to load classes from different sources and may be used in the * Repository.setRepository method. * - * @see org.apache.bcel.Repository + * @see org.apache.commons.bcel6.Repository * @version $Id$ * @author M. Dahm * @author David Dixon-Peugh diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java similarity index 97% rename from src/main/java/org/apache/bcel/util/SyntheticRepository.java rename to src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java index 1d096c19..c5640ae1 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java @@ -15,15 +15,16 @@ * limitations under the License. * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReference; import java.util.HashMap; import java.util.Map; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.JavaClass; + +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.JavaClass; /** * This repository is used in situations where a Class is created @@ -35,7 +36,7 @@ import org.apache.bcel.classfile.JavaClass; * It is designed to be used as a singleton, however it * can also be used with custom classpaths. * - * @see org.apache.bcel.Repository + * @see org.apache.commons.bcel6.Repository * * @version $Id$ * @author M. Dahm diff --git a/src/main/java/org/apache/bcel/util/package.html b/src/main/java/org/apache/commons/bcel6/util/package.html similarity index 100% rename from src/main/java/org/apache/bcel/util/package.html rename to src/main/java/org/apache/commons/bcel6/util/package.html diff --git a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java similarity index 96% rename from src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java rename to src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java index 19ddf7dc..d6d796ec 100644 --- a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.UIManager; -import org.apache.bcel.generic.Type; + +import org.apache.commons.bcel6.generic.Type; /** * A graphical user interface application demonstrating JustIce. diff --git a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java similarity index 98% rename from src/main/java/org/apache/bcel/verifier/NativeVerifier.java rename to src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java index 6ce355c6..d2d182d5 100644 --- a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; /** * The NativeVerifier class implements a main(String[] args) method that's diff --git a/src/main/java/org/apache/bcel/verifier/PassVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/PassVerifier.java rename to src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java index d4308d0a..55849d76 100644 --- a/src/main/java/org/apache/bcel/verifier/PassVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; import java.util.ArrayList; import java.util.List; @@ -43,7 +43,7 @@ import java.util.List; * * @version $Id$ * @author Enver Haase - * @see org.apache.bcel.verifier.Verifier + * @see org.apache.commons.bcel6.verifier.Verifier * @see #verify() */ public abstract class PassVerifier { diff --git a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java b/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java similarity index 96% rename from src/main/java/org/apache/bcel/verifier/TransitiveHull.java rename to src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java index c49579a4..20e792cf 100644 --- a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.JavaClass; /** * This class has a main method implementing a demonstration program diff --git a/src/main/java/org/apache/bcel/verifier/VerificationResult.java b/src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java similarity index 98% rename from src/main/java/org/apache/bcel/verifier/VerificationResult.java rename to src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java index 88651897..eda21488 100644 --- a/src/main/java/org/apache/bcel/verifier/VerificationResult.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; /** * A VerificationResult is what a PassVerifier returns diff --git a/src/main/java/org/apache/bcel/verifier/Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java similarity index 90% rename from src/main/java/org/apache/bcel/verifier/Verifier.java rename to src/main/java/org/apache/commons/bcel6/verifier/Verifier.java index fd2a0af9..b8429d97 100644 --- a/src/main/java/org/apache/bcel/verifier/Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java @@ -15,18 +15,18 @@ * limitations under the License. * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.verifier.statics.Pass1Verifier; -import org.apache.bcel.verifier.statics.Pass2Verifier; -import org.apache.bcel.verifier.statics.Pass3aVerifier; -import org.apache.bcel.verifier.structurals.Pass3bVerifier; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.verifier.statics.Pass1Verifier; +import org.apache.commons.bcel6.verifier.statics.Pass2Verifier; +import org.apache.commons.bcel6.verifier.statics.Pass3aVerifier; +import org.apache.commons.bcel6.verifier.structurals.Pass3bVerifier; /** * A Verifier instance is there to verify a class file according to The Java Virtual @@ -41,8 +41,8 @@ import org.apache.bcel.verifier.structurals.Pass3bVerifier; * * @version $Id$ * @author Enver Haase - * @see org.apache.bcel.verifier.VerifierFactory - * @see org.apache.bcel.verifier.PassVerifier + * @see org.apache.commons.bcel6.verifier.VerifierFactory + * @see org.apache.commons.bcel6.verifier.PassVerifier */ public class Verifier { @@ -164,7 +164,7 @@ public class Verifier { int meth = pv.getMethodNo(); for (String element : p3am) { messages.add("Pass 3a, method " + meth + " ('" - + org.apache.bcel.Repository.lookupClass(classname).getMethods()[meth] + + org.apache.commons.bcel6.Repository.lookupClass(classname).getMethods()[meth] + "'): " + element); } } @@ -173,7 +173,7 @@ public class Verifier { int meth = pv.getMethodNo(); for (String element : p3bm) { messages.add("Pass 3b, method " + meth + " ('" - + org.apache.bcel.Repository.lookupClass(classname).getMethods()[meth] + + org.apache.commons.bcel6.Repository.lookupClass(classname).getMethods()[meth] + "'): " + element); } } @@ -215,7 +215,7 @@ public class Verifier { vr = v.doPass2(); System.out.println("Pass 2:\n" + vr); if (vr == VerificationResult.VR_OK) { - JavaClass jc = org.apache.bcel.Repository.lookupClass(args[k]); + JavaClass jc = org.apache.commons.bcel6.Repository.lookupClass(args[k]); for (int i = 0; i < jc.getMethods().length; i++) { vr = v.doPass3a(i); System.out.println("Pass 3a, method number " + i + " ['" @@ -236,7 +236,7 @@ public class Verifier { System.out.println("\n"); // avoid swapping. v.flush(); - org.apache.bcel.Repository.clearCache(); + org.apache.commons.bcel6.Repository.clearCache(); System.gc(); } catch (ClassNotFoundException e) { e.printStackTrace(); diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java similarity index 99% rename from src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java rename to src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java index c540587c..4502aa1c 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; import java.awt.AWTEvent; import java.awt.CardLayout; @@ -38,8 +38,9 @@ import javax.swing.JSplitPane; import javax.swing.JTextPane; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; + +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.JavaClass; /** * This class implements a machine-generated frame for use with diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/VerifierFactory.java rename to src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java index 91218254..03b1641d 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; import java.util.HashMap; import java.util.List; @@ -30,7 +30,7 @@ import java.util.Vector; * * @version $Id$ * @author Enver Haase - * @see org.apache.bcel.verifier.Verifier + * @see org.apache.commons.bcel6.verifier.Verifier */ public class VerifierFactory { diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java similarity index 94% rename from src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java rename to src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java index fe9a986d..7548abca 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; import java.util.ArrayList; import java.util.List; @@ -32,7 +32,7 @@ import javax.swing.event.ListDataListener; * @version $Id$ * @author Enver Haase */ -public class VerifierFactoryListModel implements org.apache.bcel.verifier.VerifierFactoryObserver, +public class VerifierFactoryListModel implements org.apache.commons.bcel6.verifier.VerifierFactoryObserver, javax.swing.ListModel { private final List listeners = new ArrayList(); diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryObserver.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java rename to src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryObserver.java index 7a0fd298..0b184452 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryObserver.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; /** * VerifierFactoryObserver instances are notified when new Verifier diff --git a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java similarity index 99% rename from src/main/java/org/apache/bcel/verifier/VerifyDialog.java rename to src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java index 93e48049..9b274000 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; import java.awt.Color; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.JavaClass; /** * A class for simple graphical class file verification. diff --git a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java similarity index 98% rename from src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java index 0cb8da14..891505d0 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java index d85e4a56..68967662 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java index 29b1483f..107a84b8 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** * Instances of this class are thrown by BCEL's class file verifier "JustIce" when diff --git a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java similarity index 96% rename from src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java index 0dad66e5..281a18f8 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** * Instances of this class are thrown by BCEL's class file verifier "JustIce" diff --git a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/LinkingConstraintException.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/LinkingConstraintException.java index 01670400..7f4db059 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/LinkingConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** * Instances of this class are thrown by BCEL's class file verifier "JustIce" when diff --git a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/exc/LoadingException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java index 18256f85..66ba5b50 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java index 5d394787..82e1a065 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java similarity index 96% rename from src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java index a087e17f..0a9bca42 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java index 894b51be..18e7d0e5 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java index 61d0d54d..0780ed30 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java index 9b155556..fa476042 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** * Instances of this class are thrown by BCEL's class file verifier "JustIce" when diff --git a/src/main/java/org/apache/bcel/verifier/exc/Utility.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java similarity index 96% rename from src/main/java/org/apache/bcel/verifier/exc/Utility.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java index 99a60e2e..2887c5e0 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/Utility.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; import java.io.PrintWriter; diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/exc/VerificationException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java index 2df00f36..bca39a82 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java similarity index 98% rename from src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java rename to src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java index 7a8e2c79..841d9eec 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.exc; +package org.apache.commons.bcel6.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/package.html b/src/main/java/org/apache/commons/bcel6/verifier/exc/package.html similarity index 100% rename from src/main/java/org/apache/bcel/verifier/exc/package.html rename to src/main/java/org/apache/commons/bcel6/verifier/exc/package.html diff --git a/src/main/java/org/apache/bcel/verifier/package.html b/src/main/java/org/apache/commons/bcel6/verifier/package.html similarity index 100% rename from src/main/java/org/apache/bcel/verifier/package.html rename to src/main/java/org/apache/commons/bcel6/verifier/package.html diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java similarity index 91% rename from src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java rename to src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java index ba241e1f..4f4dbc9e 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.statics; +package org.apache.commons.bcel6.verifier.statics; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.Type; /** * This class represents the upper half of a DOUBLE variable. diff --git a/src/main/java/org/apache/bcel/verifier/statics/IntList.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java similarity index 97% rename from src/main/java/org/apache/bcel/verifier/statics/IntList.java rename to src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java index 64c4e463..c029b17f 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/IntList.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.statics; +package org.apache.commons.bcel6.verifier.statics; import java.util.ArrayList; diff --git a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java similarity index 91% rename from src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java rename to src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java index 7a6190f9..9d5d1ed4 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.statics; +package org.apache.commons.bcel6.verifier.statics; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.Type; /** * This class represents the upper half of a LONG variable. diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java similarity index 95% rename from src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java rename to src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java index 719b4fc9..41377659 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.statics; +package org.apache.commons.bcel6.verifier.statics; import java.util.Hashtable; -import org.apache.bcel.generic.Type; -import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; + +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.verifier.exc.LocalVariableInfoInconsistentException; /** * A utility class holding the information about diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java similarity index 91% rename from src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java rename to src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java index 9730007d..6962b47b 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.statics; +package org.apache.commons.bcel6.verifier.statics; -import org.apache.bcel.generic.Type; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; +import org.apache.commons.bcel6.verifier.exc.LocalVariableInfoInconsistentException; /** * A utility class holding the information about diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java similarity index 93% rename from src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java rename to src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java index 1d9ba412..2fc0a79d 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java @@ -15,17 +15,17 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.statics; +package org.apache.commons.bcel6.verifier.statics; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.ClassFormatException; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.verifier.PassVerifier; -import org.apache.bcel.verifier.VerificationResult; -import org.apache.bcel.verifier.Verifier; -import org.apache.bcel.verifier.exc.LoadingException; -import org.apache.bcel.verifier.exc.Utility; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.ClassFormatException; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.verifier.PassVerifier; +import org.apache.commons.bcel6.verifier.VerificationResult; +import org.apache.commons.bcel6.verifier.Verifier; +import org.apache.commons.bcel6.verifier.exc.LoadingException; +import org.apache.commons.bcel6.verifier.exc.Utility; /** * This PassVerifier verifies a class file according to pass 1 as @@ -67,7 +67,7 @@ public final class Pass1Verifier extends PassVerifier{ /** * Should only be instantiated by a Verifier. * - * @see org.apache.bcel.verifier.Verifier + * @see org.apache.commons.bcel6.verifier.Verifier */ public Pass1Verifier(Verifier owner){ myOwner = owner; @@ -129,7 +129,7 @@ public final class Pass1Verifier extends PassVerifier{ * (like the check for extra bytes at the end of the class file) are handy when actually using BCEL to repair a class file (otherwise you would not be * able to load it into BCEL).

    * - * @see org.apache.bcel.Repository + * @see org.apache.commons.bcel6.Repository */ @Override public VerificationResult do_verify(){ diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java similarity index 94% rename from src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java rename to src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java index 3f269979..8a77b483 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.statics; +package org.apache.commons.bcel6.verifier.statics; import java.util.HashMap; @@ -23,53 +23,54 @@ import java.util.HashSet; import java.util.Locale; import java.util.Map; import java.util.Set; -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.ClassFormatException; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.CodeException; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantDouble; -import org.apache.bcel.classfile.ConstantFieldref; -import org.apache.bcel.classfile.ConstantFloat; -import org.apache.bcel.classfile.ConstantInteger; -import org.apache.bcel.classfile.ConstantInterfaceMethodref; -import org.apache.bcel.classfile.ConstantLong; -import org.apache.bcel.classfile.ConstantMethodref; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantString; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.ConstantValue; -import org.apache.bcel.classfile.Deprecated; -import org.apache.bcel.classfile.DescendingVisitor; -import org.apache.bcel.classfile.EmptyVisitor; -import org.apache.bcel.classfile.ExceptionTable; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.InnerClass; -import org.apache.bcel.classfile.InnerClasses; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.LineNumber; -import org.apache.bcel.classfile.LineNumberTable; -import org.apache.bcel.classfile.LocalVariable; -import org.apache.bcel.classfile.LocalVariableTable; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.Node; -import org.apache.bcel.classfile.SourceFile; -import org.apache.bcel.classfile.Synthetic; -import org.apache.bcel.classfile.Unknown; -import org.apache.bcel.generic.ArrayType; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.Type; -import org.apache.bcel.verifier.PassVerifier; -import org.apache.bcel.verifier.VerificationResult; -import org.apache.bcel.verifier.Verifier; -import org.apache.bcel.verifier.VerifierFactory; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.ClassConstraintException; -import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.ClassFormatException; +import org.apache.commons.bcel6.classfile.Code; +import org.apache.commons.bcel6.classfile.CodeException; +import org.apache.commons.bcel6.classfile.Constant; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantDouble; +import org.apache.commons.bcel6.classfile.ConstantFieldref; +import org.apache.commons.bcel6.classfile.ConstantFloat; +import org.apache.commons.bcel6.classfile.ConstantInteger; +import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; +import org.apache.commons.bcel6.classfile.ConstantLong; +import org.apache.commons.bcel6.classfile.ConstantMethodref; +import org.apache.commons.bcel6.classfile.ConstantNameAndType; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantString; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.ConstantValue; +import org.apache.commons.bcel6.classfile.Deprecated; +import org.apache.commons.bcel6.classfile.DescendingVisitor; +import org.apache.commons.bcel6.classfile.EmptyVisitor; +import org.apache.commons.bcel6.classfile.ExceptionTable; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.InnerClass; +import org.apache.commons.bcel6.classfile.InnerClasses; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.LineNumber; +import org.apache.commons.bcel6.classfile.LineNumberTable; +import org.apache.commons.bcel6.classfile.LocalVariable; +import org.apache.commons.bcel6.classfile.LocalVariableTable; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.Node; +import org.apache.commons.bcel6.classfile.SourceFile; +import org.apache.commons.bcel6.classfile.Synthetic; +import org.apache.commons.bcel6.classfile.Unknown; +import org.apache.commons.bcel6.generic.ArrayType; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.verifier.PassVerifier; +import org.apache.commons.bcel6.verifier.VerificationResult; +import org.apache.commons.bcel6.verifier.Verifier; +import org.apache.commons.bcel6.verifier.VerifierFactory; +import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; +import org.apache.commons.bcel6.verifier.exc.ClassConstraintException; +import org.apache.commons.bcel6.verifier.exc.LocalVariableInfoInconsistentException; /** * This PassVerifier verifies a class file according to @@ -143,7 +144,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * the "Code" array of methods in a few cases. Please * see the pass 3a documentation, too. * - * @see org.apache.bcel.verifier.statics.Pass3aVerifier + * @see org.apache.commons.bcel6.verifier.statics.Pass3aVerifier */ @Override public VerificationResult do_verify(){ @@ -306,7 +307,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * * @see #constant_pool_entries_satisfy_static_constraints() */ - private class CPESSC_Visitor extends org.apache.bcel.classfile.EmptyVisitor{ + private class CPESSC_Visitor extends org.apache.commons.bcel6.classfile.EmptyVisitor{ private final Class CONST_Class; /* private Class CONST_Fieldref; @@ -335,19 +336,19 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ cp = _jc.getConstantPool(); cplen = cp.getLength(); - CONST_Class = org.apache.bcel.classfile.ConstantClass.class; + CONST_Class = org.apache.commons.bcel6.classfile.ConstantClass.class; /* - CONST_Fieldref = org.apache.bcel.classfile.ConstantFieldref.class; - CONST_Methodref = org.apache.bcel.classfile.ConstantMethodref.class; - CONST_InterfaceMethodref = org.apache.bcel.classfile.ConstantInterfaceMethodref.class; + CONST_Fieldref = org.apache.commons.bcel6.classfile.ConstantFieldref.class; + CONST_Methodref = org.apache.commons.bcel6.classfile.ConstantMethodref.class; + CONST_InterfaceMethodref = org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref.class; */ - CONST_String = org.apache.bcel.classfile.ConstantString.class; - CONST_Integer = org.apache.bcel.classfile.ConstantInteger.class; - CONST_Float = org.apache.bcel.classfile.ConstantFloat.class; - CONST_Long = org.apache.bcel.classfile.ConstantLong.class; - CONST_Double = org.apache.bcel.classfile.ConstantDouble.class; - CONST_NameAndType = org.apache.bcel.classfile.ConstantNameAndType.class; - CONST_Utf8 = org.apache.bcel.classfile.ConstantUtf8.class; + CONST_String = org.apache.commons.bcel6.classfile.ConstantString.class; + CONST_Integer = org.apache.commons.bcel6.classfile.ConstantInteger.class; + CONST_Float = org.apache.commons.bcel6.classfile.ConstantFloat.class; + CONST_Long = org.apache.commons.bcel6.classfile.ConstantLong.class; + CONST_Double = org.apache.commons.bcel6.classfile.ConstantDouble.class; + CONST_NameAndType = org.apache.commons.bcel6.classfile.ConstantNameAndType.class; + CONST_Utf8 = org.apache.commons.bcel6.classfile.ConstantUtf8.class; carrier = new DescendingVisitor(_jc, this); carrier.visit(); @@ -1203,7 +1204,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ * pool must be valid. * * @see #constant_pool_entries_satisfy_static_constraints() - * @see org.apache.bcel.classfile.ConstantCP + * @see org.apache.commons.bcel6.classfile.ConstantCP */ private class FAMRAV_Visitor extends EmptyVisitor{ private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work. diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java similarity index 92% rename from src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java rename to src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java index dab8e7b1..14936cfd 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java @@ -15,89 +15,89 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.statics; - - -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.CodeException; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantDouble; -import org.apache.bcel.classfile.ConstantFieldref; -import org.apache.bcel.classfile.ConstantFloat; -import org.apache.bcel.classfile.ConstantInteger; -import org.apache.bcel.classfile.ConstantInterfaceMethodref; -import org.apache.bcel.classfile.ConstantLong; -import org.apache.bcel.classfile.ConstantMethodref; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantString; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.LineNumber; -import org.apache.bcel.classfile.LineNumberTable; -import org.apache.bcel.classfile.LocalVariable; -import org.apache.bcel.classfile.LocalVariableTable; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.generic.ALOAD; -import org.apache.bcel.generic.ANEWARRAY; -import org.apache.bcel.generic.ASTORE; -import org.apache.bcel.generic.ATHROW; -import org.apache.bcel.generic.ArrayType; -import org.apache.bcel.generic.BREAKPOINT; -import org.apache.bcel.generic.CHECKCAST; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.DLOAD; -import org.apache.bcel.generic.DSTORE; -import org.apache.bcel.generic.FLOAD; -import org.apache.bcel.generic.FSTORE; -import org.apache.bcel.generic.FieldInstruction; -import org.apache.bcel.generic.GETSTATIC; -import org.apache.bcel.generic.GotoInstruction; -import org.apache.bcel.generic.IINC; -import org.apache.bcel.generic.ILOAD; -import org.apache.bcel.generic.IMPDEP1; -import org.apache.bcel.generic.IMPDEP2; -import org.apache.bcel.generic.INSTANCEOF; -import org.apache.bcel.generic.INVOKEDYNAMIC; -import org.apache.bcel.generic.INVOKEINTERFACE; -import org.apache.bcel.generic.INVOKESPECIAL; -import org.apache.bcel.generic.INVOKESTATIC; -import org.apache.bcel.generic.INVOKEVIRTUAL; -import org.apache.bcel.generic.ISTORE; -import org.apache.bcel.generic.Instruction; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.InvokeInstruction; -import org.apache.bcel.generic.JsrInstruction; -import org.apache.bcel.generic.LDC; -import org.apache.bcel.generic.LDC2_W; -import org.apache.bcel.generic.LLOAD; -import org.apache.bcel.generic.LOOKUPSWITCH; -import org.apache.bcel.generic.LSTORE; -import org.apache.bcel.generic.LoadClass; -import org.apache.bcel.generic.MULTIANEWARRAY; -import org.apache.bcel.generic.NEW; -import org.apache.bcel.generic.NEWARRAY; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.PUTSTATIC; -import org.apache.bcel.generic.RET; -import org.apache.bcel.generic.ReturnInstruction; -import org.apache.bcel.generic.TABLESWITCH; -import org.apache.bcel.generic.Type; -import org.apache.bcel.verifier.PassVerifier; -import org.apache.bcel.verifier.VerificationResult; -import org.apache.bcel.verifier.Verifier; -import org.apache.bcel.verifier.VerifierFactory; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.ClassConstraintException; -import org.apache.bcel.verifier.exc.InvalidMethodException; -import org.apache.bcel.verifier.exc.StaticCodeConstraintException; -import org.apache.bcel.verifier.exc.StaticCodeInstructionConstraintException; -import org.apache.bcel.verifier.exc.StaticCodeInstructionOperandConstraintException; +package org.apache.commons.bcel6.verifier.statics; + + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.Code; +import org.apache.commons.bcel6.classfile.CodeException; +import org.apache.commons.bcel6.classfile.Constant; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantDouble; +import org.apache.commons.bcel6.classfile.ConstantFieldref; +import org.apache.commons.bcel6.classfile.ConstantFloat; +import org.apache.commons.bcel6.classfile.ConstantInteger; +import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; +import org.apache.commons.bcel6.classfile.ConstantLong; +import org.apache.commons.bcel6.classfile.ConstantMethodref; +import org.apache.commons.bcel6.classfile.ConstantNameAndType; +import org.apache.commons.bcel6.classfile.ConstantString; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.LineNumber; +import org.apache.commons.bcel6.classfile.LineNumberTable; +import org.apache.commons.bcel6.classfile.LocalVariable; +import org.apache.commons.bcel6.classfile.LocalVariableTable; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.generic.ALOAD; +import org.apache.commons.bcel6.generic.ANEWARRAY; +import org.apache.commons.bcel6.generic.ASTORE; +import org.apache.commons.bcel6.generic.ATHROW; +import org.apache.commons.bcel6.generic.ArrayType; +import org.apache.commons.bcel6.generic.BREAKPOINT; +import org.apache.commons.bcel6.generic.CHECKCAST; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.DLOAD; +import org.apache.commons.bcel6.generic.DSTORE; +import org.apache.commons.bcel6.generic.FLOAD; +import org.apache.commons.bcel6.generic.FSTORE; +import org.apache.commons.bcel6.generic.FieldInstruction; +import org.apache.commons.bcel6.generic.GETSTATIC; +import org.apache.commons.bcel6.generic.GotoInstruction; +import org.apache.commons.bcel6.generic.IINC; +import org.apache.commons.bcel6.generic.ILOAD; +import org.apache.commons.bcel6.generic.IMPDEP1; +import org.apache.commons.bcel6.generic.IMPDEP2; +import org.apache.commons.bcel6.generic.INSTANCEOF; +import org.apache.commons.bcel6.generic.INVOKEDYNAMIC; +import org.apache.commons.bcel6.generic.INVOKEINTERFACE; +import org.apache.commons.bcel6.generic.INVOKESPECIAL; +import org.apache.commons.bcel6.generic.INVOKESTATIC; +import org.apache.commons.bcel6.generic.INVOKEVIRTUAL; +import org.apache.commons.bcel6.generic.ISTORE; +import org.apache.commons.bcel6.generic.Instruction; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.InvokeInstruction; +import org.apache.commons.bcel6.generic.JsrInstruction; +import org.apache.commons.bcel6.generic.LDC; +import org.apache.commons.bcel6.generic.LDC2_W; +import org.apache.commons.bcel6.generic.LLOAD; +import org.apache.commons.bcel6.generic.LOOKUPSWITCH; +import org.apache.commons.bcel6.generic.LSTORE; +import org.apache.commons.bcel6.generic.LoadClass; +import org.apache.commons.bcel6.generic.MULTIANEWARRAY; +import org.apache.commons.bcel6.generic.NEW; +import org.apache.commons.bcel6.generic.NEWARRAY; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.PUTSTATIC; +import org.apache.commons.bcel6.generic.RET; +import org.apache.commons.bcel6.generic.ReturnInstruction; +import org.apache.commons.bcel6.generic.TABLESWITCH; +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.verifier.PassVerifier; +import org.apache.commons.bcel6.verifier.VerificationResult; +import org.apache.commons.bcel6.verifier.Verifier; +import org.apache.commons.bcel6.verifier.VerifierFactory; +import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; +import org.apache.commons.bcel6.verifier.exc.ClassConstraintException; +import org.apache.commons.bcel6.verifier.exc.InvalidMethodException; +import org.apache.commons.bcel6.verifier.exc.StaticCodeConstraintException; +import org.apache.commons.bcel6.verifier.exc.StaticCodeInstructionConstraintException; +import org.apache.commons.bcel6.verifier.exc.StaticCodeInstructionOperandConstraintException; /** * This PassVerifier verifies a class file according to @@ -443,7 +443,7 @@ public final class Pass3aVerifier extends PassVerifier{ * This visitor class does the actual checking for the instruction * operand's constraints. */ - private class InstOperandConstraintVisitor extends org.apache.bcel.generic.EmptyVisitor{ + private class InstOperandConstraintVisitor extends org.apache.commons.bcel6.generic.EmptyVisitor{ /** The ConstantPoolGen instance this Visitor operates on. */ private final ConstantPoolGen cpg; diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java similarity index 77% rename from src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java rename to src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java index 04761807..4baba7ca 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java @@ -15,48 +15,48 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.statics; - - -import org.apache.bcel.classfile.Annotations; -import org.apache.bcel.classfile.BootstrapMethods; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.CodeException; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantDouble; -import org.apache.bcel.classfile.ConstantFieldref; -import org.apache.bcel.classfile.ConstantFloat; -import org.apache.bcel.classfile.ConstantInteger; -import org.apache.bcel.classfile.ConstantInterfaceMethodref; -import org.apache.bcel.classfile.ConstantLong; -import org.apache.bcel.classfile.ConstantMethodref; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantString; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.ConstantValue; -import org.apache.bcel.classfile.Deprecated; -import org.apache.bcel.classfile.EnclosingMethod; -import org.apache.bcel.classfile.ExceptionTable; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.InnerClass; -import org.apache.bcel.classfile.InnerClasses; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.LineNumber; -import org.apache.bcel.classfile.LineNumberTable; -import org.apache.bcel.classfile.LocalVariable; -import org.apache.bcel.classfile.LocalVariableTable; -import org.apache.bcel.classfile.LocalVariableTypeTable; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.MethodParameters; -import org.apache.bcel.classfile.Node; -import org.apache.bcel.classfile.Signature; -import org.apache.bcel.classfile.SourceFile; -import org.apache.bcel.classfile.StackMap; -import org.apache.bcel.classfile.StackMapTable; -import org.apache.bcel.classfile.Synthetic; -import org.apache.bcel.classfile.Unknown; -import org.apache.bcel.verifier.exc.AssertionViolatedException; +package org.apache.commons.bcel6.verifier.statics; + + +import org.apache.commons.bcel6.classfile.Annotations; +import org.apache.commons.bcel6.classfile.BootstrapMethods; +import org.apache.commons.bcel6.classfile.Code; +import org.apache.commons.bcel6.classfile.CodeException; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantDouble; +import org.apache.commons.bcel6.classfile.ConstantFieldref; +import org.apache.commons.bcel6.classfile.ConstantFloat; +import org.apache.commons.bcel6.classfile.ConstantInteger; +import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; +import org.apache.commons.bcel6.classfile.ConstantLong; +import org.apache.commons.bcel6.classfile.ConstantMethodref; +import org.apache.commons.bcel6.classfile.ConstantNameAndType; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantString; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.ConstantValue; +import org.apache.commons.bcel6.classfile.Deprecated; +import org.apache.commons.bcel6.classfile.EnclosingMethod; +import org.apache.commons.bcel6.classfile.ExceptionTable; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.InnerClass; +import org.apache.commons.bcel6.classfile.InnerClasses; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.LineNumber; +import org.apache.commons.bcel6.classfile.LineNumberTable; +import org.apache.commons.bcel6.classfile.LocalVariable; +import org.apache.commons.bcel6.classfile.LocalVariableTable; +import org.apache.commons.bcel6.classfile.LocalVariableTypeTable; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.MethodParameters; +import org.apache.commons.bcel6.classfile.Node; +import org.apache.commons.bcel6.classfile.Signature; +import org.apache.commons.bcel6.classfile.SourceFile; +import org.apache.commons.bcel6.classfile.StackMap; +import org.apache.commons.bcel6.classfile.StackMapTable; +import org.apache.commons.bcel6.classfile.Synthetic; +import org.apache.commons.bcel6.classfile.Unknown; +import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; /** * BCEL's Node classes (those from the classfile API that accept() Visitor @@ -73,7 +73,7 @@ import org.apache.bcel.verifier.exc.AssertionViolatedException; * @version $Id$ * @author Enver Haase */ -public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor { +public class StringRepresentation extends org.apache.commons.bcel6.classfile.EmptyVisitor { /** The string representation, created by a visitXXX() method, output by toString(). */ private String tostring; /** The node we ask for its string representation. Not really needed; only for debug output. */ diff --git a/src/main/java/org/apache/bcel/verifier/statics/package.html b/src/main/java/org/apache/commons/bcel6/verifier/statics/package.html similarity index 100% rename from src/main/java/org/apache/bcel/verifier/statics/package.html rename to src/main/java/org/apache/commons/bcel6/verifier/statics/package.html diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java similarity index 95% rename from src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java index 3d28b05b..1b2c5aed 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; import java.util.ArrayList; @@ -23,18 +23,18 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.bcel.generic.ATHROW; -import org.apache.bcel.generic.BranchInstruction; -import org.apache.bcel.generic.GotoInstruction; -import org.apache.bcel.generic.Instruction; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.JsrInstruction; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.RET; -import org.apache.bcel.generic.ReturnInstruction; -import org.apache.bcel.generic.Select; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; +import org.apache.commons.bcel6.generic.ATHROW; +import org.apache.commons.bcel6.generic.BranchInstruction; +import org.apache.commons.bcel6.generic.GotoInstruction; +import org.apache.commons.bcel6.generic.Instruction; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.JsrInstruction; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.RET; +import org.apache.commons.bcel6.generic.ReturnInstruction; +import org.apache.commons.bcel6.generic.Select; +import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; +import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; /** * This class represents a control flow graph of a method. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandler.java similarity index 91% rename from src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandler.java index 75dbb127..f437f4c2 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandler.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.ObjectType; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.ObjectType; /** * This class represents an exception handler; that is, an ObjectType diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java similarity index 91% rename from src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java index 22bab054..4ec7d88b 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; import java.util.HashMap; @@ -23,9 +23,9 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -import org.apache.bcel.generic.CodeExceptionGen; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.MethodGen; +import org.apache.commons.bcel6.generic.CodeExceptionGen; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.MethodGen; /** * This class allows easy access to ExceptionHandler objects. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java similarity index 98% rename from src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java index ff2b0011..b5bdd015 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java @@ -15,18 +15,18 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantDouble; -import org.apache.bcel.classfile.ConstantFloat; -import org.apache.bcel.classfile.ConstantInteger; -import org.apache.bcel.classfile.ConstantLong; -import org.apache.bcel.classfile.ConstantString; -import org.apache.bcel.generic.*; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.Constant; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantDouble; +import org.apache.commons.bcel6.classfile.ConstantFloat; +import org.apache.commons.bcel6.classfile.ConstantInteger; +import org.apache.commons.bcel6.classfile.ConstantLong; +import org.apache.commons.bcel6.classfile.ConstantString; +import org.apache.commons.bcel6.generic.*; /** * This Visitor class may be used for a type-based Java Virtual Machine diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Frame.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java similarity index 98% rename from src/main/java/org/apache/bcel/verifier/structurals/Frame.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java index 953f099c..37dbb6cb 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Frame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/GenericArray.java similarity index 96% rename from src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/GenericArray.java index 24b3a87e..929f3bd3 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/GenericArray.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; /** diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java similarity index 98% rename from src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java index 6556d33e..e47c39d3 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java @@ -15,27 +15,27 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; - - -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantDouble; -import org.apache.bcel.classfile.ConstantFieldref; -import org.apache.bcel.classfile.ConstantFloat; -import org.apache.bcel.classfile.ConstantInteger; -import org.apache.bcel.classfile.ConstantLong; -import org.apache.bcel.classfile.ConstantString; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.generic.*; -import org.apache.bcel.verifier.VerificationResult; -import org.apache.bcel.verifier.Verifier; -import org.apache.bcel.verifier.VerifierFactory; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; +package org.apache.commons.bcel6.verifier.structurals; + + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.Constant; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantDouble; +import org.apache.commons.bcel6.classfile.ConstantFieldref; +import org.apache.commons.bcel6.classfile.ConstantFloat; +import org.apache.commons.bcel6.classfile.ConstantInteger; +import org.apache.commons.bcel6.classfile.ConstantLong; +import org.apache.commons.bcel6.classfile.ConstantString; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.generic.*; +import org.apache.commons.bcel6.verifier.VerificationResult; +import org.apache.commons.bcel6.verifier.Verifier; +import org.apache.commons.bcel6.verifier.VerifierFactory; +import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; +import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; /** @@ -48,12 +48,12 @@ import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; * * @version $Id$ * @author Enver Haase - * @see org.apache.bcel.verifier.exc.StructuralCodeConstraintException - * @see org.apache.bcel.verifier.exc.LinkingConstraintException + * @see org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException + * @see org.apache.commons.bcel6.verifier.exc.LinkingConstraintException */ public class InstConstraintVisitor extends EmptyVisitor{ - private static final ObjectType GENERIC_ARRAY = ObjectType.getInstance("org.apache.bcel.verifier.structurals.GenericArray"); + private static final ObjectType GENERIC_ARRAY = ObjectType.getInstance("org.apache.commons.bcel6.verifier.structurals.GenericArray"); /** * The constructor. Constructs a new instance of this class. @@ -105,7 +105,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * This method is called by the visitXXX() to notify the acceptor of this InstConstraintVisitor * that a constraint violation has occured. This is done by throwing an instance of a * StructuralCodeConstraintException. - * @throws org.apache.bcel.verifier.exc.StructuralCodeConstraintException always. + * @throws org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException always. */ private void constraintViolated(Instruction violator, String description){ String fq_classname = violator.getClass().getName(); @@ -144,7 +144,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Assures index is of type INT. - * @throws org.apache.bcel.verifier.exc.StructuralCodeConstraintException if the above constraint is not satisfied. + * @throws org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException if the above constraint is not satisfied. */ private void indexOfInt(Instruction o, Type index){ if (! index.equals(Type.INT)) { @@ -156,7 +156,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Assures the ReferenceType r is initialized (or Type.NULL). * Formally, this means (!(r instanceof UninitializedObjectType)), because * there are no uninitialized array types. - * @throws org.apache.bcel.verifier.exc.StructuralCodeConstraintException if the above constraint is not satisfied. + * @throws org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException if the above constraint is not satisfied. */ private void referenceTypeIsInitialized(Instruction o, ReferenceType r){ if (r instanceof UninitializedObjectType){ @@ -174,7 +174,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Assures arrayref is of ArrayType or NULL; * returns true if and only if arrayref is non-NULL. - * @throws org.apache.bcel.verifier.exc.StructuralCodeConstraintException if the above constraint is violated. + * @throws org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException if the above constraint is violated. */ private boolean arrayrefOfArrayType(Instruction o, Type arrayref){ if (! ((arrayref instanceof ArrayType) || arrayref.equals(Type.NULL)) ) { diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java similarity index 96% rename from src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java index 6842fc01..a43671d3 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java @@ -15,11 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; import java.util.ArrayList; -import org.apache.bcel.generic.InstructionHandle; + +import org.apache.commons.bcel6.generic.InstructionHandle; /** * An InstructionContext offers convenient access diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java similarity index 93% rename from src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java index c1e4a085..cc2f159d 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; -import org.apache.bcel.generic.ReferenceType; -import org.apache.bcel.generic.Type; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; +import org.apache.commons.bcel6.generic.ReferenceType; +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; +import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; /** * This class implements an array of local variables used for symbolic JVM @@ -171,7 +171,7 @@ public class LocalVariables{ else{ if (! (locals[i].equals(lv.locals[i])) ){ /*TODO - if ((locals[i] instanceof org.apache.bcel.generic.ReturnaddressType) && (lv.locals[i] instanceof org.apache.bcel.generic.ReturnaddressType)){ + if ((locals[i] instanceof org.apache.commons.bcel6.generic.ReturnaddressType) && (lv.locals[i] instanceof org.apache.commons.bcel6.generic.ReturnaddressType)){ //System.err.println("merging "+locals[i]+" and "+lv.locals[i]); throw new AssertionViolatedException("Merging different ReturnAddresses: '"+locals[i]+"' and '"+lv.locals[i]+"'."); } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java similarity index 95% rename from src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java index 155d303b..8f3ee21a 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java @@ -15,20 +15,21 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; import java.util.ArrayList; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.ReferenceType; -import org.apache.bcel.generic.Type; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; + +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.ReferenceType; +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; +import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; /** * This class implements a stack used for symbolic JVM stack simulation. * [It's used an an operand stack substitute.] - * Elements of this stack are org.apache.bcel.generic.Type objects. + * Elements of this stack are org.apache.commons.bcel6.generic.Type objects. * * @version $Id$ * @author Enver Haase diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java similarity index 92% rename from src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java index 6d8940ea..2ba9f7d8 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; import java.io.PrintWriter; @@ -25,26 +25,26 @@ import java.util.List; import java.util.Random; import java.util.Vector; -import org.apache.bcel.Constants; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.JsrInstruction; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.RET; -import org.apache.bcel.generic.ReferenceType; -import org.apache.bcel.generic.ReturnInstruction; -import org.apache.bcel.generic.ReturnaddressType; -import org.apache.bcel.generic.Type; -import org.apache.bcel.verifier.PassVerifier; -import org.apache.bcel.verifier.VerificationResult; -import org.apache.bcel.verifier.Verifier; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; -import org.apache.bcel.verifier.exc.VerifierConstraintViolatedException; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.JsrInstruction; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.RET; +import org.apache.commons.bcel6.generic.ReferenceType; +import org.apache.commons.bcel6.generic.ReturnInstruction; +import org.apache.commons.bcel6.generic.ReturnaddressType; +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.verifier.PassVerifier; +import org.apache.commons.bcel6.verifier.VerificationResult; +import org.apache.commons.bcel6.verifier.Verifier; +import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; +import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; +import org.apache.commons.bcel6.verifier.exc.VerifierConstraintViolatedException; /** * This PassVerifier verifies a method of class file according to pass 3, @@ -113,7 +113,7 @@ public final class Pass3bVerifier extends PassVerifier{ /** * This class should only be instantiated by a Verifier. * - * @see org.apache.bcel.verifier.Verifier + * @see org.apache.commons.bcel6.verifier.Verifier */ public Pass3bVerifier(Verifier owner, int method_no){ myOwner = owner; @@ -293,8 +293,8 @@ public final class Pass3bVerifier extends PassVerifier{ * verifier-inferred types and the class file's debug information (LocalVariables * attributes) match [TODO]. * - * @see org.apache.bcel.verifier.statics.LocalVariablesInfo - * @see org.apache.bcel.verifier.statics.Pass2Verifier#getLocalVariablesInfo(int) + * @see org.apache.commons.bcel6.verifier.statics.LocalVariablesInfo + * @see org.apache.commons.bcel6.verifier.statics.Pass2Verifier#getLocalVariablesInfo(int) */ @Override public VerificationResult do_verify(){ diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java similarity index 94% rename from src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java index c6dac021..7f1f27ce 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; -import org.apache.bcel.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionHandle; /** * This interface defines properties of JVM bytecode subroutines. @@ -41,7 +41,7 @@ public interface Subroutine{ * Note that JustIce has a pretty rigid notion of a subroutine. * Must not be invoked on the 'top-level subroutine'. * - * @see org.apache.bcel.verifier.structurals.Subroutines + * @see org.apache.commons.bcel6.verifier.structurals.Subroutines */ InstructionHandle getLeavingRET(); diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java similarity index 96% rename from src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java index 29277498..d76dc355 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; import java.util.ArrayList; import java.util.HashMap; @@ -24,22 +24,22 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.bcel.generic.ASTORE; -import org.apache.bcel.generic.ATHROW; -import org.apache.bcel.generic.BranchInstruction; -import org.apache.bcel.generic.CodeExceptionGen; -import org.apache.bcel.generic.GotoInstruction; -import org.apache.bcel.generic.IndexedInstruction; -import org.apache.bcel.generic.Instruction; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.JsrInstruction; -import org.apache.bcel.generic.LocalVariableInstruction; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.RET; -import org.apache.bcel.generic.ReturnInstruction; -import org.apache.bcel.generic.Select; -import org.apache.bcel.verifier.exc.AssertionViolatedException; -import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; +import org.apache.commons.bcel6.generic.ASTORE; +import org.apache.commons.bcel6.generic.ATHROW; +import org.apache.commons.bcel6.generic.BranchInstruction; +import org.apache.commons.bcel6.generic.CodeExceptionGen; +import org.apache.commons.bcel6.generic.GotoInstruction; +import org.apache.commons.bcel6.generic.IndexedInstruction; +import org.apache.commons.bcel6.generic.Instruction; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.JsrInstruction; +import org.apache.commons.bcel6.generic.LocalVariableInstruction; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.RET; +import org.apache.commons.bcel6.generic.ReturnInstruction; +import org.apache.commons.bcel6.generic.Select; +import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; +import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; /** * Instances of this class contain information about the subroutines diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java similarity index 91% rename from src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java index da203cda..4fcb48c9 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.structurals; +package org.apache.commons.bcel6.verifier.structurals; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.ReferenceType; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.ReferenceType; /** * This class represents an uninitialized object type; see The Java diff --git a/src/main/java/org/apache/bcel/verifier/structurals/package.html b/src/main/java/org/apache/commons/bcel6/verifier/structurals/package.html similarity index 100% rename from src/main/java/org/apache/bcel/verifier/structurals/package.html rename to src/main/java/org/apache/commons/bcel6/verifier/structurals/package.html diff --git a/src/site/xdoc/faq.xml b/src/site/xdoc/faq.xml index 4c071d11..9522fecf 100644 --- a/src/site/xdoc/faq.xml +++ b/src/site/xdoc/faq.xml @@ -31,7 +31,7 @@ Q: How can I ... with BCEL?
    A: Take a look at - org.apache.bcel.util.BCELifier, it takes a given class + org.apache.commons.bcel6.util.BCELifier, it takes a given class and converts it to a BCEL program (in Java, of course). It will show you how certain code is generated using BCEL.

    @@ -85,7 +85,7 @@ A: Use the JustIce verifier that comes together with BCEL to get more detailed information:
    -       java org.apache.bcel.verifier.Verifier <your class>
    + java org.apache.commons.bcel6.verifier.Verifier <your class>
  • diff --git a/src/site/xdoc/manual.xml b/src/site/xdoc/manual.xml index d9ab982d..463eb9e6 100644 --- a/src/site/xdoc/manual.xml +++ b/src/site/xdoc/manual.xml @@ -623,7 +623,7 @@

    The "static" component of the BCEL API resides in the package - org.apache.bcel.classfile and closely represents class + org.apache.commons.bcel6.classfile and closely represents class files. All of the binary components and data structures declared in the JVM @@ -751,7 +751,7 @@

    - This part of the API (package org.apache.bcel.generic) + This part of the API (package org.apache.commons.bcel6.generic) supplies an abstraction level for creating or transforming class files dynamically. It makes the static constraints of Java class files like the hard-coded byte code addresses "generic". The @@ -1095,7 +1095,7 @@

    The search() method of class - org.apache.bcel.util.InstructionFinder gets a regular + org.apache.commons.bcel6.util.InstructionFinder gets a regular expression and a starting point as arguments and returns an iterator describing the area of matched instructions. Additional constraints to the matching area of instructions, which can not be @@ -1577,10 +1577,10 @@ symbolic type signature encoded with Type objects. import java.io.*; import java.util.Iterator; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; -import org.apache.bcel.Repository; -import org.apache.bcel.util.InstructionFinder; +import org.apache.commons.bcel6.classfile.*; +import org.apache.commons.bcel6.generic.*; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.util.InstructionFinder; public class Peephole { diff --git a/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java b/src/test/java/org/apache/commons/bcel6/AbstractCounterVisitorTestCase.java similarity index 87% rename from src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java rename to src/test/java/org/apache/commons/bcel6/AbstractCounterVisitorTestCase.java index e6ed03aa..5459ae7a 100644 --- a/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AbstractCounterVisitorTestCase.java @@ -16,11 +16,11 @@ * */ -package org.apache.bcel; +package org.apache.commons.bcel6; -import org.apache.bcel.classfile.DescendingVisitor; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.visitors.CounterVisitor; +import org.apache.commons.bcel6.classfile.DescendingVisitor; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.visitors.CounterVisitor; public abstract class AbstractCounterVisitorTestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/bcel/AbstractTestCase.java b/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java similarity index 88% rename from src/test/java/org/apache/bcel/AbstractTestCase.java rename to src/test/java/org/apache/commons/bcel6/AbstractTestCase.java index 4b047f61..ac0ba38d 100644 --- a/src/test/java/org/apache/bcel/AbstractTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java @@ -16,26 +16,26 @@ * */ -package org.apache.bcel; +package org.apache.commons.bcel6; import java.io.File; import java.util.ArrayList; import java.util.List; -import junit.framework.TestCase; +import org.apache.commons.bcel6.classfile.AnnotationEntry; +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.generic.AnnotationEntryGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.ElementValueGen; +import org.apache.commons.bcel6.generic.ElementValuePairGen; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.SimpleElementValueGen; +import org.apache.commons.bcel6.util.ClassPath; +import org.apache.commons.bcel6.util.SyntheticRepository; -import org.apache.bcel.classfile.AnnotationEntry; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.generic.AnnotationEntryGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.ElementValueGen; -import org.apache.bcel.generic.ElementValuePairGen; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.SimpleElementValueGen; -import org.apache.bcel.util.ClassPath; -import org.apache.bcel.util.SyntheticRepository; +import junit.framework.TestCase; public abstract class AbstractTestCase extends TestCase { diff --git a/src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java b/src/test/java/org/apache/commons/bcel6/AnnotationAccessFlagTestCase.java similarity index 85% rename from src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java rename to src/test/java/org/apache/commons/bcel6/AnnotationAccessFlagTestCase.java index fa381e1d..e40d64c5 100644 --- a/src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AnnotationAccessFlagTestCase.java @@ -16,9 +16,9 @@ * */ -package org.apache.bcel; +package org.apache.commons.bcel6; -import org.apache.bcel.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.JavaClass; public class AnnotationAccessFlagTestCase extends AbstractTestCase { @@ -29,11 +29,11 @@ public class AnnotationAccessFlagTestCase extends AbstractTestCase */ public void testAnnotationClassSaysItIs() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.bcel.data.SimpleAnnotation"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.SimpleAnnotation"); assertTrue( "Expected SimpleAnnotation class to say it was an annotation - but it didn't !", clazz.isAnnotation()); - clazz = getTestClass("org.apache.bcel.data.SimpleClass"); + clazz = getTestClass("org.apache.commons.bcel6.data.SimpleClass"); assertTrue( "Expected SimpleClass class to say it was not an annotation - but it didn't !", !clazz.isAnnotation()); diff --git a/src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java b/src/test/java/org/apache/commons/bcel6/AnnotationDefaultAttributeTestCase.java similarity index 80% rename from src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java rename to src/test/java/org/apache/commons/bcel6/AnnotationDefaultAttributeTestCase.java index 24c3a5ea..b9ed1068 100644 --- a/src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AnnotationDefaultAttributeTestCase.java @@ -16,13 +16,13 @@ * */ -package org.apache.bcel; +package org.apache.commons.bcel6; -import org.apache.bcel.classfile.AnnotationDefault; -import org.apache.bcel.classfile.ElementValue; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.SimpleElementValue; +import org.apache.commons.bcel6.classfile.AnnotationDefault; +import org.apache.commons.bcel6.classfile.ElementValue; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.SimpleElementValue; public class AnnotationDefaultAttributeTestCase extends AbstractTestCase { @@ -33,7 +33,7 @@ public class AnnotationDefaultAttributeTestCase extends AbstractTestCase */ public void testMethodAnnotations() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.bcel.data.SimpleAnnotation"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.SimpleAnnotation"); Method m = getMethod(clazz, "fruit"); AnnotationDefault a = (AnnotationDefault) findAttribute( "AnnotationDefault", m.getAttributes()); diff --git a/src/test/java/org/apache/bcel/AnonymousClassTestCase.java b/src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java similarity index 81% rename from src/test/java/org/apache/bcel/AnonymousClassTestCase.java rename to src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java index f43f9c79..23bc1179 100644 --- a/src/test/java/org/apache/bcel/AnonymousClassTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java @@ -16,15 +16,15 @@ * */ -package org.apache.bcel; +package org.apache.commons.bcel6; -import org.apache.bcel.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.JavaClass; public class AnonymousClassTestCase extends AbstractTestCase { public void testRegularClassIsNotAnonymous() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.bcel.data.AnonymousClassTest"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnonymousClassTest"); assertFalse("regular outer classes are not anonymous", clazz .isAnonymous()); assertFalse("regular outer classes are not nested", clazz.isNested()); @@ -33,7 +33,7 @@ public class AnonymousClassTestCase extends AbstractTestCase public void testNamedInnerClassIsNotAnonymous() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.bcel.data.AnonymousClassTest$X"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnonymousClassTest$X"); assertFalse("regular inner classes are not anonymous", clazz .isAnonymous()); assertTrue("regular inner classes are nested", clazz.isNested()); @@ -42,7 +42,7 @@ public class AnonymousClassTestCase extends AbstractTestCase public void testStaticInnerClassIsNotAnonymous() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.bcel.data.AnonymousClassTest$Y"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnonymousClassTest$Y"); assertFalse("regular static inner classes are not anonymous", clazz .isAnonymous()); assertTrue("regular static inner classes are nested", clazz.isNested()); @@ -51,7 +51,7 @@ public class AnonymousClassTestCase extends AbstractTestCase public void testAnonymousInnerClassIsAnonymous() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.bcel.data.AnonymousClassTest$1"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnonymousClassTest$1"); assertTrue("anonymous inner classes are anonymous", clazz.isAnonymous()); assertTrue("anonymous inner classes are anonymous", clazz.isNested()); } diff --git a/src/test/java/org/apache/bcel/BCELBenchmark.java b/src/test/java/org/apache/commons/bcel6/BCELBenchmark.java similarity index 92% rename from src/test/java/org/apache/bcel/BCELBenchmark.java rename to src/test/java/org/apache/commons/bcel6/BCELBenchmark.java index 257ffc90..82fc3135 100644 --- a/src/test/java/org/apache/bcel/BCELBenchmark.java +++ b/src/test/java/org/apache/commons/bcel6/BCELBenchmark.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.bcel; +package org.apache.commons.bcel6; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -23,12 +23,12 @@ import java.util.concurrent.TimeUnit; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; import org.apache.commons.collections4.Predicate; import org.apache.commons.collections4.iterators.EnumerationIterator; import org.apache.commons.collections4.iterators.FilterIterator; diff --git a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java b/src/test/java/org/apache/commons/bcel6/CounterVisitorTestCase.java similarity index 97% rename from src/test/java/org/apache/bcel/CounterVisitorTestCase.java rename to src/test/java/org/apache/commons/bcel6/CounterVisitorTestCase.java index 0a4ffb03..20ee8546 100644 --- a/src/test/java/org/apache/bcel/CounterVisitorTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/CounterVisitorTestCase.java @@ -16,16 +16,16 @@ * */ -package org.apache.bcel; +package org.apache.commons.bcel6; -import org.apache.bcel.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.JavaClass; public class CounterVisitorTestCase extends AbstractCounterVisitorTestCase { @Override protected JavaClass getTestClass() throws ClassNotFoundException { - return getTestClass("org.apache.bcel.data.MarkedType"); + return getTestClass("org.apache.commons.bcel6.data.MarkedType"); } public void testAnnotationsCount() diff --git a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java b/src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java similarity index 95% rename from src/test/java/org/apache/bcel/ElementValueGenTestCase.java rename to src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java index 81658241..9ae924d6 100644 --- a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java @@ -16,21 +16,22 @@ * */ -package org.apache.bcel; +package org.apache.commons.bcel6; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.ElementValueGen; -import org.apache.bcel.generic.SimpleElementValueGen; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.ClassElementValueGen; -import org.apache.bcel.generic.EnumElementValueGen; + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.ClassElementValueGen; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.ElementValueGen; +import org.apache.commons.bcel6.generic.EnumElementValueGen; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.SimpleElementValueGen; public class ElementValueGenTestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java b/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java similarity index 77% rename from src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java rename to src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java index edf72670..502fbb21 100644 --- a/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java @@ -16,16 +16,16 @@ * */ -package org.apache.bcel; +package org.apache.commons.bcel6; import java.io.File; import java.io.IOException; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.EnclosingMethod; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.util.SyntheticRepository; +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.EnclosingMethod; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.util.SyntheticRepository; public class EnclosingMethodAttributeTestCase extends AbstractTestCase { @@ -36,7 +36,7 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase public void testCheckMethodLevelNamedInnerClass() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.bcel.data.AttributeTestClassEM01$1S"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AttributeTestClassEM01$1S"); ConstantPool pool = clazz.getConstantPool(); Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); assertTrue("Expected 1 EnclosingMethod attribute but found " @@ -45,9 +45,9 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase String enclosingClassName = em.getEnclosingClass().getBytes(pool); String enclosingMethodName = em.getEnclosingMethod().getName(pool); assertTrue( - "Expected class name to be 'org/apache/bcel/data/AttributeTestClassEM01' but was " + "Expected class name to be 'org/apache/commons/bcel6/data/AttributeTestClassEM01' but was " + enclosingClassName, enclosingClassName - .equals("org/apache/bcel/data/AttributeTestClassEM01")); + .equals("org/apache/commons/bcel6/data/AttributeTestClassEM01")); assertTrue("Expected method name to be 'main' but was " + enclosingMethodName, enclosingMethodName.equals("main")); } @@ -59,7 +59,7 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase public void testCheckClassLevelNamedInnerClass() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.bcel.data.AttributeTestClassEM02$1"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AttributeTestClassEM02$1"); ConstantPool pool = clazz.getConstantPool(); Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); assertTrue("Expected 1 EnclosingMethod attribute but found " @@ -71,9 +71,9 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase + em.getEnclosingMethodIndex(), em .getEnclosingMethodIndex() == 0); assertTrue( - "Expected class name to be 'org/apache/bcel/data/AttributeTestClassEM02' but was " + "Expected class name to be 'org/apache/commons/bcel6/data/AttributeTestClassEM02' but was " + enclosingClassName, enclosingClassName - .equals("org/apache/bcel/data/AttributeTestClassEM02")); + .equals("org/apache/commons/bcel6/data/AttributeTestClassEM02")); } /** @@ -82,7 +82,7 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase public void testAttributeSerializtion() throws ClassNotFoundException, IOException { - JavaClass clazz = getTestClass("org.apache.bcel.data.AttributeTestClassEM02$1"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AttributeTestClassEM02$1"); ConstantPool pool = clazz.getConstantPool(); Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); assertTrue("Expected 1 EnclosingMethod attribute but found " @@ -101,9 +101,9 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase + em.getEnclosingMethodIndex(), em .getEnclosingMethodIndex() == 0); assertTrue( - "Expected class name to be 'org/apache/bcel/data/AttributeTestClassEM02' but was " + "Expected class name to be 'org/apache/commons/bcel6/data/AttributeTestClassEM02' but was " + enclosingClassName, enclosingClassName - .equals("org/apache/bcel/data/AttributeTestClassEM02")); + .equals("org/apache/commons/bcel6/data/AttributeTestClassEM02")); tfile.deleteOnExit(); } } \ No newline at end of file diff --git a/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java b/src/test/java/org/apache/commons/bcel6/EnumAccessFlagTestCase.java similarity index 85% rename from src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java rename to src/test/java/org/apache/commons/bcel6/EnumAccessFlagTestCase.java index 86a26f3f..9bd3ed61 100644 --- a/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/EnumAccessFlagTestCase.java @@ -16,9 +16,9 @@ * */ -package org.apache.bcel; +package org.apache.commons.bcel6; -import org.apache.bcel.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.JavaClass; public class EnumAccessFlagTestCase extends AbstractTestCase { @@ -29,11 +29,11 @@ public class EnumAccessFlagTestCase extends AbstractTestCase */ public void testEnumClassSaysItIs() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.bcel.data.SimpleEnum"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.SimpleEnum"); assertTrue( "Expected SimpleEnum class to say it was an enum - but it didn't !", clazz.isEnum()); - clazz = getTestClass("org.apache.bcel.data.SimpleClass"); + clazz = getTestClass("org.apache.commons.bcel6.data.SimpleClass"); assertTrue( "Expected SimpleClass class to say it was not an enum - but it didn't !", !clazz.isEnum()); diff --git a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java b/src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java similarity index 81% rename from src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java rename to src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java index ec65fce1..399d56f3 100644 --- a/src/test/java/org/apache/bcel/FieldAnnotationsTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java @@ -16,18 +16,19 @@ * */ -package org.apache.bcel; +package org.apache.commons.bcel6; import java.io.File; import java.io.IOException; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.AnnotationEntry; -import org.apache.bcel.classfile.ElementValuePair; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.FieldGen; -import org.apache.bcel.generic.AnnotationEntryGen; -import org.apache.bcel.util.SyntheticRepository; + +import org.apache.commons.bcel6.classfile.AnnotationEntry; +import org.apache.commons.bcel6.classfile.ElementValuePair; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.generic.AnnotationEntryGen; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.FieldGen; +import org.apache.commons.bcel6.util.SyntheticRepository; public class FieldAnnotationsTestCase extends AbstractTestCase { @@ -36,10 +37,10 @@ public class FieldAnnotationsTestCase extends AbstractTestCase */ public void testFieldAnnotationEntrys() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnnotatedFields"); // TODO L...;? - checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); - checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); + checkAnnotatedField(clazz, "i", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "1"); + checkAnnotatedField(clazz, "s", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "2"); } /** @@ -48,16 +49,16 @@ public class FieldAnnotationsTestCase extends AbstractTestCase public void testFieldAnnotationEntrysReadWrite() throws ClassNotFoundException, IOException { - JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); - checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); - checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnnotatedFields"); + checkAnnotatedField(clazz, "i", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "1"); + checkAnnotatedField(clazz, "s", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "2"); // Write it out File tfile = createTestdataFile("AnnotatedFields.class"); clazz.dump(tfile); SyntheticRepository repos2 = createRepos("."); repos2.loadClass("AnnotatedFields"); - checkAnnotatedField(clazz, "i", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "1"); - checkAnnotatedField(clazz, "s", "Lorg/apache/bcel/data/SimpleAnnotation;", "id", "2"); + checkAnnotatedField(clazz, "i", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "1"); + checkAnnotatedField(clazz, "s", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "2"); assertTrue(tfile.delete()); } @@ -69,7 +70,7 @@ public class FieldAnnotationsTestCase extends AbstractTestCase throws ClassNotFoundException { boolean dbg = false; - JavaClass clazz = getTestClass("org.apache.bcel.data.AnnotatedFields"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnnotatedFields"); ClassGen clg = new ClassGen(clazz); Field f = clg.getFields()[0]; if (dbg) { diff --git a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/commons/bcel6/GeneratingAnnotatedClassesTestCase.java similarity index 92% rename from src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java rename to src/test/java/org/apache/commons/bcel6/GeneratingAnnotatedClassesTestCase.java index 64442c94..86e8b095 100644 --- a/src/test/java/org/apache/bcel/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/GeneratingAnnotatedClassesTestCase.java @@ -15,42 +15,43 @@ * limitations under the License. * */ -package org.apache.bcel; +package org.apache.commons.bcel6; import java.io.File; import java.util.ArrayList; import java.util.List; -import org.apache.bcel.classfile.AnnotationEntry; -import org.apache.bcel.classfile.ArrayElementValue; -import org.apache.bcel.classfile.ElementValue; -import org.apache.bcel.classfile.ElementValuePair; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.ParameterAnnotationEntry; -import org.apache.bcel.classfile.SimpleElementValue; -import org.apache.bcel.generic.ALOAD; -import org.apache.bcel.generic.ASTORE; -import org.apache.bcel.generic.AnnotationElementValueGen; -import org.apache.bcel.generic.AnnotationEntryGen; -import org.apache.bcel.generic.ArrayElementValueGen; -import org.apache.bcel.generic.ArrayType; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.ElementValueGen; -import org.apache.bcel.generic.ElementValuePairGen; -import org.apache.bcel.generic.GOTO; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionFactory; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.LocalVariableGen; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.PUSH; -import org.apache.bcel.generic.SimpleElementValueGen; -import org.apache.bcel.generic.Type; -import org.apache.bcel.util.SyntheticRepository; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.AnnotationEntry; +import org.apache.commons.bcel6.classfile.ArrayElementValue; +import org.apache.commons.bcel6.classfile.ElementValue; +import org.apache.commons.bcel6.classfile.ElementValuePair; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.ParameterAnnotationEntry; +import org.apache.commons.bcel6.classfile.SimpleElementValue; +import org.apache.commons.bcel6.generic.ALOAD; +import org.apache.commons.bcel6.generic.ASTORE; +import org.apache.commons.bcel6.generic.AnnotationElementValueGen; +import org.apache.commons.bcel6.generic.AnnotationEntryGen; +import org.apache.commons.bcel6.generic.ArrayElementValueGen; +import org.apache.commons.bcel6.generic.ArrayType; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.ElementValueGen; +import org.apache.commons.bcel6.generic.ElementValuePairGen; +import org.apache.commons.bcel6.generic.GOTO; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionFactory; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.LocalVariableGen; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.PUSH; +import org.apache.commons.bcel6.generic.SimpleElementValueGen; +import org.apache.commons.bcel6.generic.Type; +import org.apache.commons.bcel6.util.SyntheticRepository; /** * The program that some of the tests generate looks like this: @@ -215,7 +216,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase public void testTransformClassToClassGen_SimpleTypes() throws ClassNotFoundException { - JavaClass jc = getTestClass("org.apache.bcel.data.SimpleAnnotatedClass"); + JavaClass jc = getTestClass("org.apache.commons.bcel6.data.SimpleAnnotatedClass"); ClassGen cgen = new ClassGen(jc); // Check annotations are correctly preserved AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); @@ -230,7 +231,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase public void testTransformClassToClassGen_EnumType() throws ClassNotFoundException { - JavaClass jc = getTestClass("org.apache.bcel.data.AnnotatedWithEnumClass"); + JavaClass jc = getTestClass("org.apache.commons.bcel6.data.AnnotatedWithEnumClass"); ClassGen cgen = new ClassGen(jc); // Check annotations are correctly preserved AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); @@ -245,7 +246,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase public void testTransformClassToClassGen_ArrayAndAnnotationTypes() throws ClassNotFoundException { - JavaClass jc = getTestClass("org.apache.bcel.data.AnnotatedWithCombinedAnnotation"); + JavaClass jc = getTestClass("org.apache.commons.bcel6.data.AnnotatedWithCombinedAnnotation"); ClassGen cgen = new ClassGen(jc); // Check annotations are correctly preserved AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); @@ -268,10 +269,10 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase + innerValue, innerValue instanceof AnnotationElementValueGen); AnnotationElementValueGen innerAnnotationValue = (AnnotationElementValueGen) innerValue; - assertTrue("Should be called Lorg/apache/bcel/data/SimpleAnnotation; but is called: " + assertTrue("Should be called Lorg/apache/commons/bcel6/data/SimpleAnnotation; but is called: " + innerAnnotationValue.getAnnotation().getTypeName(), innerAnnotationValue.getAnnotation().getTypeSignature().equals( - "Lorg/apache/bcel/data/SimpleAnnotation;")); + "Lorg/apache/commons/bcel6/data/SimpleAnnotation;")); // check the three methods Method[] methods = cgen.getMethods(); @@ -352,7 +353,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase public void testTransformComplexClassToClassGen() throws ClassNotFoundException { - JavaClass jc = getTestClass("org.apache.bcel.data.ComplexAnnotatedClass"); + JavaClass jc = getTestClass("org.apache.commons.bcel6.data.ComplexAnnotatedClass"); ClassGen cgen = new ClassGen(jc); // Check annotations are correctly preserved AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); @@ -380,7 +381,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase */ public void testModifyingClasses1() throws ClassNotFoundException { - JavaClass jc = getTestClass("org.apache.bcel.data.SimpleAnnotatedClass"); + JavaClass jc = getTestClass("org.apache.commons.bcel6.data.SimpleAnnotatedClass"); ClassGen cgen = new ClassGen(jc); ConstantPoolGen cp = cgen.getConstantPool(); cgen.addAnnotationEntry(createFruitAnnotation(cp, "Pineapple")); @@ -397,7 +398,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase */ public void testModifyingClasses2() throws ClassNotFoundException { - JavaClass jc = getTestClass("org.apache.bcel.data.SimpleAnnotatedClass"); + JavaClass jc = getTestClass("org.apache.commons.bcel6.data.SimpleAnnotatedClass"); ClassGen cgen = new ClassGen(jc); ConstantPoolGen cp = cgen.getConstantPool(); cgen.addAnnotationEntry(createCombinedAnnotation(cp)); diff --git a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java b/src/test/java/org/apache/commons/bcel6/InstructionFinderTestCase.java similarity index 80% rename from src/test/java/org/apache/bcel/InstructionFinderTestCase.java rename to src/test/java/org/apache/commons/bcel6/InstructionFinderTestCase.java index fe73e59c..a5a35635 100644 --- a/src/test/java/org/apache/bcel/InstructionFinderTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/InstructionFinderTestCase.java @@ -15,22 +15,22 @@ * limitations under the License. * */ -package org.apache.bcel; +package org.apache.commons.bcel6; import java.util.Iterator; -import org.apache.bcel.AbstractTestCase; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.util.InstructionFinder; +import org.apache.commons.bcel6.AbstractTestCase; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.util.InstructionFinder; public class InstructionFinderTestCase extends AbstractTestCase { public void testSearchAll() throws Exception { - JavaClass clazz = getTestClass("org.apache.bcel.util.InstructionFinder"); + JavaClass clazz = getTestClass("org.apache.commons.bcel6.util.InstructionFinder"); Method[] methods = clazz.getMethods(); Method searchM = null; for (Method m : methods) diff --git a/src/test/java/org/apache/bcel/NanoTimer.java b/src/test/java/org/apache/commons/bcel6/NanoTimer.java similarity index 97% rename from src/test/java/org/apache/bcel/NanoTimer.java rename to src/test/java/org/apache/commons/bcel6/NanoTimer.java index 3c9978b2..72faa7a6 100644 --- a/src/test/java/org/apache/bcel/NanoTimer.java +++ b/src/test/java/org/apache/commons/bcel6/NanoTimer.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel; +package org.apache.commons.bcel6; public class NanoTimer { diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/commons/bcel6/PerformanceTest.java similarity index 93% rename from src/test/java/org/apache/bcel/PerformanceTest.java rename to src/test/java/org/apache/commons/bcel6/PerformanceTest.java index d7e3eda8..d4289b7c 100644 --- a/src/test/java/org/apache/bcel/PerformanceTest.java +++ b/src/test/java/org/apache/commons/bcel6/PerformanceTest.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel; +package org.apache.commons.bcel6; import java.io.ByteArrayInputStream; import java.io.File; @@ -27,12 +27,12 @@ import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import org.apache.bcel.classfile.ClassParser; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; import org.junit.Assert; import junit.framework.TestCase; diff --git a/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java b/src/test/java/org/apache/commons/bcel6/classfile/UtilityTestCase.java similarity index 93% rename from src/test/java/org/apache/bcel/classfile/UtilityTestCase.java rename to src/test/java/org/apache/commons/bcel6/classfile/UtilityTestCase.java index 15cbbe26..979a4e4c 100644 --- a/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/classfile/UtilityTestCase.java @@ -15,7 +15,9 @@ * limitations under the License. */ -package org.apache.bcel.classfile; +package org.apache.commons.bcel6.classfile; + +import org.apache.commons.bcel6.classfile.Utility; import junit.framework.TestCase; diff --git a/src/test/java/org/apache/bcel/data/AnnotatedFields.java b/src/test/java/org/apache/commons/bcel6/data/AnnotatedFields.java similarity index 95% rename from src/test/java/org/apache/bcel/data/AnnotatedFields.java rename to src/test/java/org/apache/commons/bcel6/data/AnnotatedFields.java index 76ae6bdb..d8391a0d 100644 --- a/src/test/java/org/apache/bcel/data/AnnotatedFields.java +++ b/src/test/java/org/apache/commons/bcel6/data/AnnotatedFields.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; public class AnnotatedFields { @SimpleAnnotation(id=1) int i; diff --git a/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java b/src/test/java/org/apache/commons/bcel6/data/AnnotatedWithCombinedAnnotation.java similarity index 97% rename from src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java rename to src/test/java/org/apache/commons/bcel6/data/AnnotatedWithCombinedAnnotation.java index a8de8f8f..d2e2d885 100644 --- a/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java +++ b/src/test/java/org/apache/commons/bcel6/data/AnnotatedWithCombinedAnnotation.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; @CombinedAnnotation( { @SimpleAnnotation(id = 4) }) public class AnnotatedWithCombinedAnnotation diff --git a/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java b/src/test/java/org/apache/commons/bcel6/data/AnnotatedWithEnumClass.java similarity index 95% rename from src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java rename to src/test/java/org/apache/commons/bcel6/data/AnnotatedWithEnumClass.java index f238eb4d..8aad494a 100644 --- a/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java +++ b/src/test/java/org/apache/commons/bcel6/data/AnnotatedWithEnumClass.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; @AnnotationEnumElement(enumval = SimpleEnum.Red) public class AnnotatedWithEnumClass diff --git a/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java b/src/test/java/org/apache/commons/bcel6/data/AnnotationEnumElement.java similarity index 96% rename from src/test/java/org/apache/bcel/data/AnnotationEnumElement.java rename to src/test/java/org/apache/commons/bcel6/data/AnnotationEnumElement.java index 6e0863cf..c599259b 100644 --- a/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java +++ b/src/test/java/org/apache/commons/bcel6/data/AnnotationEnumElement.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/test/java/org/apache/bcel/data/AnonymousClassTest.java b/src/test/java/org/apache/commons/bcel6/data/AnonymousClassTest.java similarity index 96% rename from src/test/java/org/apache/bcel/data/AnonymousClassTest.java rename to src/test/java/org/apache/commons/bcel6/data/AnonymousClassTest.java index eabc6cba..09df5dac 100644 --- a/src/test/java/org/apache/bcel/data/AnonymousClassTest.java +++ b/src/test/java/org/apache/commons/bcel6/data/AnonymousClassTest.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; public class AnonymousClassTest { diff --git a/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java b/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java similarity index 96% rename from src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java rename to src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java index ac477efa..3b38fe2b 100644 --- a/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java +++ b/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; public class AttributeTestClassEM01 { diff --git a/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java b/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java similarity index 96% rename from src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java rename to src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java index 8a7a039c..7ade0648 100644 --- a/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java +++ b/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; public class AttributeTestClassEM02 { diff --git a/src/test/java/org/apache/bcel/data/CombinedAnnotation.java b/src/test/java/org/apache/commons/bcel6/data/CombinedAnnotation.java similarity index 96% rename from src/test/java/org/apache/bcel/data/CombinedAnnotation.java rename to src/test/java/org/apache/commons/bcel6/data/CombinedAnnotation.java index cfa41a3c..b6363786 100644 --- a/src/test/java/org/apache/bcel/data/CombinedAnnotation.java +++ b/src/test/java/org/apache/commons/bcel6/data/CombinedAnnotation.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java b/src/test/java/org/apache/commons/bcel6/data/ComplexAnnotatedClass.java similarity index 96% rename from src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java rename to src/test/java/org/apache/commons/bcel6/data/ComplexAnnotatedClass.java index 62eef117..51748c51 100644 --- a/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java +++ b/src/test/java/org/apache/commons/bcel6/data/ComplexAnnotatedClass.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; @ComplexAnnotation(ival = 4, bval = 2, cval = '5', fval = 3.0f, dval = 33.4, zval = false, jval = 56, sval = 99) public class ComplexAnnotatedClass diff --git a/src/test/java/org/apache/bcel/data/ComplexAnnotation.java b/src/test/java/org/apache/commons/bcel6/data/ComplexAnnotation.java similarity index 96% rename from src/test/java/org/apache/bcel/data/ComplexAnnotation.java rename to src/test/java/org/apache/commons/bcel6/data/ComplexAnnotation.java index a35450a3..870e69f0 100644 --- a/src/test/java/org/apache/bcel/data/ComplexAnnotation.java +++ b/src/test/java/org/apache/commons/bcel6/data/ComplexAnnotation.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/test/java/org/apache/bcel/data/MarkedType.java b/src/test/java/org/apache/commons/bcel6/data/MarkedType.java similarity index 95% rename from src/test/java/org/apache/bcel/data/MarkedType.java rename to src/test/java/org/apache/commons/bcel6/data/MarkedType.java index 598338c9..56f97df2 100644 --- a/src/test/java/org/apache/bcel/data/MarkedType.java +++ b/src/test/java/org/apache/commons/bcel6/data/MarkedType.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; @MarkerAnnotationInvisible @MarkerAnnotation diff --git a/src/test/java/org/apache/bcel/data/MarkerAnnotation.java b/src/test/java/org/apache/commons/bcel6/data/MarkerAnnotation.java similarity index 95% rename from src/test/java/org/apache/bcel/data/MarkerAnnotation.java rename to src/test/java/org/apache/commons/bcel6/data/MarkerAnnotation.java index bd61f7e8..5a0a26b3 100644 --- a/src/test/java/org/apache/bcel/data/MarkerAnnotation.java +++ b/src/test/java/org/apache/commons/bcel6/data/MarkerAnnotation.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; import java.lang.annotation.*; diff --git a/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java b/src/test/java/org/apache/commons/bcel6/data/MarkerAnnotationInvisible.java similarity index 95% rename from src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java rename to src/test/java/org/apache/commons/bcel6/data/MarkerAnnotationInvisible.java index 89b8e4b6..0a3c6049 100644 --- a/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java +++ b/src/test/java/org/apache/commons/bcel6/data/MarkerAnnotationInvisible.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; import java.lang.annotation.*; diff --git a/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java b/src/test/java/org/apache/commons/bcel6/data/SimpleAnnotatedClass.java similarity index 95% rename from src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java rename to src/test/java/org/apache/commons/bcel6/data/SimpleAnnotatedClass.java index eff28aad..37831da4 100644 --- a/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java +++ b/src/test/java/org/apache/commons/bcel6/data/SimpleAnnotatedClass.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; @SimpleAnnotation(id = 4) public class SimpleAnnotatedClass diff --git a/src/test/java/org/apache/bcel/data/SimpleAnnotation.java b/src/test/java/org/apache/commons/bcel6/data/SimpleAnnotation.java similarity index 96% rename from src/test/java/org/apache/bcel/data/SimpleAnnotation.java rename to src/test/java/org/apache/commons/bcel6/data/SimpleAnnotation.java index f6f08761..a4cc94a7 100644 --- a/src/test/java/org/apache/bcel/data/SimpleAnnotation.java +++ b/src/test/java/org/apache/commons/bcel6/data/SimpleAnnotation.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; import java.lang.annotation.*; diff --git a/src/test/java/org/apache/bcel/data/SimpleClass.java b/src/test/java/org/apache/commons/bcel6/data/SimpleClass.java similarity index 95% rename from src/test/java/org/apache/bcel/data/SimpleClass.java rename to src/test/java/org/apache/commons/bcel6/data/SimpleClass.java index 34994d39..e7201665 100644 --- a/src/test/java/org/apache/bcel/data/SimpleClass.java +++ b/src/test/java/org/apache/commons/bcel6/data/SimpleClass.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; public class SimpleClass { diff --git a/src/test/java/org/apache/bcel/data/SimpleEnum.java b/src/test/java/org/apache/commons/bcel6/data/SimpleEnum.java similarity index 95% rename from src/test/java/org/apache/bcel/data/SimpleEnum.java rename to src/test/java/org/apache/commons/bcel6/data/SimpleEnum.java index 1db0bbf9..743de36a 100644 --- a/src/test/java/org/apache/bcel/data/SimpleEnum.java +++ b/src/test/java/org/apache/commons/bcel6/data/SimpleEnum.java @@ -16,6 +16,6 @@ * */ -package org.apache.bcel.data; +package org.apache.commons.bcel6.data; public enum SimpleEnum { Red,Orange,Yellow,Green,Blue,Indigo,Violet } diff --git a/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java similarity index 89% rename from src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java rename to src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java index e2c9dcc3..d01fe1b4 100644 --- a/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -25,12 +25,19 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.apache.bcel.AbstractTestCase; -import org.apache.bcel.Constants; -import org.apache.bcel.classfile.Annotations; -import org.apache.bcel.classfile.Attribute; -import org.apache.bcel.classfile.RuntimeInvisibleAnnotations; -import org.apache.bcel.classfile.RuntimeVisibleAnnotations; +import org.apache.commons.bcel6.AbstractTestCase; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.Annotations; +import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.commons.bcel6.classfile.RuntimeInvisibleAnnotations; +import org.apache.commons.bcel6.classfile.RuntimeVisibleAnnotations; +import org.apache.commons.bcel6.generic.AnnotationEntryGen; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.ElementValueGen; +import org.apache.commons.bcel6.generic.ElementValuePairGen; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.SimpleElementValueGen; public class AnnotationGenTestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/bcel/generic/MethodGenTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java similarity index 89% rename from src/test/java/org/apache/bcel/generic/MethodGenTestCase.java rename to src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java index 3e641315..13cc35b3 100644 --- a/src/test/java/org/apache/bcel/generic/MethodGenTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java @@ -15,14 +15,19 @@ * limitations under the License. */ -package org.apache.bcel.generic; +package org.apache.commons.bcel6.generic; import java.util.Arrays; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.LocalVariableGen; +import org.apache.commons.bcel6.generic.MethodGen; + import junit.framework.TestCase; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.Method; public class MethodGenTestCase extends TestCase { diff --git a/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java b/src/test/java/org/apache/commons/bcel6/util/Class2HTMLTestCase.java similarity index 90% rename from src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java rename to src/test/java/org/apache/commons/bcel6/util/Class2HTMLTestCase.java index 008a6b97..c14c76ac 100644 --- a/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/util/Class2HTMLTestCase.java @@ -15,13 +15,15 @@ * limitations under the License. */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.io.File; import java.io.FileInputStream; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.util.Class2HTML; + import junit.framework.TestCase; -import org.apache.bcel.classfile.ClassParser; public class Class2HTMLTestCase extends TestCase { diff --git a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java b/src/test/java/org/apache/commons/bcel6/util/InstructionFinderTest.java similarity index 78% rename from src/test/java/org/apache/bcel/util/InstructionFinderTest.java rename to src/test/java/org/apache/commons/bcel6/util/InstructionFinderTest.java index 76e771b9..3e7c1767 100644 --- a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java +++ b/src/test/java/org/apache/commons/bcel6/util/InstructionFinderTest.java @@ -16,16 +16,17 @@ * */ -package org.apache.bcel.util; +package org.apache.commons.bcel6.util; import java.util.Iterator; -import org.apache.bcel.AbstractTestCase; -import org.apache.bcel.generic.IADD; -import org.apache.bcel.generic.ILOAD; -import org.apache.bcel.generic.ISTORE; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; +import org.apache.commons.bcel6.AbstractTestCase; +import org.apache.commons.bcel6.generic.IADD; +import org.apache.commons.bcel6.generic.ILOAD; +import org.apache.commons.bcel6.generic.ISTORE; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.util.InstructionFinder; public class InstructionFinderTest extends AbstractTestCase { diff --git a/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java b/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java similarity index 88% rename from src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java rename to src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java index da5257bf..e6f0b509 100644 --- a/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java @@ -16,16 +16,19 @@ * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; -import org.apache.bcel.Repository; -import org.apache.bcel.classfile.JavaClass; +import org.apache.commons.bcel6.Repository; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.verifier.VerificationResult; +import org.apache.commons.bcel6.verifier.Verifier; +import org.apache.commons.bcel6.verifier.VerifierFactory; import junit.framework.TestCase; public abstract class AbstractVerifierTestCase extends TestCase { - public static final String TEST_PACKAGE = "org.apache.bcel.verifier.tests."; + public static final String TEST_PACKAGE = "org.apache.commons.bcel6.verifier.tests."; /** * Asserts that the verification of the given class is OK. If it isn't it throws an AssertionFailedError with the given message. diff --git a/src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java b/src/test/java/org/apache/commons/bcel6/verifier/VerifierArrayAccessTestCase.java similarity index 87% rename from src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java rename to src/test/java/org/apache/commons/bcel6/verifier/VerifierArrayAccessTestCase.java index 0c4dd5e3..6afc3f31 100644 --- a/src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/VerifierArrayAccessTestCase.java @@ -16,13 +16,13 @@ * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; import java.io.IOException; -import org.apache.bcel.verifier.tests.TestArrayAccess02Creator; -import org.apache.bcel.verifier.tests.TestArrayAccess03Creator; -import org.apache.bcel.verifier.tests.TestArrayAccess04Creator; +import org.apache.commons.bcel6.verifier.tests.TestArrayAccess02Creator; +import org.apache.commons.bcel6.verifier.tests.TestArrayAccess03Creator; +import org.apache.commons.bcel6.verifier.tests.TestArrayAccess04Creator; public class VerifierArrayAccessTestCase extends AbstractVerifierTestCase { diff --git a/src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java b/src/test/java/org/apache/commons/bcel6/verifier/VerifierInvokeTestCase.java similarity index 97% rename from src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java rename to src/test/java/org/apache/commons/bcel6/verifier/VerifierInvokeTestCase.java index c93a0d47..6a01a902 100644 --- a/src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/VerifierInvokeTestCase.java @@ -16,7 +16,7 @@ * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; public class VerifierInvokeTestCase extends AbstractVerifierTestCase { diff --git a/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java b/src/test/java/org/apache/commons/bcel6/verifier/VerifierReturnTestCase.java similarity index 89% rename from src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java rename to src/test/java/org/apache/commons/bcel6/verifier/VerifierReturnTestCase.java index 78c62a00..dd6554d4 100644 --- a/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/VerifierReturnTestCase.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; import java.io.IOException; -import org.apache.bcel.verifier.tests.TestReturn01Creator; -import org.apache.bcel.verifier.tests.TestReturn03Creator; +import org.apache.commons.bcel6.verifier.tests.TestReturn01Creator; +import org.apache.commons.bcel6.verifier.tests.TestReturn03Creator; public class VerifierReturnTestCase extends AbstractVerifierTestCase { diff --git a/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java b/src/test/java/org/apache/commons/bcel6/verifier/VerifierTestCase.java similarity index 87% rename from src/test/java/org/apache/bcel/verifier/VerifierTestCase.java rename to src/test/java/org/apache/commons/bcel6/verifier/VerifierTestCase.java index cf1451ec..17f8091f 100644 --- a/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/VerifierTestCase.java @@ -16,10 +16,14 @@ * */ -package org.apache.bcel.verifier; +package org.apache.commons.bcel6.verifier; import java.util.Collection; +import org.apache.commons.bcel6.verifier.VerificationResult; +import org.apache.commons.bcel6.verifier.Verifier; +import org.apache.commons.bcel6.verifier.VerifierFactory; + import junit.framework.TestCase; public class VerifierTestCase extends TestCase { diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArray01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java similarity index 96% rename from src/test/java/org/apache/bcel/verifier/tests/TestArray01.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java index 3ae5af7d..8ffc17f7 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestArray01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; import java.io.Serializable; diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess01.java similarity index 95% rename from src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess01.java index 25e2e31d..7815c194 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess01.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; public class TestArrayAccess01 extends XTestArray01{ diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java similarity index 66% rename from src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java index dc75cbcd..2f16f903 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java @@ -15,22 +15,22 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionFactory; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.PUSH; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionFactory; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.PUSH; +import org.apache.commons.bcel6.generic.Type; public class TestArrayAccess02Creator extends TestCreator implements Constants { private InstructionFactory _factory; @@ -38,7 +38,7 @@ public class TestArrayAccess02Creator extends TestCreator implements Constants { private ClassGen _cg; public TestArrayAccess02Creator() { - _cg = new ClassGen("org.apache.bcel.verifier.tests.TestArrayAccess02", "java.lang.Object", "TestArrayAccess02.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", "java.lang.Object", "TestArrayAccess02.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -52,7 +52,7 @@ public class TestArrayAccess02Creator extends TestCreator implements Constants { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.bcel.verifier.tests.TestArrayAccess02", il, _cp); + MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", il, _cp); InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); @@ -65,19 +65,19 @@ public class TestArrayAccess02Creator extends TestCreator implements Constants { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "test", "org.apache.bcel.verifier.tests.TestArrayAccess02", il, _cp); + MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); - il.append(_factory.createNewArray(new ObjectType("org.apache.bcel.verifier.tests.TestArrayAccess02"), (short) 1)); + il.append(_factory.createNewArray(new ObjectType("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02"), (short) 1)); il.append(_factory.createStore(Type.OBJECT, 0)); InstructionHandle ih_5 = il.append(new PUSH(_cp, 1)); il.append(_factory.createNewArray(Type.STRING, (short) 1)); il.append(_factory.createStore(Type.OBJECT, 1)); InstructionHandle ih_10 = il.append(_factory.createLoad(Type.OBJECT, 1)); il.append(new PUSH(_cp, 0)); - il.append(_factory.createNew("org.apache.bcel.verifier.tests.TestArrayAccess02")); + il.append(_factory.createNew("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02")); il.append(InstructionConstants.DUP); - il.append(_factory.createInvoke("org.apache.bcel.verifier.tests.TestArrayAccess02", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(_factory.createInvoke("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); il.append(InstructionConstants.AASTORE); InstructionHandle ih_20 = il.append(_factory.createReturn(Type.VOID)); method.setMaxStack(); diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java similarity index 66% rename from src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java index bb076f9f..02b4caf2 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java @@ -15,22 +15,22 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionFactory; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.ObjectType; -import org.apache.bcel.generic.PUSH; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionFactory; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.commons.bcel6.generic.PUSH; +import org.apache.commons.bcel6.generic.Type; public class TestArrayAccess03Creator extends TestCreator implements Constants { private InstructionFactory _factory; @@ -38,7 +38,7 @@ public class TestArrayAccess03Creator extends TestCreator implements Constants { private ClassGen _cg; public TestArrayAccess03Creator() { - _cg = new ClassGen("org.apache.bcel.verifier.tests.TestArrayAccess03", "java.lang.Object", "TestArrayAccess03.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", "java.lang.Object", "TestArrayAccess03.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -52,7 +52,7 @@ public class TestArrayAccess03Creator extends TestCreator implements Constants { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.bcel.verifier.tests.TestArrayAccess03", il, _cp); + MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", il, _cp); InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); @@ -65,16 +65,16 @@ public class TestArrayAccess03Creator extends TestCreator implements Constants { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.bcel.verifier.tests.TestArrayAccess03", il, _cp); + MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); - il.append(_factory.createNewArray(new ObjectType("org.apache.bcel.verifier.tests.TestArrayAccess03"), (short) 1)); + il.append(_factory.createNewArray(new ObjectType("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03"), (short) 1)); il.append(_factory.createStore(Type.OBJECT, 1)); InstructionHandle ih_5 = il.append(_factory.createLoad(Type.OBJECT, 0)); il.append(new PUSH(_cp, 0)); - il.append(_factory.createNew("org.apache.bcel.verifier.tests.TestArrayAccess03")); + il.append(_factory.createNew("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03")); il.append(InstructionConstants.DUP); - il.append(_factory.createInvoke("org.apache.bcel.verifier.tests.TestArrayAccess03", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(_factory.createInvoke("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); il.append(InstructionConstants.AASTORE); InstructionHandle ih_15 = il.append(_factory.createReturn(Type.VOID)); method.setMaxStack(); diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java similarity index 74% rename from src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java index 90480858..3e89ab62 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java @@ -14,21 +14,21 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */package org.apache.bcel.verifier.tests; + */package org.apache.commons.bcel6.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionFactory; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.PUSH; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionFactory; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.PUSH; +import org.apache.commons.bcel6.generic.Type; public class TestArrayAccess04Creator extends TestCreator implements Constants { private InstructionFactory _factory; @@ -36,7 +36,7 @@ public class TestArrayAccess04Creator extends TestCreator implements Constants { private ClassGen _cg; public TestArrayAccess04Creator() { - _cg = new ClassGen("org.apache.bcel.verifier.tests.TestArrayAccess04", "java.lang.Object", "TestArrayAccess04.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", "java.lang.Object", "TestArrayAccess04.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -50,7 +50,7 @@ public class TestArrayAccess04Creator extends TestCreator implements Constants { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.bcel.verifier.tests.TestArrayAccess04", il, _cp); + MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", il, _cp); InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); @@ -63,7 +63,7 @@ public class TestArrayAccess04Creator extends TestCreator implements Constants { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.bcel.verifier.tests.TestArrayAccess04", il, _cp); + MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); il.append(_factory.createNewArray(Type.OBJECT, (short) 1)); diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestCreator.java similarity index 97% rename from src/test/java/org/apache/bcel/verifier/tests/TestCreator.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestCreator.java index 7e661830..8dc1c925 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestCreator.java @@ -1,4 +1,4 @@ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; import java.io.File; import java.io.FileOutputStream; diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java similarity index 76% rename from src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java index 72ca5606..131eac1c 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java @@ -1,4 +1,4 @@ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; public class TestLegalInvokeInterface01{ diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial01.java similarity index 73% rename from src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial01.java index 25f2d955..5938ed33 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial01.java @@ -1,4 +1,4 @@ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; public class TestLegalInvokeSpecial01{ diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java similarity index 80% rename from src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java index e5f73722..b8321ef5 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java @@ -1,4 +1,4 @@ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; abstract public class TestLegalInvokeSpecial02 implements Runnable{ diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeStatic01.java similarity index 75% rename from src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeStatic01.java index 592f7692..312f021a 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeStatic01.java @@ -1,4 +1,4 @@ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; public class TestLegalInvokeStatic01 extends Thread{ diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual01.java similarity index 73% rename from src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual01.java index 81e23cef..1b1a8228 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual01.java @@ -1,4 +1,4 @@ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; public class TestLegalInvokeVirtual01 { diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java similarity index 80% rename from src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java index a45cba17..fc663e1d 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java @@ -1,4 +1,4 @@ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; abstract public class TestLegalInvokeVirtual02 implements Runnable{ diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java similarity index 72% rename from src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java index a0833bf7..df5feb89 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java @@ -15,20 +15,20 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionFactory; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionFactory; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.Type; public class TestReturn01Creator extends TestCreator implements Constants { private InstructionFactory _factory; @@ -36,7 +36,7 @@ public class TestReturn01Creator extends TestCreator implements Constants { private ClassGen _cg; public TestReturn01Creator() { - _cg = new ClassGen("org.apache.bcel.verifier.tests.TestReturn01", "java.lang.Object", "TestReturn01.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestReturn01", "java.lang.Object", "TestReturn01.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -50,7 +50,7 @@ public class TestReturn01Creator extends TestCreator implements Constants { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.bcel.verifier.tests.TestReturn01", il, _cp); + MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestReturn01", il, _cp); InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); @@ -63,7 +63,7 @@ public class TestReturn01Creator extends TestCreator implements Constants { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "foo", "org.apache.bcel.verifier.tests.TestReturn01", il, _cp); + MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "foo", "org.apache.commons.bcel6.verifier.tests.TestReturn01", il, _cp); InstructionHandle ih_0 = il.append(_factory.createNew("java.lang.Object")); il.append(InstructionConstants.DUP); diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn02.java similarity index 97% rename from src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn02.java index 26b6419a..d6285b0d 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn02.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; public class TestReturn02 { diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java similarity index 70% rename from src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java rename to src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java index 7e0c01ff..f29fcd6f 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java @@ -15,20 +15,20 @@ * limitations under the License. * */ -package org.apache.bcel.verifier.tests; +package org.apache.commons.bcel6.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.bcel.Constants; -import org.apache.bcel.generic.ClassGen; -import org.apache.bcel.generic.ConstantPoolGen; -import org.apache.bcel.generic.InstructionConstants; -import org.apache.bcel.generic.InstructionFactory; -import org.apache.bcel.generic.InstructionHandle; -import org.apache.bcel.generic.InstructionList; -import org.apache.bcel.generic.MethodGen; -import org.apache.bcel.generic.Type; +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.InstructionConstants; +import org.apache.commons.bcel6.generic.InstructionFactory; +import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.Type; public class TestReturn03Creator extends TestCreator implements Constants { private InstructionFactory _factory; @@ -36,7 +36,7 @@ public class TestReturn03Creator extends TestCreator implements Constants { private ClassGen _cg; public TestReturn03Creator() { - _cg = new ClassGen("org.apache.bcel.verifier.tests.TestReturn03", "java.lang.Object", "TestReturn03.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestReturn03", "java.lang.Object", "TestReturn03.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -50,7 +50,7 @@ public class TestReturn03Creator extends TestCreator implements Constants { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.bcel.verifier.tests.TestReturn03", il, _cp); + MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); @@ -63,7 +63,7 @@ public class TestReturn03Creator extends TestCreator implements Constants { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.INT, Type.NO_ARGS, new String[] { }, "test3", "org.apache.bcel.verifier.tests.TestReturn03", il, _cp); + MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.INT, Type.NO_ARGS, new String[] { }, "test3", "org.apache.commons.bcel6.verifier.tests.TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(InstructionConstants.ACONST_NULL); il.append(_factory.createReturn(Type.OBJECT)); diff --git a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java b/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java similarity index 72% rename from src/test/java/org/apache/bcel/visitors/CounterVisitor.java rename to src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java index 10b17787..2f470bfb 100644 --- a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java +++ b/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java @@ -16,52 +16,52 @@ * */ -package org.apache.bcel.visitors; - -import org.apache.bcel.classfile.AnnotationDefault; -import org.apache.bcel.classfile.AnnotationEntry; -import org.apache.bcel.classfile.Annotations; -import org.apache.bcel.classfile.BootstrapMethods; -import org.apache.bcel.classfile.Code; -import org.apache.bcel.classfile.CodeException; -import org.apache.bcel.classfile.ConstantClass; -import org.apache.bcel.classfile.ConstantDouble; -import org.apache.bcel.classfile.ConstantFieldref; -import org.apache.bcel.classfile.ConstantFloat; -import org.apache.bcel.classfile.ConstantInteger; -import org.apache.bcel.classfile.ConstantInterfaceMethodref; -import org.apache.bcel.classfile.ConstantInvokeDynamic; -import org.apache.bcel.classfile.ConstantLong; -import org.apache.bcel.classfile.ConstantMethodref; -import org.apache.bcel.classfile.ConstantNameAndType; -import org.apache.bcel.classfile.ConstantPool; -import org.apache.bcel.classfile.ConstantString; -import org.apache.bcel.classfile.ConstantUtf8; -import org.apache.bcel.classfile.ConstantValue; -import org.apache.bcel.classfile.Deprecated; -import org.apache.bcel.classfile.EnclosingMethod; -import org.apache.bcel.classfile.ExceptionTable; -import org.apache.bcel.classfile.Field; -import org.apache.bcel.classfile.InnerClass; -import org.apache.bcel.classfile.InnerClasses; -import org.apache.bcel.classfile.JavaClass; -import org.apache.bcel.classfile.LineNumber; -import org.apache.bcel.classfile.LineNumberTable; -import org.apache.bcel.classfile.LocalVariable; -import org.apache.bcel.classfile.LocalVariableTable; -import org.apache.bcel.classfile.LocalVariableTypeTable; -import org.apache.bcel.classfile.Method; -import org.apache.bcel.classfile.MethodParameters; -import org.apache.bcel.classfile.ParameterAnnotations; -import org.apache.bcel.classfile.Signature; -import org.apache.bcel.classfile.SourceFile; -import org.apache.bcel.classfile.StackMap; -import org.apache.bcel.classfile.StackMapEntry; -import org.apache.bcel.classfile.StackMapTable; -import org.apache.bcel.classfile.StackMapTableEntry; -import org.apache.bcel.classfile.Synthetic; -import org.apache.bcel.classfile.Unknown; -import org.apache.bcel.classfile.Visitor; +package org.apache.commons.bcel6.visitors; + +import org.apache.commons.bcel6.classfile.AnnotationDefault; +import org.apache.commons.bcel6.classfile.AnnotationEntry; +import org.apache.commons.bcel6.classfile.Annotations; +import org.apache.commons.bcel6.classfile.BootstrapMethods; +import org.apache.commons.bcel6.classfile.Code; +import org.apache.commons.bcel6.classfile.CodeException; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantDouble; +import org.apache.commons.bcel6.classfile.ConstantFieldref; +import org.apache.commons.bcel6.classfile.ConstantFloat; +import org.apache.commons.bcel6.classfile.ConstantInteger; +import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; +import org.apache.commons.bcel6.classfile.ConstantInvokeDynamic; +import org.apache.commons.bcel6.classfile.ConstantLong; +import org.apache.commons.bcel6.classfile.ConstantMethodref; +import org.apache.commons.bcel6.classfile.ConstantNameAndType; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantString; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.ConstantValue; +import org.apache.commons.bcel6.classfile.Deprecated; +import org.apache.commons.bcel6.classfile.EnclosingMethod; +import org.apache.commons.bcel6.classfile.ExceptionTable; +import org.apache.commons.bcel6.classfile.Field; +import org.apache.commons.bcel6.classfile.InnerClass; +import org.apache.commons.bcel6.classfile.InnerClasses; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.LineNumber; +import org.apache.commons.bcel6.classfile.LineNumberTable; +import org.apache.commons.bcel6.classfile.LocalVariable; +import org.apache.commons.bcel6.classfile.LocalVariableTable; +import org.apache.commons.bcel6.classfile.LocalVariableTypeTable; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.classfile.MethodParameters; +import org.apache.commons.bcel6.classfile.ParameterAnnotations; +import org.apache.commons.bcel6.classfile.Signature; +import org.apache.commons.bcel6.classfile.SourceFile; +import org.apache.commons.bcel6.classfile.StackMap; +import org.apache.commons.bcel6.classfile.StackMapEntry; +import org.apache.commons.bcel6.classfile.StackMapTable; +import org.apache.commons.bcel6.classfile.StackMapTableEntry; +import org.apache.commons.bcel6.classfile.Synthetic; +import org.apache.commons.bcel6.classfile.Unknown; +import org.apache.commons.bcel6.classfile.Visitor; public class CounterVisitor implements Visitor { -- GitLab From 00196e4c7d6cafcf7ff94aa6d2e068dde5b6e36f Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Sun, 9 Aug 2015 22:24:59 +0000 Subject: [PATCH 0758/1313] BCEL-222: changes.xml git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1694924 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index e1d7c6ec..eabfb47c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,9 @@ The type attribute can be add,update,fix,remove. + + Major release of BCEL requires updating package name and maven coordinates. + Make org.apache.bcel.classfile.ConstantPool.ConstantPool(DataInput) public. -- GitLab From 2cca11a3e3ad5cc142c5e078934d10b26050ecd4 Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Sun, 9 Aug 2015 23:19:38 +0000 Subject: [PATCH 0759/1313] BCEL add link for SVN latest javadoc git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1694926 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/site.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/site/site.xml b/src/site/site.xml index 8f77bfbe..f343307f 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -36,7 +36,8 @@ - + + -- GitLab From 785662da492acfdf4e7bc4155d1e003b6f0e6f9b Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Sun, 9 Aug 2015 23:20:25 +0000 Subject: [PATCH 0760/1313] BCEL add src and bin assemblies git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1694927 13f79535-47bb-0310-9956-ffa450edef68 --- src/assembly/bin.xml | 45 ++++++++++++++++++++++++++++++++++++++++++++ src/assembly/src.xml | 40 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 src/assembly/bin.xml create mode 100644 src/assembly/src.xml diff --git a/src/assembly/bin.xml b/src/assembly/bin.xml new file mode 100644 index 00000000..a58c2e57 --- /dev/null +++ b/src/assembly/bin.xml @@ -0,0 +1,45 @@ + + + bin + + tar.gz + zip + + false + + + + LICENSE.txt + NOTICE.txt + README.txt + RELEASE-NOTES.txt + + + + target + + + *.jar + + + + target/site/apidocs + apidocs + + + diff --git a/src/assembly/src.xml b/src/assembly/src.xml new file mode 100644 index 00000000..0c216ecd --- /dev/null +++ b/src/assembly/src.xml @@ -0,0 +1,40 @@ + + + src + + tar.gz + zip + + ${project.artifactId}-${commons.release.version}-src + + + + checkstyle.xml + LICENSE.txt + NOTICE.txt + pmd.xml + pom.xml + README.txt + RELEASE-NOTES.txt + + + + src + + + -- GitLab From 21ddc87b0ac689e25d521d96e5ddb7ae204443ef Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Sun, 9 Aug 2015 23:35:20 +0000 Subject: [PATCH 0761/1313] Update BCEL 6.0 release notes git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1694931 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 205 +++++++++++++++++++++++++++++----------------- 1 file changed, 129 insertions(+), 76 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index d620ecfa..e5838a9a 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,6 +1,6 @@ Apache Commons BCEL 6.0 RELEASE NOTES -The Apache Commons team is pleased to announce the release of BCEL 6.0! +The Apache Commons BCEL team is pleased to announce the commons-bcel6-6.0 release! The Byte Code Engineering Library (BCEL) is intended to give users a convenient way to analyze, create, and manipulate compiled .class files. Classes are @@ -34,81 +34,134 @@ Semantic compatible - Yes, except: the AttributeReader will no longer be called in these cases. -Enhancements from 5.2 ---------------------- - -[BCEL-76] Add parent type processing for ClassPath class. -[BCEL-83] Add support for getResource and getResourceAsStream to ClassPath -[BCEL-92] Properly parse StackMapTable attributes in Java 6 classfiles -[BCEL-104] Javadoc overhaul -[BCEL-119] BCEL is unnecessarily slow -[BCEL-157] Add support for INVOKEDYNAMIC and MethodHandles -[BCEL-160] Why using unstable sort at MethodGen.getLocalVariables() ? -[BCEL-163] Incorporate patch file from Findbugs -[BCEL-175] Implement the MethodParameters attribute - - -Bug fixes from 5.2 ------------------- - -[BCEL-28] Mistake in "Peephole optimizer" example at http://commons.apache.org/bcel/manual.html -[BCEL-74] BCEL cannot be used as java.system.class.loader -[BCEL-77] XSLT transforms broken in Turkish Locale. -[BCEL-79] java.lang.ClassFormatError: LVTT entry for 'local' in class file org/shiftone/jrat/test/dummy/CrashTestDummy does not match any LVT entry -[BCEL-81] ClassParser.parse() throws NullPointerException if class does not exist and ClassParser(String) constructor is used -[BCEL-85] ArrayOutOfBoundsException in InstructionFinder -[BCEL-87] Website: Incorrect URL for source; version 5.2 is not in the bug page -[BCEL-88] bcelified method doesn't pass verification -[BCEL-89] return type not verified by JustIce -[BCEL-94] @since tag incorrect for Annotation classes in BCEL trunk -[BCEL-95] InstructionFactory missing % operator for Float, Double -[BCEL-96] Fields in Annotations and AnnotationEntry are inaccessible to subclasses -[BCEL-97] Add support for getResources to ClassPath -[BCEL-98] Two source files in repository are empty -[BCEL-99] Maven POM file calls in apache regex but code does not use it -[BCEL-100] ClassParser throws unintelligible Exception -[BCEL-101] verifier raises ....AssertionViolatedException when done against Java5 files with generics/annotations -[BCEL-102] Verifier fails in pass 2 with "Number of LocalVariableTable attributes of Code attribute" on static methods. -[BCEL-107] ParameterAnnotationEntries are read not dumped -[BCEL-108] RuntimeVisible Annotations duplicated -[BCEL-112] ARRAYLENGTH incorrectly not StackConsumer -[BCEL-114] Error in method search() defined in org.apache.bcel.util.InstructionFinder -[BCEL-115] Deleting all instructions of a list shows wrong behaviour -[BCEL-120] Make BCEL JAR OSGi compatible -[BCEL-122] ArrayIndexOutOfBoundsException thrown from TABLESWITCH.initFromFile -[BCEL-124] tableswitch/lookupswitch invalid alignment of 4-byte operands -[BCEL-125] Incorrect size calculation in InstructionFinder -[BCEL-130] Class files containing "ParameterAnnotations" are dumped incorrectly -[BCEL-131] Class files containing "StackMapTable" attributes (on method code) are dumped incorrectly -[BCEL-132] org.apache.bcel.classfile.ClassParser: NullPointerException caused by fileopen failed -[BCEL-133] org.apache.bcel.classfile.ClassParser: NullPointerException caused by invalid filename -[BCEL-134] ExecutionVisitor doesn't support Class constant type for LDC and LDC_W -[BCEL-135] BCELifier issue: BCELFactory fails to handle float and long constants -[BCEL-137] "Invalid method signature: TT;" when using MethodGen for a method having a generic parameter -[BCEL-138] FieldInstruction.getFieldSize() doesn't decode Type.getTypeSize() output -[BCEL-140] org.apache.bcel.generic.Instruction.equals(Object) does not follow Object.equals(Object) rules -[BCEL-141] Select instructions should implement StackConsumer instead of StackProducer -[BCEL-143] Fix CPL License issues with EnclosingMethod.java and LocalVariableTypeTable.java -[BCEL-145] Type.getReturnTypeSize() doesn't decode Type.getTypeSize() output -[BCEL-146] SyntheticRepository.loadClass() fails to close the inputStream -[BCEL-148] BCELifier produces incorrect code for methods containing loads of class literals from constant pool -[BCEL-151] Code attribute size not updated -[BCEL-152] Incorrect link for Jasmin assembler language -[BCEL-153] Examples not present in source or binary downloads -[BCEL-154] ClassParser.parse() generates NPE if it cannot open the file -[BCEL-155] InstConstraintVisitor does not handle class constants -[BCEL-156] Pass3bVerifier crashes on empty methods -[BCEL-159] LocalVariableGen.getLocalVariable() computes incorrect length -[BCEL-164] Method does not have a method to access parameter annotations -[BCEL-167] ClassPath.getResource does not correctly perform URL escaping -[BCEL-173] ClassParser fails to parse JDK classes in Java 8: ClassFormatException: Invalid byte tag in constant pool -[BCEL-174] Verification of interfaces with default methods fails with Java 8 -[BCEL-177] MethodParameters should read 1 byte not two for parameter count -[BCEL-181] ClassLoaderRepository.loadClass(String) leaks input streams -[BCEL-184] JustIce verifier does not check correctly the returned value of a method -[BCEL-194] LocalVariableGen hashCode() function is incorrrect -[BCEL-197] Add support for TypeVariables to Utility.signatureToString() -[BCEL-207] MethodGen.removeLocalVariable(s) doesn't remove the associated Targetters +------------------------------------------------------------------------------- +Changes in this version include: + + +Fixed Bugs: +o Bug fixes and improvements to InvokeDynamic and BootStrapMethods implementation. + Issue: BCEL-209. Thanks to Mark Roberts. +o Verification error when an invoke references a method defined in superclass. + Issue: BCEL-187. Thanks to Jérôme Leroux. +o Remove ObjectType cache. Issue: BCEL-218. Thanks to chas. +o The verifier now checks if methods with a void return type attempt to return an + object. Issue: BCEL-184. Thanks to Jérôme Leroux. +o The verifier now checks if methods with a void return type attempt to return an + object. Issue: BCEL-184. Thanks to Jérôme Leroux. +o MethodGen.removeLocalVariable now properly unreference the removed variable + from the targetters of the instruction handlers delimiting the scope of + the variable. Issue: BCEL-207. Thanks to Mark Roberts. +o Utility.signatureToString() no longer throws a ClassFormatException on TypeVariables + found in generic signatures. Issue: BCEL-197. Thanks to Mark Roberts. +o Removed the 'index' variable from the LocalVariableGen's hash code. + Issue: BCEL-194. Thanks to Mark Roberts. +o The verifier should not check for run time compatibility of objects assigned to + arrays. Issue: BCEL-193. Thanks to Jérôme Leroux. +o Correct verification of the return value of a method. Issue: BCEL-188. Thanks + to Jérôme Leroux. +o Performance degradation with the UTF8 cache. getInstance no longer uses cache + Issue: BCEL-186. +o org.apache.bcel.util.ClassLoaderRepository.loadClass(String) leaks input streams. + Issue: BCEL-181. +o Mistake in "Peephole optimizer" example at http://commons.apache.org/bcel/manual.html + Issue: BCEL-28. +o BCEL cannot be used as java.system.class.loader Issue: BCEL-74. +o XSLT transforms broken in Turkish Locale. Issue: BCEL-77. +o java.lang.ClassFormatError: LVTT entry for 'local' in class file + org/shiftone/jrat/test/dummy/CrashTestDummy does not match any LVT entry + Issue: BCEL-79. +o ClassParser.parse() throws NullPointerException if class does not exist and + ClassParser(String) constructor is used Issue: BCEL-81. +o ArrayOutOfBoundsException in InstructionFinder Issue: BCEL-85. +o Website: Incorrect URL for source; version 5.2 is not in the bug page + Issue: BCEL-87. +o bcelified method doesn't pass verification Issue: BCEL-88. +o return type not verified by JustIce Issue: BCEL-89. +o @since tag incorrect for Annotation classes in BCEL trunk Issue: BCEL-94. +o InstructionFactory missing % operator for Float, Double Issue: BCEL-95. +o Fields in Annotations and AnnotationEntry are inaccessible to subclasses + Issue: BCEL-96. +o Add support for getResources to ClassPath Issue: BCEL-97. +o Two source files in repository are empty Issue: BCEL-98. +o Maven POM file calls in apache regex but code does not use it Issue: BCEL-99. +o ClassParser throws unintelligible Exception Issue: BCEL-100. +o verifier raises an AssertionViolatedException when done against Java 5 files + with generics/annotations Issue: BCEL-101. +o Verifier fails in pass 2 with "Number of LocalVariableTable attributes of + Code attribute" on static methods. Issue: BCEL-102. +o ParameterAnnotationEntries are read not dumped Issue: BCEL-107. +o RuntimeVisible Annotations duplicated Issue: BCEL-108. +o ARRAYLENGTH incorrectly not StackConsumer Issue: BCEL-112. +o Error in method search() defined in org.apache.bcel.util.InstructionFinder + Issue: BCEL-114. +o Deleting all instructions of a list shows wrong behaviour Issue: BCEL-115. +o Make BCEL JAR OSGi compatible Issue: BCEL-120. +o ArrayIndexOutOfBoundsException thrown from TABLESWITCH.initFromFile + Issue: BCEL-122. +o tableswitch/lookupswitch invalid alignment of 4-byte operands Issue: BCEL-124. +o Incorrect size calculation in InstructionFinder Issue: BCEL-125. +o Class files containing "ParameterAnnotations" are dumped incorrectly + Issue: BCEL-130. +o Class files containing "StackMapTable" attributes (on method code) are dumped + incorrectly Issue: BCEL-131. +o org.apache.bcel.classfile.ClassParser: NullPointerException caused by fileopen + failed Issue: BCEL-132. +o org.apache.bcel.classfile.ClassParser: NullPointerException caused by invalid + filename Issue: BCEL-133. +o ExecutionVisitor doesn't support Class constant type for LDC and LDC_W + Issue: BCEL-134. +o BCELifier issue: BCELFactory fails to handle float and long constants. + Issue: BCEL-135. +o "Invalid method signature: TT;" when using MethodGen for a method having a + generic parameter Issue: BCEL-137. +o FieldInstruction.getFieldSize() doesn't decode Type.getTypeSize() output. + Issue: BCEL-138. +o org.apache.bcel.generic.Instruction.equals(Object) does not follow + Object.equals(Object) rules Issue: BCEL-140. +o Select instructions should implement StackConsumer instead of StackProducer + Issue: BCEL-141. +o Fix CPL License issues with EnclosingMethod.java and + LocalVariableTypeTable.java Issue: BCEL-143. +o Type.getReturnTypeSize() doesn't decode Type.getTypeSize() output. + Issue: BCEL-145. +o SyntheticRepository.loadClass() fails to close the inputStream. + Issue: BCEL-146. +o BCELifier produces incorrect code for methods containing loads of class + literals from constant pool Issue: BCEL-148. +o Code attribute size not updated Issue: BCEL-151. +o Incorrect link for Jasmin assembler language Issue: BCEL-152. +o Examples not present in source or binary downloads Issue: BCEL-153. +o ClassParser.parse() generates NPE if it cannot open the file Issue: BCEL-154. +o InstConstraintVisitor does not handle class constants Issue: BCEL-155. +o Pass3bVerifier crashes on empty methods Issue: BCEL-156. +o LocalVariableGen.getLocalVariable() computes incorrect length Issue: BCEL-159. +o Method does not have a method to access parameter annotations Issue: BCEL-164. +o ClassPath.getResource does not correctly perform URL escaping Issue: BCEL-167. +o ClassParser fails to parse JDK classes in Java 8: ClassFormatException: Invalid + byte tag in constant pool Issue: BCEL-173. +o Verification of interfaces with default methods fails with Java 8 + Issue: BCEL-174. +o When reading the number of parameters in a MethodParameters structure + only read a single byte as per the JVM specification. Issue: BCEL-177. + +Changes: +o Major release of BCEL requires updating package name and maven coordinates. + Issue: BCEL-222. +o Make org.apache.bcel.classfile.ConstantPool.ConstantPool(DataInput) public. + Issue: BCEL-219. Thanks to Maxim Degtyarev. +o Add parent type processing for ClassPath class. Issue: BCEL-76. +o Add support for getResource and getResourceAsStream to ClassPath Issue: BCEL-83. +o Properly parse StackMapTable attributes in Java 6 classfiles Issue: BCEL-92. +o Javadoc overhaul Issue: BCEL-104. +o BCEL is unnecessarily slow Issue: BCEL-119. +o Add support for INVOKEDYNAMIC and MethodHandles Issue: BCEL-157. +o Why using unstable sort at MethodGen.getLocalVariables() ? Issue: BCEL-160. +o Incorporate patch file from Findbugs Issue: BCEL-163. +o Implement the MethodParameters attribute Issue: BCEL-175. + + +Have fun! +-Apache Commons BCEL team Feedback -------- -- GitLab From 5c44e78855308979d07359e65cf7e87a84bf4275 Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Sun, 9 Aug 2015 23:37:02 +0000 Subject: [PATCH 0762/1313] Update BCEL 6.0 copyright year git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1694933 13f79535-47bb-0310-9956-ffa450edef68 --- NOTICE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NOTICE.txt b/NOTICE.txt index 4ec1f05a..d72d03a3 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,5 +1,5 @@ Apache Commons BCEL -Copyright 2004-2014 The Apache Software Foundation +Copyright 2004-2015 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). -- GitLab From a2963957bb804c2885e381c064fa196e241f67e6 Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Sun, 9 Aug 2015 23:40:13 +0000 Subject: [PATCH 0763/1313] Update BCEL download page git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1694934 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/download_bcel.xml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/site/xdoc/download_bcel.xml b/src/site/xdoc/download_bcel.xml index 3594155b..c9f9f506 100644 --- a/src/site/xdoc/download_bcel.xml +++ b/src/site/xdoc/download_bcel.xml @@ -95,32 +95,32 @@ limitations under the License.

    -
    +
    - - - + + + - - - + + +
    bcel-6.0-bin.tar.gzmd5pgpcommons-bcel6-6.0-bin.tar.gzmd5pgp
    bcel-6.0-bin.zipmd5pgpcommons-bcel6-6.0-bin.zipmd5pgp
    - - - + + + - - - + + +
    bcel-6.0-src.tar.gzmd5pgpcommons-bcel6-6.0-src.tar.gzmd5pgp
    bcel-6.0-src.zipmd5pgpcommons-bcel6-6.0-src.zipmd5pgp
    -- GitLab From 7d39e209268a040cae3f8450ec449d7dd0d799e2 Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Mon, 10 Aug 2015 00:10:55 +0000 Subject: [PATCH 0764/1313] [maven-release-plugin] prepare release BCEL_6_0_RC4 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1694937 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index aa47d325..4237b006 100644 --- a/pom.xml +++ b/pom.xml @@ -17,8 +17,7 @@ * specific language governing permissions and limitations * under the License. --> - + 4.0.0 @@ -31,7 +30,7 @@ org.apache.commons commons-bcel6 jar - 6.0-SNAPSHOT + 6.0 Apache Commons BCEL Apache Commons Bytecode Engineering Library @@ -171,9 +170,9 @@ - scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk - scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk - http://svn.apache.org/repos/asf/commons/proper/bcel/trunk + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/tags/BCEL_6_0_RC4 + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/tags/BCEL_6_0_RC4 + http://svn.apache.org/repos/asf/commons/proper/bcel/tags/BCEL_6_0_RC4 @@ -437,7 +436,7 @@ java -classpath - + org.openjdk.jmh.Main -rf json -- GitLab From bc18ac5cf08708e52b7a6faf13b01a5fd0d63f3f Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Mon, 10 Aug 2015 00:23:11 +0000 Subject: [PATCH 0765/1313] Update BCL pom for next snapshot release (release:prepare failed to update) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1694941 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4237b006..fdd410b9 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ org.apache.commons commons-bcel6 jar - 6.0 + 6.1-SNAPSHOT Apache Commons BCEL Apache Commons Bytecode Engineering Library -- GitLab From 03ed1fad025d970bf6f8f8b8715eec87a3a0274a Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 10:11:40 +0000 Subject: [PATCH 0766/1313] Unused git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695009 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/generic/ClassGen.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index 917bc4c3..e18a1a8d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.classfile.Method; import org.apache.commons.bcel6.classfile.RuntimeInvisibleAnnotations; import org.apache.commons.bcel6.classfile.RuntimeVisibleAnnotations; import org.apache.commons.bcel6.classfile.SourceFile; -import org.apache.commons.bcel6.classfile.Utility; import org.apache.commons.bcel6.util.BCELComparator; /** -- GitLab From c8fc9d6e4930f31e8765f0a4552ff96ec2b914cb Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 10:24:04 +0000 Subject: [PATCH 0767/1313] Raw type git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695010 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/generic/MethodGenTestCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java index 13cc35b3..5bc81508 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java @@ -37,7 +37,7 @@ public class MethodGenTestCase extends TestCase { } } - private MethodGen getMethod(Class cls, String name) throws ClassNotFoundException { + private MethodGen getMethod(Class cls, String name) throws ClassNotFoundException { JavaClass jc = Repository.lookupClass(cls); ConstantPoolGen cp = new ConstantPoolGen(jc.getConstantPool()); for (Method method : jc.getMethods()) { -- GitLab From 9d6b5d3d2eccbeaa39eedc42d49cad4b49aa4d2a Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 10:26:46 +0000 Subject: [PATCH 0768/1313] Use static reference to static methods git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695011 13f79535-47bb-0310-9956-ffa450edef68 --- .../verifier/tests/TestArrayAccess02Creator.java | 12 ++++++------ .../verifier/tests/TestArrayAccess03Creator.java | 10 +++++----- .../verifier/tests/TestArrayAccess04Creator.java | 14 +++++++------- .../bcel6/verifier/tests/TestReturn01Creator.java | 6 +++--- .../bcel6/verifier/tests/TestReturn03Creator.java | 6 +++--- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java index 2f16f903..b1fc610a 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java @@ -54,9 +54,9 @@ public class TestArrayAccess02Creator extends TestCreator implements Constants { InstructionList il = new InstructionList(); MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", il, _cp); - InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); + InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); - InstructionHandle ih_4 = il.append(_factory.createReturn(Type.VOID)); + InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); @@ -69,17 +69,17 @@ public class TestArrayAccess02Creator extends TestCreator implements Constants { InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); il.append(_factory.createNewArray(new ObjectType("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02"), (short) 1)); - il.append(_factory.createStore(Type.OBJECT, 0)); + il.append(InstructionFactory.createStore(Type.OBJECT, 0)); InstructionHandle ih_5 = il.append(new PUSH(_cp, 1)); il.append(_factory.createNewArray(Type.STRING, (short) 1)); - il.append(_factory.createStore(Type.OBJECT, 1)); - InstructionHandle ih_10 = il.append(_factory.createLoad(Type.OBJECT, 1)); + il.append(InstructionFactory.createStore(Type.OBJECT, 1)); + InstructionHandle ih_10 = il.append(InstructionFactory.createLoad(Type.OBJECT, 1)); il.append(new PUSH(_cp, 0)); il.append(_factory.createNew("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02")); il.append(InstructionConstants.DUP); il.append(_factory.createInvoke("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); il.append(InstructionConstants.AASTORE); - InstructionHandle ih_20 = il.append(_factory.createReturn(Type.VOID)); + InstructionHandle ih_20 = il.append(InstructionFactory.createReturn(Type.VOID)); method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java index 02b4caf2..5ceee54f 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java @@ -54,9 +54,9 @@ public class TestArrayAccess03Creator extends TestCreator implements Constants { InstructionList il = new InstructionList(); MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", il, _cp); - InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); + InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); - InstructionHandle ih_4 = il.append(_factory.createReturn(Type.VOID)); + InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); @@ -69,14 +69,14 @@ public class TestArrayAccess03Creator extends TestCreator implements Constants { InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); il.append(_factory.createNewArray(new ObjectType("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03"), (short) 1)); - il.append(_factory.createStore(Type.OBJECT, 1)); - InstructionHandle ih_5 = il.append(_factory.createLoad(Type.OBJECT, 0)); + il.append(InstructionFactory.createStore(Type.OBJECT, 1)); + InstructionHandle ih_5 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); il.append(new PUSH(_cp, 0)); il.append(_factory.createNew("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03")); il.append(InstructionConstants.DUP); il.append(_factory.createInvoke("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); il.append(InstructionConstants.AASTORE); - InstructionHandle ih_15 = il.append(_factory.createReturn(Type.VOID)); + InstructionHandle ih_15 = il.append(InstructionFactory.createReturn(Type.VOID)); method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java index 3e89ab62..947fb165 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java @@ -52,9 +52,9 @@ public class TestArrayAccess04Creator extends TestCreator implements Constants { InstructionList il = new InstructionList(); MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", il, _cp); - InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); + InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); - InstructionHandle ih_4 = il.append(_factory.createReturn(Type.VOID)); + InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); @@ -67,14 +67,14 @@ public class TestArrayAccess04Creator extends TestCreator implements Constants { InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); il.append(_factory.createNewArray(Type.OBJECT, (short) 1)); - il.append(_factory.createStore(Type.OBJECT, 1)); + il.append(InstructionFactory.createStore(Type.OBJECT, 1)); InstructionHandle ih_5 = il.append(new PUSH(_cp, 1)); - il.append(_factory.createStore(Type.INT, 2)); - InstructionHandle ih_7 = il.append(_factory.createLoad(Type.OBJECT, 1)); + il.append(InstructionFactory.createStore(Type.INT, 2)); + InstructionHandle ih_7 = il.append(InstructionFactory.createLoad(Type.OBJECT, 1)); il.append(new PUSH(_cp, 0)); - il.append(_factory.createLoad(Type.INT, 2)); + il.append(InstructionFactory.createLoad(Type.INT, 2)); il.append(InstructionConstants.AASTORE); - InstructionHandle ih_11 = il.append(_factory.createReturn(Type.VOID)); + InstructionHandle ih_11 = il.append(InstructionFactory.createReturn(Type.VOID)); method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java index df5feb89..3e22879c 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java @@ -52,9 +52,9 @@ public class TestReturn01Creator extends TestCreator implements Constants { InstructionList il = new InstructionList(); MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestReturn01", il, _cp); - InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); + InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); - InstructionHandle ih_4 = il.append(_factory.createReturn(Type.VOID)); + InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); @@ -69,7 +69,7 @@ public class TestReturn01Creator extends TestCreator implements Constants { il.append(InstructionConstants.DUP); il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); il.append(InstructionConstants.NOP); - InstructionHandle ih_8 = il.append(_factory.createReturn(Type.OBJECT)); + InstructionHandle ih_8 = il.append(InstructionFactory.createReturn(Type.OBJECT)); method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java index f29fcd6f..23ccea73 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java @@ -52,9 +52,9 @@ public class TestReturn03Creator extends TestCreator implements Constants { InstructionList il = new InstructionList(); MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestReturn03", il, _cp); - InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0)); + InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); - InstructionHandle ih_4 = il.append(_factory.createReturn(Type.VOID)); + InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); @@ -66,7 +66,7 @@ public class TestReturn03Creator extends TestCreator implements Constants { MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.INT, Type.NO_ARGS, new String[] { }, "test3", "org.apache.commons.bcel6.verifier.tests.TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(InstructionConstants.ACONST_NULL); - il.append(_factory.createReturn(Type.OBJECT)); + il.append(InstructionFactory.createReturn(Type.OBJECT)); method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); -- GitLab From 834e49f7ea20975ff955a581f6499f4c73a4cc49 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 10:33:54 +0000 Subject: [PATCH 0769/1313] Unused variable git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695012 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/verifier/statics/Pass3aVerifier.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java index 14936cfd..22e4803d 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java @@ -1140,7 +1140,6 @@ public final class Pass3aVerifier extends PassVerifier{ */ private Method getMethod(JavaClass jc, InvokeInstruction invoke){ Method[] ms = jc.getMethods(); - Method m = null; for (Method element : ms) { if ( (element.getName().equals(invoke.getMethodName(cpg))) && (Type.getReturnType(element.getSignature()).equals(invoke.getReturnType(cpg))) && -- GitLab From c3c9015a44b5657ffb5143cd0c27ae1ce998e78d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 10:36:56 +0000 Subject: [PATCH 0770/1313] Avoid unchecked warning git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695013 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/verifier/structurals/OperandStack.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java index 8f3ee21a..157b1bc1 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java @@ -65,7 +65,9 @@ public class OperandStack{ @Override protected Object clone(){ OperandStack newstack = new OperandStack(this.maxStack); - newstack.stack = (ArrayList) this.stack.clone(); + @SuppressWarnings("unchecked") // OK because this.stack is the same type + final ArrayList clone = (ArrayList) this.stack.clone(); + newstack.stack = clone; return newstack; } -- GitLab From c8ef82cca5ff5043456cdb451ad0a5d4b0e9af42 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 10:40:03 +0000 Subject: [PATCH 0771/1313] Avoide unused variable warnings git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695014 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/verifier/tests/TestArrayAccess02Creator.java | 7 +++++++ .../bcel6/verifier/tests/TestArrayAccess03Creator.java | 6 ++++++ .../bcel6/verifier/tests/TestArrayAccess04Creator.java | 7 +++++++ .../commons/bcel6/verifier/tests/TestReturn01Creator.java | 5 +++++ .../commons/bcel6/verifier/tests/TestReturn03Creator.java | 4 ++++ 5 files changed, 29 insertions(+) diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java index b1fc610a..23a16b4a 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java @@ -31,6 +31,7 @@ import org.apache.commons.bcel6.generic.MethodGen; import org.apache.commons.bcel6.generic.ObjectType; import org.apache.commons.bcel6.generic.PUSH; import org.apache.commons.bcel6.generic.Type; +import org.junit.Assert; public class TestArrayAccess02Creator extends TestCreator implements Constants { private InstructionFactory _factory; @@ -55,8 +56,10 @@ public class TestArrayAccess02Creator extends TestCreator implements Constants { MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); + Assert.assertNotNull(ih_0); // TODO why is this not used il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); + Assert.assertNotNull(ih_4); // TODO why is this not used method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); @@ -68,18 +71,22 @@ public class TestArrayAccess02Creator extends TestCreator implements Constants { MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); + Assert.assertNotNull(ih_0); // TODO why is this not used il.append(_factory.createNewArray(new ObjectType("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02"), (short) 1)); il.append(InstructionFactory.createStore(Type.OBJECT, 0)); InstructionHandle ih_5 = il.append(new PUSH(_cp, 1)); + Assert.assertNotNull(ih_5); // TODO why is this not used il.append(_factory.createNewArray(Type.STRING, (short) 1)); il.append(InstructionFactory.createStore(Type.OBJECT, 1)); InstructionHandle ih_10 = il.append(InstructionFactory.createLoad(Type.OBJECT, 1)); + Assert.assertNotNull(ih_10); // TODO why is this not used il.append(new PUSH(_cp, 0)); il.append(_factory.createNew("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02")); il.append(InstructionConstants.DUP); il.append(_factory.createInvoke("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); il.append(InstructionConstants.AASTORE); InstructionHandle ih_20 = il.append(InstructionFactory.createReturn(Type.VOID)); + Assert.assertNotNull(ih_20); // TODO why is this not used method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java index 5ceee54f..16cdabc4 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java @@ -31,6 +31,7 @@ import org.apache.commons.bcel6.generic.MethodGen; import org.apache.commons.bcel6.generic.ObjectType; import org.apache.commons.bcel6.generic.PUSH; import org.apache.commons.bcel6.generic.Type; +import org.junit.Assert; public class TestArrayAccess03Creator extends TestCreator implements Constants { private InstructionFactory _factory; @@ -55,8 +56,10 @@ public class TestArrayAccess03Creator extends TestCreator implements Constants { MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); + Assert.assertNotNull(ih_0); // TODO why is this not used il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); + Assert.assertNotNull(ih_4); // TODO why is this not used method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); @@ -68,15 +71,18 @@ public class TestArrayAccess03Creator extends TestCreator implements Constants { MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); + Assert.assertNotNull(ih_0); // TODO why is this not used il.append(_factory.createNewArray(new ObjectType("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03"), (short) 1)); il.append(InstructionFactory.createStore(Type.OBJECT, 1)); InstructionHandle ih_5 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); + Assert.assertNotNull(ih_5); // TODO why is this not used il.append(new PUSH(_cp, 0)); il.append(_factory.createNew("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03")); il.append(InstructionConstants.DUP); il.append(_factory.createInvoke("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); il.append(InstructionConstants.AASTORE); InstructionHandle ih_15 = il.append(InstructionFactory.createReturn(Type.VOID)); + Assert.assertNotNull(ih_15); // TODO why is this not used method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java index 947fb165..b94f1c98 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java @@ -29,6 +29,7 @@ import org.apache.commons.bcel6.generic.InstructionList; import org.apache.commons.bcel6.generic.MethodGen; import org.apache.commons.bcel6.generic.PUSH; import org.apache.commons.bcel6.generic.Type; +import org.junit.Assert; public class TestArrayAccess04Creator extends TestCreator implements Constants { private InstructionFactory _factory; @@ -53,8 +54,10 @@ public class TestArrayAccess04Creator extends TestCreator implements Constants { MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); + Assert.assertNotNull(ih_0); // TODO why is this not used il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); + Assert.assertNotNull(ih_4); // TODO why is this not used method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); @@ -66,15 +69,19 @@ public class TestArrayAccess04Creator extends TestCreator implements Constants { MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); + Assert.assertNotNull(ih_0); // TODO why is this not used il.append(_factory.createNewArray(Type.OBJECT, (short) 1)); il.append(InstructionFactory.createStore(Type.OBJECT, 1)); InstructionHandle ih_5 = il.append(new PUSH(_cp, 1)); + Assert.assertNotNull(ih_5); // TODO why is this not used il.append(InstructionFactory.createStore(Type.INT, 2)); InstructionHandle ih_7 = il.append(InstructionFactory.createLoad(Type.OBJECT, 1)); + Assert.assertNotNull(ih_7); // TODO why is this not used il.append(new PUSH(_cp, 0)); il.append(InstructionFactory.createLoad(Type.INT, 2)); il.append(InstructionConstants.AASTORE); InstructionHandle ih_11 = il.append(InstructionFactory.createReturn(Type.VOID)); + Assert.assertNotNull(ih_11); // TODO why is this not used method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java index 3e22879c..1cdf82a5 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java @@ -29,6 +29,7 @@ import org.apache.commons.bcel6.generic.InstructionHandle; import org.apache.commons.bcel6.generic.InstructionList; import org.apache.commons.bcel6.generic.MethodGen; import org.apache.commons.bcel6.generic.Type; +import org.junit.Assert; public class TestReturn01Creator extends TestCreator implements Constants { private InstructionFactory _factory; @@ -53,8 +54,10 @@ public class TestReturn01Creator extends TestCreator implements Constants { MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestReturn01", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); + Assert.assertNotNull(ih_0); // TODO why is this not used il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); + Assert.assertNotNull(ih_4); // TODO why is this not used method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); @@ -66,10 +69,12 @@ public class TestReturn01Creator extends TestCreator implements Constants { MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "foo", "org.apache.commons.bcel6.verifier.tests.TestReturn01", il, _cp); InstructionHandle ih_0 = il.append(_factory.createNew("java.lang.Object")); + Assert.assertNotNull(ih_0); // TODO why is this not used il.append(InstructionConstants.DUP); il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); il.append(InstructionConstants.NOP); InstructionHandle ih_8 = il.append(InstructionFactory.createReturn(Type.OBJECT)); + Assert.assertNotNull(ih_8); // TODO why is this not used method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java index 23ccea73..d3d59fc8 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java @@ -29,6 +29,7 @@ import org.apache.commons.bcel6.generic.InstructionHandle; import org.apache.commons.bcel6.generic.InstructionList; import org.apache.commons.bcel6.generic.MethodGen; import org.apache.commons.bcel6.generic.Type; +import org.junit.Assert; public class TestReturn03Creator extends TestCreator implements Constants { private InstructionFactory _factory; @@ -53,8 +54,10 @@ public class TestReturn03Creator extends TestCreator implements Constants { MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); + Assert.assertNotNull(ih_0); // TODO why is this not used il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); + Assert.assertNotNull(ih_4); // TODO why is this not used method.setMaxStack(); method.setMaxLocals(); _cg.addMethod(method.getMethod()); @@ -66,6 +69,7 @@ public class TestReturn03Creator extends TestCreator implements Constants { MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.INT, Type.NO_ARGS, new String[] { }, "test3", "org.apache.commons.bcel6.verifier.tests.TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(InstructionConstants.ACONST_NULL); + Assert.assertNotNull(ih_0); // TODO why is this not used il.append(InstructionFactory.createReturn(Type.OBJECT)); method.setMaxStack(); method.setMaxLocals(); -- GitLab From 1202ebf39277215717c22e411e993c2aac471988 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 10:40:22 +0000 Subject: [PATCH 0772/1313] Avoid unchecked warning git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695015 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/verifier/structurals/ControlFlowGraph.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java index 1b2c5aed..775f10f9 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java @@ -159,7 +159,9 @@ public class ControlFlowGraph{ */ public boolean execute(Frame inFrame, ArrayList execPreds, InstConstraintVisitor icv, ExecutionVisitor ev){ - executionPredecessors = (List) execPreds.clone(); + @SuppressWarnings("unchecked") // OK because execPreds is compatible type + final List clone = (List) execPreds.clone(); + executionPredecessors = clone; //sanity check if ( (lastExecutionJSR() == null) && (subroutines.subroutineOf(getInstruction()) != subroutines.getTopLevel() ) ){ -- GitLab From c40c10f68401d535aeca2756cf1fcd90425dff5f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 10:41:48 +0000 Subject: [PATCH 0773/1313] Avoid unused warnings git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695016 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/data/AttributeTestClassEM01.java | 1 + .../java/org/apache/commons/bcel6/generic/MethodGenTestCase.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java b/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java index 3b38fe2b..c34fdba9 100644 --- a/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java +++ b/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java @@ -22,6 +22,7 @@ public class AttributeTestClassEM01 { public static void main(String[] argv) { + @SuppressWarnings("unused") class S { public void sayhello() diff --git a/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java index 5bc81508..a34b37e9 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java @@ -33,6 +33,7 @@ public class MethodGenTestCase extends TestCase { public static class Foo { public void bar() { + @SuppressWarnings("unused") int a = 1; } } -- GitLab From d0820e6a1efa688b5298afe3ca0e56d7d16af607 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 14:09:39 +0000 Subject: [PATCH 0774/1313] Use getters/setters where they exist git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695079 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/classfile/BootstrapMethods.java | 4 ++-- .../org/apache/commons/bcel6/classfile/Code.java | 16 ++++++++-------- .../commons/bcel6/classfile/ConstantCP.java | 2 +- .../commons/bcel6/classfile/ConstantClass.java | 2 +- .../commons/bcel6/classfile/ConstantDouble.java | 2 +- .../commons/bcel6/classfile/ConstantFloat.java | 2 +- .../commons/bcel6/classfile/ConstantInteger.java | 2 +- .../commons/bcel6/classfile/ConstantLong.java | 2 +- .../bcel6/classfile/ConstantMethodHandle.java | 2 +- .../bcel6/classfile/ConstantMethodType.java | 2 +- .../bcel6/classfile/ConstantNameAndType.java | 2 +- .../commons/bcel6/classfile/ConstantString.java | 2 +- .../commons/bcel6/classfile/ConstantUtf8.java | 2 +- .../commons/bcel6/classfile/ConstantValue.java | 6 +++--- .../commons/bcel6/classfile/Deprecated.java | 6 +++--- .../commons/bcel6/classfile/EnclosingMethod.java | 4 ++-- .../commons/bcel6/classfile/ExceptionTable.java | 6 +++--- .../apache/commons/bcel6/classfile/Field.java | 2 +- .../commons/bcel6/classfile/FieldOrMethod.java | 4 ++-- .../commons/bcel6/classfile/InnerClasses.java | 4 ++-- .../commons/bcel6/classfile/JavaClass.java | 14 +++++++------- .../commons/bcel6/classfile/LineNumberTable.java | 2 +- .../bcel6/classfile/LocalVariableTable.java | 2 +- .../bcel6/classfile/LocalVariableTypeTable.java | 2 +- .../apache/commons/bcel6/classfile/Method.java | 2 +- .../bcel6/classfile/MethodParameters.java | 2 +- .../apache/commons/bcel6/classfile/PMGClass.java | 4 ++-- .../commons/bcel6/classfile/Signature.java | 2 +- .../commons/bcel6/classfile/SourceFile.java | 2 +- .../apache/commons/bcel6/classfile/StackMap.java | 2 +- .../commons/bcel6/classfile/StackMapTable.java | 2 +- .../commons/bcel6/classfile/Synthetic.java | 8 ++++---- .../apache/commons/bcel6/classfile/Unknown.java | 10 +++++----- .../apache/commons/bcel6/generic/ClassGen.java | 6 +++--- .../apache/commons/bcel6/generic/FieldGen.java | 4 ++-- .../apache/commons/bcel6/generic/MethodGen.java | 4 ++-- 36 files changed, 71 insertions(+), 71 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java index 95b48a03..2d391d0b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java @@ -107,7 +107,7 @@ public class BootstrapMethods extends Attribute { for (int i = 0; i < bootstrap_methods.length; i++) { c.bootstrap_methods[i] = bootstrap_methods[i].copy(); } - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); return c; } @@ -138,7 +138,7 @@ public class BootstrapMethods extends Attribute { buf.append("):\n"); for (int i = 0; i < bootstrap_methods.length; i++) { buf.append(" ").append(i).append(": "); - buf.append(bootstrap_methods[i].toString(constant_pool)).append("\n"); + buf.append(bootstrap_methods[i].toString(super.getConstantPool())).append("\n"); } return buf.toString(); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Code.java b/src/main/java/org/apache/commons/bcel6/classfile/Code.java index 7a62580f..7fc2123a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Code.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Code.java @@ -96,7 +96,7 @@ public final class Code extends Attribute { * is incorrect, because it didn't take the internal attributes * into account yet! Very subtle bug, fixed in 3.1.1. */ - this.length = length; + super.setLength(length); } @@ -247,7 +247,7 @@ public final class Code extends Attribute { int len = 0; if (attributes != null) { for (Attribute attribute : attributes) { - len += attribute.length + 6 /*attribute header size*/; + len += attribute.getLength() + 6 /*attribute header size*/; } } return len + getInternalLength(); @@ -259,7 +259,7 @@ public final class Code extends Attribute { */ public final void setAttributes( Attribute[] attributes ) { this.attributes = attributes != null ? attributes : new Attribute[0]; - length = calculateLength(); // Adjust length + super.setLength(calculateLength()); // Adjust length } @@ -268,7 +268,7 @@ public final class Code extends Attribute { */ public final void setCode( byte[] code ) { this.code = code != null ? code : new byte[0]; - length = calculateLength(); // Adjust length + super.setLength(calculateLength()); // Adjust length } @@ -277,7 +277,7 @@ public final class Code extends Attribute { */ public final void setExceptionTable( CodeException[] exception_table ) { this.exception_table = exception_table != null ? exception_table : new CodeException[0]; - length = calculateLength(); // Adjust length + super.setLength(calculateLength()); // Adjust length } @@ -304,11 +304,11 @@ public final class Code extends Attribute { StringBuilder buf = new StringBuilder(100); buf.append("Code(max_stack = ").append(max_stack).append(", max_locals = ").append( max_locals).append(", code_length = ").append(code.length).append(")\n").append( - Utility.codeToString(code, constant_pool, 0, -1, verbose)); + Utility.codeToString(code, super.getConstantPool(), 0, -1, verbose)); if (exception_table.length > 0) { buf.append("\nException handler(s) = \n").append("From\tTo\tHandler\tType\n"); for (CodeException exception : exception_table) { - buf.append(exception.toString(constant_pool, verbose)).append("\n"); + buf.append(exception.toString(super.getConstantPool(), verbose)).append("\n"); } } if (attributes.length > 0) { @@ -342,7 +342,7 @@ public final class Code extends Attribute { c.code = new byte[code.length]; System.arraycopy(code, 0, c.code, 0, code.length); } - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); c.exception_table = new CodeException[exception_table.length]; for (int i = 0; i < exception_table.length; i++) { c.exception_table[i] = exception_table[i].copy(); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java index eae8b579..19edc1a2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java @@ -85,7 +85,7 @@ public abstract class ConstantCP extends Constant { */ @Override public final void dump( DataOutputStream file ) throws IOException { - file.writeByte(tag); + file.writeByte(super.getTag()); file.writeShort(class_index); file.writeShort(name_and_type_index); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java index 84ecdc9e..de759d24 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java @@ -88,7 +88,7 @@ public final class ConstantClass extends Constant implements ConstantObject { */ @Override public final void dump( DataOutputStream file ) throws IOException { - file.writeByte(tag); + file.writeByte(super.getTag()); file.writeShort(name_index); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java index 5f0ccbba..cd01d990 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java @@ -87,7 +87,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { */ @Override public final void dump( DataOutputStream file ) throws IOException { - file.writeByte(tag); + file.writeByte(super.getTag()); file.writeDouble(bytes); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java index ee6f61f3..89b785fc 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java @@ -88,7 +88,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { */ @Override public final void dump( DataOutputStream file ) throws IOException { - file.writeByte(tag); + file.writeByte(super.getTag()); file.writeFloat(bytes); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java index 0b38a513..0e40616e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java @@ -87,7 +87,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { */ @Override public final void dump( DataOutputStream file ) throws IOException { - file.writeByte(tag); + file.writeByte(super.getTag()); file.writeInt(bytes); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java index c5682ea2..69932b6b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java @@ -87,7 +87,7 @@ public final class ConstantLong extends Constant implements ConstantObject { */ @Override public final void dump( DataOutputStream file ) throws IOException { - file.writeByte(tag); + file.writeByte(super.getTag()); file.writeLong(bytes); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java index a841e87e..5e3fb124 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java @@ -85,7 +85,7 @@ public final class ConstantMethodHandle extends Constant { */ @Override public final void dump( DataOutputStream file ) throws IOException { - file.writeByte(tag); + file.writeByte(super.getTag()); file.writeByte(reference_kind); file.writeShort(reference_index); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java index 98c190a0..e2e96134 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java @@ -83,7 +83,7 @@ public final class ConstantMethodType extends Constant { */ @Override public final void dump( DataOutputStream file ) throws IOException { - file.writeByte(tag); + file.writeByte(super.getTag()); file.writeShort(descriptor_index); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java index a00d07b3..141dbf87 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java @@ -91,7 +91,7 @@ public final class ConstantNameAndType extends Constant { */ @Override public final void dump( DataOutputStream file ) throws IOException { - file.writeByte(tag); + file.writeByte(super.getTag()); file.writeShort(name_index); file.writeShort(signature_index); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java index fce3e888..0063668b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java @@ -87,7 +87,7 @@ public final class ConstantString extends Constant implements ConstantObject { */ @Override public final void dump( DataOutputStream file ) throws IOException { - file.writeByte(tag); + file.writeByte(super.getTag()); file.writeShort(string_index); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java index 7685fa84..eb3316bd 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java @@ -170,7 +170,7 @@ public final class ConstantUtf8 extends Constant { */ @Override public final void dump( DataOutputStream file ) throws IOException { - file.writeByte(tag); + file.writeByte(super.getTag()); file.writeUTF(bytes); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java index 4af8b381..3bf2312a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java @@ -121,7 +121,7 @@ public final class ConstantValue extends Attribute { */ @Override public final String toString() { - Constant c = constant_pool.getConstant(constantvalue_index); + Constant c = super.getConstantPool().getConstant(constantvalue_index); String buf; int i; // Print constant to string depending on its type @@ -140,7 +140,7 @@ public final class ConstantValue extends Attribute { break; case Constants.CONSTANT_String: i = ((ConstantString) c).getStringIndex(); - c = constant_pool.getConstant(i, Constants.CONSTANT_Utf8); + c = super.getConstantPool().getConstant(i, Constants.CONSTANT_Utf8); buf = "\"" + Utility.convertString(((ConstantUtf8) c).getBytes()) + "\""; break; default: @@ -156,7 +156,7 @@ public final class ConstantValue extends Attribute { @Override public Attribute copy( ConstantPool _constant_pool ) { ConstantValue c = (ConstantValue) clone(); - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); return c; } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java index 051c9200..925484cf 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java @@ -101,8 +101,8 @@ public final class Deprecated extends Attribute { @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); - if (length > 0) { - file.write(bytes, 0, length); + if (super.getLength() > 0) { + file.write(bytes, 0, super.getLength()); } } @@ -142,7 +142,7 @@ public final class Deprecated extends Attribute { c.bytes = new byte[bytes.length]; System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); } - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); return c; } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java index d5ae169f..e27ad741 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java @@ -78,7 +78,7 @@ public class EnclosingMethod extends Attribute { public final ConstantClass getEnclosingClass() { ConstantClass c = - (ConstantClass)constant_pool.getConstant(classIndex,Constants.CONSTANT_Class); + (ConstantClass)super.getConstantPool().getConstant(classIndex,Constants.CONSTANT_Class); return c; } @@ -87,7 +87,7 @@ public class EnclosingMethod extends Attribute { return null; } ConstantNameAndType nat = - (ConstantNameAndType)constant_pool.getConstant(methodIndex,Constants.CONSTANT_NameAndType); + (ConstantNameAndType)super.getConstantPool().getConstant(methodIndex,Constants.CONSTANT_NameAndType); return nat; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java index 8785194a..513bb138 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java @@ -133,7 +133,7 @@ public final class ExceptionTable extends Attribute { public final String[] getExceptionNames() { String[] names = new String[exception_index_table.length]; for (int i = 0; i < exception_index_table.length; i++) { - names[i] = constant_pool.getConstantString(exception_index_table[i], + names[i] = super.getConstantPool().getConstantString(exception_index_table[i], Constants.CONSTANT_Class).replace('/', '.'); } return names; @@ -157,7 +157,7 @@ public final class ExceptionTable extends Attribute { StringBuilder buf = new StringBuilder(); String str; for (int i = 0; i < exception_index_table.length; i++) { - str = constant_pool.getConstantString(exception_index_table[i], Constants.CONSTANT_Class); + str = super.getConstantPool().getConstantString(exception_index_table[i], Constants.CONSTANT_Class); buf.append(Utility.compactClassName(str, false)); if (i < exception_index_table.length - 1) { buf.append(", "); @@ -178,7 +178,7 @@ public final class ExceptionTable extends Attribute { System.arraycopy(exception_index_table, 0, c.exception_index_table, 0, exception_index_table.length); } - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); return c; } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Field.java b/src/main/java/org/apache/commons/bcel6/classfile/Field.java index f2eb0ca7..a4e2dc8c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Field.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Field.java @@ -118,7 +118,7 @@ public final class Field extends FieldOrMethod { public final String toString() { String name, signature, access; // Short cuts to constant pool // Get names from constant pool - access = Utility.accessToString(access_flags); + access = Utility.accessToString(super.getAccessFlags()); access = access.equals("") ? "" : (access + " "); signature = Utility.signatureToString(getSignature()); name = getName(); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index c5603aed..c9d1706e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -94,7 +94,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No */ protected FieldOrMethod(int access_flags, int name_index, int signature_index, Attribute[] attributes, ConstantPool constant_pool) { - this.access_flags = access_flags; + super.setAccessFlags(access_flags); this.name_index = name_index; this.signature_index = signature_index; this.constant_pool = constant_pool; @@ -109,7 +109,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * @throws IOException */ public final void dump( DataOutputStream file ) throws IOException { - file.writeShort(access_flags); + file.writeShort(super.getAccessFlags()); file.writeShort(name_index); file.writeShort(signature_index); file.writeShort(attributes.length); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java index 56af457e..c973d0f7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java @@ -133,7 +133,7 @@ public final class InnerClasses extends Attribute { public final String toString() { StringBuilder buf = new StringBuilder(); for (InnerClass inner_class : inner_classes) { - buf.append(inner_class.toString(constant_pool)).append("\n"); + buf.append(inner_class.toString(super.getConstantPool())).append("\n"); } return buf.toString(); } @@ -149,7 +149,7 @@ public final class InnerClasses extends Attribute { for (int i = 0; i < inner_classes.length; i++) { c.inner_classes[i] = inner_classes[i].copy(); } - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); return c; } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 2553f369..87b799c9 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -136,7 +136,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl this.file_name = file_name; this.major = major; this.minor = minor; - this.access_flags = access_flags; + super.setAccessFlags(access_flags); this.constant_pool = constant_pool; this.interfaces = interfaces; this.fields = fields; @@ -300,7 +300,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl file.writeShort(minor); file.writeShort(major); constant_pool.dump(file); - file.writeShort(access_flags); + file.writeShort(super.getAccessFlags()); file.writeShort(class_name_index); file.writeShort(superclass_name_index); file.writeShort(interfaces.length); @@ -600,10 +600,10 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl */ @Override public String toString() { - String access = Utility.accessToString(access_flags, true); + String access = Utility.accessToString(super.getAccessFlags(), true); access = access.equals("") ? "" : (access + " "); StringBuilder buf = new StringBuilder(128); - buf.append(access).append(Utility.classOrInterface(access_flags)).append(" ").append( + buf.append(access).append(Utility.classOrInterface(super.getAccessFlags())).append(" ").append( class_name).append(" extends ").append( Utility.compactClassName(superclass_name, false)).append('\n'); int size = interfaces.length; @@ -620,7 +620,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl buf.append("filename\t\t").append(file_name).append('\n'); buf.append("compiled from\t\t").append(source_file_name).append('\n'); buf.append("compiler version\t").append(major).append(".").append(minor).append('\n'); - buf.append("access flags\t\t").append(access_flags).append('\n'); + buf.append("access flags\t\t").append(super.getAccessFlags()).append('\n'); buf.append("constant pool\t\t").append(constant_pool.getLength()).append(" entries\n"); buf.append("ACC_SUPER flag\t\t").append(isSuper()).append("\n"); if (attributes.length > 0) { @@ -691,12 +691,12 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public final boolean isSuper() { - return (access_flags & Constants.ACC_SUPER) != 0; + return (super.getAccessFlags() & Constants.ACC_SUPER) != 0; } public final boolean isClass() { - return (access_flags & Constants.ACC_INTERFACE) == 0; + return (super.getAccessFlags() & Constants.ACC_INTERFACE) == 0; } public final boolean isAnonymous() { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java index fe506b01..7829cd2a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java @@ -202,7 +202,7 @@ public final class LineNumberTable extends Attribute { for (int i = 0; i < line_number_table.length; i++) { c.line_number_table[i] = line_number_table[i].copy(); } - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); return c; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java index ca5daf7e..331413f7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java @@ -188,7 +188,7 @@ public class LocalVariableTable extends Attribute { for (int i = 0; i < local_variable_table.length; i++) { c.local_variable_table[i] = local_variable_table[i].copy(); } - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); return c; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java index d69de084..c48916cf 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java @@ -142,7 +142,7 @@ public class LocalVariableTypeTable extends Attribute { c.local_variable_type_table[i] = local_variable_type_table[i].copy(); } - c.constant_pool = constant_pool; + c.setConstantPool(constant_pool); return c; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Method.java b/src/main/java/org/apache/commons/bcel6/classfile/Method.java index f3126b58..6f5973c7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Method.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Method.java @@ -170,7 +170,7 @@ public final class Method extends FieldOrMethod { ConstantUtf8 c; String name, signature, access; // Short cuts to constant pool StringBuilder buf; - access = Utility.accessToString(access_flags); + access = Utility.accessToString(super.getAccessFlags()); // Get name and signature from constant pool c = (ConstantUtf8) constant_pool.getConstant(signature_index, Constants.CONSTANT_Utf8); signature = c.getBytes(); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java index 6ca2407a..fca8c586 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java @@ -67,7 +67,7 @@ public class MethodParameters extends Attribute { for (int i = 0; i < parameters.length; i++) { c.parameters[i] = parameters[i].copy(); } - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); return c; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java index 66fe9fe2..0bf915f2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java @@ -139,7 +139,7 @@ public final class PMGClass extends Attribute { * @return PMG name. */ public final String getPMGName() { - ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(pmg_index, + ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(pmg_index, Constants.CONSTANT_Utf8); return c.getBytes(); } @@ -149,7 +149,7 @@ public final class PMGClass extends Attribute { * @return PMG class name. */ public final String getPMGClassName() { - ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(pmg_class_index, + ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(pmg_class_index, Constants.CONSTANT_Utf8); return c.getBytes(); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java index ad438681..9a3bcc8d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java @@ -120,7 +120,7 @@ public final class Signature extends Attribute { * @return GJ signature. */ public final String getSignature() { - ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(signature_index, + ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(signature_index, Constants.CONSTANT_Utf8); return c.getBytes(); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java index e40d106f..c25c62c4 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java @@ -127,7 +127,7 @@ public final class SourceFile extends Attribute { * @return Source file name. */ public final String getSourceFileName() { - ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(sourcefile_index, + ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(sourcefile_index, Constants.CONSTANT_Utf8); return c.getBytes(); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java index fcf5a9f6..7b970334 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java @@ -134,7 +134,7 @@ public final class StackMap extends Attribute { for (int i = 0; i < map.length; i++) { c.map[i] = map[i].copy(); } - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); return c; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java index bb3a1010..e24b2d23 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java @@ -134,7 +134,7 @@ public final class StackMapTable extends Attribute { for (int i = 0; i < map.length; i++) { c.map[i] = map[i].copy(); } - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); return c; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java index 2d2eaf7a..440bef4a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java @@ -107,8 +107,8 @@ public final class Synthetic extends Attribute { @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); - if (length > 0) { - file.write(bytes, 0, length); + if (super.getLength() > 0) { + file.write(bytes, 0, super.getLength()); } } @@ -135,7 +135,7 @@ public final class Synthetic extends Attribute { @Override public final String toString() { StringBuilder buf = new StringBuilder("Synthetic"); - if (length > 0) { + if (super.getLength() > 0) { buf.append(" ").append(Utility.toHexString(bytes)); } return buf.toString(); @@ -152,7 +152,7 @@ public final class Synthetic extends Attribute { c.bytes = new byte[bytes.length]; System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); } - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); return c; } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java index a80e5c24..099eb515 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java @@ -124,8 +124,8 @@ public final class Unknown extends Attribute { @Override public final void dump( DataOutputStream file ) throws IOException { super.dump(file); - if (length > 0) { - file.write(bytes, 0, length); + if (super.getLength() > 0) { + file.write(bytes, 0, super.getLength()); } } @@ -160,11 +160,11 @@ public final class Unknown extends Attribute { */ @Override public final String toString() { - if (length == 0 || bytes == null) { + if (super.getLength() == 0 || bytes == null) { return "(Unknown attribute " + name + ")"; } String hex; - if (length > 10) { + if (super.getLength() > 10) { byte[] tmp = new byte[10]; System.arraycopy(bytes, 0, tmp, 0, 10); hex = Utility.toHexString(tmp) + "... (truncated)"; @@ -185,7 +185,7 @@ public final class Unknown extends Attribute { c.bytes = new byte[bytes.length]; System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); } - c.constant_pool = _constant_pool; + c.setConstantPool(_constant_pool); return c; } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index e18a1a8d..6c1b66a0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -89,7 +89,7 @@ public class ClassGen extends AccessFlags implements Cloneable { this.class_name = class_name; this.super_class_name = super_class_name; this.file_name = file_name; - this.access_flags = access_flags; + super.setAccessFlags(access_flags); this.cp = cp; // Put everything needed by default into the constant pool and the vectors if (file_name != null) { @@ -131,7 +131,7 @@ public class ClassGen extends AccessFlags implements Cloneable { class_name = clazz.getClassName(); super_class_name = clazz.getSuperclassName(); file_name = clazz.getSourceFileName(); - access_flags = clazz.getAccessFlags(); + super.setAccessFlags(clazz.getAccessFlags()); cp = new ConstantPoolGen(clazz.getConstantPool()); major = clazz.getMajor(); minor = clazz.getMinor(); @@ -211,7 +211,7 @@ public class ClassGen extends AccessFlags implements Cloneable { // Must be last since the above calls may still add something to it ConstantPool _cp = this.cp.getFinalConstantPool(); return new JavaClass(class_name_index, superclass_name_index, file_name, major, minor, - access_flags, _cp, interfaces, fields, methods, attributes); + super.getAccessFlags(), _cp, interfaces, fields, methods, attributes); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index 029d8a40..0c676291 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -222,7 +222,7 @@ public class FieldGen extends FieldGenOrMethodGen { .getConstantPool())); } addAnnotationsAsAttribute(cp); - return new Field(access_flags, name_index, signature_index, getAttributes(), cp + return new Field(super.getAccessFlags(), name_index, signature_index, getAttributes(), cp .getConstantPool()); } @@ -314,7 +314,7 @@ public class FieldGen extends FieldGenOrMethodGen { @Override public final String toString() { String name, signature, access; // Short cuts to constant pool - access = Utility.accessToString(access_flags); + access = Utility.accessToString(super.getAccessFlags()); access = access.equals("") ? "" : (access + " "); signature = type.toString(); name = getName(); diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 1f59f8f7..023b060d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -685,7 +685,7 @@ public class MethodGen extends FieldGenOrMethodGen { addAttribute(et = getExceptionTable(cp)); // Add `Exceptions' if there are "throws" clauses } - Method m = new Method(access_flags, name_index, signature_index, getAttributes(), cp + Method m = new Method(super.getAccessFlags(), name_index, signature_index, getAttributes(), cp .getConstantPool()); // Undo effects of adding attributes if (lvt != null) { @@ -1050,7 +1050,7 @@ public class MethodGen extends FieldGenOrMethodGen { */ @Override public final String toString() { - String access = Utility.accessToString(access_flags); + String access = Utility.accessToString(super.getAccessFlags()); String signature = Type.getMethodSignature(type, arg_types); signature = Utility.methodSignatureToString(signature, name, access, true, getLocalVariableTable(cp)); -- GitLab From 9a41fecce8b7a43e7d77b97c12c7e1c8daec7363 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 14:48:05 +0000 Subject: [PATCH 0775/1313] Avoid unchecked warning git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695095 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/generic/MethodGen.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 023b060d..1f29f55c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -1119,7 +1119,9 @@ public class MethodGen extends FieldGenOrMethodGen { // Initialize param_annotations if (!hasParameterAnnotations) { - param_annotations = new List[arg_types.length]; + @SuppressWarnings("unchecked") // OK + final List[] parmList = new List[arg_types.length]; + param_annotations = parmList; for (int j = 0; j < arg_types.length; j++) { param_annotations[j] = new ArrayList(); } @@ -1168,7 +1170,9 @@ public class MethodGen extends FieldGenOrMethodGen { ensureExistingParameterAnnotationsUnpacked(); if (!hasParameterAnnotations) { - param_annotations = new List[arg_types.length]; + @SuppressWarnings("unchecked") // OK + final List[] parmList = new List[arg_types.length]; + param_annotations = parmList; hasParameterAnnotations = true; } List existingAnnotations = param_annotations[parameterIndex]; -- GitLab From 522b077cab5f3620cd546c10cd3607b5f9133b4f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 14:51:15 +0000 Subject: [PATCH 0776/1313] Add TODO git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695099 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/ConstantPool.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java index 82789ab3..aaf55d28 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java @@ -40,7 +40,7 @@ import org.apache.commons.bcel6.Constants; public class ConstantPool implements Cloneable, Node, Serializable { private static final long serialVersionUID = -9093478476423540196L; - private Constant[] constant_pool; + private Constant[] constant_pool; // TODO this could be final; the setConstantPool method is not called externally /** -- GitLab From eb82f8b4cb3e0aaa2a82a3f1a66535cbaec59a9a Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 14:55:00 +0000 Subject: [PATCH 0777/1313] Use ctor parameter rather than invoking setAccessFlags git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695100 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/classfile/FieldOrMethod.java | 2 +- .../java/org/apache/commons/bcel6/classfile/JavaClass.java | 2 +- src/main/java/org/apache/commons/bcel6/generic/ClassGen.java | 4 ++-- src/main/java/org/apache/commons/bcel6/generic/FieldGen.java | 2 +- .../org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java | 4 ++++ src/main/java/org/apache/commons/bcel6/generic/MethodGen.java | 2 +- 6 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index c9d1706e..7fe21545 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -94,7 +94,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No */ protected FieldOrMethod(int access_flags, int name_index, int signature_index, Attribute[] attributes, ConstantPool constant_pool) { - super.setAccessFlags(access_flags); + super(access_flags); this.name_index = name_index; this.signature_index = signature_index; this.constant_pool = constant_pool; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 87b799c9..a387c0d9 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -119,6 +119,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public JavaClass(int class_name_index, int superclass_name_index, String file_name, int major, int minor, int access_flags, ConstantPool constant_pool, int[] interfaces, Field[] fields, Method[] methods, Attribute[] attributes, byte source) { + super(access_flags); if (interfaces == null) { interfaces = new int[0]; } @@ -136,7 +137,6 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl this.file_name = file_name; this.major = major; this.minor = minor; - super.setAccessFlags(access_flags); this.constant_pool = constant_pool; this.interfaces = interfaces; this.fields = fields; diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index 6c1b66a0..04fd6d46 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -86,10 +86,10 @@ public class ClassGen extends AccessFlags implements Cloneable { */ public ClassGen(String class_name, String super_class_name, String file_name, int access_flags, String[] interfaces, ConstantPoolGen cp) { + super(access_flags); this.class_name = class_name; this.super_class_name = super_class_name; this.file_name = file_name; - super.setAccessFlags(access_flags); this.cp = cp; // Put everything needed by default into the constant pool and the vectors if (file_name != null) { @@ -126,12 +126,12 @@ public class ClassGen extends AccessFlags implements Cloneable { * @param clazz JavaClass object (e.g. read from file) */ public ClassGen(JavaClass clazz) { + super(clazz.getAccessFlags()); class_name_index = clazz.getClassNameIndex(); superclass_name_index = clazz.getSuperclassNameIndex(); class_name = clazz.getClassName(); super_class_name = clazz.getSuperclassName(); file_name = clazz.getSourceFileName(); - super.setAccessFlags(clazz.getAccessFlags()); cp = new ConstantPoolGen(clazz.getConstantPool()); major = clazz.getMajor(); minor = clazz.getMinor(); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index 0c676291..fa13a1a0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -73,7 +73,7 @@ public class FieldGen extends FieldGenOrMethodGen { * @param cp constant pool */ public FieldGen(int access_flags, Type type, String name, ConstantPoolGen cp) { - setAccessFlags(access_flags); + super(access_flags); setType(type); setName(name); setConstantPool(cp); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java index 160805aa..23deb14a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java @@ -45,6 +45,10 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn } + public FieldGenOrMethodGen(int access_flags) { + super(access_flags); + } + public void setType( Type type ) { if (type.getType() == Constants.T_ADDRESS) { throw new IllegalArgumentException("Type can not be " + type); diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 1f29f55c..917248a7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -120,7 +120,7 @@ public class MethodGen extends FieldGenOrMethodGen { */ public MethodGen(int access_flags, Type return_type, Type[] arg_types, String[] arg_names, String method_name, String class_name, InstructionList il, ConstantPoolGen cp) { - setAccessFlags(access_flags); + super(access_flags); setType(return_type); setArgumentTypes(arg_types); setArgumentNames(arg_names); -- GitLab From 13ad5d992416c719bcdd5d54a9b524862661e952 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 15:22:35 +0000 Subject: [PATCH 0778/1313] Don't call overrideable methods from a constructor git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695113 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/classfile/AnnotationDefault.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java index 052a3f8d..3f734c1a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java @@ -34,7 +34,7 @@ public class AnnotationDefault extends Attribute { private static final long serialVersionUID = -4017327188724019487L; - private ElementValue default_value; + private ElementValue default_value; // TODO could this be made final? /** * @param name_index Index pointing to the name Code @@ -55,7 +55,7 @@ public class AnnotationDefault extends Attribute { */ public AnnotationDefault(int name_index, int length, ElementValue defaultValue, ConstantPool constant_pool) { super(Constants.ATTR_ANNOTATION_DEFAULT, name_index, length, constant_pool); - setDefaultValue(defaultValue); + this.default_value = defaultValue; } /** -- GitLab From bfb12d39d41b4bd969a93ca42918c48d5fce863a Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 15:25:53 +0000 Subject: [PATCH 0779/1313] Don't call overrideable methods from a constructor git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695115 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/Annotations.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java index 1b19026b..de93cbdb 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java @@ -32,7 +32,7 @@ public abstract class Annotations extends Attribute { private static final long serialVersionUID = 1L; - private AnnotationEntry[] annotation_table; + private AnnotationEntry[] annotation_table; // TODO could this be final? private final boolean isRuntimeVisible; /** @@ -60,7 +60,7 @@ public abstract class Annotations extends Attribute { */ public Annotations(byte annotation_type, int name_index, int length, AnnotationEntry[] annotation_table, ConstantPool constant_pool, boolean isRuntimeVisible) { super(annotation_type, name_index, length, constant_pool); - setAnnotationTable(annotation_table); + this.annotation_table = annotation_table; this.isRuntimeVisible = isRuntimeVisible; } -- GitLab From 023046e8fae86c220626db0327dd339aa309b0ad Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 15:43:17 +0000 Subject: [PATCH 0780/1313] Don't call overrideable methods from a constructor git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695119 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/Code.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Code.java b/src/main/java/org/apache/commons/bcel6/classfile/Code.java index 7fc2123a..224ed96b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Code.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Code.java @@ -45,8 +45,8 @@ import org.apache.commons.bcel6.Constants; public final class Code extends Attribute { private static final long serialVersionUID = -432884354459701506L; - private int max_stack; // Maximum size of stack used by this method - private int max_locals; // Number of local variables + private int max_stack; // Maximum size of stack used by this method // TODO this could be made final (setter is not used) + private int max_locals; // Number of local variables // TODO this could be made final (setter is not used) private byte[] code; // Actual byte code private CodeException[] exception_table; // Table of handled exceptions private Attribute[] attributes; // or LocalVariable @@ -115,9 +115,10 @@ public final class Code extends Attribute { super(Constants.ATTR_CODE, name_index, length, constant_pool); this.max_stack = max_stack; this.max_locals = max_locals; - setCode(code); - setExceptionTable(exception_table); - setAttributes(attributes); // Overwrites length! + this.code = code != null ? code : new byte[0]; + this.exception_table = exception_table != null ? exception_table : new CodeException[0]; + this.attributes = attributes != null ? attributes : new Attribute[0]; + super.setLength(calculateLength()); // Adjust length } -- GitLab From 2c98c55f78c136c5c8111da09249aeb2b4d7acbb Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 15:43:32 +0000 Subject: [PATCH 0781/1313] TODOs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695120 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/classfile/BootstrapMethod.java | 6 +++--- .../apache/commons/bcel6/classfile/BootstrapMethods.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java index f7028ee7..f4ec3e09 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java @@ -37,12 +37,12 @@ public class BootstrapMethod implements Serializable, Cloneable { private static final long serialVersionUID = -4517534834047695344L; /** Index of the CONSTANT_MethodHandle_info structure in the constant_pool table */ - private int bootstrap_method_ref; + private int bootstrap_method_ref; // TODO this could be made final (setter is not used) - private int num_bootstrap_arguments; + private final int num_bootstrap_arguments; /** Array of references to the constant_pool table */ - private int[] bootstrap_arguments; + private int[] bootstrap_arguments; // TODO this could be made final (setter is not used) /** diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java index 2d391d0b..589e6453 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java @@ -33,7 +33,7 @@ public class BootstrapMethods extends Attribute { private static final long serialVersionUID = -2169230245012340809L; - private BootstrapMethod[] bootstrap_methods; + private BootstrapMethod[] bootstrap_methods; // TODO this could be made final (setter is not used) /** * Initialize from another object. Note that both objects use the same -- GitLab From 0125677a9c438696fe14d51127da2147d43db8b0 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 15:59:45 +0000 Subject: [PATCH 0782/1313] Don't call overrideable methods from a constructor git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695121 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/ConstantPool.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java index aaf55d28..dd798491 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java @@ -47,7 +47,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { * @param constant_pool Array of constants */ public ConstantPool(Constant[] constant_pool) { - setConstantPool(constant_pool); + this.constant_pool = constant_pool; } @@ -335,7 +335,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { /** * @param constant_pool */ - public void setConstantPool( Constant[] constant_pool ) { + public void setConstantPool( Constant[] constant_pool ) { // TODO unused this.constant_pool = constant_pool; } -- GitLab From f6825448545fdb3185d8cb2ffb5914fa6e5e63a9 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 16:06:19 +0000 Subject: [PATCH 0783/1313] Typos git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695123 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/util/ClassLoader.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java index ebcf25c5..d3fbdf68 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java @@ -151,8 +151,8 @@ public class ClassLoader extends java.lang.ClassLoader { /** * Override this method to create you own classes on the fly. The * name contains the special token $$BCEL$$. Everything before that - * token is consddered to be a package name. You can encode you own - * arguments into the subsequent string. You must regard however not + * token is considered to be a package name. You can encode your own + * arguments into the subsequent string. You must ensure however not * to use any "illegal" characters, i.e., characters that may not * appear in a Java class name too
    * -- GitLab From c419142ae7da2ee5907f961b132d42ab838fb3c3 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 16:09:32 +0000 Subject: [PATCH 0784/1313] Use constant for special BCEL token string; replace the magic number (the token length) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695125 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/util/ClassLoader.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java index d3fbdf68..418bc36c 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java @@ -54,6 +54,7 @@ import org.apache.commons.bcel6.classfile.Utility; */ public class ClassLoader extends java.lang.ClassLoader { + private static final String BCEL_TOKEN = "$$BCEL$$"; public static final String[] DEFAULT_IGNORED_PACKAGES = { "java.", "javax.", "sun." }; @@ -115,7 +116,7 @@ public class ClassLoader extends java.lang.ClassLoader { JavaClass clazz = null; /* Third try: Special request? */ - if (class_name.contains("$$BCEL$$")) { + if (class_name.contains(BCEL_TOKEN)) { clazz = createClass(class_name); } else { // Fourth try: Load classes via repository if ((clazz = repository.loadClass(class_name)) != null) { @@ -163,8 +164,8 @@ public class ClassLoader extends java.lang.ClassLoader { * @param class_name compressed byte code with "$$BCEL$$" in it */ protected JavaClass createClass( String class_name ) { - int index = class_name.indexOf("$$BCEL$$"); - String real_name = class_name.substring(index + 8); + int index = class_name.indexOf(BCEL_TOKEN); + String real_name = class_name.substring(index + BCEL_TOKEN.length()); JavaClass clazz = null; try { byte[] bytes = Utility.decode(real_name, true); -- GitLab From efaedd2fb3e9794d37d46b6d8643ef815ed57481 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 16:28:30 +0000 Subject: [PATCH 0785/1313] Don't call overrideable methods from a constructor git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695128 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/classfile/ExceptionTable.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java index 513bb138..44e0c38d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java @@ -39,7 +39,7 @@ public final class ExceptionTable extends Attribute { private static final long serialVersionUID = 2045358830660883220L; - private int[] exception_index_table; // constant pool + private int[] exception_index_table; // constant pool // TODO could be final (setter unused) /** @@ -60,7 +60,7 @@ public final class ExceptionTable extends Attribute { public ExceptionTable(int name_index, int length, int[] exception_index_table, ConstantPool constant_pool) { super(Constants.ATTR_EXCEPTIONS, name_index, length, constant_pool); - setExceptionIndexTable(exception_index_table); + this.exception_index_table = exception_index_table != null ? exception_index_table : new int[0]; } @@ -144,7 +144,7 @@ public final class ExceptionTable extends Attribute { * @param exception_index_table the list of exception indexes * Also redefines number_of_exceptions according to table length. */ - public final void setExceptionIndexTable( int[] exception_index_table ) { + public final void setExceptionIndexTable( int[] exception_index_table ) { // TODO unused this.exception_index_table = exception_index_table != null ? exception_index_table : new int[0]; } -- GitLab From a02eeac5440ef3d9887df8bdd9b486e61d510ffa Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 16:35:33 +0000 Subject: [PATCH 0786/1313] Use getter git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695130 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/Field.java | 8 ++++---- .../org/apache/commons/bcel6/classfile/Method.java | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Field.java b/src/main/java/org/apache/commons/bcel6/classfile/Field.java index a4e2dc8c..eeb90c33 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Field.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Field.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.util.BCELComparator; public final class Field extends FieldOrMethod { private static final long serialVersionUID = -4604082205545049134L; - private static BCELComparator _cmp = new BCELComparator() { + private static BCELComparator _cmp = new BCELComparator() { // TODO could be final (setter unused) public boolean equals( Object o1, Object o2 ) { Field THIS = (Field) o1; @@ -99,7 +99,7 @@ public final class Field extends FieldOrMethod { * @return constant value associated with this field (may be null) */ public final ConstantValue getConstantValue() { - for (Attribute attribute : attributes) { + for (Attribute attribute : super.getAttributes()) { if (attribute.getTag() == Constants.ATTR_CONSTANT_VALUE) { return (ConstantValue) attribute; } @@ -128,7 +128,7 @@ public final class Field extends FieldOrMethod { if (cv != null) { buf.append(" = ").append(cv); } - for (Attribute attribute : attributes) { + for (Attribute attribute : super.getAttributes()) { if (!(attribute instanceof ConstantValue)) { buf.append(" [").append(attribute.toString()).append("]"); } @@ -164,7 +164,7 @@ public final class Field extends FieldOrMethod { /** * @param comparator Comparison strategy object */ - public static void setComparator( BCELComparator comparator ) { + public static void setComparator( BCELComparator comparator ) { // TODO unused _cmp = comparator; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Method.java b/src/main/java/org/apache/commons/bcel6/classfile/Method.java index 6f5973c7..b95b7222 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Method.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Method.java @@ -112,7 +112,7 @@ public final class Method extends FieldOrMethod { * @return Code attribute of method, if any */ public final Code getCode() { - for (Attribute attribute : attributes) { + for (Attribute attribute : super.getAttributes()) { if (attribute instanceof Code) { return (Code) attribute; } @@ -126,7 +126,7 @@ public final class Method extends FieldOrMethod { * exceptions the method may throw not exception handlers! */ public final ExceptionTable getExceptionTable() { - for (Attribute attribute : attributes) { + for (Attribute attribute : super.getAttributes()) { if (attribute instanceof ExceptionTable) { return (ExceptionTable) attribute; } @@ -172,14 +172,14 @@ public final class Method extends FieldOrMethod { StringBuilder buf; access = Utility.accessToString(super.getAccessFlags()); // Get name and signature from constant pool - c = (ConstantUtf8) constant_pool.getConstant(signature_index, Constants.CONSTANT_Utf8); + c = (ConstantUtf8) super.getConstantPool().getConstant(super.getSignatureIndex(), Constants.CONSTANT_Utf8); signature = c.getBytes(); - c = (ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8); + c = (ConstantUtf8) super.getConstantPool().getConstant(super.getNameIndex(), Constants.CONSTANT_Utf8); name = c.getBytes(); signature = Utility.methodSignatureToString(signature, name, access, true, getLocalVariableTable()); buf = new StringBuilder(signature); - for (Attribute attribute : attributes) { + for (Attribute attribute : super.getAttributes()) { if (!((attribute instanceof Code) || (attribute instanceof ExceptionTable))) { buf.append(" [").append(attribute.toString()).append("]"); } -- GitLab From f49ce629f3ab89847094ada44cbcfcb6a32ef897 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 17:24:31 +0000 Subject: [PATCH 0787/1313] TODOs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695137 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/CodeException.java | 16 ++++++++-------- .../commons/bcel6/classfile/ConstantCP.java | 8 ++++---- .../commons/bcel6/classfile/ConstantClass.java | 2 +- .../commons/bcel6/classfile/ConstantDouble.java | 4 ++-- .../commons/bcel6/classfile/ConstantFloat.java | 4 ++-- .../commons/bcel6/classfile/ConstantInteger.java | 4 ++-- .../commons/bcel6/classfile/ConstantLong.java | 4 ++-- .../bcel6/classfile/ConstantMethodHandle.java | 8 ++++---- .../bcel6/classfile/ConstantMethodType.java | 4 ++-- .../bcel6/classfile/ConstantNameAndType.java | 8 ++++---- .../commons/bcel6/classfile/ConstantString.java | 4 ++-- .../commons/bcel6/classfile/ConstantValue.java | 4 ++-- .../commons/bcel6/classfile/Deprecated.java | 4 ++-- .../commons/bcel6/classfile/EnclosingMethod.java | 8 ++++---- .../commons/bcel6/classfile/FieldOrMethod.java | 5 +++-- .../commons/bcel6/classfile/InnerClass.java | 16 ++++++++-------- 16 files changed, 52 insertions(+), 51 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java index 577d0fc6..fad3f5b0 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java @@ -36,12 +36,12 @@ import org.apache.commons.bcel6.Constants; public final class CodeException implements Cloneable, Constants, Node, Serializable { private static final long serialVersionUID = 2972500041254967221L; - private int start_pc; // Range in the code the exception handler is - private int end_pc; // active. start_pc is inclusive, end_pc exclusive - private int handler_pc; /* Starting address of exception handler, i.e., + private int start_pc; // Range in the code the exception handler is TODO could be final (setter unused) + private int end_pc; // active. start_pc is inclusive, end_pc exclusive TODO could be final (setter unused) + private int handler_pc; /* Starting address of exception handler, i.e., TODO could be final (setter unused) * an offset from start of code. */ - private int catch_type; /* If this is zero the handler catches any + private int catch_type; /* If this is zero the handler catches any TODO could be final (setter unused) * exception, otherwise it points to the * exception class which is to be caught. */ @@ -146,7 +146,7 @@ public final class CodeException implements Cloneable, Constants, Node, Serializ /** * @param catch_type the type of exception that is caught */ - public final void setCatchType( int catch_type ) { + public final void setCatchType( int catch_type ) { // TODO unused this.catch_type = catch_type; } @@ -154,7 +154,7 @@ public final class CodeException implements Cloneable, Constants, Node, Serializ /** * @param end_pc end of handled block */ - public final void setEndPC( int end_pc ) { + public final void setEndPC( int end_pc ) { // TODO unused this.end_pc = end_pc; } @@ -162,7 +162,7 @@ public final class CodeException implements Cloneable, Constants, Node, Serializ /** * @param handler_pc where the actual code is */ - public final void setHandlerPC( int handler_pc ) { + public final void setHandlerPC( int handler_pc ) { // TODO unused this.handler_pc = handler_pc; } @@ -170,7 +170,7 @@ public final class CodeException implements Cloneable, Constants, Node, Serializ /** * @param start_pc start of handled block */ - public final void setStartPC( int start_pc ) { + public final void setStartPC( int start_pc ) { // TODO unused this.start_pc = start_pc; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java index 19edc1a2..45f7a553 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java @@ -41,9 +41,9 @@ public abstract class ConstantCP extends Constant { */ // Note that this field is used to store the // bootstrap_method_attr_index of a ConstantInvokeDynamic. - protected int class_index; // TODO make private (has getter & setter) + protected int class_index; // TODO make private (has getter & setter) could be final (setter unused) // This field has the same meaning for all subclasses. - protected int name_and_type_index; // TODO make private (has getter & setter) + protected int name_and_type_index; // TODO make private (has getter & setter) could be final (setter unused) /** @@ -113,7 +113,7 @@ public abstract class ConstantCP extends Constant { /** * @param class_index points to Constant_class */ - public final void setClassIndex( int class_index ) { + public final void setClassIndex( int class_index ) { // TODO unused this.class_index = class_index; } @@ -124,7 +124,7 @@ public abstract class ConstantCP extends Constant { * Note that this method is a functional duplicate of setClassIndex * for use by ConstantInvokeDynamic. */ - public final void setBootstrapMethodAttrIndex(int bootstrap_method_attr_index) { + public final void setBootstrapMethodAttrIndex(int bootstrap_method_attr_index) { // TODO unused this.class_index = bootstrap_method_attr_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java index de759d24..d2baf58f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantClass extends Constant implements ConstantObject { private static final long serialVersionUID = -1083450233715258720L; - private int name_index; // Identical to ConstantString except for the name + private int name_index; // Identical to ConstantString except for the name TODO could be final (setter unused) /** diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java index cd01d990..21413bb7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantDouble extends Constant implements ConstantObject { private static final long serialVersionUID = -7394764537394782136L; - private double bytes; + private double bytes; // TODO could be final (setter not used) /** @@ -103,7 +103,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { /** * @param bytes the raw bytes that represent the double value */ - public final void setBytes( double bytes ) { + public final void setBytes( double bytes ) { // TODO unused this.bytes = bytes; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java index 89b785fc..b7035b4d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantFloat extends Constant implements ConstantObject { private static final long serialVersionUID = -2316732495687628398L; - private float bytes; + private float bytes; // TODO could be final (setter unused) /** @@ -104,7 +104,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { /** * @param bytes the raw bytes that represent this float */ - public final void setBytes( float bytes ) { + public final void setBytes( float bytes ) { // TODO unused this.bytes = bytes; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java index 0e40616e..a9a8a3ef 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantInteger extends Constant implements ConstantObject { private static final long serialVersionUID = -7040676276945754375L; - private int bytes; + private int bytes; // TODO could be final (setter unused) /** @@ -103,7 +103,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { /** * @param bytes the raw bytes that represent this integer */ - public final void setBytes( int bytes ) { + public final void setBytes( int bytes ) { // TODO unused this.bytes = bytes; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java index 69932b6b..8447c63b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantLong extends Constant implements ConstantObject { private static final long serialVersionUID = 8495971186433816161L; - private long bytes; + private long bytes; // TODO could be final (setter unused) /** @@ -103,7 +103,7 @@ public final class ConstantLong extends Constant implements ConstantObject { /** * @param bytes the raw bytes that represent this long */ - public final void setBytes( long bytes ) { + public final void setBytes( long bytes ) { // TODO unused this.bytes = bytes; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java index 5e3fb124..82cc68eb 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java @@ -34,8 +34,8 @@ import org.apache.commons.bcel6.Constants; public final class ConstantMethodHandle extends Constant { private static final long serialVersionUID = -7875124116920198044L; - private int reference_kind; - private int reference_index; + private int reference_kind; // TODO could be final (setter unused) + private int reference_index; // TODO could be final (setter unused) /** @@ -96,7 +96,7 @@ public final class ConstantMethodHandle extends Constant { } - public void setReferenceKind(int reference_kind) { + public void setReferenceKind(int reference_kind) { // TODO unused this.reference_kind = reference_kind; } @@ -106,7 +106,7 @@ public final class ConstantMethodHandle extends Constant { } - public void setReferenceIndex(int reference_index) { + public void setReferenceIndex(int reference_index) { // TODO unused this.reference_index = reference_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java index e2e96134..7ea64b27 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantMethodType extends Constant { private static final long serialVersionUID = 6750768220616618881L; - private int descriptor_index; + private int descriptor_index; // TODO could be final (setter unused) /** @@ -93,7 +93,7 @@ public final class ConstantMethodType extends Constant { } - public void setDescriptorIndex(int descriptor_index) { + public void setDescriptorIndex(int descriptor_index) { // TODO unused this.descriptor_index = descriptor_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java index 141dbf87..8b84196c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java @@ -36,8 +36,8 @@ import org.apache.commons.bcel6.Constants; public final class ConstantNameAndType extends Constant { private static final long serialVersionUID = -7913354727264034451L; - private int name_index; // Name of field/method - private int signature_index; // and its signature. + private int name_index; // Name of field/method // TODO could be final (setter unused) + private int signature_index; // and its signature. // TODO could be final (setter unused) /** @@ -130,7 +130,7 @@ public final class ConstantNameAndType extends Constant { /** * @param name_index the name index of this constant */ - public final void setNameIndex( int name_index ) { + public final void setNameIndex( int name_index ) { // TODO unused this.name_index = name_index; } @@ -138,7 +138,7 @@ public final class ConstantNameAndType extends Constant { /** * @param signature_index the signature index in the constant pool of this type */ - public final void setSignatureIndex( int signature_index ) { + public final void setSignatureIndex( int signature_index ) { // TODO unused this.signature_index = signature_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java index 0063668b..b9c6b9f9 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantString extends Constant implements ConstantObject { private static final long serialVersionUID = 6603144389219397225L; - private int string_index; // Identical to ConstantClass except for this name + private int string_index; // Identical to ConstantClass except for this name // TODO could be final (setter unused) /** @@ -103,7 +103,7 @@ public final class ConstantString extends Constant implements ConstantObject { /** * @param string_index the index into the constant of the string value */ - public final void setStringIndex( int string_index ) { + public final void setStringIndex( int string_index ) { // TODO unused this.string_index = string_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java index 3bf2312a..0d14e9cd 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantValue extends Attribute { private static final long serialVersionUID = -5668999920978520157L; - private int constantvalue_index; + private int constantvalue_index; // TODO could be final (setter unused) /** @@ -111,7 +111,7 @@ public final class ConstantValue extends Attribute { /** * @param constantvalue_index the index info the constant pool of this constant value */ - public final void setConstantValueIndex( int constantvalue_index ) { + public final void setConstantValueIndex( int constantvalue_index ) { // TODO unused this.constantvalue_index = constantvalue_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java index 925484cf..bb688145 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class Deprecated extends Attribute { private static final long serialVersionUID = -2242528405240201000L; - private byte[] bytes; + private byte[] bytes; // TODO could be final (setter unused) /** @@ -118,7 +118,7 @@ public final class Deprecated extends Attribute { /** * @param bytes the raw bytes that represents this byte array */ - public final void setBytes( byte[] bytes ) { + public final void setBytes( byte[] bytes ) { // TODO unused this.bytes = bytes; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java index e27ad741..bd73bb48 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java @@ -34,7 +34,7 @@ public class EnclosingMethod extends Attribute { // Pointer to the CONSTANT_Class_info structure representing the // innermost class that encloses the declaration of the current class. - private int classIndex; + private int classIndex; // TODO could be final (setter unused) // If the current class is not immediately enclosed by a method or // constructor, then the value of the method_index item must be zero. @@ -44,7 +44,7 @@ public class EnclosingMethod extends Attribute { // to in the class_index. *It is the compiler responsibility* to // ensure that the method identified by this index is the closest // lexically enclosing method that includes the local/anonymous class. - private int methodIndex; + private int methodIndex; // TODO could be final (setter unused) // Ctors - and code to read an attribute in. EnclosingMethod(int nameIndex, int len, DataInput input, ConstantPool cpool) throws IOException { @@ -73,8 +73,8 @@ public class EnclosingMethod extends Attribute { public final int getEnclosingClassIndex() { return classIndex; } public final int getEnclosingMethodIndex(){ return methodIndex;} - public final void setEnclosingClassIndex(int idx) {classIndex = idx;} - public final void setEnclosingMethodIndex(int idx){methodIndex= idx;} + public final void setEnclosingClassIndex(int idx) {classIndex = idx;} // TODO unused + public final void setEnclosingMethodIndex(int idx){methodIndex= idx;} // TODO unused public final ConstantClass getEnclosingClass() { ConstantClass c = diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index 7fe21545..4106e909 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -33,6 +33,7 @@ import org.apache.commons.bcel6.Constants; public abstract class FieldOrMethod extends AccessFlags implements Cloneable, Node { private static final long serialVersionUID = -1833306330869469714L; + // TODO should be made private protected int name_index; // Points to field name in constant pool protected int signature_index; // Points to encoded signature protected Attribute[] attributes; // Collection of attributes @@ -162,7 +163,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No /** * @param name_index Index in constant pool of object's name. */ - public final void setNameIndex( int name_index ) { + public final void setNameIndex( int name_index ) { // TODO unused this.name_index = name_index; } @@ -178,7 +179,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No /** * @param signature_index Index in constant pool of field signature. */ - public final void setSignatureIndex( int signature_index ) { + public final void setSignatureIndex( int signature_index ) { // TODO unused this.signature_index = signature_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java index acfb9327..ac15582c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java @@ -36,10 +36,10 @@ import org.apache.commons.bcel6.Constants; public final class InnerClass implements Cloneable, Node, Serializable { private static final long serialVersionUID = -7200195918166127614L; - private int inner_class_index; - private int outer_class_index; - private int inner_name_index; - private int inner_access_flags; + private int inner_class_index; // TODO could be final (setter unused) + private int outer_class_index; // TODO could be final (setter unused) + private int inner_name_index; // TODO could be final (setter unused) + private int inner_access_flags; // TODO could be final (setter unused) /** @@ -138,7 +138,7 @@ public final class InnerClass implements Cloneable, Node, Serializable { /** * @param inner_access_flags access flags for this inner class */ - public final void setInnerAccessFlags( int inner_access_flags ) { + public final void setInnerAccessFlags( int inner_access_flags ) { // TODO unused this.inner_access_flags = inner_access_flags; } @@ -146,7 +146,7 @@ public final class InnerClass implements Cloneable, Node, Serializable { /** * @param inner_class_index index into the constant pool for this class */ - public final void setInnerClassIndex( int inner_class_index ) { + public final void setInnerClassIndex( int inner_class_index ) { // TODO unused this.inner_class_index = inner_class_index; } @@ -154,7 +154,7 @@ public final class InnerClass implements Cloneable, Node, Serializable { /** * @param inner_name_index index into the constant pool for this class's name */ - public final void setInnerNameIndex( int inner_name_index ) { + public final void setInnerNameIndex( int inner_name_index ) { // TODO unused this.inner_name_index = inner_name_index; } @@ -162,7 +162,7 @@ public final class InnerClass implements Cloneable, Node, Serializable { /** * @param outer_class_index index into the constant pool for the owning class */ - public final void setOuterClassIndex( int outer_class_index ) { + public final void setOuterClassIndex( int outer_class_index ) { // TODO unused this.outer_class_index = outer_class_index; } -- GitLab From 0889be66edfb4fefe6d4167e4a6dce91caf27551 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 17:25:51 +0000 Subject: [PATCH 0788/1313] Inline public setter that is otherwise unused git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695138 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/classfile/InnerClasses.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java index c973d0f7..d9ff4335 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java @@ -36,7 +36,7 @@ import org.apache.commons.bcel6.Constants; public final class InnerClasses extends Attribute { private static final long serialVersionUID = 4570147726361753700L; - private InnerClass[] inner_classes; + private InnerClass[] inner_classes; // TODO could be final (setter unused; would need to recode the copy method) /** @@ -57,7 +57,7 @@ public final class InnerClasses extends Attribute { public InnerClasses(int name_index, int length, InnerClass[] inner_classes, ConstantPool constant_pool) { super(Constants.ATTR_INNER_CLASSES, name_index, length, constant_pool); - setInnerClasses(inner_classes); + this.inner_classes = inner_classes != null ? inner_classes : new InnerClass[0]; } @@ -121,7 +121,7 @@ public final class InnerClasses extends Attribute { /** * @param inner_classes the array of inner classes */ - public final void setInnerClasses( InnerClass[] inner_classes ) { + public final void setInnerClasses( InnerClass[] inner_classes ) { // TODO unused this.inner_classes = inner_classes != null ? inner_classes : new InnerClass[0]; } @@ -144,6 +144,7 @@ public final class InnerClasses extends Attribute { */ @Override public Attribute copy( ConstantPool _constant_pool ) { + // TODO this could be recoded to use a lower level constructor after creating a copy of the inner classes InnerClasses c = (InnerClasses) clone(); c.inner_classes = new InnerClass[inner_classes.length]; for (int i = 0; i < inner_classes.length; i++) { -- GitLab From 661eb7285a02fc156f91932d4f936e871378253e Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 17:26:37 +0000 Subject: [PATCH 0789/1313] TODOs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695139 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/classfile/JavaClass.java | 4 ++-- .../org/apache/commons/bcel6/classfile/LineNumber.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index a387c0d9..a7d63c95 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -75,7 +75,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl static boolean debug = false; // Debugging on/off final static char sep = File.separatorChar; // directory separator - private static BCELComparator _cmp = new BCELComparator() { + private static BCELComparator _cmp = new BCELComparator() { // TODO could be final (setter unused) public boolean equals( Object o1, Object o2 ) { JavaClass THIS = (JavaClass) o1; @@ -886,7 +886,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param comparator Comparison strategy object */ - public static void setComparator( BCELComparator comparator ) { + public static void setComparator( BCELComparator comparator ) { // TODO unused _cmp = comparator; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java index c9fd10cd..4443dec4 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java @@ -36,10 +36,10 @@ public final class LineNumber implements Cloneable, Node, Serializable { private static final long serialVersionUID = 169537400672820016L; /** Program Counter (PC) corresponds to line */ - private short start_pc; + private short start_pc; // TODO could be final (setter unused) /** number in source file */ - private short line_number; + private short line_number; // TODO could be final (setter unused) /** * Initialize from another object. @@ -113,7 +113,7 @@ public final class LineNumber implements Cloneable, Node, Serializable { /** * @param line_number the source line number */ - public final void setLineNumber( int line_number ) { + public final void setLineNumber( int line_number ) { // TODO unused this.line_number = (short) line_number; } @@ -121,7 +121,7 @@ public final class LineNumber implements Cloneable, Node, Serializable { /** * @param start_pc the pc for this line number */ - public final void setStartPC( int start_pc ) { + public final void setStartPC( int start_pc ) { // TODO unused this.start_pc = (short) start_pc; } -- GitLab From bf5d87dd0d8e8fbbdd8d47a4eb1e896bdef04ba1 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 17:27:12 +0000 Subject: [PATCH 0790/1313] TODOs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695140 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/LocalVariable.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java index 8b6252e1..2074c362 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java @@ -183,7 +183,7 @@ public final class LocalVariable implements Constants, Cloneable, Node, Serializ /** * @param constant_pool Constant pool to be used for this object. */ - public final void setConstantPool( ConstantPool constant_pool ) { + public final void setConstantPool( ConstantPool constant_pool ) { // TODO unused this.constant_pool = constant_pool; } @@ -191,7 +191,7 @@ public final class LocalVariable implements Constants, Cloneable, Node, Serializ /** * @param length the length of this local variable */ - public final void setLength( int length ) { + public final void setLength( int length ) { // TODO unused this.length = length; } @@ -199,7 +199,7 @@ public final class LocalVariable implements Constants, Cloneable, Node, Serializ /** * @param name_index the index into the constant pool for the name of this variable */ - public final void setNameIndex( int name_index ) { + public final void setNameIndex( int name_index ) { // TODO unused this.name_index = name_index; } @@ -207,7 +207,7 @@ public final class LocalVariable implements Constants, Cloneable, Node, Serializ /** * @param signature_index the index into the constant pool for the signature of this variable */ - public final void setSignatureIndex( int signature_index ) { + public final void setSignatureIndex( int signature_index ) { // TODO unused this.signature_index = signature_index; } @@ -215,7 +215,7 @@ public final class LocalVariable implements Constants, Cloneable, Node, Serializ /** * @param index the index in the local variable table of this variable */ - public final void setIndex( int index ) { + public final void setIndex( int index ) { // TODO unused this.index = index; } @@ -223,7 +223,7 @@ public final class LocalVariable implements Constants, Cloneable, Node, Serializ /** * @param start_pc Specify range where the local variable is valid. */ - public final void setStartPC( int start_pc ) { + public final void setStartPC( int start_pc ) { // TODO unused this.start_pc = start_pc; } -- GitLab From 55e6b47470998ea0acd8e9dd53a4bb7099806e3f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 17:27:54 +0000 Subject: [PATCH 0791/1313] TODOs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695141 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/classfile/MethodParameter.java | 8 ++++---- .../apache/commons/bcel6/classfile/MethodParameters.java | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java index 17071908..2c0f47a9 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java @@ -35,10 +35,10 @@ public class MethodParameter implements Serializable, Cloneable { private static final long serialVersionUID = 6014494029439440326L; /** Index of the CONSTANT_Utf8_info structure in the constant_pool table representing the name of the parameter */ - private int name_index; + private int name_index; // TODO could be final (setter unused) /** The access flags */ - private int access_flags; + private int access_flags; // TODO could be final (setter unused) public MethodParameter() { } @@ -59,7 +59,7 @@ public class MethodParameter implements Serializable, Cloneable { return name_index; } - public void setNameIndex(int name_index) { + public void setNameIndex(int name_index) { // TODO unused this.name_index = name_index; } @@ -77,7 +77,7 @@ public class MethodParameter implements Serializable, Cloneable { return access_flags; } - public void setAccessFlags(int access_flags) { + public void setAccessFlags(int access_flags) { // TODO unused this.access_flags = access_flags; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java index fca8c586..0dd14bad 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java @@ -33,11 +33,10 @@ public class MethodParameters extends Attribute { private static final long serialVersionUID = 2500272580422360140L; - private MethodParameter[] parameters = new MethodParameter[0]; + private MethodParameter[] parameters = new MethodParameter[0]; // TODO could be final (setter unused) MethodParameters(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { super(Constants.ATTR_METHOD_PARAMETERS, name_index, length, constant_pool); - System.out.println("new MethodParameters"); int parameters_count = input.readUnsignedByte(); parameters = new MethodParameter[parameters_count]; @@ -50,7 +49,7 @@ public class MethodParameters extends Attribute { return parameters; } - public void setParameters(MethodParameter[] parameters) { + public void setParameters(MethodParameter[] parameters) { // TODO unused this.parameters = parameters; } -- GitLab From a7a3f9c3927f4e51bdabd738cadde7b12a50ed56 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 18:09:19 +0000 Subject: [PATCH 0792/1313] Javadoc git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695143 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/classfile/UnknownAttributeReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java b/src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java index c8ecabda..16863eea 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java @@ -36,7 +36,7 @@ public interface UnknownAttributeReader { * that represents the name of the attribute. * @param length The length of the data contained in the attribute. This is written * into the constant pool and should agree with what the factory expects the length to be. - * @param input This is the data input that the factory needs to read its data from. + * @param file This is the data input that the factory needs to read its data from. * @param constant_pool This is the constant pool associated with the Attribute that we are constructing. * * @return The user-defined AttributeReader should take this data and use -- GitLab From 136d8931860f6fd99584e75cca9053c2d5a30c2c Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 18:10:20 +0000 Subject: [PATCH 0793/1313] TODOs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695144 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/PMGClass.java | 8 ++++---- .../org/apache/commons/bcel6/classfile/Signature.java | 4 ++-- .../commons/bcel6/classfile/SimpleElementValue.java | 4 ++-- .../org/apache/commons/bcel6/classfile/SourceFile.java | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java index 0bf915f2..a2068b6c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java @@ -34,12 +34,12 @@ import org.apache.commons.bcel6.Constants; public final class PMGClass extends Attribute { private static final long serialVersionUID = -7075964153234211509L; - private int pmg_class_index, pmg_index; + private int pmg_class_index, pmg_index; // TODO could be final (setter unused) /** * Initialize from another object. Note that both objects use the same - * references (shallow copy). Use clone() for a physical copy. + * references (shallow copy). Use copy() for a physical copy. */ public PMGClass(PMGClass c) { this(c.getNameIndex(), c.getLength(), c.getPMGIndex(), c.getPMGClassIndex(), c @@ -114,7 +114,7 @@ public final class PMGClass extends Attribute { /** * @param pmg_class_index */ - public final void setPMGClassIndex( int pmg_class_index ) { + public final void setPMGClassIndex( int pmg_class_index ) { // TODO unused this.pmg_class_index = pmg_class_index; } @@ -130,7 +130,7 @@ public final class PMGClass extends Attribute { /** * @param pmg_index */ - public final void setPMGIndex( int pmg_index ) { + public final void setPMGIndex( int pmg_index ) { // TODO unused this.pmg_index = pmg_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java index 9a3bcc8d..cc4e94d2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class Signature extends Attribute { private static final long serialVersionUID = 5808807822688827177L; - private int signature_index; + private int signature_index; // TODO could be final (setter unused) /** @@ -111,7 +111,7 @@ public final class Signature extends Attribute { /** * @param signature_index the index info the constant pool of this signature */ - public final void setSignatureIndex( int signature_index ) { + public final void setSignatureIndex( int signature_index ) { // TODO unused this.signature_index = signature_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java index 4c9082ae..33cc8e7b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java @@ -27,7 +27,7 @@ import org.apache.commons.bcel6.Constants; */ public class SimpleElementValue extends ElementValue { - private int index; + private int index; // TODO could be final (setter unused) public SimpleElementValue(int type, int index, ConstantPool cpool) { @@ -43,7 +43,7 @@ public class SimpleElementValue extends ElementValue return index; } - public void setIndex(int index) + public void setIndex(int index) // TODO unused { this.index = index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java index c25c62c4..591ee7ce 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java @@ -36,7 +36,7 @@ import org.apache.commons.bcel6.Constants; public final class SourceFile extends Attribute { private static final long serialVersionUID = -804226255663222912L; - private int sourcefile_index; + private int sourcefile_index; // TODO could be final (setter unused) /** @@ -118,7 +118,7 @@ public final class SourceFile extends Attribute { /** * @param sourcefile_index */ - public final void setSourceFileIndex( int sourcefile_index ) { + public final void setSourceFileIndex( int sourcefile_index ) { // TODO unused this.sourcefile_index = sourcefile_index; } -- GitLab From 142ac0e90c0ead204dbe203b312d781cafba08c4 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 18:11:02 +0000 Subject: [PATCH 0794/1313] TODOs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695145 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java | 2 +- src/main/java/org/apache/commons/bcel6/classfile/Unknown.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java index 440bef4a..abfb6288 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java @@ -124,7 +124,7 @@ public final class Synthetic extends Attribute { /** * @param bytes */ - public final void setBytes( byte[] bytes ) { + public final void setBytes( byte[] bytes ) { // TODO unused this.bytes = bytes; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java index 099eb515..3aa84b72 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java @@ -150,7 +150,7 @@ public final class Unknown extends Attribute { /** * @param bytes the bytes to set */ - public final void setBytes( byte[] bytes ) { + public final void setBytes( byte[] bytes ) { // TODO unused this.bytes = bytes; } -- GitLab From 8636054e96a536ae8a14c8971111302c4e1a9391 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 18:12:30 +0000 Subject: [PATCH 0795/1313] Don't call overrideable methods from a constructor git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695146 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/classfile/StackMapEntry.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index 3b1f038e..018acf73 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -36,10 +36,10 @@ public final class StackMapEntry implements Cloneable, Serializable { private static final long serialVersionUID = 1L; - private int byte_code_offset; - private StackMapType[] types_of_locals; - private StackMapType[] types_of_stack_items; - private ConstantPool constant_pool; + private int byte_code_offset; // TODO could be final (setter unused) + private StackMapType[] types_of_locals; // TODO could be final (setter unused) + private StackMapType[] types_of_stack_items; // TODO could be final (setter unused) + private ConstantPool constant_pool; // TODO could be final (setter unused) /** @@ -70,8 +70,8 @@ public final class StackMapEntry implements Cloneable, Serializable { StackMapType[] types_of_locals, int number_of_stack_items, StackMapType[] types_of_stack_items, ConstantPool constant_pool) { this.byte_code_offset = byte_code_offset; - setTypesOfLocals(types_of_locals); - setTypesOfStackItems(types_of_stack_items); + this.types_of_locals = types_of_locals != null ? types_of_locals : new StackMapType[0]; + this.types_of_stack_items = types_of_stack_items != null ? types_of_stack_items : new StackMapType[0]; this.constant_pool = constant_pool; } @@ -127,7 +127,7 @@ public final class StackMapEntry implements Cloneable, Serializable { } - public void setByteCodeOffset( int b ) { + public void setByteCodeOffset( int b ) { // TODO unused byte_code_offset = b; } @@ -138,7 +138,7 @@ public final class StackMapEntry implements Cloneable, Serializable { @java.lang.Deprecated - public void setNumberOfLocals( int n ) { + public void setNumberOfLocals( int n ) { // TODO unused } @@ -147,7 +147,7 @@ public final class StackMapEntry implements Cloneable, Serializable { } - public void setTypesOfLocals( StackMapType[] types ) { + public void setTypesOfLocals( StackMapType[] types ) { // TODO unused types_of_locals = types != null ? types : new StackMapType[0]; } @@ -158,7 +158,7 @@ public final class StackMapEntry implements Cloneable, Serializable { @java.lang.Deprecated - public void setNumberOfStackItems( int n ) { + public void setNumberOfStackItems( int n ) { // TODO unused } @@ -212,7 +212,7 @@ public final class StackMapEntry implements Cloneable, Serializable { /** * @param constant_pool Constant pool to be used for this object. */ - public final void setConstantPool( ConstantPool constant_pool ) { + public final void setConstantPool( ConstantPool constant_pool ) { // TODO unused this.constant_pool = constant_pool; } } -- GitLab From d660fd1a1837f4ba9a426930169cec945d5af21c Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 18:13:18 +0000 Subject: [PATCH 0796/1313] Don't call overrideable methods from a constructor git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695147 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/classfile/StackMapTableEntry.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java index 47bc4f81..9a68b879 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java @@ -40,10 +40,10 @@ public final class StackMapTableEntry implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private final int frame_type; - private int byte_code_offset_delta; - private StackMapType[] types_of_locals; - private StackMapType[] types_of_stack_items; - private ConstantPool constant_pool; + private int byte_code_offset_delta; // TODO could be final (setter unused) + private StackMapType[] types_of_locals; // TODO could be final (setter unused) + private StackMapType[] types_of_stack_items; // TODO could be final (setter unused) + private ConstantPool constant_pool; // TODO could be final (setter unused) /** @@ -100,8 +100,8 @@ public final class StackMapTableEntry implements Cloneable, Serializable { StackMapType[] types_of_stack_items, ConstantPool constant_pool) { this.frame_type = tag; this.byte_code_offset_delta = byte_code_offset_delta; - setTypesOfLocals(types_of_locals); - setTypesOfStackItems(types_of_stack_items); + this.types_of_locals = types_of_locals != null ? types_of_locals : new StackMapType[0]; + this.types_of_stack_items = types_of_stack_items != null ? types_of_stack_items : new StackMapType[0]; this.constant_pool = constant_pool; } @@ -197,7 +197,7 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } - public void setByteCodeOffsetDelta( int b ) { + public void setByteCodeOffsetDelta( int b ) { // TODO unused byte_code_offset_delta = b; } @@ -212,7 +212,7 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } - public void setTypesOfLocals( StackMapType[] types ) { + public void setTypesOfLocals( StackMapType[] types ) { // TODO unused types_of_locals = types != null ? types : new StackMapType[0]; } @@ -227,7 +227,7 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } - public void setTypesOfStackItems( StackMapType[] types ) { + public void setTypesOfStackItems( StackMapType[] types ) { // TODO unused types_of_stack_items = types != null ? types : new StackMapType[0]; } -- GitLab From 86e7b6900b98aeb84cd50d54b47117faa65a4f1b Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 18:13:52 +0000 Subject: [PATCH 0797/1313] Don't call overrideable methods from a constructor git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695148 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/StackMapType.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java index 97b0a988..9dea699b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java @@ -51,9 +51,9 @@ public final class StackMapType implements Cloneable, Serializable { StackMapType(DataInput file, ConstantPool constant_pool) throws IOException { this(file.readByte(), -1, constant_pool); if (hasIndex()) { - setIndex(file.readShort()); + this.index = (int) file.readShort(); } - setConstantPool(constant_pool); + this.constant_pool = constant_pool; } @@ -62,13 +62,16 @@ public final class StackMapType implements Cloneable, Serializable { * @param index index to constant pool, or byte code offset */ public StackMapType(byte type, int index, ConstantPool constant_pool) { - setType(type); - setIndex(index); - setConstantPool(constant_pool); + if ((type < Constants.ITEM_Bogus) || (type > Constants.ITEM_NewObject)) { + throw new RuntimeException("Illegal type for StackMapType: " + type); + } + this.type = type; + this.index = index; + this.constant_pool = constant_pool; } - public void setType( byte t ) { + public void setType( byte t ) { // TODO unused if ((t < Constants.ITEM_Bogus) || (t > Constants.ITEM_NewObject)) { throw new RuntimeException("Illegal type for StackMapType: " + t); } @@ -81,7 +84,7 @@ public final class StackMapType implements Cloneable, Serializable { } - public void setIndex( int t ) { + public void setIndex( int t ) { // TODO unused index = t; } @@ -161,7 +164,7 @@ public final class StackMapType implements Cloneable, Serializable { /** * @param constant_pool Constant pool to be used for this object. */ - public final void setConstantPool( ConstantPool constant_pool ) { + public final void setConstantPool( ConstantPool constant_pool ) { // TODO unused this.constant_pool = constant_pool; } } -- GitLab From 8fff1c94d19f5222206c0055bc0622c5bcb7593c Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 10 Aug 2015 18:14:56 +0000 Subject: [PATCH 0798/1313] Inline public setter code which is otherwise unused git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695149 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/classfile/LineNumberTable.java | 8 +++++--- .../commons/bcel6/classfile/LocalVariableTable.java | 4 ++-- .../commons/bcel6/classfile/LocalVariableTypeTable.java | 4 ++-- .../commons/bcel6/classfile/ParameterAnnotations.java | 6 +++--- .../java/org/apache/commons/bcel6/classfile/StackMap.java | 6 +++--- .../org/apache/commons/bcel6/classfile/StackMapTable.java | 6 +++--- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java index 7829cd2a..7a06fdad 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java @@ -37,7 +37,7 @@ public final class LineNumberTable extends Attribute { private static final long serialVersionUID = -6967221519632128904L; - private LineNumber[] line_number_table; // Table of line/numbers pairs + private LineNumber[] line_number_table; // Table of line/numbers pairs // TODO could be final (unused setter; copy() would need adjusting) /* @@ -58,7 +58,7 @@ public final class LineNumberTable extends Attribute { public LineNumberTable(int name_index, int length, LineNumber[] line_number_table, ConstantPool constant_pool) { super(Constants.ATTR_LINE_NUMBER_TABLE, name_index, length, constant_pool); - setLineNumberTable(line_number_table); + this.line_number_table = line_number_table; } @@ -120,7 +120,7 @@ public final class LineNumberTable extends Attribute { /** * @param line_number_table the line number entries for this table */ - public final void setLineNumberTable( LineNumber[] line_number_table ) { + public final void setLineNumberTable( LineNumber[] line_number_table ) { // TODO unused this.line_number_table = line_number_table; } @@ -197,6 +197,8 @@ public final class LineNumberTable extends Attribute { */ @Override public Attribute copy( ConstantPool _constant_pool ) { + // TODO could use the lower level constructor and thereby allow + // line_number_table to be made final LineNumberTable c = (LineNumberTable) clone(); c.line_number_table = new LineNumber[line_number_table.length]; for (int i = 0; i < line_number_table.length; i++) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java index 331413f7..fcbc92ac 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java @@ -56,7 +56,7 @@ public class LocalVariableTable extends Attribute { public LocalVariableTable(int name_index, int length, LocalVariable[] local_variable_table, ConstantPool constant_pool) { super(Constants.ATTR_LOCAL_VARIABLE_TABLE, name_index, length, constant_pool); - setLocalVariableTable(local_variable_table); + this.local_variable_table = local_variable_table; } @@ -157,7 +157,7 @@ public class LocalVariableTable extends Attribute { } - public final void setLocalVariableTable( LocalVariable[] local_variable_table ) { + public final void setLocalVariableTable( LocalVariable[] local_variable_table ) { // TODO unused this.local_variable_table = local_variable_table; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java index c48916cf..4348ae44 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java @@ -66,7 +66,7 @@ public class LocalVariableTypeTable extends Attribute { public LocalVariableTypeTable(int name_index, int length, LocalVariable[] local_variable_table, ConstantPool constant_pool) { super(Constants.ATTR_LOCAL_VARIABLE_TYPE_TABLE, name_index, length, constant_pool); - setLocalVariableTable(local_variable_table); + this.local_variable_type_table = local_variable_table; } LocalVariableTypeTable(int nameIdx, int len, DataInput input, ConstantPool cpool) throws IOException { @@ -108,7 +108,7 @@ public class LocalVariableTypeTable extends Attribute { return null; } - public final void setLocalVariableTable(LocalVariable[] local_variable_table) { + public final void setLocalVariableTable(LocalVariable[] local_variable_table) { // TODO unused this.local_variable_type_table = local_variable_table; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java index 588f2757..285fe51d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java @@ -33,7 +33,7 @@ public abstract class ParameterAnnotations extends Attribute { private static final long serialVersionUID = 5234607357644462705L; /** Table of parameter annotations */ - private ParameterAnnotationEntry[] parameter_annotation_table; + private ParameterAnnotationEntry[] parameter_annotation_table; // TODO could be final (setter unused) /** * @param parameter_annotation_type the subclass type of the parameter annotation @@ -64,7 +64,7 @@ public abstract class ParameterAnnotations extends Attribute { public ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, ParameterAnnotationEntry[] parameter_annotation_table, ConstantPool constant_pool) { super(parameter_annotation_type, name_index, length, constant_pool); - setParameterAnnotationTable(parameter_annotation_table); + this.parameter_annotation_table = parameter_annotation_table; } @@ -84,7 +84,7 @@ public abstract class ParameterAnnotations extends Attribute { /** * @param parameter_annotation_table the entries to set in this parameter annotation */ - public final void setParameterAnnotationTable(ParameterAnnotationEntry[] parameter_annotation_table ) { + public final void setParameterAnnotationTable(ParameterAnnotationEntry[] parameter_annotation_table ) { // TODO unused this.parameter_annotation_table = parameter_annotation_table; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java index 7b970334..cacfbbd7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java @@ -41,7 +41,7 @@ import org.apache.commons.bcel6.Constants; public final class StackMap extends Attribute { private static final long serialVersionUID = -6238662431726968495L; - private StackMapEntry[] map; // Table of stack map entries + private StackMapEntry[] map; // Table of stack map entries // TODO could be final (setter unused) /* @@ -52,7 +52,7 @@ public final class StackMap extends Attribute { */ public StackMap(int name_index, int length, StackMapEntry[] map, ConstantPool constant_pool) { super(Constants.ATTR_STACK_MAP, name_index, length, constant_pool); - setStackMap(map); + this.map = map; } @@ -102,7 +102,7 @@ public final class StackMap extends Attribute { /** * @param map Array of stack map entries */ - public final void setStackMap( StackMapEntry[] map ) { + public final void setStackMap( StackMapEntry[] map ) { // TODO unused this.map = map; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java index e24b2d23..cd944295 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java @@ -42,7 +42,7 @@ import org.apache.commons.bcel6.Constants; public final class StackMapTable extends Attribute { private static final long serialVersionUID = -5802191977296683162L; - private StackMapTableEntry[] map; // Table of stack map entries + private StackMapTableEntry[] map; // Table of stack map entries // TODO could be final (setter unused) /* @@ -53,7 +53,7 @@ public final class StackMapTable extends Attribute { */ public StackMapTable(int name_index, int length, StackMapTableEntry[] map, ConstantPool constant_pool) { super(Constants.ATTR_STACK_MAP_TABLE, name_index, length, constant_pool); - setStackMapTable(map); + this.map = map; } @@ -102,7 +102,7 @@ public final class StackMapTable extends Attribute { /** * @param map Array of stack map entries */ - public final void setStackMapTable( StackMapTableEntry[] map ) { + public final void setStackMapTable( StackMapTableEntry[] map ) { // TODO unused this.map = map; } -- GitLab From db1e301c394ee46980fcd0ca2aa790aa42509a60 Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Tue, 11 Aug 2015 05:02:42 +0000 Subject: [PATCH 0799/1313] reset BCEL pom for work on next 6.0-SNAPSHOT git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695207 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index fdd410b9..eaa125a1 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,7 @@ org.apache.commons commons-bcel6 jar - 6.1-SNAPSHOT + 6.0-SNAPSHOT Apache Commons BCEL Apache Commons Bytecode Engineering Library @@ -170,9 +170,9 @@ - scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/tags/BCEL_6_0_RC4 - scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/tags/BCEL_6_0_RC4 - http://svn.apache.org/repos/asf/commons/proper/bcel/tags/BCEL_6_0_RC4 + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk + http://svn.apache.org/repos/asf/commons/proper/bcel/trunk -- GitLab From 31799e060afc7998ac5421ab682633ec3568b3bc Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Tue, 11 Aug 2015 05:19:31 +0000 Subject: [PATCH 0800/1313] BCEL-226 FIx RAT messages git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695209 13f79535-47bb-0310-9956-ffa450edef68 --- LICENSE-header.txt | 15 --------------- src/assembly/bin.xml | 1 - .../tests/TestLegalInvokeInterface01.java | 17 +++++++++++++++++ .../tests/TestLegalInvokeSpecial01.java | 17 +++++++++++++++++ .../tests/TestLegalInvokeSpecial02.java | 17 +++++++++++++++++ .../verifier/tests/TestLegalInvokeStatic01.java | 17 +++++++++++++++++ .../tests/TestLegalInvokeVirtual01.java | 17 +++++++++++++++++ .../tests/TestLegalInvokeVirtual02.java | 17 +++++++++++++++++ 8 files changed, 102 insertions(+), 16 deletions(-) delete mode 100644 LICENSE-header.txt diff --git a/LICENSE-header.txt b/LICENSE-header.txt deleted file mode 100644 index 649b1ab6..00000000 --- a/LICENSE-header.txt +++ /dev/null @@ -1,15 +0,0 @@ -^/\*\*?\s*$ -^ \*\s*Licensed to the Apache Software Foundation \(ASF\) under one or more\s*$ -^ \*\s*contributor license agreements. See the NOTICE file distributed with\s*$ -^ \*\s*this work for additional information regarding copyright ownership.\s*$ -^ \*\s*The ASF licenses this file to You under the Apache License, Version 2.0\s*$ -^ \*\s*\(the \"License\"\); you may not use this file except in compliance with\s*$ -^ \*\s*the License. You may obtain a copy of the License at\s*$ -^ \*\s*$ -^ \*\s+http://www\.apache\.org/licenses/LICENSE-2\.0\s*$ -^ \*\s*$ -^ \*\s*Unless required by applicable law or agreed to in writing, software\s*$ -^ \*\s*distributed under the License is distributed on an "AS IS" BASIS,\s*$ -^ \*\s*WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\s*$ -^ \*\s*See the License for the specific language governing permissions and\s*$ -^ \*\s*limitations under the License.\s*$ \ No newline at end of file diff --git a/src/assembly/bin.xml b/src/assembly/bin.xml index a58c2e57..05d8661e 100644 --- a/src/assembly/bin.xml +++ b/src/assembly/bin.xml @@ -27,7 +27,6 @@ LICENSE.txt NOTICE.txt README.txt - RELEASE-NOTES.txt diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java index 131eac1c..183d2867 100755 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.commons.bcel6.verifier.tests; public class TestLegalInvokeInterface01{ diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial01.java index 5938ed33..df428a75 100755 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial01.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.commons.bcel6.verifier.tests; public class TestLegalInvokeSpecial01{ diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java index b8321ef5..6d26f1b5 100755 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.commons.bcel6.verifier.tests; abstract public class TestLegalInvokeSpecial02 implements Runnable{ diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeStatic01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeStatic01.java index 312f021a..927d8867 100755 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeStatic01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeStatic01.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.commons.bcel6.verifier.tests; public class TestLegalInvokeStatic01 extends Thread{ diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual01.java index 1b1a8228..a94066e2 100755 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual01.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.commons.bcel6.verifier.tests; public class TestLegalInvokeVirtual01 { diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java index fc663e1d..c9c2dc74 100755 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.commons.bcel6.verifier.tests; abstract public class TestLegalInvokeVirtual02 implements Runnable{ -- GitLab From 9cfeb74ab75780f1e0c2983905b7e217ddc530a9 Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Tue, 11 Aug 2015 05:20:39 +0000 Subject: [PATCH 0801/1313] BCEL-226 Fix RAT messages git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695210 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index eaa125a1..96b9992a 100644 --- a/pom.xml +++ b/pom.xml @@ -259,7 +259,6 @@ ${basedir}/checkstyle.xml false - ${basedir}/LICENSE-header.txt -- GitLab From 63b48c3d79633393951ab7ead5213f0046d2615c Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 11 Aug 2015 23:53:59 +0000 Subject: [PATCH 0802/1313] use StringBuilder correctly git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695412 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/classfile/StackMapTableEntry.java | 4 ++-- .../org/apache/commons/bcel6/generic/AnnotationEntryGen.java | 4 ++-- .../org/apache/commons/bcel6/generic/InstructionList.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java index 9a68b879..3a1baedf 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java @@ -161,11 +161,11 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { buf.append("SAME_LOCALS_1_STACK_EXTENDED"); } else if (frame_type >= Constants.CHOP_FRAME && frame_type <= Constants.CHOP_FRAME_MAX) { - buf.append("CHOP "+(251-frame_type)); + buf.append("CHOP ").append(String.valueOf(251-frame_type)); } else if (frame_type == Constants.SAME_FRAME_EXTENDED) { buf.append("SAME_EXTENDED"); } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { - buf.append("APPEND "+(frame_type-251)); + buf.append("APPEND ").append(String.valueOf(frame_type-251)); } else if (frame_type == Constants.FULL_FRAME) { buf.append("FULL"); } else { diff --git a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java index 2233f5b2..5f0c8d4f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java @@ -156,7 +156,7 @@ public class AnnotationEntryGen { @Override public String toString() { StringBuilder s = new StringBuilder(32); - s.append("AnnotationGen:[" + getTypeName() + " #" + evs.size() + " {"); + s.append("AnnotationGen:[").append(getTypeName()).append(" #").append(evs.size()).append(" {"); for (int i = 0; i < evs.size(); i++) { s.append(evs.get(i)); if (i + 1 < evs.size()) { @@ -169,7 +169,7 @@ public class AnnotationEntryGen { public String toShortString() { StringBuilder s = new StringBuilder(); - s.append("@" + getTypeName() + "("); + s.append("@").append(getTypeName()).append("("); for (int i = 0; i < evs.size(); i++) { s.append(evs.get(i)); if (i + 1 < evs.size()) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java index cc0b9a4b..3abb85ac 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java @@ -718,7 +718,7 @@ public class InstructionList implements Serializable { length--; if (ih.hasTargeters()) { // Still got targeters? target_vec.add(ih); - buf.append(ih.toString(true) + " "); + buf.append(ih.toString(true)).append(" "); ih.next = ih.prev = null; } else { ih.dispose(); -- GitLab From f285bca8766093a912e0c118417fc268823aac96 Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 12 Aug 2015 00:03:14 +0000 Subject: [PATCH 0803/1313] the developer svn url starts with https: git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695413 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 96b9992a..b8b6fa2c 100644 --- a/pom.xml +++ b/pom.xml @@ -171,7 +171,7 @@ scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk - scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk + scm:svn:https://svn.apache.org/repos/asf/commons/proper/bcel/trunk http://svn.apache.org/repos/asf/commons/proper/bcel/trunk -- GitLab From fef71e3c880f8f3c04121481948f790f8531e7ce Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Wed, 12 Aug 2015 01:02:39 +0000 Subject: [PATCH 0804/1313] BCEL-227 @author tags should be removed. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695415 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/HelloWorldBuilder.java | 1 - src/examples/JasminVisitor.java | 1 - src/examples/Mini/ASTFactor.java | 1 - src/examples/Mini/ASTFunAppl.java | 1 - src/examples/Mini/ASTFunDecl.java | 1 - src/examples/Mini/ASTIdent.java | 1 - src/examples/Mini/ASTIfExpr.java | 1 - src/examples/Mini/ASTInteger.java | 1 - src/examples/Mini/ASTLetExpr.java | 1 - src/examples/Mini/ASTProgram.java | 1 - src/examples/Mini/ASTTerm.java | 1 - src/examples/Mini/EnvEntry.java | 1 - src/examples/Mini/Environment.java | 1 - src/examples/Mini/Function.java | 1 - src/examples/Mini/SimpleNode.java | 1 - src/examples/Mini/Variable.java | 1 - src/examples/Package.java | 1 - src/examples/Peephole.java | 1 - src/examples/ProxyCreator.java | 1 - src/examples/TransitiveHull.java | 1 - src/examples/helloify.java | 1 - src/examples/id.java | 1 - src/examples/listclass.java | 1 - src/examples/maxstack.java | 1 - src/examples/patchclass.java | 1 - src/main/java/org/apache/commons/bcel6/Constants.java | 1 - src/main/java/org/apache/commons/bcel6/ExceptionConstants.java | 1 - src/main/java/org/apache/commons/bcel6/Repository.java | 1 - .../java/org/apache/commons/bcel6/classfile/AccessFlags.java | 1 - .../org/apache/commons/bcel6/classfile/AnnotationDefault.java | 1 - .../org/apache/commons/bcel6/classfile/AnnotationEntry.java | 1 - .../java/org/apache/commons/bcel6/classfile/Annotations.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/Attribute.java | 1 - .../org/apache/commons/bcel6/classfile/AttributeReader.java | 1 - .../apache/commons/bcel6/classfile/ClassFormatException.java | 1 - .../java/org/apache/commons/bcel6/classfile/ClassParser.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/Code.java | 1 - .../java/org/apache/commons/bcel6/classfile/CodeException.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/Constant.java | 1 - .../java/org/apache/commons/bcel6/classfile/ConstantCP.java | 1 - .../java/org/apache/commons/bcel6/classfile/ConstantClass.java | 1 - .../java/org/apache/commons/bcel6/classfile/ConstantDouble.java | 1 - .../org/apache/commons/bcel6/classfile/ConstantFieldref.java | 1 - .../java/org/apache/commons/bcel6/classfile/ConstantFloat.java | 1 - .../org/apache/commons/bcel6/classfile/ConstantInteger.java | 1 - .../commons/bcel6/classfile/ConstantInterfaceMethodref.java | 1 - .../java/org/apache/commons/bcel6/classfile/ConstantLong.java | 1 - .../org/apache/commons/bcel6/classfile/ConstantMethodref.java | 1 - .../org/apache/commons/bcel6/classfile/ConstantNameAndType.java | 1 - .../java/org/apache/commons/bcel6/classfile/ConstantObject.java | 1 - .../java/org/apache/commons/bcel6/classfile/ConstantPool.java | 1 - .../java/org/apache/commons/bcel6/classfile/ConstantString.java | 1 - .../java/org/apache/commons/bcel6/classfile/ConstantUtf8.java | 1 - .../java/org/apache/commons/bcel6/classfile/ConstantValue.java | 1 - .../java/org/apache/commons/bcel6/classfile/Deprecated.java | 1 - .../org/apache/commons/bcel6/classfile/DescendingVisitor.java | 1 - .../java/org/apache/commons/bcel6/classfile/ElementValue.java | 1 - .../org/apache/commons/bcel6/classfile/ElementValuePair.java | 1 - .../java/org/apache/commons/bcel6/classfile/ExceptionTable.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/Field.java | 1 - .../java/org/apache/commons/bcel6/classfile/FieldOrMethod.java | 1 - .../java/org/apache/commons/bcel6/classfile/InnerClass.java | 1 - .../java/org/apache/commons/bcel6/classfile/InnerClasses.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java | 1 - .../java/org/apache/commons/bcel6/classfile/LineNumber.java | 1 - .../org/apache/commons/bcel6/classfile/LineNumberTable.java | 1 - .../java/org/apache/commons/bcel6/classfile/LocalVariable.java | 1 - .../org/apache/commons/bcel6/classfile/LocalVariableTable.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/Method.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/Node.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java | 1 - .../commons/bcel6/classfile/ParameterAnnotationEntry.java | 1 - .../apache/commons/bcel6/classfile/ParameterAnnotations.java | 1 - .../commons/bcel6/classfile/RuntimeInvisibleAnnotations.java | 1 - .../bcel6/classfile/RuntimeInvisibleParameterAnnotations.java | 1 - .../commons/bcel6/classfile/RuntimeVisibleAnnotations.java | 1 - .../bcel6/classfile/RuntimeVisibleParameterAnnotations.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/Signature.java | 1 - .../java/org/apache/commons/bcel6/classfile/SourceFile.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/StackMap.java | 1 - .../java/org/apache/commons/bcel6/classfile/StackMapEntry.java | 1 - .../java/org/apache/commons/bcel6/classfile/StackMapTable.java | 1 - .../org/apache/commons/bcel6/classfile/StackMapTableEntry.java | 1 - .../java/org/apache/commons/bcel6/classfile/StackMapType.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/Unknown.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/Utility.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/Visitor.java | 1 - src/main/java/org/apache/commons/bcel6/generic/AALOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/AASTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ALOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ARETURN.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ASTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ATHROW.java | 1 - .../org/apache/commons/bcel6/generic/AllocationInstruction.java | 1 - .../org/apache/commons/bcel6/generic/ArithmeticInstruction.java | 1 - .../java/org/apache/commons/bcel6/generic/ArrayInstruction.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ArrayType.java | 1 - src/main/java/org/apache/commons/bcel6/generic/BALOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/BASTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java | 1 - src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java | 1 - src/main/java/org/apache/commons/bcel6/generic/BasicType.java | 1 - .../java/org/apache/commons/bcel6/generic/BranchHandle.java | 1 - .../org/apache/commons/bcel6/generic/BranchInstruction.java | 1 - src/main/java/org/apache/commons/bcel6/generic/CALOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/CASTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java | 1 - .../java/org/apache/commons/bcel6/generic/CPInstruction.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ClassGen.java | 1 - .../org/apache/commons/bcel6/generic/ClassGenException.java | 1 - .../java/org/apache/commons/bcel6/generic/ClassObserver.java | 1 - .../java/org/apache/commons/bcel6/generic/CodeExceptionGen.java | 1 - .../org/apache/commons/bcel6/generic/CompoundInstruction.java | 1 - .../java/org/apache/commons/bcel6/generic/ConstantPoolGen.java | 1 - .../apache/commons/bcel6/generic/ConstantPushInstruction.java | 1 - .../org/apache/commons/bcel6/generic/ConversionInstruction.java | 1 - src/main/java/org/apache/commons/bcel6/generic/D2F.java | 1 - src/main/java/org/apache/commons/bcel6/generic/D2I.java | 1 - src/main/java/org/apache/commons/bcel6/generic/D2L.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DADD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DALOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DASTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DCMPG.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DCMPL.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DCONST.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DDIV.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DLOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DMUL.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DNEG.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DREM.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DRETURN.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DSTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DSUB.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DUP.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DUP2.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java | 1 - .../java/org/apache/commons/bcel6/generic/EmptyVisitor.java | 1 - .../java/org/apache/commons/bcel6/generic/ExceptionThrower.java | 1 - src/main/java/org/apache/commons/bcel6/generic/F2D.java | 1 - src/main/java/org/apache/commons/bcel6/generic/F2I.java | 1 - src/main/java/org/apache/commons/bcel6/generic/F2L.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FADD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FALOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FASTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FCMPG.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FCMPL.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FCONST.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FDIV.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FLOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FMUL.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FNEG.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FREM.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FRETURN.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FSTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FSUB.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FieldGen.java | 1 - .../org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java | 1 - .../java/org/apache/commons/bcel6/generic/FieldInstruction.java | 1 - .../java/org/apache/commons/bcel6/generic/FieldObserver.java | 1 - .../java/org/apache/commons/bcel6/generic/FieldOrMethod.java | 1 - src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java | 1 - src/main/java/org/apache/commons/bcel6/generic/GOTO.java | 1 - src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java | 1 - .../java/org/apache/commons/bcel6/generic/GotoInstruction.java | 1 - src/main/java/org/apache/commons/bcel6/generic/I2B.java | 1 - src/main/java/org/apache/commons/bcel6/generic/I2C.java | 1 - src/main/java/org/apache/commons/bcel6/generic/I2D.java | 1 - src/main/java/org/apache/commons/bcel6/generic/I2F.java | 1 - src/main/java/org/apache/commons/bcel6/generic/I2L.java | 1 - src/main/java/org/apache/commons/bcel6/generic/I2S.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IADD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IALOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IAND.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IASTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ICONST.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IDIV.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IFEQ.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IFGE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IFGT.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IFLE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IFLT.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IFNE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IFNULL.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IINC.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ILOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IMUL.java | 1 - src/main/java/org/apache/commons/bcel6/generic/INEG.java | 1 - src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java | 1 - .../java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java | 1 - .../java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java | 1 - .../java/org/apache/commons/bcel6/generic/INVOKESTATIC.java | 1 - .../java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IOR.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IREM.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IRETURN.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ISHL.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ISHR.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ISTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ISUB.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IUSHR.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IXOR.java | 1 - .../java/org/apache/commons/bcel6/generic/IfInstruction.java | 1 - .../org/apache/commons/bcel6/generic/IndexedInstruction.java | 1 - src/main/java/org/apache/commons/bcel6/generic/Instruction.java | 1 - .../org/apache/commons/bcel6/generic/InstructionComparator.java | 1 - .../org/apache/commons/bcel6/generic/InstructionConstants.java | 1 - .../org/apache/commons/bcel6/generic/InstructionFactory.java | 1 - .../org/apache/commons/bcel6/generic/InstructionHandle.java | 1 - .../java/org/apache/commons/bcel6/generic/InstructionList.java | 1 - .../apache/commons/bcel6/generic/InstructionListObserver.java | 1 - .../org/apache/commons/bcel6/generic/InstructionTargeter.java | 1 - .../org/apache/commons/bcel6/generic/InvokeInstruction.java | 1 - src/main/java/org/apache/commons/bcel6/generic/JSR.java | 1 - src/main/java/org/apache/commons/bcel6/generic/JSR_W.java | 1 - .../java/org/apache/commons/bcel6/generic/JsrInstruction.java | 1 - src/main/java/org/apache/commons/bcel6/generic/L2D.java | 1 - src/main/java/org/apache/commons/bcel6/generic/L2F.java | 1 - src/main/java/org/apache/commons/bcel6/generic/L2I.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LADD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LALOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LAND.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LASTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LCMP.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LCONST.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LDC.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LDC_W.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LDIV.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LLOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LMUL.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LNEG.java | 1 - .../java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LOR.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LREM.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LRETURN.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LSHL.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LSHR.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LSTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LSUB.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LUSHR.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LXOR.java | 1 - .../java/org/apache/commons/bcel6/generic/LineNumberGen.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LoadClass.java | 1 - .../java/org/apache/commons/bcel6/generic/LoadInstruction.java | 1 - .../java/org/apache/commons/bcel6/generic/LocalVariableGen.java | 1 - .../apache/commons/bcel6/generic/LocalVariableInstruction.java | 1 - .../java/org/apache/commons/bcel6/generic/MONITORENTER.java | 1 - src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java | 1 - .../java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java | 1 - src/main/java/org/apache/commons/bcel6/generic/MethodGen.java | 2 -- .../java/org/apache/commons/bcel6/generic/MethodObserver.java | 1 - src/main/java/org/apache/commons/bcel6/generic/NEW.java | 1 - src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java | 1 - src/main/java/org/apache/commons/bcel6/generic/NOP.java | 1 - .../apache/commons/bcel6/generic/NameSignatureInstruction.java | 1 - .../java/org/apache/commons/bcel6/generic/NamedAndTyped.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ObjectType.java | 1 - src/main/java/org/apache/commons/bcel6/generic/POP.java | 1 - src/main/java/org/apache/commons/bcel6/generic/POP2.java | 1 - src/main/java/org/apache/commons/bcel6/generic/PUSH.java | 1 - src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java | 1 - .../java/org/apache/commons/bcel6/generic/PopInstruction.java | 1 - .../java/org/apache/commons/bcel6/generic/PushInstruction.java | 1 - src/main/java/org/apache/commons/bcel6/generic/RET.java | 1 - src/main/java/org/apache/commons/bcel6/generic/RETURN.java | 1 - .../java/org/apache/commons/bcel6/generic/ReferenceType.java | 1 - .../org/apache/commons/bcel6/generic/ReturnInstruction.java | 1 - .../org/apache/commons/bcel6/generic/ReturnaddressType.java | 1 - src/main/java/org/apache/commons/bcel6/generic/SALOAD.java | 1 - src/main/java/org/apache/commons/bcel6/generic/SASTORE.java | 1 - src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java | 1 - src/main/java/org/apache/commons/bcel6/generic/SWAP.java | 1 - src/main/java/org/apache/commons/bcel6/generic/SWITCH.java | 1 - src/main/java/org/apache/commons/bcel6/generic/Select.java | 1 - .../java/org/apache/commons/bcel6/generic/StackConsumer.java | 1 - .../java/org/apache/commons/bcel6/generic/StackInstruction.java | 1 - .../java/org/apache/commons/bcel6/generic/StackProducer.java | 1 - .../java/org/apache/commons/bcel6/generic/StoreInstruction.java | 1 - src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java | 1 - .../org/apache/commons/bcel6/generic/TargetLostException.java | 1 - src/main/java/org/apache/commons/bcel6/generic/Type.java | 1 - .../java/org/apache/commons/bcel6/generic/TypedInstruction.java | 1 - .../org/apache/commons/bcel6/generic/UnconditionalBranch.java | 1 - .../apache/commons/bcel6/generic/VariableLengthInstruction.java | 1 - src/main/java/org/apache/commons/bcel6/generic/Visitor.java | 1 - src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java | 1 - src/main/java/org/apache/commons/bcel6/util/BCELComparator.java | 1 - src/main/java/org/apache/commons/bcel6/util/BCELFactory.java | 1 - src/main/java/org/apache/commons/bcel6/util/BCELifier.java | 1 - src/main/java/org/apache/commons/bcel6/util/ByteSequence.java | 1 - src/main/java/org/apache/commons/bcel6/util/Class2HTML.java | 1 - src/main/java/org/apache/commons/bcel6/util/ClassLoader.java | 1 - .../org/apache/commons/bcel6/util/ClassLoaderRepository.java | 2 -- src/main/java/org/apache/commons/bcel6/util/ClassPath.java | 1 - src/main/java/org/apache/commons/bcel6/util/ClassQueue.java | 1 - src/main/java/org/apache/commons/bcel6/util/ClassSet.java | 1 - src/main/java/org/apache/commons/bcel6/util/ClassStack.java | 1 - src/main/java/org/apache/commons/bcel6/util/ClassVector.java | 1 - src/main/java/org/apache/commons/bcel6/util/CodeHTML.java | 1 - src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java | 1 - .../java/org/apache/commons/bcel6/util/InstructionFinder.java | 1 - src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java | 1 - src/main/java/org/apache/commons/bcel6/util/MethodHTML.java | 1 - src/main/java/org/apache/commons/bcel6/util/Repository.java | 2 -- .../java/org/apache/commons/bcel6/util/SyntheticRepository.java | 2 -- .../org/apache/commons/bcel6/verifier/GraphicalVerifier.java | 1 - .../java/org/apache/commons/bcel6/verifier/NativeVerifier.java | 1 - .../java/org/apache/commons/bcel6/verifier/PassVerifier.java | 1 - .../java/org/apache/commons/bcel6/verifier/TransitiveHull.java | 1 - .../org/apache/commons/bcel6/verifier/VerificationResult.java | 1 - src/main/java/org/apache/commons/bcel6/verifier/Verifier.java | 1 - .../org/apache/commons/bcel6/verifier/VerifierAppFrame.java | 1 - .../java/org/apache/commons/bcel6/verifier/VerifierFactory.java | 1 - .../apache/commons/bcel6/verifier/VerifierFactoryListModel.java | 1 - .../apache/commons/bcel6/verifier/VerifierFactoryObserver.java | 1 - .../java/org/apache/commons/bcel6/verifier/VerifyDialog.java | 1 - .../commons/bcel6/verifier/exc/AssertionViolatedException.java | 1 - .../commons/bcel6/verifier/exc/ClassConstraintException.java | 1 - .../commons/bcel6/verifier/exc/CodeConstraintException.java | 1 - .../commons/bcel6/verifier/exc/InvalidMethodException.java | 1 - .../commons/bcel6/verifier/exc/LinkingConstraintException.java | 1 - .../org/apache/commons/bcel6/verifier/exc/LoadingException.java | 1 - .../verifier/exc/LocalVariableInfoInconsistentException.java | 1 - .../bcel6/verifier/exc/StaticCodeConstraintException.java | 1 - .../verifier/exc/StaticCodeInstructionConstraintException.java | 1 - .../exc/StaticCodeInstructionOperandConstraintException.java | 1 - .../bcel6/verifier/exc/StructuralCodeConstraintException.java | 1 - .../java/org/apache/commons/bcel6/verifier/exc/Utility.java | 1 - .../commons/bcel6/verifier/exc/VerificationException.java | 1 - .../bcel6/verifier/exc/VerifierConstraintViolatedException.java | 1 - .../org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java | 1 - .../java/org/apache/commons/bcel6/verifier/statics/IntList.java | 1 - .../org/apache/commons/bcel6/verifier/statics/LONG_Upper.java | 1 - .../commons/bcel6/verifier/statics/LocalVariableInfo.java | 1 - .../commons/bcel6/verifier/statics/LocalVariablesInfo.java | 1 - .../apache/commons/bcel6/verifier/statics/Pass1Verifier.java | 1 - .../apache/commons/bcel6/verifier/statics/Pass2Verifier.java | 1 - .../apache/commons/bcel6/verifier/statics/Pass3aVerifier.java | 1 - .../commons/bcel6/verifier/statics/StringRepresentation.java | 1 - .../commons/bcel6/verifier/structurals/ControlFlowGraph.java | 1 - .../commons/bcel6/verifier/structurals/ExceptionHandler.java | 1 - .../commons/bcel6/verifier/structurals/ExceptionHandlers.java | 1 - .../commons/bcel6/verifier/structurals/ExecutionVisitor.java | 1 - .../org/apache/commons/bcel6/verifier/structurals/Frame.java | 1 - .../apache/commons/bcel6/verifier/structurals/GenericArray.java | 1 - .../bcel6/verifier/structurals/InstConstraintVisitor.java | 1 - .../commons/bcel6/verifier/structurals/InstructionContext.java | 1 - .../commons/bcel6/verifier/structurals/LocalVariables.java | 1 - .../apache/commons/bcel6/verifier/structurals/OperandStack.java | 1 - .../commons/bcel6/verifier/structurals/Pass3bVerifier.java | 1 - .../apache/commons/bcel6/verifier/structurals/Subroutine.java | 1 - .../apache/commons/bcel6/verifier/structurals/Subroutines.java | 1 - .../bcel6/verifier/structurals/UninitializedObjectType.java | 1 - 373 files changed, 377 deletions(-) diff --git a/src/examples/HelloWorldBuilder.java b/src/examples/HelloWorldBuilder.java index 5c00cfe5..79419ad2 100644 --- a/src/examples/HelloWorldBuilder.java +++ b/src/examples/HelloWorldBuilder.java @@ -58,7 +58,6 @@ import org.apache.commons.bcel6.generic.Type; * } *
    * - * @author M. Dahm * @version $Id$ */ public class HelloWorldBuilder { diff --git a/src/examples/JasminVisitor.java b/src/examples/JasminVisitor.java index 06702a69..2e28f21b 100644 --- a/src/examples/JasminVisitor.java +++ b/src/examples/JasminVisitor.java @@ -55,7 +55,6 @@ import org.apache.commons.bcel6.generic.TABLESWITCH; * Disassemble Java class object into the * Jasmin format. * - * @author M. Dahm * @version $Id$ */ public class JasminVisitor extends org.apache.commons.bcel6.classfile.EmptyVisitor { diff --git a/src/examples/Mini/ASTFactor.java b/src/examples/Mini/ASTFactor.java index b6325d56..3447b4b9 100644 --- a/src/examples/Mini/ASTFactor.java +++ b/src/examples/Mini/ASTFactor.java @@ -23,7 +23,6 @@ package Mini; /** * * @version $Id$ - * @author M. Dahm */ public class ASTFactor extends ASTExpr { // Generated methods diff --git a/src/examples/Mini/ASTFunAppl.java b/src/examples/Mini/ASTFunAppl.java index b33e5f0b..8d75b916 100644 --- a/src/examples/Mini/ASTFunAppl.java +++ b/src/examples/Mini/ASTFunAppl.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.generic.Type; /** * * @version $Id$ - * @author M. Dahm */ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, org.apache.commons.bcel6.Constants { diff --git a/src/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java index a312aa3d..6ebcef43 100644 --- a/src/examples/Mini/ASTFunDecl.java +++ b/src/examples/Mini/ASTFunDecl.java @@ -46,7 +46,6 @@ import org.apache.commons.bcel6.util.InstructionFinder; /** * * @version $Id$ - * @author M. Dahm */ public class ASTFunDecl extends SimpleNode implements MiniParserTreeConstants, org.apache.commons.bcel6.Constants { diff --git a/src/examples/Mini/ASTIdent.java b/src/examples/Mini/ASTIdent.java index f64e9266..2a44bdd7 100644 --- a/src/examples/Mini/ASTIdent.java +++ b/src/examples/Mini/ASTIdent.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.generic.PUSH; /** * * @version $Id$ - * @author M. Dahm */ public class ASTIdent extends ASTExpr implements org.apache.commons.bcel6.Constants { private String name; diff --git a/src/examples/Mini/ASTIfExpr.java b/src/examples/Mini/ASTIfExpr.java index 1361e60b..553fabed 100644 --- a/src/examples/Mini/ASTIfExpr.java +++ b/src/examples/Mini/ASTIfExpr.java @@ -30,7 +30,6 @@ import org.apache.commons.bcel6.generic.MethodGen; /** * * @version $Id$ - * @author M. Dahm */ public class ASTIfExpr extends ASTExpr implements org.apache.commons.bcel6.Constants { private ASTExpr if_expr, then_expr, else_expr; diff --git a/src/examples/Mini/ASTInteger.java b/src/examples/Mini/ASTInteger.java index 771f5e7f..3a466b6f 100644 --- a/src/examples/Mini/ASTInteger.java +++ b/src/examples/Mini/ASTInteger.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.generic.PUSH; /** * * @version $Id$ - * @author M. Dahm */ public class ASTInteger extends ASTExpr { private int value; diff --git a/src/examples/Mini/ASTLetExpr.java b/src/examples/Mini/ASTLetExpr.java index 0c43514f..fc04cca6 100644 --- a/src/examples/Mini/ASTLetExpr.java +++ b/src/examples/Mini/ASTLetExpr.java @@ -31,7 +31,6 @@ import org.apache.commons.bcel6.generic.Type; /** * * @version $Id$ - * @author M. Dahm */ public class ASTLetExpr extends ASTExpr implements org.apache.commons.bcel6.Constants { private ASTIdent[] idents; diff --git a/src/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java index 8cb74232..280b093e 100644 --- a/src/examples/Mini/ASTProgram.java +++ b/src/examples/Mini/ASTProgram.java @@ -43,7 +43,6 @@ import org.apache.commons.bcel6.generic.Type; * Root node of everything, direct children are nodes of type FunDecl * * @version $Id$ - * @author M. Dahm */ public class ASTProgram extends SimpleNode implements MiniParserConstants, MiniParserTreeConstants, org.apache.commons.bcel6.Constants { diff --git a/src/examples/Mini/ASTTerm.java b/src/examples/Mini/ASTTerm.java index 134d1207..3bccb8e0 100644 --- a/src/examples/Mini/ASTTerm.java +++ b/src/examples/Mini/ASTTerm.java @@ -23,7 +23,6 @@ package Mini; /** * * @version $Id$ - * @author M. Dahm */ public class ASTTerm extends ASTExpr { // Generated methods diff --git a/src/examples/Mini/EnvEntry.java b/src/examples/Mini/EnvEntry.java index 4e0e51bb..cb029623 100644 --- a/src/examples/Mini/EnvEntry.java +++ b/src/examples/Mini/EnvEntry.java @@ -21,7 +21,6 @@ package Mini; * Entry in environment. * * @version $Id$ - * @author M. Dahm */ public interface EnvEntry { public String getHashKey(); diff --git a/src/examples/Mini/Environment.java b/src/examples/Mini/Environment.java index ffa310bc..50628fb8 100644 --- a/src/examples/Mini/Environment.java +++ b/src/examples/Mini/Environment.java @@ -30,7 +30,6 @@ import java.util.Vector; * the maximum number of storable items is `SLOTS' * `SIZE'. * * @version $Id$ - * @author M. Dahm */ public class Environment implements Cloneable { private static final int SIZE = 127; // Prime number large enough for most cases diff --git a/src/examples/Mini/Function.java b/src/examples/Mini/Function.java index 380a83ec..4e3c154f 100644 --- a/src/examples/Mini/Function.java +++ b/src/examples/Mini/Function.java @@ -22,7 +22,6 @@ package Mini; * in the ASTIdent fields. * * @version $Id$ - * @author M. Dahm */ public class Function implements org.apache.commons.bcel6.Constants, EnvEntry { private ASTIdent name; // Reference to the original declaration diff --git a/src/examples/Mini/SimpleNode.java b/src/examples/Mini/SimpleNode.java index 2601aaac..5db45ea8 100644 --- a/src/examples/Mini/SimpleNode.java +++ b/src/examples/Mini/SimpleNode.java @@ -23,7 +23,6 @@ package Mini; /** * * @version $Id$ - * @author M. Dahm */ public abstract class SimpleNode implements Node { protected Node parent; diff --git a/src/examples/Mini/Variable.java b/src/examples/Mini/Variable.java index 1dbc3342..d1e2b309 100644 --- a/src/examples/Mini/Variable.java +++ b/src/examples/Mini/Variable.java @@ -22,7 +22,6 @@ import org.apache.commons.bcel6.generic.LocalVariableGen; * Represents a variable declared in a LET expression or a FUN declaration. * * @version $Id$ - * @author M. Dahm */ public class Variable implements EnvEntry { private ASTIdent name; // Reference to the original declaration diff --git a/src/examples/Package.java b/src/examples/Package.java index b3d9a1af..5a81031a 100644 --- a/src/examples/Package.java +++ b/src/examples/Package.java @@ -42,7 +42,6 @@ import org.apache.commons.bcel6.util.ClassPath; * * Use BCEL to extract class names and read/write classes * - * @author First Hop Ltd / Torsten Rueger */ public class Package { diff --git a/src/examples/Peephole.java b/src/examples/Peephole.java index c4bd3b4d..660f7d3d 100644 --- a/src/examples/Peephole.java +++ b/src/examples/Peephole.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.util.InstructionFinder; /** * Remove NOPs from given class * - * @author M. Dahm * @version $Id$ */ public class Peephole { diff --git a/src/examples/ProxyCreator.java b/src/examples/ProxyCreator.java index 8374342b..c55cdc4f 100644 --- a/src/examples/ProxyCreator.java +++ b/src/examples/ProxyCreator.java @@ -46,7 +46,6 @@ import org.apache.commons.bcel6.generic.Type; * comparable to the mechanism provided via * {@code java.lang.reflect.Proxy}, but much more flexible. * - * @author M. Dahm * @version $Id$ * @see org.apache.commons.bcel6.util.JavaWrapper * @see org.apache.commons.bcel6.util.ClassLoader diff --git a/src/examples/TransitiveHull.java b/src/examples/TransitiveHull.java index e774754b..cb2e2c7a 100644 --- a/src/examples/TransitiveHull.java +++ b/src/examples/TransitiveHull.java @@ -49,7 +49,6 @@ import org.apache.commons.bcel6.util.ClassSet; * You'll need Apache's regular expression library supplied together with BCEL * to use this class. * - * @author M. Dahm * @version $Id$ */ public class TransitiveHull extends org.apache.commons.bcel6.classfile.EmptyVisitor { diff --git a/src/examples/helloify.java b/src/examples/helloify.java index f1524e88..eba317c1 100644 --- a/src/examples/helloify.java +++ b/src/examples/helloify.java @@ -38,7 +38,6 @@ import org.apache.commons.bcel6.generic.PUSH; * Read class file(s) and patch all of its methods, so that they print * "hello" and their name and signature before doing anything else. * - * @author M. Dahm * @version $Id$ */ public final class helloify implements Constants { diff --git a/src/examples/id.java b/src/examples/id.java index 918bb0b2..b708d724 100644 --- a/src/examples/id.java +++ b/src/examples/id.java @@ -38,7 +38,6 @@ import org.apache.commons.bcel6.generic.MethodGen; * % diff foo bar | more *
      *
    - * @author M. Dahm
      * @version $Id$
      */
     public class id {
    diff --git a/src/examples/listclass.java b/src/examples/listclass.java
    index a60bf1dd..cd65e525 100644
    --- a/src/examples/listclass.java
    +++ b/src/examples/listclass.java
    @@ -75,7 +75,6 @@ import org.apache.commons.bcel6.classfile.Method;
      * dependents.  Do not analyze classes beginning with "java.", "javax.", or "sun."
      * 

    * - * @author M. Dahm, * Thomas Wheeler * @version $Id$ */ diff --git a/src/examples/maxstack.java b/src/examples/maxstack.java index 0eb51465..eb29924d 100644 --- a/src/examples/maxstack.java +++ b/src/examples/maxstack.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.generic.MethodGen; * Read class file(s) and examine all of its methods, determining the * maximum stack depth used by analyzing control flow. * - * @author M. Dahm * @version $Id$ */ public final class maxstack { diff --git a/src/examples/patchclass.java b/src/examples/patchclass.java index 03c16a8e..583009a9 100644 --- a/src/examples/patchclass.java +++ b/src/examples/patchclass.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * * Usage: patch files * - * @author M. Dahm * @version $Id$ */ public class patchclass { diff --git a/src/main/java/org/apache/commons/bcel6/Constants.java b/src/main/java/org/apache/commons/bcel6/Constants.java index 4ddd46c7..ba2f3bbd 100644 --- a/src/main/java/org/apache/commons/bcel6/Constants.java +++ b/src/main/java/org/apache/commons/bcel6/Constants.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6; * Constants for the project, mostly defined in the JVM specification. * * @version $Id$ - * @author M. Dahm */ public interface Constants { diff --git a/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java b/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java index 10347934..e2f4f9c8 100644 --- a/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6; * Exception constants. * * @version $Id$ - * @author E. Haase */ public interface ExceptionConstants { diff --git a/src/main/java/org/apache/commons/bcel6/Repository.java b/src/main/java/org/apache/commons/bcel6/Repository.java index 572b9099..26fc4d6f 100644 --- a/src/main/java/org/apache/commons/bcel6/Repository.java +++ b/src/main/java/org/apache/commons/bcel6/Repository.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.util.SyntheticRepository; * @see org.apache.commons.bcel6.util.SyntheticRepository * * @version $Id$ - * @author M. Dahm */ public abstract class Repository { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java index 80451aa5..d9a6cac5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java @@ -24,7 +24,6 @@ import org.apache.commons.bcel6.Constants; * I.e. classes, fields, and methods. * * @version $Id$ - * @author M. Dahm */ public abstract class AccessFlags implements java.io.Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java index 3f734c1a..8ec856d1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.Constants; /** * Represents the default value of a annotation for a method info * - * @author D. Brosius * @version $Id: AnnotationDefault 1 2005-02-13 03:15:08Z dbrosius $ * @since 6.0 */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java index 223bf51b..0d15914e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java @@ -31,7 +31,6 @@ import org.apache.commons.bcel6.Constants; * represents one annotation in the annotation table * * @version $Id: AnnotationEntry - * @author D. Brosius * @since 6.0 */ public class AnnotationEntry implements Node, Constants, Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java index de93cbdb..11ded979 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java @@ -25,7 +25,6 @@ import java.io.IOException; * base class for annotations * * @version $Id: Annotations - * @author D. Brosius * @since 6.0 */ public abstract class Annotations extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index 4a96a587..12c3a03f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -36,7 +36,6 @@ import org.apache.commons.bcel6.Constants; * attribute stands for non-standard-attributes. * * @version $Id$ - * @author M. Dahm * @see ConstantValue * @see SourceFile * @see Code diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java b/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java index ce4ece46..942dbec0 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java @@ -24,7 +24,6 @@ package org.apache.commons.bcel6.classfile; * @see Attribute * @version $Id$ - * @author M. Dahm * * @deprecated Use UnknownAttributeReader instead */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java b/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java index 5a18d096..f6eedcd2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.classfile; * class file. * * @version $Id$ - * @author M. Dahm */ public class ClassFormatException extends RuntimeException { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java b/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java index 567c6c50..ce210d12 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java @@ -40,7 +40,6 @@ import org.apache.commons.bcel6.Constants; * further details about the structure of a bytecode file. * * @version $Id$ - * @author M. Dahm */ public final class ClassParser { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Code.java b/src/main/java/org/apache/commons/bcel6/classfile/Code.java index 224ed96b..79b3fdbf 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Code.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Code.java @@ -36,7 +36,6 @@ import org.apache.commons.bcel6.Constants; * contains information about the local variables. * * @version $Id$ - * @author M. Dahm * @see Attribute * @see CodeException * @see LineNumberTable diff --git a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java index fad3f5b0..8cf72914 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java @@ -30,7 +30,6 @@ import org.apache.commons.bcel6.Constants; * particular exception handler is active. * * @version $Id$ - * @author M. Dahm * @see Code */ public final class CodeException implements Cloneable, Constants, Node, Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java index cfb382d7..a594cafe 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java @@ -31,7 +31,6 @@ import org.apache.commons.bcel6.util.BCELComparator; * the JVM specification. * * @version $Id$ - * @author M. Dahm */ public abstract class Constant implements Cloneable, Node, Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java index 45f7a553..cc4b2ea5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.Constants; * InvokeDynamic constants. * * @version $Id$ - * @author M. Dahm * @see ConstantFieldref * @see ConstantMethodref * @see ConstantInterfaceMethodref diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java index d2baf58f..6c3f3d66 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.Constants; * and represents a reference to a (external) class. * * @version $Id$ - * @author M. Dahm * @see Constant */ public final class ConstantClass extends Constant implements ConstantObject { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java index 21413bb7..a81cbde4 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.Constants; * and represents a reference to a Double object. * * @version $Id$ - * @author M. Dahm * @see Constant */ public final class ConstantDouble extends Constant implements ConstantObject { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java index 169e4bd4..b858c014 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.Constants; * This class represents a constant pool reference to a field. * * @version $Id$ - * @author M. Dahm */ public final class ConstantFieldref extends ConstantCP { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java index b7035b4d..6b364648 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.Constants; * and represents a reference to a float object. * * @version $Id$ - * @author M. Dahm * @see Constant */ public final class ConstantFloat extends Constant implements ConstantObject { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java index a9a8a3ef..77cb70fb 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.Constants; * and represents a reference to an int object. * * @version $Id$ - * @author M. Dahm * @see Constant */ public final class ConstantInteger extends Constant implements ConstantObject { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java index b5b5c14e..a7651526 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.Constants; * This class represents a constant pool reference to an interface method. * * @version $Id$ - * @author M. Dahm */ public final class ConstantInterfaceMethodref extends ConstantCP { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java index 8447c63b..a54a8253 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.Constants; * and represents a reference to a long object. * * @version $Id$ - * @author M. Dahm * @see Constant */ public final class ConstantLong extends Constant implements ConstantObject { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java index d04be767..b24c158f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.Constants; * This class represents a constant pool reference to a method. * * @version $Id$ - * @author M. Dahm */ public final class ConstantMethodref extends ConstantCP { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java index 8b84196c..1870b143 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java @@ -30,7 +30,6 @@ import org.apache.commons.bcel6.Constants; * of a field or method. * * @version $Id$ - * @author M. Dahm * @see Constant */ public final class ConstantNameAndType extends Constant { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantObject.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantObject.java index 7d825550..f5b47e3d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantObject.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantObject.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.classfile; * such as ConstantLong, ConstantString, etc.. * * @version $Id$ - * @author M. Dahm * @see Constant */ public interface ConstantObject { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java index dd798491..62dbadf6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java @@ -35,7 +35,6 @@ import org.apache.commons.bcel6.Constants; * @version $Id$ * @see Constant * @see org.apache.commons.bcel6.generic.ConstantPoolGen - * @author M. Dahm */ public class ConstantPool implements Cloneable, Node, Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java index b9c6b9f9..716adbd3 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.Constants; * and represents a reference to a String object. * * @version $Id$ - * @author M. Dahm * @see Constant */ public final class ConstantString extends Constant implements ConstantObject { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java index eb3316bd..81f1d8f7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.Constants; * and represents a reference to a Utf8 encoded string. * * @version $Id$ - * @author M. Dahm * @see Constant */ public final class ConstantUtf8 extends Constant { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java index 0d14e9cd..473e04e1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.Constants; * This class is instantiated by the Attribute.readAttribute() method. * * @version $Id$ - * @author M. Dahm * @see Attribute */ public final class ConstantValue extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java index bb688145..45577687 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.Constants; * It is instantiated from the Attribute.readAttribute() method. * * @version $Id$ - * @author M. Dahm * @see Attribute */ public final class Deprecated extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java index 80c0c627..3302a8fa 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java @@ -25,7 +25,6 @@ import java.util.Stack; * traversal strategy, other classes can make use of it. * * @version $Id$ - * @author M. Dahm */ public class DescendingVisitor implements Visitor { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java index 87413c64..1469cf5a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java @@ -23,7 +23,6 @@ import java.io.IOException; /** * @version $Id: ElementValue - * @author D. Brosius * @since 6.0 */ public abstract class ElementValue diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java b/src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java index c7477fcd..a945b8b6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.Constants; * an annotation's element value pair * * @version $Id: ElementValuePair - * @author D. Brosius * @since 6.0 */ public class ElementValuePair diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java index 44e0c38d..3895d7df 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.Constants; * with the other classes). * * @version $Id$ - * @author M. Dahm * @see Code */ public final class ExceptionTable extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Field.java b/src/main/java/org/apache/commons/bcel6/classfile/Field.java index eeb90c33..328c17e1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Field.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Field.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.util.BCELComparator; * for a variable in the class. See JVM specification for details. * * @version $Id$ - * @author M. Dahm */ public final class Field extends FieldOrMethod { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index 4106e909..9e6d08e3 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.Constants; * Abstract super class for fields and methods. * * @version $Id$ - * @author M. Dahm */ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, Node { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java index ac15582c..d7f1a497 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java @@ -30,7 +30,6 @@ import org.apache.commons.bcel6.Constants; * of the inner class. * * @version $Id$ - * @author M. Dahm * @see InnerClasses */ public final class InnerClass implements Cloneable, Node, Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java index d9ff4335..ad6cb4f0 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java @@ -30,7 +30,6 @@ import org.apache.commons.bcel6.Constants; * It is instantiated from the Attribute.readAttribute() method. * * @version $Id$ - * @author M. Dahm * @see Attribute */ public final class InnerClasses extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index a7d63c95..0b117020 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -45,7 +45,6 @@ import org.apache.commons.bcel6.util.SyntheticRepository; * @version $Id$ * @see org.apache.commons.bcel6.generic.ClassGen - * @author M. Dahm */ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparable { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java index 4443dec4..2b4f6336 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java @@ -28,7 +28,6 @@ import java.io.Serializable; * is used for debugging purposes. * * @version $Id$ - * @author M. Dahm * @see LineNumberTable */ public final class LineNumber implements Cloneable, Node, Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java index 7a06fdad..1b872d50 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.Constants; * contains pairs of PCs and line numbers. * * @version $Id$ - * @author M. Dahm * @see Code * @see LineNumber */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java index 2074c362..e64142a2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.Constants; * scope, name, signature and index on the method's frame. * * @version $Id$ - * @author M. Dahm * @see LocalVariableTable */ public final class LocalVariable implements Constants, Cloneable, Node, Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java index fcbc92ac..395d63df 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.Constants; * method. This attribute is contained in the Code attribute. * * @version $Id$ - * @author M. Dahm * @see Code * @see LocalVariable */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Method.java b/src/main/java/org/apache/commons/bcel6/classfile/Method.java index b95b7222..f3d98dff 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Method.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Method.java @@ -30,7 +30,6 @@ import org.apache.commons.bcel6.util.BCELComparator; * A method has access flags, a name, a signature and a number of attributes. * * @version $Id$ - * @author M. Dahm */ public final class Method extends FieldOrMethod { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Node.java b/src/main/java/org/apache/commons/bcel6/classfile/Node.java index adb35c73..ec59c705 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Node.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Node.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.classfile; * Denote class to have an accept method(); * * @version $Id$ - * @author M. Dahm */ public interface Node { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java index a2068b6c..01a9905f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.Constants; * to a PMG attribute. * * @version $Id$ - * @author M. Dahm * @see Attribute */ public final class PMGClass extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java index 23354b74..21acbdbf 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java @@ -30,7 +30,6 @@ import org.apache.commons.bcel6.Constants; * represents one parameter annotation in the parameter annotation table * * @version $Id: ParameterAnnotationEntry - * @author D. Brosius * @since 6.0 */ public class ParameterAnnotationEntry implements Node, Constants { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java index 285fe51d..e94fa936 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java @@ -25,7 +25,6 @@ import java.io.IOException; * base class for parameter annotations * * @version $Id: ParameterAnnotations - * @author D. Brosius * @since 6.0 */ public abstract class ParameterAnnotations extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java index 2b149c52..99b6dcdb 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.Constants; * provided to the JVM. * * @version $Id: RuntimeInvisibleAnnotations - * @author D. Brosius * @since 6.0 */ public class RuntimeInvisibleAnnotations extends Annotations diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java index 7d110aa1..3cff7e4d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.Constants; * but is not provided to the JVM. * * @version $Id: RuntimeInvisibleParameterAnnotations - * @author D. Brosius * @since 6.0 */ public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java index 930bb6d9..cf7d281f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.Constants; * provided to the JVM. * * @version $Id: RuntimeVisibleAnnotations - * @author D. Brosius * @since 6.0 */ public class RuntimeVisibleAnnotations extends Annotations diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java index 6feb5987..391388bd 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.Constants; * and is provided to the JVM. * * @version $Id: RuntimeVisibleParameterAnnotations - * @author D. Brosius * @since 6.0 */ public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java index cc4e94d2..c81e876b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.Constants; * to a GJ attribute. * * @version $Id$ - * @author M. Dahm * @see Attribute */ public final class Signature extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java index 591ee7ce..b3a9528b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java @@ -30,7 +30,6 @@ import org.apache.commons.bcel6.Constants; * instantiated from the Attribute.readAttribute() method. * * @version $Id$ - * @author M. Dahm * @see Attribute */ public final class SourceFile extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java index cacfbbd7..0074ac9c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java @@ -33,7 +33,6 @@ import org.apache.commons.bcel6.Constants; * �5.3.1.2 * * @version $Id$ - * @author M. Dahm * @see Code * @see StackMapEntry * @see StackMapType diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index 018acf73..c0841495 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -28,7 +28,6 @@ import java.io.Serializable; * See CLDC specification �5.3.1.2 * * @version $Id$ - * @author M. Dahm * @see StackMap * @see StackMapType */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java index cd944295..c1a3b7f6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java @@ -33,7 +33,6 @@ import org.apache.commons.bcel6.Constants; * ��?5.3.1.2 * * @version $Id$ - * @author M. Dahm * @see Code * @see StackMapEntry * @see StackMapType diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java index 3a1baedf..e38abe17 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java @@ -30,7 +30,6 @@ import org.apache.commons.bcel6.Constants; * See CLDC specification ��?5.3.1.2 * * @version $Id$ - * @author M. Dahm * @see StackMap * @see StackMapType * @since 6.0 diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java index 9dea699b..d6eda632 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.Constants; * used in the StackMap entries. * * @version $Id$ - * @author M. Dahm * @see StackMapEntry * @see StackMap * @see Constants diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java index abfb6288..061e0c4a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java @@ -33,7 +33,6 @@ import org.apache.commons.bcel6.Constants; * Attribute.readAttribute() method. * * @version $Id$ - * @author M. Dahm * @see Attribute */ public final class Synthetic extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java index 3aa84b72..935e5a8c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java @@ -37,7 +37,6 @@ import org.apache.commons.bcel6.Constants; * @version $Id$ * @see org.apache.commons.bcel6.classfile.Attribute * @see org.apache.commons.bcel6.classfile.UnknownAttributeReader - * @author M. Dahm */ public final class Unknown extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java index 2c7fabbc..62236b8d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java @@ -41,7 +41,6 @@ import org.apache.commons.bcel6.util.ByteSequence; * Utility functions that do not really belong to any class in particular. * * @version $Id$ - * @author M. Dahm */ public abstract class Utility { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java b/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java index 332f9139..2cb0dc09 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.classfile; * by calling the `accept' method which all classes have. * * @version $Id$ - * @author M. Dahm */ public interface Visitor { diff --git a/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java index 8a6f1065..89a1b0b6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index -> value
    * * @version $Id$ - * @author M. Dahm */ public class AALOAD extends ArrayInstruction implements StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java index c5f4e302..ee68a388 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index, value -> ...
    * * @version $Id$ - * @author M. Dahm */ public class AASTORE extends ArrayInstruction implements StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java b/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java index c4d63be0..a812a1b7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ... -> ..., null
    * * @version $Id$ - * @author M. Dahm */ public class ACONST_NULL extends Instruction implements PushInstruction, TypedInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java index 59a294be..cdba8167 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ... -> ..., objectref
    * * @version $Id$ - * @author M. Dahm */ public class ALOAD extends LoadInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java index e294eff2..54a7da80 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java @@ -24,7 +24,6 @@ import org.apache.commons.bcel6.ExceptionConstants; *
    Stack: ..., count -> ..., arrayref
    * * @version $Id$ - * @author M. Dahm */ public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower, StackConsumer, StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java b/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java index e0409c5b..38b3f79f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., objectref -> <empty>
    * * @version $Id$ - * @author M. Dahm */ public class ARETURN extends ReturnInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java b/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java index 5c38576b..be75944c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref -> ..., length
    * * @version $Id$ - * @author M. Dahm */ public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackProducer, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java index 05e31ac1..6f8614d1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack ..., objectref -> ... 
    * * @version $Id$ - * @author M. Dahm */ public class ASTORE extends StoreInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java b/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java index f21ff6f4..3da92a2c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., objectref -> objectref
    * * @version $Id$ - * @author M. Dahm */ public class ATHROW extends Instruction implements UnconditionalBranch, ExceptionThrower { diff --git a/src/main/java/org/apache/commons/bcel6/generic/AllocationInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/AllocationInstruction.java index dd4737b0..3dd25e35 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AllocationInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AllocationInstruction.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * Denote family of instructions that allocates space in the heap. * * @version $Id$ - * @author M. Dahm */ public interface AllocationInstruction { } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java index 98435e91..1ff67e00 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java @@ -23,7 +23,6 @@ import org.apache.commons.bcel6.Constants; * Super class for the family of arithmetic instructions. * * @version $Id$ - * @author M. Dahm */ public abstract class ArithmeticInstruction extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java index 37279b6e..89332e64 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * Super class for instructions dealing with array access such as IALOAD. * * @version $Id$ - * @author M. Dahm */ public abstract class ArrayInstruction extends Instruction implements ExceptionThrower, TypedInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java index 27a7f12f..c5167575 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java @@ -23,7 +23,6 @@ import org.apache.commons.bcel6.Constants; * Denotes array type, such as int[][] * * @version $Id$ - * @author M. Dahm */ public final class ArrayType extends ReferenceType { diff --git a/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java index 53be1bea..1e1095a8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index -> ..., value
    * * @version $Id$ - * @author M. Dahm */ public class BALOAD extends ArrayInstruction implements StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java index 42fea6f1..20a4b4d5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index, value -> ...
    * * @version $Id$ - * @author M. Dahm */ public class BASTORE extends ArrayInstruction implements StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java b/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java index 5ea7e96e..f768b5c1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.util.ByteSequence; *
    Stack: ... -> ..., value
    * * @version $Id$ - * @author M. Dahm */ public class BIPUSH extends Instruction implements ConstantPushInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java b/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java index ffe767e0..c7ca3633 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * BREAKPOINT, JVM dependent, ignored by default * * @version $Id$ - * @author M. Dahm */ public class BREAKPOINT extends Instruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java index 6782e663..700a8a60 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java @@ -23,7 +23,6 @@ import org.apache.commons.bcel6.Constants; * Denotes basic type such as int. * * @version $Id$ - * @author M. Dahm */ public final class BasicType extends Type { diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java index 69326e32..f31d7b65 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java @@ -27,7 +27,6 @@ package org.apache.commons.bcel6.generic; * @see Instruction * @see InstructionList * @version $Id$ - * @author M. Dahm */ public final class BranchHandle extends InstructionHandle { diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java index faa67670..11c28320 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.util.ByteSequence; * * @see InstructionList * @version $Id$ - * @author M. Dahm */ public abstract class BranchInstruction extends Instruction implements InstructionTargeter { diff --git a/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java index f581c753..3af3454d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index -> ..., value
    * * @version $Id$ - * @author M. Dahm */ public class CALOAD extends ArrayInstruction implements StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java index 1bc094f4..24f7ecb7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index, value -> ...
    * * @version $Id$ - * @author M. Dahm */ public class CASTORE extends ArrayInstruction implements StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java b/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java index 6d693966..c6c24a7f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java @@ -24,7 +24,6 @@ import org.apache.commons.bcel6.ExceptionConstants; *
    Stack: ..., objectref -> ..., objectref
    * * @version $Id$ - * @author M. Dahm */ public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThrower, StackProducer, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java index ab9cab1b..112597f3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java @@ -34,7 +34,6 @@ import org.apache.commons.bcel6.util.ByteSequence; * @see INVOKEVIRTUAL * * @version $Id$ - * @author M. Dahm */ public abstract class CPInstruction extends Instruction implements TypedInstruction, IndexedInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index 04fd6d46..e3479fed 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -40,7 +40,6 @@ import org.apache.commons.bcel6.util.BCELComparator; * * @see JavaClass * @version $Id$ - * @author M. Dahm */ public class ClassGen extends AccessFlags implements Cloneable { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java index 7376f86c..e28cc790 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * in the throws clause every time. * * @version $Id$ - * @author M. Dahm */ public class ClassGenException extends RuntimeException { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassObserver.java b/src/main/java/org/apache/commons/bcel6/generic/ClassObserver.java index 4410f1ae..eace1cbf 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassObserver.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassObserver.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * and register yourself with addObserver(). * * @version $Id$ - * @author M. Dahm */ public interface ClassObserver { diff --git a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java index 391be308..fbacb6d8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.classfile.CodeException; * getCodeException(), i.e., there is no difference semantically. * * @version $Id$ - * @author M. Dahm * @see MethodGen * @see CodeException * @see InstructionHandle diff --git a/src/main/java/org/apache/commons/bcel6/generic/CompoundInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/CompoundInstruction.java index 4ee94fb4..10aa3ac3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CompoundInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CompoundInstruction.java @@ -29,7 +29,6 @@ package org.apache.commons.bcel6.generic; * `templates' or `macros' for such reuseable code patterns. * * @version $Id$ - * @author M. Dahm * @see PUSH * @see SWITCH */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index 802e911c..e2cf7517 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -48,7 +48,6 @@ import org.apache.commons.bcel6.classfile.ConstantUtf8; * JVM and that Double and Long constants need two slots. * * @version $Id$ - * @author M. Dahm * @see Constant */ public class ConstantPoolGen implements java.io.Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPushInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPushInstruction.java index d9a73221..0ae15275 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPushInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPushInstruction.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * such as SIPUSH, BIPUSH, ICONST, etc. * * @version $Id$ - * @author M. Dahm * @see ICONST * @see SIPUSH diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java index d89fbed3..458bcd71 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java @@ -23,7 +23,6 @@ import org.apache.commons.bcel6.Constants; * Super class for the x2y family of instructions. * * @version $Id$ - * @author M. Dahm */ public abstract class ConversionInstruction extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/D2F.java b/src/main/java/org/apache/commons/bcel6/generic/D2F.java index e855adbc..a318d81e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/D2F.java +++ b/src/main/java/org/apache/commons/bcel6/generic/D2F.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value.word1, value.word2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class D2F extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/D2I.java b/src/main/java/org/apache/commons/bcel6/generic/D2I.java index 5db6d80e..3d6a4101 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/D2I.java +++ b/src/main/java/org/apache/commons/bcel6/generic/D2I.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value.word1, value.word2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class D2I extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/D2L.java b/src/main/java/org/apache/commons/bcel6/generic/D2L.java index 99cdefab..e0014845 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/D2L.java +++ b/src/main/java/org/apache/commons/bcel6/generic/D2L.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class D2L extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DADD.java b/src/main/java/org/apache/commons/bcel6/generic/DADD.java index 17cf2d21..d9e80795 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DADD.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; * ..., result.word1, result1.word2 * * @version $Id$ - * @author M. Dahm */ public class DADD extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java index 37f738b1..e4a4111a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class DALOAD extends ArrayInstruction implements StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java index 86cbb3f5..428fd973 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index, value.word1, value.word2 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class DASTORE extends ArrayInstruction implements StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java b/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java index fd0ece0d..20ff6cff 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class DCMPG extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java b/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java index e45178e3..448cbdfa 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1.word1, value1.word2, value2.word1, value2.word2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class DCMPL extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCONST.java b/src/main/java/org/apache/commons/bcel6/generic/DCONST.java index 2b01358f..5563381c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCONST.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ... -> ..., 
    * * @version $Id$ - * @author M. Dahm */ public class DCONST extends Instruction implements ConstantPushInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DDIV.java b/src/main/java/org/apache/commons/bcel6/generic/DDIV.java index 8ef835e3..6acb0cb7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DDIV.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm */ public class DDIV extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java b/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java index b9b45cd0..2141925a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack ... -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class DLOAD extends LoadInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DMUL.java b/src/main/java/org/apache/commons/bcel6/generic/DMUL.java index a397e6dd..c7dc321f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DMUL.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm */ public class DMUL extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DNEG.java b/src/main/java/org/apache/commons/bcel6/generic/DNEG.java index f78c6fd3..14340d31 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DNEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DNEG.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class DNEG extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DREM.java b/src/main/java/org/apache/commons/bcel6/generic/DREM.java index 09ec66fb..8ac0ace6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DREM.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm */ public class DREM extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java index 22182f52..6363cadb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value.word1, value.word2 -> <empty>
    * * @version $Id$ - * @author M. Dahm */ public class DRETURN extends ReturnInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java b/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java index de32d255..944ff41d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value.word1, value.word2 -> ... 
    * * @version $Id$ - * @author M. Dahm */ public class DSTORE extends StoreInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DSUB.java b/src/main/java/org/apache/commons/bcel6/generic/DSUB.java index c2d000b5..e25e5818 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DSUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DSUB.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm */ public class DSUB extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP.java b/src/main/java/org/apache/commons/bcel6/generic/DUP.java index 5309f58f..b0143657 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., word -> ..., word, word
    * * @version $Id$ - * @author M. Dahm */ public class DUP extends StackInstruction implements PushInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP2.java b/src/main/java/org/apache/commons/bcel6/generic/DUP2.java index 7bb85afa..73be322d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP2.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., word2, word1 -> ..., word2, word1, word2, word1
    * * @version $Id$ - * @author M. Dahm */ public class DUP2 extends StackInstruction implements PushInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java index 46a83784..57cb2ba7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., word3, word2, word1 -> ..., word2, word1, word3, word2, word1
    * * @version $Id$ - * @author M. Dahm */ public class DUP2_X1 extends StackInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java index 78c7b7ed..1e4ed2f8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., word4, word3, word2, word1 -> ..., word2, word1, word4, word3, word2, word1
    * * @version $Id$ - * @author M. Dahm */ public class DUP2_X2 extends StackInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java b/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java index 5364318c..e5396780 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., word2, word1 -> ..., word1, word2, word1
    * * @version $Id$ - * @author M. Dahm */ public class DUP_X1 extends StackInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java b/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java index 9659a646..c255a8b2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., word3, word2, word1 -> ..., word1, word3, word2, word1
    * * @version $Id$ - * @author M. Dahm */ public class DUP_X2 extends StackInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java b/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java index f843b181..1acb0911 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * Supplies empty method bodies to be overridden by subclasses. * * @version $Id$ - * @author M. Dahm */ public abstract class EmptyVisitor implements Visitor { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ExceptionThrower.java b/src/main/java/org/apache/commons/bcel6/generic/ExceptionThrower.java index fa995407..249ca27d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ExceptionThrower.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ExceptionThrower.java @@ -35,7 +35,6 @@ package org.apache.commons.bcel6.generic; * and "Error" objects. * * @version $Id$ - * @author Enver Haase */ public interface ExceptionThrower { diff --git a/src/main/java/org/apache/commons/bcel6/generic/F2D.java b/src/main/java/org/apache/commons/bcel6/generic/F2D.java index fcb9449c..f0f37276 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/F2D.java +++ b/src/main/java/org/apache/commons/bcel6/generic/F2D.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class F2D extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/F2I.java b/src/main/java/org/apache/commons/bcel6/generic/F2I.java index 58c36aba..36e2e1c5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/F2I.java +++ b/src/main/java/org/apache/commons/bcel6/generic/F2I.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class F2I extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/F2L.java b/src/main/java/org/apache/commons/bcel6/generic/F2L.java index 8883afdd..6b5820d8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/F2L.java +++ b/src/main/java/org/apache/commons/bcel6/generic/F2L.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class F2L extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FADD.java b/src/main/java/org/apache/commons/bcel6/generic/FADD.java index 8baba4fe..baff3217 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FADD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> result
    * * @version $Id$ - * @author M. Dahm */ public class FADD extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java index a16dae43..55226d98 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index -> ..., value
    * * @version $Id$ - * @author M. Dahm */ public class FALOAD extends ArrayInstruction implements StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java index a42300d7..e7a7c8bd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index, value -> ...
    * * @version $Id$ - * @author M. Dahm */ public class FASTORE extends ArrayInstruction implements StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java b/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java index 37ccb791..5adffa3d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class FCMPG extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java b/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java index 6c01d8b4..1d046076 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class FCMPL extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCONST.java b/src/main/java/org/apache/commons/bcel6/generic/FCONST.java index 17dc5190..1c9067c3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCONST.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ... -> ..., 
    * * @version $Id$ - * @author M. Dahm */ public class FCONST extends Instruction implements ConstantPushInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FDIV.java b/src/main/java/org/apache/commons/bcel6/generic/FDIV.java index ffd0398b..9c1eb9c8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FDIV.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> result
    * * @version $Id$ - * @author M. Dahm */ public class FDIV extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java b/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java index cf11b11e..4a048974 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack ... -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class FLOAD extends LoadInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FMUL.java b/src/main/java/org/apache/commons/bcel6/generic/FMUL.java index 17b3ed30..3a785a6d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FMUL.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> result
    * * @version $Id$ - * @author M. Dahm */ public class FMUL extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FNEG.java b/src/main/java/org/apache/commons/bcel6/generic/FNEG.java index 8081b311..ed1f0f6f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FNEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FNEG.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class FNEG extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FREM.java b/src/main/java/org/apache/commons/bcel6/generic/FREM.java index 0705df67..3bfd27ce 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FREM.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> result
    * * @version $Id$ - * @author M. Dahm */ public class FREM extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java index 18684c41..d1ea35d4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> <empty>
    * * @version $Id$ - * @author M. Dahm */ public class FRETURN extends ReturnInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java b/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java index 937dcf6d..b3acea55 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ... 
    * * @version $Id$ - * @author M. Dahm */ public class FSTORE extends StoreInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FSUB.java b/src/main/java/org/apache/commons/bcel6/generic/FSUB.java index 0f333584..7adbbfaa 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FSUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FSUB.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> result
    * * @version $Id$ - * @author M. Dahm */ public class FSUB extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index fa13a1a0..a7d8997c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -38,7 +38,6 @@ import org.apache.commons.bcel6.util.BCELComparator; * course be compatible with to the declared type). * * @version $Id$ - * @author M. Dahm * @see Field */ public class FieldGen extends FieldGenOrMethodGen { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java index 23deb14a..4e5a7c48 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.classfile.Attribute; * some methods in common! * * @version $Id$ - * @author M. Dahm */ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAndTyped, Cloneable { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java index ef12badd..800b224c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java @@ -23,7 +23,6 @@ import org.apache.commons.bcel6.classfile.ConstantPool; * Super class for the GET/PUTxxx family of instructions. * * @version $Id$ - * @author M. Dahm */ public abstract class FieldInstruction extends FieldOrMethod { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldObserver.java b/src/main/java/org/apache/commons/bcel6/generic/FieldObserver.java index 7ba1f6f2..2ab90b74 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldObserver.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldObserver.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * and register yourself with addObserver(). * * @version $Id$ - * @author M. Dahm */ public interface FieldObserver { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java index 1b52b6cc..9953a744 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java @@ -30,7 +30,6 @@ import org.apache.commons.bcel6.classfile.ConstantUtf8; * some methods in common! * * @version $Id$ - * @author M. Dahm */ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { diff --git a/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java b/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java index 5ea1586a..2329eb23 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.ExceptionConstants; *
    Stack: ..., objectref -> ..., value.word1, value.word2
    * * @version $Id$ - * @author M. Dahm */ public class GETFIELD extends FieldInstruction implements ExceptionThrower, StackConsumer, StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java index 730cb070..dce200cd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.ExceptionConstants; *
    Stack: ..., -> ..., value.word1, value.word2
    * * @version $Id$ - * @author M. Dahm */ public class GETSTATIC extends FieldInstruction implements PushInstruction, ExceptionThrower { diff --git a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java index 328bac70..d9d6376e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java @@ -24,7 +24,6 @@ import java.io.IOException; * GOTO - Branch always (to relative offset, not absolute address) * * @version $Id$ - * @author M. Dahm */ public class GOTO extends GotoInstruction implements VariableLengthInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java b/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java index 14209337..55706c7b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.util.ByteSequence; * GOTO_W - Branch always (to relative offset, not absolute address) * * @version $Id$ - * @author M. Dahm */ public class GOTO_W extends GotoInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java index eb2f60cc..006f2e44 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * Super class for GOTO * * @version $Id$ - * @author M. Dahm */ public abstract class GotoInstruction extends BranchInstruction implements UnconditionalBranch { diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2B.java b/src/main/java/org/apache/commons/bcel6/generic/I2B.java index 80ba9b0a..840ad31b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2B.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2B.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class I2B extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2C.java b/src/main/java/org/apache/commons/bcel6/generic/I2C.java index 04a24e40..efb43451 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2C.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2C.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class I2C extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2D.java b/src/main/java/org/apache/commons/bcel6/generic/I2D.java index 95e1def6..e93813a3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2D.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2D.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class I2D extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2F.java b/src/main/java/org/apache/commons/bcel6/generic/I2F.java index f2138ecc..2b103cc7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2F.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2F.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class I2F extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2L.java b/src/main/java/org/apache/commons/bcel6/generic/I2L.java index cb053d4f..2e4325f8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2L.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2L.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class I2L extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2S.java b/src/main/java/org/apache/commons/bcel6/generic/I2S.java index a556bc03..880fab0e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2S.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2S.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class I2S extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IADD.java b/src/main/java/org/apache/commons/bcel6/generic/IADD.java index 6101fdaa..3ebe79e6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IADD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> result
    * * @version $Id$ - * @author M. Dahm */ public class IADD extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java index 611e3a28..16db2092 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index -> ..., value
    * * @version $Id$ - * @author M. Dahm */ public class IALOAD extends ArrayInstruction implements StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IAND.java b/src/main/java/org/apache/commons/bcel6/generic/IAND.java index 5a3beb63..6af6aabc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IAND.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IAND.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class IAND extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java index 80e68419..81890b27 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index, value -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IASTORE extends ArrayInstruction implements StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ICONST.java b/src/main/java/org/apache/commons/bcel6/generic/ICONST.java index 679557dc..f0a9df22 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ICONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ICONST.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ... -> ..., 
    * * @version $Id$ - * @author M. Dahm */ public class ICONST extends Instruction implements ConstantPushInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IDIV.java b/src/main/java/org/apache/commons/bcel6/generic/IDIV.java index 0f90c463..0dfa5f80 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IDIV.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> result
    * * @version $Id$ - * @author M. Dahm */ public class IDIV extends ArithmeticInstruction implements ExceptionThrower { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java index 60a50379..b162b733 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IFEQ extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFGE.java b/src/main/java/org/apache/commons/bcel6/generic/IFGE.java index 1ed87ada..98234823 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFGE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFGE.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IFGE extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFGT.java b/src/main/java/org/apache/commons/bcel6/generic/IFGT.java index 8ace6475..02d111dc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFGT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFGT.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IFGT extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFLE.java b/src/main/java/org/apache/commons/bcel6/generic/IFLE.java index 8fc1e487..025a3436 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFLE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFLE.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IFLE extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFLT.java b/src/main/java/org/apache/commons/bcel6/generic/IFLT.java index e58e4e05..528f0bfc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFLT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFLT.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IFLT extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNE.java b/src/main/java/org/apache/commons/bcel6/generic/IFNE.java index a5f06888..828459fb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNE.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IFNE extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java b/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java index be016ce7..2f2b0cf7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., reference -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IFNONNULL extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java b/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java index 36f7e475..639f1604 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., reference -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IFNULL extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java index 1451b90f..11d9b274 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IF_ACMPEQ extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java index 4fee177f..9452735a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IF_ACMPNE extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java index 776c1e04..62689a94 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IF_ICMPEQ extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java index 73b4bb73..4165203f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IF_ICMPGE extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java index 04d31717..2125e4e6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IF_ICMPGT extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java index c8f4b97f..886ccb3f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IF_ICMPLE extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java index af8b1dcb..e2859876 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IF_ICMPLT extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java index b211f42c..41285363 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class IF_ICMPNE extends IfInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IINC.java b/src/main/java/org/apache/commons/bcel6/generic/IINC.java index 0f29088e..ac47f195 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IINC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IINC.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.util.ByteSequence; * IINC - Increment local variable by constant * * @version $Id$ - * @author M. Dahm */ public class IINC extends LocalVariableInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java b/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java index b517e55b..19878ba6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ... -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class ILOAD extends LoadInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java index 134689a0..3565639d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * IMPDEP1 - Implementation dependent * * @version $Id$ - * @author M. Dahm */ public class IMPDEP1 extends Instruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java index 86fd5786..f371e290 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * IMPDEP2 - Implementation dependent * * @version $Id$ - * @author M. Dahm */ public class IMPDEP2 extends Instruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IMUL.java b/src/main/java/org/apache/commons/bcel6/generic/IMUL.java index ef28ee0e..0f12eabc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IMUL.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> result
    * * @version $Id$ - * @author M. Dahm */ public class IMUL extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/INEG.java b/src/main/java/org/apache/commons/bcel6/generic/INEG.java index e0d1dc2b..a960d3fc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INEG.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class INEG extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java b/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java index 72cd6248..25cba7a1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., objectref -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThrower, StackProducer, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java index 77dae17d..7e21be54 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java @@ -30,7 +30,6 @@ import org.apache.commons.bcel6.util.ByteSequence; *
    Stack: ..., objectref, [arg1, [arg2 ...]] -> ...
    * * @version $Id$ - * @author M. Dahm */ public final class INVOKEINTERFACE extends InvokeInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java index 7df166ef..06082ce5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.ExceptionConstants; *
    Stack: ..., objectref, [arg1, [arg2 ...]] -> ...
    * * @version $Id$ - * @author M. Dahm */ public class INVOKESPECIAL extends InvokeInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java index cbbd0d34..c87509ba 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.ExceptionConstants; *
    Stack: ..., [arg1, [arg2 ...]] -> ...
    * * @version $Id$ - * @author M. Dahm */ public class INVOKESTATIC extends InvokeInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java index 8c7ab863..227c2d11 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.ExceptionConstants; *
    Stack: ..., objectref, [arg1, [arg2 ...]] -> ...
    * * @version $Id$ - * @author M. Dahm */ public class INVOKEVIRTUAL extends InvokeInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IOR.java b/src/main/java/org/apache/commons/bcel6/generic/IOR.java index a4f2cfaf..c37d52cb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IOR.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class IOR extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IREM.java b/src/main/java/org/apache/commons/bcel6/generic/IREM.java index aa25559d..055312c1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IREM.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> result
    * * @version $Id$ - * @author M. Dahm */ public class IREM extends ArithmeticInstruction implements ExceptionThrower { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java index b01d11e8..4de50d1c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> <empty>
    * * @version $Id$ - * @author M. Dahm */ public class IRETURN extends ReturnInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISHL.java b/src/main/java/org/apache/commons/bcel6/generic/ISHL.java index d2288a7d..57b9942d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ISHL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISHL.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class ISHL extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISHR.java b/src/main/java/org/apache/commons/bcel6/generic/ISHR.java index 98cb58cb..3b22a165 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ISHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISHR.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class ISHR extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java b/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java index 2f0884c2..99e45241 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value -> ... 
    * * @version $Id$ - * @author M. Dahm */ public class ISTORE extends StoreInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISUB.java b/src/main/java/org/apache/commons/bcel6/generic/ISUB.java index 5268e87e..da600d65 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ISUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISUB.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> result
    * * @version $Id$ - * @author M. Dahm */ public class ISUB extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java b/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java index ede2e9a1..adcca1ec 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class IUSHR extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IXOR.java b/src/main/java/org/apache/commons/bcel6/generic/IXOR.java index 579c4539..de56da7c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IXOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IXOR.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class IXOR extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java index 641ccb27..cf2f18c5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * Super class for the IFxxx family of instructions. * * @version $Id$ - * @author M. Dahm */ public abstract class IfInstruction extends BranchInstruction implements StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IndexedInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/IndexedInstruction.java index 50fd6044..02749f1f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IndexedInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IndexedInstruction.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * RET, CPInstruction, etc. * * @version $Id$ - * @author M. Dahm */ public interface IndexedInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java index fb7709fe..538bedbe 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.util.ByteSequence; * Abstract super class for all Java byte codes. * * @version $Id$ - * @author M. Dahm */ public abstract class Instruction implements Cloneable, Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java index f42a6eac..7473d7fb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java @@ -28,7 +28,6 @@ package org.apache.commons.bcel6.generic; * * @see Instruction * @version $Id$ - * @author M. Dahm */ public interface InstructionComparator { diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java index 196ac9df..11fcf950 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java @@ -34,7 +34,6 @@ import org.apache.commons.bcel6.Constants; * it's possible to write il.append(Instruction.ICONST_0); * * @version $Id$ - * @author M. Dahm */ public interface InstructionConstants { diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java index 2cb0d5ba..8d01bde4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.Constants; * add your own create methods. * * @version $Id$ - * @author M. Dahm * @see Constants */ public class InstructionFactory implements InstructionConstants, java.io.Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java index fc4acec9..edeb08ab 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java @@ -38,7 +38,6 @@ import org.apache.commons.bcel6.classfile.Utility; * InstructionList.elements(). * * @version $Id$ - * @author M. Dahm * @see Instruction * @see BranchHandle * @see InstructionList diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java index 3abb85ac..193a8975 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java @@ -46,7 +46,6 @@ import org.apache.commons.bcel6.util.ByteSequence; * href="#getByteCode()">getByteCode. * * @version $Id$ - * @author M. Dahm * @see Instruction * @see InstructionHandle * @see BranchHandle diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionListObserver.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionListObserver.java index fb97882e..0544cc09 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionListObserver.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionListObserver.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * and register yourself with addObserver(). * * @version $Id$ - * @author M. Dahm */ public interface InstructionListObserver { diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionTargeter.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionTargeter.java index f1a2c773..2ef12dd9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionTargeter.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionTargeter.java @@ -26,7 +26,6 @@ package org.apache.commons.bcel6.generic; * @see LocalVariableGen * @see CodeExceptionGen * @version $Id$ - * @author M. Dahm */ public interface InstructionTargeter { diff --git a/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java index 1d7993d6..6045914e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.classfile.ConstantPool; * Super class for the INVOKExxx family of instructions. * * @version $Id$ - * @author M. Dahm */ public abstract class InvokeInstruction extends FieldOrMethod implements ExceptionThrower, StackConsumer, StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/JSR.java b/src/main/java/org/apache/commons/bcel6/generic/JSR.java index 1c24429e..f204f5e3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JSR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JSR.java @@ -24,7 +24,6 @@ import java.io.IOException; * JSR - Jump to subroutine * * @version $Id$ - * @author M. Dahm */ public class JSR extends JsrInstruction implements VariableLengthInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java b/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java index 664c8039..29215797 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.util.ByteSequence; * JSR_W - Jump to subroutine * * @version $Id$ - * @author M. Dahm */ public class JSR_W extends JsrInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java index 2d700d1e..b97b0001 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * Super class for JSR - Jump to subroutine * * @version $Id$ - * @author M. Dahm */ public abstract class JsrInstruction extends BranchInstruction implements UnconditionalBranch, TypedInstruction, StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/L2D.java b/src/main/java/org/apache/commons/bcel6/generic/L2D.java index ac7af43c..ad34d976 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/L2D.java +++ b/src/main/java/org/apache/commons/bcel6/generic/L2D.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class L2D extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/L2F.java b/src/main/java/org/apache/commons/bcel6/generic/L2F.java index ebff0742..a3b3c3dc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/L2F.java +++ b/src/main/java/org/apache/commons/bcel6/generic/L2F.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value.word1, value.word2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class L2F extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/L2I.java b/src/main/java/org/apache/commons/bcel6/generic/L2I.java index f83a4162..44738bc4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/L2I.java +++ b/src/main/java/org/apache/commons/bcel6/generic/L2I.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value.word1, value.word2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class L2I extends ConversionInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LADD.java b/src/main/java/org/apache/commons/bcel6/generic/LADD.java index 8b328008..ed67964d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LADD.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm */ public class LADD extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java index 1d0833a7..9208e7d8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index -> ..., value1, value2
    * * @version $Id$ - * @author M. Dahm */ public class LALOAD extends ArrayInstruction implements StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LAND.java b/src/main/java/org/apache/commons/bcel6/generic/LAND.java index bc9cdd6a..28399996 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LAND.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LAND.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm */ public class LAND extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java index 22a8713f..1ba35a29 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index, value.word1, value.word2 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class LASTORE extends ArrayInstruction implements StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LCMP.java b/src/main/java/org/apache/commons/bcel6/generic/LCMP.java index 8686c7d7..9373c40f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LCMP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LCMP.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; * * * @version $Id$ - * @author M. Dahm */ public class LCMP extends Instruction implements TypedInstruction, StackProducer, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LCONST.java b/src/main/java/org/apache/commons/bcel6/generic/LCONST.java index 95e9cb30..348fdc88 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LCONST.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ... -> ..., 
    * * @version $Id$ - * @author M. Dahm */ public class LCONST extends Instruction implements ConstantPushInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC.java b/src/main/java/org/apache/commons/bcel6/generic/LDC.java index adcba413..e3bafe40 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.util.ByteSequence; *
    Stack: ... -> ..., item
    * * @version $Id$ - * @author M. Dahm */ public class LDC extends CPInstruction implements PushInstruction, ExceptionThrower { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java b/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java index 21a943bb..153ef7aa 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ... -> ..., item.word1, item.word2
    * * @version $Id$ - * @author M. Dahm */ public class LDC2_W extends CPInstruction implements PushInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java b/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java index 3daa0582..47f73ccf 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.util.ByteSequence; *
    Stack: ... -> ..., item.word1, item.word2
    * * @version $Id$ - * @author M. Dahm */ public class LDC_W extends LDC { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDIV.java b/src/main/java/org/apache/commons/bcel6/generic/LDIV.java index 307a58e6..7912cd8e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDIV.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm */ public class LDIV extends ArithmeticInstruction implements ExceptionThrower { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java b/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java index 6832d1b4..1db147af 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack ... -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class LLOAD extends LoadInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LMUL.java b/src/main/java/org/apache/commons/bcel6/generic/LMUL.java index 30f51b9f..b71338d3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LMUL.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm */ public class LMUL extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LNEG.java b/src/main/java/org/apache/commons/bcel6/generic/LNEG.java index a295b647..fd0bb4ea 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LNEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LNEG.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value.word1, value.word2 -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class LNEG extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java index d54d9e1f..385daa1e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.util.ByteSequence; * LOOKUPSWITCH - Switch with unordered set of values * * @version $Id$ - * @author M. Dahm * @see SWITCH */ public class LOOKUPSWITCH extends Select { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LOR.java b/src/main/java/org/apache/commons/bcel6/generic/LOR.java index 06b27033..dfe3a219 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LOR.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class LOR extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LREM.java b/src/main/java/org/apache/commons/bcel6/generic/LREM.java index 252d41d3..c8a843e2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LREM.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> result
    * * @version $Id$ - * @author M. Dahm */ public class LREM extends ArithmeticInstruction implements ExceptionThrower { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java index 85e41eb4..016a58da 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value.word1, value.word2 -> <empty>
    * * @version $Id$ - * @author M. Dahm */ public class LRETURN extends ReturnInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSHL.java b/src/main/java/org/apache/commons/bcel6/generic/LSHL.java index 7d82c0bc..bf8fd74a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LSHL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSHL.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1.word1, value1.word2, value2 -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class LSHL extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSHR.java b/src/main/java/org/apache/commons/bcel6/generic/LSHR.java index 038afcb4..aedaf028 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LSHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSHR.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1.word1, value1.word2, value2 -> ..., result.word1, result.word2
    * * @version $Id$ - * @author M. Dahm */ public class LSHR extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java b/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java index 358dd110..e37b1473 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value.word1, value.word2 -> ... 
    * * @version $Id$ - * @author M. Dahm */ public class LSTORE extends StoreInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSUB.java b/src/main/java/org/apache/commons/bcel6/generic/LSUB.java index 98e779fc..8dcbf867 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LSUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSUB.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; * ..., result.word1, result.word2 * * @version $Id$ - * @author M. Dahm */ public class LSUB extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java b/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java index 0c682d7e..6655490c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class LUSHR extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LXOR.java b/src/main/java/org/apache/commons/bcel6/generic/LXOR.java index 25cdaf25..635587ce 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LXOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LXOR.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., value1, value2 -> ..., result
    * * @version $Id$ - * @author M. Dahm */ public class LXOR extends ArithmeticInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java index c4d26b52..d5953b77 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java @@ -24,7 +24,6 @@ import org.apache.commons.bcel6.classfile.LineNumber; * a line number corresponding to the source code line. * * @version $Id$ - * @author M. Dahm * @see LineNumber * @see MethodGen */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/LoadClass.java b/src/main/java/org/apache/commons/bcel6/generic/LoadClass.java index 4805e513..12d651ff 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LoadClass.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LoadClass.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * the referenced class in the Virtual Machine. * * @version $Id$ - * @author M. Dahm */ public interface LoadClass { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java index 31635df8..2a1e5c94 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * variable, e.g. ILOAD. * * @version $Id$ - * @author M. Dahm */ public abstract class LoadInstruction extends LocalVariableInstruction implements PushInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java index 13914ac9..3cd8263f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.classfile.LocalVariable; * pool as parameters. * * @version $Id$ - * @author M. Dahm * @see LocalVariable * @see MethodGen */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java index 33d8be0f..fb9c9598 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.util.ByteSequence; * Abstract super class for instructions dealing with local variables. * * @version $Id$ - * @author M. Dahm */ public abstract class LocalVariableInstruction extends Instruction implements TypedInstruction, IndexedInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java b/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java index 297a7ad3..a70e7d42 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., objectref -> ...
    * * @version $Id$ - * @author M. Dahm */ public class MONITORENTER extends Instruction implements ExceptionThrower, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java b/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java index a2f0e310..7ef5f2e1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., objectref -> ...
    * * @version $Id$ - * @author M. Dahm */ public class MONITOREXIT extends Instruction implements ExceptionThrower, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java index 760b6d61..4663ef7a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.util.ByteSequence; *
    Stack: ..., count1, [count2, ...] -> ..., arrayref
    * * @version $Id$ - * @author M. Dahm */ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower { diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 917248a7..3f1e0dd2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -54,8 +54,6 @@ import org.apache.commons.bcel6.util.BCELComparator; * The resulting method object can be obtained via the `getMethod()' method. * * @version $Id$ - * @author M. Dahm - * @author Patrick C. Beard [setMaxStack()] * @see InstructionList * @see Method */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodObserver.java b/src/main/java/org/apache/commons/bcel6/generic/MethodObserver.java index 0991f601..d3b38166 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodObserver.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodObserver.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * and register yourself with addObserver(). * * @version $Id$ - * @author M. Dahm */ public interface MethodObserver { diff --git a/src/main/java/org/apache/commons/bcel6/generic/NEW.java b/src/main/java/org/apache/commons/bcel6/generic/NEW.java index e9b3fdc4..d77de14a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NEW.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NEW.java @@ -24,7 +24,6 @@ import org.apache.commons.bcel6.ExceptionConstants; *
    Stack: ... -> ..., objectref
    * * @version $Id$ - * @author M. Dahm */ public class NEW extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower, StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java index 2516d148..a27d3b6a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.util.ByteSequence; * type must be one of T_INT, T_SHORT, ... * * @version $Id$ - * @author M. Dahm */ public class NEWARRAY extends Instruction implements AllocationInstruction, ExceptionThrower, StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/NOP.java b/src/main/java/org/apache/commons/bcel6/generic/NOP.java index fb39590b..cbe59179 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NOP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NOP.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * NOP - Do nothing * * @version $Id$ - * @author M. Dahm */ public class NOP extends Instruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java index 8b80177f..9ab349b9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.classfile.ConstantUtf8; * names and signatures * * @version $Id: FieldOrMethod.java 1481383 2013-05-11 17:34:32Z dbrosius $ - * @author Bill Pugh * @since 6.0 */ public abstract class NameSignatureInstruction extends CPInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/NamedAndTyped.java b/src/main/java/org/apache/commons/bcel6/generic/NamedAndTyped.java index 13db08ff..8b670bc5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NamedAndTyped.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NamedAndTyped.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * methods and fields. * * @version $Id$ - * @author M. Dahm */ public interface NamedAndTyped { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java index 03e96fd7..5e1844c1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java @@ -25,7 +25,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * Denotes reference such as java.lang.String. * * @version $Id$ - * @author M. Dahm */ public class ObjectType extends ReferenceType { diff --git a/src/main/java/org/apache/commons/bcel6/generic/POP.java b/src/main/java/org/apache/commons/bcel6/generic/POP.java index cc004ac0..085b4374 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/POP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/POP.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., word -> ...
    * * @version $Id$ - * @author M. Dahm */ public class POP extends StackInstruction implements PopInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/POP2.java b/src/main/java/org/apache/commons/bcel6/generic/POP2.java index 7e17281d..cc818c00 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/POP2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/POP2.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., word2, word1 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class POP2 extends StackInstruction implements PopInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java index 987e260c..667c2e25 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java @@ -24,7 +24,6 @@ import org.apache.commons.bcel6.Constants; * LDC or xCONST_n instructions. * * @version $Id$ - * @author M. Dahm */ public final class PUSH implements CompoundInstruction, VariableLengthInstruction, InstructionConstants { diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java b/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java index db337b57..75d0603d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.ExceptionConstants; *
    Stack: ..., objectref, value.word1, value.word2 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class PUTFIELD extends FieldInstruction implements PopInstruction, ExceptionThrower { diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java index 845fcfc5..a8bbbca1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.ExceptionConstants; *
    Stack: ..., value.word1, value.word2 -> ...
    * * @version $Id$ - * @author M. Dahm */ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, PopInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/PopInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/PopInstruction.java index 6c0d49a8..683cfa31 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PopInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PopInstruction.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * such as ISTORE, POP, PUTSTATIC. * * @version $Id$ - * @author M. Dahm * @see ISTORE * @see POP */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/PushInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/PushInstruction.java index b75ef3e6..caf92aa0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PushInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PushInstruction.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * such as ILOAD, LDC, SIPUSH, DUP, ICONST, etc. * * @version $Id$ - * @author M. Dahm * @see ILOAD * @see ICONST diff --git a/src/main/java/org/apache/commons/bcel6/generic/RET.java b/src/main/java/org/apache/commons/bcel6/generic/RET.java index be67a6ad..3e5853f0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/RET.java +++ b/src/main/java/org/apache/commons/bcel6/generic/RET.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.util.ByteSequence; *
    Stack: ... -> ...
    * * @version $Id$ - * @author M. Dahm */ public class RET extends Instruction implements IndexedInstruction, TypedInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/RETURN.java b/src/main/java/org/apache/commons/bcel6/generic/RETURN.java index 4e253286..66d0a849 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/RETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/RETURN.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ... -> <empty>
    * * @version $Id$ - * @author M. Dahm */ public class RETURN extends ReturnInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java index 028ce668..0b8c467e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java @@ -25,7 +25,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * Super class for object and array types. * * @version $Id$ - * @author M. Dahm */ public abstract class ReferenceType extends Type { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java index 4bc3ce56..e29b7f5b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java @@ -24,7 +24,6 @@ import org.apache.commons.bcel6.ExceptionConstants; * Super class for the xRETURN family of instructions. * * @version $Id$ - * @author M. Dahm */ public abstract class ReturnInstruction extends Instruction implements ExceptionThrower, TypedInstruction, StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java b/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java index 111b9347..49910895 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java @@ -24,7 +24,6 @@ import org.apache.commons.bcel6.Constants; * * see vmspec2 �3.3.3 * @version $Id$ - * @author Enver Haase */ public class ReturnaddressType extends Type { diff --git a/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java index ccd352ad..4b1c9cb2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index -> ..., value
    * * @version $Id$ - * @author M. Dahm */ public class SALOAD extends ArrayInstruction implements StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java index 274383a3..7ae564aa 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., arrayref, index, value -> ...
    * * @version $Id$ - * @author M. Dahm */ public class SASTORE extends ArrayInstruction implements StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java b/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java index 25e301ab..51ba568c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.util.ByteSequence; *
    Stack: ... -> ..., value
    * * @version $Id$ - * @author M. Dahm */ public class SIPUSH extends Instruction implements ConstantPushInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/SWAP.java b/src/main/java/org/apache/commons/bcel6/generic/SWAP.java index 54643e20..4b27587c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SWAP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SWAP.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; *
    Stack: ..., word2, word1 -> ..., word1, word2
    * * @version $Id$ - * @author M. Dahm */ public class SWAP extends StackInstruction implements StackConsumer, StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java index c9d76e94..6b0c921d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.generic; * sorted with no gaps between the numbers. * * @version $Id$ - * @author M. Dahm */ public final class SWITCH implements CompoundInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/Select.java b/src/main/java/org/apache/commons/bcel6/generic/Select.java index f80055b1..ac9419df 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Select.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Select.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.util.ByteSequence; *

    We use our super's target property as the default target. * * @version $Id$ - * @author M. Dahm * @see LOOKUPSWITCH * @see TABLESWITCH * @see InstructionList diff --git a/src/main/java/org/apache/commons/bcel6/generic/StackConsumer.java b/src/main/java/org/apache/commons/bcel6/generic/StackConsumer.java index 4e0a3e70..ed48d2a3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/StackConsumer.java +++ b/src/main/java/org/apache/commons/bcel6/generic/StackConsumer.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * Denote an instruction that may consume a value from the stack. * * @version $Id$ - * @author M. Dahm */ public interface StackConsumer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java index 1e111290..1d34ee8d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * Super class for stack operations like DUP and POP. * * @version $Id$ - * @author M. Dahm */ public abstract class StackInstruction extends Instruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/StackProducer.java b/src/main/java/org/apache/commons/bcel6/generic/StackProducer.java index 4f217c05..bea0a957 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/StackProducer.java +++ b/src/main/java/org/apache/commons/bcel6/generic/StackProducer.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * (this excludes DUP_X1, e.g.) * * @version $Id$ - * @author M. Dahm */ public interface StackProducer { diff --git a/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java index 2a38a248..45f3fb63 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * e.g. ISTORE. * * @version $Id$ - * @author M. Dahm */ public abstract class StoreInstruction extends LocalVariableInstruction implements PopInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java index fd59f23d..d2df1065 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.util.ByteSequence; * TABLESWITCH - Switch within given range of values, i.e., low..high * * @version $Id$ - * @author M. Dahm * @see SWITCH */ public class TABLESWITCH extends Select { diff --git a/src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java b/src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java index 0cb402ee..b5b7b7f5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java +++ b/src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java @@ -44,7 +44,6 @@ package org.apache.commons.bcel6.generic; * @see InstructionList * @see InstructionTargeter * @version $Id$ - * @author M. Dahm */ public final class TargetLostException extends Exception { diff --git a/src/main/java/org/apache/commons/bcel6/generic/Type.java b/src/main/java/org/apache/commons/bcel6/generic/Type.java index 9899f0c8..986e77d2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Type.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Type.java @@ -31,7 +31,6 @@ import org.apache.commons.bcel6.verifier.structurals.OperandStack; * such as int, object types like String and array types, e.g. int[] * * @version $Id$ - * @author M. Dahm */ public abstract class Type implements java.io.Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/generic/TypedInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/TypedInstruction.java index 92204a30..e7c2f28c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/TypedInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/TypedInstruction.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * of the field of a PUTFIELD instruction, e.g.. * * @version $Id$ - * @author M. Dahm */ public interface TypedInstruction { diff --git a/src/main/java/org/apache/commons/bcel6/generic/UnconditionalBranch.java b/src/main/java/org/apache/commons/bcel6/generic/UnconditionalBranch.java index b1b79f1b..01ca259e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/UnconditionalBranch.java +++ b/src/main/java/org/apache/commons/bcel6/generic/UnconditionalBranch.java @@ -21,7 +21,6 @@ package org.apache.commons.bcel6.generic; * Denotes an instruction to perform an unconditional branch, i.e., GOTO, JSR. * * @version $Id$ - * @author M. Dahm * @see GOTO * @see JSR diff --git a/src/main/java/org/apache/commons/bcel6/generic/VariableLengthInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/VariableLengthInstruction.java index 2cfff020..aef5394f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/VariableLengthInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/VariableLengthInstruction.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.generic; * GOTO, JSR, LOOKUPSWITCH and TABLESWITCH. * * @version $Id$ - * @author M. Dahm * @see GOTO * @see JSR diff --git a/src/main/java/org/apache/commons/bcel6/generic/Visitor.java b/src/main/java/org/apache/commons/bcel6/generic/Visitor.java index 0a2f4c85..9b9a1685 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Visitor.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Visitor.java @@ -24,7 +24,6 @@ package org.apache.commons.bcel6.generic; * method. * * @version $Id$ - * @author M. Dahm */ public interface Visitor { diff --git a/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java b/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java index b174a746..2f240101 100644 --- a/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java @@ -41,7 +41,6 @@ import org.apache.commons.bcel6.classfile.Utility; * Convert found attributes into HTML file. * * @version $Id$ - * @author M. Dahm * */ final class AttributeHTML implements org.apache.commons.bcel6.Constants { diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELComparator.java b/src/main/java/org/apache/commons/bcel6/util/BCELComparator.java index 28017ce4..02ce037d 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELComparator.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELComparator.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.util; /** * Used for BCEL comparison strategy * - * @author M. Dahm * @version $Id$ * @since 5.2 */ diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java b/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java index 53b7e1f7..22326014 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java @@ -62,7 +62,6 @@ import org.apache.commons.bcel6.generic.Type; * * @see BCELifier * @version $Id$ - * @author M. Dahm */ class BCELFactory extends EmptyVisitor { diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java index 97eb444d..f10fd250 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java @@ -42,7 +42,6 @@ import org.apache.commons.bcel6.generic.Type; * but tries to mimic hand-written code as close as possible. * * @version $Id$ - * @author M. Dahm */ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { diff --git a/src/main/java/org/apache/commons/bcel6/util/ByteSequence.java b/src/main/java/org/apache/commons/bcel6/util/ByteSequence.java index c000289e..a3368643 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ByteSequence.java +++ b/src/main/java/org/apache/commons/bcel6/util/ByteSequence.java @@ -26,7 +26,6 @@ import java.io.DataInputStream; * Java byte code stream to gain some more readability. * * @version $Id$ - * @author M. Dahm */ public final class ByteSequence extends DataInputStream { diff --git a/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java b/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java index e1d389d5..cbecf232 100644 --- a/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java @@ -50,7 +50,6 @@ import org.apache.commons.bcel6.classfile.Utility; * the Code frame. * * @version $Id$ - * @author M. Dahm */ public class Class2HTML implements Constants { diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java index 418bc36c..36b7eb68 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java @@ -48,7 +48,6 @@ import org.apache.commons.bcel6.classfile.Utility; * "javax."

    * * @version $Id$ - * @author M. Dahm * @see JavaWrapper * @see ClassPath */ diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java index 1e6a1ba2..e414d530 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java @@ -35,8 +35,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * @see org.apache.commons.bcel6.Repository * * @version $Id$ - * @author M. Dahm - * @author David Dixon-Peugh */ public class ClassLoaderRepository implements Repository { diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index cae46093..2c971f3e 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -40,7 +40,6 @@ import java.util.zip.ZipFile; * sun.tools.ClassPath. * * @version $Id$ - * @author M. Dahm */ public class ClassPath implements Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java b/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java index fa1d7782..dd45c1e4 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * objects. * * @version $Id$ - * @author M. Dahm */ public class ClassQueue implements java.io.Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassSet.java b/src/main/java/org/apache/commons/bcel6/util/ClassSet.java index 8f9b6c04..0d4ab3c1 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassSet.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassSet.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * used for comparison. * * @version $Id$ - * @author M. Dahm * @see ClassStack */ public class ClassSet implements java.io.Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassStack.java b/src/main/java/org/apache/commons/bcel6/util/ClassStack.java index d6adb328..2c99b315 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassStack.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassStack.java @@ -25,7 +25,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * Utility class implementing a (typesafe) stack of JavaClass objects. * * @version $Id$ - * @author M. Dahm * @see Stack */ public class ClassStack implements java.io.Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassVector.java b/src/main/java/org/apache/commons/bcel6/util/ClassVector.java index 30ca2449..3da2fd88 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassVector.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassVector.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * objects. Contains the most important methods of a Vector. * * @version $Id$ - * @author M. Dahm * * @deprecated as of 5.1.1 - 7/17/2005 */ diff --git a/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java b/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java index 603179bd..de107bb6 100644 --- a/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java @@ -40,7 +40,6 @@ import org.apache.commons.bcel6.classfile.Utility; * Convert code into HTML file. * * @version $Id$ - * @author M. Dahm * */ final class CodeHTML implements org.apache.commons.bcel6.Constants { diff --git a/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java b/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java index e52ac86a..c2098bf8 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java @@ -36,7 +36,6 @@ import org.apache.commons.bcel6.classfile.Utility; * Convert constant pool into HTML file. * * @version $Id$ - * @author M. Dahm * */ final class ConstantHTML implements org.apache.commons.bcel6.Constants { diff --git a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java index 7a03aae8..4738875e 100644 --- a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java +++ b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java @@ -62,7 +62,6 @@ import org.apache.commons.bcel6.generic.InstructionList; *
    * * @version $Id$ - * @author M. Dahm * @see Instruction * @see InstructionList */ diff --git a/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java b/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java index d2173859..39e0a7bb 100644 --- a/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java +++ b/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java @@ -33,7 +33,6 @@ import java.lang.reflect.Modifier; *
    java org.apache.commons.bcel6.util.JavaWrapper -Dbcel.classloader=foo.MyLoader <real.class.name> [arguments]
    * * @version $Id$ - * @author M. Dahm * @see ClassLoader */ public class JavaWrapper { diff --git a/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java b/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java index b86250c1..c82a022e 100644 --- a/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java @@ -33,7 +33,6 @@ import org.apache.commons.bcel6.classfile.Utility; * Convert methods and fields into HTML file. * * @version $Id$ - * @author M. Dahm * */ final class MethodHTML implements org.apache.commons.bcel6.Constants { diff --git a/src/main/java/org/apache/commons/bcel6/util/Repository.java b/src/main/java/org/apache/commons/bcel6/util/Repository.java index 21881960..f01b7223 100644 --- a/src/main/java/org/apache/commons/bcel6/util/Repository.java +++ b/src/main/java/org/apache/commons/bcel6/util/Repository.java @@ -26,8 +26,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * * @see org.apache.commons.bcel6.Repository * @version $Id$ - * @author M. Dahm - * @author David Dixon-Peugh */ public interface Repository extends java.io.Serializable { diff --git a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java index c5640ae1..351a478c 100644 --- a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java @@ -39,8 +39,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * @see org.apache.commons.bcel6.Repository * * @version $Id$ - * @author M. Dahm - * @author David Dixon-Peugh */ public class SyntheticRepository implements Repository { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java index d6d796ec..6ef81610 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.generic.Type; * A graphical user interface application demonstrating JustIce. * * @version $Id$ - * @author Enver Haase */ public class GraphicalVerifier { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java index d2d182d5..1823863a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java @@ -25,7 +25,6 @@ package org.apache.commons.bcel6.verifier; * and JustIce. * * @version $Id$ - * @author Enver Haase */ public abstract class NativeVerifier { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java index 55849d76..2dde1549 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java @@ -42,7 +42,6 @@ import java.util.List; * pass you must use a new instance of a given PassVerifier. * * @version $Id$ - * @author Enver Haase * @see org.apache.commons.bcel6.verifier.Verifier * @see #verify() */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java b/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java index 20e792cf..2a06f963 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * more notably, memory. * * @version $Id$ - * @author Enver Haase */ public class TransitiveHull implements VerifierFactoryObserver { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java b/src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java index eda21488..0a45136c 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.verifier; * after verifying. * * @version $Id$ - * @author Enver Haase */ public class VerificationResult { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java index b8429d97..82cbfa95 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java @@ -40,7 +40,6 @@ import org.apache.commons.bcel6.verifier.structurals.Pass3bVerifier; * Verifier instances are usually generated by the VerifierFactory. * * @version $Id$ - * @author Enver Haase * @see org.apache.commons.bcel6.verifier.VerifierFactory * @see org.apache.commons.bcel6.verifier.PassVerifier */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java index 4502aa1c..b0a8d340 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java @@ -47,7 +47,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * the GraphicalVerfifier. * * @version $Id$ - * @author Enver Haase * @see GraphicalVerifier */ public class VerifierAppFrame extends JFrame { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java index 03b1641d..9f83f9e4 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java @@ -29,7 +29,6 @@ import java.util.Vector; * class name) there is exactly one Verifier. * * @version $Id$ - * @author Enver Haase * @see org.apache.commons.bcel6.verifier.Verifier */ public class VerifierFactory { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java index 7548abca..065935ec 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java @@ -30,7 +30,6 @@ import javax.swing.event.ListDataListener; * a VerifierFactoryObserver. * * @version $Id$ - * @author Enver Haase */ public class VerifierFactoryListModel implements org.apache.commons.bcel6.verifier.VerifierFactoryObserver, javax.swing.ListModel { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryObserver.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryObserver.java index 0b184452..6cfdbb44 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryObserver.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryObserver.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.verifier; * instances are created. * * @version $Id$ - * @author Enver Haase * * @see VerifierFactory#getVerifier(String) * @see VerifierFactory#getVerifiers() diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java index 9b274000..f2af6b48 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; * [This class was created using VisualAge for Java, * but it does not work under VAJ itself (Version 3.02 JDK 1.2)] * @version $Id$ - * @author Enver Haase * @see #main(String[]) * @see #VerifyDialog(String) */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java index 891505d0..3a6ec982 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.verifier.exc; * this is due to an INTERNAL ERROR of BCEL's class file verifier "JustIce". * * @version $Id$ - * @author Enver Haase */ public final class AssertionViolatedException extends RuntimeException{ private static final long serialVersionUID = -129822266349567409L; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java index 68967662..eddb07fb 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java @@ -24,7 +24,6 @@ package org.apache.commons.bcel6.verifier.exc; * in the Java Virtual Machine specification, 2nd edition. * * @version $Id$ - * @author Enver Haase */ public class ClassConstraintException extends VerificationException{ private static final long serialVersionUID = -4745598983569128296L; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java index 107a84b8..6dfb5813 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.verifier.exc; * "JustIce" involves verification that is usually delayed to pass 4. * * @version $Id$ - * @author Enver Haase */ public abstract class CodeConstraintException extends VerificationException{ private static final long serialVersionUID = -7265388214714996640L; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java index 281a18f8..7f7ce3a8 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java @@ -22,7 +22,6 @@ package org.apache.commons.bcel6.verifier.exc; * when the verification of a method is requested that does not exist. * * @version $Id$ - * @author Enver Haase */ public class InvalidMethodException extends RuntimeException{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/LinkingConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/LinkingConstraintException.java index 7f4db059..4055b8a1 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/LinkingConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/LinkingConstraintException.java @@ -32,7 +32,6 @@ package org.apache.commons.bcel6.verifier.exc; * TODO: At this time, this class is not used in JustIce. * * @version $Id$ - * @author Enver Haase */ public class LinkingConstraintException extends StructuralCodeConstraintException{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java index 66ba5b50..d26225f1 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java @@ -23,7 +23,6 @@ package org.apache.commons.bcel6.verifier.exc; * the class file is malformed; so it is not conforming to the "Pass 1" verification * process as described in the Java Virtual Machine specification, 2nd. edition. * @version $Id$ - * @author Enver Haase */ public class LoadingException extends VerifierConstraintViolatedException{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java index 82e1a065..3e01ed2b 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java @@ -26,7 +26,6 @@ package org.apache.commons.bcel6.verifier.exc; * Method object. * * @version $Id$ - * @author Enver Haase */ public class LocalVariableInfoInconsistentException extends ClassConstraintException{ private static final long serialVersionUID = -2833180480144304190L; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java index 0a9bca42..a2d6653d 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java @@ -26,7 +26,6 @@ package org.apache.commons.bcel6.verifier.exc; * is called pass 3a in JustIce. * * @version $Id$ - * @author Enver Haase */ public abstract class StaticCodeConstraintException extends CodeConstraintException{ private static final long serialVersionUID = 3858523065007725128L; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java index 18e7d0e5..8986bb17 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java @@ -29,7 +29,6 @@ package org.apache.commons.bcel6.verifier.exc; * Second Edition. * * @version $Id$ - * @author Enver Haase */ public class StaticCodeInstructionConstraintException extends StaticCodeConstraintException{ private static final long serialVersionUID = 4987255974346614794L; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java index 0780ed30..fa19fca5 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -29,7 +29,6 @@ package org.apache.commons.bcel6.verifier.exc; * Second Edition. * * @version $Id$ - * @author Enver Haase */ public class StaticCodeInstructionOperandConstraintException extends StaticCodeConstraintException{ private static final long serialVersionUID = 4780787099381933487L; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java index fa476042..afcb882f 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java @@ -28,7 +28,6 @@ package org.apache.commons.bcel6.verifier.exc; * The data flow analysis of pass 3 is called pass 3b in JustIce. * * @version $Id$ - * @author Enver Haase */ public class StructuralCodeConstraintException extends CodeConstraintException{ private static final long serialVersionUID = 5406842000007181420L; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java index 2887c5e0..195ef160 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java @@ -24,7 +24,6 @@ import java.io.StringWriter; /** * A utility class providing convenience methods concerning Throwable instances. * @version $Id$ - * @author Enver Haase * @see java.lang.Throwable */ public final class Utility{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java index bca39a82..5cf5cb6e 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java @@ -28,7 +28,6 @@ package org.apache.commons.bcel6.verifier.exc; * defined to be the verification happening in passes 2 and 3. * * @version $Id$ - * @author Enver Haase */ public abstract class VerificationException extends VerifierConstraintViolatedException{ private static final long serialVersionUID = 8012776320318623652L; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java index 841d9eec..e582b168 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java @@ -27,7 +27,6 @@ package org.apache.commons.bcel6.verifier.exc; * throw. * * @version $Id$ - * @author Enver Haase */ public abstract class VerifierConstraintViolatedException extends RuntimeException{ // /** The name of the offending class that did not pass the verifier. */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java index 4f4dbc9e..cdc78b22 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java @@ -24,7 +24,6 @@ import org.apache.commons.bcel6.generic.Type; /** * This class represents the upper half of a DOUBLE variable. * @version $Id$ - * @author Enver Haase */ public final class DOUBLE_Upper extends Type{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java index c029b17f..4d9c431d 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java @@ -25,7 +25,6 @@ import java.util.List; * A small utility class representing a set of basic int values. * * @version $Id$ - * @author Enver Haase */ public class IntList{ /** The int are stored as Integer objects here. */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java index 9d5d1ed4..1c191b0b 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java @@ -24,7 +24,6 @@ import org.apache.commons.bcel6.generic.Type; /** * This class represents the upper half of a LONG variable. * @version $Id$ - * @author Enver Haase */ public final class LONG_Upper extends Type{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java index 41377659..f6ecedd0 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java @@ -30,7 +30,6 @@ import org.apache.commons.bcel6.verifier.exc.LocalVariableInfoInconsistentExcept * often changes in course of byte code offsets. * * @version $Id$ - * @author Enver Haase */ public class LocalVariableInfo{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java index 6962b47b..30b0ba5a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.verifier.exc.LocalVariableInfoInconsistentExcept * a given method. * * @version $Id$ - * @author Enver Haase */ public class LocalVariablesInfo{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java index 2fc0a79d..99c524ee 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java @@ -34,7 +34,6 @@ import org.apache.commons.bcel6.verifier.exc.Utility; * documentation. * * @version $Id$ - * @author Enver Haase * @see #do_verify() */ public final class Pass1Verifier extends PassVerifier{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java index 8a77b483..80ba973b 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java @@ -80,7 +80,6 @@ import org.apache.commons.bcel6.verifier.exc.LocalVariableInfoInconsistentExcept * method's documentation. * * @version $Id$ - * @author Enver Haase * @see #do_verify() */ public final class Pass2Verifier extends PassVerifier implements Constants{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java index 22e4803d..3e922bd8 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java @@ -107,7 +107,6 @@ import org.apache.commons.bcel6.verifier.exc.StaticCodeInstructionOperandConstra * method's documentation. * * @version $Id$ - * @author Enver Haase * @see #do_verify() */ public final class Pass3aVerifier extends PassVerifier{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java index 4baba7ca..48986e25 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java @@ -71,7 +71,6 @@ import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; * handling in future versions of JustIce. * * @version $Id$ - * @author Enver Haase */ public class StringRepresentation extends org.apache.commons.bcel6.classfile.EmptyVisitor { /** The string representation, created by a visitXXX() method, output by toString(). */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java index 775f10f9..b38bbb40 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java @@ -40,7 +40,6 @@ import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; * This class represents a control flow graph of a method. * * @version $Id$ - * @author Enver Haase */ public class ControlFlowGraph{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandler.java index f437f4c2..8b71fd19 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandler.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandler.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.generic.ObjectType; * the handler starts off (represented by an InstructionContext). * * @version $Id$ - * @author Enver Haase */ public class ExceptionHandler{ /** The type of the exception to catch. NULL means ANY. */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java index 4ec7d88b..66658759 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java @@ -31,7 +31,6 @@ import org.apache.commons.bcel6.generic.MethodGen; * This class allows easy access to ExceptionHandler objects. * * @version $Id$ - * @author Enver Haase */ public class ExceptionHandlers{ /** diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java index b5bdd015..a25c406f 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java @@ -54,7 +54,6 @@ import org.apache.commons.bcel6.generic.*; * is given the type Type.UNKNOWN.

    * * @version $Id$ - * @author Enver Haase * @see #visitDSTORE(DSTORE o) * @see InstConstraintVisitor */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java index 37dbb6cb..a32d4776 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java @@ -24,7 +24,6 @@ package org.apache.commons.bcel6.verifier.structurals; * a local variable array and an operand stack. * * @version $Id$ - * @author Enver Haase */ public class Frame{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/GenericArray.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/GenericArray.java index 929f3bd3..fc679ca5 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/GenericArray.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/GenericArray.java @@ -24,7 +24,6 @@ package org.apache.commons.bcel6.verifier.structurals; * and java.io.Serializable and they extend java.lang.Object. * * @version $Id$ - * @author Enver Haase */ public class GenericArray extends java.lang.Object implements java.lang.Cloneable, java.io.Serializable{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java index e47c39d3..4ab7823d 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java @@ -47,7 +47,6 @@ import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; * MONITOREXIT) is not modeled in JustIce. * * @version $Id$ - * @author Enver Haase * @see org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException * @see org.apache.commons.bcel6.verifier.exc.LinkingConstraintException */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java index a43671d3..0b19f47f 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.generic.InstructionHandle; * such. * * @version $Id$ - * @author Enver Haase */ public interface InstructionContext{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java index cc2f159d..e85bca97 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; * simulation. * * @version $Id$ - * @author Enver Haase */ public class LocalVariables{ /** The Type[] containing the local variable slots. */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java index 157b1bc1..5d8ae473 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; * Elements of this stack are org.apache.commons.bcel6.generic.Type objects. * * @version $Id$ - * @author Enver Haase */ public class OperandStack{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java index 2ba9f7d8..a41f363f 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java @@ -54,7 +54,6 @@ import org.apache.commons.bcel6.verifier.exc.VerifierConstraintViolatedException * documentation. * * @version $Id$ - * @author Enver Haase * @see #do_verify() */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java index 7f1f27ce..67a5539a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.generic.InstructionHandle; * consistent fashion, too. * * @version $Id$ - * @author Enver Haase */ public interface Subroutine{ /** diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java index d76dc355..bea8c042 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java @@ -62,7 +62,6 @@ import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; * TODO: refer to the paper. * * @version $Id$ - * @author Enver Haase * @see #getTopLevel() */ public class Subroutines{ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java index 4fcb48c9..7f5a3825 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.generic.ReferenceType; * more details. * * @version $Id$ - * @author Enver Haase */ public class UninitializedObjectType extends ReferenceType implements Constants{ -- GitLab From ae73ee8529938715e54aac99fd573b451d2d0ce9 Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Wed, 12 Aug 2015 05:55:02 +0000 Subject: [PATCH 0805/1313] BCEL-236 remove deprecated ClassVector git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695422 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/util/ClassVector.java | 60 ------------------- 1 file changed, 60 deletions(-) delete mode 100644 src/main/java/org/apache/commons/bcel6/util/ClassVector.java diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassVector.java b/src/main/java/org/apache/commons/bcel6/util/ClassVector.java deleted file mode 100644 index 3da2fd88..00000000 --- a/src/main/java/org/apache/commons/bcel6/util/ClassVector.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.commons.bcel6.util; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.bcel6.classfile.JavaClass; - -/** - * Utility class implementing a (typesafe) collection of JavaClass - * objects. Contains the most important methods of a Vector. - * - * @version $Id$ - * - * @deprecated as of 5.1.1 - 7/17/2005 - */ -@Deprecated -public class ClassVector implements java.io.Serializable { - - private static final long serialVersionUID = 5600397075672780806L; - protected List vec = new ArrayList(); - - - public void addElement( JavaClass clazz ) { - vec.add(clazz); - } - - - public JavaClass elementAt( int index ) { - return vec.get(index); - } - - - public void removeElementAt( int index ) { - vec.remove(index); - } - - - public JavaClass[] toArray() { - JavaClass[] classes = new JavaClass[vec.size()]; - vec.toArray(classes); - return classes; - } -} -- GitLab From 44c64cd96ae2a8b3e4bdebef7de0e8ff8eb82b07 Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Wed, 12 Aug 2015 06:32:41 +0000 Subject: [PATCH 0806/1313] BCEL-236: remove deprecated FieldOrMethod.getClassType(ConConstantPoolGen) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695425 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/generic/FieldOrMethod.java | 13 +---------- .../verifier/statics/Pass3aVerifier.java | 23 ++++++++++++++----- .../structurals/InstConstraintVisitor.java | 19 +++++++++++---- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java index 9953a744..523ed71b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java @@ -95,17 +95,6 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { } - /** @return type of the referenced class/interface - * @deprecated If the instruction references an array class, - * the ObjectType returned will be invalid. Use - * getReferenceType() instead. - */ - @Deprecated - public ObjectType getClassType( ConstantPoolGen cpg ) { - return ObjectType.getInstance(getClassName(cpg)); - } - - /** * Return the reference type representing the class, interface, * or array class referenced by the instruction. @@ -131,6 +120,6 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { /** @return type of the referenced class/interface */ public ObjectType getLoadClassType( ConstantPoolGen cpg ) { - return getClassType(cpg); + return (ObjectType)getReferenceType(cpg); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java index 3e922bd8..72bc9e41 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java @@ -85,6 +85,7 @@ import org.apache.commons.bcel6.generic.NEWARRAY; import org.apache.commons.bcel6.generic.ObjectType; import org.apache.commons.bcel6.generic.PUTSTATIC; import org.apache.commons.bcel6.generic.RET; +import org.apache.commons.bcel6.generic.ReferenceType; import org.apache.commons.bcel6.generic.ReturnInstruction; import org.apache.commons.bcel6.generic.TABLESWITCH; import org.apache.commons.bcel6.generic.Type; @@ -543,6 +544,15 @@ public final class Pass3aVerifier extends PassVerifier{ } } + private ObjectType getObjectType(FieldInstruction o) { + ReferenceType rt = o.getReferenceType(cpg); + if(rt instanceof ObjectType) { + return (ObjectType)rt; + } + constraintViolated(o, "expecting ObjectType but got "+rt); + return null; + } + /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ //getfield, putfield, getstatic, putstatic @Override @@ -555,8 +565,8 @@ public final class Pass3aVerifier extends PassVerifier{ } String field_name = o.getFieldName(cpg); - - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + + JavaClass jc = Repository.lookupClass(getObjectType(o).getClassName()); Field[] fields = jc.getFields(); Field f = null; for (Field field : fields) { @@ -997,7 +1007,7 @@ public final class Pass3aVerifier extends PassVerifier{ public void visitPUTSTATIC(PUTSTATIC o){ try { String field_name = o.getFieldName(cpg); - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + JavaClass jc = Repository.lookupClass(getObjectType(o).getClassName()); Field[] fields = jc.getFields(); Field f = null; for (Field field : fields) { @@ -1011,8 +1021,9 @@ public final class Pass3aVerifier extends PassVerifier{ } if (f.isFinal()){ - if (!(myOwner.getClassName().equals(o.getClassType(cpg).getClassName()))){ - constraintViolated(o, "Referenced field '"+f+"' is final and must therefore be declared in the current class '"+myOwner.getClassName()+"' which is not the case: it is declared in '"+o.getClassType(cpg).getClassName()+"'."); + if (!(myOwner.getClassName().equals(getObjectType(o).getClassName()))){ + constraintViolated(o, "Referenced field '"+f+"' is final and must therefore be declared in the current class '"+myOwner.getClassName() + +"' which is not the case: it is declared in '"+o.getReferenceType(cpg)+"'."); } } @@ -1037,7 +1048,7 @@ public final class Pass3aVerifier extends PassVerifier{ public void visitGETSTATIC(GETSTATIC o){ try { String field_name = o.getFieldName(cpg); - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + JavaClass jc = Repository.lookupClass(getObjectType(o).getClassName()); Field[] fields = jc.getFields(); Field f = null; for (Field field : fields) { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java index 4ab7823d..e78d00a3 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java @@ -1208,6 +1208,15 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } + private ObjectType getObjectType(FieldInstruction o) { + ReferenceType rt = o.getReferenceType(cpg); + if(rt instanceof ObjectType) { + return (ObjectType)rt; + } + constraintViolated(o, "expecting ObjectType but got "+rt); + return null; + } + /** * Ensures the specific preconditions of the said instruction. */ @@ -1221,7 +1230,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ String field_name = o.getFieldName(cpg); - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + JavaClass jc = Repository.lookupClass(getObjectType(o).getClassName()); Field[] fields = jc.getFields(); Field f = null; for (Field field : fields) { @@ -1263,7 +1272,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } if (f.isProtected()){ - ObjectType classtype = o.getClassType(cpg); + ObjectType classtype = getObjectType(o); ObjectType curr = ObjectType.getInstance(mg.getClassName()); if ( classtype.equals(curr) || @@ -2632,7 +2641,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ String field_name = o.getFieldName(cpg); - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + JavaClass jc = Repository.lookupClass(getObjectType(o).getClassName()); Field[] fields = jc.getFields(); Field f = null; for (Field field : fields) { @@ -2684,7 +2693,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } if (f.isProtected()){ - ObjectType classtype = o.getClassType(cpg); + ObjectType classtype = getObjectType(o); ObjectType curr = ObjectType.getInstance(mg.getClassName()); if ( classtype.equals(curr) || @@ -2722,7 +2731,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ public void visitPUTSTATIC(PUTSTATIC o){ try { String field_name = o.getFieldName(cpg); - JavaClass jc = Repository.lookupClass(o.getClassType(cpg).getClassName()); + JavaClass jc = Repository.lookupClass(getObjectType(o).getClassName()); Field[] fields = jc.getFields(); Field f = null; for (Field field : fields) { -- GitLab From 7e34067268a3938877c22b4fdd3c4fe8356b259e Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Wed, 12 Aug 2015 06:34:41 +0000 Subject: [PATCH 0807/1313] BCEL-236: remove deprecated ASCII_CharStream methods git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695426 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/Mini/ASCII_CharStream.java | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/examples/Mini/ASCII_CharStream.java b/src/examples/Mini/ASCII_CharStream.java index 33ae2d3b..d5cae330 100644 --- a/src/examples/Mini/ASCII_CharStream.java +++ b/src/examples/Mini/ASCII_CharStream.java @@ -210,26 +210,6 @@ public final class ASCII_CharStream return (c); } - /** - * @deprecated - * @see #getEndColumn - */ - - @Deprecated - static public final int getColumn() { - return bufcolumn[bufpos]; - } - - /** - * @deprecated - * @see #getEndLine - */ - - @Deprecated - static public final int getLine() { - return bufline[bufpos]; - } - static public final int getEndColumn() { return bufcolumn[bufpos]; } -- GitLab From 197e2a83b2898b6b295d0ec168ee648295b6e4ef Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Wed, 12 Aug 2015 06:36:11 +0000 Subject: [PATCH 0808/1313] BCEL-236: remove deprecated Constants git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695427 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/Constants.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Constants.java b/src/main/java/org/apache/commons/bcel6/Constants.java index ba2f3bbd..1d9916f8 100644 --- a/src/main/java/org/apache/commons/bcel6/Constants.java +++ b/src/main/java/org/apache/commons/bcel6/Constants.java @@ -1448,19 +1448,6 @@ public interface Constants { public static final short KNOWN_ATTRIBUTES = 22; // count of attributes - /** @deprecated Use {@link #ATTR_RUNTIME_VISIBLE_ANNOTATIONS} instead */ - @Deprecated -public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = ATTR_RUNTIME_VISIBLE_ANNOTATIONS; - /** @deprecated Use {@link #ATTR_RUNTIME_INVISIBLE_ANNOTATIONS} instead */ - @Deprecated -public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = ATTR_RUNTIME_INVISIBLE_ANNOTATIONS; - /** @deprecated Use {@link #ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS} instead */ - @Deprecated -public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS; - /** @deprecated Use {@link #ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS} instead */ - @Deprecated -public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS; - // TODO: mutable public array!! public static final String[] ATTRIBUTE_NAMES = { "SourceFile", "ConstantValue", "Code", "Exceptions", -- GitLab From d45a94e4a366aebc3d666ace480a0d73040ee818 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 10:48:29 +0000 Subject: [PATCH 0809/1313] BCEL-227 replace @author tags with mention in pom git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695470 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index b8b6fa2c..095184ac 100644 --- a/pom.xml +++ b/pom.xml @@ -147,6 +147,15 @@ cmanolache at yahoo.com + + Bill Pugh + bill.pugh at gmail.com + + + + First Hop Ltd / Torsten Rueger + +
    @@ -170,9 +179,9 @@ - scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk - scm:svn:https://svn.apache.org/repos/asf/commons/proper/bcel/trunk - http://svn.apache.org/repos/asf/commons/proper/bcel/trunk + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/tags/BCEL_6_0_RC4 + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/tags/BCEL_6_0_RC4 + http://svn.apache.org/repos/asf/commons/proper/bcel/tags/BCEL_6_0_RC4 @@ -259,6 +268,7 @@ ${basedir}/checkstyle.xml false + ${basedir}/LICENSE-header.txt -- GitLab From 7f07c6e4c49939632cfb1faedbc79af75bec1cb3 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 10:50:27 +0000 Subject: [PATCH 0810/1313] Oops - inadvertent revert of recent change git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695471 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 095184ac..c4e531cb 100644 --- a/pom.xml +++ b/pom.xml @@ -179,9 +179,9 @@ - scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/tags/BCEL_6_0_RC4 - scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/tags/BCEL_6_0_RC4 - http://svn.apache.org/repos/asf/commons/proper/bcel/tags/BCEL_6_0_RC4 + scm:svn:http://svn.apache.org/repos/asf/commons/proper/bcel/trunk + scm:svn:https://svn.apache.org/repos/asf/commons/proper/bcel/trunk + http://svn.apache.org/repos/asf/commons/proper/bcel/trunk @@ -268,7 +268,6 @@ ${basedir}/checkstyle.xml false - ${basedir}/LICENSE-header.txt -- GitLab From 0ea7ebe90701a08f8417816cb3715de011f01420 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 10:54:45 +0000 Subject: [PATCH 0811/1313] BCEL-234 Code must not swallow Throwable git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695472 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../java/org/apache/commons/bcel6/util/ClassLoader.java | 3 ++- .../org/apache/commons/bcel6/verifier/NativeVerifier.java | 5 ++--- .../org/apache/commons/bcel6/verifier/VerifyDialog.java | 7 +++++++ 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index eabfb47c..15827ade 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Code must not swallow Throwable Major release of BCEL requires updating package name and maven coordinates. diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java index 36b7eb68..d5aebd86 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java @@ -18,6 +18,7 @@ package org.apache.commons.bcel6.util; import java.io.ByteArrayInputStream; +import java.io.IOException; import java.util.Hashtable; import org.apache.commons.bcel6.Constants; @@ -170,7 +171,7 @@ public class ClassLoader extends java.lang.ClassLoader { byte[] bytes = Utility.decode(real_name, true); ClassParser parser = new ClassParser(new ByteArrayInputStream(bytes), "foo"); clazz = parser.parse(); - } catch (Throwable e) { + } catch (IOException e) { e.printStackTrace(); return null; } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java index 1823863a..ea89c982 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java @@ -63,9 +63,8 @@ public abstract class NativeVerifier { } catch (ClassNotFoundException cnfe) { System.out.println("NativeVerifier: FILE NOT FOUND: '" + args[0] + "'."); System.exit(1); - } catch (Throwable t) { - System.out.println("NativeVerifier: Unspecified verification error on'" + args[0] - + "'."); + } catch (Throwable t) { // OK to catch Throwable here as we call exit. + System.out.println("NativeVerifier: Unspecified verification error on '" + args[0] + "'."); System.exit(1); } System.out.println("NativeVerifier: Class file '" + args[0] + "' seems to be okay."); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java index f2af6b48..d0a0698f 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java @@ -422,6 +422,13 @@ public class VerifyDialog extends javax.swing.JDialog { /* Uncomment the following lines to print uncaught exceptions to stdout */ System.out.println("--------- UNCAUGHT EXCEPTION ---------"); exception.printStackTrace(System.out); + // manually added code + if (exception instanceof ThreadDeath) { + throw (ThreadDeath) exception; + } + if (exception instanceof VirtualMachineError) { + throw (VirtualMachineError) exception; + } } -- GitLab From d1a73f78b48f20596da8f0b011156f7bcb8d7a6a Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 10:57:54 +0000 Subject: [PATCH 0812/1313] BCEL-231 Remove deprecated methods and classes Part 1 (of several) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695473 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/Attribute.java | 4 ---- .../java/org/apache/commons/bcel6/generic/ReferenceType.java | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index 12c3a03f..bf38791a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -195,10 +195,6 @@ public abstract class Attribute implements Cloneable, Node, Serializable { return ((UnknownAttributeReader) r).createAttribute(name_index, length, file, constant_pool); } - else if (r instanceof AttributeReader && file instanceof DataInputStream) - { - return ((AttributeReader) r).createAttribute(name_index, length, (DataInputStream) file, constant_pool); - } return new Unknown(name_index, length, file, constant_pool); case Constants.ATTR_CONSTANT_VALUE: return new ConstantValue(name_index, length, file, constant_pool); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java index 0b8c467e..915ea297 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java @@ -226,8 +226,8 @@ public abstract class ReferenceType extends Type { return Type.OBJECT; // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? } - if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) - || ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) { + if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterfaceExact()) + || ((t instanceof ObjectType) && ((ObjectType) t).referencesInterfaceExact())) { return Type.OBJECT; // TODO: The above line is correct comparing to the vmspec2. But one could // make class file verification a bit stronger here by using the notion of -- GitLab From 9da9fc8e3ea8e9c2cc150fe0273383a892e9da1e Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 11:22:39 +0000 Subject: [PATCH 0813/1313] BCEL-231 Remove deprecated methods and classes Part 2 (of several) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695478 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/Attribute.java | 14 ---- .../bcel6/classfile/AttributeReader.java | 59 --------------- .../bcel6/classfile/FieldOrMethod.java | 12 ---- .../bcel6/classfile/StackMapEntry.java | 10 --- .../commons/bcel6/generic/Instruction.java | 21 ------ .../commons/bcel6/generic/ReferenceType.java | 72 ------------------- .../apache/commons/bcel6/util/ClassPath.java | 13 +--- 7 files changed, 1 insertion(+), 200 deletions(-) delete mode 100644 src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index bf38791a..0e3f3c99 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -93,20 +93,6 @@ public abstract class Attribute implements Cloneable, Node, Serializable private static final Map readers = new HashMap(); - /** - * Add an Attribute reader capable of parsing (user-defined) attributes - * named "name". You should not add readers for the standard attributes such - * as "LineNumberTable", because those are handled internally. - * - * @param name the name of the attribute as stored in the class file - * @param r the reader object - * @deprecated Use {@link #addAttributeReader(String, UnknownAttributeReader)} instead - */ - public static void addAttributeReader(String name, AttributeReader r) - { - readers.put(name, r); - } - /** * Add an Attribute reader capable of parsing (user-defined) attributes * named "name". You should not add readers for the standard attributes such diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java b/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java deleted file mode 100644 index 942dbec0..00000000 --- a/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.commons.bcel6.classfile; - -/** - * Unknown (non-standard) attributes may be read via user-defined factory - * objects that can be registered with the Attribute.addAttributeReader - * method. These factory objects should implement this interface. - - * @see Attribute - * @version $Id$ - * - * @deprecated Use UnknownAttributeReader instead - */ -public interface AttributeReader { - - /** - When this attribute reader is added via the static method - Attribute.addAttributeReader, an attribute name is associated with it. - As the class file parser parses attributes, it will call various - AttributeReaders based on the name of the attributes it is - constructing. - - @param name_index An index into the constant pool, indexing a - ConstantUtf8 that represents the name of the attribute. - - @param length The length of the data contained in the attribute. This - is written into the constant pool and should agree with what the - factory expects the length to be. - - @param file This is the data input stream that the factory needs to read - its data from. - - @param constant_pool This is the constant pool associated with the - Attribute that we are constructing. - - @return The user-defined AttributeReader should take this data and use - it to construct an attribute. In the case of errors, a null can be - returned which will cause the parsing of the class file to fail. - - @see Attribute#addAttributeReader( String, AttributeReader ) - */ - Attribute createAttribute( int name_index, int length, java.io.DataInputStream file, ConstantPool constant_pool ); -} diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index 9e6d08e3..dd17e53c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -56,18 +56,6 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No } - /** - * Construct object from file stream. - * @param file Input stream - * @throws IOException - * @throws ClassFormatException - * @deprecated Use {@link #FieldOrMethod(java.io.DataInput, ConstantPool)} instead. - */ - protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) throws IOException, - ClassFormatException { - this((DataInput) file, constant_pool); - } - /** * Construct object from file stream. * @param file Input stream diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index c0841495..f8547284 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -136,11 +136,6 @@ public final class StackMapEntry implements Cloneable, Serializable { } - @java.lang.Deprecated - public void setNumberOfLocals( int n ) { // TODO unused - } - - public int getNumberOfLocals() { return types_of_locals == null ? 0 : types_of_locals.length; } @@ -156,11 +151,6 @@ public final class StackMapEntry implements Cloneable, Serializable { } - @java.lang.Deprecated - public void setNumberOfStackItems( int n ) { // TODO unused - } - - public int getNumberOfStackItems() { return types_of_stack_items == null ? 0 : types_of_stack_items.length; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java index 538bedbe..6a5185ea 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java @@ -528,27 +528,6 @@ public abstract class Instruction implements Cloneable, Serializable { public abstract void accept( Visitor v ); - /** Get Comparator object used in the equals() method to determine - * equality of instructions. - * - * @return currently used comparator for equals() - * @deprecated use the built in comparator, or wrap this class in another object that implements these methods - */ - @Deprecated - public static InstructionComparator getComparator() { - return cmp; - } - - - /** Set comparator to be used for equals(). - * @deprecated use the built in comparator, or wrap this class in another object that implements these methods - */ - @Deprecated - public static void setComparator( InstructionComparator c ) { - cmp = c; - } - - /** Check for equality, delegated to comparator * @return true if that is an Instruction and has the same opcode */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java index 915ea297..af24d912 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java @@ -259,76 +259,4 @@ public abstract class ReferenceType extends Type { return null; } - - /** - * This commutative operation returns the first common superclass (narrowest ReferenceType - * referencing a class, not an interface). - * If one of the types is a superclass of the other, the former is returned. - * If "this" is Type.NULL, then t is returned. - * If t is Type.NULL, then "this" is returned. - * If "this" equals t ['this.equals(t)'] "this" is returned. - * If "this" or t is an ArrayType, then Type.OBJECT is returned. - * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. - * If not all of the two classes' superclasses cannot be found, "null" is returned. - * See the JVM specification edition 2, "�4.9.2 The Bytecode Verifier". - * - * @deprecated use getFirstCommonSuperclass(ReferenceType t) which has - * slightly changed semantics. - * @throws ClassNotFoundException on failure to find superclasses of this - * type, or the type passed as a parameter - */ - @Deprecated - public ReferenceType firstCommonSuperclass( ReferenceType t ) throws ClassNotFoundException { - if (this.equals(Type.NULL)) { - return t; - } - if (t.equals(Type.NULL)) { - return this; - } - if (this.equals(t)) { - return this; - /* - * TODO: Above sounds a little arbitrary. On the other hand, there is - * no object referenced by Type.NULL so we can also say all the objects - * referenced by Type.NULL were derived from java.lang.Object. - * However, the Java Language's "instanceof" operator proves us wrong: - * "null" is not referring to an instance of java.lang.Object :) - */ - } - if ((this instanceof ArrayType) || (t instanceof ArrayType)) { - return Type.OBJECT; - // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? - } - if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) - || ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) { - return Type.OBJECT; - // TODO: The above line is correct comparing to the vmspec2. But one could - // make class file verification a bit stronger here by using the notion of - // superinterfaces or even castability or assignment compatibility. - } - // this and t are ObjectTypes, see above. - ObjectType thiz = (ObjectType) this; - ObjectType other = (ObjectType) t; - JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); - JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); - if ((thiz_sups == null) || (other_sups == null)) { - return null; - } - // Waaahh... - JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; - JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; - System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); - System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); - this_sups[0] = Repository.lookupClass(thiz.getClassName()); - t_sups[0] = Repository.lookupClass(other.getClassName()); - for (JavaClass t_sup : t_sups) { - for (JavaClass this_sup : this_sups) { - if (this_sup.equals(t_sup)) { - return ObjectType.getInstance(this_sup.getClassName()); - } - } - } - // Huh? Did you ask for Type.OBJECT's superclass?? - return null; - } } diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index 2c971f3e..017cc9ee 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -44,7 +44,7 @@ import java.util.zip.ZipFile; public class ClassPath implements Serializable { private static final long serialVersionUID = 2099441438483340671L; - public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(); + public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(getClassPath()); private static final FilenameFilter ARCHIVE_FILTER = new FilenameFilter() { @@ -94,17 +94,6 @@ public class ClassPath implements Serializable { vec.toArray(paths); } - - /** - * Search for classes in CLASSPATH. - * @deprecated Use SYSTEM_CLASS_PATH constant - */ - @Deprecated - public ClassPath() { - this(getClassPath()); - } - - /** @return used class path string */ @Override -- GitLab From 81af90ba4a02321aa29430d13dab0dddbb6f698f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 11:33:05 +0000 Subject: [PATCH 0814/1313] Unused git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695479 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/FieldOrMethod.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index dd17e53c..757bc0b1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -18,7 +18,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; -import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -- GitLab From 32f686420686069a826ab2c747838368ee587dc6 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 11:34:52 +0000 Subject: [PATCH 0815/1313] BCEL-231 Remove deprecated methods and classes (continued...) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695481 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/generic/ObjectType.java | 38 +------------------ .../structurals/InstConstraintVisitor.java | 8 +++- 2 files changed, 7 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java index 5e1844c1..8848c2c4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java @@ -69,42 +69,6 @@ public class ObjectType extends ReferenceType { } - /** - * If "this" doesn't reference a class, it references an interface - * or a non-existant entity. - * @deprecated this method returns an inaccurate result - * if the class or interface referenced cannot - * be found: use referencesClassExact() instead - */ - @Deprecated - public boolean referencesClass() { - try { - JavaClass jc = Repository.lookupClass(class_name); - return jc.isClass(); - } catch (ClassNotFoundException e) { - return false; - } - } - - - /** - * If "this" doesn't reference an interface, it references a class - * or a non-existant entity. - * @deprecated this method returns an inaccurate result - * if the class or interface referenced cannot - * be found: use referencesInterfaceExact() instead - */ - @Deprecated - public boolean referencesInterface() { - try { - JavaClass jc = Repository.lookupClass(class_name); - return !jc.isClass(); - } catch (ClassNotFoundException e) { - return false; - } - } - - /** * Return true if this type references a class, * false if it references an interface. @@ -139,7 +103,7 @@ public class ObjectType extends ReferenceType { * can't be found */ public boolean subclassOf( ObjectType superclass ) throws ClassNotFoundException { - if (this.referencesInterface() || superclass.referencesInterface()) { + if (this.referencesInterfaceExact() || superclass.referencesInterfaceExact()) { return false; } return Repository.instanceOf(this.class_name, superclass.class_name); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java index e78d00a3..05a9d9a0 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java @@ -2584,8 +2584,12 @@ public class InstConstraintVisitor extends EmptyVisitor{ ObjectType obj = (ObjectType) t; //e.g.: Don't instantiate interfaces - if (! obj.referencesClass()){ - constraintViolated(o, "Expecting a class type (ObjectType) to work on. Found: '"+obj+"'."); + try { + if (! obj.referencesClassExact()){ + constraintViolated(o, "Expecting a class type (ObjectType) to work on. Found: '"+obj+"'."); + } + } catch (ClassNotFoundException e) { + constraintViolated(o, "Expecting a class type (ObjectType) to work on. Found: '"+obj+"'." + " which threw " + e); } } -- GitLab From 1256eac20695a0152a10dd14617a7eddc58d8746 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 12:30:54 +0000 Subject: [PATCH 0816/1313] Fix indentation git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695491 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/util/AttributeHTML.java | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java b/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java index 2f240101..141106a0 100644 --- a/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java @@ -141,11 +141,11 @@ final class AttributeHTML implements org.apache.commons.bcel6.Constants { // List thrown exceptions int[] indices = ((ExceptionTable) attribute).getExceptionIndexTable(); file.print("\n"); break; case ATTR_LINE_NUMBER_TABLE: @@ -164,42 +164,42 @@ final class AttributeHTML implements org.apache.commons.bcel6.Constants { LocalVariable[] vars = ((LocalVariableTable) attribute).getLocalVariableTable(); // List name, range and type file.print("
      "); - for (LocalVariable var : vars) { - index = var.getSignatureIndex(); - String signature = ((ConstantUtf8) constant_pool.getConstant(index, - CONSTANT_Utf8)).getBytes(); - signature = Utility.signatureToString(signature, false); - int start = var.getStartPC(); - int end = (start + var.getLength()); - file.println("
    • " + Class2HTML.referenceType(signature) + " " - + var.getName() + " in slot %" + var.getIndex() - + "
      Valid from lines " + "" - + start + " to " + "" + end + "
    • "); - } + for (LocalVariable var : vars) { + index = var.getSignatureIndex(); + String signature = ((ConstantUtf8) constant_pool.getConstant(index, + CONSTANT_Utf8)).getBytes(); + signature = Utility.signatureToString(signature, false); + int start = var.getStartPC(); + int end = (start + var.getLength()); + file.println("
    • " + Class2HTML.referenceType(signature) + " " + + var.getName() + " in slot %" + var.getIndex() + + "
      Valid from lines " + "" + + start + " to " + "" + end + "
    • "); + } file.print("
    \n"); break; case ATTR_INNER_CLASSES: InnerClass[] classes = ((InnerClasses) attribute).getInnerClasses(); // List inner classes file.print("
      "); - for (InnerClass classe : classes) { - String name, access; - index = classe.getInnerNameIndex(); - if (index > 0) { - name = ((ConstantUtf8) constant_pool.getConstant(index, CONSTANT_Utf8)) - .getBytes(); - } else { - name = "<anonymous>"; + for (InnerClass classe : classes) { + String name, access; + index = classe.getInnerNameIndex(); + if (index > 0) { + name = ((ConstantUtf8) constant_pool.getConstant(index, CONSTANT_Utf8)) + .getBytes(); + } else { + name = "<anonymous>"; + } + access = Utility.accessToString(classe.getInnerAccessFlags()); + file.print("
    • " + access + " " + + constant_html.referenceConstant(classe.getInnerClassIndex()) + + " in class " + + constant_html.referenceConstant(classe.getOuterClassIndex()) + + " named " + name + "
    • \n"); } - access = Utility.accessToString(classe.getInnerAccessFlags()); - file.print("
    • " + access + " " - + constant_html.referenceConstant(classe.getInnerClassIndex()) - + " in class " - + constant_html.referenceConstant(classe.getOuterClassIndex()) - + " named " + name + "
    • \n"); - } file.print("
    \n"); break; default: // Such as Unknown attribute or Deprecated -- GitLab From 4a2fba25228536501c202754c9cb7a442c1e496d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 12:46:38 +0000 Subject: [PATCH 0817/1313] BCEL-239 Interfaces should not be used to define constants Convert ExceptionConstants to class (it was not implemented anywhere) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695495 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/ExceptionConstants.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java b/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java index e2f4f9c8..046c8dc3 100644 --- a/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java @@ -22,7 +22,7 @@ package org.apache.commons.bcel6; * * @version $Id$ */ -public interface ExceptionConstants { +public class ExceptionConstants { /** The mother of all exceptions */ @@ -48,7 +48,7 @@ public interface ExceptionConstants { public static final Class UNSATISFIED_LINK_ERROR = UnsatisfiedLinkError.class; public static final Class VERIFY_ERROR = VerifyError.class; /* UnsupportedClassVersionError is new in JDK 1.2 */ - //public static final Class UnsupportedClassVersionError = UnsupportedClassVersionError.class; +// public static final Class UnsupportedClassVersionError = UnsupportedClassVersionError.class; /** Run-Time Exceptions */ public static final Class NULL_POINTER_EXCEPTION = NullPointerException.class; -- GitLab From cb5fbb3c9a15bd6b6833ebcfdbc4f35c039f95ee Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 12:51:57 +0000 Subject: [PATCH 0818/1313] BCEL-233 The access_flags field in AccessFlags class should be final git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695497 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../commons/bcel6/classfile/AccessFlags.java | 107 +----------------- 2 files changed, 3 insertions(+), 105 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 15827ade..89223ff8 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + The access_flags field in AccessFlags class should be final Code must not swallow Throwable Major release of BCEL requires updating package name and maven coordinates. diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java index d9a6cac5..acf0ba70 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java @@ -28,10 +28,11 @@ import org.apache.commons.bcel6.Constants; public abstract class AccessFlags implements java.io.Serializable { private static final long serialVersionUID = 2845404654039163061L; - protected int access_flags; // TODO make private (has getter & setter) + private final int access_flags; public AccessFlags() { + this(0); } @@ -59,180 +60,76 @@ public abstract class AccessFlags implements java.io.Serializable { } - /** Set access flags aka "modifiers". - * @param access_flags Access flags of the object. - */ - public final void setAccessFlags( int access_flags ) { - this.access_flags = access_flags; - } - - - /** Set access flags aka "modifiers". - * @param access_flags Access flags of the object. - */ - public final void setModifiers( int access_flags ) { - setAccessFlags(access_flags); - } - - - private void setFlag( int flag, boolean set ) { - if ((access_flags & flag) != 0) { // Flag is set already - if (!set) { - access_flags ^= flag; - } - } else { // Flag not set - if (set) { - access_flags |= flag; - } - } - } - - - public final void isPublic( boolean flag ) { - setFlag(Constants.ACC_PUBLIC, flag); - } - - public final boolean isPublic() { return (access_flags & Constants.ACC_PUBLIC) != 0; } - public final void isPrivate( boolean flag ) { - setFlag(Constants.ACC_PRIVATE, flag); - } - - public final boolean isPrivate() { return (access_flags & Constants.ACC_PRIVATE) != 0; } - public final void isProtected( boolean flag ) { - setFlag(Constants.ACC_PROTECTED, flag); - } - - public final boolean isProtected() { return (access_flags & Constants.ACC_PROTECTED) != 0; } - public final void isStatic( boolean flag ) { - setFlag(Constants.ACC_STATIC, flag); - } - - public final boolean isStatic() { return (access_flags & Constants.ACC_STATIC) != 0; } - public final void isFinal( boolean flag ) { - setFlag(Constants.ACC_FINAL, flag); - } - - public final boolean isFinal() { return (access_flags & Constants.ACC_FINAL) != 0; } - public final void isSynchronized( boolean flag ) { - setFlag(Constants.ACC_SYNCHRONIZED, flag); - } - - public final boolean isSynchronized() { return (access_flags & Constants.ACC_SYNCHRONIZED) != 0; } - public final void isVolatile( boolean flag ) { - setFlag(Constants.ACC_VOLATILE, flag); - } - - public final boolean isVolatile() { return (access_flags & Constants.ACC_VOLATILE) != 0; } - public final void isTransient( boolean flag ) { - setFlag(Constants.ACC_TRANSIENT, flag); - } - - public final boolean isTransient() { return (access_flags & Constants.ACC_TRANSIENT) != 0; } - public final void isNative( boolean flag ) { - setFlag(Constants.ACC_NATIVE, flag); - } - - public final boolean isNative() { return (access_flags & Constants.ACC_NATIVE) != 0; } - public final void isInterface( boolean flag ) { - setFlag(Constants.ACC_INTERFACE, flag); - } - - public final boolean isInterface() { return (access_flags & Constants.ACC_INTERFACE) != 0; } - public final void isAbstract( boolean flag ) { - setFlag(Constants.ACC_ABSTRACT, flag); - } - - public final boolean isAbstract() { return (access_flags & Constants.ACC_ABSTRACT) != 0; } - public final void isStrictfp( boolean flag ) { - setFlag(Constants.ACC_STRICT, flag); - } - - public final boolean isStrictfp() { return (access_flags & Constants.ACC_STRICT) != 0; } - public final void isSynthetic( boolean flag ) { - setFlag(Constants.ACC_SYNTHETIC, flag); - } - - public final boolean isSynthetic() { return (access_flags & Constants.ACC_SYNTHETIC) != 0; } - public final void isAnnotation( boolean flag ) { - setFlag(Constants.ACC_ANNOTATION, flag); - } - - public final boolean isAnnotation() { return (access_flags & Constants.ACC_ANNOTATION) != 0; } - public final void isEnum( boolean flag ) { - setFlag(Constants.ACC_ENUM, flag); - } - - public final boolean isEnum() { return (access_flags & Constants.ACC_ENUM) != 0; } -- GitLab From 91481052f8a277f2fa76f80e05eccc0f53c9a08e Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 13:35:21 +0000 Subject: [PATCH 0819/1313] BCEL-235 Remove unused setters (incomplete) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695512 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/classfile/CodeException.java | 40 ++----------------- .../bcel6/classfile/ConstantClass.java | 10 +---- .../bcel6/classfile/ConstantDouble.java | 10 +---- .../bcel6/classfile/ConstantFloat.java | 10 +---- .../bcel6/classfile/ConstantInteger.java | 10 +---- .../commons/bcel6/classfile/ConstantLong.java | 10 +---- .../bcel6/classfile/ConstantMethodHandle.java | 14 +------ .../bcel6/classfile/ConstantMethodType.java | 7 +--- 8 files changed, 12 insertions(+), 99 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java index 8cf72914..16f63c58 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java @@ -35,12 +35,12 @@ import org.apache.commons.bcel6.Constants; public final class CodeException implements Cloneable, Constants, Node, Serializable { private static final long serialVersionUID = 2972500041254967221L; - private int start_pc; // Range in the code the exception handler is TODO could be final (setter unused) - private int end_pc; // active. start_pc is inclusive, end_pc exclusive TODO could be final (setter unused) - private int handler_pc; /* Starting address of exception handler, i.e., TODO could be final (setter unused) + private final int start_pc; // Range in the code the exception handler is + private final int end_pc; // active. start_pc is inclusive, end_pc exclusive + private final int handler_pc; /* Starting address of exception handler, i.e., * an offset from start of code. */ - private int catch_type; /* If this is zero the handler catches any TODO could be final (setter unused) + private final int catch_type; /* If this is zero the handler catches any * exception, otherwise it points to the * exception class which is to be caught. */ @@ -142,38 +142,6 @@ public final class CodeException implements Cloneable, Constants, Node, Serializ } - /** - * @param catch_type the type of exception that is caught - */ - public final void setCatchType( int catch_type ) { // TODO unused - this.catch_type = catch_type; - } - - - /** - * @param end_pc end of handled block - */ - public final void setEndPC( int end_pc ) { // TODO unused - this.end_pc = end_pc; - } - - - /** - * @param handler_pc where the actual code is - */ - public final void setHandlerPC( int handler_pc ) { // TODO unused - this.handler_pc = handler_pc; - } - - - /** - * @param start_pc start of handled block - */ - public final void setStartPC( int start_pc ) { // TODO unused - this.start_pc = start_pc; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java index 6c3f3d66..517c0109 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantClass extends Constant implements ConstantObject { private static final long serialVersionUID = -1083450233715258720L; - private int name_index; // Identical to ConstantString except for the name TODO could be final (setter unused) + private final int name_index; // Identical to ConstantString except for the name /** @@ -100,14 +100,6 @@ public final class ConstantClass extends Constant implements ConstantObject { } - /** - * @param name_index the name index in the constant pool of this Constant Class - */ - public final void setNameIndex( int name_index ) { - this.name_index = name_index; - } - - /** @return String object */ public Object getConstantValue( ConstantPool cp ) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java index a81cbde4..1c3ab9c8 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantDouble extends Constant implements ConstantObject { private static final long serialVersionUID = -7394764537394782136L; - private double bytes; // TODO could be final (setter not used) + private final double bytes; /** @@ -99,14 +99,6 @@ public final class ConstantDouble extends Constant implements ConstantObject { } - /** - * @param bytes the raw bytes that represent the double value - */ - public final void setBytes( double bytes ) { // TODO unused - this.bytes = bytes; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java index 6b364648..6b40dc5c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantFloat extends Constant implements ConstantObject { private static final long serialVersionUID = -2316732495687628398L; - private float bytes; // TODO could be final (setter unused) + private final float bytes; /** @@ -100,14 +100,6 @@ public final class ConstantFloat extends Constant implements ConstantObject { } - /** - * @param bytes the raw bytes that represent this float - */ - public final void setBytes( float bytes ) { // TODO unused - this.bytes = bytes; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java index 77cb70fb..a64b70b0 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantInteger extends Constant implements ConstantObject { private static final long serialVersionUID = -7040676276945754375L; - private int bytes; // TODO could be final (setter unused) + private final int bytes; /** @@ -99,14 +99,6 @@ public final class ConstantInteger extends Constant implements ConstantObject { } - /** - * @param bytes the raw bytes that represent this integer - */ - public final void setBytes( int bytes ) { // TODO unused - this.bytes = bytes; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java index a54a8253..565e9396 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantLong extends Constant implements ConstantObject { private static final long serialVersionUID = 8495971186433816161L; - private long bytes; // TODO could be final (setter unused) + private final long bytes; /** @@ -99,14 +99,6 @@ public final class ConstantLong extends Constant implements ConstantObject { } - /** - * @param bytes the raw bytes that represent this long - */ - public final void setBytes( long bytes ) { // TODO unused - this.bytes = bytes; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java index 82cc68eb..8a892856 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java @@ -34,8 +34,8 @@ import org.apache.commons.bcel6.Constants; public final class ConstantMethodHandle extends Constant { private static final long serialVersionUID = -7875124116920198044L; - private int reference_kind; // TODO could be final (setter unused) - private int reference_index; // TODO could be final (setter unused) + private final int reference_kind; + private final int reference_index; /** @@ -96,21 +96,11 @@ public final class ConstantMethodHandle extends Constant { } - public void setReferenceKind(int reference_kind) { // TODO unused - this.reference_kind = reference_kind; - } - - public int getReferenceIndex() { return reference_index; } - public void setReferenceIndex(int reference_index) { // TODO unused - this.reference_index = reference_index; - } - - /** * @return String representation */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java index 7ea64b27..f30e047f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantMethodType extends Constant { private static final long serialVersionUID = 6750768220616618881L; - private int descriptor_index; // TODO could be final (setter unused) + private final int descriptor_index; /** @@ -93,11 +93,6 @@ public final class ConstantMethodType extends Constant { } - public void setDescriptorIndex(int descriptor_index) { // TODO unused - this.descriptor_index = descriptor_index; - } - - /** * @return String representation */ -- GitLab From da5f54665dc13c7ccef9b95d7fe58d651248eefd Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 13:58:52 +0000 Subject: [PATCH 0820/1313] BCEL-232 Make mutable fields private. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695518 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/Attribute.java | 10 +++--- .../commons/bcel6/classfile/Constant.java | 2 +- .../commons/bcel6/classfile/ConstantCP.java | 31 ++----------------- .../commons/bcel6/classfile/ElementValue.java | 4 +-- .../bcel6/classfile/FieldOrMethod.java | 12 +++---- 5 files changed, 16 insertions(+), 43 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index 0e3f3c99..cbf0706e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -52,13 +52,13 @@ public abstract class Attribute implements Cloneable, Node, Serializable { private static final long serialVersionUID = -1707826820310002955L; - protected int name_index; // Points to attribute name in constant pool TODO make private (has getter & setter) + private int name_index; // Points to attribute name in constant pool - protected int length; // Content length of attribute field TODO make private (has getter & setter) + private int length; // Content length of attribute field - protected byte tag; // Tag to distinguish subclasses TODO make private & final; supposed to be immutable + private final byte tag; // Tag to distinguish subclasses - protected ConstantPool constant_pool; // TODO make private (has getter & setter) + private ConstantPool constant_pool; protected Attribute(byte tag, int name_index, int length, ConstantPool constant_pool) { @@ -260,7 +260,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable /** * @param name_index of attribute. */ - public final void setNameIndex(int name_index) + public final void setNameIndex(int name_index) // TODO unused { this.name_index = name_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java index a594cafe..c997635d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java @@ -57,7 +57,7 @@ public abstract class Constant implements Cloneable, Node, Serializable { * need the tag as an index to select the corresponding class name from the * `CONSTANT_NAMES' array. */ - protected byte tag; // TODO should be private & final + private final byte tag; Constant(byte tag) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java index cc4b2ea5..1f92c65b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java @@ -40,9 +40,9 @@ public abstract class ConstantCP extends Constant { */ // Note that this field is used to store the // bootstrap_method_attr_index of a ConstantInvokeDynamic. - protected int class_index; // TODO make private (has getter & setter) could be final (setter unused) + private final int class_index; // This field has the same meaning for all subclasses. - protected int name_and_type_index; // TODO make private (has getter & setter) could be final (setter unused) + private final int name_and_type_index; /** @@ -109,25 +109,6 @@ public abstract class ConstantCP extends Constant { } - /** - * @param class_index points to Constant_class - */ - public final void setClassIndex( int class_index ) { // TODO unused - this.class_index = class_index; - } - - - /** - * @param bootstrap_method_attr_index points to a BootstrapMethod. - * - * Note that this method is a functional duplicate of setClassIndex - * for use by ConstantInvokeDynamic. - */ - public final void setBootstrapMethodAttrIndex(int bootstrap_method_attr_index) { // TODO unused - this.class_index = bootstrap_method_attr_index; - } - - /** * @return Reference (index) to signature of the field. */ @@ -136,14 +117,6 @@ public abstract class ConstantCP extends Constant { } - /** - * @param name_and_type_index points to Constant_NameAndType - */ - public final void setNameAndTypeIndex( int name_and_type_index ) { - this.name_and_type_index = name_and_type_index; - } - - /** * @return Class this field belongs to. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java index 1469cf5a..e1fad784 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java @@ -27,9 +27,9 @@ import java.io.IOException; */ public abstract class ElementValue { - protected int type; // TODO should be final + protected final int type; - protected ConstantPool cpool; // TODO should be final + protected final ConstantPool cpool; @Override public String toString() diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index 757bc0b1..3256fb73 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -31,12 +31,12 @@ import org.apache.commons.bcel6.Constants; public abstract class FieldOrMethod extends AccessFlags implements Cloneable, Node { private static final long serialVersionUID = -1833306330869469714L; - // TODO should be made private - protected int name_index; // Points to field name in constant pool - protected int signature_index; // Points to encoded signature - protected Attribute[] attributes; // Collection of attributes - protected AnnotationEntry[] annotationEntries; // annotations defined on the field or method - protected ConstantPool constant_pool; + + private int name_index; // Points to field name in constant pool + private int signature_index; // Points to encoded signature + private Attribute[] attributes; // Collection of attributes + private AnnotationEntry[] annotationEntries; // annotations defined on the field or method + private ConstantPool constant_pool; private String signatureAttributeString = null; private boolean searchedForSignatureAttribute = false; -- GitLab From e9c4b03698ac997267ba187e731a9a100ceb51cb Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 13:59:45 +0000 Subject: [PATCH 0821/1313] BCEL-232 Make mutable fields private. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695519 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 89223ff8..7ccd91f1 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Make mutable fields private The access_flags field in AccessFlags class should be final Code must not swallow Throwable -- GitLab From bb47ba1914c0c0794b7665ef2113801bda45ee37 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 14:50:33 +0000 Subject: [PATCH 0822/1313] BCEL-235 Remove unused setters git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695544 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../commons/bcel6/classfile/Attribute.java | 10 +--- .../bcel6/classfile/ConstantNameAndType.java | 20 +------ .../commons/bcel6/classfile/ConstantPool.java | 8 --- .../bcel6/classfile/ConstantString.java | 10 +--- .../bcel6/classfile/ConstantValue.java | 10 +--- .../commons/bcel6/classfile/Deprecated.java | 10 +--- .../bcel6/classfile/EnclosingMethod.java | 7 +-- .../bcel6/classfile/ExceptionTable.java | 11 +--- .../apache/commons/bcel6/classfile/Field.java | 10 +--- .../bcel6/classfile/FieldOrMethod.java | 24 ++------ .../commons/bcel6/classfile/InnerClass.java | 40 ++----------- .../commons/bcel6/classfile/InnerClasses.java | 10 +--- .../commons/bcel6/classfile/JavaClass.java | 10 +--- .../commons/bcel6/classfile/LineNumber.java | 20 +------ .../bcel6/classfile/LineNumberTable.java | 10 +--- .../bcel6/classfile/LocalVariable.java | 58 ++----------------- .../bcel6/classfile/LocalVariableTable.java | 7 +-- .../classfile/LocalVariableTypeTable.java | 4 -- .../bcel6/classfile/MethodParameter.java | 14 ++--- .../bcel6/classfile/MethodParameters.java | 6 +- .../commons/bcel6/classfile/PMGClass.java | 18 +----- .../bcel6/classfile/ParameterAnnotations.java | 10 +--- .../commons/bcel6/classfile/Signature.java | 10 +--- .../bcel6/classfile/SimpleElementValue.java | 7 +-- .../commons/bcel6/classfile/SourceFile.java | 10 +--- .../commons/bcel6/classfile/StackMap.java | 10 +--- .../bcel6/classfile/StackMapEntry.java | 30 ++-------- .../bcel6/classfile/StackMapTable.java | 10 +--- .../bcel6/classfile/StackMapTableEntry.java | 30 ++-------- .../commons/bcel6/classfile/StackMapType.java | 34 +++-------- .../commons/bcel6/classfile/Synthetic.java | 10 +--- .../commons/bcel6/classfile/Unknown.java | 10 +--- 33 files changed, 61 insertions(+), 428 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 7ccd91f1..83e7bb47 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Remove unused setters Make mutable fields private The access_flags field in AccessFlags class should be final Code must not swallow Throwable diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index cbf0706e..7b8480cc 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -52,7 +52,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable { private static final long serialVersionUID = -1707826820310002955L; - private int name_index; // Points to attribute name in constant pool + private final int name_index; // Points to attribute name in constant pool private int length; // Content length of attribute field @@ -257,14 +257,6 @@ public abstract class Attribute implements Cloneable, Node, Serializable this.length = length; } - /** - * @param name_index of attribute. - */ - public final void setNameIndex(int name_index) // TODO unused - { - this.name_index = name_index; - } - /** * @return Name index in constant pool of attribute name. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java index 1870b143..cfddcd9a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java @@ -35,8 +35,8 @@ import org.apache.commons.bcel6.Constants; public final class ConstantNameAndType extends Constant { private static final long serialVersionUID = -7913354727264034451L; - private int name_index; // Name of field/method // TODO could be final (setter unused) - private int signature_index; // and its signature. // TODO could be final (setter unused) + private final int name_index; // Name of field/method + private final int signature_index; // and its signature. /** @@ -126,22 +126,6 @@ public final class ConstantNameAndType extends Constant { } - /** - * @param name_index the name index of this constant - */ - public final void setNameIndex( int name_index ) { // TODO unused - this.name_index = name_index; - } - - - /** - * @param signature_index the signature index in the constant pool of this type - */ - public final void setSignatureIndex( int signature_index ) { // TODO unused - this.signature_index = signature_index; - } - - /** * @return String representation */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java index 62dbadf6..5f049ed7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java @@ -331,14 +331,6 @@ public class ConstantPool implements Cloneable, Node, Serializable { } - /** - * @param constant_pool - */ - public void setConstantPool( Constant[] constant_pool ) { // TODO unused - this.constant_pool = constant_pool; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java index 716adbd3..05aba2a5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantString extends Constant implements ConstantObject { private static final long serialVersionUID = 6603144389219397225L; - private int string_index; // Identical to ConstantClass except for this name // TODO could be final (setter unused) + private final int string_index; // Identical to ConstantClass except for this name /** @@ -99,14 +99,6 @@ public final class ConstantString extends Constant implements ConstantObject { } - /** - * @param string_index the index into the constant of the string value - */ - public final void setStringIndex( int string_index ) { // TODO unused - this.string_index = string_index; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java index 473e04e1..bd49181a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantValue extends Attribute { private static final long serialVersionUID = -5668999920978520157L; - private int constantvalue_index; // TODO could be final (setter unused) + private final int constantvalue_index; /** @@ -107,14 +107,6 @@ public final class ConstantValue extends Attribute { } - /** - * @param constantvalue_index the index info the constant pool of this constant value - */ - public final void setConstantValueIndex( int constantvalue_index ) { // TODO unused - this.constantvalue_index = constantvalue_index; - } - - /** * @return String representation of constant value. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java index 45577687..4b541a0e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class Deprecated extends Attribute { private static final long serialVersionUID = -2242528405240201000L; - private byte[] bytes; // TODO could be final (setter unused) + private byte[] bytes; // TODO could be final if copy() were rewritten /** @@ -114,14 +114,6 @@ public final class Deprecated extends Attribute { } - /** - * @param bytes the raw bytes that represents this byte array - */ - public final void setBytes( byte[] bytes ) { // TODO unused - this.bytes = bytes; - } - - /** * @return attribute name */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java index bd73bb48..b07c6903 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java @@ -34,7 +34,7 @@ public class EnclosingMethod extends Attribute { // Pointer to the CONSTANT_Class_info structure representing the // innermost class that encloses the declaration of the current class. - private int classIndex; // TODO could be final (setter unused) + private final int classIndex; // If the current class is not immediately enclosed by a method or // constructor, then the value of the method_index item must be zero. @@ -44,7 +44,7 @@ public class EnclosingMethod extends Attribute { // to in the class_index. *It is the compiler responsibility* to // ensure that the method identified by this index is the closest // lexically enclosing method that includes the local/anonymous class. - private int methodIndex; // TODO could be final (setter unused) + private final int methodIndex; // Ctors - and code to read an attribute in. EnclosingMethod(int nameIndex, int len, DataInput input, ConstantPool cpool) throws IOException { @@ -73,9 +73,6 @@ public class EnclosingMethod extends Attribute { public final int getEnclosingClassIndex() { return classIndex; } public final int getEnclosingMethodIndex(){ return methodIndex;} - public final void setEnclosingClassIndex(int idx) {classIndex = idx;} // TODO unused - public final void setEnclosingMethodIndex(int idx){methodIndex= idx;} // TODO unused - public final ConstantClass getEnclosingClass() { ConstantClass c = (ConstantClass)super.getConstantPool().getConstant(classIndex,Constants.CONSTANT_Class); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java index 3895d7df..f034266f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java @@ -38,7 +38,7 @@ public final class ExceptionTable extends Attribute { private static final long serialVersionUID = 2045358830660883220L; - private int[] exception_index_table; // constant pool // TODO could be final (setter unused) + private int[] exception_index_table; // constant pool /** @@ -139,15 +139,6 @@ public final class ExceptionTable extends Attribute { } - /** - * @param exception_index_table the list of exception indexes - * Also redefines number_of_exceptions according to table length. - */ - public final void setExceptionIndexTable( int[] exception_index_table ) { // TODO unused - this.exception_index_table = exception_index_table != null ? exception_index_table : new int[0]; - } - - /** * @return String representation, i.e., a list of thrown exceptions. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Field.java b/src/main/java/org/apache/commons/bcel6/classfile/Field.java index 328c17e1..2e15226e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Field.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Field.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.util.BCELComparator; public final class Field extends FieldOrMethod { private static final long serialVersionUID = -4604082205545049134L; - private static BCELComparator _cmp = new BCELComparator() { // TODO could be final (setter unused) + private static final BCELComparator _cmp = new BCELComparator() { public boolean equals( Object o1, Object o2 ) { Field THIS = (Field) o1; @@ -160,14 +160,6 @@ public final class Field extends FieldOrMethod { } - /** - * @param comparator Comparison strategy object - */ - public static void setComparator( BCELComparator comparator ) { // TODO unused - _cmp = comparator; - } - - /** * Return value as defined by given BCELComparator strategy. * By default two Field objects are said to be equal when diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index 3256fb73..b0146f45 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -32,8 +32,8 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No private static final long serialVersionUID = -1833306330869469714L; - private int name_index; // Points to field name in constant pool - private int signature_index; // Points to encoded signature + private final int name_index; // Points to field name in constant pool + private final int signature_index; // Points to encoded signature private Attribute[] attributes; // Collection of attributes private AnnotationEntry[] annotationEntries; // annotations defined on the field or method private ConstantPool constant_pool; @@ -41,7 +41,9 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No private String signatureAttributeString = null; private boolean searchedForSignatureAttribute = false; - FieldOrMethod() { + FieldOrMethod() { // TODO is this ctor needed? + this.name_index = 0; + this.signature_index = 0; } @@ -146,14 +148,6 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No } - /** - * @param name_index Index in constant pool of object's name. - */ - public final void setNameIndex( int name_index ) { // TODO unused - this.name_index = name_index; - } - - /** * @return Index in constant pool of field signature. */ @@ -162,14 +156,6 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No } - /** - * @param signature_index Index in constant pool of field signature. - */ - public final void setSignatureIndex( int signature_index ) { // TODO unused - this.signature_index = signature_index; - } - - /** * @return Name of object, i.e., method name or field name */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java index d7f1a497..39c7a378 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java @@ -35,10 +35,10 @@ import org.apache.commons.bcel6.Constants; public final class InnerClass implements Cloneable, Node, Serializable { private static final long serialVersionUID = -7200195918166127614L; - private int inner_class_index; // TODO could be final (setter unused) - private int outer_class_index; // TODO could be final (setter unused) - private int inner_name_index; // TODO could be final (setter unused) - private int inner_access_flags; // TODO could be final (setter unused) + private final int inner_class_index; + private final int outer_class_index; + private final int inner_name_index; + private final int inner_access_flags; /** @@ -134,38 +134,6 @@ public final class InnerClass implements Cloneable, Node, Serializable { } - /** - * @param inner_access_flags access flags for this inner class - */ - public final void setInnerAccessFlags( int inner_access_flags ) { // TODO unused - this.inner_access_flags = inner_access_flags; - } - - - /** - * @param inner_class_index index into the constant pool for this class - */ - public final void setInnerClassIndex( int inner_class_index ) { // TODO unused - this.inner_class_index = inner_class_index; - } - - - /** - * @param inner_name_index index into the constant pool for this class's name - */ - public final void setInnerNameIndex( int inner_name_index ) { // TODO unused - this.inner_name_index = inner_name_index; - } - - - /** - * @param outer_class_index index into the constant pool for the owning class - */ - public final void setOuterClassIndex( int outer_class_index ) { // TODO unused - this.outer_class_index = outer_class_index; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java index ad6cb4f0..33a16270 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class InnerClasses extends Attribute { private static final long serialVersionUID = 4570147726361753700L; - private InnerClass[] inner_classes; // TODO could be final (setter unused; would need to recode the copy method) + private InnerClass[] inner_classes; // TODO could be final (would need to recode the copy method) /** @@ -117,14 +117,6 @@ public final class InnerClasses extends Attribute { } - /** - * @param inner_classes the array of inner classes - */ - public final void setInnerClasses( InnerClass[] inner_classes ) { // TODO unused - this.inner_classes = inner_classes != null ? inner_classes : new InnerClass[0]; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 0b117020..686b990c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -74,7 +74,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl static boolean debug = false; // Debugging on/off final static char sep = File.separatorChar; // directory separator - private static BCELComparator _cmp = new BCELComparator() { // TODO could be final (setter unused) + private static final BCELComparator _cmp = new BCELComparator() { // TODO could be final (setter unused) public boolean equals( Object o1, Object o2 ) { JavaClass THIS = (JavaClass) o1; @@ -882,14 +882,6 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl } - /** - * @param comparator Comparison strategy object - */ - public static void setComparator( BCELComparator comparator ) { // TODO unused - _cmp = comparator; - } - - /** * Return value as defined by given BCELComparator strategy. * By default two JavaClass objects are said to be equal when diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java index 2b4f6336..aafe4299 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java @@ -35,10 +35,10 @@ public final class LineNumber implements Cloneable, Node, Serializable { private static final long serialVersionUID = 169537400672820016L; /** Program Counter (PC) corresponds to line */ - private short start_pc; // TODO could be final (setter unused) + private final short start_pc; /** number in source file */ - private short line_number; // TODO could be final (setter unused) + private final short line_number; /** * Initialize from another object. @@ -109,22 +109,6 @@ public final class LineNumber implements Cloneable, Node, Serializable { } - /** - * @param line_number the source line number - */ - public final void setLineNumber( int line_number ) { // TODO unused - this.line_number = (short) line_number; - } - - - /** - * @param start_pc the pc for this line number - */ - public final void setStartPC( int start_pc ) { // TODO unused - this.start_pc = (short) start_pc; - } - - /** * @return String representation */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java index 1b872d50..09cd160d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java @@ -36,7 +36,7 @@ public final class LineNumberTable extends Attribute { private static final long serialVersionUID = -6967221519632128904L; - private LineNumber[] line_number_table; // Table of line/numbers pairs // TODO could be final (unused setter; copy() would need adjusting) + private LineNumber[] line_number_table; // Table of line/numbers pairs // TODO could be final (copy() would need adjusting) /* @@ -116,14 +116,6 @@ public final class LineNumberTable extends Attribute { } - /** - * @param line_number_table the line number entries for this table - */ - public final void setLineNumberTable( LineNumber[] line_number_table ) { // TODO unused - this.line_number_table = line_number_table; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java index e64142a2..d75f267c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java @@ -34,11 +34,11 @@ import org.apache.commons.bcel6.Constants; public final class LocalVariable implements Constants, Cloneable, Node, Serializable { private static final long serialVersionUID = -51081099265972179L; - private int start_pc; // Range in which the variable is valid - private int length; - private int name_index; // Index in constant pool of variable name - private int signature_index; // Index of variable signature - private int index; /* Variable is `index'th local variable on + private final int start_pc; // Range in which the variable is valid + private final int length; + private final int name_index; // Index in constant pool of variable name + private final int signature_index; // Index of variable signature + private final int index; /* Variable is `index'th local variable on * this method's frame. */ private ConstantPool constant_pool; @@ -179,54 +179,6 @@ public final class LocalVariable implements Constants, Cloneable, Node, Serializ } - /** - * @param constant_pool Constant pool to be used for this object. - */ - public final void setConstantPool( ConstantPool constant_pool ) { // TODO unused - this.constant_pool = constant_pool; - } - - - /** - * @param length the length of this local variable - */ - public final void setLength( int length ) { // TODO unused - this.length = length; - } - - - /** - * @param name_index the index into the constant pool for the name of this variable - */ - public final void setNameIndex( int name_index ) { // TODO unused - this.name_index = name_index; - } - - - /** - * @param signature_index the index into the constant pool for the signature of this variable - */ - public final void setSignatureIndex( int signature_index ) { // TODO unused - this.signature_index = signature_index; - } - - - /** - * @param index the index in the local variable table of this variable - */ - public final void setIndex( int index ) { // TODO unused - this.index = index; - } - - - /** - * @param start_pc Specify range where the local variable is valid. - */ - public final void setStartPC( int start_pc ) { // TODO unused - this.start_pc = start_pc; - } - - /** * @return string representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java index 395d63df..77f94a13 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public class LocalVariableTable extends Attribute { private static final long serialVersionUID = 6780929007774637689L; - private LocalVariable[] local_variable_table; // variables + private LocalVariable[] local_variable_table; // variables TODO could be final if copy() were recoded /** @@ -156,11 +156,6 @@ public class LocalVariableTable extends Attribute { } - public final void setLocalVariableTable( LocalVariable[] local_variable_table ) { // TODO unused - this.local_variable_table = local_variable_table; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java index 4348ae44..34eaca08 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java @@ -108,10 +108,6 @@ public class LocalVariableTypeTable extends Attribute { return null; } - public final void setLocalVariableTable(LocalVariable[] local_variable_table) { // TODO unused - this.local_variable_type_table = local_variable_table; - } - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java index 2c0f47a9..47a94a13 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java @@ -35,12 +35,14 @@ public class MethodParameter implements Serializable, Cloneable { private static final long serialVersionUID = 6014494029439440326L; /** Index of the CONSTANT_Utf8_info structure in the constant_pool table representing the name of the parameter */ - private int name_index; // TODO could be final (setter unused) + private final int name_index; /** The access flags */ - private int access_flags; // TODO could be final (setter unused) + private final int access_flags; public MethodParameter() { + this.access_flags = 0; + this.name_index = 0; } /** @@ -59,10 +61,6 @@ public class MethodParameter implements Serializable, Cloneable { return name_index; } - public void setNameIndex(int name_index) { // TODO unused - this.name_index = name_index; - } - /** * Returns the name of the parameter. */ @@ -77,10 +75,6 @@ public class MethodParameter implements Serializable, Cloneable { return access_flags; } - public void setAccessFlags(int access_flags) { // TODO unused - this.access_flags = access_flags; - } - public boolean isFinal() { return (access_flags & Constants.ACC_FINAL) != 0; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java index 0dd14bad..293fd16e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java @@ -33,7 +33,7 @@ public class MethodParameters extends Attribute { private static final long serialVersionUID = 2500272580422360140L; - private MethodParameter[] parameters = new MethodParameter[0]; // TODO could be final (setter unused) + private MethodParameter[] parameters = new MethodParameter[0]; // TODO could be final if copy() were recoded MethodParameters(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { super(Constants.ATTR_METHOD_PARAMETERS, name_index, length, constant_pool); @@ -49,10 +49,6 @@ public class MethodParameters extends Attribute { return parameters; } - public void setParameters(MethodParameter[] parameters) { // TODO unused - this.parameters = parameters; - } - @Override public void accept(Visitor v) { v.visitMethodParameters(this); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java index 01a9905f..87cee284 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.Constants; public final class PMGClass extends Attribute { private static final long serialVersionUID = -7075964153234211509L; - private int pmg_class_index, pmg_index; // TODO could be final (setter unused) + private final int pmg_class_index, pmg_index; /** @@ -110,14 +110,6 @@ public final class PMGClass extends Attribute { } - /** - * @param pmg_class_index - */ - public final void setPMGClassIndex( int pmg_class_index ) { // TODO unused - this.pmg_class_index = pmg_class_index; - } - - /** * @return Index in constant pool of source file name. */ @@ -126,14 +118,6 @@ public final class PMGClass extends Attribute { } - /** - * @param pmg_index - */ - public final void setPMGIndex( int pmg_index ) { // TODO unused - this.pmg_index = pmg_index; - } - - /** * @return PMG name. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java index e94fa936..1c62c8a1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java @@ -32,7 +32,7 @@ public abstract class ParameterAnnotations extends Attribute { private static final long serialVersionUID = 5234607357644462705L; /** Table of parameter annotations */ - private ParameterAnnotationEntry[] parameter_annotation_table; // TODO could be final (setter unused) + private ParameterAnnotationEntry[] parameter_annotation_table; // TODO could be final would need to recode ctor and copy method /** * @param parameter_annotation_type the subclass type of the parameter annotation @@ -80,14 +80,6 @@ public abstract class ParameterAnnotations extends Attribute { } - /** - * @param parameter_annotation_table the entries to set in this parameter annotation - */ - public final void setParameterAnnotationTable(ParameterAnnotationEntry[] parameter_annotation_table ) { // TODO unused - this.parameter_annotation_table = parameter_annotation_table; - } - - /** * @return the parameter annotation entry table */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java index c81e876b..414f085c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class Signature extends Attribute { private static final long serialVersionUID = 5808807822688827177L; - private int signature_index; // TODO could be final (setter unused) + private final int signature_index; /** @@ -107,14 +107,6 @@ public final class Signature extends Attribute { } - /** - * @param signature_index the index info the constant pool of this signature - */ - public final void setSignatureIndex( int signature_index ) { // TODO unused - this.signature_index = signature_index; - } - - /** * @return GJ signature. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java index 33cc8e7b..785c97e1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java @@ -27,7 +27,7 @@ import org.apache.commons.bcel6.Constants; */ public class SimpleElementValue extends ElementValue { - private int index; // TODO could be final (setter unused) + private final int index; public SimpleElementValue(int type, int index, ConstantPool cpool) { @@ -43,11 +43,6 @@ public class SimpleElementValue extends ElementValue return index; } - public void setIndex(int index) // TODO unused - { - this.index = index; - } - public String getValueString() { if (type != STRING) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java index b3a9528b..053bb176 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class SourceFile extends Attribute { private static final long serialVersionUID = -804226255663222912L; - private int sourcefile_index; // TODO could be final (setter unused) + private final int sourcefile_index; /** @@ -114,14 +114,6 @@ public final class SourceFile extends Attribute { } - /** - * @param sourcefile_index - */ - public final void setSourceFileIndex( int sourcefile_index ) { // TODO unused - this.sourcefile_index = sourcefile_index; - } - - /** * @return Source file name. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java index 0074ac9c..d92e74ac 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java @@ -40,7 +40,7 @@ import org.apache.commons.bcel6.Constants; public final class StackMap extends Attribute { private static final long serialVersionUID = -6238662431726968495L; - private StackMapEntry[] map; // Table of stack map entries // TODO could be final (setter unused) + private StackMapEntry[] map; // Table of stack map entries // TODO could be final if ctor and copy() were recoded /* @@ -98,14 +98,6 @@ public final class StackMap extends Attribute { } - /** - * @param map Array of stack map entries - */ - public final void setStackMap( StackMapEntry[] map ) { // TODO unused - this.map = map; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index f8547284..ab6589a7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -35,10 +35,10 @@ public final class StackMapEntry implements Cloneable, Serializable { private static final long serialVersionUID = 1L; - private int byte_code_offset; // TODO could be final (setter unused) - private StackMapType[] types_of_locals; // TODO could be final (setter unused) - private StackMapType[] types_of_stack_items; // TODO could be final (setter unused) - private ConstantPool constant_pool; // TODO could be final (setter unused) + private final int byte_code_offset; + private final StackMapType[] types_of_locals; + private final StackMapType[] types_of_stack_items; + private final ConstantPool constant_pool; /** @@ -126,11 +126,6 @@ public final class StackMapEntry implements Cloneable, Serializable { } - public void setByteCodeOffset( int b ) { // TODO unused - byte_code_offset = b; - } - - public int getByteCodeOffset() { return byte_code_offset; } @@ -141,11 +136,6 @@ public final class StackMapEntry implements Cloneable, Serializable { } - public void setTypesOfLocals( StackMapType[] types ) { // TODO unused - types_of_locals = types != null ? types : new StackMapType[0]; - } - - public StackMapType[] getTypesOfLocals() { return types_of_locals; } @@ -156,11 +146,6 @@ public final class StackMapEntry implements Cloneable, Serializable { } - public void setTypesOfStackItems( StackMapType[] types ) { - types_of_stack_items = types != null ? types : new StackMapType[0]; - } - - public StackMapType[] getTypesOfStackItems() { return types_of_stack_items; } @@ -197,11 +182,4 @@ public final class StackMapEntry implements Cloneable, Serializable { return constant_pool; } - - /** - * @param constant_pool Constant pool to be used for this object. - */ - public final void setConstantPool( ConstantPool constant_pool ) { // TODO unused - this.constant_pool = constant_pool; - } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java index c1a3b7f6..52f60d92 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java @@ -41,7 +41,7 @@ import org.apache.commons.bcel6.Constants; public final class StackMapTable extends Attribute { private static final long serialVersionUID = -5802191977296683162L; - private StackMapTableEntry[] map; // Table of stack map entries // TODO could be final (setter unused) + private StackMapTableEntry[] map; // Table of stack map entries TODO could be final if copy() and ctor were rewritten /* @@ -98,14 +98,6 @@ public final class StackMapTable extends Attribute { } - /** - * @param map Array of stack map entries - */ - public final void setStackMapTable( StackMapTableEntry[] map ) { // TODO unused - this.map = map; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java index e38abe17..4ae7a772 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java @@ -39,10 +39,10 @@ public final class StackMapTableEntry implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private final int frame_type; - private int byte_code_offset_delta; // TODO could be final (setter unused) - private StackMapType[] types_of_locals; // TODO could be final (setter unused) - private StackMapType[] types_of_stack_items; // TODO could be final (setter unused) - private ConstantPool constant_pool; // TODO could be final (setter unused) + private int byte_code_offset_delta; // TODO could be final if ctor were rewritten + private StackMapType[] types_of_locals; // TODO could be final if ctor were rewritten + private StackMapType[] types_of_stack_items; // TODO could be final if ctor were rewritten + private final ConstantPool constant_pool; // TODO could be final if ctor were rewritten /** @@ -196,11 +196,6 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } - public void setByteCodeOffsetDelta( int b ) { // TODO unused - byte_code_offset_delta = b; - } - - public int getByteCodeOffsetDelta() { return byte_code_offset_delta; } @@ -211,11 +206,6 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } - public void setTypesOfLocals( StackMapType[] types ) { // TODO unused - types_of_locals = types != null ? types : new StackMapType[0]; - } - - public StackMapType[] getTypesOfLocals() { return types_of_locals; } @@ -226,11 +216,6 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } - public void setTypesOfStackItems( StackMapType[] types ) { // TODO unused - types_of_stack_items = types != null ? types : new StackMapType[0]; - } - - public StackMapType[] getTypesOfStackItems() { return types_of_stack_items; } @@ -267,11 +252,4 @@ public final class StackMapTableEntry implements Cloneable, Serializable { return constant_pool; } - - /** - * @param constant_pool Constant pool to be used for this object. - */ - public final void setConstantPool( ConstantPool constant_pool ) { - this.constant_pool = constant_pool; - } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java index d6eda632..00ec4df5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java @@ -37,9 +37,9 @@ public final class StackMapType implements Cloneable, Serializable { private static final long serialVersionUID = 1L; - private byte type; - private int index = -1; // Index to CONSTANT_Class or offset - private ConstantPool constant_pool; + private final byte type; + private final int index; // Index to CONSTANT_Class or offset + private final ConstantPool constant_pool; /** @@ -48,10 +48,12 @@ public final class StackMapType implements Cloneable, Serializable { * @throws IOException */ StackMapType(DataInput file, ConstantPool constant_pool) throws IOException { - this(file.readByte(), -1, constant_pool); - if (hasIndex()) { - this.index = (int) file.readShort(); + byte type = file.readByte(); + if ((type < Constants.ITEM_Bogus) || (type > Constants.ITEM_NewObject)) { + throw new RuntimeException("Illegal type for StackMapType: " + type); } + this.type = type; + this.index = hasIndex() ? (int) file.readShort() : -1; this.constant_pool = constant_pool; } @@ -70,24 +72,11 @@ public final class StackMapType implements Cloneable, Serializable { } - public void setType( byte t ) { // TODO unused - if ((t < Constants.ITEM_Bogus) || (t > Constants.ITEM_NewObject)) { - throw new RuntimeException("Illegal type for StackMapType: " + t); - } - type = t; - } - - public byte getType() { return type; } - public void setIndex( int t ) { // TODO unused - index = t; - } - - /** @return index to constant pool if type == ITEM_Object, or offset * in byte code, if type == ITEM_NewObject, and -1 otherwise */ @@ -159,11 +148,4 @@ public final class StackMapType implements Cloneable, Serializable { return constant_pool; } - - /** - * @param constant_pool Constant pool to be used for this object. - */ - public final void setConstantPool( ConstantPool constant_pool ) { // TODO unused - this.constant_pool = constant_pool; - } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java index 061e0c4a..f1fa492b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java @@ -38,7 +38,7 @@ import org.apache.commons.bcel6.Constants; public final class Synthetic extends Attribute { private static final long serialVersionUID = -123334426995458366L; - private byte[] bytes; + private byte[] bytes; // TODO could be final if copy() and ctor were recoded /** @@ -120,14 +120,6 @@ public final class Synthetic extends Attribute { } - /** - * @param bytes - */ - public final void setBytes( byte[] bytes ) { // TODO unused - this.bytes = bytes; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java index 935e5a8c..d1ef77d7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java @@ -41,7 +41,7 @@ import org.apache.commons.bcel6.Constants; public final class Unknown extends Attribute { private static final long serialVersionUID = -4099655108069755015L; - private byte[] bytes; + private byte[] bytes; // TODO could be final if copy() were adjusted private final String name; private static final Map unknown_attributes = new HashMap(); @@ -146,14 +146,6 @@ public final class Unknown extends Attribute { } - /** - * @param bytes the bytes to set - */ - public final void setBytes( byte[] bytes ) { // TODO unused - this.bytes = bytes; - } - - /** * @return String representation. */ -- GitLab From 0af0fb3158488b64b4b02a794a757891bb636de9 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 14:59:42 +0000 Subject: [PATCH 0823/1313] BCEL-239 Interfaces should not be used to define constants Convert InstructionConstants to a class git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695546 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/generic/InstructionConstants.java | 2 +- .../bcel6/generic/InstructionFactory.java | 126 +++++++++--------- .../apache/commons/bcel6/generic/PUSH.java | 25 ++-- 3 files changed, 76 insertions(+), 77 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java index 11fcf950..435a37ea 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; * * @version $Id$ */ -public interface InstructionConstants { +public class InstructionConstants { /** Predefined instruction objects */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java index 8d01bde4..3cd24bcb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java @@ -28,7 +28,7 @@ import org.apache.commons.bcel6.Constants; * @version $Id$ * @see Constants */ -public class InstructionFactory implements InstructionConstants, java.io.Serializable { +public class InstructionFactory implements java.io.Serializable { private static final long serialVersionUID = -1210011499635580258L; @@ -287,21 +287,21 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali switch (type.getType()) { case Constants.T_ARRAY: case Constants.T_OBJECT: - return ARETURN; + return InstructionConstants.ARETURN; case Constants.T_INT: case Constants.T_SHORT: case Constants.T_BOOLEAN: case Constants.T_CHAR: case Constants.T_BYTE: - return IRETURN; + return InstructionConstants.IRETURN; case Constants.T_FLOAT: - return FRETURN; + return InstructionConstants.FRETURN; case Constants.T_DOUBLE: - return DRETURN; + return InstructionConstants.DRETURN; case Constants.T_LONG: - return LRETURN; + return InstructionConstants.LRETURN; case Constants.T_VOID: - return RETURN; + return InstructionConstants.RETURN; default: throw new RuntimeException("Invalid type: " + type); } @@ -311,25 +311,25 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali private static ArithmeticInstruction createBinaryIntOp( char first, String op ) { switch (first) { case '-': - return ISUB; + return InstructionConstants.ISUB; case '+': - return IADD; + return InstructionConstants.IADD; case '%': - return IREM; + return InstructionConstants.IREM; case '*': - return IMUL; + return InstructionConstants.IMUL; case '/': - return IDIV; + return InstructionConstants.IDIV; case '&': - return IAND; + return InstructionConstants.IAND; case '|': - return IOR; + return InstructionConstants.IOR; case '^': - return IXOR; + return InstructionConstants.IXOR; case '<': - return ISHL; + return InstructionConstants.ISHL; case '>': - return op.equals(">>>") ? IUSHR : ISHR; + return op.equals(">>>") ? InstructionConstants.IUSHR : InstructionConstants.ISHR; default: throw new RuntimeException("Invalid operand " + op); } @@ -339,25 +339,25 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali private static ArithmeticInstruction createBinaryLongOp( char first, String op ) { switch (first) { case '-': - return LSUB; + return InstructionConstants.LSUB; case '+': - return LADD; + return InstructionConstants.LADD; case '%': - return LREM; + return InstructionConstants.LREM; case '*': - return LMUL; + return InstructionConstants.LMUL; case '/': - return LDIV; + return InstructionConstants.LDIV; case '&': - return LAND; + return InstructionConstants.LAND; case '|': - return LOR; + return InstructionConstants.LOR; case '^': - return LXOR; + return InstructionConstants.LXOR; case '<': - return LSHL; + return InstructionConstants.LSHL; case '>': - return op.equals(">>>") ? LUSHR : LSHR; + return op.equals(">>>") ? InstructionConstants.LUSHR : InstructionConstants.LSHR; default: throw new RuntimeException("Invalid operand " + op); } @@ -367,15 +367,15 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali private static ArithmeticInstruction createBinaryFloatOp( char op ) { switch (op) { case '-': - return FSUB; + return InstructionConstants.FSUB; case '+': - return FADD; + return InstructionConstants.FADD; case '*': - return FMUL; + return InstructionConstants.FMUL; case '/': - return FDIV; + return InstructionConstants.FDIV; case '%': - return FREM; + return InstructionConstants.FREM; default: throw new RuntimeException("Invalid operand " + op); } @@ -385,15 +385,15 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali private static ArithmeticInstruction createBinaryDoubleOp( char op ) { switch (op) { case '-': - return DSUB; + return InstructionConstants.DSUB; case '+': - return DADD; + return InstructionConstants.DADD; case '*': - return DMUL; + return InstructionConstants.DMUL; case '/': - return DDIV; + return InstructionConstants.DDIV; case '%': - return DREM; + return InstructionConstants.DREM; default: throw new RuntimeException("Invalid operand " + op); } @@ -429,7 +429,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali * @param size size of operand, either 1 (int, e.g.) or 2 (double) */ public static StackInstruction createPop( int size ) { - return (size == 2) ? POP2 : POP; + return (size == 2) ? InstructionConstants.POP2 : InstructionConstants.POP; } @@ -437,7 +437,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali * @param size size of operand, either 1 (int, e.g.) or 2 (double) */ public static StackInstruction createDup( int size ) { - return (size == 2) ? DUP2 : DUP; + return (size == 2) ? InstructionConstants.DUP2 : InstructionConstants.DUP; } @@ -445,7 +445,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali * @param size size of operand, either 1 (int, e.g.) or 2 (double) */ public static StackInstruction createDup_2( int size ) { - return (size == 2) ? DUP2_X2 : DUP_X2; + return (size == 2) ? InstructionConstants.DUP2_X2 : InstructionConstants.DUP_X2; } @@ -453,7 +453,7 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali * @param size size of operand, either 1 (int, e.g.) or 2 (double) */ public static StackInstruction createDup_1( int size ) { - return (size == 2) ? DUP2_X1 : DUP_X1; + return (size == 2) ? InstructionConstants.DUP2_X1 : InstructionConstants.DUP_X1; } @@ -516,22 +516,22 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali switch (type.getType()) { case Constants.T_BOOLEAN: case Constants.T_BYTE: - return BALOAD; + return InstructionConstants.BALOAD; case Constants.T_CHAR: - return CALOAD; + return InstructionConstants.CALOAD; case Constants.T_SHORT: - return SALOAD; + return InstructionConstants.SALOAD; case Constants.T_INT: - return IALOAD; + return InstructionConstants.IALOAD; case Constants.T_FLOAT: - return FALOAD; + return InstructionConstants.FALOAD; case Constants.T_DOUBLE: - return DALOAD; + return InstructionConstants.DALOAD; case Constants.T_LONG: - return LALOAD; + return InstructionConstants.LALOAD; case Constants.T_ARRAY: case Constants.T_OBJECT: - return AALOAD; + return InstructionConstants.AALOAD; default: throw new RuntimeException("Invalid type " + type); } @@ -545,22 +545,22 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali switch (type.getType()) { case Constants.T_BOOLEAN: case Constants.T_BYTE: - return BASTORE; + return InstructionConstants.BASTORE; case Constants.T_CHAR: - return CASTORE; + return InstructionConstants.CASTORE; case Constants.T_SHORT: - return SASTORE; + return InstructionConstants.SASTORE; case Constants.T_INT: - return IASTORE; + return InstructionConstants.IASTORE; case Constants.T_FLOAT: - return FASTORE; + return InstructionConstants.FASTORE; case Constants.T_DOUBLE: - return DASTORE; + return InstructionConstants.DASTORE; case Constants.T_LONG: - return LASTORE; + return InstructionConstants.LASTORE; case Constants.T_ARRAY: case Constants.T_OBJECT: - return AASTORE; + return InstructionConstants.AASTORE; default: throw new RuntimeException("Invalid type " + type); } @@ -677,21 +677,21 @@ public class InstructionFactory implements InstructionConstants, java.io.Seriali switch (type.getType()) { case Constants.T_ARRAY: case Constants.T_OBJECT: - return ACONST_NULL; + return InstructionConstants.ACONST_NULL; case Constants.T_INT: case Constants.T_SHORT: case Constants.T_BOOLEAN: case Constants.T_CHAR: case Constants.T_BYTE: - return ICONST_0; + return InstructionConstants.ICONST_0; case Constants.T_FLOAT: - return FCONST_0; + return InstructionConstants.FCONST_0; case Constants.T_DOUBLE: - return DCONST_0; + return InstructionConstants.DCONST_0; case Constants.T_LONG: - return LCONST_0; + return InstructionConstants.LCONST_0; case Constants.T_VOID: - return NOP; + return InstructionConstants.NOP; default: throw new RuntimeException("Invalid type: " + type); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java index 667c2e25..e1609884 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java @@ -25,8 +25,7 @@ import org.apache.commons.bcel6.Constants; * * @version $Id$ */ -public final class PUSH implements CompoundInstruction, VariableLengthInstruction, - InstructionConstants { +public final class PUSH implements CompoundInstruction, VariableLengthInstruction { private Instruction instruction; @@ -39,7 +38,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio */ public PUSH(ConstantPoolGen cp, int value) { if ((value >= -1) && (value <= 5)) { - instruction = INSTRUCTIONS[Constants.ICONST_0 + value]; + instruction = InstructionConstants.INSTRUCTIONS[Constants.ICONST_0 + value]; } else if ((value >= -128) && (value <= 127)) { instruction = new BIPUSH((byte) value); } else if ((value >= -32768) && (value <= 32767)) { @@ -55,7 +54,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * @param value to be pushed */ public PUSH(ConstantPoolGen cp, boolean value) { - instruction = INSTRUCTIONS[Constants.ICONST_0 + (value ? 1 : 0)]; + instruction = InstructionConstants.INSTRUCTIONS[Constants.ICONST_0 + (value ? 1 : 0)]; } @@ -65,11 +64,11 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio */ public PUSH(ConstantPoolGen cp, float value) { if (value == 0.0) { - instruction = FCONST_0; + instruction = InstructionConstants.FCONST_0; } else if (value == 1.0) { - instruction = FCONST_1; + instruction = InstructionConstants.FCONST_1; } else if (value == 2.0) { - instruction = FCONST_2; + instruction = InstructionConstants.FCONST_2; } else { instruction = new LDC(cp.addFloat(value)); } @@ -82,9 +81,9 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio */ public PUSH(ConstantPoolGen cp, long value) { if (value == 0) { - instruction = LCONST_0; + instruction = InstructionConstants.LCONST_0; } else if (value == 1) { - instruction = LCONST_1; + instruction = InstructionConstants.LCONST_1; } else { instruction = new LDC2_W(cp.addLong(value)); } @@ -97,9 +96,9 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio */ public PUSH(ConstantPoolGen cp, double value) { if (value == 0.0) { - instruction = DCONST_0; + instruction = InstructionConstants.DCONST_0; } else if (value == 1.0) { - instruction = DCONST_1; + instruction = InstructionConstants.DCONST_1; } else { instruction = new LDC2_W(cp.addDouble(value)); } @@ -112,7 +111,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio */ public PUSH(ConstantPoolGen cp, String value) { if (value == null) { - instruction = ACONST_NULL; + instruction = InstructionConstants.ACONST_NULL; } else { instruction = new LDC(cp.addString(value)); } @@ -125,7 +124,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio */ public PUSH(ConstantPoolGen cp, ObjectType value) { if (value == null) { - instruction = ACONST_NULL; + instruction = InstructionConstants.ACONST_NULL; } else { instruction = new LDC(cp.addClass(value)); } -- GitLab From db84d4027bf3c4e2ea9f3c011e10fee7866235a4 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 15:29:23 +0000 Subject: [PATCH 0824/1313] BCEL-239 Interfaces should not be used to define constants git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695556 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../org/apache/commons/bcel6/Constants.java | 2 +- .../bcel6/classfile/AnnotationEntry.java | 6 +- .../bcel6/classfile/CodeException.java | 4 +- .../bcel6/classfile/LocalVariable.java | 6 +- .../classfile/ParameterAnnotationEntry.java | 4 +- .../commons/bcel6/util/AttributeHTML.java | 25 ++- .../apache/commons/bcel6/util/Class2HTML.java | 4 +- .../apache/commons/bcel6/util/CodeHTML.java | 205 +++++++++--------- .../commons/bcel6/util/ConstantHTML.java | 43 ++-- .../apache/commons/bcel6/util/MethodHTML.java | 9 +- .../bcel6/verifier/statics/Pass2Verifier.java | 27 +-- .../structurals/UninitializedObjectType.java | 4 +- .../tests/TestArrayAccess02Creator.java | 8 +- .../tests/TestArrayAccess03Creator.java | 8 +- .../tests/TestArrayAccess04Creator.java | 8 +- .../verifier/tests/TestReturn01Creator.java | 8 +- .../verifier/tests/TestReturn03Creator.java | 8 +- 18 files changed, 192 insertions(+), 188 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 83e7bb47..29f7e10b 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Interfaces should not be used to define constants Remove unused setters Make mutable fields private The access_flags field in AccessFlags class should be final diff --git a/src/main/java/org/apache/commons/bcel6/Constants.java b/src/main/java/org/apache/commons/bcel6/Constants.java index 1d9916f8..dadbfb51 100644 --- a/src/main/java/org/apache/commons/bcel6/Constants.java +++ b/src/main/java/org/apache/commons/bcel6/Constants.java @@ -22,7 +22,7 @@ package org.apache.commons.bcel6; * * @version $Id$ */ -public interface Constants { +public class Constants { /** Major version number of class files for Java 1.1. * @see #MINOR_1_1 diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java index 0d15914e..ad827ec6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.Constants; * @version $Id: AnnotationEntry * @since 6.0 */ -public class AnnotationEntry implements Node, Constants, Serializable { +public class AnnotationEntry implements Node, Serializable { private static final long serialVersionUID = 1L; @@ -43,7 +43,7 @@ public class AnnotationEntry implements Node, Constants, Serializable { private List element_value_pairs; - /** + /* * Factory method to create an AnnotionEntry from a DataInput * * @param input @@ -96,7 +96,7 @@ public class AnnotationEntry implements Node, Constants, Serializable { * @return the annotation type name */ public String getAnnotationType() { - final ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(type_index, CONSTANT_Utf8); + final ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(type_index, Constants.CONSTANT_Utf8); return c.getBytes(); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java index 16f63c58..8db6ad4a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java @@ -32,7 +32,7 @@ import org.apache.commons.bcel6.Constants; * @version $Id$ * @see Code */ -public final class CodeException implements Cloneable, Constants, Node, Serializable { +public final class CodeException implements Cloneable, Node, Serializable { private static final long serialVersionUID = 2972500041254967221L; private final int start_pc; // Range in the code the exception handler is @@ -160,7 +160,7 @@ public final class CodeException implements Cloneable, Constants, Node, Serializ if (catch_type == 0) { str = "(0)"; } else { - str = Utility.compactClassName(cp.getConstantString(catch_type, CONSTANT_Class), false) + str = Utility.compactClassName(cp.getConstantString(catch_type, Constants.CONSTANT_Class), false) + (verbose ? "(" + catch_type + ")" : ""); } return start_pc + "\t" + end_pc + "\t" + handler_pc + "\t" + str; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java index d75f267c..fdc9ec89 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java @@ -31,7 +31,7 @@ import org.apache.commons.bcel6.Constants; * @version $Id$ * @see LocalVariableTable */ -public final class LocalVariable implements Constants, Cloneable, Node, Serializable { +public final class LocalVariable implements Cloneable, Node, Serializable { private static final long serialVersionUID = -51081099265972179L; private final int start_pc; // Range in which the variable is valid @@ -132,7 +132,7 @@ public final class LocalVariable implements Constants, Cloneable, Node, Serializ */ public final String getName() { ConstantUtf8 c; - c = (ConstantUtf8) constant_pool.getConstant(name_index, CONSTANT_Utf8); + c = (ConstantUtf8) constant_pool.getConstant(name_index, Constants.CONSTANT_Utf8); return c.getBytes(); } @@ -150,7 +150,7 @@ public final class LocalVariable implements Constants, Cloneable, Node, Serializ */ public final String getSignature() { ConstantUtf8 c; - c = (ConstantUtf8) constant_pool.getConstant(signature_index, CONSTANT_Utf8); + c = (ConstantUtf8) constant_pool.getConstant(signature_index, Constants.CONSTANT_Utf8); return c.getBytes(); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java index 21acbdbf..c53772be 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java @@ -24,15 +24,13 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.apache.commons.bcel6.Constants; - /** * represents one parameter annotation in the parameter annotation table * * @version $Id: ParameterAnnotationEntry * @since 6.0 */ -public class ParameterAnnotationEntry implements Node, Constants { +public class ParameterAnnotationEntry implements Node { private final AnnotationEntry[] annotation_table; diff --git a/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java b/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java index 141106a0..0cab67e0 100644 --- a/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java @@ -21,6 +21,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; +import org.apache.commons.bcel6.Constants; import org.apache.commons.bcel6.classfile.Attribute; import org.apache.commons.bcel6.classfile.Code; import org.apache.commons.bcel6.classfile.CodeException; @@ -43,7 +44,7 @@ import org.apache.commons.bcel6.classfile.Utility; * @version $Id$ * */ -final class AttributeHTML implements org.apache.commons.bcel6.Constants { +final class AttributeHTML { private final String class_name; // name of current class private final PrintWriter file; // file to write to @@ -82,7 +83,7 @@ final class AttributeHTML implements org.apache.commons.bcel6.Constants { final void writeAttribute( Attribute attribute, String anchor, int method_number ) { byte tag = attribute.getTag(); int index; - if (tag == ATTR_UNKNOWN) { + if (tag == Constants.ATTR_UNKNOWN) { return; } attr_count++; // Increment number of attributes found so far @@ -91,12 +92,12 @@ final class AttributeHTML implements org.apache.commons.bcel6.Constants { } else { file.print(""); } - file.println("

    " + attr_count + " " + ATTRIBUTE_NAMES[tag] + file.println("

    " + attr_count + " " + Constants.ATTRIBUTE_NAMES[tag] + "

    "); /* Handle different attributes */ switch (tag) { - case ATTR_CODE: + case Constants.ATTR_CODE: Code c = (Code) attribute; // Some directly printable values file.print("
    • Maximum stack size = " + c.getMaxStack() @@ -124,20 +125,20 @@ final class AttributeHTML implements org.apache.commons.bcel6.Constants { file.print("
    "); } break; - case ATTR_CONSTANT_VALUE: + case Constants.ATTR_CONSTANT_VALUE: index = ((ConstantValue) attribute).getConstantValueIndex(); // Reference _cp.html file.print("\n"); break; - case ATTR_SOURCE_FILE: + case Constants.ATTR_SOURCE_FILE: index = ((SourceFile) attribute).getSourceFileIndex(); // Reference _cp.html file.print("\n"); break; - case ATTR_EXCEPTIONS: + case Constants.ATTR_EXCEPTIONS: // List thrown exceptions int[] indices = ((ExceptionTable) attribute).getExceptionIndexTable(); file.print("
      "); @@ -148,7 +149,7 @@ final class AttributeHTML implements org.apache.commons.bcel6.Constants { } file.print("
    \n"); break; - case ATTR_LINE_NUMBER_TABLE: + case Constants.ATTR_LINE_NUMBER_TABLE: LineNumber[] line_numbers = ((LineNumberTable) attribute).getLineNumberTable(); // List line number pairs file.print("

    "); @@ -160,14 +161,14 @@ final class AttributeHTML implements org.apache.commons.bcel6.Constants { } } break; - case ATTR_LOCAL_VARIABLE_TABLE: + case Constants.ATTR_LOCAL_VARIABLE_TABLE: LocalVariable[] vars = ((LocalVariableTable) attribute).getLocalVariableTable(); // List name, range and type file.print("

      "); for (LocalVariable var : vars) { index = var.getSignatureIndex(); String signature = ((ConstantUtf8) constant_pool.getConstant(index, - CONSTANT_Utf8)).getBytes(); + Constants.CONSTANT_Utf8)).getBytes(); signature = Utility.signatureToString(signature, false); int start = var.getStartPC(); int end = (start + var.getLength()); @@ -180,7 +181,7 @@ final class AttributeHTML implements org.apache.commons.bcel6.Constants { } file.print("
    \n"); break; - case ATTR_INNER_CLASSES: + case Constants.ATTR_INNER_CLASSES: InnerClass[] classes = ((InnerClasses) attribute).getInnerClasses(); // List inner classes file.print(""); break; - case CONSTANT_Fieldref: + case Constants.CONSTANT_Fieldref: // Get class_index and name_and_type_index ConstantFieldref c3 = (ConstantFieldref) constant_pool.getConstant(index, - CONSTANT_Fieldref); + Constants.CONSTANT_Fieldref); class_index = c3.getClassIndex(); name_index = c3.getNameAndTypeIndex(); // Get method name and its class (compacted) - String field_class = constant_pool.constantToString(class_index, CONSTANT_Class); + String field_class = constant_pool.constantToString(class_index, Constants.CONSTANT_Class); String short_field_class = Utility.compactClassName(field_class); // I.e., remove java.lang. short_field_class = Utility.compactClassName(short_field_class, class_package + ".", true); // Remove class package prefix String field_name = constant_pool - .constantToString(name_index, CONSTANT_NameAndType); + .constantToString(name_index, Constants.CONSTANT_NameAndType); if (field_class.equals(class_name)) { ref = "" + field_name + ""; @@ -180,8 +181,8 @@ final class ConstantHTML implements org.apache.commons.bcel6.Constants { + "
  • NameAndType(" + name_index + ")"); break; - case CONSTANT_Class: - ConstantClass c4 = (ConstantClass) constant_pool.getConstant(index, CONSTANT_Class); + case Constants.CONSTANT_Class: + ConstantClass c4 = (ConstantClass) constant_pool.getConstant(index, Constants.CONSTANT_Class); name_index = c4.getNameIndex(); String class_name2 = constant_pool.constantToString(index, tag); // / -> . String short_class_name = Utility.compactClassName(class_name2); // I.e., remove java.lang. @@ -194,17 +195,17 @@ final class ConstantHTML implements org.apache.commons.bcel6.Constants { file.println("

    " + ref + "

    \n"); break; - case CONSTANT_String: + case Constants.CONSTANT_String: ConstantString c5 = (ConstantString) constant_pool.getConstant(index, - CONSTANT_String); + Constants.CONSTANT_String); name_index = c5.getStringIndex(); String str = Class2HTML.toHTML(constant_pool.constantToString(index, tag)); file.println("

    " + str + "

    \n"); break; - case CONSTANT_NameAndType: + case Constants.CONSTANT_NameAndType: ConstantNameAndType c6 = (ConstantNameAndType) constant_pool.getConstant(index, - CONSTANT_NameAndType); + Constants.CONSTANT_NameAndType); name_index = c6.getNameIndex(); int signature_index = c6.getSignatureIndex(); file.println("

    " diff --git a/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java b/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java index c82a022e..b1f67949 100644 --- a/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java @@ -21,6 +21,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; +import org.apache.commons.bcel6.Constants; import org.apache.commons.bcel6.classfile.Attribute; import org.apache.commons.bcel6.classfile.Code; import org.apache.commons.bcel6.classfile.ConstantValue; @@ -35,7 +36,7 @@ import org.apache.commons.bcel6.classfile.Utility; * @version $Id$ * */ -final class MethodHTML implements org.apache.commons.bcel6.Constants { +final class MethodHTML { private final String class_name; // name of current class private final PrintWriter file; // file to write to @@ -88,7 +89,7 @@ final class MethodHTML implements org.apache.commons.bcel6.Constants { attribute_html.writeAttribute(attributes[i], name + "@" + i); } for (int i = 0; i < attributes.length; i++) { - if (attributes[i].getTag() == ATTR_CONSTANT_VALUE) { // Default value + if (attributes[i].getTag() == Constants.ATTR_CONSTANT_VALUE) { // Default value String str = ((ConstantValue) attributes[i]).toString(); // Reference attribute in _attributes.html file.print("= throws"); int[] exceptions = ((ExceptionTable) attributes[i]).getExceptionIndexTable(); for (int j = 0; j < exceptions.length; j++) { @@ -145,7 +146,7 @@ final class MethodHTML implements org.apache.commons.bcel6.Constants { } } file.println(""); - } else if (tag == ATTR_CODE) { + } else if (tag == Constants.ATTR_CODE) { Attribute[] c_a = ((Code) attributes[i]).getAttributes(); for (int j = 0; j < c_a.length; j++) { attribute_html.writeAttribute(c_a[j], "method" + method_number + "@" + i + "@" diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java index 80ba973b..8bdf808a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java @@ -19,6 +19,7 @@ package org.apache.commons.bcel6.verifier.statics; import java.util.HashMap; + import java.util.HashSet; import java.util.Locale; import java.util.Map; @@ -82,7 +83,7 @@ import org.apache.commons.bcel6.verifier.exc.LocalVariableInfoInconsistentExcept * @version $Id$ * @see #do_verify() */ -public final class Pass2Verifier extends PassVerifier implements Constants{ +public final class Pass2Verifier extends PassVerifier { /** * The LocalVariableInfo instances used by Pass3bVerifier. @@ -537,7 +538,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } } - if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_VOLATILE|ACC_TRANSIENT)) > 0){ + if ((obj.getAccessFlags() & ~(Constants.ACC_PUBLIC|Constants.ACC_PRIVATE|Constants.ACC_PROTECTED|Constants.ACC_STATIC|Constants.ACC_FINAL|Constants.ACC_VOLATILE|Constants.ACC_TRANSIENT)) > 0){ addMessage("Field '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, ACC_TRANSIENT set (ignored)."); } @@ -638,7 +639,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } // Nearly forgot this! Funny return values are allowed, but a non-empty arguments list makes a different method out of it! - if (name.equals(STATIC_INITIALIZER_NAME) && (ts.length != 0)){ + if (name.equals(Constants.STATIC_INITIALIZER_NAME) && (ts.length != 0)){ throw new ClassConstraintException("Method '"+tostring(obj)+"' has illegal name '"+name+"'. It's name resembles the class or interface initialization method which it isn't because of its arguments (==descriptor)."); } @@ -679,7 +680,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } // A specific instance initialization method... (vmspec2,Page 116). - if (name.equals(CONSTRUCTOR_NAME)) { + if (name.equals(Constants.CONSTRUCTOR_NAME)) { //..may have at most one of ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC set: is checked above. //..may also have ACC_STRICT set, but none of the other flags in table 4.5 (vmspec2, page 115) if (obj.isStatic() || @@ -692,8 +693,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } } else{ // isInterface! - if (!name.equals(STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph - if (jc.getMajor() >= MAJOR_1_8) { + if (!name.equals(Constants.STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph + if (jc.getMajor() >= Constants.MAJOR_1_8) { if (!(obj.isPublic() ^ obj.isPrivate())) { throw new ClassConstraintException("Interface method '" + tostring(obj) + "' must have exactly one of its ACC_PUBLIC and ACC_PRIVATE modifiers set."); } @@ -724,7 +725,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } } - if ((obj.getAccessFlags() & ~(ACC_PUBLIC|ACC_PRIVATE|ACC_PROTECTED|ACC_STATIC|ACC_FINAL|ACC_SYNCHRONIZED|ACC_NATIVE|ACC_ABSTRACT|ACC_STRICT)) > 0){ + if ((obj.getAccessFlags() & ~(Constants.ACC_PUBLIC|Constants.ACC_PRIVATE|Constants.ACC_PROTECTED|Constants.ACC_STATIC|Constants.ACC_FINAL|Constants.ACC_SYNCHRONIZED|Constants.ACC_NATIVE|Constants.ACC_ABSTRACT|Constants.ACC_STRICT)) > 0){ addMessage("Method '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT set (ignored)."); } @@ -827,7 +828,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ checkIndex(obj, innername_idx, CONST_Utf8); } int acc = ic.getInnerAccessFlags(); - acc = acc & (~ (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL | ACC_INTERFACE | ACC_ABSTRACT)); + acc = acc & (~ (Constants.ACC_PUBLIC | Constants.ACC_PRIVATE | Constants.ACC_PROTECTED | Constants.ACC_STATIC | Constants.ACC_FINAL | Constants.ACC_INTERFACE | Constants.ACC_ABSTRACT)); if (acc != 0){ addMessage("Unknown access flag for inner class '"+tostring(ic)+"' set (InnerClasses attribute '"+tostring(obj)+"')."); } @@ -1263,7 +1264,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ try{ Type t = Type.getReturnType(sig); - if ( name.equals(CONSTRUCTOR_NAME) && (t != Type.VOID) ){ + if ( name.equals(Constants.CONSTRUCTOR_NAME) && (t != Type.VOID) ){ throw new ClassConstraintException("Instance initialization method must have VOID return type."); } } @@ -1295,8 +1296,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ try{ Type t = Type.getReturnType(sig); - if ( name.equals(STATIC_INITIALIZER_NAME) && (t != Type.VOID) ){ - addMessage("Class or interface initialization method '"+STATIC_INITIALIZER_NAME+"' usually has VOID return type instead of '"+t+"'. Note this is really not a requirement of The Java Virtual Machine Specification, Second Edition."); + if ( name.equals(Constants.STATIC_INITIALIZER_NAME) && (t != Type.VOID) ){ + addMessage("Class or interface initialization method '"+Constants.STATIC_INITIALIZER_NAME+"' usually has VOID return type instead of '"+t+"'. Note this is really not a requirement of The Java Virtual Machine Specification, Second Edition."); } } catch (ClassFormatException cfe){ @@ -1332,10 +1333,10 @@ public final class Pass2Verifier extends PassVerifier implements Constants{ } if (allowStaticInit){ - return (name.equals(CONSTRUCTOR_NAME) || name.equals(STATIC_INITIALIZER_NAME)); + return (name.equals(Constants.CONSTRUCTOR_NAME) || name.equals(Constants.STATIC_INITIALIZER_NAME)); } else{ - return name.equals(CONSTRUCTOR_NAME); + return name.equals(Constants.CONSTRUCTOR_NAME); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java index 7f5a3825..156d2f0a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java @@ -29,7 +29,7 @@ import org.apache.commons.bcel6.generic.ReferenceType; * * @version $Id$ */ -public class UninitializedObjectType extends ReferenceType implements Constants{ +public class UninitializedObjectType extends ReferenceType{ private static final long serialVersionUID = -1228341777713117641L; /** The "initialized" version. */ @@ -37,7 +37,7 @@ public class UninitializedObjectType extends ReferenceType implements Constants{ /** Creates a new instance. */ public UninitializedObjectType(ObjectType t){ - super(T_UNKNOWN, ""); + super(Constants.T_UNKNOWN, ""); initialized = t; } diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java index 23a16b4a..e4f3c739 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java @@ -33,13 +33,13 @@ import org.apache.commons.bcel6.generic.PUSH; import org.apache.commons.bcel6.generic.Type; import org.junit.Assert; -public class TestArrayAccess02Creator extends TestCreator implements Constants { +public class TestArrayAccess02Creator extends TestCreator { private InstructionFactory _factory; private ConstantPoolGen _cp; private ClassGen _cg; public TestArrayAccess02Creator() { - _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", "java.lang.Object", "TestArrayAccess02.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", "java.lang.Object", "TestArrayAccess02.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -53,7 +53,7 @@ public class TestArrayAccess02Creator extends TestCreator implements Constants { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -68,7 +68,7 @@ public class TestArrayAccess02Creator extends TestCreator implements Constants { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); Assert.assertNotNull(ih_0); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java index 16cdabc4..2f7ca304 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java @@ -33,13 +33,13 @@ import org.apache.commons.bcel6.generic.PUSH; import org.apache.commons.bcel6.generic.Type; import org.junit.Assert; -public class TestArrayAccess03Creator extends TestCreator implements Constants { +public class TestArrayAccess03Creator extends TestCreator { private InstructionFactory _factory; private ConstantPoolGen _cp; private ClassGen _cg; public TestArrayAccess03Creator() { - _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", "java.lang.Object", "TestArrayAccess03.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", "java.lang.Object", "TestArrayAccess03.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -53,7 +53,7 @@ public class TestArrayAccess03Creator extends TestCreator implements Constants { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -68,7 +68,7 @@ public class TestArrayAccess03Creator extends TestCreator implements Constants { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); Assert.assertNotNull(ih_0); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java index b94f1c98..e64fa6f3 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java @@ -31,13 +31,13 @@ import org.apache.commons.bcel6.generic.PUSH; import org.apache.commons.bcel6.generic.Type; import org.junit.Assert; -public class TestArrayAccess04Creator extends TestCreator implements Constants { +public class TestArrayAccess04Creator extends TestCreator { private InstructionFactory _factory; private ConstantPoolGen _cp; private ClassGen _cg; public TestArrayAccess04Creator() { - _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", "java.lang.Object", "TestArrayAccess04.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", "java.lang.Object", "TestArrayAccess04.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -51,7 +51,7 @@ public class TestArrayAccess04Creator extends TestCreator implements Constants { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -66,7 +66,7 @@ public class TestArrayAccess04Creator extends TestCreator implements Constants { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); Assert.assertNotNull(ih_0); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java index 1cdf82a5..5505a495 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java @@ -31,13 +31,13 @@ import org.apache.commons.bcel6.generic.MethodGen; import org.apache.commons.bcel6.generic.Type; import org.junit.Assert; -public class TestReturn01Creator extends TestCreator implements Constants { +public class TestReturn01Creator extends TestCreator { private InstructionFactory _factory; private ConstantPoolGen _cp; private ClassGen _cg; public TestReturn01Creator() { - _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestReturn01", "java.lang.Object", "TestReturn01.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestReturn01", "java.lang.Object", "TestReturn01.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -51,7 +51,7 @@ public class TestReturn01Creator extends TestCreator implements Constants { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestReturn01", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestReturn01", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -66,7 +66,7 @@ public class TestReturn01Creator extends TestCreator implements Constants { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "foo", "org.apache.commons.bcel6.verifier.tests.TestReturn01", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "foo", "org.apache.commons.bcel6.verifier.tests.TestReturn01", il, _cp); InstructionHandle ih_0 = il.append(_factory.createNew("java.lang.Object")); Assert.assertNotNull(ih_0); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java index d3d59fc8..2f651087 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java @@ -31,13 +31,13 @@ import org.apache.commons.bcel6.generic.MethodGen; import org.apache.commons.bcel6.generic.Type; import org.junit.Assert; -public class TestReturn03Creator extends TestCreator implements Constants { +public class TestReturn03Creator extends TestCreator { private InstructionFactory _factory; private ConstantPoolGen _cp; private ClassGen _cg; public TestReturn03Creator() { - _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestReturn03", "java.lang.Object", "TestReturn03.java", ACC_PUBLIC | ACC_SUPER, new String[] { }); + _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestReturn03", "java.lang.Object", "TestReturn03.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -51,7 +51,7 @@ public class TestReturn03Creator extends TestCreator implements Constants { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestReturn03", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -66,7 +66,7 @@ public class TestReturn03Creator extends TestCreator implements Constants { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(ACC_PUBLIC | ACC_STATIC, Type.INT, Type.NO_ARGS, new String[] { }, "test3", "org.apache.commons.bcel6.verifier.tests.TestReturn03", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.INT, Type.NO_ARGS, new String[] { }, "test3", "org.apache.commons.bcel6.verifier.tests.TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(InstructionConstants.ACONST_NULL); Assert.assertNotNull(ih_0); // TODO why is this not used -- GitLab From 84120b06fd5a3edab73eb5eda6aab6595d7eacd7 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 15:35:39 +0000 Subject: [PATCH 0825/1313] BCEL-235 Remove unused setters (incomplete) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695558 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/AnnotationDefault.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java index 8ec856d1..c430ca66 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java @@ -33,7 +33,7 @@ public class AnnotationDefault extends Attribute { private static final long serialVersionUID = -4017327188724019487L; - private ElementValue default_value; // TODO could this be made final? + private final ElementValue default_value; // TODO could this be made final? /** * @param name_index Index pointing to the name Code @@ -42,8 +42,7 @@ public class AnnotationDefault extends Attribute { * @param constant_pool Array of constants */ AnnotationDefault(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { - this(name_index, length, (ElementValue) null, constant_pool); - default_value = ElementValue.readElementValue(input, constant_pool); + this(name_index, length, ElementValue.readElementValue(input, constant_pool), constant_pool); } /** @@ -69,13 +68,6 @@ public class AnnotationDefault extends Attribute { v.visitAnnotationDefault(this); } - /** - * @param defaultValue the default value of this methodinfo's annotation - */ - public final void setDefaultValue(ElementValue defaultValue) { - default_value = defaultValue; - } - /** * @return the default value */ -- GitLab From cdb2699fdcd74fd4698aa5c66a35c6705e8ced2c Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 15:55:32 +0000 Subject: [PATCH 0826/1313] BCEL-235 Remove unused setters (incomplete) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695560 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/Annotations.java | 19 ++- .../bcel6/classfile/BootstrapMethod.java | 24 +--- .../commons/bcel6/classfile/ConstantPool.java | 10 +- .../commons/bcel6/classfile/JavaClass.java | 112 ------------------ .../bcel6/generic/ConstantPoolGen.java | 13 +- 5 files changed, 15 insertions(+), 163 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java index 11ded979..e597023e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java @@ -31,7 +31,7 @@ public abstract class Annotations extends Attribute { private static final long serialVersionUID = 1L; - private AnnotationEntry[] annotation_table; // TODO could this be final? + private final AnnotationEntry[] annotation_table; private final boolean isRuntimeVisible; /** @@ -42,12 +42,16 @@ public abstract class Annotations extends Attribute { * @param constant_pool Array of constants */ Annotations(byte annotation_type, int name_index, int length, DataInput input, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { - this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool, isRuntimeVisible); + this(annotation_type, name_index, length, makeAnnotationTable(input, constant_pool, isRuntimeVisible), constant_pool, isRuntimeVisible); + } + + static AnnotationEntry[] makeAnnotationTable(DataInput input, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { final int annotation_table_length = (input.readUnsignedShort()); - annotation_table = new AnnotationEntry[annotation_table_length]; + AnnotationEntry[] at = new AnnotationEntry[annotation_table_length]; for (int i = 0; i < annotation_table_length; i++) { - annotation_table[i] = AnnotationEntry.read(input, constant_pool, isRuntimeVisible); + at[i] = AnnotationEntry.read(input, constant_pool, isRuntimeVisible); } + return at; } /** @@ -74,13 +78,6 @@ public abstract class Annotations extends Attribute { v.visitAnnotation(this); } - /** - * @param annotation_table the entries to set in this annotation - */ - public final void setAnnotationTable(AnnotationEntry[] annotation_table) { - this.annotation_table = annotation_table; - } - /** * returns the array of annotation entries in this annotation */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java index f4ec3e09..881e286e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java @@ -37,12 +37,12 @@ public class BootstrapMethod implements Serializable, Cloneable { private static final long serialVersionUID = -4517534834047695344L; /** Index of the CONSTANT_MethodHandle_info structure in the constant_pool table */ - private int bootstrap_method_ref; // TODO this could be made final (setter is not used) + private final int bootstrap_method_ref; private final int num_bootstrap_arguments; /** Array of references to the constant_pool table */ - private int[] bootstrap_arguments; // TODO this could be made final (setter is not used) + private final int[] bootstrap_arguments; /** @@ -59,9 +59,9 @@ public class BootstrapMethod implements Serializable, Cloneable { * @throws IOException */ BootstrapMethod(DataInput input) throws IOException { - this(input.readUnsignedShort(), input.readUnsignedShort(), (int[]) null); - - bootstrap_arguments = new int[num_bootstrap_arguments]; + this.bootstrap_method_ref = input.readUnsignedShort(); + this.num_bootstrap_arguments = input.readUnsignedShort(); + this.bootstrap_arguments = new int[num_bootstrap_arguments]; for (int i = 0; i < num_bootstrap_arguments; i++) { bootstrap_arguments[i] = input.readUnsignedShort(); } @@ -86,13 +86,6 @@ public class BootstrapMethod implements Serializable, Cloneable { return bootstrap_method_ref; } - /** - * @param bootstrap_method_ref int index into constant_pool of CONSTANT_MethodHandle - */ - public void setBootstrapMethodRef(int bootstrap_method_ref) { - this.bootstrap_method_ref = bootstrap_method_ref; - } - /** * @return int[] of bootstrap_method indices into constant_pool of CONSTANT__info */ @@ -107,13 +100,6 @@ public class BootstrapMethod implements Serializable, Cloneable { return num_bootstrap_arguments; } - /** - * @param bootstrap_arguments int[] indices into constant_pool of CONSTANT__info - */ - public void setBootstrapArguments(int[] bootstrap_arguments) { - this.bootstrap_arguments = bootstrap_arguments; - } - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java index 5f049ed7..ff30cc92 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java @@ -39,7 +39,7 @@ import org.apache.commons.bcel6.Constants; public class ConstantPool implements Cloneable, Node, Serializable { private static final long serialVersionUID = -9093478476423540196L; - private Constant[] constant_pool; // TODO this could be final; the setConstantPool method is not called externally + private Constant[] constant_pool; // TODO this could be final if the copy() method were rewritten /** @@ -323,14 +323,6 @@ public class ConstantPool implements Cloneable, Node, Serializable { } - /** - * @param constant Constant to set - */ - public void setConstant( int index, Constant constant ) { - constant_pool[index] = constant; - } - - /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 686b990c..195f4d5b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -482,118 +482,6 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl } - /** - * @param attributes . - */ - public void setAttributes( Attribute[] attributes ) { - this.attributes = attributes; - } - - - /** - * @param class_name . - */ - public void setClassName( String class_name ) { - this.class_name = class_name; - } - - - /** - * @param class_name_index . - */ - public void setClassNameIndex( int class_name_index ) { - this.class_name_index = class_name_index; - } - - - /** - * @param constant_pool . - */ - public void setConstantPool( ConstantPool constant_pool ) { - this.constant_pool = constant_pool; - } - - - /** - * @param fields . - */ - public void setFields( Field[] fields ) { - this.fields = fields; - } - - - /** - * Set File name of class, aka SourceFile attribute value - */ - public void setFileName( String file_name ) { - this.file_name = file_name; - } - - - /** - * @param interface_names . - */ - public void setInterfaceNames( String[] interface_names ) { - this.interface_names = interface_names; - } - - - /** - * @param interfaces . - */ - public void setInterfaces( int[] interfaces ) { - this.interfaces = interfaces; - } - - - /** - * @param major . - */ - public void setMajor( int major ) { - this.major = major; - } - - - /** - * @param methods . - */ - public void setMethods( Method[] methods ) { - this.methods = methods; - } - - - /** - * @param minor . - */ - public void setMinor( int minor ) { - this.minor = minor; - } - - - /** - * Set absolute path to file this class was read from. - */ - public void setSourceFileName( String source_file_name ) { - this.source_file_name = source_file_name; - } - - - /** - * @param superclass_name . - */ - public void setSuperclassName( String superclass_name ) { - this.superclass_name = superclass_name; - } - - - /** - * @param superclass_name_index . - */ - public void setSuperclassNameIndex( int superclass_name_index ) { - this.superclass_name_index = superclass_name_index; - } - - /** * @return String representing class contents. */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index e2cf7517..b5760730 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -54,7 +54,7 @@ public class ConstantPoolGen implements java.io.Serializable { private static final long serialVersionUID = 6664071417323174824L; protected int size; - protected Constant[] constants; + private Constant[] constants; protected int index = 1; // First entry (0) used by JVM private static final String METHODREF_DELIM = ":"; private static final String IMETHODREF_DELIM = "#"; @@ -688,17 +688,6 @@ public class ConstantPoolGen implements java.io.Serializable { } - /** - * Use with care! - * - * @param i index in constant pool - * @param c new constant pool entry at index i - */ - public void setConstant( int i, Constant c ) { - constants[i] = c; - } - - /** * @return intermediate constant pool */ -- GitLab From f652bb64235643a268123685e853d4dc22bb5d5c Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 17:39:25 +0000 Subject: [PATCH 0827/1313] Now a class, so can have ordinary static block git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695585 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/generic/InstructionConstants.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java index 435a37ea..f8f376f7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java @@ -166,14 +166,8 @@ public class InstructionConstants { * branch instructions entries are set to null. */ public static final Instruction[] INSTRUCTIONS = new Instruction[256]; - /** Interfaces may have no static initializers, so we simulate this - * with an inner class. - */ - static final Clinit bla = new Clinit(); - - static class Clinit { - Clinit() { + static { INSTRUCTIONS[Constants.NOP] = NOP; INSTRUCTIONS[Constants.ACONST_NULL] = ACONST_NULL; INSTRUCTIONS[Constants.ICONST_M1] = ICONST_M1; @@ -281,6 +275,5 @@ public class InstructionConstants { INSTRUCTIONS[Constants.ATHROW] = ATHROW; INSTRUCTIONS[Constants.MONITORENTER] = MONITORENTER; INSTRUCTIONS[Constants.MONITOREXIT] = MONITOREXIT; - } } } -- GitLab From 9325aac806818a7993d42e82dc57814d8725f014 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 17:55:43 +0000 Subject: [PATCH 0828/1313] BCEL-237 non-empty final arrays should be private as they are mutable git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695590 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/generic/Instruction.java | 7 ++++--- .../commons/bcel6/generic/InstructionConstants.java | 11 ++++++++++- .../java/org/apache/commons/bcel6/generic/PUSH.java | 4 ++-- .../org/apache/commons/bcel6/util/BCELFactory.java | 2 +- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java index 6a5185ea..bbc938c6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java @@ -114,7 +114,7 @@ public abstract class Instruction implements Cloneable, Serializable { public Instruction copy() { Instruction i = null; // "Constant" instruction, no need to duplicate - if (InstructionConstants.INSTRUCTIONS[this.getOpcode()] != null) { + if (InstructionConstants.getInstruction(this.getOpcode()) != null) { i = this; } else { try { @@ -153,8 +153,9 @@ public abstract class Instruction implements Cloneable, Serializable { wide = true; opcode = (short) bytes.readUnsignedByte(); } - if (InstructionConstants.INSTRUCTIONS[opcode] != null) { - return InstructionConstants.INSTRUCTIONS[opcode]; // Used predefined immutable object, if available + final Instruction instruction = InstructionConstants.getInstruction(opcode); + if (instruction != null) { + return instruction; // Used predefined immutable object, if available } switch (opcode) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java index f8f376f7..f529ab2a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java @@ -165,7 +165,7 @@ public class InstructionConstants { /** Get object via its opcode, for immutable instructions like * branch instructions entries are set to null. */ - public static final Instruction[] INSTRUCTIONS = new Instruction[256]; + private static final Instruction[] INSTRUCTIONS = new Instruction[256]; static { INSTRUCTIONS[Constants.NOP] = NOP; @@ -276,4 +276,13 @@ public class InstructionConstants { INSTRUCTIONS[Constants.MONITORENTER] = MONITORENTER; INSTRUCTIONS[Constants.MONITOREXIT] = MONITOREXIT; } + + /** + * Gets the Instruction. + * @param index the index, e.g. {@link Constants#RETURN} + * @return the entry from the private INSTRUCTIONS table + */ + public static Instruction getInstruction(int index) { + return INSTRUCTIONS[index]; + } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java index e1609884..4624c3b9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java @@ -38,7 +38,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio */ public PUSH(ConstantPoolGen cp, int value) { if ((value >= -1) && (value <= 5)) { - instruction = InstructionConstants.INSTRUCTIONS[Constants.ICONST_0 + value]; + instruction = InstructionConstants.getInstruction(Constants.ICONST_0 + value); } else if ((value >= -128) && (value <= 127)) { instruction = new BIPUSH((byte) value); } else if ((value >= -32768) && (value <= 32767)) { @@ -54,7 +54,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * @param value to be pushed */ public PUSH(ConstantPoolGen cp, boolean value) { - instruction = InstructionConstants.INSTRUCTIONS[Constants.ICONST_0 + (value ? 1 : 0)]; + instruction = InstructionConstants.getInstruction(Constants.ICONST_0 + (value ? 1 : 0)); } diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java b/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java index 22326014..238270ed 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java @@ -108,7 +108,7 @@ class BCELFactory extends EmptyVisitor { private boolean visitInstruction( Instruction i ) { short opcode = i.getOpcode(); - if ((InstructionConstants.INSTRUCTIONS[opcode] != null) + if ((InstructionConstants.getInstruction(opcode) != null) && !(i instanceof ConstantPushInstruction) && !(i instanceof ReturnInstruction)) { // Handled below _out.println("il.append(InstructionConstants." + i.getName().toUpperCase(Locale.ENGLISH) + ");"); -- GitLab From 14fdded02c630bb89b9d9ff3d7168da3b54f8617 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 18:34:18 +0000 Subject: [PATCH 0829/1313] BCEL-237 non-empty final arrays should be private as they are mutable git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695594 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/ExceptionConstants.java | 60 +++++++++++++++++-- .../commons/bcel6/generic/ANEWARRAY.java | 7 +-- .../bcel6/generic/ArrayInstruction.java | 4 +- .../commons/bcel6/generic/CHECKCAST.java | 7 +-- .../commons/bcel6/generic/GETFIELD.java | 9 +-- .../commons/bcel6/generic/GETSTATIC.java | 7 +-- .../commons/bcel6/generic/INSTANCEOF.java | 4 +- .../commons/bcel6/generic/INVOKEDYNAMIC.java | 13 ++-- .../bcel6/generic/INVOKEINTERFACE.java | 13 ++-- .../commons/bcel6/generic/INVOKESPECIAL.java | 13 ++-- .../commons/bcel6/generic/INVOKESTATIC.java | 9 +-- .../commons/bcel6/generic/INVOKEVIRTUAL.java | 13 ++-- .../org/apache/commons/bcel6/generic/LDC.java | 3 +- .../commons/bcel6/generic/MULTIANEWARRAY.java | 9 +-- .../org/apache/commons/bcel6/generic/NEW.java | 9 +-- .../commons/bcel6/generic/PUTFIELD.java | 9 +-- .../commons/bcel6/generic/PUTSTATIC.java | 7 +-- 17 files changed, 105 insertions(+), 91 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java b/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java index 046c8dc3..50961c33 100644 --- a/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java @@ -57,20 +57,68 @@ public class ExceptionConstants { public static final Class NEGATIVE_ARRAY_SIZE_EXCEPTION = NegativeArraySizeException.class; public static final Class CLASS_CAST_EXCEPTION = ClassCastException.class; public static final Class ILLEGAL_MONITOR_STATE = IllegalMonitorStateException.class; - /** Pre-defined exception arrays according to chapters 5.1-5.4 of the Java Virtual + + /** + * Pre-defined exception arrays according to chapters 5.1-5.4 of the Java Virtual * Machine Specification */ - public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION = { + private static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION = { NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR, EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR }; // Chapter 5.1 - public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION = { + private static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION = { NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR, NO_SUCH_METHOD_ERROR }; // Chapter 5.2 - public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION = new Class[0]; // Chapter 5.3 (as below) - public static final Class[] EXCS_STRING_RESOLUTION = new Class[0]; + private static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION = new Class[0]; // Chapter 5.3 (as below) + private static final Class[] EXCS_STRING_RESOLUTION = new Class[0]; // Chapter 5.4 (no errors but the ones that _always_ could happen! How stupid.) - public static final Class[] EXCS_ARRAY_EXCEPTION = { + private static final Class[] EXCS_ARRAY_EXCEPTION = { NULL_POINTER_EXCEPTION, ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION }; + + /** + * Enum corresponding to the various Exception Class arrays, + * used by {@link ExceptionConstants#createExceptions(EXCS, Class...)} + */ + public enum EXCS { + EXCS_CLASS_AND_INTERFACE_RESOLUTION, + EXCS_FIELD_AND_METHOD_RESOLUTION, + EXCS_INTERFACE_METHOD_RESOLUTION, + EXCS_STRING_RESOLUTION, + EXCS_ARRAY_EXCEPTION, + }; + + // helper method to merge exception class arrays + private static Class[] mergeExceptions(Class[] input, Class ... extraClasses) { + int extraLen = extraClasses == null ? 0 : extraClasses.length; + Class excs[] = new Class[input.length + extraLen]; + System.arraycopy(input, 0, excs, 0, input.length); + if (extraLen > 0) { + System.arraycopy(extraClasses, 0, excs, input.length, extraLen); + } + return excs; + } + + /** + * Creates a copy of the specified Exception Class array combined with any additional Exception classes. + * @param type the basic array type + * @param extraClasses additional classes, if any + * @return the merged array + */ + public static Class[] createExceptions(EXCS type, Class ... extraClasses) { + switch (type) { + case EXCS_CLASS_AND_INTERFACE_RESOLUTION: + return mergeExceptions(EXCS_CLASS_AND_INTERFACE_RESOLUTION, extraClasses); + case EXCS_ARRAY_EXCEPTION: + return mergeExceptions(EXCS_ARRAY_EXCEPTION, extraClasses); + case EXCS_FIELD_AND_METHOD_RESOLUTION: + return mergeExceptions(EXCS_FIELD_AND_METHOD_RESOLUTION, extraClasses); + case EXCS_INTERFACE_METHOD_RESOLUTION: + return mergeExceptions(EXCS_INTERFACE_METHOD_RESOLUTION, extraClasses); + case EXCS_STRING_RESOLUTION: + return mergeExceptions(EXCS_STRING_RESOLUTION, extraClasses); + default: + throw new AssertionError("Cannot happen; unexpected enum value: " + type); + } + } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java index 54a7da80..d54590d0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java @@ -45,11 +45,8 @@ public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationIns public Class[] getExceptions() { - Class[] cs = new Class[1 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_CLASS_AND_INTERFACE_RESOLUTION, + ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java index 89332e64..3f36cc7a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java @@ -17,6 +17,8 @@ */ package org.apache.commons.bcel6.generic; +import org.apache.commons.bcel6.ExceptionConstants; + /** * Super class for instructions dealing with array access such as IALOAD. * @@ -45,7 +47,7 @@ public abstract class ArrayInstruction extends Instruction implements ExceptionT public Class[] getExceptions() { - return org.apache.commons.bcel6.ExceptionConstants.EXCS_ARRAY_EXCEPTION; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_ARRAY_EXCEPTION); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java b/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java index c6c24a7f..364cebe0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java @@ -50,11 +50,8 @@ public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThro /** @return exceptions this instruction may cause */ public Class[] getExceptions() { - Class[] cs = new Class[1 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.CLASS_CAST_EXCEPTION; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_CLASS_AND_INTERFACE_RESOLUTION, + ExceptionConstants.CLASS_CAST_EXCEPTION); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java b/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java index 2329eb23..7de28879 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java @@ -54,12 +54,9 @@ public class GETFIELD extends FieldInstruction implements ExceptionThrower, Stac public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, + ExceptionConstants.NULL_POINTER_EXCEPTION, + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java index dce200cd..66ed31db 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java @@ -53,11 +53,8 @@ public class GETSTATIC extends FieldInstruction implements PushInstruction, Exce public Class[] getExceptions() { - Class[] cs = new Class[1 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java b/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java index 25cba7a1..d4045a7a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java @@ -17,6 +17,8 @@ */ package org.apache.commons.bcel6.generic; +import org.apache.commons.bcel6.ExceptionConstants; + /** * INSTANCEOF - Determine if object is of given type *

    Stack: ..., objectref -> ..., result
    @@ -43,7 +45,7 @@ public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThr public Class[] getExceptions() { - return org.apache.commons.bcel6.ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_CLASS_AND_INTERFACE_RESOLUTION); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java index 2092b429..2162833e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java @@ -86,14 +86,11 @@ public class INVOKEDYNAMIC extends InvokeInstruction { public Class[] getExceptions() { - Class[] cs = new Class[4 + ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 3] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 2] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 1] = ExceptionConstants.ABSTRACT_METHOD_ERROR; - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_INTERFACE_METHOD_RESOLUTION, + ExceptionConstants.UNSATISFIED_LINK_ERROR, + ExceptionConstants.ABSTRACT_METHOD_ERROR, + ExceptionConstants.ILLEGAL_ACCESS_ERROR, + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java index 7e21be54..79e351c8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java @@ -105,14 +105,11 @@ public final class INVOKEINTERFACE extends InvokeInstruction { public Class[] getExceptions() { - Class[] cs = new Class[4 + ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 3] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 2] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length + 1] = ExceptionConstants.ABSTRACT_METHOD_ERROR; - cs[ExceptionConstants.EXCS_INTERFACE_METHOD_RESOLUTION.length] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_INTERFACE_METHOD_RESOLUTION, + ExceptionConstants.UNSATISFIED_LINK_ERROR, + ExceptionConstants.ABSTRACT_METHOD_ERROR, + ExceptionConstants.ILLEGAL_ACCESS_ERROR, + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java index 06082ce5..48f512de 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java @@ -47,14 +47,11 @@ public class INVOKESPECIAL extends InvokeInstruction { public Class[] getExceptions() { - Class[] cs = new Class[4 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 3] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 2] = ExceptionConstants.ABSTRACT_METHOD_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, + ExceptionConstants.NULL_POINTER_EXCEPTION, + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR, + ExceptionConstants.ABSTRACT_METHOD_ERROR, + ExceptionConstants.UNSATISFIED_LINK_ERROR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java index c87509ba..f7bbf1f6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java @@ -46,12 +46,9 @@ public class INVOKESTATIC extends InvokeInstruction { public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, + ExceptionConstants.UNSATISFIED_LINK_ERROR, + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java index 227c2d11..53e1bccc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java @@ -46,14 +46,11 @@ public class INVOKEVIRTUAL extends InvokeInstruction { public Class[] getExceptions() { - Class[] cs = new Class[4 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 3] = ExceptionConstants.UNSATISFIED_LINK_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 2] = ExceptionConstants.ABSTRACT_METHOD_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, + ExceptionConstants.NULL_POINTER_EXCEPTION, + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR, + ExceptionConstants.ABSTRACT_METHOD_ERROR, + ExceptionConstants.UNSATISFIED_LINK_ERROR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC.java b/src/main/java/org/apache/commons/bcel6/generic/LDC.java index e3bafe40..80803f38 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC.java @@ -20,6 +20,7 @@ package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; +import org.apache.commons.bcel6.ExceptionConstants; import org.apache.commons.bcel6.util.ByteSequence; /** @@ -134,7 +135,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro public Class[] getExceptions() { - return org.apache.commons.bcel6.ExceptionConstants.EXCS_STRING_RESOLUTION; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_STRING_RESOLUTION); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java index 4663ef7a..b8de4e71 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java @@ -116,12 +116,9 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length + 1] = ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION; - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_CLASS_AND_INTERFACE_RESOLUTION, + ExceptionConstants.ILLEGAL_ACCESS_ERROR, + ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/NEW.java b/src/main/java/org/apache/commons/bcel6/generic/NEW.java index d77de14a..bac456b2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NEW.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NEW.java @@ -45,12 +45,9 @@ public class NEW extends CPInstruction implements LoadClass, AllocationInstructi public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length); - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length + 1] = ExceptionConstants.INSTANTIATION_ERROR; - cs[ExceptionConstants.EXCS_CLASS_AND_INTERFACE_RESOLUTION.length] = ExceptionConstants.ILLEGAL_ACCESS_ERROR; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_CLASS_AND_INTERFACE_RESOLUTION, + ExceptionConstants.ILLEGAL_ACCESS_ERROR, + ExceptionConstants.INSTANTIATION_ERROR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java b/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java index 75d0603d..92a4842b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java @@ -53,12 +53,9 @@ public class PUTFIELD extends FieldInstruction implements PopInstruction, Except public Class[] getExceptions() { - Class[] cs = new Class[2 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length + 1] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.NULL_POINTER_EXCEPTION; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, + ExceptionConstants.NULL_POINTER_EXCEPTION, + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java index a8bbbca1..bf8aa4b3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java @@ -53,11 +53,8 @@ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, Pop public Class[] getExceptions() { - Class[] cs = new Class[1 + ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length]; - System.arraycopy(ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION, 0, cs, 0, - ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length); - cs[ExceptionConstants.EXCS_FIELD_AND_METHOD_RESOLUTION.length] = ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR; - return cs; + return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, + ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR); } -- GitLab From 4b75fdd1f345616a2acc62393d626e5094ca2d44 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 22:34:54 +0000 Subject: [PATCH 0830/1313] BCEL-232 Make mutable fields private. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695618 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/generic/BranchHandle.java | 6 ++-- .../bcel6/generic/BranchInstruction.java | 33 +++++++++++++++++-- .../apache/commons/bcel6/generic/GOTO.java | 8 ++--- .../apache/commons/bcel6/generic/GOTO_W.java | 6 ++-- .../apache/commons/bcel6/generic/IFEQ.java | 2 +- .../apache/commons/bcel6/generic/IFGE.java | 2 +- .../apache/commons/bcel6/generic/IFGT.java | 2 +- .../apache/commons/bcel6/generic/IFLE.java | 2 +- .../apache/commons/bcel6/generic/IFLT.java | 2 +- .../apache/commons/bcel6/generic/IFNE.java | 2 +- .../commons/bcel6/generic/IFNONNULL.java | 2 +- .../apache/commons/bcel6/generic/IFNULL.java | 2 +- .../commons/bcel6/generic/IF_ACMPEQ.java | 2 +- .../commons/bcel6/generic/IF_ACMPNE.java | 2 +- .../commons/bcel6/generic/IF_ICMPEQ.java | 2 +- .../commons/bcel6/generic/IF_ICMPGE.java | 2 +- .../commons/bcel6/generic/IF_ICMPGT.java | 2 +- .../commons/bcel6/generic/IF_ICMPLE.java | 2 +- .../commons/bcel6/generic/IF_ICMPLT.java | 2 +- .../commons/bcel6/generic/IF_ICMPNE.java | 2 +- .../bcel6/generic/InstructionComparator.java | 2 +- .../bcel6/generic/InstructionList.java | 4 +-- .../org/apache/commons/bcel6/generic/JSR.java | 8 ++--- .../apache/commons/bcel6/generic/JSR_W.java | 6 ++-- .../commons/bcel6/generic/JsrInstruction.java | 2 +- .../apache/commons/bcel6/generic/Select.java | 14 ++++---- 26 files changed, 74 insertions(+), 47 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java index f31d7b65..dc31987d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java @@ -70,20 +70,20 @@ public final class BranchHandle extends InstructionHandle { */ @Override public int getPosition() { - return bi.position; + return bi.getPosition(); } @Override void setPosition( int pos ) { - i_position = bi.position = pos; + i_position = bi.setGetPosition(pos); } @Override protected int updatePosition( int offset, int max_offset ) { int x = bi.updatePosition(offset, max_offset); - i_position = bi.position; + i_position = bi.getPosition(); return x; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java index 11c28320..3ef707a6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java @@ -33,9 +33,9 @@ import org.apache.commons.bcel6.util.ByteSequence; public abstract class BranchInstruction extends Instruction implements InstructionTargeter { private static final long serialVersionUID = 3225905281842405051L; - protected int index; // Branch target relative to this instruction - protected InstructionHandle target; // Target object in instruction list - protected int position; // Byte code offset + private int index; // Branch target relative to this instruction + private InstructionHandle target; // Target object in instruction list + private int position; // Byte code offset /** @@ -233,4 +233,31 @@ public abstract class BranchInstruction extends Instruction implements Instructi index = -1; position = -1; } + + + /** + * @return the position + */ + public int getPosition() { + return position; + } + + + /** + * @param position the position to set + * @return the new position + */ + public int setGetPosition(int position) { + this.position = position; + return position; + } + + + /** + * @param index the index to set + */ + protected void setIndex(int index) { + this.index = index; + } + } diff --git a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java index d9d6376e..37205848 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java @@ -49,13 +49,13 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { */ @Override public void dump( DataOutputStream out ) throws IOException { - index = getTargetOffset(); + super.setIndex(getTargetOffset()); if (opcode == org.apache.commons.bcel6.Constants.GOTO) { super.dump(out); } else { // GOTO_W - index = getTargetOffset(); + super.setIndex(getTargetOffset()); out.writeByte(opcode); - out.writeInt(index); + out.writeInt(super.getIndex()); } } @@ -66,7 +66,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { @Override protected int updatePosition( int offset, int max_offset ) { int i = getTargetOffset(); // Depending on old position value - position += offset; // Position may be shifted by preceding expansions + setGetPosition(getPosition() + offset); // Position may be shifted by preceding expansions if (Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) opcode = org.apache.commons.bcel6.Constants.GOTO_W; short old_length = length; diff --git a/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java b/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java index 55706c7b..ed3c9892 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java @@ -52,9 +52,9 @@ public class GOTO_W extends GotoInstruction { */ @Override public void dump( DataOutputStream out ) throws IOException { - index = getTargetOffset(); + super.setIndex(getTargetOffset()); out.writeByte(opcode); - out.writeInt(index); + out.writeInt(super.getIndex()); } @@ -63,7 +63,7 @@ public class GOTO_W extends GotoInstruction { */ @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { - index = bytes.readInt(); + super.setIndex(bytes.readInt()); length = 5; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java index b162b733..8781c94b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java @@ -47,7 +47,7 @@ public class IFEQ extends IfInstruction { */ @Override public IfInstruction negate() { - return new IFNE(target); + return new IFNE(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFGE.java b/src/main/java/org/apache/commons/bcel6/generic/IFGE.java index 98234823..87bb4ec8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFGE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFGE.java @@ -47,7 +47,7 @@ public class IFGE extends IfInstruction { */ @Override public IfInstruction negate() { - return new IFLT(target); + return new IFLT(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFGT.java b/src/main/java/org/apache/commons/bcel6/generic/IFGT.java index 02d111dc..ccae5858 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFGT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFGT.java @@ -47,7 +47,7 @@ public class IFGT extends IfInstruction { */ @Override public IfInstruction negate() { - return new IFLE(target); + return new IFLE(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFLE.java b/src/main/java/org/apache/commons/bcel6/generic/IFLE.java index 025a3436..733302fb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFLE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFLE.java @@ -47,7 +47,7 @@ public class IFLE extends IfInstruction { */ @Override public IfInstruction negate() { - return new IFGT(target); + return new IFGT(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFLT.java b/src/main/java/org/apache/commons/bcel6/generic/IFLT.java index 528f0bfc..de75abb0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFLT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFLT.java @@ -47,7 +47,7 @@ public class IFLT extends IfInstruction { */ @Override public IfInstruction negate() { - return new IFGE(target); + return new IFGE(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNE.java b/src/main/java/org/apache/commons/bcel6/generic/IFNE.java index 828459fb..6bc00dc5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNE.java @@ -47,7 +47,7 @@ public class IFNE extends IfInstruction { */ @Override public IfInstruction negate() { - return new IFEQ(target); + return new IFEQ(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java b/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java index 2f2b0cf7..5cdac1c1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java @@ -47,7 +47,7 @@ public class IFNONNULL extends IfInstruction { */ @Override public IfInstruction negate() { - return new IFNULL(target); + return new IFNULL(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java b/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java index 639f1604..b6cfdcbb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java @@ -47,7 +47,7 @@ public class IFNULL extends IfInstruction { */ @Override public IfInstruction negate() { - return new IFNONNULL(target); + return new IFNONNULL(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java index 11d9b274..8cd682ec 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java @@ -47,7 +47,7 @@ public class IF_ACMPEQ extends IfInstruction { */ @Override public IfInstruction negate() { - return new IF_ACMPNE(target); + return new IF_ACMPNE(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java index 9452735a..4d013624 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java @@ -47,7 +47,7 @@ public class IF_ACMPNE extends IfInstruction { */ @Override public IfInstruction negate() { - return new IF_ACMPEQ(target); + return new IF_ACMPEQ(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java index 62689a94..236de849 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java @@ -47,7 +47,7 @@ public class IF_ICMPEQ extends IfInstruction { */ @Override public IfInstruction negate() { - return new IF_ICMPNE(target); + return new IF_ICMPNE(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java index 4165203f..c3419ba4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java @@ -47,7 +47,7 @@ public class IF_ICMPGE extends IfInstruction { */ @Override public IfInstruction negate() { - return new IF_ICMPLT(target); + return new IF_ICMPLT(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java index 2125e4e6..d5f9eedb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java @@ -47,7 +47,7 @@ public class IF_ICMPGT extends IfInstruction { */ @Override public IfInstruction negate() { - return new IF_ICMPLE(target); + return new IF_ICMPLE(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java index 886ccb3f..115bf740 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java @@ -47,7 +47,7 @@ public class IF_ICMPLE extends IfInstruction { */ @Override public IfInstruction negate() { - return new IF_ICMPGT(target); + return new IF_ICMPGT(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java index e2859876..562ee279 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java @@ -47,7 +47,7 @@ public class IF_ICMPLT extends IfInstruction { */ @Override public IfInstruction negate() { - return new IF_ICMPGE(target); + return new IF_ICMPGE(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java index 41285363..86880ae9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java @@ -47,7 +47,7 @@ public class IF_ICMPNE extends IfInstruction { */ @Override public IfInstruction negate() { - return new IF_ICMPEQ(target); + return new IF_ICMPEQ(super.getTarget()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java index 7473d7fb..bd04f00b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java @@ -47,7 +47,7 @@ public interface InstructionComparator { return true; } } else if (i1 instanceof BranchInstruction) { - return ((BranchInstruction) i1).target == ((BranchInstruction) i2).target; + return ((BranchInstruction) i1).getTarget() == ((BranchInstruction) i2).getTarget(); } else if (i1 instanceof ConstantPushInstruction) { return ((ConstantPushInstruction) i1).getValue().equals( ((ConstantPushInstruction) i2).getValue()); diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java index 193a8975..57ce496a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java @@ -196,7 +196,7 @@ public class InstructionList implements Serializable { for (int i = 0; i < count; i++) { if (ihs[i] instanceof BranchHandle) { BranchInstruction bi = (BranchInstruction) ihs[i].instruction; - int target = bi.position + bi.getIndex(); /* Byte code position: + int target = bi.getPosition() + bi.getIndex(); /* Byte code position: * relative -> absolute. */ // Search for target position InstructionHandle ih = findHandle(ihs, pos, count, target); @@ -209,7 +209,7 @@ public class InstructionList implements Serializable { Select s = (Select) bi; int[] indices = s.getIndices(); for (int j = 0; j < indices.length; j++) { - target = bi.position + indices[j]; + target = bi.getPosition() + indices[j]; ih = findHandle(ihs, pos, count, target); if (ih == null) { throw new ClassGenException("Couldn't find target for switch: " + bi); diff --git a/src/main/java/org/apache/commons/bcel6/generic/JSR.java b/src/main/java/org/apache/commons/bcel6/generic/JSR.java index f204f5e3..2bb018a8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JSR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JSR.java @@ -49,13 +49,13 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { */ @Override public void dump( DataOutputStream out ) throws IOException { - index = getTargetOffset(); + super.setIndex(getTargetOffset()); if (opcode == org.apache.commons.bcel6.Constants.JSR) { super.dump(out); } else { // JSR_W - index = getTargetOffset(); + super.setIndex(getTargetOffset()); out.writeByte(opcode); - out.writeInt(index); + out.writeInt(super.getIndex()); } } @@ -63,7 +63,7 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { @Override protected int updatePosition( int offset, int max_offset ) { int i = getTargetOffset(); // Depending on old position value - position += offset; // Position may be shifted by preceding expansions + setGetPosition(getPosition() + offset); // Position may be shifted by preceding expansions if (Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) opcode = org.apache.commons.bcel6.Constants.JSR_W; short old_length = length; diff --git a/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java b/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java index 29215797..ecde3ce5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java @@ -52,9 +52,9 @@ public class JSR_W extends JsrInstruction { */ @Override public void dump( DataOutputStream out ) throws IOException { - index = getTargetOffset(); + super.setIndex(getTargetOffset()); out.writeByte(opcode); - out.writeInt(index); + out.writeInt(super.getIndex()); } @@ -63,7 +63,7 @@ public class JSR_W extends JsrInstruction { */ @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { - index = bytes.readInt(); + super.setIndex(bytes.readInt()); length = 5; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java index b97b0001..49a3542f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java @@ -60,7 +60,7 @@ public abstract class JsrInstruction extends BranchInstruction implements Uncond * will be executed when RETurned from a subroutine. */ public InstructionHandle physicalSuccessor() { - InstructionHandle ih = this.target; + InstructionHandle ih = super.getTarget(); // Rewind! while (ih.getPrev() != null) { ih = ih.getPrev(); diff --git a/src/main/java/org/apache/commons/bcel6/generic/Select.java b/src/main/java/org/apache/commons/bcel6/generic/Select.java index ac9419df..2ffc3438 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Select.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Select.java @@ -89,11 +89,11 @@ public abstract class Select extends BranchInstruction implements VariableLength */ @Override protected int updatePosition( int offset, int max_offset ) { - position += offset; // Additional offset caused by preceding SWITCHs, GOTOs, etc. + setGetPosition(getPosition() + offset); // Additional offset caused by preceding SWITCHs, GOTOs, etc. short old_length = length; /* Alignment on 4-byte-boundary, + 1, because of tag byte. */ - padding = (4 - ((position + 1) % 4)) % 4; + padding = (4 - ((getPosition() + 1) % 4)) % 4; length = (short) (fixed_length + padding); // Update length return length - old_length; } @@ -109,8 +109,8 @@ public abstract class Select extends BranchInstruction implements VariableLength for (int i = 0; i < padding; i++) { out.writeByte(0); } - index = getTargetOffset(); // Write default target offset - out.writeInt(index); + super.setIndex(getTargetOffset()); // Write default target offset + out.writeInt(super.getIndex()); } @@ -124,7 +124,7 @@ public abstract class Select extends BranchInstruction implements VariableLength bytes.readByte(); } // Default branch target common for both cases (TABLESWITCH, LOOKUPSWITCH) - index = bytes.readInt(); + super.setIndex(bytes.readInt()); } @@ -166,7 +166,7 @@ public abstract class Select extends BranchInstruction implements VariableLength @Override public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { boolean targeted = false; - if (target == old_ih) { + if (super.getTarget() == old_ih) { targeted = true; setTarget(new_ih); } @@ -187,7 +187,7 @@ public abstract class Select extends BranchInstruction implements VariableLength */ @Override public boolean containsTarget( InstructionHandle ih ) { - if (target == ih) { + if (super.getTarget() == ih) { return true; } for (InstructionHandle target2 : targets) { -- GitLab From 8e29a71464b8dd555a9a9bb428e2812d63a8e089 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 23:19:09 +0000 Subject: [PATCH 0831/1313] BCEL-232 Make mutable fields private. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695624 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/generic/ArrayType.java | 2 +- .../org/apache/commons/bcel6/generic/BasicType.java | 4 ++-- .../java/org/apache/commons/bcel6/generic/Type.java | 12 ++++++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java index c5167575..3439174f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java @@ -79,7 +79,7 @@ public final class ArrayType extends ReferenceType { buf.append('['); } buf.append(basic_type.getSignature()); - signature = buf.toString(); + setSignature(buf.toString()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java index 700a8a60..70b4f221 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java @@ -73,7 +73,7 @@ public final class BasicType extends Type { */ @Override public int hashCode() { - return type; + return super.getType(); } @@ -81,6 +81,6 @@ public final class BasicType extends Type { */ @Override public boolean equals( Object _type ) { - return (_type instanceof BasicType) ? ((BasicType) _type).type == this.type : false; + return (_type instanceof BasicType) ? ((BasicType) _type).getType() == this.getType() : false; } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/Type.java b/src/main/java/org/apache/commons/bcel6/generic/Type.java index 986e77d2..72a96162 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Type.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Type.java @@ -35,8 +35,8 @@ import org.apache.commons.bcel6.verifier.structurals.OperandStack; public abstract class Type implements java.io.Serializable { private static final long serialVersionUID = -1985077286871826895L; - protected byte type; - protected String signature; // signature for the type + private final byte type; + private String signature; // signature for the type /** Predefined constants */ public static final BasicType VOID = new BasicType(Constants.T_VOID); @@ -391,4 +391,12 @@ public abstract class Type implements java.io.Serializable { int index = signature.lastIndexOf(')') + 1; return Type.size(getTypeSize(signature.substring(index))); } + + + /** + * @param signature the signature to set + */ + public void setSignature(String signature) { + this.signature = signature; + } } -- GitLab From 4227c5cf0ad132e1238ea556718d9bd6a3a592a2 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 23:30:09 +0000 Subject: [PATCH 0832/1313] BCEL-232 Make mutable fields private. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695625 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/generic/CPInstruction.java | 3 ++- .../commons/bcel6/generic/ConstantPoolGen.java | 4 ++-- .../commons/bcel6/generic/FieldInstruction.java | 2 +- .../commons/bcel6/generic/FieldOrMethod.java | 8 ++++---- .../commons/bcel6/generic/INVOKEDYNAMIC.java | 2 +- .../commons/bcel6/generic/INVOKEINTERFACE.java | 2 +- .../commons/bcel6/generic/InvokeInstruction.java | 2 +- .../org/apache/commons/bcel6/generic/LDC.java | 16 ++++++++-------- .../org/apache/commons/bcel6/generic/LDC2_W.java | 6 +++--- .../commons/bcel6/generic/MULTIANEWARRAY.java | 4 ++-- .../bcel6/generic/NameSignatureInstruction.java | 2 +- 11 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java index 112597f3..71d31fd1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java @@ -39,7 +39,8 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct IndexedInstruction { private static final long serialVersionUID = 2968547649792233082L; - protected int index; // index to constant pool + + private int index; // index to constant pool /** diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index b5760730..f1e83fc1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -53,9 +53,9 @@ import org.apache.commons.bcel6.classfile.ConstantUtf8; public class ConstantPoolGen implements java.io.Serializable { private static final long serialVersionUID = 6664071417323174824L; - protected int size; + private int size; private Constant[] constants; - protected int index = 1; // First entry (0) used by JVM + private int index = 1; // First entry (0) used by JVM private static final String METHODREF_DELIM = ":"; private static final String IMETHODREF_DELIM = "#"; private static final String FIELDREF_DELIM = "&"; diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java index 800b224c..b54c4d80 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java @@ -51,7 +51,7 @@ public abstract class FieldInstruction extends FieldOrMethod { @Override public String toString( ConstantPool cp ) { return org.apache.commons.bcel6.Constants.OPCODE_NAMES[opcode] + " " - + cp.constantToString(index, org.apache.commons.bcel6.Constants.CONSTANT_Fieldref); + + cp.constantToString(super.getIndex(), org.apache.commons.bcel6.Constants.CONSTANT_Fieldref); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java index 523ed71b..16dfdcb0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java @@ -56,7 +56,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { */ public String getSignature( ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(index); + ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes(); } @@ -66,7 +66,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { */ public String getName( ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(index); + ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); } @@ -84,7 +84,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { // @Deprecated public String getClassName( ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(index); + ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); String className = cp.getConstantString(cmr.getClassIndex(), org.apache.commons.bcel6.Constants.CONSTANT_Class); if (className.startsWith("[")) { @@ -105,7 +105,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { */ public ReferenceType getReferenceType( ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(index); + ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); String className = cp.getConstantString(cmr.getClassIndex(), org.apache.commons.bcel6.Constants.CONSTANT_Class); if (className.startsWith("[")) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java index 2162833e..c1c7f721 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java @@ -58,7 +58,7 @@ public class INVOKEDYNAMIC extends InvokeInstruction { @Override public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); - out.writeShort(index); + out.writeShort(super.getIndex()); out.writeByte(0); out.writeByte(0); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java index 79e351c8..51cb0500 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java @@ -62,7 +62,7 @@ public final class INVOKEINTERFACE extends InvokeInstruction { @Override public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); - out.writeShort(index); + out.writeShort(super.getIndex()); out.writeByte(nargs); out.writeByte(0); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java index 6045914e..2c78d809 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java @@ -55,7 +55,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti */ @Override public String toString( ConstantPool cp ) { - Constant c = cp.getConstant(index); + Constant c = cp.getConstant(super.getIndex()); StringTokenizer tok = new StringTokenizer(cp.constantToString(c)); return Constants.OPCODE_NAMES[opcode] + " " + tok.nextToken().replace('.', '/') + tok.nextToken(); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC.java b/src/main/java/org/apache/commons/bcel6/generic/LDC.java index 80803f38..dd244f92 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC.java @@ -51,7 +51,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro // Adjust to proper size protected final void setSize() { - if (index <= org.apache.commons.bcel6.Constants.MAX_BYTE) { // Fits in one byte? + if (super.getIndex() <= org.apache.commons.bcel6.Constants.MAX_BYTE) { // Fits in one byte? opcode = org.apache.commons.bcel6.Constants.LDC; length = 2; } else { @@ -69,9 +69,9 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); if (length == 2) { - out.writeByte(index); + out.writeByte(super.getIndex()); } else { - out.writeShort(index); + out.writeShort(super.getIndex()); } } @@ -92,12 +92,12 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro @Override protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { length = 2; - index = bytes.readUnsignedByte(); + super.setIndex(bytes.readUnsignedByte()); } public Object getValue( ConstantPoolGen cpg ) { - org.apache.commons.bcel6.classfile.Constant c = cpg.getConstantPool().getConstant(index); + org.apache.commons.bcel6.classfile.Constant c = cpg.getConstantPool().getConstant(super.getIndex()); switch (c.getTag()) { case org.apache.commons.bcel6.Constants.CONSTANT_String: int i = ((org.apache.commons.bcel6.classfile.ConstantString) c).getStringIndex(); @@ -112,14 +112,14 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro c = cpg.getConstantPool().getConstant(nameIndex); return new ObjectType(((org.apache.commons.bcel6.classfile.ConstantUtf8) c).getBytes()); default: // Never reached - throw new RuntimeException("Unknown or invalid constant type at " + index); + throw new RuntimeException("Unknown or invalid constant type at " + super.getIndex()); } } @Override public Type getType( ConstantPoolGen cpg ) { - switch (cpg.getConstantPool().getConstant(index).getTag()) { + switch (cpg.getConstantPool().getConstant(super.getIndex()).getTag()) { case org.apache.commons.bcel6.Constants.CONSTANT_String: return Type.STRING; case org.apache.commons.bcel6.Constants.CONSTANT_Float: @@ -129,7 +129,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro case org.apache.commons.bcel6.Constants.CONSTANT_Class: return Type.CLASS; default: // Never reached - throw new RuntimeException("Unknown or invalid constant type at " + index); + throw new RuntimeException("Unknown or invalid constant type at " + super.getIndex()); } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java b/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java index 153ef7aa..98c394b8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java @@ -44,7 +44,7 @@ public class LDC2_W extends CPInstruction implements PushInstruction { @Override public Type getType( ConstantPoolGen cpg ) { - switch (cpg.getConstantPool().getConstant(index).getTag()) { + switch (cpg.getConstantPool().getConstant(super.getIndex()).getTag()) { case org.apache.commons.bcel6.Constants.CONSTANT_Long: return Type.LONG; case org.apache.commons.bcel6.Constants.CONSTANT_Double: @@ -56,14 +56,14 @@ public class LDC2_W extends CPInstruction implements PushInstruction { public Number getValue( ConstantPoolGen cpg ) { - org.apache.commons.bcel6.classfile.Constant c = cpg.getConstantPool().getConstant(index); + org.apache.commons.bcel6.classfile.Constant c = cpg.getConstantPool().getConstant(super.getIndex()); switch (c.getTag()) { case org.apache.commons.bcel6.Constants.CONSTANT_Long: return Long.valueOf(((org.apache.commons.bcel6.classfile.ConstantLong) c).getBytes()); case org.apache.commons.bcel6.Constants.CONSTANT_Double: return new Double(((org.apache.commons.bcel6.classfile.ConstantDouble) c).getBytes()); default: // Never reached - throw new RuntimeException("Unknown or invalid constant type at " + index); + throw new RuntimeException("Unknown or invalid constant type at " + super.getIndex()); } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java index b8de4e71..5bfb3978 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java @@ -62,7 +62,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati @Override public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); - out.writeShort(index); + out.writeShort(super.getIndex()); out.writeByte(dimensions); } @@ -91,7 +91,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati */ @Override public String toString( boolean verbose ) { - return super.toString(verbose) + " " + index + " " + dimensions; + return super.toString(verbose) + " " + super.getIndex() + " " + dimensions; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java index 9ab349b9..a2d40a6c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java @@ -43,7 +43,7 @@ public abstract class NameSignatureInstruction extends CPInstruction { public ConstantNameAndType getNameAndType(ConstantPoolGen cpg) { ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(index); + ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); return (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); } /** @return signature of referenced method/field. -- GitLab From 03946285e4d8d812b3485e036de69226f7fd4345 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 12 Aug 2015 23:53:24 +0000 Subject: [PATCH 0833/1313] BCEL-232 Make mutable fields private. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695627 13f79535-47bb-0310-9956-ffa450edef68 --- .../generic/AnnotationElementValueGen.java | 4 +- .../bcel6/generic/ArrayElementValueGen.java | 4 +- .../bcel6/generic/ClassElementValueGen.java | 6 +-- .../bcel6/generic/ElementValueGen.java | 6 +-- .../bcel6/generic/EnumElementValueGen.java | 14 +++---- .../bcel6/generic/SimpleElementValueGen.java | 40 +++++++++---------- 6 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java index f0099fce..2a74b0a7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java @@ -58,7 +58,7 @@ public class AnnotationElementValueGen extends ElementValueGen @Override public void dump(DataOutputStream dos) throws IOException { - dos.writeByte(type); // u1 type of value (ANNOTATION == '@') + dos.writeByte(super.getElementValueType()); // u1 type of value (ANNOTATION == '@') a.dump(dos); } @@ -74,7 +74,7 @@ public class AnnotationElementValueGen extends ElementValueGen @Override public ElementValue getElementValue() { - return new AnnotationElementValue(this.type, a.getAnnotation(), cpGen + return new AnnotationElementValue(super.getElementValueType(), a.getAnnotation(), getConstantPoolgen() .getConstantPool()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java index 3576e807..216f1382 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java @@ -65,7 +65,7 @@ public class ArrayElementValueGen extends ElementValueGen for (ElementValueGen element : evalues) { immutableData[i++] = element.getElementValue(); } - return new ArrayElementValue(type, immutableData, cpGen + return new ArrayElementValue(super.getElementValueType(), immutableData, getConstantPoolgen() .getConstantPool()); } @@ -87,7 +87,7 @@ public class ArrayElementValueGen extends ElementValueGen @Override public void dump(DataOutputStream dos) throws IOException { - dos.writeByte(type); // u1 type of value (ARRAY == '[') + dos.writeByte(super.getElementValueType()); // u1 type of value (ARRAY == '[') dos.writeShort(evalues.size()); for (ElementValueGen element : evalues) { element.dump(dos); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java index 5870f5f8..9edec009 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java @@ -56,7 +56,7 @@ public class ClassElementValueGen extends ElementValueGen @Override public ElementValue getElementValue() { - return new ClassElementValue(type, idx, cpGen.getConstantPool()); + return new ClassElementValue(super.getElementValueType(), idx, getConstantPoolgen().getConstantPool()); } public ClassElementValueGen(ClassElementValue value, ConstantPoolGen cpool, @@ -81,7 +81,7 @@ public class ClassElementValueGen extends ElementValueGen public String getClassString() { - ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(idx); + ConstantUtf8 cu8 = (ConstantUtf8) getConstantPoolgen().getConstant(idx); return cu8.getBytes(); // ConstantClass c = (ConstantClass)getConstantPool().getConstant(idx); // ConstantUtf8 utf8 = @@ -98,7 +98,7 @@ public class ClassElementValueGen extends ElementValueGen @Override public void dump(DataOutputStream dos) throws IOException { - dos.writeByte(type); // u1 kind of value + dos.writeByte(super.getElementValueType()); // u1 kind of value dos.writeShort(idx); } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java index 4c23fb09..c579c7ae 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java @@ -34,9 +34,9 @@ import org.apache.commons.bcel6.classfile.SimpleElementValue; */ public abstract class ElementValueGen { - protected int type; + private final int type; - protected ConstantPoolGen cpGen; + private final ConstantPoolGen cpGen; protected ElementValueGen(int type, ConstantPoolGen cpGen) { @@ -143,7 +143,7 @@ public abstract class ElementValueGen } } - protected ConstantPoolGen getConstantPool() + protected ConstantPoolGen getConstantPoolgen() { return cpGen; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java index f124ca33..b7afbae1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java @@ -43,9 +43,9 @@ public class EnumElementValueGen extends ElementValueGen ConstantPoolGen cpool) { super(ElementValueGen.ENUM_CONSTANT, cpool); - if (type != ENUM_CONSTANT) { + if (super.getElementValueType() != ENUM_CONSTANT) { throw new RuntimeException( - "Only element values of type enum can be built with this ctor - type specified: " + type); + "Only element values of type enum can be built with this ctor - type specified: " + super.getElementValueType()); } this.typeIdx = typeIdx; this.valueIdx = valueIdx; @@ -59,7 +59,7 @@ public class EnumElementValueGen extends ElementValueGen { System.err.println("Duplicating value: " + getEnumTypeString() + ":" + getEnumValueString()); - return new EnumElementValue(type, typeIdx, valueIdx, cpGen + return new EnumElementValue(super.getElementValueType(), typeIdx, valueIdx, getConstantPoolgen() .getConstantPool()); } @@ -91,7 +91,7 @@ public class EnumElementValueGen extends ElementValueGen @Override public void dump(DataOutputStream dos) throws IOException { - dos.writeByte(type); // u1 type of value (ENUM_CONSTANT == 'e') + dos.writeByte(super.getElementValueType()); // u1 type of value (ENUM_CONSTANT == 'e') dos.writeShort(typeIdx); // u2 dos.writeShort(valueIdx); // u2 } @@ -99,7 +99,7 @@ public class EnumElementValueGen extends ElementValueGen @Override public String stringifyValue() { - ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant( + ConstantUtf8 cu8 = (ConstantUtf8) getConstantPoolgen().getConstant( valueIdx); return cu8.getBytes(); // ConstantString cu8 = @@ -117,14 +117,14 @@ public class EnumElementValueGen extends ElementValueGen // (ConstantClass)getConstantPool().getConstant(typeIdx); // return // ((ConstantUtf8)getConstantPool().getConstant(cu8.getNameIndex())).getBytes(); - return ((ConstantUtf8) getConstantPool().getConstant(typeIdx)) + return ((ConstantUtf8) getConstantPoolgen().getConstant(typeIdx)) .getBytes(); // return Utility.signatureToString(cu8.getBytes()); } public String getEnumValueString() { - return ((ConstantUtf8) getConstantPool().getConstant(valueIdx)) + return ((ConstantUtf8) getConstantPoolgen().getConstant(valueIdx)) .getBytes(); // ConstantString cu8 = // (ConstantString)getConstantPool().getConstant(valueIdx); diff --git a/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java index ad1b269a..b8e52a1b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java @@ -164,7 +164,7 @@ public class SimpleElementValueGen extends ElementValueGen default: throw new RuntimeException( "SimpleElementValueGen class does not know how " - + "to copy this type " + type); + + "to copy this type " + super.getElementValueType()); } } } @@ -175,7 +175,7 @@ public class SimpleElementValueGen extends ElementValueGen @Override public ElementValue getElementValue() { - return new SimpleElementValue(type, idx, cpGen.getConstantPool()); + return new SimpleElementValue(super.getElementValueType(), idx, getConstantPoolgen().getConstantPool()); } public int getIndex() @@ -185,21 +185,21 @@ public class SimpleElementValueGen extends ElementValueGen public String getValueString() { - if (type != STRING) { + if (super.getElementValueType() != STRING) { throw new RuntimeException( "Dont call getValueString() on a non STRING ElementValue"); } - ConstantUtf8 c = (ConstantUtf8) cpGen.getConstant(idx); + ConstantUtf8 c = (ConstantUtf8) getConstantPoolgen().getConstant(idx); return c.getBytes(); } public int getValueInt() { - if (type != PRIMITIVE_INT) { + if (super.getElementValueType() != PRIMITIVE_INT) { throw new RuntimeException( "Dont call getValueString() on a non STRING ElementValue"); } - ConstantInteger c = (ConstantInteger) cpGen.getConstant(idx); + ConstantInteger c = (ConstantInteger) getConstantPoolgen().getConstant(idx); return c.getBytes(); } @@ -207,51 +207,51 @@ public class SimpleElementValueGen extends ElementValueGen @Override public String stringifyValue() { - switch (type) + switch (super.getElementValueType()) { case PRIMITIVE_INT: - ConstantInteger c = (ConstantInteger) cpGen.getConstant(idx); + ConstantInteger c = (ConstantInteger) getConstantPoolgen().getConstant(idx); return Integer.toString(c.getBytes()); case PRIMITIVE_LONG: - ConstantLong j = (ConstantLong) cpGen.getConstant(idx); + ConstantLong j = (ConstantLong) getConstantPoolgen().getConstant(idx); return Long.toString(j.getBytes()); case PRIMITIVE_DOUBLE: - ConstantDouble d = (ConstantDouble) cpGen.getConstant(idx); + ConstantDouble d = (ConstantDouble) getConstantPoolgen().getConstant(idx); return Double.toString(d.getBytes()); case PRIMITIVE_FLOAT: - ConstantFloat f = (ConstantFloat) cpGen.getConstant(idx); + ConstantFloat f = (ConstantFloat) getConstantPoolgen().getConstant(idx); return Float.toString(f.getBytes()); case PRIMITIVE_SHORT: - ConstantInteger s = (ConstantInteger) cpGen.getConstant(idx); + ConstantInteger s = (ConstantInteger) getConstantPoolgen().getConstant(idx); return Integer.toString(s.getBytes()); case PRIMITIVE_BYTE: - ConstantInteger b = (ConstantInteger) cpGen.getConstant(idx); + ConstantInteger b = (ConstantInteger) getConstantPoolgen().getConstant(idx); return Integer.toString(b.getBytes()); case PRIMITIVE_CHAR: - ConstantInteger ch = (ConstantInteger) cpGen.getConstant(idx); + ConstantInteger ch = (ConstantInteger) getConstantPoolgen().getConstant(idx); return Integer.toString(ch.getBytes()); case PRIMITIVE_BOOLEAN: - ConstantInteger bo = (ConstantInteger) cpGen.getConstant(idx); + ConstantInteger bo = (ConstantInteger) getConstantPoolgen().getConstant(idx); if (bo.getBytes() == 0) { return "false"; } else { return "true"; } case STRING: - ConstantUtf8 cu8 = (ConstantUtf8) cpGen.getConstant(idx); + ConstantUtf8 cu8 = (ConstantUtf8) getConstantPoolgen().getConstant(idx); return cu8.getBytes(); default: throw new RuntimeException( "SimpleElementValueGen class does not know how to stringify type " - + type); + + super.getElementValueType()); } } @Override public void dump(DataOutputStream dos) throws IOException { - dos.writeByte(type); // u1 kind of value - switch (type) + dos.writeByte(super.getElementValueType()); // u1 kind of value + switch (super.getElementValueType()) { case PRIMITIVE_INT: case PRIMITIVE_BYTE: @@ -267,7 +267,7 @@ public class SimpleElementValueGen extends ElementValueGen default: throw new RuntimeException( "SimpleElementValueGen doesnt know how to write out type " - + type); + + super.getElementValueType()); } } } -- GitLab From a41e9a7f7c9c1fb3e30dd6ec5ca250ebb58f5aa4 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 00:31:15 +0000 Subject: [PATCH 0834/1313] Don't expose arrays unnecessarily git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695630 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/util/ClassLoader.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java index d5aebd86..8dc1a428 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java @@ -52,12 +52,14 @@ import org.apache.commons.bcel6.classfile.Utility; * @see JavaWrapper * @see ClassPath */ -public class ClassLoader extends java.lang.ClassLoader { +public class ClassLoader extends java.lang.ClassLoader { // TODO rename this class to reduce confusion with parent private static final String BCEL_TOKEN = "$$BCEL$$"; - public static final String[] DEFAULT_IGNORED_PACKAGES = { + + private static final String[] DEFAULT_IGNORED_PACKAGES = { "java.", "javax.", "sun." }; + private final Hashtable> classes = new Hashtable>(); // Hashtable is synchronized thus thread-safe private final String[] ignored_packages; private Repository repository = SyntheticRepository.getInstance(); -- GitLab From 66a105eeb194b73ebb656eb0ebe647b37aa3f6c3 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 00:47:40 +0000 Subject: [PATCH 0835/1313] Constant should be static (Findbugs) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695637 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/verifier/VerifierAppFrame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java index b0a8d340..3a062d9f 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java @@ -70,7 +70,7 @@ public class VerifierAppFrame extends JFrame { GridLayout gridLayout4 = new GridLayout(); JScrollPane jScrollPane4 = new JScrollPane(); CardLayout cardLayout1 = new CardLayout(); - private final String JUSTICE_VERSION = "JustIce by Enver Haase"; + private static final String JUSTICE_VERSION = "JustIce by Enver Haase"; private String current_class; GridLayout gridLayout3 = new GridLayout(); JTextPane pass1TextPane = new JTextPane(); -- GitLab From 8627a297d18f459902bea7283683a432b1caa0e0 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 00:53:25 +0000 Subject: [PATCH 0836/1313] Avoid unused warning from Findbugs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695638 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/EnclosingMethodAttributeTestCase.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java b/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java index 502fbb21..a44b3377 100644 --- a/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java @@ -26,6 +26,7 @@ import org.apache.commons.bcel6.classfile.ConstantPool; import org.apache.commons.bcel6.classfile.EnclosingMethod; import org.apache.commons.bcel6.classfile.JavaClass; import org.apache.commons.bcel6.util.SyntheticRepository; +import org.junit.Assert; public class EnclosingMethodAttributeTestCase extends AbstractTestCase { @@ -92,8 +93,8 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase clazz.dump(tfile); // Read in the new version and check it is OK SyntheticRepository repos2 = createRepos("."); - @SuppressWarnings("unused") JavaClass clazz2 = repos2.loadClass("AttributeTestClassEM02$1"); + Assert.assertNotNull(clazz2); // Use the variable to avoid a warning EnclosingMethod em = (EnclosingMethod) encMethodAttrs[0]; String enclosingClassName = em.getEnclosingClass().getBytes(pool); assertTrue( -- GitLab From 6c60fdc014de2746c407e3b5c1417db3b2646afa Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 00:56:04 +0000 Subject: [PATCH 0837/1313] Constant should be static (Findbugs) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695639 13f79535-47bb-0310-9956-ffa450edef68 --- src/test/java/org/apache/commons/bcel6/AbstractTestCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java b/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java index ac0ba38d..7db4b332 100644 --- a/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java @@ -39,7 +39,7 @@ import junit.framework.TestCase; public abstract class AbstractTestCase extends TestCase { - private final boolean verbose = false; + private static final boolean verbose = false; protected File createTestdataFile(String name) { -- GitLab From b458818c9540dadd53eda12c6db1048bcb5da474 Mon Sep 17 00:00:00 2001 From: Chas Honton Date: Thu, 13 Aug 2015 01:36:31 +0000 Subject: [PATCH 0838/1313] BCEL-231 Remove deprecated methods and classes git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695642 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/classfile/LocalVariableTable.java | 20 ------------------- .../commons/bcel6/classfile/Utility.java | 2 +- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java index 77f94a13..40740ae1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java @@ -115,26 +115,6 @@ public class LocalVariableTable extends Attribute { } - /** - * - * @param index the variable slot - * - * @return the first LocalVariable that matches the slot or null if not found - * - * @deprecated since 5.2 because multiple variables can share the - * same slot, use getLocalVariable(int index, int pc) instead. - */ - @java.lang.Deprecated - public final LocalVariable getLocalVariable( int index ) { - for (LocalVariable variable : local_variable_table) { - if (variable.getIndex() == index) { - return variable; - } - } - return null; - } - - /** * * @param index the variable slot diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java index 62236b8d..7e1f9fe5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java @@ -691,7 +691,7 @@ public abstract class Utility { String param_type = signatureToString(signature.substring(index), chopit); buf.append(param_type); if (vars != null) { - LocalVariable l = vars.getLocalVariable(var_index); + LocalVariable l = vars.getLocalVariable(var_index, 0); if (l != null) { buf.append(" ").append(l.getName()); } -- GitLab From 8569aab0371446618cf8b9c378077fe98955f24e Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 09:22:04 +0000 Subject: [PATCH 0839/1313] Don't expose the setter unnecessarily git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695664 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/generic/Type.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/Type.java b/src/main/java/org/apache/commons/bcel6/generic/Type.java index 72a96162..92e83f82 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Type.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Type.java @@ -393,10 +393,12 @@ public abstract class Type implements java.io.Serializable { } - /** - * @param signature the signature to set + /* + * Currently only used by the ArrayType constructor. + * The signature has a complicated dependency on other parameter + * so it's tricky to do it in a call to the super ctor. */ - public void setSignature(String signature) { + void setSignature(String signature) { this.signature = signature; } } -- GitLab From 46b84ff2e6fc0aafff6c54d193bceb98e1814486 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 09:27:46 +0000 Subject: [PATCH 0840/1313] TODO git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695665 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/ConstantUtf8.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java index 81f1d8f7..2aff7298 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java @@ -39,6 +39,7 @@ public final class ConstantUtf8 extends Constant { private static final long serialVersionUID = -8709101585611518985L; private final String bytes; + // TODO these should perhaps be AtomicInt? private static volatile int considered = 0; private static volatile int hits = 0; private static volatile int skipped = 0; -- GitLab From d3271134b8cf1e21fc36cfe669c41d347b53ee72 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 09:28:41 +0000 Subject: [PATCH 0841/1313] TODO git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695666 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/verifier/VerifierAppFrame.java | 2 +- .../apache/commons/bcel6/verifier/VerifierFactoryListModel.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java index 3a062d9f..cc359ff4 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java @@ -58,7 +58,7 @@ public class VerifierAppFrame extends JFrame { JPanel jPanel2 = new JPanel(); JSplitPane jSplitPane2 = new JSplitPane(); JPanel jPanel3 = new JPanel(); - JList classNamesJList = new JList(); + JList classNamesJList = new JList(); // TODO Java7 makes this generic GridLayout gridLayout1 = new GridLayout(); JPanel messagesPanel = new JPanel(); GridLayout gridLayout2 = new GridLayout(); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java index 065935ec..ea74ef8c 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java @@ -32,7 +32,7 @@ import javax.swing.event.ListDataListener; * @version $Id$ */ public class VerifierFactoryListModel implements org.apache.commons.bcel6.verifier.VerifierFactoryObserver, - javax.swing.ListModel { + javax.swing.ListModel { // TODO Java7 makes ListModel generic private final List listeners = new ArrayList(); private final Set cache = new TreeSet(); -- GitLab From ef6553b5dfab861e575c6d3bc963440d2c91c2fb Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 09:29:03 +0000 Subject: [PATCH 0842/1313] Add some @since markers git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695667 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/EmptyVisitor.java | 30 +++++++++++++++++++ .../commons/bcel6/classfile/Visitor.java | 30 +++++++++++++++++++ .../commons/bcel6/generic/EmptyVisitor.java | 3 ++ .../apache/commons/bcel6/generic/Visitor.java | 3 ++ 4 files changed, 66 insertions(+) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java b/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java index e1994c21..c626d818 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java @@ -30,18 +30,30 @@ public class EmptyVisitor implements Visitor { } + /** + * @since 6.0 + */ public void visitAnnotation(Annotations obj) { } + /** + * @since 6.0 + */ public void visitParameterAnnotation(ParameterAnnotations obj) { } + /** + * @since 6.0 + */ public void visitAnnotationEntry(AnnotationEntry obj) { } + /** + * @since 6.0 + */ public void visitAnnotationDefault(AnnotationDefault obj) { } @@ -130,6 +142,9 @@ public class EmptyVisitor implements Visitor { } + /** + * @since 6.0 + */ public void visitBootstrapMethods(BootstrapMethods obj) { } @@ -182,22 +197,37 @@ public class EmptyVisitor implements Visitor { } + /** + * @since 6.0 + */ public void visitStackMapTable(StackMapTable obj) { } + /** + * @since 6.0 + */ public void visitStackMapTableEntry(StackMapTableEntry obj) { } + /** + * @since 6.0 + */ public void visitEnclosingMethod(EnclosingMethod obj) { } + /** + * @since 6.0 + */ public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) { } + /** + * @since 6.0 + */ public void visitMethodParameters(MethodParameters obj) { } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java b/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java index 2cb0dc09..f376db6b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java @@ -92,23 +92,53 @@ public interface Visitor void visitStackMapEntry(StackMapEntry obj); + /** + * @since 6.0 + */ void visitStackMapTable(StackMapTable obj); + /** + * @since 6.0 + */ void visitStackMapTableEntry(StackMapTableEntry obj); + /** + * @since 6.0 + */ void visitAnnotation(Annotations obj); + /** + * @since 6.0 + */ void visitParameterAnnotation(ParameterAnnotations obj); + /** + * @since 6.0 + */ void visitAnnotationEntry(AnnotationEntry obj); + /** + * @since 6.0 + */ void visitAnnotationDefault(AnnotationDefault obj); + /** + * @since 6.0 + */ void visitLocalVariableTypeTable(LocalVariableTypeTable obj); + /** + * @since 6.0 + */ void visitEnclosingMethod(EnclosingMethod obj); + /** + * @since 6.0 + */ void visitBootstrapMethods(BootstrapMethods obj); + /** + * @since 6.0 + */ void visitMethodParameters(MethodParameters obj); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java b/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java index 1acb0911..5c828c3e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java @@ -743,6 +743,9 @@ public abstract class EmptyVisitor implements Visitor { public void visitBREAKPOINT( BREAKPOINT obj ) { } + /** + * @since 6.0 + */ public void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj) { } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/Visitor.java b/src/main/java/org/apache/commons/bcel6/generic/Visitor.java index 9b9a1685..8152a1f0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Visitor.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Visitor.java @@ -447,6 +447,9 @@ public interface Visitor { void visitINVOKEVIRTUAL( INVOKEVIRTUAL obj ); + /** + * @since 6.0 + */ void visitINVOKEDYNAMIC( INVOKEDYNAMIC obj ); -- GitLab From 7a9d5f6b2260f0138914a6a7b34dc37422d6e43f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 11:36:50 +0000 Subject: [PATCH 0843/1313] TODO git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695678 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/JavaClass.java | 2 +- .../java/org/apache/commons/bcel6/generic/BranchHandle.java | 4 ++-- .../org/apache/commons/bcel6/generic/InstructionHandle.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 195f4d5b..3d86752c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -645,7 +645,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * Sets the ClassRepository which loaded the JavaClass. * Should be called immediately after parsing is done. */ - public void setRepository( org.apache.commons.bcel6.util.Repository repository ) { + public void setRepository( org.apache.commons.bcel6.util.Repository repository ) { // TODO make protected? this.repository = repository; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java index dc31987d..46db8e0f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java @@ -91,7 +91,7 @@ public final class BranchHandle extends InstructionHandle { /** * Pass new target to instruction. */ - public void setTarget( InstructionHandle ih ) { + public void setTarget( InstructionHandle ih ) { // TODO unused bi.setTarget(ih); } @@ -116,7 +116,7 @@ public final class BranchHandle extends InstructionHandle { * Set new contents. Old instruction is disposed and may not be used anymore. */ @Override - public void setInstruction( Instruction i ) { + public void setInstruction( Instruction i ) { // TODO could be package-protected? super.setInstruction(i); if (!(i instanceof BranchInstruction)) { throw new ClassGenException("Assigning " + i diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java index edeb08ab..905d8e2c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java @@ -71,7 +71,7 @@ public class InstructionHandle implements java.io.Serializable { * Replace current instruction contained in this handle. * Old instruction is disposed using Instruction.dispose(). */ - public void setInstruction( Instruction i ) { // Overridden in BranchHandle + public void setInstruction( Instruction i ) { // Overridden in BranchHandle TODO could be package-protected? if (i == null) { throw new ClassGenException("Assigning null to handle"); } -- GitLab From b65a29cdf96ed9a6d845a982ee3cf16ff4d8d051 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 11:38:24 +0000 Subject: [PATCH 0844/1313] Move to same package as ClassGen so setMajor/Minor can be package protected if required git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695679 13f79535-47bb-0310-9956-ffa450edef68 --- .../{ => generic}/GeneratingAnnotatedClassesTestCase.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename src/test/java/org/apache/commons/bcel6/{ => generic}/GeneratingAnnotatedClassesTestCase.java (99%) diff --git a/src/test/java/org/apache/commons/bcel6/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java similarity index 99% rename from src/test/java/org/apache/commons/bcel6/GeneratingAnnotatedClassesTestCase.java rename to src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java index 86e8b095..cd5f51e5 100644 --- a/src/test/java/org/apache/commons/bcel6/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java @@ -15,12 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6; +package org.apache.commons.bcel6.generic; import java.io.File; import java.util.ArrayList; import java.util.List; +import org.apache.commons.bcel6.AbstractTestCase; import org.apache.commons.bcel6.Constants; import org.apache.commons.bcel6.classfile.AnnotationEntry; import org.apache.commons.bcel6.classfile.ArrayElementValue; -- GitLab From 02cab1f4fad0658e12a29074370bd21a0d408508 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 11:39:27 +0000 Subject: [PATCH 0845/1313] TODO git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695680 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/generic/ClassGen.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index e3479fed..3423af0d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -243,7 +243,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** Set major version number of class file, default value is 45 (JDK 1.1) * @param major major version number */ - public void setMajor( int major ) { + public void setMajor( int major ) { // TODO could be package-protected - only called by test code this.major = major; } @@ -251,11 +251,10 @@ public class ClassGen extends AccessFlags implements Cloneable { /** Set minor version number of class file, default value is 3 (JDK 1.1) * @param minor minor version number */ - public void setMinor( int minor ) { + public void setMinor( int minor ) { // TODO could be package-protected - only called by test code this.minor = minor; } - /** * @return minor version number of class file */ @@ -416,13 +415,13 @@ public class ClassGen extends AccessFlags implements Cloneable { } - public void setClassName( String name ) { + public void setClassName( String name ) { // TODO unused class_name = name.replace('/', '.'); class_name_index = cp.addClass(name); } - public void setSuperclassName( String name ) { + public void setSuperclassName( String name ) { // TODO unused super_class_name = name.replace('/', '.'); superclass_name_index = cp.addClass(name); } @@ -433,7 +432,7 @@ public class ClassGen extends AccessFlags implements Cloneable { } - public void setMethods( Method[] methods ) { + public void setMethods( Method[] methods ) { // TODO unused method_vec.clear(); for (Method method : methods) { addMethod(method); @@ -441,7 +440,7 @@ public class ClassGen extends AccessFlags implements Cloneable { } - public void setMethodAt( Method method, int pos ) { + public void setMethodAt( Method method, int pos ) { // TODO unused method_vec.set(pos, method); } @@ -489,19 +488,19 @@ public class ClassGen extends AccessFlags implements Cloneable { } - public void setConstantPool( ConstantPoolGen constant_pool ) { + public void setConstantPool( ConstantPoolGen constant_pool ) { // TODO unused cp = constant_pool; } - public void setClassNameIndex( int class_name_index ) { + public void setClassNameIndex( int class_name_index ) { // TODO unused this.class_name_index = class_name_index; class_name = cp.getConstantPool().getConstantString(class_name_index, Constants.CONSTANT_Class).replace('/', '.'); } - public void setSuperclassNameIndex( int superclass_name_index ) { + public void setSuperclassNameIndex( int superclass_name_index ) { // TODO unused this.superclass_name_index = superclass_name_index; super_class_name = cp.getConstantPool().getConstantString(superclass_name_index, Constants.CONSTANT_Class).replace('/', '.'); -- GitLab From c78e08a0cbc9e82a946b7f4947fcece92e89d7a4 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 12:01:00 +0000 Subject: [PATCH 0846/1313] TODO git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695689 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/generic/CPInstruction.java | 2 +- .../bcel6/generic/CodeExceptionGen.java | 8 ++++---- .../commons/bcel6/generic/FieldGen.java | 18 ++++++++--------- .../bcel6/generic/FieldGenOrMethodGen.java | 6 +++--- .../bcel6/generic/InstructionFactory.java | 4 ++-- .../bcel6/generic/InstructionList.java | 4 ++-- .../commons/bcel6/generic/LineNumberGen.java | 4 ++-- .../bcel6/generic/LocalVariableGen.java | 10 +++++----- .../generic/LocalVariableInstruction.java | 2 +- .../commons/bcel6/generic/MethodGen.java | 20 +++++++++---------- .../apache/commons/bcel6/generic/Select.java | 2 +- .../structurals/ControlFlowGraph.java | 2 +- .../structurals/ExecutionVisitor.java | 4 ++-- .../structurals/InstConstraintVisitor.java | 4 ++-- .../verifier/structurals/LocalVariables.java | 2 +- 15 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java index 71d31fd1..5872d21a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java @@ -124,7 +124,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct * Set the index to constant pool. * @param index in constant pool. */ - public void setIndex( int index ) { + public void setIndex( int index ) { // TODO could be package-protected? if (index < 0) { throw new ClassGenException("Negative index value: " + index); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java index fbacb6d8..6b78e2c9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java @@ -79,7 +79,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable, j /* Set start of handler * @param start_pc Start of handled region (inclusive) */ - public void setStartPC( InstructionHandle start_pc ) { + public void setStartPC( InstructionHandle start_pc ) { // TODO could be package-protected? BranchInstruction.notifyTarget(this.start_pc, start_pc, this); this.start_pc = start_pc; } @@ -88,7 +88,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable, j /* Set end of handler * @param end_pc End of handled region (inclusive) */ - public void setEndPC( InstructionHandle end_pc ) { + public void setEndPC( InstructionHandle end_pc ) { // TODO could be package-protected? BranchInstruction.notifyTarget(this.end_pc, end_pc, this); this.end_pc = end_pc; } @@ -97,7 +97,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable, j /* Set handler code * @param handler_pc Start of handler */ - public void setHandlerPC( InstructionHandle handler_pc ) { + public void setHandlerPC( InstructionHandle handler_pc ) { // TODO could be package-protected? BranchInstruction.notifyTarget(this.handler_pc, handler_pc, this); this.handler_pc = handler_pc; } @@ -137,7 +137,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable, j /** Sets the type of the Exception to catch. Set 'null' for ANY. */ - public void setCatchType( ObjectType catch_type ) { + public void setCatchType( ObjectType catch_type ) { // TODO unused this.catch_type = catch_type; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index a7d8997c..cdaf8336 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -123,7 +123,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( long l ) { + public void setInitValue( long l ) { // TODO unused checkType(Type.LONG); if (l != 0L) { value = new Long(l); @@ -131,7 +131,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( int i ) { + public void setInitValue( int i ) { // TODO unused checkType(Type.INT); if (i != 0) { value = Integer.valueOf(i); @@ -139,7 +139,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( short s ) { + public void setInitValue( short s ) { // TODO unused checkType(Type.SHORT); if (s != 0) { value = Integer.valueOf(s); @@ -147,7 +147,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( char c ) { + public void setInitValue( char c ) { // TODO unused checkType(Type.CHAR); if (c != 0) { value = Integer.valueOf(c); @@ -155,7 +155,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( byte b ) { + public void setInitValue( byte b ) { // TODO unused checkType(Type.BYTE); if (b != 0) { value = Integer.valueOf(b); @@ -163,7 +163,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( boolean b ) { + public void setInitValue( boolean b ) { // TODO unused checkType(Type.BOOLEAN); if (b) { value = Integer.valueOf(1); @@ -171,7 +171,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( float f ) { + public void setInitValue( float f ) { // TODO unused checkType(Type.FLOAT); if (f != 0.0) { value = new Float(f); @@ -179,7 +179,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( double d ) { + public void setInitValue( double d ) { // TODO unused checkType(Type.DOUBLE); if (d != 0.0) { value = new Double(d); @@ -189,7 +189,7 @@ public class FieldGen extends FieldGenOrMethodGen { /** Remove any initial value. */ - public void cancelInitValue() { + public void cancelInitValue() { // TODO unused value = null; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java index 4e5a7c48..edd0da56 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java @@ -48,7 +48,7 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn super(access_flags); } - public void setType( Type type ) { + public void setType( Type type ) { // TODO could be package-protected? if (type.getType() == Constants.T_ADDRESS) { throw new IllegalArgumentException("Type can not be " + type); } @@ -68,7 +68,7 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn } - public void setName( String name ) { + public void setName( String name ) { // TODO could be package-protected? this.name = name; } @@ -78,7 +78,7 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn } - public void setConstantPool( ConstantPoolGen cp ) { + public void setConstantPool( ConstantPoolGen cp ) { // TODO could be package-protected? this.cp = cp; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java index 3cd24bcb..c07aa719 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java @@ -749,7 +749,7 @@ public class InstructionFactory implements java.io.Serializable { } - public void setClassGen( ClassGen c ) { + public void setClassGen( ClassGen c ) { // TODO unused cg = c; } @@ -759,7 +759,7 @@ public class InstructionFactory implements java.io.Serializable { } - public void setConstantPool( ConstantPoolGen c ) { + public void setConstantPool( ConstantPoolGen c ) { // TODO unused cp = c; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java index 57ce496a..86c80ef8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java @@ -841,7 +841,7 @@ public class InstructionList implements Serializable { } - public void setPositions() { + public void setPositions() { // TODO could be package-protected? (some test code would need to be repackaged) setPositions(false); } @@ -853,7 +853,7 @@ public class InstructionList implements Serializable { * @param check Perform sanity checks, e.g. if all targeted instructions really belong * to this list */ - public void setPositions( boolean check ) { + public void setPositions( boolean check ) { // called by code in other packages int max_additional_bytes = 0, additional_bytes = 0; int index = 0, count = 0; int[] pos = new int[length]; diff --git a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java index d5953b77..f65319c6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java @@ -77,7 +77,7 @@ public class LineNumberGen implements InstructionTargeter, Cloneable, java.io.Se } - public void setInstruction( InstructionHandle ih ) { + public void setInstruction( InstructionHandle ih ) { // TODO could be package-protected? if (ih == null) { throw new NullPointerException("InstructionHandle may not be null"); } @@ -101,7 +101,7 @@ public class LineNumberGen implements InstructionTargeter, Cloneable, java.io.Se } - public void setSourceLine( int src_line ) { + public void setSourceLine( int src_line ) { // TODO could be package-protected? this.src_line = src_line; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java index 3cd8263f..492b710b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java @@ -90,7 +90,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo } - public void setIndex( int index ) { + public void setIndex( int index ) { // TODO unused this.index = index; } @@ -100,7 +100,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo } - public void setName( String name ) { + public void setName( String name ) { // TODO unused this.name = name; } @@ -110,7 +110,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo } - public void setType( Type type ) { + public void setType( Type type ) { // TODO unused this.type = type; } @@ -130,13 +130,13 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo } - public void setStart( InstructionHandle start ) { + public void setStart( InstructionHandle start ) { // TODO could be package-protected? BranchInstruction.notifyTarget(this.start, start, this); this.start = start; } - public void setEnd( InstructionHandle end ) { + public void setEnd( InstructionHandle end ) { // TODO could be package-protected? BranchInstruction.notifyTarget(this.end, end, this); this.end = end; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java index fb9c9598..76cbeaeb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java @@ -151,7 +151,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty /** * Set the local variable index */ - public void setIndex( int n ) { + public void setIndex( int n ) { // TODO could be package-protected? if ((n < 0) || (n > Constants.MAX_SHORT)) { throw new ClassGenException("Illegal value: " + n); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 3f1e0dd2..1c84e329 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -746,7 +746,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * Set maximum stack size for this method. */ - public void setMaxStack( int m ) { + public void setMaxStack( int m ) { // TODO could be package-protected? max_stack = m; } @@ -763,12 +763,12 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setClassName( String class_name ) { + public void setClassName( String class_name ) { // TODO could be package-protected? this.class_name = class_name; } - public void setReturnType( Type return_type ) { + public void setReturnType( Type return_type ) { // TODO unused setType(return_type); } @@ -778,7 +778,7 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setArgumentTypes( Type[] arg_types ) { + public void setArgumentTypes( Type[] arg_types ) { // TODO could be package-protected? this.arg_types = arg_types; } @@ -788,7 +788,7 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setArgumentType( int i, Type type ) { + public void setArgumentType( int i, Type type ) { // TODO unused arg_types[i] = type; } @@ -798,7 +798,7 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setArgumentNames( String[] arg_names ) { + public void setArgumentNames( String[] arg_names ) { // TODO could be package-protected? this.arg_names = arg_names; } @@ -808,7 +808,7 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setArgumentName( int i, String name ) { + public void setArgumentName( int i, String name ) { // TODO unused arg_names[i] = name; } @@ -823,7 +823,7 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setInstructionList( InstructionList il ) { + public void setInstructionList( InstructionList il ) { // TODO could be package-protected? this.il = il; } @@ -837,7 +837,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * Computes max. stack size by performing control flow analysis. */ - public void setMaxStack() { + public void setMaxStack() { // TODO could be package-protected? (some tests would need repackaging) if (il != null) { max_stack = getMaxStack(cp, il, getExceptionHandlers()); } else { @@ -849,7 +849,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * Compute maximum number of local variables. */ - public void setMaxLocals() { + public void setMaxLocals() { // TODO could be package-protected? (some tests would need repackaging) if (il != null) { int max = isStatic() ? 0 : 1; if (arg_types != null) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/Select.java b/src/main/java/org/apache/commons/bcel6/generic/Select.java index 2ffc3438..50f6cc04 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Select.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Select.java @@ -153,7 +153,7 @@ public abstract class Select extends BranchInstruction implements VariableLength /** * Set branch target for `i'th case */ - public void setTarget( int i, InstructionHandle target ) { + public void setTarget( int i, InstructionHandle target ) { // TODO could be package-protected? notifyTarget(targets[i], target, this); targets[i] = target; } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java index b38bbb40..743eaae8 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java @@ -99,7 +99,7 @@ public class ControlFlowGraph{ } /* Satisfies InstructionContext.setTag(int). */ - public void setTag(int tag){ + public void setTag(int tag){ // part of InstructionContext interface TAG = tag; } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java index a25c406f..a541f682 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java @@ -94,7 +94,7 @@ public class ExecutionVisitor extends EmptyVisitor{ /** * Sets the ConstantPoolGen needed for symbolic execution. */ - public void setConstantPoolGen(ConstantPoolGen cpg){ + public void setConstantPoolGen(ConstantPoolGen cpg){ // TODO could be package-protected? this.cpg = cpg; } @@ -104,7 +104,7 @@ public class ExecutionVisitor extends EmptyVisitor{ * instance, SET THE ConstantPoolGen FIRST. * @see #setConstantPoolGen(ConstantPoolGen) */ - public void setFrame(Frame f){ + public void setFrame(Frame f){ // TODO could be package-protected? this.frame = f; } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java index 05a9d9a0..b095f11e 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java @@ -120,7 +120,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * @see #setConstantPoolGen(ConstantPoolGen cpg) * @see #setMethodGen(MethodGen mg) */ - public void setFrame(Frame f){ + public void setFrame(Frame f){ // TODO could be package-protected? this.frame = f; //if (singleInstance.mg == null || singleInstance.cpg == null) throw new AssertionViolatedException("Forgot to set important values first."); } @@ -129,7 +129,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Sets the ConstantPoolGen instance needed for constraint * checking prior to execution. */ - public void setConstantPoolGen(ConstantPoolGen cpg){ + public void setConstantPoolGen(ConstantPoolGen cpg){ // TODO could be package-protected? this.cpg = cpg; } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java index e85bca97..8e9223a6 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java @@ -83,7 +83,7 @@ public class LocalVariables{ /** * Sets a new Type for the given local variable slot. */ - public void set(int i, Type type){ + public void set(int i, Type type){ // TODO could be package-protected? if (type == Type.BYTE || type == Type.SHORT || type == Type.BOOLEAN || type == Type.CHAR){ throw new AssertionViolatedException("LocalVariables do not know about '"+type+"'. Use Type.INT instead."); } -- GitLab From c986fc18b8ccf9715b7bf78c7c2d86f85ce501ed Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 13 Aug 2015 16:56:15 +0000 Subject: [PATCH 0847/1313] findbugs-maven-plugin 3.0.0 -> 3.0.1 on Java 7. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695739 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c4e531cb..f1dddf01 100644 --- a/pom.xml +++ b/pom.xml @@ -354,7 +354,7 @@ [1.7,) - 3.0.0 + 3.0.1 -- GitLab From 5464c3b1066dd4646dc9951e7c16a2658989966e Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 13 Aug 2015 17:02:36 +0000 Subject: [PATCH 0848/1313] Add missing '@Override' annotations. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695740 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/verifier/tests/TestArrayAccess02Creator.java | 3 ++- .../commons/bcel6/verifier/tests/TestArrayAccess03Creator.java | 3 ++- .../commons/bcel6/verifier/tests/TestArrayAccess04Creator.java | 3 ++- .../commons/bcel6/verifier/tests/TestReturn01Creator.java | 3 ++- .../commons/bcel6/verifier/tests/TestReturn03Creator.java | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java index e4f3c739..455a3e9c 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java @@ -45,7 +45,8 @@ public class TestArrayAccess02Creator extends TestCreator { _factory = new InstructionFactory(_cg, _cp); } - public void create(OutputStream out) throws IOException { + @Override +public void create(OutputStream out) throws IOException { createMethod_0(); createMethod_1(); _cg.getJavaClass().dump(out); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java index 2f7ca304..1f34c59c 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java @@ -45,7 +45,8 @@ public class TestArrayAccess03Creator extends TestCreator { _factory = new InstructionFactory(_cg, _cp); } - public void create(OutputStream out) throws IOException { + @Override +public void create(OutputStream out) throws IOException { createMethod_0(); createMethod_1(); _cg.getJavaClass().dump(out); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java index e64fa6f3..3782c573 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java @@ -43,7 +43,8 @@ public class TestArrayAccess04Creator extends TestCreator { _factory = new InstructionFactory(_cg, _cp); } - public void create(OutputStream out) throws IOException { + @Override +public void create(OutputStream out) throws IOException { createMethod_0(); createMethod_1(); _cg.getJavaClass().dump(out); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java index 5505a495..c72b6ca4 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java @@ -43,7 +43,8 @@ public class TestReturn01Creator extends TestCreator { _factory = new InstructionFactory(_cg, _cp); } - public void create(OutputStream out) throws IOException { + @Override +public void create(OutputStream out) throws IOException { createMethod_0(); createMethod_1(); _cg.getJavaClass().dump(out); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java index 2f651087..9bf67895 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java @@ -43,7 +43,8 @@ public class TestReturn03Creator extends TestCreator { _factory = new InstructionFactory(_cg, _cp); } - public void create(OutputStream out) throws IOException { + @Override +public void create(OutputStream out) throws IOException { createMethod_0(); createMethod_1(); _cg.getJavaClass().dump(out); -- GitLab From 90867a91054a478d4b87ddfe32103771347c144a Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 13 Aug 2015 18:58:38 +0000 Subject: [PATCH 0849/1313] [BCEL-244] Update Java requirement from 5 to 7. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695748 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 6 +++--- src/changes/changes.xml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index f1dddf01..10284e0d 100644 --- a/pom.xml +++ b/pom.xml @@ -40,11 +40,11 @@ ISO-8859-1 UTF-8 - 1.5 - 1.5 + 1.7 + 1.7 bcel 6.0 - (Java 5.0+) + (Java 7+) https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-bcel org.apache.${commons.componentid} diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 29f7e10b..8c959577 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Update Java requirement from 5 to 7 Interfaces should not be used to define constants Remove unused setters Make mutable fields private -- GitLab From ecdc6f1f11178c29c812ecd5725c2a2818d3f255 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 19:50:41 +0000 Subject: [PATCH 0850/1313] BCEL-217 long type instructions are not searched by InstructionFinder using regular expression git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695767 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../java/org/apache/commons/bcel6/util/InstructionFinder.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 8c959577..118f4a0a 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + long type instructions are not searched by InstructionFinder using regular expression Update Java requirement from 5 to 7 Interfaces should not be used to define constants Remove unused setters diff --git a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java index 4738875e..4cc193da 100644 --- a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java +++ b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java @@ -353,10 +353,12 @@ public class InstructionFinder { map.put("lconst", new String(new char[] { '(', makeChar(Constants.LCONST_0), '|', makeChar(Constants.LCONST_1), ')' })); map.put("dconst", new String(new char[] { '(', makeChar(Constants.DCONST_0), '|', makeChar(Constants.DCONST_1), ')' })); map.put("fconst", new String(new char[] { '(', makeChar(Constants.FCONST_0), '|', makeChar(Constants.FCONST_1), ')' })); + map.put("lload", precompile(Constants.LLOAD_0, Constants.LLOAD_3, Constants.LLOAD)); map.put("iload", precompile(Constants.ILOAD_0, Constants.ILOAD_3, Constants.ILOAD)); map.put("dload", precompile(Constants.DLOAD_0, Constants.DLOAD_3, Constants.DLOAD)); map.put("fload", precompile(Constants.FLOAD_0, Constants.FLOAD_3, Constants.FLOAD)); map.put("aload", precompile(Constants.ALOAD_0, Constants.ALOAD_3, Constants.ALOAD)); + map.put("lstore", precompile(Constants.LSTORE_0, Constants.LSTORE_3, Constants.LSTORE)); map.put("istore", precompile(Constants.ISTORE_0, Constants.ISTORE_3, Constants.ISTORE)); map.put("dstore", precompile(Constants.DSTORE_0, Constants.DSTORE_3, Constants.DSTORE)); map.put("fstore", precompile(Constants.FSTORE_0, Constants.FSTORE_3, Constants.FSTORE)); -- GitLab From b9483f5b42d6b03fbea9b65bf1f2f8bd836fc4bf Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 19:51:02 +0000 Subject: [PATCH 0851/1313] Generics git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695768 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/verifier/VerifierAppFrame.java | 6 +++--- .../commons/bcel6/verifier/VerifierFactoryListModel.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java index cc359ff4..e2caea6a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java @@ -58,7 +58,7 @@ public class VerifierAppFrame extends JFrame { JPanel jPanel2 = new JPanel(); JSplitPane jSplitPane2 = new JSplitPane(); JPanel jPanel3 = new JPanel(); - JList classNamesJList = new JList(); // TODO Java7 makes this generic + JList classNamesJList = new JList(); GridLayout gridLayout1 = new GridLayout(); JPanel messagesPanel = new JPanel(); GridLayout gridLayout2 = new GridLayout(); @@ -83,8 +83,8 @@ public class VerifierAppFrame extends JFrame { JScrollPane jScrollPane5 = new JScrollPane(); JScrollPane jScrollPane6 = new JScrollPane(); JScrollPane jScrollPane7 = new JScrollPane(); - JList pass3aJList = new JList(); - JList pass3bJList = new JList(); + JList pass3aJList = new JList(); + JList pass3bJList = new JList(); JTextPane pass3aTextPane = new JTextPane(); JTextPane pass3bTextPane = new JTextPane(); JMenu jMenu2 = new JMenu(); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java index ea74ef8c..e2f06507 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java @@ -32,7 +32,7 @@ import javax.swing.event.ListDataListener; * @version $Id$ */ public class VerifierFactoryListModel implements org.apache.commons.bcel6.verifier.VerifierFactoryObserver, - javax.swing.ListModel { // TODO Java7 makes ListModel generic + javax.swing.ListModel { private final List listeners = new ArrayList(); private final Set cache = new TreeSet(); @@ -73,7 +73,7 @@ public class VerifierFactoryListModel implements org.apache.commons.bcel6.verifi } - public synchronized Object getElementAt( int index ) { + public synchronized String getElementAt( int index ) { return (cache.toArray(new String[cache.size()]))[index]; } } -- GitLab From 06a63c57bfa932917bc5fcd9ece391083caca55a Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 20:09:51 +0000 Subject: [PATCH 0852/1313] BCEL-212 Inconsistent toString() results git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695771 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../java/org/apache/commons/bcel6/classfile/ExceptionTable.java | 1 + .../org/apache/commons/bcel6/classfile/LineNumberTable.java | 2 +- src/main/java/org/apache/commons/bcel6/classfile/Signature.java | 2 +- .../java/org/apache/commons/bcel6/classfile/SourceFile.java | 2 +- 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 118f4a0a..a60f3c16 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Inconsistent toString() results long type instructions are not searched by InstructionFinder using regular expression Update Java requirement from 5 to 7 Interfaces should not be used to define constants diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java index f034266f..554adfc3 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java @@ -146,6 +146,7 @@ public final class ExceptionTable extends Attribute { public final String toString() { StringBuilder buf = new StringBuilder(); String str; + buf.append("Exceptions: "); for (int i = 0; i < exception_index_table.length; i++) { str = super.getConstantPool().getConstantString(exception_index_table[i], Constants.CONSTANT_Class); buf.append(Utility.compactClassName(str, false)); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java index 09cd160d..a5a095b4 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java @@ -129,7 +129,7 @@ public final class LineNumberTable extends Attribute { if (i < line_number_table.length - 1) { line.append(", "); } - if (line.length() > 72) { + if ((line.length() > 72) && (i < line_number_table.length - 1)) { line.append(newLine); buf.append(line.toString()); line.setLength(0); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java index 414f085c..b0325591 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java @@ -247,7 +247,7 @@ public final class Signature extends Attribute { @Override public final String toString() { String s = getSignature(); - return "Signature(" + s + ")"; + return "Signature: " + s; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java index 053bb176..f57f5522 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java @@ -129,7 +129,7 @@ public final class SourceFile extends Attribute { */ @Override public final String toString() { - return "SourceFile(" + getSourceFileName() + ")"; + return "SourceFile: " + getSourceFileName(); } -- GitLab From 9637f8fa7943d19b4108ca63d02de9b50d333c10 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 20:48:11 +0000 Subject: [PATCH 0853/1313] Simplify (props Gary) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695777 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/verifier/VerifierAppFrame.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java index e2caea6a..9c7baf17 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java @@ -58,7 +58,7 @@ public class VerifierAppFrame extends JFrame { JPanel jPanel2 = new JPanel(); JSplitPane jSplitPane2 = new JSplitPane(); JPanel jPanel3 = new JPanel(); - JList classNamesJList = new JList(); + JList classNamesJList = new JList<>(); GridLayout gridLayout1 = new GridLayout(); JPanel messagesPanel = new JPanel(); GridLayout gridLayout2 = new GridLayout(); @@ -83,8 +83,8 @@ public class VerifierAppFrame extends JFrame { JScrollPane jScrollPane5 = new JScrollPane(); JScrollPane jScrollPane6 = new JScrollPane(); JScrollPane jScrollPane7 = new JScrollPane(); - JList pass3aJList = new JList(); - JList pass3bJList = new JList(); + JList pass3aJList = new JList<>(); + JList pass3bJList = new JList<>(); JTextPane pass3aTextPane = new JTextPane(); JTextPane pass3bTextPane = new JTextPane(); JMenu jMenu2 = new JMenu(); -- GitLab From 35ac47dc112c69259622bf1f702aa809c5307ecd Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 21:21:12 +0000 Subject: [PATCH 0854/1313] BCEL-208 Need to check for an empty InstructionList git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695781 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../bcel6/generic/LocalVariableGen.java | 12 +++-- .../commons/bcel6/generic/MethodGen.java | 4 +- .../apache/commons/bcel6/PLSETestCase.java | 46 +++++++++++++++++++ .../commons/bcel6/data/PLSETestClass.java | 28 +++++++++++ 5 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 src/test/java/org/apache/commons/bcel6/PLSETestCase.java create mode 100644 src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java diff --git a/src/changes/changes.xml b/src/changes/changes.xml index a60f3c16..63975a8c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Need to check for an empty InstructionList Inconsistent toString() results long type instructions are not searched by InstructionFinder using regular expression Update Java requirement from 5 to 7 diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java index 492b710b..b53dd025 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java @@ -78,10 +78,14 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo * @param cp constant pool */ public LocalVariable getLocalVariable( ConstantPoolGen cp ) { - int start_pc = start.getPosition(); - int length = end.getPosition() - start_pc; - if (end.getNext() == null) { - length += end.getInstruction().getLength(); + int start_pc = 0; + int length = 0; + if ((start != null) && (end != null)) { + start_pc = start.getPosition(); + length = end.getPosition() - start_pc; + if (end.getNext() == null) { + length += end.getInstruction().getLength(); + } } int name_index = cp.addUtf8(name); int signature_index = cp.addUtf8(type.getSignature()); diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 1c84e329..8d45ea2e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -360,10 +360,10 @@ public class MethodGen extends FieldGenOrMethodGen { LocalVariableGen[] lg = new LocalVariableGen[size]; variable_vec.toArray(lg); for (int i = 0; i < size; i++) { - if (lg[i].getStart() == null) { + if ((lg[i].getStart() == null) && (il != null)) { lg[i].setStart(il.getStart()); } - if (lg[i].getEnd() == null) { + if ((lg[i].getEnd() == null) && (il != null)) { lg[i].setEnd(il.getEnd()); } } diff --git a/src/test/java/org/apache/commons/bcel6/PLSETestCase.java b/src/test/java/org/apache/commons/bcel6/PLSETestCase.java new file mode 100644 index 00000000..17303cac --- /dev/null +++ b/src/test/java/org/apache/commons/bcel6/PLSETestCase.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.commons.bcel6; + +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Method; +import org.apache.commons.bcel6.generic.ClassGen; +import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.commons.bcel6.generic.Type; + +public class PLSETestCase extends AbstractTestCase +{ + /** + * BCEL-208: A couple of methods in MethodGen.java need to test for + * an empty instruction list. + */ + public void testB208() throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.PLSETestClass"); + ClassGen gen = new ClassGen(clazz); + ConstantPoolGen pool = gen.getConstantPool(); + Method m = gen.getMethodAt(1); + MethodGen mg = new MethodGen(m, gen.getClassName(), pool); + mg.setInstructionList(null); + mg.addLocalVariable("local2", Type.INT, null, null); + // currently, this will cause null pointer exception + mg.getLocalVariableTable(pool); + } +} diff --git a/src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java b/src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java new file mode 100644 index 00000000..1f1a79b4 --- /dev/null +++ b/src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java @@ -0,0 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.commons.bcel6.data; + +public class PLSETestClass +{ + public void meth1(int arg1) + { + @SuppressWarnings("unused") + int local1 = arg1; + } +} -- GitLab From 70c22d31eafc7d971e2b4fe8ee09f41065aac3e0 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 21:22:02 +0000 Subject: [PATCH 0855/1313] Oops git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695782 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 63975a8c..04c18364 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,7 +63,7 @@ The type attribute can be add,update,fix,remove. - Need to check for an empty InstructionList + Need to check for an empty InstructionList Inconsistent toString() results long type instructions are not searched by InstructionFinder using regular expression Update Java requirement from 5 to 7 -- GitLab From 3da8b11c6c310e5fa5805ab90fb6634c4a7033b4 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 21:25:53 +0000 Subject: [PATCH 0856/1313] BCEL-205 add javadoc comments to LineNumber.java and LineNumberTable.java git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695783 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../java/org/apache/commons/bcel6/classfile/LineNumber.java | 2 ++ .../org/apache/commons/bcel6/classfile/LineNumberTable.java | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 04c18364..3ab67ce2 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + add javadoc comments to LineNumber.java and LineNumberTable.java Need to check for an empty InstructionList Inconsistent toString() results long type instructions are not searched by InstructionFinder using regular expression diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java index aafe4299..afb743a3 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java @@ -54,6 +54,7 @@ public final class LineNumber implements Cloneable, Node, Serializable { * Construct object from file stream. * * @param file Input stream + * @throws IOEXception if an I/O Exception occurs in readUnsignedShort */ LineNumber(DataInput file) throws IOException { this(file.readUnsignedShort(), file.readUnsignedShort()); @@ -86,6 +87,7 @@ public final class LineNumber implements Cloneable, Node, Serializable { * Dump line number/pc pair to file stream in binary format. * * @param file Output file stream + * @throws IOEXception if an I/O Exception occurs in writeShort */ public final void dump( DataOutputStream file ) throws IOException { file.writeShort(start_pc); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java index a5a095b4..9df14901 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java @@ -67,7 +67,7 @@ public final class LineNumberTable extends Attribute { * @param length Content length in bytes * @param input Input stream * @param constant_pool Array of constants - * @throws IOException + * @throws IOEXception if an I/O Exception occurs in readUnsignedShort */ LineNumberTable(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { @@ -97,6 +97,7 @@ public final class LineNumberTable extends Attribute { * Dump line number table attribute to file stream in binary format. * * @param file Output file stream + * @throws IOEXception if an I/O Exception occurs in writeShort */ @Override public final void dump( DataOutputStream file ) throws IOException { -- GitLab From 1419bf8e0765894204c674ebad0c09f377326df4 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 21:43:49 +0000 Subject: [PATCH 0857/1313] BCEL-201 modify several toString methods to make output similar to "javap" git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695784 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../commons/bcel6/classfile/InnerClass.java | 9 ++++----- .../commons/bcel6/classfile/InnerClasses.java | 3 +++ .../commons/bcel6/classfile/LocalVariable.java | 15 ++++++++++++--- .../bcel6/classfile/LocalVariableTypeTable.java | 2 +- .../commons/bcel6/generic/BranchInstruction.java | 11 ++++++++--- .../org/apache/commons/bcel6/util/BCELifier.java | 9 +++++---- 7 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 3ab67ce2..5e9f84f0 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + modify several toString methods to make output similar to "javap" add javadoc comments to LineNumber.java and LineNumberTable.java Need to check for an empty InstructionList Inconsistent toString() results diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java index 39c7a378..b6b06bc1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java @@ -155,20 +155,19 @@ public final class InnerClass implements Cloneable, Node, Serializable { if (outer_class_index != 0) { outer_class_name = constant_pool.getConstantString(outer_class_index, Constants.CONSTANT_Class); - outer_class_name = Utility.compactClassName(outer_class_name); + outer_class_name = " of class " + Utility.compactClassName(outer_class_name); } else { - outer_class_name = ""; + outer_class_name = ""; } if (inner_name_index != 0) { inner_name = ((ConstantUtf8) constant_pool.getConstant(inner_name_index, Constants.CONSTANT_Utf8)).getBytes(); } else { - inner_name = ""; + inner_name = "(anonymous)"; } access = Utility.accessToString(inner_access_flags, true); access = access.equals("") ? "" : (access + " "); - return "InnerClass:" + access + inner_class_name + "(\"" + outer_class_name + "\", \"" - + inner_name + "\")"; + return " " + access + inner_name + "=class " + inner_class_name + outer_class_name; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java index 33a16270..ba186b54 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java @@ -123,6 +123,9 @@ public final class InnerClasses extends Attribute { @Override public final String toString() { StringBuilder buf = new StringBuilder(); + buf.append("InnerClasses("); + buf.append(inner_classes.length); + buf.append("):\n"); for (InnerClass inner_class : inner_classes) { buf.append(inner_class.toString(super.getConstantPool())).append("\n"); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java index fdc9ec89..78e96376 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java @@ -179,14 +179,23 @@ public final class LocalVariable implements Cloneable, Node, Serializable { } + /* + * Helper method shared with LocalVariableTypeTable + */ + final String toStringShared( boolean typeTable ) { + String name = getName(), signature = Utility.signatureToString(getSignature(), false); + String label = "LocalVariable" + (typeTable ? "Types" : "" ); + return label + "(start_pc = " + start_pc + ", length = " + length + ", index = " + + index + ":" + signature + " " + name + ")"; + } + + /** * @return string representation. */ @Override public final String toString() { - String name = getName(), signature = Utility.signatureToString(getSignature()); - return "LocalVariable(start_pc = " + start_pc + ", length = " + length + ", index = " - + index + ":" + signature + " " + name + ")"; + return toStringShared(false); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java index 34eaca08..fc096e40 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java @@ -116,7 +116,7 @@ public class LocalVariableTypeTable extends Attribute { StringBuilder buf = new StringBuilder(); for (int i = 0; i < local_variable_type_table.length; i++) { - buf.append(local_variable_type_table[i].toString()); + buf.append(local_variable_type_table[i].toStringShared(true)); if (i < local_variable_type_table.length - 1) { buf.append('\n'); diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java index 3ef707a6..4d0f64cc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java @@ -135,13 +135,18 @@ public abstract class BranchInstruction extends Instruction implements Instructi } else if (target.getInstruction() == null) { t = ""; } else { - t = target.getInstruction().toString(false); // Avoid circles + // I'm more interested in the address of the target then + // the instruction located there. + //t = target.getInstruction().toString(false); // Avoid circles + t = "" + target.getPosition(); } } } else { if (target != null) { - index = getTargetOffset(); - t = "" + (index + position); + index = target.getPosition(); + // index = getTargetOffset(); crashes if positions haven't been set + // t = "" + (index + position); + t = "" + index; } } return s + " -> " + t; diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java index f10fd250..06281759 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java @@ -191,7 +191,7 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { } - static String printFlags( int flags, int reason ) { + public static String printFlags( int flags, int reason ) { if (flags == 0) { return "0"; } @@ -205,9 +205,10 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { } else if ((pow == Constants.ACC_TRANSIENT) && (reason == FLAG_FOR_METHOD)) { buf.append("ACC_VARARGS | "); } else { - buf.append("ACC_") - .append(Constants.ACCESS_NAMES[i].toUpperCase(Locale.ENGLISH)).append( - " | "); + if (i < Constants.ACCESS_NAMES.length) + buf.append("ACC_").append(Constants.ACCESS_NAMES[i].toUpperCase(Locale.ENGLISH)).append( " | "); + else + buf.append(String.format ("ACC_BIT %x | ", pow)); } } pow <<= 1; -- GitLab From cf39e4cd745289a2adac23354ed4c1b1d82b4c26 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 21:54:22 +0000 Subject: [PATCH 0858/1313] BCEL-197 Fix typo git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695785 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/classfile/Utility.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java index 7e1f9fe5..99105680 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java @@ -861,10 +861,10 @@ public abstract class Utility { // check for wildcards if (signature.charAt(consumed_chars) == '+') { type = type + "? extends "; - consumed_chars = ++consumed_chars; + consumed_chars++; } else if (signature.charAt(consumed_chars) == '-') { type = type + "? super "; - consumed_chars = ++consumed_chars; + consumed_chars++; } else if (signature.charAt(consumed_chars) == '*') { // must be at end of signature if (signature.charAt(consumed_chars + 1) != '>') { -- GitLab From 70e89e04d355ec40217cd08c9cdb4d9322a5c460 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 13 Aug 2015 21:58:00 +0000 Subject: [PATCH 0859/1313] Add missing '@Override' annotations to implementations of interface methods (requires Java 6, but we are now on 7, so all it good). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695786 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/classfile/AnnotationEntry.java | 1 + .../commons/bcel6/classfile/Attribute.java | 1 + .../bcel6/classfile/CodeException.java | 1 + .../commons/bcel6/classfile/Constant.java | 3 + .../bcel6/classfile/ConstantClass.java | 1 + .../bcel6/classfile/ConstantDouble.java | 1 + .../bcel6/classfile/ConstantFloat.java | 1 + .../bcel6/classfile/ConstantInteger.java | 1 + .../commons/bcel6/classfile/ConstantLong.java | 1 + .../commons/bcel6/classfile/ConstantPool.java | 1 + .../bcel6/classfile/ConstantString.java | 1 + .../bcel6/classfile/DescendingVisitor.java | 43 +++++ .../commons/bcel6/classfile/EmptyVisitor.java | 43 +++++ .../apache/commons/bcel6/classfile/Field.java | 3 + .../commons/bcel6/classfile/InnerClass.java | 1 + .../commons/bcel6/classfile/JavaClass.java | 4 + .../commons/bcel6/classfile/LineNumber.java | 1 + .../bcel6/classfile/LocalVariable.java | 1 + .../commons/bcel6/classfile/Method.java | 3 + .../classfile/ParameterAnnotationEntry.java | 1 + .../commons/bcel6/generic/ACONST_NULL.java | 1 + .../commons/bcel6/generic/ANEWARRAY.java | 2 + .../commons/bcel6/generic/ARRAYLENGTH.java | 1 + .../apache/commons/bcel6/generic/ATHROW.java | 1 + .../bcel6/generic/ArithmeticInstruction.java | 1 + .../bcel6/generic/ArrayInstruction.java | 2 + .../apache/commons/bcel6/generic/BIPUSH.java | 2 + .../bcel6/generic/BranchInstruction.java | 2 + .../commons/bcel6/generic/CHECKCAST.java | 2 + .../commons/bcel6/generic/CPInstruction.java | 3 + .../commons/bcel6/generic/ClassGen.java | 2 + .../bcel6/generic/CodeExceptionGen.java | 2 + .../bcel6/generic/ConversionInstruction.java | 1 + .../apache/commons/bcel6/generic/DCMPG.java | 1 + .../apache/commons/bcel6/generic/DCMPL.java | 1 + .../apache/commons/bcel6/generic/DCONST.java | 2 + .../commons/bcel6/generic/EmptyVisitor.java | 181 ++++++++++++++++++ .../apache/commons/bcel6/generic/FCMPG.java | 1 + .../apache/commons/bcel6/generic/FCMPL.java | 1 + .../apache/commons/bcel6/generic/FCONST.java | 2 + .../commons/bcel6/generic/FieldGen.java | 2 + .../bcel6/generic/FieldGenOrMethodGen.java | 4 + .../commons/bcel6/generic/FieldOrMethod.java | 1 + .../commons/bcel6/generic/GETFIELD.java | 1 + .../commons/bcel6/generic/GETSTATIC.java | 1 + .../apache/commons/bcel6/generic/ICONST.java | 2 + .../apache/commons/bcel6/generic/IDIV.java | 1 + .../commons/bcel6/generic/INSTANCEOF.java | 2 + .../commons/bcel6/generic/INVOKEDYNAMIC.java | 1 + .../bcel6/generic/INVOKEINTERFACE.java | 1 + .../commons/bcel6/generic/INVOKESPECIAL.java | 1 + .../commons/bcel6/generic/INVOKESTATIC.java | 1 + .../commons/bcel6/generic/INVOKEVIRTUAL.java | 1 + .../apache/commons/bcel6/generic/IREM.java | 1 + .../bcel6/generic/InstructionComparator.java | 1 + .../bcel6/generic/InstructionList.java | 3 + .../commons/bcel6/generic/JsrInstruction.java | 1 + .../apache/commons/bcel6/generic/LCMP.java | 1 + .../apache/commons/bcel6/generic/LCONST.java | 2 + .../org/apache/commons/bcel6/generic/LDC.java | 1 + .../apache/commons/bcel6/generic/LDIV.java | 1 + .../apache/commons/bcel6/generic/LREM.java | 1 + .../commons/bcel6/generic/LineNumberGen.java | 2 + .../bcel6/generic/LocalVariableGen.java | 6 + .../generic/LocalVariableInstruction.java | 3 + .../commons/bcel6/generic/MONITORENTER.java | 1 + .../commons/bcel6/generic/MONITOREXIT.java | 1 + .../commons/bcel6/generic/MULTIANEWARRAY.java | 2 + .../commons/bcel6/generic/MethodGen.java | 3 + .../org/apache/commons/bcel6/generic/NEW.java | 2 + .../commons/bcel6/generic/NEWARRAY.java | 1 + .../apache/commons/bcel6/generic/PUSH.java | 1 + .../commons/bcel6/generic/PUTFIELD.java | 1 + .../commons/bcel6/generic/PUTSTATIC.java | 1 + .../org/apache/commons/bcel6/generic/RET.java | 3 + .../bcel6/generic/ReturnInstruction.java | 2 + .../apache/commons/bcel6/generic/SIPUSH.java | 2 + .../apache/commons/bcel6/generic/SWITCH.java | 1 + .../bcel6/util/ClassLoaderRepository.java | 7 + .../apache/commons/bcel6/util/ClassPath.java | 11 ++ .../bcel6/util/SyntheticRepository.java | 7 + .../bcel6/verifier/TransitiveHull.java | 1 + .../bcel6/verifier/VerifierAppFrame.java | 6 + .../verifier/VerifierFactoryListModel.java | 5 + .../commons/bcel6/verifier/VerifyDialog.java | 1 + .../structurals/ControlFlowGraph.java | 8 + .../verifier/structurals/Subroutines.java | 7 + .../apache/commons/bcel6/BCELBenchmark.java | 1 + .../apache/commons/bcel6/PerformanceTest.java | 1 + .../bcel6/data/AnonymousClassTest.java | 1 + .../bcel6/data/AttributeTestClassEM02.java | 1 + .../bcel6/visitors/CounterVisitor.java | 43 +++++ 92 files changed, 487 insertions(+) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java index ad827ec6..c73cf7cc 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java @@ -88,6 +88,7 @@ public class AnnotationEntry implements Node, Serializable { * * @param v Visitor object */ + @Override public void accept(Visitor v) { v.visitAnnotationEntry(this); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index 7b8480cc..ae68f024 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -76,6 +76,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable * @param v * Visitor object */ + @Override public abstract void accept(Visitor v); /** diff --git a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java index 8db6ad4a..53dfb565 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java @@ -90,6 +90,7 @@ public final class CodeException implements Cloneable, Node, Serializable { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitCodeException(this); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java index c997635d..f69b026f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java @@ -37,6 +37,7 @@ public abstract class Constant implements Cloneable, Node, Serializable { private static final long serialVersionUID = 5739037344085356353L; private static BCELComparator _cmp = new BCELComparator() { + @Override public boolean equals( Object o1, Object o2 ) { Constant THIS = (Constant) o1; Constant THAT = (Constant) o2; @@ -44,6 +45,7 @@ public abstract class Constant implements Cloneable, Node, Serializable { } + @Override public int hashCode( Object o ) { Constant THIS = (Constant) o; return THIS.toString().hashCode(); @@ -72,6 +74,7 @@ public abstract class Constant implements Cloneable, Node, Serializable { * * @param v Visitor object */ + @Override public abstract void accept( Visitor v ); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java index 517c0109..559e8906 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java @@ -102,6 +102,7 @@ public final class ConstantClass extends Constant implements ConstantObject { /** @return String object */ + @Override public Object getConstantValue( ConstantPool cp ) { Constant c = cp.getConstant(name_index, Constants.CONSTANT_Utf8); return ((ConstantUtf8) c).getBytes(); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java index 1c3ab9c8..bf6f7e27 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java @@ -110,6 +110,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { /** @return Double object */ + @Override public Object getConstantValue( ConstantPool cp ) { return new Double(bytes); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java index 6b40dc5c..32607977 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java @@ -111,6 +111,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { /** @return Float object */ + @Override public Object getConstantValue( ConstantPool cp ) { return new Float(bytes); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java index a64b70b0..6a019557 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java @@ -110,6 +110,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { /** @return Integer object */ + @Override public Object getConstantValue( ConstantPool cp ) { return Integer.valueOf(bytes); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java index 565e9396..f04875f8 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java @@ -110,6 +110,7 @@ public final class ConstantLong extends Constant implements ConstantObject { /** @return Long object */ + @Override public Object getConstantValue( ConstantPool cp ) { return Long.valueOf(bytes); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java index ff30cc92..e7079fcd 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java @@ -88,6 +88,7 @@ public class ConstantPool implements Cloneable, Node, Serializable { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitConstantPool(this); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java index 05aba2a5..417cbc13 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java @@ -110,6 +110,7 @@ public final class ConstantString extends Constant implements ConstantObject { /** @return String object */ + @Override public Object getConstantValue( ConstantPool cp ) { Constant c = cp.getConstant(string_index, Constants.CONSTANT_Utf8); return ((ConstantUtf8) c).getBytes(); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java index 3302a8fa..a2bd0772 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java @@ -85,6 +85,7 @@ public class DescendingVisitor implements Visitor clazz.accept(this); } + @Override public void visitJavaClass(JavaClass _clazz) { stack.push(_clazz); @@ -105,6 +106,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitAnnotation(Annotations annotation) { stack.push(annotation); @@ -116,6 +118,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitAnnotationEntry(AnnotationEntry annotationEntry) { stack.push(annotationEntry); @@ -123,6 +126,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitField(Field field) { stack.push(field); @@ -134,6 +138,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantValue(ConstantValue cv) { stack.push(cv); @@ -141,6 +146,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitMethod(Method method) { stack.push(method); @@ -152,6 +158,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitExceptionTable(ExceptionTable table) { stack.push(table); @@ -159,6 +166,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitCode(Code code) { stack.push(code); @@ -174,6 +182,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitCodeException(CodeException ce) { stack.push(ce); @@ -181,6 +190,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitLineNumberTable(LineNumberTable table) { stack.push(table); @@ -192,6 +202,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitLineNumber(LineNumber number) { stack.push(number); @@ -199,6 +210,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitLocalVariableTable(LocalVariableTable table) { stack.push(table); @@ -210,6 +222,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitStackMap(StackMap table) { stack.push(table); @@ -221,6 +234,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitStackMapEntry(StackMapEntry var) { stack.push(var); @@ -228,6 +242,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitStackMapTable(StackMapTable table) { stack.push(table); @@ -239,6 +254,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitStackMapTableEntry(StackMapTableEntry var) { stack.push(var); @@ -246,6 +262,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitLocalVariable(LocalVariable var) { stack.push(var); @@ -253,6 +270,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantPool(ConstantPool cp) { stack.push(cp); @@ -268,6 +286,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantClass(ConstantClass constant) { stack.push(constant); @@ -275,6 +294,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantDouble(ConstantDouble constant) { stack.push(constant); @@ -282,6 +302,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantFieldref(ConstantFieldref constant) { stack.push(constant); @@ -289,6 +310,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantFloat(ConstantFloat constant) { stack.push(constant); @@ -296,6 +318,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantInteger(ConstantInteger constant) { stack.push(constant); @@ -303,6 +326,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantInterfaceMethodref( ConstantInterfaceMethodref constant) { @@ -311,6 +335,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantInvokeDynamic( ConstantInvokeDynamic constant) { @@ -319,6 +344,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantLong(ConstantLong constant) { stack.push(constant); @@ -326,6 +352,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantMethodref(ConstantMethodref constant) { stack.push(constant); @@ -333,6 +360,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantNameAndType(ConstantNameAndType constant) { stack.push(constant); @@ -340,6 +368,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantString(ConstantString constant) { stack.push(constant); @@ -347,6 +376,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitConstantUtf8(ConstantUtf8 constant) { stack.push(constant); @@ -354,6 +384,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitInnerClasses(InnerClasses ic) { stack.push(ic); @@ -365,6 +396,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitInnerClass(InnerClass inner) { stack.push(inner); @@ -372,6 +404,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitBootstrapMethods(BootstrapMethods bm) { stack.push(bm); @@ -384,6 +417,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitDeprecated(Deprecated attribute) { stack.push(attribute); @@ -391,6 +425,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitSignature(Signature attribute) { stack.push(attribute); @@ -398,6 +433,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitSourceFile(SourceFile attribute) { stack.push(attribute); @@ -405,6 +441,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitSynthetic(Synthetic attribute) { stack.push(attribute); @@ -412,6 +449,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitUnknown(Unknown attribute) { stack.push(attribute); @@ -419,6 +457,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitAnnotationDefault(AnnotationDefault obj) { stack.push(obj); @@ -426,6 +465,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitEnclosingMethod(EnclosingMethod obj) { stack.push(obj); @@ -433,6 +473,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) { stack.push(obj); @@ -440,6 +481,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitParameterAnnotation(ParameterAnnotations obj) { stack.push(obj); @@ -447,6 +489,7 @@ public class DescendingVisitor implements Visitor stack.pop(); } + @Override public void visitMethodParameters(MethodParameters obj) { stack.push(obj); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java b/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java index c626d818..f44431fd 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java @@ -33,6 +33,7 @@ public class EmptyVisitor implements Visitor /** * @since 6.0 */ + @Override public void visitAnnotation(Annotations obj) { } @@ -40,6 +41,7 @@ public class EmptyVisitor implements Visitor /** * @since 6.0 */ + @Override public void visitParameterAnnotation(ParameterAnnotations obj) { } @@ -47,6 +49,7 @@ public class EmptyVisitor implements Visitor /** * @since 6.0 */ + @Override public void visitAnnotationEntry(AnnotationEntry obj) { } @@ -54,90 +57,112 @@ public class EmptyVisitor implements Visitor /** * @since 6.0 */ + @Override public void visitAnnotationDefault(AnnotationDefault obj) { } + @Override public void visitCode(Code obj) { } + @Override public void visitCodeException(CodeException obj) { } + @Override public void visitConstantClass(ConstantClass obj) { } + @Override public void visitConstantDouble(ConstantDouble obj) { } + @Override public void visitConstantFieldref(ConstantFieldref obj) { } + @Override public void visitConstantFloat(ConstantFloat obj) { } + @Override public void visitConstantInteger(ConstantInteger obj) { } + @Override public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) { } + @Override public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj) { } + @Override public void visitConstantLong(ConstantLong obj) { } + @Override public void visitConstantMethodref(ConstantMethodref obj) { } + @Override public void visitConstantNameAndType(ConstantNameAndType obj) { } + @Override public void visitConstantPool(ConstantPool obj) { } + @Override public void visitConstantString(ConstantString obj) { } + @Override public void visitConstantUtf8(ConstantUtf8 obj) { } + @Override public void visitConstantValue(ConstantValue obj) { } + @Override public void visitDeprecated(Deprecated obj) { } + @Override public void visitExceptionTable(ExceptionTable obj) { } + @Override public void visitField(Field obj) { } + @Override public void visitInnerClass(InnerClass obj) { } + @Override public void visitInnerClasses(InnerClasses obj) { } @@ -145,54 +170,67 @@ public class EmptyVisitor implements Visitor /** * @since 6.0 */ + @Override public void visitBootstrapMethods(BootstrapMethods obj) { } + @Override public void visitJavaClass(JavaClass obj) { } + @Override public void visitLineNumber(LineNumber obj) { } + @Override public void visitLineNumberTable(LineNumberTable obj) { } + @Override public void visitLocalVariable(LocalVariable obj) { } + @Override public void visitLocalVariableTable(LocalVariableTable obj) { } + @Override public void visitMethod(Method obj) { } + @Override public void visitSignature(Signature obj) { } + @Override public void visitSourceFile(SourceFile obj) { } + @Override public void visitSynthetic(Synthetic obj) { } + @Override public void visitUnknown(Unknown obj) { } + @Override public void visitStackMap(StackMap obj) { } + @Override public void visitStackMapEntry(StackMapEntry obj) { } @@ -200,6 +238,7 @@ public class EmptyVisitor implements Visitor /** * @since 6.0 */ + @Override public void visitStackMapTable(StackMapTable obj) { } @@ -207,6 +246,7 @@ public class EmptyVisitor implements Visitor /** * @since 6.0 */ + @Override public void visitStackMapTableEntry(StackMapTableEntry obj) { } @@ -214,6 +254,7 @@ public class EmptyVisitor implements Visitor /** * @since 6.0 */ + @Override public void visitEnclosingMethod(EnclosingMethod obj) { } @@ -221,6 +262,7 @@ public class EmptyVisitor implements Visitor /** * @since 6.0 */ + @Override public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) { } @@ -228,6 +270,7 @@ public class EmptyVisitor implements Visitor /** * @since 6.0 */ + @Override public void visitMethodParameters(MethodParameters obj) { } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Field.java b/src/main/java/org/apache/commons/bcel6/classfile/Field.java index 2e15226e..b1533f25 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Field.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Field.java @@ -35,6 +35,7 @@ public final class Field extends FieldOrMethod { private static final long serialVersionUID = -4604082205545049134L; private static final BCELComparator _cmp = new BCELComparator() { + @Override public boolean equals( Object o1, Object o2 ) { Field THIS = (Field) o1; Field THAT = (Field) o2; @@ -43,6 +44,7 @@ public final class Field extends FieldOrMethod { } + @Override public int hashCode( Object o ) { Field THIS = (Field) o; return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); @@ -89,6 +91,7 @@ public final class Field extends FieldOrMethod { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitField(this); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java index b6b06bc1..790409d6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java @@ -83,6 +83,7 @@ public final class InnerClass implements Cloneable, Node, Serializable { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitInnerClass(this); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 3d86752c..1e500ac2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -76,6 +76,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl private static final BCELComparator _cmp = new BCELComparator() { // TODO could be final (setter unused) + @Override public boolean equals( Object o1, Object o2 ) { JavaClass THIS = (JavaClass) o1; JavaClass THAT = (JavaClass) o2; @@ -83,6 +84,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl } + @Override public int hashCode( Object o ) { JavaClass THIS = (JavaClass) o; return THIS.getClassName().hashCode(); @@ -207,6 +209,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitJavaClass(this); } @@ -787,6 +790,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * Return the natural ordering of two JavaClasses. * This ordering is based on the class name */ + @Override public int compareTo( JavaClass obj ) { return getClassName().compareTo(obj.getClassName()); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java index afb743a3..e76c2da2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java @@ -78,6 +78,7 @@ public final class LineNumber implements Cloneable, Node, Serializable { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitLineNumber(this); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java index 78e96376..43bb77f4 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java @@ -91,6 +91,7 @@ public final class LocalVariable implements Cloneable, Node, Serializable { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitLocalVariable(this); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Method.java b/src/main/java/org/apache/commons/bcel6/classfile/Method.java index f3d98dff..4255395e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Method.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Method.java @@ -36,6 +36,7 @@ public final class Method extends FieldOrMethod { private static final long serialVersionUID = -2013983967283787941L; private static BCELComparator _cmp = new BCELComparator() { + @Override public boolean equals( Object o1, Object o2 ) { Method THIS = (Method) o1; Method THAT = (Method) o2; @@ -44,6 +45,7 @@ public final class Method extends FieldOrMethod { } + @Override public int hashCode( Object o ) { Method THIS = (Method) o; return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); @@ -102,6 +104,7 @@ public final class Method extends FieldOrMethod { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitMethod(this); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java index c53772be..32dad891 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java @@ -58,6 +58,7 @@ public class ParameterAnnotationEntry implements Node { * * @param v Visitor object */ + @Override public void accept( Visitor v ) { // v.visitParameterAnnotationEntry(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java b/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java index a812a1b7..dae89949 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java @@ -38,6 +38,7 @@ public class ACONST_NULL extends Instruction implements PushInstruction, TypedIn /** @return Type.NULL */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.NULL; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java index d54590d0..d9cef45b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java @@ -44,6 +44,7 @@ public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationIns } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_CLASS_AND_INTERFACE_RESOLUTION, ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION); @@ -70,6 +71,7 @@ public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationIns } + @Override public ObjectType getLoadClassType( ConstantPoolGen cpg ) { Type t = getType(cpg); if (t instanceof ArrayType) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java b/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java index be75944c..532d8d5d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java @@ -37,6 +37,7 @@ public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackP /** @return exceptions this instruction may cause */ + @Override public Class[] getExceptions() { return new Class[] { org.apache.commons.bcel6.ExceptionConstants.NULL_POINTER_EXCEPTION diff --git a/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java b/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java index 3da92a2c..e99826a8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java @@ -38,6 +38,7 @@ public class ATHROW extends Instruction implements UnconditionalBranch, Exceptio /** @return exceptions this instruction may cause */ + @Override public Class[] getExceptions() { return new Class[] { org.apache.commons.bcel6.ExceptionConstants.THROWABLE diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java index 1ff67e00..1227d88e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java @@ -48,6 +48,7 @@ public abstract class ArithmeticInstruction extends Instruction implements Typed /** @return type associated with the instruction */ + @Override public Type getType( ConstantPoolGen cp ) { switch (opcode) { case Constants.DADD: diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java index 3f36cc7a..b3dbbf89 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java @@ -46,6 +46,7 @@ public abstract class ArrayInstruction extends Instruction implements ExceptionT } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_ARRAY_EXCEPTION); } @@ -53,6 +54,7 @@ public abstract class ArrayInstruction extends Instruction implements ExceptionT /** @return type associated with the instruction */ + @Override public Type getType( ConstantPoolGen cp ) { switch (opcode) { case org.apache.commons.bcel6.Constants.IALOAD: diff --git a/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java b/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java index f768b5c1..5ac1633b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java @@ -80,6 +80,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { } + @Override public Number getValue() { return Integer.valueOf(b); } @@ -87,6 +88,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { /** @return Type.BYTE */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.BYTE; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java index 4d0f64cc..25c57cd3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java @@ -212,6 +212,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @param old_ih old target * @param new_ih new target */ + @Override public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { if (target == old_ih) { setTarget(new_ih); @@ -224,6 +225,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi /** * @return true, if ih is target of this instruction */ + @Override public boolean containsTarget( InstructionHandle ih ) { return (target == ih); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java b/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java index 364cebe0..5d43fbd1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java @@ -49,12 +49,14 @@ public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThro /** @return exceptions this instruction may cause */ + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_CLASS_AND_INTERFACE_RESOLUTION, ExceptionConstants.CLASS_CAST_EXCEPTION); } + @Override public ObjectType getLoadClassType( ConstantPoolGen cpg ) { Type t = getType(cpg); if (t instanceof ArrayType) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java index 5872d21a..cf12ed96 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java @@ -115,6 +115,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct /** * @return index in constant pool referred by this instruction. */ + @Override public final int getIndex() { return index; } @@ -124,6 +125,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct * Set the index to constant pool. * @param index in constant pool. */ + @Override public void setIndex( int index ) { // TODO could be package-protected? if (index < 0) { throw new ClassGenException("Negative index value: " + index); @@ -134,6 +136,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct /** @return type related with this instruction. */ + @Override public Type getType( ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); String name = cp.getConstantString(index, org.apache.commons.bcel6.Constants.CONSTANT_Class); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index 3423af0d..787c5705 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -60,6 +60,7 @@ public class ClassGen extends AccessFlags implements Cloneable { private static BCELComparator _cmp = new BCELComparator() { + @Override public boolean equals( Object o1, Object o2 ) { ClassGen THIS = (ClassGen) o1; ClassGen THAT = (ClassGen) o2; @@ -67,6 +68,7 @@ public class ClassGen extends AccessFlags implements Cloneable { } + @Override public int hashCode( Object o ) { ClassGen THIS = (ClassGen) o; return THIS.getClassName().hashCode(); diff --git a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java index 6b78e2c9..779c51dd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java @@ -107,6 +107,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable, j * @param old_ih old target, either start or end * @param new_ih new target */ + @Override public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { boolean targeted = false; if (start_pc == old_ih) { @@ -131,6 +132,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable, j /** * @return true, if ih is target of this handler */ + @Override public boolean containsTarget( InstructionHandle ih ) { return (start_pc == ih) || (end_pc == ih) || (handler_pc == ih); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java index 458bcd71..1a603422 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java @@ -48,6 +48,7 @@ public abstract class ConversionInstruction extends Instruction implements Typed /** @return type associated with the instruction */ + @Override public Type getType( ConstantPoolGen cp ) { switch (opcode) { case Constants.D2I: diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java b/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java index 20ff6cff..63690619 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java @@ -33,6 +33,7 @@ public class DCMPG extends Instruction implements TypedInstruction, StackProduce /** @return Type.DOUBLE */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.DOUBLE; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java b/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java index 448cbdfa..8869b441 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java @@ -33,6 +33,7 @@ public class DCMPL extends Instruction implements TypedInstruction, StackProduce /** @return Type.DOUBLE */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.DOUBLE; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCONST.java b/src/main/java/org/apache/commons/bcel6/generic/DCONST.java index 5563381c..6ecd66d5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCONST.java @@ -51,6 +51,7 @@ public class DCONST extends Instruction implements ConstantPushInstruction { } + @Override public Number getValue() { return new Double(value); } @@ -58,6 +59,7 @@ public class DCONST extends Instruction implements ConstantPushInstruction { /** @return Type.DOUBLE */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.DOUBLE; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java b/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java index 5c828c3e..7b58f4d2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java @@ -24,728 +24,909 @@ package org.apache.commons.bcel6.generic; */ public abstract class EmptyVisitor implements Visitor { + @Override public void visitStackInstruction( StackInstruction obj ) { } + @Override public void visitLocalVariableInstruction( LocalVariableInstruction obj ) { } + @Override public void visitBranchInstruction( BranchInstruction obj ) { } + @Override public void visitLoadClass( LoadClass obj ) { } + @Override public void visitFieldInstruction( FieldInstruction obj ) { } + @Override public void visitIfInstruction( IfInstruction obj ) { } + @Override public void visitConversionInstruction( ConversionInstruction obj ) { } + @Override public void visitPopInstruction( PopInstruction obj ) { } + @Override public void visitJsrInstruction( JsrInstruction obj ) { } + @Override public void visitGotoInstruction( GotoInstruction obj ) { } + @Override public void visitStoreInstruction( StoreInstruction obj ) { } + @Override public void visitTypedInstruction( TypedInstruction obj ) { } + @Override public void visitSelect( Select obj ) { } + @Override public void visitUnconditionalBranch( UnconditionalBranch obj ) { } + @Override public void visitPushInstruction( PushInstruction obj ) { } + @Override public void visitArithmeticInstruction( ArithmeticInstruction obj ) { } + @Override public void visitCPInstruction( CPInstruction obj ) { } + @Override public void visitInvokeInstruction( InvokeInstruction obj ) { } + @Override public void visitArrayInstruction( ArrayInstruction obj ) { } + @Override public void visitAllocationInstruction( AllocationInstruction obj ) { } + @Override public void visitReturnInstruction( ReturnInstruction obj ) { } + @Override public void visitFieldOrMethod( FieldOrMethod obj ) { } + @Override public void visitConstantPushInstruction( ConstantPushInstruction obj ) { } + @Override public void visitExceptionThrower( ExceptionThrower obj ) { } + @Override public void visitLoadInstruction( LoadInstruction obj ) { } + @Override public void visitVariableLengthInstruction( VariableLengthInstruction obj ) { } + @Override public void visitStackProducer( StackProducer obj ) { } + @Override public void visitStackConsumer( StackConsumer obj ) { } + @Override public void visitACONST_NULL( ACONST_NULL obj ) { } + @Override public void visitGETSTATIC( GETSTATIC obj ) { } + @Override public void visitIF_ICMPLT( IF_ICMPLT obj ) { } + @Override public void visitMONITOREXIT( MONITOREXIT obj ) { } + @Override public void visitIFLT( IFLT obj ) { } + @Override public void visitLSTORE( LSTORE obj ) { } + @Override public void visitPOP2( POP2 obj ) { } + @Override public void visitBASTORE( BASTORE obj ) { } + @Override public void visitISTORE( ISTORE obj ) { } + @Override public void visitCHECKCAST( CHECKCAST obj ) { } + @Override public void visitFCMPG( FCMPG obj ) { } + @Override public void visitI2F( I2F obj ) { } + @Override public void visitATHROW( ATHROW obj ) { } + @Override public void visitDCMPL( DCMPL obj ) { } + @Override public void visitARRAYLENGTH( ARRAYLENGTH obj ) { } + @Override public void visitDUP( DUP obj ) { } + @Override public void visitINVOKESTATIC( INVOKESTATIC obj ) { } + @Override public void visitLCONST( LCONST obj ) { } + @Override public void visitDREM( DREM obj ) { } + @Override public void visitIFGE( IFGE obj ) { } + @Override public void visitCALOAD( CALOAD obj ) { } + @Override public void visitLASTORE( LASTORE obj ) { } + @Override public void visitI2D( I2D obj ) { } + @Override public void visitDADD( DADD obj ) { } + @Override public void visitINVOKESPECIAL( INVOKESPECIAL obj ) { } + @Override public void visitIAND( IAND obj ) { } + @Override public void visitPUTFIELD( PUTFIELD obj ) { } + @Override public void visitILOAD( ILOAD obj ) { } + @Override public void visitDLOAD( DLOAD obj ) { } + @Override public void visitDCONST( DCONST obj ) { } + @Override public void visitNEW( NEW obj ) { } + @Override public void visitIFNULL( IFNULL obj ) { } + @Override public void visitLSUB( LSUB obj ) { } + @Override public void visitL2I( L2I obj ) { } + @Override public void visitISHR( ISHR obj ) { } + @Override public void visitTABLESWITCH( TABLESWITCH obj ) { } + @Override public void visitIINC( IINC obj ) { } + @Override public void visitDRETURN( DRETURN obj ) { } + @Override public void visitFSTORE( FSTORE obj ) { } + @Override public void visitDASTORE( DASTORE obj ) { } + @Override public void visitIALOAD( IALOAD obj ) { } + @Override public void visitDDIV( DDIV obj ) { } + @Override public void visitIF_ICMPGE( IF_ICMPGE obj ) { } + @Override public void visitLAND( LAND obj ) { } + @Override public void visitIDIV( IDIV obj ) { } + @Override public void visitLOR( LOR obj ) { } + @Override public void visitCASTORE( CASTORE obj ) { } + @Override public void visitFREM( FREM obj ) { } + @Override public void visitLDC( LDC obj ) { } + @Override public void visitBIPUSH( BIPUSH obj ) { } + @Override public void visitDSTORE( DSTORE obj ) { } + @Override public void visitF2L( F2L obj ) { } + @Override public void visitFMUL( FMUL obj ) { } + @Override public void visitLLOAD( LLOAD obj ) { } + @Override public void visitJSR( JSR obj ) { } + @Override public void visitFSUB( FSUB obj ) { } + @Override public void visitSASTORE( SASTORE obj ) { } + @Override public void visitALOAD( ALOAD obj ) { } + @Override public void visitDUP2_X2( DUP2_X2 obj ) { } + @Override public void visitRETURN( RETURN obj ) { } + @Override public void visitDALOAD( DALOAD obj ) { } + @Override public void visitSIPUSH( SIPUSH obj ) { } + @Override public void visitDSUB( DSUB obj ) { } + @Override public void visitL2F( L2F obj ) { } + @Override public void visitIF_ICMPGT( IF_ICMPGT obj ) { } + @Override public void visitF2D( F2D obj ) { } + @Override public void visitI2L( I2L obj ) { } + @Override public void visitIF_ACMPNE( IF_ACMPNE obj ) { } + @Override public void visitPOP( POP obj ) { } + @Override public void visitI2S( I2S obj ) { } + @Override public void visitIFEQ( IFEQ obj ) { } + @Override public void visitSWAP( SWAP obj ) { } + @Override public void visitIOR( IOR obj ) { } + @Override public void visitIREM( IREM obj ) { } + @Override public void visitIASTORE( IASTORE obj ) { } + @Override public void visitNEWARRAY( NEWARRAY obj ) { } + @Override public void visitINVOKEINTERFACE( INVOKEINTERFACE obj ) { } + @Override public void visitINEG( INEG obj ) { } + @Override public void visitLCMP( LCMP obj ) { } + @Override public void visitJSR_W( JSR_W obj ) { } + @Override public void visitMULTIANEWARRAY( MULTIANEWARRAY obj ) { } + @Override public void visitDUP_X2( DUP_X2 obj ) { } + @Override public void visitSALOAD( SALOAD obj ) { } + @Override public void visitIFNONNULL( IFNONNULL obj ) { } + @Override public void visitDMUL( DMUL obj ) { } + @Override public void visitIFNE( IFNE obj ) { } + @Override public void visitIF_ICMPLE( IF_ICMPLE obj ) { } + @Override public void visitLDC2_W( LDC2_W obj ) { } + @Override public void visitGETFIELD( GETFIELD obj ) { } + @Override public void visitLADD( LADD obj ) { } + @Override public void visitNOP( NOP obj ) { } + @Override public void visitFALOAD( FALOAD obj ) { } + @Override public void visitINSTANCEOF( INSTANCEOF obj ) { } + @Override public void visitIFLE( IFLE obj ) { } + @Override public void visitLXOR( LXOR obj ) { } + @Override public void visitLRETURN( LRETURN obj ) { } + @Override public void visitFCONST( FCONST obj ) { } + @Override public void visitIUSHR( IUSHR obj ) { } + @Override public void visitBALOAD( BALOAD obj ) { } + @Override public void visitDUP2( DUP2 obj ) { } + @Override public void visitIF_ACMPEQ( IF_ACMPEQ obj ) { } + @Override public void visitIMPDEP1( IMPDEP1 obj ) { } + @Override public void visitMONITORENTER( MONITORENTER obj ) { } + @Override public void visitLSHL( LSHL obj ) { } + @Override public void visitDCMPG( DCMPG obj ) { } + @Override public void visitD2L( D2L obj ) { } + @Override public void visitIMPDEP2( IMPDEP2 obj ) { } + @Override public void visitL2D( L2D obj ) { } + @Override public void visitRET( RET obj ) { } + @Override public void visitIFGT( IFGT obj ) { } + @Override public void visitIXOR( IXOR obj ) { } + @Override public void visitINVOKEVIRTUAL( INVOKEVIRTUAL obj ) { } + @Override public void visitFASTORE( FASTORE obj ) { } + @Override public void visitIRETURN( IRETURN obj ) { } + @Override public void visitIF_ICMPNE( IF_ICMPNE obj ) { } + @Override public void visitFLOAD( FLOAD obj ) { } + @Override public void visitLDIV( LDIV obj ) { } + @Override public void visitPUTSTATIC( PUTSTATIC obj ) { } + @Override public void visitAALOAD( AALOAD obj ) { } + @Override public void visitD2I( D2I obj ) { } + @Override public void visitIF_ICMPEQ( IF_ICMPEQ obj ) { } + @Override public void visitAASTORE( AASTORE obj ) { } + @Override public void visitARETURN( ARETURN obj ) { } + @Override public void visitDUP2_X1( DUP2_X1 obj ) { } + @Override public void visitFNEG( FNEG obj ) { } + @Override public void visitGOTO_W( GOTO_W obj ) { } + @Override public void visitD2F( D2F obj ) { } + @Override public void visitGOTO( GOTO obj ) { } + @Override public void visitISUB( ISUB obj ) { } + @Override public void visitF2I( F2I obj ) { } + @Override public void visitDNEG( DNEG obj ) { } + @Override public void visitICONST( ICONST obj ) { } + @Override public void visitFDIV( FDIV obj ) { } + @Override public void visitI2B( I2B obj ) { } + @Override public void visitLNEG( LNEG obj ) { } + @Override public void visitLREM( LREM obj ) { } + @Override public void visitIMUL( IMUL obj ) { } + @Override public void visitIADD( IADD obj ) { } + @Override public void visitLSHR( LSHR obj ) { } + @Override public void visitLOOKUPSWITCH( LOOKUPSWITCH obj ) { } + @Override public void visitDUP_X1( DUP_X1 obj ) { } + @Override public void visitFCMPL( FCMPL obj ) { } + @Override public void visitI2C( I2C obj ) { } + @Override public void visitLMUL( LMUL obj ) { } + @Override public void visitLUSHR( LUSHR obj ) { } + @Override public void visitISHL( ISHL obj ) { } + @Override public void visitLALOAD( LALOAD obj ) { } + @Override public void visitASTORE( ASTORE obj ) { } + @Override public void visitANEWARRAY( ANEWARRAY obj ) { } + @Override public void visitFRETURN( FRETURN obj ) { } + @Override public void visitFADD( FADD obj ) { } + @Override public void visitBREAKPOINT( BREAKPOINT obj ) { } /** * @since 6.0 */ + @Override public void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj) { } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java b/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java index 5adffa3d..423a3a2f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java @@ -35,6 +35,7 @@ public class FCMPG extends Instruction implements TypedInstruction, StackProduce /** @return Type.FLOAT */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.FLOAT; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java b/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java index 1d046076..e45e5bd7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java @@ -35,6 +35,7 @@ public class FCMPL extends Instruction implements TypedInstruction, StackProduce /** @return Type.FLOAT */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.FLOAT; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCONST.java b/src/main/java/org/apache/commons/bcel6/generic/FCONST.java index 1c9067c3..6d055079 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCONST.java @@ -53,6 +53,7 @@ public class FCONST extends Instruction implements ConstantPushInstruction { } + @Override public Number getValue() { return new Float(value); } @@ -60,6 +61,7 @@ public class FCONST extends Instruction implements ConstantPushInstruction { /** @return Type.FLOAT */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.FLOAT; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index cdaf8336..77056a65 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -46,6 +46,7 @@ public class FieldGen extends FieldGenOrMethodGen { private Object value = null; private static BCELComparator _cmp = new BCELComparator() { + @Override public boolean equals( Object o1, Object o2 ) { FieldGen THIS = (FieldGen) o1; FieldGen THAT = (FieldGen) o2; @@ -54,6 +55,7 @@ public class FieldGen extends FieldGenOrMethodGen { } + @Override public int hashCode( Object o ) { FieldGen THIS = (FieldGen) o; return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java index edd0da56..16c4a8ce 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java @@ -48,6 +48,7 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn super(access_flags); } + @Override public void setType( Type type ) { // TODO could be package-protected? if (type.getType() == Constants.T_ADDRESS) { throw new IllegalArgumentException("Type can not be " + type); @@ -56,6 +57,7 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn } + @Override public Type getType() { return type; } @@ -63,11 +65,13 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn /** @return name of method/field. */ + @Override public String getName() { return name; } + @Override public void setName( String name ) { // TODO could be package-protected? this.name = name; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java index 16dfdcb0..2307d320 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java @@ -119,6 +119,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { /** @return type of the referenced class/interface */ + @Override public ObjectType getLoadClassType( ConstantPoolGen cpg ) { return (ObjectType)getReferenceType(cpg); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java b/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java index 7de28879..18122c1e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java @@ -53,6 +53,7 @@ public class GETFIELD extends FieldInstruction implements ExceptionThrower, Stac } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, ExceptionConstants.NULL_POINTER_EXCEPTION, diff --git a/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java index 66ed31db..dfba80b8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java @@ -52,6 +52,7 @@ public class GETSTATIC extends FieldInstruction implements PushInstruction, Exce } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ICONST.java b/src/main/java/org/apache/commons/bcel6/generic/ICONST.java index f0a9df22..c8b3af4b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ICONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ICONST.java @@ -49,6 +49,7 @@ public class ICONST extends Instruction implements ConstantPushInstruction { } + @Override public Number getValue() { return Integer.valueOf(value); } @@ -56,6 +57,7 @@ public class ICONST extends Instruction implements ConstantPushInstruction { /** @return Type.INT */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.INT; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IDIV.java b/src/main/java/org/apache/commons/bcel6/generic/IDIV.java index 0dfa5f80..e70344f1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IDIV.java @@ -37,6 +37,7 @@ public class IDIV extends ArithmeticInstruction implements ExceptionThrower { /** @return exceptions this instruction may cause */ + @Override public Class[] getExceptions() { return new Class[] { org.apache.commons.bcel6.ExceptionConstants.ARITHMETIC_EXCEPTION diff --git a/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java b/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java index d4045a7a..df5a51bd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java @@ -44,11 +44,13 @@ public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThr } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_CLASS_AND_INTERFACE_RESOLUTION); } + @Override public ObjectType getLoadClassType( ConstantPoolGen cpg ) { Type t = getType(cpg); if (t instanceof ArrayType) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java index c1c7f721..f744b4b1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java @@ -85,6 +85,7 @@ public class INVOKEDYNAMIC extends InvokeInstruction { } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_INTERFACE_METHOD_RESOLUTION, ExceptionConstants.UNSATISFIED_LINK_ERROR, diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java index 51cb0500..438ecc6c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java @@ -104,6 +104,7 @@ public final class INVOKEINTERFACE extends InvokeInstruction { } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_INTERFACE_METHOD_RESOLUTION, ExceptionConstants.UNSATISFIED_LINK_ERROR, diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java index 48f512de..e33f27ad 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java @@ -46,6 +46,7 @@ public class INVOKESPECIAL extends InvokeInstruction { } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, ExceptionConstants.NULL_POINTER_EXCEPTION, diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java index f7bbf1f6..38fd53f8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java @@ -45,6 +45,7 @@ public class INVOKESTATIC extends InvokeInstruction { } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, ExceptionConstants.UNSATISFIED_LINK_ERROR, diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java index 53e1bccc..757a204f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java @@ -45,6 +45,7 @@ public class INVOKEVIRTUAL extends InvokeInstruction { } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, ExceptionConstants.NULL_POINTER_EXCEPTION, diff --git a/src/main/java/org/apache/commons/bcel6/generic/IREM.java b/src/main/java/org/apache/commons/bcel6/generic/IREM.java index 055312c1..e3681a16 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IREM.java @@ -37,6 +37,7 @@ public class IREM extends ArithmeticInstruction implements ExceptionThrower { /** @return exceptions this instruction may cause */ + @Override public Class[] getExceptions() { return new Class[] { org.apache.commons.bcel6.ExceptionConstants.ARITHMETIC_EXCEPTION diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java index bd04f00b..455c4fc7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java @@ -33,6 +33,7 @@ public interface InstructionComparator { public static final InstructionComparator DEFAULT = new InstructionComparator() { + @Override public boolean equals( Instruction i1, Instruction i2 ) { if (i1.opcode == i2.opcode) { if (i1 instanceof Select) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java index 86c80ef8..12090ee7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java @@ -1003,6 +1003,7 @@ public class InstructionList implements Serializable { private InstructionHandle ih = start; + @Override public InstructionHandle next() throws NoSuchElementException { if (ih == null) { throw new NoSuchElementException(); @@ -1013,11 +1014,13 @@ public class InstructionList implements Serializable { } + @Override public void remove() { throw new UnsupportedOperationException(); } + @Override public boolean hasNext() { return ih != null; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java index 49a3542f..9bc94558 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java @@ -43,6 +43,7 @@ public abstract class JsrInstruction extends BranchInstruction implements Uncond /** @return return address type */ + @Override public Type getType( ConstantPoolGen cp ) { return new ReturnaddressType(physicalSuccessor()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LCMP.java b/src/main/java/org/apache/commons/bcel6/generic/LCMP.java index 9373c40f..1404907f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LCMP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LCMP.java @@ -36,6 +36,7 @@ public class LCMP extends Instruction implements TypedInstruction, StackProducer /** @return Type.LONG */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.LONG; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LCONST.java b/src/main/java/org/apache/commons/bcel6/generic/LCONST.java index 348fdc88..68d266e1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LCONST.java @@ -51,6 +51,7 @@ public class LCONST extends Instruction implements ConstantPushInstruction { } + @Override public Number getValue() { return Long.valueOf(value); } @@ -58,6 +59,7 @@ public class LCONST extends Instruction implements ConstantPushInstruction { /** @return Type.LONG */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.LONG; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC.java b/src/main/java/org/apache/commons/bcel6/generic/LDC.java index dd244f92..fa3da87c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC.java @@ -134,6 +134,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_STRING_RESOLUTION); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDIV.java b/src/main/java/org/apache/commons/bcel6/generic/LDIV.java index 7912cd8e..7ae0b5aa 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDIV.java @@ -34,6 +34,7 @@ public class LDIV extends ArithmeticInstruction implements ExceptionThrower { } + @Override public Class[] getExceptions() { return new Class[] { org.apache.commons.bcel6.ExceptionConstants.ARITHMETIC_EXCEPTION diff --git a/src/main/java/org/apache/commons/bcel6/generic/LREM.java b/src/main/java/org/apache/commons/bcel6/generic/LREM.java index c8a843e2..a16f323c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LREM.java @@ -33,6 +33,7 @@ public class LREM extends ArithmeticInstruction implements ExceptionThrower { } + @Override public Class[] getExceptions() { return new Class[] { org.apache.commons.bcel6.ExceptionConstants.ARITHMETIC_EXCEPTION diff --git a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java index f65319c6..146ba166 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java @@ -48,6 +48,7 @@ public class LineNumberGen implements InstructionTargeter, Cloneable, java.io.Se /** * @return true, if ih is target of this line number */ + @Override public boolean containsTarget( InstructionHandle ih ) { return this.ih == ih; } @@ -57,6 +58,7 @@ public class LineNumberGen implements InstructionTargeter, Cloneable, java.io.Se * @param old_ih old target * @param new_ih new target */ + @Override public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { if (old_ih != ih) { throw new ClassGenException("Not targeting " + old_ih + ", but " + ih + "}"); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java index b53dd025..2f4f19c2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java @@ -104,21 +104,25 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo } + @Override public void setName( String name ) { // TODO unused this.name = name; } + @Override public String getName() { return name; } + @Override public void setType( Type type ) { // TODO unused this.type = type; } + @Override public Type getType() { return type; } @@ -150,6 +154,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo * @param old_ih old target, either start or end * @param new_ih new target */ + @Override public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { boolean targeted = false; if (start == old_ih) { @@ -177,6 +182,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo /** * @return true, if ih is target of this variable */ + @Override public boolean containsTarget( InstructionHandle ih ) { return (start == ih) || (end == ih); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java index 76cbeaeb..4d143945 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java @@ -143,6 +143,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty /** * @return local variable index referred by this instruction. */ + @Override public final int getIndex() { return n; } @@ -151,6 +152,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty /** * Set the local variable index */ + @Override public void setIndex( int n ) { // TODO could be package-protected? if ((n < 0) || (n > Constants.MAX_SHORT)) { throw new ClassGenException("Illegal value: " + n); @@ -185,6 +187,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty * ASTORE may even work on a ReturnaddressType . * @return type associated with the instruction */ + @Override public Type getType( ConstantPoolGen cp ) { switch (canon_tag) { case Constants.ILOAD: diff --git a/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java b/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java index a70e7d42..cf63b99c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java @@ -33,6 +33,7 @@ public class MONITORENTER extends Instruction implements ExceptionThrower, Stack } + @Override public Class[] getExceptions() { return new Class[] { org.apache.commons.bcel6.ExceptionConstants.NULL_POINTER_EXCEPTION diff --git a/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java b/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java index 7ef5f2e1..903496c2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java @@ -33,6 +33,7 @@ public class MONITOREXIT extends Instruction implements ExceptionThrower, StackC } + @Override public Class[] getExceptions() { return new Class[] { org.apache.commons.bcel6.ExceptionConstants.NULL_POINTER_EXCEPTION diff --git a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java index 5bfb3978..1d20b5c1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java @@ -115,6 +115,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_CLASS_AND_INTERFACE_RESOLUTION, ExceptionConstants.ILLEGAL_ACCESS_ERROR, @@ -122,6 +123,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati } + @Override public ObjectType getLoadClassType( ConstantPoolGen cpg ) { Type t = getType(cpg); if (t instanceof ArrayType) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 8d45ea2e..ec886dfa 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -79,6 +79,7 @@ public class MethodGen extends FieldGenOrMethodGen { private static BCELComparator _cmp = new BCELComparator() { + @Override public boolean equals( Object o1, Object o2 ) { MethodGen THIS = (MethodGen) o1; MethodGen THAT = (MethodGen) o2; @@ -87,6 +88,7 @@ public class MethodGen extends FieldGenOrMethodGen { } + @Override public int hashCode( Object o ) { MethodGen THIS = (MethodGen) o; return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); @@ -369,6 +371,7 @@ public class MethodGen extends FieldGenOrMethodGen { } if (size > 1) { Arrays.sort(lg, new Comparator() { + @Override public int compare(LocalVariableGen o1, LocalVariableGen o2) { return o1.getIndex() - o2.getIndex(); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/NEW.java b/src/main/java/org/apache/commons/bcel6/generic/NEW.java index bac456b2..a919e038 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NEW.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NEW.java @@ -44,6 +44,7 @@ public class NEW extends CPInstruction implements LoadClass, AllocationInstructi } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_CLASS_AND_INTERFACE_RESOLUTION, ExceptionConstants.ILLEGAL_ACCESS_ERROR, @@ -51,6 +52,7 @@ public class NEW extends CPInstruction implements LoadClass, AllocationInstructi } + @Override public ObjectType getLoadClassType( ConstantPoolGen cpg ) { return (ObjectType) getType(cpg); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java index a27d3b6a..91d96405 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java @@ -101,6 +101,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce } + @Override public Class[] getExceptions() { return new Class[] { org.apache.commons.bcel6.ExceptionConstants.NEGATIVE_ARRAY_SIZE_EXCEPTION diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java index 4624c3b9..418fb01b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java @@ -170,6 +170,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio } + @Override public final InstructionList getInstructionList() { return new InstructionList(instruction); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java b/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java index 92a4842b..9cc96c28 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java @@ -52,6 +52,7 @@ public class PUTFIELD extends FieldInstruction implements PopInstruction, Except } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, ExceptionConstants.NULL_POINTER_EXCEPTION, diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java index bf8aa4b3..b4267f28 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java @@ -52,6 +52,7 @@ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, Pop } + @Override public Class[] getExceptions() { return ExceptionConstants.createExceptions(ExceptionConstants.EXCS.EXCS_FIELD_AND_METHOD_RESOLUTION, ExceptionConstants.INCOMPATIBLE_CLASS_CHANGE_ERROR); diff --git a/src/main/java/org/apache/commons/bcel6/generic/RET.java b/src/main/java/org/apache/commons/bcel6/generic/RET.java index 3e5853f0..21ada1b1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/RET.java +++ b/src/main/java/org/apache/commons/bcel6/generic/RET.java @@ -97,6 +97,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc /** * @return index of local variable containg the return address */ + @Override public final int getIndex() { return index; } @@ -105,6 +106,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc /** * Set index of local variable containg the return address */ + @Override public final void setIndex( int n ) { if (n < 0) { throw new ClassGenException("Negative index value: " + n); @@ -125,6 +127,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc /** @return return address type */ + @Override public Type getType( ConstantPoolGen cp ) { return ReturnaddressType.NO_TARGET; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java index e29b7f5b..e6d51d8a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java @@ -67,6 +67,7 @@ public abstract class ReturnInstruction extends Instruction implements Exception } + @Override public Class[] getExceptions() { return new Class[] { ExceptionConstants.ILLEGAL_MONITOR_STATE @@ -76,6 +77,7 @@ public abstract class ReturnInstruction extends Instruction implements Exception /** @return type associated with the instruction */ + @Override public Type getType( ConstantPoolGen cp ) { return getType(); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java b/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java index 51ba568c..63a651a1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java @@ -78,6 +78,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { } + @Override public Number getValue() { return Integer.valueOf(b); } @@ -85,6 +86,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { /** @return Type.SHORT */ + @Override public Type getType( ConstantPoolGen cp ) { return Type.SHORT; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java index 6b0c921d..d8b52945 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java @@ -142,6 +142,7 @@ public final class SWITCH implements CompoundInstruction { } + @Override public final InstructionList getInstructionList() { return new InstructionList(instruction); } diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java index e414d530..15ba20d5 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java @@ -51,6 +51,7 @@ public class ClassLoaderRepository implements Repository { /** * Store a new JavaClass into this Repository. */ + @Override public void storeClass( JavaClass clazz ) { loadedClasses.put(clazz.getClassName(), clazz); clazz.setRepository(this); @@ -60,6 +61,7 @@ public class ClassLoaderRepository implements Repository { /** * Remove class from repository */ + @Override public void removeClass( JavaClass clazz ) { loadedClasses.remove(clazz.getClassName()); } @@ -68,6 +70,7 @@ public class ClassLoaderRepository implements Repository { /** * Find an already defined JavaClass. */ + @Override public JavaClass findClass( String className ) { return loadedClasses.containsKey(className) ? loadedClasses.get(className) : null; } @@ -76,6 +79,7 @@ public class ClassLoaderRepository implements Repository { /** * Lookup a JavaClass object from the Class Name provided. */ + @Override public JavaClass loadClass( String className ) throws ClassNotFoundException { String classFile = className.replace('.', '/'); JavaClass RC = findClass(className); @@ -101,6 +105,7 @@ public class ClassLoaderRepository implements Repository { } + @Override public JavaClass loadClass( Class clazz ) throws ClassNotFoundException { return loadClass(clazz.getName()); } @@ -108,6 +113,7 @@ public class ClassLoaderRepository implements Repository { /** Clear all entries from cache. */ + @Override public void clear() { loadedClasses.clear(); } @@ -116,6 +122,7 @@ public class ClassLoaderRepository implements Repository { /* * @return null */ + @Override public ClassPath getClassPath() { return null; } diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index 017cc9ee..c0800483 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -48,6 +48,7 @@ public class ClassPath implements Serializable { private static final FilenameFilter ARCHIVE_FILTER = new FilenameFilter() { + @Override public boolean accept( File dir, String name ) { name = name.toLowerCase(Locale.ENGLISH); return name.endsWith(".zip") || name.endsWith(".jar"); @@ -421,11 +422,13 @@ public class ClassPath implements Serializable { + name.replace('.', File.separatorChar) + suffix); return file.exists() ? new ClassFile() { + @Override public InputStream getInputStream() throws IOException { return new FileInputStream(file); } + @Override public String getPath() { try { return file.getCanonicalPath(); @@ -435,16 +438,19 @@ public class ClassPath implements Serializable { } + @Override public long getTime() { return file.lastModified(); } + @Override public long getSize() { return file.length(); } + @Override public String getBase() { return dir; } @@ -498,26 +504,31 @@ public class ClassPath implements Serializable { return new ClassFile() { + @Override public InputStream getInputStream() throws IOException { return zip.getInputStream(entry); } + @Override public String getPath() { return entry.toString(); } + @Override public long getTime() { return entry.getTime(); } + @Override public long getSize() { return entry.getSize(); } + @Override public String getBase() { return zip.getName(); } diff --git a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java index 351a478c..a09bd0a7 100644 --- a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java @@ -72,6 +72,7 @@ public class SyntheticRepository implements Repository { /** * Store a new JavaClass instance into this Repository. */ + @Override public void storeClass( JavaClass clazz ) { _loadedClasses.put(clazz.getClassName(), new SoftReference(clazz)); clazz.setRepository(this); @@ -81,6 +82,7 @@ public class SyntheticRepository implements Repository { /** * Remove class from repository */ + @Override public void removeClass( JavaClass clazz ) { _loadedClasses.remove(clazz.getClassName()); } @@ -89,6 +91,7 @@ public class SyntheticRepository implements Repository { /** * Find an already defined (cached) JavaClass object by name. */ + @Override public JavaClass findClass( String className ) { SoftReference ref = _loadedClasses.get(className); if (ref == null) { @@ -109,6 +112,7 @@ public class SyntheticRepository implements Repository { * @throws ClassNotFoundException if the class is not in the * Repository, and could not be found on the classpath */ + @Override public JavaClass loadClass( String className ) throws ClassNotFoundException { if (className == null || className.equals("")) { throw new IllegalArgumentException("Invalid class name " + className); @@ -140,6 +144,7 @@ public class SyntheticRepository implements Repository { * @throws ClassNotFoundException if the class is not in the * Repository, and its representation could not be found */ + @Override public JavaClass loadClass( Class clazz ) throws ClassNotFoundException { InputStream clsStream = null; try{ @@ -192,6 +197,7 @@ public class SyntheticRepository implements Repository { /** ClassPath associated with the Repository. */ + @Override public ClassPath getClassPath() { return _path; } @@ -199,6 +205,7 @@ public class SyntheticRepository implements Repository { /** Clear all entries from cache. */ + @Override public void clear() { _loadedClasses.clear(); } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java b/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java index 2a06f963..3f44923a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java @@ -40,6 +40,7 @@ public class TransitiveHull implements VerifierFactoryObserver { /* Implementing VerifierFactoryObserver. */ + @Override public void update( String classname ) { System.gc(); // avoid swapping if possible. for (int i = 0; i < indent; i++) { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java index 9c7baf17..899b18ca 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java @@ -128,6 +128,7 @@ public class VerifierAppFrame extends JFrame { messagesScrollPane.setPreferredSize(new Dimension(10, 10)); classNamesJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + @Override public void valueChanged( ListSelectionEvent e ) { classNamesJList_valueChanged(e); } @@ -152,6 +153,7 @@ public class VerifierAppFrame extends JFrame { InputEvent.CTRL_MASK, true)); newFileMenuItem.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed( ActionEvent e ) { newFileMenuItem_actionPerformed(e); } @@ -160,12 +162,14 @@ public class VerifierAppFrame extends JFrame { pass3bTextPane.setEditable(false); pass3aJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + @Override public void valueChanged( ListSelectionEvent e ) { pass3aJList_valueChanged(e); } }); pass3bJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { + @Override public void valueChanged( ListSelectionEvent e ) { pass3bJList_valueChanged(e); } @@ -174,6 +178,7 @@ public class VerifierAppFrame extends JFrame { whatisMenuItem.setText("What is..."); whatisMenuItem.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed( ActionEvent e ) { whatisMenuItem_actionPerformed(e); } @@ -181,6 +186,7 @@ public class VerifierAppFrame extends JFrame { aboutMenuItem.setText("About"); aboutMenuItem.addActionListener(new java.awt.event.ActionListener() { + @Override public void actionPerformed( ActionEvent e ) { aboutMenuItem_actionPerformed(e); } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java index e2f06507..63972143 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java @@ -44,6 +44,7 @@ public class VerifierFactoryListModel implements org.apache.commons.bcel6.verifi } + @Override public synchronized void update( String s ) { Verifier[] verifiers = VerifierFactory.getVerifiers(); int num_of_verifiers = verifiers.length; @@ -58,21 +59,25 @@ public class VerifierFactoryListModel implements org.apache.commons.bcel6.verifi } + @Override public synchronized void addListDataListener( ListDataListener l ) { listeners.add(l); } + @Override public synchronized void removeListDataListener( javax.swing.event.ListDataListener l ) { listeners.remove(l); } + @Override public synchronized int getSize() { return cache.size(); } + @Override public synchronized String getElementAt( int index ) { return (cache.toArray(new String[cache.size()]))[index]; } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java index d0a0698f..0637ea3a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java @@ -70,6 +70,7 @@ public class VerifyDialog extends javax.swing.JDialog { /** Machine-generated. */ class IvjEventHandler implements java.awt.event.ActionListener { + @Override public void actionPerformed( java.awt.event.ActionEvent e ) { if (e.getSource() == VerifyDialog.this.getPass1Button()) { connEtoC1(e); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java index 743eaae8..d3f79177 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java @@ -94,11 +94,13 @@ public class ControlFlowGraph{ } /* Satisfies InstructionContext.getTag(). */ + @Override public int getTag(){ return TAG; } /* Satisfies InstructionContext.setTag(int). */ + @Override public void setTag(int tag){ // part of InstructionContext interface TAG = tag; } @@ -106,6 +108,7 @@ public class ControlFlowGraph{ /** * Returns the exception handlers of this instruction. */ + @Override public ExceptionHandler[] getExceptionHandlers(){ return exceptionhandlers.getExceptionHandlers(getInstruction()); } @@ -113,6 +116,7 @@ public class ControlFlowGraph{ /** * Returns a clone of the "outgoing" frame situation with respect to the given ExecutionChain. */ + @Override public Frame getOutFrame(ArrayList execChain){ executionPredecessors = execChain; @@ -128,6 +132,7 @@ public class ControlFlowGraph{ return org.getClone(); } + @Override public Frame getInFrame() { Frame org; @@ -156,6 +161,7 @@ public class ControlFlowGraph{ * @return true - if and only if the "outgoing" frame situation * changed from the one before execute()ing. */ + @Override public boolean execute(Frame inFrame, ArrayList execPreds, InstConstraintVisitor icv, ExecutionVisitor ev){ @SuppressWarnings("unchecked") // OK because execPreds is compatible type @@ -273,6 +279,7 @@ public class ControlFlowGraph{ /* * Fulfils the contract of InstructionContext.getInstruction(). */ + @Override public InstructionHandle getInstruction(){ return instruction; } @@ -306,6 +313,7 @@ public class ControlFlowGraph{ } /* Satisfies InstructionContext.getSuccessors(). */ + @Override public InstructionContext[] getSuccessors(){ return contextsOf(_getSuccessors()); } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java index bea8c042..9d141e7f 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java @@ -90,6 +90,7 @@ public class Subroutines{ /* * Refer to the Subroutine interface for documentation. */ + @Override public boolean contains(InstructionHandle inst){ return instructions.contains(inst); } @@ -162,6 +163,7 @@ public class Subroutines{ /* * Refer to the Subroutine interface for documentation. */ + @Override public InstructionHandle[] getEnteringJsrInstructions(){ if (this == TOPLEVEL) { throw new AssertionViolatedException("getLeavingRET() called on top level pseudo-subroutine."); @@ -192,6 +194,7 @@ public class Subroutines{ /* * Refer to the Subroutine interface for documentation. */ + @Override public InstructionHandle getLeavingRET(){ if (this == TOPLEVEL) { throw new AssertionViolatedException("getLeavingRET() called on top level pseudo-subroutine."); @@ -202,6 +205,7 @@ public class Subroutines{ /* * Refer to the Subroutine interface for documentation. */ + @Override public InstructionHandle[] getInstructions(){ InstructionHandle[] ret = new InstructionHandle[instructions.size()]; return instructions.toArray(ret); @@ -220,6 +224,7 @@ public class Subroutines{ } /* Satisfies Subroutine.getRecursivelyAccessedLocalsIndices(). */ + @Override public int[] getRecursivelyAccessedLocalsIndices(){ Set s = new HashSet(); int[] lvs = getAccessedLocalsIndices(); @@ -255,6 +260,7 @@ public class Subroutines{ /* * Satisfies Subroutine.getAccessedLocalIndices(). */ + @Override public int[] getAccessedLocalsIndices(){ //TODO: Implement caching. Set acc = new HashSet(); @@ -299,6 +305,7 @@ public class Subroutines{ /* * Satisfies Subroutine.subSubs(). */ + @Override public Subroutine[] subSubs(){ Set h = new HashSet(); diff --git a/src/test/java/org/apache/commons/bcel6/BCELBenchmark.java b/src/test/java/org/apache/commons/bcel6/BCELBenchmark.java index 82fc3135..c71ffc67 100644 --- a/src/test/java/org/apache/commons/bcel6/BCELBenchmark.java +++ b/src/test/java/org/apache/commons/bcel6/BCELBenchmark.java @@ -59,6 +59,7 @@ public class BCELBenchmark { private Iterable getClasses(JarFile jar) { return new IteratorIterable(new FilterIterator(new EnumerationIterator(jar.entries()), new Predicate() { + @Override public boolean evaluate(JarEntry entry) { return entry.getName().endsWith(".class"); } diff --git a/src/test/java/org/apache/commons/bcel6/PerformanceTest.java b/src/test/java/org/apache/commons/bcel6/PerformanceTest.java index d4289b7c..cba7f055 100644 --- a/src/test/java/org/apache/commons/bcel6/PerformanceTest.java +++ b/src/test/java/org/apache/commons/bcel6/PerformanceTest.java @@ -131,6 +131,7 @@ public final class PerformanceTest extends TestCase { File javaLib = new File(System.getProperty("java.home") + "/lib"); javaLib.listFiles(new FileFilter() { + @Override public boolean accept(File file) { if(file.getName().endsWith(".jar")) { try { diff --git a/src/test/java/org/apache/commons/bcel6/data/AnonymousClassTest.java b/src/test/java/org/apache/commons/bcel6/data/AnonymousClassTest.java index 09df5dac..26b4a336 100644 --- a/src/test/java/org/apache/commons/bcel6/data/AnonymousClassTest.java +++ b/src/test/java/org/apache/commons/bcel6/data/AnonymousClassTest.java @@ -24,6 +24,7 @@ public class AnonymousClassTest { new Runnable() { + @Override public void run() { } diff --git a/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java b/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java index 7ade0648..d2bb4def 100644 --- a/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java +++ b/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java @@ -22,6 +22,7 @@ public class AttributeTestClassEM02 { Runnable r = new Runnable() { + @Override public void run() { System.err.println("hello"); diff --git a/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java b/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java index 2f470bfb..cd616b07 100644 --- a/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java +++ b/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java @@ -150,216 +150,259 @@ public class CounterVisitor implements Visitor public int methodParametersCount = 0; + @Override public void visitAnnotation(Annotations obj) { annotationCount++; } + @Override public void visitAnnotationDefault(AnnotationDefault obj) { annotationDefaultCount++; } + @Override public void visitAnnotationEntry(AnnotationEntry obj) { annotationEntryCount++; } + @Override public void visitCode(Code obj) { codeCount++; } + @Override public void visitCodeException(CodeException obj) { codeExceptionCount++; } + @Override public void visitConstantClass(ConstantClass obj) { constantClassCount++; } + @Override public void visitConstantDouble(ConstantDouble obj) { constantDoubleCount++; } + @Override public void visitConstantFieldref(ConstantFieldref obj) { constantFieldrefCount++; } + @Override public void visitConstantFloat(ConstantFloat obj) { constantFloatCount++; } + @Override public void visitConstantInteger(ConstantInteger obj) { constantIntegerCount++; } + @Override public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) { constantInterfaceMethodrefCount++; } + @Override public void visitConstantLong(ConstantLong obj) { constantLongCount++; } + @Override public void visitConstantMethodref(ConstantMethodref obj) { constantMethodrefCount++; } + @Override public void visitConstantNameAndType(ConstantNameAndType obj) { constantNameAndTypeCount++; } + @Override public void visitConstantPool(ConstantPool obj) { constantPoolCount++; } + @Override public void visitConstantString(ConstantString obj) { constantStringCount++; } + @Override public void visitConstantUtf8(ConstantUtf8 obj) { constantUtf8Count++; } + @Override public void visitConstantValue(ConstantValue obj) { constantValueCount++; } + @Override public void visitDeprecated(Deprecated obj) { deprecatedCount++; } + @Override public void visitEnclosingMethod(EnclosingMethod obj) { enclosingMethodCount++; } + @Override public void visitExceptionTable(ExceptionTable obj) { exceptionTableCount++; } + @Override public void visitField(Field obj) { fieldCount++; } + @Override public void visitInnerClass(InnerClass obj) { innerClassCount++; } + @Override public void visitInnerClasses(InnerClasses obj) { innerClassesCount++; } + @Override public void visitJavaClass(JavaClass obj) { javaClassCount++; } + @Override public void visitLineNumber(LineNumber obj) { lineNumberCount++; } + @Override public void visitLineNumberTable(LineNumberTable obj) { lineNumberTableCount++; } + @Override public void visitLocalVariable(LocalVariable obj) { localVariableCount++; } + @Override public void visitLocalVariableTable(LocalVariableTable obj) { localVariableTableCount++; } + @Override public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) { localVariableTypeTableCount++; } + @Override public void visitMethod(Method obj) { methodCount++; } + @Override public void visitParameterAnnotation(ParameterAnnotations obj) { parameterAnnotationCount++; } + @Override public void visitSignature(Signature obj) { signatureAnnotationCount++; } + @Override public void visitSourceFile(SourceFile obj) { sourceFileCount++; } + @Override public void visitStackMap(StackMap obj) { stackMapCount++; } + @Override public void visitStackMapEntry(StackMapEntry obj) { stackMapEntryCount++; } + @Override public void visitSynthetic(Synthetic obj) { syntheticCount++; } + @Override public void visitUnknown(Unknown obj) { unknownCount++; } + @Override public void visitStackMapTable(StackMapTable obj) { stackMapTableCount++; } + @Override public void visitStackMapTableEntry(StackMapTableEntry obj) { stackMapTableEntryCount++; } + @Override public void visitBootstrapMethods(BootstrapMethods obj) { bootstrapMethodsCount++; } + @Override public void visitMethodParameters(MethodParameters obj) { methodParametersCount++; } + @Override public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj) { } -- GitLab From d54e40c20b0fa9f2001a60b547f36d72c528de55 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 13 Aug 2015 21:59:04 +0000 Subject: [PATCH 0860/1313] Javadoc: fix spelling. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695787 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/generic/MethodGen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index ec886dfa..339eb889 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -707,7 +707,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * Remove all NOPs from the instruction list (if possible) and update every - * object refering to them, i.e., branch instructions, local variables and + * object referring to them, i.e., branch instructions, local variables and * exception handlers. */ public void removeNOPs() { -- GitLab From 5292a12753c590a62a21f991057db3c4ed5d3775 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 22:04:00 +0000 Subject: [PATCH 0861/1313] BCEL-110 Problem with JAXB if the bcel classloader is used Remove the problematic class git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695788 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../commons/bcel6/util/ClassLoader.java | 189 ------------------ 2 files changed, 1 insertion(+), 189 deletions(-) delete mode 100644 src/main/java/org/apache/commons/bcel6/util/ClassLoader.java diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 5e9f84f0..dbadcae4 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Problem with JAXB if the bcel classloader is used modify several toString methods to make output similar to "javap" add javadoc comments to LineNumber.java and LineNumberTable.java Need to check for an empty InstructionList diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java deleted file mode 100644 index 8dc1a428..00000000 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.commons.bcel6.util; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.util.Hashtable; - -import org.apache.commons.bcel6.Constants; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Utility; - -/** - *

    Drop in replacement for the standard class loader of the JVM. You can use it - * in conjunction with the JavaWrapper to dynamically modify/create classes - * as they're requested.

    - * - *

    This class loader recognizes special requests in a distinct - * format, i.e., when the name of the requested class contains with - * "$$BCEL$$" it calls the createClass() method with that name - * (everything bevor the $$BCEL$$ is considered to be the package - * name. You can subclass the class loader and override that - * method. "Normal" classes class can be modified by overriding the - * modifyClass() method which is called just before defineClass().

    - * - *

    There may be a number of packages where you have to use the - * default class loader (which may also be faster). You can define the - * set of packages where to use the system class loader in the - * constructor. The default value contains "java.", "sun.", - * "javax."

    - * - * @version $Id$ - * @see JavaWrapper - * @see ClassPath - */ -public class ClassLoader extends java.lang.ClassLoader { // TODO rename this class to reduce confusion with parent - - private static final String BCEL_TOKEN = "$$BCEL$$"; - - private static final String[] DEFAULT_IGNORED_PACKAGES = { - "java.", "javax.", "sun." - }; - - private final Hashtable> classes = new Hashtable>(); // Hashtable is synchronized thus thread-safe - private final String[] ignored_packages; - private Repository repository = SyntheticRepository.getInstance(); - - - /** Ignored packages are by default ( "java.", "sun.", - * "javax."), i.e. loaded by system class loader - */ - public ClassLoader() { - this(DEFAULT_IGNORED_PACKAGES); - } - - - /** @param deferTo delegate class loader to use for ignored packages - */ - public ClassLoader(java.lang.ClassLoader deferTo) { - super(deferTo); - this.ignored_packages = DEFAULT_IGNORED_PACKAGES; - this.repository = new ClassLoaderRepository(deferTo); - } - - - /** @param ignored_packages classes contained in these packages will be loaded - * with the system class loader - */ - public ClassLoader(String[] ignored_packages) { - this.ignored_packages = ignored_packages; - } - - - /** @param ignored_packages classes contained in these packages will be loaded - * with the system class loader - * @param deferTo delegate class loader to use for ignored packages - */ - public ClassLoader(java.lang.ClassLoader deferTo, String[] ignored_packages) { - this(ignored_packages); - this.repository = new ClassLoaderRepository(deferTo); - } - - @Override - protected Class loadClass( String class_name, boolean resolve ) throws ClassNotFoundException { - Class cl = null; - /* First try: lookup hash table. - */ - if ((cl = classes.get(class_name)) == null) { - /* Second try: Load system class using system class loader. You better - * don't mess around with them. - */ - for (String ignored_package : ignored_packages) { - if (class_name.startsWith(ignored_package)) { - cl = getParent().loadClass(class_name); - break; - } - } - if (cl == null) { - JavaClass clazz = null; - /* Third try: Special request? - */ - if (class_name.contains(BCEL_TOKEN)) { - clazz = createClass(class_name); - } else { // Fourth try: Load classes via repository - if ((clazz = repository.loadClass(class_name)) != null) { - clazz = modifyClass(clazz); - } else { - throw new ClassNotFoundException(class_name); - } - } - if (clazz != null) { - byte[] bytes = clazz.getBytes(); - cl = defineClass(class_name, bytes, 0, bytes.length); - } else { - cl = Class.forName(class_name); - } - } - if (resolve) { - resolveClass(cl); - } - } - classes.put(class_name, cl); - return cl; - } - - - /** Override this method if you want to alter a class before it gets actually - * loaded. Does nothing by default. - */ - protected JavaClass modifyClass( JavaClass clazz ) { - return clazz; - } - - - /** - * Override this method to create you own classes on the fly. The - * name contains the special token $$BCEL$$. Everything before that - * token is considered to be a package name. You can encode your own - * arguments into the subsequent string. You must ensure however not - * to use any "illegal" characters, i.e., characters that may not - * appear in a Java class name too
    - * - * The default implementation interprets the string as a encoded compressed - * Java class, unpacks and decodes it with the Utility.decode() method, and - * parses the resulting byte array and returns the resulting JavaClass object. - * - * @param class_name compressed byte code with "$$BCEL$$" in it - */ - protected JavaClass createClass( String class_name ) { - int index = class_name.indexOf(BCEL_TOKEN); - String real_name = class_name.substring(index + BCEL_TOKEN.length()); - JavaClass clazz = null; - try { - byte[] bytes = Utility.decode(real_name, true); - ClassParser parser = new ClassParser(new ByteArrayInputStream(bytes), "foo"); - clazz = parser.parse(); - } catch (IOException e) { - e.printStackTrace(); - return null; - } - // Adapt the class name to the passed value - ConstantPool cp = clazz.getConstantPool(); - ConstantClass cl = (ConstantClass) cp.getConstant(clazz.getClassNameIndex(), - Constants.CONSTANT_Class); - ConstantUtf8 name = (ConstantUtf8) cp.getConstant(cl.getNameIndex(), - Constants.CONSTANT_Utf8); - name.setBytes(class_name.replace('.', '/')); - return clazz; - } -} -- GitLab From 90d616c2d69b145d4935a52f880a7dce18535c98 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 22:09:23 +0000 Subject: [PATCH 0862/1313] BCEL-231 Remove deprecated methods and classes git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695789 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../apache/commons/bcel6/classfile/ConstantUtf8.java | 10 ---------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index dbadcae4..c849959c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Remove deprecated methods and classes Problem with JAXB if the bcel classloader is used modify several toString methods to make output similar to "javap" add javadoc comments to LineNumber.java and LineNumberTable.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java index 2aff7298..ad3bf0ee 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java @@ -183,16 +183,6 @@ public final class ConstantUtf8 extends Constant { } - /** - * @param bytes the raw bytes of this Utf-8 - * @deprecated - */ - @java.lang.Deprecated - public final void setBytes( String bytes ) { - throw new UnsupportedOperationException(); - } - - /** * @return String representation */ -- GitLab From 6c3321ea4b1dd23964473221f376736c0e80c9b1 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 13 Aug 2015 22:16:16 +0000 Subject: [PATCH 0863/1313] Remove redundant specification of type arguments (Java 7). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695790 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/classfile/AnnotationEntry.java | 4 ++-- .../commons/bcel6/classfile/Attribute.java | 2 +- .../bcel6/classfile/DescendingVisitor.java | 2 +- .../commons/bcel6/classfile/JavaClass.java | 4 ++-- .../classfile/ParameterAnnotationEntry.java | 2 +- .../commons/bcel6/classfile/Unknown.java | 2 +- .../commons/bcel6/classfile/Utility.java | 2 +- .../bcel6/generic/AnnotationEntryGen.java | 8 +++---- .../bcel6/generic/ArrayElementValueGen.java | 6 ++--- .../commons/bcel6/generic/ClassGen.java | 14 ++++++------ .../bcel6/generic/ConstantPoolGen.java | 10 ++++----- .../commons/bcel6/generic/FieldGen.java | 2 +- .../bcel6/generic/FieldGenOrMethodGen.java | 4 ++-- .../bcel6/generic/InstructionHandle.java | 6 ++--- .../bcel6/generic/InstructionList.java | 8 +++---- .../commons/bcel6/generic/MethodGen.java | 22 +++++++++---------- .../commons/bcel6/util/BCELFactory.java | 4 ++-- .../bcel6/util/ClassLoaderRepository.java | 2 +- .../apache/commons/bcel6/util/ClassPath.java | 6 ++--- .../apache/commons/bcel6/util/ClassQueue.java | 2 +- .../apache/commons/bcel6/util/ClassSet.java | 2 +- .../apache/commons/bcel6/util/ClassStack.java | 2 +- .../commons/bcel6/util/InstructionFinder.java | 4 ++-- .../bcel6/util/SyntheticRepository.java | 6 ++--- .../commons/bcel6/verifier/PassVerifier.java | 2 +- .../commons/bcel6/verifier/Verifier.java | 6 ++--- .../bcel6/verifier/VerifierFactory.java | 2 +- .../verifier/VerifierFactoryListModel.java | 4 ++-- .../bcel6/verifier/statics/IntList.java | 2 +- .../verifier/statics/LocalVariableInfo.java | 4 ++-- .../bcel6/verifier/statics/Pass2Verifier.java | 10 ++++----- .../structurals/ControlFlowGraph.java | 6 ++--- .../structurals/ExceptionHandlers.java | 4 ++-- .../verifier/structurals/OperandStack.java | 2 +- .../verifier/structurals/Pass3bVerifier.java | 4 ++-- .../verifier/structurals/Subroutines.java | 20 ++++++++--------- .../commons/bcel6/AbstractTestCase.java | 6 ++--- .../apache/commons/bcel6/BCELBenchmark.java | 2 +- .../bcel6/generic/AnnotationGenTestCase.java | 8 +++---- .../GeneratingAnnotatedClassesTestCase.java | 8 +++---- 40 files changed, 108 insertions(+), 108 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java index c73cf7cc..983edce8 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java @@ -56,7 +56,7 @@ public class AnnotationEntry implements Node, Serializable { final AnnotationEntry annotationEntry = new AnnotationEntry(input.readUnsignedShort(), constant_pool, isRuntimeVisible); final int num_element_value_pairs = (input.readUnsignedShort()); - annotationEntry.element_value_pairs = new ArrayList(); + annotationEntry.element_value_pairs = new ArrayList<>(); for (int i = 0; i < num_element_value_pairs; i++) { annotationEntry.element_value_pairs.add(new ElementValuePair(input.readUnsignedShort(), ElementValue.readElementValue(input, constant_pool), constant_pool)); @@ -153,7 +153,7 @@ public class AnnotationEntry implements Node, Serializable { public static AnnotationEntry[] createAnnotationEntries(Attribute[] attrs) { // Find attributes that contain annotation data - List accumulatedAnnotations = new ArrayList(attrs.length); + List accumulatedAnnotations = new ArrayList<>(attrs.length); for (Attribute attribute : attrs) { if (attribute instanceof Annotations) { Annotations runtimeAnnotations = (Annotations) attribute; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index ae68f024..a5f23066 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -92,7 +92,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable file.writeInt(length); } - private static final Map readers = new HashMap(); + private static final Map readers = new HashMap<>(); /** * Add an Attribute reader capable of parsing (user-defined) attributes diff --git a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java index a2bd0772..38f9a4ba 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java @@ -32,7 +32,7 @@ public class DescendingVisitor implements Visitor private final Visitor visitor; - private final Stack stack = new Stack(); + private final Stack stack = new Stack<>(); /** * @return container of current entitity, i.e., predecessor during traversal diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 1e500ac2..2f978df5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -718,7 +718,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl */ public JavaClass[] getSuperClasses() throws ClassNotFoundException { JavaClass clazz = this; - List allSuperClasses = new ArrayList(); + List allSuperClasses = new ArrayList<>(); for (clazz = clazz.getSuperClass(); clazz != null; clazz = clazz.getSuperClass()) { allSuperClasses.add(clazz); } @@ -744,7 +744,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl */ public JavaClass[] getAllInterfaces() throws ClassNotFoundException { ClassQueue queue = new ClassQueue(); - Set allInterfaces = new TreeSet(); + Set allInterfaces = new TreeSet<>(); queue.enqueue(this); while (!queue.empty()) { JavaClass clazz = queue.dequeue(); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java index 32dad891..6fd0c62f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java @@ -79,7 +79,7 @@ public class ParameterAnnotationEntry implements Node { public static ParameterAnnotationEntry[] createParameterAnnotationEntries(Attribute[] attrs) { // Find attributes that contain parameter annotation data - List accumulatedAnnotations = new ArrayList(attrs.length); + List accumulatedAnnotations = new ArrayList<>(attrs.length); for (Attribute attribute : attrs) { if (attribute instanceof ParameterAnnotations) { ParameterAnnotations runtimeAnnotations = (ParameterAnnotations)attribute; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java index d1ef77d7..0140292b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java @@ -43,7 +43,7 @@ public final class Unknown extends Attribute { private static final long serialVersionUID = -4099655108069755015L; private byte[] bytes; // TODO could be final if copy() were adjusted private final String name; - private static final Map unknown_attributes = new HashMap(); + private static final Map unknown_attributes = new HashMap<>(); /** @return array of unknown attributes, but just one for each kind. diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java index 99105680..5113449b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java @@ -574,7 +574,7 @@ public abstract class Utility { */ public static String[] methodSignatureArgumentTypes( String signature, boolean chopit ) throws ClassFormatException { - List vec = new ArrayList(); + List vec = new ArrayList<>(); int index; try { // Read all declarations between for `(' and `)' if (signature.charAt(0) != '(') { diff --git a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java index 5f0c8d4f..3caa9e40 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java @@ -69,7 +69,7 @@ public class AnnotationEntryGen { private List copyValues(ElementValuePair[] in, ConstantPoolGen cpool, boolean copyPoolEntries) { - List out = new ArrayList(); + List out = new ArrayList<>(); for (ElementValuePair nvp : in) { out.add(new ElementValuePairGen(nvp, cpool, copyPoolEntries)); } @@ -125,7 +125,7 @@ public class AnnotationEntryGen { public void addElementNameValuePair(ElementValuePairGen evp) { if (evs == null) { - evs = new ArrayList(); + evs = new ArrayList<>(); } evs.add(evp); } @@ -247,7 +247,7 @@ public class AnnotationEntryGen { riaIndex = cp.addUtf8("RuntimeInvisibleAnnotations"); } - List newAttributes = new ArrayList(); + List newAttributes = new ArrayList<>(); if (rvaData.length > 2) { newAttributes.add( new RuntimeVisibleAnnotations(rvaIndex, rvaData.length, new DataInputStream(new ByteArrayInputStream(rvaData)), cp.getConstantPool())); @@ -332,7 +332,7 @@ public class AnnotationEntryGen { if (totalInvisCount > 0) { riaIndex = cp.addUtf8("RuntimeInvisibleParameterAnnotations"); } - List newAttributes = new ArrayList(); + List newAttributes = new ArrayList<>(); if (totalVisCount > 0) { newAttributes .add(new RuntimeVisibleParameterAnnotations(rvaIndex, diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java index 216f1382..4e46b31e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java @@ -37,7 +37,7 @@ public class ArrayElementValueGen extends ElementValueGen public ArrayElementValueGen(ConstantPoolGen cp) { super(ARRAY, cp); - evalues = new ArrayList(); + evalues = new ArrayList<>(); } public ArrayElementValueGen(int type, ElementValue[] datums, @@ -48,7 +48,7 @@ public class ArrayElementValueGen extends ElementValueGen throw new RuntimeException( "Only element values of type array can be built with this ctor - type specified: " + type); } - this.evalues = new ArrayList(); + this.evalues = new ArrayList<>(); for (ElementValue datum : datums) { evalues.add(ElementValueGen.copy(datum, cpool, true)); } @@ -77,7 +77,7 @@ public class ArrayElementValueGen extends ElementValueGen boolean copyPoolEntries) { super(ARRAY, cpool); - evalues = new ArrayList(); + evalues = new ArrayList<>(); ElementValue[] in = value.getElementValuesArray(); for (ElementValue element : in) { evalues.add(ElementValueGen.copy(element, cpool, copyPoolEntries)); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index 787c5705..8918532e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -52,11 +52,11 @@ public class ClassGen extends AccessFlags implements Cloneable { private int major = Constants.MAJOR_1_1, minor = Constants.MINOR_1_1; private ConstantPoolGen cp; // Template for building up constant pool // ArrayLists instead of arrays to gather fields, methods, etc. - private final List field_vec = new ArrayList(); - private final List method_vec = new ArrayList(); - private final List attribute_vec = new ArrayList(); - private final List interface_vec = new ArrayList(); - private final List annotation_vec = new ArrayList(); + private final List field_vec = new ArrayList<>(); + private final List method_vec = new ArrayList<>(); + private final List attribute_vec = new ArrayList<>(); + private final List interface_vec = new ArrayList<>(); + private final List annotation_vec = new ArrayList<>(); private static BCELComparator _cmp = new BCELComparator() { @@ -166,7 +166,7 @@ public class ClassGen extends AccessFlags implements Cloneable { */ private AnnotationEntryGen[] unpackAnnotations(Attribute[] attrs) { - List annotationGenObjs = new ArrayList(); + List annotationGenObjs = new ArrayList<>(); for (Attribute attr : attrs) { if (attr instanceof RuntimeVisibleAnnotations) { @@ -525,7 +525,7 @@ public class ClassGen extends AccessFlags implements Cloneable { */ public void addObserver( ClassObserver o ) { if (observers == null) { - observers = new ArrayList(); + observers = new ArrayList<>(); } observers.add(o); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index f1e83fc1..3f8f74de 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -198,7 +198,7 @@ public class ConstantPoolGen implements java.io.Serializable { } } - private final Map string_table = new HashMap(); + private final Map string_table = new HashMap<>(); /** @@ -235,7 +235,7 @@ public class ConstantPoolGen implements java.io.Serializable { return ret; } - private final Map class_table = new HashMap(); + private final Map class_table = new HashMap<>(); /** @@ -374,7 +374,7 @@ public class ConstantPoolGen implements java.io.Serializable { return ret; } - private final Map utf8_table = new HashMap(); + private final Map utf8_table = new HashMap<>(); /** @@ -486,7 +486,7 @@ public class ConstantPoolGen implements java.io.Serializable { return ret; } - private final Map n_a_t_table = new HashMap(); + private final Map n_a_t_table = new HashMap<>(); /** @@ -528,7 +528,7 @@ public class ConstantPoolGen implements java.io.Serializable { return ret; } - private final Map cp_table = new HashMap(); + private final Map cp_table = new HashMap<>(); /** diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index 77056a65..192d92fc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -269,7 +269,7 @@ public class FieldGen extends FieldGenOrMethodGen { */ public void addObserver( FieldObserver o ) { if (observers == null) { - observers = new ArrayList(); + observers = new ArrayList<>(); } observers.add(o); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java index 16c4a8ce..f597288c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java @@ -36,8 +36,8 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn protected String name; protected Type type; protected ConstantPoolGen cp; - private final List attribute_vec = new ArrayList(); - protected List annotation_vec= new ArrayList(); + private final List attribute_vec = new ArrayList<>(); + protected List annotation_vec= new ArrayList<>(); protected FieldGenOrMethodGen() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java index 905d8e2c..335d752d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java @@ -197,7 +197,7 @@ public class InstructionHandle implements java.io.Serializable { */ public void addTargeter( InstructionTargeter t ) { if (targeters == null) { - targeters = new HashSet(); + targeters = new HashSet<>(); } //if(!targeters.contains(t)) targeters.add(t); @@ -244,7 +244,7 @@ public class InstructionHandle implements java.io.Serializable { */ public void addAttribute( Object key, Object attr ) { if (attributes == null) { - attributes = new HashMap(3); + attributes = new HashMap<>(3); } attributes.put(key, attr); } @@ -277,7 +277,7 @@ public class InstructionHandle implements java.io.Serializable { */ public Collection getAttributes() { if (attributes == null) { - attributes = new HashMap(3); + attributes = new HashMap<>(3); } return attributes.values(); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java index 12090ee7..b443b7bf 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java @@ -707,7 +707,7 @@ public class InstructionList implements Serializable { } first.prev = null; // Completely separated from rest of list last.next = null; - List target_vec = new ArrayList(); + List target_vec = new ArrayList<>(); for (InstructionHandle ih = first; ih != null; ih = ih.next) { ih.getInstruction().dispose(); // e.g. BranchInstructions release their targets } @@ -963,7 +963,7 @@ public class InstructionList implements Serializable { */ public Instruction[] getInstructions() { ByteSequence bytes = new ByteSequence(getByteCode()); - List instructions = new ArrayList(); + List instructions = new ArrayList<>(); try { while (bytes.available() > 0) { instructions.add(Instruction.readInstruction(bytes)); @@ -1058,7 +1058,7 @@ public class InstructionList implements Serializable { * @return complete, i.e., deep copy of this list */ public InstructionList copy() { - Map map = new HashMap(); + Map map = new HashMap<>(); InstructionList il = new InstructionList(); /* Pass 1: Make copies of all instructions, append them to the new list * and associate old instruction references with the new ones, i.e., @@ -1253,7 +1253,7 @@ public class InstructionList implements Serializable { */ public void addObserver( InstructionListObserver o ) { if (observers == null) { - observers = new ArrayList(); + observers = new ArrayList<>(); } observers.add(o); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 339eb889..91bfd47b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -67,11 +67,11 @@ public class MethodGen extends FieldGenOrMethodGen { private int max_stack; private InstructionList il; private boolean strip_attributes; - private final List variable_vec = new ArrayList(); - private final List line_number_vec = new ArrayList(); - private final List exception_vec = new ArrayList(); - private final List throws_vec = new ArrayList(); - private final List code_attrs_vec = new ArrayList(); + private final List variable_vec = new ArrayList<>(); + private final List line_number_vec = new ArrayList<>(); + private final List exception_vec = new ArrayList<>(); + private final List throws_vec = new ArrayList<>(); + private final List code_attrs_vec = new ArrayList<>(); private List[] param_annotations; // Array of lists containing AnnotationGen objects private boolean hasParameterAnnotations = false; @@ -899,8 +899,8 @@ public class MethodGen extends FieldGenOrMethodGen { static final class BranchStack { - Stack branchTargets = new Stack(); - Hashtable visitedTargets = new Hashtable(); + Stack branchTargets = new Stack<>(); + Hashtable visitedTargets = new Hashtable<>(); public void push( InstructionHandle target, int stackDepth ) { @@ -1015,7 +1015,7 @@ public class MethodGen extends FieldGenOrMethodGen { */ public void addObserver( MethodObserver o ) { if (observers == null) { - observers = new ArrayList(); + observers = new ArrayList<>(); } observers.add(o); } @@ -1124,7 +1124,7 @@ public class MethodGen extends FieldGenOrMethodGen { final List[] parmList = new List[arg_types.length]; param_annotations = parmList; for (int j = 0; j < arg_types.length; j++) { - param_annotations[j] = new ArrayList(); + param_annotations[j] = new ArrayList<>(); } } hasParameterAnnotations = true; @@ -1157,7 +1157,7 @@ public class MethodGen extends FieldGenOrMethodGen { private List makeMutableVersion(AnnotationEntry[] mutableArray) { - List result = new ArrayList(); + List result = new ArrayList<>(); for (AnnotationEntry element : mutableArray) { result.add(new AnnotationEntryGen(element, getConstantPool(), false)); @@ -1183,7 +1183,7 @@ public class MethodGen extends FieldGenOrMethodGen { } else { - List l = new ArrayList(); + List l = new ArrayList<>(); l.add(annotation); param_annotations[parameterIndex] = l; } diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java b/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java index 238270ed..86859d13 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java @@ -76,7 +76,7 @@ class BCELFactory extends EmptyVisitor { _out = out; } - private final Map branch_map = new HashMap(); + private final Map branch_map = new HashMap<>(); public void start() { @@ -259,7 +259,7 @@ class BCELFactory extends EmptyVisitor { } // Memorize BranchInstructions that need an update - private final List branches = new ArrayList(); + private final List branches = new ArrayList<>(); @Override diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java index 15ba20d5..c46cf0a3 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java @@ -40,7 +40,7 @@ public class ClassLoaderRepository implements Repository { private static final long serialVersionUID = -1052781833503868187L; private final java.lang.ClassLoader loader; - private final Map loadedClasses = new HashMap(); // CLASSNAME X JAVACLASS + private final Map loadedClasses = new HashMap<>(); // CLASSNAME X JAVACLASS public ClassLoaderRepository(java.lang.ClassLoader loader) { diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index c0800483..33f89eb5 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -71,7 +71,7 @@ public class ClassPath implements Serializable { */ public ClassPath(String class_path) { this.class_path = class_path; - List vec = new ArrayList(); + List vec = new ArrayList<>(); for (StringTokenizer tok = new StringTokenizer(class_path, File.pathSeparator); tok.hasMoreTokens();) { String path = tok.nextToken(); if (!path.equals("")) { @@ -147,10 +147,10 @@ public class ClassPath implements Serializable { String class_path = System.getProperty("java.class.path"); String boot_path = System.getProperty("sun.boot.class.path"); String ext_path = System.getProperty("java.ext.dirs"); - List list = new ArrayList(); + List list = new ArrayList<>(); getPathComponents(class_path, list); getPathComponents(boot_path, list); - List dirs = new ArrayList(); + List dirs = new ArrayList<>(); getPathComponents(ext_path, dirs); for (String d : dirs) { File ext_dir = new File(d); diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java b/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java index dd45c1e4..27d90172 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java @@ -30,7 +30,7 @@ import org.apache.commons.bcel6.classfile.JavaClass; public class ClassQueue implements java.io.Serializable { private static final long serialVersionUID = 685144104322420292L; - protected LinkedList vec = new LinkedList(); + protected LinkedList vec = new LinkedList<>(); public void enqueue( JavaClass clazz ) { diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassSet.java b/src/main/java/org/apache/commons/bcel6/util/ClassSet.java index 0d4ab3c1..3e1111ca 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassSet.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassSet.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.classfile.JavaClass; public class ClassSet implements java.io.Serializable { private static final long serialVersionUID = -7476907380350035254L; - private final Map _map = new HashMap(); + private final Map _map = new HashMap<>(); public boolean add( JavaClass clazz ) { diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassStack.java b/src/main/java/org/apache/commons/bcel6/util/ClassStack.java index 2c99b315..11745c37 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassStack.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassStack.java @@ -30,7 +30,7 @@ import org.apache.commons.bcel6.classfile.JavaClass; public class ClassStack implements java.io.Serializable { private static final long serialVersionUID = 6126079269396985982L; - private final Stack stack = new Stack(); + private final Stack stack = new Stack<>(); public void push( JavaClass clazz ) { diff --git a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java index 4cc193da..00665c02 100644 --- a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java +++ b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java @@ -72,7 +72,7 @@ public class InstructionFinder { // LATIN-1 private static final int NO_OPCODES = 256; // Potential number, // some are not used - private static final Map map = new HashMap(); + private static final Map map = new HashMap<>(); private final InstructionList il; private String il_string; // instruction list // as string @@ -223,7 +223,7 @@ public class InstructionFinder { + " not found in instruction list."); } Pattern regex = Pattern.compile(search); - List matches = new ArrayList(); + List matches = new ArrayList<>(); Matcher matcher = regex.matcher(il_string); while (start < il_string.length() && matcher.find(start)) { int startExpr = matcher.start(); diff --git a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java index a09bd0a7..d0bed5fa 100644 --- a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java @@ -44,9 +44,9 @@ public class SyntheticRepository implements Repository { private static final long serialVersionUID = 2923440730410019444L; //private static final String DEFAULT_PATH = ClassPath.getClassPath(); - private static final Map _instances = new HashMap(); // CLASSPATH X REPOSITORY + private static final Map _instances = new HashMap<>(); // CLASSPATH X REPOSITORY private ClassPath _path = null; - private final Map> _loadedClasses = new HashMap>(); // CLASSNAME X JAVACLASS + private final Map> _loadedClasses = new HashMap<>(); // CLASSNAME X JAVACLASS private SyntheticRepository(ClassPath path) { @@ -74,7 +74,7 @@ public class SyntheticRepository implements Repository { */ @Override public void storeClass( JavaClass clazz ) { - _loadedClasses.put(clazz.getClassName(), new SoftReference(clazz)); + _loadedClasses.put(clazz.getClassName(), new SoftReference<>(clazz)); clazz.setRepository(this); } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java index 2dde1549..aa600133 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java @@ -48,7 +48,7 @@ import java.util.List; public abstract class PassVerifier { /** The (warning) messages. */ - private final List messages = new ArrayList(); + private final List messages = new ArrayList<>(); /** The VerificationResult cache. */ private VerificationResult verificationResult = null; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java index 82cbfa95..5a834b97 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java @@ -54,9 +54,9 @@ public class Verifier { /** A Pass2Verifier for this Verifier instance. */ private Pass2Verifier p2v; /** The Pass3aVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ - private final Map p3avs = new HashMap(); + private final Map p3avs = new HashMap<>(); /** The Pass3bVerifiers for this Verifier instance. Key: Interned string specifying the method number. */ - private final Map p3bvs = new HashMap(); + private final Map p3bvs = new HashMap<>(); /** Returns the VerificationResult for the given pass. */ @@ -145,7 +145,7 @@ public class Verifier { * A prefix shows from which verifying pass a message originates. */ public String[] getMessages() throws ClassNotFoundException { - List messages = new ArrayList(); + List messages = new ArrayList<>(); if (p1v != null) { String[] p1m = p1v.getMessages(); for (String element : p1m) { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java index 9f83f9e4..0670e9a2 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java @@ -36,7 +36,7 @@ public class VerifierFactory { /** * The HashMap that holds the data about the already-constructed Verifier instances. */ - private static final Map hashMap = new HashMap(); + private static final Map hashMap = new HashMap<>(); /** * The VerifierFactoryObserver instances that observe the VerifierFactory. */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java index 63972143..fb7d07c6 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java @@ -34,8 +34,8 @@ import javax.swing.event.ListDataListener; public class VerifierFactoryListModel implements org.apache.commons.bcel6.verifier.VerifierFactoryObserver, javax.swing.ListModel { - private final List listeners = new ArrayList(); - private final Set cache = new TreeSet(); + private final List listeners = new ArrayList<>(); + private final Set cache = new TreeSet<>(); public VerifierFactoryListModel() { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java index 4d9c431d..c76fd3a5 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java @@ -31,7 +31,7 @@ public class IntList{ private final List theList; /** This constructor creates an empty list. */ IntList(){ - theList = new ArrayList(); + theList = new ArrayList<>(); } /** Adds an element to the list. */ void add(int i){ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java index f6ecedd0..0e0454d0 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java @@ -34,9 +34,9 @@ import org.apache.commons.bcel6.verifier.exc.LocalVariableInfoInconsistentExcept public class LocalVariableInfo{ /** The types database. KEY: String representing the offset integer. */ - private final Hashtable types = new Hashtable(); + private final Hashtable types = new Hashtable<>(); /** The names database. KEY: String representing the offset integer. */ - private final Hashtable names = new Hashtable(); + private final Hashtable names = new Hashtable<>(); /** * Adds a name of a local variable and a certain slot to our 'names' diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java index 8bdf808a..3be98d77 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java @@ -191,7 +191,7 @@ public final class Pass2Verifier extends PassVerifier { */ private void every_class_has_an_accessible_superclass(){ try { - Set hs = new HashSet(); // save class names to detect circular inheritance + Set hs = new HashSet<>(); // save class names to detect circular inheritance JavaClass jc = Repository.lookupClass(myOwner.getClassName()); int supidx = -1; @@ -241,7 +241,7 @@ public final class Pass2Verifier extends PassVerifier { */ private void final_methods_are_not_overridden(){ try { - Map hashmap = new HashMap(); + Map hashmap = new HashMap<>(); JavaClass jc = Repository.lookupClass(myOwner.getClassName()); int supidx = -1; @@ -327,9 +327,9 @@ public final class Pass2Verifier extends PassVerifier { private final int cplen; // == cp.getLength() -- to save computing power. private final DescendingVisitor carrier; - private final Set field_names = new HashSet(); - private final Set field_names_and_desc = new HashSet(); - private final Set method_names_and_desc = new HashSet(); + private final Set field_names = new HashSet<>(); + private final Set field_names_and_desc = new HashSet<>(); + private final Set method_names_and_desc = new HashSet<>(); private CPESSC_Visitor(JavaClass _jc){ jc = _jc; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java index d3f79177..df10f119 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java @@ -89,8 +89,8 @@ public class ControlFlowGraph{ } instruction = inst; - inFrames = new HashMap(); - outFrames = new HashMap(); + inFrames = new HashMap<>(); + outFrames = new HashMap<>(); } /* Satisfies InstructionContext.getTag(). */ @@ -404,7 +404,7 @@ public class ControlFlowGraph{ private final ExceptionHandlers exceptionhandlers; /** All InstructionContext instances of this ControlFlowGraph. */ - private final Map instructionContexts = new HashMap(); //keys: InstructionHandle, values: InstructionContextImpl + private final Map instructionContexts = new HashMap<>(); //keys: InstructionHandle, values: InstructionContextImpl /** * A Control Flow Graph. diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java index 66658759..7f11671a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java @@ -43,7 +43,7 @@ public class ExceptionHandlers{ * Constructor. Creates a new ExceptionHandlers instance. */ public ExceptionHandlers(MethodGen mg){ - exceptionhandlers = new HashMap>(); + exceptionhandlers = new HashMap<>(); CodeExceptionGen[] cegs = mg.getExceptionHandlers(); for (CodeExceptionGen ceg : cegs) { ExceptionHandler eh = new ExceptionHandler(ceg.getCatchType(), ceg.getHandlerPC()); @@ -51,7 +51,7 @@ public class ExceptionHandlers{ Set hs; hs = exceptionhandlers.get(ih); if (hs == null){ - hs = new HashSet(); + hs = new HashSet<>(); exceptionhandlers.put(ih, hs); } hs.add(eh); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java index 5d8ae473..95cd346e 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java @@ -36,7 +36,7 @@ import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; public class OperandStack{ /** We hold the stack information here. */ - private ArrayList stack = new ArrayList(); + private ArrayList stack = new ArrayList<>(); /** The maximum number of stack slots this OperandStack instance may hold. */ private final int maxStack; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java index a41f363f..cdf4bb15 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java @@ -76,8 +76,8 @@ public final class Pass3bVerifier extends PassVerifier{ * we have about its symbolic execution predecessors. */ private static final class InstructionContextQueue{ - private final List ics = new Vector(); - private final List> ecs = new Vector>(); + private final List ics = new Vector<>(); + private final List> ecs = new Vector<>(); public void add(InstructionContext ic, ArrayList executionChain){ ics.add(ic); ecs.add(executionChain); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java index 9d141e7f..202a8043 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java @@ -85,7 +85,7 @@ public class Subroutines{ private int localVariable = UNSET; /** The instructions that belong to this subroutine. */ - private final Set instructions = new HashSet(); // Elements: InstructionHandle + private final Set instructions = new HashSet<>(); // Elements: InstructionHandle /* * Refer to the Subroutine interface for documentation. @@ -99,7 +99,7 @@ public class Subroutines{ * The JSR or JSR_W instructions that define this * subroutine by targeting it. */ - private final Set theJSRs = new HashSet(); + private final Set theJSRs = new HashSet<>(); /** * The RET instruction that leaves this subroutine. @@ -226,7 +226,7 @@ public class Subroutines{ /* Satisfies Subroutine.getRecursivelyAccessedLocalsIndices(). */ @Override public int[] getRecursivelyAccessedLocalsIndices(){ - Set s = new HashSet(); + Set s = new HashSet<>(); int[] lvs = getAccessedLocalsIndices(); for (int lv : lvs) { s.add(Integer.valueOf(lv)); @@ -263,7 +263,7 @@ public class Subroutines{ @Override public int[] getAccessedLocalsIndices(){ //TODO: Implement caching. - Set acc = new HashSet(); + Set acc = new HashSet<>(); if (theRET == null && this != TOPLEVEL){ throw new AssertionViolatedException("This subroutine object must be built up completely before calculating accessed locals."); } @@ -307,7 +307,7 @@ public class Subroutines{ */ @Override public Subroutine[] subSubs(){ - Set h = new HashSet(); + Set h = new HashSet<>(); for (InstructionHandle ih : instructions) { Instruction inst = ih.getInstruction(); @@ -351,7 +351,7 @@ public class Subroutines{ * Key: InstructionHandle of the leader of the subroutine. * Elements: SubroutineImpl objects. */ - private final Map subroutines = new HashMap(); + private final Map subroutines = new HashMap<>(); /** * This is referring to a special subroutine, namely the @@ -375,7 +375,7 @@ public class Subroutines{ TOPLEVEL = new SubroutineImpl(); // Calculate "real" subroutines. - Set sub_leaders = new HashSet(); // Elements: InstructionHandle + Set sub_leaders = new HashSet<>(); // Elements: InstructionHandle for (InstructionHandle element : all) { Instruction inst = element.getInstruction(); if (inst instanceof JsrInstruction){ @@ -409,11 +409,11 @@ public class Subroutines{ // Now do a BFS from every subroutine leader to find all the // instructions that belong to a subroutine. - Set instructions_assigned = new HashSet(); // we don't want to assign an instruction to two or more Subroutine objects. + Set instructions_assigned = new HashSet<>(); // we don't want to assign an instruction to two or more Subroutine objects. - Map colors = new HashMap(); //Graph colouring. Key: InstructionHandle, Value: Integer . + Map colors = new HashMap<>(); //Graph colouring. Key: InstructionHandle, Value: Integer . - List Q = new ArrayList(); + List Q = new ArrayList<>(); for (InstructionHandle actual : sub_leaders) { // Do some BFS with "actual" as the root of the graph. // Init colors diff --git a/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java b/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java index 7db4b332..302bcd40 100644 --- a/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java @@ -91,7 +91,7 @@ public abstract class AbstractTestCase extends TestCase protected Attribute[] findAttribute(String name, JavaClass clazz) { Attribute[] all = clazz.getAttributes(); - List chosenAttrsList = new ArrayList(); + List chosenAttrsList = new ArrayList<>(); for (Attribute element : all) { if (verbose) { System.err.println("Attribute: " + element.getName()); @@ -105,7 +105,7 @@ public abstract class AbstractTestCase extends TestCase protected Attribute findAttribute(String name, Attribute[] all) { - List chosenAttrsList = new ArrayList(); + List chosenAttrsList = new ArrayList<>(); for (Attribute element : all) { if (verbose) { System.err.println("Attribute: " + element.getName()); @@ -174,7 +174,7 @@ public abstract class AbstractTestCase extends TestCase ElementValueGen.STRING, cp, aFruit); ElementValuePairGen nvGen = new ElementValuePairGen("fruit", evg, cp); ObjectType t = new ObjectType("SimpleStringAnnotation"); - List elements = new ArrayList(); + List elements = new ArrayList<>(); elements.add(nvGen); return new AnnotationEntryGen(t, elements, visibility, cp); } diff --git a/src/test/java/org/apache/commons/bcel6/BCELBenchmark.java b/src/test/java/org/apache/commons/bcel6/BCELBenchmark.java index c71ffc67..34589fbe 100644 --- a/src/test/java/org/apache/commons/bcel6/BCELBenchmark.java +++ b/src/test/java/org/apache/commons/bcel6/BCELBenchmark.java @@ -58,7 +58,7 @@ public class BCELBenchmark { } private Iterable getClasses(JarFile jar) { - return new IteratorIterable(new FilterIterator(new EnumerationIterator(jar.entries()), new Predicate() { + return new IteratorIterable<>(new FilterIterator<>(new EnumerationIterator<>(jar.entries()), new Predicate() { @Override public boolean evaluate(JarEntry entry) { return entry.getName().endsWith(".class"); diff --git a/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java index d01fe1b4..c552d8c1 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java @@ -66,7 +66,7 @@ public class AnnotationGenTestCase extends AbstractTestCase "Should include string 'id=4' but says: " + nvGen.toString(), nvGen.toString().contains("id=4")); ObjectType t = new ObjectType("SimpleAnnotation"); - List elements = new ArrayList(); + List elements = new ArrayList<>(); elements.add(nvGen); // Build an annotation of type 'SimpleAnnotation' with 'id=4' as the // only value :) @@ -91,12 +91,12 @@ public class AnnotationGenTestCase extends AbstractTestCase "Should include string 'id=4' but says: " + nvGen.toString(), nvGen.toString().contains("id=4")); ObjectType t = new ObjectType("SimpleAnnotation"); - List elements = new ArrayList(); + List elements = new ArrayList<>(); elements.add(nvGen); // Build a RV annotation of type 'SimpleAnnotation' with 'id=4' as the // only value :) AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); - List v = new ArrayList(); + List v = new ArrayList<>(); v.add(a); Attribute[] attributes = AnnotationEntryGen.getAnnotationAttributes(cp, v); boolean foundRV = false; @@ -111,7 +111,7 @@ public class AnnotationGenTestCase extends AbstractTestCase // Build a RIV annotation of type 'SimpleAnnotation' with 'id=4' as the // only value :) AnnotationEntryGen a2 = new AnnotationEntryGen(t, elements, false, cp); - List v2 = new ArrayList(); + List v2 = new ArrayList<>(); v2.add(a2); Attribute[] attributes2 = AnnotationEntryGen.getAnnotationAttributes(cp, v2); boolean foundRIV = false; diff --git a/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java index cd5f51e5..276b66cd 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java @@ -655,7 +655,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase ElementValueGen.PRIMITIVE_INT, cp, 4); ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, cp); ObjectType t = new ObjectType("SimpleAnnotation"); - List elements = new ArrayList(); + List elements = new ArrayList<>(); elements.add(nvGen); AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); return a; @@ -668,7 +668,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase ElementValueGen.STRING, cp, aFruit); ElementValuePairGen nvGen = new ElementValuePairGen("fruit", evg, cp); ObjectType t = new ObjectType("SimpleStringAnnotation"); - List elements = new ArrayList(); + List elements = new ArrayList<>(); elements.add(nvGen); return new AnnotationEntryGen(t, elements, true, cp); } @@ -680,7 +680,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase ArrayElementValueGen array = new ArrayElementValueGen(cp); array.addElement(new AnnotationElementValueGen(a, cp)); ElementValuePairGen nvp = new ElementValuePairGen("value", array, cp); - List elements = new ArrayList(); + List elements = new ArrayList<>(); elements.add(nvp); return new AnnotationEntryGen(new ObjectType("CombinedAnnotation"), elements, true, cp); @@ -692,7 +692,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase ElementValueGen.PRIMITIVE_INT, cp, 4); ElementValuePairGen nvGen = new ElementValuePairGen("id", evg, cp); ObjectType t = new ObjectType("SimpleAnnotation"); - List elements = new ArrayList(); + List elements = new ArrayList<>(); elements.add(nvGen); AnnotationEntryGen a = new AnnotationEntryGen(t, elements, false, cp); return a; -- GitLab From 694ace667256dd15a38548308179f1f3305fac4e Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 13 Aug 2015 22:18:53 +0000 Subject: [PATCH 0864/1313] Remove redundant specification of type arguments (Java 7). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695792 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/generic/Type.java | 2 +- src/main/java/org/apache/commons/bcel6/util/ClassPath.java | 2 +- .../java/org/apache/commons/bcel6/verifier/VerifierFactory.java | 2 +- .../apache/commons/bcel6/verifier/structurals/OperandStack.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/Type.java b/src/main/java/org/apache/commons/bcel6/generic/Type.java index 92e83f82..18ef12e4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Type.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Type.java @@ -244,7 +244,7 @@ public abstract class Type implements java.io.Serializable { * @return array of argument types */ public static Type[] getArgumentTypes( String signature ) { - List vec = new ArrayList(); + List vec = new ArrayList<>(); int index; Type[] types; try { // Read all declarations between for `(' and `)' diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index 33f89eb5..3f1aac64 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -234,7 +234,7 @@ public class ClassPath implements Serializable { * empty Enumeration if no resource with that name. */ public Enumeration getResources(String name) { - Vector results = new Vector(); + Vector results = new Vector<>(); for (PathEntry path : paths) { URL url; if ((url = path.getResource(name)) != null) { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java index 0670e9a2..6d83c08e 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java @@ -40,7 +40,7 @@ public class VerifierFactory { /** * The VerifierFactoryObserver instances that observe the VerifierFactory. */ - private static final List observers = new Vector(); + private static final List observers = new Vector<>(); /** diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java index 95cd346e..ed4ce6bc 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java @@ -74,7 +74,7 @@ public class OperandStack{ * Clears the stack. */ public void clear(){ - stack = new ArrayList(); + stack = new ArrayList<>(); } /** @return a hash code value for the object. -- GitLab From 0d4ef9257077080fb9116a137550eded8995e9cc Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 13 Aug 2015 22:19:54 +0000 Subject: [PATCH 0865/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695793 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/generic/FieldOrMethod.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java index 2307d320..4e0b7175 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java @@ -110,10 +110,9 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { org.apache.commons.bcel6.Constants.CONSTANT_Class); if (className.startsWith("[")) { return (ArrayType) Type.getType(className); - } else { - className = className.replace('/', '.'); - return ObjectType.getInstance(className); } + className = className.replace('/', '.'); + return ObjectType.getInstance(className); } -- GitLab From d691d34fe17e5f673713e9ac231de48902e95df6 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 13 Aug 2015 22:28:03 +0000 Subject: [PATCH 0866/1313] Statement unnecessarily nested within else clause. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695794 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/generic/FieldGen.java | 3 +- .../commons/bcel6/generic/Instruction.java | 3 +- .../bcel6/generic/InstructionFactory.java | 22 ++++------ .../bcel6/generic/InstructionHandle.java | 9 ++-- .../bcel6/generic/InstructionList.java | 6 +-- .../commons/bcel6/generic/LineNumberGen.java | 3 +- .../generic/LocalVariableInstruction.java | 3 +- .../commons/bcel6/generic/MethodGen.java | 5 +-- .../commons/bcel6/generic/ObjectType.java | 5 +-- .../bcel6/generic/SimpleElementValueGen.java | 3 +- .../bcel6/verifier/statics/Pass2Verifier.java | 42 ++++++++----------- 11 files changed, 42 insertions(+), 62 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index 192d92fc..29c99c83 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -300,9 +300,8 @@ public class FieldGen extends FieldGenOrMethodGen { public String getInitValue() { if (value != null) { return value.toString(); - } else { - return null; } + return null; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java index bbc938c6..7f02d61f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java @@ -80,9 +80,8 @@ public abstract class Instruction implements Cloneable, Serializable { public String toString( boolean verbose ) { if (verbose) { return getName() + "[" + opcode + "](" + length + ")"; - } else { - return getName(); } + return getName(); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java index c07aa719..c45e32f1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java @@ -590,9 +590,8 @@ public class InstructionFactory implements java.io.Serializable { } else if ((src_type instanceof ReferenceType) && (dest_type instanceof ReferenceType)) { if (dest_type instanceof ArrayType) { return new CHECKCAST(cp.addArrayClass((ArrayType) dest_type)); - } else { - return new CHECKCAST(cp.addClass(((ObjectType) dest_type).getClassName())); } + return new CHECKCAST(cp.addClass(((ObjectType) dest_type).getClassName())); } else { throw new RuntimeException("Can not cast " + src_type + " to " + dest_type); } @@ -622,18 +621,16 @@ public class InstructionFactory implements java.io.Serializable { public CHECKCAST createCheckCast( ReferenceType t ) { if (t instanceof ArrayType) { return new CHECKCAST(cp.addArrayClass((ArrayType) t)); - } else { - return new CHECKCAST(cp.addClass((ObjectType) t)); } + return new CHECKCAST(cp.addClass((ObjectType) t)); } public INSTANCEOF createInstanceOf( ReferenceType t ) { if (t instanceof ArrayType) { return new INSTANCEOF(cp.addArrayClass((ArrayType) t)); - } else { - return new INSTANCEOF(cp.addClass((ObjectType) t)); } + return new INSTANCEOF(cp.addClass((ObjectType) t)); } @@ -659,15 +656,14 @@ public class InstructionFactory implements java.io.Serializable { } else { return new NEWARRAY(t.getType()); } + } + ArrayType at; + if (t instanceof ArrayType) { + at = (ArrayType) t; } else { - ArrayType at; - if (t instanceof ArrayType) { - at = (ArrayType) t; - } else { - at = new ArrayType(t, dim); - } - return new MULTIANEWARRAY(cp.addArrayClass(at), dim); + at = new ArrayType(t, dim); } + return new MULTIANEWARRAY(cp.addArrayClass(at), dim); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java index 335d752d..688c6af4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java @@ -109,12 +109,11 @@ public class InstructionHandle implements java.io.Serializable { static InstructionHandle getInstructionHandle( Instruction i ) { if (ih_list == null) { return new InstructionHandle(i); - } else { - InstructionHandle ih = ih_list; - ih_list = ih.next; - ih.setInstruction(i); - return ih; } + InstructionHandle ih = ih_list; + ih_list = ih.next; + ih.setInstruction(i); + return ih; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java index b443b7bf..e1f0ada7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java @@ -289,9 +289,8 @@ public class InstructionList implements Serializable { length = il.length; il.clear(); return start; - } else { - return append(end, il); // was end.instruction } + return append(end, il); // was end.instruction } @@ -456,9 +455,8 @@ public class InstructionList implements Serializable { if (isEmpty()) { append(il); // Code is identical for this case return start; - } else { - return insert(start, il); } + return insert(start, il); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java index 146ba166..8e3e9e61 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java @@ -62,9 +62,8 @@ public class LineNumberGen implements InstructionTargeter, Cloneable, java.io.Se public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { if (old_ih != ih) { throw new ClassGenException("Not targeting " + old_ih + ", but " + ih + "}"); - } else { - setInstruction(new_ih); } + setInstruction(new_ih); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java index 4d143945..f366d9e6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java @@ -109,9 +109,8 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty if (((opcode >= Constants.ILOAD_0) && (opcode <= Constants.ALOAD_3)) || ((opcode >= Constants.ISTORE_0) && (opcode <= Constants.ASTORE_3))) { return super.toString(verbose); - } else { - return super.toString(verbose) + " " + n; } + return super.toString(verbose) + " " + n; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 91bfd47b..311e9ecc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -305,10 +305,9 @@ public class MethodGen extends FieldGenOrMethodGen { variable_vec.add(l); } return l; - } else { - throw new IllegalArgumentException("Can not use " + type - + " as type for local variable"); } + throw new IllegalArgumentException("Can not use " + type + + " as type for local variable"); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java index 8848c2c4..53b4a914 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java @@ -119,9 +119,8 @@ public class ObjectType extends ReferenceType { JavaClass jc = Repository.lookupClass(class_name); if (jc.isPublic()) { return true; - } else { - JavaClass acc = Repository.lookupClass(accessor.class_name); - return acc.getPackageName().equals(jc.getPackageName()); } + JavaClass acc = Repository.lookupClass(accessor.class_name); + return acc.getPackageName().equals(jc.getPackageName()); } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java index b8e52a1b..91a576e1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java @@ -234,9 +234,8 @@ public class SimpleElementValueGen extends ElementValueGen ConstantInteger bo = (ConstantInteger) getConstantPoolgen().getConstant(idx); if (bo.getBytes() == 0) { return "false"; - } else { - return "true"; } + return "true"; case STRING: ConstantUtf8 cu8 = (ConstantUtf8) getConstantPoolgen().getConstant(idx); return cu8.getBytes(); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java index 3be98d77..ba294da0 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java @@ -1067,29 +1067,25 @@ public final class Pass2Verifier extends PassVerifier { if (vr != VerificationResult.VR_OK){ throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but it does not pass verification pass 1: "+vr); } - else{ - // We cannot safely trust any other "instanceof" mechanism. We need to transitively verify - // the ancestor hierarchy. - JavaClass e = Repository.lookupClass(cname); - JavaClass t = Repository.lookupClass(Type.THROWABLE.getClassName()); - JavaClass o = Repository.lookupClass(Type.OBJECT.getClassName()); - while (e != o){ - if (e == t) { - break; // It's a subclass of Throwable, OKAY, leave. - } - - v = VerifierFactory.getVerifier(e.getSuperclassName()); - vr = v.doPass1(); - if (vr != VerificationResult.VR_OK){ - throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but '"+e.getSuperclassName()+"' in the ancestor hierachy does not pass verification pass 1: "+vr); - } - else{ - e = Repository.lookupClass(e.getSuperclassName()); - } + // We cannot safely trust any other "instanceof" mechanism. We need to transitively verify + // the ancestor hierarchy. + JavaClass e = Repository.lookupClass(cname); + JavaClass t = Repository.lookupClass(Type.THROWABLE.getClassName()); + JavaClass o = Repository.lookupClass(Type.OBJECT.getClassName()); + while (e != o){ + if (e == t) { + break; // It's a subclass of Throwable, OKAY, leave. } - if (e != t) { - throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); + + v = VerifierFactory.getVerifier(e.getSuperclassName()); + vr = v.doPass1(); + if (vr != VerificationResult.VR_OK){ + throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but '"+e.getSuperclassName()+"' in the ancestor hierachy does not pass verification pass 1: "+vr); } + e = Repository.lookupClass(e.getSuperclassName()); + } + if (e != t) { + throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); } } @@ -1335,9 +1331,7 @@ public final class Pass2Verifier extends PassVerifier { if (allowStaticInit){ return (name.equals(Constants.CONSTRUCTOR_NAME) || name.equals(Constants.STATIC_INITIALIZER_NAME)); } - else{ - return name.equals(Constants.CONSTRUCTOR_NAME); - } + return name.equals(Constants.CONSTRUCTOR_NAME); } /** -- GitLab From 52e1dd485c8851322f9d87988b94efee8c8fec74 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 13 Aug 2015 23:23:42 +0000 Subject: [PATCH 0867/1313] Fix type of change git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695799 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index c849959c..fedd4472 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,8 +63,8 @@ The type attribute can be add,update,fix,remove. - Remove deprecated methods and classes - Problem with JAXB if the bcel classloader is used + Remove deprecated methods and classes + Problem with JAXB if the bcel classloader is used modify several toString methods to make output similar to "javap" add javadoc comments to LineNumber.java and LineNumberTable.java Need to check for an empty InstructionList @@ -72,7 +72,7 @@ The type attribute can be add,update,fix,remove. long type instructions are not searched by InstructionFinder using regular expression Update Java requirement from 5 to 7 Interfaces should not be used to define constants - Remove unused setters + Remove unused setters Make mutable fields private The access_flags field in AccessFlags class should be final Code must not swallow Throwable -- GitLab From cd10b153b1b3899636a3073a857d1c40fa96fa98 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 14 Aug 2015 22:06:59 +0000 Subject: [PATCH 0868/1313] TODO git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695994 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/generic/Select.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/Select.java b/src/main/java/org/apache/commons/bcel6/generic/Select.java index 50f6cc04..b6b540f1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Select.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Select.java @@ -36,12 +36,12 @@ public abstract class Select extends BranchInstruction implements VariableLength StackConsumer, StackProducer { private static final long serialVersionUID = 2806771744559217250L; - protected int[] match; // matches, i.e., case 1: ... - protected int[] indices; // target offsets - protected InstructionHandle[] targets; // target objects in instruction list - protected int fixed_length; // fixed length defined by subclasses - protected int match_length; // number of cases - protected int padding = 0; // number of pad bytes for alignment + protected int[] match; // matches, i.e., case 1: ... TODO could be package-protected? + protected int[] indices; // target offsets TODO could be package-protected? + protected InstructionHandle[] targets; // target objects in instruction list TODO could be package-protected? + protected int fixed_length; // fixed length defined by subclasses TODO could be package-protected? + protected int match_length; // number of cases TODO could be package-protected? + protected int padding = 0; // number of pad bytes for alignment TODO could be package-protected? /** -- GitLab From b4d4d168b6077c8c6a35257dee0967fbb85398c5 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 14 Aug 2015 22:22:47 +0000 Subject: [PATCH 0869/1313] BCEL-79 - Add test to show the problem, and re-fix it git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1695997 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/generic/MethodGen.java | 17 ----------------- .../apache/commons/bcel6/PLSETestCase.java | 19 +++++++++++++++++++ .../commons/bcel6/data/PLSETestClass.java | 8 ++++++++ 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 311e9ecc..8055a67f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -35,7 +35,6 @@ import org.apache.commons.bcel6.classfile.LineNumber; import org.apache.commons.bcel6.classfile.LineNumberTable; import org.apache.commons.bcel6.classfile.LocalVariable; import org.apache.commons.bcel6.classfile.LocalVariableTable; -import org.apache.commons.bcel6.classfile.LocalVariableTypeTable; import org.apache.commons.bcel6.classfile.Method; import org.apache.commons.bcel6.classfile.ParameterAnnotationEntry; import org.apache.commons.bcel6.classfile.ParameterAnnotations; @@ -239,22 +238,6 @@ public class MethodGen extends FieldGenOrMethodGen { addLocalVariable(l.getName(), Type.getType(l.getSignature()), l .getIndex(), start, end); } - } else if (a instanceof LocalVariableTypeTable) { - LocalVariable[] lv = ((LocalVariableTypeTable) a).getLocalVariableTypeTable(); - removeLocalVariables(); - for (LocalVariable l : lv) { - InstructionHandle start = il.findHandle(l.getStartPC()); - InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength()); - // Repair malformed handles - if (null == start) { - start = il.getStart(); - } - if (null == end) { - end = il.getEnd(); - } - addLocalVariable(l.getName(), Type.getType(l.getSignature()), l - .getIndex(), start, end); - } } else { addCodeAttribute(a); } diff --git a/src/test/java/org/apache/commons/bcel6/PLSETestCase.java b/src/test/java/org/apache/commons/bcel6/PLSETestCase.java index 17303cac..06fa7937 100644 --- a/src/test/java/org/apache/commons/bcel6/PLSETestCase.java +++ b/src/test/java/org/apache/commons/bcel6/PLSETestCase.java @@ -19,6 +19,7 @@ package org.apache.commons.bcel6; import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.LocalVariableTable; import org.apache.commons.bcel6.classfile.Method; import org.apache.commons.bcel6.generic.ClassGen; import org.apache.commons.bcel6.generic.ConstantPoolGen; @@ -43,4 +44,22 @@ public class PLSETestCase extends AbstractTestCase // currently, this will cause null pointer exception mg.getLocalVariableTable(pool); } + + /** + * BCEL-79: + */ + public void testB79() throws ClassNotFoundException + { + JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.PLSETestClass"); + ClassGen gen = new ClassGen(clazz); + ConstantPoolGen pool = gen.getConstantPool(); + Method m = gen.getMethodAt(2); + LocalVariableTable lvt = m.getLocalVariableTable(); + //System.out.println(lvt); + //System.out.println(lvt.getTableLength()); + MethodGen mg = new MethodGen(m, gen.getClassName(), pool); + LocalVariableTable new_lvt = mg.getLocalVariableTable(mg.getConstantPool()); + //System.out.println(new_lvt); + assertEquals("number of locals", lvt.getTableLength(), new_lvt.getTableLength()); + } } diff --git a/src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java b/src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java index 1f1a79b4..73ca9dfb 100644 --- a/src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java +++ b/src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java @@ -18,6 +18,8 @@ package org.apache.commons.bcel6.data; +import java.util.ArrayList; + public class PLSETestClass { public void meth1(int arg1) @@ -25,4 +27,10 @@ public class PLSETestClass @SuppressWarnings("unused") int local1 = arg1; } + + public void meth2(int arg1, ArrayList arg2, int arg3) + { + @SuppressWarnings("unused") + int local1 = arg1; + } } -- GitLab From 5813218a5fe6fa3f62e12b8cdf00ee6a1dc992b3 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sat, 15 Aug 2015 23:10:55 +0000 Subject: [PATCH 0870/1313] findbugs-maven-plugin 3.0.1 -> 3.0.2 on Java 7. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696108 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 10284e0d..51942b04 100644 --- a/pom.xml +++ b/pom.xml @@ -354,7 +354,7 @@ [1.7,) - 3.0.1 + 3.0.2 -- GitLab From 9f307d3947513e9008eda54b9d9dfdcdf76b4031 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 07:51:45 +0000 Subject: [PATCH 0871/1313] BCEL-110 Problem with JAXB if the bcel classloader is used; remove the broken ClassLoader class git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696114 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 2 +- src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index fedd4472..b7258639 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -64,7 +64,7 @@ The type attribute can be add,update,fix,remove. Remove deprecated methods and classes - Problem with JAXB if the bcel classloader is used + Problem with JAXB if the bcel classloader is used; remove the broken ClassLoader class modify several toString methods to make output similar to "javap" add javadoc comments to LineNumber.java and LineNumberTable.java Need to check for an empty InstructionList diff --git a/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java b/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java index 39e0a7bb..1873b489 100644 --- a/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java +++ b/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java @@ -28,8 +28,7 @@ import java.lang.reflect.Modifier; * *
    java org.apache.commons.bcel6.util.JavaWrapper <real.class.name> [arguments]
    * - *

    To use your own class loader you can set the "bcel.classloader" system property - * which defaults to "org.apache.commons.bcel6.util.ClassLoader", e.g., with:

    + *

    To use your own class loader you can set the "bcel.classloader" system property

    *

    java org.apache.commons.bcel6.util.JavaWrapper -Dbcel.classloader=foo.MyLoader <real.class.name> [arguments]
    * * @version $Id$ @@ -43,7 +42,7 @@ public class JavaWrapper { private static java.lang.ClassLoader getClassLoader() { String s = System.getProperty("bcel.classloader"); if ((s == null) || "".equals(s)) { - s = "org.apache.commons.bcel6.util.ClassLoader"; + throw new IllegalArgumentException("The property 'bcel.classloader' must be defined"); } try { return (java.lang.ClassLoader) Class.forName(s).newInstance(); -- GitLab From ada936f5830048fca57b9bac3fd6ffdeabffa753 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 07:53:03 +0000 Subject: [PATCH 0872/1313] Javadoc (also reduces editing when package name changes) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696115 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/ConstantClass.java | 3 +-- .../org/apache/commons/bcel6/classfile/ConstantDouble.java | 3 +-- .../java/org/apache/commons/bcel6/classfile/ConstantFloat.java | 3 +-- .../org/apache/commons/bcel6/classfile/ConstantInteger.java | 3 +-- .../apache/commons/bcel6/classfile/ConstantInvokeDynamic.java | 3 +-- .../java/org/apache/commons/bcel6/classfile/ConstantLong.java | 3 +-- .../apache/commons/bcel6/classfile/ConstantMethodHandle.java | 3 +-- .../org/apache/commons/bcel6/classfile/ConstantMethodType.java | 3 +-- .../apache/commons/bcel6/classfile/ConstantNameAndType.java | 3 +-- .../org/apache/commons/bcel6/classfile/ConstantString.java | 3 +-- .../java/org/apache/commons/bcel6/classfile/ConstantUtf8.java | 3 +-- 11 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java index 559e8906..f4c83864 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java @@ -24,8 +24,7 @@ import java.io.IOException; import org.apache.commons.bcel6.Constants; /** - * This class is derived from the abstract - * Constant class + * This class is derived from the abstract {@link Constant} * and represents a reference to a (external) class. * * @version $Id$ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java index bf6f7e27..f863cd63 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java @@ -24,8 +24,7 @@ import java.io.IOException; import org.apache.commons.bcel6.Constants; /** - * This class is derived from the abstract - * Constant class + * This class is derived from the abstract {@link Constant} * and represents a reference to a Double object. * * @version $Id$ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java index 32607977..bd35dcb1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java @@ -24,8 +24,7 @@ import java.io.IOException; import org.apache.commons.bcel6.Constants; /** - * This class is derived from the abstract - * Constant class + * This class is derived from the abstract {@link Constant} * and represents a reference to a float object. * * @version $Id$ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java index 6a019557..8a693fd2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java @@ -24,8 +24,7 @@ import java.io.IOException; import org.apache.commons.bcel6.Constants; /** - * This class is derived from the abstract - * Constant class + * This class is derived from the abstract {@link Constant} * and represents a reference to an int object. * * @version $Id$ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java index 2e3e0af2..049174f7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java @@ -23,8 +23,7 @@ import java.io.IOException; import org.apache.commons.bcel6.Constants; /** - * This class is derived from the abstract - * Constant class + * This class is derived from the abstract {@link Constant} * and represents a reference to a invoke dynamic. * * @see Constant diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java index f04875f8..bf3728b2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java @@ -24,8 +24,7 @@ import java.io.IOException; import org.apache.commons.bcel6.Constants; /** - * This class is derived from the abstract - * Constant class + * This class is derived from the abstract {@link Constant} * and represents a reference to a long object. * * @version $Id$ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java index 8a892856..6330daa1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java @@ -24,8 +24,7 @@ import java.io.IOException; import org.apache.commons.bcel6.Constants; /** - * This class is derived from the abstract - * Constant class + * This class is derived from the abstract {@link Constant} * and represents a reference to a method handle. * * @see Constant diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java index f30e047f..fb7cf7bd 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java @@ -24,8 +24,7 @@ import java.io.IOException; import org.apache.commons.bcel6.Constants; /** - * This class is derived from the abstract - * Constant class + * This class is derived from the abstract {@link Constant} * and represents a reference to a method type. * * @see Constant diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java index cfddcd9a..c033ca55 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java @@ -24,8 +24,7 @@ import java.io.IOException; import org.apache.commons.bcel6.Constants; /** - * This class is derived from the abstract - * Constant class + * This class is derived from the abstract {@link Constant} * and represents a reference to the name and signature * of a field or method. * diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java index 417cbc13..523ad149 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java @@ -24,8 +24,7 @@ import java.io.IOException; import org.apache.commons.bcel6.Constants; /** - * This class is derived from the abstract - * Constant class + * This class is derived from the abstract {@link Constant} * and represents a reference to a String object. * * @version $Id$ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java index ad3bf0ee..c463440c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java @@ -27,8 +27,7 @@ import java.util.Map; import org.apache.commons.bcel6.Constants; /** - * This class is derived from the abstract - * Constant class + * This class is derived from the abstract {@link Constant} * and represents a reference to a Utf8 encoded string. * * @version $Id$ -- GitLab From 4fa90b7f234002ee9e90f2d3f4659157bee8ba28 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 08:18:12 +0000 Subject: [PATCH 0873/1313] Extract common test package base name and eliminate dependency on actual package name git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696116 13f79535-47bb-0310-9956-ffa450edef68 --- .../verifier/tests/TestArrayAccess02Creator.java | 12 ++++++------ .../verifier/tests/TestArrayAccess03Creator.java | 12 ++++++------ .../verifier/tests/TestArrayAccess04Creator.java | 6 +++--- .../commons/bcel6/verifier/tests/TestCreator.java | 3 +++ .../bcel6/verifier/tests/TestReturn01Creator.java | 6 +++--- .../bcel6/verifier/tests/TestReturn03Creator.java | 6 +++--- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java index 455a3e9c..200645e3 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java @@ -39,7 +39,7 @@ public class TestArrayAccess02Creator extends TestCreator { private ClassGen _cg; public TestArrayAccess02Creator() { - _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", "java.lang.Object", "TestArrayAccess02.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess02", "java.lang.Object", "TestArrayAccess02.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -54,7 +54,7 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestArrayAccess02", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -69,11 +69,11 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "test", TEST_PACKAGE+".TestArrayAccess02", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); Assert.assertNotNull(ih_0); // TODO why is this not used - il.append(_factory.createNewArray(new ObjectType("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02"), (short) 1)); + il.append(_factory.createNewArray(new ObjectType(TEST_PACKAGE+".TestArrayAccess02"), (short) 1)); il.append(InstructionFactory.createStore(Type.OBJECT, 0)); InstructionHandle ih_5 = il.append(new PUSH(_cp, 1)); Assert.assertNotNull(ih_5); // TODO why is this not used @@ -82,9 +82,9 @@ public void create(OutputStream out) throws IOException { InstructionHandle ih_10 = il.append(InstructionFactory.createLoad(Type.OBJECT, 1)); Assert.assertNotNull(ih_10); // TODO why is this not used il.append(new PUSH(_cp, 0)); - il.append(_factory.createNew("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02")); + il.append(_factory.createNew(TEST_PACKAGE+".TestArrayAccess02")); il.append(InstructionConstants.DUP); - il.append(_factory.createInvoke("org.apache.commons.bcel6.verifier.tests.TestArrayAccess02", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(_factory.createInvoke(TEST_PACKAGE+".TestArrayAccess02", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); il.append(InstructionConstants.AASTORE); InstructionHandle ih_20 = il.append(InstructionFactory.createReturn(Type.VOID)); Assert.assertNotNull(ih_20); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java index 1f34c59c..a6ced53d 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java @@ -39,7 +39,7 @@ public class TestArrayAccess03Creator extends TestCreator { private ClassGen _cg; public TestArrayAccess03Creator() { - _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", "java.lang.Object", "TestArrayAccess03.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess03", "java.lang.Object", "TestArrayAccess03.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -54,7 +54,7 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestArrayAccess03", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -69,18 +69,18 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", TEST_PACKAGE+".TestArrayAccess03", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); Assert.assertNotNull(ih_0); // TODO why is this not used - il.append(_factory.createNewArray(new ObjectType("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03"), (short) 1)); + il.append(_factory.createNewArray(new ObjectType(TEST_PACKAGE+".TestArrayAccess03"), (short) 1)); il.append(InstructionFactory.createStore(Type.OBJECT, 1)); InstructionHandle ih_5 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_5); // TODO why is this not used il.append(new PUSH(_cp, 0)); - il.append(_factory.createNew("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03")); + il.append(_factory.createNew(TEST_PACKAGE+".TestArrayAccess03")); il.append(InstructionConstants.DUP); - il.append(_factory.createInvoke("org.apache.commons.bcel6.verifier.tests.TestArrayAccess03", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(_factory.createInvoke(TEST_PACKAGE+".TestArrayAccess03", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); il.append(InstructionConstants.AASTORE); InstructionHandle ih_15 = il.append(InstructionFactory.createReturn(Type.VOID)); Assert.assertNotNull(ih_15); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java index 3782c573..2053350e 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java @@ -37,7 +37,7 @@ public class TestArrayAccess04Creator extends TestCreator { private ClassGen _cg; public TestArrayAccess04Creator() { - _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", "java.lang.Object", "TestArrayAccess04.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess04", "java.lang.Object", "TestArrayAccess04.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -52,7 +52,7 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestArrayAccess04", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -67,7 +67,7 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", "org.apache.commons.bcel6.verifier.tests.TestArrayAccess04", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", TEST_PACKAGE+".TestArrayAccess04", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); Assert.assertNotNull(ih_0); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestCreator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestCreator.java index 8dc1c925..1ae14722 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestCreator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestCreator.java @@ -25,6 +25,9 @@ import java.net.URISyntaxException; */ public abstract class TestCreator { + // Common package base name for generated test classes + protected static final String TEST_PACKAGE = TestCreator.class.getPackage().getName(); + public void create() throws IOException { File classFile = new File(getPackageFolder(), getClassName()); FileOutputStream out = new FileOutputStream(classFile); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java index c72b6ca4..af8e6a45 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java @@ -37,7 +37,7 @@ public class TestReturn01Creator extends TestCreator { private ClassGen _cg; public TestReturn01Creator() { - _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestReturn01", "java.lang.Object", "TestReturn01.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + _cg = new ClassGen(TEST_PACKAGE+".TestReturn01", "java.lang.Object", "TestReturn01.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -52,7 +52,7 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestReturn01", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestReturn01", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -67,7 +67,7 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "foo", "org.apache.commons.bcel6.verifier.tests.TestReturn01", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "foo", TEST_PACKAGE+".TestReturn01", il, _cp); InstructionHandle ih_0 = il.append(_factory.createNew("java.lang.Object")); Assert.assertNotNull(ih_0); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java index 9bf67895..fdc47295 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java @@ -37,7 +37,7 @@ public class TestReturn03Creator extends TestCreator { private ClassGen _cg; public TestReturn03Creator() { - _cg = new ClassGen("org.apache.commons.bcel6.verifier.tests.TestReturn03", "java.lang.Object", "TestReturn03.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + _cg = new ClassGen(TEST_PACKAGE+".TestReturn03", "java.lang.Object", "TestReturn03.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -52,7 +52,7 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", "org.apache.commons.bcel6.verifier.tests.TestReturn03", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -67,7 +67,7 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.INT, Type.NO_ARGS, new String[] { }, "test3", "org.apache.commons.bcel6.verifier.tests.TestReturn03", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.INT, Type.NO_ARGS, new String[] { }, "test3", TEST_PACKAGE+".TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(InstructionConstants.ACONST_NULL); Assert.assertNotNull(ih_0); // TODO why is this not used -- GitLab From e163353e0d55f295c77a6c59fc91a0ce188ef14b Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 08:26:08 +0000 Subject: [PATCH 0874/1313] Eliminate dependency on actual package name git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696117 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/verifier/AbstractVerifierTestCase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java b/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java index e6f0b509..25e1986e 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java @@ -28,7 +28,7 @@ import junit.framework.TestCase; public abstract class AbstractVerifierTestCase extends TestCase { - public static final String TEST_PACKAGE = "org.apache.commons.bcel6.verifier.tests."; + public static final String TEST_PACKAGE = AbstractVerifierTestCase.class.getPackage().getName() + ".tests."; /** * Asserts that the verification of the given class is OK. If it isn't it throws an AssertionFailedError with the given message. -- GitLab From 3006f1b716c6d56f0915e8ee57e78dee2d19ccff Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 08:26:46 +0000 Subject: [PATCH 0875/1313] Extract common test package base name and eliminate dependency on actual package name git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696118 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/AbstractTestCase.java | 2 ++ .../apache/commons/bcel6/AnonymousClassTestCase.java | 6 +++--- .../bcel6/EnclosingMethodAttributeTestCase.java | 6 +++--- .../apache/commons/bcel6/EnumAccessFlagTestCase.java | 4 ++-- .../commons/bcel6/FieldAnnotationsTestCase.java | 6 +++--- .../commons/bcel6/InstructionFinderTestCase.java | 2 +- .../java/org/apache/commons/bcel6/PLSETestCase.java | 4 ++-- .../generic/GeneratingAnnotatedClassesTestCase.java | 12 ++++++------ 8 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java b/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java index 302bcd40..8dac1a09 100644 --- a/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java @@ -41,6 +41,8 @@ public abstract class AbstractTestCase extends TestCase { private static final boolean verbose = false; + protected static final String PACKAGE_BASE_NAME = AbstractTestCase.class.getPackage().getName(); + protected File createTestdataFile(String name) { return new File("target" + File.separator + "testdata" + File.separator diff --git a/src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java b/src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java index 23bc1179..71b89070 100644 --- a/src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java @@ -33,7 +33,7 @@ public class AnonymousClassTestCase extends AbstractTestCase public void testNamedInnerClassIsNotAnonymous() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnonymousClassTest$X"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.AnonymousClassTest$X"); assertFalse("regular inner classes are not anonymous", clazz .isAnonymous()); assertTrue("regular inner classes are nested", clazz.isNested()); @@ -42,7 +42,7 @@ public class AnonymousClassTestCase extends AbstractTestCase public void testStaticInnerClassIsNotAnonymous() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnonymousClassTest$Y"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.AnonymousClassTest$Y"); assertFalse("regular static inner classes are not anonymous", clazz .isAnonymous()); assertTrue("regular static inner classes are nested", clazz.isNested()); @@ -51,7 +51,7 @@ public class AnonymousClassTestCase extends AbstractTestCase public void testAnonymousInnerClassIsAnonymous() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnonymousClassTest$1"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.AnonymousClassTest$1"); assertTrue("anonymous inner classes are anonymous", clazz.isAnonymous()); assertTrue("anonymous inner classes are anonymous", clazz.isNested()); } diff --git a/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java b/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java index a44b3377..2a37be5a 100644 --- a/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java @@ -37,7 +37,7 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase public void testCheckMethodLevelNamedInnerClass() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AttributeTestClassEM01$1S"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.AttributeTestClassEM01$1S"); ConstantPool pool = clazz.getConstantPool(); Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); assertTrue("Expected 1 EnclosingMethod attribute but found " @@ -60,7 +60,7 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase public void testCheckClassLevelNamedInnerClass() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AttributeTestClassEM02$1"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.AttributeTestClassEM02$1"); ConstantPool pool = clazz.getConstantPool(); Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); assertTrue("Expected 1 EnclosingMethod attribute but found " @@ -83,7 +83,7 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase public void testAttributeSerializtion() throws ClassNotFoundException, IOException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AttributeTestClassEM02$1"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.AttributeTestClassEM02$1"); ConstantPool pool = clazz.getConstantPool(); Attribute[] encMethodAttrs = findAttribute("EnclosingMethod", clazz); assertTrue("Expected 1 EnclosingMethod attribute but found " diff --git a/src/test/java/org/apache/commons/bcel6/EnumAccessFlagTestCase.java b/src/test/java/org/apache/commons/bcel6/EnumAccessFlagTestCase.java index 9bd3ed61..22cc7aba 100644 --- a/src/test/java/org/apache/commons/bcel6/EnumAccessFlagTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/EnumAccessFlagTestCase.java @@ -29,11 +29,11 @@ public class EnumAccessFlagTestCase extends AbstractTestCase */ public void testEnumClassSaysItIs() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.SimpleEnum"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.SimpleEnum"); assertTrue( "Expected SimpleEnum class to say it was an enum - but it didn't !", clazz.isEnum()); - clazz = getTestClass("org.apache.commons.bcel6.data.SimpleClass"); + clazz = getTestClass(PACKAGE_BASE_NAME+".data.SimpleClass"); assertTrue( "Expected SimpleClass class to say it was not an enum - but it didn't !", !clazz.isEnum()); diff --git a/src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java b/src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java index 399d56f3..7d0a0305 100644 --- a/src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java @@ -37,7 +37,7 @@ public class FieldAnnotationsTestCase extends AbstractTestCase */ public void testFieldAnnotationEntrys() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnnotatedFields"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.AnnotatedFields"); // TODO L...;? checkAnnotatedField(clazz, "i", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "1"); checkAnnotatedField(clazz, "s", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "2"); @@ -49,7 +49,7 @@ public class FieldAnnotationsTestCase extends AbstractTestCase public void testFieldAnnotationEntrysReadWrite() throws ClassNotFoundException, IOException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnnotatedFields"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.AnnotatedFields"); checkAnnotatedField(clazz, "i", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "1"); checkAnnotatedField(clazz, "s", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "2"); // Write it out @@ -70,7 +70,7 @@ public class FieldAnnotationsTestCase extends AbstractTestCase throws ClassNotFoundException { boolean dbg = false; - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnnotatedFields"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.AnnotatedFields"); ClassGen clg = new ClassGen(clazz); Field f = clg.getFields()[0]; if (dbg) { diff --git a/src/test/java/org/apache/commons/bcel6/InstructionFinderTestCase.java b/src/test/java/org/apache/commons/bcel6/InstructionFinderTestCase.java index a5a35635..64a69bba 100644 --- a/src/test/java/org/apache/commons/bcel6/InstructionFinderTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/InstructionFinderTestCase.java @@ -30,7 +30,7 @@ public class InstructionFinderTestCase extends AbstractTestCase { public void testSearchAll() throws Exception { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.util.InstructionFinder"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".util.InstructionFinder"); Method[] methods = clazz.getMethods(); Method searchM = null; for (Method m : methods) diff --git a/src/test/java/org/apache/commons/bcel6/PLSETestCase.java b/src/test/java/org/apache/commons/bcel6/PLSETestCase.java index 06fa7937..f4dd1a3c 100644 --- a/src/test/java/org/apache/commons/bcel6/PLSETestCase.java +++ b/src/test/java/org/apache/commons/bcel6/PLSETestCase.java @@ -34,7 +34,7 @@ public class PLSETestCase extends AbstractTestCase */ public void testB208() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.PLSETestClass"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.PLSETestClass"); ClassGen gen = new ClassGen(clazz); ConstantPoolGen pool = gen.getConstantPool(); Method m = gen.getMethodAt(1); @@ -50,7 +50,7 @@ public class PLSETestCase extends AbstractTestCase */ public void testB79() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.PLSETestClass"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.PLSETestClass"); ClassGen gen = new ClassGen(clazz); ConstantPoolGen pool = gen.getConstantPool(); Method m = gen.getMethodAt(2); diff --git a/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java index 276b66cd..2a8dad2b 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java @@ -217,7 +217,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase public void testTransformClassToClassGen_SimpleTypes() throws ClassNotFoundException { - JavaClass jc = getTestClass("org.apache.commons.bcel6.data.SimpleAnnotatedClass"); + JavaClass jc = getTestClass(PACKAGE_BASE_NAME+".data.SimpleAnnotatedClass"); ClassGen cgen = new ClassGen(jc); // Check annotations are correctly preserved AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); @@ -232,7 +232,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase public void testTransformClassToClassGen_EnumType() throws ClassNotFoundException { - JavaClass jc = getTestClass("org.apache.commons.bcel6.data.AnnotatedWithEnumClass"); + JavaClass jc = getTestClass(PACKAGE_BASE_NAME+".data.AnnotatedWithEnumClass"); ClassGen cgen = new ClassGen(jc); // Check annotations are correctly preserved AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); @@ -247,7 +247,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase public void testTransformClassToClassGen_ArrayAndAnnotationTypes() throws ClassNotFoundException { - JavaClass jc = getTestClass("org.apache.commons.bcel6.data.AnnotatedWithCombinedAnnotation"); + JavaClass jc = getTestClass(PACKAGE_BASE_NAME+".data.AnnotatedWithCombinedAnnotation"); ClassGen cgen = new ClassGen(jc); // Check annotations are correctly preserved AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); @@ -354,7 +354,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase public void testTransformComplexClassToClassGen() throws ClassNotFoundException { - JavaClass jc = getTestClass("org.apache.commons.bcel6.data.ComplexAnnotatedClass"); + JavaClass jc = getTestClass(PACKAGE_BASE_NAME+".data.ComplexAnnotatedClass"); ClassGen cgen = new ClassGen(jc); // Check annotations are correctly preserved AnnotationEntryGen[] annotations = cgen.getAnnotationEntries(); @@ -382,7 +382,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase */ public void testModifyingClasses1() throws ClassNotFoundException { - JavaClass jc = getTestClass("org.apache.commons.bcel6.data.SimpleAnnotatedClass"); + JavaClass jc = getTestClass(PACKAGE_BASE_NAME+".data.SimpleAnnotatedClass"); ClassGen cgen = new ClassGen(jc); ConstantPoolGen cp = cgen.getConstantPool(); cgen.addAnnotationEntry(createFruitAnnotation(cp, "Pineapple")); @@ -399,7 +399,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase */ public void testModifyingClasses2() throws ClassNotFoundException { - JavaClass jc = getTestClass("org.apache.commons.bcel6.data.SimpleAnnotatedClass"); + JavaClass jc = getTestClass(PACKAGE_BASE_NAME+".data.SimpleAnnotatedClass"); ClassGen cgen = new ClassGen(jc); ConstantPoolGen cp = cgen.getConstantPool(); cgen.addAnnotationEntry(createCombinedAnnotation(cp)); -- GitLab From a435e2e9bc1ab2883e64d055163cedc8b6b073fa Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 08:41:38 +0000 Subject: [PATCH 0876/1313] Extract common test package base name and eliminate dependency on actual package name git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696119 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/AbstractTestCase.java | 3 +++ .../bcel6/EnclosingMethodAttributeTestCase.java | 12 ++++++------ .../commons/bcel6/FieldAnnotationsTestCase.java | 12 ++++++------ .../generic/GeneratingAnnotatedClassesTestCase.java | 4 ++-- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java b/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java index 8dac1a09..8532ac39 100644 --- a/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java @@ -43,6 +43,9 @@ public abstract class AbstractTestCase extends TestCase protected static final String PACKAGE_BASE_NAME = AbstractTestCase.class.getPackage().getName(); + // package base name in signature format, i.e. with '/' separators instead of '.' + protected static final String PACKAGE_BASE_SIG = PACKAGE_BASE_NAME.replace('.', '/'); + protected File createTestdataFile(String name) { return new File("target" + File.separator + "testdata" + File.separator diff --git a/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java b/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java index 2a37be5a..a3e3ad53 100644 --- a/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java @@ -46,9 +46,9 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase String enclosingClassName = em.getEnclosingClass().getBytes(pool); String enclosingMethodName = em.getEnclosingMethod().getName(pool); assertTrue( - "Expected class name to be 'org/apache/commons/bcel6/data/AttributeTestClassEM01' but was " + "Expected class name to be '"+PACKAGE_BASE_SIG+"/data/AttributeTestClassEM01' but was " + enclosingClassName, enclosingClassName - .equals("org/apache/commons/bcel6/data/AttributeTestClassEM01")); + .equals(PACKAGE_BASE_SIG+"/data/AttributeTestClassEM01")); assertTrue("Expected method name to be 'main' but was " + enclosingMethodName, enclosingMethodName.equals("main")); } @@ -72,9 +72,9 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase + em.getEnclosingMethodIndex(), em .getEnclosingMethodIndex() == 0); assertTrue( - "Expected class name to be 'org/apache/commons/bcel6/data/AttributeTestClassEM02' but was " + "Expected class name to be '"+PACKAGE_BASE_SIG+"/data/AttributeTestClassEM02' but was " + enclosingClassName, enclosingClassName - .equals("org/apache/commons/bcel6/data/AttributeTestClassEM02")); + .equals(PACKAGE_BASE_SIG+"/data/AttributeTestClassEM02")); } /** @@ -102,9 +102,9 @@ public class EnclosingMethodAttributeTestCase extends AbstractTestCase + em.getEnclosingMethodIndex(), em .getEnclosingMethodIndex() == 0); assertTrue( - "Expected class name to be 'org/apache/commons/bcel6/data/AttributeTestClassEM02' but was " + "Expected class name to be '"+PACKAGE_BASE_SIG+"/data/AttributeTestClassEM02' but was " + enclosingClassName, enclosingClassName - .equals("org/apache/commons/bcel6/data/AttributeTestClassEM02")); + .equals(PACKAGE_BASE_SIG+"/data/AttributeTestClassEM02")); tfile.deleteOnExit(); } } \ No newline at end of file diff --git a/src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java b/src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java index 7d0a0305..7d282e0c 100644 --- a/src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java @@ -39,8 +39,8 @@ public class FieldAnnotationsTestCase extends AbstractTestCase { JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.AnnotatedFields"); // TODO L...;? - checkAnnotatedField(clazz, "i", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "1"); - checkAnnotatedField(clazz, "s", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "2"); + checkAnnotatedField(clazz, "i", "L"+PACKAGE_BASE_SIG+"/data/SimpleAnnotation;", "id", "1"); + checkAnnotatedField(clazz, "s", "L"+PACKAGE_BASE_SIG+"/data/SimpleAnnotation;", "id", "2"); } /** @@ -50,15 +50,15 @@ public class FieldAnnotationsTestCase extends AbstractTestCase IOException { JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.AnnotatedFields"); - checkAnnotatedField(clazz, "i", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "1"); - checkAnnotatedField(clazz, "s", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "2"); + checkAnnotatedField(clazz, "i", "L"+PACKAGE_BASE_SIG+"/data/SimpleAnnotation;", "id", "1"); + checkAnnotatedField(clazz, "s", "L"+PACKAGE_BASE_SIG+"/data/SimpleAnnotation;", "id", "2"); // Write it out File tfile = createTestdataFile("AnnotatedFields.class"); clazz.dump(tfile); SyntheticRepository repos2 = createRepos("."); repos2.loadClass("AnnotatedFields"); - checkAnnotatedField(clazz, "i", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "1"); - checkAnnotatedField(clazz, "s", "Lorg/apache/commons/bcel6/data/SimpleAnnotation;", "id", "2"); + checkAnnotatedField(clazz, "i", "L"+PACKAGE_BASE_SIG+"/data/SimpleAnnotation;", "id", "1"); + checkAnnotatedField(clazz, "s", "L"+PACKAGE_BASE_SIG+"/data/SimpleAnnotation;", "id", "2"); assertTrue(tfile.delete()); } diff --git a/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java index 2a8dad2b..b5e17fda 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java @@ -270,10 +270,10 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase + innerValue, innerValue instanceof AnnotationElementValueGen); AnnotationElementValueGen innerAnnotationValue = (AnnotationElementValueGen) innerValue; - assertTrue("Should be called Lorg/apache/commons/bcel6/data/SimpleAnnotation; but is called: " + assertTrue("Should be called L"+PACKAGE_BASE_SIG+"/data/SimpleAnnotation; but is called: " + innerAnnotationValue.getAnnotation().getTypeName(), innerAnnotationValue.getAnnotation().getTypeSignature().equals( - "Lorg/apache/commons/bcel6/data/SimpleAnnotation;")); + "L"+PACKAGE_BASE_SIG+"/data/SimpleAnnotation;")); // check the three methods Method[] methods = cgen.getMethods(); -- GitLab From e0285cafe563f8ffbfc04dacf052c39489953819 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 08:44:59 +0000 Subject: [PATCH 0877/1313] Extract common test package base name and eliminate dependency on actual package name git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696120 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/AnnotationAccessFlagTestCase.java | 4 ++-- .../commons/bcel6/AnnotationDefaultAttributeTestCase.java | 2 +- .../java/org/apache/commons/bcel6/AnonymousClassTestCase.java | 2 +- .../java/org/apache/commons/bcel6/CounterVisitorTestCase.java | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/apache/commons/bcel6/AnnotationAccessFlagTestCase.java b/src/test/java/org/apache/commons/bcel6/AnnotationAccessFlagTestCase.java index e40d64c5..eac7f95c 100644 --- a/src/test/java/org/apache/commons/bcel6/AnnotationAccessFlagTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AnnotationAccessFlagTestCase.java @@ -29,11 +29,11 @@ public class AnnotationAccessFlagTestCase extends AbstractTestCase */ public void testAnnotationClassSaysItIs() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.SimpleAnnotation"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.SimpleAnnotation"); assertTrue( "Expected SimpleAnnotation class to say it was an annotation - but it didn't !", clazz.isAnnotation()); - clazz = getTestClass("org.apache.commons.bcel6.data.SimpleClass"); + clazz = getTestClass(PACKAGE_BASE_NAME+".data.SimpleClass"); assertTrue( "Expected SimpleClass class to say it was not an annotation - but it didn't !", !clazz.isAnnotation()); diff --git a/src/test/java/org/apache/commons/bcel6/AnnotationDefaultAttributeTestCase.java b/src/test/java/org/apache/commons/bcel6/AnnotationDefaultAttributeTestCase.java index b9ed1068..592e0f21 100644 --- a/src/test/java/org/apache/commons/bcel6/AnnotationDefaultAttributeTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AnnotationDefaultAttributeTestCase.java @@ -33,7 +33,7 @@ public class AnnotationDefaultAttributeTestCase extends AbstractTestCase */ public void testMethodAnnotations() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.SimpleAnnotation"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.SimpleAnnotation"); Method m = getMethod(clazz, "fruit"); AnnotationDefault a = (AnnotationDefault) findAttribute( "AnnotationDefault", m.getAttributes()); diff --git a/src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java b/src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java index 71b89070..5b5ad895 100644 --- a/src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java @@ -24,7 +24,7 @@ public class AnonymousClassTestCase extends AbstractTestCase { public void testRegularClassIsNotAnonymous() throws ClassNotFoundException { - JavaClass clazz = getTestClass("org.apache.commons.bcel6.data.AnonymousClassTest"); + JavaClass clazz = getTestClass(PACKAGE_BASE_NAME+".data.AnonymousClassTest"); assertFalse("regular outer classes are not anonymous", clazz .isAnonymous()); assertFalse("regular outer classes are not nested", clazz.isNested()); diff --git a/src/test/java/org/apache/commons/bcel6/CounterVisitorTestCase.java b/src/test/java/org/apache/commons/bcel6/CounterVisitorTestCase.java index 20ee8546..31db773a 100644 --- a/src/test/java/org/apache/commons/bcel6/CounterVisitorTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/CounterVisitorTestCase.java @@ -25,7 +25,7 @@ public class CounterVisitorTestCase extends AbstractCounterVisitorTestCase @Override protected JavaClass getTestClass() throws ClassNotFoundException { - return getTestClass("org.apache.commons.bcel6.data.MarkedType"); + return getTestClass(PACKAGE_BASE_NAME+".data.MarkedType"); } public void testAnnotationsCount() -- GitLab From dc1e924a78c7f650373114adf210495deb59091e Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 08:53:32 +0000 Subject: [PATCH 0878/1313] Eliminate dependency on actual package name git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696124 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/verifier/structurals/InstConstraintVisitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java index b095f11e..cbde3eb6 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java @@ -52,7 +52,7 @@ import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; */ public class InstConstraintVisitor extends EmptyVisitor{ - private static final ObjectType GENERIC_ARRAY = ObjectType.getInstance("org.apache.commons.bcel6.verifier.structurals.GenericArray"); + private static final ObjectType GENERIC_ARRAY = ObjectType.getInstance(GenericArray.class.getName()); /** * The constructor. Constructs a new instance of this class. -- GitLab From e3871934f7683bb73427a404751e58ee1e0f76a5 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 08:54:53 +0000 Subject: [PATCH 0879/1313] Eliminate dependency on actual package name git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696125 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/verifier/structurals/InstConstraintVisitor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java index cbde3eb6..6b39b5ea 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java @@ -47,7 +47,7 @@ import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; * MONITOREXIT) is not modeled in JustIce. * * @version $Id$ - * @see org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException + * @see StructuralCodeConstraintException * @see org.apache.commons.bcel6.verifier.exc.LinkingConstraintException */ public class InstConstraintVisitor extends EmptyVisitor{ @@ -104,7 +104,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * This method is called by the visitXXX() to notify the acceptor of this InstConstraintVisitor * that a constraint violation has occured. This is done by throwing an instance of a * StructuralCodeConstraintException. - * @throws org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException always. + * @throws StructuralCodeConstraintException always. */ private void constraintViolated(Instruction violator, String description){ String fq_classname = violator.getClass().getName(); -- GitLab From fe0d947a79a3abddacbfe06eff1e3763b4f1fa04 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 08:55:13 +0000 Subject: [PATCH 0880/1313] Not used git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696126 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/verifier/structurals/InstConstraintVisitor.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java index 6b39b5ea..c5e201bd 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java @@ -48,7 +48,6 @@ import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; * * @version $Id$ * @see StructuralCodeConstraintException - * @see org.apache.commons.bcel6.verifier.exc.LinkingConstraintException */ public class InstConstraintVisitor extends EmptyVisitor{ -- GitLab From 3eb7299f4fad1fd95c13c81c7b67cdf2cc86b93d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 09:25:33 +0000 Subject: [PATCH 0881/1313] BCEL-110 Problem with JAXB if the bcel classloader is used; remove the broken ClassLoader class git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696127 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/ProxyCreator.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/examples/ProxyCreator.java b/src/examples/ProxyCreator.java index c55cdc4f..bd0fdc99 100644 --- a/src/examples/ProxyCreator.java +++ b/src/examples/ProxyCreator.java @@ -48,7 +48,6 @@ import org.apache.commons.bcel6.generic.Type; * * @version $Id$ * @see org.apache.commons.bcel6.util.JavaWrapper - * @see org.apache.commons.bcel6.util.ClassLoader * @see Utility */ public class ProxyCreator { -- GitLab From e5c57a2772dad4241818f1459dbef9dba8026718 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 09:46:49 +0000 Subject: [PATCH 0882/1313] TODO broken git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696128 13f79535-47bb-0310-9956-ffa450edef68 --- src/examples/ProxyCreator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/examples/ProxyCreator.java b/src/examples/ProxyCreator.java index bd0fdc99..0a57e724 100644 --- a/src/examples/ProxyCreator.java +++ b/src/examples/ProxyCreator.java @@ -75,7 +75,7 @@ public class ProxyCreator { ClassLoader loader = ProxyCreator.class.getClassLoader(); // instanceof won't work here ... - if (loader.getClass().toString().equals("class org.apache.commons.bcel6.util.ClassLoader")) { + if (loader.getClass().toString().equals("class org.apache.commons.bcel6.util.ClassLoader")) { // TODO this is broken; cannot ever be true // Real class name will be set by the class loader ClassGen cg = new ClassGen("foo", "java.lang.Object", "", Constants.ACC_PUBLIC, new String[]{"java.awt.event.ActionListener"}); -- GitLab From 90b7963da1181d0053f53bd30f005dfafbf92d5b Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 10:01:44 +0000 Subject: [PATCH 0883/1313] Whitespace git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696129 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/verifier/tests/TestArrayAccess04Creator.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java index 2053350e..f035318f 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java @@ -14,7 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. * - */package org.apache.commons.bcel6.verifier.tests; + */ + +package org.apache.commons.bcel6.verifier.tests; import java.io.IOException; import java.io.OutputStream; -- GitLab From d610f9eb45e70031eea4f568c175801fed53f9c4 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 10:04:04 +0000 Subject: [PATCH 0884/1313] Don't use full package name unnecessarily git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696130 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/Repository.java | 2 +- .../commons/bcel6/classfile/JavaClass.java | 2 +- .../commons/bcel6/classfile/Unknown.java | 4 ++-- .../commons/bcel6/generic/BasicType.java | 2 +- .../commons/bcel6/verifier/PassVerifier.java | 2 +- .../commons/bcel6/verifier/Verifier.java | 4 ++-- .../bcel6/verifier/VerifierFactory.java | 2 +- .../verifier/VerifierFactoryListModel.java | 2 +- .../bcel6/verifier/statics/Pass1Verifier.java | 2 +- .../bcel6/verifier/statics/Pass2Verifier.java | 24 +++++++++---------- .../structurals/InstConstraintVisitor.java | 6 ++--- .../verifier/structurals/OperandStack.java | 2 +- .../verifier/structurals/Subroutine.java | 2 +- 13 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Repository.java b/src/main/java/org/apache/commons/bcel6/Repository.java index 26fc4d6f..3b1680c9 100644 --- a/src/main/java/org/apache/commons/bcel6/Repository.java +++ b/src/main/java/org/apache/commons/bcel6/Repository.java @@ -29,7 +29,7 @@ import org.apache.commons.bcel6.util.SyntheticRepository; * to SyntheticRepository with current class path by default. * * @see org.apache.commons.bcel6.util.Repository - * @see org.apache.commons.bcel6.util.SyntheticRepository + * @see SyntheticRepository * * @version $Id$ */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 2f978df5..8dc70bc0 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -430,7 +430,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** - * @return A org.apache.commons.bcel6.classfile.Method corresponding to + * @return A {@link Method} corresponding to * java.lang.reflect.Method if any */ public Method getMethod( java.lang.reflect.Method m ) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java index 0140292b..0277099a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java @@ -35,8 +35,8 @@ import org.apache.commons.bcel6.Constants; * * @version $Id$ - * @see org.apache.commons.bcel6.classfile.Attribute - * @see org.apache.commons.bcel6.classfile.UnknownAttributeReader + * @see Attribute + * @see UnknownAttributeReader */ public final class Unknown extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java index 70b4f221..42a8f157 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java @@ -33,7 +33,7 @@ public final class BasicType extends Type { * Constructor for basic types such as int, long, `void' * * @param type one of T_INT, T_BOOLEAN, ..., T_VOID - * @see org.apache.commons.bcel6.Constants + * @see Constants */ BasicType(byte type) { super(type, Constants.SHORT_TYPE_NAMES[type]); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java index aa600133..04209e9a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java @@ -42,7 +42,7 @@ import java.util.List; * pass you must use a new instance of a given PassVerifier. * * @version $Id$ - * @see org.apache.commons.bcel6.verifier.Verifier + * @see Verifier * @see #verify() */ public abstract class PassVerifier { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java index 5a834b97..13ef2a50 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java @@ -40,8 +40,8 @@ import org.apache.commons.bcel6.verifier.structurals.Pass3bVerifier; * Verifier instances are usually generated by the VerifierFactory. * * @version $Id$ - * @see org.apache.commons.bcel6.verifier.VerifierFactory - * @see org.apache.commons.bcel6.verifier.PassVerifier + * @see VerifierFactory + * @see PassVerifier */ public class Verifier { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java index 6d83c08e..6798452e 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java @@ -29,7 +29,7 @@ import java.util.Vector; * class name) there is exactly one Verifier. * * @version $Id$ - * @see org.apache.commons.bcel6.verifier.Verifier + * @see Verifier */ public class VerifierFactory { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java index fb7d07c6..0d57f23d 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java @@ -31,7 +31,7 @@ import javax.swing.event.ListDataListener; * * @version $Id$ */ -public class VerifierFactoryListModel implements org.apache.commons.bcel6.verifier.VerifierFactoryObserver, +public class VerifierFactoryListModel implements VerifierFactoryObserver, javax.swing.ListModel { private final List listeners = new ArrayList<>(); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java index 99c524ee..a8de1ed4 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java @@ -66,7 +66,7 @@ public final class Pass1Verifier extends PassVerifier{ /** * Should only be instantiated by a Verifier. * - * @see org.apache.commons.bcel6.verifier.Verifier + * @see Verifier */ public Pass1Verifier(Verifier owner){ myOwner = owner; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java index ba294da0..9588fc2f 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java @@ -144,7 +144,7 @@ public final class Pass2Verifier extends PassVerifier { * the "Code" array of methods in a few cases. Please * see the pass 3a documentation, too. * - * @see org.apache.commons.bcel6.verifier.statics.Pass3aVerifier + * @see Pass3aVerifier */ @Override public VerificationResult do_verify(){ @@ -336,19 +336,19 @@ public final class Pass2Verifier extends PassVerifier { cp = _jc.getConstantPool(); cplen = cp.getLength(); - CONST_Class = org.apache.commons.bcel6.classfile.ConstantClass.class; + CONST_Class = ConstantClass.class; /* - CONST_Fieldref = org.apache.commons.bcel6.classfile.ConstantFieldref.class; - CONST_Methodref = org.apache.commons.bcel6.classfile.ConstantMethodref.class; - CONST_InterfaceMethodref = org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref.class; + CONST_Fieldref = ConstantFieldref.class; + CONST_Methodref = ConstantMethodref.class; + CONST_InterfaceMethodref = ConstantInterfaceMethodref.class; */ - CONST_String = org.apache.commons.bcel6.classfile.ConstantString.class; - CONST_Integer = org.apache.commons.bcel6.classfile.ConstantInteger.class; - CONST_Float = org.apache.commons.bcel6.classfile.ConstantFloat.class; - CONST_Long = org.apache.commons.bcel6.classfile.ConstantLong.class; - CONST_Double = org.apache.commons.bcel6.classfile.ConstantDouble.class; - CONST_NameAndType = org.apache.commons.bcel6.classfile.ConstantNameAndType.class; - CONST_Utf8 = org.apache.commons.bcel6.classfile.ConstantUtf8.class; + CONST_String = ConstantString.class; + CONST_Integer = ConstantInteger.class; + CONST_Float = ConstantFloat.class; + CONST_Long = ConstantLong.class; + CONST_Double = ConstantDouble.class; + CONST_NameAndType = ConstantNameAndType.class; + CONST_Utf8 = ConstantUtf8.class; carrier = new DescendingVisitor(_jc, this); carrier.visit(); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java index c5e201bd..cee7fa05 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java @@ -142,7 +142,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Assures index is of type INT. - * @throws org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException if the above constraint is not satisfied. + * @throws StructuralCodeConstraintException if the above constraint is not satisfied. */ private void indexOfInt(Instruction o, Type index){ if (! index.equals(Type.INT)) { @@ -154,7 +154,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Assures the ReferenceType r is initialized (or Type.NULL). * Formally, this means (!(r instanceof UninitializedObjectType)), because * there are no uninitialized array types. - * @throws org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException if the above constraint is not satisfied. + * @throws StructuralCodeConstraintException if the above constraint is not satisfied. */ private void referenceTypeIsInitialized(Instruction o, ReferenceType r){ if (r instanceof UninitializedObjectType){ @@ -172,7 +172,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Assures arrayref is of ArrayType or NULL; * returns true if and only if arrayref is non-NULL. - * @throws org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException if the above constraint is violated. + * @throws StructuralCodeConstraintException if the above constraint is violated. */ private boolean arrayrefOfArrayType(Instruction o, Type arrayref){ if (! ((arrayref instanceof ArrayType) || arrayref.equals(Type.NULL)) ) { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java index ed4ce6bc..5c9fd368 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java @@ -29,7 +29,7 @@ import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; /** * This class implements a stack used for symbolic JVM stack simulation. * [It's used an an operand stack substitute.] - * Elements of this stack are org.apache.commons.bcel6.generic.Type objects. + * Elements of this stack are {@link Type} objects. * * @version $Id$ */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java index 67a5539a..7210a4f6 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java @@ -40,7 +40,7 @@ public interface Subroutine{ * Note that JustIce has a pretty rigid notion of a subroutine. * Must not be invoked on the 'top-level subroutine'. * - * @see org.apache.commons.bcel6.verifier.structurals.Subroutines + * @see Subroutines */ InstructionHandle getLeavingRET(); -- GitLab From 2dfb8e55bb3db05fcbf39811281675ea0e6f0b06 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 10:48:29 +0000 Subject: [PATCH 0885/1313] Don't use full package name unnecessarily git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696131 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/util/BCELifier.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java index 06281759..583f7fb1 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java @@ -48,6 +48,8 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { private static final int FLAG_FOR_UNKNOWN = -1; private static final int FLAG_FOR_CLASS = 0; private static final int FLAG_FOR_METHOD = 1; + // The base package name for imports; assumes Constants is at the top level + private static final String BASE_PACKAGE = Constants.class.getPackage().getName(); private final JavaClass _clazz; private final PrintWriter _out; private final ConstantPoolGen _cp; @@ -82,9 +84,9 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { _out.println("package " + package_name + ";"); _out.println(); } - _out.println("import org.apache.commons.bcel6.generic.*;"); - _out.println("import org.apache.commons.bcel6.classfile.*;"); - _out.println("import org.apache.commons.bcel6.*;"); + _out.println("import " + BASE_PACKAGE + ".generic.*;"); + _out.println("import " + BASE_PACKAGE + ".classfile.*;"); + _out.println("import " + BASE_PACKAGE + ".*;"); _out.println("import java.io.*;"); _out.println(); _out.println("public class " + class_name + "Creator implements Constants {"); -- GitLab From 5582eced547b24a37737683f04784fdab0847859 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 16 Aug 2015 11:38:50 +0000 Subject: [PATCH 0886/1313] Tidy up git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696134 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/util/BCELifier.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java index 583f7fb1..a2ea4089 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java @@ -98,8 +98,8 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { _out.println(" _cg = new ClassGen(\"" + (("".equals(package_name)) ? class_name : package_name + "." + class_name) + "\", \"" + super_name + "\", " + "\"" + clazz.getSourceFileName() + "\", " - + printFlags(clazz.getAccessFlags(), FLAG_FOR_CLASS) + ", " + "new String[] { " - + inter + " });"); + + printFlags(clazz.getAccessFlags(), FLAG_FOR_CLASS) + ", " + + "new String[] { " + inter + " });"); _out.println(); _out.println(" _cp = _cg.getConstantPool();"); _out.println(" _factory = new InstructionFactory(_cg, _cp);"); @@ -170,12 +170,11 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { @Override public void visitMethod( Method method ) { MethodGen mg = new MethodGen(method, _clazz.getClassName(), _cp); - Type result_type = mg.getReturnType(); - Type[] arg_types = mg.getArgumentTypes(); _out.println(" InstructionList il = new InstructionList();"); _out.println(" MethodGen method = new MethodGen(" + printFlags(method.getAccessFlags(), FLAG_FOR_METHOD) + ", " - + printType(result_type) + ", " + printArgumentTypes(arg_types) + ", " + + printType(mg.getReturnType()) + ", " + + printArgumentTypes(mg.getArgumentTypes()) + ", " + "new String[] { " + Utility.printArray(mg.getArgumentNames(), false, true) + " }, \"" + method.getName() + "\", \"" + _clazz.getClassName() + "\", il, _cp);"); _out.println(); -- GitLab From 0137376d538261f22180566ad866eac0247bd2b0 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 17 Aug 2015 15:04:46 +0000 Subject: [PATCH 0887/1313] Exact anchors where possible git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696304 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/Constants.java | 410 +++++++++--------- 1 file changed, 205 insertions(+), 205 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Constants.java b/src/main/java/org/apache/commons/bcel6/Constants.java index dadbfb51..0a12cc66 100644 --- a/src/main/java/org/apache/commons/bcel6/Constants.java +++ b/src/main/java/org/apache/commons/bcel6/Constants.java @@ -310,624 +310,624 @@ public class Constants { public static final int MAX_CODE_SIZE = 65536; //bytes /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short NOP = 0; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ACONST_NULL = 1; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_M1 = 2; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_0 = 3; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_1 = 4; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_2 = 5; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_3 = 6; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_4 = 7; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_5 = 8; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LCONST_0 = 9; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LCONST_1 = 10; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_0 = 11; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_1 = 12; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_2 = 13; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCONST_0 = 14; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCONST_1 = 15; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short BIPUSH = 16; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short SIPUSH = 17; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC = 18; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC_W = 19; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC2_W = 20; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD = 21; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD = 22; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD = 23; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD = 24; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD = 25; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_0 = 26; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_1 = 27; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_2 = 28; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_3 = 29; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_0 = 30; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_1 = 31; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_2 = 32; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_3 = 33; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_0 = 34; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_1 = 35; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_2 = 36; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_3 = 37; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_0 = 38; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_1 = 39; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_2 = 40; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_3 = 41; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_0 = 42; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_1 = 43; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_2 = 44; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_3 = 45; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IALOAD = 46; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LALOAD = 47; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FALOAD = 48; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DALOAD = 49; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short AALOAD = 50; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short BALOAD = 51; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short CALOAD = 52; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short SALOAD = 53; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE = 54; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE = 55; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE = 56; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE = 57; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE = 58; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_0 = 59; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_1 = 60; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_2 = 61; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_3 = 62; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_0 = 63; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_1 = 64; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_2 = 65; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_3 = 66; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_0 = 67; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_1 = 68; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_2 = 69; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_3 = 70; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_0 = 71; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_1 = 72; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_2 = 73; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_3 = 74; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_0 = 75; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_1 = 76; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_2 = 77; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_3 = 78; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IASTORE = 79; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LASTORE = 80; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FASTORE = 81; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DASTORE = 82; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short AASTORE = 83; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short BASTORE = 84; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short CASTORE = 85; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short SASTORE = 86; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short POP = 87; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short POP2 = 88; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP = 89; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP_X1 = 90; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP_X2 = 91; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2 = 92; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2_X1 = 93; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2_X2 = 94; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short SWAP = 95; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IADD = 96; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LADD = 97; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FADD = 98; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DADD = 99; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISUB = 100; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSUB = 101; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSUB = 102; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSUB = 103; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IMUL = 104; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LMUL = 105; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FMUL = 106; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DMUL = 107; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IDIV = 108; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LDIV = 109; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FDIV = 110; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DDIV = 111; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IREM = 112; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LREM = 113; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FREM = 114; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DREM = 115; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INEG = 116; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LNEG = 117; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FNEG = 118; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DNEG = 119; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISHL = 120; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSHL = 121; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISHR = 122; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSHR = 123; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IUSHR = 124; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LUSHR = 125; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IAND = 126; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LAND = 127; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IOR = 128; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LOR = 129; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IXOR = 130; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LXOR = 131; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IINC = 132; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2L = 133; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2F = 134; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2D = 135; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short L2I = 136; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short L2F = 137; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short L2D = 138; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short F2I = 139; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short F2L = 140; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short F2D = 141; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short D2I = 142; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short D2L = 143; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short D2F = 144; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2B = 145; /** Java VM opcode. * @see Opcode definitions in The Java Virtual Machine Specification */ - public static final short INT2BYTE = 145; // Old notion + public static final short INT2BYTE = 145; // Old notation /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2C = 146; /** Java VM opcode. * @see Opcode definitions in The Java Virtual Machine Specification */ - public static final short INT2CHAR = 146; // Old notion + public static final short INT2CHAR = 146; // Old notation /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short I2S = 147; /** Java VM opcode. * @see Opcode definitions in The Java Virtual Machine Specification */ - public static final short INT2SHORT = 147; // Old notion + public static final short INT2SHORT = 147; // Old notation /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LCMP = 148; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCMPL = 149; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCMPG = 150; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCMPL = 151; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCMPG = 152; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFEQ = 153; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNE = 154; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFLT = 155; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFGE = 156; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFGT = 157; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFLE = 158; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPEQ = 159; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPNE = 160; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPLT = 161; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPGE = 162; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPGT = 163; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPLE = 164; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ACMPEQ = 165; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ACMPNE = 166; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short GOTO = 167; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short JSR = 168; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short RET = 169; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short TABLESWITCH = 170; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LOOKUPSWITCH = 171; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IRETURN = 172; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LRETURN = 173; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FRETURN = 174; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DRETURN = 175; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ARETURN = 176; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short RETURN = 177; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short GETSTATIC = 178; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short PUTSTATIC = 179; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short GETFIELD = 180; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short PUTFIELD = 181; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEVIRTUAL = 182; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKESPECIAL = 183; /** Java VM opcode. * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKENONVIRTUAL = 183; // Old name in JDK 1.0 /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKESTATIC = 184; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEINTERFACE = 185; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEDYNAMIC = 186; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short NEW = 187; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short NEWARRAY = 188; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ANEWARRAY = 189; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ARRAYLENGTH = 190; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ATHROW = 191; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short CHECKCAST = 192; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short INSTANCEOF = 193; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short MONITORENTER = 194; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short MONITOREXIT = 195; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short WIDE = 196; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short MULTIANEWARRAY = 197; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNULL = 198; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNONNULL = 199; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short GOTO_W = 200; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short JSR_W = 201; /** JVM internal opcode. -- GitLab From ad1bdcbcc97e3586f4a498a29a74bcf3c89dffee Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 17 Aug 2015 21:50:21 +0000 Subject: [PATCH 0888/1313] Remove obsolete assembly descriptors; add missing files to current ones git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696346 13f79535-47bb-0310-9956-ffa450edef68 --- src/assembly/bin.xml | 4 ++++ src/assembly/src.xml | 3 +++ src/main/assembly/bin.xml | 48 --------------------------------------- src/main/assembly/src.xml | 44 ----------------------------------- 4 files changed, 7 insertions(+), 92 deletions(-) delete mode 100644 src/main/assembly/bin.xml delete mode 100644 src/main/assembly/src.xml diff --git a/src/assembly/bin.xml b/src/assembly/bin.xml index 05d8661e..c7ea5268 100644 --- a/src/assembly/bin.xml +++ b/src/assembly/bin.xml @@ -27,6 +27,7 @@ LICENSE.txt NOTICE.txt README.txt + RELEASE-NOTES.txt @@ -36,6 +37,9 @@ *.jar + + src/examples + target/site/apidocs apidocs diff --git a/src/assembly/src.xml b/src/assembly/src.xml index 0c216ecd..f12826a4 100644 --- a/src/assembly/src.xml +++ b/src/assembly/src.xml @@ -36,5 +36,8 @@ src + + docs + diff --git a/src/main/assembly/bin.xml b/src/main/assembly/bin.xml deleted file mode 100644 index 906ed90b..00000000 --- a/src/main/assembly/bin.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - bin - - tar.gz - zip - - false - - - - LICENSE.txt - NOTICE.txt - README.txt - RELEASE-NOTES.txt - - - - target - - - *.jar - - - - src/examples - - - target/site/apidocs - apidocs - - - diff --git a/src/main/assembly/src.xml b/src/main/assembly/src.xml deleted file mode 100644 index cb0d7c32..00000000 --- a/src/main/assembly/src.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - src - - tar.gz - zip - - ${project.artifactId}-${project.version}-src - - - - checkstyle.xml - LICENSE.txt - LICENSE-header.txt - NOTICE.txt - pmd.xml - pom.xml - README.txt - RELEASE-NOTES.txt - - - - src - - - docs - - - -- GitLab From bf1496eb6761acaf3f05e7bb8621ffca59a620f0 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 17 Aug 2015 22:00:19 +0000 Subject: [PATCH 0889/1313] Drop trailing newline git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696347 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/classfile/Code.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Code.java b/src/main/java/org/apache/commons/bcel6/classfile/Code.java index 79b3fdbf..6ad186b0 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Code.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Code.java @@ -312,9 +312,9 @@ public final class Code extends Attribute { } } if (attributes.length > 0) { - buf.append("\nAttribute(s) = \n"); + buf.append("\nAttribute(s) = "); for (Attribute attribute : attributes) { - buf.append(attribute.toString()).append("\n"); + buf.append("\n").append(attribute.toString()); } } return buf.toString(); -- GitLab From 531b1849af7682cb4f1faf981b506a6b4d2c9fc4 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 17 Aug 2015 22:43:35 +0000 Subject: [PATCH 0890/1313] Remove inaccurate TODOs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696349 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/JavaClass.java | 2 +- .../commons/bcel6/generic/BranchHandle.java | 2 +- .../apache/commons/bcel6/generic/ClassGen.java | 14 +++++++------- .../bcel6/generic/CodeExceptionGen.java | 2 +- .../apache/commons/bcel6/generic/FieldGen.java | 18 +++++++++--------- .../bcel6/generic/InstructionFactory.java | 4 ++-- .../bcel6/generic/LocalVariableGen.java | 6 +++--- .../commons/bcel6/generic/MethodGen.java | 10 +++++----- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 8dc70bc0..5dc51c9b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -74,7 +74,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl static boolean debug = false; // Debugging on/off final static char sep = File.separatorChar; // directory separator - private static final BCELComparator _cmp = new BCELComparator() { // TODO could be final (setter unused) + private static final BCELComparator _cmp = new BCELComparator() { @Override public boolean equals( Object o1, Object o2 ) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java index 46db8e0f..2ab9c62b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java @@ -91,7 +91,7 @@ public final class BranchHandle extends InstructionHandle { /** * Pass new target to instruction. */ - public void setTarget( InstructionHandle ih ) { // TODO unused + public void setTarget( InstructionHandle ih ) { bi.setTarget(ih); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index 8918532e..dbea4d81 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -417,13 +417,13 @@ public class ClassGen extends AccessFlags implements Cloneable { } - public void setClassName( String name ) { // TODO unused + public void setClassName( String name ) { class_name = name.replace('/', '.'); class_name_index = cp.addClass(name); } - public void setSuperclassName( String name ) { // TODO unused + public void setSuperclassName( String name ) { super_class_name = name.replace('/', '.'); superclass_name_index = cp.addClass(name); } @@ -434,7 +434,7 @@ public class ClassGen extends AccessFlags implements Cloneable { } - public void setMethods( Method[] methods ) { // TODO unused + public void setMethods( Method[] methods ) { method_vec.clear(); for (Method method : methods) { addMethod(method); @@ -442,7 +442,7 @@ public class ClassGen extends AccessFlags implements Cloneable { } - public void setMethodAt( Method method, int pos ) { // TODO unused + public void setMethodAt( Method method, int pos ) { method_vec.set(pos, method); } @@ -490,19 +490,19 @@ public class ClassGen extends AccessFlags implements Cloneable { } - public void setConstantPool( ConstantPoolGen constant_pool ) { // TODO unused + public void setConstantPool( ConstantPoolGen constant_pool ) { cp = constant_pool; } - public void setClassNameIndex( int class_name_index ) { // TODO unused + public void setClassNameIndex( int class_name_index ) { this.class_name_index = class_name_index; class_name = cp.getConstantPool().getConstantString(class_name_index, Constants.CONSTANT_Class).replace('/', '.'); } - public void setSuperclassNameIndex( int superclass_name_index ) { // TODO unused + public void setSuperclassNameIndex( int superclass_name_index ) { this.superclass_name_index = superclass_name_index; super_class_name = cp.getConstantPool().getConstantString(superclass_name_index, Constants.CONSTANT_Class).replace('/', '.'); diff --git a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java index 779c51dd..32646180 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java @@ -139,7 +139,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable, j /** Sets the type of the Exception to catch. Set 'null' for ANY. */ - public void setCatchType( ObjectType catch_type ) { // TODO unused + public void setCatchType( ObjectType catch_type ) { this.catch_type = catch_type; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index 29c99c83..e26d576d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -125,7 +125,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( long l ) { // TODO unused + public void setInitValue( long l ) { checkType(Type.LONG); if (l != 0L) { value = new Long(l); @@ -133,7 +133,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( int i ) { // TODO unused + public void setInitValue( int i ) { checkType(Type.INT); if (i != 0) { value = Integer.valueOf(i); @@ -141,7 +141,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( short s ) { // TODO unused + public void setInitValue( short s ) { checkType(Type.SHORT); if (s != 0) { value = Integer.valueOf(s); @@ -149,7 +149,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( char c ) { // TODO unused + public void setInitValue( char c ) { checkType(Type.CHAR); if (c != 0) { value = Integer.valueOf(c); @@ -157,7 +157,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( byte b ) { // TODO unused + public void setInitValue( byte b ) { checkType(Type.BYTE); if (b != 0) { value = Integer.valueOf(b); @@ -165,7 +165,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( boolean b ) { // TODO unused + public void setInitValue( boolean b ) { checkType(Type.BOOLEAN); if (b) { value = Integer.valueOf(1); @@ -173,7 +173,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( float f ) { // TODO unused + public void setInitValue( float f ) { checkType(Type.FLOAT); if (f != 0.0) { value = new Float(f); @@ -181,7 +181,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( double d ) { // TODO unused + public void setInitValue( double d ) { checkType(Type.DOUBLE); if (d != 0.0) { value = new Double(d); @@ -191,7 +191,7 @@ public class FieldGen extends FieldGenOrMethodGen { /** Remove any initial value. */ - public void cancelInitValue() { // TODO unused + public void cancelInitValue() { value = null; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java index c45e32f1..c0dcb45c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java @@ -745,7 +745,7 @@ public class InstructionFactory implements java.io.Serializable { } - public void setClassGen( ClassGen c ) { // TODO unused + public void setClassGen( ClassGen c ) { cg = c; } @@ -755,7 +755,7 @@ public class InstructionFactory implements java.io.Serializable { } - public void setConstantPool( ConstantPoolGen c ) { // TODO unused + public void setConstantPool( ConstantPoolGen c ) { cp = c; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java index 2f4f19c2..057b776a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java @@ -94,7 +94,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo } - public void setIndex( int index ) { // TODO unused + public void setIndex( int index ) { this.index = index; } @@ -105,7 +105,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo @Override - public void setName( String name ) { // TODO unused + public void setName( String name ) { this.name = name; } @@ -117,7 +117,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo @Override - public void setType( Type type ) { // TODO unused + public void setType( Type type ) { this.type = type; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 8055a67f..bd2e459e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -753,7 +753,7 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setReturnType( Type return_type ) { // TODO unused + public void setReturnType( Type return_type ) { setType(return_type); } @@ -763,7 +763,7 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setArgumentTypes( Type[] arg_types ) { // TODO could be package-protected? + public void setArgumentTypes( Type[] arg_types ) { this.arg_types = arg_types; } @@ -773,7 +773,7 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setArgumentType( int i, Type type ) { // TODO unused + public void setArgumentType( int i, Type type ) { arg_types[i] = type; } @@ -783,7 +783,7 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setArgumentNames( String[] arg_names ) { // TODO could be package-protected? + public void setArgumentNames( String[] arg_names ) { this.arg_names = arg_names; } @@ -793,7 +793,7 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setArgumentName( int i, String name ) { // TODO unused + public void setArgumentName( int i, String name ) { arg_names[i] = name; } -- GitLab From 25aeeeff73ce086ce4fb7d2e108b981f445d3b28 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 17 Aug 2015 23:15:48 +0000 Subject: [PATCH 0891/1313] Revert BCEL-235 and BCEL-233 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696350 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 2 - .../commons/bcel6/classfile/AccessFlags.java | 107 ++++++++++++++- .../bcel6/classfile/AnnotationDefault.java | 12 +- .../commons/bcel6/classfile/Annotations.java | 19 +-- .../commons/bcel6/classfile/Attribute.java | 10 +- .../bcel6/classfile/BootstrapMethod.java | 24 +++- .../bcel6/classfile/CodeException.java | 40 +++++- .../bcel6/classfile/ConstantClass.java | 10 +- .../bcel6/classfile/ConstantDouble.java | 10 +- .../bcel6/classfile/ConstantFloat.java | 10 +- .../bcel6/classfile/ConstantInteger.java | 10 +- .../commons/bcel6/classfile/ConstantLong.java | 10 +- .../bcel6/classfile/ConstantMethodHandle.java | 14 +- .../bcel6/classfile/ConstantMethodType.java | 7 +- .../bcel6/classfile/ConstantNameAndType.java | 20 ++- .../commons/bcel6/classfile/ConstantPool.java | 18 ++- .../bcel6/classfile/ConstantString.java | 10 +- .../bcel6/classfile/ConstantValue.java | 10 +- .../commons/bcel6/classfile/Deprecated.java | 10 +- .../bcel6/classfile/EnclosingMethod.java | 7 +- .../bcel6/classfile/ExceptionTable.java | 9 ++ .../apache/commons/bcel6/classfile/Field.java | 10 +- .../bcel6/classfile/FieldOrMethod.java | 24 +++- .../commons/bcel6/classfile/InnerClass.java | 40 +++++- .../commons/bcel6/classfile/InnerClasses.java | 10 +- .../commons/bcel6/classfile/JavaClass.java | 122 +++++++++++++++++- .../commons/bcel6/classfile/LineNumber.java | 20 ++- .../bcel6/classfile/LineNumberTable.java | 10 +- .../bcel6/classfile/LocalVariable.java | 58 ++++++++- .../bcel6/classfile/LocalVariableTable.java | 7 +- .../classfile/LocalVariableTypeTable.java | 4 + .../bcel6/classfile/MethodParameter.java | 14 +- .../bcel6/classfile/MethodParameters.java | 6 +- .../commons/bcel6/classfile/PMGClass.java | 18 ++- .../bcel6/classfile/ParameterAnnotations.java | 10 +- .../commons/bcel6/classfile/Signature.java | 10 +- .../bcel6/classfile/SimpleElementValue.java | 7 +- .../commons/bcel6/classfile/SourceFile.java | 10 +- .../commons/bcel6/classfile/StackMap.java | 10 +- .../bcel6/classfile/StackMapEntry.java | 30 ++++- .../bcel6/classfile/StackMapTable.java | 10 +- .../bcel6/classfile/StackMapTableEntry.java | 30 ++++- .../commons/bcel6/classfile/StackMapType.java | 34 +++-- .../commons/bcel6/classfile/Synthetic.java | 10 +- .../commons/bcel6/classfile/Unknown.java | 10 +- .../bcel6/generic/ConstantPoolGen.java | 13 +- 46 files changed, 804 insertions(+), 92 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index b7258639..087eb56a 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -72,9 +72,7 @@ The type attribute can be add,update,fix,remove. long type instructions are not searched by InstructionFinder using regular expression Update Java requirement from 5 to 7 Interfaces should not be used to define constants - Remove unused setters Make mutable fields private - The access_flags field in AccessFlags class should be final Code must not swallow Throwable Major release of BCEL requires updating package name and maven coordinates. diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java index acf0ba70..be8ac514 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java @@ -28,11 +28,10 @@ import org.apache.commons.bcel6.Constants; public abstract class AccessFlags implements java.io.Serializable { private static final long serialVersionUID = 2845404654039163061L; - private final int access_flags; + protected int access_flags; public AccessFlags() { - this(0); } @@ -60,76 +59,180 @@ public abstract class AccessFlags implements java.io.Serializable { } + /** Set access flags aka "modifiers". + * @param access_flags Access flags of the object. + */ + public final void setAccessFlags( int access_flags ) { + this.access_flags = access_flags; + } + + + /** Set access flags aka "modifiers". + * @param access_flags Access flags of the object. + */ + public final void setModifiers( int access_flags ) { + setAccessFlags(access_flags); + } + + + private void setFlag( int flag, boolean set ) { + if ((access_flags & flag) != 0) { // Flag is set already + if (!set) { + access_flags ^= flag; + } + } else { // Flag not set + if (set) { + access_flags |= flag; + } + } + } + + + public final void isPublic( boolean flag ) { + setFlag(Constants.ACC_PUBLIC, flag); + } + + public final boolean isPublic() { return (access_flags & Constants.ACC_PUBLIC) != 0; } + public final void isPrivate( boolean flag ) { + setFlag(Constants.ACC_PRIVATE, flag); + } + + public final boolean isPrivate() { return (access_flags & Constants.ACC_PRIVATE) != 0; } + public final void isProtected( boolean flag ) { + setFlag(Constants.ACC_PROTECTED, flag); + } + + public final boolean isProtected() { return (access_flags & Constants.ACC_PROTECTED) != 0; } + public final void isStatic( boolean flag ) { + setFlag(Constants.ACC_STATIC, flag); + } + + public final boolean isStatic() { return (access_flags & Constants.ACC_STATIC) != 0; } + public final void isFinal( boolean flag ) { + setFlag(Constants.ACC_FINAL, flag); + } + + public final boolean isFinal() { return (access_flags & Constants.ACC_FINAL) != 0; } + public final void isSynchronized( boolean flag ) { + setFlag(Constants.ACC_SYNCHRONIZED, flag); + } + + public final boolean isSynchronized() { return (access_flags & Constants.ACC_SYNCHRONIZED) != 0; } + public final void isVolatile( boolean flag ) { + setFlag(Constants.ACC_VOLATILE, flag); + } + + public final boolean isVolatile() { return (access_flags & Constants.ACC_VOLATILE) != 0; } + public final void isTransient( boolean flag ) { + setFlag(Constants.ACC_TRANSIENT, flag); + } + + public final boolean isTransient() { return (access_flags & Constants.ACC_TRANSIENT) != 0; } + public final void isNative( boolean flag ) { + setFlag(Constants.ACC_NATIVE, flag); + } + + public final boolean isNative() { return (access_flags & Constants.ACC_NATIVE) != 0; } + public final void isInterface( boolean flag ) { + setFlag(Constants.ACC_INTERFACE, flag); + } + + public final boolean isInterface() { return (access_flags & Constants.ACC_INTERFACE) != 0; } + public final void isAbstract( boolean flag ) { + setFlag(Constants.ACC_ABSTRACT, flag); + } + + public final boolean isAbstract() { return (access_flags & Constants.ACC_ABSTRACT) != 0; } + public final void isStrictfp( boolean flag ) { + setFlag(Constants.ACC_STRICT, flag); + } + + public final boolean isStrictfp() { return (access_flags & Constants.ACC_STRICT) != 0; } + public final void isSynthetic( boolean flag ) { + setFlag(Constants.ACC_SYNTHETIC, flag); + } + + public final boolean isSynthetic() { return (access_flags & Constants.ACC_SYNTHETIC) != 0; } + public final void isAnnotation( boolean flag ) { + setFlag(Constants.ACC_ANNOTATION, flag); + } + + public final boolean isAnnotation() { return (access_flags & Constants.ACC_ANNOTATION) != 0; } + public final void isEnum( boolean flag ) { + setFlag(Constants.ACC_ENUM, flag); + } + + public final boolean isEnum() { return (access_flags & Constants.ACC_ENUM) != 0; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java index c430ca66..bb82d53f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java @@ -33,7 +33,7 @@ public class AnnotationDefault extends Attribute { private static final long serialVersionUID = -4017327188724019487L; - private final ElementValue default_value; // TODO could this be made final? + private ElementValue default_value; /** * @param name_index Index pointing to the name Code @@ -42,7 +42,8 @@ public class AnnotationDefault extends Attribute { * @param constant_pool Array of constants */ AnnotationDefault(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { - this(name_index, length, ElementValue.readElementValue(input, constant_pool), constant_pool); + this(name_index, length, (ElementValue) null, constant_pool); + default_value = ElementValue.readElementValue(input, constant_pool); } /** @@ -68,6 +69,13 @@ public class AnnotationDefault extends Attribute { v.visitAnnotationDefault(this); } + /** + * @param defaultValue the default value of this methodinfo's annotation + */ + public final void setDefaultValue(ElementValue defaultValue) { + default_value = defaultValue; + } + /** * @return the default value */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java index e597023e..78a7f511 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java @@ -31,7 +31,7 @@ public abstract class Annotations extends Attribute { private static final long serialVersionUID = 1L; - private final AnnotationEntry[] annotation_table; + private AnnotationEntry[] annotation_table; private final boolean isRuntimeVisible; /** @@ -42,16 +42,12 @@ public abstract class Annotations extends Attribute { * @param constant_pool Array of constants */ Annotations(byte annotation_type, int name_index, int length, DataInput input, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { - this(annotation_type, name_index, length, makeAnnotationTable(input, constant_pool, isRuntimeVisible), constant_pool, isRuntimeVisible); - } - - static AnnotationEntry[] makeAnnotationTable(DataInput input, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { + this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool, isRuntimeVisible); final int annotation_table_length = (input.readUnsignedShort()); - AnnotationEntry[] at = new AnnotationEntry[annotation_table_length]; + annotation_table = new AnnotationEntry[annotation_table_length]; for (int i = 0; i < annotation_table_length; i++) { - at[i] = AnnotationEntry.read(input, constant_pool, isRuntimeVisible); + annotation_table[i] = AnnotationEntry.read(input, constant_pool, isRuntimeVisible); } - return at; } /** @@ -78,6 +74,13 @@ public abstract class Annotations extends Attribute { v.visitAnnotation(this); } + /** + * @param annotation_table the entries to set in this annotation + */ + public final void setAnnotationTable(AnnotationEntry[] annotation_table) { + this.annotation_table = annotation_table; + } + /** * returns the array of annotation entries in this annotation */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index a5f23066..a8256014 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -52,7 +52,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable { private static final long serialVersionUID = -1707826820310002955L; - private final int name_index; // Points to attribute name in constant pool + private int name_index; // Points to attribute name in constant pool private int length; // Content length of attribute field @@ -258,6 +258,14 @@ public abstract class Attribute implements Cloneable, Node, Serializable this.length = length; } + /** + * @param name_index of attribute. + */ + public final void setNameIndex(int name_index) + { + this.name_index = name_index; + } + /** * @return Name index in constant pool of attribute name. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java index 881e286e..943b5cb1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java @@ -37,12 +37,12 @@ public class BootstrapMethod implements Serializable, Cloneable { private static final long serialVersionUID = -4517534834047695344L; /** Index of the CONSTANT_MethodHandle_info structure in the constant_pool table */ - private final int bootstrap_method_ref; + private int bootstrap_method_ref; private final int num_bootstrap_arguments; /** Array of references to the constant_pool table */ - private final int[] bootstrap_arguments; + private int[] bootstrap_arguments; /** @@ -59,9 +59,9 @@ public class BootstrapMethod implements Serializable, Cloneable { * @throws IOException */ BootstrapMethod(DataInput input) throws IOException { - this.bootstrap_method_ref = input.readUnsignedShort(); - this.num_bootstrap_arguments = input.readUnsignedShort(); - this.bootstrap_arguments = new int[num_bootstrap_arguments]; + this(input.readUnsignedShort(), input.readUnsignedShort(), (int[]) null); + + bootstrap_arguments = new int[num_bootstrap_arguments]; for (int i = 0; i < num_bootstrap_arguments; i++) { bootstrap_arguments[i] = input.readUnsignedShort(); } @@ -86,6 +86,13 @@ public class BootstrapMethod implements Serializable, Cloneable { return bootstrap_method_ref; } + /** + * @param bootstrap_method_ref int index into constant_pool of CONSTANT_MethodHandle + */ + public void setBootstrapMethodRef(int bootstrap_method_ref) { + this.bootstrap_method_ref = bootstrap_method_ref; + } + /** * @return int[] of bootstrap_method indices into constant_pool of CONSTANT__info */ @@ -100,6 +107,13 @@ public class BootstrapMethod implements Serializable, Cloneable { return num_bootstrap_arguments; } + /** + * @param bootstrap_arguments int[] indices into constant_pool of CONSTANT__info + */ + public void setBootstrapArguments(int[] bootstrap_arguments) { + this.bootstrap_arguments = bootstrap_arguments; + } + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java index 53dfb565..760331b6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java @@ -35,12 +35,12 @@ import org.apache.commons.bcel6.Constants; public final class CodeException implements Cloneable, Node, Serializable { private static final long serialVersionUID = 2972500041254967221L; - private final int start_pc; // Range in the code the exception handler is - private final int end_pc; // active. start_pc is inclusive, end_pc exclusive - private final int handler_pc; /* Starting address of exception handler, i.e., + private int start_pc; // Range in the code the exception handler is + private int end_pc; // active. start_pc is inclusive, end_pc exclusive + private int handler_pc; /* Starting address of exception handler, i.e., * an offset from start of code. */ - private final int catch_type; /* If this is zero the handler catches any + private int catch_type; /* If this is zero the handler catches any * exception, otherwise it points to the * exception class which is to be caught. */ @@ -143,6 +143,38 @@ public final class CodeException implements Cloneable, Node, Serializable { } + /** + * @param catch_type the type of exception that is caught + */ + public final void setCatchType( int catch_type ) { + this.catch_type = catch_type; + } + + + /** + * @param end_pc end of handled block + */ + public final void setEndPC( int end_pc ) { + this.end_pc = end_pc; + } + + + /** + * @param handler_pc where the actual code is + */ + public final void setHandlerPC( int handler_pc ) { // TODO unused + this.handler_pc = handler_pc; + } + + + /** + * @param start_pc start of handled block + */ + public final void setStartPC( int start_pc ) { // TODO unused + this.start_pc = start_pc; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java index f4c83864..7ffe98f1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantClass extends Constant implements ConstantObject { private static final long serialVersionUID = -1083450233715258720L; - private final int name_index; // Identical to ConstantString except for the name + private int name_index; // Identical to ConstantString except for the name /** @@ -99,6 +99,14 @@ public final class ConstantClass extends Constant implements ConstantObject { } + /** + * @param name_index the name index in the constant pool of this Constant Class + */ + public final void setNameIndex( int name_index ) { + this.name_index = name_index; + } + + /** @return String object */ @Override diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java index f863cd63..dc53c15c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantDouble extends Constant implements ConstantObject { private static final long serialVersionUID = -7394764537394782136L; - private final double bytes; + private double bytes; /** @@ -98,6 +98,14 @@ public final class ConstantDouble extends Constant implements ConstantObject { } + /** + * @param bytes the raw bytes that represent the double value + */ + public final void setBytes( double bytes ) { + this.bytes = bytes; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java index bd35dcb1..d7fd7d2a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantFloat extends Constant implements ConstantObject { private static final long serialVersionUID = -2316732495687628398L; - private final float bytes; + private float bytes; /** @@ -99,6 +99,14 @@ public final class ConstantFloat extends Constant implements ConstantObject { } + /** + * @param bytes the raw bytes that represent this float + */ + public final void setBytes( float bytes ) { + this.bytes = bytes; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java index 8a693fd2..259a17a8 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantInteger extends Constant implements ConstantObject { private static final long serialVersionUID = -7040676276945754375L; - private final int bytes; + private int bytes; /** @@ -98,6 +98,14 @@ public final class ConstantInteger extends Constant implements ConstantObject { } + /** + * @param bytes the raw bytes that represent this integer + */ + public final void setBytes( int bytes ) { + this.bytes = bytes; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java index bf3728b2..160b2b9e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantLong extends Constant implements ConstantObject { private static final long serialVersionUID = 8495971186433816161L; - private final long bytes; + private long bytes; /** @@ -98,6 +98,14 @@ public final class ConstantLong extends Constant implements ConstantObject { } + /** + * @param bytes the raw bytes that represent this long + */ + public final void setBytes( long bytes ) { + this.bytes = bytes; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java index 6330daa1..65ffac80 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java @@ -33,8 +33,8 @@ import org.apache.commons.bcel6.Constants; public final class ConstantMethodHandle extends Constant { private static final long serialVersionUID = -7875124116920198044L; - private final int reference_kind; - private final int reference_index; + private int reference_kind; + private int reference_index; /** @@ -95,11 +95,21 @@ public final class ConstantMethodHandle extends Constant { } + public void setReferenceKind(int reference_kind) { + this.reference_kind = reference_kind; + } + + public int getReferenceIndex() { return reference_index; } + public void setReferenceIndex(int reference_index) { + this.reference_index = reference_index; + } + + /** * @return String representation */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java index fb7cf7bd..907f9cea 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantMethodType extends Constant { private static final long serialVersionUID = 6750768220616618881L; - private final int descriptor_index; + private int descriptor_index; /** @@ -92,6 +92,11 @@ public final class ConstantMethodType extends Constant { } + public void setDescriptorIndex(int descriptor_index) { + this.descriptor_index = descriptor_index; + } + + /** * @return String representation */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java index c033ca55..3cf4d004 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java @@ -34,8 +34,8 @@ import org.apache.commons.bcel6.Constants; public final class ConstantNameAndType extends Constant { private static final long serialVersionUID = -7913354727264034451L; - private final int name_index; // Name of field/method - private final int signature_index; // and its signature. + private int name_index; // Name of field/method + private int signature_index; // and its signature. /** @@ -125,6 +125,22 @@ public final class ConstantNameAndType extends Constant { } + /** + * @param name_index the name index of this constant + */ + public final void setNameIndex( int name_index ) { + this.name_index = name_index; + } + + + /** + * @param signature_index the signature index in the constant pool of this type + */ + public final void setSignatureIndex( int signature_index ) { + this.signature_index = signature_index; + } + + /** * @return String representation */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java index e7079fcd..53670dc8 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java @@ -39,7 +39,7 @@ import org.apache.commons.bcel6.Constants; public class ConstantPool implements Cloneable, Node, Serializable { private static final long serialVersionUID = -9093478476423540196L; - private Constant[] constant_pool; // TODO this could be final if the copy() method were rewritten + private Constant[] constant_pool; /** @@ -324,6 +324,22 @@ public class ConstantPool implements Cloneable, Node, Serializable { } + /** + * @param constant Constant to set + */ + public void setConstant( int index, Constant constant ) { + constant_pool[index] = constant; + } + + + /** + * @param constant_pool + */ + public void setConstantPool( Constant[] constant_pool ) { + this.constant_pool = constant_pool; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java index 523ad149..7d969baa 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantString extends Constant implements ConstantObject { private static final long serialVersionUID = 6603144389219397225L; - private final int string_index; // Identical to ConstantClass except for this name + private int string_index; // Identical to ConstantClass except for this name /** @@ -98,6 +98,14 @@ public final class ConstantString extends Constant implements ConstantObject { } + /** + * @param string_index the index into the constant of the string value + */ + public final void setStringIndex( int string_index ) { + this.string_index = string_index; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java index bd49181a..929c43bf 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class ConstantValue extends Attribute { private static final long serialVersionUID = -5668999920978520157L; - private final int constantvalue_index; + private int constantvalue_index; /** @@ -107,6 +107,14 @@ public final class ConstantValue extends Attribute { } + /** + * @param constantvalue_index the index info the constant pool of this constant value + */ + public final void setConstantValueIndex( int constantvalue_index ) { + this.constantvalue_index = constantvalue_index; + } + + /** * @return String representation of constant value. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java index 4b541a0e..917e52aa 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class Deprecated extends Attribute { private static final long serialVersionUID = -2242528405240201000L; - private byte[] bytes; // TODO could be final if copy() were rewritten + private byte[] bytes; /** @@ -114,6 +114,14 @@ public final class Deprecated extends Attribute { } + /** + * @param bytes the raw bytes that represents this byte array + */ + public final void setBytes( byte[] bytes ) { + this.bytes = bytes; + } + + /** * @return attribute name */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java index b07c6903..e27ad741 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java @@ -34,7 +34,7 @@ public class EnclosingMethod extends Attribute { // Pointer to the CONSTANT_Class_info structure representing the // innermost class that encloses the declaration of the current class. - private final int classIndex; + private int classIndex; // If the current class is not immediately enclosed by a method or // constructor, then the value of the method_index item must be zero. @@ -44,7 +44,7 @@ public class EnclosingMethod extends Attribute { // to in the class_index. *It is the compiler responsibility* to // ensure that the method identified by this index is the closest // lexically enclosing method that includes the local/anonymous class. - private final int methodIndex; + private int methodIndex; // Ctors - and code to read an attribute in. EnclosingMethod(int nameIndex, int len, DataInput input, ConstantPool cpool) throws IOException { @@ -73,6 +73,9 @@ public class EnclosingMethod extends Attribute { public final int getEnclosingClassIndex() { return classIndex; } public final int getEnclosingMethodIndex(){ return methodIndex;} + public final void setEnclosingClassIndex(int idx) {classIndex = idx;} + public final void setEnclosingMethodIndex(int idx){methodIndex= idx;} + public final ConstantClass getEnclosingClass() { ConstantClass c = (ConstantClass)super.getConstantPool().getConstant(classIndex,Constants.CONSTANT_Class); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java index 554adfc3..3d5f710b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java @@ -139,6 +139,15 @@ public final class ExceptionTable extends Attribute { } + /** + * @param exception_index_table the list of exception indexes + * Also redefines number_of_exceptions according to table length. + */ + public final void setExceptionIndexTable( int[] exception_index_table ) { + this.exception_index_table = exception_index_table != null ? exception_index_table : new int[0]; + } + + /** * @return String representation, i.e., a list of thrown exceptions. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Field.java b/src/main/java/org/apache/commons/bcel6/classfile/Field.java index b1533f25..4d08944a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Field.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Field.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.util.BCELComparator; public final class Field extends FieldOrMethod { private static final long serialVersionUID = -4604082205545049134L; - private static final BCELComparator _cmp = new BCELComparator() { + private static BCELComparator _cmp = new BCELComparator() { @Override public boolean equals( Object o1, Object o2 ) { @@ -163,6 +163,14 @@ public final class Field extends FieldOrMethod { } + /** + * @param comparator Comparison strategy object + */ + public static void setComparator( BCELComparator comparator ) { + _cmp = comparator; + } + + /** * Return value as defined by given BCELComparator strategy. * By default two Field objects are said to be equal when diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index b0146f45..53062204 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -32,8 +32,8 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No private static final long serialVersionUID = -1833306330869469714L; - private final int name_index; // Points to field name in constant pool - private final int signature_index; // Points to encoded signature + private int name_index; // Points to field name in constant pool + private int signature_index; // Points to encoded signature private Attribute[] attributes; // Collection of attributes private AnnotationEntry[] annotationEntries; // annotations defined on the field or method private ConstantPool constant_pool; @@ -41,9 +41,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No private String signatureAttributeString = null; private boolean searchedForSignatureAttribute = false; - FieldOrMethod() { // TODO is this ctor needed? - this.name_index = 0; - this.signature_index = 0; + FieldOrMethod() { } @@ -148,6 +146,14 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No } + /** + * @param name_index Index in constant pool of object's name. + */ + public final void setNameIndex( int name_index ) { + this.name_index = name_index; + } + + /** * @return Index in constant pool of field signature. */ @@ -156,6 +162,14 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No } + /** + * @param signature_index Index in constant pool of field signature. + */ + public final void setSignatureIndex( int signature_index ) { + this.signature_index = signature_index; + } + + /** * @return Name of object, i.e., method name or field name */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java index 790409d6..5486d7e6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java @@ -35,10 +35,10 @@ import org.apache.commons.bcel6.Constants; public final class InnerClass implements Cloneable, Node, Serializable { private static final long serialVersionUID = -7200195918166127614L; - private final int inner_class_index; - private final int outer_class_index; - private final int inner_name_index; - private final int inner_access_flags; + private int inner_class_index; + private int outer_class_index; + private int inner_name_index; + private int inner_access_flags; /** @@ -135,6 +135,38 @@ public final class InnerClass implements Cloneable, Node, Serializable { } + /** + * @param inner_access_flags access flags for this inner class + */ + public final void setInnerAccessFlags( int inner_access_flags ) { + this.inner_access_flags = inner_access_flags; + } + + + /** + * @param inner_class_index index into the constant pool for this class + */ + public final void setInnerClassIndex( int inner_class_index ) { + this.inner_class_index = inner_class_index; + } + + + /** + * @param inner_name_index index into the constant pool for this class's name + */ + public final void setInnerNameIndex( int inner_name_index ) { // TODO unused + this.inner_name_index = inner_name_index; + } + + + /** + * @param outer_class_index index into the constant pool for the owning class + */ + public final void setOuterClassIndex( int outer_class_index ) { // TODO unused + this.outer_class_index = outer_class_index; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java index ba186b54..4cb4fddc 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class InnerClasses extends Attribute { private static final long serialVersionUID = 4570147726361753700L; - private InnerClass[] inner_classes; // TODO could be final (would need to recode the copy method) + private InnerClass[] inner_classes; /** @@ -117,6 +117,14 @@ public final class InnerClasses extends Attribute { } + /** + * @param inner_classes the array of inner classes + */ + public final void setInnerClasses( InnerClass[] inner_classes ) { + this.inner_classes = inner_classes != null ? inner_classes : new InnerClass[0]; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 5dc51c9b..30d6da9c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -74,7 +74,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl static boolean debug = false; // Debugging on/off final static char sep = File.separatorChar; // directory separator - private static final BCELComparator _cmp = new BCELComparator() { + private static BCELComparator _cmp = new BCELComparator() { @Override public boolean equals( Object o1, Object o2 ) { @@ -485,6 +485,118 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl } + /** + * @param attributes . + */ + public void setAttributes( Attribute[] attributes ) { + this.attributes = attributes; + } + + + /** + * @param class_name . + */ + public void setClassName( String class_name ) { + this.class_name = class_name; + } + + + /** + * @param class_name_index . + */ + public void setClassNameIndex( int class_name_index ) { + this.class_name_index = class_name_index; + } + + + /** + * @param constant_pool . + */ + public void setConstantPool( ConstantPool constant_pool ) { + this.constant_pool = constant_pool; + } + + + /** + * @param fields . + */ + public void setFields( Field[] fields ) { + this.fields = fields; + } + + + /** + * Set File name of class, aka SourceFile attribute value + */ + public void setFileName( String file_name ) { + this.file_name = file_name; + } + + + /** + * @param interface_names . + */ + public void setInterfaceNames( String[] interface_names ) { + this.interface_names = interface_names; + } + + + /** + * @param interfaces . + */ + public void setInterfaces( int[] interfaces ) { + this.interfaces = interfaces; + } + + + /** + * @param major . + */ + public void setMajor( int major ) { + this.major = major; + } + + + /** + * @param methods . + */ + public void setMethods( Method[] methods ) { + this.methods = methods; + } + + + /** + * @param minor . + */ + public void setMinor( int minor ) { + this.minor = minor; + } + + + /** + * Set absolute path to file this class was read from. + */ + public void setSourceFileName( String source_file_name ) { + this.source_file_name = source_file_name; + } + + + /** + * @param superclass_name . + */ + public void setSuperclassName( String superclass_name ) { + this.superclass_name = superclass_name; + } + + + /** + * @param superclass_name_index . + */ + public void setSuperclassNameIndex( int superclass_name_index ) { + this.superclass_name_index = superclass_name_index; + } + + /** * @return String representing class contents. */ @@ -773,6 +885,14 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl } + /** + * @param comparator Comparison strategy object + */ + public static void setComparator( BCELComparator comparator ) { + _cmp = comparator; + } + + /** * Return value as defined by given BCELComparator strategy. * By default two JavaClass objects are said to be equal when diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java index e76c2da2..1a957226 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java @@ -35,10 +35,10 @@ public final class LineNumber implements Cloneable, Node, Serializable { private static final long serialVersionUID = 169537400672820016L; /** Program Counter (PC) corresponds to line */ - private final short start_pc; + private short start_pc; /** number in source file */ - private final short line_number; + private short line_number; /** * Initialize from another object. @@ -112,6 +112,22 @@ public final class LineNumber implements Cloneable, Node, Serializable { } + /** + * @param line_number the source line number + */ + public final void setLineNumber( int line_number ) { + this.line_number = (short) line_number; + } + + + /** + * @param start_pc the pc for this line number + */ + public final void setStartPC( int start_pc ) { + this.start_pc = (short) start_pc; + } + + /** * @return String representation */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java index 9df14901..65cbffb6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java @@ -36,7 +36,7 @@ public final class LineNumberTable extends Attribute { private static final long serialVersionUID = -6967221519632128904L; - private LineNumber[] line_number_table; // Table of line/numbers pairs // TODO could be final (copy() would need adjusting) + private LineNumber[] line_number_table; // Table of line/numbers pairs /* @@ -117,6 +117,14 @@ public final class LineNumberTable extends Attribute { } + /** + * @param line_number_table the line number entries for this table + */ + public final void setLineNumberTable( LineNumber[] line_number_table ) { + this.line_number_table = line_number_table; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java index 43bb77f4..51938cb5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java @@ -34,11 +34,11 @@ import org.apache.commons.bcel6.Constants; public final class LocalVariable implements Cloneable, Node, Serializable { private static final long serialVersionUID = -51081099265972179L; - private final int start_pc; // Range in which the variable is valid - private final int length; - private final int name_index; // Index in constant pool of variable name - private final int signature_index; // Index of variable signature - private final int index; /* Variable is `index'th local variable on + private int start_pc; // Range in which the variable is valid + private int length; + private int name_index; // Index in constant pool of variable name + private int signature_index; // Index of variable signature + private int index; /* Variable is `index'th local variable on * this method's frame. */ private ConstantPool constant_pool; @@ -191,6 +191,54 @@ public final class LocalVariable implements Cloneable, Node, Serializable { } + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool( ConstantPool constant_pool ) { + this.constant_pool = constant_pool; + } + + + /** + * @param length the length of this local variable + */ + public final void setLength( int length ) { + this.length = length; + } + + + /** + * @param name_index the index into the constant pool for the name of this variable + */ + public final void setNameIndex( int name_index ) { // TODO unused + this.name_index = name_index; + } + + + /** + * @param signature_index the index into the constant pool for the signature of this variable + */ + public final void setSignatureIndex( int signature_index ) { // TODO unused + this.signature_index = signature_index; + } + + + /** + * @param index the index in the local variable table of this variable + */ + public final void setIndex( int index ) { // TODO unused + this.index = index; + } + + + /** + * @param start_pc Specify range where the local variable is valid. + */ + public final void setStartPC( int start_pc ) { // TODO unused + this.start_pc = start_pc; + } + + /** * @return string representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java index 40740ae1..da9e5e30 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public class LocalVariableTable extends Attribute { private static final long serialVersionUID = 6780929007774637689L; - private LocalVariable[] local_variable_table; // variables TODO could be final if copy() were recoded + private LocalVariable[] local_variable_table; // variables /** @@ -136,6 +136,11 @@ public class LocalVariableTable extends Attribute { } + public final void setLocalVariableTable( LocalVariable[] local_variable_table ) { + this.local_variable_table = local_variable_table; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java index fc096e40..8c3e42bf 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java @@ -108,6 +108,10 @@ public class LocalVariableTypeTable extends Attribute { return null; } + public final void setLocalVariableTable(LocalVariable[] local_variable_table) { + this.local_variable_type_table = local_variable_table; + } + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java index 47a94a13..17071908 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java @@ -35,14 +35,12 @@ public class MethodParameter implements Serializable, Cloneable { private static final long serialVersionUID = 6014494029439440326L; /** Index of the CONSTANT_Utf8_info structure in the constant_pool table representing the name of the parameter */ - private final int name_index; + private int name_index; /** The access flags */ - private final int access_flags; + private int access_flags; public MethodParameter() { - this.access_flags = 0; - this.name_index = 0; } /** @@ -61,6 +59,10 @@ public class MethodParameter implements Serializable, Cloneable { return name_index; } + public void setNameIndex(int name_index) { + this.name_index = name_index; + } + /** * Returns the name of the parameter. */ @@ -75,6 +77,10 @@ public class MethodParameter implements Serializable, Cloneable { return access_flags; } + public void setAccessFlags(int access_flags) { + this.access_flags = access_flags; + } + public boolean isFinal() { return (access_flags & Constants.ACC_FINAL) != 0; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java index 293fd16e..26e4bfa9 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java @@ -33,7 +33,7 @@ public class MethodParameters extends Attribute { private static final long serialVersionUID = 2500272580422360140L; - private MethodParameter[] parameters = new MethodParameter[0]; // TODO could be final if copy() were recoded + private MethodParameter[] parameters = new MethodParameter[0]; MethodParameters(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { super(Constants.ATTR_METHOD_PARAMETERS, name_index, length, constant_pool); @@ -49,6 +49,10 @@ public class MethodParameters extends Attribute { return parameters; } + public void setParameters(MethodParameter[] parameters) { + this.parameters = parameters; + } + @Override public void accept(Visitor v) { v.visitMethodParameters(this); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java index 87cee284..743a1548 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.Constants; public final class PMGClass extends Attribute { private static final long serialVersionUID = -7075964153234211509L; - private final int pmg_class_index, pmg_index; + private int pmg_class_index, pmg_index; /** @@ -110,6 +110,14 @@ public final class PMGClass extends Attribute { } + /** + * @param pmg_class_index + */ + public final void setPMGClassIndex( int pmg_class_index ) { + this.pmg_class_index = pmg_class_index; + } + + /** * @return Index in constant pool of source file name. */ @@ -118,6 +126,14 @@ public final class PMGClass extends Attribute { } + /** + * @param pmg_index + */ + public final void setPMGIndex( int pmg_index ) { + this.pmg_index = pmg_index; + } + + /** * @return PMG name. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java index 1c62c8a1..ab12c449 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java @@ -32,7 +32,7 @@ public abstract class ParameterAnnotations extends Attribute { private static final long serialVersionUID = 5234607357644462705L; /** Table of parameter annotations */ - private ParameterAnnotationEntry[] parameter_annotation_table; // TODO could be final would need to recode ctor and copy method + private ParameterAnnotationEntry[] parameter_annotation_table; /** * @param parameter_annotation_type the subclass type of the parameter annotation @@ -80,6 +80,14 @@ public abstract class ParameterAnnotations extends Attribute { } + /** + * @param parameter_annotation_table the entries to set in this parameter annotation + */ + public final void setParameterAnnotationTable(ParameterAnnotationEntry[] parameter_annotation_table ) { + this.parameter_annotation_table = parameter_annotation_table; + } + + /** * @return the parameter annotation entry table */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java index b0325591..0d934426 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Constants; public final class Signature extends Attribute { private static final long serialVersionUID = 5808807822688827177L; - private final int signature_index; + private int signature_index; /** @@ -107,6 +107,14 @@ public final class Signature extends Attribute { } + /** + * @param signature_index the index info the constant pool of this signature + */ + public final void setSignatureIndex( int signature_index ) { + this.signature_index = signature_index; + } + + /** * @return GJ signature. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java index 785c97e1..4c9082ae 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java @@ -27,7 +27,7 @@ import org.apache.commons.bcel6.Constants; */ public class SimpleElementValue extends ElementValue { - private final int index; + private int index; public SimpleElementValue(int type, int index, ConstantPool cpool) { @@ -43,6 +43,11 @@ public class SimpleElementValue extends ElementValue return index; } + public void setIndex(int index) + { + this.index = index; + } + public String getValueString() { if (type != STRING) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java index f57f5522..d05f5296 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java @@ -35,7 +35,7 @@ import org.apache.commons.bcel6.Constants; public final class SourceFile extends Attribute { private static final long serialVersionUID = -804226255663222912L; - private final int sourcefile_index; + private int sourcefile_index; /** @@ -114,6 +114,14 @@ public final class SourceFile extends Attribute { } + /** + * @param sourcefile_index + */ + public final void setSourceFileIndex( int sourcefile_index ) { + this.sourcefile_index = sourcefile_index; + } + + /** * @return Source file name. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java index d92e74ac..88acd54a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java @@ -40,7 +40,7 @@ import org.apache.commons.bcel6.Constants; public final class StackMap extends Attribute { private static final long serialVersionUID = -6238662431726968495L; - private StackMapEntry[] map; // Table of stack map entries // TODO could be final if ctor and copy() were recoded + private StackMapEntry[] map; // Table of stack map entries /* @@ -98,6 +98,14 @@ public final class StackMap extends Attribute { } + /** + * @param map Array of stack map entries + */ + public final void setStackMap( StackMapEntry[] map ) { + this.map = map; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index ab6589a7..5e0bd62c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -35,10 +35,10 @@ public final class StackMapEntry implements Cloneable, Serializable { private static final long serialVersionUID = 1L; - private final int byte_code_offset; - private final StackMapType[] types_of_locals; - private final StackMapType[] types_of_stack_items; - private final ConstantPool constant_pool; + private int byte_code_offset; + private StackMapType[] types_of_locals; + private StackMapType[] types_of_stack_items; + private ConstantPool constant_pool; /** @@ -126,6 +126,11 @@ public final class StackMapEntry implements Cloneable, Serializable { } + public void setByteCodeOffset( int b ) { + byte_code_offset = b; + } + + public int getByteCodeOffset() { return byte_code_offset; } @@ -136,6 +141,11 @@ public final class StackMapEntry implements Cloneable, Serializable { } + public void setTypesOfLocals( StackMapType[] types ) { + types_of_locals = types != null ? types : new StackMapType[0]; + } + + public StackMapType[] getTypesOfLocals() { return types_of_locals; } @@ -146,6 +156,11 @@ public final class StackMapEntry implements Cloneable, Serializable { } + public void setTypesOfStackItems( StackMapType[] types ) { + types_of_stack_items = types != null ? types : new StackMapType[0]; + } + + public StackMapType[] getTypesOfStackItems() { return types_of_stack_items; } @@ -182,4 +197,11 @@ public final class StackMapEntry implements Cloneable, Serializable { return constant_pool; } + + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool( ConstantPool constant_pool ) { + this.constant_pool = constant_pool; + } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java index 52f60d92..3fb9707d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java @@ -41,7 +41,7 @@ import org.apache.commons.bcel6.Constants; public final class StackMapTable extends Attribute { private static final long serialVersionUID = -5802191977296683162L; - private StackMapTableEntry[] map; // Table of stack map entries TODO could be final if copy() and ctor were rewritten + private StackMapTableEntry[] map; // Table of stack map entries /* @@ -98,6 +98,14 @@ public final class StackMapTable extends Attribute { } + /** + * @param map Array of stack map entries + */ + public final void setStackMapTable( StackMapTableEntry[] map ) { + this.map = map; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java index 4ae7a772..c8246c75 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java @@ -39,10 +39,10 @@ public final class StackMapTableEntry implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private final int frame_type; - private int byte_code_offset_delta; // TODO could be final if ctor were rewritten - private StackMapType[] types_of_locals; // TODO could be final if ctor were rewritten - private StackMapType[] types_of_stack_items; // TODO could be final if ctor were rewritten - private final ConstantPool constant_pool; // TODO could be final if ctor were rewritten + private int byte_code_offset_delta; + private StackMapType[] types_of_locals; + private StackMapType[] types_of_stack_items; + private ConstantPool constant_pool; /** @@ -196,6 +196,11 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } + public void setByteCodeOffsetDelta( int b ) { + byte_code_offset_delta = b; + } + + public int getByteCodeOffsetDelta() { return byte_code_offset_delta; } @@ -206,6 +211,11 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } + public void setTypesOfLocals( StackMapType[] types ) { + types_of_locals = types != null ? types : new StackMapType[0]; + } + + public StackMapType[] getTypesOfLocals() { return types_of_locals; } @@ -216,6 +226,11 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } + public void setTypesOfStackItems( StackMapType[] types ) { + types_of_stack_items = types != null ? types : new StackMapType[0]; + } + + public StackMapType[] getTypesOfStackItems() { return types_of_stack_items; } @@ -252,4 +267,11 @@ public final class StackMapTableEntry implements Cloneable, Serializable { return constant_pool; } + + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool( ConstantPool constant_pool ) { + this.constant_pool = constant_pool; + } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java index 00ec4df5..b27b0c38 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java @@ -37,9 +37,9 @@ public final class StackMapType implements Cloneable, Serializable { private static final long serialVersionUID = 1L; - private final byte type; - private final int index; // Index to CONSTANT_Class or offset - private final ConstantPool constant_pool; + private byte type; + private int index = -1; // Index to CONSTANT_Class or offset + private ConstantPool constant_pool; /** @@ -48,12 +48,10 @@ public final class StackMapType implements Cloneable, Serializable { * @throws IOException */ StackMapType(DataInput file, ConstantPool constant_pool) throws IOException { - byte type = file.readByte(); - if ((type < Constants.ITEM_Bogus) || (type > Constants.ITEM_NewObject)) { - throw new RuntimeException("Illegal type for StackMapType: " + type); + this(file.readByte(), -1, constant_pool); + if (hasIndex()) { + this.index = (int) file.readShort(); } - this.type = type; - this.index = hasIndex() ? (int) file.readShort() : -1; this.constant_pool = constant_pool; } @@ -72,11 +70,24 @@ public final class StackMapType implements Cloneable, Serializable { } + public void setType( byte t ) { + if ((t < Constants.ITEM_Bogus) || (t > Constants.ITEM_NewObject)) { + throw new RuntimeException("Illegal type for StackMapType: " + t); + } + type = t; + } + + public byte getType() { return type; } + public void setIndex( int t ) { + index = t; + } + + /** @return index to constant pool if type == ITEM_Object, or offset * in byte code, if type == ITEM_NewObject, and -1 otherwise */ @@ -148,4 +159,11 @@ public final class StackMapType implements Cloneable, Serializable { return constant_pool; } + + /** + * @param constant_pool Constant pool to be used for this object. + */ + public final void setConstantPool( ConstantPool constant_pool ) { + this.constant_pool = constant_pool; + } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java index f1fa492b..8b3db1cb 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java @@ -38,7 +38,7 @@ import org.apache.commons.bcel6.Constants; public final class Synthetic extends Attribute { private static final long serialVersionUID = -123334426995458366L; - private byte[] bytes; // TODO could be final if copy() and ctor were recoded + private byte[] bytes; /** @@ -120,6 +120,14 @@ public final class Synthetic extends Attribute { } + /** + * @param bytes + */ + public final void setBytes( byte[] bytes ) { + this.bytes = bytes; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java index 0277099a..4f46f3d8 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java @@ -41,7 +41,7 @@ import org.apache.commons.bcel6.Constants; public final class Unknown extends Attribute { private static final long serialVersionUID = -4099655108069755015L; - private byte[] bytes; // TODO could be final if copy() were adjusted + private byte[] bytes; private final String name; private static final Map unknown_attributes = new HashMap<>(); @@ -146,6 +146,14 @@ public final class Unknown extends Attribute { } + /** + * @param bytes the bytes to set + */ + public final void setBytes( byte[] bytes ) { + this.bytes = bytes; + } + + /** * @return String representation. */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index 3f8f74de..2f1f4327 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -54,7 +54,7 @@ public class ConstantPoolGen implements java.io.Serializable { private static final long serialVersionUID = 6664071417323174824L; private int size; - private Constant[] constants; + protected Constant[] constants; private int index = 1; // First entry (0) used by JVM private static final String METHODREF_DELIM = ":"; private static final String IMETHODREF_DELIM = "#"; @@ -688,6 +688,17 @@ public class ConstantPoolGen implements java.io.Serializable { } + /** + * Use with care! + * + * @param i index in constant pool + * @param c new constant pool entry at index i + */ + public void setConstant( int i, Constant c ) { + constants[i] = c; + } + + /** * @return intermediate constant pool */ -- GitLab From eaed3ff5cb46bd78038c362bc3706e26da92f85b Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 17 Aug 2015 23:17:48 +0000 Subject: [PATCH 0892/1313] Assembly descriptors now in standard location git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696351 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pom.xml b/pom.xml index 51942b04..b8dfd3e8 100644 --- a/pom.xml +++ b/pom.xml @@ -220,10 +220,6 @@ maven-assembly-plugin - - src/main/assembly/bin.xml - src/main/assembly/src.xml - gnu -- GitLab From 17e1eca59e193531830e0a04929089267916e1e5 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Mon, 17 Aug 2015 23:37:44 +0000 Subject: [PATCH 0893/1313] Assembly descriptors now in standard location Must still define them because CP uses non-standard location... git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696352 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index b8dfd3e8..123cf02b 100644 --- a/pom.xml +++ b/pom.xml @@ -220,6 +220,11 @@ maven-assembly-plugin + + + src/assembly/bin.xml + src/assembly/src.xml + gnu -- GitLab From 12fa860b66d1e7ea61d1e2297edcd59857ce0c66 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 18 Aug 2015 10:17:53 +0000 Subject: [PATCH 0894/1313] Revert most of BCEL-232 Re-instate "unused" setters; revert protections on mutable fields for now. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696385 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 - .../commons/bcel6/classfile/Attribute.java | 8 ++-- .../commons/bcel6/classfile/Constant.java | 2 +- .../commons/bcel6/classfile/ConstantCP.java | 31 ++++++++++++- .../commons/bcel6/classfile/ElementValue.java | 4 +- .../bcel6/classfile/FieldOrMethod.java | 11 ++--- .../generic/AnnotationElementValueGen.java | 5 ++- .../bcel6/generic/ArrayElementValueGen.java | 5 ++- .../commons/bcel6/generic/ArrayType.java | 2 +- .../bcel6/generic/BranchInstruction.java | 6 +-- .../commons/bcel6/generic/CPInstruction.java | 2 +- .../bcel6/generic/ClassElementValueGen.java | 6 ++- .../bcel6/generic/ConstantPoolGen.java | 4 +- .../bcel6/generic/ElementValueGen.java | 6 +-- .../bcel6/generic/EnumElementValueGen.java | 12 +++-- .../commons/bcel6/generic/Instruction.java | 4 +- .../bcel6/generic/InstructionComparator.java | 2 +- .../org/apache/commons/bcel6/generic/LDC.java | 4 +- .../bcel6/generic/SimpleElementValueGen.java | 44 +++++++++---------- .../apache/commons/bcel6/generic/Type.java | 4 +- 20 files changed, 96 insertions(+), 67 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 087eb56a..598ff739 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -72,7 +72,6 @@ The type attribute can be add,update,fix,remove. long type instructions are not searched by InstructionFinder using regular expression Update Java requirement from 5 to 7 Interfaces should not be used to define constants - Make mutable fields private Code must not swallow Throwable Major release of BCEL requires updating package name and maven coordinates. diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index a8256014..39ed64a5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -52,13 +52,13 @@ public abstract class Attribute implements Cloneable, Node, Serializable { private static final long serialVersionUID = -1707826820310002955L; - private int name_index; // Points to attribute name in constant pool + protected int name_index; // Points to attribute name in constant pool TODO make private (has getter & setter) - private int length; // Content length of attribute field + protected int length; // Content length of attribute field TODO make private (has getter & setter) - private final byte tag; // Tag to distinguish subclasses + protected byte tag; // Tag to distinguish subclasses TODO make private & final; supposed to be immutable - private ConstantPool constant_pool; + protected ConstantPool constant_pool; // TODO make private (has getter & setter) protected Attribute(byte tag, int name_index, int length, ConstantPool constant_pool) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java index f69b026f..d19b63f8 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java @@ -59,7 +59,7 @@ public abstract class Constant implements Cloneable, Node, Serializable { * need the tag as an index to select the corresponding class name from the * `CONSTANT_NAMES' array. */ - private final byte tag; + protected byte tag; // TODO should be private & final Constant(byte tag) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java index 1f92c65b..2dd1224d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java @@ -40,9 +40,9 @@ public abstract class ConstantCP extends Constant { */ // Note that this field is used to store the // bootstrap_method_attr_index of a ConstantInvokeDynamic. - private final int class_index; + protected int class_index; // TODO make private (has getter & setter) // This field has the same meaning for all subclasses. - private final int name_and_type_index; + protected int name_and_type_index; // TODO make private (has getter & setter) /** @@ -109,6 +109,25 @@ public abstract class ConstantCP extends Constant { } + /** + * @param class_index points to Constant_class + */ + public final void setClassIndex( int class_index ) { + this.class_index = class_index; + } + + + /** + * @param bootstrap_method_attr_index points to a BootstrapMethod. + * + * Note that this method is a functional duplicate of setClassIndex + * for use by ConstantInvokeDynamic. + */ + public final void setBootstrapMethodAttrIndex(int bootstrap_method_attr_index) { + this.class_index = bootstrap_method_attr_index; + } + + /** * @return Reference (index) to signature of the field. */ @@ -117,6 +136,14 @@ public abstract class ConstantCP extends Constant { } + /** + * @param name_and_type_index points to Constant_NameAndType + */ + public final void setNameAndTypeIndex( int name_and_type_index ) { + this.name_and_type_index = name_and_type_index; + } + + /** * @return Class this field belongs to. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java index e1fad784..1469cf5a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java @@ -27,9 +27,9 @@ import java.io.IOException; */ public abstract class ElementValue { - protected final int type; + protected int type; // TODO should be final - protected final ConstantPool cpool; + protected ConstantPool cpool; // TODO should be final @Override public String toString() diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index 53062204..9fb30aa1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -32,11 +32,12 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No private static final long serialVersionUID = -1833306330869469714L; - private int name_index; // Points to field name in constant pool - private int signature_index; // Points to encoded signature - private Attribute[] attributes; // Collection of attributes - private AnnotationEntry[] annotationEntries; // annotations defined on the field or method - private ConstantPool constant_pool; + // TODO should be made private + protected int name_index; // Points to field name in constant pool + protected int signature_index; // Points to encoded signature + protected Attribute[] attributes; // Collection of attributes + protected AnnotationEntry[] annotationEntries; // annotations defined on the field or method + protected ConstantPool constant_pool; private String signatureAttributeString = null; private boolean searchedForSignatureAttribute = false; diff --git a/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java index 2a74b0a7..37d14503 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java @@ -74,8 +74,9 @@ public class AnnotationElementValueGen extends ElementValueGen @Override public ElementValue getElementValue() { - return new AnnotationElementValue(super.getElementValueType(), a.getAnnotation(), getConstantPoolgen() - .getConstantPool()); + return new AnnotationElementValue(super.getElementValueType(), + a.getAnnotation(), + getConstantPool().getConstantPool()); } public AnnotationEntryGen getAnnotation() diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java index 4e46b31e..c4cc83bf 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java @@ -65,8 +65,9 @@ public class ArrayElementValueGen extends ElementValueGen for (ElementValueGen element : evalues) { immutableData[i++] = element.getElementValue(); } - return new ArrayElementValue(super.getElementValueType(), immutableData, getConstantPoolgen() - .getConstantPool()); + return new ArrayElementValue(super.getElementValueType(), + immutableData, + getConstantPool().getConstantPool()); } /** diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java index 3439174f..62d75a90 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java @@ -79,7 +79,7 @@ public final class ArrayType extends ReferenceType { buf.append('['); } buf.append(basic_type.getSignature()); - setSignature(buf.toString()); + super.setSignature(buf.toString()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java index 25c57cd3..57079ec1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java @@ -33,9 +33,9 @@ import org.apache.commons.bcel6.util.ByteSequence; public abstract class BranchInstruction extends Instruction implements InstructionTargeter { private static final long serialVersionUID = 3225905281842405051L; - private int index; // Branch target relative to this instruction - private InstructionHandle target; // Target object in instruction list - private int position; // Byte code offset + protected int index; // Branch target relative to this instruction + protected InstructionHandle target; // Target object in instruction list + protected int position; // Byte code offset /** diff --git a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java index cf12ed96..ba72c1b8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java @@ -40,7 +40,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct private static final long serialVersionUID = 2968547649792233082L; - private int index; // index to constant pool + protected int index; // index to constant pool /** diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java index 9edec009..5124ce7c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java @@ -56,7 +56,9 @@ public class ClassElementValueGen extends ElementValueGen @Override public ElementValue getElementValue() { - return new ClassElementValue(super.getElementValueType(), idx, getConstantPoolgen().getConstantPool()); + return new ClassElementValue(super.getElementValueType(), + idx, + getConstantPool().getConstantPool()); } public ClassElementValueGen(ClassElementValue value, ConstantPoolGen cpool, @@ -81,7 +83,7 @@ public class ClassElementValueGen extends ElementValueGen public String getClassString() { - ConstantUtf8 cu8 = (ConstantUtf8) getConstantPoolgen().getConstant(idx); + ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(idx); return cu8.getBytes(); // ConstantClass c = (ConstantClass)getConstantPool().getConstant(idx); // ConstantUtf8 utf8 = diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index 2f1f4327..6d3d23ca 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -53,9 +53,9 @@ import org.apache.commons.bcel6.classfile.ConstantUtf8; public class ConstantPoolGen implements java.io.Serializable { private static final long serialVersionUID = 6664071417323174824L; - private int size; + protected int size; protected Constant[] constants; - private int index = 1; // First entry (0) used by JVM + protected int index = 1; // First entry (0) used by JVM private static final String METHODREF_DELIM = ":"; private static final String IMETHODREF_DELIM = "#"; private static final String FIELDREF_DELIM = "&"; diff --git a/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java index c579c7ae..4c23fb09 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java @@ -34,9 +34,9 @@ import org.apache.commons.bcel6.classfile.SimpleElementValue; */ public abstract class ElementValueGen { - private final int type; + protected int type; - private final ConstantPoolGen cpGen; + protected ConstantPoolGen cpGen; protected ElementValueGen(int type, ConstantPoolGen cpGen) { @@ -143,7 +143,7 @@ public abstract class ElementValueGen } } - protected ConstantPoolGen getConstantPoolgen() + protected ConstantPoolGen getConstantPool() { return cpGen; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java index b7afbae1..f1d8eebe 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java @@ -59,8 +59,8 @@ public class EnumElementValueGen extends ElementValueGen { System.err.println("Duplicating value: " + getEnumTypeString() + ":" + getEnumValueString()); - return new EnumElementValue(super.getElementValueType(), typeIdx, valueIdx, getConstantPoolgen() - .getConstantPool()); + return new EnumElementValue(super.getElementValueType(), typeIdx, valueIdx, + getConstantPool().getConstantPool()); } public EnumElementValueGen(ObjectType t, String value, ConstantPoolGen cpool) @@ -99,8 +99,7 @@ public class EnumElementValueGen extends ElementValueGen @Override public String stringifyValue() { - ConstantUtf8 cu8 = (ConstantUtf8) getConstantPoolgen().getConstant( - valueIdx); + ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(valueIdx); return cu8.getBytes(); // ConstantString cu8 = // (ConstantString)getConstantPool().getConstant(valueIdx); @@ -117,15 +116,14 @@ public class EnumElementValueGen extends ElementValueGen // (ConstantClass)getConstantPool().getConstant(typeIdx); // return // ((ConstantUtf8)getConstantPool().getConstant(cu8.getNameIndex())).getBytes(); - return ((ConstantUtf8) getConstantPoolgen().getConstant(typeIdx)) + return ((ConstantUtf8) getConstantPool().getConstant(typeIdx)) .getBytes(); // return Utility.signatureToString(cu8.getBytes()); } public String getEnumValueString() { - return ((ConstantUtf8) getConstantPoolgen().getConstant(valueIdx)) - .getBytes(); + return ((ConstantUtf8) getConstantPool().getConstant(valueIdx)).getBytes(); // ConstantString cu8 = // (ConstantString)getConstantPool().getConstant(valueIdx); // return diff --git a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java index 7f02d61f..3a70a08a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java @@ -504,9 +504,9 @@ public abstract class Instruction implements Cloneable, Serializable { /** - * Needed in readInstruction. + * Needed in readInstruction and subclasses in this package */ - private void setOpcode( short opcode ) { + void setOpcode( short opcode ) { this.opcode = opcode; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java index 455c4fc7..9a5e8709 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java @@ -48,7 +48,7 @@ public interface InstructionComparator { return true; } } else if (i1 instanceof BranchInstruction) { - return ((BranchInstruction) i1).getTarget() == ((BranchInstruction) i2).getTarget(); + return ((BranchInstruction) i1).target == ((BranchInstruction) i2).target; } else if (i1 instanceof ConstantPushInstruction) { return ((ConstantPushInstruction) i1).getValue().equals( ((ConstantPushInstruction) i2).getValue()); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC.java b/src/main/java/org/apache/commons/bcel6/generic/LDC.java index fa3da87c..eaa1bf4c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC.java @@ -52,10 +52,10 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro // Adjust to proper size protected final void setSize() { if (super.getIndex() <= org.apache.commons.bcel6.Constants.MAX_BYTE) { // Fits in one byte? - opcode = org.apache.commons.bcel6.Constants.LDC; + super.setOpcode(org.apache.commons.bcel6.Constants.LDC); length = 2; } else { - opcode = org.apache.commons.bcel6.Constants.LDC_W; + super.setOpcode(org.apache.commons.bcel6.Constants.LDC_W); length = 3; } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java index 91a576e1..b87181fc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java @@ -53,59 +53,59 @@ public class SimpleElementValueGen extends ElementValueGen public SimpleElementValueGen(int type, ConstantPoolGen cpGen, int value) { super(type, cpGen); - idx = cpGen.addInteger(value); + idx = getConstantPool().addInteger(value); } public SimpleElementValueGen(int type, ConstantPoolGen cpGen, long value) { super(type, cpGen); - idx = cpGen.addLong(value); + idx = getConstantPool().addLong(value); } public SimpleElementValueGen(int type, ConstantPoolGen cpGen, double value) { super(type, cpGen); - idx = cpGen.addDouble(value); + idx = getConstantPool().addDouble(value); } public SimpleElementValueGen(int type, ConstantPoolGen cpGen, float value) { super(type, cpGen); - idx = cpGen.addFloat(value); + idx = getConstantPool().addFloat(value); } public SimpleElementValueGen(int type, ConstantPoolGen cpGen, short value) { super(type, cpGen); - idx = cpGen.addInteger(value); + idx = getConstantPool().addInteger(value); } public SimpleElementValueGen(int type, ConstantPoolGen cpGen, byte value) { super(type, cpGen); - idx = cpGen.addInteger(value); + idx = getConstantPool().addInteger(value); } public SimpleElementValueGen(int type, ConstantPoolGen cpGen, char value) { super(type, cpGen); - idx = cpGen.addInteger(value); + idx = getConstantPool().addInteger(value); } public SimpleElementValueGen(int type, ConstantPoolGen cpGen, boolean value) { super(type, cpGen); if (value) { - idx = cpGen.addInteger(1); + idx = getConstantPool().addInteger(1); } else { - idx = cpGen.addInteger(0); + idx = getConstantPool().addInteger(0); } } public SimpleElementValueGen(int type, ConstantPoolGen cpGen, String value) { super(type, cpGen); - idx = cpGen.addUtf8(value); + idx = getConstantPool().addUtf8(value); } /** @@ -175,7 +175,7 @@ public class SimpleElementValueGen extends ElementValueGen @Override public ElementValue getElementValue() { - return new SimpleElementValue(super.getElementValueType(), idx, getConstantPoolgen().getConstantPool()); + return new SimpleElementValue(super.getElementValueType(), idx, getConstantPool().getConstantPool()); } public int getIndex() @@ -189,7 +189,7 @@ public class SimpleElementValueGen extends ElementValueGen throw new RuntimeException( "Dont call getValueString() on a non STRING ElementValue"); } - ConstantUtf8 c = (ConstantUtf8) getConstantPoolgen().getConstant(idx); + ConstantUtf8 c = (ConstantUtf8) getConstantPool().getConstant(idx); return c.getBytes(); } @@ -199,7 +199,7 @@ public class SimpleElementValueGen extends ElementValueGen throw new RuntimeException( "Dont call getValueString() on a non STRING ElementValue"); } - ConstantInteger c = (ConstantInteger) getConstantPoolgen().getConstant(idx); + ConstantInteger c = (ConstantInteger) getConstantPool().getConstant(idx); return c.getBytes(); } @@ -210,34 +210,34 @@ public class SimpleElementValueGen extends ElementValueGen switch (super.getElementValueType()) { case PRIMITIVE_INT: - ConstantInteger c = (ConstantInteger) getConstantPoolgen().getConstant(idx); + ConstantInteger c = (ConstantInteger) getConstantPool().getConstant(idx); return Integer.toString(c.getBytes()); case PRIMITIVE_LONG: - ConstantLong j = (ConstantLong) getConstantPoolgen().getConstant(idx); + ConstantLong j = (ConstantLong) getConstantPool().getConstant(idx); return Long.toString(j.getBytes()); case PRIMITIVE_DOUBLE: - ConstantDouble d = (ConstantDouble) getConstantPoolgen().getConstant(idx); + ConstantDouble d = (ConstantDouble) getConstantPool().getConstant(idx); return Double.toString(d.getBytes()); case PRIMITIVE_FLOAT: - ConstantFloat f = (ConstantFloat) getConstantPoolgen().getConstant(idx); + ConstantFloat f = (ConstantFloat) getConstantPool().getConstant(idx); return Float.toString(f.getBytes()); case PRIMITIVE_SHORT: - ConstantInteger s = (ConstantInteger) getConstantPoolgen().getConstant(idx); + ConstantInteger s = (ConstantInteger) getConstantPool().getConstant(idx); return Integer.toString(s.getBytes()); case PRIMITIVE_BYTE: - ConstantInteger b = (ConstantInteger) getConstantPoolgen().getConstant(idx); + ConstantInteger b = (ConstantInteger) getConstantPool().getConstant(idx); return Integer.toString(b.getBytes()); case PRIMITIVE_CHAR: - ConstantInteger ch = (ConstantInteger) getConstantPoolgen().getConstant(idx); + ConstantInteger ch = (ConstantInteger) getConstantPool().getConstant(idx); return Integer.toString(ch.getBytes()); case PRIMITIVE_BOOLEAN: - ConstantInteger bo = (ConstantInteger) getConstantPoolgen().getConstant(idx); + ConstantInteger bo = (ConstantInteger) getConstantPool().getConstant(idx); if (bo.getBytes() == 0) { return "false"; } return "true"; case STRING: - ConstantUtf8 cu8 = (ConstantUtf8) getConstantPoolgen().getConstant(idx); + ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(idx); return cu8.getBytes(); default: throw new RuntimeException( diff --git a/src/main/java/org/apache/commons/bcel6/generic/Type.java b/src/main/java/org/apache/commons/bcel6/generic/Type.java index 18ef12e4..a4ee871e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Type.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Type.java @@ -35,8 +35,8 @@ import org.apache.commons.bcel6.verifier.structurals.OperandStack; public abstract class Type implements java.io.Serializable { private static final long serialVersionUID = -1985077286871826895L; - private final byte type; - private String signature; // signature for the type + protected byte type; // TODO should be final (and private) + protected String signature; // signature for the type TODO should be private /** Predefined constants */ public static final BasicType VOID = new BasicType(Constants.T_VOID); -- GitLab From a300945e54f7f7ab3a86c7de05d723d4f702b16e Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 18 Aug 2015 10:50:01 +0000 Subject: [PATCH 0895/1313] No need for new field to be protected as there is a getter git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696391 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/classfile/FieldOrMethod.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index 9fb30aa1..fb111081 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -36,7 +36,8 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No protected int name_index; // Points to field name in constant pool protected int signature_index; // Points to encoded signature protected Attribute[] attributes; // Collection of attributes - protected AnnotationEntry[] annotationEntries; // annotations defined on the field or method + // @since 6.0 + private AnnotationEntry[] annotationEntries; // annotations defined on the field or method protected ConstantPool constant_pool; private String signatureAttributeString = null; @@ -213,6 +214,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No /** * @return Annotations on the field or method + * @since 6.0 */ public AnnotationEntry[] getAnnotationEntries() { if (annotationEntries == null) { @@ -226,6 +228,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * Hunts for a signature attribute on the member and returns its contents. So where the 'regular' signature * may be (Ljava/util/Vector;)V the signature attribute may in fact say 'Ljava/lang/Vector<Ljava/lang/String>;' * Coded for performance - searches for the attribute only when requested - only searches for it once. + * @since 6.0 */ public final String getGenericSignature() { -- GitLab From f5e8a156a700ece9919778f4a4ca6753739141dd Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 18 Aug 2015 11:34:26 +0000 Subject: [PATCH 0896/1313] BCEL-201 patch incorrectly made this public git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696402 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/util/BCELifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java index a2ea4089..5c4bcbb7 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java @@ -192,7 +192,7 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { } - public static String printFlags( int flags, int reason ) { + static String printFlags( int flags, int reason ) { if (flags == 0) { return "0"; } -- GitLab From 011d22895719c182ad3ddce859756154a2eb7a37 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 18 Aug 2015 12:08:33 +0000 Subject: [PATCH 0897/1313] Add @since markers git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696407 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/Attribute.java | 2 ++ .../bcel6/classfile/ClassFormatException.java | 8 +++-- .../commons/bcel6/classfile/ConstantCP.java | 2 ++ .../commons/bcel6/classfile/ConstantUtf8.java | 9 +++++ .../bcel6/classfile/DescendingVisitor.java | 33 +++++++++++++++++++ .../commons/bcel6/classfile/JavaClass.java | 12 +++++-- .../classfile/LocalVariableTypeTable.java | 2 +- .../commons/bcel6/classfile/Method.java | 1 + .../commons/bcel6/classfile/Signature.java | 2 ++ .../bcel6/classfile/StackMapEntry.java | 4 ++- .../commons/bcel6/classfile/StackMapType.java | 3 +- .../classfile/UnknownAttributeReader.java | 1 + .../commons/bcel6/classfile/Utility.java | 1 + 13 files changed, 73 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index 39ed64a5..11100974 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -150,6 +150,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable * @return Attribute * @throws IOException * @throws ClassFormatException + * @since 6.0 */ public static Attribute readAttribute(DataInput file, ConstantPool constant_pool) throws IOException, ClassFormatException @@ -235,6 +236,7 @@ public abstract class Attribute implements Cloneable, Node, Serializable /** * @return Name of attribute + * @since 6.0 */ public String getName() { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java b/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java index f6eedcd2..f21397a2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java @@ -37,7 +37,11 @@ public class ClassFormatException extends RuntimeException { super(s); } - public ClassFormatException(String s, Throwable initCause) { - super(s, initCause); + /** + * {@inheritDoc} + * @since 6.0 + */ + public ClassFormatException(String message, Throwable cause) { + super(message, cause); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java index 2dd1224d..2fe65c5b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java @@ -103,6 +103,7 @@ public abstract class ConstantCP extends Constant { * * Note that this method is a functional duplicate of getClassIndex * for use by ConstantInvokeDynamic. + * @since 6.0 */ public final int getBootstrapMethodAttrIndex() { return class_index; // AKA bootstrap_method_attr_index @@ -122,6 +123,7 @@ public abstract class ConstantCP extends Constant { * * Note that this method is a functional duplicate of setClassIndex * for use by ConstantInvokeDynamic. + * @since 6.0 */ public final void setBootstrapMethodAttrIndex(int bootstrap_method_attr_index) { this.class_index = bootstrap_method_attr_index; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java index c463440c..9c2cc9d3 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java @@ -88,6 +88,9 @@ public final class ConstantUtf8 extends Constant { } } + /** + * @since 6.0 + */ public static ConstantUtf8 getCachedInstance(String s) { if (s.length() > MAX_CACHED_SIZE) { skipped++; @@ -106,10 +109,16 @@ public final class ConstantUtf8 extends Constant { } } + /** + * @since 6.0 + */ public static ConstantUtf8 getInstance(String s) { return new ConstantUtf8(s); } + /** + * @since 6.0 + */ public static ConstantUtf8 getInstance (DataInput input) throws IOException { return getInstance(input.readUTF()); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java index 38f9a4ba..b54eb0b7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java @@ -106,6 +106,9 @@ public class DescendingVisitor implements Visitor stack.pop(); } + /** + * @since 6.0 + */ @Override public void visitAnnotation(Annotations annotation) { @@ -118,6 +121,9 @@ public class DescendingVisitor implements Visitor stack.pop(); } + /** + * @since 6.0 + */ @Override public void visitAnnotationEntry(AnnotationEntry annotationEntry) { @@ -242,6 +248,9 @@ public class DescendingVisitor implements Visitor stack.pop(); } + /** + * @since 6.0 + */ @Override public void visitStackMapTable(StackMapTable table) { @@ -254,6 +263,9 @@ public class DescendingVisitor implements Visitor stack.pop(); } + /** + * @since 6.0 + */ @Override public void visitStackMapTableEntry(StackMapTableEntry var) { @@ -335,6 +347,9 @@ public class DescendingVisitor implements Visitor stack.pop(); } + /** + * @since 6.0 + */ @Override public void visitConstantInvokeDynamic( ConstantInvokeDynamic constant) @@ -404,6 +419,9 @@ public class DescendingVisitor implements Visitor stack.pop(); } + /** + * @since 6.0 + */ @Override public void visitBootstrapMethods(BootstrapMethods bm) { @@ -457,6 +475,9 @@ public class DescendingVisitor implements Visitor stack.pop(); } + /** + * @since 6.0 + */ @Override public void visitAnnotationDefault(AnnotationDefault obj) { @@ -465,6 +486,9 @@ public class DescendingVisitor implements Visitor stack.pop(); } + /** + * @since 6.0 + */ @Override public void visitEnclosingMethod(EnclosingMethod obj) { @@ -473,6 +497,9 @@ public class DescendingVisitor implements Visitor stack.pop(); } + /** + * @since 6.0 + */ @Override public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) { @@ -481,6 +508,9 @@ public class DescendingVisitor implements Visitor stack.pop(); } + /** + * @since 6.0 + */ @Override public void visitParameterAnnotation(ParameterAnnotations obj) { @@ -489,6 +519,9 @@ public class DescendingVisitor implements Visitor stack.pop(); } + /** + * @since 6.0 + */ @Override public void visitMethodParameters(MethodParameters obj) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 30d6da9c..5fa80db8 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -338,6 +338,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @return Annotations on the class + * @since 6.0 */ public AnnotationEntry[] getAnnotationEntries() { if (annotations == null) { @@ -701,11 +702,17 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl return (super.getAccessFlags() & Constants.ACC_INTERFACE) == 0; } + /** + * @since 6.0 + */ public final boolean isAnonymous() { computeNestedTypeStatus(); return this.isAnonymous; } + /** + * @since 6.0 + */ public final boolean isNested() { computeNestedTypeStatus(); return this.isNested; @@ -713,8 +720,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl private void computeNestedTypeStatus() { if (computedNestedTypeStatus) { - return; - } + return; + } for (Attribute attribute : this.attributes) { if (attribute instanceof InnerClasses) { InnerClass[] innerClasses = ((InnerClasses) attribute).getInnerClasses(); @@ -909,6 +916,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * Return the natural ordering of two JavaClasses. * This ordering is based on the class name + * @since 6.0 */ @Override public int compareTo( JavaClass obj ) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java index 8c3e42bf..a754bb91 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java @@ -52,7 +52,7 @@ import org.apache.commons.bcel6.Constants; // J5TODO: Needs some testing ! /** - * since 6.0 + * @since 6.0 */ public class LocalVariableTypeTable extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Method.java b/src/main/java/org/apache/commons/bcel6/classfile/Method.java index 4255395e..b0708bf7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Method.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Method.java @@ -263,6 +263,7 @@ public final class Method extends FieldOrMethod { /** * @return Annotations on the parameters of a method + * @since 6.0 */ public ParameterAnnotationEntry[] getParameterAnnotationEntries() { if (parameterAnnotationEntries == null) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java index 0d934426..3966b194 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java @@ -239,11 +239,13 @@ public final class Signature extends Attribute { } + // @since 6.0 is no longer final public static boolean isFormalParameterList( String s ) { return s.startsWith("<") && (s.indexOf(':') > 0); } + // @since 6.0 is no longer final public static boolean isActualParameterList( String s ) { return s.startsWith("L") && s.endsWith(">;"); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index 5e0bd62c..b364afb2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -31,7 +31,9 @@ import java.io.Serializable; * @see StackMap * @see StackMapType */ -public final class StackMapEntry implements Cloneable, Serializable { +public final class StackMapEntry implements Cloneable + ,Serializable /* since 6.0 */ +{ private static final long serialVersionUID = 1L; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java index b27b0c38..b3dd0843 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java @@ -33,7 +33,8 @@ import org.apache.commons.bcel6.Constants; * @see StackMap * @see Constants */ -public final class StackMapType implements Cloneable, Serializable { +public final class StackMapType implements Cloneable + ,Serializable /* since 6.0 */ { private static final long serialVersionUID = 1L; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java b/src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java index 16863eea..1c2375c5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java @@ -24,6 +24,7 @@ package org.apache.commons.bcel6.classfile; * * @see Attribute * @version $Id$ + * @since 6.0 */ public interface UnknownAttributeReader { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java index 5113449b..c3af19e6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java @@ -42,6 +42,7 @@ import org.apache.commons.bcel6.util.ByteSequence; * * @version $Id$ */ +// @since 6.0 methods are no longer final public abstract class Utility { private static int unwrap( ThreadLocal tl ) { -- GitLab From 49b0172e3f6e8be43c2abef1780957e3830e13c7 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 18 Aug 2015 12:16:21 +0000 Subject: [PATCH 0898/1313] Add @since markers git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696410 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/generic/ARRAYLENGTH.java | 2 +- .../commons/bcel6/generic/BasicType.java | 1 + .../bcel6/generic/BranchInstruction.java | 5 ++++- .../commons/bcel6/generic/Instruction.java | 2 ++ .../commons/bcel6/generic/ObjectType.java | 3 +++ .../org/apache/commons/bcel6/generic/PUSH.java | 1 + .../apache/commons/bcel6/generic/Select.java | 2 +- .../org/apache/commons/bcel6/generic/Type.java | 2 ++ .../apache/commons/bcel6/util/ClassPath.java | 4 ++++ .../verifier/VerifierFactoryListModel.java | 3 +++ .../exc/AssertionViolatedException.java | 1 + .../verifier/exc/ClassConstraintException.java | 1 + .../verifier/statics/StringRepresentation.java | 18 ++++++++++++++++++ .../verifier/structurals/ExecutionVisitor.java | 5 ++++- .../structurals/InstConstraintVisitor.java | 1 + .../verifier/structurals/Pass3bVerifier.java | 1 + 16 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java b/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java index 532d8d5d..7762bffa 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java @@ -23,7 +23,7 @@ package org.apache.commons.bcel6.generic; * * @version $Id$ */ -public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackProducer, StackConsumer { +public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackProducer, StackConsumer /* since 6.0 */ { private static final long serialVersionUID = 3038891629544391578L; diff --git a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java index 42a8f157..7ec7a9be 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java @@ -43,6 +43,7 @@ public final class BasicType extends Type { } + // @since 6.0 no longer final public static BasicType getType( byte type ) { switch (type) { case Constants.T_VOID: diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java index 57079ec1..30ae2d6a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java @@ -244,6 +244,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi /** * @return the position + * @since 6.0 */ public int getPosition() { return position; @@ -253,8 +254,9 @@ public abstract class BranchInstruction extends Instruction implements Instructi /** * @param position the position to set * @return the new position + * @since 6.0 */ - public int setGetPosition(int position) { + protected int setGetPosition(int position) { this.position = position; return position; } @@ -262,6 +264,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi /** * @param index the index to set + * @since 6.0 */ protected void setIndex(int index) { this.index = index; diff --git a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java index 3a70a08a..ca088332 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java @@ -144,6 +144,7 @@ public abstract class Instruction implements Cloneable, Serializable { * @param bytes input stream bytes * @return instruction object being read */ + // @since 6.0 no longer final public static Instruction readInstruction( ByteSequence bytes ) throws IOException { boolean wide = false; short opcode = (short) bytes.readUnsignedByte(); @@ -538,6 +539,7 @@ public abstract class Instruction implements Cloneable, Serializable { /** calculate the hashCode of this object * @return the hashCode + * @since 6.0 */ @Override public int hashCode() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java index 53b4a914..71342429 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java @@ -31,6 +31,9 @@ public class ObjectType extends ReferenceType { private static final long serialVersionUID = -2819379966444533294L; private final String class_name; // Class name of type + /** + * @since 6.0 + */ public static ObjectType getInstance(String class_name) { return new ObjectType(class_name); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java index 418fb01b..70831a8d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java @@ -121,6 +121,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * * @param cp * @param value + * @since 6.0 */ public PUSH(ConstantPoolGen cp, ObjectType value) { if (value == null) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/Select.java b/src/main/java/org/apache/commons/bcel6/generic/Select.java index b6b540f1..5211c23c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Select.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Select.java @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.util.ByteSequence; * @see InstructionList */ public abstract class Select extends BranchInstruction implements VariableLengthInstruction, - StackConsumer, StackProducer { + StackConsumer /* @since 6.0 */, StackProducer { private static final long serialVersionUID = 2806771744559217250L; protected int[] match; // matches, i.e., case 1: ... TODO could be package-protected? diff --git a/src/main/java/org/apache/commons/bcel6/generic/Type.java b/src/main/java/org/apache/commons/bcel6/generic/Type.java index a4ee871e..295a7244 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Type.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Type.java @@ -113,6 +113,7 @@ public abstract class Type implements java.io.Serializable { * returns the given type. * @see OperandStack#push(Type) * @see LocalVariables#set(int, Type) + * @since 6.0 */ public Type normalizeForStackOrLocal(){ if (this == Type.BOOLEAN || this == Type.BYTE || this == Type.SHORT || this == Type.CHAR){ @@ -191,6 +192,7 @@ public abstract class Type implements java.io.Serializable { * @param signature signature string such as Ljava/lang/String; * @return type object */ + // @since 6.0 no longer final public static Type getType( String signature ) throws StringIndexOutOfBoundsException { byte type = Utility.typeOfSignature(signature); if (type <= Constants.T_VOID) { diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index 3f1aac64..75f5df1d 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -143,6 +143,7 @@ public class ClassPath implements Serializable { * * @return class path as used by default by BCEL */ + // @since 6.0 no longer final public static String getClassPath() { String class_path = System.getProperty("java.class.path"); String boot_path = System.getProperty("sun.boot.class.path"); @@ -203,6 +204,7 @@ public class ClassPath implements Serializable { /** * @param name fully qualified resource name, e.g. java/lang/String.class * @return InputStream supplying the resource, or null if no resource with that name. + * @since 6.0 */ public InputStream getResourceAsStream(String name) { for (PathEntry path : paths) { @@ -217,6 +219,7 @@ public class ClassPath implements Serializable { /** * @param name fully qualified resource name, e.g. java/lang/String.class * @return URL supplying the resource, or null if no resource with that name. + * @since 6.0 */ public URL getResource(String name) { for (PathEntry path : paths) { @@ -232,6 +235,7 @@ public class ClassPath implements Serializable { * @param name fully qualified resource name, e.g. java/lang/String.class * @return An Enumeration of URLs supplying the resource, or an * empty Enumeration if no resource with that name. + * @since 6.0 */ public Enumeration getResources(String name) { Vector results = new Vector<>(); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java index 0d57f23d..1575e650 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java @@ -77,6 +77,9 @@ public class VerifierFactoryListModel implements VerifierFactoryObserver, } + /** + * @since 6.0 + */ @Override public synchronized String getElementAt( int index ) { return (cache.toArray(new String[cache.size()]))[index]; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java index 3a6ec982..c29518bd 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java @@ -42,6 +42,7 @@ public final class AssertionViolatedException extends RuntimeException{ } /** * Constructs a new AssertionViolationException with the specified error message and initial cause + * @since 6.0 */ public AssertionViolatedException(String message, Throwable initCause) { super(message = "INTERNAL ERROR: "+message, initCause); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java index eddb07fb..c75ebc2c 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java @@ -44,6 +44,7 @@ public class ClassConstraintException extends VerificationException{ /** * Constructs a new ClassConstraintException with the specified error message and cause + * @since 6.0 */ public ClassConstraintException(String message, Throwable initCause){ super(message, initCause); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java index 48986e25..18101604 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java @@ -134,6 +134,9 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp tostring = ""; // We don't need real code outputs. } + /** + * @since 6.0 + */ @Override public void visitAnnotation(Annotations obj) { @@ -142,6 +145,9 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp tostring = toString(obj); } + /** + * @since 6.0 + */ @Override public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) { @@ -290,6 +296,9 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp tostring = toString(obj); } + /** + * @since 6.0 + */ @Override public void visitStackMapTable(StackMapTable obj) { tostring = toString(obj); @@ -305,16 +314,25 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp tostring = toString(obj); } + /** + * @since 6.0 + */ @Override public void visitEnclosingMethod(EnclosingMethod obj) { tostring = toString(obj); } + /** + * @since 6.0 + */ @Override public void visitBootstrapMethods(BootstrapMethods obj) { tostring = toString(obj); } + /** + * @since 6.0 + */ @Override public void visitMethodParameters(MethodParameters obj) { tostring = toString(obj); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java index a541f682..4e8ea05b 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java @@ -785,7 +785,10 @@ public class ExecutionVisitor extends EmptyVisitor{ stack().pop(); stack().push(Type.INT); } - /** Symbolically executes the corresponding Java Virtual Machine instruction. */ + /** + * Symbolically executes the corresponding Java Virtual Machine instruction. + * @since 6.0 + */ @Override public void visitINVOKEDYNAMIC(INVOKEDYNAMIC o){ for (int i=0; i Date: Tue, 18 Aug 2015 12:32:32 +0000 Subject: [PATCH 0899/1313] Reduce visibility of field added in 6.0 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696411 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/generic/AnnotationEntryGen.java | 10 ++++---- .../commons/bcel6/generic/ClassGen.java | 2 +- .../commons/bcel6/generic/FieldGen.java | 2 +- .../bcel6/generic/FieldGenOrMethodGen.java | 23 +++++++++++++++---- .../commons/bcel6/generic/MethodGen.java | 9 +++++++- .../bcel6/generic/AnnotationGenTestCase.java | 4 ++-- .../FieldAnnotationsTestCase.java | 6 ++--- 7 files changed, 37 insertions(+), 19 deletions(-) rename src/test/java/org/apache/commons/bcel6/{ => generic}/FieldAnnotationsTestCase.java (97%) diff --git a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java index 3caa9e40..2af12d53 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java @@ -194,10 +194,10 @@ public class AnnotationEntryGen { * that can be attached to the class file. * * @param cp The constant pool gen where we can create the necessary name refs - * @param vec A list of AnnotationGen objects + * @param annotationEntryGens An array of AnnotationGen objects */ - static Attribute[] getAnnotationAttributes(ConstantPoolGen cp, List vec) { - if (vec.isEmpty()) { + static Attribute[] getAnnotationAttributes(ConstantPoolGen cp, AnnotationEntryGen[] annotationEntryGens) { + if (annotationEntryGens.length == 0) { return new Attribute[0]; } @@ -206,7 +206,7 @@ public class AnnotationEntryGen { int countInvisible = 0; // put the annotations in the right output stream - for (AnnotationEntryGen a : vec) { + for (AnnotationEntryGen a : annotationEntryGens) { if (a.isRuntimeVisible()) { countVisible++; } else { @@ -223,7 +223,7 @@ public class AnnotationEntryGen { riaDos.writeShort(countInvisible); // put the annotations in the right output stream - for (AnnotationEntryGen a : vec) { + for (AnnotationEntryGen a : annotationEntryGens) { if (a.isRuntimeVisible()) { a.dump(rvaDos); } else { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index dbea4d81..1f094c3a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -204,7 +204,7 @@ public class ClassGen extends AccessFlags implements Cloneable { attributes = getAttributes(); } else { // TODO: Sometime later, trash any attributes called 'RuntimeVisibleAnnotations' or 'RuntimeInvisibleAnnotations' - Attribute[] annAttributes = AnnotationEntryGen.getAnnotationAttributes(cp,annotation_vec); + Attribute[] annAttributes = AnnotationEntryGen.getAnnotationAttributes(cp, getAnnotationEntries()); attributes = new Attribute[attribute_vec.size()+annAttributes.length]; attribute_vec.toArray(attributes); System.arraycopy(annAttributes,0,attributes,attribute_vec.size(),annAttributes.length); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index e26d576d..34419f6e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -228,7 +228,7 @@ public class FieldGen extends FieldGenOrMethodGen { } private void addAnnotationsAsAttribute(ConstantPoolGen cp) { - Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp,annotation_vec); + Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp, super.getAnnotationEntries()); for (Attribute attr : attrs) { addAttribute(attr); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java index f597288c..5b3fce2a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java @@ -37,14 +37,18 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn protected Type type; protected ConstantPoolGen cp; private final List attribute_vec = new ArrayList<>(); - protected List annotation_vec= new ArrayList<>(); + // @since 6.0 + private List annotation_vec= new ArrayList<>(); protected FieldGenOrMethodGen() { } - public FieldGenOrMethodGen(int access_flags) { + /** + * @since 6.0 + */ + protected FieldGenOrMethodGen(int access_flags) { // TODO could this be package protected? super(access_flags); } @@ -99,7 +103,10 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn attribute_vec.add(a); } - public void addAnnotationEntry(AnnotationEntryGen ag) + /** + * @since 6.0 + */ + protected void addAnnotationEntry(AnnotationEntryGen ag) // TODO could this be package protected? { annotation_vec.add(ag); } @@ -112,7 +119,10 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn attribute_vec.remove(a); } - public void removeAnnotationEntry(AnnotationEntryGen ag) + /** + * @since 6.0 + */ + protected void removeAnnotationEntry(AnnotationEntryGen ag) // TODO could this be package protected? { annotation_vec.remove(ag); } @@ -125,7 +135,10 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn attribute_vec.clear(); } - public void removeAnnotationEntries() + /** + * @since 6.0 + */ + protected void removeAnnotationEntries() // TODO could this be package protected? { annotation_vec.clear(); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index bd2e459e..fceb9555 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -591,13 +591,19 @@ public class MethodGen extends FieldGenOrMethodGen { return attributes; } + /** + * @since 6.0 + */ public void addAnnotationsAsAttribute(ConstantPoolGen cp) { - Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp,annotation_vec); + Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp, super.getAnnotationEntries()); for (Attribute attr : attrs) { addAttribute(attr); } } + /** + * @since 6.0 + */ public void addParameterAnnotationsAsAttribute(ConstantPoolGen cp) { if (!hasParameterAnnotations) { return; @@ -1070,6 +1076,7 @@ public class MethodGen extends FieldGenOrMethodGen { // is more likely to suggest to the caller it is readonly (which a List does not). /** * Return a list of AnnotationGen objects representing parameter annotations + * @since 6.0 */ public List getAnnotationsOnParameter(int i) { ensureExistingParameterAnnotationsUnpacked(); diff --git a/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java index c552d8c1..37fe1f5c 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java @@ -98,7 +98,7 @@ public class AnnotationGenTestCase extends AbstractTestCase AnnotationEntryGen a = new AnnotationEntryGen(t, elements, true, cp); List v = new ArrayList<>(); v.add(a); - Attribute[] attributes = AnnotationEntryGen.getAnnotationAttributes(cp, v); + Attribute[] attributes = AnnotationEntryGen.getAnnotationAttributes(cp, v.toArray(new AnnotationEntryGen[0])); boolean foundRV = false; for (Attribute attribute : attributes) { if (attribute instanceof RuntimeVisibleAnnotations) @@ -113,7 +113,7 @@ public class AnnotationGenTestCase extends AbstractTestCase AnnotationEntryGen a2 = new AnnotationEntryGen(t, elements, false, cp); List v2 = new ArrayList<>(); v2.add(a2); - Attribute[] attributes2 = AnnotationEntryGen.getAnnotationAttributes(cp, v2); + Attribute[] attributes2 = AnnotationEntryGen.getAnnotationAttributes(cp, v2.toArray(new AnnotationEntryGen[0])); boolean foundRIV = false; for (Attribute attribute : attributes2) { if (attribute instanceof RuntimeInvisibleAnnotations) diff --git a/src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/FieldAnnotationsTestCase.java similarity index 97% rename from src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java rename to src/test/java/org/apache/commons/bcel6/generic/FieldAnnotationsTestCase.java index 7d282e0c..5400fc59 100644 --- a/src/test/java/org/apache/commons/bcel6/FieldAnnotationsTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/FieldAnnotationsTestCase.java @@ -16,18 +16,16 @@ * */ -package org.apache.commons.bcel6; +package org.apache.commons.bcel6.generic; import java.io.File; import java.io.IOException; +import org.apache.commons.bcel6.AbstractTestCase; import org.apache.commons.bcel6.classfile.AnnotationEntry; import org.apache.commons.bcel6.classfile.ElementValuePair; import org.apache.commons.bcel6.classfile.Field; import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.generic.AnnotationEntryGen; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.FieldGen; import org.apache.commons.bcel6.util.SyntheticRepository; public class FieldAnnotationsTestCase extends AbstractTestCase -- GitLab From 3d18de89cb960df1a785472ca46ec9cc67ee08ea Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 19 Aug 2015 21:03:59 +0000 Subject: [PATCH 0900/1313] BCEL-248 Rename private variables so code is much closer to StackMapEntry git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696668 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/classfile/StackMapTableEntry.java | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java index c8246c75..3311818b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java @@ -39,53 +39,53 @@ public final class StackMapTableEntry implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private final int frame_type; - private int byte_code_offset_delta; + private int byte_code_offset; private StackMapType[] types_of_locals; private StackMapType[] types_of_stack_items; private ConstantPool constant_pool; /** - * Construct object from file stream. - * * - * @param file Input stream + * Construct object from input stream. + * + * @param input Input stream * @throws IOException */ - StackMapTableEntry(DataInput file, ConstantPool constant_pool) throws IOException { - this(file.readByte() & 0xFF, -1, null, null, constant_pool); + StackMapTableEntry(DataInput input, ConstantPool constant_pool) throws IOException { + this(input.readByte() & 0xFF, -1, null, null, constant_pool); if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { - byte_code_offset_delta = frame_type - Constants.SAME_FRAME; + byte_code_offset = frame_type - Constants.SAME_FRAME; } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { - byte_code_offset_delta = frame_type - Constants.SAME_LOCALS_1_STACK_ITEM_FRAME; + byte_code_offset = frame_type - Constants.SAME_LOCALS_1_STACK_ITEM_FRAME; types_of_stack_items = new StackMapType[1]; - types_of_stack_items[0] = new StackMapType(file, constant_pool); + types_of_stack_items[0] = new StackMapType(input, constant_pool); } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { - byte_code_offset_delta = file.readShort(); + byte_code_offset = input.readShort(); types_of_stack_items = new StackMapType[1]; - types_of_stack_items[0] = new StackMapType(file, constant_pool); + types_of_stack_items[0] = new StackMapType(input, constant_pool); } else if (frame_type >= Constants.CHOP_FRAME && frame_type <= Constants.CHOP_FRAME_MAX) { - byte_code_offset_delta = file.readShort(); + byte_code_offset = input.readShort(); } else if (frame_type == Constants.SAME_FRAME_EXTENDED) { - byte_code_offset_delta = file.readShort(); + byte_code_offset = input.readShort(); } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { - byte_code_offset_delta = file.readShort(); + byte_code_offset = input.readShort(); int number_of_locals = frame_type - 251; types_of_locals = new StackMapType[number_of_locals]; for (int i = 0; i < number_of_locals; i++) { - types_of_locals[i] = new StackMapType(file, constant_pool); + types_of_locals[i] = new StackMapType(input, constant_pool); } } else if (frame_type == Constants.FULL_FRAME) { - byte_code_offset_delta = file.readShort(); - int number_of_locals = file.readShort(); + byte_code_offset = input.readShort(); + int number_of_locals = input.readShort(); types_of_locals = new StackMapType[number_of_locals]; for (int i = 0; i < number_of_locals; i++) { - types_of_locals[i] = new StackMapType(file, constant_pool); + types_of_locals[i] = new StackMapType(input, constant_pool); } - int number_of_stack_items = file.readShort(); + int number_of_stack_items = input.readShort(); types_of_stack_items = new StackMapType[number_of_stack_items]; for (int i = 0; i < number_of_stack_items; i++) { - types_of_stack_items[i] = new StackMapType(file, constant_pool); + types_of_stack_items[i] = new StackMapType(input, constant_pool); } } else { /* Can't happen */ @@ -94,11 +94,11 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } - public StackMapTableEntry(int tag, int byte_code_offset_delta, + public StackMapTableEntry(int tag, int byte_code_offset, StackMapType[] types_of_locals, StackMapType[] types_of_stack_items, ConstantPool constant_pool) { this.frame_type = tag; - this.byte_code_offset_delta = byte_code_offset_delta; + this.byte_code_offset = byte_code_offset; this.types_of_locals = types_of_locals != null ? types_of_locals : new StackMapType[0]; this.types_of_stack_items = types_of_stack_items != null ? types_of_stack_items : new StackMapType[0]; this.constant_pool = constant_pool; @@ -118,19 +118,19 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { types_of_stack_items[0].dump(file); } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { - file.writeShort(byte_code_offset_delta); + file.writeShort(byte_code_offset); types_of_stack_items[0].dump(file); } else if (frame_type >= Constants.CHOP_FRAME && frame_type <= Constants.CHOP_FRAME_MAX) { - file.writeShort(byte_code_offset_delta); + file.writeShort(byte_code_offset); } else if (frame_type == Constants.SAME_FRAME_EXTENDED) { - file.writeShort(byte_code_offset_delta); + file.writeShort(byte_code_offset); } else if (frame_type >= Constants.APPEND_FRAME && frame_type <= Constants.APPEND_FRAME_MAX) { - file.writeShort(byte_code_offset_delta); + file.writeShort(byte_code_offset); for (StackMapType type : types_of_locals) { type.dump(file); } } else if (frame_type == Constants.FULL_FRAME) { - file.writeShort(byte_code_offset_delta); + file.writeShort(byte_code_offset); file.writeShort(types_of_locals.length); for (StackMapType type : types_of_locals) { type.dump(file); @@ -170,7 +170,7 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } else { buf.append("UNKNOWN"); } - buf.append(", offset delta=").append(byte_code_offset_delta); + buf.append(", offset delta=").append(byte_code_offset); if (types_of_locals.length > 0) { buf.append(", locals={"); for (int i = 0; i < types_of_locals.length; i++) { @@ -196,16 +196,16 @@ public final class StackMapTableEntry implements Cloneable, Serializable { } - public void setByteCodeOffsetDelta( int b ) { - byte_code_offset_delta = b; + public void setByteCodeOffset( int b ) { + byte_code_offset = b; } - public int getByteCodeOffsetDelta() { - return byte_code_offset_delta; + public int getByteCodeOffset() { + return byte_code_offset; } - + public int getNumberOfLocals() { return types_of_locals.length; } -- GitLab From 4463a5ac3eb8fd2141e21ee61684a8bfb50609b4 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 19 Aug 2015 21:46:34 +0000 Subject: [PATCH 0901/1313] BCEL-242 Remove Seializable git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696673 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/classfile/AccessFlags.java | 3 +-- .../apache/commons/bcel6/classfile/AnnotationEntry.java | 5 +---- .../org/apache/commons/bcel6/classfile/Attribute.java | 5 +---- .../apache/commons/bcel6/classfile/BootstrapMethod.java | 5 +---- .../org/apache/commons/bcel6/classfile/CodeException.java | 4 +--- .../java/org/apache/commons/bcel6/classfile/Constant.java | 4 +--- .../org/apache/commons/bcel6/classfile/ConstantPool.java | 4 +--- .../org/apache/commons/bcel6/classfile/InnerClass.java | 4 +--- .../org/apache/commons/bcel6/classfile/LineNumber.java | 5 +---- .../org/apache/commons/bcel6/classfile/LocalVariable.java | 4 +--- .../apache/commons/bcel6/classfile/MethodParameter.java | 5 +---- .../org/apache/commons/bcel6/classfile/StackMapEntry.java | 4 ---- .../commons/bcel6/classfile/StackMapTableEntry.java | 5 +---- .../org/apache/commons/bcel6/classfile/StackMapType.java | 6 +----- .../apache/commons/bcel6/generic/CodeExceptionGen.java | 3 +-- .../org/apache/commons/bcel6/generic/ConstantPoolGen.java | 8 +++----- .../org/apache/commons/bcel6/generic/Instruction.java | 4 +--- .../apache/commons/bcel6/generic/InstructionFactory.java | 5 ++--- .../apache/commons/bcel6/generic/InstructionHandle.java | 3 +-- .../org/apache/commons/bcel6/generic/InstructionList.java | 4 +--- .../org/apache/commons/bcel6/generic/LineNumberGen.java | 3 +-- .../apache/commons/bcel6/generic/LocalVariableGen.java | 4 +--- src/main/java/org/apache/commons/bcel6/generic/Type.java | 3 +-- .../java/org/apache/commons/bcel6/util/ClassPath.java | 7 ++----- .../java/org/apache/commons/bcel6/util/ClassQueue.java | 3 +-- src/main/java/org/apache/commons/bcel6/util/ClassSet.java | 3 +-- .../java/org/apache/commons/bcel6/util/ClassStack.java | 3 +-- .../java/org/apache/commons/bcel6/util/Repository.java | 2 +- 28 files changed, 31 insertions(+), 87 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java index be8ac514..fb28f872 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java @@ -25,9 +25,8 @@ import org.apache.commons.bcel6.Constants; * * @version $Id$ */ -public abstract class AccessFlags implements java.io.Serializable { +public abstract class AccessFlags { - private static final long serialVersionUID = 2845404654039163061L; protected int access_flags; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java index 983edce8..e75889a6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -33,9 +32,7 @@ import org.apache.commons.bcel6.Constants; * @version $Id: AnnotationEntry * @since 6.0 */ -public class AnnotationEntry implements Node, Serializable { - - private static final long serialVersionUID = 1L; +public class AnnotationEntry implements Node { private final int type_index; private final ConstantPool constant_pool; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index 11100974..b9c3954f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -21,7 +21,6 @@ import java.io.DataInput; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import java.util.HashMap; import java.util.Map; @@ -48,9 +47,7 @@ import org.apache.commons.bcel6.Constants; * @see Deprecated * @see Signature */ -public abstract class Attribute implements Cloneable, Node, Serializable -{ - private static final long serialVersionUID = -1707826820310002955L; +public abstract class Attribute implements Cloneable, Node { protected int name_index; // Points to attribute name in constant pool TODO make private (has getter & setter) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java index 943b5cb1..ea95cd5a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import org.apache.commons.bcel6.Constants; @@ -32,9 +31,7 @@ import org.apache.commons.bcel6.Constants; * @see The class File Format : The BootstrapMethods Attribute * @since 6.0 */ -public class BootstrapMethod implements Serializable, Cloneable { - - private static final long serialVersionUID = -4517534834047695344L; +public class BootstrapMethod implements Cloneable { /** Index of the CONSTANT_MethodHandle_info structure in the constant_pool table */ private int bootstrap_method_ref; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java index 760331b6..43d1a4af 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import org.apache.commons.bcel6.Constants; @@ -32,9 +31,8 @@ import org.apache.commons.bcel6.Constants; * @version $Id$ * @see Code */ -public final class CodeException implements Cloneable, Node, Serializable { +public final class CodeException implements Cloneable, Node { - private static final long serialVersionUID = 2972500041254967221L; private int start_pc; // Range in the code the exception handler is private int end_pc; // active. start_pc is inclusive, end_pc exclusive private int handler_pc; /* Starting address of exception handler, i.e., diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java index d19b63f8..cd5d61d5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import org.apache.commons.bcel6.Constants; import org.apache.commons.bcel6.util.BCELComparator; @@ -32,9 +31,8 @@ import org.apache.commons.bcel6.util.BCELComparator; * * @version $Id$ */ -public abstract class Constant implements Cloneable, Node, Serializable { +public abstract class Constant implements Cloneable, Node { - private static final long serialVersionUID = 5739037344085356353L; private static BCELComparator _cmp = new BCELComparator() { @Override diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java index 53670dc8..bb9728e6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import org.apache.commons.bcel6.Constants; @@ -36,9 +35,8 @@ import org.apache.commons.bcel6.Constants; * @see Constant * @see org.apache.commons.bcel6.generic.ConstantPoolGen */ -public class ConstantPool implements Cloneable, Node, Serializable { +public class ConstantPool implements Cloneable, Node { - private static final long serialVersionUID = -9093478476423540196L; private Constant[] constant_pool; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java index 5486d7e6..88fe3f19 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import org.apache.commons.bcel6.Constants; @@ -32,9 +31,8 @@ import org.apache.commons.bcel6.Constants; * @version $Id$ * @see InnerClasses */ -public final class InnerClass implements Cloneable, Node, Serializable { +public final class InnerClass implements Cloneable, Node { - private static final long serialVersionUID = -7200195918166127614L; private int inner_class_index; private int outer_class_index; private int inner_name_index; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java index 1a957226..6a032623 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; /** * This class represents a (PC offset, line number) pair, i.e., a line number in @@ -30,10 +29,8 @@ import java.io.Serializable; * @version $Id$ * @see LineNumberTable */ -public final class LineNumber implements Cloneable, Node, Serializable { +public final class LineNumber implements Cloneable, Node { - private static final long serialVersionUID = 169537400672820016L; - /** Program Counter (PC) corresponds to line */ private short start_pc; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java index 51938cb5..d1b50b25 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import org.apache.commons.bcel6.Constants; @@ -31,9 +30,8 @@ import org.apache.commons.bcel6.Constants; * @version $Id$ * @see LocalVariableTable */ -public final class LocalVariable implements Cloneable, Node, Serializable { +public final class LocalVariable implements Cloneable, Node { - private static final long serialVersionUID = -51081099265972179L; private int start_pc; // Range in which the variable is valid private int length; private int name_index; // Index in constant pool of variable name diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java index 17071908..abaf2b2d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import org.apache.commons.bcel6.Constants; @@ -30,9 +29,7 @@ import org.apache.commons.bcel6.Constants; * @see The class File Format : The MethodParameters Attribute * @since 6.0 */ -public class MethodParameter implements Serializable, Cloneable { - - private static final long serialVersionUID = 6014494029439440326L; +public class MethodParameter implements Cloneable { /** Index of the CONSTANT_Utf8_info structure in the constant_pool table representing the name of the parameter */ private int name_index; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index b364afb2..b1f2c6c7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; /** * This class represents a stack map entry recording the types of @@ -32,11 +31,8 @@ import java.io.Serializable; * @see StackMapType */ public final class StackMapEntry implements Cloneable - ,Serializable /* since 6.0 */ { - private static final long serialVersionUID = 1L; - private int byte_code_offset; private StackMapType[] types_of_locals; private StackMapType[] types_of_stack_items; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java index 3311818b..a565062d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import org.apache.commons.bcel6.Constants; @@ -34,9 +33,7 @@ import org.apache.commons.bcel6.Constants; * @see StackMapType * @since 6.0 */ -public final class StackMapTableEntry implements Cloneable, Serializable { - - private static final long serialVersionUID = 1L; +public final class StackMapTableEntry implements Cloneable { private final int frame_type; private int byte_code_offset; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java index b3dd0843..0bd4ed76 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import org.apache.commons.bcel6.Constants; @@ -33,10 +32,7 @@ import org.apache.commons.bcel6.Constants; * @see StackMap * @see Constants */ -public final class StackMapType implements Cloneable - ,Serializable /* since 6.0 */ { - - private static final long serialVersionUID = 1L; +public final class StackMapType implements Cloneable { private byte type; private int index = -1; // Index to CONSTANT_Class or offset diff --git a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java index 32646180..2c326163 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java @@ -33,9 +33,8 @@ import org.apache.commons.bcel6.classfile.CodeException; * @see CodeException * @see InstructionHandle */ -public final class CodeExceptionGen implements InstructionTargeter, Cloneable, java.io.Serializable { +public final class CodeExceptionGen implements InstructionTargeter, Cloneable { - private static final long serialVersionUID = 6548901422158960190L; private InstructionHandle start_pc; private InstructionHandle end_pc; private InstructionHandle handler_pc; diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index 6d3d23ca..05b36d08 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -50,9 +50,8 @@ import org.apache.commons.bcel6.classfile.ConstantUtf8; * @version $Id$ * @see Constant */ -public class ConstantPoolGen implements java.io.Serializable { +public class ConstantPoolGen { - private static final long serialVersionUID = 6664071417323174824L; protected int size; protected Constant[] constants; protected int index = 1; // First entry (0) used by JVM @@ -61,10 +60,9 @@ public class ConstantPoolGen implements java.io.Serializable { private static final String FIELDREF_DELIM = "&"; private static final String NAT_DELIM = "%"; - private static class Index implements java.io.Serializable { + private static class Index { - private static final long serialVersionUID = -9187078620578535161L; - int index; + int index; // TODO this could be final Index(int i) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java index ca088332..180a3cdd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java @@ -19,7 +19,6 @@ package org.apache.commons.bcel6.generic; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import org.apache.commons.bcel6.Constants; import org.apache.commons.bcel6.classfile.ConstantPool; @@ -30,9 +29,8 @@ import org.apache.commons.bcel6.util.ByteSequence; * * @version $Id$ */ -public abstract class Instruction implements Cloneable, Serializable { +public abstract class Instruction implements Cloneable { - private static final long serialVersionUID = -2518741982574515847L; protected short length = 1; // Length of instruction in bytes protected short opcode = -1; // Opcode number private static InstructionComparator cmp = InstructionComparator.DEFAULT; diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java index c0dcb45c..d35949b7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java @@ -28,10 +28,9 @@ import org.apache.commons.bcel6.Constants; * @version $Id$ * @see Constants */ -public class InstructionFactory implements java.io.Serializable { - - private static final long serialVersionUID = -1210011499635580258L; +public class InstructionFactory { + // N.N. These must agree with the order of Constants.T_CHAR through T_LONG private static final String[] short_names = { "C", "F", "D", "B", "S", "I", "L" }; diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java index 688c6af4..7a3aa22a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java @@ -42,9 +42,8 @@ import org.apache.commons.bcel6.classfile.Utility; * @see BranchHandle * @see InstructionList */ -public class InstructionHandle implements java.io.Serializable { +public class InstructionHandle { - private static final long serialVersionUID = -3585254135692924106L; InstructionHandle next, prev; // Will be set from the outside Instruction instruction; protected int i_position = -1; // byte code offset of instruction diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java index e1f0ada7..735ec635 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java @@ -20,7 +20,6 @@ package org.apache.commons.bcel6.generic; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; -import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -50,9 +49,8 @@ import org.apache.commons.bcel6.util.ByteSequence; * @see InstructionHandle * @see BranchHandle */ -public class InstructionList implements Serializable { +public class InstructionList { - private static final long serialVersionUID = 2651389055345707857L; private InstructionHandle start = null, end = null; private int length = 0; // number of elements in list private int[] byte_positions; // byte code offsets corresponding to instructions diff --git a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java index 8e3e9e61..8995f9b5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java @@ -27,9 +27,8 @@ import org.apache.commons.bcel6.classfile.LineNumber; * @see LineNumber * @see MethodGen */ -public class LineNumberGen implements InstructionTargeter, Cloneable, java.io.Serializable { +public class LineNumberGen implements InstructionTargeter, Cloneable { - private static final long serialVersionUID = 4939965573936108738L; private InstructionHandle ih; private int src_line; diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java index 057b776a..99f60a49 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java @@ -30,10 +30,8 @@ import org.apache.commons.bcel6.classfile.LocalVariable; * @see LocalVariable * @see MethodGen */ -public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Cloneable, - java.io.Serializable { +public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Cloneable { - private static final long serialVersionUID = -3810966319065955534L; private int index; private String name; private Type type; diff --git a/src/main/java/org/apache/commons/bcel6/generic/Type.java b/src/main/java/org/apache/commons/bcel6/generic/Type.java index 295a7244..ea31f105 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Type.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Type.java @@ -32,9 +32,8 @@ import org.apache.commons.bcel6.verifier.structurals.OperandStack; * * @version $Id$ */ -public abstract class Type implements java.io.Serializable { +public abstract class Type { - private static final long serialVersionUID = -1985077286871826895L; protected byte type; // TODO should be final (and private) protected String signature; // signature for the type TODO should be private /** Predefined constants diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index 75f5df1d..51cd0f32 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -23,7 +23,6 @@ import java.io.FileInputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; -import java.io.Serializable; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; @@ -41,9 +40,8 @@ import java.util.zip.ZipFile; * * @version $Id$ */ -public class ClassPath implements Serializable { +public class ClassPath { - private static final long serialVersionUID = 2099441438483340671L; public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(getClassPath()); private static final FilenameFilter ARCHIVE_FILTER = new FilenameFilter() { @@ -350,9 +348,8 @@ public class ClassPath implements Serializable { return getClassFile(name, suffix).getPath(); } - private static abstract class PathEntry implements Serializable { + private static abstract class PathEntry { - private static final long serialVersionUID = 6828494485207666122L; abstract ClassFile getClassFile( String name, String suffix ) throws IOException; abstract URL getResource(String name); abstract InputStream getResourceAsStream(String name); diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java b/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java index 27d90172..d940d9e1 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java @@ -27,9 +27,8 @@ import org.apache.commons.bcel6.classfile.JavaClass; * * @version $Id$ */ -public class ClassQueue implements java.io.Serializable { +public class ClassQueue { - private static final long serialVersionUID = 685144104322420292L; protected LinkedList vec = new LinkedList<>(); diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassSet.java b/src/main/java/org/apache/commons/bcel6/util/ClassSet.java index 3e1111ca..e4d3caf3 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassSet.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassSet.java @@ -31,9 +31,8 @@ import org.apache.commons.bcel6.classfile.JavaClass; * @version $Id$ * @see ClassStack */ -public class ClassSet implements java.io.Serializable { +public class ClassSet { - private static final long serialVersionUID = -7476907380350035254L; private final Map _map = new HashMap<>(); diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassStack.java b/src/main/java/org/apache/commons/bcel6/util/ClassStack.java index 11745c37..fcfa1156 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassStack.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassStack.java @@ -27,9 +27,8 @@ import org.apache.commons.bcel6.classfile.JavaClass; * @version $Id$ * @see Stack */ -public class ClassStack implements java.io.Serializable { +public class ClassStack { - private static final long serialVersionUID = 6126079269396985982L; private final Stack stack = new Stack<>(); diff --git a/src/main/java/org/apache/commons/bcel6/util/Repository.java b/src/main/java/org/apache/commons/bcel6/util/Repository.java index f01b7223..d1147e9c 100644 --- a/src/main/java/org/apache/commons/bcel6/util/Repository.java +++ b/src/main/java/org/apache/commons/bcel6/util/Repository.java @@ -27,7 +27,7 @@ import org.apache.commons.bcel6.classfile.JavaClass; * @see org.apache.commons.bcel6.Repository * @version $Id$ */ -public interface Repository extends java.io.Serializable { +public interface Repository { /** * Store the provided class under "clazz.getClassName()" -- GitLab From dbd47e573968d8ba0d55f6f07523aac9c8f1647b Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 19 Aug 2015 21:50:09 +0000 Subject: [PATCH 0902/1313] BCEL-242 Remove Serializable git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696676 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 598ff739..4f3901ba 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Remove Serializable Remove deprecated methods and classes Problem with JAXB if the bcel classloader is used; remove the broken ClassLoader class modify several toString methods to make output similar to "javap" -- GitLab From 1e99e0b21cd03ac7c63df3bb1b3ed029f8232c14 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 19 Aug 2015 22:00:59 +0000 Subject: [PATCH 0903/1313] BCEL-198 better support for clone/copy methods git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696678 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../org/apache/commons/bcel6/classfile/AnnotationDefault.java | 2 +- .../org/apache/commons/bcel6/classfile/EnclosingMethod.java | 4 +--- .../apache/commons/bcel6/classfile/ParameterAnnotations.java | 3 +-- .../commons/bcel6/classfile/RuntimeInvisibleAnnotations.java | 3 +-- 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 4f3901ba..a00e6145 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + better support for clone/copy methods Remove Serializable Remove deprecated methods and classes Problem with JAXB if the bcel classloader is used; remove the broken ClassLoader class diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java index bb82d53f..eab2ba3f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java @@ -85,7 +85,7 @@ public class AnnotationDefault extends Attribute { @Override public Attribute copy(ConstantPool _constant_pool) { - throw new RuntimeException("Not implemented yet!"); + return (AnnotationDefault) clone(); } @Override diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java index e27ad741..b8dbe2ec 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java @@ -64,9 +64,7 @@ public class EnclosingMethod extends Attribute { @Override public Attribute copy(ConstantPool constant_pool) { - throw new RuntimeException("Not implemented yet!"); - // is this next line sufficient? - // return (EnclosingMethod)clone(); + return (EnclosingMethod) clone(); } // Accessors diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java index ab12c449..01976e0d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java @@ -120,7 +120,6 @@ public abstract class ParameterAnnotations extends Attribute { */ @Override public Attribute copy( ConstantPool constant_pool ) { - ParameterAnnotations c = (ParameterAnnotations) clone(); - return c; + return (ParameterAnnotations) clone(); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java index 99b6dcdb..55e022e4 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java @@ -56,8 +56,7 @@ public class RuntimeInvisibleAnnotations extends Annotations @Override public Attribute copy(ConstantPool constant_pool) { - Annotations c = (Annotations) clone(); - return c; + return (Annotations) clone(); } @Override -- GitLab From dec14840c083565eb9ad019b7f67785ac767f449 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 19 Aug 2015 22:09:40 +0000 Subject: [PATCH 0904/1313] @since markers; add missing counter git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696679 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/visitors/CounterVisitor.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java b/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java index cd616b07..e3f03d5c 100644 --- a/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java +++ b/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java @@ -141,14 +141,21 @@ public class CounterVisitor implements Visitor public int annotationCount = 0; + /** @since 6.0 */ public int stackMapTableCount = 0; + /** @since 6.0 */ public int stackMapTableEntryCount = 0; + /** @since 6.0 */ public int bootstrapMethodsCount = 0; + /** @since 6.0 */ public int methodParametersCount = 0; + /** @since 6.0 */ + public int constantInvokeDynamic = 0; + @Override public void visitAnnotation(Annotations obj) @@ -378,32 +385,38 @@ public class CounterVisitor implements Visitor unknownCount++; } + /** @since 6.0 */ @Override public void visitStackMapTable(StackMapTable obj) { stackMapTableCount++; } + /** @since 6.0 */ @Override public void visitStackMapTableEntry(StackMapTableEntry obj) { stackMapTableEntryCount++; } + /** @since 6.0 */ @Override public void visitBootstrapMethods(BootstrapMethods obj) { bootstrapMethodsCount++; } + /** @since 6.0 */ @Override public void visitMethodParameters(MethodParameters obj) { methodParametersCount++; } + /** @since 6.0 */ @Override public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj) { + constantInvokeDynamic++; } } -- GitLab From 1c0235aa31fcfe49c8495de49c75aa4537fcd7b4 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 19 Aug 2015 22:17:18 +0000 Subject: [PATCH 0905/1313] Tweaks git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696682 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index e5838a9a..0b4bd246 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -8,7 +8,9 @@ represented by objects containing all the symbolic information of the given class: methods, fields and byte code instructions. BCEL 6.0 is a major release supporting the new features introduced in Java 6, 7 -and 8. It requires Java 5 or higher to run. +and 8. + +It requires Java 7 or higher to run. Compatibility with 5.2 @@ -42,12 +44,12 @@ Fixed Bugs: o Bug fixes and improvements to InvokeDynamic and BootStrapMethods implementation. Issue: BCEL-209. Thanks to Mark Roberts. o Verification error when an invoke references a method defined in superclass. - Issue: BCEL-187. Thanks to Jérôme Leroux. + Issue: BCEL-187. Thanks to Jérôme Leroux. o Remove ObjectType cache. Issue: BCEL-218. Thanks to chas. o The verifier now checks if methods with a void return type attempt to return an - object. Issue: BCEL-184. Thanks to Jérôme Leroux. + object. Issue: BCEL-184. Thanks to Jérôme Leroux. o The verifier now checks if methods with a void return type attempt to return an - object. Issue: BCEL-184. Thanks to Jérôme Leroux. + object. Issue: BCEL-184. Thanks to Jérôme Leroux. o MethodGen.removeLocalVariable now properly unreference the removed variable from the targetters of the instruction handlers delimiting the scope of the variable. Issue: BCEL-207. Thanks to Mark Roberts. @@ -56,9 +58,9 @@ o Utility.signatureToString() no longer throws a ClassFormatException on TypeVar o Removed the 'index' variable from the LocalVariableGen's hash code. Issue: BCEL-194. Thanks to Mark Roberts. o The verifier should not check for run time compatibility of objects assigned to - arrays. Issue: BCEL-193. Thanks to Jérôme Leroux. + arrays. Issue: BCEL-193. Thanks to Jérôme Leroux. o Correct verification of the return value of a method. Issue: BCEL-188. Thanks - to Jérôme Leroux. + to Jérôme Leroux. o Performance degradation with the UTF8 cache. getInstance no longer uses cache Issue: BCEL-186. o org.apache.bcel.util.ClassLoaderRepository.loadClass(String) leaks input streams. -- GitLab From 65bbdebd843d9d8eed1a4eeaa06db3ec1ff42764 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 19 Aug 2015 22:29:22 +0000 Subject: [PATCH 0906/1313] BCEL-242 Remove Serializable git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696684 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/classfile/AnnotationDefault.java | 2 -- .../java/org/apache/commons/bcel6/classfile/Annotations.java | 2 -- .../org/apache/commons/bcel6/classfile/BootstrapMethods.java | 2 -- src/main/java/org/apache/commons/bcel6/classfile/Code.java | 1 - .../java/org/apache/commons/bcel6/classfile/ConstantCP.java | 1 - .../org/apache/commons/bcel6/classfile/ConstantClass.java | 1 - .../org/apache/commons/bcel6/classfile/ConstantDouble.java | 1 - .../org/apache/commons/bcel6/classfile/ConstantFieldref.java | 3 --- .../org/apache/commons/bcel6/classfile/ConstantFloat.java | 1 - .../org/apache/commons/bcel6/classfile/ConstantInteger.java | 1 - .../commons/bcel6/classfile/ConstantInterfaceMethodref.java | 3 --- .../apache/commons/bcel6/classfile/ConstantInvokeDynamic.java | 2 -- .../java/org/apache/commons/bcel6/classfile/ConstantLong.java | 1 - .../apache/commons/bcel6/classfile/ConstantMethodHandle.java | 1 - .../apache/commons/bcel6/classfile/ConstantMethodType.java | 1 - .../org/apache/commons/bcel6/classfile/ConstantMethodref.java | 3 --- .../apache/commons/bcel6/classfile/ConstantNameAndType.java | 1 - .../org/apache/commons/bcel6/classfile/ConstantString.java | 1 - .../java/org/apache/commons/bcel6/classfile/ConstantUtf8.java | 1 - .../org/apache/commons/bcel6/classfile/ConstantValue.java | 1 - .../java/org/apache/commons/bcel6/classfile/Deprecated.java | 1 - .../org/apache/commons/bcel6/classfile/EnclosingMethod.java | 2 -- .../org/apache/commons/bcel6/classfile/ExceptionTable.java | 2 -- src/main/java/org/apache/commons/bcel6/classfile/Field.java | 1 - .../org/apache/commons/bcel6/classfile/FieldOrMethod.java | 2 -- .../java/org/apache/commons/bcel6/classfile/InnerClasses.java | 1 - .../java/org/apache/commons/bcel6/classfile/JavaClass.java | 1 - .../org/apache/commons/bcel6/classfile/LineNumberTable.java | 2 -- .../apache/commons/bcel6/classfile/LocalVariableTable.java | 1 - .../commons/bcel6/classfile/LocalVariableTypeTable.java | 2 -- src/main/java/org/apache/commons/bcel6/classfile/Method.java | 1 - .../org/apache/commons/bcel6/classfile/MethodParameters.java | 2 -- .../java/org/apache/commons/bcel6/classfile/PMGClass.java | 1 - .../apache/commons/bcel6/classfile/ParameterAnnotations.java | 2 -- .../commons/bcel6/classfile/RuntimeInvisibleAnnotations.java | 2 -- .../bcel6/classfile/RuntimeInvisibleParameterAnnotations.java | 2 -- .../commons/bcel6/classfile/RuntimeVisibleAnnotations.java | 2 -- .../bcel6/classfile/RuntimeVisibleParameterAnnotations.java | 2 -- .../java/org/apache/commons/bcel6/classfile/Signature.java | 1 - .../java/org/apache/commons/bcel6/classfile/SourceFile.java | 1 - .../java/org/apache/commons/bcel6/classfile/StackMap.java | 1 - .../org/apache/commons/bcel6/classfile/StackMapTable.java | 1 - .../java/org/apache/commons/bcel6/classfile/Synthetic.java | 1 - src/main/java/org/apache/commons/bcel6/classfile/Unknown.java | 1 - src/main/java/org/apache/commons/bcel6/generic/AALOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/AASTORE.java | 3 --- .../java/org/apache/commons/bcel6/generic/ACONST_NULL.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/ALOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/ARETURN.java | 3 --- .../java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/ASTORE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/ATHROW.java | 3 --- .../apache/commons/bcel6/generic/ArithmeticInstruction.java | 3 --- .../org/apache/commons/bcel6/generic/ArrayInstruction.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/ArrayType.java | 1 - src/main/java/org/apache/commons/bcel6/generic/BALOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/BASTORE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java | 1 - .../java/org/apache/commons/bcel6/generic/BREAKPOINT.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/BasicType.java | 3 --- .../java/org/apache/commons/bcel6/generic/BranchHandle.java | 1 - .../org/apache/commons/bcel6/generic/BranchInstruction.java | 1 - src/main/java/org/apache/commons/bcel6/generic/CALOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/CASTORE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java | 3 --- .../java/org/apache/commons/bcel6/generic/CPInstruction.java | 2 -- src/main/java/org/apache/commons/bcel6/generic/ClassGen.java | 1 - .../apache/commons/bcel6/generic/ConversionInstruction.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/D2F.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/D2I.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/D2L.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DADD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DALOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DASTORE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DCMPG.java | 2 -- src/main/java/org/apache/commons/bcel6/generic/DCMPL.java | 2 -- src/main/java/org/apache/commons/bcel6/generic/DCONST.java | 1 - src/main/java/org/apache/commons/bcel6/generic/DDIV.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DLOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DMUL.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DNEG.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DREM.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DRETURN.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DSTORE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DSUB.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DUP.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DUP2.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/F2D.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/F2I.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/F2L.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FADD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FALOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FASTORE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FCMPG.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FCMPL.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FCONST.java | 1 - src/main/java/org/apache/commons/bcel6/generic/FDIV.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FLOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FMUL.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FNEG.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FREM.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FRETURN.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FSTORE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FSUB.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/FieldGen.java | 1 - .../org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java | 1 - .../org/apache/commons/bcel6/generic/FieldInstruction.java | 3 --- .../java/org/apache/commons/bcel6/generic/FieldOrMethod.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/GOTO.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java | 3 --- .../org/apache/commons/bcel6/generic/GotoInstruction.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/I2B.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/I2C.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/I2D.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/I2F.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/I2L.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/I2S.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IADD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IALOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IAND.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IASTORE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/ICONST.java | 1 - src/main/java/org/apache/commons/bcel6/generic/IDIV.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IFEQ.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IFGE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IFGT.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IFLE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IFLT.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IFNE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IFNULL.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IINC.java | 1 - src/main/java/org/apache/commons/bcel6/generic/ILOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IMUL.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/INEG.java | 3 --- .../java/org/apache/commons/bcel6/generic/INSTANCEOF.java | 3 --- .../java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java | 3 --- .../org/apache/commons/bcel6/generic/INVOKEINTERFACE.java | 1 - .../java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java | 3 --- .../java/org/apache/commons/bcel6/generic/INVOKESTATIC.java | 3 --- .../java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IOR.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IREM.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IRETURN.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/ISHL.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/ISHR.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/ISTORE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/ISUB.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IUSHR.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/IXOR.java | 3 --- .../java/org/apache/commons/bcel6/generic/IfInstruction.java | 3 --- .../org/apache/commons/bcel6/generic/InvokeInstruction.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/JSR.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/JSR_W.java | 3 --- .../java/org/apache/commons/bcel6/generic/JsrInstruction.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/L2D.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/L2F.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/L2I.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LADD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LALOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LAND.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LASTORE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LCMP.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LCONST.java | 1 - src/main/java/org/apache/commons/bcel6/generic/LDC.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LDC_W.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LDIV.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LLOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LMUL.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LNEG.java | 3 --- .../java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LOR.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LREM.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LRETURN.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LSHL.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LSHR.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LSTORE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LSUB.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LUSHR.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/LXOR.java | 3 --- .../org/apache/commons/bcel6/generic/LoadInstruction.java | 3 --- .../commons/bcel6/generic/LocalVariableInstruction.java | 1 - .../java/org/apache/commons/bcel6/generic/MONITORENTER.java | 3 --- .../java/org/apache/commons/bcel6/generic/MONITOREXIT.java | 3 --- .../java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java | 1 - src/main/java/org/apache/commons/bcel6/generic/MethodGen.java | 1 - src/main/java/org/apache/commons/bcel6/generic/NEW.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java | 1 - src/main/java/org/apache/commons/bcel6/generic/NOP.java | 3 --- .../commons/bcel6/generic/NameSignatureInstruction.java | 2 -- .../java/org/apache/commons/bcel6/generic/ObjectType.java | 1 - src/main/java/org/apache/commons/bcel6/generic/POP.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/POP2.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/RET.java | 1 - src/main/java/org/apache/commons/bcel6/generic/RETURN.java | 3 --- .../java/org/apache/commons/bcel6/generic/ReferenceType.java | 3 --- .../org/apache/commons/bcel6/generic/ReturnInstruction.java | 3 --- .../org/apache/commons/bcel6/generic/ReturnaddressType.java | 1 - src/main/java/org/apache/commons/bcel6/generic/SALOAD.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/SASTORE.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java | 1 - src/main/java/org/apache/commons/bcel6/generic/SWAP.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/Select.java | 1 - .../org/apache/commons/bcel6/generic/StackInstruction.java | 3 --- .../org/apache/commons/bcel6/generic/StoreInstruction.java | 3 --- .../java/org/apache/commons/bcel6/generic/TABLESWITCH.java | 3 --- src/main/java/org/apache/commons/bcel6/generic/Type.java | 4 ---- .../org/apache/commons/bcel6/util/ClassLoaderRepository.java | 1 - src/main/java/org/apache/commons/bcel6/util/ClassPath.java | 2 -- .../org/apache/commons/bcel6/util/SyntheticRepository.java | 1 - .../apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java | 1 - .../org/apache/commons/bcel6/verifier/statics/LONG_Upper.java | 1 - .../bcel6/verifier/structurals/UninitializedObjectType.java | 1 - 233 files changed, 574 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java index eab2ba3f..04488d1c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java @@ -31,8 +31,6 @@ import org.apache.commons.bcel6.Constants; */ public class AnnotationDefault extends Attribute { - private static final long serialVersionUID = -4017327188724019487L; - private ElementValue default_value; /** diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java index 78a7f511..f296baeb 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java @@ -29,8 +29,6 @@ import java.io.IOException; */ public abstract class Annotations extends Attribute { - private static final long serialVersionUID = 1L; - private AnnotationEntry[] annotation_table; private final boolean isRuntimeVisible; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java index 589e6453..be1964ea 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java @@ -31,8 +31,6 @@ import org.apache.commons.bcel6.Constants; */ public class BootstrapMethods extends Attribute { - private static final long serialVersionUID = -2169230245012340809L; - private BootstrapMethod[] bootstrap_methods; // TODO this could be made final (setter is not used) /** diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Code.java b/src/main/java/org/apache/commons/bcel6/classfile/Code.java index 6ad186b0..a16613ad 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Code.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Code.java @@ -43,7 +43,6 @@ import org.apache.commons.bcel6.Constants; */ public final class Code extends Attribute { - private static final long serialVersionUID = -432884354459701506L; private int max_stack; // Maximum size of stack used by this method // TODO this could be made final (setter is not used) private int max_locals; // Number of local variables // TODO this could be made final (setter is not used) private byte[] code; // Actual byte code diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java index 2fe65c5b..e6c50dbf 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java @@ -35,7 +35,6 @@ import org.apache.commons.bcel6.Constants; */ public abstract class ConstantCP extends Constant { - private static final long serialVersionUID = -6275762995206209402L; /** References to the constants containing the class and the field signature */ // Note that this field is used to store the diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java index 7ffe98f1..60e8d6f1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantClass extends Constant implements ConstantObject { - private static final long serialVersionUID = -1083450233715258720L; private int name_index; // Identical to ConstantString except for the name diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java index dc53c15c..bbbbfb93 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantDouble extends Constant implements ConstantObject { - private static final long serialVersionUID = -7394764537394782136L; private double bytes; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java index b858c014..1712fa5b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java @@ -29,9 +29,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantFieldref extends ConstantCP { - private static final long serialVersionUID = -3993784840787819802L; - - /** * Initialize from another object. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java index d7fd7d2a..28e68dca 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantFloat extends Constant implements ConstantObject { - private static final long serialVersionUID = -2316732495687628398L; private float bytes; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java index 259a17a8..09e230ae 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantInteger extends Constant implements ConstantObject { - private static final long serialVersionUID = -7040676276945754375L; private int bytes; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java index a7651526..73267947 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java @@ -29,9 +29,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantInterfaceMethodref extends ConstantCP { - private static final long serialVersionUID = -5311546335360612639L; - - /** * Initialize from another object. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java index 049174f7..3f41b48d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java @@ -31,8 +31,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantInvokeDynamic extends ConstantCP { - private static final long serialVersionUID = 4310367359017396174L; - /** * Initialize from another object. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java index 160b2b9e..f9778f72 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantLong extends Constant implements ConstantObject { - private static final long serialVersionUID = 8495971186433816161L; private long bytes; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java index 65ffac80..b1faeb59 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantMethodHandle extends Constant { - private static final long serialVersionUID = -7875124116920198044L; private int reference_kind; private int reference_index; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java index 907f9cea..04e4d534 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantMethodType extends Constant { - private static final long serialVersionUID = 6750768220616618881L; private int descriptor_index; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java index b24c158f..b43f97a4 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java @@ -29,9 +29,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantMethodref extends ConstantCP { - private static final long serialVersionUID = -864296320352750967L; - - /** * Initialize from another object. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java index 3cf4d004..6d29fad6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java @@ -33,7 +33,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantNameAndType extends Constant { - private static final long serialVersionUID = -7913354727264034451L; private int name_index; // Name of field/method private int signature_index; // and its signature. diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java index 7d969baa..65a73df3 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantString extends Constant implements ConstantObject { - private static final long serialVersionUID = 6603144389219397225L; private int string_index; // Identical to ConstantClass except for this name diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java index 9c2cc9d3..9ff937ca 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java @@ -35,7 +35,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantUtf8 extends Constant { - private static final long serialVersionUID = -8709101585611518985L; private final String bytes; // TODO these should perhaps be AtomicInt? diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java index 929c43bf..8749e683 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java @@ -33,7 +33,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ConstantValue extends Attribute { - private static final long serialVersionUID = -5668999920978520157L; private int constantvalue_index; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java index 917e52aa..6d83bdb8 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java @@ -33,7 +33,6 @@ import org.apache.commons.bcel6.Constants; */ public final class Deprecated extends Attribute { - private static final long serialVersionUID = -2242528405240201000L; private byte[] bytes; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java index b8dbe2ec..b8df852b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java @@ -30,8 +30,6 @@ import org.apache.commons.bcel6.Constants; */ public class EnclosingMethod extends Attribute { - private static final long serialVersionUID = 9136852385761725494L; - // Pointer to the CONSTANT_Class_info structure representing the // innermost class that encloses the declaration of the current class. private int classIndex; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java index 3d5f710b..26ddadd4 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java @@ -36,8 +36,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ExceptionTable extends Attribute { - private static final long serialVersionUID = 2045358830660883220L; - private int[] exception_index_table; // constant pool diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Field.java b/src/main/java/org/apache/commons/bcel6/classfile/Field.java index 4d08944a..1413951c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Field.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Field.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.util.BCELComparator; */ public final class Field extends FieldOrMethod { - private static final long serialVersionUID = -4604082205545049134L; private static BCELComparator _cmp = new BCELComparator() { @Override diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index fb111081..b54c7a1c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -30,8 +30,6 @@ import org.apache.commons.bcel6.Constants; */ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, Node { - private static final long serialVersionUID = -1833306330869469714L; - // TODO should be made private protected int name_index; // Points to field name in constant pool protected int signature_index; // Points to encoded signature diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java index 4cb4fddc..63aff059 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java @@ -34,7 +34,6 @@ import org.apache.commons.bcel6.Constants; */ public final class InnerClasses extends Attribute { - private static final long serialVersionUID = 4570147726361753700L; private InnerClass[] inner_classes; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 5fa80db8..7803a942 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -48,7 +48,6 @@ import org.apache.commons.bcel6.util.SyntheticRepository; */ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparable { - private static final long serialVersionUID = 2179314813560563755L; private String file_name; private String package_name; private String source_file_name = ""; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java index 65cbffb6..f7414680 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java @@ -34,8 +34,6 @@ import org.apache.commons.bcel6.Constants; */ public final class LineNumberTable extends Attribute { - private static final long serialVersionUID = -6967221519632128904L; - private LineNumber[] line_number_table; // Table of line/numbers pairs diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java index da9e5e30..ad9aee34 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java @@ -33,7 +33,6 @@ import org.apache.commons.bcel6.Constants; */ public class LocalVariableTable extends Attribute { - private static final long serialVersionUID = 6780929007774637689L; private LocalVariable[] local_variable_table; // variables diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java index a754bb91..9589ee70 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java @@ -56,8 +56,6 @@ import org.apache.commons.bcel6.Constants; */ public class LocalVariableTypeTable extends Attribute { - private static final long serialVersionUID = -1082157891095177114L; - private LocalVariable[] local_variable_type_table; // variables public LocalVariableTypeTable(LocalVariableTypeTable c) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Method.java b/src/main/java/org/apache/commons/bcel6/classfile/Method.java index b0708bf7..0f911fc9 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Method.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Method.java @@ -33,7 +33,6 @@ import org.apache.commons.bcel6.util.BCELComparator; */ public final class Method extends FieldOrMethod { - private static final long serialVersionUID = -2013983967283787941L; private static BCELComparator _cmp = new BCELComparator() { @Override diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java index 26e4bfa9..be645b59 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java @@ -31,8 +31,6 @@ import org.apache.commons.bcel6.Constants; */ public class MethodParameters extends Attribute { - private static final long serialVersionUID = 2500272580422360140L; - private MethodParameter[] parameters = new MethodParameter[0]; MethodParameters(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java index 743a1548..70865582 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.Constants; */ public final class PMGClass extends Attribute { - private static final long serialVersionUID = -7075964153234211509L; private int pmg_class_index, pmg_index; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java index 01976e0d..580d70b6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java @@ -29,8 +29,6 @@ import java.io.IOException; */ public abstract class ParameterAnnotations extends Attribute { - private static final long serialVersionUID = 5234607357644462705L; - /** Table of parameter annotations */ private ParameterAnnotationEntry[] parameter_annotation_table; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java index 55e022e4..f46a1801 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java @@ -32,8 +32,6 @@ import org.apache.commons.bcel6.Constants; */ public class RuntimeInvisibleAnnotations extends Annotations { - private static final long serialVersionUID = 5274986004117955967L; - /** * @param name_index * Index pointing to the name Code diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java index 3cff7e4d..864fcefd 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java @@ -31,8 +31,6 @@ import org.apache.commons.bcel6.Constants; */ public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { - private static final long serialVersionUID = 270153155050617200L; - /** * @param name_index Index pointing to the name Code * @param length Content length in bytes diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java index cf7d281f..581d3850 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java @@ -32,8 +32,6 @@ import org.apache.commons.bcel6.Constants; */ public class RuntimeVisibleAnnotations extends Annotations { - private static final long serialVersionUID = 8992333017010665281L; - /** * @param name_index * Index pointing to the name Code diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java index 391388bd..3f68516c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java @@ -31,8 +31,6 @@ import org.apache.commons.bcel6.Constants; */ public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { - private static final long serialVersionUID = -4266572854750267070L; - /** * @param name_index Index pointing to the name Code * @param length Content length in bytes diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java index 3966b194..315add73 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java @@ -33,7 +33,6 @@ import org.apache.commons.bcel6.Constants; */ public final class Signature extends Attribute { - private static final long serialVersionUID = 5808807822688827177L; private int signature_index; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java index d05f5296..f685f021 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java @@ -34,7 +34,6 @@ import org.apache.commons.bcel6.Constants; */ public final class SourceFile extends Attribute { - private static final long serialVersionUID = -804226255663222912L; private int sourcefile_index; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java index 88acd54a..0271da36 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java @@ -39,7 +39,6 @@ import org.apache.commons.bcel6.Constants; */ public final class StackMap extends Attribute { - private static final long serialVersionUID = -6238662431726968495L; private StackMapEntry[] map; // Table of stack map entries diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java index 3fb9707d..2403823e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTable.java @@ -40,7 +40,6 @@ import org.apache.commons.bcel6.Constants; */ public final class StackMapTable extends Attribute { - private static final long serialVersionUID = -5802191977296683162L; private StackMapTableEntry[] map; // Table of stack map entries diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java index 8b3db1cb..cbc216c2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java @@ -37,7 +37,6 @@ import org.apache.commons.bcel6.Constants; */ public final class Synthetic extends Attribute { - private static final long serialVersionUID = -123334426995458366L; private byte[] bytes; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java index 4f46f3d8..6f49d075 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java @@ -40,7 +40,6 @@ import org.apache.commons.bcel6.Constants; */ public final class Unknown extends Attribute { - private static final long serialVersionUID = -4099655108069755015L; private byte[] bytes; private final String name; private static final Map unknown_attributes = new HashMap<>(); diff --git a/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java index 89a1b0b6..a7a91b1f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class AALOAD extends ArrayInstruction implements StackProducer { - private static final long serialVersionUID = -8606835203239531080L; - - /** Load reference from array */ public AALOAD() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java index ee68a388..000dab8c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class AASTORE extends ArrayInstruction implements StackConsumer { - private static final long serialVersionUID = -6440799431970565816L; - - /** Store into reference array */ public AASTORE() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java b/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java index dae89949..9866f889 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class ACONST_NULL extends Instruction implements PushInstruction, TypedInstruction { - private static final long serialVersionUID = -4127036801984829715L; - - /** * Push null reference */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java index cdba8167..38472824 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class ALOAD extends LoadInstruction { - private static final long serialVersionUID = 6993893925210913542L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java index d9cef45b..be27135d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java @@ -28,9 +28,6 @@ import org.apache.commons.bcel6.ExceptionConstants; public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower, StackConsumer, StackProducer { - private static final long serialVersionUID = -3720173810934984310L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java b/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java index 38b3f79f..41c5cd6f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class ARETURN extends ReturnInstruction { - private static final long serialVersionUID = -3497286197421151311L; - - /** * Return reference from method */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java b/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java index 7762bffa..41b208d4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackProducer, StackConsumer /* since 6.0 */ { - private static final long serialVersionUID = 3038891629544391578L; - - /** Get length of array */ public ARRAYLENGTH() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java index 6f8614d1..3b0c8c08 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class ASTORE extends StoreInstruction { - private static final long serialVersionUID = 3598929416636143200L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java b/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java index e99826a8..2972c800 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class ATHROW extends Instruction implements UnconditionalBranch, ExceptionThrower { - private static final long serialVersionUID = -5072509566909688739L; - - /** * Throw exception */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java index 1227d88e..3d3b5b3e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java @@ -27,9 +27,6 @@ import org.apache.commons.bcel6.Constants; public abstract class ArithmeticInstruction extends Instruction implements TypedInstruction, StackProducer, StackConsumer { - private static final long serialVersionUID = 5027221136148765144L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java index b3dbbf89..f5cd68d7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java @@ -27,9 +27,6 @@ import org.apache.commons.bcel6.ExceptionConstants; public abstract class ArrayInstruction extends Instruction implements ExceptionThrower, TypedInstruction { - private static final long serialVersionUID = 1355074014869910296L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java index 62d75a90..36f00f75 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java @@ -26,7 +26,6 @@ import org.apache.commons.bcel6.Constants; */ public final class ArrayType extends ReferenceType { - private static final long serialVersionUID = 7587687059797903734L; private int dimensions; private Type basic_type; diff --git a/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java index 1e1095a8..15e8342d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class BALOAD extends ArrayInstruction implements StackProducer { - private static final long serialVersionUID = -849061295095748102L; - - /** Load byte or boolean from array */ public BALOAD() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java index 20a4b4d5..439bd1c8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class BASTORE extends ArrayInstruction implements StackConsumer { - private static final long serialVersionUID = 1127770065463906050L; - - /** Store byte or boolean into array */ public BASTORE() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java b/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java index 5ac1633b..e5d7da8b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java @@ -31,7 +31,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public class BIPUSH extends Instruction implements ConstantPushInstruction { - private static final long serialVersionUID = -6859389515217572656L; private byte b; diff --git a/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java b/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java index c7ca3633..8596938b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java @@ -24,9 +24,6 @@ package org.apache.commons.bcel6.generic; */ public class BREAKPOINT extends Instruction { - private static final long serialVersionUID = -4186956277760244254L; - - public BREAKPOINT() { super(org.apache.commons.bcel6.Constants.BREAKPOINT, (short) 1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java index 7ec7a9be..70dbe314 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java @@ -26,9 +26,6 @@ import org.apache.commons.bcel6.Constants; */ public final class BasicType extends Type { - private static final long serialVersionUID = -6546010740455512176L; - - /** * Constructor for basic types such as int, long, `void' * diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java index 2ab9c62b..1a01df6e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java @@ -30,7 +30,6 @@ package org.apache.commons.bcel6.generic; */ public final class BranchHandle extends InstructionHandle { - private static final long serialVersionUID = -2520878285698255956L; private BranchInstruction bi; // An alias in fact, but saves lots of casts diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java index 30ae2d6a..67f149f4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public abstract class BranchInstruction extends Instruction implements InstructionTargeter { - private static final long serialVersionUID = 3225905281842405051L; protected int index; // Branch target relative to this instruction protected InstructionHandle target; // Target object in instruction list protected int position; // Byte code offset diff --git a/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java index 3af3454d..854a2dda 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class CALOAD extends ArrayInstruction implements StackProducer { - private static final long serialVersionUID = -2085721349377637959L; - - /** Load char from array */ public CALOAD() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java index 24f7ecb7..7dee0c59 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class CASTORE extends ArrayInstruction implements StackConsumer { - private static final long serialVersionUID = -4021755905444053495L; - - /** Store char into array */ public CASTORE() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java b/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java index 5d43fbd1..b02aef69 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java @@ -28,9 +28,6 @@ import org.apache.commons.bcel6.ExceptionConstants; public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThrower, StackProducer, StackConsumer { - private static final long serialVersionUID = 1227128733786393518L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java index ba72c1b8..aee11497 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java @@ -38,8 +38,6 @@ import org.apache.commons.bcel6.util.ByteSequence; public abstract class CPInstruction extends Instruction implements TypedInstruction, IndexedInstruction { - private static final long serialVersionUID = 2968547649792233082L; - protected int index; // index to constant pool diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index 1f094c3a..cb301b4e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -43,7 +43,6 @@ import org.apache.commons.bcel6.util.BCELComparator; */ public class ClassGen extends AccessFlags implements Cloneable { - private static final long serialVersionUID = 6880879387392827211L; /* Corresponds to the fields found in a JavaClass object. */ private String class_name, super_class_name; diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java index 1a603422..5fea2e5d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java @@ -27,9 +27,6 @@ import org.apache.commons.bcel6.Constants; public abstract class ConversionInstruction extends Instruction implements TypedInstruction, StackProducer, StackConsumer { - private static final long serialVersionUID = -4283015897133699172L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/D2F.java b/src/main/java/org/apache/commons/bcel6/generic/D2F.java index a318d81e..f965e205 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/D2F.java +++ b/src/main/java/org/apache/commons/bcel6/generic/D2F.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class D2F extends ConversionInstruction { - private static final long serialVersionUID = -448595874334076240L; - - /** Convert double to float */ public D2F() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/D2I.java b/src/main/java/org/apache/commons/bcel6/generic/D2I.java index 3d6a4101..be447ef9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/D2I.java +++ b/src/main/java/org/apache/commons/bcel6/generic/D2I.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class D2I extends ConversionInstruction { - private static final long serialVersionUID = -1226710355146064416L; - - /** Convert double to int */ public D2I() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/D2L.java b/src/main/java/org/apache/commons/bcel6/generic/D2L.java index e0014845..5c82b28e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/D2L.java +++ b/src/main/java/org/apache/commons/bcel6/generic/D2L.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class D2L extends ConversionInstruction { - private static final long serialVersionUID = -1985923584192796706L; - - /** Convert double to long */ public D2L() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DADD.java b/src/main/java/org/apache/commons/bcel6/generic/DADD.java index d9e80795..3fba03b9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DADD.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class DADD extends ArithmeticInstruction { - private static final long serialVersionUID = 241485501977646418L; - - /** Add doubles */ public DADD() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java index e4a4111a..69c9f5f0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DALOAD extends ArrayInstruction implements StackProducer { - private static final long serialVersionUID = -8493938101832015094L; - - /** Load double from array */ public DALOAD() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java index 428fd973..5461e09a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DASTORE extends ArrayInstruction implements StackConsumer { - private static final long serialVersionUID = 5236493427411303394L; - - /** Store double into array */ public DASTORE() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java b/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java index 63690619..32a3f5af 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java @@ -25,8 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DCMPG extends Instruction implements TypedInstruction, StackProducer, StackConsumer { - private static final long serialVersionUID = 1929664840821745262L; - public DCMPG() { super(org.apache.commons.bcel6.Constants.DCMPG, (short) 1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java b/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java index 8869b441..40e6675e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java @@ -25,8 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DCMPL extends Instruction implements TypedInstruction, StackProducer, StackConsumer { - private static final long serialVersionUID = 2514357528484232014L; - public DCMPL() { super(org.apache.commons.bcel6.Constants.DCMPL, (short) 1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCONST.java b/src/main/java/org/apache/commons/bcel6/generic/DCONST.java index 6ecd66d5..64f2898c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCONST.java @@ -26,7 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class DCONST extends Instruction implements ConstantPushInstruction { - private static final long serialVersionUID = 4421839896759165218L; private double value; diff --git a/src/main/java/org/apache/commons/bcel6/generic/DDIV.java b/src/main/java/org/apache/commons/bcel6/generic/DDIV.java index 6acb0cb7..2d6ab121 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DDIV.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class DDIV extends ArithmeticInstruction { - private static final long serialVersionUID = -2241740228269641540L; - - /** Divide doubles */ public DDIV() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java b/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java index 2141925a..678dcc4d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DLOAD extends LoadInstruction { - private static final long serialVersionUID = -197027701448834250L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/DMUL.java b/src/main/java/org/apache/commons/bcel6/generic/DMUL.java index c7dc321f..fced5389 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DMUL.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class DMUL extends ArithmeticInstruction { - private static final long serialVersionUID = 7491480641611951432L; - - /** Multiply doubles */ public DMUL() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DNEG.java b/src/main/java/org/apache/commons/bcel6/generic/DNEG.java index 14340d31..b939cfa2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DNEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DNEG.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DNEG extends ArithmeticInstruction { - private static final long serialVersionUID = -8860107731099493429L; - - public DNEG() { super(org.apache.commons.bcel6.Constants.DNEG); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DREM.java b/src/main/java/org/apache/commons/bcel6/generic/DREM.java index 8ac0ace6..6aac5bb6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DREM.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class DREM extends ArithmeticInstruction { - private static final long serialVersionUID = -3984082114153729887L; - - /** Remainder of doubles */ public DREM() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java index 6363cadb..bced3ea5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DRETURN extends ReturnInstruction { - private static final long serialVersionUID = 7442064109402271402L; - - /** Return double from method */ public DRETURN() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java b/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java index 944ff41d..2a916118 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DSTORE extends StoreInstruction { - private static final long serialVersionUID = 2593414593903082469L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/DSUB.java b/src/main/java/org/apache/commons/bcel6/generic/DSUB.java index e25e5818..f2267dd5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DSUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DSUB.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class DSUB extends ArithmeticInstruction { - private static final long serialVersionUID = -5398969227995149466L; - - /** Substract doubles */ public DSUB() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP.java b/src/main/java/org/apache/commons/bcel6/generic/DUP.java index b0143657..81399af2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DUP extends StackInstruction implements PushInstruction { - private static final long serialVersionUID = 2297553463589366154L; - - public DUP() { super(org.apache.commons.bcel6.Constants.DUP); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP2.java b/src/main/java/org/apache/commons/bcel6/generic/DUP2.java index 73be322d..66e3b126 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP2.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DUP2 extends StackInstruction implements PushInstruction { - private static final long serialVersionUID = -7098411152822612791L; - - public DUP2() { super(org.apache.commons.bcel6.Constants.DUP2); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java index 57cb2ba7..eb9cbc96 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DUP2_X1 extends StackInstruction { - private static final long serialVersionUID = 4940667268525283202L; - - public DUP2_X1() { super(org.apache.commons.bcel6.Constants.DUP2_X1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java index 1e4ed2f8..d408c8d0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DUP2_X2 extends StackInstruction { - private static final long serialVersionUID = 1182584253776211326L; - - public DUP2_X2() { super(org.apache.commons.bcel6.Constants.DUP2_X2); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java b/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java index e5396780..4648b1a0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DUP_X1 extends StackInstruction { - private static final long serialVersionUID = 2059042937326757526L; - - public DUP_X1() { super(org.apache.commons.bcel6.Constants.DUP_X1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java b/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java index c255a8b2..d6f8adf6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class DUP_X2 extends StackInstruction { - private static final long serialVersionUID = -8851562833314313571L; - - public DUP_X2() { super(org.apache.commons.bcel6.Constants.DUP_X2); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/F2D.java b/src/main/java/org/apache/commons/bcel6/generic/F2D.java index f0f37276..77db5b0b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/F2D.java +++ b/src/main/java/org/apache/commons/bcel6/generic/F2D.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class F2D extends ConversionInstruction { - private static final long serialVersionUID = -4668119344425861047L; - - /** Convert float to double */ public F2D() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/F2I.java b/src/main/java/org/apache/commons/bcel6/generic/F2I.java index 36e2e1c5..982bdd13 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/F2I.java +++ b/src/main/java/org/apache/commons/bcel6/generic/F2I.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class F2I extends ConversionInstruction { - private static final long serialVersionUID = 6142843856130131105L; - - /** Convert float to int */ public F2I() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/F2L.java b/src/main/java/org/apache/commons/bcel6/generic/F2L.java index 6b5820d8..fa282975 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/F2L.java +++ b/src/main/java/org/apache/commons/bcel6/generic/F2L.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class F2L extends ConversionInstruction { - private static final long serialVersionUID = -5583947322933513819L; - - /** Convert float to long */ public F2L() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FADD.java b/src/main/java/org/apache/commons/bcel6/generic/FADD.java index baff3217..8d0cdeb6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FADD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FADD extends ArithmeticInstruction { - private static final long serialVersionUID = 5654582990564566355L; - - /** Add floats */ public FADD() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java index 55226d98..0918fce9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FALOAD extends ArrayInstruction implements StackProducer { - private static final long serialVersionUID = 3369925718821219472L; - - /** Load float from array */ public FALOAD() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java index e7a7c8bd..35a8ece9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FASTORE extends ArrayInstruction implements StackConsumer { - private static final long serialVersionUID = -1583134120388207470L; - - /** Store float into array */ public FASTORE() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java b/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java index 423a3a2f..b99f3327 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FCMPG extends Instruction implements TypedInstruction, StackProducer, StackConsumer { - private static final long serialVersionUID = -715944337480121908L; - - public FCMPG() { super(org.apache.commons.bcel6.Constants.FCMPG, (short) 1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java b/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java index e45e5bd7..61a3a297 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FCMPL extends Instruction implements TypedInstruction, StackProducer, StackConsumer { - private static final long serialVersionUID = -5283096582947056142L; - - public FCMPL() { super(org.apache.commons.bcel6.Constants.FCMPL, (short) 1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCONST.java b/src/main/java/org/apache/commons/bcel6/generic/FCONST.java index 6d055079..ab597f4a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCONST.java @@ -26,7 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class FCONST extends Instruction implements ConstantPushInstruction { - private static final long serialVersionUID = 3018815844848018054L; private float value; diff --git a/src/main/java/org/apache/commons/bcel6/generic/FDIV.java b/src/main/java/org/apache/commons/bcel6/generic/FDIV.java index 9c1eb9c8..9fe84efe 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FDIV.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FDIV extends ArithmeticInstruction { - private static final long serialVersionUID = -8536341322669578097L; - - /** Divide floats */ public FDIV() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java b/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java index 4a048974..b2b4ba26 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FLOAD extends LoadInstruction { - private static final long serialVersionUID = 7970650436462434345L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/FMUL.java b/src/main/java/org/apache/commons/bcel6/generic/FMUL.java index 3a785a6d..f2a0cff3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FMUL.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FMUL extends ArithmeticInstruction { - private static final long serialVersionUID = -1981818566663824251L; - - /** Multiply floats */ public FMUL() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FNEG.java b/src/main/java/org/apache/commons/bcel6/generic/FNEG.java index ed1f0f6f..b6fee8f6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FNEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FNEG.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FNEG extends ArithmeticInstruction { - private static final long serialVersionUID = 2963444954300367744L; - - public FNEG() { super(org.apache.commons.bcel6.Constants.FNEG); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FREM.java b/src/main/java/org/apache/commons/bcel6/generic/FREM.java index 3bfd27ce..b600e5b1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FREM.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FREM extends ArithmeticInstruction { - private static final long serialVersionUID = -9122754212888086133L; - - /** Remainder of floats */ public FREM() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java index d1ea35d4..21dd2bbd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FRETURN extends ReturnInstruction { - private static final long serialVersionUID = -3630453809574277966L; - - /** Return float from method */ public FRETURN() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java b/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java index b3acea55..a194e9c5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FSTORE extends StoreInstruction { - private static final long serialVersionUID = 2587266679484598179L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/FSUB.java b/src/main/java/org/apache/commons/bcel6/generic/FSUB.java index 7adbbfaa..6909c36c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FSUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FSUB.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class FSUB extends ArithmeticInstruction { - private static final long serialVersionUID = 8403880233375858501L; - - /** Substract floats */ public FSUB() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index 34419f6e..102eab0e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -42,7 +42,6 @@ import org.apache.commons.bcel6.util.BCELComparator; */ public class FieldGen extends FieldGenOrMethodGen { - private static final long serialVersionUID = -6050448955000008261L; private Object value = null; private static BCELComparator _cmp = new BCELComparator() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java index 5b3fce2a..29f1b50d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.classfile.Attribute; */ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAndTyped, Cloneable { - private static final long serialVersionUID = -2549303846821589647L; protected String name; protected Type type; protected ConstantPoolGen cp; diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java index b54c4d80..6c2f16ba 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java @@ -26,9 +26,6 @@ import org.apache.commons.bcel6.classfile.ConstantPool; */ public abstract class FieldInstruction extends FieldOrMethod { - private static final long serialVersionUID = -7870956226459765817L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java index 4e0b7175..b9ae2f41 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java @@ -33,9 +33,6 @@ import org.apache.commons.bcel6.classfile.ConstantUtf8; */ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { - private static final long serialVersionUID = 2036985877748835708L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java b/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java index 18122c1e..e5b9138c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java @@ -31,9 +31,6 @@ import org.apache.commons.bcel6.ExceptionConstants; public class GETFIELD extends FieldInstruction implements ExceptionThrower, StackConsumer, StackProducer { - private static final long serialVersionUID = -6510928743515082496L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java index dfba80b8..6bb47b31 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java @@ -30,9 +30,6 @@ import org.apache.commons.bcel6.ExceptionConstants; */ public class GETSTATIC extends FieldInstruction implements PushInstruction, ExceptionThrower { - private static final long serialVersionUID = -477185594622953478L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java index 37205848..bb5a1915 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java @@ -27,9 +27,6 @@ import java.io.IOException; */ public class GOTO extends GotoInstruction implements VariableLengthInstruction { - private static final long serialVersionUID = 6106731367505145625L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java b/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java index ed3c9892..c4adb8e5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java @@ -29,9 +29,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public class GOTO_W extends GotoInstruction { - private static final long serialVersionUID = -344799540124265957L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java index 006f2e44..a302e4ab 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java @@ -24,9 +24,6 @@ package org.apache.commons.bcel6.generic; */ public abstract class GotoInstruction extends BranchInstruction implements UnconditionalBranch { - private static final long serialVersionUID = -2882435228056875173L; - - GotoInstruction(short opcode, InstructionHandle target) { super(opcode, target); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2B.java b/src/main/java/org/apache/commons/bcel6/generic/I2B.java index 840ad31b..7fa18c30 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2B.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2B.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class I2B extends ConversionInstruction { - private static final long serialVersionUID = -260969101469366410L; - - /** Convert int to byte */ public I2B() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2C.java b/src/main/java/org/apache/commons/bcel6/generic/I2C.java index efb43451..ed37aeb4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2C.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2C.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class I2C extends ConversionInstruction { - private static final long serialVersionUID = 7396507741159927455L; - - /** Convert int to char */ public I2C() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2D.java b/src/main/java/org/apache/commons/bcel6/generic/I2D.java index e93813a3..c9d8c717 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2D.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2D.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class I2D extends ConversionInstruction { - private static final long serialVersionUID = 4267924152721121331L; - - /** Convert int to double */ public I2D() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2F.java b/src/main/java/org/apache/commons/bcel6/generic/I2F.java index 2b103cc7..2b48eb6d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2F.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2F.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class I2F extends ConversionInstruction { - private static final long serialVersionUID = -816875455957376859L; - - /** Convert int to float */ public I2F() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2L.java b/src/main/java/org/apache/commons/bcel6/generic/I2L.java index 2e4325f8..8b91c6f3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2L.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2L.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class I2L extends ConversionInstruction { - private static final long serialVersionUID = 8923707875178789326L; - - /** Convert int to long */ public I2L() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2S.java b/src/main/java/org/apache/commons/bcel6/generic/I2S.java index 880fab0e..03d575cc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2S.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2S.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class I2S extends ConversionInstruction { - private static final long serialVersionUID = -2414292630144687091L; - - public I2S() { super(org.apache.commons.bcel6.Constants.I2S); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IADD.java b/src/main/java/org/apache/commons/bcel6/generic/IADD.java index 3ebe79e6..3550ef59 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IADD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class IADD extends ArithmeticInstruction { - private static final long serialVersionUID = 8749750216946526117L; - - /** Add ints */ public IADD() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java index 16db2092..c633a5ef 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class IALOAD extends ArrayInstruction implements StackProducer { - private static final long serialVersionUID = -3275094472217586613L; - - /** * Load int from array */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/IAND.java b/src/main/java/org/apache/commons/bcel6/generic/IAND.java index 6af6aabc..35ab2677 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IAND.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IAND.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class IAND extends ArithmeticInstruction { - private static final long serialVersionUID = -3190292062305201816L; - - public IAND() { super(org.apache.commons.bcel6.Constants.IAND); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java index 81890b27..0216bd65 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class IASTORE extends ArrayInstruction implements StackConsumer { - private static final long serialVersionUID = -3570157505504012648L; - - /** * Store into int array */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/ICONST.java b/src/main/java/org/apache/commons/bcel6/generic/ICONST.java index c8b3af4b..dc8b4298 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ICONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ICONST.java @@ -26,7 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class ICONST extends Instruction implements ConstantPushInstruction { - private static final long serialVersionUID = -174595933747784635L; private int value; diff --git a/src/main/java/org/apache/commons/bcel6/generic/IDIV.java b/src/main/java/org/apache/commons/bcel6/generic/IDIV.java index e70344f1..be29c932 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IDIV.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class IDIV extends ArithmeticInstruction implements ExceptionThrower { - private static final long serialVersionUID = -7104037931993634172L; - - /** Divide ints */ public IDIV() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java index 8781c94b..4bf676d3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IFEQ extends IfInstruction { - private static final long serialVersionUID = -6140576561545855324L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFGE.java b/src/main/java/org/apache/commons/bcel6/generic/IFGE.java index 87bb4ec8..abed7035 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFGE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFGE.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IFGE extends IfInstruction { - private static final long serialVersionUID = 8975527282985945729L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFGT.java b/src/main/java/org/apache/commons/bcel6/generic/IFGT.java index ccae5858..dd07b307 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFGT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFGT.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IFGT extends IfInstruction { - private static final long serialVersionUID = -6271055211127179697L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFLE.java b/src/main/java/org/apache/commons/bcel6/generic/IFLE.java index 733302fb..67e6ebe8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFLE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFLE.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IFLE extends IfInstruction { - private static final long serialVersionUID = 7916641859064664263L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFLT.java b/src/main/java/org/apache/commons/bcel6/generic/IFLT.java index de75abb0..1d8065da 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFLT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFLT.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IFLT extends IfInstruction { - private static final long serialVersionUID = 2489268758129304231L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNE.java b/src/main/java/org/apache/commons/bcel6/generic/IFNE.java index 6bc00dc5..f22250d6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNE.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IFNE extends IfInstruction { - private static final long serialVersionUID = -5417647524534847152L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java b/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java index 5cdac1c1..0fb99517 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IFNONNULL extends IfInstruction { - private static final long serialVersionUID = -6378085152112796792L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java b/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java index b6cfdcbb..8d017656 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IFNULL extends IfInstruction { - private static final long serialVersionUID = 608514554995424349L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java index 8cd682ec..2711dea9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IF_ACMPEQ extends IfInstruction { - private static final long serialVersionUID = -4528733406576671849L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java index 4d013624..deb4f34e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IF_ACMPNE extends IfInstruction { - private static final long serialVersionUID = -5532275839192747402L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java index 236de849..071e83b6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IF_ICMPEQ extends IfInstruction { - private static final long serialVersionUID = -3149605608148417123L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java index c3419ba4..47d98a90 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IF_ICMPGE extends IfInstruction { - private static final long serialVersionUID = -1887574519712008723L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java index d5f9eedb..79ec2ca3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IF_ICMPGT extends IfInstruction { - private static final long serialVersionUID = -2569877744173094534L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java index 115bf740..5d97352e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IF_ICMPLE extends IfInstruction { - private static final long serialVersionUID = -6863915647505504868L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java index 562ee279..1d9ef5ba 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IF_ICMPLT extends IfInstruction { - private static final long serialVersionUID = -6835991395337462478L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java index 86880ae9..742e264a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class IF_ICMPNE extends IfInstruction { - private static final long serialVersionUID = -3908465635973274661L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IINC.java b/src/main/java/org/apache/commons/bcel6/generic/IINC.java index ac47f195..f73e766f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IINC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IINC.java @@ -29,7 +29,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public class IINC extends LocalVariableInstruction { - private static final long serialVersionUID = -8938364416647466869L; private boolean wide; private int c; diff --git a/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java b/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java index 19878ba6..3409526b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class ILOAD extends LoadInstruction { - private static final long serialVersionUID = 7568563453093184347L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java index 3565639d..8708f7df 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java @@ -24,9 +24,6 @@ package org.apache.commons.bcel6.generic; */ public class IMPDEP1 extends Instruction { - private static final long serialVersionUID = 134641616863598508L; - - public IMPDEP1() { super(org.apache.commons.bcel6.Constants.IMPDEP1, (short) 1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java index f371e290..158ab774 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java @@ -24,9 +24,6 @@ package org.apache.commons.bcel6.generic; */ public class IMPDEP2 extends Instruction { - private static final long serialVersionUID = 4097564761941607538L; - - public IMPDEP2() { super(org.apache.commons.bcel6.Constants.IMPDEP2, (short) 1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IMUL.java b/src/main/java/org/apache/commons/bcel6/generic/IMUL.java index 0f12eabc..44012d22 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IMUL.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class IMUL extends ArithmeticInstruction { - private static final long serialVersionUID = -7475024981820292461L; - - /** Multiply ints */ public IMUL() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/INEG.java b/src/main/java/org/apache/commons/bcel6/generic/INEG.java index a960d3fc..4357d17e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INEG.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class INEG extends ArithmeticInstruction { - private static final long serialVersionUID = 6175987548738672934L; - - public INEG() { super(org.apache.commons.bcel6.Constants.INEG); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java b/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java index df5a51bd..d397e8e1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java @@ -28,9 +28,6 @@ import org.apache.commons.bcel6.ExceptionConstants; public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThrower, StackProducer, StackConsumer { - private static final long serialVersionUID = -1068668479062613915L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java index f744b4b1..54c994cd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java @@ -35,9 +35,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public class INVOKEDYNAMIC extends InvokeInstruction { - private static final long serialVersionUID = 1L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java index 438ecc6c..7f27708d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java @@ -33,7 +33,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public final class INVOKEINTERFACE extends InvokeInstruction { - private static final long serialVersionUID = 8198753714085379482L; private int nargs; // Number of arguments on stack (number of stack slots), called "count" in vmspec2 diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java index e33f27ad..0e349660 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java @@ -30,9 +30,6 @@ import org.apache.commons.bcel6.ExceptionConstants; */ public class INVOKESPECIAL extends InvokeInstruction { - private static final long serialVersionUID = -6615779239416262849L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java index 38fd53f8..1407de45 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java @@ -29,9 +29,6 @@ import org.apache.commons.bcel6.ExceptionConstants; */ public class INVOKESTATIC extends InvokeInstruction { - private static final long serialVersionUID = -2160020248508943620L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java index 757a204f..0dfaa14b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java @@ -29,9 +29,6 @@ import org.apache.commons.bcel6.ExceptionConstants; */ public class INVOKEVIRTUAL extends InvokeInstruction { - private static final long serialVersionUID = -7355623307528443725L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/IOR.java b/src/main/java/org/apache/commons/bcel6/generic/IOR.java index c37d52cb..70e1a432 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IOR.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class IOR extends ArithmeticInstruction { - private static final long serialVersionUID = -6128609553204409153L; - - public IOR() { super(org.apache.commons.bcel6.Constants.IOR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IREM.java b/src/main/java/org/apache/commons/bcel6/generic/IREM.java index e3681a16..438ed218 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IREM.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class IREM extends ArithmeticInstruction implements ExceptionThrower { - private static final long serialVersionUID = 834504719616513910L; - - /** Remainder of ints */ public IREM() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java index 4de50d1c..d3c37143 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class IRETURN extends ReturnInstruction { - private static final long serialVersionUID = 4067606299818510584L; - - /** Return int from method */ public IRETURN() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISHL.java b/src/main/java/org/apache/commons/bcel6/generic/ISHL.java index 57b9942d..1e500308 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ISHL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISHL.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class ISHL extends ArithmeticInstruction { - private static final long serialVersionUID = -7440998118555505042L; - - public ISHL() { super(org.apache.commons.bcel6.Constants.ISHL); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISHR.java b/src/main/java/org/apache/commons/bcel6/generic/ISHR.java index 3b22a165..468678d9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ISHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISHR.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class ISHR extends ArithmeticInstruction { - private static final long serialVersionUID = 7401114050910307281L; - - public ISHR() { super(org.apache.commons.bcel6.Constants.ISHR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java b/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java index 99e45241..51fcb0d4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class ISTORE extends StoreInstruction { - private static final long serialVersionUID = 6155373362393796303L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISUB.java b/src/main/java/org/apache/commons/bcel6/generic/ISUB.java index da600d65..4a78e358 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ISUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISUB.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class ISUB extends ArithmeticInstruction { - private static final long serialVersionUID = 1878271684888856459L; - - /** Substract ints */ public ISUB() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java b/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java index adcca1ec..2ff63603 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class IUSHR extends ArithmeticInstruction { - private static final long serialVersionUID = -4507658555921269426L; - - public IUSHR() { super(org.apache.commons.bcel6.Constants.IUSHR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IXOR.java b/src/main/java/org/apache/commons/bcel6/generic/IXOR.java index de56da7c..c7254f36 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IXOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IXOR.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class IXOR extends ArithmeticInstruction { - private static final long serialVersionUID = -6524415552072672532L; - - public IXOR() { super(org.apache.commons.bcel6.Constants.IXOR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java index cf2f18c5..729da45d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java @@ -24,9 +24,6 @@ package org.apache.commons.bcel6.generic; */ public abstract class IfInstruction extends BranchInstruction implements StackConsumer { - private static final long serialVersionUID = -781053966413893941L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java index 2c78d809..ba41ec5c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java @@ -31,9 +31,6 @@ import org.apache.commons.bcel6.classfile.ConstantPool; public abstract class InvokeInstruction extends FieldOrMethod implements ExceptionThrower, StackConsumer, StackProducer { - private static final long serialVersionUID = 6089031137856650442L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/JSR.java b/src/main/java/org/apache/commons/bcel6/generic/JSR.java index 2bb018a8..a8de6707 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JSR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JSR.java @@ -27,9 +27,6 @@ import java.io.IOException; */ public class JSR extends JsrInstruction implements VariableLengthInstruction { - private static final long serialVersionUID = 7425681395340093184L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java b/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java index ecde3ce5..65e078f6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java @@ -29,9 +29,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public class JSR_W extends JsrInstruction { - private static final long serialVersionUID = -7352049131416924650L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java index 9bc94558..73dd0346 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; public abstract class JsrInstruction extends BranchInstruction implements UnconditionalBranch, TypedInstruction, StackProducer { - private static final long serialVersionUID = -6438850002848773481L; - - JsrInstruction(short opcode, InstructionHandle target) { super(opcode, target); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/L2D.java b/src/main/java/org/apache/commons/bcel6/generic/L2D.java index ad34d976..5928a5cb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/L2D.java +++ b/src/main/java/org/apache/commons/bcel6/generic/L2D.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class L2D extends ConversionInstruction { - private static final long serialVersionUID = 1166552346340922659L; - - public L2D() { super(org.apache.commons.bcel6.Constants.L2D); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/L2F.java b/src/main/java/org/apache/commons/bcel6/generic/L2F.java index a3b3c3dc..1ba6b006 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/L2F.java +++ b/src/main/java/org/apache/commons/bcel6/generic/L2F.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class L2F extends ConversionInstruction { - private static final long serialVersionUID = -7181529985408901328L; - - public L2F() { super(org.apache.commons.bcel6.Constants.L2F); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/L2I.java b/src/main/java/org/apache/commons/bcel6/generic/L2I.java index 44738bc4..ccc37961 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/L2I.java +++ b/src/main/java/org/apache/commons/bcel6/generic/L2I.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class L2I extends ConversionInstruction { - private static final long serialVersionUID = -3263285222028195535L; - - public L2I() { super(org.apache.commons.bcel6.Constants.L2I); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LADD.java b/src/main/java/org/apache/commons/bcel6/generic/LADD.java index ed67964d..0d82d706 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LADD.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class LADD extends ArithmeticInstruction { - private static final long serialVersionUID = 2093272772688460551L; - - public LADD() { super(org.apache.commons.bcel6.Constants.LADD); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java index 9208e7d8..3f68878f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class LALOAD extends ArrayInstruction implements StackProducer { - private static final long serialVersionUID = -3687594761485525620L; - - /** Load long from array */ public LALOAD() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LAND.java b/src/main/java/org/apache/commons/bcel6/generic/LAND.java index 28399996..704fab2d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LAND.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LAND.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class LAND extends ArithmeticInstruction { - private static final long serialVersionUID = 2429077463161192057L; - - public LAND() { super(org.apache.commons.bcel6.Constants.LAND); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java index 1ba35a29..c3d2cce3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class LASTORE extends ArrayInstruction implements StackConsumer { - private static final long serialVersionUID = -6758326777570451990L; - - /** Store long into array */ public LASTORE() { diff --git a/src/main/java/org/apache/commons/bcel6/generic/LCMP.java b/src/main/java/org/apache/commons/bcel6/generic/LCMP.java index 1404907f..6bae41e4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LCMP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LCMP.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class LCMP extends Instruction implements TypedInstruction, StackProducer, StackConsumer { - private static final long serialVersionUID = 2981727810276161294L; - - public LCMP() { super(org.apache.commons.bcel6.Constants.LCMP, (short) 1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LCONST.java b/src/main/java/org/apache/commons/bcel6/generic/LCONST.java index 68d266e1..9c1e0451 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LCONST.java @@ -26,7 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class LCONST extends Instruction implements ConstantPushInstruction { - private static final long serialVersionUID = 909025807621177822L; private long value; diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC.java b/src/main/java/org/apache/commons/bcel6/generic/LDC.java index eaa1bf4c..0c321b66 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC.java @@ -32,9 +32,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public class LDC extends CPInstruction implements PushInstruction, ExceptionThrower { - private static final long serialVersionUID = -972820476154330719L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java b/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java index 98c394b8..784de673 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class LDC2_W extends CPInstruction implements PushInstruction { - private static final long serialVersionUID = 7403326732924539892L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java b/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java index 47f73ccf..4471533b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java @@ -30,9 +30,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public class LDC_W extends LDC { - private static final long serialVersionUID = -8040188785844554411L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDIV.java b/src/main/java/org/apache/commons/bcel6/generic/LDIV.java index 7ae0b5aa..bb787093 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDIV.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class LDIV extends ArithmeticInstruction implements ExceptionThrower { - private static final long serialVersionUID = 8188185695825749727L; - - public LDIV() { super(org.apache.commons.bcel6.Constants.LDIV); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java b/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java index 1db147af..7ceb9e4d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class LLOAD extends LoadInstruction { - private static final long serialVersionUID = 379331602405124174L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/LMUL.java b/src/main/java/org/apache/commons/bcel6/generic/LMUL.java index b71338d3..d80c640d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LMUL.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class LMUL extends ArithmeticInstruction { - private static final long serialVersionUID = 3538398481425889023L; - - public LMUL() { super(org.apache.commons.bcel6.Constants.LMUL); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LNEG.java b/src/main/java/org/apache/commons/bcel6/generic/LNEG.java index fd0bb4ea..38eacfd0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LNEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LNEG.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class LNEG extends ArithmeticInstruction { - private static final long serialVersionUID = 7749253327528155126L; - - public LNEG() { super(org.apache.commons.bcel6.Constants.LNEG); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java index 385daa1e..85e35ab9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java @@ -30,9 +30,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public class LOOKUPSWITCH extends Select { - private static final long serialVersionUID = -8263209830709467636L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/LOR.java b/src/main/java/org/apache/commons/bcel6/generic/LOR.java index dfe3a219..19fd704c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LOR.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class LOR extends ArithmeticInstruction { - private static final long serialVersionUID = 7862213176431021916L; - - public LOR() { super(org.apache.commons.bcel6.Constants.LOR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LREM.java b/src/main/java/org/apache/commons/bcel6/generic/LREM.java index a16f323c..c0eef33c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LREM.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class LREM extends ArithmeticInstruction implements ExceptionThrower { - private static final long serialVersionUID = -3646771608200042527L; - - public LREM() { super(org.apache.commons.bcel6.Constants.LREM); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java index 016a58da..ec135245 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class LRETURN extends ReturnInstruction { - private static final long serialVersionUID = 6173148526583167918L; - - public LRETURN() { super(org.apache.commons.bcel6.Constants.LRETURN); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSHL.java b/src/main/java/org/apache/commons/bcel6/generic/LSHL.java index bf8fd74a..82f2f30c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LSHL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSHL.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class LSHL extends ArithmeticInstruction { - private static final long serialVersionUID = 7855322471731877312L; - - public LSHL() { super(org.apache.commons.bcel6.Constants.LSHL); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSHR.java b/src/main/java/org/apache/commons/bcel6/generic/LSHR.java index aedaf028..a50c7a8e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LSHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSHR.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class LSHR extends ArithmeticInstruction { - private static final long serialVersionUID = -6376870568784516963L; - - public LSHR() { super(org.apache.commons.bcel6.Constants.LSHR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java b/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java index e37b1473..e0f1a270 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class LSTORE extends StoreInstruction { - private static final long serialVersionUID = 1309214714647416201L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSUB.java b/src/main/java/org/apache/commons/bcel6/generic/LSUB.java index 8dcbf867..9d78dda1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LSUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSUB.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class LSUB extends ArithmeticInstruction { - private static final long serialVersionUID = -8379864362938353932L; - - public LSUB() { super(org.apache.commons.bcel6.Constants.LSUB); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java b/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java index 6655490c..68f9241f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class LUSHR extends ArithmeticInstruction { - private static final long serialVersionUID = 9184663422046843885L; - - public LUSHR() { super(org.apache.commons.bcel6.Constants.LUSHR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LXOR.java b/src/main/java/org/apache/commons/bcel6/generic/LXOR.java index 635587ce..0cec20b9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LXOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LXOR.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class LXOR extends ArithmeticInstruction { - private static final long serialVersionUID = -3031187042785170579L; - - public LXOR() { super(org.apache.commons.bcel6.Constants.LXOR); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java index 2a1e5c94..965c2dcf 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public abstract class LoadInstruction extends LocalVariableInstruction implements PushInstruction { - private static final long serialVersionUID = 3661924741022212247L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java index f366d9e6..cc12e6b7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java @@ -31,7 +31,6 @@ import org.apache.commons.bcel6.util.ByteSequence; public abstract class LocalVariableInstruction extends Instruction implements TypedInstruction, IndexedInstruction { - private static final long serialVersionUID = 8322269736316122743L; protected int n = -1; // index of referenced variable private short c_tag = -1; // compact version, such as ILOAD_0 private short canon_tag = -1; // canonical tag such as ILOAD diff --git a/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java b/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java index cf63b99c..992a860b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class MONITORENTER extends Instruction implements ExceptionThrower, StackConsumer { - private static final long serialVersionUID = 4537302966975402521L; - - public MONITORENTER() { super(org.apache.commons.bcel6.Constants.MONITORENTER, (short) 1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java b/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java index 903496c2..ea333cc6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class MONITOREXIT extends Instruction implements ExceptionThrower, StackConsumer { - private static final long serialVersionUID = -1499496577099659601L; - - public MONITOREXIT() { super(org.apache.commons.bcel6.Constants.MONITOREXIT, (short) 1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java index 1d20b5c1..e468ba02 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java @@ -33,7 +33,6 @@ import org.apache.commons.bcel6.util.ByteSequence; public class MULTIANEWARRAY extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower { - private static final long serialVersionUID = -7439639244808941662L; private short dimensions; diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index fceb9555..27de61db 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -58,7 +58,6 @@ import org.apache.commons.bcel6.util.BCELComparator; */ public class MethodGen extends FieldGenOrMethodGen { - private static final long serialVersionUID = -3924667713338957720L; private String class_name; private Type[] arg_types; private String[] arg_names; diff --git a/src/main/java/org/apache/commons/bcel6/generic/NEW.java b/src/main/java/org/apache/commons/bcel6/generic/NEW.java index a919e038..ee61496a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NEW.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NEW.java @@ -28,9 +28,6 @@ import org.apache.commons.bcel6.ExceptionConstants; public class NEW extends CPInstruction implements LoadClass, AllocationInstruction, ExceptionThrower, StackProducer { - private static final long serialVersionUID = 5773167897857305796L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java index 91d96405..9127e82b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java @@ -32,7 +32,6 @@ import org.apache.commons.bcel6.util.ByteSequence; public class NEWARRAY extends Instruction implements AllocationInstruction, ExceptionThrower, StackProducer { - private static final long serialVersionUID = 7048445841018649405L; private byte type; diff --git a/src/main/java/org/apache/commons/bcel6/generic/NOP.java b/src/main/java/org/apache/commons/bcel6/generic/NOP.java index cbe59179..ef189a1e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NOP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NOP.java @@ -24,9 +24,6 @@ package org.apache.commons.bcel6.generic; */ public class NOP extends Instruction { - private static final long serialVersionUID = -244116825309415153L; - - public NOP() { super(org.apache.commons.bcel6.Constants.NOP, (short) 1); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java index a2d40a6c..ccc22af5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java @@ -31,8 +31,6 @@ import org.apache.commons.bcel6.classfile.ConstantUtf8; */ public abstract class NameSignatureInstruction extends CPInstruction { - private static final long serialVersionUID = 1L; - public NameSignatureInstruction() { super(); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java index 71342429..f59ce673 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java @@ -28,7 +28,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; */ public class ObjectType extends ReferenceType { - private static final long serialVersionUID = -2819379966444533294L; private final String class_name; // Class name of type /** diff --git a/src/main/java/org/apache/commons/bcel6/generic/POP.java b/src/main/java/org/apache/commons/bcel6/generic/POP.java index 085b4374..9f57a566 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/POP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/POP.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class POP extends StackInstruction implements PopInstruction { - private static final long serialVersionUID = -7366757965427670388L; - - public POP() { super(org.apache.commons.bcel6.Constants.POP); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/POP2.java b/src/main/java/org/apache/commons/bcel6/generic/POP2.java index cc818c00..0f9f28db 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/POP2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/POP2.java @@ -26,9 +26,6 @@ package org.apache.commons.bcel6.generic; */ public class POP2 extends StackInstruction implements PopInstruction { - private static final long serialVersionUID = -3868598204285850458L; - - public POP2() { super(org.apache.commons.bcel6.Constants.POP2); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java b/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java index 9cc96c28..e8bbb65d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java @@ -30,9 +30,6 @@ import org.apache.commons.bcel6.ExceptionConstants; */ public class PUTFIELD extends FieldInstruction implements PopInstruction, ExceptionThrower { - private static final long serialVersionUID = -3931392044558815011L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java index b4267f28..83bb7600 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java @@ -30,9 +30,6 @@ import org.apache.commons.bcel6.ExceptionConstants; */ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, PopInstruction { - private static final long serialVersionUID = -1992788532422473584L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/RET.java b/src/main/java/org/apache/commons/bcel6/generic/RET.java index 21ada1b1..88d1f02f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/RET.java +++ b/src/main/java/org/apache/commons/bcel6/generic/RET.java @@ -31,7 +31,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public class RET extends Instruction implements IndexedInstruction, TypedInstruction { - private static final long serialVersionUID = -3751746568458761719L; private boolean wide; private int index; // index to local variable containg the return address diff --git a/src/main/java/org/apache/commons/bcel6/generic/RETURN.java b/src/main/java/org/apache/commons/bcel6/generic/RETURN.java index 66d0a849..190c798e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/RETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/RETURN.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class RETURN extends ReturnInstruction { - private static final long serialVersionUID = -7375896559820981467L; - - public RETURN() { super(org.apache.commons.bcel6.Constants.RETURN); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java index af24d912..ec485f9c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java @@ -28,9 +28,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; */ public abstract class ReferenceType extends Type { - private static final long serialVersionUID = -1434716548829506031L; - - protected ReferenceType(byte t, String s) { super(t, s); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java index e6d51d8a..912c0071 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java @@ -28,9 +28,6 @@ import org.apache.commons.bcel6.ExceptionConstants; public abstract class ReturnInstruction extends Instruction implements ExceptionThrower, TypedInstruction, StackConsumer { - private static final long serialVersionUID = -1248578537710620153L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java b/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java index 49910895..72a8c09e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.Constants; */ public class ReturnaddressType extends Type { - private static final long serialVersionUID = 3782621476731023927L; public static final ReturnaddressType NO_TARGET = new ReturnaddressType(); private InstructionHandle returnTarget; diff --git a/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java index 4b1c9cb2..9b48bfb0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class SALOAD extends ArrayInstruction implements StackProducer { - private static final long serialVersionUID = 7178769326864697416L; - - public SALOAD() { super(org.apache.commons.bcel6.Constants.SALOAD); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java index 7ae564aa..7de8a3d7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class SASTORE extends ArrayInstruction implements StackConsumer { - private static final long serialVersionUID = -5187452948601765872L; - - public SASTORE() { super(org.apache.commons.bcel6.Constants.SASTORE); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java b/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java index 63a651a1..f47ae6a7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java @@ -31,7 +31,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public class SIPUSH extends Instruction implements ConstantPushInstruction { - private static final long serialVersionUID = -5670145672311191256L; private short b; diff --git a/src/main/java/org/apache/commons/bcel6/generic/SWAP.java b/src/main/java/org/apache/commons/bcel6/generic/SWAP.java index 4b27587c..7934979e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SWAP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SWAP.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public class SWAP extends StackInstruction implements StackConsumer, StackProducer { - private static final long serialVersionUID = 1965736870393433312L; - - public SWAP() { super(org.apache.commons.bcel6.Constants.SWAP); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/Select.java b/src/main/java/org/apache/commons/bcel6/generic/Select.java index 5211c23c..12e76c43 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Select.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Select.java @@ -35,7 +35,6 @@ import org.apache.commons.bcel6.util.ByteSequence; public abstract class Select extends BranchInstruction implements VariableLengthInstruction, StackConsumer /* @since 6.0 */, StackProducer { - private static final long serialVersionUID = 2806771744559217250L; protected int[] match; // matches, i.e., case 1: ... TODO could be package-protected? protected int[] indices; // target offsets TODO could be package-protected? protected InstructionHandle[] targets; // target objects in instruction list TODO could be package-protected? diff --git a/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java index 1d34ee8d..6b9007e3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java @@ -24,9 +24,6 @@ package org.apache.commons.bcel6.generic; */ public abstract class StackInstruction extends Instruction { - private static final long serialVersionUID = -8542057001831958935L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java index 45f3fb63..1dd60f5d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java @@ -25,9 +25,6 @@ package org.apache.commons.bcel6.generic; */ public abstract class StoreInstruction extends LocalVariableInstruction implements PopInstruction { - private static final long serialVersionUID = -774241740383612113L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java index d2df1065..cddddb06 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java @@ -30,9 +30,6 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public class TABLESWITCH extends Select { - private static final long serialVersionUID = -1178229029789923698L; - - /** * Empty constructor needed for the Class.newInstance() statement in * Instruction.readInstruction(). Not to be used otherwise. diff --git a/src/main/java/org/apache/commons/bcel6/generic/Type.java b/src/main/java/org/apache/commons/bcel6/generic/Type.java index ea31f105..709a6194 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Type.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Type.java @@ -54,12 +54,8 @@ public abstract class Type { public static final ObjectType THROWABLE = ObjectType.getInstance("java.lang.Throwable"); public static final Type[] NO_ARGS = new Type[0]; public static final ReferenceType NULL = new ReferenceType() { - - private static final long serialVersionUID = 4526765862386946282L; }; public static final Type UNKNOWN = new Type(Constants.T_UNKNOWN, "") { - - private static final long serialVersionUID = 1321113605813486066L; }; diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java index c46cf0a3..bc3a29cb 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java @@ -38,7 +38,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; */ public class ClassLoaderRepository implements Repository { - private static final long serialVersionUID = -1052781833503868187L; private final java.lang.ClassLoader loader; private final Map loadedClasses = new HashMap<>(); // CLASSNAME X JAVACLASS diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index 51cd0f32..57822e41 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -387,7 +387,6 @@ public class ClassPath { private static class Dir extends PathEntry { - private static final long serialVersionUID = 4374062802142373088L; private final String dir; @@ -467,7 +466,6 @@ public class ClassPath { private static class Zip extends PathEntry { - private static final long serialVersionUID = -2210747632897905532L; private final ZipFile zip; diff --git a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java index d0bed5fa..04a0da9e 100644 --- a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java @@ -42,7 +42,6 @@ import org.apache.commons.bcel6.classfile.JavaClass; */ public class SyntheticRepository implements Repository { - private static final long serialVersionUID = 2923440730410019444L; //private static final String DEFAULT_PATH = ClassPath.getClassPath(); private static final Map _instances = new HashMap<>(); // CLASSPATH X REPOSITORY private ClassPath _path = null; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java index cdc78b22..71f249d6 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.generic.Type; */ public final class DOUBLE_Upper extends Type{ - private static final long serialVersionUID = -3046888862357818539L; /** The one and only instance of this class. */ private static final DOUBLE_Upper singleInstance = new DOUBLE_Upper(); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java index 1c191b0b..5512a48d 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java @@ -27,7 +27,6 @@ import org.apache.commons.bcel6.generic.Type; */ public final class LONG_Upper extends Type{ - private static final long serialVersionUID = 3650377550491597107L; /** The one and only instance of this class. */ private static final LONG_Upper singleInstance = new LONG_Upper(); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java index 156d2f0a..085d9c81 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java @@ -31,7 +31,6 @@ import org.apache.commons.bcel6.generic.ReferenceType; */ public class UninitializedObjectType extends ReferenceType{ - private static final long serialVersionUID = -1228341777713117641L; /** The "initialized" version. */ private final ObjectType initialized; -- GitLab From bf5d373501b7d1ed24d9434222e2999af883ed28 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 19 Aug 2015 22:40:00 +0000 Subject: [PATCH 0907/1313] Fix up refs; these instructions have shared sections git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696686 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/Constants.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Constants.java b/src/main/java/org/apache/commons/bcel6/Constants.java index 0a12cc66..94fee434 100644 --- a/src/main/java/org/apache/commons/bcel6/Constants.java +++ b/src/main/java/org/apache/commons/bcel6/Constants.java @@ -798,28 +798,28 @@ public class Constants { * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IFLE = 158; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPEQ = 159; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPNE = 160; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPLT = 161; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPGE = 162; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPGT = 163; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPLE = 164; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ACMPEQ = 165; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ACMPNE = 166; /** Java VM opcode. * @see Opcode definitions in The Java Virtual Machine Specification */ -- GitLab From a9647f78f869a6ab1e6c028cb155681a596d784f Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Thu, 20 Aug 2015 00:35:25 +0000 Subject: [PATCH 0908/1313] Add final modifier to private fields. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696692 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/generic/FieldGenOrMethodGen.java | 2 +- .../bcel6/verifier/tests/TestArrayAccess02Creator.java | 6 +++--- .../bcel6/verifier/tests/TestArrayAccess03Creator.java | 6 +++--- .../bcel6/verifier/tests/TestArrayAccess04Creator.java | 6 +++--- .../commons/bcel6/verifier/tests/TestReturn01Creator.java | 6 +++--- .../commons/bcel6/verifier/tests/TestReturn03Creator.java | 6 +++--- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java index 29f1b50d..5ce37837 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java @@ -37,7 +37,7 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn protected ConstantPoolGen cp; private final List attribute_vec = new ArrayList<>(); // @since 6.0 - private List annotation_vec= new ArrayList<>(); + private final List annotation_vec= new ArrayList<>(); protected FieldGenOrMethodGen() { diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java index 200645e3..6f75b5b1 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java @@ -34,9 +34,9 @@ import org.apache.commons.bcel6.generic.Type; import org.junit.Assert; public class TestArrayAccess02Creator extends TestCreator { - private InstructionFactory _factory; - private ConstantPoolGen _cp; - private ClassGen _cg; + private final InstructionFactory _factory; + private final ConstantPoolGen _cp; + private final ClassGen _cg; public TestArrayAccess02Creator() { _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess02", "java.lang.Object", "TestArrayAccess02.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java index a6ced53d..ae863a21 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java @@ -34,9 +34,9 @@ import org.apache.commons.bcel6.generic.Type; import org.junit.Assert; public class TestArrayAccess03Creator extends TestCreator { - private InstructionFactory _factory; - private ConstantPoolGen _cp; - private ClassGen _cg; + private final InstructionFactory _factory; + private final ConstantPoolGen _cp; + private final ClassGen _cg; public TestArrayAccess03Creator() { _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess03", "java.lang.Object", "TestArrayAccess03.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java index f035318f..2c28cb3a 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java @@ -34,9 +34,9 @@ import org.apache.commons.bcel6.generic.Type; import org.junit.Assert; public class TestArrayAccess04Creator extends TestCreator { - private InstructionFactory _factory; - private ConstantPoolGen _cp; - private ClassGen _cg; + private final InstructionFactory _factory; + private final ConstantPoolGen _cp; + private final ClassGen _cg; public TestArrayAccess04Creator() { _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess04", "java.lang.Object", "TestArrayAccess04.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java index af8e6a45..b7c480e0 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java @@ -32,9 +32,9 @@ import org.apache.commons.bcel6.generic.Type; import org.junit.Assert; public class TestReturn01Creator extends TestCreator { - private InstructionFactory _factory; - private ConstantPoolGen _cp; - private ClassGen _cg; + private final InstructionFactory _factory; + private final ConstantPoolGen _cp; + private final ClassGen _cg; public TestReturn01Creator() { _cg = new ClassGen(TEST_PACKAGE+".TestReturn01", "java.lang.Object", "TestReturn01.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java index fdc47295..e17cc1b0 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java @@ -32,9 +32,9 @@ import org.apache.commons.bcel6.generic.Type; import org.junit.Assert; public class TestReturn03Creator extends TestCreator { - private InstructionFactory _factory; - private ConstantPoolGen _cp; - private ClassGen _cg; + private final InstructionFactory _factory; + private final ConstantPoolGen _cp; + private final ClassGen _cg; public TestReturn03Creator() { _cg = new ClassGen(TEST_PACKAGE+".TestReturn03", "java.lang.Object", "TestReturn03.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); -- GitLab From fb46f5ed661e6f4212ac08886c354c5201a39a91 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 09:20:53 +0000 Subject: [PATCH 0909/1313] Fix up refs; these instructions have shared sections git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696734 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/Constants.java | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Constants.java b/src/main/java/org/apache/commons/bcel6/Constants.java index 94fee434..7e4096fc 100644 --- a/src/main/java/org/apache/commons/bcel6/Constants.java +++ b/src/main/java/org/apache/commons/bcel6/Constants.java @@ -318,46 +318,46 @@ public class Constants { public static final short ACONST_NULL = 1; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_M1 = 2; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_0 = 3; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_1 = 4; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_2 = 5; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_3 = 6; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_4 = 7; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_5 = 8; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LCONST_0 = 9; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LCONST_1 = 10; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_0 = 11; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_1 = 12; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_2 = 13; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCONST_0 = 14; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DCONST_1 = 15; /** Java VM opcode. * @see Opcode definitions in The Java Virtual Machine Specification */ @@ -390,64 +390,64 @@ public class Constants { * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD = 25; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_0 = 26; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_1 = 27; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_2 = 28; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_3 = 29; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_0 = 30; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_1 = 31; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_2 = 32; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_3 = 33; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_0 = 34; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_1 = 35; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_2 = 36; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_3 = 37; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_0 = 38; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_1 = 39; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_2 = 40; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_3 = 41; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_0 = 42; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_1 = 43; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_2 = 44; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_3 = 45; /** Java VM opcode. * @see Opcode definitions in The Java Virtual Machine Specification */ @@ -489,64 +489,64 @@ public class Constants { * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE = 58; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_0 = 59; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_1 = 60; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_2 = 61; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_3 = 62; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_0 = 63; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_1 = 64; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_2 = 65; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_3 = 66; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_0 = 67; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_1 = 68; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_2 = 69; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_3 = 70; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_0 = 71; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_1 = 72; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_2 = 73; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_3 = 74; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_0 = 75; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_1 = 76; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_2 = 77; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_3 = 78; /** Java VM opcode. * @see Opcode definitions in The Java Virtual Machine Specification */ -- GitLab From 818a9f93dae91ad7157ef907132ee18612bcee7d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 09:21:49 +0000 Subject: [PATCH 0910/1313] Javadoc git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696735 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/generic/GOTO.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java index bb5a1915..baeace04 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java @@ -57,8 +57,13 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { } - /** Called in pass 2 of InstructionList.setPositions() in order to update + /** + * Called in pass 2 of InstructionList.setPositions() in order to update * the branch target, that may shift due to variable length instructions. + * + * @param offset additional offset caused by preceding (variable length) instructions + * @param max_offset the maximum offset that may be caused by these instructions + * @return additional offset caused by possible change of this instruction's length */ @Override protected int updatePosition( int offset, int max_offset ) { -- GitLab From d1b74311efd9bdbe6ee442186ad7eef78eb7b052 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 11:25:33 +0000 Subject: [PATCH 0911/1313] Javadoc - add more JVM references git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696763 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/Constants.java | 66 ++++++++++++------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Constants.java b/src/main/java/org/apache/commons/bcel6/Constants.java index 7e4096fc..5b723d89 100644 --- a/src/main/java/org/apache/commons/bcel6/Constants.java +++ b/src/main/java/org/apache/commons/bcel6/Constants.java @@ -232,46 +232,60 @@ public class Constants { "synthetic", "annotation", "enum" }; - /** Marks a constant pool entry as type UTF-8. */ + /** Marks a constant pool entry as type UTF-8. + * @see The Constant Pool in The Java Virtual Machine Specification */ public final static byte CONSTANT_Utf8 = 1; - /** Marks a constant pool entry as type Integer. */ + /** Marks a constant pool entry as type Integer. + * @see The Constant Pool in The Java Virtual Machine Specification */ public final static byte CONSTANT_Integer = 3; - /** Marks a constant pool entry as type Float. */ + /** Marks a constant pool entry as type Float. + * @see The Constant Pool in The Java Virtual Machine Specification */ public final static byte CONSTANT_Float = 4; - /** Marks a constant pool entry as type Long. */ + /** Marks a constant pool entry as type Long. + * @see The Constant Pool in The Java Virtual Machine Specification */ public final static byte CONSTANT_Long = 5; - /** Marks a constant pool entry as type Double. */ + /** Marks a constant pool entry as type Double. + * @see The Constant Pool in The Java Virtual Machine Specification */ public final static byte CONSTANT_Double = 6; - /** Marks a constant pool entry as a Class. */ + /** Marks a constant pool entry as a Class + * @see The Constant Pool in The Java Virtual Machine Specification */ public final static byte CONSTANT_Class = 7; - /** Marks a constant pool entry as a Field Reference. */ + /** Marks a constant pool entry as a Field Reference. + * @see The Constant Pool in The Java Virtual Machine Specification */ public final static byte CONSTANT_Fieldref = 9; - /** Marks a constant pool entry as type String. */ + /** Marks a constant pool entry as type String + * @see The Constant Pool in The Java Virtual Machine Specification */ public final static byte CONSTANT_String = 8; - /** Marks a constant pool entry as a Method Reference. */ + /** Marks a constant pool entry as a Method Reference. + * @see The Constant Pool in The Java Virtual Machine Specification */ public final static byte CONSTANT_Methodref = 10; - /** Marks a constant pool entry as an Interface Method Reference. */ + /** Marks a constant pool entry as an Interface Method Reference. + * @see The Constant Pool in The Java Virtual Machine Specification */ public final static byte CONSTANT_InterfaceMethodref = 11; - /** Marks a constant pool entry as a name and type. */ + /** Marks a constant pool entry as a name and type. + * @see The Constant Pool in The Java Virtual Machine Specification */ public final static byte CONSTANT_NameAndType = 12; - /** Marks a constant pool entry as a Method Handle. */ + /** Marks a constant pool entry as a Method Handle. + * @see The Constant Pool in The Java Virtual Machine Specification */ public static final byte CONSTANT_MethodHandle = 15; - /** Marks a constant pool entry as a Method Type. */ + /** Marks a constant pool entry as a Method Type. + * @see The Constant Pool in The Java Virtual Machine Specification */ public static final byte CONSTANT_MethodType = 16; - /** Marks a constant pool entry as an Invoke Dynamic */ + /** Marks a constant pool entry as an Invoke Dynamic + * @see The Constant Pool in The Java Virtual Machine Specification */ public static final byte CONSTANT_InvokeDynamic = 18; /** The names of the types of entries in a constant pool. */ @@ -1062,21 +1076,29 @@ public class Constants { /** Mnemonic for an illegal type. */ public static final String ILLEGAL_TYPE = ""; - /** Boolean data type. */ + /** Boolean data type. + * @see Static Constraints in the Java Virtual Machine Specification */ public static final byte T_BOOLEAN = 4; - /** Char data type. */ + /** Char data type. + * @see Static Constraints in the Java Virtual Machine Specification */ public static final byte T_CHAR = 5; - /** Float data type. */ + /** Float data type. + * @see Static Constraints in the Java Virtual Machine Specification */ public static final byte T_FLOAT = 6; - /** Double data type. */ + /** Double data type. + * @see Static Constraints in the Java Virtual Machine Specification */ public static final byte T_DOUBLE = 7; - /** Byte data type. */ + /** Byte data type. + * @see Static Constraints in the Java Virtual Machine Specification */ public static final byte T_BYTE = 8; - /** Short data type. */ + /** Short data type. + * @see Static Constraints in the Java Virtual Machine Specification */ public static final byte T_SHORT = 9; - /** Int data type. */ + /** Int data type. + * @see Static Constraints in the Java Virtual Machine Specification */ public static final byte T_INT = 10; - /** Long data type. */ + /** Long data type. + * @see Static Constraints in the Java Virtual Machine Specification */ public static final byte T_LONG = 11; /** Void data type (non-standard). */ -- GitLab From 7f98a3a249cd1dea6c4113856e34350aa32ee84d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 11:28:00 +0000 Subject: [PATCH 0912/1313] BCEL-127 Document that Instruction Factory returns singleton instances git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696765 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/generic/InstructionFactory.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java index d35949b7..2aa9fa1f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java @@ -24,9 +24,13 @@ import org.apache.commons.bcel6.Constants; * versions of instructions. Its main purpose is to be used as the * byte code generating backend of a compiler. You can subclass it to * add your own create methods. + *

    + * Note: The static createXXX methods return singleton instances + * from the {@link InstructionConstants} class. * * @version $Id$ * @see Constants + * @see InstructionConstants */ public class InstructionFactory { -- GitLab From f1b42f447342224bec53e1c991057432f7365102 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 11:30:47 +0000 Subject: [PATCH 0913/1313] BCEL-127 Document that Instruction Factory returns singleton instances git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696766 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index a00e6145..a44b280f 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Document that Instruction Factory returns singleton instances better support for clone/copy methods Remove Serializable Remove deprecated methods and classes -- GitLab From af89ae58f914f400e198be73bc43ad556681706c Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 12:15:46 +0000 Subject: [PATCH 0914/1313] Fix bad comment wrapping git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696776 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/util/InstructionFinder.java | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java index 00665c02..e8f15c4e 100644 --- a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java +++ b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java @@ -67,15 +67,11 @@ import org.apache.commons.bcel6.generic.InstructionList; */ public class InstructionFinder { - private static final int OFFSET = 32767; // char + OFFSET is - // outside of - // LATIN-1 - private static final int NO_OPCODES = 256; // Potential number, - // some are not used + private static final int OFFSET = 32767; // char + OFFSET is outside of LATIN-1 + private static final int NO_OPCODES = 256; // Potential number, some are not used private static final Map map = new HashMap<>(); private final InstructionList il; - private String il_string; // instruction list - // as string + private String il_string; // instruction list as string private InstructionHandle[] handles; // map instruction @@ -96,8 +92,7 @@ public class InstructionFinder { */ public final void reread() { int size = il.getLength(); - char[] buf = new char[size]; // Create a string with length equal to il - // length + char[] buf = new char[size]; // Create a string with length equal to il length handles = il.getInstructionHandles(); // Map opcodes to characters for (int i = 0; i < size; i++) { @@ -368,17 +363,13 @@ public class InstructionFinder { String value = map.get(key); char ch = value.charAt(1); // Omit already precompiled patterns if (ch < OFFSET) { - map.put(key, compilePattern(value)); // precompile all - // patterns + map.put(key, compilePattern(value)); // precompile all patterns } } // Add instruction alias to match anything StringBuilder buf = new StringBuilder("("); for (short i = 0; i < NO_OPCODES; i++) { - if (Constants.NO_OF_OPERANDS[i] != Constants.UNDEFINED) { // Not - // an - // invalid - // opcode + if (Constants.NO_OF_OPERANDS[i] != Constants.UNDEFINED) { // Not an invalid opcode buf.append(makeChar(i)); if (i < NO_OPCODES - 1) { buf.append('|'); -- GitLab From c2f5b0afe28af49f3b0360661545d52df70eac7e Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 12:19:42 +0000 Subject: [PATCH 0915/1313] BCEL-249 Check for max Short seems wrong git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696777 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../bcel6/generic/BranchInstruction.java | 2 +- .../apache/commons/bcel6/generic/GOTO.java | 2 +- .../commons/bcel6/generic/Instruction.java | 20 +++++++++++++++++++ .../org/apache/commons/bcel6/generic/JSR.java | 2 +- .../apache/commons/bcel6/generic/PUSH.java | 4 ++-- 6 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index a44b280f..d49f7819 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Check for max Short seems wrong Document that Instruction Factory returns singleton instances better support for clone/copy methods Remove Serializable diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java index 67f149f4..99a56793 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java @@ -63,7 +63,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi public void dump( DataOutputStream out ) throws IOException { out.writeByte(opcode); index = getTargetOffset(); - if (Math.abs(index) >= 32767) { + if (!isValidShort(index)) { throw new ClassGenException("Branch target offset too large for short: " + index); } out.writeShort(index); // May be negative, i.e., point backwards diff --git a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java index baeace04..53a3e2c2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java @@ -69,7 +69,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { protected int updatePosition( int offset, int max_offset ) { int i = getTargetOffset(); // Depending on old position value setGetPosition(getPosition() + offset); // Position may be shifted by preceding expansions - if (Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) + if (Math.abs(i) >= (Short.MAX_VALUE - max_offset)) { // to large for short (estimate) opcode = org.apache.commons.bcel6.Constants.GOTO_W; short old_length = length; length = 5; diff --git a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java index 180a3cdd..b2a0cab4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java @@ -543,4 +543,24 @@ public abstract class Instruction implements Cloneable { public int hashCode() { return opcode; } + + /** + * Check if the value can fit in a byte (signed) + * @param value the value to check + * @return true if the value is in range + * @since 6.0 + */ + public static boolean isValidByte(int value) { + return value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE; + } + + /** + * Check if the value can fit in a short (signed) + * @param value the value to check + * @return true if the value is in range + * @since 6.0 + */ + public static boolean isValidShort(int value) { + return value >= Short.MIN_VALUE && value <= Short.MAX_VALUE; + } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/JSR.java b/src/main/java/org/apache/commons/bcel6/generic/JSR.java index a8de6707..f27ba2a9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JSR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JSR.java @@ -61,7 +61,7 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { protected int updatePosition( int offset, int max_offset ) { int i = getTargetOffset(); // Depending on old position value setGetPosition(getPosition() + offset); // Position may be shifted by preceding expansions - if (Math.abs(i) >= (32767 - max_offset)) { // to large for short (estimate) + if (Math.abs(i) >= (Short.MAX_VALUE - max_offset)) { // to large for short (estimate) opcode = org.apache.commons.bcel6.Constants.JSR_W; short old_length = length; length = 5; diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java index 70831a8d..091e7f88 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java @@ -39,9 +39,9 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio public PUSH(ConstantPoolGen cp, int value) { if ((value >= -1) && (value <= 5)) { instruction = InstructionConstants.getInstruction(Constants.ICONST_0 + value); - } else if ((value >= -128) && (value <= 127)) { + } else if (Instruction.isValidByte(value)) { instruction = new BIPUSH((byte) value); - } else if ((value >= -32768) && (value <= 32767)) { + } else if (Instruction.isValidShort(value)) { instruction = new SIPUSH((short) value); } else { instruction = new LDC(cp.addInteger(value)); -- GitLab From 11c4b2a5995d8d3816ea27bf0565761176c95479 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 14:01:44 +0000 Subject: [PATCH 0916/1313] No need for the variables to be package-protected git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696788 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/verifier/GraphicalVerifier.java | 6 +- .../bcel6/verifier/VerifierAppFrame.java | 83 +++++++++++-------- 2 files changed, 50 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java index 6ef81610..3e3801f2 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java @@ -30,7 +30,7 @@ import org.apache.commons.bcel6.generic.Type; */ public class GraphicalVerifier { - boolean packFrame = false; + private boolean packFrame = false; /** Constructor. */ @@ -55,9 +55,9 @@ public class GraphicalVerifier { frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2); frame.setVisible(true); - frame.classNamesJList.setModel(new VerifierFactoryListModel()); + frame.getClassNamesJList().setModel(new VerifierFactoryListModel()); VerifierFactory.getVerifier(Type.OBJECT.getClassName()); // Fill list with java.lang.Object - frame.classNamesJList.setSelectedIndex(0); // default, will verify java.lang.Object + frame.getClassNamesJList().setSelectedIndex(0); // default, will verify java.lang.Object } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java index 899b18ca..0fbe6a10 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java @@ -52,44 +52,45 @@ import org.apache.commons.bcel6.classfile.JavaClass; public class VerifierAppFrame extends JFrame { private static final long serialVersionUID = -542458133073307640L; - JPanel contentPane; - JSplitPane jSplitPane1 = new JSplitPane(); - JPanel jPanel1 = new JPanel(); - JPanel jPanel2 = new JPanel(); - JSplitPane jSplitPane2 = new JSplitPane(); - JPanel jPanel3 = new JPanel(); - JList classNamesJList = new JList<>(); - GridLayout gridLayout1 = new GridLayout(); - JPanel messagesPanel = new JPanel(); - GridLayout gridLayout2 = new GridLayout(); - JMenuBar jMenuBar1 = new JMenuBar(); - JMenu jMenu1 = new JMenu(); - JScrollPane jScrollPane1 = new JScrollPane(); - JScrollPane messagesScrollPane = new JScrollPane(); - JScrollPane jScrollPane3 = new JScrollPane(); - GridLayout gridLayout4 = new GridLayout(); - JScrollPane jScrollPane4 = new JScrollPane(); - CardLayout cardLayout1 = new CardLayout(); private static final String JUSTICE_VERSION = "JustIce by Enver Haase"; + + private JPanel contentPane; + private JSplitPane jSplitPane1 = new JSplitPane(); + private JPanel jPanel1 = new JPanel(); + private JPanel jPanel2 = new JPanel(); + private JSplitPane jSplitPane2 = new JSplitPane(); + private JPanel jPanel3 = new JPanel(); + private JList classNamesJList = new JList<>(); + private GridLayout gridLayout1 = new GridLayout(); + private JPanel messagesPanel = new JPanel(); + private GridLayout gridLayout2 = new GridLayout(); + private JMenuBar jMenuBar1 = new JMenuBar(); + private JMenu jMenu1 = new JMenu(); + private JScrollPane jScrollPane1 = new JScrollPane(); + private JScrollPane messagesScrollPane = new JScrollPane(); + private JScrollPane jScrollPane3 = new JScrollPane(); + private GridLayout gridLayout4 = new GridLayout(); + private JScrollPane jScrollPane4 = new JScrollPane(); + private CardLayout cardLayout1 = new CardLayout(); private String current_class; - GridLayout gridLayout3 = new GridLayout(); - JTextPane pass1TextPane = new JTextPane(); - JTextPane pass2TextPane = new JTextPane(); - JTextPane messagesTextPane = new JTextPane(); - JMenuItem newFileMenuItem = new JMenuItem(); - JSplitPane jSplitPane3 = new JSplitPane(); - JSplitPane jSplitPane4 = new JSplitPane(); - JScrollPane jScrollPane2 = new JScrollPane(); - JScrollPane jScrollPane5 = new JScrollPane(); - JScrollPane jScrollPane6 = new JScrollPane(); - JScrollPane jScrollPane7 = new JScrollPane(); - JList pass3aJList = new JList<>(); - JList pass3bJList = new JList<>(); - JTextPane pass3aTextPane = new JTextPane(); - JTextPane pass3bTextPane = new JTextPane(); - JMenu jMenu2 = new JMenu(); - JMenuItem whatisMenuItem = new JMenuItem(); - JMenuItem aboutMenuItem = new JMenuItem(); + private GridLayout gridLayout3 = new GridLayout(); + private JTextPane pass1TextPane = new JTextPane(); + private JTextPane pass2TextPane = new JTextPane(); + private JTextPane messagesTextPane = new JTextPane(); + private JMenuItem newFileMenuItem = new JMenuItem(); + private JSplitPane jSplitPane3 = new JSplitPane(); + private JSplitPane jSplitPane4 = new JSplitPane(); + private JScrollPane jScrollPane2 = new JScrollPane(); + private JScrollPane jScrollPane5 = new JScrollPane(); + private JScrollPane jScrollPane6 = new JScrollPane(); + private JScrollPane jScrollPane7 = new JScrollPane(); + private JList pass3aJList = new JList<>(); + private JList pass3bJList = new JList<>(); + private JTextPane pass3aTextPane = new JTextPane(); + private JTextPane pass3bTextPane = new JTextPane(); + private JMenu jMenu2 = new JMenu(); + private JMenuItem whatisMenuItem = new JMenuItem(); + private JMenuItem aboutMenuItem = new JMenuItem(); /** Constructor. */ @@ -403,4 +404,14 @@ public class VerifierAppFrame extends JFrame { "The upper four boxes to the right reflect verification passes according to The Java Virtual Machine Specification.\nThese are (in that order): Pass one, Pass two, Pass three (before data flow analysis), Pass three (data flow analysis).\nThe bottom box to the right shows (warning) messages; warnings do not cause a class to be rejected.", JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); } + + + /** + * @return the classNamesJList + */ + JList getClassNamesJList() { + return classNamesJList; + } + + } -- GitLab From 17e3b214be8b0ecb4275dea164e46f2c871bac70 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 14:07:49 +0000 Subject: [PATCH 0917/1313] Simplify git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696790 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/classfile/JavaClass.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 7803a942..899bb824 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -70,8 +70,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public static final byte HEAP = 1; public static final byte FILE = 2; public static final byte ZIP = 3; - static boolean debug = false; // Debugging on/off - final static char sep = File.separatorChar; // directory separator + private static final boolean debug = Boolean.getBoolean("JavaClass.debug");; // Debugging on/off private static BCELComparator _cmp = new BCELComparator() { @@ -479,12 +478,6 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl return superclass_name_index; } - static { - // Debugging ... on/off - debug = Boolean.getBoolean("JavaClass.debug"); - } - - /** * @param attributes . */ -- GitLab From fed8b01037420a601a86ed62be3adbcbb3f5fc9f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 14:17:13 +0000 Subject: [PATCH 0918/1313] Redundant import from same package git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696792 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/generic/ClassElementValueGen.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java index 5124ce7c..84a25250 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java @@ -23,9 +23,6 @@ import java.io.IOException; import org.apache.commons.bcel6.classfile.ClassElementValue; import org.apache.commons.bcel6.classfile.ConstantUtf8; import org.apache.commons.bcel6.classfile.ElementValue; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.ElementValueGen; -import org.apache.commons.bcel6.generic.ObjectType; /** * @since 6.0 -- GitLab From 03926a950e9784098a5cd66c88dfe3496fb99c3d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 14:34:36 +0000 Subject: [PATCH 0919/1313] Missing EOL git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696796 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/generic/NameSignatureInstruction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java index ccc22af5..bc77e70a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java @@ -60,4 +60,4 @@ public abstract class NameSignatureInstruction extends CPInstruction { return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); } -} \ No newline at end of file +} -- GitLab From 971dd42f850a1277224a612dc8cc343c2f224a47 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 14:42:04 +0000 Subject: [PATCH 0920/1313] Checksytle changes git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696799 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/Constants.java | 974 ++++++++++++------ .../commons/bcel6/ExceptionConstants.java | 10 +- .../bcel6/generic/AnnotationEntryGen.java | 4 +- .../bcel6/generic/InstructionConstants.java | 2 + .../apache/commons/bcel6/generic/Type.java | 2 - .../apache/commons/bcel6/util/Class2HTML.java | 2 +- .../apache/commons/bcel6/util/ClassPath.java | 2 +- .../commons/bcel6/util/InstructionFinder.java | 1 - .../bcel6/verifier/GraphicalVerifier.java | 2 +- 9 files changed, 645 insertions(+), 354 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Constants.java b/src/main/java/org/apache/commons/bcel6/Constants.java index 5b723d89..aa307ad9 100644 --- a/src/main/java/org/apache/commons/bcel6/Constants.java +++ b/src/main/java/org/apache/commons/bcel6/Constants.java @@ -22,270 +22,287 @@ package org.apache.commons.bcel6; * * @version $Id$ */ -public class Constants { +public final class Constants { /** Major version number of class files for Java 1.1. * @see #MINOR_1_1 * */ - public final static short MAJOR_1_1 = 45; + public static final short MAJOR_1_1 = 45; /** Minor version number of class files for Java 1.1. * @see #MAJOR_1_1 * */ - public final static short MINOR_1_1 = 3; + public static final short MINOR_1_1 = 3; /** Major version number of class files for Java 1.2. * @see #MINOR_1_2 * */ - public final static short MAJOR_1_2 = 46; + public static final short MAJOR_1_2 = 46; /** Minor version number of class files for Java 1.2. * @see #MAJOR_1_2 * */ - public final static short MINOR_1_2 = 0; + public static final short MINOR_1_2 = 0; /** Major version number of class files for Java 1.2. * @see #MINOR_1_2 * */ - public final static short MAJOR_1_3 = 47; + public static final short MAJOR_1_3 = 47; /** Minor version number of class files for Java 1.3. * @see #MAJOR_1_3 * */ - public final static short MINOR_1_3 = 0; + public static final short MINOR_1_3 = 0; /** Major version number of class files for Java 1.3. * @see #MINOR_1_3 * */ - public final static short MAJOR_1_4 = 48; + public static final short MAJOR_1_4 = 48; /** Minor version number of class files for Java 1.4. * @see #MAJOR_1_4 * */ - public final static short MINOR_1_4 = 0; + public static final short MINOR_1_4 = 0; /** Major version number of class files for Java 1.4. * @see #MINOR_1_4 * */ - public final static short MAJOR_1_5 = 49; + public static final short MAJOR_1_5 = 49; /** Minor version number of class files for Java 1.5. * @see #MAJOR_1_5 * */ - public final static short MINOR_1_5 = 0; + public static final short MINOR_1_5 = 0; /** Major version number of class files for Java 1.6. * @see #MINOR_1_6 * */ - public final static short MAJOR_1_6 = 50; + public static final short MAJOR_1_6 = 50; /** Minor version number of class files for Java 1.6. * @see #MAJOR_1_6 * */ - public final static short MINOR_1_6 = 0; + public static final short MINOR_1_6 = 0; /** Major version number of class files for Java 1.7. * @see #MINOR_1_7 * */ - public final static short MAJOR_1_7 = 51; + public static final short MAJOR_1_7 = 51; /** Minor version number of class files for Java 1.7. * @see #MAJOR_1_7 * */ - public final static short MINOR_1_7 = 0; + public static final short MINOR_1_7 = 0; /** Major version number of class files for Java 1.8. * @see #MINOR_1_8 * */ - public final static short MAJOR_1_8 = 52; + public static final short MAJOR_1_8 = 52; /** Minor version number of class files for Java 1.8. * @see #MAJOR_1_8 * */ - public final static short MINOR_1_8 = 0; + public static final short MINOR_1_8 = 0; /** Default major version number. Class file is for Java 1.1. * @see #MAJOR_1_1 * */ - public final static short MAJOR = MAJOR_1_1; + public static final short MAJOR = MAJOR_1_1; /** Default major version number. Class file is for Java 1.1. * @see #MAJOR_1_1 * */ - public final static short MINOR = MINOR_1_1; + public static final short MINOR = MINOR_1_1; /** Maximum value for an unsigned short. */ - public final static int MAX_SHORT = 65535; // 2^16 - 1 + public static final int MAX_SHORT = 65535; // 2^16 - 1 /** Maximum value for an unsigned byte. */ - public final static int MAX_BYTE = 255; // 2^8 - 1 + public static final int MAX_BYTE = 255; // 2^8 - 1 /** One of the access flags for fields, methods, or classes. - * @see "Flag definitions for Fields in the Java Virtual Machine Specification (Java SE 8 Edition)." - * @see "Flag definitions for Methods in the Java Virtual Machine Specification (Java SE 8 Edition)." - * @see "Flag definitions for Classes in the Java Virtual Machine Specification (Java SE 8 Edition)." + * @see + * Flag definitions for Fields in the Java Virtual Machine Specification (Java SE 8 Edition). + * @see + * Flag definitions for Methods in the Java Virtual Machine Specification (Java SE 8 Edition). + * @see + * Flag definitions for Classes in the Java Virtual Machine Specification (Java SE 8 Edition). */ - public final static short ACC_PUBLIC = 0x0001; + public static final short ACC_PUBLIC = 0x0001; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_PRIVATE = 0x0002; + public static final short ACC_PRIVATE = 0x0002; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_PROTECTED = 0x0004; + public static final short ACC_PROTECTED = 0x0004; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_STATIC = 0x0008; + public static final short ACC_STATIC = 0x0008; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_FINAL = 0x0010; + public static final short ACC_FINAL = 0x0010; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_SYNCHRONIZED = 0x0020; + public static final short ACC_SYNCHRONIZED = 0x0020; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_VOLATILE = 0x0040; + public static final short ACC_VOLATILE = 0x0040; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_BRIDGE = 0x0040; + public static final short ACC_BRIDGE = 0x0040; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_TRANSIENT = 0x0080; + public static final short ACC_TRANSIENT = 0x0080; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_VARARGS = 0x0080; + public static final short ACC_VARARGS = 0x0080; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_NATIVE = 0x0100; + public static final short ACC_NATIVE = 0x0100; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_INTERFACE = 0x0200; + public static final short ACC_INTERFACE = 0x0200; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_ABSTRACT = 0x0400; + public static final short ACC_ABSTRACT = 0x0400; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_STRICT = 0x0800; + public static final short ACC_STRICT = 0x0800; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_SYNTHETIC = 0x1000; + public static final short ACC_SYNTHETIC = 0x1000; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_ANNOTATION = 0x2000; + public static final short ACC_ANNOTATION = 0x2000; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_ENUM = 0x4000; + public static final short ACC_ENUM = 0x4000; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_MANDATED = (short) 0x8000; + public static final short ACC_MANDATED = (short) 0x8000; // Applies to classes compiled by new compilers only /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short ACC_SUPER = 0x0020; + public static final short ACC_SUPER = 0x0020; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public final static short MAX_ACC_FLAG = ACC_ENUM; + public static final short MAX_ACC_FLAG = ACC_ENUM; /** The names of the access flags. */ - public final static String[] ACCESS_NAMES = { + public static final String[] ACCESS_NAMES = { "public", "private", "protected", "static", "final", "synchronized", "volatile", "transient", "native", "interface", "abstract", "strictfp", "synthetic", "annotation", "enum" }; /** Marks a constant pool entry as type UTF-8. - * @see The Constant Pool in The Java Virtual Machine Specification */ - public final static byte CONSTANT_Utf8 = 1; + * @see + * The Constant Pool in The Java Virtual Machine Specification */ + public static final byte CONSTANT_Utf8 = 1; /** Marks a constant pool entry as type Integer. - * @see The Constant Pool in The Java Virtual Machine Specification */ - public final static byte CONSTANT_Integer = 3; + * @see + * The Constant Pool in The Java Virtual Machine Specification */ + public static final byte CONSTANT_Integer = 3; /** Marks a constant pool entry as type Float. - * @see The Constant Pool in The Java Virtual Machine Specification */ - public final static byte CONSTANT_Float = 4; + * @see + * The Constant Pool in The Java Virtual Machine Specification */ + public static final byte CONSTANT_Float = 4; /** Marks a constant pool entry as type Long. - * @see The Constant Pool in The Java Virtual Machine Specification */ - public final static byte CONSTANT_Long = 5; + * @see + * The Constant Pool in The Java Virtual Machine Specification */ + public static final byte CONSTANT_Long = 5; /** Marks a constant pool entry as type Double. - * @see The Constant Pool in The Java Virtual Machine Specification */ - public final static byte CONSTANT_Double = 6; + * @see + * The Constant Pool in The Java Virtual Machine Specification */ + public static final byte CONSTANT_Double = 6; /** Marks a constant pool entry as a Class - * @see The Constant Pool in The Java Virtual Machine Specification */ - public final static byte CONSTANT_Class = 7; + * @see + * The Constant Pool in The Java Virtual Machine Specification */ + public static final byte CONSTANT_Class = 7; /** Marks a constant pool entry as a Field Reference. - * @see The Constant Pool in The Java Virtual Machine Specification */ - public final static byte CONSTANT_Fieldref = 9; + * @see + * The Constant Pool in The Java Virtual Machine Specification */ + public static final byte CONSTANT_Fieldref = 9; /** Marks a constant pool entry as type String - * @see The Constant Pool in The Java Virtual Machine Specification */ - public final static byte CONSTANT_String = 8; + * @see + * The Constant Pool in The Java Virtual Machine Specification */ + public static final byte CONSTANT_String = 8; /** Marks a constant pool entry as a Method Reference. - * @see The Constant Pool in The Java Virtual Machine Specification */ - public final static byte CONSTANT_Methodref = 10; + * @see + * The Constant Pool in The Java Virtual Machine Specification */ + public static final byte CONSTANT_Methodref = 10; /** Marks a constant pool entry as an Interface Method Reference. - * @see The Constant Pool in The Java Virtual Machine Specification */ - public final static byte CONSTANT_InterfaceMethodref = 11; + * @see + * The Constant Pool in The Java Virtual Machine Specification */ + public static final byte CONSTANT_InterfaceMethodref = 11; /** Marks a constant pool entry as a name and type. - * @see The Constant Pool in The Java Virtual Machine Specification */ - public final static byte CONSTANT_NameAndType = 12; + * @see + * The Constant Pool in The Java Virtual Machine Specification */ + public static final byte CONSTANT_NameAndType = 12; /** Marks a constant pool entry as a Method Handle. - * @see The Constant Pool in The Java Virtual Machine Specification */ + * @see + * The Constant Pool in The Java Virtual Machine Specification */ public static final byte CONSTANT_MethodHandle = 15; /** Marks a constant pool entry as a Method Type. - * @see The Constant Pool in The Java Virtual Machine Specification */ + * @see + * The Constant Pool in The Java Virtual Machine Specification */ public static final byte CONSTANT_MethodType = 16; /** Marks a constant pool entry as an Invoke Dynamic - * @see The Constant Pool in The Java Virtual Machine Specification */ + * @see + * The Constant Pool in The Java Virtual Machine Specification */ public static final byte CONSTANT_InvokeDynamic = 18; /** The names of the types of entries in a constant pool. */ @@ -301,757 +318,1018 @@ public class Constants { * initialization method" or "interface initialization * method". This is "<clinit>". */ - public final static String STATIC_INITIALIZER_NAME = ""; + public static final String STATIC_INITIALIZER_NAME = ""; /** The name of every constructor method in a class, also called * "instance initialization method". This is "<init>". */ - public final static String CONSTRUCTOR_NAME = ""; + public static final String CONSTRUCTOR_NAME = ""; /** The names of the interfaces implemented by arrays */ - public final static String[] INTERFACES_IMPLEMENTED_BY_ARRAYS = {"java.lang.Cloneable", "java.io.Serializable"}; + public static final String[] INTERFACES_IMPLEMENTED_BY_ARRAYS = {"java.lang.Cloneable", "java.io.Serializable"}; /** * One of the limitations of the Java Virtual Machine. - * @see The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. + * @see + * The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. */ public static final int MAX_CP_ENTRIES = 65535; /** * One of the limitations of the Java Virtual Machine. - * @see The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. + * @see + * The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. */ public static final int MAX_CODE_SIZE = 65536; //bytes /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short NOP = 0; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ACONST_NULL = 1; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_M1 = 2; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_0 = 3; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_1 = 4; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_2 = 5; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_3 = 6; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_4 = 7; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_5 = 8; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LCONST_0 = 9; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LCONST_1 = 10; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_0 = 11; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_1 = 12; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_2 = 13; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DCONST_0 = 14; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DCONST_1 = 15; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short BIPUSH = 16; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short SIPUSH = 17; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC = 18; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC_W = 19; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC2_W = 20; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD = 21; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD = 22; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD = 23; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD = 24; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD = 25; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_0 = 26; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_1 = 27; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_2 = 28; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_3 = 29; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_0 = 30; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_1 = 31; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_2 = 32; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_3 = 33; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_0 = 34; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_1 = 35; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_2 = 36; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_3 = 37; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_0 = 38; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_1 = 39; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_2 = 40; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_3 = 41; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_0 = 42; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_1 = 43; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_2 = 44; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_3 = 45; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IALOAD = 46; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LALOAD = 47; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FALOAD = 48; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DALOAD = 49; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short AALOAD = 50; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short BALOAD = 51; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short CALOAD = 52; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short SALOAD = 53; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE = 54; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE = 55; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE = 56; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE = 57; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE = 58; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_0 = 59; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_1 = 60; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_2 = 61; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_3 = 62; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_0 = 63; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_1 = 64; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_2 = 65; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_3 = 66; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_0 = 67; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_1 = 68; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_2 = 69; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_3 = 70; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_0 = 71; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_1 = 72; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_2 = 73; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_3 = 74; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_0 = 75; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_1 = 76; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_2 = 77; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_3 = 78; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IASTORE = 79; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LASTORE = 80; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FASTORE = 81; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DASTORE = 82; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short AASTORE = 83; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short BASTORE = 84; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short CASTORE = 85; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short SASTORE = 86; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short POP = 87; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short POP2 = 88; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP = 89; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP_X1 = 90; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP_X2 = 91; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2 = 92; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2_X1 = 93; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2_X2 = 94; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short SWAP = 95; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IADD = 96; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LADD = 97; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FADD = 98; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DADD = 99; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISUB = 100; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSUB = 101; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FSUB = 102; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DSUB = 103; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IMUL = 104; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LMUL = 105; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FMUL = 106; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DMUL = 107; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IDIV = 108; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LDIV = 109; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FDIV = 110; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DDIV = 111; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IREM = 112; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LREM = 113; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FREM = 114; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DREM = 115; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short INEG = 116; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LNEG = 117; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FNEG = 118; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DNEG = 119; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISHL = 120; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSHL = 121; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISHR = 122; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSHR = 123; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IUSHR = 124; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LUSHR = 125; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IAND = 126; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LAND = 127; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IOR = 128; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LOR = 129; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IXOR = 130; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LXOR = 131; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IINC = 132; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short I2L = 133; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short I2F = 134; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short I2D = 135; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short L2I = 136; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short L2F = 137; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short L2D = 138; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short F2I = 139; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short F2L = 140; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short F2D = 141; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short D2I = 142; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short D2L = 143; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short D2F = 144; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short I2B = 145; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short INT2BYTE = 145; // Old notation /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short I2C = 146; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short INT2CHAR = 146; // Old notation /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short I2S = 147; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short INT2SHORT = 147; // Old notation /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LCMP = 148; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FCMPL = 149; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FCMPG = 150; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DCMPL = 151; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DCMPG = 152; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFEQ = 153; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNE = 154; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFLT = 155; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFGE = 156; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFGT = 157; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFLE = 158; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPEQ = 159; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPNE = 160; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPLT = 161; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPGE = 162; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPGT = 163; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPLE = 164; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ACMPEQ = 165; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ACMPNE = 166; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short GOTO = 167; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short JSR = 168; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short RET = 169; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short TABLESWITCH = 170; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LOOKUPSWITCH = 171; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IRETURN = 172; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short LRETURN = 173; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short FRETURN = 174; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short DRETURN = 175; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ARETURN = 176; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short RETURN = 177; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short GETSTATIC = 178; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short PUTSTATIC = 179; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short GETFIELD = 180; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short PUTFIELD = 181; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEVIRTUAL = 182; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKESPECIAL = 183; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKENONVIRTUAL = 183; // Old name in JDK 1.0 /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKESTATIC = 184; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEINTERFACE = 185; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEDYNAMIC = 186; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short NEW = 187; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short NEWARRAY = 188; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ANEWARRAY = 189; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ARRAYLENGTH = 190; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ATHROW = 191; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short CHECKCAST = 192; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short INSTANCEOF = 193; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short MONITORENTER = 194; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short MONITOREXIT = 195; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short WIDE = 196; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short MULTIANEWARRAY = 197; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNULL = 198; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNONNULL = 199; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short GOTO_W = 200; /** Java VM opcode. - * @see Opcode definitions in The Java Virtual Machine Specification */ + * @see + * Opcode definitions in The Java Virtual Machine Specification */ public static final short JSR_W = 201; /** JVM internal opcode. - * @see Reserved opcodes in the Java Virtual Machine Specification */ + * @see + * Reserved opcodes in the Java Virtual Machine Specification */ public static final short BREAKPOINT = 202; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short LDC_QUICK = 203; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short LDC_W_QUICK = 204; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short LDC2_W_QUICK = 205; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETFIELD_QUICK = 206; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTFIELD_QUICK = 207; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETFIELD2_QUICK = 208; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTFIELD2_QUICK = 209; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETSTATIC_QUICK = 210; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTSTATIC_QUICK = 211; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETSTATIC2_QUICK = 212; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTSTATIC2_QUICK = 213; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEVIRTUAL_QUICK = 214; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKENONVIRTUAL_QUICK = 215; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKESUPER_QUICK = 216; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKESTATIC_QUICK = 217; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEINTERFACE_QUICK = 218; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEVIRTUALOBJECT_QUICK = 219; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short NEW_QUICK = 221; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short ANEWARRAY_QUICK = 222; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short MULTIANEWARRAY_QUICK = 223; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short CHECKCAST_QUICK = 224; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INSTANCEOF_QUICK = 225; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEVIRTUAL_QUICK_W = 226; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETFIELD_QUICK_W = 227; /** JVM internal opcode. - * @see Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) - * @see Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ + * @see + * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) + * @see + * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTFIELD_QUICK_W = 228; /** JVM internal opcode. - * @see Reserved opcodes in the Java Virtual Machine Specification */ + * @see + * Reserved opcodes in the Java Virtual Machine Specification */ public static final short IMPDEP1 = 254; /** JVM internal opcode. - * @see Reserved opcodes in the Java Virtual Machine Specification */ + * @see + * Reserved opcodes in the Java Virtual Machine Specification */ public static final short IMPDEP2 = 255; /** @@ -1077,28 +1355,36 @@ public class Constants { public static final String ILLEGAL_TYPE = ""; /** Boolean data type. - * @see Static Constraints in the Java Virtual Machine Specification */ + * @see + * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_BOOLEAN = 4; /** Char data type. - * @see Static Constraints in the Java Virtual Machine Specification */ + * @see + * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_CHAR = 5; /** Float data type. - * @see Static Constraints in the Java Virtual Machine Specification */ + * @see + * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_FLOAT = 6; /** Double data type. - * @see Static Constraints in the Java Virtual Machine Specification */ + * @see + * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_DOUBLE = 7; /** Byte data type. - * @see Static Constraints in the Java Virtual Machine Specification */ + * @see + * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_BYTE = 8; /** Short data type. - * @see Static Constraints in the Java Virtual Machine Specification */ + * @see + * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_SHORT = 9; /** Int data type. - * @see Static Constraints in the Java Virtual Machine Specification */ + * @see + * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_INT = 10; /** Long data type. - * @see Static Constraints in the Java Virtual Machine Specification */ + * @see + * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_LONG = 11; /** Void data type (non-standard). */ @@ -1250,7 +1536,7 @@ public class Constants { {}/*lor*/, {}/*ixor*/, {}/*lxor*/, {T_BYTE, T_BYTE}/*iinc*/, {}/*i2l*/, {}/*i2f*/, {}/*i2d*/, {}/*l2i*/, {}/*l2f*/, {}/*l2d*/, {}/*f2i*/, {}/*f2l*/, {}/*f2d*/, {}/*d2i*/, {}/*d2l*/, {}/*d2f*/, - {}/*i2b*/, {}/*i2c*/,{}/*i2s*/, {}/*lcmp*/, {}/*fcmpl*/, + {}/*i2b*/, {}/*i2c*/, {}/*i2s*/, {}/*lcmp*/, {}/*fcmpl*/, {}/*fcmpg*/, {}/*dcmpl*/, {}/*dcmpg*/, {T_SHORT}/*ifeq*/, {T_SHORT}/*ifne*/, {T_SHORT}/*iflt*/, {T_SHORT}/*ifge*/, {T_SHORT}/*ifgt*/, {T_SHORT}/*ifle*/, {T_SHORT}/*if_icmpeq*/, @@ -1538,4 +1824,6 @@ public class Constants { "", "getField", "getStatic", "putField", "putStatic", "invokeVirtual", "invokeStatic", "invokeSpecial", "newInvokeSpecial", "invokeInterface" }; + private Constants() { } // not instantiable + } diff --git a/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java b/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java index 50961c33..541eeda7 100644 --- a/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java @@ -22,7 +22,7 @@ package org.apache.commons.bcel6; * * @version $Id$ */ -public class ExceptionConstants { +public final class ExceptionConstants { /** The mother of all exceptions */ @@ -52,7 +52,8 @@ public class ExceptionConstants { /** Run-Time Exceptions */ public static final Class NULL_POINTER_EXCEPTION = NullPointerException.class; - public static final Class ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION = ArrayIndexOutOfBoundsException.class; + public static final Class ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION + = ArrayIndexOutOfBoundsException.class; public static final Class ARITHMETIC_EXCEPTION = ArithmeticException.class; public static final Class NEGATIVE_ARRAY_SIZE_EXCEPTION = NegativeArraySizeException.class; public static final Class CLASS_CAST_EXCEPTION = ClassCastException.class; @@ -88,10 +89,12 @@ public class ExceptionConstants { EXCS_ARRAY_EXCEPTION, }; + private ExceptionConstants() { } // not instantiable + // helper method to merge exception class arrays private static Class[] mergeExceptions(Class[] input, Class ... extraClasses) { int extraLen = extraClasses == null ? 0 : extraClasses.length; - Class excs[] = new Class[input.length + extraLen]; + Class[] excs = new Class[input.length + extraLen]; System.arraycopy(input, 0, excs, 0, input.length); if (extraLen > 0) { System.arraycopy(extraClasses, 0, excs, input.length, extraLen); @@ -121,4 +124,5 @@ public class ExceptionConstants { throw new AssertionError("Cannot happen; unexpected enum value: " + type); } } + } diff --git a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java index 2af12d53..b6049ea3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java @@ -274,9 +274,9 @@ public class AnnotationEntryGen { static Attribute[] getParameterAnnotationAttributes( ConstantPoolGen cp, List[] /*Array of lists, array size depends on #params */vec) { - int visCount[] = new int[vec.length]; + int[] visCount = new int[vec.length]; int totalVisCount = 0; - int invisCount[] = new int[vec.length]; + int[] invisCount = new int[vec.length]; int totalInvisCount = 0; try { for (int i = 0; i < vec.length; i++) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java index f529ab2a..f64774a1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java @@ -277,6 +277,8 @@ public class InstructionConstants { INSTRUCTIONS[Constants.MONITOREXIT] = MONITOREXIT; } + private InstructionConstants() { } // non-instantiable + /** * Gets the Instruction. * @param index the index, e.g. {@link Constants#RETURN} diff --git a/src/main/java/org/apache/commons/bcel6/generic/Type.java b/src/main/java/org/apache/commons/bcel6/generic/Type.java index 709a6194..3cf27d86 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Type.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Type.java @@ -23,8 +23,6 @@ import java.util.List; import org.apache.commons.bcel6.Constants; import org.apache.commons.bcel6.classfile.ClassFormatException; import org.apache.commons.bcel6.classfile.Utility; -import org.apache.commons.bcel6.verifier.structurals.LocalVariables; -import org.apache.commons.bcel6.verifier.structurals.OperandStack; /** * Abstract super class for all possible java types, namely basic types diff --git a/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java b/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java index 72949361..4229fef3 100644 --- a/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java @@ -95,7 +95,7 @@ public class Class2HTML { } - public static void main( String argv[] ) { + public static void main( String[] argv ) { String[] file_name = new String[argv.length]; int files = 0; ClassParser parser = null; diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index 57822e41..02533ed0 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -348,7 +348,7 @@ public class ClassPath { return getClassFile(name, suffix).getPath(); } - private static abstract class PathEntry { + private abstract static class PathEntry { abstract ClassFile getClassFile( String name, String suffix ) throws IOException; abstract URL getResource(String name); diff --git a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java index e8f15c4e..e7f0435c 100644 --- a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java +++ b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java @@ -28,7 +28,6 @@ import java.util.regex.Pattern; import org.apache.commons.bcel6.Constants; import org.apache.commons.bcel6.generic.ClassGenException; -import org.apache.commons.bcel6.generic.Instruction; import org.apache.commons.bcel6.generic.InstructionHandle; import org.apache.commons.bcel6.generic.InstructionList; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java index 3e3801f2..b43967e6 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java @@ -34,7 +34,7 @@ public class GraphicalVerifier { /** Constructor. */ - public GraphicalVerifier() { + private GraphicalVerifier() { VerifierAppFrame frame = new VerifierAppFrame(); //Frames �berpr�fen, die voreingestellte Gr��e haben //Frames packen, die nutzbare bevorzugte Gr��eninformationen enthalten, z.B. aus ihrem Layout -- GitLab From 6a8a186d056fa583e0a5eee0cf5ac9f9b333c966 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 14:42:36 +0000 Subject: [PATCH 0921/1313] Allow Checkstyle to be run by the CLI git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696800 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index 123cf02b..984f31c6 100644 --- a/pom.xml +++ b/pom.xml @@ -237,6 +237,18 @@ + + org.apache.maven.plugins + maven-checkstyle-plugin + + 2.9.1 + + ${basedir}/checkstyle.xml + false + + -- GitLab From 5e964aebcc5eb6b6809955fa3b09df55b6df8fa8 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 14:43:27 +0000 Subject: [PATCH 0922/1313] Temporarily quieten checkstyle git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696801 13f79535-47bb-0310-9956-ffa450edef68 --- checkstyle.xml | 57 +++++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/checkstyle.xml b/checkstyle.xml index 5c56678c..f27f9443 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -28,11 +28,6 @@ limitations under the License. - - - - - @@ -59,22 +54,30 @@ limitations under the License. + + - + + @@ -85,24 +88,31 @@ limitations under the License. + + - + + - - + + + + + @@ -133,12 +143,14 @@ limitations under the License. - - + + - - - + + + + + @@ -147,12 +159,13 @@ limitations under the License. + - + -- GitLab From 8b641fa744d629533891f1c01562e62020a39994 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 15:04:30 +0000 Subject: [PATCH 0923/1313] Impossible exceptions git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696804 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/generic/MethodGen.java | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 27de61db..20205753 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -423,12 +423,9 @@ public class MethodGen extends FieldGenOrMethodGen { public LineNumberTable getLineNumberTable( ConstantPoolGen cp ) { int size = line_number_vec.size(); LineNumber[] ln = new LineNumber[size]; - try { - for (int i = 0; i < size; i++) { - ln[i] = line_number_vec.get(i).getLineNumber(); - } - } catch (ArrayIndexOutOfBoundsException e) { - } // Never occurs + for (int i = 0; i < size; i++) { + ln[i] = line_number_vec.get(i).getLineNumber(); + } return new LineNumberTable(cp.addUtf8("LineNumberTable"), 2 + ln.length * 4, ln, cp .getConstantPool()); } @@ -488,12 +485,9 @@ public class MethodGen extends FieldGenOrMethodGen { private CodeException[] getCodeExceptions() { int size = exception_vec.size(); CodeException[] c_exc = new CodeException[size]; - try { - for (int i = 0; i < size; i++) { - CodeExceptionGen c = exception_vec.get(i); - c_exc[i] = c.getCodeException(cp); - } - } catch (ArrayIndexOutOfBoundsException e) { + for (int i = 0; i < size; i++) { + CodeExceptionGen c = exception_vec.get(i); + c_exc[i] = c.getCodeException(cp); } return c_exc; } @@ -541,11 +535,8 @@ public class MethodGen extends FieldGenOrMethodGen { private ExceptionTable getExceptionTable( ConstantPoolGen cp ) { int size = throws_vec.size(); int[] ex = new int[size]; - try { - for (int i = 0; i < size; i++) { - ex[i] = cp.addClass(throws_vec.get(i)); - } - } catch (ArrayIndexOutOfBoundsException e) { + for (int i = 0; i < size; i++) { + ex[i] = cp.addClass(throws_vec.get(i)); } return new ExceptionTable(cp.addUtf8("Exceptions"), 2 + 2 * size, ex, cp.getConstantPool()); } -- GitLab From 8ddf59ca30fa3b52310fec6ffddb3e22d5c33be6 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 15:05:08 +0000 Subject: [PATCH 0924/1313] Use blocks git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696805 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/util/BCELifier.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java index 5c4bcbb7..592d0255 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java @@ -206,10 +206,11 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { } else if ((pow == Constants.ACC_TRANSIENT) && (reason == FLAG_FOR_METHOD)) { buf.append("ACC_VARARGS | "); } else { - if (i < Constants.ACCESS_NAMES.length) + if (i < Constants.ACCESS_NAMES.length) { buf.append("ACC_").append(Constants.ACCESS_NAMES[i].toUpperCase(Locale.ENGLISH)).append( " | "); - else + } else { buf.append(String.format ("ACC_BIT %x | ", pow)); + } } } pow <<= 1; -- GitLab From 83f5a442a362b9475f416c381f777fe221a95756 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 15:06:07 +0000 Subject: [PATCH 0925/1313] Checkstyle git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696806 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/classfile/BootstrapMethod.java | 1 + .../org/apache/commons/bcel6/classfile/CodeException.java | 1 + .../java/org/apache/commons/bcel6/classfile/Constant.java | 1 + .../org/apache/commons/bcel6/classfile/ConstantPool.java | 1 + .../org/apache/commons/bcel6/classfile/FieldOrMethod.java | 4 +++- .../org/apache/commons/bcel6/classfile/InnerClass.java | 1 + .../org/apache/commons/bcel6/classfile/JavaClass.java | 1 + .../org/apache/commons/bcel6/classfile/LineNumber.java | 1 + .../org/apache/commons/bcel6/classfile/LocalVariable.java | 1 + .../apache/commons/bcel6/classfile/MethodParameter.java | 1 + .../org/apache/commons/bcel6/classfile/StackMapEntry.java | 1 + .../commons/bcel6/classfile/StackMapTableEntry.java | 1 + .../org/apache/commons/bcel6/classfile/StackMapType.java | 1 + .../commons/bcel6/verifier/statics/Pass2Verifier.java | 8 ++++---- 14 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java index ea95cd5a..89d653b5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java @@ -162,6 +162,7 @@ public class BootstrapMethod implements Cloneable { try { return (BootstrapMethod) clone(); } catch (CloneNotSupportedException e) { + // TODO should this throw? } return null; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java index 43d1a4af..ae146f6a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java @@ -210,6 +210,7 @@ public final class CodeException implements Cloneable, Node { try { return (CodeException) clone(); } catch (CloneNotSupportedException e) { + // TODO should this throw? } return null; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java index cd5d61d5..1e9254dd 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java @@ -104,6 +104,7 @@ public abstract class Constant implements Cloneable, Node { try { return (Constant) super.clone(); } catch (CloneNotSupportedException e) { + // TODO should this throw? } return null; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java index bb9728e6..6b76c256 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java @@ -365,6 +365,7 @@ public class ConstantPool implements Cloneable, Node { } } } catch (CloneNotSupportedException e) { + // TODO should this throw? } return c; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index b54c7a1c..20cee0e2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -198,7 +198,9 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No try { c = (FieldOrMethod)clone(); - } catch(CloneNotSupportedException e) {} + } catch(CloneNotSupportedException e) { + // ignored, but will cause NPE ... + } c.constant_pool = constant_pool; c.attributes = new Attribute[attributes.length]; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java index 88fe3f19..4b9225f8 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java @@ -209,6 +209,7 @@ public final class InnerClass implements Cloneable, Node { try { return (InnerClass) clone(); } catch (CloneNotSupportedException e) { + // TODO should this throw? } return null; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 899bb824..e1bd6443 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -680,6 +680,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl c.attributes[i] = attributes[i].copy(c.constant_pool); } } catch (CloneNotSupportedException e) { + // TODO should this throw? } return c; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java index 6a032623..3a75b6e2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java @@ -141,6 +141,7 @@ public final class LineNumber implements Cloneable, Node { try { return (LineNumber) clone(); } catch (CloneNotSupportedException e) { + // TODO should this throw? } return null; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java index d1b50b25..26e449f6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java @@ -253,6 +253,7 @@ public final class LocalVariable implements Cloneable, Node { try { return (LocalVariable) clone(); } catch (CloneNotSupportedException e) { + // TODO should this throw? } return null; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java index abaf2b2d..38feee46 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java @@ -108,6 +108,7 @@ public class MethodParameter implements Cloneable { try { return (MethodParameter) clone(); } catch (CloneNotSupportedException e) { + // TODO should this throw? } return null; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index b1f2c6c7..a5208641 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -171,6 +171,7 @@ public final class StackMapEntry implements Cloneable try { return (StackMapEntry) clone(); } catch (CloneNotSupportedException e) { + // TODO should this throw? } return null; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java index a565062d..c0d920ca 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java @@ -240,6 +240,7 @@ public final class StackMapTableEntry implements Cloneable { try { return (StackMapTableEntry) clone(); } catch (CloneNotSupportedException e) { + // TODO should this throw? } return null; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java index 0bd4ed76..24a8e233 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java @@ -144,6 +144,7 @@ public final class StackMapType implements Cloneable { try { return (StackMapType) clone(); } catch (CloneNotSupportedException e) { + // TODO should this throw? } return null; } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java index 9588fc2f..2b686950 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java @@ -307,7 +307,7 @@ public final class Pass2Verifier extends PassVerifier { * * @see #constant_pool_entries_satisfy_static_constraints() */ - private class CPESSC_Visitor extends org.apache.commons.bcel6.classfile.EmptyVisitor{ + private final class CPESSC_Visitor extends org.apache.commons.bcel6.classfile.EmptyVisitor{ private final Class CONST_Class; /* private Class CONST_Fieldref; @@ -386,7 +386,7 @@ public final class Pass2Verifier extends PassVerifier { } if (att instanceof SourceFile) { - if (foundSourceFile == false) { + if (!foundSourceFile) { foundSourceFile = true; } else { throw new ClassConstraintException("A ClassFile structure (like '" + tostring(obj) + "') may have no more than one SourceFile attribute."); //vmspec2 4.7.7 @@ -394,7 +394,7 @@ public final class Pass2Verifier extends PassVerifier { } if (att instanceof InnerClasses) { - if (foundInnerClasses == false) { + if (!foundInnerClasses) { foundInnerClasses = true; } else { if (hasInnerClass) { @@ -1202,7 +1202,7 @@ public final class Pass2Verifier extends PassVerifier { * @see #constant_pool_entries_satisfy_static_constraints() * @see org.apache.commons.bcel6.classfile.ConstantCP */ - private class FAMRAV_Visitor extends EmptyVisitor{ + private final class FAMRAV_Visitor extends EmptyVisitor{ private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work. private FAMRAV_Visitor(JavaClass _jc){ cp = _jc.getConstantPool(); -- GitLab From 52a5f3b2cb2e59a29cdf36fe45a151e11752b15d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 16:02:02 +0000 Subject: [PATCH 0926/1313] Simplify git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696811 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/util/ClassPath.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index 02533ed0..b5e03cf7 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -188,15 +188,11 @@ public class ClassPath { * @return input stream for file on class path */ public InputStream getInputStream( String name, String suffix ) throws IOException { - InputStream is = null; try { - is = getClass().getClassLoader().getResourceAsStream(name + suffix); + return getClass().getClassLoader().getResourceAsStream(name + suffix); } catch (Exception e) { + return getClassFile(name, suffix).getInputStream(); } - if (is != null) { - return is; - } - return getClassFile(name, suffix).getInputStream(); } /** -- GitLab From ad6db2e4f4aea9f00b38570a65c6d2a93fbd65a6 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 16:03:18 +0000 Subject: [PATCH 0927/1313] Checkstyle git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696813 13f79535-47bb-0310-9956-ffa450edef68 --- checkstyle.xml | 11 ++++-- .../apache/commons/bcel6/util/Class2HTML.java | 39 +++++++++---------- .../bcel6/util/SyntheticRepository.java | 1 + .../structurals/ExecutionVisitor.java | 2 + .../structurals/InstConstraintVisitor.java | 2 + .../verifier/structurals/Subroutines.java | 10 +++-- 6 files changed, 37 insertions(+), 28 deletions(-) diff --git a/checkstyle.xml b/checkstyle.xml index f27f9443..f334aea8 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -79,7 +79,7 @@ limitations under the License. --> - + @@ -154,8 +154,8 @@ limitations under the License. - - + + @@ -168,7 +168,12 @@ limitations under the License. + + + + + diff --git a/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java b/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java index 4229fef3..d437933e 100644 --- a/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java @@ -179,28 +179,25 @@ public class Class2HTML { static String toHTML( String str ) { StringBuilder buf = new StringBuilder(); - try { // Filter any characters HTML doesn't like such as < and > in particular - for (int i = 0; i < str.length(); i++) { - char ch; - switch (ch = str.charAt(i)) { - case '<': - buf.append("<"); - break; - case '>': - buf.append(">"); - break; - case '\n': - buf.append("\\n"); - break; - case '\r': - buf.append("\\r"); - break; - default: - buf.append(ch); - } + for (int i = 0; i < str.length(); i++) { + char ch; + switch (ch = str.charAt(i)) { + case '<': + buf.append("<"); + break; + case '>': + buf.append(">"); + break; + case '\n': + buf.append("\\n"); + break; + case '\r': + buf.append("\\r"); + break; + default: + buf.append(ch); } - } catch (StringIndexOutOfBoundsException e) { - } // Never occurs + } return buf.toString(); } diff --git a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java index 04a0da9e..08bd2a6b 100644 --- a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java @@ -187,6 +187,7 @@ public class SyntheticRepository implements Repository { try { is.close(); } catch (IOException e) { + // ignored } } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java index 4e8ea05b..306ac5ed 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java @@ -26,7 +26,9 @@ import org.apache.commons.bcel6.classfile.ConstantFloat; import org.apache.commons.bcel6.classfile.ConstantInteger; import org.apache.commons.bcel6.classfile.ConstantLong; import org.apache.commons.bcel6.classfile.ConstantString; +// CHECKSTYLE:OFF (there are lots of references!) import org.apache.commons.bcel6.generic.*; +//CHECKSTYLE:ON /** * This Visitor class may be used for a type-based Java Virtual Machine diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java index c01f0d3e..c537c5f7 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java @@ -30,7 +30,9 @@ import org.apache.commons.bcel6.classfile.ConstantLong; import org.apache.commons.bcel6.classfile.ConstantString; import org.apache.commons.bcel6.classfile.Field; import org.apache.commons.bcel6.classfile.JavaClass; +//CHECKSTYLE:OFF (there are lots of references!) import org.apache.commons.bcel6.generic.*; +//CHECKSTYLE:ON import org.apache.commons.bcel6.verifier.VerificationResult; import org.apache.commons.bcel6.verifier.Verifier; import org.apache.commons.bcel6.verifier.VerifierFactory; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java index 202a8043..c075e9e7 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java @@ -165,7 +165,7 @@ public class Subroutines{ */ @Override public InstructionHandle[] getEnteringJsrInstructions(){ - if (this == TOPLEVEL) { + if (this == getTopLevel()) { throw new AssertionViolatedException("getLeavingRET() called on top level pseudo-subroutine."); } InstructionHandle[] jsrs = new InstructionHandle[theJSRs.size()]; @@ -196,7 +196,7 @@ public class Subroutines{ */ @Override public InstructionHandle getLeavingRET(){ - if (this == TOPLEVEL) { + if (this == getTopLevel()) { throw new AssertionViolatedException("getLeavingRET() called on top level pseudo-subroutine."); } return theRET; @@ -264,7 +264,7 @@ public class Subroutines{ public int[] getAccessedLocalsIndices(){ //TODO: Implement caching. Set acc = new HashSet<>(); - if (theRET == null && this != TOPLEVEL){ + if (theRET == null && this != getTopLevel()){ throw new AssertionViolatedException("This subroutine object must be built up completely before calculating accessed locals."); } { @@ -359,7 +359,9 @@ public class Subroutines{ * it to distinguish between top level instructions and * unreachable instructions. */ - public final Subroutine TOPLEVEL; + // CHECKSTYLE:OFF + public final Subroutine TOPLEVEL; // TODO can this be made private? + // CHECKSTYLE:ON /** * Constructor. -- GitLab From 981e15beec40c79f889458f71f5c7b85e901d337 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 16:05:28 +0000 Subject: [PATCH 0928/1313] Suppress last checkstyle errors git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696814 13f79535-47bb-0310-9956-ffa450edef68 --- checkstyle.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/checkstyle.xml b/checkstyle.xml index f334aea8..936c3fe3 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -141,7 +141,7 @@ limitations under the License. - + -- GitLab From 13f1429b7b8d0e70443a812aa58d8f30b3a3e632 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 17:19:27 +0000 Subject: [PATCH 0929/1313] Revert r1696811 - causes several test failures Not yet obvious why. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696824 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/util/ClassPath.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index b5e03cf7..02533ed0 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -188,11 +188,15 @@ public class ClassPath { * @return input stream for file on class path */ public InputStream getInputStream( String name, String suffix ) throws IOException { + InputStream is = null; try { - return getClass().getClassLoader().getResourceAsStream(name + suffix); + is = getClass().getClassLoader().getResourceAsStream(name + suffix); } catch (Exception e) { - return getClassFile(name, suffix).getInputStream(); } + if (is != null) { + return is; + } + return getClassFile(name, suffix).getInputStream(); } /** -- GitLab From 2bd3923344f68f8b2dd0b1fc137869fe5a3a7e3d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 17:25:34 +0000 Subject: [PATCH 0930/1313] Doh! obvious now git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696825 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/util/ClassPath.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index 02533ed0..5bad8e6c 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -190,8 +190,9 @@ public class ClassPath { public InputStream getInputStream( String name, String suffix ) throws IOException { InputStream is = null; try { - is = getClass().getClassLoader().getResourceAsStream(name + suffix); + is = getClass().getClassLoader().getResourceAsStream(name + suffix); // may return null } catch (Exception e) { + // ignored } if (is != null) { return is; -- GitLab From a804f4dd8a05c3d7252f6491215b0155bba59660 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 17:26:40 +0000 Subject: [PATCH 0931/1313] Checkstyle git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696826 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/classfile/ClassParser.java | 6 ++++-- .../org/apache/commons/bcel6/classfile/Field.java | 5 ++++- .../apache/commons/bcel6/classfile/InnerClass.java | 7 ++++--- .../apache/commons/bcel6/classfile/JavaClass.java | 3 ++- .../commons/bcel6/classfile/LineNumberTable.java | 3 ++- .../commons/bcel6/classfile/LocalVariable.java | 3 ++- .../org/apache/commons/bcel6/classfile/Method.java | 13 +++++-------- .../apache/commons/bcel6/classfile/PMGClass.java | 3 ++- 8 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java b/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java index ce210d12..e4da1945 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java @@ -47,8 +47,10 @@ public final class ClassParser { private final boolean fileOwned; private final String file_name; private String zip_file; - private int class_name_index, superclass_name_index; - private int major, minor; // Compiler version + private int class_name_index; + private int superclass_name_index; + private int major; // Compiler version + private int minor; // Compiler version private int access_flags; // Access rights of parsed class private int[] interfaces; // Names of implemented interfaces private ConstantPool constant_pool; // collection of constants diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Field.java b/src/main/java/org/apache/commons/bcel6/classfile/Field.java index 1413951c..cc463886 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Field.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Field.java @@ -117,7 +117,10 @@ public final class Field extends FieldOrMethod { */ @Override public final String toString() { - String name, signature, access; // Short cuts to constant pool + String name; + String signature; + String access; // Short cuts to constant pool + // Get names from constant pool access = Utility.accessToString(super.getAccessFlags()); access = access.equals("") ? "" : (access + " "); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java index 4b9225f8..94fab3bc 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java @@ -179,8 +179,9 @@ public final class InnerClass implements Cloneable, Node { * @return Resolved string representation */ public final String toString( ConstantPool constant_pool ) { - String inner_class_name, outer_class_name, inner_name, access; - inner_class_name = constant_pool.getConstantString(inner_class_index, + String outer_class_name; + String inner_name; + String inner_class_name = constant_pool.getConstantString(inner_class_index, Constants.CONSTANT_Class); inner_class_name = Utility.compactClassName(inner_class_name); if (outer_class_index != 0) { @@ -196,7 +197,7 @@ public final class InnerClass implements Cloneable, Node { } else { inner_name = "(anonymous)"; } - access = Utility.accessToString(inner_access_flags, true); + String access = Utility.accessToString(inner_access_flags, true); access = access.equals("") ? "" : (access + " "); return " " + access + inner_name + "=class " + inner_class_name + outer_class_name; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index e1bd6443..a5476d0a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -55,7 +55,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl private int superclass_name_index; private String class_name; private String superclass_name; - private int major, minor; // Compiler version + private int major; + private int minor; // Compiler version private ConstantPool constant_pool; // Constant pool private int[] interfaces; // implemented interfaces private String[] interface_names; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java index f7414680..d086a389 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java @@ -154,7 +154,8 @@ public final class LineNumberTable extends Attribute { * @return corresponding line in source code */ public int getSourceLine( int pos ) { - int l = 0, r = line_number_table.length - 1; + int l = 0; + int r = line_number_table.length - 1; if (r < 0) { return -1; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java index 26e449f6..024cd746 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java @@ -182,7 +182,8 @@ public final class LocalVariable implements Cloneable, Node { * Helper method shared with LocalVariableTypeTable */ final String toStringShared( boolean typeTable ) { - String name = getName(), signature = Utility.signatureToString(getSignature(), false); + String name = getName(); + String signature = Utility.signatureToString(getSignature(), false); String label = "LocalVariable" + (typeTable ? "Types" : "" ); return label + "(start_pc = " + start_pc + ", length = " + length + ", index = " + index + ":" + signature + " " + name + ")"; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Method.java b/src/main/java/org/apache/commons/bcel6/classfile/Method.java index 0f911fc9..2f5918ac 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Method.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Method.java @@ -168,18 +168,15 @@ public final class Method extends FieldOrMethod { */ @Override public final String toString() { - ConstantUtf8 c; - String name, signature, access; // Short cuts to constant pool - StringBuilder buf; - access = Utility.accessToString(super.getAccessFlags()); + String access = Utility.accessToString(super.getAccessFlags()); // Get name and signature from constant pool - c = (ConstantUtf8) super.getConstantPool().getConstant(super.getSignatureIndex(), Constants.CONSTANT_Utf8); - signature = c.getBytes(); + ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(super.getSignatureIndex(), Constants.CONSTANT_Utf8); + String signature = c.getBytes(); c = (ConstantUtf8) super.getConstantPool().getConstant(super.getNameIndex(), Constants.CONSTANT_Utf8); - name = c.getBytes(); + String name = c.getBytes(); signature = Utility.methodSignatureToString(signature, name, access, true, getLocalVariableTable()); - buf = new StringBuilder(signature); + StringBuilder buf = new StringBuilder(signature); for (Attribute attribute : super.getAttributes()) { if (!((attribute instanceof Code) || (attribute instanceof ExceptionTable))) { buf.append(" [").append(attribute.toString()).append("]"); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java index 70865582..3b610a1a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java @@ -32,7 +32,8 @@ import org.apache.commons.bcel6.Constants; */ public final class PMGClass extends Attribute { - private int pmg_class_index, pmg_index; + private int pmg_class_index; + private int pmg_index; /** -- GitLab From fc930bf633b34ce47274fcce68e60487f28913ca Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 17:27:07 +0000 Subject: [PATCH 0932/1313] Checkstyle git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696827 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/generic/InstructionList.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java index 735ec635..6b1a4336 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java @@ -51,7 +51,8 @@ import org.apache.commons.bcel6.util.ByteSequence; */ public class InstructionList { - private InstructionHandle start = null, end = null; + private InstructionHandle start = null; + private InstructionHandle end = null; private int length = 0; // number of elements in list private int[] byte_positions; // byte code offsets corresponding to instructions @@ -112,7 +113,8 @@ public class InstructionList { */ public static InstructionHandle findHandle( InstructionHandle[] ihs, int[] pos, int count, int target ) { - int l = 0, r = count - 1; + int l = 0; + int r = count - 1; /* Do a binary search since the pos array is orderd. */ do { @@ -235,7 +237,8 @@ public class InstructionList { if (il.isEmpty()) { return ih; } - InstructionHandle next = ih.next, ret = il.start; + InstructionHandle next = ih.next; + InstructionHandle ret = il.start; ih.next = il.start; il.start.prev = ih; il.end.next = next; @@ -428,7 +431,8 @@ public class InstructionList { if (il.isEmpty()) { return ih; } - InstructionHandle prev = ih.prev, ret = il.start; + InstructionHandle prev = ih.prev; + InstructionHandle ret = il.start; ih.prev = il.end; il.end.next = ih; il.start.prev = prev; @@ -626,7 +630,8 @@ public class InstructionList { } } // Step 2: Temporarily remove the given instructions from the list - InstructionHandle prev = start.prev, next = end.next; + InstructionHandle prev = start.prev; + InstructionHandle next = end.next; if (prev != null) { prev.next = next; } else { @@ -680,7 +685,8 @@ public class InstructionList { */ private void remove( InstructionHandle prev, InstructionHandle next ) throws TargetLostException { - InstructionHandle first, last; // First and last deleted instruction + InstructionHandle first; + InstructionHandle last; // First and last deleted instruction if ((prev == null) && (next == null)) { first = start; last = end; @@ -776,7 +782,8 @@ public class InstructionList { * @param to where to end deleting (inclusive) */ public void delete( Instruction from, Instruction to ) throws TargetLostException { - InstructionHandle from_ih, to_ih; + InstructionHandle from_ih; + InstructionHandle to_ih; if ((from_ih = findInstruction1(from)) == null) { throw new ClassGenException("Instruction " + from + " is not contained in this list."); } @@ -850,8 +857,10 @@ public class InstructionList { * to this list */ public void setPositions( boolean check ) { // called by code in other packages - int max_additional_bytes = 0, additional_bytes = 0; - int index = 0, count = 0; + int max_additional_bytes = 0; + int additional_bytes = 0; + int index = 0; + int count = 0; int[] pos = new int[length]; /* Pass 0: Sanity checks */ -- GitLab From 1741dbf441f68a00a36ade096e7be37254c73055 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 17:33:13 +0000 Subject: [PATCH 0933/1313] Checkstyle git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696828 13f79535-47bb-0310-9956-ffa450edef68 --- checkstyle.xml | 2 +- .../commons/bcel6/classfile/Utility.java | 15 +++++++++++---- .../apache/commons/bcel6/util/CodeHTML.java | 18 ++++++++++++------ 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/checkstyle.xml b/checkstyle.xml index 936c3fe3..3bee47ab 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -149,7 +149,7 @@ limitations under the License. - + diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java index c3af19e6..40483ea6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java @@ -187,10 +187,17 @@ public abstract class Utility { public static String codeToString( ByteSequence bytes, ConstantPool constant_pool, boolean verbose ) throws IOException { short opcode = (short) bytes.readUnsignedByte(); - int default_offset = 0, low, high, npairs; - int index, vindex, constant; - int[] match, jump_table; - int no_pad_bytes = 0, offset; + int default_offset = 0; + int low; + int high; + int npairs; + int index; + int vindex; + int constant; + int[] match; + int[] jump_table; + int no_pad_bytes = 0; + int offset; StringBuilder buf = new StringBuilder(Constants.OPCODE_NAMES[opcode]); /* Special case: Skip (0-3) padding bytes, i.e., the * following bytes are 4-byte-aligned diff --git a/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java b/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java index 89d9291b..f045f9ac 100644 --- a/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java @@ -79,13 +79,19 @@ final class CodeHTML { */ private String codeToHTML( ByteSequence bytes, int method_number ) throws IOException { short opcode = (short) bytes.readUnsignedByte(); - StringBuilder buf; - String name, signature; - int default_offset = 0, low, high; - int index, class_index, vindex, constant; + String name; + String signature; + int default_offset = 0; + int low; + int high; + int index; + int class_index; + int vindex; + int constant; int[] jump_table; - int no_pad_bytes = 0, offset; - buf = new StringBuilder(256); + int no_pad_bytes = 0; + int offset; + StringBuilder buf = new StringBuilder(256); buf.append("").append(Constants.OPCODE_NAMES[opcode]).append(""); /* Special case: Skip (0-3) padding bytes, i.e., the * following bytes are 4-byte-aligned -- GitLab From 8861e8a0656759384b6dabdb95bbaf8de753582b Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 18:13:40 +0000 Subject: [PATCH 0934/1313] BCEL-211 Some additional clone methods should be public. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696835 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../bcel6/verifier/structurals/Frame.java | 16 ++++++++++++++++ .../verifier/structurals/LocalVariables.java | 2 +- .../bcel6/verifier/structurals/OperandStack.java | 2 +- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index d49f7819..8481608e 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Some additional clone methods should be public. Check for max Short seems wrong Document that Instruction Factory returns singleton instances better support for clone/copy methods diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java index a32d4776..1231551b 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java @@ -33,6 +33,8 @@ public class Frame{ * which instance it is that is not initialized yet. It will be * initialized invoking another constructor later. * NULL means the instance already *is* initialized. + * N.B. Use the getter/setter to access the field as it may + * be made private in a later release */ protected static UninitializedObjectType _this; @@ -120,4 +122,18 @@ public class Frame{ s += stack; return s; } + + /** + * @return the _this + */ + public static UninitializedObjectType get_this() { + return _this; + } + + /** + * @param _this the _this to set + */ + public static void set_this(UninitializedObjectType _this) { + Frame._this = _this; + } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java index 8e9223a6..fb696e0a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java @@ -49,7 +49,7 @@ public class LocalVariables{ * However, the Type objects in the array are shared. */ @Override - protected Object clone(){ + public Object clone(){ LocalVariables lvs = new LocalVariables(locals.length); for (int i=0; i clone = (ArrayList) this.stack.clone(); -- GitLab From 294b5827154e60ccde947a7c850a98104d670041 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 21:36:33 +0000 Subject: [PATCH 0935/1313] Checkstyle - line length git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696858 13f79535-47bb-0310-9956-ffa450edef68 --- checkstyle.xml | 8 +- checkstyle_suppressions.xml | 25 ++ src/examples/Mini/MiniParser.java | 3 +- src/examples/Mini/MiniParserTokenManager.java | 7 +- src/examples/ProxyCreator.java | 3 +- .../bcel6/classfile/AnnotationEntry.java | 3 +- .../commons/bcel6/classfile/Annotations.java | 6 +- .../bcel6/classfile/BootstrapMethod.java | 3 +- .../bcel6/classfile/BootstrapMethods.java | 3 +- .../bcel6/classfile/MethodParameter.java | 3 +- .../bcel6/classfile/MethodParameters.java | 3 +- .../bcel6/classfile/StackMapTableEntry.java | 9 +- .../bcel6/generic/AnnotationEntryGen.java | 6 +- .../apache/commons/bcel6/generic/Select.java | 3 +- .../bcel6/verifier/VerifierAppFrame.java | 8 +- .../verifier/statics/LocalVariableInfo.java | 6 +- .../bcel6/verifier/statics/Pass1Verifier.java | 36 ++- .../bcel6/verifier/statics/Pass2Verifier.java | 290 ++++++++++++------ .../verifier/statics/Pass3aVerifier.java | 120 +++++--- .../statics/StringRepresentation.java | 8 +- .../structurals/ControlFlowGraph.java | 8 +- .../structurals/InstConstraintVisitor.java | 181 +++++++---- .../structurals/InstructionContext.java | 3 +- .../verifier/structurals/LocalVariables.java | 15 +- .../verifier/structurals/OperandStack.java | 12 +- .../verifier/structurals/Pass3bVerifier.java | 39 ++- .../verifier/structurals/Subroutines.java | 43 ++- .../bcel6/classfile/UtilityTestCase.java | 12 +- .../verifier/AbstractVerifierTestCase.java | 3 +- .../verifier/VerifierArrayAccessTestCase.java | 9 +- .../bcel6/verifier/VerifierTestCase.java | 6 +- .../tests/TestArrayAccess02Creator.java | 9 +- .../tests/TestArrayAccess03Creator.java | 9 +- .../tests/TestArrayAccess04Creator.java | 9 +- .../verifier/tests/TestReturn01Creator.java | 9 +- .../verifier/tests/TestReturn03Creator.java | 9 +- 36 files changed, 647 insertions(+), 282 deletions(-) create mode 100644 checkstyle_suppressions.xml diff --git a/checkstyle.xml b/checkstyle.xml index 3bee47ab..623f8b15 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -36,7 +36,7 @@ limitations under the License. - - --> @@ -175,5 +175,9 @@ limitations under the License. + + + + diff --git a/checkstyle_suppressions.xml b/checkstyle_suppressions.xml new file mode 100644 index 00000000..24631662 --- /dev/null +++ b/checkstyle_suppressions.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/src/examples/Mini/MiniParser.java b/src/examples/Mini/MiniParser.java index abeac452..1c4985d0 100644 --- a/src/examples/Mini/MiniParser.java +++ b/src/examples/Mini/MiniParser.java @@ -831,7 +831,8 @@ public class MiniParser/*@bgen(jjtree)*/implements MiniParserTreeConstants, Mini // static private boolean jj_semLA; static private int jj_gen; static final private int[] jj_la1 = new int[17]; - static final private int[] jj_la1_0 = {0x200,0x0,0x1800000,0x1c000000,0x11c04400,0x1000,0x1800000,0x0,0x11c04400,0xe2000000,0x3f0000,0x1800000,0x1800000,0x1c000000,0xe2000000,0x3f0000,0x10400000,}; + static final private int[] jj_la1_0 = {0x200,0x0,0x1800000,0x1c000000,0x11c04400,0x1000,0x1800000,0x0,0x11c04400, + 0xe2000000,0x3f0000,0x1800000,0x1800000,0x1c000000,0xe2000000,0x3f0000,0x10400000,}; static final private int[] jj_la1_1 = {0x0,0x8,0x130,0x0,0x331,0x0,0x130,0x8,0x331,0x0,0x0,0x331,0x130,0x0,0x0,0x0,0x0,}; static final private JJCalls[] jj_2_rtns = new JJCalls[1]; static private boolean jj_rescan = false; diff --git a/src/examples/Mini/MiniParserTokenManager.java b/src/examples/Mini/MiniParserTokenManager.java index d09067b7..d321a02a 100644 --- a/src/examples/Mini/MiniParserTokenManager.java +++ b/src/examples/Mini/MiniParserTokenManager.java @@ -593,7 +593,9 @@ static protected char curChar; public MiniParserTokenManager(ASCII_CharStream stream) { if (input_stream != null) { - throw new TokenMgrError("ERROR: Second call to constructor of static lexer. You must use ReInit() to initialize the static variables.", TokenMgrError.STATIC_LEXER_ERROR); + throw new TokenMgrError( + "ERROR: Second call to constructor of static lexer. You must use ReInit() to initialize the static variables.", + TokenMgrError.STATIC_LEXER_ERROR); } input_stream = stream; } @@ -625,7 +627,8 @@ static public void ReInit(ASCII_CharStream stream, int lexState) static public void SwitchTo(int lexState) { if (lexState >= 2 || lexState < 0) { - throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE); + throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", + TokenMgrError.INVALID_LEXICAL_STATE); } else { curLexState = lexState; } diff --git a/src/examples/ProxyCreator.java b/src/examples/ProxyCreator.java index 0a57e724..bf374b14 100644 --- a/src/examples/ProxyCreator.java +++ b/src/examples/ProxyCreator.java @@ -75,7 +75,8 @@ public class ProxyCreator { ClassLoader loader = ProxyCreator.class.getClassLoader(); // instanceof won't work here ... - if (loader.getClass().toString().equals("class org.apache.commons.bcel6.util.ClassLoader")) { // TODO this is broken; cannot ever be true + // TODO this is broken; cannot ever be true now that ClassLoader has been dropped + if (loader.getClass().toString().equals("class org.apache.commons.bcel6.util.ClassLoader")) { // Real class name will be set by the class loader ClassGen cg = new ClassGen("foo", "java.lang.Object", "", Constants.ACC_PUBLIC, new String[]{"java.awt.event.ActionListener"}); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java index e75889a6..dfcaa165 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java @@ -55,7 +55,8 @@ public class AnnotationEntry implements Node { final int num_element_value_pairs = (input.readUnsignedShort()); annotationEntry.element_value_pairs = new ArrayList<>(); for (int i = 0; i < num_element_value_pairs; i++) { - annotationEntry.element_value_pairs.add(new ElementValuePair(input.readUnsignedShort(), ElementValue.readElementValue(input, constant_pool), + annotationEntry.element_value_pairs.add( + new ElementValuePair(input.readUnsignedShort(), ElementValue.readElementValue(input, constant_pool), constant_pool)); } return annotationEntry; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java index f296baeb..8231e558 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java @@ -39,7 +39,8 @@ public abstract class Annotations extends Attribute { * @param input Input stream * @param constant_pool Array of constants */ - Annotations(byte annotation_type, int name_index, int length, DataInput input, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { + Annotations(byte annotation_type, int name_index, int length, DataInput input, + ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool, isRuntimeVisible); final int annotation_table_length = (input.readUnsignedShort()); annotation_table = new AnnotationEntry[annotation_table_length]; @@ -55,7 +56,8 @@ public abstract class Annotations extends Attribute { * @param annotation_table the actual annotations * @param constant_pool Array of constants */ - public Annotations(byte annotation_type, int name_index, int length, AnnotationEntry[] annotation_table, ConstantPool constant_pool, boolean isRuntimeVisible) { + public Annotations(byte annotation_type, int name_index, int length, AnnotationEntry[] annotation_table, + ConstantPool constant_pool, boolean isRuntimeVisible) { super(annotation_type, name_index, length, constant_pool); this.annotation_table = annotation_table; this.isRuntimeVisible = isRuntimeVisible; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java index 89d653b5..ef42d350 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java @@ -28,7 +28,8 @@ import org.apache.commons.bcel6.Constants; * method ref, the number of bootstrap arguments and an array of the * bootstrap arguments. * - * @see The class File Format : The BootstrapMethods Attribute + * @see + * The class File Format : The BootstrapMethods Attribute * @since 6.0 */ public class BootstrapMethod implements Cloneable { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java index be1964ea..07c7e385 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java @@ -26,7 +26,8 @@ import org.apache.commons.bcel6.Constants; /** * This class represents a BootstrapMethods attribute. * - * @see The class File Format : The BootstrapMethods Attribute + * @see + * The class File Format : The BootstrapMethods Attribute * @since 6.0 */ public class BootstrapMethods extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java index 38feee46..8d7867dd 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java @@ -26,7 +26,8 @@ import org.apache.commons.bcel6.Constants; /** * Entry of the parameters table. * - * @see The class File Format : The MethodParameters Attribute + * @see + * The class File Format : The MethodParameters Attribute * @since 6.0 */ public class MethodParameter implements Cloneable { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java index be645b59..fdbfba88 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java @@ -26,7 +26,8 @@ import org.apache.commons.bcel6.Constants; /** * This class represents a MethodParameters attribute. * - * @see The class File Format : The MethodParameters Attribute + * @see + * The class File Format : The MethodParameters Attribute * @since 6.0 */ public class MethodParameters extends Attribute { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java index c0d920ca..474e6ab2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapTableEntry.java @@ -53,7 +53,8 @@ public final class StackMapTableEntry implements Cloneable { if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { byte_code_offset = frame_type - Constants.SAME_FRAME; - } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { + } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && + frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { byte_code_offset = frame_type - Constants.SAME_LOCALS_1_STACK_ITEM_FRAME; types_of_stack_items = new StackMapType[1]; types_of_stack_items[0] = new StackMapType(input, constant_pool); @@ -112,7 +113,8 @@ public final class StackMapTableEntry implements Cloneable { file.write(frame_type); if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { // nothing to be done - } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { + } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && + frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { types_of_stack_items[0].dump(file); } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { file.writeShort(byte_code_offset); @@ -152,7 +154,8 @@ public final class StackMapTableEntry implements Cloneable { buf.append("("); if (frame_type >= Constants.SAME_FRAME && frame_type <= Constants.SAME_FRAME_MAX) { buf.append("SAME"); - } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { + } else if (frame_type >= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME && + frame_type <= Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_MAX) { buf.append("SAME_LOCALS_1_STACK"); } else if (frame_type == Constants.SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED) { buf.append("SAME_LOCALS_1_STACK_EXTENDED"); diff --git a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java index b6049ea3..2eb8191b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java @@ -250,11 +250,13 @@ public class AnnotationEntryGen { List newAttributes = new ArrayList<>(); if (rvaData.length > 2) { newAttributes.add( - new RuntimeVisibleAnnotations(rvaIndex, rvaData.length, new DataInputStream(new ByteArrayInputStream(rvaData)), cp.getConstantPool())); + new RuntimeVisibleAnnotations(rvaIndex, rvaData.length, + new DataInputStream(new ByteArrayInputStream(rvaData)), cp.getConstantPool())); } if (riaData.length > 2) { newAttributes.add( - new RuntimeInvisibleAnnotations(riaIndex, riaData.length, new DataInputStream(new ByteArrayInputStream(riaData)), cp.getConstantPool())); + new RuntimeInvisibleAnnotations(riaIndex, riaData.length, + new DataInputStream(new ByteArrayInputStream(riaData)), cp.getConstantPool())); } return newAttributes.toArray(new Attribute[newAttributes.size()]); diff --git a/src/main/java/org/apache/commons/bcel6/generic/Select.java b/src/main/java/org/apache/commons/bcel6/generic/Select.java index 12e76c43..227289f3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Select.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Select.java @@ -67,7 +67,8 @@ public abstract class Select extends BranchInstruction implements VariableLength } this.match = match; if ((match_length = match.length) != targets.length) { - throw new ClassGenException("Match and target array have not the same length: Match length: " + match.length + " Target length: " + targets.length); + throw new ClassGenException("Match and target array have not the same length: Match length: " + + match.length + " Target length: " + targets.length); } indices = new int[match_length]; } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java index 0fbe6a10..713cb3cf 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java @@ -392,7 +392,8 @@ public class VerifierAppFrame extends JFrame { JOptionPane .showMessageDialog( this, - "JustIce is a Java class file verifier.\nIt was implemented by Enver Haase in 2001, 2002.\n", + "JustIce is a Java class file verifier.\n"+ + "It was implemented by Enver Haase in 2001, 2002.\n", JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); } @@ -401,7 +402,10 @@ public class VerifierAppFrame extends JFrame { JOptionPane .showMessageDialog( this, - "The upper four boxes to the right reflect verification passes according to The Java Virtual Machine Specification.\nThese are (in that order): Pass one, Pass two, Pass three (before data flow analysis), Pass three (data flow analysis).\nThe bottom box to the right shows (warning) messages; warnings do not cause a class to be rejected.", + "The upper four boxes to the right reflect verification passes according to"+ + " The Java Virtual Machine Specification.\nThese are (in that order):"+ + " Pass one, Pass two, Pass three (before data flow analysis), Pass three (data flow analysis).\n"+ + "The bottom box to the right shows (warning) messages; warnings do not cause a class to be rejected.", JUSTICE_VERSION, JOptionPane.INFORMATION_MESSAGE); } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java index 0e0454d0..24ce2a65 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java @@ -94,12 +94,14 @@ public class LocalVariableInfo{ private void add(int offset, String name, Type t) throws LocalVariableInfoInconsistentException{ if (getName(offset) != null){ if (! getName(offset).equals(name)){ - throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+"' a local variable has two different names: '"+getName(offset)+"' and '"+name+"'."); + throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+ + "' a local variable has two different names: '"+getName(offset)+"' and '"+name+"'."); } } if (getType(offset) != null){ if (! getType(offset).equals(t)){ - throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+"' a local variable has two different types: '"+getType(offset)+"' and '"+t+"'."); + throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+ + "' a local variable has two different types: '"+getType(offset)+"' and '"+t+"'."); } } setName(offset, name); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java index a8de1ed4..4ff0dff9 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java @@ -48,7 +48,10 @@ public final class Pass1Verifier extends PassVerifier{ */ private final Verifier myOwner; - /** Used to load in and return the myOwner-matching JavaClass object when needed. Avoids loading in a class file when it's not really needed! */ + /** + * Used to load in and return the myOwner-matching JavaClass object when needed. + * Avoids loading in a class file when it's not really needed! + */ private JavaClass getJavaClass(){ if (jc == null){ try { @@ -99,9 +102,14 @@ public final class Pass1Verifier extends PassVerifier{ *

  • there are exactly interfaces_count many entries in the interfaces array of the class file. *
  • there are exactly fields_count many entries in the fields array of the class file. *
  • there are exactly methods_count many entries in the methods array of the class file. - *
  • there are exactly attributes_count many entries in the attributes array of the class file, fields, methods, and code attribute. - *
  • there should be exactly attribute_length many bytes in each attribute. Inconsistency between attribute_length and the actually size of the attribute content should be uncovered. For example, in an Exceptions attribute, the actual number of exceptions as required by the number_of_exceptions field might yeild an attribute size that doesn't match the attribute_length. Such an anomaly should be detected. - *
  • all attributes should have proper length. In particular, under certain context (e.g. while parsing method_info), recognizable attributes (e.g. "Code" attribute) should have correct format (e.g. attribute_length is 2). + *
  • there are exactly attributes_count many entries in the attributes array of the class file, + * fields, methods, and code attribute. + *
  • there should be exactly attribute_length many bytes in each attribute. + * Inconsistency between attribute_length and the actually size of the attribute content should be uncovered. + * For example, in an Exceptions attribute, the actual number of exceptions as required by the number_of_exceptions field + * might yeild an attribute size that doesn't match the attribute_length. Such an anomaly should be detected. + *
  • all attributes should have proper length. In particular, under certain context (e.g. while parsing method_info), + * recognizable attributes (e.g. "Code" attribute) should have correct format (e.g. attribute_length is 2). * *
  • Also, certain constant values are checked for validity: *
      @@ -109,9 +117,12 @@ public final class Pass1Verifier extends PassVerifier{ *
    • The major and minor version numbers are valid. *
    • All the constant pool type tags are recognizable. *
    • All undocumented access flags are masked off before use. Strictly speaking, this is not really a check. - *
    • The field this_class should point to a string that represents a legal non-array class name, and this name should be the same as the class file being loaded. + *
    • The field this_class should point to a string that represents a legal non-array class name, + * and this name should be the same as the class file being loaded. *
    • the field super_class should point to a string that represents a legal non-array class name. - *
    • Because some of the above checks require cross referencing the constant pool entries, guards are set up to make sure that the referenced entries are of the right type and the indices are within the legal range (0 < index < constant_pool_count). + *
    • Because some of the above checks require cross referencing the constant pool entries, + * guards are set up to make sure that the referenced entries are of the right type and the indices + * are within the legal range (0 < index < constant_pool_count). *
    *
  • Extra checks done in pass 1: *
      @@ -120,13 +131,14 @@ public final class Pass1Verifier extends PassVerifier{ *
    • the name and signature of fields and methods are verified to be of legal format. *
    * - * (From the Paper The Mysterious Pass One, first draft, September 2, 1997.) + * (From the Paper + * The Mysterious Pass One, first draft, September 2, 1997.) * *

    However, most of this is done by parsing a class file or generating a class file into BCEL's internal data structure. * Therefore, all that is really done here is look up the class file from BCEL's repository. * This is also motivated by the fact that some omitted things - * (like the check for extra bytes at the end of the class file) are handy when actually using BCEL to repair a class file (otherwise you would not be - * able to load it into BCEL).

    + * (like the check for extra bytes at the end of the class file) are handy when actually using BCEL to repair a class file + * (otherwise you would not be able to load it into BCEL).

    * * @see org.apache.commons.bcel6.Repository */ @@ -141,7 +153,8 @@ public final class Pass1Verifier extends PassVerifier{ if (! myOwner.getClassName().equals(jc.getClassName())){ // This should maybe caught by BCEL: In case of renamed .class files we get wrong // JavaClass objects here. - throw new LoadingException("Wrong name: the internal name of the .class file '"+jc.getClassName()+"' does not match the file's name '"+myOwner.getClassName()+"'."); + throw new LoadingException("Wrong name: the internal name of the .class file '"+jc.getClassName()+ + "' does not match the file's name '"+myOwner.getClassName()+"'."); } } @@ -155,7 +168,8 @@ public final class Pass1Verifier extends PassVerifier{ catch(RuntimeException e){ // BCEL does not catch every possible RuntimeException; e.g. if // a constant pool index is referenced that does not exist. - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Parsing via BCEL did not succeed. "+e.getClass().getName()+" occured:\n"+Utility.getStackTrace(e)); + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Parsing via BCEL did not succeed. "+ + e.getClass().getName()+" occured:\n"+Utility.getStackTrace(e)); } if (jc != null){ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java index 2b686950..a3ebbdec 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java @@ -200,7 +200,8 @@ public final class Pass2Verifier extends PassVerifier { if (supidx == 0){ if (jc != Repository.lookupClass(Type.OBJECT.getClassName())){ - throw new ClassConstraintException("Superclass of '"+jc.getClassName()+"' missing but not "+Type.OBJECT.getClassName()+" itself!"); + throw new ClassConstraintException("Superclass of '"+jc.getClassName()+ + "' missing but not "+Type.OBJECT.getClassName()+" itself!"); } } else{ @@ -217,7 +218,8 @@ public final class Pass2Verifier extends PassVerifier { jc = Repository.lookupClass(supername); if (jc.isFinal()){ - throw new ClassConstraintException("Ancestor class '"+supername+"' has the FINAL access modifier and must therefore not be subclassed."); + throw new ClassConstraintException("Ancestor class '"+supername+ + "' has the FINAL access modifier and must therefore not be subclassed."); } } } @@ -250,27 +252,32 @@ public final class Pass2Verifier extends PassVerifier { Method[] methods = jc.getMethods(); for (Method method : methods) { - String name_and_sig = (method.getName() + method.getSignature()); + String nameAndSig = (method.getName() + method.getSignature()); - if (hashmap.containsKey(name_and_sig)) { + if (hashmap.containsKey(nameAndSig)) { if (method.isFinal()) { if (!(method.isPrivate())) { - throw new ClassConstraintException("Method '" + name_and_sig + "' in class '" + hashmap.get(name_and_sig) + "' overrides the final (not-overridable) definition in class '" + jc.getClassName() + "'."); + throw new ClassConstraintException("Method '" + nameAndSig + "' in class '" + hashmap.get(nameAndSig) + + "' overrides the final (not-overridable) definition in class '" + jc.getClassName() + "'."); } - addMessage("Method '" + name_and_sig + "' in class '" + hashmap.get(name_and_sig) + "' overrides the final (not-overridable) definition in class '" + jc.getClassName() + "'. This is okay, as the original definition was private; however this constraint leverage was introduced by JLS 8.4.6 (not vmspec2) and the behaviour of the Sun verifiers."); + addMessage("Method '" + nameAndSig + "' in class '" + hashmap.get(nameAndSig) + + "' overrides the final (not-overridable) definition in class '" + jc.getClassName() + + "'. This is okay, as the original definition was private; however this constraint leverage"+ + " was introduced by JLS 8.4.6 (not vmspec2) and the behaviour of the Sun verifiers."); } else { if (!method.isStatic()) { // static methods don't inherit - hashmap.put(name_and_sig, jc.getClassName()); + hashmap.put(nameAndSig, jc.getClassName()); } } } else { if (!method.isStatic()) { // static methods don't inherit - hashmap.put(name_and_sig, jc.getClassName()); + hashmap.put(nameAndSig, jc.getClassName()); } } } - jc = Repository.lookupClass(jc.getSuperclassName()); // Well, for OBJECT this returns OBJECT so it works (could return anything but must not throw an Exception). + jc = Repository.lookupClass(jc.getSuperclassName()); + // Well, for OBJECT this returns OBJECT so it works (could return anything but must not throw an Exception). } } catch (ClassNotFoundException e) { @@ -361,7 +368,8 @@ public final class Pass2Verifier extends PassVerifier { Constant c = cp.getConstant(index); if (! shouldbe.isInstance(c)){ /* String isnot = shouldbe.toString().substring(shouldbe.toString().lastIndexOf(".")+1); //Cut all before last "." */ - throw new ClassCastException("Illegal constant '"+tostring(c)+"' at index '"+index+"'. '"+tostring(referrer)+"' expects a '"+shouldbe+"'."); + throw new ClassCastException("Illegal constant '"+tostring(c)+"' at index '"+ + index+"'. '"+tostring(referrer)+"' expects a '"+shouldbe+"'."); } } /////////////////////////////////////// @@ -382,14 +390,16 @@ public final class Pass2Verifier extends PassVerifier { (!(att instanceof Deprecated)) && (!(att instanceof InnerClasses)) && (!(att instanceof Synthetic))) { - addMessage("Attribute '" + tostring(att) + "' as an attribute of the ClassFile structure '" + tostring(obj) + "' is unknown and will therefore be ignored."); + addMessage("Attribute '" + tostring(att) + "' as an attribute of the ClassFile structure '" + + tostring(obj) + "' is unknown and will therefore be ignored."); } if (att instanceof SourceFile) { if (!foundSourceFile) { foundSourceFile = true; } else { - throw new ClassConstraintException("A ClassFile structure (like '" + tostring(obj) + "') may have no more than one SourceFile attribute."); //vmspec2 4.7.7 + throw new ClassConstraintException("A ClassFile structure (like '" + + tostring(obj) + "') may have no more than one SourceFile attribute."); //vmspec2 4.7.7 } } @@ -398,21 +408,29 @@ public final class Pass2Verifier extends PassVerifier { foundInnerClasses = true; } else { if (hasInnerClass) { - throw new ClassConstraintException("A Classfile structure (like '" + tostring(obj) + "') must have exactly one InnerClasses attribute if at least one Inner Class is referenced (which is the case). More than one InnerClasses attribute was found."); + throw new ClassConstraintException("A Classfile structure (like '" + tostring(obj) + + "') must have exactly one InnerClasses attribute"+ + " if at least one Inner Class is referenced (which is the case)."+ + " More than one InnerClasses attribute was found."); } } if (!hasInnerClass) { - addMessage("No referenced Inner Class found, but InnerClasses attribute '" + tostring(att) + "' found. Strongly suggest removal of that attribute."); + addMessage("No referenced Inner Class found, but InnerClasses attribute '" + tostring(att) + + "' found. Strongly suggest removal of that attribute."); } } } if (hasInnerClass && !foundInnerClasses){ - //throw new ClassConstraintException("A Classfile structure (like '"+tostring(obj)+"') must have exactly one InnerClasses attribute if at least one Inner Class is referenced (which is the case). No InnerClasses attribute was found."); + //throw new ClassConstraintException("A Classfile structure (like '"+tostring(obj)+ + // "') must have exactly one InnerClasses attribute if at least one Inner Class is referenced (which is the case)."+ + // " No InnerClasses attribute was found."); //vmspec2, page 125 says it would be a constraint: but existing verifiers //don't check it and javac doesn't satisfy it when it comes to anonymous //inner classes - addMessage("A Classfile structure (like '"+tostring(obj)+"') must have exactly one InnerClasses attribute if at least one Inner Class is referenced (which is the case). No InnerClasses attribute was found."); + addMessage("A Classfile structure (like '"+tostring(obj)+ + "') must have exactly one InnerClasses attribute if at least one Inner Class is referenced (which is the case)."+ + " No InnerClasses attribute was found."); } } ///////////////////////////// @@ -519,27 +537,35 @@ public final class Pass2Verifier extends PassVerifier { maxone++; } if (maxone > 1){ - throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); + throw new ClassConstraintException("Field '"+tostring(obj)+ + "' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); } if (obj.isFinal() && obj.isVolatile()){ - throw new ClassConstraintException("Field '"+tostring(obj)+"' must only have at most one of its ACC_FINAL, ACC_VOLATILE modifiers set."); + throw new ClassConstraintException("Field '"+tostring(obj)+ + "' must only have at most one of its ACC_FINAL, ACC_VOLATILE modifiers set."); } } else{ // isInterface! if (!obj.isPublic()){ - throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); + throw new ClassConstraintException("Interface field '"+tostring(obj)+ + "' must have the ACC_PUBLIC modifier set but hasn't!"); } if (!obj.isStatic()){ - throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_STATIC modifier set but hasn't!"); + throw new ClassConstraintException("Interface field '"+tostring(obj)+ + "' must have the ACC_STATIC modifier set but hasn't!"); } if (!obj.isFinal()){ - throw new ClassConstraintException("Interface field '"+tostring(obj)+"' must have the ACC_FINAL modifier set but hasn't!"); + throw new ClassConstraintException("Interface field '"+tostring(obj)+ + "' must have the ACC_FINAL modifier set but hasn't!"); } } - if ((obj.getAccessFlags() & ~(Constants.ACC_PUBLIC|Constants.ACC_PRIVATE|Constants.ACC_PROTECTED|Constants.ACC_STATIC|Constants.ACC_FINAL|Constants.ACC_VOLATILE|Constants.ACC_TRANSIENT)) > 0){ - addMessage("Field '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, ACC_TRANSIENT set (ignored)."); + if ((obj.getAccessFlags() & ~(Constants.ACC_PUBLIC|Constants.ACC_PRIVATE|Constants.ACC_PROTECTED|Constants.ACC_STATIC| + Constants.ACC_FINAL|Constants.ACC_VOLATILE|Constants.ACC_TRANSIENT)) > 0){ + addMessage("Field '"+tostring(obj)+ + "' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED,"+ + " ACC_STATIC, ACC_FINAL, ACC_VOLATILE, ACC_TRANSIENT set (ignored)."); } checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -552,7 +578,7 @@ public final class Pass2Verifier extends PassVerifier { // A descriptor is often named signature in BCEL checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); - String sig = ((ConstantUtf8) (cp.getConstant(obj.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + String sig = ((ConstantUtf8) (cp.getConstant(obj.getSignatureIndex()))).getBytes(); // Field or Method sig.(=descriptor) try{ Type.getType(sig); /* Don't need the return value */ @@ -563,10 +589,12 @@ public final class Pass2Verifier extends PassVerifier { String nameanddesc = (name+sig); if (field_names_and_desc.contains(nameanddesc)){ - throw new ClassConstraintException("No two fields (like '"+tostring(obj)+"') are allowed have same names and descriptors!"); + throw new ClassConstraintException("No two fields (like '"+tostring(obj)+ + "') are allowed have same names and descriptors!"); } if (field_names.contains(name)){ - addMessage("More than one field of name '"+name+"' detected (but with different type descriptors). This is very unusual."); + addMessage("More than one field of name '"+name+ + "' detected (but with different type descriptors). This is very unusual."); } field_names_and_desc.add(nameanddesc); field_names.add(name); @@ -576,10 +604,12 @@ public final class Pass2Verifier extends PassVerifier { if ((!(att instanceof ConstantValue)) && (!(att instanceof Synthetic)) && (!(att instanceof Deprecated))) { - addMessage("Attribute '" + tostring(att) + "' as an attribute of Field '" + tostring(obj) + "' is unknown and will therefore be ignored."); + addMessage("Attribute '" + tostring(att) + "' as an attribute of Field '" + + tostring(obj) + "' is unknown and will therefore be ignored."); } if (!(att instanceof ConstantValue)) { - addMessage("Attribute '" + tostring(att) + "' as an attribute of Field '" + tostring(obj) + "' is not a ConstantValue and is therefore only of use for debuggers and such."); + addMessage("Attribute '" + tostring(att) + "' as an attribute of Field '" + tostring(obj) + + "' is not a ConstantValue and is therefore only of use for debuggers and such."); } } } @@ -608,7 +638,8 @@ public final class Pass2Verifier extends PassVerifier { ts = Type.getArgumentTypes(sig); } catch (ClassFormatException cfe){ - throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by Method '"+tostring(obj)+"'.", cfe); + throw new ClassConstraintException( + "Illegal descriptor (==signature) '"+sig+"' used by Method '"+tostring(obj)+"'.", cfe); } // Check if referenced objects exist. @@ -620,7 +651,8 @@ public final class Pass2Verifier extends PassVerifier { Verifier v = VerifierFactory.getVerifier( ((ObjectType) act).getClassName() ); VerificationResult vr = v.doPass1(); if (vr != VerificationResult.VR_OK) { - throw new ClassConstraintException("Method '"+tostring(obj)+"' has a return type that does not pass verification pass 1: '"+vr+"'."); + throw new ClassConstraintException( + "Method '"+tostring(obj)+"' has a return type that does not pass verification pass 1: '"+vr+"'."); } } @@ -633,14 +665,18 @@ public final class Pass2Verifier extends PassVerifier { Verifier v = VerifierFactory.getVerifier( ((ObjectType) act).getClassName() ); VerificationResult vr = v.doPass1(); if (vr != VerificationResult.VR_OK) { - throw new ClassConstraintException("Method '"+tostring(obj)+"' has an argument type that does not pass verification pass 1: '"+vr+"'."); + throw new ClassConstraintException( + "Method '"+tostring(obj)+"' has an argument type that does not pass verification pass 1: '"+vr+"'."); } } } // Nearly forgot this! Funny return values are allowed, but a non-empty arguments list makes a different method out of it! if (name.equals(Constants.STATIC_INITIALIZER_NAME) && (ts.length != 0)){ - throw new ClassConstraintException("Method '"+tostring(obj)+"' has illegal name '"+name+"'. It's name resembles the class or interface initialization method which it isn't because of its arguments (==descriptor)."); + throw new ClassConstraintException( + "Method '"+tostring(obj)+"' has illegal name '"+name+"'."+ + " Its name resembles the class or interface initialization method"+ + " which it isn't because of its arguments (==descriptor)."); } if (jc.isClass()){ @@ -655,27 +691,34 @@ public final class Pass2Verifier extends PassVerifier { maxone++; } if (maxone > 1){ - throw new ClassConstraintException("Method '"+tostring(obj)+"' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); + throw new ClassConstraintException("Method '"+tostring(obj)+ + "' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); } if (obj.isAbstract()){ if (obj.isFinal()) { - throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_FINAL modifier set."); + throw new ClassConstraintException( + "Abstract method '"+tostring(obj)+"' must not have the ACC_FINAL modifier set."); } if (obj.isNative()) { - throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_NATIVE modifier set."); + throw new ClassConstraintException( + "Abstract method '"+tostring(obj)+"' must not have the ACC_NATIVE modifier set."); } if (obj.isPrivate()) { - throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_PRIVATE modifier set."); + throw new ClassConstraintException( + "Abstract method '"+tostring(obj)+"' must not have the ACC_PRIVATE modifier set."); } if (obj.isStatic()) { - throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STATIC modifier set."); + throw new ClassConstraintException( + "Abstract method '"+tostring(obj)+"' must not have the ACC_STATIC modifier set."); } if (obj.isStrictfp()) { - throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_STRICT modifier set."); + throw new ClassConstraintException( + "Abstract method '"+tostring(obj)+"' must not have the ACC_STRICT modifier set."); } if (obj.isSynchronized()) { - throw new ClassConstraintException("Abstract method '"+tostring(obj)+"' must not have the ACC_SYNCHRONIZED modifier set."); + throw new ClassConstraintException( + "Abstract method '"+tostring(obj)+"' must not have the ACC_SYNCHRONIZED modifier set."); } } @@ -688,7 +731,8 @@ public final class Pass2Verifier extends PassVerifier { obj.isSynchronized() || obj.isNative() || obj.isAbstract()) { - throw new ClassConstraintException("Instance initialization method '" + tostring(obj) + "' must not have any of the ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT modifiers set."); + throw new ClassConstraintException("Instance initialization method '" + tostring(obj) + "' must not have" + + " any of the ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT modifiers set."); } } } @@ -696,21 +740,25 @@ public final class Pass2Verifier extends PassVerifier { if (!name.equals(Constants.STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph if (jc.getMajor() >= Constants.MAJOR_1_8) { if (!(obj.isPublic() ^ obj.isPrivate())) { - throw new ClassConstraintException("Interface method '" + tostring(obj) + "' must have exactly one of its ACC_PUBLIC and ACC_PRIVATE modifiers set."); + throw new ClassConstraintException("Interface method '" + tostring(obj) + "' must have" + + " exactly one of its ACC_PUBLIC and ACC_PRIVATE modifiers set."); } if (obj.isProtected() || obj.isFinal() || obj.isSynchronized() || obj.isNative()) { - throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must not have any of the ACC_PROTECTED, ACC_FINAL, ACC_SYNCHRONIZED, or ACC_NATIVE modifiers set."); + throw new ClassConstraintException("Interface method '"+tostring(obj)+ "' must not have" + + " any of the ACC_PROTECTED, ACC_FINAL, ACC_SYNCHRONIZED, or ACC_NATIVE modifiers set."); } } else { if (!obj.isPublic()){ - throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); + throw new ClassConstraintException( + "Interface method '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); } if (!obj.isAbstract()){ - throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must have the ACC_ABSTRACT modifier set but hasn't!"); + throw new ClassConstraintException( + "Interface method '"+tostring(obj)+"' must have the ACC_ABSTRACT modifier set but hasn't!"); } if (obj.isPrivate() || obj.isProtected() @@ -719,19 +767,26 @@ public final class Pass2Verifier extends PassVerifier { || obj.isSynchronized() || obj.isNative() || obj.isStrictfp() ) { - throw new ClassConstraintException("Interface method '"+tostring(obj)+"' must not have any of the ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT modifiers set."); + throw new ClassConstraintException("Interface method '"+tostring(obj)+ "' must not have" + + " any of the ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED,"+ + " ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT modifiers set."); } } } } - if ((obj.getAccessFlags() & ~(Constants.ACC_PUBLIC|Constants.ACC_PRIVATE|Constants.ACC_PROTECTED|Constants.ACC_STATIC|Constants.ACC_FINAL|Constants.ACC_SYNCHRONIZED|Constants.ACC_NATIVE|Constants.ACC_ABSTRACT|Constants.ACC_STRICT)) > 0){ - addMessage("Method '"+tostring(obj)+"' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT set (ignored)."); + if ((obj.getAccessFlags() & + ~(Constants.ACC_PUBLIC|Constants.ACC_PRIVATE|Constants.ACC_PROTECTED|Constants.ACC_STATIC|Constants.ACC_FINAL| + Constants.ACC_SYNCHRONIZED|Constants.ACC_NATIVE|Constants.ACC_ABSTRACT|Constants.ACC_STRICT)) > 0){ + addMessage("Method '"+tostring(obj)+"' has access flag(s) other than"+ + " ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL,"+ + " ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT set (ignored)."); } String nameanddesc = (name+sig); if (method_names_and_desc.contains(nameanddesc)){ - throw new ClassConstraintException("No two methods (like '"+tostring(obj)+"') are allowed have same names and desciptors!"); + throw new ClassConstraintException( + "No two methods (like '"+tostring(obj)+"') are allowed have same names and desciptors!"); } method_names_and_desc.add(nameanddesc); @@ -742,21 +797,25 @@ public final class Pass2Verifier extends PassVerifier { (!(att instanceof ExceptionTable)) && (!(att instanceof Synthetic)) && (!(att instanceof Deprecated))) { - addMessage("Attribute '" + tostring(att) + "' as an attribute of Method '" + tostring(obj) + "' is unknown and will therefore be ignored."); + addMessage("Attribute '" + tostring(att) + "' as an attribute of Method '" + tostring(obj) + + "' is unknown and will therefore be ignored."); } if ((!(att instanceof Code)) && (!(att instanceof ExceptionTable))) { - addMessage("Attribute '" + tostring(att) + "' as an attribute of Method '" + tostring(obj) + "' is neither Code nor Exceptions and is therefore only of use for debuggers and such."); + addMessage("Attribute '" + tostring(att) + "' as an attribute of Method '" + tostring(obj) + + "' is neither Code nor Exceptions and is therefore only of use for debuggers and such."); } if ((att instanceof Code) && (obj.isNative() || obj.isAbstract())) { - throw new ClassConstraintException("Native or abstract methods like '" + tostring(obj) + "' must not have a Code attribute like '" + tostring(att) + "'."); //vmspec2 page120, 4.7.3 + throw new ClassConstraintException("Native or abstract methods like '" + tostring(obj) + + "' must not have a Code attribute like '" + tostring(att) + "'."); //vmspec2 page120, 4.7.3 } if (att instanceof Code) { num_code_atts++; } } if ( !obj.isNative() && !obj.isAbstract() && num_code_atts != 1){ - throw new ClassConstraintException("Non-native, non-abstract methods like '"+tostring(obj)+"' must have exactly one Code attribute (found: "+num_code_atts+")."); + throw new ClassConstraintException("Non-native, non-abstract methods like '"+tostring(obj)+ + "' must have exactly one Code attribute (found: "+num_code_atts+")."); } } /////////////////////////////////////////////////////// @@ -771,7 +830,8 @@ public final class Pass2Verifier extends PassVerifier { String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); if (! name.equals("SourceFile")){ - throw new ClassConstraintException("The SourceFile attribute '"+tostring(obj)+"' is not correctly named 'SourceFile' but '"+name+"'."); + throw new ClassConstraintException( + "The SourceFile attribute '"+tostring(obj)+"' is not correctly named 'SourceFile' but '"+name+"'."); } checkIndex(obj, obj.getSourceFileIndex(), CONST_Utf8); @@ -783,7 +843,9 @@ public final class Pass2Verifier extends PassVerifier { (sourcefilename.indexOf('\\') != -1) || (sourcefilename.indexOf(':') != -1) || (sourcefilenamelc.lastIndexOf(".java") == -1) ){ - addMessage("SourceFile attribute '"+tostring(obj)+"' has a funny name: remember not to confuse certain parsers working on javap's output. Also, this name ('"+sourcefilename+"') is considered an unqualified (simple) file name only."); + addMessage("SourceFile attribute '"+tostring(obj)+ + "' has a funny name: remember not to confuse certain parsers working on javap's output. Also, this name ('"+ + sourcefilename+"') is considered an unqualified (simple) file name only."); } } @Override @@ -792,7 +854,8 @@ public final class Pass2Verifier extends PassVerifier { String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); if (! name.equals("Deprecated")){ - throw new ClassConstraintException("The Deprecated attribute '"+tostring(obj)+"' is not correctly named 'Deprecated' but '"+name+"'."); + throw new ClassConstraintException("The Deprecated attribute '"+tostring(obj)+ + "' is not correctly named 'Deprecated' but '"+name+"'."); } } @Override @@ -800,7 +863,8 @@ public final class Pass2Verifier extends PassVerifier { checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); if (! name.equals("Synthetic")){ - throw new ClassConstraintException("The Synthetic attribute '"+tostring(obj)+"' is not correctly named 'Synthetic' but '"+name+"'."); + throw new ClassConstraintException( + "The Synthetic attribute '"+tostring(obj)+"' is not correctly named 'Synthetic' but '"+name+"'."); } } @Override @@ -812,7 +876,8 @@ public final class Pass2Verifier extends PassVerifier { String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); if (! name.equals("InnerClasses")){ - throw new ClassConstraintException("The InnerClasses attribute '"+tostring(obj)+"' is not correctly named 'InnerClasses' but '"+name+"'."); + throw new ClassConstraintException( + "The InnerClasses attribute '"+tostring(obj)+"' is not correctly named 'InnerClasses' but '"+name+"'."); } InnerClass[] ics = obj.getInnerClasses(); @@ -828,9 +893,11 @@ public final class Pass2Verifier extends PassVerifier { checkIndex(obj, innername_idx, CONST_Utf8); } int acc = ic.getInnerAccessFlags(); - acc = acc & (~ (Constants.ACC_PUBLIC | Constants.ACC_PRIVATE | Constants.ACC_PROTECTED | Constants.ACC_STATIC | Constants.ACC_FINAL | Constants.ACC_INTERFACE | Constants.ACC_ABSTRACT)); + acc = acc & (~ (Constants.ACC_PUBLIC | Constants.ACC_PRIVATE | Constants.ACC_PROTECTED | + Constants.ACC_STATIC | Constants.ACC_FINAL | Constants.ACC_INTERFACE | Constants.ACC_ABSTRACT)); if (acc != 0){ - addMessage("Unknown access flag for inner class '"+tostring(ic)+"' set (InnerClasses attribute '"+tostring(obj)+"')."); + addMessage( + "Unknown access flag for inner class '"+tostring(ic)+"' set (InnerClasses attribute '"+tostring(obj)+"')."); } } // Semantical consistency is not yet checked by Sun, see vmspec2 4.7.5. @@ -847,7 +914,8 @@ public final class Pass2Verifier extends PassVerifier { String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); if (! name.equals("ConstantValue")){ - throw new ClassConstraintException("The ConstantValue attribute '"+tostring(obj)+"' is not correctly named 'ConstantValue' but '"+name+"'."); + throw new ClassConstraintException( + "The ConstantValue attribute '"+tostring(obj)+"' is not correctly named 'ConstantValue' but '"+name+"'."); } Object pred = carrier.predecessor(); @@ -871,14 +939,16 @@ public final class Pass2Verifier extends PassVerifier { if (CONST_Double.isInstance(c) && field_type.equals(Type.DOUBLE)){ return; } - if (CONST_Integer.isInstance(c) && (field_type.equals(Type.INT) || field_type.equals(Type.SHORT) || field_type.equals(Type.CHAR) || field_type.equals(Type.BYTE) || field_type.equals(Type.BOOLEAN))){ + if (CONST_Integer.isInstance(c) && (field_type.equals(Type.INT) || field_type.equals(Type.SHORT) || + field_type.equals(Type.CHAR) || field_type.equals(Type.BYTE) || field_type.equals(Type.BOOLEAN))){ return; } if (CONST_String.isInstance(c) && field_type.equals(Type.STRING)){ return; } - throw new ClassConstraintException("Illegal type of ConstantValue '"+obj+"' embedding Constant '"+c+"'. It is referenced by field '"+tostring(f)+"' expecting a different type: '"+field_type+"'."); + throw new ClassConstraintException("Illegal type of ConstantValue '"+obj+"' embedding Constant '"+c+ + "'. It is referenced by field '"+tostring(f)+"' expecting a different type: '"+field_type+"'."); } } // SYNTHETIC: see above @@ -896,19 +966,22 @@ public final class Pass2Verifier extends PassVerifier { String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); if (! name.equals("Code")){ - throw new ClassConstraintException("The Code attribute '"+tostring(obj)+"' is not correctly named 'Code' but '"+name+"'."); + throw new ClassConstraintException( + "The Code attribute '"+tostring(obj)+"' is not correctly named 'Code' but '"+name+"'."); } Method m = null; // satisfy compiler if (!(carrier.predecessor() instanceof Method)){ - addMessage("Code attribute '"+tostring(obj)+"' is not declared in a method_info structure but in '"+carrier.predecessor()+"'. Ignored."); + addMessage("Code attribute '"+tostring(obj)+"' is not declared in a method_info structure but in '"+ + carrier.predecessor()+"'. Ignored."); return; } m = (Method) carrier.predecessor(); // we can assume this method was visited before; // i.e. the data consistency was verified. if (obj.getCode().length == 0){ - throw new ClassConstraintException("Code array of Code attribute '"+tostring(obj)+"' (method '"+m+"') must not be empty."); + throw new ClassConstraintException( + "Code array of Code attribute '"+tostring(obj)+"' (method '"+m+"') must not be empty."); } //In JustIce, the check for correct offsets into the code array is delayed to Pass 3a. @@ -918,14 +991,17 @@ public final class Pass2Verifier extends PassVerifier { if (exc_index != 0){ // if 0, it catches all Throwables checkIndex(obj, exc_index, CONST_Class); ConstantClass cc = (ConstantClass) (cp.getConstant(exc_index)); - checkIndex(cc, cc.getNameIndex(), CONST_Utf8); // cannot be sure this ConstantClass has already been visited (checked)! + // cannot be sure this ConstantClass has already been visited (checked)! + checkIndex(cc, cc.getNameIndex(), CONST_Utf8); String cname = ((ConstantUtf8) cp.getConstant(cc.getNameIndex())).getBytes().replace('/','.'); Verifier v = VerifierFactory.getVerifier(cname); VerificationResult vr = v.doPass1(); if (vr != VerificationResult.VR_OK){ - throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but it does not pass verification pass 1: "+vr); + throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+ + "') has an exception_table entry '"+tostring(element)+"' that references '"+cname+ + "' as an Exception but it does not pass verification pass 1: "+vr); } // We cannot safely trust any other "instanceof" mechanism. We need to transitively verify // the ancestor hierarchy. @@ -940,12 +1016,17 @@ public final class Pass2Verifier extends PassVerifier { v = VerifierFactory.getVerifier(e.getSuperclassName()); vr = v.doPass1(); if (vr != VerificationResult.VR_OK){ - throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but '"+e.getSuperclassName()+"' in the ancestor hierachy does not pass verification pass 1: "+vr); + throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+ + "') has an exception_table entry '"+tostring(element)+"' that references '"+cname+ + "' as an Exception but '"+e.getSuperclassName()+ + "' in the ancestor hierachy does not pass verification pass 1: "+vr); } e = Repository.lookupClass(e.getSuperclassName()); } if (e != t) { - throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+"') has an exception_table entry '"+tostring(element)+"' that references '"+cname+"' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); + throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+ + "') has an exception_table entry '"+tostring(element)+"' that references '"+cname+ + "' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); } } } @@ -962,7 +1043,8 @@ public final class Pass2Verifier extends PassVerifier { } } if (method_number < 0){ // Mmmmh. Can we be sure BCEL does not sometimes instantiate new objects? - throw new AssertionViolatedException("Could not find a known BCEL Method object in the corresponding BCEL JavaClass object."); + throw new AssertionViolatedException( + "Could not find a known BCEL Method object in the corresponding BCEL JavaClass object."); } localVariablesInfos[method_number] = new LocalVariablesInfo(obj.getMaxLocals()); @@ -972,10 +1054,12 @@ public final class Pass2Verifier extends PassVerifier { for (int a=0; a= code.getMaxLocals()){ - throw new ClassConstraintException("LocalVariableTable attribute '"+tostring(lvt)+"' references a LocalVariable '"+tostring(localvariable)+"' with an index that exceeds the surrounding Code attribute's max_locals value of '"+code.getMaxLocals()+"'."); + throw new ClassConstraintException("LocalVariableTable attribute '"+tostring(lvt)+ + "' references a LocalVariable '"+tostring(localvariable)+ + "' with an index that exceeds the surrounding Code attribute's max_locals value of '"+ + code.getMaxLocals()+"'."); } try{ - localVariablesInfos[method_number].add(localindex, localname, localvariable.getStartPC(), localvariable.getLength(), t); + localVariablesInfos[method_number].add(localindex, localname, localvariable.getStartPC(), + localvariable.getLength(), t); } catch(LocalVariableInfoInconsistentException lviie){ - throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+"' found in Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"'). "+lviie.getMessage(), lviie); + throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+ + "' found in Code attribute '"+tostring(obj)+ + "' (method '"+tostring(m)+"'). "+lviie.getMessage(), lviie); } }// for all local variables localvariables[i] in the LocalVariableTable attribute atts[a] END num_of_lvt_attribs++; if (!m.isStatic() && num_of_lvt_attribs > obj.getMaxLocals()){ - throw new ClassConstraintException("Number of LocalVariableTable attributes of Code attribute '"+tostring(obj)+"' (method '"+tostring(m)+"') exceeds number of local variable slots '"+obj.getMaxLocals()+"' ('There may be no more than one LocalVariableTable attribute per local variable in the Code attribute.')."); + throw new ClassConstraintException("Number of LocalVariableTable attributes of Code attribute '"+ + tostring(obj)+"' (method '"+tostring(m)+"') exceeds number of local variable slots '"+obj.getMaxLocals()+ + "' ('There may be at most one LocalVariableTable attribute per local variable in the Code attribute.')."); } }// if atts[a] instanceof LocalVariableTable END }// for all attributes atts[a] END @@ -1049,7 +1145,8 @@ public final class Pass2Verifier extends PassVerifier { String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); if (! name.equals("Exceptions")){ - throw new ClassConstraintException("The Exceptions attribute '"+tostring(obj)+"' is not correctly named 'Exceptions' but '"+name+"'."); + throw new ClassConstraintException( + "The Exceptions attribute '"+tostring(obj)+"' is not correctly named 'Exceptions' but '"+name+"'."); } int[] exc_indices = obj.getExceptionIndexTable(); @@ -1058,14 +1155,16 @@ public final class Pass2Verifier extends PassVerifier { checkIndex(obj, exc_indice, CONST_Class); ConstantClass cc = (ConstantClass) (cp.getConstant(exc_indice)); - checkIndex(cc, cc.getNameIndex(), CONST_Utf8); // cannot be sure this ConstantClass has already been visited (checked)! - String cname = ((ConstantUtf8) cp.getConstant(cc.getNameIndex())).getBytes().replace('/','.'); //convert internal notation on-the-fly to external notation + checkIndex(cc, cc.getNameIndex(), CONST_Utf8); // can't be sure this ConstantClass has already been visited (checked)! + //convert internal notation on-the-fly to external notation: + String cname = ((ConstantUtf8) cp.getConstant(cc.getNameIndex())).getBytes().replace('/','.'); Verifier v = VerifierFactory.getVerifier(cname); VerificationResult vr = v.doPass1(); if (vr != VerificationResult.VR_OK){ - throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but it does not pass verification pass 1: "+vr); + throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+ + "' as an Exception but it does not pass verification pass 1: "+vr); } // We cannot safely trust any other "instanceof" mechanism. We need to transitively verify // the ancestor hierarchy. @@ -1080,12 +1179,15 @@ public final class Pass2Verifier extends PassVerifier { v = VerifierFactory.getVerifier(e.getSuperclassName()); vr = v.doPass1(); if (vr != VerificationResult.VR_OK){ - throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but '"+e.getSuperclassName()+"' in the ancestor hierachy does not pass verification pass 1: "+vr); + throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+ + "' as an Exception but '"+e.getSuperclassName()+ + "' in the ancestor hierachy does not pass verification pass 1: "+vr); } e = Repository.lookupClass(e.getSuperclassName()); } if (e != t) { - throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+"' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); + throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+ + "' as an Exception but it is not a subclass of '"+t.getClassName()+"'."); } } @@ -1105,7 +1207,8 @@ public final class Pass2Verifier extends PassVerifier { String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); if (! name.equals("LineNumberTable")){ - throw new ClassConstraintException("The LineNumberTable attribute '"+tostring(obj)+"' is not correctly named 'LineNumberTable' but '"+name+"'."); + throw new ClassConstraintException("The LineNumberTable attribute '"+tostring(obj)+ + "' is not correctly named 'LineNumberTable' but '"+name+"'."); } //In JustIce,this check is delayed to Pass 3a. @@ -1227,7 +1330,7 @@ public final class Pass2Verifier extends PassVerifier { throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); } - String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method sig.(=descriptor) try{ Type.getType(sig); /* Don't need the return value */ @@ -1246,7 +1349,8 @@ public final class Pass2Verifier extends PassVerifier { ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name if (!validClassMethodName(name)){ - throw new ClassConstraintException("Invalid (non-interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); + throw new ClassConstraintException( + "Invalid (non-interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); } int class_index = obj.getClassIndex(); @@ -1256,7 +1360,7 @@ public final class Pass2Verifier extends PassVerifier { throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); } - String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method sig.(=descriptor) try{ Type t = Type.getReturnType(sig); @@ -1288,12 +1392,14 @@ public final class Pass2Verifier extends PassVerifier { throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); } - String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method signature(=descriptor) + String sig = ((ConstantUtf8) (cp.getConstant(cnat.getSignatureIndex()))).getBytes(); // Field or Method sig.(=descriptor) try{ Type t = Type.getReturnType(sig); if ( name.equals(Constants.STATIC_INITIALIZER_NAME) && (t != Type.VOID) ){ - addMessage("Class or interface initialization method '"+Constants.STATIC_INITIALIZER_NAME+"' usually has VOID return type instead of '"+t+"'. Note this is really not a requirement of The Java Virtual Machine Specification, Second Edition."); + addMessage("Class or interface initialization method '"+Constants.STATIC_INITIALIZER_NAME+ + "' usually has VOID return type instead of '"+t+ + "'. Note this is really not a requirement of The Java Virtual Machine Specification, Second Edition."); } } catch (ClassFormatException cfe){ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java index 72bc9e41..47a114cc 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java @@ -122,9 +122,15 @@ public final class Pass3aVerifier extends PassVerifier{ */ private final int method_no; - /** The one and only InstructionList object used by an instance of this class. It's here for performance reasons by do_verify() and its callees. */ + /** + * The one and only InstructionList object used by an instance of this class. + * It's here for performance reasons by do_verify() and its callees. + */ InstructionList instructionList; - /** The one and only Code object used by an instance of this class. It's here for performance reasons by do_verify() and its callees. */ + /** + * The one and only Code object used by an instance of this class. + * It's here for performance reasons by do_verify() and its callees. + */ Code code; /** Should only be instantiated by a Verifier. */ @@ -182,7 +188,8 @@ public final class Pass3aVerifier extends PassVerifier{ instructionList = new InstructionList(method.getCode().getCode()); } catch(RuntimeException re){ - return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Bad bytecode in the code array of the Code attribute of method '"+method+"'."); + return new VerificationResult(VerificationResult.VERIFIED_REJECTED, + "Bad bytecode in the code array of the Code attribute of method '"+method+"'."); } instructionList.setPositions(true); @@ -244,14 +251,18 @@ public final class Pass3aVerifier extends PassVerifier{ int offset = lineNumber.getStartPC(); if (instructionPosition == offset) { if (offsets.contains(offset)) { - addMessage("LineNumberTable attribute '" + code.getLineNumberTable() + "' refers to the same code offset ('" + offset + "') more than once which is violating the semantics [but is sometimes produced by IBM's 'jikes' compiler]."); + addMessage("LineNumberTable attribute '" + code.getLineNumberTable() + + "' refers to the same code offset ('" + offset + "') more than once" + + " which is violating the semantics [but is sometimes produced by IBM's 'jikes' compiler]."); } else { offsets.add(offset); } continue lineNumber_loop; } } - throw new ClassConstraintException("Code attribute '" + code + "' has a LineNumberTable attribute '" + code.getLineNumberTable() + "' referring to a code offset ('" + lineNumber.getStartPC() + "') that does not exist."); + throw new ClassConstraintException("Code attribute '" + code + "' has a LineNumberTable attribute '" + + code.getLineNumberTable() + + "' referring to a code offset ('" + lineNumber.getStartPC() + "') that does not exist."); } } @@ -296,16 +307,21 @@ public final class Pass3aVerifier extends PassVerifier{ int endpc = element.getEndPC(); int handlerpc = element.getHandlerPC(); if (startpc >= endpc){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has its start_pc ('"+startpc+"') not smaller than its end_pc ('"+endpc+"')."); + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+ + "' that has its start_pc ('"+startpc+"') not smaller than its end_pc ('"+endpc+"')."); } if (!contains(instructionPositions, startpc)){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has a non-existant bytecode offset as its start_pc ('"+startpc+"')."); + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+ + "' that has a non-existant bytecode offset as its start_pc ('"+startpc+"')."); } if ( (!contains(instructionPositions, endpc)) && (endpc != codeLength)){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has a non-existant bytecode offset as its end_pc ('"+startpc+"') [that is also not equal to code_length ('"+codeLength+"')]."); + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+ + "' that has a non-existant bytecode offset as its end_pc ('"+startpc+ + "') [that is also not equal to code_length ('"+codeLength+"')]."); } if (!contains(instructionPositions, handlerpc)){ - throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+"' that has a non-existant bytecode offset as its handler_pc ('"+handlerpc+"')."); + throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+ + "' that has a non-existant bytecode offset as its handler_pc ('"+handlerpc+"')."); } } } @@ -325,7 +341,8 @@ public final class Pass3aVerifier extends PassVerifier{ // interpreting them as code[]). So this must not be checked again here. if (! (code.getCode().length < 65536)){// contradicts vmspec2 page 152 ("Limitations"), but is on page 134. - throw new StaticCodeInstructionConstraintException("Code array in code attribute '"+code+"' too big: must be smaller than 65536 bytes."); + throw new StaticCodeInstructionConstraintException( + "Code array in code attribute '"+code+"' too big: must be smaller than 65536 bytes."); } // First opcode at offset 0: okay, that's clear. Nothing to do. @@ -347,13 +364,16 @@ public final class Pass3aVerifier extends PassVerifier{ while (ih != null){ Instruction i = ih.getInstruction(); if (i instanceof IMPDEP1){ - throw new StaticCodeInstructionConstraintException("IMPDEP1 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); + throw new StaticCodeInstructionConstraintException( + "IMPDEP1 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); } if (i instanceof IMPDEP2){ - throw new StaticCodeInstructionConstraintException("IMPDEP2 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); + throw new StaticCodeInstructionConstraintException( + "IMPDEP2 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); } if (i instanceof BREAKPOINT){ - throw new StaticCodeInstructionConstraintException("BREAKPOINT must not be in the code, it is an illegal instruction for _internal_ JVM use!"); + throw new StaticCodeInstructionConstraintException( + "BREAKPOINT must not be in the code, it is an illegal instruction for _internal_ JVM use!"); } ih = ih.getNext(); } @@ -367,7 +387,10 @@ public final class Pass3aVerifier extends PassVerifier{ (last instanceof RET) || (last instanceof GotoInstruction) || (last instanceof ATHROW) )) { - throw new StaticCodeInstructionConstraintException("Execution must not fall off the bottom of the code array. This constraint is enforced statically as some existing verifiers do - so it may be a false alarm if the last instruction is not reachable."); + throw new StaticCodeInstructionConstraintException( + "Execution must not fall off the bottom of the code array."+ + " This constraint is enforced statically as some existing verifiers do"+ + " - so it may be a false alarm if the last instruction is not reachable."); } } @@ -405,10 +428,14 @@ public final class Pass3aVerifier extends PassVerifier{ if (i instanceof JsrInstruction){ InstructionHandle target = ((JsrInstruction) i).getTarget(); if (target == instructionList.getStart()){ - throw new StaticCodeInstructionOperandConstraintException("Due to JustIce's clear definition of subroutines, no JSR or JSR_W may have a top-level instruction (such as the very first instruction, which is targeted by instruction '"+ih+"' as its target."); + throw new StaticCodeInstructionOperandConstraintException( + "Due to JustIce's clear definition of subroutines, no JSR or JSR_W may have a top-level instruction"+ + " (such as the very first instruction, which is targeted by instruction '"+ih+"' as its target."); } if (!(target.getInstruction() instanceof ASTORE)){ - throw new StaticCodeInstructionOperandConstraintException("Due to JustIce's clear definition of subroutines, no JSR or JSR_W may target anything else than an ASTORE instruction. Instruction '"+ih+"' targets '"+target+"'."); + throw new StaticCodeInstructionOperandConstraintException( + "Due to JustIce's clear definition of subroutines, no JSR or JSR_W may target anything else"+ + " than an ASTORE instruction. Instruction '"+ih+"' targets '"+target+"'."); } } @@ -496,7 +523,8 @@ public final class Pass3aVerifier extends PassVerifier{ Verifier v = VerifierFactory.getVerifier(t.getClassName()); VerificationResult vr = v.doPass1(); if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded: '"+vr+"'."); + constraintViolated((Instruction) o, + "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded: '"+vr+"'."); } } } @@ -521,7 +549,8 @@ public final class Pass3aVerifier extends PassVerifier{ if (! ( (c instanceof ConstantInteger) || (c instanceof ConstantFloat) || (c instanceof ConstantString) ) ){ - constraintViolated(o, "Operand of LDC or LDC_W must be one of CONSTANT_Integer, CONSTANT_Float or CONSTANT_String, but is '"+c+"'."); + constraintViolated(o, + "Operand of LDC or LDC_W must be one of CONSTANT_Integer, CONSTANT_Float or CONSTANT_String, but is '"+c+"'."); } } } @@ -616,7 +645,8 @@ public final class Pass3aVerifier extends PassVerifier{ // Argh. Sun's implementation allows us to have multiple fields of // the same name but with a different signature. //if (! f_type.equals(o_type)){ - // constraintViolated(o, "Referenced field '"+field_name+"' has type '"+f_type+"' instead of '"+o_type+"' as expected."); + // constraintViolated(o, + // "Referenced field '"+field_name+"' has type '"+f_type+"' instead of '"+o_type+"' as expected."); //} /* TODO: Check for access modifiers here. */ @@ -646,7 +676,9 @@ public final class Pass3aVerifier extends PassVerifier{ constraintViolated(o, "Only INVOKESPECIAL is allowed to invoke instance initialization methods."); } if ( (! (cutf8.getBytes().equals(Constants.CONSTRUCTOR_NAME)) ) && (cutf8.getBytes().startsWith("<")) ){ - constraintViolated(o, "No method with a name beginning with '<' other than the instance initialization methods may be called by the method invocation instructions."); + constraintViolated(o, + "No method with a name beginning with '<' other than the instance initialization methods"+ + " may be called by the method invocation instructions."); } } } @@ -661,7 +693,8 @@ public final class Pass3aVerifier extends PassVerifier{ // By now, BCEL hides those two operands because they're superfluous. // Invoked method must not be or - ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantInterfaceMethodref)c).getNameAndTypeIndex())); + ConstantNameAndType cnat = + (ConstantNameAndType) (cpg.getConstant(((ConstantInterfaceMethodref)c).getNameAndTypeIndex())); String name = ((ConstantUtf8) (cpg.getConstant(cnat.getNameIndex()))).getBytes(); if (name.equals(Constants.CONSTRUCTOR_NAME)){ constraintViolated(o, "Method to invoke must not be '"+Constants.CONSTRUCTOR_NAME+"'."); @@ -695,7 +728,8 @@ public final class Pass3aVerifier extends PassVerifier{ Verifier v = VerifierFactory.getVerifier(((ObjectType) t).getClassName()); VerificationResult vr = v.doPass2(); if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated(o, "Argument type class/interface could not be verified successfully: '"+vr.getMessage()+"'."); + constraintViolated(o, + "Argument type class/interface could not be verified successfully: '"+vr.getMessage()+"'."); } } } @@ -756,11 +790,14 @@ public final class Pass3aVerifier extends PassVerifier{ if (t instanceof ArrayType){ int dimensions = ((ArrayType) t).getDimensions(); if (dimensions < dimensions2create){ - constraintViolated(o, "Not allowed to create array with more dimensions ('+dimensions2create+') than the one referenced by the CONSTANT_Class '"+t+"'."); + constraintViolated(o, + "Not allowed to create array with more dimensions ('"+dimensions2create+ + "') than the one referenced by the CONSTANT_Class '"+t+"'."); } } else{ - constraintViolated(o, "Expecting a CONSTANT_Class referencing an array type. [Constraint not found in The Java Virtual Machine Specification, Second Edition, 4.8.1]"); + constraintViolated(o, "Expecting a CONSTANT_Class referencing an array type."+ + " [Constraint not found in The Java Virtual Machine Specification, Second Edition, 4.8.1]"); } } @@ -922,7 +959,8 @@ public final class Pass3aVerifier extends PassVerifier{ public void visitLLOAD(LLOAD o){ int idx = o.getIndex(); if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + constraintViolated(o, "Index '"+idx+"' must be non-negative."+ + " [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); } else{ int maxminus2 = max_locals()-2; @@ -937,7 +975,8 @@ public final class Pass3aVerifier extends PassVerifier{ public void visitDLOAD(DLOAD o){ int idx = o.getIndex(); if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + constraintViolated(o, "Index '"+idx+"' must be non-negative."+ + " [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); } else{ int maxminus2 = max_locals()-2; @@ -952,7 +991,8 @@ public final class Pass3aVerifier extends PassVerifier{ public void visitLSTORE(LSTORE o){ int idx = o.getIndex(); if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + constraintViolated(o, "Index '"+idx+"' must be non-negative."+ + " [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); } else{ int maxminus2 = max_locals()-2; @@ -967,7 +1007,8 @@ public final class Pass3aVerifier extends PassVerifier{ public void visitDSTORE(DSTORE o){ int idx = o.getIndex(); if (idx < 0){ - constraintViolated(o, "Index '"+idx+"' must be non-negative. [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); + constraintViolated(o, "Index '"+idx+"' must be non-negative."+ + " [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); } else{ int maxminus2 = max_locals()-2; @@ -1022,8 +1063,9 @@ public final class Pass3aVerifier extends PassVerifier{ if (f.isFinal()){ if (!(myOwner.getClassName().equals(getObjectType(o).getClassName()))){ - constraintViolated(o, "Referenced field '"+f+"' is final and must therefore be declared in the current class '"+myOwner.getClassName() - +"' which is not the case: it is declared in '"+o.getReferenceType(cpg)+"'."); + constraintViolated(o, + "Referenced field '"+f+"' is final and must therefore be declared in the current class '"+ + myOwner.getClassName()+"' which is not the case: it is declared in '"+o.getReferenceType(cpg)+"'."); } } @@ -1098,7 +1140,8 @@ public final class Pass3aVerifier extends PassVerifier{ JavaClass jc = Repository.lookupClass(classname); Method m = getMethodRecursive(jc, o); if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'."); + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+ + "' not found in class '"+jc.getClassName()+"'."); } if (jc.isClass()){ constraintViolated(o, "Referenced class '"+jc.getClassName()+"' is a class, but not an interface as expected."); @@ -1110,7 +1153,8 @@ public final class Pass3aVerifier extends PassVerifier{ } /** - * Looks for the method referenced by the given invoke instruction in the given class or its super classes and super interfaces. + * Looks for the method referenced by the given invoke instruction in the given class + * or its super classes and super interfaces. * @param jc the class that defines the referenced method * @param invoke the instruction that references the method * @return the referenced method or null if not found. @@ -1173,7 +1217,8 @@ public final class Pass3aVerifier extends PassVerifier{ JavaClass jc = Repository.lookupClass(classname); Method m = getMethodRecursive(jc, o); if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'."); + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg) + +"' not found in class '"+jc.getClassName()+"'."); } JavaClass current = Repository.lookupClass(myOwner.getClassName()); @@ -1205,7 +1250,8 @@ public final class Pass3aVerifier extends PassVerifier{ } } if (meth == null){ - constraintViolated(o, "ACC_SUPER special lookup procedure not successful: method '"+o.getMethodName(cpg)+"' with proper signature not declared in superclass hierarchy."); + constraintViolated(o, "ACC_SUPER special lookup procedure not successful: method '"+ + o.getMethodName(cpg)+"' with proper signature not declared in superclass hierarchy."); } } } @@ -1230,7 +1276,8 @@ public final class Pass3aVerifier extends PassVerifier{ JavaClass jc = Repository.lookupClass(classname); Method m = getMethodRecursive(jc, o); if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg) +"' not found in class '"+jc.getClassName()+"'."); + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+ + o.getSignature(cpg) +"' not found in class '"+jc.getClassName()+"'."); } else if (! (m.isStatic())){ // implies it's not abstract, verified in pass 2. constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' has ACC_STATIC unset."); } @@ -1254,7 +1301,8 @@ public final class Pass3aVerifier extends PassVerifier{ JavaClass jc = Repository.lookupClass(classname); Method m = getMethodRecursive(jc, o); if (m == null){ - constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'."); + constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+ + o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'."); } if (! (jc.isClass())){ constraintViolated(o, "Referenced class '"+jc.getClassName()+"' is an interface, but not a class as expected."); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java index 18101604..b8519cba 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java @@ -99,7 +99,8 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp // If some new "Node" is defined in BCEL (such as some concrete "Attribute"), we // want to know that this class has also to be adapted. if (tostring == null) { - throw new AssertionViolatedException("Please adapt '" + getClass() + "' to deal with objects of class '" + n.getClass() + "'."); + throw new AssertionViolatedException( + "Please adapt '" + getClass() + "' to deal with objects of class '" + n.getClass() + "'."); } return tostring; } @@ -114,7 +115,10 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp try { ret = obj.toString(); } - catch (RuntimeException e) { // including ClassFormatException, trying to convert the "signature" of a ReturnaddressType LocalVariable (shouldn't occur, but people do crazy things) + + catch (RuntimeException e) { + // including ClassFormatException, trying to convert the "signature" of a ReturnaddressType LocalVariable + // (shouldn't occur, but people do crazy things) String s = obj.getClass().getName(); s = s.substring(s.lastIndexOf(".") + 1); ret = "<<" + s + ">>"; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java index df10f119..0cd3d7f0 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java @@ -127,7 +127,8 @@ public class ControlFlowGraph{ org = outFrames.get(jsr); if (org == null){ - throw new AssertionViolatedException("outFrame not set! This:\n"+this+"\nExecutionChain: "+getExecutionChain()+"\nOutFrames: '"+outFrames+"'."); + throw new AssertionViolatedException( + "outFrame not set! This:\n"+this+"\nExecutionChain: "+getExecutionChain()+"\nOutFrames: '"+outFrames+"'."); } return org.getClone(); } @@ -333,7 +334,8 @@ public class ControlFlowGraph{ if (inst instanceof RET){ Subroutine s = subroutines.subroutineOf(getInstruction()); - if (s==null){ //return empty; // RET in dead code. "empty" would be the correct answer, but we know something about the surrounding project... + if (s==null){ //return empty; + // RET in dead code. "empty" would be the correct answer, but we know something about the surrounding project... throw new AssertionViolatedException("Asking for successors of a RET in dead code?!"); } @@ -404,7 +406,7 @@ public class ControlFlowGraph{ private final ExceptionHandlers exceptionhandlers; /** All InstructionContext instances of this ControlFlowGraph. */ - private final Map instructionContexts = new HashMap<>(); //keys: InstructionHandle, values: InstructionContextImpl + private final Map instructionContexts = new HashMap<>(); /** * A Control Flow Graph. diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java index c537c5f7..ce6d238a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java @@ -109,7 +109,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ */ private void constraintViolated(Instruction violator, String description){ String fq_classname = violator.getClass().getName(); - throw new StructuralCodeConstraintException("Instruction "+ fq_classname.substring(fq_classname.lastIndexOf('.')+1) +" constraint violated: " + description); + throw new StructuralCodeConstraintException( + "Instruction "+ fq_classname.substring(fq_classname.lastIndexOf('.')+1) +" constraint violated: " + description); } /** @@ -123,7 +124,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ */ public void setFrame(Frame f){ // TODO could be package-protected? this.frame = f; - //if (singleInstance.mg == null || singleInstance.cpg == null) throw new AssertionViolatedException("Forgot to set important values first."); + //if (singleInstance.mg == null || singleInstance.cpg == null) + // throw new AssertionViolatedException("Forgot to set important values first."); } /** @@ -204,12 +206,14 @@ public class InstConstraintVisitor extends EmptyVisitor{ private void _visitStackAccessor(Instruction o){ int consume = o.consumeStack(cpg); // Stack values are always consumed first; then produced. if (consume > stack().slotsUsed()){ - constraintViolated(o, "Cannot consume "+consume+" stack slots: only "+stack().slotsUsed()+" slot(s) left on stack!\nStack:\n"+stack()); + constraintViolated(o, + "Cannot consume "+consume+" stack slots: only "+stack().slotsUsed()+" slot(s) left on stack!\nStack:\n"+stack()); } int produce = o.produceStack(cpg) - o.consumeStack(cpg); // Stack values are always consumed first; then produced. if ( produce + stack().slotsUsed() > stack().maxStack() ){ - constraintViolated(o, "Cannot produce "+produce+" stack slots: only "+(stack().maxStack()-stack().slotsUsed())+" free stack slot(s) left.\nStack:\n"+stack()); + constraintViolated(o, "Cannot produce "+produce+" stack slots: only "+(stack().maxStack()-stack().slotsUsed())+ + " free stack slot(s) left.\nStack:\n"+stack()); } } @@ -230,7 +234,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ Verifier v = VerifierFactory.getVerifier(t.getClassName()); VerificationResult vr = v.doPass2(); if (vr.getStatus() != VerificationResult.VERIFIED_OK){ - constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); + constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+ + "' is referenced, but cannot be loaded and resolved: '"+vr+"'."); } } } @@ -264,7 +269,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ public void visitCPInstruction(CPInstruction o){ int idx = o.getIndex(); if ((idx < 0) || (idx >= cpg.getSize())){ - throw new AssertionViolatedException("Huh?! Constant pool index of instruction '"+o+"' illegal? Pass 3a should have checked this!"); + throw new AssertionViolatedException( + "Huh?! Constant pool index of instruction '"+o+"' illegal? Pass 3a should have checked this!"); } } @@ -279,7 +285,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ // A FieldInstruction may be: GETFIELD, GETSTATIC, PUTFIELD, PUTSTATIC Constant c = cpg.getConstant(o.getIndex()); if (!(c instanceof ConstantFieldref)){ - constraintViolated(o, "Index '"+o.getIndex()+"' should refer to a CONSTANT_Fieldref_info structure, but refers to '"+c+"'."); + constraintViolated(o, + "Index '"+o.getIndex()+"' should refer to a CONSTANT_Fieldref_info structure, but refers to '"+c+"'."); } // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). Type t = o.getType(cpg); @@ -340,19 +347,23 @@ public class InstConstraintVisitor extends EmptyVisitor{ // [suppose some instruction put an int at N+1--- our double at N is defective] if (o.getType(cpg).getSize() == 2){ if (locals().get(o.getIndex()+1) != Type.UNKNOWN){ - constraintViolated(o, "Reading a two-locals value from local variables "+o.getIndex()+" and "+(o.getIndex()+1)+" where the latter one is destroyed."); + constraintViolated(o, + "Reading a two-locals value from local variables "+o.getIndex()+ + " and "+(o.getIndex()+1)+" where the latter one is destroyed."); } } // LOAD instructions must read the correct type. if (!(o instanceof ALOAD)){ if (locals().get(o.getIndex()) != o.getType(cpg) ){ - constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+locals().get(o.getIndex())+"'; Instruction type: '"+o.getType(cpg)+"'."); + constraintViolated(o,"Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+ + locals().get(o.getIndex())+"'; Instruction type: '"+o.getType(cpg)+"'."); } } else{ // we deal with an ALOAD if (!(locals().get(o.getIndex()) instanceof ReferenceType)){ - constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+locals().get(o.getIndex())+"'; Instruction expects a ReferenceType."); + constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+ + locals().get(o.getIndex())+"'; Instruction expects a ReferenceType."); } // ALOAD __IS ALLOWED__ to put uninitialized objects onto the stack! //referenceTypeIsInitialized(o, (ReferenceType) (locals().get(o.getIndex()))); @@ -371,19 +382,21 @@ public class InstConstraintVisitor extends EmptyVisitor{ public void visitStoreInstruction(StoreInstruction o){ //visitLocalVariableInstruction(o) is called before, because it is more generic. - if (stack().isEmpty()){ // Don't bother about 1 or 2 stack slots used. This check is implicitely done below while type checking. + if (stack().isEmpty()){ // Don't bother about 1 or 2 stack slots used. This check is implicitly done below while type checking. constraintViolated(o, "Cannot STORE: Stack to read from is empty."); } if ( (!(o instanceof ASTORE)) ){ if (! (stack().peek() == o.getType(cpg)) ){// the other xSTORE types are singletons in BCEL. - constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction type: '"+o.getType(cpg)+"'."); + constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+ + "'; Instruction type: '"+o.getType(cpg)+"'."); } } else{ // we deal with ASTORE Type stacktop = stack().peek(); if ( (!(stacktop instanceof ReferenceType)) && (!(stacktop instanceof ReturnaddressType)) ){ - constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+"'; Instruction expects a ReferenceType or a ReturnadressType."); + constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+ + "'; Instruction expects a ReferenceType or a ReturnadressType."); } //if (stacktop instanceof ReferenceType){ // referenceTypeIsInitialized(o, (ReferenceType) stacktop); @@ -427,12 +440,14 @@ public class InstConstraintVisitor extends EmptyVisitor{ // TODO: This can only be checked if using Staerk-et-al's "set of object types" instead of a // "wider cast object type" created during verification. //if (! (objectref.isAssignmentCompatibleWith(mg.getType())) ){ - // constraintViolated(o, "Type on stack top which should be returned is a '"+stack().peek()+"' which is not assignment compatible with the return type of this method, '"+mg.getType()+"'."); + // constraintViolated(o, "Type on stack top which should be returned is a '"+stack().peek()+ + // "' which is not assignment compatible with the return type of this method, '"+mg.getType()+"'."); //} } else{ if (! ( method_type.equals( stack().peek() ))){ - constraintViolated(o, "Current method has return type of '"+mg.getType()+"' expecting a '"+method_type+"' on top of the stack. But stack top is a '"+stack().peek()+"'."); + constraintViolated(o, "Current method has return type of '"+mg.getType()+"' expecting a '"+method_type+ + "' on top of the stack. But stack top is a '"+stack().peek()+"'."); } } } @@ -452,7 +467,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ indexOfInt(o, index); if (arrayrefOfArrayType(o, arrayref)){ if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); + constraintViolated(o, + "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+ + ((ArrayType) arrayref).getElementType()+"."); } //referenceTypeIsInitialized(o, (ReferenceType) (((ArrayType) arrayref).getElementType())); } @@ -477,7 +494,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ // of an uninitialized object type. if (arrayrefOfArrayType(o, arrayref)){ if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+((ArrayType) arrayref).getElementType()+"."); + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+ + ((ArrayType) arrayref).getElementType()+"."); } // No check for array element assignment compatibility. This is done at runtime. } @@ -528,7 +546,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ // It cannot be done using Staerk-et-al's "set of object types" instead of a // "wider cast object type", anyway. //if (! objectref.isAssignmentCompatibleWith(mg.getReturnType() )){ - // constraintViolated(o, "The 'objectref' type "+objectref+" at the stack top is not assignment compatible with the return type '"+mg.getReturnType()+"' of the method."); + // constraintViolated(o, "The 'objectref' type "+objectref+ + // " at the stack top is not assignment compatible with the return type '"+mg.getReturnType()+"' of the method."); //} } @@ -574,7 +593,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ ObjectType exc = (ObjectType) (stack().peek()); ObjectType throwable = (ObjectType) (Type.getType("Ljava/lang/Throwable;")); if ( (! (exc.subclassOf(throwable)) ) && (! (exc.equals(throwable))) ){ - constraintViolated(o, "The 'objectref' is not of class Throwable or of a subclass of Throwable, but of '"+stack().peek()+"'."); + constraintViolated(o, + "The 'objectref' is not of class Throwable or of a subclass of Throwable, but of '"+stack().peek()+"'."); } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this @@ -593,7 +613,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ if (arrayrefOfArrayType(o, arrayref)){ if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ){ - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); + constraintViolated(o, + "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+ + ((ArrayType) arrayref).getElementType()+"'."); } } } @@ -612,7 +634,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ if (arrayrefOfArrayType(o, arrayref)){ if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ) { - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+((ArrayType) arrayref).getElementType()+"'."); + constraintViolated(o, + "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+ + ((ArrayType) arrayref).getElementType()+"'."); } } } @@ -630,7 +654,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ */ @Override public void visitBREAKPOINT(BREAKPOINT o){ - throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as BREAKPOINT."); + throw new AssertionViolatedException( + "In this JustIce verification pass there should not occur an illegal instruction such as BREAKPOINT."); } /** @@ -658,7 +683,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ valueOfInt(o, value); if (arrayrefOfArrayType(o, arrayref)){ if (! ((ArrayType) arrayref).getElementType().equals(Type.CHAR) ){ - constraintViolated(o, "The 'arrayref' does not refer to an array with elements of type char but to an array of type "+((ArrayType) arrayref).getElementType()+"."); + constraintViolated(o, "The 'arrayref' does not refer to an array with elements of type char but to an array of type "+ + ((ArrayType) arrayref).getElementType()+"."); } } } @@ -899,7 +925,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ @Override public void visitDUP(DUP o){ if (stack().peek().getSize() != 1){ - constraintViolated(o, "Won't DUP type on stack top '"+stack().peek()+"' because it must occupy exactly one slot, not '"+stack().peek().getSize()+"'."); + constraintViolated(o, "Won't DUP type on stack top '"+stack().peek()+ + "' because it must occupy exactly one slot, not '"+stack().peek().getSize()+"'."); } } @@ -909,10 +936,13 @@ public class InstConstraintVisitor extends EmptyVisitor{ @Override public void visitDUP_X1(DUP_X1 o){ if (stack().peek().getSize() != 1){ - constraintViolated(o, "Type on stack top '"+stack().peek()+"' should occupy exactly one slot, not '"+stack().peek().getSize()+"'."); + constraintViolated(o, + "Type on stack top '"+stack().peek()+"' should occupy exactly one slot, not '"+stack().peek().getSize()+"'."); } if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "Type on stack next-to-top '"+stack().peek(1)+"' should occupy exactly one slot, not '"+stack().peek(1).getSize()+"'."); + constraintViolated(o, + "Type on stack next-to-top '"+stack().peek(1)+ + "' should occupy exactly one slot, not '"+stack().peek(1).getSize()+"'."); } } @@ -922,14 +952,18 @@ public class InstConstraintVisitor extends EmptyVisitor{ @Override public void visitDUP_X2(DUP_X2 o){ if (stack().peek().getSize() != 1){ - constraintViolated(o, "Stack top type must be of size 1, but is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); + constraintViolated(o, + "Stack top type must be of size 1, but is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); } if (stack().peek(1).getSize() == 2){ return; // Form 2, okay. } //stack().peek(1).getSize == 1. if (stack().peek(2).getSize() != 1){ - constraintViolated(o, "If stack top's size is 1 and stack next-to-top's size is 1, stack next-to-next-to-top's size must also be 1, but is: '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + constraintViolated(o, + "If stack top's size is 1 and stack next-to-top's size is 1,"+ + " stack next-to-next-to-top's size must also be 1, but is: '"+ + stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); } } @@ -943,7 +977,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ } //stack().peek().getSize() == 1. if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); + constraintViolated(o, + "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+ + "' of size '"+stack().peek(1).getSize()+"'."); } } @@ -954,7 +990,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ public void visitDUP2_X1(DUP2_X1 o){ if (stack().peek().getSize() == 2){ if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "If stack top's size is 2, then stack next-to-top's size must be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); + constraintViolated(o, "If stack top's size is 2, then stack next-to-top's size must be 1. But it is '"+ + stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); } else{ return; // Form 2 @@ -962,10 +999,12 @@ public class InstConstraintVisitor extends EmptyVisitor{ } else{ // stack top is of size 1 if ( stack().peek(1).getSize() != 1 ){ - constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); + constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+ + stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); } if ( stack().peek(2).getSize() != 1 ){ - constraintViolated(o, "If stack top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + constraintViolated(o, "If stack top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+ + stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); } } } @@ -982,7 +1021,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ } // stack top size is 2, next-to-top's size is 1 if ( stack().peek(2).getSize() != 1 ){ - constraintViolated(o, "If stack top's size is 2 and stack-next-to-top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); + constraintViolated(o, "If stack top's size is 2 and stack-next-to-top's size is 1,"+ + " then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+ + "' of size '"+stack().peek(2).getSize()+"'."); } else{ return; // Form 2 @@ -1291,7 +1332,10 @@ public class InstConstraintVisitor extends EmptyVisitor{ //TODO: One day move to Staerk-et-al's "Set of object types" instead of "wider" object types // created during the verification. // "Wider" object types don't allow us to check for things like that below. - //constraintViolated(o, "The referenced field has the ACC_PROTECTED modifier, and it's a member of the current class or a superclass of the current class. However, the referenced object type '"+stack().peek()+"' is not the current class or a subclass of the current class."); + //constraintViolated(o, "The referenced field has the ACC_PROTECTED modifier, "+ + // "and it's a member of the current class or a superclass of the current class."+ + // " However, the referenced object type '"+stack().peek()+ + // "' is not the current class or a subclass of the current class."); } } } @@ -1695,7 +1739,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ */ @Override public void visitIMPDEP1(IMPDEP1 o){ - throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP1."); + throw new AssertionViolatedException( + "In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP1."); } /** @@ -1703,7 +1748,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ */ @Override public void visitIMPDEP2(IMPDEP2 o){ - throw new AssertionViolatedException("In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP2."); + throw new AssertionViolatedException( + "In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP2."); } /** @@ -1807,7 +1853,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ // TODO: This can only be checked when using Staerk-et-al's "set of object types" // instead of a "wider cast object type" created during verification. //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+ + // "' on the stack (which is not assignment compatible)."); //} referenceTypeIsInitialized(o, rFromStack); } @@ -1826,8 +1873,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ } referenceTypeIsInitialized(o, (ReferenceType) objref); if (!(objref instanceof ObjectType)){ - if (!(objref instanceof ArrayType)){ - constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType + if (!(objref instanceof ArrayType)){ // could be a ReturnaddressType + constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); } else{ objref = GENERIC_ARRAY; @@ -1858,8 +1905,12 @@ public class InstConstraintVisitor extends EmptyVisitor{ public void visitINVOKESPECIAL(INVOKESPECIAL o){ try { // Don't init an object twice. - if ( (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME)) && (!(stack().peek(o.getArgumentTypes(cpg).length) instanceof UninitializedObjectType)) ){ - constraintViolated(o, "Possibly initializing object twice. A valid instruction sequence must not have an uninitialized object on the operand stack or in a local variable during a backwards branch, or in a local variable in code protected by an exception handler. Please see The Java Virtual Machine Specification, Second Edition, 4.9.4 (pages 147 and 148) for details."); + if ( (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME)) && + (!(stack().peek(o.getArgumentTypes(cpg).length) instanceof UninitializedObjectType)) ){ + constraintViolated(o, "Possibly initializing object twice."+ + " A valid instruction sequence must not have an uninitialized object on the operand stack or in a local variable"+ + " during a backwards branch, or in a local variable in code protected by an exception handler."+ + " Please see The Java Virtual Machine Specification, Second Edition, 4.9.4 (pages 147 and 148) for details."); } // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). @@ -1894,7 +1945,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ // TODO: This can only be checked using Staerk-et-al's "set of object types", not // using a "wider cast object type". if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+ + "' on the stack (which is not assignment compatible)."); } referenceTypeIsInitialized(o, rFromStack); } @@ -1915,8 +1967,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ if ( !(o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME))){ referenceTypeIsInitialized(o, (ReferenceType) objref); if (!(objref instanceof ObjectType)){ - if (!(objref instanceof ArrayType)){ - constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType + if (!(objref instanceof ArrayType)){ // could be a ReturnaddressType + constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); } else{ objref = GENERIC_ARRAY; @@ -1927,7 +1979,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ } else{ if (!(objref instanceof UninitializedObjectType)){ - constraintViolated(o, "Expecting an UninitializedObjectType as 'objectref' on the stack, not a '"+objref+"'. Otherwise, you couldn't invoke a method since an array has no methods (not to speak of a return address)."); + constraintViolated(o, "Expecting an UninitializedObjectType as 'objectref' on the stack, not a '"+objref+ + "'. Otherwise, you couldn't invoke a method since an array has no methods (not to speak of a return address)."); } objref_classname = ((UninitializedObjectType) objref).getInitialized().getClassName(); } @@ -1981,7 +2034,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ // TODO: This check can possibly only be done using Staerk-et-al's "set of object types" // instead of a "wider cast object type" created during verification. if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+ + "' on the stack (which is not assignment compatible)."); } referenceTypeIsInitialized(o, rFromStack); } @@ -2034,7 +2088,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ // TODO: This can possibly only be checked when using Staerk-et-al's "set of object types" instead // of a single "wider cast object type" created during verification. if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ - constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+"' on the stack (which is not assignment compatible)."); + constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+ + "' on the stack (which is not assignment compatible)."); } referenceTypeIsInitialized(o, rFromStack); } @@ -2053,8 +2108,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ } referenceTypeIsInitialized(o, (ReferenceType) objref); if (!(objref instanceof ObjectType)){ - if (!(objref instanceof ArrayType)){ - constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); // could be a ReturnaddressType + if (!(objref instanceof ArrayType)){ // could be a ReturnaddressType + constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); } else{ objref = GENERIC_ARRAY; @@ -2329,7 +2384,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ ( c instanceof ConstantFloat ) || ( c instanceof ConstantString ) || ( c instanceof ConstantClass ) ) ){ - constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float, a CONSTANT_String or a CONSTANT_Class, but is '"+c+"'."); + constraintViolated(o, + "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float, a CONSTANT_String or a CONSTANT_Class, but is '"+ + c + "'."); } } @@ -2344,7 +2401,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ ( c instanceof ConstantFloat ) || ( c instanceof ConstantString ) || ( c instanceof ConstantClass ) ) ){ - constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float, a CONSTANT_String or a CONSTANT_Class, but is '"+c+"'."); + constraintViolated(o, + "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float, a CONSTANT_String or a CONSTANT_Class, but is '"+ + c + "'."); } } @@ -2358,7 +2417,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ Constant c = cpg.getConstant(o.getIndex()); if (! ( ( c instanceof ConstantLong) || ( c instanceof ConstantDouble ) ) ){ - constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); + constraintViolated(o, + "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); } } @@ -2619,7 +2679,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ @Override public void visitPOP(POP o){ if (stack().peek().getSize() != 1){ - constraintViolated(o, "Stack top size should be 1 but stack top is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); + constraintViolated(o, + "Stack top size should be 1 but stack top is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); } } @@ -2629,7 +2690,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ @Override public void visitPOP2(POP2 o){ if (stack().peek().getSize() != 2){ - constraintViolated(o, "Stack top size should be 2 but stack top is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); + constraintViolated(o, + "Stack top size should be 2 but stack top is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); } } @@ -2642,7 +2704,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ Type objectref = stack().peek(1); if (! ( (objectref instanceof ObjectType) || (objectref == Type.NULL) ) ){ - constraintViolated(o, "Stack next-to-top should be an object reference that's not an array reference, but is '"+objectref+"'."); + constraintViolated(o, + "Stack next-to-top should be an object reference that's not an array reference, but is '"+objectref+"'."); } String field_name = o.getFieldName(cpg); @@ -2714,7 +2777,10 @@ public class InstConstraintVisitor extends EmptyVisitor{ ObjectType objreftype = (ObjectType) tp; if (! ( objreftype.equals(curr) || objreftype.subclassOf(curr) ) ){ - constraintViolated(o, "The referenced field has the ACC_PROTECTED modifier, and it's a member of the current class or a superclass of the current class. However, the referenced object type '"+stack().peek()+"' is not the current class or a subclass of the current class."); + constraintViolated(o, + "The referenced field has the ACC_PROTECTED modifier, and it's a member of the current class or"+ + " a superclass of the current class. However, the referenced object type '"+stack().peek()+ + "' is not the current class or a subclass of the current class."); } } } @@ -2878,7 +2944,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ constraintViolated(o, "The value at the stack top is not of size '1', but of size '"+stack().peek().getSize()+"'."); } if (stack().peek(1).getSize() != 1){ - constraintViolated(o, "The value at the stack next-to-top is not of size '1', but of size '"+stack().peek(1).getSize()+"'."); + constraintViolated(o, + "The value at the stack next-to-top is not of size '1', but of size '"+stack().peek(1).getSize()+"'."); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java index 0b19f47f..6635ddc0 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java @@ -72,7 +72,8 @@ public interface InstructionContext{ * @return true - if and only if the "outgoing" frame situation * changed from the one before execute()ing. */ - boolean execute(Frame inFrame, ArrayList executionPredecessors, InstConstraintVisitor icv, ExecutionVisitor ev); + boolean execute(Frame inFrame, ArrayList executionPredecessors, + InstConstraintVisitor icv, ExecutionVisitor ev); Frame getInFrame(); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java index fb696e0a..a8e9f735 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java @@ -142,11 +142,14 @@ public class LocalVariables{ // We won't accept an unitialized object if we know it was initialized; // compare vmspec2, 4.9.4, last paragraph. if ( (!(locals[i] instanceof UninitializedObjectType)) && (lv.locals[i] instanceof UninitializedObjectType) ){ - throw new StructuralCodeConstraintException("Backwards branch with an uninitialized object in the local variables detected."); + throw new StructuralCodeConstraintException( + "Backwards branch with an uninitialized object in the local variables detected."); } // Even harder, what about _different_ uninitialized object types?! - if ( (!(locals[i].equals(lv.locals[i]))) && (locals[i] instanceof UninitializedObjectType) && (lv.locals[i] instanceof UninitializedObjectType) ){ - throw new StructuralCodeConstraintException("Backwards branch with an uninitialized object in the local variables detected."); + if ( (!(locals[i].equals(lv.locals[i]))) && (locals[i] instanceof UninitializedObjectType) && + (lv.locals[i] instanceof UninitializedObjectType) ){ + throw new StructuralCodeConstraintException( + "Backwards branch with an uninitialized object in the local variables detected."); } // If we just didn't know that it was initialized, we have now learned. if (locals[i] instanceof UninitializedObjectType){ @@ -163,14 +166,16 @@ public class LocalVariables{ } else{ // We should have checked this in Pass2! - throw new AssertionViolatedException("Could not load all the super classes of '"+locals[i]+"' and '"+lv.locals[i]+"'."); + throw new AssertionViolatedException( + "Could not load all the super classes of '"+locals[i]+"' and '"+lv.locals[i]+"'."); } } } else{ if (! (locals[i].equals(lv.locals[i])) ){ /*TODO - if ((locals[i] instanceof org.apache.commons.bcel6.generic.ReturnaddressType) && (lv.locals[i] instanceof org.apache.commons.bcel6.generic.ReturnaddressType)){ + if ((locals[i] instanceof org.apache.commons.bcel6.generic.ReturnaddressType) && + (lv.locals[i] instanceof org.apache.commons.bcel6.generic.ReturnaddressType)){ //System.err.println("merging "+locals[i]+" and "+lv.locals[i]); throw new AssertionViolatedException("Merging different ReturnAddresses: '"+locals[i]+"' and '"+lv.locals[i]+"'."); } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java index 66ed8280..7ac05144 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java @@ -163,7 +163,8 @@ public class OperandStack{ throw new AssertionViolatedException("The OperandStack does not know about '"+type+"'; use Type.INT instead."); } if (slotsUsed() >= maxStack){ - throw new AssertionViolatedException("OperandStack too small, should have thrown proper Exception elsewhere. Stack: "+this); + throw new AssertionViolatedException( + "OperandStack too small, should have thrown proper Exception elsewhere. Stack: "+this); } stack.add(type); } @@ -219,7 +220,8 @@ public class OperandStack{ public void merge(OperandStack s){ try { if ( (slotsUsed() != s.slotsUsed()) || (size() != s.size()) ) { - throw new StructuralCodeConstraintException("Cannot merge stacks of different size:\nOperandStack A:\n"+this+"\nOperandStack B:\n"+s); + throw new StructuralCodeConstraintException( + "Cannot merge stacks of different size:\nOperandStack A:\n"+this+"\nOperandStack B:\n"+s); } for (int i=0; i(), icv, ev); // new ArrayList() <=> no Instruction was executed before - // => Top-Level routine (no jsr call before) + start.execute(vanillaFrame, new ArrayList(), icv, ev); + // new ArrayList() <=> no Instruction was executed before + // => Top-Level routine (no jsr call before) icq.add(start, new ArrayList()); // LOOP! @@ -188,7 +190,8 @@ public final class Pass3bVerifier extends PassVerifier{ } JsrInstruction jsr = (JsrInstruction) (lastJSR.getInstruction().getInstruction()); if ( theSuccessor != (cfg.contextOf(jsr.physicalSuccessor())) ){ - throw new AssertionViolatedException("RET '"+u.getInstruction()+"' info inconsistent: jump back to '"+theSuccessor+"' or '"+cfg.contextOf(jsr.physicalSuccessor())+"'?"); + throw new AssertionViolatedException("RET '"+u.getInstruction()+"' info inconsistent: jump back to '"+ + theSuccessor+"' or '"+cfg.contextOf(jsr.physicalSuccessor())+"'?"); } if (theSuccessor.execute(u.getOutFrame(oldchain), newchain, icv, ev)){ @@ -223,9 +226,14 @@ public final class Pass3bVerifier extends PassVerifier{ // mean we're in a subroutine if we go to the exception handler. // We should address this problem later; by now we simply "cut" the chain // by using an empty chain for the exception handlers. - //if (v.execute(new Frame(u.getOutFrame(oldchain).getLocals(), new OperandStack (u.getOutFrame().getStack().maxStack(), (exc_hds[s].getExceptionType()==null? Type.THROWABLE : exc_hds[s].getExceptionType())) ), newchain), icv, ev){ + //if (v.execute(new Frame(u.getOutFrame(oldchain).getLocals(), + // new OperandStack (u.getOutFrame().getStack().maxStack(), + // (exc_hds[s].getExceptionType()==null? Type.THROWABLE : exc_hds[s].getExceptionType())) ), newchain), icv, ev){ //icq.add(v, (ArrayList) newchain.clone()); - if (v.execute(new Frame(u.getOutFrame(oldchain).getLocals(), new OperandStack (u.getOutFrame(oldchain).getStack().maxStack(), (exc_hd.getExceptionType()==null? Type.THROWABLE : exc_hd.getExceptionType())) ), new ArrayList(), icv, ev)){ + if (v.execute(new Frame(u.getOutFrame(oldchain).getLocals(), + new OperandStack (u.getOutFrame(oldchain).getStack().maxStack(), + (exc_hd.getExceptionType()==null? Type.THROWABLE : exc_hd.getExceptionType())) ), + new ArrayList(), icv, ev)){ icq.add(v, new ArrayList()); } } @@ -236,17 +244,21 @@ public final class Pass3bVerifier extends PassVerifier{ do{ if ((ih.getInstruction() instanceof ReturnInstruction) && (!(cfg.isDead(ih)))) { InstructionContext ic = cfg.contextOf(ih); - Frame f = ic.getOutFrame(new ArrayList()); // TODO: This is buggy, we check only the top-level return instructions this way. Maybe some maniac returns from a method when in a subroutine? + // TODO: This is buggy, we check only the top-level return instructions this way. + // Maybe some maniac returns from a method when in a subroutine? + Frame f = ic.getOutFrame(new ArrayList()); LocalVariables lvs = f.getLocals(); for (int i=0; i acc = new HashSet<>(); if (theRET == null && this != getTopLevel()){ - throw new AssertionViolatedException("This subroutine object must be built up completely before calculating accessed locals."); + throw new AssertionViolatedException( + "This subroutine object must be built up completely before calculating accessed locals."); } { for (InstructionHandle ih : instructions) { @@ -411,7 +416,8 @@ public class Subroutines{ // Now do a BFS from every subroutine leader to find all the // instructions that belong to a subroutine. - Set instructions_assigned = new HashSet<>(); // we don't want to assign an instruction to two or more Subroutine objects. + // we don't want to assign an instruction to two or more Subroutine objects. + Set instructions_assigned = new HashSet<>(); Map colors = new HashMap<>(); //Graph colouring. Key: InstructionHandle, Value: Integer . @@ -428,7 +434,12 @@ public class Subroutines{ Q.clear(); Q.add(actual); // add(Obj) adds to the end, remove(0) removes from the start. - /* BFS ALGORITHM MODIFICATION: Start out with multiple "root" nodes, as exception handlers are starting points of top-level code, too. [why top-level? TODO: Refer to the special JustIce notion of subroutines.]*/ + /* + * BFS ALGORITHM MODIFICATION: + * Start out with multiple "root" nodes, as exception handlers are starting points of top-level code, too. + * [why top-level? + * TODO: Refer to the special JustIce notion of subroutines.] + */ if (actual == all[0]){ for (CodeExceptionGen handler : handlers) { colors.put(handler.getHandlerPC(), GRAY); @@ -454,7 +465,8 @@ public class Subroutines{ if (colors.get(element) == BLACK){ ((SubroutineImpl) (actual==all[0]?getTopLevel():getSubroutine(actual))).addInstruction(element); if (instructions_assigned.contains(element)){ - throw new StructuralCodeConstraintException("Instruction '"+element+"' is part of more than one subroutine (or of the top level and a subroutine)."); + throw new StructuralCodeConstraintException("Instruction '"+element+ + "' is part of more than one subroutine (or of the top level and a subroutine)."); } instructions_assigned.add(element); } @@ -468,11 +480,14 @@ public class Subroutines{ // as is mandated by JustIces notion of subroutines. for (CodeExceptionGen handler : handlers) { InstructionHandle _protected = handler.getStartPC(); - while (_protected != handler.getEndPC().getNext()){// Note the inclusive/inclusive notation of "generic API" exception handlers! + while (_protected != handler.getEndPC().getNext()){ + // Note the inclusive/inclusive notation of "generic API" exception handlers! for (Subroutine sub : subroutines.values()) { if (sub != subroutines.get(all[0])){ // We don't want to forbid top-level exception handlers. if (sub.contains(_protected)){ - throw new StructuralCodeConstraintException("Subroutine instruction '"+_protected+"' is protected by an exception handler, '"+handler+"'. This is forbidden by the JustIce verifier due to its clear definition of subroutines."); + throw new StructuralCodeConstraintException("Subroutine instruction '"+_protected+ + "' is protected by an exception handler, '"+handler+ + "'. This is forbidden by the JustIce verifier due to its clear definition of subroutines."); } } } @@ -510,7 +525,10 @@ public class Subroutines{ if (!set.add(Integer.valueOf(index))){ // Don't use toString() here because of possibly infinite recursive subSubs() calls then. SubroutineImpl si = (SubroutineImpl) sub2; - throw new StructuralCodeConstraintException("Subroutine with local variable '"+si.localVariable+"', JSRs '"+si.theJSRs+"', RET '"+si.theRET+"' is called by a subroutine which uses the same local variable index as itself; maybe even a recursive call? JustIce's clean definition of a subroutine forbids both."); + throw new StructuralCodeConstraintException("Subroutine with local variable '"+si.localVariable+"', JSRs '"+ + si.theJSRs+"', RET '"+si.theRET+ + "' is called by a subroutine which uses the same local variable index as itself; maybe even a recursive call?"+ + " JustIce's clean definition of a subroutine forbids both."); } noRecursiveCalls(sub2, set); @@ -531,7 +549,8 @@ public class Subroutines{ Subroutine ret = subroutines.get(leader); if (ret == null){ - throw new AssertionViolatedException("Subroutine requested for an InstructionHandle that is not a leader of a subroutine."); + throw new AssertionViolatedException( + "Subroutine requested for an InstructionHandle that is not a leader of a subroutine."); } if (ret == TOPLEVEL){ diff --git a/src/test/java/org/apache/commons/bcel6/classfile/UtilityTestCase.java b/src/test/java/org/apache/commons/bcel6/classfile/UtilityTestCase.java index 979a4e4c..f936a1ce 100644 --- a/src/test/java/org/apache/commons/bcel6/classfile/UtilityTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/classfile/UtilityTestCase.java @@ -24,8 +24,14 @@ import junit.framework.TestCase; public class UtilityTestCase extends TestCase { public void testSignatureToStringWithGenerics() throws Exception { - assertEquals("generic signature", "java.util.Map>", Utility.signatureToString("Ljava/util/Map;>;")); - assertEquals("generic signature", "java.util.Set", Utility.signatureToString("Ljava/util/Set<+Ljava/nio/file/OpenOption;>;")); - assertEquals("generic signature", "java.nio.file.attribute.FileAttribute...[]", Utility.signatureToString("[Ljava/nio/file/attribute/FileAttribute<*>;")); + assertEquals("generic signature", + "java.util.Map>", + Utility.signatureToString("Ljava/util/Map;>;")); + assertEquals("generic signature", + "java.util.Set" + , Utility.signatureToString("Ljava/util/Set<+Ljava/nio/file/OpenOption;>;")); + assertEquals("generic signature", + "java.nio.file.attribute.FileAttribute...[]", + Utility.signatureToString("[Ljava/nio/file/attribute/FileAttribute<*>;")); } } diff --git a/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java b/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java index 25e1986e..bb0c84c8 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java @@ -42,7 +42,8 @@ public abstract class AbstractVerifierTestCase extends TestCase { } /** - * Asserts that the verification of the given class is rejected. If it isn't it throws an AssertionFailedError with the given message. + * Asserts that the verification of the given class is rejected. + * If it isn't it throws an AssertionFailedError with the given message. * * @param classname simple classname of the class to verify * @param message message displayed if assertion fails diff --git a/src/test/java/org/apache/commons/bcel6/verifier/VerifierArrayAccessTestCase.java b/src/test/java/org/apache/commons/bcel6/verifier/VerifierArrayAccessTestCase.java index 6afc3f31..7408e87f 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/VerifierArrayAccessTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/VerifierArrayAccessTestCase.java @@ -30,13 +30,16 @@ public class VerifierArrayAccessTestCase extends AbstractVerifierTestCase { new TestArrayAccess03Creator().create(); assertVerifyRejected("TestArrayAccess03", "Verification of an arraystore instruction on an object must fail."); new TestArrayAccess04Creator().create(); - assertVerifyRejected("TestArrayAccess04", "Verification of an arraystore instruction of an int on an array of references must fail."); + assertVerifyRejected("TestArrayAccess04", + "Verification of an arraystore instruction of an int on an array of references must fail."); } public void testValidArrayAccess() throws IOException { - assertVerifyOK("TestArrayAccess01", "Verification of an arraystore instruction on an array that is not compatible with the stored element must pass."); + assertVerifyOK("TestArrayAccess01", + "Verification of an arraystore instruction on an array that is not compatible with the stored element must pass."); new TestArrayAccess02Creator().create(); - assertVerifyOK("TestArrayAccess02", "Verification of an arraystore instruction on an array that is not compatible with the stored element must pass."); + assertVerifyOK("TestArrayAccess02", + "Verification of an arraystore instruction on an array that is not compatible with the stored element must pass."); } } diff --git a/src/test/java/org/apache/commons/bcel6/verifier/VerifierTestCase.java b/src/test/java/org/apache/commons/bcel6/verifier/VerifierTestCase.java index 17f8091f..b4aad673 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/VerifierTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/VerifierTestCase.java @@ -34,10 +34,12 @@ public class VerifierTestCase extends TestCase { Verifier verifier = VerifierFactory.getVerifier(classname); VerificationResult result = verifier.doPass1(); - assertEquals("Pass 1 verification of " + classname + " failed: " + result.getMessage(), VerificationResult.VERIFIED_OK, result.getStatus()); + assertEquals("Pass 1 verification of " + classname + " failed: " + result.getMessage(), VerificationResult.VERIFIED_OK, + result.getStatus()); result = verifier.doPass2(); - assertEquals("Pass 2 verification of " + classname + " failed: " + result.getMessage(), VerificationResult.VERIFIED_OK, result.getStatus()); + assertEquals("Pass 2 verification of " + classname + " failed: " + result.getMessage(), VerificationResult.VERIFIED_OK, + result.getStatus()); } } diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java index 6f75b5b1..451f0ef3 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java @@ -39,7 +39,8 @@ public class TestArrayAccess02Creator extends TestCreator { private final ClassGen _cg; public TestArrayAccess02Creator() { - _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess02", "java.lang.Object", "TestArrayAccess02.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess02", "java.lang.Object", "TestArrayAccess02.java", + Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -54,7 +55,8 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestArrayAccess02", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", + TEST_PACKAGE+".TestArrayAccess02", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -69,7 +71,8 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "test", TEST_PACKAGE+".TestArrayAccess02", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, + "test", TEST_PACKAGE+".TestArrayAccess02", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); Assert.assertNotNull(ih_0); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java index ae863a21..a78b4f28 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java @@ -39,7 +39,8 @@ public class TestArrayAccess03Creator extends TestCreator { private final ClassGen _cg; public TestArrayAccess03Creator() { - _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess03", "java.lang.Object", "TestArrayAccess03.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess03", "java.lang.Object", "TestArrayAccess03.java", + Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -54,7 +55,8 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestArrayAccess03", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", + TEST_PACKAGE+".TestArrayAccess03", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -69,7 +71,8 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", TEST_PACKAGE+".TestArrayAccess03", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, + new String[] { "arg0" }, "test", TEST_PACKAGE+".TestArrayAccess03", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); Assert.assertNotNull(ih_0); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java index 2c28cb3a..4d455e11 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java @@ -39,7 +39,8 @@ public class TestArrayAccess04Creator extends TestCreator { private final ClassGen _cg; public TestArrayAccess04Creator() { - _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess04", "java.lang.Object", "TestArrayAccess04.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess04", "java.lang.Object", "TestArrayAccess04.java", + Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -54,7 +55,8 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestArrayAccess04", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", + TEST_PACKAGE+".TestArrayAccess04", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -69,7 +71,8 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", TEST_PACKAGE+".TestArrayAccess04", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, + new String[] { "arg0" }, "test", TEST_PACKAGE+".TestArrayAccess04", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); Assert.assertNotNull(ih_0); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java index b7c480e0..a993a113 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java @@ -37,7 +37,8 @@ public class TestReturn01Creator extends TestCreator { private final ClassGen _cg; public TestReturn01Creator() { - _cg = new ClassGen(TEST_PACKAGE+".TestReturn01", "java.lang.Object", "TestReturn01.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + _cg = new ClassGen(TEST_PACKAGE+".TestReturn01", "java.lang.Object", "TestReturn01.java", + Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -52,7 +53,8 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestReturn01", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, + "", TEST_PACKAGE+".TestReturn01", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -67,7 +69,8 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "foo", TEST_PACKAGE+".TestReturn01", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, Type.NO_ARGS, + new String[] { }, "foo", TEST_PACKAGE+".TestReturn01", il, _cp); InstructionHandle ih_0 = il.append(_factory.createNew("java.lang.Object")); Assert.assertNotNull(ih_0); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java index e17cc1b0..7c73aa4e 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java @@ -37,7 +37,8 @@ public class TestReturn03Creator extends TestCreator { private final ClassGen _cg; public TestReturn03Creator() { - _cg = new ClassGen(TEST_PACKAGE+".TestReturn03", "java.lang.Object", "TestReturn03.java", Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + _cg = new ClassGen(TEST_PACKAGE+".TestReturn03", "java.lang.Object", "TestReturn03.java", + Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -52,7 +53,8 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestReturn03", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, + "", TEST_PACKAGE+".TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used @@ -67,7 +69,8 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.INT, Type.NO_ARGS, new String[] { }, "test3", TEST_PACKAGE+".TestReturn03", il, _cp); + MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.INT, Type.NO_ARGS, + new String[] { }, "test3", TEST_PACKAGE+".TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(InstructionConstants.ACONST_NULL); Assert.assertNotNull(ih_0); // TODO why is this not used -- GitLab From 6d52e4cfcf51c6e29850d17e2044d68465b7d018 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 20 Aug 2015 21:47:14 +0000 Subject: [PATCH 0936/1313] Checkstyle multiple defs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1696863 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/LineNumberTable.java | 3 ++- .../apache/commons/bcel6/classfile/Utility.java | 6 ++++-- .../org/apache/commons/bcel6/generic/ClassGen.java | 9 ++++++--- .../commons/bcel6/generic/ConstantPoolGen.java | 14 ++++++++++---- .../org/apache/commons/bcel6/generic/FieldGen.java | 4 +++- .../commons/bcel6/generic/InstructionHandle.java | 3 ++- .../commons/bcel6/generic/LocalVariableGen.java | 3 ++- .../apache/commons/bcel6/generic/MethodGen.java | 3 ++- .../org/apache/commons/bcel6/generic/SWITCH.java | 6 ++++-- .../apache/commons/bcel6/util/AttributeHTML.java | 3 ++- .../org/apache/commons/bcel6/util/CodeHTML.java | 4 ++-- .../apache/commons/bcel6/util/ConstantHTML.java | 3 ++- .../org/apache/commons/bcel6/util/MethodHTML.java | 3 ++- 13 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java index d086a389..47b9fe20 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java @@ -159,7 +159,8 @@ public final class LineNumberTable extends Attribute { if (r < 0) { return -1; } - int min_index = -1, min = -1; + int min_index = -1; + int min = -1; /* Do a binary search since the array is ordered. */ do { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java index 40483ea6..5c0afb55 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java @@ -745,7 +745,8 @@ public abstract class Utility { * @return new String object */ public static String replace( String str, String old, String new_ ) { - int index, old_index; + int index; + int old_index; try { if (str.contains(old)) { // `old' found in str StringBuilder buf = new StringBuilder(); @@ -948,7 +949,8 @@ public abstract class Utility { public static String getSignature( String type ) { StringBuilder buf = new StringBuilder(); char[] chars = type.toCharArray(); - boolean char_found = false, delim = false; + boolean char_found = false; + boolean delim = false; int index = -1; loop: for (int i = 0; i < chars.length; i++) { switch (chars[i]) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index cb301b4e..bc1ea919 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -45,10 +45,13 @@ public class ClassGen extends AccessFlags implements Cloneable { /* Corresponds to the fields found in a JavaClass object. */ - private String class_name, super_class_name; + private String class_name; + private String super_class_name; private final String file_name; - private int class_name_index = -1, superclass_name_index = -1; - private int major = Constants.MAJOR_1_1, minor = Constants.MINOR_1_1; + private int class_name_index = -1; + private int superclass_name_index = -1; + private int major = Constants.MAJOR_1_1; + private int minor = Constants.MINOR_1_1; private ConstantPoolGen cp; // Template for building up constant pool // ArrayLists instead of arrays to gather fields, methods, etc. private final List field_vec = new ArrayList<>(); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index 05b36d08..cb224863 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -510,7 +510,8 @@ public class ConstantPoolGen { */ public int addNameAndType( String name, String signature ) { int ret; - int name_index, signature_index; + int name_index; + int signature_index; if ((ret = lookupNameAndType(name, signature)) != -1) { return ret; // Already in CP } @@ -559,7 +560,9 @@ public class ConstantPoolGen { * @return index of entry */ public int addMethodref( String class_name, String method_name, String signature ) { - int ret, class_index, name_and_type_index; + int ret; + int class_index; + int name_and_type_index; if ((ret = lookupMethodref(class_name, method_name, signature)) != -1) { return ret; // Already in CP } @@ -612,7 +615,9 @@ public class ConstantPoolGen { * @return index of entry */ public int addInterfaceMethodref( String class_name, String method_name, String signature ) { - int ret, class_index, name_and_type_index; + int ret; + int class_index; + int name_and_type_index; if ((ret = lookupInterfaceMethodref(class_name, method_name, signature)) != -1) { return ret; // Already in CP } @@ -660,7 +665,8 @@ public class ConstantPoolGen { */ public int addFieldref( String class_name, String field_name, String signature ) { int ret; - int class_index, name_and_type_index; + int class_index; + int name_and_type_index; if ((ret = lookupFieldref(class_name, field_name, signature)) != -1) { return ret; // Already in CP } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index 102eab0e..62d1fa4f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -312,7 +312,9 @@ public class FieldGen extends FieldGenOrMethodGen { */ @Override public final String toString() { - String name, signature, access; // Short cuts to constant pool + String name; + String signature; + String access; // Short cuts to constant pool access = Utility.accessToString(super.getAccessFlags()); access = access.equals("") ? "" : (access + " "); signature = type.toString(); diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java index 7a3aa22a..25bd803a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java @@ -44,7 +44,8 @@ import org.apache.commons.bcel6.classfile.Utility; */ public class InstructionHandle { - InstructionHandle next, prev; // Will be set from the outside + InstructionHandle next; + InstructionHandle prev; // Will be set from the outside Instruction instruction; protected int i_position = -1; // byte code offset of instruction private Set targeters; diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java index 99f60a49..ec17e1e1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java @@ -35,7 +35,8 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo private int index; private String name; private Type type; - private InstructionHandle start, end; + private InstructionHandle start; + private InstructionHandle end; /** diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 20205753..6c2ebb7b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -929,7 +929,8 @@ public class MethodGen extends FieldGenOrMethodGen { branchTargets.push(handler_pc, 1); } } - int stackDepth = 0, maxStackDepth = 0; + int stackDepth = 0; + int maxStackDepth = 0; InstructionHandle ih = il.getStart(); while (ih != null) { Instruction instruction = ih.getInstruction(); diff --git a/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java index d8b52945..a65d1c5b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java @@ -99,8 +99,10 @@ public final class SWITCH implements CompoundInstruction { * Sort match and targets array with QuickSort. */ private void sort( int l, int r ) { - int i = l, j = r; - int h, m = match[(l + r) / 2]; + int i = l; + int j = r; + int h; + int m = match[(l + r) / 2]; InstructionHandle h2; do { while (match[i] < m) { diff --git a/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java b/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java index 0cab67e0..c3b95b74 100644 --- a/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java @@ -186,7 +186,8 @@ final class AttributeHTML { // List inner classes file.print(""); break; - case Constants.CONSTANT_Class: - ConstantClass c4 = (ConstantClass) constant_pool.getConstant(index, Constants.CONSTANT_Class); + case Const.CONSTANT_Class: + ConstantClass c4 = (ConstantClass) constant_pool.getConstant(index, Const.CONSTANT_Class); name_index = c4.getNameIndex(); String class_name2 = constant_pool.constantToString(index, tag); // / -> . String short_class_name = Utility.compactClassName(class_name2); // I.e., remove java.lang. @@ -196,17 +196,17 @@ final class ConstantHTML { file.println("

    " + ref + "

    \n"); break; - case Constants.CONSTANT_String: + case Const.CONSTANT_String: ConstantString c5 = (ConstantString) constant_pool.getConstant(index, - Constants.CONSTANT_String); + Const.CONSTANT_String); name_index = c5.getStringIndex(); String str = Class2HTML.toHTML(constant_pool.constantToString(index, tag)); file.println("

    " + str + "

    \n"); break; - case Constants.CONSTANT_NameAndType: + case Const.CONSTANT_NameAndType: ConstantNameAndType c6 = (ConstantNameAndType) constant_pool.getConstant(index, - Constants.CONSTANT_NameAndType); + Const.CONSTANT_NameAndType); name_index = c6.getNameIndex(); int signature_index = c6.getSignatureIndex(); file.println("

    " diff --git a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java index 91997ed6..03086a18 100644 --- a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java +++ b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java @@ -26,7 +26,7 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.generic.ClassGenException; import org.apache.commons.bcel6.generic.InstructionHandle; import org.apache.commons.bcel6.generic.InstructionList; @@ -114,7 +114,7 @@ public class InstructionFinder { return result; } for (short i = 0; i < NO_OPCODES; i++) { - if (pattern.equals(Constants.getOpcodeName(i))) { + if (pattern.equals(Const.getOpcodeName(i))) { return "" + makeChar(i); } } @@ -343,20 +343,20 @@ public class InstructionFinder { map.put("if_acmp", "(if_acmpeq|if_acmpne)"); map.put("if", "(ifeq|ifne|iflt|ifge|ifgt|ifle)"); // Precompile some aliases first - map.put("iconst", precompile(Constants.ICONST_0, Constants.ICONST_5, Constants.ICONST_M1)); - map.put("lconst", new String(new char[] { '(', makeChar(Constants.LCONST_0), '|', makeChar(Constants.LCONST_1), ')' })); - map.put("dconst", new String(new char[] { '(', makeChar(Constants.DCONST_0), '|', makeChar(Constants.DCONST_1), ')' })); - map.put("fconst", new String(new char[] { '(', makeChar(Constants.FCONST_0), '|', makeChar(Constants.FCONST_1), ')' })); - map.put("lload", precompile(Constants.LLOAD_0, Constants.LLOAD_3, Constants.LLOAD)); - map.put("iload", precompile(Constants.ILOAD_0, Constants.ILOAD_3, Constants.ILOAD)); - map.put("dload", precompile(Constants.DLOAD_0, Constants.DLOAD_3, Constants.DLOAD)); - map.put("fload", precompile(Constants.FLOAD_0, Constants.FLOAD_3, Constants.FLOAD)); - map.put("aload", precompile(Constants.ALOAD_0, Constants.ALOAD_3, Constants.ALOAD)); - map.put("lstore", precompile(Constants.LSTORE_0, Constants.LSTORE_3, Constants.LSTORE)); - map.put("istore", precompile(Constants.ISTORE_0, Constants.ISTORE_3, Constants.ISTORE)); - map.put("dstore", precompile(Constants.DSTORE_0, Constants.DSTORE_3, Constants.DSTORE)); - map.put("fstore", precompile(Constants.FSTORE_0, Constants.FSTORE_3, Constants.FSTORE)); - map.put("astore", precompile(Constants.ASTORE_0, Constants.ASTORE_3, Constants.ASTORE)); + map.put("iconst", precompile(Const.ICONST_0, Const.ICONST_5, Const.ICONST_M1)); + map.put("lconst", new String(new char[] { '(', makeChar(Const.LCONST_0), '|', makeChar(Const.LCONST_1), ')' })); + map.put("dconst", new String(new char[] { '(', makeChar(Const.DCONST_0), '|', makeChar(Const.DCONST_1), ')' })); + map.put("fconst", new String(new char[] { '(', makeChar(Const.FCONST_0), '|', makeChar(Const.FCONST_1), ')' })); + map.put("lload", precompile(Const.LLOAD_0, Const.LLOAD_3, Const.LLOAD)); + map.put("iload", precompile(Const.ILOAD_0, Const.ILOAD_3, Const.ILOAD)); + map.put("dload", precompile(Const.DLOAD_0, Const.DLOAD_3, Const.DLOAD)); + map.put("fload", precompile(Const.FLOAD_0, Const.FLOAD_3, Const.FLOAD)); + map.put("aload", precompile(Const.ALOAD_0, Const.ALOAD_3, Const.ALOAD)); + map.put("lstore", precompile(Const.LSTORE_0, Const.LSTORE_3, Const.LSTORE)); + map.put("istore", precompile(Const.ISTORE_0, Const.ISTORE_3, Const.ISTORE)); + map.put("dstore", precompile(Const.DSTORE_0, Const.DSTORE_3, Const.DSTORE)); + map.put("fstore", precompile(Const.FSTORE_0, Const.FSTORE_3, Const.FSTORE)); + map.put("astore", precompile(Const.ASTORE_0, Const.ASTORE_3, Const.ASTORE)); // Compile strings for (Map.Entry entry : map.entrySet()) { String key = entry.getKey(); @@ -369,7 +369,7 @@ public class InstructionFinder { // Add instruction alias to match anything StringBuilder buf = new StringBuilder("("); for (short i = 0; i < NO_OPCODES; i++) { - if (Constants.getNoOfOperands(i) != Constants.UNDEFINED) { // Not an invalid opcode + if (Const.getNoOfOperands(i) != Const.UNDEFINED) { // Not an invalid opcode buf.append(makeChar(i)); if (i < NO_OPCODES - 1) { buf.append('|'); diff --git a/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java b/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java index f3f21c9e..2c3b031d 100644 --- a/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java @@ -21,7 +21,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.classfile.Attribute; import org.apache.commons.bcel6.classfile.Code; import org.apache.commons.bcel6.classfile.ConstantValue; @@ -89,7 +89,7 @@ final class MethodHTML { attribute_html.writeAttribute(attributes[i], name + "@" + i); } for (int i = 0; i < attributes.length; i++) { - if (attributes[i].getTag() == Constants.ATTR_CONSTANT_VALUE) { // Default value + if (attributes[i].getTag() == Const.ATTR_CONSTANT_VALUE) { // Default value String str = ((ConstantValue) attributes[i]).toString(); // Reference attribute in _attributes.html file.print("= throws"); int[] exceptions = ((ExceptionTable) attributes[i]).getExceptionIndexTable(); for (int j = 0; j < exceptions.length; j++) { @@ -147,7 +147,7 @@ final class MethodHTML { } } file.println(""); - } else if (tag == Constants.ATTR_CODE) { + } else if (tag == Const.ATTR_CODE) { Attribute[] c_a = ((Code) attributes[i]).getAttributes(); for (int j = 0; j < c_a.length; j++) { attribute_html.writeAttribute(c_a[j], "method" + method_number + "@" + i + "@" diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java index 71f249d6..0cd3213c 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java @@ -18,7 +18,7 @@ package org.apache.commons.bcel6.verifier.statics; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.generic.Type; /** @@ -32,7 +32,7 @@ public final class DOUBLE_Upper extends Type{ /** The constructor; this class must not be instantiated from the outside. */ private DOUBLE_Upper(){ - super(Constants.T_UNKNOWN, "Long_Upper"); + super(Const.T_UNKNOWN, "Long_Upper"); } /** Use this method to get the single instance of this class. */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java index 5512a48d..14d48ece 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java @@ -18,7 +18,7 @@ package org.apache.commons.bcel6.verifier.statics; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.generic.Type; /** @@ -32,7 +32,7 @@ public final class LONG_Upper extends Type{ /** The constructor; this class must not be instantiated from the outside. */ private LONG_Upper(){ - super(Constants.T_UNKNOWN, "Long_Upper"); + super(Const.T_UNKNOWN, "Long_Upper"); } /** Use this method to get the single instance of this class. */ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java index 22f3a9a4..9b22a91f 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java @@ -141,7 +141,7 @@ public final class Pass1Verifier extends PassVerifier{ * (otherwise you would not be able to load it into BCEL).

    * * @see org.apache.commons.bcel6.Repository - * @see org.apache.commons.bcel6.Constants#JVM_CLASSFILE_MAGIC + * @see org.apache.commons.bcel6.Const#JVM_CLASSFILE_MAGIC */ @Override public VerificationResult do_verify(){ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java index d643b6e3..f673f2a8 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java @@ -25,7 +25,7 @@ import java.util.Locale; import java.util.Map; import java.util.Set; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.Repository; import org.apache.commons.bcel6.classfile.Attribute; import org.apache.commons.bcel6.classfile.ClassFormatException; @@ -438,7 +438,7 @@ public final class Pass2Verifier extends PassVerifier { ///////////////////////////// @Override public void visitConstantClass(ConstantClass obj){ - if (obj.getTag() != Constants.CONSTANT_Class){ + if (obj.getTag() != Const.CONSTANT_Class){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -446,7 +446,7 @@ public final class Pass2Verifier extends PassVerifier { } @Override public void visitConstantFieldref(ConstantFieldref obj){ - if (obj.getTag() != Constants.CONSTANT_Fieldref){ + if (obj.getTag() != Const.CONSTANT_Fieldref){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getClassIndex(), CONST_Class); @@ -454,7 +454,7 @@ public final class Pass2Verifier extends PassVerifier { } @Override public void visitConstantMethodref(ConstantMethodref obj){ - if (obj.getTag() != Constants.CONSTANT_Methodref){ + if (obj.getTag() != Const.CONSTANT_Methodref){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getClassIndex(), CONST_Class); @@ -462,7 +462,7 @@ public final class Pass2Verifier extends PassVerifier { } @Override public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ - if (obj.getTag() != Constants.CONSTANT_InterfaceMethodref){ + if (obj.getTag() != Const.CONSTANT_InterfaceMethodref){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getClassIndex(), CONST_Class); @@ -470,42 +470,42 @@ public final class Pass2Verifier extends PassVerifier { } @Override public void visitConstantString(ConstantString obj){ - if (obj.getTag() != Constants.CONSTANT_String){ + if (obj.getTag() != Const.CONSTANT_String){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getStringIndex(), CONST_Utf8); } @Override public void visitConstantInteger(ConstantInteger obj){ - if (obj.getTag() != Constants.CONSTANT_Integer){ + if (obj.getTag() != Const.CONSTANT_Integer){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } // no indices to check } @Override public void visitConstantFloat(ConstantFloat obj){ - if (obj.getTag() != Constants.CONSTANT_Float){ + if (obj.getTag() != Const.CONSTANT_Float){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check } @Override public void visitConstantLong(ConstantLong obj){ - if (obj.getTag() != Constants.CONSTANT_Long){ + if (obj.getTag() != Const.CONSTANT_Long){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check } @Override public void visitConstantDouble(ConstantDouble obj){ - if (obj.getTag() != Constants.CONSTANT_Double){ + if (obj.getTag() != Const.CONSTANT_Double){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check } @Override public void visitConstantNameAndType(ConstantNameAndType obj){ - if (obj.getTag() != Constants.CONSTANT_NameAndType){ + if (obj.getTag() != Const.CONSTANT_NameAndType){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -514,7 +514,7 @@ public final class Pass2Verifier extends PassVerifier { } @Override public void visitConstantUtf8(ConstantUtf8 obj){ - if (obj.getTag() != Constants.CONSTANT_Utf8){ + if (obj.getTag() != Const.CONSTANT_Utf8){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check @@ -561,8 +561,8 @@ public final class Pass2Verifier extends PassVerifier { } } - if ((obj.getAccessFlags() & ~(Constants.ACC_PUBLIC|Constants.ACC_PRIVATE|Constants.ACC_PROTECTED|Constants.ACC_STATIC| - Constants.ACC_FINAL|Constants.ACC_VOLATILE|Constants.ACC_TRANSIENT)) > 0){ + if ((obj.getAccessFlags() & ~(Const.ACC_PUBLIC|Const.ACC_PRIVATE|Const.ACC_PROTECTED|Const.ACC_STATIC| + Const.ACC_FINAL|Const.ACC_VOLATILE|Const.ACC_TRANSIENT)) > 0){ addMessage("Field '"+tostring(obj)+ "' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED,"+ " ACC_STATIC, ACC_FINAL, ACC_VOLATILE, ACC_TRANSIENT set (ignored)."); @@ -672,7 +672,7 @@ public final class Pass2Verifier extends PassVerifier { } // Nearly forgot this! Funny return values are allowed, but a non-empty arguments list makes a different method out of it! - if (name.equals(Constants.STATIC_INITIALIZER_NAME) && (ts.length != 0)){ + if (name.equals(Const.STATIC_INITIALIZER_NAME) && (ts.length != 0)){ throw new ClassConstraintException( "Method '"+tostring(obj)+"' has illegal name '"+name+"'."+ " Its name resembles the class or interface initialization method"+ @@ -723,7 +723,7 @@ public final class Pass2Verifier extends PassVerifier { } // A specific instance initialization method... (vmspec2,Page 116). - if (name.equals(Constants.CONSTRUCTOR_NAME)) { + if (name.equals(Const.CONSTRUCTOR_NAME)) { //..may have at most one of ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC set: is checked above. //..may also have ACC_STRICT set, but none of the other flags in table 4.5 (vmspec2, page 115) if (obj.isStatic() || @@ -737,8 +737,8 @@ public final class Pass2Verifier extends PassVerifier { } } else{ // isInterface! - if (!name.equals(Constants.STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph - if (jc.getMajor() >= Constants.MAJOR_1_8) { + if (!name.equals(Const.STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph + if (jc.getMajor() >= Const.MAJOR_1_8) { if (!(obj.isPublic() ^ obj.isPrivate())) { throw new ClassConstraintException("Interface method '" + tostring(obj) + "' must have" + " exactly one of its ACC_PUBLIC and ACC_PRIVATE modifiers set."); @@ -776,8 +776,8 @@ public final class Pass2Verifier extends PassVerifier { } if ((obj.getAccessFlags() & - ~(Constants.ACC_PUBLIC|Constants.ACC_PRIVATE|Constants.ACC_PROTECTED|Constants.ACC_STATIC|Constants.ACC_FINAL| - Constants.ACC_SYNCHRONIZED|Constants.ACC_NATIVE|Constants.ACC_ABSTRACT|Constants.ACC_STRICT)) > 0){ + ~(Const.ACC_PUBLIC|Const.ACC_PRIVATE|Const.ACC_PROTECTED|Const.ACC_STATIC|Const.ACC_FINAL| + Const.ACC_SYNCHRONIZED|Const.ACC_NATIVE|Const.ACC_ABSTRACT|Const.ACC_STRICT)) > 0){ addMessage("Method '"+tostring(obj)+"' has access flag(s) other than"+ " ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL,"+ " ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT set (ignored)."); @@ -893,8 +893,8 @@ public final class Pass2Verifier extends PassVerifier { checkIndex(obj, innername_idx, CONST_Utf8); } int acc = ic.getInnerAccessFlags(); - acc = acc & (~ (Constants.ACC_PUBLIC | Constants.ACC_PRIVATE | Constants.ACC_PROTECTED | - Constants.ACC_STATIC | Constants.ACC_FINAL | Constants.ACC_INTERFACE | Constants.ACC_ABSTRACT)); + acc = acc & (~ (Const.ACC_PUBLIC | Const.ACC_PRIVATE | Const.ACC_PROTECTED | + Const.ACC_STATIC | Const.ACC_FINAL | Const.ACC_INTERFACE | Const.ACC_ABSTRACT)); if (acc != 0){ addMessage( "Unknown access flag for inner class '"+tostring(ic)+"' set (InnerClasses attribute '"+tostring(obj)+"')."); @@ -1313,7 +1313,7 @@ public final class Pass2Verifier extends PassVerifier { @Override public void visitConstantFieldref(ConstantFieldref obj){ - if (obj.getTag() != Constants.CONSTANT_Fieldref){ + if (obj.getTag() != Const.CONSTANT_Fieldref){ throw new ClassConstraintException("ConstantFieldref '"+tostring(obj)+"' has wrong tag!"); } int name_and_type_index = obj.getNameAndTypeIndex(); @@ -1342,7 +1342,7 @@ public final class Pass2Verifier extends PassVerifier { @Override public void visitConstantMethodref(ConstantMethodref obj){ - if (obj.getTag() != Constants.CONSTANT_Methodref){ + if (obj.getTag() != Const.CONSTANT_Methodref){ throw new ClassConstraintException("ConstantMethodref '"+tostring(obj)+"' has wrong tag!"); } int name_and_type_index = obj.getNameAndTypeIndex(); @@ -1364,7 +1364,7 @@ public final class Pass2Verifier extends PassVerifier { try{ Type t = Type.getReturnType(sig); - if ( name.equals(Constants.CONSTRUCTOR_NAME) && (t != Type.VOID) ){ + if ( name.equals(Const.CONSTRUCTOR_NAME) && (t != Type.VOID) ){ throw new ClassConstraintException("Instance initialization method must have VOID return type."); } } @@ -1375,7 +1375,7 @@ public final class Pass2Verifier extends PassVerifier { @Override public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ - if (obj.getTag() != Constants.CONSTANT_InterfaceMethodref){ + if (obj.getTag() != Const.CONSTANT_InterfaceMethodref){ throw new ClassConstraintException("ConstantInterfaceMethodref '"+tostring(obj)+"' has wrong tag!"); } int name_and_type_index = obj.getNameAndTypeIndex(); @@ -1396,8 +1396,8 @@ public final class Pass2Verifier extends PassVerifier { try{ Type t = Type.getReturnType(sig); - if ( name.equals(Constants.STATIC_INITIALIZER_NAME) && (t != Type.VOID) ){ - addMessage("Class or interface initialization method '"+Constants.STATIC_INITIALIZER_NAME+ + if ( name.equals(Const.STATIC_INITIALIZER_NAME) && (t != Type.VOID) ){ + addMessage("Class or interface initialization method '"+Const.STATIC_INITIALIZER_NAME+ "' usually has VOID return type instead of '"+t+ "'. Note this is really not a requirement of The Java Virtual Machine Specification, Second Edition."); } @@ -1435,9 +1435,9 @@ public final class Pass2Verifier extends PassVerifier { } if (allowStaticInit){ - return name.equals(Constants.CONSTRUCTOR_NAME) || name.equals(Constants.STATIC_INITIALIZER_NAME); + return name.equals(Const.CONSTRUCTOR_NAME) || name.equals(Const.STATIC_INITIALIZER_NAME); } - return name.equals(Constants.CONSTRUCTOR_NAME); + return name.equals(Const.CONSTRUCTOR_NAME); } /** diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java index 3ced269e..ee23cdd5 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java @@ -18,7 +18,7 @@ package org.apache.commons.bcel6.verifier.statics; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.Repository; import org.apache.commons.bcel6.classfile.Attribute; import org.apache.commons.bcel6.classfile.Code; @@ -340,9 +340,9 @@ public final class Pass3aVerifier extends PassVerifier{ // array in vmspec2), together with pass 1 (reading code_length bytes and // interpreting them as code[]). So this must not be checked again here. - if (code.getCode().length >= Constants.MAX_CODE_SIZE){// length must be LESS than the max + if (code.getCode().length >= Const.MAX_CODE_SIZE){// length must be LESS than the max throw new StaticCodeInstructionConstraintException( - "Code array in code attribute '"+code+"' too big: must be smaller than "+Constants.MAX_CODE_SIZE+"65536 bytes."); + "Code array in code attribute '"+code+"' too big: must be smaller than "+Const.MAX_CODE_SIZE+"65536 bytes."); } // First opcode at offset 0: okay, that's clear. Nothing to do. @@ -622,7 +622,7 @@ public final class Pass3aVerifier extends PassVerifier{ Type o_type = o.getType(cpg); if (f_type.equals(o_type)) { f = field; - if ((f.getAccessFlags() & (Constants.ACC_PUBLIC | Constants.ACC_PROTECTED)) == 0) { + if ((f.getAccessFlags() & (Const.ACC_PUBLIC | Const.ACC_PROTECTED)) == 0) { f = null; } break outer; @@ -672,10 +672,10 @@ public final class Pass3aVerifier extends PassVerifier{ // Constants are okay due to pass2. ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantMethodref) c).getNameAndTypeIndex())); ConstantUtf8 cutf8 = (ConstantUtf8) (cpg.getConstant(cnat.getNameIndex())); - if (cutf8.getBytes().equals(Constants.CONSTRUCTOR_NAME) && (!(o instanceof INVOKESPECIAL)) ){ + if (cutf8.getBytes().equals(Const.CONSTRUCTOR_NAME) && (!(o instanceof INVOKESPECIAL)) ){ constraintViolated(o, "Only INVOKESPECIAL is allowed to invoke instance initialization methods."); } - if ( (! (cutf8.getBytes().equals(Constants.CONSTRUCTOR_NAME)) ) && (cutf8.getBytes().startsWith("<")) ){ + if ( (! (cutf8.getBytes().equals(Const.CONSTRUCTOR_NAME)) ) && (cutf8.getBytes().startsWith("<")) ){ constraintViolated(o, "No method with a name beginning with '<' other than the instance initialization methods"+ " may be called by the method invocation instructions."); @@ -696,11 +696,11 @@ public final class Pass3aVerifier extends PassVerifier{ ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantInterfaceMethodref)c).getNameAndTypeIndex())); String name = ((ConstantUtf8) (cpg.getConstant(cnat.getNameIndex()))).getBytes(); - if (name.equals(Constants.CONSTRUCTOR_NAME)){ - constraintViolated(o, "Method to invoke must not be '"+Constants.CONSTRUCTOR_NAME+"'."); + if (name.equals(Const.CONSTRUCTOR_NAME)){ + constraintViolated(o, "Method to invoke must not be '"+Const.CONSTRUCTOR_NAME+"'."); } - if (name.equals(Constants.STATIC_INITIALIZER_NAME)){ - constraintViolated(o, "Method to invoke must not be '"+Constants.STATIC_INITIALIZER_NAME+"'."); + if (name.equals(Const.STATIC_INITIALIZER_NAME)){ + constraintViolated(o, "Method to invoke must not be '"+Const.STATIC_INITIALIZER_NAME+"'."); } } @@ -812,9 +812,9 @@ public final class Pass3aVerifier extends PassVerifier{ Type t = o.getType(cpg); if (t instanceof ArrayType){ int dimensions = ((ArrayType) t).getDimensions(); - if (dimensions > Constants.MAX_ARRAY_DIMENSIONS){ + if (dimensions > Const.MAX_ARRAY_DIMENSIONS){ constraintViolated(o, - "Not allowed to create an array with more than "+ Constants.MAX_ARRAY_DIMENSIONS + " dimensions;"+ + "Not allowed to create an array with more than "+ Const.MAX_ARRAY_DIMENSIONS + " dimensions;"+ " actual: " + dimensions); } } @@ -824,14 +824,14 @@ public final class Pass3aVerifier extends PassVerifier{ @Override public void visitNEWARRAY(NEWARRAY o){ byte t = o.getTypecode(); - if (! ( (t == Constants.T_BOOLEAN) || - (t == Constants.T_CHAR) || - (t == Constants.T_FLOAT) || - (t == Constants.T_DOUBLE) || - (t == Constants.T_BYTE) || - (t == Constants.T_SHORT) || - (t == Constants.T_INT) || - (t == Constants.T_LONG) ) ){ + if (! ( (t == Const.T_BOOLEAN) || + (t == Const.T_CHAR) || + (t == Const.T_FLOAT) || + (t == Const.T_DOUBLE) || + (t == Const.T_BYTE) || + (t == Const.T_SHORT) || + (t == Const.T_INT) || + (t == Const.T_LONG) ) ){ constraintViolated(o, "Illegal type code '+t+' for 'atype' operand."); } } @@ -1078,8 +1078,8 @@ public final class Pass3aVerifier extends PassVerifier{ String meth_name = Repository.lookupClass(myOwner.getClassName()).getMethods()[method_no].getName(); // If it's an interface, it can be set only in . - if ((!(jc.isClass())) && (!(meth_name.equals(Constants.STATIC_INITIALIZER_NAME)))){ - constraintViolated(o, "Interface field '"+f+"' must be set in a '"+Constants.STATIC_INITIALIZER_NAME+"' method."); + if ((!(jc.isClass())) && (!(meth_name.equals(Const.STATIC_INITIALIZER_NAME)))){ + constraintViolated(o, "Interface field '"+f+"' must be set in a '"+Const.STATIC_INITIALIZER_NAME+"' method."); } } catch (ClassNotFoundException e) { // FIXME: maybe not the best way to handle this @@ -1228,7 +1228,7 @@ public final class Pass3aVerifier extends PassVerifier{ if ((Repository.instanceOf( current, jc )) && (!current.equals(jc))){ - if (! (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME) )){ + if (! (o.getMethodName(cpg).equals(Const.CONSTRUCTOR_NAME) )){ // Special lookup procedure for ACC_SUPER classes. int supidx = -1; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java index 1379851b..30b0e51a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java @@ -18,7 +18,7 @@ package org.apache.commons.bcel6.verifier.structurals; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.classfile.Constant; import org.apache.commons.bcel6.classfile.ConstantClass; import org.apache.commons.bcel6.classfile.ConstantDouble; @@ -836,7 +836,7 @@ public class ExecutionVisitor extends EmptyVisitor{ /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override public void visitINVOKESPECIAL(INVOKESPECIAL o){ - if (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME)){ + if (o.getMethodName(cpg).equals(Const.CONSTRUCTOR_NAME)){ UninitializedObjectType t = (UninitializedObjectType) stack().peek(o.getArgumentTypes(cpg).length); if (t == Frame.getThis()){ Frame.setThis(null); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java index b09e38db..f824372a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java @@ -18,7 +18,7 @@ package org.apache.commons.bcel6.verifier.structurals; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.Repository; import org.apache.commons.bcel6.classfile.Constant; import org.apache.commons.bcel6.classfile.ConstantClass; @@ -1300,7 +1300,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ Type o_type = o.getType(cpg); if (f_type.equals(o_type)) { f = field; - if ((f.getAccessFlags() & (Constants.ACC_PUBLIC | Constants.ACC_PROTECTED)) == 0) { + if ((f.getAccessFlags() & (Const.ACC_PUBLIC | Const.ACC_PROTECTED)) == 0) { f = null; } break outer; @@ -1905,7 +1905,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ public void visitINVOKESPECIAL(INVOKESPECIAL o){ try { // Don't init an object twice. - if ( (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME)) && + if ( (o.getMethodName(cpg).equals(Const.CONSTRUCTOR_NAME)) && (!(stack().peek(o.getArgumentTypes(cpg).length) instanceof UninitializedObjectType)) ){ constraintViolated(o, "Possibly initializing object twice."+ " A valid instruction sequence must not have an uninitialized object on the operand stack or in a local variable"+ @@ -1964,7 +1964,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); } String objref_classname = null; - if ( !(o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME))){ + if ( !(o.getMethodName(cpg).equals(Const.CONSTRUCTOR_NAME))){ referenceTypeIsInitialized(o, (ReferenceType) objref); if (!(objref instanceof ObjectType)){ if (!(objref instanceof ArrayType)){ // could be a ReturnaddressType @@ -2881,7 +2881,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ */ @Override public void visitRETURN(RETURN o){ - if (mg.getName().equals(Constants.CONSTRUCTOR_NAME)){// If we leave an method + if (mg.getName().equals(Const.CONSTRUCTOR_NAME)){// If we leave an method if ((Frame.getThis() != null) && (!(mg.getClassName().equals(Type.OBJECT.getClassName()))) ) { constraintViolated(o, "Leaving a constructor that itself did not call a constructor."); } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java index ba71f16e..3177c7d8 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java @@ -25,7 +25,7 @@ import java.util.List; import java.util.Random; import java.util.Vector; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.Repository; import org.apache.commons.bcel6.classfile.JavaClass; import org.apache.commons.bcel6.classfile.Method; @@ -349,7 +349,7 @@ public final class Pass3bVerifier extends PassVerifier{ // Build the initial frame situation for this method. Frame f = new Frame(mg.getMaxLocals(),mg.getMaxStack()); if ( !mg.isStatic() ){ - if (mg.getName().equals(Constants.CONSTRUCTOR_NAME)){ + if (mg.getName().equals(Const.CONSTRUCTOR_NAME)){ Frame.setThis(new UninitializedObjectType(ObjectType.getInstance(jc.getClassName()))); f.getLocals().set(0, Frame.getThis()); } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java index 085d9c81..91cfe48c 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java @@ -18,7 +18,7 @@ package org.apache.commons.bcel6.verifier.structurals; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.generic.ObjectType; import org.apache.commons.bcel6.generic.ReferenceType; @@ -36,7 +36,7 @@ public class UninitializedObjectType extends ReferenceType{ /** Creates a new instance. */ public UninitializedObjectType(ObjectType t){ - super(Constants.T_UNKNOWN, ""); + super(Const.T_UNKNOWN, ""); initialized = t; } diff --git a/src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java b/src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java index 84944464..f8278d24 100644 --- a/src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java @@ -37,7 +37,7 @@ public class ElementValueGenTestCase extends AbstractTestCase private ClassGen createClassGen(String classname) { return new ClassGen(classname, "java.lang.Object", "", - Constants.ACC_PUBLIC | Constants.ACC_SUPER, null); + Const.ACC_PUBLIC | Const.ACC_SUPER, null); } /** diff --git a/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java index 640c7bc8..39a3c950 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java @@ -26,7 +26,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.bcel6.AbstractTestCase; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.classfile.Annotations; import org.apache.commons.bcel6.classfile.Attribute; import org.apache.commons.bcel6.classfile.RuntimeInvisibleAnnotations; @@ -37,7 +37,7 @@ public class AnnotationGenTestCase extends AbstractTestCase private ClassGen createClassGen(String classname) { return new ClassGen(classname, "java.lang.Object", "", - Constants.ACC_PUBLIC | Constants.ACC_SUPER, null); + Const.ACC_PUBLIC | Const.ACC_SUPER, null); } /** diff --git a/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java index f31e3e3a..7bdcc52e 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java @@ -22,7 +22,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.bcel6.AbstractTestCase; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.classfile.AnnotationEntry; import org.apache.commons.bcel6.classfile.ArrayElementValue; import org.apache.commons.bcel6.classfile.ElementValue; @@ -431,12 +431,12 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase il.append(factory.createNew("java.io.InputStreamReader")); il.append(InstructionConst.DUP); il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, - Constants.GETSTATIC)); + Const.GETSTATIC)); il.append(factory.createInvoke("java.io.InputStreamReader", "", - Type.VOID, new Type[] { i_stream }, Constants.INVOKESPECIAL)); + Type.VOID, new Type[] { i_stream }, Const.INVOKESPECIAL)); il.append(factory.createInvoke("java.io.BufferedReader", "", Type.VOID, new Type[] { new ObjectType("java.io.Reader") }, - Constants.INVOKESPECIAL)); + Const.INVOKESPECIAL)); LocalVariableGen lg = mg.addLocalVariable("in", new ObjectType( "java.io.BufferedReader"), null, null); int in = lg.getIndex(); @@ -475,7 +475,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase // "Normal" code continues, now we can set the branch target of the GOTO // . InstructionHandle ih = il.append(factory.createFieldAccess( - "java.lang.System", "out", p_stream, Constants.GETSTATIC)); + "java.lang.System", "out", p_stream, Const.GETSTATIC)); g.setTarget(ih); // Printing "Hello": String concatenation compiles to StringBuffer // operations. @@ -485,17 +485,17 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase il .append(factory.createInvoke("java.lang.StringBuffer", "", Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKESPECIAL)); + Const.INVOKESPECIAL)); il.append(new ALOAD(name)); il.append(factory.createInvoke("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); + Const.INVOKEVIRTUAL)); il.append(factory.createInvoke("java.lang.StringBuffer", "toString", - Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); + Type.STRING, Type.NO_ARGS, Const.INVOKEVIRTUAL)); il .append(factory.createInvoke("java.io.PrintStream", "println", Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); + Const.INVOKEVIRTUAL)); il.append(InstructionConst.RETURN); // Finalization: Finally, we have to set the stack size, which normally // would have to be computed on the fly and add a default constructor @@ -504,7 +504,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase mg.setMaxLocals(); cg.addMethod(mg.getMethod()); il.dispose(); // Allow instruction handles to be reused - cg.addEmptyConstructor(Constants.ACC_PUBLIC); + cg.addEmptyConstructor(Const.ACC_PUBLIC); } private void buildClassContents(ClassGen cg, ConstantPoolGen cp, @@ -525,12 +525,12 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase il.append(factory.createNew("java.io.InputStreamReader")); il.append(InstructionConst.DUP); il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, - Constants.GETSTATIC)); + Const.GETSTATIC)); il.append(factory.createInvoke("java.io.InputStreamReader", "", - Type.VOID, new Type[] { i_stream }, Constants.INVOKESPECIAL)); + Type.VOID, new Type[] { i_stream }, Const.INVOKESPECIAL)); il.append(factory.createInvoke("java.io.BufferedReader", "", Type.VOID, new Type[] { new ObjectType("java.io.Reader") }, - Constants.INVOKESPECIAL)); + Const.INVOKESPECIAL)); LocalVariableGen lg = mg.addLocalVariable("in", new ObjectType( "java.io.BufferedReader"), null, null); int in = lg.getIndex(); @@ -569,7 +569,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase // "Normal" code continues, now we can set the branch target of the GOTO // . InstructionHandle ih = il.append(factory.createFieldAccess( - "java.lang.System", "out", p_stream, Constants.GETSTATIC)); + "java.lang.System", "out", p_stream, Const.GETSTATIC)); g.setTarget(ih); // Printing "Hello": String concatenation compiles to StringBuffer // operations. @@ -579,17 +579,17 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase il .append(factory.createInvoke("java.lang.StringBuffer", "", Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKESPECIAL)); + Const.INVOKESPECIAL)); il.append(new ALOAD(name)); il.append(factory.createInvoke("java.lang.StringBuffer", "append", Type.STRINGBUFFER, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); + Const.INVOKEVIRTUAL)); il.append(factory.createInvoke("java.lang.StringBuffer", "toString", - Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL)); + Type.STRING, Type.NO_ARGS, Const.INVOKEVIRTUAL)); il .append(factory.createInvoke("java.io.PrintStream", "println", Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); + Const.INVOKEVIRTUAL)); il.append(InstructionConst.RETURN); // Finalization: Finally, we have to set the stack size, which normally // would have to be computed on the fly and add a default constructor @@ -598,7 +598,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase mg.setMaxLocals(); cg.addMethod(mg.getMethod()); il.dispose(); // Allow instruction handles to be reused - cg.addEmptyConstructor(Constants.ACC_PUBLIC); + cg.addEmptyConstructor(Const.ACC_PUBLIC); } private JavaClass getClassFrom(String where, String clazzname) @@ -613,13 +613,13 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase private ClassGen createClassGen(String classname) { return new ClassGen(classname, "java.lang.Object", "", - Constants.ACC_PUBLIC | Constants.ACC_SUPER, null); + Const.ACC_PUBLIC | Const.ACC_SUPER, null); } private MethodGen createMethodGen(String methodname, InstructionList il, ConstantPoolGen cp) { - return new MethodGen(Constants.ACC_STATIC | Constants.ACC_PUBLIC, // access + return new MethodGen(Const.ACC_STATIC | Const.ACC_PUBLIC, // access // flags Type.VOID, // return type new Type[] { new ArrayType(Type.STRING, 1) }, // argument diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java index ed9797cc..140855b2 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java @@ -20,7 +20,7 @@ package org.apache.commons.bcel6.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.generic.ClassGen; import org.apache.commons.bcel6.generic.ConstantPoolGen; import org.apache.commons.bcel6.generic.InstructionConst; @@ -40,7 +40,7 @@ public class TestArrayAccess02Creator extends TestCreator { public TestArrayAccess02Creator() { _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess02", "java.lang.Object", "TestArrayAccess02.java", - Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + Const.ACC_PUBLIC | Const.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -55,12 +55,12 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", + MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestArrayAccess02", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used - il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Const.INVOKESPECIAL)); InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); Assert.assertNotNull(ih_4); // TODO why is this not used method.setMaxStack(); @@ -71,7 +71,7 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, + MethodGen method = new MethodGen(Const.ACC_PUBLIC | Const.ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "test", TEST_PACKAGE+".TestArrayAccess02", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); @@ -87,7 +87,7 @@ public void create(OutputStream out) throws IOException { il.append(new PUSH(_cp, 0)); il.append(_factory.createNew(TEST_PACKAGE+".TestArrayAccess02")); il.append(InstructionConst.DUP); - il.append(_factory.createInvoke(TEST_PACKAGE+".TestArrayAccess02", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(_factory.createInvoke(TEST_PACKAGE+".TestArrayAccess02", "", Type.VOID, Type.NO_ARGS, Const.INVOKESPECIAL)); il.append(InstructionConst.AASTORE); InstructionHandle ih_20 = il.append(InstructionFactory.createReturn(Type.VOID)); Assert.assertNotNull(ih_20); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java index 0cda5bb2..b65f18bc 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java @@ -20,7 +20,7 @@ package org.apache.commons.bcel6.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.generic.ClassGen; import org.apache.commons.bcel6.generic.ConstantPoolGen; import org.apache.commons.bcel6.generic.InstructionConst; @@ -40,7 +40,7 @@ public class TestArrayAccess03Creator extends TestCreator { public TestArrayAccess03Creator() { _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess03", "java.lang.Object", "TestArrayAccess03.java", - Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + Const.ACC_PUBLIC | Const.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -55,12 +55,12 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", + MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestArrayAccess03", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used - il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Const.INVOKESPECIAL)); InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); Assert.assertNotNull(ih_4); // TODO why is this not used method.setMaxStack(); @@ -71,7 +71,7 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, + MethodGen method = new MethodGen(Const.ACC_PUBLIC | Const.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", TEST_PACKAGE+".TestArrayAccess03", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); @@ -83,7 +83,7 @@ public void create(OutputStream out) throws IOException { il.append(new PUSH(_cp, 0)); il.append(_factory.createNew(TEST_PACKAGE+".TestArrayAccess03")); il.append(InstructionConst.DUP); - il.append(_factory.createInvoke(TEST_PACKAGE+".TestArrayAccess03", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(_factory.createInvoke(TEST_PACKAGE+".TestArrayAccess03", "", Type.VOID, Type.NO_ARGS, Const.INVOKESPECIAL)); il.append(InstructionConst.AASTORE); InstructionHandle ih_15 = il.append(InstructionFactory.createReturn(Type.VOID)); Assert.assertNotNull(ih_15); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java index 17b72726..8aae305f 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java @@ -21,7 +21,7 @@ package org.apache.commons.bcel6.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.generic.ClassGen; import org.apache.commons.bcel6.generic.ConstantPoolGen; import org.apache.commons.bcel6.generic.InstructionConst; @@ -40,7 +40,7 @@ public class TestArrayAccess04Creator extends TestCreator { public TestArrayAccess04Creator() { _cg = new ClassGen(TEST_PACKAGE+".TestArrayAccess04", "java.lang.Object", "TestArrayAccess04.java", - Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + Const.ACC_PUBLIC | Const.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -55,12 +55,12 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", + MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestArrayAccess04", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used - il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Const.INVOKESPECIAL)); InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); Assert.assertNotNull(ih_4); // TODO why is this not used method.setMaxStack(); @@ -71,7 +71,7 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, + MethodGen method = new MethodGen(Const.ACC_PUBLIC | Const.ACC_STATIC, Type.VOID, new Type[] { Type.OBJECT }, new String[] { "arg0" }, "test", TEST_PACKAGE+".TestArrayAccess04", il, _cp); InstructionHandle ih_0 = il.append(new PUSH(_cp, 1)); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java index f39d489e..8837ed43 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java @@ -20,7 +20,7 @@ package org.apache.commons.bcel6.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.generic.ClassGen; import org.apache.commons.bcel6.generic.ConstantPoolGen; import org.apache.commons.bcel6.generic.InstructionConst; @@ -38,7 +38,7 @@ public class TestReturn01Creator extends TestCreator { public TestReturn01Creator() { _cg = new ClassGen(TEST_PACKAGE+".TestReturn01", "java.lang.Object", "TestReturn01.java", - Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + Const.ACC_PUBLIC | Const.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -53,12 +53,12 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, + MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestReturn01", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used - il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Const.INVOKESPECIAL)); InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); Assert.assertNotNull(ih_4); // TODO why is this not used method.setMaxStack(); @@ -69,13 +69,13 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.VOID, Type.NO_ARGS, + MethodGen method = new MethodGen(Const.ACC_PUBLIC | Const.ACC_STATIC, Type.VOID, Type.NO_ARGS, new String[] { }, "foo", TEST_PACKAGE+".TestReturn01", il, _cp); InstructionHandle ih_0 = il.append(_factory.createNew("java.lang.Object")); Assert.assertNotNull(ih_0); // TODO why is this not used il.append(InstructionConst.DUP); - il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Const.INVOKESPECIAL)); il.append(InstructionConst.NOP); InstructionHandle ih_8 = il.append(InstructionFactory.createReturn(Type.OBJECT)); Assert.assertNotNull(ih_8); // TODO why is this not used diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java index c7ffaf0a..cd3970fb 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java @@ -20,7 +20,7 @@ package org.apache.commons.bcel6.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.generic.ClassGen; import org.apache.commons.bcel6.generic.ConstantPoolGen; import org.apache.commons.bcel6.generic.InstructionConst; @@ -38,7 +38,7 @@ public class TestReturn03Creator extends TestCreator { public TestReturn03Creator() { _cg = new ClassGen(TEST_PACKAGE+".TestReturn03", "java.lang.Object", "TestReturn03.java", - Constants.ACC_PUBLIC | Constants.ACC_SUPER, new String[] { }); + Const.ACC_PUBLIC | Const.ACC_SUPER, new String[] { }); _cp = _cg.getConstantPool(); _factory = new InstructionFactory(_cg, _cp); @@ -53,12 +53,12 @@ public void create(OutputStream out) throws IOException { private void createMethod_0() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, + MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "", TEST_PACKAGE+".TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(InstructionFactory.createLoad(Type.OBJECT, 0)); Assert.assertNotNull(ih_0); // TODO why is this not used - il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL)); + il.append(_factory.createInvoke("java.lang.Object", "", Type.VOID, Type.NO_ARGS, Const.INVOKESPECIAL)); InstructionHandle ih_4 = il.append(InstructionFactory.createReturn(Type.VOID)); Assert.assertNotNull(ih_4); // TODO why is this not used method.setMaxStack(); @@ -69,7 +69,7 @@ public void create(OutputStream out) throws IOException { private void createMethod_1() { InstructionList il = new InstructionList(); - MethodGen method = new MethodGen(Constants.ACC_PUBLIC | Constants.ACC_STATIC, Type.INT, Type.NO_ARGS, + MethodGen method = new MethodGen(Const.ACC_PUBLIC | Const.ACC_STATIC, Type.INT, Type.NO_ARGS, new String[] { }, "test3", TEST_PACKAGE+".TestReturn03", il, _cp); InstructionHandle ih_0 = il.append(InstructionConst.ACONST_NULL); -- GitLab From 04c041211cdc102ec44ca098a7e7ddfee27a0ce8 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 08:39:57 +0000 Subject: [PATCH 1068/1313] Oops - arrays must be private git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702396 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/Const.java | 72 ++++--------------- 1 file changed, 14 insertions(+), 58 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Const.java b/src/main/java/org/apache/commons/bcel6/Const.java index a654884a..bd77152a 100644 --- a/src/main/java/org/apache/commons/bcel6/Const.java +++ b/src/main/java/org/apache/commons/bcel6/Const.java @@ -241,11 +241,8 @@ public final class Const { /** * The names of the access flags. - * @deprecated Do not use as will be made private. - * Use getAccessName instead */ - @Deprecated - public static final String[] ACCESS_NAMES = { + private static final String[] ACCESS_NAMES = { "public", "private", "protected", "static", "final", "synchronized", "volatile", "transient", "native", "interface", "abstract", "strictfp", "synthetic", "annotation", "enum" @@ -342,11 +339,9 @@ public final class Const { /** * The names of the types of entries in a constant pool. - * @deprecated Do not use as will be made private. * Use getConstantName instead */ - @Deprecated - public static final String[] CONSTANT_NAMES = { + private static final String[] CONSTANT_NAMES = { "", "CONSTANT_Utf8", "", "CONSTANT_Integer", "CONSTANT_Float", "CONSTANT_Long", "CONSTANT_Double", "CONSTANT_Class", "CONSTANT_String", "CONSTANT_Fieldref", @@ -377,11 +372,8 @@ public final class Const { /** * The names of the interfaces implemented by arrays - * @deprecated Do not use as will be made private. - * Use TBA instead */ - @Deprecated - public static final String[] INTERFACES_IMPLEMENTED_BY_ARRAYS = {"java.lang.Cloneable", "java.io.Serializable"}; + private static final String[] INTERFACES_IMPLEMENTED_BY_ARRAYS = {"java.lang.Cloneable", "java.io.Serializable"}; /** * @@ -1489,11 +1481,8 @@ public final class Const { /** The primitive type names corresponding to the T_XX constants, * e.g., TYPE_NAMES[T_INT] = "int" - * @deprecated Do not use as will be made private. - * Use getTypeName instead */ - @Deprecated - public static final String[] TYPE_NAMES = { + private static final String[] TYPE_NAMES = { ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "boolean", "char", "float", "double", "byte", "short", "int", "long", "void", "array", "object", "unknown", "address" @@ -1511,11 +1500,8 @@ public final class Const { /** The primitive class names corresponding to the T_XX constants, * e.g., CLASS_TYPE_NAMES[T_INT] = "java.lang.Integer" - * @deprecated Do not use as will be made private. - * Use TBA instead */ - @Deprecated - public static final String[] CLASS_TYPE_NAMES = { + private static final String[] CLASS_TYPE_NAMES = { // TODO currently unused - are they needed? ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "java.lang.Boolean", "java.lang.Character", "java.lang.Float", "java.lang.Double", "java.lang.Byte", "java.lang.Short", @@ -1525,11 +1511,8 @@ public final class Const { /** The signature characters corresponding to primitive types, * e.g., SHORT_TYPE_NAMES[T_INT] = "I" - * @deprecated Do not use as will be made private. - * Use TBA instead */ - @Deprecated - public static final String[] SHORT_TYPE_NAMES = { + private static final String[] SHORT_TYPE_NAMES = { ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "Z", "C", "F", "D", "B", "S", "I", "J", "V", ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE @@ -1550,11 +1533,8 @@ public final class Const { * Number of byte code operands for each opcode, i.e., number of bytes after the tag byte * itself. Indexed by opcode, so NO_OF_OPERANDS[BIPUSH] = the number of operands for a bipush * instruction. - * @deprecated Do not use as will be made private. - * Use TBA instead */ - @Deprecated - public static final short[] NO_OF_OPERANDS = { + private static final short[] NO_OF_OPERANDS = { 0/*nop*/, 0/*aconst_null*/, 0/*iconst_m1*/, 0/*iconst_0*/, 0/*iconst_1*/, 0/*iconst_2*/, 0/*iconst_3*/, 0/*iconst_4*/, 0/*iconst_5*/, 0/*lconst_0*/, 0/*lconst_1*/, 0/*fconst_0*/, @@ -1629,11 +1609,8 @@ public final class Const { * How the byte code operands are to be interpreted for each opcode. * Indexed by opcode. TYPE_OF_OPERANDS[ILOAD] = an array of shorts * describing the data types for the instruction. - * @deprecated Do not use; will be made private. - * Use getOperandType(int, int) instead */ - @Deprecated - public static final short[][] TYPE_OF_OPERANDS = { + private static final short[][] TYPE_OF_OPERANDS = { {}/*nop*/, {}/*aconst_null*/, {}/*iconst_m1*/, {}/*iconst_0*/, {}/*iconst_1*/, {}/*iconst_2*/, {}/*iconst_3*/, {}/*iconst_4*/, {}/*iconst_5*/, {}/*lconst_0*/, {}/*lconst_1*/, {}/*fconst_0*/, @@ -1713,10 +1690,8 @@ public final class Const { /** * Names of opcodes. Indexed by opcode. OPCODE_NAMES[ALOAD] = "aload". - * @deprecated Do not use; will be made private . Use getOpcodeName(int) instead */ - @Deprecated - public static final String[] OPCODE_NAMES = { + private static final String[] OPCODE_NAMES = { "nop", "aconst_null", "iconst_m1", "iconst_0", "iconst_1", "iconst_2", "iconst_3", "iconst_4", "iconst_5", "lconst_0", "lconst_1", "fconst_0", "fconst_1", "fconst_2", "dconst_0", @@ -1782,11 +1757,8 @@ public final class Const { * Number of words consumed on operand stack by instructions. * Indexed by opcode. CONSUME_STACK[FALOAD] = number of words * consumed from the stack by a faload instruction. - * @deprecated Do not use as will be made private. - * Use TBA instead */ - @Deprecated - public static final int[] CONSUME_STACK = { + private static final int[] CONSUME_STACK = { 0/*nop*/, 0/*aconst_null*/, 0/*iconst_m1*/, 0/*iconst_0*/, 0/*iconst_1*/, 0/*iconst_2*/, 0/*iconst_3*/, 0/*iconst_4*/, 0/*iconst_5*/, 0/*lconst_0*/, 0/*lconst_1*/, 0/*fconst_0*/, 0/*fconst_1*/, 0/*fconst_2*/, 0/*dconst_0*/, @@ -1852,11 +1824,8 @@ public final class Const { * Number of words produced onto operand stack by instructions. * Indexed by opcode. CONSUME_STACK[DALOAD] = number of words * consumed from the stack by a daload instruction. - * @deprecated Do not use as will be made private. - * Use TBA instead */ - @Deprecated - public static final int[] PRODUCE_STACK = { + private static final int[] PRODUCE_STACK = { 0/*nop*/, 1/*aconst_null*/, 1/*iconst_m1*/, 1/*iconst_0*/, 1/*iconst_1*/, 1/*iconst_2*/, 1/*iconst_3*/, 1/*iconst_4*/, 1/*iconst_5*/, 2/*lconst_0*/, 2/*lconst_1*/, 1/*fconst_0*/, 1/*fconst_1*/, 1/*fconst_2*/, 2/*dconst_0*/, @@ -1945,13 +1914,7 @@ public final class Const { public static final short KNOWN_ATTRIBUTES = 22; // count of attributes - /** - * - * @deprecated Do not use as will be made private. - * Use getAttributeName instead - */ - @Deprecated - public static final String[] ATTRIBUTE_NAMES = { + private static final String[] ATTRIBUTE_NAMES = { "SourceFile", "ConstantValue", "Code", "Exceptions", "LineNumberTable", "LocalVariableTable", "InnerClasses", "Synthetic", "Deprecated", @@ -1984,12 +1947,7 @@ public final class Const { public static final byte ITEM_Object = 7; public static final byte ITEM_NewObject = 8; - /** - * @deprecated Do not use as will be made private. - * Use TBA instead - */ - @Deprecated - public static final String[] ITEM_NAMES = { + private static final String[] ITEM_NAMES = { "Bogus", "Integer", "Float", "Double", "Long", "Null", "InitObject", "Object", "NewObject" }; @@ -2040,10 +1998,8 @@ public final class Const { /** * The names of the reference_kinds of a CONSTANT_MethodHandle_info. - * @deprecated Do not use; will be made private . Use getMethodHandleName(int) instead */ - @Deprecated - public static final String[] METHODHANDLE_NAMES = { + private static final String[] METHODHANDLE_NAMES = { "", "getField", "getStatic", "putField", "putStatic", "invokeVirtual", "invokeStatic", "invokeSpecial", "newInvokeSpecial", "invokeInterface" }; -- GitLab From 40448470d6384fd4128840151a62be646f1eb88d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 08:45:29 +0000 Subject: [PATCH 1069/1313] Tidy up git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702398 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/Const.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Const.java b/src/main/java/org/apache/commons/bcel6/Const.java index bd77152a..87126638 100644 --- a/src/main/java/org/apache/commons/bcel6/Const.java +++ b/src/main/java/org/apache/commons/bcel6/Const.java @@ -24,6 +24,7 @@ import java.util.Collections; * Constants for the project, mostly defined in the JVM specification. * * @version $Id$ + * @since 6.0 (intended to replace the Constant interface) */ public final class Const { @@ -1489,7 +1490,8 @@ public final class Const { }; /** - * + * The primitive type names corresponding to the T_XX constants, + * e.g., TYPE_NAMES[T_INT] = "int" * @param index * @return * @since 6.0 @@ -1501,7 +1503,7 @@ public final class Const { /** The primitive class names corresponding to the T_XX constants, * e.g., CLASS_TYPE_NAMES[T_INT] = "java.lang.Integer" */ - private static final String[] CLASS_TYPE_NAMES = { // TODO currently unused - are they needed? + private static final String[] CLASS_TYPE_NAMES = { ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "java.lang.Boolean", "java.lang.Character", "java.lang.Float", "java.lang.Double", "java.lang.Byte", "java.lang.Short", @@ -1509,6 +1511,17 @@ public final class Const { ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE }; + /** + * The primitive class names corresponding to the T_XX constants, + * e.g., CLASS_TYPE_NAMES[T_INT] = "java.lang.Integer" + * @param index + * @return + * @since 6.0 + */ + public static String getClassTypeName(int index) { + return CLASS_TYPE_NAMES[index]; + } + /** The signature characters corresponding to primitive types, * e.g., SHORT_TYPE_NAMES[T_INT] = "I" */ -- GitLab From 6ecde2c42da4085c2e0270865aa3b7254029d237 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 08:46:13 +0000 Subject: [PATCH 1070/1313] Document when deprecated git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702399 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/Constants.java | 2 +- .../org/apache/commons/bcel6/ExceptionConstants.java | 2 +- .../apache/commons/bcel6/classfile/AccessFlags.java | 2 +- .../apache/commons/bcel6/classfile/Attribute.java | 8 ++++---- .../org/apache/commons/bcel6/classfile/Constant.java | 2 +- .../apache/commons/bcel6/classfile/ConstantCP.java | 4 ++-- .../apache/commons/bcel6/classfile/ElementValue.java | 4 ++-- .../commons/bcel6/classfile/FieldOrMethod.java | 8 ++++---- .../commons/bcel6/generic/BranchInstruction.java | 6 +++--- .../apache/commons/bcel6/generic/CPInstruction.java | 2 +- .../commons/bcel6/generic/ConstantPoolGen.java | 6 +++--- .../commons/bcel6/generic/ElementValueGen.java | 4 ++-- .../commons/bcel6/generic/FieldGenOrMethodGen.java | 6 +++--- .../apache/commons/bcel6/generic/Instruction.java | 4 ++-- .../commons/bcel6/generic/InstructionConstants.java | 2 +- .../commons/bcel6/generic/InstructionFactory.java | 4 ++-- .../commons/bcel6/generic/InstructionHandle.java | 2 +- .../bcel6/generic/LocalVariableInstruction.java | 2 +- .../org/apache/commons/bcel6/generic/Select.java | 12 ++++++------ .../java/org/apache/commons/bcel6/generic/Type.java | 4 ++-- .../org/apache/commons/bcel6/util/ClassQueue.java | 2 +- 21 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Constants.java b/src/main/java/org/apache/commons/bcel6/Constants.java index 923ab2b8..fa2eb86e 100644 --- a/src/main/java/org/apache/commons/bcel6/Constants.java +++ b/src/main/java/org/apache/commons/bcel6/Constants.java @@ -21,7 +21,7 @@ package org.apache.commons.bcel6; * Constants for the project, mostly defined in the JVM specification. * * @version $Id$ - * @deprecated DO NOT USE - use Const instead + * @deprecated (since 6.0) DO NOT USE - use Const instead */ @Deprecated public interface Constants { diff --git a/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java b/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java index e89e9f73..1f129622 100644 --- a/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java @@ -21,7 +21,7 @@ package org.apache.commons.bcel6; * Exception constants. * * @version $Id$ - * @deprecated DO NOT USE - use ExceptionConst instead + * @deprecated (since 6.0) DO NOT USE - use ExceptionConst instead */ @Deprecated public interface ExceptionConstants { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java index 4fa6ce0c..6c144a8d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java @@ -28,7 +28,7 @@ import org.apache.commons.bcel6.Const; public abstract class AccessFlags { /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @java.lang.Deprecated protected int access_flags; // TODO not used externally at present diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index 66967548..0b258625 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -50,25 +50,25 @@ import org.apache.commons.bcel6.Const; public abstract class Attribute implements Cloneable, Node { /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @java.lang.Deprecated protected int name_index; // Points to attribute name in constant pool TODO make private (has getter & setter) /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) (since 6.0) will be made private; do not access directly, use getter/setter */ @java.lang.Deprecated protected int length; // Content length of attribute field TODO make private (has getter & setter) /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @java.lang.Deprecated protected byte tag; // Tag to distinguish subclasses TODO make private & final; supposed to be immutable /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @java.lang.Deprecated protected ConstantPool constant_pool; // TODO make private (has getter & setter) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java index 6b20d7b3..c7782718 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java @@ -58,7 +58,7 @@ public abstract class Constant implements Cloneable, Node { * `CONSTANT_NAMES' array. */ /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @java.lang.Deprecated protected byte tag; // TODO should be private & final diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java index 2d3782e1..9463f79e 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java @@ -40,14 +40,14 @@ public abstract class ConstantCP extends Constant { // Note that this field is used to store the // bootstrap_method_attr_index of a ConstantInvokeDynamic. /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @java.lang.Deprecated protected int class_index; // TODO make private (has getter & setter) // This field has the same meaning for all subclasses. /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @java.lang.Deprecated protected int name_and_type_index; // TODO make private (has getter & setter) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java index b250ea01..41dd8d65 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java @@ -28,13 +28,13 @@ import java.io.IOException; public abstract class ElementValue { /** - * @deprecated will be made private and final; do not access directly, use getter + * @deprecated (since 6.0) will be made private and final; do not access directly, use getter */ @java.lang.Deprecated protected int type; // TODO should be final /** - * @deprecated will be made private and final; do not access directly, use getter + * @deprecated (since 6.0) will be made private and final; do not access directly, use getter */ @java.lang.Deprecated protected ConstantPool cpool; // TODO should be final diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index 57712f82..32594d42 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -31,19 +31,19 @@ import org.apache.commons.bcel6.Const; public abstract class FieldOrMethod extends AccessFlags implements Cloneable, Node { /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @java.lang.Deprecated protected int name_index; // Points to field name in constant pool /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @java.lang.Deprecated protected int signature_index; // Points to encoded signature /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @java.lang.Deprecated protected Attribute[] attributes; // Collection of attributes @@ -52,7 +52,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No private AnnotationEntry[] annotationEntries; // annotations defined on the field or method /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @java.lang.Deprecated protected ConstantPool constant_pool; diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java index 9598b0c9..b368341f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java @@ -33,19 +33,19 @@ import org.apache.commons.bcel6.util.ByteSequence; public abstract class BranchInstruction extends Instruction implements InstructionTargeter { /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected int index; // Branch target relative to this instruction /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected InstructionHandle target; // Target object in instruction list /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected int position; // Byte code offset diff --git a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java index c1a36a56..d09854ae 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java @@ -39,7 +39,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct IndexedInstruction { /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected int index; // index to constant pool diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index cf677c8a..5846a109 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -55,19 +55,19 @@ public class ConstantPoolGen { private static final int DEFAULT_BUFFER_SIZE = 256; /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected int size; /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected Constant[] constants; /** - * @deprecated will be made private; do not access directly, use getSize() + * @deprecated (since 6.0) will be made private; do not access directly, use getSize() */ @Deprecated protected int index = 1; // First entry (0) used by JVM diff --git a/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java index 8de2c4d1..20a58beb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java @@ -35,13 +35,13 @@ import org.apache.commons.bcel6.classfile.SimpleElementValue; public abstract class ElementValueGen { /** - * @deprecated will be made private and final; do not access directly, use getter + * @deprecated (since 6.0) will be made private and final; do not access directly, use getter */ @Deprecated protected int type; /** - * @deprecated will be made private and final; do not access directly, use getter + * @deprecated (since 6.0) will be made private and final; do not access directly, use getter */ @Deprecated protected ConstantPoolGen cpGen; diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java index b2fbcd5c..e1ede98a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java @@ -33,19 +33,19 @@ import org.apache.commons.bcel6.classfile.Attribute; public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAndTyped, Cloneable { /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected String name; /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected Type type; /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected ConstantPoolGen cp; diff --git a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java index b80d0e85..efacf6ac 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java @@ -32,13 +32,13 @@ import org.apache.commons.bcel6.util.ByteSequence; public abstract class Instruction implements Cloneable { /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected short length = 1; // Length of instruction in bytes /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected short opcode = -1; // Opcode number diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java index 498dc7b5..c0333dc5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.Const; * it's possible to write il.append(Instruction.ICONST_0); * * @version $Id$ - * @deprecated Do not use. Use InstructionConst instead. + * @deprecated (since 6.0) Do not use. Use InstructionConst instead. */ @Deprecated public interface InstructionConstants { diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java index 34804270..411007cd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java @@ -40,13 +40,13 @@ public class InstructionFactory { }; /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected ClassGen cg; /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected ConstantPoolGen cp; diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java index f0181071..70072d37 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java @@ -49,7 +49,7 @@ public class InstructionHandle { private Instruction instruction; /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected int i_position = -1; // byte code offset of instruction diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java index 2eaa518b..58b11bb7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java @@ -32,7 +32,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty IndexedInstruction { /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected int n = -1; // index of referenced variable diff --git a/src/main/java/org/apache/commons/bcel6/generic/Select.java b/src/main/java/org/apache/commons/bcel6/generic/Select.java index 0a1bfe20..0e9bf4c7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Select.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Select.java @@ -36,37 +36,37 @@ public abstract class Select extends BranchInstruction implements VariableLength StackConsumer /* @since 6.0 */, StackProducer { /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected int[] match; // matches, i.e., case 1: ... TODO could be package-protected? /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected int[] indices; // target offsets TODO could be package-protected? /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected InstructionHandle[] targets; // target objects in instruction list TODO could be package-protected? /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected int fixed_length; // fixed length defined by subclasses TODO could be package-protected? /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected int match_length; // number of cases TODO could be package-protected? /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected int padding = 0; // number of pad bytes for alignment TODO could be package-protected? diff --git a/src/main/java/org/apache/commons/bcel6/generic/Type.java b/src/main/java/org/apache/commons/bcel6/generic/Type.java index 9cdbac05..2a32c091 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Type.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Type.java @@ -33,13 +33,13 @@ import org.apache.commons.bcel6.classfile.Utility; public abstract class Type { /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected byte type; // TODO should be final (and private) /** - * @deprecated will be made private; do not access directly, use getter/setter + * @deprecated (since 6.0) will be made private; do not access directly, use getter/setter */ @Deprecated protected String signature; // signature for the type TODO should be private diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java b/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java index c1c8c841..c60ac1a2 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java @@ -30,7 +30,7 @@ import org.apache.commons.bcel6.classfile.JavaClass; public class ClassQueue { /** - * @deprecated will be made private; do not access + * @deprecated (since 6.0) will be made private; do not access */ @Deprecated protected LinkedList vec = new LinkedList<>(); // TODO not used externally -- GitLab From fc4ea57480f081e23e4b1ef2183881e5da2a4169 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 09:18:48 +0000 Subject: [PATCH 1071/1313] Doc git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702411 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/ExceptionConst.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/apache/commons/bcel6/ExceptionConst.java b/src/main/java/org/apache/commons/bcel6/ExceptionConst.java index 7f224d42..73e57859 100644 --- a/src/main/java/org/apache/commons/bcel6/ExceptionConst.java +++ b/src/main/java/org/apache/commons/bcel6/ExceptionConst.java @@ -1,5 +1,9 @@ package org.apache.commons.bcel6; +/** + * Exception constants. + * @since 6.0 (intended to replace the InstructionConstant interface) + */ public final class ExceptionConst { /** The mother of all exceptions -- GitLab From b28fbd424e28c146ca756a3faf694d7fe6d4ba0b Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 09:19:08 +0000 Subject: [PATCH 1072/1313] Ignore some info reports git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702412 13f79535-47bb-0310-9956-ffa450edef68 --- clirr-ignored-diffs.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/clirr-ignored-diffs.xml b/clirr-ignored-diffs.xml index d295baf7..c3b9ed49 100644 --- a/clirr-ignored-diffs.xml +++ b/clirr-ignored-diffs.xml @@ -53,4 +53,10 @@ limitations under the License. 7012 * + + + **/* + 7015 + * + -- GitLab From 3251bce2d463c4ba51fc24c04904a8e3ac886c3b Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 09:25:34 +0000 Subject: [PATCH 1073/1313] Revert to 5.2 contents (new entries appear in new class only) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702413 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/Constants.java | 135 ++---------------- 1 file changed, 15 insertions(+), 120 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Constants.java b/src/main/java/org/apache/commons/bcel6/Constants.java index fa2eb86e..2d38e9cc 100644 --- a/src/main/java/org/apache/commons/bcel6/Constants.java +++ b/src/main/java/org/apache/commons/bcel6/Constants.java @@ -76,35 +76,6 @@ public interface Constants { * */ public static final short MINOR_1_5 = 0; - /** Major version number of class files for Java 1.6. - * @see #MINOR_1_6 - * */ - public static final short MAJOR_1_6 = 50; - - /** Minor version number of class files for Java 1.6. - * @see #MAJOR_1_6 - * */ - public static final short MINOR_1_6 = 0; - - /** Major version number of class files for Java 1.7. - * @see #MINOR_1_7 - * */ - public static final short MAJOR_1_7 = 51; - - /** Minor version number of class files for Java 1.7. - * @see #MAJOR_1_7 - * */ - public static final short MINOR_1_7 = 0; - - /** Major version number of class files for Java 1.8. - * @see #MINOR_1_8 - * */ - public static final short MAJOR_1_8 = 52; - - /** Minor version number of class files for Java 1.8. - * @see #MAJOR_1_8 - * */ - public static final short MINOR_1_8 = 0; /** Default major version number. Class file is for Java 1.1. * @see #MAJOR_1_1 @@ -214,11 +185,6 @@ public interface Constants { */ public static final short ACC_ENUM = 0x4000; - /** One of the access flags for fields, methods, or classes. - * @see #ACC_PUBLIC - */ - public static final short ACC_MANDATED = (short) 0x8000; - // Applies to classes compiled by new compilers only /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC @@ -270,23 +236,13 @@ public interface Constants { /** Marks a constant pool entry as a name and type. */ public static final byte CONSTANT_NameAndType = 12; - /** Marks a constant pool entry as a Method Handle. */ - public static final byte CONSTANT_MethodHandle = 15; - - /** Marks a constant pool entry as a Method Type. */ - public static final byte CONSTANT_MethodType = 16; - - /** Marks a constant pool entry as an Invoke Dynamic */ - public static final byte CONSTANT_InvokeDynamic = 18; - /** The names of the types of entries in a constant pool. */ public static final String[] CONSTANT_NAMES = { "", "CONSTANT_Utf8", "", "CONSTANT_Integer", "CONSTANT_Float", "CONSTANT_Long", "CONSTANT_Double", "CONSTANT_Class", "CONSTANT_String", "CONSTANT_Fieldref", "CONSTANT_Methodref", "CONSTANT_InterfaceMethodref", - "CONSTANT_NameAndType", "", "", "CONSTANT_MethodHandle", - "CONSTANT_MethodType", "", "CONSTANT_InvokeDynamic" }; + "CONSTANT_NameAndType" }; /** The name of the static initializer, also called "class * initialization method" or "interface initialization @@ -1078,10 +1034,6 @@ public interface Constants { * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEINTERFACE = 185; - /** Java VM opcode. - * @see - * Opcode definitions in The Java Virtual Machine Specification */ - public static final short INVOKEDYNAMIC = 186; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ @@ -1435,7 +1387,7 @@ public interface Constants { 0/*dreturn*/, 0/*areturn*/, 0/*return*/, 2/*getstatic*/, 2/*putstatic*/, 2/*getfield*/, 2/*putfield*/, 2/*invokevirtual*/, 2/*invokespecial*/, 2/*invokestatic*/, - 4/*invokeinterface*/, 4/*invokedynamic*/, 2/*new*/, + 4/*invokeinterface*/, UNDEFINED, 2/*new*/, 1/*newarray*/, 2/*anewarray*/, 0/*arraylength*/, 0/*athrow*/, 2/*checkcast*/, 2/*instanceof*/, 0/*monitorenter*/, @@ -1508,7 +1460,7 @@ public interface Constants { {T_SHORT}/*putstatic*/, {T_SHORT}/*getfield*/, {T_SHORT}/*putfield*/, {T_SHORT}/*invokevirtual*/, {T_SHORT}/*invokespecial*/, {T_SHORT}/*invokestatic*/, - {T_SHORT, T_BYTE, T_BYTE}/*invokeinterface*/, {T_SHORT, T_BYTE, T_BYTE}/*invokedynamic*/, + {T_SHORT, T_BYTE, T_BYTE}/*invokeinterface*/, {}, {T_SHORT}/*new*/, {T_BYTE}/*newarray*/, {T_SHORT}/*anewarray*/, {}/*arraylength*/, {}/*athrow*/, {T_SHORT}/*checkcast*/, {T_SHORT}/*instanceof*/, @@ -1555,7 +1507,7 @@ public interface Constants { "tableswitch", "lookupswitch", "ireturn", "lreturn", "freturn", "dreturn", "areturn", "return", "getstatic", "putstatic", "getfield", "putfield", "invokevirtual", "invokespecial", "invokestatic", - "invokeinterface", "invokedynamic", "new", "newarray", "anewarray", + "invokeinterface", ILLEGAL_OPCODE, "new", "newarray", "anewarray", "arraylength", "athrow", "checkcast", "instanceof", "monitorenter", "monitorexit", "wide", "multianewarray", "ifnull", "ifnonnull", "goto_w", "jsr_w", "breakpoint", ILLEGAL_OPCODE, ILLEGAL_OPCODE, @@ -1611,7 +1563,7 @@ public interface Constants { UNPREDICTABLE/*putstatic*/, 1/*getfield*/, UNPREDICTABLE/*putfield*/, UNPREDICTABLE/*invokevirtual*/, UNPREDICTABLE/*invokespecial*/, UNPREDICTABLE/*invokestatic*/, - UNPREDICTABLE/*invokeinterface*/, UNPREDICTABLE/*invokedynamic*/, 0/*new*/, 1/*newarray*/, 1/*anewarray*/, + UNPREDICTABLE/*invokeinterface*/, UNDEFINED, 0/*new*/, 1/*newarray*/, 1/*anewarray*/, 1/*arraylength*/, 1/*athrow*/, 1/*checkcast*/, 1/*instanceof*/, 1/*monitorenter*/, 1/*monitorexit*/, 0/*wide*/, UNPREDICTABLE/*multianewarray*/, 1/*ifnull*/, 1/*ifnonnull*/, 0/*goto_w*/, 0/*jsr_w*/, 0/*breakpoint*/, UNDEFINED, UNDEFINED, @@ -1667,7 +1619,7 @@ public interface Constants { 0/*dreturn*/, 0/*areturn*/, 0/*return*/, UNPREDICTABLE/*getstatic*/, 0/*putstatic*/, UNPREDICTABLE/*getfield*/, 0/*putfield*/, UNPREDICTABLE/*invokevirtual*/, UNPREDICTABLE/*invokespecial*/, UNPREDICTABLE/*invokestatic*/, - UNPREDICTABLE/*invokeinterface*/, UNPREDICTABLE/*invokedynamic*/, 1/*new*/, 1/*newarray*/, 1/*anewarray*/, + UNPREDICTABLE/*invokeinterface*/, UNDEFINED, 1/*new*/, 1/*newarray*/, 1/*anewarray*/, 1/*arraylength*/, 1/*athrow*/, 1/*checkcast*/, 1/*instanceof*/, 0/*monitorenter*/, 0/*monitorexit*/, 0/*wide*/, 1/*multianewarray*/, 0/*ifnull*/, 0/*ifnonnull*/, 0/*goto_w*/, 1/*jsr_w*/, 0/*breakpoint*/, UNDEFINED, UNDEFINED, @@ -1701,31 +1653,14 @@ public interface Constants { public static final byte ATTR_PMG = 9; public static final byte ATTR_SIGNATURE = 10; public static final byte ATTR_STACK_MAP = 11; - public static final byte ATTR_RUNTIME_VISIBLE_ANNOTATIONS = 12; - public static final byte ATTR_RUNTIME_INVISIBLE_ANNOTATIONS = 13; - public static final byte ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS = 14; - public static final byte ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS = 15; + public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = 12; + public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = 13; + public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = 14; + public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = 15; public static final byte ATTR_ANNOTATION_DEFAULT = 16; - public static final byte ATTR_LOCAL_VARIABLE_TYPE_TABLE = 17; - public static final byte ATTR_ENCLOSING_METHOD = 18; - public static final byte ATTR_STACK_MAP_TABLE = 19; - public static final byte ATTR_BOOTSTRAP_METHODS = 20; - public static final byte ATTR_METHOD_PARAMETERS = 21; - - public static final short KNOWN_ATTRIBUTES = 22; // count of attributes - - /** @deprecated Use {@link #ATTR_RUNTIME_VISIBLE_ANNOTATIONS} instead */ - @Deprecated -public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = ATTR_RUNTIME_VISIBLE_ANNOTATIONS; - /** @deprecated Use {@link #ATTR_RUNTIME_INVISIBLE_ANNOTATIONS} instead */ - @Deprecated -public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = ATTR_RUNTIME_INVISIBLE_ANNOTATIONS; - /** @deprecated Use {@link #ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS} instead */ - @Deprecated -public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS; - /** @deprecated Use {@link #ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS} instead */ - @Deprecated -public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS; + + public static final short KNOWN_ATTRIBUTES = 12;//should be 17 + // TODO: mutable public array!! public static final String[] ATTRIBUTE_NAMES = { @@ -1735,8 +1670,7 @@ public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUN "PMGClass", "Signature", "StackMap", "RuntimeVisibleAnnotations", "RuntimeInvisibleAnnotations", "RuntimeVisibleParameterAnnotations", "RuntimeInvisibleParameterAnnotations", - "AnnotationDefault", "LocalVariableTypeTable", "EnclosingMethod", "StackMapTable", - "BootstrapMethods", "MethodParameters" + "AnnotationDefault" }; /** Constants used in the StackMap attribute. @@ -1755,44 +1689,5 @@ public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = ATTR_RUN "Bogus", "Integer", "Float", "Double", "Long", "Null", "InitObject", "Object", "NewObject" }; - - /** Constants used to identify StackMapEntry types. - * - * For those types which can specify a range, the - * constant names the lowest value. - */ - public static final int SAME_FRAME = 0; - public static final int SAME_LOCALS_1_STACK_ITEM_FRAME = 64; - public static final int SAME_LOCALS_1_STACK_ITEM_FRAME_EXTENDED = 247; - public static final int CHOP_FRAME = 248; - public static final int SAME_FRAME_EXTENDED = 251; - public static final int APPEND_FRAME = 252; - public static final int FULL_FRAME = 255; - - /** Constants that define the maximum value of - * those constants which store ranges. */ - - public static final int SAME_FRAME_MAX = 63; - public static final int SAME_LOCALS_1_STACK_ITEM_FRAME_MAX = 127; - public static final int CHOP_FRAME_MAX = 250; - public static final int APPEND_FRAME_MAX = 254; - - - // Constants defining the behavior of the Method Handles (JVMS �5.4.3.5) - - public static final byte REF_getField = 1; - public static final byte REF_getStatic = 2; - public static final byte REF_putField = 3; - public static final byte REF_putStatic = 4; - public static final byte REF_invokeVirtual = 5; - public static final byte REF_invokeStatic = 6; - public static final byte REF_invokeSpecial = 7; - public static final byte REF_newInvokeSpecial = 8; - public static final byte REF_invokeInterface = 9; - - /** The names of the referencd_kinds of a CONSTANT_MethodHandle_info. */ - public static final String[] METHODHANDLE_NAMES = { - "", "getField", "getStatic", "putField", "putStatic", "invokeVirtual", - "invokeStatic", "invokeSpecial", "newInvokeSpecial", "invokeInterface" }; - + } -- GitLab From 3c08cbd2ebb2ac5bf335bdb38d3fce0b0482673a Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 10:34:45 +0000 Subject: [PATCH 1074/1313] Gradually working towards restoring binary compatibility Restore deprecated methods for now git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702419 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/ConstantUtf8.java | 10 +++ .../bcel6/classfile/FieldOrMethod.java | 22 ++++++ .../bcel6/classfile/LocalVariableTable.java | 20 ++++++ .../bcel6/classfile/StackMapEntry.java | 10 +++ .../commons/bcel6/generic/FieldOrMethod.java | 11 +++ .../commons/bcel6/generic/Instruction.java | 21 ++++++ .../commons/bcel6/generic/ObjectType.java | 36 ++++++++++ .../commons/bcel6/generic/ReferenceType.java | 71 +++++++++++++++++++ .../apache/commons/bcel6/util/ClassPath.java | 9 +++ .../bcel6/verifier/GraphicalVerifier.java | 2 +- .../verifier/VerifierFactoryListModel.java | 3 - 11 files changed, 211 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java index 8d8a3b23..bf0f664a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java @@ -191,6 +191,16 @@ public final class ConstantUtf8 extends Constant { } + /** + * @param bytes the raw bytes of this Utf-8 + * @deprecated + */ + @java.lang.Deprecated + public final void setBytes( String bytes ) { + throw new UnsupportedOperationException(); + } + + /** * @return String representation */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index 32594d42..2ad76f18 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -18,6 +18,7 @@ package org.apache.commons.bcel6.classfile; import java.io.DataInput; +import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -48,6 +49,12 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No @java.lang.Deprecated protected Attribute[] attributes; // Collection of attributes + /** + * @deprecated (since 6.0) will be removed (not needed) + */ + @java.lang.Deprecated + protected int attributes_count; // No. of attributes + // @since 6.0 private AnnotationEntry[] annotationEntries; // annotations defined on the field or method @@ -74,6 +81,18 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No } + /** + * Construct object from file stream. + * @param file Input stream + * @throws IOException + * @throws ClassFormatException + * @deprecated Use {@link #FieldOrMethod(java.io.DataInput, ConstantPool)} instead. + */ + protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) throws IOException, + ClassFormatException { + this((DataInput) file, constant_pool); + } + /** * Construct object from file stream. * @param file Input stream @@ -88,6 +107,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No for (int i = 0; i < attributes_count; i++) { attributes[i] = Attribute.readAttribute(file, constant_pool); } + this.attributes_count = attributes_count; // init deprecated field } @@ -138,6 +158,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No */ public final void setAttributes( Attribute[] attributes ) { this.attributes = attributes; + this.attributes_count = attributes.length; // init deprecated field } @@ -223,6 +244,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No c.constant_pool = constant_pool; c.attributes = new Attribute[attributes.length]; + c.attributes_count = attributes_count; // init deprecated field for (int i = 0; i < attributes.length; i++) { c.attributes[i] = attributes[i].copy(constant_pool); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java index e5da6b7e..2d490243 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java @@ -114,6 +114,26 @@ public class LocalVariableTable extends Attribute { } + /** + * + * @param index the variable slot + * + * @return the first LocalVariable that matches the slot or null if not found + * + * @deprecated since 5.2 because multiple variables can share the + * same slot, use getLocalVariable(int index, int pc) instead. + */ + @java.lang.Deprecated + public final LocalVariable getLocalVariable( int index ) { + for (LocalVariable variable : local_variable_table) { + if (variable.getIndex() == index) { + return variable; + } + } + return null; + } + + /** * * @param index the variable slot diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index 5cf817f3..0e1a6a95 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -334,6 +334,11 @@ public final class StackMapEntry implements Cloneable } + @java.lang.Deprecated + public void setNumberOfLocals( int n ) { // TODO unused + } + + public int getNumberOfLocals() { return types_of_locals.length; } @@ -349,6 +354,11 @@ public final class StackMapEntry implements Cloneable } + @java.lang.Deprecated + public void setNumberOfStackItems( int n ) { // TODO unused + } + + public int getNumberOfStackItems() { return types_of_stack_items.length; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java index dc28fdce..30d8878a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java @@ -91,6 +91,17 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { } + /** @return type of the referenced class/interface + * @deprecated If the instruction references an array class, + * the ObjectType returned will be invalid. Use + * getReferenceType() instead. + */ + @Deprecated + public ObjectType getClassType( ConstantPoolGen cpg ) { + return ObjectType.getInstance(getClassName(cpg)); + } + + /** * Return the reference type representing the class, interface, * or array class referenced by the instruction. diff --git a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java index efacf6ac..334e6449 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java @@ -549,6 +549,27 @@ public abstract class Instruction implements Cloneable { public abstract void accept( Visitor v ); + /** Get Comparator object used in the equals() method to determine + * equality of instructions. + * + * @return currently used comparator for equals() + * @deprecated use the built in comparator, or wrap this class in another object that implements these methods + */ + @Deprecated + public static InstructionComparator getComparator() { + return cmp; + } + + + /** Set comparator to be used for equals(). + * @deprecated use the built in comparator, or wrap this class in another object that implements these methods + */ + @Deprecated + public static void setComparator( InstructionComparator c ) { + cmp = c; + } + + /** Check for equality, delegated to comparator * @return true if that is an Instruction and has the same opcode */ diff --git a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java index c44f8a8f..c31fe39c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java @@ -71,6 +71,42 @@ public class ObjectType extends ReferenceType { } + /** + * If "this" doesn't reference a class, it references an interface + * or a non-existant entity. + * @deprecated (since 6.0) this method returns an inaccurate result + * if the class or interface referenced cannot + * be found: use referencesClassExact() instead + */ + @Deprecated + public boolean referencesClass() { + try { + JavaClass jc = Repository.lookupClass(class_name); + return jc.isClass(); + } catch (ClassNotFoundException e) { + return false; + } + } + + + /** + * If "this" doesn't reference an interface, it references a class + * or a non-existant entity. + * @deprecated (since 6.0) this method returns an inaccurate result + * if the class or interface referenced cannot + * be found: use referencesInterfaceExact() instead + */ + @Deprecated + public boolean referencesInterface() { + try { + JavaClass jc = Repository.lookupClass(class_name); + return !jc.isClass(); + } catch (ClassNotFoundException e) { + return false; + } + } + + /** * Return true if this type references a class, * false if it references an interface. diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java index b4e071f9..b26ab076 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java @@ -256,4 +256,75 @@ public abstract class ReferenceType extends Type { return null; } + /** + * This commutative operation returns the first common superclass (narrowest ReferenceType + * referencing a class, not an interface). + * If one of the types is a superclass of the other, the former is returned. + * If "this" is Type.NULL, then t is returned. + * If t is Type.NULL, then "this" is returned. + * If "this" equals t ['this.equals(t)'] "this" is returned. + * If "this" or t is an ArrayType, then Type.OBJECT is returned. + * If "this" or t is a ReferenceType referencing an interface, then Type.OBJECT is returned. + * If not all of the two classes' superclasses cannot be found, "null" is returned. + * See the JVM specification edition 2, "�4.9.2 The Bytecode Verifier". + * + * @deprecated use getFirstCommonSuperclass(ReferenceType t) which has + * slightly changed semantics. + * @throws ClassNotFoundException on failure to find superclasses of this + * type, or the type passed as a parameter + */ + @Deprecated + public ReferenceType firstCommonSuperclass( ReferenceType t ) throws ClassNotFoundException { + if (this.equals(Type.NULL)) { + return t; + } + if (t.equals(Type.NULL)) { + return this; + } + if (this.equals(t)) { + return this; + /* + * TODO: Above sounds a little arbitrary. On the other hand, there is + * no object referenced by Type.NULL so we can also say all the objects + * referenced by Type.NULL were derived from java.lang.Object. + * However, the Java Language's "instanceof" operator proves us wrong: + * "null" is not referring to an instance of java.lang.Object :) + */ + } + if ((this instanceof ArrayType) || (t instanceof ArrayType)) { + return Type.OBJECT; + // TODO: Is there a proof of OBJECT being the direct ancestor of every ArrayType? + } + if (((this instanceof ObjectType) && ((ObjectType) this).referencesInterface()) + || ((t instanceof ObjectType) && ((ObjectType) t).referencesInterface())) { + return Type.OBJECT; + // TODO: The above line is correct comparing to the vmspec2. But one could + // make class file verification a bit stronger here by using the notion of + // superinterfaces or even castability or assignment compatibility. + } + // this and t are ObjectTypes, see above. + ObjectType thiz = (ObjectType) this; + ObjectType other = (ObjectType) t; + JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); + JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); + if ((thiz_sups == null) || (other_sups == null)) { + return null; + } + // Waaahh... + JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; + JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; + System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); + System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); + this_sups[0] = Repository.lookupClass(thiz.getClassName()); + t_sups[0] = Repository.lookupClass(other.getClassName()); + for (JavaClass t_sup : t_sups) { + for (JavaClass this_sup : this_sups) { + if (this_sup.equals(t_sup)) { + return ObjectType.getInstance(this_sup.getClassName()); + } + } + } + // Huh? Did you ask for Type.OBJECT's superclass?? + return null; + } } diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index cbfc25ce..940c51aa 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -93,6 +93,15 @@ public class ClassPath { vec.toArray(paths); } + /** + * Search for classes in CLASSPATH. + * @deprecated Use SYSTEM_CLASS_PATH constant + */ + @Deprecated + public ClassPath() { + this(getClassPath()); + } + /** @return used class path string */ @Override diff --git a/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java index 0500535e..dab74cad 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java @@ -34,7 +34,7 @@ public class GraphicalVerifier { /** Constructor. */ - private GraphicalVerifier() { + public GraphicalVerifier() { VerifierAppFrame frame = new VerifierAppFrame(); //Frames �berpr�fen, die voreingestellte Gr��e haben //Frames packen, die nutzbare bevorzugte Gr��eninformationen enthalten, z.B. aus ihrem Layout diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java index 1575e650..0d57f23d 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java @@ -77,9 +77,6 @@ public class VerifierFactoryListModel implements VerifierFactoryObserver, } - /** - * @since 6.0 - */ @Override public synchronized String getElementAt( int index ) { return (cache.toArray(new String[cache.size()]))[index]; -- GitLab From 6e08c112527e45080ff99c6bb1ae4bd2165d292a Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 10:53:35 +0000 Subject: [PATCH 1075/1313] Gradually working towards restoring binary compatibility Restore deprecated classes for now git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702424 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/Attribute.java | 15 ++ .../bcel6/classfile/AttributeReader.java | 59 ++++++ .../commons/bcel6/util/ClassLoader.java | 192 ++++++++++++++++++ .../commons/bcel6/util/ClassVector.java | 61 ++++++ 4 files changed, 327 insertions(+) create mode 100644 src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java create mode 100644 src/main/java/org/apache/commons/bcel6/util/ClassLoader.java create mode 100644 src/main/java/org/apache/commons/bcel6/util/ClassVector.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index 0b258625..fe6ddae9 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -107,6 +107,21 @@ public abstract class Attribute implements Cloneable, Node { private static final Map readers = new HashMap<>(); + /** + * Add an Attribute reader capable of parsing (user-defined) attributes + * named "name". You should not add readers for the standard attributes such + * as "LineNumberTable", because those are handled internally. + * + * @param name the name of the attribute as stored in the class file + * @param r the reader object + * @deprecated Use {@link #addAttributeReader(String, UnknownAttributeReader)} instead + */ + @java.lang.Deprecated + public static void addAttributeReader(String name, AttributeReader r) + { + readers.put(name, r); + } + /** * Add an Attribute reader capable of parsing (user-defined) attributes * named "name". You should not add readers for the standard attributes such diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java b/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java new file mode 100644 index 00000000..942dbec0 --- /dev/null +++ b/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.commons.bcel6.classfile; + +/** + * Unknown (non-standard) attributes may be read via user-defined factory + * objects that can be registered with the Attribute.addAttributeReader + * method. These factory objects should implement this interface. + + * @see Attribute + * @version $Id$ + * + * @deprecated Use UnknownAttributeReader instead + */ +public interface AttributeReader { + + /** + When this attribute reader is added via the static method + Attribute.addAttributeReader, an attribute name is associated with it. + As the class file parser parses attributes, it will call various + AttributeReaders based on the name of the attributes it is + constructing. + + @param name_index An index into the constant pool, indexing a + ConstantUtf8 that represents the name of the attribute. + + @param length The length of the data contained in the attribute. This + is written into the constant pool and should agree with what the + factory expects the length to be. + + @param file This is the data input stream that the factory needs to read + its data from. + + @param constant_pool This is the constant pool associated with the + Attribute that we are constructing. + + @return The user-defined AttributeReader should take this data and use + it to construct an attribute. In the case of errors, a null can be + returned which will cause the parsing of the class file to fail. + + @see Attribute#addAttributeReader( String, AttributeReader ) + */ + Attribute createAttribute( int name_index, int length, java.io.DataInputStream file, ConstantPool constant_pool ); +} diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java new file mode 100644 index 00000000..51f01cdf --- /dev/null +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java @@ -0,0 +1,192 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.commons.bcel6.util; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Hashtable; + +import org.apache.commons.bcel6.Constants; +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.ConstantClass; +import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.commons.bcel6.classfile.Utility; + +/** + *

    Drop in replacement for the standard class loader of the JVM. You can use it + * in conjunction with the JavaWrapper to dynamically modify/create classes + * as they're requested.

    + * + *

    This class loader recognizes special requests in a distinct + * format, i.e., when the name of the requested class contains with + * "$$BCEL$$" it calls the createClass() method with that name + * (everything bevor the $$BCEL$$ is considered to be the package + * name. You can subclass the class loader and override that + * method. "Normal" classes class can be modified by overriding the + * modifyClass() method which is called just before defineClass().

    + * + *

    There may be a number of packages where you have to use the + * default class loader (which may also be faster). You can define the + * set of packages where to use the system class loader in the + * constructor. The default value contains "java.", "sun.", + * "javax."

    + * + * @version $Id$ + * @see JavaWrapper + * @see ClassPath + * @deprecated 6.0 Do not use - does not work + */ +@Deprecated +public class ClassLoader extends java.lang.ClassLoader { + + private static final String BCEL_TOKEN = "$$BCEL$$"; + + public static final String[] DEFAULT_IGNORED_PACKAGES = { + "java.", "javax.", "sun." + }; + + private final Hashtable> classes = new Hashtable>(); + // Hashtable is synchronized thus thread-safe + private final String[] ignored_packages; + private Repository repository = SyntheticRepository.getInstance(); + + + /** Ignored packages are by default ( "java.", "sun.", + * "javax."), i.e. loaded by system class loader + */ + public ClassLoader() { + this(DEFAULT_IGNORED_PACKAGES); + } + + + /** @param deferTo delegate class loader to use for ignored packages + */ + public ClassLoader(java.lang.ClassLoader deferTo) { + super(deferTo); + this.ignored_packages = DEFAULT_IGNORED_PACKAGES; + this.repository = new ClassLoaderRepository(deferTo); + } + + + /** @param ignored_packages classes contained in these packages will be loaded + * with the system class loader + */ + public ClassLoader(String[] ignored_packages) { + this.ignored_packages = ignored_packages; + } + + + /** @param ignored_packages classes contained in these packages will be loaded + * with the system class loader + * @param deferTo delegate class loader to use for ignored packages + */ + public ClassLoader(java.lang.ClassLoader deferTo, String[] ignored_packages) { + this(ignored_packages); + this.repository = new ClassLoaderRepository(deferTo); + } + + @Override + protected Class loadClass( String class_name, boolean resolve ) throws ClassNotFoundException { + Class cl = null; + /* First try: lookup hash table. + */ + if ((cl = classes.get(class_name)) == null) { + /* Second try: Load system class using system class loader. You better + * don't mess around with them. + */ + for (String ignored_package : ignored_packages) { + if (class_name.startsWith(ignored_package)) { + cl = getParent().loadClass(class_name); + break; + } + } + if (cl == null) { + JavaClass clazz = null; + /* Third try: Special request? + */ + if (class_name.contains(BCEL_TOKEN)) { + clazz = createClass(class_name); + } else { // Fourth try: Load classes via repository + if ((clazz = repository.loadClass(class_name)) != null) { + clazz = modifyClass(clazz); + } else { + throw new ClassNotFoundException(class_name); + } + } + if (clazz != null) { + byte[] bytes = clazz.getBytes(); + cl = defineClass(class_name, bytes, 0, bytes.length); + } else { + cl = Class.forName(class_name); + } + } + if (resolve) { + resolveClass(cl); + } + } + classes.put(class_name, cl); + return cl; + } + + + /** Override this method if you want to alter a class before it gets actually + * loaded. Does nothing by default. + */ + protected JavaClass modifyClass( JavaClass clazz ) { + return clazz; + } + + + /** + * Override this method to create you own classes on the fly. The + * name contains the special token $$BCEL$$. Everything before that + * token is considered to be a package name. You can encode your own + * arguments into the subsequent string. You must ensure however not + * to use any "illegal" characters, i.e., characters that may not + * appear in a Java class name too
    + * + * The default implementation interprets the string as a encoded compressed + * Java class, unpacks and decodes it with the Utility.decode() method, and + * parses the resulting byte array and returns the resulting JavaClass object. + * + * @param class_name compressed byte code with "$$BCEL$$" in it + */ + protected JavaClass createClass( String class_name ) { + int index = class_name.indexOf(BCEL_TOKEN); + String real_name = class_name.substring(index + BCEL_TOKEN.length()); + JavaClass clazz = null; + try { + byte[] bytes = Utility.decode(real_name, true); + ClassParser parser = new ClassParser(new ByteArrayInputStream(bytes), "foo"); + clazz = parser.parse(); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + // Adapt the class name to the passed value + ConstantPool cp = clazz.getConstantPool(); + ConstantClass cl = (ConstantClass) cp.getConstant(clazz.getClassNameIndex(), + Constants.CONSTANT_Class); + ConstantUtf8 name = (ConstantUtf8) cp.getConstant(cl.getNameIndex(), + Constants.CONSTANT_Utf8); + name.setBytes(class_name.replace('.', '/')); + return clazz; + } +} diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassVector.java b/src/main/java/org/apache/commons/bcel6/util/ClassVector.java new file mode 100644 index 00000000..6eacaf20 --- /dev/null +++ b/src/main/java/org/apache/commons/bcel6/util/ClassVector.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.commons.bcel6.util; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.bcel6.classfile.JavaClass; + +/** + * Utility class implementing a (typesafe) collection of JavaClass + * objects. Contains the most important methods of a Vector. + * + * @version $Id$ + * + * @deprecated as of 5.1.1 - 7/17/2005 + */ +@Deprecated +public class ClassVector implements java.io.Serializable { + + private static final long serialVersionUID = 5600397075672780806L; + @Deprecated + protected List vec = new ArrayList(); + + + public void addElement( JavaClass clazz ) { + vec.add(clazz); + } + + + public JavaClass elementAt( int index ) { + return vec.get(index); + } + + + public void removeElementAt( int index ) { + vec.remove(index); + } + + + public JavaClass[] toArray() { + JavaClass[] classes = new JavaClass[vec.size()]; + vec.toArray(classes); + return classes; + } +} -- GitLab From f53ac2222d10c1f749a616919f6bcc383f599cec Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 11:10:49 +0000 Subject: [PATCH 1076/1313] Avoid NPE git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702427 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/FieldOrMethod.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index 2ad76f18..6b84a363 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -158,7 +158,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No */ public final void setAttributes( Attribute[] attributes ) { this.attributes = attributes; - this.attributes_count = attributes.length; // init deprecated field + this.attributes_count = attributes != null ? attributes.length : 0; // init deprecated field } -- GitLab From 9bebecefb2ffeffe0c2834b2be10aadb33b559e0 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 12:30:43 +0000 Subject: [PATCH 1077/1313] Move methods to correct class git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702445 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/ConstantCP.java | 24 ------------------- .../classfile/ConstantInvokeDynamic.java | 13 ++++++++-- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java index 9463f79e..5ca517b7 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java @@ -106,18 +106,6 @@ public abstract class ConstantCP extends Constant { } - /** - * @return Reference (index) to bootstrap method this constant refers to. - * - * Note that this method is a functional duplicate of getClassIndex - * for use by ConstantInvokeDynamic. - * @since 6.0 - */ - public final int getBootstrapMethodAttrIndex() { - return class_index; // AKA bootstrap_method_attr_index - } - - /** * @param class_index points to Constant_class */ @@ -126,18 +114,6 @@ public abstract class ConstantCP extends Constant { } - /** - * @param bootstrap_method_attr_index points to a BootstrapMethod. - * - * Note that this method is a functional duplicate of setClassIndex - * for use by ConstantInvokeDynamic. - * @since 6.0 - */ - public final void setBootstrapMethodAttrIndex(int bootstrap_method_attr_index) { - this.class_index = bootstrap_method_attr_index; - } - - /** * @return Reference (index) to signature of the field. */ diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java index fde87696..e4ddab97 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java @@ -69,13 +69,22 @@ public final class ConstantInvokeDynamic extends ConstantCP { v.visitConstantInvokeDynamic(this); } + /** + * @return Reference (index) to bootstrap method this constant refers to. + * + * Note that this method is a functional duplicate of getClassIndex + * for use by ConstantInvokeDynamic. + * @since 6.0 + */ + public final int getBootstrapMethodAttrIndex() { + return super.getClassIndex(); // AKA bootstrap_method_attr_index + } /** * @return String representation */ @Override public final String toString() { - // UNDONE: need to string replace "class_index" with "bootstrap_method_attr_index" - return super.toString(); + return super.toString().replace("class_index", "bootstrap_method_attr_index"); } } -- GitLab From f3fbdfc725b5f1644b7a436c38ce953d0b464a17 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 12:31:25 +0000 Subject: [PATCH 1078/1313] Method has moved git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702446 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/generic/ConstantPoolGen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index 5846a109..550234ed 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -147,7 +147,7 @@ public class ConstantPoolGen { ConstantUtf8 u8; if (c instanceof ConstantInvokeDynamic) { - class_name = Integer.toString(m.getBootstrapMethodAttrIndex()); + class_name = Integer.toString(((ConstantInvokeDynamic) m).getBootstrapMethodAttrIndex()); // since name can't begin with digit, can use // METHODREF_DELIM with out fear of duplicates. } else { -- GitLab From feba9d2cb9dcb009f64fb8107febf1af8a9b8b40 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 12:37:21 +0000 Subject: [PATCH 1079/1313] BCEL-221 BCELifier is not working for Java8Example Workround for crash; may need further work git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702447 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../apache/commons/bcel6/generic/INVOKEDYNAMIC.java | 11 +++++++++++ .../apache/commons/bcel6/util/BCELifierTestCase.java | 11 +++++------ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 699a1763..53775088 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + BCELifier is not working for Java8Example addition of hashCode() to generic/Instruction.java breaks Targeters. Never make distinct BranchInstructions compare equal Select constructor allows partially constructed instance to escape. Re-ordered code to delay the escape. Minor doc error in BranchInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java index ddf51326..3151b563 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java @@ -22,6 +22,8 @@ import java.io.IOException; import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.ExceptionConst; +import org.apache.commons.bcel6.classfile.ConstantInvokeDynamic; +import org.apache.commons.bcel6.classfile.ConstantNameAndType; import org.apache.commons.bcel6.classfile.ConstantPool; import org.apache.commons.bcel6.util.ByteSequence; @@ -115,4 +117,13 @@ public class INVOKEDYNAMIC extends InvokeInstruction { v.visitInvokeInstruction(this); v.visitINVOKEDYNAMIC(this); } + + /** + * Override the parent method because our classname is held elsewhere. + */ + public String getClassName( ConstantPoolGen cpg ) { + ConstantPool cp = cpg.getConstantPool(); + ConstantInvokeDynamic cid = (ConstantInvokeDynamic) cp.getConstant(super.getIndex(), Const.CONSTANT_InvokeDynamic); + return ((ConstantNameAndType) cp.getConstant(cid.getNameAndTypeIndex())).getName(cp); + } } diff --git a/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java b/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java index c21f4153..75e5b716 100644 --- a/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java @@ -2,21 +2,20 @@ package org.apache.commons.bcel6.util; import static org.junit.Assert.*; +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; + import org.apache.commons.bcel6.classfile.JavaClass; import org.junit.Test; -import static org.junit.Assume.assumeTrue; public class BCELifierTestCase { - // A bit of a hack - we use the same property as for the perf test for now - private static final boolean REPORT = Boolean.parseBoolean(System.getProperty("PerformanceTest.report", "true"));; - @Test public void test() throws Exception { - assumeTrue(REPORT); // set to false by pom so this will only run on demand + OutputStream os = new ByteArrayOutputStream(); JavaClass java_class = BCELifier.getJavaClass("Java8Example"); assertNotNull(java_class); - BCELifier bcelifier = new BCELifier(java_class, System.out); + BCELifier bcelifier = new BCELifier(java_class, os); bcelifier.start(); } -- GitLab From 042888cd680eb37a4461f7d35220954c0cc59055 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 13:52:35 +0000 Subject: [PATCH 1080/1313] Support InvokeDynamic git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702466 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/generic/InstructionFactory.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java index 411007cd..6c718a87 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java @@ -104,8 +104,10 @@ public class InstructionFactory { return new INVOKESTATIC(index); case Const.INVOKEINTERFACE: return new INVOKEINTERFACE(index, nargs + 1); + case Const.INVOKEDYNAMIC: + return new INVOKEDYNAMIC(index); default: - throw new RuntimeException("Oops: Unknown invoke kind:" + kind); + throw new RuntimeException("Oops: Unknown invoke kind: " + kind); } } -- GitLab From 38cf22a1846fef0a718386791f029b3ec7f125bf Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 13:54:01 +0000 Subject: [PATCH 1081/1313] Fix up strings to use the new non-deprecated class name git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702468 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/bcel6/util/BCELFactory.java | 7 ++++--- .../apache/commons/bcel6/util/BCELifier.java | 17 ++++++++++------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java b/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java index 83c13b16..fd08e06b 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java @@ -65,6 +65,7 @@ import org.apache.commons.bcel6.generic.Type; */ class BCELFactory extends EmptyVisitor { + private static final String CONSTANT_PREFIX = Const.class.getSimpleName()+"."; private final MethodGen _mg; private final PrintWriter _out; private final ConstantPoolGen _cp; @@ -150,7 +151,7 @@ class BCELFactory extends EmptyVisitor { String field_name = i.getFieldName(_cp); Type type = i.getFieldType(_cp); _out.println("il.append(_factory.createFieldAccess(\"" + class_name + "\", \"" + field_name - + "\", " + BCELifier.printType(type) + ", " + "Constants." + + "\", " + BCELifier.printType(type) + ", " + CONSTANT_PREFIX + Const.getOpcodeName(opcode).toUpperCase(Locale.ENGLISH) + "));"); } @@ -164,7 +165,7 @@ class BCELFactory extends EmptyVisitor { Type[] arg_types = i.getArgumentTypes(_cp); _out.println("il.append(_factory.createInvoke(\"" + class_name + "\", \"" + method_name + "\", " + BCELifier.printType(type) + ", " - + BCELifier.printArgumentTypes(arg_types) + ", " + "Constants." + + BCELifier.printArgumentTypes(arg_types) + ", " + CONSTANT_PREFIX + Const.getOpcodeName(opcode).toUpperCase(Locale.ENGLISH) + "));"); } @@ -298,7 +299,7 @@ class BCELFactory extends EmptyVisitor { target = "null"; } _out.println(" BranchInstruction " + name + " = _factory.createBranchInstruction(" - + "Constants." + bi.getName().toUpperCase(Locale.ENGLISH) + ", " + target + + CONSTANT_PREFIX + bi.getName().toUpperCase(Locale.ENGLISH) + ", " + target + ");"); } if (bh.hasTargeters()) { diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java index 606c0263..c34d47e2 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java @@ -55,8 +55,11 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { METHOD, }; - // The base package name for imports; assumes Constants is at the top level + // The base package name for imports; assumes Const is at the top level + // N.B we use the class so renames will be detected by the compiler/IDE private static final String BASE_PACKAGE = Const.class.getPackage().getName(); + private static final String CONSTANT_PREFIX = Const.class.getSimpleName()+"."; + private final JavaClass _clazz; private final PrintWriter _out; private final ConstantPoolGen _cp; @@ -95,7 +98,7 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { _out.println("import " + BASE_PACKAGE + ".*;"); _out.println("import java.io.*;"); _out.println(); - _out.println("public class " + class_name + "Creator implements Constants {"); + _out.println("public class " + class_name + "Creator {"); _out.println(" private InstructionFactory _factory;"); _out.println(" private ConstantPoolGen _cp;"); _out.println(" private ClassGen _cg;"); @@ -212,16 +215,16 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { for (int i = 0, pow = 1; pow <= Const.MAX_ACC_FLAG; i++) { if ((flags & pow) != 0) { if ((pow == Const.ACC_SYNCHRONIZED) && (location == FLAGS.CLASS)) { - buf.append("ACC_SUPER | "); + buf.append(CONSTANT_PREFIX+"ACC_SUPER | "); } else if ((pow == Const.ACC_VOLATILE) && (location == FLAGS.METHOD)) { - buf.append("ACC_BRIDGE | "); + buf.append(CONSTANT_PREFIX+"ACC_BRIDGE | "); } else if ((pow == Const.ACC_TRANSIENT) && (location == FLAGS.METHOD)) { - buf.append("ACC_VARARGS | "); + buf.append(CONSTANT_PREFIX+"ACC_VARARGS | "); } else { if (i < Const.ACCESS_NAMES_LENGTH) { - buf.append("ACC_").append(Const.getAccessName(i).toUpperCase(Locale.ENGLISH)).append( " | "); + buf.append(CONSTANT_PREFIX+"ACC_").append(Const.getAccessName(i).toUpperCase(Locale.ENGLISH)).append( " | "); } else { - buf.append(String.format ("ACC_BIT %x | ", pow)); + buf.append(String.format (CONSTANT_PREFIX+"ACC_BIT %x | ", pow)); } } } -- GitLab From 9bbff9dd617324ebe6487a7481a85cb291985293 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 11 Sep 2015 17:38:33 +0000 Subject: [PATCH 1082/1313] Add a round-trip BCELifier test case git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702521 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/util/BCELifierTestCase.java | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java b/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java index 75e5b716..66e8fa20 100644 --- a/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java @@ -2,12 +2,16 @@ package org.apache.commons.bcel6.util; import static org.junit.Assert.*; +import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; import java.io.OutputStream; - import org.apache.commons.bcel6.classfile.JavaClass; import org.junit.Test; + public class BCELifierTestCase { @Test @@ -19,4 +23,55 @@ public class BCELifierTestCase { bcelifier.start(); } + /* + * Dump a class using "javap" and compare with the same class recreated + * using BCELifier, "javac", "java" and dumped with "javap" + * TODO: detect if JDK present and skip test if not + */ + @Test + public void testJavapCompare() throws Exception { + testClassOnPath("target/test-classes/Java8Example.class"); + } + + private void testClassOnPath(String javaClass) throws Exception { + // Get javap of the input class + final String initial = exec(null, "javap", "-p", javaClass); + + final File workDir = new File("target"); + File infile = new File(javaClass); + JavaClass java_class = BCELifier.getJavaClass(infile.getName().replace(".class", "")); + assertNotNull(java_class); + File outfile = new File(workDir,infile.getName().replace(".class", "Creator.java")); + FileOutputStream fos = new FileOutputStream(outfile); + BCELifier bcelifier = new BCELifier(java_class, fos); + bcelifier.start(); + fos.close(); + exec(workDir, "javac", "-cp", "classes", outfile.getName()); + exec(workDir, "java", "-cp", ".:classes", outfile.getName().replace(".java", "")); + final String output = exec(workDir, "javap", "-p", infile.getName()); + assertEquals(initial, output); + } + + private String exec(File workDir, String ... args) throws Exception { +// System.err.println(java.util.Arrays.toString(args)); + ProcessBuilder pb = new ProcessBuilder( args ); + pb.directory(workDir); + Process proc = pb.start(); + BufferedInputStream is = new BufferedInputStream(proc.getInputStream()); + InputStream es = proc.getErrorStream(); + proc.waitFor(); + byte []buff=new byte[2048]; + int len; + while((len=es.read(buff)) != -1) { + System.err.print(new String(buff,0,len)); + } + + StringBuilder sb = new StringBuilder(); + while((len=is.read(buff)) != -1) { + sb.append(new String(buff,0,len)); + } + is.close(); + return sb.toString(); + } + } -- GitLab From fbd7d3c194dd6486cfb0ded10e9a449686d79709 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 12 Sep 2015 00:38:32 +0000 Subject: [PATCH 1083/1313] Test is not really working git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702580 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/util/BCELifierTestCase.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java b/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java index 66e8fa20..d9971728 100644 --- a/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java @@ -29,13 +29,14 @@ public class BCELifierTestCase { * TODO: detect if JDK present and skip test if not */ @Test + @org.junit.Ignore // does not work properly on some systems. Also the output is rather different public void testJavapCompare() throws Exception { testClassOnPath("target/test-classes/Java8Example.class"); } private void testClassOnPath(String javaClass) throws Exception { // Get javap of the input class - final String initial = exec(null, "javap", "-p", javaClass); + final String initial = exec(null, "javap", "-p", "-c", javaClass); final File workDir = new File("target"); File infile = new File(javaClass); @@ -48,7 +49,7 @@ public class BCELifierTestCase { fos.close(); exec(workDir, "javac", "-cp", "classes", outfile.getName()); exec(workDir, "java", "-cp", ".:classes", outfile.getName().replace(".java", "")); - final String output = exec(workDir, "javap", "-p", infile.getName()); + final String output = exec(workDir, "javap", "-p", "-c", infile.getName()); assertEquals(initial, output); } -- GitLab From af8f4784a11bb885bfb79b7ba1dc9620238103c4 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 12 Sep 2015 10:51:43 +0000 Subject: [PATCH 1084/1313] Class already implements Node.accept so show this git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702612 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/StackMapEntry.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index 0e1a6a95..f663d5ee 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -31,7 +31,7 @@ import org.apache.commons.bcel6.Const; * @see StackMap * @see StackMapType */ -public final class StackMapEntry implements Cloneable +public final class StackMapEntry implements Node, Cloneable { private int frame_type; @@ -404,6 +404,7 @@ public final class StackMapEntry implements Cloneable * * @param v Visitor object */ + @Override public void accept( Visitor v ) { v.visitStackMapEntry(this); } -- GitLab From 0b85abad6a951191875d8cb2af84a7da804c30c9 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 12 Sep 2015 11:22:02 +0000 Subject: [PATCH 1085/1313] BCEL-264 Add missing Node.accept() implementations (ConstantMethodHandle, ConstantMethodType, ParameterAnnotationEntry) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702615 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 3 ++- .../bcel6/classfile/ConstantMethodHandle.java | 2 +- .../bcel6/classfile/ConstantMethodType.java | 2 +- .../bcel6/classfile/DescendingVisitor.java | 25 +++++++++++++++++++ .../commons/bcel6/classfile/EmptyVisitor.java | 22 ++++++++++++++++ .../classfile/ParameterAnnotationEntry.java | 2 +- .../commons/bcel6/classfile/Visitor.java | 15 +++++++++++ .../bcel6/visitors/CounterVisitor.java | 21 ++++++++++++++++ 8 files changed, 88 insertions(+), 4 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 53775088..fb8d531e 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,7 +63,8 @@ The type attribute can be add,update,fix,remove. - BCELifier is not working for Java8Example + Add missing Node.accept() implementations (ConstantMethodHandle, ConstantMethodType, ParameterAnnotationEntry) + BCELifier is not working for Java8Example (incomplete) addition of hashCode() to generic/Instruction.java breaks Targeters. Never make distinct BranchInstructions compare equal Select constructor allows partially constructed instance to escape. Re-ordered code to delay the escape. Minor doc error in BranchInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java index f948bf47..f3f8efd0 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java @@ -71,7 +71,7 @@ public final class ConstantMethodHandle extends Constant { */ @Override public void accept( Visitor v ) { - // TODO Add .visitMethodHandle to Visitor interface + v.visitConstantMethodHandle(this); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java index 798c8614..1024ad01 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java @@ -69,7 +69,7 @@ public final class ConstantMethodType extends Constant { */ @Override public void accept( Visitor v ) { - // TODO Add .visitMethodType to Visitor interface + v.visitConstantMethodType(this); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java index 4d821e81..70e0391a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java @@ -529,4 +529,29 @@ public class DescendingVisitor implements Visitor obj.accept(visitor); stack.pop(); } + + /** @since 6.0 */ + @Override + public void visitConstantMethodType(ConstantMethodType obj) { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } + + /** @since 6.0 */ + @Override + public void visitConstantMethodHandle(ConstantMethodHandle obj) { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } + + /** @since 6.0 */ + @Override + public void visitParameterAnnotationEntry(ParameterAnnotationEntry obj) { + stack.push(obj); + obj.accept(visitor); + stack.pop(); + } + } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java b/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java index 73128b23..b39c1cee 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java @@ -274,4 +274,26 @@ public class EmptyVisitor implements Visitor public void visitMethodParameters(MethodParameters obj) { } + + /** + * @since 6.0 + */ + @Override + public void visitConstantMethodType(ConstantMethodType obj) + { + } + + /** + * @since 6.0 + */ + @Override + public void visitConstantMethodHandle(ConstantMethodHandle constantMethodHandle) { + } + + /** + * @since 6.0 + */ + @Override + public void visitParameterAnnotationEntry(ParameterAnnotationEntry parameterAnnotationEntry) { + } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java index d07059a4..2c9ba182 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java @@ -60,7 +60,7 @@ public class ParameterAnnotationEntry implements Node { */ @Override public void accept( Visitor v ) { - // v.visitParameterAnnotationEntry(this); + v.visitParameterAnnotationEntry(this); } /** diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java b/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java index ef7c1ca8..be78bebc 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java @@ -131,4 +131,19 @@ public interface Visitor * @since 6.0 */ void visitMethodParameters(MethodParameters obj); + + /** + * @since 6.0 + */ + void visitConstantMethodType(ConstantMethodType obj); + + /** + * @since 6.0 + */ + void visitConstantMethodHandle(ConstantMethodHandle obj); + + /** + * @since 6.0 + */ + void visitParameterAnnotationEntry(ParameterAnnotationEntry obj); } diff --git a/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java b/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java index 89447e30..ae487ea6 100644 --- a/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java +++ b/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java @@ -32,6 +32,8 @@ import org.apache.commons.bcel6.classfile.ConstantInteger; import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; import org.apache.commons.bcel6.classfile.ConstantInvokeDynamic; import org.apache.commons.bcel6.classfile.ConstantLong; +import org.apache.commons.bcel6.classfile.ConstantMethodHandle; +import org.apache.commons.bcel6.classfile.ConstantMethodType; import org.apache.commons.bcel6.classfile.ConstantMethodref; import org.apache.commons.bcel6.classfile.ConstantNameAndType; import org.apache.commons.bcel6.classfile.ConstantPool; @@ -52,6 +54,7 @@ import org.apache.commons.bcel6.classfile.LocalVariableTable; import org.apache.commons.bcel6.classfile.LocalVariableTypeTable; import org.apache.commons.bcel6.classfile.Method; import org.apache.commons.bcel6.classfile.MethodParameters; +import org.apache.commons.bcel6.classfile.ParameterAnnotationEntry; import org.apache.commons.bcel6.classfile.ParameterAnnotations; import org.apache.commons.bcel6.classfile.Signature; import org.apache.commons.bcel6.classfile.SourceFile; @@ -399,4 +402,22 @@ public class CounterVisitor implements Visitor { constantInvokeDynamic++; } + + /** @since 6.0 */ + @Override + public void visitConstantMethodType(ConstantMethodType obj) { + // TODO Auto-generated method stub + } + + /** @since 6.0 */ + @Override + public void visitConstantMethodHandle(ConstantMethodHandle constantMethodHandle) { + // TODO Auto-generated method stub + } + + /** @since 6.0 */ + @Override + public void visitParameterAnnotationEntry(ParameterAnnotationEntry parameterAnnotationEntry) { + // TODO Auto-generated method stub + } } -- GitLab From 72aebb5d85dce53f02bdca3685fdaeb9a99f55ed Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 12 Sep 2015 11:22:40 +0000 Subject: [PATCH 1086/1313] Add missing implementations git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702616 13f79535-47bb-0310-9956-ffa450edef68 --- .../statics/StringRepresentation.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java index 104ec532..d46d2f8f 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java @@ -18,6 +18,8 @@ package org.apache.commons.bcel6.verifier.statics; +import org.apache.commons.bcel6.classfile.AnnotationDefault; +import org.apache.commons.bcel6.classfile.AnnotationEntry; import org.apache.commons.bcel6.classfile.Annotations; import org.apache.commons.bcel6.classfile.BootstrapMethods; import org.apache.commons.bcel6.classfile.Code; @@ -28,7 +30,10 @@ import org.apache.commons.bcel6.classfile.ConstantFieldref; import org.apache.commons.bcel6.classfile.ConstantFloat; import org.apache.commons.bcel6.classfile.ConstantInteger; import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; +import org.apache.commons.bcel6.classfile.ConstantInvokeDynamic; import org.apache.commons.bcel6.classfile.ConstantLong; +import org.apache.commons.bcel6.classfile.ConstantMethodHandle; +import org.apache.commons.bcel6.classfile.ConstantMethodType; import org.apache.commons.bcel6.classfile.ConstantMethodref; import org.apache.commons.bcel6.classfile.ConstantNameAndType; import org.apache.commons.bcel6.classfile.ConstantPool; @@ -50,9 +55,12 @@ import org.apache.commons.bcel6.classfile.LocalVariableTypeTable; import org.apache.commons.bcel6.classfile.Method; import org.apache.commons.bcel6.classfile.MethodParameters; import org.apache.commons.bcel6.classfile.Node; +import org.apache.commons.bcel6.classfile.ParameterAnnotationEntry; +import org.apache.commons.bcel6.classfile.ParameterAnnotations; import org.apache.commons.bcel6.classfile.Signature; import org.apache.commons.bcel6.classfile.SourceFile; import org.apache.commons.bcel6.classfile.StackMap; +import org.apache.commons.bcel6.classfile.StackMapEntry; import org.apache.commons.bcel6.classfile.Synthetic; import org.apache.commons.bcel6.classfile.Unknown; import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; @@ -332,4 +340,68 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp public void visitMethodParameters(MethodParameters obj) { tostring = toString(obj); } + + /** + * @since 6.0 + */ + @Override + public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj) { + tostring = toString(obj); + } + + /** + * @since 6.0 + */ + @Override + public void visitStackMapEntry(StackMapEntry obj) { + tostring = toString(obj); + } + /** + * @since 6.0 + */ + + @Override + public void visitParameterAnnotation(ParameterAnnotations obj) { + tostring = toString(obj); + } + + /** + * @since 6.0 + */ + @Override + public void visitAnnotationEntry(AnnotationEntry obj) { + tostring = toString(obj); + } + + /** + * @since 6.0 + */ + @Override + public void visitAnnotationDefault(AnnotationDefault obj) { + tostring = toString(obj); + } + + /** + * @since 6.0 + */ + @Override + public void visitConstantMethodType(ConstantMethodType obj) { + tostring = toString(obj); + } + + /** + * @since 6.0 + */ + @Override + public void visitConstantMethodHandle(ConstantMethodHandle obj) { + tostring = toString(obj); + } + + /** + * @since 6.0 + */ + @Override + public void visitParameterAnnotationEntry(ParameterAnnotationEntry obj) { + tostring = toString(obj); + } } -- GitLab From a0f3392d441cf422b31348a90cdcdcb971fc6a69 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 12 Sep 2015 11:34:50 +0000 Subject: [PATCH 1087/1313] Messy line break git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702617 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/util/ConstantHTML.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java b/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java index 87ba5e72..f25defff 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java @@ -216,10 +216,7 @@ final class ConstantHTML { + "\">Signature index(" + signature_index + ")\n"); break; default: - file - .println("

    " - + Class2HTML.toHTML(constant_pool.constantToString(index, tag)) - + "\n"); + file.println("

    " + Class2HTML.toHTML(constant_pool.constantToString(index, tag)) + "\n"); } // switch } -- GitLab From a40c772427c8dd563184c1922ac73262982a16b2 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 12 Sep 2015 11:43:22 +0000 Subject: [PATCH 1088/1313] Tidy up line breaks git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702620 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/classfile/SimpleElementValue.java | 8 ++------ .../apache/commons/bcel6/generic/ElementValueGen.java | 6 ++---- .../commons/bcel6/generic/SimpleElementValueGen.java | 9 +++------ .../java/org/apache/commons/bcel6/util/CodeHTML.java | 3 +-- 4 files changed, 8 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java index aa8a78af..e67f9a28 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java @@ -196,9 +196,7 @@ public class SimpleElementValue extends ElementValue Const.CONSTANT_Utf8); return cu8.getBytes(); default: - throw new RuntimeException( - "SimpleElementValue class does not know how to stringify type " - + _type); + throw new RuntimeException("SimpleElementValue class does not know how to stringify type " + _type); } } @@ -221,9 +219,7 @@ public class SimpleElementValue extends ElementValue dos.writeShort(getIndex()); break; default: - throw new RuntimeException( - "SimpleElementValue doesnt know how to write out type " - + _type); + throw new RuntimeException("SimpleElementValue doesnt know how to write out type " + _type); } } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java index 20a58beb..c7b754ae 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java @@ -146,8 +146,7 @@ public abstract class ElementValueGen } return new ArrayElementValueGen(ARRAY, evalues, cpGen); default: - throw new RuntimeException( - "Unexpected element value kind in annotation: " + type); + throw new RuntimeException("Unexpected element value kind in annotation: " + type); } } @@ -189,8 +188,7 @@ public abstract class ElementValueGen return new ClassElementValueGen((ClassElementValue) value, cpool, copyPoolEntries); default: - throw new RuntimeException("Not implemented yet! (" - + value.getElementValueType() + ")"); + throw new RuntimeException("Not implemented yet! (" + value.getElementValueType() + ")"); } } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java index b87181fc..82ed073b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java @@ -163,8 +163,7 @@ public class SimpleElementValueGen extends ElementValueGen break; default: throw new RuntimeException( - "SimpleElementValueGen class does not know how " - + "to copy this type " + super.getElementValueType()); + "SimpleElementValueGen class does not know how to copy this type " + super.getElementValueType()); } } } @@ -241,8 +240,7 @@ public class SimpleElementValueGen extends ElementValueGen return cu8.getBytes(); default: throw new RuntimeException( - "SimpleElementValueGen class does not know how to stringify type " - + super.getElementValueType()); + "SimpleElementValueGen class does not know how to stringify type " + super.getElementValueType()); } } @@ -265,8 +263,7 @@ public class SimpleElementValueGen extends ElementValueGen break; default: throw new RuntimeException( - "SimpleElementValueGen doesnt know how to write out type " - + super.getElementValueType()); + "SimpleElementValueGen doesnt know how to write out type " + super.getElementValueType()); } } } diff --git a/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java b/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java index 4b96a6c8..75bfdda8 100644 --- a/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java @@ -367,8 +367,7 @@ final class CodeHTML { buf.append(bytes.readInt()); break; default: // Never reached - throw new IllegalStateException( - "Unreachable default case reached! "+Const.getOperandType(opcode, i)); + throw new IllegalStateException("Unreachable default case reached! "+Const.getOperandType(opcode, i)); } buf.append(" "); } -- GitLab From b5d2df194283d928c2664034bae4e2f872f6d58c Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 12 Sep 2015 12:06:27 +0000 Subject: [PATCH 1089/1313] Document other Constant types git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702625 13f79535-47bb-0310-9956-ffa450edef68 --- .../commons/bcel6/generic/ConstantPoolGen.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index 550234ed..93ee0c8f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -75,7 +75,7 @@ public class ConstantPoolGen { private static final String METHODREF_DELIM = ":"; private static final String IMETHODREF_DELIM = "#"; private static final String FIELDREF_DELIM = "&"; - private static final String NAT_DELIM = "%"; + private static final String NAT_DELIM = "%"; // Name and Type private static class Index { @@ -180,6 +180,22 @@ public class ConstantPoolGen { if (!cp_table.containsKey(key)) { cp_table.put(key, new Index(i)); } + } else if (c == null) { // entries may be null + // nothing to do + } else if (c instanceof ConstantInteger) { + // nothing to do + } else if (c instanceof ConstantLong) { + // nothing to do + } else if (c instanceof ConstantFloat) { + // nothing to do + } else if (c instanceof ConstantDouble) { + // nothing to do + } else if (c instanceof org.apache.commons.bcel6.classfile.ConstantMethodType) { + // TODO should this be handled somehow? + } else if (c instanceof org.apache.commons.bcel6.classfile.ConstantMethodHandle) { + // TODO should this be handled somehow? + } else { + assert false : "Unexpected constant type: " + c.getClass().getName(); } } } -- GitLab From a41a7fa5c8028c326eb81b37ae653be2dd623235 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 12 Sep 2015 12:09:01 +0000 Subject: [PATCH 1090/1313] Unnecessary git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1702626 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/verifier/tests/TestArray01.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java index 5b56dd5e..3bed0395 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java @@ -31,15 +31,12 @@ public class TestArray01{ return a; } - @SuppressWarnings("unused") public static void test2(Object o){ } - @SuppressWarnings("unused") public static void test3(Serializable o){ } - @SuppressWarnings("unused") public static void test4(Cloneable o){ } -- GitLab From e591fa7a306b1b65d628e86de36cbfd3e16d3f9f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Thu, 26 Nov 2015 15:11:03 +0000 Subject: [PATCH 1091/1313] Standardise tag names git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1716718 13f79535-47bb-0310-9956-ffa450edef68 --- doap_bcel.rdf | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/doap_bcel.rdf b/doap_bcel.rdf index 3f3f9e0e..400684f2 100644 --- a/doap_bcel.rdf +++ b/doap_bcel.rdf @@ -40,25 +40,25 @@ - + bcel 2006-06-07 - 5.2 - + 5.2 + - + bcel 2003-04-25 - 5.1 - + 5.1 + - + bcel 2001-12-15 - 5.0 - + 5.0 + -- GitLab From 67ae81169ed593eb53fcd147e6b825dd67e6aa0a Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 9 Dec 2015 17:32:04 +0000 Subject: [PATCH 1092/1313] Collect the DOAPs git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1718920 13f79535-47bb-0310-9956-ffa450edef68 --- doap_bcel.rdf | 65 --------------------------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 doap_bcel.rdf diff --git a/doap_bcel.rdf b/doap_bcel.rdf deleted file mode 100644 index 400684f2..00000000 --- a/doap_bcel.rdf +++ /dev/null @@ -1,65 +0,0 @@ - - - - - Apache Commons BCEL - - Java - - - - - - - - Bytecode Engineering Library - - The Byte Code Engineering Library is intended to give users a convenient possibility to analyze, create, and manipulate (binary) Java class files (those ending with .class). Classes are represented by objects which contain all the symbolic information of the given class: methods, fields and byte code instructions, in particular. - - - - - - - - - - bcel - 2006-06-07 - 5.2 - - - - - bcel - 2003-04-25 - 5.1 - - - - - bcel - 2001-12-15 - 5.0 - - - - - -- GitLab From 045d2ec6e1b1dc9294a2cabbe3112a1e2ee509f7 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 19 Jan 2016 06:19:36 +0000 Subject: [PATCH 1093/1313] Update copyright for 2016 in NOTICE.txt git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1725413 13f79535-47bb-0310-9956-ffa450edef68 --- NOTICE.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NOTICE.txt b/NOTICE.txt index d72d03a3..ced6c7b3 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,5 +1,5 @@ Apache Commons BCEL -Copyright 2004-2015 The Apache Software Foundation +Copyright 2004-2016 The Apache Software Foundation This product includes software developed at The Apache Software Foundation (http://www.apache.org/). -- GitLab From 07e0698ed6961ac535a8971e52d61e53f877f58e Mon Sep 17 00:00:00 2001 From: David Brosius Date: Fri, 5 Feb 2016 06:09:42 +0000 Subject: [PATCH 1094/1313] Issue BCEL-269: make sure instruction list gets completely written, patch by emopers git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1728607 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/generic/InstructionList.java | 584 +++++++++--------- 1 file changed, 277 insertions(+), 307 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java index 11d717e8..066159be 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java @@ -31,22 +31,16 @@ import org.apache.commons.bcel6.Const; import org.apache.commons.bcel6.classfile.Constant; import org.apache.commons.bcel6.util.ByteSequence; -/** - * This class is a container for a list of Instruction objects. Instructions can - * be appended, inserted, moved, deleted, etc.. Instructions are being - * wrapped into InstructionHandles objects that - * are returned upon append/insert operations. They give the user - * (read only) access to the list structure, such that it can be traversed and - * manipulated in a controlled way. +/** + * This class is a container for a list of Instruction objects. Instructions can be appended, inserted, moved, deleted, etc.. + * Instructions are being wrapped into InstructionHandles objects that are returned upon append/insert operations. They + * give the user (read only) access to the list structure, such that it can be traversed and manipulated in a controlled way. * - * A list is finally dumped to a byte code array with getByteCode. + * A list is finally dumped to a byte code array with getByteCode. * * @version $Id$ - * @see Instruction - * @see InstructionHandle + * @see Instruction + * @see InstructionHandle * @see BranchHandle */ public class InstructionList implements Iterable { @@ -56,43 +50,42 @@ public class InstructionList implements Iterable { private int length = 0; // number of elements in list private int[] byte_positions; // byte code offsets corresponding to instructions - /** * Create (empty) instruction list. */ public InstructionList() { } - /** * Create instruction list containing one instruction. - * @param i initial instruction + * + * @param i + * initial instruction */ public InstructionList(Instruction i) { append(i); } - /** * Create instruction list containing one instruction. - * @param i initial instruction + * + * @param i + * initial instruction */ public InstructionList(BranchInstruction i) { append(i); } - /** - * Initialize list with (nonnull) compound instruction. Consumes argument - * list, i.e., it becomes empty. + * Initialize list with (nonnull) compound instruction. Consumes argument list, i.e., it becomes empty. * - * @param c compound instruction (list) + * @param c + * compound instruction (list) */ public InstructionList(CompoundInstruction c) { append(c.getInstructionList()); } - /** * Test for empty list. */ @@ -100,22 +93,24 @@ public class InstructionList implements Iterable { return start == null; } // && end == null - /** - * Find the target instruction (handle) that corresponds to the given target - * position (byte code offset). + * Find the target instruction (handle) that corresponds to the given target position (byte code offset). * - * @param ihs array of instruction handles, i.e. il.getInstructionHandles() - * @param pos array of positions corresponding to ihs, i.e. il.getInstructionPositions() - * @param count length of arrays - * @param target target position to search for + * @param ihs + * array of instruction handles, i.e. il.getInstructionHandles() + * @param pos + * array of positions corresponding to ihs, i.e. il.getInstructionPositions() + * @param count + * length of arrays + * @param target + * target position to search for * @return target position's instruction handle if available */ - public static InstructionHandle findHandle( InstructionHandle[] ihs, int[] pos, int count, - int target ) { + public static InstructionHandle findHandle(InstructionHandle[] ihs, int[] pos, int count, int target) { int l = 0; int r = count - 1; - /* Do a binary search since the pos array is orderd. + /* + * Do a binary search since the pos array is orderd. */ do { int i = (l + r) / 2; @@ -131,20 +126,19 @@ public class InstructionList implements Iterable { return null; } - /** - * Get instruction handle for instruction at byte code position pos. - * This only works properly, if the list is freshly initialized from a byte array or + * Get instruction handle for instruction at byte code position pos. This only works properly, if the list is freshly initialized from a byte array or * setPositions() has been called before this method. * - * @param pos byte code position to search for + * @param pos + * byte code position to search for * @return target position's instruction handle if available */ - public InstructionHandle findHandle( int pos ) { + public InstructionHandle findHandle(int pos) { int[] positions = byte_positions; InstructionHandle ih = start; - for (int i = 0; i < length; i++) { - if(positions[i] == pos) { + for (int i = 0; i < length; i++) { + if (positions[i] == pos) { return ih; } ih = ih.getNext(); @@ -152,27 +146,27 @@ public class InstructionList implements Iterable { return null; } - /** * Initialize instruction list from byte array. * - * @param code byte array containing the instructions + * @param code + * byte array containing the instructions */ public InstructionList(byte[] code) { ByteSequence bytes = new ByteSequence(code); InstructionHandle[] ihs = new InstructionHandle[code.length]; int[] pos = new int[code.length]; // Can't be more than that int count = 0; // Contains actual length - /* Pass 1: Create an object for each byte code and append them - * to the list. + /* + * Pass 1: Create an object for each byte code and append them to the list. */ try { while (bytes.available() > 0) { // Remember byte offset and associate it with the instruction int off = bytes.getIndex(); pos[count] = off; - /* Read one instruction from the byte stream, the byte position is set - * accordingly. + /* + * Read one instruction from the byte stream, the byte position is set accordingly. */ Instruction i = Instruction.readInstruction(bytes); InstructionHandle ih; @@ -190,14 +184,15 @@ public class InstructionList implements Iterable { } byte_positions = new int[count]; // Trim to proper size System.arraycopy(pos, 0, byte_positions, 0, count); - /* Pass 2: Look for BranchInstruction and update their targets, i.e., - * convert offsets to instruction handles. + /* + * Pass 2: Look for BranchInstruction and update their targets, i.e., convert offsets to instruction handles. */ for (int i = 0; i < count; i++) { if (ihs[i] instanceof BranchHandle) { BranchInstruction bi = (BranchInstruction) ihs[i].getInstruction(); - int target = bi.getPosition() + bi.getIndex(); /* Byte code position: - * relative -> absolute. */ + int target = bi.getPosition() + bi.getIndex(); /* + * Byte code position: relative -> absolute. + */ // Search for target position InstructionHandle ih = findHandle(ihs, pos, count, target); if (ih == null) { @@ -214,23 +209,23 @@ public class InstructionList implements Iterable { if (ih == null) { throw new ClassGenException("Couldn't find target for switch: " + bi); } - s.setTarget(j, ih); // Update target + s.setTarget(j, ih); // Update target } } } } } - /** - * Append another list after instruction (handle) ih contained in this list. - * Consumes argument list, i.e., it becomes empty. + * Append another list after instruction (handle) ih contained in this list. Consumes argument list, i.e., it becomes empty. * - * @param ih where to append the instruction list - * @param il Instruction list to append to this one + * @param ih + * where to append the instruction list + * @param il + * Instruction list to append to this one * @return instruction handle pointing to the first appended instruction */ - public InstructionHandle append( InstructionHandle ih, InstructionList il ) { + public InstructionHandle append(InstructionHandle ih, InstructionList il) { if (il == null) { throw new ClassGenException("Appending null InstructionList"); } @@ -252,16 +247,16 @@ public class InstructionList implements Iterable { return ret; } - /** - * Append another list after instruction i contained in this list. - * Consumes argument list, i.e., it becomes empty. + * Append another list after instruction i contained in this list. Consumes argument list, i.e., it becomes empty. * - * @param i where to append the instruction list - * @param il Instruction list to append to this one + * @param i + * where to append the instruction list + * @param il + * Instruction list to append to this one * @return instruction handle pointing to the first appended instruction */ - public InstructionHandle append( Instruction i, InstructionList il ) { + public InstructionHandle append(Instruction i, InstructionList il) { InstructionHandle ih; if ((ih = findInstruction2(i)) == null) { throw new ClassGenException("Instruction " + i + " is not contained in this list."); @@ -269,15 +264,14 @@ public class InstructionList implements Iterable { return append(ih, il); } - /** - * Append another list to this one. - * Consumes argument list, i.e., it becomes empty. + * Append another list to this one. Consumes argument list, i.e., it becomes empty. * - * @param il list to append to end of this list + * @param il + * list to append to end of this list * @return instruction handle of the first appended instruction */ - public InstructionHandle append( InstructionList il ) { + public InstructionHandle append(InstructionList il) { if (il == null) { throw new ClassGenException("Appending null InstructionList"); } @@ -294,13 +288,13 @@ public class InstructionList implements Iterable { return append(end, il); // was end.instruction } - /** * Append an instruction to the end of this list. * - * @param ih instruction to append + * @param ih + * instruction to append */ - private void append( InstructionHandle ih ) { + private void append(InstructionHandle ih) { if (isEmpty()) { start = end = ih; ih.setNext(ih.setPrev(null)); @@ -313,101 +307,105 @@ public class InstructionList implements Iterable { length++; // Update length } - /** * Append an instruction to the end of this list. * - * @param i instruction to append + * @param i + * instruction to append * @return instruction handle of the appended instruction */ - public InstructionHandle append( Instruction i ) { + public InstructionHandle append(Instruction i) { InstructionHandle ih = InstructionHandle.getInstructionHandle(i); append(ih); return ih; } - /** * Append a branch instruction to the end of this list. * - * @param i branch instruction to append + * @param i + * branch instruction to append * @return branch instruction handle of the appended instruction */ - public BranchHandle append( BranchInstruction i ) { + public BranchHandle append(BranchInstruction i) { BranchHandle ih = BranchHandle.getBranchHandle(i); append(ih); return ih; } - /** - * Append a single instruction j after another instruction i, which - * must be in this list of course! + * Append a single instruction j after another instruction i, which must be in this list of course! * - * @param i Instruction in list - * @param j Instruction to append after i in list + * @param i + * Instruction in list + * @param j + * Instruction to append after i in list * @return instruction handle of the first appended instruction */ - public InstructionHandle append( Instruction i, Instruction j ) { + public InstructionHandle append(Instruction i, Instruction j) { return append(i, new InstructionList(j)); } - /** * Append a compound instruction, after instruction i. * - * @param i Instruction in list - * @param c The composite instruction (containing an InstructionList) + * @param i + * Instruction in list + * @param c + * The composite instruction (containing an InstructionList) * @return instruction handle of the first appended instruction */ - public InstructionHandle append( Instruction i, CompoundInstruction c ) { + public InstructionHandle append(Instruction i, CompoundInstruction c) { return append(i, c.getInstructionList()); } - /** * Append a compound instruction. * - * @param c The composite instruction (containing an InstructionList) + * @param c + * The composite instruction (containing an InstructionList) * @return instruction handle of the first appended instruction */ - public InstructionHandle append( CompoundInstruction c ) { + public InstructionHandle append(CompoundInstruction c) { return append(c.getInstructionList()); } - /** * Append a compound instruction. * - * @param ih where to append the instruction list - * @param c The composite instruction (containing an InstructionList) + * @param ih + * where to append the instruction list + * @param c + * The composite instruction (containing an InstructionList) * @return instruction handle of the first appended instruction */ - public InstructionHandle append( InstructionHandle ih, CompoundInstruction c ) { + public InstructionHandle append(InstructionHandle ih, CompoundInstruction c) { return append(ih, c.getInstructionList()); } - /** * Append an instruction after instruction (handle) ih contained in this list. * - * @param ih where to append the instruction list - * @param i Instruction to append + * @param ih + * where to append the instruction list + * @param i + * Instruction to append * @return instruction handle pointing to the first appended instruction */ - public InstructionHandle append( InstructionHandle ih, Instruction i ) { + public InstructionHandle append(InstructionHandle ih, Instruction i) { return append(ih, new InstructionList(i)); } - /** * Append an instruction after instruction (handle) ih contained in this list. * - * @param ih where to append the instruction list - * @param i Instruction to append + * @param ih + * where to append the instruction list + * @param i + * Instruction to append * @return instruction handle pointing to the first appended instruction */ - public BranchHandle append( InstructionHandle ih, BranchInstruction i ) { + public BranchHandle append(InstructionHandle ih, BranchInstruction i) { BranchHandle bh = BranchHandle.getBranchHandle(i); InstructionList il = new InstructionList(); il.append(bh); @@ -415,16 +413,16 @@ public class InstructionList implements Iterable { return bh; } - /** - * Insert another list before Instruction handle ih contained in this list. - * Consumes argument list, i.e., it becomes empty. + * Insert another list before Instruction handle ih contained in this list. Consumes argument list, i.e., it becomes empty. * - * @param ih where to append the instruction list - * @param il Instruction list to insert + * @param ih + * where to append the instruction list + * @param il + * Instruction list to insert * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert( InstructionHandle ih, InstructionList il ) { + public InstructionHandle insert(InstructionHandle ih, InstructionList il) { if (il == null) { throw new ClassGenException("Inserting null InstructionList"); } @@ -446,14 +444,14 @@ public class InstructionList implements Iterable { return ret; } - /** - * Insert another list. + * Insert another list. * - * @param il list to insert before start of this list + * @param il + * list to insert before start of this list * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert( InstructionList il ) { + public InstructionHandle insert(InstructionList il) { if (isEmpty()) { append(il); // Code is identical for this case return start; @@ -461,13 +459,13 @@ public class InstructionList implements Iterable { return insert(start, il); } - /** * Insert an instruction at start of this list. * - * @param ih instruction to insert + * @param ih + * instruction to insert */ - private void insert( InstructionHandle ih ) { + private void insert(InstructionHandle ih) { if (isEmpty()) { start = end = ih; ih.setNext(ih.setPrev(null)); @@ -480,17 +478,16 @@ public class InstructionList implements Iterable { length++; } - /** - * Insert another list before Instruction i contained in this list. - * Consumes argument list, i.e., it becomes empty. + * Insert another list before Instruction i contained in this list. Consumes argument list, i.e., it becomes empty. * - * @param i where to append the instruction list - * @param il Instruction list to insert - * @return instruction handle pointing to the first inserted instruction, - * i.e., il.getStart() + * @param i + * where to append the instruction list + * @param il + * Instruction list to insert + * @return instruction handle pointing to the first inserted instruction, i.e., il.getStart() */ - public InstructionHandle insert( Instruction i, InstructionList il ) { + public InstructionHandle insert(Instruction i, InstructionList il) { InstructionHandle ih; if ((ih = findInstruction1(i)) == null) { throw new ClassGenException("Instruction " + i + " is not contained in this list."); @@ -498,101 +495,105 @@ public class InstructionList implements Iterable { return insert(ih, il); } - /** * Insert an instruction at start of this list. * - * @param i instruction to insert + * @param i + * instruction to insert * @return instruction handle of the inserted instruction */ - public InstructionHandle insert( Instruction i ) { + public InstructionHandle insert(Instruction i) { InstructionHandle ih = InstructionHandle.getInstructionHandle(i); insert(ih); return ih; } - /** * Insert a branch instruction at start of this list. * - * @param i branch instruction to insert + * @param i + * branch instruction to insert * @return branch instruction handle of the appended instruction */ - public BranchHandle insert( BranchInstruction i ) { + public BranchHandle insert(BranchInstruction i) { BranchHandle ih = BranchHandle.getBranchHandle(i); insert(ih); return ih; } - /** - * Insert a single instruction j before another instruction i, which - * must be in this list of course! + * Insert a single instruction j before another instruction i, which must be in this list of course! * - * @param i Instruction in list - * @param j Instruction to insert before i in list + * @param i + * Instruction in list + * @param j + * Instruction to insert before i in list * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert( Instruction i, Instruction j ) { + public InstructionHandle insert(Instruction i, Instruction j) { return insert(i, new InstructionList(j)); } - /** * Insert a compound instruction before instruction i. * - * @param i Instruction in list - * @param c The composite instruction (containing an InstructionList) + * @param i + * Instruction in list + * @param c + * The composite instruction (containing an InstructionList) * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert( Instruction i, CompoundInstruction c ) { + public InstructionHandle insert(Instruction i, CompoundInstruction c) { return insert(i, c.getInstructionList()); } - /** * Insert a compound instruction. * - * @param c The composite instruction (containing an InstructionList) + * @param c + * The composite instruction (containing an InstructionList) * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert( CompoundInstruction c ) { + public InstructionHandle insert(CompoundInstruction c) { return insert(c.getInstructionList()); } - /** * Insert an instruction before instruction (handle) ih contained in this list. * - * @param ih where to insert to the instruction list - * @param i Instruction to insert + * @param ih + * where to insert to the instruction list + * @param i + * Instruction to insert * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert( InstructionHandle ih, Instruction i ) { + public InstructionHandle insert(InstructionHandle ih, Instruction i) { return insert(ih, new InstructionList(i)); } - /** * Insert a compound instruction. * - * @param ih where to insert the instruction list - * @param c The composite instruction (containing an InstructionList) + * @param ih + * where to insert the instruction list + * @param c + * The composite instruction (containing an InstructionList) * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert( InstructionHandle ih, CompoundInstruction c ) { + public InstructionHandle insert(InstructionHandle ih, CompoundInstruction c) { return insert(ih, c.getInstructionList()); } - /** * Insert an instruction before instruction (handle) ih contained in this list. * - * @param ih where to insert to the instruction list - * @param i Instruction to insert + * @param ih + * where to insert to the instruction list + * @param i + * Instruction to insert * @return instruction handle of the first inserted instruction */ - public BranchHandle insert( InstructionHandle ih, BranchInstruction i ) { + public BranchHandle insert(InstructionHandle ih, BranchInstruction i) { BranchHandle bh = BranchHandle.getBranchHandle(i); InstructionList il = new InstructionList(); il.append(bh); @@ -600,33 +601,31 @@ public class InstructionList implements Iterable { return bh; } - /** - * Take all instructions (handles) from "start" to "end" and append them after the - * new location "target". Of course, "end" must be after "start" and target must - * not be located withing this range. If you want to move something to the start of - * the list use null as value for target.
    + * Take all instructions (handles) from "start" to "end" and append them after the new location "target". Of course, "end" must be after "start" and target + * must not be located withing this range. If you want to move something to the start of the list use null as value for target.
    * Any instruction targeters pointing to handles within the block, keep their targets. * - * @param start of moved block - * @param end of moved block - * @param target of moved block + * @param start + * of moved block + * @param end + * of moved block + * @param target + * of moved block */ - public void move( InstructionHandle start, InstructionHandle end, InstructionHandle target ) { + public void move(InstructionHandle start, InstructionHandle end, InstructionHandle target) { // Step 1: Check constraints if ((start == null) || (end == null)) { throw new ClassGenException("Invalid null handle: From " + start + " to " + end); } if ((target == start) || (target == end)) { - throw new ClassGenException("Invalid range: From " + start + " to " + end - + " contains target " + target); + throw new ClassGenException("Invalid range: From " + start + " to " + end + " contains target " + target); } for (InstructionHandle ih = start; ih != end.getNext(); ih = ih.getNext()) { if (ih == null) { throw new ClassGenException("Invalid range: From " + start + " to " + end); } else if (ih == target) { - throw new ClassGenException("Invalid range: From " + start + " to " + end - + " contains target " + target); + throw new ClassGenException("Invalid range: From " + start + " to " + end + " contains target " + target); } } // Step 2: Temporarily remove the given instructions from the list @@ -663,28 +662,28 @@ public class InstructionList implements Iterable { } } - /** * Move a single instruction (handle) to a new location. * - * @param ih moved instruction - * @param target new location of moved instruction + * @param ih + * moved instruction + * @param target + * new location of moved instruction */ - public void move( InstructionHandle ih, InstructionHandle target ) { + public void move(InstructionHandle ih, InstructionHandle target) { move(ih, ih, target); } - /** - * Remove from instruction `prev' to instruction `next' both contained - * in this list. Throws TargetLostException when one of the removed instruction handles + * Remove from instruction `prev' to instruction `next' both contained in this list. Throws TargetLostException when one of the removed instruction handles * is still being targeted. * - * @param prev where to start deleting (predecessor, exclusive) - * @param next where to end deleting (successor, exclusive) + * @param prev + * where to start deleting (predecessor, exclusive) + * @param next + * where to end deleting (successor, exclusive) */ - private void remove( InstructionHandle prev, InstructionHandle next ) - throws TargetLostException { + private void remove(InstructionHandle prev, InstructionHandle next) throws TargetLostException { InstructionHandle first; InstructionHandle last; // First and last deleted instruction if ((prev == null) && (next == null)) { @@ -733,25 +732,23 @@ public class InstructionList implements Iterable { } } - /** - * Remove instruction from this list. The corresponding Instruction - * handles must not be reused! + * Remove instruction from this list. The corresponding Instruction handles must not be reused! * - * @param ih instruction (handle) to remove + * @param ih + * instruction (handle) to remove */ - public void delete( InstructionHandle ih ) throws TargetLostException { + public void delete(InstructionHandle ih) throws TargetLostException { remove(ih.getPrev(), ih.getNext()); } - /** - * Remove instruction from this list. The corresponding Instruction - * handles must not be reused! + * Remove instruction from this list. The corresponding Instruction handles must not be reused! * - * @param i instruction to remove + * @param i + * instruction to remove */ - public void delete( Instruction i ) throws TargetLostException { + public void delete(Instruction i) throws TargetLostException { InstructionHandle ih; if ((ih = findInstruction1(i)) == null) { throw new ClassGenException("Instruction " + i + " is not contained in this list."); @@ -759,29 +756,29 @@ public class InstructionList implements Iterable { delete(ih); } - /** - * Remove instructions from instruction `from' to instruction `to' contained - * in this list. The user must ensure that `from' is an instruction before - * `to', or risk havoc. The corresponding Instruction handles must not be reused! + * Remove instructions from instruction `from' to instruction `to' contained in this list. The user must ensure that `from' is an instruction before `to', + * or risk havoc. The corresponding Instruction handles must not be reused! * - * @param from where to start deleting (inclusive) - * @param to where to end deleting (inclusive) + * @param from + * where to start deleting (inclusive) + * @param to + * where to end deleting (inclusive) */ - public void delete( InstructionHandle from, InstructionHandle to ) throws TargetLostException { + public void delete(InstructionHandle from, InstructionHandle to) throws TargetLostException { remove(from.getPrev(), to.getNext()); } - /** - * Remove instructions from instruction `from' to instruction `to' contained - * in this list. The user must ensure that `from' is an instruction before - * `to', or risk havoc. The corresponding Instruction handles must not be reused! + * Remove instructions from instruction `from' to instruction `to' contained in this list. The user must ensure that `from' is an instruction before `to', + * or risk havoc. The corresponding Instruction handles must not be reused! * - * @param from where to start deleting (inclusive) - * @param to where to end deleting (inclusive) + * @param from + * where to start deleting (inclusive) + * @param to + * where to end deleting (inclusive) */ - public void delete( Instruction from, Instruction to ) throws TargetLostException { + public void delete(Instruction from, Instruction to) throws TargetLostException { InstructionHandle from_ih; InstructionHandle to_ih; if ((from_ih = findInstruction1(from)) == null) { @@ -793,14 +790,14 @@ public class InstructionList implements Iterable { delete(from_ih, to_ih); } - /** * Search for given Instruction reference, start at beginning of list. * - * @param i instruction to search for + * @param i + * instruction to search for * @return instruction found on success, null otherwise */ - private InstructionHandle findInstruction1( Instruction i ) { + private InstructionHandle findInstruction1(Instruction i) { for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { if (ih.getInstruction() == i) { return ih; @@ -809,14 +806,14 @@ public class InstructionList implements Iterable { return null; } - /** * Search for given Instruction reference, start at end of list * - * @param i instruction to search for + * @param i + * instruction to search for * @return instruction found on success, null otherwise */ - private InstructionHandle findInstruction2( Instruction i ) { + private InstructionHandle findInstruction2(Instruction i) { for (InstructionHandle ih = end; ih != null; ih = ih.getPrev()) { if (ih.getInstruction() == i) { return ih; @@ -825,8 +822,7 @@ public class InstructionList implements Iterable { return null; } - - public boolean contains( InstructionHandle i ) { + public boolean contains(InstructionHandle i) { if (i == null) { return false; } @@ -838,31 +834,28 @@ public class InstructionList implements Iterable { return false; } - - public boolean contains( Instruction i ) { + public boolean contains(Instruction i) { return findInstruction1(i) != null; } - public void setPositions() { // TODO could be package-protected? (some test code would need to be repackaged) setPositions(false); } - /** - * Give all instructions their position number (offset in byte stream), i.e., - * make the list ready to be dumped. + * Give all instructions their position number (offset in byte stream), i.e., make the list ready to be dumped. * - * @param check Perform sanity checks, e.g. if all targeted instructions really belong - * to this list + * @param check + * Perform sanity checks, e.g. if all targeted instructions really belong to this list */ - public void setPositions( boolean check ) { // called by code in other packages + public void setPositions(boolean check) { // called by code in other packages int max_additional_bytes = 0; int additional_bytes = 0; int index = 0; int count = 0; int[] pos = new int[length]; - /* Pass 0: Sanity checks + /* + * Pass 0: Sanity checks */ if (check) { for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { @@ -870,62 +863,56 @@ public class InstructionList implements Iterable { if (i instanceof BranchInstruction) { // target instruction within list? Instruction inst = ((BranchInstruction) i).getTarget().getInstruction(); if (!contains(inst)) { - throw new ClassGenException("Branch target of " - + Const.getOpcodeName(i.getOpcode()) + ":" + inst - + " not in instruction list"); + throw new ClassGenException("Branch target of " + Const.getOpcodeName(i.getOpcode()) + ":" + inst + " not in instruction list"); } if (i instanceof Select) { InstructionHandle[] targets = ((Select) i).getTargets(); for (InstructionHandle target : targets) { inst = target.getInstruction(); if (!contains(inst)) { - throw new ClassGenException("Branch target of " - + Const.getOpcodeName(i.getOpcode()) + ":" + inst - + " not in instruction list"); + throw new ClassGenException("Branch target of " + Const.getOpcodeName(i.getOpcode()) + ":" + inst + " not in instruction list"); } } } if (!(ih instanceof BranchHandle)) { - throw new ClassGenException("Branch instruction " - + Const.getOpcodeName(i.getOpcode()) + ":" + inst - + " not contained in BranchHandle."); + throw new ClassGenException( + "Branch instruction " + Const.getOpcodeName(i.getOpcode()) + ":" + inst + " not contained in BranchHandle."); } } } } - /* Pass 1: Set position numbers and sum up the maximum number of bytes an - * instruction may be shifted. + /* + * Pass 1: Set position numbers and sum up the maximum number of bytes an instruction may be shifted. */ for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { Instruction i = ih.getInstruction(); ih.setPosition(index); pos[count++] = index; - /* Get an estimate about how many additional bytes may be added, because - * BranchInstructions may have variable length depending on the target - * offset (short vs. int) or alignment issues (TABLESWITCH and - * LOOKUPSWITCH). + /* + * Get an estimate about how many additional bytes may be added, because BranchInstructions may have variable length depending on the target offset + * (short vs. int) or alignment issues (TABLESWITCH and LOOKUPSWITCH). */ switch (i.getOpcode()) { case Const.JSR: case Const.GOTO: max_additional_bytes += 2; - break; + break; case Const.TABLESWITCH: case Const.LOOKUPSWITCH: max_additional_bytes += 3; - break; + break; } index += i.getLength(); } - /* Pass 2: Expand the variable-length (Branch)Instructions depending on - * the target offset (short or int) and ensure that branch targets are - * within this list. + /* + * Pass 2: Expand the variable-length (Branch)Instructions depending on the target offset (short or int) and ensure that branch targets are within this + * list. */ for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { additional_bytes += ih.updatePosition(additional_bytes, max_additional_bytes); } - /* Pass 3: Update position numbers (which may have changed due to the - * preceding expansions), like pass 1. + /* + * Pass 3: Update position numbers (which may have changed due to the preceding expansions), like pass 1. */ index = count = 0; for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { @@ -938,10 +925,8 @@ public class InstructionList implements Iterable { System.arraycopy(pos, 0, byte_positions, 0, count); } - /** - * When everything is finished, use this method to convert the instruction - * list into an array of bytes. + * When everything is finished, use this method to convert the instruction list into an array of bytes. * * @return the byte code ready to be dumped */ @@ -955,6 +940,7 @@ public class InstructionList implements Iterable { Instruction i = ih.getInstruction(); i.dump(out); // Traverse list } + out.flush(); } catch (IOException e) { System.err.println(e); return new byte[0]; @@ -962,7 +948,6 @@ public class InstructionList implements Iterable { return b.toByteArray(); } - /** * @return an array of instructions without target information for branch instructions. */ @@ -979,18 +964,17 @@ public class InstructionList implements Iterable { return instructions.toArray(new Instruction[instructions.size()]); } - @Override public String toString() { return toString(true); } - /** - * @param verbose toggle output format + * @param verbose + * toggle output format * @return String containing all instructions in this list. */ - public String toString( boolean verbose ) { + public String toString(boolean verbose) { StringBuilder buf = new StringBuilder(); for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { buf.append(ih.toString(verbose)).append("\n"); @@ -998,16 +982,15 @@ public class InstructionList implements Iterable { return buf.toString(); } - /** * @return iterator that lists all instructions (handles) */ + @Override public Iterator iterator() { return new Iterator() { private InstructionHandle ih = start; - @Override public InstructionHandle next() throws NoSuchElementException { if (ih == null) { @@ -1018,13 +1001,11 @@ public class InstructionList implements Iterable { return i; } - @Override public void remove() { throw new UnsupportedOperationException(); } - @Override public boolean hasNext() { return ih != null; @@ -1032,7 +1013,6 @@ public class InstructionList implements Iterable { }; } - /** * @return array containing all instructions (handles) */ @@ -1046,11 +1026,9 @@ public class InstructionList implements Iterable { return ihs; } - /** - * Get positions (offsets) of all instructions in the list. This relies on that - * the list has been freshly created from an byte code array, or that setPositions() - * has been called. Otherwise this may be inaccurate. + * Get positions (offsets) of all instructions in the list. This relies on that the list has been freshly created from an byte code array, or that + * setPositions() has been called. Otherwise this may be inaccurate. * * @return array containing all instruction's offset in byte code */ @@ -1058,16 +1036,14 @@ public class InstructionList implements Iterable { return byte_positions; } - /** * @return complete, i.e., deep copy of this list */ public InstructionList copy() { Map map = new HashMap<>(); InstructionList il = new InstructionList(); - /* Pass 1: Make copies of all instructions, append them to the new list - * and associate old instruction references with the new ones, i.e., - * a 1:1 mapping. + /* + * Pass 1: Make copies of all instructions, append them to the new list and associate old instruction references with the new ones, i.e., a 1:1 mapping. */ for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { Instruction i = ih.getInstruction(); @@ -1078,7 +1054,8 @@ public class InstructionList implements Iterable { map.put(ih, il.append(c)); } } - /* Pass 2: Update branch targets. + /* + * Pass 2: Update branch targets. */ InstructionHandle ih = start; InstructionHandle ch = il.start; @@ -1105,11 +1082,10 @@ public class InstructionList implements Iterable { return il; } - - /** Replace all references to the old constant pool with references to the new - * constant pool + /** + * Replace all references to the old constant pool with references to the new constant pool */ - public void replaceConstantPool( ConstantPoolGen old_cp, ConstantPoolGen new_cp ) { + public void replaceConstantPool(ConstantPoolGen old_cp, ConstantPoolGen new_cp) { for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { Instruction i = ih.getInstruction(); if (i instanceof CPInstruction) { @@ -1120,30 +1096,26 @@ public class InstructionList implements Iterable { } } - private void clear() { start = end = null; length = 0; } - /** - * Delete contents of list. Provides better memory utilization, - * because the system then may reuse the instruction handles. This - * method is typically called right after {@link MethodGen#getMethod()}. + * Delete contents of list. Provides better memory utilization, because the system then may reuse the instruction handles. This method is typically called + * right after {@link MethodGen#getMethod()}. */ public void dispose() { // Traverse in reverse order, because ih.next is overwritten for (InstructionHandle ih = end; ih != null; ih = ih.getPrev()) { - /* Causes BranchInstructions to release target and targeters, because it - * calls dispose() on the contained instruction. + /* + * Causes BranchInstructions to release target and targeters, because it calls dispose() on the contained instruction. */ ih.dispose(); } clear(); } - /** * @return start of list */ @@ -1151,7 +1123,6 @@ public class InstructionList implements Iterable { return start; } - /** * @return end of list */ @@ -1159,7 +1130,6 @@ public class InstructionList implements Iterable { return end; } - /** * @return length of list (Number of instructions, not bytes) */ @@ -1167,7 +1137,6 @@ public class InstructionList implements Iterable { return length; } - /** * @return length of list (Number of instructions, not bytes) */ @@ -1175,15 +1144,15 @@ public class InstructionList implements Iterable { return length; } - /** - * Redirect all references from old_target to new_target, i.e., update targets - * of branch instructions. + * Redirect all references from old_target to new_target, i.e., update targets of branch instructions. * - * @param old_target the old target instruction handle - * @param new_target the new target instruction handle + * @param old_target + * the old target instruction handle + * @param new_target + * the new target instruction handle */ - public void redirectBranches( InstructionHandle old_target, InstructionHandle new_target ) { + public void redirectBranches(InstructionHandle old_target, InstructionHandle new_target) { for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { Instruction i = ih.getInstruction(); if (i instanceof BranchInstruction) { @@ -1204,17 +1173,18 @@ public class InstructionList implements Iterable { } } - /** * Redirect all references of local variables from old_target to new_target. * - * @param lg array of local variables - * @param old_target the old target instruction handle - * @param new_target the new target instruction handle + * @param lg + * array of local variables + * @param old_target + * the old target instruction handle + * @param new_target + * the new target instruction handle * @see MethodGen */ - public void redirectLocalVariables( LocalVariableGen[] lg, InstructionHandle old_target, - InstructionHandle new_target ) { + public void redirectLocalVariables(LocalVariableGen[] lg, InstructionHandle old_target, InstructionHandle new_target) { for (LocalVariableGen element : lg) { InstructionHandle start = element.getStart(); InstructionHandle end = element.getEnd(); @@ -1227,17 +1197,18 @@ public class InstructionList implements Iterable { } } - /** * Redirect all references of exception handlers from old_target to new_target. * - * @param exceptions array of exception handlers - * @param old_target the old target instruction handle - * @param new_target the new target instruction handle + * @param exceptions + * array of exception handlers + * @param old_target + * the old target instruction handle + * @param new_target + * the new target instruction handle * @see MethodGen */ - public void redirectExceptionHandlers( CodeExceptionGen[] exceptions, - InstructionHandle old_target, InstructionHandle new_target ) { + public void redirectExceptionHandlers(CodeExceptionGen[] exceptions, InstructionHandle old_target, InstructionHandle new_target) { for (CodeExceptionGen exception : exceptions) { if (exception.getStartPC() == old_target) { exception.setStartPC(new_target); @@ -1253,29 +1224,28 @@ public class InstructionList implements Iterable { private List observers; - - /** Add observer for this object. + /** + * Add observer for this object. */ - public void addObserver( InstructionListObserver o ) { + public void addObserver(InstructionListObserver o) { if (observers == null) { observers = new ArrayList<>(); } observers.add(o); } - - /** Remove observer for this object. + /** + * Remove observer for this object. */ - public void removeObserver( InstructionListObserver o ) { + public void removeObserver(InstructionListObserver o) { if (observers != null) { observers.remove(o); } } - - /** Call notify() method on all observers. This method is not called - * automatically whenever the state has changed, but has to be - * called by the user after he has finished editing the object. + /** + * Call notify() method on all observers. This method is not called automatically whenever the state has changed, but has to be called by the user after he + * has finished editing the object. */ public void update() { if (observers != null) { -- GitLab From 6224b1a337746ffcd170ff09e1a55a1f0e5138e2 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 22 Apr 2016 16:14:30 +0000 Subject: [PATCH 1095/1313] commons-parent 38 -> 39. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1740553 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 850b3c62..394d5119 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ org.apache.commons commons-parent - 38 + 39 org.apache.commons -- GitLab From 62e637d1ac3b4b7fa32f7cdf76cb27bd76b3f79a Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 22 Apr 2016 23:14:34 +0000 Subject: [PATCH 1096/1313] Update tests from Apache Commons IO 2.4 to 2.5. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1740620 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 394d5119..45c59b67 100644 --- a/pom.xml +++ b/pom.xml @@ -424,7 +424,7 @@ commons-io commons-io - 2.4 + 2.5 test -- GitLab From 65a7d362bb81d68ac44968de3e18410ab8162599 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 26 Apr 2016 19:08:31 +0000 Subject: [PATCH 1097/1313] Update tests from Apache Commons Collection 4.0 to 4.1. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1741074 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 45c59b67..1c15ccd8 100644 --- a/pom.xml +++ b/pom.xml @@ -431,7 +431,7 @@ org.apache.commons commons-collections4 - 4.0 + 4.1 test -- GitLab From 0a8d5d3b9b5f516432e9cd1aed016ac5eb628f71 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 26 Apr 2016 19:09:35 +0000 Subject: [PATCH 1098/1313] findbugs-maven-plugin 3.0.2 -> 3.0.3 on Java 7. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1741075 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1c15ccd8..c7710b87 100644 --- a/pom.xml +++ b/pom.xml @@ -379,7 +379,7 @@ [1.7,) - 3.0.2 + 3.0.3 -- GitLab From 466351e60ae08e9677adcf71198776252787ed84 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 26 Apr 2016 19:13:02 +0000 Subject: [PATCH 1099/1313] We do not need a JDK 7 profile since we require a mininum of Java 7. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1741076 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index c7710b87..dc05eea1 100644 --- a/pom.xml +++ b/pom.xml @@ -55,7 +55,7 @@ BCEL 12314220 - 2.5.5 + 3.0.3 2.16 @@ -373,16 +373,6 @@ - - jdk7 - - [1.7,) - - - 3.0.3 - - - jdk-rt -- GitLab From c8224b1745b8c4408ff4a16cd42eb3d1a7895458 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 26 Apr 2016 19:14:43 +0000 Subject: [PATCH 1100/1313] Override parent with commons.findbugs.version property. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1741077 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index dc05eea1..0fdcde33 100644 --- a/pom.xml +++ b/pom.xml @@ -55,7 +55,7 @@ BCEL 12314220 - 3.0.3 + 3.0.3 2.16 @@ -315,7 +315,7 @@ org.codehaus.mojo findbugs-maven-plugin - ${findbugs.plugin.version} + ${commons.findbugs.version} Normal Default -- GitLab From 3431d46a60e643d5b6fcc560935dfb22cdbed590 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 26 Apr 2016 19:20:38 +0000 Subject: [PATCH 1101/1313] cobertura-maven-plugin 2.6 -> 2.7. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1741083 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0fdcde33..6b361054 100644 --- a/pom.xml +++ b/pom.xml @@ -340,7 +340,7 @@ org.codehaus.mojo cobertura-maven-plugin - 2.6 + 2.7 org.apache.rat -- GitLab From 6db5764c3a7a05a4befe0d6fe4642fa25ebaa257 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Sat, 30 Apr 2016 00:33:09 +0000 Subject: [PATCH 1102/1313] commons-parent 39 -> 40. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1741710 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6b361054..1c9b5e65 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ org.apache.commons commons-parent - 39 + 40 org.apache.commons -- GitLab From 9b841a30265fe0652e5e94c338ef82970363f4ca Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sat, 28 May 2016 05:29:40 +0000 Subject: [PATCH 1103/1313] add support for invokedynamic git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1745834 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/Constants.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Constants.java b/src/main/java/org/apache/commons/bcel6/Constants.java index 2d38e9cc..afa6495b 100644 --- a/src/main/java/org/apache/commons/bcel6/Constants.java +++ b/src/main/java/org/apache/commons/bcel6/Constants.java @@ -1034,6 +1034,10 @@ public interface Constants { * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEINTERFACE = 185; + /** Java VM opcode. + * @see + * Opcode definitions in The Java Virtual Machine Specification */ + public static final short INVOKEDYNAMIC = 186; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ @@ -1387,7 +1391,7 @@ public interface Constants { 0/*dreturn*/, 0/*areturn*/, 0/*return*/, 2/*getstatic*/, 2/*putstatic*/, 2/*getfield*/, 2/*putfield*/, 2/*invokevirtual*/, 2/*invokespecial*/, 2/*invokestatic*/, - 4/*invokeinterface*/, UNDEFINED, 2/*new*/, + 4/*invokeinterface*/, 4/*invokedynamic*/, 2/*new*/, 1/*newarray*/, 2/*anewarray*/, 0/*arraylength*/, 0/*athrow*/, 2/*checkcast*/, 2/*instanceof*/, 0/*monitorenter*/, @@ -1460,7 +1464,7 @@ public interface Constants { {T_SHORT}/*putstatic*/, {T_SHORT}/*getfield*/, {T_SHORT}/*putfield*/, {T_SHORT}/*invokevirtual*/, {T_SHORT}/*invokespecial*/, {T_SHORT}/*invokestatic*/, - {T_SHORT, T_BYTE, T_BYTE}/*invokeinterface*/, {}, + {T_SHORT, T_BYTE, T_BYTE}/*invokeinterface*/, {T_SHORT, T_BYTE, T_BYTE}/*invokedynamic*/, {T_SHORT}/*new*/, {T_BYTE}/*newarray*/, {T_SHORT}/*anewarray*/, {}/*arraylength*/, {}/*athrow*/, {T_SHORT}/*checkcast*/, {T_SHORT}/*instanceof*/, @@ -1507,7 +1511,7 @@ public interface Constants { "tableswitch", "lookupswitch", "ireturn", "lreturn", "freturn", "dreturn", "areturn", "return", "getstatic", "putstatic", "getfield", "putfield", "invokevirtual", "invokespecial", "invokestatic", - "invokeinterface", ILLEGAL_OPCODE, "new", "newarray", "anewarray", + "invokeinterface", "invokedynamic", "new", "newarray", "anewarray", "arraylength", "athrow", "checkcast", "instanceof", "monitorenter", "monitorexit", "wide", "multianewarray", "ifnull", "ifnonnull", "goto_w", "jsr_w", "breakpoint", ILLEGAL_OPCODE, ILLEGAL_OPCODE, @@ -1563,7 +1567,7 @@ public interface Constants { UNPREDICTABLE/*putstatic*/, 1/*getfield*/, UNPREDICTABLE/*putfield*/, UNPREDICTABLE/*invokevirtual*/, UNPREDICTABLE/*invokespecial*/, UNPREDICTABLE/*invokestatic*/, - UNPREDICTABLE/*invokeinterface*/, UNDEFINED, 0/*new*/, 1/*newarray*/, 1/*anewarray*/, + UNPREDICTABLE/*invokeinterface*/, UNPREDICTABLE/*invokedynamic*/, 0/*new*/, 1/*newarray*/, 1/*anewarray*/, 1/*arraylength*/, 1/*athrow*/, 1/*checkcast*/, 1/*instanceof*/, 1/*monitorenter*/, 1/*monitorexit*/, 0/*wide*/, UNPREDICTABLE/*multianewarray*/, 1/*ifnull*/, 1/*ifnonnull*/, 0/*goto_w*/, 0/*jsr_w*/, 0/*breakpoint*/, UNDEFINED, UNDEFINED, @@ -1619,7 +1623,7 @@ public interface Constants { 0/*dreturn*/, 0/*areturn*/, 0/*return*/, UNPREDICTABLE/*getstatic*/, 0/*putstatic*/, UNPREDICTABLE/*getfield*/, 0/*putfield*/, UNPREDICTABLE/*invokevirtual*/, UNPREDICTABLE/*invokespecial*/, UNPREDICTABLE/*invokestatic*/, - UNPREDICTABLE/*invokeinterface*/, UNDEFINED, 1/*new*/, 1/*newarray*/, 1/*anewarray*/, + UNPREDICTABLE/*invokeinterface*/, UNPREDICTABLE/*invokedynamic*/, 1/*new*/, 1/*newarray*/, 1/*anewarray*/, 1/*arraylength*/, 1/*athrow*/, 1/*checkcast*/, 1/*instanceof*/, 0/*monitorenter*/, 0/*monitorexit*/, 0/*wide*/, 1/*multianewarray*/, 0/*ifnull*/, 0/*ifnonnull*/, 0/*goto_w*/, 1/*jsr_w*/, 0/*breakpoint*/, UNDEFINED, UNDEFINED, -- GitLab From 387455c408f9de0a9870a215e1e6b9497bef1eff Mon Sep 17 00:00:00 2001 From: David Brosius Date: Sat, 28 May 2016 20:31:42 +0000 Subject: [PATCH 1104/1313] Issue BCEL-73: Allow for instance based repositories git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1745933 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/util/ClassPathRepository.java | 171 +++++++++++++++++ .../MemorySensitiveClassPathRepository.java | 177 ++++++++++++++++++ .../bcel6/util/SyntheticRepository.java | 174 +---------------- 3 files changed, 356 insertions(+), 166 deletions(-) create mode 100644 src/main/java/org/apache/commons/bcel6/util/ClassPathRepository.java create mode 100644 src/main/java/org/apache/commons/bcel6/util/MemorySensitiveClassPathRepository.java diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPathRepository.java b/src/main/java/org/apache/commons/bcel6/util/ClassPathRepository.java new file mode 100644 index 00000000..a7c717cc --- /dev/null +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPathRepository.java @@ -0,0 +1,171 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.commons.bcel6.util; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.JavaClass; + +/** + * This repository is used in situations where a Class is created outside the realm of a ClassLoader. Classes are loaded from the file systems using the paths + * specified in the given class path. By default, this is the value returned by ClassPath.getClassPath().
    + * + * @see org.apache.commons.bcel6.Repository + */ +public class ClassPathRepository implements Repository { + + private ClassPath _path = null; + private final Map _loadedClasses = new HashMap<>(); // CLASSNAME X JAVACLASS + + public ClassPathRepository(ClassPath path) { + _path = path; + } + + /** + * Store a new JavaClass instance into this Repository. + */ + @Override + public void storeClass(JavaClass clazz) { + _loadedClasses.put(clazz.getClassName(), clazz); + clazz.setRepository(this); + } + + /** + * Remove class from repository + */ + @Override + public void removeClass(JavaClass clazz) { + _loadedClasses.remove(clazz.getClassName()); + } + + /** + * Find an already defined (cached) JavaClass object by name. + */ + @Override + public JavaClass findClass(String className) { + return _loadedClasses.get(className); + } + + /** + * Find a JavaClass object by name. If it is already in this Repository, the Repository version is returned. Otherwise, the Repository's classpath is + * searched for the class (and it is added to the Repository if found). + * + * @param className + * the name of the class + * @return the JavaClass object + * @throws ClassNotFoundException + * if the class is not in the Repository, and could not be found on the classpath + */ + @Override + public JavaClass loadClass(String className) throws ClassNotFoundException { + if ((className == null) || className.equals("")) { + throw new IllegalArgumentException("Invalid class name " + className); + } + className = className.replace('/', '.'); // Just in case, canonical form + JavaClass clazz = findClass(className); + if (clazz != null) { + return clazz; + } + try { + return loadClass(_path.getInputStream(className), className); + } catch (IOException e) { + throw new ClassNotFoundException("Exception while looking for class " + className + ": " + e, e); + } + } + + /** + * Find the JavaClass object for a runtime Class object. If a class with the same name is already in this Repository, the Repository version is returned. + * Otherwise, getResourceAsStream() is called on the Class object to find the class's representation. If the representation is found, it is added to the + * Repository. + * + * @see Class + * @param clazz + * the runtime Class object + * @return JavaClass object for given runtime class + * @throws ClassNotFoundException + * if the class is not in the Repository, and its representation could not be found + */ + @Override + public JavaClass loadClass(Class clazz) throws ClassNotFoundException { + InputStream clsStream = null; + try { + String className = clazz.getName(); + JavaClass repositoryClass = findClass(className); + if (repositoryClass != null) { + return repositoryClass; + } + String name = className; + int i = name.lastIndexOf('.'); + if (i > 0) { + name = name.substring(i + 1); + } + clsStream = clazz.getResourceAsStream(name + ".class"); + return loadClass(clsStream, className); + } finally { + try { + if (clsStream != null) { + clsStream.close(); + } + } catch (IOException ioe) { + // don't care + } + } + } + + private JavaClass loadClass(InputStream is, String className) throws ClassNotFoundException { + try { + if (is != null) { + ClassParser parser = new ClassParser(is, className); + JavaClass clazz = parser.parse(); + storeClass(clazz); + return clazz; + } + } catch (IOException e) { + throw new ClassNotFoundException("Exception while looking for class " + className + ": " + e, e); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + // ignored + } + } + } + throw new ClassNotFoundException("SyntheticRepository could not load " + className); + } + + /** + * ClassPath associated with the Repository. + */ + @Override + public ClassPath getClassPath() { + return _path; + } + + /** + * Clear all entries from cache. + */ + @Override + public void clear() { + _loadedClasses.clear(); + } +} diff --git a/src/main/java/org/apache/commons/bcel6/util/MemorySensitiveClassPathRepository.java b/src/main/java/org/apache/commons/bcel6/util/MemorySensitiveClassPathRepository.java new file mode 100644 index 00000000..595dfc68 --- /dev/null +++ b/src/main/java/org/apache/commons/bcel6/util/MemorySensitiveClassPathRepository.java @@ -0,0 +1,177 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.commons.bcel6.util; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.ref.SoftReference; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.commons.bcel6.classfile.JavaClass; + +/** + * This repository is used in situations where a Class is created outside the realm of a ClassLoader. Classes are loaded from the file systems using the paths + * specified in the given class path. By default, this is the value returned by ClassPath.getClassPath(). This repository holds onto classes with + * SoftReferences, and will reload as needed, in cases where memory sizes are important.
    + * + * @see org.apache.commons.bcel6.Repository + */ +public class MemorySensitiveClassPathRepository implements Repository { + + private ClassPath _path = null; + private final Map> _loadedClasses = new HashMap<>(); // CLASSNAME X JAVACLASS + + public MemorySensitiveClassPathRepository(ClassPath path) { + _path = path; + } + + /** + * Store a new JavaClass instance into this Repository. + */ + @Override + public void storeClass(JavaClass clazz) { + _loadedClasses.put(clazz.getClassName(), new SoftReference<>(clazz)); + clazz.setRepository(this); + } + + /** + * Remove class from repository + */ + @Override + public void removeClass(JavaClass clazz) { + _loadedClasses.remove(clazz.getClassName()); + } + + /** + * Find an already defined (cached) JavaClass object by name. + */ + @Override + public JavaClass findClass(String className) { + SoftReference ref = _loadedClasses.get(className); + if (ref == null) { + return null; + } + return ref.get(); + } + + /** + * Find a JavaClass object by name. If it is already in this Repository, the Repository version is returned. Otherwise, the Repository's classpath is + * searched for the class (and it is added to the Repository if found). + * + * @param className + * the name of the class + * @return the JavaClass object + * @throws ClassNotFoundException + * if the class is not in the Repository, and could not be found on the classpath + */ + @Override + public JavaClass loadClass(String className) throws ClassNotFoundException { + if ((className == null) || className.equals("")) { + throw new IllegalArgumentException("Invalid class name " + className); + } + className = className.replace('/', '.'); // Just in case, canonical form + JavaClass clazz = findClass(className); + if (clazz != null) { + return clazz; + } + try { + return loadClass(_path.getInputStream(className), className); + } catch (IOException e) { + throw new ClassNotFoundException("Exception while looking for class " + className + ": " + e, e); + } + } + + /** + * Find the JavaClass object for a runtime Class object. If a class with the same name is already in this Repository, the Repository version is returned. + * Otherwise, getResourceAsStream() is called on the Class object to find the class's representation. If the representation is found, it is added to the + * Repository. + * + * @see Class + * @param clazz + * the runtime Class object + * @return JavaClass object for given runtime class + * @throws ClassNotFoundException + * if the class is not in the Repository, and its representation could not be found + */ + @Override + public JavaClass loadClass(Class clazz) throws ClassNotFoundException { + InputStream clsStream = null; + try { + String className = clazz.getName(); + JavaClass repositoryClass = findClass(className); + if (repositoryClass != null) { + return repositoryClass; + } + String name = className; + int i = name.lastIndexOf('.'); + if (i > 0) { + name = name.substring(i + 1); + } + clsStream = clazz.getResourceAsStream(name + ".class"); + return loadClass(clsStream, className); + } finally { + try { + if (clsStream != null) { + clsStream.close(); + } + } catch (IOException ioe) { + // don't care + } + } + } + + private JavaClass loadClass(InputStream is, String className) throws ClassNotFoundException { + try { + if (is != null) { + ClassParser parser = new ClassParser(is, className); + JavaClass clazz = parser.parse(); + storeClass(clazz); + return clazz; + } + } catch (IOException e) { + throw new ClassNotFoundException("Exception while looking for class " + className + ": " + e, e); + } finally { + if (is != null) { + try { + is.close(); + } catch (IOException e) { + // ignored + } + } + } + throw new ClassNotFoundException("SyntheticRepository could not load " + className); + } + + /** + * ClassPath associated with the Repository. + */ + @Override + public ClassPath getClassPath() { + return _path; + } + + /** + * Clear all entries from cache. + */ + @Override + public void clear() { + _loadedClasses.clear(); + } +} diff --git a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java index 08bd2a6b..03864879 100644 --- a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java @@ -17,48 +17,33 @@ */ package org.apache.commons.bcel6.util; -import java.io.IOException; -import java.io.InputStream; -import java.lang.ref.SoftReference; import java.util.HashMap; import java.util.Map; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.JavaClass; - /** - * This repository is used in situations where a Class is created - * outside the realm of a ClassLoader. Classes are loaded from - * the file systems using the paths specified in the given - * class path. By default, this is the value returned by - * ClassPath.getClassPath(). - *
    - * It is designed to be used as a singleton, however it - * can also be used with custom classpaths. + * This repository is used in situations where a Class is created outside the realm of a ClassLoader. Classes are loaded from the file systems using the paths + * specified in the given class path. By default, this is the value returned by ClassPath.getClassPath().
    + * This repository uses a factory design, allowing it to maintain a collection of different classpaths, and as such It is designed to be used as a singleton per + * classpath. * * @see org.apache.commons.bcel6.Repository * * @version $Id$ */ -public class SyntheticRepository implements Repository { +public class SyntheticRepository extends MemorySensitiveClassPathRepository implements Repository { - //private static final String DEFAULT_PATH = ClassPath.getClassPath(); + // private static final String DEFAULT_PATH = ClassPath.getClassPath(); private static final Map _instances = new HashMap<>(); // CLASSPATH X REPOSITORY - private ClassPath _path = null; - private final Map> _loadedClasses = new HashMap<>(); // CLASSNAME X JAVACLASS - private SyntheticRepository(ClassPath path) { - _path = path; + super(path); } - public static SyntheticRepository getInstance() { return getInstance(ClassPath.SYSTEM_CLASS_PATH); } - - public static SyntheticRepository getInstance( ClassPath classPath ) { + public static SyntheticRepository getInstance(ClassPath classPath) { SyntheticRepository rep = _instances.get(classPath); if (rep == null) { rep = new SyntheticRepository(classPath); @@ -66,147 +51,4 @@ public class SyntheticRepository implements Repository { } return rep; } - - - /** - * Store a new JavaClass instance into this Repository. - */ - @Override - public void storeClass( JavaClass clazz ) { - _loadedClasses.put(clazz.getClassName(), new SoftReference<>(clazz)); - clazz.setRepository(this); - } - - - /** - * Remove class from repository - */ - @Override - public void removeClass( JavaClass clazz ) { - _loadedClasses.remove(clazz.getClassName()); - } - - - /** - * Find an already defined (cached) JavaClass object by name. - */ - @Override - public JavaClass findClass( String className ) { - SoftReference ref = _loadedClasses.get(className); - if (ref == null) { - return null; - } - return ref.get(); - } - - - /** - * Find a JavaClass object by name. - * If it is already in this Repository, the Repository version - * is returned. Otherwise, the Repository's classpath is searched for - * the class (and it is added to the Repository if found). - * - * @param className the name of the class - * @return the JavaClass object - * @throws ClassNotFoundException if the class is not in the - * Repository, and could not be found on the classpath - */ - @Override - public JavaClass loadClass( String className ) throws ClassNotFoundException { - if (className == null || className.equals("")) { - throw new IllegalArgumentException("Invalid class name " + className); - } - className = className.replace('/', '.'); // Just in case, canonical form - JavaClass clazz = findClass(className); - if (clazz != null) { - return clazz; - } - try { - return loadClass(_path.getInputStream(className), className); - } catch (IOException e) { - throw new ClassNotFoundException("Exception while looking for class " + className - + ": " + e, e); - } - } - - - /** - * Find the JavaClass object for a runtime Class object. - * If a class with the same name is already in this Repository, - * the Repository version is returned. Otherwise, getResourceAsStream() - * is called on the Class object to find the class's representation. - * If the representation is found, it is added to the Repository. - * - * @see Class - * @param clazz the runtime Class object - * @return JavaClass object for given runtime class - * @throws ClassNotFoundException if the class is not in the - * Repository, and its representation could not be found - */ - @Override - public JavaClass loadClass( Class clazz ) throws ClassNotFoundException { - InputStream clsStream = null; - try{ - String className = clazz.getName(); - JavaClass repositoryClass = findClass(className); - if (repositoryClass != null) { - return repositoryClass; - } - String name = className; - int i = name.lastIndexOf('.'); - if (i > 0) { - name = name.substring(i + 1); - } - clsStream = clazz.getResourceAsStream(name + ".class"); - return loadClass(clsStream, className); - } finally { - try{ - if (clsStream != null){ - clsStream.close(); - } - } catch(IOException ioe){ - //don't care - } - } - } - - - private JavaClass loadClass( InputStream is, String className ) throws ClassNotFoundException { - try { - if (is != null) { - ClassParser parser = new ClassParser(is, className); - JavaClass clazz = parser.parse(); - storeClass(clazz); - return clazz; - } - } catch (IOException e) { - throw new ClassNotFoundException("Exception while looking for class " + className - + ": " + e, e); - } finally { - if (is != null){ - try { - is.close(); - } catch (IOException e) { - // ignored - } - } - } - throw new ClassNotFoundException("SyntheticRepository could not load " + className); - } - - - /** ClassPath associated with the Repository. - */ - @Override - public ClassPath getClassPath() { - return _path; - } - - - /** Clear all entries from cache. - */ - @Override - public void clear() { - _loadedClasses.clear(); - } } -- GitLab From d47fec240c633b061a3ae9351f8199e8785261b4 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Wed, 1 Jun 2016 04:25:27 +0000 Subject: [PATCH 1105/1313] Add final modifier to method parameters. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746378 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/Const.java | 28 +- .../apache/commons/bcel6/ExceptionConst.java | 4 +- .../org/apache/commons/bcel6/Repository.java | 38 +- .../commons/bcel6/classfile/AccessFlags.java | 38 +- .../bcel6/classfile/AnnotationDefault.java | 12 +- .../classfile/AnnotationElementValue.java | 6 +- .../bcel6/classfile/AnnotationEntry.java | 12 +- .../commons/bcel6/classfile/Annotations.java | 14 +- .../bcel6/classfile/ArrayElementValue.java | 4 +- .../commons/bcel6/classfile/Attribute.java | 20 +- .../bcel6/classfile/BootstrapMethod.java | 16 +- .../bcel6/classfile/BootstrapMethods.java | 14 +- .../bcel6/classfile/ClassElementValue.java | 4 +- .../bcel6/classfile/ClassFormatException.java | 4 +- .../commons/bcel6/classfile/ClassParser.java | 6 +- .../apache/commons/bcel6/classfile/Code.java | 26 +- .../bcel6/classfile/CodeException.java | 22 +- .../commons/bcel6/classfile/Constant.java | 12 +- .../commons/bcel6/classfile/ConstantCP.java | 14 +- .../bcel6/classfile/ConstantClass.java | 16 +- .../bcel6/classfile/ConstantDouble.java | 14 +- .../bcel6/classfile/ConstantFieldref.java | 8 +- .../bcel6/classfile/ConstantFloat.java | 14 +- .../bcel6/classfile/ConstantInteger.java | 14 +- .../classfile/ConstantInterfaceMethodref.java | 8 +- .../classfile/ConstantInvokeDynamic.java | 8 +- .../commons/bcel6/classfile/ConstantLong.java | 14 +- .../bcel6/classfile/ConstantMethodHandle.java | 14 +- .../bcel6/classfile/ConstantMethodType.java | 12 +- .../bcel6/classfile/ConstantMethodref.java | 8 +- .../bcel6/classfile/ConstantNameAndType.java | 18 +- .../commons/bcel6/classfile/ConstantPool.java | 22 +- .../bcel6/classfile/ConstantString.java | 16 +- .../commons/bcel6/classfile/ConstantUtf8.java | 20 +- .../bcel6/classfile/ConstantValue.java | 16 +- .../commons/bcel6/classfile/Deprecated.java | 14 +- .../bcel6/classfile/DescendingVisitor.java | 92 ++--- .../commons/bcel6/classfile/ElementValue.java | 4 +- .../bcel6/classfile/ElementValuePair.java | 6 +- .../commons/bcel6/classfile/EmptyVisitor.java | 88 ++--- .../bcel6/classfile/EnclosingMethod.java | 14 +- .../bcel6/classfile/EnumElementValue.java | 6 +- .../bcel6/classfile/ExceptionTable.java | 16 +- .../apache/commons/bcel6/classfile/Field.java | 20 +- .../bcel6/classfile/FieldOrMethod.java | 22 +- .../commons/bcel6/classfile/InnerClass.java | 22 +- .../commons/bcel6/classfile/InnerClasses.java | 16 +- .../commons/bcel6/classfile/JavaClass.java | 72 ++-- .../commons/bcel6/classfile/LineNumber.java | 14 +- .../bcel6/classfile/LineNumberTable.java | 18 +- .../bcel6/classfile/LocalVariable.java | 26 +- .../bcel6/classfile/LocalVariableTable.java | 20 +- .../classfile/LocalVariableTypeTable.java | 16 +- .../commons/bcel6/classfile/Method.java | 20 +- .../bcel6/classfile/MethodParameter.java | 10 +- .../bcel6/classfile/MethodParameters.java | 10 +- .../commons/bcel6/classfile/PMGClass.java | 18 +- .../classfile/ParameterAnnotationEntry.java | 8 +- .../bcel6/classfile/ParameterAnnotations.java | 16 +- .../RuntimeInvisibleAnnotations.java | 6 +- .../RuntimeInvisibleParameterAnnotations.java | 2 +- .../classfile/RuntimeVisibleAnnotations.java | 6 +- .../RuntimeVisibleParameterAnnotations.java | 2 +- .../commons/bcel6/classfile/Signature.java | 28 +- .../bcel6/classfile/SimpleElementValue.java | 6 +- .../commons/bcel6/classfile/SourceFile.java | 14 +- .../commons/bcel6/classfile/StackMap.java | 12 +- .../bcel6/classfile/StackMapEntry.java | 34 +- .../commons/bcel6/classfile/StackMapType.java | 12 +- .../commons/bcel6/classfile/Synthetic.java | 14 +- .../commons/bcel6/classfile/Unknown.java | 14 +- .../commons/bcel6/classfile/Utility.java | 106 ++--- .../apache/commons/bcel6/generic/AALOAD.java | 2 +- .../apache/commons/bcel6/generic/AASTORE.java | 2 +- .../commons/bcel6/generic/ACONST_NULL.java | 4 +- .../apache/commons/bcel6/generic/ALOAD.java | 4 +- .../commons/bcel6/generic/ANEWARRAY.java | 6 +- .../apache/commons/bcel6/generic/ARETURN.java | 2 +- .../commons/bcel6/generic/ARRAYLENGTH.java | 2 +- .../apache/commons/bcel6/generic/ASTORE.java | 4 +- .../apache/commons/bcel6/generic/ATHROW.java | 2 +- .../generic/AnnotationElementValueGen.java | 12 +- .../bcel6/generic/AnnotationEntryGen.java | 32 +- .../bcel6/generic/ArithmeticInstruction.java | 4 +- .../bcel6/generic/ArrayElementValueGen.java | 14 +- .../bcel6/generic/ArrayInstruction.java | 4 +- .../commons/bcel6/generic/ArrayType.java | 8 +- .../apache/commons/bcel6/generic/BALOAD.java | 2 +- .../apache/commons/bcel6/generic/BASTORE.java | 2 +- .../apache/commons/bcel6/generic/BIPUSH.java | 12 +- .../commons/bcel6/generic/BREAKPOINT.java | 2 +- .../commons/bcel6/generic/BasicType.java | 6 +- .../commons/bcel6/generic/BranchHandle.java | 14 +- .../bcel6/generic/BranchInstruction.java | 26 +- .../apache/commons/bcel6/generic/CALOAD.java | 2 +- .../apache/commons/bcel6/generic/CASTORE.java | 2 +- .../commons/bcel6/generic/CHECKCAST.java | 6 +- .../commons/bcel6/generic/CPInstruction.java | 14 +- .../bcel6/generic/ClassElementValueGen.java | 10 +- .../commons/bcel6/generic/ClassGen.java | 74 ++-- .../bcel6/generic/ClassGenException.java | 4 +- .../bcel6/generic/CodeExceptionGen.java | 18 +- .../bcel6/generic/ConstantPoolGen.java | 70 ++-- .../bcel6/generic/ConversionInstruction.java | 4 +- .../org/apache/commons/bcel6/generic/D2F.java | 2 +- .../org/apache/commons/bcel6/generic/D2I.java | 2 +- .../org/apache/commons/bcel6/generic/D2L.java | 2 +- .../apache/commons/bcel6/generic/DADD.java | 2 +- .../apache/commons/bcel6/generic/DALOAD.java | 2 +- .../apache/commons/bcel6/generic/DASTORE.java | 2 +- .../apache/commons/bcel6/generic/DCMPG.java | 4 +- .../apache/commons/bcel6/generic/DCMPL.java | 4 +- .../apache/commons/bcel6/generic/DCONST.java | 6 +- .../apache/commons/bcel6/generic/DDIV.java | 2 +- .../apache/commons/bcel6/generic/DLOAD.java | 4 +- .../apache/commons/bcel6/generic/DMUL.java | 2 +- .../apache/commons/bcel6/generic/DNEG.java | 2 +- .../apache/commons/bcel6/generic/DREM.java | 2 +- .../apache/commons/bcel6/generic/DRETURN.java | 2 +- .../apache/commons/bcel6/generic/DSTORE.java | 4 +- .../apache/commons/bcel6/generic/DSUB.java | 2 +- .../org/apache/commons/bcel6/generic/DUP.java | 2 +- .../apache/commons/bcel6/generic/DUP2.java | 2 +- .../apache/commons/bcel6/generic/DUP2_X1.java | 2 +- .../apache/commons/bcel6/generic/DUP2_X2.java | 2 +- .../apache/commons/bcel6/generic/DUP_X1.java | 2 +- .../apache/commons/bcel6/generic/DUP_X2.java | 2 +- .../bcel6/generic/ElementValueGen.java | 10 +- .../bcel6/generic/ElementValuePairGen.java | 14 +- .../commons/bcel6/generic/EmptyVisitor.java | 362 +++++++++--------- .../bcel6/generic/EnumElementValueGen.java | 12 +- .../org/apache/commons/bcel6/generic/F2D.java | 2 +- .../org/apache/commons/bcel6/generic/F2I.java | 2 +- .../org/apache/commons/bcel6/generic/F2L.java | 2 +- .../apache/commons/bcel6/generic/FADD.java | 2 +- .../apache/commons/bcel6/generic/FALOAD.java | 2 +- .../apache/commons/bcel6/generic/FASTORE.java | 2 +- .../apache/commons/bcel6/generic/FCMPG.java | 4 +- .../apache/commons/bcel6/generic/FCMPL.java | 4 +- .../apache/commons/bcel6/generic/FCONST.java | 6 +- .../apache/commons/bcel6/generic/FDIV.java | 2 +- .../apache/commons/bcel6/generic/FLOAD.java | 4 +- .../apache/commons/bcel6/generic/FMUL.java | 2 +- .../apache/commons/bcel6/generic/FNEG.java | 2 +- .../apache/commons/bcel6/generic/FREM.java | 2 +- .../apache/commons/bcel6/generic/FRETURN.java | 2 +- .../apache/commons/bcel6/generic/FSTORE.java | 4 +- .../apache/commons/bcel6/generic/FSUB.java | 2 +- .../commons/bcel6/generic/FieldGen.java | 42 +- .../bcel6/generic/FieldGenOrMethodGen.java | 16 +- .../bcel6/generic/FieldInstruction.java | 12 +- .../commons/bcel6/generic/FieldOrMethod.java | 14 +- .../commons/bcel6/generic/GETFIELD.java | 6 +- .../commons/bcel6/generic/GETSTATIC.java | 6 +- .../apache/commons/bcel6/generic/GOTO.java | 8 +- .../apache/commons/bcel6/generic/GOTO_W.java | 8 +- .../bcel6/generic/GotoInstruction.java | 2 +- .../org/apache/commons/bcel6/generic/I2B.java | 2 +- .../org/apache/commons/bcel6/generic/I2C.java | 2 +- .../org/apache/commons/bcel6/generic/I2D.java | 2 +- .../org/apache/commons/bcel6/generic/I2F.java | 2 +- .../org/apache/commons/bcel6/generic/I2L.java | 2 +- .../org/apache/commons/bcel6/generic/I2S.java | 2 +- .../apache/commons/bcel6/generic/IADD.java | 2 +- .../apache/commons/bcel6/generic/IALOAD.java | 2 +- .../apache/commons/bcel6/generic/IAND.java | 2 +- .../apache/commons/bcel6/generic/IASTORE.java | 2 +- .../apache/commons/bcel6/generic/ICONST.java | 6 +- .../apache/commons/bcel6/generic/IDIV.java | 2 +- .../apache/commons/bcel6/generic/IFEQ.java | 4 +- .../apache/commons/bcel6/generic/IFGE.java | 4 +- .../apache/commons/bcel6/generic/IFGT.java | 4 +- .../apache/commons/bcel6/generic/IFLE.java | 4 +- .../apache/commons/bcel6/generic/IFLT.java | 4 +- .../apache/commons/bcel6/generic/IFNE.java | 4 +- .../commons/bcel6/generic/IFNONNULL.java | 4 +- .../apache/commons/bcel6/generic/IFNULL.java | 4 +- .../commons/bcel6/generic/IF_ACMPEQ.java | 4 +- .../commons/bcel6/generic/IF_ACMPNE.java | 4 +- .../commons/bcel6/generic/IF_ICMPEQ.java | 4 +- .../commons/bcel6/generic/IF_ICMPGE.java | 4 +- .../commons/bcel6/generic/IF_ICMPGT.java | 4 +- .../commons/bcel6/generic/IF_ICMPLE.java | 4 +- .../commons/bcel6/generic/IF_ICMPLT.java | 4 +- .../commons/bcel6/generic/IF_ICMPNE.java | 4 +- .../apache/commons/bcel6/generic/IINC.java | 16 +- .../apache/commons/bcel6/generic/ILOAD.java | 4 +- .../apache/commons/bcel6/generic/IMPDEP1.java | 2 +- .../apache/commons/bcel6/generic/IMPDEP2.java | 2 +- .../apache/commons/bcel6/generic/IMUL.java | 2 +- .../apache/commons/bcel6/generic/INEG.java | 2 +- .../commons/bcel6/generic/INSTANCEOF.java | 6 +- .../commons/bcel6/generic/INVOKEDYNAMIC.java | 12 +- .../bcel6/generic/INVOKEINTERFACE.java | 12 +- .../commons/bcel6/generic/INVOKESPECIAL.java | 6 +- .../commons/bcel6/generic/INVOKESTATIC.java | 6 +- .../commons/bcel6/generic/INVOKEVIRTUAL.java | 6 +- .../org/apache/commons/bcel6/generic/IOR.java | 2 +- .../apache/commons/bcel6/generic/IREM.java | 2 +- .../apache/commons/bcel6/generic/IRETURN.java | 2 +- .../apache/commons/bcel6/generic/ISHL.java | 2 +- .../apache/commons/bcel6/generic/ISHR.java | 2 +- .../apache/commons/bcel6/generic/ISTORE.java | 4 +- .../apache/commons/bcel6/generic/ISUB.java | 2 +- .../apache/commons/bcel6/generic/IUSHR.java | 2 +- .../apache/commons/bcel6/generic/IXOR.java | 2 +- .../commons/bcel6/generic/IfInstruction.java | 2 +- .../commons/bcel6/generic/Instruction.java | 28 +- .../bcel6/generic/InstructionComparator.java | 2 +- .../bcel6/generic/InstructionConst.java | 2 +- .../bcel6/generic/InstructionFactory.java | 80 ++-- .../bcel6/generic/InstructionHandle.java | 30 +- .../bcel6/generic/InstructionList.java | 98 ++--- .../bcel6/generic/InvokeInstruction.java | 18 +- .../org/apache/commons/bcel6/generic/JSR.java | 8 +- .../apache/commons/bcel6/generic/JSR_W.java | 8 +- .../commons/bcel6/generic/JsrInstruction.java | 4 +- .../org/apache/commons/bcel6/generic/L2D.java | 2 +- .../org/apache/commons/bcel6/generic/L2F.java | 2 +- .../org/apache/commons/bcel6/generic/L2I.java | 2 +- .../apache/commons/bcel6/generic/LADD.java | 2 +- .../apache/commons/bcel6/generic/LALOAD.java | 2 +- .../apache/commons/bcel6/generic/LAND.java | 2 +- .../apache/commons/bcel6/generic/LASTORE.java | 2 +- .../apache/commons/bcel6/generic/LCMP.java | 4 +- .../apache/commons/bcel6/generic/LCONST.java | 6 +- .../org/apache/commons/bcel6/generic/LDC.java | 14 +- .../apache/commons/bcel6/generic/LDC2_W.java | 8 +- .../apache/commons/bcel6/generic/LDC_W.java | 4 +- .../apache/commons/bcel6/generic/LDIV.java | 2 +- .../apache/commons/bcel6/generic/LLOAD.java | 4 +- .../apache/commons/bcel6/generic/LMUL.java | 2 +- .../apache/commons/bcel6/generic/LNEG.java | 2 +- .../commons/bcel6/generic/LOOKUPSWITCH.java | 8 +- .../org/apache/commons/bcel6/generic/LOR.java | 2 +- .../apache/commons/bcel6/generic/LREM.java | 2 +- .../apache/commons/bcel6/generic/LRETURN.java | 2 +- .../apache/commons/bcel6/generic/LSHL.java | 2 +- .../apache/commons/bcel6/generic/LSHR.java | 2 +- .../apache/commons/bcel6/generic/LSTORE.java | 4 +- .../apache/commons/bcel6/generic/LSUB.java | 2 +- .../apache/commons/bcel6/generic/LUSHR.java | 2 +- .../apache/commons/bcel6/generic/LXOR.java | 2 +- .../commons/bcel6/generic/LineNumberGen.java | 10 +- .../bcel6/generic/LoadInstruction.java | 6 +- .../bcel6/generic/LocalVariableGen.java | 22 +- .../generic/LocalVariableInstruction.java | 16 +- .../commons/bcel6/generic/MONITORENTER.java | 2 +- .../commons/bcel6/generic/MONITOREXIT.java | 2 +- .../commons/bcel6/generic/MULTIANEWARRAY.java | 16 +- .../commons/bcel6/generic/MethodGen.java | 102 ++--- .../org/apache/commons/bcel6/generic/NEW.java | 6 +- .../commons/bcel6/generic/NEWARRAY.java | 12 +- .../org/apache/commons/bcel6/generic/NOP.java | 2 +- .../generic/NameSignatureInstruction.java | 8 +- .../commons/bcel6/generic/ObjectType.java | 10 +- .../org/apache/commons/bcel6/generic/POP.java | 2 +- .../apache/commons/bcel6/generic/POP2.java | 2 +- .../apache/commons/bcel6/generic/PUSH.java | 20 +- .../commons/bcel6/generic/PUTFIELD.java | 6 +- .../commons/bcel6/generic/PUTSTATIC.java | 6 +- .../org/apache/commons/bcel6/generic/RET.java | 14 +- .../apache/commons/bcel6/generic/RETURN.java | 2 +- .../commons/bcel6/generic/ReferenceType.java | 10 +- .../bcel6/generic/ReturnInstruction.java | 4 +- .../bcel6/generic/ReturnaddressType.java | 4 +- .../apache/commons/bcel6/generic/SALOAD.java | 2 +- .../apache/commons/bcel6/generic/SASTORE.java | 2 +- .../apache/commons/bcel6/generic/SIPUSH.java | 12 +- .../apache/commons/bcel6/generic/SWAP.java | 2 +- .../apache/commons/bcel6/generic/SWITCH.java | 10 +- .../apache/commons/bcel6/generic/Select.java | 36 +- .../bcel6/generic/SimpleElementValueGen.java | 26 +- .../bcel6/generic/StackInstruction.java | 4 +- .../bcel6/generic/StoreInstruction.java | 6 +- .../commons/bcel6/generic/TABLESWITCH.java | 8 +- .../bcel6/generic/TargetLostException.java | 2 +- .../apache/commons/bcel6/generic/Type.java | 36 +- .../commons/bcel6/util/AttributeHTML.java | 10 +- .../commons/bcel6/util/BCELFactory.java | 32 +- .../apache/commons/bcel6/util/BCELifier.java | 22 +- .../commons/bcel6/util/ByteSequence.java | 4 +- .../apache/commons/bcel6/util/Class2HTML.java | 12 +- .../commons/bcel6/util/ClassLoader.java | 12 +- .../bcel6/util/ClassLoaderRepository.java | 12 +- .../apache/commons/bcel6/util/ClassPath.java | 48 +-- .../bcel6/util/ClassPathRepository.java | 12 +- .../apache/commons/bcel6/util/ClassQueue.java | 2 +- .../apache/commons/bcel6/util/ClassSet.java | 4 +- .../apache/commons/bcel6/util/ClassStack.java | 2 +- .../commons/bcel6/util/ClassVector.java | 6 +- .../apache/commons/bcel6/util/CodeHTML.java | 10 +- .../commons/bcel6/util/ConstantHTML.java | 10 +- .../commons/bcel6/util/InstructionFinder.java | 20 +- .../commons/bcel6/util/JavaWrapper.java | 6 +- .../MemorySensitiveClassPathRepository.java | 12 +- .../apache/commons/bcel6/util/MethodHTML.java | 8 +- .../bcel6/util/SyntheticRepository.java | 4 +- .../bcel6/verifier/GraphicalVerifier.java | 2 +- .../bcel6/verifier/NativeVerifier.java | 2 +- .../commons/bcel6/verifier/PassVerifier.java | 2 +- .../bcel6/verifier/TransitiveHull.java | 4 +- .../bcel6/verifier/VerificationResult.java | 4 +- .../commons/bcel6/verifier/Verifier.java | 8 +- .../bcel6/verifier/VerifierAppFrame.java | 26 +- .../bcel6/verifier/VerifierFactory.java | 8 +- .../verifier/VerifierFactoryListModel.java | 8 +- .../commons/bcel6/verifier/VerifyDialog.java | 40 +- .../exc/AssertionViolatedException.java | 4 +- .../exc/ClassConstraintException.java | 4 +- .../verifier/exc/CodeConstraintException.java | 2 +- .../verifier/exc/InvalidMethodException.java | 2 +- .../bcel6/verifier/exc/LoadingException.java | 2 +- ...ocalVariableInfoInconsistentException.java | 2 +- .../exc/StaticCodeConstraintException.java | 2 +- ...ticCodeInstructionConstraintException.java | 2 +- ...InstructionOperandConstraintException.java | 2 +- .../StructuralCodeConstraintException.java | 2 +- .../commons/bcel6/verifier/exc/Utility.java | 2 +- .../verifier/exc/VerificationException.java | 4 +- .../VerifierConstraintViolatedException.java | 4 +- .../bcel6/verifier/statics/IntList.java | 4 +- .../verifier/statics/LocalVariableInfo.java | 12 +- .../verifier/statics/LocalVariablesInfo.java | 6 +- .../bcel6/verifier/statics/Pass1Verifier.java | 2 +- .../bcel6/verifier/statics/Pass2Verifier.java | 94 ++--- .../verifier/statics/Pass3aVerifier.java | 82 ++-- .../statics/StringRepresentation.java | 92 ++--- .../structurals/ControlFlowGraph.java | 22 +- .../structurals/ExceptionHandler.java | 2 +- .../structurals/ExceptionHandlers.java | 4 +- .../structurals/ExecutionVisitor.java | 306 +++++++-------- .../bcel6/verifier/structurals/Frame.java | 8 +- .../structurals/InstConstraintVisitor.java | 350 ++++++++--------- .../verifier/structurals/LocalVariables.java | 14 +- .../verifier/structurals/OperandStack.java | 16 +- .../verifier/structurals/Pass3bVerifier.java | 16 +- .../verifier/structurals/Subroutines.java | 22 +- .../structurals/UninitializedObjectType.java | 4 +- .../bcel6/AbstractCounterVisitorTestCase.java | 2 +- .../commons/bcel6/AbstractTestCase.java | 26 +- .../bcel6/ElementValueGenTestCase.java | 4 +- .../org/apache/commons/bcel6/NanoTimer.java | 2 +- .../apache/commons/bcel6/PerformanceTest.java | 4 +- .../bcel6/classfile/JDKClassDumpTestCase.java | 6 +- .../data/AnnotatedWithCombinedAnnotation.java | 2 +- .../bcel6/data/AttributeTestClassEM01.java | 2 +- .../bcel6/data/AttributeTestClassEM02.java | 2 +- .../commons/bcel6/data/PLSETestClass.java | 4 +- .../commons/bcel6/data/SimpleClass.java | 2 +- .../bcel6/generic/AnnotationGenTestCase.java | 4 +- .../generic/FieldAnnotationsTestCase.java | 12 +- .../GeneratingAnnotatedClassesTestCase.java | 38 +- .../bcel6/generic/JDKGenericDumpTestCase.java | 8 +- .../bcel6/generic/MethodGenTestCase.java | 2 +- .../commons/bcel6/util/BCELifierTestCase.java | 4 +- .../verifier/AbstractVerifierTestCase.java | 6 +- .../bcel6/verifier/tests/TestArray01.java | 8 +- .../tests/TestArrayAccess02Creator.java | 2 +- .../tests/TestArrayAccess03Creator.java | 2 +- .../tests/TestArrayAccess04Creator.java | 2 +- .../tests/TestLegalInvokeInterface01.java | 2 +- .../tests/TestLegalInvokeSpecial02.java | 2 +- .../tests/TestLegalInvokeVirtual02.java | 2 +- .../verifier/tests/TestReturn01Creator.java | 2 +- .../bcel6/verifier/tests/TestReturn02.java | 2 +- .../verifier/tests/TestReturn03Creator.java | 2 +- .../bcel6/visitors/CounterVisitor.java | 88 ++--- 368 files changed, 2499 insertions(+), 2499 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Const.java b/src/main/java/org/apache/commons/bcel6/Const.java index 87126638..fb611dd2 100644 --- a/src/main/java/org/apache/commons/bcel6/Const.java +++ b/src/main/java/org/apache/commons/bcel6/Const.java @@ -258,7 +258,7 @@ public final class Const { * @return * @since 6.0 */ - public static String getAccessName(int index) { + public static String getAccessName(final int index) { return ACCESS_NAMES[index]; } @@ -356,7 +356,7 @@ public final class Const { * @return * @since 6.0 */ - public static String getConstantName(int index) { + public static String getConstantName(final int index) { return CONSTANT_NAMES[index]; } @@ -1496,7 +1496,7 @@ public final class Const { * @return * @since 6.0 */ - public static String getTypeName(int index) { + public static String getTypeName(final int index) { return TYPE_NAMES[index]; } @@ -1518,7 +1518,7 @@ public final class Const { * @return * @since 6.0 */ - public static String getClassTypeName(int index) { + public static String getClassTypeName(final int index) { return CLASS_TYPE_NAMES[index]; } @@ -1537,7 +1537,7 @@ public final class Const { * @return * @since 6.0 */ - public static String getShortTypeName(int index) { + public static String getShortTypeName(final int index) { return SHORT_TYPE_NAMES[index]; } @@ -1614,7 +1614,7 @@ public final class Const { * @return * @since 6.0 */ - public static short getNoOfOperands(int index) { + public static short getNoOfOperands(final int index) { return NO_OF_OPERANDS[index]; } @@ -1690,14 +1690,14 @@ public final class Const { /** * @since 6.0 */ - public static short getOperandType(int opcode, int index) { + public static short getOperandType(final int opcode, final int index) { return TYPE_OF_OPERANDS[opcode][index]; } /** * @since 6.0 */ - public static long getOperandTypeCount(int opcode) { + public static long getOperandTypeCount(final int opcode) { return TYPE_OF_OPERANDS[opcode].length; } @@ -1762,7 +1762,7 @@ public final class Const { /** * @since 6.0 */ - public static String getOpcodeName(int index) { + public static String getOpcodeName(final int index) { return OPCODE_NAMES[index]; } @@ -1828,7 +1828,7 @@ public final class Const { * @return * @since 6.0 */ - public static int getConsumeStack(int index) { + public static int getConsumeStack(final int index) { return CONSUME_STACK[index]; } @@ -1895,7 +1895,7 @@ public final class Const { * @return * @since 6.0 */ - public static int getProduceStack(int index) { + public static int getProduceStack(final int index) { return PRODUCE_STACK[index]; } @@ -1944,7 +1944,7 @@ public final class Const { * @return * @since 6.0 */ - public static String getAttributeName(int index) { + public static String getAttributeName(final int index) { return ATTRIBUTE_NAMES[index]; } @@ -1971,7 +1971,7 @@ public final class Const { * @return * @since 6.0 */ - public static String getItemName(int index) { + public static String getItemName(final int index) { return ITEM_NAMES[index]; } @@ -2022,7 +2022,7 @@ public final class Const { * @return * @since 6.0 */ - public static String getMethodHandleName(int index) { + public static String getMethodHandleName(final int index) { return METHODHANDLE_NAMES[index]; } diff --git a/src/main/java/org/apache/commons/bcel6/ExceptionConst.java b/src/main/java/org/apache/commons/bcel6/ExceptionConst.java index 73e57859..2eeabecc 100644 --- a/src/main/java/org/apache/commons/bcel6/ExceptionConst.java +++ b/src/main/java/org/apache/commons/bcel6/ExceptionConst.java @@ -72,7 +72,7 @@ public final class ExceptionConst { }; // helper method to merge exception class arrays - private static Class[] mergeExceptions(Class[] input, Class ... extraClasses) { + private static Class[] mergeExceptions(final Class[] input, final Class ... extraClasses) { int extraLen = extraClasses == null ? 0 : extraClasses.length; Class[] excs = new Class[input.length + extraLen]; System.arraycopy(input, 0, excs, 0, input.length); @@ -88,7 +88,7 @@ public final class ExceptionConst { * @param extraClasses additional classes, if any * @return the merged array */ - public static Class[] createExceptions(EXCS type, Class ... extraClasses) { + public static Class[] createExceptions(final EXCS type, final Class ... extraClasses) { switch (type) { case EXCS_CLASS_AND_INTERFACE_RESOLUTION: return mergeExceptions(EXCS_CLASS_AND_INTERFACE_RESOLUTION, extraClasses); diff --git a/src/main/java/org/apache/commons/bcel6/Repository.java b/src/main/java/org/apache/commons/bcel6/Repository.java index 3b1680c9..1afa0e88 100644 --- a/src/main/java/org/apache/commons/bcel6/Repository.java +++ b/src/main/java/org/apache/commons/bcel6/Repository.java @@ -47,7 +47,7 @@ public abstract class Repository { /** Set repository instance to be used for class loading */ - public static void setRepository( org.apache.commons.bcel6.util.Repository rep ) { + public static void setRepository( final org.apache.commons.bcel6.util.Repository rep ) { _repository = rep; } @@ -59,7 +59,7 @@ public abstract class Repository { * @throws ClassNotFoundException if the class could not be found or * parsed correctly */ - public static JavaClass lookupClass( String class_name ) throws ClassNotFoundException { + public static JavaClass lookupClass( final String class_name ) throws ClassNotFoundException { return _repository.loadClass(class_name); } @@ -71,7 +71,7 @@ public abstract class Repository { * @throws ClassNotFoundException if the class could not be found or * parsed correctly */ - public static JavaClass lookupClass( Class clazz ) throws ClassNotFoundException { + public static JavaClass lookupClass( final Class clazz ) throws ClassNotFoundException { return _repository.loadClass(clazz); } @@ -81,7 +81,7 @@ public abstract class Repository { * system class path; returns null if the class file can't be * found */ - public static ClassPath.ClassFile lookupClassFile( String class_name ) { + public static ClassPath.ClassFile lookupClassFile( final String class_name ) { try { ClassPath path = _repository.getClassPath(); if (path == null) { @@ -106,7 +106,7 @@ public abstract class Repository { * * @return old entry in repository */ - public static JavaClass addClass( JavaClass clazz ) { + public static JavaClass addClass( final JavaClass clazz ) { JavaClass old = _repository.findClass(clazz.getClassName()); _repository.storeClass(clazz); return old; @@ -116,7 +116,7 @@ public abstract class Repository { /** * Remove class with given (fully qualified) name from repository. */ - public static void removeClass( String clazz ) { + public static void removeClass( final String clazz ) { _repository.removeClass(_repository.findClass(clazz)); } @@ -124,7 +124,7 @@ public abstract class Repository { /** * Remove given class from repository. */ - public static void removeClass( JavaClass clazz ) { + public static void removeClass( final JavaClass clazz ) { _repository.removeClass(clazz); } @@ -134,7 +134,7 @@ public abstract class Repository { * Object is always the last element * @throws ClassNotFoundException if any of the superclasses can't be found */ - public static JavaClass[] getSuperClasses( JavaClass clazz ) throws ClassNotFoundException { + public static JavaClass[] getSuperClasses( final JavaClass clazz ) throws ClassNotFoundException { return clazz.getSuperClasses(); } @@ -145,7 +145,7 @@ public abstract class Repository { * @throws ClassNotFoundException if the named class or any of its * superclasses can't be found */ - public static JavaClass[] getSuperClasses( String class_name ) throws ClassNotFoundException { + public static JavaClass[] getSuperClasses( final String class_name ) throws ClassNotFoundException { JavaClass jc = lookupClass(class_name); return getSuperClasses(jc); } @@ -158,7 +158,7 @@ public abstract class Repository { * @throws ClassNotFoundException if any of the class's * superclasses or superinterfaces can't be found */ - public static JavaClass[] getInterfaces( JavaClass clazz ) throws ClassNotFoundException { + public static JavaClass[] getInterfaces( final JavaClass clazz ) throws ClassNotFoundException { return clazz.getAllInterfaces(); } @@ -169,7 +169,7 @@ public abstract class Repository { * @throws ClassNotFoundException if the named class can't be found, * or if any of its superclasses or superinterfaces can't be found */ - public static JavaClass[] getInterfaces( String class_name ) throws ClassNotFoundException { + public static JavaClass[] getInterfaces( final String class_name ) throws ClassNotFoundException { return getInterfaces(lookupClass(class_name)); } @@ -180,7 +180,7 @@ public abstract class Repository { * @throws ClassNotFoundException if any superclasses or superinterfaces * of clazz can't be found */ - public static boolean instanceOf( JavaClass clazz, JavaClass super_class ) + public static boolean instanceOf( final JavaClass clazz, final JavaClass super_class ) throws ClassNotFoundException { return clazz.instanceOf(super_class); } @@ -191,7 +191,7 @@ public abstract class Repository { * @throws ClassNotFoundException if either clazz or super_class * can't be found */ - public static boolean instanceOf( String clazz, String super_class ) + public static boolean instanceOf( final String clazz, final String super_class ) throws ClassNotFoundException { return instanceOf(lookupClass(clazz), lookupClass(super_class)); } @@ -201,7 +201,7 @@ public abstract class Repository { * @return true, if clazz is an instance of super_class * @throws ClassNotFoundException if super_class can't be found */ - public static boolean instanceOf( JavaClass clazz, String super_class ) + public static boolean instanceOf( final JavaClass clazz, final String super_class ) throws ClassNotFoundException { return instanceOf(clazz, lookupClass(super_class)); } @@ -211,7 +211,7 @@ public abstract class Repository { * @return true, if clazz is an instance of super_class * @throws ClassNotFoundException if clazz can't be found */ - public static boolean instanceOf( String clazz, JavaClass super_class ) + public static boolean instanceOf( final String clazz, final JavaClass super_class ) throws ClassNotFoundException { return instanceOf(lookupClass(clazz), super_class); } @@ -222,7 +222,7 @@ public abstract class Repository { * @throws ClassNotFoundException if any superclasses or superinterfaces * of clazz can't be found */ - public static boolean implementationOf( JavaClass clazz, JavaClass inter ) + public static boolean implementationOf( final JavaClass clazz, final JavaClass inter ) throws ClassNotFoundException { return clazz.implementationOf(inter); } @@ -233,7 +233,7 @@ public abstract class Repository { * @throws ClassNotFoundException if clazz, inter, or any superclasses * or superinterfaces of clazz can't be found */ - public static boolean implementationOf( String clazz, String inter ) + public static boolean implementationOf( final String clazz, final String inter ) throws ClassNotFoundException { return implementationOf(lookupClass(clazz), lookupClass(inter)); } @@ -244,7 +244,7 @@ public abstract class Repository { * @throws ClassNotFoundException if inter or any superclasses * or superinterfaces of clazz can't be found */ - public static boolean implementationOf( JavaClass clazz, String inter ) + public static boolean implementationOf( final JavaClass clazz, final String inter ) throws ClassNotFoundException { return implementationOf(clazz, lookupClass(inter)); } @@ -255,7 +255,7 @@ public abstract class Repository { * @throws ClassNotFoundException if clazz or any superclasses or * superinterfaces of clazz can't be found */ - public static boolean implementationOf( String clazz, JavaClass inter ) + public static boolean implementationOf( final String clazz, final JavaClass inter ) throws ClassNotFoundException { return implementationOf(lookupClass(clazz), inter); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java index 6c144a8d..c411c218 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java @@ -41,7 +41,7 @@ public abstract class AccessFlags { /** * @param a inital access flags */ - public AccessFlags(int a) { + public AccessFlags(final int a) { access_flags = a; } @@ -65,7 +65,7 @@ public abstract class AccessFlags { /** Set access flags aka "modifiers". * @param access_flags Access flags of the object. */ - public final void setAccessFlags( int access_flags ) { + public final void setAccessFlags( final int access_flags ) { this.access_flags = access_flags; } @@ -73,12 +73,12 @@ public abstract class AccessFlags { /** Set access flags aka "modifiers". * @param access_flags Access flags of the object. */ - public final void setModifiers( int access_flags ) { + public final void setModifiers( final int access_flags ) { setAccessFlags(access_flags); } - private void setFlag( int flag, boolean set ) { + private void setFlag( final int flag, final boolean set ) { if ((access_flags & flag) != 0) { // Flag is set already if (!set) { access_flags ^= flag; @@ -91,7 +91,7 @@ public abstract class AccessFlags { } - public final void isPublic( boolean flag ) { + public final void isPublic( final boolean flag ) { setFlag(Const.ACC_PUBLIC, flag); } @@ -101,7 +101,7 @@ public abstract class AccessFlags { } - public final void isPrivate( boolean flag ) { + public final void isPrivate( final boolean flag ) { setFlag(Const.ACC_PRIVATE, flag); } @@ -111,7 +111,7 @@ public abstract class AccessFlags { } - public final void isProtected( boolean flag ) { + public final void isProtected( final boolean flag ) { setFlag(Const.ACC_PROTECTED, flag); } @@ -121,7 +121,7 @@ public abstract class AccessFlags { } - public final void isStatic( boolean flag ) { + public final void isStatic( final boolean flag ) { setFlag(Const.ACC_STATIC, flag); } @@ -131,7 +131,7 @@ public abstract class AccessFlags { } - public final void isFinal( boolean flag ) { + public final void isFinal( final boolean flag ) { setFlag(Const.ACC_FINAL, flag); } @@ -141,7 +141,7 @@ public abstract class AccessFlags { } - public final void isSynchronized( boolean flag ) { + public final void isSynchronized( final boolean flag ) { setFlag(Const.ACC_SYNCHRONIZED, flag); } @@ -151,7 +151,7 @@ public abstract class AccessFlags { } - public final void isVolatile( boolean flag ) { + public final void isVolatile( final boolean flag ) { setFlag(Const.ACC_VOLATILE, flag); } @@ -161,7 +161,7 @@ public abstract class AccessFlags { } - public final void isTransient( boolean flag ) { + public final void isTransient( final boolean flag ) { setFlag(Const.ACC_TRANSIENT, flag); } @@ -171,7 +171,7 @@ public abstract class AccessFlags { } - public final void isNative( boolean flag ) { + public final void isNative( final boolean flag ) { setFlag(Const.ACC_NATIVE, flag); } @@ -181,7 +181,7 @@ public abstract class AccessFlags { } - public final void isInterface( boolean flag ) { + public final void isInterface( final boolean flag ) { setFlag(Const.ACC_INTERFACE, flag); } @@ -191,7 +191,7 @@ public abstract class AccessFlags { } - public final void isAbstract( boolean flag ) { + public final void isAbstract( final boolean flag ) { setFlag(Const.ACC_ABSTRACT, flag); } @@ -201,7 +201,7 @@ public abstract class AccessFlags { } - public final void isStrictfp( boolean flag ) { + public final void isStrictfp( final boolean flag ) { setFlag(Const.ACC_STRICT, flag); } @@ -211,7 +211,7 @@ public abstract class AccessFlags { } - public final void isSynthetic( boolean flag ) { + public final void isSynthetic( final boolean flag ) { setFlag(Const.ACC_SYNTHETIC, flag); } @@ -221,7 +221,7 @@ public abstract class AccessFlags { } - public final void isAnnotation( boolean flag ) { + public final void isAnnotation( final boolean flag ) { setFlag(Const.ACC_ANNOTATION, flag); } @@ -231,7 +231,7 @@ public abstract class AccessFlags { } - public final void isEnum( boolean flag ) { + public final void isEnum( final boolean flag ) { setFlag(Const.ACC_ENUM, flag); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java index ef251147..05beb78f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java @@ -39,7 +39,7 @@ public class AnnotationDefault extends Attribute { * @param input Input stream * @param constant_pool Array of constants */ - AnnotationDefault(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { + AnnotationDefault(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (ElementValue) null, constant_pool); default_value = ElementValue.readElementValue(input, constant_pool); } @@ -50,7 +50,7 @@ public class AnnotationDefault extends Attribute { * @param defaultValue the annotation's default value * @param constant_pool Array of constants */ - public AnnotationDefault(int name_index, int length, ElementValue defaultValue, ConstantPool constant_pool) { + public AnnotationDefault(final int name_index, final int length, final ElementValue defaultValue, final ConstantPool constant_pool) { super(Const.ATTR_ANNOTATION_DEFAULT, name_index, length, constant_pool); this.default_value = defaultValue; } @@ -63,14 +63,14 @@ public class AnnotationDefault extends Attribute { * @param v Visitor object */ @Override - public void accept(Visitor v) { + public void accept(final Visitor v) { v.visitAnnotationDefault(this); } /** * @param defaultValue the default value of this methodinfo's annotation */ - public final void setDefaultValue(ElementValue defaultValue) { + public final void setDefaultValue(final ElementValue defaultValue) { default_value = defaultValue; } @@ -82,12 +82,12 @@ public class AnnotationDefault extends Attribute { } @Override - public Attribute copy(ConstantPool _constant_pool) { + public Attribute copy(final ConstantPool _constant_pool) { return (Attribute) clone(); } @Override - public final void dump(DataOutputStream dos) throws IOException { + public final void dump(final DataOutputStream dos) throws IOException { super.dump(dos); default_value.dump(dos); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationElementValue.java index 9a9e3172..c034bad9 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationElementValue.java @@ -28,8 +28,8 @@ public class AnnotationElementValue extends ElementValue // For annotation element values, this is the annotation private final AnnotationEntry annotationEntry; - public AnnotationElementValue(int type, AnnotationEntry annotationEntry, - ConstantPool cpool) + public AnnotationElementValue(final int type, final AnnotationEntry annotationEntry, + final ConstantPool cpool) { super(type, cpool); if (type != ANNOTATION) { @@ -40,7 +40,7 @@ public class AnnotationElementValue extends ElementValue } @Override - public void dump(DataOutputStream dos) throws IOException + public void dump(final DataOutputStream dos) throws IOException { dos.writeByte(super.getType()); // u1 type of value (ANNOTATION == '@') annotationEntry.dump(dos); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java index 967b26a8..9596060c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java @@ -49,7 +49,7 @@ public class AnnotationEntry implements Node { * @return the entry * @throws IOException */ - public static AnnotationEntry read(DataInput input, ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { + public static AnnotationEntry read(final DataInput input, final ConstantPool constant_pool, final boolean isRuntimeVisible) throws IOException { final AnnotationEntry annotationEntry = new AnnotationEntry(input.readUnsignedShort(), constant_pool, isRuntimeVisible); final int num_element_value_pairs = input.readUnsignedShort(); @@ -62,7 +62,7 @@ public class AnnotationEntry implements Node { return annotationEntry; } - public AnnotationEntry(int type_index, ConstantPool constant_pool, boolean isRuntimeVisible) { + public AnnotationEntry(final int type_index, final ConstantPool constant_pool, final boolean isRuntimeVisible) { this.type_index = type_index; this.constant_pool = constant_pool; this.isRuntimeVisible = isRuntimeVisible; @@ -87,7 +87,7 @@ public class AnnotationEntry implements Node { * @param v Visitor object */ @Override - public void accept(Visitor v) { + public void accept(final Visitor v) { v.visitAnnotationEntry(this); } @@ -121,7 +121,7 @@ public class AnnotationEntry implements Node { return element_value_pairs.toArray(new ElementValuePair[element_value_pairs.size()]); } - public void dump(DataOutputStream dos) throws IOException { + public void dump(final DataOutputStream dos) throws IOException { dos.writeShort(type_index); // u2 index of type name in cpool dos.writeShort(element_value_pairs.size()); // u2 element_value pair // count @@ -130,7 +130,7 @@ public class AnnotationEntry implements Node { } } - public void addElementNameValuePair(ElementValuePair elementNameValuePair) { + public void addElementNameValuePair(final ElementValuePair elementNameValuePair) { element_value_pairs.add(elementNameValuePair); } @@ -153,7 +153,7 @@ public class AnnotationEntry implements Node { return toShortString(); } - public static AnnotationEntry[] createAnnotationEntries(Attribute[] attrs) { + public static AnnotationEntry[] createAnnotationEntries(final Attribute[] attrs) { // Find attributes that contain annotation data List accumulatedAnnotations = new ArrayList<>(attrs.length); for (Attribute attribute : attrs) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java index 3883cc97..ec59ce64 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java @@ -39,8 +39,8 @@ public abstract class Annotations extends Attribute { * @param input Input stream * @param constant_pool Array of constants */ - Annotations(byte annotation_type, int name_index, int length, DataInput input, - ConstantPool constant_pool, boolean isRuntimeVisible) throws IOException { + Annotations(final byte annotation_type, final int name_index, final int length, final DataInput input, + final ConstantPool constant_pool, final boolean isRuntimeVisible) throws IOException { this(annotation_type, name_index, length, (AnnotationEntry[]) null, constant_pool, isRuntimeVisible); final int annotation_table_length = input.readUnsignedShort(); annotation_table = new AnnotationEntry[annotation_table_length]; @@ -56,8 +56,8 @@ public abstract class Annotations extends Attribute { * @param annotation_table the actual annotations * @param constant_pool Array of constants */ - public Annotations(byte annotation_type, int name_index, int length, AnnotationEntry[] annotation_table, - ConstantPool constant_pool, boolean isRuntimeVisible) { + public Annotations(final byte annotation_type, final int name_index, final int length, final AnnotationEntry[] annotation_table, + final ConstantPool constant_pool, final boolean isRuntimeVisible) { super(annotation_type, name_index, length, constant_pool); this.annotation_table = annotation_table; this.isRuntimeVisible = isRuntimeVisible; @@ -70,14 +70,14 @@ public abstract class Annotations extends Attribute { * @param v Visitor object */ @Override - public void accept(Visitor v) { + public void accept(final Visitor v) { v.visitAnnotation(this); } /** * @param annotation_table the entries to set in this annotation */ - public final void setAnnotationTable(AnnotationEntry[] annotation_table) { + public final void setAnnotationTable(final AnnotationEntry[] annotation_table) { this.annotation_table = annotation_table; } @@ -102,7 +102,7 @@ public abstract class Annotations extends Attribute { return isRuntimeVisible; } - protected void writeAnnotations(DataOutputStream dos) throws IOException { + protected void writeAnnotations(final DataOutputStream dos) throws IOException { if (annotation_table == null) { return; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ArrayElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ArrayElementValue.java index 488c8def..df4636c0 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ArrayElementValue.java @@ -44,7 +44,7 @@ public class ArrayElementValue extends ElementValue return sb.toString(); } - public ArrayElementValue(int type, ElementValue[] datums, ConstantPool cpool) + public ArrayElementValue(final int type, final ElementValue[] datums, final ConstantPool cpool) { super(type, cpool); if (type != ARRAY) { @@ -55,7 +55,7 @@ public class ArrayElementValue extends ElementValue } @Override - public void dump(DataOutputStream dos) throws IOException + public void dump(final DataOutputStream dos) throws IOException { dos.writeByte(super.getType()); // u1 type of value (ARRAY == '[') dos.writeShort(evalues.length); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java index fe6ddae9..b87d0b2b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java @@ -73,7 +73,7 @@ public abstract class Attribute implements Cloneable, Node { @java.lang.Deprecated protected ConstantPool constant_pool; // TODO make private (has getter & setter) - protected Attribute(byte tag, int name_index, int length, ConstantPool constant_pool) + protected Attribute(final byte tag, final int name_index, final int length, final ConstantPool constant_pool) { this.tag = tag; this.name_index = name_index; @@ -99,7 +99,7 @@ public abstract class Attribute implements Cloneable, Node { * Output file stream * @throws IOException */ - public void dump(DataOutputStream file) throws IOException + public void dump(final DataOutputStream file) throws IOException { file.writeShort(name_index); file.writeInt(length); @@ -117,7 +117,7 @@ public abstract class Attribute implements Cloneable, Node { * @deprecated Use {@link #addAttributeReader(String, UnknownAttributeReader)} instead */ @java.lang.Deprecated - public static void addAttributeReader(String name, AttributeReader r) + public static void addAttributeReader(final String name, final AttributeReader r) { readers.put(name, r); } @@ -130,7 +130,7 @@ public abstract class Attribute implements Cloneable, Node { * @param name the name of the attribute as stored in the class file * @param r the reader object */ - public static void addAttributeReader(String name, UnknownAttributeReader r) + public static void addAttributeReader(final String name, final UnknownAttributeReader r) { readers.put(name, r); } @@ -140,7 +140,7 @@ public abstract class Attribute implements Cloneable, Node { * * @param name the name of the attribute as stored in the class file */ - public static void removeAttributeReader(String name) + public static void removeAttributeReader(final String name) { readers.remove(name); } @@ -159,7 +159,7 @@ public abstract class Attribute implements Cloneable, Node { * @throws IOException * @throws ClassFormatException */ - public static Attribute readAttribute(DataInputStream file, ConstantPool constant_pool) + public static Attribute readAttribute(final DataInputStream file, final ConstantPool constant_pool) throws IOException, ClassFormatException { return readAttribute((DataInput) file, constant_pool); @@ -180,7 +180,7 @@ public abstract class Attribute implements Cloneable, Node { * @throws ClassFormatException * @since 6.0 */ - public static Attribute readAttribute(DataInput file, ConstantPool constant_pool) + public static Attribute readAttribute(final DataInput file, final ConstantPool constant_pool) throws IOException, ClassFormatException { byte tag = Const.ATTR_UNKNOWN; // Unknown attribute @@ -283,7 +283,7 @@ public abstract class Attribute implements Cloneable, Node { /** * @param length length in bytes. */ - public final void setLength(int length) + public final void setLength(final int length) { this.length = length; } @@ -291,7 +291,7 @@ public abstract class Attribute implements Cloneable, Node { /** * @param name_index of attribute. */ - public final void setNameIndex(int name_index) + public final void setNameIndex(final int name_index) { this.name_index = name_index; } @@ -325,7 +325,7 @@ public abstract class Attribute implements Cloneable, Node { * @param constant_pool Constant pool to be used for this object. * @see ConstantPool */ - public final void setConstantPool(ConstantPool constant_pool) + public final void setConstantPool(final ConstantPool constant_pool) { this.constant_pool = constant_pool; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java index a4795634..1f1afa06 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java @@ -45,7 +45,7 @@ public class BootstrapMethod implements Cloneable { /** * Initialize from another object. */ - public BootstrapMethod(BootstrapMethod c) { + public BootstrapMethod(final BootstrapMethod c) { this(c.getBootstrapMethodRef(), c.getBootstrapArguments()); } @@ -55,7 +55,7 @@ public class BootstrapMethod implements Cloneable { * @param input Input stream * @throws IOException */ - BootstrapMethod(DataInput input) throws IOException { + BootstrapMethod(final DataInput input) throws IOException { this(input.readUnsignedShort(), input.readUnsignedShort()); for (int i = 0; i < bootstrap_arguments.length; i++) { @@ -64,7 +64,7 @@ public class BootstrapMethod implements Cloneable { } // helper method - private BootstrapMethod(int bootstrap_method_ref, int num_bootstrap_arguments) { + private BootstrapMethod(final int bootstrap_method_ref, final int num_bootstrap_arguments) { this(bootstrap_method_ref, new int[num_bootstrap_arguments]); } @@ -72,7 +72,7 @@ public class BootstrapMethod implements Cloneable { * @param bootstrap_method_ref int index into constant_pool of CONSTANT_MethodHandle * @param bootstrap_arguments int[] indices into constant_pool of CONSTANT__info */ - public BootstrapMethod(int bootstrap_method_ref, int[] bootstrap_arguments) { + public BootstrapMethod(final int bootstrap_method_ref, final int[] bootstrap_arguments) { this.bootstrap_method_ref = bootstrap_method_ref; this.bootstrap_arguments = bootstrap_arguments; } @@ -87,7 +87,7 @@ public class BootstrapMethod implements Cloneable { /** * @param bootstrap_method_ref int index into constant_pool of CONSTANT_MethodHandle */ - public void setBootstrapMethodRef(int bootstrap_method_ref) { + public void setBootstrapMethodRef(final int bootstrap_method_ref) { this.bootstrap_method_ref = bootstrap_method_ref; } @@ -108,7 +108,7 @@ public class BootstrapMethod implements Cloneable { /** * @param bootstrap_arguments int[] indices into constant_pool of CONSTANT__info */ - public void setBootstrapArguments(int[] bootstrap_arguments) { + public void setBootstrapArguments(final int[] bootstrap_arguments) { this.bootstrap_arguments = bootstrap_arguments; } @@ -124,7 +124,7 @@ public class BootstrapMethod implements Cloneable { /** * @return Resolved string representation */ - public final String toString( ConstantPool constant_pool ) { + public final String toString( final ConstantPool constant_pool ) { StringBuilder buf = new StringBuilder(); String bootstrap_method_name; bootstrap_method_name = constant_pool.constantToString(bootstrap_method_ref, @@ -147,7 +147,7 @@ public class BootstrapMethod implements Cloneable { * @param file Output file stream * @throws IOException */ - public final void dump(DataOutputStream file) throws IOException { + public final void dump(final DataOutputStream file) throws IOException { file.writeShort(bootstrap_method_ref); file.writeShort(bootstrap_arguments.length); for (int bootstrap_argument : bootstrap_arguments) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java index 6a778ef2..1af4d57d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java @@ -38,7 +38,7 @@ public class BootstrapMethods extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use clone() for a physical copy. */ - public BootstrapMethods(BootstrapMethods c) { + public BootstrapMethods(final BootstrapMethods c) { this(c.getNameIndex(), c.getLength(), c.getBootstrapMethods(), c.getConstantPool()); } @@ -49,7 +49,7 @@ public class BootstrapMethods extends Attribute { * @param bootstrap_methods array of bootstrap methods * @param constant_pool Array of constants */ - public BootstrapMethods(int name_index, int length, BootstrapMethod[] bootstrap_methods, ConstantPool constant_pool) { + public BootstrapMethods(final int name_index, final int length, final BootstrapMethod[] bootstrap_methods, final ConstantPool constant_pool) { super(Const.ATTR_BOOTSTRAP_METHODS, name_index, length, constant_pool); this.bootstrap_methods = bootstrap_methods; } @@ -63,7 +63,7 @@ public class BootstrapMethods extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - BootstrapMethods(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { + BootstrapMethods(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (BootstrapMethod[]) null, constant_pool); int num_bootstrap_methods = input.readUnsignedShort(); @@ -83,7 +83,7 @@ public class BootstrapMethods extends Attribute { /** * @param bootstrap_methods the array of bootstrap methods */ - public final void setBootstrapMethods(BootstrapMethod[] bootstrap_methods) { + public final void setBootstrapMethods(final BootstrapMethod[] bootstrap_methods) { this.bootstrap_methods = bootstrap_methods; } @@ -91,7 +91,7 @@ public class BootstrapMethods extends Attribute { * @param v Visitor object */ @Override - public void accept(Visitor v) { + public void accept(final Visitor v) { v.visitBootstrapMethods(this); } @@ -99,7 +99,7 @@ public class BootstrapMethods extends Attribute { * @return deep copy of this attribute */ @Override - public BootstrapMethods copy(ConstantPool _constant_pool) { + public BootstrapMethods copy(final ConstantPool _constant_pool) { BootstrapMethods c = (BootstrapMethods) clone(); c.bootstrap_methods = new BootstrapMethod[bootstrap_methods.length]; @@ -117,7 +117,7 @@ public class BootstrapMethods extends Attribute { * @throws IOException */ @Override - public final void dump(DataOutputStream file) throws IOException { + public final void dump(final DataOutputStream file) throws IOException { super.dump(file); file.writeShort(bootstrap_methods.length); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ClassElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ClassElementValue.java index e7095feb..48676bd5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ClassElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ClassElementValue.java @@ -32,7 +32,7 @@ public class ClassElementValue extends ElementValue // For 'class' this points to the class entry in the cpool private final int idx; - public ClassElementValue(int type, int idx, ConstantPool cpool) + public ClassElementValue(final int type, final int idx, final ConstantPool cpool) { super(type, cpool); this.idx = idx; @@ -59,7 +59,7 @@ public class ClassElementValue extends ElementValue } @Override - public void dump(DataOutputStream dos) throws IOException + public void dump(final DataOutputStream dos) throws IOException { dos.writeByte(super.getType()); // u1 kind of value dos.writeShort(idx); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java b/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java index f21397a2..3adf142b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java @@ -33,7 +33,7 @@ public class ClassFormatException extends RuntimeException { } - public ClassFormatException(String s) { + public ClassFormatException(final String s) { super(s); } @@ -41,7 +41,7 @@ public class ClassFormatException extends RuntimeException { * {@inheritDoc} * @since 6.0 */ - public ClassFormatException(String message, Throwable cause) { + public ClassFormatException(final String message, final Throwable cause) { super(message, cause); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java b/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java index edb81025..9595be69 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java @@ -67,7 +67,7 @@ public final class ClassParser { * @param inputStream Input stream * @param file_name File name */ - public ClassParser(InputStream inputStream, String file_name) { + public ClassParser(final InputStream inputStream, final String file_name) { this.file_name = file_name; fileOwned = false; String clazz = inputStream.getClass().getName(); // Not a very clean solution ... @@ -84,7 +84,7 @@ public final class ClassParser { * * @param file_name file name */ - public ClassParser(String file_name) { + public ClassParser(final String file_name) { is_zip = false; this.file_name = file_name; fileOwned = true; @@ -96,7 +96,7 @@ public final class ClassParser { * @param zip_file zip file name * @param file_name file name */ - public ClassParser(String zip_file, String file_name) { + public ClassParser(final String zip_file, final String file_name) { is_zip = true; fileOwned = true; this.zip_file = zip_file; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Code.java b/src/main/java/org/apache/commons/bcel6/classfile/Code.java index 6ba86b4f..54dc4da8 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Code.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Code.java @@ -54,7 +54,7 @@ public final class Code extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use copy() for a physical copy. */ - public Code(Code c) { + public Code(final Code c) { this(c.getNameIndex(), c.getLength(), c.getMaxStack(), c.getMaxLocals(), c.getCode(), c .getExceptionTable(), c.getAttributes(), c.getConstantPool()); } @@ -66,7 +66,7 @@ public final class Code extends Attribute { * @param file Input stream * @param constant_pool Array of constants */ - Code(int name_index, int length, DataInput file, ConstantPool constant_pool) + Code(final int name_index, final int length, final DataInput file, final ConstantPool constant_pool) throws IOException { // Initialize with some default values which will be overwritten later this(name_index, length, file.readUnsignedShort(), file.readUnsignedShort(), (byte[]) null, @@ -108,8 +108,8 @@ public final class Code extends Attribute { * @param attributes Attributes of code: LineNumber or LocalVariable * @param constant_pool Array of constants */ - public Code(int name_index, int length, int max_stack, int max_locals, byte[] code, - CodeException[] exception_table, Attribute[] attributes, ConstantPool constant_pool) { + public Code(final int name_index, final int length, final int max_stack, final int max_locals, final byte[] code, + final CodeException[] exception_table, final Attribute[] attributes, final ConstantPool constant_pool) { super(Const.ATTR_CODE, name_index, length, constant_pool); this.max_stack = max_stack; this.max_locals = max_locals; @@ -128,7 +128,7 @@ public final class Code extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitCode(this); } @@ -140,7 +140,7 @@ public final class Code extends Attribute { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(max_stack); file.writeShort(max_locals); @@ -256,7 +256,7 @@ public final class Code extends Attribute { /** * @param attributes the attributes to set for this Code */ - public final void setAttributes( Attribute[] attributes ) { + public final void setAttributes( final Attribute[] attributes ) { this.attributes = attributes != null ? attributes : new Attribute[0]; super.setLength(calculateLength()); // Adjust length } @@ -265,7 +265,7 @@ public final class Code extends Attribute { /** * @param code byte code */ - public final void setCode( byte[] code ) { + public final void setCode( final byte[] code ) { this.code = code != null ? code : new byte[0]; super.setLength(calculateLength()); // Adjust length } @@ -274,7 +274,7 @@ public final class Code extends Attribute { /** * @param exception_table exception table */ - public final void setExceptionTable( CodeException[] exception_table ) { + public final void setExceptionTable( final CodeException[] exception_table ) { this.exception_table = exception_table != null ? exception_table : new CodeException[0]; super.setLength(calculateLength()); // Adjust length } @@ -283,7 +283,7 @@ public final class Code extends Attribute { /** * @param max_locals maximum number of local variables */ - public final void setMaxLocals( int max_locals ) { + public final void setMaxLocals( final int max_locals ) { this.max_locals = max_locals; } @@ -291,7 +291,7 @@ public final class Code extends Attribute { /** * @param max_stack maximum stack size */ - public final void setMaxStack( int max_stack ) { + public final void setMaxStack( final int max_stack ) { this.max_stack = max_stack; } @@ -299,7 +299,7 @@ public final class Code extends Attribute { /** * @return String representation of code chunk. */ - public final String toString( boolean verbose ) { + public final String toString( final boolean verbose ) { StringBuilder buf = new StringBuilder(100); // CHECKSTYLE IGNORE MagicNumber buf.append("Code(max_stack = ").append(max_stack).append(", max_locals = ").append( max_locals).append(", code_length = ").append(code.length).append(")\n").append( @@ -335,7 +335,7 @@ public final class Code extends Attribute { * @param _constant_pool the constant pool to duplicate */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { Code c = (Code) clone(); if (code != null) { c.code = new byte[code.length]; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java index 9593bb99..a2767d81 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java @@ -47,7 +47,7 @@ public final class CodeException implements Cloneable, Node { /** * Initialize from another object. */ - public CodeException(CodeException c) { + public CodeException(final CodeException c) { this(c.getStartPC(), c.getEndPC(), c.getHandlerPC(), c.getCatchType()); } @@ -57,7 +57,7 @@ public final class CodeException implements Cloneable, Node { * @param file Input stream * @throws IOException */ - CodeException(DataInput file) throws IOException { + CodeException(final DataInput file) throws IOException { this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), file .readUnsignedShort()); } @@ -73,7 +73,7 @@ public final class CodeException implements Cloneable, Node { * exception, otherwise it points to the exception class which is * to be caught. */ - public CodeException(int start_pc, int end_pc, int handler_pc, int catch_type) { + public CodeException(final int start_pc, final int end_pc, final int handler_pc, final int catch_type) { this.start_pc = start_pc; this.end_pc = end_pc; this.handler_pc = handler_pc; @@ -89,7 +89,7 @@ public final class CodeException implements Cloneable, Node { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitCodeException(this); } @@ -100,7 +100,7 @@ public final class CodeException implements Cloneable, Node { * @param file Output file stream * @throws IOException */ - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeShort(start_pc); file.writeShort(end_pc); file.writeShort(handler_pc); @@ -144,7 +144,7 @@ public final class CodeException implements Cloneable, Node { /** * @param catch_type the type of exception that is caught */ - public final void setCatchType( int catch_type ) { + public final void setCatchType( final int catch_type ) { this.catch_type = catch_type; } @@ -152,7 +152,7 @@ public final class CodeException implements Cloneable, Node { /** * @param end_pc end of handled block */ - public final void setEndPC( int end_pc ) { + public final void setEndPC( final int end_pc ) { this.end_pc = end_pc; } @@ -160,7 +160,7 @@ public final class CodeException implements Cloneable, Node { /** * @param handler_pc where the actual code is */ - public final void setHandlerPC( int handler_pc ) { // TODO unused + public final void setHandlerPC( final int handler_pc ) { // TODO unused this.handler_pc = handler_pc; } @@ -168,7 +168,7 @@ public final class CodeException implements Cloneable, Node { /** * @param start_pc start of handled block */ - public final void setStartPC( int start_pc ) { // TODO unused + public final void setStartPC( final int start_pc ) { // TODO unused this.start_pc = start_pc; } @@ -186,7 +186,7 @@ public final class CodeException implements Cloneable, Node { /** * @return String representation. */ - public final String toString( ConstantPool cp, boolean verbose ) { + public final String toString( final ConstantPool cp, final boolean verbose ) { String str; if (catch_type == 0) { str = "(0)"; @@ -198,7 +198,7 @@ public final class CodeException implements Cloneable, Node { } - public final String toString( ConstantPool cp ) { + public final String toString( final ConstantPool cp ) { return toString(cp, true); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java index c7782718..eddf986c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Constant.java @@ -36,7 +36,7 @@ public abstract class Constant implements Cloneable, Node { private static BCELComparator _cmp = new BCELComparator() { @Override - public boolean equals( Object o1, Object o2 ) { + public boolean equals( final Object o1, final Object o2 ) { Constant THIS = (Constant) o1; Constant THAT = (Constant) o2; return THIS.toString().equals(THAT.toString()); @@ -44,7 +44,7 @@ public abstract class Constant implements Cloneable, Node { @Override - public int hashCode( Object o ) { + public int hashCode( final Object o ) { Constant THIS = (Constant) o; return THIS.toString().hashCode(); } @@ -64,7 +64,7 @@ public abstract class Constant implements Cloneable, Node { protected byte tag; // TODO should be private & final - Constant(byte tag) { + Constant(final byte tag) { this.tag = tag; } @@ -131,7 +131,7 @@ public abstract class Constant implements Cloneable, Node { * @return Constant object * @since 6.0 made public */ - public static Constant readConstant( DataInput input ) throws IOException, + public static Constant readConstant( final DataInput input ) throws IOException, ClassFormatException { byte b = input.readByte(); // Read tag byte switch (b) { @@ -180,7 +180,7 @@ public abstract class Constant implements Cloneable, Node { /** * @param comparator Comparison strategy object */ - public static void setComparator( BCELComparator comparator ) { + public static void setComparator( final BCELComparator comparator ) { _cmp = comparator; } @@ -193,7 +193,7 @@ public abstract class Constant implements Cloneable, Node { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals( Object obj ) { + public boolean equals( final Object obj ) { return _cmp.equals(this, obj); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java index 5ca517b7..3ce39d3d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java @@ -56,7 +56,7 @@ public abstract class ConstantCP extends Constant { /** * Initialize from another object. */ - public ConstantCP(ConstantCP c) { + public ConstantCP(final ConstantCP c) { this(c.getTag(), c.getClassIndex(), c.getNameAndTypeIndex()); } @@ -68,7 +68,7 @@ public abstract class ConstantCP extends Constant { * @param file Input stream * @throws IOException */ - ConstantCP(byte tag, DataInput file) throws IOException { + ConstantCP(final byte tag, final DataInput file) throws IOException { this(tag, file.readUnsignedShort(), file.readUnsignedShort()); } @@ -77,7 +77,7 @@ public abstract class ConstantCP extends Constant { * @param class_index Reference to the class containing the field * @param name_and_type_index and the field signature */ - protected ConstantCP(byte tag, int class_index, int name_and_type_index) { + protected ConstantCP(final byte tag, final int class_index, final int name_and_type_index) { super(tag); this.class_index = class_index; this.name_and_type_index = name_and_type_index; @@ -91,7 +91,7 @@ public abstract class ConstantCP extends Constant { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeByte(super.getTag()); file.writeShort(class_index); file.writeShort(name_and_type_index); @@ -109,7 +109,7 @@ public abstract class ConstantCP extends Constant { /** * @param class_index points to Constant_class */ - public final void setClassIndex( int class_index ) { + public final void setClassIndex( final int class_index ) { this.class_index = class_index; } @@ -125,7 +125,7 @@ public abstract class ConstantCP extends Constant { /** * @param name_and_type_index points to Constant_NameAndType */ - public final void setNameAndTypeIndex( int name_and_type_index ) { + public final void setNameAndTypeIndex( final int name_and_type_index ) { this.name_and_type_index = name_and_type_index; } @@ -133,7 +133,7 @@ public abstract class ConstantCP extends Constant { /** * @return Class this field belongs to. */ - public String getClass( ConstantPool cp ) { + public String getClass( final ConstantPool cp ) { return cp.constantToString(class_index, Const.CONSTANT_Class); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java index 729f85e8..2236ccb5 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java @@ -38,7 +38,7 @@ public final class ConstantClass extends Constant implements ConstantObject { /** * Initialize from another object. */ - public ConstantClass(ConstantClass c) { + public ConstantClass(final ConstantClass c) { this(c.getNameIndex()); } @@ -49,7 +49,7 @@ public final class ConstantClass extends Constant implements ConstantObject { * @param file Input stream * @throws IOException */ - ConstantClass(DataInput file) throws IOException { + ConstantClass(final DataInput file) throws IOException { this(file.readUnsignedShort()); } @@ -58,7 +58,7 @@ public final class ConstantClass extends Constant implements ConstantObject { * @param name_index Name index in constant pool. Should refer to a * ConstantUtf8. */ - public ConstantClass(int name_index) { + public ConstantClass(final int name_index) { super(Const.CONSTANT_Class); this.name_index = name_index; } @@ -72,7 +72,7 @@ public final class ConstantClass extends Constant implements ConstantObject { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantClass(this); } @@ -84,7 +84,7 @@ public final class ConstantClass extends Constant implements ConstantObject { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeByte(super.getTag()); file.writeShort(name_index); } @@ -101,7 +101,7 @@ public final class ConstantClass extends Constant implements ConstantObject { /** * @param name_index the name index in the constant pool of this Constant Class */ - public final void setNameIndex( int name_index ) { + public final void setNameIndex( final int name_index ) { this.name_index = name_index; } @@ -109,7 +109,7 @@ public final class ConstantClass extends Constant implements ConstantObject { /** @return String object */ @Override - public Object getConstantValue( ConstantPool cp ) { + public Object getConstantValue( final ConstantPool cp ) { Constant c = cp.getConstant(name_index, Const.CONSTANT_Utf8); return ((ConstantUtf8) c).getBytes(); } @@ -117,7 +117,7 @@ public final class ConstantClass extends Constant implements ConstantObject { /** @return dereferenced string */ - public String getBytes( ConstantPool cp ) { + public String getBytes( final ConstantPool cp ) { return (String) getConstantValue(cp); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java index 1b2a5d54..dd3e2543 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java @@ -38,7 +38,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { /** * @param bytes Data */ - public ConstantDouble(double bytes) { + public ConstantDouble(final double bytes) { super(Const.CONSTANT_Double); this.bytes = bytes; } @@ -47,7 +47,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { /** * Initialize from another object. */ - public ConstantDouble(ConstantDouble c) { + public ConstantDouble(final ConstantDouble c) { this(c.getBytes()); } @@ -58,7 +58,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { * @param file Input stream * @throws IOException */ - ConstantDouble(DataInput file) throws IOException { + ConstantDouble(final DataInput file) throws IOException { this(file.readDouble()); } @@ -71,7 +71,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantDouble(this); } @@ -83,7 +83,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeByte(super.getTag()); file.writeDouble(bytes); } @@ -100,7 +100,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { /** * @param bytes the raw bytes that represent the double value */ - public final void setBytes( double bytes ) { + public final void setBytes( final double bytes ) { this.bytes = bytes; } @@ -117,7 +117,7 @@ public final class ConstantDouble extends Constant implements ConstantObject { /** @return Double object */ @Override - public Object getConstantValue( ConstantPool cp ) { + public Object getConstantValue( final ConstantPool cp ) { return new Double(bytes); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java index c6ae4a52..cbfa372f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java @@ -32,7 +32,7 @@ public final class ConstantFieldref extends ConstantCP { /** * Initialize from another object. */ - public ConstantFieldref(ConstantFieldref c) { + public ConstantFieldref(final ConstantFieldref c) { super(Const.CONSTANT_Fieldref, c.getClassIndex(), c.getNameAndTypeIndex()); } @@ -43,7 +43,7 @@ public final class ConstantFieldref extends ConstantCP { * @param input input stream * @throws IOException */ - ConstantFieldref(DataInput input) throws IOException { + ConstantFieldref(final DataInput input) throws IOException { super(Const.CONSTANT_Fieldref, input); } @@ -52,7 +52,7 @@ public final class ConstantFieldref extends ConstantCP { * @param class_index Reference to the class containing the Field * @param name_and_type_index and the Field signature */ - public ConstantFieldref(int class_index, int name_and_type_index) { + public ConstantFieldref(final int class_index, final int name_and_type_index) { super(Const.CONSTANT_Fieldref, class_index, name_and_type_index); } @@ -65,7 +65,7 @@ public final class ConstantFieldref extends ConstantCP { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantFieldref(this); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java index f47ddabe..8a79077d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java @@ -38,7 +38,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { /** * @param bytes Data */ - public ConstantFloat(float bytes) { + public ConstantFloat(final float bytes) { super(Const.CONSTANT_Float); this.bytes = bytes; } @@ -48,7 +48,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use clone() for a physical copy. */ - public ConstantFloat(ConstantFloat c) { + public ConstantFloat(final ConstantFloat c) { this(c.getBytes()); } @@ -59,7 +59,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { * @param file Input stream * @throws IOException */ - ConstantFloat(DataInput file) throws IOException { + ConstantFloat(final DataInput file) throws IOException { this(file.readFloat()); } @@ -72,7 +72,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantFloat(this); } @@ -84,7 +84,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeByte(super.getTag()); file.writeFloat(bytes); } @@ -101,7 +101,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { /** * @param bytes the raw bytes that represent this float */ - public final void setBytes( float bytes ) { + public final void setBytes( final float bytes ) { this.bytes = bytes; } @@ -118,7 +118,7 @@ public final class ConstantFloat extends Constant implements ConstantObject { /** @return Float object */ @Override - public Object getConstantValue( ConstantPool cp ) { + public Object getConstantValue( final ConstantPool cp ) { return new Float(bytes); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java index b28fd856..5a397054 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java @@ -38,7 +38,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { /** * @param bytes Data */ - public ConstantInteger(int bytes) { + public ConstantInteger(final int bytes) { super(Const.CONSTANT_Integer); this.bytes = bytes; } @@ -47,7 +47,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { /** * Initialize from another object. */ - public ConstantInteger(ConstantInteger c) { + public ConstantInteger(final ConstantInteger c) { this(c.getBytes()); } @@ -58,7 +58,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { * @param file Input stream * @throws IOException */ - ConstantInteger(DataInput file) throws IOException { + ConstantInteger(final DataInput file) throws IOException { this(file.readInt()); } @@ -71,7 +71,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantInteger(this); } @@ -83,7 +83,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeByte(super.getTag()); file.writeInt(bytes); } @@ -100,7 +100,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { /** * @param bytes the raw bytes that represent this integer */ - public final void setBytes( int bytes ) { + public final void setBytes( final int bytes ) { this.bytes = bytes; } @@ -117,7 +117,7 @@ public final class ConstantInteger extends Constant implements ConstantObject { /** @return Integer object */ @Override - public Object getConstantValue( ConstantPool cp ) { + public Object getConstantValue( final ConstantPool cp ) { return Integer.valueOf(bytes); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java index 2b096e4a..309a6fa6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java @@ -32,7 +32,7 @@ public final class ConstantInterfaceMethodref extends ConstantCP { /** * Initialize from another object. */ - public ConstantInterfaceMethodref(ConstantInterfaceMethodref c) { + public ConstantInterfaceMethodref(final ConstantInterfaceMethodref c) { super(Const.CONSTANT_InterfaceMethodref, c.getClassIndex(), c.getNameAndTypeIndex()); } @@ -43,7 +43,7 @@ public final class ConstantInterfaceMethodref extends ConstantCP { * @param input input stream * @throws IOException */ - ConstantInterfaceMethodref(DataInput input) throws IOException { + ConstantInterfaceMethodref(final DataInput input) throws IOException { super(Const.CONSTANT_InterfaceMethodref, input); } @@ -52,7 +52,7 @@ public final class ConstantInterfaceMethodref extends ConstantCP { * @param class_index Reference to the class containing the method * @param name_and_type_index and the method signature */ - public ConstantInterfaceMethodref(int class_index, int name_and_type_index) { + public ConstantInterfaceMethodref(final int class_index, final int name_and_type_index) { super(Const.CONSTANT_InterfaceMethodref, class_index, name_and_type_index); } @@ -65,7 +65,7 @@ public final class ConstantInterfaceMethodref extends ConstantCP { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantInterfaceMethodref(this); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java index e4ddab97..897d2102 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java @@ -36,7 +36,7 @@ public final class ConstantInvokeDynamic extends ConstantCP { /** * Initialize from another object. */ - public ConstantInvokeDynamic(ConstantInvokeDynamic c) { + public ConstantInvokeDynamic(final ConstantInvokeDynamic c) { this(c.getBootstrapMethodAttrIndex(), c.getNameAndTypeIndex()); } @@ -47,12 +47,12 @@ public final class ConstantInvokeDynamic extends ConstantCP { * @param file Input stream * @throws IOException */ - ConstantInvokeDynamic(DataInput file) throws IOException { + ConstantInvokeDynamic(final DataInput file) throws IOException { this(file.readShort(), file.readShort()); } - public ConstantInvokeDynamic(int bootstrap_method_attr_index, int name_and_type_index) { + public ConstantInvokeDynamic(final int bootstrap_method_attr_index, final int name_and_type_index) { super(Const.CONSTANT_InvokeDynamic, bootstrap_method_attr_index, name_and_type_index); } @@ -65,7 +65,7 @@ public final class ConstantInvokeDynamic extends ConstantCP { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantInvokeDynamic(this); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java index 8c59bfd9..f94549ab 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java @@ -38,7 +38,7 @@ public final class ConstantLong extends Constant implements ConstantObject { /** * @param bytes Data */ - public ConstantLong(long bytes) { + public ConstantLong(final long bytes) { super(Const.CONSTANT_Long); this.bytes = bytes; } @@ -47,7 +47,7 @@ public final class ConstantLong extends Constant implements ConstantObject { /** * Initialize from another object. */ - public ConstantLong(ConstantLong c) { + public ConstantLong(final ConstantLong c) { this(c.getBytes()); } @@ -58,7 +58,7 @@ public final class ConstantLong extends Constant implements ConstantObject { * @param file Input stream * @throws IOException */ - ConstantLong(DataInput file) throws IOException { + ConstantLong(final DataInput file) throws IOException { this(file.readLong()); } @@ -71,7 +71,7 @@ public final class ConstantLong extends Constant implements ConstantObject { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantLong(this); } @@ -83,7 +83,7 @@ public final class ConstantLong extends Constant implements ConstantObject { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeByte(super.getTag()); file.writeLong(bytes); } @@ -100,7 +100,7 @@ public final class ConstantLong extends Constant implements ConstantObject { /** * @param bytes the raw bytes that represent this long */ - public final void setBytes( long bytes ) { + public final void setBytes( final long bytes ) { this.bytes = bytes; } @@ -117,7 +117,7 @@ public final class ConstantLong extends Constant implements ConstantObject { /** @return Long object */ @Override - public Object getConstantValue( ConstantPool cp ) { + public Object getConstantValue( final ConstantPool cp ) { return Long.valueOf(bytes); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java index f3f8efd0..85b7d523 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java @@ -39,7 +39,7 @@ public final class ConstantMethodHandle extends Constant { /** * Initialize from another object. */ - public ConstantMethodHandle(ConstantMethodHandle c) { + public ConstantMethodHandle(final ConstantMethodHandle c) { this(c.getReferenceKind(), c.getReferenceIndex()); } @@ -50,12 +50,12 @@ public final class ConstantMethodHandle extends Constant { * @param file Input stream * @throws IOException */ - ConstantMethodHandle(DataInput file) throws IOException { + ConstantMethodHandle(final DataInput file) throws IOException { this(file.readUnsignedByte(), file.readUnsignedShort()); } - public ConstantMethodHandle(int reference_kind, int reference_index) { + public ConstantMethodHandle(final int reference_kind, final int reference_index) { super(Const.CONSTANT_MethodHandle); this.reference_kind = reference_kind; this.reference_index = reference_index; @@ -70,7 +70,7 @@ public final class ConstantMethodHandle extends Constant { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantMethodHandle(this); } @@ -82,7 +82,7 @@ public final class ConstantMethodHandle extends Constant { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeByte(super.getTag()); file.writeByte(reference_kind); file.writeShort(reference_index); @@ -94,7 +94,7 @@ public final class ConstantMethodHandle extends Constant { } - public void setReferenceKind(int reference_kind) { + public void setReferenceKind(final int reference_kind) { this.reference_kind = reference_kind; } @@ -104,7 +104,7 @@ public final class ConstantMethodHandle extends Constant { } - public void setReferenceIndex(int reference_index) { + public void setReferenceIndex(final int reference_index) { this.reference_index = reference_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java index 1024ad01..1491f14c 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java @@ -38,7 +38,7 @@ public final class ConstantMethodType extends Constant { /** * Initialize from another object. */ - public ConstantMethodType(ConstantMethodType c) { + public ConstantMethodType(final ConstantMethodType c) { this(c.getDescriptorIndex()); } @@ -49,12 +49,12 @@ public final class ConstantMethodType extends Constant { * @param file Input stream * @throws IOException */ - ConstantMethodType(DataInput file) throws IOException { + ConstantMethodType(final DataInput file) throws IOException { this(file.readUnsignedShort()); } - public ConstantMethodType(int descriptor_index) { + public ConstantMethodType(final int descriptor_index) { super(Const.CONSTANT_MethodType); this.descriptor_index = descriptor_index; } @@ -68,7 +68,7 @@ public final class ConstantMethodType extends Constant { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantMethodType(this); } @@ -80,7 +80,7 @@ public final class ConstantMethodType extends Constant { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeByte(super.getTag()); file.writeShort(descriptor_index); } @@ -91,7 +91,7 @@ public final class ConstantMethodType extends Constant { } - public void setDescriptorIndex(int descriptor_index) { + public void setDescriptorIndex(final int descriptor_index) { this.descriptor_index = descriptor_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java index de89287e..87596dfc 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java @@ -32,7 +32,7 @@ public final class ConstantMethodref extends ConstantCP { /** * Initialize from another object. */ - public ConstantMethodref(ConstantMethodref c) { + public ConstantMethodref(final ConstantMethodref c) { super(Const.CONSTANT_Methodref, c.getClassIndex(), c.getNameAndTypeIndex()); } @@ -43,7 +43,7 @@ public final class ConstantMethodref extends ConstantCP { * @param input input stream * @throws IOException */ - ConstantMethodref(DataInput input) throws IOException { + ConstantMethodref(final DataInput input) throws IOException { super(Const.CONSTANT_Methodref, input); } @@ -52,7 +52,7 @@ public final class ConstantMethodref extends ConstantCP { * @param class_index Reference to the class containing the method * @param name_and_type_index and the method signature */ - public ConstantMethodref(int class_index, int name_and_type_index) { + public ConstantMethodref(final int class_index, final int name_and_type_index) { super(Const.CONSTANT_Methodref, class_index, name_and_type_index); } @@ -65,7 +65,7 @@ public final class ConstantMethodref extends ConstantCP { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantMethodref(this); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java index ff3f74d6..1d1743da 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java @@ -40,7 +40,7 @@ public final class ConstantNameAndType extends Constant { /** * Initialize from another object. */ - public ConstantNameAndType(ConstantNameAndType c) { + public ConstantNameAndType(final ConstantNameAndType c) { this(c.getNameIndex(), c.getSignatureIndex()); } @@ -51,7 +51,7 @@ public final class ConstantNameAndType extends Constant { * @param file Input stream * @throws IOException */ - ConstantNameAndType(DataInput file) throws IOException { + ConstantNameAndType(final DataInput file) throws IOException { this(file.readUnsignedShort(), file.readUnsignedShort()); } @@ -60,7 +60,7 @@ public final class ConstantNameAndType extends Constant { * @param name_index Name of field/method * @param signature_index and its signature */ - public ConstantNameAndType(int name_index, int signature_index) { + public ConstantNameAndType(final int name_index, final int signature_index) { super(Const.CONSTANT_NameAndType); this.name_index = name_index; this.signature_index = signature_index; @@ -75,7 +75,7 @@ public final class ConstantNameAndType extends Constant { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantNameAndType(this); } @@ -87,7 +87,7 @@ public final class ConstantNameAndType extends Constant { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeByte(super.getTag()); file.writeShort(name_index); file.writeShort(signature_index); @@ -104,7 +104,7 @@ public final class ConstantNameAndType extends Constant { /** @return name */ - public final String getName( ConstantPool cp ) { + public final String getName( final ConstantPool cp ) { return cp.constantToString(getNameIndex(), Const.CONSTANT_Utf8); } @@ -119,7 +119,7 @@ public final class ConstantNameAndType extends Constant { /** @return signature */ - public final String getSignature( ConstantPool cp ) { + public final String getSignature( final ConstantPool cp ) { return cp.constantToString(getSignatureIndex(), Const.CONSTANT_Utf8); } @@ -127,7 +127,7 @@ public final class ConstantNameAndType extends Constant { /** * @param name_index the name index of this constant */ - public final void setNameIndex( int name_index ) { + public final void setNameIndex( final int name_index ) { this.name_index = name_index; } @@ -135,7 +135,7 @@ public final class ConstantNameAndType extends Constant { /** * @param signature_index the signature index in the constant pool of this type */ - public final void setSignatureIndex( int signature_index ) { + public final void setSignatureIndex( final int signature_index ) { this.signature_index = signature_index; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java index 92c4f98c..115cfbda 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java @@ -43,7 +43,7 @@ public class ConstantPool implements Cloneable, Node { /** * @param constant_pool Array of constants */ - public ConstantPool(Constant[] constant_pool) { + public ConstantPool(final Constant[] constant_pool) { this.constant_pool = constant_pool; } @@ -55,7 +55,7 @@ public class ConstantPool implements Cloneable, Node { * @throws IOException * @throws ClassFormatException */ - public ConstantPool(DataInput input) throws IOException, ClassFormatException { + public ConstantPool(final DataInput input) throws IOException, ClassFormatException { byte tag; int constant_pool_count = input.readUnsignedShort(); constant_pool = new Constant[constant_pool_count]; @@ -87,7 +87,7 @@ public class ConstantPool implements Cloneable, Node { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantPool(this); } @@ -166,7 +166,7 @@ public class ConstantPool implements Cloneable, Node { } - private static String escape( String str ) { + private static String escape( final String str ) { int len = str.length(); StringBuilder buf = new StringBuilder(len + 5); char[] ch = str.toCharArray(); @@ -203,7 +203,7 @@ public class ConstantPool implements Cloneable, Node { * @param tag expected type * @return String representation */ - public String constantToString( int index, byte tag ) throws ClassFormatException { + public String constantToString( final int index, final byte tag ) throws ClassFormatException { Constant c = getConstant(index, tag); return constantToString(c); } @@ -215,7 +215,7 @@ public class ConstantPool implements Cloneable, Node { * @param file Output file stream * @throws IOException */ - public void dump( DataOutputStream file ) throws IOException { + public void dump( final DataOutputStream file ) throws IOException { file.writeShort(constant_pool.length); for (int i = 1; i < constant_pool.length; i++) { if (constant_pool[i] != null) { @@ -232,7 +232,7 @@ public class ConstantPool implements Cloneable, Node { * @return Constant value * @see Constant */ - public Constant getConstant( int index ) { + public Constant getConstant( final int index ) { if (index >= constant_pool.length || index < 0) { throw new ClassFormatException("Invalid constant pool reference: " + index + ". Constant pool size is: " + constant_pool.length); @@ -251,7 +251,7 @@ public class ConstantPool implements Cloneable, Node { * @see Constant * @throws ClassFormatException */ - public Constant getConstant( int index, byte tag ) throws ClassFormatException { + public Constant getConstant( final int index, final byte tag ) throws ClassFormatException { Constant c; c = getConstant(index); if (c == null) { @@ -287,7 +287,7 @@ public class ConstantPool implements Cloneable, Node { * @see ConstantString * @throws ClassFormatException */ - public String getConstantString( int index, byte tag ) throws ClassFormatException { + public String getConstantString( final int index, final byte tag ) throws ClassFormatException { Constant c; int i; c = getConstant(index, tag); @@ -325,7 +325,7 @@ public class ConstantPool implements Cloneable, Node { /** * @param constant Constant to set */ - public void setConstant( int index, Constant constant ) { + public void setConstant( final int index, final Constant constant ) { constant_pool[index] = constant; } @@ -333,7 +333,7 @@ public class ConstantPool implements Cloneable, Node { /** * @param constant_pool */ - public void setConstantPool( Constant[] constant_pool ) { + public void setConstantPool( final Constant[] constant_pool ) { this.constant_pool = constant_pool; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java index b359e12a..7e80ba79 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java @@ -38,7 +38,7 @@ public final class ConstantString extends Constant implements ConstantObject { /** * Initialize from another object. */ - public ConstantString(ConstantString c) { + public ConstantString(final ConstantString c) { this(c.getStringIndex()); } @@ -49,7 +49,7 @@ public final class ConstantString extends Constant implements ConstantObject { * @param file Input stream * @throws IOException */ - ConstantString(DataInput file) throws IOException { + ConstantString(final DataInput file) throws IOException { this(file.readUnsignedShort()); } @@ -57,7 +57,7 @@ public final class ConstantString extends Constant implements ConstantObject { /** * @param string_index Index of Constant_Utf8 in constant pool */ - public ConstantString(int string_index) { + public ConstantString(final int string_index) { super(Const.CONSTANT_String); this.string_index = string_index; } @@ -71,7 +71,7 @@ public final class ConstantString extends Constant implements ConstantObject { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantString(this); } @@ -83,7 +83,7 @@ public final class ConstantString extends Constant implements ConstantObject { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeByte(super.getTag()); file.writeShort(string_index); } @@ -100,7 +100,7 @@ public final class ConstantString extends Constant implements ConstantObject { /** * @param string_index the index into the constant of the string value */ - public final void setStringIndex( int string_index ) { + public final void setStringIndex( final int string_index ) { this.string_index = string_index; } @@ -117,7 +117,7 @@ public final class ConstantString extends Constant implements ConstantObject { /** @return String object */ @Override - public Object getConstantValue( ConstantPool cp ) { + public Object getConstantValue( final ConstantPool cp ) { Constant c = cp.getConstant(string_index, Const.CONSTANT_Utf8); return ((ConstantUtf8) c).getBytes(); } @@ -125,7 +125,7 @@ public final class ConstantString extends Constant implements ConstantObject { /** @return dereferenced string */ - public String getBytes( ConstantPool cp ) { + public String getBytes( final ConstantPool cp ) { return (String) getConstantValue(cp); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java index bf0f664a..e3825eda 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java @@ -59,7 +59,7 @@ public final class ConstantUtf8 extends Constant { private static final long serialVersionUID = -8506975356158971766L; @Override - protected boolean removeEldestEntry(Map.Entry eldest) { + protected boolean removeEldestEntry(final Map.Entry eldest) { return size() > MAX_CACHE_ENTRIES; } }; @@ -91,7 +91,7 @@ public final class ConstantUtf8 extends Constant { /** * @since 6.0 */ - public static ConstantUtf8 getCachedInstance(String s) { + public static ConstantUtf8 getCachedInstance(final String s) { if (s.length() > MAX_CACHED_SIZE) { skipped++; return new ConstantUtf8(s); @@ -112,21 +112,21 @@ public final class ConstantUtf8 extends Constant { /** * @since 6.0 */ - public static ConstantUtf8 getInstance(String s) { + public static ConstantUtf8 getInstance(final String s) { return new ConstantUtf8(s); } /** * @since 6.0 */ - public static ConstantUtf8 getInstance (DataInput input) throws IOException { + public static ConstantUtf8 getInstance (final DataInput input) throws IOException { return getInstance(input.readUTF()); } /** * Initialize from another object. */ - public ConstantUtf8(ConstantUtf8 c) { + public ConstantUtf8(final ConstantUtf8 c) { this(c.getBytes()); } @@ -137,7 +137,7 @@ public final class ConstantUtf8 extends Constant { * @param file Input stream * @throws IOException */ - ConstantUtf8(DataInput file) throws IOException { + ConstantUtf8(final DataInput file) throws IOException { super(Const.CONSTANT_Utf8); bytes = file.readUTF(); created++; @@ -147,7 +147,7 @@ public final class ConstantUtf8 extends Constant { /** * @param bytes Data */ - public ConstantUtf8(String bytes) { + public ConstantUtf8(final String bytes) { super(Const.CONSTANT_Utf8); if (bytes == null) { throw new IllegalArgumentException("bytes must not be null!"); @@ -165,7 +165,7 @@ public final class ConstantUtf8 extends Constant { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantUtf8(this); } @@ -177,7 +177,7 @@ public final class ConstantUtf8 extends Constant { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeByte(super.getTag()); file.writeUTF(bytes); } @@ -196,7 +196,7 @@ public final class ConstantUtf8 extends Constant { * @deprecated */ @java.lang.Deprecated - public final void setBytes( String bytes ) { + public final void setBytes( final String bytes ) { throw new UnsupportedOperationException(); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java index c3b0885a..7211a306 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java @@ -40,7 +40,7 @@ public final class ConstantValue extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use clone() for a physical copy. */ - public ConstantValue(ConstantValue c) { + public ConstantValue(final ConstantValue c) { this(c.getNameIndex(), c.getLength(), c.getConstantValueIndex(), c.getConstantPool()); } @@ -53,7 +53,7 @@ public final class ConstantValue extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - ConstantValue(int name_index, int length, DataInput input, ConstantPool constant_pool) + ConstantValue(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, input.readUnsignedShort(), constant_pool); } @@ -65,8 +65,8 @@ public final class ConstantValue extends Attribute { * @param constantvalue_index Index in constant pool * @param constant_pool Array of constants */ - public ConstantValue(int name_index, int length, int constantvalue_index, - ConstantPool constant_pool) { + public ConstantValue(final int name_index, final int length, final int constantvalue_index, + final ConstantPool constant_pool) { super(Const.ATTR_CONSTANT_VALUE, name_index, length, constant_pool); this.constantvalue_index = constantvalue_index; } @@ -80,7 +80,7 @@ public final class ConstantValue extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitConstantValue(this); } @@ -92,7 +92,7 @@ public final class ConstantValue extends Attribute { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(constantvalue_index); } @@ -109,7 +109,7 @@ public final class ConstantValue extends Attribute { /** * @param constantvalue_index the index info the constant pool of this constant value */ - public final void setConstantValueIndex( int constantvalue_index ) { + public final void setConstantValueIndex( final int constantvalue_index ) { this.constantvalue_index = constantvalue_index; } @@ -152,7 +152,7 @@ public final class ConstantValue extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { ConstantValue c = (ConstantValue) clone(); c.setConstantPool(_constant_pool); return c; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java index 8797d067..d166214f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java @@ -40,7 +40,7 @@ public final class Deprecated extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use clone() for a physical copy. */ - public Deprecated(Deprecated c) { + public Deprecated(final Deprecated c) { this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); } @@ -51,7 +51,7 @@ public final class Deprecated extends Attribute { * @param bytes Attribute contents * @param constant_pool Array of constants */ - public Deprecated(int name_index, int length, byte[] bytes, ConstantPool constant_pool) { + public Deprecated(final int name_index, final int length, final byte[] bytes, final ConstantPool constant_pool) { super(Const.ATTR_DEPRECATED, name_index, length, constant_pool); this.bytes = bytes; } @@ -66,7 +66,7 @@ public final class Deprecated extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - Deprecated(int name_index, int length, DataInput input, ConstantPool constant_pool) + Deprecated(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (byte[]) null, constant_pool); if (length > 0) { @@ -85,7 +85,7 @@ public final class Deprecated extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitDeprecated(this); } @@ -97,7 +97,7 @@ public final class Deprecated extends Attribute { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); if (super.getLength() > 0) { file.write(bytes, 0, super.getLength()); @@ -116,7 +116,7 @@ public final class Deprecated extends Attribute { /** * @param bytes the raw bytes that represents this byte array */ - public final void setBytes( byte[] bytes ) { + public final void setBytes( final byte[] bytes ) { this.bytes = bytes; } @@ -134,7 +134,7 @@ public final class Deprecated extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { Deprecated c = (Deprecated) clone(); if (bytes != null) { c.bytes = new byte[bytes.length]; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java index 70e0391a..90514acf 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java @@ -47,7 +47,7 @@ public class DescendingVisitor implements Visitor * nesting level, i.e., 0 returns the direct predecessor * @return container of current entitity, i.e., predecessor during traversal */ - public Object predecessor(int level) + public Object predecessor(final int level) { int size = stack.size(); if ((size < 2) || (level < 0)) @@ -71,7 +71,7 @@ public class DescendingVisitor implements Visitor * @param visitor * visitor object to apply to all components */ - public DescendingVisitor(JavaClass clazz, Visitor visitor) + public DescendingVisitor(final JavaClass clazz, final Visitor visitor) { this.clazz = clazz; this.visitor = visitor; @@ -86,7 +86,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitJavaClass(JavaClass _clazz) + public void visitJavaClass(final JavaClass _clazz) { stack.push(_clazz); _clazz.accept(visitor); @@ -110,7 +110,7 @@ public class DescendingVisitor implements Visitor * @since 6.0 */ @Override - public void visitAnnotation(Annotations annotation) + public void visitAnnotation(final Annotations annotation) { stack.push(annotation); annotation.accept(visitor); @@ -125,7 +125,7 @@ public class DescendingVisitor implements Visitor * @since 6.0 */ @Override - public void visitAnnotationEntry(AnnotationEntry annotationEntry) + public void visitAnnotationEntry(final AnnotationEntry annotationEntry) { stack.push(annotationEntry); annotationEntry.accept(visitor); @@ -133,7 +133,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitField(Field field) + public void visitField(final Field field) { stack.push(field); field.accept(visitor); @@ -145,7 +145,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitConstantValue(ConstantValue cv) + public void visitConstantValue(final ConstantValue cv) { stack.push(cv); cv.accept(visitor); @@ -153,7 +153,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitMethod(Method method) + public void visitMethod(final Method method) { stack.push(method); method.accept(visitor); @@ -165,7 +165,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitExceptionTable(ExceptionTable table) + public void visitExceptionTable(final ExceptionTable table) { stack.push(table); table.accept(visitor); @@ -173,7 +173,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitCode(Code code) + public void visitCode(final Code code) { stack.push(code); code.accept(visitor); @@ -189,7 +189,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitCodeException(CodeException ce) + public void visitCodeException(final CodeException ce) { stack.push(ce); ce.accept(visitor); @@ -197,7 +197,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitLineNumberTable(LineNumberTable table) + public void visitLineNumberTable(final LineNumberTable table) { stack.push(table); table.accept(visitor); @@ -209,7 +209,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitLineNumber(LineNumber number) + public void visitLineNumber(final LineNumber number) { stack.push(number); number.accept(visitor); @@ -217,7 +217,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitLocalVariableTable(LocalVariableTable table) + public void visitLocalVariableTable(final LocalVariableTable table) { stack.push(table); table.accept(visitor); @@ -229,7 +229,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitStackMap(StackMap table) + public void visitStackMap(final StackMap table) { stack.push(table); table.accept(visitor); @@ -241,7 +241,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitStackMapEntry(StackMapEntry var) + public void visitStackMapEntry(final StackMapEntry var) { stack.push(var); var.accept(visitor); @@ -275,7 +275,7 @@ public class DescendingVisitor implements Visitor */ @Override - public void visitLocalVariable(LocalVariable var) + public void visitLocalVariable(final LocalVariable var) { stack.push(var); var.accept(visitor); @@ -283,7 +283,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitConstantPool(ConstantPool cp) + public void visitConstantPool(final ConstantPool cp) { stack.push(cp); cp.accept(visitor); @@ -299,7 +299,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitConstantClass(ConstantClass constant) + public void visitConstantClass(final ConstantClass constant) { stack.push(constant); constant.accept(visitor); @@ -307,7 +307,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitConstantDouble(ConstantDouble constant) + public void visitConstantDouble(final ConstantDouble constant) { stack.push(constant); constant.accept(visitor); @@ -315,7 +315,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitConstantFieldref(ConstantFieldref constant) + public void visitConstantFieldref(final ConstantFieldref constant) { stack.push(constant); constant.accept(visitor); @@ -323,7 +323,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitConstantFloat(ConstantFloat constant) + public void visitConstantFloat(final ConstantFloat constant) { stack.push(constant); constant.accept(visitor); @@ -331,7 +331,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitConstantInteger(ConstantInteger constant) + public void visitConstantInteger(final ConstantInteger constant) { stack.push(constant); constant.accept(visitor); @@ -340,7 +340,7 @@ public class DescendingVisitor implements Visitor @Override public void visitConstantInterfaceMethodref( - ConstantInterfaceMethodref constant) + final ConstantInterfaceMethodref constant) { stack.push(constant); constant.accept(visitor); @@ -352,7 +352,7 @@ public class DescendingVisitor implements Visitor */ @Override public void visitConstantInvokeDynamic( - ConstantInvokeDynamic constant) + final ConstantInvokeDynamic constant) { stack.push(constant); constant.accept(visitor); @@ -360,7 +360,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitConstantLong(ConstantLong constant) + public void visitConstantLong(final ConstantLong constant) { stack.push(constant); constant.accept(visitor); @@ -368,7 +368,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitConstantMethodref(ConstantMethodref constant) + public void visitConstantMethodref(final ConstantMethodref constant) { stack.push(constant); constant.accept(visitor); @@ -376,7 +376,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitConstantNameAndType(ConstantNameAndType constant) + public void visitConstantNameAndType(final ConstantNameAndType constant) { stack.push(constant); constant.accept(visitor); @@ -384,7 +384,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitConstantString(ConstantString constant) + public void visitConstantString(final ConstantString constant) { stack.push(constant); constant.accept(visitor); @@ -392,7 +392,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitConstantUtf8(ConstantUtf8 constant) + public void visitConstantUtf8(final ConstantUtf8 constant) { stack.push(constant); constant.accept(visitor); @@ -400,7 +400,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitInnerClasses(InnerClasses ic) + public void visitInnerClasses(final InnerClasses ic) { stack.push(ic); ic.accept(visitor); @@ -412,7 +412,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitInnerClass(InnerClass inner) + public void visitInnerClass(final InnerClass inner) { stack.push(inner); inner.accept(visitor); @@ -423,7 +423,7 @@ public class DescendingVisitor implements Visitor * @since 6.0 */ @Override - public void visitBootstrapMethods(BootstrapMethods bm) + public void visitBootstrapMethods(final BootstrapMethods bm) { stack.push(bm); bm.accept(visitor); @@ -436,7 +436,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitDeprecated(Deprecated attribute) + public void visitDeprecated(final Deprecated attribute) { stack.push(attribute); attribute.accept(visitor); @@ -444,7 +444,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitSignature(Signature attribute) + public void visitSignature(final Signature attribute) { stack.push(attribute); attribute.accept(visitor); @@ -452,7 +452,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitSourceFile(SourceFile attribute) + public void visitSourceFile(final SourceFile attribute) { stack.push(attribute); attribute.accept(visitor); @@ -460,7 +460,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitSynthetic(Synthetic attribute) + public void visitSynthetic(final Synthetic attribute) { stack.push(attribute); attribute.accept(visitor); @@ -468,7 +468,7 @@ public class DescendingVisitor implements Visitor } @Override - public void visitUnknown(Unknown attribute) + public void visitUnknown(final Unknown attribute) { stack.push(attribute); attribute.accept(visitor); @@ -479,7 +479,7 @@ public class DescendingVisitor implements Visitor * @since 6.0 */ @Override - public void visitAnnotationDefault(AnnotationDefault obj) + public void visitAnnotationDefault(final AnnotationDefault obj) { stack.push(obj); obj.accept(visitor); @@ -490,7 +490,7 @@ public class DescendingVisitor implements Visitor * @since 6.0 */ @Override - public void visitEnclosingMethod(EnclosingMethod obj) + public void visitEnclosingMethod(final EnclosingMethod obj) { stack.push(obj); obj.accept(visitor); @@ -501,7 +501,7 @@ public class DescendingVisitor implements Visitor * @since 6.0 */ @Override - public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) + public void visitLocalVariableTypeTable(final LocalVariableTypeTable obj) { stack.push(obj); obj.accept(visitor); @@ -512,7 +512,7 @@ public class DescendingVisitor implements Visitor * @since 6.0 */ @Override - public void visitParameterAnnotation(ParameterAnnotations obj) + public void visitParameterAnnotation(final ParameterAnnotations obj) { stack.push(obj); obj.accept(visitor); @@ -523,7 +523,7 @@ public class DescendingVisitor implements Visitor * @since 6.0 */ @Override - public void visitMethodParameters(MethodParameters obj) + public void visitMethodParameters(final MethodParameters obj) { stack.push(obj); obj.accept(visitor); @@ -532,7 +532,7 @@ public class DescendingVisitor implements Visitor /** @since 6.0 */ @Override - public void visitConstantMethodType(ConstantMethodType obj) { + public void visitConstantMethodType(final ConstantMethodType obj) { stack.push(obj); obj.accept(visitor); stack.pop(); @@ -540,7 +540,7 @@ public class DescendingVisitor implements Visitor /** @since 6.0 */ @Override - public void visitConstantMethodHandle(ConstantMethodHandle obj) { + public void visitConstantMethodHandle(final ConstantMethodHandle obj) { stack.push(obj); obj.accept(visitor); stack.pop(); @@ -548,7 +548,7 @@ public class DescendingVisitor implements Visitor /** @since 6.0 */ @Override - public void visitParameterAnnotationEntry(ParameterAnnotationEntry obj) { + public void visitParameterAnnotationEntry(final ParameterAnnotationEntry obj) { stack.push(obj); obj.accept(visitor); stack.pop(); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java index 41dd8d65..3a25cb9f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java @@ -45,7 +45,7 @@ public abstract class ElementValue return stringifyValue(); } - protected ElementValue(int type, ConstantPool cpool) + protected ElementValue(final int type, final ConstantPool cpool) { this.type = type; this.cpool = cpool; @@ -74,7 +74,7 @@ public abstract class ElementValue public static final byte PRIMITIVE_SHORT = 'S'; public static final byte PRIMITIVE_BOOLEAN = 'Z'; - public static ElementValue readElementValue(DataInput input, ConstantPool cpool) throws IOException + public static ElementValue readElementValue(final DataInput input, final ConstantPool cpool) throws IOException { byte type = input.readByte(); switch (type) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java b/src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java index d19e7d8c..32678ace 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java @@ -36,8 +36,8 @@ public class ElementValuePair private final int elementNameIndex; - public ElementValuePair(int elementNameIndex, ElementValue elementValue, - ConstantPool constantPool) + public ElementValuePair(final int elementNameIndex, final ElementValue elementValue, + final ConstantPool constantPool) { this.elementValue = elementValue; this.elementNameIndex = elementNameIndex; @@ -69,7 +69,7 @@ public class ElementValuePair return result.toString(); } - protected void dump(DataOutputStream dos) throws IOException { + protected void dump(final DataOutputStream dos) throws IOException { dos.writeShort(elementNameIndex); // u2 name of the element elementValue.dump(dos); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java b/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java index b39c1cee..8e2d5a48 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java @@ -34,7 +34,7 @@ public class EmptyVisitor implements Visitor * @since 6.0 */ @Override - public void visitAnnotation(Annotations obj) + public void visitAnnotation(final Annotations obj) { } @@ -42,7 +42,7 @@ public class EmptyVisitor implements Visitor * @since 6.0 */ @Override - public void visitParameterAnnotation(ParameterAnnotations obj) + public void visitParameterAnnotation(final ParameterAnnotations obj) { } @@ -50,7 +50,7 @@ public class EmptyVisitor implements Visitor * @since 6.0 */ @Override - public void visitAnnotationEntry(AnnotationEntry obj) + public void visitAnnotationEntry(final AnnotationEntry obj) { } @@ -58,112 +58,112 @@ public class EmptyVisitor implements Visitor * @since 6.0 */ @Override - public void visitAnnotationDefault(AnnotationDefault obj) + public void visitAnnotationDefault(final AnnotationDefault obj) { } @Override - public void visitCode(Code obj) + public void visitCode(final Code obj) { } @Override - public void visitCodeException(CodeException obj) + public void visitCodeException(final CodeException obj) { } @Override - public void visitConstantClass(ConstantClass obj) + public void visitConstantClass(final ConstantClass obj) { } @Override - public void visitConstantDouble(ConstantDouble obj) + public void visitConstantDouble(final ConstantDouble obj) { } @Override - public void visitConstantFieldref(ConstantFieldref obj) + public void visitConstantFieldref(final ConstantFieldref obj) { } @Override - public void visitConstantFloat(ConstantFloat obj) + public void visitConstantFloat(final ConstantFloat obj) { } @Override - public void visitConstantInteger(ConstantInteger obj) + public void visitConstantInteger(final ConstantInteger obj) { } @Override - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) + public void visitConstantInterfaceMethodref(final ConstantInterfaceMethodref obj) { } @Override - public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj) + public void visitConstantInvokeDynamic(final ConstantInvokeDynamic obj) { } @Override - public void visitConstantLong(ConstantLong obj) + public void visitConstantLong(final ConstantLong obj) { } @Override - public void visitConstantMethodref(ConstantMethodref obj) + public void visitConstantMethodref(final ConstantMethodref obj) { } @Override - public void visitConstantNameAndType(ConstantNameAndType obj) + public void visitConstantNameAndType(final ConstantNameAndType obj) { } @Override - public void visitConstantPool(ConstantPool obj) + public void visitConstantPool(final ConstantPool obj) { } @Override - public void visitConstantString(ConstantString obj) + public void visitConstantString(final ConstantString obj) { } @Override - public void visitConstantUtf8(ConstantUtf8 obj) + public void visitConstantUtf8(final ConstantUtf8 obj) { } @Override - public void visitConstantValue(ConstantValue obj) + public void visitConstantValue(final ConstantValue obj) { } @Override - public void visitDeprecated(Deprecated obj) + public void visitDeprecated(final Deprecated obj) { } @Override - public void visitExceptionTable(ExceptionTable obj) + public void visitExceptionTable(final ExceptionTable obj) { } @Override - public void visitField(Field obj) + public void visitField(final Field obj) { } @Override - public void visitInnerClass(InnerClass obj) + public void visitInnerClass(final InnerClass obj) { } @Override - public void visitInnerClasses(InnerClasses obj) + public void visitInnerClasses(final InnerClasses obj) { } @@ -171,67 +171,67 @@ public class EmptyVisitor implements Visitor * @since 6.0 */ @Override - public void visitBootstrapMethods(BootstrapMethods obj) + public void visitBootstrapMethods(final BootstrapMethods obj) { } @Override - public void visitJavaClass(JavaClass obj) + public void visitJavaClass(final JavaClass obj) { } @Override - public void visitLineNumber(LineNumber obj) + public void visitLineNumber(final LineNumber obj) { } @Override - public void visitLineNumberTable(LineNumberTable obj) + public void visitLineNumberTable(final LineNumberTable obj) { } @Override - public void visitLocalVariable(LocalVariable obj) + public void visitLocalVariable(final LocalVariable obj) { } @Override - public void visitLocalVariableTable(LocalVariableTable obj) + public void visitLocalVariableTable(final LocalVariableTable obj) { } @Override - public void visitMethod(Method obj) + public void visitMethod(final Method obj) { } @Override - public void visitSignature(Signature obj) + public void visitSignature(final Signature obj) { } @Override - public void visitSourceFile(SourceFile obj) + public void visitSourceFile(final SourceFile obj) { } @Override - public void visitSynthetic(Synthetic obj) + public void visitSynthetic(final Synthetic obj) { } @Override - public void visitUnknown(Unknown obj) + public void visitUnknown(final Unknown obj) { } @Override - public void visitStackMap(StackMap obj) + public void visitStackMap(final StackMap obj) { } @Override - public void visitStackMapEntry(StackMapEntry obj) + public void visitStackMapEntry(final StackMapEntry obj) { } @@ -255,7 +255,7 @@ public class EmptyVisitor implements Visitor * @since 6.0 */ @Override - public void visitEnclosingMethod(EnclosingMethod obj) + public void visitEnclosingMethod(final EnclosingMethod obj) { } @@ -263,7 +263,7 @@ public class EmptyVisitor implements Visitor * @since 6.0 */ @Override - public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) + public void visitLocalVariableTypeTable(final LocalVariableTypeTable obj) { } @@ -271,7 +271,7 @@ public class EmptyVisitor implements Visitor * @since 6.0 */ @Override - public void visitMethodParameters(MethodParameters obj) + public void visitMethodParameters(final MethodParameters obj) { } @@ -279,7 +279,7 @@ public class EmptyVisitor implements Visitor * @since 6.0 */ @Override - public void visitConstantMethodType(ConstantMethodType obj) + public void visitConstantMethodType(final ConstantMethodType obj) { } @@ -287,13 +287,13 @@ public class EmptyVisitor implements Visitor * @since 6.0 */ @Override - public void visitConstantMethodHandle(ConstantMethodHandle constantMethodHandle) { + public void visitConstantMethodHandle(final ConstantMethodHandle constantMethodHandle) { } /** * @since 6.0 */ @Override - public void visitParameterAnnotationEntry(ParameterAnnotationEntry parameterAnnotationEntry) { + public void visitParameterAnnotationEntry(final ParameterAnnotationEntry parameterAnnotationEntry) { } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java index 630a1596..0674b2a6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java @@ -45,23 +45,23 @@ public class EnclosingMethod extends Attribute { private int methodIndex; // Ctors - and code to read an attribute in. - EnclosingMethod(int nameIndex, int len, DataInput input, ConstantPool cpool) throws IOException { + EnclosingMethod(final int nameIndex, final int len, final DataInput input, final ConstantPool cpool) throws IOException { this(nameIndex, len, input.readUnsignedShort(), input.readUnsignedShort(), cpool); } - private EnclosingMethod(int nameIndex, int len, int classIdx,int methodIdx, ConstantPool cpool) { + private EnclosingMethod(final int nameIndex, final int len, final int classIdx,final int methodIdx, final ConstantPool cpool) { super(Const.ATTR_ENCLOSING_METHOD, nameIndex, len, cpool); classIndex = classIdx; methodIndex = methodIdx; } @Override - public void accept(Visitor v) { + public void accept(final Visitor v) { v.visitEnclosingMethod(this); } @Override - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(final ConstantPool constant_pool) { return (Attribute) clone(); } @@ -69,8 +69,8 @@ public class EnclosingMethod extends Attribute { public final int getEnclosingClassIndex() { return classIndex; } public final int getEnclosingMethodIndex(){ return methodIndex;} - public final void setEnclosingClassIndex(int idx) {classIndex = idx;} - public final void setEnclosingMethodIndex(int idx){methodIndex= idx;} + public final void setEnclosingClassIndex(final int idx) {classIndex = idx;} + public final void setEnclosingMethodIndex(final int idx){methodIndex= idx;} public final ConstantClass getEnclosingClass() { ConstantClass c = @@ -88,7 +88,7 @@ public class EnclosingMethod extends Attribute { } @Override - public final void dump(DataOutputStream file) throws IOException { + public final void dump(final DataOutputStream file) throws IOException { super.dump(file); file.writeShort(classIndex); file.writeShort(methodIndex); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EnumElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/EnumElementValue.java index 3db6dee9..4c3eb632 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/EnumElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/EnumElementValue.java @@ -32,8 +32,8 @@ public class EnumElementValue extends ElementValue private final int valueIdx; - public EnumElementValue(int type, int typeIdx, int valueIdx, - ConstantPool cpool) + public EnumElementValue(final int type, final int typeIdx, final int valueIdx, + final ConstantPool cpool) { super(type, cpool); if (type != ENUM_CONSTANT) { @@ -45,7 +45,7 @@ public class EnumElementValue extends ElementValue } @Override - public void dump(DataOutputStream dos) throws IOException + public void dump(final DataOutputStream dos) throws IOException { dos.writeByte(super.getType()); // u1 type of value (ENUM_CONSTANT == 'e') dos.writeShort(typeIdx); // u2 diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java index 647e5a26..fa095ba8 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java @@ -43,7 +43,7 @@ public final class ExceptionTable extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use copy() for a physical copy. */ - public ExceptionTable(ExceptionTable c) { + public ExceptionTable(final ExceptionTable c) { this(c.getNameIndex(), c.getLength(), c.getExceptionIndexTable(), c.getConstantPool()); } @@ -54,8 +54,8 @@ public final class ExceptionTable extends Attribute { * @param exception_index_table Table of indices in constant pool * @param constant_pool Array of constants */ - public ExceptionTable(int name_index, int length, int[] exception_index_table, - ConstantPool constant_pool) { + public ExceptionTable(final int name_index, final int length, final int[] exception_index_table, + final ConstantPool constant_pool) { super(Const.ATTR_EXCEPTIONS, name_index, length, constant_pool); this.exception_index_table = exception_index_table != null ? exception_index_table : new int[0]; } @@ -69,7 +69,7 @@ public final class ExceptionTable extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - ExceptionTable(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { + ExceptionTable(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (int[]) null, constant_pool); int number_of_exceptions = input.readUnsignedShort(); exception_index_table = new int[number_of_exceptions]; @@ -87,7 +87,7 @@ public final class ExceptionTable extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionTable(this); } @@ -99,7 +99,7 @@ public final class ExceptionTable extends Attribute { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(exception_index_table.length); for (int index : exception_index_table) { @@ -141,7 +141,7 @@ public final class ExceptionTable extends Attribute { * @param exception_index_table the list of exception indexes * Also redefines number_of_exceptions according to table length. */ - public final void setExceptionIndexTable( int[] exception_index_table ) { + public final void setExceptionIndexTable( final int[] exception_index_table ) { this.exception_index_table = exception_index_table != null ? exception_index_table : new int[0]; } @@ -169,7 +169,7 @@ public final class ExceptionTable extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { ExceptionTable c = (ExceptionTable) clone(); if (exception_index_table != null) { c.exception_index_table = new int[exception_index_table.length]; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Field.java b/src/main/java/org/apache/commons/bcel6/classfile/Field.java index 0c81cb73..03cabe69 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Field.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Field.java @@ -35,7 +35,7 @@ public final class Field extends FieldOrMethod { private static BCELComparator _cmp = new BCELComparator() { @Override - public boolean equals( Object o1, Object o2 ) { + public boolean equals( final Object o1, final Object o2 ) { Field THIS = (Field) o1; Field THAT = (Field) o2; return THIS.getName().equals(THAT.getName()) @@ -44,7 +44,7 @@ public final class Field extends FieldOrMethod { @Override - public int hashCode( Object o ) { + public int hashCode( final Object o ) { Field THIS = (Field) o; return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); } @@ -55,7 +55,7 @@ public final class Field extends FieldOrMethod { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use clone() for a physical copy. */ - public Field(Field c) { + public Field(final Field c) { super(c); } @@ -64,7 +64,7 @@ public final class Field extends FieldOrMethod { * Construct object from file stream. * @param file Input stream */ - Field(DataInput file, ConstantPool constant_pool) throws IOException, + Field(final DataInput file, final ConstantPool constant_pool) throws IOException, ClassFormatException { super(file, constant_pool); } @@ -77,8 +77,8 @@ public final class Field extends FieldOrMethod { * @param attributes Collection of attributes * @param constant_pool Array of constants */ - public Field(int access_flags, int name_index, int signature_index, Attribute[] attributes, - ConstantPool constant_pool) { + public Field(final int access_flags, final int name_index, final int signature_index, final Attribute[] attributes, + final ConstantPool constant_pool) { super(access_flags, name_index, signature_index, attributes, constant_pool); } @@ -91,7 +91,7 @@ public final class Field extends FieldOrMethod { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitField(this); } @@ -144,7 +144,7 @@ public final class Field extends FieldOrMethod { /** * @return deep copy of this field */ - public final Field copy( ConstantPool _constant_pool ) { + public final Field copy( final ConstantPool _constant_pool ) { return (Field) copy_(_constant_pool); } @@ -168,7 +168,7 @@ public final class Field extends FieldOrMethod { /** * @param comparator Comparison strategy object */ - public static void setComparator( BCELComparator comparator ) { + public static void setComparator( final BCELComparator comparator ) { _cmp = comparator; } @@ -181,7 +181,7 @@ public final class Field extends FieldOrMethod { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals( Object obj ) { + public boolean equals( final Object obj ) { return _cmp.equals(this, obj); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java index 6b84a363..1bddc60b 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java @@ -75,7 +75,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * Initialize from another object. Note that both objects use the same * references (shallow copy). Use clone() for a physical copy. */ - protected FieldOrMethod(FieldOrMethod c) { + protected FieldOrMethod(final FieldOrMethod c) { this(c.getAccessFlags(), c.getNameIndex(), c.getSignatureIndex(), c.getAttributes(), c .getConstantPool()); } @@ -88,7 +88,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * @throws ClassFormatException * @deprecated Use {@link #FieldOrMethod(java.io.DataInput, ConstantPool)} instead. */ - protected FieldOrMethod(DataInputStream file, ConstantPool constant_pool) throws IOException, + protected FieldOrMethod(final DataInputStream file, final ConstantPool constant_pool) throws IOException, ClassFormatException { this((DataInput) file, constant_pool); } @@ -99,7 +99,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * @throws IOException * @throws ClassFormatException */ - protected FieldOrMethod(DataInput file, ConstantPool constant_pool) throws IOException, ClassFormatException { + protected FieldOrMethod(final DataInput file, final ConstantPool constant_pool) throws IOException, ClassFormatException { this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), null, constant_pool); int attributes_count = file.readUnsignedShort(); @@ -118,8 +118,8 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * @param attributes Collection of attributes * @param constant_pool Array of constants */ - protected FieldOrMethod(int access_flags, int name_index, int signature_index, - Attribute[] attributes, ConstantPool constant_pool) { + protected FieldOrMethod(final int access_flags, final int name_index, final int signature_index, + final Attribute[] attributes, final ConstantPool constant_pool) { super(access_flags); this.name_index = name_index; this.signature_index = signature_index; @@ -134,7 +134,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * @param file Output file stream * @throws IOException */ - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeShort(super.getAccessFlags()); file.writeShort(name_index); file.writeShort(signature_index); @@ -156,7 +156,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No /** * @param attributes Collection of object attributes. */ - public final void setAttributes( Attribute[] attributes ) { + public final void setAttributes( final Attribute[] attributes ) { this.attributes = attributes; this.attributes_count = attributes != null ? attributes.length : 0; // init deprecated field } @@ -173,7 +173,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No /** * @param constant_pool Constant pool to be used for this object. */ - public final void setConstantPool( ConstantPool constant_pool ) { + public final void setConstantPool( final ConstantPool constant_pool ) { this.constant_pool = constant_pool; } @@ -189,7 +189,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No /** * @param name_index Index in constant pool of object's name. */ - public final void setNameIndex( int name_index ) { + public final void setNameIndex( final int name_index ) { this.name_index = name_index; } @@ -205,7 +205,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No /** * @param signature_index Index in constant pool of field signature. */ - public final void setSignatureIndex( int signature_index ) { + public final void setSignatureIndex( final int signature_index ) { this.signature_index = signature_index; } @@ -233,7 +233,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No /** * @return deep copy of this field */ - protected FieldOrMethod copy_( ConstantPool _constant_pool ) { + protected FieldOrMethod copy_( final ConstantPool _constant_pool ) { FieldOrMethod c = null; try { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java index 3e2c5922..17b08c73 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java @@ -42,7 +42,7 @@ public final class InnerClass implements Cloneable, Node { /** * Initialize from another object. */ - public InnerClass(InnerClass c) { + public InnerClass(final InnerClass c) { this(c.getInnerClassIndex(), c.getOuterClassIndex(), c.getInnerNameIndex(), c .getInnerAccessFlags()); } @@ -53,7 +53,7 @@ public final class InnerClass implements Cloneable, Node { * @param file Input stream * @throws IOException */ - InnerClass(DataInput file) throws IOException { + InnerClass(final DataInput file) throws IOException { this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), file .readUnsignedShort()); } @@ -65,8 +65,8 @@ public final class InnerClass implements Cloneable, Node { * @param inner_name_index Name index in constant pool of inner class * @param inner_access_flags Access flags of inner class */ - public InnerClass(int inner_class_index, int outer_class_index, int inner_name_index, - int inner_access_flags) { + public InnerClass(final int inner_class_index, final int outer_class_index, final int inner_name_index, + final int inner_access_flags) { this.inner_class_index = inner_class_index; this.outer_class_index = outer_class_index; this.inner_name_index = inner_name_index; @@ -82,7 +82,7 @@ public final class InnerClass implements Cloneable, Node { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitInnerClass(this); } @@ -93,7 +93,7 @@ public final class InnerClass implements Cloneable, Node { * @param file Output file stream * @throws IOException */ - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeShort(inner_class_index); file.writeShort(outer_class_index); file.writeShort(inner_name_index); @@ -136,7 +136,7 @@ public final class InnerClass implements Cloneable, Node { /** * @param inner_access_flags access flags for this inner class */ - public final void setInnerAccessFlags( int inner_access_flags ) { + public final void setInnerAccessFlags( final int inner_access_flags ) { this.inner_access_flags = inner_access_flags; } @@ -144,7 +144,7 @@ public final class InnerClass implements Cloneable, Node { /** * @param inner_class_index index into the constant pool for this class */ - public final void setInnerClassIndex( int inner_class_index ) { + public final void setInnerClassIndex( final int inner_class_index ) { this.inner_class_index = inner_class_index; } @@ -152,7 +152,7 @@ public final class InnerClass implements Cloneable, Node { /** * @param inner_name_index index into the constant pool for this class's name */ - public final void setInnerNameIndex( int inner_name_index ) { // TODO unused + public final void setInnerNameIndex( final int inner_name_index ) { // TODO unused this.inner_name_index = inner_name_index; } @@ -160,7 +160,7 @@ public final class InnerClass implements Cloneable, Node { /** * @param outer_class_index index into the constant pool for the owning class */ - public final void setOuterClassIndex( int outer_class_index ) { // TODO unused + public final void setOuterClassIndex( final int outer_class_index ) { // TODO unused this.outer_class_index = outer_class_index; } @@ -178,7 +178,7 @@ public final class InnerClass implements Cloneable, Node { /** * @return Resolved string representation */ - public final String toString( ConstantPool constant_pool ) { + public final String toString( final ConstantPool constant_pool ) { String outer_class_name; String inner_name; String inner_class_name = constant_pool.getConstantString(inner_class_index, diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java index 6722f135..cdc4caf4 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java @@ -41,7 +41,7 @@ public final class InnerClasses extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use clone() for a physical copy. */ - public InnerClasses(InnerClasses c) { + public InnerClasses(final InnerClasses c) { this(c.getNameIndex(), c.getLength(), c.getInnerClasses(), c.getConstantPool()); } @@ -52,8 +52,8 @@ public final class InnerClasses extends Attribute { * @param inner_classes array of inner classes attributes * @param constant_pool Array of constants */ - public InnerClasses(int name_index, int length, InnerClass[] inner_classes, - ConstantPool constant_pool) { + public InnerClasses(final int name_index, final int length, final InnerClass[] inner_classes, + final ConstantPool constant_pool) { super(Const.ATTR_INNER_CLASSES, name_index, length, constant_pool); this.inner_classes = inner_classes != null ? inner_classes : new InnerClass[0]; } @@ -68,7 +68,7 @@ public final class InnerClasses extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - InnerClasses(int name_index, int length, DataInput input, ConstantPool constant_pool) + InnerClasses(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (InnerClass[]) null, constant_pool); int number_of_classes = input.readUnsignedShort(); @@ -87,7 +87,7 @@ public final class InnerClasses extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitInnerClasses(this); } @@ -99,7 +99,7 @@ public final class InnerClasses extends Attribute { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(inner_classes.length); for (InnerClass inner_class : inner_classes) { @@ -119,7 +119,7 @@ public final class InnerClasses extends Attribute { /** * @param inner_classes the array of inner classes */ - public final void setInnerClasses( InnerClass[] inner_classes ) { + public final void setInnerClasses( final InnerClass[] inner_classes ) { this.inner_classes = inner_classes != null ? inner_classes : new InnerClass[0]; } @@ -144,7 +144,7 @@ public final class InnerClasses extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { // TODO this could be recoded to use a lower level constructor after creating a copy of the inner classes InnerClasses c = (InnerClasses) clone(); c.inner_classes = new InnerClass[inner_classes.length]; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index c9a7ef2b..92b44ddd 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -76,7 +76,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl private static BCELComparator _cmp = new BCELComparator() { @Override - public boolean equals( Object o1, Object o2 ) { + public boolean equals( final Object o1, final Object o2 ) { JavaClass THIS = (JavaClass) o1; JavaClass THAT = (JavaClass) o2; return THIS.getClassName().equals(THAT.getClassName()); @@ -84,7 +84,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl @Override - public int hashCode( Object o ) { + public int hashCode( final Object o ) { JavaClass THIS = (JavaClass) o; return THIS.getClassName().hashCode(); } @@ -116,9 +116,9 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @param attributes Class attributes * @param source Read from file or generated in memory? */ - public JavaClass(int class_name_index, int superclass_name_index, String file_name, int major, - int minor, int access_flags, ConstantPool constant_pool, int[] interfaces, - Field[] fields, Method[] methods, Attribute[] attributes, byte source) { + public JavaClass(final int class_name_index, final int superclass_name_index, final String file_name, final int major, + final int minor, final int access_flags, final ConstantPool constant_pool, int[] interfaces, + Field[] fields, Method[] methods, Attribute[] attributes, final byte source) { super(access_flags); if (interfaces == null) { interfaces = new int[0]; @@ -193,9 +193,9 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @param methods Class methods * @param attributes Class attributes */ - public JavaClass(int class_name_index, int superclass_name_index, String file_name, int major, - int minor, int access_flags, ConstantPool constant_pool, int[] interfaces, - Field[] fields, Method[] methods, Attribute[] attributes) { + public JavaClass(final int class_name_index, final int superclass_name_index, final String file_name, final int major, + final int minor, final int access_flags, final ConstantPool constant_pool, final int[] interfaces, + final Field[] fields, final Method[] methods, final Attribute[] attributes) { this(class_name_index, superclass_name_index, file_name, major, minor, access_flags, constant_pool, interfaces, fields, methods, attributes, HEAP); } @@ -209,14 +209,14 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitJavaClass(this); } /* Print debug information depending on `JavaClass.debug' */ - static void Debug( String str ) { + static void Debug( final String str ) { if (debug) { System.out.println(str); } @@ -229,7 +229,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @param file Output file * @throws IOException */ - public void dump( File file ) throws IOException { + public void dump( final File file ) throws IOException { String parent = file.getParent(); if (parent != null) { File dir = new File(parent); @@ -257,7 +257,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @param _file_name Output file name * @exception IOException */ - public void dump( String _file_name ) throws IOException { + public void dump( final String _file_name ) throws IOException { dump(new File(_file_name)); } @@ -289,7 +289,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @param file Output stream * @exception IOException */ - public void dump( OutputStream file ) throws IOException { + public void dump( final OutputStream file ) throws IOException { dump(new DataOutputStream(file)); } @@ -300,7 +300,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @param file Output stream * @exception IOException */ - public void dump( DataOutputStream file ) throws IOException { + public void dump( final DataOutputStream file ) throws IOException { file.writeInt(Const.JVM_CLASSFILE_MAGIC); file.writeShort(minor); file.writeShort(major); @@ -437,7 +437,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @return A {@link Method} corresponding to * java.lang.reflect.Method if any */ - public Method getMethod( java.lang.reflect.Method m ) { + public Method getMethod( final java.lang.reflect.Method m ) { for (Method method : methods) { if (m.getName().equals(method.getName()) && (m.getModifiers() == method.getModifiers()) && Type.getSignature(m).equals(method.getSignature())) { @@ -486,7 +486,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param attributes . */ - public void setAttributes( Attribute[] attributes ) { + public void setAttributes( final Attribute[] attributes ) { this.attributes = attributes; } @@ -494,7 +494,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param class_name . */ - public void setClassName( String class_name ) { + public void setClassName( final String class_name ) { this.class_name = class_name; } @@ -502,7 +502,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param class_name_index . */ - public void setClassNameIndex( int class_name_index ) { + public void setClassNameIndex( final int class_name_index ) { this.class_name_index = class_name_index; } @@ -510,7 +510,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param constant_pool . */ - public void setConstantPool( ConstantPool constant_pool ) { + public void setConstantPool( final ConstantPool constant_pool ) { this.constant_pool = constant_pool; } @@ -518,7 +518,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param fields . */ - public void setFields( Field[] fields ) { + public void setFields( final Field[] fields ) { this.fields = fields; } @@ -526,7 +526,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * Set File name of class, aka SourceFile attribute value */ - public void setFileName( String file_name ) { + public void setFileName( final String file_name ) { this.file_name = file_name; } @@ -534,7 +534,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param interface_names . */ - public void setInterfaceNames( String[] interface_names ) { + public void setInterfaceNames( final String[] interface_names ) { this.interface_names = interface_names; } @@ -542,7 +542,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param interfaces . */ - public void setInterfaces( int[] interfaces ) { + public void setInterfaces( final int[] interfaces ) { this.interfaces = interfaces; } @@ -550,7 +550,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param major . */ - public void setMajor( int major ) { + public void setMajor( final int major ) { this.major = major; } @@ -558,7 +558,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param methods . */ - public void setMethods( Method[] methods ) { + public void setMethods( final Method[] methods ) { this.methods = methods; } @@ -566,7 +566,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param minor . */ - public void setMinor( int minor ) { + public void setMinor( final int minor ) { this.minor = minor; } @@ -574,7 +574,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * Set absolute path to file this class was read from. */ - public void setSourceFileName( String source_file_name ) { + public void setSourceFileName( final String source_file_name ) { this.source_file_name = source_file_name; } @@ -582,7 +582,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param superclass_name . */ - public void setSuperclassName( String superclass_name ) { + public void setSuperclassName( final String superclass_name ) { this.superclass_name = superclass_name; } @@ -590,7 +590,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param superclass_name_index . */ - public void setSuperclassNameIndex( int superclass_name_index ) { + public void setSuperclassNameIndex( final int superclass_name_index ) { this.superclass_name_index = superclass_name_index; } @@ -652,7 +652,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl } - private static String indent( Object obj ) { + private static String indent( final Object obj ) { StringTokenizer tok = new StringTokenizer(obj.toString(), "\n"); StringBuilder buf = new StringBuilder(); while (tok.hasMoreTokens()) { @@ -765,7 +765,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * Sets the ClassRepository which loaded the JavaClass. * Should be called immediately after parsing is done. */ - public void setRepository( org.apache.commons.bcel6.util.Repository repository ) { // TODO make protected? + public void setRepository( final org.apache.commons.bcel6.util.Repository repository ) { // TODO make protected? this.repository = repository; } @@ -776,7 +776,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @throws ClassNotFoundException if superclasses or superinterfaces * of this object can't be found */ - public final boolean instanceOf( JavaClass super_class ) throws ClassNotFoundException { + public final boolean instanceOf( final JavaClass super_class ) throws ClassNotFoundException { if (this.equals(super_class)) { return true; } @@ -798,7 +798,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @throws ClassNotFoundException if superclasses or superinterfaces * of this class can't be found */ - public boolean implementationOf( JavaClass inter ) throws ClassNotFoundException { + public boolean implementationOf( final JavaClass inter ) throws ClassNotFoundException { if (!inter.isInterface()) { throw new IllegalArgumentException(inter.getClassName() + " is no interface"); } @@ -893,7 +893,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl /** * @param comparator Comparison strategy object */ - public static void setComparator( BCELComparator comparator ) { + public static void setComparator( final BCELComparator comparator ) { _cmp = comparator; } @@ -906,7 +906,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals( Object obj ) { + public boolean equals( final Object obj ) { return _cmp.equals(this, obj); } @@ -917,7 +917,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @since 6.0 */ @Override - public int compareTo( JavaClass obj ) { + public int compareTo( final JavaClass obj ) { return getClassName().compareTo(obj.getClassName()); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java index 3a75b6e2..257f8654 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java @@ -42,7 +42,7 @@ public final class LineNumber implements Cloneable, Node { * * @param c the object to copy */ - public LineNumber(LineNumber c) { + public LineNumber(final LineNumber c) { this(c.getStartPC(), c.getLineNumber()); } @@ -53,7 +53,7 @@ public final class LineNumber implements Cloneable, Node { * @param file Input stream * @throws IOEXception if an I/O Exception occurs in readUnsignedShort */ - LineNumber(DataInput file) throws IOException { + LineNumber(final DataInput file) throws IOException { this(file.readUnsignedShort(), file.readUnsignedShort()); } @@ -62,7 +62,7 @@ public final class LineNumber implements Cloneable, Node { * @param start_pc Program Counter (PC) corresponds to * @param line_number line number in source file */ - public LineNumber(int start_pc, int line_number) { + public LineNumber(final int start_pc, final int line_number) { this.start_pc = (short) start_pc; this.line_number = (short)line_number; } @@ -76,7 +76,7 @@ public final class LineNumber implements Cloneable, Node { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitLineNumber(this); } @@ -87,7 +87,7 @@ public final class LineNumber implements Cloneable, Node { * @param file Output file stream * @throws IOEXception if an I/O Exception occurs in writeShort */ - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeShort(start_pc); file.writeShort(line_number); } @@ -112,7 +112,7 @@ public final class LineNumber implements Cloneable, Node { /** * @param line_number the source line number */ - public final void setLineNumber( int line_number ) { + public final void setLineNumber( final int line_number ) { this.line_number = (short) line_number; } @@ -120,7 +120,7 @@ public final class LineNumber implements Cloneable, Node { /** * @param start_pc the pc for this line number */ - public final void setStartPC( int start_pc ) { + public final void setStartPC( final int start_pc ) { this.start_pc = (short) start_pc; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java index a7fc16a0..e45faffe 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java @@ -42,7 +42,7 @@ public final class LineNumberTable extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use copy() for a physical copy. */ - public LineNumberTable(LineNumberTable c) { + public LineNumberTable(final LineNumberTable c) { this(c.getNameIndex(), c.getLength(), c.getLineNumberTable(), c.getConstantPool()); } @@ -53,8 +53,8 @@ public final class LineNumberTable extends Attribute { * @param line_number_table Table of line/numbers pairs * @param constant_pool Array of constants */ - public LineNumberTable(int name_index, int length, LineNumber[] line_number_table, - ConstantPool constant_pool) { + public LineNumberTable(final int name_index, final int length, final LineNumber[] line_number_table, + final ConstantPool constant_pool) { super(Const.ATTR_LINE_NUMBER_TABLE, name_index, length, constant_pool); this.line_number_table = line_number_table; } @@ -68,7 +68,7 @@ public final class LineNumberTable extends Attribute { * @param constant_pool Array of constants * @throws IOEXception if an I/O Exception occurs in readUnsignedShort */ - LineNumberTable(int name_index, int length, DataInput input, ConstantPool constant_pool) + LineNumberTable(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (LineNumber[]) null, constant_pool); int line_number_table_length = input.readUnsignedShort(); @@ -87,7 +87,7 @@ public final class LineNumberTable extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitLineNumberTable(this); } @@ -99,7 +99,7 @@ public final class LineNumberTable extends Attribute { * @throws IOEXception if an I/O Exception occurs in writeShort */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(line_number_table.length); for (LineNumber lineNumber : line_number_table) { @@ -119,7 +119,7 @@ public final class LineNumberTable extends Attribute { /** * @param line_number_table the line number entries for this table */ - public final void setLineNumberTable( LineNumber[] line_number_table ) { + public final void setLineNumberTable( final LineNumber[] line_number_table ) { this.line_number_table = line_number_table; } @@ -154,7 +154,7 @@ public final class LineNumberTable extends Attribute { * @param pos byte code offset * @return corresponding line in source code */ - public int getSourceLine( int pos ) { + public int getSourceLine( final int pos ) { int l = 0; int r = line_number_table.length - 1; if (r < 0) { @@ -197,7 +197,7 @@ public final class LineNumberTable extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { // TODO could use the lower level constructor and thereby allow // line_number_table to be made final LineNumberTable c = (LineNumberTable) clone(); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java index 67e6f7c4..4ccde3fc 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java @@ -46,7 +46,7 @@ public final class LocalVariable implements Cloneable, Node { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use copy() for a physical copy. */ - public LocalVariable(LocalVariable c) { + public LocalVariable(final LocalVariable c) { this(c.getStartPC(), c.getLength(), c.getNameIndex(), c.getSignatureIndex(), c.getIndex(), c.getConstantPool()); } @@ -57,7 +57,7 @@ public final class LocalVariable implements Cloneable, Node { * @param file Input stream * @throws IOException */ - LocalVariable(DataInput file, ConstantPool constant_pool) throws IOException { + LocalVariable(final DataInput file, final ConstantPool constant_pool) throws IOException { this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), file .readUnsignedShort(), file.readUnsignedShort(), constant_pool); } @@ -71,8 +71,8 @@ public final class LocalVariable implements Cloneable, Node { * @param index Variable is `index'th local variable on the method's frame * @param constant_pool Array of constants */ - public LocalVariable(int start_pc, int length, int name_index, int signature_index, int index, - ConstantPool constant_pool) { + public LocalVariable(final int start_pc, final int length, final int name_index, final int signature_index, final int index, + final ConstantPool constant_pool) { this.start_pc = start_pc; this.length = length; this.name_index = name_index; @@ -90,7 +90,7 @@ public final class LocalVariable implements Cloneable, Node { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitLocalVariable(this); } @@ -101,7 +101,7 @@ public final class LocalVariable implements Cloneable, Node { * @param file Output file stream * @throws IOException */ - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeShort(start_pc); file.writeShort(length); file.writeShort(name_index); @@ -181,7 +181,7 @@ public final class LocalVariable implements Cloneable, Node { /* * Helper method shared with LocalVariableTypeTable */ - final String toStringShared( boolean typeTable ) { + final String toStringShared( final boolean typeTable ) { String name = getName(); String signature = Utility.signatureToString(getSignature(), false); String label = "LocalVariable" + (typeTable ? "Types" : "" ); @@ -193,7 +193,7 @@ public final class LocalVariable implements Cloneable, Node { /** * @param constant_pool Constant pool to be used for this object. */ - public final void setConstantPool( ConstantPool constant_pool ) { + public final void setConstantPool( final ConstantPool constant_pool ) { this.constant_pool = constant_pool; } @@ -201,7 +201,7 @@ public final class LocalVariable implements Cloneable, Node { /** * @param length the length of this local variable */ - public final void setLength( int length ) { + public final void setLength( final int length ) { this.length = length; } @@ -209,7 +209,7 @@ public final class LocalVariable implements Cloneable, Node { /** * @param name_index the index into the constant pool for the name of this variable */ - public final void setNameIndex( int name_index ) { // TODO unused + public final void setNameIndex( final int name_index ) { // TODO unused this.name_index = name_index; } @@ -217,7 +217,7 @@ public final class LocalVariable implements Cloneable, Node { /** * @param signature_index the index into the constant pool for the signature of this variable */ - public final void setSignatureIndex( int signature_index ) { // TODO unused + public final void setSignatureIndex( final int signature_index ) { // TODO unused this.signature_index = signature_index; } @@ -225,7 +225,7 @@ public final class LocalVariable implements Cloneable, Node { /** * @param index the index in the local variable table of this variable */ - public final void setIndex( int index ) { // TODO unused + public final void setIndex( final int index ) { // TODO unused this.index = index; } @@ -233,7 +233,7 @@ public final class LocalVariable implements Cloneable, Node { /** * @param start_pc Specify range where the local variable is valid. */ - public final void setStartPC( int start_pc ) { // TODO unused + public final void setStartPC( final int start_pc ) { // TODO unused this.start_pc = start_pc; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java index 2d490243..093b2a84 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java @@ -40,7 +40,7 @@ public class LocalVariableTable extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use copy() for a physical copy. */ - public LocalVariableTable(LocalVariableTable c) { + public LocalVariableTable(final LocalVariableTable c) { this(c.getNameIndex(), c.getLength(), c.getLocalVariableTable(), c.getConstantPool()); } @@ -51,8 +51,8 @@ public class LocalVariableTable extends Attribute { * @param local_variable_table Table of local variables * @param constant_pool Array of constants */ - public LocalVariableTable(int name_index, int length, LocalVariable[] local_variable_table, - ConstantPool constant_pool) { + public LocalVariableTable(final int name_index, final int length, final LocalVariable[] local_variable_table, + final ConstantPool constant_pool) { super(Const.ATTR_LOCAL_VARIABLE_TABLE, name_index, length, constant_pool); this.local_variable_table = local_variable_table; } @@ -66,7 +66,7 @@ public class LocalVariableTable extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - LocalVariableTable(int name_index, int length, DataInput input, ConstantPool constant_pool) + LocalVariableTable(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (LocalVariable[]) null, constant_pool); int local_variable_table_length = input.readUnsignedShort(); @@ -85,7 +85,7 @@ public class LocalVariableTable extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitLocalVariableTable(this); } @@ -97,7 +97,7 @@ public class LocalVariableTable extends Attribute { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(local_variable_table.length); for (LocalVariable variable : local_variable_table) { @@ -124,7 +124,7 @@ public class LocalVariableTable extends Attribute { * same slot, use getLocalVariable(int index, int pc) instead. */ @java.lang.Deprecated - public final LocalVariable getLocalVariable( int index ) { + public final LocalVariable getLocalVariable( final int index ) { for (LocalVariable variable : local_variable_table) { if (variable.getIndex() == index) { return variable; @@ -141,7 +141,7 @@ public class LocalVariableTable extends Attribute { * * @return the LocalVariable that matches or null if not found */ - public final LocalVariable getLocalVariable( int index, int pc ) { + public final LocalVariable getLocalVariable( final int index, final int pc ) { for (LocalVariable variable : local_variable_table) { if (variable.getIndex() == index) { int start_pc = variable.getStartPC(); @@ -155,7 +155,7 @@ public class LocalVariableTable extends Attribute { } - public final void setLocalVariableTable( LocalVariable[] local_variable_table ) { + public final void setLocalVariableTable( final LocalVariable[] local_variable_table ) { this.local_variable_table = local_variable_table; } @@ -180,7 +180,7 @@ public class LocalVariableTable extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { LocalVariableTable c = (LocalVariableTable) clone(); c.local_variable_table = new LocalVariable[local_variable_table.length]; for (int i = 0; i < local_variable_table.length; i++) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java index 6df1718d..09a964e3 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java @@ -58,16 +58,16 @@ public class LocalVariableTypeTable extends Attribute { private LocalVariable[] local_variable_type_table; // variables - public LocalVariableTypeTable(LocalVariableTypeTable c) { + public LocalVariableTypeTable(final LocalVariableTypeTable c) { this(c.getNameIndex(), c.getLength(), c.getLocalVariableTypeTable(), c.getConstantPool()); } - public LocalVariableTypeTable(int name_index, int length, LocalVariable[] local_variable_table, ConstantPool constant_pool) { + public LocalVariableTypeTable(final int name_index, final int length, final LocalVariable[] local_variable_table, final ConstantPool constant_pool) { super(Const.ATTR_LOCAL_VARIABLE_TYPE_TABLE, name_index, length, constant_pool); this.local_variable_type_table = local_variable_table; } - LocalVariableTypeTable(int nameIdx, int len, DataInput input, ConstantPool cpool) throws IOException { + LocalVariableTypeTable(final int nameIdx, final int len, final DataInput input, final ConstantPool cpool) throws IOException { this(nameIdx, len, (LocalVariable[]) null, cpool); int local_variable_type_table_length = input.readUnsignedShort(); @@ -79,12 +79,12 @@ public class LocalVariableTypeTable extends Attribute { } @Override - public void accept(Visitor v) { + public void accept(final Visitor v) { v.visitLocalVariableTypeTable(this); } @Override - public final void dump(DataOutputStream file) throws IOException { + public final void dump(final DataOutputStream file) throws IOException { super.dump(file); file.writeShort(local_variable_type_table.length); for (LocalVariable variable : local_variable_type_table) { @@ -96,7 +96,7 @@ public class LocalVariableTypeTable extends Attribute { return local_variable_type_table; } - public final LocalVariable getLocalVariable(int index) { + public final LocalVariable getLocalVariable(final int index) { for (LocalVariable variable : local_variable_type_table) { if (variable.getIndex() == index) { return variable; @@ -106,7 +106,7 @@ public class LocalVariableTypeTable extends Attribute { return null; } - public final void setLocalVariableTable(LocalVariable[] local_variable_table) { + public final void setLocalVariableTable(final LocalVariable[] local_variable_table) { this.local_variable_type_table = local_variable_table; } @@ -132,7 +132,7 @@ public class LocalVariableTypeTable extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy(ConstantPool constant_pool) { + public Attribute copy(final ConstantPool constant_pool) { LocalVariableTypeTable c = (LocalVariableTypeTable) clone(); c.local_variable_type_table = new LocalVariable[local_variable_type_table.length]; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Method.java b/src/main/java/org/apache/commons/bcel6/classfile/Method.java index fd3e44fd..bef8fa4f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Method.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Method.java @@ -36,7 +36,7 @@ public final class Method extends FieldOrMethod { private static BCELComparator _cmp = new BCELComparator() { @Override - public boolean equals( Object o1, Object o2 ) { + public boolean equals( final Object o1, final Object o2 ) { Method THIS = (Method) o1; Method THAT = (Method) o2; return THIS.getName().equals(THAT.getName()) @@ -45,7 +45,7 @@ public final class Method extends FieldOrMethod { @Override - public int hashCode( Object o ) { + public int hashCode( final Object o ) { Method THIS = (Method) o; return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); } @@ -66,7 +66,7 @@ public final class Method extends FieldOrMethod { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use clone() for a physical copy. */ - public Method(Method c) { + public Method(final Method c) { super(c); } @@ -77,7 +77,7 @@ public final class Method extends FieldOrMethod { * @throws IOException * @throws ClassFormatException */ - Method(DataInput file, ConstantPool constant_pool) throws IOException, + Method(final DataInput file, final ConstantPool constant_pool) throws IOException, ClassFormatException { super(file, constant_pool); } @@ -90,8 +90,8 @@ public final class Method extends FieldOrMethod { * @param attributes Collection of attributes * @param constant_pool Array of constants */ - public Method(int access_flags, int name_index, int signature_index, Attribute[] attributes, - ConstantPool constant_pool) { + public Method(final int access_flags, final int name_index, final int signature_index, final Attribute[] attributes, + final ConstantPool constant_pool) { super(access_flags, name_index, signature_index, attributes, constant_pool); } @@ -104,7 +104,7 @@ public final class Method extends FieldOrMethod { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitMethod(this); } @@ -196,7 +196,7 @@ public final class Method extends FieldOrMethod { /** * @return deep copy of this method */ - public final Method copy( ConstantPool _constant_pool ) { + public final Method copy( final ConstantPool _constant_pool ) { return (Method) copy_(_constant_pool); } @@ -228,7 +228,7 @@ public final class Method extends FieldOrMethod { /** * @param comparator Comparison strategy object */ - public static void setComparator( BCELComparator comparator ) { + public static void setComparator( final BCELComparator comparator ) { _cmp = comparator; } @@ -241,7 +241,7 @@ public final class Method extends FieldOrMethod { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals( Object obj ) { + public boolean equals( final Object obj ) { return _cmp.equals(this, obj); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java index 0074ca93..1dbc4dfa 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java @@ -48,7 +48,7 @@ public class MethodParameter implements Cloneable { * @throws java.io.IOException * @throws ClassFormatException */ - MethodParameter(DataInput input) throws IOException { + MethodParameter(final DataInput input) throws IOException { name_index = input.readUnsignedShort(); access_flags = input.readUnsignedShort(); } @@ -57,14 +57,14 @@ public class MethodParameter implements Cloneable { return name_index; } - public void setNameIndex(int name_index) { + public void setNameIndex(final int name_index) { this.name_index = name_index; } /** * Returns the name of the parameter. */ - public String getParameterName(ConstantPool constant_pool) { + public String getParameterName(final ConstantPool constant_pool) { if (name_index == 0) { return null; } @@ -75,7 +75,7 @@ public class MethodParameter implements Cloneable { return access_flags; } - public void setAccessFlags(int access_flags) { + public void setAccessFlags(final int access_flags) { this.access_flags = access_flags; } @@ -97,7 +97,7 @@ public class MethodParameter implements Cloneable { * @param file Output file stream * @throws IOException */ - public final void dump(DataOutputStream file) throws IOException { + public final void dump(final DataOutputStream file) throws IOException { file.writeShort(name_index); file.writeShort(access_flags); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java index e0db37a6..a34b3534 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java @@ -34,7 +34,7 @@ public class MethodParameters extends Attribute { private MethodParameter[] parameters = new MethodParameter[0]; - MethodParameters(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { + MethodParameters(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { super(Const.ATTR_METHOD_PARAMETERS, name_index, length, constant_pool); int parameters_count = input.readUnsignedByte(); @@ -48,17 +48,17 @@ public class MethodParameters extends Attribute { return parameters; } - public void setParameters(MethodParameter[] parameters) { + public void setParameters(final MethodParameter[] parameters) { this.parameters = parameters; } @Override - public void accept(Visitor v) { + public void accept(final Visitor v) { v.visitMethodParameters(this); } @Override - public Attribute copy(ConstantPool _constant_pool) { + public Attribute copy(final ConstantPool _constant_pool) { MethodParameters c = (MethodParameters) clone(); c.parameters = new MethodParameter[parameters.length]; @@ -76,7 +76,7 @@ public class MethodParameters extends Attribute { * @throws IOException */ @Override - public void dump(DataOutputStream file) throws IOException { + public void dump(final DataOutputStream file) throws IOException { super.dump(file); file.writeByte(parameters.length); for (MethodParameter parameter : parameters) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java index ad44562e..1ae96c6a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java @@ -40,7 +40,7 @@ public final class PMGClass extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use copy() for a physical copy. */ - public PMGClass(PMGClass c) { + public PMGClass(final PMGClass c) { this(c.getNameIndex(), c.getLength(), c.getPMGIndex(), c.getPMGClassIndex(), c .getConstantPool()); } @@ -54,7 +54,7 @@ public final class PMGClass extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - PMGClass(int name_index, int length, DataInput input, ConstantPool constant_pool) + PMGClass(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, input.readUnsignedShort(), input.readUnsignedShort(), constant_pool); } @@ -67,8 +67,8 @@ public final class PMGClass extends Attribute { * @param pmg_class_index Index in constant pool to CONSTANT_Utf8 * @param constant_pool Array of constants */ - public PMGClass(int name_index, int length, int pmg_index, int pmg_class_index, - ConstantPool constant_pool) { + public PMGClass(final int name_index, final int length, final int pmg_index, final int pmg_class_index, + final ConstantPool constant_pool) { super(Const.ATTR_PMG, name_index, length, constant_pool); this.pmg_index = pmg_index; this.pmg_class_index = pmg_class_index; @@ -83,7 +83,7 @@ public final class PMGClass extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { System.err.println("Visiting non-standard PMGClass object"); } @@ -95,7 +95,7 @@ public final class PMGClass extends Attribute { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(pmg_index); file.writeShort(pmg_class_index); @@ -113,7 +113,7 @@ public final class PMGClass extends Attribute { /** * @param pmg_class_index */ - public final void setPMGClassIndex( int pmg_class_index ) { + public final void setPMGClassIndex( final int pmg_class_index ) { this.pmg_class_index = pmg_class_index; } @@ -129,7 +129,7 @@ public final class PMGClass extends Attribute { /** * @param pmg_index */ - public final void setPMGIndex( int pmg_index ) { + public final void setPMGIndex( final int pmg_index ) { this.pmg_index = pmg_index; } @@ -167,7 +167,7 @@ public final class PMGClass extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { return (Attribute) clone(); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java index 2c9ba182..cdff0283 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java @@ -41,7 +41,7 @@ public class ParameterAnnotationEntry implements Node { * @param input Input stream * @throws IOException */ - ParameterAnnotationEntry(DataInput input, ConstantPool constant_pool) throws IOException { + ParameterAnnotationEntry(final DataInput input, final ConstantPool constant_pool) throws IOException { int annotation_table_length = input.readUnsignedShort(); annotation_table = new AnnotationEntry[annotation_table_length]; for (int i = 0; i < annotation_table_length; i++) { @@ -59,7 +59,7 @@ public class ParameterAnnotationEntry implements Node { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitParameterAnnotationEntry(this); } @@ -70,14 +70,14 @@ public class ParameterAnnotationEntry implements Node { return annotation_table; } - public void dump(DataOutputStream dos) throws IOException { + public void dump(final DataOutputStream dos) throws IOException { dos.writeShort(annotation_table.length); for (AnnotationEntry entry : annotation_table) { entry.dump(dos); } } - public static ParameterAnnotationEntry[] createParameterAnnotationEntries(Attribute[] attrs) { + public static ParameterAnnotationEntry[] createParameterAnnotationEntries(final Attribute[] attrs) { // Find attributes that contain parameter annotation data List accumulatedAnnotations = new ArrayList<>(attrs.length); for (Attribute attribute : attrs) { diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java index fe778def..7f91b615 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java @@ -39,8 +39,8 @@ public abstract class ParameterAnnotations extends Attribute { * @param input Input stream * @param constant_pool Array of constants */ - ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, - DataInput input, ConstantPool constant_pool) throws IOException { + ParameterAnnotations(final byte parameter_annotation_type, final int name_index, final int length, + final DataInput input, final ConstantPool constant_pool) throws IOException { this(parameter_annotation_type, name_index, length, (ParameterAnnotationEntry[]) null, constant_pool); int num_parameters = input.readUnsignedByte(); @@ -58,8 +58,8 @@ public abstract class ParameterAnnotations extends Attribute { * @param parameter_annotation_table the actual parameter annotations * @param constant_pool Array of constants */ - public ParameterAnnotations(byte parameter_annotation_type, int name_index, int length, - ParameterAnnotationEntry[] parameter_annotation_table, ConstantPool constant_pool) { + public ParameterAnnotations(final byte parameter_annotation_type, final int name_index, final int length, + final ParameterAnnotationEntry[] parameter_annotation_table, final ConstantPool constant_pool) { super(parameter_annotation_type, name_index, length, constant_pool); this.parameter_annotation_table = parameter_annotation_table; } @@ -73,7 +73,7 @@ public abstract class ParameterAnnotations extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitParameterAnnotation(this); } @@ -81,7 +81,7 @@ public abstract class ParameterAnnotations extends Attribute { /** * @param parameter_annotation_table the entries to set in this parameter annotation */ - public final void setParameterAnnotationTable(ParameterAnnotationEntry[] parameter_annotation_table ) { + public final void setParameterAnnotationTable(final ParameterAnnotationEntry[] parameter_annotation_table ) { this.parameter_annotation_table = parameter_annotation_table; } @@ -102,7 +102,7 @@ public abstract class ParameterAnnotations extends Attribute { } @Override - public void dump(DataOutputStream dos) throws IOException + public void dump(final DataOutputStream dos) throws IOException { super.dump(dos); dos.writeByte(parameter_annotation_table.length); @@ -117,7 +117,7 @@ public abstract class ParameterAnnotations extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool constant_pool ) { + public Attribute copy( final ConstantPool constant_pool ) { return (Attribute) clone(); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java index 9579f634..110c56c6 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java @@ -42,7 +42,7 @@ public class RuntimeInvisibleAnnotations extends Annotations * @param constant_pool * Array of constants */ - public RuntimeInvisibleAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) + public RuntimeInvisibleAnnotations(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { super(Const.ATTR_RUNTIME_INVISIBLE_ANNOTATIONS, name_index, length, input, constant_pool, false); @@ -52,13 +52,13 @@ public class RuntimeInvisibleAnnotations extends Annotations * @return deep copy of this attribute */ @Override - public Attribute copy(ConstantPool constant_pool) + public Attribute copy(final ConstantPool constant_pool) { return (Attribute) clone(); } @Override - public final void dump(DataOutputStream dos) throws IOException + public final void dump(final DataOutputStream dos) throws IOException { super.dump(dos); writeAnnotations(dos); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java index 407a099b..4173b0d1 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java @@ -37,7 +37,7 @@ public class RuntimeInvisibleParameterAnnotations extends ParameterAnnotations { * @param input Input stream * @param constant_pool Array of constants */ - public RuntimeInvisibleParameterAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) + public RuntimeInvisibleParameterAnnotations(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { super(Const.ATTR_RUNTIME_INVISIBLE_PARAMETER_ANNOTATIONS, name_index, length, input, constant_pool); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java index d1e3c44b..6f5ea812 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java @@ -42,7 +42,7 @@ public class RuntimeVisibleAnnotations extends Annotations * @param constant_pool * Array of constants */ - public RuntimeVisibleAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException + public RuntimeVisibleAnnotations(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { super(Const.ATTR_RUNTIME_VISIBLE_ANNOTATIONS, name_index, length, input, constant_pool, true); } @@ -51,13 +51,13 @@ public class RuntimeVisibleAnnotations extends Annotations * @return deep copy of this attribute */ @Override - public Attribute copy(ConstantPool constant_pool) + public Attribute copy(final ConstantPool constant_pool) { return (Attribute) clone(); } @Override - public final void dump(DataOutputStream dos) throws IOException + public final void dump(final DataOutputStream dos) throws IOException { super.dump(dos); writeAnnotations(dos); diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java index 105fae66..9f7145a2 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java @@ -37,7 +37,7 @@ public class RuntimeVisibleParameterAnnotations extends ParameterAnnotations { * @param input Input stream * @param constant_pool Array of constants */ - public RuntimeVisibleParameterAnnotations(int name_index, int length, DataInput input, ConstantPool constant_pool) + public RuntimeVisibleParameterAnnotations(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { super(Const.ATTR_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, name_index, length, input, constant_pool); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java index bd9d519e..d767d744 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Signature.java @@ -40,7 +40,7 @@ public final class Signature extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use clone() for a physical copy. */ - public Signature(Signature c) { + public Signature(final Signature c) { this(c.getNameIndex(), c.getLength(), c.getSignatureIndex(), c.getConstantPool()); } @@ -53,7 +53,7 @@ public final class Signature extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - Signature(int name_index, int length, DataInput input, ConstantPool constant_pool) + Signature(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, input.readUnsignedShort(), constant_pool); } @@ -65,7 +65,7 @@ public final class Signature extends Attribute { * @param signature_index Index in constant pool to CONSTANT_Utf8 * @param constant_pool Array of constants */ - public Signature(int name_index, int length, int signature_index, ConstantPool constant_pool) { + public Signature(final int name_index, final int length, final int signature_index, final ConstantPool constant_pool) { super(Const.ATTR_SIGNATURE, name_index, length, constant_pool); this.signature_index = signature_index; } @@ -79,7 +79,7 @@ public final class Signature extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { //System.err.println("Visiting non-standard Signature object"); v.visitSignature(this); } @@ -92,7 +92,7 @@ public final class Signature extends Attribute { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(signature_index); } @@ -109,7 +109,7 @@ public final class Signature extends Attribute { /** * @param signature_index the index info the constant pool of this signature */ - public final void setSignatureIndex( int signature_index ) { + public final void setSignatureIndex( final int signature_index ) { this.signature_index = signature_index; } @@ -128,7 +128,7 @@ public final class Signature extends Attribute { */ private static final class MyByteArrayInputStream extends ByteArrayInputStream { - MyByteArrayInputStream(String data) { + MyByteArrayInputStream(final String data) { super(data.getBytes()); } @@ -146,12 +146,12 @@ public final class Signature extends Attribute { } - private static boolean identStart( int ch ) { + private static boolean identStart( final int ch ) { return ch == 'T' || ch == 'L'; } - private static void matchIdent( MyByteArrayInputStream in, StringBuilder buf ) { + private static void matchIdent( final MyByteArrayInputStream in, final StringBuilder buf ) { int ch; if ((ch = in.read()) == -1) { throw new RuntimeException("Illegal signature: " + in.getData() @@ -194,7 +194,7 @@ public final class Signature extends Attribute { } - private static void matchGJIdent( MyByteArrayInputStream in, StringBuilder buf ) { + private static void matchGJIdent( final MyByteArrayInputStream in, final StringBuilder buf ) { int ch; matchIdent(in, buf); ch = in.read(); @@ -230,7 +230,7 @@ public final class Signature extends Attribute { } - public static String translate( String s ) { + public static String translate( final String s ) { //System.out.println("Sig:" + s); StringBuilder buf = new StringBuilder(); matchGJIdent(new MyByteArrayInputStream(s), buf); @@ -239,13 +239,13 @@ public final class Signature extends Attribute { // @since 6.0 is no longer final - public static boolean isFormalParameterList( String s ) { + public static boolean isFormalParameterList( final String s ) { return s.startsWith("<") && (s.indexOf(':') > 0); } // @since 6.0 is no longer final - public static boolean isActualParameterList( String s ) { + public static boolean isActualParameterList( final String s ) { return s.startsWith("L") && s.endsWith(">;"); } @@ -264,7 +264,7 @@ public final class Signature extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { return (Attribute) clone(); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java b/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java index e67f9a28..cfedd941 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java @@ -29,7 +29,7 @@ public class SimpleElementValue extends ElementValue { private int index; - public SimpleElementValue(int type, int index, ConstantPool cpool) + public SimpleElementValue(final int type, final int index, final ConstantPool cpool) { super(type, cpool); this.index = index; @@ -43,7 +43,7 @@ public class SimpleElementValue extends ElementValue return index; } - public void setIndex(int index) + public void setIndex(final int index) { this.index = index; } @@ -201,7 +201,7 @@ public class SimpleElementValue extends ElementValue } @Override - public void dump(DataOutputStream dos) throws IOException + public void dump(final DataOutputStream dos) throws IOException { final int _type = super.getType(); dos.writeByte(_type); // u1 kind of value diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java index bb72b354..d9dd066f 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java @@ -41,7 +41,7 @@ public final class SourceFile extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use clone() for a physical copy. */ - public SourceFile(SourceFile c) { + public SourceFile(final SourceFile c) { this(c.getNameIndex(), c.getLength(), c.getSourceFileIndex(), c.getConstantPool()); } @@ -54,7 +54,7 @@ public final class SourceFile extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - SourceFile(int name_index, int length, DataInput input, ConstantPool constant_pool) + SourceFile(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, input.readUnsignedShort(), constant_pool); } @@ -73,7 +73,7 @@ public final class SourceFile extends Attribute { * information has to be supplied the consumer of this attribute - in * many cases, the JVM. */ - public SourceFile(int name_index, int length, int sourcefile_index, ConstantPool constant_pool) { + public SourceFile(final int name_index, final int length, final int sourcefile_index, final ConstantPool constant_pool) { super(Const.ATTR_SOURCE_FILE, name_index, length, constant_pool); this.sourcefile_index = sourcefile_index; } @@ -87,7 +87,7 @@ public final class SourceFile extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitSourceFile(this); } @@ -99,7 +99,7 @@ public final class SourceFile extends Attribute { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(sourcefile_index); } @@ -116,7 +116,7 @@ public final class SourceFile extends Attribute { /** * @param sourcefile_index */ - public final void setSourceFileIndex( int sourcefile_index ) { + public final void setSourceFileIndex( final int sourcefile_index ) { this.sourcefile_index = sourcefile_index; } @@ -144,7 +144,7 @@ public final class SourceFile extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { return (Attribute) clone(); } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java index bc24675a..ced09c7d 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java @@ -48,7 +48,7 @@ public final class StackMap extends Attribute { * @param map Table of stack map entries * @param constant_pool Array of constants */ - public StackMap(int name_index, int length, StackMapEntry[] map, ConstantPool constant_pool) { + public StackMap(final int name_index, final int length, final StackMapEntry[] map, final ConstantPool constant_pool) { super(Const.ATTR_STACK_MAP, name_index, length, constant_pool); this.map = map; } @@ -63,7 +63,7 @@ public final class StackMap extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - StackMap(int name_index, int length, DataInput input, ConstantPool constant_pool) throws IOException { + StackMap(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (StackMapEntry[]) null, constant_pool); int map_length = input.readUnsignedShort(); map = new StackMapEntry[map_length]; @@ -80,7 +80,7 @@ public final class StackMap extends Attribute { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(map.length); for (StackMapEntry entry : map) { @@ -100,7 +100,7 @@ public final class StackMap extends Attribute { /** * @param map Array of stack map entries */ - public final void setStackMap( StackMapEntry[] map ) { + public final void setStackMap( final StackMapEntry[] map ) { this.map = map; int len = 2; // Length of 'number_of_entries' field prior to the array of stack maps for (int i = 0; i < map.length; i++) { @@ -131,7 +131,7 @@ public final class StackMap extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { StackMap c = (StackMap) clone(); c.map = new StackMapEntry[map.length]; for (int i = 0; i < map.length; i++) { @@ -150,7 +150,7 @@ public final class StackMap extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackMap(this); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index f663d5ee..f7d1efa0 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -47,7 +47,7 @@ public final class StackMapEntry implements Node, Cloneable * @param input Input stream * @throws IOException */ - StackMapEntry(DataInput input, ConstantPool constant_pool) throws IOException { + StackMapEntry(final DataInput input, final ConstantPool constant_pool) throws IOException { this(input.readByte() & 0xFF, -1, null, null, constant_pool); if (frame_type >= Const.SAME_FRAME && frame_type <= Const.SAME_FRAME_MAX) { @@ -102,9 +102,9 @@ public final class StackMapEntry implements Node, Cloneable * @deprecated Since 6.0, use {@link #StackMapEntry(int, int, StackMapType[], StackMapType[], ConstantPool)} * instead */ - public StackMapEntry(int byte_code_offset, int number_of_locals, - StackMapType[] types_of_locals, int number_of_stack_items, - StackMapType[] types_of_stack_items, ConstantPool constant_pool) { + public StackMapEntry(final int byte_code_offset, final int number_of_locals, + final StackMapType[] types_of_locals, final int number_of_stack_items, + final StackMapType[] types_of_stack_items, final ConstantPool constant_pool) { this.byte_code_offset = byte_code_offset; this.types_of_locals = types_of_locals != null ? types_of_locals : new StackMapType[0]; this.types_of_stack_items = types_of_stack_items != null ? types_of_stack_items : new StackMapType[0]; @@ -120,9 +120,9 @@ public final class StackMapEntry implements Node, Cloneable * @param types_of_stack_items array ot {@link StackMapType}s of stack items * @param constant_pool the constant pool */ - public StackMapEntry(int tag, int byte_code_offset, - StackMapType[] types_of_locals, - StackMapType[] types_of_stack_items, ConstantPool constant_pool) { + public StackMapEntry(final int tag, final int byte_code_offset, + final StackMapType[] types_of_locals, + final StackMapType[] types_of_stack_items, final ConstantPool constant_pool) { this.frame_type = tag; this.byte_code_offset = byte_code_offset; this.types_of_locals = types_of_locals != null ? types_of_locals : new StackMapType[0]; @@ -137,7 +137,7 @@ public final class StackMapEntry implements Node, Cloneable * @param file Output file stream * @throws IOException */ - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.write(frame_type); if (frame_type >= Const.SAME_FRAME && frame_type <= Const.SAME_FRAME_MAX) { // nothing to be done @@ -261,7 +261,7 @@ public final class StackMapEntry implements Node, Cloneable } - public void setFrameType( int f ) { + public void setFrameType( final int f ) { if (f >= Const.SAME_FRAME && f <= Const.SAME_FRAME_MAX) { byte_code_offset = f - Const.SAME_FRAME; } else if (f >= Const.SAME_LOCALS_1_STACK_ITEM_FRAME && @@ -284,7 +284,7 @@ public final class StackMapEntry implements Node, Cloneable } - public void setByteCodeOffset( int new_offset ) { + public void setByteCodeOffset( final int new_offset ) { if (new_offset < 0 || new_offset > 32767) { throw new RuntimeException("Invalid StackMap offset: " + new_offset); } @@ -324,7 +324,7 @@ public final class StackMapEntry implements Node, Cloneable * * @param int offset delta */ - public void updateByteCodeOffset(int delta) { + public void updateByteCodeOffset(final int delta) { setByteCodeOffset(byte_code_offset + delta); } @@ -335,7 +335,7 @@ public final class StackMapEntry implements Node, Cloneable @java.lang.Deprecated - public void setNumberOfLocals( int n ) { // TODO unused + public void setNumberOfLocals( final int n ) { // TODO unused } @@ -344,7 +344,7 @@ public final class StackMapEntry implements Node, Cloneable } - public void setTypesOfLocals( StackMapType[] types ) { + public void setTypesOfLocals( final StackMapType[] types ) { types_of_locals = types != null ? types : new StackMapType[0]; } @@ -355,7 +355,7 @@ public final class StackMapEntry implements Node, Cloneable @java.lang.Deprecated - public void setNumberOfStackItems( int n ) { // TODO unused + public void setNumberOfStackItems( final int n ) { // TODO unused } @@ -364,7 +364,7 @@ public final class StackMapEntry implements Node, Cloneable } - public void setTypesOfStackItems( StackMapType[] types ) { + public void setTypesOfStackItems( final StackMapType[] types ) { types_of_stack_items = types != null ? types : new StackMapType[0]; } @@ -405,7 +405,7 @@ public final class StackMapEntry implements Node, Cloneable * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackMapEntry(this); } @@ -421,7 +421,7 @@ public final class StackMapEntry implements Node, Cloneable /** * @param constant_pool Constant pool to be used for this object. */ - public final void setConstantPool( ConstantPool constant_pool ) { + public final void setConstantPool( final ConstantPool constant_pool ) { this.constant_pool = constant_pool; } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java index 7f54c1f7..66639095 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java @@ -44,7 +44,7 @@ public final class StackMapType implements Cloneable { * @param file Input stream * @throws IOException */ - StackMapType(DataInput file, ConstantPool constant_pool) throws IOException { + StackMapType(final DataInput file, final ConstantPool constant_pool) throws IOException { this(file.readByte(), -1, constant_pool); if (hasIndex()) { this.index = file.readShort(); @@ -57,7 +57,7 @@ public final class StackMapType implements Cloneable { * @param type type tag as defined in the Constants interface * @param index index to constant pool, or byte code offset */ - public StackMapType(byte type, int index, ConstantPool constant_pool) { + public StackMapType(final byte type, final int index, final ConstantPool constant_pool) { if ((type < Const.ITEM_Bogus) || (type > Const.ITEM_NewObject)) { throw new RuntimeException("Illegal type for StackMapType: " + type); } @@ -67,7 +67,7 @@ public final class StackMapType implements Cloneable { } - public void setType( byte t ) { + public void setType( final byte t ) { if ((t < Const.ITEM_Bogus) || (t > Const.ITEM_NewObject)) { throw new RuntimeException("Illegal type for StackMapType: " + t); } @@ -80,7 +80,7 @@ public final class StackMapType implements Cloneable { } - public void setIndex( int t ) { + public void setIndex( final int t ) { index = t; } @@ -99,7 +99,7 @@ public final class StackMapType implements Cloneable { * @param file Output file stream * @throws IOException */ - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { file.writeByte(type); if (hasIndex()) { file.writeShort(getIndex()); @@ -161,7 +161,7 @@ public final class StackMapType implements Cloneable { /** * @param constant_pool Constant pool to be used for this object. */ - public final void setConstantPool( ConstantPool constant_pool ) { + public final void setConstantPool( final ConstantPool constant_pool ) { this.constant_pool = constant_pool; } } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java index 32ca5911..c9812534 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java @@ -44,7 +44,7 @@ public final class Synthetic extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use copy() for a physical copy. */ - public Synthetic(Synthetic c) { + public Synthetic(final Synthetic c) { this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); } @@ -57,7 +57,7 @@ public final class Synthetic extends Attribute { * @param constant_pool The constant pool this attribute is associated * with. */ - public Synthetic(int name_index, int length, byte[] bytes, ConstantPool constant_pool) { + public Synthetic(final int name_index, final int length, final byte[] bytes, final ConstantPool constant_pool) { super(Const.ATTR_SYNTHETIC, name_index, length, constant_pool); this.bytes = bytes; } @@ -72,7 +72,7 @@ public final class Synthetic extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - Synthetic(int name_index, int length, DataInput input, ConstantPool constant_pool) + Synthetic(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (byte[]) null, constant_pool); if (length > 0) { @@ -91,7 +91,7 @@ public final class Synthetic extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitSynthetic(this); } @@ -103,7 +103,7 @@ public final class Synthetic extends Attribute { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); if (super.getLength() > 0) { file.write(bytes, 0, super.getLength()); @@ -122,7 +122,7 @@ public final class Synthetic extends Attribute { /** * @param bytes */ - public final void setBytes( byte[] bytes ) { + public final void setBytes( final byte[] bytes ) { this.bytes = bytes; } @@ -144,7 +144,7 @@ public final class Synthetic extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { Synthetic c = (Synthetic) clone(); if (bytes != null) { c.bytes = new byte[bytes.length]; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java index 91f16069..393281f4 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java @@ -59,7 +59,7 @@ public final class Unknown extends Attribute { * Initialize from another object. Note that both objects use the same * references (shallow copy). Use clone() for a physical copy. */ - public Unknown(Unknown c) { + public Unknown(final Unknown c) { this(c.getNameIndex(), c.getLength(), c.getBytes(), c.getConstantPool()); } @@ -72,7 +72,7 @@ public final class Unknown extends Attribute { * @param bytes Attribute contents * @param constant_pool Array of constants */ - public Unknown(int name_index, int length, byte[] bytes, ConstantPool constant_pool) { + public Unknown(final int name_index, final int length, final byte[] bytes, final ConstantPool constant_pool) { super(Const.ATTR_UNKNOWN, name_index, length, constant_pool); this.bytes = bytes; name = ((ConstantUtf8) constant_pool.getConstant(name_index, Const.CONSTANT_Utf8)) @@ -90,7 +90,7 @@ public final class Unknown extends Attribute { * @param constant_pool Array of constants * @throws IOException */ - Unknown(int name_index, int length, DataInput input, ConstantPool constant_pool) + Unknown(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (byte[]) null, constant_pool); if (length > 0) { @@ -108,7 +108,7 @@ public final class Unknown extends Attribute { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitUnknown(this); } @@ -120,7 +120,7 @@ public final class Unknown extends Attribute { * @throws IOException */ @Override - public final void dump( DataOutputStream file ) throws IOException { + public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); if (super.getLength() > 0) { file.write(bytes, 0, super.getLength()); @@ -148,7 +148,7 @@ public final class Unknown extends Attribute { /** * @param bytes the bytes to set */ - public final void setBytes( byte[] bytes ) { + public final void setBytes( final byte[] bytes ) { this.bytes = bytes; } @@ -177,7 +177,7 @@ public final class Unknown extends Attribute { * @return deep copy of this attribute */ @Override - public Attribute copy( ConstantPool _constant_pool ) { + public Attribute copy( final ConstantPool _constant_pool ) { Unknown c = (Unknown) clone(); if (bytes != null) { c.bytes = new byte[bytes.length]; diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java index a4271013..28bc6265 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/Utility.java @@ -45,12 +45,12 @@ import org.apache.commons.bcel6.util.ByteSequence; // @since 6.0 methods are no longer final public abstract class Utility { - private static int unwrap( ThreadLocal tl ) { + private static int unwrap( final ThreadLocal tl ) { return tl.get().intValue(); } - private static void wrap( ThreadLocal tl, int value ) { + private static void wrap( final ThreadLocal tl, final int value ) { tl.set(Integer.valueOf(value)); } @@ -82,7 +82,7 @@ public abstract class Utility { * @param access_flags Access flags * @return String representation of flags */ - public static String accessToString( int access_flags ) { + public static String accessToString( final int access_flags ) { return accessToString(access_flags, false); } @@ -99,7 +99,7 @@ public abstract class Utility { * @param for_class access flags are for class qualifiers ? * @return String representation of flags */ - public static String accessToString( int access_flags, boolean for_class ) { + public static String accessToString( final int access_flags, final boolean for_class ) { StringBuilder buf = new StringBuilder(); int p = 0; for (int i = 0; p < Const.MAX_ACC_FLAG; i++) { // Loop through known flags @@ -125,7 +125,7 @@ public abstract class Utility { * * @return "class" or "interface", depending on the ACC_INTERFACE flag */ - public static String classOrInterface( int access_flags ) { + public static String classOrInterface( final int access_flags ) { return ((access_flags & Const.ACC_INTERFACE) != 0) ? "interface" : "class"; } @@ -144,8 +144,8 @@ public abstract class Utility { * @param verbose be verbose, e.g. print constant pool index * @return String representation of byte codes */ - public static String codeToString( byte[] code, ConstantPool constant_pool, int index, - int length, boolean verbose ) { + public static String codeToString( final byte[] code, final ConstantPool constant_pool, final int index, + final int length, final boolean verbose ) { StringBuilder buf = new StringBuilder(code.length * 20); // Should be sufficient // CHECKSTYLE IGNORE MagicNumber ByteSequence stream = new ByteSequence(code); try { @@ -168,7 +168,7 @@ public abstract class Utility { } - public static String codeToString( byte[] code, ConstantPool constant_pool, int index, int length ) { + public static String codeToString( final byte[] code, final ConstantPool constant_pool, final int index, final int length ) { return codeToString(code, constant_pool, index, length, true); } @@ -184,8 +184,8 @@ public abstract class Utility { * * @throws IOException if a failure from reading from the bytes argument occurs */ - public static String codeToString( ByteSequence bytes, ConstantPool constant_pool, - boolean verbose ) throws IOException { + public static String codeToString( final ByteSequence bytes, final ConstantPool constant_pool, + final boolean verbose ) throws IOException { short opcode = (short) bytes.readUnsignedByte(); int default_offset = 0; int low; @@ -452,7 +452,7 @@ public abstract class Utility { } - public static String codeToString( ByteSequence bytes, ConstantPool constant_pool ) + public static String codeToString( final ByteSequence bytes, final ConstantPool constant_pool ) throws IOException { return codeToString(bytes, constant_pool, true); } @@ -465,7 +465,7 @@ public abstract class Utility { * @param str The long class name * @return Compacted class name */ - public static String compactClassName( String str ) { + public static String compactClassName( final String str ) { return compactClassName(str, true); } @@ -481,7 +481,7 @@ public abstract class Utility { * @param chopit Flag that determines whether chopping is executed or not * @return Compacted class name */ - public static String compactClassName( String str, String prefix, boolean chopit ) { + public static String compactClassName( String str, final String prefix, final boolean chopit ) { int len = prefix.length(); str = str.replace('/', '.'); // Is `/' on all systems, even DOS if (chopit) { @@ -504,7 +504,7 @@ public abstract class Utility { * @param chopit Flag that determines whether chopping is executed or not * @return Compacted class name */ - public static String compactClassName( String str, boolean chopit ) { + public static String compactClassName( final String str, final boolean chopit ) { return compactClassName(str, "java.lang.", chopit); } @@ -512,7 +512,7 @@ public abstract class Utility { /** * @return `flag' with bit `i' set to 1 */ - public static int setBit( int flag, int i ) { + public static int setBit( final int flag, final int i ) { return flag | pow2(i); } @@ -520,7 +520,7 @@ public abstract class Utility { /** * @return `flag' with bit `i' set to 0 */ - public static int clearBit( int flag, int i ) { + public static int clearBit( final int flag, final int i ) { int bit = pow2(i); return (flag & bit) == 0 ? flag : flag ^ bit; } @@ -529,7 +529,7 @@ public abstract class Utility { /** * @return true, if bit `i' in `flag' is set */ - public static boolean isSet( int flag, int i ) { + public static boolean isSet( final int flag, final int i ) { return (flag & pow2(i)) != 0; } @@ -544,7 +544,7 @@ public abstract class Utility { * * @throws ClassFormatException if the signature is for Void */ - public static String methodTypeToSignature( String ret, String[] argv ) + public static String methodTypeToSignature( final String ret, final String[] argv ) throws ClassFormatException { StringBuilder buf = new StringBuilder("("); String str; @@ -568,7 +568,7 @@ public abstract class Utility { * @return Array of argument types * @throws ClassFormatException */ - public static String[] methodSignatureArgumentTypes( String signature ) + public static String[] methodSignatureArgumentTypes( final String signature ) throws ClassFormatException { return methodSignatureArgumentTypes(signature, true); } @@ -580,7 +580,7 @@ public abstract class Utility { * @return Array of argument types * @throws ClassFormatException */ - public static String[] methodSignatureArgumentTypes( String signature, boolean chopit ) + public static String[] methodSignatureArgumentTypes( final String signature, final boolean chopit ) throws ClassFormatException { List vec = new ArrayList<>(); int index; @@ -606,7 +606,7 @@ public abstract class Utility { * @return return type of method * @throws ClassFormatException */ - public static String methodSignatureReturnType( String signature ) throws ClassFormatException { + public static String methodSignatureReturnType( final String signature ) throws ClassFormatException { return methodSignatureReturnType(signature, true); } @@ -617,7 +617,7 @@ public abstract class Utility { * @return return type of method * @throws ClassFormatException */ - public static String methodSignatureReturnType( String signature, boolean chopit ) throws ClassFormatException { + public static String methodSignatureReturnType( final String signature, final boolean chopit ) throws ClassFormatException { int index; String type; try { @@ -639,12 +639,12 @@ public abstract class Utility { * @param access flags of method * @return Human readable signature */ - public static String methodSignatureToString( String signature, String name, String access ) { + public static String methodSignatureToString( final String signature, final String name, final String access ) { return methodSignatureToString(signature, name, access, true); } - public static String methodSignatureToString( String signature, String name, String access, boolean chopit ) { + public static String methodSignatureToString( final String signature, final String name, final String access, final boolean chopit ) { return methodSignatureToString(signature, name, access, chopit, null); } @@ -684,8 +684,8 @@ public abstract class Utility { * @return Java type declaration * @throws ClassFormatException */ - public static String methodSignatureToString( String signature, String name, - String access, boolean chopit, LocalVariableTable vars ) throws ClassFormatException { + public static String methodSignatureToString( final String signature, final String name, + final String access, final boolean chopit, final LocalVariableTable vars ) throws ClassFormatException { StringBuilder buf = new StringBuilder("("); String type; int index; @@ -731,7 +731,7 @@ public abstract class Utility { // Guess what this does - private static int pow2( int n ) { + private static int pow2( final int n ) { return 1 << n; } @@ -744,7 +744,7 @@ public abstract class Utility { * @param new_ Replacement string * @return new String object */ - public static String replace( String str, String old, String new_ ) { + public static String replace( String str, final String old, final String new_ ) { int index; int old_index; try { @@ -773,7 +773,7 @@ public abstract class Utility { * @param signature to convert * @return Human readable signature */ - public static String signatureToString( String signature ) { + public static String signatureToString( final String signature ) { return signatureToString(signature, true); } @@ -812,7 +812,7 @@ public abstract class Utility { * @return Java type declaration * @throws ClassFormatException */ - public static String signatureToString( String signature, boolean chopit ) { + public static String signatureToString( final String signature, final boolean chopit ) { //corrected concurrent private static field acess wrap(consumed_chars, 1); // This is the default, read just one char like `B' try { @@ -999,7 +999,7 @@ public abstract class Utility { } - private static int countBrackets( String brackets ) { + private static int countBrackets( final String brackets ) { char[] chars = brackets.toCharArray(); int count = 0; boolean open = false; @@ -1039,7 +1039,7 @@ public abstract class Utility { * * @throws ClassFormatException if signature is not a method signature */ - public static byte typeOfMethodSignature( String signature ) throws ClassFormatException { + public static byte typeOfMethodSignature( final String signature ) throws ClassFormatException { int index; try { if (signature.charAt(0) != '(') { @@ -1062,7 +1062,7 @@ public abstract class Utility { * * @throws ClassFormatException if signature isn't a known type */ - public static byte typeOfSignature( String signature ) throws ClassFormatException { + public static byte typeOfSignature( final String signature ) throws ClassFormatException { try { switch (signature.charAt(0)) { case 'B': @@ -1114,7 +1114,7 @@ public abstract class Utility { * Convert (signed) byte to (unsigned) short value, i.e., all negative * values become positive. */ - private static short byteToShort( byte b ) { + private static short byteToShort( final byte b ) { return (b < 0) ? (short) (256 + b) : (short) b; } @@ -1125,7 +1125,7 @@ public abstract class Utility { * * @return bytes as hexadecimal string, e.g. 00 fa 12 ... */ - public static String toHexString( byte[] bytes ) { + public static String toHexString( final byte[] bytes ) { StringBuilder buf = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { short b = byteToShort(bytes[i]); @@ -1152,7 +1152,7 @@ public abstract class Utility { * @param fill fill character * @return formatted int */ - public static String format( int i, int length, boolean left_justify, char fill ) { + public static String format( final int i, final int length, final boolean left_justify, final char fill ) { return fillup(Integer.toString(i), length, left_justify, fill); } @@ -1166,7 +1166,7 @@ public abstract class Utility { * @param fill fill character * @return formatted string */ - public static String fillup( String str, int length, boolean left_justify, char fill ) { + public static String fillup( final String str, final int length, final boolean left_justify, final char fill ) { int len = length - str.length(); char[] buf = new char[(len < 0) ? 0 : len]; for (int j = 0; j < buf.length; j++) { @@ -1179,7 +1179,7 @@ public abstract class Utility { } - static boolean equals( byte[] a, byte[] b ) { + static boolean equals( final byte[] a, final byte[] b ) { int size; if ((size = a.length) != b.length) { return false; @@ -1193,27 +1193,27 @@ public abstract class Utility { } - public static void printArray( PrintStream out, Object[] obj ) { + public static void printArray( final PrintStream out, final Object[] obj ) { out.println(printArray(obj, true)); } - public static void printArray( PrintWriter out, Object[] obj ) { + public static void printArray( final PrintWriter out, final Object[] obj ) { out.println(printArray(obj, true)); } - public static String printArray( Object[] obj ) { + public static String printArray( final Object[] obj ) { return printArray(obj, true); } - public static String printArray( Object[] obj, boolean braces ) { + public static String printArray( final Object[] obj, final boolean braces ) { return printArray(obj, braces, false); } - public static String printArray( Object[] obj, boolean braces, boolean quote ) { + public static String printArray( final Object[] obj, final boolean braces, final boolean quote ) { if (obj == null) { return null; } @@ -1243,7 +1243,7 @@ public abstract class Utility { * * @return true, if character is one of (a, ... z, A, ... Z, 0, ... 9, _) */ - public static boolean isJavaIdentifierPart( char ch ) { + public static boolean isJavaIdentifierPart( final char ch ) { return ((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z')) || ((ch >= '0') && (ch <= '9')) || (ch == '_'); } @@ -1269,7 +1269,7 @@ public abstract class Utility { * * @throws IOException if there's a gzip exception */ - public static String encode( byte[] bytes, boolean compress ) throws IOException { + public static String encode( byte[] bytes, final boolean compress ) throws IOException { if (compress) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); GZIPOutputStream gos = new GZIPOutputStream(baos); @@ -1297,7 +1297,7 @@ public abstract class Utility { * * @throws IOException if there's a gzip exception */ - public static byte[] decode( String s, boolean uncompress ) throws IOException { + public static byte[] decode( final String s, final boolean uncompress ) throws IOException { char[] chars = s.toCharArray(); CharArrayReader car = new CharArrayReader(chars); JavaReader jr = new JavaReader(car); @@ -1354,7 +1354,7 @@ public abstract class Utility { */ private static class JavaReader extends FilterReader { - public JavaReader(Reader in) { + public JavaReader(final Reader in) { super(in); } @@ -1385,7 +1385,7 @@ public abstract class Utility { @Override - public int read( char[] cbuf, int off, int len ) throws IOException { + public int read( final char[] cbuf, final int off, final int len ) throws IOException { for (int i = 0; i < len; i++) { cbuf[off + i] = (char) read(); } @@ -1399,13 +1399,13 @@ public abstract class Utility { */ private static class JavaWriter extends FilterWriter { - public JavaWriter(Writer out) { + public JavaWriter(final Writer out) { super(out); } @Override - public void write( int b ) throws IOException { + public void write( final int b ) throws IOException { if (isJavaIdentifierPart((char) b) && (b != ESCAPE_CHAR)) { out.write(b); } else { @@ -1428,7 +1428,7 @@ public abstract class Utility { @Override - public void write( char[] cbuf, int off, int len ) throws IOException { + public void write( final char[] cbuf, final int off, final int len ) throws IOException { for (int i = 0; i < len; i++) { write(cbuf[off + i]); } @@ -1436,7 +1436,7 @@ public abstract class Utility { @Override - public void write( String str, int off, int len ) throws IOException { + public void write( final String str, final int off, final int len ) throws IOException { write(str.toCharArray(), off, len); } } @@ -1445,7 +1445,7 @@ public abstract class Utility { /** * Escape all occurences of newline chars '\n', quotes \", etc. */ - public static String convertString( String label ) { + public static String convertString( final String label ) { char[] ch = label.toCharArray(); StringBuilder buf = new StringBuilder(); for (char element : ch) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java index 012f5617..27f02735 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java @@ -41,7 +41,7 @@ public class AALOAD extends ArrayInstruction implements StackProducer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java index 2e8dfe9a..5a7edc96 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java @@ -41,7 +41,7 @@ public class AASTORE extends ArrayInstruction implements StackConsumer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java b/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java index 4f6ab935..8adfee9b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java @@ -36,7 +36,7 @@ public class ACONST_NULL extends Instruction implements PushInstruction, TypedIn /** @return Type.NULL */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.NULL; } @@ -50,7 +50,7 @@ public class ACONST_NULL extends Instruction implements PushInstruction, TypedIn * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java index 972ae38d..87ba29a9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java @@ -37,7 +37,7 @@ public class ALOAD extends LoadInstruction { /** Load reference from local variable * @param n index of local variable */ - public ALOAD(int n) { + public ALOAD(final int n) { super(org.apache.commons.bcel6.Const.ALOAD, org.apache.commons.bcel6.Const.ALOAD_0, n); } @@ -51,7 +51,7 @@ public class ALOAD extends LoadInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { super.accept(v); v.visitALOAD(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java index 0d7d0233..fd5c673d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java @@ -36,7 +36,7 @@ public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationIns } - public ANEWARRAY(int index) { + public ANEWARRAY(final int index) { super(org.apache.commons.bcel6.Const.ANEWARRAY, index); } @@ -57,7 +57,7 @@ public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationIns * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitLoadClass(this); v.visitAllocationInstruction(this); v.visitExceptionThrower(this); @@ -69,7 +69,7 @@ public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationIns @Override - public ObjectType getLoadClassType( ConstantPoolGen cpg ) { + public ObjectType getLoadClassType( final ConstantPoolGen cpg ) { Type t = getType(cpg); if (t instanceof ArrayType) { t = ((ArrayType) t).getBasicType(); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java b/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java index 55ee9616..27045087 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java @@ -42,7 +42,7 @@ public class ARETURN extends ReturnInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java b/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java index 1e9bb785..47e4f20c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java @@ -53,7 +53,7 @@ public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackP * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitStackProducer(this); v.visitARRAYLENGTH(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java index 86224404..52dcfc59 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java @@ -37,7 +37,7 @@ public class ASTORE extends StoreInstruction { /** Store reference into local variable * @param n index of local variable */ - public ASTORE(int n) { + public ASTORE(final int n) { super(org.apache.commons.bcel6.Const.ASTORE, org.apache.commons.bcel6.Const.ASTORE_0, n); } @@ -51,7 +51,7 @@ public class ASTORE extends StoreInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { super.accept(v); v.visitASTORE(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java b/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java index 3b21d341..a798ec7a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java @@ -54,7 +54,7 @@ public class ATHROW extends Instruction implements UnconditionalBranch, Exceptio * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitUnconditionalBranch(this); v.visitExceptionThrower(this); v.visitATHROW(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java index 37d14503..7e8da966 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java @@ -31,14 +31,14 @@ public class AnnotationElementValueGen extends ElementValueGen // For annotation element values, this is the annotation private final AnnotationEntryGen a; - public AnnotationElementValueGen(AnnotationEntryGen a, ConstantPoolGen cpool) + public AnnotationElementValueGen(final AnnotationEntryGen a, final ConstantPoolGen cpool) { super(ANNOTATION, cpool); this.a = a; } - public AnnotationElementValueGen(int type, AnnotationEntryGen annotation, - ConstantPoolGen cpool) + public AnnotationElementValueGen(final int type, final AnnotationEntryGen annotation, + final ConstantPoolGen cpool) { super(type, cpool); if (type != ANNOTATION) { @@ -48,15 +48,15 @@ public class AnnotationElementValueGen extends ElementValueGen this.a = annotation; } - public AnnotationElementValueGen(AnnotationElementValue value, - ConstantPoolGen cpool, boolean copyPoolEntries) + public AnnotationElementValueGen(final AnnotationElementValue value, + final ConstantPoolGen cpool, final boolean copyPoolEntries) { super(ANNOTATION, cpool); a = new AnnotationEntryGen(value.getAnnotationEntry(), cpool, copyPoolEntries); } @Override - public void dump(DataOutputStream dos) throws IOException + public void dump(final DataOutputStream dos) throws IOException { dos.writeByte(super.getElementValueType()); // u1 type of value (ANNOTATION == '@') a.dump(dos); diff --git a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java index 9b42e966..f91ce1d5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java @@ -55,8 +55,8 @@ public class AnnotationEntryGen { * entries across. We need to copy the type and the element name value pairs * and the visibility. */ - public AnnotationEntryGen(AnnotationEntry a, ConstantPoolGen cpool, - boolean copyPoolEntries) { + public AnnotationEntryGen(final AnnotationEntry a, final ConstantPoolGen cpool, + final boolean copyPoolEntries) { this.cpool = cpool; if (copyPoolEntries) { typeIndex = cpool.addUtf8(a.getAnnotationType()); @@ -67,8 +67,8 @@ public class AnnotationEntryGen { evs = copyValues(a.getElementValuePairs(), cpool, copyPoolEntries); } - private List copyValues(ElementValuePair[] in, ConstantPoolGen cpool, - boolean copyPoolEntries) { + private List copyValues(final ElementValuePair[] in, final ConstantPoolGen cpool, + final boolean copyPoolEntries) { List out = new ArrayList<>(); for (ElementValuePair nvp : in) { out.add(new ElementValuePairGen(nvp, cpool, copyPoolEntries)); @@ -76,7 +76,7 @@ public class AnnotationEntryGen { return out; } - private AnnotationEntryGen(ConstantPoolGen cpool) { + private AnnotationEntryGen(final ConstantPoolGen cpool) { this.cpool = cpool; } @@ -92,17 +92,17 @@ public class AnnotationEntryGen { return a; } - public AnnotationEntryGen(ObjectType type, - List elements, boolean vis, - ConstantPoolGen cpool) { + public AnnotationEntryGen(final ObjectType type, + final List elements, final boolean vis, + final ConstantPoolGen cpool) { this.cpool = cpool; this.typeIndex = cpool.addUtf8(type.getSignature()); evs = elements; isRuntimeVisible = vis; } - public static AnnotationEntryGen read(DataInput dis, - ConstantPoolGen cpool, boolean b) throws IOException { + public static AnnotationEntryGen read(final DataInput dis, + final ConstantPoolGen cpool, final boolean b) throws IOException { AnnotationEntryGen a = new AnnotationEntryGen(cpool); a.typeIndex = dis.readUnsignedShort(); int elemValuePairCount = dis.readUnsignedShort(); @@ -115,7 +115,7 @@ public class AnnotationEntryGen { return a; } - public void dump(DataOutputStream dos) throws IOException { + public void dump(final DataOutputStream dos) throws IOException { dos.writeShort(typeIndex); // u2 index of type name in cpool dos.writeShort(evs.size()); // u2 element_value pair count for (ElementValuePairGen envp : evs) { @@ -123,7 +123,7 @@ public class AnnotationEntryGen { } } - public void addElementNameValuePair(ElementValuePairGen evp) { + public void addElementNameValuePair(final ElementValuePairGen evp) { if (evs == null) { evs = new ArrayList<>(); } @@ -180,7 +180,7 @@ public class AnnotationEntryGen { return s.toString(); } - private void isRuntimeVisible(boolean b) { + private void isRuntimeVisible(final boolean b) { isRuntimeVisible = b; } @@ -196,7 +196,7 @@ public class AnnotationEntryGen { * @param cp The constant pool gen where we can create the necessary name refs * @param annotationEntryGens An array of AnnotationGen objects */ - static Attribute[] getAnnotationAttributes(ConstantPoolGen cp, AnnotationEntryGen[] annotationEntryGens) { + static Attribute[] getAnnotationAttributes(final ConstantPoolGen cp, final AnnotationEntryGen[] annotationEntryGens) { if (annotationEntryGens.length == 0) { return new Attribute[0]; } @@ -274,8 +274,8 @@ public class AnnotationEntryGen { * - RuntimeInvisibleParameterAnnotations */ static Attribute[] getParameterAnnotationAttributes( - ConstantPoolGen cp, - List[] /*Array of lists, array size depends on #params */vec) { + final ConstantPoolGen cp, + final List[] /*Array of lists, array size depends on #params */vec) { int[] visCount = new int[vec.length]; int totalVisCount = 0; int[] invisCount = new int[vec.length]; diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java index 32fe0a07..45cf6ba5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java @@ -38,7 +38,7 @@ public abstract class ArithmeticInstruction extends Instruction implements Typed /** * @param opcode of instruction */ - protected ArithmeticInstruction(short opcode) { + protected ArithmeticInstruction(final short opcode) { super(opcode, (short) 1); } @@ -46,7 +46,7 @@ public abstract class ArithmeticInstruction extends Instruction implements Typed /** @return type associated with the instruction */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { final short _opcode = super.getOpcode(); switch (_opcode) { case Const.DADD: diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java index c4cc83bf..6739d72b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java @@ -34,14 +34,14 @@ public class ArrayElementValueGen extends ElementValueGen // modify ... private final List evalues; - public ArrayElementValueGen(ConstantPoolGen cp) + public ArrayElementValueGen(final ConstantPoolGen cp) { super(ARRAY, cp); evalues = new ArrayList<>(); } - public ArrayElementValueGen(int type, ElementValue[] datums, - ConstantPoolGen cpool) + public ArrayElementValueGen(final int type, final ElementValue[] datums, + final ConstantPoolGen cpool) { super(type, cpool); if (type != ARRAY) { @@ -74,8 +74,8 @@ public class ArrayElementValueGen extends ElementValueGen * @param value * @param cpool */ - public ArrayElementValueGen(ArrayElementValue value, ConstantPoolGen cpool, - boolean copyPoolEntries) + public ArrayElementValueGen(final ArrayElementValue value, final ConstantPoolGen cpool, + final boolean copyPoolEntries) { super(ARRAY, cpool); evalues = new ArrayList<>(); @@ -86,7 +86,7 @@ public class ArrayElementValueGen extends ElementValueGen } @Override - public void dump(DataOutputStream dos) throws IOException + public void dump(final DataOutputStream dos) throws IOException { dos.writeByte(super.getElementValueType()); // u1 type of value (ARRAY == '[') dos.writeShort(evalues.size()); @@ -120,7 +120,7 @@ public class ArrayElementValueGen extends ElementValueGen return evalues.size(); } - public void addElement(ElementValueGen gen) + public void addElement(final ElementValueGen gen) { evalues.add(gen); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java index 6fe7d53a..02d52a27 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java @@ -38,7 +38,7 @@ public abstract class ArrayInstruction extends Instruction implements ExceptionT /** * @param opcode of instruction */ - protected ArrayInstruction(short opcode) { + protected ArrayInstruction(final short opcode) { super(opcode, (short) 1); } @@ -52,7 +52,7 @@ public abstract class ArrayInstruction extends Instruction implements ExceptionT /** @return type associated with the instruction */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { final short _opcode = super.getOpcode(); switch (_opcode) { case org.apache.commons.bcel6.Const.IALOAD: diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java b/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java index c0fd27e2..7d98fdb9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java @@ -35,7 +35,7 @@ public final class ArrayType extends ReferenceType { * * @param type array type, e.g. T_INT */ - public ArrayType(byte type, int dimensions) { + public ArrayType(final byte type, final int dimensions) { this(BasicType.getType(type), dimensions); } @@ -45,7 +45,7 @@ public final class ArrayType extends ReferenceType { * * @param class_name complete name of class (java.lang.String, e.g.) */ - public ArrayType(String class_name, int dimensions) { + public ArrayType(final String class_name, final int dimensions) { this(ObjectType.getInstance(class_name), dimensions); } @@ -55,7 +55,7 @@ public final class ArrayType extends ReferenceType { * * @param type type of array (may be an array itself) */ - public ArrayType(Type type, int dimensions) { + public ArrayType(final Type type, final int dimensions) { super(Const.T_ARRAY, ""); if ((dimensions < 1) || (dimensions > Const.MAX_BYTE)) { throw new ClassGenException("Invalid number of dimensions: " + dimensions); @@ -119,7 +119,7 @@ public final class ArrayType extends ReferenceType { /** @return true if both type objects refer to the same array type. */ @Override - public boolean equals( Object _type ) { + public boolean equals( final Object _type ) { if (_type instanceof ArrayType) { ArrayType array = (ArrayType) _type; return (array.dimensions == dimensions) && array.basic_type.equals(basic_type); diff --git a/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java index 4b697dfe..bcc9731e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java @@ -41,7 +41,7 @@ public class BALOAD extends ArrayInstruction implements StackProducer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java index 7117bf00..58ebe0fa 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java @@ -41,7 +41,7 @@ public class BASTORE extends ArrayInstruction implements StackConsumer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java b/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java index 1a02f45f..733c3c4a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java @@ -44,7 +44,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { /** Push byte on stack */ - public BIPUSH(byte b) { + public BIPUSH(final byte b) { super(org.apache.commons.bcel6.Const.BIPUSH, (short) 2); this.b = b; } @@ -54,7 +54,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { * Dump instruction as byte code to stream out. */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { super.dump(out); out.writeByte(b); } @@ -64,7 +64,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { * @return mnemonic for instruction */ @Override - public String toString( boolean verbose ) { + public String toString( final boolean verbose ) { return super.toString(verbose) + " " + b; } @@ -73,7 +73,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { * Read needed data (e.g. index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { super.setLength(2); b = bytes.readByte(); } @@ -88,7 +88,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { /** @return Type.BYTE */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.BYTE; } @@ -102,7 +102,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitPushInstruction(this); v.visitStackProducer(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java b/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java index 819ac4f1..b9765fff 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java @@ -38,7 +38,7 @@ public class BREAKPOINT extends Instruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitBREAKPOINT(this); } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java index a0a12e4d..1f077a9f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BasicType.java @@ -32,7 +32,7 @@ public final class BasicType extends Type { * @param type one of T_INT, T_BOOLEAN, ..., T_VOID * @see Const */ - BasicType(byte type) { + BasicType(final byte type) { super(type, Const.getShortTypeName(type)); if ((type < Const.T_BOOLEAN) || (type > Const.T_VOID)) { throw new ClassGenException("Invalid type: " + type); @@ -41,7 +41,7 @@ public final class BasicType extends Type { // @since 6.0 no longer final - public static BasicType getType( byte type ) { + public static BasicType getType( final byte type ) { switch (type) { case Const.T_VOID: return VOID; @@ -78,7 +78,7 @@ public final class BasicType extends Type { /** @return true if both type objects refer to the same type */ @Override - public boolean equals( Object _type ) { + public boolean equals( final Object _type ) { return (_type instanceof BasicType) ? ((BasicType) _type).getType() == this.getType() : false; } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java index 2dd5055a..996288b8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java @@ -30,7 +30,7 @@ package org.apache.commons.bcel6.generic; */ public final class BranchHandle extends InstructionHandle { - private BranchHandle(BranchInstruction i) { + private BranchHandle(final BranchInstruction i) { super(i); } @@ -39,7 +39,7 @@ public final class BranchHandle extends InstructionHandle { private static BranchHandle bh_list = null; // List of reusable handles - static BranchHandle getBranchHandle( BranchInstruction i ) { + static BranchHandle getBranchHandle( final BranchInstruction i ) { if (bh_list == null) { return new BranchHandle(i); } @@ -75,7 +75,7 @@ public final class BranchHandle extends InstructionHandle { @Override - void setPosition( int pos ) { + void setPosition( final int pos ) { // Original code: i_position = bi.position = pos; getBI().setPosition(pos); super.setPosition(pos); @@ -83,7 +83,7 @@ public final class BranchHandle extends InstructionHandle { @Override - protected int updatePosition( int offset, int max_offset ) { + protected int updatePosition( final int offset, final int max_offset ) { int x = getBI().updatePosition(offset, max_offset); super.setPosition(getBI().getPosition()); return x; @@ -93,7 +93,7 @@ public final class BranchHandle extends InstructionHandle { /** * Pass new target to instruction. */ - public void setTarget( InstructionHandle ih ) { + public void setTarget( final InstructionHandle ih ) { getBI().setTarget(ih); } @@ -101,7 +101,7 @@ public final class BranchHandle extends InstructionHandle { /** * Update target of instruction. */ - public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { + public void updateTarget( final InstructionHandle old_ih, final InstructionHandle new_ih ) { getBI().updateTarget(old_ih, new_ih); } @@ -118,7 +118,7 @@ public final class BranchHandle extends InstructionHandle { * Set new contents. Old instruction is disposed and may not be used anymore. */ @Override // This is only done in order to apply the additional type check; could be merged with super impl. - public void setInstruction( Instruction i ) { // TODO could be package-protected? + public void setInstruction( final Instruction i ) { // TODO could be package-protected? super.setInstruction(i); if (!(i instanceof BranchInstruction)) { throw new ClassGenException("Assigning " + i diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java index b368341f..eda9a3ca 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java @@ -63,7 +63,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @param opcode Instruction opcode * @param target instruction to branch to */ - protected BranchInstruction(short opcode, InstructionHandle target) { + protected BranchInstruction(final short opcode, final InstructionHandle target) { super(opcode, (short) 3); setTarget(target); } @@ -74,7 +74,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { out.writeByte(super.getOpcode()); index = getTargetOffset(); if (!isValidShort(index)) { @@ -88,7 +88,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @param _target branch target * @return the offset to `target' relative to this instruction */ - protected int getTargetOffset( InstructionHandle _target ) { + protected int getTargetOffset( final InstructionHandle _target ) { if (_target == null) { throw new ClassGenException("Target of " + super.toString(true) + " is invalid null handle"); @@ -120,7 +120,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @param max_offset the maximum offset that may be caused by these instructions * @return additional offset caused by possible change of this instruction's length */ - protected int updatePosition( int offset, int max_offset ) { + protected int updatePosition( final int offset, final int max_offset ) { position += offset; return 0; } @@ -138,7 +138,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @return mnemonic for instruction */ @Override - public String toString( boolean verbose ) { + public String toString( final boolean verbose ) { String s = super.toString(verbose); String t = "null"; if (verbose) { @@ -175,7 +175,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @see InstructionList */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { super.setLength(3); index = bytes.readShort(); } @@ -201,7 +201,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * Set branch target * @param target branch target */ - public void setTarget( InstructionHandle target ) { + public void setTarget( final InstructionHandle target ) { notifyTarget(this.target, target, this); this.target = target; } @@ -210,8 +210,8 @@ public abstract class BranchInstruction extends Instruction implements Instructi /** * Used by BranchInstruction, LocalVariableGen, CodeExceptionGen, LineNumberGen */ - static void notifyTarget( InstructionHandle old_ih, InstructionHandle new_ih, - InstructionTargeter t ) { + static void notifyTarget( final InstructionHandle old_ih, final InstructionHandle new_ih, + final InstructionTargeter t ) { if (old_ih != null) { old_ih.removeTargeter(t); } @@ -226,7 +226,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @param new_ih new target */ @Override - public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { + public void updateTarget( final InstructionHandle old_ih, final InstructionHandle new_ih ) { if (target == old_ih) { setTarget(new_ih); } else { @@ -239,7 +239,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @return true, if ih is target of this instruction */ @Override - public boolean containsTarget( InstructionHandle ih ) { + public boolean containsTarget( final InstructionHandle ih ) { return target == ih; } @@ -269,7 +269,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @return the new position * @since 6.0 */ - protected void setPosition(int position) { + protected void setPosition(final int position) { this.position = position; } @@ -278,7 +278,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi * @param index the index to set * @since 6.0 */ - protected void setIndex(int index) { + protected void setIndex(final int index) { this.index = index; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java index c146164d..a713ae9f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java @@ -41,7 +41,7 @@ public class CALOAD extends ArrayInstruction implements StackProducer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java index 425d7641..d9d1d61a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java @@ -41,7 +41,7 @@ public class CASTORE extends ArrayInstruction implements StackConsumer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java b/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java index 13362527..5fd8a4e9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java @@ -39,7 +39,7 @@ public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThro /** Check whether object is of given type * @param index index to class in constant pool */ - public CHECKCAST(int index) { + public CHECKCAST(final int index) { super(org.apache.commons.bcel6.Const.CHECKCAST, index); } @@ -54,7 +54,7 @@ public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThro @Override - public ObjectType getLoadClassType( ConstantPoolGen cpg ) { + public ObjectType getLoadClassType( final ConstantPoolGen cpg ) { Type t = getType(cpg); if (t instanceof ArrayType) { t = ((ArrayType) t).getBasicType(); @@ -72,7 +72,7 @@ public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThro * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitLoadClass(this); v.visitExceptionThrower(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java index d09854ae..b8d37961 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java @@ -56,7 +56,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct /** * @param index to constant pool */ - protected CPInstruction(short opcode, int index) { + protected CPInstruction(final short opcode, final int index) { super(opcode, (short) 3); setIndex(index); } @@ -67,7 +67,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { out.writeByte(super.getOpcode()); out.writeShort(index); } @@ -83,7 +83,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct * @return mnemonic for instruction */ @Override - public String toString( boolean verbose ) { + public String toString( final boolean verbose ) { return super.toString(verbose) + " " + index; } @@ -92,7 +92,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct * @return mnemonic for instruction with symbolic references resolved */ @Override - public String toString( ConstantPool cp ) { + public String toString( final ConstantPool cp ) { Constant c = cp.getConstant(index); String str = cp.constantToString(c); if (c instanceof ConstantClass) { @@ -108,7 +108,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct * @param wide wide prefix? */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { setIndex(bytes.readUnsignedShort()); super.setLength(3); } @@ -128,7 +128,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct * @param index in constant pool. */ @Override - public void setIndex( int index ) { // TODO could be package-protected? + public void setIndex( final int index ) { // TODO could be package-protected? if (index < 0) { throw new ClassGenException("Negative index value: " + index); } @@ -139,7 +139,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct /** @return type related with this instruction. */ @Override - public Type getType( ConstantPoolGen cpg ) { + public Type getType( final ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); String name = cp.getConstantString(index, org.apache.commons.bcel6.Const.CONSTANT_Class); if (!name.startsWith("[")) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java index 84a25250..bb622261 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java @@ -34,13 +34,13 @@ public class ClassElementValueGen extends ElementValueGen // For 'class' this points to the class entry in the cpool private int idx; - protected ClassElementValueGen(int typeIdx, ConstantPoolGen cpool) + protected ClassElementValueGen(final int typeIdx, final ConstantPoolGen cpool) { super(ElementValueGen.CLASS, cpool); this.idx = typeIdx; } - public ClassElementValueGen(ObjectType t, ConstantPoolGen cpool) + public ClassElementValueGen(final ObjectType t, final ConstantPoolGen cpool) { super(ElementValueGen.CLASS, cpool); // this.idx = cpool.addClass(t); @@ -58,8 +58,8 @@ public class ClassElementValueGen extends ElementValueGen getConstantPool().getConstantPool()); } - public ClassElementValueGen(ClassElementValue value, ConstantPoolGen cpool, - boolean copyPoolEntries) + public ClassElementValueGen(final ClassElementValue value, final ConstantPoolGen cpool, + final boolean copyPoolEntries) { super(CLASS, cpool); if (copyPoolEntries) @@ -95,7 +95,7 @@ public class ClassElementValueGen extends ElementValueGen } @Override - public void dump(DataOutputStream dos) throws IOException + public void dump(final DataOutputStream dos) throws IOException { dos.writeByte(super.getElementValueType()); // u1 kind of value dos.writeShort(idx); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java index 592855e5..4e1694fc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java @@ -63,7 +63,7 @@ public class ClassGen extends AccessFlags implements Cloneable { private static BCELComparator _cmp = new BCELComparator() { @Override - public boolean equals( Object o1, Object o2 ) { + public boolean equals( final Object o1, final Object o2 ) { ClassGen THIS = (ClassGen) o1; ClassGen THAT = (ClassGen) o2; return THIS.getClassName().equals(THAT.getClassName()); @@ -71,7 +71,7 @@ public class ClassGen extends AccessFlags implements Cloneable { @Override - public int hashCode( Object o ) { + public int hashCode( final Object o ) { ClassGen THIS = (ClassGen) o; return THIS.getClassName().hashCode(); } @@ -87,8 +87,8 @@ public class ClassGen extends AccessFlags implements Cloneable { * @param interfaces implemented interfaces * @param cp constant pool to use */ - public ClassGen(String class_name, String super_class_name, String file_name, int access_flags, - String[] interfaces, ConstantPoolGen cp) { + public ClassGen(final String class_name, final String super_class_name, final String file_name, final int access_flags, + final String[] interfaces, final ConstantPoolGen cp) { super(access_flags); this.class_name = class_name; this.super_class_name = super_class_name; @@ -117,8 +117,8 @@ public class ClassGen extends AccessFlags implements Cloneable { * @param access_flags access qualifiers * @param interfaces implemented interfaces */ - public ClassGen(String class_name, String super_class_name, String file_name, int access_flags, - String[] interfaces) { + public ClassGen(final String class_name, final String super_class_name, final String file_name, final int access_flags, + final String[] interfaces) { this(class_name, super_class_name, file_name, access_flags, interfaces, new ConstantPoolGen()); } @@ -128,7 +128,7 @@ public class ClassGen extends AccessFlags implements Cloneable { * Initialize with existing class. * @param clazz JavaClass object (e.g. read from file) */ - public ClassGen(JavaClass clazz) { + public ClassGen(final JavaClass clazz) { super(clazz.getAccessFlags()); class_name_index = clazz.getClassNameIndex(); superclass_name_index = clazz.getSuperclassNameIndex(); @@ -166,7 +166,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** * Look for attributes representing annotations and unpack them. */ - private AnnotationEntryGen[] unpackAnnotations(Attribute[] attrs) + private AnnotationEntryGen[] unpackAnnotations(final Attribute[] attrs) { List annotationGenObjs = new ArrayList<>(); for (Attribute attr : attrs) { @@ -222,7 +222,7 @@ public class ClassGen extends AccessFlags implements Cloneable { * Add an interface to this class, i.e., this class has to implement it. * @param name interface to implement (fully qualified class name) */ - public void addInterface( String name ) { + public void addInterface( final String name ) { interface_vec.add(name); } @@ -231,7 +231,7 @@ public class ClassGen extends AccessFlags implements Cloneable { * Remove an interface from this class. * @param name interface to remove (fully qualified name) */ - public void removeInterface( String name ) { + public void removeInterface( final String name ) { interface_vec.remove(name); } @@ -247,7 +247,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** Set major version number of class file, default value is 45 (JDK 1.1) * @param major major version number */ - public void setMajor( int major ) { // TODO could be package-protected - only called by test code + public void setMajor( final int major ) { // TODO could be package-protected - only called by test code this.major = major; } @@ -255,7 +255,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** Set minor version number of class file, default value is 3 (JDK 1.1) * @param minor minor version number */ - public void setMinor( int minor ) { // TODO could be package-protected - only called by test code + public void setMinor( final int minor ) { // TODO could be package-protected - only called by test code this.minor = minor; } @@ -271,11 +271,11 @@ public class ClassGen extends AccessFlags implements Cloneable { * Add an attribute to this class. * @param a attribute to add */ - public void addAttribute( Attribute a ) { + public void addAttribute( final Attribute a ) { attribute_vec.add(a); } - public void addAnnotationEntry(AnnotationEntryGen a) { + public void addAnnotationEntry(final AnnotationEntryGen a) { annotation_vec.add(a); } @@ -284,7 +284,7 @@ public class ClassGen extends AccessFlags implements Cloneable { * Add a method to this class. * @param m method to add */ - public void addMethod( Method m ) { + public void addMethod( final Method m ) { method_vec.add(m); } @@ -295,7 +295,7 @@ public class ClassGen extends AccessFlags implements Cloneable { * Add an empty constructor to this class that does nothing but calling super(). * @param access_flags rights for constructor */ - public void addEmptyConstructor( int access_flags ) { + public void addEmptyConstructor( final int access_flags ) { InstructionList il = new InstructionList(); il.append(InstructionConst.THIS); // Push `this' il.append(new INVOKESPECIAL(cp.addMethodref(super_class_name, "", "()V"))); @@ -311,19 +311,19 @@ public class ClassGen extends AccessFlags implements Cloneable { * Add a field to this class. * @param f field to add */ - public void addField( Field f ) { + public void addField( final Field f ) { field_vec.add(f); } - public boolean containsField( Field f ) { + public boolean containsField( final Field f ) { return field_vec.contains(f); } /** @return field object with given name, or null */ - public Field containsField( String name ) { + public Field containsField( final String name ) { for (Field f : field_vec) { if (f.getName().equals(name)) { return f; @@ -335,7 +335,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** @return method object with given name and signature, or null */ - public Method containsMethod( String name, String signature ) { + public Method containsMethod( final String name, final String signature ) { for (Method m : method_vec) { if (m.getName().equals(name) && m.getSignature().equals(signature)) { return m; @@ -349,7 +349,7 @@ public class ClassGen extends AccessFlags implements Cloneable { * Remove an attribute from this class. * @param a attribute to remove */ - public void removeAttribute( Attribute a ) { + public void removeAttribute( final Attribute a ) { attribute_vec.remove(a); } @@ -358,7 +358,7 @@ public class ClassGen extends AccessFlags implements Cloneable { * Remove a method from this class. * @param m method to remove */ - public void removeMethod( Method m ) { + public void removeMethod( final Method m ) { method_vec.remove(m); } @@ -366,7 +366,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** Replace given method with new one. If the old one does not exist * add the new_ method to the class anyway. */ - public void replaceMethod( Method old, Method new_ ) { + public void replaceMethod( final Method old, final Method new_ ) { if (new_ == null) { throw new ClassGenException("Replacement method must not be null"); } @@ -382,7 +382,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** Replace given field with new one. If the old one does not exist * add the new_ field to the class anyway. */ - public void replaceField( Field old, Field new_ ) { + public void replaceField( final Field old, final Field new_ ) { if (new_ == null) { throw new ClassGenException("Replacement method must not be null"); } @@ -399,7 +399,7 @@ public class ClassGen extends AccessFlags implements Cloneable { * Remove a field to this class. * @param f field to remove */ - public void removeField( Field f ) { + public void removeField( final Field f ) { field_vec.remove(f); } @@ -419,13 +419,13 @@ public class ClassGen extends AccessFlags implements Cloneable { } - public void setClassName( String name ) { + public void setClassName( final String name ) { class_name = name.replace('/', '.'); class_name_index = cp.addClass(name); } - public void setSuperclassName( String name ) { + public void setSuperclassName( final String name ) { super_class_name = name.replace('/', '.'); superclass_name_index = cp.addClass(name); } @@ -436,7 +436,7 @@ public class ClassGen extends AccessFlags implements Cloneable { } - public void setMethods( Method[] methods ) { + public void setMethods( final Method[] methods ) { method_vec.clear(); for (Method method : methods) { addMethod(method); @@ -444,12 +444,12 @@ public class ClassGen extends AccessFlags implements Cloneable { } - public void setMethodAt( Method method, int pos ) { + public void setMethodAt( final Method method, final int pos ) { method_vec.set(pos, method); } - public Method getMethodAt( int pos ) { + public Method getMethodAt( final int pos ) { return method_vec.get(pos); } @@ -492,19 +492,19 @@ public class ClassGen extends AccessFlags implements Cloneable { } - public void setConstantPool( ConstantPoolGen constant_pool ) { + public void setConstantPool( final ConstantPoolGen constant_pool ) { cp = constant_pool; } - public void setClassNameIndex( int class_name_index ) { + public void setClassNameIndex( final int class_name_index ) { this.class_name_index = class_name_index; class_name = cp.getConstantPool().getConstantString(class_name_index, Const.CONSTANT_Class).replace('/', '.'); } - public void setSuperclassNameIndex( int superclass_name_index ) { + public void setSuperclassNameIndex( final int superclass_name_index ) { this.superclass_name_index = superclass_name_index; super_class_name = cp.getConstantPool().getConstantString(superclass_name_index, Const.CONSTANT_Class).replace('/', '.'); @@ -525,7 +525,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** Add observer for this object. */ - public void addObserver( ClassObserver o ) { + public void addObserver( final ClassObserver o ) { if (observers == null) { observers = new ArrayList<>(); } @@ -535,7 +535,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** Remove observer for this object. */ - public void removeObserver( ClassObserver o ) { + public void removeObserver( final ClassObserver o ) { if (observers != null) { observers.remove(o); } @@ -576,7 +576,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** * @param comparator Comparison strategy object */ - public static void setComparator( BCELComparator comparator ) { + public static void setComparator( final BCELComparator comparator ) { _cmp = comparator; } @@ -589,7 +589,7 @@ public class ClassGen extends AccessFlags implements Cloneable { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals( Object obj ) { + public boolean equals( final Object obj ) { return _cmp.equals(this, obj); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java b/src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java index e28cc790..9fb99bf3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java @@ -32,11 +32,11 @@ public class ClassGenException extends RuntimeException { } - public ClassGenException(String s) { + public ClassGenException(final String s) { super(s); } - public ClassGenException(String s, Throwable initCause) { + public ClassGenException(final String s, final Throwable initCause) { super(s, initCause); } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java index 2c326163..0545de4d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java @@ -50,8 +50,8 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable { * @param handler_pc Where handling is done * @param catch_type which exception is handled, null for ANY */ - public CodeExceptionGen(InstructionHandle start_pc, InstructionHandle end_pc, - InstructionHandle handler_pc, ObjectType catch_type) { + public CodeExceptionGen(final InstructionHandle start_pc, final InstructionHandle end_pc, + final InstructionHandle handler_pc, final ObjectType catch_type) { setStartPC(start_pc); setEndPC(end_pc); setHandlerPC(handler_pc); @@ -68,7 +68,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable { * * @param cp constant pool */ - public CodeException getCodeException( ConstantPoolGen cp ) { + public CodeException getCodeException( final ConstantPoolGen cp ) { return new CodeException(start_pc.getPosition(), end_pc.getPosition() + end_pc.getInstruction().getLength(), handler_pc.getPosition(), (catch_type == null) ? 0 : cp.addClass(catch_type)); @@ -78,7 +78,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable { /* Set start of handler * @param start_pc Start of handled region (inclusive) */ - public void setStartPC( InstructionHandle start_pc ) { // TODO could be package-protected? + public void setStartPC( final InstructionHandle start_pc ) { // TODO could be package-protected? BranchInstruction.notifyTarget(this.start_pc, start_pc, this); this.start_pc = start_pc; } @@ -87,7 +87,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable { /* Set end of handler * @param end_pc End of handled region (inclusive) */ - public void setEndPC( InstructionHandle end_pc ) { // TODO could be package-protected? + public void setEndPC( final InstructionHandle end_pc ) { // TODO could be package-protected? BranchInstruction.notifyTarget(this.end_pc, end_pc, this); this.end_pc = end_pc; } @@ -96,7 +96,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable { /* Set handler code * @param handler_pc Start of handler */ - public void setHandlerPC( InstructionHandle handler_pc ) { // TODO could be package-protected? + public void setHandlerPC( final InstructionHandle handler_pc ) { // TODO could be package-protected? BranchInstruction.notifyTarget(this.handler_pc, handler_pc, this); this.handler_pc = handler_pc; } @@ -107,7 +107,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable { * @param new_ih new target */ @Override - public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { + public void updateTarget( final InstructionHandle old_ih, final InstructionHandle new_ih ) { boolean targeted = false; if (start_pc == old_ih) { targeted = true; @@ -132,13 +132,13 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable { * @return true, if ih is target of this handler */ @Override - public boolean containsTarget( InstructionHandle ih ) { + public boolean containsTarget( final InstructionHandle ih ) { return (start_pc == ih) || (end_pc == ih) || (handler_pc == ih); } /** Sets the type of the Exception to catch. Set 'null' for ANY. */ - public void setCatchType( ObjectType catch_type ) { + public void setCatchType( final ObjectType catch_type ) { this.catch_type = catch_type; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java index 93ee0c8f..1da7d4f2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java @@ -82,7 +82,7 @@ public class ConstantPoolGen { final int index; - Index(int i) { + Index(final int i) { index = i; } } @@ -93,7 +93,7 @@ public class ConstantPoolGen { * * @param cs array of given constants, new ones will be appended */ - public ConstantPoolGen(Constant[] cs) { + public ConstantPoolGen(final Constant[] cs) { StringBuilder sb = new StringBuilder(DEFAULT_BUFFER_SIZE); size = Math.max(DEFAULT_BUFFER_SIZE, cs.length + 64); @@ -204,7 +204,7 @@ public class ConstantPoolGen { /** * Initialize with given constant pool. */ - public ConstantPoolGen(ConstantPool cp) { + public ConstantPoolGen(final ConstantPool cp) { this(cp.getConstantPool()); } @@ -238,7 +238,7 @@ public class ConstantPoolGen { * @param str String to search for * @return index on success, -1 otherwise */ - public int lookupString( String str ) { + public int lookupString( final String str ) { Index index = string_table.get(str); return (index != null) ? index.index : -1; } @@ -250,7 +250,7 @@ public class ConstantPoolGen { * @param str String to add * @return index of entry */ - public int addString( String str ) { + public int addString( final String str ) { int ret; if ((ret = lookupString(str)) != -1) { return ret; // Already in CP @@ -275,13 +275,13 @@ public class ConstantPoolGen { * @param str String to search for * @return index on success, -1 otherwise */ - public int lookupClass( String str ) { + public int lookupClass( final String str ) { Index index = class_table.get(str.replace('.', '/')); return (index != null) ? index.index : -1; } - private int addClass_( String clazz ) { + private int addClass_( final String clazz ) { int ret; if ((ret = lookupClass(clazz)) != -1) { return ret; // Already in CP @@ -303,7 +303,7 @@ public class ConstantPoolGen { * @param str Class to add * @return index of entry */ - public int addClass( String str ) { + public int addClass( final String str ) { return addClass_(str.replace('.', '/')); } @@ -314,7 +314,7 @@ public class ConstantPoolGen { * @param type Class to add * @return index of entry */ - public int addClass( ObjectType type ) { + public int addClass( final ObjectType type ) { return addClass(type.getClassName()); } @@ -326,7 +326,7 @@ public class ConstantPoolGen { * @param type type of array class * @return index of entry */ - public int addArrayClass( ArrayType type ) { + public int addArrayClass( final ArrayType type ) { return addClass_(type.getSignature()); } @@ -337,7 +337,7 @@ public class ConstantPoolGen { * @param n integer number to look for * @return index on success, -1 otherwise */ - public int lookupInteger( int n ) { + public int lookupInteger( final int n ) { for (int i = 1; i < index; i++) { if (constants[i] instanceof ConstantInteger) { ConstantInteger c = (ConstantInteger) constants[i]; @@ -356,7 +356,7 @@ public class ConstantPoolGen { * @param n integer number to add * @return index of entry */ - public int addInteger( int n ) { + public int addInteger( final int n ) { int ret; if ((ret = lookupInteger(n)) != -1) { return ret; // Already in CP @@ -374,7 +374,7 @@ public class ConstantPoolGen { * @param n Float number to look for * @return index on success, -1 otherwise */ - public int lookupFloat( float n ) { + public int lookupFloat( final float n ) { int bits = Float.floatToIntBits(n); for (int i = 1; i < index; i++) { if (constants[i] instanceof ConstantFloat) { @@ -394,7 +394,7 @@ public class ConstantPoolGen { * @param n Float number to add * @return index of entry */ - public int addFloat( float n ) { + public int addFloat( final float n ) { int ret; if ((ret = lookupFloat(n)) != -1) { return ret; // Already in CP @@ -414,7 +414,7 @@ public class ConstantPoolGen { * @param n Utf8 string to look for * @return index on success, -1 otherwise */ - public int lookupUtf8( String n ) { + public int lookupUtf8( final String n ) { Index index = utf8_table.get(n); return (index != null) ? index.index : -1; } @@ -426,7 +426,7 @@ public class ConstantPoolGen { * @param n Utf8 string to add * @return index of entry */ - public int addUtf8( String n ) { + public int addUtf8( final String n ) { int ret; if ((ret = lookupUtf8(n)) != -1) { return ret; // Already in CP @@ -447,7 +447,7 @@ public class ConstantPoolGen { * @param n Long number to look for * @return index on success, -1 otherwise */ - public int lookupLong( long n ) { + public int lookupLong( final long n ) { for (int i = 1; i < index; i++) { if (constants[i] instanceof ConstantLong) { ConstantLong c = (ConstantLong) constants[i]; @@ -466,7 +466,7 @@ public class ConstantPoolGen { * @param n Long number to add * @return index of entry */ - public int addLong( long n ) { + public int addLong( final long n ) { int ret; if ((ret = lookupLong(n)) != -1) { return ret; // Already in CP @@ -485,7 +485,7 @@ public class ConstantPoolGen { * @param n Double number to look for * @return index on success, -1 otherwise */ - public int lookupDouble( double n ) { + public int lookupDouble( final double n ) { long bits = Double.doubleToLongBits(n); for (int i = 1; i < index; i++) { if (constants[i] instanceof ConstantDouble) { @@ -505,7 +505,7 @@ public class ConstantPoolGen { * @param n Double number to add * @return index of entry */ - public int addDouble( double n ) { + public int addDouble( final double n ) { int ret; if ((ret = lookupDouble(n)) != -1) { return ret; // Already in CP @@ -527,7 +527,7 @@ public class ConstantPoolGen { * @param signature of variable/method * @return index on success, -1 otherwise */ - public int lookupNameAndType( String name, String signature ) { + public int lookupNameAndType( final String name, final String signature ) { Index _index = n_a_t_table.get(name + NAT_DELIM + signature); return (_index != null) ? _index.index : -1; } @@ -541,7 +541,7 @@ public class ConstantPoolGen { * @param signature signature string to add * @return index of entry */ - public int addNameAndType( String name, String signature ) { + public int addNameAndType( final String name, final String signature ) { int ret; int name_index; int signature_index; @@ -571,14 +571,14 @@ public class ConstantPoolGen { * @param signature return and argument types * @return index on success, -1 otherwise */ - public int lookupMethodref( String class_name, String method_name, String signature ) { + public int lookupMethodref( final String class_name, final String method_name, final String signature ) { Index index = cp_table.get(class_name + METHODREF_DELIM + method_name + METHODREF_DELIM + signature); return (index != null) ? index.index : -1; } - public int lookupMethodref( MethodGen method ) { + public int lookupMethodref( final MethodGen method ) { return lookupMethodref(method.getClassName(), method.getName(), method.getSignature()); } @@ -592,7 +592,7 @@ public class ConstantPoolGen { * @param signature method signature string to add * @return index of entry */ - public int addMethodref( String class_name, String method_name, String signature ) { + public int addMethodref( final String class_name, final String method_name, final String signature ) { int ret; int class_index; int name_and_type_index; @@ -612,7 +612,7 @@ public class ConstantPoolGen { } - public int addMethodref( MethodGen method ) { + public int addMethodref( final MethodGen method ) { return addMethodref(method.getClassName(), method.getName(), method.getSignature()); } @@ -625,14 +625,14 @@ public class ConstantPoolGen { * @param signature return and argument types * @return index on success, -1 otherwise */ - public int lookupInterfaceMethodref( String class_name, String method_name, String signature ) { + public int lookupInterfaceMethodref( final String class_name, final String method_name, final String signature ) { Index index = cp_table.get(class_name + IMETHODREF_DELIM + method_name + IMETHODREF_DELIM + signature); return (index != null) ? index.index : -1; } - public int lookupInterfaceMethodref( MethodGen method ) { + public int lookupInterfaceMethodref( final MethodGen method ) { return lookupInterfaceMethodref(method.getClassName(), method.getName(), method .getSignature()); } @@ -647,7 +647,7 @@ public class ConstantPoolGen { * @param signature signature string to add * @return index of entry */ - public int addInterfaceMethodref( String class_name, String method_name, String signature ) { + public int addInterfaceMethodref( final String class_name, final String method_name, final String signature ) { int ret; int class_index; int name_and_type_index; @@ -667,7 +667,7 @@ public class ConstantPoolGen { } - public int addInterfaceMethodref( MethodGen method ) { + public int addInterfaceMethodref( final MethodGen method ) { return addInterfaceMethodref(method.getClassName(), method.getName(), method.getSignature()); } @@ -680,7 +680,7 @@ public class ConstantPoolGen { * @param signature return and argument types * @return index on success, -1 otherwise */ - public int lookupFieldref( String class_name, String field_name, String signature ) { + public int lookupFieldref( final String class_name, final String field_name, final String signature ) { Index index = cp_table.get(class_name + FIELDREF_DELIM + field_name + FIELDREF_DELIM + signature); return (index != null) ? index.index : -1; @@ -696,7 +696,7 @@ public class ConstantPoolGen { * @param signature signature string to add * @return index of entry */ - public int addFieldref( String class_name, String field_name, String signature ) { + public int addFieldref( final String class_name, final String field_name, final String signature ) { int ret; int class_index; int name_and_type_index; @@ -720,7 +720,7 @@ public class ConstantPoolGen { * @param i index in constant pool * @return constant pool entry at index i */ - public Constant getConstant( int i ) { + public Constant getConstant( final int i ) { return constants[i]; } @@ -731,7 +731,7 @@ public class ConstantPoolGen { * @param i index in constant pool * @param c new constant pool entry at index i */ - public void setConstant( int i, Constant c ) { + public void setConstant( final int i, final Constant c ) { constants[i] = c; } @@ -777,7 +777,7 @@ public class ConstantPoolGen { /** Import constant from another ConstantPool and return new index. */ - public int addConstant( Constant c, ConstantPoolGen cp ) { + public int addConstant( final Constant c, final ConstantPoolGen cp ) { Constant[] constants = cp.getConstantPool().getConstantPool(); switch (c.getTag()) { case Const.CONSTANT_String: { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java index 04acff45..a55a9377 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java @@ -38,7 +38,7 @@ public abstract class ConversionInstruction extends Instruction implements Typed /** * @param opcode opcode of instruction */ - protected ConversionInstruction(short opcode) { + protected ConversionInstruction(final short opcode) { super(opcode, (short) 1); } @@ -46,7 +46,7 @@ public abstract class ConversionInstruction extends Instruction implements Typed /** @return type associated with the instruction */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { final short _opcode = super.getOpcode(); switch (_opcode) { case Const.D2I: diff --git a/src/main/java/org/apache/commons/bcel6/generic/D2F.java b/src/main/java/org/apache/commons/bcel6/generic/D2F.java index 789184b6..761e5756 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/D2F.java +++ b/src/main/java/org/apache/commons/bcel6/generic/D2F.java @@ -41,7 +41,7 @@ public class D2F extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/D2I.java b/src/main/java/org/apache/commons/bcel6/generic/D2I.java index 9a4c0413..a53ee054 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/D2I.java +++ b/src/main/java/org/apache/commons/bcel6/generic/D2I.java @@ -41,7 +41,7 @@ public class D2I extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/D2L.java b/src/main/java/org/apache/commons/bcel6/generic/D2L.java index 0bd615ed..2c7053c7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/D2L.java +++ b/src/main/java/org/apache/commons/bcel6/generic/D2L.java @@ -41,7 +41,7 @@ public class D2L extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DADD.java b/src/main/java/org/apache/commons/bcel6/generic/DADD.java index 71da344a..eb04b225 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DADD.java @@ -42,7 +42,7 @@ public class DADD extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java index 1b6cafbb..bcfff504 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java @@ -41,7 +41,7 @@ public class DALOAD extends ArrayInstruction implements StackProducer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java index 85106d73..3122f1bb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java @@ -41,7 +41,7 @@ public class DASTORE extends ArrayInstruction implements StackConsumer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java b/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java index 9395d112..d658dc5c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java @@ -32,7 +32,7 @@ public class DCMPG extends Instruction implements TypedInstruction, StackProduce /** @return Type.DOUBLE */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.DOUBLE; } @@ -45,7 +45,7 @@ public class DCMPG extends Instruction implements TypedInstruction, StackProduce * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java b/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java index 1fcded45..49037da3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java @@ -32,7 +32,7 @@ public class DCMPL extends Instruction implements TypedInstruction, StackProduce /** @return Type.DOUBLE */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.DOUBLE; } @@ -45,7 +45,7 @@ public class DCMPL extends Instruction implements TypedInstruction, StackProduce * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCONST.java b/src/main/java/org/apache/commons/bcel6/generic/DCONST.java index e97b1461..e1ae0966 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DCONST.java @@ -37,7 +37,7 @@ public class DCONST extends Instruction implements ConstantPushInstruction { } - public DCONST(double f) { + public DCONST(final double f) { super(org.apache.commons.bcel6.Const.DCONST_0, (short) 1); if (f == 0.0) { super.setOpcode(org.apache.commons.bcel6.Const.DCONST_0); @@ -59,7 +59,7 @@ public class DCONST extends Instruction implements ConstantPushInstruction { /** @return Type.DOUBLE */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.DOUBLE; } @@ -73,7 +73,7 @@ public class DCONST extends Instruction implements ConstantPushInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitPushInstruction(this); v.visitStackProducer(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DDIV.java b/src/main/java/org/apache/commons/bcel6/generic/DDIV.java index 5c1ef461..ee83a6e7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DDIV.java @@ -42,7 +42,7 @@ public class DDIV extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java b/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java index 6e31accf..a8507ba3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java @@ -37,7 +37,7 @@ public class DLOAD extends LoadInstruction { /** Load double from local variable * @param n index of local variable */ - public DLOAD(int n) { + public DLOAD(final int n) { super(org.apache.commons.bcel6.Const.DLOAD, org.apache.commons.bcel6.Const.DLOAD_0, n); } @@ -51,7 +51,7 @@ public class DLOAD extends LoadInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { super.accept(v); v.visitDLOAD(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DMUL.java b/src/main/java/org/apache/commons/bcel6/generic/DMUL.java index 1d1312a9..6b7697af 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DMUL.java @@ -42,7 +42,7 @@ public class DMUL extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DNEG.java b/src/main/java/org/apache/commons/bcel6/generic/DNEG.java index 4eff449d..6d579a45 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DNEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DNEG.java @@ -39,7 +39,7 @@ public class DNEG extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DREM.java b/src/main/java/org/apache/commons/bcel6/generic/DREM.java index cd8ce77e..0c9db68d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DREM.java @@ -42,7 +42,7 @@ public class DREM extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java index 47f160b3..5838b37f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java @@ -41,7 +41,7 @@ public class DRETURN extends ReturnInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java b/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java index 82df4201..118468e4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java @@ -37,7 +37,7 @@ public class DSTORE extends StoreInstruction { /** Store double into local variable * @param n index of local variable */ - public DSTORE(int n) { + public DSTORE(final int n) { super(org.apache.commons.bcel6.Const.DSTORE, org.apache.commons.bcel6.Const.DSTORE_0, n); } @@ -51,7 +51,7 @@ public class DSTORE extends StoreInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { super.accept(v); v.visitDSTORE(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DSUB.java b/src/main/java/org/apache/commons/bcel6/generic/DSUB.java index 55dd042c..7072c3d8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DSUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DSUB.java @@ -42,7 +42,7 @@ public class DSUB extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP.java b/src/main/java/org/apache/commons/bcel6/generic/DUP.java index b1111756..82d697f5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP.java @@ -39,7 +39,7 @@ public class DUP extends StackInstruction implements PushInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); v.visitStackInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP2.java b/src/main/java/org/apache/commons/bcel6/generic/DUP2.java index 104b02dd..29c4cc62 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP2.java @@ -39,7 +39,7 @@ public class DUP2 extends StackInstruction implements PushInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); v.visitStackInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java index ec52d132..9a62c5ff 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java @@ -39,7 +39,7 @@ public class DUP2_X1 extends StackInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackInstruction(this); v.visitDUP2_X1(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java index 95ee015b..d19e0334 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java @@ -39,7 +39,7 @@ public class DUP2_X2 extends StackInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackInstruction(this); v.visitDUP2_X2(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java b/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java index 9c8e1a0a..bc4ed527 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java @@ -39,7 +39,7 @@ public class DUP_X1 extends StackInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackInstruction(this); v.visitDUP_X1(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java b/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java index bfff4e9f..025a3f02 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java @@ -39,7 +39,7 @@ public class DUP_X2 extends StackInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackInstruction(this); v.visitDUP_X2(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java index c7b754ae..e34a9dda 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java @@ -46,7 +46,7 @@ public abstract class ElementValueGen @Deprecated protected ConstantPoolGen cpGen; - protected ElementValueGen(int type, ConstantPoolGen cpGen) + protected ElementValueGen(final int type, final ConstantPoolGen cpGen) { this.type = type; this.cpGen = cpGen; @@ -92,8 +92,8 @@ public abstract class ElementValueGen public static final int PRIMITIVE_BOOLEAN = 'Z'; - public static ElementValueGen readElementValue(DataInput dis, - ConstantPoolGen cpGen) throws IOException + public static ElementValueGen readElementValue(final DataInput dis, + final ConstantPoolGen cpGen) throws IOException { int type = dis.readUnsignedByte(); switch (type) @@ -159,8 +159,8 @@ public abstract class ElementValueGen * Creates an (modifiable) ElementValueGen copy of an (immutable) * ElementValue - constant pool is assumed correct. */ - public static ElementValueGen copy(ElementValue value, - ConstantPoolGen cpool, boolean copyPoolEntries) + public static ElementValueGen copy(final ElementValue value, + final ConstantPoolGen cpool, final boolean copyPoolEntries) { switch (value.getElementValueType()) { diff --git a/src/main/java/org/apache/commons/bcel6/generic/ElementValuePairGen.java b/src/main/java/org/apache/commons/bcel6/generic/ElementValuePairGen.java index 187f6c0b..1af7c4f3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ElementValuePairGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ElementValuePairGen.java @@ -35,8 +35,8 @@ public class ElementValuePairGen private final ConstantPoolGen cpool; - public ElementValuePairGen(ElementValuePair nvp, ConstantPoolGen cpool, - boolean copyPoolEntries) + public ElementValuePairGen(final ElementValuePair nvp, final ConstantPoolGen cpool, + final boolean copyPoolEntries) { this.cpool = cpool; // J5ASSERT: @@ -68,23 +68,23 @@ public class ElementValuePairGen .getConstantPool()); } - protected ElementValuePairGen(int idx, ElementValueGen value, - ConstantPoolGen cpool) + protected ElementValuePairGen(final int idx, final ElementValueGen value, + final ConstantPoolGen cpool) { this.nameIdx = idx; this.value = value; this.cpool = cpool; } - public ElementValuePairGen(String name, ElementValueGen value, - ConstantPoolGen cpool) + public ElementValuePairGen(final String name, final ElementValueGen value, + final ConstantPoolGen cpool) { this.nameIdx = cpool.addUtf8(name); this.value = value; this.cpool = cpool; } - protected void dump(DataOutputStream dos) throws IOException + protected void dump(final DataOutputStream dos) throws IOException { dos.writeShort(nameIdx); // u2 name of the element value.dump(dos); diff --git a/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java b/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java index 7b58f4d2..74c33503 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java @@ -25,908 +25,908 @@ package org.apache.commons.bcel6.generic; public abstract class EmptyVisitor implements Visitor { @Override - public void visitStackInstruction( StackInstruction obj ) { + public void visitStackInstruction( final StackInstruction obj ) { } @Override - public void visitLocalVariableInstruction( LocalVariableInstruction obj ) { + public void visitLocalVariableInstruction( final LocalVariableInstruction obj ) { } @Override - public void visitBranchInstruction( BranchInstruction obj ) { + public void visitBranchInstruction( final BranchInstruction obj ) { } @Override - public void visitLoadClass( LoadClass obj ) { + public void visitLoadClass( final LoadClass obj ) { } @Override - public void visitFieldInstruction( FieldInstruction obj ) { + public void visitFieldInstruction( final FieldInstruction obj ) { } @Override - public void visitIfInstruction( IfInstruction obj ) { + public void visitIfInstruction( final IfInstruction obj ) { } @Override - public void visitConversionInstruction( ConversionInstruction obj ) { + public void visitConversionInstruction( final ConversionInstruction obj ) { } @Override - public void visitPopInstruction( PopInstruction obj ) { + public void visitPopInstruction( final PopInstruction obj ) { } @Override - public void visitJsrInstruction( JsrInstruction obj ) { + public void visitJsrInstruction( final JsrInstruction obj ) { } @Override - public void visitGotoInstruction( GotoInstruction obj ) { + public void visitGotoInstruction( final GotoInstruction obj ) { } @Override - public void visitStoreInstruction( StoreInstruction obj ) { + public void visitStoreInstruction( final StoreInstruction obj ) { } @Override - public void visitTypedInstruction( TypedInstruction obj ) { + public void visitTypedInstruction( final TypedInstruction obj ) { } @Override - public void visitSelect( Select obj ) { + public void visitSelect( final Select obj ) { } @Override - public void visitUnconditionalBranch( UnconditionalBranch obj ) { + public void visitUnconditionalBranch( final UnconditionalBranch obj ) { } @Override - public void visitPushInstruction( PushInstruction obj ) { + public void visitPushInstruction( final PushInstruction obj ) { } @Override - public void visitArithmeticInstruction( ArithmeticInstruction obj ) { + public void visitArithmeticInstruction( final ArithmeticInstruction obj ) { } @Override - public void visitCPInstruction( CPInstruction obj ) { + public void visitCPInstruction( final CPInstruction obj ) { } @Override - public void visitInvokeInstruction( InvokeInstruction obj ) { + public void visitInvokeInstruction( final InvokeInstruction obj ) { } @Override - public void visitArrayInstruction( ArrayInstruction obj ) { + public void visitArrayInstruction( final ArrayInstruction obj ) { } @Override - public void visitAllocationInstruction( AllocationInstruction obj ) { + public void visitAllocationInstruction( final AllocationInstruction obj ) { } @Override - public void visitReturnInstruction( ReturnInstruction obj ) { + public void visitReturnInstruction( final ReturnInstruction obj ) { } @Override - public void visitFieldOrMethod( FieldOrMethod obj ) { + public void visitFieldOrMethod( final FieldOrMethod obj ) { } @Override - public void visitConstantPushInstruction( ConstantPushInstruction obj ) { + public void visitConstantPushInstruction( final ConstantPushInstruction obj ) { } @Override - public void visitExceptionThrower( ExceptionThrower obj ) { + public void visitExceptionThrower( final ExceptionThrower obj ) { } @Override - public void visitLoadInstruction( LoadInstruction obj ) { + public void visitLoadInstruction( final LoadInstruction obj ) { } @Override - public void visitVariableLengthInstruction( VariableLengthInstruction obj ) { + public void visitVariableLengthInstruction( final VariableLengthInstruction obj ) { } @Override - public void visitStackProducer( StackProducer obj ) { + public void visitStackProducer( final StackProducer obj ) { } @Override - public void visitStackConsumer( StackConsumer obj ) { + public void visitStackConsumer( final StackConsumer obj ) { } @Override - public void visitACONST_NULL( ACONST_NULL obj ) { + public void visitACONST_NULL( final ACONST_NULL obj ) { } @Override - public void visitGETSTATIC( GETSTATIC obj ) { + public void visitGETSTATIC( final GETSTATIC obj ) { } @Override - public void visitIF_ICMPLT( IF_ICMPLT obj ) { + public void visitIF_ICMPLT( final IF_ICMPLT obj ) { } @Override - public void visitMONITOREXIT( MONITOREXIT obj ) { + public void visitMONITOREXIT( final MONITOREXIT obj ) { } @Override - public void visitIFLT( IFLT obj ) { + public void visitIFLT( final IFLT obj ) { } @Override - public void visitLSTORE( LSTORE obj ) { + public void visitLSTORE( final LSTORE obj ) { } @Override - public void visitPOP2( POP2 obj ) { + public void visitPOP2( final POP2 obj ) { } @Override - public void visitBASTORE( BASTORE obj ) { + public void visitBASTORE( final BASTORE obj ) { } @Override - public void visitISTORE( ISTORE obj ) { + public void visitISTORE( final ISTORE obj ) { } @Override - public void visitCHECKCAST( CHECKCAST obj ) { + public void visitCHECKCAST( final CHECKCAST obj ) { } @Override - public void visitFCMPG( FCMPG obj ) { + public void visitFCMPG( final FCMPG obj ) { } @Override - public void visitI2F( I2F obj ) { + public void visitI2F( final I2F obj ) { } @Override - public void visitATHROW( ATHROW obj ) { + public void visitATHROW( final ATHROW obj ) { } @Override - public void visitDCMPL( DCMPL obj ) { + public void visitDCMPL( final DCMPL obj ) { } @Override - public void visitARRAYLENGTH( ARRAYLENGTH obj ) { + public void visitARRAYLENGTH( final ARRAYLENGTH obj ) { } @Override - public void visitDUP( DUP obj ) { + public void visitDUP( final DUP obj ) { } @Override - public void visitINVOKESTATIC( INVOKESTATIC obj ) { + public void visitINVOKESTATIC( final INVOKESTATIC obj ) { } @Override - public void visitLCONST( LCONST obj ) { + public void visitLCONST( final LCONST obj ) { } @Override - public void visitDREM( DREM obj ) { + public void visitDREM( final DREM obj ) { } @Override - public void visitIFGE( IFGE obj ) { + public void visitIFGE( final IFGE obj ) { } @Override - public void visitCALOAD( CALOAD obj ) { + public void visitCALOAD( final CALOAD obj ) { } @Override - public void visitLASTORE( LASTORE obj ) { + public void visitLASTORE( final LASTORE obj ) { } @Override - public void visitI2D( I2D obj ) { + public void visitI2D( final I2D obj ) { } @Override - public void visitDADD( DADD obj ) { + public void visitDADD( final DADD obj ) { } @Override - public void visitINVOKESPECIAL( INVOKESPECIAL obj ) { + public void visitINVOKESPECIAL( final INVOKESPECIAL obj ) { } @Override - public void visitIAND( IAND obj ) { + public void visitIAND( final IAND obj ) { } @Override - public void visitPUTFIELD( PUTFIELD obj ) { + public void visitPUTFIELD( final PUTFIELD obj ) { } @Override - public void visitILOAD( ILOAD obj ) { + public void visitILOAD( final ILOAD obj ) { } @Override - public void visitDLOAD( DLOAD obj ) { + public void visitDLOAD( final DLOAD obj ) { } @Override - public void visitDCONST( DCONST obj ) { + public void visitDCONST( final DCONST obj ) { } @Override - public void visitNEW( NEW obj ) { + public void visitNEW( final NEW obj ) { } @Override - public void visitIFNULL( IFNULL obj ) { + public void visitIFNULL( final IFNULL obj ) { } @Override - public void visitLSUB( LSUB obj ) { + public void visitLSUB( final LSUB obj ) { } @Override - public void visitL2I( L2I obj ) { + public void visitL2I( final L2I obj ) { } @Override - public void visitISHR( ISHR obj ) { + public void visitISHR( final ISHR obj ) { } @Override - public void visitTABLESWITCH( TABLESWITCH obj ) { + public void visitTABLESWITCH( final TABLESWITCH obj ) { } @Override - public void visitIINC( IINC obj ) { + public void visitIINC( final IINC obj ) { } @Override - public void visitDRETURN( DRETURN obj ) { + public void visitDRETURN( final DRETURN obj ) { } @Override - public void visitFSTORE( FSTORE obj ) { + public void visitFSTORE( final FSTORE obj ) { } @Override - public void visitDASTORE( DASTORE obj ) { + public void visitDASTORE( final DASTORE obj ) { } @Override - public void visitIALOAD( IALOAD obj ) { + public void visitIALOAD( final IALOAD obj ) { } @Override - public void visitDDIV( DDIV obj ) { + public void visitDDIV( final DDIV obj ) { } @Override - public void visitIF_ICMPGE( IF_ICMPGE obj ) { + public void visitIF_ICMPGE( final IF_ICMPGE obj ) { } @Override - public void visitLAND( LAND obj ) { + public void visitLAND( final LAND obj ) { } @Override - public void visitIDIV( IDIV obj ) { + public void visitIDIV( final IDIV obj ) { } @Override - public void visitLOR( LOR obj ) { + public void visitLOR( final LOR obj ) { } @Override - public void visitCASTORE( CASTORE obj ) { + public void visitCASTORE( final CASTORE obj ) { } @Override - public void visitFREM( FREM obj ) { + public void visitFREM( final FREM obj ) { } @Override - public void visitLDC( LDC obj ) { + public void visitLDC( final LDC obj ) { } @Override - public void visitBIPUSH( BIPUSH obj ) { + public void visitBIPUSH( final BIPUSH obj ) { } @Override - public void visitDSTORE( DSTORE obj ) { + public void visitDSTORE( final DSTORE obj ) { } @Override - public void visitF2L( F2L obj ) { + public void visitF2L( final F2L obj ) { } @Override - public void visitFMUL( FMUL obj ) { + public void visitFMUL( final FMUL obj ) { } @Override - public void visitLLOAD( LLOAD obj ) { + public void visitLLOAD( final LLOAD obj ) { } @Override - public void visitJSR( JSR obj ) { + public void visitJSR( final JSR obj ) { } @Override - public void visitFSUB( FSUB obj ) { + public void visitFSUB( final FSUB obj ) { } @Override - public void visitSASTORE( SASTORE obj ) { + public void visitSASTORE( final SASTORE obj ) { } @Override - public void visitALOAD( ALOAD obj ) { + public void visitALOAD( final ALOAD obj ) { } @Override - public void visitDUP2_X2( DUP2_X2 obj ) { + public void visitDUP2_X2( final DUP2_X2 obj ) { } @Override - public void visitRETURN( RETURN obj ) { + public void visitRETURN( final RETURN obj ) { } @Override - public void visitDALOAD( DALOAD obj ) { + public void visitDALOAD( final DALOAD obj ) { } @Override - public void visitSIPUSH( SIPUSH obj ) { + public void visitSIPUSH( final SIPUSH obj ) { } @Override - public void visitDSUB( DSUB obj ) { + public void visitDSUB( final DSUB obj ) { } @Override - public void visitL2F( L2F obj ) { + public void visitL2F( final L2F obj ) { } @Override - public void visitIF_ICMPGT( IF_ICMPGT obj ) { + public void visitIF_ICMPGT( final IF_ICMPGT obj ) { } @Override - public void visitF2D( F2D obj ) { + public void visitF2D( final F2D obj ) { } @Override - public void visitI2L( I2L obj ) { + public void visitI2L( final I2L obj ) { } @Override - public void visitIF_ACMPNE( IF_ACMPNE obj ) { + public void visitIF_ACMPNE( final IF_ACMPNE obj ) { } @Override - public void visitPOP( POP obj ) { + public void visitPOP( final POP obj ) { } @Override - public void visitI2S( I2S obj ) { + public void visitI2S( final I2S obj ) { } @Override - public void visitIFEQ( IFEQ obj ) { + public void visitIFEQ( final IFEQ obj ) { } @Override - public void visitSWAP( SWAP obj ) { + public void visitSWAP( final SWAP obj ) { } @Override - public void visitIOR( IOR obj ) { + public void visitIOR( final IOR obj ) { } @Override - public void visitIREM( IREM obj ) { + public void visitIREM( final IREM obj ) { } @Override - public void visitIASTORE( IASTORE obj ) { + public void visitIASTORE( final IASTORE obj ) { } @Override - public void visitNEWARRAY( NEWARRAY obj ) { + public void visitNEWARRAY( final NEWARRAY obj ) { } @Override - public void visitINVOKEINTERFACE( INVOKEINTERFACE obj ) { + public void visitINVOKEINTERFACE( final INVOKEINTERFACE obj ) { } @Override - public void visitINEG( INEG obj ) { + public void visitINEG( final INEG obj ) { } @Override - public void visitLCMP( LCMP obj ) { + public void visitLCMP( final LCMP obj ) { } @Override - public void visitJSR_W( JSR_W obj ) { + public void visitJSR_W( final JSR_W obj ) { } @Override - public void visitMULTIANEWARRAY( MULTIANEWARRAY obj ) { + public void visitMULTIANEWARRAY( final MULTIANEWARRAY obj ) { } @Override - public void visitDUP_X2( DUP_X2 obj ) { + public void visitDUP_X2( final DUP_X2 obj ) { } @Override - public void visitSALOAD( SALOAD obj ) { + public void visitSALOAD( final SALOAD obj ) { } @Override - public void visitIFNONNULL( IFNONNULL obj ) { + public void visitIFNONNULL( final IFNONNULL obj ) { } @Override - public void visitDMUL( DMUL obj ) { + public void visitDMUL( final DMUL obj ) { } @Override - public void visitIFNE( IFNE obj ) { + public void visitIFNE( final IFNE obj ) { } @Override - public void visitIF_ICMPLE( IF_ICMPLE obj ) { + public void visitIF_ICMPLE( final IF_ICMPLE obj ) { } @Override - public void visitLDC2_W( LDC2_W obj ) { + public void visitLDC2_W( final LDC2_W obj ) { } @Override - public void visitGETFIELD( GETFIELD obj ) { + public void visitGETFIELD( final GETFIELD obj ) { } @Override - public void visitLADD( LADD obj ) { + public void visitLADD( final LADD obj ) { } @Override - public void visitNOP( NOP obj ) { + public void visitNOP( final NOP obj ) { } @Override - public void visitFALOAD( FALOAD obj ) { + public void visitFALOAD( final FALOAD obj ) { } @Override - public void visitINSTANCEOF( INSTANCEOF obj ) { + public void visitINSTANCEOF( final INSTANCEOF obj ) { } @Override - public void visitIFLE( IFLE obj ) { + public void visitIFLE( final IFLE obj ) { } @Override - public void visitLXOR( LXOR obj ) { + public void visitLXOR( final LXOR obj ) { } @Override - public void visitLRETURN( LRETURN obj ) { + public void visitLRETURN( final LRETURN obj ) { } @Override - public void visitFCONST( FCONST obj ) { + public void visitFCONST( final FCONST obj ) { } @Override - public void visitIUSHR( IUSHR obj ) { + public void visitIUSHR( final IUSHR obj ) { } @Override - public void visitBALOAD( BALOAD obj ) { + public void visitBALOAD( final BALOAD obj ) { } @Override - public void visitDUP2( DUP2 obj ) { + public void visitDUP2( final DUP2 obj ) { } @Override - public void visitIF_ACMPEQ( IF_ACMPEQ obj ) { + public void visitIF_ACMPEQ( final IF_ACMPEQ obj ) { } @Override - public void visitIMPDEP1( IMPDEP1 obj ) { + public void visitIMPDEP1( final IMPDEP1 obj ) { } @Override - public void visitMONITORENTER( MONITORENTER obj ) { + public void visitMONITORENTER( final MONITORENTER obj ) { } @Override - public void visitLSHL( LSHL obj ) { + public void visitLSHL( final LSHL obj ) { } @Override - public void visitDCMPG( DCMPG obj ) { + public void visitDCMPG( final DCMPG obj ) { } @Override - public void visitD2L( D2L obj ) { + public void visitD2L( final D2L obj ) { } @Override - public void visitIMPDEP2( IMPDEP2 obj ) { + public void visitIMPDEP2( final IMPDEP2 obj ) { } @Override - public void visitL2D( L2D obj ) { + public void visitL2D( final L2D obj ) { } @Override - public void visitRET( RET obj ) { + public void visitRET( final RET obj ) { } @Override - public void visitIFGT( IFGT obj ) { + public void visitIFGT( final IFGT obj ) { } @Override - public void visitIXOR( IXOR obj ) { + public void visitIXOR( final IXOR obj ) { } @Override - public void visitINVOKEVIRTUAL( INVOKEVIRTUAL obj ) { + public void visitINVOKEVIRTUAL( final INVOKEVIRTUAL obj ) { } @Override - public void visitFASTORE( FASTORE obj ) { + public void visitFASTORE( final FASTORE obj ) { } @Override - public void visitIRETURN( IRETURN obj ) { + public void visitIRETURN( final IRETURN obj ) { } @Override - public void visitIF_ICMPNE( IF_ICMPNE obj ) { + public void visitIF_ICMPNE( final IF_ICMPNE obj ) { } @Override - public void visitFLOAD( FLOAD obj ) { + public void visitFLOAD( final FLOAD obj ) { } @Override - public void visitLDIV( LDIV obj ) { + public void visitLDIV( final LDIV obj ) { } @Override - public void visitPUTSTATIC( PUTSTATIC obj ) { + public void visitPUTSTATIC( final PUTSTATIC obj ) { } @Override - public void visitAALOAD( AALOAD obj ) { + public void visitAALOAD( final AALOAD obj ) { } @Override - public void visitD2I( D2I obj ) { + public void visitD2I( final D2I obj ) { } @Override - public void visitIF_ICMPEQ( IF_ICMPEQ obj ) { + public void visitIF_ICMPEQ( final IF_ICMPEQ obj ) { } @Override - public void visitAASTORE( AASTORE obj ) { + public void visitAASTORE( final AASTORE obj ) { } @Override - public void visitARETURN( ARETURN obj ) { + public void visitARETURN( final ARETURN obj ) { } @Override - public void visitDUP2_X1( DUP2_X1 obj ) { + public void visitDUP2_X1( final DUP2_X1 obj ) { } @Override - public void visitFNEG( FNEG obj ) { + public void visitFNEG( final FNEG obj ) { } @Override - public void visitGOTO_W( GOTO_W obj ) { + public void visitGOTO_W( final GOTO_W obj ) { } @Override - public void visitD2F( D2F obj ) { + public void visitD2F( final D2F obj ) { } @Override - public void visitGOTO( GOTO obj ) { + public void visitGOTO( final GOTO obj ) { } @Override - public void visitISUB( ISUB obj ) { + public void visitISUB( final ISUB obj ) { } @Override - public void visitF2I( F2I obj ) { + public void visitF2I( final F2I obj ) { } @Override - public void visitDNEG( DNEG obj ) { + public void visitDNEG( final DNEG obj ) { } @Override - public void visitICONST( ICONST obj ) { + public void visitICONST( final ICONST obj ) { } @Override - public void visitFDIV( FDIV obj ) { + public void visitFDIV( final FDIV obj ) { } @Override - public void visitI2B( I2B obj ) { + public void visitI2B( final I2B obj ) { } @Override - public void visitLNEG( LNEG obj ) { + public void visitLNEG( final LNEG obj ) { } @Override - public void visitLREM( LREM obj ) { + public void visitLREM( final LREM obj ) { } @Override - public void visitIMUL( IMUL obj ) { + public void visitIMUL( final IMUL obj ) { } @Override - public void visitIADD( IADD obj ) { + public void visitIADD( final IADD obj ) { } @Override - public void visitLSHR( LSHR obj ) { + public void visitLSHR( final LSHR obj ) { } @Override - public void visitLOOKUPSWITCH( LOOKUPSWITCH obj ) { + public void visitLOOKUPSWITCH( final LOOKUPSWITCH obj ) { } @Override - public void visitDUP_X1( DUP_X1 obj ) { + public void visitDUP_X1( final DUP_X1 obj ) { } @Override - public void visitFCMPL( FCMPL obj ) { + public void visitFCMPL( final FCMPL obj ) { } @Override - public void visitI2C( I2C obj ) { + public void visitI2C( final I2C obj ) { } @Override - public void visitLMUL( LMUL obj ) { + public void visitLMUL( final LMUL obj ) { } @Override - public void visitLUSHR( LUSHR obj ) { + public void visitLUSHR( final LUSHR obj ) { } @Override - public void visitISHL( ISHL obj ) { + public void visitISHL( final ISHL obj ) { } @Override - public void visitLALOAD( LALOAD obj ) { + public void visitLALOAD( final LALOAD obj ) { } @Override - public void visitASTORE( ASTORE obj ) { + public void visitASTORE( final ASTORE obj ) { } @Override - public void visitANEWARRAY( ANEWARRAY obj ) { + public void visitANEWARRAY( final ANEWARRAY obj ) { } @Override - public void visitFRETURN( FRETURN obj ) { + public void visitFRETURN( final FRETURN obj ) { } @Override - public void visitFADD( FADD obj ) { + public void visitFADD( final FADD obj ) { } @Override - public void visitBREAKPOINT( BREAKPOINT obj ) { + public void visitBREAKPOINT( final BREAKPOINT obj ) { } /** * @since 6.0 */ @Override - public void visitINVOKEDYNAMIC(INVOKEDYNAMIC obj) { + public void visitINVOKEDYNAMIC(final INVOKEDYNAMIC obj) { } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java index f1d8eebe..6ed33b16 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java @@ -39,8 +39,8 @@ public class EnumElementValueGen extends ElementValueGen * value - as indicated by typeIdx and valueIdx. This ctor is used for * deserialization */ - protected EnumElementValueGen(int typeIdx, int valueIdx, - ConstantPoolGen cpool) + protected EnumElementValueGen(final int typeIdx, final int valueIdx, + final ConstantPoolGen cpool) { super(ElementValueGen.ENUM_CONSTANT, cpool); if (super.getElementValueType() != ENUM_CONSTANT) { @@ -63,15 +63,15 @@ public class EnumElementValueGen extends ElementValueGen getConstantPool().getConstantPool()); } - public EnumElementValueGen(ObjectType t, String value, ConstantPoolGen cpool) + public EnumElementValueGen(final ObjectType t, final String value, final ConstantPoolGen cpool) { super(ElementValueGen.ENUM_CONSTANT, cpool); typeIdx = cpool.addUtf8(t.getSignature());// was addClass(t); valueIdx = cpool.addUtf8(value);// was addString(value); } - public EnumElementValueGen(EnumElementValue value, ConstantPoolGen cpool, - boolean copyPoolEntries) + public EnumElementValueGen(final EnumElementValue value, final ConstantPoolGen cpool, + final boolean copyPoolEntries) { super(ENUM_CONSTANT, cpool); if (copyPoolEntries) @@ -89,7 +89,7 @@ public class EnumElementValueGen extends ElementValueGen } @Override - public void dump(DataOutputStream dos) throws IOException + public void dump(final DataOutputStream dos) throws IOException { dos.writeByte(super.getElementValueType()); // u1 type of value (ENUM_CONSTANT == 'e') dos.writeShort(typeIdx); // u2 diff --git a/src/main/java/org/apache/commons/bcel6/generic/F2D.java b/src/main/java/org/apache/commons/bcel6/generic/F2D.java index 3c16778f..04f3d601 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/F2D.java +++ b/src/main/java/org/apache/commons/bcel6/generic/F2D.java @@ -41,7 +41,7 @@ public class F2D extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/F2I.java b/src/main/java/org/apache/commons/bcel6/generic/F2I.java index 95763d26..67329334 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/F2I.java +++ b/src/main/java/org/apache/commons/bcel6/generic/F2I.java @@ -41,7 +41,7 @@ public class F2I extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/F2L.java b/src/main/java/org/apache/commons/bcel6/generic/F2L.java index a5f36e6d..dd140be2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/F2L.java +++ b/src/main/java/org/apache/commons/bcel6/generic/F2L.java @@ -41,7 +41,7 @@ public class F2L extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FADD.java b/src/main/java/org/apache/commons/bcel6/generic/FADD.java index 6e5d40a3..bbb902ea 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FADD.java @@ -41,7 +41,7 @@ public class FADD extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java index bda096ca..c5d1ee13 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java @@ -41,7 +41,7 @@ public class FALOAD extends ArrayInstruction implements StackProducer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java index 657fd0e8..1763b32d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java @@ -41,7 +41,7 @@ public class FASTORE extends ArrayInstruction implements StackConsumer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java b/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java index 7c41d41e..ef86bde6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java @@ -33,7 +33,7 @@ public class FCMPG extends Instruction implements TypedInstruction, StackProduce /** @return Type.FLOAT */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.FLOAT; } @@ -47,7 +47,7 @@ public class FCMPG extends Instruction implements TypedInstruction, StackProduce * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java b/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java index 9a051c0d..70f971a2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java @@ -33,7 +33,7 @@ public class FCMPL extends Instruction implements TypedInstruction, StackProduce /** @return Type.FLOAT */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.FLOAT; } @@ -47,7 +47,7 @@ public class FCMPL extends Instruction implements TypedInstruction, StackProduce * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCONST.java b/src/main/java/org/apache/commons/bcel6/generic/FCONST.java index 2302cb58..561b9014 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FCONST.java @@ -37,7 +37,7 @@ public class FCONST extends Instruction implements ConstantPushInstruction { } - public FCONST(float f) { + public FCONST(final float f) { super(org.apache.commons.bcel6.Const.FCONST_0, (short) 1); if (f == 0.0) { super.setOpcode(org.apache.commons.bcel6.Const.FCONST_0); @@ -61,7 +61,7 @@ public class FCONST extends Instruction implements ConstantPushInstruction { /** @return Type.FLOAT */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.FLOAT; } @@ -75,7 +75,7 @@ public class FCONST extends Instruction implements ConstantPushInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitPushInstruction(this); v.visitStackProducer(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FDIV.java b/src/main/java/org/apache/commons/bcel6/generic/FDIV.java index f652e37f..f83659a0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FDIV.java @@ -41,7 +41,7 @@ public class FDIV extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java b/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java index 944d1a7c..614295ed 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java @@ -37,7 +37,7 @@ public class FLOAD extends LoadInstruction { /** Load float from local variable * @param n index of local variable */ - public FLOAD(int n) { + public FLOAD(final int n) { super(org.apache.commons.bcel6.Const.FLOAD, org.apache.commons.bcel6.Const.FLOAD_0, n); } @@ -51,7 +51,7 @@ public class FLOAD extends LoadInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { super.accept(v); v.visitFLOAD(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FMUL.java b/src/main/java/org/apache/commons/bcel6/generic/FMUL.java index ab02c510..ce3cfd15 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FMUL.java @@ -41,7 +41,7 @@ public class FMUL extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FNEG.java b/src/main/java/org/apache/commons/bcel6/generic/FNEG.java index 5cc66116..e7ce10fe 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FNEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FNEG.java @@ -39,7 +39,7 @@ public class FNEG extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FREM.java b/src/main/java/org/apache/commons/bcel6/generic/FREM.java index cd982d30..d32a30bf 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FREM.java @@ -41,7 +41,7 @@ public class FREM extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java index c16df496..b1ff1401 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java @@ -41,7 +41,7 @@ public class FRETURN extends ReturnInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java b/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java index 5dc70b1f..d5b11dd9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java @@ -37,7 +37,7 @@ public class FSTORE extends StoreInstruction { /** Store float into local variable * @param n index of local variable */ - public FSTORE(int n) { + public FSTORE(final int n) { super(org.apache.commons.bcel6.Const.FSTORE, org.apache.commons.bcel6.Const.FSTORE_0, n); } @@ -51,7 +51,7 @@ public class FSTORE extends StoreInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { super.accept(v); v.visitFSTORE(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FSUB.java b/src/main/java/org/apache/commons/bcel6/generic/FSUB.java index 43cdde26..4163ee45 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FSUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FSUB.java @@ -41,7 +41,7 @@ public class FSUB extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java index 3340ac46..8afa0147 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java @@ -46,7 +46,7 @@ public class FieldGen extends FieldGenOrMethodGen { private static BCELComparator _cmp = new BCELComparator() { @Override - public boolean equals( Object o1, Object o2 ) { + public boolean equals( final Object o1, final Object o2 ) { FieldGen THIS = (FieldGen) o1; FieldGen THAT = (FieldGen) o2; return THIS.getName().equals(THAT.getName()) @@ -55,7 +55,7 @@ public class FieldGen extends FieldGenOrMethodGen { @Override - public int hashCode( Object o ) { + public int hashCode( final Object o ) { FieldGen THIS = (FieldGen) o; return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); } @@ -72,7 +72,7 @@ public class FieldGen extends FieldGenOrMethodGen { * @param name field name * @param cp constant pool */ - public FieldGen(int access_flags, Type type, String name, ConstantPoolGen cp) { + public FieldGen(final int access_flags, final Type type, final String name, final ConstantPoolGen cp) { super(access_flags); setType(type); setName(name); @@ -86,7 +86,7 @@ public class FieldGen extends FieldGenOrMethodGen { * @param field Field object * @param cp constant pool (must contain the same entries as the field's constant pool) */ - public FieldGen(Field field, ConstantPoolGen cp) { + public FieldGen(final Field field, final ConstantPoolGen cp) { this(field.getAccessFlags(), Type.getType(field.getSignature()), field.getName(), cp); Attribute[] attrs = field.getAttributes(); for (Attribute attr : attrs) { @@ -105,7 +105,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - private void setValue( int index ) { + private void setValue( final int index ) { ConstantPool cp = super.getConstantPool().getConstantPool(); Constant c = cp.getConstant(index); value = ((ConstantObject) c).getConstantValue(cp); @@ -116,7 +116,7 @@ public class FieldGen extends FieldGenOrMethodGen { * Set (optional) initial value of field, otherwise it will be set to null/0/false * by the JVM automatically. */ - public void setInitValue( String str ) { + public void setInitValue( final String str ) { checkType( ObjectType.getInstance("java.lang.String")); if (str != null) { value = str; @@ -124,7 +124,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( long l ) { + public void setInitValue( final long l ) { checkType(Type.LONG); if (l != 0L) { value = Long.valueOf(l); @@ -132,7 +132,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( int i ) { + public void setInitValue( final int i ) { checkType(Type.INT); if (i != 0) { value = Integer.valueOf(i); @@ -140,7 +140,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( short s ) { + public void setInitValue( final short s ) { checkType(Type.SHORT); if (s != 0) { value = Integer.valueOf(s); @@ -148,7 +148,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( char c ) { + public void setInitValue( final char c ) { checkType(Type.CHAR); if (c != 0) { value = Integer.valueOf(c); @@ -156,7 +156,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( byte b ) { + public void setInitValue( final byte b ) { checkType(Type.BYTE); if (b != 0) { value = Integer.valueOf(b); @@ -164,7 +164,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( boolean b ) { + public void setInitValue( final boolean b ) { checkType(Type.BOOLEAN); if (b) { value = Integer.valueOf(1); @@ -172,7 +172,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( float f ) { + public void setInitValue( final float f ) { checkType(Type.FLOAT); if (f != 0.0) { value = new Float(f); @@ -180,7 +180,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - public void setInitValue( double d ) { + public void setInitValue( final double d ) { checkType(Type.DOUBLE); if (d != 0.0) { value = new Double(d); @@ -195,7 +195,7 @@ public class FieldGen extends FieldGenOrMethodGen { } - private void checkType( Type atype ) { + private void checkType( final Type atype ) { final Type superType = super.getType(); if (superType == null) { throw new ClassGenException("You haven't defined the type of the field yet"); @@ -227,7 +227,7 @@ public class FieldGen extends FieldGenOrMethodGen { super.getConstantPool().getConstantPool()); // sic } - private void addAnnotationsAsAttribute(ConstantPoolGen cp) { + private void addAnnotationsAsAttribute(final ConstantPoolGen cp) { Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp, super.getAnnotationEntries()); for (Attribute attr : attrs) { addAttribute(attr); @@ -267,7 +267,7 @@ public class FieldGen extends FieldGenOrMethodGen { /** Add observer for this object. */ - public void addObserver( FieldObserver o ) { + public void addObserver( final FieldObserver o ) { if (observers == null) { observers = new ArrayList<>(); } @@ -277,7 +277,7 @@ public class FieldGen extends FieldGenOrMethodGen { /** Remove observer for this object. */ - public void removeObserver( FieldObserver o ) { + public void removeObserver( final FieldObserver o ) { if (observers != null) { observers.remove(o); } @@ -332,7 +332,7 @@ public class FieldGen extends FieldGenOrMethodGen { /** @return deep copy of this field */ - public FieldGen copy( ConstantPoolGen cp ) { + public FieldGen copy( final ConstantPoolGen cp ) { FieldGen fg = (FieldGen) clone(); fg.setConstantPool(cp); return fg; @@ -350,7 +350,7 @@ public class FieldGen extends FieldGenOrMethodGen { /** * @param comparator Comparison strategy object */ - public static void setComparator( BCELComparator comparator ) { + public static void setComparator( final BCELComparator comparator ) { _cmp = comparator; } @@ -363,7 +363,7 @@ public class FieldGen extends FieldGenOrMethodGen { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals( Object obj ) { + public boolean equals( final Object obj ) { return _cmp.equals(this, obj); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java index e1ede98a..c62ece28 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java @@ -63,12 +63,12 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn /** * @since 6.0 */ - protected FieldGenOrMethodGen(int access_flags) { // TODO could this be package protected? + protected FieldGenOrMethodGen(final int access_flags) { // TODO could this be package protected? super(access_flags); } @Override - public void setType( Type type ) { // TODO could be package-protected? + public void setType( final Type type ) { // TODO could be package-protected? if (type.getType() == Const.T_ADDRESS) { throw new IllegalArgumentException("Type can not be " + type); } @@ -91,7 +91,7 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn @Override - public void setName( String name ) { // TODO could be package-protected? + public void setName( final String name ) { // TODO could be package-protected? this.name = name; } @@ -101,7 +101,7 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn } - public void setConstantPool( ConstantPoolGen cp ) { // TODO could be package-protected? + public void setConstantPool( final ConstantPoolGen cp ) { // TODO could be package-protected? this.cp = cp; } @@ -114,14 +114,14 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn * * @param a attribute to be added */ - public void addAttribute( Attribute a ) { + public void addAttribute( final Attribute a ) { attribute_vec.add(a); } /** * @since 6.0 */ - protected void addAnnotationEntry(AnnotationEntryGen ag) // TODO could this be package protected? + protected void addAnnotationEntry(final AnnotationEntryGen ag) // TODO could this be package protected? { annotation_vec.add(ag); } @@ -130,14 +130,14 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn /** * Remove an attribute. */ - public void removeAttribute( Attribute a ) { + public void removeAttribute( final Attribute a ) { attribute_vec.remove(a); } /** * @since 6.0 */ - protected void removeAnnotationEntry(AnnotationEntryGen ag) // TODO could this be package protected? + protected void removeAnnotationEntry(final AnnotationEntryGen ag) // TODO could this be package protected? { annotation_vec.remove(ag); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java index 41818163..b3e85ca5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java @@ -37,7 +37,7 @@ public abstract class FieldInstruction extends FieldOrMethod { /** * @param index to constant pool */ - protected FieldInstruction(short opcode, int index) { + protected FieldInstruction(final short opcode, final int index) { super(opcode, index); } @@ -46,7 +46,7 @@ public abstract class FieldInstruction extends FieldOrMethod { * @return mnemonic for instruction with symbolic references resolved */ @Override - public String toString( ConstantPool cp ) { + public String toString( final ConstantPool cp ) { return org.apache.commons.bcel6.Const.getOpcodeName(super.getOpcode()) + " " + cp.constantToString(super.getIndex(), org.apache.commons.bcel6.Const.CONSTANT_Fieldref); } @@ -54,7 +54,7 @@ public abstract class FieldInstruction extends FieldOrMethod { /** @return size of field (1 or 2) */ - protected int getFieldSize( ConstantPoolGen cpg ) { + protected int getFieldSize( final ConstantPoolGen cpg ) { return Type.size(Type.getTypeSize(getSignature(cpg))); } @@ -62,21 +62,21 @@ public abstract class FieldInstruction extends FieldOrMethod { /** @return return type of referenced field */ @Override - public Type getType( ConstantPoolGen cpg ) { + public Type getType( final ConstantPoolGen cpg ) { return getFieldType(cpg); } /** @return type of field */ - public Type getFieldType( ConstantPoolGen cpg ) { + public Type getFieldType( final ConstantPoolGen cpg ) { return Type.getType(getSignature(cpg)); } /** @return name of referenced field. */ - public String getFieldName( ConstantPoolGen cpg ) { + public String getFieldName( final ConstantPoolGen cpg ) { return getName(cpg); } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java index 30d8878a..948aef9e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java @@ -42,14 +42,14 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { /** * @param index to constant pool */ - protected FieldOrMethod(short opcode, int index) { + protected FieldOrMethod(final short opcode, final int index) { super(opcode, index); } /** @return signature of referenced method/field. */ - public String getSignature( ConstantPoolGen cpg ) { + public String getSignature( final ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); @@ -59,7 +59,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { /** @return name of referenced method/field. */ - public String getName( ConstantPoolGen cpg ) { + public String getName( final ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); @@ -79,7 +79,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { * */ @Deprecated - public String getClassName( ConstantPoolGen cpg ) { + public String getClassName( final ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); String className = cp.getConstantString(cmr.getClassIndex(), Const.CONSTANT_Class); @@ -97,7 +97,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { * getReferenceType() instead. */ @Deprecated - public ObjectType getClassType( ConstantPoolGen cpg ) { + public ObjectType getClassType( final ConstantPoolGen cpg ) { return ObjectType.getInstance(getClassName(cpg)); } @@ -110,7 +110,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { * or interface), or an ArrayType (if the referenced class * type is an array class) */ - public ReferenceType getReferenceType( ConstantPoolGen cpg ) { + public ReferenceType getReferenceType( final ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); String className = cp.getConstantString(cmr.getClassIndex(), Const.CONSTANT_Class); @@ -129,7 +129,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { * @throws ClassGenException when the field is (or method returns) an array, */ @Override - public ObjectType getLoadClassType( ConstantPoolGen cpg ) { + public ObjectType getLoadClassType( final ConstantPoolGen cpg ) { ReferenceType rt = getReferenceType(cpg); if(rt instanceof ObjectType) { return (ObjectType)rt; diff --git a/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java b/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java index 058f2241..aa71d757 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java @@ -39,13 +39,13 @@ public class GETFIELD extends FieldInstruction implements ExceptionThrower, Stac } - public GETFIELD(int index) { + public GETFIELD(final int index) { super(Const.GETFIELD, index); } @Override - public int produceStack( ConstantPoolGen cpg ) { + public int produceStack( final ConstantPoolGen cpg ) { return getFieldSize(cpg); } @@ -67,7 +67,7 @@ public class GETFIELD extends FieldInstruction implements ExceptionThrower, Stac * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitStackConsumer(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java index be9aab5d..f3469fc9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java @@ -38,13 +38,13 @@ public class GETSTATIC extends FieldInstruction implements PushInstruction, Exce } - public GETSTATIC(int index) { + public GETSTATIC(final int index) { super(Const.GETSTATIC, index); } @Override - public int produceStack( ConstantPoolGen cpg ) { + public int produceStack( final ConstantPoolGen cpg ) { return getFieldSize(cpg); } @@ -65,7 +65,7 @@ public class GETSTATIC extends FieldInstruction implements PushInstruction, Exce * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java index fa451d62..ec92fdaf 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GOTO.java @@ -35,7 +35,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { } - public GOTO(InstructionHandle target) { + public GOTO(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.GOTO, target); } @@ -45,7 +45,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { super.setIndex(getTargetOffset()); final short _opcode = getOpcode(); if (_opcode == org.apache.commons.bcel6.Const.GOTO) { @@ -67,7 +67,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { * @return additional offset caused by possible change of this instruction's length */ @Override - protected int updatePosition( int offset, int max_offset ) { + protected int updatePosition( final int offset, final int max_offset ) { int i = getTargetOffset(); // Depending on old position value setPosition(getPosition() + offset); // Position may be shifted by preceding expansions if (Math.abs(i) >= (Short.MAX_VALUE - max_offset)) { // to large for short (estimate) @@ -89,7 +89,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitVariableLengthInstruction(this); v.visitUnconditionalBranch(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java b/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java index 2fcef155..8297129f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java @@ -37,7 +37,7 @@ public class GOTO_W extends GotoInstruction { } - public GOTO_W(InstructionHandle target) { + public GOTO_W(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.GOTO_W, target); super.setLength(5); } @@ -48,7 +48,7 @@ public class GOTO_W extends GotoInstruction { * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { super.setIndex(getTargetOffset()); out.writeByte(super.getOpcode()); out.writeInt(super.getIndex()); @@ -59,7 +59,7 @@ public class GOTO_W extends GotoInstruction { * Read needed data (e.g. index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { super.setIndex(bytes.readInt()); super.setLength(5); } @@ -74,7 +74,7 @@ public class GOTO_W extends GotoInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitUnconditionalBranch(this); v.visitBranchInstruction(this); v.visitGotoInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java index a302e4ab..5ba46c3c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java @@ -24,7 +24,7 @@ package org.apache.commons.bcel6.generic; */ public abstract class GotoInstruction extends BranchInstruction implements UnconditionalBranch { - GotoInstruction(short opcode, InstructionHandle target) { + GotoInstruction(final short opcode, final InstructionHandle target) { super(opcode, target); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2B.java b/src/main/java/org/apache/commons/bcel6/generic/I2B.java index 866dea28..158d9784 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2B.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2B.java @@ -41,7 +41,7 @@ public class I2B extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2C.java b/src/main/java/org/apache/commons/bcel6/generic/I2C.java index bf6d2ac2..bced8ca8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2C.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2C.java @@ -41,7 +41,7 @@ public class I2C extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2D.java b/src/main/java/org/apache/commons/bcel6/generic/I2D.java index daaba2cd..a7db9a13 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2D.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2D.java @@ -41,7 +41,7 @@ public class I2D extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2F.java b/src/main/java/org/apache/commons/bcel6/generic/I2F.java index cf1d276b..e45d51d4 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2F.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2F.java @@ -41,7 +41,7 @@ public class I2F extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2L.java b/src/main/java/org/apache/commons/bcel6/generic/I2L.java index 38939847..f09af21b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2L.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2L.java @@ -41,7 +41,7 @@ public class I2L extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2S.java b/src/main/java/org/apache/commons/bcel6/generic/I2S.java index 2c275a02..aafa20b5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/I2S.java +++ b/src/main/java/org/apache/commons/bcel6/generic/I2S.java @@ -39,7 +39,7 @@ public class I2S extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IADD.java b/src/main/java/org/apache/commons/bcel6/generic/IADD.java index 7ff33a1c..038ff551 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IADD.java @@ -41,7 +41,7 @@ public class IADD extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java index 999afa30..d46381b2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java @@ -42,7 +42,7 @@ public class IALOAD extends ArrayInstruction implements StackProducer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IAND.java b/src/main/java/org/apache/commons/bcel6/generic/IAND.java index f2575042..16ceaccd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IAND.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IAND.java @@ -39,7 +39,7 @@ public class IAND extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java index d64279ad..9914183c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java @@ -42,7 +42,7 @@ public class IASTORE extends ArrayInstruction implements StackConsumer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ICONST.java b/src/main/java/org/apache/commons/bcel6/generic/ICONST.java index c0cf6d32..e7e224de 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ICONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ICONST.java @@ -37,7 +37,7 @@ public class ICONST extends Instruction implements ConstantPushInstruction { } - public ICONST(int i) { + public ICONST(final int i) { super(org.apache.commons.bcel6.Const.ICONST_0, (short) 1); if ((i >= -1) && (i <= 5)) { super.setOpcode((short) (org.apache.commons.bcel6.Const.ICONST_0 + i)); // Even works for i == -1 @@ -57,7 +57,7 @@ public class ICONST extends Instruction implements ConstantPushInstruction { /** @return Type.INT */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.INT; } @@ -71,7 +71,7 @@ public class ICONST extends Instruction implements ConstantPushInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitPushInstruction(this); v.visitStackProducer(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IDIV.java b/src/main/java/org/apache/commons/bcel6/generic/IDIV.java index ad3e93ef..d461b0fb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IDIV.java @@ -53,7 +53,7 @@ public class IDIV extends ArithmeticInstruction implements ExceptionThrower { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java index 5dbb1828..3f7acba6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java @@ -34,7 +34,7 @@ public class IFEQ extends IfInstruction { } - public IFEQ(InstructionHandle target) { + public IFEQ(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IFEQ, target); } @@ -57,7 +57,7 @@ public class IFEQ extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFGE.java b/src/main/java/org/apache/commons/bcel6/generic/IFGE.java index cadd81c2..1be8d25b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFGE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFGE.java @@ -34,7 +34,7 @@ public class IFGE extends IfInstruction { } - public IFGE(InstructionHandle target) { + public IFGE(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IFGE, target); } @@ -57,7 +57,7 @@ public class IFGE extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFGT.java b/src/main/java/org/apache/commons/bcel6/generic/IFGT.java index ff2917ad..f11ddf68 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFGT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFGT.java @@ -34,7 +34,7 @@ public class IFGT extends IfInstruction { } - public IFGT(InstructionHandle target) { + public IFGT(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IFGT, target); } @@ -57,7 +57,7 @@ public class IFGT extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFLE.java b/src/main/java/org/apache/commons/bcel6/generic/IFLE.java index 42002322..2d11e2aa 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFLE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFLE.java @@ -34,7 +34,7 @@ public class IFLE extends IfInstruction { } - public IFLE(InstructionHandle target) { + public IFLE(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IFLE, target); } @@ -57,7 +57,7 @@ public class IFLE extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFLT.java b/src/main/java/org/apache/commons/bcel6/generic/IFLT.java index 571d685e..2fa6d830 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFLT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFLT.java @@ -34,7 +34,7 @@ public class IFLT extends IfInstruction { } - public IFLT(InstructionHandle target) { + public IFLT(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IFLT, target); } @@ -57,7 +57,7 @@ public class IFLT extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNE.java b/src/main/java/org/apache/commons/bcel6/generic/IFNE.java index 322ecf80..b0ca61b5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNE.java @@ -34,7 +34,7 @@ public class IFNE extends IfInstruction { } - public IFNE(InstructionHandle target) { + public IFNE(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IFNE, target); } @@ -57,7 +57,7 @@ public class IFNE extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java b/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java index ed8f02ae..c51e8485 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java @@ -34,7 +34,7 @@ public class IFNONNULL extends IfInstruction { } - public IFNONNULL(InstructionHandle target) { + public IFNONNULL(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IFNONNULL, target); } @@ -57,7 +57,7 @@ public class IFNONNULL extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java b/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java index dcda95e9..4af8b78b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java @@ -34,7 +34,7 @@ public class IFNULL extends IfInstruction { } - public IFNULL(InstructionHandle target) { + public IFNULL(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IFNULL, target); } @@ -57,7 +57,7 @@ public class IFNULL extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java index 09cdef27..418145c0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java @@ -34,7 +34,7 @@ public class IF_ACMPEQ extends IfInstruction { } - public IF_ACMPEQ(InstructionHandle target) { + public IF_ACMPEQ(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IF_ACMPEQ, target); } @@ -57,7 +57,7 @@ public class IF_ACMPEQ extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java index 064d5e4c..437232f1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java @@ -34,7 +34,7 @@ public class IF_ACMPNE extends IfInstruction { } - public IF_ACMPNE(InstructionHandle target) { + public IF_ACMPNE(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IF_ACMPNE, target); } @@ -57,7 +57,7 @@ public class IF_ACMPNE extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java index b1f608b0..e966bd64 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java @@ -34,7 +34,7 @@ public class IF_ICMPEQ extends IfInstruction { } - public IF_ICMPEQ(InstructionHandle target) { + public IF_ICMPEQ(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IF_ICMPEQ, target); } @@ -57,7 +57,7 @@ public class IF_ICMPEQ extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java index f9bf03aa..5d269965 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java @@ -34,7 +34,7 @@ public class IF_ICMPGE extends IfInstruction { } - public IF_ICMPGE(InstructionHandle target) { + public IF_ICMPGE(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IF_ICMPGE, target); } @@ -57,7 +57,7 @@ public class IF_ICMPGE extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java index fb13e6c9..dcf40af6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java @@ -34,7 +34,7 @@ public class IF_ICMPGT extends IfInstruction { } - public IF_ICMPGT(InstructionHandle target) { + public IF_ICMPGT(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IF_ICMPGT, target); } @@ -57,7 +57,7 @@ public class IF_ICMPGT extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java index 1bda2eea..672493f5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java @@ -34,7 +34,7 @@ public class IF_ICMPLE extends IfInstruction { } - public IF_ICMPLE(InstructionHandle target) { + public IF_ICMPLE(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IF_ICMPLE, target); } @@ -57,7 +57,7 @@ public class IF_ICMPLE extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java index 963ed83e..112ed3b8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java @@ -34,7 +34,7 @@ public class IF_ICMPLT extends IfInstruction { } - public IF_ICMPLT(InstructionHandle target) { + public IF_ICMPLT(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IF_ICMPLT, target); } @@ -57,7 +57,7 @@ public class IF_ICMPLT extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java index 91055594..6df99dc5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java @@ -34,7 +34,7 @@ public class IF_ICMPNE extends IfInstruction { } - public IF_ICMPNE(InstructionHandle target) { + public IF_ICMPNE(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.IF_ICMPNE, target); } @@ -57,7 +57,7 @@ public class IF_ICMPNE extends IfInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitBranchInstruction(this); v.visitIfInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IINC.java b/src/main/java/org/apache/commons/bcel6/generic/IINC.java index 763d5bae..22c0cf37 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IINC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IINC.java @@ -45,7 +45,7 @@ public class IINC extends LocalVariableInstruction { * @param n index of local variable * @param c increment factor */ - public IINC(int n, int c) { + public IINC(final int n, final int c) { super(); // Default behaviour of LocalVariableInstruction causes error super.setOpcode(org.apache.commons.bcel6.Const.IINC); super.setLength((short) 3); @@ -59,7 +59,7 @@ public class IINC extends LocalVariableInstruction { * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { if (wide) { out.writeByte(org.apache.commons.bcel6.Const.WIDE); } @@ -88,7 +88,7 @@ public class IINC extends LocalVariableInstruction { * Read needed data (e.g. index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { this.wide = wide; if (wide) { super.setLength(6); @@ -106,7 +106,7 @@ public class IINC extends LocalVariableInstruction { * @return mnemonic for instruction */ @Override - public String toString( boolean verbose ) { + public String toString( final boolean verbose ) { return super.toString(verbose) + " " + c; } @@ -115,7 +115,7 @@ public class IINC extends LocalVariableInstruction { * Set index of local variable. */ @Override - public final void setIndex( int n ) { + public final void setIndex( final int n ) { if (n < 0) { throw new ClassGenException("Negative index value: " + n); } @@ -135,7 +135,7 @@ public class IINC extends LocalVariableInstruction { /** * Set increment factor. */ - public final void setIncrement( int c ) { + public final void setIncrement( final int c ) { this.c = c; setWide(); } @@ -144,7 +144,7 @@ public class IINC extends LocalVariableInstruction { /** @return int type */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.INT; } @@ -158,7 +158,7 @@ public class IINC extends LocalVariableInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitLocalVariableInstruction(this); v.visitIINC(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java b/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java index d89966b3..0810fb60 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java @@ -37,7 +37,7 @@ public class ILOAD extends LoadInstruction { /** Load int from local variable * @param n index of local variable */ - public ILOAD(int n) { + public ILOAD(final int n) { super(org.apache.commons.bcel6.Const.ILOAD, org.apache.commons.bcel6.Const.ILOAD_0, n); } @@ -51,7 +51,7 @@ public class ILOAD extends LoadInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { super.accept(v); v.visitILOAD(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java index 4eae6322..ecc94825 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java @@ -38,7 +38,7 @@ public class IMPDEP1 extends Instruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitIMPDEP1(this); } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java index acfe6cbe..8b228e16 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java @@ -38,7 +38,7 @@ public class IMPDEP2 extends Instruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitIMPDEP2(this); } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/IMUL.java b/src/main/java/org/apache/commons/bcel6/generic/IMUL.java index c50d4f62..119d606c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IMUL.java @@ -41,7 +41,7 @@ public class IMUL extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/INEG.java b/src/main/java/org/apache/commons/bcel6/generic/INEG.java index 7d37b73e..661bc0d0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INEG.java @@ -39,7 +39,7 @@ public class INEG extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java b/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java index 1e6e5ccf..a81fbd9c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java @@ -36,7 +36,7 @@ public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThr } - public INSTANCEOF(int index) { + public INSTANCEOF(final int index) { super(org.apache.commons.bcel6.Const.INSTANCEOF, index); } @@ -48,7 +48,7 @@ public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThr @Override - public ObjectType getLoadClassType( ConstantPoolGen cpg ) { + public ObjectType getLoadClassType( final ConstantPoolGen cpg ) { Type t = getType(cpg); if (t instanceof ArrayType) { t = ((ArrayType) t).getBasicType(); @@ -66,7 +66,7 @@ public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThr * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitLoadClass(this); v.visitExceptionThrower(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java index 3151b563..1ecb0085 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java @@ -48,7 +48,7 @@ public class INVOKEDYNAMIC extends InvokeInstruction { } - public INVOKEDYNAMIC(int index) { + public INVOKEDYNAMIC(final int index) { super(Const.INVOKEDYNAMIC, index); } @@ -58,7 +58,7 @@ public class INVOKEDYNAMIC extends InvokeInstruction { * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { out.writeByte(super.getOpcode()); out.writeShort(super.getIndex()); out.writeByte(0); @@ -70,7 +70,7 @@ public class INVOKEDYNAMIC extends InvokeInstruction { * Read needed data (i.e., index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { super.initFromFile(bytes, wide); super.setLength(5); bytes.readByte(); // Skip 0 byte @@ -82,7 +82,7 @@ public class INVOKEDYNAMIC extends InvokeInstruction { * @return mnemonic for instruction with symbolic references resolved */ @Override - public String toString( ConstantPool cp ) { + public String toString( final ConstantPool cp ) { return super.toString(cp); } @@ -106,7 +106,7 @@ public class INVOKEDYNAMIC extends InvokeInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackConsumer(this); @@ -121,7 +121,7 @@ public class INVOKEDYNAMIC extends InvokeInstruction { /** * Override the parent method because our classname is held elsewhere. */ - public String getClassName( ConstantPoolGen cpg ) { + public String getClassName( final ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); ConstantInvokeDynamic cid = (ConstantInvokeDynamic) cp.getConstant(super.getIndex(), Const.CONSTANT_InvokeDynamic); return ((ConstantNameAndType) cp.getConstant(cid.getNameAndTypeIndex())).getName(cp); diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java index 77e68d4d..7450f594 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java @@ -47,7 +47,7 @@ public final class INVOKEINTERFACE extends InvokeInstruction { } - public INVOKEINTERFACE(int index, int nargs) { + public INVOKEINTERFACE(final int index, final int nargs) { super(Const.INVOKEINTERFACE, index); super.setLength(5); if (nargs < 1) { @@ -62,7 +62,7 @@ public final class INVOKEINTERFACE extends InvokeInstruction { * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { out.writeByte(super.getOpcode()); out.writeShort(super.getIndex()); out.writeByte(nargs); @@ -83,7 +83,7 @@ public final class INVOKEINTERFACE extends InvokeInstruction { * Read needed data (i.e., index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { super.initFromFile(bytes, wide); super.setLength(5); nargs = bytes.readUnsignedByte(); @@ -95,13 +95,13 @@ public final class INVOKEINTERFACE extends InvokeInstruction { * @return mnemonic for instruction with symbolic references resolved */ @Override - public String toString( ConstantPool cp ) { + public String toString( final ConstantPool cp ) { return super.toString(cp) + " " + nargs; } @Override - public int consumeStack( ConstantPoolGen cpg ) { // nargs is given in byte-code + public int consumeStack( final ConstantPoolGen cpg ) { // nargs is given in byte-code return nargs; // nargs includes this reference } @@ -125,7 +125,7 @@ public final class INVOKEINTERFACE extends InvokeInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java index dd51c21c..cd588db7 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java @@ -44,7 +44,7 @@ public class INVOKESPECIAL extends InvokeInstruction { } - public INVOKESPECIAL(int index) { + public INVOKESPECIAL(final int index) { super(Const.INVOKESPECIAL, index); } @@ -54,7 +54,7 @@ public class INVOKESPECIAL extends InvokeInstruction { * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { out.writeByte(super.getOpcode()); out.writeShort(super.getIndex()); } @@ -78,7 +78,7 @@ public class INVOKESPECIAL extends InvokeInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java index f674b053..45914fa2 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java @@ -43,7 +43,7 @@ public class INVOKESTATIC extends InvokeInstruction { } - public INVOKESTATIC(int index) { + public INVOKESTATIC(final int index) { super(Const.INVOKESTATIC, index); } @@ -53,7 +53,7 @@ public class INVOKESTATIC extends InvokeInstruction { * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { out.writeByte(super.getOpcode()); out.writeShort(super.getIndex()); } @@ -75,7 +75,7 @@ public class INVOKESTATIC extends InvokeInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java index cced534b..d93d30bf 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java @@ -43,7 +43,7 @@ public class INVOKEVIRTUAL extends InvokeInstruction { } - public INVOKEVIRTUAL(int index) { + public INVOKEVIRTUAL(final int index) { super(Const.INVOKEVIRTUAL, index); } @@ -53,7 +53,7 @@ public class INVOKEVIRTUAL extends InvokeInstruction { * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { out.writeByte(super.getOpcode()); out.writeShort(super.getIndex()); } @@ -77,7 +77,7 @@ public class INVOKEVIRTUAL extends InvokeInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IOR.java b/src/main/java/org/apache/commons/bcel6/generic/IOR.java index 26b7ef20..3705b692 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IOR.java @@ -39,7 +39,7 @@ public class IOR extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IREM.java b/src/main/java/org/apache/commons/bcel6/generic/IREM.java index ffc75953..27bfe537 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IREM.java @@ -53,7 +53,7 @@ public class IREM extends ArithmeticInstruction implements ExceptionThrower { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java index 140baa90..a794fd4b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java @@ -41,7 +41,7 @@ public class IRETURN extends ReturnInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISHL.java b/src/main/java/org/apache/commons/bcel6/generic/ISHL.java index db716ec7..1361ac4f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ISHL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISHL.java @@ -39,7 +39,7 @@ public class ISHL extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISHR.java b/src/main/java/org/apache/commons/bcel6/generic/ISHR.java index 79568fe5..677e6a88 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ISHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISHR.java @@ -39,7 +39,7 @@ public class ISHR extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java b/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java index 9db7723f..9018a1b8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java @@ -37,7 +37,7 @@ public class ISTORE extends StoreInstruction { /** Store int into local variable * @param n index of local variable */ - public ISTORE(int n) { + public ISTORE(final int n) { super(org.apache.commons.bcel6.Const.ISTORE, org.apache.commons.bcel6.Const.ISTORE_0, n); } @@ -51,7 +51,7 @@ public class ISTORE extends StoreInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { super.accept(v); v.visitISTORE(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISUB.java b/src/main/java/org/apache/commons/bcel6/generic/ISUB.java index ea90b9e7..446f8655 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ISUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ISUB.java @@ -41,7 +41,7 @@ public class ISUB extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java b/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java index 1eac15ae..2b4452a3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java @@ -39,7 +39,7 @@ public class IUSHR extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IXOR.java b/src/main/java/org/apache/commons/bcel6/generic/IXOR.java index a7a3cb43..c94a56ab 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IXOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IXOR.java @@ -39,7 +39,7 @@ public class IXOR extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java index 729da45d..1979fc5a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java @@ -36,7 +36,7 @@ public abstract class IfInstruction extends BranchInstruction implements StackCo * @param opcode opcode of instruction * @param target Target instruction to branch to */ - protected IfInstruction(short opcode, InstructionHandle target) { + protected IfInstruction(final short opcode, final InstructionHandle target) { super(opcode, target); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java index 334e6449..55888cdd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Instruction.java @@ -54,7 +54,7 @@ public abstract class Instruction implements Cloneable { } - public Instruction(short opcode, short length) { + public Instruction(final short opcode, final short length) { this.length = length; this.opcode = opcode; } @@ -64,7 +64,7 @@ public abstract class Instruction implements Cloneable { * Dump instruction as byte code to stream out. * @param out Output stream */ - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { out.writeByte(opcode); // Common for all instructions } @@ -85,7 +85,7 @@ public abstract class Instruction implements Cloneable { * @param verbose long/short format switch * @return mnemonic for instruction */ - public String toString( boolean verbose ) { + public String toString( final boolean verbose ) { if (verbose) { return getName() + "[" + opcode + "](" + length + ")"; } @@ -105,7 +105,7 @@ public abstract class Instruction implements Cloneable { /** * @return mnemonic for instruction with sumbolic references resolved */ - public String toString( ConstantPool cp ) { + public String toString( final ConstantPool cp ) { return toString(false); } @@ -141,7 +141,7 @@ public abstract class Instruction implements Cloneable { * @param wide "wide" instruction flag * @throws IOException may be thrown if the implementation needs to read data from the file */ - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { } @@ -156,7 +156,7 @@ public abstract class Instruction implements Cloneable { * @see InstructionConst#getInstruction(int) */ // @since 6.0 no longer final - public static Instruction readInstruction( ByteSequence bytes ) throws IOException { + public static Instruction readInstruction( final ByteSequence bytes ) throws IOException { boolean wide = false; short opcode = (short) bytes.readUnsignedByte(); Instruction obj = null; @@ -482,7 +482,7 @@ public abstract class Instruction implements Cloneable { * @return Number of words consumed from stack by this instruction, * or Constants.UNPREDICTABLE, if this can not be computed statically */ - public int consumeStack( ConstantPoolGen cpg ) { + public int consumeStack( final ConstantPoolGen cpg ) { return Const.getConsumeStack(opcode); } @@ -494,7 +494,7 @@ public abstract class Instruction implements Cloneable { * @return Number of words produced onto stack by this instruction, * or Constants.UNPREDICTABLE, if this can not be computed statically */ - public int produceStack( ConstantPoolGen cpg ) { + public int produceStack( final ConstantPoolGen cpg ) { return Const.getProduceStack(opcode); } @@ -518,7 +518,7 @@ public abstract class Instruction implements Cloneable { /** * Needed in readInstruction and subclasses in this package */ - final void setOpcode( short opcode ) { + final void setOpcode( final short opcode ) { this.opcode = opcode; } @@ -527,7 +527,7 @@ public abstract class Instruction implements Cloneable { * Needed in readInstruction and subclasses in this package * @since 6.0 */ - final void setLength( int length ) { + final void setLength( final int length ) { this.length = (short) length; // TODO check range? } @@ -565,7 +565,7 @@ public abstract class Instruction implements Cloneable { * @deprecated use the built in comparator, or wrap this class in another object that implements these methods */ @Deprecated - public static void setComparator( InstructionComparator c ) { + public static void setComparator( final InstructionComparator c ) { cmp = c; } @@ -574,7 +574,7 @@ public abstract class Instruction implements Cloneable { * @return true if that is an Instruction and has the same opcode */ @Override - public boolean equals( Object that ) { + public boolean equals( final Object that ) { return (that instanceof Instruction) ? cmp.equals(this, (Instruction) that) : false; } @@ -593,7 +593,7 @@ public abstract class Instruction implements Cloneable { * @return true if the value is in range * @since 6.0 */ - public static boolean isValidByte(int value) { + public static boolean isValidByte(final int value) { return value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE; } @@ -603,7 +603,7 @@ public abstract class Instruction implements Cloneable { * @return true if the value is in range * @since 6.0 */ - public static boolean isValidShort(int value) { + public static boolean isValidShort(final int value) { return value >= Short.MIN_VALUE && value <= Short.MAX_VALUE; } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java index 5cfb8bd3..cce821d5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java @@ -34,7 +34,7 @@ public interface InstructionComparator { public static final InstructionComparator DEFAULT = new InstructionComparator() { @Override - public boolean equals( Instruction i1, Instruction i2 ) { + public boolean equals( final Instruction i1, final Instruction i2 ) { if (i1.getOpcode() == i2.getOpcode()) { if (i1 instanceof BranchInstruction) { // BIs are never equal to make targeters work correctly (BCEL-195) diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionConst.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionConst.java index d2bd1cc1..5fcde96b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionConst.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionConst.java @@ -291,7 +291,7 @@ public final class InstructionConst { * @param index the index, e.g. {@link Const#RETURN} * @return the entry from the private INSTRUCTIONS table */ - public static Instruction getInstruction(int index) { + public static Instruction getInstruction(final int index) { return INSTRUCTIONS[index]; } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java index 6c718a87..c36c3163 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java @@ -52,7 +52,7 @@ public class InstructionFactory { protected ConstantPoolGen cp; - public InstructionFactory(ClassGen cg, ConstantPoolGen cp) { + public InstructionFactory(final ClassGen cg, final ConstantPoolGen cp) { this.cg = cg; this.cp = cp; } @@ -60,14 +60,14 @@ public class InstructionFactory { /** Initialize with ClassGen object */ - public InstructionFactory(ClassGen cg) { + public InstructionFactory(final ClassGen cg) { this(cg, cg.getConstantPool()); } /** Initialize just with ConstantPoolGen object */ - public InstructionFactory(ConstantPoolGen cp) { + public InstructionFactory(final ConstantPoolGen cp) { this(null, cp); } @@ -82,8 +82,8 @@ public class InstructionFactory { * or INVOKESPECIAL * @see Const */ - public InvokeInstruction createInvoke( String class_name, String name, Type ret_type, - Type[] arg_types, short kind ) { + public InvokeInstruction createInvoke( final String class_name, final String name, final Type ret_type, + final Type[] arg_types, final short kind ) { int index; int nargs = 0; String signature = Type.getMethodSignature(ret_type, arg_types); @@ -142,7 +142,7 @@ public class InstructionFactory { * * @param s the string to print */ - public InstructionList createPrintln( String s ) { + public InstructionList createPrintln( final String s ) { InstructionList il = new InstructionList(); int out = cp.addFieldref("java.lang.System", "out", "Ljava/io/PrintStream;"); int println = cp.addMethodref("java.io.PrintStream", "println", "(Ljava/lang/String;)V"); @@ -156,7 +156,7 @@ public class InstructionFactory { /** Uses PUSH to push a constant value onto the stack. * @param value must be of type Number, Boolean, Character or String */ - public Instruction createConstant( Object value ) { + public Instruction createConstant( final Object value ) { PUSH push; if (value instanceof Number) { push = new PUSH(cp, (Number) value); @@ -180,7 +180,7 @@ public class InstructionFactory { final String name; - MethodObject(String c, String n, Type r, Type[] a) { + MethodObject(final String c, final String n, final Type r, final Type[] a) { class_name = c; name = n; result_type = r; @@ -189,7 +189,7 @@ public class InstructionFactory { } - private InvokeInstruction createInvoke( MethodObject m, short kind ) { + private InvokeInstruction createInvoke( final MethodObject m, final short kind ) { return createInvoke(m.class_name, m.name, m.result_type, m.arg_types, kind); } @@ -231,13 +231,13 @@ public class InstructionFactory { }; - private static boolean isString( Type type ) { + private static boolean isString( final Type type ) { return (type instanceof ObjectType) && ((ObjectType) type).getClassName().equals("java.lang.String"); } - public Instruction createAppend( Type type ) { + public Instruction createAppend( final Type type ) { byte t = type.getType(); if (isString(type)) { return createInvoke(append_mos[0], Const.INVOKEVIRTUAL); @@ -269,7 +269,7 @@ public class InstructionFactory { * @param kind how to access, i.e., GETFIELD, PUTFIELD, GETSTATIC, PUTSTATIC * @see Const */ - public FieldInstruction createFieldAccess( String class_name, String name, Type type, short kind ) { + public FieldInstruction createFieldAccess( final String class_name, final String name, final Type type, final short kind ) { int index; String signature = type.getSignature(); index = cp.addFieldref(class_name, name, signature); @@ -297,7 +297,7 @@ public class InstructionFactory { /** Create typed return */ - public static ReturnInstruction createReturn( Type type ) { + public static ReturnInstruction createReturn( final Type type ) { switch (type.getType()) { case Const.T_ARRAY: case Const.T_OBJECT: @@ -322,7 +322,7 @@ public class InstructionFactory { } - private static ArithmeticInstruction createBinaryIntOp( char first, String op ) { + private static ArithmeticInstruction createBinaryIntOp( final char first, final String op ) { switch (first) { case '-': return InstructionConst.ISUB; @@ -350,7 +350,7 @@ public class InstructionFactory { } - private static ArithmeticInstruction createBinaryLongOp( char first, String op ) { + private static ArithmeticInstruction createBinaryLongOp( final char first, final String op ) { switch (first) { case '-': return InstructionConst.LSUB; @@ -378,7 +378,7 @@ public class InstructionFactory { } - private static ArithmeticInstruction createBinaryFloatOp( char op ) { + private static ArithmeticInstruction createBinaryFloatOp( final char op ) { switch (op) { case '-': return InstructionConst.FSUB; @@ -396,7 +396,7 @@ public class InstructionFactory { } - private static ArithmeticInstruction createBinaryDoubleOp( char op ) { + private static ArithmeticInstruction createBinaryDoubleOp( final char op ) { switch (op) { case '-': return InstructionConst.DSUB; @@ -419,7 +419,7 @@ public class InstructionFactory { * * @param op operation, such as "+", "*", "<<", etc. */ - public static ArithmeticInstruction createBinaryOperation( String op, Type type ) { + public static ArithmeticInstruction createBinaryOperation( final String op, final Type type ) { char first = op.charAt(0); switch (type.getType()) { case Const.T_BYTE: @@ -442,7 +442,7 @@ public class InstructionFactory { /** * @param size size of operand, either 1 (int, e.g.) or 2 (double) */ - public static StackInstruction createPop( int size ) { + public static StackInstruction createPop( final int size ) { return (size == 2) ? InstructionConst.POP2 : InstructionConst.POP; } @@ -450,7 +450,7 @@ public class InstructionFactory { /** * @param size size of operand, either 1 (int, e.g.) or 2 (double) */ - public static StackInstruction createDup( int size ) { + public static StackInstruction createDup( final int size ) { return (size == 2) ? InstructionConst.DUP2 : InstructionConst.DUP; } @@ -458,7 +458,7 @@ public class InstructionFactory { /** * @param size size of operand, either 1 (int, e.g.) or 2 (double) */ - public static StackInstruction createDup_2( int size ) { + public static StackInstruction createDup_2( final int size ) { return (size == 2) ? InstructionConst.DUP2_X2 : InstructionConst.DUP_X2; } @@ -466,7 +466,7 @@ public class InstructionFactory { /** * @param size size of operand, either 1 (int, e.g.) or 2 (double) */ - public static StackInstruction createDup_1( int size ) { + public static StackInstruction createDup_1( final int size ) { return (size == 2) ? InstructionConst.DUP2_X1 : InstructionConst.DUP_X1; } @@ -474,7 +474,7 @@ public class InstructionFactory { /** * @param index index of local variable */ - public static LocalVariableInstruction createStore( Type type, int index ) { + public static LocalVariableInstruction createStore( final Type type, final int index ) { switch (type.getType()) { case Const.T_BOOLEAN: case Const.T_CHAR: @@ -500,7 +500,7 @@ public class InstructionFactory { /** * @param index index of local variable */ - public static LocalVariableInstruction createLoad( Type type, int index ) { + public static LocalVariableInstruction createLoad( final Type type, final int index ) { switch (type.getType()) { case Const.T_BOOLEAN: case Const.T_CHAR: @@ -526,7 +526,7 @@ public class InstructionFactory { /** * @param type type of elements of array, i.e., array.getElementType() */ - public static ArrayInstruction createArrayLoad( Type type ) { + public static ArrayInstruction createArrayLoad( final Type type ) { switch (type.getType()) { case Const.T_BOOLEAN: case Const.T_BYTE: @@ -555,7 +555,7 @@ public class InstructionFactory { /** * @param type type of elements of array, i.e., array.getElementType() */ - public static ArrayInstruction createArrayStore( Type type ) { + public static ArrayInstruction createArrayStore( final Type type ) { switch (type.getType()) { case Const.T_BOOLEAN: case Const.T_BYTE: @@ -584,7 +584,7 @@ public class InstructionFactory { /** Create conversion operation for two stack operands, this may be an I2C, instruction, e.g., * if the operands are basic types and CHECKCAST if they are reference types. */ - public Instruction createCast( Type src_type, Type dest_type ) { + public Instruction createCast( final Type src_type, final Type dest_type ) { if ((src_type instanceof BasicType) && (dest_type instanceof BasicType)) { byte dest = dest_type.getType(); byte src = src_type.getType(); @@ -612,27 +612,27 @@ public class InstructionFactory { } - public GETFIELD createGetField( String class_name, String name, Type t ) { + public GETFIELD createGetField( final String class_name, final String name, final Type t ) { return new GETFIELD(cp.addFieldref(class_name, name, t.getSignature())); } - public GETSTATIC createGetStatic( String class_name, String name, Type t ) { + public GETSTATIC createGetStatic( final String class_name, final String name, final Type t ) { return new GETSTATIC(cp.addFieldref(class_name, name, t.getSignature())); } - public PUTFIELD createPutField( String class_name, String name, Type t ) { + public PUTFIELD createPutField( final String class_name, final String name, final Type t ) { return new PUTFIELD(cp.addFieldref(class_name, name, t.getSignature())); } - public PUTSTATIC createPutStatic( String class_name, String name, Type t ) { + public PUTSTATIC createPutStatic( final String class_name, final String name, final Type t ) { return new PUTSTATIC(cp.addFieldref(class_name, name, t.getSignature())); } - public CHECKCAST createCheckCast( ReferenceType t ) { + public CHECKCAST createCheckCast( final ReferenceType t ) { if (t instanceof ArrayType) { return new CHECKCAST(cp.addArrayClass((ArrayType) t)); } @@ -640,7 +640,7 @@ public class InstructionFactory { } - public INSTANCEOF createInstanceOf( ReferenceType t ) { + public INSTANCEOF createInstanceOf( final ReferenceType t ) { if (t instanceof ArrayType) { return new INSTANCEOF(cp.addArrayClass((ArrayType) t)); } @@ -648,12 +648,12 @@ public class InstructionFactory { } - public NEW createNew( ObjectType t ) { + public NEW createNew( final ObjectType t ) { return new NEW(cp.addClass(t)); } - public NEW createNew( String s ) { + public NEW createNew( final String s ) { return createNew(ObjectType.getInstance(s)); } @@ -661,7 +661,7 @@ public class InstructionFactory { /** Create new array of given size and type. * @return an instruction that creates the corresponding array at runtime, i.e. is an AllocationInstruction */ - public Instruction createNewArray( Type t, short dim ) { + public Instruction createNewArray( final Type t, final short dim ) { if (dim == 1) { if (t instanceof ObjectType) { return new ANEWARRAY(cp.addClass((ObjectType) t)); @@ -683,7 +683,7 @@ public class InstructionFactory { /** Create "null" value for reference types, 0 for basic types like int */ - public static Instruction createNull( Type type ) { + public static Instruction createNull( final Type type ) { switch (type.getType()) { case Const.T_ARRAY: case Const.T_OBJECT: @@ -711,7 +711,7 @@ public class InstructionFactory { /** Create branch instruction by given opcode, except LOOKUPSWITCH and TABLESWITCH. * For those you should use the SWITCH compound instruction. */ - public static BranchInstruction createBranchInstruction( short opcode, InstructionHandle target ) { + public static BranchInstruction createBranchInstruction( final short opcode, final InstructionHandle target ) { switch (opcode) { case Const.IFEQ: return new IFEQ(target); @@ -759,7 +759,7 @@ public class InstructionFactory { } - public void setClassGen( ClassGen c ) { + public void setClassGen( final ClassGen c ) { cg = c; } @@ -769,7 +769,7 @@ public class InstructionFactory { } - public void setConstantPool( ConstantPoolGen c ) { + public void setConstantPool( final ConstantPoolGen c ) { cp = c; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java index 70072d37..b4a9544f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java @@ -77,7 +77,7 @@ public class InstructionHandle { * Replace current instruction contained in this handle. * Old instruction is disposed using Instruction.dispose(). */ - public void setInstruction( Instruction i ) { // Overridden in BranchHandle TODO could be package-protected? + public void setInstruction( final Instruction i ) { // Overridden in BranchHandle TODO could be package-protected? if (i == null) { throw new ClassGenException("Assigning null to handle"); } @@ -96,14 +96,14 @@ public class InstructionHandle { * anything. Meant to be used by a debugger, implementing * breakpoints. Current instruction is returned. */ - public Instruction swapInstruction( Instruction i ) { + public Instruction swapInstruction( final Instruction i ) { Instruction oldInstruction = instruction; instruction = i; return oldInstruction; } - /*private*/protected InstructionHandle(Instruction i) { + /*private*/protected InstructionHandle(final Instruction i) { setInstruction(i); } @@ -112,7 +112,7 @@ public class InstructionHandle { /** Factory method. */ - static InstructionHandle getInstructionHandle( Instruction i ) { + static InstructionHandle getInstructionHandle( final Instruction i ) { if (ih_list == null) { return new InstructionHandle(i); } @@ -133,7 +133,7 @@ public class InstructionHandle { * @param max_offset the maximum offset that may be caused by these instructions * @return additional offset caused by possible change of this instruction's length */ - protected int updatePosition( int offset, int max_offset ) { + protected int updatePosition( final int offset, final int max_offset ) { i_position += offset; return 0; } @@ -151,7 +151,7 @@ public class InstructionHandle { /** Set the position, i.e., the byte code offset of the contained * instruction. */ - void setPosition( int pos ) { + void setPosition( final int pos ) { i_position = pos; } @@ -190,7 +190,7 @@ public class InstructionHandle { /** * Denote this handle isn't referenced anymore by t. */ - public void removeTargeter( InstructionTargeter t ) { + public void removeTargeter( final InstructionTargeter t ) { if (targeters != null) { targeters.remove(t); } @@ -200,7 +200,7 @@ public class InstructionHandle { /** * Denote this handle is being referenced by t. */ - public void addTargeter( InstructionTargeter t ) { + public void addTargeter( final InstructionTargeter t ) { if (targeters == null) { targeters = new HashSet<>(); } @@ -229,7 +229,7 @@ public class InstructionHandle { /** @return a (verbose) string representation of the contained instruction. */ - public String toString( boolean verbose ) { + public String toString( final boolean verbose ) { return Utility.format(i_position, 4, false, ' ') + ": " + instruction.toString(verbose); } @@ -247,7 +247,7 @@ public class InstructionHandle { * @param key the key object to store/retrieve the attribute * @param attr the attribute to associate with this handle */ - public void addAttribute( Object key, Object attr ) { + public void addAttribute( final Object key, final Object attr ) { if (attributes == null) { attributes = new HashMap<>(3); } @@ -259,7 +259,7 @@ public class InstructionHandle { * * @param key the key object to retrieve the attribute */ - public void removeAttribute( Object key ) { + public void removeAttribute( final Object key ) { if (attributes != null) { attributes.remove(key); } @@ -270,7 +270,7 @@ public class InstructionHandle { * * @param key the key object to store/retrieve the attribute */ - public Object getAttribute( Object key ) { + public Object getAttribute( final Object key ) { if (attributes != null) { return attributes.get(key); } @@ -292,7 +292,7 @@ public class InstructionHandle { * * @param v Visitor object */ - public void accept( Visitor v ) { + public void accept( final Visitor v ) { instruction.accept(v); } @@ -301,7 +301,7 @@ public class InstructionHandle { * @param next the next to set * @ since 6.0 */ - final InstructionHandle setNext(InstructionHandle next) { + final InstructionHandle setNext(final InstructionHandle next) { this.next = next; return next; } @@ -311,7 +311,7 @@ public class InstructionHandle { * @param prev the prev to set * @ since 6.0 */ - final InstructionHandle setPrev(InstructionHandle prev) { + final InstructionHandle setPrev(final InstructionHandle prev) { this.prev = prev; return prev; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java index 066159be..15af4fa5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java @@ -62,7 +62,7 @@ public class InstructionList implements Iterable { * @param i * initial instruction */ - public InstructionList(Instruction i) { + public InstructionList(final Instruction i) { append(i); } @@ -72,7 +72,7 @@ public class InstructionList implements Iterable { * @param i * initial instruction */ - public InstructionList(BranchInstruction i) { + public InstructionList(final BranchInstruction i) { append(i); } @@ -82,7 +82,7 @@ public class InstructionList implements Iterable { * @param c * compound instruction (list) */ - public InstructionList(CompoundInstruction c) { + public InstructionList(final CompoundInstruction c) { append(c.getInstructionList()); } @@ -106,7 +106,7 @@ public class InstructionList implements Iterable { * target position to search for * @return target position's instruction handle if available */ - public static InstructionHandle findHandle(InstructionHandle[] ihs, int[] pos, int count, int target) { + public static InstructionHandle findHandle(final InstructionHandle[] ihs, final int[] pos, final int count, final int target) { int l = 0; int r = count - 1; /* @@ -134,7 +134,7 @@ public class InstructionList implements Iterable { * byte code position to search for * @return target position's instruction handle if available */ - public InstructionHandle findHandle(int pos) { + public InstructionHandle findHandle(final int pos) { int[] positions = byte_positions; InstructionHandle ih = start; for (int i = 0; i < length; i++) { @@ -152,7 +152,7 @@ public class InstructionList implements Iterable { * @param code * byte array containing the instructions */ - public InstructionList(byte[] code) { + public InstructionList(final byte[] code) { ByteSequence bytes = new ByteSequence(code); InstructionHandle[] ihs = new InstructionHandle[code.length]; int[] pos = new int[code.length]; // Can't be more than that @@ -225,7 +225,7 @@ public class InstructionList implements Iterable { * Instruction list to append to this one * @return instruction handle pointing to the first appended instruction */ - public InstructionHandle append(InstructionHandle ih, InstructionList il) { + public InstructionHandle append(final InstructionHandle ih, final InstructionList il) { if (il == null) { throw new ClassGenException("Appending null InstructionList"); } @@ -256,7 +256,7 @@ public class InstructionList implements Iterable { * Instruction list to append to this one * @return instruction handle pointing to the first appended instruction */ - public InstructionHandle append(Instruction i, InstructionList il) { + public InstructionHandle append(final Instruction i, final InstructionList il) { InstructionHandle ih; if ((ih = findInstruction2(i)) == null) { throw new ClassGenException("Instruction " + i + " is not contained in this list."); @@ -271,7 +271,7 @@ public class InstructionList implements Iterable { * list to append to end of this list * @return instruction handle of the first appended instruction */ - public InstructionHandle append(InstructionList il) { + public InstructionHandle append(final InstructionList il) { if (il == null) { throw new ClassGenException("Appending null InstructionList"); } @@ -294,7 +294,7 @@ public class InstructionList implements Iterable { * @param ih * instruction to append */ - private void append(InstructionHandle ih) { + private void append(final InstructionHandle ih) { if (isEmpty()) { start = end = ih; ih.setNext(ih.setPrev(null)); @@ -314,7 +314,7 @@ public class InstructionList implements Iterable { * instruction to append * @return instruction handle of the appended instruction */ - public InstructionHandle append(Instruction i) { + public InstructionHandle append(final Instruction i) { InstructionHandle ih = InstructionHandle.getInstructionHandle(i); append(ih); return ih; @@ -327,7 +327,7 @@ public class InstructionList implements Iterable { * branch instruction to append * @return branch instruction handle of the appended instruction */ - public BranchHandle append(BranchInstruction i) { + public BranchHandle append(final BranchInstruction i) { BranchHandle ih = BranchHandle.getBranchHandle(i); append(ih); return ih; @@ -342,7 +342,7 @@ public class InstructionList implements Iterable { * Instruction to append after i in list * @return instruction handle of the first appended instruction */ - public InstructionHandle append(Instruction i, Instruction j) { + public InstructionHandle append(final Instruction i, final Instruction j) { return append(i, new InstructionList(j)); } @@ -355,7 +355,7 @@ public class InstructionList implements Iterable { * The composite instruction (containing an InstructionList) * @return instruction handle of the first appended instruction */ - public InstructionHandle append(Instruction i, CompoundInstruction c) { + public InstructionHandle append(final Instruction i, final CompoundInstruction c) { return append(i, c.getInstructionList()); } @@ -366,7 +366,7 @@ public class InstructionList implements Iterable { * The composite instruction (containing an InstructionList) * @return instruction handle of the first appended instruction */ - public InstructionHandle append(CompoundInstruction c) { + public InstructionHandle append(final CompoundInstruction c) { return append(c.getInstructionList()); } @@ -379,7 +379,7 @@ public class InstructionList implements Iterable { * The composite instruction (containing an InstructionList) * @return instruction handle of the first appended instruction */ - public InstructionHandle append(InstructionHandle ih, CompoundInstruction c) { + public InstructionHandle append(final InstructionHandle ih, final CompoundInstruction c) { return append(ih, c.getInstructionList()); } @@ -392,7 +392,7 @@ public class InstructionList implements Iterable { * Instruction to append * @return instruction handle pointing to the first appended instruction */ - public InstructionHandle append(InstructionHandle ih, Instruction i) { + public InstructionHandle append(final InstructionHandle ih, final Instruction i) { return append(ih, new InstructionList(i)); } @@ -405,7 +405,7 @@ public class InstructionList implements Iterable { * Instruction to append * @return instruction handle pointing to the first appended instruction */ - public BranchHandle append(InstructionHandle ih, BranchInstruction i) { + public BranchHandle append(final InstructionHandle ih, final BranchInstruction i) { BranchHandle bh = BranchHandle.getBranchHandle(i); InstructionList il = new InstructionList(); il.append(bh); @@ -422,7 +422,7 @@ public class InstructionList implements Iterable { * Instruction list to insert * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert(InstructionHandle ih, InstructionList il) { + public InstructionHandle insert(final InstructionHandle ih, final InstructionList il) { if (il == null) { throw new ClassGenException("Inserting null InstructionList"); } @@ -451,7 +451,7 @@ public class InstructionList implements Iterable { * list to insert before start of this list * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert(InstructionList il) { + public InstructionHandle insert(final InstructionList il) { if (isEmpty()) { append(il); // Code is identical for this case return start; @@ -465,7 +465,7 @@ public class InstructionList implements Iterable { * @param ih * instruction to insert */ - private void insert(InstructionHandle ih) { + private void insert(final InstructionHandle ih) { if (isEmpty()) { start = end = ih; ih.setNext(ih.setPrev(null)); @@ -487,7 +487,7 @@ public class InstructionList implements Iterable { * Instruction list to insert * @return instruction handle pointing to the first inserted instruction, i.e., il.getStart() */ - public InstructionHandle insert(Instruction i, InstructionList il) { + public InstructionHandle insert(final Instruction i, final InstructionList il) { InstructionHandle ih; if ((ih = findInstruction1(i)) == null) { throw new ClassGenException("Instruction " + i + " is not contained in this list."); @@ -502,7 +502,7 @@ public class InstructionList implements Iterable { * instruction to insert * @return instruction handle of the inserted instruction */ - public InstructionHandle insert(Instruction i) { + public InstructionHandle insert(final Instruction i) { InstructionHandle ih = InstructionHandle.getInstructionHandle(i); insert(ih); return ih; @@ -515,7 +515,7 @@ public class InstructionList implements Iterable { * branch instruction to insert * @return branch instruction handle of the appended instruction */ - public BranchHandle insert(BranchInstruction i) { + public BranchHandle insert(final BranchInstruction i) { BranchHandle ih = BranchHandle.getBranchHandle(i); insert(ih); return ih; @@ -530,7 +530,7 @@ public class InstructionList implements Iterable { * Instruction to insert before i in list * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert(Instruction i, Instruction j) { + public InstructionHandle insert(final Instruction i, final Instruction j) { return insert(i, new InstructionList(j)); } @@ -543,7 +543,7 @@ public class InstructionList implements Iterable { * The composite instruction (containing an InstructionList) * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert(Instruction i, CompoundInstruction c) { + public InstructionHandle insert(final Instruction i, final CompoundInstruction c) { return insert(i, c.getInstructionList()); } @@ -554,7 +554,7 @@ public class InstructionList implements Iterable { * The composite instruction (containing an InstructionList) * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert(CompoundInstruction c) { + public InstructionHandle insert(final CompoundInstruction c) { return insert(c.getInstructionList()); } @@ -567,7 +567,7 @@ public class InstructionList implements Iterable { * Instruction to insert * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert(InstructionHandle ih, Instruction i) { + public InstructionHandle insert(final InstructionHandle ih, final Instruction i) { return insert(ih, new InstructionList(i)); } @@ -580,7 +580,7 @@ public class InstructionList implements Iterable { * The composite instruction (containing an InstructionList) * @return instruction handle of the first inserted instruction */ - public InstructionHandle insert(InstructionHandle ih, CompoundInstruction c) { + public InstructionHandle insert(final InstructionHandle ih, final CompoundInstruction c) { return insert(ih, c.getInstructionList()); } @@ -593,7 +593,7 @@ public class InstructionList implements Iterable { * Instruction to insert * @return instruction handle of the first inserted instruction */ - public BranchHandle insert(InstructionHandle ih, BranchInstruction i) { + public BranchHandle insert(final InstructionHandle ih, final BranchInstruction i) { BranchHandle bh = BranchHandle.getBranchHandle(i); InstructionList il = new InstructionList(); il.append(bh); @@ -613,7 +613,7 @@ public class InstructionList implements Iterable { * @param target * of moved block */ - public void move(InstructionHandle start, InstructionHandle end, InstructionHandle target) { + public void move(final InstructionHandle start, final InstructionHandle end, final InstructionHandle target) { // Step 1: Check constraints if ((start == null) || (end == null)) { throw new ClassGenException("Invalid null handle: From " + start + " to " + end); @@ -670,7 +670,7 @@ public class InstructionList implements Iterable { * @param target * new location of moved instruction */ - public void move(InstructionHandle ih, InstructionHandle target) { + public void move(final InstructionHandle ih, final InstructionHandle target) { move(ih, ih, target); } @@ -683,7 +683,7 @@ public class InstructionList implements Iterable { * @param next * where to end deleting (successor, exclusive) */ - private void remove(InstructionHandle prev, InstructionHandle next) throws TargetLostException { + private void remove(final InstructionHandle prev, InstructionHandle next) throws TargetLostException { InstructionHandle first; InstructionHandle last; // First and last deleted instruction if ((prev == null) && (next == null)) { @@ -738,7 +738,7 @@ public class InstructionList implements Iterable { * @param ih * instruction (handle) to remove */ - public void delete(InstructionHandle ih) throws TargetLostException { + public void delete(final InstructionHandle ih) throws TargetLostException { remove(ih.getPrev(), ih.getNext()); } @@ -748,7 +748,7 @@ public class InstructionList implements Iterable { * @param i * instruction to remove */ - public void delete(Instruction i) throws TargetLostException { + public void delete(final Instruction i) throws TargetLostException { InstructionHandle ih; if ((ih = findInstruction1(i)) == null) { throw new ClassGenException("Instruction " + i + " is not contained in this list."); @@ -765,7 +765,7 @@ public class InstructionList implements Iterable { * @param to * where to end deleting (inclusive) */ - public void delete(InstructionHandle from, InstructionHandle to) throws TargetLostException { + public void delete(final InstructionHandle from, final InstructionHandle to) throws TargetLostException { remove(from.getPrev(), to.getNext()); } @@ -778,7 +778,7 @@ public class InstructionList implements Iterable { * @param to * where to end deleting (inclusive) */ - public void delete(Instruction from, Instruction to) throws TargetLostException { + public void delete(final Instruction from, final Instruction to) throws TargetLostException { InstructionHandle from_ih; InstructionHandle to_ih; if ((from_ih = findInstruction1(from)) == null) { @@ -797,7 +797,7 @@ public class InstructionList implements Iterable { * instruction to search for * @return instruction found on success, null otherwise */ - private InstructionHandle findInstruction1(Instruction i) { + private InstructionHandle findInstruction1(final Instruction i) { for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { if (ih.getInstruction() == i) { return ih; @@ -813,7 +813,7 @@ public class InstructionList implements Iterable { * instruction to search for * @return instruction found on success, null otherwise */ - private InstructionHandle findInstruction2(Instruction i) { + private InstructionHandle findInstruction2(final Instruction i) { for (InstructionHandle ih = end; ih != null; ih = ih.getPrev()) { if (ih.getInstruction() == i) { return ih; @@ -822,7 +822,7 @@ public class InstructionList implements Iterable { return null; } - public boolean contains(InstructionHandle i) { + public boolean contains(final InstructionHandle i) { if (i == null) { return false; } @@ -834,7 +834,7 @@ public class InstructionList implements Iterable { return false; } - public boolean contains(Instruction i) { + public boolean contains(final Instruction i) { return findInstruction1(i) != null; } @@ -848,7 +848,7 @@ public class InstructionList implements Iterable { * @param check * Perform sanity checks, e.g. if all targeted instructions really belong to this list */ - public void setPositions(boolean check) { // called by code in other packages + public void setPositions(final boolean check) { // called by code in other packages int max_additional_bytes = 0; int additional_bytes = 0; int index = 0; @@ -974,7 +974,7 @@ public class InstructionList implements Iterable { * toggle output format * @return String containing all instructions in this list. */ - public String toString(boolean verbose) { + public String toString(final boolean verbose) { StringBuilder buf = new StringBuilder(); for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { buf.append(ih.toString(verbose)).append("\n"); @@ -1085,7 +1085,7 @@ public class InstructionList implements Iterable { /** * Replace all references to the old constant pool with references to the new constant pool */ - public void replaceConstantPool(ConstantPoolGen old_cp, ConstantPoolGen new_cp) { + public void replaceConstantPool(final ConstantPoolGen old_cp, final ConstantPoolGen new_cp) { for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { Instruction i = ih.getInstruction(); if (i instanceof CPInstruction) { @@ -1152,7 +1152,7 @@ public class InstructionList implements Iterable { * @param new_target * the new target instruction handle */ - public void redirectBranches(InstructionHandle old_target, InstructionHandle new_target) { + public void redirectBranches(final InstructionHandle old_target, final InstructionHandle new_target) { for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { Instruction i = ih.getInstruction(); if (i instanceof BranchInstruction) { @@ -1184,7 +1184,7 @@ public class InstructionList implements Iterable { * the new target instruction handle * @see MethodGen */ - public void redirectLocalVariables(LocalVariableGen[] lg, InstructionHandle old_target, InstructionHandle new_target) { + public void redirectLocalVariables(final LocalVariableGen[] lg, final InstructionHandle old_target, final InstructionHandle new_target) { for (LocalVariableGen element : lg) { InstructionHandle start = element.getStart(); InstructionHandle end = element.getEnd(); @@ -1208,7 +1208,7 @@ public class InstructionList implements Iterable { * the new target instruction handle * @see MethodGen */ - public void redirectExceptionHandlers(CodeExceptionGen[] exceptions, InstructionHandle old_target, InstructionHandle new_target) { + public void redirectExceptionHandlers(final CodeExceptionGen[] exceptions, final InstructionHandle old_target, final InstructionHandle new_target) { for (CodeExceptionGen exception : exceptions) { if (exception.getStartPC() == old_target) { exception.setStartPC(new_target); @@ -1227,7 +1227,7 @@ public class InstructionList implements Iterable { /** * Add observer for this object. */ - public void addObserver(InstructionListObserver o) { + public void addObserver(final InstructionListObserver o) { if (observers == null) { observers = new ArrayList<>(); } @@ -1237,7 +1237,7 @@ public class InstructionList implements Iterable { /** * Remove observer for this object. */ - public void removeObserver(InstructionListObserver o) { + public void removeObserver(final InstructionListObserver o) { if (observers != null) { observers.remove(o); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java index 57729239..257bf8ef 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java @@ -43,7 +43,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti /** * @param index to constant pool */ - protected InvokeInstruction(short opcode, int index) { + protected InvokeInstruction(final short opcode, final int index) { super(opcode, index); } @@ -52,7 +52,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti * @return mnemonic for instruction with symbolic references resolved */ @Override - public String toString( ConstantPool cp ) { + public String toString( final ConstantPool cp ) { Constant c = cp.getConstant(super.getIndex()); StringTokenizer tok = new StringTokenizer(cp.constantToString(c)); return Const.getOpcodeName(super.getOpcode()) + " " + tok.nextToken().replace('.', '/') @@ -66,7 +66,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti * @return Number of words consumed from stack by this instruction */ @Override - public int consumeStack( ConstantPoolGen cpg ) { + public int consumeStack( final ConstantPoolGen cpg ) { int sum; if ((super.getOpcode() == Const.INVOKESTATIC) || (super.getOpcode() == Const.INVOKEDYNAMIC)) { sum = 0; @@ -86,7 +86,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti * @return Number of words produced onto stack by this instruction */ @Override - public int produceStack( ConstantPoolGen cpg ) { + public int produceStack( final ConstantPoolGen cpg ) { String signature = getSignature(cpg); return Type.getReturnTypeSize(signature); } @@ -95,28 +95,28 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti /** @return return type of referenced method. */ @Override - public Type getType( ConstantPoolGen cpg ) { + public Type getType( final ConstantPoolGen cpg ) { return getReturnType(cpg); } /** @return name of referenced method. */ - public String getMethodName( ConstantPoolGen cpg ) { + public String getMethodName( final ConstantPoolGen cpg ) { return getName(cpg); } /** @return return type of referenced method. */ - public Type getReturnType( ConstantPoolGen cpg ) { + public Type getReturnType( final ConstantPoolGen cpg ) { return Type.getReturnType(getSignature(cpg)); } /** @return argument types of referenced method. */ - public Type[] getArgumentTypes( ConstantPoolGen cpg ) { + public Type[] getArgumentTypes( final ConstantPoolGen cpg ) { return Type.getArgumentTypes(getSignature(cpg)); } @@ -127,7 +127,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti * @throws IllegalArgumentException if the referenced class is an array (this should not happen) */ @Override - public String getClassName( ConstantPoolGen cpg ) { + public String getClassName( final ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); String className = cp.getConstantString(cmr.getClassIndex(), Const.CONSTANT_Class); diff --git a/src/main/java/org/apache/commons/bcel6/generic/JSR.java b/src/main/java/org/apache/commons/bcel6/generic/JSR.java index 21bcf652..0564b1ab 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JSR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JSR.java @@ -35,7 +35,7 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { } - public JSR(InstructionHandle target) { + public JSR(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.JSR, target); } @@ -45,7 +45,7 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { super.setIndex(getTargetOffset()); if (super.getOpcode() == org.apache.commons.bcel6.Const.JSR) { super.dump(out); @@ -58,7 +58,7 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { @Override - protected int updatePosition( int offset, int max_offset ) { + protected int updatePosition( final int offset, final int max_offset ) { int i = getTargetOffset(); // Depending on old position value setPosition(getPosition() + offset); // Position may be shifted by preceding expansions if (Math.abs(i) >= (Short.MAX_VALUE - max_offset)) { // to large for short (estimate) @@ -80,7 +80,7 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitVariableLengthInstruction(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java b/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java index 0322c342..7ffe2617 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java @@ -37,7 +37,7 @@ public class JSR_W extends JsrInstruction { } - public JSR_W(InstructionHandle target) { + public JSR_W(final InstructionHandle target) { super(org.apache.commons.bcel6.Const.JSR_W, target); super.setLength(5); } @@ -48,7 +48,7 @@ public class JSR_W extends JsrInstruction { * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { super.setIndex(getTargetOffset()); out.writeByte(super.getOpcode()); out.writeInt(super.getIndex()); @@ -59,7 +59,7 @@ public class JSR_W extends JsrInstruction { * Read needed data (e.g. index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { super.setIndex(bytes.readInt()); super.setLength(5); } @@ -74,7 +74,7 @@ public class JSR_W extends JsrInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitBranchInstruction(this); v.visitJsrInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java index 73dd0346..318bf2f1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java @@ -25,7 +25,7 @@ package org.apache.commons.bcel6.generic; public abstract class JsrInstruction extends BranchInstruction implements UnconditionalBranch, TypedInstruction, StackProducer { - JsrInstruction(short opcode, InstructionHandle target) { + JsrInstruction(final short opcode, final InstructionHandle target) { super(opcode, target); } @@ -41,7 +41,7 @@ public abstract class JsrInstruction extends BranchInstruction implements Uncond /** @return return address type */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return new ReturnaddressType(physicalSuccessor()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/L2D.java b/src/main/java/org/apache/commons/bcel6/generic/L2D.java index 91804e83..28557d33 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/L2D.java +++ b/src/main/java/org/apache/commons/bcel6/generic/L2D.java @@ -39,7 +39,7 @@ public class L2D extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/L2F.java b/src/main/java/org/apache/commons/bcel6/generic/L2F.java index 22acc4dc..f8ae8c3c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/L2F.java +++ b/src/main/java/org/apache/commons/bcel6/generic/L2F.java @@ -39,7 +39,7 @@ public class L2F extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/L2I.java b/src/main/java/org/apache/commons/bcel6/generic/L2I.java index 3e235eac..f57595f6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/L2I.java +++ b/src/main/java/org/apache/commons/bcel6/generic/L2I.java @@ -39,7 +39,7 @@ public class L2I extends ConversionInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LADD.java b/src/main/java/org/apache/commons/bcel6/generic/LADD.java index f6b379f1..8760ad85 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LADD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LADD.java @@ -40,7 +40,7 @@ public class LADD extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java index 118ce016..7d535156 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java @@ -41,7 +41,7 @@ public class LALOAD extends ArrayInstruction implements StackProducer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LAND.java b/src/main/java/org/apache/commons/bcel6/generic/LAND.java index d0b7f4a8..c0f82f98 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LAND.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LAND.java @@ -40,7 +40,7 @@ public class LAND extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java index 810b947f..cce1fe56 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java @@ -41,7 +41,7 @@ public class LASTORE extends ArrayInstruction implements StackConsumer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LCMP.java b/src/main/java/org/apache/commons/bcel6/generic/LCMP.java index cdc811d1..a7ecd90a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LCMP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LCMP.java @@ -34,7 +34,7 @@ public class LCMP extends Instruction implements TypedInstruction, StackProducer /** @return Type.LONG */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.LONG; } @@ -48,7 +48,7 @@ public class LCMP extends Instruction implements TypedInstruction, StackProducer * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LCONST.java b/src/main/java/org/apache/commons/bcel6/generic/LCONST.java index 0fefa82a..eb34212c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LCONST.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LCONST.java @@ -37,7 +37,7 @@ public class LCONST extends Instruction implements ConstantPushInstruction { } - public LCONST(long l) { + public LCONST(final long l) { super(org.apache.commons.bcel6.Const.LCONST_0, (short) 1); if (l == 0) { super.setOpcode(org.apache.commons.bcel6.Const.LCONST_0); @@ -59,7 +59,7 @@ public class LCONST extends Instruction implements ConstantPushInstruction { /** @return Type.LONG */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.LONG; } @@ -73,7 +73,7 @@ public class LCONST extends Instruction implements ConstantPushInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitPushInstruction(this); v.visitStackProducer(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC.java b/src/main/java/org/apache/commons/bcel6/generic/LDC.java index 673b45e3..00221c88 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC.java @@ -40,7 +40,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro } - public LDC(int index) { + public LDC(final int index) { super(org.apache.commons.bcel6.Const.LDC_W, index); setSize(); } @@ -63,7 +63,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { out.writeByte(super.getOpcode()); if (super.getLength() == 2) { // TODO useless check? out.writeByte(super.getIndex()); @@ -77,7 +77,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro * Set the index to constant pool and adjust size. */ @Override - public final void setIndex( int index ) { + public final void setIndex( final int index ) { super.setIndex(index); setSize(); } @@ -87,13 +87,13 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro * Read needed data (e.g. index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { super.setLength(2); super.setIndex(bytes.readUnsignedByte()); } - public Object getValue( ConstantPoolGen cpg ) { + public Object getValue( final ConstantPoolGen cpg ) { org.apache.commons.bcel6.classfile.Constant c = cpg.getConstantPool().getConstant(super.getIndex()); switch (c.getTag()) { case org.apache.commons.bcel6.Const.CONSTANT_String: @@ -115,7 +115,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro @Override - public Type getType( ConstantPoolGen cpg ) { + public Type getType( final ConstantPoolGen cpg ) { switch (cpg.getConstantPool().getConstant(super.getIndex()).getTag()) { case org.apache.commons.bcel6.Const.CONSTANT_String: return Type.STRING; @@ -146,7 +146,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java b/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java index 4559fd0b..7caf862f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java @@ -34,13 +34,13 @@ public class LDC2_W extends CPInstruction implements PushInstruction { } - public LDC2_W(int index) { + public LDC2_W(final int index) { super(org.apache.commons.bcel6.Const.LDC2_W, index); } @Override - public Type getType( ConstantPoolGen cpg ) { + public Type getType( final ConstantPoolGen cpg ) { switch (cpg.getConstantPool().getConstant(super.getIndex()).getTag()) { case org.apache.commons.bcel6.Const.CONSTANT_Long: return Type.LONG; @@ -52,7 +52,7 @@ public class LDC2_W extends CPInstruction implements PushInstruction { } - public Number getValue( ConstantPoolGen cpg ) { + public Number getValue( final ConstantPoolGen cpg ) { org.apache.commons.bcel6.classfile.Constant c = cpg.getConstantPool().getConstant(super.getIndex()); switch (c.getTag()) { case org.apache.commons.bcel6.Const.CONSTANT_Long: @@ -74,7 +74,7 @@ public class LDC2_W extends CPInstruction implements PushInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java b/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java index eda31a81..41c47ddd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java @@ -38,7 +38,7 @@ public class LDC_W extends LDC { } - public LDC_W(int index) { + public LDC_W(final int index) { super(index); } @@ -47,7 +47,7 @@ public class LDC_W extends LDC { * Read needed data (i.e., index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { setIndex(bytes.readUnsignedShort()); // Override just in case it has been changed super.setOpcode(org.apache.commons.bcel6.Const.LDC_W); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDIV.java b/src/main/java/org/apache/commons/bcel6/generic/LDIV.java index 21d57372..53e896c9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LDIV.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LDIV.java @@ -50,7 +50,7 @@ public class LDIV extends ArithmeticInstruction implements ExceptionThrower { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java b/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java index d3911fa5..1ef4df66 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java @@ -34,7 +34,7 @@ public class LLOAD extends LoadInstruction { } - public LLOAD(int n) { + public LLOAD(final int n) { super(org.apache.commons.bcel6.Const.LLOAD, org.apache.commons.bcel6.Const.LLOAD_0, n); } @@ -48,7 +48,7 @@ public class LLOAD extends LoadInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { super.accept(v); v.visitLLOAD(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LMUL.java b/src/main/java/org/apache/commons/bcel6/generic/LMUL.java index a475e0e4..5aff21f6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LMUL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LMUL.java @@ -40,7 +40,7 @@ public class LMUL extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LNEG.java b/src/main/java/org/apache/commons/bcel6/generic/LNEG.java index c9096dcb..9d6b0f43 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LNEG.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LNEG.java @@ -39,7 +39,7 @@ public class LNEG extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java index ec88ec6f..446b13d5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java @@ -38,7 +38,7 @@ public class LOOKUPSWITCH extends Select { } - public LOOKUPSWITCH(int[] match, InstructionHandle[] targets, InstructionHandle defaultTarget) { + public LOOKUPSWITCH(final int[] match, final InstructionHandle[] targets, final InstructionHandle defaultTarget) { super(org.apache.commons.bcel6.Const.LOOKUPSWITCH, match, targets, defaultTarget); /* alignment remainder assumed 0 here, until dump time. */ final short _length = (short) (9 + getMatch_length() * 8); @@ -52,7 +52,7 @@ public class LOOKUPSWITCH extends Select { * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { super.dump(out); final int _match_length = getMatch_length(); out.writeInt(_match_length); // npairs @@ -67,7 +67,7 @@ public class LOOKUPSWITCH extends Select { * Read needed data (e.g. index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { super.initFromFile(bytes, wide); // reads padding final int _match_length = bytes.readInt(); setMatch_length(_match_length); @@ -94,7 +94,7 @@ public class LOOKUPSWITCH extends Select { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitVariableLengthInstruction(this); v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LOR.java b/src/main/java/org/apache/commons/bcel6/generic/LOR.java index d370db92..0773133e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LOR.java @@ -39,7 +39,7 @@ public class LOR extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LREM.java b/src/main/java/org/apache/commons/bcel6/generic/LREM.java index 7257b3dc..28ff6504 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LREM.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LREM.java @@ -49,7 +49,7 @@ public class LREM extends ArithmeticInstruction implements ExceptionThrower { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java b/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java index 5c91ac44..d871616a 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java @@ -39,7 +39,7 @@ public class LRETURN extends ReturnInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSHL.java b/src/main/java/org/apache/commons/bcel6/generic/LSHL.java index 52e147a8..8bd23ba3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LSHL.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSHL.java @@ -39,7 +39,7 @@ public class LSHL extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSHR.java b/src/main/java/org/apache/commons/bcel6/generic/LSHR.java index 4fad1aeb..2537a57b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LSHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSHR.java @@ -39,7 +39,7 @@ public class LSHR extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java b/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java index 074b7cfb..f3ae48d0 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java @@ -34,7 +34,7 @@ public class LSTORE extends StoreInstruction { } - public LSTORE(int n) { + public LSTORE(final int n) { super(org.apache.commons.bcel6.Const.LSTORE, org.apache.commons.bcel6.Const.LSTORE_0, n); } @@ -48,7 +48,7 @@ public class LSTORE extends StoreInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { super.accept(v); v.visitLSTORE(this); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSUB.java b/src/main/java/org/apache/commons/bcel6/generic/LSUB.java index 04825a6f..f2bdc307 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LSUB.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LSUB.java @@ -40,7 +40,7 @@ public class LSUB extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java b/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java index 2b7e7c11..b2117173 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java @@ -39,7 +39,7 @@ public class LUSHR extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LXOR.java b/src/main/java/org/apache/commons/bcel6/generic/LXOR.java index 2d427f6a..4be38581 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LXOR.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LXOR.java @@ -39,7 +39,7 @@ public class LXOR extends ArithmeticInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitTypedInstruction(this); v.visitStackProducer(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java index 8995f9b5..0cf46cbc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java @@ -38,7 +38,7 @@ public class LineNumberGen implements InstructionTargeter, Cloneable { * * @param ih instruction handle to reference */ - public LineNumberGen(InstructionHandle ih, int src_line) { + public LineNumberGen(final InstructionHandle ih, final int src_line) { setInstruction(ih); setSourceLine(src_line); } @@ -48,7 +48,7 @@ public class LineNumberGen implements InstructionTargeter, Cloneable { * @return true, if ih is target of this line number */ @Override - public boolean containsTarget( InstructionHandle ih ) { + public boolean containsTarget( final InstructionHandle ih ) { return this.ih == ih; } @@ -58,7 +58,7 @@ public class LineNumberGen implements InstructionTargeter, Cloneable { * @param new_ih new target */ @Override - public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { + public void updateTarget( final InstructionHandle old_ih, final InstructionHandle new_ih ) { if (old_ih != ih) { throw new ClassGenException("Not targeting " + old_ih + ", but " + ih + "}"); } @@ -77,7 +77,7 @@ public class LineNumberGen implements InstructionTargeter, Cloneable { } - public void setInstruction( InstructionHandle ih ) { // TODO could be package-protected? + public void setInstruction( final InstructionHandle ih ) { // TODO could be package-protected? if (ih == null) { throw new NullPointerException("InstructionHandle may not be null"); } @@ -101,7 +101,7 @@ public class LineNumberGen implements InstructionTargeter, Cloneable { } - public void setSourceLine( int src_line ) { // TODO could be package-protected? + public void setSourceLine( final int src_line ) { // TODO could be package-protected? this.src_line = src_line; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java index 965c2dcf..cb3412cc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java @@ -30,7 +30,7 @@ public abstract class LoadInstruction extends LocalVariableInstruction implement * Instruction.readInstruction(). Not to be used otherwise. * tag and length are defined in readInstruction and initFromFile, respectively. */ - LoadInstruction(short canon_tag, short c_tag) { + LoadInstruction(final short canon_tag, final short c_tag) { super(canon_tag, c_tag); } @@ -40,7 +40,7 @@ public abstract class LoadInstruction extends LocalVariableInstruction implement * @param c_tag Instruction number for compact version, ALOAD_0, e.g. * @param n local variable index (unsigned short) */ - protected LoadInstruction(short opcode, short c_tag, int n) { + protected LoadInstruction(final short opcode, final short c_tag, final int n) { super(opcode, c_tag, n); } @@ -54,7 +54,7 @@ public abstract class LoadInstruction extends LocalVariableInstruction implement * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitPushInstruction(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java index 1f8909e2..ec7e7fec 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java @@ -49,8 +49,8 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo * @param start from where the instruction is valid (null means from the start) * @param end until where the instruction is valid (null means to the end) */ - public LocalVariableGen(int index, String name, Type type, InstructionHandle start, - InstructionHandle end) { + public LocalVariableGen(final int index, final String name, final Type type, final InstructionHandle start, + final InstructionHandle end) { if ((index < 0) || (index > Const.MAX_SHORT)) { throw new ClassGenException("Invalid index index: " + index); } @@ -76,7 +76,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo * * @param cp constant pool */ - public LocalVariable getLocalVariable( ConstantPoolGen cp ) { + public LocalVariable getLocalVariable( final ConstantPoolGen cp ) { int start_pc = 0; int length = 0; if ((start != null) && (end != null)) { @@ -93,7 +93,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo } - public void setIndex( int index ) { + public void setIndex( final int index ) { this.index = index; } @@ -104,7 +104,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo @Override - public void setName( String name ) { + public void setName( final String name ) { this.name = name; } @@ -116,7 +116,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo @Override - public void setType( Type type ) { + public void setType( final Type type ) { this.type = type; } @@ -137,13 +137,13 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo } - public void setStart( InstructionHandle start ) { // TODO could be package-protected? + public void setStart( final InstructionHandle start ) { // TODO could be package-protected? BranchInstruction.notifyTarget(this.start, start, this); this.start = start; } - public void setEnd( InstructionHandle end ) { // TODO could be package-protected? + public void setEnd( final InstructionHandle end ) { // TODO could be package-protected? BranchInstruction.notifyTarget(this.end, end, this); this.end = end; } @@ -154,7 +154,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo * @param new_ih new target */ @Override - public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { + public void updateTarget( final InstructionHandle old_ih, final InstructionHandle new_ih ) { boolean targeted = false; if (start == old_ih) { targeted = true; @@ -182,7 +182,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo * @return true, if ih is target of this variable */ @Override - public boolean containsTarget( InstructionHandle ih ) { + public boolean containsTarget( final InstructionHandle ih ) { return (start == ih) || (end == ih); } @@ -200,7 +200,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo * are valid in the same range. */ @Override - public boolean equals( Object o ) { + public boolean equals( final Object o ) { if (!(o instanceof LocalVariableGen)) { return false; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java index 58b11bb7..9a38f354 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java @@ -51,7 +51,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty * Instruction.readInstruction(). Not to be used otherwise. * tag and length are defined in readInstruction and initFromFile, respectively. */ - LocalVariableInstruction(short canon_tag, short c_tag) { + LocalVariableInstruction(final short canon_tag, final short c_tag) { super(); this.canon_tag = canon_tag; this.c_tag = c_tag; @@ -71,7 +71,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty * @param c_tag Instruction number for compact version, ALOAD_0, e.g. * @param n local variable index (unsigned short) */ - protected LocalVariableInstruction(short opcode, short c_tag, int n) { + protected LocalVariableInstruction(final short opcode, final short c_tag, final int n) { super(opcode, (short) 2); this.c_tag = c_tag; canon_tag = opcode; @@ -84,7 +84,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { if (wide()) { out.writeByte(Const.WIDE); } @@ -109,7 +109,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty * @return mnemonic for instruction */ @Override - public String toString( boolean verbose ) { + public String toString( final boolean verbose ) { final short _opcode = super.getOpcode(); if (((_opcode >= Const.ILOAD_0) && (_opcode <= Const.ALOAD_3)) || ((_opcode >= Const.ISTORE_0) && (_opcode <= Const.ASTORE_3))) { @@ -126,7 +126,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty * */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { if (wide) { n = bytes.readUnsignedShort(); super.setLength(4); @@ -163,7 +163,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty * @see #setIndexOnly(int) */ @Override - public void setIndex( int n ) { // TODO could be package-protected? + public void setIndex( final int n ) { // TODO could be package-protected? if ((n < 0) || (n > Const.MAX_SHORT)) { throw new ClassGenException("Illegal value: " + n); } @@ -199,7 +199,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty * @return type associated with the instruction */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { switch (canon_tag) { case Const.ILOAD: case Const.ISTORE: @@ -226,7 +226,7 @@ public abstract class LocalVariableInstruction extends Instruction implements Ty * @since 6.0 * @see #setIndex(int) */ - final void setIndexOnly(int n) { + final void setIndexOnly(final int n) { this.n = n; } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java b/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java index 19d13015..148d203e 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java @@ -49,7 +49,7 @@ public class MONITORENTER extends Instruction implements ExceptionThrower, Stack * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitStackConsumer(this); v.visitMONITORENTER(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java b/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java index 57d36a93..4841327c 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java @@ -49,7 +49,7 @@ public class MONITOREXIT extends Instruction implements ExceptionThrower, StackC * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitStackConsumer(this); v.visitMONITOREXIT(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java index 1a25f580..ba5b335b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java @@ -44,7 +44,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati } - public MULTIANEWARRAY(int index, short dimensions) { + public MULTIANEWARRAY(final int index, final short dimensions) { super(org.apache.commons.bcel6.Const.MULTIANEWARRAY, index); if (dimensions < 1) { throw new ClassGenException("Invalid dimensions value: " + dimensions); @@ -59,7 +59,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { out.writeByte(super.getOpcode()); out.writeShort(super.getIndex()); out.writeByte(dimensions); @@ -70,7 +70,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati * Read needed data (i.e., no. dimension) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { super.initFromFile(bytes, wide); dimensions = bytes.readByte(); super.setLength(4); @@ -89,7 +89,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati * @return mnemonic for instruction */ @Override - public String toString( boolean verbose ) { + public String toString( final boolean verbose ) { return super.toString(verbose) + " " + super.getIndex() + " " + dimensions; } @@ -98,7 +98,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati * @return mnemonic for instruction with symbolic references resolved */ @Override - public String toString( ConstantPool cp ) { + public String toString( final ConstantPool cp ) { return super.toString(cp) + " " + dimensions; } @@ -109,7 +109,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati * @return Number of words consumed from stack by this instruction */ @Override - public int consumeStack( ConstantPoolGen cpg ) { + public int consumeStack( final ConstantPoolGen cpg ) { return dimensions; } @@ -123,7 +123,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati @Override - public ObjectType getLoadClassType( ConstantPoolGen cpg ) { + public ObjectType getLoadClassType( final ConstantPoolGen cpg ) { Type t = getType(cpg); if (t instanceof ArrayType) { t = ((ArrayType) t).getBasicType(); @@ -141,7 +141,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitLoadClass(this); v.visitAllocationInstruction(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java index 9d310207..6a4dd92d 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java @@ -78,7 +78,7 @@ public class MethodGen extends FieldGenOrMethodGen { private static BCELComparator _cmp = new BCELComparator() { @Override - public boolean equals( Object o1, Object o2 ) { + public boolean equals( final Object o1, final Object o2 ) { MethodGen THIS = (MethodGen) o1; MethodGen THAT = (MethodGen) o2; return THIS.getName().equals(THAT.getName()) @@ -87,7 +87,7 @@ public class MethodGen extends FieldGenOrMethodGen { @Override - public int hashCode( Object o ) { + public int hashCode( final Object o ) { MethodGen THIS = (MethodGen) o; return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); } @@ -116,8 +116,8 @@ public class MethodGen extends FieldGenOrMethodGen { * abstract or native methods * @param cp constant pool */ - public MethodGen(int access_flags, Type return_type, Type[] arg_types, String[] arg_names, - String method_name, String class_name, InstructionList il, ConstantPoolGen cp) { + public MethodGen(final int access_flags, final Type return_type, final Type[] arg_types, String[] arg_names, + final String method_name, final String class_name, final InstructionList il, final ConstantPoolGen cp) { super(access_flags); setType(return_type); setArgumentTypes(arg_types); @@ -173,7 +173,7 @@ public class MethodGen extends FieldGenOrMethodGen { * @param class_name class name containing this method * @param cp constant pool */ - public MethodGen(Method m, String class_name, ConstantPoolGen cp) { + public MethodGen(final Method m, final String class_name, final ConstantPoolGen cp) { this(m.getAccessFlags(), Type.getReturnType(m.getSignature()), Type.getArgumentTypes(m .getSignature()), null /* may be overridden anyway */ , m.getName(), class_name, @@ -271,8 +271,8 @@ public class MethodGen extends FieldGenOrMethodGen { * @return new local variable object * @see LocalVariable */ - public LocalVariableGen addLocalVariable( String name, Type type, int slot, - InstructionHandle start, InstructionHandle end ) { + public LocalVariableGen addLocalVariable( final String name, final Type type, final int slot, + final InstructionHandle start, final InstructionHandle end ) { byte t = type.getType(); if (t != Const.T_ADDRESS) { int add = type.getSize(); @@ -305,8 +305,8 @@ public class MethodGen extends FieldGenOrMethodGen { * @return new local variable object * @see LocalVariable */ - public LocalVariableGen addLocalVariable( String name, Type type, InstructionHandle start, - InstructionHandle end ) { + public LocalVariableGen addLocalVariable( final String name, final Type type, final InstructionHandle start, + final InstructionHandle end ) { return addLocalVariable(name, type, max_locals, start, end); } @@ -315,7 +315,7 @@ public class MethodGen extends FieldGenOrMethodGen { * Remove a local variable, its slot will not be reused, if you do not use addLocalVariable * with an explicit index argument. */ - public void removeLocalVariable( LocalVariableGen l ) { + public void removeLocalVariable( final LocalVariableGen l ) { l.dispose(); variable_vec.remove(l); } @@ -353,7 +353,7 @@ public class MethodGen extends FieldGenOrMethodGen { if (size > 1) { Arrays.sort(lg, new Comparator() { @Override - public int compare(LocalVariableGen o1, LocalVariableGen o2) { + public int compare(final LocalVariableGen o1, final LocalVariableGen o2) { return o1.getIndex() - o2.getIndex(); } }); @@ -365,7 +365,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * @return `LocalVariableTable' attribute of all the local variables of this method. */ - public LocalVariableTable getLocalVariableTable( ConstantPoolGen cp ) { + public LocalVariableTable getLocalVariableTable( final ConstantPoolGen cp ) { LocalVariableGen[] lg = getLocalVariables(); int size = lg.length; LocalVariable[] lv = new LocalVariable[size]; @@ -384,7 +384,7 @@ public class MethodGen extends FieldGenOrMethodGen { * @return new line number object * @see LineNumber */ - public LineNumberGen addLineNumber( InstructionHandle ih, int src_line ) { + public LineNumberGen addLineNumber( final InstructionHandle ih, final int src_line ) { LineNumberGen l = new LineNumberGen(ih, src_line); line_number_vec.add(l); return l; @@ -394,7 +394,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * Remove a line number. */ - public void removeLineNumber( LineNumberGen l ) { + public void removeLineNumber( final LineNumberGen l ) { line_number_vec.remove(l); } @@ -420,7 +420,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * @return `LineNumberTable' attribute of all the local variables of this method. */ - public LineNumberTable getLineNumberTable( ConstantPoolGen cp ) { + public LineNumberTable getLineNumberTable( final ConstantPoolGen cp ) { int size = line_number_vec.size(); LineNumber[] ln = new LineNumber[size]; for (int i = 0; i < size; i++) { @@ -442,8 +442,8 @@ public class MethodGen extends FieldGenOrMethodGen { * exception is handled * @return new exception handler object */ - public CodeExceptionGen addExceptionHandler( InstructionHandle start_pc, - InstructionHandle end_pc, InstructionHandle handler_pc, ObjectType catch_type ) { + public CodeExceptionGen addExceptionHandler( final InstructionHandle start_pc, + final InstructionHandle end_pc, final InstructionHandle handler_pc, final ObjectType catch_type ) { if ((start_pc == null) || (end_pc == null) || (handler_pc == null)) { throw new ClassGenException("Exception handler target is null instruction"); } @@ -456,7 +456,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * Remove an exception handler. */ - public void removeExceptionHandler( CodeExceptionGen c ) { + public void removeExceptionHandler( final CodeExceptionGen c ) { exception_vec.remove(c); } @@ -498,7 +498,7 @@ public class MethodGen extends FieldGenOrMethodGen { * * @param class_name (fully qualified) name of exception */ - public void addException( String class_name ) { + public void addException( final String class_name ) { throws_vec.add(class_name); } @@ -506,7 +506,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * Remove an exception. */ - public void removeException( String c ) { + public void removeException( final String c ) { throws_vec.remove(c); } @@ -532,7 +532,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * @return `Exceptions' attribute of all the exceptions thrown by this method. */ - private ExceptionTable getExceptionTable( ConstantPoolGen cp ) { + private ExceptionTable getExceptionTable( final ConstantPoolGen cp ) { int size = throws_vec.size(); int[] ex = new int[size]; for (int i = 0; i < size; i++) { @@ -551,7 +551,7 @@ public class MethodGen extends FieldGenOrMethodGen { * * @param a attribute to be added */ - public void addCodeAttribute( Attribute a ) { + public void addCodeAttribute( final Attribute a ) { code_attrs_vec.add(a); } @@ -559,7 +559,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * Remove a code attribute. */ - public void removeCodeAttribute( Attribute a ) { + public void removeCodeAttribute( final Attribute a ) { code_attrs_vec.remove(a); } @@ -584,7 +584,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * @since 6.0 */ - public void addAnnotationsAsAttribute(ConstantPoolGen cp) { + public void addAnnotationsAsAttribute(final ConstantPoolGen cp) { Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp, super.getAnnotationEntries()); for (Attribute attr : attrs) { addAttribute(attr); @@ -594,7 +594,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * @since 6.0 */ - public void addParameterAnnotationsAsAttribute(ConstantPoolGen cp) { + public void addParameterAnnotationsAsAttribute(final ConstantPoolGen cp) { if (!hasParameterAnnotations) { return; } @@ -715,7 +715,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * Set maximum number of local variables. */ - public void setMaxLocals( int m ) { + public void setMaxLocals( final int m ) { max_locals = m; } @@ -728,7 +728,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * Set maximum stack size for this method. */ - public void setMaxStack( int m ) { // TODO could be package-protected? + public void setMaxStack( final int m ) { // TODO could be package-protected? max_stack = m; } @@ -745,12 +745,12 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setClassName( String class_name ) { // TODO could be package-protected? + public void setClassName( final String class_name ) { // TODO could be package-protected? this.class_name = class_name; } - public void setReturnType( Type return_type ) { + public void setReturnType( final Type return_type ) { setType(return_type); } @@ -760,7 +760,7 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setArgumentTypes( Type[] arg_types ) { + public void setArgumentTypes( final Type[] arg_types ) { this.arg_types = arg_types; } @@ -770,17 +770,17 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setArgumentType( int i, Type type ) { + public void setArgumentType( final int i, final Type type ) { arg_types[i] = type; } - public Type getArgumentType( int i ) { + public Type getArgumentType( final int i ) { return arg_types[i]; } - public void setArgumentNames( String[] arg_names ) { + public void setArgumentNames( final String[] arg_names ) { this.arg_names = arg_names; } @@ -790,12 +790,12 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setArgumentName( int i, String name ) { + public void setArgumentName( final int i, final String name ) { arg_names[i] = name; } - public String getArgumentName( int i ) { + public String getArgumentName( final int i ) { return arg_names[i]; } @@ -805,7 +805,7 @@ public class MethodGen extends FieldGenOrMethodGen { } - public void setInstructionList( InstructionList il ) { // TODO could be package-protected? + public void setInstructionList( final InstructionList il ) { // TODO could be package-protected? this.il = il; } @@ -860,7 +860,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** Do not/Do produce attributes code attributesLineNumberTable and * LocalVariableTable, like javac -O */ - public void stripAttributes( boolean flag ) { + public void stripAttributes( final boolean flag ) { strip_attributes = flag; } @@ -870,7 +870,7 @@ public class MethodGen extends FieldGenOrMethodGen { final int stackDepth; - BranchTarget(InstructionHandle target, int stackDepth) { + BranchTarget(final InstructionHandle target, final int stackDepth) { this.target = target; this.stackDepth = stackDepth; } @@ -882,7 +882,7 @@ public class MethodGen extends FieldGenOrMethodGen { private final Hashtable visitedTargets = new Hashtable<>(); - public void push( InstructionHandle target, int stackDepth ) { + public void push( final InstructionHandle target, final int stackDepth ) { if (visited(target)) { return; } @@ -899,14 +899,14 @@ public class MethodGen extends FieldGenOrMethodGen { } - private BranchTarget visit( InstructionHandle target, int stackDepth ) { + private BranchTarget visit( final InstructionHandle target, final int stackDepth ) { BranchTarget bt = new BranchTarget(target, stackDepth); visitedTargets.put(target, bt); return bt; } - private boolean visited( InstructionHandle target ) { + private boolean visited( final InstructionHandle target ) { return visitedTargets.get(target) != null; } } @@ -917,7 +917,7 @@ public class MethodGen extends FieldGenOrMethodGen { * * @return maximum stack depth used by method */ - public static int getMaxStack( ConstantPoolGen cp, InstructionList il, CodeExceptionGen[] et ) { + public static int getMaxStack( final ConstantPoolGen cp, final InstructionList il, final CodeExceptionGen[] et ) { BranchStack branchTargets = new BranchStack(); /* Initially, populate the branch stack with the exception * handlers, because these aren't (necessarily) branched to @@ -993,7 +993,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** Add observer for this object. */ - public void addObserver( MethodObserver o ) { + public void addObserver( final MethodObserver o ) { if (observers == null) { observers = new ArrayList<>(); } @@ -1003,7 +1003,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** Remove observer for this object. */ - public void removeObserver( MethodObserver o ) { + public void removeObserver( final MethodObserver o ) { if (observers != null) { observers.remove(o); } @@ -1053,7 +1053,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** @return deep copy of this method */ - public MethodGen copy( String class_name, ConstantPoolGen cp ) { + public MethodGen copy( final String class_name, final ConstantPoolGen cp ) { Method m = ((MethodGen) clone()).getMethod(); MethodGen mg = new MethodGen(m, class_name, super.getConstantPool()); if (super.getConstantPool() != cp) { @@ -1069,7 +1069,7 @@ public class MethodGen extends FieldGenOrMethodGen { * Return a list of AnnotationGen objects representing parameter annotations * @since 6.0 */ - public List getAnnotationsOnParameter(int i) { + public List getAnnotationsOnParameter(final int i) { ensureExistingParameterAnnotationsUnpacked(); if (!hasParameterAnnotations || i>arg_types.length) { return null; @@ -1135,7 +1135,7 @@ public class MethodGen extends FieldGenOrMethodGen { haveUnpackedParameterAnnotations = true; } - private List makeMutableVersion(AnnotationEntry[] mutableArray) + private List makeMutableVersion(final AnnotationEntry[] mutableArray) { List result = new ArrayList<>(); for (AnnotationEntry element : mutableArray) { @@ -1145,8 +1145,8 @@ public class MethodGen extends FieldGenOrMethodGen { return result; } - public void addParameterAnnotation(int parameterIndex, - AnnotationEntryGen annotation) + public void addParameterAnnotation(final int parameterIndex, + final AnnotationEntryGen annotation) { ensureExistingParameterAnnotationsUnpacked(); if (!hasParameterAnnotations) @@ -1183,7 +1183,7 @@ public class MethodGen extends FieldGenOrMethodGen { /** * @param comparator Comparison strategy object */ - public static void setComparator( BCELComparator comparator ) { + public static void setComparator( final BCELComparator comparator ) { _cmp = comparator; } @@ -1196,7 +1196,7 @@ public class MethodGen extends FieldGenOrMethodGen { * @see java.lang.Object#equals(java.lang.Object) */ @Override - public boolean equals( Object obj ) { + public boolean equals( final Object obj ) { return _cmp.equals(this, obj); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/NEW.java b/src/main/java/org/apache/commons/bcel6/generic/NEW.java index 0f2e3ab5..b56659f9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NEW.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NEW.java @@ -36,7 +36,7 @@ public class NEW extends CPInstruction implements LoadClass, AllocationInstructi } - public NEW(int index) { + public NEW(final int index) { super(org.apache.commons.bcel6.Const.NEW, index); } @@ -50,7 +50,7 @@ public class NEW extends CPInstruction implements LoadClass, AllocationInstructi @Override - public ObjectType getLoadClassType( ConstantPoolGen cpg ) { + public ObjectType getLoadClassType( final ConstantPoolGen cpg ) { return (ObjectType) getType(cpg); } @@ -64,7 +64,7 @@ public class NEW extends CPInstruction implements LoadClass, AllocationInstructi * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitLoadClass(this); v.visitAllocationInstruction(this); v.visitExceptionThrower(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java b/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java index b3b8d40d..40edf5bd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java @@ -44,13 +44,13 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce } - public NEWARRAY(byte type) { + public NEWARRAY(final byte type) { super(org.apache.commons.bcel6.Const.NEWARRAY, (short) 2); this.type = type; } - public NEWARRAY(BasicType type) { + public NEWARRAY(final BasicType type) { this(type.getType()); } @@ -60,7 +60,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { out.writeByte(super.getOpcode()); out.writeByte(type); } @@ -86,7 +86,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce * @return mnemonic for instruction */ @Override - public String toString( boolean verbose ) { + public String toString( final boolean verbose ) { return super.toString(verbose) + " " + org.apache.commons.bcel6.Const.getTypeName(type); } @@ -95,7 +95,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce * Read needed data (e.g. index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { type = bytes.readByte(); super.setLength(2); } @@ -118,7 +118,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitAllocationInstruction(this); v.visitExceptionThrower(this); v.visitStackProducer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/NOP.java b/src/main/java/org/apache/commons/bcel6/generic/NOP.java index 80c63d6e..75421e79 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NOP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NOP.java @@ -38,7 +38,7 @@ public class NOP extends Instruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitNOP(this); } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java index bc77e70a..7220f0ca 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java @@ -35,18 +35,18 @@ public abstract class NameSignatureInstruction extends CPInstruction { super(); } - public NameSignatureInstruction(short opcode, int index) { + public NameSignatureInstruction(final short opcode, final int index) { super(opcode, index); } - public ConstantNameAndType getNameAndType(ConstantPoolGen cpg) { + public ConstantNameAndType getNameAndType(final ConstantPoolGen cpg) { ConstantPool cp = cpg.getConstantPool(); ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); return (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); } /** @return signature of referenced method/field. */ - public String getSignature(ConstantPoolGen cpg) { + public String getSignature(final ConstantPoolGen cpg) { ConstantPool cp = cpg.getConstantPool(); ConstantNameAndType cnat = getNameAndType(cpg); return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes(); @@ -54,7 +54,7 @@ public abstract class NameSignatureInstruction extends CPInstruction { /** @return name of referenced method/field. */ - public String getName(ConstantPoolGen cpg) { + public String getName(final ConstantPoolGen cpg) { ConstantPool cp = cpg.getConstantPool(); ConstantNameAndType cnat = getNameAndType(cpg); return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java index c31fe39c..43e44763 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java @@ -33,14 +33,14 @@ public class ObjectType extends ReferenceType { /** * @since 6.0 */ - public static ObjectType getInstance(String class_name) { + public static ObjectType getInstance(final String class_name) { return new ObjectType(class_name); } /** * @param class_name fully qualified class name, e.g. java.lang.String */ - public ObjectType(String class_name) { + public ObjectType(final String class_name) { super(Const.T_REFERENCE, "L" + class_name.replace('.', '/') + ";"); this.class_name = class_name.replace('/', '.'); } @@ -64,7 +64,7 @@ public class ObjectType extends ReferenceType { /** @return true if both type objects refer to the same class. */ @Override - public boolean equals( Object type ) { + public boolean equals( final Object type ) { return (type instanceof ObjectType) ? ((ObjectType) type).class_name.equals(class_name) : false; @@ -140,7 +140,7 @@ public class ObjectType extends ReferenceType { * @throws ClassNotFoundException if any of this class's superclasses * can't be found */ - public boolean subclassOf( ObjectType superclass ) throws ClassNotFoundException { + public boolean subclassOf( final ObjectType superclass ) throws ClassNotFoundException { if (this.referencesInterfaceExact() || superclass.referencesInterfaceExact()) { return false; } @@ -153,7 +153,7 @@ public class ObjectType extends ReferenceType { * @throws ClassNotFoundException if the class referenced by this type * can't be found */ - public boolean accessibleTo( ObjectType accessor ) throws ClassNotFoundException { + public boolean accessibleTo( final ObjectType accessor ) throws ClassNotFoundException { JavaClass jc = Repository.lookupClass(class_name); if (jc.isPublic()) { return true; diff --git a/src/main/java/org/apache/commons/bcel6/generic/POP.java b/src/main/java/org/apache/commons/bcel6/generic/POP.java index 26b1fb75..b568ddcd 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/POP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/POP.java @@ -40,7 +40,7 @@ public class POP extends StackInstruction implements PopInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitPopInstruction(this); v.visitStackInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/POP2.java b/src/main/java/org/apache/commons/bcel6/generic/POP2.java index 27eb536d..354b9310 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/POP2.java +++ b/src/main/java/org/apache/commons/bcel6/generic/POP2.java @@ -40,7 +40,7 @@ public class POP2 extends StackInstruction implements PopInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitPopInstruction(this); v.visitStackInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java index 37910176..adf113b8 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUSH.java @@ -36,7 +36,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * @param cp Constant pool * @param value to be pushed */ - public PUSH(ConstantPoolGen cp, int value) { + public PUSH(final ConstantPoolGen cp, final int value) { if ((value >= -1) && (value <= 5)) { instruction = InstructionConst.getInstruction(Const.ICONST_0 + value); } else if (Instruction.isValidByte(value)) { @@ -53,7 +53,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * @param cp Constant pool * @param value to be pushed */ - public PUSH(ConstantPoolGen cp, boolean value) { + public PUSH(final ConstantPoolGen cp, final boolean value) { instruction = InstructionConst.getInstruction(Const.ICONST_0 + (value ? 1 : 0)); } @@ -62,7 +62,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * @param cp Constant pool * @param value to be pushed */ - public PUSH(ConstantPoolGen cp, float value) { + public PUSH(final ConstantPoolGen cp, final float value) { if (value == 0.0) { instruction = InstructionConst.FCONST_0; } else if (value == 1.0) { @@ -79,7 +79,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * @param cp Constant pool * @param value to be pushed */ - public PUSH(ConstantPoolGen cp, long value) { + public PUSH(final ConstantPoolGen cp, final long value) { if (value == 0) { instruction = InstructionConst.LCONST_0; } else if (value == 1) { @@ -94,7 +94,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * @param cp Constant pool * @param value to be pushed */ - public PUSH(ConstantPoolGen cp, double value) { + public PUSH(final ConstantPoolGen cp, final double value) { if (value == 0.0) { instruction = InstructionConst.DCONST_0; } else if (value == 1.0) { @@ -109,7 +109,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * @param cp Constant pool * @param value to be pushed */ - public PUSH(ConstantPoolGen cp, String value) { + public PUSH(final ConstantPoolGen cp, final String value) { if (value == null) { instruction = InstructionConst.ACONST_NULL; } else { @@ -123,7 +123,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * @param value * @since 6.0 */ - public PUSH(ConstantPoolGen cp, ObjectType value) { + public PUSH(final ConstantPoolGen cp, final ObjectType value) { if (value == null) { instruction = InstructionConst.ACONST_NULL; } else { @@ -135,7 +135,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * @param cp Constant pool * @param value to be pushed */ - public PUSH(ConstantPoolGen cp, Number value) { + public PUSH(final ConstantPoolGen cp, final Number value) { if ((value instanceof Integer) || (value instanceof Short) || (value instanceof Byte)) { instruction = new PUSH(cp, value.intValue()).instruction; } else if (value instanceof Double) { @@ -157,7 +157,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * @param cp Constant pool * @param value to be pushed */ - public PUSH(ConstantPoolGen cp, Character value) { + public PUSH(final ConstantPoolGen cp, final Character value) { this(cp, value.charValue()); } @@ -166,7 +166,7 @@ public final class PUSH implements CompoundInstruction, VariableLengthInstructio * @param cp Constant pool * @param value to be pushed */ - public PUSH(ConstantPoolGen cp, Boolean value) { + public PUSH(final ConstantPoolGen cp, final Boolean value) { this(cp, value.booleanValue()); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java b/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java index e4e26390..9d671005 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java @@ -38,13 +38,13 @@ public class PUTFIELD extends FieldInstruction implements PopInstruction, Except } - public PUTFIELD(int index) { + public PUTFIELD(final int index) { super(Const.PUTFIELD, index); } @Override - public int consumeStack( ConstantPoolGen cpg ) { + public int consumeStack( final ConstantPoolGen cpg ) { return getFieldSize(cpg) + 1; } @@ -66,7 +66,7 @@ public class PUTFIELD extends FieldInstruction implements PopInstruction, Except * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitStackConsumer(this); v.visitPopInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java b/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java index 09dbe45f..e72dbf7b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java @@ -38,13 +38,13 @@ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, Pop } - public PUTSTATIC(int index) { + public PUTSTATIC(final int index) { super(Const.PUTSTATIC, index); } @Override - public int consumeStack( ConstantPoolGen cpg ) { + public int consumeStack( final ConstantPoolGen cpg ) { return getFieldSize(cpg); } @@ -65,7 +65,7 @@ public class PUTSTATIC extends FieldInstruction implements ExceptionThrower, Pop * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitStackConsumer(this); v.visitPopInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/RET.java b/src/main/java/org/apache/commons/bcel6/generic/RET.java index cf540728..e4a3193b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/RET.java +++ b/src/main/java/org/apache/commons/bcel6/generic/RET.java @@ -43,7 +43,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc } - public RET(int index) { + public RET(final int index) { super(org.apache.commons.bcel6.Const.RET, (short) 2); setIndex(index); // May set wide as side effect } @@ -54,7 +54,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { if (wide) { out.writeByte(org.apache.commons.bcel6.Const.WIDE); } @@ -81,7 +81,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc * Read needed data (e.g. index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { this.wide = wide; if (wide) { index = bytes.readUnsignedShort(); @@ -106,7 +106,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc * Set index of local variable containg the return address */ @Override - public final void setIndex( int n ) { + public final void setIndex( final int n ) { if (n < 0) { throw new ClassGenException("Negative index value: " + n); } @@ -119,7 +119,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc * @return mnemonic for instruction */ @Override - public String toString( boolean verbose ) { + public String toString( final boolean verbose ) { return super.toString(verbose) + " " + index; } @@ -127,7 +127,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc /** @return return address type */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return ReturnaddressType.NO_TARGET; } @@ -141,7 +141,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitRET(this); } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/RETURN.java b/src/main/java/org/apache/commons/bcel6/generic/RETURN.java index 09eb80e4..9c567370 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/RETURN.java +++ b/src/main/java/org/apache/commons/bcel6/generic/RETURN.java @@ -39,7 +39,7 @@ public class RETURN extends ReturnInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitExceptionThrower(this); v.visitTypedInstruction(this); v.visitStackConsumer(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java index b26ab076..86ceeff6 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java @@ -28,7 +28,7 @@ import org.apache.commons.bcel6.classfile.JavaClass; */ public abstract class ReferenceType extends Type { - protected ReferenceType(byte t, String s) { + protected ReferenceType(final byte t, final String s) { super(t, s); } @@ -51,7 +51,7 @@ public abstract class ReferenceType extends Type { * @throws ClassNotFoundException if any classes or interfaces required * to determine assignment compatibility can't be found */ - public boolean isCastableTo( Type t ) throws ClassNotFoundException { + public boolean isCastableTo( final Type t ) throws ClassNotFoundException { if (this.equals(Type.NULL)) { return t instanceof ReferenceType; // If this is ever changed in isAssignmentCompatible() } @@ -69,7 +69,7 @@ public abstract class ReferenceType extends Type { * @throws ClassNotFoundException if any classes or interfaces required * to determine assignment compatibility can't be found */ - public boolean isAssignmentCompatibleWith( Type t ) throws ClassNotFoundException { + public boolean isAssignmentCompatibleWith( final Type t ) throws ClassNotFoundException { if (!(t instanceof ReferenceType)) { return false; } @@ -190,7 +190,7 @@ public abstract class ReferenceType extends Type { * @throws ClassNotFoundException on failure to find superclasses of this * type, or the type passed as a parameter */ - public ReferenceType getFirstCommonSuperclass( ReferenceType t ) throws ClassNotFoundException { + public ReferenceType getFirstCommonSuperclass( final ReferenceType t ) throws ClassNotFoundException { if (this.equals(Type.NULL)) { return t; } @@ -274,7 +274,7 @@ public abstract class ReferenceType extends Type { * type, or the type passed as a parameter */ @Deprecated - public ReferenceType firstCommonSuperclass( ReferenceType t ) throws ClassNotFoundException { + public ReferenceType firstCommonSuperclass( final ReferenceType t ) throws ClassNotFoundException { if (this.equals(Type.NULL)) { return t; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java index 4ea1bc68..a30391a5 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java @@ -39,7 +39,7 @@ public abstract class ReturnInstruction extends Instruction implements Exception /** * @param opcode of instruction */ - protected ReturnInstruction(short opcode) { + protected ReturnInstruction(final short opcode) { super(opcode, (short) 1); } @@ -76,7 +76,7 @@ public abstract class ReturnInstruction extends Instruction implements Exception /** @return type associated with the instruction */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return getType(); } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java b/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java index b9e56b68..eaf0d59f 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java +++ b/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java @@ -42,7 +42,7 @@ public class ReturnaddressType extends Type { /** * Creates a ReturnaddressType object with a target. */ - public ReturnaddressType(InstructionHandle returnTarget) { + public ReturnaddressType(final InstructionHandle returnTarget) { super(Const.T_ADDRESS, ""); this.returnTarget = returnTarget; } @@ -63,7 +63,7 @@ public class ReturnaddressType extends Type { * Returns if the two Returnaddresses refer to the same target. */ @Override - public boolean equals( Object rat ) { + public boolean equals( final Object rat ) { if (!(rat instanceof ReturnaddressType)) { return false; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java b/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java index 4b1b99f0..1326f6bc 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java @@ -39,7 +39,7 @@ public class SALOAD extends ArrayInstruction implements StackProducer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackProducer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java b/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java index b041eecf..12b428bf 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java @@ -39,7 +39,7 @@ public class SASTORE extends ArrayInstruction implements StackConsumer { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitExceptionThrower(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java b/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java index 48f50005..29e0d5fb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java @@ -42,7 +42,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { } - public SIPUSH(short b) { + public SIPUSH(final short b) { super(org.apache.commons.bcel6.Const.SIPUSH, (short) 3); this.b = b; } @@ -52,7 +52,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { * Dump instruction as short code to stream out. */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { super.dump(out); out.writeShort(b); } @@ -62,7 +62,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { * @return mnemonic for instruction */ @Override - public String toString( boolean verbose ) { + public String toString( final boolean verbose ) { return super.toString(verbose) + " " + b; } @@ -71,7 +71,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { * Read needed data (e.g. index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { super.setLength(3); b = bytes.readShort(); } @@ -86,7 +86,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { /** @return Type.SHORT */ @Override - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.SHORT; } @@ -100,7 +100,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitPushInstruction(this); v.visitStackProducer(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/SWAP.java b/src/main/java/org/apache/commons/bcel6/generic/SWAP.java index 797087d4..563fc154 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SWAP.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SWAP.java @@ -39,7 +39,7 @@ public class SWAP extends StackInstruction implements StackConsumer, StackProduc * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitStackProducer(this); v.visitStackInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java index a65d1c5b..28417428 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java @@ -47,7 +47,7 @@ public final class SWITCH implements CompoundInstruction { * @param target the default target * @param max_gap maximum gap that may between case branches */ - public SWITCH(int[] match, InstructionHandle[] targets, InstructionHandle target, int max_gap) { + public SWITCH(final int[] match, final InstructionHandle[] targets, final InstructionHandle target, final int max_gap) { this.match = match.clone(); this.targets = targets.clone(); if ((match_length = match.length) < 2) { @@ -64,12 +64,12 @@ public final class SWITCH implements CompoundInstruction { } - public SWITCH(int[] match, InstructionHandle[] targets, InstructionHandle target) { + public SWITCH(final int[] match, final InstructionHandle[] targets, final InstructionHandle target) { this(match, targets, target, 1); } - private void fillup( int max_gap, InstructionHandle target ) { + private void fillup( final int max_gap, final InstructionHandle target ) { int max_size = match_length + match_length * max_gap; int[] m_vec = new int[max_size]; InstructionHandle[] t_vec = new InstructionHandle[max_size]; @@ -98,7 +98,7 @@ public final class SWITCH implements CompoundInstruction { /** * Sort match and targets array with QuickSort. */ - private void sort( int l, int r ) { + private void sort( final int l, final int r ) { int i = l; int j = r; int h; @@ -134,7 +134,7 @@ public final class SWITCH implements CompoundInstruction { /** * @return match is sorted in ascending order with no gap bigger than max_gap? */ - private boolean matchIsOrdered( int max_gap ) { + private boolean matchIsOrdered( final int max_gap ) { for (int i = 1; i < match_length; i++) { if (match[i] - match[i - 1] > max_gap) { return false; diff --git a/src/main/java/org/apache/commons/bcel6/generic/Select.java b/src/main/java/org/apache/commons/bcel6/generic/Select.java index 0e9bf4c7..e9735311 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Select.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Select.java @@ -88,7 +88,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @param targets instruction targets * @param defaultTarget default instruction target */ - Select(short opcode, int[] match, InstructionHandle[] targets, InstructionHandle defaultTarget) { + Select(final short opcode, final int[] match, final InstructionHandle[] targets, final InstructionHandle defaultTarget) { // don't set default target before instuction is built super(opcode, null); this.match = match; @@ -120,7 +120,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @return additional offset caused by possible change of this instruction's length */ @Override - protected int updatePosition( int offset, int max_offset ) { + protected int updatePosition( final int offset, final int max_offset ) { setPosition(getPosition() + offset); // Additional offset caused by preceding SWITCHs, GOTOs, etc. short old_length = (short) super.getLength(); /* Alignment on 4-byte-boundary, + 1, because of tag byte. @@ -136,7 +136,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { out.writeByte(super.getOpcode()); for (int i = 0; i < padding; i++) { out.writeByte(0); @@ -150,7 +150,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * Read needed data (e.g. index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { padding = (4 - (bytes.getIndex() % 4)) % 4; // Compute number of pad bytes for (int i = 0; i < padding; i++) { bytes.readByte(); @@ -164,7 +164,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @return mnemonic for instruction */ @Override - public String toString( boolean verbose ) { + public String toString( final boolean verbose ) { StringBuilder buf = new StringBuilder(super.toString(verbose)); if (verbose) { for (int i = 0; i < match_length; i++) { @@ -185,7 +185,7 @@ public abstract class Select extends BranchInstruction implements VariableLength /** * Set branch target for `i'th case */ - public void setTarget( int i, InstructionHandle target ) { // TODO could be package-protected? + public void setTarget( final int i, final InstructionHandle target ) { // TODO could be package-protected? notifyTarget(targets[i], target, this); targets[i] = target; } @@ -196,7 +196,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @param new_ih new target */ @Override - public void updateTarget( InstructionHandle old_ih, InstructionHandle new_ih ) { + public void updateTarget( final InstructionHandle old_ih, final InstructionHandle new_ih ) { boolean targeted = false; if (super.getTarget() == old_ih) { targeted = true; @@ -218,7 +218,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @return true, if ih is target of this instruction */ @Override - public boolean containsTarget( InstructionHandle ih ) { + public boolean containsTarget( final InstructionHandle ih ) { if (super.getTarget() == ih) { return true; } @@ -280,7 +280,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @return match entry * @since 6.0 */ - final int getMatch(int index) { + final int getMatch(final int index) { return match[index]; } @@ -289,7 +289,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @return index entry from indices * @since 6.0 */ - final int getIndices(int index) { + final int getIndices(final int index) { return indices[index]; } @@ -297,7 +297,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @return target entry * @since 6.0 */ - final InstructionHandle getTarget(int index) { + final InstructionHandle getTarget(final int index) { return targets[index]; } @@ -315,7 +315,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @param fixed_length the fixed_length to set * @since 6.0 */ - final void setFixed_length(int fixed_length) { + final void setFixed_length(final int fixed_length) { this.fixed_length = fixed_length; } @@ -333,7 +333,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @param match_length the match_length to set * @since 6.0 */ - final int setMatch_length(int match_length) { + final int setMatch_length(final int match_length) { this.match_length = match_length; return match_length; } @@ -344,7 +344,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @param value * @since 6.0 */ - final void setMatch(int index, int value) { + final void setMatch(final int index, final int value) { match[index] = value; } @@ -353,7 +353,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @param array * @since 6.0 */ - final void setIndices(int[] array) { + final void setIndices(final int[] array) { indices = array; } @@ -362,7 +362,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @param array * @since 6.0 */ - final void setMatches(int[] array) { + final void setMatches(final int[] array) { match = array; } @@ -371,7 +371,7 @@ public abstract class Select extends BranchInstruction implements VariableLength * @param array * @since 6.0 */ - final void setTargets(InstructionHandle[] array) { + final void setTargets(final InstructionHandle[] array) { targets = array; } @@ -386,7 +386,7 @@ public abstract class Select extends BranchInstruction implements VariableLength /** @since 6.0 */ - final int setIndices(int i, int value) { + final int setIndices(final int i, final int value) { indices[i] = value; return value; // Allow use in nested calls } diff --git a/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java b/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java index 82ed073b..23a46f76 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java @@ -44,55 +44,55 @@ public class SimpleElementValueGen extends ElementValueGen * Protected ctor used for deserialization, doesn't *put* an entry in the * constant pool, assumes the one at the supplied index is correct. */ - protected SimpleElementValueGen(int type, int idx, ConstantPoolGen cpGen) + protected SimpleElementValueGen(final int type, final int idx, final ConstantPoolGen cpGen) { super(type, cpGen); this.idx = idx; } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, int value) + public SimpleElementValueGen(final int type, final ConstantPoolGen cpGen, final int value) { super(type, cpGen); idx = getConstantPool().addInteger(value); } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, long value) + public SimpleElementValueGen(final int type, final ConstantPoolGen cpGen, final long value) { super(type, cpGen); idx = getConstantPool().addLong(value); } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, double value) + public SimpleElementValueGen(final int type, final ConstantPoolGen cpGen, final double value) { super(type, cpGen); idx = getConstantPool().addDouble(value); } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, float value) + public SimpleElementValueGen(final int type, final ConstantPoolGen cpGen, final float value) { super(type, cpGen); idx = getConstantPool().addFloat(value); } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, short value) + public SimpleElementValueGen(final int type, final ConstantPoolGen cpGen, final short value) { super(type, cpGen); idx = getConstantPool().addInteger(value); } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, byte value) + public SimpleElementValueGen(final int type, final ConstantPoolGen cpGen, final byte value) { super(type, cpGen); idx = getConstantPool().addInteger(value); } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, char value) + public SimpleElementValueGen(final int type, final ConstantPoolGen cpGen, final char value) { super(type, cpGen); idx = getConstantPool().addInteger(value); } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, boolean value) + public SimpleElementValueGen(final int type, final ConstantPoolGen cpGen, final boolean value) { super(type, cpGen); if (value) { @@ -102,7 +102,7 @@ public class SimpleElementValueGen extends ElementValueGen } } - public SimpleElementValueGen(int type, ConstantPoolGen cpGen, String value) + public SimpleElementValueGen(final int type, final ConstantPoolGen cpGen, final String value) { super(type, cpGen); idx = getConstantPool().addUtf8(value); @@ -113,8 +113,8 @@ public class SimpleElementValueGen extends ElementValueGen * the 'new'. You need to use this ctor if the annotation is being copied * from one file to another. */ - public SimpleElementValueGen(SimpleElementValue value, - ConstantPoolGen cpool, boolean copyPoolEntries) + public SimpleElementValueGen(final SimpleElementValue value, + final ConstantPoolGen cpool, final boolean copyPoolEntries) { super(value.getElementValueType(), cpool); if (!copyPoolEntries) @@ -245,7 +245,7 @@ public class SimpleElementValueGen extends ElementValueGen } @Override - public void dump(DataOutputStream dos) throws IOException + public void dump(final DataOutputStream dos) throws IOException { dos.writeByte(super.getElementValueType()); // u1 kind of value switch (super.getElementValueType()) diff --git a/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java index 6b9007e3..dc68efe3 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java @@ -35,14 +35,14 @@ public abstract class StackInstruction extends Instruction { /** * @param opcode instruction opcode */ - protected StackInstruction(short opcode) { + protected StackInstruction(final short opcode) { super(opcode, (short) 1); } /** @return Type.UNKNOWN */ - public Type getType( ConstantPoolGen cp ) { + public Type getType( final ConstantPoolGen cp ) { return Type.UNKNOWN; } } diff --git a/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java index 1dd60f5d..c3a1c1bb 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java @@ -30,7 +30,7 @@ public abstract class StoreInstruction extends LocalVariableInstruction implemen * Instruction.readInstruction(). Not to be used otherwise. * tag and length are defined in readInstruction and initFromFile, respectively. */ - StoreInstruction(short canon_tag, short c_tag) { + StoreInstruction(final short canon_tag, final short c_tag) { super(canon_tag, c_tag); } @@ -40,7 +40,7 @@ public abstract class StoreInstruction extends LocalVariableInstruction implemen * @param c_tag Instruction number for compact version, ASTORE_0, e.g. * @param n local variable index (unsigned short) */ - protected StoreInstruction(short opcode, short c_tag, int n) { + protected StoreInstruction(final short opcode, final short c_tag, final int n) { super(opcode, c_tag, n); } @@ -54,7 +54,7 @@ public abstract class StoreInstruction extends LocalVariableInstruction implemen * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitStackConsumer(this); v.visitPopInstruction(this); v.visitTypedInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java b/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java index a650beae..e1d780c1 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java @@ -44,7 +44,7 @@ public class TABLESWITCH extends Select { * @param targets where to branch for matched values * @param defaultTarget default branch */ - public TABLESWITCH(int[] match, InstructionHandle[] targets, InstructionHandle defaultTarget) { + public TABLESWITCH(final int[] match, final InstructionHandle[] targets, final InstructionHandle defaultTarget) { super(org.apache.commons.bcel6.Const.TABLESWITCH, match, targets, defaultTarget); /* Alignment remainder assumed 0 here, until dump time */ final short _length = (short) (13 + getMatch_length() * 4); @@ -58,7 +58,7 @@ public class TABLESWITCH extends Select { * @param out Output stream */ @Override - public void dump( DataOutputStream out ) throws IOException { + public void dump( final DataOutputStream out ) throws IOException { super.dump(out); final int _match_length = getMatch_length(); int low = (_match_length > 0) ? super.getMatch(0) : 0; @@ -75,7 +75,7 @@ public class TABLESWITCH extends Select { * Read needed data (e.g. index) from file. */ @Override - protected void initFromFile( ByteSequence bytes, boolean wide ) throws IOException { + protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { super.initFromFile(bytes, wide); int low = bytes.readInt(); int high = bytes.readInt(); @@ -103,7 +103,7 @@ public class TABLESWITCH extends Select { * @param v Visitor object */ @Override - public void accept( Visitor v ) { + public void accept( final Visitor v ) { v.visitVariableLengthInstruction(this); v.visitStackConsumer(this); v.visitBranchInstruction(this); diff --git a/src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java b/src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java index b5b7b7f5..e129cf30 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java +++ b/src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java @@ -51,7 +51,7 @@ public final class TargetLostException extends Exception { private final InstructionHandle[] targets; - TargetLostException(InstructionHandle[] t, String mesg) { + TargetLostException(final InstructionHandle[] t, final String mesg) { super(mesg); targets = t; } diff --git a/src/main/java/org/apache/commons/bcel6/generic/Type.java b/src/main/java/org/apache/commons/bcel6/generic/Type.java index 2a32c091..06ba20b9 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/Type.java +++ b/src/main/java/org/apache/commons/bcel6/generic/Type.java @@ -66,7 +66,7 @@ public abstract class Type { }; - protected Type(byte t, String s) { + protected Type(final byte t, final String s) { type = t; signature = s; } @@ -85,7 +85,7 @@ public abstract class Type { * @return whether the Types are equal */ @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { if (o instanceof Type) { Type t = (Type)o; return (type == t.type) && signature.equals(t.signature); @@ -158,7 +158,7 @@ public abstract class Type { * @param arg_types what are the argument types * @return method signature for given type(s). */ - public static String getMethodSignature( Type return_type, Type[] arg_types ) { + public static String getMethodSignature( final Type return_type, final Type[] arg_types ) { StringBuilder buf = new StringBuilder("("); if (arg_types != null) { for (Type arg_type : arg_types) { @@ -179,12 +179,12 @@ public abstract class Type { };//int consumed_chars=0; // Remember position in string, see getArgumentTypes - private static int unwrap( ThreadLocal tl ) { + private static int unwrap( final ThreadLocal tl ) { return tl.get().intValue(); } - private static void wrap( ThreadLocal tl, int value ) { + private static void wrap( final ThreadLocal tl, final int value ) { tl.set(Integer.valueOf(value)); } @@ -195,7 +195,7 @@ public abstract class Type { * @return type object */ // @since 6.0 no longer final - public static Type getType( String signature ) throws StringIndexOutOfBoundsException { + public static Type getType( final String signature ) throws StringIndexOutOfBoundsException { byte type = Utility.typeOfSignature(signature); if (type <= Const.T_VOID) { //corrected concurrent private static field acess @@ -231,7 +231,7 @@ public abstract class Type { * @param signature signature string such as (Ljava/lang/String;)V * @return return type */ - public static Type getReturnType( String signature ) { + public static Type getReturnType( final String signature ) { try { // Read return type after `)' int index = signature.lastIndexOf(')') + 1; @@ -247,7 +247,7 @@ public abstract class Type { * @param signature signature string such as (Ljava/lang/String;)V * @return array of argument types */ - public static Type[] getArgumentTypes( String signature ) { + public static Type[] getArgumentTypes( final String signature ) { List vec = new ArrayList<>(); int index; Type[] types; @@ -274,7 +274,7 @@ public abstract class Type { * @param cl Java class * @return corresponding Type object */ - public static Type getType( java.lang.Class cl ) { + public static Type getType( final java.lang.Class cl ) { if (cl == null) { throw new IllegalArgumentException("Class must not be null"); } @@ -318,7 +318,7 @@ public abstract class Type { * @param classes an array of runtime class objects * @return array of corresponding Type objects */ - public static Type[] getTypes( java.lang.Class[] classes ) { + public static Type[] getTypes( final java.lang.Class[] classes ) { Type[] ret = new Type[classes.length]; for (int i = 0; i < ret.length; i++) { ret[i] = getType(classes[i]); @@ -327,7 +327,7 @@ public abstract class Type { } - public static String getSignature( java.lang.reflect.Method meth ) { + public static String getSignature( final java.lang.reflect.Method meth ) { StringBuilder sb = new StringBuilder("("); Class[] params = meth.getParameterTypes(); // avoid clone for (Class param : params) { @@ -338,19 +338,19 @@ public abstract class Type { return sb.toString(); } - static int size(int coded) { + static int size(final int coded) { return coded & 3; } - static int consumed(int coded) { + static int consumed(final int coded) { return coded >> 2; } - static int encode(int size, int consumed) { + static int encode(final int size, final int consumed) { return consumed << 2 | size; } - static int getArgumentTypesSize( String signature ) { + static int getArgumentTypesSize( final String signature ) { int res = 0; int index; try { // Read all declarations between for `(' and `)' @@ -369,7 +369,7 @@ public abstract class Type { return res; } - static int getTypeSize( String signature ) throws StringIndexOutOfBoundsException { + static int getTypeSize( final String signature ) throws StringIndexOutOfBoundsException { byte type = Utility.typeOfSignature(signature); if (type <= Const.T_VOID) { return encode(BasicType.getType(type).getSize(), 1); @@ -391,7 +391,7 @@ public abstract class Type { } - static int getReturnTypeSize(String signature) { + static int getReturnTypeSize(final String signature) { int index = signature.lastIndexOf(')') + 1; return Type.size(getTypeSize(signature.substring(index))); } @@ -402,7 +402,7 @@ public abstract class Type { * The signature has a complicated dependency on other parameter * so it's tricky to do it in a call to the super ctor. */ - void setSignature(String signature) { + void setSignature(final String signature) { this.signature = signature; } } diff --git a/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java b/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java index 367cc90d..6141409f 100644 --- a/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java @@ -53,8 +53,8 @@ final class AttributeHTML { private final ConstantPool constant_pool; - AttributeHTML(String dir, String class_name, ConstantPool constant_pool, - ConstantHTML constant_html) throws IOException { + AttributeHTML(final String dir, final String class_name, final ConstantPool constant_pool, + final ConstantHTML constant_html) throws IOException { this.class_name = class_name; this.constant_pool = constant_pool; this.constant_html = constant_html; @@ -63,7 +63,7 @@ final class AttributeHTML { } - private String codeLink( int link, int method_number ) { + private String codeLink( final int link, final int method_number ) { return "" + link + ""; } @@ -75,12 +75,12 @@ final class AttributeHTML { } - final void writeAttribute( Attribute attribute, String anchor ) { + final void writeAttribute( final Attribute attribute, final String anchor ) { writeAttribute(attribute, anchor, 0); } - final void writeAttribute( Attribute attribute, String anchor, int method_number ) { + final void writeAttribute( final Attribute attribute, final String anchor, final int method_number ) { byte tag = attribute.getTag(); int index; if (tag == Const.ATTR_UNKNOWN) { diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java b/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java index fd08e06b..65fb8c5e 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java @@ -71,7 +71,7 @@ class BCELFactory extends EmptyVisitor { private final ConstantPoolGen _cp; - BCELFactory(MethodGen mg, PrintWriter out) { + BCELFactory(final MethodGen mg, final PrintWriter out) { _mg = mg; _cp = mg.getConstantPool(); _out = out; @@ -107,7 +107,7 @@ class BCELFactory extends EmptyVisitor { } - private boolean visitInstruction( Instruction i ) { + private boolean visitInstruction( final Instruction i ) { short opcode = i.getOpcode(); if ((InstructionConst.getInstruction(opcode) != null) && !(i instanceof ConstantPushInstruction) && !(i instanceof ReturnInstruction)) { // Handled below @@ -120,7 +120,7 @@ class BCELFactory extends EmptyVisitor { @Override - public void visitLocalVariableInstruction( LocalVariableInstruction i ) { + public void visitLocalVariableInstruction( final LocalVariableInstruction i ) { short opcode = i.getOpcode(); Type type = i.getType(_cp); if (opcode == Const.IINC) { @@ -135,7 +135,7 @@ class BCELFactory extends EmptyVisitor { @Override - public void visitArrayInstruction( ArrayInstruction i ) { + public void visitArrayInstruction( final ArrayInstruction i ) { short opcode = i.getOpcode(); Type type = i.getType(_cp); String kind = (opcode < Const.IASTORE) ? "Load" : "Store"; @@ -145,7 +145,7 @@ class BCELFactory extends EmptyVisitor { @Override - public void visitFieldInstruction( FieldInstruction i ) { + public void visitFieldInstruction( final FieldInstruction i ) { short opcode = i.getOpcode(); String class_name = i.getClassName(_cp); String field_name = i.getFieldName(_cp); @@ -157,7 +157,7 @@ class BCELFactory extends EmptyVisitor { @Override - public void visitInvokeInstruction( InvokeInstruction i ) { + public void visitInvokeInstruction( final InvokeInstruction i ) { short opcode = i.getOpcode(); String class_name = i.getClassName(_cp); String method_name = i.getMethodName(_cp); @@ -171,7 +171,7 @@ class BCELFactory extends EmptyVisitor { @Override - public void visitAllocationInstruction( AllocationInstruction i ) { + public void visitAllocationInstruction( final AllocationInstruction i ) { Type type; if (i instanceof CPInstruction) { type = ((CPInstruction) i).getType(_cp); @@ -202,7 +202,7 @@ class BCELFactory extends EmptyVisitor { } - private void createConstant( Object value ) { + private void createConstant( final Object value ) { String embed = value.toString(); if (value instanceof String) { embed = '"' + Utility.convertString(embed) + '"'; @@ -222,39 +222,39 @@ class BCELFactory extends EmptyVisitor { @Override - public void visitLDC( LDC i ) { + public void visitLDC( final LDC i ) { createConstant(i.getValue(_cp)); } @Override - public void visitLDC2_W( LDC2_W i ) { + public void visitLDC2_W( final LDC2_W i ) { createConstant(i.getValue(_cp)); } @Override - public void visitConstantPushInstruction( ConstantPushInstruction i ) { + public void visitConstantPushInstruction( final ConstantPushInstruction i ) { createConstant(i.getValue()); } @Override - public void visitINSTANCEOF( INSTANCEOF i ) { + public void visitINSTANCEOF( final INSTANCEOF i ) { Type type = i.getType(_cp); _out.println("il.append(new INSTANCEOF(_cp.addClass(" + BCELifier.printType(type) + ")));"); } @Override - public void visitCHECKCAST( CHECKCAST i ) { + public void visitCHECKCAST( final CHECKCAST i ) { Type type = i.getType(_cp); _out.println("il.append(_factory.createCheckCast(" + BCELifier.printType(type) + "));"); } @Override - public void visitReturnInstruction( ReturnInstruction i ) { + public void visitReturnInstruction( final ReturnInstruction i ) { Type type = i.getType(_cp); _out.println("il.append(_factory.createReturn(" + BCELifier.printType(type) + "));"); } @@ -264,7 +264,7 @@ class BCELFactory extends EmptyVisitor { @Override - public void visitBranchInstruction( BranchInstruction bi ) { + public void visitBranchInstruction( final BranchInstruction bi ) { BranchHandle bh = (BranchHandle) branch_map.get(bi); int pos = bh.getPosition(); String name = bi.getName() + "_" + pos; @@ -311,7 +311,7 @@ class BCELFactory extends EmptyVisitor { @Override - public void visitRET( RET i ) { + public void visitRET( final RET i ) { _out.println("il.append(new RET(" + i.getIndex() + ")));"); } diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java index c34d47e2..d280b05e 100644 --- a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java +++ b/src/main/java/org/apache/commons/bcel6/util/BCELifier.java @@ -67,7 +67,7 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { /** @param clazz Java class to "decompile" * @param out where to output Java program */ - public BCELifier(JavaClass clazz, OutputStream out) { + public BCELifier(final JavaClass clazz, final OutputStream out) { _clazz = clazz; _out = new PrintWriter(out); _cp = new ConstantPoolGen(_clazz.getConstantPool()); @@ -83,7 +83,7 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { @Override - public void visitJavaClass( JavaClass clazz ) { + public void visitJavaClass( final JavaClass clazz ) { String class_name = clazz.getClassName(); String super_name = clazz.getSuperclassName(); String package_name = clazz.getPackageName(); @@ -163,7 +163,7 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { @Override - public void visitField( Field field ) { + public void visitField( final Field field ) { _out.println(); _out.println(" field = new FieldGen(" + printFlags(field.getAccessFlags()) + ", " + printType(field.getSignature()) + ", \"" + field.getName() + "\", _cp);"); @@ -177,7 +177,7 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { @Override - public void visitMethod( Method method ) { + public void visitMethod( final Method method ) { MethodGen mg = new MethodGen(method, _clazz.getClassName(), _cp); _out.println(" InstructionList il = new InstructionList();"); _out.println(" MethodGen method = new MethodGen(" @@ -196,7 +196,7 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { } - static String printFlags( int flags ) { + static String printFlags( final int flags ) { return printFlags(flags, FLAGS.UNKNOWN); } @@ -207,7 +207,7 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { * @return the formatted string * @since 6.0 made public */ - public static String printFlags( int flags, FLAGS location ) { + public static String printFlags( final int flags, final FLAGS location ) { if (flags == 0) { return "0"; } @@ -235,7 +235,7 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { } - static String printArgumentTypes( Type[] arg_types ) { + static String printArgumentTypes( final Type[] arg_types ) { if (arg_types.length == 0) { return "Type.NO_ARGS"; } @@ -250,12 +250,12 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { } - static String printType( Type type ) { + static String printType( final Type type ) { return printType(type.getSignature()); } - static String printType( String signature ) { + static String printType( final String signature ) { Type type = Type.getType(signature); byte t = type.getType(); if (t <= Const.T_VOID) { @@ -278,7 +278,7 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { /** Default main method */ - public static void main( String[] argv ) throws Exception { + public static void main( final String[] argv ) throws Exception { if (argv.length != 1) { System.out.println("Usage: BCELifier classname"); System.out.println("\tThe class must exist on the classpath"); @@ -291,7 +291,7 @@ public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { // Needs to be accessible from unit test code - static JavaClass getJavaClass(String name) throws ClassNotFoundException, IOException { + static JavaClass getJavaClass(final String name) throws ClassNotFoundException, IOException { JavaClass java_class; if ((java_class = Repository.lookupClass(name)) == null) { java_class = new ClassParser(name).parse(); // May throw IOException diff --git a/src/main/java/org/apache/commons/bcel6/util/ByteSequence.java b/src/main/java/org/apache/commons/bcel6/util/ByteSequence.java index a3368643..5d10bdad 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ByteSequence.java +++ b/src/main/java/org/apache/commons/bcel6/util/ByteSequence.java @@ -32,7 +32,7 @@ public final class ByteSequence extends DataInputStream { private final ByteArrayStream byteStream; - public ByteSequence(byte[] bytes) { + public ByteSequence(final byte[] bytes) { super(new ByteArrayStream(bytes)); byteStream = (ByteArrayStream) in; } @@ -49,7 +49,7 @@ public final class ByteSequence extends DataInputStream { private static final class ByteArrayStream extends ByteArrayInputStream { - ByteArrayStream(byte[] bytes) { + ByteArrayStream(final byte[] bytes) { super(bytes); } diff --git a/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java b/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java index ce077700..c1f05e96 100644 --- a/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java @@ -80,7 +80,7 @@ public class Class2HTML { * @param java_class The class to write * @param dir The directory to put the files in */ - public Class2HTML(JavaClass java_class, String dir) throws IOException { + public Class2HTML(final JavaClass java_class, final String dir) throws IOException { Method[] methods = java_class.getMethods(); this.java_class = java_class; this.dir = dir; @@ -109,7 +109,7 @@ public class Class2HTML { } - public static void main( String[] argv ) throws IOException { + public static void main( final String[] argv ) throws IOException { String[] file_name = new String[argv.length]; int files = 0; ClassParser parser = null; @@ -166,7 +166,7 @@ public class Class2HTML { * Utility method that converts a class reference in the constant pool, * i.e., an index to a string. */ - static String referenceClass( int index ) { + static String referenceClass( final int index ) { String str = constant_pool.getConstantString(index, Const.CONSTANT_Class); str = Utility.compactClassName(str); str = Utility.compactClassName(str, class_package + ".", true); @@ -175,7 +175,7 @@ public class Class2HTML { } - static String referenceType( String type ) { + static String referenceType( final String type ) { String short_type = Utility.compactClassName(type); short_type = Utility.compactClassName(short_type, class_package + ".", true); int index = type.indexOf('['); // Type is an array? @@ -191,7 +191,7 @@ public class Class2HTML { } - static String toHTML( String str ) { + static String toHTML( final String str ) { StringBuilder buf = new StringBuilder(); for (int i = 0; i < str.length(); i++) { char ch; @@ -216,7 +216,7 @@ public class Class2HTML { } - private void writeMainHTML( AttributeHTML attribute_html ) throws IOException { + private void writeMainHTML( final AttributeHTML attribute_html ) throws IOException { PrintWriter file = new PrintWriter(new FileOutputStream(dir + class_name + ".html")); Attribute[] attributes = java_class.getAttributes(); file.println("\n" + "Documentation for " + class_name + "" diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java index 51f01cdf..7969bc2a 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java @@ -78,7 +78,7 @@ public class ClassLoader extends java.lang.ClassLoader { /** @param deferTo delegate class loader to use for ignored packages */ - public ClassLoader(java.lang.ClassLoader deferTo) { + public ClassLoader(final java.lang.ClassLoader deferTo) { super(deferTo); this.ignored_packages = DEFAULT_IGNORED_PACKAGES; this.repository = new ClassLoaderRepository(deferTo); @@ -88,7 +88,7 @@ public class ClassLoader extends java.lang.ClassLoader { /** @param ignored_packages classes contained in these packages will be loaded * with the system class loader */ - public ClassLoader(String[] ignored_packages) { + public ClassLoader(final String[] ignored_packages) { this.ignored_packages = ignored_packages; } @@ -97,13 +97,13 @@ public class ClassLoader extends java.lang.ClassLoader { * with the system class loader * @param deferTo delegate class loader to use for ignored packages */ - public ClassLoader(java.lang.ClassLoader deferTo, String[] ignored_packages) { + public ClassLoader(final java.lang.ClassLoader deferTo, final String[] ignored_packages) { this(ignored_packages); this.repository = new ClassLoaderRepository(deferTo); } @Override - protected Class loadClass( String class_name, boolean resolve ) throws ClassNotFoundException { + protected Class loadClass( final String class_name, final boolean resolve ) throws ClassNotFoundException { Class cl = null; /* First try: lookup hash table. */ @@ -149,7 +149,7 @@ public class ClassLoader extends java.lang.ClassLoader { /** Override this method if you want to alter a class before it gets actually * loaded. Does nothing by default. */ - protected JavaClass modifyClass( JavaClass clazz ) { + protected JavaClass modifyClass( final JavaClass clazz ) { return clazz; } @@ -168,7 +168,7 @@ public class ClassLoader extends java.lang.ClassLoader { * * @param class_name compressed byte code with "$$BCEL$$" in it */ - protected JavaClass createClass( String class_name ) { + protected JavaClass createClass( final String class_name ) { int index = class_name.indexOf(BCEL_TOKEN); String real_name = class_name.substring(index + BCEL_TOKEN.length()); JavaClass clazz = null; diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java index bc3a29cb..c9dee5c3 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java @@ -42,7 +42,7 @@ public class ClassLoaderRepository implements Repository { private final Map loadedClasses = new HashMap<>(); // CLASSNAME X JAVACLASS - public ClassLoaderRepository(java.lang.ClassLoader loader) { + public ClassLoaderRepository(final java.lang.ClassLoader loader) { this.loader = loader; } @@ -51,7 +51,7 @@ public class ClassLoaderRepository implements Repository { * Store a new JavaClass into this Repository. */ @Override - public void storeClass( JavaClass clazz ) { + public void storeClass( final JavaClass clazz ) { loadedClasses.put(clazz.getClassName(), clazz); clazz.setRepository(this); } @@ -61,7 +61,7 @@ public class ClassLoaderRepository implements Repository { * Remove class from repository */ @Override - public void removeClass( JavaClass clazz ) { + public void removeClass( final JavaClass clazz ) { loadedClasses.remove(clazz.getClassName()); } @@ -70,7 +70,7 @@ public class ClassLoaderRepository implements Repository { * Find an already defined JavaClass. */ @Override - public JavaClass findClass( String className ) { + public JavaClass findClass( final String className ) { return loadedClasses.containsKey(className) ? loadedClasses.get(className) : null; } @@ -79,7 +79,7 @@ public class ClassLoaderRepository implements Repository { * Lookup a JavaClass object from the Class Name provided. */ @Override - public JavaClass loadClass( String className ) throws ClassNotFoundException { + public JavaClass loadClass( final String className ) throws ClassNotFoundException { String classFile = className.replace('.', '/'); JavaClass RC = findClass(className); if (RC != null) { @@ -105,7 +105,7 @@ public class ClassLoaderRepository implements Repository { @Override - public JavaClass loadClass( Class clazz ) throws ClassNotFoundException { + public JavaClass loadClass( final Class clazz ) throws ClassNotFoundException { return loadClass(clazz.getName()); } diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java index 940c51aa..12ebea4d 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPath.java @@ -47,7 +47,7 @@ public class ClassPath { private static final FilenameFilter ARCHIVE_FILTER = new FilenameFilter() { @Override - public boolean accept( File dir, String name ) { + public boolean accept( final File dir, String name ) { name = name.toLowerCase(Locale.ENGLISH); return name.endsWith(".zip") || name.endsWith(".jar"); } @@ -57,7 +57,7 @@ public class ClassPath { private final String class_path; private ClassPath parent; - public ClassPath(ClassPath parent, String class_path) { + public ClassPath(final ClassPath parent, final String class_path) { this(class_path); this.parent = parent; } @@ -67,7 +67,7 @@ public class ClassPath { * * @param class_path */ - public ClassPath(String class_path) { + public ClassPath(final String class_path) { this.class_path = class_path; List vec = new ArrayList<>(); for (StringTokenizer tok = new StringTokenizer(class_path, File.pathSeparator); tok.hasMoreTokens();) { @@ -122,7 +122,7 @@ public class ClassPath { @Override - public boolean equals( Object o ) { + public boolean equals( final Object o ) { if (o instanceof ClassPath) { ClassPath cp = (ClassPath)o; return class_path.equals(cp.toString()); @@ -131,7 +131,7 @@ public class ClassPath { } - private static void getPathComponents( String path, List list ) { + private static void getPathComponents( final String path, final List list ) { if (path != null) { StringTokenizer tok = new StringTokenizer(path, File.pathSeparator); while (tok.hasMoreTokens()) { @@ -184,7 +184,7 @@ public class ClassPath { * @param name fully qualified class name, e.g. java.lang.String * @return input stream for class */ - public InputStream getInputStream( String name ) throws IOException { + public InputStream getInputStream( final String name ) throws IOException { return getInputStream(name.replace('.', '/'), ".class"); } @@ -196,7 +196,7 @@ public class ClassPath { * @param suffix file name ends with suff, e.g. .java * @return input stream for file on class path */ - public InputStream getInputStream( String name, String suffix ) throws IOException { + public InputStream getInputStream( final String name, final String suffix ) throws IOException { InputStream is = null; try { is = getClass().getClassLoader().getResourceAsStream(name + suffix); // may return null @@ -214,7 +214,7 @@ public class ClassPath { * @return InputStream supplying the resource, or null if no resource with that name. * @since 6.0 */ - public InputStream getResourceAsStream(String name) { + public InputStream getResourceAsStream(final String name) { for (PathEntry path : paths) { InputStream is; if ((is = path.getResourceAsStream(name)) != null) { @@ -229,7 +229,7 @@ public class ClassPath { * @return URL supplying the resource, or null if no resource with that name. * @since 6.0 */ - public URL getResource(String name) { + public URL getResource(final String name) { for (PathEntry path : paths) { URL url; if ((url = path.getResource(name)) != null) { @@ -245,7 +245,7 @@ public class ClassPath { * empty Enumeration if no resource with that name. * @since 6.0 */ - public Enumeration getResources(String name) { + public Enumeration getResources(final String name) { Vector results = new Vector<>(); for (PathEntry path : paths) { URL url; @@ -261,7 +261,7 @@ public class ClassPath { * @param suffix file name ends with suff, e.g. .java * @return class file for the java class */ - public ClassFile getClassFile( String name, String suffix ) throws IOException { + public ClassFile getClassFile( final String name, final String suffix ) throws IOException { ClassFile cf = null; if (parent != null) { @@ -279,7 +279,7 @@ public class ClassPath { throw new IOException("Couldn't find: " + name + suffix); } - private ClassFile getClassFileInternal(String name, String suffix) throws IOException { + private ClassFile getClassFileInternal(final String name, final String suffix) throws IOException { for (PathEntry path : paths) { ClassFile cf = path.getClassFile(name, suffix); @@ -297,7 +297,7 @@ public class ClassPath { * @param name fully qualified class name, e.g. java.lang.String * @return input stream for class */ - public ClassFile getClassFile( String name ) throws IOException { + public ClassFile getClassFile( final String name ) throws IOException { return getClassFile(name, ".class"); } @@ -307,7 +307,7 @@ public class ClassPath { * @param suffix file name ends with suffix, e.g. .java * @return byte array for file on class path */ - public byte[] getBytes( String name, String suffix ) throws IOException { + public byte[] getBytes( final String name, final String suffix ) throws IOException { DataInputStream dis = null; try { InputStream is = getInputStream(name, suffix); @@ -329,7 +329,7 @@ public class ClassPath { /** * @return byte array for class */ - public byte[] getBytes( String name ) throws IOException { + public byte[] getBytes( final String name ) throws IOException { return getBytes(name, ".class"); } @@ -354,7 +354,7 @@ public class ClassPath { * @param suffix file name suffix, e.g. .java * @return full (canonical) path for file, if it exists */ - public String getPath( String name, String suffix ) throws IOException { + public String getPath( final String name, final String suffix ) throws IOException { return getClassFile(name, suffix).getPath(); } @@ -400,12 +400,12 @@ public class ClassPath { private final String dir; - Dir(String d) { + Dir(final String d) { dir = d; } @Override - URL getResource(String name) { + URL getResource(final String name) { // Resource specification uses '/' whatever the platform final File file = new File(dir + File.separatorChar + name.replace('/', File.separatorChar)); try { @@ -416,7 +416,7 @@ public class ClassPath { } @Override - InputStream getResourceAsStream(String name) { + InputStream getResourceAsStream(final String name) { // Resource specification uses '/' whatever the platform final File file = new File(dir + File.separatorChar + name.replace('/', File.separatorChar)); try { @@ -427,7 +427,7 @@ public class ClassPath { } @Override - ClassFile getClassFile( String name, String suffix ) throws IOException { + ClassFile getClassFile( final String name, final String suffix ) throws IOException { final File file = new File(dir + File.separatorChar + name.replace('.', File.separatorChar) + suffix); return file.exists() ? new ClassFile() { @@ -479,12 +479,12 @@ public class ClassPath { private final ZipFile zip; - Zip(ZipFile z) { + Zip(final ZipFile z) { zip = z; } @Override - URL getResource(String name) { + URL getResource(final String name) { final ZipEntry entry = zip.getEntry(name); try { return (entry != null) ? new URL("jar:file:" + zip.getName() + "!/" + name) : null; @@ -494,7 +494,7 @@ public class ClassPath { } @Override - InputStream getResourceAsStream(String name) { + InputStream getResourceAsStream(final String name) { final ZipEntry entry = zip.getEntry(name); try { return (entry != null) ? zip.getInputStream(entry) : null; @@ -504,7 +504,7 @@ public class ClassPath { } @Override - ClassFile getClassFile( String name, String suffix ) throws IOException { + ClassFile getClassFile( final String name, final String suffix ) throws IOException { final ZipEntry entry = zip.getEntry(name.replace('.', '/') + suffix); if (entry == null) { diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPathRepository.java b/src/main/java/org/apache/commons/bcel6/util/ClassPathRepository.java index a7c717cc..34916b24 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassPathRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassPathRepository.java @@ -36,7 +36,7 @@ public class ClassPathRepository implements Repository { private ClassPath _path = null; private final Map _loadedClasses = new HashMap<>(); // CLASSNAME X JAVACLASS - public ClassPathRepository(ClassPath path) { + public ClassPathRepository(final ClassPath path) { _path = path; } @@ -44,7 +44,7 @@ public class ClassPathRepository implements Repository { * Store a new JavaClass instance into this Repository. */ @Override - public void storeClass(JavaClass clazz) { + public void storeClass(final JavaClass clazz) { _loadedClasses.put(clazz.getClassName(), clazz); clazz.setRepository(this); } @@ -53,7 +53,7 @@ public class ClassPathRepository implements Repository { * Remove class from repository */ @Override - public void removeClass(JavaClass clazz) { + public void removeClass(final JavaClass clazz) { _loadedClasses.remove(clazz.getClassName()); } @@ -61,7 +61,7 @@ public class ClassPathRepository implements Repository { * Find an already defined (cached) JavaClass object by name. */ @Override - public JavaClass findClass(String className) { + public JavaClass findClass(final String className) { return _loadedClasses.get(className); } @@ -105,7 +105,7 @@ public class ClassPathRepository implements Repository { * if the class is not in the Repository, and its representation could not be found */ @Override - public JavaClass loadClass(Class clazz) throws ClassNotFoundException { + public JavaClass loadClass(final Class clazz) throws ClassNotFoundException { InputStream clsStream = null; try { String className = clazz.getName(); @@ -131,7 +131,7 @@ public class ClassPathRepository implements Repository { } } - private JavaClass loadClass(InputStream is, String className) throws ClassNotFoundException { + private JavaClass loadClass(final InputStream is, final String className) throws ClassNotFoundException { try { if (is != null) { ClassParser parser = new ClassParser(is, className); diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java b/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java index c60ac1a2..7e51ef87 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java @@ -36,7 +36,7 @@ public class ClassQueue { protected LinkedList vec = new LinkedList<>(); // TODO not used externally - public void enqueue( JavaClass clazz ) { + public void enqueue( final JavaClass clazz ) { vec.addLast(clazz); } diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassSet.java b/src/main/java/org/apache/commons/bcel6/util/ClassSet.java index a7f34d88..f896b7a8 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassSet.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassSet.java @@ -36,7 +36,7 @@ public class ClassSet { private final Map _map = new HashMap<>(); - public boolean add( JavaClass clazz ) { + public boolean add( final JavaClass clazz ) { boolean result = false; if (!_map.containsKey(clazz.getClassName())) { result = true; @@ -46,7 +46,7 @@ public class ClassSet { } - public void remove( JavaClass clazz ) { + public void remove( final JavaClass clazz ) { _map.remove(clazz.getClassName()); } diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassStack.java b/src/main/java/org/apache/commons/bcel6/util/ClassStack.java index fcfa1156..bd89cd35 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassStack.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassStack.java @@ -32,7 +32,7 @@ public class ClassStack { private final Stack stack = new Stack<>(); - public void push( JavaClass clazz ) { + public void push( final JavaClass clazz ) { stack.push(clazz); } diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassVector.java b/src/main/java/org/apache/commons/bcel6/util/ClassVector.java index 6eacaf20..8f66fd89 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassVector.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassVector.java @@ -38,17 +38,17 @@ public class ClassVector implements java.io.Serializable { protected List vec = new ArrayList(); - public void addElement( JavaClass clazz ) { + public void addElement( final JavaClass clazz ) { vec.add(clazz); } - public JavaClass elementAt( int index ) { + public JavaClass elementAt( final int index ) { return vec.get(index); } - public void removeElementAt( int index ) { + public void removeElementAt( final int index ) { vec.remove(index); } diff --git a/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java b/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java index 75bfdda8..03663d84 100644 --- a/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java @@ -54,8 +54,8 @@ final class CodeHTML { private static boolean wide = false; - CodeHTML(String dir, String class_name, Method[] methods, ConstantPool constant_pool, - ConstantHTML constant_html) throws IOException { + CodeHTML(final String dir, final String class_name, final Method[] methods, final ConstantPool constant_pool, + final ConstantHTML constant_html) throws IOException { this.class_name = class_name; // this.methods = methods; this.constant_pool = constant_pool; @@ -77,7 +77,7 @@ final class CodeHTML { * @param stream data input stream * @return String representation of byte code */ - private String codeToHTML( ByteSequence bytes, int method_number ) throws IOException { + private String codeToHTML( final ByteSequence bytes, final int method_number ) throws IOException { short opcode = (short) bytes.readUnsignedByte(); String name; String signature; @@ -382,7 +382,7 @@ final class CodeHTML { * Find all target addresses in code, so that they can be marked * with <A NAME = ...>. Target addresses are kept in an BitSet object. */ - private void findGotos( ByteSequence bytes, Code code ) throws IOException { + private void findGotos( final ByteSequence bytes, final Code code ) throws IOException { int index; goto_set = new BitSet(bytes.available()); int opcode; @@ -491,7 +491,7 @@ final class CodeHTML { /** * Write a single method with the byte code associated with it. */ - private void writeMethod( Method method, int method_number ) throws IOException { + private void writeMethod( final Method method, final int method_number ) throws IOException { // Get raw signature String signature = method.getSignature(); // Get array of strings containing the argument types diff --git a/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java b/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java index f25defff..55c03f80 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java @@ -50,8 +50,8 @@ final class ConstantHTML { private final Method[] methods; - ConstantHTML(String dir, String class_name, String class_package, Method[] methods, - ConstantPool constant_pool) throws IOException { + ConstantHTML(final String dir, final String class_name, final String class_package, final Method[] methods, + final ConstantPool constant_pool) throws IOException { this.class_name = class_name; this.class_package = class_package; this.constant_pool = constant_pool; @@ -78,12 +78,12 @@ final class ConstantHTML { } - String referenceConstant( int index ) { + String referenceConstant( final int index ) { return constant_ref[index]; } - private void writeConstant( int index ) { + private void writeConstant( final int index ) { byte tag = constants[index].getTag(); int class_index; int name_index; @@ -221,7 +221,7 @@ final class ConstantHTML { } - private int getMethodNumber( String str ) { + private int getMethodNumber( final String str ) { for (int i = 0; i < methods.length; i++) { String cmp = methods[i].getName() + methods[i].getSignature(); if (cmp.equals(str)) { diff --git a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java index 03086a18..03df2e63 100644 --- a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java +++ b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java @@ -79,7 +79,7 @@ public class InstructionFinder { * @param il * instruction list to search for given patterns */ - public InstructionFinder(InstructionList il) { + public InstructionFinder(final InstructionList il) { this.il = il; reread(); } @@ -108,7 +108,7 @@ public class InstructionFinder { * instruction pattern in lower case * @return encoded string for a pattern such as "BranchInstruction". */ - private static String mapName( String pattern ) { + private static String mapName( final String pattern ) { String result = map.get(pattern); if (result != null) { return result; @@ -131,7 +131,7 @@ public class InstructionFinder { * The pattern to compile * @return translated regular expression string */ - private static String compilePattern( String pattern ) { + private static String compilePattern( final String pattern ) { //Bug: BCEL-77 - Instructions are assumed to be english, to avoid odd Locale issues String lower = pattern.toLowerCase(Locale.ENGLISH); StringBuilder buf = new StringBuilder(); @@ -161,7 +161,7 @@ public class InstructionFinder { /** * @return the matched piece of code as an array of instruction (handles) */ - private InstructionHandle[] getMatch( int matched_from, int match_length ) { + private InstructionHandle[] getMatch( final int matched_from, final int match_length ) { InstructionHandle[] match = new InstructionHandle[match_length]; System.arraycopy(handles, matched_from, match, 0, match_length); return match; @@ -203,7 +203,7 @@ public class InstructionFinder { * @return iterator of matches where e.nextElement() returns an array of * instruction handles describing the matched area */ - public final Iterator search( String pattern, InstructionHandle from, CodeConstraint constraint ) { + public final Iterator search( final String pattern, final InstructionHandle from, final CodeConstraint constraint ) { String search = compilePattern(pattern); int start = -1; for (int i = 0; i < handles.length; i++) { @@ -241,7 +241,7 @@ public class InstructionFinder { * @return iterator of matches where e.nextElement() returns an array of * instruction handles describing the matched area */ - public final Iterator search( String pattern ) { + public final Iterator search( final String pattern ) { return search(pattern, il.getStart(), null); } @@ -256,7 +256,7 @@ public class InstructionFinder { * @return iterator of matches where e.nextElement() returns an array of * instruction handles describing the matched area */ - public final Iterator search( String pattern, InstructionHandle from ) { + public final Iterator search( final String pattern, final InstructionHandle from ) { return search(pattern, from, null); } @@ -271,7 +271,7 @@ public class InstructionFinder { * constraints to be checked on matching code * @return instruction handle or `null' if the match failed */ - public final Iterator search( String pattern, CodeConstraint constraint ) { + public final Iterator search( final String pattern, final CodeConstraint constraint ) { return search(pattern, il.getStart(), constraint); } @@ -279,7 +279,7 @@ public class InstructionFinder { /** * Convert opcode number to char. */ - private static char makeChar( short opcode ) { + private static char makeChar( final short opcode ) { return (char) (opcode + OFFSET); } @@ -381,7 +381,7 @@ public class InstructionFinder { } - private static String precompile( short from, short to, short extra ) { + private static String precompile( final short from, final short to, final short extra ) { StringBuilder buf = new StringBuilder("("); for (short i = from; i <= to; i++) { buf.append(makeChar(i)); diff --git a/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java b/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java index 1873b489..ca7ba4fb 100644 --- a/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java +++ b/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java @@ -52,7 +52,7 @@ public class JavaWrapper { } - public JavaWrapper(java.lang.ClassLoader loader) { + public JavaWrapper(final java.lang.ClassLoader loader) { this.loader = loader; } @@ -67,7 +67,7 @@ public class JavaWrapper { * @param class_name the fully qualified class name * @param argv the arguments just as you would pass them directly */ - public void runMain( String class_name, String[] argv ) throws ClassNotFoundException { + public void runMain( final String class_name, final String[] argv ) throws ClassNotFoundException { Class cl = loader.loadClass(class_name); Method method = null; try { @@ -100,7 +100,7 @@ public class JavaWrapper { /** Default main method used as wrapper, expects the fully qualified class name * of the real class as the first argument. */ - public static void main( String[] argv ) throws Exception { + public static void main( final String[] argv ) throws Exception { /* Expects class name as first argument, other arguments are by-passed. */ if (argv.length == 0) { diff --git a/src/main/java/org/apache/commons/bcel6/util/MemorySensitiveClassPathRepository.java b/src/main/java/org/apache/commons/bcel6/util/MemorySensitiveClassPathRepository.java index 595dfc68..4a698cbd 100644 --- a/src/main/java/org/apache/commons/bcel6/util/MemorySensitiveClassPathRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/MemorySensitiveClassPathRepository.java @@ -38,7 +38,7 @@ public class MemorySensitiveClassPathRepository implements Repository { private ClassPath _path = null; private final Map> _loadedClasses = new HashMap<>(); // CLASSNAME X JAVACLASS - public MemorySensitiveClassPathRepository(ClassPath path) { + public MemorySensitiveClassPathRepository(final ClassPath path) { _path = path; } @@ -46,7 +46,7 @@ public class MemorySensitiveClassPathRepository implements Repository { * Store a new JavaClass instance into this Repository. */ @Override - public void storeClass(JavaClass clazz) { + public void storeClass(final JavaClass clazz) { _loadedClasses.put(clazz.getClassName(), new SoftReference<>(clazz)); clazz.setRepository(this); } @@ -55,7 +55,7 @@ public class MemorySensitiveClassPathRepository implements Repository { * Remove class from repository */ @Override - public void removeClass(JavaClass clazz) { + public void removeClass(final JavaClass clazz) { _loadedClasses.remove(clazz.getClassName()); } @@ -63,7 +63,7 @@ public class MemorySensitiveClassPathRepository implements Repository { * Find an already defined (cached) JavaClass object by name. */ @Override - public JavaClass findClass(String className) { + public JavaClass findClass(final String className) { SoftReference ref = _loadedClasses.get(className); if (ref == null) { return null; @@ -111,7 +111,7 @@ public class MemorySensitiveClassPathRepository implements Repository { * if the class is not in the Repository, and its representation could not be found */ @Override - public JavaClass loadClass(Class clazz) throws ClassNotFoundException { + public JavaClass loadClass(final Class clazz) throws ClassNotFoundException { InputStream clsStream = null; try { String className = clazz.getName(); @@ -137,7 +137,7 @@ public class MemorySensitiveClassPathRepository implements Repository { } } - private JavaClass loadClass(InputStream is, String className) throws ClassNotFoundException { + private JavaClass loadClass(final InputStream is, final String className) throws ClassNotFoundException { try { if (is != null) { ClassParser parser = new ClassParser(is, className); diff --git a/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java b/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java index 2c3b031d..6ab56854 100644 --- a/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java @@ -44,8 +44,8 @@ final class MethodHTML { private final AttributeHTML attribute_html; - MethodHTML(String dir, String class_name, Method[] methods, Field[] fields, - ConstantHTML constant_html, AttributeHTML attribute_html) throws IOException { + MethodHTML(final String dir, final String class_name, final Method[] methods, final Field[] fields, + final ConstantHTML constant_html, final AttributeHTML attribute_html) throws IOException { this.class_name = class_name; this.attribute_html = attribute_html; this.constant_html = constant_html; @@ -74,7 +74,7 @@ final class MethodHTML { * @param field field to print * @exception java.io.IOException */ - private void writeField( Field field ) throws IOException { + private void writeField( final Field field ) throws IOException { String type = Utility.signatureToString(field.getSignature()); String name = field.getName(); String access = Utility.accessToString(field.getAccessFlags()); @@ -101,7 +101,7 @@ final class MethodHTML { } - private void writeMethod( Method method, int method_number ) { + private void writeMethod( final Method method, final int method_number ) { // Get raw signature String signature = method.getSignature(); // Get array of strings containing the argument types diff --git a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java index 03864879..5d5514b3 100644 --- a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java +++ b/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java @@ -35,7 +35,7 @@ public class SyntheticRepository extends MemorySensitiveClassPathRepository impl // private static final String DEFAULT_PATH = ClassPath.getClassPath(); private static final Map _instances = new HashMap<>(); // CLASSPATH X REPOSITORY - private SyntheticRepository(ClassPath path) { + private SyntheticRepository(final ClassPath path) { super(path); } @@ -43,7 +43,7 @@ public class SyntheticRepository extends MemorySensitiveClassPathRepository impl return getInstance(ClassPath.SYSTEM_CLASS_PATH); } - public static SyntheticRepository getInstance(ClassPath classPath) { + public static SyntheticRepository getInstance(final ClassPath classPath) { SyntheticRepository rep = _instances.get(classPath); if (rep == null) { rep = new SyntheticRepository(classPath); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java index dab74cad..18a11f6e 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java @@ -62,7 +62,7 @@ public class GraphicalVerifier { /** Main method. */ - public static void main( String[] args ) { + public static void main( final String[] args ) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java index ea89c982..641d7545 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java @@ -38,7 +38,7 @@ public abstract class NativeVerifier { /** * Works only on the first argument. */ - public static void main( String[] args ) { + public static void main( final String[] args ) { if (args.length != 1) { System.out.println("Verifier front-end: need exactly one argument."); System.exit(1); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java index 04209e9a..f5f967a0 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java @@ -86,7 +86,7 @@ public abstract class PassVerifier { * * @see #getMessages() */ - public void addMessage( String message ) { + public void addMessage( final String message ) { messages.add(message); } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java b/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java index 3f44923a..182a65fe 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java @@ -41,7 +41,7 @@ public class TransitiveHull implements VerifierFactoryObserver { /* Implementing VerifierFactoryObserver. */ @Override - public void update( String classname ) { + public void update( final String classname ) { System.gc(); // avoid swapping if possible. for (int i = 0; i < indent; i++) { System.out.print(" "); @@ -87,7 +87,7 @@ public class TransitiveHull implements VerifierFactoryObserver { * all class files encountered; this may take up a lot of time and, * more notably, memory. */ - public static void main( String[] args ) { + public static void main( final String[] args ) { if (args.length != 1) { System.out.println("Need exactly one argument: The root class to verify."); System.exit(1); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java b/src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java index b082a4d3..d2981775 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java @@ -63,7 +63,7 @@ public class VerificationResult { /** The usual constructor. */ - public VerificationResult(int status, String message) { + public VerificationResult(final int status, final String message) { numeric = status; detailMessage = message; } @@ -97,7 +97,7 @@ public class VerificationResult { * Returns if two VerificationResult instances are equal. */ @Override - public boolean equals( Object o ) { + public boolean equals( final Object o ) { if (!(o instanceof VerificationResult)) { return false; } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java index eccf735a..0e014c73 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java @@ -78,7 +78,7 @@ public class Verifier { /** Returns the VerificationResult for the given pass. */ - public VerificationResult doPass3a( int method_no ) { + public VerificationResult doPass3a( final int method_no ) { String key = Integer.toString(method_no); Pass3aVerifier p3av; p3av = p3avs.get(key); @@ -91,7 +91,7 @@ public class Verifier { /** Returns the VerificationResult for the given pass. */ - public VerificationResult doPass3b( int method_no ) { + public VerificationResult doPass3b( final int method_no ) { String key = Integer.toString(method_no); Pass3bVerifier p3bv; p3bv = p3bvs.get(key); @@ -108,7 +108,7 @@ public class Verifier { * * @see VerifierFactory */ - Verifier(String fully_qualified_classname) { + Verifier(final String fully_qualified_classname) { classname = fully_qualified_classname; flush(); } @@ -191,7 +191,7 @@ public class Verifier { * documentation for questions about this) or you must have put the classes * into the BCEL Repository yourself (via 'addClass(JavaClass)'). */ - public static void main( String[] args ) { + public static void main( final String[] args ) { System.out .println("JustIce by Enver Haase, (C) 2001-2002.\n\n\n"); for (int k = 0; k < args.length; k++) { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java index ef793611..0bf42af4 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java @@ -130,7 +130,7 @@ public class VerifierAppFrame extends JFrame { classNamesJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { @Override - public void valueChanged( ListSelectionEvent e ) { + public void valueChanged( final ListSelectionEvent e ) { classNamesJList_valueChanged(e); } }); @@ -155,7 +155,7 @@ public class VerifierAppFrame extends JFrame { newFileMenuItem.addActionListener(new java.awt.event.ActionListener() { @Override - public void actionPerformed( ActionEvent e ) { + public void actionPerformed( final ActionEvent e ) { newFileMenuItem_actionPerformed(e); } }); @@ -164,14 +164,14 @@ public class VerifierAppFrame extends JFrame { pass3aJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { @Override - public void valueChanged( ListSelectionEvent e ) { + public void valueChanged( final ListSelectionEvent e ) { pass3aJList_valueChanged(e); } }); pass3bJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { @Override - public void valueChanged( ListSelectionEvent e ) { + public void valueChanged( final ListSelectionEvent e ) { pass3bJList_valueChanged(e); } }); @@ -180,7 +180,7 @@ public class VerifierAppFrame extends JFrame { whatisMenuItem.addActionListener(new java.awt.event.ActionListener() { @Override - public void actionPerformed( ActionEvent e ) { + public void actionPerformed( final ActionEvent e ) { whatisMenuItem_actionPerformed(e); } }); @@ -188,7 +188,7 @@ public class VerifierAppFrame extends JFrame { aboutMenuItem.addActionListener(new java.awt.event.ActionListener() { @Override - public void actionPerformed( ActionEvent e ) { + public void actionPerformed( final ActionEvent e ) { aboutMenuItem_actionPerformed(e); } }); @@ -229,7 +229,7 @@ public class VerifierAppFrame extends JFrame { /** Overridden to stop the application on a closing window. */ @Override - protected void processWindowEvent( WindowEvent e ) { + protected void processWindowEvent( final WindowEvent e ) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); @@ -237,7 +237,7 @@ public class VerifierAppFrame extends JFrame { } - synchronized void classNamesJList_valueChanged( ListSelectionEvent e ) { + synchronized void classNamesJList_valueChanged( final ListSelectionEvent e ) { if (e.getValueIsAdjusting()) { return; } @@ -315,7 +315,7 @@ public class VerifierAppFrame extends JFrame { } - void newFileMenuItem_actionPerformed( ActionEvent e ) { + void newFileMenuItem_actionPerformed( final ActionEvent e ) { String classname = JOptionPane .showInputDialog("Please enter the fully qualified name of a class or interface to verify:"); if ((classname == null) || (classname.equals(""))) { @@ -326,7 +326,7 @@ public class VerifierAppFrame extends JFrame { } - synchronized void pass3aJList_valueChanged( ListSelectionEvent e ) { + synchronized void pass3aJList_valueChanged( final ListSelectionEvent e ) { if (e.getValueIsAdjusting()) { return; } @@ -357,7 +357,7 @@ public class VerifierAppFrame extends JFrame { } - synchronized void pass3bJList_valueChanged( ListSelectionEvent e ) { + synchronized void pass3bJList_valueChanged( final ListSelectionEvent e ) { if (e.getValueIsAdjusting()) { return; } @@ -388,7 +388,7 @@ public class VerifierAppFrame extends JFrame { } - void aboutMenuItem_actionPerformed( ActionEvent e ) { + void aboutMenuItem_actionPerformed( final ActionEvent e ) { JOptionPane .showMessageDialog( this, @@ -398,7 +398,7 @@ public class VerifierAppFrame extends JFrame { } - void whatisMenuItem_actionPerformed( ActionEvent e ) { + void whatisMenuItem_actionPerformed( final ActionEvent e ) { JOptionPane .showMessageDialog( this, diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java index 6798452e..4c1e0afc 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java @@ -55,7 +55,7 @@ public class VerifierFactory { * Possibly a new Verifier object is transparently created. * @return the (only) verifier responsible for the class with the given name. */ - public static Verifier getVerifier( String fully_qualified_classname ) { + public static Verifier getVerifier( final String fully_qualified_classname ) { Verifier v = hashMap.get(fully_qualified_classname); if (v == null) { v = new Verifier(fully_qualified_classname); @@ -69,7 +69,7 @@ public class VerifierFactory { /** * Notifies the observers of a newly generated Verifier. */ - private static void notify( String fully_qualified_classname ) { + private static void notify( final String fully_qualified_classname ) { // notify the observers for (VerifierFactoryObserver vfo : observers) { vfo.update(fully_qualified_classname); @@ -93,7 +93,7 @@ public class VerifierFactory { /** * Adds the VerifierFactoryObserver o to the list of observers. */ - public static void attach( VerifierFactoryObserver o ) { + public static void attach( final VerifierFactoryObserver o ) { observers.add(o); } @@ -101,7 +101,7 @@ public class VerifierFactory { /** * Removes the VerifierFactoryObserver o from the list of observers. */ - public static void detach( VerifierFactoryObserver o ) { + public static void detach( final VerifierFactoryObserver o ) { observers.remove(o); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java index 0d57f23d..91be79e7 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java @@ -45,7 +45,7 @@ public class VerifierFactoryListModel implements VerifierFactoryObserver, @Override - public synchronized void update( String s ) { + public synchronized void update( final String s ) { Verifier[] verifiers = VerifierFactory.getVerifiers(); int num_of_verifiers = verifiers.length; cache.clear(); @@ -60,13 +60,13 @@ public class VerifierFactoryListModel implements VerifierFactoryObserver, @Override - public synchronized void addListDataListener( ListDataListener l ) { + public synchronized void addListDataListener( final ListDataListener l ) { listeners.add(l); } @Override - public synchronized void removeListDataListener( javax.swing.event.ListDataListener l ) { + public synchronized void removeListDataListener( final javax.swing.event.ListDataListener l ) { listeners.remove(l); } @@ -78,7 +78,7 @@ public class VerifierFactoryListModel implements VerifierFactoryObserver, @Override - public synchronized String getElementAt( int index ) { + public synchronized String getElementAt( final int index ) { return (cache.toArray(new String[cache.size()]))[index]; } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java b/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java index 83070fe8..98109de2 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java @@ -71,7 +71,7 @@ public class VerifyDialog extends javax.swing.JDialog { class IvjEventHandler implements java.awt.event.ActionListener { @Override - public void actionPerformed( java.awt.event.ActionEvent e ) { + public void actionPerformed( final java.awt.event.ActionEvent e ) { if (e.getSource() == VerifyDialog.this.getPass1Button()) { connEtoC1(e); } @@ -99,49 +99,49 @@ public class VerifyDialog extends javax.swing.JDialog { /** Machine-generated. */ - public VerifyDialog(java.awt.Dialog owner) { + public VerifyDialog(final java.awt.Dialog owner) { super(owner); } /** Machine-generated. */ - public VerifyDialog(java.awt.Dialog owner, String title) { + public VerifyDialog(final java.awt.Dialog owner, final String title) { super(owner, title); } /** Machine-generated. */ - public VerifyDialog(java.awt.Dialog owner, String title, boolean modal) { + public VerifyDialog(final java.awt.Dialog owner, final String title, final boolean modal) { super(owner, title, modal); } /** Machine-generated. */ - public VerifyDialog(java.awt.Dialog owner, boolean modal) { + public VerifyDialog(final java.awt.Dialog owner, final boolean modal) { super(owner, modal); } /** Machine-generated. */ - public VerifyDialog(java.awt.Frame owner) { + public VerifyDialog(final java.awt.Frame owner) { super(owner); } /** Machine-generated. */ - public VerifyDialog(java.awt.Frame owner, String title) { + public VerifyDialog(final java.awt.Frame owner, final String title) { super(owner, title); } /** Machine-generated. */ - public VerifyDialog(java.awt.Frame owner, String title, boolean modal) { + public VerifyDialog(final java.awt.Frame owner, final String title, final boolean modal) { super(owner, title, modal); } /** Machine-generated. */ - public VerifyDialog(java.awt.Frame owner, boolean modal) { + public VerifyDialog(final java.awt.Frame owner, final boolean modal) { super(owner, modal); } @@ -164,7 +164,7 @@ public class VerifyDialog extends javax.swing.JDialog { /** Machine-generated. */ - private void connEtoC1( java.awt.event.ActionEvent arg1 ) { + private void connEtoC1( final java.awt.event.ActionEvent arg1 ) { try { // user code begin {1} // user code end @@ -180,7 +180,7 @@ public class VerifyDialog extends javax.swing.JDialog { /** Machine-generated. */ - private void connEtoC2( java.awt.event.ActionEvent arg1 ) { + private void connEtoC2( final java.awt.event.ActionEvent arg1 ) { try { // user code begin {1} // user code end @@ -196,7 +196,7 @@ public class VerifyDialog extends javax.swing.JDialog { /** Machine-generated. */ - private void connEtoC3( java.awt.event.ActionEvent arg1 ) { + private void connEtoC3( final java.awt.event.ActionEvent arg1 ) { try { // user code begin {1} // user code end @@ -212,7 +212,7 @@ public class VerifyDialog extends javax.swing.JDialog { /** Machine-generated. */ - private void connEtoC4( java.awt.event.ActionEvent arg1 ) { + private void connEtoC4( final java.awt.event.ActionEvent arg1 ) { try { // user code begin {1} // user code end @@ -228,7 +228,7 @@ public class VerifyDialog extends javax.swing.JDialog { /** Machine-generated. */ - public void flushButton_ActionPerformed( java.awt.event.ActionEvent actionEvent ) { + public void flushButton_ActionPerformed( final java.awt.event.ActionEvent actionEvent ) { VerifierFactory.getVerifier(class_name).flush(); Repository.removeClass(class_name); // Make sure it will be reloaded. getPass1Panel().setBackground(Color.gray); @@ -419,7 +419,7 @@ public class VerifyDialog extends javax.swing.JDialog { /** Machine-generated. */ - private void handleException( java.lang.Throwable exception ) { + private void handleException( final java.lang.Throwable exception ) { /* Uncomment the following lines to print uncaught exceptions to stdout */ System.out.println("--------- UNCAUGHT EXCEPTION ---------"); exception.printStackTrace(System.out); @@ -472,7 +472,7 @@ public class VerifyDialog extends javax.swing.JDialog { * green means 'passed' while yellow means 'could not be verified yet'. * @param args java.lang.String[] fully qualified names of classes to verify. */ - public static void main( java.lang.String[] args ) { + public static void main( final java.lang.String[] args ) { classes_to_verify = args.length; for (String arg : args) { try { @@ -482,7 +482,7 @@ public class VerifyDialog extends javax.swing.JDialog { aVerifyDialog.addWindowListener(new java.awt.event.WindowAdapter() { @Override - public void windowClosing( java.awt.event.WindowEvent e ) { + public void windowClosing( final java.awt.event.WindowEvent e ) { classes_to_verify--; if (classes_to_verify == 0) { System.exit(0); @@ -499,7 +499,7 @@ public class VerifyDialog extends javax.swing.JDialog { /** Machine-generated. */ - public void pass1Button_ActionPerformed( java.awt.event.ActionEvent actionEvent ) { + public void pass1Button_ActionPerformed( final java.awt.event.ActionEvent actionEvent ) { Verifier v = VerifierFactory.getVerifier(class_name); VerificationResult vr = v.doPass1(); if (vr.getStatus() == VerificationResult.VERIFIED_OK) { @@ -514,7 +514,7 @@ public class VerifyDialog extends javax.swing.JDialog { /** Machine-generated. */ - public void pass2Button_ActionPerformed( java.awt.event.ActionEvent actionEvent ) { + public void pass2Button_ActionPerformed( final java.awt.event.ActionEvent actionEvent ) { pass1Button_ActionPerformed(actionEvent); Verifier v = VerifierFactory.getVerifier(class_name); VerificationResult vr = v.doPass2(); @@ -534,7 +534,7 @@ public class VerifyDialog extends javax.swing.JDialog { /** Machine-generated. */ - public void pass4Button_ActionPerformed( java.awt.event.ActionEvent actionEvent ) { + public void pass4Button_ActionPerformed( final java.awt.event.ActionEvent actionEvent ) { pass2Button_ActionPerformed(actionEvent); Color color = Color.green; Verifier v = VerifierFactory.getVerifier(class_name); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java index c29518bd..fe9fbd12 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java @@ -44,7 +44,7 @@ public final class AssertionViolatedException extends RuntimeException{ * Constructs a new AssertionViolationException with the specified error message and initial cause * @since 6.0 */ - public AssertionViolatedException(String message, Throwable initCause) { + public AssertionViolatedException(String message, final Throwable initCause) { super(message = "INTERNAL ERROR: "+message, initCause); detailMessage=message; } @@ -77,7 +77,7 @@ public final class AssertionViolatedException extends RuntimeException{ /** * DO NOT USE. It's for experimental testing during development only. */ - public static void main(String[] args){ + public static void main(final String[] args){ AssertionViolatedException ave = new AssertionViolatedException("Oops!"); ave.extendMessage("\nFOUND:\n\t","\nExiting!!\n"); throw ave; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java index c75ebc2c..d6b115c0 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java @@ -38,7 +38,7 @@ public class ClassConstraintException extends VerificationException{ /** * Constructs a new ClassConstraintException with the specified error message. */ - public ClassConstraintException(String message){ + public ClassConstraintException(final String message){ super (message); } @@ -46,7 +46,7 @@ public class ClassConstraintException extends VerificationException{ * Constructs a new ClassConstraintException with the specified error message and cause * @since 6.0 */ - public ClassConstraintException(String message, Throwable initCause){ + public ClassConstraintException(final String message, final Throwable initCause){ super(message, initCause); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java index 6dfb5813..0247edcf 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java @@ -35,7 +35,7 @@ public abstract class CodeConstraintException extends VerificationException{ /** * Constructs a new CodeConstraintException with the specified error message. */ - CodeConstraintException(String message){ + CodeConstraintException(final String message){ super(message); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java index 7f7ce3a8..40543fae 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java @@ -28,7 +28,7 @@ public class InvalidMethodException extends RuntimeException{ private static final long serialVersionUID = -7060302743724808051L; /** Constructs an InvalidMethodException with the specified detail message. */ - public InvalidMethodException(String message){ + public InvalidMethodException(final String message){ super(message); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java index d26225f1..5e90be62 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java @@ -38,7 +38,7 @@ public class LoadingException extends VerifierConstraintViolatedException{ /** * Constructs a new LoadingException with the specified error message. */ - public LoadingException(String message){ + public LoadingException(final String message){ super (message); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java index 3e01ed2b..b8afdf07 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java @@ -40,7 +40,7 @@ public class LocalVariableInfoInconsistentException extends ClassConstraintExcep /** * Constructs a new LocalVariableInfoInconsistentException with the specified error message. */ - public LocalVariableInfoInconsistentException(String message){ + public LocalVariableInfoInconsistentException(final String message){ super (message); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java index a2d6653d..135a66f1 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java @@ -30,7 +30,7 @@ package org.apache.commons.bcel6.verifier.exc; public abstract class StaticCodeConstraintException extends CodeConstraintException{ private static final long serialVersionUID = 3858523065007725128L; - public StaticCodeConstraintException(String message){ + public StaticCodeConstraintException(final String message){ super(message); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java index 8986bb17..0d56347c 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java @@ -33,7 +33,7 @@ package org.apache.commons.bcel6.verifier.exc; public class StaticCodeInstructionConstraintException extends StaticCodeConstraintException{ private static final long serialVersionUID = 4987255974346614794L; - public StaticCodeInstructionConstraintException(String message){ + public StaticCodeInstructionConstraintException(final String message){ super(message); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java index fa19fca5..cfaab1ea 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -33,7 +33,7 @@ package org.apache.commons.bcel6.verifier.exc; public class StaticCodeInstructionOperandConstraintException extends StaticCodeConstraintException{ private static final long serialVersionUID = 4780787099381933487L; - public StaticCodeInstructionOperandConstraintException(String message){ + public StaticCodeInstructionOperandConstraintException(final String message){ super(message); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java index afcb882f..94d24d46 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java @@ -34,7 +34,7 @@ public class StructuralCodeConstraintException extends CodeConstraintException{ /** * Constructs a new StructuralCodeConstraintException with the specified error message. */ - public StructuralCodeConstraintException(String message){ + public StructuralCodeConstraintException(final String message){ super(message); } /** diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java index 195ef160..5f521a32 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java @@ -31,7 +31,7 @@ public final class Utility{ private Utility(){} /** This method returns the stack trace of a Throwable instance as a String. */ - public static String getStackTrace(Throwable t){ + public static String getStackTrace(final Throwable t){ StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); t.printStackTrace(pw); diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java index 5cf5cb6e..8e499220 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java @@ -41,14 +41,14 @@ public abstract class VerificationException extends VerifierConstraintViolatedEx /** * Constructs a new VerificationException with the specified error message. */ - VerificationException(String message){ + VerificationException(final String message){ super(message); } /** * Constructs a new VerificationException with the specified error message and exception */ - VerificationException(String message, Throwable initCause){ + VerificationException(final String message, final Throwable initCause){ super(message, initCause); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java index e582b168..d2640722 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java @@ -44,14 +44,14 @@ public abstract class VerifierConstraintViolatedException extends RuntimeExcepti /** * Constructs a new VerifierConstraintViolatedException with the specified error message. */ - VerifierConstraintViolatedException(String message){ + VerifierConstraintViolatedException(final String message){ super(message); // Not that important detailMessage = message; } /** * Constructs a new VerifierConstraintViolationException with the specified error message and cause */ - VerifierConstraintViolatedException(String message, Throwable initCause){ + VerifierConstraintViolatedException(final String message, final Throwable initCause){ super(message, initCause); detailMessage = message; } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java index c76fd3a5..bf2670f9 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java @@ -34,11 +34,11 @@ public class IntList{ theList = new ArrayList<>(); } /** Adds an element to the list. */ - void add(int i){ + void add(final int i){ theList.add(Integer.valueOf(i)); } /** Checks if the specified int is already in the list. */ - boolean contains(int i){ + boolean contains(final int i){ Integer[] ints = new Integer[theList.size()]; theList.toArray(ints); for (Integer k : ints) { diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java index 4881ad49..d58dae0b 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java @@ -42,14 +42,14 @@ public class LocalVariableInfo{ * Adds a name of a local variable and a certain slot to our 'names' * (Hashtable) database. */ - private void setName(int offset, String name){ + private void setName(final int offset, final String name){ names.put(Integer.toString(offset), name); } /** * Adds a type of a local variable and a certain slot to our 'types' * (Hashtable) database. */ - private void setType(int offset, Type t){ + private void setType(final int offset, final Type t){ types.put(Integer.toString(offset), t); } @@ -61,7 +61,7 @@ public class LocalVariableInfo{ * May return 'null' if nothing is known about the type of this local * variable slot at the given bytecode offset. */ - public Type getType(int offset){ + public Type getType(final int offset){ return types.get(Integer.toString(offset)); } /** @@ -72,7 +72,7 @@ public class LocalVariableInfo{ * May return 'null' if nothing is known about the type of this local * variable slot at the given bytecode offset. */ - public String getName(int offset){ + public String getName(final int offset){ return names.get(Integer.toString(offset)); } /** @@ -80,7 +80,7 @@ public class LocalVariableInfo{ * @throws LocalVariableInfoInconsistentException if the new information conflicts * with already gathered information. */ - public void add(String name, int startpc, int length, Type t) throws LocalVariableInfoInconsistentException{ + public void add(final String name, final int startpc, final int length, final Type t) throws LocalVariableInfoInconsistentException{ for (int i=startpc; i<=startpc+length; i++){ // incl/incl-notation! add(i,name,t); } @@ -91,7 +91,7 @@ public class LocalVariableInfo{ * @throws LocalVariableInfoInconsistentException if the new information conflicts * with already gathered information. */ - private void add(int offset, String name, Type t) throws LocalVariableInfoInconsistentException{ + private void add(final int offset, final String name, final Type t) throws LocalVariableInfoInconsistentException{ if (getName(offset) != null){ if (! getName(offset).equals(name)){ throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java index 30b0ba5a..c5fd3d8f 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java @@ -35,7 +35,7 @@ public class LocalVariablesInfo{ private final LocalVariableInfo[] localVariableInfos; /** The constructor. */ - LocalVariablesInfo(int max_locals){ + LocalVariablesInfo(final int max_locals){ localVariableInfos = new LocalVariableInfo[max_locals]; for (int i=0; i= localVariableInfos.length){ throw new AssertionViolatedException("Slot number for local variable information out of range."); } @@ -56,7 +56,7 @@ public class LocalVariablesInfo{ * @throws LocalVariableInfoInconsistentException if the new information conflicts * with already gathered information. */ - public void add(int slot, String name, int startpc, int length, Type t) throws LocalVariableInfoInconsistentException{ + public void add(final int slot, final String name, final int startpc, final int length, final Type t) throws LocalVariableInfoInconsistentException{ // The add operation on LocalVariableInfo may throw the '...Inconsistent...' exception, we don't throw it explicitely here. if (slot < 0 || slot >= localVariableInfos.length){ diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java index 9b22a91f..6ffcba7a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java @@ -71,7 +71,7 @@ public final class Pass1Verifier extends PassVerifier{ * * @see Verifier */ - public Pass1Verifier(Verifier owner){ + public Pass1Verifier(final Verifier owner){ myOwner = owner; } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java index f673f2a8..f8550d37 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java @@ -101,7 +101,7 @@ public final class Pass2Verifier extends PassVerifier { * * @see Verifier */ - public Pass2Verifier(Verifier owner){ + public Pass2Verifier(final Verifier owner){ myOwner = owner; } @@ -114,7 +114,7 @@ public final class Pass2Verifier extends PassVerifier { * Repository.lookupClass(myOwner.getClassname()).getMethods()[method_nr];. * You should not add own information. Leave that to JustIce. */ - public LocalVariablesInfo getLocalVariablesInfo(int method_nr){ + public LocalVariablesInfo getLocalVariablesInfo(final int method_nr){ if (this.verify() != VerificationResult.VR_OK) { return null; // It's cached, don't worry. } @@ -338,7 +338,7 @@ public final class Pass2Verifier extends PassVerifier { private final Set field_names_and_desc = new HashSet<>(); private final Set method_names_and_desc = new HashSet<>(); - private CPESSC_Visitor(JavaClass _jc){ + private CPESSC_Visitor(final JavaClass _jc){ jc = _jc; cp = _jc.getConstantPool(); cplen = cp.getLength(); @@ -361,7 +361,7 @@ public final class Pass2Verifier extends PassVerifier { carrier.visit(); } - private void checkIndex(Node referrer, int index, Class shouldbe){ + private void checkIndex(final Node referrer, final int index, final Class shouldbe){ if ((index < 0) || (index >= cplen)){ throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(referrer)+"'."); } @@ -376,7 +376,7 @@ public final class Pass2Verifier extends PassVerifier { // ClassFile structure (vmspec2 4.1) // /////////////////////////////////////// @Override - public void visitJavaClass(JavaClass obj){ + public void visitJavaClass(final JavaClass obj){ Attribute[] atts = obj.getAttributes(); boolean foundSourceFile = false; boolean foundInnerClasses = false; @@ -437,7 +437,7 @@ public final class Pass2Verifier extends PassVerifier { // CONSTANTS (vmspec2 4.4) // ///////////////////////////// @Override - public void visitConstantClass(ConstantClass obj){ + public void visitConstantClass(final ConstantClass obj){ if (obj.getTag() != Const.CONSTANT_Class){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } @@ -445,7 +445,7 @@ public final class Pass2Verifier extends PassVerifier { } @Override - public void visitConstantFieldref(ConstantFieldref obj){ + public void visitConstantFieldref(final ConstantFieldref obj){ if (obj.getTag() != Const.CONSTANT_Fieldref){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } @@ -453,7 +453,7 @@ public final class Pass2Verifier extends PassVerifier { checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); } @Override - public void visitConstantMethodref(ConstantMethodref obj){ + public void visitConstantMethodref(final ConstantMethodref obj){ if (obj.getTag() != Const.CONSTANT_Methodref){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } @@ -461,7 +461,7 @@ public final class Pass2Verifier extends PassVerifier { checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); } @Override - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ + public void visitConstantInterfaceMethodref(final ConstantInterfaceMethodref obj){ if (obj.getTag() != Const.CONSTANT_InterfaceMethodref){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } @@ -469,42 +469,42 @@ public final class Pass2Verifier extends PassVerifier { checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); } @Override - public void visitConstantString(ConstantString obj){ + public void visitConstantString(final ConstantString obj){ if (obj.getTag() != Const.CONSTANT_String){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getStringIndex(), CONST_Utf8); } @Override - public void visitConstantInteger(ConstantInteger obj){ + public void visitConstantInteger(final ConstantInteger obj){ if (obj.getTag() != Const.CONSTANT_Integer){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } // no indices to check } @Override - public void visitConstantFloat(ConstantFloat obj){ + public void visitConstantFloat(final ConstantFloat obj){ if (obj.getTag() != Const.CONSTANT_Float){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check } @Override - public void visitConstantLong(ConstantLong obj){ + public void visitConstantLong(final ConstantLong obj){ if (obj.getTag() != Const.CONSTANT_Long){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check } @Override - public void visitConstantDouble(ConstantDouble obj){ + public void visitConstantDouble(final ConstantDouble obj){ if (obj.getTag() != Const.CONSTANT_Double){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check } @Override - public void visitConstantNameAndType(ConstantNameAndType obj){ + public void visitConstantNameAndType(final ConstantNameAndType obj){ if (obj.getTag() != Const.CONSTANT_NameAndType){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } @@ -513,7 +513,7 @@ public final class Pass2Verifier extends PassVerifier { checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); } @Override - public void visitConstantUtf8(ConstantUtf8 obj){ + public void visitConstantUtf8(final ConstantUtf8 obj){ if (obj.getTag() != Const.CONSTANT_Utf8){ throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } @@ -523,7 +523,7 @@ public final class Pass2Verifier extends PassVerifier { // FIELDS (vmspec2 4.5) // ////////////////////////// @Override - public void visitField(Field obj){ + public void visitField(final Field obj){ if (jc.isClass()){ int maxone=0; @@ -617,7 +617,7 @@ public final class Pass2Verifier extends PassVerifier { // METHODS (vmspec2 4.6) // /////////////////////////// @Override - public void visitMethod(Method obj){ + public void visitMethod(final Method obj){ checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -822,7 +822,7 @@ public final class Pass2Verifier extends PassVerifier { // ClassFile-structure-ATTRIBUTES (vmspec2 4.1, 4.7) // /////////////////////////////////////////////////////// @Override - public void visitSourceFile(SourceFile obj){//vmspec2 4.7.7 + public void visitSourceFile(final SourceFile obj){//vmspec2 4.7.7 // zero or one SourceFile attr per ClassFile: see visitJavaClass() @@ -849,7 +849,7 @@ public final class Pass2Verifier extends PassVerifier { } } @Override - public void visitDeprecated(Deprecated obj){//vmspec2 4.7.10 + public void visitDeprecated(final Deprecated obj){//vmspec2 4.7.10 checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); @@ -859,7 +859,7 @@ public final class Pass2Verifier extends PassVerifier { } } @Override - public void visitSynthetic(Synthetic obj){//vmspec2 4.7.6 + public void visitSynthetic(final Synthetic obj){//vmspec2 4.7.6 checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); if (! name.equals("Synthetic")){ @@ -868,7 +868,7 @@ public final class Pass2Verifier extends PassVerifier { } } @Override - public void visitInnerClasses(InnerClasses obj){//vmspec2 4.7.5 + public void visitInnerClasses(final InnerClasses obj){//vmspec2 4.7.5 // exactly one InnerClasses attr per ClassFile if some inner class is refernced: see visitJavaClass() @@ -907,7 +907,7 @@ public final class Pass2Verifier extends PassVerifier { // field_info-structure-ATTRIBUTES (vmspec2 4.5, 4.7) // //////////////////////////////////////////////////////// @Override - public void visitConstantValue(ConstantValue obj){//vmspec2 4.7.2 + public void visitConstantValue(final ConstantValue obj){//vmspec2 4.7.2 // Despite its name, this really is an Attribute, // not a constant! checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -957,7 +957,7 @@ public final class Pass2Verifier extends PassVerifier { // method_info-structure-ATTRIBUTES (vmspec2 4.6, 4.7) // ///////////////////////////////////////////////////////// @Override - public void visitCode(Code obj){//vmspec2 4.7.3 + public void visitCode(final Code obj){//vmspec2 4.7.3 try { // No code attribute allowed for native or abstract methods: see visitMethod(Method). // Code array constraints are checked in Pass3 (3a and 3b). @@ -1138,7 +1138,7 @@ public final class Pass2Verifier extends PassVerifier { }// visitCode(Code) END @Override - public void visitExceptionTable(ExceptionTable obj){//vmspec2 4.7.4 + public void visitExceptionTable(final ExceptionTable obj){//vmspec2 4.7.4 try { // incorrectly named, it's the Exceptions attribute (vmspec2 4.7.4) checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -1202,7 +1202,7 @@ public final class Pass2Verifier extends PassVerifier { // code_attribute-structure-ATTRIBUTES (vmspec2 4.7.3, 4.7) // ////////////////////////////////////////////////////////////// @Override - public void visitLineNumberTable(LineNumberTable obj){//vmspec2 4.7.8 + public void visitLineNumberTable(final LineNumberTable obj){//vmspec2 4.7.8 checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); @@ -1217,7 +1217,7 @@ public final class Pass2Verifier extends PassVerifier { } @Override - public void visitLocalVariableTable(LocalVariableTable obj){//vmspec2 4.7.9 + public void visitLocalVariableTable(final LocalVariableTable obj){//vmspec2 4.7.9 //In JustIce,this check is partially delayed to Pass 3a. //The other part can be found in the visitCode(Code) method. } @@ -1225,7 +1225,7 @@ public final class Pass2Verifier extends PassVerifier { // MISC-structure-ATTRIBUTES (vmspec2 4.7.1, 4.7) // //////////////////////////////////////////////////// @Override - public void visitUnknown(Unknown obj){//vmspec2 4.7.1 + public void visitUnknown(final Unknown obj){//vmspec2 4.7.1 // Represents an unknown attribute. checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -1236,14 +1236,14 @@ public final class Pass2Verifier extends PassVerifier { // BCEL // ////////// @Override - public void visitLocalVariable(LocalVariable obj){ + public void visitLocalVariable(final LocalVariable obj){ // This does not represent an Attribute but is only // related to internal BCEL data representation. // see visitLocalVariableTable(LocalVariableTable) } @Override - public void visitCodeException(CodeException obj){ + public void visitCodeException(final CodeException obj){ // Code constraints are checked in Pass3 (3a and 3b). // This does not represent an Attribute but is only // related to internal BCEL data representation. @@ -1251,18 +1251,18 @@ public final class Pass2Verifier extends PassVerifier { // see visitCode(Code) } @Override - public void visitConstantPool(ConstantPool obj){ + public void visitConstantPool(final ConstantPool obj){ // No need to. We're piggybacked by the DescendingVisitor. // This does not represent an Attribute but is only // related to internal BCEL data representation. } @Override - public void visitInnerClass(InnerClass obj){ + public void visitInnerClass(final InnerClass obj){ // This does not represent an Attribute but is only // related to internal BCEL data representation. } @Override - public void visitLineNumber(LineNumber obj){ + public void visitLineNumber(final LineNumber obj){ // This does not represent an Attribute but is only // related to internal BCEL data representation. @@ -1307,12 +1307,12 @@ public final class Pass2Verifier extends PassVerifier { */ private final class FAMRAV_Visitor extends EmptyVisitor{ private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work. - private FAMRAV_Visitor(JavaClass _jc){ + private FAMRAV_Visitor(final JavaClass _jc){ cp = _jc.getConstantPool(); } @Override - public void visitConstantFieldref(ConstantFieldref obj){ + public void visitConstantFieldref(final ConstantFieldref obj){ if (obj.getTag() != Const.CONSTANT_Fieldref){ throw new ClassConstraintException("ConstantFieldref '"+tostring(obj)+"' has wrong tag!"); } @@ -1341,7 +1341,7 @@ public final class Pass2Verifier extends PassVerifier { } @Override - public void visitConstantMethodref(ConstantMethodref obj){ + public void visitConstantMethodref(final ConstantMethodref obj){ if (obj.getTag() != Const.CONSTANT_Methodref){ throw new ClassConstraintException("ConstantMethodref '"+tostring(obj)+"' has wrong tag!"); } @@ -1374,7 +1374,7 @@ public final class Pass2Verifier extends PassVerifier { } @Override - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj){ + public void visitConstantInterfaceMethodref(final ConstantInterfaceMethodref obj){ if (obj.getTag() != Const.CONSTANT_InterfaceMethodref){ throw new ClassConstraintException("ConstantInterfaceMethodref '"+tostring(obj)+"' has wrong tag!"); } @@ -1414,7 +1414,7 @@ public final class Pass2Verifier extends PassVerifier { * This method returns true if and only if the supplied String * represents a valid Java class name. */ - private static boolean validClassName(String name){ + private static boolean validClassName(final String name){ /* * TODO: implement. * Are there any restrictions? @@ -1429,7 +1429,7 @@ public final class Pass2Verifier extends PassVerifier { * the instance initialization method is allowed and the special name * for the class/interface initialization method may be allowed. */ - private static boolean validMethodName(String name, boolean allowStaticInit){ + private static boolean validMethodName(final String name, final boolean allowStaticInit){ if (validJavaLangMethodName(name)) { return true; } @@ -1445,7 +1445,7 @@ public final class Pass2Verifier extends PassVerifier { * represents a valid method name that may be referenced by * ConstantMethodref objects. */ - private static boolean validClassMethodName(String name){ + private static boolean validClassMethodName(final String name){ return validMethodName(name, false); } @@ -1455,7 +1455,7 @@ public final class Pass2Verifier extends PassVerifier { * (non-qualified) name. * Conforming to: The Java Virtual Machine Specification, Second Edition, �2.7, �2.7.1, �2.2. */ - private static boolean validJavaLangMethodName(String name){ + private static boolean validJavaLangMethodName(final String name){ if (!Character.isJavaIdentifierStart(name.charAt(0))) { return false; } @@ -1473,7 +1473,7 @@ public final class Pass2Verifier extends PassVerifier { * represents a valid Java interface method name that may be * referenced by ConstantInterfaceMethodref objects. */ - private static boolean validInterfaceMethodName(String name){ + private static boolean validInterfaceMethodName(final String name){ // I guess we should assume special names forbidden here. if (name.startsWith("<")) { return false; @@ -1485,7 +1485,7 @@ public final class Pass2Verifier extends PassVerifier { * This method returns true if and only if the supplied String * represents a valid Java identifier (so-called simple name). */ - private static boolean validJavaIdentifier(String name){ + private static boolean validJavaIdentifier(final String name){ if (name.length() == 0) { return false; // must not be empty, reported by , thanks! } @@ -1507,7 +1507,7 @@ public final class Pass2Verifier extends PassVerifier { * This method returns true if and only if the supplied String * represents a valid Java field name. */ - private static boolean validFieldName(String name){ + private static boolean validFieldName(final String name){ // vmspec2 2.7, vmspec2 2.2 return validJavaIdentifier(name); } @@ -1537,7 +1537,7 @@ public final class Pass2Verifier extends PassVerifier { private final ConstantPool cp; /** Constructs an InnerClassDetector working on the JavaClass _jc. */ - public InnerClassDetector(JavaClass _jc){ + public InnerClassDetector(final JavaClass _jc){ jc = _jc; cp = jc.getConstantPool(); (new DescendingVisitor(jc, this)).visit(); @@ -1551,7 +1551,7 @@ public final class Pass2Verifier extends PassVerifier { } /** This method casually visits ConstantClass references. */ @Override - public void visitConstantClass(ConstantClass obj){ + public void visitConstantClass(final ConstantClass obj){ Constant c = cp.getConstant(obj.getNameIndex()); if (c instanceof ConstantUtf8){ //Ignore the case where it's not a ConstantUtf8 here, we'll find out later. String classname = ((ConstantUtf8) c).getBytes(); @@ -1565,7 +1565,7 @@ public final class Pass2Verifier extends PassVerifier { /** * This method is here to save typing work and improve code readability. */ - private static String tostring(Node n){ + private static String tostring(final Node n){ return new StringRepresentation(n).toString(); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java index ee23cdd5..f9bc7187 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java @@ -134,7 +134,7 @@ public final class Pass3aVerifier extends PassVerifier{ private Code code; /** Should only be instantiated by a Verifier. */ - public Pass3aVerifier(Verifier owner, int method_no){ + public Pass3aVerifier(final Verifier owner, final int method_no){ myOwner = owner; this.method_no = method_no; } @@ -452,7 +452,7 @@ public final class Pass3aVerifier extends PassVerifier{ } /** A small utility method returning if a given int i is in the given int[] ints. */ - private static boolean contains(int[] ints, int i){ + private static boolean contains(final int[] ints, final int i){ for (int k : ints) { if (k==i) { return true; @@ -475,7 +475,7 @@ public final class Pass3aVerifier extends PassVerifier{ private final ConstantPoolGen cpg; /** The only Constructor. */ - InstOperandConstraintVisitor(ConstantPoolGen cpg){ + InstOperandConstraintVisitor(final ConstantPoolGen cpg){ this.cpg = cpg; } @@ -495,7 +495,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** * A utility method to always raise an exeption. */ - private void constraintViolated(Instruction i, String message) { + private void constraintViolated(final Instruction i, final String message) { throw new StaticCodeInstructionOperandConstraintException("Instruction "+i+" constraint violated: "+message); } @@ -503,7 +503,7 @@ public final class Pass3aVerifier extends PassVerifier{ * A utility method to raise an exception if the index is not * a valid constant pool index. */ - private void indexValid(Instruction i, int idx){ + private void indexValid(final Instruction i, final int idx){ if (idx < 0 || idx >= cpg.getSize()){ constraintViolated(i, "Illegal constant pool index '"+idx+"'."); } @@ -517,7 +517,7 @@ public final class Pass3aVerifier extends PassVerifier{ * The referenced class is loaded and pass2-verified. */ @Override - public void visitLoadClass(LoadClass o){ + public void visitLoadClass(final LoadClass o){ ObjectType t = o.getLoadClassType(cpg); if (t != null){// null means "no class is loaded" Verifier v = VerifierFactory.getVerifier(t.getClassName()); @@ -539,7 +539,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ // LDC and LDC_W (LDC_W is a subclass of LDC in BCEL's model) @Override - public void visitLDC(LDC o){ + public void visitLDC(final LDC o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (c instanceof ConstantClass){ @@ -558,7 +558,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ // LDC2_W @Override - public void visitLDC2_W(LDC2_W o){ + public void visitLDC2_W(final LDC2_W o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! ( (c instanceof ConstantLong) || @@ -573,7 +573,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } - private ObjectType getObjectType(FieldInstruction o) { + private ObjectType getObjectType(final FieldInstruction o) { ReferenceType rt = o.getReferenceType(cpg); if(rt instanceof ObjectType) { return (ObjectType)rt; @@ -585,7 +585,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ //getfield, putfield, getstatic, putstatic @Override - public void visitFieldInstruction(FieldInstruction o){ + public void visitFieldInstruction(final FieldInstruction o){ try { indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); @@ -659,7 +659,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitInvokeInstruction(InvokeInstruction o){ + public void visitInvokeInstruction(final InvokeInstruction o){ indexValid(o, o.getIndex()); if ( (o instanceof INVOKEVIRTUAL) || (o instanceof INVOKESPECIAL) || @@ -738,7 +738,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitINSTANCEOF(INSTANCEOF o){ + public void visitINSTANCEOF(final INSTANCEOF o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! (c instanceof ConstantClass)){ @@ -748,7 +748,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitCHECKCAST(CHECKCAST o){ + public void visitCHECKCAST(final CHECKCAST o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! (c instanceof ConstantClass)){ @@ -758,7 +758,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitNEW(NEW o){ + public void visitNEW(final NEW o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! (c instanceof ConstantClass)){ @@ -776,7 +776,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitMULTIANEWARRAY(MULTIANEWARRAY o){ + public void visitMULTIANEWARRAY(final MULTIANEWARRAY o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! (c instanceof ConstantClass)){ @@ -803,7 +803,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitANEWARRAY(ANEWARRAY o){ + public void visitANEWARRAY(final ANEWARRAY o){ indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! (c instanceof ConstantClass)){ @@ -822,7 +822,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitNEWARRAY(NEWARRAY o){ + public void visitNEWARRAY(final NEWARRAY o){ byte t = o.getTypecode(); if (! ( (t == Const.T_BOOLEAN) || (t == Const.T_CHAR) || @@ -838,7 +838,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitILOAD(ILOAD o){ + public void visitILOAD(final ILOAD o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -853,7 +853,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitFLOAD(FLOAD o){ + public void visitFLOAD(final FLOAD o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -868,7 +868,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitALOAD(ALOAD o){ + public void visitALOAD(final ALOAD o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -883,7 +883,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitISTORE(ISTORE o){ + public void visitISTORE(final ISTORE o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -898,7 +898,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitFSTORE(FSTORE o){ + public void visitFSTORE(final FSTORE o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -913,7 +913,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitASTORE(ASTORE o){ + public void visitASTORE(final ASTORE o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -928,7 +928,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitIINC(IINC o){ + public void visitIINC(final IINC o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -943,7 +943,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitRET(RET o){ + public void visitRET(final RET o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."); @@ -958,7 +958,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitLLOAD(LLOAD o){ + public void visitLLOAD(final LLOAD o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."+ @@ -974,7 +974,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitDLOAD(DLOAD o){ + public void visitDLOAD(final DLOAD o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."+ @@ -990,7 +990,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitLSTORE(LSTORE o){ + public void visitLSTORE(final LSTORE o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."+ @@ -1006,7 +1006,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitDSTORE(DSTORE o){ + public void visitDSTORE(final DSTORE o){ int idx = o.getIndex(); if (idx < 0){ constraintViolated(o, "Index '"+idx+"' must be non-negative."+ @@ -1022,7 +1022,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ + public void visitLOOKUPSWITCH(final LOOKUPSWITCH o){ int[] matchs = o.getMatchs(); int max = Integer.MIN_VALUE; for (int i=0; i= "low". We cannot check this, as BCEL hides // it from us. } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitPUTSTATIC(PUTSTATIC o){ + public void visitPUTSTATIC(final PUTSTATIC o){ try { String field_name = o.getFieldName(cpg); JavaClass jc = Repository.lookupClass(getObjectType(o).getClassName()); @@ -1089,7 +1089,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitGETSTATIC(GETSTATIC o){ + public void visitGETSTATIC(final GETSTATIC o){ try { String field_name = o.getFieldName(cpg); JavaClass jc = Repository.lookupClass(getObjectType(o).getClassName()); @@ -1126,13 +1126,13 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitINVOKEDYNAMIC(INVOKEDYNAMIC o){ + public void visitINVOKEDYNAMIC(final INVOKEDYNAMIC o){ throw new RuntimeException("INVOKEDYNAMIC instruction is not supported at this time"); } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ + public void visitINVOKEINTERFACE(final INVOKEINTERFACE o){ try { // INVOKEINTERFACE is a LoadClass; the Class where the referenced method is declared in, // is therefore resolved/verified. @@ -1161,7 +1161,7 @@ public final class Pass3aVerifier extends PassVerifier{ * @param invoke the instruction that references the method * @return the referenced method or null if not found. */ - private Method getMethodRecursive(JavaClass jc, InvokeInstruction invoke) throws ClassNotFoundException{ + private Method getMethodRecursive(final JavaClass jc, final InvokeInstruction invoke) throws ClassNotFoundException{ Method m; //look in the given class m = getMethod(jc, invoke); @@ -1194,7 +1194,7 @@ public final class Pass3aVerifier extends PassVerifier{ * @param invoke the instruction that references the method * @return the referenced method or null if not found. */ - private Method getMethod(JavaClass jc, InvokeInstruction invoke){ + private Method getMethod(final JavaClass jc, final InvokeInstruction invoke){ Method[] ms = jc.getMethods(); for (Method element : ms) { if ( (element.getName().equals(invoke.getMethodName(cpg))) && @@ -1209,7 +1209,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitINVOKESPECIAL(INVOKESPECIAL o){ + public void visitINVOKESPECIAL(final INVOKESPECIAL o){ try { // INVOKESPECIAL is a LoadClass; the Class where the referenced method is declared in, // is therefore resolved/verified. @@ -1268,7 +1268,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitINVOKESTATIC(INVOKESTATIC o){ + public void visitINVOKESTATIC(final INVOKESTATIC o){ try { // INVOKESTATIC is a LoadClass; the Class where the referenced method is declared in, // is therefore resolved/verified. @@ -1293,7 +1293,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ + public void visitINVOKEVIRTUAL(final INVOKEVIRTUAL o){ try { // INVOKEVIRTUAL is a LoadClass; the Class where the referenced method is declared in, // is therefore resolved/verified. @@ -1324,7 +1324,7 @@ public final class Pass3aVerifier extends PassVerifier{ * The equality of the elements is based on their equals(Object) * method instead of their object identity. */ - private boolean objarrayequals(Object[] o, Object[] p){ + private boolean objarrayequals(final Object[] o, final Object[] p){ if (o.length != p.length){ return false; } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java index d46d2f8f..417a0d7a 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java @@ -90,7 +90,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * * @see #toString() */ - public StringRepresentation(Node n) { + public StringRepresentation(final Node n) { this.n = n; n.accept(this); // assign a string representation to field 'tostring' if we know n's class. } @@ -117,7 +117,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * this is obj.toString() if it does not throw any RuntimeException, * or else it is a string derived only from obj's class name. */ - private String toString(Node obj) { + private String toString(final Node obj) { String ret; try { ret = obj.toString(); @@ -140,7 +140,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp // e.g. we could also simply output "Code" instead of a possibly // lengthy Code attribute's toString(). @Override - public void visitCode(Code obj) { + public void visitCode(final Code obj) { //tostring = toString(obj); tostring = ""; // We don't need real code outputs. } @@ -149,7 +149,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * @since 6.0 */ @Override - public void visitAnnotation(Annotations obj) + public void visitAnnotation(final Annotations obj) { //this is invoked whenever an annotation is found //when verifier is passed over a class @@ -160,7 +160,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * @since 6.0 */ @Override - public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) + public void visitLocalVariableTypeTable(final LocalVariableTypeTable obj) { //this is invoked whenever a local variable type is found //when verifier is passed over a class @@ -168,152 +168,152 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp } @Override - public void visitCodeException(CodeException obj) { + public void visitCodeException(final CodeException obj) { tostring = toString(obj); } @Override - public void visitConstantClass(ConstantClass obj) { + public void visitConstantClass(final ConstantClass obj) { tostring = toString(obj); } @Override - public void visitConstantDouble(ConstantDouble obj) { + public void visitConstantDouble(final ConstantDouble obj) { tostring = toString(obj); } @Override - public void visitConstantFieldref(ConstantFieldref obj) { + public void visitConstantFieldref(final ConstantFieldref obj) { tostring = toString(obj); } @Override - public void visitConstantFloat(ConstantFloat obj) { + public void visitConstantFloat(final ConstantFloat obj) { tostring = toString(obj); } @Override - public void visitConstantInteger(ConstantInteger obj) { + public void visitConstantInteger(final ConstantInteger obj) { tostring = toString(obj); } @Override - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) { + public void visitConstantInterfaceMethodref(final ConstantInterfaceMethodref obj) { tostring = toString(obj); } @Override - public void visitConstantLong(ConstantLong obj) { + public void visitConstantLong(final ConstantLong obj) { tostring = toString(obj); } @Override - public void visitConstantMethodref(ConstantMethodref obj) { + public void visitConstantMethodref(final ConstantMethodref obj) { tostring = toString(obj); } @Override - public void visitConstantNameAndType(ConstantNameAndType obj) { + public void visitConstantNameAndType(final ConstantNameAndType obj) { tostring = toString(obj); } @Override - public void visitConstantPool(ConstantPool obj) { + public void visitConstantPool(final ConstantPool obj) { tostring = toString(obj); } @Override - public void visitConstantString(ConstantString obj) { + public void visitConstantString(final ConstantString obj) { tostring = toString(obj); } @Override - public void visitConstantUtf8(ConstantUtf8 obj) { + public void visitConstantUtf8(final ConstantUtf8 obj) { tostring = toString(obj); } @Override - public void visitConstantValue(ConstantValue obj) { + public void visitConstantValue(final ConstantValue obj) { tostring = toString(obj); } @Override - public void visitDeprecated(Deprecated obj) { + public void visitDeprecated(final Deprecated obj) { tostring = toString(obj); } @Override - public void visitExceptionTable(ExceptionTable obj) { + public void visitExceptionTable(final ExceptionTable obj) { tostring = toString(obj); } @Override - public void visitField(Field obj) { + public void visitField(final Field obj) { tostring = toString(obj); } @Override - public void visitInnerClass(InnerClass obj) { + public void visitInnerClass(final InnerClass obj) { tostring = toString(obj); } @Override - public void visitInnerClasses(InnerClasses obj) { + public void visitInnerClasses(final InnerClasses obj) { tostring = toString(obj); } @Override - public void visitJavaClass(JavaClass obj) { + public void visitJavaClass(final JavaClass obj) { tostring = toString(obj); } @Override - public void visitLineNumber(LineNumber obj) { + public void visitLineNumber(final LineNumber obj) { tostring = toString(obj); } @Override - public void visitLineNumberTable(LineNumberTable obj) { + public void visitLineNumberTable(final LineNumberTable obj) { tostring = ""; } @Override - public void visitLocalVariable(LocalVariable obj) { + public void visitLocalVariable(final LocalVariable obj) { tostring = toString(obj); } @Override - public void visitLocalVariableTable(LocalVariableTable obj) { + public void visitLocalVariableTable(final LocalVariableTable obj) { tostring = ""; } @Override - public void visitMethod(Method obj) { + public void visitMethod(final Method obj) { tostring = toString(obj); } @Override - public void visitSignature(Signature obj) { + public void visitSignature(final Signature obj) { tostring = toString(obj); } @Override - public void visitSourceFile(SourceFile obj) { + public void visitSourceFile(final SourceFile obj) { tostring = toString(obj); } @Override - public void visitStackMap(StackMap obj) { + public void visitStackMap(final StackMap obj) { tostring = toString(obj); } @Override - public void visitSynthetic(Synthetic obj) { + public void visitSynthetic(final Synthetic obj) { tostring = toString(obj); } @Override - public void visitUnknown(Unknown obj) { + public void visitUnknown(final Unknown obj) { tostring = toString(obj); } @@ -321,7 +321,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * @since 6.0 */ @Override - public void visitEnclosingMethod(EnclosingMethod obj) { + public void visitEnclosingMethod(final EnclosingMethod obj) { tostring = toString(obj); } @@ -329,7 +329,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * @since 6.0 */ @Override - public void visitBootstrapMethods(BootstrapMethods obj) { + public void visitBootstrapMethods(final BootstrapMethods obj) { tostring = toString(obj); } @@ -337,7 +337,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * @since 6.0 */ @Override - public void visitMethodParameters(MethodParameters obj) { + public void visitMethodParameters(final MethodParameters obj) { tostring = toString(obj); } @@ -345,7 +345,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * @since 6.0 */ @Override - public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj) { + public void visitConstantInvokeDynamic(final ConstantInvokeDynamic obj) { tostring = toString(obj); } @@ -353,7 +353,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * @since 6.0 */ @Override - public void visitStackMapEntry(StackMapEntry obj) { + public void visitStackMapEntry(final StackMapEntry obj) { tostring = toString(obj); } /** @@ -361,7 +361,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp */ @Override - public void visitParameterAnnotation(ParameterAnnotations obj) { + public void visitParameterAnnotation(final ParameterAnnotations obj) { tostring = toString(obj); } @@ -369,7 +369,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * @since 6.0 */ @Override - public void visitAnnotationEntry(AnnotationEntry obj) { + public void visitAnnotationEntry(final AnnotationEntry obj) { tostring = toString(obj); } @@ -377,7 +377,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * @since 6.0 */ @Override - public void visitAnnotationDefault(AnnotationDefault obj) { + public void visitAnnotationDefault(final AnnotationDefault obj) { tostring = toString(obj); } @@ -385,7 +385,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * @since 6.0 */ @Override - public void visitConstantMethodType(ConstantMethodType obj) { + public void visitConstantMethodType(final ConstantMethodType obj) { tostring = toString(obj); } @@ -393,7 +393,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * @since 6.0 */ @Override - public void visitConstantMethodHandle(ConstantMethodHandle obj) { + public void visitConstantMethodHandle(final ConstantMethodHandle obj) { tostring = toString(obj); } @@ -401,7 +401,7 @@ public class StringRepresentation extends org.apache.commons.bcel6.classfile.Emp * @since 6.0 */ @Override - public void visitParameterAnnotationEntry(ParameterAnnotationEntry obj) { + public void visitParameterAnnotationEntry(final ParameterAnnotationEntry obj) { tostring = toString(obj); } } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java index 659c7c59..8b34053d 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java @@ -83,7 +83,7 @@ public class ControlFlowGraph{ * Creates an InstructionHandleImpl object from an InstructionHandle. * Creation of one per InstructionHandle suffices. Don't create more. */ - public InstructionContextImpl(InstructionHandle inst){ + public InstructionContextImpl(final InstructionHandle inst){ if (inst == null) { throw new AssertionViolatedException("Cannot instantiate InstructionContextImpl from NULL."); } @@ -101,7 +101,7 @@ public class ControlFlowGraph{ /* Satisfies InstructionContext.setTag(int). */ @Override - public void setTag(int tag){ // part of InstructionContext interface + public void setTag(final int tag){ // part of InstructionContext interface TAG = tag; } @@ -117,7 +117,7 @@ public class ControlFlowGraph{ * Returns a clone of the "outgoing" frame situation with respect to the given ExecutionChain. */ @Override - public Frame getOutFrame(ArrayList execChain){ + public Frame getOutFrame(final ArrayList execChain){ executionPredecessors = execChain; Frame org; @@ -163,7 +163,7 @@ public class ControlFlowGraph{ * changed from the one before execute()ing. */ @Override - public boolean execute(Frame inFrame, ArrayList execPreds, InstConstraintVisitor icv, ExecutionVisitor ev){ + public boolean execute(final Frame inFrame, final ArrayList execPreds, final InstConstraintVisitor icv, final ExecutionVisitor ev){ @SuppressWarnings("unchecked") // OK because execPreds is compatible type final List clone = (List) execPreds.clone(); @@ -238,7 +238,7 @@ public class ControlFlowGraph{ * Does the actual merging (vmspec2, page 146). * Returns true IFF this.inFrame was changed in course of merging with inFrame. */ - private boolean mergeInFrames(Frame inFrame) { + private boolean mergeInFrames(final Frame inFrame) { // TODO: Can be performance-improved. Frame inF = inFrames.get(lastExecutionJSR()); OperandStack oldstack = inF.getStack().getClone(); @@ -272,7 +272,7 @@ public class ControlFlowGraph{ * This extended message will then reflect the execution flow needed to get to the constraint * violation that triggered the throwing of the "e" object. */ - private void extendMessageWithFlow(StructuralCodeConstraintException e){ + private void extendMessageWithFlow(final StructuralCodeConstraintException e){ String s = "Execution flow:\n"; e.extendMessage("", s+getExecutionChain()); } @@ -412,7 +412,7 @@ public class ControlFlowGraph{ * A Control Flow Graph; with additional JustIce checks * @param method_gen the method generator instance */ - public ControlFlowGraph(MethodGen method_gen){ + public ControlFlowGraph(final MethodGen method_gen){ this(method_gen, true); } @@ -422,7 +422,7 @@ public class ControlFlowGraph{ * @param enableJustIceCheck if true, additional JustIce checks are performed * @since 6.0 */ - public ControlFlowGraph(MethodGen method_gen, boolean enableJustIceCheck){ + public ControlFlowGraph(final MethodGen method_gen, final boolean enableJustIceCheck){ subroutines = new Subroutines(method_gen, enableJustIceCheck); exceptionhandlers = new ExceptionHandlers(method_gen); @@ -437,7 +437,7 @@ public class ControlFlowGraph{ /** * Returns the InstructionContext of a given instruction. */ - public InstructionContext contextOf(InstructionHandle inst){ + public InstructionContext contextOf(final InstructionHandle inst){ InstructionContext ic = instructionContexts.get(inst); if (ic == null){ throw new AssertionViolatedException("InstructionContext requested for an InstructionHandle that's not known!"); @@ -449,7 +449,7 @@ public class ControlFlowGraph{ * Returns the InstructionContext[] of a given InstructionHandle[], * in a naturally ordered manner. */ - public InstructionContext[] contextsOf(InstructionHandle[] insts){ + public InstructionContext[] contextsOf(final InstructionHandle[] insts){ InstructionContext[] ret = new InstructionContext[insts.length]; for (int i=0; i(); CodeExceptionGen[] cegs = mg.getExceptionHandlers(); for (CodeExceptionGen ceg : cegs) { @@ -63,7 +63,7 @@ public class ExceptionHandlers{ * Returns all the ExceptionHandler instances representing exception * handlers that protect the instruction ih. */ - public ExceptionHandler[] getExceptionHandlers(InstructionHandle ih){ + public ExceptionHandler[] getExceptionHandlers(final InstructionHandle ih){ Set hsSet = exceptionhandlers.get(ih); if (hsSet == null) { return new ExceptionHandler[0]; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java index 30b0e51a..4ffe6efe 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java @@ -96,7 +96,7 @@ public class ExecutionVisitor extends EmptyVisitor{ /** * Sets the ConstantPoolGen needed for symbolic execution. */ - public void setConstantPoolGen(ConstantPoolGen cpg){ // TODO could be package-protected? + public void setConstantPoolGen(final ConstantPoolGen cpg){ // TODO could be package-protected? this.cpg = cpg; } @@ -106,7 +106,7 @@ public class ExecutionVisitor extends EmptyVisitor{ * instance, SET THE ConstantPoolGen FIRST. * @see #setConstantPoolGen(ConstantPoolGen) */ - public void setFrame(Frame f){ // TODO could be package-protected? + public void setFrame(final Frame f){ // TODO could be package-protected? this.frame = f; } @@ -122,7 +122,7 @@ public class ExecutionVisitor extends EmptyVisitor{ /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitAALOAD(AALOAD o){ + public void visitAALOAD(final AALOAD o){ stack().pop(); // pop the index int //System.out.print(stack().peek()); Type t = stack().pop(); // Pop Array type @@ -136,49 +136,49 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitAASTORE(AASTORE o){ + public void visitAASTORE(final AASTORE o){ stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitACONST_NULL(ACONST_NULL o){ + public void visitACONST_NULL(final ACONST_NULL o){ stack().push(Type.NULL); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitALOAD(ALOAD o){ + public void visitALOAD(final ALOAD o){ stack().push(locals().get(o.getIndex())); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitANEWARRAY(ANEWARRAY o){ + public void visitANEWARRAY(final ANEWARRAY o){ stack().pop(); //count stack().push( new ArrayType(o.getType(cpg), 1) ); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitARETURN(ARETURN o){ + public void visitARETURN(final ARETURN o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitARRAYLENGTH(ARRAYLENGTH o){ + public void visitARRAYLENGTH(final ARRAYLENGTH o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitASTORE(ASTORE o){ + public void visitASTORE(final ASTORE o){ locals().set(o.getIndex(), stack().pop()); //System.err.println("TODO-DEBUG: set LV '"+o.getIndex()+"' to '"+locals().get(o.getIndex())+"'."); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitATHROW(ATHROW o){ + public void visitATHROW(final ATHROW o){ Type t = stack().pop(); stack().clear(); if (t.equals(Type.NULL)) { @@ -190,7 +190,7 @@ public class ExecutionVisitor extends EmptyVisitor{ /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitBALOAD(BALOAD o){ + public void visitBALOAD(final BALOAD o){ stack().pop(); stack().pop(); stack().push(Type.INT); @@ -198,7 +198,7 @@ public class ExecutionVisitor extends EmptyVisitor{ /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitBASTORE(BASTORE o){ + public void visitBASTORE(final BASTORE o){ stack().pop(); stack().pop(); stack().pop(); @@ -206,27 +206,27 @@ public class ExecutionVisitor extends EmptyVisitor{ /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitBIPUSH(BIPUSH o){ + public void visitBIPUSH(final BIPUSH o){ stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitCALOAD(CALOAD o){ + public void visitCALOAD(final CALOAD o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitCASTORE(CASTORE o){ + public void visitCASTORE(final CASTORE o){ stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitCHECKCAST(CHECKCAST o){ + public void visitCHECKCAST(final CHECKCAST o){ // It's possibly wrong to do so, but SUN's // ByteCode verifier seems to do (only) this, too. // TODO: One could use a sophisticated analysis here to check @@ -238,122 +238,122 @@ public class ExecutionVisitor extends EmptyVisitor{ /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitD2F(D2F o){ + public void visitD2F(final D2F o){ stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitD2I(D2I o){ + public void visitD2I(final D2I o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitD2L(D2L o){ + public void visitD2L(final D2L o){ stack().pop(); stack().push(Type.LONG); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDADD(DADD o){ + public void visitDADD(final DADD o){ stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDALOAD(DALOAD o){ + public void visitDALOAD(final DALOAD o){ stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDASTORE(DASTORE o){ + public void visitDASTORE(final DASTORE o){ stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDCMPG(DCMPG o){ + public void visitDCMPG(final DCMPG o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDCMPL(DCMPL o){ + public void visitDCMPL(final DCMPL o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDCONST(DCONST o){ + public void visitDCONST(final DCONST o){ stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDDIV(DDIV o){ + public void visitDDIV(final DDIV o){ stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDLOAD(DLOAD o){ + public void visitDLOAD(final DLOAD o){ stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDMUL(DMUL o){ + public void visitDMUL(final DMUL o){ stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDNEG(DNEG o){ + public void visitDNEG(final DNEG o){ stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDREM(DREM o){ + public void visitDREM(final DREM o){ stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDRETURN(DRETURN o){ + public void visitDRETURN(final DRETURN o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDSTORE(DSTORE o){ + public void visitDSTORE(final DSTORE o){ locals().set(o.getIndex(), stack().pop()); locals().set(o.getIndex()+1, Type.UNKNOWN); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDSUB(DSUB o){ + public void visitDSUB(final DSUB o){ stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDUP(DUP o){ + public void visitDUP(final DUP o){ Type t = stack().pop(); stack().push(t); stack().push(t); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDUP_X1(DUP_X1 o){ + public void visitDUP_X1(final DUP_X1 o){ Type w1 = stack().pop(); Type w2 = stack().pop(); stack().push(w1); @@ -362,7 +362,7 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDUP_X2(DUP_X2 o){ + public void visitDUP_X2(final DUP_X2 o){ Type w1 = stack().pop(); Type w2 = stack().pop(); if (w2.getSize() == 2){ @@ -380,7 +380,7 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDUP2(DUP2 o){ + public void visitDUP2(final DUP2 o){ Type t = stack().pop(); if (t.getSize() == 2){ stack().push(t); @@ -396,7 +396,7 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDUP2_X1(DUP2_X1 o){ + public void visitDUP2_X1(final DUP2_X1 o){ Type t = stack().pop(); if (t.getSize() == 2){ Type u = stack().pop(); @@ -416,7 +416,7 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDUP2_X2(DUP2_X2 o){ + public void visitDUP2_X2(final DUP2_X2 o){ Type t = stack().pop(); if (t.getSize() == 2){ Type u = stack().pop(); @@ -454,114 +454,114 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitF2D(F2D o){ + public void visitF2D(final F2D o){ stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitF2I(F2I o){ + public void visitF2I(final F2I o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitF2L(F2L o){ + public void visitF2L(final F2L o){ stack().pop(); stack().push(Type.LONG); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFADD(FADD o){ + public void visitFADD(final FADD o){ stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFALOAD(FALOAD o){ + public void visitFALOAD(final FALOAD o){ stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFASTORE(FASTORE o){ + public void visitFASTORE(final FASTORE o){ stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFCMPG(FCMPG o){ + public void visitFCMPG(final FCMPG o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFCMPL(FCMPL o){ + public void visitFCMPL(final FCMPL o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFCONST(FCONST o){ + public void visitFCONST(final FCONST o){ stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFDIV(FDIV o){ + public void visitFDIV(final FDIV o){ stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFLOAD(FLOAD o){ + public void visitFLOAD(final FLOAD o){ stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFMUL(FMUL o){ + public void visitFMUL(final FMUL o){ stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFNEG(FNEG o){ + public void visitFNEG(final FNEG o){ stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFREM(FREM o){ + public void visitFREM(final FREM o){ stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFRETURN(FRETURN o){ + public void visitFRETURN(final FRETURN o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFSTORE(FSTORE o){ + public void visitFSTORE(final FSTORE o){ locals().set(o.getIndex(), stack().pop()); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFSUB(FSUB o){ + public void visitFSUB(final FSUB o){ stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitGETFIELD(GETFIELD o){ + public void visitGETFIELD(final GETFIELD o){ stack().pop(); Type t = o.getFieldType(cpg); if ( t.equals(Type.BOOLEAN) || @@ -574,7 +574,7 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitGETSTATIC(GETSTATIC o){ + public void visitGETSTATIC(final GETSTATIC o){ Type t = o.getFieldType(cpg); if ( t.equals(Type.BOOLEAN) || t.equals(Type.CHAR) || @@ -586,204 +586,204 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitGOTO(GOTO o){ + public void visitGOTO(final GOTO o){ // no stack changes. } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitGOTO_W(GOTO_W o){ + public void visitGOTO_W(final GOTO_W o){ // no stack changes. } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitI2B(I2B o){ + public void visitI2B(final I2B o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitI2C(I2C o){ + public void visitI2C(final I2C o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitI2D(I2D o){ + public void visitI2D(final I2D o){ stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitI2F(I2F o){ + public void visitI2F(final I2F o){ stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitI2L(I2L o){ + public void visitI2L(final I2L o){ stack().pop(); stack().push(Type.LONG); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitI2S(I2S o){ + public void visitI2S(final I2S o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIADD(IADD o){ + public void visitIADD(final IADD o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIALOAD(IALOAD o){ + public void visitIALOAD(final IALOAD o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIAND(IAND o){ + public void visitIAND(final IAND o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIASTORE(IASTORE o){ + public void visitIASTORE(final IASTORE o){ stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitICONST(ICONST o){ + public void visitICONST(final ICONST o){ stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIDIV(IDIV o){ + public void visitIDIV(final IDIV o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ACMPEQ(IF_ACMPEQ o){ + public void visitIF_ACMPEQ(final IF_ACMPEQ o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ACMPNE(IF_ACMPNE o){ + public void visitIF_ACMPNE(final IF_ACMPNE o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ICMPEQ(IF_ICMPEQ o){ + public void visitIF_ICMPEQ(final IF_ICMPEQ o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ICMPGE(IF_ICMPGE o){ + public void visitIF_ICMPGE(final IF_ICMPGE o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ICMPGT(IF_ICMPGT o){ + public void visitIF_ICMPGT(final IF_ICMPGT o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ICMPLE(IF_ICMPLE o){ + public void visitIF_ICMPLE(final IF_ICMPLE o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ICMPLT(IF_ICMPLT o){ + public void visitIF_ICMPLT(final IF_ICMPLT o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ICMPNE(IF_ICMPNE o){ + public void visitIF_ICMPNE(final IF_ICMPNE o){ stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFEQ(IFEQ o){ + public void visitIFEQ(final IFEQ o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFGE(IFGE o){ + public void visitIFGE(final IFGE o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFGT(IFGT o){ + public void visitIFGT(final IFGT o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFLE(IFLE o){ + public void visitIFLE(final IFLE o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFLT(IFLT o){ + public void visitIFLT(final IFLT o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFNE(IFNE o){ + public void visitIFNE(final IFNE o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFNONNULL(IFNONNULL o){ + public void visitIFNONNULL(final IFNONNULL o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFNULL(IFNULL o){ + public void visitIFNULL(final IFNULL o){ stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIINC(IINC o){ + public void visitIINC(final IINC o){ // stack is not changed. } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitILOAD(ILOAD o){ + public void visitILOAD(final ILOAD o){ stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIMUL(IMUL o){ + public void visitIMUL(final IMUL o){ stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitINEG(INEG o){ + public void visitINEG(final INEG o){ stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitINSTANCEOF(INSTANCEOF o){ + public void visitINSTANCEOF(final INSTANCEOF o){ stack().pop(); stack().push(Type.INT); } @@ -792,7 +792,7 @@ public class ExecutionVisitor extends EmptyVisitor{ * @since 6.0 */ @Override - public void visitINVOKEDYNAMIC(INVOKEDYNAMIC o){ + public void visitINVOKEDYNAMIC(final INVOKEDYNAMIC o){ for (int i=0; i stack().slotsUsed()){ constraintViolated(o, @@ -228,7 +228,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * The referenced class is loaded and pass2-verified. */ @Override - public void visitLoadClass(LoadClass o){ + public void visitLoadClass(final LoadClass o){ ObjectType t = o.getLoadClassType(cpg); if (t != null){// null means "no class is loaded" Verifier v = VerifierFactory.getVerifier(t.getClassName()); @@ -244,7 +244,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the general preconditions of a StackConsumer instance. */ @Override - public void visitStackConsumer(StackConsumer o){ + public void visitStackConsumer(final StackConsumer o){ _visitStackAccessor((Instruction) o); } @@ -252,7 +252,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the general preconditions of a StackProducer instance. */ @Override - public void visitStackProducer(StackProducer o){ + public void visitStackProducer(final StackProducer o){ _visitStackAccessor((Instruction) o); } @@ -266,7 +266,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the general preconditions of a CPInstruction instance. */ @Override - public void visitCPInstruction(CPInstruction o){ + public void visitCPInstruction(final CPInstruction o){ int idx = o.getIndex(); if ((idx < 0) || (idx >= cpg.getSize())){ throw new AssertionViolatedException( @@ -278,7 +278,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the general preconditions of a FieldInstruction instance. */ @Override - public void visitFieldInstruction(FieldInstruction o){ + public void visitFieldInstruction(final FieldInstruction o){ // visitLoadClass(o) has been called before: Every FieldOrMethod // implements LoadClass. // visitCPInstruction(o) has been called before. @@ -304,7 +304,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the general preconditions of an InvokeInstruction instance. */ @Override - public void visitInvokeInstruction(InvokeInstruction o){ + public void visitInvokeInstruction(final InvokeInstruction o){ // visitLoadClass(o) has been called before: Every FieldOrMethod // implements LoadClass. // visitCPInstruction(o) has been called before. @@ -315,7 +315,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the general preconditions of a StackInstruction instance. */ @Override - public void visitStackInstruction(StackInstruction o){ + public void visitStackInstruction(final StackInstruction o){ _visitStackAccessor(o); } @@ -324,7 +324,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * That is, the index of the local variable must be valid. */ @Override - public void visitLocalVariableInstruction(LocalVariableInstruction o){ + public void visitLocalVariableInstruction(final LocalVariableInstruction o){ if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ constraintViolated(o, "The 'index' is not a valid index into the local variable array."); } @@ -334,7 +334,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Assures the generic preconditions of a LoadInstruction instance. */ @Override - public void visitLoadInstruction(LoadInstruction o){ + public void visitLoadInstruction(final LoadInstruction o){ //visitLocalVariableInstruction(o) is called before, because it is more generic. // LOAD instructions must not read Type.UNKNOWN @@ -379,7 +379,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Assures the generic preconditions of a StoreInstruction instance. */ @Override - public void visitStoreInstruction(StoreInstruction o){ + public void visitStoreInstruction(final StoreInstruction o){ //visitLocalVariableInstruction(o) is called before, because it is more generic. if (stack().isEmpty()){ // Don't bother about 1 or 2 stack slots used. This check is implicitly done below while type checking. @@ -408,7 +408,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Assures the generic preconditions of a ReturnInstruction instance. */ @Override - public void visitReturnInstruction(ReturnInstruction o){ + public void visitReturnInstruction(final ReturnInstruction o){ Type method_type = mg.getType(); if (method_type == Type.BOOLEAN || method_type == Type.BYTE || @@ -460,7 +460,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitAALOAD(AALOAD o){ + public void visitAALOAD(final AALOAD o){ Type arrayref = stack().peek(1); Type index = stack().peek(0); @@ -479,7 +479,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitAASTORE(AASTORE o){ + public void visitAASTORE(final AASTORE o){ Type arrayref = stack().peek(2); Type index = stack().peek(1); Type value = stack().peek(0); @@ -505,7 +505,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitACONST_NULL(ACONST_NULL o){ + public void visitACONST_NULL(final ACONST_NULL o){ // Nothing needs to be done here. } @@ -513,7 +513,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitALOAD(ALOAD o){ + public void visitALOAD(final ALOAD o){ //visitLoadInstruction(LoadInstruction) is called before. // Nothing else needs to be done here. @@ -523,7 +523,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitANEWARRAY(ANEWARRAY o){ + public void visitANEWARRAY(final ANEWARRAY o){ if (!stack().peek().equals(Type.INT)) { constraintViolated(o, "The 'count' at the stack top is not of type '"+Type.INT+"' but of type '"+stack().peek()+"'."); // The runtime constant pool item at that index must be a symbolic reference to a class, @@ -535,7 +535,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitARETURN(ARETURN o){ + public void visitARETURN(final ARETURN o){ if (! (stack().peek() instanceof ReferenceType) ){ constraintViolated(o, "The 'objectref' at the stack top is not of a ReferenceType but of type '"+stack().peek()+"'."); } @@ -555,7 +555,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitARRAYLENGTH(ARRAYLENGTH o){ + public void visitARRAYLENGTH(final ARRAYLENGTH o){ Type arrayref = stack().peek(0); arrayrefOfArrayType(o, arrayref); } @@ -564,7 +564,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitASTORE(ASTORE o){ + public void visitASTORE(final ASTORE o){ if (! ( (stack().peek() instanceof ReferenceType) || (stack().peek() instanceof ReturnaddressType) ) ){ constraintViolated(o, "The 'objectref' is not of a ReferenceType or of ReturnaddressType but of "+stack().peek()+"."); } @@ -577,7 +577,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitATHROW(ATHROW o){ + public void visitATHROW(final ATHROW o){ try { // It's stated that 'objectref' must be of a ReferenceType --- but since Throwable is // not derived from an ArrayType, it follows that 'objectref' must be of an ObjectType or Type.NULL. @@ -606,7 +606,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitBALOAD(BALOAD o){ + public void visitBALOAD(final BALOAD o){ Type arrayref = stack().peek(1); Type index = stack().peek(0); indexOfInt(o, index); @@ -624,7 +624,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitBASTORE(BASTORE o){ + public void visitBASTORE(final BASTORE o){ Type arrayref = stack().peek(2); Type index = stack().peek(1); Type value = stack().peek(0); @@ -645,7 +645,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitBIPUSH(BIPUSH o){ + public void visitBIPUSH(final BIPUSH o){ // Nothing to do... } @@ -653,7 +653,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitBREAKPOINT(BREAKPOINT o){ + public void visitBREAKPOINT(final BREAKPOINT o){ throw new AssertionViolatedException( "In this JustIce verification pass there should not occur an illegal instruction such as BREAKPOINT."); } @@ -662,7 +662,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitCALOAD(CALOAD o){ + public void visitCALOAD(final CALOAD o){ Type arrayref = stack().peek(1); Type index = stack().peek(0); @@ -674,7 +674,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitCASTORE(CASTORE o){ + public void visitCASTORE(final CASTORE o){ Type arrayref = stack().peek(2); Type index = stack().peek(1); Type value = stack().peek(0); @@ -693,7 +693,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitCHECKCAST(CHECKCAST o){ + public void visitCHECKCAST(final CHECKCAST o){ // The objectref must be of type reference. Type objectref = stack().peek(0); if (!(objectref instanceof ReferenceType)){ @@ -715,7 +715,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitD2F(D2F o){ + public void visitD2F(final D2F o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -725,7 +725,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitD2I(D2I o){ + public void visitD2I(final D2I o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -735,7 +735,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitD2L(D2L o){ + public void visitD2L(final D2L o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -745,7 +745,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDADD(DADD o){ + public void visitDADD(final DADD o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -758,7 +758,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDALOAD(DALOAD o){ + public void visitDALOAD(final DALOAD o){ indexOfInt(o, stack().peek()); if (stack().peek(1) == Type.NULL){ return; @@ -776,7 +776,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDASTORE(DASTORE o){ + public void visitDASTORE(final DASTORE o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -797,7 +797,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDCMPG(DCMPG o){ + public void visitDCMPG(final DCMPG o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -810,7 +810,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDCMPL(DCMPL o){ + public void visitDCMPL(final DCMPL o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -823,7 +823,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDCONST(DCONST o){ + public void visitDCONST(final DCONST o){ // There's nothing to be done here. } @@ -831,7 +831,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDDIV(DDIV o){ + public void visitDDIV(final DDIV o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -844,7 +844,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDLOAD(DLOAD o){ + public void visitDLOAD(final DLOAD o){ //visitLoadInstruction(LoadInstruction) is called before. // Nothing else needs to be done here. @@ -854,7 +854,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDMUL(DMUL o){ + public void visitDMUL(final DMUL o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -867,7 +867,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDNEG(DNEG o){ + public void visitDNEG(final DNEG o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -877,7 +877,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDREM(DREM o){ + public void visitDREM(final DREM o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -890,7 +890,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDRETURN(DRETURN o){ + public void visitDRETURN(final DRETURN o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -900,7 +900,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDSTORE(DSTORE o){ + public void visitDSTORE(final DSTORE o){ //visitStoreInstruction(StoreInstruction) is called before. // Nothing else needs to be done here. @@ -910,7 +910,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDSUB(DSUB o){ + public void visitDSUB(final DSUB o){ if (stack().peek() != Type.DOUBLE){ constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } @@ -923,7 +923,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDUP(DUP o){ + public void visitDUP(final DUP o){ if (stack().peek().getSize() != 1){ constraintViolated(o, "Won't DUP type on stack top '"+stack().peek()+ "' because it must occupy exactly one slot, not '"+stack().peek().getSize()+"'."); @@ -934,7 +934,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDUP_X1(DUP_X1 o){ + public void visitDUP_X1(final DUP_X1 o){ if (stack().peek().getSize() != 1){ constraintViolated(o, "Type on stack top '"+stack().peek()+"' should occupy exactly one slot, not '"+stack().peek().getSize()+"'."); @@ -950,7 +950,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDUP_X2(DUP_X2 o){ + public void visitDUP_X2(final DUP_X2 o){ if (stack().peek().getSize() != 1){ constraintViolated(o, "Stack top type must be of size 1, but is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); @@ -971,7 +971,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDUP2(DUP2 o){ + public void visitDUP2(final DUP2 o){ if (stack().peek().getSize() == 2){ return; // Form 2, okay. } @@ -987,7 +987,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDUP2_X1(DUP2_X1 o){ + public void visitDUP2_X1(final DUP2_X1 o){ if (stack().peek().getSize() == 2){ if (stack().peek(1).getSize() != 1){ constraintViolated(o, "If stack top's size is 2, then stack next-to-top's size must be 1. But it is '"+ @@ -1013,7 +1013,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDUP2_X2(DUP2_X2 o){ + public void visitDUP2_X2(final DUP2_X2 o){ if (stack().peek(0).getSize() == 2){ if (stack().peek(1).getSize() == 2){ @@ -1046,7 +1046,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitF2D(F2D o){ + public void visitF2D(final F2D o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1056,7 +1056,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitF2I(F2I o){ + public void visitF2I(final F2I o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1066,7 +1066,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitF2L(F2L o){ + public void visitF2L(final F2L o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1076,7 +1076,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFADD(FADD o){ + public void visitFADD(final FADD o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1089,7 +1089,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFALOAD(FALOAD o){ + public void visitFALOAD(final FALOAD o){ indexOfInt(o, stack().peek()); if (stack().peek(1) == Type.NULL){ return; @@ -1107,7 +1107,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFASTORE(FASTORE o){ + public void visitFASTORE(final FASTORE o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1128,7 +1128,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFCMPG(FCMPG o){ + public void visitFCMPG(final FCMPG o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1141,7 +1141,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFCMPL(FCMPL o){ + public void visitFCMPL(final FCMPL o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1154,7 +1154,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFCONST(FCONST o){ + public void visitFCONST(final FCONST o){ // nothing to do here. } @@ -1162,7 +1162,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFDIV(FDIV o){ + public void visitFDIV(final FDIV o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1175,7 +1175,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFLOAD(FLOAD o){ + public void visitFLOAD(final FLOAD o){ //visitLoadInstruction(LoadInstruction) is called before. // Nothing else needs to be done here. @@ -1185,7 +1185,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFMUL(FMUL o){ + public void visitFMUL(final FMUL o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1198,7 +1198,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFNEG(FNEG o){ + public void visitFNEG(final FNEG o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1208,7 +1208,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFREM(FREM o){ + public void visitFREM(final FREM o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1221,7 +1221,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFRETURN(FRETURN o){ + public void visitFRETURN(final FRETURN o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1231,7 +1231,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFSTORE(FSTORE o){ + public void visitFSTORE(final FSTORE o){ //visitStoreInstruction(StoreInstruction) is called before. // Nothing else needs to be done here. @@ -1241,7 +1241,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFSUB(FSUB o){ + public void visitFSUB(final FSUB o){ if (stack().peek() != Type.FLOAT){ constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } @@ -1250,7 +1250,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } - private ObjectType getObjectType(FieldInstruction o) { + private ObjectType getObjectType(final FieldInstruction o) { ReferenceType rt = o.getReferenceType(cpg); if(rt instanceof ObjectType) { return (ObjectType)rt; @@ -1263,7 +1263,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitGETFIELD(GETFIELD o){ + public void visitGETFIELD(final GETFIELD o){ try { Type objectref = stack().peek(); if (! ( (objectref instanceof ObjectType) || (objectref == Type.NULL) ) ){ @@ -1355,7 +1355,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitGETSTATIC(GETSTATIC o){ + public void visitGETSTATIC(final GETSTATIC o){ // Field must be static: see Pass 3a. } @@ -1363,7 +1363,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitGOTO(GOTO o){ + public void visitGOTO(final GOTO o){ // nothing to do here. } @@ -1371,7 +1371,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitGOTO_W(GOTO_W o){ + public void visitGOTO_W(final GOTO_W o){ // nothing to do here. } @@ -1379,7 +1379,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitI2B(I2B o){ + public void visitI2B(final I2B o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1389,7 +1389,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitI2C(I2C o){ + public void visitI2C(final I2C o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1399,7 +1399,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitI2D(I2D o){ + public void visitI2D(final I2D o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1409,7 +1409,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitI2F(I2F o){ + public void visitI2F(final I2F o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1419,7 +1419,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitI2L(I2L o){ + public void visitI2L(final I2L o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1429,7 +1429,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitI2S(I2S o){ + public void visitI2S(final I2S o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1439,7 +1439,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIADD(IADD o){ + public void visitIADD(final IADD o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1452,7 +1452,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIALOAD(IALOAD o){ + public void visitIALOAD(final IALOAD o){ indexOfInt(o, stack().peek()); if (stack().peek(1) == Type.NULL){ return; @@ -1470,7 +1470,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIAND(IAND o){ + public void visitIAND(final IAND o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1483,7 +1483,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIASTORE(IASTORE o){ + public void visitIASTORE(final IASTORE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1504,7 +1504,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitICONST(ICONST o){ + public void visitICONST(final ICONST o){ //nothing to do here. } @@ -1512,7 +1512,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIDIV(IDIV o){ + public void visitIDIV(final IDIV o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1525,7 +1525,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ACMPEQ(IF_ACMPEQ o){ + public void visitIF_ACMPEQ(final IF_ACMPEQ o){ if (!(stack().peek() instanceof ReferenceType)){ constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); } @@ -1542,7 +1542,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ACMPNE(IF_ACMPNE o){ + public void visitIF_ACMPNE(final IF_ACMPNE o){ if (!(stack().peek() instanceof ReferenceType)){ constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); @@ -1557,7 +1557,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ICMPEQ(IF_ICMPEQ o){ + public void visitIF_ICMPEQ(final IF_ICMPEQ o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1570,7 +1570,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ICMPGE(IF_ICMPGE o){ + public void visitIF_ICMPGE(final IF_ICMPGE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1583,7 +1583,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ICMPGT(IF_ICMPGT o){ + public void visitIF_ICMPGT(final IF_ICMPGT o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1596,7 +1596,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ICMPLE(IF_ICMPLE o){ + public void visitIF_ICMPLE(final IF_ICMPLE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1609,7 +1609,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ICMPLT(IF_ICMPLT o){ + public void visitIF_ICMPLT(final IF_ICMPLT o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1622,7 +1622,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ICMPNE(IF_ICMPNE o){ + public void visitIF_ICMPNE(final IF_ICMPNE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1635,7 +1635,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFEQ(IFEQ o){ + public void visitIFEQ(final IFEQ o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1645,7 +1645,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFGE(IFGE o){ + public void visitIFGE(final IFGE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1655,7 +1655,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFGT(IFGT o){ + public void visitIFGT(final IFGT o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1665,7 +1665,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFLE(IFLE o){ + public void visitIFLE(final IFLE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1675,7 +1675,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFLT(IFLT o){ + public void visitIFLT(final IFLT o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1685,7 +1685,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFNE(IFNE o){ + public void visitIFNE(final IFNE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1695,7 +1695,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFNONNULL(IFNONNULL o){ + public void visitIFNONNULL(final IFNONNULL o){ if (!(stack().peek() instanceof ReferenceType)){ constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); } @@ -1706,7 +1706,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFNULL(IFNULL o){ + public void visitIFNULL(final IFNULL o){ if (!(stack().peek() instanceof ReferenceType)){ constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); } @@ -1717,7 +1717,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIINC(IINC o){ + public void visitIINC(final IINC o){ // Mhhh. In BCEL, at this time "IINC" is not a LocalVariableInstruction. if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ constraintViolated(o, "The 'index' is not a valid index into the local variable array."); @@ -1730,7 +1730,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitILOAD(ILOAD o){ + public void visitILOAD(final ILOAD o){ // All done by visitLocalVariableInstruction(), visitLoadInstruction() } @@ -1738,7 +1738,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIMPDEP1(IMPDEP1 o){ + public void visitIMPDEP1(final IMPDEP1 o){ throw new AssertionViolatedException( "In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP1."); } @@ -1747,7 +1747,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIMPDEP2(IMPDEP2 o){ + public void visitIMPDEP2(final IMPDEP2 o){ throw new AssertionViolatedException( "In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP2."); } @@ -1756,7 +1756,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIMUL(IMUL o){ + public void visitIMUL(final IMUL o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1769,7 +1769,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitINEG(INEG o){ + public void visitINEG(final INEG o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -1779,7 +1779,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitINSTANCEOF(INSTANCEOF o){ + public void visitINSTANCEOF(final INSTANCEOF o){ // The objectref must be of type reference. Type objectref = stack().peek(0); if (!(objectref instanceof ReferenceType)){ @@ -1802,7 +1802,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * @since 6.0 */ @Override - public void visitINVOKEDYNAMIC(INVOKEDYNAMIC o){ + public void visitINVOKEDYNAMIC(final INVOKEDYNAMIC o){ throw new RuntimeException("INVOKEDYNAMIC instruction is not supported at this time"); } @@ -1810,7 +1810,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ + public void visitINVOKEINTERFACE(final INVOKEINTERFACE o){ // Method is not native, otherwise pass 3 would not happen. int count = o.getCount(); @@ -1902,7 +1902,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitINVOKESPECIAL(INVOKESPECIAL o){ + public void visitINVOKESPECIAL(final INVOKESPECIAL o){ try { // Don't init an object twice. if ( (o.getMethodName(cpg).equals(Const.CONSTRUCTOR_NAME)) && @@ -2001,7 +2001,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitINVOKESTATIC(INVOKESTATIC o){ + public void visitINVOKESTATIC(final INVOKESTATIC o){ try { // Method is not native, otherwise pass 3 would not happen. @@ -2054,7 +2054,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ + public void visitINVOKEVIRTUAL(final INVOKEVIRTUAL o){ try { // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). @@ -2133,7 +2133,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIOR(IOR o){ + public void visitIOR(final IOR o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2146,7 +2146,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIREM(IREM o){ + public void visitIREM(final IREM o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2159,7 +2159,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIRETURN(IRETURN o){ + public void visitIRETURN(final IRETURN o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2169,7 +2169,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitISHL(ISHL o){ + public void visitISHL(final ISHL o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2182,7 +2182,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitISHR(ISHR o){ + public void visitISHR(final ISHR o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2195,7 +2195,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitISTORE(ISTORE o){ + public void visitISTORE(final ISTORE o){ //visitStoreInstruction(StoreInstruction) is called before. // Nothing else needs to be done here. @@ -2205,7 +2205,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitISUB(ISUB o){ + public void visitISUB(final ISUB o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2218,7 +2218,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIUSHR(IUSHR o){ + public void visitIUSHR(final IUSHR o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2231,7 +2231,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIXOR(IXOR o){ + public void visitIXOR(final IXOR o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2244,7 +2244,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitJSR(JSR o){ + public void visitJSR(final JSR o){ // nothing to do here. } @@ -2252,7 +2252,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitJSR_W(JSR_W o){ + public void visitJSR_W(final JSR_W o){ // nothing to do here. } @@ -2260,7 +2260,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitL2D(L2D o){ + public void visitL2D(final L2D o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2270,7 +2270,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitL2F(L2F o){ + public void visitL2F(final L2F o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2280,7 +2280,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitL2I(L2I o){ + public void visitL2I(final L2I o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2290,7 +2290,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLADD(LADD o){ + public void visitLADD(final LADD o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2303,7 +2303,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLALOAD(LALOAD o){ + public void visitLALOAD(final LALOAD o){ indexOfInt(o, stack().peek()); if (stack().peek(1) == Type.NULL){ return; @@ -2321,7 +2321,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLAND(LAND o){ + public void visitLAND(final LAND o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2334,7 +2334,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLASTORE(LASTORE o){ + public void visitLASTORE(final LASTORE o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2355,7 +2355,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLCMP(LCMP o){ + public void visitLCMP(final LCMP o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2368,7 +2368,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLCONST(LCONST o){ + public void visitLCONST(final LCONST o){ // Nothing to do here. } @@ -2376,7 +2376,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLDC(LDC o){ + public void visitLDC(final LDC o){ // visitCPInstruction is called first. Constant c = cpg.getConstant(o.getIndex()); @@ -2393,7 +2393,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLDC_W(LDC_W o){ + public void visitLDC_W(final LDC_W o){ // visitCPInstruction is called first. Constant c = cpg.getConstant(o.getIndex()); @@ -2411,7 +2411,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLDC2_W(LDC2_W o){ + public void visitLDC2_W(final LDC2_W o){ // visitCPInstruction is called first. Constant c = cpg.getConstant(o.getIndex()); @@ -2426,7 +2426,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLDIV(LDIV o){ + public void visitLDIV(final LDIV o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2439,7 +2439,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLLOAD(LLOAD o){ + public void visitLLOAD(final LLOAD o){ //visitLoadInstruction(LoadInstruction) is called before. // Nothing else needs to be done here. @@ -2449,7 +2449,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLMUL(LMUL o){ + public void visitLMUL(final LMUL o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2462,7 +2462,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLNEG(LNEG o){ + public void visitLNEG(final LNEG o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2472,7 +2472,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ + public void visitLOOKUPSWITCH(final LOOKUPSWITCH o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2483,7 +2483,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLOR(LOR o){ + public void visitLOR(final LOR o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2496,7 +2496,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLREM(LREM o){ + public void visitLREM(final LREM o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2509,7 +2509,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLRETURN(LRETURN o){ + public void visitLRETURN(final LRETURN o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2519,7 +2519,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLSHL(LSHL o){ + public void visitLSHL(final LSHL o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2532,7 +2532,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLSHR(LSHR o){ + public void visitLSHR(final LSHR o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2545,7 +2545,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLSTORE(LSTORE o){ + public void visitLSTORE(final LSTORE o){ //visitStoreInstruction(StoreInstruction) is called before. // Nothing else needs to be done here. @@ -2555,7 +2555,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLSUB(LSUB o){ + public void visitLSUB(final LSUB o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2568,7 +2568,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLUSHR(LUSHR o){ + public void visitLUSHR(final LUSHR o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2581,7 +2581,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLXOR(LXOR o){ + public void visitLXOR(final LXOR o){ if (stack().peek() != Type.LONG){ constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } @@ -2594,7 +2594,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitMONITORENTER(MONITORENTER o){ + public void visitMONITORENTER(final MONITORENTER o){ if (! ((stack().peek()) instanceof ReferenceType)){ constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); } @@ -2605,7 +2605,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitMONITOREXIT(MONITOREXIT o){ + public void visitMONITOREXIT(final MONITOREXIT o){ if (! ((stack().peek()) instanceof ReferenceType)){ constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); } @@ -2616,7 +2616,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitMULTIANEWARRAY(MULTIANEWARRAY o){ + public void visitMULTIANEWARRAY(final MULTIANEWARRAY o){ int dimensions = o.getDimensions(); // Dimensions argument is okay: see Pass 3a. for (int i=0; i method if ((Frame.getThis() != null) && (!(mg.getClassName().equals(Type.OBJECT.getClassName()))) ) { constraintViolated(o, "Leaving a constructor that itself did not call a constructor."); @@ -2892,7 +2892,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitSALOAD(SALOAD o){ + public void visitSALOAD(final SALOAD o){ indexOfInt(o, stack().peek()); if (stack().peek(1) == Type.NULL){ return; @@ -2910,7 +2910,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitSASTORE(SASTORE o){ + public void visitSASTORE(final SASTORE o){ if (stack().peek() != Type.INT){ constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } @@ -2931,7 +2931,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitSIPUSH(SIPUSH o){ + public void visitSIPUSH(final SIPUSH o){ // nothing to do here. Generic visitXXX() methods did the trick before. } @@ -2939,7 +2939,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitSWAP(SWAP o){ + public void visitSWAP(final SWAP o){ if (stack().peek().getSize() != 1){ constraintViolated(o, "The value at the stack top is not of size '1', but of size '"+stack().peek().getSize()+"'."); } @@ -2953,7 +2953,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitTABLESWITCH(TABLESWITCH o){ + public void visitTABLESWITCH(final TABLESWITCH o){ indexOfInt(o, stack().peek()); // See Pass 3a. } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java index 98a5b123..ecafd393 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java @@ -36,7 +36,7 @@ public class LocalVariables implements Cloneable { /** * Creates a new LocalVariables object. */ - public LocalVariables(int maxLocals){ + public LocalVariables(final int maxLocals){ locals = new Type[maxLocals]; for (int i=0; i ics = new Vector<>(); private final List> ecs = new Vector<>(); - public void add(InstructionContext ic, ArrayList executionChain){ + public void add(final InstructionContext ic, final ArrayList executionChain){ ics.add(ic); ecs.add(executionChain); } public boolean isEmpty(){ return ics.isEmpty(); } - public void remove(int i){ + public void remove(final int i){ ics.remove(i); ecs.remove(i); } - public InstructionContext getIC(int i){ + public InstructionContext getIC(final int i){ return ics.get(i); } - public ArrayList getEC(int i){ + public ArrayList getEC(final int i){ return ecs.get(i); } public int size(){ @@ -114,7 +114,7 @@ public final class Pass3bVerifier extends PassVerifier{ * * @see org.apache.commons.bcel6.verifier.Verifier */ - public Pass3bVerifier(Verifier owner, int method_no){ + public Pass3bVerifier(final Verifier owner, final int method_no){ myOwner = owner; this.method_no = method_no; } @@ -126,8 +126,8 @@ public final class Pass3bVerifier extends PassVerifier{ * The proof of termination is about the existence of a * fix point of frame merging. */ - private void circulationPump(MethodGen m,ControlFlowGraph cfg, InstructionContext start, - Frame vanillaFrame, InstConstraintVisitor icv, ExecutionVisitor ev){ + private void circulationPump(final MethodGen m,final ControlFlowGraph cfg, final InstructionContext start, + final Frame vanillaFrame, final InstConstraintVisitor icv, final ExecutionVisitor ev){ final Random random = new Random(); InstructionContextQueue icq = new InstructionContextQueue(); @@ -294,7 +294,7 @@ public final class Pass3bVerifier extends PassVerifier{ * @throws StructuralCodeConstraintException always * @since 6.0 */ - public void invalidReturnTypeError(Type returnedType, MethodGen m){ + public void invalidReturnTypeError(final Type returnedType, final MethodGen m){ throw new StructuralCodeConstraintException( "Returned type "+returnedType+" does not match Method's return type "+m.getReturnType()); } diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java index 272d90f3..8ee6382f 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java @@ -91,7 +91,7 @@ public class Subroutines{ * Refer to the Subroutine interface for documentation. */ @Override - public boolean contains(InstructionHandle inst){ + public boolean contains(final InstructionHandle inst){ return instructions.contains(inst); } @@ -182,7 +182,7 @@ public class Subroutines{ /** * Adds a new JSR or JSR_W that has this subroutine as its target. */ - public void addEnteringJsrInstruction(InstructionHandle jsrInst){ + public void addEnteringJsrInstruction(final InstructionHandle jsrInst){ if ( (jsrInst == null) || (! (jsrInst.getInstruction() instanceof JsrInstruction))){ throw new AssertionViolatedException("Expecting JsrInstruction InstructionHandle."); } @@ -223,7 +223,7 @@ public class Subroutines{ * All instructions must have been added before invoking setLeavingRET(). * @see #setLeavingRET */ - void addInstruction(InstructionHandle ih){ + void addInstruction(final InstructionHandle ih){ if (theRET != null){ throw new AssertionViolatedException("All instructions must have been added before invoking setLeavingRET()."); } @@ -252,7 +252,7 @@ public class Subroutines{ * A recursive helper method for getRecursivelyAccessedLocalsIndices(). * @see #getRecursivelyAccessedLocalsIndices() */ - private void _getRecursivelyAccessedLocalsIndicesHelper(Set s, Subroutine[] subs){ + private void _getRecursivelyAccessedLocalsIndicesHelper(final Set s, final Subroutine[] subs){ for (Subroutine sub : subs) { int[] lvs = sub.getAccessedLocalsIndices(); for (int lv : lvs) { @@ -334,7 +334,7 @@ public class Subroutines{ * This subroutine's RET operates on that same local variable * slot, of course. */ - void setLocalVariable(int i){ + void setLocalVariable(final int i){ if (localVariable != UNSET){ throw new AssertionViolatedException("localVariable set twice."); } @@ -379,7 +379,7 @@ public class Subroutines{ * create the Subroutine objects of. * Assumes that JustIce strict checks are needed. */ - public Subroutines(MethodGen mg){ + public Subroutines(final MethodGen mg){ this(mg, true); } @@ -390,7 +390,7 @@ public class Subroutines{ * @param enableJustIceCheck whether to enable additional JustIce checks * @since 6.0 */ - public Subroutines(MethodGen mg, boolean enableJustIceCheck){ + public Subroutines(final MethodGen mg, final boolean enableJustIceCheck){ InstructionHandle[] all = mg.getInstructionList().getInstructionHandles(); CodeExceptionGen[] handlers = mg.getExceptionHandlers(); @@ -535,7 +535,7 @@ public class Subroutines{ * * @throws StructuralCodeConstraintException if the above constraint is not satisfied. */ - private void noRecursiveCalls(Subroutine sub, Set set){ + private void noRecursiveCalls(final Subroutine sub, final Set set){ Subroutine[] subs = sub.subSubs(); for (Subroutine sub2 : subs) { @@ -564,7 +564,7 @@ public class Subroutines{ * * @see #getTopLevel() */ - public Subroutine getSubroutine(InstructionHandle leader){ + public Subroutine getSubroutine(final InstructionHandle leader){ Subroutine ret = subroutines.get(leader); if (ret == null){ @@ -590,7 +590,7 @@ public class Subroutines{ * @see #getSubroutine(InstructionHandle) * @see #getTopLevel() */ - public Subroutine subroutineOf(InstructionHandle any){ + public Subroutine subroutineOf(final InstructionHandle any){ for (Subroutine s : subroutines.values()) { if (s.contains(any)) { return s; @@ -620,7 +620,7 @@ System.err.println("DEBUG: Please verify '"+any.toString(true)+"' lies in dead c * as defined here. A JsrInstruction has its physical successor as its successor * (opposed to its target) as defined here. */ - private static InstructionHandle[] getSuccessors(InstructionHandle instruction){ + private static InstructionHandle[] getSuccessors(final InstructionHandle instruction){ final InstructionHandle[] empty = new InstructionHandle[0]; final InstructionHandle[] single = new InstructionHandle[1]; diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java index 91cfe48c..2ed3f762 100644 --- a/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java @@ -35,7 +35,7 @@ public class UninitializedObjectType extends ReferenceType{ private final ObjectType initialized; /** Creates a new instance. */ - public UninitializedObjectType(ObjectType t){ + public UninitializedObjectType(final ObjectType t){ super(Const.T_UNKNOWN, ""); initialized = t; } @@ -60,7 +60,7 @@ public class UninitializedObjectType extends ReferenceType{ * */ @Override - public boolean equals(Object o){ + public boolean equals(final Object o){ if (! (o instanceof UninitializedObjectType)) { return false; } diff --git a/src/test/java/org/apache/commons/bcel6/AbstractCounterVisitorTestCase.java b/src/test/java/org/apache/commons/bcel6/AbstractCounterVisitorTestCase.java index 5459ae7a..a8f8625b 100644 --- a/src/test/java/org/apache/commons/bcel6/AbstractCounterVisitorTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AbstractCounterVisitorTestCase.java @@ -43,7 +43,7 @@ public abstract class AbstractCounterVisitorTestCase extends AbstractTestCase return visitor; } - public void setVisitor(CounterVisitor visitor) + public void setVisitor(final CounterVisitor visitor) { this.visitor = visitor; } diff --git a/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java b/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java index 8eeb137c..dbb80256 100644 --- a/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java @@ -53,17 +53,17 @@ public abstract class AbstractTestCase extends TestCase * @param name * @return Path to file under the TESTDATA directory */ - protected File createTestdataFile(String name) + protected File createTestdataFile(final String name) { return new File(TESTDATA, name); } - protected JavaClass getTestClass(String name) throws ClassNotFoundException + protected JavaClass getTestClass(final String name) throws ClassNotFoundException { return SyntheticRepository.getInstance().loadClass(name); } - protected Method getMethod(JavaClass cl, String methodname) + protected Method getMethod(final JavaClass cl, final String methodname) { Method[] methods = cl.getMethods(); for (Method m : methods) { @@ -80,7 +80,7 @@ public abstract class AbstractTestCase extends TestCase * @param name * @return */ - protected boolean wipe(String name) + protected boolean wipe(final String name) { return new File(TESTDATA, name).delete(); } @@ -91,7 +91,7 @@ public abstract class AbstractTestCase extends TestCase * @param name * @return true if the file was deleted */ - protected boolean wipe(String dir, String name) + protected boolean wipe(final String dir, final String name) { // The parameter is relative to the TESTDATA dir boolean b = wipe(dir + File.separator + name); @@ -108,14 +108,14 @@ public abstract class AbstractTestCase extends TestCase return b; } - public SyntheticRepository createRepos(String cpentry) + public SyntheticRepository createRepos(final String cpentry) { ClassPath cp = new ClassPath("target" + File.separator + "testdata" + File.separator + cpentry + File.separator); return SyntheticRepository.getInstance(cp); } - protected Attribute[] findAttribute(String name, JavaClass clazz) + protected Attribute[] findAttribute(final String name, final JavaClass clazz) { Attribute[] all = clazz.getAttributes(); List chosenAttrsList = new ArrayList<>(); @@ -130,7 +130,7 @@ public abstract class AbstractTestCase extends TestCase return chosenAttrsList.toArray(new Attribute[] {}); } - protected Attribute findAttribute(String name, Attribute[] all) + protected Attribute findAttribute(final String name, final Attribute[] all) { List chosenAttrsList = new ArrayList<>(); for (Attribute element : all) { @@ -146,7 +146,7 @@ public abstract class AbstractTestCase extends TestCase return chosenAttrsList.get(0); } - protected String dumpAttributes(Attribute[] as) + protected String dumpAttributes(final Attribute[] as) { StringBuilder result = new StringBuilder(); result.append("AttributeArray:["); @@ -162,7 +162,7 @@ public abstract class AbstractTestCase extends TestCase return result.toString(); } - protected String dumpAnnotationEntries(AnnotationEntry[] as) + protected String dumpAnnotationEntries(final AnnotationEntry[] as) { StringBuilder result = new StringBuilder(); result.append("["); @@ -178,7 +178,7 @@ public abstract class AbstractTestCase extends TestCase return result.toString(); } - protected String dumpAnnotationEntries(AnnotationEntryGen[] as) + protected String dumpAnnotationEntries(final AnnotationEntryGen[] as) { StringBuilder result = new StringBuilder(); result.append("["); @@ -194,8 +194,8 @@ public abstract class AbstractTestCase extends TestCase return result.toString(); } - public AnnotationEntryGen createFruitAnnotationEntry(ConstantPoolGen cp, - String aFruit, boolean visibility) + public AnnotationEntryGen createFruitAnnotationEntry(final ConstantPoolGen cp, + final String aFruit, final boolean visibility) { SimpleElementValueGen evg = new SimpleElementValueGen( ElementValueGen.STRING, cp, aFruit); diff --git a/src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java b/src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java index f8278d24..1e8db56d 100644 --- a/src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.generic.SimpleElementValueGen; public class ElementValueGenTestCase extends AbstractTestCase { - private ClassGen createClassGen(String classname) + private ClassGen createClassGen(final String classname) { return new ClassGen(classname, "java.lang.Object", "", Const.ACC_PUBLIC | Const.ACC_SUPER, null); @@ -209,7 +209,7 @@ public class ElementValueGenTestCase extends AbstractTestCase checkSerialize(evg, cp); } - private void checkSerialize(ElementValueGen evgBefore, ConstantPoolGen cpg) + private void checkSerialize(final ElementValueGen evgBefore, final ConstantPoolGen cpg) { try { diff --git a/src/test/java/org/apache/commons/bcel6/NanoTimer.java b/src/test/java/org/apache/commons/bcel6/NanoTimer.java index e8a87503..83f4edea 100644 --- a/src/test/java/org/apache/commons/bcel6/NanoTimer.java +++ b/src/test/java/org/apache/commons/bcel6/NanoTimer.java @@ -31,7 +31,7 @@ public class NanoTimer { time += System.nanoTime(); } - public void subtract(NanoTimer o) { + public void subtract(final NanoTimer o) { time -= o.time; } diff --git a/src/test/java/org/apache/commons/bcel6/PerformanceTest.java b/src/test/java/org/apache/commons/bcel6/PerformanceTest.java index 71865136..ea99266c 100644 --- a/src/test/java/org/apache/commons/bcel6/PerformanceTest.java +++ b/src/test/java/org/apache/commons/bcel6/PerformanceTest.java @@ -66,7 +66,7 @@ public final class PerformanceTest extends TestCase { } } - private static void test(File lib) throws IOException { + private static void test(final File lib) throws IOException { NanoTimer total = new NanoTimer(); NanoTimer parseTime = new NanoTimer(); NanoTimer cgenTime = new NanoTimer(); @@ -136,7 +136,7 @@ public final class PerformanceTest extends TestCase { javaLib.listFiles(new FileFilter() { @Override - public boolean accept(File file) { + public boolean accept(final File file) { if(file.getName().endsWith(".jar")) { try { test(file); diff --git a/src/test/java/org/apache/commons/bcel6/classfile/JDKClassDumpTestCase.java b/src/test/java/org/apache/commons/bcel6/classfile/JDKClassDumpTestCase.java index 62707124..277b4bd9 100644 --- a/src/test/java/org/apache/commons/bcel6/classfile/JDKClassDumpTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/classfile/JDKClassDumpTestCase.java @@ -43,7 +43,7 @@ public class JDKClassDumpTestCase { javaLib.listFiles(new FileFilter() { @Override - public boolean accept(File file) { + public boolean accept(final File file) { if(file.getName().endsWith(".jar")) { try { testJar(file); @@ -57,7 +57,7 @@ public class JDKClassDumpTestCase { } - private void testJar(File file) throws Exception { + private void testJar(final File file) throws Exception { System.out.println("parsing " + file); JarFile jar = new JarFile(file); Enumeration en = jar.entries(); @@ -76,7 +76,7 @@ public class JDKClassDumpTestCase { jar.close(); } - private void compare(JavaClass jc, InputStream inputStream, String name) throws Exception { + private void compare(final JavaClass jc, final InputStream inputStream, final String name) throws Exception { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); jc.dump(dos); diff --git a/src/test/java/org/apache/commons/bcel6/data/AnnotatedWithCombinedAnnotation.java b/src/test/java/org/apache/commons/bcel6/data/AnnotatedWithCombinedAnnotation.java index d2e2d885..e514ad0b 100644 --- a/src/test/java/org/apache/commons/bcel6/data/AnnotatedWithCombinedAnnotation.java +++ b/src/test/java/org/apache/commons/bcel6/data/AnnotatedWithCombinedAnnotation.java @@ -21,7 +21,7 @@ package org.apache.commons.bcel6.data; @CombinedAnnotation( { @SimpleAnnotation(id = 4) }) public class AnnotatedWithCombinedAnnotation { - public AnnotatedWithCombinedAnnotation(int param1, @SimpleAnnotation(id=42) int param2) { + public AnnotatedWithCombinedAnnotation(final int param1, @SimpleAnnotation(id=42) final int param2) { } @CombinedAnnotation( {}) diff --git a/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java b/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java index c34fdba9..c4ea20b2 100644 --- a/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java +++ b/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java @@ -20,7 +20,7 @@ package org.apache.commons.bcel6.data; public class AttributeTestClassEM01 { - public static void main(String[] argv) + public static void main(final String[] argv) { @SuppressWarnings("unused") class S diff --git a/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java b/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java index d2bb4def..16c85eaa 100644 --- a/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java +++ b/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java @@ -29,7 +29,7 @@ public class AttributeTestClassEM02 } }; - public static void main(String[] argv) + public static void main(final String[] argv) { } } diff --git a/src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java b/src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java index 73ca9dfb..6a1cf31d 100644 --- a/src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java +++ b/src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java @@ -22,13 +22,13 @@ import java.util.ArrayList; public class PLSETestClass { - public void meth1(int arg1) + public void meth1(final int arg1) { @SuppressWarnings("unused") int local1 = arg1; } - public void meth2(int arg1, ArrayList arg2, int arg3) + public void meth2(final int arg1, final ArrayList arg2, final int arg3) { @SuppressWarnings("unused") int local1 = arg1; diff --git a/src/test/java/org/apache/commons/bcel6/data/SimpleClass.java b/src/test/java/org/apache/commons/bcel6/data/SimpleClass.java index e7201665..9fa9ac01 100644 --- a/src/test/java/org/apache/commons/bcel6/data/SimpleClass.java +++ b/src/test/java/org/apache/commons/bcel6/data/SimpleClass.java @@ -20,7 +20,7 @@ package org.apache.commons.bcel6.data; public class SimpleClass { - public static void main(String[] argv) + public static void main(final String[] argv) { // Nothing unusual in this class } diff --git a/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java index 39a3c950..0bebb801 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java @@ -34,7 +34,7 @@ import org.apache.commons.bcel6.classfile.RuntimeVisibleAnnotations; public class AnnotationGenTestCase extends AbstractTestCase { - private ClassGen createClassGen(String classname) + private ClassGen createClassGen(final String classname) { return new ClassGen(classname, "java.lang.Object", "", Const.ACC_PUBLIC | Const.ACC_SUPER, null); @@ -118,7 +118,7 @@ public class AnnotationGenTestCase extends AbstractTestCase assertTrue("Should have seen a RuntimeInvisibleAnnotation", foundRIV); } - private void checkSerialize(AnnotationEntryGen a, ConstantPoolGen cpg) + private void checkSerialize(final AnnotationEntryGen a, final ConstantPoolGen cpg) { try { diff --git a/src/test/java/org/apache/commons/bcel6/generic/FieldAnnotationsTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/FieldAnnotationsTestCase.java index 5400fc59..306ecb2b 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/FieldAnnotationsTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/FieldAnnotationsTestCase.java @@ -113,9 +113,9 @@ public class FieldAnnotationsTestCase extends AbstractTestCase } // helper methods - public void checkAnnotatedField(JavaClass clazz, String fieldname, - String AnnotationEntryName, String AnnotationEntryElementName, - String AnnotationEntryElementValue) + public void checkAnnotatedField(final JavaClass clazz, final String fieldname, + final String AnnotationEntryName, final String AnnotationEntryElementName, + final String AnnotationEntryElementValue) { Field[] fields = clazz.getFields(); for (Field f : fields) { @@ -128,8 +128,8 @@ public class FieldAnnotationsTestCase extends AbstractTestCase } } - private void checkAnnotationEntry(AnnotationEntry a, String name, String elementname, - String elementvalue) + private void checkAnnotationEntry(final AnnotationEntry a, final String name, final String elementname, + final String elementvalue) { assertTrue("Expected AnnotationEntry to have name " + name + " but it had name " + a.getAnnotationType(), a.getAnnotationType() @@ -146,7 +146,7 @@ public class FieldAnnotationsTestCase extends AbstractTestCase } // helper methods - public void checkValue(AnnotationEntry a, String name, String tostring) + public void checkValue(final AnnotationEntry a, final String name, final String tostring) { for (int i = 0; i < a.getElementValuePairs().length; i++) { diff --git a/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java index 7bdcc52e..b63700d2 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java @@ -281,7 +281,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase } } - private void assertMethodAnnotations(Method method, int expectedNumberAnnotations, int nExpectedArrayValues) + private void assertMethodAnnotations(final Method method, final int expectedNumberAnnotations, final int nExpectedArrayValues) { String methodName= method.getName(); AnnotationEntry[] annos= method.getAnnotationEntries(); @@ -292,7 +292,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase } } - private void assertArrayElementValue(int nExpectedArrayValues, AnnotationEntry anno) + private void assertArrayElementValue(final int nExpectedArrayValues, final AnnotationEntry anno) { ElementValuePair elementValuePair = anno.getElementValuePairs()[0]; assertEquals("value", elementValuePair.getNameString()); @@ -301,7 +301,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase assertEquals(nExpectedArrayValues, eva.length); } - private void assertParameterAnnotations(Method method, int... expectedNumberOfParmeterAnnotations) + private void assertParameterAnnotations(final Method method, final int... expectedNumberOfParmeterAnnotations) { String methodName= "For "+method.getName(); ParameterAnnotationEntry[] parameterAnnotations= method.getParameterAnnotationEntries(); @@ -320,7 +320,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase } } - private void assertSimpleElementValue(AnnotationEntry anno) + private void assertSimpleElementValue(final AnnotationEntry anno) { ElementValuePair elementValuePair = anno.getElementValuePairs()[0]; assertEquals("id", elementValuePair.getNameString()); @@ -393,7 +393,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase // System.err.println(jc2.toString()); } - private void dumpClass(ClassGen cg, String fname) + private void dumpClass(final ClassGen cg, final String fname) { try { @@ -406,13 +406,13 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase } } - private void dumpClass(ClassGen cg, String dir, String fname) + private void dumpClass(final ClassGen cg, final String dir, final String fname) { dumpClass(cg, dir + File.separator + fname); } - private void buildClassContentsWithAnnotatedMethods(ClassGen cg, - ConstantPoolGen cp, InstructionList il) + private void buildClassContentsWithAnnotatedMethods(final ClassGen cg, + final ConstantPoolGen cp, final InstructionList il) { // Create method 'public static void main(String[]argv)' MethodGen mg = createMethodGen("main", il, cp); @@ -507,8 +507,8 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase cg.addEmptyConstructor(Const.ACC_PUBLIC); } - private void buildClassContents(ClassGen cg, ConstantPoolGen cp, - InstructionList il) + private void buildClassContents(final ClassGen cg, final ConstantPoolGen cp, + final InstructionList il) { // Create method 'public static void main(String[]argv)' MethodGen mg = createMethodGen("main", il, cp); @@ -601,7 +601,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase cg.addEmptyConstructor(Const.ACC_PUBLIC); } - private JavaClass getClassFrom(String where, String clazzname) + private JavaClass getClassFrom(final String where, final String clazzname) throws ClassNotFoundException { // System.out.println(where); @@ -610,14 +610,14 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase } // helper methods - private ClassGen createClassGen(String classname) + private ClassGen createClassGen(final String classname) { return new ClassGen(classname, "java.lang.Object", "", Const.ACC_PUBLIC | Const.ACC_SUPER, null); } - private MethodGen createMethodGen(String methodname, InstructionList il, - ConstantPoolGen cp) + private MethodGen createMethodGen(final String methodname, final InstructionList il, + final ConstantPoolGen cp) { return new MethodGen(Const.ACC_STATIC | Const.ACC_PUBLIC, // access // flags @@ -629,7 +629,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase il, cp); } - public AnnotationEntryGen createSimpleVisibleAnnotation(ConstantPoolGen cp) + public AnnotationEntryGen createSimpleVisibleAnnotation(final ConstantPoolGen cp) { SimpleElementValueGen evg = new SimpleElementValueGen( ElementValueGen.PRIMITIVE_INT, cp, 4); @@ -641,8 +641,8 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase return a; } - public AnnotationEntryGen createFruitAnnotation(ConstantPoolGen cp, - String aFruit) + public AnnotationEntryGen createFruitAnnotation(final ConstantPoolGen cp, + final String aFruit) { SimpleElementValueGen evg = new SimpleElementValueGen( ElementValueGen.STRING, cp, aFruit); @@ -653,7 +653,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase return new AnnotationEntryGen(t, elements, true, cp); } - public AnnotationEntryGen createCombinedAnnotation(ConstantPoolGen cp) + public AnnotationEntryGen createCombinedAnnotation(final ConstantPoolGen cp) { // Create an annotation instance AnnotationEntryGen a = createSimpleVisibleAnnotation(cp); @@ -666,7 +666,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase elements, true, cp); } - public AnnotationEntryGen createSimpleInvisibleAnnotation(ConstantPoolGen cp) + public AnnotationEntryGen createSimpleInvisibleAnnotation(final ConstantPoolGen cp) { SimpleElementValueGen evg = new SimpleElementValueGen( ElementValueGen.PRIMITIVE_INT, cp, 4); diff --git a/src/test/java/org/apache/commons/bcel6/generic/JDKGenericDumpTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/JDKGenericDumpTestCase.java index e1c18971..6314d1d8 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/JDKGenericDumpTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/JDKGenericDumpTestCase.java @@ -48,7 +48,7 @@ public class JDKGenericDumpTestCase { } } - private void testJar(File file) throws Exception { + private void testJar(final File file) throws Exception { System.out.println(file); JarFile jar = new JarFile(file); Enumeration en = jar.entries(); @@ -69,7 +69,7 @@ public class JDKGenericDumpTestCase { jar.close(); } - private void compare(String name, Method m) { + private void compare(final String name, final Method m) { // System.out.println("Method: " + m); Code c = m.getCode(); if (c==null) { @@ -95,14 +95,14 @@ public class JDKGenericDumpTestCase { File javaLib = new File(System.getProperty("java.home") + "/lib"); return javaLib.listFiles(new FileFilter() { @Override - public boolean accept(File file) { + public boolean accept(final File file) { return file.getName().endsWith(".jar"); } }); } private static final char[] hexArray = "0123456789ABCDEF".toCharArray(); - private static String bytesToHex(byte[] bytes) { + private static String bytesToHex(final byte[] bytes) { char[] hexChars = new char[bytes.length * 3]; int i=0; for ( int j = 0; j < bytes.length; j++ ) { diff --git a/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java index b4e8ec1d..d432d127 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java @@ -34,7 +34,7 @@ public class MethodGenTestCase extends TestCase { } } - private MethodGen getMethod(Class cls, String name) throws ClassNotFoundException { + private MethodGen getMethod(final Class cls, final String name) throws ClassNotFoundException { JavaClass jc = Repository.lookupClass(cls); ConstantPoolGen cp = new ConstantPoolGen(jc.getConstantPool()); for (Method method : jc.getMethods()) { diff --git a/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java b/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java index d9971728..b42b94e9 100644 --- a/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java @@ -34,7 +34,7 @@ public class BCELifierTestCase { testClassOnPath("target/test-classes/Java8Example.class"); } - private void testClassOnPath(String javaClass) throws Exception { + private void testClassOnPath(final String javaClass) throws Exception { // Get javap of the input class final String initial = exec(null, "javap", "-p", "-c", javaClass); @@ -53,7 +53,7 @@ public class BCELifierTestCase { assertEquals(initial, output); } - private String exec(File workDir, String ... args) throws Exception { + private String exec(final File workDir, final String ... args) throws Exception { // System.err.println(java.util.Arrays.toString(args)); ProcessBuilder pb = new ProcessBuilder( args ); pb.directory(workDir); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java b/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java index 992b358d..b773e8ba 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java @@ -33,7 +33,7 @@ public abstract class AbstractVerifierTestCase extends TestCase { * @param classname simple classname of the class to verify * @param message message displayed if assertion fails */ - public void assertVerifyOK(String classname, String message) { + public void assertVerifyOK(final String classname, final String message) { final String testClassname = TEST_PACKAGE + classname; assertTrue(message, doAllPasses(testClassname)); } @@ -45,7 +45,7 @@ public abstract class AbstractVerifierTestCase extends TestCase { * @param classname simple classname of the class to verify * @param message message displayed if assertion fails */ - public void assertVerifyRejected(String classname, String message) { + public void assertVerifyRejected(final String classname, final String message) { final String testClassname = TEST_PACKAGE + classname; assertFalse(message, doAllPasses(testClassname)); } @@ -56,7 +56,7 @@ public abstract class AbstractVerifierTestCase extends TestCase { * @param classname name of the class to verify * @return false if the verification fails, true otherwise */ - public boolean doAllPasses(String classname) { + public boolean doAllPasses(final String classname) { int nbMethods = 0; try { diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java index 3bed0395..e97aa1c8 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java @@ -31,13 +31,13 @@ public class TestArray01{ return a; } - public static void test2(Object o){ + public static void test2(final Object o){ } - public static void test3(Serializable o){ + public static void test3(final Serializable o){ } - public static void test4(Cloneable o){ + public static void test4(final Cloneable o){ } public static Serializable test5(){ @@ -48,7 +48,7 @@ public class TestArray01{ return new Object[1]; } - public static Object foo(String s){ + public static Object foo(final String s){ return s; } } diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java index 140855b2..5442121b 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java @@ -47,7 +47,7 @@ public class TestArrayAccess02Creator extends TestCreator { } @Override -public void create(OutputStream out) throws IOException { +public void create(final OutputStream out) throws IOException { createMethod_0(); createMethod_1(); _cg.getJavaClass().dump(out); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java index b65f18bc..d9cae0b8 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java @@ -47,7 +47,7 @@ public class TestArrayAccess03Creator extends TestCreator { } @Override -public void create(OutputStream out) throws IOException { +public void create(final OutputStream out) throws IOException { createMethod_0(); createMethod_1(); _cg.getJavaClass().dump(out); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java index 8aae305f..d4c2bf8b 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java @@ -47,7 +47,7 @@ public class TestArrayAccess04Creator extends TestCreator { } @Override -public void create(OutputStream out) throws IOException { +public void create(final OutputStream out) throws IOException { createMethod_0(); createMethod_1(); _cg.getJavaClass().dump(out); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java index aec052b5..784ab213 100755 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java @@ -19,7 +19,7 @@ package org.apache.commons.bcel6.verifier.tests; public class TestLegalInvokeInterface01{ - public static void test1(Interface01 t){ + public static void test1(final Interface01 t){ t.run(); } } diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java index 797eba0c..346f762a 100755 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java @@ -19,7 +19,7 @@ package org.apache.commons.bcel6.verifier.tests; public abstract class TestLegalInvokeSpecial02 implements Runnable{ - public static void test1(TestLegalInvokeSpecial02 t, int i){ + public static void test1(final TestLegalInvokeSpecial02 t, final int i){ if(i > 0){ t.run(); } diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java index 3b16ed03..b5a579ba 100755 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java @@ -19,7 +19,7 @@ package org.apache.commons.bcel6.verifier.tests; public abstract class TestLegalInvokeVirtual02 implements Runnable{ - public static void test1(TestLegalInvokeVirtual02 t, int i){ + public static void test1(final TestLegalInvokeVirtual02 t, final int i){ if(i > 0){ t.run(); } diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java index 8837ed43..a2764d6e 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java @@ -45,7 +45,7 @@ public class TestReturn01Creator extends TestCreator { } @Override -public void create(OutputStream out) throws IOException { +public void create(final OutputStream out) throws IOException { createMethod_0(); createMethod_1(); _cg.getJavaClass().dump(out); diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn02.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn02.java index 16057a1f..0e44e3bd 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn02.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn02.java @@ -19,7 +19,7 @@ package org.apache.commons.bcel6.verifier.tests; public class TestReturn02 { - public static String test1(char[] data, int offset, int count) { + public static String test1(final char[] data, final int offset, final int count) { return new String(data, offset, count); } diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java index cd3970fb..7e500d19 100644 --- a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java +++ b/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java @@ -45,7 +45,7 @@ public class TestReturn03Creator extends TestCreator { } @Override -public void create(OutputStream out) throws IOException { +public void create(final OutputStream out) throws IOException { createMethod_0(); createMethod_1(); _cg.getJavaClass().dump(out); diff --git a/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java b/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java index ae487ea6..cd578538 100644 --- a/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java +++ b/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java @@ -155,269 +155,269 @@ public class CounterVisitor implements Visitor @Override - public void visitAnnotation(Annotations obj) + public void visitAnnotation(final Annotations obj) { annotationCount++; } @Override - public void visitAnnotationDefault(AnnotationDefault obj) + public void visitAnnotationDefault(final AnnotationDefault obj) { annotationDefaultCount++; } @Override - public void visitAnnotationEntry(AnnotationEntry obj) + public void visitAnnotationEntry(final AnnotationEntry obj) { annotationEntryCount++; } @Override - public void visitCode(Code obj) + public void visitCode(final Code obj) { codeCount++; } @Override - public void visitCodeException(CodeException obj) + public void visitCodeException(final CodeException obj) { codeExceptionCount++; } @Override - public void visitConstantClass(ConstantClass obj) + public void visitConstantClass(final ConstantClass obj) { constantClassCount++; } @Override - public void visitConstantDouble(ConstantDouble obj) + public void visitConstantDouble(final ConstantDouble obj) { constantDoubleCount++; } @Override - public void visitConstantFieldref(ConstantFieldref obj) + public void visitConstantFieldref(final ConstantFieldref obj) { constantFieldrefCount++; } @Override - public void visitConstantFloat(ConstantFloat obj) + public void visitConstantFloat(final ConstantFloat obj) { constantFloatCount++; } @Override - public void visitConstantInteger(ConstantInteger obj) + public void visitConstantInteger(final ConstantInteger obj) { constantIntegerCount++; } @Override - public void visitConstantInterfaceMethodref(ConstantInterfaceMethodref obj) + public void visitConstantInterfaceMethodref(final ConstantInterfaceMethodref obj) { constantInterfaceMethodrefCount++; } @Override - public void visitConstantLong(ConstantLong obj) + public void visitConstantLong(final ConstantLong obj) { constantLongCount++; } @Override - public void visitConstantMethodref(ConstantMethodref obj) + public void visitConstantMethodref(final ConstantMethodref obj) { constantMethodrefCount++; } @Override - public void visitConstantNameAndType(ConstantNameAndType obj) + public void visitConstantNameAndType(final ConstantNameAndType obj) { constantNameAndTypeCount++; } @Override - public void visitConstantPool(ConstantPool obj) + public void visitConstantPool(final ConstantPool obj) { constantPoolCount++; } @Override - public void visitConstantString(ConstantString obj) + public void visitConstantString(final ConstantString obj) { constantStringCount++; } @Override - public void visitConstantUtf8(ConstantUtf8 obj) + public void visitConstantUtf8(final ConstantUtf8 obj) { constantUtf8Count++; } @Override - public void visitConstantValue(ConstantValue obj) + public void visitConstantValue(final ConstantValue obj) { constantValueCount++; } @Override - public void visitDeprecated(Deprecated obj) + public void visitDeprecated(final Deprecated obj) { deprecatedCount++; } @Override - public void visitEnclosingMethod(EnclosingMethod obj) + public void visitEnclosingMethod(final EnclosingMethod obj) { enclosingMethodCount++; } @Override - public void visitExceptionTable(ExceptionTable obj) + public void visitExceptionTable(final ExceptionTable obj) { exceptionTableCount++; } @Override - public void visitField(Field obj) + public void visitField(final Field obj) { fieldCount++; } @Override - public void visitInnerClass(InnerClass obj) + public void visitInnerClass(final InnerClass obj) { innerClassCount++; } @Override - public void visitInnerClasses(InnerClasses obj) + public void visitInnerClasses(final InnerClasses obj) { innerClassesCount++; } @Override - public void visitJavaClass(JavaClass obj) + public void visitJavaClass(final JavaClass obj) { javaClassCount++; } @Override - public void visitLineNumber(LineNumber obj) + public void visitLineNumber(final LineNumber obj) { lineNumberCount++; } @Override - public void visitLineNumberTable(LineNumberTable obj) + public void visitLineNumberTable(final LineNumberTable obj) { lineNumberTableCount++; } @Override - public void visitLocalVariable(LocalVariable obj) + public void visitLocalVariable(final LocalVariable obj) { localVariableCount++; } @Override - public void visitLocalVariableTable(LocalVariableTable obj) + public void visitLocalVariableTable(final LocalVariableTable obj) { localVariableTableCount++; } @Override - public void visitLocalVariableTypeTable(LocalVariableTypeTable obj) + public void visitLocalVariableTypeTable(final LocalVariableTypeTable obj) { localVariableTypeTableCount++; } @Override - public void visitMethod(Method obj) + public void visitMethod(final Method obj) { methodCount++; } @Override - public void visitParameterAnnotation(ParameterAnnotations obj) + public void visitParameterAnnotation(final ParameterAnnotations obj) { parameterAnnotationCount++; } @Override - public void visitSignature(Signature obj) + public void visitSignature(final Signature obj) { signatureAnnotationCount++; } @Override - public void visitSourceFile(SourceFile obj) + public void visitSourceFile(final SourceFile obj) { sourceFileCount++; } @Override - public void visitStackMap(StackMap obj) + public void visitStackMap(final StackMap obj) { stackMapCount++; } @Override - public void visitStackMapEntry(StackMapEntry obj) + public void visitStackMapEntry(final StackMapEntry obj) { stackMapEntryCount++; } @Override - public void visitSynthetic(Synthetic obj) + public void visitSynthetic(final Synthetic obj) { syntheticCount++; } @Override - public void visitUnknown(Unknown obj) + public void visitUnknown(final Unknown obj) { unknownCount++; } /** @since 6.0 */ @Override - public void visitBootstrapMethods(BootstrapMethods obj) + public void visitBootstrapMethods(final BootstrapMethods obj) { bootstrapMethodsCount++; } /** @since 6.0 */ @Override - public void visitMethodParameters(MethodParameters obj) + public void visitMethodParameters(final MethodParameters obj) { methodParametersCount++; } /** @since 6.0 */ @Override - public void visitConstantInvokeDynamic(ConstantInvokeDynamic obj) + public void visitConstantInvokeDynamic(final ConstantInvokeDynamic obj) { constantInvokeDynamic++; } /** @since 6.0 */ @Override - public void visitConstantMethodType(ConstantMethodType obj) { + public void visitConstantMethodType(final ConstantMethodType obj) { // TODO Auto-generated method stub } /** @since 6.0 */ @Override - public void visitConstantMethodHandle(ConstantMethodHandle constantMethodHandle) { + public void visitConstantMethodHandle(final ConstantMethodHandle constantMethodHandle) { // TODO Auto-generated method stub } /** @since 6.0 */ @Override - public void visitParameterAnnotationEntry(ParameterAnnotationEntry parameterAnnotationEntry) { + public void visitParameterAnnotationEntry(final ParameterAnnotationEntry parameterAnnotationEntry) { // TODO Auto-generated method stub } } -- GitLab From 53539c20c2b4e15c8994924ad5de4a42322f4ee7 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Wed, 1 Jun 2016 04:26:33 +0000 Subject: [PATCH 1106/1313] maven-pmd-plugin 3.3 -> 3.6. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746379 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1c9b5e65..bf1568bd 100644 --- a/pom.xml +++ b/pom.xml @@ -303,7 +303,7 @@ org.apache.maven.plugins maven-pmd-plugin - 3.3 + 3.6 ${maven.compiler.target} true -- GitLab From 32e60029f0aaec95ce9c3d79bb1e33b30a8ac5c2 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Wed, 1 Jun 2016 04:27:18 +0000 Subject: [PATCH 1107/1313] checkstyle.plugin.version 2.16 -> 2.17. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746380 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bf1568bd..6b5a8eb6 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ BCEL 12314220 3.0.3 - 2.16 + 2.17 -- GitLab From 81d88e666fd9bdd3424b526be46626704e0b9c7c Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Wed, 1 Jun 2016 04:33:06 +0000 Subject: [PATCH 1108/1313] Convert for loops to enhanced for loops. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746381 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/commons/bcel6/classfile/StackMap.java | 4 ++-- .../commons/bcel6/classfile/StackMapEntry.java | 12 ++++++------ .../bcel6/generic/JDKGenericDumpTestCase.java | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java index ced09c7d..0e4ad83a 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java @@ -103,8 +103,8 @@ public final class StackMap extends Attribute { public final void setStackMap( final StackMapEntry[] map ) { this.map = map; int len = 2; // Length of 'number_of_entries' field prior to the array of stack maps - for (int i = 0; i < map.length; i++) { - len += map[i].getMapEntrySize(); + for (StackMapEntry element : map) { + len += element.getMapEntrySize(); } setLength(len); } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java index f7d1efa0..930791ce 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java @@ -242,17 +242,17 @@ public final class StackMapEntry implements Node, Cloneable return 3; } else if (frame_type >= Const.APPEND_FRAME && frame_type <= Const.APPEND_FRAME_MAX) { int len = 3; - for (int i = 0; i < types_of_locals.length; i++) { - len += types_of_locals[i].hasIndex() ? 3 : 1; + for (StackMapType types_of_local : types_of_locals) { + len += types_of_local.hasIndex() ? 3 : 1; } return len; } else if (frame_type == Const.FULL_FRAME) { int len = 7; - for (int i = 0; i < types_of_locals.length; i++) { - len += types_of_locals[i].hasIndex() ? 3 : 1; + for (StackMapType types_of_local : types_of_locals) { + len += types_of_local.hasIndex() ? 3 : 1; } - for (int i = 0; i < types_of_stack_items.length; i++) { - len += types_of_stack_items[i].hasIndex() ? 3 : 1; + for (StackMapType types_of_stack_item : types_of_stack_items) { + len += types_of_stack_item.hasIndex() ? 3 : 1; } return len; } else { diff --git a/src/test/java/org/apache/commons/bcel6/generic/JDKGenericDumpTestCase.java b/src/test/java/org/apache/commons/bcel6/generic/JDKGenericDumpTestCase.java index 6314d1d8..34e1caf2 100644 --- a/src/test/java/org/apache/commons/bcel6/generic/JDKGenericDumpTestCase.java +++ b/src/test/java/org/apache/commons/bcel6/generic/JDKGenericDumpTestCase.java @@ -105,8 +105,8 @@ public class JDKGenericDumpTestCase { private static String bytesToHex(final byte[] bytes) { char[] hexChars = new char[bytes.length * 3]; int i=0; - for ( int j = 0; j < bytes.length; j++ ) { - int v = bytes[j] & 0xFF; + for (byte b : bytes) { + int v = b & 0xFF; hexChars[i++] = hexArray[v >>> 4]; hexChars[i++] = hexArray[v & 0x0F]; hexChars[i++] = ' '; -- GitLab From 4904788fde58204d5570dbf2268d8580a5d8d4cf Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Wed, 1 Jun 2016 04:33:43 +0000 Subject: [PATCH 1109/1313] Add missing '@Override' annotations. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746382 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/AnnotationEntry.java | 1 + .../java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java index 9596060c..a10c96e4 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java @@ -149,6 +149,7 @@ public class AnnotationEntry implements Node { return result.toString(); } + @Override public String toString() { return toShortString(); } diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java index 1ecb0085..f57de819 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java @@ -121,6 +121,7 @@ public class INVOKEDYNAMIC extends InvokeInstruction { /** * Override the parent method because our classname is held elsewhere. */ + @Override public String getClassName( final ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); ConstantInvokeDynamic cid = (ConstantInvokeDynamic) cp.getConstant(super.getIndex(), Const.CONSTANT_InvokeDynamic); -- GitLab From cc50f64aa8598728365f282056035cfc094e7bbd Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Wed, 1 Jun 2016 04:46:44 +0000 Subject: [PATCH 1110/1313] [BCEL-271] FCONST pattern does not include FCONST_2. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746383 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + .../java/org/apache/commons/bcel6/util/InstructionFinder.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index fb8d531e..b36c7e35 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + FCONST pattern does not include FCONST_2 Add missing Node.accept() implementations (ConstantMethodHandle, ConstantMethodType, ParameterAnnotationEntry) BCELifier is not working for Java8Example (incomplete) addition of hashCode() to generic/Instruction.java breaks Targeters. Never make distinct BranchInstructions compare equal diff --git a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java index 03df2e63..4fb9b92f 100644 --- a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java +++ b/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java @@ -346,7 +346,7 @@ public class InstructionFinder { map.put("iconst", precompile(Const.ICONST_0, Const.ICONST_5, Const.ICONST_M1)); map.put("lconst", new String(new char[] { '(', makeChar(Const.LCONST_0), '|', makeChar(Const.LCONST_1), ')' })); map.put("dconst", new String(new char[] { '(', makeChar(Const.DCONST_0), '|', makeChar(Const.DCONST_1), ')' })); - map.put("fconst", new String(new char[] { '(', makeChar(Const.FCONST_0), '|', makeChar(Const.FCONST_1), ')' })); + map.put("fconst", new String(new char[] { '(', makeChar(Const.FCONST_0), '|', makeChar(Const.FCONST_1), '|', makeChar(Const.FCONST_2), ')' })); map.put("lload", precompile(Const.LLOAD_0, Const.LLOAD_3, Const.LLOAD)); map.put("iload", precompile(Const.ILOAD_0, Const.ILOAD_3, Const.ILOAD)); map.put("dload", precompile(Const.DLOAD_0, Const.DLOAD_3, Const.DLOAD)); -- GitLab From b433eef1c1ae41112791584346558600d134f7a3 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Wed, 1 Jun 2016 05:01:33 +0000 Subject: [PATCH 1111/1313] [BCEL-272] Add constants for Java 9 class file version 53. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746384 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/Const.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/org/apache/commons/bcel6/Const.java b/src/main/java/org/apache/commons/bcel6/Const.java index fb611dd2..05a7258a 100644 --- a/src/main/java/org/apache/commons/bcel6/Const.java +++ b/src/main/java/org/apache/commons/bcel6/Const.java @@ -111,11 +111,21 @@ public final class Const { * */ public static final short MAJOR_1_8 = 52; + /** Major version number of class files for Java 1.9. + * @see #MINOR_1_9 + * */ + public static final short MAJOR_1_9 = 53; + /** Minor version number of class files for Java 1.8. * @see #MAJOR_1_8 * */ public static final short MINOR_1_8 = 0; + /** Minor version number of class files for Java 1.9. + * @see #MAJOR_1_9 + * */ + public static final short MINOR_1_9 = 0; + /** Default major version number. Class file is for Java 1.1. * @see #MAJOR_1_1 * */ -- GitLab From 914c9ccf4872aa70fb5ce3748a661768d345c81a Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Wed, 1 Jun 2016 05:11:44 +0000 Subject: [PATCH 1112/1313] Clean up formating. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746385 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/Const.java | 250 +++++++++++++++++- 1 file changed, 248 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/Const.java b/src/main/java/org/apache/commons/bcel6/Const.java index 05a7258a..8a774239 100644 --- a/src/main/java/org/apache/commons/bcel6/Const.java +++ b/src/main/java/org/apache/commons/bcel6/Const.java @@ -396,7 +396,6 @@ public final class Const { return Collections.unmodifiableList(Arrays.asList(INTERFACES_IMPLEMENTED_BY_ARRAYS)); } - /** * Maximum Constant Pool entries. * One of the limitations of the Java Virtual Machine. @@ -444,816 +443,1019 @@ public final class Const { /** Java VM opcode. * @see - * Opcode definitions in The Java Virtual Machine Specification */ + * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_M1 = 2; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_0 = 3; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_1 = 4; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_2 = 5; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_3 = 6; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_4 = 7; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ICONST_5 = 8; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LCONST_0 = 9; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LCONST_1 = 10; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_0 = 11; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_1 = 12; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FCONST_2 = 13; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DCONST_0 = 14; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DCONST_1 = 15; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short BIPUSH = 16; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short SIPUSH = 17; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC = 18; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC_W = 19; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LDC2_W = 20; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD = 21; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD = 22; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD = 23; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD = 24; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD = 25; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_0 = 26; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_1 = 27; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_2 = 28; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ILOAD_3 = 29; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_0 = 30; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_1 = 31; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_2 = 32; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LLOAD_3 = 33; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_0 = 34; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_1 = 35; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_2 = 36; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FLOAD_3 = 37; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_0 = 38; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_1 = 39; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_2 = 40; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DLOAD_3 = 41; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_0 = 42; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_1 = 43; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_2 = 44; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ALOAD_3 = 45; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IALOAD = 46; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LALOAD = 47; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FALOAD = 48; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DALOAD = 49; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short AALOAD = 50; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short BALOAD = 51; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short CALOAD = 52; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short SALOAD = 53; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE = 54; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE = 55; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE = 56; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE = 57; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE = 58; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_0 = 59; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_1 = 60; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_2 = 61; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISTORE_3 = 62; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_0 = 63; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_1 = 64; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_2 = 65; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSTORE_3 = 66; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_0 = 67; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_1 = 68; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_2 = 69; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FSTORE_3 = 70; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_0 = 71; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_1 = 72; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_2 = 73; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DSTORE_3 = 74; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_0 = 75; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_1 = 76; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_2 = 77; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ASTORE_3 = 78; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IASTORE = 79; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LASTORE = 80; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FASTORE = 81; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DASTORE = 82; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short AASTORE = 83; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short BASTORE = 84; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short CASTORE = 85; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short SASTORE = 86; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short POP = 87; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short POP2 = 88; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP = 89; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP_X1 = 90; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP_X2 = 91; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2 = 92; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2_X1 = 93; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DUP2_X2 = 94; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short SWAP = 95; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IADD = 96; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LADD = 97; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FADD = 98; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DADD = 99; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISUB = 100; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSUB = 101; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FSUB = 102; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DSUB = 103; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IMUL = 104; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LMUL = 105; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FMUL = 106; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DMUL = 107; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IDIV = 108; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LDIV = 109; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FDIV = 110; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DDIV = 111; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IREM = 112; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LREM = 113; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FREM = 114; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DREM = 115; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INEG = 116; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LNEG = 117; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FNEG = 118; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DNEG = 119; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISHL = 120; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSHL = 121; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ISHR = 122; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LSHR = 123; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IUSHR = 124; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LUSHR = 125; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IAND = 126; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LAND = 127; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IOR = 128; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LOR = 129; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IXOR = 130; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LXOR = 131; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IINC = 132; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short I2L = 133; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short I2F = 134; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short I2D = 135; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short L2I = 136; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short L2F = 137; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short L2D = 138; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short F2I = 139; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short F2L = 140; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short F2D = 141; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short D2I = 142; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short D2L = 143; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short D2F = 144; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short I2B = 145; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INT2BYTE = 145; // Old notation + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short I2C = 146; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INT2CHAR = 146; // Old notation + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short I2S = 147; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INT2SHORT = 147; // Old notation + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LCMP = 148; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FCMPL = 149; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FCMPG = 150; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DCMPL = 151; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DCMPG = 152; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFEQ = 153; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNE = 154; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFLT = 155; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFGE = 156; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFGT = 157; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFLE = 158; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPEQ = 159; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPNE = 160; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPLT = 161; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPGE = 162; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPGT = 163; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ICMPLE = 164; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ACMPEQ = 165; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IF_ACMPNE = 166; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short GOTO = 167; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short JSR = 168; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short RET = 169; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short TABLESWITCH = 170; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LOOKUPSWITCH = 171; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IRETURN = 172; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short LRETURN = 173; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short FRETURN = 174; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short DRETURN = 175; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ARETURN = 176; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short RETURN = 177; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short GETSTATIC = 178; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short PUTSTATIC = 179; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short GETFIELD = 180; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short PUTFIELD = 181; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEVIRTUAL = 182; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKESPECIAL = 183; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKENONVIRTUAL = 183; // Old name in JDK 1.0 + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKESTATIC = 184; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEINTERFACE = 185; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INVOKEDYNAMIC = 186; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short NEW = 187; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short NEWARRAY = 188; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ANEWARRAY = 189; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ARRAYLENGTH = 190; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short ATHROW = 191; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short CHECKCAST = 192; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short INSTANCEOF = 193; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short MONITORENTER = 194; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short MONITOREXIT = 195; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short WIDE = 196; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short MULTIANEWARRAY = 197; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNULL = 198; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short IFNONNULL = 199; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ public static final short GOTO_W = 200; + /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ @@ -1263,160 +1465,187 @@ public final class Const { * @see * Reserved opcodes in the Java Virtual Machine Specification */ public static final short BREAKPOINT = 202; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short LDC_QUICK = 203; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short LDC_W_QUICK = 204; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short LDC2_W_QUICK = 205; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETFIELD_QUICK = 206; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTFIELD_QUICK = 207; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETFIELD2_QUICK = 208; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTFIELD2_QUICK = 209; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETSTATIC_QUICK = 210; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTSTATIC_QUICK = 211; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETSTATIC2_QUICK = 212; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTSTATIC2_QUICK = 213; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEVIRTUAL_QUICK = 214; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKENONVIRTUAL_QUICK = 215; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKESUPER_QUICK = 216; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKESTATIC_QUICK = 217; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEINTERFACE_QUICK = 218; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEVIRTUALOBJECT_QUICK = 219; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short NEW_QUICK = 221; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short ANEWARRAY_QUICK = 222; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short MULTIANEWARRAY_QUICK = 223; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short CHECKCAST_QUICK = 224; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INSTANCEOF_QUICK = 225; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short INVOKEVIRTUAL_QUICK_W = 226; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short GETFIELD_QUICK_W = 227; + /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ public static final short PUTFIELD_QUICK_W = 228; + /** JVM internal opcode. * @see * Reserved opcodes in the Java Virtual Machine Specification */ public static final short IMPDEP1 = 254; + /** JVM internal opcode. * @see * Reserved opcodes in the Java Virtual Machine Specification */ @@ -1427,6 +1656,7 @@ public final class Const { * opcode when the class is dumped. */ public static final short PUSH = 4711; + /** * BCEL virtual instruction for either LOOKUPSWITCH or TABLESWITCH. Will be converted to the appropriate JVM * opcode when the class is dumped. @@ -1435,12 +1665,16 @@ public final class Const { /** Illegal opcode. */ public static final short UNDEFINED = -1; + /** Illegal opcode. */ public static final short UNPREDICTABLE = -2; + /** Illegal opcode. */ public static final short RESERVED = -3; + /** Mnemonic for an illegal opcode. */ public static final String ILLEGAL_OPCODE = ""; + /** Mnemonic for an illegal type. */ public static final String ILLEGAL_TYPE = ""; @@ -1448,30 +1682,37 @@ public final class Const { * @see * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_BOOLEAN = 4; + /** Char data type. * @see * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_CHAR = 5; + /** Float data type. * @see * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_FLOAT = 6; + /** Double data type. * @see * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_DOUBLE = 7; + /** Byte data type. * @see * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_BYTE = 8; + /** Short data type. * @see * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_SHORT = 9; + /** Int data type. * @see * Static Constraints in the Java Virtual Machine Specification */ public static final byte T_INT = 10; + /** Long data type. * @see * Static Constraints in the Java Virtual Machine Specification */ @@ -1479,14 +1720,19 @@ public final class Const { /** Void data type (non-standard). */ public static final byte T_VOID = 12; // Non-standard + /** Array data type. */ public static final byte T_ARRAY = 13; + /** Object data type. */ public static final byte T_OBJECT = 14; + /** Reference data type (deprecated). */ public static final byte T_REFERENCE = 14; // Deprecated + /** Unknown data type. */ public static final byte T_UNKNOWN = 15; + /** Address data type. */ public static final byte T_ADDRESS = 16; -- GitLab From 1fe62a02c75c1a1af4df78ec1b269837dee69314 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Wed, 1 Jun 2016 05:14:02 +0000 Subject: [PATCH 1113/1313] Use the Java 7 diamond notation. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746386 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/util/ClassLoader.java | 2 +- src/main/java/org/apache/commons/bcel6/util/ClassVector.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java index 7969bc2a..6de8f050 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java @@ -62,7 +62,7 @@ public class ClassLoader extends java.lang.ClassLoader { "java.", "javax.", "sun." }; - private final Hashtable> classes = new Hashtable>(); + private final Hashtable> classes = new Hashtable<>(); // Hashtable is synchronized thus thread-safe private final String[] ignored_packages; private Repository repository = SyntheticRepository.getInstance(); diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassVector.java b/src/main/java/org/apache/commons/bcel6/util/ClassVector.java index 8f66fd89..67f297bd 100644 --- a/src/main/java/org/apache/commons/bcel6/util/ClassVector.java +++ b/src/main/java/org/apache/commons/bcel6/util/ClassVector.java @@ -35,7 +35,7 @@ public class ClassVector implements java.io.Serializable { private static final long serialVersionUID = 5600397075672780806L; @Deprecated - protected List vec = new ArrayList(); + protected List vec = new ArrayList<>(); public void addElement( final JavaClass clazz ) { -- GitLab From f574335914900890e909f6ab9cc1665a313c9987 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Wed, 1 Jun 2016 05:27:53 +0000 Subject: [PATCH 1114/1313] [BCEL-272] Add constants for Java 9 class file version 53. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746387 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index b36c7e35..9797aa64 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,7 @@ The type attribute can be add,update,fix,remove. + Add constants for Java 9 class file version 53 FCONST pattern does not include FCONST_2 Add missing Node.accept() implementations (ConstantMethodHandle, ConstantMethodType, ParameterAnnotationEntry) BCELifier is not working for Java8Example (incomplete) -- GitLab From 28f4f17258aeaf9426cd1230b16c6445eae588ab Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 3 Jun 2016 15:25:10 +0000 Subject: [PATCH 1115/1313] Allow CLirr to be run from command line git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746730 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pom.xml b/pom.xml index 6b5a8eb6..39ebf2ba 100644 --- a/pom.xml +++ b/pom.xml @@ -188,6 +188,15 @@ + + + org.codehaus.mojo + clirr-maven-plugin + ${commons.clirr.version} + + ${minSeverity} + + org.apache.maven.plugins maven-jar-plugin -- GitLab From f8e618138c6ba4af63638df26b6308004076af82 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 3 Jun 2016 15:27:14 +0000 Subject: [PATCH 1116/1313] Clirr Plugin 2.7 fails with NPE git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746731 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 39ebf2ba..73ad79b9 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,8 @@ 12314220 3.0.3 2.17 + + 2.6.1 -- GitLab From 9ed4a4dbc87bca7ca0865f032fd6313b8b84720c Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 3 Jun 2016 15:39:18 +0000 Subject: [PATCH 1117/1313] Does not exist git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746733 13f79535-47bb-0310-9956-ffa450edef68 --- pmd.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pmd.xml b/pmd.xml index ceefc84d..d9883083 100644 --- a/pmd.xml +++ b/pmd.xml @@ -21,6 +21,5 @@ limitations under the License. xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"> Excludes from default PMD rules. - \ No newline at end of file -- GitLab From 05d9a9d6f97304faa1fb532052955821ee809c03 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 5 Jun 2016 10:31:31 +0000 Subject: [PATCH 1118/1313] Alignment git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746895 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 73ad79b9..a5c922f0 100644 --- a/pom.xml +++ b/pom.xml @@ -386,21 +386,19 @@ - jdk-rt - + jdk-rt + - - maven-surefire-plugin - - - **/PerformanceTest.java - - - - + + maven-surefire-plugin + + + **/PerformanceTest.java + + + - -- GitLab From ed0519f6946f24ba4ce224d91377343cc6e74fdf Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 5 Jun 2016 10:56:14 +0000 Subject: [PATCH 1119/1313] Make it possible to disable the Clirr ignored diffs file git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746900 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a5c922f0..1c7887eb 100644 --- a/pom.xml +++ b/pom.xml @@ -38,7 +38,6 @@ 2004 - clirr-ignored-diffs.xml ISO-8859-1 UTF-8 1.7 @@ -384,6 +383,21 @@ + + + quieten-clirr + + + !clirr.allDifferences + + + + clirr-ignored-diffs.xml + + jdk-rt -- GitLab From 25c211fa973870a27752c9f9175844af45524d74 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 5 Jun 2016 12:46:59 +0000 Subject: [PATCH 1120/1313] Tabs and trailing spaces git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746905 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 1c7887eb..086a178e 100644 --- a/pom.xml +++ b/pom.xml @@ -383,7 +383,7 @@ - @@ -399,9 +399,9 @@
    - - jdk-rt - + + jdk-rt + maven-surefire-plugin @@ -413,12 +413,12 @@ - - + + benchmark - + org.openjdk.jmh @@ -426,21 +426,21 @@ 1.3.4 test - + org.openjdk.jmh jmh-generator-annprocess 1.3.4 test - + commons-io commons-io 2.5 test - + org.apache.commons commons-collections4 @@ -448,12 +448,12 @@ test - + true org.apache - + @@ -465,7 +465,7 @@ - + org.codehaus.mojo -- GitLab From b739b7533d38d5d19b785619c24ddfd9c72b6d06 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 5 Jun 2016 13:28:19 +0000 Subject: [PATCH 1121/1313] Typo git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746913 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/commons/bcel6/Const.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/bcel6/Const.java b/src/main/java/org/apache/commons/bcel6/Const.java index 8a774239..6a2764f8 100644 --- a/src/main/java/org/apache/commons/bcel6/Const.java +++ b/src/main/java/org/apache/commons/bcel6/Const.java @@ -24,7 +24,7 @@ import java.util.Collections; * Constants for the project, mostly defined in the JVM specification. * * @version $Id$ - * @since 6.0 (intended to replace the Constant interface) + * @since 6.0 (intended to replace the Constants interface) */ public final class Const { -- GitLab From 6d1a43fbf3f8c90af2bb6c0194495fa5c1f9e10b Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 5 Jun 2016 13:37:43 +0000 Subject: [PATCH 1122/1313] Fill out description git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746915 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 9797aa64..426c8ba3 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -62,7 +62,34 @@ The type attribute can be add,update,fix,remove. --> - + Add constants for Java 9 class file version 53 FCONST pattern does not include FCONST_2 Add missing Node.accept() implementations (ConstantMethodHandle, ConstantMethodType, ParameterAnnotationEntry) @@ -84,7 +111,6 @@ The type attribute can be add,update,fix,remove. Document that Instruction Factory returns singleton instances better support for clone/copy methods Remove Serializable - Remove deprecated methods and classes Problem with JAXB if the bcel classloader is used; remove the broken ClassLoader class modify several toString methods to make output similar to "javap" add javadoc comments to LineNumber.java and LineNumberTable.java -- GitLab From 5d292188132df5c5d4c188bbaa07968d4f385eda Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sun, 5 Jun 2016 13:45:20 +0000 Subject: [PATCH 1123/1313] Better template (copied from NET) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1746918 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/release-notes.vm | 132 +++++++++++++++-------------------- 1 file changed, 57 insertions(+), 75 deletions(-) diff --git a/src/changes/release-notes.vm b/src/changes/release-notes.vm index ea718f23..e0589caa 100644 --- a/src/changes/release-notes.vm +++ b/src/changes/release-notes.vm @@ -14,13 +14,14 @@ ## KIND, either express or implied. See the License for the ## specific language governing permissions and limitations ## under the License. +## + ${project.name} ${version} + RELEASE NOTES - Apache ${project.name} ${version} RELEASE NOTES - -The ${developmentTeam} is pleased to announce the release of ${finalName} +The ${developmentTeam} is pleased to announce the release of ${project.name} ${version} $introduction.replaceAll("(? Date: Tue, 7 Jun 2016 00:36:56 +0000 Subject: [PATCH 1124/1313] Update old school @exception with new school @throws. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747097 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/commons/bcel6/classfile/JavaClass.java | 6 +++--- src/main/java/org/apache/commons/bcel6/util/MethodHTML.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java index 92b44ddd..62a88c16 100644 --- a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java +++ b/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java @@ -255,7 +255,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * Dump class to a file named file_name. * * @param _file_name Output file name - * @exception IOException + * @throws IOException */ public void dump( final String _file_name ) throws IOException { dump(new File(_file_name)); @@ -287,7 +287,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * Dump Java class to output stream in binary format. * * @param file Output stream - * @exception IOException + * @throws IOException */ public void dump( final OutputStream file ) throws IOException { dump(new DataOutputStream(file)); @@ -298,7 +298,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * Dump Java class to output stream in binary format. * * @param file Output stream - * @exception IOException + * @throws IOException */ public void dump( final DataOutputStream file ) throws IOException { file.writeInt(Const.JVM_CLASSFILE_MAGIC); diff --git a/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java b/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java index 6ab56854..56f5793b 100644 --- a/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java +++ b/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java @@ -72,7 +72,7 @@ final class MethodHTML { * Print field of class. * * @param field field to print - * @exception java.io.IOException + * @throws java.io.IOException */ private void writeField( final Field field ) throws IOException { String type = Utility.signatureToString(field.getSignature()); -- GitLab From 72ae6481006681f0ed57f2e5e19eb40f8ba492fb Mon Sep 17 00:00:00 2001 From: David Brosius Date: Tue, 7 Jun 2016 02:43:06 +0000 Subject: [PATCH 1125/1313] revert erroneous override of getClassName in InvokeInstruction, introduced in r1702349 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747124 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel6/generic/InvokeInstruction.java | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java b/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java index 257bf8ef..e5a62f4b 100644 --- a/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java @@ -120,22 +120,4 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti return Type.getArgumentTypes(getSignature(cpg)); } - /** - * This overrides the deprecated version as we know here that the referenced class - * cannot be an array unless something has gone badly wrong. - * @return name of the referenced class/interface - * @throws IllegalArgumentException if the referenced class is an array (this should not happen) - */ - @Override - public String getClassName( final ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); - String className = cp.getConstantString(cmr.getClassIndex(), Const.CONSTANT_Class); - if (className.startsWith("[")) { - throw new IllegalArgumentException("Cannot be used on an array type"); - } - return className.replace('/', '.'); - } - - } -- GitLab From 8ddaf505ae033aae2ed71e900b53159ce640f37c Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Tue, 7 Jun 2016 17:13:56 +0000 Subject: [PATCH 1126/1313] Revert changes introduced in BCEL-222 (rev 1694911). In particular this means that the package coordinates have been changed back from org.apache.commons.bcel6 to org.apache.bcel Furthermore the maven coordinates have been changes back from org.apache.commons:commons-bcel6:6.0-SNAPSHOT to org.apache.bcel:bcel:6.0-SNAPSHOT git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747273 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 4 +- src/examples/ClassDumper.java | 16 +++--- src/examples/HelloWorldBuilder.java | 32 +++++------ src/examples/JasminVisitor.java | 56 +++++++++---------- src/examples/Mini/ASTExpr.java | 28 +++++----- src/examples/Mini/ASTFunAppl.java | 12 ++-- src/examples/Mini/ASTFunDecl.java | 42 +++++++------- src/examples/Mini/ASTIdent.java | 14 ++--- src/examples/Mini/ASTIfExpr.java | 16 +++--- src/examples/Mini/ASTInteger.java | 8 +-- src/examples/Mini/ASTLetExpr.java | 18 +++--- src/examples/Mini/ASTProgram.java | 36 ++++++------ src/examples/Mini/Function.java | 2 +- src/examples/Mini/MiniC.java | 8 +-- src/examples/Mini/Variable.java | 2 +- src/examples/Package.java | 16 +++--- src/examples/Peephole.java | 20 +++---- src/examples/ProxyCreator.java | 36 ++++++------ src/examples/TransitiveHull.java | 36 ++++++------ src/examples/helloify.java | 34 +++++------ src/examples/id.java | 16 +++--- src/examples/listclass.java | 20 +++---- src/examples/maxstack.java | 12 ++-- src/examples/patchclass.java | 8 +-- .../apache/{commons/bcel6 => bcel}/Const.java | 2 +- .../{commons/bcel6 => bcel}/Constants.java | 2 +- .../bcel6 => bcel}/ExceptionConst.java | 2 +- .../bcel6 => bcel}/ExceptionConstants.java | 2 +- .../{commons/bcel6 => bcel}/Repository.java | 16 +++--- .../bcel6 => bcel}/classfile/AccessFlags.java | 0 .../classfile/AnnotationDefault.java | 0 .../classfile/AnnotationElementValue.java | 0 .../classfile/AnnotationEntry.java | 0 .../bcel6 => bcel}/classfile/Annotations.java | 0 .../classfile/ArrayElementValue.java | 0 .../bcel6 => bcel}/classfile/Attribute.java | 0 .../classfile/AttributeReader.java | 0 .../classfile/BootstrapMethod.java | 0 .../classfile/BootstrapMethods.java | 0 .../classfile/ClassElementValue.java | 0 .../classfile/ClassFormatException.java | 0 .../bcel6 => bcel}/classfile/ClassParser.java | 0 .../bcel6 => bcel}/classfile/Code.java | 0 .../classfile/CodeException.java | 0 .../bcel6 => bcel}/classfile/Constant.java | 0 .../bcel6 => bcel}/classfile/ConstantCP.java | 0 .../classfile/ConstantClass.java | 0 .../classfile/ConstantDouble.java | 0 .../classfile/ConstantFieldref.java | 0 .../classfile/ConstantFloat.java | 0 .../classfile/ConstantInteger.java | 0 .../classfile/ConstantInterfaceMethodref.java | 0 .../classfile/ConstantInvokeDynamic.java | 0 .../classfile/ConstantLong.java | 0 .../classfile/ConstantMethodHandle.java | 0 .../classfile/ConstantMethodType.java | 0 .../classfile/ConstantMethodref.java | 0 .../classfile/ConstantNameAndType.java | 0 .../classfile/ConstantObject.java | 0 .../classfile/ConstantPool.java | 0 .../classfile/ConstantString.java | 0 .../classfile/ConstantUtf8.java | 0 .../classfile/ConstantValue.java | 0 .../bcel6 => bcel}/classfile/Deprecated.java | 0 .../classfile/DescendingVisitor.java | 0 .../classfile/ElementValue.java | 0 .../classfile/ElementValuePair.java | 0 .../classfile/EmptyVisitor.java | 0 .../classfile/EnclosingMethod.java | 0 .../classfile/EnumElementValue.java | 0 .../classfile/ExceptionTable.java | 0 .../bcel6 => bcel}/classfile/Field.java | 0 .../classfile/FieldOrMethod.java | 0 .../bcel6 => bcel}/classfile/InnerClass.java | 0 .../classfile/InnerClasses.java | 0 .../bcel6 => bcel}/classfile/JavaClass.java | 0 .../bcel6 => bcel}/classfile/LineNumber.java | 0 .../classfile/LineNumberTable.java | 0 .../classfile/LocalVariable.java | 0 .../classfile/LocalVariableTable.java | 0 .../classfile/LocalVariableTypeTable.java | 0 .../bcel6 => bcel}/classfile/Method.java | 0 .../classfile/MethodParameter.java | 0 .../classfile/MethodParameters.java | 0 .../bcel6 => bcel}/classfile/Node.java | 0 .../bcel6 => bcel}/classfile/PMGClass.java | 0 .../classfile/ParameterAnnotationEntry.java | 0 .../classfile/ParameterAnnotations.java | 0 .../RuntimeInvisibleAnnotations.java | 0 .../RuntimeInvisibleParameterAnnotations.java | 0 .../classfile/RuntimeVisibleAnnotations.java | 0 .../RuntimeVisibleParameterAnnotations.java | 0 .../bcel6 => bcel}/classfile/Signature.java | 0 .../classfile/SimpleElementValue.java | 0 .../bcel6 => bcel}/classfile/SourceFile.java | 0 .../bcel6 => bcel}/classfile/StackMap.java | 0 .../classfile/StackMapEntry.java | 0 .../classfile/StackMapType.java | 0 .../bcel6 => bcel}/classfile/Synthetic.java | 0 .../bcel6 => bcel}/classfile/Unknown.java | 0 .../classfile/UnknownAttributeReader.java | 0 .../bcel6 => bcel}/classfile/Utility.java | 0 .../bcel6 => bcel}/classfile/Visitor.java | 0 .../bcel6 => bcel}/classfile/package.html | 0 .../bcel6 => bcel}/generic/AALOAD.java | 0 .../bcel6 => bcel}/generic/AASTORE.java | 0 .../bcel6 => bcel}/generic/ACONST_NULL.java | 0 .../bcel6 => bcel}/generic/ALOAD.java | 0 .../bcel6 => bcel}/generic/ANEWARRAY.java | 0 .../bcel6 => bcel}/generic/ARETURN.java | 0 .../bcel6 => bcel}/generic/ARRAYLENGTH.java | 0 .../bcel6 => bcel}/generic/ASTORE.java | 0 .../bcel6 => bcel}/generic/ATHROW.java | 0 .../generic/AllocationInstruction.java | 0 .../generic/AnnotationElementValueGen.java | 0 .../generic/AnnotationEntryGen.java | 0 .../generic/ArithmeticInstruction.java | 0 .../generic/ArrayElementValueGen.java | 0 .../generic/ArrayInstruction.java | 0 .../bcel6 => bcel}/generic/ArrayType.java | 0 .../bcel6 => bcel}/generic/BALOAD.java | 0 .../bcel6 => bcel}/generic/BASTORE.java | 0 .../bcel6 => bcel}/generic/BIPUSH.java | 0 .../bcel6 => bcel}/generic/BREAKPOINT.java | 0 .../bcel6 => bcel}/generic/BasicType.java | 0 .../bcel6 => bcel}/generic/BranchHandle.java | 0 .../generic/BranchInstruction.java | 0 .../bcel6 => bcel}/generic/CALOAD.java | 0 .../bcel6 => bcel}/generic/CASTORE.java | 0 .../bcel6 => bcel}/generic/CHECKCAST.java | 0 .../bcel6 => bcel}/generic/CPInstruction.java | 0 .../generic/ClassElementValueGen.java | 0 .../bcel6 => bcel}/generic/ClassGen.java | 0 .../generic/ClassGenException.java | 0 .../bcel6 => bcel}/generic/ClassObserver.java | 0 .../generic/CodeExceptionGen.java | 0 .../generic/CompoundInstruction.java | 0 .../generic/ConstantPoolGen.java | 0 .../generic/ConstantPushInstruction.java | 0 .../generic/ConversionInstruction.java | 0 .../{commons/bcel6 => bcel}/generic/D2F.java | 0 .../{commons/bcel6 => bcel}/generic/D2I.java | 0 .../{commons/bcel6 => bcel}/generic/D2L.java | 0 .../{commons/bcel6 => bcel}/generic/DADD.java | 0 .../bcel6 => bcel}/generic/DALOAD.java | 0 .../bcel6 => bcel}/generic/DASTORE.java | 0 .../bcel6 => bcel}/generic/DCMPG.java | 0 .../bcel6 => bcel}/generic/DCMPL.java | 0 .../bcel6 => bcel}/generic/DCONST.java | 0 .../{commons/bcel6 => bcel}/generic/DDIV.java | 0 .../bcel6 => bcel}/generic/DLOAD.java | 0 .../{commons/bcel6 => bcel}/generic/DMUL.java | 0 .../{commons/bcel6 => bcel}/generic/DNEG.java | 0 .../{commons/bcel6 => bcel}/generic/DREM.java | 0 .../bcel6 => bcel}/generic/DRETURN.java | 0 .../bcel6 => bcel}/generic/DSTORE.java | 0 .../{commons/bcel6 => bcel}/generic/DSUB.java | 0 .../{commons/bcel6 => bcel}/generic/DUP.java | 0 .../{commons/bcel6 => bcel}/generic/DUP2.java | 0 .../bcel6 => bcel}/generic/DUP2_X1.java | 0 .../bcel6 => bcel}/generic/DUP2_X2.java | 0 .../bcel6 => bcel}/generic/DUP_X1.java | 0 .../bcel6 => bcel}/generic/DUP_X2.java | 0 .../generic/ElementValueGen.java | 0 .../generic/ElementValuePairGen.java | 0 .../bcel6 => bcel}/generic/EmptyVisitor.java | 0 .../generic/EnumElementValueGen.java | 0 .../generic/ExceptionThrower.java | 0 .../{commons/bcel6 => bcel}/generic/F2D.java | 0 .../{commons/bcel6 => bcel}/generic/F2I.java | 0 .../{commons/bcel6 => bcel}/generic/F2L.java | 0 .../{commons/bcel6 => bcel}/generic/FADD.java | 0 .../bcel6 => bcel}/generic/FALOAD.java | 0 .../bcel6 => bcel}/generic/FASTORE.java | 0 .../bcel6 => bcel}/generic/FCMPG.java | 0 .../bcel6 => bcel}/generic/FCMPL.java | 0 .../bcel6 => bcel}/generic/FCONST.java | 0 .../{commons/bcel6 => bcel}/generic/FDIV.java | 0 .../bcel6 => bcel}/generic/FLOAD.java | 0 .../{commons/bcel6 => bcel}/generic/FMUL.java | 0 .../{commons/bcel6 => bcel}/generic/FNEG.java | 0 .../{commons/bcel6 => bcel}/generic/FREM.java | 0 .../bcel6 => bcel}/generic/FRETURN.java | 0 .../bcel6 => bcel}/generic/FSTORE.java | 0 .../{commons/bcel6 => bcel}/generic/FSUB.java | 0 .../bcel6 => bcel}/generic/FieldGen.java | 0 .../generic/FieldGenOrMethodGen.java | 0 .../generic/FieldInstruction.java | 0 .../bcel6 => bcel}/generic/FieldObserver.java | 0 .../bcel6 => bcel}/generic/FieldOrMethod.java | 0 .../bcel6 => bcel}/generic/GETFIELD.java | 0 .../bcel6 => bcel}/generic/GETSTATIC.java | 0 .../{commons/bcel6 => bcel}/generic/GOTO.java | 0 .../bcel6 => bcel}/generic/GOTO_W.java | 0 .../generic/GotoInstruction.java | 0 .../{commons/bcel6 => bcel}/generic/I2B.java | 0 .../{commons/bcel6 => bcel}/generic/I2C.java | 0 .../{commons/bcel6 => bcel}/generic/I2D.java | 0 .../{commons/bcel6 => bcel}/generic/I2F.java | 0 .../{commons/bcel6 => bcel}/generic/I2L.java | 0 .../{commons/bcel6 => bcel}/generic/I2S.java | 0 .../{commons/bcel6 => bcel}/generic/IADD.java | 0 .../bcel6 => bcel}/generic/IALOAD.java | 0 .../{commons/bcel6 => bcel}/generic/IAND.java | 0 .../bcel6 => bcel}/generic/IASTORE.java | 0 .../bcel6 => bcel}/generic/ICONST.java | 0 .../{commons/bcel6 => bcel}/generic/IDIV.java | 0 .../{commons/bcel6 => bcel}/generic/IFEQ.java | 0 .../{commons/bcel6 => bcel}/generic/IFGE.java | 0 .../{commons/bcel6 => bcel}/generic/IFGT.java | 0 .../{commons/bcel6 => bcel}/generic/IFLE.java | 0 .../{commons/bcel6 => bcel}/generic/IFLT.java | 0 .../{commons/bcel6 => bcel}/generic/IFNE.java | 0 .../bcel6 => bcel}/generic/IFNONNULL.java | 0 .../bcel6 => bcel}/generic/IFNULL.java | 0 .../bcel6 => bcel}/generic/IF_ACMPEQ.java | 0 .../bcel6 => bcel}/generic/IF_ACMPNE.java | 0 .../bcel6 => bcel}/generic/IF_ICMPEQ.java | 0 .../bcel6 => bcel}/generic/IF_ICMPGE.java | 0 .../bcel6 => bcel}/generic/IF_ICMPGT.java | 0 .../bcel6 => bcel}/generic/IF_ICMPLE.java | 0 .../bcel6 => bcel}/generic/IF_ICMPLT.java | 0 .../bcel6 => bcel}/generic/IF_ICMPNE.java | 0 .../{commons/bcel6 => bcel}/generic/IINC.java | 0 .../bcel6 => bcel}/generic/ILOAD.java | 0 .../bcel6 => bcel}/generic/IMPDEP1.java | 0 .../bcel6 => bcel}/generic/IMPDEP2.java | 0 .../{commons/bcel6 => bcel}/generic/IMUL.java | 0 .../{commons/bcel6 => bcel}/generic/INEG.java | 0 .../bcel6 => bcel}/generic/INSTANCEOF.java | 0 .../bcel6 => bcel}/generic/INVOKEDYNAMIC.java | 0 .../generic/INVOKEINTERFACE.java | 0 .../bcel6 => bcel}/generic/INVOKESPECIAL.java | 0 .../bcel6 => bcel}/generic/INVOKESTATIC.java | 0 .../bcel6 => bcel}/generic/INVOKEVIRTUAL.java | 0 .../{commons/bcel6 => bcel}/generic/IOR.java | 0 .../{commons/bcel6 => bcel}/generic/IREM.java | 0 .../bcel6 => bcel}/generic/IRETURN.java | 0 .../{commons/bcel6 => bcel}/generic/ISHL.java | 0 .../{commons/bcel6 => bcel}/generic/ISHR.java | 0 .../bcel6 => bcel}/generic/ISTORE.java | 0 .../{commons/bcel6 => bcel}/generic/ISUB.java | 0 .../bcel6 => bcel}/generic/IUSHR.java | 0 .../{commons/bcel6 => bcel}/generic/IXOR.java | 0 .../bcel6 => bcel}/generic/IfInstruction.java | 0 .../generic/IndexedInstruction.java | 0 .../bcel6 => bcel}/generic/Instruction.java | 0 .../generic/InstructionComparator.java | 0 .../generic/InstructionConst.java | 0 .../generic/InstructionConstants.java | 0 .../generic/InstructionFactory.java | 0 .../generic/InstructionHandle.java | 0 .../generic/InstructionList.java | 0 .../generic/InstructionListObserver.java | 0 .../generic/InstructionTargeter.java | 0 .../generic/InvokeInstruction.java | 0 .../{commons/bcel6 => bcel}/generic/JSR.java | 0 .../bcel6 => bcel}/generic/JSR_W.java | 0 .../generic/JsrInstruction.java | 0 .../{commons/bcel6 => bcel}/generic/L2D.java | 0 .../{commons/bcel6 => bcel}/generic/L2F.java | 0 .../{commons/bcel6 => bcel}/generic/L2I.java | 0 .../{commons/bcel6 => bcel}/generic/LADD.java | 0 .../bcel6 => bcel}/generic/LALOAD.java | 0 .../{commons/bcel6 => bcel}/generic/LAND.java | 0 .../bcel6 => bcel}/generic/LASTORE.java | 0 .../{commons/bcel6 => bcel}/generic/LCMP.java | 0 .../bcel6 => bcel}/generic/LCONST.java | 0 .../{commons/bcel6 => bcel}/generic/LDC.java | 0 .../bcel6 => bcel}/generic/LDC2_W.java | 0 .../bcel6 => bcel}/generic/LDC_W.java | 0 .../{commons/bcel6 => bcel}/generic/LDIV.java | 0 .../bcel6 => bcel}/generic/LLOAD.java | 0 .../{commons/bcel6 => bcel}/generic/LMUL.java | 0 .../{commons/bcel6 => bcel}/generic/LNEG.java | 0 .../bcel6 => bcel}/generic/LOOKUPSWITCH.java | 0 .../{commons/bcel6 => bcel}/generic/LOR.java | 0 .../{commons/bcel6 => bcel}/generic/LREM.java | 0 .../bcel6 => bcel}/generic/LRETURN.java | 0 .../{commons/bcel6 => bcel}/generic/LSHL.java | 0 .../{commons/bcel6 => bcel}/generic/LSHR.java | 0 .../bcel6 => bcel}/generic/LSTORE.java | 0 .../{commons/bcel6 => bcel}/generic/LSUB.java | 0 .../bcel6 => bcel}/generic/LUSHR.java | 0 .../{commons/bcel6 => bcel}/generic/LXOR.java | 0 .../bcel6 => bcel}/generic/LineNumberGen.java | 0 .../bcel6 => bcel}/generic/LoadClass.java | 0 .../generic/LoadInstruction.java | 0 .../generic/LocalVariableGen.java | 0 .../generic/LocalVariableInstruction.java | 0 .../bcel6 => bcel}/generic/MONITORENTER.java | 0 .../bcel6 => bcel}/generic/MONITOREXIT.java | 0 .../generic/MULTIANEWARRAY.java | 0 .../bcel6 => bcel}/generic/MethodGen.java | 0 .../generic/MethodObserver.java | 0 .../{commons/bcel6 => bcel}/generic/NEW.java | 0 .../bcel6 => bcel}/generic/NEWARRAY.java | 0 .../{commons/bcel6 => bcel}/generic/NOP.java | 0 .../generic/NameSignatureInstruction.java | 0 .../bcel6 => bcel}/generic/NamedAndTyped.java | 0 .../bcel6 => bcel}/generic/ObjectType.java | 0 .../{commons/bcel6 => bcel}/generic/POP.java | 0 .../{commons/bcel6 => bcel}/generic/POP2.java | 0 .../{commons/bcel6 => bcel}/generic/PUSH.java | 0 .../bcel6 => bcel}/generic/PUTFIELD.java | 0 .../bcel6 => bcel}/generic/PUTSTATIC.java | 0 .../generic/PopInstruction.java | 0 .../generic/PushInstruction.java | 0 .../{commons/bcel6 => bcel}/generic/RET.java | 0 .../bcel6 => bcel}/generic/RETURN.java | 0 .../bcel6 => bcel}/generic/ReferenceType.java | 0 .../generic/ReturnInstruction.java | 0 .../generic/ReturnaddressType.java | 0 .../bcel6 => bcel}/generic/SALOAD.java | 0 .../bcel6 => bcel}/generic/SASTORE.java | 0 .../bcel6 => bcel}/generic/SIPUSH.java | 0 .../{commons/bcel6 => bcel}/generic/SWAP.java | 0 .../bcel6 => bcel}/generic/SWITCH.java | 0 .../bcel6 => bcel}/generic/Select.java | 0 .../generic/SimpleElementValueGen.java | 0 .../bcel6 => bcel}/generic/StackConsumer.java | 0 .../generic/StackInstruction.java | 0 .../bcel6 => bcel}/generic/StackProducer.java | 0 .../generic/StoreInstruction.java | 0 .../bcel6 => bcel}/generic/TABLESWITCH.java | 0 .../generic/TargetLostException.java | 0 .../{commons/bcel6 => bcel}/generic/Type.java | 0 .../generic/TypedInstruction.java | 0 .../generic/UnconditionalBranch.java | 0 .../generic/VariableLengthInstruction.java | 0 .../bcel6 => bcel}/generic/Visitor.java | 0 .../bcel6 => bcel}/generic/package.html | 0 .../{commons/bcel6 => bcel}/package.html | 0 .../bcel6 => bcel}/util/AttributeHTML.java | 0 .../bcel6 => bcel}/util/BCELComparator.java | 0 .../bcel6 => bcel}/util/BCELFactory.java | 0 .../bcel6 => bcel}/util/BCELifier.java | 0 .../bcel6 => bcel}/util/ByteSequence.java | 0 .../bcel6 => bcel}/util/Class2HTML.java | 0 .../bcel6 => bcel}/util/ClassLoader.java | 0 .../util/ClassLoaderRepository.java | 0 .../bcel6 => bcel}/util/ClassPath.java | 0 .../util/ClassPathRepository.java | 0 .../bcel6 => bcel}/util/ClassQueue.java | 0 .../bcel6 => bcel}/util/ClassSet.java | 0 .../bcel6 => bcel}/util/ClassStack.java | 0 .../bcel6 => bcel}/util/ClassVector.java | 0 .../bcel6 => bcel}/util/CodeHTML.java | 0 .../bcel6 => bcel}/util/ConstantHTML.java | 0 .../util/InstructionFinder.java | 0 .../bcel6 => bcel}/util/JavaWrapper.java | 0 .../MemorySensitiveClassPathRepository.java | 0 .../bcel6 => bcel}/util/MethodHTML.java | 0 .../bcel6 => bcel}/util/Repository.java | 0 .../util/SyntheticRepository.java | 0 .../{commons/bcel6 => bcel}/util/package.html | 0 .../verifier/GraphicalVerifier.java | 0 .../verifier/NativeVerifier.java | 0 .../bcel6 => bcel}/verifier/PassVerifier.java | 0 .../verifier/TransitiveHull.java | 0 .../verifier/VerificationResult.java | 0 .../bcel6 => bcel}/verifier/Verifier.java | 0 .../verifier/VerifierAppFrame.java | 0 .../verifier/VerifierFactory.java | 0 .../verifier/VerifierFactoryListModel.java | 0 .../verifier/VerifierFactoryObserver.java | 0 .../bcel6 => bcel}/verifier/VerifyDialog.java | 0 .../exc/AssertionViolatedException.java | 0 .../exc/ClassConstraintException.java | 0 .../verifier/exc/CodeConstraintException.java | 0 .../verifier/exc/InvalidMethodException.java | 0 .../exc/LinkingConstraintException.java | 0 .../verifier/exc/LoadingException.java | 0 ...ocalVariableInfoInconsistentException.java | 0 .../exc/StaticCodeConstraintException.java | 0 ...ticCodeInstructionConstraintException.java | 0 ...InstructionOperandConstraintException.java | 0 .../StructuralCodeConstraintException.java | 0 .../bcel6 => bcel}/verifier/exc/Utility.java | 0 .../verifier/exc/VerificationException.java | 0 .../VerifierConstraintViolatedException.java | 0 .../bcel6 => bcel}/verifier/exc/package.html | 0 .../bcel6 => bcel}/verifier/package.html | 0 .../verifier/statics/DOUBLE_Upper.java | 0 .../verifier/statics/IntList.java | 0 .../verifier/statics/LONG_Upper.java | 0 .../verifier/statics/LocalVariableInfo.java | 0 .../verifier/statics/LocalVariablesInfo.java | 0 .../verifier/statics/Pass1Verifier.java | 0 .../verifier/statics/Pass2Verifier.java | 0 .../verifier/statics/Pass3aVerifier.java | 0 .../statics/StringRepresentation.java | 0 .../verifier/statics/package.html | 0 .../structurals/ControlFlowGraph.java | 0 .../structurals/ExceptionHandler.java | 0 .../structurals/ExceptionHandlers.java | 0 .../structurals/ExecutionVisitor.java | 0 .../verifier/structurals/Frame.java | 0 .../verifier/structurals/GenericArray.java | 0 .../structurals/InstConstraintVisitor.java | 0 .../structurals/InstructionContext.java | 0 .../verifier/structurals/LocalVariables.java | 0 .../verifier/structurals/OperandStack.java | 0 .../verifier/structurals/Pass3bVerifier.java | 0 .../verifier/structurals/Subroutine.java | 0 .../verifier/structurals/Subroutines.java | 0 .../structurals/UninitializedObjectType.java | 0 .../verifier/structurals/package.html | 0 .../AbstractCounterVisitorTestCase.java | 8 +-- .../bcel6 => bcel}/AbstractTestCase.java | 26 ++++----- .../AnnotationAccessFlagTestCase.java | 4 +- .../AnnotationDefaultAttributeTestCase.java | 12 ++-- .../AnonymousClassTestCase.java | 4 +- .../bcel6 => bcel}/BCELBenchmark.java | 14 ++--- .../CounterVisitorTestCase.java | 4 +- .../ElementValueGenTestCase.java | 16 +++--- .../EnclosingMethodAttributeTestCase.java | 12 ++-- .../EnumAccessFlagTestCase.java | 4 +- .../InstructionFinderTestCase.java | 12 ++-- .../{commons/bcel6 => bcel}/NanoTimer.java | 2 +- .../{commons/bcel6 => bcel}/PLSETestCase.java | 16 +++--- .../bcel6 => bcel}/PerformanceTest.java | 14 ++--- .../classfile/JDKClassDumpTestCase.java | 0 .../classfile/UtilityTestCase.java | 0 .../bcel6 => bcel}/data/AnnotatedFields.java | 0 .../data/AnnotatedWithCombinedAnnotation.java | 0 .../data/AnnotatedWithEnumClass.java | 0 .../data/AnnotationEnumElement.java | 0 .../data/AnonymousClassTest.java | 0 .../data/AttributeTestClassEM01.java | 0 .../data/AttributeTestClassEM02.java | 0 .../data/CombinedAnnotation.java | 0 .../data/ComplexAnnotatedClass.java | 0 .../data/ComplexAnnotation.java | 0 .../bcel6 => bcel}/data/MarkedType.java | 0 .../bcel6 => bcel}/data/MarkerAnnotation.java | 0 .../data/MarkerAnnotationInvisible.java | 0 .../bcel6 => bcel}/data/PLSETestClass.java | 0 .../data/SimpleAnnotatedClass.java | 0 .../bcel6 => bcel}/data/SimpleAnnotation.java | 0 .../bcel6 => bcel}/data/SimpleClass.java | 0 .../bcel6 => bcel}/data/SimpleEnum.java | 0 .../generic/AnnotationGenTestCase.java | 0 .../generic/BranchHandleTestCase.java | 0 .../generic/FieldAnnotationsTestCase.java | 0 .../GeneratingAnnotatedClassesTestCase.java | 0 .../generic/InstructionHandleTestCase.java | 0 .../generic/JDKGenericDumpTestCase.java | 0 .../generic/MethodGenTestCase.java | 0 .../util/BCELifierTestCase.java | 0 .../util/Class2HTMLTestCase.java | 0 .../util/InstructionFinderTest.java | 0 .../verifier/AbstractVerifierTestCase.java | 0 .../verifier/VerifierArrayAccessTestCase.java | 0 .../verifier/VerifierInvokeTestCase.java | 0 .../verifier/VerifierReturnTestCase.java | 0 .../verifier/VerifierTestCase.java | 0 .../verifier/tests/TestArray01.java | 0 .../verifier/tests/TestArrayAccess01.java | 0 .../tests/TestArrayAccess02Creator.java | 0 .../tests/TestArrayAccess03Creator.java | 0 .../tests/TestArrayAccess04Creator.java | 0 .../verifier/tests/TestCreator.java | 0 .../tests/TestLegalInvokeInterface01.java | 0 .../tests/TestLegalInvokeSpecial01.java | 0 .../tests/TestLegalInvokeSpecial02.java | 0 .../tests/TestLegalInvokeStatic01.java | 0 .../tests/TestLegalInvokeVirtual01.java | 0 .../tests/TestLegalInvokeVirtual02.java | 0 .../verifier/tests/TestReturn01Creator.java | 0 .../verifier/tests/TestReturn02.java | 0 .../verifier/tests/TestReturn03Creator.java | 0 .../visitors/CounterVisitor.java | 0 473 files changed, 332 insertions(+), 332 deletions(-) rename src/main/java/org/apache/{commons/bcel6 => bcel}/Const.java (99%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/Constants.java (99%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/ExceptionConst.java (99%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/ExceptionConstants.java (99%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/Repository.java (94%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/AccessFlags.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/AnnotationDefault.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/AnnotationElementValue.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/AnnotationEntry.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Annotations.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ArrayElementValue.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Attribute.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/AttributeReader.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/BootstrapMethod.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/BootstrapMethods.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ClassElementValue.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ClassFormatException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ClassParser.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Code.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/CodeException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Constant.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantCP.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantClass.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantDouble.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantFieldref.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantFloat.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantInteger.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantInterfaceMethodref.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantInvokeDynamic.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantLong.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantMethodHandle.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantMethodType.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantMethodref.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantNameAndType.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantObject.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantPool.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantString.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantUtf8.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ConstantValue.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Deprecated.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/DescendingVisitor.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ElementValue.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ElementValuePair.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/EmptyVisitor.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/EnclosingMethod.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/EnumElementValue.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ExceptionTable.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Field.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/FieldOrMethod.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/InnerClass.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/InnerClasses.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/JavaClass.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/LineNumber.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/LineNumberTable.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/LocalVariable.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/LocalVariableTable.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/LocalVariableTypeTable.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Method.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/MethodParameter.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/MethodParameters.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Node.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/PMGClass.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ParameterAnnotationEntry.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/ParameterAnnotations.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/RuntimeInvisibleAnnotations.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/RuntimeInvisibleParameterAnnotations.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/RuntimeVisibleAnnotations.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/RuntimeVisibleParameterAnnotations.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Signature.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/SimpleElementValue.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/SourceFile.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/StackMap.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/StackMapEntry.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/StackMapType.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Synthetic.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Unknown.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/UnknownAttributeReader.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Utility.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/Visitor.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/classfile/package.html (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/AALOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/AASTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ACONST_NULL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ALOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ANEWARRAY.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ARETURN.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ARRAYLENGTH.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ASTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ATHROW.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/AllocationInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/AnnotationElementValueGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/AnnotationEntryGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ArithmeticInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ArrayElementValueGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ArrayInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ArrayType.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/BALOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/BASTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/BIPUSH.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/BREAKPOINT.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/BasicType.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/BranchHandle.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/BranchInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/CALOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/CASTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/CHECKCAST.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/CPInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ClassElementValueGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ClassGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ClassGenException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ClassObserver.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/CodeExceptionGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/CompoundInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ConstantPoolGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ConstantPushInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ConversionInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/D2F.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/D2I.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/D2L.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DADD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DALOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DASTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DCMPG.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DCMPL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DCONST.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DDIV.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DLOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DMUL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DNEG.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DREM.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DRETURN.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DSTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DSUB.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DUP.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DUP2.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DUP2_X1.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DUP2_X2.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DUP_X1.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/DUP_X2.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ElementValueGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ElementValuePairGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/EmptyVisitor.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/EnumElementValueGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ExceptionThrower.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/F2D.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/F2I.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/F2L.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FADD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FALOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FASTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FCMPG.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FCMPL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FCONST.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FDIV.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FLOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FMUL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FNEG.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FREM.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FRETURN.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FSTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FSUB.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FieldGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FieldGenOrMethodGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FieldInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FieldObserver.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/FieldOrMethod.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/GETFIELD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/GETSTATIC.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/GOTO.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/GOTO_W.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/GotoInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/I2B.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/I2C.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/I2D.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/I2F.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/I2L.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/I2S.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IADD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IALOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IAND.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IASTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ICONST.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IDIV.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IFEQ.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IFGE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IFGT.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IFLE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IFLT.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IFNE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IFNONNULL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IFNULL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IF_ACMPEQ.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IF_ACMPNE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IF_ICMPEQ.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IF_ICMPGE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IF_ICMPGT.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IF_ICMPLE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IF_ICMPLT.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IF_ICMPNE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IINC.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ILOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IMPDEP1.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IMPDEP2.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IMUL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/INEG.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/INSTANCEOF.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/INVOKEDYNAMIC.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/INVOKEINTERFACE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/INVOKESPECIAL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/INVOKESTATIC.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/INVOKEVIRTUAL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IOR.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IREM.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IRETURN.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ISHL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ISHR.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ISTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ISUB.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IUSHR.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IXOR.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IfInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/IndexedInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/Instruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/InstructionComparator.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/InstructionConst.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/InstructionConstants.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/InstructionFactory.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/InstructionHandle.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/InstructionList.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/InstructionListObserver.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/InstructionTargeter.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/InvokeInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/JSR.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/JSR_W.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/JsrInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/L2D.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/L2F.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/L2I.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LADD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LALOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LAND.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LASTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LCMP.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LCONST.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LDC.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LDC2_W.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LDC_W.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LDIV.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LLOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LMUL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LNEG.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LOOKUPSWITCH.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LOR.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LREM.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LRETURN.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LSHL.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LSHR.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LSTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LSUB.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LUSHR.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LXOR.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LineNumberGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LoadClass.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LoadInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LocalVariableGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/LocalVariableInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/MONITORENTER.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/MONITOREXIT.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/MULTIANEWARRAY.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/MethodGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/MethodObserver.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/NEW.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/NEWARRAY.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/NOP.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/NameSignatureInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/NamedAndTyped.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ObjectType.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/POP.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/POP2.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/PUSH.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/PUTFIELD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/PUTSTATIC.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/PopInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/PushInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/RET.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/RETURN.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ReferenceType.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ReturnInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/ReturnaddressType.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/SALOAD.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/SASTORE.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/SIPUSH.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/SWAP.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/SWITCH.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/Select.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/SimpleElementValueGen.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/StackConsumer.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/StackInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/StackProducer.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/StoreInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/TABLESWITCH.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/TargetLostException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/Type.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/TypedInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/UnconditionalBranch.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/VariableLengthInstruction.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/Visitor.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/generic/package.html (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/package.html (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/AttributeHTML.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/BCELComparator.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/BCELFactory.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/BCELifier.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/ByteSequence.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/Class2HTML.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/ClassLoader.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/ClassLoaderRepository.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/ClassPath.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/ClassPathRepository.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/ClassQueue.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/ClassSet.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/ClassStack.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/ClassVector.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/CodeHTML.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/ConstantHTML.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/InstructionFinder.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/JavaWrapper.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/MemorySensitiveClassPathRepository.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/MethodHTML.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/Repository.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/SyntheticRepository.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/util/package.html (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/GraphicalVerifier.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/NativeVerifier.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/PassVerifier.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/TransitiveHull.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/VerificationResult.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/Verifier.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/VerifierAppFrame.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/VerifierFactory.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/VerifierFactoryListModel.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/VerifierFactoryObserver.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/VerifyDialog.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/AssertionViolatedException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/ClassConstraintException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/CodeConstraintException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/InvalidMethodException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/LinkingConstraintException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/LoadingException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/LocalVariableInfoInconsistentException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/StaticCodeConstraintException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/StaticCodeInstructionConstraintException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/StaticCodeInstructionOperandConstraintException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/StructuralCodeConstraintException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/Utility.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/VerificationException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/VerifierConstraintViolatedException.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/exc/package.html (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/package.html (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/statics/DOUBLE_Upper.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/statics/IntList.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/statics/LONG_Upper.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/statics/LocalVariableInfo.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/statics/LocalVariablesInfo.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/statics/Pass1Verifier.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/statics/Pass2Verifier.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/statics/Pass3aVerifier.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/statics/StringRepresentation.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/statics/package.html (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/ControlFlowGraph.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/ExceptionHandler.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/ExceptionHandlers.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/ExecutionVisitor.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/Frame.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/GenericArray.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/InstConstraintVisitor.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/InstructionContext.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/LocalVariables.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/OperandStack.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/Pass3bVerifier.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/Subroutine.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/Subroutines.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/UninitializedObjectType.java (100%) rename src/main/java/org/apache/{commons/bcel6 => bcel}/verifier/structurals/package.html (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/AbstractCounterVisitorTestCase.java (87%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/AbstractTestCase.java (90%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/AnnotationAccessFlagTestCase.java (94%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/AnnotationDefaultAttributeTestCase.java (85%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/AnonymousClassTestCase.java (96%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/BCELBenchmark.java (92%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/CounterVisitorTestCase.java (98%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/ElementValueGenTestCase.java (95%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/EnclosingMethodAttributeTestCase.java (94%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/EnumAccessFlagTestCase.java (94%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/InstructionFinderTestCase.java (86%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/NanoTimer.java (97%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/PLSETestCase.java (85%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/PerformanceTest.java (93%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/classfile/JDKClassDumpTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/classfile/UtilityTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/AnnotatedFields.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/AnnotatedWithCombinedAnnotation.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/AnnotatedWithEnumClass.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/AnnotationEnumElement.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/AnonymousClassTest.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/AttributeTestClassEM01.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/AttributeTestClassEM02.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/CombinedAnnotation.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/ComplexAnnotatedClass.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/ComplexAnnotation.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/MarkedType.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/MarkerAnnotation.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/MarkerAnnotationInvisible.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/PLSETestClass.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/SimpleAnnotatedClass.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/SimpleAnnotation.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/SimpleClass.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/data/SimpleEnum.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/generic/AnnotationGenTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/generic/BranchHandleTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/generic/FieldAnnotationsTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/generic/GeneratingAnnotatedClassesTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/generic/InstructionHandleTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/generic/JDKGenericDumpTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/generic/MethodGenTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/util/BCELifierTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/util/Class2HTMLTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/util/InstructionFinderTest.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/AbstractVerifierTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/VerifierArrayAccessTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/VerifierInvokeTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/VerifierReturnTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/VerifierTestCase.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestArray01.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestArrayAccess01.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestArrayAccess02Creator.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestArrayAccess03Creator.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestArrayAccess04Creator.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestCreator.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestLegalInvokeInterface01.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestLegalInvokeSpecial01.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestLegalInvokeSpecial02.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestLegalInvokeStatic01.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestLegalInvokeVirtual01.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestLegalInvokeVirtual02.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestReturn01Creator.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestReturn02.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/verifier/tests/TestReturn03Creator.java (100%) rename src/test/java/org/apache/{commons/bcel6 => bcel}/visitors/CounterVisitor.java (100%) diff --git a/pom.xml b/pom.xml index 086a178e..fd243a98 100644 --- a/pom.xml +++ b/pom.xml @@ -27,8 +27,8 @@ 40 - org.apache.commons - commons-bcel6 + org.apache.bcel + bcel jar 6.0-SNAPSHOT Apache Commons BCEL diff --git a/src/examples/ClassDumper.java b/src/examples/ClassDumper.java index d5f342b9..abef7c5c 100644 --- a/src/examples/ClassDumper.java +++ b/src/examples/ClassDumper.java @@ -21,14 +21,14 @@ import java.io.IOException; import javax.imageio.stream.FileImageInputStream; -import org.apache.commons.bcel6.Constants; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.ClassFormatException; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.util.BCELifier; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ClassFormatException; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.util.BCELifier; /** * Display Java .class file data. diff --git a/src/examples/HelloWorldBuilder.java b/src/examples/HelloWorldBuilder.java index 79419ad2..8ffd37b4 100644 --- a/src/examples/HelloWorldBuilder.java +++ b/src/examples/HelloWorldBuilder.java @@ -18,22 +18,22 @@ import java.io.IOException; -import org.apache.commons.bcel6.Constants; -import org.apache.commons.bcel6.generic.ALOAD; -import org.apache.commons.bcel6.generic.ASTORE; -import org.apache.commons.bcel6.generic.ArrayType; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.GOTO; -import org.apache.commons.bcel6.generic.InstructionConstants; -import org.apache.commons.bcel6.generic.InstructionFactory; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.LocalVariableGen; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.PUSH; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.Constants; +import org.apache.bcel.generic.ALOAD; +import org.apache.bcel.generic.ASTORE; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GOTO; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.LocalVariableGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.Type; /** * Create HelloWorld class: diff --git a/src/examples/JasminVisitor.java b/src/examples/JasminVisitor.java index 2e28f21b..e16c6a19 100644 --- a/src/examples/JasminVisitor.java +++ b/src/examples/JasminVisitor.java @@ -24,32 +24,32 @@ import java.util.Date; import java.util.Hashtable; import java.util.StringTokenizer; -import org.apache.commons.bcel6.Constants; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.Code; -import org.apache.commons.bcel6.classfile.ConstantValue; -import org.apache.commons.bcel6.classfile.Deprecated; -import org.apache.commons.bcel6.classfile.ExceptionTable; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.Synthetic; -import org.apache.commons.bcel6.classfile.Utility; -import org.apache.commons.bcel6.generic.BranchHandle; -import org.apache.commons.bcel6.generic.BranchInstruction; -import org.apache.commons.bcel6.generic.CodeExceptionGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.Instruction; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.LineNumberGen; -import org.apache.commons.bcel6.generic.LocalVariableGen; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.Select; -import org.apache.commons.bcel6.generic.TABLESWITCH; +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Deprecated; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Synthetic; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.generic.BranchHandle; +import org.apache.bcel.generic.BranchInstruction; +import org.apache.bcel.generic.CodeExceptionGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.Instruction; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.LineNumberGen; +import org.apache.bcel.generic.LocalVariableGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.Select; +import org.apache.bcel.generic.TABLESWITCH; /** * Disassemble Java class object into the @@ -57,7 +57,7 @@ import org.apache.commons.bcel6.generic.TABLESWITCH; * * @version $Id$ */ -public class JasminVisitor extends org.apache.commons.bcel6.classfile.EmptyVisitor { +public class JasminVisitor extends org.apache.bcel.classfile.EmptyVisitor { private JavaClass clazz; private PrintWriter out; private String class_name; @@ -74,7 +74,7 @@ public class JasminVisitor extends org.apache.commons.bcel6.classfile.EmptyVisit * Start traversal using DefaultVisitor pattern. */ public void disassemble() { - new org.apache.commons.bcel6.classfile.DescendingVisitor(clazz, this).visit(); + new org.apache.bcel.classfile.DescendingVisitor(clazz, this).visit(); out.close(); } diff --git a/src/examples/Mini/ASTExpr.java b/src/examples/Mini/ASTExpr.java index 0d96ed64..7388d869 100644 --- a/src/examples/Mini/ASTExpr.java +++ b/src/examples/Mini/ASTExpr.java @@ -19,19 +19,19 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.commons.bcel6.generic.BranchHandle; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.GOTO; -import org.apache.commons.bcel6.generic.IF_ICMPEQ; -import org.apache.commons.bcel6.generic.IF_ICMPGE; -import org.apache.commons.bcel6.generic.IF_ICMPGT; -import org.apache.commons.bcel6.generic.IF_ICMPLE; -import org.apache.commons.bcel6.generic.IF_ICMPLT; -import org.apache.commons.bcel6.generic.IF_ICMPNE; -import org.apache.commons.bcel6.generic.InstructionConstants; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.PUSH; +import org.apache.bcel.generic.BranchHandle; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GOTO; +import org.apache.bcel.generic.IF_ICMPEQ; +import org.apache.bcel.generic.IF_ICMPGE; +import org.apache.bcel.generic.IF_ICMPGT; +import org.apache.bcel.generic.IF_ICMPLE; +import org.apache.bcel.generic.IF_ICMPLT; +import org.apache.bcel.generic.IF_ICMPNE; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.PUSH; /** * Represents arithmetic expressions such as `(a + 12 == b) OR c'. @@ -48,7 +48,7 @@ import org.apache.commons.bcel6.generic.PUSH; * are discarded in the first pass. */ public class ASTExpr extends SimpleNode -implements MiniParserConstants, MiniParserTreeConstants, org.apache.commons.bcel6.Constants { +implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constants { protected int kind=-1; // Single twig to leaf? private int unop=-1; // Special case: Unary operand applied protected ASTExpr[] exprs; // Sub expressions diff --git a/src/examples/Mini/ASTFunAppl.java b/src/examples/Mini/ASTFunAppl.java index 8d75b916..eadb1cb4 100644 --- a/src/examples/Mini/ASTFunAppl.java +++ b/src/examples/Mini/ASTFunAppl.java @@ -19,18 +19,18 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.INVOKESTATIC; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.INVOKESTATIC; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.Type; /** * * @version $Id$ */ public class ASTFunAppl extends ASTExpr implements MiniParserTreeConstants, - org.apache.commons.bcel6.Constants { + org.apache.bcel.Constants { private ASTIdent name; private Function function; // Points to Function in environment diff --git a/src/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java index 6ebcef43..fef80cac 100644 --- a/src/examples/Mini/ASTFunDecl.java +++ b/src/examples/Mini/ASTFunDecl.java @@ -22,33 +22,33 @@ package Mini; import java.io.PrintWriter; import java.util.Iterator; -import org.apache.commons.bcel6.generic.ALOAD; -import org.apache.commons.bcel6.generic.ASTORE; -import org.apache.commons.bcel6.generic.ArrayType; -import org.apache.commons.bcel6.generic.BranchHandle; -import org.apache.commons.bcel6.generic.BranchInstruction; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.GETSTATIC; -import org.apache.commons.bcel6.generic.GOTO; -import org.apache.commons.bcel6.generic.INVOKEVIRTUAL; -import org.apache.commons.bcel6.generic.InstructionConstants; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.InstructionTargeter; -import org.apache.commons.bcel6.generic.LocalVariableGen; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.TargetLostException; -import org.apache.commons.bcel6.generic.Type; -import org.apache.commons.bcel6.util.InstructionFinder; +import org.apache.bcel.generic.ALOAD; +import org.apache.bcel.generic.ASTORE; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.BranchHandle; +import org.apache.bcel.generic.BranchInstruction; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GETSTATIC; +import org.apache.bcel.generic.GOTO; +import org.apache.bcel.generic.INVOKEVIRTUAL; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.InstructionTargeter; +import org.apache.bcel.generic.LocalVariableGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.TargetLostException; +import org.apache.bcel.generic.Type; +import org.apache.bcel.util.InstructionFinder; /** * * @version $Id$ */ public class ASTFunDecl extends SimpleNode -implements MiniParserTreeConstants, org.apache.commons.bcel6.Constants { +implements MiniParserTreeConstants, org.apache.bcel.Constants { private ASTIdent name; private ASTIdent[] argv; private ASTExpr body; diff --git a/src/examples/Mini/ASTIdent.java b/src/examples/Mini/ASTIdent.java index 2a44bdd7..1b7d6d06 100644 --- a/src/examples/Mini/ASTIdent.java +++ b/src/examples/Mini/ASTIdent.java @@ -19,18 +19,18 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.ILOAD; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.LocalVariableGen; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.PUSH; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.ILOAD; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.LocalVariableGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.PUSH; /** * * @version $Id$ */ -public class ASTIdent extends ASTExpr implements org.apache.commons.bcel6.Constants { +public class ASTIdent extends ASTExpr implements org.apache.bcel.Constants { private String name; private Variable reference; // Reference in environment to decl of this ident diff --git a/src/examples/Mini/ASTIfExpr.java b/src/examples/Mini/ASTIfExpr.java index 553fabed..5af056ee 100644 --- a/src/examples/Mini/ASTIfExpr.java +++ b/src/examples/Mini/ASTIfExpr.java @@ -19,19 +19,19 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.commons.bcel6.generic.BranchHandle; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.GOTO; -import org.apache.commons.bcel6.generic.IFEQ; -import org.apache.commons.bcel6.generic.InstructionConstants; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.bcel.generic.BranchHandle; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GOTO; +import org.apache.bcel.generic.IFEQ; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; /** * * @version $Id$ */ -public class ASTIfExpr extends ASTExpr implements org.apache.commons.bcel6.Constants { +public class ASTIfExpr extends ASTExpr implements org.apache.bcel.Constants { private ASTExpr if_expr, then_expr, else_expr; // Generated methods diff --git a/src/examples/Mini/ASTInteger.java b/src/examples/Mini/ASTInteger.java index 3a466b6f..afe76eb6 100644 --- a/src/examples/Mini/ASTInteger.java +++ b/src/examples/Mini/ASTInteger.java @@ -19,10 +19,10 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.PUSH; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.PUSH; /** * diff --git a/src/examples/Mini/ASTLetExpr.java b/src/examples/Mini/ASTLetExpr.java index fc04cca6..3b0a9c42 100644 --- a/src/examples/Mini/ASTLetExpr.java +++ b/src/examples/Mini/ASTLetExpr.java @@ -19,20 +19,20 @@ /* JJT: 0.3pre1 */ package Mini; -import org.apache.commons.bcel6.generic.BasicType; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.ISTORE; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.LocalVariableGen; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.generic.BasicType; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.ISTORE; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.LocalVariableGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.Type; /** * * @version $Id$ */ -public class ASTLetExpr extends ASTExpr implements org.apache.commons.bcel6.Constants { +public class ASTLetExpr extends ASTExpr implements org.apache.bcel.Constants { private ASTIdent[] idents; private ASTExpr[] exprs; private ASTExpr body; diff --git a/src/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java index 280b093e..eeda2944 100644 --- a/src/examples/Mini/ASTProgram.java +++ b/src/examples/Mini/ASTProgram.java @@ -21,23 +21,23 @@ package Mini; import java.io.PrintWriter; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.generic.ALOAD; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.GETSTATIC; -import org.apache.commons.bcel6.generic.ILOAD; -import org.apache.commons.bcel6.generic.INVOKESPECIAL; -import org.apache.commons.bcel6.generic.INVOKESTATIC; -import org.apache.commons.bcel6.generic.INVOKEVIRTUAL; -import org.apache.commons.bcel6.generic.InstructionConstants; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.NEW; -import org.apache.commons.bcel6.generic.PUSH; -import org.apache.commons.bcel6.generic.PUTSTATIC; -import org.apache.commons.bcel6.generic.RETURN; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.generic.ALOAD; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GETSTATIC; +import org.apache.bcel.generic.ILOAD; +import org.apache.bcel.generic.INVOKESPECIAL; +import org.apache.bcel.generic.INVOKESTATIC; +import org.apache.bcel.generic.INVOKEVIRTUAL; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.NEW; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.PUTSTATIC; +import org.apache.bcel.generic.RETURN; +import org.apache.bcel.generic.Type; /** * Root node of everything, direct children are nodes of type FunDecl @@ -45,7 +45,7 @@ import org.apache.commons.bcel6.generic.Type; * @version $Id$ */ public class ASTProgram extends SimpleNode -implements MiniParserConstants, MiniParserTreeConstants, org.apache.commons.bcel6.Constants { +implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constants { private ASTFunDecl[] fun_decls; // Children: Function declarations private Environment env; // Environment contains variables and functions diff --git a/src/examples/Mini/Function.java b/src/examples/Mini/Function.java index 4e3c154f..75048d58 100644 --- a/src/examples/Mini/Function.java +++ b/src/examples/Mini/Function.java @@ -23,7 +23,7 @@ package Mini; * * @version $Id$ */ -public class Function implements org.apache.commons.bcel6.Constants, EnvEntry { +public class Function implements org.apache.bcel.Constants, EnvEntry { private ASTIdent name; // Reference to the original declaration private ASTIdent[] args; // Reference to argument identifiers // private ASTExpr body; // Reference to function expression body diff --git a/src/examples/Mini/MiniC.java b/src/examples/Mini/MiniC.java index 08eab14f..f064f545 100644 --- a/src/examples/Mini/MiniC.java +++ b/src/examples/Mini/MiniC.java @@ -21,11 +21,11 @@ import java.io.FileOutputStream; import java.io.PrintWriter; import java.util.Vector; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; -public class MiniC implements org.apache.commons.bcel6.Constants { +public class MiniC implements org.apache.bcel.Constants { private static Vector errors = null; private static Vector warnings = null; private static String file = null; diff --git a/src/examples/Mini/Variable.java b/src/examples/Mini/Variable.java index d1e2b309..1df93b80 100644 --- a/src/examples/Mini/Variable.java +++ b/src/examples/Mini/Variable.java @@ -16,7 +16,7 @@ * */ package Mini; -import org.apache.commons.bcel6.generic.LocalVariableGen; +import org.apache.bcel.generic.LocalVariableGen; /** * Represents a variable declared in a LET expression or a FUN declaration. diff --git a/src/examples/Package.java b/src/examples/Package.java index 5a81031a..e0591f8d 100644 --- a/src/examples/Package.java +++ b/src/examples/Package.java @@ -27,14 +27,14 @@ import java.util.TreeMap; import java.util.jar.JarOutputStream; import java.util.zip.ZipEntry; -import org.apache.commons.bcel6.Constants; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.util.ClassPath; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.util.ClassPath; /** * Package the client. Creates a jar file in the current directory diff --git a/src/examples/Peephole.java b/src/examples/Peephole.java index 660f7d3d..41d7bc38 100644 --- a/src/examples/Peephole.java +++ b/src/examples/Peephole.java @@ -18,16 +18,16 @@ import java.util.Iterator; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.InstructionTargeter; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.TargetLostException; -import org.apache.commons.bcel6.util.InstructionFinder; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.InstructionTargeter; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.TargetLostException; +import org.apache.bcel.util.InstructionFinder; /** * Remove NOPs from given class diff --git a/src/examples/ProxyCreator.java b/src/examples/ProxyCreator.java index bf374b14..82073fb0 100644 --- a/src/examples/ProxyCreator.java +++ b/src/examples/ProxyCreator.java @@ -19,25 +19,25 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import org.apache.commons.bcel6.Constants; -import org.apache.commons.bcel6.classfile.Utility; -import org.apache.commons.bcel6.generic.ALOAD; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.GETSTATIC; -import org.apache.commons.bcel6.generic.INVOKEVIRTUAL; -import org.apache.commons.bcel6.generic.InstructionConstants; -import org.apache.commons.bcel6.generic.InstructionFactory; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.PUSH; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.generic.ALOAD; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GETSTATIC; +import org.apache.bcel.generic.INVOKEVIRTUAL; +import org.apache.bcel.generic.InstructionConstants; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.Type; /** * Dynamically creates and uses a proxy for {@code java.awt.event.ActionListener} * via the classloader mechanism if called with - *

    java org.apache.commons.bcel6.util.JavaWrapper ProxyCreator
    + *
    java org.apache.bcel.util.JavaWrapper ProxyCreator
    * * The trick is to encode the byte code we need into the class name * using the Utility.encode() method. This will result however in big @@ -47,7 +47,7 @@ import org.apache.commons.bcel6.generic.Type; * {@code java.lang.reflect.Proxy}, but much more flexible. * * @version $Id$ - * @see org.apache.commons.bcel6.util.JavaWrapper + * @see org.apache.bcel.util.JavaWrapper * @see Utility */ public class ProxyCreator { @@ -76,7 +76,7 @@ public class ProxyCreator { // instanceof won't work here ... // TODO this is broken; cannot ever be true now that ClassLoader has been dropped - if (loader.getClass().toString().equals("class org.apache.commons.bcel6.util.ClassLoader")) { + if (loader.getClass().toString().equals("class org.apache.bcel.util.ClassLoader")) { // Real class name will be set by the class loader ClassGen cg = new ClassGen("foo", "java.lang.Object", "", Constants.ACC_PUBLIC, new String[]{"java.awt.event.ActionListener"}); @@ -128,7 +128,7 @@ public class ProxyCreator { a.actionPerformed(new ActionEvent(a, ActionEvent.ACTION_PERFORMED, "hello")); } else { - System.err.println("Call me with java org.apache.commons.bcel6.util.JavaWrapper ProxyCreator"); + System.err.println("Call me with java org.apache.bcel.util.JavaWrapper ProxyCreator"); } } diff --git a/src/examples/TransitiveHull.java b/src/examples/TransitiveHull.java index cb2e2c7a..36df5d7a 100644 --- a/src/examples/TransitiveHull.java +++ b/src/examples/TransitiveHull.java @@ -19,22 +19,22 @@ import java.util.Arrays; import java.util.regex.Pattern; -import org.apache.commons.bcel6.Constants; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.ConstantCP; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantFieldref; -import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; -import org.apache.commons.bcel6.classfile.ConstantMethodref; -import org.apache.commons.bcel6.classfile.ConstantNameAndType; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.generic.ArrayType; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.Type; -import org.apache.commons.bcel6.util.ClassQueue; -import org.apache.commons.bcel6.util.ClassSet; +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.ConstantCP; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.Type; +import org.apache.bcel.util.ClassQueue; +import org.apache.bcel.util.ClassSet; /** * Find all classes referenced by given start class and all classes referenced @@ -51,7 +51,7 @@ import org.apache.commons.bcel6.util.ClassSet; * * @version $Id$ */ -public class TransitiveHull extends org.apache.commons.bcel6.classfile.EmptyVisitor { +public class TransitiveHull extends org.apache.bcel.classfile.EmptyVisitor { private ClassQueue queue; private ClassSet set; @@ -84,7 +84,7 @@ public class TransitiveHull extends org.apache.commons.bcel6.classfile.EmptyVisi JavaClass clazz = queue.dequeue(); cp = clazz.getConstantPool(); - new org.apache.commons.bcel6.classfile.DescendingVisitor(clazz, this).visit(); + new org.apache.bcel.classfile.DescendingVisitor(clazz, this).visit(); } } diff --git a/src/examples/helloify.java b/src/examples/helloify.java index eba317c1..d53be252 100644 --- a/src/examples/helloify.java +++ b/src/examples/helloify.java @@ -16,23 +16,23 @@ * */ -import org.apache.commons.bcel6.Constants; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.Code; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.Utility; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.GETSTATIC; -import org.apache.commons.bcel6.generic.INVOKESPECIAL; -import org.apache.commons.bcel6.generic.INVOKEVIRTUAL; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.PUSH; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.GETSTATIC; +import org.apache.bcel.generic.INVOKESPECIAL; +import org.apache.bcel.generic.INVOKEVIRTUAL; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.PUSH; /** * Read class file(s) and patch all of its methods, so that they print diff --git a/src/examples/id.java b/src/examples/id.java index b708d724..d4572156 100644 --- a/src/examples/id.java +++ b/src/examples/id.java @@ -16,14 +16,14 @@ * */ -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.FieldGen; -import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.FieldGen; +import org.apache.bcel.generic.MethodGen; /** * Test BCEL if an input file is identical to the outfile generated diff --git a/src/examples/listclass.java b/src/examples/listclass.java index cd65e525..d0203114 100644 --- a/src/examples/listclass.java +++ b/src/examples/listclass.java @@ -22,16 +22,16 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.bcel6.Constants; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.Code; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; +import org.apache.bcel.Constants; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; /** * Read class file(s) and display its contents. The command line usage is: diff --git a/src/examples/maxstack.java b/src/examples/maxstack.java index eb29924d..b61e3bda 100644 --- a/src/examples/maxstack.java +++ b/src/examples/maxstack.java @@ -16,12 +16,12 @@ * */ -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.MethodGen; /** * Read class file(s) and examine all of its methods, determining the diff --git a/src/examples/patchclass.java b/src/examples/patchclass.java index 583009a9..0637a233 100644 --- a/src/examples/patchclass.java +++ b/src/examples/patchclass.java @@ -16,10 +16,10 @@ * */ -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.JavaClass; /** * Patch all Utf8 constants in the given class file file.class diff --git a/src/main/java/org/apache/commons/bcel6/Const.java b/src/main/java/org/apache/bcel/Const.java similarity index 99% rename from src/main/java/org/apache/commons/bcel6/Const.java rename to src/main/java/org/apache/bcel/Const.java index 6a2764f8..69da2784 100644 --- a/src/main/java/org/apache/commons/bcel6/Const.java +++ b/src/main/java/org/apache/bcel/Const.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6; +package org.apache.bcel; import java.util.Arrays; import java.util.Collections; diff --git a/src/main/java/org/apache/commons/bcel6/Constants.java b/src/main/java/org/apache/bcel/Constants.java similarity index 99% rename from src/main/java/org/apache/commons/bcel6/Constants.java rename to src/main/java/org/apache/bcel/Constants.java index afa6495b..34265f20 100644 --- a/src/main/java/org/apache/commons/bcel6/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6; +package org.apache.bcel; /** * Constants for the project, mostly defined in the JVM specification. diff --git a/src/main/java/org/apache/commons/bcel6/ExceptionConst.java b/src/main/java/org/apache/bcel/ExceptionConst.java similarity index 99% rename from src/main/java/org/apache/commons/bcel6/ExceptionConst.java rename to src/main/java/org/apache/bcel/ExceptionConst.java index 2eeabecc..a8d291a3 100644 --- a/src/main/java/org/apache/commons/bcel6/ExceptionConst.java +++ b/src/main/java/org/apache/bcel/ExceptionConst.java @@ -1,4 +1,4 @@ -package org.apache.commons.bcel6; +package org.apache.bcel; /** * Exception constants. diff --git a/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java b/src/main/java/org/apache/bcel/ExceptionConstants.java similarity index 99% rename from src/main/java/org/apache/commons/bcel6/ExceptionConstants.java rename to src/main/java/org/apache/bcel/ExceptionConstants.java index 1f129622..10089d21 100644 --- a/src/main/java/org/apache/commons/bcel6/ExceptionConstants.java +++ b/src/main/java/org/apache/bcel/ExceptionConstants.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6; +package org.apache.bcel; /** * Exception constants. diff --git a/src/main/java/org/apache/commons/bcel6/Repository.java b/src/main/java/org/apache/bcel/Repository.java similarity index 94% rename from src/main/java/org/apache/commons/bcel6/Repository.java rename to src/main/java/org/apache/bcel/Repository.java index 1afa0e88..263dab20 100644 --- a/src/main/java/org/apache/commons/bcel6/Repository.java +++ b/src/main/java/org/apache/bcel/Repository.java @@ -15,39 +15,39 @@ * limitations under the License. * */ -package org.apache.commons.bcel6; +package org.apache.bcel; import java.io.IOException; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.util.ClassPath; -import org.apache.commons.bcel6.util.SyntheticRepository; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.util.ClassPath; +import org.apache.bcel.util.SyntheticRepository; /** * The repository maintains informations about class interdependencies, e.g., * whether a class is a sub-class of another. Delegates actual class loading * to SyntheticRepository with current class path by default. * - * @see org.apache.commons.bcel6.util.Repository + * @see org.apache.bcel.util.Repository * @see SyntheticRepository * * @version $Id$ */ public abstract class Repository { - private static org.apache.commons.bcel6.util.Repository _repository = SyntheticRepository.getInstance(); + private static org.apache.bcel.util.Repository _repository = SyntheticRepository.getInstance(); /** @return currently used repository instance */ - public static org.apache.commons.bcel6.util.Repository getRepository() { + public static org.apache.bcel.util.Repository getRepository() { return _repository; } /** Set repository instance to be used for class loading */ - public static void setRepository( final org.apache.commons.bcel6.util.Repository rep ) { + public static void setRepository( final org.apache.bcel.util.Repository rep ) { _repository = rep; } diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java b/src/main/java/org/apache/bcel/classfile/AccessFlags.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/AccessFlags.java rename to src/main/java/org/apache/bcel/classfile/AccessFlags.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/AnnotationDefault.java rename to src/main/java/org/apache/bcel/classfile/AnnotationDefault.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationElementValue.java b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/AnnotationElementValue.java rename to src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/AnnotationEntry.java rename to src/main/java/org/apache/bcel/classfile/AnnotationEntry.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Annotations.java rename to src/main/java/org/apache/bcel/classfile/Annotations.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ArrayElementValue.java rename to src/main/java/org/apache/bcel/classfile/ArrayElementValue.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Attribute.java rename to src/main/java/org/apache/bcel/classfile/Attribute.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java b/src/main/java/org/apache/bcel/classfile/AttributeReader.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/AttributeReader.java rename to src/main/java/org/apache/bcel/classfile/AttributeReader.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethod.java rename to src/main/java/org/apache/bcel/classfile/BootstrapMethod.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/BootstrapMethods.java rename to src/main/java/org/apache/bcel/classfile/BootstrapMethods.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ClassElementValue.java b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ClassElementValue.java rename to src/main/java/org/apache/bcel/classfile/ClassElementValue.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ClassFormatException.java rename to src/main/java/org/apache/bcel/classfile/ClassFormatException.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ClassParser.java rename to src/main/java/org/apache/bcel/classfile/ClassParser.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Code.java rename to src/main/java/org/apache/bcel/classfile/Code.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/CodeException.java b/src/main/java/org/apache/bcel/classfile/CodeException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/CodeException.java rename to src/main/java/org/apache/bcel/classfile/CodeException.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Constant.java rename to src/main/java/org/apache/bcel/classfile/Constant.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java b/src/main/java/org/apache/bcel/classfile/ConstantCP.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantCP.java rename to src/main/java/org/apache/bcel/classfile/ConstantCP.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java b/src/main/java/org/apache/bcel/classfile/ConstantClass.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantClass.java rename to src/main/java/org/apache/bcel/classfile/ConstantClass.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantDouble.java rename to src/main/java/org/apache/bcel/classfile/ConstantDouble.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantFieldref.java rename to src/main/java/org/apache/bcel/classfile/ConstantFieldref.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantFloat.java rename to src/main/java/org/apache/bcel/classfile/ConstantFloat.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantInteger.java rename to src/main/java/org/apache/bcel/classfile/ConstantInteger.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantInterfaceMethodref.java rename to src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java b/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantInvokeDynamic.java rename to src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java b/src/main/java/org/apache/bcel/classfile/ConstantLong.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantLong.java rename to src/main/java/org/apache/bcel/classfile/ConstantLong.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodHandle.java rename to src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodType.java rename to src/main/java/org/apache/bcel/classfile/ConstantMethodType.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantMethodref.java rename to src/main/java/org/apache/bcel/classfile/ConstantMethodref.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantNameAndType.java rename to src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantObject.java b/src/main/java/org/apache/bcel/classfile/ConstantObject.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantObject.java rename to src/main/java/org/apache/bcel/classfile/ConstantObject.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantPool.java rename to src/main/java/org/apache/bcel/classfile/ConstantPool.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java b/src/main/java/org/apache/bcel/classfile/ConstantString.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantString.java rename to src/main/java/org/apache/bcel/classfile/ConstantString.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantUtf8.java rename to src/main/java/org/apache/bcel/classfile/ConstantUtf8.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java b/src/main/java/org/apache/bcel/classfile/ConstantValue.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ConstantValue.java rename to src/main/java/org/apache/bcel/classfile/ConstantValue.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java b/src/main/java/org/apache/bcel/classfile/Deprecated.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Deprecated.java rename to src/main/java/org/apache/bcel/classfile/Deprecated.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/DescendingVisitor.java rename to src/main/java/org/apache/bcel/classfile/DescendingVisitor.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ElementValue.java rename to src/main/java/org/apache/bcel/classfile/ElementValue.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ElementValuePair.java rename to src/main/java/org/apache/bcel/classfile/ElementValuePair.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/EmptyVisitor.java rename to src/main/java/org/apache/bcel/classfile/EmptyVisitor.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/EnclosingMethod.java rename to src/main/java/org/apache/bcel/classfile/EnclosingMethod.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/EnumElementValue.java b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/EnumElementValue.java rename to src/main/java/org/apache/bcel/classfile/EnumElementValue.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ExceptionTable.java rename to src/main/java/org/apache/bcel/classfile/ExceptionTable.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Field.java rename to src/main/java/org/apache/bcel/classfile/Field.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/FieldOrMethod.java rename to src/main/java/org/apache/bcel/classfile/FieldOrMethod.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java b/src/main/java/org/apache/bcel/classfile/InnerClass.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/InnerClass.java rename to src/main/java/org/apache/bcel/classfile/InnerClass.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java b/src/main/java/org/apache/bcel/classfile/InnerClasses.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/InnerClasses.java rename to src/main/java/org/apache/bcel/classfile/InnerClasses.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/JavaClass.java rename to src/main/java/org/apache/bcel/classfile/JavaClass.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java b/src/main/java/org/apache/bcel/classfile/LineNumber.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/LineNumber.java rename to src/main/java/org/apache/bcel/classfile/LineNumber.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/LineNumberTable.java rename to src/main/java/org/apache/bcel/classfile/LineNumberTable.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/LocalVariable.java rename to src/main/java/org/apache/bcel/classfile/LocalVariable.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTable.java rename to src/main/java/org/apache/bcel/classfile/LocalVariableTable.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/LocalVariableTypeTable.java rename to src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Method.java rename to src/main/java/org/apache/bcel/classfile/Method.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java b/src/main/java/org/apache/bcel/classfile/MethodParameter.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/MethodParameter.java rename to src/main/java/org/apache/bcel/classfile/MethodParameter.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java b/src/main/java/org/apache/bcel/classfile/MethodParameters.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/MethodParameters.java rename to src/main/java/org/apache/bcel/classfile/MethodParameters.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Node.java b/src/main/java/org/apache/bcel/classfile/Node.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Node.java rename to src/main/java/org/apache/bcel/classfile/Node.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/PMGClass.java rename to src/main/java/org/apache/bcel/classfile/PMGClass.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotationEntry.java rename to src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/ParameterAnnotations.java rename to src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleAnnotations.java rename to src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/RuntimeInvisibleParameterAnnotations.java rename to src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleAnnotations.java rename to src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/RuntimeVisibleParameterAnnotations.java rename to src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Signature.java rename to src/main/java/org/apache/bcel/classfile/Signature.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/SimpleElementValue.java rename to src/main/java/org/apache/bcel/classfile/SimpleElementValue.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/SourceFile.java rename to src/main/java/org/apache/bcel/classfile/SourceFile.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/StackMap.java rename to src/main/java/org/apache/bcel/classfile/StackMap.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/StackMapEntry.java rename to src/main/java/org/apache/bcel/classfile/StackMapEntry.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java b/src/main/java/org/apache/bcel/classfile/StackMapType.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/StackMapType.java rename to src/main/java/org/apache/bcel/classfile/StackMapType.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java b/src/main/java/org/apache/bcel/classfile/Synthetic.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Synthetic.java rename to src/main/java/org/apache/bcel/classfile/Synthetic.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Unknown.java rename to src/main/java/org/apache/bcel/classfile/Unknown.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java b/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/UnknownAttributeReader.java rename to src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Utility.java rename to src/main/java/org/apache/bcel/classfile/Utility.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/Visitor.java rename to src/main/java/org/apache/bcel/classfile/Visitor.java diff --git a/src/main/java/org/apache/commons/bcel6/classfile/package.html b/src/main/java/org/apache/bcel/classfile/package.html similarity index 100% rename from src/main/java/org/apache/commons/bcel6/classfile/package.html rename to src/main/java/org/apache/bcel/classfile/package.html diff --git a/src/main/java/org/apache/commons/bcel6/generic/AALOAD.java b/src/main/java/org/apache/bcel/generic/AALOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/AALOAD.java rename to src/main/java/org/apache/bcel/generic/AALOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/AASTORE.java b/src/main/java/org/apache/bcel/generic/AASTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/AASTORE.java rename to src/main/java/org/apache/bcel/generic/AASTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ACONST_NULL.java rename to src/main/java/org/apache/bcel/generic/ACONST_NULL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ALOAD.java b/src/main/java/org/apache/bcel/generic/ALOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ALOAD.java rename to src/main/java/org/apache/bcel/generic/ALOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ANEWARRAY.java rename to src/main/java/org/apache/bcel/generic/ANEWARRAY.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ARETURN.java b/src/main/java/org/apache/bcel/generic/ARETURN.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ARETURN.java rename to src/main/java/org/apache/bcel/generic/ARETURN.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ARRAYLENGTH.java rename to src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ASTORE.java b/src/main/java/org/apache/bcel/generic/ASTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ASTORE.java rename to src/main/java/org/apache/bcel/generic/ASTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ATHROW.java b/src/main/java/org/apache/bcel/generic/ATHROW.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ATHROW.java rename to src/main/java/org/apache/bcel/generic/ATHROW.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/AllocationInstruction.java b/src/main/java/org/apache/bcel/generic/AllocationInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/AllocationInstruction.java rename to src/main/java/org/apache/bcel/generic/AllocationInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/AnnotationElementValueGen.java rename to src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/AnnotationEntryGen.java rename to src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java b/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ArithmeticInstruction.java rename to src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ArrayElementValueGen.java rename to src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java b/src/main/java/org/apache/bcel/generic/ArrayInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ArrayInstruction.java rename to src/main/java/org/apache/bcel/generic/ArrayInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ArrayType.java b/src/main/java/org/apache/bcel/generic/ArrayType.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ArrayType.java rename to src/main/java/org/apache/bcel/generic/ArrayType.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/BALOAD.java b/src/main/java/org/apache/bcel/generic/BALOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/BALOAD.java rename to src/main/java/org/apache/bcel/generic/BALOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/BASTORE.java b/src/main/java/org/apache/bcel/generic/BASTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/BASTORE.java rename to src/main/java/org/apache/bcel/generic/BASTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java b/src/main/java/org/apache/bcel/generic/BIPUSH.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/BIPUSH.java rename to src/main/java/org/apache/bcel/generic/BIPUSH.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/BREAKPOINT.java rename to src/main/java/org/apache/bcel/generic/BREAKPOINT.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/BasicType.java b/src/main/java/org/apache/bcel/generic/BasicType.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/BasicType.java rename to src/main/java/org/apache/bcel/generic/BasicType.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java b/src/main/java/org/apache/bcel/generic/BranchHandle.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/BranchHandle.java rename to src/main/java/org/apache/bcel/generic/BranchHandle.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java b/src/main/java/org/apache/bcel/generic/BranchInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/BranchInstruction.java rename to src/main/java/org/apache/bcel/generic/BranchInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/CALOAD.java b/src/main/java/org/apache/bcel/generic/CALOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/CALOAD.java rename to src/main/java/org/apache/bcel/generic/CALOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/CASTORE.java b/src/main/java/org/apache/bcel/generic/CASTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/CASTORE.java rename to src/main/java/org/apache/bcel/generic/CASTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java b/src/main/java/org/apache/bcel/generic/CHECKCAST.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/CHECKCAST.java rename to src/main/java/org/apache/bcel/generic/CHECKCAST.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java b/src/main/java/org/apache/bcel/generic/CPInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/CPInstruction.java rename to src/main/java/org/apache/bcel/generic/CPInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ClassElementValueGen.java rename to src/main/java/org/apache/bcel/generic/ClassElementValueGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ClassGen.java rename to src/main/java/org/apache/bcel/generic/ClassGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java b/src/main/java/org/apache/bcel/generic/ClassGenException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ClassGenException.java rename to src/main/java/org/apache/bcel/generic/ClassGenException.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ClassObserver.java b/src/main/java/org/apache/bcel/generic/ClassObserver.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ClassObserver.java rename to src/main/java/org/apache/bcel/generic/ClassObserver.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/CodeExceptionGen.java rename to src/main/java/org/apache/bcel/generic/CodeExceptionGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/CompoundInstruction.java b/src/main/java/org/apache/bcel/generic/CompoundInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/CompoundInstruction.java rename to src/main/java/org/apache/bcel/generic/CompoundInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ConstantPoolGen.java rename to src/main/java/org/apache/bcel/generic/ConstantPoolGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConstantPushInstruction.java b/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ConstantPushInstruction.java rename to src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java b/src/main/java/org/apache/bcel/generic/ConversionInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ConversionInstruction.java rename to src/main/java/org/apache/bcel/generic/ConversionInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/D2F.java b/src/main/java/org/apache/bcel/generic/D2F.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/D2F.java rename to src/main/java/org/apache/bcel/generic/D2F.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/D2I.java b/src/main/java/org/apache/bcel/generic/D2I.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/D2I.java rename to src/main/java/org/apache/bcel/generic/D2I.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/D2L.java b/src/main/java/org/apache/bcel/generic/D2L.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/D2L.java rename to src/main/java/org/apache/bcel/generic/D2L.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DADD.java b/src/main/java/org/apache/bcel/generic/DADD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DADD.java rename to src/main/java/org/apache/bcel/generic/DADD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DALOAD.java b/src/main/java/org/apache/bcel/generic/DALOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DALOAD.java rename to src/main/java/org/apache/bcel/generic/DALOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DASTORE.java b/src/main/java/org/apache/bcel/generic/DASTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DASTORE.java rename to src/main/java/org/apache/bcel/generic/DASTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCMPG.java b/src/main/java/org/apache/bcel/generic/DCMPG.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DCMPG.java rename to src/main/java/org/apache/bcel/generic/DCMPG.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCMPL.java b/src/main/java/org/apache/bcel/generic/DCMPL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DCMPL.java rename to src/main/java/org/apache/bcel/generic/DCMPL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DCONST.java b/src/main/java/org/apache/bcel/generic/DCONST.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DCONST.java rename to src/main/java/org/apache/bcel/generic/DCONST.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DDIV.java b/src/main/java/org/apache/bcel/generic/DDIV.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DDIV.java rename to src/main/java/org/apache/bcel/generic/DDIV.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DLOAD.java b/src/main/java/org/apache/bcel/generic/DLOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DLOAD.java rename to src/main/java/org/apache/bcel/generic/DLOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DMUL.java b/src/main/java/org/apache/bcel/generic/DMUL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DMUL.java rename to src/main/java/org/apache/bcel/generic/DMUL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DNEG.java b/src/main/java/org/apache/bcel/generic/DNEG.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DNEG.java rename to src/main/java/org/apache/bcel/generic/DNEG.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DREM.java b/src/main/java/org/apache/bcel/generic/DREM.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DREM.java rename to src/main/java/org/apache/bcel/generic/DREM.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DRETURN.java b/src/main/java/org/apache/bcel/generic/DRETURN.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DRETURN.java rename to src/main/java/org/apache/bcel/generic/DRETURN.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DSTORE.java b/src/main/java/org/apache/bcel/generic/DSTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DSTORE.java rename to src/main/java/org/apache/bcel/generic/DSTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DSUB.java b/src/main/java/org/apache/bcel/generic/DSUB.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DSUB.java rename to src/main/java/org/apache/bcel/generic/DSUB.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP.java b/src/main/java/org/apache/bcel/generic/DUP.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DUP.java rename to src/main/java/org/apache/bcel/generic/DUP.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP2.java b/src/main/java/org/apache/bcel/generic/DUP2.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DUP2.java rename to src/main/java/org/apache/bcel/generic/DUP2.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java b/src/main/java/org/apache/bcel/generic/DUP2_X1.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DUP2_X1.java rename to src/main/java/org/apache/bcel/generic/DUP2_X1.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java b/src/main/java/org/apache/bcel/generic/DUP2_X2.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DUP2_X2.java rename to src/main/java/org/apache/bcel/generic/DUP2_X2.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java b/src/main/java/org/apache/bcel/generic/DUP_X1.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DUP_X1.java rename to src/main/java/org/apache/bcel/generic/DUP_X1.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java b/src/main/java/org/apache/bcel/generic/DUP_X2.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/DUP_X2.java rename to src/main/java/org/apache/bcel/generic/DUP_X2.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ElementValueGen.java rename to src/main/java/org/apache/bcel/generic/ElementValueGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ElementValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ElementValuePairGen.java rename to src/main/java/org/apache/bcel/generic/ElementValuePairGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/EmptyVisitor.java rename to src/main/java/org/apache/bcel/generic/EmptyVisitor.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/EnumElementValueGen.java rename to src/main/java/org/apache/bcel/generic/EnumElementValueGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ExceptionThrower.java b/src/main/java/org/apache/bcel/generic/ExceptionThrower.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ExceptionThrower.java rename to src/main/java/org/apache/bcel/generic/ExceptionThrower.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/F2D.java b/src/main/java/org/apache/bcel/generic/F2D.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/F2D.java rename to src/main/java/org/apache/bcel/generic/F2D.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/F2I.java b/src/main/java/org/apache/bcel/generic/F2I.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/F2I.java rename to src/main/java/org/apache/bcel/generic/F2I.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/F2L.java b/src/main/java/org/apache/bcel/generic/F2L.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/F2L.java rename to src/main/java/org/apache/bcel/generic/F2L.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FADD.java b/src/main/java/org/apache/bcel/generic/FADD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FADD.java rename to src/main/java/org/apache/bcel/generic/FADD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FALOAD.java b/src/main/java/org/apache/bcel/generic/FALOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FALOAD.java rename to src/main/java/org/apache/bcel/generic/FALOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FASTORE.java b/src/main/java/org/apache/bcel/generic/FASTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FASTORE.java rename to src/main/java/org/apache/bcel/generic/FASTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCMPG.java b/src/main/java/org/apache/bcel/generic/FCMPG.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FCMPG.java rename to src/main/java/org/apache/bcel/generic/FCMPG.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCMPL.java b/src/main/java/org/apache/bcel/generic/FCMPL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FCMPL.java rename to src/main/java/org/apache/bcel/generic/FCMPL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FCONST.java b/src/main/java/org/apache/bcel/generic/FCONST.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FCONST.java rename to src/main/java/org/apache/bcel/generic/FCONST.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FDIV.java b/src/main/java/org/apache/bcel/generic/FDIV.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FDIV.java rename to src/main/java/org/apache/bcel/generic/FDIV.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FLOAD.java b/src/main/java/org/apache/bcel/generic/FLOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FLOAD.java rename to src/main/java/org/apache/bcel/generic/FLOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FMUL.java b/src/main/java/org/apache/bcel/generic/FMUL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FMUL.java rename to src/main/java/org/apache/bcel/generic/FMUL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FNEG.java b/src/main/java/org/apache/bcel/generic/FNEG.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FNEG.java rename to src/main/java/org/apache/bcel/generic/FNEG.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FREM.java b/src/main/java/org/apache/bcel/generic/FREM.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FREM.java rename to src/main/java/org/apache/bcel/generic/FREM.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FRETURN.java b/src/main/java/org/apache/bcel/generic/FRETURN.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FRETURN.java rename to src/main/java/org/apache/bcel/generic/FRETURN.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FSTORE.java b/src/main/java/org/apache/bcel/generic/FSTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FSTORE.java rename to src/main/java/org/apache/bcel/generic/FSTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FSUB.java b/src/main/java/org/apache/bcel/generic/FSUB.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FSUB.java rename to src/main/java/org/apache/bcel/generic/FSUB.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FieldGen.java rename to src/main/java/org/apache/bcel/generic/FieldGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FieldGenOrMethodGen.java rename to src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java b/src/main/java/org/apache/bcel/generic/FieldInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FieldInstruction.java rename to src/main/java/org/apache/bcel/generic/FieldInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldObserver.java b/src/main/java/org/apache/bcel/generic/FieldObserver.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FieldObserver.java rename to src/main/java/org/apache/bcel/generic/FieldObserver.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/FieldOrMethod.java rename to src/main/java/org/apache/bcel/generic/FieldOrMethod.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java b/src/main/java/org/apache/bcel/generic/GETFIELD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/GETFIELD.java rename to src/main/java/org/apache/bcel/generic/GETFIELD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java b/src/main/java/org/apache/bcel/generic/GETSTATIC.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/GETSTATIC.java rename to src/main/java/org/apache/bcel/generic/GETSTATIC.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/GOTO.java b/src/main/java/org/apache/bcel/generic/GOTO.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/GOTO.java rename to src/main/java/org/apache/bcel/generic/GOTO.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java b/src/main/java/org/apache/bcel/generic/GOTO_W.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/GOTO_W.java rename to src/main/java/org/apache/bcel/generic/GOTO_W.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java b/src/main/java/org/apache/bcel/generic/GotoInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/GotoInstruction.java rename to src/main/java/org/apache/bcel/generic/GotoInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2B.java b/src/main/java/org/apache/bcel/generic/I2B.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/I2B.java rename to src/main/java/org/apache/bcel/generic/I2B.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2C.java b/src/main/java/org/apache/bcel/generic/I2C.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/I2C.java rename to src/main/java/org/apache/bcel/generic/I2C.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2D.java b/src/main/java/org/apache/bcel/generic/I2D.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/I2D.java rename to src/main/java/org/apache/bcel/generic/I2D.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2F.java b/src/main/java/org/apache/bcel/generic/I2F.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/I2F.java rename to src/main/java/org/apache/bcel/generic/I2F.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2L.java b/src/main/java/org/apache/bcel/generic/I2L.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/I2L.java rename to src/main/java/org/apache/bcel/generic/I2L.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/I2S.java b/src/main/java/org/apache/bcel/generic/I2S.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/I2S.java rename to src/main/java/org/apache/bcel/generic/I2S.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IADD.java b/src/main/java/org/apache/bcel/generic/IADD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IADD.java rename to src/main/java/org/apache/bcel/generic/IADD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IALOAD.java b/src/main/java/org/apache/bcel/generic/IALOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IALOAD.java rename to src/main/java/org/apache/bcel/generic/IALOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IAND.java b/src/main/java/org/apache/bcel/generic/IAND.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IAND.java rename to src/main/java/org/apache/bcel/generic/IAND.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IASTORE.java b/src/main/java/org/apache/bcel/generic/IASTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IASTORE.java rename to src/main/java/org/apache/bcel/generic/IASTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ICONST.java b/src/main/java/org/apache/bcel/generic/ICONST.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ICONST.java rename to src/main/java/org/apache/bcel/generic/ICONST.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IDIV.java b/src/main/java/org/apache/bcel/generic/IDIV.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IDIV.java rename to src/main/java/org/apache/bcel/generic/IDIV.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFEQ.java b/src/main/java/org/apache/bcel/generic/IFEQ.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IFEQ.java rename to src/main/java/org/apache/bcel/generic/IFEQ.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFGE.java b/src/main/java/org/apache/bcel/generic/IFGE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IFGE.java rename to src/main/java/org/apache/bcel/generic/IFGE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFGT.java b/src/main/java/org/apache/bcel/generic/IFGT.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IFGT.java rename to src/main/java/org/apache/bcel/generic/IFGT.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFLE.java b/src/main/java/org/apache/bcel/generic/IFLE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IFLE.java rename to src/main/java/org/apache/bcel/generic/IFLE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFLT.java b/src/main/java/org/apache/bcel/generic/IFLT.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IFLT.java rename to src/main/java/org/apache/bcel/generic/IFLT.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNE.java b/src/main/java/org/apache/bcel/generic/IFNE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IFNE.java rename to src/main/java/org/apache/bcel/generic/IFNE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java b/src/main/java/org/apache/bcel/generic/IFNONNULL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IFNONNULL.java rename to src/main/java/org/apache/bcel/generic/IFNONNULL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IFNULL.java b/src/main/java/org/apache/bcel/generic/IFNULL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IFNULL.java rename to src/main/java/org/apache/bcel/generic/IFNULL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IF_ACMPEQ.java rename to src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IF_ACMPNE.java rename to src/main/java/org/apache/bcel/generic/IF_ACMPNE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IF_ICMPEQ.java rename to src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGE.java rename to src/main/java/org/apache/bcel/generic/IF_ICMPGE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IF_ICMPGT.java rename to src/main/java/org/apache/bcel/generic/IF_ICMPGT.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLE.java rename to src/main/java/org/apache/bcel/generic/IF_ICMPLE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IF_ICMPLT.java rename to src/main/java/org/apache/bcel/generic/IF_ICMPLT.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IF_ICMPNE.java rename to src/main/java/org/apache/bcel/generic/IF_ICMPNE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IINC.java b/src/main/java/org/apache/bcel/generic/IINC.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IINC.java rename to src/main/java/org/apache/bcel/generic/IINC.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ILOAD.java b/src/main/java/org/apache/bcel/generic/ILOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ILOAD.java rename to src/main/java/org/apache/bcel/generic/ILOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java b/src/main/java/org/apache/bcel/generic/IMPDEP1.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IMPDEP1.java rename to src/main/java/org/apache/bcel/generic/IMPDEP1.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java b/src/main/java/org/apache/bcel/generic/IMPDEP2.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IMPDEP2.java rename to src/main/java/org/apache/bcel/generic/IMPDEP2.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IMUL.java b/src/main/java/org/apache/bcel/generic/IMUL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IMUL.java rename to src/main/java/org/apache/bcel/generic/IMUL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/INEG.java b/src/main/java/org/apache/bcel/generic/INEG.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/INEG.java rename to src/main/java/org/apache/bcel/generic/INEG.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/INSTANCEOF.java rename to src/main/java/org/apache/bcel/generic/INSTANCEOF.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/INVOKEDYNAMIC.java rename to src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/INVOKEINTERFACE.java rename to src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/INVOKESPECIAL.java rename to src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/INVOKESTATIC.java rename to src/main/java/org/apache/bcel/generic/INVOKESTATIC.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/INVOKEVIRTUAL.java rename to src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IOR.java b/src/main/java/org/apache/bcel/generic/IOR.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IOR.java rename to src/main/java/org/apache/bcel/generic/IOR.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IREM.java b/src/main/java/org/apache/bcel/generic/IREM.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IREM.java rename to src/main/java/org/apache/bcel/generic/IREM.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IRETURN.java b/src/main/java/org/apache/bcel/generic/IRETURN.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IRETURN.java rename to src/main/java/org/apache/bcel/generic/IRETURN.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISHL.java b/src/main/java/org/apache/bcel/generic/ISHL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ISHL.java rename to src/main/java/org/apache/bcel/generic/ISHL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISHR.java b/src/main/java/org/apache/bcel/generic/ISHR.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ISHR.java rename to src/main/java/org/apache/bcel/generic/ISHR.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISTORE.java b/src/main/java/org/apache/bcel/generic/ISTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ISTORE.java rename to src/main/java/org/apache/bcel/generic/ISTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ISUB.java b/src/main/java/org/apache/bcel/generic/ISUB.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ISUB.java rename to src/main/java/org/apache/bcel/generic/ISUB.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IUSHR.java b/src/main/java/org/apache/bcel/generic/IUSHR.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IUSHR.java rename to src/main/java/org/apache/bcel/generic/IUSHR.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IXOR.java b/src/main/java/org/apache/bcel/generic/IXOR.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IXOR.java rename to src/main/java/org/apache/bcel/generic/IXOR.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java b/src/main/java/org/apache/bcel/generic/IfInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IfInstruction.java rename to src/main/java/org/apache/bcel/generic/IfInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/IndexedInstruction.java b/src/main/java/org/apache/bcel/generic/IndexedInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/IndexedInstruction.java rename to src/main/java/org/apache/bcel/generic/IndexedInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/Instruction.java rename to src/main/java/org/apache/bcel/generic/Instruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java b/src/main/java/org/apache/bcel/generic/InstructionComparator.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/InstructionComparator.java rename to src/main/java/org/apache/bcel/generic/InstructionComparator.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionConst.java b/src/main/java/org/apache/bcel/generic/InstructionConst.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/InstructionConst.java rename to src/main/java/org/apache/bcel/generic/InstructionConst.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java b/src/main/java/org/apache/bcel/generic/InstructionConstants.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/InstructionConstants.java rename to src/main/java/org/apache/bcel/generic/InstructionConstants.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/InstructionFactory.java rename to src/main/java/org/apache/bcel/generic/InstructionFactory.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/InstructionHandle.java rename to src/main/java/org/apache/bcel/generic/InstructionHandle.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/InstructionList.java rename to src/main/java/org/apache/bcel/generic/InstructionList.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionListObserver.java b/src/main/java/org/apache/bcel/generic/InstructionListObserver.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/InstructionListObserver.java rename to src/main/java/org/apache/bcel/generic/InstructionListObserver.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/InstructionTargeter.java b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/InstructionTargeter.java rename to src/main/java/org/apache/bcel/generic/InstructionTargeter.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/InvokeInstruction.java rename to src/main/java/org/apache/bcel/generic/InvokeInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/JSR.java b/src/main/java/org/apache/bcel/generic/JSR.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/JSR.java rename to src/main/java/org/apache/bcel/generic/JSR.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/JSR_W.java b/src/main/java/org/apache/bcel/generic/JSR_W.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/JSR_W.java rename to src/main/java/org/apache/bcel/generic/JSR_W.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java b/src/main/java/org/apache/bcel/generic/JsrInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/JsrInstruction.java rename to src/main/java/org/apache/bcel/generic/JsrInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/L2D.java b/src/main/java/org/apache/bcel/generic/L2D.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/L2D.java rename to src/main/java/org/apache/bcel/generic/L2D.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/L2F.java b/src/main/java/org/apache/bcel/generic/L2F.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/L2F.java rename to src/main/java/org/apache/bcel/generic/L2F.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/L2I.java b/src/main/java/org/apache/bcel/generic/L2I.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/L2I.java rename to src/main/java/org/apache/bcel/generic/L2I.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LADD.java b/src/main/java/org/apache/bcel/generic/LADD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LADD.java rename to src/main/java/org/apache/bcel/generic/LADD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LALOAD.java b/src/main/java/org/apache/bcel/generic/LALOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LALOAD.java rename to src/main/java/org/apache/bcel/generic/LALOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LAND.java b/src/main/java/org/apache/bcel/generic/LAND.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LAND.java rename to src/main/java/org/apache/bcel/generic/LAND.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LASTORE.java b/src/main/java/org/apache/bcel/generic/LASTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LASTORE.java rename to src/main/java/org/apache/bcel/generic/LASTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LCMP.java b/src/main/java/org/apache/bcel/generic/LCMP.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LCMP.java rename to src/main/java/org/apache/bcel/generic/LCMP.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LCONST.java b/src/main/java/org/apache/bcel/generic/LCONST.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LCONST.java rename to src/main/java/org/apache/bcel/generic/LCONST.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LDC.java rename to src/main/java/org/apache/bcel/generic/LDC.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java b/src/main/java/org/apache/bcel/generic/LDC2_W.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LDC2_W.java rename to src/main/java/org/apache/bcel/generic/LDC2_W.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDC_W.java b/src/main/java/org/apache/bcel/generic/LDC_W.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LDC_W.java rename to src/main/java/org/apache/bcel/generic/LDC_W.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LDIV.java b/src/main/java/org/apache/bcel/generic/LDIV.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LDIV.java rename to src/main/java/org/apache/bcel/generic/LDIV.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LLOAD.java b/src/main/java/org/apache/bcel/generic/LLOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LLOAD.java rename to src/main/java/org/apache/bcel/generic/LLOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LMUL.java b/src/main/java/org/apache/bcel/generic/LMUL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LMUL.java rename to src/main/java/org/apache/bcel/generic/LMUL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LNEG.java b/src/main/java/org/apache/bcel/generic/LNEG.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LNEG.java rename to src/main/java/org/apache/bcel/generic/LNEG.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LOOKUPSWITCH.java rename to src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LOR.java b/src/main/java/org/apache/bcel/generic/LOR.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LOR.java rename to src/main/java/org/apache/bcel/generic/LOR.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LREM.java b/src/main/java/org/apache/bcel/generic/LREM.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LREM.java rename to src/main/java/org/apache/bcel/generic/LREM.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LRETURN.java b/src/main/java/org/apache/bcel/generic/LRETURN.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LRETURN.java rename to src/main/java/org/apache/bcel/generic/LRETURN.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSHL.java b/src/main/java/org/apache/bcel/generic/LSHL.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LSHL.java rename to src/main/java/org/apache/bcel/generic/LSHL.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSHR.java b/src/main/java/org/apache/bcel/generic/LSHR.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LSHR.java rename to src/main/java/org/apache/bcel/generic/LSHR.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSTORE.java b/src/main/java/org/apache/bcel/generic/LSTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LSTORE.java rename to src/main/java/org/apache/bcel/generic/LSTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LSUB.java b/src/main/java/org/apache/bcel/generic/LSUB.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LSUB.java rename to src/main/java/org/apache/bcel/generic/LSUB.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LUSHR.java b/src/main/java/org/apache/bcel/generic/LUSHR.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LUSHR.java rename to src/main/java/org/apache/bcel/generic/LUSHR.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LXOR.java b/src/main/java/org/apache/bcel/generic/LXOR.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LXOR.java rename to src/main/java/org/apache/bcel/generic/LXOR.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java b/src/main/java/org/apache/bcel/generic/LineNumberGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LineNumberGen.java rename to src/main/java/org/apache/bcel/generic/LineNumberGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LoadClass.java b/src/main/java/org/apache/bcel/generic/LoadClass.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LoadClass.java rename to src/main/java/org/apache/bcel/generic/LoadClass.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java b/src/main/java/org/apache/bcel/generic/LoadInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LoadInstruction.java rename to src/main/java/org/apache/bcel/generic/LoadInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LocalVariableGen.java rename to src/main/java/org/apache/bcel/generic/LocalVariableGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/LocalVariableInstruction.java rename to src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java b/src/main/java/org/apache/bcel/generic/MONITORENTER.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/MONITORENTER.java rename to src/main/java/org/apache/bcel/generic/MONITORENTER.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/MONITOREXIT.java rename to src/main/java/org/apache/bcel/generic/MONITOREXIT.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/MULTIANEWARRAY.java rename to src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/MethodGen.java rename to src/main/java/org/apache/bcel/generic/MethodGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/MethodObserver.java b/src/main/java/org/apache/bcel/generic/MethodObserver.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/MethodObserver.java rename to src/main/java/org/apache/bcel/generic/MethodObserver.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/NEW.java b/src/main/java/org/apache/bcel/generic/NEW.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/NEW.java rename to src/main/java/org/apache/bcel/generic/NEW.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java b/src/main/java/org/apache/bcel/generic/NEWARRAY.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/NEWARRAY.java rename to src/main/java/org/apache/bcel/generic/NEWARRAY.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/NOP.java b/src/main/java/org/apache/bcel/generic/NOP.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/NOP.java rename to src/main/java/org/apache/bcel/generic/NOP.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/NameSignatureInstruction.java rename to src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/NamedAndTyped.java b/src/main/java/org/apache/bcel/generic/NamedAndTyped.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/NamedAndTyped.java rename to src/main/java/org/apache/bcel/generic/NamedAndTyped.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ObjectType.java rename to src/main/java/org/apache/bcel/generic/ObjectType.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/POP.java b/src/main/java/org/apache/bcel/generic/POP.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/POP.java rename to src/main/java/org/apache/bcel/generic/POP.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/POP2.java b/src/main/java/org/apache/bcel/generic/POP2.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/POP2.java rename to src/main/java/org/apache/bcel/generic/POP2.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUSH.java b/src/main/java/org/apache/bcel/generic/PUSH.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/PUSH.java rename to src/main/java/org/apache/bcel/generic/PUSH.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java b/src/main/java/org/apache/bcel/generic/PUTFIELD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/PUTFIELD.java rename to src/main/java/org/apache/bcel/generic/PUTFIELD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/PUTSTATIC.java rename to src/main/java/org/apache/bcel/generic/PUTSTATIC.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/PopInstruction.java b/src/main/java/org/apache/bcel/generic/PopInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/PopInstruction.java rename to src/main/java/org/apache/bcel/generic/PopInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/PushInstruction.java b/src/main/java/org/apache/bcel/generic/PushInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/PushInstruction.java rename to src/main/java/org/apache/bcel/generic/PushInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/RET.java b/src/main/java/org/apache/bcel/generic/RET.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/RET.java rename to src/main/java/org/apache/bcel/generic/RET.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/RETURN.java b/src/main/java/org/apache/bcel/generic/RETURN.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/RETURN.java rename to src/main/java/org/apache/bcel/generic/RETURN.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java b/src/main/java/org/apache/bcel/generic/ReferenceType.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ReferenceType.java rename to src/main/java/org/apache/bcel/generic/ReferenceType.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java b/src/main/java/org/apache/bcel/generic/ReturnInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ReturnInstruction.java rename to src/main/java/org/apache/bcel/generic/ReturnInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/ReturnaddressType.java rename to src/main/java/org/apache/bcel/generic/ReturnaddressType.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/SALOAD.java b/src/main/java/org/apache/bcel/generic/SALOAD.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/SALOAD.java rename to src/main/java/org/apache/bcel/generic/SALOAD.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/SASTORE.java b/src/main/java/org/apache/bcel/generic/SASTORE.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/SASTORE.java rename to src/main/java/org/apache/bcel/generic/SASTORE.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java b/src/main/java/org/apache/bcel/generic/SIPUSH.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/SIPUSH.java rename to src/main/java/org/apache/bcel/generic/SIPUSH.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/SWAP.java b/src/main/java/org/apache/bcel/generic/SWAP.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/SWAP.java rename to src/main/java/org/apache/bcel/generic/SWAP.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/SWITCH.java b/src/main/java/org/apache/bcel/generic/SWITCH.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/SWITCH.java rename to src/main/java/org/apache/bcel/generic/SWITCH.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/Select.java rename to src/main/java/org/apache/bcel/generic/Select.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/SimpleElementValueGen.java rename to src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/StackConsumer.java b/src/main/java/org/apache/bcel/generic/StackConsumer.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/StackConsumer.java rename to src/main/java/org/apache/bcel/generic/StackConsumer.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java b/src/main/java/org/apache/bcel/generic/StackInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/StackInstruction.java rename to src/main/java/org/apache/bcel/generic/StackInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/StackProducer.java b/src/main/java/org/apache/bcel/generic/StackProducer.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/StackProducer.java rename to src/main/java/org/apache/bcel/generic/StackProducer.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java b/src/main/java/org/apache/bcel/generic/StoreInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/StoreInstruction.java rename to src/main/java/org/apache/bcel/generic/StoreInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/TABLESWITCH.java rename to src/main/java/org/apache/bcel/generic/TABLESWITCH.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java b/src/main/java/org/apache/bcel/generic/TargetLostException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/TargetLostException.java rename to src/main/java/org/apache/bcel/generic/TargetLostException.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/Type.java rename to src/main/java/org/apache/bcel/generic/Type.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/TypedInstruction.java b/src/main/java/org/apache/bcel/generic/TypedInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/TypedInstruction.java rename to src/main/java/org/apache/bcel/generic/TypedInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/UnconditionalBranch.java b/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/UnconditionalBranch.java rename to src/main/java/org/apache/bcel/generic/UnconditionalBranch.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/VariableLengthInstruction.java b/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/VariableLengthInstruction.java rename to src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/Visitor.java b/src/main/java/org/apache/bcel/generic/Visitor.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/Visitor.java rename to src/main/java/org/apache/bcel/generic/Visitor.java diff --git a/src/main/java/org/apache/commons/bcel6/generic/package.html b/src/main/java/org/apache/bcel/generic/package.html similarity index 100% rename from src/main/java/org/apache/commons/bcel6/generic/package.html rename to src/main/java/org/apache/bcel/generic/package.html diff --git a/src/main/java/org/apache/commons/bcel6/package.html b/src/main/java/org/apache/bcel/package.html similarity index 100% rename from src/main/java/org/apache/commons/bcel6/package.html rename to src/main/java/org/apache/bcel/package.html diff --git a/src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/AttributeHTML.java rename to src/main/java/org/apache/bcel/util/AttributeHTML.java diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELComparator.java b/src/main/java/org/apache/bcel/util/BCELComparator.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/BCELComparator.java rename to src/main/java/org/apache/bcel/util/BCELComparator.java diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/BCELFactory.java rename to src/main/java/org/apache/bcel/util/BCELFactory.java diff --git a/src/main/java/org/apache/commons/bcel6/util/BCELifier.java b/src/main/java/org/apache/bcel/util/BCELifier.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/BCELifier.java rename to src/main/java/org/apache/bcel/util/BCELifier.java diff --git a/src/main/java/org/apache/commons/bcel6/util/ByteSequence.java b/src/main/java/org/apache/bcel/util/ByteSequence.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/ByteSequence.java rename to src/main/java/org/apache/bcel/util/ByteSequence.java diff --git a/src/main/java/org/apache/commons/bcel6/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/Class2HTML.java rename to src/main/java/org/apache/bcel/util/Class2HTML.java diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoader.java b/src/main/java/org/apache/bcel/util/ClassLoader.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/ClassLoader.java rename to src/main/java/org/apache/bcel/util/ClassLoader.java diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/ClassLoaderRepository.java rename to src/main/java/org/apache/bcel/util/ClassLoaderRepository.java diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/ClassPath.java rename to src/main/java/org/apache/bcel/util/ClassPath.java diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassPathRepository.java b/src/main/java/org/apache/bcel/util/ClassPathRepository.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/ClassPathRepository.java rename to src/main/java/org/apache/bcel/util/ClassPathRepository.java diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassQueue.java b/src/main/java/org/apache/bcel/util/ClassQueue.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/ClassQueue.java rename to src/main/java/org/apache/bcel/util/ClassQueue.java diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassSet.java b/src/main/java/org/apache/bcel/util/ClassSet.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/ClassSet.java rename to src/main/java/org/apache/bcel/util/ClassSet.java diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassStack.java b/src/main/java/org/apache/bcel/util/ClassStack.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/ClassStack.java rename to src/main/java/org/apache/bcel/util/ClassStack.java diff --git a/src/main/java/org/apache/commons/bcel6/util/ClassVector.java b/src/main/java/org/apache/bcel/util/ClassVector.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/ClassVector.java rename to src/main/java/org/apache/bcel/util/ClassVector.java diff --git a/src/main/java/org/apache/commons/bcel6/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/CodeHTML.java rename to src/main/java/org/apache/bcel/util/CodeHTML.java diff --git a/src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java b/src/main/java/org/apache/bcel/util/ConstantHTML.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/ConstantHTML.java rename to src/main/java/org/apache/bcel/util/ConstantHTML.java diff --git a/src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/InstructionFinder.java rename to src/main/java/org/apache/bcel/util/InstructionFinder.java diff --git a/src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java b/src/main/java/org/apache/bcel/util/JavaWrapper.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/JavaWrapper.java rename to src/main/java/org/apache/bcel/util/JavaWrapper.java diff --git a/src/main/java/org/apache/commons/bcel6/util/MemorySensitiveClassPathRepository.java b/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/MemorySensitiveClassPathRepository.java rename to src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java diff --git a/src/main/java/org/apache/commons/bcel6/util/MethodHTML.java b/src/main/java/org/apache/bcel/util/MethodHTML.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/MethodHTML.java rename to src/main/java/org/apache/bcel/util/MethodHTML.java diff --git a/src/main/java/org/apache/commons/bcel6/util/Repository.java b/src/main/java/org/apache/bcel/util/Repository.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/Repository.java rename to src/main/java/org/apache/bcel/util/Repository.java diff --git a/src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/SyntheticRepository.java rename to src/main/java/org/apache/bcel/util/SyntheticRepository.java diff --git a/src/main/java/org/apache/commons/bcel6/util/package.html b/src/main/java/org/apache/bcel/util/package.html similarity index 100% rename from src/main/java/org/apache/commons/bcel6/util/package.html rename to src/main/java/org/apache/bcel/util/package.html diff --git a/src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/GraphicalVerifier.java rename to src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/NativeVerifier.java rename to src/main/java/org/apache/bcel/verifier/NativeVerifier.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java b/src/main/java/org/apache/bcel/verifier/PassVerifier.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/PassVerifier.java rename to src/main/java/org/apache/bcel/verifier/PassVerifier.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/TransitiveHull.java rename to src/main/java/org/apache/bcel/verifier/TransitiveHull.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java b/src/main/java/org/apache/bcel/verifier/VerificationResult.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/VerificationResult.java rename to src/main/java/org/apache/bcel/verifier/VerificationResult.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/Verifier.java b/src/main/java/org/apache/bcel/verifier/Verifier.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/Verifier.java rename to src/main/java/org/apache/bcel/verifier/Verifier.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/VerifierAppFrame.java rename to src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/VerifierFactory.java rename to src/main/java/org/apache/bcel/verifier/VerifierFactory.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryListModel.java rename to src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryObserver.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/VerifierFactoryObserver.java rename to src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/VerifyDialog.java rename to src/main/java/org/apache/bcel/verifier/VerifyDialog.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/AssertionViolatedException.java rename to src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/ClassConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/CodeConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/InvalidMethodException.java rename to src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/LinkingConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/LinkingConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/LoadingException.java rename to src/main/java/org/apache/bcel/verifier/exc/LoadingException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/LocalVariableInfoInconsistentException.java rename to src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/StaticCodeInstructionOperandConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/StructuralCodeConstraintException.java rename to src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java b/src/main/java/org/apache/bcel/verifier/exc/Utility.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/Utility.java rename to src/main/java/org/apache/bcel/verifier/exc/Utility.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/VerificationException.java rename to src/main/java/org/apache/bcel/verifier/exc/VerificationException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/VerifierConstraintViolatedException.java rename to src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/exc/package.html b/src/main/java/org/apache/bcel/verifier/exc/package.html similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/exc/package.html rename to src/main/java/org/apache/bcel/verifier/exc/package.html diff --git a/src/main/java/org/apache/commons/bcel6/verifier/package.html b/src/main/java/org/apache/bcel/verifier/package.html similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/package.html rename to src/main/java/org/apache/bcel/verifier/package.html diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/statics/DOUBLE_Upper.java rename to src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java b/src/main/java/org/apache/bcel/verifier/statics/IntList.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/statics/IntList.java rename to src/main/java/org/apache/bcel/verifier/statics/IntList.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/statics/LONG_Upper.java rename to src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariableInfo.java rename to src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/statics/LocalVariablesInfo.java rename to src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/statics/Pass1Verifier.java rename to src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/statics/Pass2Verifier.java rename to src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/statics/Pass3aVerifier.java rename to src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/statics/StringRepresentation.java rename to src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/statics/package.html b/src/main/java/org/apache/bcel/verifier/statics/package.html similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/statics/package.html rename to src/main/java/org/apache/bcel/verifier/statics/package.html diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/ControlFlowGraph.java rename to src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandler.java rename to src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/ExceptionHandlers.java rename to src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/ExecutionVisitor.java rename to src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java b/src/main/java/org/apache/bcel/verifier/structurals/Frame.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/Frame.java rename to src/main/java/org/apache/bcel/verifier/structurals/Frame.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/GenericArray.java b/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/GenericArray.java rename to src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/InstConstraintVisitor.java rename to src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/InstructionContext.java rename to src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/LocalVariables.java rename to src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/OperandStack.java rename to src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/Pass3bVerifier.java rename to src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutine.java rename to src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/Subroutines.java rename to src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/UninitializedObjectType.java rename to src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java diff --git a/src/main/java/org/apache/commons/bcel6/verifier/structurals/package.html b/src/main/java/org/apache/bcel/verifier/structurals/package.html similarity index 100% rename from src/main/java/org/apache/commons/bcel6/verifier/structurals/package.html rename to src/main/java/org/apache/bcel/verifier/structurals/package.html diff --git a/src/test/java/org/apache/commons/bcel6/AbstractCounterVisitorTestCase.java b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java similarity index 87% rename from src/test/java/org/apache/commons/bcel6/AbstractCounterVisitorTestCase.java rename to src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java index a8f8625b..ea3c99ca 100644 --- a/src/test/java/org/apache/commons/bcel6/AbstractCounterVisitorTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractCounterVisitorTestCase.java @@ -16,11 +16,11 @@ * */ -package org.apache.commons.bcel6; +package org.apache.bcel; -import org.apache.commons.bcel6.classfile.DescendingVisitor; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.visitors.CounterVisitor; +import org.apache.bcel.classfile.DescendingVisitor; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.visitors.CounterVisitor; public abstract class AbstractCounterVisitorTestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java b/src/test/java/org/apache/bcel/AbstractTestCase.java similarity index 90% rename from src/test/java/org/apache/commons/bcel6/AbstractTestCase.java rename to src/test/java/org/apache/bcel/AbstractTestCase.java index dbb80256..a7e59cca 100644 --- a/src/test/java/org/apache/commons/bcel6/AbstractTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractTestCase.java @@ -16,24 +16,24 @@ * */ -package org.apache.commons.bcel6; +package org.apache.bcel; import java.io.File; import java.util.ArrayList; import java.util.List; -import org.apache.commons.bcel6.classfile.AnnotationEntry; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.generic.AnnotationEntryGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.ElementValueGen; -import org.apache.commons.bcel6.generic.ElementValuePairGen; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.SimpleElementValueGen; -import org.apache.commons.bcel6.util.ClassPath; -import org.apache.commons.bcel6.util.SyntheticRepository; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.AnnotationEntryGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.ElementValueGen; +import org.apache.bcel.generic.ElementValuePairGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.SimpleElementValueGen; +import org.apache.bcel.util.ClassPath; +import org.apache.bcel.util.SyntheticRepository; import junit.framework.TestCase; diff --git a/src/test/java/org/apache/commons/bcel6/AnnotationAccessFlagTestCase.java b/src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java similarity index 94% rename from src/test/java/org/apache/commons/bcel6/AnnotationAccessFlagTestCase.java rename to src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java index eac7f95c..c0409a28 100644 --- a/src/test/java/org/apache/commons/bcel6/AnnotationAccessFlagTestCase.java +++ b/src/test/java/org/apache/bcel/AnnotationAccessFlagTestCase.java @@ -16,9 +16,9 @@ * */ -package org.apache.commons.bcel6; +package org.apache.bcel; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.JavaClass; public class AnnotationAccessFlagTestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/commons/bcel6/AnnotationDefaultAttributeTestCase.java b/src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java similarity index 85% rename from src/test/java/org/apache/commons/bcel6/AnnotationDefaultAttributeTestCase.java rename to src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java index 592e0f21..6afe6794 100644 --- a/src/test/java/org/apache/commons/bcel6/AnnotationDefaultAttributeTestCase.java +++ b/src/test/java/org/apache/bcel/AnnotationDefaultAttributeTestCase.java @@ -16,13 +16,13 @@ * */ -package org.apache.commons.bcel6; +package org.apache.bcel; -import org.apache.commons.bcel6.classfile.AnnotationDefault; -import org.apache.commons.bcel6.classfile.ElementValue; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.SimpleElementValue; +import org.apache.bcel.classfile.AnnotationDefault; +import org.apache.bcel.classfile.ElementValue; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.SimpleElementValue; public class AnnotationDefaultAttributeTestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java b/src/test/java/org/apache/bcel/AnonymousClassTestCase.java similarity index 96% rename from src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java rename to src/test/java/org/apache/bcel/AnonymousClassTestCase.java index fcbd66b3..6506d63d 100644 --- a/src/test/java/org/apache/commons/bcel6/AnonymousClassTestCase.java +++ b/src/test/java/org/apache/bcel/AnonymousClassTestCase.java @@ -16,9 +16,9 @@ * */ -package org.apache.commons.bcel6; +package org.apache.bcel; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.JavaClass; public class AnonymousClassTestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/commons/bcel6/BCELBenchmark.java b/src/test/java/org/apache/bcel/BCELBenchmark.java similarity index 92% rename from src/test/java/org/apache/commons/bcel6/BCELBenchmark.java rename to src/test/java/org/apache/bcel/BCELBenchmark.java index 34589fbe..ad48cee6 100644 --- a/src/test/java/org/apache/commons/bcel6/BCELBenchmark.java +++ b/src/test/java/org/apache/bcel/BCELBenchmark.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.bcel6; +package org.apache.bcel; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -23,12 +23,12 @@ import java.util.concurrent.TimeUnit; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; import org.apache.commons.collections4.Predicate; import org.apache.commons.collections4.iterators.EnumerationIterator; import org.apache.commons.collections4.iterators.FilterIterator; diff --git a/src/test/java/org/apache/commons/bcel6/CounterVisitorTestCase.java b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java similarity index 98% rename from src/test/java/org/apache/commons/bcel6/CounterVisitorTestCase.java rename to src/test/java/org/apache/bcel/CounterVisitorTestCase.java index 31db773a..83284183 100644 --- a/src/test/java/org/apache/commons/bcel6/CounterVisitorTestCase.java +++ b/src/test/java/org/apache/bcel/CounterVisitorTestCase.java @@ -16,9 +16,9 @@ * */ -package org.apache.commons.bcel6; +package org.apache.bcel; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.JavaClass; public class CounterVisitorTestCase extends AbstractCounterVisitorTestCase { diff --git a/src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java similarity index 95% rename from src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java rename to src/test/java/org/apache/bcel/ElementValueGenTestCase.java index 1e8db56d..ac2d88b6 100644 --- a/src/test/java/org/apache/commons/bcel6/ElementValueGenTestCase.java +++ b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6; +package org.apache.bcel; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -24,13 +24,13 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.generic.ClassElementValueGen; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.ElementValueGen; -import org.apache.commons.bcel6.generic.EnumElementValueGen; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.SimpleElementValueGen; +import org.apache.bcel.generic.ClassElementValueGen; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.ElementValueGen; +import org.apache.bcel.generic.EnumElementValueGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.SimpleElementValueGen; public class ElementValueGenTestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java b/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java similarity index 94% rename from src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java rename to src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java index c6ed1f57..80f0c36b 100644 --- a/src/test/java/org/apache/commons/bcel6/EnclosingMethodAttributeTestCase.java +++ b/src/test/java/org/apache/bcel/EnclosingMethodAttributeTestCase.java @@ -16,16 +16,16 @@ * */ -package org.apache.commons.bcel6; +package org.apache.bcel; import java.io.File; import java.io.IOException; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.EnclosingMethod; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.util.SyntheticRepository; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.EnclosingMethod; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.util.SyntheticRepository; import org.junit.Assert; public class EnclosingMethodAttributeTestCase extends AbstractTestCase diff --git a/src/test/java/org/apache/commons/bcel6/EnumAccessFlagTestCase.java b/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java similarity index 94% rename from src/test/java/org/apache/commons/bcel6/EnumAccessFlagTestCase.java rename to src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java index 035dcb50..fc624bb7 100644 --- a/src/test/java/org/apache/commons/bcel6/EnumAccessFlagTestCase.java +++ b/src/test/java/org/apache/bcel/EnumAccessFlagTestCase.java @@ -16,9 +16,9 @@ * */ -package org.apache.commons.bcel6; +package org.apache.bcel; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.JavaClass; public class EnumAccessFlagTestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/commons/bcel6/InstructionFinderTestCase.java b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java similarity index 86% rename from src/test/java/org/apache/commons/bcel6/InstructionFinderTestCase.java rename to src/test/java/org/apache/bcel/InstructionFinderTestCase.java index ad3cb955..6feb1911 100644 --- a/src/test/java/org/apache/commons/bcel6/InstructionFinderTestCase.java +++ b/src/test/java/org/apache/bcel/InstructionFinderTestCase.java @@ -15,15 +15,15 @@ * limitations under the License. * */ -package org.apache.commons.bcel6; +package org.apache.bcel; import java.util.Iterator; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.util.InstructionFinder; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.util.InstructionFinder; public class InstructionFinderTestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/commons/bcel6/NanoTimer.java b/src/test/java/org/apache/bcel/NanoTimer.java similarity index 97% rename from src/test/java/org/apache/commons/bcel6/NanoTimer.java rename to src/test/java/org/apache/bcel/NanoTimer.java index 83f4edea..c6e57a02 100644 --- a/src/test/java/org/apache/commons/bcel6/NanoTimer.java +++ b/src/test/java/org/apache/bcel/NanoTimer.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6; +package org.apache.bcel; public class NanoTimer { diff --git a/src/test/java/org/apache/commons/bcel6/PLSETestCase.java b/src/test/java/org/apache/bcel/PLSETestCase.java similarity index 85% rename from src/test/java/org/apache/commons/bcel6/PLSETestCase.java rename to src/test/java/org/apache/bcel/PLSETestCase.java index f4dd1a3c..f30a5feb 100644 --- a/src/test/java/org/apache/commons/bcel6/PLSETestCase.java +++ b/src/test/java/org/apache/bcel/PLSETestCase.java @@ -16,15 +16,15 @@ * */ -package org.apache.commons.bcel6; +package org.apache.bcel; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.LocalVariableTable; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.Type; public class PLSETestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/commons/bcel6/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java similarity index 93% rename from src/test/java/org/apache/commons/bcel6/PerformanceTest.java rename to src/test/java/org/apache/bcel/PerformanceTest.java index ea99266c..abd4f8ae 100644 --- a/src/test/java/org/apache/commons/bcel6/PerformanceTest.java +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6; +package org.apache.bcel; import java.io.ByteArrayInputStream; import java.io.File; @@ -27,12 +27,12 @@ import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; import org.junit.Assert; import junit.framework.TestCase; diff --git a/src/test/java/org/apache/commons/bcel6/classfile/JDKClassDumpTestCase.java b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/classfile/JDKClassDumpTestCase.java rename to src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/classfile/UtilityTestCase.java b/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/classfile/UtilityTestCase.java rename to src/test/java/org/apache/bcel/classfile/UtilityTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/data/AnnotatedFields.java b/src/test/java/org/apache/bcel/data/AnnotatedFields.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/AnnotatedFields.java rename to src/test/java/org/apache/bcel/data/AnnotatedFields.java diff --git a/src/test/java/org/apache/commons/bcel6/data/AnnotatedWithCombinedAnnotation.java b/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/AnnotatedWithCombinedAnnotation.java rename to src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java diff --git a/src/test/java/org/apache/commons/bcel6/data/AnnotatedWithEnumClass.java b/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/AnnotatedWithEnumClass.java rename to src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java diff --git a/src/test/java/org/apache/commons/bcel6/data/AnnotationEnumElement.java b/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/AnnotationEnumElement.java rename to src/test/java/org/apache/bcel/data/AnnotationEnumElement.java diff --git a/src/test/java/org/apache/commons/bcel6/data/AnonymousClassTest.java b/src/test/java/org/apache/bcel/data/AnonymousClassTest.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/AnonymousClassTest.java rename to src/test/java/org/apache/bcel/data/AnonymousClassTest.java diff --git a/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java b/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM01.java rename to src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java diff --git a/src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java b/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/AttributeTestClassEM02.java rename to src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java diff --git a/src/test/java/org/apache/commons/bcel6/data/CombinedAnnotation.java b/src/test/java/org/apache/bcel/data/CombinedAnnotation.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/CombinedAnnotation.java rename to src/test/java/org/apache/bcel/data/CombinedAnnotation.java diff --git a/src/test/java/org/apache/commons/bcel6/data/ComplexAnnotatedClass.java b/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/ComplexAnnotatedClass.java rename to src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java diff --git a/src/test/java/org/apache/commons/bcel6/data/ComplexAnnotation.java b/src/test/java/org/apache/bcel/data/ComplexAnnotation.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/ComplexAnnotation.java rename to src/test/java/org/apache/bcel/data/ComplexAnnotation.java diff --git a/src/test/java/org/apache/commons/bcel6/data/MarkedType.java b/src/test/java/org/apache/bcel/data/MarkedType.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/MarkedType.java rename to src/test/java/org/apache/bcel/data/MarkedType.java diff --git a/src/test/java/org/apache/commons/bcel6/data/MarkerAnnotation.java b/src/test/java/org/apache/bcel/data/MarkerAnnotation.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/MarkerAnnotation.java rename to src/test/java/org/apache/bcel/data/MarkerAnnotation.java diff --git a/src/test/java/org/apache/commons/bcel6/data/MarkerAnnotationInvisible.java b/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/MarkerAnnotationInvisible.java rename to src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java diff --git a/src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java b/src/test/java/org/apache/bcel/data/PLSETestClass.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/PLSETestClass.java rename to src/test/java/org/apache/bcel/data/PLSETestClass.java diff --git a/src/test/java/org/apache/commons/bcel6/data/SimpleAnnotatedClass.java b/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/SimpleAnnotatedClass.java rename to src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java diff --git a/src/test/java/org/apache/commons/bcel6/data/SimpleAnnotation.java b/src/test/java/org/apache/bcel/data/SimpleAnnotation.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/SimpleAnnotation.java rename to src/test/java/org/apache/bcel/data/SimpleAnnotation.java diff --git a/src/test/java/org/apache/commons/bcel6/data/SimpleClass.java b/src/test/java/org/apache/bcel/data/SimpleClass.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/SimpleClass.java rename to src/test/java/org/apache/bcel/data/SimpleClass.java diff --git a/src/test/java/org/apache/commons/bcel6/data/SimpleEnum.java b/src/test/java/org/apache/bcel/data/SimpleEnum.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/data/SimpleEnum.java rename to src/test/java/org/apache/bcel/data/SimpleEnum.java diff --git a/src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java b/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/generic/AnnotationGenTestCase.java rename to src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/generic/BranchHandleTestCase.java b/src/test/java/org/apache/bcel/generic/BranchHandleTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/generic/BranchHandleTestCase.java rename to src/test/java/org/apache/bcel/generic/BranchHandleTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/generic/FieldAnnotationsTestCase.java b/src/test/java/org/apache/bcel/generic/FieldAnnotationsTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/generic/FieldAnnotationsTestCase.java rename to src/test/java/org/apache/bcel/generic/FieldAnnotationsTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/bcel/generic/GeneratingAnnotatedClassesTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/generic/GeneratingAnnotatedClassesTestCase.java rename to src/test/java/org/apache/bcel/generic/GeneratingAnnotatedClassesTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/generic/InstructionHandleTestCase.java b/src/test/java/org/apache/bcel/generic/InstructionHandleTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/generic/InstructionHandleTestCase.java rename to src/test/java/org/apache/bcel/generic/InstructionHandleTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/generic/JDKGenericDumpTestCase.java b/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/generic/JDKGenericDumpTestCase.java rename to src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java b/src/test/java/org/apache/bcel/generic/MethodGenTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/generic/MethodGenTestCase.java rename to src/test/java/org/apache/bcel/generic/MethodGenTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/util/BCELifierTestCase.java rename to src/test/java/org/apache/bcel/util/BCELifierTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/util/Class2HTMLTestCase.java b/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/util/Class2HTMLTestCase.java rename to src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/util/InstructionFinderTest.java b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/util/InstructionFinderTest.java rename to src/test/java/org/apache/bcel/util/InstructionFinderTest.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java b/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/AbstractVerifierTestCase.java rename to src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/VerifierArrayAccessTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/VerifierArrayAccessTestCase.java rename to src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/VerifierInvokeTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/VerifierInvokeTestCase.java rename to src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/VerifierReturnTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/VerifierReturnTestCase.java rename to src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/VerifierTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/VerifierTestCase.java rename to src/test/java/org/apache/bcel/verifier/VerifierTestCase.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java b/src/test/java/org/apache/bcel/verifier/tests/TestArray01.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestArray01.java rename to src/test/java/org/apache/bcel/verifier/tests/TestArray01.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess01.java b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess01.java rename to src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess02Creator.java rename to src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess03Creator.java rename to src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestArrayAccess04Creator.java rename to src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestCreator.java b/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestCreator.java rename to src/test/java/org/apache/bcel/verifier/tests/TestCreator.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeInterface01.java rename to src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial01.java rename to src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeSpecial02.java rename to src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeStatic01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeStatic01.java rename to src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual01.java rename to src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestLegalInvokeVirtual02.java rename to src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn01Creator.java rename to src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn02.java b/src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn02.java rename to src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java diff --git a/src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/verifier/tests/TestReturn03Creator.java rename to src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java diff --git a/src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java similarity index 100% rename from src/test/java/org/apache/commons/bcel6/visitors/CounterVisitor.java rename to src/test/java/org/apache/bcel/visitors/CounterVisitor.java -- GitLab From 58e0a1f9ffefd97b803ede8138e7cfad225aeb2c Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Tue, 7 Jun 2016 17:16:00 +0000 Subject: [PATCH 1127/1313] Remove BCEL-222 from changes.xml git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747274 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 426c8ba3..6693594e 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -120,9 +120,6 @@ N.B. The Clirr report shows that there are several incompatible changes which in Update Java requirement from 5 to 7 Interfaces should not be used to define constants Code must not swallow Throwable - - Major release of BCEL requires updating package name and maven coordinates. - Make org.apache.bcel.classfile.ConstantPool.ConstantPool(DataInput) public. -- GitLab From d522432b79044740831a132d8b92e7dab5477444 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Tue, 7 Jun 2016 17:28:43 +0000 Subject: [PATCH 1128/1313] Fix messed up package rename git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747278 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 1 + .../apache/bcel/classfile/AccessFlags.java | 4 +- .../bcel/classfile/AnnotationDefault.java | 4 +- .../classfile/AnnotationElementValue.java | 2 +- .../bcel/classfile/AnnotationEntry.java | 4 +- .../apache/bcel/classfile/Annotations.java | 2 +- .../bcel/classfile/ArrayElementValue.java | 2 +- .../org/apache/bcel/classfile/Attribute.java | 4 +- .../bcel/classfile/AttributeReader.java | 2 +- .../bcel/classfile/BootstrapMethod.java | 4 +- .../bcel/classfile/BootstrapMethods.java | 4 +- .../bcel/classfile/ClassElementValue.java | 4 +- .../bcel/classfile/ClassFormatException.java | 2 +- .../apache/bcel/classfile/ClassParser.java | 4 +- .../java/org/apache/bcel/classfile/Code.java | 4 +- .../apache/bcel/classfile/CodeException.java | 4 +- .../org/apache/bcel/classfile/Constant.java | 6 +- .../org/apache/bcel/classfile/ConstantCP.java | 4 +- .../apache/bcel/classfile/ConstantClass.java | 4 +- .../apache/bcel/classfile/ConstantDouble.java | 4 +- .../bcel/classfile/ConstantFieldref.java | 4 +- .../apache/bcel/classfile/ConstantFloat.java | 4 +- .../bcel/classfile/ConstantInteger.java | 4 +- .../classfile/ConstantInterfaceMethodref.java | 4 +- .../bcel/classfile/ConstantInvokeDynamic.java | 4 +- .../apache/bcel/classfile/ConstantLong.java | 4 +- .../bcel/classfile/ConstantMethodHandle.java | 4 +- .../bcel/classfile/ConstantMethodType.java | 4 +- .../bcel/classfile/ConstantMethodref.java | 4 +- .../bcel/classfile/ConstantNameAndType.java | 4 +- .../apache/bcel/classfile/ConstantObject.java | 2 +- .../apache/bcel/classfile/ConstantPool.java | 6 +- .../apache/bcel/classfile/ConstantString.java | 4 +- .../apache/bcel/classfile/ConstantUtf8.java | 4 +- .../apache/bcel/classfile/ConstantValue.java | 4 +- .../org/apache/bcel/classfile/Deprecated.java | 4 +- .../bcel/classfile/DescendingVisitor.java | 2 +- .../apache/bcel/classfile/ElementValue.java | 2 +- .../bcel/classfile/ElementValuePair.java | 4 +- .../apache/bcel/classfile/EmptyVisitor.java | 2 +- .../bcel/classfile/EnclosingMethod.java | 4 +- .../bcel/classfile/EnumElementValue.java | 4 +- .../apache/bcel/classfile/ExceptionTable.java | 4 +- .../java/org/apache/bcel/classfile/Field.java | 8 +- .../apache/bcel/classfile/FieldOrMethod.java | 4 +- .../org/apache/bcel/classfile/InnerClass.java | 4 +- .../apache/bcel/classfile/InnerClasses.java | 4 +- .../org/apache/bcel/classfile/JavaClass.java | 20 +-- .../org/apache/bcel/classfile/LineNumber.java | 2 +- .../bcel/classfile/LineNumberTable.java | 4 +- .../apache/bcel/classfile/LocalVariable.java | 4 +- .../bcel/classfile/LocalVariableTable.java | 4 +- .../classfile/LocalVariableTypeTable.java | 4 +- .../org/apache/bcel/classfile/Method.java | 8 +- .../bcel/classfile/MethodParameter.java | 4 +- .../bcel/classfile/MethodParameters.java | 4 +- .../java/org/apache/bcel/classfile/Node.java | 2 +- .../org/apache/bcel/classfile/PMGClass.java | 4 +- .../classfile/ParameterAnnotationEntry.java | 2 +- .../bcel/classfile/ParameterAnnotations.java | 2 +- .../RuntimeInvisibleAnnotations.java | 4 +- .../RuntimeInvisibleParameterAnnotations.java | 4 +- .../classfile/RuntimeVisibleAnnotations.java | 4 +- .../RuntimeVisibleParameterAnnotations.java | 4 +- .../org/apache/bcel/classfile/Signature.java | 4 +- .../bcel/classfile/SimpleElementValue.java | 4 +- .../org/apache/bcel/classfile/SourceFile.java | 4 +- .../org/apache/bcel/classfile/StackMap.java | 4 +- .../apache/bcel/classfile/StackMapEntry.java | 4 +- .../apache/bcel/classfile/StackMapType.java | 4 +- .../org/apache/bcel/classfile/Synthetic.java | 4 +- .../org/apache/bcel/classfile/Unknown.java | 4 +- .../classfile/UnknownAttributeReader.java | 2 +- .../org/apache/bcel/classfile/Utility.java | 6 +- .../org/apache/bcel/classfile/Visitor.java | 2 +- .../java/org/apache/bcel/generic/AALOAD.java | 4 +- .../java/org/apache/bcel/generic/AASTORE.java | 4 +- .../org/apache/bcel/generic/ACONST_NULL.java | 4 +- .../java/org/apache/bcel/generic/ALOAD.java | 6 +- .../org/apache/bcel/generic/ANEWARRAY.java | 6 +- .../java/org/apache/bcel/generic/ARETURN.java | 4 +- .../org/apache/bcel/generic/ARRAYLENGTH.java | 6 +- .../java/org/apache/bcel/generic/ASTORE.java | 6 +- .../java/org/apache/bcel/generic/ATHROW.java | 6 +- .../bcel/generic/AllocationInstruction.java | 2 +- .../generic/AnnotationElementValueGen.java | 6 +- .../bcel/generic/AnnotationEntryGen.java | 18 +- .../bcel/generic/ArithmeticInstruction.java | 4 +- .../bcel/generic/ArrayElementValueGen.java | 6 +- .../apache/bcel/generic/ArrayInstruction.java | 36 ++-- .../org/apache/bcel/generic/ArrayType.java | 4 +- .../java/org/apache/bcel/generic/BALOAD.java | 4 +- .../java/org/apache/bcel/generic/BASTORE.java | 4 +- .../java/org/apache/bcel/generic/BIPUSH.java | 6 +- .../org/apache/bcel/generic/BREAKPOINT.java | 4 +- .../org/apache/bcel/generic/BasicType.java | 4 +- .../org/apache/bcel/generic/BranchHandle.java | 2 +- .../bcel/generic/BranchInstruction.java | 4 +- .../java/org/apache/bcel/generic/CALOAD.java | 4 +- .../java/org/apache/bcel/generic/CASTORE.java | 4 +- .../org/apache/bcel/generic/CHECKCAST.java | 6 +- .../apache/bcel/generic/CPInstruction.java | 14 +- .../bcel/generic/ClassElementValueGen.java | 8 +- .../org/apache/bcel/generic/ClassGen.java | 28 +-- .../bcel/generic/ClassGenException.java | 2 +- .../apache/bcel/generic/ClassObserver.java | 2 +- .../apache/bcel/generic/CodeExceptionGen.java | 4 +- .../bcel/generic/CompoundInstruction.java | 2 +- .../apache/bcel/generic/ConstantPoolGen.java | 38 ++-- .../bcel/generic/ConstantPushInstruction.java | 2 +- .../bcel/generic/ConversionInstruction.java | 4 +- .../java/org/apache/bcel/generic/D2F.java | 4 +- .../java/org/apache/bcel/generic/D2I.java | 4 +- .../java/org/apache/bcel/generic/D2L.java | 4 +- .../java/org/apache/bcel/generic/DADD.java | 4 +- .../java/org/apache/bcel/generic/DALOAD.java | 4 +- .../java/org/apache/bcel/generic/DASTORE.java | 4 +- .../java/org/apache/bcel/generic/DCMPG.java | 4 +- .../java/org/apache/bcel/generic/DCMPL.java | 4 +- .../java/org/apache/bcel/generic/DCONST.java | 8 +- .../java/org/apache/bcel/generic/DDIV.java | 4 +- .../java/org/apache/bcel/generic/DLOAD.java | 6 +- .../java/org/apache/bcel/generic/DMUL.java | 4 +- .../java/org/apache/bcel/generic/DNEG.java | 4 +- .../java/org/apache/bcel/generic/DREM.java | 4 +- .../java/org/apache/bcel/generic/DRETURN.java | 4 +- .../java/org/apache/bcel/generic/DSTORE.java | 6 +- .../java/org/apache/bcel/generic/DSUB.java | 4 +- .../java/org/apache/bcel/generic/DUP.java | 4 +- .../java/org/apache/bcel/generic/DUP2.java | 4 +- .../java/org/apache/bcel/generic/DUP2_X1.java | 4 +- .../java/org/apache/bcel/generic/DUP2_X2.java | 4 +- .../java/org/apache/bcel/generic/DUP_X1.java | 4 +- .../java/org/apache/bcel/generic/DUP_X2.java | 4 +- .../apache/bcel/generic/ElementValueGen.java | 16 +- .../bcel/generic/ElementValuePairGen.java | 8 +- .../org/apache/bcel/generic/EmptyVisitor.java | 2 +- .../bcel/generic/EnumElementValueGen.java | 8 +- .../apache/bcel/generic/ExceptionThrower.java | 2 +- .../java/org/apache/bcel/generic/F2D.java | 4 +- .../java/org/apache/bcel/generic/F2I.java | 4 +- .../java/org/apache/bcel/generic/F2L.java | 4 +- .../java/org/apache/bcel/generic/FADD.java | 4 +- .../java/org/apache/bcel/generic/FALOAD.java | 4 +- .../java/org/apache/bcel/generic/FASTORE.java | 4 +- .../java/org/apache/bcel/generic/FCMPG.java | 4 +- .../java/org/apache/bcel/generic/FCMPL.java | 4 +- .../java/org/apache/bcel/generic/FCONST.java | 10 +- .../java/org/apache/bcel/generic/FDIV.java | 4 +- .../java/org/apache/bcel/generic/FLOAD.java | 6 +- .../java/org/apache/bcel/generic/FMUL.java | 4 +- .../java/org/apache/bcel/generic/FNEG.java | 4 +- .../java/org/apache/bcel/generic/FREM.java | 4 +- .../java/org/apache/bcel/generic/FRETURN.java | 4 +- .../java/org/apache/bcel/generic/FSTORE.java | 6 +- .../java/org/apache/bcel/generic/FSUB.java | 4 +- .../org/apache/bcel/generic/FieldGen.java | 24 +-- .../bcel/generic/FieldGenOrMethodGen.java | 8 +- .../apache/bcel/generic/FieldInstruction.java | 8 +- .../apache/bcel/generic/FieldObserver.java | 2 +- .../apache/bcel/generic/FieldOrMethod.java | 12 +- .../org/apache/bcel/generic/GETFIELD.java | 6 +- .../org/apache/bcel/generic/GETSTATIC.java | 6 +- .../java/org/apache/bcel/generic/GOTO.java | 8 +- .../java/org/apache/bcel/generic/GOTO_W.java | 6 +- .../apache/bcel/generic/GotoInstruction.java | 2 +- .../java/org/apache/bcel/generic/I2B.java | 4 +- .../java/org/apache/bcel/generic/I2C.java | 4 +- .../java/org/apache/bcel/generic/I2D.java | 4 +- .../java/org/apache/bcel/generic/I2F.java | 4 +- .../java/org/apache/bcel/generic/I2L.java | 4 +- .../java/org/apache/bcel/generic/I2S.java | 4 +- .../java/org/apache/bcel/generic/IADD.java | 4 +- .../java/org/apache/bcel/generic/IALOAD.java | 4 +- .../java/org/apache/bcel/generic/IAND.java | 4 +- .../java/org/apache/bcel/generic/IASTORE.java | 4 +- .../java/org/apache/bcel/generic/ICONST.java | 6 +- .../java/org/apache/bcel/generic/IDIV.java | 6 +- .../java/org/apache/bcel/generic/IFEQ.java | 4 +- .../java/org/apache/bcel/generic/IFGE.java | 4 +- .../java/org/apache/bcel/generic/IFGT.java | 4 +- .../java/org/apache/bcel/generic/IFLE.java | 4 +- .../java/org/apache/bcel/generic/IFLT.java | 4 +- .../java/org/apache/bcel/generic/IFNE.java | 4 +- .../org/apache/bcel/generic/IFNONNULL.java | 4 +- .../java/org/apache/bcel/generic/IFNULL.java | 4 +- .../org/apache/bcel/generic/IF_ACMPEQ.java | 4 +- .../org/apache/bcel/generic/IF_ACMPNE.java | 4 +- .../org/apache/bcel/generic/IF_ICMPEQ.java | 4 +- .../org/apache/bcel/generic/IF_ICMPGE.java | 4 +- .../org/apache/bcel/generic/IF_ICMPGT.java | 4 +- .../org/apache/bcel/generic/IF_ICMPLE.java | 4 +- .../org/apache/bcel/generic/IF_ICMPLT.java | 4 +- .../org/apache/bcel/generic/IF_ICMPNE.java | 4 +- .../java/org/apache/bcel/generic/IINC.java | 10 +- .../java/org/apache/bcel/generic/ILOAD.java | 6 +- .../java/org/apache/bcel/generic/IMPDEP1.java | 4 +- .../java/org/apache/bcel/generic/IMPDEP2.java | 4 +- .../java/org/apache/bcel/generic/IMUL.java | 4 +- .../java/org/apache/bcel/generic/INEG.java | 4 +- .../org/apache/bcel/generic/INSTANCEOF.java | 6 +- .../apache/bcel/generic/INVOKEDYNAMIC.java | 14 +- .../apache/bcel/generic/INVOKEINTERFACE.java | 10 +- .../apache/bcel/generic/INVOKESPECIAL.java | 6 +- .../org/apache/bcel/generic/INVOKESTATIC.java | 6 +- .../apache/bcel/generic/INVOKEVIRTUAL.java | 6 +- .../java/org/apache/bcel/generic/IOR.java | 4 +- .../java/org/apache/bcel/generic/IREM.java | 6 +- .../java/org/apache/bcel/generic/IRETURN.java | 4 +- .../java/org/apache/bcel/generic/ISHL.java | 4 +- .../java/org/apache/bcel/generic/ISHR.java | 4 +- .../java/org/apache/bcel/generic/ISTORE.java | 6 +- .../java/org/apache/bcel/generic/ISUB.java | 4 +- .../java/org/apache/bcel/generic/IUSHR.java | 4 +- .../java/org/apache/bcel/generic/IXOR.java | 4 +- .../apache/bcel/generic/IfInstruction.java | 2 +- .../bcel/generic/IndexedInstruction.java | 2 +- .../org/apache/bcel/generic/Instruction.java | 8 +- .../bcel/generic/InstructionComparator.java | 2 +- .../apache/bcel/generic/InstructionConst.java | 4 +- .../bcel/generic/InstructionConstants.java | 4 +- .../bcel/generic/InstructionFactory.java | 6 +- .../bcel/generic/InstructionHandle.java | 4 +- .../apache/bcel/generic/InstructionList.java | 8 +- .../bcel/generic/InstructionListObserver.java | 2 +- .../bcel/generic/InstructionTargeter.java | 2 +- .../bcel/generic/InvokeInstruction.java | 10 +- .../java/org/apache/bcel/generic/JSR.java | 8 +- .../java/org/apache/bcel/generic/JSR_W.java | 6 +- .../apache/bcel/generic/JsrInstruction.java | 2 +- .../java/org/apache/bcel/generic/L2D.java | 4 +- .../java/org/apache/bcel/generic/L2F.java | 4 +- .../java/org/apache/bcel/generic/L2I.java | 4 +- .../java/org/apache/bcel/generic/LADD.java | 4 +- .../java/org/apache/bcel/generic/LALOAD.java | 4 +- .../java/org/apache/bcel/generic/LAND.java | 4 +- .../java/org/apache/bcel/generic/LASTORE.java | 4 +- .../java/org/apache/bcel/generic/LCMP.java | 4 +- .../java/org/apache/bcel/generic/LCONST.java | 8 +- .../java/org/apache/bcel/generic/LDC.java | 44 ++--- .../java/org/apache/bcel/generic/LDC2_W.java | 18 +- .../java/org/apache/bcel/generic/LDC_W.java | 6 +- .../java/org/apache/bcel/generic/LDIV.java | 6 +- .../java/org/apache/bcel/generic/LLOAD.java | 6 +- .../java/org/apache/bcel/generic/LMUL.java | 4 +- .../java/org/apache/bcel/generic/LNEG.java | 4 +- .../org/apache/bcel/generic/LOOKUPSWITCH.java | 6 +- .../java/org/apache/bcel/generic/LOR.java | 4 +- .../java/org/apache/bcel/generic/LREM.java | 6 +- .../java/org/apache/bcel/generic/LRETURN.java | 4 +- .../java/org/apache/bcel/generic/LSHL.java | 4 +- .../java/org/apache/bcel/generic/LSHR.java | 4 +- .../java/org/apache/bcel/generic/LSTORE.java | 6 +- .../java/org/apache/bcel/generic/LSUB.java | 4 +- .../java/org/apache/bcel/generic/LUSHR.java | 4 +- .../java/org/apache/bcel/generic/LXOR.java | 4 +- .../apache/bcel/generic/LineNumberGen.java | 4 +- .../org/apache/bcel/generic/LoadClass.java | 2 +- .../apache/bcel/generic/LoadInstruction.java | 2 +- .../apache/bcel/generic/LocalVariableGen.java | 6 +- .../generic/LocalVariableInstruction.java | 6 +- .../org/apache/bcel/generic/MONITORENTER.java | 6 +- .../org/apache/bcel/generic/MONITOREXIT.java | 6 +- .../apache/bcel/generic/MULTIANEWARRAY.java | 10 +- .../org/apache/bcel/generic/MethodGen.java | 36 ++-- .../apache/bcel/generic/MethodObserver.java | 2 +- .../java/org/apache/bcel/generic/NEW.java | 6 +- .../org/apache/bcel/generic/NEWARRAY.java | 10 +- .../java/org/apache/bcel/generic/NOP.java | 4 +- .../generic/NameSignatureInstruction.java | 10 +- .../apache/bcel/generic/NamedAndTyped.java | 2 +- .../org/apache/bcel/generic/ObjectType.java | 8 +- .../java/org/apache/bcel/generic/POP.java | 4 +- .../java/org/apache/bcel/generic/POP2.java | 4 +- .../java/org/apache/bcel/generic/PUSH.java | 4 +- .../org/apache/bcel/generic/PUTFIELD.java | 6 +- .../org/apache/bcel/generic/PUTSTATIC.java | 6 +- .../apache/bcel/generic/PopInstruction.java | 2 +- .../apache/bcel/generic/PushInstruction.java | 2 +- .../java/org/apache/bcel/generic/RET.java | 10 +- .../java/org/apache/bcel/generic/RETURN.java | 4 +- .../apache/bcel/generic/ReferenceType.java | 8 +- .../bcel/generic/ReturnInstruction.java | 6 +- .../bcel/generic/ReturnaddressType.java | 4 +- .../java/org/apache/bcel/generic/SALOAD.java | 4 +- .../java/org/apache/bcel/generic/SASTORE.java | 4 +- .../java/org/apache/bcel/generic/SIPUSH.java | 6 +- .../java/org/apache/bcel/generic/SWAP.java | 4 +- .../java/org/apache/bcel/generic/SWITCH.java | 2 +- .../java/org/apache/bcel/generic/Select.java | 4 +- .../bcel/generic/SimpleElementValueGen.java | 16 +- .../apache/bcel/generic/StackConsumer.java | 2 +- .../apache/bcel/generic/StackInstruction.java | 2 +- .../apache/bcel/generic/StackProducer.java | 2 +- .../apache/bcel/generic/StoreInstruction.java | 2 +- .../org/apache/bcel/generic/TABLESWITCH.java | 6 +- .../bcel/generic/TargetLostException.java | 2 +- .../java/org/apache/bcel/generic/Type.java | 8 +- .../apache/bcel/generic/TypedInstruction.java | 2 +- .../bcel/generic/UnconditionalBranch.java | 2 +- .../generic/VariableLengthInstruction.java | 2 +- .../java/org/apache/bcel/generic/Visitor.java | 2 +- .../org/apache/bcel/util/AttributeHTML.java | 34 ++-- .../org/apache/bcel/util/BCELComparator.java | 2 +- .../org/apache/bcel/util/BCELFactory.java | 64 +++---- .../java/org/apache/bcel/util/BCELifier.java | 28 +-- .../org/apache/bcel/util/ByteSequence.java | 2 +- .../java/org/apache/bcel/util/Class2HTML.java | 16 +- .../org/apache/bcel/util/ClassLoader.java | 16 +- .../bcel/util/ClassLoaderRepository.java | 8 +- .../java/org/apache/bcel/util/ClassPath.java | 2 +- .../apache/bcel/util/ClassPathRepository.java | 8 +- .../java/org/apache/bcel/util/ClassQueue.java | 4 +- .../java/org/apache/bcel/util/ClassSet.java | 4 +- .../java/org/apache/bcel/util/ClassStack.java | 4 +- .../org/apache/bcel/util/ClassVector.java | 4 +- .../java/org/apache/bcel/util/CodeHTML.java | 30 ++-- .../org/apache/bcel/util/ConstantHTML.java | 24 +-- .../apache/bcel/util/InstructionFinder.java | 10 +- .../org/apache/bcel/util/JavaWrapper.java | 6 +- .../MemorySensitiveClassPathRepository.java | 8 +- .../java/org/apache/bcel/util/MethodHTML.java | 18 +- .../java/org/apache/bcel/util/Repository.java | 6 +- .../apache/bcel/util/SyntheticRepository.java | 4 +- .../bcel/verifier/GraphicalVerifier.java | 4 +- .../apache/bcel/verifier/NativeVerifier.java | 2 +- .../apache/bcel/verifier/PassVerifier.java | 2 +- .../apache/bcel/verifier/TransitiveHull.java | 6 +- .../bcel/verifier/VerificationResult.java | 2 +- .../org/apache/bcel/verifier/Verifier.java | 20 +-- .../bcel/verifier/VerifierAppFrame.java | 6 +- .../apache/bcel/verifier/VerifierFactory.java | 2 +- .../verifier/VerifierFactoryListModel.java | 2 +- .../verifier/VerifierFactoryObserver.java | 2 +- .../apache/bcel/verifier/VerifyDialog.java | 6 +- .../exc/AssertionViolatedException.java | 2 +- .../exc/ClassConstraintException.java | 2 +- .../verifier/exc/CodeConstraintException.java | 2 +- .../verifier/exc/InvalidMethodException.java | 2 +- .../exc/LinkingConstraintException.java | 2 +- .../bcel/verifier/exc/LoadingException.java | 2 +- ...ocalVariableInfoInconsistentException.java | 2 +- .../exc/StaticCodeConstraintException.java | 2 +- ...ticCodeInstructionConstraintException.java | 2 +- ...InstructionOperandConstraintException.java | 2 +- .../StructuralCodeConstraintException.java | 2 +- .../org/apache/bcel/verifier/exc/Utility.java | 2 +- .../verifier/exc/VerificationException.java | 2 +- .../VerifierConstraintViolatedException.java | 2 +- .../bcel/verifier/statics/DOUBLE_Upper.java | 6 +- .../apache/bcel/verifier/statics/IntList.java | 2 +- .../bcel/verifier/statics/LONG_Upper.java | 6 +- .../verifier/statics/LocalVariableInfo.java | 6 +- .../verifier/statics/LocalVariablesInfo.java | 8 +- .../bcel/verifier/statics/Pass1Verifier.java | 22 +-- .../bcel/verifier/statics/Pass2Verifier.java | 100 +++++------ .../bcel/verifier/statics/Pass3aVerifier.java | 170 +++++++++--------- .../statics/StringRepresentation.java | 100 +++++------ .../structurals/ControlFlowGraph.java | 26 +-- .../structurals/ExceptionHandler.java | 6 +- .../structurals/ExceptionHandlers.java | 8 +- .../structurals/ExecutionVisitor.java | 20 +-- .../bcel/verifier/structurals/Frame.java | 2 +- .../verifier/structurals/GenericArray.java | 2 +- .../structurals/InstConstraintVisitor.java | 42 ++--- .../structurals/InstructionContext.java | 4 +- .../verifier/structurals/LocalVariables.java | 14 +- .../verifier/structurals/OperandStack.java | 12 +- .../verifier/structurals/Pass3bVerifier.java | 48 ++--- .../bcel/verifier/structurals/Subroutine.java | 4 +- .../verifier/structurals/Subroutines.java | 34 ++-- .../structurals/UninitializedObjectType.java | 8 +- .../bcel/classfile/JDKClassDumpTestCase.java | 2 +- .../bcel/classfile/UtilityTestCase.java | 2 +- .../org/apache/bcel/data/AnnotatedFields.java | 2 +- .../data/AnnotatedWithCombinedAnnotation.java | 2 +- .../bcel/data/AnnotatedWithEnumClass.java | 2 +- .../bcel/data/AnnotationEnumElement.java | 2 +- .../apache/bcel/data/AnonymousClassTest.java | 2 +- .../bcel/data/AttributeTestClassEM01.java | 2 +- .../bcel/data/AttributeTestClassEM02.java | 2 +- .../apache/bcel/data/CombinedAnnotation.java | 2 +- .../bcel/data/ComplexAnnotatedClass.java | 2 +- .../apache/bcel/data/ComplexAnnotation.java | 2 +- .../java/org/apache/bcel/data/MarkedType.java | 2 +- .../apache/bcel/data/MarkerAnnotation.java | 2 +- .../bcel/data/MarkerAnnotationInvisible.java | 2 +- .../org/apache/bcel/data/PLSETestClass.java | 2 +- .../bcel/data/SimpleAnnotatedClass.java | 2 +- .../apache/bcel/data/SimpleAnnotation.java | 2 +- .../org/apache/bcel/data/SimpleClass.java | 2 +- .../java/org/apache/bcel/data/SimpleEnum.java | 2 +- .../bcel/generic/AnnotationGenTestCase.java | 14 +- .../bcel/generic/BranchHandleTestCase.java | 2 +- .../generic/FieldAnnotationsTestCase.java | 14 +- .../GeneratingAnnotatedClassesTestCase.java | 24 +-- .../generic/InstructionHandleTestCase.java | 2 +- .../bcel/generic/JDKGenericDumpTestCase.java | 10 +- .../bcel/generic/MethodGenTestCase.java | 8 +- .../apache/bcel/util/BCELifierTestCase.java | 4 +- .../apache/bcel/util/Class2HTMLTestCase.java | 4 +- .../bcel/util/InstructionFinderTest.java | 14 +- .../verifier/AbstractVerifierTestCase.java | 6 +- .../verifier/VerifierArrayAccessTestCase.java | 8 +- .../bcel/verifier/VerifierInvokeTestCase.java | 2 +- .../bcel/verifier/VerifierReturnTestCase.java | 6 +- .../bcel/verifier/VerifierTestCase.java | 2 +- .../bcel/verifier/tests/TestArray01.java | 2 +- .../verifier/tests/TestArrayAccess01.java | 2 +- .../tests/TestArrayAccess02Creator.java | 24 +-- .../tests/TestArrayAccess03Creator.java | 24 +-- .../tests/TestArrayAccess04Creator.java | 22 +-- .../bcel/verifier/tests/TestCreator.java | 2 +- .../tests/TestLegalInvokeInterface01.java | 2 +- .../tests/TestLegalInvokeSpecial01.java | 2 +- .../tests/TestLegalInvokeSpecial02.java | 2 +- .../tests/TestLegalInvokeStatic01.java | 2 +- .../tests/TestLegalInvokeVirtual01.java | 2 +- .../tests/TestLegalInvokeVirtual02.java | 2 +- .../verifier/tests/TestReturn01Creator.java | 20 +-- .../bcel/verifier/tests/TestReturn02.java | 2 +- .../verifier/tests/TestReturn03Creator.java | 20 +-- .../apache/bcel/visitors/CounterVisitor.java | 94 +++++----- 423 files changed, 1506 insertions(+), 1505 deletions(-) diff --git a/pom.xml b/pom.xml index fd243a98..7d6b2ea8 100644 --- a/pom.xml +++ b/pom.xml @@ -58,6 +58,7 @@ 2.17 2.6.1 + -Xdoclint:none diff --git a/src/main/java/org/apache/bcel/classfile/AccessFlags.java b/src/main/java/org/apache/bcel/classfile/AccessFlags.java index c411c218..870362d7 100644 --- a/src/main/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/main/java/org/apache/bcel/classfile/AccessFlags.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Super class for all objects that have modifiers like private, final, ... diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java index 05beb78f..b4fb6c46 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationDefault.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Represents the default value of a annotation for a method info diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java index c034bad9..2aa79587 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationElementValue.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataOutputStream; import java.io.IOException; diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index a10c96e4..8da08b14 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; @@ -24,7 +24,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * represents one annotation in the annotation table diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index ec59ce64..be7ca5b7 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java index df4636c0..0e2e6afe 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataOutputStream; import java.io.IOException; diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index b87d0b2b..5934f450 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataInputStream; @@ -24,7 +24,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Abstract super class for Attribute objects. Currently the diff --git a/src/main/java/org/apache/bcel/classfile/AttributeReader.java b/src/main/java/org/apache/bcel/classfile/AttributeReader.java index 942dbec0..a88dce3a 100644 --- a/src/main/java/org/apache/bcel/classfile/AttributeReader.java +++ b/src/main/java/org/apache/bcel/classfile/AttributeReader.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; /** * Unknown (non-standard) attributes may be read via user-defined factory diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java index 1f1afa06..66296cfb 100644 --- a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java @@ -15,14 +15,14 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; import java.util.Arrays; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents a bootstrap method attribute, i.e., the bootstrap diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java index 1af4d57d..4aa090ff 100644 --- a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java +++ b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents a BootstrapMethods attribute. diff --git a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java index 48676bd5..af2783d9 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java index 3adf142b..1329cacf 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java +++ b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; /** * Thrown when the BCEL attempts to read a class file and determines diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 9595be69..123d5059 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.BufferedInputStream; import java.io.DataInputStream; @@ -25,7 +25,7 @@ import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Wrapper class that parses a given Java .class file. The method
    Code diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index eddf986c..7a6d3410 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.util.BCELComparator; +import org.apache.bcel.Const; +import org.apache.bcel.util.BCELComparator; /** * Abstract superclass for classes to represent the different constant types diff --git a/src/main/java/org/apache/bcel/classfile/ConstantCP.java b/src/main/java/org/apache/bcel/classfile/ConstantCP.java index 3ce39d3d..88f94f1c 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantCP.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantCP.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Abstract super class for Fieldref, Methodref, InterfaceMethodref and diff --git a/src/main/java/org/apache/bcel/classfile/ConstantClass.java b/src/main/java/org/apache/bcel/classfile/ConstantClass.java index 2236ccb5..fdb863f4 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantClass.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from the abstract {@link Constant} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java index dd3e2543..60a0da1b 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantDouble.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantDouble.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from the abstract {@link Constant} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java index cbfa372f..8b136efe 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantFieldref.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents a constant pool reference to a field. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java index 8a79077d..5877b10f 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantFloat.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantFloat.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from the abstract {@link Constant} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java index 5a397054..cb3204d0 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInteger.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInteger.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from the abstract {@link Constant} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java index 309a6fa6..7ebc2b67 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInterfaceMethodref.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents a constant pool reference to an interface method. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java b/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java index 897d2102..2a82d85f 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantInvokeDynamic.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from the abstract {@link Constant} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantLong.java b/src/main/java/org/apache/bcel/classfile/ConstantLong.java index f94549ab..052e8084 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantLong.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantLong.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from the abstract {@link Constant} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java index 85b7d523..240a8af9 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantMethodHandle.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from the abstract {@link Constant} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java index 1491f14c..ef8d3f4e 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantMethodType.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from the abstract {@link Constant} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java index 87596dfc..9949fea5 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantMethodref.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents a constant pool reference to a method. diff --git a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java index 1d1743da..1252c594 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantNameAndType.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from the abstract {@link Constant} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantObject.java b/src/main/java/org/apache/bcel/classfile/ConstantObject.java index f5b47e3d..ae405d58 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantObject.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantObject.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; /** * This interface denotes those constants that have a "natural" value, diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index 115cfbda..99ddc08a 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents the constant pool, i.e., a table of constants, of @@ -33,7 +33,7 @@ import org.apache.commons.bcel6.Const; * @version $Id$ * @see Constant - * @see org.apache.commons.bcel6.generic.ConstantPoolGen + * @see org.apache.bcel.generic.ConstantPoolGen */ public class ConstantPool implements Cloneable, Node { diff --git a/src/main/java/org/apache/bcel/classfile/ConstantString.java b/src/main/java/org/apache/bcel/classfile/ConstantString.java index 7e80ba79..dc675c89 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantString.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from the abstract {@link Constant} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java index e3825eda..5fd541b0 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; @@ -24,7 +24,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from the abstract {@link Constant} diff --git a/src/main/java/org/apache/bcel/classfile/ConstantValue.java b/src/main/java/org/apache/bcel/classfile/ConstantValue.java index 7211a306..e476f3b8 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantValue.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from Attribute and represents a constant diff --git a/src/main/java/org/apache/bcel/classfile/Deprecated.java b/src/main/java/org/apache/bcel/classfile/Deprecated.java index d166214f..03f49384 100644 --- a/src/main/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/main/java/org/apache/bcel/classfile/Deprecated.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from Attribute and denotes that this is a diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index 90514acf..3740b367 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.util.Stack; diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index 3a25cb9f..573297a3 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index 32678ace..c1564e92 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * an annotation's element value pair diff --git a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java index 8e2d5a48..b3ce460b 100644 --- a/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/EmptyVisitor.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; /** * Visitor with empty method bodies, can be extended and used in conjunction diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java index 0674b2a6..ebf49480 100644 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This attribute exists for local or diff --git a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java index 4c3eb632..5b7045f8 100644 --- a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java index fa095ba8..5feb9762 100644 --- a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents the table of exceptions that are thrown by a diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java index 03cabe69..942d78f6 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/bcel/classfile/Field.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.generic.Type; -import org.apache.commons.bcel6.util.BCELComparator; +import org.apache.bcel.Const; +import org.apache.bcel.generic.Type; +import org.apache.bcel.util.BCELComparator; /** * This class represents the field info structure, i.e., the representation diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index 1bddc60b..19d0278c 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Abstract super class for fields and methods. diff --git a/src/main/java/org/apache/bcel/classfile/InnerClass.java b/src/main/java/org/apache/bcel/classfile/InnerClass.java index 17b08c73..60473277 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClass.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents a inner class attribute, i.e., the class diff --git a/src/main/java/org/apache/bcel/classfile/InnerClasses.java b/src/main/java/org/apache/bcel/classfile/InnerClasses.java index cdc4caf4..7f98ed31 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClasses.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from Attribute and denotes that this class diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 62a88c16..03f0537f 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; @@ -29,11 +29,11 @@ import java.util.Set; import java.util.StringTokenizer; import java.util.TreeSet; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.generic.Type; -import org.apache.commons.bcel6.util.BCELComparator; -import org.apache.commons.bcel6.util.ClassQueue; -import org.apache.commons.bcel6.util.SyntheticRepository; +import org.apache.bcel.Const; +import org.apache.bcel.generic.Type; +import org.apache.bcel.util.BCELComparator; +import org.apache.bcel.util.ClassQueue; +import org.apache.bcel.util.SyntheticRepository; /** * Represents a Java class, i.e., the data structures, constant pool, @@ -44,7 +44,7 @@ import org.apache.commons.bcel6.util.SyntheticRepository; * should see the ClassGen class. * @version $Id$ - * @see org.apache.commons.bcel6.generic.ClassGen + * @see org.apache.bcel.generic.ClassGen */ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparable { @@ -94,7 +94,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * use the default SyntheticRepository, because we * don't know any better. */ - private transient org.apache.commons.bcel6.util.Repository repository = SyntheticRepository + private transient org.apache.bcel.util.Repository repository = SyntheticRepository .getInstance(); @@ -756,7 +756,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * Gets the ClassRepository which holds its definition. By default * this is the same as SyntheticRepository.getInstance(); */ - public org.apache.commons.bcel6.util.Repository getRepository() { + public org.apache.bcel.util.Repository getRepository() { return repository; } @@ -765,7 +765,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * Sets the ClassRepository which loaded the JavaClass. * Should be called immediately after parsing is done. */ - public void setRepository( final org.apache.commons.bcel6.util.Repository repository ) { // TODO make protected? + public void setRepository( final org.apache.bcel.util.Repository repository ) { // TODO make protected? this.repository = repository; } diff --git a/src/main/java/org/apache/bcel/classfile/LineNumber.java b/src/main/java/org/apache/bcel/classfile/LineNumber.java index 257f8654..ac65b35f 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumber.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java index e45faffe..a94a5dfc 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents a table of line numbers for debugging diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java index 4ccde3fc..e6a3f99d 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariable.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents a local variable within a method. It contains its diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index 093b2a84..446f2a2d 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents colection of local variables in a diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index 09a964e3..3f823d7a 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; // The new table is used when generic types are about... diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index bef8fa4f..af20a4a8 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.generic.Type; -import org.apache.commons.bcel6.util.BCELComparator; +import org.apache.bcel.Const; +import org.apache.bcel.generic.Type; +import org.apache.bcel.util.BCELComparator; /** * This class represents the method info structure, i.e., the representation diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameter.java b/src/main/java/org/apache/bcel/classfile/MethodParameter.java index 1dbc4dfa..fac9b6b3 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameter.java +++ b/src/main/java/org/apache/bcel/classfile/MethodParameter.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Entry of the parameters table. diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameters.java b/src/main/java/org/apache/bcel/classfile/MethodParameters.java index a34b3534..abb1420f 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameters.java +++ b/src/main/java/org/apache/bcel/classfile/MethodParameters.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents a MethodParameters attribute. diff --git a/src/main/java/org/apache/bcel/classfile/Node.java b/src/main/java/org/apache/bcel/classfile/Node.java index ec59c705..68bec5f3 100644 --- a/src/main/java/org/apache/bcel/classfile/Node.java +++ b/src/main/java/org/apache/bcel/classfile/Node.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; /** * Denote class to have an accept method(); diff --git a/src/main/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java index 1ae96c6a..58ba9bff 100644 --- a/src/main/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/main/java/org/apache/bcel/classfile/PMGClass.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from Attribute and represents a reference diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index cdff0283..743063c9 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index 7f91b615..ff9cfeef 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java index 110c56c6..f796dc00 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleAnnotations.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * represents an annotation that is represented in the class file but is not diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java index 4173b0d1..f5db5831 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeInvisibleParameterAnnotations.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Represents a parameter annotation that is represented in the class file diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java index 6f5ea812..c1601697 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleAnnotations.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * represents an annotation that is represented in the class file and is diff --git a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java index 9f7145a2..70306ef7 100644 --- a/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/RuntimeVisibleParameterAnnotations.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Represents a parameter annotation that is represented in the class file diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index d767d744..7b605b27 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.ByteArrayInputStream; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from Attribute and represents a reference diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java index cfedd941..bf3ed572 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java index d9dd066f..5b84444f 100644 --- a/src/main/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/main/java/org/apache/bcel/classfile/SourceFile.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from Attribute and represents a reference diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java index 0e4ad83a..6cdfc8f0 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMap.java +++ b/src/main/java/org/apache/bcel/classfile/StackMap.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents a stack map attribute used for diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index 930791ce..9af82749 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents a stack map entry recording the types of diff --git a/src/main/java/org/apache/bcel/classfile/StackMapType.java b/src/main/java/org/apache/bcel/classfile/StackMapType.java index 66639095..a98a88d8 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapType.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents the type of a local variable or item on stack diff --git a/src/main/java/org/apache/bcel/classfile/Synthetic.java b/src/main/java/org/apache/bcel/classfile/Synthetic.java index c9812534..44bdc8a2 100644 --- a/src/main/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/main/java/org/apache/bcel/classfile/Synthetic.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class is derived from Attribute and declares this class as diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index 393281f4..22757709 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.DataInput; import java.io.DataOutputStream; @@ -23,7 +23,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This class represents a reference to an unknown (i.e., diff --git a/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java b/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java index 1c2375c5..b9daa4dd 100644 --- a/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java +++ b/src/main/java/org/apache/bcel/classfile/UnknownAttributeReader.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; /** * Unknown (non-standard) attributes may be read via user-defined factory diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 28bc6265..f8f97405 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -34,8 +34,8 @@ import java.util.Locale; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.Const; +import org.apache.bcel.util.ByteSequence; /** * Utility functions that do not really belong to any class in particular. diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java index be78bebc..2f02c6a7 100644 --- a/src/main/java/org/apache/bcel/classfile/Visitor.java +++ b/src/main/java/org/apache/bcel/classfile/Visitor.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; /** * Interface to make use of the Visitor pattern programming style. I.e. a class diff --git a/src/main/java/org/apache/bcel/generic/AALOAD.java b/src/main/java/org/apache/bcel/generic/AALOAD.java index 27f02735..737cd12d 100644 --- a/src/main/java/org/apache/bcel/generic/AALOAD.java +++ b/src/main/java/org/apache/bcel/generic/AALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * AALOAD - Load reference from array @@ -28,7 +28,7 @@ public class AALOAD extends ArrayInstruction implements StackProducer { /** Load reference from array */ public AALOAD() { - super(org.apache.commons.bcel6.Const.AALOAD); + super(org.apache.bcel.Const.AALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/AASTORE.java b/src/main/java/org/apache/bcel/generic/AASTORE.java index 5a7edc96..74d570db 100644 --- a/src/main/java/org/apache/bcel/generic/AASTORE.java +++ b/src/main/java/org/apache/bcel/generic/AASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * AASTORE - Store into reference array @@ -28,7 +28,7 @@ public class AASTORE extends ArrayInstruction implements StackConsumer { /** Store into reference array */ public AASTORE() { - super(org.apache.commons.bcel6.Const.AASTORE); + super(org.apache.bcel.Const.AASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java index 8adfee9b..45450b9a 100644 --- a/src/main/java/org/apache/bcel/generic/ACONST_NULL.java +++ b/src/main/java/org/apache/bcel/generic/ACONST_NULL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * ACONST_NULL - Push null reference @@ -29,7 +29,7 @@ public class ACONST_NULL extends Instruction implements PushInstruction, TypedIn * Push null reference */ public ACONST_NULL() { - super(org.apache.commons.bcel6.Const.ACONST_NULL, (short) 1); + super(org.apache.bcel.Const.ACONST_NULL, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/ALOAD.java b/src/main/java/org/apache/bcel/generic/ALOAD.java index 87ba29a9..d66bab89 100644 --- a/src/main/java/org/apache/bcel/generic/ALOAD.java +++ b/src/main/java/org/apache/bcel/generic/ALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * ALOAD - Load reference from local variable @@ -30,7 +30,7 @@ public class ALOAD extends LoadInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ ALOAD() { - super(org.apache.commons.bcel6.Const.ALOAD, org.apache.commons.bcel6.Const.ALOAD_0); + super(org.apache.bcel.Const.ALOAD, org.apache.bcel.Const.ALOAD_0); } @@ -38,7 +38,7 @@ public class ALOAD extends LoadInstruction { * @param n index of local variable */ public ALOAD(final int n) { - super(org.apache.commons.bcel6.Const.ALOAD, org.apache.commons.bcel6.Const.ALOAD_0, n); + super(org.apache.bcel.Const.ALOAD, org.apache.bcel.Const.ALOAD_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java index fd5c673d..dc59a5fa 100644 --- a/src/main/java/org/apache/bcel/generic/ANEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/ANEWARRAY.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * ANEWARRAY - Create new array of references @@ -37,7 +37,7 @@ public class ANEWARRAY extends CPInstruction implements LoadClass, AllocationIns public ANEWARRAY(final int index) { - super(org.apache.commons.bcel6.Const.ANEWARRAY, index); + super(org.apache.bcel.Const.ANEWARRAY, index); } diff --git a/src/main/java/org/apache/bcel/generic/ARETURN.java b/src/main/java/org/apache/bcel/generic/ARETURN.java index 27045087..3c50bc91 100644 --- a/src/main/java/org/apache/bcel/generic/ARETURN.java +++ b/src/main/java/org/apache/bcel/generic/ARETURN.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * ARETURN - Return reference from method @@ -29,7 +29,7 @@ public class ARETURN extends ReturnInstruction { * Return reference from method */ public ARETURN() { - super(org.apache.commons.bcel6.Const.ARETURN); + super(org.apache.bcel.Const.ARETURN); } diff --git a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java index 47e4f20c..1923ed37 100644 --- a/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java +++ b/src/main/java/org/apache/bcel/generic/ARRAYLENGTH.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * ARRAYLENGTH - Get length of array @@ -30,7 +30,7 @@ public class ARRAYLENGTH extends Instruction implements ExceptionThrower, StackP /** Get length of array */ public ARRAYLENGTH() { - super(org.apache.commons.bcel6.Const.ARRAYLENGTH, (short) 1); + super(org.apache.bcel.Const.ARRAYLENGTH, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/ASTORE.java b/src/main/java/org/apache/bcel/generic/ASTORE.java index 52dcfc59..02cdf255 100644 --- a/src/main/java/org/apache/bcel/generic/ASTORE.java +++ b/src/main/java/org/apache/bcel/generic/ASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * ASTORE - Store reference into local variable @@ -30,7 +30,7 @@ public class ASTORE extends StoreInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ ASTORE() { - super(org.apache.commons.bcel6.Const.ASTORE, org.apache.commons.bcel6.Const.ASTORE_0); + super(org.apache.bcel.Const.ASTORE, org.apache.bcel.Const.ASTORE_0); } @@ -38,7 +38,7 @@ public class ASTORE extends StoreInstruction { * @param n index of local variable */ public ASTORE(final int n) { - super(org.apache.commons.bcel6.Const.ASTORE, org.apache.commons.bcel6.Const.ASTORE_0, n); + super(org.apache.bcel.Const.ASTORE, org.apache.bcel.Const.ASTORE_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/ATHROW.java b/src/main/java/org/apache/bcel/generic/ATHROW.java index a798ec7a..acee7e9a 100644 --- a/src/main/java/org/apache/bcel/generic/ATHROW.java +++ b/src/main/java/org/apache/bcel/generic/ATHROW.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * ATHROW - Throw exception @@ -31,7 +31,7 @@ public class ATHROW extends Instruction implements UnconditionalBranch, Exceptio * Throw exception */ public ATHROW() { - super(org.apache.commons.bcel6.Const.ATHROW, (short) 1); + super(org.apache.bcel.Const.ATHROW, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/AllocationInstruction.java b/src/main/java/org/apache/bcel/generic/AllocationInstruction.java index 3dd25e35..9db1639b 100644 --- a/src/main/java/org/apache/bcel/generic/AllocationInstruction.java +++ b/src/main/java/org/apache/bcel/generic/AllocationInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denote family of instructions that allocates space in the heap. diff --git a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java index 7e8da966..d8deb10f 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationElementValueGen.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.classfile.AnnotationElementValue; -import org.apache.commons.bcel6.classfile.ElementValue; +import org.apache.bcel.classfile.AnnotationElementValue; +import org.apache.bcel.classfile.ElementValue; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index f91ce1d5..aeedbfd4 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -26,14 +26,14 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.bcel6.classfile.AnnotationEntry; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.ElementValuePair; -import org.apache.commons.bcel6.classfile.RuntimeInvisibleAnnotations; -import org.apache.commons.bcel6.classfile.RuntimeInvisibleParameterAnnotations; -import org.apache.commons.bcel6.classfile.RuntimeVisibleAnnotations; -import org.apache.commons.bcel6.classfile.RuntimeVisibleParameterAnnotations; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ElementValuePair; +import org.apache.bcel.classfile.RuntimeInvisibleAnnotations; +import org.apache.bcel.classfile.RuntimeInvisibleParameterAnnotations; +import org.apache.bcel.classfile.RuntimeVisibleAnnotations; +import org.apache.bcel.classfile.RuntimeVisibleParameterAnnotations; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java b/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java index 45cf6ba5..b000d381 100644 --- a/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ArithmeticInstruction.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Super class for the family of arithmetic instructions. diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index 6739d72b..8e123a21 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -15,15 +15,15 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.bcel6.classfile.ArrayElementValue; -import org.apache.commons.bcel6.classfile.ElementValue; +import org.apache.bcel.classfile.ArrayElementValue; +import org.apache.bcel.classfile.ElementValue; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/ArrayInstruction.java b/src/main/java/org/apache/bcel/generic/ArrayInstruction.java index 02d52a27..b5005690 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ArrayInstruction.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * Super class for instructions dealing with array access such as IALOAD. @@ -55,29 +55,29 @@ public abstract class ArrayInstruction extends Instruction implements ExceptionT public Type getType( final ConstantPoolGen cp ) { final short _opcode = super.getOpcode(); switch (_opcode) { - case org.apache.commons.bcel6.Const.IALOAD: - case org.apache.commons.bcel6.Const.IASTORE: + case org.apache.bcel.Const.IALOAD: + case org.apache.bcel.Const.IASTORE: return Type.INT; - case org.apache.commons.bcel6.Const.CALOAD: - case org.apache.commons.bcel6.Const.CASTORE: + case org.apache.bcel.Const.CALOAD: + case org.apache.bcel.Const.CASTORE: return Type.CHAR; - case org.apache.commons.bcel6.Const.BALOAD: - case org.apache.commons.bcel6.Const.BASTORE: + case org.apache.bcel.Const.BALOAD: + case org.apache.bcel.Const.BASTORE: return Type.BYTE; - case org.apache.commons.bcel6.Const.SALOAD: - case org.apache.commons.bcel6.Const.SASTORE: + case org.apache.bcel.Const.SALOAD: + case org.apache.bcel.Const.SASTORE: return Type.SHORT; - case org.apache.commons.bcel6.Const.LALOAD: - case org.apache.commons.bcel6.Const.LASTORE: + case org.apache.bcel.Const.LALOAD: + case org.apache.bcel.Const.LASTORE: return Type.LONG; - case org.apache.commons.bcel6.Const.DALOAD: - case org.apache.commons.bcel6.Const.DASTORE: + case org.apache.bcel.Const.DALOAD: + case org.apache.bcel.Const.DASTORE: return Type.DOUBLE; - case org.apache.commons.bcel6.Const.FALOAD: - case org.apache.commons.bcel6.Const.FASTORE: + case org.apache.bcel.Const.FALOAD: + case org.apache.bcel.Const.FASTORE: return Type.FLOAT; - case org.apache.commons.bcel6.Const.AALOAD: - case org.apache.commons.bcel6.Const.AASTORE: + case org.apache.bcel.Const.AALOAD: + case org.apache.bcel.Const.AASTORE: return Type.OBJECT; default: throw new ClassGenException("Oops: unknown case in switch" + _opcode); diff --git a/src/main/java/org/apache/bcel/generic/ArrayType.java b/src/main/java/org/apache/bcel/generic/ArrayType.java index 7d98fdb9..96b723dd 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayType.java +++ b/src/main/java/org/apache/bcel/generic/ArrayType.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Denotes array type, such as int[][] diff --git a/src/main/java/org/apache/bcel/generic/BALOAD.java b/src/main/java/org/apache/bcel/generic/BALOAD.java index bcc9731e..9c9e3802 100644 --- a/src/main/java/org/apache/bcel/generic/BALOAD.java +++ b/src/main/java/org/apache/bcel/generic/BALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * BALOAD - Load byte or boolean from array @@ -28,7 +28,7 @@ public class BALOAD extends ArrayInstruction implements StackProducer { /** Load byte or boolean from array */ public BALOAD() { - super(org.apache.commons.bcel6.Const.BALOAD); + super(org.apache.bcel.Const.BALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/BASTORE.java b/src/main/java/org/apache/bcel/generic/BASTORE.java index 58ebe0fa..85118121 100644 --- a/src/main/java/org/apache/bcel/generic/BASTORE.java +++ b/src/main/java/org/apache/bcel/generic/BASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * BASTORE - Store into byte or boolean array @@ -28,7 +28,7 @@ public class BASTORE extends ArrayInstruction implements StackConsumer { /** Store byte or boolean into array */ public BASTORE() { - super(org.apache.commons.bcel6.Const.BASTORE); + super(org.apache.bcel.Const.BASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/BIPUSH.java b/src/main/java/org/apache/bcel/generic/BIPUSH.java index 733c3c4a..b396780c 100644 --- a/src/main/java/org/apache/bcel/generic/BIPUSH.java +++ b/src/main/java/org/apache/bcel/generic/BIPUSH.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.util.ByteSequence; /** * BIPUSH - Push byte on stack @@ -45,7 +45,7 @@ public class BIPUSH extends Instruction implements ConstantPushInstruction { /** Push byte on stack */ public BIPUSH(final byte b) { - super(org.apache.commons.bcel6.Const.BIPUSH, (short) 2); + super(org.apache.bcel.Const.BIPUSH, (short) 2); this.b = b; } diff --git a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java index b9765fff..fbda486c 100644 --- a/src/main/java/org/apache/bcel/generic/BREAKPOINT.java +++ b/src/main/java/org/apache/bcel/generic/BREAKPOINT.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * BREAKPOINT, JVM dependent, ignored by default @@ -25,7 +25,7 @@ package org.apache.commons.bcel6.generic; public class BREAKPOINT extends Instruction { public BREAKPOINT() { - super(org.apache.commons.bcel6.Const.BREAKPOINT, (short) 1); + super(org.apache.bcel.Const.BREAKPOINT, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/BasicType.java b/src/main/java/org/apache/bcel/generic/BasicType.java index 1f077a9f..a1cc847a 100644 --- a/src/main/java/org/apache/bcel/generic/BasicType.java +++ b/src/main/java/org/apache/bcel/generic/BasicType.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Denotes basic type such as int. diff --git a/src/main/java/org/apache/bcel/generic/BranchHandle.java b/src/main/java/org/apache/bcel/generic/BranchHandle.java index 996288b8..03b1df19 100644 --- a/src/main/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/main/java/org/apache/bcel/generic/BranchHandle.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * BranchHandle is returned by specialized InstructionList.append() whenever a diff --git a/src/main/java/org/apache/bcel/generic/BranchInstruction.java b/src/main/java/org/apache/bcel/generic/BranchInstruction.java index eda9a3ca..2e0ea668 100644 --- a/src/main/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/main/java/org/apache/bcel/generic/BranchInstruction.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.util.ByteSequence; /** * Abstract super class for branching instructions like GOTO, IFEQ, etc.. diff --git a/src/main/java/org/apache/bcel/generic/CALOAD.java b/src/main/java/org/apache/bcel/generic/CALOAD.java index a713ae9f..46db6b90 100644 --- a/src/main/java/org/apache/bcel/generic/CALOAD.java +++ b/src/main/java/org/apache/bcel/generic/CALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * CALOAD - Load char from array @@ -28,7 +28,7 @@ public class CALOAD extends ArrayInstruction implements StackProducer { /** Load char from array */ public CALOAD() { - super(org.apache.commons.bcel6.Const.CALOAD); + super(org.apache.bcel.Const.CALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/CASTORE.java b/src/main/java/org/apache/bcel/generic/CASTORE.java index d9d1d61a..a0180716 100644 --- a/src/main/java/org/apache/bcel/generic/CASTORE.java +++ b/src/main/java/org/apache/bcel/generic/CASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * CASTORE - Store into char array @@ -28,7 +28,7 @@ public class CASTORE extends ArrayInstruction implements StackConsumer { /** Store char into array */ public CASTORE() { - super(org.apache.commons.bcel6.Const.CASTORE); + super(org.apache.bcel.Const.CASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/CHECKCAST.java b/src/main/java/org/apache/bcel/generic/CHECKCAST.java index 5fd8a4e9..123688bb 100644 --- a/src/main/java/org/apache/bcel/generic/CHECKCAST.java +++ b/src/main/java/org/apache/bcel/generic/CHECKCAST.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * CHECKCAST - Check whether object is of given type @@ -40,7 +40,7 @@ public class CHECKCAST extends CPInstruction implements LoadClass, ExceptionThro * @param index index to class in constant pool */ public CHECKCAST(final int index) { - super(org.apache.commons.bcel6.Const.CHECKCAST, index); + super(org.apache.bcel.Const.CHECKCAST, index); } diff --git a/src/main/java/org/apache/bcel/generic/CPInstruction.java b/src/main/java/org/apache/bcel/generic/CPInstruction.java index b8d37961..247d0a5f 100644 --- a/src/main/java/org/apache/bcel/generic/CPInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CPInstruction.java @@ -15,15 +15,15 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.util.ByteSequence; /** * Abstract super class for instructions that use an index into the @@ -98,7 +98,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct if (c instanceof ConstantClass) { str = str.replace('.', '/'); } - return org.apache.commons.bcel6.Const.getOpcodeName(super.getOpcode()) + " " + str; + return org.apache.bcel.Const.getOpcodeName(super.getOpcode()) + " " + str; } @@ -141,7 +141,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct @Override public Type getType( final ConstantPoolGen cpg ) { ConstantPool cp = cpg.getConstantPool(); - String name = cp.getConstantString(index, org.apache.commons.bcel6.Const.CONSTANT_Class); + String name = cp.getConstantString(index, org.apache.bcel.Const.CONSTANT_Class); if (!name.startsWith("[")) { name = "L" + name + ";"; } diff --git a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java index bb622261..72c46122 100644 --- a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.classfile.ClassElementValue; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.ElementValue; +import org.apache.bcel.classfile.ClassElementValue; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ElementValue; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index 4e1694fc..e9ecb385 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -15,24 +15,24 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.util.ArrayList; import java.util.List; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.AccessFlags; -import org.apache.commons.bcel6.classfile.AnnotationEntry; -import org.apache.commons.bcel6.classfile.Annotations; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.RuntimeInvisibleAnnotations; -import org.apache.commons.bcel6.classfile.RuntimeVisibleAnnotations; -import org.apache.commons.bcel6.classfile.SourceFile; -import org.apache.commons.bcel6.util.BCELComparator; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.AccessFlags; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Annotations; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.RuntimeInvisibleAnnotations; +import org.apache.bcel.classfile.RuntimeVisibleAnnotations; +import org.apache.bcel.classfile.SourceFile; +import org.apache.bcel.util.BCELComparator; /** * Template class for building up a java class. May be initialized with an diff --git a/src/main/java/org/apache/bcel/generic/ClassGenException.java b/src/main/java/org/apache/bcel/generic/ClassGenException.java index 9fb99bf3..a412df5d 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGenException.java +++ b/src/main/java/org/apache/bcel/generic/ClassGenException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Thrown on internal errors. Extends RuntimeException so it hasn't to be declared diff --git a/src/main/java/org/apache/bcel/generic/ClassObserver.java b/src/main/java/org/apache/bcel/generic/ClassObserver.java index eace1cbf..4b2ce389 100644 --- a/src/main/java/org/apache/bcel/generic/ClassObserver.java +++ b/src/main/java/org/apache/bcel/generic/ClassObserver.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Implement this interface if you're interested in changes to a ClassGen object diff --git a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java index 0545de4d..d0667c6c 100644 --- a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.classfile.CodeException; +import org.apache.bcel.classfile.CodeException; /** * This class represents an exception handler, i.e., specifies the region where diff --git a/src/main/java/org/apache/bcel/generic/CompoundInstruction.java b/src/main/java/org/apache/bcel/generic/CompoundInstruction.java index 10aa3ac3..f1002613 100644 --- a/src/main/java/org/apache/bcel/generic/CompoundInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CompoundInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Wrapper class for `compound' operations, virtual instructions that diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index 1da7d4f2..446b8433 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -15,27 +15,27 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.util.HashMap; import java.util.Map; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantCP; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantDouble; -import org.apache.commons.bcel6.classfile.ConstantFieldref; -import org.apache.commons.bcel6.classfile.ConstantFloat; -import org.apache.commons.bcel6.classfile.ConstantInteger; -import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; -import org.apache.commons.bcel6.classfile.ConstantInvokeDynamic; -import org.apache.commons.bcel6.classfile.ConstantLong; -import org.apache.commons.bcel6.classfile.ConstantMethodref; -import org.apache.commons.bcel6.classfile.ConstantNameAndType; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantString; -import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantCP; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantInvokeDynamic; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.ConstantUtf8; /** * This class is used to build up a constant pool. The user adds @@ -190,9 +190,9 @@ public class ConstantPoolGen { // nothing to do } else if (c instanceof ConstantDouble) { // nothing to do - } else if (c instanceof org.apache.commons.bcel6.classfile.ConstantMethodType) { + } else if (c instanceof org.apache.bcel.classfile.ConstantMethodType) { // TODO should this be handled somehow? - } else if (c instanceof org.apache.commons.bcel6.classfile.ConstantMethodHandle) { + } else if (c instanceof org.apache.bcel.classfile.ConstantMethodHandle) { // TODO should this be handled somehow? } else { assert false : "Unexpected constant type: " + c.getClass().getName(); diff --git a/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java b/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java index 0ae15275..c98731e7 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPushInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denotes a push instruction that produces a literal on the stack diff --git a/src/main/java/org/apache/bcel/generic/ConversionInstruction.java b/src/main/java/org/apache/bcel/generic/ConversionInstruction.java index a55a9377..8ee62828 100644 --- a/src/main/java/org/apache/bcel/generic/ConversionInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ConversionInstruction.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Super class for the x2y family of instructions. diff --git a/src/main/java/org/apache/bcel/generic/D2F.java b/src/main/java/org/apache/bcel/generic/D2F.java index 761e5756..a73e5ec2 100644 --- a/src/main/java/org/apache/bcel/generic/D2F.java +++ b/src/main/java/org/apache/bcel/generic/D2F.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * D2F - Convert double to float @@ -28,7 +28,7 @@ public class D2F extends ConversionInstruction { /** Convert double to float */ public D2F() { - super(org.apache.commons.bcel6.Const.D2F); + super(org.apache.bcel.Const.D2F); } diff --git a/src/main/java/org/apache/bcel/generic/D2I.java b/src/main/java/org/apache/bcel/generic/D2I.java index a53ee054..45ff7cd6 100644 --- a/src/main/java/org/apache/bcel/generic/D2I.java +++ b/src/main/java/org/apache/bcel/generic/D2I.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * D2I - Convert double to int @@ -28,7 +28,7 @@ public class D2I extends ConversionInstruction { /** Convert double to int */ public D2I() { - super(org.apache.commons.bcel6.Const.D2I); + super(org.apache.bcel.Const.D2I); } diff --git a/src/main/java/org/apache/bcel/generic/D2L.java b/src/main/java/org/apache/bcel/generic/D2L.java index 2c7053c7..4486a0da 100644 --- a/src/main/java/org/apache/bcel/generic/D2L.java +++ b/src/main/java/org/apache/bcel/generic/D2L.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * D2L - Convert double to long @@ -28,7 +28,7 @@ public class D2L extends ConversionInstruction { /** Convert double to long */ public D2L() { - super(org.apache.commons.bcel6.Const.D2L); + super(org.apache.bcel.Const.D2L); } diff --git a/src/main/java/org/apache/bcel/generic/DADD.java b/src/main/java/org/apache/bcel/generic/DADD.java index eb04b225..492a2ac8 100644 --- a/src/main/java/org/apache/bcel/generic/DADD.java +++ b/src/main/java/org/apache/bcel/generic/DADD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DADD - Add doubles @@ -29,7 +29,7 @@ public class DADD extends ArithmeticInstruction { /** Add doubles */ public DADD() { - super(org.apache.commons.bcel6.Const.DADD); + super(org.apache.bcel.Const.DADD); } diff --git a/src/main/java/org/apache/bcel/generic/DALOAD.java b/src/main/java/org/apache/bcel/generic/DALOAD.java index bcfff504..120afed0 100644 --- a/src/main/java/org/apache/bcel/generic/DALOAD.java +++ b/src/main/java/org/apache/bcel/generic/DALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DALOAD - Load double from array @@ -28,7 +28,7 @@ public class DALOAD extends ArrayInstruction implements StackProducer { /** Load double from array */ public DALOAD() { - super(org.apache.commons.bcel6.Const.DALOAD); + super(org.apache.bcel.Const.DALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/DASTORE.java b/src/main/java/org/apache/bcel/generic/DASTORE.java index 3122f1bb..16becb14 100644 --- a/src/main/java/org/apache/bcel/generic/DASTORE.java +++ b/src/main/java/org/apache/bcel/generic/DASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DASTORE - Store into double array @@ -28,7 +28,7 @@ public class DASTORE extends ArrayInstruction implements StackConsumer { /** Store double into array */ public DASTORE() { - super(org.apache.commons.bcel6.Const.DASTORE); + super(org.apache.bcel.Const.DASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/DCMPG.java b/src/main/java/org/apache/bcel/generic/DCMPG.java index d658dc5c..08412894 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPG.java +++ b/src/main/java/org/apache/bcel/generic/DCMPG.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DCMPG - Compare doubles: value1 > value2 @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class DCMPG extends Instruction implements TypedInstruction, StackProducer, StackConsumer { public DCMPG() { - super(org.apache.commons.bcel6.Const.DCMPG, (short) 1); + super(org.apache.bcel.Const.DCMPG, (short) 1); } /** @return Type.DOUBLE diff --git a/src/main/java/org/apache/bcel/generic/DCMPL.java b/src/main/java/org/apache/bcel/generic/DCMPL.java index 49037da3..73af0cac 100644 --- a/src/main/java/org/apache/bcel/generic/DCMPL.java +++ b/src/main/java/org/apache/bcel/generic/DCMPL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DCMPL - Compare doubles: value1 < value2 @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class DCMPL extends Instruction implements TypedInstruction, StackProducer, StackConsumer { public DCMPL() { - super(org.apache.commons.bcel6.Const.DCMPL, (short) 1); + super(org.apache.bcel.Const.DCMPL, (short) 1); } /** @return Type.DOUBLE diff --git a/src/main/java/org/apache/bcel/generic/DCONST.java b/src/main/java/org/apache/bcel/generic/DCONST.java index e1ae0966..35c19034 100644 --- a/src/main/java/org/apache/bcel/generic/DCONST.java +++ b/src/main/java/org/apache/bcel/generic/DCONST.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DCONST - Push 0.0 or 1.0, other values cause an exception @@ -38,11 +38,11 @@ public class DCONST extends Instruction implements ConstantPushInstruction { public DCONST(final double f) { - super(org.apache.commons.bcel6.Const.DCONST_0, (short) 1); + super(org.apache.bcel.Const.DCONST_0, (short) 1); if (f == 0.0) { - super.setOpcode(org.apache.commons.bcel6.Const.DCONST_0); + super.setOpcode(org.apache.bcel.Const.DCONST_0); } else if (f == 1.0) { - super.setOpcode(org.apache.commons.bcel6.Const.DCONST_1); + super.setOpcode(org.apache.bcel.Const.DCONST_1); } else { throw new ClassGenException("DCONST can be used only for 0.0 and 1.0: " + f); } diff --git a/src/main/java/org/apache/bcel/generic/DDIV.java b/src/main/java/org/apache/bcel/generic/DDIV.java index ee83a6e7..cf23a8fa 100644 --- a/src/main/java/org/apache/bcel/generic/DDIV.java +++ b/src/main/java/org/apache/bcel/generic/DDIV.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DDIV - Divide doubles @@ -29,7 +29,7 @@ public class DDIV extends ArithmeticInstruction { /** Divide doubles */ public DDIV() { - super(org.apache.commons.bcel6.Const.DDIV); + super(org.apache.bcel.Const.DDIV); } diff --git a/src/main/java/org/apache/bcel/generic/DLOAD.java b/src/main/java/org/apache/bcel/generic/DLOAD.java index a8507ba3..35b4283d 100644 --- a/src/main/java/org/apache/bcel/generic/DLOAD.java +++ b/src/main/java/org/apache/bcel/generic/DLOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DLOAD - Load double from local variable @@ -30,7 +30,7 @@ public class DLOAD extends LoadInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ DLOAD() { - super(org.apache.commons.bcel6.Const.DLOAD, org.apache.commons.bcel6.Const.DLOAD_0); + super(org.apache.bcel.Const.DLOAD, org.apache.bcel.Const.DLOAD_0); } @@ -38,7 +38,7 @@ public class DLOAD extends LoadInstruction { * @param n index of local variable */ public DLOAD(final int n) { - super(org.apache.commons.bcel6.Const.DLOAD, org.apache.commons.bcel6.Const.DLOAD_0, n); + super(org.apache.bcel.Const.DLOAD, org.apache.bcel.Const.DLOAD_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/DMUL.java b/src/main/java/org/apache/bcel/generic/DMUL.java index 6b7697af..ce6e0295 100644 --- a/src/main/java/org/apache/bcel/generic/DMUL.java +++ b/src/main/java/org/apache/bcel/generic/DMUL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DMUL - Multiply doubles @@ -29,7 +29,7 @@ public class DMUL extends ArithmeticInstruction { /** Multiply doubles */ public DMUL() { - super(org.apache.commons.bcel6.Const.DMUL); + super(org.apache.bcel.Const.DMUL); } diff --git a/src/main/java/org/apache/bcel/generic/DNEG.java b/src/main/java/org/apache/bcel/generic/DNEG.java index 6d579a45..a0c7a3d2 100644 --- a/src/main/java/org/apache/bcel/generic/DNEG.java +++ b/src/main/java/org/apache/bcel/generic/DNEG.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DNEG - Negate double @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class DNEG extends ArithmeticInstruction { public DNEG() { - super(org.apache.commons.bcel6.Const.DNEG); + super(org.apache.bcel.Const.DNEG); } diff --git a/src/main/java/org/apache/bcel/generic/DREM.java b/src/main/java/org/apache/bcel/generic/DREM.java index 0c9db68d..16b08636 100644 --- a/src/main/java/org/apache/bcel/generic/DREM.java +++ b/src/main/java/org/apache/bcel/generic/DREM.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DREM - Remainder of doubles @@ -29,7 +29,7 @@ public class DREM extends ArithmeticInstruction { /** Remainder of doubles */ public DREM() { - super(org.apache.commons.bcel6.Const.DREM); + super(org.apache.bcel.Const.DREM); } diff --git a/src/main/java/org/apache/bcel/generic/DRETURN.java b/src/main/java/org/apache/bcel/generic/DRETURN.java index 5838b37f..0f0216b0 100644 --- a/src/main/java/org/apache/bcel/generic/DRETURN.java +++ b/src/main/java/org/apache/bcel/generic/DRETURN.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DRETURN - Return double from method @@ -28,7 +28,7 @@ public class DRETURN extends ReturnInstruction { /** Return double from method */ public DRETURN() { - super(org.apache.commons.bcel6.Const.DRETURN); + super(org.apache.bcel.Const.DRETURN); } diff --git a/src/main/java/org/apache/bcel/generic/DSTORE.java b/src/main/java/org/apache/bcel/generic/DSTORE.java index 118468e4..8d54c0ff 100644 --- a/src/main/java/org/apache/bcel/generic/DSTORE.java +++ b/src/main/java/org/apache/bcel/generic/DSTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DSTORE - Store double into local variable @@ -30,7 +30,7 @@ public class DSTORE extends StoreInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ DSTORE() { - super(org.apache.commons.bcel6.Const.DSTORE, org.apache.commons.bcel6.Const.DSTORE_0); + super(org.apache.bcel.Const.DSTORE, org.apache.bcel.Const.DSTORE_0); } @@ -38,7 +38,7 @@ public class DSTORE extends StoreInstruction { * @param n index of local variable */ public DSTORE(final int n) { - super(org.apache.commons.bcel6.Const.DSTORE, org.apache.commons.bcel6.Const.DSTORE_0, n); + super(org.apache.bcel.Const.DSTORE, org.apache.bcel.Const.DSTORE_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/DSUB.java b/src/main/java/org/apache/bcel/generic/DSUB.java index 7072c3d8..794930eb 100644 --- a/src/main/java/org/apache/bcel/generic/DSUB.java +++ b/src/main/java/org/apache/bcel/generic/DSUB.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DSUB - Substract doubles @@ -29,7 +29,7 @@ public class DSUB extends ArithmeticInstruction { /** Substract doubles */ public DSUB() { - super(org.apache.commons.bcel6.Const.DSUB); + super(org.apache.bcel.Const.DSUB); } diff --git a/src/main/java/org/apache/bcel/generic/DUP.java b/src/main/java/org/apache/bcel/generic/DUP.java index 82d697f5..5e9edfec 100644 --- a/src/main/java/org/apache/bcel/generic/DUP.java +++ b/src/main/java/org/apache/bcel/generic/DUP.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DUP - Duplicate top operand stack word @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class DUP extends StackInstruction implements PushInstruction { public DUP() { - super(org.apache.commons.bcel6.Const.DUP); + super(org.apache.bcel.Const.DUP); } diff --git a/src/main/java/org/apache/bcel/generic/DUP2.java b/src/main/java/org/apache/bcel/generic/DUP2.java index 29c4cc62..ee28a9a1 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2.java +++ b/src/main/java/org/apache/bcel/generic/DUP2.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DUP2 - Duplicate two top operand stack words @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class DUP2 extends StackInstruction implements PushInstruction { public DUP2() { - super(org.apache.commons.bcel6.Const.DUP2); + super(org.apache.bcel.Const.DUP2); } diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X1.java b/src/main/java/org/apache/bcel/generic/DUP2_X1.java index 9a62c5ff..9d041067 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X1.java +++ b/src/main/java/org/apache/bcel/generic/DUP2_X1.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DUP2_X1 - Duplicate two top operand stack words and put three down @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class DUP2_X1 extends StackInstruction { public DUP2_X1() { - super(org.apache.commons.bcel6.Const.DUP2_X1); + super(org.apache.bcel.Const.DUP2_X1); } diff --git a/src/main/java/org/apache/bcel/generic/DUP2_X2.java b/src/main/java/org/apache/bcel/generic/DUP2_X2.java index d19e0334..b880ec71 100644 --- a/src/main/java/org/apache/bcel/generic/DUP2_X2.java +++ b/src/main/java/org/apache/bcel/generic/DUP2_X2.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DUP2_X2 - Duplicate two top operand stack words and put four down @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class DUP2_X2 extends StackInstruction { public DUP2_X2() { - super(org.apache.commons.bcel6.Const.DUP2_X2); + super(org.apache.bcel.Const.DUP2_X2); } diff --git a/src/main/java/org/apache/bcel/generic/DUP_X1.java b/src/main/java/org/apache/bcel/generic/DUP_X1.java index bc4ed527..6ab4ce8c 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X1.java +++ b/src/main/java/org/apache/bcel/generic/DUP_X1.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DUP_X1 - Duplicate top operand stack word and put two down @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class DUP_X1 extends StackInstruction { public DUP_X1() { - super(org.apache.commons.bcel6.Const.DUP_X1); + super(org.apache.bcel.Const.DUP_X1); } diff --git a/src/main/java/org/apache/bcel/generic/DUP_X2.java b/src/main/java/org/apache/bcel/generic/DUP_X2.java index 025a3f02..d0581e4a 100644 --- a/src/main/java/org/apache/bcel/generic/DUP_X2.java +++ b/src/main/java/org/apache/bcel/generic/DUP_X2.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * DUP_X2 - Duplicate top operand stack word and put three down @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class DUP_X2 extends StackInstruction { public DUP_X2() { - super(org.apache.commons.bcel6.Const.DUP_X2); + super(org.apache.bcel.Const.DUP_X2); } diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java index e34a9dda..bce1da17 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -15,19 +15,19 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataInput; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.classfile.AnnotationElementValue; -import org.apache.commons.bcel6.classfile.AnnotationEntry; -import org.apache.commons.bcel6.classfile.ArrayElementValue; -import org.apache.commons.bcel6.classfile.ClassElementValue; -import org.apache.commons.bcel6.classfile.ElementValue; -import org.apache.commons.bcel6.classfile.EnumElementValue; -import org.apache.commons.bcel6.classfile.SimpleElementValue; +import org.apache.bcel.classfile.AnnotationElementValue; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.ArrayElementValue; +import org.apache.bcel.classfile.ClassElementValue; +import org.apache.bcel.classfile.ElementValue; +import org.apache.bcel.classfile.EnumElementValue; +import org.apache.bcel.classfile.SimpleElementValue; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java index 1af7c4f3..f5b557d7 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.ElementValue; -import org.apache.commons.bcel6.classfile.ElementValuePair; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ElementValue; +import org.apache.bcel.classfile.ElementValuePair; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java index 74c33503..44dbe416 100644 --- a/src/main/java/org/apache/bcel/generic/EmptyVisitor.java +++ b/src/main/java/org/apache/bcel/generic/EmptyVisitor.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Supplies empty method bodies to be overridden by subclasses. diff --git a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java index 6ed33b16..edf69fc8 100644 --- a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.ElementValue; -import org.apache.commons.bcel6.classfile.EnumElementValue; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ElementValue; +import org.apache.bcel.classfile.EnumElementValue; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/ExceptionThrower.java b/src/main/java/org/apache/bcel/generic/ExceptionThrower.java index 249ca27d..fee22581 100644 --- a/src/main/java/org/apache/bcel/generic/ExceptionThrower.java +++ b/src/main/java/org/apache/bcel/generic/ExceptionThrower.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denote an instruction that may throw a run-time or a linking diff --git a/src/main/java/org/apache/bcel/generic/F2D.java b/src/main/java/org/apache/bcel/generic/F2D.java index 04f3d601..8348eda6 100644 --- a/src/main/java/org/apache/bcel/generic/F2D.java +++ b/src/main/java/org/apache/bcel/generic/F2D.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * F2D - Convert float to double @@ -28,7 +28,7 @@ public class F2D extends ConversionInstruction { /** Convert float to double */ public F2D() { - super(org.apache.commons.bcel6.Const.F2D); + super(org.apache.bcel.Const.F2D); } diff --git a/src/main/java/org/apache/bcel/generic/F2I.java b/src/main/java/org/apache/bcel/generic/F2I.java index 67329334..9dcf0244 100644 --- a/src/main/java/org/apache/bcel/generic/F2I.java +++ b/src/main/java/org/apache/bcel/generic/F2I.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * F2I - Convert float to int @@ -28,7 +28,7 @@ public class F2I extends ConversionInstruction { /** Convert float to int */ public F2I() { - super(org.apache.commons.bcel6.Const.F2I); + super(org.apache.bcel.Const.F2I); } diff --git a/src/main/java/org/apache/bcel/generic/F2L.java b/src/main/java/org/apache/bcel/generic/F2L.java index dd140be2..bf9c04c0 100644 --- a/src/main/java/org/apache/bcel/generic/F2L.java +++ b/src/main/java/org/apache/bcel/generic/F2L.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * F2L - Convert float to long @@ -28,7 +28,7 @@ public class F2L extends ConversionInstruction { /** Convert float to long */ public F2L() { - super(org.apache.commons.bcel6.Const.F2L); + super(org.apache.bcel.Const.F2L); } diff --git a/src/main/java/org/apache/bcel/generic/FADD.java b/src/main/java/org/apache/bcel/generic/FADD.java index bbb902ea..e0c7ac1c 100644 --- a/src/main/java/org/apache/bcel/generic/FADD.java +++ b/src/main/java/org/apache/bcel/generic/FADD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FADD - Add floats @@ -28,7 +28,7 @@ public class FADD extends ArithmeticInstruction { /** Add floats */ public FADD() { - super(org.apache.commons.bcel6.Const.FADD); + super(org.apache.bcel.Const.FADD); } diff --git a/src/main/java/org/apache/bcel/generic/FALOAD.java b/src/main/java/org/apache/bcel/generic/FALOAD.java index c5d1ee13..1cc9687f 100644 --- a/src/main/java/org/apache/bcel/generic/FALOAD.java +++ b/src/main/java/org/apache/bcel/generic/FALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FALOAD - Load float from array @@ -28,7 +28,7 @@ public class FALOAD extends ArrayInstruction implements StackProducer { /** Load float from array */ public FALOAD() { - super(org.apache.commons.bcel6.Const.FALOAD); + super(org.apache.bcel.Const.FALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/FASTORE.java b/src/main/java/org/apache/bcel/generic/FASTORE.java index 1763b32d..1b54b919 100644 --- a/src/main/java/org/apache/bcel/generic/FASTORE.java +++ b/src/main/java/org/apache/bcel/generic/FASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FASTORE - Store into float array @@ -28,7 +28,7 @@ public class FASTORE extends ArrayInstruction implements StackConsumer { /** Store float into array */ public FASTORE() { - super(org.apache.commons.bcel6.Const.FASTORE); + super(org.apache.bcel.Const.FASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/FCMPG.java b/src/main/java/org/apache/bcel/generic/FCMPG.java index ef86bde6..e38f7afa 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPG.java +++ b/src/main/java/org/apache/bcel/generic/FCMPG.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FCMPG - Compare floats: value1 > value2 @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class FCMPG extends Instruction implements TypedInstruction, StackProducer, StackConsumer { public FCMPG() { - super(org.apache.commons.bcel6.Const.FCMPG, (short) 1); + super(org.apache.bcel.Const.FCMPG, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/FCMPL.java b/src/main/java/org/apache/bcel/generic/FCMPL.java index 70f971a2..8ac6f2e1 100644 --- a/src/main/java/org/apache/bcel/generic/FCMPL.java +++ b/src/main/java/org/apache/bcel/generic/FCMPL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FCMPL - Compare floats: value1 < value2 @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class FCMPL extends Instruction implements TypedInstruction, StackProducer, StackConsumer { public FCMPL() { - super(org.apache.commons.bcel6.Const.FCMPL, (short) 1); + super(org.apache.bcel.Const.FCMPL, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/FCONST.java b/src/main/java/org/apache/bcel/generic/FCONST.java index 561b9014..c2448a36 100644 --- a/src/main/java/org/apache/bcel/generic/FCONST.java +++ b/src/main/java/org/apache/bcel/generic/FCONST.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FCONST - Push 0.0, 1.0 or 2.0, other values cause an exception @@ -38,13 +38,13 @@ public class FCONST extends Instruction implements ConstantPushInstruction { public FCONST(final float f) { - super(org.apache.commons.bcel6.Const.FCONST_0, (short) 1); + super(org.apache.bcel.Const.FCONST_0, (short) 1); if (f == 0.0) { - super.setOpcode(org.apache.commons.bcel6.Const.FCONST_0); + super.setOpcode(org.apache.bcel.Const.FCONST_0); } else if (f == 1.0) { - super.setOpcode(org.apache.commons.bcel6.Const.FCONST_1); + super.setOpcode(org.apache.bcel.Const.FCONST_1); } else if (f == 2.0) { - super.setOpcode(org.apache.commons.bcel6.Const.FCONST_2); + super.setOpcode(org.apache.bcel.Const.FCONST_2); } else { throw new ClassGenException("FCONST can be used only for 0.0, 1.0 and 2.0: " + f); } diff --git a/src/main/java/org/apache/bcel/generic/FDIV.java b/src/main/java/org/apache/bcel/generic/FDIV.java index f83659a0..7ef5bfe6 100644 --- a/src/main/java/org/apache/bcel/generic/FDIV.java +++ b/src/main/java/org/apache/bcel/generic/FDIV.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FDIV - Divide floats @@ -28,7 +28,7 @@ public class FDIV extends ArithmeticInstruction { /** Divide floats */ public FDIV() { - super(org.apache.commons.bcel6.Const.FDIV); + super(org.apache.bcel.Const.FDIV); } diff --git a/src/main/java/org/apache/bcel/generic/FLOAD.java b/src/main/java/org/apache/bcel/generic/FLOAD.java index 614295ed..fa77665a 100644 --- a/src/main/java/org/apache/bcel/generic/FLOAD.java +++ b/src/main/java/org/apache/bcel/generic/FLOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FLOAD - Load float from local variable @@ -30,7 +30,7 @@ public class FLOAD extends LoadInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ FLOAD() { - super(org.apache.commons.bcel6.Const.FLOAD, org.apache.commons.bcel6.Const.FLOAD_0); + super(org.apache.bcel.Const.FLOAD, org.apache.bcel.Const.FLOAD_0); } @@ -38,7 +38,7 @@ public class FLOAD extends LoadInstruction { * @param n index of local variable */ public FLOAD(final int n) { - super(org.apache.commons.bcel6.Const.FLOAD, org.apache.commons.bcel6.Const.FLOAD_0, n); + super(org.apache.bcel.Const.FLOAD, org.apache.bcel.Const.FLOAD_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/FMUL.java b/src/main/java/org/apache/bcel/generic/FMUL.java index ce3cfd15..3f750008 100644 --- a/src/main/java/org/apache/bcel/generic/FMUL.java +++ b/src/main/java/org/apache/bcel/generic/FMUL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FMUL - Multiply floats @@ -28,7 +28,7 @@ public class FMUL extends ArithmeticInstruction { /** Multiply floats */ public FMUL() { - super(org.apache.commons.bcel6.Const.FMUL); + super(org.apache.bcel.Const.FMUL); } diff --git a/src/main/java/org/apache/bcel/generic/FNEG.java b/src/main/java/org/apache/bcel/generic/FNEG.java index e7ce10fe..b75674a9 100644 --- a/src/main/java/org/apache/bcel/generic/FNEG.java +++ b/src/main/java/org/apache/bcel/generic/FNEG.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FNEG - Negate float @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class FNEG extends ArithmeticInstruction { public FNEG() { - super(org.apache.commons.bcel6.Const.FNEG); + super(org.apache.bcel.Const.FNEG); } diff --git a/src/main/java/org/apache/bcel/generic/FREM.java b/src/main/java/org/apache/bcel/generic/FREM.java index d32a30bf..7d352578 100644 --- a/src/main/java/org/apache/bcel/generic/FREM.java +++ b/src/main/java/org/apache/bcel/generic/FREM.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FREM - Remainder of floats @@ -28,7 +28,7 @@ public class FREM extends ArithmeticInstruction { /** Remainder of floats */ public FREM() { - super(org.apache.commons.bcel6.Const.FREM); + super(org.apache.bcel.Const.FREM); } diff --git a/src/main/java/org/apache/bcel/generic/FRETURN.java b/src/main/java/org/apache/bcel/generic/FRETURN.java index b1ff1401..eee74dc2 100644 --- a/src/main/java/org/apache/bcel/generic/FRETURN.java +++ b/src/main/java/org/apache/bcel/generic/FRETURN.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FRETURN - Return float from method @@ -28,7 +28,7 @@ public class FRETURN extends ReturnInstruction { /** Return float from method */ public FRETURN() { - super(org.apache.commons.bcel6.Const.FRETURN); + super(org.apache.bcel.Const.FRETURN); } diff --git a/src/main/java/org/apache/bcel/generic/FSTORE.java b/src/main/java/org/apache/bcel/generic/FSTORE.java index d5b11dd9..6b03b9d8 100644 --- a/src/main/java/org/apache/bcel/generic/FSTORE.java +++ b/src/main/java/org/apache/bcel/generic/FSTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FSTORE - Store float into local variable @@ -30,7 +30,7 @@ public class FSTORE extends StoreInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ FSTORE() { - super(org.apache.commons.bcel6.Const.FSTORE, org.apache.commons.bcel6.Const.FSTORE_0); + super(org.apache.bcel.Const.FSTORE, org.apache.bcel.Const.FSTORE_0); } @@ -38,7 +38,7 @@ public class FSTORE extends StoreInstruction { * @param n index of local variable */ public FSTORE(final int n) { - super(org.apache.commons.bcel6.Const.FSTORE, org.apache.commons.bcel6.Const.FSTORE_0, n); + super(org.apache.bcel.Const.FSTORE, org.apache.bcel.Const.FSTORE_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/FSUB.java b/src/main/java/org/apache/bcel/generic/FSUB.java index 4163ee45..92cf2584 100644 --- a/src/main/java/org/apache/bcel/generic/FSUB.java +++ b/src/main/java/org/apache/bcel/generic/FSUB.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * FSUB - Substract floats @@ -28,7 +28,7 @@ public class FSUB extends ArithmeticInstruction { /** Substract floats */ public FSUB() { - super(org.apache.commons.bcel6.Const.FSUB); + super(org.apache.bcel.Const.FSUB); } diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index 8afa0147..8006812b 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -15,22 +15,22 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.util.ArrayList; import java.util.List; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.AnnotationEntry; -import org.apache.commons.bcel6.classfile.Annotations; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantObject; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantValue; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.Utility; -import org.apache.commons.bcel6.util.BCELComparator; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Annotations; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantObject; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.util.BCELComparator; /** * Template class for building up a field. The only extraordinary thing diff --git a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index c62ece28..84d249bf 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.util.ArrayList; import java.util.List; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.AccessFlags; -import org.apache.commons.bcel6.classfile.Attribute; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.AccessFlags; +import org.apache.bcel.classfile.Attribute; /** * Super class for FieldGen and MethodGen objects, since they have diff --git a/src/main/java/org/apache/bcel/generic/FieldInstruction.java b/src/main/java/org/apache/bcel/generic/FieldInstruction.java index b3e85ca5..89d68a5a 100644 --- a/src/main/java/org/apache/bcel/generic/FieldInstruction.java +++ b/src/main/java/org/apache/bcel/generic/FieldInstruction.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantPool; /** * Super class for the GET/PUTxxx family of instructions. @@ -47,8 +47,8 @@ public abstract class FieldInstruction extends FieldOrMethod { */ @Override public String toString( final ConstantPool cp ) { - return org.apache.commons.bcel6.Const.getOpcodeName(super.getOpcode()) + " " - + cp.constantToString(super.getIndex(), org.apache.commons.bcel6.Const.CONSTANT_Fieldref); + return org.apache.bcel.Const.getOpcodeName(super.getOpcode()) + " " + + cp.constantToString(super.getIndex(), org.apache.bcel.Const.CONSTANT_Fieldref); } diff --git a/src/main/java/org/apache/bcel/generic/FieldObserver.java b/src/main/java/org/apache/bcel/generic/FieldObserver.java index 2ab90b74..d9ace39a 100644 --- a/src/main/java/org/apache/bcel/generic/FieldObserver.java +++ b/src/main/java/org/apache/bcel/generic/FieldObserver.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Imnplement this interface if you're interested in changes to a FieldGen object diff --git a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java index 948aef9e..cb9e105f 100644 --- a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.ConstantCP; -import org.apache.commons.bcel6.classfile.ConstantNameAndType; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.ConstantCP; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; /** * Super class for InvokeInstruction and FieldInstruction, since they have diff --git a/src/main/java/org/apache/bcel/generic/GETFIELD.java b/src/main/java/org/apache/bcel/generic/GETFIELD.java index aa71d757..b66c7b5d 100644 --- a/src/main/java/org/apache/bcel/generic/GETFIELD.java +++ b/src/main/java/org/apache/bcel/generic/GETFIELD.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.Const; +import org.apache.bcel.ExceptionConst; /** * GETFIELD - Fetch field from object diff --git a/src/main/java/org/apache/bcel/generic/GETSTATIC.java b/src/main/java/org/apache/bcel/generic/GETSTATIC.java index f3469fc9..5fbd252a 100644 --- a/src/main/java/org/apache/bcel/generic/GETSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/GETSTATIC.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.Const; +import org.apache.bcel.ExceptionConst; /** * GETSTATIC - Fetch static field from class diff --git a/src/main/java/org/apache/bcel/generic/GOTO.java b/src/main/java/org/apache/bcel/generic/GOTO.java index ec92fdaf..5b3b2990 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO.java +++ b/src/main/java/org/apache/bcel/generic/GOTO.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; @@ -36,7 +36,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { public GOTO(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.GOTO, target); + super(org.apache.bcel.Const.GOTO, target); } @@ -48,7 +48,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { public void dump( final DataOutputStream out ) throws IOException { super.setIndex(getTargetOffset()); final short _opcode = getOpcode(); - if (_opcode == org.apache.commons.bcel6.Const.GOTO) { + if (_opcode == org.apache.bcel.Const.GOTO) { super.dump(out); } else { // GOTO_W super.setIndex(getTargetOffset()); @@ -71,7 +71,7 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { int i = getTargetOffset(); // Depending on old position value setPosition(getPosition() + offset); // Position may be shifted by preceding expansions if (Math.abs(i) >= (Short.MAX_VALUE - max_offset)) { // to large for short (estimate) - super.setOpcode(org.apache.commons.bcel6.Const.GOTO_W); + super.setOpcode(org.apache.bcel.Const.GOTO_W); short old_length = (short) super.getLength(); super.setLength(5); return super.getLength() - old_length; diff --git a/src/main/java/org/apache/bcel/generic/GOTO_W.java b/src/main/java/org/apache/bcel/generic/GOTO_W.java index 8297129f..8db8efcd 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO_W.java +++ b/src/main/java/org/apache/bcel/generic/GOTO_W.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.util.ByteSequence; /** * GOTO_W - Branch always (to relative offset, not absolute address) @@ -38,7 +38,7 @@ public class GOTO_W extends GotoInstruction { public GOTO_W(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.GOTO_W, target); + super(org.apache.bcel.Const.GOTO_W, target); super.setLength(5); } diff --git a/src/main/java/org/apache/bcel/generic/GotoInstruction.java b/src/main/java/org/apache/bcel/generic/GotoInstruction.java index 5ba46c3c..9caece7e 100644 --- a/src/main/java/org/apache/bcel/generic/GotoInstruction.java +++ b/src/main/java/org/apache/bcel/generic/GotoInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Super class for GOTO diff --git a/src/main/java/org/apache/bcel/generic/I2B.java b/src/main/java/org/apache/bcel/generic/I2B.java index 158d9784..d2f1479f 100644 --- a/src/main/java/org/apache/bcel/generic/I2B.java +++ b/src/main/java/org/apache/bcel/generic/I2B.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * I2B - Convert int to byte @@ -28,7 +28,7 @@ public class I2B extends ConversionInstruction { /** Convert int to byte */ public I2B() { - super(org.apache.commons.bcel6.Const.I2B); + super(org.apache.bcel.Const.I2B); } diff --git a/src/main/java/org/apache/bcel/generic/I2C.java b/src/main/java/org/apache/bcel/generic/I2C.java index bced8ca8..7e5f9426 100644 --- a/src/main/java/org/apache/bcel/generic/I2C.java +++ b/src/main/java/org/apache/bcel/generic/I2C.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * I2C - Convert int to char @@ -28,7 +28,7 @@ public class I2C extends ConversionInstruction { /** Convert int to char */ public I2C() { - super(org.apache.commons.bcel6.Const.I2C); + super(org.apache.bcel.Const.I2C); } diff --git a/src/main/java/org/apache/bcel/generic/I2D.java b/src/main/java/org/apache/bcel/generic/I2D.java index a7db9a13..8c455aea 100644 --- a/src/main/java/org/apache/bcel/generic/I2D.java +++ b/src/main/java/org/apache/bcel/generic/I2D.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * I2D - Convert int to double @@ -28,7 +28,7 @@ public class I2D extends ConversionInstruction { /** Convert int to double */ public I2D() { - super(org.apache.commons.bcel6.Const.I2D); + super(org.apache.bcel.Const.I2D); } diff --git a/src/main/java/org/apache/bcel/generic/I2F.java b/src/main/java/org/apache/bcel/generic/I2F.java index e45d51d4..107a0768 100644 --- a/src/main/java/org/apache/bcel/generic/I2F.java +++ b/src/main/java/org/apache/bcel/generic/I2F.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * I2F - Convert int to float @@ -28,7 +28,7 @@ public class I2F extends ConversionInstruction { /** Convert int to float */ public I2F() { - super(org.apache.commons.bcel6.Const.I2F); + super(org.apache.bcel.Const.I2F); } diff --git a/src/main/java/org/apache/bcel/generic/I2L.java b/src/main/java/org/apache/bcel/generic/I2L.java index f09af21b..3dfb2e22 100644 --- a/src/main/java/org/apache/bcel/generic/I2L.java +++ b/src/main/java/org/apache/bcel/generic/I2L.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * I2L - Convert int to long @@ -28,7 +28,7 @@ public class I2L extends ConversionInstruction { /** Convert int to long */ public I2L() { - super(org.apache.commons.bcel6.Const.I2L); + super(org.apache.bcel.Const.I2L); } diff --git a/src/main/java/org/apache/bcel/generic/I2S.java b/src/main/java/org/apache/bcel/generic/I2S.java index aafa20b5..70256fe6 100644 --- a/src/main/java/org/apache/bcel/generic/I2S.java +++ b/src/main/java/org/apache/bcel/generic/I2S.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * I2S - Convert int to short @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class I2S extends ConversionInstruction { public I2S() { - super(org.apache.commons.bcel6.Const.I2S); + super(org.apache.bcel.Const.I2S); } diff --git a/src/main/java/org/apache/bcel/generic/IADD.java b/src/main/java/org/apache/bcel/generic/IADD.java index 038ff551..7a0a7849 100644 --- a/src/main/java/org/apache/bcel/generic/IADD.java +++ b/src/main/java/org/apache/bcel/generic/IADD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IADD - Add ints @@ -28,7 +28,7 @@ public class IADD extends ArithmeticInstruction { /** Add ints */ public IADD() { - super(org.apache.commons.bcel6.Const.IADD); + super(org.apache.bcel.Const.IADD); } diff --git a/src/main/java/org/apache/bcel/generic/IALOAD.java b/src/main/java/org/apache/bcel/generic/IALOAD.java index d46381b2..04861be5 100644 --- a/src/main/java/org/apache/bcel/generic/IALOAD.java +++ b/src/main/java/org/apache/bcel/generic/IALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IALOAD - Load int from array @@ -29,7 +29,7 @@ public class IALOAD extends ArrayInstruction implements StackProducer { * Load int from array */ public IALOAD() { - super(org.apache.commons.bcel6.Const.IALOAD); + super(org.apache.bcel.Const.IALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/IAND.java b/src/main/java/org/apache/bcel/generic/IAND.java index 16ceaccd..ede1f6f7 100644 --- a/src/main/java/org/apache/bcel/generic/IAND.java +++ b/src/main/java/org/apache/bcel/generic/IAND.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IAND - Bitwise AND int @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class IAND extends ArithmeticInstruction { public IAND() { - super(org.apache.commons.bcel6.Const.IAND); + super(org.apache.bcel.Const.IAND); } diff --git a/src/main/java/org/apache/bcel/generic/IASTORE.java b/src/main/java/org/apache/bcel/generic/IASTORE.java index 9914183c..a6b4e6e3 100644 --- a/src/main/java/org/apache/bcel/generic/IASTORE.java +++ b/src/main/java/org/apache/bcel/generic/IASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IASTORE - Store into int array @@ -29,7 +29,7 @@ public class IASTORE extends ArrayInstruction implements StackConsumer { * Store into int array */ public IASTORE() { - super(org.apache.commons.bcel6.Const.IASTORE); + super(org.apache.bcel.Const.IASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/ICONST.java b/src/main/java/org/apache/bcel/generic/ICONST.java index e7e224de..39e1c525 100644 --- a/src/main/java/org/apache/bcel/generic/ICONST.java +++ b/src/main/java/org/apache/bcel/generic/ICONST.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * ICONST - Push value between -1, ..., 5, other values cause an exception @@ -38,9 +38,9 @@ public class ICONST extends Instruction implements ConstantPushInstruction { public ICONST(final int i) { - super(org.apache.commons.bcel6.Const.ICONST_0, (short) 1); + super(org.apache.bcel.Const.ICONST_0, (short) 1); if ((i >= -1) && (i <= 5)) { - super.setOpcode((short) (org.apache.commons.bcel6.Const.ICONST_0 + i)); // Even works for i == -1 + super.setOpcode((short) (org.apache.bcel.Const.ICONST_0 + i)); // Even works for i == -1 } else { throw new ClassGenException("ICONST can be used only for value between -1 and 5: " + i); } diff --git a/src/main/java/org/apache/bcel/generic/IDIV.java b/src/main/java/org/apache/bcel/generic/IDIV.java index d461b0fb..ecb20f38 100644 --- a/src/main/java/org/apache/bcel/generic/IDIV.java +++ b/src/main/java/org/apache/bcel/generic/IDIV.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * IDIV - Divide ints @@ -30,7 +30,7 @@ public class IDIV extends ArithmeticInstruction implements ExceptionThrower { /** Divide ints */ public IDIV() { - super(org.apache.commons.bcel6.Const.IDIV); + super(org.apache.bcel.Const.IDIV); } diff --git a/src/main/java/org/apache/bcel/generic/IFEQ.java b/src/main/java/org/apache/bcel/generic/IFEQ.java index 3f7acba6..d81934e8 100644 --- a/src/main/java/org/apache/bcel/generic/IFEQ.java +++ b/src/main/java/org/apache/bcel/generic/IFEQ.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IFEQ - Branch if int comparison with zero succeeds @@ -35,7 +35,7 @@ public class IFEQ extends IfInstruction { public IFEQ(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IFEQ, target); + super(org.apache.bcel.Const.IFEQ, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFGE.java b/src/main/java/org/apache/bcel/generic/IFGE.java index 1be8d25b..32777809 100644 --- a/src/main/java/org/apache/bcel/generic/IFGE.java +++ b/src/main/java/org/apache/bcel/generic/IFGE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IFGE - Branch if int comparison with zero succeeds @@ -35,7 +35,7 @@ public class IFGE extends IfInstruction { public IFGE(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IFGE, target); + super(org.apache.bcel.Const.IFGE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFGT.java b/src/main/java/org/apache/bcel/generic/IFGT.java index f11ddf68..b6728140 100644 --- a/src/main/java/org/apache/bcel/generic/IFGT.java +++ b/src/main/java/org/apache/bcel/generic/IFGT.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IFGT - Branch if int comparison with zero succeeds @@ -35,7 +35,7 @@ public class IFGT extends IfInstruction { public IFGT(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IFGT, target); + super(org.apache.bcel.Const.IFGT, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFLE.java b/src/main/java/org/apache/bcel/generic/IFLE.java index 2d11e2aa..fb9d4973 100644 --- a/src/main/java/org/apache/bcel/generic/IFLE.java +++ b/src/main/java/org/apache/bcel/generic/IFLE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IFLE - Branch if int comparison with zero succeeds @@ -35,7 +35,7 @@ public class IFLE extends IfInstruction { public IFLE(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IFLE, target); + super(org.apache.bcel.Const.IFLE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFLT.java b/src/main/java/org/apache/bcel/generic/IFLT.java index 2fa6d830..728e14dc 100644 --- a/src/main/java/org/apache/bcel/generic/IFLT.java +++ b/src/main/java/org/apache/bcel/generic/IFLT.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IFLT - Branch if int comparison with zero succeeds @@ -35,7 +35,7 @@ public class IFLT extends IfInstruction { public IFLT(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IFLT, target); + super(org.apache.bcel.Const.IFLT, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFNE.java b/src/main/java/org/apache/bcel/generic/IFNE.java index b0ca61b5..383bf5f4 100644 --- a/src/main/java/org/apache/bcel/generic/IFNE.java +++ b/src/main/java/org/apache/bcel/generic/IFNE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IFNE - Branch if int comparison with zero succeeds @@ -35,7 +35,7 @@ public class IFNE extends IfInstruction { public IFNE(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IFNE, target); + super(org.apache.bcel.Const.IFNE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFNONNULL.java b/src/main/java/org/apache/bcel/generic/IFNONNULL.java index c51e8485..c950a3b3 100644 --- a/src/main/java/org/apache/bcel/generic/IFNONNULL.java +++ b/src/main/java/org/apache/bcel/generic/IFNONNULL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IFNONNULL - Branch if reference is not null @@ -35,7 +35,7 @@ public class IFNONNULL extends IfInstruction { public IFNONNULL(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IFNONNULL, target); + super(org.apache.bcel.Const.IFNONNULL, target); } diff --git a/src/main/java/org/apache/bcel/generic/IFNULL.java b/src/main/java/org/apache/bcel/generic/IFNULL.java index 4af8b78b..5efb81cc 100644 --- a/src/main/java/org/apache/bcel/generic/IFNULL.java +++ b/src/main/java/org/apache/bcel/generic/IFNULL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IFNULL - Branch if reference is not null @@ -35,7 +35,7 @@ public class IFNULL extends IfInstruction { public IFNULL(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IFNULL, target); + super(org.apache.bcel.Const.IFNULL, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java index 418145c0..bc045ea2 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java +++ b/src/main/java/org/apache/bcel/generic/IF_ACMPEQ.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IF_ACMPEQ - Branch if reference comparison succeeds @@ -35,7 +35,7 @@ public class IF_ACMPEQ extends IfInstruction { public IF_ACMPEQ(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IF_ACMPEQ, target); + super(org.apache.bcel.Const.IF_ACMPEQ, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java index 437232f1..958e4db2 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ACMPNE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IF_ACMPNE - Branch if reference comparison doesn't succeed @@ -35,7 +35,7 @@ public class IF_ACMPNE extends IfInstruction { public IF_ACMPNE(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IF_ACMPNE, target); + super(org.apache.bcel.Const.IF_ACMPNE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java index e966bd64..f9003c0d 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPEQ.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IF_ICMPEQ - Branch if int comparison succeeds @@ -35,7 +35,7 @@ public class IF_ICMPEQ extends IfInstruction { public IF_ICMPEQ(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IF_ICMPEQ, target); + super(org.apache.bcel.Const.IF_ICMPEQ, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java index 5d269965..d9313a3c 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPGE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IF_ICMPGE - Branch if int comparison succeeds @@ -35,7 +35,7 @@ public class IF_ICMPGE extends IfInstruction { public IF_ICMPGE(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IF_ICMPGE, target); + super(org.apache.bcel.Const.IF_ICMPGE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java index dcf40af6..0fe8087c 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPGT.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IF_ICMPGT - Branch if int comparison succeeds @@ -35,7 +35,7 @@ public class IF_ICMPGT extends IfInstruction { public IF_ICMPGT(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IF_ICMPGT, target); + super(org.apache.bcel.Const.IF_ICMPGT, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java index 672493f5..b16982d1 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPLE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IF_ICMPLE - Branch if int comparison succeeds @@ -35,7 +35,7 @@ public class IF_ICMPLE extends IfInstruction { public IF_ICMPLE(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IF_ICMPLE, target); + super(org.apache.bcel.Const.IF_ICMPLE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java index 112ed3b8..ce1fd2f2 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPLT.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IF_ICMPLT - Branch if int comparison succeeds @@ -35,7 +35,7 @@ public class IF_ICMPLT extends IfInstruction { public IF_ICMPLT(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IF_ICMPLT, target); + super(org.apache.bcel.Const.IF_ICMPLT, target); } diff --git a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java index 6df99dc5..c47aa462 100644 --- a/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java +++ b/src/main/java/org/apache/bcel/generic/IF_ICMPNE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IF_ICMPNE - Branch if int comparison doesn't succeed @@ -35,7 +35,7 @@ public class IF_ICMPNE extends IfInstruction { public IF_ICMPNE(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.IF_ICMPNE, target); + super(org.apache.bcel.Const.IF_ICMPNE, target); } diff --git a/src/main/java/org/apache/bcel/generic/IINC.java b/src/main/java/org/apache/bcel/generic/IINC.java index 22c0cf37..d961609e 100644 --- a/src/main/java/org/apache/bcel/generic/IINC.java +++ b/src/main/java/org/apache/bcel/generic/IINC.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.util.ByteSequence; /** * IINC - Increment local variable by constant @@ -47,7 +47,7 @@ public class IINC extends LocalVariableInstruction { */ public IINC(final int n, final int c) { super(); // Default behaviour of LocalVariableInstruction causes error - super.setOpcode(org.apache.commons.bcel6.Const.IINC); + super.setOpcode(org.apache.bcel.Const.IINC); super.setLength((short) 3); setIndex(n); // May set wide as side effect setIncrement(c); @@ -61,7 +61,7 @@ public class IINC extends LocalVariableInstruction { @Override public void dump( final DataOutputStream out ) throws IOException { if (wide) { - out.writeByte(org.apache.commons.bcel6.Const.WIDE); + out.writeByte(org.apache.bcel.Const.WIDE); } out.writeByte(super.getOpcode()); if (wide) { @@ -75,7 +75,7 @@ public class IINC extends LocalVariableInstruction { private void setWide() { - wide = (super.getIndex() > org.apache.commons.bcel6.Const.MAX_BYTE) || (Math.abs(c) > Byte.MAX_VALUE); + wide = (super.getIndex() > org.apache.bcel.Const.MAX_BYTE) || (Math.abs(c) > Byte.MAX_VALUE); if (wide) { super.setLength(6); // wide byte included } else { diff --git a/src/main/java/org/apache/bcel/generic/ILOAD.java b/src/main/java/org/apache/bcel/generic/ILOAD.java index 0810fb60..ed770e0d 100644 --- a/src/main/java/org/apache/bcel/generic/ILOAD.java +++ b/src/main/java/org/apache/bcel/generic/ILOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * ILOAD - Load int from local variable onto stack @@ -30,7 +30,7 @@ public class ILOAD extends LoadInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ ILOAD() { - super(org.apache.commons.bcel6.Const.ILOAD, org.apache.commons.bcel6.Const.ILOAD_0); + super(org.apache.bcel.Const.ILOAD, org.apache.bcel.Const.ILOAD_0); } @@ -38,7 +38,7 @@ public class ILOAD extends LoadInstruction { * @param n index of local variable */ public ILOAD(final int n) { - super(org.apache.commons.bcel6.Const.ILOAD, org.apache.commons.bcel6.Const.ILOAD_0, n); + super(org.apache.bcel.Const.ILOAD, org.apache.bcel.Const.ILOAD_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP1.java b/src/main/java/org/apache/bcel/generic/IMPDEP1.java index ecc94825..7b26aaa1 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP1.java +++ b/src/main/java/org/apache/bcel/generic/IMPDEP1.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IMPDEP1 - Implementation dependent @@ -25,7 +25,7 @@ package org.apache.commons.bcel6.generic; public class IMPDEP1 extends Instruction { public IMPDEP1() { - super(org.apache.commons.bcel6.Const.IMPDEP1, (short) 1); + super(org.apache.bcel.Const.IMPDEP1, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/IMPDEP2.java b/src/main/java/org/apache/bcel/generic/IMPDEP2.java index 8b228e16..ea97bd21 100644 --- a/src/main/java/org/apache/bcel/generic/IMPDEP2.java +++ b/src/main/java/org/apache/bcel/generic/IMPDEP2.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IMPDEP2 - Implementation dependent @@ -25,7 +25,7 @@ package org.apache.commons.bcel6.generic; public class IMPDEP2 extends Instruction { public IMPDEP2() { - super(org.apache.commons.bcel6.Const.IMPDEP2, (short) 1); + super(org.apache.bcel.Const.IMPDEP2, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/IMUL.java b/src/main/java/org/apache/bcel/generic/IMUL.java index 119d606c..fc0afe4d 100644 --- a/src/main/java/org/apache/bcel/generic/IMUL.java +++ b/src/main/java/org/apache/bcel/generic/IMUL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IMUL - Multiply ints @@ -28,7 +28,7 @@ public class IMUL extends ArithmeticInstruction { /** Multiply ints */ public IMUL() { - super(org.apache.commons.bcel6.Const.IMUL); + super(org.apache.bcel.Const.IMUL); } diff --git a/src/main/java/org/apache/bcel/generic/INEG.java b/src/main/java/org/apache/bcel/generic/INEG.java index 661bc0d0..79f4856c 100644 --- a/src/main/java/org/apache/bcel/generic/INEG.java +++ b/src/main/java/org/apache/bcel/generic/INEG.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * INEG - Negate int @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class INEG extends ArithmeticInstruction { public INEG() { - super(org.apache.commons.bcel6.Const.INEG); + super(org.apache.bcel.Const.INEG); } diff --git a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java index a81fbd9c..b8e652c0 100644 --- a/src/main/java/org/apache/bcel/generic/INSTANCEOF.java +++ b/src/main/java/org/apache/bcel/generic/INSTANCEOF.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * INSTANCEOF - Determine if object is of given type @@ -37,7 +37,7 @@ public class INSTANCEOF extends CPInstruction implements LoadClass, ExceptionThr public INSTANCEOF(final int index) { - super(org.apache.commons.bcel6.Const.INSTANCEOF, index); + super(org.apache.bcel.Const.INSTANCEOF, index); } diff --git a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java index f57de819..7750342d 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java @@ -15,17 +15,17 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.ExceptionConst; -import org.apache.commons.bcel6.classfile.ConstantInvokeDynamic; -import org.apache.commons.bcel6.classfile.ConstantNameAndType; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.Const; +import org.apache.bcel.ExceptionConst; +import org.apache.bcel.classfile.ConstantInvokeDynamic; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.util.ByteSequence; /** * Class for INVOKEDYNAMIC. Not an instance of InvokeInstruction, since that class diff --git a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java index 7450f594..eaade48e 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEINTERFACE.java @@ -15,15 +15,15 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.ExceptionConst; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.Const; +import org.apache.bcel.ExceptionConst; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.util.ByteSequence; /** * INVOKEINTERFACE - Invoke interface method diff --git a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java index cd588db7..b7d7add4 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESPECIAL.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.Const; +import org.apache.bcel.ExceptionConst; /** * INVOKESPECIAL - Invoke instance method; special handling for superclass, private diff --git a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java index 45914fa2..9e18713d 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKESTATIC.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.Const; +import org.apache.bcel.ExceptionConst; /** * INVOKESTATIC - Invoke a class (static) method diff --git a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java index d93d30bf..56537f3d 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEVIRTUAL.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.Const; +import org.apache.bcel.ExceptionConst; /** * INVOKEVIRTUAL - Invoke instance method; dispatch based on class diff --git a/src/main/java/org/apache/bcel/generic/IOR.java b/src/main/java/org/apache/bcel/generic/IOR.java index 3705b692..2fc0dfe6 100644 --- a/src/main/java/org/apache/bcel/generic/IOR.java +++ b/src/main/java/org/apache/bcel/generic/IOR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IOR - Bitwise OR int @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class IOR extends ArithmeticInstruction { public IOR() { - super(org.apache.commons.bcel6.Const.IOR); + super(org.apache.bcel.Const.IOR); } diff --git a/src/main/java/org/apache/bcel/generic/IREM.java b/src/main/java/org/apache/bcel/generic/IREM.java index 27bfe537..9a0260b4 100644 --- a/src/main/java/org/apache/bcel/generic/IREM.java +++ b/src/main/java/org/apache/bcel/generic/IREM.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * IREM - Remainder of int @@ -30,7 +30,7 @@ public class IREM extends ArithmeticInstruction implements ExceptionThrower { /** Remainder of ints */ public IREM() { - super(org.apache.commons.bcel6.Const.IREM); + super(org.apache.bcel.Const.IREM); } diff --git a/src/main/java/org/apache/bcel/generic/IRETURN.java b/src/main/java/org/apache/bcel/generic/IRETURN.java index a794fd4b..3b19b661 100644 --- a/src/main/java/org/apache/bcel/generic/IRETURN.java +++ b/src/main/java/org/apache/bcel/generic/IRETURN.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IRETURN - Return int from method @@ -28,7 +28,7 @@ public class IRETURN extends ReturnInstruction { /** Return int from method */ public IRETURN() { - super(org.apache.commons.bcel6.Const.IRETURN); + super(org.apache.bcel.Const.IRETURN); } diff --git a/src/main/java/org/apache/bcel/generic/ISHL.java b/src/main/java/org/apache/bcel/generic/ISHL.java index 1361ac4f..f8b84511 100644 --- a/src/main/java/org/apache/bcel/generic/ISHL.java +++ b/src/main/java/org/apache/bcel/generic/ISHL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * ISHL - Arithmetic shift left int @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class ISHL extends ArithmeticInstruction { public ISHL() { - super(org.apache.commons.bcel6.Const.ISHL); + super(org.apache.bcel.Const.ISHL); } diff --git a/src/main/java/org/apache/bcel/generic/ISHR.java b/src/main/java/org/apache/bcel/generic/ISHR.java index 677e6a88..e899d263 100644 --- a/src/main/java/org/apache/bcel/generic/ISHR.java +++ b/src/main/java/org/apache/bcel/generic/ISHR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * ISHR - Arithmetic shift right int @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class ISHR extends ArithmeticInstruction { public ISHR() { - super(org.apache.commons.bcel6.Const.ISHR); + super(org.apache.bcel.Const.ISHR); } diff --git a/src/main/java/org/apache/bcel/generic/ISTORE.java b/src/main/java/org/apache/bcel/generic/ISTORE.java index 9018a1b8..5b0e1d5b 100644 --- a/src/main/java/org/apache/bcel/generic/ISTORE.java +++ b/src/main/java/org/apache/bcel/generic/ISTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * ISTORE - Store int from stack into local variable @@ -30,7 +30,7 @@ public class ISTORE extends StoreInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ ISTORE() { - super(org.apache.commons.bcel6.Const.ISTORE, org.apache.commons.bcel6.Const.ISTORE_0); + super(org.apache.bcel.Const.ISTORE, org.apache.bcel.Const.ISTORE_0); } @@ -38,7 +38,7 @@ public class ISTORE extends StoreInstruction { * @param n index of local variable */ public ISTORE(final int n) { - super(org.apache.commons.bcel6.Const.ISTORE, org.apache.commons.bcel6.Const.ISTORE_0, n); + super(org.apache.bcel.Const.ISTORE, org.apache.bcel.Const.ISTORE_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/ISUB.java b/src/main/java/org/apache/bcel/generic/ISUB.java index 446f8655..f79c54ad 100644 --- a/src/main/java/org/apache/bcel/generic/ISUB.java +++ b/src/main/java/org/apache/bcel/generic/ISUB.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * ISUB - Substract ints @@ -28,7 +28,7 @@ public class ISUB extends ArithmeticInstruction { /** Substract ints */ public ISUB() { - super(org.apache.commons.bcel6.Const.ISUB); + super(org.apache.bcel.Const.ISUB); } diff --git a/src/main/java/org/apache/bcel/generic/IUSHR.java b/src/main/java/org/apache/bcel/generic/IUSHR.java index 2b4452a3..dc86be8e 100644 --- a/src/main/java/org/apache/bcel/generic/IUSHR.java +++ b/src/main/java/org/apache/bcel/generic/IUSHR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IUSHR - Logical shift right int @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class IUSHR extends ArithmeticInstruction { public IUSHR() { - super(org.apache.commons.bcel6.Const.IUSHR); + super(org.apache.bcel.Const.IUSHR); } diff --git a/src/main/java/org/apache/bcel/generic/IXOR.java b/src/main/java/org/apache/bcel/generic/IXOR.java index c94a56ab..28be89b3 100644 --- a/src/main/java/org/apache/bcel/generic/IXOR.java +++ b/src/main/java/org/apache/bcel/generic/IXOR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * IXOR - Bitwise XOR int @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class IXOR extends ArithmeticInstruction { public IXOR() { - super(org.apache.commons.bcel6.Const.IXOR); + super(org.apache.bcel.Const.IXOR); } diff --git a/src/main/java/org/apache/bcel/generic/IfInstruction.java b/src/main/java/org/apache/bcel/generic/IfInstruction.java index 1979fc5a..0b8d03f7 100644 --- a/src/main/java/org/apache/bcel/generic/IfInstruction.java +++ b/src/main/java/org/apache/bcel/generic/IfInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Super class for the IFxxx family of instructions. diff --git a/src/main/java/org/apache/bcel/generic/IndexedInstruction.java b/src/main/java/org/apache/bcel/generic/IndexedInstruction.java index 02749f1f..5a226d71 100644 --- a/src/main/java/org/apache/bcel/generic/IndexedInstruction.java +++ b/src/main/java/org/apache/bcel/generic/IndexedInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denote entity that refers to an index, e.g. local variable instructions, diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index 55888cdd..51f65ecf 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.util.ByteSequence; /** * Abstract super class for all Java byte codes. diff --git a/src/main/java/org/apache/bcel/generic/InstructionComparator.java b/src/main/java/org/apache/bcel/generic/InstructionComparator.java index cce821d5..16558c28 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionComparator.java +++ b/src/main/java/org/apache/bcel/generic/InstructionComparator.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Equality of instructions isn't clearly to be defined. You might diff --git a/src/main/java/org/apache/bcel/generic/InstructionConst.java b/src/main/java/org/apache/bcel/generic/InstructionConst.java index 5fcde96b..3450c931 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionConst.java +++ b/src/main/java/org/apache/bcel/generic/InstructionConst.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This interface contains shareable instruction objects. diff --git a/src/main/java/org/apache/bcel/generic/InstructionConstants.java b/src/main/java/org/apache/bcel/generic/InstructionConstants.java index c0333dc5..d5166c6b 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionConstants.java +++ b/src/main/java/org/apache/bcel/generic/InstructionConstants.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * This interface contains shareable instruction objects. diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index c36c3163..75c2ed92 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Instances of this class may be used, e.g., to generate typed @@ -592,7 +592,7 @@ public class InstructionFactory { && (src == Const.T_CHAR || src == Const.T_BYTE || src == Const.T_SHORT)) { src = Const.T_INT; } - String name = "org.apache.commons.bcel6.generic." + short_names[src - Const.T_CHAR] + "2" + String name = "org.apache.bcel.generic." + short_names[src - Const.T_CHAR] + "2" + short_names[dest - Const.T_CHAR]; Instruction i = null; try { diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java index b4a9544f..a929ea73 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/main/java/org/apache/bcel/generic/InstructionHandle.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.util.Collection; import java.util.HashMap; @@ -23,7 +23,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -import org.apache.commons.bcel6.classfile.Utility; +import org.apache.bcel.classfile.Utility; /** * Instances of this class give users a handle to the instructions contained in diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 15af4fa5..f4fda14a 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; @@ -27,9 +27,9 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.util.ByteSequence; /** * This class is a container for a list of Instruction objects. Instructions can be appended, inserted, moved, deleted, etc.. diff --git a/src/main/java/org/apache/bcel/generic/InstructionListObserver.java b/src/main/java/org/apache/bcel/generic/InstructionListObserver.java index 0544cc09..7010dc21 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionListObserver.java +++ b/src/main/java/org/apache/bcel/generic/InstructionListObserver.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Implement this interface if you're interested in changes to an InstructionList object diff --git a/src/main/java/org/apache/bcel/generic/InstructionTargeter.java b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java index 2ef12dd9..dac4fc4c 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionTargeter.java +++ b/src/main/java/org/apache/bcel/generic/InstructionTargeter.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denote that a class targets InstructionHandles within an InstructionList. Namely diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index e5a62f4b..cd6923d7 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.util.StringTokenizer; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantCP; -import org.apache.commons.bcel6.classfile.ConstantPool; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantCP; +import org.apache.bcel.classfile.ConstantPool; /** * Super class for the INVOKExxx family of instructions. diff --git a/src/main/java/org/apache/bcel/generic/JSR.java b/src/main/java/org/apache/bcel/generic/JSR.java index 0564b1ab..3feced9f 100644 --- a/src/main/java/org/apache/bcel/generic/JSR.java +++ b/src/main/java/org/apache/bcel/generic/JSR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; @@ -36,7 +36,7 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { public JSR(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.JSR, target); + super(org.apache.bcel.Const.JSR, target); } @@ -47,7 +47,7 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { @Override public void dump( final DataOutputStream out ) throws IOException { super.setIndex(getTargetOffset()); - if (super.getOpcode() == org.apache.commons.bcel6.Const.JSR) { + if (super.getOpcode() == org.apache.bcel.Const.JSR) { super.dump(out); } else { // JSR_W super.setIndex(getTargetOffset()); @@ -62,7 +62,7 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { int i = getTargetOffset(); // Depending on old position value setPosition(getPosition() + offset); // Position may be shifted by preceding expansions if (Math.abs(i) >= (Short.MAX_VALUE - max_offset)) { // to large for short (estimate) - super.setOpcode(org.apache.commons.bcel6.Const.JSR_W); + super.setOpcode(org.apache.bcel.Const.JSR_W); short old_length = (short) super.getLength(); super.setLength(5); return super.getLength() - old_length; diff --git a/src/main/java/org/apache/bcel/generic/JSR_W.java b/src/main/java/org/apache/bcel/generic/JSR_W.java index 7ffe2617..a01a030c 100644 --- a/src/main/java/org/apache/bcel/generic/JSR_W.java +++ b/src/main/java/org/apache/bcel/generic/JSR_W.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.util.ByteSequence; /** * JSR_W - Jump to subroutine @@ -38,7 +38,7 @@ public class JSR_W extends JsrInstruction { public JSR_W(final InstructionHandle target) { - super(org.apache.commons.bcel6.Const.JSR_W, target); + super(org.apache.bcel.Const.JSR_W, target); super.setLength(5); } diff --git a/src/main/java/org/apache/bcel/generic/JsrInstruction.java b/src/main/java/org/apache/bcel/generic/JsrInstruction.java index 318bf2f1..c24c3fa3 100644 --- a/src/main/java/org/apache/bcel/generic/JsrInstruction.java +++ b/src/main/java/org/apache/bcel/generic/JsrInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Super class for JSR - Jump to subroutine diff --git a/src/main/java/org/apache/bcel/generic/L2D.java b/src/main/java/org/apache/bcel/generic/L2D.java index 28557d33..23420a6a 100644 --- a/src/main/java/org/apache/bcel/generic/L2D.java +++ b/src/main/java/org/apache/bcel/generic/L2D.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * L2D - Convert long to double @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class L2D extends ConversionInstruction { public L2D() { - super(org.apache.commons.bcel6.Const.L2D); + super(org.apache.bcel.Const.L2D); } diff --git a/src/main/java/org/apache/bcel/generic/L2F.java b/src/main/java/org/apache/bcel/generic/L2F.java index f8ae8c3c..0b169f27 100644 --- a/src/main/java/org/apache/bcel/generic/L2F.java +++ b/src/main/java/org/apache/bcel/generic/L2F.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * L2F - Convert long to float @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class L2F extends ConversionInstruction { public L2F() { - super(org.apache.commons.bcel6.Const.L2F); + super(org.apache.bcel.Const.L2F); } diff --git a/src/main/java/org/apache/bcel/generic/L2I.java b/src/main/java/org/apache/bcel/generic/L2I.java index f57595f6..d863f6ac 100644 --- a/src/main/java/org/apache/bcel/generic/L2I.java +++ b/src/main/java/org/apache/bcel/generic/L2I.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * L2I - Convert long to int @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class L2I extends ConversionInstruction { public L2I() { - super(org.apache.commons.bcel6.Const.L2I); + super(org.apache.bcel.Const.L2I); } diff --git a/src/main/java/org/apache/bcel/generic/LADD.java b/src/main/java/org/apache/bcel/generic/LADD.java index 8760ad85..f20cc101 100644 --- a/src/main/java/org/apache/bcel/generic/LADD.java +++ b/src/main/java/org/apache/bcel/generic/LADD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LADD - Add longs @@ -27,7 +27,7 @@ package org.apache.commons.bcel6.generic; public class LADD extends ArithmeticInstruction { public LADD() { - super(org.apache.commons.bcel6.Const.LADD); + super(org.apache.bcel.Const.LADD); } diff --git a/src/main/java/org/apache/bcel/generic/LALOAD.java b/src/main/java/org/apache/bcel/generic/LALOAD.java index 7d535156..4d7e6e3b 100644 --- a/src/main/java/org/apache/bcel/generic/LALOAD.java +++ b/src/main/java/org/apache/bcel/generic/LALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LALOAD - Load long from array @@ -28,7 +28,7 @@ public class LALOAD extends ArrayInstruction implements StackProducer { /** Load long from array */ public LALOAD() { - super(org.apache.commons.bcel6.Const.LALOAD); + super(org.apache.bcel.Const.LALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/LAND.java b/src/main/java/org/apache/bcel/generic/LAND.java index c0f82f98..4bd450a1 100644 --- a/src/main/java/org/apache/bcel/generic/LAND.java +++ b/src/main/java/org/apache/bcel/generic/LAND.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LAND - Bitwise AND longs @@ -27,7 +27,7 @@ package org.apache.commons.bcel6.generic; public class LAND extends ArithmeticInstruction { public LAND() { - super(org.apache.commons.bcel6.Const.LAND); + super(org.apache.bcel.Const.LAND); } diff --git a/src/main/java/org/apache/bcel/generic/LASTORE.java b/src/main/java/org/apache/bcel/generic/LASTORE.java index cce1fe56..40563398 100644 --- a/src/main/java/org/apache/bcel/generic/LASTORE.java +++ b/src/main/java/org/apache/bcel/generic/LASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LASTORE - Store into long array @@ -28,7 +28,7 @@ public class LASTORE extends ArrayInstruction implements StackConsumer { /** Store long into array */ public LASTORE() { - super(org.apache.commons.bcel6.Const.LASTORE); + super(org.apache.bcel.Const.LASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/LCMP.java b/src/main/java/org/apache/bcel/generic/LCMP.java index a7ecd90a..8cebdff9 100644 --- a/src/main/java/org/apache/bcel/generic/LCMP.java +++ b/src/main/java/org/apache/bcel/generic/LCMP.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LCMP - Compare longs: @@ -27,7 +27,7 @@ package org.apache.commons.bcel6.generic; public class LCMP extends Instruction implements TypedInstruction, StackProducer, StackConsumer { public LCMP() { - super(org.apache.commons.bcel6.Const.LCMP, (short) 1); + super(org.apache.bcel.Const.LCMP, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/LCONST.java b/src/main/java/org/apache/bcel/generic/LCONST.java index eb34212c..ae90df18 100644 --- a/src/main/java/org/apache/bcel/generic/LCONST.java +++ b/src/main/java/org/apache/bcel/generic/LCONST.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LCONST - Push 0 or 1, other values cause an exception @@ -38,11 +38,11 @@ public class LCONST extends Instruction implements ConstantPushInstruction { public LCONST(final long l) { - super(org.apache.commons.bcel6.Const.LCONST_0, (short) 1); + super(org.apache.bcel.Const.LCONST_0, (short) 1); if (l == 0) { - super.setOpcode(org.apache.commons.bcel6.Const.LCONST_0); + super.setOpcode(org.apache.bcel.Const.LCONST_0); } else if (l == 1) { - super.setOpcode(org.apache.commons.bcel6.Const.LCONST_1); + super.setOpcode(org.apache.bcel.Const.LCONST_1); } else { throw new ClassGenException("LCONST can be used only for 0 and 1: " + l); } diff --git a/src/main/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java index 00221c88..61a4a8df 100644 --- a/src/main/java/org/apache/bcel/generic/LDC.java +++ b/src/main/java/org/apache/bcel/generic/LDC.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.ExceptionConst; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.ExceptionConst; +import org.apache.bcel.util.ByteSequence; /** * LDC - Push item from constant pool. @@ -41,18 +41,18 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro public LDC(final int index) { - super(org.apache.commons.bcel6.Const.LDC_W, index); + super(org.apache.bcel.Const.LDC_W, index); setSize(); } // Adjust to proper size protected final void setSize() { - if (super.getIndex() <= org.apache.commons.bcel6.Const.MAX_BYTE) { // Fits in one byte? - super.setOpcode(org.apache.commons.bcel6.Const.LDC); + if (super.getIndex() <= org.apache.bcel.Const.MAX_BYTE) { // Fits in one byte? + super.setOpcode(org.apache.bcel.Const.LDC); super.setLength(2); } else { - super.setOpcode(org.apache.commons.bcel6.Const.LDC_W); + super.setOpcode(org.apache.bcel.Const.LDC_W); super.setLength(3); } } @@ -94,20 +94,20 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro public Object getValue( final ConstantPoolGen cpg ) { - org.apache.commons.bcel6.classfile.Constant c = cpg.getConstantPool().getConstant(super.getIndex()); + org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(super.getIndex()); switch (c.getTag()) { - case org.apache.commons.bcel6.Const.CONSTANT_String: - int i = ((org.apache.commons.bcel6.classfile.ConstantString) c).getStringIndex(); + case org.apache.bcel.Const.CONSTANT_String: + int i = ((org.apache.bcel.classfile.ConstantString) c).getStringIndex(); c = cpg.getConstantPool().getConstant(i); - return ((org.apache.commons.bcel6.classfile.ConstantUtf8) c).getBytes(); - case org.apache.commons.bcel6.Const.CONSTANT_Float: - return new Float(((org.apache.commons.bcel6.classfile.ConstantFloat) c).getBytes()); - case org.apache.commons.bcel6.Const.CONSTANT_Integer: - return Integer.valueOf(((org.apache.commons.bcel6.classfile.ConstantInteger) c).getBytes()); - case org.apache.commons.bcel6.Const.CONSTANT_Class: - int nameIndex = ((org.apache.commons.bcel6.classfile.ConstantClass) c).getNameIndex(); + return ((org.apache.bcel.classfile.ConstantUtf8) c).getBytes(); + case org.apache.bcel.Const.CONSTANT_Float: + return new Float(((org.apache.bcel.classfile.ConstantFloat) c).getBytes()); + case org.apache.bcel.Const.CONSTANT_Integer: + return Integer.valueOf(((org.apache.bcel.classfile.ConstantInteger) c).getBytes()); + case org.apache.bcel.Const.CONSTANT_Class: + int nameIndex = ((org.apache.bcel.classfile.ConstantClass) c).getNameIndex(); c = cpg.getConstantPool().getConstant(nameIndex); - return new ObjectType(((org.apache.commons.bcel6.classfile.ConstantUtf8) c).getBytes()); + return new ObjectType(((org.apache.bcel.classfile.ConstantUtf8) c).getBytes()); default: // Never reached throw new RuntimeException("Unknown or invalid constant type at " + super.getIndex()); } @@ -117,13 +117,13 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro @Override public Type getType( final ConstantPoolGen cpg ) { switch (cpg.getConstantPool().getConstant(super.getIndex()).getTag()) { - case org.apache.commons.bcel6.Const.CONSTANT_String: + case org.apache.bcel.Const.CONSTANT_String: return Type.STRING; - case org.apache.commons.bcel6.Const.CONSTANT_Float: + case org.apache.bcel.Const.CONSTANT_Float: return Type.FLOAT; - case org.apache.commons.bcel6.Const.CONSTANT_Integer: + case org.apache.bcel.Const.CONSTANT_Integer: return Type.INT; - case org.apache.commons.bcel6.Const.CONSTANT_Class: + case org.apache.bcel.Const.CONSTANT_Class: return Type.CLASS; default: // Never reached throw new RuntimeException("Unknown or invalid constant type at " + super.getIndex()); diff --git a/src/main/java/org/apache/bcel/generic/LDC2_W.java b/src/main/java/org/apache/bcel/generic/LDC2_W.java index 7caf862f..1f02857d 100644 --- a/src/main/java/org/apache/bcel/generic/LDC2_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC2_W.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LDC2_W - Push long or double from constant pool @@ -35,16 +35,16 @@ public class LDC2_W extends CPInstruction implements PushInstruction { public LDC2_W(final int index) { - super(org.apache.commons.bcel6.Const.LDC2_W, index); + super(org.apache.bcel.Const.LDC2_W, index); } @Override public Type getType( final ConstantPoolGen cpg ) { switch (cpg.getConstantPool().getConstant(super.getIndex()).getTag()) { - case org.apache.commons.bcel6.Const.CONSTANT_Long: + case org.apache.bcel.Const.CONSTANT_Long: return Type.LONG; - case org.apache.commons.bcel6.Const.CONSTANT_Double: + case org.apache.bcel.Const.CONSTANT_Double: return Type.DOUBLE; default: // Never reached throw new RuntimeException("Unknown constant type " + super.getOpcode()); @@ -53,12 +53,12 @@ public class LDC2_W extends CPInstruction implements PushInstruction { public Number getValue( final ConstantPoolGen cpg ) { - org.apache.commons.bcel6.classfile.Constant c = cpg.getConstantPool().getConstant(super.getIndex()); + org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(super.getIndex()); switch (c.getTag()) { - case org.apache.commons.bcel6.Const.CONSTANT_Long: - return Long.valueOf(((org.apache.commons.bcel6.classfile.ConstantLong) c).getBytes()); - case org.apache.commons.bcel6.Const.CONSTANT_Double: - return new Double(((org.apache.commons.bcel6.classfile.ConstantDouble) c).getBytes()); + case org.apache.bcel.Const.CONSTANT_Long: + return Long.valueOf(((org.apache.bcel.classfile.ConstantLong) c).getBytes()); + case org.apache.bcel.Const.CONSTANT_Double: + return new Double(((org.apache.bcel.classfile.ConstantDouble) c).getBytes()); default: // Never reached throw new RuntimeException("Unknown or invalid constant type at " + super.getIndex()); } diff --git a/src/main/java/org/apache/bcel/generic/LDC_W.java b/src/main/java/org/apache/bcel/generic/LDC_W.java index 41c47ddd..557bc559 100644 --- a/src/main/java/org/apache/bcel/generic/LDC_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC_W.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.IOException; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.util.ByteSequence; /** * LDC_W - Push item from constant pool (wide index) @@ -50,7 +50,7 @@ public class LDC_W extends LDC { protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { setIndex(bytes.readUnsignedShort()); // Override just in case it has been changed - super.setOpcode(org.apache.commons.bcel6.Const.LDC_W); + super.setOpcode(org.apache.bcel.Const.LDC_W); super.setLength(3); } } diff --git a/src/main/java/org/apache/bcel/generic/LDIV.java b/src/main/java/org/apache/bcel/generic/LDIV.java index 53e896c9..13774c05 100644 --- a/src/main/java/org/apache/bcel/generic/LDIV.java +++ b/src/main/java/org/apache/bcel/generic/LDIV.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * LDIV - Divide longs @@ -29,7 +29,7 @@ import org.apache.commons.bcel6.ExceptionConst; public class LDIV extends ArithmeticInstruction implements ExceptionThrower { public LDIV() { - super(org.apache.commons.bcel6.Const.LDIV); + super(org.apache.bcel.Const.LDIV); } diff --git a/src/main/java/org/apache/bcel/generic/LLOAD.java b/src/main/java/org/apache/bcel/generic/LLOAD.java index 1ef4df66..c2101572 100644 --- a/src/main/java/org/apache/bcel/generic/LLOAD.java +++ b/src/main/java/org/apache/bcel/generic/LLOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LLOAD - Load long from local variable @@ -30,12 +30,12 @@ public class LLOAD extends LoadInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ LLOAD() { - super(org.apache.commons.bcel6.Const.LLOAD, org.apache.commons.bcel6.Const.LLOAD_0); + super(org.apache.bcel.Const.LLOAD, org.apache.bcel.Const.LLOAD_0); } public LLOAD(final int n) { - super(org.apache.commons.bcel6.Const.LLOAD, org.apache.commons.bcel6.Const.LLOAD_0, n); + super(org.apache.bcel.Const.LLOAD, org.apache.bcel.Const.LLOAD_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/LMUL.java b/src/main/java/org/apache/bcel/generic/LMUL.java index 5aff21f6..6b65fd89 100644 --- a/src/main/java/org/apache/bcel/generic/LMUL.java +++ b/src/main/java/org/apache/bcel/generic/LMUL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LMUL - Multiply longs @@ -27,7 +27,7 @@ package org.apache.commons.bcel6.generic; public class LMUL extends ArithmeticInstruction { public LMUL() { - super(org.apache.commons.bcel6.Const.LMUL); + super(org.apache.bcel.Const.LMUL); } diff --git a/src/main/java/org/apache/bcel/generic/LNEG.java b/src/main/java/org/apache/bcel/generic/LNEG.java index 9d6b0f43..79e692ce 100644 --- a/src/main/java/org/apache/bcel/generic/LNEG.java +++ b/src/main/java/org/apache/bcel/generic/LNEG.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LNEG - Negate long @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class LNEG extends ArithmeticInstruction { public LNEG() { - super(org.apache.commons.bcel6.Const.LNEG); + super(org.apache.bcel.Const.LNEG); } diff --git a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java index 446b13d5..72303173 100644 --- a/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java +++ b/src/main/java/org/apache/bcel/generic/LOOKUPSWITCH.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.util.ByteSequence; /** * LOOKUPSWITCH - Switch with unordered set of values @@ -39,7 +39,7 @@ public class LOOKUPSWITCH extends Select { public LOOKUPSWITCH(final int[] match, final InstructionHandle[] targets, final InstructionHandle defaultTarget) { - super(org.apache.commons.bcel6.Const.LOOKUPSWITCH, match, targets, defaultTarget); + super(org.apache.bcel.Const.LOOKUPSWITCH, match, targets, defaultTarget); /* alignment remainder assumed 0 here, until dump time. */ final short _length = (short) (9 + getMatch_length() * 8); super.setLength(_length); diff --git a/src/main/java/org/apache/bcel/generic/LOR.java b/src/main/java/org/apache/bcel/generic/LOR.java index 0773133e..331bb83f 100644 --- a/src/main/java/org/apache/bcel/generic/LOR.java +++ b/src/main/java/org/apache/bcel/generic/LOR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LOR - Bitwise OR long @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class LOR extends ArithmeticInstruction { public LOR() { - super(org.apache.commons.bcel6.Const.LOR); + super(org.apache.bcel.Const.LOR); } diff --git a/src/main/java/org/apache/bcel/generic/LREM.java b/src/main/java/org/apache/bcel/generic/LREM.java index 28ff6504..a6e03a29 100644 --- a/src/main/java/org/apache/bcel/generic/LREM.java +++ b/src/main/java/org/apache/bcel/generic/LREM.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * LREM - Remainder of long @@ -28,7 +28,7 @@ import org.apache.commons.bcel6.ExceptionConst; public class LREM extends ArithmeticInstruction implements ExceptionThrower { public LREM() { - super(org.apache.commons.bcel6.Const.LREM); + super(org.apache.bcel.Const.LREM); } diff --git a/src/main/java/org/apache/bcel/generic/LRETURN.java b/src/main/java/org/apache/bcel/generic/LRETURN.java index d871616a..d2b122ae 100644 --- a/src/main/java/org/apache/bcel/generic/LRETURN.java +++ b/src/main/java/org/apache/bcel/generic/LRETURN.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LRETURN - Return long from method @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class LRETURN extends ReturnInstruction { public LRETURN() { - super(org.apache.commons.bcel6.Const.LRETURN); + super(org.apache.bcel.Const.LRETURN); } diff --git a/src/main/java/org/apache/bcel/generic/LSHL.java b/src/main/java/org/apache/bcel/generic/LSHL.java index 8bd23ba3..1dc99e8b 100644 --- a/src/main/java/org/apache/bcel/generic/LSHL.java +++ b/src/main/java/org/apache/bcel/generic/LSHL.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LSHL - Arithmetic shift left long @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class LSHL extends ArithmeticInstruction { public LSHL() { - super(org.apache.commons.bcel6.Const.LSHL); + super(org.apache.bcel.Const.LSHL); } diff --git a/src/main/java/org/apache/bcel/generic/LSHR.java b/src/main/java/org/apache/bcel/generic/LSHR.java index 2537a57b..ec5408d6 100644 --- a/src/main/java/org/apache/bcel/generic/LSHR.java +++ b/src/main/java/org/apache/bcel/generic/LSHR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LSHR - Arithmetic shift right long @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class LSHR extends ArithmeticInstruction { public LSHR() { - super(org.apache.commons.bcel6.Const.LSHR); + super(org.apache.bcel.Const.LSHR); } diff --git a/src/main/java/org/apache/bcel/generic/LSTORE.java b/src/main/java/org/apache/bcel/generic/LSTORE.java index f3ae48d0..4d3402ab 100644 --- a/src/main/java/org/apache/bcel/generic/LSTORE.java +++ b/src/main/java/org/apache/bcel/generic/LSTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LSTORE - Store long into local variable @@ -30,12 +30,12 @@ public class LSTORE extends StoreInstruction { * Instruction.readInstruction(). Not to be used otherwise. */ LSTORE() { - super(org.apache.commons.bcel6.Const.LSTORE, org.apache.commons.bcel6.Const.LSTORE_0); + super(org.apache.bcel.Const.LSTORE, org.apache.bcel.Const.LSTORE_0); } public LSTORE(final int n) { - super(org.apache.commons.bcel6.Const.LSTORE, org.apache.commons.bcel6.Const.LSTORE_0, n); + super(org.apache.bcel.Const.LSTORE, org.apache.bcel.Const.LSTORE_0, n); } diff --git a/src/main/java/org/apache/bcel/generic/LSUB.java b/src/main/java/org/apache/bcel/generic/LSUB.java index f2bdc307..07fb03c0 100644 --- a/src/main/java/org/apache/bcel/generic/LSUB.java +++ b/src/main/java/org/apache/bcel/generic/LSUB.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LSUB - Substract longs @@ -27,7 +27,7 @@ package org.apache.commons.bcel6.generic; public class LSUB extends ArithmeticInstruction { public LSUB() { - super(org.apache.commons.bcel6.Const.LSUB); + super(org.apache.bcel.Const.LSUB); } diff --git a/src/main/java/org/apache/bcel/generic/LUSHR.java b/src/main/java/org/apache/bcel/generic/LUSHR.java index b2117173..6e16663f 100644 --- a/src/main/java/org/apache/bcel/generic/LUSHR.java +++ b/src/main/java/org/apache/bcel/generic/LUSHR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LUSHR - Logical shift right long @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class LUSHR extends ArithmeticInstruction { public LUSHR() { - super(org.apache.commons.bcel6.Const.LUSHR); + super(org.apache.bcel.Const.LUSHR); } diff --git a/src/main/java/org/apache/bcel/generic/LXOR.java b/src/main/java/org/apache/bcel/generic/LXOR.java index 4be38581..2d6ec7e3 100644 --- a/src/main/java/org/apache/bcel/generic/LXOR.java +++ b/src/main/java/org/apache/bcel/generic/LXOR.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * LXOR - Bitwise XOR long @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class LXOR extends ArithmeticInstruction { public LXOR() { - super(org.apache.commons.bcel6.Const.LXOR); + super(org.apache.bcel.Const.LXOR); } diff --git a/src/main/java/org/apache/bcel/generic/LineNumberGen.java b/src/main/java/org/apache/bcel/generic/LineNumberGen.java index 0cf46cbc..92468baf 100644 --- a/src/main/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/main/java/org/apache/bcel/generic/LineNumberGen.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumber; /** * This class represents a line number within a method, i.e., give an instruction diff --git a/src/main/java/org/apache/bcel/generic/LoadClass.java b/src/main/java/org/apache/bcel/generic/LoadClass.java index 12d651ff..39d281e8 100644 --- a/src/main/java/org/apache/bcel/generic/LoadClass.java +++ b/src/main/java/org/apache/bcel/generic/LoadClass.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denotes that an instruction may start the process of loading and resolving diff --git a/src/main/java/org/apache/bcel/generic/LoadInstruction.java b/src/main/java/org/apache/bcel/generic/LoadInstruction.java index cb3412cc..ed532e9a 100644 --- a/src/main/java/org/apache/bcel/generic/LoadInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LoadInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denotes an unparameterized instruction to load a value from a local diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java index ec7e7fec..f96d4f39 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.LocalVariable; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.LocalVariable; /** * This class represents a local variable within a method. It contains its diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java index 9a38f354..90ed9755 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableInstruction.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.Const; +import org.apache.bcel.util.ByteSequence; /** * Abstract super class for instructions dealing with local variables. diff --git a/src/main/java/org/apache/bcel/generic/MONITORENTER.java b/src/main/java/org/apache/bcel/generic/MONITORENTER.java index 148d203e..dba33c90 100644 --- a/src/main/java/org/apache/bcel/generic/MONITORENTER.java +++ b/src/main/java/org/apache/bcel/generic/MONITORENTER.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * MONITORENTER - Enter monitor for object @@ -28,7 +28,7 @@ import org.apache.commons.bcel6.ExceptionConst; public class MONITORENTER extends Instruction implements ExceptionThrower, StackConsumer { public MONITORENTER() { - super(org.apache.commons.bcel6.Const.MONITORENTER, (short) 1); + super(org.apache.bcel.Const.MONITORENTER, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java index 4841327c..37c34e83 100644 --- a/src/main/java/org/apache/bcel/generic/MONITOREXIT.java +++ b/src/main/java/org/apache/bcel/generic/MONITOREXIT.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * MONITOREXIT - Exit monitor for object @@ -28,7 +28,7 @@ import org.apache.commons.bcel6.ExceptionConst; public class MONITOREXIT extends Instruction implements ExceptionThrower, StackConsumer { public MONITOREXIT() { - super(org.apache.commons.bcel6.Const.MONITOREXIT, (short) 1); + super(org.apache.bcel.Const.MONITOREXIT, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java index ba5b335b..6ac89535 100644 --- a/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/MULTIANEWARRAY.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.ExceptionConst; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.ExceptionConst; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.util.ByteSequence; /** * MULTIANEWARRAY - Create new mutidimensional array of references @@ -45,7 +45,7 @@ public class MULTIANEWARRAY extends CPInstruction implements LoadClass, Allocati public MULTIANEWARRAY(final int index, final short dimensions) { - super(org.apache.commons.bcel6.Const.MULTIANEWARRAY, index); + super(org.apache.bcel.Const.MULTIANEWARRAY, index); if (dimensions < 1) { throw new ClassGenException("Invalid dimensions value: " + dimensions); } diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 6a4dd92d..dcbf60e4 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.util.ArrayList; import java.util.Arrays; @@ -24,23 +24,23 @@ import java.util.Hashtable; import java.util.List; import java.util.Stack; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.AnnotationEntry; -import org.apache.commons.bcel6.classfile.Annotations; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.Code; -import org.apache.commons.bcel6.classfile.CodeException; -import org.apache.commons.bcel6.classfile.ExceptionTable; -import org.apache.commons.bcel6.classfile.LineNumber; -import org.apache.commons.bcel6.classfile.LineNumberTable; -import org.apache.commons.bcel6.classfile.LocalVariable; -import org.apache.commons.bcel6.classfile.LocalVariableTable; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.ParameterAnnotationEntry; -import org.apache.commons.bcel6.classfile.ParameterAnnotations; -import org.apache.commons.bcel6.classfile.RuntimeVisibleParameterAnnotations; -import org.apache.commons.bcel6.classfile.Utility; -import org.apache.commons.bcel6.util.BCELComparator; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Annotations; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.ParameterAnnotationEntry; +import org.apache.bcel.classfile.ParameterAnnotations; +import org.apache.bcel.classfile.RuntimeVisibleParameterAnnotations; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.util.BCELComparator; /** * Template class for building up a method. This is done by defining exception diff --git a/src/main/java/org/apache/bcel/generic/MethodObserver.java b/src/main/java/org/apache/bcel/generic/MethodObserver.java index d3b38166..9eafc0ad 100644 --- a/src/main/java/org/apache/bcel/generic/MethodObserver.java +++ b/src/main/java/org/apache/bcel/generic/MethodObserver.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Implement this interface if you're interested in changes to a MethodGen object diff --git a/src/main/java/org/apache/bcel/generic/NEW.java b/src/main/java/org/apache/bcel/generic/NEW.java index b56659f9..9c7d5b05 100644 --- a/src/main/java/org/apache/bcel/generic/NEW.java +++ b/src/main/java/org/apache/bcel/generic/NEW.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.ExceptionConst; /** * NEW - Create new object @@ -37,7 +37,7 @@ public class NEW extends CPInstruction implements LoadClass, AllocationInstructi public NEW(final int index) { - super(org.apache.commons.bcel6.Const.NEW, index); + super(org.apache.bcel.Const.NEW, index); } diff --git a/src/main/java/org/apache/bcel/generic/NEWARRAY.java b/src/main/java/org/apache/bcel/generic/NEWARRAY.java index 40edf5bd..f3ef642b 100644 --- a/src/main/java/org/apache/bcel/generic/NEWARRAY.java +++ b/src/main/java/org/apache/bcel/generic/NEWARRAY.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.ExceptionConst; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.ExceptionConst; +import org.apache.bcel.util.ByteSequence; /** * NEWARRAY - Create new array of basic type (int, short, ...) @@ -45,7 +45,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce public NEWARRAY(final byte type) { - super(org.apache.commons.bcel6.Const.NEWARRAY, (short) 2); + super(org.apache.bcel.Const.NEWARRAY, (short) 2); this.type = type; } @@ -87,7 +87,7 @@ public class NEWARRAY extends Instruction implements AllocationInstruction, Exce */ @Override public String toString( final boolean verbose ) { - return super.toString(verbose) + " " + org.apache.commons.bcel6.Const.getTypeName(type); + return super.toString(verbose) + " " + org.apache.bcel.Const.getTypeName(type); } diff --git a/src/main/java/org/apache/bcel/generic/NOP.java b/src/main/java/org/apache/bcel/generic/NOP.java index 75421e79..50c8b0b4 100644 --- a/src/main/java/org/apache/bcel/generic/NOP.java +++ b/src/main/java/org/apache/bcel/generic/NOP.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * NOP - Do nothing @@ -25,7 +25,7 @@ package org.apache.commons.bcel6.generic; public class NOP extends Instruction { public NOP() { - super(org.apache.commons.bcel6.Const.NOP, (short) 1); + super(org.apache.bcel.Const.NOP, (short) 1); } diff --git a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java index 7220f0ca..f98cbb05 100644 --- a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java +++ b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.classfile.ConstantCP; -import org.apache.commons.bcel6.classfile.ConstantNameAndType; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ConstantCP; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; /** * Super class for FieldOrMethod and INVOKEDYNAMIC, since they both have diff --git a/src/main/java/org/apache/bcel/generic/NamedAndTyped.java b/src/main/java/org/apache/bcel/generic/NamedAndTyped.java index 8b670bc5..f37694c4 100644 --- a/src/main/java/org/apache/bcel/generic/NamedAndTyped.java +++ b/src/main/java/org/apache/bcel/generic/NamedAndTyped.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denote entity that has both name and type. This is true for local variables, diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index 43e44763..0f9c1758 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.Const; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; /** * Denotes reference such as java.lang.String. diff --git a/src/main/java/org/apache/bcel/generic/POP.java b/src/main/java/org/apache/bcel/generic/POP.java index b568ddcd..b5783bdb 100644 --- a/src/main/java/org/apache/bcel/generic/POP.java +++ b/src/main/java/org/apache/bcel/generic/POP.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * POP - Pop top operand stack word @@ -27,7 +27,7 @@ package org.apache.commons.bcel6.generic; public class POP extends StackInstruction implements PopInstruction { public POP() { - super(org.apache.commons.bcel6.Const.POP); + super(org.apache.bcel.Const.POP); } diff --git a/src/main/java/org/apache/bcel/generic/POP2.java b/src/main/java/org/apache/bcel/generic/POP2.java index 354b9310..2d23534a 100644 --- a/src/main/java/org/apache/bcel/generic/POP2.java +++ b/src/main/java/org/apache/bcel/generic/POP2.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * POP2 - Pop two top operand stack words @@ -27,7 +27,7 @@ package org.apache.commons.bcel6.generic; public class POP2 extends StackInstruction implements PopInstruction { public POP2() { - super(org.apache.commons.bcel6.Const.POP2); + super(org.apache.bcel.Const.POP2); } diff --git a/src/main/java/org/apache/bcel/generic/PUSH.java b/src/main/java/org/apache/bcel/generic/PUSH.java index adf113b8..4c714232 100644 --- a/src/main/java/org/apache/bcel/generic/PUSH.java +++ b/src/main/java/org/apache/bcel/generic/PUSH.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Wrapper class for push operations, which are implemented either as BIPUSH, diff --git a/src/main/java/org/apache/bcel/generic/PUTFIELD.java b/src/main/java/org/apache/bcel/generic/PUTFIELD.java index 9d671005..aed86e4a 100644 --- a/src/main/java/org/apache/bcel/generic/PUTFIELD.java +++ b/src/main/java/org/apache/bcel/generic/PUTFIELD.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.Const; +import org.apache.bcel.ExceptionConst; /** * PUTFIELD - Put field in object diff --git a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java index e72dbf7b..9cc514a8 100644 --- a/src/main/java/org/apache/bcel/generic/PUTSTATIC.java +++ b/src/main/java/org/apache/bcel/generic/PUTSTATIC.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.Const; +import org.apache.bcel.ExceptionConst; /** * PUTSTATIC - Put static field in class diff --git a/src/main/java/org/apache/bcel/generic/PopInstruction.java b/src/main/java/org/apache/bcel/generic/PopInstruction.java index 683cfa31..14c13b5e 100644 --- a/src/main/java/org/apache/bcel/generic/PopInstruction.java +++ b/src/main/java/org/apache/bcel/generic/PopInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denotes an unparameterized instruction to pop a value on top from the stack, diff --git a/src/main/java/org/apache/bcel/generic/PushInstruction.java b/src/main/java/org/apache/bcel/generic/PushInstruction.java index caf92aa0..9dafc884 100644 --- a/src/main/java/org/apache/bcel/generic/PushInstruction.java +++ b/src/main/java/org/apache/bcel/generic/PushInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denotes an unparameterized instruction to produce a value on top of the stack, diff --git a/src/main/java/org/apache/bcel/generic/RET.java b/src/main/java/org/apache/bcel/generic/RET.java index e4a3193b..9201df5b 100644 --- a/src/main/java/org/apache/bcel/generic/RET.java +++ b/src/main/java/org/apache/bcel/generic/RET.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.util.ByteSequence; /** * RET - Return from subroutine @@ -44,7 +44,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc public RET(final int index) { - super(org.apache.commons.bcel6.Const.RET, (short) 2); + super(org.apache.bcel.Const.RET, (short) 2); setIndex(index); // May set wide as side effect } @@ -56,7 +56,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc @Override public void dump( final DataOutputStream out ) throws IOException { if (wide) { - out.writeByte(org.apache.commons.bcel6.Const.WIDE); + out.writeByte(org.apache.bcel.Const.WIDE); } out.writeByte(super.getOpcode()); if (wide) { @@ -68,7 +68,7 @@ public class RET extends Instruction implements IndexedInstruction, TypedInstruc private void setWide() { - wide = index > org.apache.commons.bcel6.Const.MAX_BYTE; + wide = index > org.apache.bcel.Const.MAX_BYTE; if (wide) { super.setLength(4); // Including the wide byte } else { diff --git a/src/main/java/org/apache/bcel/generic/RETURN.java b/src/main/java/org/apache/bcel/generic/RETURN.java index 9c567370..68b05eaf 100644 --- a/src/main/java/org/apache/bcel/generic/RETURN.java +++ b/src/main/java/org/apache/bcel/generic/RETURN.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * RETURN - Return from void method @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class RETURN extends ReturnInstruction { public RETURN() { - super(org.apache.commons.bcel6.Const.RETURN); + super(org.apache.bcel.Const.RETURN); } diff --git a/src/main/java/org/apache/bcel/generic/ReferenceType.java b/src/main/java/org/apache/bcel/generic/ReferenceType.java index 86ceeff6..d3ac34ac 100644 --- a/src/main/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/main/java/org/apache/bcel/generic/ReferenceType.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.Const; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; /** * Super class for object and array types. diff --git a/src/main/java/org/apache/bcel/generic/ReturnInstruction.java b/src/main/java/org/apache/bcel/generic/ReturnInstruction.java index a30391a5..ae06a791 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnInstruction.java +++ b/src/main/java/org/apache/bcel/generic/ReturnInstruction.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.ExceptionConst; +import org.apache.bcel.Const; +import org.apache.bcel.ExceptionConst; /** * Super class for the xRETURN family of instructions. diff --git a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java index eaf0d59f..d99d8fef 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java @@ -15,9 +15,9 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; -import org.apache.commons.bcel6.Const; +import org.apache.bcel.Const; /** * Returnaddress, the type JSR or JSR_W instructions push upon the stack. diff --git a/src/main/java/org/apache/bcel/generic/SALOAD.java b/src/main/java/org/apache/bcel/generic/SALOAD.java index 1326f6bc..1afddb51 100644 --- a/src/main/java/org/apache/bcel/generic/SALOAD.java +++ b/src/main/java/org/apache/bcel/generic/SALOAD.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * SALOAD - Load short from array @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class SALOAD extends ArrayInstruction implements StackProducer { public SALOAD() { - super(org.apache.commons.bcel6.Const.SALOAD); + super(org.apache.bcel.Const.SALOAD); } diff --git a/src/main/java/org/apache/bcel/generic/SASTORE.java b/src/main/java/org/apache/bcel/generic/SASTORE.java index 12b428bf..633780da 100644 --- a/src/main/java/org/apache/bcel/generic/SASTORE.java +++ b/src/main/java/org/apache/bcel/generic/SASTORE.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * SASTORE - Store into short array @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class SASTORE extends ArrayInstruction implements StackConsumer { public SASTORE() { - super(org.apache.commons.bcel6.Const.SASTORE); + super(org.apache.bcel.Const.SASTORE); } diff --git a/src/main/java/org/apache/bcel/generic/SIPUSH.java b/src/main/java/org/apache/bcel/generic/SIPUSH.java index 29e0d5fb..897dbbf8 100644 --- a/src/main/java/org/apache/bcel/generic/SIPUSH.java +++ b/src/main/java/org/apache/bcel/generic/SIPUSH.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.util.ByteSequence; /** * SIPUSH - Push short @@ -43,7 +43,7 @@ public class SIPUSH extends Instruction implements ConstantPushInstruction { public SIPUSH(final short b) { - super(org.apache.commons.bcel6.Const.SIPUSH, (short) 3); + super(org.apache.bcel.Const.SIPUSH, (short) 3); this.b = b; } diff --git a/src/main/java/org/apache/bcel/generic/SWAP.java b/src/main/java/org/apache/bcel/generic/SWAP.java index 563fc154..36111341 100644 --- a/src/main/java/org/apache/bcel/generic/SWAP.java +++ b/src/main/java/org/apache/bcel/generic/SWAP.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * SWAP - Swa top operand stack word @@ -26,7 +26,7 @@ package org.apache.commons.bcel6.generic; public class SWAP extends StackInstruction implements StackConsumer, StackProducer { public SWAP() { - super(org.apache.commons.bcel6.Const.SWAP); + super(org.apache.bcel.Const.SWAP); } diff --git a/src/main/java/org/apache/bcel/generic/SWITCH.java b/src/main/java/org/apache/bcel/generic/SWITCH.java index 28417428..948a3ed7 100644 --- a/src/main/java/org/apache/bcel/generic/SWITCH.java +++ b/src/main/java/org/apache/bcel/generic/SWITCH.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * SWITCH - Branch depending on int value, generates either LOOKUPSWITCH or diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index e9735311..9c85e8a5 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.util.ByteSequence; /** * Select - Abstract super class for LOOKUPSWITCH and TABLESWITCH instructions. diff --git a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java index 23a46f76..2a7abaee 100644 --- a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java @@ -15,18 +15,18 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.classfile.ConstantDouble; -import org.apache.commons.bcel6.classfile.ConstantFloat; -import org.apache.commons.bcel6.classfile.ConstantInteger; -import org.apache.commons.bcel6.classfile.ConstantLong; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.ElementValue; -import org.apache.commons.bcel6.classfile.SimpleElementValue; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ElementValue; +import org.apache.bcel.classfile.SimpleElementValue; /** * @since 6.0 diff --git a/src/main/java/org/apache/bcel/generic/StackConsumer.java b/src/main/java/org/apache/bcel/generic/StackConsumer.java index ed48d2a3..adc894fa 100644 --- a/src/main/java/org/apache/bcel/generic/StackConsumer.java +++ b/src/main/java/org/apache/bcel/generic/StackConsumer.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denote an instruction that may consume a value from the stack. diff --git a/src/main/java/org/apache/bcel/generic/StackInstruction.java b/src/main/java/org/apache/bcel/generic/StackInstruction.java index dc68efe3..b76bc248 100644 --- a/src/main/java/org/apache/bcel/generic/StackInstruction.java +++ b/src/main/java/org/apache/bcel/generic/StackInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Super class for stack operations like DUP and POP. diff --git a/src/main/java/org/apache/bcel/generic/StackProducer.java b/src/main/java/org/apache/bcel/generic/StackProducer.java index bea0a957..d42c9654 100644 --- a/src/main/java/org/apache/bcel/generic/StackProducer.java +++ b/src/main/java/org/apache/bcel/generic/StackProducer.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denote an instruction that may produce a value on top of the stack diff --git a/src/main/java/org/apache/bcel/generic/StoreInstruction.java b/src/main/java/org/apache/bcel/generic/StoreInstruction.java index c3a1c1bb..0c78dd1a 100644 --- a/src/main/java/org/apache/bcel/generic/StoreInstruction.java +++ b/src/main/java/org/apache/bcel/generic/StoreInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denotes an unparameterized instruction to store a value into a local variable, diff --git a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java index e1d780c1..29b582f7 100644 --- a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.DataOutputStream; import java.io.IOException; -import org.apache.commons.bcel6.util.ByteSequence; +import org.apache.bcel.util.ByteSequence; /** * TABLESWITCH - Switch within given range of values, i.e., low..high @@ -45,7 +45,7 @@ public class TABLESWITCH extends Select { * @param defaultTarget default branch */ public TABLESWITCH(final int[] match, final InstructionHandle[] targets, final InstructionHandle defaultTarget) { - super(org.apache.commons.bcel6.Const.TABLESWITCH, match, targets, defaultTarget); + super(org.apache.bcel.Const.TABLESWITCH, match, targets, defaultTarget); /* Alignment remainder assumed 0 here, until dump time */ final short _length = (short) (13 + getMatch_length() * 4); super.setLength(_length); diff --git a/src/main/java/org/apache/bcel/generic/TargetLostException.java b/src/main/java/org/apache/bcel/generic/TargetLostException.java index e129cf30..d66540b0 100644 --- a/src/main/java/org/apache/bcel/generic/TargetLostException.java +++ b/src/main/java/org/apache/bcel/generic/TargetLostException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Thrown by InstructionList.remove() when one or multiple disposed instructions diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index 06ba20b9..a05f6101 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -15,14 +15,14 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.util.ArrayList; import java.util.List; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.ClassFormatException; -import org.apache.commons.bcel6.classfile.Utility; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.ClassFormatException; +import org.apache.bcel.classfile.Utility; /** * Abstract super class for all possible java types, namely basic types diff --git a/src/main/java/org/apache/bcel/generic/TypedInstruction.java b/src/main/java/org/apache/bcel/generic/TypedInstruction.java index e7c2f28c..c401e9c6 100644 --- a/src/main/java/org/apache/bcel/generic/TypedInstruction.java +++ b/src/main/java/org/apache/bcel/generic/TypedInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Get the type associated with an instruction, int for ILOAD, or the type diff --git a/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java b/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java index 01ca259e..2d059af3 100644 --- a/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java +++ b/src/main/java/org/apache/bcel/generic/UnconditionalBranch.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denotes an instruction to perform an unconditional branch, i.e., GOTO, JSR. diff --git a/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java b/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java index aef5394f..e326100b 100644 --- a/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java +++ b/src/main/java/org/apache/bcel/generic/VariableLengthInstruction.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Denotes an instruction to be a variable length instruction, such as diff --git a/src/main/java/org/apache/bcel/generic/Visitor.java b/src/main/java/org/apache/bcel/generic/Visitor.java index 8152a1f0..26d2ba02 100644 --- a/src/main/java/org/apache/bcel/generic/Visitor.java +++ b/src/main/java/org/apache/bcel/generic/Visitor.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; /** * Interface implementing the Visitor pattern programming style. diff --git a/src/main/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java index 6141409f..a212828b 100644 --- a/src/main/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/main/java/org/apache/bcel/util/AttributeHTML.java @@ -15,28 +15,28 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.Code; -import org.apache.commons.bcel6.classfile.CodeException; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.ConstantValue; -import org.apache.commons.bcel6.classfile.ExceptionTable; -import org.apache.commons.bcel6.classfile.InnerClass; -import org.apache.commons.bcel6.classfile.InnerClasses; -import org.apache.commons.bcel6.classfile.LineNumber; -import org.apache.commons.bcel6.classfile.LineNumberTable; -import org.apache.commons.bcel6.classfile.LocalVariable; -import org.apache.commons.bcel6.classfile.LocalVariableTable; -import org.apache.commons.bcel6.classfile.SourceFile; -import org.apache.commons.bcel6.classfile.Utility; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.InnerClass; +import org.apache.bcel.classfile.InnerClasses; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.SourceFile; +import org.apache.bcel.classfile.Utility; /** * Convert found attributes into HTML file. diff --git a/src/main/java/org/apache/bcel/util/BCELComparator.java b/src/main/java/org/apache/bcel/util/BCELComparator.java index 02ce037d..0dab9c4f 100644 --- a/src/main/java/org/apache/bcel/util/BCELComparator.java +++ b/src/main/java/org/apache/bcel/util/BCELComparator.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; /** * Used for BCEL comparison strategy diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index 65fb8c5e..2e176ba1 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.PrintWriter; import java.util.ArrayList; @@ -24,37 +24,37 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.Utility; -import org.apache.commons.bcel6.generic.AllocationInstruction; -import org.apache.commons.bcel6.generic.ArrayInstruction; -import org.apache.commons.bcel6.generic.ArrayType; -import org.apache.commons.bcel6.generic.BranchHandle; -import org.apache.commons.bcel6.generic.BranchInstruction; -import org.apache.commons.bcel6.generic.CHECKCAST; -import org.apache.commons.bcel6.generic.CPInstruction; -import org.apache.commons.bcel6.generic.CodeExceptionGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.ConstantPushInstruction; -import org.apache.commons.bcel6.generic.EmptyVisitor; -import org.apache.commons.bcel6.generic.FieldInstruction; -import org.apache.commons.bcel6.generic.IINC; -import org.apache.commons.bcel6.generic.INSTANCEOF; -import org.apache.commons.bcel6.generic.Instruction; -import org.apache.commons.bcel6.generic.InstructionConst; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InvokeInstruction; -import org.apache.commons.bcel6.generic.LDC; -import org.apache.commons.bcel6.generic.LDC2_W; -import org.apache.commons.bcel6.generic.LocalVariableInstruction; -import org.apache.commons.bcel6.generic.MULTIANEWARRAY; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.NEWARRAY; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.RET; -import org.apache.commons.bcel6.generic.ReturnInstruction; -import org.apache.commons.bcel6.generic.Select; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.generic.AllocationInstruction; +import org.apache.bcel.generic.ArrayInstruction; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.BranchHandle; +import org.apache.bcel.generic.BranchInstruction; +import org.apache.bcel.generic.CHECKCAST; +import org.apache.bcel.generic.CPInstruction; +import org.apache.bcel.generic.CodeExceptionGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.ConstantPushInstruction; +import org.apache.bcel.generic.EmptyVisitor; +import org.apache.bcel.generic.FieldInstruction; +import org.apache.bcel.generic.IINC; +import org.apache.bcel.generic.INSTANCEOF; +import org.apache.bcel.generic.Instruction; +import org.apache.bcel.generic.InstructionConst; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InvokeInstruction; +import org.apache.bcel.generic.LDC; +import org.apache.bcel.generic.LDC2_W; +import org.apache.bcel.generic.LocalVariableInstruction; +import org.apache.bcel.generic.MULTIANEWARRAY; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.NEWARRAY; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.RET; +import org.apache.bcel.generic.ReturnInstruction; +import org.apache.bcel.generic.Select; +import org.apache.bcel.generic.Type; /** * Factory creates il.append() statements, and sets instruction targets. diff --git a/src/main/java/org/apache/bcel/util/BCELifier.java b/src/main/java/org/apache/bcel/util/BCELifier.java index d280b05e..50043acf 100644 --- a/src/main/java/org/apache/bcel/util/BCELifier.java +++ b/src/main/java/org/apache/bcel/util/BCELifier.java @@ -15,25 +15,25 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.util.Locale; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.ConstantValue; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.Utility; -import org.apache.commons.bcel6.generic.ArrayType; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.Const; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.Type; /** * This class takes a given JavaClass object and converts it to a @@ -44,7 +44,7 @@ import org.apache.commons.bcel6.generic.Type; * * @version $Id$ */ -public class BCELifier extends org.apache.commons.bcel6.classfile.EmptyVisitor { +public class BCELifier extends org.apache.bcel.classfile.EmptyVisitor { /** * Enum corresponding to flag source. diff --git a/src/main/java/org/apache/bcel/util/ByteSequence.java b/src/main/java/org/apache/bcel/util/ByteSequence.java index 5d10bdad..3550405b 100644 --- a/src/main/java/org/apache/bcel/util/ByteSequence.java +++ b/src/main/java/org/apache/bcel/util/ByteSequence.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.ByteArrayInputStream; import java.io.DataInputStream; diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index c1f05e96..490ef6dd 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.File; import java.io.FileOutputStream; @@ -24,13 +24,13 @@ import java.io.PrintWriter; import java.util.HashSet; import java.util.Set; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.Utility; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; /** * Read class file(s) and convert them into HTML files. diff --git a/src/main/java/org/apache/bcel/util/ClassLoader.java b/src/main/java/org/apache/bcel/util/ClassLoader.java index 6de8f050..d025944f 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoader.java +++ b/src/main/java/org/apache/bcel/util/ClassLoader.java @@ -15,19 +15,19 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Hashtable; -import org.apache.commons.bcel6.Constants; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Utility; +import org.apache.bcel.Constants; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Utility; /** *

    Drop in replacement for the standard class loader of the JVM. You can use it diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java index c9dee5c3..5f2b2e8f 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -15,15 +15,15 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.JavaClass; /** * The repository maintains information about which classes have @@ -32,7 +32,7 @@ import org.apache.commons.bcel6.classfile.JavaClass; * It loads its data from the ClassLoader implementation * passed into its constructor. * - * @see org.apache.commons.bcel6.Repository + * @see org.apache.bcel.Repository * * @version $Id$ */ diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 12ebea4d..226776a8 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.DataInputStream; import java.io.File; diff --git a/src/main/java/org/apache/bcel/util/ClassPathRepository.java b/src/main/java/org/apache/bcel/util/ClassPathRepository.java index 34916b24..2619c5bb 100644 --- a/src/main/java/org/apache/bcel/util/ClassPathRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassPathRepository.java @@ -15,21 +15,21 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.JavaClass; /** * This repository is used in situations where a Class is created outside the realm of a ClassLoader. Classes are loaded from the file systems using the paths * specified in the given class path. By default, this is the value returned by ClassPath.getClassPath().
    * - * @see org.apache.commons.bcel6.Repository + * @see org.apache.bcel.Repository */ public class ClassPathRepository implements Repository { diff --git a/src/main/java/org/apache/bcel/util/ClassQueue.java b/src/main/java/org/apache/bcel/util/ClassQueue.java index 7e51ef87..a42bcec5 100644 --- a/src/main/java/org/apache/bcel/util/ClassQueue.java +++ b/src/main/java/org/apache/bcel/util/ClassQueue.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.util.LinkedList; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.JavaClass; /** * Utility class implementing a (typesafe) queue of JavaClass diff --git a/src/main/java/org/apache/bcel/util/ClassSet.java b/src/main/java/org/apache/bcel/util/ClassSet.java index f896b7a8..f3542bd1 100644 --- a/src/main/java/org/apache/bcel/util/ClassSet.java +++ b/src/main/java/org/apache/bcel/util/ClassSet.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.util.Collection; import java.util.HashMap; import java.util.Map; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.JavaClass; /** * Utility class implementing a (typesafe) set of JavaClass objects. diff --git a/src/main/java/org/apache/bcel/util/ClassStack.java b/src/main/java/org/apache/bcel/util/ClassStack.java index bd89cd35..698915d9 100644 --- a/src/main/java/org/apache/bcel/util/ClassStack.java +++ b/src/main/java/org/apache/bcel/util/ClassStack.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.util.Stack; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.JavaClass; /** * Utility class implementing a (typesafe) stack of JavaClass objects. diff --git a/src/main/java/org/apache/bcel/util/ClassVector.java b/src/main/java/org/apache/bcel/util/ClassVector.java index 67f297bd..aba82554 100644 --- a/src/main/java/org/apache/bcel/util/ClassVector.java +++ b/src/main/java/org/apache/bcel/util/ClassVector.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.util.ArrayList; import java.util.List; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.JavaClass; /** * Utility class implementing a (typesafe) collection of JavaClass diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 03663d84..6b119742 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -15,27 +15,27 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.BitSet; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.Code; -import org.apache.commons.bcel6.classfile.CodeException; -import org.apache.commons.bcel6.classfile.ConstantFieldref; -import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; -import org.apache.commons.bcel6.classfile.ConstantInvokeDynamic; -import org.apache.commons.bcel6.classfile.ConstantMethodref; -import org.apache.commons.bcel6.classfile.ConstantNameAndType; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.LocalVariable; -import org.apache.commons.bcel6.classfile.LocalVariableTable; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.Utility; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantInvokeDynamic; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; /** * Convert code into HTML file. diff --git a/src/main/java/org/apache/bcel/util/ConstantHTML.java b/src/main/java/org/apache/bcel/util/ConstantHTML.java index 55c03f80..546b343c 100644 --- a/src/main/java/org/apache/bcel/util/ConstantHTML.java +++ b/src/main/java/org/apache/bcel/util/ConstantHTML.java @@ -15,23 +15,23 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantFieldref; -import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; -import org.apache.commons.bcel6.classfile.ConstantMethodref; -import org.apache.commons.bcel6.classfile.ConstantNameAndType; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantString; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.Utility; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; /** * Convert constant pool into HTML file. diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index 4fb9b92f..319b9e6f 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.util.ArrayList; import java.util.HashMap; @@ -26,10 +26,10 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.generic.ClassGenException; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.bcel.Const; +import org.apache.bcel.generic.ClassGenException; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; /** * InstructionFinder is a tool to search for given instructions patterns, i.e., diff --git a/src/main/java/org/apache/bcel/util/JavaWrapper.java b/src/main/java/org/apache/bcel/util/JavaWrapper.java index ca7ba4fb..4aed9716 100644 --- a/src/main/java/org/apache/bcel/util/JavaWrapper.java +++ b/src/main/java/org/apache/bcel/util/JavaWrapper.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -26,10 +26,10 @@ import java.lang.reflect.Modifier; * for your own applications.
    * Call this wrapper with: * - *

    java org.apache.commons.bcel6.util.JavaWrapper <real.class.name> [arguments]
    + *
    java org.apache.bcel.util.JavaWrapper <real.class.name> [arguments]
    * *

    To use your own class loader you can set the "bcel.classloader" system property

    - *

    java org.apache.commons.bcel6.util.JavaWrapper -Dbcel.classloader=foo.MyLoader <real.class.name> [arguments]
    + *
    java org.apache.bcel.util.JavaWrapper -Dbcel.classloader=foo.MyLoader <real.class.name> [arguments]
    * * @version $Id$ * @see ClassLoader diff --git a/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java b/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java index 4a698cbd..e8520343 100644 --- a/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java +++ b/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.IOException; import java.io.InputStream; @@ -23,15 +23,15 @@ import java.lang.ref.SoftReference; import java.util.HashMap; import java.util.Map; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.JavaClass; /** * This repository is used in situations where a Class is created outside the realm of a ClassLoader. Classes are loaded from the file systems using the paths * specified in the given class path. By default, this is the value returned by ClassPath.getClassPath(). This repository holds onto classes with * SoftReferences, and will reload as needed, in cases where memory sizes are important.
    * - * @see org.apache.commons.bcel6.Repository + * @see org.apache.bcel.Repository */ public class MemorySensitiveClassPathRepository implements Repository { diff --git a/src/main/java/org/apache/bcel/util/MethodHTML.java b/src/main/java/org/apache/bcel/util/MethodHTML.java index 56f5793b..1c605cb1 100644 --- a/src/main/java/org/apache/bcel/util/MethodHTML.java +++ b/src/main/java/org/apache/bcel/util/MethodHTML.java @@ -15,20 +15,20 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.Code; -import org.apache.commons.bcel6.classfile.ConstantValue; -import org.apache.commons.bcel6.classfile.ExceptionTable; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.Utility; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Utility; /** * Convert methods and fields into HTML file. diff --git a/src/main/java/org/apache/bcel/util/Repository.java b/src/main/java/org/apache/bcel/util/Repository.java index d1147e9c..b6cad383 100644 --- a/src/main/java/org/apache/bcel/util/Repository.java +++ b/src/main/java/org/apache/bcel/util/Repository.java @@ -15,16 +15,16 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.JavaClass; /** * Abstract definition of a class repository. Instances may be used * to load classes from different sources and may be used in the * Repository.setRepository method. * - * @see org.apache.commons.bcel6.Repository + * @see org.apache.bcel.Repository * @version $Id$ */ public interface Repository { diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index 5d5514b3..79b10498 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.util.HashMap; import java.util.Map; @@ -26,7 +26,7 @@ import java.util.Map; * This repository uses a factory design, allowing it to maintain a collection of different classpaths, and as such It is designed to be used as a singleton per * classpath. * - * @see org.apache.commons.bcel6.Repository + * @see org.apache.bcel.Repository * * @version $Id$ */ diff --git a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java index 18a11f6e..63d1fd0b 100644 --- a/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/GraphicalVerifier.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.UIManager; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.generic.Type; /** * A graphical user interface application demonstrating JustIce. diff --git a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java index 641d7545..98157b4b 100644 --- a/src/main/java/org/apache/bcel/verifier/NativeVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/NativeVerifier.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; /** * The NativeVerifier class implements a main(String[] args) method that's diff --git a/src/main/java/org/apache/bcel/verifier/PassVerifier.java b/src/main/java/org/apache/bcel/verifier/PassVerifier.java index f5f967a0..c60e949b 100644 --- a/src/main/java/org/apache/bcel/verifier/PassVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/PassVerifier.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java index 182a65fe..5807b38b 100644 --- a/src/main/java/org/apache/bcel/verifier/TransitiveHull.java +++ b/src/main/java/org/apache/bcel/verifier/TransitiveHull.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; /** * This class has a main method implementing a demonstration program diff --git a/src/main/java/org/apache/bcel/verifier/VerificationResult.java b/src/main/java/org/apache/bcel/verifier/VerificationResult.java index d2981775..faa3fd7f 100644 --- a/src/main/java/org/apache/bcel/verifier/VerificationResult.java +++ b/src/main/java/org/apache/bcel/verifier/VerificationResult.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; /** * A VerificationResult is what a PassVerifier returns diff --git a/src/main/java/org/apache/bcel/verifier/Verifier.java b/src/main/java/org/apache/bcel/verifier/Verifier.java index 0e014c73..c762bf69 100644 --- a/src/main/java/org/apache/bcel/verifier/Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/Verifier.java @@ -15,18 +15,18 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.verifier.statics.Pass1Verifier; -import org.apache.commons.bcel6.verifier.statics.Pass2Verifier; -import org.apache.commons.bcel6.verifier.statics.Pass3aVerifier; -import org.apache.commons.bcel6.verifier.structurals.Pass3bVerifier; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.verifier.statics.Pass1Verifier; +import org.apache.bcel.verifier.statics.Pass2Verifier; +import org.apache.bcel.verifier.statics.Pass3aVerifier; +import org.apache.bcel.verifier.structurals.Pass3bVerifier; /** * A Verifier instance is there to verify a class file according to The Java Virtual @@ -163,7 +163,7 @@ public class Verifier { int meth = pv.getMethodNo(); for (String element : p3am) { messages.add("Pass 3a, method " + meth + " ('" - + org.apache.commons.bcel6.Repository.lookupClass(classname).getMethods()[meth] + + org.apache.bcel.Repository.lookupClass(classname).getMethods()[meth] + "'): " + element); } } @@ -172,7 +172,7 @@ public class Verifier { int meth = pv.getMethodNo(); for (String element : p3bm) { messages.add("Pass 3b, method " + meth + " ('" - + org.apache.commons.bcel6.Repository.lookupClass(classname).getMethods()[meth] + + org.apache.bcel.Repository.lookupClass(classname).getMethods()[meth] + "'): " + element); } } @@ -211,7 +211,7 @@ public class Verifier { vr = v.doPass2(); System.out.println("Pass 2:\n" + vr); if (vr == VerificationResult.VR_OK) { - JavaClass jc = org.apache.commons.bcel6.Repository.lookupClass(args[k]); + JavaClass jc = org.apache.bcel.Repository.lookupClass(args[k]); for (int i = 0; i < jc.getMethods().length; i++) { vr = v.doPass3a(i); System.out.println("Pass 3a, method number " + i + " ['" @@ -232,7 +232,7 @@ public class Verifier { System.out.println("\n"); // avoid swapping. v.flush(); - org.apache.commons.bcel6.Repository.clearCache(); + org.apache.bcel.Repository.clearCache(); System.gc(); } catch (ClassNotFoundException e) { e.printStackTrace(); diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index 0bf42af4..f1670f93 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; import java.awt.AWTEvent; import java.awt.CardLayout; @@ -39,8 +39,8 @@ import javax.swing.JTextPane; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; /** * This class implements a machine-generated frame for use with diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java index 4c1e0afc..b828addb 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactory.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactory.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; import java.util.HashMap; import java.util.List; diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java index 91be79e7..bcf40392 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryListModel.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java index 6cfdbb44..a1bc8609 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierFactoryObserver.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; /** * VerifierFactoryObserver instances are notified when new Verifier diff --git a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java index 98109de2..12b0a9ef 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifyDialog.java +++ b/src/main/java/org/apache/bcel/verifier/VerifyDialog.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; import java.awt.Color; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; /** * A class for simple graphical class file verification. diff --git a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java index fe9fbd12..8b138ff2 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java index d6b115c0..31882eac 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java index 0247edcf..7ade44da 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** * Instances of this class are thrown by BCEL's class file verifier "JustIce" when diff --git a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java index 40543fae..cc0847b1 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** * Instances of this class are thrown by BCEL's class file verifier "JustIce" diff --git a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java index 4055b8a1..c4ecd8f7 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LinkingConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** * Instances of this class are thrown by BCEL's class file verifier "JustIce" when diff --git a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java index 5e90be62..54218817 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java index b8afdf07..31718214 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java index 135a66f1..55537a4f 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java index 0d56347c..5f4c518f 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java index cfaab1ea..75924db6 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java index 94d24d46..0dacce7c 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** * Instances of this class are thrown by BCEL's class file verifier "JustIce" when diff --git a/src/main/java/org/apache/bcel/verifier/exc/Utility.java b/src/main/java/org/apache/bcel/verifier/exc/Utility.java index 5f521a32..592f0d22 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/Utility.java +++ b/src/main/java/org/apache/bcel/verifier/exc/Utility.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; import java.io.PrintWriter; diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java index 8e499220..c0c5e41c 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java index d2640722..7f5e8a02 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.exc; +package org.apache.bcel.verifier.exc; /** diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java index 0cd3213c..41c2299f 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.statics; +package org.apache.bcel.verifier.statics; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.Const; +import org.apache.bcel.generic.Type; /** * This class represents the upper half of a DOUBLE variable. diff --git a/src/main/java/org/apache/bcel/verifier/statics/IntList.java b/src/main/java/org/apache/bcel/verifier/statics/IntList.java index bf2670f9..77703c0c 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/IntList.java +++ b/src/main/java/org/apache/bcel/verifier/statics/IntList.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.statics; +package org.apache.bcel.verifier.statics; import java.util.ArrayList; diff --git a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java index 14d48ece..33672b10 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.statics; +package org.apache.bcel.verifier.statics; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.Const; +import org.apache.bcel.generic.Type; /** * This class represents the upper half of a LONG variable. diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java index d58dae0b..eba29084 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.statics; +package org.apache.bcel.verifier.statics; import java.util.Hashtable; -import org.apache.commons.bcel6.generic.Type; -import org.apache.commons.bcel6.verifier.exc.LocalVariableInfoInconsistentException; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; /** * A utility class holding the information about diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java index c5fd3d8f..fc536185 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.statics; +package org.apache.bcel.verifier.statics; -import org.apache.commons.bcel6.generic.Type; -import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; -import org.apache.commons.bcel6.verifier.exc.LocalVariableInfoInconsistentException; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; /** * A utility class holding the information about diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index 6ffcba7a..bf028379 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -15,17 +15,17 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.statics; +package org.apache.bcel.verifier.statics; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.ClassFormatException; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.verifier.PassVerifier; -import org.apache.commons.bcel6.verifier.VerificationResult; -import org.apache.commons.bcel6.verifier.Verifier; -import org.apache.commons.bcel6.verifier.exc.LoadingException; -import org.apache.commons.bcel6.verifier.exc.Utility; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.ClassFormatException; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.verifier.PassVerifier; +import org.apache.bcel.verifier.VerificationResult; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.exc.LoadingException; +import org.apache.bcel.verifier.exc.Utility; /** * This PassVerifier verifies a class file according to pass 1 as @@ -140,8 +140,8 @@ public final class Pass1Verifier extends PassVerifier{ * (like the check for extra bytes at the end of the class file) are handy when actually using BCEL to repair a class file * (otherwise you would not be able to load it into BCEL).

    * - * @see org.apache.commons.bcel6.Repository - * @see org.apache.commons.bcel6.Const#JVM_CLASSFILE_MAGIC + * @see org.apache.bcel.Repository + * @see org.apache.bcel.Const#JVM_CLASSFILE_MAGIC */ @Override public VerificationResult do_verify(){ diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index f8550d37..67c4aeb2 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.statics; +package org.apache.bcel.verifier.statics; import java.util.HashMap; @@ -25,53 +25,53 @@ import java.util.Locale; import java.util.Map; import java.util.Set; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.ClassFormatException; -import org.apache.commons.bcel6.classfile.Code; -import org.apache.commons.bcel6.classfile.CodeException; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantDouble; -import org.apache.commons.bcel6.classfile.ConstantFieldref; -import org.apache.commons.bcel6.classfile.ConstantFloat; -import org.apache.commons.bcel6.classfile.ConstantInteger; -import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; -import org.apache.commons.bcel6.classfile.ConstantLong; -import org.apache.commons.bcel6.classfile.ConstantMethodref; -import org.apache.commons.bcel6.classfile.ConstantNameAndType; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantString; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.ConstantValue; -import org.apache.commons.bcel6.classfile.Deprecated; -import org.apache.commons.bcel6.classfile.DescendingVisitor; -import org.apache.commons.bcel6.classfile.EmptyVisitor; -import org.apache.commons.bcel6.classfile.ExceptionTable; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.InnerClass; -import org.apache.commons.bcel6.classfile.InnerClasses; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.LineNumber; -import org.apache.commons.bcel6.classfile.LineNumberTable; -import org.apache.commons.bcel6.classfile.LocalVariable; -import org.apache.commons.bcel6.classfile.LocalVariableTable; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.Node; -import org.apache.commons.bcel6.classfile.SourceFile; -import org.apache.commons.bcel6.classfile.Synthetic; -import org.apache.commons.bcel6.classfile.Unknown; -import org.apache.commons.bcel6.generic.ArrayType; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.Type; -import org.apache.commons.bcel6.verifier.PassVerifier; -import org.apache.commons.bcel6.verifier.VerificationResult; -import org.apache.commons.bcel6.verifier.Verifier; -import org.apache.commons.bcel6.verifier.VerifierFactory; -import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; -import org.apache.commons.bcel6.verifier.exc.ClassConstraintException; -import org.apache.commons.bcel6.verifier.exc.LocalVariableInfoInconsistentException; +import org.apache.bcel.Const; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.ClassFormatException; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Deprecated; +import org.apache.bcel.classfile.DescendingVisitor; +import org.apache.bcel.classfile.EmptyVisitor; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.InnerClass; +import org.apache.bcel.classfile.InnerClasses; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.Node; +import org.apache.bcel.classfile.SourceFile; +import org.apache.bcel.classfile.Synthetic; +import org.apache.bcel.classfile.Unknown; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.PassVerifier; +import org.apache.bcel.verifier.VerificationResult; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.VerifierFactory; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.ClassConstraintException; +import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; /** * This PassVerifier verifies a class file according to @@ -314,7 +314,7 @@ public final class Pass2Verifier extends PassVerifier { * * @see #constant_pool_entries_satisfy_static_constraints() */ - private final class CPESSC_Visitor extends org.apache.commons.bcel6.classfile.EmptyVisitor{ + private final class CPESSC_Visitor extends org.apache.bcel.classfile.EmptyVisitor{ private final Class CONST_Class; /* private Class CONST_Fieldref; @@ -1303,7 +1303,7 @@ public final class Pass2Verifier extends PassVerifier { * pool must be valid. * * @see #constant_pool_entries_satisfy_static_constraints() - * @see org.apache.commons.bcel6.classfile.ConstantCP + * @see org.apache.bcel.classfile.ConstantCP */ private final class FAMRAV_Visitor extends EmptyVisitor{ private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work. diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index f9bc7187..865788c8 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -15,90 +15,90 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.statics; - - -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.Code; -import org.apache.commons.bcel6.classfile.CodeException; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantDouble; -import org.apache.commons.bcel6.classfile.ConstantFieldref; -import org.apache.commons.bcel6.classfile.ConstantFloat; -import org.apache.commons.bcel6.classfile.ConstantInteger; -import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; -import org.apache.commons.bcel6.classfile.ConstantLong; -import org.apache.commons.bcel6.classfile.ConstantMethodref; -import org.apache.commons.bcel6.classfile.ConstantNameAndType; -import org.apache.commons.bcel6.classfile.ConstantString; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.LineNumber; -import org.apache.commons.bcel6.classfile.LineNumberTable; -import org.apache.commons.bcel6.classfile.LocalVariable; -import org.apache.commons.bcel6.classfile.LocalVariableTable; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.generic.ALOAD; -import org.apache.commons.bcel6.generic.ANEWARRAY; -import org.apache.commons.bcel6.generic.ASTORE; -import org.apache.commons.bcel6.generic.ATHROW; -import org.apache.commons.bcel6.generic.ArrayType; -import org.apache.commons.bcel6.generic.BREAKPOINT; -import org.apache.commons.bcel6.generic.CHECKCAST; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.DLOAD; -import org.apache.commons.bcel6.generic.DSTORE; -import org.apache.commons.bcel6.generic.FLOAD; -import org.apache.commons.bcel6.generic.FSTORE; -import org.apache.commons.bcel6.generic.FieldInstruction; -import org.apache.commons.bcel6.generic.GETSTATIC; -import org.apache.commons.bcel6.generic.GotoInstruction; -import org.apache.commons.bcel6.generic.IINC; -import org.apache.commons.bcel6.generic.ILOAD; -import org.apache.commons.bcel6.generic.IMPDEP1; -import org.apache.commons.bcel6.generic.IMPDEP2; -import org.apache.commons.bcel6.generic.INSTANCEOF; -import org.apache.commons.bcel6.generic.INVOKEDYNAMIC; -import org.apache.commons.bcel6.generic.INVOKEINTERFACE; -import org.apache.commons.bcel6.generic.INVOKESPECIAL; -import org.apache.commons.bcel6.generic.INVOKESTATIC; -import org.apache.commons.bcel6.generic.INVOKEVIRTUAL; -import org.apache.commons.bcel6.generic.ISTORE; -import org.apache.commons.bcel6.generic.Instruction; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.InvokeInstruction; -import org.apache.commons.bcel6.generic.JsrInstruction; -import org.apache.commons.bcel6.generic.LDC; -import org.apache.commons.bcel6.generic.LDC2_W; -import org.apache.commons.bcel6.generic.LLOAD; -import org.apache.commons.bcel6.generic.LOOKUPSWITCH; -import org.apache.commons.bcel6.generic.LSTORE; -import org.apache.commons.bcel6.generic.LoadClass; -import org.apache.commons.bcel6.generic.MULTIANEWARRAY; -import org.apache.commons.bcel6.generic.NEW; -import org.apache.commons.bcel6.generic.NEWARRAY; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.PUTSTATIC; -import org.apache.commons.bcel6.generic.RET; -import org.apache.commons.bcel6.generic.ReferenceType; -import org.apache.commons.bcel6.generic.ReturnInstruction; -import org.apache.commons.bcel6.generic.TABLESWITCH; -import org.apache.commons.bcel6.generic.Type; -import org.apache.commons.bcel6.verifier.PassVerifier; -import org.apache.commons.bcel6.verifier.VerificationResult; -import org.apache.commons.bcel6.verifier.Verifier; -import org.apache.commons.bcel6.verifier.VerifierFactory; -import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; -import org.apache.commons.bcel6.verifier.exc.ClassConstraintException; -import org.apache.commons.bcel6.verifier.exc.InvalidMethodException; -import org.apache.commons.bcel6.verifier.exc.StaticCodeConstraintException; -import org.apache.commons.bcel6.verifier.exc.StaticCodeInstructionConstraintException; -import org.apache.commons.bcel6.verifier.exc.StaticCodeInstructionOperandConstraintException; +package org.apache.bcel.verifier.statics; + + +import org.apache.bcel.Const; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ALOAD; +import org.apache.bcel.generic.ANEWARRAY; +import org.apache.bcel.generic.ASTORE; +import org.apache.bcel.generic.ATHROW; +import org.apache.bcel.generic.ArrayType; +import org.apache.bcel.generic.BREAKPOINT; +import org.apache.bcel.generic.CHECKCAST; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.DLOAD; +import org.apache.bcel.generic.DSTORE; +import org.apache.bcel.generic.FLOAD; +import org.apache.bcel.generic.FSTORE; +import org.apache.bcel.generic.FieldInstruction; +import org.apache.bcel.generic.GETSTATIC; +import org.apache.bcel.generic.GotoInstruction; +import org.apache.bcel.generic.IINC; +import org.apache.bcel.generic.ILOAD; +import org.apache.bcel.generic.IMPDEP1; +import org.apache.bcel.generic.IMPDEP2; +import org.apache.bcel.generic.INSTANCEOF; +import org.apache.bcel.generic.INVOKEDYNAMIC; +import org.apache.bcel.generic.INVOKEINTERFACE; +import org.apache.bcel.generic.INVOKESPECIAL; +import org.apache.bcel.generic.INVOKESTATIC; +import org.apache.bcel.generic.INVOKEVIRTUAL; +import org.apache.bcel.generic.ISTORE; +import org.apache.bcel.generic.Instruction; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.InvokeInstruction; +import org.apache.bcel.generic.JsrInstruction; +import org.apache.bcel.generic.LDC; +import org.apache.bcel.generic.LDC2_W; +import org.apache.bcel.generic.LLOAD; +import org.apache.bcel.generic.LOOKUPSWITCH; +import org.apache.bcel.generic.LSTORE; +import org.apache.bcel.generic.LoadClass; +import org.apache.bcel.generic.MULTIANEWARRAY; +import org.apache.bcel.generic.NEW; +import org.apache.bcel.generic.NEWARRAY; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.PUTSTATIC; +import org.apache.bcel.generic.RET; +import org.apache.bcel.generic.ReferenceType; +import org.apache.bcel.generic.ReturnInstruction; +import org.apache.bcel.generic.TABLESWITCH; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.PassVerifier; +import org.apache.bcel.verifier.VerificationResult; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.VerifierFactory; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.ClassConstraintException; +import org.apache.bcel.verifier.exc.InvalidMethodException; +import org.apache.bcel.verifier.exc.StaticCodeConstraintException; +import org.apache.bcel.verifier.exc.StaticCodeInstructionConstraintException; +import org.apache.bcel.verifier.exc.StaticCodeInstructionOperandConstraintException; /** * This PassVerifier verifies a class file according to @@ -470,7 +470,7 @@ public final class Pass3aVerifier extends PassVerifier{ * This visitor class does the actual checking for the instruction * operand's constraints. */ - private class InstOperandConstraintVisitor extends org.apache.commons.bcel6.generic.EmptyVisitor{ + private class InstOperandConstraintVisitor extends org.apache.bcel.generic.EmptyVisitor{ /** The ConstantPoolGen instance this Visitor operates on. */ private final ConstantPoolGen cpg; diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java index 417a0d7a..31b6367a 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java +++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java @@ -15,55 +15,55 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.statics; - - -import org.apache.commons.bcel6.classfile.AnnotationDefault; -import org.apache.commons.bcel6.classfile.AnnotationEntry; -import org.apache.commons.bcel6.classfile.Annotations; -import org.apache.commons.bcel6.classfile.BootstrapMethods; -import org.apache.commons.bcel6.classfile.Code; -import org.apache.commons.bcel6.classfile.CodeException; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantDouble; -import org.apache.commons.bcel6.classfile.ConstantFieldref; -import org.apache.commons.bcel6.classfile.ConstantFloat; -import org.apache.commons.bcel6.classfile.ConstantInteger; -import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; -import org.apache.commons.bcel6.classfile.ConstantInvokeDynamic; -import org.apache.commons.bcel6.classfile.ConstantLong; -import org.apache.commons.bcel6.classfile.ConstantMethodHandle; -import org.apache.commons.bcel6.classfile.ConstantMethodType; -import org.apache.commons.bcel6.classfile.ConstantMethodref; -import org.apache.commons.bcel6.classfile.ConstantNameAndType; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantString; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.ConstantValue; -import org.apache.commons.bcel6.classfile.Deprecated; -import org.apache.commons.bcel6.classfile.EnclosingMethod; -import org.apache.commons.bcel6.classfile.ExceptionTable; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.InnerClass; -import org.apache.commons.bcel6.classfile.InnerClasses; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.LineNumber; -import org.apache.commons.bcel6.classfile.LineNumberTable; -import org.apache.commons.bcel6.classfile.LocalVariable; -import org.apache.commons.bcel6.classfile.LocalVariableTable; -import org.apache.commons.bcel6.classfile.LocalVariableTypeTable; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.MethodParameters; -import org.apache.commons.bcel6.classfile.Node; -import org.apache.commons.bcel6.classfile.ParameterAnnotationEntry; -import org.apache.commons.bcel6.classfile.ParameterAnnotations; -import org.apache.commons.bcel6.classfile.Signature; -import org.apache.commons.bcel6.classfile.SourceFile; -import org.apache.commons.bcel6.classfile.StackMap; -import org.apache.commons.bcel6.classfile.StackMapEntry; -import org.apache.commons.bcel6.classfile.Synthetic; -import org.apache.commons.bcel6.classfile.Unknown; -import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; +package org.apache.bcel.verifier.statics; + + +import org.apache.bcel.classfile.AnnotationDefault; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Annotations; +import org.apache.bcel.classfile.BootstrapMethods; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantInvokeDynamic; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantMethodHandle; +import org.apache.bcel.classfile.ConstantMethodType; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Deprecated; +import org.apache.bcel.classfile.EnclosingMethod; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.InnerClass; +import org.apache.bcel.classfile.InnerClasses; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.LocalVariableTypeTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.MethodParameters; +import org.apache.bcel.classfile.Node; +import org.apache.bcel.classfile.ParameterAnnotationEntry; +import org.apache.bcel.classfile.ParameterAnnotations; +import org.apache.bcel.classfile.Signature; +import org.apache.bcel.classfile.SourceFile; +import org.apache.bcel.classfile.StackMap; +import org.apache.bcel.classfile.StackMapEntry; +import org.apache.bcel.classfile.Synthetic; +import org.apache.bcel.classfile.Unknown; +import org.apache.bcel.verifier.exc.AssertionViolatedException; /** * BCEL's Node classes (those from the classfile API that accept() Visitor @@ -79,7 +79,7 @@ import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; * * @version $Id$ */ -public class StringRepresentation extends org.apache.commons.bcel6.classfile.EmptyVisitor { +public class StringRepresentation extends org.apache.bcel.classfile.EmptyVisitor { /** The string representation, created by a visitXXX() method, output by toString(). */ private String tostring; /** The node we ask for its string representation. Not really needed; only for debug output. */ diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java index 8b34053d..9a820ca0 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ControlFlowGraph.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; import java.util.ArrayList; @@ -23,18 +23,18 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.bcel6.generic.ATHROW; -import org.apache.commons.bcel6.generic.BranchInstruction; -import org.apache.commons.bcel6.generic.GotoInstruction; -import org.apache.commons.bcel6.generic.Instruction; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.JsrInstruction; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.RET; -import org.apache.commons.bcel6.generic.ReturnInstruction; -import org.apache.commons.bcel6.generic.Select; -import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; -import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; +import org.apache.bcel.generic.ATHROW; +import org.apache.bcel.generic.BranchInstruction; +import org.apache.bcel.generic.GotoInstruction; +import org.apache.bcel.generic.Instruction; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.JsrInstruction; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.RET; +import org.apache.bcel.generic.ReturnInstruction; +import org.apache.bcel.generic.Select; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; /** * This class represents a control flow graph of a method. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java index b8545c8c..2f24b209 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java @@ -15,11 +15,11 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.ObjectType; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.ObjectType; /** * This class represents an exception handler; that is, an ObjectType diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index 68f24b27..e6e1438b 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; import java.util.HashMap; @@ -23,9 +23,9 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -import org.apache.commons.bcel6.generic.CodeExceptionGen; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.MethodGen; +import org.apache.bcel.generic.CodeExceptionGen; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.MethodGen; /** * This class allows easy access to ExceptionHandler objects. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index 4ffe6efe..b1148cb5 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -15,19 +15,19 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantDouble; -import org.apache.commons.bcel6.classfile.ConstantFloat; -import org.apache.commons.bcel6.classfile.ConstantInteger; -import org.apache.commons.bcel6.classfile.ConstantLong; -import org.apache.commons.bcel6.classfile.ConstantString; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantString; // CHECKSTYLE:OFF (there are lots of references!) -import org.apache.commons.bcel6.generic.*; +import org.apache.bcel.generic.*; //CHECKSTYLE:ON /** diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Frame.java b/src/main/java/org/apache/bcel/verifier/structurals/Frame.java index f8395206..a278e750 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Frame.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Frame.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java b/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java index fc679ca5..a7c1d7a2 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/GenericArray.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; /** diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java index 2c8d6927..11e025c6 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstConstraintVisitor.java @@ -15,29 +15,29 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; - - -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.Constant; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantDouble; -import org.apache.commons.bcel6.classfile.ConstantFieldref; -import org.apache.commons.bcel6.classfile.ConstantFloat; -import org.apache.commons.bcel6.classfile.ConstantInteger; -import org.apache.commons.bcel6.classfile.ConstantLong; -import org.apache.commons.bcel6.classfile.ConstantString; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.JavaClass; +package org.apache.bcel.verifier.structurals; + + +import org.apache.bcel.Const; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.Constant; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; //CHECKSTYLE:OFF (there are lots of references!) -import org.apache.commons.bcel6.generic.*; +import org.apache.bcel.generic.*; //CHECKSTYLE:ON -import org.apache.commons.bcel6.verifier.VerificationResult; -import org.apache.commons.bcel6.verifier.Verifier; -import org.apache.commons.bcel6.verifier.VerifierFactory; -import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; -import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; +import org.apache.bcel.verifier.VerificationResult; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.VerifierFactory; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; /** diff --git a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java index 6635ddc0..ad4f928a 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/InstructionContext.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; import java.util.ArrayList; -import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionHandle; /** * An InstructionContext offers convenient access diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java index ecafd393..015dfeec 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -15,13 +15,13 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; -import org.apache.commons.bcel6.generic.ReferenceType; -import org.apache.commons.bcel6.generic.Type; -import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; -import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; +import org.apache.bcel.generic.ReferenceType; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; /** * This class implements an array of local variables used for symbolic JVM @@ -174,8 +174,8 @@ public class LocalVariables implements Cloneable { else{ if (! (locals[i].equals(lv.locals[i])) ){ /*TODO - if ((locals[i] instanceof org.apache.commons.bcel6.generic.ReturnaddressType) && - (lv.locals[i] instanceof org.apache.commons.bcel6.generic.ReturnaddressType)){ + if ((locals[i] instanceof org.apache.bcel.generic.ReturnaddressType) && + (lv.locals[i] instanceof org.apache.bcel.generic.ReturnaddressType)){ //System.err.println("merging "+locals[i]+" and "+lv.locals[i]); throw new AssertionViolatedException("Merging different ReturnAddresses: '"+locals[i]+"' and '"+lv.locals[i]+"'."); } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java index 84ccf53f..998319d6 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/OperandStack.java @@ -15,16 +15,16 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; import java.util.ArrayList; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.ReferenceType; -import org.apache.commons.bcel6.generic.Type; -import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; -import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.ReferenceType; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; /** * This class implements a stack used for symbolic JVM stack simulation. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java index 39269e57..597bdd72 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Pass3bVerifier.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; import java.io.PrintWriter; @@ -25,26 +25,26 @@ import java.util.List; import java.util.Random; import java.util.Vector; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.JsrInstruction; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.RET; -import org.apache.commons.bcel6.generic.ReferenceType; -import org.apache.commons.bcel6.generic.ReturnInstruction; -import org.apache.commons.bcel6.generic.ReturnaddressType; -import org.apache.commons.bcel6.generic.Type; -import org.apache.commons.bcel6.verifier.PassVerifier; -import org.apache.commons.bcel6.verifier.VerificationResult; -import org.apache.commons.bcel6.verifier.Verifier; -import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; -import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; -import org.apache.commons.bcel6.verifier.exc.VerifierConstraintViolatedException; +import org.apache.bcel.Const; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.JsrInstruction; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.RET; +import org.apache.bcel.generic.ReferenceType; +import org.apache.bcel.generic.ReturnInstruction; +import org.apache.bcel.generic.ReturnaddressType; +import org.apache.bcel.generic.Type; +import org.apache.bcel.verifier.PassVerifier; +import org.apache.bcel.verifier.VerificationResult; +import org.apache.bcel.verifier.Verifier; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; +import org.apache.bcel.verifier.exc.VerifierConstraintViolatedException; /** * This PassVerifier verifies a method of class file according to pass 3, @@ -112,7 +112,7 @@ public final class Pass3bVerifier extends PassVerifier{ /** * This class should only be instantiated by a Verifier. * - * @see org.apache.commons.bcel6.verifier.Verifier + * @see org.apache.bcel.verifier.Verifier */ public Pass3bVerifier(final Verifier owner, final int method_no){ myOwner = owner; @@ -306,8 +306,8 @@ public final class Pass3bVerifier extends PassVerifier{ * verifier-inferred types and the class file's debug information (LocalVariables * attributes) match [TODO]. * - * @see org.apache.commons.bcel6.verifier.statics.LocalVariablesInfo - * @see org.apache.commons.bcel6.verifier.statics.Pass2Verifier#getLocalVariablesInfo(int) + * @see org.apache.bcel.verifier.statics.LocalVariablesInfo + * @see org.apache.bcel.verifier.statics.Pass2Verifier#getLocalVariablesInfo(int) */ @Override public VerificationResult do_verify(){ diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java index 7210a4f6..e87a410e 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java @@ -15,10 +15,10 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; -import org.apache.commons.bcel6.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionHandle; /** * This interface defines properties of JVM bytecode subroutines. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java index 8ee6382f..4177983b 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutines.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; import java.util.ArrayList; import java.util.HashMap; @@ -24,22 +24,22 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.commons.bcel6.generic.ASTORE; -import org.apache.commons.bcel6.generic.ATHROW; -import org.apache.commons.bcel6.generic.BranchInstruction; -import org.apache.commons.bcel6.generic.CodeExceptionGen; -import org.apache.commons.bcel6.generic.GotoInstruction; -import org.apache.commons.bcel6.generic.IndexedInstruction; -import org.apache.commons.bcel6.generic.Instruction; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.JsrInstruction; -import org.apache.commons.bcel6.generic.LocalVariableInstruction; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.RET; -import org.apache.commons.bcel6.generic.ReturnInstruction; -import org.apache.commons.bcel6.generic.Select; -import org.apache.commons.bcel6.verifier.exc.AssertionViolatedException; -import org.apache.commons.bcel6.verifier.exc.StructuralCodeConstraintException; +import org.apache.bcel.generic.ASTORE; +import org.apache.bcel.generic.ATHROW; +import org.apache.bcel.generic.BranchInstruction; +import org.apache.bcel.generic.CodeExceptionGen; +import org.apache.bcel.generic.GotoInstruction; +import org.apache.bcel.generic.IndexedInstruction; +import org.apache.bcel.generic.Instruction; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.JsrInstruction; +import org.apache.bcel.generic.LocalVariableInstruction; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.RET; +import org.apache.bcel.generic.ReturnInstruction; +import org.apache.bcel.generic.Select; +import org.apache.bcel.verifier.exc.AssertionViolatedException; +import org.apache.bcel.verifier.exc.StructuralCodeConstraintException; /** * Instances of this class contain information about the subroutines diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index 2ed3f762..9fd03a4a 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -15,12 +15,12 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.structurals; +package org.apache.bcel.verifier.structurals; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.ReferenceType; +import org.apache.bcel.Const; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.ReferenceType; /** * This class represents an uninitialized object type; see The Java diff --git a/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java index 277b4bd9..269dbd89 100644 --- a/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java +++ b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import static org.junit.Assert.assertEquals; diff --git a/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java b/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java index 6a0394ac..d6463fd3 100644 --- a/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java +++ b/src/test/java/org/apache/bcel/classfile/UtilityTestCase.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.bcel6.classfile; +package org.apache.bcel.classfile; import junit.framework.TestCase; diff --git a/src/test/java/org/apache/bcel/data/AnnotatedFields.java b/src/test/java/org/apache/bcel/data/AnnotatedFields.java index d8391a0d..76ae6bdb 100644 --- a/src/test/java/org/apache/bcel/data/AnnotatedFields.java +++ b/src/test/java/org/apache/bcel/data/AnnotatedFields.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; public class AnnotatedFields { @SimpleAnnotation(id=1) int i; diff --git a/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java b/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java index e514ad0b..f04364eb 100644 --- a/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java +++ b/src/test/java/org/apache/bcel/data/AnnotatedWithCombinedAnnotation.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; @CombinedAnnotation( { @SimpleAnnotation(id = 4) }) public class AnnotatedWithCombinedAnnotation diff --git a/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java b/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java index 8aad494a..f238eb4d 100644 --- a/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java +++ b/src/test/java/org/apache/bcel/data/AnnotatedWithEnumClass.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; @AnnotationEnumElement(enumval = SimpleEnum.Red) public class AnnotatedWithEnumClass diff --git a/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java b/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java index 63b333d5..389ad8a7 100644 --- a/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java +++ b/src/test/java/org/apache/bcel/data/AnnotationEnumElement.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/test/java/org/apache/bcel/data/AnonymousClassTest.java b/src/test/java/org/apache/bcel/data/AnonymousClassTest.java index 070451f7..807c8b9b 100644 --- a/src/test/java/org/apache/bcel/data/AnonymousClassTest.java +++ b/src/test/java/org/apache/bcel/data/AnonymousClassTest.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; public class AnonymousClassTest { diff --git a/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java b/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java index c4ea20b2..b9170ac7 100644 --- a/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java +++ b/src/test/java/org/apache/bcel/data/AttributeTestClassEM01.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; public class AttributeTestClassEM01 { diff --git a/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java b/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java index 16c85eaa..64d0cafb 100644 --- a/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java +++ b/src/test/java/org/apache/bcel/data/AttributeTestClassEM02.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; public class AttributeTestClassEM02 { diff --git a/src/test/java/org/apache/bcel/data/CombinedAnnotation.java b/src/test/java/org/apache/bcel/data/CombinedAnnotation.java index efcbeb71..5ccb0354 100644 --- a/src/test/java/org/apache/bcel/data/CombinedAnnotation.java +++ b/src/test/java/org/apache/bcel/data/CombinedAnnotation.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java b/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java index 51748c51..62eef117 100644 --- a/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java +++ b/src/test/java/org/apache/bcel/data/ComplexAnnotatedClass.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; @ComplexAnnotation(ival = 4, bval = 2, cval = '5', fval = 3.0f, dval = 33.4, zval = false, jval = 56, sval = 99) public class ComplexAnnotatedClass diff --git a/src/test/java/org/apache/bcel/data/ComplexAnnotation.java b/src/test/java/org/apache/bcel/data/ComplexAnnotation.java index 39f0be45..35370f2c 100644 --- a/src/test/java/org/apache/bcel/data/ComplexAnnotation.java +++ b/src/test/java/org/apache/bcel/data/ComplexAnnotation.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/test/java/org/apache/bcel/data/MarkedType.java b/src/test/java/org/apache/bcel/data/MarkedType.java index 56f97df2..598338c9 100644 --- a/src/test/java/org/apache/bcel/data/MarkedType.java +++ b/src/test/java/org/apache/bcel/data/MarkedType.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; @MarkerAnnotationInvisible @MarkerAnnotation diff --git a/src/test/java/org/apache/bcel/data/MarkerAnnotation.java b/src/test/java/org/apache/bcel/data/MarkerAnnotation.java index 714a0a98..948c2868 100644 --- a/src/test/java/org/apache/bcel/data/MarkerAnnotation.java +++ b/src/test/java/org/apache/bcel/data/MarkerAnnotation.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java b/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java index 20563b6b..02d545fd 100644 --- a/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java +++ b/src/test/java/org/apache/bcel/data/MarkerAnnotationInvisible.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/test/java/org/apache/bcel/data/PLSETestClass.java b/src/test/java/org/apache/bcel/data/PLSETestClass.java index 6a1cf31d..e98cc761 100644 --- a/src/test/java/org/apache/bcel/data/PLSETestClass.java +++ b/src/test/java/org/apache/bcel/data/PLSETestClass.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; import java.util.ArrayList; diff --git a/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java b/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java index 37831da4..eff28aad 100644 --- a/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java +++ b/src/test/java/org/apache/bcel/data/SimpleAnnotatedClass.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; @SimpleAnnotation(id = 4) public class SimpleAnnotatedClass diff --git a/src/test/java/org/apache/bcel/data/SimpleAnnotation.java b/src/test/java/org/apache/bcel/data/SimpleAnnotation.java index 4b4140fc..6189e908 100644 --- a/src/test/java/org/apache/bcel/data/SimpleAnnotation.java +++ b/src/test/java/org/apache/bcel/data/SimpleAnnotation.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/src/test/java/org/apache/bcel/data/SimpleClass.java b/src/test/java/org/apache/bcel/data/SimpleClass.java index 9fa9ac01..19aca12b 100644 --- a/src/test/java/org/apache/bcel/data/SimpleClass.java +++ b/src/test/java/org/apache/bcel/data/SimpleClass.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; public class SimpleClass { diff --git a/src/test/java/org/apache/bcel/data/SimpleEnum.java b/src/test/java/org/apache/bcel/data/SimpleEnum.java index 743de36a..1db0bbf9 100644 --- a/src/test/java/org/apache/bcel/data/SimpleEnum.java +++ b/src/test/java/org/apache/bcel/data/SimpleEnum.java @@ -16,6 +16,6 @@ * */ -package org.apache.commons.bcel6.data; +package org.apache.bcel.data; public enum SimpleEnum { Red,Orange,Yellow,Green,Blue,Indigo,Violet } diff --git a/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java b/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java index 0bebb801..68f468e7 100644 --- a/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -25,12 +25,12 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import org.apache.commons.bcel6.AbstractTestCase; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.Annotations; -import org.apache.commons.bcel6.classfile.Attribute; -import org.apache.commons.bcel6.classfile.RuntimeInvisibleAnnotations; -import org.apache.commons.bcel6.classfile.RuntimeVisibleAnnotations; +import org.apache.bcel.AbstractTestCase; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.Annotations; +import org.apache.bcel.classfile.Attribute; +import org.apache.bcel.classfile.RuntimeInvisibleAnnotations; +import org.apache.bcel.classfile.RuntimeVisibleAnnotations; public class AnnotationGenTestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/bcel/generic/BranchHandleTestCase.java b/src/test/java/org/apache/bcel/generic/BranchHandleTestCase.java index 7c4f8f72..22d3d812 100644 --- a/src/test/java/org/apache/bcel/generic/BranchHandleTestCase.java +++ b/src/test/java/org/apache/bcel/generic/BranchHandleTestCase.java @@ -1,4 +1,4 @@ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import org.junit.Assert; import org.junit.Test; diff --git a/src/test/java/org/apache/bcel/generic/FieldAnnotationsTestCase.java b/src/test/java/org/apache/bcel/generic/FieldAnnotationsTestCase.java index 306ecb2b..f35369e4 100644 --- a/src/test/java/org/apache/bcel/generic/FieldAnnotationsTestCase.java +++ b/src/test/java/org/apache/bcel/generic/FieldAnnotationsTestCase.java @@ -16,17 +16,17 @@ * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.File; import java.io.IOException; -import org.apache.commons.bcel6.AbstractTestCase; -import org.apache.commons.bcel6.classfile.AnnotationEntry; -import org.apache.commons.bcel6.classfile.ElementValuePair; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.util.SyntheticRepository; +import org.apache.bcel.AbstractTestCase; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.ElementValuePair; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.util.SyntheticRepository; public class FieldAnnotationsTestCase extends AbstractTestCase { diff --git a/src/test/java/org/apache/bcel/generic/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/bcel/generic/GeneratingAnnotatedClassesTestCase.java index b63700d2..94f094ad 100644 --- a/src/test/java/org/apache/bcel/generic/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/bcel/generic/GeneratingAnnotatedClassesTestCase.java @@ -15,23 +15,23 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.io.File; import java.util.ArrayList; import java.util.List; -import org.apache.commons.bcel6.AbstractTestCase; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.classfile.AnnotationEntry; -import org.apache.commons.bcel6.classfile.ArrayElementValue; -import org.apache.commons.bcel6.classfile.ElementValue; -import org.apache.commons.bcel6.classfile.ElementValuePair; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.ParameterAnnotationEntry; -import org.apache.commons.bcel6.classfile.SimpleElementValue; -import org.apache.commons.bcel6.util.SyntheticRepository; +import org.apache.bcel.AbstractTestCase; +import org.apache.bcel.Const; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.ArrayElementValue; +import org.apache.bcel.classfile.ElementValue; +import org.apache.bcel.classfile.ElementValuePair; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.ParameterAnnotationEntry; +import org.apache.bcel.classfile.SimpleElementValue; +import org.apache.bcel.util.SyntheticRepository; /** * The program that some of the tests generate looks like this: diff --git a/src/test/java/org/apache/bcel/generic/InstructionHandleTestCase.java b/src/test/java/org/apache/bcel/generic/InstructionHandleTestCase.java index ab9d786c..ade83bb2 100644 --- a/src/test/java/org/apache/bcel/generic/InstructionHandleTestCase.java +++ b/src/test/java/org/apache/bcel/generic/InstructionHandleTestCase.java @@ -1,4 +1,4 @@ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import org.junit.Assert; import org.junit.Test; diff --git a/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java b/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java index 34e1caf2..419b7d1a 100644 --- a/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java +++ b/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.fail; @@ -27,10 +27,10 @@ import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import org.apache.commons.bcel6.classfile.ClassParser; -import org.apache.commons.bcel6.classfile.Code; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; +import org.apache.bcel.classfile.ClassParser; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; import org.junit.Test; /** diff --git a/src/test/java/org/apache/bcel/generic/MethodGenTestCase.java b/src/test/java/org/apache/bcel/generic/MethodGenTestCase.java index d432d127..859b34bc 100644 --- a/src/test/java/org/apache/bcel/generic/MethodGenTestCase.java +++ b/src/test/java/org/apache/bcel/generic/MethodGenTestCase.java @@ -15,13 +15,13 @@ * limitations under the License. */ -package org.apache.commons.bcel6.generic; +package org.apache.bcel.generic; import java.util.Arrays; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.Method; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.Method; import junit.framework.TestCase; diff --git a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java index b42b94e9..ee8f4266 100644 --- a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java +++ b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java @@ -1,4 +1,4 @@ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import static org.junit.Assert.*; @@ -8,7 +8,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.classfile.JavaClass; import org.junit.Test; diff --git a/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java b/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java index be468a32..031c4e50 100644 --- a/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java +++ b/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.io.File; import java.io.FileInputStream; -import org.apache.commons.bcel6.classfile.ClassParser; +import org.apache.bcel.classfile.ClassParser; import org.junit.Assert; import junit.framework.TestCase; diff --git a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java index 7701e841..76e771b9 100644 --- a/src/test/java/org/apache/bcel/util/InstructionFinderTest.java +++ b/src/test/java/org/apache/bcel/util/InstructionFinderTest.java @@ -16,16 +16,16 @@ * */ -package org.apache.commons.bcel6.util; +package org.apache.bcel.util; import java.util.Iterator; -import org.apache.commons.bcel6.AbstractTestCase; -import org.apache.commons.bcel6.generic.IADD; -import org.apache.commons.bcel6.generic.ILOAD; -import org.apache.commons.bcel6.generic.ISTORE; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; +import org.apache.bcel.AbstractTestCase; +import org.apache.bcel.generic.IADD; +import org.apache.bcel.generic.ILOAD; +import org.apache.bcel.generic.ISTORE; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; public class InstructionFinderTest extends AbstractTestCase { diff --git a/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java b/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java index b773e8ba..bba0d4d8 100644 --- a/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java +++ b/src/test/java/org/apache/bcel/verifier/AbstractVerifierTestCase.java @@ -16,10 +16,10 @@ * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.classfile.JavaClass; +import org.apache.bcel.Repository; +import org.apache.bcel.classfile.JavaClass; import junit.framework.TestCase; diff --git a/src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java index 7408e87f..a1af8669 100644 --- a/src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java +++ b/src/test/java/org/apache/bcel/verifier/VerifierArrayAccessTestCase.java @@ -16,13 +16,13 @@ * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; import java.io.IOException; -import org.apache.commons.bcel6.verifier.tests.TestArrayAccess02Creator; -import org.apache.commons.bcel6.verifier.tests.TestArrayAccess03Creator; -import org.apache.commons.bcel6.verifier.tests.TestArrayAccess04Creator; +import org.apache.bcel.verifier.tests.TestArrayAccess02Creator; +import org.apache.bcel.verifier.tests.TestArrayAccess03Creator; +import org.apache.bcel.verifier.tests.TestArrayAccess04Creator; public class VerifierArrayAccessTestCase extends AbstractVerifierTestCase { diff --git a/src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java index 6a01a902..c93a0d47 100644 --- a/src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java +++ b/src/test/java/org/apache/bcel/verifier/VerifierInvokeTestCase.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; public class VerifierInvokeTestCase extends AbstractVerifierTestCase { diff --git a/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java index dd6554d4..78c62a00 100644 --- a/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java +++ b/src/test/java/org/apache/bcel/verifier/VerifierReturnTestCase.java @@ -15,12 +15,12 @@ * limitations under the License. */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; import java.io.IOException; -import org.apache.commons.bcel6.verifier.tests.TestReturn01Creator; -import org.apache.commons.bcel6.verifier.tests.TestReturn03Creator; +import org.apache.bcel.verifier.tests.TestReturn01Creator; +import org.apache.bcel.verifier.tests.TestReturn03Creator; public class VerifierReturnTestCase extends AbstractVerifierTestCase { diff --git a/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java b/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java index 38ea8df5..1e68bc4b 100644 --- a/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java +++ b/src/test/java/org/apache/bcel/verifier/VerifierTestCase.java @@ -16,7 +16,7 @@ * */ -package org.apache.commons.bcel6.verifier; +package org.apache.bcel.verifier; import java.util.Collection; diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArray01.java b/src/test/java/org/apache/bcel/verifier/tests/TestArray01.java index e97aa1c8..16763cff 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestArray01.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestArray01.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; import java.io.Serializable; diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java index 7815c194..25e2e31d 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; public class TestArrayAccess01 extends XTestArray01{ diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java index 5442121b..4e81b7d9 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess02Creator.java @@ -15,22 +15,22 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.InstructionConst; -import org.apache.commons.bcel6.generic.InstructionFactory; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.PUSH; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.Const; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionConst; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.Type; import org.junit.Assert; public class TestArrayAccess02Creator extends TestCreator { diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java index d9cae0b8..2a7ebce9 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess03Creator.java @@ -15,22 +15,22 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.InstructionConst; -import org.apache.commons.bcel6.generic.InstructionFactory; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.ObjectType; -import org.apache.commons.bcel6.generic.PUSH; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.Const; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionConst; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.ObjectType; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.Type; import org.junit.Assert; public class TestArrayAccess03Creator extends TestCreator { diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java index d4c2bf8b..54709327 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess04Creator.java @@ -16,21 +16,21 @@ * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.InstructionConst; -import org.apache.commons.bcel6.generic.InstructionFactory; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.PUSH; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.Const; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionConst; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.PUSH; +import org.apache.bcel.generic.Type; import org.junit.Assert; public class TestArrayAccess04Creator extends TestCreator { diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java b/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java index 1ae14722..c09dfba1 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java @@ -1,4 +1,4 @@ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; import java.io.File; import java.io.FileOutputStream; diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java index 784ab213..daf38fdc 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; public class TestLegalInvokeInterface01{ diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java index df428a75..c0f3a374 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; public class TestLegalInvokeSpecial01{ diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java index 346f762a..3e610604 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; public abstract class TestLegalInvokeSpecial02 implements Runnable{ diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java index 927d8867..cfae71cc 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeStatic01.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; public class TestLegalInvokeStatic01 extends Thread{ diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java index a94066e2..6e0f85e2 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; public class TestLegalInvokeVirtual01 { diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java index b5a579ba..bd12854b 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; public abstract class TestLegalInvokeVirtual02 implements Runnable{ diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java index a2764d6e..96843336 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestReturn01Creator.java @@ -15,20 +15,20 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.InstructionConst; -import org.apache.commons.bcel6.generic.InstructionFactory; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.Const; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionConst; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.Type; import org.junit.Assert; public class TestReturn01Creator extends TestCreator { diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java b/src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java index 0e44e3bd..cba5662e 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java @@ -15,7 +15,7 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; public class TestReturn02 { diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java b/src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java index 7e500d19..bea20f27 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestReturn03Creator.java @@ -15,20 +15,20 @@ * limitations under the License. * */ -package org.apache.commons.bcel6.verifier.tests; +package org.apache.bcel.verifier.tests; import java.io.IOException; import java.io.OutputStream; -import org.apache.commons.bcel6.Const; -import org.apache.commons.bcel6.generic.ClassGen; -import org.apache.commons.bcel6.generic.ConstantPoolGen; -import org.apache.commons.bcel6.generic.InstructionConst; -import org.apache.commons.bcel6.generic.InstructionFactory; -import org.apache.commons.bcel6.generic.InstructionHandle; -import org.apache.commons.bcel6.generic.InstructionList; -import org.apache.commons.bcel6.generic.MethodGen; -import org.apache.commons.bcel6.generic.Type; +import org.apache.bcel.Const; +import org.apache.bcel.generic.ClassGen; +import org.apache.bcel.generic.ConstantPoolGen; +import org.apache.bcel.generic.InstructionConst; +import org.apache.bcel.generic.InstructionFactory; +import org.apache.bcel.generic.InstructionHandle; +import org.apache.bcel.generic.InstructionList; +import org.apache.bcel.generic.MethodGen; +import org.apache.bcel.generic.Type; import org.junit.Assert; public class TestReturn03Creator extends TestCreator { diff --git a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java index cd578538..8e743823 100644 --- a/src/test/java/org/apache/bcel/visitors/CounterVisitor.java +++ b/src/test/java/org/apache/bcel/visitors/CounterVisitor.java @@ -16,53 +16,53 @@ * */ -package org.apache.commons.bcel6.visitors; - -import org.apache.commons.bcel6.classfile.AnnotationDefault; -import org.apache.commons.bcel6.classfile.AnnotationEntry; -import org.apache.commons.bcel6.classfile.Annotations; -import org.apache.commons.bcel6.classfile.BootstrapMethods; -import org.apache.commons.bcel6.classfile.Code; -import org.apache.commons.bcel6.classfile.CodeException; -import org.apache.commons.bcel6.classfile.ConstantClass; -import org.apache.commons.bcel6.classfile.ConstantDouble; -import org.apache.commons.bcel6.classfile.ConstantFieldref; -import org.apache.commons.bcel6.classfile.ConstantFloat; -import org.apache.commons.bcel6.classfile.ConstantInteger; -import org.apache.commons.bcel6.classfile.ConstantInterfaceMethodref; -import org.apache.commons.bcel6.classfile.ConstantInvokeDynamic; -import org.apache.commons.bcel6.classfile.ConstantLong; -import org.apache.commons.bcel6.classfile.ConstantMethodHandle; -import org.apache.commons.bcel6.classfile.ConstantMethodType; -import org.apache.commons.bcel6.classfile.ConstantMethodref; -import org.apache.commons.bcel6.classfile.ConstantNameAndType; -import org.apache.commons.bcel6.classfile.ConstantPool; -import org.apache.commons.bcel6.classfile.ConstantString; -import org.apache.commons.bcel6.classfile.ConstantUtf8; -import org.apache.commons.bcel6.classfile.ConstantValue; -import org.apache.commons.bcel6.classfile.Deprecated; -import org.apache.commons.bcel6.classfile.EnclosingMethod; -import org.apache.commons.bcel6.classfile.ExceptionTable; -import org.apache.commons.bcel6.classfile.Field; -import org.apache.commons.bcel6.classfile.InnerClass; -import org.apache.commons.bcel6.classfile.InnerClasses; -import org.apache.commons.bcel6.classfile.JavaClass; -import org.apache.commons.bcel6.classfile.LineNumber; -import org.apache.commons.bcel6.classfile.LineNumberTable; -import org.apache.commons.bcel6.classfile.LocalVariable; -import org.apache.commons.bcel6.classfile.LocalVariableTable; -import org.apache.commons.bcel6.classfile.LocalVariableTypeTable; -import org.apache.commons.bcel6.classfile.Method; -import org.apache.commons.bcel6.classfile.MethodParameters; -import org.apache.commons.bcel6.classfile.ParameterAnnotationEntry; -import org.apache.commons.bcel6.classfile.ParameterAnnotations; -import org.apache.commons.bcel6.classfile.Signature; -import org.apache.commons.bcel6.classfile.SourceFile; -import org.apache.commons.bcel6.classfile.StackMap; -import org.apache.commons.bcel6.classfile.StackMapEntry; -import org.apache.commons.bcel6.classfile.Synthetic; -import org.apache.commons.bcel6.classfile.Unknown; -import org.apache.commons.bcel6.classfile.Visitor; +package org.apache.bcel.visitors; + +import org.apache.bcel.classfile.AnnotationDefault; +import org.apache.bcel.classfile.AnnotationEntry; +import org.apache.bcel.classfile.Annotations; +import org.apache.bcel.classfile.BootstrapMethods; +import org.apache.bcel.classfile.Code; +import org.apache.bcel.classfile.CodeException; +import org.apache.bcel.classfile.ConstantClass; +import org.apache.bcel.classfile.ConstantDouble; +import org.apache.bcel.classfile.ConstantFieldref; +import org.apache.bcel.classfile.ConstantFloat; +import org.apache.bcel.classfile.ConstantInteger; +import org.apache.bcel.classfile.ConstantInterfaceMethodref; +import org.apache.bcel.classfile.ConstantInvokeDynamic; +import org.apache.bcel.classfile.ConstantLong; +import org.apache.bcel.classfile.ConstantMethodHandle; +import org.apache.bcel.classfile.ConstantMethodType; +import org.apache.bcel.classfile.ConstantMethodref; +import org.apache.bcel.classfile.ConstantNameAndType; +import org.apache.bcel.classfile.ConstantPool; +import org.apache.bcel.classfile.ConstantString; +import org.apache.bcel.classfile.ConstantUtf8; +import org.apache.bcel.classfile.ConstantValue; +import org.apache.bcel.classfile.Deprecated; +import org.apache.bcel.classfile.EnclosingMethod; +import org.apache.bcel.classfile.ExceptionTable; +import org.apache.bcel.classfile.Field; +import org.apache.bcel.classfile.InnerClass; +import org.apache.bcel.classfile.InnerClasses; +import org.apache.bcel.classfile.JavaClass; +import org.apache.bcel.classfile.LineNumber; +import org.apache.bcel.classfile.LineNumberTable; +import org.apache.bcel.classfile.LocalVariable; +import org.apache.bcel.classfile.LocalVariableTable; +import org.apache.bcel.classfile.LocalVariableTypeTable; +import org.apache.bcel.classfile.Method; +import org.apache.bcel.classfile.MethodParameters; +import org.apache.bcel.classfile.ParameterAnnotationEntry; +import org.apache.bcel.classfile.ParameterAnnotations; +import org.apache.bcel.classfile.Signature; +import org.apache.bcel.classfile.SourceFile; +import org.apache.bcel.classfile.StackMap; +import org.apache.bcel.classfile.StackMapEntry; +import org.apache.bcel.classfile.Synthetic; +import org.apache.bcel.classfile.Unknown; +import org.apache.bcel.classfile.Visitor; public class CounterVisitor implements Visitor { -- GitLab From f6ebd74c348d099d3e3ebb56ec19b1393c1bcb14 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 7 Jun 2016 17:54:54 +0000 Subject: [PATCH 1129/1313] Specify version git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747285 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 7d6b2ea8..e07a099d 100644 --- a/pom.xml +++ b/pom.xml @@ -471,6 +471,7 @@ org.codehaus.mojo exec-maven-plugin + 1.4.0 benchmark -- GitLab From bf5bb7d677e0b1c11292717262a351cba5edebb6 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 7 Jun 2016 17:58:55 +0000 Subject: [PATCH 1130/1313] Stop Maven complaining about missing versions git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747287 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index e07a099d..139a1182 100644 --- a/pom.xml +++ b/pom.xml @@ -406,6 +406,7 @@ maven-surefire-plugin + ${commons.surefire.version} **/PerformanceTest.java @@ -460,6 +461,7 @@ maven-compiler-plugin + ${commons.compiler.version} **/* -- GitLab From 3643e772cd3a70241d06a97450bb6860900ef023 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Tue, 7 Jun 2016 18:31:37 +0000 Subject: [PATCH 1131/1313] Only deactivate DocLint on JDK 8+ git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747292 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 139a1182..e8fc8f4c 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,6 @@ 2.17 2.6.1 - -Xdoclint:none @@ -501,6 +500,16 @@ + + + jdk8-javadoc + + [1.8,) + + + -Xdoclint:none + + -- GitLab From 9774f1ed50ba0115be58becffe4fae1da1b234e8 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Tue, 7 Jun 2016 18:41:39 +0000 Subject: [PATCH 1132/1313] Finalize package rename by fixing documentation git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747293 13f79535-47bb-0310-9956-ffa450edef68 --- README.txt | 6 +++--- pom.xml | 2 +- src/site/xdoc/faq.xml | 4 ++-- src/site/xdoc/manual.xml | 14 +++++++------- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.txt b/README.txt index 8e75e545..367bcad2 100644 --- a/README.txt +++ b/README.txt @@ -1,12 +1,12 @@ Running a console based verifier - java org.apache.commons.bcel6.verifier.Verifier fully.qualified.class.Name + java org.apache.bcel.verifier.Verifier fully.qualified.class.Name lets JustIce work standalone. If you get a "java.lang.OutOfMemoryError", you should increase the maximum Java heap space. A command like - java -Xmx1887436800 org.apache.commons.bcel6.verifier.Verifier f.q.c.Name + java -Xmx1887436800 org.apache.bcel.verifier.Verifier f.q.c.Name will usually resolve the problem. The value above is suitable for big server machines; if your machine starts swapping to disk, try @@ -18,7 +18,7 @@ Running a graphics based verifier If you prefer a graphical application, you should use a command like - java org.apache.commons.bcel6.verifier.GraphicalVerifier + java org.apache.bcel.verifier.GraphicalVerifier to launch one. Again, you may have to resolve a memory issue depending on the classes to verify. diff --git a/pom.xml b/pom.xml index e8fc8f4c..9ed6c137 100644 --- a/pom.xml +++ b/pom.xml @@ -48,7 +48,7 @@ https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-bcel org.apache.${commons.componentid} - org.apache.commons.bcel6.*;version=${project.version};-noimport:=true + org.apache.bcel.*;version=${project.version};-noimport:=true * diff --git a/src/site/xdoc/faq.xml b/src/site/xdoc/faq.xml index 9522fecf..4c071d11 100644 --- a/src/site/xdoc/faq.xml +++ b/src/site/xdoc/faq.xml @@ -31,7 +31,7 @@ Q: How can I ... with BCEL?
    A: Take a look at - org.apache.commons.bcel6.util.BCELifier, it takes a given class + org.apache.bcel.util.BCELifier, it takes a given class and converts it to a BCEL program (in Java, of course). It will show you how certain code is generated using BCEL.

    @@ -85,7 +85,7 @@ A: Use the JustIce verifier that comes together with BCEL to get more detailed information:
    -       java org.apache.commons.bcel6.verifier.Verifier <your class>
    + java org.apache.bcel.verifier.Verifier <your class>

    diff --git a/src/site/xdoc/manual.xml b/src/site/xdoc/manual.xml index 463eb9e6..d9ab982d 100644 --- a/src/site/xdoc/manual.xml +++ b/src/site/xdoc/manual.xml @@ -623,7 +623,7 @@

    The "static" component of the BCEL API resides in the package - org.apache.commons.bcel6.classfile and closely represents class + org.apache.bcel.classfile and closely represents class files. All of the binary components and data structures declared in the JVM @@ -751,7 +751,7 @@

    - This part of the API (package org.apache.commons.bcel6.generic) + This part of the API (package org.apache.bcel.generic) supplies an abstraction level for creating or transforming class files dynamically. It makes the static constraints of Java class files like the hard-coded byte code addresses "generic". The @@ -1095,7 +1095,7 @@

    The search() method of class - org.apache.commons.bcel6.util.InstructionFinder gets a regular + org.apache.bcel.util.InstructionFinder gets a regular expression and a starting point as arguments and returns an iterator describing the area of matched instructions. Additional constraints to the matching area of instructions, which can not be @@ -1577,10 +1577,10 @@ symbolic type signature encoded with Type objects. import java.io.*; import java.util.Iterator; -import org.apache.commons.bcel6.classfile.*; -import org.apache.commons.bcel6.generic.*; -import org.apache.commons.bcel6.Repository; -import org.apache.commons.bcel6.util.InstructionFinder; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.Repository; +import org.apache.bcel.util.InstructionFinder; public class Peephole { -- GitLab From 3fb2586d98da0c06d3ef02ba8cd022bb87fba832 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Tue, 7 Jun 2016 18:44:26 +0000 Subject: [PATCH 1133/1313] Add markdown files for GitHub contributors git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747294 13f79535-47bb-0310-9956-ffa450edef68 --- CONTRIBUTING.md | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 98 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 README.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..912ae221 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,97 @@ + + +Contributing to Apache Commons BCEL +====================== + +You have found a bug or you have an idea for a cool new feature? Contributing code is a great way to give something back to +the open source community. Before you dig right into the code there are a few guidelines that we need contributors to +follow so that we can have a chance of keeping on top of things. + +Getting Started +--------------- + ++ Make sure you have a [JIRA account](https://issues.apache.org/jira/). ++ Make sure you have a [GitHub account](https://github.com/signup/free). ++ If you're planning to implement a new feature it makes sense to discuss you're changes on the [dev list](https://commons.apache.org/mail-lists.html) first. This way you can make sure you're not wasting your time on something that isn't considered to be in Apache Commons BCEL's scope. ++ Submit a ticket for your issue, assuming one does not already exist. + + Clearly describe the issue including steps to reproduce when it is a bug. + + Make sure you fill in the earliest version that you know has the issue. ++ Fork the repository on GitHub. + +Making Changes +-------------- + ++ Create a topic branch from where you want to base your work (this is usually the master/trunk branch). ++ Make commits of logical units. ++ Respect the original code style: + + Only use spaces for indentation. + + Create minimal diffs - disable on save actions like reformat source code or organize imports. If you feel the source code should be reformatted create a separate PR for this change. + + Check for unnecessary whitespace with git diff --check before committing. ++ Make sure your commit messages are in the proper format. Your commit message should contain the key of the JIRA issue. ++ Make sure you have added the necessary tests for your changes. ++ Run all the tests with `mvn clean verify` to assure nothing else was accidentally broken. + +Making Trivial Changes +---------------------- + +For changes of a trivial nature to comments and documentation, it is not always necessary to create a new ticket in JIRA. +In this case, it is appropriate to start the first line of a commit with '(doc)' instead of a ticket number. + +Submitting Changes +------------------ + ++ Sign the [Contributor License Agreement][cla] if you haven't already. ++ Push your changes to a topic branch in your fork of the repository. ++ Submit a pull request to the repository in the apache organization. ++ Update your JIRA ticket and include a link to the pull request in the ticket. + +Additional Resources +-------------------- + ++ [Contributing patches](https://commons.apache.org/patches.html) ++ [Apache Commons BCEL JIRA project page](https://issues.apache.org/jira/browse/BCEL) ++ [Contributor License Agreement][cla] ++ [General GitHub documentation](https://help.github.com/) ++ [GitHub pull request documentation](https://help.github.com/send-pull-requests/) ++ [Apache Commons Twitter Account](https://twitter.com/ApacheCommons) ++ #apachecommons IRC channel on freenode.org + +[cla]:https://www.apache.org/licenses/#clas diff --git a/README.md b/README.md new file mode 100644 index 00000000..99aa3efa --- /dev/null +++ b/README.md @@ -0,0 +1,98 @@ + + +Apache Commons BCEL +=================== + +Apache Commons Bytecode Engineering Library + +Documentation +------------- + +More information can be found on the [homepage](https://commons.apache.org/proper/commons-bcel). +The [JavaDoc](https://commons.apache.org/proper/commons-bcel/javadocs/api-release) can be browsed. +Questions related to the usage of Apache Commons BCEL should be posted to the [user mailing list][ml]. + +Where can I get the latest release? +----------------------------------- +You can download source and binaries from our [download page](https://commons.apache.org/proper/commons-bcel/download_bcel.cgi). + +Alternatively you can pull it from the central Maven repositories: + +```xml + + org.apache.bcel + bcel + 5.2 + +``` + +Contributing +------------ + +We accept PRs via github. The [developer mailing list][ml] is the main channel of communication for contributors. +There are some guidelines which will make applying PRs easier for us: ++ No tabs! Please use spaces for indentation. ++ Respect the code style. ++ Create minimal diffs - disable on save actions like reformat source code or organize imports. If you feel the source code should be reformatted create a separate PR for this change. ++ Provide JUnit tests for your changes and make sure your changes don't break any existing tests by running ```mvn clean test```. + +If you plan to contribute on a regular basis, please consider filing a [contributor license agreement](https://www.apache.org/licenses/#clas). +You can learn more about contributing via GitHub in our [contribution guidelines](CONTRIBUTING.md). + +License +------- +Code is under the [Apache Licence v2](https://www.apache.org/licenses/LICENSE-2.0.txt). + +Donations +--------- +You like Apache Commons BCEL? Then [donate back to the ASF](https://www.apache.org/foundation/contributing.html) to support the development. + +Additional Resources +-------------------- + ++ [Apache Commons Homepage](https://commons.apache.org/) ++ [Apache Bugtracker (JIRA)](https://issues.apache.org/jira/) ++ [Apache Commons Twitter Account](https://twitter.com/ApacheCommons) ++ #apachecommons IRC channel on freenode.org + +[ml]:https://commons.apache.org/mail-lists.html -- GitLab From d1c6180d61e4045bca18c1c9f6ea32a94ee8a3fd Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Tue, 7 Jun 2016 18:55:29 +0000 Subject: [PATCH 1134/1313] Take inspiration from Commons Lang for BCEL homepage git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747299 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/index.xml | 126 +++++++++++++++++++++++++++++----------- 1 file changed, 92 insertions(+), 34 deletions(-) diff --git a/src/site/xdoc/index.xml b/src/site/xdoc/index.xml index 46c49584..982d20a9 100644 --- a/src/site/xdoc/index.xml +++ b/src/site/xdoc/index.xml @@ -19,43 +19,101 @@ --> - + + Home + Commons Documentation Team + -

    -

    - The Byte Code Engineering Library (Apache Commons BCEL™) is intended to give users a - convenient way to analyze, create, and manipulate (binary) - Java class files (those ending with .class). Classes are - represented by objects which contain all the symbolic information - of the given class: methods, fields and byte code instructions, in - particular. -

    - -

    - Such objects can be read from an existing file, be transformed - by a program (e.g. a class loader at run-time) and written to a file again. - An even more interesting application is the creation of classes from scratch - at run-time. The Byte Code Engineering Library (BCEL) may be also useful - if you want to learn about the Java Virtual Machine (JVM) and the format of - Java .class files. -

    - -

    - BCEL contains a byte code verifier named JustIce, which usually - gives you much better information about what's wrong with your - code than the standard JVM message. -

    +
    +

    + The Byte Code Engineering Library (Apache Commons BCEL™) is intended to give users a + convenient way to analyze, create, and manipulate (binary) + Java class files (those ending with .class). Classes are + represented by objects which contain all the symbolic information + of the given class: methods, fields and byte code instructions, in + particular. +

    + +

    + Such objects can be read from an existing file, be transformed + by a program (e.g. a class loader at run-time) and written to a file again. + An even more interesting application is the creation of classes from scratch + at run-time. The Byte Code Engineering Library (BCEL) may be also useful + if you want to learn about the Java Virtual Machine (JVM) and the format of + Java .class files. +

    + +

    + BCEL contains a byte code verifier named JustIce, which usually + gives you much better information about what's wrong with your + code than the standard JVM message. +

    + +

    + BCEL is already being used successfully in several projects such + as compilers, optimizers, obsfuscators, code generators + and analysis tools. Unfortunately there hasn't been much development + going on over the past few years. Feel free to help out or you + might want to have a look into the ASM project at objectweb. +

    +
    -

    - BCEL is already being used successfully in several projects such - as compilers, optimizers, obsfuscators, code generators - and analysis tools. Unfortunately there hasn't been much development - going on over the past few years. Feel free to help out or you - might want to have a look into the ASM project at objectweb. -

    +
    +

    + The package descriptions in the JavaDoc give an overview of the available features + and various project reports are provided. +

    +

    + The JavaDoc API documents are available online: +

    + +

    + The svn repository can be + browsed, or you can browse/contribute via GitHub. +

    +
    + +
    +

    The latest stable release of BCEL is 5.2. You may:

    + +

    + Alternatively you can pull it from the central Maven repositories: +

    +          <groupId>org.apache.bcel</groupId>
    +          <artifactId>bcel</artifactId>
    +          <version>5.2</version>
    +        
    +

    -
    - +
    + +
    +

    + The commons developer mailing list is the main channel of communication for contributors. Please remember that the lists are shared between all commons components, so prefix your email by [lang].

    +

    You can also visit the #apache-commons IRC channel on irc.freenode.net or peruse JIRA. +

    Alternatively you can go through the Needs Work tags in the TagList report.

    +

    If you'd like to offer up pull requests via GitHub rather than applying patches to JIRA, we have a GitHub mirror.

    +
    + +
    +

    + The commons mailing lists act as the main support forum. + The user list is suitable for most library usage queries. + The dev list is intended for the development discussion. + Please remember that the lists are shared between all commons components, + so prefix your email by [BCEL]. +

    +

    + Bug reports and enhancements are also welcomed via the JIRA issue tracker. + Please read the instructions carefully. +

    +
    -- GitLab From bbdce6299950eed1a98572e7d5ec568ef7812ad0 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Tue, 7 Jun 2016 19:01:12 +0000 Subject: [PATCH 1135/1313] Add missing closing p tag git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747303 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/index.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/site/xdoc/index.xml b/src/site/xdoc/index.xml index 982d20a9..0bd79ccd 100644 --- a/src/site/xdoc/index.xml +++ b/src/site/xdoc/index.xml @@ -97,7 +97,7 @@

    The commons developer mailing list is the main channel of communication for contributors. Please remember that the lists are shared between all commons components, so prefix your email by [lang].

    -

    You can also visit the #apache-commons IRC channel on irc.freenode.net or peruse JIRA. +

    You can also visit the #apache-commons IRC channel on irc.freenode.net or peruse JIRA.

    Alternatively you can go through the Needs Work tags in the TagList report.

    If you'd like to offer up pull requests via GitHub rather than applying patches to JIRA, we have a GitHub mirror.

    -- GitLab From c2d5b874a0ce05b41eaccb4c75915adf4a80f8da Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 7 Jun 2016 22:20:25 +0000 Subject: [PATCH 1136/1313] Unused git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747322 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/InvokeInstruction.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index cd6923d7..56a396b1 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -21,7 +21,6 @@ import java.util.StringTokenizer; import org.apache.bcel.Const; import org.apache.bcel.classfile.Constant; -import org.apache.bcel.classfile.ConstantCP; import org.apache.bcel.classfile.ConstantPool; /** -- GitLab From 100cf21e5b877d160eefebdbe109b331427aff3f Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 7 Jun 2016 22:22:32 +0000 Subject: [PATCH 1137/1313] Findbugs fixes courtesy of Andrey Loskutov This closes #4 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747323 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/classfile/ClassParser.java | 10 +++++++--- src/main/java/org/apache/bcel/classfile/Utility.java | 3 +-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 123d5059..923f1235 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -174,13 +174,17 @@ public final class ClassParser { if (dataInputStream != null) { dataInputStream.close(); } - if (zip != null) { - zip.close(); - } } catch (IOException ioe) { //ignore close exceptions } } + try { + if (zip != null) { + zip.close(); + } + } catch (IOException ioe) { + //ignore close exceptions + } } // Return the information we have gathered in a new object return new JavaClass(class_name_index, superclass_name_index, file_name, major, minor, diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index f8f97405..11f34e20 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -442,8 +442,7 @@ public abstract class Utility { buf.append(bytes.readInt()); break; default: // Never reached - System.err.println("Unreachable default case reached!"); - System.exit(-1); + throw new IllegalStateException("Unreachable default case reached!"); } } } -- GitLab From 227008cff233f9424ab37044b2c0d7b2d178c330 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 7 Jun 2016 22:46:38 +0000 Subject: [PATCH 1138/1313] Fix ignored test case by canonicalising the javap output git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747324 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/util/BCELifierTestCase.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java index ee8f4266..8524d9a8 100644 --- a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java +++ b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java @@ -29,7 +29,6 @@ public class BCELifierTestCase { * TODO: detect if JDK present and skip test if not */ @Test - @org.junit.Ignore // does not work properly on some systems. Also the output is rather different public void testJavapCompare() throws Exception { testClassOnPath("target/test-classes/Java8Example.class"); } @@ -50,7 +49,15 @@ public class BCELifierTestCase { exec(workDir, "javac", "-cp", "classes", outfile.getName()); exec(workDir, "java", "-cp", ".:classes", outfile.getName().replace(".java", "")); final String output = exec(workDir, "javap", "-p", "-c", infile.getName()); - assertEquals(initial, output); + assertEquals(canonHashRef(initial), canonHashRef(output)); + } + + // Canonicalise the javap output so it compares better + private String canonHashRef(String input) { + input = input.replaceAll("#\\d+", "#n"); // numbers may vary in length + input = input.replaceAll(" +", " "); // collapse spaces + input = input.replaceAll("//.+",""); // comments may vary + return input; } private String exec(final File workDir, final String ... args) throws Exception { -- GitLab From 452b5e69e4bef3adc664622b93fafb9e8889a313 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Wed, 8 Jun 2016 09:51:09 +0000 Subject: [PATCH 1139/1313] Initial gitignore file. This closes #5 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747367 13f79535-47bb-0310-9956-ffa450edef68 --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..89297567 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/.externalToolBuilders/ +/.settings/ +/bin/ +/target/ +/.classpath +/.project +/maven-eclipse.xml -- GitLab From 4b46a1595c4c8688644549b3cd762819f4ccfac0 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Fri, 10 Jun 2016 12:07:25 +0000 Subject: [PATCH 1140/1313] BCEL-273 - Regressions running FindBugs on BCEL6 Reverted to previous code; added comments git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747689 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/generic/BranchHandle.java | 26 ++++++++++--------- .../bcel/generic/InstructionHandle.java | 6 +++++ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/BranchHandle.java b/src/main/java/org/apache/bcel/generic/BranchHandle.java index 03b1df19..ba942c9d 100644 --- a/src/main/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/main/java/org/apache/bcel/generic/BranchHandle.java @@ -30,8 +30,14 @@ package org.apache.bcel.generic; */ public final class BranchHandle extends InstructionHandle { + // This is also a cache in case the InstructionHandle#swapInstruction() method is used + // See BCEL-273 + private BranchInstruction bi; // An alias in fact, but saves lots of casts + + private BranchHandle(final BranchInstruction i) { super(i); + bi = i; } /** Factory methods. @@ -58,11 +64,6 @@ public final class BranchHandle extends InstructionHandle { bh_list = this; } - // get the instruction as a BranchInstruction - // (do the cast once) - private BranchInstruction getBI() { - return (BranchInstruction) super.getInstruction(); - } /* Override InstructionHandle methods: delegate to branch instruction. * Through this overriding all access to the private i_position field should @@ -70,22 +71,22 @@ public final class BranchHandle extends InstructionHandle { */ @Override public int getPosition() { - return getBI().getPosition(); + return bi.getPosition(); } @Override void setPosition( final int pos ) { // Original code: i_position = bi.position = pos; - getBI().setPosition(pos); + bi.setPosition(pos); super.setPosition(pos); } @Override protected int updatePosition( final int offset, final int max_offset ) { - int x = getBI().updatePosition(offset, max_offset); - super.setPosition(getBI().getPosition()); + int x = bi.updatePosition(offset, max_offset); + super.setPosition(bi.getPosition()); return x; } @@ -94,7 +95,7 @@ public final class BranchHandle extends InstructionHandle { * Pass new target to instruction. */ public void setTarget( final InstructionHandle ih ) { - getBI().setTarget(ih); + bi.setTarget(ih); } @@ -102,7 +103,7 @@ public final class BranchHandle extends InstructionHandle { * Update target of instruction. */ public void updateTarget( final InstructionHandle old_ih, final InstructionHandle new_ih ) { - getBI().updateTarget(old_ih, new_ih); + bi.updateTarget(old_ih, new_ih); } @@ -110,7 +111,7 @@ public final class BranchHandle extends InstructionHandle { * @return target of instruction. */ public InstructionHandle getTarget() { - return getBI().getTarget(); + return bi.getTarget(); } @@ -124,5 +125,6 @@ public final class BranchHandle extends InstructionHandle { throw new ClassGenException("Assigning " + i + " to branch handle which is not a branch instruction"); } + bi = (BranchInstruction) i; } } diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java index a929ea73..490b0ff1 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/main/java/org/apache/bcel/generic/InstructionHandle.java @@ -95,7 +95,13 @@ public class InstructionHandle { * Temporarily swap the current instruction, without disturbing * anything. Meant to be used by a debugger, implementing * breakpoints. Current instruction is returned. + *

    + * Warning: if this is used on a BranchHandle then some methods such as + * getPosition() will still refer to the original cached instruction, whereas + * other BH methods may affect the cache and the replacement instruction. */ + // See BCEL-273 + // TODO remove this method in any redesign of BCEL public Instruction swapInstruction( final Instruction i ) { Instruction oldInstruction = instruction; instruction = i; -- GitLab From d3bef0558d47861d85ebee02bfbbe09d67a60c3c Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 10 Jun 2016 23:16:37 +0000 Subject: [PATCH 1141/1313] Redundant super-interface Repository for the type SyntheticRepository, already defined by MemorySensitiveClassPathRepository. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747812 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/SyntheticRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index 79b10498..6ccae281 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -30,7 +30,7 @@ import java.util.Map; * * @version $Id$ */ -public class SyntheticRepository extends MemorySensitiveClassPathRepository implements Repository { +public class SyntheticRepository extends MemorySensitiveClassPathRepository { // private static final String DEFAULT_PATH = ClassPath.getClassPath(); private static final Map _instances = new HashMap<>(); // CLASSPATH X REPOSITORY -- GitLab From 475e02f6b0f0e7b650b44929b19cf6d5812ad2de Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 10 Jun 2016 23:28:29 +0000 Subject: [PATCH 1142/1313] Fix test to run on Windows AND Linux. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747813 13f79535-47bb-0310-9956-ffa450edef68 --- src/test/java/org/apache/bcel/util/BCELifierTestCase.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java index 8524d9a8..2132c908 100644 --- a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java +++ b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java @@ -41,13 +41,13 @@ public class BCELifierTestCase { File infile = new File(javaClass); JavaClass java_class = BCELifier.getJavaClass(infile.getName().replace(".class", "")); assertNotNull(java_class); - File outfile = new File(workDir,infile.getName().replace(".class", "Creator.java")); + File outfile = new File(workDir, infile.getName().replace(".class", "Creator.java")); FileOutputStream fos = new FileOutputStream(outfile); BCELifier bcelifier = new BCELifier(java_class, fos); bcelifier.start(); fos.close(); exec(workDir, "javac", "-cp", "classes", outfile.getName()); - exec(workDir, "java", "-cp", ".:classes", outfile.getName().replace(".java", "")); + exec(workDir, "java", "-cp", "." + File.pathSeparator + "classes", outfile.getName().replace(".java", "")); final String output = exec(workDir, "javap", "-p", "-c", infile.getName()); assertEquals(canonHashRef(initial), canonHashRef(output)); } -- GitLab From b5981e07909d4d1626d6f0ca359d3124c932cd60 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 11 Jun 2016 01:22:51 +0000 Subject: [PATCH 1143/1313] Use exception to report the stacktrace etc git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747832 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Utility.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 11f34e20..e37ad35e 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -160,9 +160,7 @@ public abstract class Utility { } } } catch (IOException e) { - System.out.println(buf.toString()); - e.printStackTrace(); - throw new ClassFormatException("Byte code error: " + e, e); + throw new ClassFormatException("Byte code error: " + buf.toString(), e); } return buf.toString(); } @@ -442,7 +440,7 @@ public abstract class Utility { buf.append(bytes.readInt()); break; default: // Never reached - throw new IllegalStateException("Unreachable default case reached!"); + throw new IllegalStateException("Unreachable default case reached!"); } } } -- GitLab From 28d77b5a7dbe357d3a5a6d2e0688ffa2ccb7cb75 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 11 Jun 2016 01:28:14 +0000 Subject: [PATCH 1144/1313] Allow slightly longer lines now every parameter is final git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1747833 13f79535-47bb-0310-9956-ffa450edef68 --- checkstyle.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/checkstyle.xml b/checkstyle.xml index e5280c2f..c36fe6c4 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -57,7 +57,7 @@ limitations under the License. - + -- GitLab From 20a1b9578effdc68ea07870f49e4e93289d86e1c Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:15:27 +0000 Subject: [PATCH 1145/1313] Use try-with-resources. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748099 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/generic/InstructionList.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index f4fda14a..97973926 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -153,14 +153,15 @@ public class InstructionList implements Iterable { * byte array containing the instructions */ public InstructionList(final byte[] code) { - ByteSequence bytes = new ByteSequence(code); - InstructionHandle[] ihs = new InstructionHandle[code.length]; - int[] pos = new int[code.length]; // Can't be more than that int count = 0; // Contains actual length - /* - * Pass 1: Create an object for each byte code and append them to the list. - */ - try { + int[] pos; + InstructionHandle[] ihs; + try (ByteSequence bytes = new ByteSequence(code)) { + ihs = new InstructionHandle[code.length]; + pos = new int[code.length]; // Can't be more than that + /* + * Pass 1: Create an object for each byte code and append them to the list. + */ while (bytes.available() > 0) { // Remember byte offset and associate it with the instruction int off = bytes.getIndex(); @@ -952,9 +953,8 @@ public class InstructionList implements Iterable { * @return an array of instructions without target information for branch instructions. */ public Instruction[] getInstructions() { - ByteSequence bytes = new ByteSequence(getByteCode()); List instructions = new ArrayList<>(); - try { + try (ByteSequence bytes = new ByteSequence(getByteCode())) { while (bytes.available() > 0) { instructions.add(Instruction.readInstruction(bytes)); } -- GitLab From 06827d11a7bddc7a02f2804618219b862f63ecdd Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:21:31 +0000 Subject: [PATCH 1146/1313] Use try-with-resources. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748102 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Utility.java | 16 +++--- .../java/org/apache/bcel/util/CodeHTML.java | 49 +++++++++---------- 2 files changed, 31 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index e37ad35e..3de9ffdd 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -147,16 +147,14 @@ public abstract class Utility { public static String codeToString( final byte[] code, final ConstantPool constant_pool, final int index, final int length, final boolean verbose ) { StringBuilder buf = new StringBuilder(code.length * 20); // Should be sufficient // CHECKSTYLE IGNORE MagicNumber - ByteSequence stream = new ByteSequence(code); - try { + try (ByteSequence stream = new ByteSequence(code)) { for (int i = 0; i < index; i++) { codeToString(stream, constant_pool, verbose); } for (int i = 0; stream.available() > 0; i++) { if ((length < 0) || (i < length)) { String indices = fillup(stream.getIndex() + ":", 6, true, ' '); - buf.append(indices).append(codeToString(stream, constant_pool, verbose)) - .append('\n'); + buf.append(indices).append(codeToString(stream, constant_pool, verbose)).append('\n'); } } } catch (IOException e) { @@ -1276,12 +1274,12 @@ public abstract class Utility { bytes = baos.toByteArray(); } CharArrayWriter caw = new CharArrayWriter(); - JavaWriter jw = new JavaWriter(caw); - for (byte b : bytes) { - int in = b & 0x000000ff; // Normalize to unsigned - jw.write(in); + try (JavaWriter jw = new JavaWriter(caw)) { + for (byte b : bytes) { + int in = b & 0x000000ff; // Normalize to unsigned + jw.write(in); + } } - jw.close(); return caw.toString(); } diff --git a/src/main/java/org/apache/bcel/util/CodeHTML.java b/src/main/java/org/apache/bcel/util/CodeHTML.java index 6b119742..32f16dfe 100644 --- a/src/main/java/org/apache/bcel/util/CodeHTML.java +++ b/src/main/java/org/apache/bcel/util/CodeHTML.java @@ -549,32 +549,31 @@ final class CodeHTML { if (code != null) { // No code, an abstract method, e.g. //System.out.println(name + "\n" + Utility.codeToString(code, constant_pool, 0, -1)); // Print the byte code - ByteSequence stream = new ByteSequence(code); - stream.mark(stream.available()); - findGotos(stream, c); - stream.reset(); - file.println("" - + ""); - for (; stream.available() > 0;) { - int offset = stream.getIndex(); - String str = codeToHTML(stream, method_number); - String anchor = ""; - /* Set an anchor mark if this line is targetted by a goto, jsr, etc. - * Defining an anchor for every line is very inefficient! - */ - if (goto_set.get(offset)) { - anchor = ""; - } - String anchor2; - if (stream.getIndex() == code.length) { - anchor2 = "" + offset - + ""; - } else { - anchor2 = "" + offset; + try (ByteSequence stream = new ByteSequence(code)) { + stream.mark(stream.available()); + findGotos(stream, c); + stream.reset(); + file.println("
    Byte
    offset
    InstructionArgument
    " + + ""); + for (; stream.available() > 0;) { + int offset = stream.getIndex(); + String str = codeToHTML(stream, method_number); + String anchor = ""; + /* + * Set an anchor mark if this line is targetted by a goto, jsr, etc. Defining an anchor for every + * line is very inefficient! + */ + if (goto_set.get(offset)) { + anchor = ""; + } + String anchor2; + if (stream.getIndex() == code.length) { + anchor2 = "" + offset + ""; + } else { + anchor2 = "" + offset; + } + file.println(""); } - file - .println(""); } // Mark last line, may be targetted from Attributes window file.println(""); -- GitLab From 687fd988a316c937698c6c550b3c87507a60e361 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:28:33 +0000 Subject: [PATCH 1147/1313] Use try-with-resources. Note that ByteArrayOuputStream#close() is a noop so it is OK to move BAOS.toByteArray() inside a try-w-resources block. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748106 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/Utility.java | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 3de9ffdd..7bee6dac 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -1264,14 +1264,13 @@ public abstract class Utility { * * @throws IOException if there's a gzip exception */ - public static String encode( byte[] bytes, final boolean compress ) throws IOException { + public static String encode(byte[] bytes, final boolean compress) throws IOException { if (compress) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - GZIPOutputStream gos = new GZIPOutputStream(baos); - gos.write(bytes, 0, bytes.length); - gos.close(); - baos.close(); - bytes = baos.toByteArray(); + try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); + GZIPOutputStream gos = new GZIPOutputStream(baos)) { + gos.write(bytes, 0, bytes.length); + bytes = baos.toByteArray(); + } } CharArrayWriter caw = new CharArrayWriter(); try (JavaWriter jw = new JavaWriter(caw)) { @@ -1292,19 +1291,16 @@ public abstract class Utility { * * @throws IOException if there's a gzip exception */ - public static byte[] decode( final String s, final boolean uncompress ) throws IOException { - char[] chars = s.toCharArray(); - CharArrayReader car = new CharArrayReader(chars); - JavaReader jr = new JavaReader(car); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - int ch; - while ((ch = jr.read()) >= 0) { - bos.write(ch); + public static byte[] decode(final String s, final boolean uncompress) throws IOException { + byte[] bytes; + try (JavaReader jr = new JavaReader(new CharArrayReader(s.toCharArray())); + ByteArrayOutputStream bos = new ByteArrayOutputStream()) { + int ch; + while ((ch = jr.read()) >= 0) { + bos.write(ch); + } + bytes = bos.toByteArray(); } - bos.close(); - car.close(); - jr.close(); - byte[] bytes = bos.toByteArray(); if (uncompress) { GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes)); byte[] tmp = new byte[bytes.length * 3]; // Rough estimate -- GitLab From a35b256ce3c2aebcc96d054b2a526bb37b4f0bd4 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:41:48 +0000 Subject: [PATCH 1148/1313] Use try-with-resources. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748108 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/JavaClass.java | 10 +-- .../bcel/generic/AnnotationEntryGen.java | 64 +++++++++---------- .../java/org/apache/bcel/util/Class2HTML.java | 29 ++++----- .../bcel/util/ClassLoaderRepository.java | 17 ++--- .../java/org/apache/bcel/util/ClassPath.java | 5 +- .../apache/bcel/util/ClassPathRepository.java | 37 +++++------ .../MemorySensitiveClassPathRepository.java | 38 +++++------ 7 files changed, 84 insertions(+), 116 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 03f0537f..f3d3cd52 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -229,7 +229,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @param file Output file * @throws IOException */ - public void dump( final File file ) throws IOException { + public void dump(final File file) throws IOException { String parent = file.getParent(); if (parent != null) { File dir = new File(parent); @@ -239,14 +239,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl } } } - DataOutputStream dos = null; - try { - dos = new DataOutputStream(new FileOutputStream(file)); + try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(file))) { dump(dos); - } finally { - if (dos != null) { - dos.close(); - } } } diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index aeedbfd4..a90a600d 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -216,24 +216,22 @@ public class AnnotationEntryGen { ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); - DataOutputStream rvaDos = new DataOutputStream(rvaBytes); - DataOutputStream riaDos = new DataOutputStream(riaBytes); - - rvaDos.writeShort(countVisible); - riaDos.writeShort(countInvisible); - - // put the annotations in the right output stream - for (AnnotationEntryGen a : annotationEntryGens) { - if (a.isRuntimeVisible()) { - a.dump(rvaDos); - } else { - a.dump(riaDos); + try (DataOutputStream rvaDos = new DataOutputStream(rvaBytes); + DataOutputStream riaDos = new DataOutputStream(riaBytes)) { + + rvaDos.writeShort(countVisible); + riaDos.writeShort(countInvisible); + + // put the annotations in the right output stream + for (AnnotationEntryGen a : annotationEntryGens) { + if (a.isRuntimeVisible()) { + a.dump(rvaDos); + } else { + a.dump(riaDos); + } } } - rvaDos.close(); - riaDos.close(); - byte[] rvaData = rvaBytes.toByteArray(); byte[] riaData = riaBytes.toByteArray(); @@ -296,34 +294,34 @@ public class AnnotationEntryGen { } // Lets do the visible ones ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); - DataOutputStream rvaDos = new DataOutputStream(rvaBytes); - rvaDos.writeByte(vec.length); // First goes number of parameters - for (int i = 0; i < vec.length; i++) { - rvaDos.writeShort(visCount[i]); - if (visCount[i] > 0) { - for (AnnotationEntryGen element : vec[i]) { - if (element.isRuntimeVisible()) { - element.dump(rvaDos); + try (DataOutputStream rvaDos = new DataOutputStream(rvaBytes)) { + rvaDos.writeByte(vec.length); // First goes number of parameters + for (int i = 0; i < vec.length; i++) { + rvaDos.writeShort(visCount[i]); + if (visCount[i] > 0) { + for (AnnotationEntryGen element : vec[i]) { + if (element.isRuntimeVisible()) { + element.dump(rvaDos); + } } } } } - rvaDos.close(); // Lets do the invisible ones ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); - DataOutputStream riaDos = new DataOutputStream(riaBytes); - riaDos.writeByte(vec.length); // First goes number of parameters - for (int i = 0; i < vec.length; i++) { - riaDos.writeShort(invisCount[i]); - if (invisCount[i] > 0) { - for (AnnotationEntryGen element : vec[i]) { - if (!element.isRuntimeVisible()) { - element.dump(riaDos); + try (DataOutputStream riaDos = new DataOutputStream(riaBytes)) { + riaDos.writeByte(vec.length); // First goes number of parameters + for (int i = 0; i < vec.length; i++) { + riaDos.writeShort(invisCount[i]); + if (invisCount[i] > 0) { + for (AnnotationEntryGen element : vec[i]) { + if (!element.isRuntimeVisible()) { + element.dump(riaDos); + } } } } } - riaDos.close(); byte[] rvaData = rvaBytes.toByteArray(); byte[] riaData = riaBytes.toByteArray(); int rvaIndex = -1; diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index 490ef6dd..883bd436 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -217,24 +217,19 @@ public class Class2HTML { private void writeMainHTML( final AttributeHTML attribute_html ) throws IOException { - PrintWriter file = new PrintWriter(new FileOutputStream(dir + class_name + ".html")); + try (PrintWriter file = new PrintWriter(new FileOutputStream(dir + class_name + ".html"))) { + file.println("\n" + "Documentation for " + class_name + "" + "\n" + + "\n" + "\n" + + "\n" + "\n" + "\n" + + "\n" + "\n" + + "\n" + ""); + } Attribute[] attributes = java_class.getAttributes(); - file.println("\n" + "Documentation for " + class_name + "" - + "\n" + "\n" - + "\n" + "\n" - + "\n" + "\n" - + "\n" + "\n" - + "\n" - + ""); - file.close(); for (int i = 0; i < attributes.length; i++) { attribute_html.writeAttribute(attributes[i], "class" + i); } diff --git a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java index 5f2b2e8f..5ad10f87 100644 --- a/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassLoaderRepository.java @@ -79,25 +79,20 @@ public class ClassLoaderRepository implements Repository { * Lookup a JavaClass object from the Class Name provided. */ @Override - public JavaClass loadClass( final String className ) throws ClassNotFoundException { + public JavaClass loadClass(final String className) throws ClassNotFoundException { String classFile = className.replace('.', '/'); JavaClass RC = findClass(className); if (RC != null) { return RC; } - try { - InputStream is = loader.getResourceAsStream(classFile + ".class"); + try (InputStream is = loader.getResourceAsStream(classFile + ".class")) { if (is == null) { throw new ClassNotFoundException(className + " not found."); } - try { - ClassParser parser = new ClassParser(is, className); - RC = parser.parse(); - storeClass(RC); - return RC; - } finally { - is.close(); - } + ClassParser parser = new ClassParser(is, className); + RC = parser.parse(); + storeClass(RC); + return RC; } catch (IOException e) { throw new ClassNotFoundException(className + " not found: " + e, e); } diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 226776a8..c3f19560 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -307,10 +307,9 @@ public class ClassPath { * @param suffix file name ends with suffix, e.g. .java * @return byte array for file on class path */ - public byte[] getBytes( final String name, final String suffix ) throws IOException { + public byte[] getBytes(final String name, final String suffix) throws IOException { DataInputStream dis = null; - try { - InputStream is = getInputStream(name, suffix); + try (InputStream is = getInputStream(name, suffix)) { if (is == null) { throw new IOException("Couldn't find: " + name + suffix); } diff --git a/src/main/java/org/apache/bcel/util/ClassPathRepository.java b/src/main/java/org/apache/bcel/util/ClassPathRepository.java index 2619c5bb..d8145d88 100644 --- a/src/main/java/org/apache/bcel/util/ClassPathRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassPathRepository.java @@ -106,28 +106,21 @@ public class ClassPathRepository implements Repository { */ @Override public JavaClass loadClass(final Class clazz) throws ClassNotFoundException { - InputStream clsStream = null; - try { - String className = clazz.getName(); - JavaClass repositoryClass = findClass(className); - if (repositoryClass != null) { - return repositoryClass; - } - String name = className; - int i = name.lastIndexOf('.'); - if (i > 0) { - name = name.substring(i + 1); - } - clsStream = clazz.getResourceAsStream(name + ".class"); - return loadClass(clsStream, className); - } finally { - try { - if (clsStream != null) { - clsStream.close(); - } - } catch (IOException ioe) { - // don't care - } + String className = clazz.getName(); + JavaClass repositoryClass = findClass(className); + if (repositoryClass != null) { + return repositoryClass; + } + String name = className; + int i = name.lastIndexOf('.'); + if (i > 0) { + name = name.substring(i + 1); + } + JavaClass cls = null; + try (InputStream clsStream = clazz.getResourceAsStream(name + ".class")) { + return cls = loadClass(clsStream, className); + } catch (IOException e) { + return cls; } } diff --git a/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java b/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java index e8520343..b97e2cf7 100644 --- a/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java +++ b/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java @@ -112,29 +112,23 @@ public class MemorySensitiveClassPathRepository implements Repository { */ @Override public JavaClass loadClass(final Class clazz) throws ClassNotFoundException { - InputStream clsStream = null; - try { - String className = clazz.getName(); - JavaClass repositoryClass = findClass(className); - if (repositoryClass != null) { - return repositoryClass; - } - String name = className; - int i = name.lastIndexOf('.'); - if (i > 0) { - name = name.substring(i + 1); - } - clsStream = clazz.getResourceAsStream(name + ".class"); - return loadClass(clsStream, className); - } finally { - try { - if (clsStream != null) { - clsStream.close(); - } - } catch (IOException ioe) { - // don't care - } + String className = clazz.getName(); + JavaClass repositoryClass = findClass(className); + if (repositoryClass != null) { + return repositoryClass; + } + String name = className; + int i = name.lastIndexOf('.'); + if (i > 0) { + name = name.substring(i + 1); } + JavaClass cls = null; + try (InputStream clsStream = clazz.getResourceAsStream(name + ".class")) { + return cls = loadClass(clsStream, className); + } catch (IOException e) { + return cls; + } + } private JavaClass loadClass(final InputStream is, final String className) throws ClassNotFoundException { -- GitLab From 53065084d622423dd086efdc6e76729f97d463e2 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:43:30 +0000 Subject: [PATCH 1149/1313] Rename private ivars to remove leading underscore. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748109 13f79535-47bb-0310-9956-ffa450edef68 --- .../MemorySensitiveClassPathRepository.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java b/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java index b97e2cf7..42477aa6 100644 --- a/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java +++ b/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java @@ -35,11 +35,11 @@ import org.apache.bcel.classfile.JavaClass; */ public class MemorySensitiveClassPathRepository implements Repository { - private ClassPath _path = null; - private final Map> _loadedClasses = new HashMap<>(); // CLASSNAME X JAVACLASS + private ClassPath path = null; + private final Map> loadedClasses = new HashMap<>(); // CLASSNAME X JAVACLASS public MemorySensitiveClassPathRepository(final ClassPath path) { - _path = path; + this.path = path; } /** @@ -47,7 +47,7 @@ public class MemorySensitiveClassPathRepository implements Repository { */ @Override public void storeClass(final JavaClass clazz) { - _loadedClasses.put(clazz.getClassName(), new SoftReference<>(clazz)); + loadedClasses.put(clazz.getClassName(), new SoftReference<>(clazz)); clazz.setRepository(this); } @@ -56,7 +56,7 @@ public class MemorySensitiveClassPathRepository implements Repository { */ @Override public void removeClass(final JavaClass clazz) { - _loadedClasses.remove(clazz.getClassName()); + loadedClasses.remove(clazz.getClassName()); } /** @@ -64,7 +64,7 @@ public class MemorySensitiveClassPathRepository implements Repository { */ @Override public JavaClass findClass(final String className) { - SoftReference ref = _loadedClasses.get(className); + SoftReference ref = loadedClasses.get(className); if (ref == null) { return null; } @@ -92,7 +92,7 @@ public class MemorySensitiveClassPathRepository implements Repository { return clazz; } try { - return loadClass(_path.getInputStream(className), className); + return loadClass(path.getInputStream(className), className); } catch (IOException e) { throw new ClassNotFoundException("Exception while looking for class " + className + ": " + e, e); } @@ -158,7 +158,7 @@ public class MemorySensitiveClassPathRepository implements Repository { */ @Override public ClassPath getClassPath() { - return _path; + return path; } /** @@ -166,6 +166,6 @@ public class MemorySensitiveClassPathRepository implements Repository { */ @Override public void clear() { - _loadedClasses.clear(); + loadedClasses.clear(); } } -- GitLab From ee4ed5171c34694edac71add10dfab9abb6b003a Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:45:58 +0000 Subject: [PATCH 1150/1313] Remove IOException from declaration as it is not actually thrown. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748111 13f79535-47bb-0310-9956-ffa450edef68 --- src/test/java/org/apache/bcel/PerformanceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java index abd4f8ae..44161308 100644 --- a/src/test/java/org/apache/bcel/PerformanceTest.java +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -131,7 +131,7 @@ public final class PerformanceTest extends TestCase { } } - public void testPerformance() throws IOException { + public void testPerformance() { File javaLib = new File(System.getProperty("java.home") + "/lib"); javaLib.listFiles(new FileFilter() { -- GitLab From eb15183f8f1272ee3cfde61eeaf048c2280f0e23 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:48:53 +0000 Subject: [PATCH 1151/1313] Better lvar name. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748113 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/ClassPath.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index c3f19560..167a80b0 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -69,7 +69,7 @@ public class ClassPath { */ public ClassPath(final String class_path) { this.class_path = class_path; - List vec = new ArrayList<>(); + List list = new ArrayList<>(); for (StringTokenizer tok = new StringTokenizer(class_path, File.pathSeparator); tok.hasMoreTokens();) { String path = tok.nextToken(); if (!path.equals("")) { @@ -77,9 +77,9 @@ public class ClassPath { try { if (file.exists()) { if (file.isDirectory()) { - vec.add(new Dir(path)); + list.add(new Dir(path)); } else { - vec.add(new Zip(new ZipFile(file))); + list.add(new Zip(new ZipFile(file))); } } } catch (IOException e) { @@ -89,8 +89,8 @@ public class ClassPath { } } } - paths = new PathEntry[vec.size()]; - vec.toArray(paths); + paths = new PathEntry[list.size()]; + list.toArray(paths); } /** -- GitLab From 145272c6a729e6ac3aaef5c973c2c86bdf0f329a Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:51:19 +0000 Subject: [PATCH 1152/1313] Use Java 6's String#isEmpty(). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748114 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Field.java | 2 +- src/main/java/org/apache/bcel/classfile/InnerClass.java | 2 +- src/main/java/org/apache/bcel/classfile/JavaClass.java | 2 +- src/main/java/org/apache/bcel/classfile/Method.java | 2 +- src/main/java/org/apache/bcel/generic/FieldGen.java | 2 +- src/main/java/org/apache/bcel/util/ClassPath.java | 2 +- src/main/java/org/apache/bcel/util/ClassPathRepository.java | 2 +- .../apache/bcel/util/MemorySensitiveClassPathRepository.java | 2 +- src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java index 942d78f6..3d4c2259 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/bcel/classfile/Field.java @@ -123,7 +123,7 @@ public final class Field extends FieldOrMethod { // Get names from constant pool access = Utility.accessToString(super.getAccessFlags()); - access = access.equals("") ? "" : (access + " "); + access = access.isEmpty() ? "" : (access + " "); signature = Utility.signatureToString(getSignature()); name = getName(); StringBuilder buf = new StringBuilder(64); // CHECKSTYLE IGNORE MagicNumber diff --git a/src/main/java/org/apache/bcel/classfile/InnerClass.java b/src/main/java/org/apache/bcel/classfile/InnerClass.java index 60473277..feba4a9e 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClass.java @@ -198,7 +198,7 @@ public final class InnerClass implements Cloneable, Node { inner_name = "(anonymous)"; } String access = Utility.accessToString(inner_access_flags, true); - access = access.equals("") ? "" : (access + " "); + access = access.isEmpty() ? "" : (access + " "); return " " + access + inner_name + "=class " + inner_class_name + outer_class_name; } diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index f3d3cd52..d746b47b 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -595,7 +595,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl @Override public String toString() { String access = Utility.accessToString(super.getAccessFlags(), true); - access = access.equals("") ? "" : (access + " "); + access = access.isEmpty() ? "" : (access + " "); StringBuilder buf = new StringBuilder(128); buf.append(access).append(Utility.classOrInterface(super.getAccessFlags())).append(" ").append( class_name).append(" extends ").append( diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index af20a4a8..044b2759 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -185,7 +185,7 @@ public final class Method extends FieldOrMethod { ExceptionTable e = getExceptionTable(); if (e != null) { String str = e.toString(); - if (!str.equals("")) { + if (!str.isEmpty()) { buf.append("\n\t\tthrows ").append(str); } } diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index 8006812b..2eddc8db 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -317,7 +317,7 @@ public class FieldGen extends FieldGenOrMethodGen { String signature; String access; // Short cuts to constant pool access = Utility.accessToString(super.getAccessFlags()); - access = access.equals("") ? "" : (access + " "); + access = access.isEmpty() ? "" : (access + " "); signature = super.getType().toString(); name = getName(); StringBuilder buf = new StringBuilder(32); // CHECKSTYLE IGNORE MagicNumber diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 167a80b0..58e99f1d 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -72,7 +72,7 @@ public class ClassPath { List list = new ArrayList<>(); for (StringTokenizer tok = new StringTokenizer(class_path, File.pathSeparator); tok.hasMoreTokens();) { String path = tok.nextToken(); - if (!path.equals("")) { + if (!path.isEmpty()) { File file = new File(path); try { if (file.exists()) { diff --git a/src/main/java/org/apache/bcel/util/ClassPathRepository.java b/src/main/java/org/apache/bcel/util/ClassPathRepository.java index d8145d88..dcc23051 100644 --- a/src/main/java/org/apache/bcel/util/ClassPathRepository.java +++ b/src/main/java/org/apache/bcel/util/ClassPathRepository.java @@ -77,7 +77,7 @@ public class ClassPathRepository implements Repository { */ @Override public JavaClass loadClass(String className) throws ClassNotFoundException { - if ((className == null) || className.equals("")) { + if ((className == null) || className.isEmpty()) { throw new IllegalArgumentException("Invalid class name " + className); } className = className.replace('/', '.'); // Just in case, canonical form diff --git a/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java b/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java index 42477aa6..b77f9033 100644 --- a/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java +++ b/src/main/java/org/apache/bcel/util/MemorySensitiveClassPathRepository.java @@ -83,7 +83,7 @@ public class MemorySensitiveClassPathRepository implements Repository { */ @Override public JavaClass loadClass(String className) throws ClassNotFoundException { - if ((className == null) || className.equals("")) { + if ((className == null) || className.isEmpty()) { throw new IllegalArgumentException("Invalid class name " + className); } className = className.replace('/', '.'); // Just in case, canonical form diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java index f1670f93..50dfa712 100644 --- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java +++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java @@ -318,7 +318,7 @@ public class VerifierAppFrame extends JFrame { void newFileMenuItem_actionPerformed( final ActionEvent e ) { String classname = JOptionPane .showInputDialog("Please enter the fully qualified name of a class or interface to verify:"); - if ((classname == null) || (classname.equals(""))) { + if ((classname == null) || (classname.isEmpty())) { return; } VerifierFactory.getVerifier(classname); // let observers do the rest. -- GitLab From bbdd3e827d23c085d6c669914efa2798313b1b52 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:53:45 +0000 Subject: [PATCH 1153/1313] Rename private ivars to remove leading underscore. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748115 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Repository.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/bcel/Repository.java b/src/main/java/org/apache/bcel/Repository.java index 263dab20..d8136d27 100644 --- a/src/main/java/org/apache/bcel/Repository.java +++ b/src/main/java/org/apache/bcel/Repository.java @@ -35,20 +35,20 @@ import org.apache.bcel.util.SyntheticRepository; */ public abstract class Repository { - private static org.apache.bcel.util.Repository _repository = SyntheticRepository.getInstance(); + private static org.apache.bcel.util.Repository repository = SyntheticRepository.getInstance(); /** @return currently used repository instance */ public static org.apache.bcel.util.Repository getRepository() { - return _repository; + return repository; } /** Set repository instance to be used for class loading */ public static void setRepository( final org.apache.bcel.util.Repository rep ) { - _repository = rep; + repository = rep; } @@ -60,7 +60,7 @@ public abstract class Repository { * parsed correctly */ public static JavaClass lookupClass( final String class_name ) throws ClassNotFoundException { - return _repository.loadClass(class_name); + return repository.loadClass(class_name); } @@ -72,7 +72,7 @@ public abstract class Repository { * parsed correctly */ public static JavaClass lookupClass( final Class clazz ) throws ClassNotFoundException { - return _repository.loadClass(clazz); + return repository.loadClass(clazz); } @@ -83,7 +83,7 @@ public abstract class Repository { */ public static ClassPath.ClassFile lookupClassFile( final String class_name ) { try { - ClassPath path = _repository.getClassPath(); + ClassPath path = repository.getClassPath(); if (path == null) { return null; } @@ -97,7 +97,7 @@ public abstract class Repository { /** Clear the repository. */ public static void clearCache() { - _repository.clear(); + repository.clear(); } @@ -107,8 +107,8 @@ public abstract class Repository { * @return old entry in repository */ public static JavaClass addClass( final JavaClass clazz ) { - JavaClass old = _repository.findClass(clazz.getClassName()); - _repository.storeClass(clazz); + JavaClass old = repository.findClass(clazz.getClassName()); + repository.storeClass(clazz); return old; } @@ -117,7 +117,7 @@ public abstract class Repository { * Remove class with given (fully qualified) name from repository. */ public static void removeClass( final String clazz ) { - _repository.removeClass(_repository.findClass(clazz)); + repository.removeClass(repository.findClass(clazz)); } @@ -125,7 +125,7 @@ public abstract class Repository { * Remove given class from repository. */ public static void removeClass( final JavaClass clazz ) { - _repository.removeClass(clazz); + repository.removeClass(clazz); } -- GitLab From aedbfd5bef8442e5559c0439ce157e3b8cc37269 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:55:02 +0000 Subject: [PATCH 1154/1313] Rename private ivars to remove leading underscore (and a better name). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748116 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Constant.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index 7a6d3410..649bd222 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -33,7 +33,7 @@ import org.apache.bcel.util.BCELComparator; */ public abstract class Constant implements Cloneable, Node { - private static BCELComparator _cmp = new BCELComparator() { + private static BCELComparator bcelComparator = new BCELComparator() { @Override public boolean equals( final Object o1, final Object o2 ) { @@ -173,7 +173,7 @@ public abstract class Constant implements Cloneable, Node { * @return Comparison strategy object */ public static BCELComparator getComparator() { - return _cmp; + return bcelComparator; } @@ -181,7 +181,7 @@ public abstract class Constant implements Cloneable, Node { * @param comparator Comparison strategy object */ public static void setComparator( final BCELComparator comparator ) { - _cmp = comparator; + bcelComparator = comparator; } @@ -194,7 +194,7 @@ public abstract class Constant implements Cloneable, Node { */ @Override public boolean equals( final Object obj ) { - return _cmp.equals(this, obj); + return bcelComparator.equals(this, obj); } @@ -206,6 +206,6 @@ public abstract class Constant implements Cloneable, Node { */ @Override public int hashCode() { - return _cmp.hashCode(this); + return bcelComparator.hashCode(this); } } -- GitLab From 769df5afa88c6ce4eda5c675626077a24827181e Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:55:49 +0000 Subject: [PATCH 1155/1313] Rename private ivars to remove leading underscore (and a better name). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748117 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Field.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java index 3d4c2259..50c06d3f 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/bcel/classfile/Field.java @@ -32,7 +32,7 @@ import org.apache.bcel.util.BCELComparator; */ public final class Field extends FieldOrMethod { - private static BCELComparator _cmp = new BCELComparator() { + private static BCELComparator bcelComparator = new BCELComparator() { @Override public boolean equals( final Object o1, final Object o2 ) { @@ -161,7 +161,7 @@ public final class Field extends FieldOrMethod { * @return Comparison strategy object */ public static BCELComparator getComparator() { - return _cmp; + return bcelComparator; } @@ -169,7 +169,7 @@ public final class Field extends FieldOrMethod { * @param comparator Comparison strategy object */ public static void setComparator( final BCELComparator comparator ) { - _cmp = comparator; + bcelComparator = comparator; } @@ -182,7 +182,7 @@ public final class Field extends FieldOrMethod { */ @Override public boolean equals( final Object obj ) { - return _cmp.equals(this, obj); + return bcelComparator.equals(this, obj); } @@ -194,6 +194,6 @@ public final class Field extends FieldOrMethod { */ @Override public int hashCode() { - return _cmp.hashCode(this); + return bcelComparator.hashCode(this); } } -- GitLab From 27641679e9fc948bc33ac13dbaabdd831954ca29 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:56:07 +0000 Subject: [PATCH 1156/1313] Rename private ivars to remove leading underscore (and a better name). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748118 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/JavaClass.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index d746b47b..857b8357 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -73,7 +73,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public static final byte ZIP = 3; private static final boolean debug = Boolean.getBoolean("JavaClass.debug");; // Debugging on/off - private static BCELComparator _cmp = new BCELComparator() { + private static BCELComparator bcelComparator = new BCELComparator() { @Override public boolean equals( final Object o1, final Object o2 ) { @@ -880,7 +880,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @return Comparison strategy object */ public static BCELComparator getComparator() { - return _cmp; + return bcelComparator; } @@ -888,7 +888,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @param comparator Comparison strategy object */ public static void setComparator( final BCELComparator comparator ) { - _cmp = comparator; + bcelComparator = comparator; } @@ -901,7 +901,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl */ @Override public boolean equals( final Object obj ) { - return _cmp.equals(this, obj); + return bcelComparator.equals(this, obj); } @@ -924,6 +924,6 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl */ @Override public int hashCode() { - return _cmp.hashCode(this); + return bcelComparator.hashCode(this); } } -- GitLab From 70add68322e8145ddcff59c2347a40c0f2e9addd Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:56:28 +0000 Subject: [PATCH 1157/1313] Rename private ivars to remove leading underscore (and a better name). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748119 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/Method.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index 044b2759..f370815a 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -33,7 +33,7 @@ import org.apache.bcel.util.BCELComparator; */ public final class Method extends FieldOrMethod { - private static BCELComparator _cmp = new BCELComparator() { + private static BCELComparator bcelComparator = new BCELComparator() { @Override public boolean equals( final Object o1, final Object o2 ) { @@ -221,7 +221,7 @@ public final class Method extends FieldOrMethod { * @return Comparison strategy object */ public static BCELComparator getComparator() { - return _cmp; + return bcelComparator; } @@ -229,7 +229,7 @@ public final class Method extends FieldOrMethod { * @param comparator Comparison strategy object */ public static void setComparator( final BCELComparator comparator ) { - _cmp = comparator; + bcelComparator = comparator; } @@ -242,7 +242,7 @@ public final class Method extends FieldOrMethod { */ @Override public boolean equals( final Object obj ) { - return _cmp.equals(this, obj); + return bcelComparator.equals(this, obj); } @@ -254,7 +254,7 @@ public final class Method extends FieldOrMethod { */ @Override public int hashCode() { - return _cmp.hashCode(this); + return bcelComparator.hashCode(this); } /** -- GitLab From 4a4074b7f330d77f296c16abd82cfe026de31f99 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:57:22 +0000 Subject: [PATCH 1158/1313] Rename private ivars to remove leading underscore (and a better name). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748120 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/FieldGen.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index 2eddc8db..7548e03f 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -43,7 +43,7 @@ import org.apache.bcel.util.BCELComparator; public class FieldGen extends FieldGenOrMethodGen { private Object value = null; - private static BCELComparator _cmp = new BCELComparator() { + private static BCELComparator bcelComparator = new BCELComparator() { @Override public boolean equals( final Object o1, final Object o2 ) { @@ -343,7 +343,7 @@ public class FieldGen extends FieldGenOrMethodGen { * @return Comparison strategy object */ public static BCELComparator getComparator() { - return _cmp; + return bcelComparator; } @@ -351,7 +351,7 @@ public class FieldGen extends FieldGenOrMethodGen { * @param comparator Comparison strategy object */ public static void setComparator( final BCELComparator comparator ) { - _cmp = comparator; + bcelComparator = comparator; } @@ -364,7 +364,7 @@ public class FieldGen extends FieldGenOrMethodGen { */ @Override public boolean equals( final Object obj ) { - return _cmp.equals(this, obj); + return bcelComparator.equals(this, obj); } @@ -376,6 +376,6 @@ public class FieldGen extends FieldGenOrMethodGen { */ @Override public int hashCode() { - return _cmp.hashCode(this); + return bcelComparator.hashCode(this); } } -- GitLab From f5b48cb2b84d0cdcfaa99efda564a827f18bb49a Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 07:59:49 +0000 Subject: [PATCH 1159/1313] Rename private ivars to remove leading underscore (and a better name). git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748122 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/generic/MethodGen.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index dcbf60e4..2e3df555 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -75,7 +75,7 @@ public class MethodGen extends FieldGenOrMethodGen { private boolean hasParameterAnnotations = false; private boolean haveUnpackedParameterAnnotations = false; - private static BCELComparator _cmp = new BCELComparator() { + private static BCELComparator bcelComparator = new BCELComparator() { @Override public boolean equals( final Object o1, final Object o2 ) { @@ -1176,7 +1176,7 @@ public class MethodGen extends FieldGenOrMethodGen { * @return Comparison strategy object */ public static BCELComparator getComparator() { - return _cmp; + return bcelComparator; } @@ -1184,7 +1184,7 @@ public class MethodGen extends FieldGenOrMethodGen { * @param comparator Comparison strategy object */ public static void setComparator( final BCELComparator comparator ) { - _cmp = comparator; + bcelComparator = comparator; } @@ -1197,7 +1197,7 @@ public class MethodGen extends FieldGenOrMethodGen { */ @Override public boolean equals( final Object obj ) { - return _cmp.equals(this, obj); + return bcelComparator.equals(this, obj); } @@ -1209,6 +1209,6 @@ public class MethodGen extends FieldGenOrMethodGen { */ @Override public int hashCode() { - return _cmp.hashCode(this); + return bcelComparator.hashCode(this); } } -- GitLab From 3e7ca122fd7cdd5435b5c8bf83b234b3f68bfb89 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 08:02:03 +0000 Subject: [PATCH 1160/1313] Rename private vars to remove leading underscore. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748123 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/ClassSet.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/ClassSet.java b/src/main/java/org/apache/bcel/util/ClassSet.java index f3542bd1..9dcb33be 100644 --- a/src/main/java/org/apache/bcel/util/ClassSet.java +++ b/src/main/java/org/apache/bcel/util/ClassSet.java @@ -33,31 +33,31 @@ import org.apache.bcel.classfile.JavaClass; */ public class ClassSet { - private final Map _map = new HashMap<>(); + private final Map map = new HashMap<>(); public boolean add( final JavaClass clazz ) { boolean result = false; - if (!_map.containsKey(clazz.getClassName())) { + if (!map.containsKey(clazz.getClassName())) { result = true; - _map.put(clazz.getClassName(), clazz); + map.put(clazz.getClassName(), clazz); } return result; } public void remove( final JavaClass clazz ) { - _map.remove(clazz.getClassName()); + map.remove(clazz.getClassName()); } public boolean empty() { - return _map.isEmpty(); + return map.isEmpty(); } public JavaClass[] toArray() { - Collection values = _map.values(); + Collection values = map.values(); JavaClass[] classes = new JavaClass[values.size()]; values.toArray(classes); return classes; @@ -65,6 +65,6 @@ public class ClassSet { public String[] getClassNames() { - return _map.keySet().toArray(new String[_map.size()]); + return map.keySet().toArray(new String[map.size()]); } } -- GitLab From 241f2ba7aa3225724a80421b56075aef7bfb21a0 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 08:02:16 +0000 Subject: [PATCH 1161/1313] Rename private vars to remove leading underscore. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748124 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/util/SyntheticRepository.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/bcel/util/SyntheticRepository.java b/src/main/java/org/apache/bcel/util/SyntheticRepository.java index 6ccae281..65589a7c 100644 --- a/src/main/java/org/apache/bcel/util/SyntheticRepository.java +++ b/src/main/java/org/apache/bcel/util/SyntheticRepository.java @@ -33,7 +33,7 @@ import java.util.Map; public class SyntheticRepository extends MemorySensitiveClassPathRepository { // private static final String DEFAULT_PATH = ClassPath.getClassPath(); - private static final Map _instances = new HashMap<>(); // CLASSPATH X REPOSITORY + private static final Map instances = new HashMap<>(); // CLASSPATH X REPOSITORY private SyntheticRepository(final ClassPath path) { super(path); @@ -44,10 +44,10 @@ public class SyntheticRepository extends MemorySensitiveClassPathRepository { } public static SyntheticRepository getInstance(final ClassPath classPath) { - SyntheticRepository rep = _instances.get(classPath); + SyntheticRepository rep = instances.get(classPath); if (rep == null) { rep = new SyntheticRepository(classPath); - _instances.put(classPath, rep); + instances.put(classPath, rep); } return rep; } -- GitLab From 92a3a06876fc47d55d189f6483b1efc37b1c59bd Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 08:03:35 +0000 Subject: [PATCH 1162/1313] Better var name. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748127 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/verifier/statics/LONG_Upper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java index 33672b10..0489bf67 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java @@ -28,7 +28,7 @@ import org.apache.bcel.generic.Type; public final class LONG_Upper extends Type{ /** The one and only instance of this class. */ - private static final LONG_Upper singleInstance = new LONG_Upper(); + private static final LONG_Upper singleton = new LONG_Upper(); /** The constructor; this class must not be instantiated from the outside. */ private LONG_Upper(){ @@ -37,6 +37,6 @@ public final class LONG_Upper extends Type{ /** Use this method to get the single instance of this class. */ public static LONG_Upper theInstance(){ - return singleInstance; + return singleton; } } -- GitLab From b0017f772daa5e7f05094e38e4bec9bc99e5792f Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Mon, 13 Jun 2016 08:04:00 +0000 Subject: [PATCH 1163/1313] Better var name. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748128 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java index 41c2299f..7bd2230e 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java @@ -28,7 +28,7 @@ import org.apache.bcel.generic.Type; public final class DOUBLE_Upper extends Type{ /** The one and only instance of this class. */ - private static final DOUBLE_Upper singleInstance = new DOUBLE_Upper(); + private static final DOUBLE_Upper singleton = new DOUBLE_Upper(); /** The constructor; this class must not be instantiated from the outside. */ private DOUBLE_Upper(){ @@ -37,6 +37,6 @@ public final class DOUBLE_Upper extends Type{ /** Use this method to get the single instance of this class. */ public static DOUBLE_Upper theInstance(){ - return singleInstance; + return singleton; } } -- GitLab From f1532f0cdd5cfc6c40fdc85bc50d22ef2dba699d Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 14 Jun 2016 08:26:49 +0000 Subject: [PATCH 1164/1313] Fix formating. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748354 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/bcel/classfile/JDKClassDumpTestCase.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java index 269dbd89..3fa19cca 100644 --- a/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java +++ b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java @@ -82,10 +82,10 @@ public class JDKClassDumpTestCase { jc.dump(dos); dos.close(); DataInputStream src = new DataInputStream(inputStream); - int i=0; - for(int out : baos.toByteArray()) { + int i = 0; + for (int out : baos.toByteArray()) { int in = src.read(); - assertEquals(name + ": Mismatch at "+i, in, out&0xFF); + assertEquals(name + ": Mismatch at " + i, in, out & 0xFF); i++; } src.close(); -- GitLab From 5865fdde89b92235cb080637810e178f21bbfc11 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 14 Jun 2016 08:28:05 +0000 Subject: [PATCH 1165/1313] Use try-with-resources. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748355 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/classfile/JDKClassDumpTestCase.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java index 3fa19cca..904330e4 100644 --- a/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java +++ b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java @@ -78,17 +78,17 @@ public class JDKClassDumpTestCase { private void compare(final JavaClass jc, final InputStream inputStream, final String name) throws Exception { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(baos); - jc.dump(dos); - dos.close(); - DataInputStream src = new DataInputStream(inputStream); - int i = 0; - for (int out : baos.toByteArray()) { - int in = src.read(); - assertEquals(name + ": Mismatch at " + i, in, out & 0xFF); - i++; + try (DataOutputStream dos = new DataOutputStream(baos)) { + jc.dump(dos); + } + try (DataInputStream src = new DataInputStream(inputStream)) { + int i = 0; + for (int out : baos.toByteArray()) { + int in = src.read(); + assertEquals(name + ": Mismatch at " + i, in, out & 0xFF); + i++; + } } - src.close(); } -- GitLab From 2f2698fa5739eba1cdc3bdf8299a754fb98ae871 Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Tue, 14 Jun 2016 17:02:22 +0000 Subject: [PATCH 1166/1313] BCEL-243 Type.getType() needs to understand TypeVariableSignature(s) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748444 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 1 + src/main/java/org/apache/bcel/generic/Type.java | 12 +++++------- .../org/apache/bcel/generic/TypeTestCase.java | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 src/test/java/org/apache/bcel/generic/TypeTestCase.java diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 6693594e..4d381cb9 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -90,6 +90,7 @@ N.B. The Clirr report shows that there are several incompatible changes which in External code should not have been relying on such classes to provide definitions of the constants. "> + Type.getType() needs to understand TypeVariableSignature(s) Add constants for Java 9 class file version 53 FCONST pattern does not include FCONST_2 Add missing Node.accept() implementations (ConstantMethodHandle, ConstantMethodType, ParameterAnnotationEntry) diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index a05f6101..fb351b0e 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -214,13 +214,11 @@ public abstract class Type { wrap(consumed_chars, _temp); return new ArrayType(t, dim); } else { // type == T_REFERENCE - int index = signature.indexOf(';'); // Look for closing `;' - if (index < 0) { - throw new ClassFormatException("Invalid signature: " + signature); - } - //corrected concurrent private static field acess - wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed - return ObjectType.getInstance(signature.substring(1, index).replace('/', '.')); + // Utility.signatureToString understands how to parse + // generic types. + String parsedSignature = Utility.signatureToString(signature, false); + wrap(consumed_chars, parsedSignature.length() + 2); // "Lblabla;" `L' and `;' are removed + return ObjectType.getInstance(parsedSignature.replace('/', '.')); } } diff --git a/src/test/java/org/apache/bcel/generic/TypeTestCase.java b/src/test/java/org/apache/bcel/generic/TypeTestCase.java new file mode 100644 index 00000000..db5dc2ce --- /dev/null +++ b/src/test/java/org/apache/bcel/generic/TypeTestCase.java @@ -0,0 +1,16 @@ +package org.apache.bcel.generic; + +import junit.framework.TestCase; + +public class TypeTestCase extends TestCase { + public void testBCEL243() { + // expectedValue = "Ljava/util/Map;>;"; + // The line commented out above is the correct expected value; however, + // the constructor for ObjectType is yet another place where BCEL does + // not understand generics so we need to substitute the modified value below. + String expectedValue = "Ljava/util/Map>;"; + String actualValue = (Type.getType("Ljava/util/Map;>;")).getSignature(); + assertEquals("Type.getType", expectedValue, actualValue); + } + +} -- GitLab From 57e1baefea09dd41ad932047507bfc6401d46405 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 14 Jun 2016 20:48:09 +0000 Subject: [PATCH 1167/1313] Use try-with-resources. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748463 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/PerformanceTest.java | 74 +++++++++---------- .../bcel/classfile/JDKClassDumpTestCase.java | 28 +++---- .../bcel/generic/JDKGenericDumpTestCase.java | 28 +++---- .../bcel/verifier/tests/TestCreator.java | 6 +- 4 files changed, 65 insertions(+), 71 deletions(-) diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java index 44161308..dfa1b9cf 100644 --- a/src/test/java/org/apache/bcel/PerformanceTest.java +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -77,48 +77,46 @@ public final class PerformanceTest extends TestCase { System.out.println("parsing " + lib); total.start(); - JarFile jar = new JarFile(lib); - Enumeration en = jar.entries(); - - while (en.hasMoreElements()) { - JarEntry e = (JarEntry) en.nextElement(); - if (e.getName().endsWith(".class")) { - InputStream in = jar.getInputStream(e); - byte[] bytes = read(in); - - parseTime.start(); - JavaClass clazz = new ClassParser(new ByteArrayInputStream(bytes), e.getName()) - .parse(); - parseTime.stop(); - - cgenTime.start(); - ClassGen cg = new ClassGen(clazz); - cgenTime.stop(); - - Method[] methods = cg.getMethods(); - for (Method m : methods) { - mgenTime.start(); - MethodGen mg = new MethodGen(m, cg.getClassName(), cg.getConstantPool()); - InstructionList il = mg.getInstructionList(); - mgenTime.stop(); - - mserTime.start(); - if (il != null) { - mg.getInstructionList().setPositions(); - mg.setMaxLocals(); - mg.setMaxStack(); + try (JarFile jar = new JarFile(lib)) { + Enumeration en = jar.entries(); + + while (en.hasMoreElements()) { + JarEntry e = (JarEntry) en.nextElement(); + if (e.getName().endsWith(".class")) { + InputStream in = jar.getInputStream(e); + byte[] bytes = read(in); + + parseTime.start(); + JavaClass clazz = new ClassParser(new ByteArrayInputStream(bytes), e.getName()).parse(); + parseTime.stop(); + + cgenTime.start(); + ClassGen cg = new ClassGen(clazz); + cgenTime.stop(); + + Method[] methods = cg.getMethods(); + for (Method m : methods) { + mgenTime.start(); + MethodGen mg = new MethodGen(m, cg.getClassName(), cg.getConstantPool()); + InstructionList il = mg.getInstructionList(); + mgenTime.stop(); + + mserTime.start(); + if (il != null) { + mg.getInstructionList().setPositions(); + mg.setMaxLocals(); + mg.setMaxStack(); + } + cg.replaceMethod(m, mg.getMethod()); + mserTime.stop(); } - cg.replaceMethod(m, mg.getMethod()); - mserTime.stop(); - } - serTime.start(); - cg.getJavaClass().getBytes(); - serTime.stop(); + serTime.start(); + cg.getJavaClass().getBytes(); + serTime.stop(); + } } } - - jar.close(); total.stop(); if (REPORT) { System.out.println("ClassParser.parse: " + parseTime); diff --git a/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java index 904330e4..9810a77f 100644 --- a/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java +++ b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java @@ -44,7 +44,7 @@ public class JDKClassDumpTestCase { @Override public boolean accept(final File file) { - if(file.getName().endsWith(".jar")) { + if (file.getName().endsWith(".jar")) { try { testJar(file); } catch (Exception e) { @@ -59,21 +59,21 @@ public class JDKClassDumpTestCase { private void testJar(final File file) throws Exception { System.out.println("parsing " + file); - JarFile jar = new JarFile(file); - Enumeration en = jar.entries(); - - while (en.hasMoreElements()) { - JarEntry e = en.nextElement(); - final String name = e.getName(); - if (name.endsWith(".class")) { -// System.out.println("parsing " + name); - InputStream in = jar.getInputStream(e); - ClassParser parser = new ClassParser(in, name); - JavaClass jc = parser.parse(); - compare(jc, jar.getInputStream(e), name); + try (JarFile jar = new JarFile(file)) { + Enumeration en = jar.entries(); + while (en.hasMoreElements()) { + JarEntry e = en.nextElement(); + final String name = e.getName(); + if (name.endsWith(".class")) { + // System.out.println("parsing " + name); + try (InputStream in = jar.getInputStream(e)) { + ClassParser parser = new ClassParser(in, name); + JavaClass jc = parser.parse(); + compare(jc, jar.getInputStream(e), name); + } + } } } - jar.close(); } private void compare(final JavaClass jc, final InputStream inputStream, final String name) throws Exception { diff --git a/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java b/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java index 419b7d1a..b9fbfaf2 100644 --- a/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java +++ b/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java @@ -50,23 +50,23 @@ public class JDKGenericDumpTestCase { private void testJar(final File file) throws Exception { System.out.println(file); - JarFile jar = new JarFile(file); - Enumeration en = jar.entries(); - - while (en.hasMoreElements()) { - JarEntry e = en.nextElement(); - final String name = e.getName(); - if (name.endsWith(".class")) { -// System.out.println("- " + name); - InputStream in = jar.getInputStream(e); - ClassParser parser = new ClassParser(in, name); - JavaClass jc = parser.parse(); - for(Method m : jc.getMethods()) { - compare(name, m); + try (JarFile jar = new JarFile(file)) { + Enumeration en = jar.entries(); + while (en.hasMoreElements()) { + JarEntry e = en.nextElement(); + final String name = e.getName(); + if (name.endsWith(".class")) { + // System.out.println("- " + name); + try (InputStream in = jar.getInputStream(e)) { + ClassParser parser = new ClassParser(in, name); + JavaClass jc = parser.parse(); + for (Method m : jc.getMethods()) { + compare(name, m); + } + } } } } - jar.close(); } private void compare(final String name, final Method m) { diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java b/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java index c09dfba1..929bc86f 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestCreator.java @@ -30,13 +30,9 @@ public abstract class TestCreator { public void create() throws IOException { File classFile = new File(getPackageFolder(), getClassName()); - FileOutputStream out = new FileOutputStream(classFile); - try { + try (FileOutputStream out = new FileOutputStream(classFile)) { create(out); } - finally { - out.close(); - } } private String getClassName() { -- GitLab From b82b8b2cc51220537d247d45133838eb868fe213 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 14 Jun 2016 21:05:14 +0000 Subject: [PATCH 1168/1313] Add missing @java.lang.Deprecated. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748467 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/AttributeReader.java | 1 + src/main/java/org/apache/bcel/classfile/FieldOrMethod.java | 1 + src/main/java/org/apache/bcel/classfile/StackMapEntry.java | 1 + 3 files changed, 3 insertions(+) diff --git a/src/main/java/org/apache/bcel/classfile/AttributeReader.java b/src/main/java/org/apache/bcel/classfile/AttributeReader.java index a88dce3a..3246e657 100644 --- a/src/main/java/org/apache/bcel/classfile/AttributeReader.java +++ b/src/main/java/org/apache/bcel/classfile/AttributeReader.java @@ -27,6 +27,7 @@ package org.apache.bcel.classfile; * * @deprecated Use UnknownAttributeReader instead */ +@java.lang.Deprecated public interface AttributeReader { /** diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index 19d0278c..dc8dc246 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -88,6 +88,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No * @throws ClassFormatException * @deprecated Use {@link #FieldOrMethod(java.io.DataInput, ConstantPool)} instead. */ + @java.lang.Deprecated protected FieldOrMethod(final DataInputStream file, final ConstantPool constant_pool) throws IOException, ClassFormatException { this((DataInput) file, constant_pool); diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index 9af82749..c9590cda 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -102,6 +102,7 @@ public final class StackMapEntry implements Node, Cloneable * @deprecated Since 6.0, use {@link #StackMapEntry(int, int, StackMapType[], StackMapType[], ConstantPool)} * instead */ + @java.lang.Deprecated public StackMapEntry(final int byte_code_offset, final int number_of_locals, final StackMapType[] types_of_locals, final int number_of_stack_items, final StackMapType[] types_of_stack_items, final ConstantPool constant_pool) { -- GitLab From e0d62420f7020b7e6a88d6f41b27547eb8ac397b Mon Sep 17 00:00:00 2001 From: David Brosius Date: Wed, 15 Jun 2016 20:45:17 +0000 Subject: [PATCH 1169/1313] add missing isVarArgs to AccessFlags git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748636 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/AccessFlags.java | 105 +++++++----------- 1 file changed, 41 insertions(+), 64 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/AccessFlags.java b/src/main/java/org/apache/bcel/classfile/AccessFlags.java index 870362d7..93c4d987 100644 --- a/src/main/java/org/apache/bcel/classfile/AccessFlags.java +++ b/src/main/java/org/apache/bcel/classfile/AccessFlags.java @@ -20,8 +20,7 @@ package org.apache.bcel.classfile; import org.apache.bcel.Const; /** - * Super class for all objects that have modifiers like private, final, ... - * I.e. classes, fields, and methods. + * Super class for all objects that have modifiers like private, final, ... I.e. classes, fields, and methods. * * @version $Id$ */ @@ -33,52 +32,52 @@ public abstract class AccessFlags { @java.lang.Deprecated protected int access_flags; // TODO not used externally at present - public AccessFlags() { } - /** - * @param a inital access flags + * @param a + * inital access flags */ public AccessFlags(final int a) { access_flags = a; } - - /** + /** * @return Access flags of the object aka. "modifiers". */ public final int getAccessFlags() { return access_flags; } - - /** + /** * @return Access flags of the object aka. "modifiers". */ public final int getModifiers() { return access_flags; } - - /** Set access flags aka "modifiers". - * @param access_flags Access flags of the object. + /** + * Set access flags aka "modifiers". + * + * @param access_flags + * Access flags of the object. */ - public final void setAccessFlags( final int access_flags ) { + public final void setAccessFlags(final int access_flags) { this.access_flags = access_flags; } - - /** Set access flags aka "modifiers". - * @param access_flags Access flags of the object. + /** + * Set access flags aka "modifiers". + * + * @param access_flags + * Access flags of the object. */ - public final void setModifiers( final int access_flags ) { + public final void setModifiers(final int access_flags) { setAccessFlags(access_flags); } - - private void setFlag( final int flag, final boolean set ) { + private void setFlag(final int flag, final boolean set) { if ((access_flags & flag) != 0) { // Flag is set already if (!set) { access_flags ^= flag; @@ -90,153 +89,131 @@ public abstract class AccessFlags { } } - - public final void isPublic( final boolean flag ) { + public final void isPublic(final boolean flag) { setFlag(Const.ACC_PUBLIC, flag); } - public final boolean isPublic() { return (access_flags & Const.ACC_PUBLIC) != 0; } - - public final void isPrivate( final boolean flag ) { + public final void isPrivate(final boolean flag) { setFlag(Const.ACC_PRIVATE, flag); } - public final boolean isPrivate() { return (access_flags & Const.ACC_PRIVATE) != 0; } - - public final void isProtected( final boolean flag ) { + public final void isProtected(final boolean flag) { setFlag(Const.ACC_PROTECTED, flag); } - public final boolean isProtected() { return (access_flags & Const.ACC_PROTECTED) != 0; } - - public final void isStatic( final boolean flag ) { + public final void isStatic(final boolean flag) { setFlag(Const.ACC_STATIC, flag); } - public final boolean isStatic() { return (access_flags & Const.ACC_STATIC) != 0; } - - public final void isFinal( final boolean flag ) { + public final void isFinal(final boolean flag) { setFlag(Const.ACC_FINAL, flag); } - public final boolean isFinal() { return (access_flags & Const.ACC_FINAL) != 0; } - - public final void isSynchronized( final boolean flag ) { + public final void isSynchronized(final boolean flag) { setFlag(Const.ACC_SYNCHRONIZED, flag); } - public final boolean isSynchronized() { return (access_flags & Const.ACC_SYNCHRONIZED) != 0; } - - public final void isVolatile( final boolean flag ) { + public final void isVolatile(final boolean flag) { setFlag(Const.ACC_VOLATILE, flag); } - public final boolean isVolatile() { return (access_flags & Const.ACC_VOLATILE) != 0; } - - public final void isTransient( final boolean flag ) { + public final void isTransient(final boolean flag) { setFlag(Const.ACC_TRANSIENT, flag); } - public final boolean isTransient() { return (access_flags & Const.ACC_TRANSIENT) != 0; } - - public final void isNative( final boolean flag ) { + public final void isNative(final boolean flag) { setFlag(Const.ACC_NATIVE, flag); } - public final boolean isNative() { return (access_flags & Const.ACC_NATIVE) != 0; } - - public final void isInterface( final boolean flag ) { + public final void isInterface(final boolean flag) { setFlag(Const.ACC_INTERFACE, flag); } - public final boolean isInterface() { return (access_flags & Const.ACC_INTERFACE) != 0; } - - public final void isAbstract( final boolean flag ) { + public final void isAbstract(final boolean flag) { setFlag(Const.ACC_ABSTRACT, flag); } - public final boolean isAbstract() { return (access_flags & Const.ACC_ABSTRACT) != 0; } - - public final void isStrictfp( final boolean flag ) { + public final void isStrictfp(final boolean flag) { setFlag(Const.ACC_STRICT, flag); } - public final boolean isStrictfp() { return (access_flags & Const.ACC_STRICT) != 0; } - - public final void isSynthetic( final boolean flag ) { + public final void isSynthetic(final boolean flag) { setFlag(Const.ACC_SYNTHETIC, flag); } - public final boolean isSynthetic() { return (access_flags & Const.ACC_SYNTHETIC) != 0; } - - public final void isAnnotation( final boolean flag ) { + public final void isAnnotation(final boolean flag) { setFlag(Const.ACC_ANNOTATION, flag); } - public final boolean isAnnotation() { return (access_flags & Const.ACC_ANNOTATION) != 0; } - - public final void isEnum( final boolean flag ) { + public final void isEnum(final boolean flag) { setFlag(Const.ACC_ENUM, flag); } - public final boolean isEnum() { return (access_flags & Const.ACC_ENUM) != 0; } + + public final void isVarArgs(final boolean flag) { + setFlag(Const.ACC_VARARGS, flag); + } + + public final boolean isVarArgs() { + return (access_flags & Const.ACC_VARARGS) != 0; + } } -- GitLab From 1a0330f912c0aecdac5a394997932e94a618a4aa Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 17 Jun 2016 17:41:52 +0000 Subject: [PATCH 1170/1313] Use try-with-resources. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748880 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/ElementValueGenTestCase.java | 48 ++++++++----------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java index ac2d88b6..87eb3acf 100644 --- a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java +++ b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java @@ -209,32 +209,24 @@ public class ElementValueGenTestCase extends AbstractTestCase checkSerialize(evg, cp); } - private void checkSerialize(final ElementValueGen evgBefore, final ConstantPoolGen cpg) - { - try - { - String beforeValue = evgBefore.stringifyValue(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(baos); - evgBefore.dump(dos); - dos.flush(); - dos.close(); - byte[] bs = baos.toByteArray(); - ByteArrayInputStream bais = new ByteArrayInputStream(bs); - DataInputStream dis = new DataInputStream(bais); - ElementValueGen evgAfter = ElementValueGen.readElementValue(dis, - cpg); - dis.close(); - String afterValue = evgAfter.stringifyValue(); - if (!beforeValue.equals(afterValue)) - { - fail("Deserialization failed: before='" + beforeValue - + "' after='" + afterValue + "'"); - } - } - catch (IOException ioe) - { - fail("Unexpected exception whilst checking serialization: " + ioe); - } - } + private void checkSerialize(final ElementValueGen evgBefore, final ConstantPoolGen cpg) { + try { + String beforeValue = evgBefore.stringifyValue(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (DataOutputStream dos = new DataOutputStream(baos)) { + evgBefore.dump(dos); + dos.flush(); + } + ElementValueGen evgAfter; + try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(baos.toByteArray()))) { + evgAfter = ElementValueGen.readElementValue(dis, cpg); + } + String afterValue = evgAfter.stringifyValue(); + if (!beforeValue.equals(afterValue)) { + fail("Deserialization failed: before='" + beforeValue + "' after='" + afterValue + "'"); + } + } catch (IOException ioe) { + fail("Unexpected exception whilst checking serialization: " + ioe); + } + } } -- GitLab From bf18ab3679d025b4da88797bb9759f45b1eb00e5 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 17 Jun 2016 17:45:30 +0000 Subject: [PATCH 1171/1313] Format nits. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748882 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/util/BCELifierTestCase.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java index 2132c908..cc45d373 100644 --- a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java +++ b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java @@ -60,23 +60,23 @@ public class BCELifierTestCase { return input; } - private String exec(final File workDir, final String ... args) throws Exception { -// System.err.println(java.util.Arrays.toString(args)); - ProcessBuilder pb = new ProcessBuilder( args ); + private String exec(final File workDir, final String... args) throws Exception { + // System.err.println(java.util.Arrays.toString(args)); + ProcessBuilder pb = new ProcessBuilder(args); pb.directory(workDir); Process proc = pb.start(); BufferedInputStream is = new BufferedInputStream(proc.getInputStream()); InputStream es = proc.getErrorStream(); proc.waitFor(); - byte []buff=new byte[2048]; + byte[] buff = new byte[2048]; int len; - while((len=es.read(buff)) != -1) { - System.err.print(new String(buff,0,len)); + while ((len = es.read(buff)) != -1) { + System.err.print(new String(buff, 0, len)); } - + StringBuilder sb = new StringBuilder(); - while((len=is.read(buff)) != -1) { - sb.append(new String(buff,0,len)); + while ((len = is.read(buff)) != -1) { + sb.append(new String(buff, 0, len)); } is.close(); return sb.toString(); -- GitLab From 7f384e85ea9ad0fc7f4cdcbf9451dece694ac63f Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 17 Jun 2016 17:47:58 +0000 Subject: [PATCH 1172/1313] Use try-with-resources. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748883 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/util/BCELifierTestCase.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java index cc45d373..b401f047 100644 --- a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java +++ b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java @@ -42,10 +42,10 @@ public class BCELifierTestCase { JavaClass java_class = BCELifier.getJavaClass(infile.getName().replace(".class", "")); assertNotNull(java_class); File outfile = new File(workDir, infile.getName().replace(".class", "Creator.java")); - FileOutputStream fos = new FileOutputStream(outfile); - BCELifier bcelifier = new BCELifier(java_class, fos); - bcelifier.start(); - fos.close(); + try (FileOutputStream fos = new FileOutputStream(outfile)) { + BCELifier bcelifier = new BCELifier(java_class, fos); + bcelifier.start(); + } exec(workDir, "javac", "-cp", "classes", outfile.getName()); exec(workDir, "java", "-cp", "." + File.pathSeparator + "classes", outfile.getName().replace(".java", "")); final String output = exec(workDir, "javap", "-p", "-c", infile.getName()); @@ -65,21 +65,21 @@ public class BCELifierTestCase { ProcessBuilder pb = new ProcessBuilder(args); pb.directory(workDir); Process proc = pb.start(); - BufferedInputStream is = new BufferedInputStream(proc.getInputStream()); - InputStream es = proc.getErrorStream(); - proc.waitFor(); - byte[] buff = new byte[2048]; - int len; - while ((len = es.read(buff)) != -1) { - System.err.print(new String(buff, 0, len)); - } + try (BufferedInputStream is = new BufferedInputStream(proc.getInputStream()); + InputStream es = proc.getErrorStream()) { + proc.waitFor(); + byte[] buff = new byte[2048]; + int len; + while ((len = es.read(buff)) != -1) { + System.err.print(new String(buff, 0, len)); + } - StringBuilder sb = new StringBuilder(); - while ((len = is.read(buff)) != -1) { - sb.append(new String(buff, 0, len)); + StringBuilder sb = new StringBuilder(); + while ((len = is.read(buff)) != -1) { + sb.append(new String(buff, 0, len)); + } + return sb.toString(); } - is.close(); - return sb.toString(); } } -- GitLab From 3ad097a555013fb78f35643d2c8c201435aef8f2 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 17 Jun 2016 17:49:38 +0000 Subject: [PATCH 1173/1313] Use try-with-resources. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748884 13f79535-47bb-0310-9956-ffa450edef68 --- src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java b/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java index 031c4e50..42113f77 100644 --- a/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java +++ b/src/test/java/org/apache/bcel/util/Class2HTMLTestCase.java @@ -33,10 +33,11 @@ public class Class2HTMLTestCase extends TestCase { Assert.assertTrue(outputDir.isDirectory()); // fail if missing } - FileInputStream file = new FileInputStream("target/test-classes/Java8Example.class"); + try (FileInputStream file = new FileInputStream("target/test-classes/Java8Example.class")) { - ClassParser parser = new ClassParser(file, "Java8Example.class"); + ClassParser parser = new ClassParser(file, "Java8Example.class"); - new Class2HTML(parser.parse(), outputDir.getAbsolutePath() + "/"); + new Class2HTML(parser.parse(), outputDir.getAbsolutePath() + "/"); + } } } -- GitLab From 0da91a3b68d0ab6c28c89bd03057704c35ddec35 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 17 Jun 2016 17:52:28 +0000 Subject: [PATCH 1174/1313] Use try-with-resources. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748885 13f79535-47bb-0310-9956-ffa450edef68 --- src/test/java/org/apache/bcel/PerformanceTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java index dfa1b9cf..d5c3a62d 100644 --- a/src/test/java/org/apache/bcel/PerformanceTest.java +++ b/src/test/java/org/apache/bcel/PerformanceTest.java @@ -83,9 +83,11 @@ public final class PerformanceTest extends TestCase { while (en.hasMoreElements()) { JarEntry e = (JarEntry) en.nextElement(); if (e.getName().endsWith(".class")) { - InputStream in = jar.getInputStream(e); - byte[] bytes = read(in); - + byte[] bytes; + try (InputStream in = jar.getInputStream(e)) { + bytes = read(in); + } + parseTime.start(); JavaClass clazz = new ClassParser(new ByteArrayInputStream(bytes), e.getName()).parse(); parseTime.stop(); -- GitLab From 4aec5c55ff8bd122cd5d8cf093a595de81bbdce8 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Fri, 17 Jun 2016 17:54:16 +0000 Subject: [PATCH 1175/1313] Use try-with-resources. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748886 13f79535-47bb-0310-9956-ffa450edef68 --- .../bcel/generic/AnnotationGenTestCase.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java b/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java index 68f468e7..1abca694 100644 --- a/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java +++ b/src/test/java/org/apache/bcel/generic/AnnotationGenTestCase.java @@ -124,16 +124,16 @@ public class AnnotationGenTestCase extends AbstractTestCase { String beforeName = a.getTypeName(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(baos); - a.dump(dos); - dos.flush(); - dos.close(); + try (DataOutputStream dos = new DataOutputStream(baos)) { + a.dump(dos); + dos.flush(); + } byte[] bs = baos.toByteArray(); ByteArrayInputStream bais = new ByteArrayInputStream(bs); - DataInputStream dis = new DataInputStream(bais); - AnnotationEntryGen annAfter = AnnotationEntryGen.read(dis, cpg, a - .isRuntimeVisible()); - dis.close(); + AnnotationEntryGen annAfter; + try (DataInputStream dis = new DataInputStream(bais)) { + annAfter = AnnotationEntryGen.read(dis, cpg, a.isRuntimeVisible()); + } String afterName = annAfter.getTypeName(); if (!beforeName.equals(afterName)) { -- GitLab From dc51387cfcd868ea837da2b7d2be87c70bcb8f9a Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 11:04:24 +0000 Subject: [PATCH 1176/1313] Use spaces for indentation git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748963 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/ElementValueGenTestCase.java | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java index 87eb3acf..06ab71e8 100644 --- a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java +++ b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java @@ -210,23 +210,23 @@ public class ElementValueGenTestCase extends AbstractTestCase } private void checkSerialize(final ElementValueGen evgBefore, final ConstantPoolGen cpg) { - try { - String beforeValue = evgBefore.stringifyValue(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - try (DataOutputStream dos = new DataOutputStream(baos)) { - evgBefore.dump(dos); - dos.flush(); - } - ElementValueGen evgAfter; - try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(baos.toByteArray()))) { - evgAfter = ElementValueGen.readElementValue(dis, cpg); - } - String afterValue = evgAfter.stringifyValue(); - if (!beforeValue.equals(afterValue)) { - fail("Deserialization failed: before='" + beforeValue + "' after='" + afterValue + "'"); - } - } catch (IOException ioe) { - fail("Unexpected exception whilst checking serialization: " + ioe); - } - } + try { + String beforeValue = evgBefore.stringifyValue(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (DataOutputStream dos = new DataOutputStream(baos)) { + evgBefore.dump(dos); + dos.flush(); + } + ElementValueGen evgAfter; + try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(baos.toByteArray()))) { + evgAfter = ElementValueGen.readElementValue(dis, cpg); + } + String afterValue = evgAfter.stringifyValue(); + if (!beforeValue.equals(afterValue)) { + fail("Deserialization failed: before='" + beforeValue + "' after='" + afterValue + "'"); + } + } catch (IOException ioe) { + fail("Unexpected exception whilst checking serialization: " + ioe); + } + } } -- GitLab From b24dc73be37f00dc35bb1e41cad90c703c96a13b Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 11:08:04 +0000 Subject: [PATCH 1177/1313] Let JUnit propagate errors instead of translating them into a failure git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748964 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/ElementValueGenTestCase.java | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java index 06ab71e8..107f5d34 100644 --- a/src/test/java/org/apache/bcel/ElementValueGenTestCase.java +++ b/src/test/java/org/apache/bcel/ElementValueGenTestCase.java @@ -43,7 +43,7 @@ public class ElementValueGenTestCase extends AbstractTestCase /** * Create primitive element values */ - public void testCreateIntegerElementValue() + public void testCreateIntegerElementValue() throws Exception { ClassGen cg = createClassGen("HelloWorld"); ConstantPoolGen cp = cg.getConstantPool(); @@ -57,7 +57,7 @@ public class ElementValueGenTestCase extends AbstractTestCase checkSerialize(evg, cp); } - public void testCreateFloatElementValue() + public void testCreateFloatElementValue() throws Exception { ClassGen cg = createClassGen("HelloWorld"); ConstantPoolGen cp = cg.getConstantPool(); @@ -71,7 +71,7 @@ public class ElementValueGenTestCase extends AbstractTestCase checkSerialize(evg, cp); } - public void testCreateDoubleElementValue() + public void testCreateDoubleElementValue() throws Exception { ClassGen cg = createClassGen("HelloWorld"); ConstantPoolGen cp = cg.getConstantPool(); @@ -85,7 +85,7 @@ public class ElementValueGenTestCase extends AbstractTestCase checkSerialize(evg, cp); } - public void testCreateLongElementValue() + public void testCreateLongElementValue() throws Exception { ClassGen cg = createClassGen("HelloWorld"); ConstantPoolGen cp = cg.getConstantPool(); @@ -99,7 +99,7 @@ public class ElementValueGenTestCase extends AbstractTestCase checkSerialize(evg, cp); } - public void testCreateCharElementValue() + public void testCreateCharElementValue() throws Exception { ClassGen cg = createClassGen("HelloWorld"); ConstantPoolGen cp = cg.getConstantPool(); @@ -113,7 +113,7 @@ public class ElementValueGenTestCase extends AbstractTestCase checkSerialize(evg, cp); } - public void testCreateByteElementValue() + public void testCreateByteElementValue() throws Exception { ClassGen cg = createClassGen("HelloWorld"); ConstantPoolGen cp = cg.getConstantPool(); @@ -127,7 +127,7 @@ public class ElementValueGenTestCase extends AbstractTestCase checkSerialize(evg, cp); } - public void testCreateBooleanElementValue() + public void testCreateBooleanElementValue() throws Exception { ClassGen cg = createClassGen("HelloWorld"); ConstantPoolGen cp = cg.getConstantPool(); @@ -141,7 +141,7 @@ public class ElementValueGenTestCase extends AbstractTestCase checkSerialize(evg, cp); } - public void testCreateShortElementValue() + public void testCreateShortElementValue() throws Exception { ClassGen cg = createClassGen("HelloWorld"); ConstantPoolGen cp = cg.getConstantPool(); @@ -157,7 +157,7 @@ public class ElementValueGenTestCase extends AbstractTestCase // // // Create string element values - public void testCreateStringElementValue() + public void testCreateStringElementValue() throws Exception { // Create HelloWorld ClassGen cg = createClassGen("HelloWorld"); @@ -174,7 +174,7 @@ public class ElementValueGenTestCase extends AbstractTestCase // // // Create enum element value - public void testCreateEnumElementValue() + public void testCreateEnumElementValue() throws Exception { ClassGen cg = createClassGen("HelloWorld"); ConstantPoolGen cp = cg.getConstantPool(); @@ -198,7 +198,7 @@ public class ElementValueGenTestCase extends AbstractTestCase // // // Create class element value - public void testCreateClassElementValue() + public void testCreateClassElementValue() throws Exception { ClassGen cg = createClassGen("HelloWorld"); ConstantPoolGen cp = cg.getConstantPool(); @@ -209,24 +209,20 @@ public class ElementValueGenTestCase extends AbstractTestCase checkSerialize(evg, cp); } - private void checkSerialize(final ElementValueGen evgBefore, final ConstantPoolGen cpg) { - try { - String beforeValue = evgBefore.stringifyValue(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - try (DataOutputStream dos = new DataOutputStream(baos)) { - evgBefore.dump(dos); - dos.flush(); - } - ElementValueGen evgAfter; - try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(baos.toByteArray()))) { - evgAfter = ElementValueGen.readElementValue(dis, cpg); - } - String afterValue = evgAfter.stringifyValue(); - if (!beforeValue.equals(afterValue)) { - fail("Deserialization failed: before='" + beforeValue + "' after='" + afterValue + "'"); - } - } catch (IOException ioe) { - fail("Unexpected exception whilst checking serialization: " + ioe); + private void checkSerialize(final ElementValueGen evgBefore, final ConstantPoolGen cpg) throws IOException { + String beforeValue = evgBefore.stringifyValue(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (DataOutputStream dos = new DataOutputStream(baos)) { + evgBefore.dump(dos); + dos.flush(); + } + ElementValueGen evgAfter; + try (DataInputStream dis = new DataInputStream(new ByteArrayInputStream(baos.toByteArray()))) { + evgAfter = ElementValueGen.readElementValue(dis, cpg); + } + String afterValue = evgAfter.stringifyValue(); + if (!beforeValue.equals(afterValue)) { + fail("Deserialization failed: before='" + beforeValue + "' after='" + afterValue + "'"); } } } -- GitLab From 4bcb80f4c671357b20f72fd3b42da046b7a71fdc Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 11:15:47 +0000 Subject: [PATCH 1178/1313] Fix wrong link git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748965 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/index.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/site/xdoc/index.xml b/src/site/xdoc/index.xml index 0bd79ccd..7079cdf5 100644 --- a/src/site/xdoc/index.xml +++ b/src/site/xdoc/index.xml @@ -80,7 +80,7 @@

    The latest stable release of BCEL is 5.2. You may:

    -- GitLab From c9e3a6928deee99c23c6f74bfb7c3d560da22157 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 11:26:47 +0000 Subject: [PATCH 1179/1313] Drop duplicated information. This is already published on our websites. Side effect: This closes #3 from GitHub. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748967 13f79535-47bb-0310-9956-ffa450edef68 --- README.txt | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/README.txt b/README.txt index 367bcad2..0f83fcca 100644 --- a/README.txt +++ b/README.txt @@ -22,15 +22,3 @@ Running a graphics based verifier to launch one. Again, you may have to resolve a memory issue depending on the classes to verify. - - -Contact - - If you spot a bug in the BCEL or its accompanying verifier "JustIce" please - check with the BCEL mailing list - - http://commons.apache.org/bcel - - or enter the issue into the BCEL bug database - - https://issues.apache.org/jira/browse/BCEL -- GitLab From 6d723105a0f1b64917a7ca2fa93ae5c25d74fcde Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 18 Jun 2016 12:14:42 +0000 Subject: [PATCH 1180/1313] Cannot use inheritDoc for a constructor git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748973 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/classfile/ClassFormatException.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java index 1329cacf..5d9556af 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassFormatException.java +++ b/src/main/java/org/apache/bcel/classfile/ClassFormatException.java @@ -38,7 +38,6 @@ public class ClassFormatException extends RuntimeException { } /** - * {@inheritDoc} * @since 6.0 */ public ClassFormatException(final String message, final Throwable cause) { -- GitLab From 52d7fb64a4535f7797eecdce2d27e20fad39ccea Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 12:25:33 +0000 Subject: [PATCH 1181/1313] Split up the manual into separate pages per topic git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748979 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/site.xml | 8 +- src/site/xdoc/manual.xml | 1680 -------------------- src/site/xdoc/manual/appendix.xml | 357 +++++ src/site/xdoc/manual/application-areas.xml | 146 ++ src/site/xdoc/manual/bcel-api.xml | 645 ++++++++ src/site/xdoc/manual/introduction.xml | 80 + src/site/xdoc/manual/jvm.xml | 502 ++++++ src/site/xdoc/manual/manual.xml | 70 + 8 files changed, 1807 insertions(+), 1681 deletions(-) delete mode 100644 src/site/xdoc/manual.xml create mode 100644 src/site/xdoc/manual/appendix.xml create mode 100644 src/site/xdoc/manual/application-areas.xml create mode 100644 src/site/xdoc/manual/bcel-api.xml create mode 100644 src/site/xdoc/manual/introduction.xml create mode 100644 src/site/xdoc/manual/jvm.xml create mode 100644 src/site/xdoc/manual/manual.xml diff --git a/src/site/site.xml b/src/site/site.xml index f343307f..47a25e1f 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -33,7 +33,13 @@ - + + + + + + + diff --git a/src/site/xdoc/manual.xml b/src/site/xdoc/manual.xml deleted file mode 100644 index d9ab982d..00000000 --- a/src/site/xdoc/manual.xml +++ /dev/null @@ -1,1680 +0,0 @@ - - - - - - Byte Code Engineering Library (BCEL) - - - - -

    -

    - Extensions and improvements of the programming language Java and - its related execution environment (Java Virtual Machine, JVM) are - the subject of a large number of research projects and - proposals. There are projects, for instance, to add parameterized - types to Java, to implement Aspect-Oriented Programming, to - perform sophisticated static analysis, and to improve the run-time - performance. -

    - -

    - Since Java classes are compiled into portable binary class files - (called byte code), it is the most convenient and - platform-independent way to implement these improvements not by - writing a new compiler or changing the JVM, but by transforming - the byte code. These transformations can either be performed - after compile-time, or at load-time. Many programmers are doing - this by implementing their own specialized byte code manipulation - tools, which are, however, restricted in the range of their - re-usability. -

    - -

    - To deal with the necessary class file transformations, we - introduce an API that helps developers to conveniently implement - their transformations. -

    -
    - -
    -

    - The Java language has become - very popular and many research projects deal with further - improvements of the language or its run-time behavior. The - possibility to extend a language with new concepts is surely a - desirable feature, but the implementation issues should be hidden - from the user. Fortunately, the concepts of the Java Virtual - Machine permit the user-transparent implementation of such - extensions with relatively little effort. -

    - -

    - Because the target language of Java is an interpreted language - with a small and easy-to-understand set of instructions (the - byte code), developers can implement and test their - concepts in a very elegant way. One can write a plug-in - replacement for the system's class loader which is - responsible for dynamically loading class files at run-time and - passing the byte code to the Virtual Machine (see section ). - Class loaders may thus be used to intercept the loading process - and transform classes before they get actually executed by the - JVM. While the original class files always remain unaltered, the - behavior of the class loader may be reconfigured for every - execution or instrumented dynamically. -

    - -

    - The BCEL API (Byte Code - Engineering Library), formerly known as JavaClass, is a toolkit - for the static analysis and dynamic creation or transformation of - Java class files. It enables developers to implement the desired - features on a high level of abstraction without handling all the - internal details of the Java class file format and thus - re-inventing the wheel every time. BCEL - is written entirely in Java and freely available under the - terms of the Apache Software License. -

    - -

    - This manual is structured as follows: We give a brief description - of the Java Virtual Machine and the class file format in section 2. Section 3 introduces the BCEL API. Section 4 describes some typical application areas and - example projects. The appendix contains code examples that are to - long to be presented in the main part of this paper. All examples - are included in the down-loadable distribution. -

    - -
    - -
    -

    - Readers already familiar with the Java Virtual Machine and the - Java class file format may want to skip this section and proceed - with section 3. -

    - -

    - Programs written in the Java language are compiled into a portable - binary format called byte code. Every class is - represented by a single class file containing class related data - and byte code instructions. These files are loaded dynamically - into an interpreter (Java - Virtual Machine, aka. JVM) and executed. -

    - -

    - Figure 1 illustrates the procedure of - compiling and executing a Java class: The source file - (HelloWorld.java) is compiled into a Java class file - (HelloWorld.class), loaded by the byte code interpreter - and executed. In order to implement additional features, - researchers may want to transform class files (drawn with bold - lines) before they get actually executed. This application area - is one of the main issues of this article. -

    - -

    - - -
    - Figure 1: Compilation and execution of Java classes
    -

    - -

    - Note that the use of the general term "Java" implies in fact two - meanings: on the one hand, Java as a programming language, on the - other hand, the Java Virtual Machine, which is not necessarily - targeted by the Java language exclusively, but may be used by other - languages as well. We assume the reader to be familiar with - the Java language and to have a general understanding of the - Virtual Machine. -

    - -
    - -
    -

    - Giving a full overview of the design issues of the Java class file - format and the associated byte code instructions is beyond the - scope of this paper. We will just give a brief introduction - covering the details that are necessary for understanding the rest - of this paper. The format of class files and the byte code - instruction set are described in more detail in the Java - Virtual Machine Specification. Especially, we will not deal - with the security constraints that the Java Virtual Machine has to - check at run-time, i.e. the byte code verifier. -

    - -

    - Figure 2 shows a simplified example of the - contents of a Java class file: It starts with a header containing - a "magic number" (0xCAFEBABE) and the version number, - followed by the constant pool, which can be roughly - thought of as the text segment of an executable, the access - rights of the class encoded by a bit mask, a list of - interfaces implemented by the class, lists containing the fields - and methods of the class, and finally the class - attributes, e.g., the SourceFile attribute telling - the name of the source file. Attributes are a way of putting - additional, user-defined information into class file data - structures. For example, a custom class loader may evaluate such - attribute data in order to perform its transformations. The JVM - specification declares that unknown, i.e., user-defined attributes - must be ignored by any Virtual Machine implementation. -

    - -

    - - -
    - Figure 2: Java class file format
    -

    - -

    - Because all of the information needed to dynamically resolve the - symbolic references to classes, fields and methods at run-time is - coded with string constants, the constant pool contains in fact - the largest portion of an average class file, approximately - 60%. In fact, this makes the constant pool an easy target for code - manipulation issues. The byte code instructions themselves just - make up 12%. -

    - -

    - The right upper box shows a "zoomed" excerpt of the constant pool, - while the rounded box below depicts some instructions that are - contained within a method of the example class. These - instructions represent the straightforward translation of the - well-known statement: -

    - -

    - System.out.println("Hello, world"); -

    - -

    - The first instruction loads the contents of the field out - of class java.lang.System onto the operand stack. This is - an instance of the class java.io.PrintStream. The - ldc ("Load constant") pushes a reference to the string - "Hello world" on the stack. The next instruction invokes the - instance method println which takes both values as - parameters (Instance methods always implicitly take an instance - reference as their first argument). -

    - -

    - Instructions, other data structures within the class file and - constants themselves may refer to constants in the constant pool. - Such references are implemented via fixed indexes encoded directly - into the instructions. This is illustrated for some items of the - figure emphasized with a surrounding box. -

    - -

    - For example, the invokevirtual instruction refers to a - MethodRef constant that contains information about the - name of the called method, the signature (i.e., the encoded - argument and return types), and to which class the method belongs. - In fact, as emphasized by the boxed value, the MethodRef - constant itself just refers to other entries holding the real - data, e.g., it refers to a ConstantClass entry containing - a symbolic reference to the class java.io.PrintStream. - To keep the class file compact, such constants are typically - shared by different instructions and other constant pool - entries. Similarly, a field is represented by a Fieldref - constant that includes information about the name, the type and - the containing class of the field. -

    - -

    - The constant pool basically holds the following types of - constants: References to methods, fields and classes, strings, - integers, floats, longs, and doubles. -

    - -
    - -
    -

    - The JVM is a stack-oriented interpreter that creates a local stack - frame of fixed size for every method invocation. The size of the - local stack has to be computed by the compiler. Values may also be - stored intermediately in a frame area containing local - variables which can be used like a set of registers. These - local variables are numbered from 0 to 65535, i.e., you have a - maximum of 65536 of local variables per method. The stack frames - of caller and callee method are overlapping, i.e., the caller - pushes arguments onto the operand stack and the called method - receives them in local variables. -

    - -

    - The byte code instruction set currently consists of 212 - instructions, 44 opcodes are marked as reserved and may be used - for future extensions or intermediate optimizations within the - Virtual Machine. The instruction set can be roughly grouped as - follows: -

    - -

    - Stack operations: Constants can be pushed onto the stack - either by loading them from the constant pool with the - ldc instruction or with special "short-cut" - instructions where the operand is encoded into the instructions, - e.g., iconst_0 or bipush (push byte value). -

    - -

    - Arithmetic operations: The instruction set of the Java - Virtual Machine distinguishes its operand types using different - instructions to operate on values of specific type. Arithmetic - operations starting with i, for example, denote an - integer operation. E.g., iadd that adds two integers - and pushes the result back on the stack. The Java types - boolean, byte, short, and - char are handled as integers by the JVM. -

    - -

    - Control flow: There are branch instructions like - goto, and if_icmpeq, which compares two integers - for equality. There is also a jsr (jump to sub-routine) - and ret pair of instructions that is used to implement - the finally clause of try-catch blocks. - Exceptions may be thrown with the athrow instruction. - Branch targets are coded as offsets from the current byte code - position, i.e., with an integer number. -

    - -

    - Load and store operations for local variables like - iload and istore. There are also array - operations like iastore which stores an integer value - into an array. -

    - -

    - Field access: The value of an instance field may be - retrieved with getfield and written with - putfield. For static fields, there are - getstatic and putstatic counterparts. -

    - -

    - Method invocation: Static Methods may either be called via - invokestatic or be bound virtually with the - invokevirtual instruction. Super class methods and - private methods are invoked with invokespecial. A - special case are interface methods which are invoked with - invokeinterface. -

    - -

    - Object allocation: Class instances are allocated with the - new instruction, arrays of basic type like - int[] with newarray, arrays of references like - String[][] with anewarray or - multianewarray. -

    - -

    - Conversion and type checking: For stack operands of basic - type there exist casting operations like f2i which - converts a float value into an integer. The validity of a type - cast may be checked with checkcast and the - instanceof operator can be directly mapped to the - equally named instruction. -

    - -

    - Most instructions have a fixed length, but there are also some - variable-length instructions: In particular, the - lookupswitch and tableswitch instructions, which - are used to implement switch() statements. Since the - number of case clauses may vary, these instructions - contain a variable number of statements. -

    - -

    - We will not list all byte code instructions here, since these are - explained in detail in the JVM - specification. The opcode names are mostly self-explaining, - so understanding the following code examples should be fairly - intuitive. -

    - -
    - -
    -

    - Non-abstract (and non-native) methods contain an attribute - "Code" that holds the following data: The maximum size of - the method's stack frame, the number of local variables and an - array of byte code instructions. Optionally, it may also contain - information about the names of local variables and source file - line numbers that can be used by a debugger. -

    - -

    - Whenever an exception is raised during execution, the JVM performs - exception handling by looking into a table of exception - handlers. The table marks handlers, i.e., code chunks, to be - responsible for exceptions of certain types that are raised within - a given area of the byte code. When there is no appropriate - handler the exception is propagated back to the caller of the - method. The handler information is itself stored in an attribute - contained within the Code attribute. -

    - -
    - -
    -

    - Targets of branch instructions like goto are encoded as - relative offsets in the array of byte codes. Exception handlers - and local variables refer to absolute addresses within the byte - code. The former contains references to the start and the end of - the try block, and to the instruction handler code. The - latter marks the range in which a local variable is valid, i.e., - its scope. This makes it difficult to insert or delete code areas - on this level of abstraction, since one has to recompute the - offsets every time and update the referring objects. We will see - in section 3.3 how BCEL remedies this restriction. -

    - -
    - -
    -

    - Java is a type-safe language and the information about the types - of fields, local variables, and methods is stored in so called - signatures. These are strings stored in the constant pool - and encoded in a special format. For example the argument and - return types of the main method -

    - -

    - public static void main(String[] argv) -

    - -

    - are represented by the signature -

    - -

    - ([java/lang/String;)V -

    - -

    - Classes are internally represented by strings like - "java/lang/String", basic types like float by an - integer number. Within signatures they are represented by single - characters, e.g., I, for integer. Arrays are denoted with - a [ at the start of the signature. -

    - -
    - -
    -

    - The following example program prompts for a number and prints the - factorial of it. The readLine() method reading from the - standard input may raise an IOException and if a - misspelled number is passed to parseInt() it throws a - NumberFormatException. Thus, the critical area of code - must be encapsulated in a try-catch block. -

    - - - import java.io.*; - - public class Factorial { - private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - - public static int fac(int n) { - return (n == 0) ? 1 : n * fac(n - 1); - } - - public static int readInt() { - int n = 4711; - try { - System.out.print("Please enter a number> "); - n = Integer.parseInt(in.readLine()); - } catch (IOException e1) { - System.err.println(e1); - } catch (NumberFormatException e2) { - System.err.println(e2); - } - return n; - } - - public static void main(String[] argv) { - int n = readInt(); - System.out.println("Factorial of " + n + " is " + fac(n)); - } - } - - -

    - This code example typically compiles to the following chunks of - byte code: -

    - - - 0: iload_0 - 1: ifne #8 - 4: iconst_1 - 5: goto #16 - 8: iload_0 - 9: iload_0 - 10: iconst_1 - 11: isub - 12: invokestatic Factorial.fac (I)I (12) - 15: imul - 16: ireturn - - LocalVariable(start_pc = 0, length = 16, index = 0:int n) - - -

    fac(): - The method fac has only one local variable, the argument - n, stored at index 0. This variable's scope ranges from - the start of the byte code sequence to the very end. If the value - of n (the value fetched with iload_0) is not - equal to 0, the ifne instruction branches to the byte - code at offset 8, otherwise a 1 is pushed onto the operand stack - and the control flow branches to the final return. For ease of - reading, the offsets of the branch instructions, which are - actually relative, are displayed as absolute addresses in these - examples. -

    - -

    - If recursion has to continue, the arguments for the multiplication - (n and fac(n - 1)) are evaluated and the results - pushed onto the operand stack. After the multiplication operation - has been performed the function returns the computed value from - the top of the stack. -

    - - - 0: sipush 4711 - 3: istore_0 - 4: getstatic java.lang.System.out Ljava/io/PrintStream; - 7: ldc "Please enter a number> " - 9: invokevirtual java.io.PrintStream.print (Ljava/lang/String;)V - 12: getstatic Factorial.in Ljava/io/BufferedReader; - 15: invokevirtual java.io.BufferedReader.readLine ()Ljava/lang/String; - 18: invokestatic java.lang.Integer.parseInt (Ljava/lang/String;)I - 21: istore_0 - 22: goto #44 - 25: astore_1 - 26: getstatic java.lang.System.err Ljava/io/PrintStream; - 29: aload_1 - 30: invokevirtual java.io.PrintStream.println (Ljava/lang/Object;)V - 33: goto #44 - 36: astore_1 - 37: getstatic java.lang.System.err Ljava/io/PrintStream; - 40: aload_1 - 41: invokevirtual java.io.PrintStream.println (Ljava/lang/Object;)V - 44: iload_0 - 45: ireturn - - Exception handler(s) = - From To Handler Type - 4 22 25 java.io.IOException(6) - 4 22 36 NumberFormatException(10) - - -

    readInt(): First the local variable n (at index 0) - is initialized to the value 4711. The next instruction, - getstatic, loads the referencs held by the static - System.out field onto the stack. Then a string is loaded - and printed, a number read from the standard input and assigned to - n. -

    - -

    - If one of the called methods (readLine() and - parseInt()) throws an exception, the Java Virtual Machine - calls one of the declared exception handlers, depending on the - type of the exception. The try-clause itself does not - produce any code, it merely defines the range in which the - subsequent handlers are active. In the example, the specified - source code area maps to a byte code area ranging from offset 4 - (inclusive) to 22 (exclusive). If no exception has occurred - ("normal" execution flow) the goto instructions branch - behind the handler code. There the value of n is loaded - and returned. -

    - -

    - The handler for java.io.IOException starts at - offset 25. It simply prints the error and branches back to the - normal execution flow, i.e., as if no exception had occurred. -

    - -
    - -
    -

    - The BCEL API abstracts from - the concrete circumstances of the Java Virtual Machine and how to - read and write binary Java class files. The API mainly consists - of three parts: -

    - -

    - -

      -
    1. A package that contains classes that describe "static" - constraints of class files, i.e., reflects the class file format and - is not intended for byte code modifications. The classes may be - used to read and write class files from or to a file. This is - useful especially for analyzing Java classes without having the - source files at hand. The main data structure is called - JavaClass which contains methods, fields, etc..
    2. - -
    3. A package to dynamically generate or modify - JavaClass or Method objects. It may be used to - insert analysis code, to strip unnecessary information from class - files, or to implement the code generator back-end of a Java - compiler.
    4. - -
    5. Various code examples and utilities like a class file viewer, - a tool to convert class files into HTML, and a converter from - class files to the Jasmin assembly - language.
    6. -
    -

    -
    - -
    -

    - The "static" component of the BCEL API resides in the package - org.apache.bcel.classfile and closely represents class - files. All of the binary components and data structures declared - in the JVM - specification and described in section 2 are mapped to classes. - - Figure 3 shows an UML diagram of the - hierarchy of classes of the BCEL - API. Figure 8 in the appendix also - shows a detailed diagram of the ConstantPool components. -

    - -

    - -
    - Figure 3: UML diagram for the JavaClass API
    -

    - -

    - The top-level data structure is JavaClass, which in most - cases is created by a ClassParser object that is capable - of parsing binary class files. A JavaClass object - basically consists of fields, methods, symbolic references to the - super class and to the implemented interfaces. -

    - -

    - The constant pool serves as some kind of central repository and is - thus of outstanding importance for all components. - ConstantPool objects contain an array of fixed size of - Constant entries, which may be retrieved via the - getConstant() method taking an integer index as argument. - Indexes to the constant pool may be contained in instructions as - well as in other components of a class file and in constant pool - entries themselves. -

    - -

    - Methods and fields contain a signature, symbolically defining - their types. Access flags like public static final occur - in several places and are encoded by an integer bit mask, e.g., - public static final matches to the Java expression -

    - - - int access_flags = ACC_PUBLIC | ACC_STATIC | ACC_FINAL; - -

    - As mentioned in section - 2.1 already, several components may contain attribute - objects: classes, fields, methods, and Code objects - (introduced in section 2.3). The - latter is an attribute itself that contains the actual byte code - array, the maximum stack size, the number of local variables, a - table of handled exceptions, and some optional debugging - information coded as LineNumberTable and - LocalVariableTable attributes. Attributes are in general - specific to some data structure, i.e., no two components share the - same kind of attribute, though this is not explicitly - forbidden. In the figure the Attribute classes are stereotyped - with the component they belong to. -

    - -
    - -
    -

    - Using the provided Repository class, reading class files into - a JavaClass object is quite simple: -

    - - JavaClass clazz = Repository.lookupClass("java.lang.String"); - -

    - The repository also contains methods providing the dynamic equivalent - of the instanceof operator, and other useful routines: -

    - - - if (Repository.instanceOf(clazz, super_class)) { - ... - } - -
    - -
    - -

    - Information within the class file components may be accessed like - Java Beans via intuitive set/get methods. All of them also define - a toString() method so that implementing a simple class - viewer is very easy. In fact all of the examples used here have - been produced this way: -

    - - - System.out.println(clazz); - printCode(clazz.getMethods()); - ... - public static void printCode(Method[] methods) { - for (int i = 0; i < methods.length; i++) { - System.out.println(methods[i]); - - Code code = methods[i].getCode(); - if (code != null) // Non-abstract method - System.out.println(code); - } - } - - -
    - -
    -

    - Last but not least, BCEL - supports the Visitor design pattern, so one can write - visitor objects to traverse and analyze the contents of a class - file. Included in the distribution is a class - JasminVisitor that converts class files into the Jasmin - assembler language. -

    - -
    - -
    -

    - This part of the API (package org.apache.bcel.generic) - supplies an abstraction level for creating or transforming class - files dynamically. It makes the static constraints of Java class - files like the hard-coded byte code addresses "generic". The - generic constant pool, for example, is implemented by the class - ConstantPoolGen which offers methods for adding different - types of constants. Accordingly, ClassGen offers an - interface to add methods, fields, and attributes. - Figure 4 gives an overview of this part of the API. -

    - -

    - - -
    - Figure 4: UML diagram of the ClassGen API
    -

    - -
    - -
    -

    - We abstract from the concrete details of the type signature syntax - (see 2.5) by introducing the - Type class, which is used, for example, by methods to - define their return and argument types. Concrete sub-classes are - BasicType, ObjectType, and ArrayType - which consists of the element type and the number of - dimensions. For commonly used types the class offers some - predefined constants. For example, the method signature of the - main method as shown in - section 2.5 is represented by: -

    - - - Type return_type = Type.VOID; - Type[] arg_types = new Type[] { new ArrayType(Type.STRING, 1) }; - - -

    - Type also contains methods to convert types into textual - signatures and vice versa. The sub-classes contain implementations - of the routines and constraints specified by the Java Language - Specification. -

    -
    - -
    -

    - Fields are represented by FieldGen objects, which may be - freely modified by the user. If they have the access rights - static final, i.e., are constants and of basic type, they - may optionally have an initializing value. -

    - -

    - Generic methods contain methods to add exceptions the method may - throw, local variables, and exception handlers. The latter two are - represented by user-configurable objects as well. Because - exception handlers and local variables contain references to byte - code addresses, they also take the role of an instruction - targeter in our terminology. Instruction targeters contain a - method updateTarget() to redirect a reference. This is - somewhat related to the Observer design pattern. Generic - (non-abstract) methods refer to instruction lists that - consist of instruction objects. References to byte code addresses - are implemented by handles to instruction objects. If the list is - updated the instruction targeters will be informed about it. This - is explained in more detail in the following sections. -

    - -

    - The maximum stack size needed by the method and the maximum number - of local variables used may be set manually or computed via the - setMaxStack() and setMaxLocals() methods - automatically. -

    - -
    - -
    -

    - Modeling instructions as objects may look somewhat odd at first - sight, but in fact enables programmers to obtain a high-level view - upon control flow without handling details like concrete byte code - offsets. Instructions consist of an opcode (sometimes called - tag), their length in bytes and an offset (or index) within the - byte code. Since many instructions are immutable (stack operators, - e.g.), the InstructionConstants interface offers - shareable predefined "fly-weight" constants to use. -

    - -

    - Instructions are grouped via sub-classing, the type hierarchy of - instruction classes is illustrated by (incomplete) figure in the - appendix. The most important family of instructions are the - branch instructions, e.g., goto, that branch to - targets somewhere within the byte code. Obviously, this makes them - candidates for playing an InstructionTargeter role, - too. Instructions are further grouped by the interfaces they - implement, there are, e.g., TypedInstructions that are - associated with a specific type like ldc, or - ExceptionThrower instructions that may raise exceptions - when executed. -

    - -

    - All instructions can be traversed via accept(Visitor v) - methods, i.e., the Visitor design pattern. There is however some - special trick in these methods that allows to merge the handling - of certain instruction groups. The accept() do not only - call the corresponding visit() method, but call - visit() methods of their respective super classes and - implemented interfaces first, i.e., the most specific - visit() call is last. Thus one can group the handling of, - say, all BranchInstructions into one single method. -

    - -

    - For debugging purposes it may even make sense to "invent" your own - instructions. In a sophisticated code generator like the one used - as a backend of the Barat - framework for static analysis one often has to insert - temporary nop (No operation) instructions. When examining - the produced code it may be very difficult to track back where the - nop was actually inserted. One could think of a derived - nop2 instruction that contains additional debugging - information. When the instruction list is dumped to byte code, the - extra data is simply dropped. -

    - -

    - One could also think of new byte code instructions operating on - complex numbers that are replaced by normal byte code upon - load-time or are recognized by a new JVM. -

    - -
    - -
    -

    - An instruction list is implemented by a list of - instruction handles encapsulating instruction objects. - References to instructions in the list are thus not implemented by - direct pointers to instructions but by pointers to instruction - handles. This makes appending, inserting and deleting - areas of code very simple and also allows us to reuse immutable - instruction objects (fly-weight objects). Since we use symbolic - references, computation of concrete byte code offsets does not - need to occur until finalization, i.e., until the user has - finished the process of generating or transforming code. We will - use the term instruction handle and instruction synonymously - throughout the rest of the paper. Instruction handles may contain - additional user-defined data using the addAttribute() - method. -

    - -

    - Appending: One can append instructions or other instruction - lists anywhere to an existing list. The instructions are appended - after the given instruction handle. All append methods return a - new instruction handle which may then be used as the target of a - branch instruction, e.g.: -

    - - - InstructionList il = new InstructionList(); - ... - GOTO g = new GOTO(null); - il.append(g); - ... - // Use immutable fly-weight object - InstructionHandle ih = il.append(InstructionConstants.ACONST_NULL); - g.setTarget(ih); - - -

    - Inserting: Instructions may be inserted anywhere into an - existing list. They are inserted before the given instruction - handle. All insert methods return a new instruction handle which - may then be used as the start address of an exception handler, for - example. -

    - - - InstructionHandle start = il.insert(insertion_point, InstructionConstants.NOP); - ... - mg.addExceptionHandler(start, end, handler, "java.io.IOException"); - - -

    - Deleting: Deletion of instructions is also very - straightforward; all instruction handles and the contained - instructions within a given range are removed from the instruction - list and disposed. The delete() method may however throw - a TargetLostException when there are instruction - targeters still referencing one of the deleted instructions. The - user is forced to handle such exceptions in a try-catch - clause and redirect these references elsewhere. The peep - hole optimizer described in the appendix gives a detailed - example for this. -

    - - - try { - il.delete(first, last); - } catch (TargetLostException e) { - for (InstructionHandle target : e.getTargets()) { - for (InstructionTargeter targeter : target.getTargeters()) { - targeter.updateTarget(target, new_target); - } - } - } - - -

    - Finalizing: When the instruction list is ready to be dumped - to pure byte code, all symbolic references must be mapped to real - byte code offsets. This is done by the getByteCode() - method which is called by default by - MethodGen.getMethod(). Afterwards you should call - dispose() so that the instruction handles can be reused - internally. This helps to improve memory usage. -

    - - - InstructionList il = new InstructionList(); - - ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", - "<generated>", ACC_PUBLIC | ACC_SUPER, - null); - MethodGen mg = new MethodGen(ACC_STATIC | ACC_PUBLIC, - Type.VOID, new Type[] { - new ArrayType(Type.STRING, 1) - }, new String[] { "argv" }, - "main", "HelloWorld", il, cp); - ... - cg.addMethod(mg.getMethod()); - il.dispose(); // Reuse instruction handles of list - - -
    - -
    -

    - Using instruction lists gives us a generic view upon the code: In - Figure 5 we again present the code chunk - of the readInt() method of the factorial example in section - 2.6: The local variables - n and e1 both hold two references to - instructions, defining their scope. There are two gotos - branching to the iload at the end of the method. One of - the exception handlers is displayed, too: it references the start - and the end of the try block and also the exception - handler code. -

    - -

    - - -
    - Figure 5: Instruction list for readInt() method
    -

    - -
    - -
    -

    - To simplify the creation of certain instructions the user can use - the supplied InstructionFactory class which offers a lot - of useful methods to create instructions from - scratch. Alternatively, he can also use compound - instructions: When producing byte code, some patterns - typically occur very frequently, for instance the compilation of - arithmetic or comparison expressions. You certainly do not want - to rewrite the code that translates such expressions into byte - code in every place they may appear. In order to support this, the - BCEL API includes a compound - instruction (an interface with a single - getInstructionList() method). Instances of this class - may be used in any place where normal instructions would occur, - particularly in append operations. -

    - -

    - Example: Pushing constants Pushing constants onto the - operand stack may be coded in different ways. As explained in section 2.2 there are - some "short-cut" instructions that can be used to make the - produced byte code more compact. The smallest instruction to push - a single 1 onto the stack is iconst_1, other - possibilities are bipush (can be used to push values - between -128 and 127), sipush (between -32768 and 32767), - or ldc (load constant from constant pool). -

    - -

    - Instead of repeatedly selecting the most compact instruction in, - say, a switch, one can use the compound PUSH instruction - whenever pushing a constant number or string. It will produce the - appropriate byte code instruction and insert entries into to - constant pool if necessary. -

    - - - InstructionFactory f = new InstructionFactory(class_gen); - InstructionList il = new InstructionList(); - ... - il.append(new PUSH(cp, "Hello, world")); - il.append(new PUSH(cp, 4711)); - ... - il.append(f.createPrintln("Hello World")); - ... - il.append(f.createReturn(type)); - - -
    - -
    -

    - When transforming code, for instance during optimization or when - inserting analysis method calls, one typically searches for - certain patterns of code to perform the transformation at. To - simplify handling such situations BCEL introduces a special feature: - One can search for given code patterns within an instruction list - using regular expressions. In such expressions, - instructions are represented by their opcode names, e.g., - LDC, one may also use their respective super classes, e.g., - "IfInstruction". Meta characters like +, - *, and (..|..) have their usual meanings. Thus, - the expression -

    - - "NOP+(ILOAD|ALOAD)*" - -

    - represents a piece of code consisting of at least one NOP - followed by a possibly empty sequence of ILOAD and - ALOAD instructions. -

    - -

    - The search() method of class - org.apache.bcel.util.InstructionFinder gets a regular - expression and a starting point as arguments and returns an - iterator describing the area of matched instructions. Additional - constraints to the matching area of instructions, which can not be - implemented via regular expressions, may be expressed via code - constraint objects. -

    - -
    - -
    -

    - In Java, boolean values are mapped to 1 and to 0, - respectively. Thus, the simplest way to evaluate boolean - expressions is to push a 1 or a 0 onto the operand stack depending - on the truth value of the expression. But this way, the - subsequent combination of boolean expressions (with - &&, e.g) yields long chunks of code that push - lots of 1s and 0s onto the stack. -

    - -

    - When the code has been finalized these chunks can be optimized - with a peep hole algorithm: An IfInstruction - (e.g. the comparison of two integers: if_icmpeq) that - either produces a 1 or a 0 on the stack and is followed by an - ifne instruction (branch if stack value 0) may be - replaced by the IfInstruction with its branch target - replaced by the target of the ifne instruction: -

    - - - CodeConstraint constraint = new CodeConstraint() { - public boolean checkCode(InstructionHandle[] match) { - IfInstruction if1 = (IfInstruction) match[0].getInstruction(); - GOTO g = (GOTO) match[2].getInstruction(); - return (if1.getTarget() == match[3]) && - (g.getTarget() == match[4]); - } - }; - - InstructionFinder f = new InstructionFinder(il); - String pat = "IfInstruction ICONST_0 GOTO ICONST_1 NOP(IFEQ|IFNE)"; - - for (Iterator e = f.search(pat, constraint); e.hasNext(); ) { - InstructionHandle[] match = (InstructionHandle[]) e.next();; - ... - match[0].setTarget(match[5].getTarget()); // Update target - ... - try { - il.delete(match[1], match[5]); - } catch (TargetLostException ex) { - ... - } - } - - -

    - The applied code constraint object ensures that the matched code - really corresponds to the targeted expression pattern. Subsequent - application of this algorithm removes all unnecessary stack - operations and branch instructions from the byte code. If any of - the deleted instructions is still referenced by an - InstructionTargeter object, the reference has to be - updated in the catch-clause. -

    - -

    - Example application: - The expression: -

    - - - if ((a == null) || (i < 2)) - System.out.println("Ooops"); - - -

    - can be mapped to both of the chunks of byte code shown in figure 6. The left column represents the - unoptimized code while the right column displays the same code - after the peep hole algorithm has been applied: -

    - -

    -

    Byte
    offset
    InstructionArgument
    " + anchor2 + "" + anchor + str + "
    " + anchor2 + "" + anchor + str - + "
    - - - - -
    -5:  aload_0
    -6:  ifnull        #13
    -9:  iconst_0
    -10: goto          #14
    -13: iconst_1
    -14: nop
    -15: ifne          #36
    -18: iload_1
    -19: iconst_2
    -20: if_icmplt     #27
    -23: iconst_0
    -24: goto          #28
    -27: iconst_1
    -28: nop
    -29: ifne          #36
    -32: iconst_0
    -33: goto          #37
    -36: iconst_1
    -37: nop
    -38: ifeq          #52
    -41: getstatic     System.out
    -44: ldc           "Ooops"
    -46: invokevirtual println
    -52: return
    -  
    -10: aload_0
    -11: ifnull        #19
    -14: iload_1
    -15: iconst_2
    -16: if_icmpge     #27
    -19: getstatic     System.out
    -22: ldc           "Ooops"
    -24: invokevirtual println
    -27: return
    -  
    - -

    - -
    - -
    -

    - There are many possible application areas for BCEL ranging from class - browsers, profilers, byte code optimizers, and compilers to - sophisticated run-time analysis tools and extensions to the Java - language. -

    - -

    - Compilers like the Barat compiler use BCEL to implement a byte code - generating back end. Other possible application areas are the - static analysis of byte code or examining the run-time behavior of - classes by inserting calls to profiling methods into the - code. Further examples are extending Java with Eiffel-like - assertions, automated delegation, or with the concepts of Aspect-Oriented Programming.
    A - list of projects using BCEL can - be found here. -

    - -
    - -
    -

    - Class loaders are responsible for loading class files from the - file system or other resources and passing the byte code to the - Virtual Machine. A custom ClassLoader object may be used - to intercept the standard procedure of loading a class, i.e.m the - system class loader, and perform some transformations before - actually passing the byte code to the JVM. -

    - -

    - A possible scenario is described in figure - 7: - During run-time the Virtual Machine requests a custom class loader - to load a given class. But before the JVM actually sees the byte - code, the class loader makes a "side-step" and performs some - transformation to the class. To make sure that the modified byte - code is still valid and does not violate any of the JVM's rules it - is checked by the verifier before the JVM finally executes it. -

    - -

    - - -
    - Figure 7: Class loaders -
    -

    - -

    - Using class loaders is an elegant way of extending the Java - Virtual Machine with new features without actually modifying it. - This concept enables developers to use load-time - reflection to implement their ideas as opposed to the static - reflection supported by the Java - Reflection API. Load-time transformations supply the user with - a new level of abstraction. He is not strictly tied to the static - constraints of the original authors of the classes but may - customize the applications with third-party code in order to - benefit from new features. Such transformations may be executed on - demand and neither interfere with other users, nor alter the - original byte code. In fact, class loaders may even create classes - ad hoc without loading a file at all.
    BCEL has already builtin support for - dynamically creating classes, an example is the ProxyCreator class. -

    - -
    - -
    -

    - The former "Poor Man's Genericity" project that extended Java with - parameterized classes, for example, used BCEL in two places to generate - instances of parameterized classes: During compile-time (with the - standard javac with some slightly changed classes) and at - run-time using a custom class loader. The compiler puts some - additional type information into class files (attributes) which is - evaluated at load-time by the class loader. The class loader - performs some transformations on the loaded class and passes them - to the VM. The following algorithm illustrates how the load method - of the class loader fulfills the request for a parameterized - class, e.g., Stack<String> -

    - -

    -

      -
    1. Search for class Stack, load it, and check for a - certain class attribute containing additional type - information. I.e. the attribute defines the "real" name of the - class, i.e., Stack<A>.
    2. - -
    3. Replace all occurrences and references to the formal type - A with references to the actual type String. For - example the method -
    4. - - - void push(A obj) { ... } - - -

      - becomes -

      - - - void push(String obj) { ... } - - -
    5. Return the resulting class to the Virtual Machine.
    6. -
    -

    - -
    - -
    - -
    -

    - The following program reads a name from the standard input and - prints a friendly "Hello". Since the readLine() method may - throw an IOException it is enclosed by a try-catch - clause. -

    - - - import java.io.*; - - public class HelloWorld { - public static void main(String[] argv) { - BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); - String name = null; - - try { - System.out.print("Please enter your name> "); - name = in.readLine(); - } catch (IOException e) { - return; - } - - System.out.println("Hello, " + name); - } - } - - -

    - We will sketch here how the above Java class can be created from the - scratch using the BCEL API. For - ease of reading we will use textual signatures and not create them - dynamically. For example, the signature -

    - - "(Ljava/lang/String;)Ljava/lang/StringBuffer;" - -

    - actually be created with -

    - - Type.getMethodSignature(Type.STRINGBUFFER, new Type[] { Type.STRING }); - -

    Initialization: - First we create an empty class and an instruction list: -

    - - - ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", - "<generated>", ACC_PUBLIC | ACC_SUPER, null); - ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool - InstructionList il = new InstructionList(); - - -

    -We then create the main method, supplying the method's name and the -symbolic type signature encoded with Type objects. -

    - - - MethodGen mg = new MethodGen(ACC_STATIC | ACC_PUBLIC, // access flags - Type.VOID, // return type - new Type[] { // argument types - new ArrayType(Type.STRING, 1) }, - new String[] { "argv" }, // arg names - "main", "HelloWorld", // method, class - il, cp); - InstructionFactory factory = new InstructionFactory(cg); - - -

    - We now define some often used types: -

    - - - ObjectType i_stream = new ObjectType("java.io.InputStream"); - ObjectType p_stream = new ObjectType("java.io.PrintStream"); - - -

    Create variables in and name: We call - the constructors, i.e., execute - BufferedReader(InputStreamReader(System.in)). The reference - to the BufferedReader object stays on top of the stack and - is stored in the newly allocated in variable. -

    - - - il.append(factory.createNew("java.io.BufferedReader")); - il.append(InstructionConstants.DUP); // Use predefined constant - il.append(factory.createNew("java.io.InputStreamReader")); - il.append(InstructionConstants.DUP); - il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, Constants.GETSTATIC)); - il.append(factory.createInvoke("java.io.InputStreamReader", "<init>", - Type.VOID, new Type[] { i_stream }, - Constants.INVOKESPECIAL)); - il.append(factory.createInvoke("java.io.BufferedReader", "<init>", Type.VOID, - new Type[] {new ObjectType("java.io.Reader")}, - Constants.INVOKESPECIAL)); - - LocalVariableGen lg = mg.addLocalVariable("in", - new ObjectType("java.io.BufferedReader"), null, null); - int in = lg.getIndex(); - lg.setStart(il.append(new ASTORE(in))); // "i" valid from here - - -

    - Create local variable name and initialize it to null. -

    - - - lg = mg.addLocalVariable("name", Type.STRING, null, null); - int name = lg.getIndex(); - il.append(InstructionConstants.ACONST_NULL); - lg.setStart(il.append(new ASTORE(name))); // "name" valid from here - - -

    Create try-catch block: We remember the start of the - block, read a line from the standard input and store it into the - variable name. -

    - - - InstructionHandle try_start = - il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, Constants.GETSTATIC)); - - il.append(new PUSH(cp, "Please enter your name> ")); - il.append(factory.createInvoke("java.io.PrintStream", "print", Type.VOID, - new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); - il.append(new ALOAD(in)); - il.append(factory.createInvoke("java.io.BufferedReader", "readLine", - Type.STRING, Type.NO_ARGS, - Constants.INVOKEVIRTUAL)); - il.append(new ASTORE(name)); - - -

    - Upon normal execution we jump behind exception handler, the target - address is not known yet. -

    - - - GOTO g = new GOTO(null); - InstructionHandle try_end = il.append(g); - - -

    - We add the exception handler which simply returns from the method. -

    - - - InstructionHandle handler = il.append(InstructionConstants.RETURN); - mg.addExceptionHandler(try_start, try_end, handler, "java.io.IOException"); - - -

    - "Normal" code continues, now we can set the branch target of the GOTO. -

    - - - InstructionHandle ih = - il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, Constants.GETSTATIC)); - g.setTarget(ih); - - -

    Printing "Hello": - String concatenation compiles to StringBuffer operations. -

    - - - il.append(factory.createNew(Type.STRINGBUFFER)); - il.append(InstructionConstants.DUP); - il.append(new PUSH(cp, "Hello, ")); - il.append(factory.createInvoke("java.lang.StringBuffer", "<init>", - Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKESPECIAL)); - il.append(new ALOAD(name)); - il.append(factory.createInvoke("java.lang.StringBuffer", "append", - Type.STRINGBUFFER, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); - il.append(factory.createInvoke("java.lang.StringBuffer", "toString", - Type.STRING, Type.NO_ARGS, - Constants.INVOKEVIRTUAL)); - - il.append(factory.createInvoke("java.io.PrintStream", "println", - Type.VOID, new Type[] { Type.STRING }, - Constants.INVOKEVIRTUAL)); - il.append(InstructionConstants.RETURN); - - - -

    Finalization: Finally, we have to set the stack size, - which normally would have to be computed on the fly and add a - default constructor method to the class, which is empty in this - case. -

    - - - mg.setMaxStack(); - cg.addMethod(mg.getMethod()); - il.dispose(); // Allow instruction handles to be reused - cg.addEmptyConstructor(ACC_PUBLIC); - - -

    - Last but not least we dump the JavaClass object to a file. -

    - - - try { - cg.getJavaClass().dump("HelloWorld.class"); - } catch (IOException e) { - System.err.println(e); - } - - -
    - -
    -

    - This class implements a simple peephole optimizer that removes any NOP - instructions from the given class. -

    - - -import java.io.*; - -import java.util.Iterator; -import org.apache.bcel.classfile.*; -import org.apache.bcel.generic.*; -import org.apache.bcel.Repository; -import org.apache.bcel.util.InstructionFinder; - -public class Peephole { - - public static void main(String[] argv) { - try { - // Load the class from CLASSPATH. - JavaClass clazz = Repository.lookupClass(argv[0]); - Method[] methods = clazz.getMethods(); - ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); - - for (int i = 0; i < methods.length; i++) { - if (!(methods[i].isAbstract() || methods[i].isNative())) { - MethodGen mg = new MethodGen(methods[i], clazz.getClassName(), cp); - Method stripped = removeNOPs(mg); - - if (stripped != null) // Any NOPs stripped? - methods[i] = stripped; // Overwrite with stripped method - } - } - - // Dump the class to "class name"_.class - clazz.setConstantPool(cp.getFinalConstantPool()); - clazz.dump(clazz.getClassName() + "_.class"); - } catch (Exception e) { - e.printStackTrace(); - } - } - - private static Method removeNOPs(MethodGen mg) { - InstructionList il = mg.getInstructionList(); - InstructionFinder f = new InstructionFinder(il); - String pat = "NOP+"; // Find at least one NOP - InstructionHandle next = null; - int count = 0; - - for (Iterator iter = f.search(pat); iter.hasNext();) { - InstructionHandle[] match = (InstructionHandle[]) iter.next(); - InstructionHandle first = match[0]; - InstructionHandle last = match[match.length - 1]; - - // Some nasty Java compilers may add NOP at end of method. - if ((next = last.getNext()) == null) { - break; - } - - count += match.length; - - /** - * Delete NOPs and redirect any references to them to the following (non-nop) instruction. - */ - try { - il.delete(first, last); - } catch (TargetLostException e) { - for (InstructionHandle target : e.getTargets()) { - for (InstructionTargeter targeter = target.getTargeters()) { - targeter.updateTarget(target, next); - } - } - } - } - - Method m = null; - - if (count > 0) { - System.out.println("Removed " + count + " NOP instructions from method " + mg.getName()); - m = mg.getMethod(); - } - - il.dispose(); // Reuse instruction handles - return m; - } -} - -
    - -
    -

    - If you want to learn how certain things are generated using BCEL you - can do the following: Write your program with the needed features in - Java and compile it as usual. Then use BCELifier to create - a class that creates that very input class using BCEL.
    - (Think about this sentence for a while, or just try it ...) -

    -
    - -
    - -

    - - -
    - Figure 8: UML diagram for constant pool classes -
    -

    -
    - - diff --git a/src/site/xdoc/manual/appendix.xml b/src/site/xdoc/manual/appendix.xml new file mode 100644 index 00000000..f242005e --- /dev/null +++ b/src/site/xdoc/manual/appendix.xml @@ -0,0 +1,357 @@ + + + + + Appendix + + + +
    + + +

    + The following program reads a name from the standard input and + prints a friendly "Hello". Since the readLine() method may + throw an IOException it is enclosed by a try-catch + clause. +

    + + +import java.io.*; + +public class HelloWorld { + public static void main(String[] argv) { + BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + String name = null; + + try { + System.out.print("Please enter your name> "); + name = in.readLine(); + } catch (IOException e) { + return; + } + + System.out.println("Hello, " + name); + } +} + + +

    + We will sketch here how the above Java class can be created from the + scratch using the BCEL API. For + ease of reading we will use textual signatures and not create them + dynamically. For example, the signature +

    + + "(Ljava/lang/String;)Ljava/lang/StringBuffer;" + +

    + actually be created with +

    + + Type.getMethodSignature(Type.STRINGBUFFER, new Type[] { Type.STRING }); + +

    Initialization: + First we create an empty class and an instruction list: +

    + + +ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", + "<generated>", ACC_PUBLIC | ACC_SUPER, null); +ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool +InstructionList il = new InstructionList(); + + +

    + We then create the main method, supplying the method's name and the + symbolic type signature encoded with Type objects. +

    + + +MethodGen mg = new MethodGen(ACC_STATIC | ACC_PUBLIC, // access flags + Type.VOID, // return type + new Type[] { // argument types + new ArrayType(Type.STRING, 1) }, + new String[] { "argv" }, // arg names + "main", "HelloWorld", // method, class + il, cp); +InstructionFactory factory = new InstructionFactory(cg); + + +

    + We now define some often used types: +

    + + +ObjectType i_stream = new ObjectType("java.io.InputStream"); +ObjectType p_stream = new ObjectType("java.io.PrintStream"); + + +

    Create variables in and name: We call + the constructors, i.e., execute + BufferedReader(InputStreamReader(System.in)). The reference + to the BufferedReader object stays on top of the stack and + is stored in the newly allocated in variable. +

    + + +il.append(factory.createNew("java.io.BufferedReader")); +il.append(InstructionConstants.DUP); // Use predefined constant +il.append(factory.createNew("java.io.InputStreamReader")); +il.append(InstructionConstants.DUP); +il.append(factory.createFieldAccess("java.lang.System", "in", i_stream, Constants.GETSTATIC)); +il.append(factory.createInvoke("java.io.InputStreamReader", "<init>", + Type.VOID, new Type[] { i_stream }, + Constants.INVOKESPECIAL)); +il.append(factory.createInvoke("java.io.BufferedReader", "<init>", Type.VOID, + new Type[] {new ObjectType("java.io.Reader")}, + Constants.INVOKESPECIAL)); + +LocalVariableGen lg = mg.addLocalVariable("in", + new ObjectType("java.io.BufferedReader"), null, null); +int in = lg.getIndex(); +lg.setStart(il.append(new ASTORE(in))); // "i" valid from here + + +

    + Create local variable name and initialize it to null. +

    + + +lg = mg.addLocalVariable("name", Type.STRING, null, null); +int name = lg.getIndex(); +il.append(InstructionConstants.ACONST_NULL); +lg.setStart(il.append(new ASTORE(name))); // "name" valid from here + + +

    Create try-catch block: We remember the start of the + block, read a line from the standard input and store it into the + variable name. +

    + + +InstructionHandle try_start = + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, Constants.GETSTATIC)); + +il.append(new PUSH(cp, "Please enter your name> ")); +il.append(factory.createInvoke("java.io.PrintStream", "print", Type.VOID, + new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); +il.append(new ALOAD(in)); +il.append(factory.createInvoke("java.io.BufferedReader", "readLine", + Type.STRING, Type.NO_ARGS, + Constants.INVOKEVIRTUAL)); +il.append(new ASTORE(name)); + + +

    + Upon normal execution we jump behind exception handler, the target + address is not known yet. +

    + + +GOTO g = new GOTO(null); +InstructionHandle try_end = il.append(g); + + +

    + We add the exception handler which simply returns from the method. +

    + + +InstructionHandle handler = il.append(InstructionConstants.RETURN); +mg.addExceptionHandler(try_start, try_end, handler, "java.io.IOException"); + + +

    + "Normal" code continues, now we can set the branch target of the GOTO. +

    + + +InstructionHandle ih = + il.append(factory.createFieldAccess("java.lang.System", "out", p_stream, Constants.GETSTATIC)); +g.setTarget(ih); + + +

    Printing "Hello": +String concatenation compiles to StringBuffer operations. +

    + + +il.append(factory.createNew(Type.STRINGBUFFER)); +il.append(InstructionConstants.DUP); +il.append(new PUSH(cp, "Hello, ")); +il.append(factory.createInvoke("java.lang.StringBuffer", "<init>", + Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKESPECIAL)); +il.append(new ALOAD(name)); +il.append(factory.createInvoke("java.lang.StringBuffer", "append", + Type.STRINGBUFFER, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); +il.append(factory.createInvoke("java.lang.StringBuffer", "toString", + Type.STRING, Type.NO_ARGS, + Constants.INVOKEVIRTUAL)); + +il.append(factory.createInvoke("java.io.PrintStream", "println", + Type.VOID, new Type[] { Type.STRING }, + Constants.INVOKEVIRTUAL)); +il.append(InstructionConstants.RETURN); + + + +

    Finalization: Finally, we have to set the stack size, + which normally would have to be computed on the fly and add a + default constructor method to the class, which is empty in this + case. +

    + + +mg.setMaxStack(); +cg.addMethod(mg.getMethod()); +il.dispose(); // Allow instruction handles to be reused +cg.addEmptyConstructor(ACC_PUBLIC); + + +

    + Last but not least we dump the JavaClass object to a file. +

    + + +try { + cg.getJavaClass().dump("HelloWorld.class"); +} catch (IOException e) { + System.err.println(e); +} + + +
    + + +

    + This class implements a simple peephole optimizer that removes any NOP + instructions from the given class. +

    + + +import java.io.*; + +import java.util.Iterator; +import org.apache.bcel.classfile.*; +import org.apache.bcel.generic.*; +import org.apache.bcel.Repository; +import org.apache.bcel.util.InstructionFinder; + +public class Peephole { + + public static void main(String[] argv) { + try { + // Load the class from CLASSPATH. + JavaClass clazz = Repository.lookupClass(argv[0]); + Method[] methods = clazz.getMethods(); + ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool()); + + for (int i = 0; i < methods.length; i++) { + if (!(methods[i].isAbstract() || methods[i].isNative())) { + MethodGen mg = new MethodGen(methods[i], clazz.getClassName(), cp); + Method stripped = removeNOPs(mg); + + if (stripped != null) // Any NOPs stripped? + methods[i] = stripped; // Overwrite with stripped method + } + } + + // Dump the class to "class name"_.class + clazz.setConstantPool(cp.getFinalConstantPool()); + clazz.dump(clazz.getClassName() + "_.class"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static Method removeNOPs(MethodGen mg) { + InstructionList il = mg.getInstructionList(); + InstructionFinder f = new InstructionFinder(il); + String pat = "NOP+"; // Find at least one NOP + InstructionHandle next = null; + int count = 0; + + for (Iterator iter = f.search(pat); iter.hasNext();) { + InstructionHandle[] match = (InstructionHandle[]) iter.next(); + InstructionHandle first = match[0]; + InstructionHandle last = match[match.length - 1]; + + // Some nasty Java compilers may add NOP at end of method. + if ((next = last.getNext()) == null) { + break; + } + + count += match.length; + + /** + * Delete NOPs and redirect any references to them to the following (non-nop) instruction. + */ + try { + il.delete(first, last); + } catch (TargetLostException e) { + for (InstructionHandle target : e.getTargets()) { + for (InstructionTargeter targeter = target.getTargeters()) { + targeter.updateTarget(target, next); + } + } + } + } + + Method m = null; + + if (count > 0) { + System.out.println("Removed " + count + " NOP instructions from method " + mg.getName()); + m = mg.getMethod(); + } + + il.dispose(); // Reuse instruction handles + return m; + } +} + +
    + + +

    + If you want to learn how certain things are generated using BCEL you + can do the following: Write your program with the needed features in + Java and compile it as usual. Then use BCELifier to create + a class that creates that very input class using BCEL.
    + (Think about this sentence for a while, or just try it ...) +

    +
    + + + +

    + + +
    + Figure 8: UML diagram for constant pool classes +
    +

    +
    +
    + +
    \ No newline at end of file diff --git a/src/site/xdoc/manual/application-areas.xml b/src/site/xdoc/manual/application-areas.xml new file mode 100644 index 00000000..2f96bca6 --- /dev/null +++ b/src/site/xdoc/manual/application-areas.xml @@ -0,0 +1,146 @@ + + + + + Application areas + + + +
    +

    + There are many possible application areas for BCEL ranging from class + browsers, profilers, byte code optimizers, and compilers to + sophisticated run-time analysis tools and extensions to the Java + language. +

    + +

    + Compilers like the Barat compiler use BCEL to implement a byte code + generating back end. Other possible application areas are the + static analysis of byte code or examining the run-time behavior of + classes by inserting calls to profiling methods into the + code. Further examples are extending Java with Eiffel-like + assertions, automated delegation, or with the concepts of Aspect-Oriented Programming.
    A + list of projects using BCEL can + be found here. +

    + + +

    + Class loaders are responsible for loading class files from the + file system or other resources and passing the byte code to the + Virtual Machine. A custom ClassLoader object may be used + to intercept the standard procedure of loading a class, i.e.m the + system class loader, and perform some transformations before + actually passing the byte code to the JVM. +

    + +

    + A possible scenario is described in figure + 7: + During run-time the Virtual Machine requests a custom class loader + to load a given class. But before the JVM actually sees the byte + code, the class loader makes a "side-step" and performs some + transformation to the class. To make sure that the modified byte + code is still valid and does not violate any of the JVM's rules it + is checked by the verifier before the JVM finally executes it. +

    + +

    + + +
    + Figure 7: Class loaders +
    +

    + +

    + Using class loaders is an elegant way of extending the Java + Virtual Machine with new features without actually modifying it. + This concept enables developers to use load-time + reflection to implement their ideas as opposed to the static + reflection supported by the Java + Reflection API. Load-time transformations supply the user with + a new level of abstraction. He is not strictly tied to the static + constraints of the original authors of the classes but may + customize the applications with third-party code in order to + benefit from new features. Such transformations may be executed on + demand and neither interfere with other users, nor alter the + original byte code. In fact, class loaders may even create classes + ad hoc without loading a file at all.
    BCEL has already builtin support for + dynamically creating classes, an example is the ProxyCreator class. +

    + +
    + + +

    + The former "Poor Man's Genericity" project that extended Java with + parameterized classes, for example, used BCEL in two places to generate + instances of parameterized classes: During compile-time (with the + standard javac with some slightly changed classes) and at + run-time using a custom class loader. The compiler puts some + additional type information into class files (attributes) which is + evaluated at load-time by the class loader. The class loader + performs some transformations on the loaded class and passes them + to the VM. The following algorithm illustrates how the load method + of the class loader fulfills the request for a parameterized + class, e.g., Stack<String> +

    + +

    +

      +
    1. Search for class Stack, load it, and check for a + certain class attribute containing additional type + information. I.e. the attribute defines the "real" name of the + class, i.e., Stack<A>.
    2. + +
    3. Replace all occurrences and references to the formal type + A with references to the actual type String. For + example the method +
    4. + + + void push(A obj) { ... } + + +

      + becomes +

      + + + void push(String obj) { ... } + + +
    5. Return the resulting class to the Virtual Machine.
    6. +
    +

    + +
    +
    + +
    \ No newline at end of file diff --git a/src/site/xdoc/manual/bcel-api.xml b/src/site/xdoc/manual/bcel-api.xml new file mode 100644 index 00000000..8417f1d1 --- /dev/null +++ b/src/site/xdoc/manual/bcel-api.xml @@ -0,0 +1,645 @@ + + + + + The BCEL API + + + +
    +

    + The BCEL API abstracts from + the concrete circumstances of the Java Virtual Machine and how to + read and write binary Java class files. The API mainly consists + of three parts: +

    + +

    + +

      +
    1. A package that contains classes that describe "static" + constraints of class files, i.e., reflects the class file format and + is not intended for byte code modifications. The classes may be + used to read and write class files from or to a file. This is + useful especially for analyzing Java classes without having the + source files at hand. The main data structure is called + JavaClass which contains methods, fields, etc..
    2. + +
    3. A package to dynamically generate or modify + JavaClass or Method objects. It may be used to + insert analysis code, to strip unnecessary information from class + files, or to implement the code generator back-end of a Java + compiler.
    4. + +
    5. Various code examples and utilities like a class file viewer, + a tool to convert class files into HTML, and a converter from + class files to the Jasmin assembly + language.
    6. +
    +

    + + +

    + The "static" component of the BCEL API resides in the package + org.apache.bcel.classfile and closely represents class + files. All of the binary components and data structures declared + in the JVM + specification and described in section 2 are mapped to classes. + + Figure 3 shows an UML diagram of the + hierarchy of classes of the BCEL + API. Figure 8 in the appendix also + shows a detailed diagram of the ConstantPool components. +

    + +

    + +
    + Figure 3: UML diagram for the JavaClass API
    +

    + +

    + The top-level data structure is JavaClass, which in most + cases is created by a ClassParser object that is capable + of parsing binary class files. A JavaClass object + basically consists of fields, methods, symbolic references to the + super class and to the implemented interfaces. +

    + +

    + The constant pool serves as some kind of central repository and is + thus of outstanding importance for all components. + ConstantPool objects contain an array of fixed size of + Constant entries, which may be retrieved via the + getConstant() method taking an integer index as argument. + Indexes to the constant pool may be contained in instructions as + well as in other components of a class file and in constant pool + entries themselves. +

    + +

    + Methods and fields contain a signature, symbolically defining + their types. Access flags like public static final occur + in several places and are encoded by an integer bit mask, e.g., + public static final matches to the Java expression +

    + + + int access_flags = ACC_PUBLIC | ACC_STATIC | ACC_FINAL; + +

    + As mentioned in section + 2.1 already, several components may contain attribute + objects: classes, fields, methods, and Code objects + (introduced in section 2.3). The + latter is an attribute itself that contains the actual byte code + array, the maximum stack size, the number of local variables, a + table of handled exceptions, and some optional debugging + information coded as LineNumberTable and + LocalVariableTable attributes. Attributes are in general + specific to some data structure, i.e., no two components share the + same kind of attribute, though this is not explicitly + forbidden. In the figure the Attribute classes are stereotyped + with the component they belong to. +

    + +
    + + +

    + Using the provided Repository class, reading class files into + a JavaClass object is quite simple: +

    + + JavaClass clazz = Repository.lookupClass("java.lang.String"); + +

    + The repository also contains methods providing the dynamic equivalent + of the instanceof operator, and other useful routines: +

    + + +if (Repository.instanceOf(clazz, super_class)) { + ... +} + + +
    + +

    Accessing class file data

    + +

    + Information within the class file components may be accessed like + Java Beans via intuitive set/get methods. All of them also define + a toString() method so that implementing a simple class + viewer is very easy. In fact all of the examples used here have + been produced this way: +

    + + +System.out.println(clazz); +printCode(clazz.getMethods()); +... +public static void printCode(Method[] methods) { + for (int i = 0; i < methods.length; i++) { + System.out.println(methods[i]); + + Code code = methods[i].getCode(); + if (code != null) // Non-abstract method + System.out.println(code); + } +} + + +

    Analyzing class data

    +

    + Last but not least, BCEL + supports the Visitor design pattern, so one can write + visitor objects to traverse and analyze the contents of a class + file. Included in the distribution is a class + JasminVisitor that converts class files into the Jasmin + assembler language. +

    + + +

    + This part of the API (package org.apache.bcel.generic) + supplies an abstraction level for creating or transforming class + files dynamically. It makes the static constraints of Java class + files like the hard-coded byte code addresses "generic". The + generic constant pool, for example, is implemented by the class + ConstantPoolGen which offers methods for adding different + types of constants. Accordingly, ClassGen offers an + interface to add methods, fields, and attributes. + Figure 4 gives an overview of this part of the API. +

    + +

    + + +
    + Figure 4: UML diagram of the ClassGen API
    +

    + +

    Types

    +

    + We abstract from the concrete details of the type signature syntax + (see 2.5) by introducing the + Type class, which is used, for example, by methods to + define their return and argument types. Concrete sub-classes are + BasicType, ObjectType, and ArrayType + which consists of the element type and the number of + dimensions. For commonly used types the class offers some + predefined constants. For example, the method signature of the + main method as shown in + section 2.5 is represented by: +

    + + +Type return_type = Type.VOID; +Type[] arg_types = new Type[] { new ArrayType(Type.STRING, 1) }; + + +

    + Type also contains methods to convert types into textual + signatures and vice versa. The sub-classes contain implementations + of the routines and constraints specified by the Java Language + Specification. +

    + +

    Generic fields and methods

    +

    + Fields are represented by FieldGen objects, which may be + freely modified by the user. If they have the access rights + static final, i.e., are constants and of basic type, they + may optionally have an initializing value. +

    + +

    + Generic methods contain methods to add exceptions the method may + throw, local variables, and exception handlers. The latter two are + represented by user-configurable objects as well. Because + exception handlers and local variables contain references to byte + code addresses, they also take the role of an instruction + targeter in our terminology. Instruction targeters contain a + method updateTarget() to redirect a reference. This is + somewhat related to the Observer design pattern. Generic + (non-abstract) methods refer to instruction lists that + consist of instruction objects. References to byte code addresses + are implemented by handles to instruction objects. If the list is + updated the instruction targeters will be informed about it. This + is explained in more detail in the following sections. +

    + +

    + The maximum stack size needed by the method and the maximum number + of local variables used may be set manually or computed via the + setMaxStack() and setMaxLocals() methods + automatically. +

    + +

    Instructions

    +

    + Modeling instructions as objects may look somewhat odd at first + sight, but in fact enables programmers to obtain a high-level view + upon control flow without handling details like concrete byte code + offsets. Instructions consist of an opcode (sometimes called + tag), their length in bytes and an offset (or index) within the + byte code. Since many instructions are immutable (stack operators, + e.g.), the InstructionConstants interface offers + shareable predefined "fly-weight" constants to use. +

    + +

    + Instructions are grouped via sub-classing, the type hierarchy of + instruction classes is illustrated by (incomplete) figure in the + appendix. The most important family of instructions are the + branch instructions, e.g., goto, that branch to + targets somewhere within the byte code. Obviously, this makes them + candidates for playing an InstructionTargeter role, + too. Instructions are further grouped by the interfaces they + implement, there are, e.g., TypedInstructions that are + associated with a specific type like ldc, or + ExceptionThrower instructions that may raise exceptions + when executed. +

    + +

    + All instructions can be traversed via accept(Visitor v) + methods, i.e., the Visitor design pattern. There is however some + special trick in these methods that allows to merge the handling + of certain instruction groups. The accept() do not only + call the corresponding visit() method, but call + visit() methods of their respective super classes and + implemented interfaces first, i.e., the most specific + visit() call is last. Thus one can group the handling of, + say, all BranchInstructions into one single method. +

    + +

    + For debugging purposes it may even make sense to "invent" your own + instructions. In a sophisticated code generator like the one used + as a backend of the Barat + framework for static analysis one often has to insert + temporary nop (No operation) instructions. When examining + the produced code it may be very difficult to track back where the + nop was actually inserted. One could think of a derived + nop2 instruction that contains additional debugging + information. When the instruction list is dumped to byte code, the + extra data is simply dropped. +

    + +

    + One could also think of new byte code instructions operating on + complex numbers that are replaced by normal byte code upon + load-time or are recognized by a new JVM. +

    + +

    Instruction lists

    +

    + An instruction list is implemented by a list of + instruction handles encapsulating instruction objects. + References to instructions in the list are thus not implemented by + direct pointers to instructions but by pointers to instruction + handles. This makes appending, inserting and deleting + areas of code very simple and also allows us to reuse immutable + instruction objects (fly-weight objects). Since we use symbolic + references, computation of concrete byte code offsets does not + need to occur until finalization, i.e., until the user has + finished the process of generating or transforming code. We will + use the term instruction handle and instruction synonymously + throughout the rest of the paper. Instruction handles may contain + additional user-defined data using the addAttribute() + method. +

    + +

    + Appending: One can append instructions or other instruction + lists anywhere to an existing list. The instructions are appended + after the given instruction handle. All append methods return a + new instruction handle which may then be used as the target of a + branch instruction, e.g.: +

    + + +InstructionList il = new InstructionList(); +... +GOTO g = new GOTO(null); +il.append(g); +... +// Use immutable fly-weight object +InstructionHandle ih = il.append(InstructionConstants.ACONST_NULL); +g.setTarget(ih); + + +

    + Inserting: Instructions may be inserted anywhere into an + existing list. They are inserted before the given instruction + handle. All insert methods return a new instruction handle which + may then be used as the start address of an exception handler, for + example. +

    + + +InstructionHandle start = il.insert(insertion_point, InstructionConstants.NOP); +... +mg.addExceptionHandler(start, end, handler, "java.io.IOException"); + + +

    + Deleting: Deletion of instructions is also very + straightforward; all instruction handles and the contained + instructions within a given range are removed from the instruction + list and disposed. The delete() method may however throw + a TargetLostException when there are instruction + targeters still referencing one of the deleted instructions. The + user is forced to handle such exceptions in a try-catch + clause and redirect these references elsewhere. The peep + hole optimizer described in the appendix gives a detailed + example for this. +

    + + +try { + il.delete(first, last); +} catch (TargetLostException e) { + for (InstructionHandle target : e.getTargets()) { + for (InstructionTargeter targeter : target.getTargeters()) { + targeter.updateTarget(target, new_target); + } + } +} + + +

    + Finalizing: When the instruction list is ready to be dumped + to pure byte code, all symbolic references must be mapped to real + byte code offsets. This is done by the getByteCode() + method which is called by default by + MethodGen.getMethod(). Afterwards you should call + dispose() so that the instruction handles can be reused + internally. This helps to improve memory usage. +

    + + +InstructionList il = new InstructionList(); + +ClassGen cg = new ClassGen("HelloWorld", "java.lang.Object", + "<generated>", ACC_PUBLIC | ACC_SUPER, null); +MethodGen mg = new MethodGen(ACC_STATIC | ACC_PUBLIC, + Type.VOID, new Type[] { new ArrayType(Type.STRING, 1) }, + new String[] { "argv" }, "main", "HelloWorld", il, cp); +... +cg.addMethod(mg.getMethod()); +il.dispose(); // Reuse instruction handles of list + + +

    Code example revisited

    +

    + Using instruction lists gives us a generic view upon the code: In + Figure 5 we again present the code chunk + of the readInt() method of the factorial example in section + 2.6: The local variables + n and e1 both hold two references to + instructions, defining their scope. There are two gotos + branching to the iload at the end of the method. One of + the exception handlers is displayed, too: it references the start + and the end of the try block and also the exception + handler code. +

    + +

    + + +
    + Figure 5: Instruction list for readInt() method
    +

    + +

    Instruction factories

    +

    + To simplify the creation of certain instructions the user can use + the supplied InstructionFactory class which offers a lot + of useful methods to create instructions from + scratch. Alternatively, he can also use compound + instructions: When producing byte code, some patterns + typically occur very frequently, for instance the compilation of + arithmetic or comparison expressions. You certainly do not want + to rewrite the code that translates such expressions into byte + code in every place they may appear. In order to support this, the + BCEL API includes a compound + instruction (an interface with a single + getInstructionList() method). Instances of this class + may be used in any place where normal instructions would occur, + particularly in append operations. +

    + +

    + Example: Pushing constants Pushing constants onto the + operand stack may be coded in different ways. As explained in section 2.2 there are + some "short-cut" instructions that can be used to make the + produced byte code more compact. The smallest instruction to push + a single 1 onto the stack is iconst_1, other + possibilities are bipush (can be used to push values + between -128 and 127), sipush (between -32768 and 32767), + or ldc (load constant from constant pool). +

    + +

    + Instead of repeatedly selecting the most compact instruction in, + say, a switch, one can use the compound PUSH instruction + whenever pushing a constant number or string. It will produce the + appropriate byte code instruction and insert entries into to + constant pool if necessary. +

    + + +InstructionFactory f = new InstructionFactory(class_gen); +InstructionList il = new InstructionList(); +... +il.append(new PUSH(cp, "Hello, world")); +il.append(new PUSH(cp, 4711)); +... +il.append(f.createPrintln("Hello World")); +... +il.append(f.createReturn(type)); + + +

    Code patterns using regular expressions

    +

    + When transforming code, for instance during optimization or when + inserting analysis method calls, one typically searches for + certain patterns of code to perform the transformation at. To + simplify handling such situations BCEL introduces a special feature: + One can search for given code patterns within an instruction list + using regular expressions. In such expressions, + instructions are represented by their opcode names, e.g., + LDC, one may also use their respective super classes, e.g., + "IfInstruction". Meta characters like +, + *, and (..|..) have their usual meanings. Thus, + the expression +

    + + "NOP+(ILOAD|ALOAD)*" + +

    + represents a piece of code consisting of at least one NOP + followed by a possibly empty sequence of ILOAD and + ALOAD instructions. +

    + +

    + The search() method of class + org.apache.bcel.util.InstructionFinder gets a regular + expression and a starting point as arguments and returns an + iterator describing the area of matched instructions. Additional + constraints to the matching area of instructions, which can not be + implemented via regular expressions, may be expressed via code + constraint objects. +

    + +

    Example: Optimizing boolean expressions

    +

    + In Java, boolean values are mapped to 1 and to 0, + respectively. Thus, the simplest way to evaluate boolean + expressions is to push a 1 or a 0 onto the operand stack depending + on the truth value of the expression. But this way, the + subsequent combination of boolean expressions (with + &&, e.g) yields long chunks of code that push + lots of 1s and 0s onto the stack. +

    + +

    + When the code has been finalized these chunks can be optimized + with a peep hole algorithm: An IfInstruction + (e.g. the comparison of two integers: if_icmpeq) that + either produces a 1 or a 0 on the stack and is followed by an + ifne instruction (branch if stack value 0) may be + replaced by the IfInstruction with its branch target + replaced by the target of the ifne instruction: +

    + + +CodeConstraint constraint = new CodeConstraint() { + public boolean checkCode(InstructionHandle[] match) { + IfInstruction if1 = (IfInstruction) match[0].getInstruction(); + GOTO g = (GOTO) match[2].getInstruction(); + return (if1.getTarget() == match[3]) && + (g.getTarget() == match[4]); + } +}; + +InstructionFinder f = new InstructionFinder(il); +String pat = "IfInstruction ICONST_0 GOTO ICONST_1 NOP(IFEQ|IFNE)"; + +for (Iterator e = f.search(pat, constraint); e.hasNext(); ) { + InstructionHandle[] match = (InstructionHandle[]) e.next();; + ... + match[0].setTarget(match[5].getTarget()); // Update target + ... + try { + il.delete(match[1], match[5]); + } catch (TargetLostException ex) { + ... + } +} + + +

    + The applied code constraint object ensures that the matched code + really corresponds to the targeted expression pattern. Subsequent + application of this algorithm removes all unnecessary stack + operations and branch instructions from the byte code. If any of + the deleted instructions is still referenced by an + InstructionTargeter object, the reference has to be + updated in the catch-clause. +

    + +

    + Example application: + The expression: +

    + + + if ((a == null) || (i < 2)) + System.out.println("Ooops"); + + +

    + can be mapped to both of the chunks of byte code shown in figure 6. The left column represents the + unoptimized code while the right column displays the same code + after the peep hole algorithm has been applied: +

    + +

    + + + + + +
    +              5:  aload_0
    +              6:  ifnull        #13
    +              9:  iconst_0
    +              10: goto          #14
    +              13: iconst_1
    +              14: nop
    +              15: ifne          #36
    +              18: iload_1
    +              19: iconst_2
    +              20: if_icmplt     #27
    +              23: iconst_0
    +              24: goto          #28
    +              27: iconst_1
    +              28: nop
    +              29: ifne          #36
    +              32: iconst_0
    +              33: goto          #37
    +              36: iconst_1
    +              37: nop
    +              38: ifeq          #52
    +              41: getstatic     System.out
    +              44: ldc           "Ooops"
    +              46: invokevirtual println
    +              52: return
    +            
    +              10: aload_0
    +              11: ifnull        #19
    +              14: iload_1
    +              15: iconst_2
    +              16: if_icmpge     #27
    +              19: getstatic     System.out
    +              22: ldc           "Ooops"
    +              24: invokevirtual println
    +              27: return
    +            
    +
    +

    +
    +
    + +
    \ No newline at end of file diff --git a/src/site/xdoc/manual/introduction.xml b/src/site/xdoc/manual/introduction.xml new file mode 100644 index 00000000..53766bd8 --- /dev/null +++ b/src/site/xdoc/manual/introduction.xml @@ -0,0 +1,80 @@ + + + + + Introduction + + + + +
    +

    + The Java language has become + very popular and many research projects deal with further + improvements of the language or its run-time behavior. The + possibility to extend a language with new concepts is surely a + desirable feature, but the implementation issues should be hidden + from the user. Fortunately, the concepts of the Java Virtual + Machine permit the user-transparent implementation of such + extensions with relatively little effort. +

    + +

    + Because the target language of Java is an interpreted language + with a small and easy-to-understand set of instructions (the + byte code), developers can implement and test their + concepts in a very elegant way. One can write a plug-in + replacement for the system's class loader which is + responsible for dynamically loading class files at run-time and + passing the byte code to the Virtual Machine (see section ). + Class loaders may thus be used to intercept the loading process + and transform classes before they get actually executed by the + JVM. While the original class files always remain unaltered, the + behavior of the class loader may be reconfigured for every + execution or instrumented dynamically. +

    + +

    + The BCEL API (Byte Code + Engineering Library), formerly known as JavaClass, is a toolkit + for the static analysis and dynamic creation or transformation of + Java class files. It enables developers to implement the desired + features on a high level of abstraction without handling all the + internal details of the Java class file format and thus + re-inventing the wheel every time. BCEL + is written entirely in Java and freely available under the + terms of the Apache Software License. +

    + +

    + This manual is structured as follows: We give a brief description + of the Java Virtual Machine and the class file format in section 2. Section 3 + introduces the BCEL API. + Section 4 describes some typical + application areas and example projects. The appendix contains code examples + that are to long to be presented in the main part of this paper. All examples + are included in the down-loadable distribution. +

    +
    + + + +
    \ No newline at end of file diff --git a/src/site/xdoc/manual/jvm.xml b/src/site/xdoc/manual/jvm.xml new file mode 100644 index 00000000..92197518 --- /dev/null +++ b/src/site/xdoc/manual/jvm.xml @@ -0,0 +1,502 @@ + + + + + The Java Virtual Machine + + + +
    +

    + Readers already familiar with the Java Virtual Machine and the + Java class file format may want to skip this section and proceed + with section 3. +

    + +

    + Programs written in the Java language are compiled into a portable + binary format called byte code. Every class is + represented by a single class file containing class related data + and byte code instructions. These files are loaded dynamically + into an interpreter (Java + Virtual Machine, aka. JVM) and executed. +

    + +

    + Figure 1 illustrates the procedure of + compiling and executing a Java class: The source file + (HelloWorld.java) is compiled into a Java class file + (HelloWorld.class), loaded by the byte code interpreter + and executed. In order to implement additional features, + researchers may want to transform class files (drawn with bold + lines) before they get actually executed. This application area + is one of the main issues of this article. +

    + +

    + + +
    + Figure 1: Compilation and execution of Java classes
    +

    + +

    + Note that the use of the general term "Java" implies in fact two + meanings: on the one hand, Java as a programming language, on the + other hand, the Java Virtual Machine, which is not necessarily + targeted by the Java language exclusively, but may be used by other + languages as well. We assume the reader to be familiar with + the Java language and to have a general understanding of the + Virtual Machine. +

    + + +

    + Giving a full overview of the design issues of the Java class file + format and the associated byte code instructions is beyond the + scope of this paper. We will just give a brief introduction + covering the details that are necessary for understanding the rest + of this paper. The format of class files and the byte code + instruction set are described in more detail in the Java + Virtual Machine Specification. Especially, we will not deal + with the security constraints that the Java Virtual Machine has to + check at run-time, i.e. the byte code verifier. +

    + +

    + Figure 2 shows a simplified example of the + contents of a Java class file: It starts with a header containing + a "magic number" (0xCAFEBABE) and the version number, + followed by the constant pool, which can be roughly + thought of as the text segment of an executable, the access + rights of the class encoded by a bit mask, a list of + interfaces implemented by the class, lists containing the fields + and methods of the class, and finally the class + attributes, e.g., the SourceFile attribute telling + the name of the source file. Attributes are a way of putting + additional, user-defined information into class file data + structures. For example, a custom class loader may evaluate such + attribute data in order to perform its transformations. The JVM + specification declares that unknown, i.e., user-defined attributes + must be ignored by any Virtual Machine implementation. +

    + +

    + + +
    + Figure 2: Java class file format
    +

    + +

    + Because all of the information needed to dynamically resolve the + symbolic references to classes, fields and methods at run-time is + coded with string constants, the constant pool contains in fact + the largest portion of an average class file, approximately + 60%. In fact, this makes the constant pool an easy target for code + manipulation issues. The byte code instructions themselves just + make up 12%. +

    + +

    + The right upper box shows a "zoomed" excerpt of the constant pool, + while the rounded box below depicts some instructions that are + contained within a method of the example class. These + instructions represent the straightforward translation of the + well-known statement: +

    + +

    + System.out.println("Hello, world"); +

    + +

    + The first instruction loads the contents of the field out + of class java.lang.System onto the operand stack. This is + an instance of the class java.io.PrintStream. The + ldc ("Load constant") pushes a reference to the string + "Hello world" on the stack. The next instruction invokes the + instance method println which takes both values as + parameters (Instance methods always implicitly take an instance + reference as their first argument). +

    + +

    + Instructions, other data structures within the class file and + constants themselves may refer to constants in the constant pool. + Such references are implemented via fixed indexes encoded directly + into the instructions. This is illustrated for some items of the + figure emphasized with a surrounding box. +

    + +

    + For example, the invokevirtual instruction refers to a + MethodRef constant that contains information about the + name of the called method, the signature (i.e., the encoded + argument and return types), and to which class the method belongs. + In fact, as emphasized by the boxed value, the MethodRef + constant itself just refers to other entries holding the real + data, e.g., it refers to a ConstantClass entry containing + a symbolic reference to the class java.io.PrintStream. + To keep the class file compact, such constants are typically + shared by different instructions and other constant pool + entries. Similarly, a field is represented by a Fieldref + constant that includes information about the name, the type and + the containing class of the field. +

    + +

    + The constant pool basically holds the following types of + constants: References to methods, fields and classes, strings, + integers, floats, longs, and doubles. +

    + +
    + + +

    + The JVM is a stack-oriented interpreter that creates a local stack + frame of fixed size for every method invocation. The size of the + local stack has to be computed by the compiler. Values may also be + stored intermediately in a frame area containing local + variables which can be used like a set of registers. These + local variables are numbered from 0 to 65535, i.e., you have a + maximum of 65536 of local variables per method. The stack frames + of caller and callee method are overlapping, i.e., the caller + pushes arguments onto the operand stack and the called method + receives them in local variables. +

    + +

    + The byte code instruction set currently consists of 212 + instructions, 44 opcodes are marked as reserved and may be used + for future extensions or intermediate optimizations within the + Virtual Machine. The instruction set can be roughly grouped as + follows: +

    + +

    + Stack operations: Constants can be pushed onto the stack + either by loading them from the constant pool with the + ldc instruction or with special "short-cut" + instructions where the operand is encoded into the instructions, + e.g., iconst_0 or bipush (push byte value). +

    + +

    + Arithmetic operations: The instruction set of the Java + Virtual Machine distinguishes its operand types using different + instructions to operate on values of specific type. Arithmetic + operations starting with i, for example, denote an + integer operation. E.g., iadd that adds two integers + and pushes the result back on the stack. The Java types + boolean, byte, short, and + char are handled as integers by the JVM. +

    + +

    + Control flow: There are branch instructions like + goto, and if_icmpeq, which compares two integers + for equality. There is also a jsr (jump to sub-routine) + and ret pair of instructions that is used to implement + the finally clause of try-catch blocks. + Exceptions may be thrown with the athrow instruction. + Branch targets are coded as offsets from the current byte code + position, i.e., with an integer number. +

    + +

    + Load and store operations for local variables like + iload and istore. There are also array + operations like iastore which stores an integer value + into an array. +

    + +

    + Field access: The value of an instance field may be + retrieved with getfield and written with + putfield. For static fields, there are + getstatic and putstatic counterparts. +

    + +

    + Method invocation: Static Methods may either be called via + invokestatic or be bound virtually with the + invokevirtual instruction. Super class methods and + private methods are invoked with invokespecial. A + special case are interface methods which are invoked with + invokeinterface. +

    + +

    + Object allocation: Class instances are allocated with the + new instruction, arrays of basic type like + int[] with newarray, arrays of references like + String[][] with anewarray or + multianewarray. +

    + +

    + Conversion and type checking: For stack operands of basic + type there exist casting operations like f2i which + converts a float value into an integer. The validity of a type + cast may be checked with checkcast and the + instanceof operator can be directly mapped to the + equally named instruction. +

    + +

    + Most instructions have a fixed length, but there are also some + variable-length instructions: In particular, the + lookupswitch and tableswitch instructions, which + are used to implement switch() statements. Since the + number of case clauses may vary, these instructions + contain a variable number of statements. +

    + +

    + We will not list all byte code instructions here, since these are + explained in detail in the JVM + specification. The opcode names are mostly self-explaining, + so understanding the following code examples should be fairly + intuitive. +

    + +
    + + +

    + Non-abstract (and non-native) methods contain an attribute + "Code" that holds the following data: The maximum size of + the method's stack frame, the number of local variables and an + array of byte code instructions. Optionally, it may also contain + information about the names of local variables and source file + line numbers that can be used by a debugger. +

    + +

    + Whenever an exception is raised during execution, the JVM performs + exception handling by looking into a table of exception + handlers. The table marks handlers, i.e., code chunks, to be + responsible for exceptions of certain types that are raised within + a given area of the byte code. When there is no appropriate + handler the exception is propagated back to the caller of the + method. The handler information is itself stored in an attribute + contained within the Code attribute. +

    + +
    + + +

    + Targets of branch instructions like goto are encoded as + relative offsets in the array of byte codes. Exception handlers + and local variables refer to absolute addresses within the byte + code. The former contains references to the start and the end of + the try block, and to the instruction handler code. The + latter marks the range in which a local variable is valid, i.e., + its scope. This makes it difficult to insert or delete code areas + on this level of abstraction, since one has to recompute the + offsets every time and update the referring objects. We will see + in section 3.3 how BCEL remedies this restriction. +

    + +
    + + +

    + Java is a type-safe language and the information about the types + of fields, local variables, and methods is stored in so called + signatures. These are strings stored in the constant pool + and encoded in a special format. For example the argument and + return types of the main method +

    + +

    + public static void main(String[] argv) +

    + +

    + are represented by the signature +

    + +

    + ([java/lang/String;)V +

    + +

    + Classes are internally represented by strings like + "java/lang/String", basic types like float by an + integer number. Within signatures they are represented by single + characters, e.g., I, for integer. Arrays are denoted with + a [ at the start of the signature. +

    + +
    + + +

    + The following example program prompts for a number and prints the + factorial of it. The readLine() method reading from the + standard input may raise an IOException and if a + misspelled number is passed to parseInt() it throws a + NumberFormatException. Thus, the critical area of code + must be encapsulated in a try-catch block. +

    + + +import java.io.*; + +public class Factorial { + private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); + + public static int fac(int n) { + return (n == 0) ? 1 : n * fac(n - 1); + } + + public static int readInt() { + int n = 4711; + try { + System.out.print("Please enter a number> "); + n = Integer.parseInt(in.readLine()); + } catch (IOException e1) { + System.err.println(e1); + } catch (NumberFormatException e2) { + System.err.println(e2); + } + return n; + } + + public static void main(String[] argv) { + int n = readInt(); + System.out.println("Factorial of " + n + " is " + fac(n)); + } +} + + +

    + This code example typically compiles to the following chunks of + byte code: +

    + + + 0: iload_0 + 1: ifne #8 + 4: iconst_1 + 5: goto #16 + 8: iload_0 + 9: iload_0 + 10: iconst_1 + 11: isub + 12: invokestatic Factorial.fac (I)I (12) + 15: imul + 16: ireturn + + LocalVariable(start_pc = 0, length = 16, index = 0:int n) + + +

    fac(): + The method fac has only one local variable, the argument + n, stored at index 0. This variable's scope ranges from + the start of the byte code sequence to the very end. If the value + of n (the value fetched with iload_0) is not + equal to 0, the ifne instruction branches to the byte + code at offset 8, otherwise a 1 is pushed onto the operand stack + and the control flow branches to the final return. For ease of + reading, the offsets of the branch instructions, which are + actually relative, are displayed as absolute addresses in these + examples. +

    + +

    + If recursion has to continue, the arguments for the multiplication + (n and fac(n - 1)) are evaluated and the results + pushed onto the operand stack. After the multiplication operation + has been performed the function returns the computed value from + the top of the stack. +

    + + + 0: sipush 4711 + 3: istore_0 + 4: getstatic java.lang.System.out Ljava/io/PrintStream; + 7: ldc "Please enter a number> " + 9: invokevirtual java.io.PrintStream.print (Ljava/lang/String;)V + 12: getstatic Factorial.in Ljava/io/BufferedReader; + 15: invokevirtual java.io.BufferedReader.readLine ()Ljava/lang/String; + 18: invokestatic java.lang.Integer.parseInt (Ljava/lang/String;)I + 21: istore_0 + 22: goto #44 + 25: astore_1 + 26: getstatic java.lang.System.err Ljava/io/PrintStream; + 29: aload_1 + 30: invokevirtual java.io.PrintStream.println (Ljava/lang/Object;)V + 33: goto #44 + 36: astore_1 + 37: getstatic java.lang.System.err Ljava/io/PrintStream; + 40: aload_1 + 41: invokevirtual java.io.PrintStream.println (Ljava/lang/Object;)V + 44: iload_0 + 45: ireturn + + Exception handler(s) = + From To Handler Type + 4 22 25 java.io.IOException(6) + 4 22 36 NumberFormatException(10) + + +

    readInt(): First the local variable n (at index 0) + is initialized to the value 4711. The next instruction, + getstatic, loads the referencs held by the static + System.out field onto the stack. Then a string is loaded + and printed, a number read from the standard input and assigned to + n. +

    + +

    + If one of the called methods (readLine() and + parseInt()) throws an exception, the Java Virtual Machine + calls one of the declared exception handlers, depending on the + type of the exception. The try-clause itself does not + produce any code, it merely defines the range in which the + subsequent handlers are active. In the example, the specified + source code area maps to a byte code area ranging from offset 4 + (inclusive) to 22 (exclusive). If no exception has occurred + ("normal" execution flow) the goto instructions branch + behind the handler code. There the value of n is loaded + and returned. +

    + +

    + The handler for java.io.IOException starts at + offset 25. It simply prints the error and branches back to the + normal execution flow, i.e., as if no exception had occurred. +

    + +
    +
    + + +
    \ No newline at end of file diff --git a/src/site/xdoc/manual/manual.xml b/src/site/xdoc/manual/manual.xml new file mode 100644 index 00000000..e481f5d4 --- /dev/null +++ b/src/site/xdoc/manual/manual.xml @@ -0,0 +1,70 @@ + + + + + + Byte Code Engineering Library (BCEL) + + + + +
    +

    + Extensions and improvements of the programming language Java and + its related execution environment (Java Virtual Machine, JVM) are + the subject of a large number of research projects and + proposals. There are projects, for instance, to add parameterized + types to Java, to implement Aspect-Oriented Programming, to + perform sophisticated static analysis, and to improve the run-time + performance. +

    + +

    + Since Java classes are compiled into portable binary class files + (called byte code), it is the most convenient and + platform-independent way to implement these improvements not by + writing a new compiler or changing the JVM, but by transforming + the byte code. These transformations can either be performed + after compile-time, or at load-time. Many programmers are doing + this by implementing their own specialized byte code manipulation + tools, which are, however, restricted in the range of their + re-usability. +

    + +

    + To deal with the necessary class file transformations, we + introduce an API that helps developers to conveniently implement + their transformations. +

    +
    + +
    + +
    + + +
    -- GitLab From 2763654ae96df60f6b64833f68c49241daa21b93 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 12:31:05 +0000 Subject: [PATCH 1182/1313] Move remaining content of README.txt to Appendix of BCEL manual git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748982 13f79535-47bb-0310-9956-ffa450edef68 --- README.txt | 24 ----------------------- src/site/xdoc/manual/appendix.xml | 32 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 24 deletions(-) delete mode 100644 README.txt diff --git a/README.txt b/README.txt deleted file mode 100644 index 0f83fcca..00000000 --- a/README.txt +++ /dev/null @@ -1,24 +0,0 @@ -Running a console based verifier - - java org.apache.bcel.verifier.Verifier fully.qualified.class.Name - - lets JustIce work standalone. - If you get a "java.lang.OutOfMemoryError", you should increase the - maximum Java heap space. A command like - - java -Xmx1887436800 org.apache.bcel.verifier.Verifier f.q.c.Name - - will usually resolve the problem. The value above is suitable for - big server machines; if your machine starts swapping to disk, try - to lower the value. - - - -Running a graphics based verifier - - If you prefer a graphical application, you should use a command like - - java org.apache.bcel.verifier.GraphicalVerifier - - to launch one. Again, you may have to resolve a memory issue depending - on the classes to verify. diff --git a/src/site/xdoc/manual/appendix.xml b/src/site/xdoc/manual/appendix.xml index f242005e..4cc459f1 100644 --- a/src/site/xdoc/manual/appendix.xml +++ b/src/site/xdoc/manual/appendix.xml @@ -352,6 +352,38 @@ public class Peephole {

    + + + +

    Running a console based verifier

    + + +java org.apache.bcel.verifier.Verifier fully.qualified.class.Name + + + lets JustIce work standalone. + If you get a "java.lang.OutOfMemoryError", you should increase the + maximum Java heap space. A command like + + +java -Xmx1887436800 org.apache.bcel.verifier.Verifier f.q.c.Name + + + will usually resolve the problem. The value above is suitable for + big server machines; if your machine starts swapping to disk, try + to lower the value. + +

    Running a graphics based verifier

    + + If you prefer a graphical application, you should use a command like + + +java org.apache.bcel.verifier.GraphicalVerifier + + + to launch one. Again, you may have to resolve a memory issue depending + on the classes to verify. +
    \ No newline at end of file -- GitLab From 25232230d98d47fbb2be4648ce776702089ed13d Mon Sep 17 00:00:00 2001 From: Sebastian Bazley Date: Sat, 18 Jun 2016 12:36:47 +0000 Subject: [PATCH 1183/1313] Javadoc fixes git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748987 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Const.java | 26 ++++++++----------- .../java/org/apache/bcel/ExceptionConst.java | 2 +- .../bcel/classfile/DescendingVisitor.java | 26 ------------------- .../apache/bcel/classfile/StackMapEntry.java | 2 +- .../bcel/generic/BranchInstruction.java | 1 - .../apache/bcel/generic/FieldOrMethod.java | 2 +- .../java/org/apache/bcel/generic/Select.java | 2 +- .../java/org/apache/bcel/generic/Type.java | 2 -- .../apache/bcel/util/InstructionFinder.java | 2 +- 9 files changed, 16 insertions(+), 49 deletions(-) diff --git a/src/main/java/org/apache/bcel/Const.java b/src/main/java/org/apache/bcel/Const.java index 69da2784..2833592a 100644 --- a/src/main/java/org/apache/bcel/Const.java +++ b/src/main/java/org/apache/bcel/Const.java @@ -263,9 +263,8 @@ public final class Const { public static final int ACCESS_NAMES_LENGTH = ACCESS_NAMES.length; /** - * * @param index - * @return + * @return the ACCESS_NAMES entry at the given index * @since 6.0 */ public static String getAccessName(final int index) { @@ -363,7 +362,7 @@ public final class Const { /** * * @param index - * @return + * @return the CONSTANT_NAMES entry at the given index * @since 6.0 */ public static String getConstantName(final int index) { @@ -387,9 +386,6 @@ public final class Const { private static final String[] INTERFACES_IMPLEMENTED_BY_ARRAYS = {"java.lang.Cloneable", "java.io.Serializable"}; /** - * - * @param index - * @return * @since 6.0 */ public static Iterable getInterfacesImplementedByArrays() { @@ -1749,7 +1745,7 @@ public final class Const { * The primitive type names corresponding to the T_XX constants, * e.g., TYPE_NAMES[T_INT] = "int" * @param index - * @return + * @return the type name * @since 6.0 */ public static String getTypeName(final int index) { @@ -1771,7 +1767,7 @@ public final class Const { * The primitive class names corresponding to the T_XX constants, * e.g., CLASS_TYPE_NAMES[T_INT] = "java.lang.Integer" * @param index - * @return + * @return the class name * @since 6.0 */ public static String getClassTypeName(final int index) { @@ -1790,7 +1786,7 @@ public final class Const { /** * * @param index - * @return + * @return the short type name * @since 6.0 */ public static String getShortTypeName(final int index) { @@ -1867,7 +1863,7 @@ public final class Const { /** * * @param index - * @return + * @return Number of byte code operands * @since 6.0 */ public static short getNoOfOperands(final int index) { @@ -2081,7 +2077,7 @@ public final class Const { /** * * @param index - * @return + * @return Number of words consumed on operand stack * @since 6.0 */ public static int getConsumeStack(final int index) { @@ -2148,7 +2144,7 @@ public final class Const { /** * * @param index - * @return + * @return Number of words produced onto operand stack * @since 6.0 */ public static int getProduceStack(final int index) { @@ -2197,7 +2193,7 @@ public final class Const { /** * * @param index - * @return + * @return the attribute name * @since 6.0 */ public static String getAttributeName(final int index) { @@ -2224,7 +2220,7 @@ public final class Const { /** * * @param index - * @return + * @return the item name * @since 6.0 */ public static String getItemName(final int index) { @@ -2275,7 +2271,7 @@ public final class Const { /** * * @param index - * @return + * @return the method handle name * @since 6.0 */ public static String getMethodHandleName(final int index) { diff --git a/src/main/java/org/apache/bcel/ExceptionConst.java b/src/main/java/org/apache/bcel/ExceptionConst.java index a8d291a3..1aa304ea 100644 --- a/src/main/java/org/apache/bcel/ExceptionConst.java +++ b/src/main/java/org/apache/bcel/ExceptionConst.java @@ -61,7 +61,7 @@ public final class ExceptionConst { /** * Enum corresponding to the various Exception Class arrays, - * used by {@link ExceptionConstants#createExceptions(EXCS, Class...)} + * used by {@link ExceptionConst#createExceptions(EXCS, Class...)} */ public enum EXCS { EXCS_CLASS_AND_INTERFACE_RESOLUTION, diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index 3740b367..7526c21d 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -248,32 +248,6 @@ public class DescendingVisitor implements Visitor stack.pop(); } - /** - * @since 6.0 - @Override - public void visitStackMapTable(StackMapTable table) - { - stack.push(table); - table.accept(visitor); - StackMapTableEntry[] vars = table.getStackMapTable(); - for (StackMapTableEntry var : vars) { - var.accept(this); - } - stack.pop(); - } - */ - - /** - * @since 6.0 - @Override - public void visitStackMapTableEntry(StackMapTableEntry var) - { - stack.push(var); - var.accept(visitor); - stack.pop(); - } - */ - @Override public void visitLocalVariable(final LocalVariable var) { diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index c9590cda..a7a74a8e 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -323,7 +323,7 @@ public final class StackMapEntry implements Node, Cloneable * entry to the next. Note that this might cause the the * frame type to change. Note also that delta may be negative. * - * @param int offset delta + * @param delta offset delta */ public void updateByteCodeOffset(final int delta) { setByteCodeOffset(byte_code_offset + delta); diff --git a/src/main/java/org/apache/bcel/generic/BranchInstruction.java b/src/main/java/org/apache/bcel/generic/BranchInstruction.java index 2e0ea668..d74512d4 100644 --- a/src/main/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/main/java/org/apache/bcel/generic/BranchInstruction.java @@ -266,7 +266,6 @@ public abstract class BranchInstruction extends Instruction implements Instructi /** * @param position the position to set - * @return the new position * @since 6.0 */ protected void setPosition(final int position) { diff --git a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java index cb9e105f..9392faae 100644 --- a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java @@ -74,7 +74,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { * For code generated by Java 1.5, this answer is * sometimes wrong (e.g., if the "clone()" method is * called on an array). A better idea is to use - * the {@link #getReferenceType()} method, which correctly distinguishes + * the {@link #getReferenceType(ConstantPoolGen)} method, which correctly distinguishes * between class types and array types. * */ diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index 9c85e8a5..00463be8 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -377,7 +377,7 @@ public abstract class Select extends BranchInstruction implements VariableLength /** * - * @return + * @return the padding * @since 6.0 */ final int getPadding() { diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index fb351b0e..bef482e3 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -113,8 +113,6 @@ public abstract class Type { * boolean, short and char variable are considered as int in the stack or local variable area. * Returns {@link Type#INT} for {@link Type#BOOLEAN}, {@link Type#SHORT} or {@link Type#CHAR}, otherwise * returns the given type. - * @see OperandStack#push(Type) - * @see LocalVariables#set(int, Type) * @since 6.0 */ public Type normalizeForStackOrLocal(){ diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index 319b9e6f..adc1370c 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -61,7 +61,7 @@ import org.apache.bcel.generic.InstructionList; * * * @version $Id$ - * @see Instruction + * @see org.apache.bcel.generic.Instruction * @see InstructionList */ public class InstructionFinder { -- GitLab From 8e150172994146a1e8c444a772a75948bf446fad Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 12:40:01 +0000 Subject: [PATCH 1184/1313] Use JaCoCo for measuring test coverage since the Cobertura instrumentation breaks test during site build git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1748990 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 6 ------ src/site/resources/profile.jacoco | 0 2 files changed, 6 deletions(-) create mode 100644 src/site/resources/profile.jacoco diff --git a/pom.xml b/pom.xml index 9ed6c137..cfd9daec 100644 --- a/pom.xml +++ b/pom.xml @@ -346,12 +346,6 @@
    - - - org.codehaus.mojo - cobertura-maven-plugin - 2.7 - org.apache.rat apache-rat-plugin diff --git a/src/site/resources/profile.jacoco b/src/site/resources/profile.jacoco new file mode 100644 index 00000000..e69de29b -- GitLab From 97b832f49f21d24076e6e508fe9dfc3a10920c92 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 13:33:11 +0000 Subject: [PATCH 1185/1313] =?UTF-8?q?Add=20Mark=20Roberts=20and=20J=C3=A9r?= =?UTF-8?q?=C3=B4me=20Leroux=20to=20the=20list=20of=20contributors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749014 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pom.xml b/pom.xml index cfd9daec..6de09ca6 100644 --- a/pom.xml +++ b/pom.xml @@ -159,6 +159,13 @@ First Hop Ltd / Torsten Rueger + + Jérôme Leroux + + + + Mark Roberts + -- GitLab From da12cc07faea1045b8f0fbc46d7b5c1cbdfe7078 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 13:36:50 +0000 Subject: [PATCH 1186/1313] Rewrite RELEASE-NOTES for upcoming release 6.0 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749018 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 335 +++++++++++++++++++++++++++------------------- 1 file changed, 195 insertions(+), 140 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 0b4bd246..9b12c573 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,165 +1,220 @@ - Apache Commons BCEL 6.0 RELEASE NOTES + Apache Commons BCEL + Version 6.0 + RELEASE NOTES -The Apache Commons BCEL team is pleased to announce the commons-bcel6-6.0 release! + +INTRODUCTION: + +The Apache Commons team is pleased to announce the release of +Apache Commons BCEL 6.0! The Byte Code Engineering Library (BCEL) is intended to give users a convenient way to analyze, create, and manipulate compiled .class files. Classes are represented by objects containing all the symbolic information of the given class: methods, fields and byte code instructions. -BCEL 6.0 is a major release supporting the new features introduced in Java 6, 7 -and 8. +Apache Commons BCEL 6.0 is a major release supporting the new features +introduced in Java 6, 7 and 8. It requires Java 7 or higher to run. -Compatibility with 5.2 ----------------------- +COMPATIBILITY with 5.2 +====================== -Binary compatible - No +Binary compatible - not strictly compatible +- The constant interface org.apache.bcel.Constants has been deprecated. Classes + which implemented this interface in 5.2 now use the constants defined in the + org.apache.bcel.Const class. +- The constant interface org.apache.bcel.generic.InstructionConstants has been + deprecated. Classes which implemented this interface in 5.2 now use the + constants defined in the org.apache.bcel.generic.InstructionConsts class. +- Return type of method 'public java.lang.Object getElementAt(int)' in + org.apache.bcel.verifier.VerifierFactoryListModel has been changed to + java.lang.String. +- The BCEL classes do no longer implement java.io.Serializable. Source compatible - Yes, sort of; - - Maven coordinates update: - org.apache.bcel:bcel:5.2 -> org.apache.commons:commons-bcel6:6.0 - - - Rename package imports: - org.apache.bcel -> org.apache.commons.bcel6 - - - The org.apache.commons.bcel6.classfile.Visitor interface has been enhanced with + - The org.apache.bcel.classfile.Visitor interface has been enhanced with additional methods. If you implemented it directly instead of extending the EmptyVisitor class you'll have to implement the new methods. Semantic compatible - Yes, except: - - BCEL handles new attributes such as code annotations that could only + - BCEL 6.0 handles new attributes such as code annotations that could only be processed by implementing a custom AttributeReader in the previous versions. Code relying on this behavior will have to be adjusted since the AttributeReader will no longer be called in these cases. - -------------------------------------------------------------------------------- -Changes in this version include: - - -Fixed Bugs: -o Bug fixes and improvements to InvokeDynamic and BootStrapMethods implementation. - Issue: BCEL-209. Thanks to Mark Roberts. -o Verification error when an invoke references a method defined in superclass. - Issue: BCEL-187. Thanks to Jérôme Leroux. -o Remove ObjectType cache. Issue: BCEL-218. Thanks to chas. -o The verifier now checks if methods with a void return type attempt to return an - object. Issue: BCEL-184. Thanks to Jérôme Leroux. -o The verifier now checks if methods with a void return type attempt to return an - object. Issue: BCEL-184. Thanks to Jérôme Leroux. -o MethodGen.removeLocalVariable now properly unreference the removed variable - from the targetters of the instruction handlers delimiting the scope of - the variable. Issue: BCEL-207. Thanks to Mark Roberts. -o Utility.signatureToString() no longer throws a ClassFormatException on TypeVariables - found in generic signatures. Issue: BCEL-197. Thanks to Mark Roberts. -o Removed the 'index' variable from the LocalVariableGen's hash code. - Issue: BCEL-194. Thanks to Mark Roberts. -o The verifier should not check for run time compatibility of objects assigned to - arrays. Issue: BCEL-193. Thanks to Jérôme Leroux. -o Correct verification of the return value of a method. Issue: BCEL-188. Thanks - to Jérôme Leroux. -o Performance degradation with the UTF8 cache. getInstance no longer uses cache - Issue: BCEL-186. -o org.apache.bcel.util.ClassLoaderRepository.loadClass(String) leaks input streams. - Issue: BCEL-181. -o Mistake in "Peephole optimizer" example at http://commons.apache.org/bcel/manual.html - Issue: BCEL-28. -o BCEL cannot be used as java.system.class.loader Issue: BCEL-74. -o XSLT transforms broken in Turkish Locale. Issue: BCEL-77. -o java.lang.ClassFormatError: LVTT entry for 'local' in class file - org/shiftone/jrat/test/dummy/CrashTestDummy does not match any LVT entry - Issue: BCEL-79. -o ClassParser.parse() throws NullPointerException if class does not exist and - ClassParser(String) constructor is used Issue: BCEL-81. -o ArrayOutOfBoundsException in InstructionFinder Issue: BCEL-85. -o Website: Incorrect URL for source; version 5.2 is not in the bug page - Issue: BCEL-87. -o bcelified method doesn't pass verification Issue: BCEL-88. -o return type not verified by JustIce Issue: BCEL-89. -o @since tag incorrect for Annotation classes in BCEL trunk Issue: BCEL-94. -o InstructionFactory missing % operator for Float, Double Issue: BCEL-95. -o Fields in Annotations and AnnotationEntry are inaccessible to subclasses - Issue: BCEL-96. -o Add support for getResources to ClassPath Issue: BCEL-97. -o Two source files in repository are empty Issue: BCEL-98. -o Maven POM file calls in apache regex but code does not use it Issue: BCEL-99. -o ClassParser throws unintelligible Exception Issue: BCEL-100. -o verifier raises an AssertionViolatedException when done against Java 5 files - with generics/annotations Issue: BCEL-101. -o Verifier fails in pass 2 with "Number of LocalVariableTable attributes of - Code attribute" on static methods. Issue: BCEL-102. -o ParameterAnnotationEntries are read not dumped Issue: BCEL-107. -o RuntimeVisible Annotations duplicated Issue: BCEL-108. -o ARRAYLENGTH incorrectly not StackConsumer Issue: BCEL-112. -o Error in method search() defined in org.apache.bcel.util.InstructionFinder - Issue: BCEL-114. -o Deleting all instructions of a list shows wrong behaviour Issue: BCEL-115. -o Make BCEL JAR OSGi compatible Issue: BCEL-120. -o ArrayIndexOutOfBoundsException thrown from TABLESWITCH.initFromFile - Issue: BCEL-122. -o tableswitch/lookupswitch invalid alignment of 4-byte operands Issue: BCEL-124. -o Incorrect size calculation in InstructionFinder Issue: BCEL-125. -o Class files containing "ParameterAnnotations" are dumped incorrectly - Issue: BCEL-130. -o Class files containing "StackMapTable" attributes (on method code) are dumped - incorrectly Issue: BCEL-131. -o org.apache.bcel.classfile.ClassParser: NullPointerException caused by fileopen - failed Issue: BCEL-132. -o org.apache.bcel.classfile.ClassParser: NullPointerException caused by invalid - filename Issue: BCEL-133. -o ExecutionVisitor doesn't support Class constant type for LDC and LDC_W - Issue: BCEL-134. -o BCELifier issue: BCELFactory fails to handle float and long constants. - Issue: BCEL-135. -o "Invalid method signature: TT;" when using MethodGen for a method having a - generic parameter Issue: BCEL-137. -o FieldInstruction.getFieldSize() doesn't decode Type.getTypeSize() output. - Issue: BCEL-138. -o org.apache.bcel.generic.Instruction.equals(Object) does not follow - Object.equals(Object) rules Issue: BCEL-140. -o Select instructions should implement StackConsumer instead of StackProducer - Issue: BCEL-141. -o Fix CPL License issues with EnclosingMethod.java and - LocalVariableTypeTable.java Issue: BCEL-143. -o Type.getReturnTypeSize() doesn't decode Type.getTypeSize() output. - Issue: BCEL-145. -o SyntheticRepository.loadClass() fails to close the inputStream. - Issue: BCEL-146. -o BCELifier produces incorrect code for methods containing loads of class - literals from constant pool Issue: BCEL-148. -o Code attribute size not updated Issue: BCEL-151. -o Incorrect link for Jasmin assembler language Issue: BCEL-152. -o Examples not present in source or binary downloads Issue: BCEL-153. -o ClassParser.parse() generates NPE if it cannot open the file Issue: BCEL-154. -o InstConstraintVisitor does not handle class constants Issue: BCEL-155. -o Pass3bVerifier crashes on empty methods Issue: BCEL-156. -o LocalVariableGen.getLocalVariable() computes incorrect length Issue: BCEL-159. -o Method does not have a method to access parameter annotations Issue: BCEL-164. -o ClassPath.getResource does not correctly perform URL escaping Issue: BCEL-167. -o ClassParser fails to parse JDK classes in Java 8: ClassFormatException: Invalid - byte tag in constant pool Issue: BCEL-173. -o Verification of interfaces with default methods fails with Java 8 - Issue: BCEL-174. -o When reading the number of parameters in a MethodParameters structure - only read a single byte as per the JVM specification. Issue: BCEL-177. - -Changes: -o Major release of BCEL requires updating package name and maven coordinates. - Issue: BCEL-222. -o Make org.apache.bcel.classfile.ConstantPool.ConstantPool(DataInput) public. - Issue: BCEL-219. Thanks to Maxim Degtyarev. -o Add parent type processing for ClassPath class. Issue: BCEL-76. -o Add support for getResource and getResourceAsStream to ClassPath Issue: BCEL-83. -o Properly parse StackMapTable attributes in Java 6 classfiles Issue: BCEL-92. -o Javadoc overhaul Issue: BCEL-104. -o BCEL is unnecessarily slow Issue: BCEL-119. -o Add support for INVOKEDYNAMIC and MethodHandles Issue: BCEL-157. -o Why using unstable sort at MethodGen.getLocalVariables() ? Issue: BCEL-160. -o Incorporate patch file from Findbugs Issue: BCEL-163. -o Implement the MethodParameters attribute Issue: BCEL-175. +For full information about API changes please see the extended Clirr report: + + http://commons.apache.org/bcel/bcel5-bcel6-clirr-report.html + + +NEW FEATURES: +============= + +o BCEL-272: Add constants for Java 9 class file version 53. + +FIXED BUGS: +=========== + +o BCEL-243: Type.getType() needs to understand TypeVariableSignature(s). +o BCEL-271: FCONST pattern does not include FCONST_2. +o BCEL-264: Add missing Node.accept() implementations (ConstantMethodHandle, + ConstantMethodType, ParameterAnnotationEntry). +o BCEL-221: BCELifier is not working for Java8Example (incomplete). +o BCEL-195: Addition of hashCode() to generic/Instruction.java breaks Targeters. + Never make distinct BranchInstructions compare equal. +o BCEL-261: Select constructor allows partially constructed instance to escape. + Re-ordered code to delay the escape.. +o BCEL-259: Minor doc error in BranchInstruction.java. +o BCEL-260: ClassDumper example duplicates field attribute types. +o BCEL-258: No tests to check the output of dump methods. +o BCEL-257: INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL need to define dump() + methods. +o BCEL-254: Two more methods that would be nice to be public. +o BCEL-245: Type class includes constants that reference subclasses. +o BCEL-253: Pass 3b verifier is too strict. +o BCEL-248: StackMapTable[Entry] should be removed and improvements merged into + StackMap[Entry]. +o BCEL-202: StackMap[Table]Entry.copy() needs to be deep; Improved support for + StackMaps. +o BCEL-251: Pass3aVerifier visitANEWARRAY() does not allow 255 array dimensions. +o BCEL-249: Check for max Short seems wrong. +o BCEL-208: Need to check for an empty InstructionList. +o BCEL-217: long type instructions are not searched by InstructionFinder using + regular expression. +o BCEL-239: Interfaces should not be used to define constants. +o BCEL-234: Code must not swallow Throwable. +o BCEL-209: Bug fixes and improvements to InvokeDynamic and BootStrapMethods + implementation. Thanks to Mark Roberts. +o BCEL-187: Verification error when an invoke references a method defined in + superclass. Thanks to Jérôme Leroux. +o BCEL-218: Remove ObjectType cache. Thanks to chas. +o BCEL-184: The verifier now checks if methods with a void return type attempt + to return an object. Thanks to Jérôme Leroux. +o BCEL-184: The verifier now checks if methods with a void return type attempt + to return an object. Thanks to Jérôme Leroux. +o BCEL-207: MethodGen.removeLocalVariable now properly unreference the removed + variable from the targetters of the instruction handlers delimiting + the scope of the variable. Thanks to Mark Roberts. +o BCEL-197: Utility.signatureToString() no longer throws a ClassFormatException + on TypeVariables found in generic signatures. Thanks to + Mark Roberts. +o BCEL-194: Removed the 'index' variable from the LocalVariableGen's hash code. + Thanks to Mark Roberts. +o BCEL-193: The verifier should not check for run time compatibility of objects + assigned to arrays. Thanks to Jérôme Leroux. +o BCEL-188: Correct verification of the return value of a method. Thanks + to Jérôme Leroux. +o BCEL-186: Performance degradation with the UTF8 cache. getInstance no longer + uses cache. +o BCEL-181: org.apache.bcel.util.ClassLoaderRepository.loadClass(String) leaks + input streams. +o BCEL-28: Mistake in "Peephole optimizer" example + at http://commons.apache.org/bcel/manual.html +o BCEL-74: BCEL cannot be used as java.system.class.loader. +o BCEL-77: XSLT transforms broken in Turkish Locale. +o BCEL-79: java.lang.ClassFormatError: LVTT entry for 'local' in class file + org/shiftone/jrat/test/dummy/CrashTestDummy does not match any LVT + entry +o BCEL-81: ClassParser.parse() throws NullPointerException if class does not + exist and ClassParser(String) constructor is used. +o BCEL-85: ArrayOutOfBoundsException in InstructionFinder. +o BCEL-87: Website: Incorrect URL for source; version 5.2 is not in the bug + page +o BCEL-88: bcelified method doesn't pass verification. +o BCEL-89: return type not verified by JustIce. +o BCEL-94: @since tag incorrect for Annotation classes in BCEL trunk. +o BCEL-95: InstructionFactory missing % operator for Float, Double. +o BCEL-96: Fields in Annotations and AnnotationEntry are inaccessible to + subclasses +o BCEL-97: Add support for getResources to ClassPath. +o BCEL-98: Two source files in repository are empty. +o BCEL-99: Maven POM file calls in apache regex but code does not use it. +o BCEL-100: ClassParser throws unintelligible Exception. +o BCEL-101: verifier raises an AssertionViolatedException when done against + Java 5 files with generics/annotations. +o BCEL-102: Verifier fails in pass 2 with "Number of LocalVariableTable + attributes of Code attribute" on static methods. +o BCEL-107: ParameterAnnotationEntries are read not dumped. +o BCEL-108: RuntimeVisible Annotations duplicated. +o BCEL-112: ARRAYLENGTH incorrectly not StackConsumer. +o BCEL-114: Error in method search() defined in + org.apache.bcel.util.InstructionFinder +o BCEL-115: Deleting all instructions of a list shows wrong behaviour. +o BCEL-120: Make BCEL JAR OSGi compatible. +o BCEL-122: ArrayIndexOutOfBoundsException thrown from TABLESWITCH.initFromFile. +o BCEL-124: tableswitch/lookupswitch invalid alignment of 4-byte operands. +o BCEL-125: Incorrect size calculation in InstructionFinder. +o BCEL-130: Class files containing "ParameterAnnotations" are dumped + incorrectly. +o BCEL-131: Class files containing "StackMapTable" attributes (on method code) + are dumped incorrectly. +o BCEL-132: org.apache.bcel.classfile.ClassParser: NullPointerException caused + by fileopen failed. +o BCEL-133: org.apache.bcel.classfile.ClassParser: NullPointerException caused + by invalid filename. +o BCEL-134: ExecutionVisitor doesn't support Class constant type for LDC and + LDC_W. +o BCEL-135: BCELifier issue: BCELFactory fails to handle float and long + constants. +o BCEL-137: "Invalid method signature: TT;" when using MethodGen for a method + having a generic parameter. +o BCEL-138: FieldInstruction.getFieldSize() doesn't decode Type.getTypeSize() + output. +o BCEL-140: org.apache.bcel.generic.Instruction.equals(Object) does not follow + Object.equals(Object) rules. +o BCEL-141: Select instructions should implement StackConsumer instead of + StackProducer. +o BCEL-143: Fix CPL License issues with EnclosingMethod.java and + LocalVariableTypeTable.java. +o BCEL-145: Type.getReturnTypeSize() doesn't decode Type.getTypeSize() output. +o BCEL-146: SyntheticRepository.loadClass() fails to close the inputStream. +o BCEL-148: BCELifier produces incorrect code for methods containing loads of + class literals from constant pool. +o BCEL-151: Code attribute size not updated. +o BCEL-152: Incorrect link for Jasmin assembler language. +o BCEL-153: Examples not present in source or binary downloads. +o BCEL-154: ClassParser.parse() generates NPE if it cannot open the file. +o BCEL-155: InstConstraintVisitor does not handle class constants. +o BCEL-156: Pass3bVerifier crashes on empty methods. +o BCEL-159: LocalVariableGen.getLocalVariable() computes incorrect length. +o BCEL-164: Method does not have a method to access parameter annotations. +o BCEL-167: ClassPath.getResource does not correctly perform URL escaping. +o BCEL-173: ClassParser fails to parse JDK classes in Java 8: + ClassFormatException: Invalid byte tag in constant pool. +o BCEL-174: Verification of interfaces with default methods fails with Java 8. +o BCEL-177: When reading the number of parameters in a MethodParameters + structure only read a single byte as per the JVM specification. + +CHANGES: +======== + +o BCEL-211: Some additional clone methods should be public. +o BCEL-127: Document that Instruction Factory returns singleton instances. +o BCEL-198: better support for clone/copy methods. +o BCEL-201: modify several toString methods to make output similar to "javap". +o BCEL-205: add javadoc comments to LineNumber.java and LineNumberTable.java. +o BCEL-212: Inconsistent toString() results. +o BCEL-244: Update Java requirement from 5 to 7. +o BCEL-219: Make org.apache.bcel.classfile.ConstantPool.ConstantPool(DataInput) + public. Thanks to Maxim Degtyarev. +o BCEL-76: Add parent type processing for ClassPath class. +o BCEL-83: Add support for getResource and getResourceAsStream to ClassPath. +o BCEL-92: Properly parse StackMapTable attributes in Java 6 classfiles. +o BCEL-104: Javadoc overhaul. +o BCEL-119: BCEL is unnecessarily slow. +o BCEL-157: Add support for INVOKEDYNAMIC and MethodHandles. +o BCEL-160: Why using unstable sort at MethodGen.getLocalVariables() ? +o BCEL-163: Incorporate patch file from Findbugs. +o BCEL-175: Implement the MethodParameters attribute. + +REMOVED: +======== +o BCEL-242: Remove Serializable. +o BCEL-110: Problem with JAXB if the bcel classloader is used; remove the broken + ClassLoader class. Have fun! -- GitLab From a7820fb5f34c5d477200a31f6b09606e08f5343f Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 13:45:15 +0000 Subject: [PATCH 1187/1313] Add a full API diff report (mvn site -Dclirr.allDifferences) comparing BCEL 5.2 with BCEL 6.0 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749023 13f79535-47bb-0310-9956-ffa450edef68 --- .../resources/bcel5-bcel6-clirr-report.html | 2723 +++++++++++++++++ 1 file changed, 2723 insertions(+) create mode 100644 src/site/resources/bcel5-bcel6-clirr-report.html diff --git a/src/site/resources/bcel5-bcel6-clirr-report.html b/src/site/resources/bcel5-bcel6-clirr-report.html new file mode 100644 index 00000000..672198ef --- /dev/null +++ b/src/site/resources/bcel5-bcel6-clirr-report.html @@ -0,0 +1,2723 @@ + + + + + + + + + + Apache Commons BCEL™ – Clirr Results + + + + + + + + + + + + + + + + + + + Apache Commons logo + + + Commons BCEL + +
    + + + +
    + + + + + +
    +
    +

    Clirr Results

    +

    The following document contains the results of Clirr.

    +
      +
    • Current Version: 6.0
    • +
    • Comparison Version: 5.2
    +
    +

    Summary

    + + + + + + + + + + + + +
    SeverityNumber
    Error Error257
    Warning Warning0
    Info Info217
    +
    +

    Details

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SeverityMessageClassMethod / Field
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.AccessFlags
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.Attribute
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.Code
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.CodeException
    ErrorRemoved org.apache.bcel.Constants from the set of implemented interfacesorg.apache.bcel.classfile.CodeException
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.Constant
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantCP
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantClass
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantDouble
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantFieldref
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantFloat
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantInteger
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantInterfaceMethodref
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantLong
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantMethodref
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantNameAndType
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantPool
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantString
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantUtf8
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ConstantValue
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.Deprecated
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.ExceptionTable
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.Field
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.FieldOrMethod
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.InnerClass
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.InnerClasses
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.JavaClass
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.LineNumber
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.LineNumberTable
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.LocalVariable
    ErrorRemoved org.apache.bcel.Constants from the set of implemented interfacesorg.apache.bcel.classfile.LocalVariable
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.LocalVariableTable
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.Method
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.PMGClass
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.Signature
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.SourceFile
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.StackMap
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.Synthetic
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.classfile.Unknown
    ErrorMethod 'public void visitAnnotation(org.apache.bcel.classfile.Annotations)' has been added to an interfaceorg.apache.bcel.classfile.Visitorpublic void visitAnnotation(org.apache.bcel.classfile.Annotations)
    ErrorMethod 'public void visitAnnotationDefault(org.apache.bcel.classfile.AnnotationDefault)' has been added to an interfaceorg.apache.bcel.classfile.Visitorpublic void visitAnnotationDefault(org.apache.bcel.classfile.AnnotationDefault)
    ErrorMethod 'public void visitAnnotationEntry(org.apache.bcel.classfile.AnnotationEntry)' has been added to an interfaceorg.apache.bcel.classfile.Visitorpublic void visitAnnotationEntry(org.apache.bcel.classfile.AnnotationEntry)
    ErrorMethod 'public void visitBootstrapMethods(org.apache.bcel.classfile.BootstrapMethods)' has been added to an interfaceorg.apache.bcel.classfile.Visitorpublic void visitBootstrapMethods(org.apache.bcel.classfile.BootstrapMethods)
    ErrorMethod 'public void visitConstantInvokeDynamic(org.apache.bcel.classfile.ConstantInvokeDynamic)' has been added to an interfaceorg.apache.bcel.classfile.Visitorpublic void visitConstantInvokeDynamic(org.apache.bcel.classfile.ConstantInvokeDynamic)
    ErrorMethod 'public void visitConstantMethodHandle(org.apache.bcel.classfile.ConstantMethodHandle)' has been added to an interfaceorg.apache.bcel.classfile.Visitorpublic void visitConstantMethodHandle(org.apache.bcel.classfile.ConstantMethodHandle)
    ErrorMethod 'public void visitConstantMethodType(org.apache.bcel.classfile.ConstantMethodType)' has been added to an interfaceorg.apache.bcel.classfile.Visitorpublic void visitConstantMethodType(org.apache.bcel.classfile.ConstantMethodType)
    ErrorMethod 'public void visitEnclosingMethod(org.apache.bcel.classfile.EnclosingMethod)' has been added to an interfaceorg.apache.bcel.classfile.Visitorpublic void visitEnclosingMethod(org.apache.bcel.classfile.EnclosingMethod)
    ErrorMethod 'public void visitLocalVariableTypeTable(org.apache.bcel.classfile.LocalVariableTypeTable)' has been added to an interfaceorg.apache.bcel.classfile.Visitorpublic void visitLocalVariableTypeTable(org.apache.bcel.classfile.LocalVariableTypeTable)
    ErrorMethod 'public void visitMethodParameters(org.apache.bcel.classfile.MethodParameters)' has been added to an interfaceorg.apache.bcel.classfile.Visitorpublic void visitMethodParameters(org.apache.bcel.classfile.MethodParameters)
    ErrorMethod 'public void visitParameterAnnotation(org.apache.bcel.classfile.ParameterAnnotations)' has been added to an interfaceorg.apache.bcel.classfile.Visitorpublic void visitParameterAnnotation(org.apache.bcel.classfile.ParameterAnnotations)
    ErrorMethod 'public void visitParameterAnnotationEntry(org.apache.bcel.classfile.ParameterAnnotationEntry)' has been added to an interfaceorg.apache.bcel.classfile.Visitorpublic void visitParameterAnnotationEntry(org.apache.bcel.classfile.ParameterAnnotationEntry)
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.AALOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.AASTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ACONST_NULL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ALOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ANEWARRAY
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ARETURN
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ARRAYLENGTH
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ASTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ATHROW
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ArithmeticInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ArrayInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ArrayType
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.BALOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.BASTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.BIPUSH
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.BREAKPOINT
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.BasicType
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.BranchHandle
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.BranchInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.CALOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.CASTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.CHECKCAST
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.CPInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ClassGen
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.CodeExceptionGen
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ConstantPoolGen
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ConversionInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.D2F
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.D2I
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.D2L
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DADD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DALOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DASTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DCMPG
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DCMPL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DCONST
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DDIV
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DLOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DMUL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DNEG
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DREM
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DRETURN
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DSTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DSUB
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DUP
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DUP2
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DUP2_X1
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DUP2_X2
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DUP_X1
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.DUP_X2
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.F2D
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.F2I
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.F2L
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FADD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FALOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FASTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FCMPG
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FCMPL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FCONST
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FDIV
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FLOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FMUL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FNEG
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FREM
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FRETURN
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FSTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FSUB
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FieldGen
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FieldGenOrMethodGen
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FieldInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.FieldOrMethod
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.GETFIELD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.GETSTATIC
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.GOTO
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.GOTO_W
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.GotoInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.I2B
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.I2C
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.I2D
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.I2F
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.I2L
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.I2S
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IADD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IALOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IAND
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IASTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ICONST
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IDIV
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IFEQ
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IFGE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IFGT
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IFLE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IFLT
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IFNE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IFNONNULL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IFNULL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IF_ACMPEQ
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IF_ACMPNE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IF_ICMPEQ
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IF_ICMPGE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IF_ICMPGT
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IF_ICMPLE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IF_ICMPLT
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IF_ICMPNE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IINC
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ILOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IMPDEP1
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IMPDEP2
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IMUL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.INEG
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.INSTANCEOF
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.INVOKEINTERFACE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.INVOKESPECIAL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.INVOKESTATIC
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.INVOKEVIRTUAL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IOR
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IREM
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IRETURN
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ISHL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ISHR
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ISTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ISUB
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IUSHR
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IXOR
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.IfInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.Instruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.InstructionFactory
    ErrorRemoved org.apache.bcel.generic.InstructionConstants from the set of implemented interfacesorg.apache.bcel.generic.InstructionFactory
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.InstructionHandle
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.InstructionList
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.InvokeInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.JSR
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.JSR_W
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.JsrInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.L2D
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.L2F
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.L2I
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LADD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LALOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LAND
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LASTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LCMP
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LCONST
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LDC
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LDC2_W
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LDC_W
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LDIV
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LLOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LMUL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LNEG
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LOOKUPSWITCH
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LOR
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LREM
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LRETURN
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LSHL
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LSHR
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LSTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LSUB
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LUSHR
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LXOR
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LineNumberGen
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LoadInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LocalVariableGen
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.LocalVariableInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.MONITORENTER
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.MONITOREXIT
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.MULTIANEWARRAY
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.MethodGen
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.NEW
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.NEWARRAY
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.NOP
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ObjectType
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.POP
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.POP2
    ErrorRemoved org.apache.bcel.generic.InstructionConstants from the set of implemented interfacesorg.apache.bcel.generic.PUSH
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.PUTFIELD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.PUTSTATIC
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.RET
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.RETURN
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ReferenceType
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ReturnInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.ReturnaddressType
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.SALOAD
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.SASTORE
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.SIPUSH
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.SWAP
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.Select
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.StackInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.StoreInstruction
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.TABLESWITCH
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.generic.Type
    ErrorMethod 'public void visitINVOKEDYNAMIC(org.apache.bcel.generic.INVOKEDYNAMIC)' has been added to an interfaceorg.apache.bcel.generic.Visitorpublic void visitINVOKEDYNAMIC(org.apache.bcel.generic.INVOKEDYNAMIC)
    ErrorRemoved org.apache.bcel.Constants from the set of implemented interfacesorg.apache.bcel.util.Class2HTML
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.util.ClassLoaderRepository
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.util.ClassPath
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.util.ClassQueue
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.util.ClassSet
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.util.ClassStack
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.util.Repository
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.util.SyntheticRepository
    ErrorReturn type of method 'public java.lang.Object getElementAt(int)' has been changed to java.lang.Stringorg.apache.bcel.verifier.VerifierFactoryListModelpublic java.lang.Object getElementAt(int)
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.verifier.statics.DOUBLE_Upper
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.verifier.statics.LONG_Upper
    ErrorRemoved org.apache.bcel.Constants from the set of implemented interfacesorg.apache.bcel.verifier.statics.Pass2Verifier
    ErrorRemoved java.io.Serializable from the set of implemented interfacesorg.apache.bcel.verifier.structurals.UninitializedObjectType
    ErrorRemoved org.apache.bcel.Constants from the set of implemented interfacesorg.apache.bcel.verifier.structurals.UninitializedObjectType
    InfoClass org.apache.bcel.Const addedorg.apache.bcel.Const
    InfoAdded public field INVOKEDYNAMICorg.apache.bcel.ConstantsINVOKEDYNAMIC
    InfoClass org.apache.bcel.ExceptionConst addedorg.apache.bcel.ExceptionConst
    InfoClass org.apache.bcel.ExceptionConst$EXCS addedorg.apache.bcel.ExceptionConst$EXCS
    InfoMethod 'public void isVarArgs(boolean)' has been addedorg.apache.bcel.classfile.AccessFlagspublic void isVarArgs(boolean)
    InfoMethod 'public boolean isVarArgs()' has been addedorg.apache.bcel.classfile.AccessFlagspublic boolean isVarArgs()
    InfoClass org.apache.bcel.classfile.AnnotationDefault addedorg.apache.bcel.classfile.AnnotationDefault
    InfoClass org.apache.bcel.classfile.AnnotationElementValue addedorg.apache.bcel.classfile.AnnotationElementValue
    InfoClass org.apache.bcel.classfile.AnnotationEntry addedorg.apache.bcel.classfile.AnnotationEntry
    InfoClass org.apache.bcel.classfile.Annotations addedorg.apache.bcel.classfile.Annotations
    InfoClass org.apache.bcel.classfile.ArrayElementValue addedorg.apache.bcel.classfile.ArrayElementValue
    InfoMethod 'public void addAttributeReader(java.lang.String, org.apache.bcel.classfile.AttributeReader)' has been deprecatedorg.apache.bcel.classfile.Attributepublic void addAttributeReader(java.lang.String, org.apache.bcel.classfile.AttributeReader)
    InfoMethod 'public void addAttributeReader(java.lang.String, org.apache.bcel.classfile.UnknownAttributeReader)' has been addedorg.apache.bcel.classfile.Attributepublic void addAttributeReader(java.lang.String, org.apache.bcel.classfile.UnknownAttributeReader)
    InfoMethod 'public java.lang.String getName()' has been addedorg.apache.bcel.classfile.Attributepublic java.lang.String getName()
    InfoMethod 'public org.apache.bcel.classfile.Attribute readAttribute(java.io.DataInputStream, org.apache.bcel.classfile.ConstantPool)' is no longer finalorg.apache.bcel.classfile.Attributepublic org.apache.bcel.classfile.Attribute readAttribute(java.io.DataInputStream, org.apache.bcel.classfile.ConstantPool)
    InfoMethod 'public org.apache.bcel.classfile.Attribute readAttribute(java.io.DataInput, org.apache.bcel.classfile.ConstantPool)' has been addedorg.apache.bcel.classfile.Attributepublic org.apache.bcel.classfile.Attribute readAttribute(java.io.DataInput, org.apache.bcel.classfile.ConstantPool)
    InfoClass org.apache.bcel.classfile.BootstrapMethod addedorg.apache.bcel.classfile.BootstrapMethod
    InfoClass org.apache.bcel.classfile.BootstrapMethods addedorg.apache.bcel.classfile.BootstrapMethods
    InfoClass org.apache.bcel.classfile.ClassElementValue addedorg.apache.bcel.classfile.ClassElementValue
    InfoMethod 'public ClassFormatException(java.lang.String, java.lang.Throwable)' has been addedorg.apache.bcel.classfile.ClassFormatExceptionpublic ClassFormatException(java.lang.String, java.lang.Throwable)
    InfoParameter 1 of 'org.apache.bcel.classfile.Constant readConstant(java.io.DataInputStream)' has changed its type to java.io.DataInputorg.apache.bcel.classfile.Constantorg.apache.bcel.classfile.Constant readConstant(java.io.DataInputStream)
    InfoAccessibility of method 'org.apache.bcel.classfile.Constant readConstant(java.io.DataInputStream)' has been increased from package to publicorg.apache.bcel.classfile.Constantorg.apache.bcel.classfile.Constant readConstant(java.io.DataInputStream)
    InfoMethod 'org.apache.bcel.classfile.Constant readConstant(java.io.DataInputStream)' is no longer finalorg.apache.bcel.classfile.Constantorg.apache.bcel.classfile.Constant readConstant(java.io.DataInputStream)
    InfoMethod 'public java.lang.String toString()' is no longer finalorg.apache.bcel.classfile.ConstantCPpublic java.lang.String toString()
    InfoClass org.apache.bcel.classfile.ConstantInvokeDynamic addedorg.apache.bcel.classfile.ConstantInvokeDynamic
    InfoClass org.apache.bcel.classfile.ConstantMethodHandle addedorg.apache.bcel.classfile.ConstantMethodHandle
    InfoClass org.apache.bcel.classfile.ConstantMethodType addedorg.apache.bcel.classfile.ConstantMethodType
    InfoParameter 1 of 'ConstantPool(java.io.DataInputStream)' has changed its type to java.io.DataInputorg.apache.bcel.classfile.ConstantPoolConstantPool(java.io.DataInputStream)
    InfoAccessibility of method 'ConstantPool(java.io.DataInputStream)' has been increased from package to publicorg.apache.bcel.classfile.ConstantPoolConstantPool(java.io.DataInputStream)
    InfoMethod 'public org.apache.bcel.classfile.ConstantUtf8 getCachedInstance(java.lang.String)' has been addedorg.apache.bcel.classfile.ConstantUtf8public org.apache.bcel.classfile.ConstantUtf8 getCachedInstance(java.lang.String)
    InfoMethod 'public org.apache.bcel.classfile.ConstantUtf8 getInstance(java.lang.String)' has been addedorg.apache.bcel.classfile.ConstantUtf8public org.apache.bcel.classfile.ConstantUtf8 getInstance(java.lang.String)
    InfoMethod 'public org.apache.bcel.classfile.ConstantUtf8 getInstance(java.io.DataInput)' has been addedorg.apache.bcel.classfile.ConstantUtf8public org.apache.bcel.classfile.ConstantUtf8 getInstance(java.io.DataInput)
    InfoMethod 'public void setBytes(java.lang.String)' has been deprecatedorg.apache.bcel.classfile.ConstantUtf8public void setBytes(java.lang.String)
    InfoMethod 'public void visitAnnotation(org.apache.bcel.classfile.Annotations)' has been addedorg.apache.bcel.classfile.DescendingVisitorpublic void visitAnnotation(org.apache.bcel.classfile.Annotations)
    InfoMethod 'public void visitAnnotationDefault(org.apache.bcel.classfile.AnnotationDefault)' has been addedorg.apache.bcel.classfile.DescendingVisitorpublic void visitAnnotationDefault(org.apache.bcel.classfile.AnnotationDefault)
    InfoMethod 'public void visitAnnotationEntry(org.apache.bcel.classfile.AnnotationEntry)' has been addedorg.apache.bcel.classfile.DescendingVisitorpublic void visitAnnotationEntry(org.apache.bcel.classfile.AnnotationEntry)
    InfoMethod 'public void visitBootstrapMethods(org.apache.bcel.classfile.BootstrapMethods)' has been addedorg.apache.bcel.classfile.DescendingVisitorpublic void visitBootstrapMethods(org.apache.bcel.classfile.BootstrapMethods)
    InfoMethod 'public void visitConstantInvokeDynamic(org.apache.bcel.classfile.ConstantInvokeDynamic)' has been addedorg.apache.bcel.classfile.DescendingVisitorpublic void visitConstantInvokeDynamic(org.apache.bcel.classfile.ConstantInvokeDynamic)
    InfoMethod 'public void visitConstantMethodHandle(org.apache.bcel.classfile.ConstantMethodHandle)' has been addedorg.apache.bcel.classfile.DescendingVisitorpublic void visitConstantMethodHandle(org.apache.bcel.classfile.ConstantMethodHandle)
    InfoMethod 'public void visitConstantMethodType(org.apache.bcel.classfile.ConstantMethodType)' has been addedorg.apache.bcel.classfile.DescendingVisitorpublic void visitConstantMethodType(org.apache.bcel.classfile.ConstantMethodType)
    InfoMethod 'public void visitEnclosingMethod(org.apache.bcel.classfile.EnclosingMethod)' has been addedorg.apache.bcel.classfile.DescendingVisitorpublic void visitEnclosingMethod(org.apache.bcel.classfile.EnclosingMethod)
    InfoMethod 'public void visitLocalVariableTypeTable(org.apache.bcel.classfile.LocalVariableTypeTable)' has been addedorg.apache.bcel.classfile.DescendingVisitorpublic void visitLocalVariableTypeTable(org.apache.bcel.classfile.LocalVariableTypeTable)
    InfoMethod 'public void visitMethodParameters(org.apache.bcel.classfile.MethodParameters)' has been addedorg.apache.bcel.classfile.DescendingVisitorpublic void visitMethodParameters(org.apache.bcel.classfile.MethodParameters)
    InfoMethod 'public void visitParameterAnnotation(org.apache.bcel.classfile.ParameterAnnotations)' has been addedorg.apache.bcel.classfile.DescendingVisitorpublic void visitParameterAnnotation(org.apache.bcel.classfile.ParameterAnnotations)
    InfoMethod 'public void visitParameterAnnotationEntry(org.apache.bcel.classfile.ParameterAnnotationEntry)' has been addedorg.apache.bcel.classfile.DescendingVisitorpublic void visitParameterAnnotationEntry(org.apache.bcel.classfile.ParameterAnnotationEntry)
    InfoClass org.apache.bcel.classfile.ElementValue addedorg.apache.bcel.classfile.ElementValue
    InfoClass org.apache.bcel.classfile.ElementValuePair addedorg.apache.bcel.classfile.ElementValuePair
    InfoMethod 'public void visitAnnotation(org.apache.bcel.classfile.Annotations)' has been addedorg.apache.bcel.classfile.EmptyVisitorpublic void visitAnnotation(org.apache.bcel.classfile.Annotations)
    InfoMethod 'public void visitAnnotationDefault(org.apache.bcel.classfile.AnnotationDefault)' has been addedorg.apache.bcel.classfile.EmptyVisitorpublic void visitAnnotationDefault(org.apache.bcel.classfile.AnnotationDefault)
    InfoMethod 'public void visitAnnotationEntry(org.apache.bcel.classfile.AnnotationEntry)' has been addedorg.apache.bcel.classfile.EmptyVisitorpublic void visitAnnotationEntry(org.apache.bcel.classfile.AnnotationEntry)
    InfoMethod 'public void visitBootstrapMethods(org.apache.bcel.classfile.BootstrapMethods)' has been addedorg.apache.bcel.classfile.EmptyVisitorpublic void visitBootstrapMethods(org.apache.bcel.classfile.BootstrapMethods)
    InfoMethod 'public void visitConstantInvokeDynamic(org.apache.bcel.classfile.ConstantInvokeDynamic)' has been addedorg.apache.bcel.classfile.EmptyVisitorpublic void visitConstantInvokeDynamic(org.apache.bcel.classfile.ConstantInvokeDynamic)
    InfoMethod 'public void visitConstantMethodHandle(org.apache.bcel.classfile.ConstantMethodHandle)' has been addedorg.apache.bcel.classfile.EmptyVisitorpublic void visitConstantMethodHandle(org.apache.bcel.classfile.ConstantMethodHandle)
    InfoMethod 'public void visitConstantMethodType(org.apache.bcel.classfile.ConstantMethodType)' has been addedorg.apache.bcel.classfile.EmptyVisitorpublic void visitConstantMethodType(org.apache.bcel.classfile.ConstantMethodType)
    InfoMethod 'public void visitEnclosingMethod(org.apache.bcel.classfile.EnclosingMethod)' has been addedorg.apache.bcel.classfile.EmptyVisitorpublic void visitEnclosingMethod(org.apache.bcel.classfile.EnclosingMethod)
    InfoMethod 'public void visitLocalVariableTypeTable(org.apache.bcel.classfile.LocalVariableTypeTable)' has been addedorg.apache.bcel.classfile.EmptyVisitorpublic void visitLocalVariableTypeTable(org.apache.bcel.classfile.LocalVariableTypeTable)
    InfoMethod 'public void visitMethodParameters(org.apache.bcel.classfile.MethodParameters)' has been addedorg.apache.bcel.classfile.EmptyVisitorpublic void visitMethodParameters(org.apache.bcel.classfile.MethodParameters)
    InfoMethod 'public void visitParameterAnnotation(org.apache.bcel.classfile.ParameterAnnotations)' has been addedorg.apache.bcel.classfile.EmptyVisitorpublic void visitParameterAnnotation(org.apache.bcel.classfile.ParameterAnnotations)
    InfoMethod 'public void visitParameterAnnotationEntry(org.apache.bcel.classfile.ParameterAnnotationEntry)' has been addedorg.apache.bcel.classfile.EmptyVisitorpublic void visitParameterAnnotationEntry(org.apache.bcel.classfile.ParameterAnnotationEntry)
    InfoClass org.apache.bcel.classfile.EnclosingMethod addedorg.apache.bcel.classfile.EnclosingMethod
    InfoClass org.apache.bcel.classfile.EnumElementValue addedorg.apache.bcel.classfile.EnumElementValue
    InfoMethod 'protected FieldOrMethod(java.io.DataInputStream, org.apache.bcel.classfile.ConstantPool)' has been deprecatedorg.apache.bcel.classfile.FieldOrMethodprotected FieldOrMethod(java.io.DataInputStream, org.apache.bcel.classfile.ConstantPool)
    InfoMethod 'protected FieldOrMethod(java.io.DataInput, org.apache.bcel.classfile.ConstantPool)' has been addedorg.apache.bcel.classfile.FieldOrMethodprotected FieldOrMethod(java.io.DataInput, org.apache.bcel.classfile.ConstantPool)
    InfoMethod 'public org.apache.bcel.classfile.AnnotationEntry[] getAnnotationEntries()' has been addedorg.apache.bcel.classfile.FieldOrMethodpublic org.apache.bcel.classfile.AnnotationEntry[] getAnnotationEntries()
    InfoMethod 'public java.lang.String getGenericSignature()' has been addedorg.apache.bcel.classfile.FieldOrMethodpublic java.lang.String getGenericSignature()
    InfoMethod 'public int compareTo(org.apache.bcel.classfile.JavaClass)' has been addedorg.apache.bcel.classfile.JavaClasspublic int compareTo(org.apache.bcel.classfile.JavaClass)
    InfoMethod 'public org.apache.bcel.classfile.AnnotationEntry[] getAnnotationEntries()' has been addedorg.apache.bcel.classfile.JavaClasspublic org.apache.bcel.classfile.AnnotationEntry[] getAnnotationEntries()
    InfoMethod 'public boolean isAnonymous()' has been addedorg.apache.bcel.classfile.JavaClasspublic boolean isAnonymous()
    InfoMethod 'public boolean isNested()' has been addedorg.apache.bcel.classfile.JavaClasspublic boolean isNested()
    InfoClass org.apache.bcel.classfile.LocalVariableTypeTable addedorg.apache.bcel.classfile.LocalVariableTypeTable
    InfoMethod 'public org.apache.bcel.classfile.ParameterAnnotationEntry[] getParameterAnnotationEntries()' has been addedorg.apache.bcel.classfile.Methodpublic org.apache.bcel.classfile.ParameterAnnotationEntry[] getParameterAnnotationEntries()
    InfoClass org.apache.bcel.classfile.MethodParameter addedorg.apache.bcel.classfile.MethodParameter
    InfoClass org.apache.bcel.classfile.MethodParameters addedorg.apache.bcel.classfile.MethodParameters
    InfoClass org.apache.bcel.classfile.ParameterAnnotationEntry addedorg.apache.bcel.classfile.ParameterAnnotationEntry
    InfoClass org.apache.bcel.classfile.ParameterAnnotations addedorg.apache.bcel.classfile.ParameterAnnotations
    InfoClass org.apache.bcel.classfile.RuntimeInvisibleAnnotations addedorg.apache.bcel.classfile.RuntimeInvisibleAnnotations
    InfoClass org.apache.bcel.classfile.RuntimeInvisibleParameterAnnotations addedorg.apache.bcel.classfile.RuntimeInvisibleParameterAnnotations
    InfoClass org.apache.bcel.classfile.RuntimeVisibleAnnotations addedorg.apache.bcel.classfile.RuntimeVisibleAnnotations
    InfoClass org.apache.bcel.classfile.RuntimeVisibleParameterAnnotations addedorg.apache.bcel.classfile.RuntimeVisibleParameterAnnotations
    InfoMethod 'public boolean isActualParameterList(java.lang.String)' is no longer finalorg.apache.bcel.classfile.Signaturepublic boolean isActualParameterList(java.lang.String)
    InfoMethod 'public boolean isFormalParameterList(java.lang.String)' is no longer finalorg.apache.bcel.classfile.Signaturepublic boolean isFormalParameterList(java.lang.String)
    InfoClass org.apache.bcel.classfile.SimpleElementValue addedorg.apache.bcel.classfile.SimpleElementValue
    InfoAdded org.apache.bcel.classfile.Node to the set of implemented interfacesorg.apache.bcel.classfile.StackMapEntry
    InfoMethod 'public StackMapEntry(int, int, org.apache.bcel.classfile.StackMapType[], int, org.apache.bcel.classfile.StackMapType[], org.apache.bcel.classfile.ConstantPool)' has been deprecatedorg.apache.bcel.classfile.StackMapEntrypublic StackMapEntry(int, int, org.apache.bcel.classfile.StackMapType[], int, org.apache.bcel.classfile.StackMapType[], org.apache.bcel.classfile.ConstantPool)
    InfoMethod 'public StackMapEntry(int, int, org.apache.bcel.classfile.StackMapType[], org.apache.bcel.classfile.StackMapType[], org.apache.bcel.classfile.ConstantPool)' has been addedorg.apache.bcel.classfile.StackMapEntrypublic StackMapEntry(int, int, org.apache.bcel.classfile.StackMapType[], org.apache.bcel.classfile.StackMapType[], org.apache.bcel.classfile.ConstantPool)
    InfoMethod 'public int getFrameType()' has been addedorg.apache.bcel.classfile.StackMapEntrypublic int getFrameType()
    InfoMethod 'public void setFrameType(int)' has been addedorg.apache.bcel.classfile.StackMapEntrypublic void setFrameType(int)
    InfoMethod 'public void setNumberOfLocals(int)' has been deprecatedorg.apache.bcel.classfile.StackMapEntrypublic void setNumberOfLocals(int)
    InfoMethod 'public void setNumberOfStackItems(int)' has been deprecatedorg.apache.bcel.classfile.StackMapEntrypublic void setNumberOfStackItems(int)
    InfoMethod 'public void updateByteCodeOffset(int)' has been addedorg.apache.bcel.classfile.StackMapEntrypublic void updateByteCodeOffset(int)
    InfoClass org.apache.bcel.classfile.UnknownAttributeReader addedorg.apache.bcel.classfile.UnknownAttributeReader
    InfoMethod 'public java.lang.String accessToString(int)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String accessToString(int)
    InfoMethod 'public java.lang.String accessToString(int, boolean)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String accessToString(int, boolean)
    InfoMethod 'public java.lang.String classOrInterface(int)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String classOrInterface(int)
    InfoMethod 'public int clearBit(int, int)' is no longer finalorg.apache.bcel.classfile.Utilitypublic int clearBit(int, int)
    InfoMethod 'public java.lang.String codeToString(byte[], org.apache.bcel.classfile.ConstantPool, int, int, boolean)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String codeToString(byte[], org.apache.bcel.classfile.ConstantPool, int, int, boolean)
    InfoMethod 'public java.lang.String codeToString(byte[], org.apache.bcel.classfile.ConstantPool, int, int)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String codeToString(byte[], org.apache.bcel.classfile.ConstantPool, int, int)
    InfoMethod 'public java.lang.String codeToString(org.apache.bcel.util.ByteSequence, org.apache.bcel.classfile.ConstantPool, boolean)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String codeToString(org.apache.bcel.util.ByteSequence, org.apache.bcel.classfile.ConstantPool, boolean)
    InfoMethod 'public java.lang.String codeToString(org.apache.bcel.util.ByteSequence, org.apache.bcel.classfile.ConstantPool)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String codeToString(org.apache.bcel.util.ByteSequence, org.apache.bcel.classfile.ConstantPool)
    InfoMethod 'public java.lang.String compactClassName(java.lang.String)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String compactClassName(java.lang.String)
    InfoMethod 'public java.lang.String compactClassName(java.lang.String, java.lang.String, boolean)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String compactClassName(java.lang.String, java.lang.String, boolean)
    InfoMethod 'public java.lang.String compactClassName(java.lang.String, boolean)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String compactClassName(java.lang.String, boolean)
    InfoMethod 'public java.lang.String convertString(java.lang.String)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String convertString(java.lang.String)
    InfoMethod 'public java.lang.String fillup(java.lang.String, int, boolean, char)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String fillup(java.lang.String, int, boolean, char)
    InfoMethod 'public java.lang.String format(int, int, boolean, char)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String format(int, int, boolean, char)
    InfoMethod 'public boolean isSet(int, int)' is no longer finalorg.apache.bcel.classfile.Utilitypublic boolean isSet(int, int)
    InfoMethod 'public java.lang.String[] methodSignatureArgumentTypes(java.lang.String)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String[] methodSignatureArgumentTypes(java.lang.String)
    InfoMethod 'public java.lang.String[] methodSignatureArgumentTypes(java.lang.String, boolean)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String[] methodSignatureArgumentTypes(java.lang.String, boolean)
    InfoMethod 'public java.lang.String methodSignatureReturnType(java.lang.String)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String methodSignatureReturnType(java.lang.String)
    InfoMethod 'public java.lang.String methodSignatureReturnType(java.lang.String, boolean)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String methodSignatureReturnType(java.lang.String, boolean)
    InfoMethod 'public java.lang.String methodSignatureToString(java.lang.String, java.lang.String, java.lang.String)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String methodSignatureToString(java.lang.String, java.lang.String, java.lang.String)
    InfoMethod 'public java.lang.String methodSignatureToString(java.lang.String, java.lang.String, java.lang.String, boolean)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String methodSignatureToString(java.lang.String, java.lang.String, java.lang.String, boolean)
    InfoMethod 'public java.lang.String methodSignatureToString(java.lang.String, java.lang.String, java.lang.String, boolean, org.apache.bcel.classfile.LocalVariableTable)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String methodSignatureToString(java.lang.String, java.lang.String, java.lang.String, boolean, org.apache.bcel.classfile.LocalVariableTable)
    InfoMethod 'public java.lang.String methodTypeToSignature(java.lang.String, java.lang.String[])' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String methodTypeToSignature(java.lang.String, java.lang.String[])
    InfoMethod 'public void printArray(java.io.PrintStream, java.lang.Object[])' is no longer finalorg.apache.bcel.classfile.Utilitypublic void printArray(java.io.PrintStream, java.lang.Object[])
    InfoMethod 'public void printArray(java.io.PrintWriter, java.lang.Object[])' is no longer finalorg.apache.bcel.classfile.Utilitypublic void printArray(java.io.PrintWriter, java.lang.Object[])
    InfoMethod 'public java.lang.String printArray(java.lang.Object[])' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String printArray(java.lang.Object[])
    InfoMethod 'public java.lang.String printArray(java.lang.Object[], boolean)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String printArray(java.lang.Object[], boolean)
    InfoMethod 'public java.lang.String printArray(java.lang.Object[], boolean, boolean)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String printArray(java.lang.Object[], boolean, boolean)
    InfoMethod 'public java.lang.String replace(java.lang.String, java.lang.String, java.lang.String)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String replace(java.lang.String, java.lang.String, java.lang.String)
    InfoMethod 'public int setBit(int, int)' is no longer finalorg.apache.bcel.classfile.Utilitypublic int setBit(int, int)
    InfoMethod 'public java.lang.String signatureToString(java.lang.String)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String signatureToString(java.lang.String)
    InfoMethod 'public java.lang.String signatureToString(java.lang.String, boolean)' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String signatureToString(java.lang.String, boolean)
    InfoMethod 'public java.lang.String toHexString(byte[])' is no longer finalorg.apache.bcel.classfile.Utilitypublic java.lang.String toHexString(byte[])
    InfoMethod 'public byte typeOfMethodSignature(java.lang.String)' is no longer finalorg.apache.bcel.classfile.Utilitypublic byte typeOfMethodSignature(java.lang.String)
    InfoMethod 'public byte typeOfSignature(java.lang.String)' is no longer finalorg.apache.bcel.classfile.Utilitypublic byte typeOfSignature(java.lang.String)
    InfoAdded org.apache.bcel.generic.StackConsumer to the set of implemented interfacesorg.apache.bcel.generic.ARRAYLENGTH
    InfoClass org.apache.bcel.generic.AnnotationElementValueGen addedorg.apache.bcel.generic.AnnotationElementValueGen
    InfoClass org.apache.bcel.generic.AnnotationEntryGen addedorg.apache.bcel.generic.AnnotationEntryGen
    InfoClass org.apache.bcel.generic.ArrayElementValueGen addedorg.apache.bcel.generic.ArrayElementValueGen
    InfoMethod 'public org.apache.bcel.generic.BasicType getType(byte)' is no longer finalorg.apache.bcel.generic.BasicTypepublic org.apache.bcel.generic.BasicType getType(byte)
    InfoMethod 'protected int getPosition()' has been addedorg.apache.bcel.generic.BranchInstructionprotected int getPosition()
    InfoMethod 'protected void setIndex(int)' has been addedorg.apache.bcel.generic.BranchInstructionprotected void setIndex(int)
    InfoMethod 'protected void setPosition(int)' has been addedorg.apache.bcel.generic.BranchInstructionprotected void setPosition(int)
    InfoClass org.apache.bcel.generic.ClassElementValueGen addedorg.apache.bcel.generic.ClassElementValueGen
    InfoMethod 'public void addAnnotationEntry(org.apache.bcel.generic.AnnotationEntryGen)' has been addedorg.apache.bcel.generic.ClassGenpublic void addAnnotationEntry(org.apache.bcel.generic.AnnotationEntryGen)
    InfoMethod 'public org.apache.bcel.generic.AnnotationEntryGen[] getAnnotationEntries()' has been addedorg.apache.bcel.generic.ClassGenpublic org.apache.bcel.generic.AnnotationEntryGen[] getAnnotationEntries()
    InfoMethod 'public ClassGenException(java.lang.String, java.lang.Throwable)' has been addedorg.apache.bcel.generic.ClassGenExceptionpublic ClassGenException(java.lang.String, java.lang.Throwable)
    InfoClass org.apache.bcel.generic.ElementValueGen addedorg.apache.bcel.generic.ElementValueGen
    InfoClass org.apache.bcel.generic.ElementValuePairGen addedorg.apache.bcel.generic.ElementValuePairGen
    InfoMethod 'public void visitINVOKEDYNAMIC(org.apache.bcel.generic.INVOKEDYNAMIC)' has been addedorg.apache.bcel.generic.EmptyVisitorpublic void visitINVOKEDYNAMIC(org.apache.bcel.generic.INVOKEDYNAMIC)
    InfoClass org.apache.bcel.generic.EnumElementValueGen addedorg.apache.bcel.generic.EnumElementValueGen
    InfoMethod 'protected FieldGenOrMethodGen(int)' has been addedorg.apache.bcel.generic.FieldGenOrMethodGenprotected FieldGenOrMethodGen(int)
    InfoMethod 'protected void addAnnotationEntry(org.apache.bcel.generic.AnnotationEntryGen)' has been addedorg.apache.bcel.generic.FieldGenOrMethodGenprotected void addAnnotationEntry(org.apache.bcel.generic.AnnotationEntryGen)
    InfoMethod 'public org.apache.bcel.generic.AnnotationEntryGen[] getAnnotationEntries()' has been addedorg.apache.bcel.generic.FieldGenOrMethodGenpublic org.apache.bcel.generic.AnnotationEntryGen[] getAnnotationEntries()
    InfoMethod 'protected void removeAnnotationEntries()' has been addedorg.apache.bcel.generic.FieldGenOrMethodGenprotected void removeAnnotationEntries()
    InfoMethod 'protected void removeAnnotationEntry(org.apache.bcel.generic.AnnotationEntryGen)' has been addedorg.apache.bcel.generic.FieldGenOrMethodGenprotected void removeAnnotationEntry(org.apache.bcel.generic.AnnotationEntryGen)
    InfoClass org.apache.bcel.generic.INVOKEDYNAMIC addedorg.apache.bcel.generic.INVOKEDYNAMIC
    InfoMethod 'public void dump(java.io.DataOutputStream)' has been addedorg.apache.bcel.generic.INVOKESPECIALpublic void dump(java.io.DataOutputStream)
    InfoMethod 'public void dump(java.io.DataOutputStream)' has been addedorg.apache.bcel.generic.INVOKESTATICpublic void dump(java.io.DataOutputStream)
    InfoMethod 'public void dump(java.io.DataOutputStream)' has been addedorg.apache.bcel.generic.INVOKEVIRTUALpublic void dump(java.io.DataOutputStream)
    InfoMethod 'public org.apache.bcel.generic.InstructionComparator getComparator()' has been deprecatedorg.apache.bcel.generic.Instructionpublic org.apache.bcel.generic.InstructionComparator getComparator()
    InfoMethod 'public int hashCode()' has been addedorg.apache.bcel.generic.Instructionpublic int hashCode()
    InfoMethod 'public boolean isValidByte(int)' has been addedorg.apache.bcel.generic.Instructionpublic boolean isValidByte(int)
    InfoMethod 'public boolean isValidShort(int)' has been addedorg.apache.bcel.generic.Instructionpublic boolean isValidShort(int)
    InfoMethod 'public org.apache.bcel.generic.Instruction readInstruction(org.apache.bcel.util.ByteSequence)' is no longer finalorg.apache.bcel.generic.Instructionpublic org.apache.bcel.generic.Instruction readInstruction(org.apache.bcel.util.ByteSequence)
    InfoMethod 'public void setComparator(org.apache.bcel.generic.InstructionComparator)' has been deprecatedorg.apache.bcel.generic.Instructionpublic void setComparator(org.apache.bcel.generic.InstructionComparator)
    InfoClass org.apache.bcel.generic.InstructionConst addedorg.apache.bcel.generic.InstructionConst
    InfoAdded java.lang.Iterable to the set of implemented interfacesorg.apache.bcel.generic.InstructionList
    InfoAdded org.apache.bcel.generic.StackConsumer to the set of implemented interfacesorg.apache.bcel.generic.LOOKUPSWITCH
    InfoMethod 'public void addAnnotationsAsAttribute(org.apache.bcel.generic.ConstantPoolGen)' has been addedorg.apache.bcel.generic.MethodGenpublic void addAnnotationsAsAttribute(org.apache.bcel.generic.ConstantPoolGen)
    InfoMethod 'public void addParameterAnnotation(int, org.apache.bcel.generic.AnnotationEntryGen)' has been addedorg.apache.bcel.generic.MethodGenpublic void addParameterAnnotation(int, org.apache.bcel.generic.AnnotationEntryGen)
    InfoMethod 'public void addParameterAnnotationsAsAttribute(org.apache.bcel.generic.ConstantPoolGen)' has been addedorg.apache.bcel.generic.MethodGenpublic void addParameterAnnotationsAsAttribute(org.apache.bcel.generic.ConstantPoolGen)
    InfoMethod 'public java.util.List getAnnotationsOnParameter(int)' has been addedorg.apache.bcel.generic.MethodGenpublic java.util.List getAnnotationsOnParameter(int)
    InfoClass org.apache.bcel.generic.NameSignatureInstruction addedorg.apache.bcel.generic.NameSignatureInstruction
    InfoMethod 'public org.apache.bcel.generic.ObjectType getInstance(java.lang.String)' has been addedorg.apache.bcel.generic.ObjectTypepublic org.apache.bcel.generic.ObjectType getInstance(java.lang.String)
    InfoMethod 'public PUSH(org.apache.bcel.generic.ConstantPoolGen, org.apache.bcel.generic.ObjectType)' has been addedorg.apache.bcel.generic.PUSHpublic PUSH(org.apache.bcel.generic.ConstantPoolGen, org.apache.bcel.generic.ObjectType)
    InfoAdded org.apache.bcel.generic.StackConsumer to the set of implemented interfacesorg.apache.bcel.generic.Select
    InfoClass org.apache.bcel.generic.SimpleElementValueGen addedorg.apache.bcel.generic.SimpleElementValueGen
    InfoAdded org.apache.bcel.generic.StackConsumer to the set of implemented interfacesorg.apache.bcel.generic.TABLESWITCH
    InfoMethod 'public org.apache.bcel.generic.Type getType(java.lang.String)' is no longer finalorg.apache.bcel.generic.Typepublic org.apache.bcel.generic.Type getType(java.lang.String)
    InfoMethod 'public org.apache.bcel.generic.Type normalizeForStackOrLocal()' has been addedorg.apache.bcel.generic.Typepublic org.apache.bcel.generic.Type normalizeForStackOrLocal()
    InfoParameter 2 of 'java.lang.String printFlags(int, int)' has changed its type to org.apache.bcel.util.BCELifier$FLAGSorg.apache.bcel.util.BCELifierjava.lang.String printFlags(int, int)
    InfoAccessibility of method 'java.lang.String printFlags(int, int)' has been increased from package to publicorg.apache.bcel.util.BCELifierjava.lang.String printFlags(int, int)
    InfoClass org.apache.bcel.util.BCELifier$FLAGS addedorg.apache.bcel.util.BCELifier$FLAGS
    InfoMethod 'public ClassPath(org.apache.bcel.util.ClassPath, java.lang.String)' has been addedorg.apache.bcel.util.ClassPathpublic ClassPath(org.apache.bcel.util.ClassPath, java.lang.String)
    InfoMethod 'public java.lang.String getClassPath()' is no longer finalorg.apache.bcel.util.ClassPathpublic java.lang.String getClassPath()
    InfoMethod 'public java.net.URL getResource(java.lang.String)' has been addedorg.apache.bcel.util.ClassPathpublic java.net.URL getResource(java.lang.String)
    InfoMethod 'public java.io.InputStream getResourceAsStream(java.lang.String)' has been addedorg.apache.bcel.util.ClassPathpublic java.io.InputStream getResourceAsStream(java.lang.String)
    InfoMethod 'public java.util.Enumeration getResources(java.lang.String)' has been addedorg.apache.bcel.util.ClassPathpublic java.util.Enumeration getResources(java.lang.String)
    InfoClass org.apache.bcel.util.ClassPathRepository addedorg.apache.bcel.util.ClassPathRepository
    InfoClass org.apache.bcel.util.MemorySensitiveClassPathRepository addedorg.apache.bcel.util.MemorySensitiveClassPathRepository
    InfoAdded org.apache.bcel.util.MemorySensitiveClassPathRepository to the list of superclassesorg.apache.bcel.util.SyntheticRepository
    InfoMethod 'public void clear()' has been removed, but an inherited definition exists.org.apache.bcel.util.SyntheticRepositorypublic void clear()
    InfoMethod 'public org.apache.bcel.classfile.JavaClass findClass(java.lang.String)' has been removed, but an inherited definition exists.org.apache.bcel.util.SyntheticRepositorypublic org.apache.bcel.classfile.JavaClass findClass(java.lang.String)
    InfoMethod 'public org.apache.bcel.util.ClassPath getClassPath()' has been removed, but an inherited definition exists.org.apache.bcel.util.SyntheticRepositorypublic org.apache.bcel.util.ClassPath getClassPath()
    InfoMethod 'public org.apache.bcel.classfile.JavaClass loadClass(java.lang.String)' has been removed, but an inherited definition exists.org.apache.bcel.util.SyntheticRepositorypublic org.apache.bcel.classfile.JavaClass loadClass(java.lang.String)
    InfoMethod 'public org.apache.bcel.classfile.JavaClass loadClass(java.lang.Class)' has been removed, but an inherited definition exists.org.apache.bcel.util.SyntheticRepositorypublic org.apache.bcel.classfile.JavaClass loadClass(java.lang.Class)
    InfoMethod 'public void removeClass(org.apache.bcel.classfile.JavaClass)' has been removed, but an inherited definition exists.org.apache.bcel.util.SyntheticRepositorypublic void removeClass(org.apache.bcel.classfile.JavaClass)
    InfoMethod 'public void storeClass(org.apache.bcel.classfile.JavaClass)' has been removed, but an inherited definition exists.org.apache.bcel.util.SyntheticRepositorypublic void storeClass(org.apache.bcel.classfile.JavaClass)
    InfoMethod 'public java.lang.Object getElementAt(int)' has been addedorg.apache.bcel.verifier.VerifierFactoryListModelpublic java.lang.Object getElementAt(int)
    InfoMethod 'public AssertionViolatedException(java.lang.String, java.lang.Throwable)' has been addedorg.apache.bcel.verifier.exc.AssertionViolatedExceptionpublic AssertionViolatedException(java.lang.String, java.lang.Throwable)
    InfoMethod 'public ClassConstraintException(java.lang.String, java.lang.Throwable)' has been addedorg.apache.bcel.verifier.exc.ClassConstraintExceptionpublic ClassConstraintException(java.lang.String, java.lang.Throwable)
    InfoMethod 'public void visitAnnotation(org.apache.bcel.classfile.Annotations)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitAnnotation(org.apache.bcel.classfile.Annotations)
    InfoMethod 'public void visitAnnotationDefault(org.apache.bcel.classfile.AnnotationDefault)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitAnnotationDefault(org.apache.bcel.classfile.AnnotationDefault)
    InfoMethod 'public void visitAnnotationEntry(org.apache.bcel.classfile.AnnotationEntry)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitAnnotationEntry(org.apache.bcel.classfile.AnnotationEntry)
    InfoMethod 'public void visitBootstrapMethods(org.apache.bcel.classfile.BootstrapMethods)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitBootstrapMethods(org.apache.bcel.classfile.BootstrapMethods)
    InfoMethod 'public void visitConstantInvokeDynamic(org.apache.bcel.classfile.ConstantInvokeDynamic)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitConstantInvokeDynamic(org.apache.bcel.classfile.ConstantInvokeDynamic)
    InfoMethod 'public void visitConstantMethodHandle(org.apache.bcel.classfile.ConstantMethodHandle)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitConstantMethodHandle(org.apache.bcel.classfile.ConstantMethodHandle)
    InfoMethod 'public void visitConstantMethodType(org.apache.bcel.classfile.ConstantMethodType)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitConstantMethodType(org.apache.bcel.classfile.ConstantMethodType)
    InfoMethod 'public void visitEnclosingMethod(org.apache.bcel.classfile.EnclosingMethod)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitEnclosingMethod(org.apache.bcel.classfile.EnclosingMethod)
    InfoMethod 'public void visitLocalVariableTypeTable(org.apache.bcel.classfile.LocalVariableTypeTable)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitLocalVariableTypeTable(org.apache.bcel.classfile.LocalVariableTypeTable)
    InfoMethod 'public void visitMethodParameters(org.apache.bcel.classfile.MethodParameters)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitMethodParameters(org.apache.bcel.classfile.MethodParameters)
    InfoMethod 'public void visitParameterAnnotation(org.apache.bcel.classfile.ParameterAnnotations)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitParameterAnnotation(org.apache.bcel.classfile.ParameterAnnotations)
    InfoMethod 'public void visitParameterAnnotationEntry(org.apache.bcel.classfile.ParameterAnnotationEntry)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitParameterAnnotationEntry(org.apache.bcel.classfile.ParameterAnnotationEntry)
    InfoMethod 'public void visitStackMapEntry(org.apache.bcel.classfile.StackMapEntry)' has been addedorg.apache.bcel.verifier.statics.StringRepresentationpublic void visitStackMapEntry(org.apache.bcel.classfile.StackMapEntry)
    InfoMethod 'public ControlFlowGraph(org.apache.bcel.generic.MethodGen, boolean)' has been addedorg.apache.bcel.verifier.structurals.ControlFlowGraphpublic ControlFlowGraph(org.apache.bcel.generic.MethodGen, boolean)
    InfoMethod 'public void visitINVOKEDYNAMIC(org.apache.bcel.generic.INVOKEDYNAMIC)' has been addedorg.apache.bcel.verifier.structurals.ExecutionVisitorpublic void visitINVOKEDYNAMIC(org.apache.bcel.generic.INVOKEDYNAMIC)
    InfoMethod 'public org.apache.bcel.verifier.structurals.UninitializedObjectType getThis()' has been addedorg.apache.bcel.verifier.structurals.Framepublic org.apache.bcel.verifier.structurals.UninitializedObjectType getThis()
    InfoMethod 'public void setThis(org.apache.bcel.verifier.structurals.UninitializedObjectType)' has been addedorg.apache.bcel.verifier.structurals.Framepublic void setThis(org.apache.bcel.verifier.structurals.UninitializedObjectType)
    InfoMethod 'public void visitINVOKEDYNAMIC(org.apache.bcel.generic.INVOKEDYNAMIC)' has been addedorg.apache.bcel.verifier.structurals.InstConstraintVisitorpublic void visitINVOKEDYNAMIC(org.apache.bcel.generic.INVOKEDYNAMIC)
    InfoAdded java.lang.Cloneable to the set of implemented interfacesorg.apache.bcel.verifier.structurals.LocalVariables
    InfoAccessibility of method 'protected java.lang.Object clone()' has been increased from protected to publicorg.apache.bcel.verifier.structurals.LocalVariablesprotected java.lang.Object clone()
    InfoAdded java.lang.Cloneable to the set of implemented interfacesorg.apache.bcel.verifier.structurals.OperandStack
    InfoAccessibility of method 'protected java.lang.Object clone()' has been increased from protected to publicorg.apache.bcel.verifier.structurals.OperandStackprotected java.lang.Object clone()
    InfoMethod 'public void invalidReturnTypeError(org.apache.bcel.generic.Type, org.apache.bcel.generic.MethodGen)' has been addedorg.apache.bcel.verifier.structurals.Pass3bVerifierpublic void invalidReturnTypeError(org.apache.bcel.generic.Type, org.apache.bcel.generic.MethodGen)
    InfoMethod 'public Subroutines(org.apache.bcel.generic.MethodGen, boolean)' has been addedorg.apache.bcel.verifier.structurals.Subroutinespublic Subroutines(org.apache.bcel.generic.MethodGen, boolean)
    +
    +
    + + + + + -- GitLab From 648f7533d9abee1c437dfdd7704b925935d632e2 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 13:48:36 +0000 Subject: [PATCH 1188/1313] Add BCEL-230 to changes.xml and RELEASE-NOTES git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749025 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 1 + src/changes/changes.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 9b12c573..3270c995 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -191,6 +191,7 @@ o BCEL-177: When reading the number of parameters in a MethodParameters CHANGES: ======== +o BCEL-230: Document the Java platform requirement clearly and early. o BCEL-211: Some additional clone methods should be public. o BCEL-127: Document that Instruction Factory returns singleton instances. o BCEL-198: better support for clone/copy methods. diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 4d381cb9..82d70ae1 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -90,6 +90,7 @@ N.B. The Clirr report shows that there are several incompatible changes which in External code should not have been relying on such classes to provide definitions of the constants. "> + Document the Java platform requirement clearly and early Type.getType() needs to understand TypeVariableSignature(s) Add constants for Java 9 class file version 53 FCONST pattern does not include FCONST_2 -- GitLab From cc1c0fbf13f7757a8fbc696653aced5f8cfd4005 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 13:57:51 +0000 Subject: [PATCH 1189/1313] Add BCEL-237 to changes.xml and RELEASE-NOTES since it seems to have been fixed already git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749032 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE-NOTES.txt | 1 + src/changes/changes.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 3270c995..25a44e82 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -58,6 +58,7 @@ o BCEL-272: Add constants for Java 9 class file version 53. FIXED BUGS: =========== +o BCEL-237: non-empty final arrays should be private as they are mutable. o BCEL-243: Type.getType() needs to understand TypeVariableSignature(s). o BCEL-271: FCONST pattern does not include FCONST_2. o BCEL-264: Add missing Node.accept() implementations (ConstantMethodHandle, diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 82d70ae1..2a6590b2 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -90,6 +90,7 @@ N.B. The Clirr report shows that there are several incompatible changes which in External code should not have been relying on such classes to provide definitions of the constants. "> + non-empty final arrays should be private as they are mutable Document the Java platform requirement clearly and early Type.getType() needs to understand TypeVariableSignature(s) Add constants for Java 9 class file version 53 -- GitLab From 842ebc6f1874811db183d3027584e5e5d3f306f2 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 14:03:51 +0000 Subject: [PATCH 1190/1313] Add missing license headers git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749039 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/ExceptionConst.java | 17 +++++++++++++++++ .../bcel/generic/BranchHandleTestCase.java | 17 +++++++++++++++++ .../bcel/generic/InstructionHandleTestCase.java | 17 +++++++++++++++++ .../org/apache/bcel/generic/TypeTestCase.java | 17 +++++++++++++++++ .../org/apache/bcel/util/BCELifierTestCase.java | 17 +++++++++++++++++ 5 files changed, 85 insertions(+) diff --git a/src/main/java/org/apache/bcel/ExceptionConst.java b/src/main/java/org/apache/bcel/ExceptionConst.java index 1aa304ea..e7fb5c39 100644 --- a/src/main/java/org/apache/bcel/ExceptionConst.java +++ b/src/main/java/org/apache/bcel/ExceptionConst.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel; /** diff --git a/src/test/java/org/apache/bcel/generic/BranchHandleTestCase.java b/src/test/java/org/apache/bcel/generic/BranchHandleTestCase.java index 22d3d812..102d6bcb 100644 --- a/src/test/java/org/apache/bcel/generic/BranchHandleTestCase.java +++ b/src/test/java/org/apache/bcel/generic/BranchHandleTestCase.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.generic; import org.junit.Assert; diff --git a/src/test/java/org/apache/bcel/generic/InstructionHandleTestCase.java b/src/test/java/org/apache/bcel/generic/InstructionHandleTestCase.java index ade83bb2..92c243fe 100644 --- a/src/test/java/org/apache/bcel/generic/InstructionHandleTestCase.java +++ b/src/test/java/org/apache/bcel/generic/InstructionHandleTestCase.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.generic; import org.junit.Assert; diff --git a/src/test/java/org/apache/bcel/generic/TypeTestCase.java b/src/test/java/org/apache/bcel/generic/TypeTestCase.java index db5dc2ce..7b00d8b4 100644 --- a/src/test/java/org/apache/bcel/generic/TypeTestCase.java +++ b/src/test/java/org/apache/bcel/generic/TypeTestCase.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.generic; import junit.framework.TestCase; diff --git a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java index b401f047..a2ebba47 100644 --- a/src/test/java/org/apache/bcel/util/BCELifierTestCase.java +++ b/src/test/java/org/apache/bcel/util/BCELifierTestCase.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ package org.apache.bcel.util; import static org.junit.Assert.*; -- GitLab From b40fd07080be26f4ae76e741c69f0a926989293d Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 14:05:45 +0000 Subject: [PATCH 1191/1313] Updated download page in preparation for 6.0 release. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749043 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/download_bcel.xml | 60 +++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/src/site/xdoc/download_bcel.xml b/src/site/xdoc/download_bcel.xml index c9f9f506..45b92e30 100644 --- a/src/site/xdoc/download_bcel.xml +++ b/src/site/xdoc/download_bcel.xml @@ -31,10 +31,21 @@ limitations under the License. | 2) Set the following properties in the component's pom: | | - commons.componentid (required, alphabetic, lower case) | | - commons.release.version (required) | - | - commons.binary.suffix (optional) | + | - commons.release.name (required) | + | - commons.binary.suffix (optional) | | (defaults to "-bin", set to "" for pre-maven2 releases) | + | - commons.release.desc (optional) | + | - commons.release.subdir (optional) | + | | + | - commons.release.2/3.version (conditional) | + | - commons.release.2/3.name (conditional) | + | - commons.release.2/3.binary.suffix (optional) | + | - commons.release.2/3.desc (optional) | + | - commons.release.2/3.subdir (optional) | | | | 3) Example Properties | + | (commons.release.name inherited by parent: | + | ${project.artifactId}-${commons.release.version} | | | | | | math | @@ -46,17 +57,17 @@ limitations under the License. Download Apache Commons BCEL - Commons Documentation Team + Apache Commons Documentation Team

    We recommend you use a mirror to download our release - builds, but you must verify the integrity of + builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours) may not yet - be available from the mirrors. + be available from all the mirrors.

    @@ -88,39 +99,44 @@ limitations under the License.

    - The KEYS - link links to the code signing keys used to sign the product. - The PGP link downloads the OpenPGP compatible signature from our main site. - The MD5 link downloads the checksum from the main site. + It is essential that you + verify the integrity + of downloaded files, preferably using the PGP signature (*.asc files); + failing that using the MD5 hash (*.md5 checksum files). +

    +

    + The KEYS + file contains the public PGP keys used by Apache Commons developers + to sign releases.

    -
    +
    - - - + + + - - - + + +
    commons-bcel6-6.0-bin.tar.gzmd5pgpbcel-6.0-bin.tar.gzmd5pgp
    commons-bcel6-6.0-bin.zipmd5pgpbcel-6.0-bin.zipmd5pgp
    - - - + + + - - - + + +
    commons-bcel6-6.0-src.tar.gzmd5pgpbcel-6.0-src.tar.gzmd5pgp
    commons-bcel6-6.0-src.zipmd5pgpbcel-6.0-src.zipmd5pgp
    @@ -131,7 +147,7 @@ limitations under the License.

    -- GitLab From 33bf7954a984226a120343a73fd59dc536921b28 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 14:10:30 +0000 Subject: [PATCH 1192/1313] Update website for release 6.0 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749051 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/index.xml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/site/xdoc/index.xml b/src/site/xdoc/index.xml index 7079cdf5..38e328c9 100644 --- a/src/site/xdoc/index.xml +++ b/src/site/xdoc/index.xml @@ -69,7 +69,7 @@

    The svn repository can be @@ -78,17 +78,18 @@

    -

    The latest stable release of BCEL is 5.2. You may:

    +

    The latest stable release of BCEL is 6.0. You may:

    Alternatively you can pull it from the central Maven repositories:

               <groupId>org.apache.bcel</groupId>
               <artifactId>bcel</artifactId>
    -          <version>5.2</version>
    +          <version>6.0</version>
             

    -- GitLab From 471fafd74a53bbf23f249d31d9b9db21bcb5fbf2 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 14:10:59 +0000 Subject: [PATCH 1193/1313] Remove redundant section from home page git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749053 13f79535-47bb-0310-9956-ffa450edef68 --- src/site/xdoc/index.xml | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/site/xdoc/index.xml b/src/site/xdoc/index.xml index 38e328c9..2a7e1753 100644 --- a/src/site/xdoc/index.xml +++ b/src/site/xdoc/index.xml @@ -97,24 +97,10 @@

    - The commons developer mailing list is the main channel of communication for contributors. Please remember that the lists are shared between all commons components, so prefix your email by [lang].

    + The commons developer mailing list is the main channel of communication for contributors. Please remember that the lists are shared between all commons components, so prefix your email by [bcel].

    You can also visit the #apache-commons IRC channel on irc.freenode.net or peruse JIRA.

    Alternatively you can go through the Needs Work tags in the TagList report.

    If you'd like to offer up pull requests via GitHub rather than applying patches to JIRA, we have a GitHub mirror.

    - -
    -

    - The commons mailing lists act as the main support forum. - The user list is suitable for most library usage queries. - The dev list is intended for the development discussion. - Please remember that the lists are shared between all commons components, - so prefix your email by [BCEL]. -

    -

    - Bug reports and enhancements are also welcomed via the JIRA issue tracker. - Please read the instructions carefully. -

    -
    -- GitLab From f5b8154051fe10dd2bc5d5c5ae0ce0dfb149c5e4 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Sat, 18 Jun 2016 14:12:11 +0000 Subject: [PATCH 1194/1313] Creating BCEL 6.0 RC1 soon, so set release to today git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749056 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 2a6590b2..f42d1e44 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -62,7 +62,7 @@ The type attribute can be add,update,fix,remove. --> - - + config_loc=${basedir} false @@ -315,7 +315,7 @@ maven-checkstyle-plugin ${checkstyle.plugin.version} - src/conf/checkstyle.xml + ${basedir}/src/conf/checkstyle.xml config_loc=${basedir} false @@ -408,7 +408,7 @@ - src/conf/clirr-ignored-diffs.xml + ${basedir}/src/conf/clirr-ignored-diffs.xml -- GitLab From 744619b484c59ac09513b36840128a678ee5dc9f Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Mon, 20 Jun 2016 18:52:48 +0000 Subject: [PATCH 1199/1313] Replace atbs with spaces git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749382 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 27070617..d31afc9b 100644 --- a/pom.xml +++ b/pom.xml @@ -225,16 +225,16 @@ - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar - - - + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + maven-surefire-plugin -- GitLab From a21d27b85ad4553d329bb43060511d706e2241d5 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Mon, 20 Jun 2016 18:55:31 +0000 Subject: [PATCH 1200/1313] Set release date to today, since I'm going to create RC6 now. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749385 13f79535-47bb-0310-9956-ffa450edef68 --- src/changes/changes.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index f42d1e44..0e60cf9a 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -62,7 +62,7 @@ The type attribute can be add,update,fix,remove. --> - Date: Tue, 21 Jun 2016 19:48:12 +0000 Subject: [PATCH 1201/1313] Format XML. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749590 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/pom.xml b/pom.xml index d31afc9b..2b7fa605 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,10 @@ * specific language governing permissions and limitations * under the License. --> - + 4.0.0 @@ -196,15 +199,15 @@ - - - org.codehaus.mojo - clirr-maven-plugin - ${commons.clirr.version} - - ${minSeverity} - - + + + org.codehaus.mojo + clirr-maven-plugin + ${commons.clirr.version} + + ${minSeverity} + + org.apache.maven.plugins maven-jar-plugin @@ -241,9 +244,9 @@ - - PerformanceTest.report - false + + PerformanceTest.report + false @@ -404,7 +407,9 @@ quieten-clirr - !clirr.allDifferences + + !clirr.allDifferences + -- GitLab From 047f53fab6e1ccbc406ffe8fc017cdc608a3e945 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 21 Jun 2016 19:50:07 +0000 Subject: [PATCH 1202/1313] Configure RAT for 'mvn apache-rat:check'. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749591 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pom.xml b/pom.xml index 2b7fa605..ae2d48f7 100644 --- a/pom.xml +++ b/pom.xml @@ -199,6 +199,24 @@ + + org.apache.rat + apache-rat-plugin + ${commons.rat.version} + + + src/test/resources/** + docs/*.bib + docs/*.mdl + docs/eps/* + **/*.eps + **/*.bnf + **/*.mini + TODO.JustIce + src/examples/Mini/MiniParser$JJCalls + + + org.codehaus.mojo -- GitLab From 8e00ac7a927f8ab42cae75fb6c5a54cb2bde8c83 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 21 Jun 2016 20:28:51 +0000 Subject: [PATCH 1203/1313] Fix PMD issues: remove unused modifiers, see https://pmd.github.io/pmd-5.4.2/pmd-java/rules/java/unusedcode.html#UnusedModifier git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749597 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/Constants.java | 692 +++++++++--------- .../org/apache/bcel/ExceptionConstants.java | 54 +- .../bcel/generic/InstructionComparator.java | 2 +- .../bcel/generic/InstructionConstants.java | 246 +++---- .../org/apache/bcel/generic/LoadClass.java | 4 +- .../java/org/apache/bcel/util/ClassPath.java | 10 +- .../apache/bcel/util/InstructionFinder.java | 4 +- 7 files changed, 506 insertions(+), 506 deletions(-) diff --git a/src/main/java/org/apache/bcel/Constants.java b/src/main/java/org/apache/bcel/Constants.java index 34265f20..184f7b02 100644 --- a/src/main/java/org/apache/bcel/Constants.java +++ b/src/main/java/org/apache/bcel/Constants.java @@ -29,71 +29,71 @@ public interface Constants { /** Major version number of class files for Java 1.1. * @see #MINOR_1_1 * */ - public static final short MAJOR_1_1 = 45; + short MAJOR_1_1 = 45; /** Minor version number of class files for Java 1.1. * @see #MAJOR_1_1 * */ - public static final short MINOR_1_1 = 3; + short MINOR_1_1 = 3; /** Major version number of class files for Java 1.2. * @see #MINOR_1_2 * */ - public static final short MAJOR_1_2 = 46; + short MAJOR_1_2 = 46; /** Minor version number of class files for Java 1.2. * @see #MAJOR_1_2 * */ - public static final short MINOR_1_2 = 0; + short MINOR_1_2 = 0; /** Major version number of class files for Java 1.2. * @see #MINOR_1_2 * */ - public static final short MAJOR_1_3 = 47; + short MAJOR_1_3 = 47; /** Minor version number of class files for Java 1.3. * @see #MAJOR_1_3 * */ - public static final short MINOR_1_3 = 0; + short MINOR_1_3 = 0; /** Major version number of class files for Java 1.3. * @see #MINOR_1_3 * */ - public static final short MAJOR_1_4 = 48; + short MAJOR_1_4 = 48; /** Minor version number of class files for Java 1.4. * @see #MAJOR_1_4 * */ - public static final short MINOR_1_4 = 0; + short MINOR_1_4 = 0; /** Major version number of class files for Java 1.4. * @see #MINOR_1_4 * */ - public static final short MAJOR_1_5 = 49; + short MAJOR_1_5 = 49; /** Minor version number of class files for Java 1.5. * @see #MAJOR_1_5 * */ - public static final short MINOR_1_5 = 0; + short MINOR_1_5 = 0; /** Default major version number. Class file is for Java 1.1. * @see #MAJOR_1_1 * */ - public static final short MAJOR = MAJOR_1_1; + short MAJOR = MAJOR_1_1; /** Default major version number. Class file is for Java 1.1. * @see #MAJOR_1_1 * */ - public static final short MINOR = MINOR_1_1; + short MINOR = MINOR_1_1; /** Maximum value for an unsigned short. */ - public static final int MAX_SHORT = 65535; // 2^16 - 1 + int MAX_SHORT = 65535; // 2^16 - 1 /** Maximum value for an unsigned byte. */ - public static final int MAX_BYTE = 255; // 2^8 - 1 + int MAX_BYTE = 255; // 2^8 - 1 /** One of the access flags for fields, methods, or classes. * @see " @@ -103,141 +103,141 @@ public interface Constants { * @see " * Flag definitions for Classes in the Java Virtual Machine Specification (Java SE 8 Edition)." */ - public static final short ACC_PUBLIC = 0x0001; + short ACC_PUBLIC = 0x0001; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_PRIVATE = 0x0002; + short ACC_PRIVATE = 0x0002; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_PROTECTED = 0x0004; + short ACC_PROTECTED = 0x0004; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_STATIC = 0x0008; + short ACC_STATIC = 0x0008; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_FINAL = 0x0010; + short ACC_FINAL = 0x0010; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_SYNCHRONIZED = 0x0020; + short ACC_SYNCHRONIZED = 0x0020; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_VOLATILE = 0x0040; + short ACC_VOLATILE = 0x0040; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_BRIDGE = 0x0040; + short ACC_BRIDGE = 0x0040; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_TRANSIENT = 0x0080; + short ACC_TRANSIENT = 0x0080; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_VARARGS = 0x0080; + short ACC_VARARGS = 0x0080; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_NATIVE = 0x0100; + short ACC_NATIVE = 0x0100; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_INTERFACE = 0x0200; + short ACC_INTERFACE = 0x0200; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_ABSTRACT = 0x0400; + short ACC_ABSTRACT = 0x0400; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_STRICT = 0x0800; + short ACC_STRICT = 0x0800; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_SYNTHETIC = 0x1000; + short ACC_SYNTHETIC = 0x1000; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_ANNOTATION = 0x2000; + short ACC_ANNOTATION = 0x2000; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_ENUM = 0x4000; + short ACC_ENUM = 0x4000; // Applies to classes compiled by new compilers only /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short ACC_SUPER = 0x0020; + short ACC_SUPER = 0x0020; /** One of the access flags for fields, methods, or classes. * @see #ACC_PUBLIC */ - public static final short MAX_ACC_FLAG = ACC_ENUM; + short MAX_ACC_FLAG = ACC_ENUM; /** The names of the access flags. */ - public static final String[] ACCESS_NAMES = { + String[] ACCESS_NAMES = { "public", "private", "protected", "static", "final", "synchronized", "volatile", "transient", "native", "interface", "abstract", "strictfp", "synthetic", "annotation", "enum" }; /** Marks a constant pool entry as type UTF-8. */ - public static final byte CONSTANT_Utf8 = 1; + byte CONSTANT_Utf8 = 1; /** Marks a constant pool entry as type Integer. */ - public static final byte CONSTANT_Integer = 3; + byte CONSTANT_Integer = 3; /** Marks a constant pool entry as type Float. */ - public static final byte CONSTANT_Float = 4; + byte CONSTANT_Float = 4; /** Marks a constant pool entry as type Long. */ - public static final byte CONSTANT_Long = 5; + byte CONSTANT_Long = 5; /** Marks a constant pool entry as type Double. */ - public static final byte CONSTANT_Double = 6; + byte CONSTANT_Double = 6; /** Marks a constant pool entry as a Class. */ - public static final byte CONSTANT_Class = 7; + byte CONSTANT_Class = 7; /** Marks a constant pool entry as a Field Reference. */ - public static final byte CONSTANT_Fieldref = 9; + byte CONSTANT_Fieldref = 9; /** Marks a constant pool entry as type String. */ - public static final byte CONSTANT_String = 8; + byte CONSTANT_String = 8; /** Marks a constant pool entry as a Method Reference. */ - public static final byte CONSTANT_Methodref = 10; + byte CONSTANT_Methodref = 10; /** Marks a constant pool entry as an Interface Method Reference. */ - public static final byte CONSTANT_InterfaceMethodref = 11; + byte CONSTANT_InterfaceMethodref = 11; /** Marks a constant pool entry as a name and type. */ - public static final byte CONSTANT_NameAndType = 12; + byte CONSTANT_NameAndType = 12; /** The names of the types of entries in a constant pool. */ - public static final String[] CONSTANT_NAMES = { + String[] CONSTANT_NAMES = { "", "CONSTANT_Utf8", "", "CONSTANT_Integer", "CONSTANT_Float", "CONSTANT_Long", "CONSTANT_Double", "CONSTANT_Class", "CONSTANT_String", "CONSTANT_Fieldref", @@ -248,1076 +248,1076 @@ public interface Constants { * initialization method" or "interface initialization * method". This is "<clinit>". */ - public static final String STATIC_INITIALIZER_NAME = ""; + String STATIC_INITIALIZER_NAME = ""; /** The name of every constructor method in a class, also called * "instance initialization method". This is "<init>". */ - public static final String CONSTRUCTOR_NAME = ""; + String CONSTRUCTOR_NAME = ""; /** The names of the interfaces implemented by arrays */ - public static final String[] INTERFACES_IMPLEMENTED_BY_ARRAYS = {"java.lang.Cloneable", "java.io.Serializable"}; + String[] INTERFACES_IMPLEMENTED_BY_ARRAYS = {"java.lang.Cloneable", "java.io.Serializable"}; /** * One of the limitations of the Java Virtual Machine. * @see * The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. */ - public static final int MAX_CP_ENTRIES = 65535; + int MAX_CP_ENTRIES = 65535; /** * One of the limitations of the Java Virtual Machine. * @see * The Java Virtual Machine Specification, Second Edition, page 152, chapter 4.10. */ - public static final int MAX_CODE_SIZE = 65536; //bytes + int MAX_CODE_SIZE = 65536; //bytes /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short NOP = 0; + short NOP = 0; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ACONST_NULL = 1; + short ACONST_NULL = 1; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ICONST_M1 = 2; + short ICONST_M1 = 2; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ICONST_0 = 3; + short ICONST_0 = 3; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ICONST_1 = 4; + short ICONST_1 = 4; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ICONST_2 = 5; + short ICONST_2 = 5; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ICONST_3 = 6; + short ICONST_3 = 6; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ICONST_4 = 7; + short ICONST_4 = 7; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ICONST_5 = 8; + short ICONST_5 = 8; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LCONST_0 = 9; + short LCONST_0 = 9; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LCONST_1 = 10; + short LCONST_1 = 10; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FCONST_0 = 11; + short FCONST_0 = 11; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FCONST_1 = 12; + short FCONST_1 = 12; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FCONST_2 = 13; + short FCONST_2 = 13; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DCONST_0 = 14; + short DCONST_0 = 14; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DCONST_1 = 15; + short DCONST_1 = 15; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short BIPUSH = 16; + short BIPUSH = 16; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short SIPUSH = 17; + short SIPUSH = 17; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LDC = 18; + short LDC = 18; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LDC_W = 19; + short LDC_W = 19; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LDC2_W = 20; + short LDC2_W = 20; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ILOAD = 21; + short ILOAD = 21; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LLOAD = 22; + short LLOAD = 22; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FLOAD = 23; + short FLOAD = 23; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DLOAD = 24; + short DLOAD = 24; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ALOAD = 25; + short ALOAD = 25; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ILOAD_0 = 26; + short ILOAD_0 = 26; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ILOAD_1 = 27; + short ILOAD_1 = 27; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ILOAD_2 = 28; + short ILOAD_2 = 28; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ILOAD_3 = 29; + short ILOAD_3 = 29; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LLOAD_0 = 30; + short LLOAD_0 = 30; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LLOAD_1 = 31; + short LLOAD_1 = 31; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LLOAD_2 = 32; + short LLOAD_2 = 32; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LLOAD_3 = 33; + short LLOAD_3 = 33; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FLOAD_0 = 34; + short FLOAD_0 = 34; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FLOAD_1 = 35; + short FLOAD_1 = 35; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FLOAD_2 = 36; + short FLOAD_2 = 36; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FLOAD_3 = 37; + short FLOAD_3 = 37; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DLOAD_0 = 38; + short DLOAD_0 = 38; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DLOAD_1 = 39; + short DLOAD_1 = 39; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DLOAD_2 = 40; + short DLOAD_2 = 40; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DLOAD_3 = 41; + short DLOAD_3 = 41; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ALOAD_0 = 42; + short ALOAD_0 = 42; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ALOAD_1 = 43; + short ALOAD_1 = 43; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ALOAD_2 = 44; + short ALOAD_2 = 44; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ALOAD_3 = 45; + short ALOAD_3 = 45; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IALOAD = 46; + short IALOAD = 46; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LALOAD = 47; + short LALOAD = 47; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FALOAD = 48; + short FALOAD = 48; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DALOAD = 49; + short DALOAD = 49; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short AALOAD = 50; + short AALOAD = 50; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short BALOAD = 51; + short BALOAD = 51; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short CALOAD = 52; + short CALOAD = 52; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short SALOAD = 53; + short SALOAD = 53; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ISTORE = 54; + short ISTORE = 54; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LSTORE = 55; + short LSTORE = 55; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FSTORE = 56; + short FSTORE = 56; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DSTORE = 57; + short DSTORE = 57; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ASTORE = 58; + short ASTORE = 58; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ISTORE_0 = 59; + short ISTORE_0 = 59; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ISTORE_1 = 60; + short ISTORE_1 = 60; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ISTORE_2 = 61; + short ISTORE_2 = 61; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ISTORE_3 = 62; + short ISTORE_3 = 62; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LSTORE_0 = 63; + short LSTORE_0 = 63; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LSTORE_1 = 64; + short LSTORE_1 = 64; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LSTORE_2 = 65; + short LSTORE_2 = 65; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LSTORE_3 = 66; + short LSTORE_3 = 66; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FSTORE_0 = 67; + short FSTORE_0 = 67; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FSTORE_1 = 68; + short FSTORE_1 = 68; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FSTORE_2 = 69; + short FSTORE_2 = 69; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FSTORE_3 = 70; + short FSTORE_3 = 70; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DSTORE_0 = 71; + short DSTORE_0 = 71; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DSTORE_1 = 72; + short DSTORE_1 = 72; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DSTORE_2 = 73; + short DSTORE_2 = 73; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DSTORE_3 = 74; + short DSTORE_3 = 74; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ASTORE_0 = 75; + short ASTORE_0 = 75; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ASTORE_1 = 76; + short ASTORE_1 = 76; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ASTORE_2 = 77; + short ASTORE_2 = 77; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ASTORE_3 = 78; + short ASTORE_3 = 78; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IASTORE = 79; + short IASTORE = 79; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LASTORE = 80; + short LASTORE = 80; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FASTORE = 81; + short FASTORE = 81; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DASTORE = 82; + short DASTORE = 82; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short AASTORE = 83; + short AASTORE = 83; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short BASTORE = 84; + short BASTORE = 84; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short CASTORE = 85; + short CASTORE = 85; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short SASTORE = 86; + short SASTORE = 86; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short POP = 87; + short POP = 87; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short POP2 = 88; + short POP2 = 88; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DUP = 89; + short DUP = 89; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DUP_X1 = 90; + short DUP_X1 = 90; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DUP_X2 = 91; + short DUP_X2 = 91; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DUP2 = 92; + short DUP2 = 92; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DUP2_X1 = 93; + short DUP2_X1 = 93; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DUP2_X2 = 94; + short DUP2_X2 = 94; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short SWAP = 95; + short SWAP = 95; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IADD = 96; + short IADD = 96; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LADD = 97; + short LADD = 97; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FADD = 98; + short FADD = 98; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DADD = 99; + short DADD = 99; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ISUB = 100; + short ISUB = 100; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LSUB = 101; + short LSUB = 101; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FSUB = 102; + short FSUB = 102; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DSUB = 103; + short DSUB = 103; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IMUL = 104; + short IMUL = 104; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LMUL = 105; + short LMUL = 105; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FMUL = 106; + short FMUL = 106; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DMUL = 107; + short DMUL = 107; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IDIV = 108; + short IDIV = 108; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LDIV = 109; + short LDIV = 109; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FDIV = 110; + short FDIV = 110; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DDIV = 111; + short DDIV = 111; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IREM = 112; + short IREM = 112; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LREM = 113; + short LREM = 113; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FREM = 114; + short FREM = 114; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DREM = 115; + short DREM = 115; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short INEG = 116; + short INEG = 116; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LNEG = 117; + short LNEG = 117; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FNEG = 118; + short FNEG = 118; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DNEG = 119; + short DNEG = 119; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ISHL = 120; + short ISHL = 120; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LSHL = 121; + short LSHL = 121; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ISHR = 122; + short ISHR = 122; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LSHR = 123; + short LSHR = 123; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IUSHR = 124; + short IUSHR = 124; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LUSHR = 125; + short LUSHR = 125; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IAND = 126; + short IAND = 126; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LAND = 127; + short LAND = 127; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IOR = 128; + short IOR = 128; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LOR = 129; + short LOR = 129; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IXOR = 130; + short IXOR = 130; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LXOR = 131; + short LXOR = 131; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IINC = 132; + short IINC = 132; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short I2L = 133; + short I2L = 133; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short I2F = 134; + short I2F = 134; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short I2D = 135; + short I2D = 135; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short L2I = 136; + short L2I = 136; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short L2F = 137; + short L2F = 137; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short L2D = 138; + short L2D = 138; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short F2I = 139; + short F2I = 139; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short F2L = 140; + short F2L = 140; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short F2D = 141; + short F2D = 141; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short D2I = 142; + short D2I = 142; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short D2L = 143; + short D2L = 143; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short D2F = 144; + short D2F = 144; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short I2B = 145; + short I2B = 145; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short INT2BYTE = 145; // Old notion + short INT2BYTE = 145; // Old notion /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short I2C = 146; + short I2C = 146; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short INT2CHAR = 146; // Old notion + short INT2CHAR = 146; // Old notion /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short I2S = 147; + short I2S = 147; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short INT2SHORT = 147; // Old notion + short INT2SHORT = 147; // Old notion /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LCMP = 148; + short LCMP = 148; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FCMPL = 149; + short FCMPL = 149; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FCMPG = 150; + short FCMPG = 150; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DCMPL = 151; + short DCMPL = 151; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DCMPG = 152; + short DCMPG = 152; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IFEQ = 153; + short IFEQ = 153; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IFNE = 154; + short IFNE = 154; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IFLT = 155; + short IFLT = 155; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IFGE = 156; + short IFGE = 156; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IFGT = 157; + short IFGT = 157; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IFLE = 158; + short IFLE = 158; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IF_ICMPEQ = 159; + short IF_ICMPEQ = 159; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IF_ICMPNE = 160; + short IF_ICMPNE = 160; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IF_ICMPLT = 161; + short IF_ICMPLT = 161; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IF_ICMPGE = 162; + short IF_ICMPGE = 162; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IF_ICMPGT = 163; + short IF_ICMPGT = 163; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IF_ICMPLE = 164; + short IF_ICMPLE = 164; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IF_ACMPEQ = 165; + short IF_ACMPEQ = 165; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IF_ACMPNE = 166; + short IF_ACMPNE = 166; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short GOTO = 167; + short GOTO = 167; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short JSR = 168; + short JSR = 168; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short RET = 169; + short RET = 169; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short TABLESWITCH = 170; + short TABLESWITCH = 170; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LOOKUPSWITCH = 171; + short LOOKUPSWITCH = 171; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IRETURN = 172; + short IRETURN = 172; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short LRETURN = 173; + short LRETURN = 173; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short FRETURN = 174; + short FRETURN = 174; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short DRETURN = 175; + short DRETURN = 175; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ARETURN = 176; + short ARETURN = 176; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short RETURN = 177; + short RETURN = 177; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short GETSTATIC = 178; + short GETSTATIC = 178; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short PUTSTATIC = 179; + short PUTSTATIC = 179; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short GETFIELD = 180; + short GETFIELD = 180; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short PUTFIELD = 181; + short PUTFIELD = 181; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short INVOKEVIRTUAL = 182; + short INVOKEVIRTUAL = 182; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short INVOKESPECIAL = 183; + short INVOKESPECIAL = 183; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short INVOKENONVIRTUAL = 183; // Old name in JDK 1.0 + short INVOKENONVIRTUAL = 183; // Old name in JDK 1.0 /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short INVOKESTATIC = 184; + short INVOKESTATIC = 184; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short INVOKEINTERFACE = 185; + short INVOKEINTERFACE = 185; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short INVOKEDYNAMIC = 186; + short INVOKEDYNAMIC = 186; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short NEW = 187; + short NEW = 187; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short NEWARRAY = 188; + short NEWARRAY = 188; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ANEWARRAY = 189; + short ANEWARRAY = 189; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ARRAYLENGTH = 190; + short ARRAYLENGTH = 190; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short ATHROW = 191; + short ATHROW = 191; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short CHECKCAST = 192; + short CHECKCAST = 192; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short INSTANCEOF = 193; + short INSTANCEOF = 193; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short MONITORENTER = 194; + short MONITORENTER = 194; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short MONITOREXIT = 195; + short MONITOREXIT = 195; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short WIDE = 196; + short WIDE = 196; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short MULTIANEWARRAY = 197; + short MULTIANEWARRAY = 197; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IFNULL = 198; + short IFNULL = 198; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short IFNONNULL = 199; + short IFNONNULL = 199; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short GOTO_W = 200; + short GOTO_W = 200; /** Java VM opcode. * @see * Opcode definitions in The Java Virtual Machine Specification */ - public static final short JSR_W = 201; + short JSR_W = 201; /** JVM internal opcode. * @see * Reserved opcodes in the Java Virtual Machine Specification */ - public static final short BREAKPOINT = 202; + short BREAKPOINT = 202; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short LDC_QUICK = 203; + short LDC_QUICK = 203; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short LDC_W_QUICK = 204; + short LDC_W_QUICK = 204; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short LDC2_W_QUICK = 205; + short LDC2_W_QUICK = 205; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short GETFIELD_QUICK = 206; + short GETFIELD_QUICK = 206; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short PUTFIELD_QUICK = 207; + short PUTFIELD_QUICK = 207; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short GETFIELD2_QUICK = 208; + short GETFIELD2_QUICK = 208; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short PUTFIELD2_QUICK = 209; + short PUTFIELD2_QUICK = 209; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short GETSTATIC_QUICK = 210; + short GETSTATIC_QUICK = 210; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short PUTSTATIC_QUICK = 211; + short PUTSTATIC_QUICK = 211; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short GETSTATIC2_QUICK = 212; + short GETSTATIC2_QUICK = 212; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short PUTSTATIC2_QUICK = 213; + short PUTSTATIC2_QUICK = 213; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short INVOKEVIRTUAL_QUICK = 214; + short INVOKEVIRTUAL_QUICK = 214; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short INVOKENONVIRTUAL_QUICK = 215; + short INVOKENONVIRTUAL_QUICK = 215; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short INVOKESUPER_QUICK = 216; + short INVOKESUPER_QUICK = 216; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short INVOKESTATIC_QUICK = 217; + short INVOKESTATIC_QUICK = 217; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short INVOKEINTERFACE_QUICK = 218; + short INVOKEINTERFACE_QUICK = 218; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short INVOKEVIRTUALOBJECT_QUICK = 219; + short INVOKEVIRTUALOBJECT_QUICK = 219; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short NEW_QUICK = 221; + short NEW_QUICK = 221; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short ANEWARRAY_QUICK = 222; + short ANEWARRAY_QUICK = 222; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short MULTIANEWARRAY_QUICK = 223; + short MULTIANEWARRAY_QUICK = 223; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short CHECKCAST_QUICK = 224; + short CHECKCAST_QUICK = 224; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short INSTANCEOF_QUICK = 225; + short INSTANCEOF_QUICK = 225; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short INVOKEVIRTUAL_QUICK_W = 226; + short INVOKEVIRTUAL_QUICK_W = 226; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short GETFIELD_QUICK_W = 227; + short GETFIELD_QUICK_W = 227; /** JVM internal opcode. * @see * Specification of _quick opcodes in the Java Virtual Machine Specification (version 1) * @see * Why the _quick opcodes were removed from the second version of the Java Virtual Machine Specification. */ - public static final short PUTFIELD_QUICK_W = 228; + short PUTFIELD_QUICK_W = 228; /** JVM internal opcode. * @see * Reserved opcodes in the Java Virtual Machine Specification */ - public static final short IMPDEP1 = 254; + short IMPDEP1 = 254; /** JVM internal opcode. * @see * Reserved opcodes in the Java Virtual Machine Specification */ - public static final short IMPDEP2 = 255; + short IMPDEP2 = 255; /** * BCEL virtual instruction for pushing an arbitrary data type onto the stack. Will be converted to the appropriate JVM * opcode when the class is dumped. */ - public static final short PUSH = 4711; + short PUSH = 4711; /** * BCEL virtual instruction for either LOOKUPSWITCH or TABLESWITCH. Will be converted to the appropriate JVM * opcode when the class is dumped. */ - public static final short SWITCH = 4712; + short SWITCH = 4712; /** Illegal opcode. */ - public static final short UNDEFINED = -1; + short UNDEFINED = -1; /** Illegal opcode. */ - public static final short UNPREDICTABLE = -2; + short UNPREDICTABLE = -2; /** Illegal opcode. */ - public static final short RESERVED = -3; + short RESERVED = -3; /** Mnemonic for an illegal opcode. */ - public static final String ILLEGAL_OPCODE = ""; + String ILLEGAL_OPCODE = ""; /** Mnemonic for an illegal type. */ - public static final String ILLEGAL_TYPE = ""; + String ILLEGAL_TYPE = ""; /** Boolean data type. */ - public static final byte T_BOOLEAN = 4; + byte T_BOOLEAN = 4; /** Char data type. */ - public static final byte T_CHAR = 5; + byte T_CHAR = 5; /** Float data type. */ - public static final byte T_FLOAT = 6; + byte T_FLOAT = 6; /** Double data type. */ - public static final byte T_DOUBLE = 7; + byte T_DOUBLE = 7; /** Byte data type. */ - public static final byte T_BYTE = 8; + byte T_BYTE = 8; /** Short data type. */ - public static final byte T_SHORT = 9; + byte T_SHORT = 9; /** Int data type. */ - public static final byte T_INT = 10; + byte T_INT = 10; /** Long data type. */ - public static final byte T_LONG = 11; + byte T_LONG = 11; /** Void data type (non-standard). */ - public static final byte T_VOID = 12; // Non-standard + byte T_VOID = 12; // Non-standard /** Array data type. */ - public static final byte T_ARRAY = 13; + byte T_ARRAY = 13; /** Object data type. */ - public static final byte T_OBJECT = 14; + byte T_OBJECT = 14; /** Reference data type (deprecated). */ - public static final byte T_REFERENCE = 14; // Deprecated + byte T_REFERENCE = 14; // Deprecated /** Unknown data type. */ - public static final byte T_UNKNOWN = 15; + byte T_UNKNOWN = 15; /** Address data type. */ - public static final byte T_ADDRESS = 16; + byte T_ADDRESS = 16; /** The primitive type names corresponding to the T_XX constants, * e.g., TYPE_NAMES[T_INT] = "int" */ - public static final String[] TYPE_NAMES = { + String[] TYPE_NAMES = { ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "boolean", "char", "float", "double", "byte", "short", "int", "long", "void", "array", "object", "unknown", "address" @@ -1326,7 +1326,7 @@ public interface Constants { /** The primitive class names corresponding to the T_XX constants, * e.g., CLASS_TYPE_NAMES[T_INT] = "java.lang.Integer" */ - public static final String[] CLASS_TYPE_NAMES = { + String[] CLASS_TYPE_NAMES = { ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "java.lang.Boolean", "java.lang.Character", "java.lang.Float", "java.lang.Double", "java.lang.Byte", "java.lang.Short", @@ -1337,7 +1337,7 @@ public interface Constants { /** The signature characters corresponding to primitive types, * e.g., SHORT_TYPE_NAMES[T_INT] = "I" */ - public static final String[] SHORT_TYPE_NAMES = { + String[] SHORT_TYPE_NAMES = { ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE, "Z", "C", "F", "D", "B", "S", "I", "J", "V", ILLEGAL_TYPE, ILLEGAL_TYPE, ILLEGAL_TYPE @@ -1348,7 +1348,7 @@ public interface Constants { * itself. Indexed by opcode, so NO_OF_OPERANDS[BIPUSH] = the number of operands for a bipush * instruction. */ - public static final short[] NO_OF_OPERANDS = { + short[] NO_OF_OPERANDS = { 0/*nop*/, 0/*aconst_null*/, 0/*iconst_m1*/, 0/*iconst_0*/, 0/*iconst_1*/, 0/*iconst_2*/, 0/*iconst_3*/, 0/*iconst_4*/, 0/*iconst_5*/, 0/*lconst_0*/, 0/*lconst_1*/, 0/*fconst_0*/, @@ -1414,7 +1414,7 @@ public interface Constants { * Indexed by opcode. TYPE_OF_OPERANDS[ILOAD] = an array of shorts * describing the data types for the instruction. */ - public static final short[][] TYPE_OF_OPERANDS = { + short[][] TYPE_OF_OPERANDS = { {}/*nop*/, {}/*aconst_null*/, {}/*iconst_m1*/, {}/*iconst_0*/, {}/*iconst_1*/, {}/*iconst_2*/, {}/*iconst_3*/, {}/*iconst_4*/, {}/*iconst_5*/, {}/*lconst_0*/, {}/*lconst_1*/, {}/*fconst_0*/, @@ -1481,7 +1481,7 @@ public interface Constants { /** * Names of opcodes. Indexed by opcode. OPCODE_NAMES[ALOAD] = "aload". */ - public static final String[] OPCODE_NAMES = { + String[] OPCODE_NAMES = { "nop", "aconst_null", "iconst_m1", "iconst_0", "iconst_1", "iconst_2", "iconst_3", "iconst_4", "iconst_5", "lconst_0", "lconst_1", "fconst_0", "fconst_1", "fconst_2", "dconst_0", @@ -1535,7 +1535,7 @@ public interface Constants { * Indexed by opcode. CONSUME_STACK[FALOAD] = number of words * consumed from the stack by a faload instruction. */ - public static final int[] CONSUME_STACK = { + int[] CONSUME_STACK = { 0/*nop*/, 0/*aconst_null*/, 0/*iconst_m1*/, 0/*iconst_0*/, 0/*iconst_1*/, 0/*iconst_2*/, 0/*iconst_3*/, 0/*iconst_4*/, 0/*iconst_5*/, 0/*lconst_0*/, 0/*lconst_1*/, 0/*fconst_0*/, 0/*fconst_1*/, 0/*fconst_2*/, 0/*dconst_0*/, @@ -1591,7 +1591,7 @@ public interface Constants { * Indexed by opcode. CONSUME_STACK[DALOAD] = number of words * consumed from the stack by a daload instruction. */ - public static final int[] PRODUCE_STACK = { + int[] PRODUCE_STACK = { 0/*nop*/, 1/*aconst_null*/, 1/*iconst_m1*/, 1/*iconst_0*/, 1/*iconst_1*/, 1/*iconst_2*/, 1/*iconst_3*/, 1/*iconst_4*/, 1/*iconst_5*/, 2/*lconst_0*/, 2/*lconst_1*/, 1/*fconst_0*/, 1/*fconst_1*/, 1/*fconst_2*/, 2/*dconst_0*/, @@ -1644,30 +1644,30 @@ public interface Constants { /** Attributes and their corresponding names. */ - public static final byte ATTR_UNKNOWN = -1; - public static final byte ATTR_SOURCE_FILE = 0; - public static final byte ATTR_CONSTANT_VALUE = 1; - public static final byte ATTR_CODE = 2; - public static final byte ATTR_EXCEPTIONS = 3; - public static final byte ATTR_LINE_NUMBER_TABLE = 4; - public static final byte ATTR_LOCAL_VARIABLE_TABLE = 5; - public static final byte ATTR_INNER_CLASSES = 6; - public static final byte ATTR_SYNTHETIC = 7; - public static final byte ATTR_DEPRECATED = 8; - public static final byte ATTR_PMG = 9; - public static final byte ATTR_SIGNATURE = 10; - public static final byte ATTR_STACK_MAP = 11; - public static final byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = 12; - public static final byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = 13; - public static final byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = 14; - public static final byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = 15; - public static final byte ATTR_ANNOTATION_DEFAULT = 16; - - public static final short KNOWN_ATTRIBUTES = 12;//should be 17 + byte ATTR_UNKNOWN = -1; + byte ATTR_SOURCE_FILE = 0; + byte ATTR_CONSTANT_VALUE = 1; + byte ATTR_CODE = 2; + byte ATTR_EXCEPTIONS = 3; + byte ATTR_LINE_NUMBER_TABLE = 4; + byte ATTR_LOCAL_VARIABLE_TABLE = 5; + byte ATTR_INNER_CLASSES = 6; + byte ATTR_SYNTHETIC = 7; + byte ATTR_DEPRECATED = 8; + byte ATTR_PMG = 9; + byte ATTR_SIGNATURE = 10; + byte ATTR_STACK_MAP = 11; + byte ATTR_RUNTIMEVISIBLE_ANNOTATIONS = 12; + byte ATTR_RUNTIMEINVISIBLE_ANNOTATIONS = 13; + byte ATTR_RUNTIMEVISIBLE_PARAMETER_ANNOTATIONS = 14; + byte ATTR_RUNTIMEINVISIBLE_PARAMETER_ANNOTATIONS = 15; + byte ATTR_ANNOTATION_DEFAULT = 16; + + short KNOWN_ATTRIBUTES = 12;//should be 17 // TODO: mutable public array!! - public static final String[] ATTRIBUTE_NAMES = { + String[] ATTRIBUTE_NAMES = { "SourceFile", "ConstantValue", "Code", "Exceptions", "LineNumberTable", "LocalVariableTable", "InnerClasses", "Synthetic", "Deprecated", @@ -1679,17 +1679,17 @@ public interface Constants { /** Constants used in the StackMap attribute. */ - public static final byte ITEM_Bogus = 0; - public static final byte ITEM_Integer = 1; - public static final byte ITEM_Float = 2; - public static final byte ITEM_Double = 3; - public static final byte ITEM_Long = 4; - public static final byte ITEM_Null = 5; - public static final byte ITEM_InitObject = 6; - public static final byte ITEM_Object = 7; - public static final byte ITEM_NewObject = 8; - - public static final String[] ITEM_NAMES = { + byte ITEM_Bogus = 0; + byte ITEM_Integer = 1; + byte ITEM_Float = 2; + byte ITEM_Double = 3; + byte ITEM_Long = 4; + byte ITEM_Null = 5; + byte ITEM_InitObject = 6; + byte ITEM_Object = 7; + byte ITEM_NewObject = 8; + + String[] ITEM_NAMES = { "Bogus", "Integer", "Float", "Double", "Long", "Null", "InitObject", "Object", "NewObject" }; diff --git a/src/main/java/org/apache/bcel/ExceptionConstants.java b/src/main/java/org/apache/bcel/ExceptionConstants.java index 10089d21..a19d6eed 100644 --- a/src/main/java/org/apache/bcel/ExceptionConstants.java +++ b/src/main/java/org/apache/bcel/ExceptionConstants.java @@ -28,38 +28,38 @@ public interface ExceptionConstants { /** The mother of all exceptions */ - public static final Class THROWABLE = Throwable.class; + Class THROWABLE = Throwable.class; /** Super class of any run-time exception */ - public static final Class RUNTIME_EXCEPTION = RuntimeException.class; + Class RUNTIME_EXCEPTION = RuntimeException.class; /** Super class of any linking exception (aka Linkage Error) */ - public static final Class LINKING_EXCEPTION = LinkageError.class; + Class LINKING_EXCEPTION = LinkageError.class; /** Linking Exceptions */ - public static final Class CLASS_CIRCULARITY_ERROR = ClassCircularityError.class; - public static final Class CLASS_FORMAT_ERROR = ClassFormatError.class; - public static final Class EXCEPTION_IN_INITIALIZER_ERROR = ExceptionInInitializerError.class; - public static final Class INCOMPATIBLE_CLASS_CHANGE_ERROR = IncompatibleClassChangeError.class; - public static final Class ABSTRACT_METHOD_ERROR = AbstractMethodError.class; - public static final Class ILLEGAL_ACCESS_ERROR = IllegalAccessError.class; - public static final Class INSTANTIATION_ERROR = InstantiationError.class; - public static final Class NO_SUCH_FIELD_ERROR = NoSuchFieldError.class; - public static final Class NO_SUCH_METHOD_ERROR = NoSuchMethodError.class; - public static final Class NO_CLASS_DEF_FOUND_ERROR = NoClassDefFoundError.class; - public static final Class UNSATISFIED_LINK_ERROR = UnsatisfiedLinkError.class; - public static final Class VERIFY_ERROR = VerifyError.class; + Class CLASS_CIRCULARITY_ERROR = ClassCircularityError.class; + Class CLASS_FORMAT_ERROR = ClassFormatError.class; + Class EXCEPTION_IN_INITIALIZER_ERROR = ExceptionInInitializerError.class; + Class INCOMPATIBLE_CLASS_CHANGE_ERROR = IncompatibleClassChangeError.class; + Class ABSTRACT_METHOD_ERROR = AbstractMethodError.class; + Class ILLEGAL_ACCESS_ERROR = IllegalAccessError.class; + Class INSTANTIATION_ERROR = InstantiationError.class; + Class NO_SUCH_FIELD_ERROR = NoSuchFieldError.class; + Class NO_SUCH_METHOD_ERROR = NoSuchMethodError.class; + Class NO_CLASS_DEF_FOUND_ERROR = NoClassDefFoundError.class; + Class UNSATISFIED_LINK_ERROR = UnsatisfiedLinkError.class; + Class VERIFY_ERROR = VerifyError.class; /* UnsupportedClassVersionError is new in JDK 1.2 */ -// public static final Class UnsupportedClassVersionError = UnsupportedClassVersionError.class; +// Class UnsupportedClassVersionError = UnsupportedClassVersionError.class; /** Run-Time Exceptions */ - public static final Class NULL_POINTER_EXCEPTION = NullPointerException.class; - public static final Class ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION + Class NULL_POINTER_EXCEPTION = NullPointerException.class; + Class ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION = ArrayIndexOutOfBoundsException.class; - public static final Class ARITHMETIC_EXCEPTION = ArithmeticException.class; - public static final Class NEGATIVE_ARRAY_SIZE_EXCEPTION = NegativeArraySizeException.class; - public static final Class CLASS_CAST_EXCEPTION = ClassCastException.class; - public static final Class ILLEGAL_MONITOR_STATE = IllegalMonitorStateException.class; + Class ARITHMETIC_EXCEPTION = ArithmeticException.class; + Class NEGATIVE_ARRAY_SIZE_EXCEPTION = NegativeArraySizeException.class; + Class CLASS_CAST_EXCEPTION = ClassCastException.class; + Class ILLEGAL_MONITOR_STATE = IllegalMonitorStateException.class; /** * Pre-defined exception arrays according to chapters 5.1-5.4 of the Java Virtual @@ -67,21 +67,21 @@ public interface ExceptionConstants { * @deprecated Do not use these arrays, use the static methods in the ExceptionConst implementation class instead */ @Deprecated - public static final Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION = { + Class[] EXCS_CLASS_AND_INTERFACE_RESOLUTION = { NO_CLASS_DEF_FOUND_ERROR, CLASS_FORMAT_ERROR, VERIFY_ERROR, ABSTRACT_METHOD_ERROR, EXCEPTION_IN_INITIALIZER_ERROR, ILLEGAL_ACCESS_ERROR }; // Chapter 5.1 @Deprecated - public static final Class[] EXCS_FIELD_AND_METHOD_RESOLUTION = { + Class[] EXCS_FIELD_AND_METHOD_RESOLUTION = { NO_SUCH_FIELD_ERROR, ILLEGAL_ACCESS_ERROR, NO_SUCH_METHOD_ERROR }; // Chapter 5.2 @Deprecated - public static final Class[] EXCS_INTERFACE_METHOD_RESOLUTION = new Class[0]; // Chapter 5.3 (as below) + Class[] EXCS_INTERFACE_METHOD_RESOLUTION = new Class[0]; // Chapter 5.3 (as below) @Deprecated - public static final Class[] EXCS_STRING_RESOLUTION = new Class[0]; + Class[] EXCS_STRING_RESOLUTION = new Class[0]; // Chapter 5.4 (no errors but the ones that _always_ could happen! How stupid.) @Deprecated - public static final Class[] EXCS_ARRAY_EXCEPTION = { + Class[] EXCS_ARRAY_EXCEPTION = { NULL_POINTER_EXCEPTION, ARRAY_INDEX_OUT_OF_BOUNDS_EXCEPTION }; diff --git a/src/main/java/org/apache/bcel/generic/InstructionComparator.java b/src/main/java/org/apache/bcel/generic/InstructionComparator.java index 16558c28..84905bce 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionComparator.java +++ b/src/main/java/org/apache/bcel/generic/InstructionComparator.java @@ -31,7 +31,7 @@ package org.apache.bcel.generic; */ public interface InstructionComparator { - public static final InstructionComparator DEFAULT = new InstructionComparator() { + InstructionComparator DEFAULT = new InstructionComparator() { @Override public boolean equals( final Instruction i1, final Instruction i2 ) { diff --git a/src/main/java/org/apache/bcel/generic/InstructionConstants.java b/src/main/java/org/apache/bcel/generic/InstructionConstants.java index d5166c6b..b2e0dcfe 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionConstants.java +++ b/src/main/java/org/apache/bcel/generic/InstructionConstants.java @@ -45,139 +45,139 @@ public interface InstructionConstants { * NOTE these are not currently immutable, because Instruction * has mutable protected fields opcode and length. */ - public static final Instruction NOP = new NOP(); - public static final Instruction ACONST_NULL = new ACONST_NULL(); - public static final Instruction ICONST_M1 = new ICONST(-1); - public static final Instruction ICONST_0 = new ICONST(0); - public static final Instruction ICONST_1 = new ICONST(1); - public static final Instruction ICONST_2 = new ICONST(2); - public static final Instruction ICONST_3 = new ICONST(3); - public static final Instruction ICONST_4 = new ICONST(4); - public static final Instruction ICONST_5 = new ICONST(5); - public static final Instruction LCONST_0 = new LCONST(0); - public static final Instruction LCONST_1 = new LCONST(1); - public static final Instruction FCONST_0 = new FCONST(0); - public static final Instruction FCONST_1 = new FCONST(1); - public static final Instruction FCONST_2 = new FCONST(2); - public static final Instruction DCONST_0 = new DCONST(0); - public static final Instruction DCONST_1 = new DCONST(1); - public static final ArrayInstruction IALOAD = new IALOAD(); - public static final ArrayInstruction LALOAD = new LALOAD(); - public static final ArrayInstruction FALOAD = new FALOAD(); - public static final ArrayInstruction DALOAD = new DALOAD(); - public static final ArrayInstruction AALOAD = new AALOAD(); - public static final ArrayInstruction BALOAD = new BALOAD(); - public static final ArrayInstruction CALOAD = new CALOAD(); - public static final ArrayInstruction SALOAD = new SALOAD(); - public static final ArrayInstruction IASTORE = new IASTORE(); - public static final ArrayInstruction LASTORE = new LASTORE(); - public static final ArrayInstruction FASTORE = new FASTORE(); - public static final ArrayInstruction DASTORE = new DASTORE(); - public static final ArrayInstruction AASTORE = new AASTORE(); - public static final ArrayInstruction BASTORE = new BASTORE(); - public static final ArrayInstruction CASTORE = new CASTORE(); - public static final ArrayInstruction SASTORE = new SASTORE(); - public static final StackInstruction POP = new POP(); - public static final StackInstruction POP2 = new POP2(); - public static final StackInstruction DUP = new DUP(); - public static final StackInstruction DUP_X1 = new DUP_X1(); - public static final StackInstruction DUP_X2 = new DUP_X2(); - public static final StackInstruction DUP2 = new DUP2(); - public static final StackInstruction DUP2_X1 = new DUP2_X1(); - public static final StackInstruction DUP2_X2 = new DUP2_X2(); - public static final StackInstruction SWAP = new SWAP(); - public static final ArithmeticInstruction IADD = new IADD(); - public static final ArithmeticInstruction LADD = new LADD(); - public static final ArithmeticInstruction FADD = new FADD(); - public static final ArithmeticInstruction DADD = new DADD(); - public static final ArithmeticInstruction ISUB = new ISUB(); - public static final ArithmeticInstruction LSUB = new LSUB(); - public static final ArithmeticInstruction FSUB = new FSUB(); - public static final ArithmeticInstruction DSUB = new DSUB(); - public static final ArithmeticInstruction IMUL = new IMUL(); - public static final ArithmeticInstruction LMUL = new LMUL(); - public static final ArithmeticInstruction FMUL = new FMUL(); - public static final ArithmeticInstruction DMUL = new DMUL(); - public static final ArithmeticInstruction IDIV = new IDIV(); - public static final ArithmeticInstruction LDIV = new LDIV(); - public static final ArithmeticInstruction FDIV = new FDIV(); - public static final ArithmeticInstruction DDIV = new DDIV(); - public static final ArithmeticInstruction IREM = new IREM(); - public static final ArithmeticInstruction LREM = new LREM(); - public static final ArithmeticInstruction FREM = new FREM(); - public static final ArithmeticInstruction DREM = new DREM(); - public static final ArithmeticInstruction INEG = new INEG(); - public static final ArithmeticInstruction LNEG = new LNEG(); - public static final ArithmeticInstruction FNEG = new FNEG(); - public static final ArithmeticInstruction DNEG = new DNEG(); - public static final ArithmeticInstruction ISHL = new ISHL(); - public static final ArithmeticInstruction LSHL = new LSHL(); - public static final ArithmeticInstruction ISHR = new ISHR(); - public static final ArithmeticInstruction LSHR = new LSHR(); - public static final ArithmeticInstruction IUSHR = new IUSHR(); - public static final ArithmeticInstruction LUSHR = new LUSHR(); - public static final ArithmeticInstruction IAND = new IAND(); - public static final ArithmeticInstruction LAND = new LAND(); - public static final ArithmeticInstruction IOR = new IOR(); - public static final ArithmeticInstruction LOR = new LOR(); - public static final ArithmeticInstruction IXOR = new IXOR(); - public static final ArithmeticInstruction LXOR = new LXOR(); - public static final ConversionInstruction I2L = new I2L(); - public static final ConversionInstruction I2F = new I2F(); - public static final ConversionInstruction I2D = new I2D(); - public static final ConversionInstruction L2I = new L2I(); - public static final ConversionInstruction L2F = new L2F(); - public static final ConversionInstruction L2D = new L2D(); - public static final ConversionInstruction F2I = new F2I(); - public static final ConversionInstruction F2L = new F2L(); - public static final ConversionInstruction F2D = new F2D(); - public static final ConversionInstruction D2I = new D2I(); - public static final ConversionInstruction D2L = new D2L(); - public static final ConversionInstruction D2F = new D2F(); - public static final ConversionInstruction I2B = new I2B(); - public static final ConversionInstruction I2C = new I2C(); - public static final ConversionInstruction I2S = new I2S(); - public static final Instruction LCMP = new LCMP(); - public static final Instruction FCMPL = new FCMPL(); - public static final Instruction FCMPG = new FCMPG(); - public static final Instruction DCMPL = new DCMPL(); - public static final Instruction DCMPG = new DCMPG(); - public static final ReturnInstruction IRETURN = new IRETURN(); - public static final ReturnInstruction LRETURN = new LRETURN(); - public static final ReturnInstruction FRETURN = new FRETURN(); - public static final ReturnInstruction DRETURN = new DRETURN(); - public static final ReturnInstruction ARETURN = new ARETURN(); - public static final ReturnInstruction RETURN = new RETURN(); - public static final Instruction ARRAYLENGTH = new ARRAYLENGTH(); - public static final Instruction ATHROW = new ATHROW(); - public static final Instruction MONITORENTER = new MONITORENTER(); - public static final Instruction MONITOREXIT = new MONITOREXIT(); + Instruction NOP = new NOP(); + Instruction ACONST_NULL = new ACONST_NULL(); + Instruction ICONST_M1 = new ICONST(-1); + Instruction ICONST_0 = new ICONST(0); + Instruction ICONST_1 = new ICONST(1); + Instruction ICONST_2 = new ICONST(2); + Instruction ICONST_3 = new ICONST(3); + Instruction ICONST_4 = new ICONST(4); + Instruction ICONST_5 = new ICONST(5); + Instruction LCONST_0 = new LCONST(0); + Instruction LCONST_1 = new LCONST(1); + Instruction FCONST_0 = new FCONST(0); + Instruction FCONST_1 = new FCONST(1); + Instruction FCONST_2 = new FCONST(2); + Instruction DCONST_0 = new DCONST(0); + Instruction DCONST_1 = new DCONST(1); + ArrayInstruction IALOAD = new IALOAD(); + ArrayInstruction LALOAD = new LALOAD(); + ArrayInstruction FALOAD = new FALOAD(); + ArrayInstruction DALOAD = new DALOAD(); + ArrayInstruction AALOAD = new AALOAD(); + ArrayInstruction BALOAD = new BALOAD(); + ArrayInstruction CALOAD = new CALOAD(); + ArrayInstruction SALOAD = new SALOAD(); + ArrayInstruction IASTORE = new IASTORE(); + ArrayInstruction LASTORE = new LASTORE(); + ArrayInstruction FASTORE = new FASTORE(); + ArrayInstruction DASTORE = new DASTORE(); + ArrayInstruction AASTORE = new AASTORE(); + ArrayInstruction BASTORE = new BASTORE(); + ArrayInstruction CASTORE = new CASTORE(); + ArrayInstruction SASTORE = new SASTORE(); + StackInstruction POP = new POP(); + StackInstruction POP2 = new POP2(); + StackInstruction DUP = new DUP(); + StackInstruction DUP_X1 = new DUP_X1(); + StackInstruction DUP_X2 = new DUP_X2(); + StackInstruction DUP2 = new DUP2(); + StackInstruction DUP2_X1 = new DUP2_X1(); + StackInstruction DUP2_X2 = new DUP2_X2(); + StackInstruction SWAP = new SWAP(); + ArithmeticInstruction IADD = new IADD(); + ArithmeticInstruction LADD = new LADD(); + ArithmeticInstruction FADD = new FADD(); + ArithmeticInstruction DADD = new DADD(); + ArithmeticInstruction ISUB = new ISUB(); + ArithmeticInstruction LSUB = new LSUB(); + ArithmeticInstruction FSUB = new FSUB(); + ArithmeticInstruction DSUB = new DSUB(); + ArithmeticInstruction IMUL = new IMUL(); + ArithmeticInstruction LMUL = new LMUL(); + ArithmeticInstruction FMUL = new FMUL(); + ArithmeticInstruction DMUL = new DMUL(); + ArithmeticInstruction IDIV = new IDIV(); + ArithmeticInstruction LDIV = new LDIV(); + ArithmeticInstruction FDIV = new FDIV(); + ArithmeticInstruction DDIV = new DDIV(); + ArithmeticInstruction IREM = new IREM(); + ArithmeticInstruction LREM = new LREM(); + ArithmeticInstruction FREM = new FREM(); + ArithmeticInstruction DREM = new DREM(); + ArithmeticInstruction INEG = new INEG(); + ArithmeticInstruction LNEG = new LNEG(); + ArithmeticInstruction FNEG = new FNEG(); + ArithmeticInstruction DNEG = new DNEG(); + ArithmeticInstruction ISHL = new ISHL(); + ArithmeticInstruction LSHL = new LSHL(); + ArithmeticInstruction ISHR = new ISHR(); + ArithmeticInstruction LSHR = new LSHR(); + ArithmeticInstruction IUSHR = new IUSHR(); + ArithmeticInstruction LUSHR = new LUSHR(); + ArithmeticInstruction IAND = new IAND(); + ArithmeticInstruction LAND = new LAND(); + ArithmeticInstruction IOR = new IOR(); + ArithmeticInstruction LOR = new LOR(); + ArithmeticInstruction IXOR = new IXOR(); + ArithmeticInstruction LXOR = new LXOR(); + ConversionInstruction I2L = new I2L(); + ConversionInstruction I2F = new I2F(); + ConversionInstruction I2D = new I2D(); + ConversionInstruction L2I = new L2I(); + ConversionInstruction L2F = new L2F(); + ConversionInstruction L2D = new L2D(); + ConversionInstruction F2I = new F2I(); + ConversionInstruction F2L = new F2L(); + ConversionInstruction F2D = new F2D(); + ConversionInstruction D2I = new D2I(); + ConversionInstruction D2L = new D2L(); + ConversionInstruction D2F = new D2F(); + ConversionInstruction I2B = new I2B(); + ConversionInstruction I2C = new I2C(); + ConversionInstruction I2S = new I2S(); + Instruction LCMP = new LCMP(); + Instruction FCMPL = new FCMPL(); + Instruction FCMPG = new FCMPG(); + Instruction DCMPL = new DCMPL(); + Instruction DCMPG = new DCMPG(); + ReturnInstruction IRETURN = new IRETURN(); + ReturnInstruction LRETURN = new LRETURN(); + ReturnInstruction FRETURN = new FRETURN(); + ReturnInstruction DRETURN = new DRETURN(); + ReturnInstruction ARETURN = new ARETURN(); + ReturnInstruction RETURN = new RETURN(); + Instruction ARRAYLENGTH = new ARRAYLENGTH(); + Instruction ATHROW = new ATHROW(); + Instruction MONITORENTER = new MONITORENTER(); + Instruction MONITOREXIT = new MONITOREXIT(); /** You can use these constants in multiple places safely, if you can guarantee * that you will never alter their internal values, e.g. call setIndex(). */ - public static final LocalVariableInstruction THIS = new ALOAD(0); - public static final LocalVariableInstruction ALOAD_0 = THIS; - public static final LocalVariableInstruction ALOAD_1 = new ALOAD(1); - public static final LocalVariableInstruction ALOAD_2 = new ALOAD(2); - public static final LocalVariableInstruction ILOAD_0 = new ILOAD(0); - public static final LocalVariableInstruction ILOAD_1 = new ILOAD(1); - public static final LocalVariableInstruction ILOAD_2 = new ILOAD(2); - public static final LocalVariableInstruction ASTORE_0 = new ASTORE(0); - public static final LocalVariableInstruction ASTORE_1 = new ASTORE(1); - public static final LocalVariableInstruction ASTORE_2 = new ASTORE(2); - public static final LocalVariableInstruction ISTORE_0 = new ISTORE(0); - public static final LocalVariableInstruction ISTORE_1 = new ISTORE(1); - public static final LocalVariableInstruction ISTORE_2 = new ISTORE(2); + LocalVariableInstruction THIS = new ALOAD(0); + LocalVariableInstruction ALOAD_0 = THIS; + LocalVariableInstruction ALOAD_1 = new ALOAD(1); + LocalVariableInstruction ALOAD_2 = new ALOAD(2); + LocalVariableInstruction ILOAD_0 = new ILOAD(0); + LocalVariableInstruction ILOAD_1 = new ILOAD(1); + LocalVariableInstruction ILOAD_2 = new ILOAD(2); + LocalVariableInstruction ASTORE_0 = new ASTORE(0); + LocalVariableInstruction ASTORE_1 = new ASTORE(1); + LocalVariableInstruction ASTORE_2 = new ASTORE(2); + LocalVariableInstruction ISTORE_0 = new ISTORE(0); + LocalVariableInstruction ISTORE_1 = new ISTORE(1); + LocalVariableInstruction ISTORE_2 = new ISTORE(2); /** Get object via its opcode, for immutable instructions like * branch instructions entries are set to null. */ - public static final Instruction[] INSTRUCTIONS = new Instruction[256]; + Instruction[] INSTRUCTIONS = new Instruction[256]; /** Interfaces may have no static initializers, so we simulate this * with an inner class. */ - static final Clinit bla = new Clinit(); + Clinit bla = new Clinit(); - static class Clinit { + class Clinit { Clinit() { INSTRUCTIONS[Const.NOP] = NOP; diff --git a/src/main/java/org/apache/bcel/generic/LoadClass.java b/src/main/java/org/apache/bcel/generic/LoadClass.java index 39d281e8..87262ea7 100644 --- a/src/main/java/org/apache/bcel/generic/LoadClass.java +++ b/src/main/java/org/apache/bcel/generic/LoadClass.java @@ -31,7 +31,7 @@ public interface LoadClass { * @return object type that may be loaded or null if a primitive is * referenced */ - public ObjectType getLoadClassType( ConstantPoolGen cpg ); + ObjectType getLoadClassType( ConstantPoolGen cpg ); /** @@ -46,5 +46,5 @@ public interface LoadClass { * an int[][]. * @see #getLoadClassType(ConstantPoolGen) */ - public Type getType( ConstantPoolGen cpg ); + Type getType( ConstantPoolGen cpg ); } diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java index 58e99f1d..2f2f16de 100644 --- a/src/main/java/org/apache/bcel/util/ClassPath.java +++ b/src/main/java/org/apache/bcel/util/ClassPath.java @@ -370,28 +370,28 @@ public class ClassPath { /** @return input stream for class file. */ - public abstract InputStream getInputStream() throws IOException; + InputStream getInputStream() throws IOException; /** @return canonical path to class file. */ - public abstract String getPath(); + String getPath(); /** @return base path of found class, i.e. class is contained relative * to that path, which may either denote a directory, or zip file */ - public abstract String getBase(); + String getBase(); /** @return modification time of class file. */ - public abstract long getTime(); + long getTime(); /** @return size of class file. */ - public abstract long getSize(); + long getSize(); } private static class Dir extends PathEntry { diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index adc1370c..2ad97346 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -297,14 +297,14 @@ public class InstructionFinder { * check constraints that can not expressed with regular expressions. * */ - public static interface CodeConstraint { + public interface CodeConstraint { /** * @param match * array of instructions matching the requested pattern * @return true if the matched area is really useful */ - public boolean checkCode( InstructionHandle[] match ); + boolean checkCode( InstructionHandle[] match ); } // Initialize pattern map -- GitLab From 6b15ab9b40bd83a70b52d70eb24b426fd54418be Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 21 Jun 2016 20:36:33 +0000 Subject: [PATCH 1204/1313] Restore BC vs. 5.2. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749598 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/CodeException.java | 3 ++- src/main/java/org/apache/bcel/classfile/LocalVariable.java | 3 ++- src/main/java/org/apache/bcel/generic/InstructionFactory.java | 2 +- src/main/java/org/apache/bcel/generic/PUSH.java | 2 +- src/main/java/org/apache/bcel/util/Class2HTML.java | 3 ++- .../java/org/apache/bcel/verifier/statics/Pass2Verifier.java | 4 ++-- .../bcel/verifier/structurals/UninitializedObjectType.java | 3 ++- 7 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/CodeException.java b/src/main/java/org/apache/bcel/classfile/CodeException.java index 31861b82..dd73596e 100644 --- a/src/main/java/org/apache/bcel/classfile/CodeException.java +++ b/src/main/java/org/apache/bcel/classfile/CodeException.java @@ -22,6 +22,7 @@ import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Const; +import org.apache.bcel.Constants; /** * This class represents an entry in the exception table of the Code @@ -31,7 +32,7 @@ import org.apache.bcel.Const; * @version $Id$ * @see Code */ -public final class CodeException implements Cloneable, Node { +public final class CodeException implements Cloneable, Node, Constants { private int start_pc; // Range in the code the exception handler is private int end_pc; // active. start_pc is inclusive, end_pc exclusive diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java index e6a3f99d..a92bc100 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariable.java @@ -22,6 +22,7 @@ import java.io.DataOutputStream; import java.io.IOException; import org.apache.bcel.Const; +import org.apache.bcel.Constants; /** * This class represents a local variable within a method. It contains its @@ -30,7 +31,7 @@ import org.apache.bcel.Const; * @version $Id$ * @see LocalVariableTable */ -public final class LocalVariable implements Cloneable, Node { +public final class LocalVariable implements Cloneable, Node, Constants { private int start_pc; // Range in which the variable is valid private int length; diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index 75c2ed92..eed04372 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -32,7 +32,7 @@ import org.apache.bcel.Const; * @see Const * @see InstructionConst */ -public class InstructionFactory { +public class InstructionFactory implements InstructionConstants { // N.N. These must agree with the order of Constants.T_CHAR through T_LONG private static final String[] short_names = { diff --git a/src/main/java/org/apache/bcel/generic/PUSH.java b/src/main/java/org/apache/bcel/generic/PUSH.java index 4c714232..7f133dc9 100644 --- a/src/main/java/org/apache/bcel/generic/PUSH.java +++ b/src/main/java/org/apache/bcel/generic/PUSH.java @@ -25,7 +25,7 @@ import org.apache.bcel.Const; * * @version $Id$ */ -public final class PUSH implements CompoundInstruction, VariableLengthInstruction { +public final class PUSH implements CompoundInstruction, VariableLengthInstruction, InstructionConstants { private Instruction instruction; diff --git a/src/main/java/org/apache/bcel/util/Class2HTML.java b/src/main/java/org/apache/bcel/util/Class2HTML.java index 883bd436..b01ee40b 100644 --- a/src/main/java/org/apache/bcel/util/Class2HTML.java +++ b/src/main/java/org/apache/bcel/util/Class2HTML.java @@ -25,6 +25,7 @@ import java.util.HashSet; import java.util.Set; import org.apache.bcel.Const; +import org.apache.bcel.Constants; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.ConstantPool; @@ -53,7 +54,7 @@ import org.apache.bcel.classfile.Utility; * * @version $Id$ */ -public class Class2HTML { +public class Class2HTML implements Constants { private final JavaClass java_class; // current class object private final String dir; diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 67c4aeb2..1c11c963 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -19,13 +19,13 @@ package org.apache.bcel.verifier.statics; import java.util.HashMap; - import java.util.HashSet; import java.util.Locale; import java.util.Map; import java.util.Set; import org.apache.bcel.Const; +import org.apache.bcel.Constants; import org.apache.bcel.Repository; import org.apache.bcel.classfile.Attribute; import org.apache.bcel.classfile.ClassFormatException; @@ -83,7 +83,7 @@ import org.apache.bcel.verifier.exc.LocalVariableInfoInconsistentException; * @version $Id$ * @see #do_verify() */ -public final class Pass2Verifier extends PassVerifier { +public final class Pass2Verifier extends PassVerifier implements Constants { /** * The LocalVariableInfo instances used by Pass3bVerifier. diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index 9fd03a4a..8c0c57b1 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -19,6 +19,7 @@ package org.apache.bcel.verifier.structurals; import org.apache.bcel.Const; +import org.apache.bcel.Constants; import org.apache.bcel.generic.ObjectType; import org.apache.bcel.generic.ReferenceType; @@ -29,7 +30,7 @@ import org.apache.bcel.generic.ReferenceType; * * @version $Id$ */ -public class UninitializedObjectType extends ReferenceType{ +public class UninitializedObjectType extends ReferenceType implements Constants { /** The "initialized" version. */ private final ObjectType initialized; -- GitLab From c8c91b47da7a68bfd7b335d664934c302332b06d Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 21 Jun 2016 20:37:31 +0000 Subject: [PATCH 1205/1313] Formatting. git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749599 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/bcel/classfile/EnclosingMethod.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java index ebf49480..b02e1461 100644 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -66,11 +66,21 @@ public class EnclosingMethod extends Attribute { } // Accessors - public final int getEnclosingClassIndex() { return classIndex; } - public final int getEnclosingMethodIndex(){ return methodIndex;} + public final int getEnclosingClassIndex() { + return classIndex; + } + + public final int getEnclosingMethodIndex() { + return methodIndex; + } - public final void setEnclosingClassIndex(final int idx) {classIndex = idx;} - public final void setEnclosingMethodIndex(final int idx){methodIndex= idx;} + public final void setEnclosingClassIndex(final int idx) { + classIndex = idx; + } + + public final void setEnclosingMethodIndex(final int idx) { + methodIndex = idx; + } public final ConstantClass getEnclosingClass() { ConstantClass c = -- GitLab From f2e9feb8cba3cf504de07c07c5c4791ad0af7ce4 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 21 Jun 2016 20:43:38 +0000 Subject: [PATCH 1206/1313] Formatting "){" -> ") {". git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749600 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/generic/Type.java | 4 +- .../org/apache/bcel/util/BCELFactory.java | 2 +- .../exc/AssertionViolatedException.java | 10 +- .../exc/ClassConstraintException.java | 6 +- .../verifier/exc/CodeConstraintException.java | 4 +- .../verifier/exc/InvalidMethodException.java | 2 +- .../bcel/verifier/exc/LoadingException.java | 4 +- ...ocalVariableInfoInconsistentException.java | 4 +- .../exc/StaticCodeConstraintException.java | 2 +- ...ticCodeInstructionConstraintException.java | 2 +- ...InstructionOperandConstraintException.java | 2 +- .../StructuralCodeConstraintException.java | 4 +- .../org/apache/bcel/verifier/exc/Utility.java | 4 +- .../verifier/exc/VerificationException.java | 6 +- .../VerifierConstraintViolatedException.java | 10 +- .../bcel/verifier/statics/DOUBLE_Upper.java | 4 +- .../apache/bcel/verifier/statics/IntList.java | 6 +- .../bcel/verifier/statics/LONG_Upper.java | 4 +- .../verifier/statics/LocalVariableInfo.java | 18 +- .../verifier/statics/LocalVariablesInfo.java | 10 +- .../bcel/verifier/statics/Pass1Verifier.java | 22 +- .../bcel/verifier/statics/Pass2Verifier.java | 322 +++--- .../bcel/verifier/statics/Pass3aVerifier.java | 326 +++--- .../structurals/ControlFlowGraph.java | 82 +- .../structurals/ExceptionHandler.java | 6 +- .../structurals/ExceptionHandlers.java | 8 +- .../structurals/ExecutionVisitor.java | 376 +++--- .../bcel/verifier/structurals/Frame.java | 16 +- .../structurals/InstConstraintVisitor.java | 1008 ++++++++--------- .../verifier/structurals/LocalVariables.java | 60 +- .../verifier/structurals/OperandStack.java | 64 +- .../verifier/structurals/Pass3bVerifier.java | 76 +- .../verifier/structurals/Subroutines.java | 118 +- .../structurals/UninitializedObjectType.java | 6 +- .../org/apache/bcel/AbstractTestCase.java | 2 +- .../bcel/verifier/tests/TestArray01.java | 14 +- .../verifier/tests/TestArrayAccess01.java | 2 +- .../tests/TestLegalInvokeInterface01.java | 2 +- .../tests/TestLegalInvokeSpecial01.java | 2 +- .../tests/TestLegalInvokeSpecial02.java | 4 +- .../tests/TestLegalInvokeVirtual01.java | 2 +- .../tests/TestLegalInvokeVirtual02.java | 4 +- .../bcel/verifier/tests/TestReturn02.java | 20 +- 43 files changed, 1325 insertions(+), 1325 deletions(-) diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index bef482e3..ecbbe731 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -115,8 +115,8 @@ public abstract class Type { * returns the given type. * @since 6.0 */ - public Type normalizeForStackOrLocal(){ - if (this == Type.BOOLEAN || this == Type.BYTE || this == Type.SHORT || this == Type.CHAR){ + public Type normalizeForStackOrLocal() { + if (this == Type.BOOLEAN || this == Type.BYTE || this == Type.SHORT || this == Type.CHAR) { return Type.INT; } return this; diff --git a/src/main/java/org/apache/bcel/util/BCELFactory.java b/src/main/java/org/apache/bcel/util/BCELFactory.java index 2e176ba1..8c4bd4fb 100644 --- a/src/main/java/org/apache/bcel/util/BCELFactory.java +++ b/src/main/java/org/apache/bcel/util/BCELFactory.java @@ -212,7 +212,7 @@ class BCELFactory extends EmptyVisitor { embed += "f"; } else if (value instanceof Long) { embed += "L"; - } else if (value instanceof ObjectType){ + } else if (value instanceof ObjectType) { ObjectType ot = (ObjectType) value; embed = "new ObjectType(\""+ot.getClassName()+"\")"; } diff --git a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java index 8b138ff2..7f20b42b 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/AssertionViolatedException.java @@ -29,14 +29,14 @@ public final class AssertionViolatedException extends RuntimeException{ /** The error message. */ private String detailMessage; /** Constructs a new AssertionViolatedException with null as its error message string. */ - public AssertionViolatedException(){ + public AssertionViolatedException() { super(); } /** * Constructs a new AssertionViolatedException with the specified error message preceded * by "INTERNAL ERROR: ". */ - public AssertionViolatedException(String message){ + public AssertionViolatedException(String message) { super(message = "INTERNAL ERROR: "+message); // Thanks to Java, the constructor call here must be first. detailMessage=message; } @@ -53,7 +53,7 @@ public final class AssertionViolatedException extends RuntimeException{ is always replaced by the empty string (""). In particular, after invoking this method, the error message of this object can no longer be null. */ - public void extendMessage(String pre, String post){ + public void extendMessage(String pre, String post) { if (pre == null) { pre=""; } @@ -70,14 +70,14 @@ public final class AssertionViolatedException extends RuntimeException{ * @return the error message string of this AssertionViolatedException. */ @Override - public String getMessage(){ + public String getMessage() { return detailMessage; } /** * DO NOT USE. It's for experimental testing during development only. */ - public static void main(final String[] args){ + public static void main(final String[] args) { AssertionViolatedException ave = new AssertionViolatedException("Oops!"); ave.extendMessage("\nFOUND:\n\t","\nExiting!!\n"); throw ave; diff --git a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java index 31882eac..06521900 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/ClassConstraintException.java @@ -31,14 +31,14 @@ public class ClassConstraintException extends VerificationException{ /** * Constructs a new ClassConstraintException with null as its error message string. */ - public ClassConstraintException(){ + public ClassConstraintException() { super(); } /** * Constructs a new ClassConstraintException with the specified error message. */ - public ClassConstraintException(final String message){ + public ClassConstraintException(final String message) { super (message); } @@ -46,7 +46,7 @@ public class ClassConstraintException extends VerificationException{ * Constructs a new ClassConstraintException with the specified error message and cause * @since 6.0 */ - public ClassConstraintException(final String message, final Throwable initCause){ + public ClassConstraintException(final String message, final Throwable initCause) { super(message, initCause); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java index 7ade44da..3f9018a9 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/CodeConstraintException.java @@ -29,13 +29,13 @@ public abstract class CodeConstraintException extends VerificationException{ /** * Constructs a new CodeConstraintException with null as its error message string. */ - CodeConstraintException(){ + CodeConstraintException() { super(); } /** * Constructs a new CodeConstraintException with the specified error message. */ - CodeConstraintException(final String message){ + CodeConstraintException(final String message) { super(message); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java index cc0847b1..e5607363 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/InvalidMethodException.java @@ -28,7 +28,7 @@ public class InvalidMethodException extends RuntimeException{ private static final long serialVersionUID = -7060302743724808051L; /** Constructs an InvalidMethodException with the specified detail message. */ - public InvalidMethodException(final String message){ + public InvalidMethodException(final String message) { super(message); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java index 54218817..12cf8dfb 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LoadingException.java @@ -31,14 +31,14 @@ public class LoadingException extends VerifierConstraintViolatedException{ /** * Constructs a new LoadingException with null as its error message string. */ - public LoadingException(){ + public LoadingException() { super(); } /** * Constructs a new LoadingException with the specified error message. */ - public LoadingException(final String message){ + public LoadingException(final String message) { super (message); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java index 31718214..a2364327 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/LocalVariableInfoInconsistentException.java @@ -33,14 +33,14 @@ public class LocalVariableInfoInconsistentException extends ClassConstraintExcep /** * Constructs a new LocalVariableInfoInconsistentException with null as its error message string. */ - public LocalVariableInfoInconsistentException(){ + public LocalVariableInfoInconsistentException() { super(); } /** * Constructs a new LocalVariableInfoInconsistentException with the specified error message. */ - public LocalVariableInfoInconsistentException(final String message){ + public LocalVariableInfoInconsistentException(final String message) { super (message); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java index 55537a4f..c94763c8 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeConstraintException.java @@ -30,7 +30,7 @@ package org.apache.bcel.verifier.exc; public abstract class StaticCodeConstraintException extends CodeConstraintException{ private static final long serialVersionUID = 3858523065007725128L; - public StaticCodeConstraintException(final String message){ + public StaticCodeConstraintException(final String message) { super(message); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java index 5f4c518f..6bee6afa 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionConstraintException.java @@ -33,7 +33,7 @@ package org.apache.bcel.verifier.exc; public class StaticCodeInstructionConstraintException extends StaticCodeConstraintException{ private static final long serialVersionUID = 4987255974346614794L; - public StaticCodeInstructionConstraintException(final String message){ + public StaticCodeInstructionConstraintException(final String message) { super(message); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java index 75924db6..8243558e 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StaticCodeInstructionOperandConstraintException.java @@ -33,7 +33,7 @@ package org.apache.bcel.verifier.exc; public class StaticCodeInstructionOperandConstraintException extends StaticCodeConstraintException{ private static final long serialVersionUID = 4780787099381933487L; - public StaticCodeInstructionOperandConstraintException(final String message){ + public StaticCodeInstructionOperandConstraintException(final String message) { super(message); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java index 0dacce7c..9dd20c85 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/StructuralCodeConstraintException.java @@ -34,13 +34,13 @@ public class StructuralCodeConstraintException extends CodeConstraintException{ /** * Constructs a new StructuralCodeConstraintException with the specified error message. */ - public StructuralCodeConstraintException(final String message){ + public StructuralCodeConstraintException(final String message) { super(message); } /** * Constructs a new StructuralCodeConstraintException with null as its error message string. */ - public StructuralCodeConstraintException(){ + public StructuralCodeConstraintException() { super(); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/Utility.java b/src/main/java/org/apache/bcel/verifier/exc/Utility.java index 592f0d22..2d9f031d 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/Utility.java +++ b/src/main/java/org/apache/bcel/verifier/exc/Utility.java @@ -28,10 +28,10 @@ import java.io.StringWriter; */ public final class Utility{ /** This class is not instantiable. */ - private Utility(){} + private Utility() {} /** This method returns the stack trace of a Throwable instance as a String. */ - public static String getStackTrace(final Throwable t){ + public static String getStackTrace(final Throwable t) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); t.printStackTrace(pw); diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java index c0c5e41c..55d970b1 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerificationException.java @@ -35,20 +35,20 @@ public abstract class VerificationException extends VerifierConstraintViolatedEx /** * Constructs a new VerificationException with null as its error message string. */ - VerificationException(){ + VerificationException() { super(); } /** * Constructs a new VerificationException with the specified error message. */ - VerificationException(final String message){ + VerificationException(final String message) { super(message); } /** * Constructs a new VerificationException with the specified error message and exception */ - VerificationException(final String message, final Throwable initCause){ + VerificationException(final String message, final Throwable initCause) { super(message, initCause); } } diff --git a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java index 7f5e8a02..50f7c9a0 100644 --- a/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java +++ b/src/main/java/org/apache/bcel/verifier/exc/VerifierConstraintViolatedException.java @@ -38,20 +38,20 @@ public abstract class VerifierConstraintViolatedException extends RuntimeExcepti /** * Constructs a new VerifierConstraintViolatedException with null as its error message string. */ - VerifierConstraintViolatedException(){ + VerifierConstraintViolatedException() { super(); } /** * Constructs a new VerifierConstraintViolatedException with the specified error message. */ - VerifierConstraintViolatedException(final String message){ + VerifierConstraintViolatedException(final String message) { super(message); // Not that important detailMessage = message; } /** * Constructs a new VerifierConstraintViolationException with the specified error message and cause */ - VerifierConstraintViolatedException(final String message, final Throwable initCause){ + VerifierConstraintViolatedException(final String message, final Throwable initCause) { super(message, initCause); detailMessage = message; } @@ -62,7 +62,7 @@ public abstract class VerifierConstraintViolatedException extends RuntimeExcepti is always replaced by the empty string (""). In particular, after invoking this method, the error message of this object can no longer be null. */ - public void extendMessage(String pre, String post){ + public void extendMessage(String pre, String post) { if (pre == null) { pre=""; } @@ -79,7 +79,7 @@ public abstract class VerifierConstraintViolatedException extends RuntimeExcepti * @return the error message string of this VerifierConstraintViolatedException. */ @Override - public String getMessage(){ + public String getMessage() { return detailMessage; } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java index 7bd2230e..7f06f621 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java @@ -31,12 +31,12 @@ public final class DOUBLE_Upper extends Type{ private static final DOUBLE_Upper singleton = new DOUBLE_Upper(); /** The constructor; this class must not be instantiated from the outside. */ - private DOUBLE_Upper(){ + private DOUBLE_Upper() { super(Const.T_UNKNOWN, "Long_Upper"); } /** Use this method to get the single instance of this class. */ - public static DOUBLE_Upper theInstance(){ + public static DOUBLE_Upper theInstance() { return singleton; } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/IntList.java b/src/main/java/org/apache/bcel/verifier/statics/IntList.java index 77703c0c..1e736235 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/IntList.java +++ b/src/main/java/org/apache/bcel/verifier/statics/IntList.java @@ -30,15 +30,15 @@ public class IntList{ /** The int are stored as Integer objects here. */ private final List theList; /** This constructor creates an empty list. */ - IntList(){ + IntList() { theList = new ArrayList<>(); } /** Adds an element to the list. */ - void add(final int i){ + void add(final int i) { theList.add(Integer.valueOf(i)); } /** Checks if the specified int is already in the list. */ - boolean contains(final int i){ + boolean contains(final int i) { Integer[] ints = new Integer[theList.size()]; theList.toArray(ints); for (Integer k : ints) { diff --git a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java index 0489bf67..6f1446b4 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java @@ -31,12 +31,12 @@ public final class LONG_Upper extends Type{ private static final LONG_Upper singleton = new LONG_Upper(); /** The constructor; this class must not be instantiated from the outside. */ - private LONG_Upper(){ + private LONG_Upper() { super(Const.T_UNKNOWN, "Long_Upper"); } /** Use this method to get the single instance of this class. */ - public static LONG_Upper theInstance(){ + public static LONG_Upper theInstance() { return singleton; } } diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java index eba29084..6b1c830d 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java @@ -42,14 +42,14 @@ public class LocalVariableInfo{ * Adds a name of a local variable and a certain slot to our 'names' * (Hashtable) database. */ - private void setName(final int offset, final String name){ + private void setName(final int offset, final String name) { names.put(Integer.toString(offset), name); } /** * Adds a type of a local variable and a certain slot to our 'types' * (Hashtable) database. */ - private void setType(final int offset, final Type t){ + private void setType(final int offset, final Type t) { types.put(Integer.toString(offset), t); } @@ -61,7 +61,7 @@ public class LocalVariableInfo{ * May return 'null' if nothing is known about the type of this local * variable slot at the given bytecode offset. */ - public Type getType(final int offset){ + public Type getType(final int offset) { return types.get(Integer.toString(offset)); } /** @@ -72,7 +72,7 @@ public class LocalVariableInfo{ * May return 'null' if nothing is known about the type of this local * variable slot at the given bytecode offset. */ - public String getName(final int offset){ + public String getName(final int offset) { return names.get(Integer.toString(offset)); } /** @@ -81,7 +81,7 @@ public class LocalVariableInfo{ * with already gathered information. */ public void add(final String name, final int startpc, final int length, final Type t) throws LocalVariableInfoInconsistentException{ - for (int i=startpc; i<=startpc+length; i++){ // incl/incl-notation! + for (int i=startpc; i<=startpc+length; i++) { // incl/incl-notation! add(i,name,t); } } @@ -92,14 +92,14 @@ public class LocalVariableInfo{ * with already gathered information. */ private void add(final int offset, final String name, final Type t) throws LocalVariableInfoInconsistentException{ - if (getName(offset) != null){ - if (! getName(offset).equals(name)){ + if (getName(offset) != null) { + if (! getName(offset).equals(name)) { throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+ "' a local variable has two different names: '"+getName(offset)+"' and '"+name+"'."); } } - if (getType(offset) != null){ - if (! getType(offset).equals(t)){ + if (getType(offset) != null) { + if (! getType(offset).equals(t)) { throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+ "' a local variable has two different types: '"+getType(offset)+"' and '"+t+"'."); } diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java index fc536185..b3a22827 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java +++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java @@ -35,16 +35,16 @@ public class LocalVariablesInfo{ private final LocalVariableInfo[] localVariableInfos; /** The constructor. */ - LocalVariablesInfo(final int max_locals){ + LocalVariablesInfo(final int max_locals) { localVariableInfos = new LocalVariableInfo[max_locals]; - for (int i=0; i= localVariableInfos.length){ + public LocalVariableInfo getLocalVariableInfo(final int slot) { + if (slot < 0 || slot >= localVariableInfos.length) { throw new AssertionViolatedException("Slot number for local variable information out of range."); } return localVariableInfos[slot]; @@ -59,7 +59,7 @@ public class LocalVariablesInfo{ public void add(final int slot, final String name, final int startpc, final int length, final Type t) throws LocalVariableInfoInconsistentException{ // The add operation on LocalVariableInfo may throw the '...Inconsistent...' exception, we don't throw it explicitely here. - if (slot < 0 || slot >= localVariableInfos.length){ + if (slot < 0 || slot >= localVariableInfos.length) { throw new AssertionViolatedException("Slot number for local variable information out of range."); } diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java index bf028379..78f94958 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass1Verifier.java @@ -52,8 +52,8 @@ public final class Pass1Verifier extends PassVerifier{ * Used to load in and return the myOwner-matching JavaClass object when needed. * Avoids loading in a class file when it's not really needed! */ - private JavaClass getJavaClass(){ - if (jc == null){ + private JavaClass getJavaClass() { + if (jc == null) { try { jc = Repository.lookupClass(myOwner.getClassName()); } catch (ClassNotFoundException e) { @@ -71,7 +71,7 @@ public final class Pass1Verifier extends PassVerifier{ * * @see Verifier */ - public Pass1Verifier(final Verifier owner){ + public Pass1Verifier(final Verifier owner) { myOwner = owner; } @@ -144,14 +144,14 @@ public final class Pass1Verifier extends PassVerifier{ * @see org.apache.bcel.Const#JVM_CLASSFILE_MAGIC */ @Override - public VerificationResult do_verify(){ + public VerificationResult do_verify() { JavaClass jc; try{ jc = getJavaClass(); //loads in the class file if not already done. - if (jc != null){ + if (jc != null) { /* If we find more constraints to check, we should do this in an own method. */ - if (! myOwner.getClassName().equals(jc.getClassName())){ + if (! myOwner.getClassName().equals(jc.getClassName())) { // This should maybe caught by BCEL: In case of renamed .class files we get wrong // JavaClass objects here. throw new LoadingException("Wrong name: the internal name of the .class file '"+jc.getClassName()+ @@ -160,20 +160,20 @@ public final class Pass1Verifier extends PassVerifier{ } } - catch(LoadingException e){ + catch(LoadingException e) { return new VerificationResult(VerificationResult.VERIFIED_REJECTED, e.getMessage()); } - catch(ClassFormatException e){ + catch(ClassFormatException e) { return new VerificationResult(VerificationResult.VERIFIED_REJECTED, e.getMessage()); } - catch(RuntimeException e){ + catch(RuntimeException e) { // BCEL does not catch every possible RuntimeException; e.g. if // a constant pool index is referenced that does not exist. return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Parsing via BCEL did not succeed. "+ e.getClass().getName()+" occured:\n"+Utility.getStackTrace(e)); } - if (jc != null){ + if (jc != null) { return VerificationResult.VR_OK; } //TODO: Maybe change Repository's behaviour to throw a LoadingException instead of just returning "null" @@ -192,7 +192,7 @@ public final class Pass1Verifier extends PassVerifier{ * TODO. */ @Override - public String[] getMessages(){ + public String[] getMessages() { // This method is only here to override the javadoc-comment. return super.getMessages(); } diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java index 1c11c963..550b60e8 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java @@ -101,7 +101,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { * * @see Verifier */ - public Pass2Verifier(final Verifier owner){ + public Pass2Verifier(final Verifier owner) { myOwner = owner; } @@ -114,11 +114,11 @@ public final class Pass2Verifier extends PassVerifier implements Constants { * Repository.lookupClass(myOwner.getClassname()).getMethods()[method_nr];. * You should not add own information. Leave that to JustIce. */ - public LocalVariablesInfo getLocalVariablesInfo(final int method_nr){ + public LocalVariablesInfo getLocalVariablesInfo(final int method_nr) { if (this.verify() != VerificationResult.VR_OK) { return null; // It's cached, don't worry. } - if (method_nr < 0 || method_nr >= localVariablesInfos.length){ + if (method_nr < 0 || method_nr >= localVariablesInfos.length) { throw new AssertionViolatedException("Method number out of range."); } return localVariablesInfos[method_nr]; @@ -147,10 +147,10 @@ public final class Pass2Verifier extends PassVerifier implements Constants { * @see Pass3aVerifier */ @Override - public VerificationResult do_verify(){ + public VerificationResult do_verify() { try { VerificationResult vr1 = myOwner.doPass1(); - if (vr1.equals(VerificationResult.VR_OK)){ + if (vr1.equals(VerificationResult.VR_OK)) { // For every method, we could have information about the local variables out of LocalVariableTable attributes of // the Code attributes. @@ -163,7 +163,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { every_class_has_an_accessible_superclass(); final_methods_are_not_overridden(); } - catch (ClassConstraintException cce){ + catch (ClassConstraintException cce) { vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); } return vr; @@ -189,35 +189,35 @@ public final class Pass2Verifier extends PassVerifier implements Constants { * * @throws ClassConstraintException otherwise. */ - private void every_class_has_an_accessible_superclass(){ + private void every_class_has_an_accessible_superclass() { try { Set hs = new HashSet<>(); // save class names to detect circular inheritance JavaClass jc = Repository.lookupClass(myOwner.getClassName()); int supidx = -1; - while (supidx != 0){ + while (supidx != 0) { supidx = jc.getSuperclassNameIndex(); - if (supidx == 0){ - if (jc != Repository.lookupClass(Type.OBJECT.getClassName())){ + if (supidx == 0) { + if (jc != Repository.lookupClass(Type.OBJECT.getClassName())) { throw new ClassConstraintException("Superclass of '"+jc.getClassName()+ "' missing but not "+Type.OBJECT.getClassName()+" itself!"); } } else{ String supername = jc.getSuperclassName(); - if (! hs.add(supername)){ // If supername already is in the list + if (! hs.add(supername)) { // If supername already is in the list throw new ClassConstraintException("Circular superclass hierarchy detected."); } Verifier v = VerifierFactory.getVerifier(supername); VerificationResult vr = v.doPass1(); - if (vr != VerificationResult.VR_OK){ + if (vr != VerificationResult.VR_OK) { throw new ClassConstraintException("Could not load in ancestor class '"+supername+"'."); } jc = Repository.lookupClass(supername); - if (jc.isFinal()){ + if (jc.isFinal()) { throw new ClassConstraintException("Ancestor class '"+supername+ "' has the FINAL access modifier and must therefore not be subclassed."); } @@ -241,13 +241,13 @@ public final class Pass2Verifier extends PassVerifier implements Constants { * @see #constant_pool_entries_satisfy_static_constraints() * @see #every_class_has_an_accessible_superclass() */ - private void final_methods_are_not_overridden(){ + private void final_methods_are_not_overridden() { try { Map hashmap = new HashMap<>(); JavaClass jc = Repository.lookupClass(myOwner.getClassName()); int supidx = -1; - while (supidx != 0){ + while (supidx != 0) { supidx = jc.getSuperclassNameIndex(); Method[] methods = jc.getMethods(); @@ -293,7 +293,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { * * @throws ClassConstraintException otherwise. */ - private void constant_pool_entries_satisfy_static_constraints(){ + private void constant_pool_entries_satisfy_static_constraints() { try { // Most of the consistency is handled internally by BCEL; here // we only have to verify if the indices of the constants point @@ -338,7 +338,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { private final Set field_names_and_desc = new HashSet<>(); private final Set method_names_and_desc = new HashSet<>(); - private CPESSC_Visitor(final JavaClass _jc){ + private CPESSC_Visitor(final JavaClass _jc) { jc = _jc; cp = _jc.getConstantPool(); cplen = cp.getLength(); @@ -361,12 +361,12 @@ public final class Pass2Verifier extends PassVerifier implements Constants { carrier.visit(); } - private void checkIndex(final Node referrer, final int index, final Class shouldbe){ - if ((index < 0) || (index >= cplen)){ + private void checkIndex(final Node referrer, final int index, final Class shouldbe) { + if ((index < 0) || (index >= cplen)) { throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(referrer)+"'."); } Constant c = cp.getConstant(index); - if (! shouldbe.isInstance(c)){ + if (! shouldbe.isInstance(c)) { /* String isnot = shouldbe.toString().substring(shouldbe.toString().lastIndexOf(".")+1); //Cut all before last "." */ throw new ClassCastException("Illegal constant '"+tostring(c)+"' at index '"+ index+"'. '"+tostring(referrer)+"' expects a '"+shouldbe+"'."); @@ -376,7 +376,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { // ClassFile structure (vmspec2 4.1) // /////////////////////////////////////// @Override - public void visitJavaClass(final JavaClass obj){ + public void visitJavaClass(final JavaClass obj) { Attribute[] atts = obj.getAttributes(); boolean foundSourceFile = false; boolean foundInnerClasses = false; @@ -421,7 +421,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { } } - if (hasInnerClass && !foundInnerClasses){ + if (hasInnerClass && !foundInnerClasses) { //throw new ClassConstraintException("A Classfile structure (like '"+tostring(obj)+ // "') must have exactly one InnerClasses attribute if at least one Inner Class is referenced (which is the case)."+ // " No InnerClasses attribute was found."); @@ -437,75 +437,75 @@ public final class Pass2Verifier extends PassVerifier implements Constants { // CONSTANTS (vmspec2 4.4) // ///////////////////////////// @Override - public void visitConstantClass(final ConstantClass obj){ - if (obj.getTag() != Const.CONSTANT_Class){ + public void visitConstantClass(final ConstantClass obj) { + if (obj.getTag() != Const.CONSTANT_Class) { throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getNameIndex(), CONST_Utf8); } @Override - public void visitConstantFieldref(final ConstantFieldref obj){ - if (obj.getTag() != Const.CONSTANT_Fieldref){ + public void visitConstantFieldref(final ConstantFieldref obj) { + if (obj.getTag() != Const.CONSTANT_Fieldref) { throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getClassIndex(), CONST_Class); checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); } @Override - public void visitConstantMethodref(final ConstantMethodref obj){ - if (obj.getTag() != Const.CONSTANT_Methodref){ + public void visitConstantMethodref(final ConstantMethodref obj) { + if (obj.getTag() != Const.CONSTANT_Methodref) { throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getClassIndex(), CONST_Class); checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); } @Override - public void visitConstantInterfaceMethodref(final ConstantInterfaceMethodref obj){ - if (obj.getTag() != Const.CONSTANT_InterfaceMethodref){ + public void visitConstantInterfaceMethodref(final ConstantInterfaceMethodref obj) { + if (obj.getTag() != Const.CONSTANT_InterfaceMethodref) { throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getClassIndex(), CONST_Class); checkIndex(obj, obj.getNameAndTypeIndex(), CONST_NameAndType); } @Override - public void visitConstantString(final ConstantString obj){ - if (obj.getTag() != Const.CONSTANT_String){ + public void visitConstantString(final ConstantString obj) { + if (obj.getTag() != Const.CONSTANT_String) { throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getStringIndex(), CONST_Utf8); } @Override - public void visitConstantInteger(final ConstantInteger obj){ - if (obj.getTag() != Const.CONSTANT_Integer){ + public void visitConstantInteger(final ConstantInteger obj) { + if (obj.getTag() != Const.CONSTANT_Integer) { throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } // no indices to check } @Override - public void visitConstantFloat(final ConstantFloat obj){ - if (obj.getTag() != Const.CONSTANT_Float){ + public void visitConstantFloat(final ConstantFloat obj) { + if (obj.getTag() != Const.CONSTANT_Float) { throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check } @Override - public void visitConstantLong(final ConstantLong obj){ - if (obj.getTag() != Const.CONSTANT_Long){ + public void visitConstantLong(final ConstantLong obj) { + if (obj.getTag() != Const.CONSTANT_Long) { throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check } @Override - public void visitConstantDouble(final ConstantDouble obj){ - if (obj.getTag() != Const.CONSTANT_Double){ + public void visitConstantDouble(final ConstantDouble obj) { + if (obj.getTag() != Const.CONSTANT_Double) { throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check } @Override - public void visitConstantNameAndType(final ConstantNameAndType obj){ - if (obj.getTag() != Const.CONSTANT_NameAndType){ + public void visitConstantNameAndType(final ConstantNameAndType obj) { + if (obj.getTag() != Const.CONSTANT_NameAndType) { throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -513,8 +513,8 @@ public final class Pass2Verifier extends PassVerifier implements Constants { checkIndex(obj, obj.getSignatureIndex(), CONST_Utf8); } @Override - public void visitConstantUtf8(final ConstantUtf8 obj){ - if (obj.getTag() != Const.CONSTANT_Utf8){ + public void visitConstantUtf8(final ConstantUtf8 obj) { + if (obj.getTag() != Const.CONSTANT_Utf8) { throw new ClassConstraintException("Wrong constant tag in '"+tostring(obj)+"'."); } //no indices to check @@ -523,9 +523,9 @@ public final class Pass2Verifier extends PassVerifier implements Constants { // FIELDS (vmspec2 4.5) // ////////////////////////// @Override - public void visitField(final Field obj){ + public void visitField(final Field obj) { - if (jc.isClass()){ + if (jc.isClass()) { int maxone=0; if (obj.isPrivate()) { maxone++; @@ -536,33 +536,33 @@ public final class Pass2Verifier extends PassVerifier implements Constants { if (obj.isPublic()) { maxone++; } - if (maxone > 1){ + if (maxone > 1) { throw new ClassConstraintException("Field '"+tostring(obj)+ "' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); } - if (obj.isFinal() && obj.isVolatile()){ + if (obj.isFinal() && obj.isVolatile()) { throw new ClassConstraintException("Field '"+tostring(obj)+ "' must only have at most one of its ACC_FINAL, ACC_VOLATILE modifiers set."); } } else{ // isInterface! - if (!obj.isPublic()){ + if (!obj.isPublic()) { throw new ClassConstraintException("Interface field '"+tostring(obj)+ "' must have the ACC_PUBLIC modifier set but hasn't!"); } - if (!obj.isStatic()){ + if (!obj.isStatic()) { throw new ClassConstraintException("Interface field '"+tostring(obj)+ "' must have the ACC_STATIC modifier set but hasn't!"); } - if (!obj.isFinal()){ + if (!obj.isFinal()) { throw new ClassConstraintException("Interface field '"+tostring(obj)+ "' must have the ACC_FINAL modifier set but hasn't!"); } } if ((obj.getAccessFlags() & ~(Const.ACC_PUBLIC|Const.ACC_PRIVATE|Const.ACC_PROTECTED|Const.ACC_STATIC| - Const.ACC_FINAL|Const.ACC_VOLATILE|Const.ACC_TRANSIENT)) > 0){ + Const.ACC_FINAL|Const.ACC_VOLATILE|Const.ACC_TRANSIENT)) > 0) { addMessage("Field '"+tostring(obj)+ "' has access flag(s) other than ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED,"+ " ACC_STATIC, ACC_FINAL, ACC_VOLATILE, ACC_TRANSIENT set (ignored)."); @@ -571,7 +571,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = obj.getName(); - if (! validFieldName(name)){ + if (! validFieldName(name)) { throw new ClassConstraintException("Field '"+tostring(obj)+"' has illegal name '"+obj.getName()+"'."); } @@ -583,16 +583,16 @@ public final class Pass2Verifier extends PassVerifier implements Constants { try{ Type.getType(sig); /* Don't need the return value */ } - catch (ClassFormatException cfe){ + catch (ClassFormatException cfe) { throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); } String nameanddesc = name+sig; - if (field_names_and_desc.contains(nameanddesc)){ + if (field_names_and_desc.contains(nameanddesc)) { throw new ClassConstraintException("No two fields (like '"+tostring(obj)+ "') are allowed have same names and descriptors!"); } - if (field_names.contains(name)){ + if (field_names.contains(name)) { addMessage("More than one field of name '"+name+ "' detected (but with different type descriptors). This is very unusual."); } @@ -617,12 +617,12 @@ public final class Pass2Verifier extends PassVerifier implements Constants { // METHODS (vmspec2 4.6) // /////////////////////////// @Override - public void visitMethod(final Method obj){ + public void visitMethod(final Method obj) { checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = obj.getName(); - if (! validMethodName(name, true)){ + if (! validMethodName(name, true)) { throw new ClassConstraintException("Method '"+tostring(obj)+"' has illegal name '"+name+"'."); } @@ -637,7 +637,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { t = Type.getReturnType(sig); ts = Type.getArgumentTypes(sig); } - catch (ClassFormatException cfe){ + catch (ClassFormatException cfe) { throw new ClassConstraintException( "Illegal descriptor (==signature) '"+sig+"' used by Method '"+tostring(obj)+"'.", cfe); } @@ -647,7 +647,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { if (act instanceof ArrayType) { act = ((ArrayType) act).getBasicType(); } - if (act instanceof ObjectType){ + if (act instanceof ObjectType) { Verifier v = VerifierFactory.getVerifier( ((ObjectType) act).getClassName() ); VerificationResult vr = v.doPass1(); if (vr != VerificationResult.VR_OK) { @@ -661,7 +661,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { if (act instanceof ArrayType) { act = ((ArrayType) act).getBasicType(); } - if (act instanceof ObjectType){ + if (act instanceof ObjectType) { Verifier v = VerifierFactory.getVerifier( ((ObjectType) act).getClassName() ); VerificationResult vr = v.doPass1(); if (vr != VerificationResult.VR_OK) { @@ -672,14 +672,14 @@ public final class Pass2Verifier extends PassVerifier implements Constants { } // Nearly forgot this! Funny return values are allowed, but a non-empty arguments list makes a different method out of it! - if (name.equals(Const.STATIC_INITIALIZER_NAME) && (ts.length != 0)){ + if (name.equals(Const.STATIC_INITIALIZER_NAME) && (ts.length != 0)) { throw new ClassConstraintException( "Method '"+tostring(obj)+"' has illegal name '"+name+"'."+ " Its name resembles the class or interface initialization method"+ " which it isn't because of its arguments (==descriptor)."); } - if (jc.isClass()){ + if (jc.isClass()) { int maxone=0; if (obj.isPrivate()) { maxone++; @@ -690,12 +690,12 @@ public final class Pass2Verifier extends PassVerifier implements Constants { if (obj.isPublic()) { maxone++; } - if (maxone > 1){ + if (maxone > 1) { throw new ClassConstraintException("Method '"+tostring(obj)+ "' must only have at most one of its ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC modifiers set."); } - if (obj.isAbstract()){ + if (obj.isAbstract()) { if (obj.isFinal()) { throw new ClassConstraintException( "Abstract method '"+tostring(obj)+"' must not have the ACC_FINAL modifier set."); @@ -737,7 +737,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { } } else{ // isInterface! - if (!name.equals(Const.STATIC_INITIALIZER_NAME)){//vmspec2, p.116, 2nd paragraph + if (!name.equals(Const.STATIC_INITIALIZER_NAME)) {//vmspec2, p.116, 2nd paragraph if (jc.getMajor() >= Const.MAJOR_1_8) { if (!(obj.isPublic() ^ obj.isPrivate())) { throw new ClassConstraintException("Interface method '" + tostring(obj) + "' must have" + @@ -752,11 +752,11 @@ public final class Pass2Verifier extends PassVerifier implements Constants { } } else { - if (!obj.isPublic()){ + if (!obj.isPublic()) { throw new ClassConstraintException( "Interface method '"+tostring(obj)+"' must have the ACC_PUBLIC modifier set but hasn't!"); } - if (!obj.isAbstract()){ + if (!obj.isAbstract()) { throw new ClassConstraintException( "Interface method '"+tostring(obj)+"' must have the ACC_ABSTRACT modifier set but hasn't!"); } @@ -777,14 +777,14 @@ public final class Pass2Verifier extends PassVerifier implements Constants { if ((obj.getAccessFlags() & ~(Const.ACC_PUBLIC|Const.ACC_PRIVATE|Const.ACC_PROTECTED|Const.ACC_STATIC|Const.ACC_FINAL| - Const.ACC_SYNCHRONIZED|Const.ACC_NATIVE|Const.ACC_ABSTRACT|Const.ACC_STRICT)) > 0){ + Const.ACC_SYNCHRONIZED|Const.ACC_NATIVE|Const.ACC_ABSTRACT|Const.ACC_STRICT)) > 0) { addMessage("Method '"+tostring(obj)+"' has access flag(s) other than"+ " ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL,"+ " ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT set (ignored)."); } String nameanddesc = name+sig; - if (method_names_and_desc.contains(nameanddesc)){ + if (method_names_and_desc.contains(nameanddesc)) { throw new ClassConstraintException( "No two methods (like '"+tostring(obj)+"') are allowed have same names and desciptors!"); } @@ -813,7 +813,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { num_code_atts++; } } - if ( !obj.isNative() && !obj.isAbstract() && num_code_atts != 1){ + if ( !obj.isNative() && !obj.isAbstract() && num_code_atts != 1) { throw new ClassConstraintException("Non-native, non-abstract methods like '"+tostring(obj)+ "' must have exactly one Code attribute (found: "+num_code_atts+")."); } @@ -822,14 +822,14 @@ public final class Pass2Verifier extends PassVerifier implements Constants { // ClassFile-structure-ATTRIBUTES (vmspec2 4.1, 4.7) // /////////////////////////////////////////////////////// @Override - public void visitSourceFile(final SourceFile obj){//vmspec2 4.7.7 + public void visitSourceFile(final SourceFile obj) {//vmspec2 4.7.7 // zero or one SourceFile attr per ClassFile: see visitJavaClass() checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("SourceFile")){ + if (! name.equals("SourceFile")) { throw new ClassConstraintException( "The SourceFile attribute '"+tostring(obj)+"' is not correctly named 'SourceFile' but '"+name+"'."); } @@ -842,40 +842,40 @@ public final class Pass2Verifier extends PassVerifier implements Constants { if ( (sourcefilename.indexOf('/') != -1) || (sourcefilename.indexOf('\\') != -1) || (sourcefilename.indexOf(':') != -1) || - (sourcefilenamelc.lastIndexOf(".java") == -1) ){ + (sourcefilenamelc.lastIndexOf(".java") == -1) ) { addMessage("SourceFile attribute '"+tostring(obj)+ "' has a funny name: remember not to confuse certain parsers working on javap's output. Also, this name ('"+ sourcefilename+"') is considered an unqualified (simple) file name only."); } } @Override - public void visitDeprecated(final Deprecated obj){//vmspec2 4.7.10 + public void visitDeprecated(final Deprecated obj) {//vmspec2 4.7.10 checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("Deprecated")){ + if (! name.equals("Deprecated")) { throw new ClassConstraintException("The Deprecated attribute '"+tostring(obj)+ "' is not correctly named 'Deprecated' but '"+name+"'."); } } @Override - public void visitSynthetic(final Synthetic obj){//vmspec2 4.7.6 + public void visitSynthetic(final Synthetic obj) {//vmspec2 4.7.6 checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("Synthetic")){ + if (! name.equals("Synthetic")) { throw new ClassConstraintException( "The Synthetic attribute '"+tostring(obj)+"' is not correctly named 'Synthetic' but '"+name+"'."); } } @Override - public void visitInnerClasses(final InnerClasses obj){//vmspec2 4.7.5 + public void visitInnerClasses(final InnerClasses obj) {//vmspec2 4.7.5 // exactly one InnerClasses attr per ClassFile if some inner class is refernced: see visitJavaClass() checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("InnerClasses")){ + if (! name.equals("InnerClasses")) { throw new ClassConstraintException( "The InnerClasses attribute '"+tostring(obj)+"' is not correctly named 'InnerClasses' but '"+name+"'."); } @@ -885,17 +885,17 @@ public final class Pass2Verifier extends PassVerifier implements Constants { for (InnerClass ic : ics) { checkIndex(obj, ic.getInnerClassIndex(), CONST_Class); int outer_idx = ic.getOuterClassIndex(); - if (outer_idx != 0){ + if (outer_idx != 0) { checkIndex(obj, outer_idx, CONST_Class); } int innername_idx = ic.getInnerNameIndex(); - if (innername_idx != 0){ + if (innername_idx != 0) { checkIndex(obj, innername_idx, CONST_Utf8); } int acc = ic.getInnerAccessFlags(); acc = acc & (~ (Const.ACC_PUBLIC | Const.ACC_PRIVATE | Const.ACC_PROTECTED | Const.ACC_STATIC | Const.ACC_FINAL | Const.ACC_INTERFACE | Const.ACC_ABSTRACT)); - if (acc != 0){ + if (acc != 0) { addMessage( "Unknown access flag for inner class '"+tostring(ic)+"' set (InnerClasses attribute '"+tostring(obj)+"')."); } @@ -907,43 +907,43 @@ public final class Pass2Verifier extends PassVerifier implements Constants { // field_info-structure-ATTRIBUTES (vmspec2 4.5, 4.7) // //////////////////////////////////////////////////////// @Override - public void visitConstantValue(final ConstantValue obj){//vmspec2 4.7.2 + public void visitConstantValue(final ConstantValue obj) {//vmspec2 4.7.2 // Despite its name, this really is an Attribute, // not a constant! checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("ConstantValue")){ + if (! name.equals("ConstantValue")) { throw new ClassConstraintException( "The ConstantValue attribute '"+tostring(obj)+"' is not correctly named 'ConstantValue' but '"+name+"'."); } Object pred = carrier.predecessor(); - if (pred instanceof Field){ //ConstantValue attributes are quite senseless if the predecessor is not a field. + if (pred instanceof Field) { //ConstantValue attributes are quite senseless if the predecessor is not a field. Field f = (Field) pred; // Field constraints have been checked before -- so we are safe using their type information. Type field_type = Type.getType(((ConstantUtf8) (cp.getConstant(f.getSignatureIndex()))).getBytes()); int index = obj.getConstantValueIndex(); - if ((index < 0) || (index >= cplen)){ + if ((index < 0) || (index >= cplen)) { throw new ClassConstraintException("Invalid index '"+index+"' used by '"+tostring(obj)+"'."); } Constant c = cp.getConstant(index); - if (CONST_Long.isInstance(c) && field_type.equals(Type.LONG)){ + if (CONST_Long.isInstance(c) && field_type.equals(Type.LONG)) { return; } - if (CONST_Float.isInstance(c) && field_type.equals(Type.FLOAT)){ + if (CONST_Float.isInstance(c) && field_type.equals(Type.FLOAT)) { return; } - if (CONST_Double.isInstance(c) && field_type.equals(Type.DOUBLE)){ + if (CONST_Double.isInstance(c) && field_type.equals(Type.DOUBLE)) { return; } if (CONST_Integer.isInstance(c) && (field_type.equals(Type.INT) || field_type.equals(Type.SHORT) || - field_type.equals(Type.CHAR) || field_type.equals(Type.BYTE) || field_type.equals(Type.BOOLEAN))){ + field_type.equals(Type.CHAR) || field_type.equals(Type.BYTE) || field_type.equals(Type.BOOLEAN))) { return; } - if (CONST_String.isInstance(c) && field_type.equals(Type.STRING)){ + if (CONST_String.isInstance(c) && field_type.equals(Type.STRING)) { return; } @@ -957,7 +957,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { // method_info-structure-ATTRIBUTES (vmspec2 4.6, 4.7) // ///////////////////////////////////////////////////////// @Override - public void visitCode(final Code obj){//vmspec2 4.7.3 + public void visitCode(final Code obj) {//vmspec2 4.7.3 try { // No code attribute allowed for native or abstract methods: see visitMethod(Method). // Code array constraints are checked in Pass3 (3a and 3b). @@ -965,13 +965,13 @@ public final class Pass2Verifier extends PassVerifier implements Constants { checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("Code")){ + if (! name.equals("Code")) { throw new ClassConstraintException( "The Code attribute '"+tostring(obj)+"' is not correctly named 'Code' but '"+name+"'."); } Method m = null; // satisfy compiler - if (!(carrier.predecessor() instanceof Method)){ + if (!(carrier.predecessor() instanceof Method)) { addMessage("Code attribute '"+tostring(obj)+"' is not declared in a method_info structure but in '"+ carrier.predecessor()+"'. Ignored."); return; @@ -979,7 +979,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { m = (Method) carrier.predecessor(); // we can assume this method was visited before; // i.e. the data consistency was verified. - if (obj.getCode().length == 0){ + if (obj.getCode().length == 0) { throw new ClassConstraintException( "Code array of Code attribute '"+tostring(obj)+"' (method '"+m+"') must not be empty."); } @@ -988,7 +988,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { CodeException[] exc_table = obj.getExceptionTable(); for (CodeException element : exc_table) { int exc_index = element.getCatchType(); - if (exc_index != 0){ // if 0, it catches all Throwables + if (exc_index != 0) { // if 0, it catches all Throwables checkIndex(obj, exc_index, CONST_Class); ConstantClass cc = (ConstantClass) (cp.getConstant(exc_index)); // cannot be sure this ConstantClass has already been visited (checked)! @@ -998,7 +998,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { Verifier v = VerifierFactory.getVerifier(cname); VerificationResult vr = v.doPass1(); - if (vr != VerificationResult.VR_OK){ + if (vr != VerificationResult.VR_OK) { throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+ "') has an exception_table entry '"+tostring(element)+"' that references '"+cname+ "' as an Exception but it does not pass verification pass 1: "+vr); @@ -1008,14 +1008,14 @@ public final class Pass2Verifier extends PassVerifier implements Constants { JavaClass e = Repository.lookupClass(cname); JavaClass t = Repository.lookupClass(Type.THROWABLE.getClassName()); JavaClass o = Repository.lookupClass(Type.OBJECT.getClassName()); - while (e != o){ + while (e != o) { if (e == t) { break; // It's a subclass of Throwable, OKAY, leave. } v = VerifierFactory.getVerifier(e.getSuperclassName()); vr = v.doPass1(); - if (vr != VerificationResult.VR_OK){ + if (vr != VerificationResult.VR_OK) { throw new ClassConstraintException("Code attribute '"+tostring(obj)+"' (method '"+m+ "') has an exception_table entry '"+tostring(element)+"' that references '"+cname+ "' as an Exception but '"+e.getSuperclassName()+ @@ -1036,13 +1036,13 @@ public final class Pass2Verifier extends PassVerifier implements Constants { // TODO: rework it. int method_number = -1; Method[] ms = Repository.lookupClass(myOwner.getClassName()).getMethods(); - for (int mn=0; mn= code.getMaxLocals()){ + if ( ( (t==Type.LONG || t==Type.DOUBLE)? localindex+1:localindex) >= code.getMaxLocals()) { throw new ClassConstraintException("LocalVariableTable attribute '"+tostring(lvt)+ "' references a LocalVariable '"+tostring(localvariable)+ "' with an index that exceeds the surrounding Code attribute's max_locals value of '"+ @@ -1114,7 +1114,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { localVariablesInfos[method_number].add(localindex, localname, localvariable.getStartPC(), localvariable.getLength(), t); } - catch(LocalVariableInfoInconsistentException lviie){ + catch(LocalVariableInfoInconsistentException lviie) { throw new ClassConstraintException("Conflicting information in LocalVariableTable '"+tostring(lvt)+ "' found in Code attribute '"+tostring(obj)+ "' (method '"+tostring(m)+"'). "+lviie.getMessage(), lviie); @@ -1122,7 +1122,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { }// for all local variables localvariables[i] in the LocalVariableTable attribute atts[a] END num_of_lvt_attribs++; - if (!m.isStatic() && num_of_lvt_attribs > obj.getMaxLocals()){ + if (!m.isStatic() && num_of_lvt_attribs > obj.getMaxLocals()) { throw new ClassConstraintException("Number of LocalVariableTable attributes of Code attribute '"+ tostring(obj)+"' (method '"+tostring(m)+"') exceeds number of local variable slots '"+obj.getMaxLocals()+ "' ('There may be at most one LocalVariableTable attribute per local variable in the Code attribute.')."); @@ -1138,13 +1138,13 @@ public final class Pass2Verifier extends PassVerifier implements Constants { }// visitCode(Code) END @Override - public void visitExceptionTable(final ExceptionTable obj){//vmspec2 4.7.4 + public void visitExceptionTable(final ExceptionTable obj) {//vmspec2 4.7.4 try { // incorrectly named, it's the Exceptions attribute (vmspec2 4.7.4) checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("Exceptions")){ + if (! name.equals("Exceptions")) { throw new ClassConstraintException( "The Exceptions attribute '"+tostring(obj)+"' is not correctly named 'Exceptions' but '"+name+"'."); } @@ -1162,7 +1162,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { Verifier v = VerifierFactory.getVerifier(cname); VerificationResult vr = v.doPass1(); - if (vr != VerificationResult.VR_OK){ + if (vr != VerificationResult.VR_OK) { throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+ "' as an Exception but it does not pass verification pass 1: "+vr); } @@ -1171,14 +1171,14 @@ public final class Pass2Verifier extends PassVerifier implements Constants { JavaClass e = Repository.lookupClass(cname); JavaClass t = Repository.lookupClass(Type.THROWABLE.getClassName()); JavaClass o = Repository.lookupClass(Type.OBJECT.getClassName()); - while (e != o){ + while (e != o) { if (e == t) { break; // It's a subclass of Throwable, OKAY, leave. } v = VerifierFactory.getVerifier(e.getSuperclassName()); vr = v.doPass1(); - if (vr != VerificationResult.VR_OK){ + if (vr != VerificationResult.VR_OK) { throw new ClassConstraintException("Exceptions attribute '"+tostring(obj)+"' references '"+cname+ "' as an Exception but '"+e.getSuperclassName()+ "' in the ancestor hierachy does not pass verification pass 1: "+vr); @@ -1202,11 +1202,11 @@ public final class Pass2Verifier extends PassVerifier implements Constants { // code_attribute-structure-ATTRIBUTES (vmspec2 4.7.3, 4.7) // ////////////////////////////////////////////////////////////// @Override - public void visitLineNumberTable(final LineNumberTable obj){//vmspec2 4.7.8 + public void visitLineNumberTable(final LineNumberTable obj) {//vmspec2 4.7.8 checkIndex(obj, obj.getNameIndex(), CONST_Utf8); String name = ((ConstantUtf8) cp.getConstant(obj.getNameIndex())).getBytes(); - if (! name.equals("LineNumberTable")){ + if (! name.equals("LineNumberTable")) { throw new ClassConstraintException("The LineNumberTable attribute '"+tostring(obj)+ "' is not correctly named 'LineNumberTable' but '"+name+"'."); } @@ -1217,7 +1217,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { } @Override - public void visitLocalVariableTable(final LocalVariableTable obj){//vmspec2 4.7.9 + public void visitLocalVariableTable(final LocalVariableTable obj) {//vmspec2 4.7.9 //In JustIce,this check is partially delayed to Pass 3a. //The other part can be found in the visitCode(Code) method. } @@ -1225,7 +1225,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { // MISC-structure-ATTRIBUTES (vmspec2 4.7.1, 4.7) // //////////////////////////////////////////////////// @Override - public void visitUnknown(final Unknown obj){//vmspec2 4.7.1 + public void visitUnknown(final Unknown obj) {//vmspec2 4.7.1 // Represents an unknown attribute. checkIndex(obj, obj.getNameIndex(), CONST_Utf8); @@ -1236,14 +1236,14 @@ public final class Pass2Verifier extends PassVerifier implements Constants { // BCEL // ////////// @Override - public void visitLocalVariable(final LocalVariable obj){ + public void visitLocalVariable(final LocalVariable obj) { // This does not represent an Attribute but is only // related to internal BCEL data representation. // see visitLocalVariableTable(LocalVariableTable) } @Override - public void visitCodeException(final CodeException obj){ + public void visitCodeException(final CodeException obj) { // Code constraints are checked in Pass3 (3a and 3b). // This does not represent an Attribute but is only // related to internal BCEL data representation. @@ -1251,18 +1251,18 @@ public final class Pass2Verifier extends PassVerifier implements Constants { // see visitCode(Code) } @Override - public void visitConstantPool(final ConstantPool obj){ + public void visitConstantPool(final ConstantPool obj) { // No need to. We're piggybacked by the DescendingVisitor. // This does not represent an Attribute but is only // related to internal BCEL data representation. } @Override - public void visitInnerClass(final InnerClass obj){ + public void visitInnerClass(final InnerClass obj) { // This does not represent an Attribute but is only // related to internal BCEL data representation. } @Override - public void visitLineNumber(final LineNumber obj){ + public void visitLineNumber(final LineNumber obj) { // This does not represent an Attribute but is only // related to internal BCEL data representation. @@ -1284,7 +1284,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { * @throws ClassConstraintException otherwise. * @see #constant_pool_entries_satisfy_static_constraints() */ - private void field_and_method_refs_are_valid(){ + private void field_and_method_refs_are_valid() { try { JavaClass jc = Repository.lookupClass(myOwner.getClassName()); DescendingVisitor v = new DescendingVisitor(jc, new FAMRAV_Visitor(jc)); @@ -1307,26 +1307,26 @@ public final class Pass2Verifier extends PassVerifier implements Constants { */ private final class FAMRAV_Visitor extends EmptyVisitor{ private final ConstantPool cp; // ==jc.getConstantPool() -- only here to save typing work. - private FAMRAV_Visitor(final JavaClass _jc){ + private FAMRAV_Visitor(final JavaClass _jc) { cp = _jc.getConstantPool(); } @Override - public void visitConstantFieldref(final ConstantFieldref obj){ - if (obj.getTag() != Const.CONSTANT_Fieldref){ + public void visitConstantFieldref(final ConstantFieldref obj) { + if (obj.getTag() != Const.CONSTANT_Fieldref) { throw new ClassConstraintException("ConstantFieldref '"+tostring(obj)+"' has wrong tag!"); } int name_and_type_index = obj.getNameAndTypeIndex(); ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name - if (!validFieldName(name)){ + if (!validFieldName(name)) { throw new ClassConstraintException("Invalid field name '"+name+"' referenced by '"+tostring(obj)+"'."); } int class_index = obj.getClassIndex(); ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form - if (! validClassName(className)){ + if (! validClassName(className)) { throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); } @@ -1335,20 +1335,20 @@ public final class Pass2Verifier extends PassVerifier implements Constants { try{ Type.getType(sig); /* Don't need the return value */ } - catch (ClassFormatException cfe){ + catch (ClassFormatException cfe) { throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); } } @Override - public void visitConstantMethodref(final ConstantMethodref obj){ - if (obj.getTag() != Const.CONSTANT_Methodref){ + public void visitConstantMethodref(final ConstantMethodref obj) { + if (obj.getTag() != Const.CONSTANT_Methodref) { throw new ClassConstraintException("ConstantMethodref '"+tostring(obj)+"' has wrong tag!"); } int name_and_type_index = obj.getNameAndTypeIndex(); ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name - if (!validClassMethodName(name)){ + if (!validClassMethodName(name)) { throw new ClassConstraintException( "Invalid (non-interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); } @@ -1356,7 +1356,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { int class_index = obj.getClassIndex(); ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form - if (! validClassName(className)){ + if (! validClassName(className)) { throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); } @@ -1364,31 +1364,31 @@ public final class Pass2Verifier extends PassVerifier implements Constants { try{ Type t = Type.getReturnType(sig); - if ( name.equals(Const.CONSTRUCTOR_NAME) && (t != Type.VOID) ){ + if ( name.equals(Const.CONSTRUCTOR_NAME) && (t != Type.VOID) ) { throw new ClassConstraintException("Instance initialization method must have VOID return type."); } } - catch (ClassFormatException cfe){ + catch (ClassFormatException cfe) { throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); } } @Override - public void visitConstantInterfaceMethodref(final ConstantInterfaceMethodref obj){ - if (obj.getTag() != Const.CONSTANT_InterfaceMethodref){ + public void visitConstantInterfaceMethodref(final ConstantInterfaceMethodref obj) { + if (obj.getTag() != Const.CONSTANT_InterfaceMethodref) { throw new ClassConstraintException("ConstantInterfaceMethodref '"+tostring(obj)+"' has wrong tag!"); } int name_and_type_index = obj.getNameAndTypeIndex(); ConstantNameAndType cnat = (ConstantNameAndType) (cp.getConstant(name_and_type_index)); String name = ((ConstantUtf8) (cp.getConstant(cnat.getNameIndex()))).getBytes(); // Field or Method name - if (!validInterfaceMethodName(name)){ + if (!validInterfaceMethodName(name)) { throw new ClassConstraintException("Invalid (interface) method name '"+name+"' referenced by '"+tostring(obj)+"'."); } int class_index = obj.getClassIndex(); ConstantClass cc = (ConstantClass) (cp.getConstant(class_index)); String className = ((ConstantUtf8) (cp.getConstant(cc.getNameIndex()))).getBytes(); // Class Name in internal form - if (! validClassName(className)){ + if (! validClassName(className)) { throw new ClassConstraintException("Illegal class name '"+className+"' used by '"+tostring(obj)+"'."); } @@ -1396,13 +1396,13 @@ public final class Pass2Verifier extends PassVerifier implements Constants { try{ Type t = Type.getReturnType(sig); - if ( name.equals(Const.STATIC_INITIALIZER_NAME) && (t != Type.VOID) ){ + if ( name.equals(Const.STATIC_INITIALIZER_NAME) && (t != Type.VOID) ) { addMessage("Class or interface initialization method '"+Const.STATIC_INITIALIZER_NAME+ "' usually has VOID return type instead of '"+t+ "'. Note this is really not a requirement of The Java Virtual Machine Specification, Second Edition."); } } - catch (ClassFormatException cfe){ + catch (ClassFormatException cfe) { throw new ClassConstraintException("Illegal descriptor (==signature) '"+sig+"' used by '"+tostring(obj)+"'.", cfe); } @@ -1414,7 +1414,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { * This method returns true if and only if the supplied String * represents a valid Java class name. */ - private static boolean validClassName(final String name){ + private static boolean validClassName(final String name) { /* * TODO: implement. * Are there any restrictions? @@ -1429,12 +1429,12 @@ public final class Pass2Verifier extends PassVerifier implements Constants { * the instance initialization method is allowed and the special name * for the class/interface initialization method may be allowed. */ - private static boolean validMethodName(final String name, final boolean allowStaticInit){ + private static boolean validMethodName(final String name, final boolean allowStaticInit) { if (validJavaLangMethodName(name)) { return true; } - if (allowStaticInit){ + if (allowStaticInit) { return name.equals(Const.CONSTRUCTOR_NAME) || name.equals(Const.STATIC_INITIALIZER_NAME); } return name.equals(Const.CONSTRUCTOR_NAME); @@ -1445,7 +1445,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { * represents a valid method name that may be referenced by * ConstantMethodref objects. */ - private static boolean validClassMethodName(final String name){ + private static boolean validClassMethodName(final String name) { return validMethodName(name, false); } @@ -1455,12 +1455,12 @@ public final class Pass2Verifier extends PassVerifier implements Constants { * (non-qualified) name. * Conforming to: The Java Virtual Machine Specification, Second Edition, �2.7, �2.7.1, �2.2. */ - private static boolean validJavaLangMethodName(final String name){ + private static boolean validJavaLangMethodName(final String name) { if (!Character.isJavaIdentifierStart(name.charAt(0))) { return false; } - for (int i=1; i, thanks! } @@ -1495,7 +1495,7 @@ public final class Pass2Verifier extends PassVerifier implements Constants { return false; } - for (int i=1; i= methods.length){ + if (method_no >= methods.length) { throw new InvalidMethodException("METHOD DOES NOT EXIST!"); } Method method = methods[method_no]; code = method.getCode(); // No Code? Nothing to verify! - if ( method.isAbstract() || method.isNative() ){ // IF mg HAS NO CODE (static constraint of Pass 2) + if ( method.isAbstract() || method.isNative() ) { // IF mg HAS NO CODE (static constraint of Pass 2) return VerificationResult.VR_OK; } @@ -187,7 +187,7 @@ public final class Pass3aVerifier extends PassVerifier{ try{ instructionList = new InstructionList(method.getCode().getCode()); } - catch(RuntimeException re){ + catch(RuntimeException re) { return new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Bad bytecode in the code array of the Code attribute of method '"+method+"'."); } @@ -199,7 +199,7 @@ public final class Pass3aVerifier extends PassVerifier{ try{ delayedPass2Checks(); } - catch(ClassConstraintException cce){ + catch(ClassConstraintException cce) { vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, cce.getMessage()); return vr; } @@ -207,10 +207,10 @@ public final class Pass3aVerifier extends PassVerifier{ pass3StaticInstructionChecks(); pass3StaticInstructionOperandsChecks(); } - catch(StaticCodeConstraintException scce){ + catch(StaticCodeConstraintException scce) { vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, scce.getMessage()); } - catch(ClassCastException cce){ + catch(ClassCastException cce) { vr = new VerificationResult(VerificationResult.VERIFIED_REJECTED, "Class Cast Exception: " + cce.getMessage()); } return vr; @@ -232,7 +232,7 @@ public final class Pass3aVerifier extends PassVerifier{ * @throws ClassConstraintException if the verification fails. * @see #do_verify() */ - private void delayedPass2Checks(){ + private void delayedPass2Checks() { int[] instructionPositions = instructionList.getInstructionPositions(); int codeLength = code.getCode().length; @@ -241,7 +241,7 @@ public final class Pass3aVerifier extends PassVerifier{ // LineNumberTable // ///////////////////// LineNumberTable lnt = code.getLineNumberTable(); - if (lnt != null){ + if (lnt != null) { LineNumber[] lineNumbers = lnt.getLineNumberTable(); IntList offsets = new IntList(); lineNumber_loop: @@ -306,20 +306,20 @@ public final class Pass3aVerifier extends PassVerifier{ int startpc = element.getStartPC(); int endpc = element.getEndPC(); int handlerpc = element.getHandlerPC(); - if (startpc >= endpc){ + if (startpc >= endpc) { throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+ "' that has its start_pc ('"+startpc+"') not smaller than its end_pc ('"+endpc+"')."); } - if (!contains(instructionPositions, startpc)){ + if (!contains(instructionPositions, startpc)) { throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+ "' that has a non-existant bytecode offset as its start_pc ('"+startpc+"')."); } - if ( (!contains(instructionPositions, endpc)) && (endpc != codeLength)){ + if ( (!contains(instructionPositions, endpc)) && (endpc != codeLength)) { throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+ "' that has a non-existant bytecode offset as its end_pc ('"+startpc+ "') [that is also not equal to code_length ('"+codeLength+"')]."); } - if (!contains(instructionPositions, handlerpc)){ + if (!contains(instructionPositions, handlerpc)) { throw new ClassConstraintException("Code attribute '"+code+"' has an exception_table entry '"+element+ "' that has a non-existant bytecode offset as its handler_pc ('"+handlerpc+"')."); } @@ -333,14 +333,14 @@ public final class Pass3aVerifier extends PassVerifier{ * * @throws StaticCodeConstraintException if the verification fails. */ - private void pass3StaticInstructionChecks(){ + private void pass3StaticInstructionChecks() { // Code array must not be empty: // Enforced in pass 2 (also stated in the static constraints of the Code // array in vmspec2), together with pass 1 (reading code_length bytes and // interpreting them as code[]). So this must not be checked again here. - if (code.getCode().length >= Const.MAX_CODE_SIZE){// length must be LESS than the max + if (code.getCode().length >= Const.MAX_CODE_SIZE) {// length must be LESS than the max throw new StaticCodeInstructionConstraintException( "Code array in code attribute '"+code+"' too big: must be smaller than "+Const.MAX_CODE_SIZE+"65536 bytes."); } @@ -361,17 +361,17 @@ public final class Pass3aVerifier extends PassVerifier{ // BREAKPOINT... that BCEL knows about but which are illegal anyway. // We currently go the safe way here. InstructionHandle ih = instructionList.getStart(); - while (ih != null){ + while (ih != null) { Instruction i = ih.getInstruction(); - if (i instanceof IMPDEP1){ + if (i instanceof IMPDEP1) { throw new StaticCodeInstructionConstraintException( "IMPDEP1 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); } - if (i instanceof IMPDEP2){ + if (i instanceof IMPDEP2) { throw new StaticCodeInstructionConstraintException( "IMPDEP2 must not be in the code, it is an illegal instruction for _internal_ JVM use!"); } - if (i instanceof BREAKPOINT){ + if (i instanceof BREAKPOINT) { throw new StaticCodeInstructionConstraintException( "BREAKPOINT must not be in the code, it is an illegal instruction for _internal_ JVM use!"); } @@ -403,7 +403,7 @@ public final class Pass3aVerifier extends PassVerifier{ * * @throws StaticCodeConstraintException if the verification fails. */ - private void pass3StaticInstructionOperandsChecks(){ + private void pass3StaticInstructionOperandsChecks() { try { // When building up the InstructionList, BCEL has already done all those checks // mentioned in The Java Virtual Machine Specification, Second Edition, as @@ -421,18 +421,18 @@ public final class Pass3aVerifier extends PassVerifier{ // Checks for the things BCEL does _not_ handle itself. InstructionHandle ih = instructionList.getStart(); - while (ih != null){ + while (ih != null) { Instruction i = ih.getInstruction(); // An "own" constraint, due to JustIce's new definition of what "subroutine" means. - if (i instanceof JsrInstruction){ + if (i instanceof JsrInstruction) { InstructionHandle target = ((JsrInstruction) i).getTarget(); - if (target == instructionList.getStart()){ + if (target == instructionList.getStart()) { throw new StaticCodeInstructionOperandConstraintException( "Due to JustIce's clear definition of subroutines, no JSR or JSR_W may have a top-level instruction"+ " (such as the very first instruction, which is targeted by instruction '"+ih+"' as its target."); } - if (!(target.getInstruction() instanceof ASTORE)){ + if (!(target.getInstruction() instanceof ASTORE)) { throw new StaticCodeInstructionOperandConstraintException( "Due to JustIce's clear definition of subroutines, no JSR or JSR_W may target anything else"+ " than an ASTORE instruction. Instruction '"+ih+"' targets '"+target+"'."); @@ -452,7 +452,7 @@ public final class Pass3aVerifier extends PassVerifier{ } /** A small utility method returning if a given int i is in the given int[] ints. */ - private static boolean contains(final int[] ints, final int i){ + private static boolean contains(final int[] ints, final int i) { for (int k : ints) { if (k==i) { return true; @@ -462,7 +462,7 @@ public final class Pass3aVerifier extends PassVerifier{ } /** Returns the method number as supplied when instantiating. */ - public int getMethodNo(){ + public int getMethodNo() { return method_no; } @@ -475,7 +475,7 @@ public final class Pass3aVerifier extends PassVerifier{ private final ConstantPoolGen cpg; /** The only Constructor. */ - InstOperandConstraintVisitor(final ConstantPoolGen cpg){ + InstOperandConstraintVisitor(final ConstantPoolGen cpg) { this.cpg = cpg; } @@ -483,7 +483,7 @@ public final class Pass3aVerifier extends PassVerifier{ * Utility method to return the max_locals value of the method verified * by the surrounding Pass3aVerifier instance. */ - private int max_locals(){ + private int max_locals() { try { return Repository.lookupClass(myOwner.getClassName()).getMethods()[method_no].getCode().getMaxLocals(); } catch (ClassNotFoundException e) { @@ -503,8 +503,8 @@ public final class Pass3aVerifier extends PassVerifier{ * A utility method to raise an exception if the index is not * a valid constant pool index. */ - private void indexValid(final Instruction i, final int idx){ - if (idx < 0 || idx >= cpg.getSize()){ + private void indexValid(final Instruction i, final int idx) { + if (idx < 0 || idx >= cpg.getSize()) { constraintViolated(i, "Illegal constant pool index '"+idx+"'."); } } @@ -517,12 +517,12 @@ public final class Pass3aVerifier extends PassVerifier{ * The referenced class is loaded and pass2-verified. */ @Override - public void visitLoadClass(final LoadClass o){ + public void visitLoadClass(final LoadClass o) { ObjectType t = o.getLoadClassType(cpg); - if (t != null){// null means "no class is loaded" + if (t != null) {// null means "no class is loaded" Verifier v = VerifierFactory.getVerifier(t.getClassName()); VerificationResult vr = v.doPass1(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + if (vr.getStatus() != VerificationResult.VERIFIED_OK) { constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+"' is referenced, but cannot be loaded: '"+vr+"'."); } @@ -539,16 +539,16 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ // LDC and LDC_W (LDC_W is a subclass of LDC in BCEL's model) @Override - public void visitLDC(final LDC o){ + public void visitLDC(final LDC o) { indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); - if (c instanceof ConstantClass){ + if (c instanceof ConstantClass) { addMessage("Operand of LDC or LDC_W is CONSTANT_Class '"+c+"' - this is only supported in JDK 1.5 and higher."); } else{ if (! ( (c instanceof ConstantInteger) || (c instanceof ConstantFloat) || - (c instanceof ConstantString) ) ){ + (c instanceof ConstantString) ) ) { constraintViolated(o, "Operand of LDC or LDC_W must be one of CONSTANT_Integer, CONSTANT_Float or CONSTANT_String, but is '"+c+"'."); } @@ -558,17 +558,17 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ // LDC2_W @Override - public void visitLDC2_W(final LDC2_W o){ + public void visitLDC2_W(final LDC2_W o) { indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); if (! ( (c instanceof ConstantLong) || - (c instanceof ConstantDouble) ) ){ + (c instanceof ConstantDouble) ) ) { constraintViolated(o, "Operand of LDC2_W must be CONSTANT_Long or CONSTANT_Double, but is '"+c+"'."); } try{ indexValid(o, o.getIndex()+1); } - catch(StaticCodeInstructionOperandConstraintException e){ + catch(StaticCodeInstructionOperandConstraintException e) { throw new AssertionViolatedException("OOPS: Does not BCEL handle that? LDC2_W operand has a problem.", e); } } @@ -585,11 +585,11 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ //getfield, putfield, getstatic, putstatic @Override - public void visitFieldInstruction(final FieldInstruction o){ + public void visitFieldInstruction(final FieldInstruction o) { try { indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantFieldref)){ + if (! (c instanceof ConstantFieldref)) { constraintViolated(o, "Indexing a constant that's not a CONSTANT_Fieldref but a '"+c+"'."); } @@ -599,19 +599,19 @@ public final class Pass3aVerifier extends PassVerifier{ Field[] fields = jc.getFields(); Field f = null; for (Field field : fields) { - if (field.getName().equals(field_name)){ + if (field.getName().equals(field_name)) { Type f_type = Type.getType(field.getSignature()); Type o_type = o.getType(cpg); /* TODO: Check if assignment compatibility is sufficient. * What does Sun do? */ - if (f_type.equals(o_type)){ + if (f_type.equals(o_type)) { f = field; break; } } } - if (f == null){ + if (f == null) { JavaClass[] superclasses = jc.getSuperClasses(); outer: for (JavaClass superclass : superclasses) { @@ -644,7 +644,7 @@ public final class Pass3aVerifier extends PassVerifier{ // Argh. Sun's implementation allows us to have multiple fields of // the same name but with a different signature. - //if (! f_type.equals(o_type)){ + //if (! f_type.equals(o_type)) { // constraintViolated(o, // "Referenced field '"+field_name+"' has type '"+f_type+"' instead of '"+o_type+"' as expected."); //} @@ -659,32 +659,32 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitInvokeInstruction(final InvokeInstruction o){ + public void visitInvokeInstruction(final InvokeInstruction o) { indexValid(o, o.getIndex()); if ( (o instanceof INVOKEVIRTUAL) || (o instanceof INVOKESPECIAL) || - (o instanceof INVOKESTATIC) ){ + (o instanceof INVOKESTATIC) ) { Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantMethodref)){ + if (! (c instanceof ConstantMethodref)) { constraintViolated(o, "Indexing a constant that's not a CONSTANT_Methodref but a '"+c+"'."); } else{ // Constants are okay due to pass2. ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantMethodref) c).getNameAndTypeIndex())); ConstantUtf8 cutf8 = (ConstantUtf8) (cpg.getConstant(cnat.getNameIndex())); - if (cutf8.getBytes().equals(Const.CONSTRUCTOR_NAME) && (!(o instanceof INVOKESPECIAL)) ){ + if (cutf8.getBytes().equals(Const.CONSTRUCTOR_NAME) && (!(o instanceof INVOKESPECIAL)) ) { constraintViolated(o, "Only INVOKESPECIAL is allowed to invoke instance initialization methods."); } - if ( (! (cutf8.getBytes().equals(Const.CONSTRUCTOR_NAME)) ) && (cutf8.getBytes().startsWith("<")) ){ + if ( (! (cutf8.getBytes().equals(Const.CONSTRUCTOR_NAME)) ) && (cutf8.getBytes().startsWith("<")) ) { constraintViolated(o, "No method with a name beginning with '<' other than the instance initialization methods"+ " may be called by the method invocation instructions."); } } } - else{ //if (o instanceof INVOKEINTERFACE){ + else{ //if (o instanceof INVOKEINTERFACE) { Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantInterfaceMethodref)){ + if (! (c instanceof ConstantInterfaceMethodref)) { constraintViolated(o, "Indexing a constant that's not a CONSTANT_InterfaceMethodref but a '"+c+"'."); } // TODO: From time to time check if BCEL allows to detect if the @@ -696,10 +696,10 @@ public final class Pass3aVerifier extends PassVerifier{ ConstantNameAndType cnat = (ConstantNameAndType) (cpg.getConstant(((ConstantInterfaceMethodref)c).getNameAndTypeIndex())); String name = ((ConstantUtf8) (cpg.getConstant(cnat.getNameIndex()))).getBytes(); - if (name.equals(Const.CONSTRUCTOR_NAME)){ + if (name.equals(Const.CONSTRUCTOR_NAME)) { constraintViolated(o, "Method to invoke must not be '"+Const.CONSTRUCTOR_NAME+"'."); } - if (name.equals(Const.STATIC_INITIALIZER_NAME)){ + if (name.equals(Const.STATIC_INITIALIZER_NAME)) { constraintViolated(o, "Method to invoke must not be '"+Const.STATIC_INITIALIZER_NAME+"'."); } } @@ -707,13 +707,13 @@ public final class Pass3aVerifier extends PassVerifier{ // The LoadClassType is the method-declaring class, so we have to check the other types. Type t = o.getReturnType(cpg); - if (t instanceof ArrayType){ + if (t instanceof ArrayType) { t = ((ArrayType) t).getBasicType(); } - if (t instanceof ObjectType){ + if (t instanceof ObjectType) { Verifier v = VerifierFactory.getVerifier(((ObjectType) t).getClassName()); VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + if (vr.getStatus() != VerificationResult.VERIFIED_OK) { constraintViolated(o, "Return type class/interface could not be verified successfully: '"+vr.getMessage()+"'."); } } @@ -721,13 +721,13 @@ public final class Pass3aVerifier extends PassVerifier{ Type[] ts = o.getArgumentTypes(cpg); for (Type element : ts) { t = element; - if (t instanceof ArrayType){ + if (t instanceof ArrayType) { t = ((ArrayType) t).getBasicType(); } - if (t instanceof ObjectType){ + if (t instanceof ObjectType) { Verifier v = VerifierFactory.getVerifier(((ObjectType) t).getClassName()); VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + if (vr.getStatus() != VerificationResult.VERIFIED_OK) { constraintViolated(o, "Argument type class/interface could not be verified successfully: '"+vr.getMessage()+"'."); } @@ -738,36 +738,36 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitINSTANCEOF(final INSTANCEOF o){ + public void visitINSTANCEOF(final INSTANCEOF o) { indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ + if (! (c instanceof ConstantClass)) { constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); } } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitCHECKCAST(final CHECKCAST o){ + public void visitCHECKCAST(final CHECKCAST o) { indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ + if (! (c instanceof ConstantClass)) { constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); } } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitNEW(final NEW o){ + public void visitNEW(final NEW o) { indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ + if (! (c instanceof ConstantClass)) { constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); } else{ ConstantUtf8 cutf8 = (ConstantUtf8) (cpg.getConstant( ((ConstantClass) c).getNameIndex() )); Type t = Type.getType("L"+cutf8.getBytes()+";"); - if (t instanceof ArrayType){ + if (t instanceof ArrayType) { constraintViolated(o, "NEW must not be used to create an array."); } } @@ -776,20 +776,20 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitMULTIANEWARRAY(final MULTIANEWARRAY o){ + public void visitMULTIANEWARRAY(final MULTIANEWARRAY o) { indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ + if (! (c instanceof ConstantClass)) { constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); } int dimensions2create = o.getDimensions(); - if (dimensions2create < 1){ + if (dimensions2create < 1) { constraintViolated(o, "Number of dimensions to create must be greater than zero."); } Type t = o.getType(cpg); - if (t instanceof ArrayType){ + if (t instanceof ArrayType) { int dimensions = ((ArrayType) t).getDimensions(); - if (dimensions < dimensions2create){ + if (dimensions < dimensions2create) { constraintViolated(o, "Not allowed to create array with more dimensions ('"+dimensions2create+ "') than the one referenced by the CONSTANT_Class '"+t+"'."); @@ -803,16 +803,16 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitANEWARRAY(final ANEWARRAY o){ + public void visitANEWARRAY(final ANEWARRAY o) { indexValid(o, o.getIndex()); Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ + if (! (c instanceof ConstantClass)) { constraintViolated(o, "Expecting a CONSTANT_Class operand, but found a '"+c+"'."); } Type t = o.getType(cpg); - if (t instanceof ArrayType){ + if (t instanceof ArrayType) { int dimensions = ((ArrayType) t).getDimensions(); - if (dimensions > Const.MAX_ARRAY_DIMENSIONS){ + if (dimensions > Const.MAX_ARRAY_DIMENSIONS) { constraintViolated(o, "Not allowed to create an array with more than "+ Const.MAX_ARRAY_DIMENSIONS + " dimensions;"+ " actual: " + dimensions); @@ -822,7 +822,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitNEWARRAY(final NEWARRAY o){ + public void visitNEWARRAY(final NEWARRAY o) { byte t = o.getTypecode(); if (! ( (t == Const.T_BOOLEAN) || (t == Const.T_CHAR) || @@ -831,21 +831,21 @@ public final class Pass3aVerifier extends PassVerifier{ (t == Const.T_BYTE) || (t == Const.T_SHORT) || (t == Const.T_INT) || - (t == Const.T_LONG) ) ){ + (t == Const.T_LONG) ) ) { constraintViolated(o, "Illegal type code '+t+' for 'atype' operand."); } } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitILOAD(final ILOAD o){ + public void visitILOAD(final ILOAD o) { int idx = o.getIndex(); - if (idx < 0){ + if (idx < 0) { constraintViolated(o, "Index '"+idx+"' must be non-negative."); } else{ int maxminus1 = max_locals()-1; - if (idx > maxminus1){ + if (idx > maxminus1) { constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); } } @@ -853,14 +853,14 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitFLOAD(final FLOAD o){ + public void visitFLOAD(final FLOAD o) { int idx = o.getIndex(); - if (idx < 0){ + if (idx < 0) { constraintViolated(o, "Index '"+idx+"' must be non-negative."); } else{ int maxminus1 = max_locals()-1; - if (idx > maxminus1){ + if (idx > maxminus1) { constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); } } @@ -868,14 +868,14 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitALOAD(final ALOAD o){ + public void visitALOAD(final ALOAD o) { int idx = o.getIndex(); - if (idx < 0){ + if (idx < 0) { constraintViolated(o, "Index '"+idx+"' must be non-negative."); } else{ int maxminus1 = max_locals()-1; - if (idx > maxminus1){ + if (idx > maxminus1) { constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); } } @@ -883,14 +883,14 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitISTORE(final ISTORE o){ + public void visitISTORE(final ISTORE o) { int idx = o.getIndex(); - if (idx < 0){ + if (idx < 0) { constraintViolated(o, "Index '"+idx+"' must be non-negative."); } else{ int maxminus1 = max_locals()-1; - if (idx > maxminus1){ + if (idx > maxminus1) { constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); } } @@ -898,14 +898,14 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitFSTORE(final FSTORE o){ + public void visitFSTORE(final FSTORE o) { int idx = o.getIndex(); - if (idx < 0){ + if (idx < 0) { constraintViolated(o, "Index '"+idx+"' must be non-negative."); } else{ int maxminus1 = max_locals()-1; - if (idx > maxminus1){ + if (idx > maxminus1) { constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); } } @@ -913,14 +913,14 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitASTORE(final ASTORE o){ + public void visitASTORE(final ASTORE o) { int idx = o.getIndex(); - if (idx < 0){ + if (idx < 0) { constraintViolated(o, "Index '"+idx+"' must be non-negative."); } else{ int maxminus1 = max_locals()-1; - if (idx > maxminus1){ + if (idx > maxminus1) { constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); } } @@ -928,14 +928,14 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitIINC(final IINC o){ + public void visitIINC(final IINC o) { int idx = o.getIndex(); - if (idx < 0){ + if (idx < 0) { constraintViolated(o, "Index '"+idx+"' must be non-negative."); } else{ int maxminus1 = max_locals()-1; - if (idx > maxminus1){ + if (idx > maxminus1) { constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); } } @@ -943,14 +943,14 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitRET(final RET o){ + public void visitRET(final RET o) { int idx = o.getIndex(); - if (idx < 0){ + if (idx < 0) { constraintViolated(o, "Index '"+idx+"' must be non-negative."); } else{ int maxminus1 = max_locals()-1; - if (idx > maxminus1){ + if (idx > maxminus1) { constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-1 '"+maxminus1+"'."); } } @@ -958,15 +958,15 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitLLOAD(final LLOAD o){ + public void visitLLOAD(final LLOAD o) { int idx = o.getIndex(); - if (idx < 0){ + if (idx < 0) { constraintViolated(o, "Index '"+idx+"' must be non-negative."+ " [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); } else{ int maxminus2 = max_locals()-2; - if (idx > maxminus2){ + if (idx > maxminus2) { constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); } } @@ -974,15 +974,15 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitDLOAD(final DLOAD o){ + public void visitDLOAD(final DLOAD o) { int idx = o.getIndex(); - if (idx < 0){ + if (idx < 0) { constraintViolated(o, "Index '"+idx+"' must be non-negative."+ " [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); } else{ int maxminus2 = max_locals()-2; - if (idx > maxminus2){ + if (idx > maxminus2) { constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); } } @@ -990,15 +990,15 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitLSTORE(final LSTORE o){ + public void visitLSTORE(final LSTORE o) { int idx = o.getIndex(); - if (idx < 0){ + if (idx < 0) { constraintViolated(o, "Index '"+idx+"' must be non-negative."+ " [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); } else{ int maxminus2 = max_locals()-2; - if (idx > maxminus2){ + if (idx > maxminus2) { constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); } } @@ -1006,15 +1006,15 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitDSTORE(final DSTORE o){ + public void visitDSTORE(final DSTORE o) { int idx = o.getIndex(); - if (idx < 0){ + if (idx < 0) { constraintViolated(o, "Index '"+idx+"' must be non-negative."+ " [Constraint by JustIce as an analogon to the single-slot xLOAD/xSTORE instructions; may not happen anyway.]"); } else{ int maxminus2 = max_locals()-2; - if (idx > maxminus2){ + if (idx > maxminus2) { constraintViolated(o, "Index '"+idx+"' must not be greater than max_locals-2 '"+maxminus2+"'."); } } @@ -1022,14 +1022,14 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitLOOKUPSWITCH(final LOOKUPSWITCH o){ + public void visitLOOKUPSWITCH(final LOOKUPSWITCH o) { int[] matchs = o.getMatchs(); int max = Integer.MIN_VALUE; - for (int i=0; i= "low". We cannot check this, as BCEL hides // it from us. } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitPUTSTATIC(final PUTSTATIC o){ + public void visitPUTSTATIC(final PUTSTATIC o) { try { String field_name = o.getFieldName(cpg); JavaClass jc = Repository.lookupClass(getObjectType(o).getClassName()); Field[] fields = jc.getFields(); Field f = null; for (Field field : fields) { - if (field.getName().equals(field_name)){ + if (field.getName().equals(field_name)) { f = field; break; } } - if (f == null){ + if (f == null) { throw new AssertionViolatedException("Field '" + field_name + "' not found in " + jc.getClassName()); } - if (f.isFinal()){ - if (!(myOwner.getClassName().equals(getObjectType(o).getClassName()))){ + if (f.isFinal()) { + if (!(myOwner.getClassName().equals(getObjectType(o).getClassName()))) { constraintViolated(o, "Referenced field '"+f+"' is final and must therefore be declared in the current class '"+ myOwner.getClassName()+"' which is not the case: it is declared in '"+o.getReferenceType(cpg)+"'."); } } - if (! (f.isStatic())){ + if (! (f.isStatic())) { constraintViolated(o, "Referenced field '"+f+"' is not static which it should be."); } String meth_name = Repository.lookupClass(myOwner.getClassName()).getMethods()[method_no].getName(); // If it's an interface, it can be set only in . - if ((!(jc.isClass())) && (!(meth_name.equals(Const.STATIC_INITIALIZER_NAME)))){ + if ((!(jc.isClass())) && (!(meth_name.equals(Const.STATIC_INITIALIZER_NAME)))) { constraintViolated(o, "Interface field '"+f+"' must be set in a '"+Const.STATIC_INITIALIZER_NAME+"' method."); } } catch (ClassNotFoundException e) { @@ -1089,23 +1089,23 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitGETSTATIC(final GETSTATIC o){ + public void visitGETSTATIC(final GETSTATIC o) { try { String field_name = o.getFieldName(cpg); JavaClass jc = Repository.lookupClass(getObjectType(o).getClassName()); Field[] fields = jc.getFields(); Field f = null; for (Field field : fields) { - if (field.getName().equals(field_name)){ + if (field.getName().equals(field_name)) { f = field; break; } } - if (f == null){ + if (f == null) { throw new AssertionViolatedException("Field '" + field_name + "' not found in " + jc.getClassName()); } - if (! (f.isStatic())){ + if (! (f.isStatic())) { constraintViolated(o, "Referenced field '"+f+"' is not static which it should be."); } } catch (ClassNotFoundException e) { @@ -1115,24 +1115,24 @@ public final class Pass3aVerifier extends PassVerifier{ } /* Checks if the constraints of operands of the said instruction(s) are satisfied. */ - //public void visitPUTFIELD(PUTFIELD o){ + //public void visitPUTFIELD(PUTFIELD o) { // for performance reasons done in Pass 3b //} /* Checks if the constraints of operands of the said instruction(s) are satisfied. */ - //public void visitGETFIELD(GETFIELD o){ + //public void visitGETFIELD(GETFIELD o) { // for performance reasons done in Pass 3b //} /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitINVOKEDYNAMIC(final INVOKEDYNAMIC o){ + public void visitINVOKEDYNAMIC(final INVOKEDYNAMIC o) { throw new RuntimeException("INVOKEDYNAMIC instruction is not supported at this time"); } /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitINVOKEINTERFACE(final INVOKEINTERFACE o){ + public void visitINVOKEINTERFACE(final INVOKEINTERFACE o) { try { // INVOKEINTERFACE is a LoadClass; the Class where the referenced method is declared in, // is therefore resolved/verified. @@ -1141,11 +1141,11 @@ public final class Pass3aVerifier extends PassVerifier{ String classname = o.getClassName(cpg); JavaClass jc = Repository.lookupClass(classname); Method m = getMethodRecursive(jc, o); - if (m == null){ + if (m == null) { constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg)+ "' not found in class '"+jc.getClassName()+"'."); } - if (jc.isClass()){ + if (jc.isClass()) { constraintViolated(o, "Referenced class '"+jc.getClassName()+"' is a class, but not an interface as expected."); } } catch (ClassNotFoundException e) { @@ -1165,22 +1165,22 @@ public final class Pass3aVerifier extends PassVerifier{ Method m; //look in the given class m = getMethod(jc, invoke); - if(m != null){ + if(m != null) { //method found in given class return m; } //method not found, look in super classes - for(JavaClass superclass : jc.getSuperClasses()){ + for(JavaClass superclass : jc.getSuperClasses()) { m = getMethod(superclass, invoke); - if(m != null){ + if(m != null) { //method found in super class return m; } } //method not found, look in super interfaces - for(JavaClass superclass : jc.getInterfaces()){ + for(JavaClass superclass : jc.getInterfaces()) { m = getMethod(superclass, invoke); - if(m != null){ + if(m != null) { //method found in super interface return m; } @@ -1194,12 +1194,12 @@ public final class Pass3aVerifier extends PassVerifier{ * @param invoke the instruction that references the method * @return the referenced method or null if not found. */ - private Method getMethod(final JavaClass jc, final InvokeInstruction invoke){ + private Method getMethod(final JavaClass jc, final InvokeInstruction invoke) { Method[] ms = jc.getMethods(); for (Method element : ms) { if ( (element.getName().equals(invoke.getMethodName(cpg))) && (Type.getReturnType(element.getSignature()).equals(invoke.getReturnType(cpg))) && - (objarrayequals(Type.getArgumentTypes(element.getSignature()), invoke.getArgumentTypes(cpg))) ){ + (objarrayequals(Type.getArgumentTypes(element.getSignature()), invoke.getArgumentTypes(cpg))) ) { return element; } } @@ -1209,7 +1209,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitINVOKESPECIAL(final INVOKESPECIAL o){ + public void visitINVOKESPECIAL(final INVOKESPECIAL o) { try { // INVOKESPECIAL is a LoadClass; the Class where the referenced method is declared in, // is therefore resolved/verified. @@ -1218,23 +1218,23 @@ public final class Pass3aVerifier extends PassVerifier{ String classname = o.getClassName(cpg); JavaClass jc = Repository.lookupClass(classname); Method m = getMethodRecursive(jc, o); - if (m == null){ + if (m == null) { constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+o.getSignature(cpg) +"' not found in class '"+jc.getClassName()+"'."); } JavaClass current = Repository.lookupClass(myOwner.getClassName()); - if (current.isSuper()){ + if (current.isSuper()) { - if ((Repository.instanceOf( current, jc )) && (!current.equals(jc))){ + if ((Repository.instanceOf( current, jc )) && (!current.equals(jc))) { - if (! (o.getMethodName(cpg).equals(Const.CONSTRUCTOR_NAME) )){ + if (! (o.getMethodName(cpg).equals(Const.CONSTRUCTOR_NAME) )) { // Special lookup procedure for ACC_SUPER classes. int supidx = -1; Method meth = null; - while (supidx != 0){ + while (supidx != 0) { supidx = current.getSuperclassNameIndex(); current = Repository.lookupClass(current.getSuperclassName()); @@ -1242,7 +1242,7 @@ public final class Pass3aVerifier extends PassVerifier{ for (Method meth2 : meths) { if ( (meth2.getName().equals(o.getMethodName(cpg))) && (Type.getReturnType(meth2.getSignature()).equals(o.getReturnType(cpg))) && - (objarrayequals(Type.getArgumentTypes(meth2.getSignature()), o.getArgumentTypes(cpg))) ){ + (objarrayequals(Type.getArgumentTypes(meth2.getSignature()), o.getArgumentTypes(cpg))) ) { meth = meth2; break; } @@ -1251,7 +1251,7 @@ public final class Pass3aVerifier extends PassVerifier{ break; } } - if (meth == null){ + if (meth == null) { constraintViolated(o, "ACC_SUPER special lookup procedure not successful: method '"+ o.getMethodName(cpg)+"' with proper signature not declared in superclass hierarchy."); } @@ -1268,7 +1268,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitINVOKESTATIC(final INVOKESTATIC o){ + public void visitINVOKESTATIC(final INVOKESTATIC o) { try { // INVOKESTATIC is a LoadClass; the Class where the referenced method is declared in, // is therefore resolved/verified. @@ -1277,10 +1277,10 @@ public final class Pass3aVerifier extends PassVerifier{ String classname = o.getClassName(cpg); JavaClass jc = Repository.lookupClass(classname); Method m = getMethodRecursive(jc, o); - if (m == null){ + if (m == null) { constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+ o.getSignature(cpg) +"' not found in class '"+jc.getClassName()+"'."); - } else if (! (m.isStatic())){ // implies it's not abstract, verified in pass 2. + } else if (! (m.isStatic())) { // implies it's not abstract, verified in pass 2. constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' has ACC_STATIC unset."); } @@ -1293,7 +1293,7 @@ public final class Pass3aVerifier extends PassVerifier{ /** Checks if the constraints of operands of the said instruction(s) are satisfied. */ @Override - public void visitINVOKEVIRTUAL(final INVOKEVIRTUAL o){ + public void visitINVOKEVIRTUAL(final INVOKEVIRTUAL o) { try { // INVOKEVIRTUAL is a LoadClass; the Class where the referenced method is declared in, // is therefore resolved/verified. @@ -1302,11 +1302,11 @@ public final class Pass3aVerifier extends PassVerifier{ String classname = o.getClassName(cpg); JavaClass jc = Repository.lookupClass(classname); Method m = getMethodRecursive(jc, o); - if (m == null){ + if (m == null) { constraintViolated(o, "Referenced method '"+o.getMethodName(cpg)+"' with expected signature '"+ o.getSignature(cpg)+"' not found in class '"+jc.getClassName()+"'."); } - if (! (jc.isClass())){ + if (! (jc.isClass())) { constraintViolated(o, "Referenced class '"+jc.getClassName()+"' is an interface, but not a class as expected."); } @@ -1324,13 +1324,13 @@ public final class Pass3aVerifier extends PassVerifier{ * The equality of the elements is based on their equals(Object) * method instead of their object identity. */ - private boolean objarrayequals(final Object[] o, final Object[] p){ - if (o.length != p.length){ + private boolean objarrayequals(final Object[] o, final Object[] p) { + if (o.length != p.length) { return false; } - for (int i=0; i execChain){ + public Frame getOutFrame(final ArrayList execChain) { executionPredecessors = execChain; Frame org; @@ -126,7 +126,7 @@ public class ControlFlowGraph{ org = outFrames.get(jsr); - if (org == null){ + if (org == null) { throw new AssertionViolatedException( "outFrame not set! This:\n"+this+"\nExecutionChain: "+getExecutionChain()+"\nOutFrames: '"+outFrames+"'."); } @@ -141,7 +141,7 @@ public class ControlFlowGraph{ org = inFrames.get(jsr); - if (org == null){ + if (org == null) { throw new AssertionViolatedException("inFrame not set! This:\n"+this+"\nInFrames: '"+inFrames+"'."); } return org.getClone(); @@ -163,30 +163,30 @@ public class ControlFlowGraph{ * changed from the one before execute()ing. */ @Override - public boolean execute(final Frame inFrame, final ArrayList execPreds, final InstConstraintVisitor icv, final ExecutionVisitor ev){ + public boolean execute(final Frame inFrame, final ArrayList execPreds, final InstConstraintVisitor icv, final ExecutionVisitor ev) { @SuppressWarnings("unchecked") // OK because execPreds is compatible type final List clone = (List) execPreds.clone(); executionPredecessors = clone; //sanity check - if ( (lastExecutionJSR() == null) && (subroutines.subroutineOf(getInstruction()) != subroutines.getTopLevel() ) ){ + if ( (lastExecutionJSR() == null) && (subroutines.subroutineOf(getInstruction()) != subroutines.getTopLevel() ) ) { throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?"); } - if ( (lastExecutionJSR() != null) && (subroutines.subroutineOf(getInstruction()) == subroutines.getTopLevel() ) ){ + if ( (lastExecutionJSR() != null) && (subroutines.subroutineOf(getInstruction()) == subroutines.getTopLevel() ) ) { throw new AssertionViolatedException("Huh?! Am I '"+this+"' part of a subroutine or not?"); } Frame inF = inFrames.get(lastExecutionJSR()); - if (inF == null){// no incoming frame was set, so set it. + if (inF == null) {// no incoming frame was set, so set it. inFrames.put(lastExecutionJSR(), inFrame); inF = inFrame; } else{// if there was an "old" inFrame - if (inF.equals(inFrame)){ //shortcut: no need to merge equal frames. + if (inF.equals(inFrame)) { //shortcut: no need to merge equal frames. return false; } - if (! mergeInFrames(inFrame)){ + if (! mergeInFrames(inFrame)) { return false; } } @@ -203,7 +203,7 @@ public class ControlFlowGraph{ icv.setFrame(workingFrame); getInstruction().accept(icv); } - catch(StructuralCodeConstraintException ce){ + catch(StructuralCodeConstraintException ce) { ce.extendMessage("","\nInstructionHandle: "+getInstruction()+"\n"); ce.extendMessage("","\nExecution Frame:\n"+workingFrame); extendMessageWithFlow(ce); @@ -226,7 +226,7 @@ public class ControlFlowGraph{ * Returns a simple String representation of this InstructionContext. */ @Override - public String toString(){ + public String toString() { //TODO: Put information in the brackets, e.g. // Is this an ExceptionHandler? Is this a RET? Is this the start of // a subroutine? @@ -258,9 +258,9 @@ public class ControlFlowGraph{ * while execute(Frame, ArrayList)-ing the code represented * by the surrounding ControlFlowGraph. */ - private String getExecutionChain(){ + private String getExecutionChain() { String s = this.toString(); - for (int i=executionPredecessors.size()-1; i>=0; i--){ + for (int i=executionPredecessors.size()-1; i>=0; i--) { s = executionPredecessors.get(i)+"\n" + s; } return s; @@ -272,7 +272,7 @@ public class ControlFlowGraph{ * This extended message will then reflect the execution flow needed to get to the constraint * violation that triggered the throwing of the "e" object. */ - private void extendMessageWithFlow(final StructuralCodeConstraintException e){ + private void extendMessageWithFlow(final StructuralCodeConstraintException e) { String s = "Execution flow:\n"; e.extendMessage("", s+getExecutionChain()); } @@ -281,7 +281,7 @@ public class ControlFlowGraph{ * Fulfils the contract of InstructionContext.getInstruction(). */ @Override - public InstructionHandle getInstruction(){ + public InstructionHandle getInstruction() { return instruction; } @@ -292,18 +292,18 @@ public class ControlFlowGraph{ * we were called by this one. * Returns null if we were called from the top level. */ - private InstructionContextImpl lastExecutionJSR(){ + private InstructionContextImpl lastExecutionJSR() { int size = executionPredecessors.size(); int retcount = 0; - for (int i=size-1; i>=0; i--){ + for (int i=size-1; i>=0; i--) { InstructionContextImpl current = (InstructionContextImpl) (executionPredecessors.get(i)); Instruction currentlast = current.getInstruction().getInstruction(); if (currentlast instanceof RET) { retcount++; } - if (currentlast instanceof JsrInstruction){ + if (currentlast instanceof JsrInstruction) { retcount--; if (retcount == -1) { return current; @@ -315,7 +315,7 @@ public class ControlFlowGraph{ /* Satisfies InstructionContext.getSuccessors(). */ @Override - public InstructionContext[] getSuccessors(){ + public InstructionContext[] getSuccessors() { return contextsOf(_getSuccessors()); } @@ -326,15 +326,15 @@ public class ControlFlowGraph{ * (opposed to its physical successor) as defined here. */ // TODO: implement caching! - private InstructionHandle[] _getSuccessors(){ + private InstructionHandle[] _getSuccessors() { final InstructionHandle[] empty = new InstructionHandle[0]; final InstructionHandle[] single = new InstructionHandle[1]; Instruction inst = getInstruction().getInstruction(); - if (inst instanceof RET){ + if (inst instanceof RET) { Subroutine s = subroutines.subroutineOf(getInstruction()); - if (s==null){ //return empty; + if (s==null) { //return empty; // RET in dead code. "empty" would be the correct answer, but we know something about the surrounding project... throw new AssertionViolatedException("Asking for successors of a RET in dead code?!"); } @@ -345,36 +345,36 @@ public class ControlFlowGraph{ InstructionHandle[] jsrs = s.getEnteringJsrInstructions(); InstructionHandle[] ret = new InstructionHandle[jsrs.length]; - for (int i=0; i(NOT ORDERED!). */ - public InstructionContext[] getInstructionContexts(){ + public InstructionContext[] getInstructionContexts() { InstructionContext[] ret = new InstructionContext[instructionContexts.values().size()]; return instructionContexts.values().toArray(ret); } @@ -471,7 +471,7 @@ public class ControlFlowGraph{ * Returns true, if and only if the said instruction is not reachable; that means, * if it is not part of this ControlFlowGraph. */ - public boolean isDead(final InstructionHandle i){ + public boolean isDead(final InstructionHandle i) { return subroutines.subroutineOf(i) == null; } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java index 2f24b209..ab93708e 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandler.java @@ -36,7 +36,7 @@ public class ExceptionHandler{ private final InstructionHandle handlerpc; /** Leave instance creation to JustIce. */ - ExceptionHandler(final ObjectType catch_type, final InstructionHandle handler_pc){ + ExceptionHandler(final ObjectType catch_type, final InstructionHandle handler_pc) { catchtype = catch_type; handlerpc = handler_pc; } @@ -44,14 +44,14 @@ public class ExceptionHandler{ /** * Returns the type of the exception that's handled. 'null' means 'ANY'. */ - public ObjectType getExceptionType(){ + public ObjectType getExceptionType() { return catchtype; } /** * Returns the InstructionHandle where the handler starts off. */ - public InstructionHandle getHandlerStart(){ + public InstructionHandle getHandlerStart() { return handlerpc; } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java index e6e1438b..47a0895d 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExceptionHandlers.java @@ -42,15 +42,15 @@ public class ExceptionHandlers{ /** * Constructor. Creates a new ExceptionHandlers instance. */ - public ExceptionHandlers(final MethodGen mg){ + public ExceptionHandlers(final MethodGen mg) { exceptionhandlers = new HashMap<>(); CodeExceptionGen[] cegs = mg.getExceptionHandlers(); for (CodeExceptionGen ceg : cegs) { ExceptionHandler eh = new ExceptionHandler(ceg.getCatchType(), ceg.getHandlerPC()); - for (InstructionHandle ih=ceg.getStartPC(); ih != ceg.getEndPC().getNext(); ih=ih.getNext()){ + for (InstructionHandle ih=ceg.getStartPC(); ih != ceg.getEndPC().getNext(); ih=ih.getNext()) { Set hs; hs = exceptionhandlers.get(ih); - if (hs == null){ + if (hs == null) { hs = new HashSet<>(); exceptionhandlers.put(ih, hs); } @@ -63,7 +63,7 @@ public class ExceptionHandlers{ * Returns all the ExceptionHandler instances representing exception * handlers that protect the instruction ih. */ - public ExceptionHandler[] getExceptionHandlers(final InstructionHandle ih){ + public ExceptionHandler[] getExceptionHandlers(final InstructionHandle ih) { Set hsSet = exceptionhandlers.get(ih); if (hsSet == null) { return new ExceptionHandler[0]; diff --git a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java index b1148cb5..fcb74f02 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/ExecutionVisitor.java @@ -75,13 +75,13 @@ public class ExecutionVisitor extends EmptyVisitor{ /** * Constructor. Constructs a new instance of this class. */ - public ExecutionVisitor(){} + public ExecutionVisitor() {} /** * The OperandStack from the current Frame we're operating on. * @see #setFrame(Frame) */ - private OperandStack stack(){ + private OperandStack stack() { return frame.getStack(); } @@ -89,14 +89,14 @@ public class ExecutionVisitor extends EmptyVisitor{ * The LocalVariables from the current Frame we're operating on. * @see #setFrame(Frame) */ - private LocalVariables locals(){ + private LocalVariables locals() { return frame.getLocals(); } /** * Sets the ConstantPoolGen needed for symbolic execution. */ - public void setConstantPoolGen(final ConstantPoolGen cpg){ // TODO could be package-protected? + public void setConstantPoolGen(final ConstantPoolGen cpg) { // TODO could be package-protected? this.cpg = cpg; } @@ -106,12 +106,12 @@ public class ExecutionVisitor extends EmptyVisitor{ * instance, SET THE ConstantPoolGen FIRST. * @see #setConstantPoolGen(ConstantPoolGen) */ - public void setFrame(final Frame f){ // TODO could be package-protected? + public void setFrame(final Frame f) { // TODO could be package-protected? this.frame = f; } ///** Symbolically executes the corresponding Java Virtual Machine instruction. */ - //public void visitWIDE(WIDE o){ + //public void visitWIDE(WIDE o) { // The WIDE instruction is modelled as a flag // of the embedded instructions in BCEL. // Therefore BCEL checks for possible errors @@ -122,11 +122,11 @@ public class ExecutionVisitor extends EmptyVisitor{ /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitAALOAD(final AALOAD o){ + public void visitAALOAD(final AALOAD o) { stack().pop(); // pop the index int //System.out.print(stack().peek()); Type t = stack().pop(); // Pop Array type - if (t == Type.NULL){ + if (t == Type.NULL) { stack().push(Type.NULL); } // Do nothing stackwise --- a NullPointerException is thrown at Run-Time else{ @@ -136,49 +136,49 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitAASTORE(final AASTORE o){ + public void visitAASTORE(final AASTORE o) { stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitACONST_NULL(final ACONST_NULL o){ + public void visitACONST_NULL(final ACONST_NULL o) { stack().push(Type.NULL); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitALOAD(final ALOAD o){ + public void visitALOAD(final ALOAD o) { stack().push(locals().get(o.getIndex())); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitANEWARRAY(final ANEWARRAY o){ + public void visitANEWARRAY(final ANEWARRAY o) { stack().pop(); //count stack().push( new ArrayType(o.getType(cpg), 1) ); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitARETURN(final ARETURN o){ + public void visitARETURN(final ARETURN o) { stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitARRAYLENGTH(final ARRAYLENGTH o){ + public void visitARRAYLENGTH(final ARRAYLENGTH o) { stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitASTORE(final ASTORE o){ + public void visitASTORE(final ASTORE o) { locals().set(o.getIndex(), stack().pop()); //System.err.println("TODO-DEBUG: set LV '"+o.getIndex()+"' to '"+locals().get(o.getIndex())+"'."); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitATHROW(final ATHROW o){ + public void visitATHROW(final ATHROW o) { Type t = stack().pop(); stack().clear(); if (t.equals(Type.NULL)) { @@ -190,7 +190,7 @@ public class ExecutionVisitor extends EmptyVisitor{ /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitBALOAD(final BALOAD o){ + public void visitBALOAD(final BALOAD o) { stack().pop(); stack().pop(); stack().push(Type.INT); @@ -198,7 +198,7 @@ public class ExecutionVisitor extends EmptyVisitor{ /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitBASTORE(final BASTORE o){ + public void visitBASTORE(final BASTORE o) { stack().pop(); stack().pop(); stack().pop(); @@ -206,27 +206,27 @@ public class ExecutionVisitor extends EmptyVisitor{ /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitBIPUSH(final BIPUSH o){ + public void visitBIPUSH(final BIPUSH o) { stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitCALOAD(final CALOAD o){ + public void visitCALOAD(final CALOAD o) { stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitCASTORE(final CASTORE o){ + public void visitCASTORE(final CASTORE o) { stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitCHECKCAST(final CHECKCAST o){ + public void visitCHECKCAST(final CHECKCAST o) { // It's possibly wrong to do so, but SUN's // ByteCode verifier seems to do (only) this, too. // TODO: One could use a sophisticated analysis here to check @@ -238,122 +238,122 @@ public class ExecutionVisitor extends EmptyVisitor{ /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitD2F(final D2F o){ + public void visitD2F(final D2F o) { stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitD2I(final D2I o){ + public void visitD2I(final D2I o) { stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitD2L(final D2L o){ + public void visitD2L(final D2L o) { stack().pop(); stack().push(Type.LONG); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDADD(final DADD o){ + public void visitDADD(final DADD o) { stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDALOAD(final DALOAD o){ + public void visitDALOAD(final DALOAD o) { stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDASTORE(final DASTORE o){ + public void visitDASTORE(final DASTORE o) { stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDCMPG(final DCMPG o){ + public void visitDCMPG(final DCMPG o) { stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDCMPL(final DCMPL o){ + public void visitDCMPL(final DCMPL o) { stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDCONST(final DCONST o){ + public void visitDCONST(final DCONST o) { stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDDIV(final DDIV o){ + public void visitDDIV(final DDIV o) { stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDLOAD(final DLOAD o){ + public void visitDLOAD(final DLOAD o) { stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDMUL(final DMUL o){ + public void visitDMUL(final DMUL o) { stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDNEG(final DNEG o){ + public void visitDNEG(final DNEG o) { stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDREM(final DREM o){ + public void visitDREM(final DREM o) { stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDRETURN(final DRETURN o){ + public void visitDRETURN(final DRETURN o) { stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDSTORE(final DSTORE o){ + public void visitDSTORE(final DSTORE o) { locals().set(o.getIndex(), stack().pop()); locals().set(o.getIndex()+1, Type.UNKNOWN); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDSUB(final DSUB o){ + public void visitDSUB(final DSUB o) { stack().pop(); stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDUP(final DUP o){ + public void visitDUP(final DUP o) { Type t = stack().pop(); stack().push(t); stack().push(t); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDUP_X1(final DUP_X1 o){ + public void visitDUP_X1(final DUP_X1 o) { Type w1 = stack().pop(); Type w2 = stack().pop(); stack().push(w1); @@ -362,10 +362,10 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDUP_X2(final DUP_X2 o){ + public void visitDUP_X2(final DUP_X2 o) { Type w1 = stack().pop(); Type w2 = stack().pop(); - if (w2.getSize() == 2){ + if (w2.getSize() == 2) { stack().push(w1); stack().push(w2); stack().push(w1); @@ -380,9 +380,9 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDUP2(final DUP2 o){ + public void visitDUP2(final DUP2 o) { Type t = stack().pop(); - if (t.getSize() == 2){ + if (t.getSize() == 2) { stack().push(t); stack().push(t); } @@ -396,9 +396,9 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDUP2_X1(final DUP2_X1 o){ + public void visitDUP2_X1(final DUP2_X1 o) { Type t = stack().pop(); - if (t.getSize() == 2){ + if (t.getSize() == 2) { Type u = stack().pop(); stack().push(t); stack().push(u); @@ -416,11 +416,11 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitDUP2_X2(final DUP2_X2 o){ + public void visitDUP2_X2(final DUP2_X2 o) { Type t = stack().pop(); - if (t.getSize() == 2){ + if (t.getSize() == 2) { Type u = stack().pop(); - if (u.getSize() == 2){ + if (u.getSize() == 2) { stack().push(t); stack().push(u); stack().push(t); @@ -435,7 +435,7 @@ public class ExecutionVisitor extends EmptyVisitor{ else{ //t.getSize() is 1 Type u = stack().pop(); Type v = stack().pop(); - if (v.getSize() == 2){ + if (v.getSize() == 2) { stack().push(u); stack().push(t); stack().push(v); @@ -454,114 +454,114 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitF2D(final F2D o){ + public void visitF2D(final F2D o) { stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitF2I(final F2I o){ + public void visitF2I(final F2I o) { stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitF2L(final F2L o){ + public void visitF2L(final F2L o) { stack().pop(); stack().push(Type.LONG); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFADD(final FADD o){ + public void visitFADD(final FADD o) { stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFALOAD(final FALOAD o){ + public void visitFALOAD(final FALOAD o) { stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFASTORE(final FASTORE o){ + public void visitFASTORE(final FASTORE o) { stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFCMPG(final FCMPG o){ + public void visitFCMPG(final FCMPG o) { stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFCMPL(final FCMPL o){ + public void visitFCMPL(final FCMPL o) { stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFCONST(final FCONST o){ + public void visitFCONST(final FCONST o) { stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFDIV(final FDIV o){ + public void visitFDIV(final FDIV o) { stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFLOAD(final FLOAD o){ + public void visitFLOAD(final FLOAD o) { stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFMUL(final FMUL o){ + public void visitFMUL(final FMUL o) { stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFNEG(final FNEG o){ + public void visitFNEG(final FNEG o) { stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFREM(final FREM o){ + public void visitFREM(final FREM o) { stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFRETURN(final FRETURN o){ + public void visitFRETURN(final FRETURN o) { stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFSTORE(final FSTORE o){ + public void visitFSTORE(final FSTORE o) { locals().set(o.getIndex(), stack().pop()); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitFSUB(final FSUB o){ + public void visitFSUB(final FSUB o) { stack().pop(); stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitGETFIELD(final GETFIELD o){ + public void visitGETFIELD(final GETFIELD o) { stack().pop(); Type t = o.getFieldType(cpg); if ( t.equals(Type.BOOLEAN) || @@ -574,7 +574,7 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitGETSTATIC(final GETSTATIC o){ + public void visitGETSTATIC(final GETSTATIC o) { Type t = o.getFieldType(cpg); if ( t.equals(Type.BOOLEAN) || t.equals(Type.CHAR) || @@ -586,204 +586,204 @@ public class ExecutionVisitor extends EmptyVisitor{ } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitGOTO(final GOTO o){ + public void visitGOTO(final GOTO o) { // no stack changes. } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitGOTO_W(final GOTO_W o){ + public void visitGOTO_W(final GOTO_W o) { // no stack changes. } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitI2B(final I2B o){ + public void visitI2B(final I2B o) { stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitI2C(final I2C o){ + public void visitI2C(final I2C o) { stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitI2D(final I2D o){ + public void visitI2D(final I2D o) { stack().pop(); stack().push(Type.DOUBLE); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitI2F(final I2F o){ + public void visitI2F(final I2F o) { stack().pop(); stack().push(Type.FLOAT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitI2L(final I2L o){ + public void visitI2L(final I2L o) { stack().pop(); stack().push(Type.LONG); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitI2S(final I2S o){ + public void visitI2S(final I2S o) { stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIADD(final IADD o){ + public void visitIADD(final IADD o) { stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIALOAD(final IALOAD o){ + public void visitIALOAD(final IALOAD o) { stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIAND(final IAND o){ + public void visitIAND(final IAND o) { stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIASTORE(final IASTORE o){ + public void visitIASTORE(final IASTORE o) { stack().pop(); stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitICONST(final ICONST o){ + public void visitICONST(final ICONST o) { stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIDIV(final IDIV o){ + public void visitIDIV(final IDIV o) { stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ACMPEQ(final IF_ACMPEQ o){ + public void visitIF_ACMPEQ(final IF_ACMPEQ o) { stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ACMPNE(final IF_ACMPNE o){ + public void visitIF_ACMPNE(final IF_ACMPNE o) { stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ICMPEQ(final IF_ICMPEQ o){ + public void visitIF_ICMPEQ(final IF_ICMPEQ o) { stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ICMPGE(final IF_ICMPGE o){ + public void visitIF_ICMPGE(final IF_ICMPGE o) { stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ICMPGT(final IF_ICMPGT o){ + public void visitIF_ICMPGT(final IF_ICMPGT o) { stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ICMPLE(final IF_ICMPLE o){ + public void visitIF_ICMPLE(final IF_ICMPLE o) { stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ICMPLT(final IF_ICMPLT o){ + public void visitIF_ICMPLT(final IF_ICMPLT o) { stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIF_ICMPNE(final IF_ICMPNE o){ + public void visitIF_ICMPNE(final IF_ICMPNE o) { stack().pop(); stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFEQ(final IFEQ o){ + public void visitIFEQ(final IFEQ o) { stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFGE(final IFGE o){ + public void visitIFGE(final IFGE o) { stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFGT(final IFGT o){ + public void visitIFGT(final IFGT o) { stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFLE(final IFLE o){ + public void visitIFLE(final IFLE o) { stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFLT(final IFLT o){ + public void visitIFLT(final IFLT o) { stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFNE(final IFNE o){ + public void visitIFNE(final IFNE o) { stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFNONNULL(final IFNONNULL o){ + public void visitIFNONNULL(final IFNONNULL o) { stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIFNULL(final IFNULL o){ + public void visitIFNULL(final IFNULL o) { stack().pop(); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIINC(final IINC o){ + public void visitIINC(final IINC o) { // stack is not changed. } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitILOAD(final ILOAD o){ + public void visitILOAD(final ILOAD o) { stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitIMUL(final IMUL o){ + public void visitIMUL(final IMUL o) { stack().pop(); stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitINEG(final INEG o){ + public void visitINEG(final INEG o) { stack().pop(); stack().push(Type.INT); } /** Symbolically executes the corresponding Java Virtual Machine instruction. */ @Override - public void visitINSTANCEOF(final INSTANCEOF o){ + public void visitINSTANCEOF(final INSTANCEOF o) { stack().pop(); stack().push(Type.INT); } @@ -792,15 +792,15 @@ public class ExecutionVisitor extends EmptyVisitor{ * @since 6.0 */ @Override - public void visitINVOKEDYNAMIC(final INVOKEDYNAMIC o){ - for (int i=0; i stack().slotsUsed()){ + if (consume > stack().slotsUsed()) { constraintViolated(o, "Cannot consume "+consume+" stack slots: only "+stack().slotsUsed()+" slot(s) left on stack!\nStack:\n"+stack()); } int produce = o.produceStack(cpg) - o.consumeStack(cpg); // Stack values are always consumed first; then produced. - if ( produce + stack().slotsUsed() > stack().maxStack() ){ + if ( produce + stack().slotsUsed() > stack().maxStack() ) { constraintViolated(o, "Cannot produce "+produce+" stack slots: only "+(stack().maxStack()-stack().slotsUsed())+ " free stack slot(s) left.\nStack:\n"+stack()); } @@ -228,12 +228,12 @@ public class InstConstraintVisitor extends EmptyVisitor{ * The referenced class is loaded and pass2-verified. */ @Override - public void visitLoadClass(final LoadClass o){ + public void visitLoadClass(final LoadClass o) { ObjectType t = o.getLoadClassType(cpg); - if (t != null){// null means "no class is loaded" + if (t != null) {// null means "no class is loaded" Verifier v = VerifierFactory.getVerifier(t.getClassName()); VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + if (vr.getStatus() != VerificationResult.VERIFIED_OK) { constraintViolated((Instruction) o, "Class '"+o.getLoadClassType(cpg).getClassName()+ "' is referenced, but cannot be loaded and resolved: '"+vr+"'."); } @@ -244,7 +244,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the general preconditions of a StackConsumer instance. */ @Override - public void visitStackConsumer(final StackConsumer o){ + public void visitStackConsumer(final StackConsumer o) { _visitStackAccessor((Instruction) o); } @@ -252,7 +252,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the general preconditions of a StackProducer instance. */ @Override - public void visitStackProducer(final StackProducer o){ + public void visitStackProducer(final StackProducer o) { _visitStackAccessor((Instruction) o); } @@ -266,9 +266,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the general preconditions of a CPInstruction instance. */ @Override - public void visitCPInstruction(final CPInstruction o){ + public void visitCPInstruction(final CPInstruction o) { int idx = o.getIndex(); - if ((idx < 0) || (idx >= cpg.getSize())){ + if ((idx < 0) || (idx >= cpg.getSize())) { throw new AssertionViolatedException( "Huh?! Constant pool index of instruction '"+o+"' illegal? Pass 3a should have checked this!"); } @@ -278,23 +278,23 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the general preconditions of a FieldInstruction instance. */ @Override - public void visitFieldInstruction(final FieldInstruction o){ + public void visitFieldInstruction(final FieldInstruction o) { // visitLoadClass(o) has been called before: Every FieldOrMethod // implements LoadClass. // visitCPInstruction(o) has been called before. // A FieldInstruction may be: GETFIELD, GETSTATIC, PUTFIELD, PUTSTATIC Constant c = cpg.getConstant(o.getIndex()); - if (!(c instanceof ConstantFieldref)){ + if (!(c instanceof ConstantFieldref)) { constraintViolated(o, "Index '"+o.getIndex()+"' should refer to a CONSTANT_Fieldref_info structure, but refers to '"+c+"'."); } // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). Type t = o.getType(cpg); - if (t instanceof ObjectType){ + if (t instanceof ObjectType) { String name = ((ObjectType)t).getClassName(); Verifier v = VerifierFactory.getVerifier( name ); VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + if (vr.getStatus() != VerificationResult.VERIFIED_OK) { constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); } } @@ -304,7 +304,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the general preconditions of an InvokeInstruction instance. */ @Override - public void visitInvokeInstruction(final InvokeInstruction o){ + public void visitInvokeInstruction(final InvokeInstruction o) { // visitLoadClass(o) has been called before: Every FieldOrMethod // implements LoadClass. // visitCPInstruction(o) has been called before. @@ -315,7 +315,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the general preconditions of a StackInstruction instance. */ @Override - public void visitStackInstruction(final StackInstruction o){ + public void visitStackInstruction(final StackInstruction o) { _visitStackAccessor(o); } @@ -324,8 +324,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * That is, the index of the local variable must be valid. */ @Override - public void visitLocalVariableInstruction(final LocalVariableInstruction o){ - if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ + public void visitLocalVariableInstruction(final LocalVariableInstruction o) { + if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ) { constraintViolated(o, "The 'index' is not a valid index into the local variable array."); } } @@ -334,19 +334,19 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Assures the generic preconditions of a LoadInstruction instance. */ @Override - public void visitLoadInstruction(final LoadInstruction o){ + public void visitLoadInstruction(final LoadInstruction o) { //visitLocalVariableInstruction(o) is called before, because it is more generic. // LOAD instructions must not read Type.UNKNOWN - if (locals().get(o.getIndex()) == Type.UNKNOWN){ + if (locals().get(o.getIndex()) == Type.UNKNOWN) { constraintViolated(o, "Read-Access on local variable "+o.getIndex()+" with unknown content."); } // LOAD instructions, two-slot-values at index N must have Type.UNKNOWN // as a symbol for the higher halve at index N+1 // [suppose some instruction put an int at N+1--- our double at N is defective] - if (o.getType(cpg).getSize() == 2){ - if (locals().get(o.getIndex()+1) != Type.UNKNOWN){ + if (o.getType(cpg).getSize() == 2) { + if (locals().get(o.getIndex()+1) != Type.UNKNOWN) { constraintViolated(o, "Reading a two-locals value from local variables "+o.getIndex()+ " and "+(o.getIndex()+1)+" where the latter one is destroyed."); @@ -354,14 +354,14 @@ public class InstConstraintVisitor extends EmptyVisitor{ } // LOAD instructions must read the correct type. - if (!(o instanceof ALOAD)){ - if (locals().get(o.getIndex()) != o.getType(cpg) ){ + if (!(o instanceof ALOAD)) { + if (locals().get(o.getIndex()) != o.getType(cpg) ) { constraintViolated(o,"Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+ locals().get(o.getIndex())+"'; Instruction type: '"+o.getType(cpg)+"'."); } } else{ // we deal with an ALOAD - if (!(locals().get(o.getIndex()) instanceof ReferenceType)){ + if (!(locals().get(o.getIndex()) instanceof ReferenceType)) { constraintViolated(o, "Local Variable type and LOADing Instruction type mismatch: Local Variable: '"+ locals().get(o.getIndex())+"'; Instruction expects a ReferenceType."); } @@ -370,7 +370,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } // LOAD instructions must have enough free stack slots. - if ((stack().maxStack() - stack().slotsUsed()) < o.getType(cpg).getSize()){ + if ((stack().maxStack() - stack().slotsUsed()) < o.getType(cpg).getSize()) { constraintViolated(o, "Not enough free stack slots to load a '"+o.getType(cpg)+"' onto the OperandStack."); } } @@ -379,26 +379,26 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Assures the generic preconditions of a StoreInstruction instance. */ @Override - public void visitStoreInstruction(final StoreInstruction o){ + public void visitStoreInstruction(final StoreInstruction o) { //visitLocalVariableInstruction(o) is called before, because it is more generic. - if (stack().isEmpty()){ // Don't bother about 1 or 2 stack slots used. This check is implicitly done below while type checking. + if (stack().isEmpty()) { // Don't bother about 1 or 2 stack slots used. This check is implicitly done below while type checking. constraintViolated(o, "Cannot STORE: Stack to read from is empty."); } - if ( !(o instanceof ASTORE) ){ - if (! (stack().peek() == o.getType(cpg)) ){// the other xSTORE types are singletons in BCEL. + if ( !(o instanceof ASTORE) ) { + if (! (stack().peek() == o.getType(cpg)) ) {// the other xSTORE types are singletons in BCEL. constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+ "'; Instruction type: '"+o.getType(cpg)+"'."); } } else{ // we deal with ASTORE Type stacktop = stack().peek(); - if ( (!(stacktop instanceof ReferenceType)) && (!(stacktop instanceof ReturnaddressType)) ){ + if ( (!(stacktop instanceof ReferenceType)) && (!(stacktop instanceof ReturnaddressType)) ) { constraintViolated(o, "Stack top type and STOREing Instruction type mismatch: Stack top: '"+stack().peek()+ "'; Instruction expects a ReferenceType or a ReturnadressType."); } - //if (stacktop instanceof ReferenceType){ + //if (stacktop instanceof ReferenceType) { // referenceTypeIsInitialized(o, (ReferenceType) stacktop); //} } @@ -408,44 +408,44 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Assures the generic preconditions of a ReturnInstruction instance. */ @Override - public void visitReturnInstruction(final ReturnInstruction o){ + public void visitReturnInstruction(final ReturnInstruction o) { Type method_type = mg.getType(); if (method_type == Type.BOOLEAN || method_type == Type.BYTE || method_type == Type.SHORT || - method_type == Type.CHAR){ + method_type == Type.CHAR) { method_type = Type.INT; } - if (o instanceof RETURN){ - if (method_type != Type.VOID){ + if (o instanceof RETURN) { + if (method_type != Type.VOID) { constraintViolated(o, "RETURN instruction in non-void method."); } else{ return; } } - if (o instanceof ARETURN){ - if (method_type == Type.VOID){ + if (o instanceof ARETURN) { + if (method_type == Type.VOID) { constraintViolated(o, "ARETURN instruction in void method."); } - if (stack().peek() == Type.NULL){ + if (stack().peek() == Type.NULL) { return; } - if (! (stack().peek() instanceof ReferenceType)){ + if (! (stack().peek() instanceof ReferenceType)) { constraintViolated(o, "Reference type expected on top of stack, but is: '"+stack().peek()+"'."); } referenceTypeIsInitialized(o, (ReferenceType) (stack().peek())); //ReferenceType objectref = (ReferenceType) (stack().peek()); // TODO: This can only be checked if using Staerk-et-al's "set of object types" instead of a // "wider cast object type" created during verification. - //if (! (objectref.isAssignmentCompatibleWith(mg.getType())) ){ + //if (! (objectref.isAssignmentCompatibleWith(mg.getType())) ) { // constraintViolated(o, "Type on stack top which should be returned is a '"+stack().peek()+ // "' which is not assignment compatible with the return type of this method, '"+mg.getType()+"'."); //} } else{ - if (! ( method_type.equals( stack().peek() ))){ + if (! ( method_type.equals( stack().peek() ))) { constraintViolated(o, "Current method has return type of '"+mg.getType()+"' expecting a '"+method_type+ "' on top of the stack. But stack top is a '"+stack().peek()+"'."); } @@ -460,13 +460,13 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitAALOAD(final AALOAD o){ + public void visitAALOAD(final AALOAD o) { Type arrayref = stack().peek(1); Type index = stack().peek(0); indexOfInt(o, index); - if (arrayrefOfArrayType(o, arrayref)){ - if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ + if (arrayrefOfArrayType(o, arrayref)) { + if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)) { constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+ ((ArrayType) arrayref).getElementType()+"."); @@ -479,21 +479,21 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitAASTORE(final AASTORE o){ + public void visitAASTORE(final AASTORE o) { Type arrayref = stack().peek(2); Type index = stack().peek(1); Type value = stack().peek(0); indexOfInt(o, index); - if (!(value instanceof ReferenceType)){ + if (!(value instanceof ReferenceType)) { constraintViolated(o, "The 'value' is not of a ReferenceType but of type "+value+"."); }else{ //referenceTypeIsInitialized(o, (ReferenceType) value); } // Don't bother further with "referenceTypeIsInitialized()", there are no arrays // of an uninitialized object type. - if (arrayrefOfArrayType(o, arrayref)){ - if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)){ + if (arrayrefOfArrayType(o, arrayref)) { + if (! (((ArrayType) arrayref).getElementType() instanceof ReferenceType)) { constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a ReferenceType but to an array of "+ ((ArrayType) arrayref).getElementType()+"."); } @@ -505,7 +505,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitACONST_NULL(final ACONST_NULL o){ + public void visitACONST_NULL(final ACONST_NULL o) { // Nothing needs to be done here. } @@ -513,7 +513,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitALOAD(final ALOAD o){ + public void visitALOAD(final ALOAD o) { //visitLoadInstruction(LoadInstruction) is called before. // Nothing else needs to be done here. @@ -523,7 +523,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitANEWARRAY(final ANEWARRAY o){ + public void visitANEWARRAY(final ANEWARRAY o) { if (!stack().peek().equals(Type.INT)) { constraintViolated(o, "The 'count' at the stack top is not of type '"+Type.INT+"' but of type '"+stack().peek()+"'."); // The runtime constant pool item at that index must be a symbolic reference to a class, @@ -535,8 +535,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitARETURN(final ARETURN o){ - if (! (stack().peek() instanceof ReferenceType) ){ + public void visitARETURN(final ARETURN o) { + if (! (stack().peek() instanceof ReferenceType) ) { constraintViolated(o, "The 'objectref' at the stack top is not of a ReferenceType but of type '"+stack().peek()+"'."); } ReferenceType objectref = (ReferenceType) (stack().peek()); @@ -545,7 +545,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ // The check below should already done via visitReturnInstruction(ReturnInstruction), see there. // It cannot be done using Staerk-et-al's "set of object types" instead of a // "wider cast object type", anyway. - //if (! objectref.isAssignmentCompatibleWith(mg.getReturnType() )){ + //if (! objectref.isAssignmentCompatibleWith(mg.getReturnType() )) { // constraintViolated(o, "The 'objectref' type "+objectref+ // " at the stack top is not assignment compatible with the return type '"+mg.getReturnType()+"' of the method."); //} @@ -555,7 +555,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitARRAYLENGTH(final ARRAYLENGTH o){ + public void visitARRAYLENGTH(final ARRAYLENGTH o) { Type arrayref = stack().peek(0); arrayrefOfArrayType(o, arrayref); } @@ -564,11 +564,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitASTORE(final ASTORE o){ - if (! ( (stack().peek() instanceof ReferenceType) || (stack().peek() instanceof ReturnaddressType) ) ){ + public void visitASTORE(final ASTORE o) { + if (! ( (stack().peek() instanceof ReferenceType) || (stack().peek() instanceof ReturnaddressType) ) ) { constraintViolated(o, "The 'objectref' is not of a ReferenceType or of ReturnaddressType but of "+stack().peek()+"."); } - //if (stack().peek() instanceof ReferenceType){ + //if (stack().peek() instanceof ReferenceType) { // referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); //} } @@ -577,11 +577,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitATHROW(final ATHROW o){ + public void visitATHROW(final ATHROW o) { try { // It's stated that 'objectref' must be of a ReferenceType --- but since Throwable is // not derived from an ArrayType, it follows that 'objectref' must be of an ObjectType or Type.NULL. - if (! ((stack().peek() instanceof ObjectType) || (stack().peek().equals(Type.NULL))) ){ + if (! ((stack().peek() instanceof ObjectType) || (stack().peek().equals(Type.NULL))) ) { constraintViolated(o, "The 'objectref' is not of an (initialized) ObjectType but of type "+stack().peek()+"."); } @@ -592,7 +592,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ ObjectType exc = (ObjectType) (stack().peek()); ObjectType throwable = (ObjectType) (Type.getType("Ljava/lang/Throwable;")); - if ( (! (exc.subclassOf(throwable)) ) && (! (exc.equals(throwable))) ){ + if ( (! (exc.subclassOf(throwable)) ) && (! (exc.equals(throwable))) ) { constraintViolated(o, "The 'objectref' is not of class Throwable or of a subclass of Throwable, but of '"+stack().peek()+"'."); } @@ -606,13 +606,13 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitBALOAD(final BALOAD o){ + public void visitBALOAD(final BALOAD o) { Type arrayref = stack().peek(1); Type index = stack().peek(0); indexOfInt(o, index); - if (arrayrefOfArrayType(o, arrayref)){ + if (arrayrefOfArrayType(o, arrayref)) { if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || - (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ){ + (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ) { constraintViolated(o, "The 'arrayref' does not refer to an array with elements of a Type.BYTE or Type.BOOLEAN but to an array of '"+ ((ArrayType) arrayref).getElementType()+"'."); @@ -624,14 +624,14 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitBASTORE(final BASTORE o){ + public void visitBASTORE(final BASTORE o) { Type arrayref = stack().peek(2); Type index = stack().peek(1); Type value = stack().peek(0); indexOfInt(o, index); valueOfInt(o, value); - if (arrayrefOfArrayType(o, arrayref)){ + if (arrayrefOfArrayType(o, arrayref)) { if (! ( (((ArrayType) arrayref).getElementType().equals(Type.BOOLEAN)) || (((ArrayType) arrayref).getElementType().equals(Type.BYTE)) ) ) { constraintViolated(o, @@ -645,7 +645,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitBIPUSH(final BIPUSH o){ + public void visitBIPUSH(final BIPUSH o) { // Nothing to do... } @@ -653,7 +653,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitBREAKPOINT(final BREAKPOINT o){ + public void visitBREAKPOINT(final BREAKPOINT o) { throw new AssertionViolatedException( "In this JustIce verification pass there should not occur an illegal instruction such as BREAKPOINT."); } @@ -662,7 +662,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitCALOAD(final CALOAD o){ + public void visitCALOAD(final CALOAD o) { Type arrayref = stack().peek(1); Type index = stack().peek(0); @@ -674,15 +674,15 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitCASTORE(final CASTORE o){ + public void visitCASTORE(final CASTORE o) { Type arrayref = stack().peek(2); Type index = stack().peek(1); Type value = stack().peek(0); indexOfInt(o, index); valueOfInt(o, value); - if (arrayrefOfArrayType(o, arrayref)){ - if (! ((ArrayType) arrayref).getElementType().equals(Type.CHAR) ){ + if (arrayrefOfArrayType(o, arrayref)) { + if (! ((ArrayType) arrayref).getElementType().equals(Type.CHAR) ) { constraintViolated(o, "The 'arrayref' does not refer to an array with elements of type char but to an array of type "+ ((ArrayType) arrayref).getElementType()+"."); } @@ -693,10 +693,10 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitCHECKCAST(final CHECKCAST o){ + public void visitCHECKCAST(final CHECKCAST o) { // The objectref must be of type reference. Type objectref = stack().peek(0); - if (!(objectref instanceof ReferenceType)){ + if (!(objectref instanceof ReferenceType)) { constraintViolated(o, "The 'objectref' is not of a ReferenceType but of type "+objectref+"."); } //else{ @@ -706,7 +706,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ // current class (�3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant // pool item at the index must be a symbolic reference to a class, array, or interface type. Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ + if (! (c instanceof ConstantClass)) { constraintViolated(o, "The Constant at 'index' is not a ConstantClass, but '"+c+"'."); } } @@ -715,8 +715,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitD2F(final D2F o){ - if (stack().peek() != Type.DOUBLE){ + public void visitD2F(final D2F o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } } @@ -725,8 +725,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitD2I(final D2I o){ - if (stack().peek() != Type.DOUBLE){ + public void visitD2I(final D2I o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } } @@ -735,8 +735,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitD2L(final D2L o){ - if (stack().peek() != Type.DOUBLE){ + public void visitD2L(final D2L o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } } @@ -745,11 +745,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDADD(final DADD o){ - if (stack().peek() != Type.DOUBLE){ + public void visitDADD(final DADD o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.DOUBLE){ + if (stack().peek(1) != Type.DOUBLE) { constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); } } @@ -758,16 +758,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDALOAD(final DALOAD o){ + public void visitDALOAD(final DALOAD o) { indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ + if (stack().peek(1) == Type.NULL) { return; } - if (! (stack().peek(1) instanceof ArrayType)){ + if (! (stack().peek(1) instanceof ArrayType)) { constraintViolated(o, "Stack next-to-top must be of type double[] but is '"+stack().peek(1)+"'."); } Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.DOUBLE){ + if (t != Type.DOUBLE) { constraintViolated(o, "Stack next-to-top must be of type double[] but is '"+stack().peek(1)+"'."); } } @@ -776,19 +776,19 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDASTORE(final DASTORE o){ - if (stack().peek() != Type.DOUBLE){ + public void visitDASTORE(final DASTORE o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ + if (stack().peek(2) == Type.NULL) { return; } - if (! (stack().peek(2) instanceof ArrayType)){ + if (! (stack().peek(2) instanceof ArrayType)) { constraintViolated(o, "Stack next-to-next-to-top must be of type double[] but is '"+stack().peek(2)+"'."); } Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.DOUBLE){ + if (t != Type.DOUBLE) { constraintViolated(o, "Stack next-to-next-to-top must be of type double[] but is '"+stack().peek(2)+"'."); } } @@ -797,11 +797,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDCMPG(final DCMPG o){ - if (stack().peek() != Type.DOUBLE){ + public void visitDCMPG(final DCMPG o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.DOUBLE){ + if (stack().peek(1) != Type.DOUBLE) { constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); } } @@ -810,11 +810,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDCMPL(final DCMPL o){ - if (stack().peek() != Type.DOUBLE){ + public void visitDCMPL(final DCMPL o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.DOUBLE){ + if (stack().peek(1) != Type.DOUBLE) { constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); } } @@ -823,7 +823,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDCONST(final DCONST o){ + public void visitDCONST(final DCONST o) { // There's nothing to be done here. } @@ -831,11 +831,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDDIV(final DDIV o){ - if (stack().peek() != Type.DOUBLE){ + public void visitDDIV(final DDIV o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.DOUBLE){ + if (stack().peek(1) != Type.DOUBLE) { constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); } } @@ -844,7 +844,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDLOAD(final DLOAD o){ + public void visitDLOAD(final DLOAD o) { //visitLoadInstruction(LoadInstruction) is called before. // Nothing else needs to be done here. @@ -854,11 +854,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDMUL(final DMUL o){ - if (stack().peek() != Type.DOUBLE){ + public void visitDMUL(final DMUL o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.DOUBLE){ + if (stack().peek(1) != Type.DOUBLE) { constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); } } @@ -867,8 +867,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDNEG(final DNEG o){ - if (stack().peek() != Type.DOUBLE){ + public void visitDNEG(final DNEG o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } } @@ -877,11 +877,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDREM(final DREM o){ - if (stack().peek() != Type.DOUBLE){ + public void visitDREM(final DREM o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.DOUBLE){ + if (stack().peek(1) != Type.DOUBLE) { constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); } } @@ -890,8 +890,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDRETURN(final DRETURN o){ - if (stack().peek() != Type.DOUBLE){ + public void visitDRETURN(final DRETURN o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } } @@ -900,7 +900,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDSTORE(final DSTORE o){ + public void visitDSTORE(final DSTORE o) { //visitStoreInstruction(StoreInstruction) is called before. // Nothing else needs to be done here. @@ -910,11 +910,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDSUB(final DSUB o){ - if (stack().peek() != Type.DOUBLE){ + public void visitDSUB(final DSUB o) { + if (stack().peek() != Type.DOUBLE) { constraintViolated(o, "The value at the stack top is not of type 'double', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.DOUBLE){ + if (stack().peek(1) != Type.DOUBLE) { constraintViolated(o, "The value at the stack next-to-top is not of type 'double', but of type '"+stack().peek(1)+"'."); } } @@ -923,8 +923,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDUP(final DUP o){ - if (stack().peek().getSize() != 1){ + public void visitDUP(final DUP o) { + if (stack().peek().getSize() != 1) { constraintViolated(o, "Won't DUP type on stack top '"+stack().peek()+ "' because it must occupy exactly one slot, not '"+stack().peek().getSize()+"'."); } @@ -934,12 +934,12 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDUP_X1(final DUP_X1 o){ - if (stack().peek().getSize() != 1){ + public void visitDUP_X1(final DUP_X1 o) { + if (stack().peek().getSize() != 1) { constraintViolated(o, "Type on stack top '"+stack().peek()+"' should occupy exactly one slot, not '"+stack().peek().getSize()+"'."); } - if (stack().peek(1).getSize() != 1){ + if (stack().peek(1).getSize() != 1) { constraintViolated(o, "Type on stack next-to-top '"+stack().peek(1)+ "' should occupy exactly one slot, not '"+stack().peek(1).getSize()+"'."); @@ -950,16 +950,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDUP_X2(final DUP_X2 o){ - if (stack().peek().getSize() != 1){ + public void visitDUP_X2(final DUP_X2 o) { + if (stack().peek().getSize() != 1) { constraintViolated(o, "Stack top type must be of size 1, but is '"+stack().peek()+"' of size '"+stack().peek().getSize()+"'."); } - if (stack().peek(1).getSize() == 2){ + if (stack().peek(1).getSize() == 2) { return; // Form 2, okay. } //stack().peek(1).getSize == 1. - if (stack().peek(2).getSize() != 1){ + if (stack().peek(2).getSize() != 1) { constraintViolated(o, "If stack top's size is 1 and stack next-to-top's size is 1,"+ " stack next-to-next-to-top's size must also be 1, but is: '"+ @@ -971,12 +971,12 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDUP2(final DUP2 o){ - if (stack().peek().getSize() == 2){ + public void visitDUP2(final DUP2 o) { + if (stack().peek().getSize() == 2) { return; // Form 2, okay. } //stack().peek().getSize() == 1. - if (stack().peek(1).getSize() != 1){ + if (stack().peek(1).getSize() != 1) { constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+stack().peek(1)+ "' of size '"+stack().peek(1).getSize()+"'."); @@ -987,9 +987,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDUP2_X1(final DUP2_X1 o){ - if (stack().peek().getSize() == 2){ - if (stack().peek(1).getSize() != 1){ + public void visitDUP2_X1(final DUP2_X1 o) { + if (stack().peek().getSize() == 2) { + if (stack().peek(1).getSize() != 1) { constraintViolated(o, "If stack top's size is 2, then stack next-to-top's size must be 1. But it is '"+ stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); } @@ -998,11 +998,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } else{ // stack top is of size 1 - if ( stack().peek(1).getSize() != 1 ){ + if ( stack().peek(1).getSize() != 1 ) { constraintViolated(o, "If stack top's size is 1, then stack next-to-top's size must also be 1. But it is '"+ stack().peek(1)+"' of size '"+stack().peek(1).getSize()+"'."); } - if ( stack().peek(2).getSize() != 1 ){ + if ( stack().peek(2).getSize() != 1 ) { constraintViolated(o, "If stack top's size is 1, then stack next-to-next-to-top's size must also be 1. But it is '"+ stack().peek(2)+"' of size '"+stack().peek(2).getSize()+"'."); } @@ -1013,14 +1013,14 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitDUP2_X2(final DUP2_X2 o){ + public void visitDUP2_X2(final DUP2_X2 o) { - if (stack().peek(0).getSize() == 2){ - if (stack().peek(1).getSize() == 2){ + if (stack().peek(0).getSize() == 2) { + if (stack().peek(1).getSize() == 2) { return; // Form 4 } // stack top size is 2, next-to-top's size is 1 - if ( stack().peek(2).getSize() != 1 ){ + if ( stack().peek(2).getSize() != 1 ) { constraintViolated(o, "If stack top's size is 2 and stack-next-to-top's size is 1,"+ " then stack next-to-next-to-top's size must also be 1. But it is '"+stack().peek(2)+ "' of size '"+stack().peek(2).getSize()+"'."); @@ -1030,11 +1030,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } else{// stack top is of size 1 - if (stack().peek(1).getSize() == 1){ - if ( stack().peek(2).getSize() == 2 ){ + if (stack().peek(1).getSize() == 1) { + if ( stack().peek(2).getSize() == 2 ) { return; // Form 3 } - if ( stack().peek(3).getSize() == 1){ + if ( stack().peek(3).getSize() == 1) { return; // Form 1 } } @@ -1046,8 +1046,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitF2D(final F2D o){ - if (stack().peek() != Type.FLOAT){ + public void visitF2D(final F2D o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } } @@ -1056,8 +1056,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitF2I(final F2I o){ - if (stack().peek() != Type.FLOAT){ + public void visitF2I(final F2I o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } } @@ -1066,8 +1066,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitF2L(final F2L o){ - if (stack().peek() != Type.FLOAT){ + public void visitF2L(final F2L o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } } @@ -1076,11 +1076,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFADD(final FADD o){ - if (stack().peek() != Type.FLOAT){ + public void visitFADD(final FADD o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.FLOAT){ + if (stack().peek(1) != Type.FLOAT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); } } @@ -1089,16 +1089,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFALOAD(final FALOAD o){ + public void visitFALOAD(final FALOAD o) { indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ + if (stack().peek(1) == Type.NULL) { return; } - if (! (stack().peek(1) instanceof ArrayType)){ + if (! (stack().peek(1) instanceof ArrayType)) { constraintViolated(o, "Stack next-to-top must be of type float[] but is '"+stack().peek(1)+"'."); } Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.FLOAT){ + if (t != Type.FLOAT) { constraintViolated(o, "Stack next-to-top must be of type float[] but is '"+stack().peek(1)+"'."); } } @@ -1107,19 +1107,19 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFASTORE(final FASTORE o){ - if (stack().peek() != Type.FLOAT){ + public void visitFASTORE(final FASTORE o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ + if (stack().peek(2) == Type.NULL) { return; } - if (! (stack().peek(2) instanceof ArrayType)){ + if (! (stack().peek(2) instanceof ArrayType)) { constraintViolated(o, "Stack next-to-next-to-top must be of type float[] but is '"+stack().peek(2)+"'."); } Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.FLOAT){ + if (t != Type.FLOAT) { constraintViolated(o, "Stack next-to-next-to-top must be of type float[] but is '"+stack().peek(2)+"'."); } } @@ -1128,11 +1128,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFCMPG(final FCMPG o){ - if (stack().peek() != Type.FLOAT){ + public void visitFCMPG(final FCMPG o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.FLOAT){ + if (stack().peek(1) != Type.FLOAT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); } } @@ -1141,11 +1141,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFCMPL(final FCMPL o){ - if (stack().peek() != Type.FLOAT){ + public void visitFCMPL(final FCMPL o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.FLOAT){ + if (stack().peek(1) != Type.FLOAT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); } } @@ -1154,7 +1154,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFCONST(final FCONST o){ + public void visitFCONST(final FCONST o) { // nothing to do here. } @@ -1162,11 +1162,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFDIV(final FDIV o){ - if (stack().peek() != Type.FLOAT){ + public void visitFDIV(final FDIV o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.FLOAT){ + if (stack().peek(1) != Type.FLOAT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); } } @@ -1175,7 +1175,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFLOAD(final FLOAD o){ + public void visitFLOAD(final FLOAD o) { //visitLoadInstruction(LoadInstruction) is called before. // Nothing else needs to be done here. @@ -1185,11 +1185,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFMUL(final FMUL o){ - if (stack().peek() != Type.FLOAT){ + public void visitFMUL(final FMUL o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.FLOAT){ + if (stack().peek(1) != Type.FLOAT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); } } @@ -1198,8 +1198,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFNEG(final FNEG o){ - if (stack().peek() != Type.FLOAT){ + public void visitFNEG(final FNEG o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } } @@ -1208,11 +1208,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFREM(final FREM o){ - if (stack().peek() != Type.FLOAT){ + public void visitFREM(final FREM o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.FLOAT){ + if (stack().peek(1) != Type.FLOAT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); } } @@ -1221,8 +1221,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFRETURN(final FRETURN o){ - if (stack().peek() != Type.FLOAT){ + public void visitFRETURN(final FRETURN o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } } @@ -1231,7 +1231,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFSTORE(final FSTORE o){ + public void visitFSTORE(final FSTORE o) { //visitStoreInstruction(StoreInstruction) is called before. // Nothing else needs to be done here. @@ -1241,11 +1241,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitFSUB(final FSUB o){ - if (stack().peek() != Type.FLOAT){ + public void visitFSUB(final FSUB o) { + if (stack().peek() != Type.FLOAT) { constraintViolated(o, "The value at the stack top is not of type 'float', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.FLOAT){ + if (stack().peek(1) != Type.FLOAT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'float', but of type '"+stack().peek(1)+"'."); } } @@ -1263,10 +1263,10 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitGETFIELD(final GETFIELD o){ + public void visitGETFIELD(final GETFIELD o) { try { Type objectref = stack().peek(); - if (! ( (objectref instanceof ObjectType) || (objectref == Type.NULL) ) ){ + if (! ( (objectref instanceof ObjectType) || (objectref == Type.NULL) ) ) { constraintViolated(o, "Stack top should be an object reference that's not an array reference, but is '"+objectref+"'."); } @@ -1276,20 +1276,20 @@ public class InstConstraintVisitor extends EmptyVisitor{ Field[] fields = jc.getFields(); Field f = null; for (Field field : fields) { - if (field.getName().equals(field_name)){ + if (field.getName().equals(field_name)) { Type f_type = Type.getType(field.getSignature()); Type o_type = o.getType(cpg); /* TODO: Check if assignment compatibility is sufficient. * What does Sun do? */ - if (f_type.equals(o_type)){ + if (f_type.equals(o_type)) { f = field; break; } } } - if (f == null){ + if (f == null) { JavaClass[] superclasses = jc.getSuperClasses(); outer: for (JavaClass superclass : superclasses) { @@ -1313,22 +1313,22 @@ public class InstConstraintVisitor extends EmptyVisitor{ } } - if (f.isProtected()){ + if (f.isProtected()) { ObjectType classtype = getObjectType(o); ObjectType curr = ObjectType.getInstance(mg.getClassName()); if ( classtype.equals(curr) || - curr.subclassOf(classtype) ){ + curr.subclassOf(classtype) ) { Type t = stack().peek(); - if (t == Type.NULL){ + if (t == Type.NULL) { return; } - if (! (t instanceof ObjectType) ){ + if (! (t instanceof ObjectType) ) { constraintViolated(o, "The 'objectref' must refer to an object that's not an array. Found instead: '"+t+"'."); } ObjectType objreftype = (ObjectType) t; if (! ( objreftype.equals(curr) || - objreftype.subclassOf(curr) ) ){ + objreftype.subclassOf(curr) ) ) { //TODO: One day move to Staerk-et-al's "Set of object types" instead of "wider" object types // created during the verification. // "Wider" object types don't allow us to check for things like that below. @@ -1341,7 +1341,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ } // TODO: Could go into Pass 3a. - if (f.isStatic()){ + if (f.isStatic()) { constraintViolated(o, "Referenced field '"+f+"' is static which it shouldn't be."); } @@ -1355,7 +1355,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitGETSTATIC(final GETSTATIC o){ + public void visitGETSTATIC(final GETSTATIC o) { // Field must be static: see Pass 3a. } @@ -1363,7 +1363,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitGOTO(final GOTO o){ + public void visitGOTO(final GOTO o) { // nothing to do here. } @@ -1371,7 +1371,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitGOTO_W(final GOTO_W o){ + public void visitGOTO_W(final GOTO_W o) { // nothing to do here. } @@ -1379,8 +1379,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitI2B(final I2B o){ - if (stack().peek() != Type.INT){ + public void visitI2B(final I2B o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1389,8 +1389,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitI2C(final I2C o){ - if (stack().peek() != Type.INT){ + public void visitI2C(final I2C o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1399,8 +1399,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitI2D(final I2D o){ - if (stack().peek() != Type.INT){ + public void visitI2D(final I2D o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1409,8 +1409,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitI2F(final I2F o){ - if (stack().peek() != Type.INT){ + public void visitI2F(final I2F o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1419,8 +1419,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitI2L(final I2L o){ - if (stack().peek() != Type.INT){ + public void visitI2L(final I2L o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1429,8 +1429,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitI2S(final I2S o){ - if (stack().peek() != Type.INT){ + public void visitI2S(final I2S o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1439,11 +1439,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIADD(final IADD o){ - if (stack().peek() != Type.INT){ + public void visitIADD(final IADD o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -1452,16 +1452,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIALOAD(final IALOAD o){ + public void visitIALOAD(final IALOAD o) { indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ + if (stack().peek(1) == Type.NULL) { return; } - if (! (stack().peek(1) instanceof ArrayType)){ + if (! (stack().peek(1) instanceof ArrayType)) { constraintViolated(o, "Stack next-to-top must be of type int[] but is '"+stack().peek(1)+"'."); } Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.INT){ + if (t != Type.INT) { constraintViolated(o, "Stack next-to-top must be of type int[] but is '"+stack().peek(1)+"'."); } } @@ -1470,11 +1470,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIAND(final IAND o){ - if (stack().peek() != Type.INT){ + public void visitIAND(final IAND o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -1483,19 +1483,19 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIASTORE(final IASTORE o){ - if (stack().peek() != Type.INT){ + public void visitIASTORE(final IASTORE o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ + if (stack().peek(2) == Type.NULL) { return; } - if (! (stack().peek(2) instanceof ArrayType)){ + if (! (stack().peek(2) instanceof ArrayType)) { constraintViolated(o, "Stack next-to-next-to-top must be of type int[] but is '"+stack().peek(2)+"'."); } Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.INT){ + if (t != Type.INT) { constraintViolated(o, "Stack next-to-next-to-top must be of type int[] but is '"+stack().peek(2)+"'."); } } @@ -1504,7 +1504,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitICONST(final ICONST o){ + public void visitICONST(final ICONST o) { //nothing to do here. } @@ -1512,11 +1512,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIDIV(final IDIV o){ - if (stack().peek() != Type.INT){ + public void visitIDIV(final IDIV o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -1525,13 +1525,13 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ACMPEQ(final IF_ACMPEQ o){ - if (!(stack().peek() instanceof ReferenceType)){ + public void visitIF_ACMPEQ(final IF_ACMPEQ o) { + if (!(stack().peek() instanceof ReferenceType)) { constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); } //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); - if (!(stack().peek(1) instanceof ReferenceType)){ + if (!(stack().peek(1) instanceof ReferenceType)) { constraintViolated(o, "The value at the stack next-to-top is not of a ReferenceType, but of type '"+stack().peek(1)+"'."); } //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek(1)) ); @@ -1542,12 +1542,12 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ACMPNE(final IF_ACMPNE o){ - if (!(stack().peek() instanceof ReferenceType)){ + public void visitIF_ACMPNE(final IF_ACMPNE o) { + if (!(stack().peek() instanceof ReferenceType)) { constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); } - if (!(stack().peek(1) instanceof ReferenceType)){ + if (!(stack().peek(1) instanceof ReferenceType)) { constraintViolated(o, "The value at the stack next-to-top is not of a ReferenceType, but of type '"+stack().peek(1)+"'."); //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek(1)) ); } @@ -1557,11 +1557,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ICMPEQ(final IF_ICMPEQ o){ - if (stack().peek() != Type.INT){ + public void visitIF_ICMPEQ(final IF_ICMPEQ o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -1570,11 +1570,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ICMPGE(final IF_ICMPGE o){ - if (stack().peek() != Type.INT){ + public void visitIF_ICMPGE(final IF_ICMPGE o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -1583,11 +1583,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ICMPGT(final IF_ICMPGT o){ - if (stack().peek() != Type.INT){ + public void visitIF_ICMPGT(final IF_ICMPGT o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -1596,11 +1596,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ICMPLE(final IF_ICMPLE o){ - if (stack().peek() != Type.INT){ + public void visitIF_ICMPLE(final IF_ICMPLE o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -1609,11 +1609,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ICMPLT(final IF_ICMPLT o){ - if (stack().peek() != Type.INT){ + public void visitIF_ICMPLT(final IF_ICMPLT o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -1622,11 +1622,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIF_ICMPNE(final IF_ICMPNE o){ - if (stack().peek() != Type.INT){ + public void visitIF_ICMPNE(final IF_ICMPNE o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -1635,8 +1635,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFEQ(final IFEQ o){ - if (stack().peek() != Type.INT){ + public void visitIFEQ(final IFEQ o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1645,8 +1645,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFGE(final IFGE o){ - if (stack().peek() != Type.INT){ + public void visitIFGE(final IFGE o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1655,8 +1655,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFGT(final IFGT o){ - if (stack().peek() != Type.INT){ + public void visitIFGT(final IFGT o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1665,8 +1665,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFLE(final IFLE o){ - if (stack().peek() != Type.INT){ + public void visitIFLE(final IFLE o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1675,8 +1675,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFLT(final IFLT o){ - if (stack().peek() != Type.INT){ + public void visitIFLT(final IFLT o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1685,8 +1685,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFNE(final IFNE o){ - if (stack().peek() != Type.INT){ + public void visitIFNE(final IFNE o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1695,8 +1695,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFNONNULL(final IFNONNULL o){ - if (!(stack().peek() instanceof ReferenceType)){ + public void visitIFNONNULL(final IFNONNULL o) { + if (!(stack().peek() instanceof ReferenceType)) { constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); } referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); @@ -1706,8 +1706,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIFNULL(final IFNULL o){ - if (!(stack().peek() instanceof ReferenceType)){ + public void visitIFNULL(final IFNULL o) { + if (!(stack().peek() instanceof ReferenceType)) { constraintViolated(o, "The value at the stack top is not of a ReferenceType, but of type '"+stack().peek()+"'."); } referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); @@ -1717,9 +1717,9 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIINC(final IINC o){ + public void visitIINC(final IINC o) { // Mhhh. In BCEL, at this time "IINC" is not a LocalVariableInstruction. - if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ){ + if (locals().maxLocals() <= (o.getType(cpg).getSize()==1? o.getIndex() : o.getIndex()+1) ) { constraintViolated(o, "The 'index' is not a valid index into the local variable array."); } @@ -1730,7 +1730,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitILOAD(final ILOAD o){ + public void visitILOAD(final ILOAD o) { // All done by visitLocalVariableInstruction(), visitLoadInstruction() } @@ -1738,7 +1738,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIMPDEP1(final IMPDEP1 o){ + public void visitIMPDEP1(final IMPDEP1 o) { throw new AssertionViolatedException( "In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP1."); } @@ -1747,7 +1747,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIMPDEP2(final IMPDEP2 o){ + public void visitIMPDEP2(final IMPDEP2 o) { throw new AssertionViolatedException( "In this JustIce verification pass there should not occur an illegal instruction such as IMPDEP2."); } @@ -1756,11 +1756,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIMUL(final IMUL o){ - if (stack().peek() != Type.INT){ + public void visitIMUL(final IMUL o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -1769,8 +1769,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitINEG(final INEG o){ - if (stack().peek() != Type.INT){ + public void visitINEG(final INEG o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -1779,10 +1779,10 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitINSTANCEOF(final INSTANCEOF o){ + public void visitINSTANCEOF(final INSTANCEOF o) { // The objectref must be of type reference. Type objectref = stack().peek(0); - if (!(objectref instanceof ReferenceType)){ + if (!(objectref instanceof ReferenceType)) { constraintViolated(o, "The 'objectref' is not of a ReferenceType but of type "+objectref+"."); } //else{ @@ -1792,7 +1792,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ // current class (�3.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The runtime constant // pool item at the index must be a symbolic reference to a class, array, or interface type. Constant c = cpg.getConstant(o.getIndex()); - if (! (c instanceof ConstantClass)){ + if (! (c instanceof ConstantClass)) { constraintViolated(o, "The Constant at 'index' is not a ConstantClass, but '"+c+"'."); } } @@ -1802,7 +1802,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * @since 6.0 */ @Override - public void visitINVOKEDYNAMIC(final INVOKEDYNAMIC o){ + public void visitINVOKEDYNAMIC(final INVOKEDYNAMIC o) { throw new RuntimeException("INVOKEDYNAMIC instruction is not supported at this time"); } @@ -1810,11 +1810,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitINVOKEINTERFACE(final INVOKEINTERFACE o){ + public void visitINVOKEINTERFACE(final INVOKEINTERFACE o) { // Method is not native, otherwise pass 3 would not happen. int count = o.getCount(); - if (count == 0){ + if (count == 0) { constraintViolated(o, "The 'count' argument must not be 0."); } // It is a ConstantInterfaceMethodref, Pass 3a made it sure. @@ -1824,11 +1824,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). Type t = o.getType(cpg); - if (t instanceof ObjectType){ + if (t instanceof ObjectType) { String name = ((ObjectType)t).getClassName(); Verifier v = VerifierFactory.getVerifier( name ); VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + if (vr.getStatus() != VerificationResult.VERIFIED_OK) { constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); } } @@ -1837,22 +1837,22 @@ public class InstConstraintVisitor extends EmptyVisitor{ Type[] argtypes = o.getArgumentTypes(cpg); int nargs = argtypes.length; - for (int i=nargs-1; i>=0; i--){ + for (int i=nargs-1; i>=0; i--) { Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 Type fromDesc = argtypes[i]; if (fromDesc == Type.BOOLEAN || fromDesc == Type.BYTE || fromDesc == Type.CHAR || - fromDesc == Type.SHORT){ + fromDesc == Type.SHORT) { fromDesc = Type.INT; } - if (! fromStack.equals(fromDesc)){ - if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + if (! fromStack.equals(fromDesc)) { + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType) { ReferenceType rFromStack = (ReferenceType) fromStack; //ReferenceType rFromDesc = (ReferenceType) fromDesc; // TODO: This can only be checked when using Staerk-et-al's "set of object types" // instead of a "wider cast object type" created during verification. - //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + //if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ) { // constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+ // "' on the stack (which is not assignment compatible)."); //} @@ -1865,15 +1865,15 @@ public class InstConstraintVisitor extends EmptyVisitor{ } Type objref = stack().peek(nargs); - if (objref == Type.NULL){ + if (objref == Type.NULL) { return; } - if (! (objref instanceof ReferenceType) ){ + if (! (objref instanceof ReferenceType) ) { constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); } referenceTypeIsInitialized(o, (ReferenceType) objref); - if (!(objref instanceof ObjectType)){ - if (!(objref instanceof ArrayType)){ // could be a ReturnaddressType + if (!(objref instanceof ObjectType)) { + if (!(objref instanceof ArrayType)) { // could be a ReturnaddressType constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); } else{ @@ -1885,15 +1885,15 @@ public class InstConstraintVisitor extends EmptyVisitor{ // String theInterface = o.getClassName(cpg); // TODO: This can only be checked if we're using Staerk-et-al's "set of object types" // instead of "wider cast object types" generated during verification. - //if ( ! Repository.implementationOf(objref_classname, theInterface) ){ + //if ( ! Repository.implementationOf(objref_classname, theInterface) ) { // constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theInterface+"' as expected."); //} int counted_count = 1; // 1 for the objectref - for (int i=0; i=0; i--){ + for (int i=nargs-1; i>=0; i--) { Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 Type fromDesc = argtypes[i]; if (fromDesc == Type.BOOLEAN || fromDesc == Type.BYTE || fromDesc == Type.CHAR || - fromDesc == Type.SHORT){ + fromDesc == Type.SHORT) { fromDesc = Type.INT; } - if (! fromStack.equals(fromDesc)){ - if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + if (! fromStack.equals(fromDesc)) { + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType) { ReferenceType rFromStack = (ReferenceType) fromStack; ReferenceType rFromDesc = (ReferenceType) fromDesc; // TODO: This can only be checked using Staerk-et-al's "set of object types", not // using a "wider cast object type". - if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ) { constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+ "' on the stack (which is not assignment compatible)."); } @@ -1957,17 +1957,17 @@ public class InstConstraintVisitor extends EmptyVisitor{ } Type objref = stack().peek(nargs); - if (objref == Type.NULL){ + if (objref == Type.NULL) { return; } - if (! (objref instanceof ReferenceType) ){ + if (! (objref instanceof ReferenceType) ) { constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); } String objref_classname = null; - if ( !(o.getMethodName(cpg).equals(Const.CONSTRUCTOR_NAME))){ + if ( !(o.getMethodName(cpg).equals(Const.CONSTRUCTOR_NAME))) { referenceTypeIsInitialized(o, (ReferenceType) objref); - if (!(objref instanceof ObjectType)){ - if (!(objref instanceof ArrayType)){ // could be a ReturnaddressType + if (!(objref instanceof ObjectType)) { + if (!(objref instanceof ArrayType)) { // could be a ReturnaddressType constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); } else{ @@ -1978,7 +1978,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ objref_classname = ((ObjectType) objref).getClassName(); } else{ - if (!(objref instanceof UninitializedObjectType)){ + if (!(objref instanceof UninitializedObjectType)) { constraintViolated(o, "Expecting an UninitializedObjectType as 'objectref' on the stack, not a '"+objref+ "'. Otherwise, you couldn't invoke a method since an array has no methods (not to speak of a return address)."); } @@ -1987,7 +1987,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ String theClass = o.getClassName(cpg); - if ( ! Repository.instanceOf(objref_classname, theClass) ){ + if ( ! Repository.instanceOf(objref_classname, theClass) ) { constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); } @@ -2001,16 +2001,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitINVOKESTATIC(final INVOKESTATIC o){ + public void visitINVOKESTATIC(final INVOKESTATIC o) { try { // Method is not native, otherwise pass 3 would not happen. Type t = o.getType(cpg); - if (t instanceof ObjectType){ + if (t instanceof ObjectType) { String name = ((ObjectType)t).getClassName(); Verifier v = VerifierFactory.getVerifier( name ); VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + if (vr.getStatus() != VerificationResult.VERIFIED_OK) { constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); } } @@ -2018,22 +2018,22 @@ public class InstConstraintVisitor extends EmptyVisitor{ Type[] argtypes = o.getArgumentTypes(cpg); int nargs = argtypes.length; - for (int i=nargs-1; i>=0; i--){ + for (int i=nargs-1; i>=0; i--) { Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 Type fromDesc = argtypes[i]; if (fromDesc == Type.BOOLEAN || fromDesc == Type.BYTE || fromDesc == Type.CHAR || - fromDesc == Type.SHORT){ + fromDesc == Type.SHORT) { fromDesc = Type.INT; } - if (! fromStack.equals(fromDesc)){ - if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + if (! fromStack.equals(fromDesc)) { + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType) { ReferenceType rFromStack = (ReferenceType) fromStack; ReferenceType rFromDesc = (ReferenceType) fromDesc; // TODO: This check can possibly only be done using Staerk-et-al's "set of object types" // instead of a "wider cast object type" created during verification. - if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ) { constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+ "' on the stack (which is not assignment compatible)."); } @@ -2054,16 +2054,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitINVOKEVIRTUAL(final INVOKEVIRTUAL o){ + public void visitINVOKEVIRTUAL(final INVOKEVIRTUAL o) { try { // the o.getClassType(cpg) type has passed pass 2; see visitLoadClass(o). Type t = o.getType(cpg); - if (t instanceof ObjectType){ + if (t instanceof ObjectType) { String name = ((ObjectType)t).getClassName(); Verifier v = VerifierFactory.getVerifier( name ); VerificationResult vr = v.doPass2(); - if (vr.getStatus() != VerificationResult.VERIFIED_OK){ + if (vr.getStatus() != VerificationResult.VERIFIED_OK) { constraintViolated(o, "Class '"+name+"' is referenced, but cannot be loaded and resolved: '"+vr+"'."); } } @@ -2072,22 +2072,22 @@ public class InstConstraintVisitor extends EmptyVisitor{ Type[] argtypes = o.getArgumentTypes(cpg); int nargs = argtypes.length; - for (int i=nargs-1; i>=0; i--){ + for (int i=nargs-1; i>=0; i--) { Type fromStack = stack().peek( (nargs-1) - i ); // 0 to nargs-1 Type fromDesc = argtypes[i]; if (fromDesc == Type.BOOLEAN || fromDesc == Type.BYTE || fromDesc == Type.CHAR || - fromDesc == Type.SHORT){ + fromDesc == Type.SHORT) { fromDesc = Type.INT; } - if (! fromStack.equals(fromDesc)){ - if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType){ + if (! fromStack.equals(fromDesc)) { + if (fromStack instanceof ReferenceType && fromDesc instanceof ReferenceType) { ReferenceType rFromStack = (ReferenceType) fromStack; ReferenceType rFromDesc = (ReferenceType) fromDesc; // TODO: This can possibly only be checked when using Staerk-et-al's "set of object types" instead // of a single "wider cast object type" created during verification. - if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ){ + if ( ! rFromStack.isAssignmentCompatibleWith(rFromDesc) ) { constraintViolated(o, "Expecting a '"+fromDesc+"' but found a '"+fromStack+ "' on the stack (which is not assignment compatible)."); } @@ -2100,15 +2100,15 @@ public class InstConstraintVisitor extends EmptyVisitor{ } Type objref = stack().peek(nargs); - if (objref == Type.NULL){ + if (objref == Type.NULL) { return; } - if (! (objref instanceof ReferenceType) ){ + if (! (objref instanceof ReferenceType) ) { constraintViolated(o, "Expecting a reference type as 'objectref' on the stack, not a '"+objref+"'."); } referenceTypeIsInitialized(o, (ReferenceType) objref); - if (!(objref instanceof ObjectType)){ - if (!(objref instanceof ArrayType)){ // could be a ReturnaddressType + if (!(objref instanceof ObjectType)) { + if (!(objref instanceof ArrayType)) { // could be a ReturnaddressType constraintViolated(o, "Expecting an ObjectType as 'objectref' on the stack, not a '"+objref+"'."); } else{ @@ -2120,7 +2120,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ String theClass = o.getClassName(cpg); - if ( ! Repository.instanceOf(objref_classname, theClass) ){ + if ( ! Repository.instanceOf(objref_classname, theClass) ) { constraintViolated(o, "The 'objref' item '"+objref+"' does not implement '"+theClass+"' as expected."); } } catch (ClassNotFoundException e) { @@ -2133,11 +2133,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIOR(final IOR o){ - if (stack().peek() != Type.INT){ + public void visitIOR(final IOR o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -2146,11 +2146,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIREM(final IREM o){ - if (stack().peek() != Type.INT){ + public void visitIREM(final IREM o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -2159,8 +2159,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIRETURN(final IRETURN o){ - if (stack().peek() != Type.INT){ + public void visitIRETURN(final IRETURN o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } } @@ -2169,11 +2169,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitISHL(final ISHL o){ - if (stack().peek() != Type.INT){ + public void visitISHL(final ISHL o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -2182,11 +2182,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitISHR(final ISHR o){ - if (stack().peek() != Type.INT){ + public void visitISHR(final ISHR o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -2195,7 +2195,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitISTORE(final ISTORE o){ + public void visitISTORE(final ISTORE o) { //visitStoreInstruction(StoreInstruction) is called before. // Nothing else needs to be done here. @@ -2205,11 +2205,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitISUB(final ISUB o){ - if (stack().peek() != Type.INT){ + public void visitISUB(final ISUB o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -2218,11 +2218,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIUSHR(final IUSHR o){ - if (stack().peek() != Type.INT){ + public void visitIUSHR(final IUSHR o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -2231,11 +2231,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitIXOR(final IXOR o){ - if (stack().peek() != Type.INT){ + public void visitIXOR(final IXOR o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.INT){ + if (stack().peek(1) != Type.INT) { constraintViolated(o, "The value at the stack next-to-top is not of type 'int', but of type '"+stack().peek(1)+"'."); } } @@ -2244,7 +2244,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitJSR(final JSR o){ + public void visitJSR(final JSR o) { // nothing to do here. } @@ -2252,7 +2252,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitJSR_W(final JSR_W o){ + public void visitJSR_W(final JSR_W o) { // nothing to do here. } @@ -2260,8 +2260,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitL2D(final L2D o){ - if (stack().peek() != Type.LONG){ + public void visitL2D(final L2D o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } } @@ -2270,8 +2270,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitL2F(final L2F o){ - if (stack().peek() != Type.LONG){ + public void visitL2F(final L2F o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } } @@ -2280,8 +2280,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitL2I(final L2I o){ - if (stack().peek() != Type.LONG){ + public void visitL2I(final L2I o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } } @@ -2290,11 +2290,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLADD(final LADD o){ - if (stack().peek() != Type.LONG){ + public void visitLADD(final LADD o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.LONG){ + if (stack().peek(1) != Type.LONG) { constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); } } @@ -2303,16 +2303,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLALOAD(final LALOAD o){ + public void visitLALOAD(final LALOAD o) { indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ + if (stack().peek(1) == Type.NULL) { return; } - if (! (stack().peek(1) instanceof ArrayType)){ + if (! (stack().peek(1) instanceof ArrayType)) { constraintViolated(o, "Stack next-to-top must be of type long[] but is '"+stack().peek(1)+"'."); } Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.LONG){ + if (t != Type.LONG) { constraintViolated(o, "Stack next-to-top must be of type long[] but is '"+stack().peek(1)+"'."); } } @@ -2321,11 +2321,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLAND(final LAND o){ - if (stack().peek() != Type.LONG){ + public void visitLAND(final LAND o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.LONG){ + if (stack().peek(1) != Type.LONG) { constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); } } @@ -2334,19 +2334,19 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLASTORE(final LASTORE o){ - if (stack().peek() != Type.LONG){ + public void visitLASTORE(final LASTORE o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ + if (stack().peek(2) == Type.NULL) { return; } - if (! (stack().peek(2) instanceof ArrayType)){ + if (! (stack().peek(2) instanceof ArrayType)) { constraintViolated(o, "Stack next-to-next-to-top must be of type long[] but is '"+stack().peek(2)+"'."); } Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.LONG){ + if (t != Type.LONG) { constraintViolated(o, "Stack next-to-next-to-top must be of type long[] but is '"+stack().peek(2)+"'."); } } @@ -2355,11 +2355,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLCMP(final LCMP o){ - if (stack().peek() != Type.LONG){ + public void visitLCMP(final LCMP o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.LONG){ + if (stack().peek(1) != Type.LONG) { constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); } } @@ -2368,7 +2368,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLCONST(final LCONST o){ + public void visitLCONST(final LCONST o) { // Nothing to do here. } @@ -2376,14 +2376,14 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLDC(final LDC o){ + public void visitLDC(final LDC o) { // visitCPInstruction is called first. Constant c = cpg.getConstant(o.getIndex()); if (! ( ( c instanceof ConstantInteger) || ( c instanceof ConstantFloat ) || ( c instanceof ConstantString ) || - ( c instanceof ConstantClass ) ) ){ + ( c instanceof ConstantClass ) ) ) { constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float, a CONSTANT_String or a CONSTANT_Class, but is '"+ c + "'."); @@ -2393,14 +2393,14 @@ public class InstConstraintVisitor extends EmptyVisitor{ /** * Ensures the specific preconditions of the said instruction. */ - public void visitLDC_W(final LDC_W o){ + public void visitLDC_W(final LDC_W o) { // visitCPInstruction is called first. Constant c = cpg.getConstant(o.getIndex()); if (! ( ( c instanceof ConstantInteger) || ( c instanceof ConstantFloat ) || ( c instanceof ConstantString ) || - ( c instanceof ConstantClass ) ) ){ + ( c instanceof ConstantClass ) ) ) { constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float, a CONSTANT_String or a CONSTANT_Class, but is '"+ c + "'."); @@ -2411,12 +2411,12 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLDC2_W(final LDC2_W o){ + public void visitLDC2_W(final LDC2_W o) { // visitCPInstruction is called first. Constant c = cpg.getConstant(o.getIndex()); if (! ( ( c instanceof ConstantLong) || - ( c instanceof ConstantDouble ) ) ){ + ( c instanceof ConstantDouble ) ) ) { constraintViolated(o, "Referenced constant should be a CONSTANT_Integer, a CONSTANT_Float or a CONSTANT_String, but is '"+c+"'."); } @@ -2426,11 +2426,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLDIV(final LDIV o){ - if (stack().peek() != Type.LONG){ + public void visitLDIV(final LDIV o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.LONG){ + if (stack().peek(1) != Type.LONG) { constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); } } @@ -2439,7 +2439,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLLOAD(final LLOAD o){ + public void visitLLOAD(final LLOAD o) { //visitLoadInstruction(LoadInstruction) is called before. // Nothing else needs to be done here. @@ -2449,11 +2449,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLMUL(final LMUL o){ - if (stack().peek() != Type.LONG){ + public void visitLMUL(final LMUL o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.LONG){ + if (stack().peek(1) != Type.LONG) { constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); } } @@ -2462,8 +2462,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLNEG(final LNEG o){ - if (stack().peek() != Type.LONG){ + public void visitLNEG(final LNEG o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } } @@ -2472,8 +2472,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLOOKUPSWITCH(final LOOKUPSWITCH o){ - if (stack().peek() != Type.INT){ + public void visitLOOKUPSWITCH(final LOOKUPSWITCH o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } // See also pass 3a. @@ -2483,11 +2483,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLOR(final LOR o){ - if (stack().peek() != Type.LONG){ + public void visitLOR(final LOR o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.LONG){ + if (stack().peek(1) != Type.LONG) { constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); } } @@ -2496,11 +2496,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLREM(final LREM o){ - if (stack().peek() != Type.LONG){ + public void visitLREM(final LREM o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.LONG){ + if (stack().peek(1) != Type.LONG) { constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); } } @@ -2509,8 +2509,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLRETURN(final LRETURN o){ - if (stack().peek() != Type.LONG){ + public void visitLRETURN(final LRETURN o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } } @@ -2519,11 +2519,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLSHL(final LSHL o){ - if (stack().peek() != Type.INT){ + public void visitLSHL(final LSHL o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.LONG){ + if (stack().peek(1) != Type.LONG) { constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); } } @@ -2532,11 +2532,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLSHR(final LSHR o){ - if (stack().peek() != Type.INT){ + public void visitLSHR(final LSHR o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.LONG){ + if (stack().peek(1) != Type.LONG) { constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); } } @@ -2545,7 +2545,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLSTORE(final LSTORE o){ + public void visitLSTORE(final LSTORE o) { //visitStoreInstruction(StoreInstruction) is called before. // Nothing else needs to be done here. @@ -2555,11 +2555,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLSUB(final LSUB o){ - if (stack().peek() != Type.LONG){ + public void visitLSUB(final LSUB o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.LONG){ + if (stack().peek(1) != Type.LONG) { constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); } } @@ -2568,11 +2568,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLUSHR(final LUSHR o){ - if (stack().peek() != Type.INT){ + public void visitLUSHR(final LUSHR o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.LONG){ + if (stack().peek(1) != Type.LONG) { constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); } } @@ -2581,11 +2581,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitLXOR(final LXOR o){ - if (stack().peek() != Type.LONG){ + public void visitLXOR(final LXOR o) { + if (stack().peek() != Type.LONG) { constraintViolated(o, "The value at the stack top is not of type 'long', but of type '"+stack().peek()+"'."); } - if (stack().peek(1) != Type.LONG){ + if (stack().peek(1) != Type.LONG) { constraintViolated(o, "The value at the stack next-to-top is not of type 'long', but of type '"+stack().peek(1)+"'."); } } @@ -2594,8 +2594,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitMONITORENTER(final MONITORENTER o){ - if (! ((stack().peek()) instanceof ReferenceType)){ + public void visitMONITORENTER(final MONITORENTER o) { + if (! ((stack().peek()) instanceof ReferenceType)) { constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); } //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); @@ -2605,8 +2605,8 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitMONITOREXIT(final MONITOREXIT o){ - if (! ((stack().peek()) instanceof ReferenceType)){ + public void visitMONITOREXIT(final MONITOREXIT o) { + if (! ((stack().peek()) instanceof ReferenceType)) { constraintViolated(o, "The stack top should be of a ReferenceType, but is '"+stack().peek()+"'."); } //referenceTypeIsInitialized(o, (ReferenceType) (stack().peek()) ); @@ -2616,11 +2616,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitMULTIANEWARRAY(final MULTIANEWARRAY o){ + public void visitMULTIANEWARRAY(final MULTIANEWARRAY o) { int dimensions = o.getDimensions(); // Dimensions argument is okay: see Pass 3a. - for (int i=0; i method + public void visitRETURN(final RETURN o) { + if (mg.getName().equals(Const.CONSTRUCTOR_NAME)) {// If we leave an method if ((Frame.getThis() != null) && (!(mg.getClassName().equals(Type.OBJECT.getClassName()))) ) { constraintViolated(o, "Leaving a constructor that itself did not call a constructor."); } @@ -2892,16 +2892,16 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitSALOAD(final SALOAD o){ + public void visitSALOAD(final SALOAD o) { indexOfInt(o, stack().peek()); - if (stack().peek(1) == Type.NULL){ + if (stack().peek(1) == Type.NULL) { return; } - if (! (stack().peek(1) instanceof ArrayType)){ + if (! (stack().peek(1) instanceof ArrayType)) { constraintViolated(o, "Stack next-to-top must be of type short[] but is '"+stack().peek(1)+"'."); } Type t = ((ArrayType) (stack().peek(1))).getBasicType(); - if (t != Type.SHORT){ + if (t != Type.SHORT) { constraintViolated(o, "Stack next-to-top must be of type short[] but is '"+stack().peek(1)+"'."); } } @@ -2910,19 +2910,19 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitSASTORE(final SASTORE o){ - if (stack().peek() != Type.INT){ + public void visitSASTORE(final SASTORE o) { + if (stack().peek() != Type.INT) { constraintViolated(o, "The value at the stack top is not of type 'int', but of type '"+stack().peek()+"'."); } indexOfInt(o, stack().peek(1)); - if (stack().peek(2) == Type.NULL){ + if (stack().peek(2) == Type.NULL) { return; } - if (! (stack().peek(2) instanceof ArrayType)){ + if (! (stack().peek(2) instanceof ArrayType)) { constraintViolated(o, "Stack next-to-next-to-top must be of type short[] but is '"+stack().peek(2)+"'."); } Type t = ((ArrayType) (stack().peek(2))).getBasicType(); - if (t != Type.SHORT){ + if (t != Type.SHORT) { constraintViolated(o, "Stack next-to-next-to-top must be of type short[] but is '"+stack().peek(2)+"'."); } } @@ -2931,7 +2931,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitSIPUSH(final SIPUSH o){ + public void visitSIPUSH(final SIPUSH o) { // nothing to do here. Generic visitXXX() methods did the trick before. } @@ -2939,11 +2939,11 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitSWAP(final SWAP o){ - if (stack().peek().getSize() != 1){ + public void visitSWAP(final SWAP o) { + if (stack().peek().getSize() != 1) { constraintViolated(o, "The value at the stack top is not of size '1', but of size '"+stack().peek().getSize()+"'."); } - if (stack().peek(1).getSize() != 1){ + if (stack().peek(1).getSize() != 1) { constraintViolated(o, "The value at the stack next-to-top is not of size '1', but of size '"+stack().peek(1).getSize()+"'."); } @@ -2953,7 +2953,7 @@ public class InstConstraintVisitor extends EmptyVisitor{ * Ensures the specific preconditions of the said instruction. */ @Override - public void visitTABLESWITCH(final TABLESWITCH o){ + public void visitTABLESWITCH(final TABLESWITCH o) { indexOfInt(o, stack().peek()); // See Pass 3a. } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java index 015dfeec..95c562a2 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java @@ -36,9 +36,9 @@ public class LocalVariables implements Cloneable { /** * Creates a new LocalVariables object. */ - public LocalVariables(final int maxLocals){ + public LocalVariables(final int maxLocals) { locals = new Type[maxLocals]; - for (int i=0; i clone = (ArrayList) this.stack.clone(); @@ -73,7 +73,7 @@ public class OperandStack implements Cloneable { /** * Clears the stack. */ - public void clear(){ + public void clear() { stack = new ArrayList<>(); } @@ -88,7 +88,7 @@ public class OperandStack implements Cloneable { * objects on the stacks. */ @Override - public boolean equals(final Object o){ + public boolean equals(final Object o) { if (!(o instanceof OperandStack)) { return false; } @@ -101,28 +101,28 @@ public class OperandStack implements Cloneable { * * @see #clone() */ - public OperandStack getClone(){ + public OperandStack getClone() { return (OperandStack) this.clone(); } /** * Returns true IFF this OperandStack is empty. */ - public boolean isEmpty(){ + public boolean isEmpty() { return stack.isEmpty(); } /** * Returns the number of stack slots this stack can hold. */ - public int maxStack(){ + public int maxStack() { return this.maxStack; } /** * Returns the element on top of the stack. The element is not popped off the stack! */ - public Type peek(){ + public Type peek() { return peek(0); } @@ -130,14 +130,14 @@ public class OperandStack implements Cloneable { * Returns the element that's i elements below the top element; that means, * iff i==0 the top element is returned. The element is not popped off the stack! */ - public Type peek(final int i){ + public Type peek(final int i) { return stack.get(size()-i-1); } /** * Returns the element on top of the stack. The element is popped off the stack. */ - public Type pop(){ + public Type pop() { Type e = stack.remove(size()-1); return e; } @@ -145,8 +145,8 @@ public class OperandStack implements Cloneable { /** * Pops i elements off the stack. ALWAYS RETURNS "null"!!! */ - public Type pop(final int i){ - for (int j=0; j= maxStack){ + if (slotsUsed() >= maxStack) { throw new AssertionViolatedException( "OperandStack too small, should have thrown proper Exception elsewhere. Stack: "+this); } @@ -172,7 +172,7 @@ public class OperandStack implements Cloneable { /** * Returns the size of this OperandStack; that means, how many Type objects there are. */ - public int size(){ + public int size() { return stack.size(); } @@ -180,13 +180,13 @@ public class OperandStack implements Cloneable { * Returns the number of stack slots used. * @see #maxStack() */ - public int slotsUsed(){ + public int slotsUsed() { /* XXX change this to a better implementation using a variable that keeps track of the actual slotsUsed()-value monitoring all push()es and pop()s. */ int slots = 0; - for (int i=0; i ics = new Vector<>(); private final List> ecs = new Vector<>(); - public void add(final InstructionContext ic, final ArrayList executionChain){ + public void add(final InstructionContext ic, final ArrayList executionChain) { ics.add(ic); ecs.add(executionChain); } - public boolean isEmpty(){ + public boolean isEmpty() { return ics.isEmpty(); } - public void remove(final int i){ + public void remove(final int i) { ics.remove(i); ecs.remove(i); } - public InstructionContext getIC(final int i){ + public InstructionContext getIC(final int i) { return ics.get(i); } - public ArrayList getEC(final int i){ + public ArrayList getEC(final int i) { return ecs.get(i); } - public int size(){ + public int size() { return ics.size(); } } // end Inner Class InstructionContextQueue @@ -114,7 +114,7 @@ public final class Pass3bVerifier extends PassVerifier{ * * @see org.apache.bcel.verifier.Verifier */ - public Pass3bVerifier(final Verifier owner, final int method_no){ + public Pass3bVerifier(final Verifier owner, final int method_no) { myOwner = owner; this.method_no = method_no; } @@ -127,7 +127,7 @@ public final class Pass3bVerifier extends PassVerifier{ * fix point of frame merging. */ private void circulationPump(final MethodGen m,final ControlFlowGraph cfg, final InstructionContext start, - final Frame vanillaFrame, final InstConstraintVisitor icv, final ExecutionVisitor ev){ + final Frame vanillaFrame, final InstConstraintVisitor icv, final ExecutionVisitor ev) { final Random random = new Random(); InstructionContextQueue icq = new InstructionContextQueue(); @@ -137,10 +137,10 @@ public final class Pass3bVerifier extends PassVerifier{ icq.add(start, new ArrayList()); // LOOP! - while (!icq.isEmpty()){ + while (!icq.isEmpty()) { InstructionContext u; ArrayList ec; - if (!DEBUG){ + if (!DEBUG) { int r = random.nextInt(icq.size()); u = icq.getIC(r); ec = icq.getEC(r); @@ -158,7 +158,7 @@ public final class Pass3bVerifier extends PassVerifier{ ArrayList newchain = (ArrayList) (ec.clone()); newchain.add(u); - if ((u.getInstruction().getInstruction()) instanceof RET){ + if ((u.getInstruction().getInstruction()) instanceof RET) { //System.err.println(u); // We can only follow _one_ successor, the one after the // JSR that was recently executed. @@ -169,32 +169,32 @@ public final class Pass3bVerifier extends PassVerifier{ // Sanity check InstructionContext lastJSR = null; int skip_jsr = 0; - for (int ss=oldchain.size()-1; ss >= 0; ss--){ - if (skip_jsr < 0){ + for (int ss=oldchain.size()-1; ss >= 0; ss--) { + if (skip_jsr < 0) { throw new AssertionViolatedException("More RET than JSR in execution chain?!"); } //System.err.println("+"+oldchain.get(ss)); - if ((oldchain.get(ss)).getInstruction().getInstruction() instanceof JsrInstruction){ - if (skip_jsr == 0){ + if ((oldchain.get(ss)).getInstruction().getInstruction() instanceof JsrInstruction) { + if (skip_jsr == 0) { lastJSR = oldchain.get(ss); break; } skip_jsr--; } - if ((oldchain.get(ss)).getInstruction().getInstruction() instanceof RET){ + if ((oldchain.get(ss)).getInstruction().getInstruction() instanceof RET) { skip_jsr++; } } - if (lastJSR == null){ + if (lastJSR == null) { throw new AssertionViolatedException("RET without a JSR before in ExecutionChain?! EC: '"+oldchain+"'."); } JsrInstruction jsr = (JsrInstruction) (lastJSR.getInstruction().getInstruction()); - if ( theSuccessor != (cfg.contextOf(jsr.physicalSuccessor())) ){ + if ( theSuccessor != (cfg.contextOf(jsr.physicalSuccessor())) ) { throw new AssertionViolatedException("RET '"+u.getInstruction()+"' info inconsistent: jump back to '"+ theSuccessor+"' or '"+cfg.contextOf(jsr.physicalSuccessor())+"'?"); } - if (theSuccessor.execute(u.getOutFrame(oldchain), newchain, icv, ev)){ + if (theSuccessor.execute(u.getOutFrame(oldchain), newchain, icv, ev)) { @SuppressWarnings("unchecked") // newchain is already of type ArrayList ArrayList newchainClone = (ArrayList) newchain.clone(); icq.add(theSuccessor, newchainClone); @@ -205,7 +205,7 @@ public final class Pass3bVerifier extends PassVerifier{ // Normal successors. Add them to the queue of successors. InstructionContext[] succs = u.getSuccessors(); for (InstructionContext v : succs) { - if (v.execute(u.getOutFrame(oldchain), newchain, icv, ev)){ + if (v.execute(u.getOutFrame(oldchain), newchain, icv, ev)) { @SuppressWarnings("unchecked") // newchain is already of type ArrayList ArrayList newchainClone = (ArrayList) newchain.clone(); icq.add(v, newchainClone); @@ -228,12 +228,12 @@ public final class Pass3bVerifier extends PassVerifier{ // by using an empty chain for the exception handlers. //if (v.execute(new Frame(u.getOutFrame(oldchain).getLocals(), // new OperandStack (u.getOutFrame().getStack().maxStack(), - // (exc_hds[s].getExceptionType()==null? Type.THROWABLE : exc_hds[s].getExceptionType())) ), newchain), icv, ev){ + // (exc_hds[s].getExceptionType()==null? Type.THROWABLE : exc_hds[s].getExceptionType())) ), newchain), icv, ev) { //icq.add(v, (ArrayList) newchain.clone()); if (v.execute(new Frame(u.getOutFrame(oldchain).getLocals(), new OperandStack (u.getOutFrame(oldchain).getStack().maxStack(), exc_hd.getExceptionType()==null? Type.THROWABLE : exc_hd.getExceptionType())), - new ArrayList(), icv, ev)){ + new ArrayList(), icv, ev)) { icq.add(v, new ArrayList()); } } @@ -248,15 +248,15 @@ public final class Pass3bVerifier extends PassVerifier{ // Maybe some maniac returns from a method when in a subroutine? Frame f = ic.getOutFrame(new ArrayList()); LocalVariables lvs = f.getLocals(); - for (int i=0; i s = new HashSet<>(); int[] lvs = getAccessedLocalsIndices(); for (int lv : lvs) { @@ -252,13 +252,13 @@ public class Subroutines{ * A recursive helper method for getRecursivelyAccessedLocalsIndices(). * @see #getRecursivelyAccessedLocalsIndices() */ - private void _getRecursivelyAccessedLocalsIndicesHelper(final Set s, final Subroutine[] subs){ + private void _getRecursivelyAccessedLocalsIndicesHelper(final Set s, final Subroutine[] subs) { for (Subroutine sub : subs) { int[] lvs = sub.getAccessedLocalsIndices(); for (int lv : lvs) { s.add(Integer.valueOf(lv)); } - if(sub.subSubs().length != 0){ + if(sub.subSubs().length != 0) { _getRecursivelyAccessedLocalsIndicesHelper(s, sub.subSubs()); } } @@ -268,31 +268,31 @@ public class Subroutines{ * Satisfies Subroutine.getAccessedLocalIndices(). */ @Override - public int[] getAccessedLocalsIndices(){ + public int[] getAccessedLocalsIndices() { //TODO: Implement caching. Set acc = new HashSet<>(); - if (theRET == null && this != getTopLevel()){ + if (theRET == null && this != getTopLevel()) { throw new AssertionViolatedException( "This subroutine object must be built up completely before calculating accessed locals."); } { for (InstructionHandle ih : instructions) { // RET is not a LocalVariableInstruction in the current version of BCEL. - if (ih.getInstruction() instanceof LocalVariableInstruction || ih.getInstruction() instanceof RET){ + if (ih.getInstruction() instanceof LocalVariableInstruction || ih.getInstruction() instanceof RET) { int idx = ((IndexedInstruction) (ih.getInstruction())).getIndex(); acc.add(Integer.valueOf(idx)); // LONG? DOUBLE?. try{ // LocalVariableInstruction instances are typed without the need to look into // the constant pool. - if (ih.getInstruction() instanceof LocalVariableInstruction){ + if (ih.getInstruction() instanceof LocalVariableInstruction) { int s = ((LocalVariableInstruction) ih.getInstruction()).getType(null).getSize(); if (s==2) { acc.add(Integer.valueOf(idx+1)); } } } - catch(RuntimeException re){ + catch(RuntimeException re) { throw new AssertionViolatedException("Oops. BCEL did not like NULL as a ConstantPoolGen object.", re); } } @@ -314,12 +314,12 @@ public class Subroutines{ * Satisfies Subroutine.subSubs(). */ @Override - public Subroutine[] subSubs(){ + public Subroutine[] subSubs() { Set h = new HashSet<>(); for (InstructionHandle ih : instructions) { Instruction inst = ih.getInstruction(); - if (inst instanceof JsrInstruction){ + if (inst instanceof JsrInstruction) { InstructionHandle targ = ((JsrInstruction) inst).getTarget(); h.add(getSubroutine(targ)); } @@ -334,8 +334,8 @@ public class Subroutines{ * This subroutine's RET operates on that same local variable * slot, of course. */ - void setLocalVariable(final int i){ - if (localVariable != UNSET){ + void setLocalVariable(final int i) { + if (localVariable != UNSET) { throw new AssertionViolatedException("localVariable set twice."); } localVariable = i; @@ -344,7 +344,7 @@ public class Subroutines{ /** * The default constructor. */ - public SubroutineImpl(){ + public SubroutineImpl() { } }// end Inner Class SubrouteImpl @@ -379,7 +379,7 @@ public class Subroutines{ * create the Subroutine objects of. * Assumes that JustIce strict checks are needed. */ - public Subroutines(final MethodGen mg){ + public Subroutines(final MethodGen mg) { this(mg, true); } @@ -390,7 +390,7 @@ public class Subroutines{ * @param enableJustIceCheck whether to enable additional JustIce checks * @since 6.0 */ - public Subroutines(final MethodGen mg, final boolean enableJustIceCheck){ + public Subroutines(final MethodGen mg, final boolean enableJustIceCheck) { InstructionHandle[] all = mg.getInstructionList().getInstructionHandles(); CodeExceptionGen[] handlers = mg.getExceptionHandlers(); @@ -401,7 +401,7 @@ public class Subroutines{ Set sub_leaders = new HashSet<>(); // Elements: InstructionHandle for (InstructionHandle element : all) { Instruction inst = element.getInstruction(); - if (inst instanceof JsrInstruction){ + if (inst instanceof JsrInstruction) { sub_leaders.add(((JsrInstruction) inst).getTarget()); } } @@ -424,7 +424,7 @@ public class Subroutines{ // disallowed and checked below, after the BFS. for (InstructionHandle element : all) { Instruction inst = element.getInstruction(); - if (inst instanceof JsrInstruction){ + if (inst instanceof JsrInstruction) { InstructionHandle leader = ((JsrInstruction) inst).getTarget(); ((SubroutineImpl) getSubroutine(leader)).addEnteringJsrInstruction(element); } @@ -457,7 +457,7 @@ public class Subroutines{ * [why top-level? * TODO: Refer to the special JustIce notion of subroutines.] */ - if (actual == all[0]){ + if (actual == all[0]) { for (CodeExceptionGen handler : handlers) { colors.put(handler.getHandlerPC(), ColourConstants.GRAY); Q.add(handler.getHandlerPC()); @@ -466,11 +466,11 @@ public class Subroutines{ /* CONTINUE NORMAL BFS ALGORITHM */ // Loop until Queue is empty - while (Q.size() != 0){ + while (Q.size() != 0) { InstructionHandle u = Q.remove(0); InstructionHandle[] successors = getSuccessors(u); for (InstructionHandle successor : successors) { - if (colors.get(successor) == ColourConstants.WHITE){ + if (colors.get(successor) == ColourConstants.WHITE) { colors.put(successor, ColourConstants.GRAY); Q.add(successor); } @@ -479,16 +479,16 @@ public class Subroutines{ } // BFS ended above. for (InstructionHandle element : all) { - if (colors.get(element) == ColourConstants.BLACK){ + if (colors.get(element) == ColourConstants.BLACK) { ((SubroutineImpl) (actual==all[0]?getTopLevel():getSubroutine(actual))).addInstruction(element); - if (instructions_assigned.contains(element)){ + if (instructions_assigned.contains(element)) { throw new StructuralCodeConstraintException("Instruction '"+element+ "' is part of more than one subroutine (or of the top level and a subroutine)."); } instructions_assigned.add(element); } } - if (actual != all[0]){// If we don't deal with the top-level 'subroutine' + if (actual != all[0]) {// If we don't deal with the top-level 'subroutine' ((SubroutineImpl) getSubroutine(actual)).setLeavingRET(); } } @@ -498,11 +498,11 @@ public class Subroutines{ // as is mandated by JustIces notion of subroutines. for (CodeExceptionGen handler : handlers) { InstructionHandle _protected = handler.getStartPC(); - while (_protected != handler.getEndPC().getNext()){ + while (_protected != handler.getEndPC().getNext()) { // Note the inclusive/inclusive notation of "generic API" exception handlers! for (Subroutine sub : subroutines.values()) { - if (sub != subroutines.get(all[0])){ // We don't want to forbid top-level exception handlers. - if (sub.contains(_protected)){ + if (sub != subroutines.get(all[0])) { // We don't want to forbid top-level exception handlers. + if (sub.contains(_protected)) { throw new StructuralCodeConstraintException("Subroutine instruction '"+_protected+ "' is protected by an exception handler, '"+handler+ "'. This is forbidden by the JustIce verifier due to its clear definition of subroutines."); @@ -535,13 +535,13 @@ public class Subroutines{ * * @throws StructuralCodeConstraintException if the above constraint is not satisfied. */ - private void noRecursiveCalls(final Subroutine sub, final Set set){ + private void noRecursiveCalls(final Subroutine sub, final Set set) { Subroutine[] subs = sub.subSubs(); for (Subroutine sub2 : subs) { int index = ((RET) (sub2.getLeavingRET().getInstruction())).getIndex(); - if (!set.add(Integer.valueOf(index))){ + if (!set.add(Integer.valueOf(index))) { // Don't use toString() here because of possibly infinite recursive subSubs() calls then. SubroutineImpl si = (SubroutineImpl) sub2; throw new StructuralCodeConstraintException("Subroutine with local variable '"+si.localVariable+"', JSRs '"+ @@ -564,15 +564,15 @@ public class Subroutines{ * * @see #getTopLevel() */ - public Subroutine getSubroutine(final InstructionHandle leader){ + public Subroutine getSubroutine(final InstructionHandle leader) { Subroutine ret = subroutines.get(leader); - if (ret == null){ + if (ret == null) { throw new AssertionViolatedException( "Subroutine requested for an InstructionHandle that is not a leader of a subroutine."); } - if (ret == TOPLEVEL){ + if (ret == TOPLEVEL) { throw new AssertionViolatedException("TOPLEVEL special subroutine requested; use getTopLevel()."); } @@ -590,7 +590,7 @@ public class Subroutines{ * @see #getSubroutine(InstructionHandle) * @see #getTopLevel() */ - public Subroutine subroutineOf(final InstructionHandle any){ + public Subroutine subroutineOf(final InstructionHandle any) { for (Subroutine s : subroutines.values()) { if (s.contains(any)) { return s; @@ -611,7 +611,7 @@ System.err.println("DEBUG: Please verify '"+any.toString(true)+"' lies in dead c * @see Subroutine#getEnteringJsrInstructions() * @see Subroutine#getLeavingRET() */ - public Subroutine getTopLevel(){ + public Subroutine getTopLevel() { return TOPLEVEL; } /** @@ -620,40 +620,40 @@ System.err.println("DEBUG: Please verify '"+any.toString(true)+"' lies in dead c * as defined here. A JsrInstruction has its physical successor as its successor * (opposed to its target) as defined here. */ - private static InstructionHandle[] getSuccessors(final InstructionHandle instruction){ + private static InstructionHandle[] getSuccessors(final InstructionHandle instruction) { final InstructionHandle[] empty = new InstructionHandle[0]; final InstructionHandle[] single = new InstructionHandle[1]; Instruction inst = instruction.getInstruction(); - if (inst instanceof RET){ + if (inst instanceof RET) { return empty; } // Terminates method normally. - if (inst instanceof ReturnInstruction){ + if (inst instanceof ReturnInstruction) { return empty; } // Terminates method abnormally, because JustIce mandates // subroutines not to be protected by exception handlers. - if (inst instanceof ATHROW){ + if (inst instanceof ATHROW) { return empty; } // See method comment. - if (inst instanceof JsrInstruction){ + if (inst instanceof JsrInstruction) { single[0] = instruction.getNext(); return single; } - if (inst instanceof GotoInstruction){ + if (inst instanceof GotoInstruction) { single[0] = ((GotoInstruction) inst).getTarget(); return single; } - if (inst instanceof BranchInstruction){ - if (inst instanceof Select){ + if (inst instanceof BranchInstruction) { + if (inst instanceof Select) { // BCEL's getTargets() returns only the non-default targets, // thanks to Eli Tilevich for reporting. InstructionHandle[] matchTargets = ((Select) inst).getTargets(); @@ -677,7 +677,7 @@ System.err.println("DEBUG: Please verify '"+any.toString(true)+"' lies in dead c * Returns a String representation of this object; merely for debugging puposes. */ @Override - public String toString(){ + public String toString() { return "---\n"+subroutines+"\n---\n"; } } diff --git a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java index 8c0c57b1..579c81e5 100644 --- a/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java +++ b/src/main/java/org/apache/bcel/verifier/structurals/UninitializedObjectType.java @@ -36,7 +36,7 @@ public class UninitializedObjectType extends ReferenceType implements Constants private final ObjectType initialized; /** Creates a new instance. */ - public UninitializedObjectType(final ObjectType t){ + public UninitializedObjectType(final ObjectType t) { super(Const.T_UNKNOWN, ""); initialized = t; } @@ -45,7 +45,7 @@ public class UninitializedObjectType extends ReferenceType implements Constants * Returns the ObjectType of the same class as the one of the uninitialized object * represented by this UninitializedObjectType instance. */ - public ObjectType getInitialized(){ + public ObjectType getInitialized() { return initialized; } @@ -61,7 +61,7 @@ public class UninitializedObjectType extends ReferenceType implements Constants * */ @Override - public boolean equals(final Object o){ + public boolean equals(final Object o) { if (! (o instanceof UninitializedObjectType)) { return false; } diff --git a/src/test/java/org/apache/bcel/AbstractTestCase.java b/src/test/java/org/apache/bcel/AbstractTestCase.java index a7e59cca..e1b9357c 100644 --- a/src/test/java/org/apache/bcel/AbstractTestCase.java +++ b/src/test/java/org/apache/bcel/AbstractTestCase.java @@ -99,7 +99,7 @@ public abstract class AbstractTestCase extends TestCase String[] files = testDir.list(); if (files == null || files.length == 0) { - if (!testDir.delete()){ + if (!testDir.delete()) { System.err.println("Failed to remove: " + testDir); } } else { diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArray01.java b/src/test/java/org/apache/bcel/verifier/tests/TestArray01.java index 16763cff..0dc9fb43 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestArray01.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestArray01.java @@ -21,7 +21,7 @@ import java.io.Serializable; public class TestArray01{ - public static Object test1(){ + public static Object test1() { String[] a = new String[4]; a[0] = ""; a.equals(null); @@ -31,24 +31,24 @@ public class TestArray01{ return a; } - public static void test2(final Object o){ + public static void test2(final Object o) { } - public static void test3(final Serializable o){ + public static void test3(final Serializable o) { } - public static void test4(final Cloneable o){ + public static void test4(final Cloneable o) { } - public static Serializable test5(){ + public static Serializable test5() { return new Object[1]; } - public static Cloneable test6(){ + public static Cloneable test6() { return new Object[1]; } - public static Object foo(final String s){ + public static Object foo(final String s) { return s; } } diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java index 25e2e31d..1b83eee2 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestArrayAccess01.java @@ -20,7 +20,7 @@ package org.apache.bcel.verifier.tests; public class TestArrayAccess01 extends XTestArray01{ - public static void test(){ + public static void test() { XTestArray01[] array = new TestArrayAccess01[1]; array[0] = new XTestArray01(); } diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java index daf38fdc..c1ed6aea 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeInterface01.java @@ -19,7 +19,7 @@ package org.apache.bcel.verifier.tests; public class TestLegalInvokeInterface01{ - public static void test1(final Interface01 t){ + public static void test1(final Interface01 t) { t.run(); } } diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java index c0f3a374..b6cb694d 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial01.java @@ -19,7 +19,7 @@ package org.apache.bcel.verifier.tests; public class TestLegalInvokeSpecial01{ - public static void test1(){ + public static void test1() { new TestLegalInvokeSpecial01().getClass(); } diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java index 3e610604..208c9e36 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeSpecial02.java @@ -19,8 +19,8 @@ package org.apache.bcel.verifier.tests; public abstract class TestLegalInvokeSpecial02 implements Runnable{ - public static void test1(final TestLegalInvokeSpecial02 t, final int i){ - if(i > 0){ + public static void test1(final TestLegalInvokeSpecial02 t, final int i) { + if(i > 0) { t.run(); } } diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java index 6e0f85e2..b0b6b23d 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual01.java @@ -19,7 +19,7 @@ package org.apache.bcel.verifier.tests; public class TestLegalInvokeVirtual01 { - public static void test1(){ + public static void test1() { new TestLegalInvokeVirtual01().toString(); } diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java index bd12854b..09a48342 100755 --- a/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestLegalInvokeVirtual02.java @@ -19,8 +19,8 @@ package org.apache.bcel.verifier.tests; public abstract class TestLegalInvokeVirtual02 implements Runnable{ - public static void test1(final TestLegalInvokeVirtual02 t, final int i){ - if(i > 0){ + public static void test1(final TestLegalInvokeVirtual02 t, final int i) { + if(i > 0) { t.run(); } } diff --git a/src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java b/src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java index cba5662e..47beb3ad 100644 --- a/src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java +++ b/src/test/java/org/apache/bcel/verifier/tests/TestReturn02.java @@ -23,43 +23,43 @@ public class TestReturn02 { return new String(data, offset, count); } - public static Object test2(){ + public static Object test2() { return new Object(); } - public static boolean test3(){ + public static boolean test3() { return true; } - public static byte test4(){ + public static byte test4() { return 1; } - public static short test5(){ + public static short test5() { return 1; } - public static char test6(){ + public static char test6() { return 'a'; } - public static int test7(){ + public static int test7() { return 1; } - public static long test8(){ + public static long test8() { return 1L; } - public static float test9(){ + public static float test9() { return 1.0f; } - public static double test10(){ + public static double test10() { return 1.0; } - public static Object test11(){ + public static Object test11() { return null; } } -- GitLab From e0522db412e3fce6e5f1e8b965a67c873b2251fe Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 21 Jun 2016 20:45:04 +0000 Subject: [PATCH 1207/1313] Formatting "for(" -> "for (". git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749601 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/java/org/apache/bcel/classfile/ClassParser.java | 2 +- src/main/java/org/apache/bcel/util/InstructionFinder.java | 2 +- .../java/org/apache/bcel/verifier/statics/Pass3aVerifier.java | 4 ++-- .../bcel/generic/GeneratingAnnotatedClassesTestCase.java | 4 ++-- .../java/org/apache/bcel/generic/JDKGenericDumpTestCase.java | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 923f1235..28eeb68a 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -155,7 +155,7 @@ public final class ClassParser { readAttributes(); // Check for unknown variables //Unknown[] u = Unknown.getUnknownAttributes(); - //for(int i=0; i < u.length; i++) + //for (int i=0; i < u.length; i++) // System.err.println("WARNING: " + u[i]); // Everything should have been read now // if(file.available() > 0) { diff --git a/src/main/java/org/apache/bcel/util/InstructionFinder.java b/src/main/java/org/apache/bcel/util/InstructionFinder.java index 2ad97346..0596e1df 100644 --- a/src/main/java/org/apache/bcel/util/InstructionFinder.java +++ b/src/main/java/org/apache/bcel/util/InstructionFinder.java @@ -50,7 +50,7 @@ import org.apache.bcel.generic.InstructionList; * InstructionFinder f = new InstructionFinder(il); * String pat = "IfInstruction ICONST_0 GOTO ICONST_1 NOP (IFEQ|IFNE)"; * - * for(Iterator i = f.search(pat, constraint); i.hasNext(); ) { + * for (Iterator i = f.search(pat, constraint); i.hasNext(); ) { * InstructionHandle[] match = (InstructionHandle[])i.next(); * ... * il.delete(match[1], match[5]); diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java index 74b6058a..46166fe0 100644 --- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java +++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java @@ -1170,7 +1170,7 @@ public final class Pass3aVerifier extends PassVerifier{ return m; } //method not found, look in super classes - for(JavaClass superclass : jc.getSuperClasses()) { + for (JavaClass superclass : jc.getSuperClasses()) { m = getMethod(superclass, invoke); if(m != null) { //method found in super class @@ -1178,7 +1178,7 @@ public final class Pass3aVerifier extends PassVerifier{ } } //method not found, look in super interfaces - for(JavaClass superclass : jc.getInterfaces()) { + for (JavaClass superclass : jc.getInterfaces()) { m = getMethod(superclass, invoke); if(m != null) { //method found in super interface diff --git a/src/test/java/org/apache/bcel/generic/GeneratingAnnotatedClassesTestCase.java b/src/test/java/org/apache/bcel/generic/GeneratingAnnotatedClassesTestCase.java index 94f094ad..324f67c0 100644 --- a/src/test/java/org/apache/bcel/generic/GeneratingAnnotatedClassesTestCase.java +++ b/src/test/java/org/apache/bcel/generic/GeneratingAnnotatedClassesTestCase.java @@ -258,7 +258,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase // check the three methods Method[] methods = cgen.getMethods(); assertEquals(3, methods.length); - for(Method method : methods) + for (Method method : methods) { String methodName= method.getName(); if(methodName.equals("")) @@ -308,7 +308,7 @@ public class GeneratingAnnotatedClassesTestCase extends AbstractTestCase assertEquals(methodName, expectedNumberOfParmeterAnnotations.length, parameterAnnotations.length); int i= 0; - for(ParameterAnnotationEntry parameterAnnotation : parameterAnnotations) + for (ParameterAnnotationEntry parameterAnnotation : parameterAnnotations) { AnnotationEntry[] annos= parameterAnnotation.getAnnotationEntries(); int expectedLength = expectedNumberOfParmeterAnnotations[i++]; diff --git a/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java b/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java index b9fbfaf2..bf9f18f7 100644 --- a/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java +++ b/src/test/java/org/apache/bcel/generic/JDKGenericDumpTestCase.java @@ -43,7 +43,7 @@ public class JDKGenericDumpTestCase { @Test public void testJDKjars() throws Exception { File[] jars = listJDKjars(); - for(File file : jars) { + for (File file : jars) { testJar(file); } } @@ -84,7 +84,7 @@ public class JDKGenericDumpTestCase { System.out.println(name + ": "+m.toString() +" "+ src.length+" "+out.length); System.out.println(bytesToHex(src)); System.out.println(bytesToHex(out)); - for(InstructionHandle ih : il) { + for (InstructionHandle ih : il) { System.out.println(ih.toString(false)); } fail("Array comparison failure"); -- GitLab From 7a28a2d05733714850bd7e51a98fc97c42e47103 Mon Sep 17 00:00:00 2001 From: "Gary D. Gregory" Date: Tue, 21 Jun 2016 20:50:19 +0000 Subject: [PATCH 1208/1313] Use final on local vars when possible (which already do on fields and parameters when possible.) git-svn-id: https://svn.apache.org/repos/asf/commons/proper/bcel/trunk@1749603 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/bcel/ExceptionConst.java | 4 +- src/main/java/org/apache/bcel/Repository.java | 8 +- .../bcel/classfile/AnnotationEntry.java | 10 +- .../apache/bcel/classfile/Annotations.java | 2 +- .../bcel/classfile/ArrayElementValue.java | 6 +- .../org/apache/bcel/classfile/Attribute.java | 14 +- .../bcel/classfile/BootstrapMethod.java | 6 +- .../bcel/classfile/BootstrapMethods.java | 8 +- .../bcel/classfile/ClassElementValue.java | 4 +- .../apache/bcel/classfile/ClassParser.java | 16 +- .../java/org/apache/bcel/classfile/Code.java | 24 +- .../apache/bcel/classfile/CodeException.java | 2 +- .../org/apache/bcel/classfile/Constant.java | 12 +- .../apache/bcel/classfile/ConstantClass.java | 2 +- .../apache/bcel/classfile/ConstantPool.java | 22 +- .../apache/bcel/classfile/ConstantString.java | 2 +- .../apache/bcel/classfile/ConstantValue.java | 2 +- .../org/apache/bcel/classfile/Deprecated.java | 2 +- .../bcel/classfile/DescendingVisitor.java | 52 ++-- .../apache/bcel/classfile/ElementValue.java | 6 +- .../bcel/classfile/ElementValuePair.java | 4 +- .../bcel/classfile/EnclosingMethod.java | 4 +- .../bcel/classfile/EnumElementValue.java | 6 +- .../apache/bcel/classfile/ExceptionTable.java | 10 +- .../java/org/apache/bcel/classfile/Field.java | 14 +- .../apache/bcel/classfile/FieldOrMethod.java | 6 +- .../org/apache/bcel/classfile/InnerClass.java | 2 +- .../apache/bcel/classfile/InnerClasses.java | 10 +- .../org/apache/bcel/classfile/JavaClass.java | 86 +++--- .../org/apache/bcel/classfile/LineNumber.java | 2 +- .../bcel/classfile/LineNumberTable.java | 16 +- .../apache/bcel/classfile/LocalVariable.java | 8 +- .../bcel/classfile/LocalVariableTable.java | 16 +- .../classfile/LocalVariableTypeTable.java | 10 +- .../org/apache/bcel/classfile/Method.java | 26 +- .../bcel/classfile/MethodParameter.java | 2 +- .../bcel/classfile/MethodParameters.java | 6 +- .../org/apache/bcel/classfile/PMGClass.java | 4 +- .../classfile/ParameterAnnotationEntry.java | 10 +- .../bcel/classfile/ParameterAnnotations.java | 4 +- .../org/apache/bcel/classfile/Signature.java | 10 +- .../bcel/classfile/SimpleElementValue.java | 38 +-- .../org/apache/bcel/classfile/SourceFile.java | 2 +- .../org/apache/bcel/classfile/StackMap.java | 10 +- .../apache/bcel/classfile/StackMapEntry.java | 22 +- .../apache/bcel/classfile/StackMapType.java | 2 +- .../org/apache/bcel/classfile/Synthetic.java | 4 +- .../org/apache/bcel/classfile/Unknown.java | 6 +- .../org/apache/bcel/classfile/Utility.java | 110 +++---- .../bcel/generic/AnnotationEntryGen.java | 60 ++-- .../bcel/generic/ArrayElementValueGen.java | 16 +- .../org/apache/bcel/generic/ArrayType.java | 6 +- .../org/apache/bcel/generic/BranchHandle.java | 4 +- .../bcel/generic/BranchInstruction.java | 4 +- .../apache/bcel/generic/CPInstruction.java | 4 +- .../bcel/generic/ClassElementValueGen.java | 2 +- .../org/apache/bcel/generic/ClassGen.java | 80 ++--- .../apache/bcel/generic/CodeExceptionGen.java | 2 +- .../apache/bcel/generic/ConstantPoolGen.java | 114 +++---- .../apache/bcel/generic/ElementValueGen.java | 6 +- .../bcel/generic/ElementValuePairGen.java | 2 +- .../bcel/generic/EnumElementValueGen.java | 2 +- .../org/apache/bcel/generic/FieldGen.java | 40 +-- .../bcel/generic/FieldGenOrMethodGen.java | 6 +- .../apache/bcel/generic/FieldOrMethod.java | 24 +- .../java/org/apache/bcel/generic/GOTO.java | 4 +- .../apache/bcel/generic/INVOKEDYNAMIC.java | 4 +- .../org/apache/bcel/generic/Instruction.java | 2 +- .../bcel/generic/InstructionFactory.java | 22 +- .../bcel/generic/InstructionHandle.java | 6 +- .../apache/bcel/generic/InstructionList.java | 126 ++++---- .../bcel/generic/InvokeInstruction.java | 8 +- .../java/org/apache/bcel/generic/JSR.java | 4 +- .../apache/bcel/generic/JsrInstruction.java | 2 +- .../java/org/apache/bcel/generic/LDC.java | 4 +- .../java/org/apache/bcel/generic/LDC2_W.java | 2 +- .../apache/bcel/generic/LineNumberGen.java | 2 +- .../apache/bcel/generic/LocalVariableGen.java | 8 +- .../org/apache/bcel/generic/MethodGen.java | 196 ++++++------ .../generic/NameSignatureInstruction.java | 12 +- .../org/apache/bcel/generic/ObjectType.java | 16 +- .../apache/bcel/generic/ReferenceType.java | 44 +-- .../bcel/generic/ReturnaddressType.java | 2 +- .../java/org/apache/bcel/generic/SWITCH.java | 12 +- .../java/org/apache/bcel/generic/Select.java | 12 +- .../bcel/generic/SimpleElementValueGen.java | 22 +- .../org/apache/bcel/generic/TABLESWITCH.java | 8 +- .../java/org/apache/bcel/generic/Type.java | 42 +-- .../org/apache/bcel/util/AttributeHTML.java | 30 +- .../org/apache/bcel/util/BCELFactory.java | 74 ++--- .../java/org/apache/bcel/util/BCELifier.java | 42 +-- .../java/org/apache/bcel/util/Class2HTML.java | 20 +- .../org/apache/bcel/util/ClassLoader.java | 20 +- .../bcel/util/ClassLoaderRepository.java | 6 +- .../java/org/apache/bcel/util/ClassPath.java | 68 ++--- .../apache/bcel/util/ClassPathRepository.java | 20 +- .../java/org/apache/bcel/util/ClassSet.java | 4 +- .../org/apache/bcel/util/ClassVector.java | 2 +- .../java/org/apache/bcel/util/CodeHTML.java | 78 ++--- .../org/apache/bcel/util/ConstantHTML.java | 46 +-- .../apache/bcel/util/InstructionFinder.java | 44 +-- .../org/apache/bcel/util/JavaWrapper.java | 20 +- .../MemorySensitiveClassPathRepository.java | 22 +- .../java/org/apache/bcel/util/MethodHTML.java | 24 +- .../bcel/verifier/GraphicalVerifier.java | 8 +- .../apache/bcel/verifier/NativeVerifier.java | 10 +- .../apache/bcel/verifier/TransitiveHull.java | 10 +- .../bcel/verifier/VerificationResult.java | 2 +- .../org/apache/bcel/verifier/Verifier.java | 42 +-- .../bcel/verifier/VerifierAppFrame.java | 32 +- .../apache/bcel/verifier/VerifierFactory.java | 4 +- .../verifier/VerifierFactoryListModel.java | 10 +- .../apache/bcel/verifier/VerifyDialog.java | 46 +-- .../exc/AssertionViolatedException.java | 2 +- .../org/apache/bcel/verifier/exc/Utility.java | 4 +- .../apache/bcel/verifier/statics/IntList.java | 4 +- .../bcel/verifier/statics/Pass1Verifier.java | 8 +- .../bcel/verifier/statics/Pass2Verifier.java | 226 +++++++------- .../bcel/verifier/statics/Pass3aVerifier.java | 278 +++++++++--------- .../statics/StringRepresentation.java | 2 +- .../structurals/ControlFlowGraph.java | 48 +-- .../structurals/ExceptionHandlers.java | 8 +- .../structurals/ExecutionVisitor.java | 56 ++-- .../bcel/verifier/structurals/Frame.java | 4 +- .../structurals/InstConstraintVisitor.java | 272 ++++++++--------- .../verifier/structurals/LocalVariables.java | 10 +- .../verifier/structurals/OperandStack.java | 10 +- .../verifier/structurals/Pass3bVerifier.java | 64 ++-- .../verifier/structurals/Subroutines.java | 114 +++---- .../org/apache/bcel/AbstractTestCase.java | 40 +-- .../AnnotationDefaultAttributeTestCase.java | 8 +- .../apache/bcel/AnonymousClassTestCase.java | 8 +- .../apache/bcel/ElementValueGenTestCase.java | 88 +++--- .../EnclosingMethodAttributeTestCase.java | 38 +-- .../bcel/InstructionFinderTestCase.java | 18 +- .../java/org/apache/bcel/PLSETestCase.java | 24 +- .../java/org/apache/bcel/PerformanceTest.java | 38 +-- .../bcel/classfile/JDKClassDumpTestCase.java | 16 +- .../org/apache/bcel/data/PLSETestClass.java | 2 + .../bcel/generic/AnnotationGenTestCase.java | 58 ++-- .../bcel/generic/BranchHandleTestCase.java | 6 +- .../generic/FieldAnnotationsTestCase.java | 28 +- .../GeneratingAnnotatedClassesTestCase.java | 232 +++++++-------- .../generic/InstructionHandleTestCase.java | 10 +- .../bcel/generic/JDKGenericDumpTestCase.java | 32 +- .../bcel/generic/MethodGenTestCase.java | 23 +- .../org/apache/bcel/generic/TypeTestCase.java | 4 +- .../apache/bcel/util/BCELifierTestCase.java | 22 +- .../apache/bcel/util/Class2HTMLTestCase.java | 4 +- .../bcel/util/InstructionFinderTest.java | 8 +- .../verifier/AbstractVerifierTestCase.java | 6 +- .../bcel/verifier/VerifierTestCase.java | 4 +- .../bcel/verifier/tests/TestArray01.java | 2 +- .../verifier/tests/TestArrayAccess01.java | 2 +- .../tests/TestArrayAccess02Creator.java | 20 +- .../tests/TestArrayAccess03Creator.java | 18 +- .../tests/TestArrayAccess04Creator.java | 20 +- .../bcel/verifier/tests/TestCreator.java | 6 +- .../verifier/tests/TestReturn01Creator.java | 16 +- .../verifier/tests/TestReturn03Creator.java | 14 +- 160 files changed, 2101 insertions(+), 2094 deletions(-) diff --git a/src/main/java/org/apache/bcel/ExceptionConst.java b/src/main/java/org/apache/bcel/ExceptionConst.java index e7fb5c39..efa872ce 100644 --- a/src/main/java/org/apache/bcel/ExceptionConst.java +++ b/src/main/java/org/apache/bcel/ExceptionConst.java @@ -90,8 +90,8 @@ public final class ExceptionConst { // helper method to merge exception class arrays private static Class[] mergeExceptions(final Class[] input, final Class ... extraClasses) { - int extraLen = extraClasses == null ? 0 : extraClasses.length; - Class[] excs = new Class[input.length + extraLen]; + final int extraLen = extraClasses == null ? 0 : extraClasses.length; + final Class[] excs = new Class[input.length + extraLen]; System.arraycopy(input, 0, excs, 0, input.length); if (extraLen > 0) { System.arraycopy(extraClasses, 0, excs, input.length, extraLen); diff --git a/src/main/java/org/apache/bcel/Repository.java b/src/main/java/org/apache/bcel/Repository.java index d8136d27..17a92b53 100644 --- a/src/main/java/org/apache/bcel/Repository.java +++ b/src/main/java/org/apache/bcel/Repository.java @@ -83,12 +83,12 @@ public abstract class Repository { */ public static ClassPath.ClassFile lookupClassFile( final String class_name ) { try { - ClassPath path = repository.getClassPath(); + final ClassPath path = repository.getClassPath(); if (path == null) { return null; } return path.getClassFile(class_name); - } catch (IOException e) { + } catch (final IOException e) { return null; } } @@ -107,7 +107,7 @@ public abstract class Repository { * @return old entry in repository */ public static JavaClass addClass( final JavaClass clazz ) { - JavaClass old = repository.findClass(clazz.getClassName()); + final JavaClass old = repository.findClass(clazz.getClassName()); repository.storeClass(clazz); return old; } @@ -146,7 +146,7 @@ public abstract class Repository { * superclasses can't be found */ public static JavaClass[] getSuperClasses( final String class_name ) throws ClassNotFoundException { - JavaClass jc = lookupClass(class_name); + final JavaClass jc = lookupClass(class_name); return getSuperClasses(jc); } diff --git a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java index 8da08b14..1e235bc5 100644 --- a/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/AnnotationEntry.java @@ -138,10 +138,10 @@ public class AnnotationEntry implements Node { final StringBuilder result = new StringBuilder(); result.append("@"); result.append(getAnnotationType()); - ElementValuePair[] evPairs = getElementValuePairs(); + final ElementValuePair[] evPairs = getElementValuePairs(); if (evPairs.length > 0) { result.append("("); - for (ElementValuePair element : evPairs) { + for (final ElementValuePair element : evPairs) { result.append(element.toShortString()); } result.append(")"); @@ -156,10 +156,10 @@ public class AnnotationEntry implements Node { public static AnnotationEntry[] createAnnotationEntries(final Attribute[] attrs) { // Find attributes that contain annotation data - List accumulatedAnnotations = new ArrayList<>(attrs.length); - for (Attribute attribute : attrs) { + final List accumulatedAnnotations = new ArrayList<>(attrs.length); + for (final Attribute attribute : attrs) { if (attribute instanceof Annotations) { - Annotations runtimeAnnotations = (Annotations) attribute; + final Annotations runtimeAnnotations = (Annotations) attribute; Collections.addAll(accumulatedAnnotations, runtimeAnnotations.getAnnotationEntries()); } } diff --git a/src/main/java/org/apache/bcel/classfile/Annotations.java b/src/main/java/org/apache/bcel/classfile/Annotations.java index be7ca5b7..561038ac 100644 --- a/src/main/java/org/apache/bcel/classfile/Annotations.java +++ b/src/main/java/org/apache/bcel/classfile/Annotations.java @@ -107,7 +107,7 @@ public abstract class Annotations extends Attribute { return; } dos.writeShort(annotation_table.length); - for (AnnotationEntry element : annotation_table) { + for (final AnnotationEntry element : annotation_table) { element.dump(dos); } } diff --git a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java index 0e2e6afe..9e750c4d 100644 --- a/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ArrayElementValue.java @@ -31,7 +31,7 @@ public class ArrayElementValue extends ElementValue @Override public String toString() { - StringBuilder sb = new StringBuilder(); + final StringBuilder sb = new StringBuilder(); sb.append("{"); for (int i = 0; i < evalues.length; i++) { @@ -59,7 +59,7 @@ public class ArrayElementValue extends ElementValue { dos.writeByte(super.getType()); // u1 type of value (ARRAY == '[') dos.writeShort(evalues.length); - for (ElementValue evalue : evalues) { + for (final ElementValue evalue : evalues) { evalue.dump(dos); } } @@ -67,7 +67,7 @@ public class ArrayElementValue extends ElementValue @Override public String stringifyValue() { - StringBuilder sb = new StringBuilder(); + final StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < evalues.length; i++) { diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java index 5934f450..b3e62319 100644 --- a/src/main/java/org/apache/bcel/classfile/Attribute.java +++ b/src/main/java/org/apache/bcel/classfile/Attribute.java @@ -185,12 +185,12 @@ public abstract class Attribute implements Cloneable, Node { { byte tag = Const.ATTR_UNKNOWN; // Unknown attribute // Get class name from constant pool via `name_index' indirection - int name_index = file.readUnsignedShort(); - ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, Const.CONSTANT_Utf8); - String name = c.getBytes(); + final int name_index = file.readUnsignedShort(); + final ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, Const.CONSTANT_Utf8); + final String name = c.getBytes(); // Length of data in bytes - int length = file.readInt(); + final int length = file.readInt(); // Compare strings to find known attribute for (byte i = 0; i < Const.KNOWN_ATTRIBUTES; i++) @@ -206,7 +206,7 @@ public abstract class Attribute implements Cloneable, Node { switch (tag) { case Const.ATTR_UNKNOWN: - Object r = readers.get(name); + final Object r = readers.get(name); if (r instanceof UnknownAttributeReader) { return ((UnknownAttributeReader) r).createAttribute(name_index, length, file, constant_pool); @@ -268,7 +268,7 @@ public abstract class Attribute implements Cloneable, Node { */ public String getName() { - ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, Const.CONSTANT_Utf8); + final ConstantUtf8 c = (ConstantUtf8) constant_pool.getConstant(name_index, Const.CONSTANT_Utf8); return c.getBytes(); } @@ -344,7 +344,7 @@ public abstract class Attribute implements Cloneable, Node { { attr = (Attribute) super.clone(); } - catch (CloneNotSupportedException e) + catch (final CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java index 66296cfb..7313048a 100644 --- a/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java +++ b/src/main/java/org/apache/bcel/classfile/BootstrapMethod.java @@ -125,7 +125,7 @@ public class BootstrapMethod implements Cloneable { * @return Resolved string representation */ public final String toString( final ConstantPool constant_pool ) { - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); String bootstrap_method_name; bootstrap_method_name = constant_pool.constantToString(bootstrap_method_ref, Const.CONSTANT_MethodHandle); @@ -150,7 +150,7 @@ public class BootstrapMethod implements Cloneable { public final void dump(final DataOutputStream file) throws IOException { file.writeShort(bootstrap_method_ref); file.writeShort(bootstrap_arguments.length); - for (int bootstrap_argument : bootstrap_arguments) { + for (final int bootstrap_argument : bootstrap_arguments) { file.writeShort(bootstrap_argument); } } @@ -161,7 +161,7 @@ public class BootstrapMethod implements Cloneable { public BootstrapMethod copy() { try { return (BootstrapMethod) clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { // TODO should this throw? } return null; diff --git a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java index 4aa090ff..acc17fb8 100644 --- a/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java +++ b/src/main/java/org/apache/bcel/classfile/BootstrapMethods.java @@ -66,7 +66,7 @@ public class BootstrapMethods extends Attribute { BootstrapMethods(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (BootstrapMethod[]) null, constant_pool); - int num_bootstrap_methods = input.readUnsignedShort(); + final int num_bootstrap_methods = input.readUnsignedShort(); bootstrap_methods = new BootstrapMethod[num_bootstrap_methods]; for (int i = 0; i < num_bootstrap_methods; i++) { bootstrap_methods[i] = new BootstrapMethod(input); @@ -100,7 +100,7 @@ public class BootstrapMethods extends Attribute { */ @Override public BootstrapMethods copy(final ConstantPool _constant_pool) { - BootstrapMethods c = (BootstrapMethods) clone(); + final BootstrapMethods c = (BootstrapMethods) clone(); c.bootstrap_methods = new BootstrapMethod[bootstrap_methods.length]; for (int i = 0; i < bootstrap_methods.length; i++) { @@ -121,7 +121,7 @@ public class BootstrapMethods extends Attribute { super.dump(file); file.writeShort(bootstrap_methods.length); - for (BootstrapMethod bootstrap_method : bootstrap_methods) { + for (final BootstrapMethod bootstrap_method : bootstrap_methods) { bootstrap_method.dump(file); } } @@ -131,7 +131,7 @@ public class BootstrapMethods extends Attribute { */ @Override public final String toString() { - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); buf.append("BootstrapMethods("); buf.append(bootstrap_methods.length); buf.append("):\n"); diff --git a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java index af2783d9..2a62a872 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ClassElementValue.java @@ -45,7 +45,7 @@ public class ClassElementValue extends ElementValue public String getClassString() { - ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(idx, + final ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(idx, Const.CONSTANT_Utf8); return c.getBytes(); } @@ -53,7 +53,7 @@ public class ClassElementValue extends ElementValue @Override public String stringifyValue() { - ConstantUtf8 cu8 = (ConstantUtf8) super.getConstantPool().getConstant(idx, + final ConstantUtf8 cu8 = (ConstantUtf8) super.getConstantPool().getConstant(idx, Const.CONSTANT_Utf8); return cu8.getBytes(); } diff --git a/src/main/java/org/apache/bcel/classfile/ClassParser.java b/src/main/java/org/apache/bcel/classfile/ClassParser.java index 28eeb68a..394b8e9b 100644 --- a/src/main/java/org/apache/bcel/classfile/ClassParser.java +++ b/src/main/java/org/apache/bcel/classfile/ClassParser.java @@ -70,7 +70,7 @@ public final class ClassParser { public ClassParser(final InputStream inputStream, final String file_name) { this.file_name = file_name; fileOwned = false; - String clazz = inputStream.getClass().getName(); // Not a very clean solution ... + final String clazz = inputStream.getClass().getName(); // Not a very clean solution ... is_zip = clazz.startsWith("java.util.zip.") || clazz.startsWith("java.util.jar."); if (inputStream instanceof DataInputStream) { this.dataInputStream = (DataInputStream) inputStream; @@ -121,7 +121,7 @@ public final class ClassParser { if (fileOwned) { if (is_zip) { zip = new ZipFile(zip_file); - ZipEntry entry = zip.getEntry(file_name); + final ZipEntry entry = zip.getEntry(file_name); if (entry == null) { throw new IOException("File " + file_name + " not found"); @@ -174,7 +174,7 @@ public final class ClassParser { if (dataInputStream != null) { dataInputStream.close(); } - } catch (IOException ioe) { + } catch (final IOException ioe) { //ignore close exceptions } } @@ -182,7 +182,7 @@ public final class ClassParser { if (zip != null) { zip.close(); } - } catch (IOException ioe) { + } catch (final IOException ioe) { //ignore close exceptions } } @@ -200,7 +200,7 @@ public final class ClassParser { * @throws ClassFormatException */ private void readAttributes() throws IOException, ClassFormatException { - int attributes_count = dataInputStream.readUnsignedShort(); + final int attributes_count = dataInputStream.readUnsignedShort(); attributes = new Attribute[attributes_count]; for (int i = 0; i < attributes_count; i++) { attributes[i] = Attribute.readAttribute(dataInputStream, constant_pool); @@ -246,7 +246,7 @@ public final class ClassParser { * @throws ClassFormatException */ private void readFields() throws IOException, ClassFormatException { - int fields_count = dataInputStream.readUnsignedShort(); + final int fields_count = dataInputStream.readUnsignedShort(); fields = new Field[fields_count]; for (int i = 0; i < fields_count; i++) { fields[i] = new Field(dataInputStream, constant_pool); @@ -274,7 +274,7 @@ public final class ClassParser { * @throws ClassFormatException */ private void readInterfaces() throws IOException, ClassFormatException { - int interfaces_count = dataInputStream.readUnsignedShort(); + final int interfaces_count = dataInputStream.readUnsignedShort(); interfaces = new int[interfaces_count]; for (int i = 0; i < interfaces_count; i++) { interfaces[i] = dataInputStream.readUnsignedShort(); @@ -288,7 +288,7 @@ public final class ClassParser { * @throws ClassFormatException */ private void readMethods() throws IOException, ClassFormatException { - int methods_count = dataInputStream.readUnsignedShort(); + final int methods_count = dataInputStream.readUnsignedShort(); methods = new Method[methods_count]; for (int i = 0; i < methods_count; i++) { methods[i] = new Method(dataInputStream, constant_pool); diff --git a/src/main/java/org/apache/bcel/classfile/Code.java b/src/main/java/org/apache/bcel/classfile/Code.java index 50da232f..53f3d4b0 100644 --- a/src/main/java/org/apache/bcel/classfile/Code.java +++ b/src/main/java/org/apache/bcel/classfile/Code.java @@ -71,13 +71,13 @@ public final class Code extends Attribute { // Initialize with some default values which will be overwritten later this(name_index, length, file.readUnsignedShort(), file.readUnsignedShort(), (byte[]) null, (CodeException[]) null, (Attribute[]) null, constant_pool); - int code_length = file.readInt(); + final int code_length = file.readInt(); code = new byte[code_length]; // Read byte code file.readFully(code); /* Read exception table that contains all regions where an exception * handler is active, i.e., a try { ... } catch() block. */ - int exception_table_length = file.readUnsignedShort(); + final int exception_table_length = file.readUnsignedShort(); exception_table = new CodeException[exception_table_length]; for (int i = 0; i < exception_table_length; i++) { exception_table[i] = new CodeException(file); @@ -85,7 +85,7 @@ public final class Code extends Attribute { /* Read all attributes, currently `LineNumberTable' and * `LocalVariableTable' */ - int attributes_count = file.readUnsignedShort(); + final int attributes_count = file.readUnsignedShort(); attributes = new Attribute[attributes_count]; for (int i = 0; i < attributes_count; i++) { attributes[i] = Attribute.readAttribute(file, constant_pool); @@ -147,11 +147,11 @@ public final class Code extends Attribute { file.writeInt(code.length); file.write(code, 0, code.length); file.writeShort(exception_table.length); - for (CodeException exception : exception_table) { + for (final CodeException exception : exception_table) { exception.dump(file); } file.writeShort(attributes.length); - for (Attribute attribute : attributes) { + for (final Attribute attribute : attributes) { attribute.dump(file); } } @@ -170,7 +170,7 @@ public final class Code extends Attribute { * @return LineNumberTable of Code, if it has one */ public LineNumberTable getLineNumberTable() { - for (Attribute attribute : attributes) { + for (final Attribute attribute : attributes) { if (attribute instanceof LineNumberTable) { return (LineNumberTable) attribute; } @@ -183,7 +183,7 @@ public final class Code extends Attribute { * @return LocalVariableTable of Code, if it has one */ public LocalVariableTable getLocalVariableTable() { - for (Attribute attribute : attributes) { + for (final Attribute attribute : attributes) { if (attribute instanceof LocalVariableTable) { return (LocalVariableTable) attribute; } @@ -245,7 +245,7 @@ public final class Code extends Attribute { private int calculateLength() { int len = 0; if (attributes != null) { - for (Attribute attribute : attributes) { + for (final Attribute attribute : attributes) { len += attribute.getLength() + 6 /*attribute header size*/; } } @@ -300,19 +300,19 @@ public final class Code extends Attribute { * @return String representation of code chunk. */ public final String toString( final boolean verbose ) { - StringBuilder buf = new StringBuilder(100); // CHECKSTYLE IGNORE MagicNumber + final StringBuilder buf = new StringBuilder(100); // CHECKSTYLE IGNORE MagicNumber buf.append("Code(max_stack = ").append(max_stack).append(", max_locals = ").append( max_locals).append(", code_length = ").append(code.length).append(")\n").append( Utility.codeToString(code, super.getConstantPool(), 0, -1, verbose)); if (exception_table.length > 0) { buf.append("\nException handler(s) = \n").append("From\tTo\tHandler\tType\n"); - for (CodeException exception : exception_table) { + for (final CodeException exception : exception_table) { buf.append(exception.toString(super.getConstantPool(), verbose)).append("\n"); } } if (attributes.length > 0) { buf.append("\nAttribute(s) = "); - for (Attribute attribute : attributes) { + for (final Attribute attribute : attributes) { buf.append("\n").append(attribute); } } @@ -336,7 +336,7 @@ public final class Code extends Attribute { */ @Override public Attribute copy( final ConstantPool _constant_pool ) { - Code c = (Code) clone(); + final Code c = (Code) clone(); if (code != null) { c.code = new byte[code.length]; System.arraycopy(code, 0, c.code, 0, code.length); diff --git a/src/main/java/org/apache/bcel/classfile/CodeException.java b/src/main/java/org/apache/bcel/classfile/CodeException.java index dd73596e..8c1c5a4c 100644 --- a/src/main/java/org/apache/bcel/classfile/CodeException.java +++ b/src/main/java/org/apache/bcel/classfile/CodeException.java @@ -210,7 +210,7 @@ public final class CodeException implements Cloneable, Node, Constants { public CodeException copy() { try { return (CodeException) clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { // TODO should this throw? } return null; diff --git a/src/main/java/org/apache/bcel/classfile/Constant.java b/src/main/java/org/apache/bcel/classfile/Constant.java index 649bd222..1f0bbf2d 100644 --- a/src/main/java/org/apache/bcel/classfile/Constant.java +++ b/src/main/java/org/apache/bcel/classfile/Constant.java @@ -37,15 +37,15 @@ public abstract class Constant implements Cloneable, Node { @Override public boolean equals( final Object o1, final Object o2 ) { - Constant THIS = (Constant) o1; - Constant THAT = (Constant) o2; + final Constant THIS = (Constant) o1; + final Constant THAT = (Constant) o2; return THIS.toString().equals(THAT.toString()); } @Override public int hashCode( final Object o ) { - Constant THIS = (Constant) o; + final Constant THIS = (Constant) o; return THIS.toString().hashCode(); } }; @@ -107,7 +107,7 @@ public abstract class Constant implements Cloneable, Node { public Constant copy() { try { return (Constant) super.clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { // TODO should this throw? } return null; @@ -118,7 +118,7 @@ public abstract class Constant implements Cloneable, Node { public Object clone() { try { return super.clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } } @@ -133,7 +133,7 @@ public abstract class Constant implements Cloneable, Node { */ public static Constant readConstant( final DataInput input ) throws IOException, ClassFormatException { - byte b = input.readByte(); // Read tag byte + final byte b = input.readByte(); // Read tag byte switch (b) { case Const.CONSTANT_Class: return new ConstantClass(input); diff --git a/src/main/java/org/apache/bcel/classfile/ConstantClass.java b/src/main/java/org/apache/bcel/classfile/ConstantClass.java index fdb863f4..81725e1b 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantClass.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantClass.java @@ -110,7 +110,7 @@ public final class ConstantClass extends Constant implements ConstantObject { */ @Override public Object getConstantValue( final ConstantPool cp ) { - Constant c = cp.getConstant(name_index, Const.CONSTANT_Utf8); + final Constant c = cp.getConstant(name_index, Const.CONSTANT_Utf8); return ((ConstantUtf8) c).getBytes(); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java b/src/main/java/org/apache/bcel/classfile/ConstantPool.java index 99ddc08a..d9f9f8a5 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java @@ -57,7 +57,7 @@ public class ConstantPool implements Cloneable, Node { */ public ConstantPool(final DataInput input) throws IOException, ClassFormatException { byte tag; - int constant_pool_count = input.readUnsignedShort(); + final int constant_pool_count = input.readUnsignedShort(); constant_pool = new Constant[constant_pool_count]; /* constant_pool[0] is unused by the compiler and may be used freely * by the implementation. @@ -101,7 +101,7 @@ public class ConstantPool implements Cloneable, Node { public String constantToString( Constant c ) throws ClassFormatException { String str; int i; - byte tag = c.getTag(); + final byte tag = c.getTag(); switch (tag) { case Const.CONSTANT_Class: i = ((ConstantClass) c).getNameIndex(); @@ -144,17 +144,17 @@ public class ConstantPool implements Cloneable, Node { case Const.CONSTANT_MethodHandle: // Note that the ReferenceIndex may point to a Fieldref, Methodref or // InterfaceMethodref - so we need to peek ahead to get the actual type. - ConstantMethodHandle cmh = (ConstantMethodHandle) c; + final ConstantMethodHandle cmh = (ConstantMethodHandle) c; str = Const.getMethodHandleName(cmh.getReferenceKind()) + " " + constantToString(cmh.getReferenceIndex(), getConstant(cmh.getReferenceIndex()).getTag()); break; case Const.CONSTANT_MethodType: - ConstantMethodType cmt = (ConstantMethodType) c; + final ConstantMethodType cmt = (ConstantMethodType) c; str = constantToString(cmt.getDescriptorIndex(), Const.CONSTANT_Utf8); break; case Const.CONSTANT_InvokeDynamic: - ConstantInvokeDynamic cid = (ConstantInvokeDynamic) c; + final ConstantInvokeDynamic cid = (ConstantInvokeDynamic) c; str = cid.getBootstrapMethodAttrIndex() + ":" + constantToString(cid.getNameAndTypeIndex(), Const.CONSTANT_NameAndType); @@ -167,9 +167,9 @@ public class ConstantPool implements Cloneable, Node { private static String escape( final String str ) { - int len = str.length(); - StringBuilder buf = new StringBuilder(len + 5); - char[] ch = str.toCharArray(); + final int len = str.length(); + final StringBuilder buf = new StringBuilder(len + 5); + final char[] ch = str.toCharArray(); for (int i = 0; i < len; i++) { switch (ch[i]) { case '\n': @@ -204,7 +204,7 @@ public class ConstantPool implements Cloneable, Node { * @return String representation */ public String constantToString( final int index, final byte tag ) throws ClassFormatException { - Constant c = getConstant(index, tag); + final Constant c = getConstant(index, tag); return constantToString(c); } @@ -343,7 +343,7 @@ public class ConstantPool implements Cloneable, Node { */ @Override public String toString() { - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); for (int i = 1; i < constant_pool.length; i++) { buf.append(i).append(")").append(constant_pool[i]).append("\n"); } @@ -364,7 +364,7 @@ public class ConstantPool implements Cloneable, Node { c.constant_pool[i] = constant_pool[i].copy(); } } - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { // TODO should this throw? } return c; diff --git a/src/main/java/org/apache/bcel/classfile/ConstantString.java b/src/main/java/org/apache/bcel/classfile/ConstantString.java index dc675c89..2e4b223e 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantString.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantString.java @@ -118,7 +118,7 @@ public final class ConstantString extends Constant implements ConstantObject { */ @Override public Object getConstantValue( final ConstantPool cp ) { - Constant c = cp.getConstant(string_index, Const.CONSTANT_Utf8); + final Constant c = cp.getConstant(string_index, Const.CONSTANT_Utf8); return ((ConstantUtf8) c).getBytes(); } diff --git a/src/main/java/org/apache/bcel/classfile/ConstantValue.java b/src/main/java/org/apache/bcel/classfile/ConstantValue.java index e476f3b8..1c2f289d 100644 --- a/src/main/java/org/apache/bcel/classfile/ConstantValue.java +++ b/src/main/java/org/apache/bcel/classfile/ConstantValue.java @@ -153,7 +153,7 @@ public final class ConstantValue extends Attribute { */ @Override public Attribute copy( final ConstantPool _constant_pool ) { - ConstantValue c = (ConstantValue) clone(); + final ConstantValue c = (ConstantValue) clone(); c.setConstantPool(_constant_pool); return c; } diff --git a/src/main/java/org/apache/bcel/classfile/Deprecated.java b/src/main/java/org/apache/bcel/classfile/Deprecated.java index 03f49384..d84ddb7c 100644 --- a/src/main/java/org/apache/bcel/classfile/Deprecated.java +++ b/src/main/java/org/apache/bcel/classfile/Deprecated.java @@ -135,7 +135,7 @@ public final class Deprecated extends Attribute { */ @Override public Attribute copy( final ConstantPool _constant_pool ) { - Deprecated c = (Deprecated) clone(); + final Deprecated c = (Deprecated) clone(); if (bytes != null) { c.bytes = new byte[bytes.length]; System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); diff --git a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java index 7526c21d..2eab3fa9 100644 --- a/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java +++ b/src/main/java/org/apache/bcel/classfile/DescendingVisitor.java @@ -49,7 +49,7 @@ public class DescendingVisitor implements Visitor */ public Object predecessor(final int level) { - int size = stack.size(); + final int size = stack.size(); if ((size < 2) || (level < 0)) { return null; @@ -90,16 +90,16 @@ public class DescendingVisitor implements Visitor { stack.push(_clazz); _clazz.accept(visitor); - Field[] fields = _clazz.getFields(); - for (Field field : fields) { + final Field[] fields = _clazz.getFields(); + for (final Field field : fields) { field.accept(this); } - Method[] methods = _clazz.getMethods(); - for (Method method : methods) { + final Method[] methods = _clazz.getMethods(); + for (final Method method : methods) { method.accept(this); } - Attribute[] attributes = _clazz.getAttributes(); - for (Attribute attribute : attributes) { + final Attribute[] attributes = _clazz.getAttributes(); + for (final Attribute attribute : attributes) { attribute.accept(this); } _clazz.getConstantPool().accept(this); @@ -114,8 +114,8 @@ public class DescendingVisitor implements Visitor { stack.push(annotation); annotation.accept(visitor); - AnnotationEntry[] entries = annotation.getAnnotationEntries(); - for (AnnotationEntry entrie : entries) { + final AnnotationEntry[] entries = annotation.getAnnotationEntries(); + for (final AnnotationEntry entrie : entries) { entrie.accept(this); } stack.pop(); @@ -137,8 +137,8 @@ public class DescendingVisitor implements Visitor { stack.push(field); field.accept(visitor); - Attribute[] attributes = field.getAttributes(); - for (Attribute attribute : attributes) { + final Attribute[] attributes = field.getAttributes(); + for (final Attribute attribute : attributes) { attribute.accept(this); } stack.pop(); @@ -157,8 +157,8 @@ public class DescendingVisitor implements Visitor { stack.push(method); method.accept(visitor); - Attribute[] attributes = method.getAttributes(); - for (Attribute attribute : attributes) { + final Attribute[] attributes = method.getAttributes(); + for (final Attribute attribute : attributes) { attribute.accept(this); } stack.pop(); @@ -177,12 +177,12 @@ public class DescendingVisitor implements Visitor { stack.push(code); code.accept(visitor); - CodeException[] table = code.getExceptionTable(); - for (CodeException element : table) { + final CodeException[] table = code.getExceptionTable(); + for (final CodeException element : table) { element.accept(this); } - Attribute[] attributes = code.getAttributes(); - for (Attribute attribute : attributes) { + final Attribute[] attributes = code.getAttributes(); + for (final Attribute attribute : attributes) { attribute.accept(this); } stack.pop(); @@ -201,8 +201,8 @@ public class DescendingVisitor implements Visitor { stack.push(table); table.accept(visitor); - LineNumber[] numbers = table.getLineNumberTable(); - for (LineNumber number : numbers) { + final LineNumber[] numbers = table.getLineNumberTable(); + for (final LineNumber number : numbers) { number.accept(this); } stack.pop(); @@ -221,8 +221,8 @@ public class DescendingVisitor implements Visitor { stack.push(table); table.accept(visitor); - LocalVariable[] vars = table.getLocalVariableTable(); - for (LocalVariable var : vars) { + final LocalVariable[] vars = table.getLocalVariableTable(); + for (final LocalVariable var : vars) { var.accept(this); } stack.pop(); @@ -233,8 +233,8 @@ public class DescendingVisitor implements Visitor { stack.push(table); table.accept(visitor); - StackMapEntry[] vars = table.getStackMap(); - for (StackMapEntry var : vars) { + final StackMapEntry[] vars = table.getStackMap(); + for (final StackMapEntry var : vars) { var.accept(this); } stack.pop(); @@ -261,7 +261,7 @@ public class DescendingVisitor implements Visitor { stack.push(cp); cp.accept(visitor); - Constant[] constants = cp.getConstantPool(); + final Constant[] constants = cp.getConstantPool(); for (int i = 1; i < constants.length; i++) { if (constants[i] != null) @@ -378,8 +378,8 @@ public class DescendingVisitor implements Visitor { stack.push(ic); ic.accept(visitor); - InnerClass[] ics = ic.getInnerClasses(); - for (InnerClass ic2 : ics) { + final InnerClass[] ics = ic.getInnerClasses(); + for (final InnerClass ic2 : ics) { ic2.accept(this); } stack.pop(); diff --git a/src/main/java/org/apache/bcel/classfile/ElementValue.java b/src/main/java/org/apache/bcel/classfile/ElementValue.java index 573297a3..1dcad244 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValue.java @@ -76,7 +76,7 @@ public abstract class ElementValue public static ElementValue readElementValue(final DataInput input, final ConstantPool cpool) throws IOException { - byte type = input.readByte(); + final byte type = input.readByte(); switch (type) { case PRIMITIVE_BYTE: @@ -101,8 +101,8 @@ public abstract class ElementValue return new AnnotationElementValue(ANNOTATION, AnnotationEntry.read(input, cpool, false), cpool); case ARRAY: - int numArrayVals = input.readUnsignedShort(); - ElementValue[] evalues = new ElementValue[numArrayVals]; + final int numArrayVals = input.readUnsignedShort(); + final ElementValue[] evalues = new ElementValue[numArrayVals]; for (int j = 0; j < numArrayVals; j++) { evalues[j] = ElementValue.readElementValue(input, cpool); diff --git a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java index c1564e92..cfdcd18e 100644 --- a/src/main/java/org/apache/bcel/classfile/ElementValuePair.java +++ b/src/main/java/org/apache/bcel/classfile/ElementValuePair.java @@ -46,7 +46,7 @@ public class ElementValuePair public String getNameString() { - ConstantUtf8 c = (ConstantUtf8) constantPool.getConstant( + final ConstantUtf8 c = (ConstantUtf8) constantPool.getConstant( elementNameIndex, Const.CONSTANT_Utf8); return c.getBytes(); } @@ -63,7 +63,7 @@ public class ElementValuePair public String toShortString() { - StringBuilder result = new StringBuilder(); + final StringBuilder result = new StringBuilder(); result.append(getNameString()).append("=").append( getValue().toShortString()); return result.toString(); diff --git a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java index b02e1461..02e962b4 100644 --- a/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java +++ b/src/main/java/org/apache/bcel/classfile/EnclosingMethod.java @@ -83,7 +83,7 @@ public class EnclosingMethod extends Attribute { } public final ConstantClass getEnclosingClass() { - ConstantClass c = + final ConstantClass c = (ConstantClass)super.getConstantPool().getConstant(classIndex,Const.CONSTANT_Class); return c; } @@ -92,7 +92,7 @@ public class EnclosingMethod extends Attribute { if (methodIndex == 0) { return null; } - ConstantNameAndType nat = + final ConstantNameAndType nat = (ConstantNameAndType)super.getConstantPool().getConstant(methodIndex,Const.CONSTANT_NameAndType); return nat; } diff --git a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java index 5b7045f8..4bab0a81 100644 --- a/src/main/java/org/apache/bcel/classfile/EnumElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/EnumElementValue.java @@ -55,21 +55,21 @@ public class EnumElementValue extends ElementValue @Override public String stringifyValue() { - ConstantUtf8 cu8 = (ConstantUtf8) super.getConstantPool().getConstant(valueIdx, + final ConstantUtf8 cu8 = (ConstantUtf8) super.getConstantPool().getConstant(valueIdx, Const.CONSTANT_Utf8); return cu8.getBytes(); } public String getEnumTypeString() { - ConstantUtf8 cu8 = (ConstantUtf8) super.getConstantPool().getConstant(typeIdx, + final ConstantUtf8 cu8 = (ConstantUtf8) super.getConstantPool().getConstant(typeIdx, Const.CONSTANT_Utf8); return cu8.getBytes();// Utility.signatureToString(cu8.getBytes()); } public String getEnumValueString() { - ConstantUtf8 cu8 = (ConstantUtf8) super.getConstantPool().getConstant(valueIdx, + final ConstantUtf8 cu8 = (ConstantUtf8) super.getConstantPool().getConstant(valueIdx, Const.CONSTANT_Utf8); return cu8.getBytes(); } diff --git a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java index 5feb9762..06b46bf6 100644 --- a/src/main/java/org/apache/bcel/classfile/ExceptionTable.java +++ b/src/main/java/org/apache/bcel/classfile/ExceptionTable.java @@ -71,7 +71,7 @@ public final class ExceptionTable extends Attribute { */ ExceptionTable(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (int[]) null, constant_pool); - int number_of_exceptions = input.readUnsignedShort(); + final int number_of_exceptions = input.readUnsignedShort(); exception_index_table = new int[number_of_exceptions]; for (int i = 0; i < number_of_exceptions; i++) { exception_index_table[i] = input.readUnsignedShort(); @@ -102,7 +102,7 @@ public final class ExceptionTable extends Attribute { public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(exception_index_table.length); - for (int index : exception_index_table) { + for (final int index : exception_index_table) { file.writeShort(index); } } @@ -128,7 +128,7 @@ public final class ExceptionTable extends Attribute { * @return class names of thrown exceptions */ public final String[] getExceptionNames() { - String[] names = new String[exception_index_table.length]; + final String[] names = new String[exception_index_table.length]; for (int i = 0; i < exception_index_table.length; i++) { names[i] = super.getConstantPool().getConstantString(exception_index_table[i], Const.CONSTANT_Class).replace('/', '.'); @@ -151,7 +151,7 @@ public final class ExceptionTable extends Attribute { */ @Override public final String toString() { - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); String str; buf.append("Exceptions: "); for (int i = 0; i < exception_index_table.length; i++) { @@ -170,7 +170,7 @@ public final class ExceptionTable extends Attribute { */ @Override public Attribute copy( final ConstantPool _constant_pool ) { - ExceptionTable c = (ExceptionTable) clone(); + final ExceptionTable c = (ExceptionTable) clone(); if (exception_index_table != null) { c.exception_index_table = new int[exception_index_table.length]; System.arraycopy(exception_index_table, 0, c.exception_index_table, 0, diff --git a/src/main/java/org/apache/bcel/classfile/Field.java b/src/main/java/org/apache/bcel/classfile/Field.java index 50c06d3f..e7ba578c 100644 --- a/src/main/java/org/apache/bcel/classfile/Field.java +++ b/src/main/java/org/apache/bcel/classfile/Field.java @@ -36,8 +36,8 @@ public final class Field extends FieldOrMethod { @Override public boolean equals( final Object o1, final Object o2 ) { - Field THIS = (Field) o1; - Field THAT = (Field) o2; + final Field THIS = (Field) o1; + final Field THAT = (Field) o2; return THIS.getName().equals(THAT.getName()) && THIS.getSignature().equals(THAT.getSignature()); } @@ -45,7 +45,7 @@ public final class Field extends FieldOrMethod { @Override public int hashCode( final Object o ) { - Field THIS = (Field) o; + final Field THIS = (Field) o; return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); } }; @@ -100,7 +100,7 @@ public final class Field extends FieldOrMethod { * @return constant value associated with this field (may be null) */ public final ConstantValue getConstantValue() { - for (Attribute attribute : super.getAttributes()) { + for (final Attribute attribute : super.getAttributes()) { if (attribute.getTag() == Const.ATTR_CONSTANT_VALUE) { return (ConstantValue) attribute; } @@ -126,13 +126,13 @@ public final class Field extends FieldOrMethod { access = access.isEmpty() ? "" : (access + " "); signature = Utility.signatureToString(getSignature()); name = getName(); - StringBuilder buf = new StringBuilder(64); // CHECKSTYLE IGNORE MagicNumber + final StringBuilder buf = new StringBuilder(64); // CHECKSTYLE IGNORE MagicNumber buf.append(access).append(signature).append(" ").append(name); - ConstantValue cv = getConstantValue(); + final ConstantValue cv = getConstantValue(); if (cv != null) { buf.append(" = ").append(cv); } - for (Attribute attribute : super.getAttributes()) { + for (final Attribute attribute : super.getAttributes()) { if (!(attribute instanceof ConstantValue)) { buf.append(" [").append(attribute).append("]"); } diff --git a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java index dc8dc246..81c602bf 100644 --- a/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/classfile/FieldOrMethod.java @@ -103,7 +103,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No protected FieldOrMethod(final DataInput file, final ConstantPool constant_pool) throws IOException, ClassFormatException { this(file.readUnsignedShort(), file.readUnsignedShort(), file.readUnsignedShort(), null, constant_pool); - int attributes_count = file.readUnsignedShort(); + final int attributes_count = file.readUnsignedShort(); attributes = new Attribute[attributes_count]; for (int i = 0; i < attributes_count; i++) { attributes[i] = Attribute.readAttribute(file, constant_pool); @@ -140,7 +140,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No file.writeShort(name_index); file.writeShort(signature_index); file.writeShort(attributes.length); - for (Attribute attribute : attributes) { + for (final Attribute attribute : attributes) { attribute.dump(file); } } @@ -239,7 +239,7 @@ public abstract class FieldOrMethod extends AccessFlags implements Cloneable, No try { c = (FieldOrMethod)clone(); - } catch(CloneNotSupportedException e) { + } catch(final CloneNotSupportedException e) { // ignored, but will cause NPE ... } diff --git a/src/main/java/org/apache/bcel/classfile/InnerClass.java b/src/main/java/org/apache/bcel/classfile/InnerClass.java index feba4a9e..777facc2 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClass.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClass.java @@ -209,7 +209,7 @@ public final class InnerClass implements Cloneable, Node { public InnerClass copy() { try { return (InnerClass) clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { // TODO should this throw? } return null; diff --git a/src/main/java/org/apache/bcel/classfile/InnerClasses.java b/src/main/java/org/apache/bcel/classfile/InnerClasses.java index 7f98ed31..5d77f416 100644 --- a/src/main/java/org/apache/bcel/classfile/InnerClasses.java +++ b/src/main/java/org/apache/bcel/classfile/InnerClasses.java @@ -71,7 +71,7 @@ public final class InnerClasses extends Attribute { InnerClasses(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (InnerClass[]) null, constant_pool); - int number_of_classes = input.readUnsignedShort(); + final int number_of_classes = input.readUnsignedShort(); inner_classes = new InnerClass[number_of_classes]; for (int i = 0; i < number_of_classes; i++) { inner_classes[i] = new InnerClass(input); @@ -102,7 +102,7 @@ public final class InnerClasses extends Attribute { public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(inner_classes.length); - for (InnerClass inner_class : inner_classes) { + for (final InnerClass inner_class : inner_classes) { inner_class.dump(file); } } @@ -129,11 +129,11 @@ public final class InnerClasses extends Attribute { */ @Override public final String toString() { - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); buf.append("InnerClasses("); buf.append(inner_classes.length); buf.append("):\n"); - for (InnerClass inner_class : inner_classes) { + for (final InnerClass inner_class : inner_classes) { buf.append(inner_class.toString(super.getConstantPool())).append("\n"); } return buf.toString(); @@ -146,7 +146,7 @@ public final class InnerClasses extends Attribute { @Override public Attribute copy( final ConstantPool _constant_pool ) { // TODO this could be recoded to use a lower level constructor after creating a copy of the inner classes - InnerClasses c = (InnerClasses) clone(); + final InnerClasses c = (InnerClasses) clone(); c.inner_classes = new InnerClass[inner_classes.length]; for (int i = 0; i < inner_classes.length; i++) { c.inner_classes[i] = inner_classes[i].copy(); diff --git a/src/main/java/org/apache/bcel/classfile/JavaClass.java b/src/main/java/org/apache/bcel/classfile/JavaClass.java index 857b8357..8002a417 100644 --- a/src/main/java/org/apache/bcel/classfile/JavaClass.java +++ b/src/main/java/org/apache/bcel/classfile/JavaClass.java @@ -77,15 +77,15 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl @Override public boolean equals( final Object o1, final Object o2 ) { - JavaClass THIS = (JavaClass) o1; - JavaClass THAT = (JavaClass) o2; + final JavaClass THIS = (JavaClass) o1; + final JavaClass THAT = (JavaClass) o2; return THIS.getClassName().equals(THAT.getClassName()); } @Override public int hashCode( final Object o ) { - JavaClass THIS = (JavaClass) o; + final JavaClass THIS = (JavaClass) o; return THIS.getClassName().hashCode(); } }; @@ -144,7 +144,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl this.attributes = attributes; this.source = source; // Get source file name if available - for (Attribute attribute : attributes) { + for (final Attribute attribute : attributes) { if (attribute instanceof SourceFile) { source_file_name = ((SourceFile) attribute).getSourceFileName(); break; @@ -156,7 +156,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl */ class_name = constant_pool.getConstantString(class_name_index, Const.CONSTANT_Class); class_name = Utility.compactClassName(class_name, false); - int index = class_name.lastIndexOf('.'); + final int index = class_name.lastIndexOf('.'); if (index < 0) { package_name = ""; } else { @@ -172,7 +172,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl } interface_names = new String[interfaces.length]; for (int i = 0; i < interfaces.length; i++) { - String str = constant_pool.getConstantString(interfaces[i], Const.CONSTANT_Class); + final String str = constant_pool.getConstantString(interfaces[i], Const.CONSTANT_Class); interface_names[i] = Utility.compactClassName(str, false); } } @@ -230,9 +230,9 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @throws IOException */ public void dump(final File file) throws IOException { - String parent = file.getParent(); + final String parent = file.getParent(); if (parent != null) { - File dir = new File(parent); + final File dir = new File(parent); if (!dir.mkdirs()) { // either was not created or already existed if (!dir.isDirectory()) { throw new IOException("Could not create the directory " + dir); @@ -260,16 +260,16 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * @return class in binary format */ public byte[] getBytes() { - ByteArrayOutputStream s = new ByteArrayOutputStream(); - DataOutputStream ds = new DataOutputStream(s); + final ByteArrayOutputStream s = new ByteArrayOutputStream(); + final DataOutputStream ds = new DataOutputStream(s); try { dump(ds); - } catch (IOException e) { + } catch (final IOException e) { e.printStackTrace(); } finally { try { ds.close(); - } catch (IOException e2) { + } catch (final IOException e2) { e2.printStackTrace(); } } @@ -303,20 +303,20 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl file.writeShort(class_name_index); file.writeShort(superclass_name_index); file.writeShort(interfaces.length); - for (int interface1 : interfaces) { + for (final int interface1 : interfaces) { file.writeShort(interface1); } file.writeShort(fields.length); - for (Field field : fields) { + for (final Field field : fields) { field.dump(file); } file.writeShort(methods.length); - for (Method method : methods) { + for (final Method method : methods) { method.dump(file); } if (attributes != null) { file.writeShort(attributes.length); - for (Attribute attribute : attributes) { + for (final Attribute attribute : attributes) { attribute.dump(file); } } else { @@ -432,7 +432,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * java.lang.reflect.Method if any */ public Method getMethod( final java.lang.reflect.Method m ) { - for (Method method : methods) { + for (final Method method : methods) { if (m.getName().equals(method.getName()) && (m.getModifiers() == method.getModifiers()) && Type.getSignature(m).equals(method.getSignature())) { return method; @@ -596,11 +596,11 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl public String toString() { String access = Utility.accessToString(super.getAccessFlags(), true); access = access.isEmpty() ? "" : (access + " "); - StringBuilder buf = new StringBuilder(128); + final StringBuilder buf = new StringBuilder(128); buf.append(access).append(Utility.classOrInterface(super.getAccessFlags())).append(" ").append( class_name).append(" extends ").append( Utility.compactClassName(superclass_name, false)).append('\n'); - int size = interfaces.length; + final int size = interfaces.length; if (size > 0) { buf.append("implements\t\t"); for (int i = 0; i < size; i++) { @@ -619,26 +619,26 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl buf.append("ACC_SUPER flag\t\t").append(isSuper()).append("\n"); if (attributes.length > 0) { buf.append("\nAttribute(s):\n"); - for (Attribute attribute : attributes) { + for (final Attribute attribute : attributes) { buf.append(indent(attribute)); } } - AnnotationEntry[] annotations = getAnnotationEntries(); + final AnnotationEntry[] annotations = getAnnotationEntries(); if (annotations!=null && annotations.length>0) { buf.append("\nAnnotation(s):\n"); - for (AnnotationEntry annotation : annotations) { + for (final AnnotationEntry annotation : annotations) { buf.append(indent(annotation)); } } if (fields.length > 0) { buf.append("\n").append(fields.length).append(" fields:\n"); - for (Field field : fields) { + for (final Field field : fields) { buf.append("\t").append(field).append('\n'); } } if (methods.length > 0) { buf.append("\n").append(methods.length).append(" methods:\n"); - for (Method method : methods) { + for (final Method method : methods) { buf.append("\t").append(method).append('\n'); } } @@ -647,8 +647,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl private static String indent( final Object obj ) { - StringTokenizer tok = new StringTokenizer(obj.toString(), "\n"); - StringBuilder buf = new StringBuilder(); + final StringTokenizer tok = new StringTokenizer(obj.toString(), "\n"); + final StringBuilder buf = new StringBuilder(); while (tok.hasMoreTokens()) { buf.append("\t").append(tok.nextToken()).append("\n"); } @@ -678,7 +678,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl for (int i = 0; i < attributes.length; i++) { c.attributes[i] = attributes[i].copy(c.constant_pool); } - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { // TODO should this throw? } return c; @@ -714,10 +714,10 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl if (computedNestedTypeStatus) { return; } - for (Attribute attribute : this.attributes) { + for (final Attribute attribute : this.attributes) { if (attribute instanceof InnerClasses) { - InnerClass[] innerClasses = ((InnerClasses) attribute).getInnerClasses(); - for (InnerClass innerClasse : innerClasses) { + final InnerClass[] innerClasses = ((InnerClasses) attribute).getInnerClasses(); + for (final InnerClass innerClasse : innerClasses) { boolean innerClassAttributeRefersToMe = false; String inner_class_name = constant_pool.getConstantString(innerClasse.getInnerClassIndex(), Const.CONSTANT_Class); @@ -774,8 +774,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl if (this.equals(super_class)) { return true; } - JavaClass[] super_classes = getSuperClasses(); - for (JavaClass super_classe : super_classes) { + final JavaClass[] super_classes = getSuperClasses(); + for (final JavaClass super_classe : super_classes) { if (super_classe.equals(super_class)) { return true; } @@ -799,8 +799,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl if (this.equals(inter)) { return true; } - JavaClass[] super_interfaces = getAllInterfaces(); - for (JavaClass super_interface : super_interfaces) { + final JavaClass[] super_interfaces = getAllInterfaces(); + for (final JavaClass super_interface : super_interfaces) { if (super_interface.equals(inter)) { return true; } @@ -829,7 +829,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl */ public JavaClass[] getSuperClasses() throws ClassNotFoundException { JavaClass clazz = this; - List allSuperClasses = new ArrayList<>(); + final List allSuperClasses = new ArrayList<>(); for (clazz = clazz.getSuperClass(); clazz != null; clazz = clazz.getSuperClass()) { allSuperClasses.add(clazz); } @@ -841,8 +841,8 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * Get interfaces directly implemented by this JavaClass. */ public JavaClass[] getInterfaces() throws ClassNotFoundException { - String[] _interfaces = getInterfaceNames(); - JavaClass[] classes = new JavaClass[_interfaces.length]; + final String[] _interfaces = getInterfaceNames(); + final JavaClass[] classes = new JavaClass[_interfaces.length]; for (int i = 0; i < _interfaces.length; i++) { classes[i] = repository.loadClass(_interfaces[i]); } @@ -854,13 +854,13 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl * Get all interfaces implemented by this JavaClass (transitively). */ public JavaClass[] getAllInterfaces() throws ClassNotFoundException { - ClassQueue queue = new ClassQueue(); - Set allInterfaces = new TreeSet<>(); + final ClassQueue queue = new ClassQueue(); + final Set allInterfaces = new TreeSet<>(); queue.enqueue(this); while (!queue.empty()) { - JavaClass clazz = queue.dequeue(); - JavaClass souper = clazz.getSuperClass(); - JavaClass[] _interfaces = clazz.getInterfaces(); + final JavaClass clazz = queue.dequeue(); + final JavaClass souper = clazz.getSuperClass(); + final JavaClass[] _interfaces = clazz.getInterfaces(); if (clazz.isInterface()) { allInterfaces.add(clazz); } else { @@ -868,7 +868,7 @@ public class JavaClass extends AccessFlags implements Cloneable, Node, Comparabl queue.enqueue(souper); } } - for (JavaClass _interface : _interfaces) { + for (final JavaClass _interface : _interfaces) { queue.enqueue(_interface); } } diff --git a/src/main/java/org/apache/bcel/classfile/LineNumber.java b/src/main/java/org/apache/bcel/classfile/LineNumber.java index ac65b35f..91627a64 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumber.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumber.java @@ -140,7 +140,7 @@ public final class LineNumber implements Cloneable, Node { public LineNumber copy() { try { return (LineNumber) clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { // TODO should this throw? } return null; diff --git a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java index a94a5dfc..69b1d209 100644 --- a/src/main/java/org/apache/bcel/classfile/LineNumberTable.java +++ b/src/main/java/org/apache/bcel/classfile/LineNumberTable.java @@ -71,7 +71,7 @@ public final class LineNumberTable extends Attribute { LineNumberTable(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (LineNumber[]) null, constant_pool); - int line_number_table_length = input.readUnsignedShort(); + final int line_number_table_length = input.readUnsignedShort(); line_number_table = new LineNumber[line_number_table_length]; for (int i = 0; i < line_number_table_length; i++) { line_number_table[i] = new LineNumber(input); @@ -102,7 +102,7 @@ public final class LineNumberTable extends Attribute { public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(line_number_table.length); - for (LineNumber lineNumber : line_number_table) { + for (final LineNumber lineNumber : line_number_table) { lineNumber.dump(file); } } @@ -129,9 +129,9 @@ public final class LineNumberTable extends Attribute { */ @Override public final String toString() { - StringBuilder buf = new StringBuilder(); - StringBuilder line = new StringBuilder(); - String newLine = System.getProperty("line.separator", "\n"); + final StringBuilder buf = new StringBuilder(); + final StringBuilder line = new StringBuilder(); + final String newLine = System.getProperty("line.separator", "\n"); for (int i = 0; i < line_number_table.length; i++) { line.append(line_number_table[i].toString()); if (i < line_number_table.length - 1) { @@ -165,8 +165,8 @@ public final class LineNumberTable extends Attribute { /* Do a binary search since the array is ordered. */ do { - int i = (l + r) / 2; - int j = line_number_table[i].getStartPC(); + final int i = (l + r) / 2; + final int j = line_number_table[i].getStartPC(); if (j == pos) { return line_number_table[i].getLineNumber(); } else if (pos < j) { @@ -200,7 +200,7 @@ public final class LineNumberTable extends Attribute { public Attribute copy( final ConstantPool _constant_pool ) { // TODO could use the lower level constructor and thereby allow // line_number_table to be made final - LineNumberTable c = (LineNumberTable) clone(); + final LineNumberTable c = (LineNumberTable) clone(); c.line_number_table = new LineNumber[line_number_table.length]; for (int i = 0; i < line_number_table.length; i++) { c.line_number_table[i] = line_number_table[i].copy(); diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java index a92bc100..2594a235 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariable.java @@ -183,9 +183,9 @@ public final class LocalVariable implements Cloneable, Node, Constants { * Helper method shared with LocalVariableTypeTable */ final String toStringShared( final boolean typeTable ) { - String name = getName(); - String signature = Utility.signatureToString(getSignature(), false); - String label = "LocalVariable" + (typeTable ? "Types" : "" ); + final String name = getName(); + final String signature = Utility.signatureToString(getSignature(), false); + final String label = "LocalVariable" + (typeTable ? "Types" : "" ); return label + "(start_pc = " + start_pc + ", length = " + length + ", index = " + index + ":" + signature + " " + name + ")"; } @@ -254,7 +254,7 @@ public final class LocalVariable implements Cloneable, Node, Constants { public LocalVariable copy() { try { return (LocalVariable) clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { // TODO should this throw? } return null; diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java index 446f2a2d..b5a474b5 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTable.java @@ -69,7 +69,7 @@ public class LocalVariableTable extends Attribute { LocalVariableTable(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (LocalVariable[]) null, constant_pool); - int local_variable_table_length = input.readUnsignedShort(); + final int local_variable_table_length = input.readUnsignedShort(); local_variable_table = new LocalVariable[local_variable_table_length]; for (int i = 0; i < local_variable_table_length; i++) { local_variable_table[i] = new LocalVariable(input, constant_pool); @@ -100,7 +100,7 @@ public class LocalVariableTable extends Attribute { public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(local_variable_table.length); - for (LocalVariable variable : local_variable_table) { + for (final LocalVariable variable : local_variable_table) { variable.dump(file); } } @@ -125,7 +125,7 @@ public class LocalVariableTable extends Attribute { */ @java.lang.Deprecated public final LocalVariable getLocalVariable( final int index ) { - for (LocalVariable variable : local_variable_table) { + for (final LocalVariable variable : local_variable_table) { if (variable.getIndex() == index) { return variable; } @@ -142,10 +142,10 @@ public class LocalVariableTable extends Attribute { * @return the LocalVariable that matches or null if not found */ public final LocalVariable getLocalVariable( final int index, final int pc ) { - for (LocalVariable variable : local_variable_table) { + for (final LocalVariable variable : local_variable_table) { if (variable.getIndex() == index) { - int start_pc = variable.getStartPC(); - int end_pc = start_pc + variable.getLength(); + final int start_pc = variable.getStartPC(); + final int end_pc = start_pc + variable.getLength(); if ((pc >= start_pc) && (pc <= end_pc)) { return variable; } @@ -165,7 +165,7 @@ public class LocalVariableTable extends Attribute { */ @Override public final String toString() { - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); for (int i = 0; i < local_variable_table.length; i++) { buf.append(local_variable_table[i]); if (i < local_variable_table.length - 1) { @@ -181,7 +181,7 @@ public class LocalVariableTable extends Attribute { */ @Override public Attribute copy( final ConstantPool _constant_pool ) { - LocalVariableTable c = (LocalVariableTable) clone(); + final LocalVariableTable c = (LocalVariableTable) clone(); c.local_variable_table = new LocalVariable[local_variable_table.length]; for (int i = 0; i < local_variable_table.length; i++) { c.local_variable_table[i] = local_variable_table[i].copy(); diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java index 3f823d7a..a969efd9 100644 --- a/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java +++ b/src/main/java/org/apache/bcel/classfile/LocalVariableTypeTable.java @@ -70,7 +70,7 @@ public class LocalVariableTypeTable extends Attribute { LocalVariableTypeTable(final int nameIdx, final int len, final DataInput input, final ConstantPool cpool) throws IOException { this(nameIdx, len, (LocalVariable[]) null, cpool); - int local_variable_type_table_length = input.readUnsignedShort(); + final int local_variable_type_table_length = input.readUnsignedShort(); local_variable_type_table = new LocalVariable[local_variable_type_table_length]; for (int i = 0; i < local_variable_type_table_length; i++) { @@ -87,7 +87,7 @@ public class LocalVariableTypeTable extends Attribute { public final void dump(final DataOutputStream file) throws IOException { super.dump(file); file.writeShort(local_variable_type_table.length); - for (LocalVariable variable : local_variable_type_table) { + for (final LocalVariable variable : local_variable_type_table) { variable.dump(file); } } @@ -97,7 +97,7 @@ public class LocalVariableTypeTable extends Attribute { } public final LocalVariable getLocalVariable(final int index) { - for (LocalVariable variable : local_variable_type_table) { + for (final LocalVariable variable : local_variable_type_table) { if (variable.getIndex() == index) { return variable; } @@ -115,7 +115,7 @@ public class LocalVariableTypeTable extends Attribute { */ @Override public final String toString() { - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); for (int i = 0; i < local_variable_type_table.length; i++) { buf.append(local_variable_type_table[i].toStringShared(true)); @@ -133,7 +133,7 @@ public class LocalVariableTypeTable extends Attribute { */ @Override public Attribute copy(final ConstantPool constant_pool) { - LocalVariableTypeTable c = (LocalVariableTypeTable) clone(); + final LocalVariableTypeTable c = (LocalVariableTypeTable) clone(); c.local_variable_type_table = new LocalVariable[local_variable_type_table.length]; for (int i = 0; i < local_variable_type_table.length; i++) { diff --git a/src/main/java/org/apache/bcel/classfile/Method.java b/src/main/java/org/apache/bcel/classfile/Method.java index f370815a..d371c866 100644 --- a/src/main/java/org/apache/bcel/classfile/Method.java +++ b/src/main/java/org/apache/bcel/classfile/Method.java @@ -37,8 +37,8 @@ public final class Method extends FieldOrMethod { @Override public boolean equals( final Object o1, final Object o2 ) { - Method THIS = (Method) o1; - Method THAT = (Method) o2; + final Method THIS = (Method) o1; + final Method THAT = (Method) o2; return THIS.getName().equals(THAT.getName()) && THIS.getSignature().equals(THAT.getSignature()); } @@ -46,7 +46,7 @@ public final class Method extends FieldOrMethod { @Override public int hashCode( final Object o ) { - Method THIS = (Method) o; + final Method THIS = (Method) o; return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); } }; @@ -113,7 +113,7 @@ public final class Method extends FieldOrMethod { * @return Code attribute of method, if any */ public final Code getCode() { - for (Attribute attribute : super.getAttributes()) { + for (final Attribute attribute : super.getAttributes()) { if (attribute instanceof Code) { return (Code) attribute; } @@ -127,7 +127,7 @@ public final class Method extends FieldOrMethod { * exceptions the method may throw not exception handlers! */ public final ExceptionTable getExceptionTable() { - for (Attribute attribute : super.getAttributes()) { + for (final Attribute attribute : super.getAttributes()) { if (attribute instanceof ExceptionTable) { return (ExceptionTable) attribute; } @@ -140,7 +140,7 @@ public final class Method extends FieldOrMethod { * to the Code atribute. */ public final LocalVariableTable getLocalVariableTable() { - Code code = getCode(); + final Code code = getCode(); if (code == null) { return null; } @@ -152,7 +152,7 @@ public final class Method extends FieldOrMethod { * to the Code atribute. */ public final LineNumberTable getLineNumberTable() { - Code code = getCode(); + final Code code = getCode(); if (code == null) { return null; } @@ -168,23 +168,23 @@ public final class Method extends FieldOrMethod { */ @Override public final String toString() { - String access = Utility.accessToString(super.getAccessFlags()); + final String access = Utility.accessToString(super.getAccessFlags()); // Get name and signature from constant pool ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(super.getSignatureIndex(), Const.CONSTANT_Utf8); String signature = c.getBytes(); c = (ConstantUtf8) super.getConstantPool().getConstant(super.getNameIndex(), Const.CONSTANT_Utf8); - String name = c.getBytes(); + final String name = c.getBytes(); signature = Utility.methodSignatureToString(signature, name, access, true, getLocalVariableTable()); - StringBuilder buf = new StringBuilder(signature); - for (Attribute attribute : super.getAttributes()) { + final StringBuilder buf = new StringBuilder(signature); + for (final Attribute attribute : super.getAttributes()) { if (!((attribute instanceof Code) || (attribute instanceof ExceptionTable))) { buf.append(" [").append(attribute).append("]"); } } - ExceptionTable e = getExceptionTable(); + final ExceptionTable e = getExceptionTable(); if (e != null) { - String str = e.toString(); + final String str = e.toString(); if (!str.isEmpty()) { buf.append("\n\t\tthrows ").append(str); } diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameter.java b/src/main/java/org/apache/bcel/classfile/MethodParameter.java index fac9b6b3..63a1a7ed 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameter.java +++ b/src/main/java/org/apache/bcel/classfile/MethodParameter.java @@ -108,7 +108,7 @@ public class MethodParameter implements Cloneable { public MethodParameter copy() { try { return (MethodParameter) clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { // TODO should this throw? } return null; diff --git a/src/main/java/org/apache/bcel/classfile/MethodParameters.java b/src/main/java/org/apache/bcel/classfile/MethodParameters.java index abb1420f..b6e22795 100644 --- a/src/main/java/org/apache/bcel/classfile/MethodParameters.java +++ b/src/main/java/org/apache/bcel/classfile/MethodParameters.java @@ -37,7 +37,7 @@ public class MethodParameters extends Attribute { MethodParameters(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { super(Const.ATTR_METHOD_PARAMETERS, name_index, length, constant_pool); - int parameters_count = input.readUnsignedByte(); + final int parameters_count = input.readUnsignedByte(); parameters = new MethodParameter[parameters_count]; for (int i = 0; i < parameters_count; i++) { parameters[i] = new MethodParameter(input); @@ -59,7 +59,7 @@ public class MethodParameters extends Attribute { @Override public Attribute copy(final ConstantPool _constant_pool) { - MethodParameters c = (MethodParameters) clone(); + final MethodParameters c = (MethodParameters) clone(); c.parameters = new MethodParameter[parameters.length]; for (int i = 0; i < parameters.length; i++) { @@ -79,7 +79,7 @@ public class MethodParameters extends Attribute { public void dump(final DataOutputStream file) throws IOException { super.dump(file); file.writeByte(parameters.length); - for (MethodParameter parameter : parameters) { + for (final MethodParameter parameter : parameters) { parameter.dump(file); } } diff --git a/src/main/java/org/apache/bcel/classfile/PMGClass.java b/src/main/java/org/apache/bcel/classfile/PMGClass.java index 58ba9bff..e6c08064 100644 --- a/src/main/java/org/apache/bcel/classfile/PMGClass.java +++ b/src/main/java/org/apache/bcel/classfile/PMGClass.java @@ -138,7 +138,7 @@ public final class PMGClass extends Attribute { * @return PMG name. */ public final String getPMGName() { - ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(pmg_index, + final ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(pmg_index, Const.CONSTANT_Utf8); return c.getBytes(); } @@ -148,7 +148,7 @@ public final class PMGClass extends Attribute { * @return PMG class name. */ public final String getPMGClassName() { - ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(pmg_class_index, + final ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(pmg_class_index, Const.CONSTANT_Utf8); return c.getBytes(); } diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java index 743063c9..8a8bf247 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotationEntry.java @@ -42,7 +42,7 @@ public class ParameterAnnotationEntry implements Node { * @throws IOException */ ParameterAnnotationEntry(final DataInput input, final ConstantPool constant_pool) throws IOException { - int annotation_table_length = input.readUnsignedShort(); + final int annotation_table_length = input.readUnsignedShort(); annotation_table = new AnnotationEntry[annotation_table_length]; for (int i = 0; i < annotation_table_length; i++) { // TODO isRuntimeVisible @@ -72,17 +72,17 @@ public class ParameterAnnotationEntry implements Node { public void dump(final DataOutputStream dos) throws IOException { dos.writeShort(annotation_table.length); - for (AnnotationEntry entry : annotation_table) { + for (final AnnotationEntry entry : annotation_table) { entry.dump(dos); } } public static ParameterAnnotationEntry[] createParameterAnnotationEntries(final Attribute[] attrs) { // Find attributes that contain parameter annotation data - List accumulatedAnnotations = new ArrayList<>(attrs.length); - for (Attribute attribute : attrs) { + final List accumulatedAnnotations = new ArrayList<>(attrs.length); + for (final Attribute attribute : attrs) { if (attribute instanceof ParameterAnnotations) { - ParameterAnnotations runtimeAnnotations = (ParameterAnnotations)attribute; + final ParameterAnnotations runtimeAnnotations = (ParameterAnnotations)attribute; Collections.addAll(accumulatedAnnotations, runtimeAnnotations.getParameterAnnotationEntries()); } } diff --git a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java index ff9cfeef..09ceb672 100644 --- a/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java +++ b/src/main/java/org/apache/bcel/classfile/ParameterAnnotations.java @@ -43,7 +43,7 @@ public abstract class ParameterAnnotations extends Attribute { final DataInput input, final ConstantPool constant_pool) throws IOException { this(parameter_annotation_type, name_index, length, (ParameterAnnotationEntry[]) null, constant_pool); - int num_parameters = input.readUnsignedByte(); + final int num_parameters = input.readUnsignedByte(); parameter_annotation_table = new ParameterAnnotationEntry[num_parameters]; for (int i = 0; i < num_parameters; i++) { parameter_annotation_table[i] = new ParameterAnnotationEntry(input, constant_pool); @@ -107,7 +107,7 @@ public abstract class ParameterAnnotations extends Attribute { super.dump(dos); dos.writeByte(parameter_annotation_table.length); - for (ParameterAnnotationEntry element : parameter_annotation_table) { + for (final ParameterAnnotationEntry element : parameter_annotation_table) { element.dump(dos); } diff --git a/src/main/java/org/apache/bcel/classfile/Signature.java b/src/main/java/org/apache/bcel/classfile/Signature.java index 7b605b27..785a5200 100644 --- a/src/main/java/org/apache/bcel/classfile/Signature.java +++ b/src/main/java/org/apache/bcel/classfile/Signature.java @@ -118,7 +118,7 @@ public final class Signature extends Attribute { * @return GJ signature. */ public final String getSignature() { - ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(signature_index, + final ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(signature_index, Const.CONSTANT_Utf8); return c.getBytes(); } @@ -159,7 +159,7 @@ public final class Signature extends Attribute { } //System.out.println("return from ident:" + (char)ch); if (!identStart(ch)) { - StringBuilder buf2 = new StringBuilder(); + final StringBuilder buf2 = new StringBuilder(); int count = 1; while (Character.isJavaIdentifierPart((char) ch)) { buf2.append((char) ch); @@ -179,7 +179,7 @@ public final class Signature extends Attribute { } return; } - StringBuilder buf2 = new StringBuilder(); + final StringBuilder buf2 = new StringBuilder(); ch = in.read(); do { buf2.append((char) ch); @@ -232,7 +232,7 @@ public final class Signature extends Attribute { public static String translate( final String s ) { //System.out.println("Sig:" + s); - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); matchGJIdent(new MyByteArrayInputStream(s), buf); return buf.toString(); } @@ -255,7 +255,7 @@ public final class Signature extends Attribute { */ @Override public final String toString() { - String s = getSignature(); + final String s = getSignature(); return "Signature: " + s; } diff --git a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java index bf3ed572..d74202f3 100644 --- a/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java +++ b/src/main/java/org/apache/bcel/classfile/SimpleElementValue.java @@ -54,7 +54,7 @@ public class SimpleElementValue extends ElementValue throw new RuntimeException( "Dont call getValueString() on a non STRING ElementValue"); } - ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(getIndex(), + final ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(getIndex(), Const.CONSTANT_Utf8); return c.getBytes(); } @@ -65,7 +65,7 @@ public class SimpleElementValue extends ElementValue throw new RuntimeException( "Dont call getValueString() on a non STRING ElementValue"); } - ConstantInteger c = (ConstantInteger) super.getConstantPool().getConstant(getIndex(), + final ConstantInteger c = (ConstantInteger) super.getConstantPool().getConstant(getIndex(), Const.CONSTANT_Integer); return c.getBytes(); } @@ -76,7 +76,7 @@ public class SimpleElementValue extends ElementValue throw new RuntimeException( "Dont call getValueByte() on a non BYTE ElementValue"); } - ConstantInteger c = (ConstantInteger) super.getConstantPool().getConstant(getIndex(), + final ConstantInteger c = (ConstantInteger) super.getConstantPool().getConstant(getIndex(), Const.CONSTANT_Integer); return (byte) c.getBytes(); } @@ -87,7 +87,7 @@ public class SimpleElementValue extends ElementValue throw new RuntimeException( "Dont call getValueChar() on a non CHAR ElementValue"); } - ConstantInteger c = (ConstantInteger) super.getConstantPool().getConstant(getIndex(), + final ConstantInteger c = (ConstantInteger) super.getConstantPool().getConstant(getIndex(), Const.CONSTANT_Integer); return (char) c.getBytes(); } @@ -98,7 +98,7 @@ public class SimpleElementValue extends ElementValue throw new RuntimeException( "Dont call getValueLong() on a non LONG ElementValue"); } - ConstantLong j = (ConstantLong) super.getConstantPool().getConstant(getIndex()); + final ConstantLong j = (ConstantLong) super.getConstantPool().getConstant(getIndex()); return j.getBytes(); } @@ -108,7 +108,7 @@ public class SimpleElementValue extends ElementValue throw new RuntimeException( "Dont call getValueFloat() on a non FLOAT ElementValue"); } - ConstantFloat f = (ConstantFloat) super.getConstantPool().getConstant(getIndex()); + final ConstantFloat f = (ConstantFloat) super.getConstantPool().getConstant(getIndex()); return f.getBytes(); } @@ -118,7 +118,7 @@ public class SimpleElementValue extends ElementValue throw new RuntimeException( "Dont call getValueDouble() on a non DOUBLE ElementValue"); } - ConstantDouble d = (ConstantDouble) super.getConstantPool().getConstant(getIndex()); + final ConstantDouble d = (ConstantDouble) super.getConstantPool().getConstant(getIndex()); return d.getBytes(); } @@ -128,7 +128,7 @@ public class SimpleElementValue extends ElementValue throw new RuntimeException( "Dont call getValueBoolean() on a non BOOLEAN ElementValue"); } - ConstantInteger bo = (ConstantInteger) super.getConstantPool().getConstant(getIndex()); + final ConstantInteger bo = (ConstantInteger) super.getConstantPool().getConstant(getIndex()); return bo.getBytes() != 0; } @@ -138,7 +138,7 @@ public class SimpleElementValue extends ElementValue throw new RuntimeException( "Dont call getValueShort() on a non SHORT ElementValue"); } - ConstantInteger s = (ConstantInteger) super.getConstantPool().getConstant(getIndex()); + final ConstantInteger s = (ConstantInteger) super.getConstantPool().getConstant(getIndex()); return (short) s.getBytes(); } @@ -152,47 +152,47 @@ public class SimpleElementValue extends ElementValue @Override public String stringifyValue() { - ConstantPool cpool = super.getConstantPool(); + final ConstantPool cpool = super.getConstantPool(); final int _type = super.getType(); switch (_type) { case PRIMITIVE_INT: - ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), + final ConstantInteger c = (ConstantInteger) cpool.getConstant(getIndex(), Const.CONSTANT_Integer); return Integer.toString(c.getBytes()); case PRIMITIVE_LONG: - ConstantLong j = (ConstantLong) cpool.getConstant(getIndex(), + final ConstantLong j = (ConstantLong) cpool.getConstant(getIndex(), Const.CONSTANT_Long); return Long.toString(j.getBytes()); case PRIMITIVE_DOUBLE: - ConstantDouble d = (ConstantDouble) cpool.getConstant(getIndex(), + final ConstantDouble d = (ConstantDouble) cpool.getConstant(getIndex(), Const.CONSTANT_Double); return Double.toString(d.getBytes()); case PRIMITIVE_FLOAT: - ConstantFloat f = (ConstantFloat) cpool.getConstant(getIndex(), + final ConstantFloat f = (ConstantFloat) cpool.getConstant(getIndex(), Const.CONSTANT_Float); return Float.toString(f.getBytes()); case PRIMITIVE_SHORT: - ConstantInteger s = (ConstantInteger) cpool.getConstant(getIndex(), + final ConstantInteger s = (ConstantInteger) cpool.getConstant(getIndex(), Const.CONSTANT_Integer); return Integer.toString(s.getBytes()); case PRIMITIVE_BYTE: - ConstantInteger b = (ConstantInteger) cpool.getConstant(getIndex(), + final ConstantInteger b = (ConstantInteger) cpool.getConstant(getIndex(), Const.CONSTANT_Integer); return Integer.toString(b.getBytes()); case PRIMITIVE_CHAR: - ConstantInteger ch = (ConstantInteger) cpool.getConstant( + final ConstantInteger ch = (ConstantInteger) cpool.getConstant( getIndex(), Const.CONSTANT_Integer); return String.valueOf((char)ch.getBytes()); case PRIMITIVE_BOOLEAN: - ConstantInteger bo = (ConstantInteger) cpool.getConstant( + final ConstantInteger bo = (ConstantInteger) cpool.getConstant( getIndex(), Const.CONSTANT_Integer); if (bo.getBytes() == 0) { return "false"; } return "true"; case STRING: - ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(getIndex(), + final ConstantUtf8 cu8 = (ConstantUtf8) cpool.getConstant(getIndex(), Const.CONSTANT_Utf8); return cu8.getBytes(); default: diff --git a/src/main/java/org/apache/bcel/classfile/SourceFile.java b/src/main/java/org/apache/bcel/classfile/SourceFile.java index 5b84444f..604c918c 100644 --- a/src/main/java/org/apache/bcel/classfile/SourceFile.java +++ b/src/main/java/org/apache/bcel/classfile/SourceFile.java @@ -125,7 +125,7 @@ public final class SourceFile extends Attribute { * @return Source file name. */ public final String getSourceFileName() { - ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(sourcefile_index, + final ConstantUtf8 c = (ConstantUtf8) super.getConstantPool().getConstant(sourcefile_index, Const.CONSTANT_Utf8); return c.getBytes(); } diff --git a/src/main/java/org/apache/bcel/classfile/StackMap.java b/src/main/java/org/apache/bcel/classfile/StackMap.java index 6cdfc8f0..17f43ff8 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMap.java +++ b/src/main/java/org/apache/bcel/classfile/StackMap.java @@ -65,7 +65,7 @@ public final class StackMap extends Attribute { */ StackMap(final int name_index, final int length, final DataInput input, final ConstantPool constant_pool) throws IOException { this(name_index, length, (StackMapEntry[]) null, constant_pool); - int map_length = input.readUnsignedShort(); + final int map_length = input.readUnsignedShort(); map = new StackMapEntry[map_length]; for (int i = 0; i < map_length; i++) { map[i] = new StackMapEntry(input, constant_pool); @@ -83,7 +83,7 @@ public final class StackMap extends Attribute { public final void dump( final DataOutputStream file ) throws IOException { super.dump(file); file.writeShort(map.length); - for (StackMapEntry entry : map) { + for (final StackMapEntry entry : map) { entry.dump(file); } } @@ -103,7 +103,7 @@ public final class StackMap extends Attribute { public final void setStackMap( final StackMapEntry[] map ) { this.map = map; int len = 2; // Length of 'number_of_entries' field prior to the array of stack maps - for (StackMapEntry element : map) { + for (final StackMapEntry element : map) { len += element.getMapEntrySize(); } setLength(len); @@ -115,7 +115,7 @@ public final class StackMap extends Attribute { */ @Override public final String toString() { - StringBuilder buf = new StringBuilder("StackMap("); + final StringBuilder buf = new StringBuilder("StackMap("); for (int i = 0; i < map.length; i++) { buf.append(map[i]); if (i < map.length - 1) { @@ -132,7 +132,7 @@ public final class StackMap extends Attribute { */ @Override public Attribute copy( final ConstantPool _constant_pool ) { - StackMap c = (StackMap) clone(); + final StackMap c = (StackMap) clone(); c.map = new StackMapEntry[map.length]; for (int i = 0; i < map.length; i++) { c.map[i] = map[i].copy(); diff --git a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java index a7a74a8e..fe850584 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapEntry.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapEntry.java @@ -67,19 +67,19 @@ public final class StackMapEntry implements Node, Cloneable byte_code_offset = input.readShort(); } else if (frame_type >= Const.APPEND_FRAME && frame_type <= Const.APPEND_FRAME_MAX) { byte_code_offset = input.readShort(); - int number_of_locals = frame_type - 251; + final int number_of_locals = frame_type - 251; types_of_locals = new StackMapType[number_of_locals]; for (int i = 0; i < number_of_locals; i++) { types_of_locals[i] = new StackMapType(input, constant_pool); } } else if (frame_type == Const.FULL_FRAME) { byte_code_offset = input.readShort(); - int number_of_locals = input.readShort(); + final int number_of_locals = input.readShort(); types_of_locals = new StackMapType[number_of_locals]; for (int i = 0; i < number_of_locals; i++) { types_of_locals[i] = new StackMapType(input, constant_pool); } - int number_of_stack_items = input.readShort(); + final int number_of_stack_items = input.readShort(); types_of_stack_items = new StackMapType[number_of_stack_items]; for (int i = 0; i < number_of_stack_items; i++) { types_of_stack_items[i] = new StackMapType(input, constant_pool); @@ -154,17 +154,17 @@ public final class StackMapEntry implements Node, Cloneable file.writeShort(byte_code_offset); } else if (frame_type >= Const.APPEND_FRAME && frame_type <= Const.APPEND_FRAME_MAX) { file.writeShort(byte_code_offset); - for (StackMapType type : types_of_locals) { + for (final StackMapType type : types_of_locals) { type.dump(file); } } else if (frame_type == Const.FULL_FRAME) { file.writeShort(byte_code_offset); file.writeShort(types_of_locals.length); - for (StackMapType type : types_of_locals) { + for (final StackMapType type : types_of_locals) { type.dump(file); } file.writeShort(types_of_stack_items.length); - for (StackMapType type : types_of_stack_items) { + for (final StackMapType type : types_of_stack_items) { type.dump(file); } } else { @@ -179,7 +179,7 @@ public final class StackMapEntry implements Node, Cloneable */ @Override public final String toString() { - StringBuilder buf = new StringBuilder(64); + final StringBuilder buf = new StringBuilder(64); buf.append("("); if (frame_type >= Const.SAME_FRAME && frame_type <= Const.SAME_FRAME_MAX) { buf.append("SAME"); @@ -243,16 +243,16 @@ public final class StackMapEntry implements Node, Cloneable return 3; } else if (frame_type >= Const.APPEND_FRAME && frame_type <= Const.APPEND_FRAME_MAX) { int len = 3; - for (StackMapType types_of_local : types_of_locals) { + for (final StackMapType types_of_local : types_of_locals) { len += types_of_local.hasIndex() ? 3 : 1; } return len; } else if (frame_type == Const.FULL_FRAME) { int len = 7; - for (StackMapType types_of_local : types_of_locals) { + for (final StackMapType types_of_local : types_of_locals) { len += types_of_local.hasIndex() ? 3 : 1; } - for (StackMapType types_of_stack_item : types_of_stack_items) { + for (final StackMapType types_of_stack_item : types_of_stack_items) { len += types_of_stack_item.hasIndex() ? 3 : 1; } return len; @@ -382,7 +382,7 @@ public final class StackMapEntry implements Node, Cloneable StackMapEntry e; try { e = (StackMapEntry) clone(); - } catch (CloneNotSupportedException ex) { + } catch (final CloneNotSupportedException ex) { throw new Error("Clone Not Supported"); } diff --git a/src/main/java/org/apache/bcel/classfile/StackMapType.java b/src/main/java/org/apache/bcel/classfile/StackMapType.java index a98a88d8..71781bea 100644 --- a/src/main/java/org/apache/bcel/classfile/StackMapType.java +++ b/src/main/java/org/apache/bcel/classfile/StackMapType.java @@ -143,7 +143,7 @@ public final class StackMapType implements Cloneable { public StackMapType copy() { try { return (StackMapType) clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { // TODO should this throw? } return null; diff --git a/src/main/java/org/apache/bcel/classfile/Synthetic.java b/src/main/java/org/apache/bcel/classfile/Synthetic.java index 44bdc8a2..46f2d856 100644 --- a/src/main/java/org/apache/bcel/classfile/Synthetic.java +++ b/src/main/java/org/apache/bcel/classfile/Synthetic.java @@ -132,7 +132,7 @@ public final class Synthetic extends Attribute { */ @Override public final String toString() { - StringBuilder buf = new StringBuilder("Synthetic"); + final StringBuilder buf = new StringBuilder("Synthetic"); if (super.getLength() > 0) { buf.append(" ").append(Utility.toHexString(bytes)); } @@ -145,7 +145,7 @@ public final class Synthetic extends Attribute { */ @Override public Attribute copy( final ConstantPool _constant_pool ) { - Synthetic c = (Synthetic) clone(); + final Synthetic c = (Synthetic) clone(); if (bytes != null) { c.bytes = new byte[bytes.length]; System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); diff --git a/src/main/java/org/apache/bcel/classfile/Unknown.java b/src/main/java/org/apache/bcel/classfile/Unknown.java index 22757709..958b6c05 100644 --- a/src/main/java/org/apache/bcel/classfile/Unknown.java +++ b/src/main/java/org/apache/bcel/classfile/Unknown.java @@ -48,7 +48,7 @@ public final class Unknown extends Attribute { /** @return array of unknown attributes, but just one for each kind. */ static Unknown[] getUnknownAttributes() { - Unknown[] unknowns = new Unknown[unknown_attributes.size()]; + final Unknown[] unknowns = new Unknown[unknown_attributes.size()]; unknown_attributes.values().toArray(unknowns); unknown_attributes.clear(); return unknowns; @@ -163,7 +163,7 @@ public final class Unknown extends Attribute { } String hex; if (super.getLength() > 10) { - byte[] tmp = new byte[10]; + final byte[] tmp = new byte[10]; System.arraycopy(bytes, 0, tmp, 0, 10); hex = Utility.toHexString(tmp) + "... (truncated)"; } else { @@ -178,7 +178,7 @@ public final class Unknown extends Attribute { */ @Override public Attribute copy( final ConstantPool _constant_pool ) { - Unknown c = (Unknown) clone(); + final Unknown c = (Unknown) clone(); if (bytes != null) { c.bytes = new byte[bytes.length]; System.arraycopy(bytes, 0, c.bytes, 0, bytes.length); diff --git a/src/main/java/org/apache/bcel/classfile/Utility.java b/src/main/java/org/apache/bcel/classfile/Utility.java index 7bee6dac..ab16cda8 100644 --- a/src/main/java/org/apache/bcel/classfile/Utility.java +++ b/src/main/java/org/apache/bcel/classfile/Utility.java @@ -100,7 +100,7 @@ public abstract class Utility { * @return String representation of flags */ public static String accessToString( final int access_flags, final boolean for_class ) { - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); int p = 0; for (int i = 0; p < Const.MAX_ACC_FLAG; i++) { // Loop through known flags p = pow2(i); @@ -146,18 +146,18 @@ public abstract class Utility { */ public static String codeToString( final byte[] code, final ConstantPool constant_pool, final int index, final int length, final boolean verbose ) { - StringBuilder buf = new StringBuilder(code.length * 20); // Should be sufficient // CHECKSTYLE IGNORE MagicNumber + final StringBuilder buf = new StringBuilder(code.length * 20); // Should be sufficient // CHECKSTYLE IGNORE MagicNumber try (ByteSequence stream = new ByteSequence(code)) { for (int i = 0; i < index; i++) { codeToString(stream, constant_pool, verbose); } for (int i = 0; stream.available() > 0; i++) { if ((length < 0) || (i < length)) { - String indices = fillup(stream.getIndex() + ":", 6, true, ' '); + final String indices = fillup(stream.getIndex() + ":", 6, true, ' '); buf.append(indices).append(codeToString(stream, constant_pool, verbose)).append('\n'); } } - } catch (IOException e) { + } catch (final IOException e) { throw new ClassFormatException("Byte code error: " + buf.toString(), e); } return buf.toString(); @@ -182,7 +182,7 @@ public abstract class Utility { */ public static String codeToString( final ByteSequence bytes, final ConstantPool constant_pool, final boolean verbose ) throws IOException { - short opcode = (short) bytes.readUnsignedByte(); + final short opcode = (short) bytes.readUnsignedByte(); int default_offset = 0; int low; int high; @@ -194,12 +194,12 @@ public abstract class Utility { int[] jump_table; int no_pad_bytes = 0; int offset; - StringBuilder buf = new StringBuilder(Const.getOpcodeName(opcode)); + final StringBuilder buf = new StringBuilder(Const.getOpcodeName(opcode)); /* Special case: Skip (0-3) padding bytes, i.e., the * following bytes are 4-byte-aligned */ if ((opcode == Const.TABLESWITCH) || (opcode == Const.LOOKUPSWITCH)) { - int remainder = bytes.getIndex() % 4; + final int remainder = bytes.getIndex() % 4; no_pad_bytes = (remainder == 0) ? 0 : 4 - remainder; for (int i = 0; i < no_pad_bytes; i++) { byte b; @@ -344,7 +344,7 @@ public abstract class Utility { case Const.INVOKESPECIAL: case Const.INVOKESTATIC: index = bytes.readUnsignedShort(); - Constant c = constant_pool.getConstant(index); + final Constant c = constant_pool.getConstant(index); // With Java8 operand may be either a CONSTANT_Methodref // or a CONSTANT_InterfaceMethodref. (markro) buf.append("\t").append( @@ -359,7 +359,7 @@ public abstract class Utility { break; case Const.INVOKEINTERFACE: index = bytes.readUnsignedShort(); - int nargs = bytes.readUnsignedByte(); // historical, redundant + final int nargs = bytes.readUnsignedByte(); // historical, redundant buf.append("\t").append( constant_pool .constantToString(index, Const.CONSTANT_InterfaceMethodref)) @@ -403,7 +403,7 @@ public abstract class Utility { */ case Const.MULTIANEWARRAY: { index = bytes.readUnsignedShort(); - int dimensions = bytes.readUnsignedByte(); + final int dimensions = bytes.readUnsignedByte(); buf.append("\t<").append( compactClassName(constant_pool.getConstantString(index, Const.CONSTANT_Class), false)).append(">\t").append(dimensions) @@ -477,7 +477,7 @@ public abstract class Utility { * @return Compacted class name */ public static String compactClassName( String str, final String prefix, final boolean chopit ) { - int len = prefix.length(); + final int len = prefix.length(); str = str.replace('/', '.'); // Is `/' on all systems, even DOS if (chopit) { // If string starts with `prefix' and contains no further dots @@ -516,7 +516,7 @@ public abstract class Utility { * @return `flag' with bit `i' set to 0 */ public static int clearBit( final int flag, final int i ) { - int bit = pow2(i); + final int bit = pow2(i); return (flag & bit) == 0 ? flag : flag ^ bit; } @@ -541,10 +541,10 @@ public abstract class Utility { */ public static String methodTypeToSignature( final String ret, final String[] argv ) throws ClassFormatException { - StringBuilder buf = new StringBuilder("("); + final StringBuilder buf = new StringBuilder("("); String str; if (argv != null) { - for (String element : argv) { + for (final String element : argv) { str = getSignature(element); if (str.endsWith("V")) { throw new ClassFormatException("Invalid type: " + element); @@ -577,7 +577,7 @@ public abstract class Utility { */ public static String[] methodSignatureArgumentTypes( final String signature, final boolean chopit ) throws ClassFormatException { - List vec = new ArrayList<>(); + final List vec = new ArrayList<>(); int index; try { // Read all declarations between for `(' and `)' if (signature.charAt(0) != '(') { @@ -589,7 +589,7 @@ public abstract class Utility { //corrected concurrent private static field acess index += unwrap(consumed_chars); // update position } - } catch (StringIndexOutOfBoundsException e) { // Should never occur + } catch (final StringIndexOutOfBoundsException e) { // Should never occur throw new ClassFormatException("Invalid method signature: " + signature, e); } return vec.toArray(new String[vec.size()]); @@ -619,7 +619,7 @@ public abstract class Utility { // Read return type after `)' index = signature.lastIndexOf(')') + 1; type = signatureToString(signature.substring(index), chopit); - } catch (StringIndexOutOfBoundsException e) { // Should never occur + } catch (final StringIndexOutOfBoundsException e) { // Should never occur throw new ClassFormatException("Invalid method signature: " + signature, e); } return type; @@ -681,7 +681,7 @@ public abstract class Utility { */ public static String methodSignatureToString( final String signature, final String name, final String access, final boolean chopit, final LocalVariableTable vars ) throws ClassFormatException { - StringBuilder buf = new StringBuilder("("); + final StringBuilder buf = new StringBuilder("("); String type; int index; int var_index = access.contains("static") ? 0 : 1; @@ -691,10 +691,10 @@ public abstract class Utility { } index = 1; // current string position while (signature.charAt(index) != ')') { - String param_type = signatureToString(signature.substring(index), chopit); + final String param_type = signatureToString(signature.substring(index), chopit); buf.append(param_type); if (vars != null) { - LocalVariable l = vars.getLocalVariable(var_index, 0); + final LocalVariable l = vars.getLocalVariable(var_index, 0); if (l != null) { buf.append(" ").append(l.getName()); } @@ -713,7 +713,7 @@ public abstract class Utility { index++; // update position // Read return type after `)' type = signatureToString(signature.substring(index), chopit); - } catch (StringIndexOutOfBoundsException e) { // Should never occur + } catch (final StringIndexOutOfBoundsException e) { // Should never occur throw new ClassFormatException("Invalid method signature: " + signature, e); } if (buf.length() > 1) { @@ -744,7 +744,7 @@ public abstract class Utility { int old_index; try { if (str.contains(old)) { // `old' found in str - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); old_index = 0; // String start offset // While we have something to replace while ((index = str.indexOf(old, old_index)) != -1) { @@ -755,7 +755,7 @@ public abstract class Utility { buf.append(str.substring(old_index)); // append rest of string str = buf.toString(); } - } catch (StringIndexOutOfBoundsException e) { // Should not occur + } catch (final StringIndexOutOfBoundsException e) { // Should not occur System.err.println(e); } return str; @@ -825,7 +825,7 @@ public abstract class Utility { case 'J': return "long"; case 'T': { // TypeVariableSignature - int index = signature.indexOf(';'); // Look for closing `;' + final int index = signature.indexOf(';'); // Look for closing `;' if (index < 0) { throw new ClassFormatException("Invalid signature: " + signature); } @@ -845,12 +845,12 @@ public abstract class Utility { throw new ClassFormatException("Invalid signature: " + signature); } } - int index = signature.indexOf(';', fromIndex); // Look for closing `;' + final int index = signature.indexOf(';', fromIndex); // Look for closing `;' if (index < 0) { throw new ClassFormatException("Invalid signature: " + signature); } // check to see if there are any TypeArguments - int bracketIndex = signature.substring(0, index).indexOf('<'); + final int bracketIndex = signature.substring(0, index).indexOf('<'); if (bracketIndex < 0) { // just a class identifier wrap(consumed_chars, index + 1); // "Lblabla;" `L' and `;' are removed @@ -859,7 +859,7 @@ public abstract class Utility { // we have TypeArguments; build up partial result // as we recurse for each TypeArgument - StringBuilder type = new StringBuilder(compactClassName(signature.substring(1, bracketIndex), chopit)).append("<"); + final StringBuilder type = new StringBuilder(compactClassName(signature.substring(1, bracketIndex), chopit)).append("<"); int consumed_chars = bracketIndex + 1; // Shadows global var // check for wildcards @@ -920,7 +920,7 @@ public abstract class Utility { type = signatureToString(signature.substring(n), chopit); //corrected concurrent private static field acess //Utility.consumed_chars += consumed_chars; is replaced by: - int _temp = unwrap(Utility.consumed_chars) + consumed_chars; + final int _temp = unwrap(Utility.consumed_chars) + consumed_chars; wrap(Utility.consumed_chars, _temp); return type + brackets.toString(); } @@ -929,7 +929,7 @@ public abstract class Utility { default: throw new ClassFormatException("Invalid signature: `" + signature + "'"); } - } catch (StringIndexOutOfBoundsException e) { // Should never occur + } catch (final StringIndexOutOfBoundsException e) { // Should never occur throw new ClassFormatException("Invalid signature: " + signature, e); } } @@ -942,8 +942,8 @@ public abstract class Utility { * @return byte code signature */ public static String getSignature( String type ) { - StringBuilder buf = new StringBuilder(); - char[] chars = type.toCharArray(); + final StringBuilder buf = new StringBuilder(); + final char[] chars = type.toCharArray(); boolean char_found = false; boolean delim = false; int index = -1; @@ -995,10 +995,10 @@ public abstract class Utility { private static int countBrackets( final String brackets ) { - char[] chars = brackets.toCharArray(); + final char[] chars = brackets.toCharArray(); int count = 0; boolean open = false; - for (char c : chars) { + for (final char c : chars) { switch (c) { case '[': if (open) { @@ -1042,7 +1042,7 @@ public abstract class Utility { } index = signature.lastIndexOf(')') + 1; return typeOfSignature(signature.substring(index)); - } catch (StringIndexOutOfBoundsException e) { + } catch (final StringIndexOutOfBoundsException e) { throw new ClassFormatException("Invalid method signature: " + signature, e); } } @@ -1086,7 +1086,7 @@ public abstract class Utility { default: throw new ClassFormatException("Invalid method signature: " + signature); } - } catch (StringIndexOutOfBoundsException e) { + } catch (final StringIndexOutOfBoundsException e) { throw new ClassFormatException("Invalid method signature: " + signature, e); } } @@ -1121,10 +1121,10 @@ public abstract class Utility { * @return bytes as hexadecimal string, e.g. 00 fa 12 ... */ public static String toHexString( final byte[] bytes ) { - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { - short b = byteToShort(bytes[i]); - String hex = Integer.toHexString(b); + final short b = byteToShort(bytes[i]); + final String hex = Integer.toHexString(b); if (b < 0x10) { buf.append('0'); } @@ -1162,8 +1162,8 @@ public abstract class Utility { * @return formatted string */ public static String fillup( final String str, final int length, final boolean left_justify, final char fill ) { - int len = length - str.length(); - char[] buf = new char[(len < 0) ? 0 : len]; + final int len = length - str.length(); + final char[] buf = new char[(len < 0) ? 0 : len]; for (int j = 0; j < buf.length; j++) { buf[j] = fill; } @@ -1212,7 +1212,7 @@ public abstract class Utility { if (obj == null) { return null; } - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); if (braces) { buf.append('{'); } @@ -1272,10 +1272,10 @@ public abstract class Utility { bytes = baos.toByteArray(); } } - CharArrayWriter caw = new CharArrayWriter(); + final CharArrayWriter caw = new CharArrayWriter(); try (JavaWriter jw = new JavaWriter(caw)) { - for (byte b : bytes) { - int in = b & 0x000000ff; // Normalize to unsigned + for (final byte b : bytes) { + final int in = b & 0x000000ff; // Normalize to unsigned jw.write(in); } } @@ -1302,8 +1302,8 @@ public abstract class Utility { bytes = bos.toByteArray(); } if (uncompress) { - GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes)); - byte[] tmp = new byte[bytes.length * 3]; // Rough estimate + final GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes)); + final byte[] tmp = new byte[bytes.length * 3]; // Rough estimate int count = 0; int b; while ((b = gis.read()) >= 0) { @@ -1352,23 +1352,23 @@ public abstract class Utility { @Override public int read() throws IOException { - int b = in.read(); + final int b = in.read(); if (b != ESCAPE_CHAR) { return b; } - int i = in.read(); + final int i = in.read(); if (i < 0) { return -1; } if (((i >= '0') && (i <= '9')) || ((i >= 'a') && (i <= 'f'))) { // Normal escape - int j = in.read(); + final int j = in.read(); if (j < 0) { return -1; } - char[] tmp = { + final char[] tmp = { (char) i, (char) j }; - int s = Integer.parseInt(new String(tmp), 16); + final int s = Integer.parseInt(new String(tmp), 16); return s; } return MAP_CHAR[i]; @@ -1405,7 +1405,7 @@ public abstract class Utility { if (b >= 0 && b < FREE_CHARS) { out.write(CHAR_MAP[b]); } else { // Normal escape - char[] tmp = Integer.toHexString(b).toCharArray(); + final char[] tmp = Integer.toHexString(b).toCharArray(); if (tmp.length == 1) { out.write('0'); out.write(tmp[0]); @@ -1437,9 +1437,9 @@ public abstract class Utility { * Escape all occurences of newline chars '\n', quotes \", etc. */ public static String convertString( final String label ) { - char[] ch = label.toCharArray(); - StringBuilder buf = new StringBuilder(); - for (char element : ch) { + final char[] ch = label.toCharArray(); + final StringBuilder buf = new StringBuilder(); + for (final char element : ch) { switch (element) { case '\n': buf.append("\\n"); diff --git a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java index a90a600d..016655de 100644 --- a/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java +++ b/src/main/java/org/apache/bcel/generic/AnnotationEntryGen.java @@ -69,8 +69,8 @@ public class AnnotationEntryGen { private List copyValues(final ElementValuePair[] in, final ConstantPoolGen cpool, final boolean copyPoolEntries) { - List out = new ArrayList<>(); - for (ElementValuePair nvp : in) { + final List out = new ArrayList<>(); + for (final ElementValuePair nvp : in) { out.add(new ElementValuePairGen(nvp, cpool, copyPoolEntries)); } return out; @@ -84,9 +84,9 @@ public class AnnotationEntryGen { * Retrieve an immutable version of this AnnotationGen */ public AnnotationEntry getAnnotation() { - AnnotationEntry a = new AnnotationEntry(typeIndex, cpool.getConstantPool(), + final AnnotationEntry a = new AnnotationEntry(typeIndex, cpool.getConstantPool(), isRuntimeVisible); - for (ElementValuePairGen element : evs) { + for (final ElementValuePairGen element : evs) { a.addElementNameValuePair(element.getElementNameValuePair()); } return a; @@ -103,11 +103,11 @@ public class AnnotationEntryGen { public static AnnotationEntryGen read(final DataInput dis, final ConstantPoolGen cpool, final boolean b) throws IOException { - AnnotationEntryGen a = new AnnotationEntryGen(cpool); + final AnnotationEntryGen a = new AnnotationEntryGen(cpool); a.typeIndex = dis.readUnsignedShort(); - int elemValuePairCount = dis.readUnsignedShort(); + final int elemValuePairCount = dis.readUnsignedShort(); for (int i = 0; i < elemValuePairCount; i++) { - int nidx = dis.readUnsignedShort(); + final int nidx = dis.readUnsignedShort(); a.addElementNameValuePair(new ElementValuePairGen(nidx, ElementValueGen.readElementValue(dis, cpool), cpool)); } @@ -118,7 +118,7 @@ public class AnnotationEntryGen { public void dump(final DataOutputStream dos) throws IOException { dos.writeShort(typeIndex); // u2 index of type name in cpool dos.writeShort(evs.size()); // u2 element_value pair count - for (ElementValuePairGen envp : evs) { + for (final ElementValuePairGen envp : evs) { envp.dump(dos); } } @@ -136,7 +136,7 @@ public class AnnotationEntryGen { public final String getTypeSignature() { // ConstantClass c = (ConstantClass)cpool.getConstant(typeIndex); - ConstantUtf8 utf8 = (ConstantUtf8) cpool + final ConstantUtf8 utf8 = (ConstantUtf8) cpool .getConstant(typeIndex/* c.getNameIndex() */); return utf8.getBytes(); } @@ -155,7 +155,7 @@ public class AnnotationEntryGen { @Override public String toString() { - StringBuilder s = new StringBuilder(32); // CHECKSTYLE IGNORE MagicNumber + final StringBuilder s = new StringBuilder(32); // CHECKSTYLE IGNORE MagicNumber s.append("AnnotationGen:[").append(getTypeName()).append(" #").append(evs.size()).append(" {"); for (int i = 0; i < evs.size(); i++) { s.append(evs.get(i)); @@ -168,7 +168,7 @@ public class AnnotationEntryGen { } public String toShortString() { - StringBuilder s = new StringBuilder(); + final StringBuilder s = new StringBuilder(); s.append("@").append(getTypeName()).append("("); for (int i = 0; i < evs.size(); i++) { s.append(evs.get(i)); @@ -206,7 +206,7 @@ public class AnnotationEntryGen { int countInvisible = 0; // put the annotations in the right output stream - for (AnnotationEntryGen a : annotationEntryGens) { + for (final AnnotationEntryGen a : annotationEntryGens) { if (a.isRuntimeVisible()) { countVisible++; } else { @@ -214,8 +214,8 @@ public class AnnotationEntryGen { } } - ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); - ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); + final ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); + final ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); try (DataOutputStream rvaDos = new DataOutputStream(rvaBytes); DataOutputStream riaDos = new DataOutputStream(riaBytes)) { @@ -223,7 +223,7 @@ public class AnnotationEntryGen { riaDos.writeShort(countInvisible); // put the annotations in the right output stream - for (AnnotationEntryGen a : annotationEntryGens) { + for (final AnnotationEntryGen a : annotationEntryGens) { if (a.isRuntimeVisible()) { a.dump(rvaDos); } else { @@ -232,8 +232,8 @@ public class AnnotationEntryGen { } } - byte[] rvaData = rvaBytes.toByteArray(); - byte[] riaData = riaBytes.toByteArray(); + final byte[] rvaData = rvaBytes.toByteArray(); + final byte[] riaData = riaBytes.toByteArray(); int rvaIndex = -1; int riaIndex = -1; @@ -245,7 +245,7 @@ public class AnnotationEntryGen { riaIndex = cp.addUtf8("RuntimeInvisibleAnnotations"); } - List newAttributes = new ArrayList<>(); + final List newAttributes = new ArrayList<>(); if (rvaData.length > 2) { newAttributes.add( new RuntimeVisibleAnnotations(rvaIndex, rvaData.length, @@ -258,7 +258,7 @@ public class AnnotationEntryGen { } return newAttributes.toArray(new Attribute[newAttributes.size()]); - } catch (IOException e) { + } catch (final IOException e) { System.err.println("IOException whilst processing annotations"); e.printStackTrace(); } @@ -274,14 +274,14 @@ public class AnnotationEntryGen { static Attribute[] getParameterAnnotationAttributes( final ConstantPoolGen cp, final List[] /*Array of lists, array size depends on #params */vec) { - int[] visCount = new int[vec.length]; + final int[] visCount = new int[vec.length]; int totalVisCount = 0; - int[] invisCount = new int[vec.length]; + final int[] invisCount = new int[vec.length]; int totalInvisCount = 0; try { for (int i = 0; i < vec.length; i++) { if (vec[i] != null) { - for (AnnotationEntryGen element : vec[i]) { + for (final AnnotationEntryGen element : vec[i]) { if (element.isRuntimeVisible()) { visCount[i]++; totalVisCount++; @@ -293,13 +293,13 @@ public class AnnotationEntryGen { } } // Lets do the visible ones - ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); + final ByteArrayOutputStream rvaBytes = new ByteArrayOutputStream(); try (DataOutputStream rvaDos = new DataOutputStream(rvaBytes)) { rvaDos.writeByte(vec.length); // First goes number of parameters for (int i = 0; i < vec.length; i++) { rvaDos.writeShort(visCount[i]); if (visCount[i] > 0) { - for (AnnotationEntryGen element : vec[i]) { + for (final AnnotationEntryGen element : vec[i]) { if (element.isRuntimeVisible()) { element.dump(rvaDos); } @@ -308,13 +308,13 @@ public class AnnotationEntryGen { } } // Lets do the invisible ones - ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); + final ByteArrayOutputStream riaBytes = new ByteArrayOutputStream(); try (DataOutputStream riaDos = new DataOutputStream(riaBytes)) { riaDos.writeByte(vec.length); // First goes number of parameters for (int i = 0; i < vec.length; i++) { riaDos.writeShort(invisCount[i]); if (invisCount[i] > 0) { - for (AnnotationEntryGen element : vec[i]) { + for (final AnnotationEntryGen element : vec[i]) { if (!element.isRuntimeVisible()) { element.dump(riaDos); } @@ -322,8 +322,8 @@ public class AnnotationEntryGen { } } } - byte[] rvaData = rvaBytes.toByteArray(); - byte[] riaData = riaBytes.toByteArray(); + final byte[] rvaData = rvaBytes.toByteArray(); + final byte[] riaData = riaBytes.toByteArray(); int rvaIndex = -1; int riaIndex = -1; if (totalVisCount > 0) { @@ -332,7 +332,7 @@ public class AnnotationEntryGen { if (totalInvisCount > 0) { riaIndex = cp.addUtf8("RuntimeInvisibleParameterAnnotations"); } - List newAttributes = new ArrayList<>(); + final List newAttributes = new ArrayList<>(); if (totalVisCount > 0) { newAttributes .add(new RuntimeVisibleParameterAnnotations(rvaIndex, @@ -344,7 +344,7 @@ public class AnnotationEntryGen { riaData.length, new DataInputStream(new ByteArrayInputStream(riaData)), cp.getConstantPool())); } return newAttributes.toArray(new Attribute[newAttributes.size()]); - } catch (IOException e) { + } catch (final IOException e) { System.err .println("IOException whilst processing parameter annotations"); e.printStackTrace(); diff --git a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java index 8e123a21..240c1ddb 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ArrayElementValueGen.java @@ -49,7 +49,7 @@ public class ArrayElementValueGen extends ElementValueGen "Only element values of type array can be built with this ctor - type specified: " + type); } this.evalues = new ArrayList<>(); - for (ElementValue datum : datums) { + for (final ElementValue datum : datums) { evalues.add(ElementValueGen.copy(datum, cpool, true)); } } @@ -60,9 +60,9 @@ public class ArrayElementValueGen extends ElementValueGen @Override public ElementValue getElementValue() { - ElementValue[] immutableData = new ElementValue[evalues.size()]; + final ElementValue[] immutableData = new ElementValue[evalues.size()]; int i = 0; - for (ElementValueGen element : evalues) { + for (final ElementValueGen element : evalues) { immutableData[i++] = element.getElementValue(); } return new ArrayElementValue(super.getElementValueType(), @@ -79,8 +79,8 @@ public class ArrayElementValueGen extends ElementValueGen { super(ARRAY, cpool); evalues = new ArrayList<>(); - ElementValue[] in = value.getElementValuesArray(); - for (ElementValue element : in) { + final ElementValue[] in = value.getElementValuesArray(); + for (final ElementValue element : in) { evalues.add(ElementValueGen.copy(element, cpool, copyPoolEntries)); } } @@ -90,7 +90,7 @@ public class ArrayElementValueGen extends ElementValueGen { dos.writeByte(super.getElementValueType()); // u1 type of value (ARRAY == '[') dos.writeShort(evalues.size()); - for (ElementValueGen element : evalues) { + for (final ElementValueGen element : evalues) { element.dump(dos); } } @@ -98,10 +98,10 @@ public class ArrayElementValueGen extends ElementValueGen @Override public String stringifyValue() { - StringBuilder sb = new StringBuilder(); + final StringBuilder sb = new StringBuilder(); sb.append("["); String comma = ""; - for (ElementValueGen element : evalues) { + for (final ElementValueGen element : evalues) { sb.append(comma); comma = ","; sb.append(element.stringifyValue()); diff --git a/src/main/java/org/apache/bcel/generic/ArrayType.java b/src/main/java/org/apache/bcel/generic/ArrayType.java index 96b723dd..ff35701f 100644 --- a/src/main/java/org/apache/bcel/generic/ArrayType.java +++ b/src/main/java/org/apache/bcel/generic/ArrayType.java @@ -62,7 +62,7 @@ public final class ArrayType extends ReferenceType { } switch (type.getType()) { case Const.T_ARRAY: - ArrayType array = (ArrayType) type; + final ArrayType array = (ArrayType) type; this.dimensions = dimensions + array.dimensions; basic_type = array.basic_type; break; @@ -73,7 +73,7 @@ public final class ArrayType extends ReferenceType { basic_type = type; break; } - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); for (int i = 0; i < this.dimensions; i++) { buf.append('['); } @@ -121,7 +121,7 @@ public final class ArrayType extends ReferenceType { @Override public boolean equals( final Object _type ) { if (_type instanceof ArrayType) { - ArrayType array = (ArrayType) _type; + final ArrayType array = (ArrayType) _type; return (array.dimensions == dimensions) && array.basic_type.equals(basic_type); } return false; diff --git a/src/main/java/org/apache/bcel/generic/BranchHandle.java b/src/main/java/org/apache/bcel/generic/BranchHandle.java index ba942c9d..5b75d8af 100644 --- a/src/main/java/org/apache/bcel/generic/BranchHandle.java +++ b/src/main/java/org/apache/bcel/generic/BranchHandle.java @@ -49,7 +49,7 @@ public final class BranchHandle extends InstructionHandle { if (bh_list == null) { return new BranchHandle(i); } - BranchHandle bh = bh_list; + final BranchHandle bh = bh_list; bh_list = (BranchHandle) bh.getNext(); bh.setInstruction(i); return bh; @@ -85,7 +85,7 @@ public final class BranchHandle extends InstructionHandle { @Override protected int updatePosition( final int offset, final int max_offset ) { - int x = bi.updatePosition(offset, max_offset); + final int x = bi.updatePosition(offset, max_offset); super.setPosition(bi.getPosition()); return x; } diff --git a/src/main/java/org/apache/bcel/generic/BranchInstruction.java b/src/main/java/org/apache/bcel/generic/BranchInstruction.java index d74512d4..7fc0c33a 100644 --- a/src/main/java/org/apache/bcel/generic/BranchInstruction.java +++ b/src/main/java/org/apache/bcel/generic/BranchInstruction.java @@ -93,7 +93,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi throw new ClassGenException("Target of " + super.toString(true) + " is invalid null handle"); } - int t = _target.getPosition(); + final int t = _target.getPosition(); if (t < 0) { throw new ClassGenException("Invalid branch target position offset for " + super.toString(true) + ":" + t + ":" + _target); @@ -139,7 +139,7 @@ public abstract class BranchInstruction extends Instruction implements Instructi */ @Override public String toString( final boolean verbose ) { - String s = super.toString(verbose); + final String s = super.toString(verbose); String t = "null"; if (verbose) { if (target != null) { diff --git a/src/main/java/org/apache/bcel/generic/CPInstruction.java b/src/main/java/org/apache/bcel/generic/CPInstruction.java index 247d0a5f..a3f22391 100644 --- a/src/main/java/org/apache/bcel/generic/CPInstruction.java +++ b/src/main/java/org/apache/bcel/generic/CPInstruction.java @@ -93,7 +93,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct */ @Override public String toString( final ConstantPool cp ) { - Constant c = cp.getConstant(index); + final Constant c = cp.getConstant(index); String str = cp.constantToString(c); if (c instanceof ConstantClass) { str = str.replace('.', '/'); @@ -140,7 +140,7 @@ public abstract class CPInstruction extends Instruction implements TypedInstruct */ @Override public Type getType( final ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); + final ConstantPool cp = cpg.getConstantPool(); String name = cp.getConstantString(index, org.apache.bcel.Const.CONSTANT_Class); if (!name.startsWith("[")) { name = "L" + name + ";"; diff --git a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java index 72c46122..60f76f66 100644 --- a/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassElementValueGen.java @@ -80,7 +80,7 @@ public class ClassElementValueGen extends ElementValueGen public String getClassString() { - ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(idx); + final ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(idx); return cu8.getBytes(); // ConstantClass c = (ConstantClass)getConstantPool().getConstant(idx); // ConstantUtf8 utf8 = diff --git a/src/main/java/org/apache/bcel/generic/ClassGen.java b/src/main/java/org/apache/bcel/generic/ClassGen.java index e9ecb385..53b0d4d2 100644 --- a/src/main/java/org/apache/bcel/generic/ClassGen.java +++ b/src/main/java/org/apache/bcel/generic/ClassGen.java @@ -64,15 +64,15 @@ public class ClassGen extends AccessFlags implements Cloneable { @Override public boolean equals( final Object o1, final Object o2 ) { - ClassGen THIS = (ClassGen) o1; - ClassGen THAT = (ClassGen) o2; + final ClassGen THIS = (ClassGen) o1; + final ClassGen THAT = (ClassGen) o2; return THIS.getClassName().equals(THAT.getClassName()); } @Override public int hashCode( final Object o ) { - ClassGen THIS = (ClassGen) o; + final ClassGen THIS = (ClassGen) o; return THIS.getClassName().hashCode(); } }; @@ -102,7 +102,7 @@ public class ClassGen extends AccessFlags implements Cloneable { class_name_index = cp.addClass(class_name); superclass_name_index = cp.addClass(super_class_name); if (interfaces != null) { - for (String interface1 : interfaces) { + for (final String interface1 : interfaces) { addInterface(interface1); } } @@ -138,27 +138,27 @@ public class ClassGen extends AccessFlags implements Cloneable { cp = new ConstantPoolGen(clazz.getConstantPool()); major = clazz.getMajor(); minor = clazz.getMinor(); - Attribute[] attributes = clazz.getAttributes(); + final Attribute[] attributes = clazz.getAttributes(); // J5TODO: Could make unpacking lazy, done on first reference - AnnotationEntryGen[] annotations = unpackAnnotations(attributes); - Method[] methods = clazz.getMethods(); - Field[] fields = clazz.getFields(); - String[] interfaces = clazz.getInterfaceNames(); - for (String interface1 : interfaces) { + final AnnotationEntryGen[] annotations = unpackAnnotations(attributes); + final Method[] methods = clazz.getMethods(); + final Field[] fields = clazz.getFields(); + final String[] interfaces = clazz.getInterfaceNames(); + for (final String interface1 : interfaces) { addInterface(interface1); } - for (Attribute attribute : attributes) { + for (final Attribute attribute : attributes) { if (!(attribute instanceof Annotations)) { addAttribute(attribute); } } - for (AnnotationEntryGen annotation : annotations) { + for (final AnnotationEntryGen annotation : annotations) { addAnnotationEntry(annotation); } - for (Method method : methods) { + for (final Method method : methods) { addMethod(method); } - for (Field field : fields) { + for (final Field field : fields) { addField(field); } } @@ -168,13 +168,13 @@ public class ClassGen extends AccessFlags implements Cloneable { */ private AnnotationEntryGen[] unpackAnnotations(final Attribute[] attrs) { - List annotationGenObjs = new ArrayList<>(); - for (Attribute attr : attrs) { + final List annotationGenObjs = new ArrayList<>(); + for (final Attribute attr : attrs) { if (attr instanceof RuntimeVisibleAnnotations) { - RuntimeVisibleAnnotations rva = (RuntimeVisibleAnnotations) attr; - AnnotationEntry[] annos = rva.getAnnotationEntries(); - for (AnnotationEntry a : annos) { + final RuntimeVisibleAnnotations rva = (RuntimeVisibleAnnotations) attr; + final AnnotationEntry[] annos = rva.getAnnotationEntries(); + for (final AnnotationEntry a : annos) { annotationGenObjs.add(new AnnotationEntryGen(a, getConstantPool(), false)); } @@ -182,9 +182,9 @@ public class ClassGen extends AccessFlags implements Cloneable { else if (attr instanceof RuntimeInvisibleAnnotations) { - RuntimeInvisibleAnnotations ria = (RuntimeInvisibleAnnotations) attr; - AnnotationEntry[] annos = ria.getAnnotationEntries(); - for (AnnotationEntry a : annos) { + final RuntimeInvisibleAnnotations ria = (RuntimeInvisibleAnnotations) attr; + final AnnotationEntry[] annos = ria.getAnnotationEntries(); + for (final AnnotationEntry a : annos) { annotationGenObjs.add(new AnnotationEntryGen(a, getConstantPool(), false)); } @@ -198,21 +198,21 @@ public class ClassGen extends AccessFlags implements Cloneable { * @return the (finally) built up Java class object. */ public JavaClass getJavaClass() { - int[] interfaces = getInterfaces(); - Field[] fields = getFields(); - Method[] methods = getMethods(); + final int[] interfaces = getInterfaces(); + final Field[] fields = getFields(); + final Method[] methods = getMethods(); Attribute[] attributes = null; if (annotation_vec.isEmpty()) { attributes = getAttributes(); } else { // TODO: Sometime later, trash any attributes called 'RuntimeVisibleAnnotations' or 'RuntimeInvisibleAnnotations' - Attribute[] annAttributes = AnnotationEntryGen.getAnnotationAttributes(cp, getAnnotationEntries()); + final Attribute[] annAttributes = AnnotationEntryGen.getAnnotationAttributes(cp, getAnnotationEntries()); attributes = new Attribute[attribute_vec.size()+annAttributes.length]; attribute_vec.toArray(attributes); System.arraycopy(annAttributes,0,attributes,attribute_vec.size(),annAttributes.length); } // Must be last since the above calls may still add something to it - ConstantPool _cp = this.cp.getFinalConstantPool(); + final ConstantPool _cp = this.cp.getFinalConstantPool(); return new JavaClass(class_name_index, superclass_name_index, file_name, major, minor, super.getAccessFlags(), _cp, interfaces, fields, methods, attributes); } @@ -296,11 +296,11 @@ public class ClassGen extends AccessFlags implements Cloneable { * @param access_flags rights for constructor */ public void addEmptyConstructor( final int access_flags ) { - InstructionList il = new InstructionList(); + final InstructionList il = new InstructionList(); il.append(InstructionConst.THIS); // Push `this' il.append(new INVOKESPECIAL(cp.addMethodref(super_class_name, "", "()V"))); il.append(InstructionConst.RETURN); - MethodGen mg = new MethodGen(access_flags, Type.VOID, Type.NO_ARGS, null, "", + final MethodGen mg = new MethodGen(access_flags, Type.VOID, Type.NO_ARGS, null, "", class_name, il, cp); mg.setMaxStack(1); addMethod(mg.getMethod()); @@ -324,7 +324,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** @return field object with given name, or null */ public Field containsField( final String name ) { - for (Field f : field_vec) { + for (final Field f : field_vec) { if (f.getName().equals(name)) { return f; } @@ -336,7 +336,7 @@ public class ClassGen extends AccessFlags implements Cloneable { /** @return method object with given name and signature, or null */ public Method containsMethod( final String name, final String signature ) { - for (Method m : method_vec) { + for (final Method m : method_vec) { if (m.getName().equals(name) && m.getSignature().equals(signature)) { return m; } @@ -370,7 +370,7 @@ public class ClassGen extends AccessFlags implements Cloneable { if (new_ == null) { throw new ClassGenException("Replacement method must not be null"); } - int i = method_vec.indexOf(old); + final int i = method_vec.indexOf(old); if (i < 0) { method_vec.add(new_); } else { @@ -386,7 +386,7 @@ public class ClassGen extends AccessFlags implements Cloneable { if (new_ == null) { throw new ClassGenException("Replacement method must not be null"); } - int i = field_vec.indexOf(old); + final int i = field_vec.indexOf(old); if (i < 0) { field_vec.add(new_); } else { @@ -438,7 +438,7 @@ public class ClassGen extends AccessFlags implements Cloneable { public void setMethods( final Method[] methods ) { method_vec.clear(); - for (Method method : methods) { + for (final Method method : methods) { addMethod(method); } } @@ -455,16 +455,16 @@ public class ClassGen extends AccessFlags implements Cloneable { public String[] getInterfaceNames() { - int size = interface_vec.size(); - String[] interfaces = new String[size]; + final int size = interface_vec.size(); + final String[] interfaces = new String[size]; interface_vec.toArray(interfaces); return interfaces; } public int[] getInterfaces() { - int size = interface_vec.size(); - int[] interfaces = new int[size]; + final int size = interface_vec.size(); + final int[] interfaces = new int[size]; for (int i = 0; i < size; i++) { interfaces[i] = cp.addClass(interface_vec.get(i)); } @@ -548,7 +548,7 @@ public class ClassGen extends AccessFlags implements Cloneable { */ public void update() { if (observers != null) { - for (ClassObserver observer : observers) { + for (final ClassObserver observer : observers) { observer.notify(this); } } @@ -559,7 +559,7 @@ public class ClassGen extends AccessFlags implements Cloneable { public Object clone() { try { return super.clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } } diff --git a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java index d0667c6c..ada53f5d 100644 --- a/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java +++ b/src/main/java/org/apache/bcel/generic/CodeExceptionGen.java @@ -180,7 +180,7 @@ public final class CodeExceptionGen implements InstructionTargeter, Cloneable { public Object clone() { try { return super.clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } } diff --git a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java index 446b8433..6267e4db 100644 --- a/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java +++ b/src/main/java/org/apache/bcel/generic/ConstantPoolGen.java @@ -94,7 +94,7 @@ public class ConstantPoolGen { * @param cs array of given constants, new ones will be appended */ public ConstantPoolGen(final Constant[] cs) { - StringBuilder sb = new StringBuilder(DEFAULT_BUFFER_SIZE); + final StringBuilder sb = new StringBuilder(DEFAULT_BUFFER_SIZE); size = Math.max(DEFAULT_BUFFER_SIZE, cs.length + 64); constants = new Constant[size]; @@ -106,43 +106,43 @@ public class ConstantPoolGen { for (int i = 1; i < index; i++) { - Constant c = constants[i]; + final Constant c = constants[i]; if (c instanceof ConstantString) { - ConstantString s = (ConstantString) c; - ConstantUtf8 u8 = (ConstantUtf8) constants[s.getStringIndex()]; - String key = u8.getBytes(); + final ConstantString s = (ConstantString) c; + final ConstantUtf8 u8 = (ConstantUtf8) constants[s.getStringIndex()]; + final String key = u8.getBytes(); if (!string_table.containsKey(key)) { string_table.put(key, new Index(i)); } } else if (c instanceof ConstantClass) { - ConstantClass s = (ConstantClass) c; - ConstantUtf8 u8 = (ConstantUtf8) constants[s.getNameIndex()]; - String key = u8.getBytes(); + final ConstantClass s = (ConstantClass) c; + final ConstantUtf8 u8 = (ConstantUtf8) constants[s.getNameIndex()]; + final String key = u8.getBytes(); if (!class_table.containsKey(key)) { class_table.put(key, new Index(i)); } } else if (c instanceof ConstantNameAndType) { - ConstantNameAndType n = (ConstantNameAndType) c; - ConstantUtf8 u8 = (ConstantUtf8) constants[n.getNameIndex()]; - ConstantUtf8 u8_2 = (ConstantUtf8) constants[n.getSignatureIndex()]; + final ConstantNameAndType n = (ConstantNameAndType) c; + final ConstantUtf8 u8 = (ConstantUtf8) constants[n.getNameIndex()]; + final ConstantUtf8 u8_2 = (ConstantUtf8) constants[n.getSignatureIndex()]; sb.append(u8.getBytes()); sb.append(NAT_DELIM); sb.append(u8_2.getBytes()); - String key = sb.toString(); + final String key = sb.toString(); sb.delete(0, sb.length()); if (!n_a_t_table.containsKey(key)) { n_a_t_table.put(key, new Index(i)); } } else if (c instanceof ConstantUtf8) { - ConstantUtf8 u = (ConstantUtf8) c; - String key = u.getBytes(); + final ConstantUtf8 u = (ConstantUtf8) c; + final String key = u.getBytes(); if (!utf8_table.containsKey(key)) { utf8_table.put(key, new Index(i)); } } else if (c instanceof ConstantCP) { - ConstantCP m = (ConstantCP) c; + final ConstantCP m = (ConstantCP) c; String class_name; ConstantUtf8 u8; @@ -151,16 +151,16 @@ public class ConstantPoolGen { // since name can't begin with digit, can use // METHODREF_DELIM with out fear of duplicates. } else { - ConstantClass clazz = (ConstantClass) constants[m.getClassIndex()]; + final ConstantClass clazz = (ConstantClass) constants[m.getClassIndex()]; u8 = (ConstantUtf8) constants[clazz.getNameIndex()]; class_name = u8.getBytes().replace('/', '.'); } - ConstantNameAndType n = (ConstantNameAndType) constants[m.getNameAndTypeIndex()]; + final ConstantNameAndType n = (ConstantNameAndType) constants[m.getNameAndTypeIndex()]; u8 = (ConstantUtf8) constants[n.getNameIndex()]; - String method_name = u8.getBytes(); + final String method_name = u8.getBytes(); u8 = (ConstantUtf8) constants[n.getSignatureIndex()]; - String signature = u8.getBytes(); + final String signature = u8.getBytes(); String delim = METHODREF_DELIM; if (c instanceof ConstantInterfaceMethodref) { @@ -174,7 +174,7 @@ public class ConstantPoolGen { sb.append(method_name); sb.append(delim); sb.append(signature); - String key = sb.toString(); + final String key = sb.toString(); sb.delete(0, sb.length()); if (!cp_table.containsKey(key)) { @@ -222,7 +222,7 @@ public class ConstantPoolGen { */ protected void adjustSize() { if (index + 3 >= size) { - Constant[] cs = constants; + final Constant[] cs = constants; size *= 2; constants = new Constant[size]; System.arraycopy(cs, 0, constants, 0, index); @@ -239,7 +239,7 @@ public class ConstantPoolGen { * @return index on success, -1 otherwise */ public int lookupString( final String str ) { - Index index = string_table.get(str); + final Index index = string_table.get(str); return (index != null) ? index.index : -1; } @@ -255,9 +255,9 @@ public class ConstantPoolGen { if ((ret = lookupString(str)) != -1) { return ret; // Already in CP } - int utf8 = addUtf8(str); + final int utf8 = addUtf8(str); adjustSize(); - ConstantString s = new ConstantString(utf8); + final ConstantString s = new ConstantString(utf8); ret = index; constants[index++] = s; if (!string_table.containsKey(str)) { @@ -276,7 +276,7 @@ public class ConstantPoolGen { * @return index on success, -1 otherwise */ public int lookupClass( final String str ) { - Index index = class_table.get(str.replace('.', '/')); + final Index index = class_table.get(str.replace('.', '/')); return (index != null) ? index.index : -1; } @@ -287,7 +287,7 @@ public class ConstantPoolGen { return ret; // Already in CP } adjustSize(); - ConstantClass c = new ConstantClass(addUtf8(clazz)); + final ConstantClass c = new ConstantClass(addUtf8(clazz)); ret = index; constants[index++] = c; if (!class_table.containsKey(clazz)) { @@ -340,7 +340,7 @@ public class ConstantPoolGen { public int lookupInteger( final int n ) { for (int i = 1; i < index; i++) { if (constants[i] instanceof ConstantInteger) { - ConstantInteger c = (ConstantInteger) constants[i]; + final ConstantInteger c = (ConstantInteger) constants[i]; if (c.getBytes() == n) { return i; } @@ -375,10 +375,10 @@ public class ConstantPoolGen { * @return index on success, -1 otherwise */ public int lookupFloat( final float n ) { - int bits = Float.floatToIntBits(n); + final int bits = Float.floatToIntBits(n); for (int i = 1; i < index; i++) { if (constants[i] instanceof ConstantFloat) { - ConstantFloat c = (ConstantFloat) constants[i]; + final ConstantFloat c = (ConstantFloat) constants[i]; if (Float.floatToIntBits(c.getBytes()) == bits) { return i; } @@ -415,7 +415,7 @@ public class ConstantPoolGen { * @return index on success, -1 otherwise */ public int lookupUtf8( final String n ) { - Index index = utf8_table.get(n); + final Index index = utf8_table.get(n); return (index != null) ? index.index : -1; } @@ -450,7 +450,7 @@ public class ConstantPoolGen { public int lookupLong( final long n ) { for (int i = 1; i < index; i++) { if (constants[i] instanceof ConstantLong) { - ConstantLong c = (ConstantLong) constants[i]; + final ConstantLong c = (ConstantLong) constants[i]; if (c.getBytes() == n) { return i; } @@ -486,10 +486,10 @@ public class ConstantPoolGen { * @return index on success, -1 otherwise */ public int lookupDouble( final double n ) { - long bits = Double.doubleToLongBits(n); + final long bits = Double.doubleToLongBits(n); for (int i = 1; i < index; i++) { if (constants[i] instanceof ConstantDouble) { - ConstantDouble c = (ConstantDouble) constants[i]; + final ConstantDouble c = (ConstantDouble) constants[i]; if (Double.doubleToLongBits(c.getBytes()) == bits) { return i; } @@ -528,7 +528,7 @@ public class ConstantPoolGen { * @return index on success, -1 otherwise */ public int lookupNameAndType( final String name, final String signature ) { - Index _index = n_a_t_table.get(name + NAT_DELIM + signature); + final Index _index = n_a_t_table.get(name + NAT_DELIM + signature); return (_index != null) ? _index.index : -1; } @@ -553,7 +553,7 @@ public class ConstantPoolGen { signature_index = addUtf8(signature); ret = index; constants[index++] = new ConstantNameAndType(name_index, signature_index); - String key = name + NAT_DELIM + signature; + final String key = name + NAT_DELIM + signature; if (!n_a_t_table.containsKey(key)) { n_a_t_table.put(key, new Index(ret)); } @@ -572,7 +572,7 @@ public class ConstantPoolGen { * @return index on success, -1 otherwise */ public int lookupMethodref( final String class_name, final String method_name, final String signature ) { - Index index = cp_table.get(class_name + METHODREF_DELIM + method_name + final Index index = cp_table.get(class_name + METHODREF_DELIM + method_name + METHODREF_DELIM + signature); return (index != null) ? index.index : -1; } @@ -604,7 +604,7 @@ public class ConstantPoolGen { class_index = addClass(class_name); ret = index; constants[index++] = new ConstantMethodref(class_index, name_and_type_index); - String key = class_name + METHODREF_DELIM + method_name + METHODREF_DELIM + signature; + final String key = class_name + METHODREF_DELIM + method_name + METHODREF_DELIM + signature; if (!cp_table.containsKey(key)) { cp_table.put(key, new Index(ret)); } @@ -626,7 +626,7 @@ public class ConstantPoolGen { * @return index on success, -1 otherwise */ public int lookupInterfaceMethodref( final String class_name, final String method_name, final String signature ) { - Index index = cp_table.get(class_name + IMETHODREF_DELIM + method_name + final Index index = cp_table.get(class_name + IMETHODREF_DELIM + method_name + IMETHODREF_DELIM + signature); return (index != null) ? index.index : -1; } @@ -659,7 +659,7 @@ public class ConstantPoolGen { name_and_type_index = addNameAndType(method_name, signature); ret = index; constants[index++] = new ConstantInterfaceMethodref(class_index, name_and_type_index); - String key = class_name + IMETHODREF_DELIM + method_name + IMETHODREF_DELIM + signature; + final String key = class_name + IMETHODREF_DELIM + method_name + IMETHODREF_DELIM + signature; if (!cp_table.containsKey(key)) { cp_table.put(key, new Index(ret)); } @@ -681,7 +681,7 @@ public class ConstantPoolGen { * @return index on success, -1 otherwise */ public int lookupFieldref( final String class_name, final String field_name, final String signature ) { - Index index = cp_table.get(class_name + FIELDREF_DELIM + field_name + final Index index = cp_table.get(class_name + FIELDREF_DELIM + field_name + FIELDREF_DELIM + signature); return (index != null) ? index.index : -1; } @@ -708,7 +708,7 @@ public class ConstantPoolGen { name_and_type_index = addNameAndType(field_name, signature); ret = index; constants[index++] = new ConstantFieldref(class_index, name_and_type_index); - String key = class_name + FIELDREF_DELIM + field_name + FIELDREF_DELIM + signature; + final String key = class_name + FIELDREF_DELIM + field_name + FIELDREF_DELIM + signature; if (!cp_table.containsKey(key)) { cp_table.put(key, new Index(ret)); } @@ -756,7 +756,7 @@ public class ConstantPoolGen { * @return constant pool with proper length */ public ConstantPool getFinalConstantPool() { - Constant[] cs = new Constant[index]; + final Constant[] cs = new Constant[index]; System.arraycopy(constants, 0, cs, 0, index); return new ConstantPool(cs); } @@ -767,7 +767,7 @@ public class ConstantPoolGen { */ @Override public String toString() { - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); for (int i = 1; i < index; i++) { buf.append(i).append(")").append(constants[i]).append("\n"); } @@ -778,22 +778,22 @@ public class ConstantPoolGen { /** Import constant from another ConstantPool and return new index. */ public int addConstant( final Constant c, final ConstantPoolGen cp ) { - Constant[] constants = cp.getConstantPool().getConstantPool(); + final Constant[] constants = cp.getConstantPool().getConstantPool(); switch (c.getTag()) { case Const.CONSTANT_String: { - ConstantString s = (ConstantString) c; - ConstantUtf8 u8 = (ConstantUtf8) constants[s.getStringIndex()]; + final ConstantString s = (ConstantString) c; + final ConstantUtf8 u8 = (ConstantUtf8) constants[s.getStringIndex()]; return addString(u8.getBytes()); } case Const.CONSTANT_Class: { - ConstantClass s = (ConstantClass) c; - ConstantUtf8 u8 = (ConstantUtf8) constants[s.getNameIndex()]; + final ConstantClass s = (ConstantClass) c; + final ConstantUtf8 u8 = (ConstantUtf8) constants[s.getNameIndex()]; return addClass(u8.getBytes()); } case Const.CONSTANT_NameAndType: { - ConstantNameAndType n = (ConstantNameAndType) c; - ConstantUtf8 u8 = (ConstantUtf8) constants[n.getNameIndex()]; - ConstantUtf8 u8_2 = (ConstantUtf8) constants[n.getSignatureIndex()]; + final ConstantNameAndType n = (ConstantNameAndType) c; + final ConstantUtf8 u8 = (ConstantUtf8) constants[n.getNameIndex()]; + final ConstantUtf8 u8_2 = (ConstantUtf8) constants[n.getSignatureIndex()]; return addNameAndType(u8.getBytes(), u8_2.getBytes()); } case Const.CONSTANT_Utf8: @@ -809,15 +809,15 @@ public class ConstantPoolGen { case Const.CONSTANT_InterfaceMethodref: case Const.CONSTANT_Methodref: case Const.CONSTANT_Fieldref: { - ConstantCP m = (ConstantCP) c; - ConstantClass clazz = (ConstantClass) constants[m.getClassIndex()]; - ConstantNameAndType n = (ConstantNameAndType) constants[m.getNameAndTypeIndex()]; + final ConstantCP m = (ConstantCP) c; + final ConstantClass clazz = (ConstantClass) constants[m.getClassIndex()]; + final ConstantNameAndType n = (ConstantNameAndType) constants[m.getNameAndTypeIndex()]; ConstantUtf8 u8 = (ConstantUtf8) constants[clazz.getNameIndex()]; - String class_name = u8.getBytes().replace('/', '.'); + final String class_name = u8.getBytes().replace('/', '.'); u8 = (ConstantUtf8) constants[n.getNameIndex()]; - String name = u8.getBytes(); + final String name = u8.getBytes(); u8 = (ConstantUtf8) constants[n.getSignatureIndex()]; - String signature = u8.getBytes(); + final String signature = u8.getBytes(); switch (c.getTag()) { case Const.CONSTANT_InterfaceMethodref: return addInterfaceMethodref(class_name, name, signature); diff --git a/src/main/java/org/apache/bcel/generic/ElementValueGen.java b/src/main/java/org/apache/bcel/generic/ElementValueGen.java index bce1da17..27f182ee 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValueGen.java @@ -95,7 +95,7 @@ public abstract class ElementValueGen public static ElementValueGen readElementValue(final DataInput dis, final ConstantPoolGen cpGen) throws IOException { - int type = dis.readUnsignedByte(); + final int type = dis.readUnsignedByte(); switch (type) { case 'B': // byte @@ -137,8 +137,8 @@ public abstract class ElementValueGen new AnnotationEntryGen(AnnotationEntry.read(dis, cpGen .getConstantPool(), true), cpGen, false), cpGen); case '[': // Array - int numArrayVals = dis.readUnsignedShort(); - ElementValue[] evalues = new ElementValue[numArrayVals]; + final int numArrayVals = dis.readUnsignedShort(); + final ElementValue[] evalues = new ElementValue[numArrayVals]; for (int j = 0; j < numArrayVals; j++) { evalues[j] = ElementValue.readElementValue(dis, cpGen diff --git a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java index f5b557d7..aa703d98 100644 --- a/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java +++ b/src/main/java/org/apache/bcel/generic/ElementValuePairGen.java @@ -63,7 +63,7 @@ public class ElementValuePairGen */ public ElementValuePair getElementNameValuePair() { - ElementValue immutableValue = value.getElementValue(); + final ElementValue immutableValue = value.getElementValue(); return new ElementValuePair(nameIdx, immutableValue, cpool .getConstantPool()); } diff --git a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java index edf69fc8..73626f0c 100644 --- a/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/EnumElementValueGen.java @@ -99,7 +99,7 @@ public class EnumElementValueGen extends ElementValueGen @Override public String stringifyValue() { - ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(valueIdx); + final ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(valueIdx); return cu8.getBytes(); // ConstantString cu8 = // (ConstantString)getConstantPool().getConstant(valueIdx); diff --git a/src/main/java/org/apache/bcel/generic/FieldGen.java b/src/main/java/org/apache/bcel/generic/FieldGen.java index 7548e03f..0a4d577f 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGen.java @@ -47,8 +47,8 @@ public class FieldGen extends FieldGenOrMethodGen { @Override public boolean equals( final Object o1, final Object o2 ) { - FieldGen THIS = (FieldGen) o1; - FieldGen THAT = (FieldGen) o2; + final FieldGen THIS = (FieldGen) o1; + final FieldGen THAT = (FieldGen) o2; return THIS.getName().equals(THAT.getName()) && THIS.getSignature().equals(THAT.getSignature()); } @@ -56,7 +56,7 @@ public class FieldGen extends FieldGenOrMethodGen { @Override public int hashCode( final Object o ) { - FieldGen THIS = (FieldGen) o; + final FieldGen THIS = (FieldGen) o; return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); } }; @@ -88,14 +88,14 @@ public class FieldGen extends FieldGenOrMethodGen { */ public FieldGen(final Field field, final ConstantPoolGen cp) { this(field.getAccessFlags(), Type.getType(field.getSignature()), field.getName(), cp); - Attribute[] attrs = field.getAttributes(); - for (Attribute attr : attrs) { + final Attribute[] attrs = field.getAttributes(); + for (final Attribute attr : attrs) { if (attr instanceof ConstantValue) { setValue(((ConstantValue) attr).getConstantValueIndex()); } else if (attr instanceof Annotations) { - Annotations runtimeAnnotations = (Annotations)attr; - AnnotationEntry[] annotationEntries = runtimeAnnotations.getAnnotationEntries(); - for (AnnotationEntry element : annotationEntries) { + final Annotations runtimeAnnotations = (Annotations)attr; + final AnnotationEntry[] annotationEntries = runtimeAnnotations.getAnnotationEntries(); + for (final AnnotationEntry element : annotationEntries) { addAnnotationEntry(new AnnotationEntryGen(element,cp,false)); } } else { @@ -106,8 +106,8 @@ public class FieldGen extends FieldGenOrMethodGen { private void setValue( final int index ) { - ConstantPool cp = super.getConstantPool().getConstantPool(); - Constant c = cp.getConstant(index); + final ConstantPool cp = super.getConstantPool().getConstantPool(); + final Constant c = cp.getConstant(index); value = ((ConstantObject) c).getConstantValue(cp); } @@ -213,12 +213,12 @@ public class FieldGen extends FieldGenOrMethodGen { * Get field object after having set up all necessary values. */ public Field getField() { - String signature = getSignature(); - int name_index = super.getConstantPool().addUtf8(super.getName()); - int signature_index = super.getConstantPool().addUtf8(signature); + final String signature = getSignature(); + final int name_index = super.getConstantPool().addUtf8(super.getName()); + final int signature_index = super.getConstantPool().addUtf8(signature); if (value != null) { checkType(super.getType()); - int index = addConstant(); + final int index = addConstant(); addAttribute(new ConstantValue(super.getConstantPool().addUtf8("ConstantValue"), 2, index, super.getConstantPool().getConstantPool())); // sic } @@ -228,8 +228,8 @@ public class FieldGen extends FieldGenOrMethodGen { } private void addAnnotationsAsAttribute(final ConstantPoolGen cp) { - Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp, super.getAnnotationEntries()); - for (Attribute attr : attrs) { + final Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp, super.getAnnotationEntries()); + for (final Attribute attr : attrs) { addAttribute(attr); } } @@ -290,7 +290,7 @@ public class FieldGen extends FieldGenOrMethodGen { */ public void update() { if (observers != null) { - for (FieldObserver observer : observers ) { + for (final FieldObserver observer : observers ) { observer.notify(this); } } @@ -320,9 +320,9 @@ public class FieldGen extends FieldGenOrMethodGen { access = access.isEmpty() ? "" : (access + " "); signature = super.getType().toString(); name = getName(); - StringBuilder buf = new StringBuilder(32); // CHECKSTYLE IGNORE MagicNumber + final StringBuilder buf = new StringBuilder(32); // CHECKSTYLE IGNORE MagicNumber buf.append(access).append(signature).append(" ").append(name); - String value = getInitValue(); + final String value = getInitValue(); if (value != null) { buf.append(" = ").append(value); } @@ -333,7 +333,7 @@ public class FieldGen extends FieldGenOrMethodGen { /** @return deep copy of this field */ public FieldGen copy( final ConstantPoolGen cp ) { - FieldGen fg = (FieldGen) clone(); + final FieldGen fg = (FieldGen) clone(); fg.setConstantPool(cp); return fg; } diff --git a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java index 84d249bf..ed5d706d 100644 --- a/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java +++ b/src/main/java/org/apache/bcel/generic/FieldGenOrMethodGen.java @@ -163,13 +163,13 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn * @return all attributes of this method. */ public Attribute[] getAttributes() { - Attribute[] attributes = new Attribute[attribute_vec.size()]; + final Attribute[] attributes = new Attribute[attribute_vec.size()]; attribute_vec.toArray(attributes); return attributes; } public AnnotationEntryGen[] getAnnotationEntries() { - AnnotationEntryGen[] annotations = new AnnotationEntryGen[annotation_vec.size()]; + final AnnotationEntryGen[] annotations = new AnnotationEntryGen[annotation_vec.size()]; annotation_vec.toArray(annotations); return annotations; } @@ -184,7 +184,7 @@ public abstract class FieldGenOrMethodGen extends AccessFlags implements NamedAn public Object clone() { try { return super.clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } } diff --git a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java index 9392faae..a52a9836 100644 --- a/src/main/java/org/apache/bcel/generic/FieldOrMethod.java +++ b/src/main/java/org/apache/bcel/generic/FieldOrMethod.java @@ -50,9 +50,9 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { /** @return signature of referenced method/field. */ public String getSignature( final ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); - ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); + final ConstantPool cp = cpg.getConstantPool(); + final ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); + final ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes(); } @@ -60,9 +60,9 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { /** @return name of referenced method/field. */ public String getName( final ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); - ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); + final ConstantPool cp = cpg.getConstantPool(); + final ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); + final ConstantNameAndType cnat = (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); } @@ -80,9 +80,9 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { */ @Deprecated public String getClassName( final ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); - String className = cp.getConstantString(cmr.getClassIndex(), Const.CONSTANT_Class); + final ConstantPool cp = cpg.getConstantPool(); + final ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); + final String className = cp.getConstantString(cmr.getClassIndex(), Const.CONSTANT_Class); if (className.startsWith("[")) { // Turn array classes into java.lang.Object. return "java.lang.Object"; @@ -111,8 +111,8 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { * type is an array class) */ public ReferenceType getReferenceType( final ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); + final ConstantPool cp = cpg.getConstantPool(); + final ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); String className = cp.getConstantString(cmr.getClassIndex(), Const.CONSTANT_Class); if (className.startsWith("[")) { return (ArrayType) Type.getType(className); @@ -130,7 +130,7 @@ public abstract class FieldOrMethod extends CPInstruction implements LoadClass { */ @Override public ObjectType getLoadClassType( final ConstantPoolGen cpg ) { - ReferenceType rt = getReferenceType(cpg); + final ReferenceType rt = getReferenceType(cpg); if(rt instanceof ObjectType) { return (ObjectType)rt; } diff --git a/src/main/java/org/apache/bcel/generic/GOTO.java b/src/main/java/org/apache/bcel/generic/GOTO.java index 5b3b2990..ec131d09 100644 --- a/src/main/java/org/apache/bcel/generic/GOTO.java +++ b/src/main/java/org/apache/bcel/generic/GOTO.java @@ -68,11 +68,11 @@ public class GOTO extends GotoInstruction implements VariableLengthInstruction { */ @Override protected int updatePosition( final int offset, final int max_offset ) { - int i = getTargetOffset(); // Depending on old position value + final int i = getTargetOffset(); // Depending on old position value setPosition(getPosition() + offset); // Position may be shifted by preceding expansions if (Math.abs(i) >= (Short.MAX_VALUE - max_offset)) { // to large for short (estimate) super.setOpcode(org.apache.bcel.Const.GOTO_W); - short old_length = (short) super.getLength(); + final short old_length = (short) super.getLength(); super.setLength(5); return super.getLength() - old_length; } diff --git a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java index 7750342d..3eab6daf 100644 --- a/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java +++ b/src/main/java/org/apache/bcel/generic/INVOKEDYNAMIC.java @@ -123,8 +123,8 @@ public class INVOKEDYNAMIC extends InvokeInstruction { */ @Override public String getClassName( final ConstantPoolGen cpg ) { - ConstantPool cp = cpg.getConstantPool(); - ConstantInvokeDynamic cid = (ConstantInvokeDynamic) cp.getConstant(super.getIndex(), Const.CONSTANT_InvokeDynamic); + final ConstantPool cp = cpg.getConstantPool(); + final ConstantInvokeDynamic cid = (ConstantInvokeDynamic) cp.getConstant(super.getIndex(), Const.CONSTANT_InvokeDynamic); return ((ConstantNameAndType) cp.getConstant(cid.getNameAndTypeIndex())).getName(cp); } } diff --git a/src/main/java/org/apache/bcel/generic/Instruction.java b/src/main/java/org/apache/bcel/generic/Instruction.java index 51f65ecf..5befdcbd 100644 --- a/src/main/java/org/apache/bcel/generic/Instruction.java +++ b/src/main/java/org/apache/bcel/generic/Instruction.java @@ -126,7 +126,7 @@ public abstract class Instruction implements Cloneable { } else { try { i = (Instruction) clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { System.err.println(e); } } diff --git a/src/main/java/org/apache/bcel/generic/InstructionFactory.java b/src/main/java/org/apache/bcel/generic/InstructionFactory.java index eed04372..11e3d85e 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionFactory.java +++ b/src/main/java/org/apache/bcel/generic/InstructionFactory.java @@ -86,8 +86,8 @@ public class InstructionFactory implements InstructionConstants { final Type[] arg_types, final short kind ) { int index; int nargs = 0; - String signature = Type.getMethodSignature(ret_type, arg_types); - for (Type arg_type : arg_types) { + final String signature = Type.getMethodSignature(ret_type, arg_types); + for (final Type arg_type : arg_types) { nargs += arg_type.getSize(); } if (kind == Const.INVOKEINTERFACE) { @@ -143,9 +143,9 @@ public class InstructionFactory implements InstructionConstants { * @param s the string to print */ public InstructionList createPrintln( final String s ) { - InstructionList il = new InstructionList(); - int out = cp.addFieldref("java.lang.System", "out", "Ljava/io/PrintStream;"); - int println = cp.addMethodref("java.io.PrintStream", "println", "(Ljava/lang/String;)V"); + final InstructionList il = new InstructionList(); + final int out = cp.addFieldref("java.lang.System", "out", "Ljava/io/PrintStream;"); + final int println = cp.addMethodref("java.io.PrintStream", "println", "(Ljava/lang/String;)V"); il.append(new GETSTATIC(out)); il.append(new PUSH(cp, s)); il.append(new INVOKEVIRTUAL(println)); @@ -238,7 +238,7 @@ public class InstructionFactory implements InstructionConstants { public Instruction createAppend( final Type type ) { - byte t = type.getType(); + final byte t = type.getType(); if (isString(type)) { return createInvoke(append_mos[0], Const.INVOKEVIRTUAL); } @@ -271,7 +271,7 @@ public class InstructionFactory implements InstructionConstants { */ public FieldInstruction createFieldAccess( final String class_name, final String name, final Type type, final short kind ) { int index; - String signature = type.getSignature(); + final String signature = type.getSignature(); index = cp.addFieldref(class_name, name, signature); switch (kind) { case Const.GETFIELD: @@ -420,7 +420,7 @@ public class InstructionFactory implements InstructionConstants { * @param op operation, such as "+", "*", "<<", etc. */ public static ArithmeticInstruction createBinaryOperation( final String op, final Type type ) { - char first = op.charAt(0); + final char first = op.charAt(0); switch (type.getType()) { case Const.T_BYTE: case Const.T_SHORT: @@ -586,18 +586,18 @@ public class InstructionFactory implements InstructionConstants { */ public Instruction createCast( final Type src_type, final Type dest_type ) { if ((src_type instanceof BasicType) && (dest_type instanceof BasicType)) { - byte dest = dest_type.getType(); + final byte dest = dest_type.getType(); byte src = src_type.getType(); if (dest == Const.T_LONG && (src == Const.T_CHAR || src == Const.T_BYTE || src == Const.T_SHORT)) { src = Const.T_INT; } - String name = "org.apache.bcel.generic." + short_names[src - Const.T_CHAR] + "2" + final String name = "org.apache.bcel.generic." + short_names[src - Const.T_CHAR] + "2" + short_names[dest - Const.T_CHAR]; Instruction i = null; try { i = (Instruction) java.lang.Class.forName(name).newInstance(); - } catch (Exception e) { + } catch (final Exception e) { throw new RuntimeException("Could not find instruction: " + name, e); } return i; diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java index 490b0ff1..216d203a 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java +++ b/src/main/java/org/apache/bcel/generic/InstructionHandle.java @@ -103,7 +103,7 @@ public class InstructionHandle { // See BCEL-273 // TODO remove this method in any redesign of BCEL public Instruction swapInstruction( final Instruction i ) { - Instruction oldInstruction = instruction; + final Instruction oldInstruction = instruction; instruction = i; return oldInstruction; } @@ -122,7 +122,7 @@ public class InstructionHandle { if (ih_list == null) { return new InstructionHandle(i); } - InstructionHandle ih = ih_list; + final InstructionHandle ih = ih_list; ih_list = ih.next; ih.setInstruction(i); return ih; @@ -227,7 +227,7 @@ public class InstructionHandle { if (!hasTargeters()) { return new InstructionTargeter[0]; } - InstructionTargeter[] t = new InstructionTargeter[targeters.size()]; + final InstructionTargeter[] t = new InstructionTargeter[targeters.size()]; targeters.toArray(t); return t; } diff --git a/src/main/java/org/apache/bcel/generic/InstructionList.java b/src/main/java/org/apache/bcel/generic/InstructionList.java index 97973926..8138c511 100644 --- a/src/main/java/org/apache/bcel/generic/InstructionList.java +++ b/src/main/java/org/apache/bcel/generic/InstructionList.java @@ -113,8 +113,8 @@ public class InstructionList implements Iterable { * Do a binary search since the pos array is orderd. */ do { - int i = (l + r) / 2; - int j = pos[i]; + final int i = (l + r) / 2; + final int j = pos[i]; if (j == target) { return ihs[i]; } else if (target < j) { @@ -135,7 +135,7 @@ public class InstructionList implements Iterable { * @return target position's instruction handle if available */ public InstructionHandle findHandle(final int pos) { - int[] positions = byte_positions; + final int[] positions = byte_positions; InstructionHandle ih = start; for (int i = 0; i < length; i++) { if (positions[i] == pos) { @@ -164,12 +164,12 @@ public class InstructionList implements Iterable { */ while (bytes.available() > 0) { // Remember byte offset and associate it with the instruction - int off = bytes.getIndex(); + final int off = bytes.getIndex(); pos[count] = off; /* * Read one instruction from the byte stream, the byte position is set accordingly. */ - Instruction i = Instruction.readInstruction(bytes); + final Instruction i = Instruction.readInstruction(bytes); InstructionHandle ih; if (i instanceof BranchInstruction) { ih = append((BranchInstruction) i); @@ -180,7 +180,7 @@ public class InstructionList implements Iterable { ihs[count] = ih; count++; } - } catch (IOException e) { + } catch (final IOException e) { throw new ClassGenException(e.toString(), e); } byte_positions = new int[count]; // Trim to proper size @@ -190,7 +190,7 @@ public class InstructionList implements Iterable { */ for (int i = 0; i < count; i++) { if (ihs[i] instanceof BranchHandle) { - BranchInstruction bi = (BranchInstruction) ihs[i].getInstruction(); + final BranchInstruction bi = (BranchInstruction) ihs[i].getInstruction(); int target = bi.getPosition() + bi.getIndex(); /* * Byte code position: relative -> absolute. */ @@ -202,8 +202,8 @@ public class InstructionList implements Iterable { bi.setTarget(ih); // Update target // If it is a Select instruction, update all branch targets if (bi instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH - Select s = (Select) bi; - int[] indices = s.getIndices(); + final Select s = (Select) bi; + final int[] indices = s.getIndices(); for (int j = 0; j < indices.length; j++) { target = bi.getPosition() + indices[j]; ih = findHandle(ihs, pos, count, target); @@ -233,8 +233,8 @@ public class InstructionList implements Iterable { if (il.isEmpty()) { return ih; } - InstructionHandle next = ih.getNext(); - InstructionHandle ret = il.start; + final InstructionHandle next = ih.getNext(); + final InstructionHandle ret = il.start; ih.setNext(il.start); il.start.setPrev(ih); il.end.setNext(next); @@ -316,7 +316,7 @@ public class InstructionList implements Iterable { * @return instruction handle of the appended instruction */ public InstructionHandle append(final Instruction i) { - InstructionHandle ih = InstructionHandle.getInstructionHandle(i); + final InstructionHandle ih = InstructionHandle.getInstructionHandle(i); append(ih); return ih; } @@ -329,7 +329,7 @@ public class InstructionList implements Iterable { * @return branch instruction handle of the appended instruction */ public BranchHandle append(final BranchInstruction i) { - BranchHandle ih = BranchHandle.getBranchHandle(i); + final BranchHandle ih = BranchHandle.getBranchHandle(i); append(ih); return ih; } @@ -407,8 +407,8 @@ public class InstructionList implements Iterable { * @return instruction handle pointing to the first appended instruction */ public BranchHandle append(final InstructionHandle ih, final BranchInstruction i) { - BranchHandle bh = BranchHandle.getBranchHandle(i); - InstructionList il = new InstructionList(); + final BranchHandle bh = BranchHandle.getBranchHandle(i); + final InstructionList il = new InstructionList(); il.append(bh); append(ih, il); return bh; @@ -430,8 +430,8 @@ public class InstructionList implements Iterable { if (il.isEmpty()) { return ih; } - InstructionHandle prev = ih.getPrev(); - InstructionHandle ret = il.start; + final InstructionHandle prev = ih.getPrev(); + final InstructionHandle ret = il.start; ih.setPrev(il.end); il.end.setNext(ih); il.start.setPrev(prev); @@ -504,7 +504,7 @@ public class InstructionList implements Iterable { * @return instruction handle of the inserted instruction */ public InstructionHandle insert(final Instruction i) { - InstructionHandle ih = InstructionHandle.getInstructionHandle(i); + final InstructionHandle ih = InstructionHandle.getInstructionHandle(i); insert(ih); return ih; } @@ -517,7 +517,7 @@ public class InstructionList implements Iterable { * @return branch instruction handle of the appended instruction */ public BranchHandle insert(final BranchInstruction i) { - BranchHandle ih = BranchHandle.getBranchHandle(i); + final BranchHandle ih = BranchHandle.getBranchHandle(i); insert(ih); return ih; } @@ -595,8 +595,8 @@ public class InstructionList implements Iterable { * @return instruction handle of the first inserted instruction */ public BranchHandle insert(final InstructionHandle ih, final BranchInstruction i) { - BranchHandle bh = BranchHandle.getBranchHandle(i); - InstructionList il = new InstructionList(); + final BranchHandle bh = BranchHandle.getBranchHandle(i); + final InstructionList il = new InstructionList(); il.append(bh); insert(ih, il); return bh; @@ -630,7 +630,7 @@ public class InstructionList implements Iterable { } } // Step 2: Temporarily remove the given instructions from the list - InstructionHandle prev = start.getPrev(); + final InstructionHandle prev = start.getPrev(); InstructionHandle next = end.getNext(); if (prev != null) { prev.setNext(next); @@ -709,11 +709,11 @@ public class InstructionList implements Iterable { } first.setPrev(null); // Completely separated from rest of list last.setNext(null); - List target_vec = new ArrayList<>(); + final List target_vec = new ArrayList<>(); for (InstructionHandle ih = first; ih != null; ih = ih.getNext()) { ih.getInstruction().dispose(); // e.g. BranchInstructions release their targets } - StringBuilder buf = new StringBuilder("{ "); + final StringBuilder buf = new StringBuilder("{ "); for (InstructionHandle ih = first; ih != null; ih = next) { next = ih.getNext(); length--; @@ -727,7 +727,7 @@ public class InstructionList implements Iterable { } buf.append("}"); if (!target_vec.isEmpty()) { - InstructionHandle[] targeted = new InstructionHandle[target_vec.size()]; + final InstructionHandle[] targeted = new InstructionHandle[target_vec.size()]; target_vec.toArray(targeted); throw new TargetLostException(targeted, buf.toString()); } @@ -854,21 +854,21 @@ public class InstructionList implements Iterable { int additional_bytes = 0; int index = 0; int count = 0; - int[] pos = new int[length]; + final int[] pos = new int[length]; /* * Pass 0: Sanity checks */ if (check) { for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { - Instruction i = ih.getInstruction(); + final Instruction i = ih.getInstruction(); if (i instanceof BranchInstruction) { // target instruction within list? Instruction inst = ((BranchInstruction) i).getTarget().getInstruction(); if (!contains(inst)) { throw new ClassGenException("Branch target of " + Const.getOpcodeName(i.getOpcode()) + ":" + inst + " not in instruction list"); } if (i instanceof Select) { - InstructionHandle[] targets = ((Select) i).getTargets(); - for (InstructionHandle target : targets) { + final InstructionHandle[] targets = ((Select) i).getTargets(); + for (final InstructionHandle target : targets) { inst = target.getInstruction(); if (!contains(inst)) { throw new ClassGenException("Branch target of " + Const.getOpcodeName(i.getOpcode()) + ":" + inst + " not in instruction list"); @@ -886,7 +886,7 @@ public class InstructionList implements Iterable { * Pass 1: Set position numbers and sum up the maximum number of bytes an instruction may be shifted. */ for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { - Instruction i = ih.getInstruction(); + final Instruction i = ih.getInstruction(); ih.setPosition(index); pos[count++] = index; /* @@ -917,7 +917,7 @@ public class InstructionList implements Iterable { */ index = count = 0; for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { - Instruction i = ih.getInstruction(); + final Instruction i = ih.getInstruction(); ih.setPosition(index); pos[count++] = index; index += i.getLength(); @@ -934,15 +934,15 @@ public class InstructionList implements Iterable { public byte[] getByteCode() { // Update position indices of instructions setPositions(); - ByteArrayOutputStream b = new ByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(b); + final ByteArrayOutputStream b = new ByteArrayOutputStream(); + final DataOutputStream out = new DataOutputStream(b); try { for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { - Instruction i = ih.getInstruction(); + final Instruction i = ih.getInstruction(); i.dump(out); // Traverse list } out.flush(); - } catch (IOException e) { + } catch (final IOException e) { System.err.println(e); return new byte[0]; } @@ -953,12 +953,12 @@ public class InstructionList implements Iterable { * @return an array of instructions without target information for branch instructions. */ public Instruction[] getInstructions() { - List instructions = new ArrayList<>(); + final List instructions = new ArrayList<>(); try (ByteSequence bytes = new ByteSequence(getByteCode())) { while (bytes.available() > 0) { instructions.add(Instruction.readInstruction(bytes)); } - } catch (IOException e) { + } catch (final IOException e) { throw new ClassGenException(e.toString(), e); } return instructions.toArray(new Instruction[instructions.size()]); @@ -975,7 +975,7 @@ public class InstructionList implements Iterable { * @return String containing all instructions in this list. */ public String toString(final boolean verbose) { - StringBuilder buf = new StringBuilder(); + final StringBuilder buf = new StringBuilder(); for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { buf.append(ih.toString(verbose)).append("\n"); } @@ -996,7 +996,7 @@ public class InstructionList implements Iterable { if (ih == null) { throw new NoSuchElementException(); } - InstructionHandle i = ih; + final InstructionHandle i = ih; ih = ih.getNext(); return i; } @@ -1017,7 +1017,7 @@ public class InstructionList implements Iterable { * @return array containing all instructions (handles) */ public InstructionHandle[] getInstructionHandles() { - InstructionHandle[] ihs = new InstructionHandle[length]; + final InstructionHandle[] ihs = new InstructionHandle[length]; InstructionHandle ih = start; for (int i = 0; i < length; i++) { ihs[i] = ih; @@ -1040,14 +1040,14 @@ public class InstructionList implements Iterable { * @return complete, i.e., deep copy of this list */ public InstructionList copy() { - Map map = new HashMap<>(); - InstructionList il = new InstructionList(); + final Map map = new HashMap<>(); + final InstructionList il = new InstructionList(); /* * Pass 1: Make copies of all instructions, append them to the new list and associate old instruction references with the new ones, i.e., a 1:1 mapping. */ for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { - Instruction i = ih.getInstruction(); - Instruction c = i.copy(); // Use clone for shallow copy + final Instruction i = ih.getInstruction(); + final Instruction c = i.copy(); // Use clone for shallow copy if (c instanceof BranchInstruction) { map.put(ih, il.append((BranchInstruction) c)); } else { @@ -1060,17 +1060,17 @@ public class InstructionList implements Iterable { InstructionHandle ih = start; InstructionHandle ch = il.start; while (ih != null) { - Instruction i = ih.getInstruction(); - Instruction c = ch.getInstruction(); + final Instruction i = ih.getInstruction(); + final Instruction c = ch.getInstruction(); if (i instanceof BranchInstruction) { - BranchInstruction bi = (BranchInstruction) i; - BranchInstruction bc = (BranchInstruction) c; - InstructionHandle itarget = bi.getTarget(); // old target + final BranchInstruction bi = (BranchInstruction) i; + final BranchInstruction bc = (BranchInstruction) c; + final InstructionHandle itarget = bi.getTarget(); // old target // New target is in hash map bc.setTarget(map.get(itarget)); if (bi instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH - InstructionHandle[] itargets = ((Select) bi).getTargets(); - InstructionHandle[] ctargets = ((Select) bc).getTargets(); + final InstructionHandle[] itargets = ((Select) bi).getTargets(); + final InstructionHandle[] ctargets = ((Select) bc).getTargets(); for (int j = 0; j < itargets.length; j++) { // Update all targets ctargets[j] = map.get(itargets[j]); } @@ -1087,10 +1087,10 @@ public class InstructionList implements Iterable { */ public void replaceConstantPool(final ConstantPoolGen old_cp, final ConstantPoolGen new_cp) { for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { - Instruction i = ih.getInstruction(); + final Instruction i = ih.getInstruction(); if (i instanceof CPInstruction) { - CPInstruction ci = (CPInstruction) i; - Constant c = old_cp.getConstant(ci.getIndex()); + final CPInstruction ci = (CPInstruction) i; + final Constant c = old_cp.getConstant(ci.getIndex()); ci.setIndex(new_cp.addConstant(c, old_cp)); } } @@ -1154,15 +1154,15 @@ public class InstructionList implements Iterable { */ public void redirectBranches(final InstructionHandle old_target, final InstructionHandle new_target) { for (InstructionHandle ih = start; ih != null; ih = ih.getNext()) { - Instruction i = ih.getInstruction(); + final Instruction i = ih.getInstruction(); if (i instanceof BranchInstruction) { - BranchInstruction b = (BranchInstruction) i; - InstructionHandle target = b.getTarget(); + final BranchInstruction b = (BranchInstruction) i; + final InstructionHandle target = b.getTarget(); if (target == old_target) { b.setTarget(new_target); } if (b instanceof Select) { // Either LOOKUPSWITCH or TABLESWITCH - InstructionHandle[] targets = ((Select) b).getTargets(); + final InstructionHandle[] targets = ((Select) b).getTargets(); for (int j = 0; j < targets.length; j++) { if (targets[j] == old_target) { ((Select) b).setTarget(j, new_target); @@ -1185,9 +1185,9 @@ public class InstructionList implements Iterable { * @see MethodGen */ public void redirectLocalVariables(final LocalVariableGen[] lg, final InstructionHandle old_target, final InstructionHandle new_target) { - for (LocalVariableGen element : lg) { - InstructionHandle start = element.getStart(); - InstructionHandle end = element.getEnd(); + for (final LocalVariableGen element : lg) { + final InstructionHandle start = element.getStart(); + final InstructionHandle end = element.getEnd(); if (start == old_target) { element.setStart(new_target); } @@ -1209,7 +1209,7 @@ public class InstructionList implements Iterable { * @see MethodGen */ public void redirectExceptionHandlers(final CodeExceptionGen[] exceptions, final InstructionHandle old_target, final InstructionHandle new_target) { - for (CodeExceptionGen exception : exceptions) { + for (final CodeExceptionGen exception : exceptions) { if (exception.getStartPC() == old_target) { exception.setStartPC(new_target); } @@ -1249,7 +1249,7 @@ public class InstructionList implements Iterable { */ public void update() { if (observers != null) { - for (InstructionListObserver observer : observers) { + for (final InstructionListObserver observer : observers) { observer.notify(this); } } diff --git a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java index 56a396b1..9c821ea8 100644 --- a/src/main/java/org/apache/bcel/generic/InvokeInstruction.java +++ b/src/main/java/org/apache/bcel/generic/InvokeInstruction.java @@ -52,8 +52,8 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti */ @Override public String toString( final ConstantPool cp ) { - Constant c = cp.getConstant(super.getIndex()); - StringTokenizer tok = new StringTokenizer(cp.constantToString(c)); + final Constant c = cp.getConstant(super.getIndex()); + final StringTokenizer tok = new StringTokenizer(cp.constantToString(c)); return Const.getOpcodeName(super.getOpcode()) + " " + tok.nextToken().replace('.', '/') + tok.nextToken(); } @@ -73,7 +73,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti sum = 1; // this reference } - String signature = getSignature(cpg); + final String signature = getSignature(cpg); sum += Type.getArgumentTypesSize(signature); return sum; } @@ -86,7 +86,7 @@ public abstract class InvokeInstruction extends FieldOrMethod implements Excepti */ @Override public int produceStack( final ConstantPoolGen cpg ) { - String signature = getSignature(cpg); + final String signature = getSignature(cpg); return Type.getReturnTypeSize(signature); } diff --git a/src/main/java/org/apache/bcel/generic/JSR.java b/src/main/java/org/apache/bcel/generic/JSR.java index 3feced9f..6fd7668e 100644 --- a/src/main/java/org/apache/bcel/generic/JSR.java +++ b/src/main/java/org/apache/bcel/generic/JSR.java @@ -59,11 +59,11 @@ public class JSR extends JsrInstruction implements VariableLengthInstruction { @Override protected int updatePosition( final int offset, final int max_offset ) { - int i = getTargetOffset(); // Depending on old position value + final int i = getTargetOffset(); // Depending on old position value setPosition(getPosition() + offset); // Position may be shifted by preceding expansions if (Math.abs(i) >= (Short.MAX_VALUE - max_offset)) { // to large for short (estimate) super.setOpcode(org.apache.bcel.Const.JSR_W); - short old_length = (short) super.getLength(); + final short old_length = (short) super.getLength(); super.setLength(5); return super.getLength() - old_length; } diff --git a/src/main/java/org/apache/bcel/generic/JsrInstruction.java b/src/main/java/org/apache/bcel/generic/JsrInstruction.java index c24c3fa3..d0317e3f 100644 --- a/src/main/java/org/apache/bcel/generic/JsrInstruction.java +++ b/src/main/java/org/apache/bcel/generic/JsrInstruction.java @@ -67,7 +67,7 @@ public abstract class JsrInstruction extends BranchInstruction implements Uncond while (ih.getInstruction() != this) { ih = ih.getNext(); } - InstructionHandle toThis = ih; + final InstructionHandle toThis = ih; while (ih != null) { ih = ih.getNext(); if ((ih != null) && (ih.getInstruction() == this)) { diff --git a/src/main/java/org/apache/bcel/generic/LDC.java b/src/main/java/org/apache/bcel/generic/LDC.java index 61a4a8df..b99f851c 100644 --- a/src/main/java/org/apache/bcel/generic/LDC.java +++ b/src/main/java/org/apache/bcel/generic/LDC.java @@ -97,7 +97,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(super.getIndex()); switch (c.getTag()) { case org.apache.bcel.Const.CONSTANT_String: - int i = ((org.apache.bcel.classfile.ConstantString) c).getStringIndex(); + final int i = ((org.apache.bcel.classfile.ConstantString) c).getStringIndex(); c = cpg.getConstantPool().getConstant(i); return ((org.apache.bcel.classfile.ConstantUtf8) c).getBytes(); case org.apache.bcel.Const.CONSTANT_Float: @@ -105,7 +105,7 @@ public class LDC extends CPInstruction implements PushInstruction, ExceptionThro case org.apache.bcel.Const.CONSTANT_Integer: return Integer.valueOf(((org.apache.bcel.classfile.ConstantInteger) c).getBytes()); case org.apache.bcel.Const.CONSTANT_Class: - int nameIndex = ((org.apache.bcel.classfile.ConstantClass) c).getNameIndex(); + final int nameIndex = ((org.apache.bcel.classfile.ConstantClass) c).getNameIndex(); c = cpg.getConstantPool().getConstant(nameIndex); return new ObjectType(((org.apache.bcel.classfile.ConstantUtf8) c).getBytes()); default: // Never reached diff --git a/src/main/java/org/apache/bcel/generic/LDC2_W.java b/src/main/java/org/apache/bcel/generic/LDC2_W.java index 1f02857d..529c01b4 100644 --- a/src/main/java/org/apache/bcel/generic/LDC2_W.java +++ b/src/main/java/org/apache/bcel/generic/LDC2_W.java @@ -53,7 +53,7 @@ public class LDC2_W extends CPInstruction implements PushInstruction { public Number getValue( final ConstantPoolGen cpg ) { - org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(super.getIndex()); + final org.apache.bcel.classfile.Constant c = cpg.getConstantPool().getConstant(super.getIndex()); switch (c.getTag()) { case org.apache.bcel.Const.CONSTANT_Long: return Long.valueOf(((org.apache.bcel.classfile.ConstantLong) c).getBytes()); diff --git a/src/main/java/org/apache/bcel/generic/LineNumberGen.java b/src/main/java/org/apache/bcel/generic/LineNumberGen.java index 92468baf..68c2596a 100644 --- a/src/main/java/org/apache/bcel/generic/LineNumberGen.java +++ b/src/main/java/org/apache/bcel/generic/LineNumberGen.java @@ -90,7 +90,7 @@ public class LineNumberGen implements InstructionTargeter, Cloneable { public Object clone() { try { return super.clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } } diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java index f96d4f39..98c33bcb 100644 --- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java +++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java @@ -86,8 +86,8 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo length += end.getInstruction().getLength(); } } - int name_index = cp.addUtf8(name); - int signature_index = cp.addUtf8(type.getSignature()); + final int name_index = cp.addUtf8(name); + final int signature_index = cp.addUtf8(type.getSignature()); return new LocalVariable(start_pc, length, name_index, signature_index, index, cp .getConstantPool()); } @@ -204,7 +204,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo if (!(o instanceof LocalVariableGen)) { return false; } - LocalVariableGen l = (LocalVariableGen) o; + final LocalVariableGen l = (LocalVariableGen) o; return (l.index == index) && (l.start == start) && (l.end == end); } @@ -219,7 +219,7 @@ public class LocalVariableGen implements InstructionTargeter, NamedAndTyped, Clo public Object clone() { try { return super.clone(); - } catch (CloneNotSupportedException e) { + } catch (final CloneNotSupportedException e) { throw new Error("Clone Not Supported"); // never happens } } diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java index 2e3df555..58b94ae7 100644 --- a/src/main/java/org/apache/bcel/generic/MethodGen.java +++ b/src/main/java/org/apache/bcel/generic/MethodGen.java @@ -79,8 +79,8 @@ public class MethodGen extends FieldGenOrMethodGen { @Override public boolean equals( final Object o1, final Object o2 ) { - MethodGen THIS = (MethodGen) o1; - MethodGen THAT = (MethodGen) o2; + final MethodGen THIS = (MethodGen) o1; + final MethodGen THAT = (MethodGen) o2; return THIS.getName().equals(THAT.getName()) && THIS.getSignature().equals(THAT.getSignature()); } @@ -88,7 +88,7 @@ public class MethodGen extends FieldGenOrMethodGen { @Override public int hashCode( final Object o ) { - MethodGen THIS = (MethodGen) o; + final MethodGen THIS = (MethodGen) o; return THIS.getSignature().hashCode() ^ THIS.getName().hashCode(); } }; @@ -126,7 +126,7 @@ public class MethodGen extends FieldGenOrMethodGen { setClassName(class_name); setInstructionList(il); setConstantPool(cp); - boolean abstract_ = isAbstract() || isNative(); + final boolean abstract_ = isAbstract() || isNative(); InstructionHandle start = null; InstructionHandle end = null; if (!abstract_) { @@ -139,8 +139,8 @@ public class MethodGen extends FieldGenOrMethodGen { } } if (arg_types != null) { - int size = arg_types.length; - for (Type arg_type : arg_types) { + final int size = arg_types.length; + for (final Type arg_type : arg_types) { if (Type.VOID == arg_type) { throw new ClassGenException("'void' is an illegal argument type for a method"); } @@ -180,25 +180,25 @@ public class MethodGen extends FieldGenOrMethodGen { ((m.getAccessFlags() & (Const.ACC_ABSTRACT | Const.ACC_NATIVE)) == 0) ? new InstructionList(m.getCode().getCode()) : null, cp); - Attribute[] attributes = m.getAttributes(); - for (Attribute attribute : attributes) { + final Attribute[] attributes = m.getAttributes(); + for (final Attribute attribute : attributes) { Attribute a = attribute; if (a instanceof Code) { - Code c = (Code) a; + final Code c = (Code) a; setMaxStack(c.getMaxStack()); setMaxLocals(c.getMaxLocals()); - CodeException[] ces = c.getExceptionTable(); + final CodeException[] ces = c.getExceptionTable(); if (ces != null) { - for (CodeException ce : ces) { - int type = ce.getCatchType(); + for (final CodeException ce : ces) { + final int type = ce.getCatchType(); ObjectType c_type = null; if (type > 0) { - String cen = m.getConstantPool().getConstantString(type, + final String cen = m.getConstantPool().getConstantString(type, Const.CONSTANT_Class); c_type = ObjectType.getInstance(cen); } - int end_pc = ce.getEndPC(); - int length = m.getCode().getCode().length; + final int end_pc = ce.getEndPC(); + final int length = m.getCode().getCode().length; InstructionHandle end; if (length == end_pc) { // May happen, because end_pc is exclusive end = il.getEnd(); @@ -210,21 +210,21 @@ public class MethodGen extends FieldGenOrMethodGen { .getHandlerPC()), c_type); } } - Attribute[] c_attributes = c.getAttributes(); - for (Attribute c_attribute : c_attributes) { + final Attribute[] c_attributes = c.getAttributes(); + for (final Attribute c_attribute : c_attributes) { a = c_attribute; if (a instanceof LineNumberTable) { - LineNumber[] ln = ((LineNumberTable) a).getLineNumberTable(); - for (LineNumber l : ln) { - InstructionHandle ih = il.findHandle(l.getStartPC()); + final LineNumber[] ln = ((LineNumberTable) a).getLineNumberTable(); + for (final LineNumber l : ln) { + final InstructionHandle ih = il.findHandle(l.getStartPC()); if (ih != null) { addLineNumber(ih, l.getLineNumber()); } } } else if (a instanceof LocalVariableTable) { - LocalVariable[] lv = ((LocalVariableTable) a).getLocalVariableTable(); + final LocalVariable[] lv = ((LocalVariableTable) a).getLocalVariableTable(); removeLocalVariables(); - for (LocalVariable l : lv) { + for (final LocalVariable l : lv) { InstructionHandle start = il.findHandle(l.getStartPC()); InstructionHandle end = il.findHandle(l.getStartPC() + l.getLength()); // Repair malformed handles @@ -242,14 +242,14 @@ public class MethodGen extends FieldGenOrMethodGen { } } } else if (a instanceof ExceptionTable) { - String[] names = ((ExceptionTable) a).getExceptionNames(); - for (String name2 : names) { + final String[] names = ((ExceptionTable) a).getExceptionNames(); + for (final String name2 : names) { addException(name2); } } else if (a instanceof Annotations) { - Annotations runtimeAnnotations = (Annotations) a; - AnnotationEntry[] aes = runtimeAnnotations.getAnnotationEntries(); - for (AnnotationEntry element : aes) { + final Annotations runtimeAnnotations = (Annotations) a; + final AnnotationEntry[] aes = runtimeAnnotations.getAnnotationEntries(); + for (final AnnotationEntry element : aes) { addAnnotationEntry(new AnnotationEntryGen(element, cp, false)); } } else { @@ -273,13 +273,13 @@ public class MethodGen extends FieldGenOrMethodGen { */ public LocalVariableGen addLocalVariable( final String name, final Type type, final int slot, final InstructionHandle start, final InstructionHandle end ) { - byte t = type.getType(); + final byte t = type.getType(); if (t != Const.T_ADDRESS) { - int add = type.getSize(); + final int add = type.getSize(); if (slot + add > max_locals) { max_locals = slot + add; } - LocalVariableGen l = new LocalVariableGen(slot, name, type, start, end); + final LocalVariableGen l = new LocalVariableGen(slot, name, type, start, end); int i; if ((i = variable_vec.indexOf(l)) >= 0) { variable_vec.set(i, l); @@ -325,7 +325,7 @@ public class MethodGen extends FieldGenOrMethodGen { * Remove all local variables. */ public void removeLocalVariables() { - for (LocalVariableGen lv : variable_vec) { + for (final LocalVariableGen lv : variable_vec) { lv.dispose(); } variable_vec.clear(); @@ -339,8 +339,8 @@ public class MethodGen extends FieldGenOrMethodGen { * @return array of declared local variables sorted by index */ public LocalVariableGen[] getLocalVariables() { - int size = variable_vec.size(); - LocalVariableGen[] lg = new LocalVariableGen[size]; + final int size = variable_vec.size(); + final LocalVariableGen[] lg = new LocalVariableGen[size]; variable_vec.toArray(lg); for (int i = 0; i < size; i++) { if ((lg[i].getStart() == null) && (il != null)) { @@ -366,9 +366,9 @@ public class MethodGen extends FieldGenOrMethodGen { * @return `LocalVariableTable' attribute of all the local variables of this method. */ public LocalVariableTable getLocalVariableTable( final ConstantPoolGen cp ) { - LocalVariableGen[] lg = getLocalVariables(); - int size = lg.length; - LocalVariable[] lv = new LocalVariable[size]; + final LocalVariableGen[] lg = getLocalVariables(); + final int size = lg.length; + final LocalVariable[] lv = new LocalVariable[size]; for (int i = 0; i < size; i++) { lv[i] = lg[i].getLocalVariable(cp); } @@ -385,7 +385,7 @@ public class MethodGen extends FieldGenOrMethodGen { * @see LineNumber */ public LineNumberGen addLineNumber( final InstructionHandle ih, final int src_line ) { - LineNumberGen l = new LineNumberGen(ih, src_line); + final LineNumberGen l = new LineNumberGen(ih, src_line); line_number_vec.add(l); return l; } @@ -411,7 +411,7 @@ public class MethodGen extends FieldGenOrMethodGen { * @return array of line numbers */ public LineNumberGen[] getLineNumbers() { - LineNumberGen[] lg = new LineNumberGen[line_number_vec.size()]; + final LineNumberGen[] lg = new LineNumberGen[line_number_vec.size()]; line_number_vec.toArray(lg); return lg; } @@ -421,8 +421,8 @@ public class MethodGen extends FieldGenOrMethodGen { * @return `LineNumberTable' attribute of all the local variables of this method. */ public LineNumberTable getLineNumberTable( final ConstantPoolGen cp ) { - int size = line_number_vec.size(); - LineNumber[] ln = new LineNumber[size]; + final int size = line_number_vec.size(); + final LineNumber[] ln = new LineNumber[size]; for (int i = 0; i < size; i++) { ln[i] = line_number_vec.get(i).getLineNumber(); } @@ -447,7 +447,7 @@ public class MethodGen extends FieldGenOrMethodGen { if ((start_pc == null) || (end_pc == null) || (handler_pc == null)) { throw new ClassGenException("Exception handler target is null instruction"); } - CodeExceptionGen c = new CodeExceptionGen(start_pc, end_pc, handler_pc, catch_type); + final CodeExceptionGen c = new CodeExceptionGen(start_pc, end_pc, handler_pc, catch_type); exception_vec.add(c); return c; } @@ -473,7 +473,7 @@ public class MethodGen extends FieldGenOrMethodGen { * @return array of declared exception handlers */ public CodeExceptionGen[] getExceptionHandlers() { - CodeExceptionGen[] cg = new CodeExceptionGen[exception_vec.size()]; + final CodeExceptionGen[] cg = new CodeExceptionGen[exception_vec.size()]; exception_vec.toArray(cg); return cg; } @@ -483,10 +483,10 @@ public class MethodGen extends FieldGenOrMethodGen { * @return code exceptions for `Code' attribute */ private CodeException[] getCodeExceptions() { - int size = exception_vec.size(); - CodeException[] c_exc = new CodeException[size]; + final int size = exception_vec.size(); + final CodeException[] c_exc = new CodeException[size]; for (int i = 0; i < size; i++) { - CodeExceptionGen c = exception_vec.get(i); + final CodeExceptionGen c = exception_vec.get(i); c_exc[i] = c.getCodeException(super.getConstantPool()); } return c_exc; @@ -523,7 +523,7 @@ public class MethodGen extends FieldGenOrMethodGen { * @return array of thrown exceptions */ public String[] getExceptions() { - String[] e = new String[throws_vec.size()]; + final String[] e = new String[throws_vec.size()]; throws_vec.toArray(e); return e; } @@ -533,8 +533,8 @@ public class MethodGen extends FieldGenOrMethodGen { * @return `Exceptions' attribute of all the exceptions thrown by this method. */ private ExceptionTable getExceptionTable( final ConstantPoolGen cp ) { - int size = throws_vec.size(); - int[] ex = new int[size]; + final int size = throws_vec.size(); + final int[] ex = new int[size]; for (int i = 0; i < size; i++) { ex[i] = cp.addClass(throws_vec.get(i)); } @@ -576,7 +576,7 @@ public class MethodGen extends FieldGenOrMethodGen { * @return all attributes of this method. */ public Attribute[] getCodeAttributes() { - Attribute[] attributes = new Attribute[code_attrs_vec.size()]; + final Attribute[] attributes = new Attribute[code_attrs_vec.size()]; code_attrs_vec.toArray(attributes); return attributes; } @@ -585,8 +585,8 @@ public class MethodGen extends FieldGenOrMethodGen { * @since 6.0 */ public void addAnnotationsAsAttribute(final ConstantPoolGen cp) { - Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp, super.getAnnotationEntries()); - for (Attribute attr : attrs) { + final Attribute[] attrs = AnnotationEntryGen.getAnnotationAttributes(cp, super.getAnnotationEntries()); + for (final Attribute attr : attrs) { addAttribute(attr); } } @@ -598,9 +598,9 @@ public class MethodGen extends FieldGenOrMethodGen { if (!hasParameterAnnotations) { return; } - Attribute[] attrs = AnnotationEntryGen.getParameterAnnotationAttributes(cp,param_annotations); + final Attribute[] attrs = AnnotationEntryGen.getParameterAnnotationAttributes(cp,param_annotations); if (attrs!=null) { - for (Attribute attr : attrs) { + for (final Attribute attr : attrs) { addAttribute(attr); } } @@ -614,10 +614,10 @@ public class MethodGen extends FieldGenOrMethodGen { * @return method object */ public Method getMethod() { - String signature = getSignature(); + final String signature = getSignature(); final ConstantPoolGen _cp = super.getConstantPool(); - int name_index = _cp.addUtf8(super.getName()); - int signature_index = _cp.addUtf8(signature); + final int name_index = _cp.addUtf8(super.getName()); + final int signature_index = _cp.addUtf8(signature); /* Also updates positions of instructions, i.e., their indices */ byte[] byte_code = null; @@ -634,20 +634,20 @@ public class MethodGen extends FieldGenOrMethodGen { if ((line_number_vec.size() > 0) && !strip_attributes) { addCodeAttribute(lnt = getLineNumberTable(_cp)); } - Attribute[] code_attrs = getCodeAttributes(); + final Attribute[] code_attrs = getCodeAttributes(); /* Each attribute causes 6 additional header bytes */ int attrs_len = 0; - for (Attribute code_attr : code_attrs) { + for (final Attribute code_attr : code_attrs) { attrs_len += code_attr.getLength() + 6; } - CodeException[] c_exc = getCodeExceptions(); - int exc_len = c_exc.length * 8; // Every entry takes 8 bytes + final CodeException[] c_exc = getCodeExceptions(); + final int exc_len = c_exc.length * 8; // Every entry takes 8 bytes Code code = null; if ((il != null) && !isAbstract() && !isNative()) { // Remove any stale code attribute - Attribute[] attributes = getAttributes(); - for (Attribute a : attributes) { + final Attribute[] attributes = getAttributes(); + for (final Attribute a : attributes) { if (a instanceof Code) { removeAttribute(a); } @@ -665,7 +665,7 @@ public class MethodGen extends FieldGenOrMethodGen { addAttribute(et = getExceptionTable(_cp)); // Add `Exceptions' if there are "throws" clauses } - Method m = new Method(super.getAccessFlags(), name_index, signature_index, getAttributes(), _cp + final Method m = new Method(super.getAccessFlags(), name_index, signature_index, getAttributes(), _cp .getConstantPool()); // Undo effects of adding attributes if (lvt != null) { @@ -699,9 +699,9 @@ public class MethodGen extends FieldGenOrMethodGen { if ((next != null) && (ih.getInstruction() instanceof NOP)) { try { il.delete(ih); - } catch (TargetLostException e) { - for (InstructionHandle target : e.getTargets()) { - for (InstructionTargeter targeter : target.getTargeters()) { + } catch (final TargetLostException e) { + for (final InstructionHandle target : e.getTargets()) { + for (final InstructionTargeter targeter : target.getTargeters()) { targeter.updateTarget(target, next); } } @@ -835,15 +835,15 @@ public class MethodGen extends FieldGenOrMethodGen { if (il != null) { int max = isStatic() ? 0 : 1; if (arg_types != null) { - for (Type arg_type : arg_types) { + for (final Type arg_type : arg_types) { max += arg_type.getSize(); } } for (InstructionHandle ih = il.getStart(); ih != null; ih = ih.getNext()) { - Instruction ins = ih.getInstruction(); + final Instruction ins = ih.getInstruction(); if ((ins instanceof LocalVariableInstruction) || (ins instanceof RET) || (ins instanceof IINC)) { - int index = ((IndexedInstruction) ins).getIndex() + final int index = ((IndexedInstruction) ins).getIndex() + ((TypedInstruction) ins).getType(super.getConstantPool()).getSize(); if (index > max) { max = index; @@ -892,7 +892,7 @@ public class MethodGen extends FieldGenOrMethodGen { public BranchTarget pop() { if (!branchTargets.empty()) { - BranchTarget bt = branchTargets.pop(); + final BranchTarget bt = branchTargets.pop(); return bt; } return null; @@ -900,7 +900,7 @@ public class MethodGen extends FieldGenOrMethodGen { private BranchTarget visit( final InstructionHandle target, final int stackDepth ) { - BranchTarget bt = new BranchTarget(target, stackDepth); + final BranchTarget bt = new BranchTarget(target, stackDepth); visitedTargets.put(target, bt); return bt; } @@ -918,14 +918,14 @@ public class MethodGen extends FieldGenOrMethodGen { * @return maximum stack depth used by method */ public static int getMaxStack( final ConstantPoolGen cp, final InstructionList il, final CodeExceptionGen[] et ) { - BranchStack branchTargets = new BranchStack(); + final BranchStack branchTargets = new BranchStack(); /* Initially, populate the branch stack with the exception * handlers, because these aren't (necessarily) branched to * explicitly. in each case, the stack will have depth 1, * containing the exception object. */ - for (CodeExceptionGen element : et) { - InstructionHandle handler_pc = element.getHandlerPC(); + for (final CodeExceptionGen element : et) { + final InstructionHandle handler_pc = element.getHandlerPC(); if (handler_pc != null) { branchTargets.push(handler_pc, 1); } @@ -934,21 +934,21 @@ public class MethodGen extends FieldGenOrMethodGen { int maxStackDepth = 0; InstructionHandle ih = il.getStart(); while (ih != null) { - Instruction instruction = ih.getInstruction(); - short opcode = instruction.getOpcode(); - int delta = instruction.produceStack(cp) - instruction.consumeStack(cp); + final Instruction instruction = ih.getInstruction(); + final short opcode = instruction.getOpcode(); + final int delta = instruction.produceStack(cp) - instruction.consumeStack(cp); stackDepth += delta; if (stackDepth > maxStackDepth) { maxStackDepth = stackDepth; } // choose the next instruction based on whether current is a branch. if (instruction instanceof BranchInstruction) { - BranchInstruction branch = (BranchInstruction) instruction; + final BranchInstruction branch = (BranchInstruction) instruction; if (instruction instanceof Select) { // explore all of the select's targets. the default target is handled below. - Select select = (Select) branch; - InstructionHandle[] targets = select.getTargets(); - for (InstructionHandle target : targets) { + final Select select = (Select) branch; + final InstructionHandle[] targets = select.getTargets(); + for (final InstructionHandle target : targets) { branchTargets.push(target, stackDepth); } // nothing to fall through to. @@ -978,7 +978,7 @@ public class MethodGen extends FieldGenOrMethodGen { } // if we have no more instructions, see if there are any deferred branches to explore. if (ih == null) { - BranchTarget bt = branchTargets.pop(); + final BranchTarget bt = branchTargets.pop(); if (bt != null) { ih = bt.target; stackDepth = bt.stackDepth; @@ -1016,7 +1016,7 @@ public class MethodGen extends FieldGenOrMethodGen { */ public void update() { if (observers != null) { - for (MethodObserver observer : observers) { + for (final MethodObserver observer : observers) { observer.notify(this); } } @@ -1031,19 +1031,19 @@ public class MethodGen extends FieldGenOrMethodGen { */ @Override public final String toString() { - String access = Utility.accessToString(super.getAccessFlags()); + final String access = Utility.accessToString(super.getAccessFlags()); String signature = Type.getMethodSignature(super.getType(), arg_types); signature = Utility.methodSignatureToString(signature, super.getName(), access, true, getLocalVariableTable(super.getConstantPool())); - StringBuilder buf = new StringBuilder(signature); - for (Attribute a : getAttributes()) { + final StringBuilder buf = new StringBuilder(signature); + for (final Attribute a : getAttributes()) { if (!((a instanceof Code) || (a instanceof ExceptionTable))) { buf.append(" [").append(a).append("]"); } } if (throws_vec.size() > 0) { - for (String throwsDescriptor : throws_vec) { + for (final String throwsDescriptor : throws_vec) { buf.append("\n\t\tthrows ").append(throwsDescriptor); } } @@ -1054,8 +1054,8 @@ public class MethodGen extends FieldGenOrMethodGen { /** @return deep copy of this method */ public MethodGen copy( final String class_name, final ConstantPoolGen cp ) { - Method m = ((MethodGen) clone()).getMethod(); - MethodGen mg = new MethodGen(m, class_name, super.getConstantPool()); + final Method m = ((MethodGen) clone()).getMethod(); + final MethodGen mg = new MethodGen(m, class_name, super.getConstantPool()); if (super.getConstantPool() != cp) { mg.setConstantPool(cp); mg.getInstructionList().replaceConstantPool(super.getConstantPool(), cp); @@ -1091,10 +1091,10 @@ public class MethodGen extends FieldGenOrMethodGen { return; } // Find attributes that contain parameter annotation data - Attribute[] attrs = getAttributes(); + final Attribute[] attrs = getAttributes(); ParameterAnnotations paramAnnVisAttr = null; ParameterAnnotations paramAnnInvisAttr = null; - for (Attribute attribute : attrs) { + for (final Attribute attribute : attrs) { if (attribute instanceof ParameterAnnotations) { // Initialize param_annotations @@ -1108,7 +1108,7 @@ public class MethodGen extends FieldGenOrMethodGen { } } hasParameterAnnotations = true; - ParameterAnnotations rpa = (ParameterAnnotations) attribute; + final ParameterAnnotations rpa = (ParameterAnnotations) attribute; if (rpa instanceof RuntimeVisibleParameterAnnotations) { paramAnnVisAttr = rpa; } else { @@ -1117,10 +1117,10 @@ public class MethodGen extends FieldGenOrMethodGen { for (int j = 0; j < arg_types.length; j++) { // This returns Annotation[] ... - ParameterAnnotationEntry immutableArray = rpa + final ParameterAnnotationEntry immutableArray = rpa .getParameterAnnotationEntries()[j]; // ... which needs transforming into an AnnotationGen[] ... - List mutable = makeMutableVersion(immutableArray.getAnnotationEntries()); + final List mutable = makeMutableVersion(immutableArray.getAnnotationEntries()); // ... then add these to any we already know about param_annotations[j].addAll(mutable); } @@ -1137,8 +1137,8 @@ public class MethodGen extends FieldGenOrMethodGen { private List makeMutableVersion(final AnnotationEntry[] mutableArray) { - List result = new ArrayList<>(); - for (AnnotationEntry element : mutableArray) { + final List result = new ArrayList<>(); + for (final AnnotationEntry element : mutableArray) { result.add(new AnnotationEntryGen(element, getConstantPool(), false)); } @@ -1156,14 +1156,14 @@ public class MethodGen extends FieldGenOrMethodGen { param_annotations = parmList; hasParameterAnnotations = true; } - List existingAnnotations = param_annotations[parameterIndex]; + final List existingAnnotations = param_annotations[parameterIndex]; if (existingAnnotations != null) { existingAnnotations.add(annotation); } else { - List l = new ArrayList<>(); + final List l = new ArrayList<>(); l.add(annotation); param_annotations[parameterIndex] = l; } diff --git a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java index f98cbb05..b04ac61b 100644 --- a/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java +++ b/src/main/java/org/apache/bcel/generic/NameSignatureInstruction.java @@ -40,23 +40,23 @@ public abstract class NameSignatureInstruction extends CPInstruction { } public ConstantNameAndType getNameAndType(final ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); + final ConstantPool cp = cpg.getConstantPool(); + final ConstantCP cmr = (ConstantCP) cp.getConstant(super.getIndex()); return (ConstantNameAndType) cp.getConstant(cmr.getNameAndTypeIndex()); } /** @return signature of referenced method/field. */ public String getSignature(final ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantNameAndType cnat = getNameAndType(cpg); + final ConstantPool cp = cpg.getConstantPool(); + final ConstantNameAndType cnat = getNameAndType(cpg); return ((ConstantUtf8) cp.getConstant(cnat.getSignatureIndex())).getBytes(); } /** @return name of referenced method/field. */ public String getName(final ConstantPoolGen cpg) { - ConstantPool cp = cpg.getConstantPool(); - ConstantNameAndType cnat = getNameAndType(cpg); + final ConstantPool cp = cpg.getConstantPool(); + final ConstantNameAndType cnat = getNameAndType(cpg); return ((ConstantUtf8) cp.getConstant(cnat.getNameIndex())).getBytes(); } diff --git a/src/main/java/org/apache/bcel/generic/ObjectType.java b/src/main/java/org/apache/bcel/generic/ObjectType.java index 0f9c1758..6e8c5a39 100644 --- a/src/main/java/org/apache/bcel/generic/ObjectType.java +++ b/src/main/java/org/apache/bcel/generic/ObjectType.java @@ -81,9 +81,9 @@ public class ObjectType extends ReferenceType { @Deprecated public boolean referencesClass() { try { - JavaClass jc = Repository.lookupClass(class_name); + final JavaClass jc = Repository.lookupClass(class_name); return jc.isClass(); - } catch (ClassNotFoundException e) { + } catch (final ClassNotFoundException e) { return false; } } @@ -99,9 +99,9 @@ public class ObjectType extends ReferenceType { @Deprecated public boolean referencesInterface() { try { - JavaClass jc = Repository.lookupClass(class_name); + final JavaClass jc = Repository.lookupClass(class_name); return !jc.isClass(); - } catch (ClassNotFoundException e) { + } catch (final ClassNotFoundException e) { return false; } } @@ -116,7 +116,7 @@ public class ObjectType extends ReferenceType { * referenced by this type can't be found */ public boolean referencesClassExact() throws ClassNotFoundException { - JavaClass jc = Repository.lookupClass(class_name); + final JavaClass jc = Repository.lookupClass(class_name); return jc.isClass(); } @@ -130,7 +130,7 @@ public class ObjectType extends ReferenceType { * referenced by this type can't be found */ public boolean referencesInterfaceExact() throws ClassNotFoundException { - JavaClass jc = Repository.lookupClass(class_name); + final JavaClass jc = Repository.lookupClass(class_name); return !jc.isClass(); } @@ -154,11 +154,11 @@ public class ObjectType extends ReferenceType { * can't be found */ public boolean accessibleTo( final ObjectType accessor ) throws ClassNotFoundException { - JavaClass jc = Repository.lookupClass(class_name); + final JavaClass jc = Repository.lookupClass(class_name); if (jc.isPublic()) { return true; } - JavaClass acc = Repository.lookupClass(accessor.class_name); + final JavaClass acc = Repository.lookupClass(accessor.class_name); return acc.getPackageName().equals(jc.getPackageName()); } } diff --git a/src/main/java/org/apache/bcel/generic/ReferenceType.java b/src/main/java/org/apache/bcel/generic/ReferenceType.java index d3ac34ac..143b1718 100644 --- a/src/main/java/org/apache/bcel/generic/ReferenceType.java +++ b/src/main/java/org/apache/bcel/generic/ReferenceType.java @@ -73,7 +73,7 @@ public abstract class ReferenceType extends Type { if (!(t instanceof ReferenceType)) { return false; } - ReferenceType T = (ReferenceType) t; + final ReferenceType T = (ReferenceType) t; if (this.equals(Type.NULL)) { return true; // This is not explicitely stated, but clear. Isn't it? } @@ -141,8 +141,8 @@ public abstract class ReferenceType extends Type { if (T instanceof ArrayType) { /* TC and SC are the same primitive type (�2.4.1). */ - Type sc = ((ArrayType) this).getElementType(); - Type tc = ((ArrayType) T).getElementType(); + final Type sc = ((ArrayType) this).getElementType(); + final Type tc = ((ArrayType) T).getElementType(); if (sc instanceof BasicType && tc instanceof BasicType && sc.equals(tc)) { return true; } @@ -161,7 +161,7 @@ public abstract class ReferenceType extends Type { // on one of them "interfaces implemented by arrays" is exchanged with "'Cloneable' or // 'java.io.Serializable'" if ((T instanceof ObjectType) && (((ObjectType) T).referencesInterfaceExact())) { - for (String element : Const.getInterfacesImplementedByArrays()) { + for (final String element : Const.getInterfacesImplementedByArrays()) { if (T.equals(ObjectType.getInstance(element))) { return true; } @@ -209,8 +209,8 @@ public abstract class ReferenceType extends Type { } /* This code is from a bug report by Konstantin Shagin */ if ((this instanceof ArrayType) && (t instanceof ArrayType)) { - ArrayType arrType1 = (ArrayType) this; - ArrayType arrType2 = (ArrayType) t; + final ArrayType arrType1 = (ArrayType) this; + final ArrayType arrType2 = (ArrayType) t; if ((arrType1.getDimensions() == arrType2.getDimensions()) && arrType1.getBasicType() instanceof ObjectType && arrType2.getBasicType() instanceof ObjectType) { @@ -231,22 +231,22 @@ public abstract class ReferenceType extends Type { // superinterfaces or even castability or assignment compatibility. } // this and t are ObjectTypes, see above. - ObjectType thiz = (ObjectType) this; - ObjectType other = (ObjectType) t; - JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); - JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); + final ObjectType thiz = (ObjectType) this; + final ObjectType other = (ObjectType) t; + final JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); + final JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); if ((thiz_sups == null) || (other_sups == null)) { return null; } // Waaahh... - JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; - JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; + final JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; + final JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); this_sups[0] = Repository.lookupClass(thiz.getClassName()); t_sups[0] = Repository.lookupClass(other.getClassName()); - for (JavaClass t_sup : t_sups) { - for (JavaClass this_sup : this_sups) { + for (final JavaClass t_sup : t_sups) { + for (final JavaClass this_sup : this_sups) { if (this_sup.equals(t_sup)) { return ObjectType.getInstance(this_sup.getClassName()); } @@ -303,22 +303,22 @@ public abstract class ReferenceType extends Type { // superinterfaces or even castability or assignment compatibility. } // this and t are ObjectTypes, see above. - ObjectType thiz = (ObjectType) this; - ObjectType other = (ObjectType) t; - JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); - JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); + final ObjectType thiz = (ObjectType) this; + final ObjectType other = (ObjectType) t; + final JavaClass[] thiz_sups = Repository.getSuperClasses(thiz.getClassName()); + final JavaClass[] other_sups = Repository.getSuperClasses(other.getClassName()); if ((thiz_sups == null) || (other_sups == null)) { return null; } // Waaahh... - JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; - JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; + final JavaClass[] this_sups = new JavaClass[thiz_sups.length + 1]; + final JavaClass[] t_sups = new JavaClass[other_sups.length + 1]; System.arraycopy(thiz_sups, 0, this_sups, 1, thiz_sups.length); System.arraycopy(other_sups, 0, t_sups, 1, other_sups.length); this_sups[0] = Repository.lookupClass(thiz.getClassName()); t_sups[0] = Repository.lookupClass(other.getClassName()); - for (JavaClass t_sup : t_sups) { - for (JavaClass this_sup : this_sups) { + for (final JavaClass t_sup : t_sups) { + for (final JavaClass this_sup : this_sups) { if (this_sup.equals(t_sup)) { return ObjectType.getInstance(this_sup.getClassName()); } diff --git a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java index d99d8fef..d61e9937 100644 --- a/src/main/java/org/apache/bcel/generic/ReturnaddressType.java +++ b/src/main/java/org/apache/bcel/generic/ReturnaddressType.java @@ -67,7 +67,7 @@ public class ReturnaddressType extends Type { if (!(rat instanceof ReturnaddressType)) { return false; } - ReturnaddressType that = (ReturnaddressType) rat; + final ReturnaddressType that = (ReturnaddressType) rat; if (this.returnTarget == null || that.returnTarget == null) { return that.returnTarget == this.returnTarget; } diff --git a/src/main/java/org/apache/bcel/generic/SWITCH.java b/src/main/java/org/apache/bcel/generic/SWITCH.java index 948a3ed7..c1fb9f6f 100644 --- a/src/main/java/org/apache/bcel/generic/SWITCH.java +++ b/src/main/java/org/apache/bcel/generic/SWITCH.java @@ -70,15 +70,15 @@ public final class SWITCH implements CompoundInstruction { private void fillup( final int max_gap, final InstructionHandle target ) { - int max_size = match_length + match_length * max_gap; - int[] m_vec = new int[max_size]; - InstructionHandle[] t_vec = new InstructionHandle[max_size]; + final int max_size = match_length + match_length * max_gap; + final int[] m_vec = new int[max_size]; + final InstructionHandle[] t_vec = new InstructionHandle[max_size]; int count = 1; m_vec[0] = match[0]; t_vec[0] = targets[0]; for (int i = 1; i < match_length; i++) { - int prev = match[i - 1]; - int gap = match[i] - prev; + final int prev = match[i - 1]; + final int gap = match[i] - prev; for (int j = 1; j < gap; j++) { m_vec[count] = prev + j; t_vec[count] = target; @@ -102,7 +102,7 @@ public final class SWITCH implements CompoundInstruction { int i = l; int j = r; int h; - int m = match[(l + r) / 2]; + final int m = match[(l + r) / 2]; InstructionHandle h2; do { while (match[i] < m) { diff --git a/src/main/java/org/apache/bcel/generic/Select.java b/src/main/java/org/apache/bcel/generic/Select.java index 00463be8..c2766af0 100644 --- a/src/main/java/org/apache/bcel/generic/Select.java +++ b/src/main/java/org/apache/bcel/generic/Select.java @@ -95,7 +95,7 @@ public abstract class Select extends BranchInstruction implements VariableLength this.targets = targets; // now it's safe to set default target setTarget(defaultTarget); - for (InstructionHandle target2 : targets) { + for (final InstructionHandle target2 : targets) { notifyTarget(null, target2, this); } if ((match_length = match.length) != targets.length) { @@ -122,7 +122,7 @@ public abstract class Select extends BranchInstruction implements VariableLength @Override protected int updatePosition( final int offset, final int max_offset ) { setPosition(getPosition() + offset); // Additional offset caused by preceding SWITCHs, GOTOs, etc. - short old_length = (short) super.getLength(); + final short old_length = (short) super.getLength(); /* Alignment on 4-byte-boundary, + 1, because of tag byte. */ padding = (4 - ((getPosition() + 1) % 4)) % 4; @@ -165,7 +165,7 @@ public abstract class Select extends BranchInstruction implements VariableLength */ @Override public String toString( final boolean verbose ) { - StringBuilder buf = new StringBuilder(super.toString(verbose)); + final StringBuilder buf = new StringBuilder(super.toString(verbose)); if (verbose) { for (int i = 0; i < match_length; i++) { String s = "null"; @@ -222,7 +222,7 @@ public abstract class Select extends BranchInstruction implements VariableLength if (super.getTarget() == ih) { return true; } - for (InstructionHandle target2 : targets) { + for (final InstructionHandle target2 : targets) { if (target2 == ih) { return true; } @@ -233,7 +233,7 @@ public abstract class Select extends BranchInstruction implements VariableLength @Override protected Object clone() throws CloneNotSupportedException { - Select copy = (Select) super.clone(); + final Select copy = (Select) super.clone(); copy.match = match.clone(); copy.indices = indices.clone(); copy.targets = targets.clone(); @@ -247,7 +247,7 @@ public abstract class Select extends BranchInstruction implements VariableLength @Override void dispose() { super.dispose(); - for (InstructionHandle target2 : targets) { + for (final InstructionHandle target2 : targets) { target2.removeTargeter(this); } } diff --git a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java index 2a7abaee..f8334389 100644 --- a/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java +++ b/src/main/java/org/apache/bcel/generic/SimpleElementValueGen.java @@ -188,7 +188,7 @@ public class SimpleElementValueGen extends ElementValueGen throw new RuntimeException( "Dont call getValueString() on a non STRING ElementValue"); } - ConstantUtf8 c = (ConstantUtf8) getConstantPool().getConstant(idx); + final ConstantUtf8 c = (ConstantUtf8) getConstantPool().getConstant(idx); return c.getBytes(); } @@ -198,7 +198,7 @@ public class SimpleElementValueGen extends ElementValueGen throw new RuntimeException( "Dont call getValueString() on a non STRING ElementValue"); } - ConstantInteger c = (ConstantInteger) getConstantPool().getConstant(idx); + final ConstantInteger c = (ConstantInteger) getConstantPool().getConstant(idx); return c.getBytes(); } @@ -209,34 +209,34 @@ public class SimpleElementValueGen extends ElementValueGen switch (super.getElementValueType()) { case PRIMITIVE_INT: - ConstantInteger c = (ConstantInteger) getConstantPool().getConstant(idx); + final ConstantInteger c = (ConstantInteger) getConstantPool().getConstant(idx); return Integer.toString(c.getBytes()); case PRIMITIVE_LONG: - ConstantLong j = (ConstantLong) getConstantPool().getConstant(idx); + final ConstantLong j = (ConstantLong) getConstantPool().getConstant(idx); return Long.toString(j.getBytes()); case PRIMITIVE_DOUBLE: - ConstantDouble d = (ConstantDouble) getConstantPool().getConstant(idx); + final ConstantDouble d = (ConstantDouble) getConstantPool().getConstant(idx); return Double.toString(d.getBytes()); case PRIMITIVE_FLOAT: - ConstantFloat f = (ConstantFloat) getConstantPool().getConstant(idx); + final ConstantFloat f = (ConstantFloat) getConstantPool().getConstant(idx); return Float.toString(f.getBytes()); case PRIMITIVE_SHORT: - ConstantInteger s = (ConstantInteger) getConstantPool().getConstant(idx); + final ConstantInteger s = (ConstantInteger) getConstantPool().getConstant(idx); return Integer.toString(s.getBytes()); case PRIMITIVE_BYTE: - ConstantInteger b = (ConstantInteger) getConstantPool().getConstant(idx); + final ConstantInteger b = (ConstantInteger) getConstantPool().getConstant(idx); return Integer.toString(b.getBytes()); case PRIMITIVE_CHAR: - ConstantInteger ch = (ConstantInteger) getConstantPool().getConstant(idx); + final ConstantInteger ch = (ConstantInteger) getConstantPool().getConstant(idx); return Integer.toString(ch.getBytes()); case PRIMITIVE_BOOLEAN: - ConstantInteger bo = (ConstantInteger) getConstantPool().getConstant(idx); + final ConstantInteger bo = (ConstantInteger) getConstantPool().getConstant(idx); if (bo.getBytes() == 0) { return "false"; } return "true"; case STRING: - ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(idx); + final ConstantUtf8 cu8 = (ConstantUtf8) getConstantPool().getConstant(idx); return cu8.getBytes(); default: throw new RuntimeException( diff --git a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java index 29b582f7..3216cc2a 100644 --- a/src/main/java/org/apache/bcel/generic/TABLESWITCH.java +++ b/src/main/java/org/apache/bcel/generic/TABLESWITCH.java @@ -61,9 +61,9 @@ public class TABLESWITCH extends Select { public void dump( final DataOutputStream out ) throws IOException { super.dump(out); final int _match_length = getMatch_length(); - int low = (_match_length > 0) ? super.getMatch(0) : 0; + final int low = (_match_length > 0) ? super.getMatch(0) : 0; out.writeInt(low); - int high = (_match_length > 0) ? super.getMatch(_match_length - 1) : 0; + final int high = (_match_length > 0) ? super.getMatch(_match_length - 1) : 0; out.writeInt(high); for (int i = 0; i < _match_length; i++) { out.writeInt(setIndices(i, getTargetOffset(super.getTarget(i)))); @@ -77,8 +77,8 @@ public class TABLESWITCH extends Select { @Override protected void initFromFile( final ByteSequence bytes, final boolean wide ) throws IOException { super.initFromFile(bytes, wide); - int low = bytes.readInt(); - int high = bytes.readInt(); + final int low = bytes.readInt(); + final int high = bytes.readInt(); final int _match_length = high - low + 1; setMatch_length(_match_length); final short _fixed_length = (short) (13 + _match_length * 4); diff --git a/src/main/java/org/apache/bcel/generic/Type.java b/src/main/java/org/apache/bcel/generic/Type.java index ecbbe731..2cb3ad5b 100644 --- a/src/main/java/org/apache/bcel/generic/Type.java +++ b/src/main/java/org/apache/bcel/generic/Type.java @@ -87,7 +87,7 @@ public abstract class Type { @Override public boolean equals(final Object o) { if (o instanceof Type) { - Type t = (Type)o; + final Type t = (Type)o; return (type == t.type) && signature.equals(t.signature); } return false; @@ -157,9 +157,9 @@ public abstract class Type { * @return method signature for given type(s). */ public static String getMethodSignature( final Type return_type, final Type[] arg_types ) { - StringBuilder buf = new StringBuilder("("); + final StringBuilder buf = new StringBuilder("("); if (arg_types != null) { - for (Type arg_type : arg_types) { + for (final Type arg_type : arg_types) { buf.append(arg_type.getSignature()); } } @@ -194,7 +194,7 @@ public abstract class Type { */ // @since 6.0 no longer final public static Type getType( final String signature ) throws StringIndexOutOfBoundsException { - byte type = Utility.typeOfSignature(signature); + final byte type = Utility.typeOfSignature(signature); if (type <= Const.T_VOID) { //corrected concurrent private static field acess wrap(consumed_chars, 1); @@ -205,16 +205,16 @@ public abstract class Type { dim++; } while (signature.charAt(dim) == '['); // Recurse, but just once, if the signature is ok - Type t = getType(signature.substring(dim)); + final Type t = getType(signature.substring(dim)); //corrected concurrent private static field acess // consumed_chars += dim; // update counter - is replaced by - int _temp = unwrap(consumed_chars) + dim; + final int _temp = unwrap(consumed_chars) + dim; wrap(consumed_chars, _temp); return new ArrayType(t, dim); } else { // type == T_REFERENCE // Utility.signatureToString understands how to parse // generic types. - String parsedSignature = Utility.signatureToString(signature, false); + final String parsedSignature = Utility.signatureToString(signature, false); wrap(consumed_chars, parsedSignature.length() + 2); // "Lblabla;" `L' and `;' are removed return ObjectType.getInstance(parsedSignature.replace('/', '.')); } @@ -230,9 +230,9 @@ public abstract class Type { public static Type getReturnType( final String signature ) { try { // Read return type after `)' - int index = signature.lastIndexOf(')') + 1; + final int index = signature.lastIndexOf(')') + 1; return getType(signature.substring(index)); - } catch (StringIndexOutOfBoundsException e) { // Should never occur + } catch (final StringIndexOutOfBoundsException e) { // Should never occur throw new ClassFormatException("Invalid method signature: " + signature, e); } } @@ -244,7 +244,7 @@ public abstract class Type { * @return array of argument types */ public static Type[] getArgumentTypes( final String signature ) { - List vec = new ArrayList<>(); + final List vec = new ArrayList<>(); int index; Type[] types; try { // Read all declarations between for `(' and `)' @@ -257,7 +257,7 @@ public abstract class Type { //corrected concurrent private static field acess index += unwrap(consumed_chars); // update position } - } catch (StringIndexOutOfBoundsException e) { // Should never occur + } catch (final StringIndexOutOfBoundsException e) { // Should never occur throw new ClassFormatException("Invalid method signature: " + signature, e); } types = new Type[vec.size()]; @@ -315,7 +315,7 @@ public abstract class Type { * @return array of corresponding Type objects */ public static Type[] getTypes( final java.lang.Class[] classes ) { - Type[] ret = new Type[classes.length]; + final Type[] ret = new Type[classes.length]; for (int i = 0; i < ret.length; i++) { ret[i] = getType(classes[i]); } @@ -324,9 +324,9 @@ public abstract class Type { public static String getSignature( final java.lang.reflect.Method meth ) { - StringBuilder sb = new StringBuilder("("); - Class[] params = meth.getParameterTypes(); // avoid clone - for (Class param : params) { + final StringBuilder sb = new StringBuilder("("); + final Class[] params = meth.getParameterTypes(); // avoid clone + for (final Class param : params) { sb.append(getType(param).getSignature()); } sb.append(")"); @@ -355,18 +355,18 @@ public abstract class Type { } index = 1; // current string position while (signature.charAt(index) != ')') { - int coded = getTypeSize(signature.substring(index)); + final int coded = getTypeSize(signature.substring(index)); res += size(coded); index += consumed(coded); } - } catch (StringIndexOutOfBoundsException e) { // Should never occur + } catch (final StringIndexOutOfBoundsException e) { // Should never occur throw new ClassFormatException("Invalid method signature: " + signature, e); } return res; } static int getTypeSize( final String signature ) throws StringIndexOutOfBoundsException { - byte type = Utility.typeOfSignature(signature); + final byte type = Utility.typeOfSignature(signature); if (type <= Const.T_VOID) { return encode(BasicType.getType(type).getSize(), 1); } else if (type == Const.T_ARRAY) { @@ -375,10 +375,10 @@ public abstract class Type { dim++; } while (signature.charAt(dim) == '['); // Recurse, but just once, if the signature is ok - int consumed = consumed(getTypeSize(signature.substring(dim))); + final int consumed = consumed(getTypeSize(signature.substring(dim))); return encode(1, dim + consumed); } else { // type == T_REFERENCE - int index = signature.indexOf(';'); // Look for closing `;' + final int index = signature.indexOf(';'); // Look for closing `;' if (index < 0) { throw new ClassFormatException("Invalid signature: " + signature); } @@ -388,7 +388,7 @@ public abstract class Type { static int getReturnTypeSize(final String signature) { - int index = signature.lastIndexOf(')') + 1; + final int index = signature.lastIndexOf(')') + 1; return Type.size(getTypeSize(signature.substring(index))); } diff --git a/src/main/java/org/apache/bcel/util/AttributeHTML.java b/src/main/java/org/apache/bcel/util/AttributeHTML.java index a212828b..08863974 100644 --- a/src/main/java/org/apache/bcel/util/AttributeHTML.java +++ b/src/main/java/org/apache/bcel/util/AttributeHTML.java @@ -81,7 +81,7 @@ final class AttributeHTML { final void writeAttribute( final Attribute attribute, final String anchor, final int method_number ) { - byte tag = attribute.getTag(); + final byte tag = attribute.getTag(); int index; if (tag == Const.ATTR_UNKNOWN) { return; @@ -98,19 +98,19 @@ final class AttributeHTML { */ switch (tag) { case Const.ATTR_CODE: - Code c = (Code) attribute; + final Code c = (Code) attribute; // Some directly printable values file.print("
    • Maximum stack size = " + c.getMaxStack() + "
    • \n
    • Number of local variables = " + c.getMaxLocals() + "
    • \n
    • Byte code
    \n"); // Get handled exceptions and list them - CodeException[] ce = c.getExceptionTable(); - int len = ce.length; + final CodeException[] ce = c.getExceptionTable(); + final int len = ce.length; if (len > 0) { file.print("

    Exceptions handled